Upgrade to platform-tools 33.0.1

https://dl.google.com/android/repository/platform-tools_r33.0.1-darwin.zip

Test: None
Change-Id: I7cb92c9acefbb85debd0ceb692469b7b436a6e31
diff --git a/NOTICE.txt b/NOTICE.txt
index 50436c1..b07c020 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,18 +1,6 @@
-Notices for platform-tools
-============================================================
-Notices for file(s):
-/etc1tool
-------------------------------------------------------------
-Copyright (c) The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
+==============================================================================
+Android used by:
+  out/host/darwin-x86/sdk-repo/sdk-repo-darwin-platform-tools.zip
 
 
                                  Apache License
@@ -217,12 +205,396 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 
+==============================================================================
+Copyright (C) 2016 The Android Open Source Project
 
-============================================================
-Notices for file(s):
-/dmtracedump
-------------------------------------------------------------
-Copyright (c) 2005-2013, The Android Open Source Project
+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.
+
+==============================================================================
+ 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.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+
+==============================================================================
+Code in this repo uses one or more of the following licenses.
+Refer to each file to determine which licenses apply.
+
+-------------------------------------------------------------------------
+
+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.
+
+-------------------------------------------------------------------------
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-------------------------------------------------------------------------
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the project 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 PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+==============================================================================
+BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL
+licensing. Files that are completely new have a Google copyright and an ISC
+license. This license is reproduced at the bottom of this file.
+
+Contributors to BoringSSL are required to follow the CLA rules for Chromium:
+https://cla.developers.google.com/clas
+
+Files in third_party/ have their own licenses, as described therein. The MIT
+license, for third_party/fiat, which, unlike other third_party directories, is
+compiled into non-test libraries, is included below.
+
+The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the
+OpenSSL License and the original SSLeay license apply to the toolkit. See below
+for the actual license texts. Actually both licenses are BSD-style Open Source
+licenses. In case of any license issues related to OpenSSL please contact
+openssl-core@openssl.org.
+
+The following are Google-internal bug numbers where explicit permission from
+some authors is recorded for use of their work. (This is purely for our own
+record keeping.)
+  27287199
+  27287880
+  27287883
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+ISC license used for completely new code in BoringSSL:
+
+/* Copyright (c) 2015, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+
+The code in third_party/fiat carries the MIT license:
+
+Copyright (c) 2015-2016 the fiat-crypto authors (see
+https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS).
+
+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.
+
+
+Licenses for support code
+-------------------------
+
+Parts of the TLS test suite are under the Go license. This code is not included
+in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so
+distributing code linked against BoringSSL does not trigger this license:
+
+Copyright (c) 2009 The Go Authors. 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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+BoringSSL uses the Chromium test infrastructure to run a continuous build,
+trybots etc. The scripts which manage this, and the script for generating build
+metadata, are under the Chromium license. Distributing code linked against
+BoringSSL does not trigger this license.
+
+Copyright 2015 The Chromium Authors. 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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+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.
+
+==============================================================================
+
+   Copyright (c) 2005-2013, The Android Open Source Project
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -412,11 +784,259 @@
    END OF TERMS AND CONDITIONS
 
 
-============================================================
-Notices for file(s):
-/e2fsdroid
-/mke2fs
-------------------------------------------------------------
+==============================================================================
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Android-specific code.                        ==
+   =========================================================================
+
+   Copyright (c) 2005-2008, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+   =========================================================================
+   ==  NOTICE file for the x86 JIT libenc subdirectory.                   ==
+   =========================================================================
+
+Apache Harmony
+Copyright 2006, 2010 The Apache Software Foundation.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of Harmony were originally developed by
+Intel Corporation and are licensed to the Apache Software
+Foundation under the "Software Grant and Corporate Contribution
+License Agreement" and for which the following copyright notices
+apply
+         (C) Copyright 2005 Intel Corporation
+         (C) Copyright 2005-2006 Intel Corporation
+         (C) Copyright 2006 Intel Corporation
+
+Portions of the Apache Portable Runtime used by DRLVM were
+developed at the National Center for Supercomputing Applications
+(NCSA) at the University of Illinois at Urbana-Champaign.
+
+This software contains code derived from the RSA Data Security
+Inc. MD5 Message-Digest Algorithm.
+
+This software contains code derived from UNIX V7, Copyright(C)
+Caldera International Inc.
+
+==============================================================================
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, and the entire permission notice in its entirety,
+   including the disclaimer of warranties.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote
+   products derived from this software without specific prior
+   written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
+WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR 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 NOT ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+==============================================================================
 This package, the EXT2 filesystem utilities, are made available under
 the GNU Public License version 2, with the exception of the lib/ext2fs
 and lib/e2p libraries, which are made available under the GNU Library
@@ -1267,533 +1887,30 @@
 
 That's all there is to it!
 
-
-============================================================
-Notices for file(s):
-/sqlite3
-------------------------------------------------------------
-2001 September 15
-
-The author disclaims copyright to this source code.  In place of
-a legal notice, here is a blessing:
-
-   May you do good and not evil.
-   May you find forgiveness for yourself and forgive others.
-   May you share freely, never taking more than you give.
-
-
-============================================================
-Notices for file(s):
-/lib64/libc++.dylib
-------------------------------------------------------------
 ==============================================================================
-libc++ License
-==============================================================================
+Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
+Copyright (c) 2001-2019 Expat maintainers
 
-The libc++ library is dual licensed under both the University of Illinois
-"BSD-Like" license and the MIT license.  As a user of this code you may choose
-to use it under either license.  As a contributor, you agree to allow your code
-to be used under both.
+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:
 
-Full text of the relevant licenses is included below.
+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.
 
 ==============================================================================
-
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2009-2017 by the contributors listed in CREDITS.TXT
-
-All rights reserved.
-
-Developed by:
-
-    LLVM Team
-
-    University of Illinois at Urbana-Champaign
-
-    http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-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:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimers.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimers in the
-      documentation and/or other materials provided with the distribution.
-
-    * Neither the names of the LLVM Team, University of Illinois at
-      Urbana-Champaign, nor the names of its contributors may be used to
-      endorse or promote products derived from this Software without specific
-      prior written permission.
-
-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
-CONTRIBUTORS 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 WITH THE
-SOFTWARE.
-
-==============================================================================
-
-Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
-
-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.
-
-
-============================================================
-Notices for file(s):
-/hprof-conv
-------------------------------------------------------------
-=========================================================================
-   ==  NOTICE file corresponding to the section 4 d of                    ==
-   ==  the Apache License, Version 2.0,                                   ==
-   ==  in this case for the Android-specific code.                        ==
-   =========================================================================
-
-   Copyright (c) 2005-2008, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 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
-
-   =========================================================================
-   ==  NOTICE file for the x86 JIT libenc subdirectory.                   ==
-   =========================================================================
-
-Apache Harmony
-Copyright 2006, 2010 The Apache Software Foundation.
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of Harmony were originally developed by
-Intel Corporation and are licensed to the Apache Software
-Foundation under the "Software Grant and Corporate Contribution
-License Agreement" and for which the following copyright notices
-apply
-         (C) Copyright 2005 Intel Corporation
-         (C) Copyright 2005-2006 Intel Corporation
-         (C) Copyright 2006 Intel Corporation
-
-Portions of the Apache Portable Runtime used by DRLVM were
-developed at the National Center for Supercomputing Applications
-(NCSA) at the University of Illinois at Urbana-Champaign.
-
-This software contains code derived from the RSA Data Security
-Inc. MD5 Message-Digest Algorithm.
-
-This software contains code derived from UNIX V7, Copyright(C)
-Caldera International Inc.
-
-
-============================================================
-Notices for file(s):
-/adb
-------------------------------------------------------------
-Copyright (c) 2006-2009, The Android Open Source Project
-   Copyright 2006, Brian Swetland <swetland@frotz.net>
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 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
-
-
-============================================================
-Notices for file(s):
-/make_f2fs
-/make_f2fs_casefold
-/sload_f2fs
-------------------------------------------------------------
 The tools for F2FS are covered by GNU Public License version 2.
 Exceptionally, the following files are also covered by the GNU Lesser General
 Public License Version 2.1 as the dual licenses.
@@ -2659,4 +2776,17748 @@
 
 That's all there is to it!
 
+==============================================================================
+Copyright (c) 2012 - 2016, Victor Zverovich
 
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+Copyright (c) 2012 - present, Victor Zverovich
+
+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.
+
+--- Optional exception to the license ---
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into a machine-executable object form of such
+source code, you may redistribute such embedded portions in such object form
+without including the above copyright and permission notices.
+
+==============================================================================
+
+   Copyright (c) 2005-2008, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+==============================================================================
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Android-specific code.                        ==
+   =========================================================================
+
+Android Code
+Copyright 2005-2008 The Android Open Source Project
+
+This product includes software developed as part of
+The Android Open Source Project (http://source.android.com).
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for Apache Commons code.                              ==
+   =========================================================================
+
+Apache Commons
+Copyright 1999-2006 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for Jakarta Commons Logging.                          ==
+   =========================================================================
+
+Jakarta Commons Logging (JCL)
+Copyright 2005,2006 The Apache Software Foundation.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Nuance code.                                  ==
+   =========================================================================
+
+These files are Copyright 2007 Nuance Communications, but released under
+the Apache2 License.
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Media Codecs code.                            ==
+   =========================================================================
+
+Media Codecs
+These files are Copyright 1998 - 2009 PacketVideo, but released under
+the Apache2 License.
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the TagSoup code.                                 ==
+   =========================================================================
+
+This file is part of TagSoup and is Copyright 2002-2008 by John Cowan.
+
+TagSoup is licensed under the Apache License,
+Version 2.0.  You may obtain a copy of this license at
+http://www.apache.org/licenses/LICENSE-2.0 .  You may also have
+additional legal rights not granted by this license.
+
+TagSoup is distributed in the hope that it will be useful, but
+unless required by applicable law or agreed to in writing, TagSoup
+is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, either express or implied; not even the implied warranty
+of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for Additional Codecs code.                           ==
+   =========================================================================
+
+Additional Codecs
+These files are Copyright 2003-2010 VisualOn, but released under
+the Apache2 License.
+
+  =========================================================================
+  ==  NOTICE file corresponding to the section 4 d of                    ==
+  ==  the Apache License, Version 2.0,                                   ==
+  ==  in this case for the Audio Effects code.                           ==
+  =========================================================================
+
+Audio Effects
+These files are Copyright (C) 2004-2010 NXP Software and
+Copyright (C) 2010 The Android Open Source Project, but released under
+the Apache2 License.
+
+
+                               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
+
+
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+and http://www.unicode.org/cldr/data/ . Unicode Software includes any
+source code published in the Unicode Standard or under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/.
+
+NOTICE TO USER: Carefully read the following legal agreement. BY
+DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA
+FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY
+ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF
+THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY,
+DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2008 Unicode, Inc. All rights reserved. Distributed
+under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation (the
+"Data Files") or Unicode software and any associated documentation (the
+"Software") to deal in the Data Files or Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, and/or sell copies of the Data Files or Software,
+and to permit persons to whom the Data Files or Software are furnished to
+do so, provided that (a) the above copyright notice(s) and this permission
+notice appear with all copies of the Data Files or Software, (b) both the
+above copyright notice(s) and this permission notice appear in associated
+documentation, and (c) there is clear notice in each modified Data File
+or in the Software as well as in the documentation associated with the
+Data File(s) or Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE 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
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
+OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in these Data Files or Software without prior written
+authorization of the copyright holder.
+
+==============================================================================
+Copyright 2008, Google Inc.
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+==============================================================================
+libc++ License
+==============================================================================
+
+The libc++ library is dual licensed under both the University of Illinois
+"BSD-Like" license and the MIT license.  As a user of this code you may choose
+to use it under either license.  As a contributor, you agree to allow your code
+to be used under both.
+
+Full text of the relevant licenses is included below.
+
+==============================================================================
+
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2009-2017 by the contributors listed in CREDITS.TXT
+
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+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.
+
+==============================================================================
+==============================================================================
+libc++abi License
+==============================================================================
+
+The libc++abi library is dual licensed under both the University of Illinois
+"BSD-Like" license and the MIT license.  As a user of this code you may choose
+to use it under either license.  As a contributor, you agree to allow your code
+to be used under both.
+
+Full text of the relevant licenses is included below.
+
+==============================================================================
+
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2009-2018 by the contributors listed in CREDITS.TXT
+
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+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.
+
+==============================================================================
+==============================================================================
+libc++abi License
+==============================================================================
+
+The libc++abi library is dual licensed under both the University of Illinois
+"BSD-Like" license and the MIT license.  As a user of this code you may choose
+to use it under either license.  As a contributor, you agree to allow your code
+to be used under both.
+
+Full text of the relevant licenses is included below.
+
+==============================================================================
+
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+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.
+
+==============================================================================
+PCRE LICENCE
+------------
+
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+The basic library functions are written in C and are freestanding. Also
+included in the distribution is a set of C++ wrapper functions, and a
+just-in-time compiler that can be used to optimize pattern matching. These
+are both optional features that can be omitted when the library is built.
+
+
+THE BASIC LIBRARY FUNCTIONS
+---------------------------
+
+Written by:       Philip Hazel
+Email local part: ph10
+Email domain:     cam.ac.uk
+
+University of Cambridge Computing Service,
+Cambridge, England.
+
+Copyright (c) 1997-2014 University of Cambridge
+All rights reserved.
+
+
+PCRE JUST-IN-TIME COMPILATION SUPPORT
+-------------------------------------
+
+Written by:       Zoltan Herczeg
+Email local part: hzmester
+Emain domain:     freemail.hu
+
+Copyright(c) 2010-2014 Zoltan Herczeg
+All rights reserved.
+
+
+STACK-LESS JUST-IN-TIME COMPILER
+--------------------------------
+
+Written by:       Zoltan Herczeg
+Email local part: hzmester
+Emain domain:     freemail.hu
+
+Copyright(c) 2009-2014 Zoltan Herczeg
+All rights reserved.
+
+
+THE C++ WRAPPER FUNCTIONS
+-------------------------
+
+Contributed by:   Google Inc.
+
+Copyright (c) 2007-2012, Google Inc.
+All rights reserved.
+
+
+THE "BSD" LICENCE
+-----------------
+
+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 the University of Cambridge nor the name of Google
+      Inc. nor the names of their contributors may be used to endorse or
+      promote products derived from this software without specific prior
+      written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+End
+
+==============================================================================
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE
+=========================================
+
+PNG Reference Library License version 2
+---------------------------------------
+
+ * Copyright (c) 1995-2019 The PNG Reference Library Authors.
+ * Copyright (c) 2018-2019 Cosmin Truta.
+ * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
+ * Copyright (c) 1996-1997 Andreas Dilger.
+ * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+The software is supplied "as is", without warranty of any kind,
+express or implied, including, without limitation, the warranties
+of merchantability, fitness for a particular purpose, title, and
+non-infringement.  In no event shall the Copyright owners, or
+anyone distributing the software, be liable for any damages or
+other liability, whether in contract, tort or otherwise, arising
+from, out of, or in connection with the software, or the use or
+other dealings in the software, even if advised of the possibility
+of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute
+this software, or portions hereof, for any purpose, without fee,
+subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you
+    must not claim that you wrote the original software.  If you
+    use this software in a product, an acknowledgment in the product
+    documentation would be appreciated, but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must
+    not be misrepresented as being the original software.
+
+ 3. This Copyright notice may not be removed or altered from any
+    source or altered source distribution.
+
+
+PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35)
+-----------------------------------------------------------------------
+
+libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
+
+    Simon-Pierre Cadieux
+    Eric S. Raymond
+    Mans Rullgard
+    Cosmin Truta
+    Gilles Vollant
+    James Yu
+    Mandar Sahastrabuddhe
+    Google Inc.
+    Vadim Barkov
+
+and with the following additions to the disclaimer:
+
+    There is no warranty against interference with your enjoyment of
+    the library or against infringement.  There is no warranty that our
+    efforts or the library will fulfill any of your particular purposes
+    or needs.  This library is provided with all faults, and the entire
+    risk of satisfactory quality, performance, accuracy, and effort is
+    with the user.
+
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners, and
+are released under other open source licenses.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the
+list of Contributing Authors:
+
+    Tom Lane
+    Glenn Randers-Pehrson
+    Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
+
+    John Bowler
+    Kevin Bracey
+    Sam Bushell
+    Magnus Holmgren
+    Greg Roelofs
+    Tom Tanner
+
+Some files in the "scripts" directory have other copyright owners,
+but are released under this license.
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+    Andreas Dilger
+    Dave Martindale
+    Guy Eric Schalnat
+    Paul Schmidt
+    Tim Wegner
+
+The PNG Reference Library is supplied "AS IS".  The Contributing
+Authors and Group 42, Inc. disclaim all warranties, expressed or
+implied, including, without limitation, the warranties of
+merchantability and of fitness for any purpose.  The Contributing
+Authors and Group 42, Inc. assume no liability for direct, indirect,
+incidental, special, exemplary, or consequential damages, which may
+result from the use of the PNG Reference Library, even if advised of
+the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+ 1. The origin of this source code must not be misrepresented.
+
+ 2. Altered versions must be plainly marked as such and must not
+    be misrepresented as being the original source.
+
+ 3. This Copyright notice may not be removed or altered from any
+    source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit,
+without fee, and encourage the use of this source code as a component
+to supporting the PNG file format in commercial products.  If you use
+this source code in a product, acknowledgment is not required but would
+be appreciated.
+
+==============================================================================
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+==============================================================================
+LZ4 Library
+Copyright (c) 2011-2016, Yann Collet
+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.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+The majority of the source code in the mDNSResponder project is licensed
+under the terms of the Apache License, Version 2.0, available from:
+   <http://www.apache.org/licenses/LICENSE-2.0>
+
+To accommodate license compatibility with the widest possible range
+of client code licenses, the shared library code, which is linked
+at runtime into the same address space as the client using it, is
+licensed under the terms of the "Three-Clause BSD License".
+
+The Linux Name Service Switch code, contributed by National ICT
+Australia Ltd (NICTA) is licensed under the terms of the NICTA Public
+Software Licence (which is substantially similar to the "Three-Clause
+BSD License", with some additional language pertaining to Australian law).
+
+==============================================================================
+
+   Copyright (c) 2006-2009, The Android Open Source Project
+   Copyright 2006, Brian Swetland <swetland@frotz.net>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+==============================================================================
+// Copyright 2018 The Chromium Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+Notices for files contained in the tools directory:
+============================================================
+Notices for file(s):
+/bin/mksdcard
+------------------------------------------------------------
+Copyright 2007, The Android Open Source Project
+
+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 Google Inc. 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 Google Inc. ``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 Google Inc. 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.
+
+============================================================
+Notices for file(s):
+/framework/conscrypt-hostdex.jar
+/framework/core-hostdex.jar
+/framework/core-libart-hostdex.jar
+/lib/libjavacore.so
+/lib/libjavacrypto.so
+------------------------------------------------------------
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Android-specific code.                        ==
+   =========================================================================
+
+Android Code
+Copyright 2005-2008 The Android Open Source Project
+
+This product includes software developed as part of
+The Android Open Source Project (http://source.android.com).
+
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Harmony distribution.                  ==
+   =========================================================================
+
+Apache Harmony
+Copyright 2006 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of Harmony were originally developed by
+Intel Corporation and are licensed to the Apache Software
+Foundation under the "Software Grant and Corporate Contribution
+License Agreement", informally known as the "Intel Harmony CLA".
+
+
+   =========================================================================
+   ==  NOTICE file for the ICU License.                                   ==
+   =========================================================================
+
+Copyright (c) 1995-2009 International Business Machines Corporation and others
+
+All rights reserved.
+
+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, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+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
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+
+   =========================================================================
+   ==  NOTICE file for the JUnit License.                                 ==
+   =========================================================================
+
+Common Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+      a) in the case of the initial Contributor, the initial code and
+         documentation distributed under this Agreement, and
+      b) in the case of each subsequent Contributor:
+
+      i) changes to the Program, and
+
+      ii) additions to the Program;
+
+      where such changes and/or additions to the Program originate
+      from and are distributed by that particular Contributor. A
+      Contribution 'originates' from a Contributor if it was added to
+      the Program by such Contributor itself or anyone acting on such
+      Contributor's behalf. Contributions do not include additions to
+      the Program which: (i) are separate modules of software
+      distributed in conjunction with the Program under their own
+      license agreement, and (ii) are not derivative works of the
+      Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor
+which are necessarily infringed by the use or sale of its Contribution
+alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this
+Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+      a) Subject to the terms of this Agreement, each Contributor
+      hereby grants Recipient a non-exclusive, worldwide, royalty-free
+      copyright license to reproduce, prepare derivative works of,
+      publicly display, publicly perform, distribute and sublicense
+      the Contribution of such Contributor, if any, and such
+      derivative works, in source code and object code form.
+
+      b) Subject to the terms of this Agreement, each Contributor
+      hereby grants Recipient a non-exclusive, worldwide, royalty-free
+      patent license under Licensed Patents to make, use, sell, offer
+      to sell, import and otherwise transfer the Contribution of such
+      Contributor, if any, in source code and object code form. This
+      patent license shall apply to the combination of the
+      Contribution and the Program if, at the time the Contribution is
+      added by the Contributor, such addition of the Contribution
+      causes such combination to be covered by the Licensed Patents.
+      The patent license shall not apply to any other combinations
+      which include the Contribution. No hardware per se is licensed
+      hereunder.
+
+      c) Recipient understands that although each Contributor grants
+      the licenses to its Contributions set forth herein, no
+      assurances are provided by any Contributor that the Program does
+      not infringe the patent or other intellectual property rights of
+      any other entity. Each Contributor disclaims any liability to
+      Recipient for claims brought by any other entity based on
+      infringement of intellectual property rights or otherwise. As a
+      condition to exercising the rights and licenses granted
+      hereunder, each Recipient hereby assumes sole responsibility to
+      secure any other intellectual property rights needed, if any.
+      For example, if a third party patent license is required to
+      allow Recipient to distribute the Program, it is Recipient's
+      responsibility to acquire that license before distributing the
+      Program.
+
+      d) Each Contributor represents that to its knowledge it has
+      sufficient copyright rights in its Contribution, if any, to
+      grant the copyright license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+      a) it complies with the terms and conditions of this Agreement; and
+
+      b) its license agreement:
+
+      i) effectively disclaims on behalf of all Contributors all
+      warranties and conditions, express and implied, including
+      warranties or conditions of title and non-infringement, and
+      implied warranties or conditions of merchantability and fitness
+      for a particular purpose;
+
+      ii) effectively excludes on behalf of all Contributors all
+      liability for damages, including direct, indirect, special,
+      incidental and consequential damages, such as lost profits;
+
+      iii) states that any provisions which differ from this Agreement
+      are offered by that Contributor alone and not by any other
+      party; and
+
+      iv) states that source code for the Program is available from
+      such Contributor, and informs licensees how to obtain it in a
+      reasonable manner on or through a medium customarily used for
+      software exchange.
+
+When the Program is made available in source code form:
+
+      a) it must be made available under this Agreement; and 
+
+      b) a copy of this Agreement must be included with each copy of
+      the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a
+commercial product offering should do so in a manner which does not
+create potential liability for other Contributors. Therefore, if a
+Contributor includes the Program in a commercial product offering,
+such Contributor ("Commercial Contributor") hereby agrees to defend
+and indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses") arising
+from claims, lawsuits and other legal actions brought by a third party
+against the Indemnified Contributor to the extent caused by the acts
+or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement.
+In order to qualify, an Indemnified Contributor must: a) promptly
+notify the Commercial Contributor in writing of such claim, and b)
+allow the Commercial Contributor to control, and cooperate with the
+Commercial Contributor in, the defense and any related settlement
+negotiations. The Indemnified Contributor may participate in any such
+claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED 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. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable
+laws, damage to or loss of data, programs or equipment, and
+unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), 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 OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with
+respect to a patent applicable to software (including a cross-claim or
+counterclaim in a lawsuit), then any patent licenses granted by that
+Contributor to such Recipient under this Agreement shall terminate as
+of the date such litigation is filed. In addition, if Recipient
+institutes patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and
+may only be modified in the following manner. The Agreement Steward
+reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement
+Steward has the right to modify this Agreement. IBM is the initial
+Agreement Steward. IBM may assign the responsibility to serve as the
+Agreement Steward to a suitable separate entity. Each new version of
+the Agreement will be given a distinguishing version number. The
+Program (including Contributions) may always be distributed subject to
+the version of the Agreement under which it was received. In addition,
+after a new version of the Agreement is published, Contributor may
+elect to distribute the Program (including its Contributions) under
+the new version. Except as expressly stated in Sections 2(a) and 2(b)
+above, Recipient receives no rights or licenses to the intellectual
+property of any Contributor under this Agreement, whether expressly,
+by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No
+party to this Agreement will bring a legal action under this Agreement
+more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.
+
+
+   =========================================================================
+   ==  NOTICE file for the KXML License.                                  ==
+   =========================================================================
+
+Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
+
+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.
+
+
+   =========================================================================
+   ==  NOTICE file for the SQLite Java Wrapper License.                   ==
+   =========================================================================
+
+This software is copyrighted by Christian Werner <chw@ch-werner.de>
+and others. The following terms apply to all files associated with the
+software unless explicitly disclaimed in individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
+IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+
+   =========================================================================
+   ==  NOTICE file for the W3C License.                                   ==
+   =========================================================================
+
+Copyright (c) 2000 World Wide Web Consortium, (Massachusetts Institute
+of Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio University). All Rights Reserved. This program is
+distributed under the W3C's Software Intellectual Property License.
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+============================================================
+Notices for file(s):
+/usr/icu/icudt51l.dat
+------------------------------------------------------------
+ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2008 International Business Machines Corporation and others
+
+All rights reserved.
+
+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, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation.
+
+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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the property of their respective owners. 
+
+==============================================================================
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+    Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/ . Unicode Software includes any source code
+published in the Unicode Standard or under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/.
+
+    NOTICE TO USER: Carefully read the following legal agreement. BY
+DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES
+("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND
+AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU
+DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES
+OR SOFTWARE.
+
+    COPYRIGHT AND PERMISSION NOTICE
+
+    Copyright © 1991-2007 Unicode, Inc. All rights reserved. Distributed under
+the Terms of Use in http://www.unicode.org/copyright.html.
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Unicode data files and any associated documentation (the "Data Files") or
+Unicode software and any associated documentation (the "Software") to deal in
+the Data Files or Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files or
+Software are furnished to do so, provided that (a) the above copyright notice(s)
+and this permission notice appear with all copies of the Data Files or Software,
+(b) both the above copyright notice(s) and this permission notice appear in
+associated documentation, and (c) there is clear notice in each modified Data
+File or in the Software as well as in the documentation associated with the Data
+File(s) or Software that the data or software has been modified.
+
+    THE DATA FILES AND SOFTWARE ARE 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 OF THIRD
+PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR
+SOFTWARE.
+
+    Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in these Data Files or Software without prior written authorization of the
+copyright holder.
+
+===============================================================================
+
+
+/* This ICU code derived from: */
+/*
+punycode.c 0.4.0 (2001-Nov-17-Sat)
+http://www.cs.berkeley.edu/~amc/idn/
+Adam M. Costello
+http://www.nicemice.net/amc/
+
+Disclaimer and license
+
+Regarding this entire document or any portion of it (including
+the pseudocode and C code), the author makes no guarantees and
+is not responsible for any damage resulting from its use. The
+author grants irrevocable permission to anyone to use, modify,
+and distribute it in any way that does not diminish the rights
+of anyone else to use, modify, and distribute it, provided that
+redistributed derivative works do not contain misleading author or
+version information. Derivative works need not be licensed under
+similar terms.
+*/
+
+
+/*
+** This file is in the public domain, so clarified as of
+** 2006-07-17 by Arthur David Olson.
+*/
+
+============================================================
+Notices for file(s):
+/framework/jcommon-1.0.12.jar
+/framework/jfreechart-1.0.9-swt.jar
+/framework/jfreechart-1.0.9.jar
+------------------------------------------------------------
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+============================================================
+Notices for file(s):
+/lib/third_party_icu_icudata_host_gyp.a
+/lib/third_party_icu_icui18n_host_gyp.a
+/lib/third_party_icu_icuuc_host_gyp.a
+/lib/third_party_protobuf_protobuf_full_do_not_use_host_gyp.a
+/lib/v8_tools_gyp_v8_base_arm_host_gyp.a
+/lib/v8_tools_gyp_v8_nosnapshot_arm_host_gyp.a
+/obj/GYP/shared_intermediates/mksnapshot.arm
+/obj/GYP/shared_intermediates/protoc
+------------------------------------------------------------
+// Copyright (c) 2013 The Chromium Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/****************************************************************
+ *
+ * The author of this software is David M. Gay.
+ *
+ * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ *
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ *
+ ***************************************************************/
+
+/* Copyright (c) 2008-2009, Google Inc.
+ * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---
+ * Author: Kostya Serebryany
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Netscape Portable Runtime (NSPR).
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998-2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+// Copyright (c) 2006, Google Inc.
+// 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+   Notice that the following BSD-style license applies to the Valgrind header
+   files used by Chromium (valgrind.h and memcheck.h). However, the rest of
+   Valgrind is licensed under the terms of the GNU General Public License,
+   version 2, unless otherwise indicated.
+
+   ----------------------------------------------------------------
+
+   Copyright (C) 2000-2008 Julian Seward.  All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. The origin of this software must not be misrepresented; you must 
+      not claim that you wrote the original software.  If you use this 
+      software in a product, an acknowledgment in the product 
+      documentation would be appreciated but is not required.
+
+   3. Altered source versions must be plainly marked as such, and must
+      not be misrepresented as being the original software.
+
+   4. The name of the author may not be used to endorse or promote 
+      products derived from this software without specific prior written 
+      permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR 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.
+
+  Copyright (c) 2007 Red Hat, inc
+
+  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.
+
+Copyright 2003-2005 Colin Percival
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing that the following conditions 
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR 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.
+
+
+                                 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 2007-2009 Google Inc.
+   Copyright 2007-2009 WebDriver committers
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+Copyright (C) 2009 by Tung Mac.
+
+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.
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Netscape security libraries.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Netscape security libraries.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1994-2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+Copyright 2011, The Chromium Authors
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+// Copyright (c) 2012 The Chromium Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/*
+** Copyright (c) 2007-2010 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are 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 Materials.
+**
+** THE MATERIALS ARE 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
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+
+                                 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 (c) 2008, Google 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
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+(WebKit doesn't distribute an explicit license.  This LICENSE is derived from
+license text in the source.)
+
+Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+2006, 2007 Alexander Kellett, Alexey Proskuryakov, Alex Mathews, Allan
+Sandfeld Jensen, Alp Toker, Anders Carlsson, Andrew Wellington, Antti
+Koivisto, Apple Inc., Arthur Langereis, Baron Schwartz, Bjoern Graf,
+Brent Fulgham, Cameron Zwarich, Charles Samuels, Christian Dywan,
+Collabora Ltd., Cyrus Patel, Daniel Molkentin, Dave Maclachlan, David
+Smith, Dawit Alemayehu, Dirk Mueller, Dirk Schulze, Don Gibson, Enrico
+Ros, Eric Seidel, Frederik Holljen, Frerich Raabe, Friedmann Kleint,
+George Staikos, Google Inc., Graham Dennis, Harri Porten, Henry Mason,
+Hiroyuki Ikezoe, Holger Hans Peter Freyther, IBM, James G. Speth, Jan
+Alonzo, Jean-Loup Gailly, John Reis, Jonas Witt, Jon Shier, Jonas
+Witt, Julien Chaffraix, Justin Haygood, Kevin Ollivier, Kevin Watters,
+Kimmo Kinnunen, Kouhei Sutou, Krzysztof Kowalczyk, Lars Knoll, Luca
+Bruno, Maks Orlovich, Malte Starostik, Mark Adler, Martin Jones,
+Marvin Decker, Matt Lilek, Michael Emmel, Mitz Pettel, mozilla.org,
+Netscape Communications Corporation, Nicholas Shanks, Nikolas
+Zimmermann, Nokia, Oliver Hunt, Opened Hand, Paul Johnston, Peter
+Kelly, Pioneer Research Center USA, Rich Moore, Rob Buis, Robin Dunn,
+Ronald Tschalär, Samuel Weinig, Simon Hausmann, Staikos Computing
+Services Inc., Stefan Schimanski, Symantec Corporation, The Dojo
+Foundation, The Karbon Developers, Thomas Boyer, Tim Copperfield,
+Tobias Anton, Torben Weis, Trolltech, University of Cambridge, Vaclav
+Slavik, Waldo Bastian, Xan Lopez, Zack Rusin
+
+The terms and conditions vary from file to file, but are one of:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the
+   distribution.
+
+*OR*
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the
+   distribution.
+3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE COMPUTER, INC. ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+                  GNU LIBRARY GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+                  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+// Copyright (C) 2002-2013 The ANGLE Project Authors. 
+// 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 TransGaming Inc., Google Inc., 3DLabs Inc.
+//     Ltd., nor the names of their contributors may be used to endorse
+//     or promote products derived from this software without specific
+//     prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+
+                                 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.
+
+Copyright (c) 2012, Manfred Moitzi
+
+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. 
+
+Deutsche Übersetzung:
+
+Copyright (c) 2012, Manfred Moitzi
+
+Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software 
+und der zugehörigen Dokumentationen (die "Software") erhält, die 
+Erlaubnis erteilt, uneingeschränkt zu benutzen, inklusive und ohne 
+Ausnahme, dem Recht, sie zu verwenden, kopieren, ändern, fusionieren, 
+verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und 
+Personen, die diese Software erhalten, diese Rechte zu geben, unter den 
+folgenden Bedingungen: 
+
+Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen 
+Kopien oder Teilkopien der Software beizulegen. 
+
+DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE 
+BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN 
+VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER 
+RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL SIND 
+DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE 
+ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, 
+EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER 
+SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN. 
+
+
+// Copyright (c) 2010 The Chromium Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+                          MOZILLA PUBLIC LICENSE
+                                Version 1.1
+
+                              ---------------
+
+1. Definitions.
+
+     1.0.1. "Commercial Use" means distribution or otherwise making the
+     Covered Code available to a third party.
+
+     1.1. "Contributor" means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. "Contributor Version" means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. "Covered Code" means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. "Electronic Distribution Mechanism" means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. "Executable" means Covered Code in any form other than Source
+     Code.
+
+     1.6. "Initial Developer" means the individual or entity identified
+     as the Initial Developer in the Source Code notice required by Exhibit
+     A.
+
+     1.7. "Larger Work" means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. "License" means this document.
+
+     1.8.1. "Licensable" means having the right to grant, to the maximum
+     extent possible, whether at the time of the initial grant or
+     subsequently acquired, any and all of the rights conveyed herein.
+
+     1.9. "Modifications" means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. "Original Code" means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this
+     License is not already Covered Code governed by this License.
+
+     1.10.1. "Patent Claims" means any patent claim(s), now owned or
+     hereafter acquired, including without limitation, method, process,
+     and apparatus claims, in any patent Licensable by grantor.
+
+     1.11. "Source Code" means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus
+     any associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. "You" (or "Your") means an individual or a legal entity
+     exercising rights under, and complying with all of the terms of, this
+     License or a future version of this License issued under Section 6.1.
+     For legal entities, "You" includes any entity which controls, is
+     controlled by, or is under common control with You. For purposes of
+     this definition, "control" means (a) the power, direct or indirect,
+     to cause the direction or management of such entity, whether by
+     contract or otherwise, or (b) ownership of more than fifty percent
+     (50%) of the outstanding shares or beneficial ownership of such
+     entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+          (a) under intellectual property rights (other than patent or
+          trademark) Licensable by Initial Developer to use, reproduce,
+          modify, display, perform, sublicense and distribute the Original
+          Code (or portions thereof) with or without Modifications, and/or
+          as part of a Larger Work; and
+
+          (b) under Patents Claims infringed by the making, using or
+          selling of Original Code, to make, have made, use, practice,
+          sell, and offer for sale, and/or otherwise dispose of the
+          Original Code (or portions thereof).
+
+          (c) the licenses granted in this Section 2.1(a) and (b) are
+          effective on the date Initial Developer first distributes
+          Original Code under the terms of this License.
+
+          (d) Notwithstanding Section 2.1(b) above, no patent license is
+          granted: 1) for code that You delete from the Original Code; 2)
+          separate from the Original Code; or 3) for infringements caused
+          by: i) the modification of the Original Code or ii) the
+          combination of the Original Code with other software or devices.
+
+     2.2. Contributor Grant.
+     Subject to third party intellectual property claims, each Contributor
+     hereby grants You a world-wide, royalty-free, non-exclusive license
+
+          (a) under intellectual property rights (other than patent or
+          trademark) Licensable by Contributor, to use, reproduce, modify,
+          display, perform, sublicense and distribute the Modifications
+          created by such Contributor (or portions thereof) either on an
+          unmodified basis, with other Modifications, as Covered Code
+          and/or as part of a Larger Work; and
+
+          (b) under Patent Claims infringed by the making, using, or
+          selling of Modifications made by that Contributor either alone
+          and/or in combination with its Contributor Version (or portions
+          of such combination), to make, use, sell, offer for sale, have
+          made, and/or otherwise dispose of: 1) Modifications made by that
+          Contributor (or portions thereof); and 2) the combination of
+          Modifications made by that Contributor with its Contributor
+          Version (or portions of such combination).
+
+          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+          effective on the date Contributor first makes Commercial Use of
+          the Covered Code.
+
+          (d) Notwithstanding Section 2.2(b) above, no patent license is
+          granted: 1) for any code that Contributor has deleted from the
+          Contributor Version; 2) separate from the Contributor Version;
+          3) for infringements caused by: i) third party modifications of
+          Contributor Version or ii) the combination of Modifications made
+          by that Contributor with other software (except as part of the
+          Contributor Version) or other devices; or 4) under Patent Claims
+          infringed by Covered Code in the absence of Modifications made by
+          that Contributor.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be
+     distributed only under the terms of this License or a future version
+     of this License released under Section 6.1, and You must include a
+     copy of this License with every copy of the Source Code You
+     distribute. You may not offer or impose any terms on any Source Code
+     version that alters or restricts the applicable version of this
+     License or the recipients' rights hereunder. However, You may include
+     an additional document offering the additional rights described in
+     Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which You contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that
+     the Modification is derived, directly or indirectly, from Original
+     Code provided by the Initial Developer and including the name of the
+     Initial Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+          (a) Third Party Claims.
+          If Contributor has knowledge that a license under a third party's
+          intellectual property rights is required to exercise the rights
+          granted by such Contributor under Sections 2.1 or 2.2,
+          Contributor must include a text file with the Source Code
+          distribution titled "LEGAL" which describes the claim and the
+          party making the claim in sufficient detail that a recipient will
+          know whom to contact. If Contributor obtains such knowledge after
+          the Modification is made available as described in Section 3.2,
+          Contributor shall promptly modify the LEGAL file in all copies
+          Contributor makes available thereafter and shall take other steps
+          (such as notifying appropriate mailing lists or newsgroups)
+          reasonably calculated to inform those who received the Covered
+          Code that new knowledge has been obtained.
+
+          (b) Contributor APIs.
+          If Contributor's Modifications include an application programming
+          interface and Contributor has knowledge of patent licenses which
+          are reasonably necessary to implement that API, Contributor must
+          also include this information in the LEGAL file.
+
+          (c) Representations.
+          Contributor represents that, except as disclosed pursuant to
+          Section 3.4(a) above, Contributor believes that Contributor's
+          Modifications are Contributor's original creation(s) and/or
+          Contributor has sufficient rights to grant the rights conveyed by
+          this License.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code. If it is not possible to put such notice in a particular Source
+     Code file due to its structure, then You must include such notice in a
+     location (such as a relevant directory) where a user would be likely
+     to look for such a notice. If You created one or more Modification(s)
+     You may add your name as a Contributor to the notice described in
+     Exhibit A. You must also duplicate this License in any documentation
+     for the Source Code where You describe recipients' rights or ownership
+     rights relating to Covered Code. You may choose to offer, and to
+     charge a fee for, warranty, support, indemnity or liability
+     obligations to one or more recipients of Covered Code. However, You
+     may do so only on Your own behalf, and not on behalf of the Initial
+     Developer or any Contributor. You must make it absolutely clear than
+     any such warranty, support, indemnity or liability obligation is
+     offered by You alone, and You hereby agree to indemnify the Initial
+     Developer and every Contributor for any liability incurred by the
+     Initial Developer or such Contributor as a result of warranty,
+     support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of
+     the Covered Code is available under the terms of this License,
+     including a description of how and where You have fulfilled the
+     obligations of Section 3.2. The notice must be conspicuously included
+     in any notice in an Executable version, related documentation or
+     collateral in which You describe recipients' rights relating to the
+     Covered Code. You may distribute the Executable version of Covered
+     Code or ownership rights under a license of Your choice, which may
+     contain terms different from this License, provided that You are in
+     compliance with the terms of this License and that the license for the
+     Executable version does not attempt to limit or alter the recipient's
+     rights in the Source Code version from the rights set forth in this
+     License. If You distribute the Executable version under a different
+     license You must make it absolutely clear that any terms which differ
+     from this License are offered by You alone, not by the Initial
+     Developer or any Contributor. You hereby agree to indemnify the
+     Initial Developer and every Contributor for any liability incurred by
+     the Initial Developer or such Contributor as a result of any such
+     terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to
+     statute, judicial order, or regulation then You must: (a) comply with
+     the terms of this License to the maximum extent possible; and (b)
+     describe the limitations and the code they affect. Such description
+     must be included in the LEGAL file described in Section 3.4 and must
+     be included with all distributions of the Source Code. Except to the
+     extent prohibited by statute or regulation, such description must be
+     sufficiently detailed for a recipient of ordinary skill to be able to
+     understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation ("Netscape") may publish revised
+     and/or new versions of the License from time to time. Each version
+     will be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If You create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), You must (a) rename Your license so that
+     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+     "MPL", "NPL" or any confusingly similar phrase do not appear in your
+     license (except to note that your license differs from this License)
+     and (b) otherwise make it clear that Your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial
+     Developer, Original Code or Contributor in the notice described in
+     Exhibit A shall not of themselves be deemed to be modifications of
+     this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     8.1. This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+     8.2. If You initiate litigation by asserting a patent infringement
+     claim (excluding declatory judgment actions) against Initial Developer
+     or a Contributor (the Initial Developer or Contributor against whom
+     You file such action is referred to as "Participant") alleging that:
+
+     (a) such Participant's Contributor Version directly or indirectly
+     infringes any patent, then any and all rights granted by such
+     Participant to You under Sections 2.1 and/or 2.2 of this License
+     shall, upon 60 days notice from Participant terminate prospectively,
+     unless if within 60 days after receipt of notice You either: (i)
+     agree in writing to pay Participant a mutually agreeable reasonable
+     royalty for Your past and future use of Modifications made by such
+     Participant, or (ii) withdraw Your litigation claim with respect to
+     the Contributor Version against such Participant. If within 60 days
+     of notice, a reasonable royalty and payment arrangement are not
+     mutually agreed upon in writing by the parties or the litigation claim
+     is not withdrawn, the rights granted by Participant to You under
+     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+     the 60 day notice period specified above.
+
+     (b) any software, hardware, or device, other than such Participant's
+     Contributor Version, directly or indirectly infringes any patent, then
+     any rights granted to You by such Participant under Sections 2.1(b)
+     and 2.2(b) are revoked effective as of the date You first made, used,
+     sold, distributed, or had made, Modifications made by that
+     Participant.
+
+     8.3. If You assert a patent infringement claim against Participant
+     alleging that such Participant's Contributor Version directly or
+     indirectly infringes any patent where such claim is resolved (such as
+     by license or settlement) prior to the initiation of patent
+     infringement litigation, then the reasonable value of the licenses
+     granted by such Participant under Sections 2.1 or 2.2 shall be taken
+     into account in determining the amount or value of any payment or
+     license.
+
+     8.4. In the event of termination under Sections 8.1 or 8.2 above,
+     all end user license agreements (excluding distributors and resellers)
+     which have been validly granted by You or any distributor hereunder
+     prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a "commercial item," as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+     software" and "commercial computer software documentation," as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if
+     any, provides otherwise), excluding its conflict-of-law provisions.
+     With respect to disputes in which at least one party is a citizen of,
+     or an entity chartered or registered to do business in the United
+     States of America, any litigation relating to this License shall be
+     subject to the jurisdiction of the Federal Courts of the Northern
+     District of California, with venue lying in Santa Clara County,
+     California, with the losing party responsible for costs, including
+     without limitation, court costs and reasonable attorneys' fees and
+     expenses. The application of the United Nations Convention on
+     Contracts for the International Sale of Goods is expressly excluded.
+     Any law or regulation which provides that the language of a contract
+     shall be construed against the drafter shall not apply to this
+     License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     As between Initial Developer and the Contributors, each party is
+     responsible for claims and damages arising, directly or indirectly,
+     out of its utilization of rights under this License and You agree to
+     work with Initial Developer and Contributors to distribute such
+     responsibility on an equitable basis. Nothing herein is intended or
+     shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+     Initial Developer may designate portions of the Covered Code as
+     "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+     Developer permits you to utilize portions of the Covered Code under
+     Your choice of the NPL or the alternative licenses, if any, specified
+     by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.1 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.
+
+     Alternatively, the contents of this file may be used under the terms
+     of the _____ license (the "[___] License"), in which case the
+     provisions of [______] License are applicable instead of those
+     above. If you wish to allow use of your version of this file only
+     under the terms of the [____] License and not to allow others to use
+     your version of this file under the MPL, indicate your decision by
+     deleting the provisions above and replace them with the notice and
+     other provisions required by the [___] License. If you do not delete
+     the provisions above, a recipient may use your version of this file
+     under either the MPL or the [___] License."
+
+     [NOTE: The text of this Exhibit A may differ slightly from the text of
+     the notices in the Source Code files of the Original Code. You should
+     use the text of this Exhibit A rather than the text found in the
+     Original Code Source Code for Your Modifications.]
+
+     ----------------------------------------------------------------------
+
+     AMENDMENTS
+
+     The Netscape Public License Version 1.1 ("NPL") consists of the
+     Mozilla Public License Version 1.1 with the following Amendments,
+     including Exhibit A-Netscape Public License. Files identified with
+     "Exhibit A-Netscape Public License" are governed by the Netscape
+     Public License Version 1.1.
+
+     Additional Terms applicable to the Netscape Public License.
+          I. Effect.
+          These additional terms described in this Netscape Public
+          License -- Amendments shall apply to the Mozilla Communicator
+          client code and to all Covered Code under this License.
+
+          II. "Netscape's Branded Code" means Covered Code that Netscape
+          distributes and/or permits others to distribute under one or more
+          trademark(s) which are controlled by Netscape but which are not
+          licensed for use under this License.
+
+          III. Netscape and logo.
+          This License does not grant any rights to use the trademarks
+          "Netscape", the "Netscape N and horizon" logo or the "Netscape
+          lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
+          "Smart Browsing" even if such marks are included in the Original
+          Code or Modifications.
+
+          IV. Inability to Comply Due to Contractual Obligation.
+          Prior to licensing the Original Code under this License, Netscape
+          has licensed third party code for use in Netscape's Branded Code.
+          To the extent that Netscape is limited contractually from making
+          such third party code available under this License, Netscape may
+          choose to reintegrate such code into Covered Code without being
+          required to distribute such code in Source Code form, even if
+          such code would otherwise be considered "Modifications" under
+          this License.
+
+          V. Use of Modifications and Covered Code by Initial Developer.
+               V.1. In General.
+               The obligations of Section 3 apply to Netscape, except to
+               the extent specified in this Amendment, Section V.2 and V.3.
+
+               V.2. Other Products.
+               Netscape may include Covered Code in products other than the
+               Netscape's Branded Code which are released by Netscape
+               during the two (2) years following the release date of the
+               Original Code, without such additional products becoming
+               subject to the terms of this License, and may license such
+               additional products on different terms from those contained
+               in this License.
+
+               V.3. Alternative Licensing.
+               Netscape may license the Source Code of Netscape's Branded
+               Code, including Modifications incorporated therein, without
+               such Netscape Branded Code becoming subject to the terms of
+               this License, and may license such Netscape Branded Code on
+               different terms from those contained in this License.
+
+          VI. Litigation.
+          Notwithstanding the limitations of Section 11 above, the
+          provisions regarding litigation in Section 11(a), (b) and (c) of
+          the License shall apply to all disputes relating to this License.
+
+     EXHIBIT A-Netscape Public License.
+
+          "The contents of this file are subject to the Netscape Public
+          License Version 1.1 (the "License"); you may not use this file
+          except in compliance with the License. You may obtain a copy of
+          the License at http://www.mozilla.org/NPL/
+
+          Software distributed under the License is distributed on an "AS
+          IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+          implied. See the License for the specific language governing
+          rights and limitations under the License.
+
+          The Original Code is Mozilla Communicator client code, released
+          March 31, 1998.
+
+          The Initial Developer of the Original Code is Netscape
+          Communications Corporation. Portions created by Netscape are
+          Copyright (C) 1998-1999 Netscape Communications Corporation. All
+          Rights Reserved.
+
+          Contributor(s): ______________________________________.
+
+          Alternatively, the contents of this file may be used under the
+          terms of the _____ license (the "[___] License"), in which case
+          the provisions of [______] License are applicable  instead of
+          those above. If you wish to allow use of your version of this
+          file only under the terms of the [____] License and not to allow
+          others to use your version of this file under the NPL, indicate
+          your decision by deleting the provisions above and replace  them
+          with the notice and other provisions required by the [___]
+          License. If you do not delete the provisions above, a recipient
+          may use your version of this file under either the NPL or the
+          [___] License."
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+       51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+                               and Clark Cooper
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.
+
+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.
+
+
+                                 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 2011 Google Inc. All Rights Reserved.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+Copyright (c) 2007-2009 IOLA and Ole Laursen
+
+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.
+
+This software is based in part on the work of the FreeType Team.
+
+----------------------
+
+                    The FreeType Project LICENSE
+                    ----------------------------
+
+                            2006-Jan-27
+
+                    Copyright 1996-2002, 2006 by
+          David Turner, Robert Wilhelm, and Werner Lemberg
+
+
+
+Introduction
+============
+
+  The FreeType  Project is distributed in  several archive packages;
+  some of them may contain, in addition to the FreeType font engine,
+  various tools and  contributions which rely on, or  relate to, the
+  FreeType Project.
+
+  This  license applies  to all  files found  in such  packages, and
+  which do not  fall under their own explicit  license.  The license
+  affects  thus  the  FreeType   font  engine,  the  test  programs,
+  documentation and makefiles, at the very least.
+
+  This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG
+  (Independent JPEG  Group) licenses, which  all encourage inclusion
+  and  use of  free  software in  commercial  and freeware  products
+  alike.  As a consequence, its main points are that:
+
+    o We don't promise that this software works. However, we will be
+      interested in any kind of bug reports. (`as is' distribution)
+
+    o You can  use this software for whatever you  want, in parts or
+      full form, without having to pay us. (`royalty-free' usage)
+
+    o You may not pretend that  you wrote this software.  If you use
+      it, or  only parts of it,  in a program,  you must acknowledge
+      somewhere  in  your  documentation  that  you  have  used  the
+      FreeType code. (`credits')
+
+  We  specifically  permit  and  encourage  the  inclusion  of  this
+  software, with  or without modifications,  in commercial products.
+  We  disclaim  all warranties  covering  The  FreeType Project  and
+  assume no liability related to The FreeType Project.
+
+
+  Finally,  many  people  asked  us  for  a  preferred  form  for  a
+  credit/disclaimer to use in compliance with this license.  We thus
+  encourage you to use the following text:
+
+   """  
+    Portions of this software are copyright © <year> The FreeType
+    Project (www.freetype.org).  All rights reserved.
+   """
+
+  Please replace <year> with the value from the FreeType version you
+  actually use.
+
+
+Legal Terms
+===========
+
+0. Definitions
+--------------
+
+  Throughout this license,  the terms `package', `FreeType Project',
+  and  `FreeType  archive' refer  to  the  set  of files  originally
+  distributed  by the  authors  (David Turner,  Robert Wilhelm,  and
+  Werner Lemberg) as the `FreeType Project', be they named as alpha,
+  beta or final release.
+
+  `You' refers to  the licensee, or person using  the project, where
+  `using' is a generic term including compiling the project's source
+  code as  well as linking it  to form a  `program' or `executable'.
+  This  program is  referred to  as  `a program  using the  FreeType
+  engine'.
+
+  This  license applies  to all  files distributed  in  the original
+  FreeType  Project,   including  all  source   code,  binaries  and
+  documentation,  unless  otherwise  stated   in  the  file  in  its
+  original, unmodified form as  distributed in the original archive.
+  If you are  unsure whether or not a particular  file is covered by
+  this license, you must contact us to verify this.
+
+  The FreeType  Project is copyright (C) 1996-2000  by David Turner,
+  Robert Wilhelm, and Werner Lemberg.  All rights reserved except as
+  specified below.
+
+1. No Warranty
+--------------
+
+  THE FREETYPE PROJECT  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY
+  KIND, EITHER  EXPRESS OR IMPLIED,  INCLUDING, BUT NOT  LIMITED TO,
+  WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR
+  PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
+  BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO
+  USE, OF THE FREETYPE PROJECT.
+
+2. Redistribution
+-----------------
+
+  This  license  grants  a  worldwide, royalty-free,  perpetual  and
+  irrevocable right  and license to use,  execute, perform, compile,
+  display,  copy,   create  derivative  works   of,  distribute  and
+  sublicense the  FreeType Project (in  both source and  object code
+  forms)  and  derivative works  thereof  for  any  purpose; and  to
+  authorize others  to exercise  some or all  of the  rights granted
+  herein, subject to the following conditions:
+
+    o Redistribution of  source code  must retain this  license file
+      (`FTL.TXT') unaltered; any  additions, deletions or changes to
+      the original  files must be clearly  indicated in accompanying
+      documentation.   The  copyright   notices  of  the  unaltered,
+      original  files must  be  preserved in  all  copies of  source
+      files.
+
+    o Redistribution in binary form must provide a  disclaimer  that
+      states  that  the software is based in part of the work of the
+      FreeType Team,  in  the  distribution  documentation.  We also
+      encourage you to put an URL to the FreeType web page  in  your
+      documentation, though this isn't mandatory.
+
+  These conditions  apply to any  software derived from or  based on
+  the FreeType Project,  not just the unmodified files.   If you use
+  our work, you  must acknowledge us.  However, no  fee need be paid
+  to us.
+
+3. Advertising
+--------------
+
+  Neither the  FreeType authors and  contributors nor you  shall use
+  the name of the  other for commercial, advertising, or promotional
+  purposes without specific prior written permission.
+
+  We suggest,  but do not require, that  you use one or  more of the
+  following phrases to refer  to this software in your documentation
+  or advertising  materials: `FreeType Project',  `FreeType Engine',
+  `FreeType library', or `FreeType Distribution'.
+
+  As  you have  not signed  this license,  you are  not  required to
+  accept  it.   However,  as  the FreeType  Project  is  copyrighted
+  material, only  this license, or  another one contracted  with the
+  authors, grants you  the right to use, distribute,  and modify it.
+  Therefore,  by  using,  distributing,  or modifying  the  FreeType
+  Project, you indicate that you understand and accept all the terms
+  of this license.
+
+4. Contacts
+-----------
+
+  There are two mailing lists related to FreeType:
+
+    o freetype@nongnu.org
+
+      Discusses general use and applications of FreeType, as well as
+      future and  wanted additions to the  library and distribution.
+      If  you are looking  for support,  start in  this list  if you
+      haven't found anything to help you in the documentation.
+
+    o freetype-devel@nongnu.org
+
+      Discusses bugs,  as well  as engine internals,  design issues,
+      specific licenses, porting, etc.
+
+  Our home page can be found at
+
+    http://www.freetype.org
+
+
+--- end of FTL.TXT ---
+
+// Copyright (c) 2013 The Chromium Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+			COPYRIGHTS
+
+Compilation copyright is held by the GPSD project.  All rights reserved.
+
+GPSD project copyrights are assigned to the project lead, currently
+Eric S. Raymond. Other portions of the GPSD code are Copyright (c)
+1997, 1998, 1999, 2000, 2001, 2002 by Remco Treffkorn, and others
+Copyright (c) 2005 by Eric S. Raymond.  For other copyrights, see
+individual files.
+
+			BSD LICENSE
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:<P>
+
+Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.<P>
+
+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.<P>
+
+Neither name of the GPSD project nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+    		    59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the 
+    Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
+    Boston, MA  02111-1307  USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+HarfBuzz is licensed under the so-called "Old MIT" license.  Details follow.
+For parts of HarfBuzz that are licensed under different licenses see individual
+files names COPYING in subdirectories where applicable.
+
+Copyright © 2010,2011,2012  Google, Inc.
+Copyright © 2012  Mozilla Foundation
+Copyright © 2011  Codethink Limited
+Copyright © 2008,2010  Nokia Corporation and/or its subsidiary(-ies)
+Copyright © 2009  Keith Stribley
+Copyright © 2009  Martin Hosken and SIL International
+Copyright © 2007  Chris Wilson
+Copyright © 2006  Behdad Esfahbod
+Copyright © 2005  David Turner
+Copyright © 2004,2007,2008,2009,2010  Red Hat, Inc.
+Copyright © 1998-2004  David Turner and Werner Lemberg
+
+For full copyright notices consult the individual files in the package.
+
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that the
+above copyright notice and the following two paragraphs appear in
+all copies of this software.
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+
+/*************************************************************************
+ *
+ *  IAccessible2 IDL Specification 
+ * 
+ *  Copyright (c) 2007, 2010 Linux Foundation 
+ *  Copyright (c) 2006 IBM Corporation 
+ *  Copyright (c) 2000, 2006 Sun Microsystems, Inc. 
+ *  All rights reserved. 
+ *   
+ *   
+ *  Redistribution and use in source and binary forms, with or without 
+ *  modification, are permitted provided that the following conditions 
+ *  are met: 
+ *   
+ *   1. Redistributions of source code must retain the above copyright 
+ *      notice, this list of conditions and the following disclaimer. 
+ *   
+ *   2. Redistributions in binary form must reproduce the above 
+ *      copyright notice, this list of conditions and the following 
+ *      disclaimer in the documentation and/or other materials 
+ *      provided with the distribution. 
+ *
+ *   3. Neither the name of the Linux Foundation nor the names of its 
+ *      contributors may be used to endorse or promote products 
+ *      derived from this software without specific prior written 
+ *      permission. 
+ *   
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ *  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+ *  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+ *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
+ *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
+ *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+ *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
+ *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
+ *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *   
+ *  This BSD License conforms to the Open Source Initiative "Simplified 
+ *  BSD License" as published at: 
+ *  http://www.opensource.org/licenses/bsd-license.php 
+ *   
+ *  IAccessible2 is a trademark of the Linux Foundation. The IAccessible2 
+ *  mark may be used in accordance with the Linux Foundation Trademark 
+ *  Policy to indicate compliance with the IAccessible2 specification. 
+ * 
+ ************************************************************************/ 
+
+LICENSE extracted from IJG's jpeg distribution:
+-----------------------------------------------
+
+In plain English:
+
+1. We don't promise that this software works.  (But if you find any bugs,
+   please let us know!)
+2. You can use this software for whatever you want.  You don't have to pay us.
+3. You may not pretend that you wrote this software.  If you use it in a
+   program, you must acknowledge somewhere in your documentation that
+   you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose.  This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library.  If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it.  This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2010 International Business Machines Corporation and others
+
+All rights reserved.
+
+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, and/or sell
+copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies
+of the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM,
+OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2002
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+The following is the license for the jemalloc source code, as provided
+in the initial section of the source files.
+
+Copyright (C) 2006-2008 Jason Evans <jasone@FreeBSD.org>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice(s), this list of conditions and the following disclaimer as
+   the first lines of this file unmodified other than the possible
+   addition of one or more copyright notices.
+2. Redistributions in binary form must reproduce the above copyright
+   notice(s), this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) 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.
+
+
+The JsonCpp library's source code, including accompanying documentation, 
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all 
+jurisdictions which recognize such a disclaimer. In such jurisdictions, 
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this 
+software may choose to accept it either as 1) Public Domain, 2) under the 
+conditions of the MIT License (see below), or 3) under the terms of dual 
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+   http://en.wikipedia.org/wiki/MIT_License
+   
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+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.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
+
+
+                                 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.
+
+Copyright (c) 2007-2010 The Khronos Group Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and/or associated documentation files (the
+"Materials"), to deal in the Materials without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Materials, and to
+permit persons to whom the Materials are 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 Materials.
+
+THE MATERIALS ARE 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
+MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+
+SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+
+Copyright (C) 1992 Silicon Graphics, Inc. All Rights Reserved.
+
+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 including the dates of first publication and either
+this permission notice or a reference to http://oss.sgi.com/projects/FreeB/
+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 SILICON
+GRAPHICS, INC. 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.
+
+Except as contained in this notice, the name of Silicon Graphics, Inc. shall
+not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Silicon
+Graphics, Inc.
+
+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 the copyright holders nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+License copied from bin/lcov:
+
+#
+#   Copyright (c) International Business Machines  Corp., 2002,2007
+#
+#   This program is free software;  you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or (at
+#   your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY;  without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#   General Public License for more details.                 
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program;  if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+Copyright (c) 2011 The LevelDB Authors. 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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*
+ * Copyright (c) 2008 NVIDIA, Corporation
+ *
+ * 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 (including the next
+ * paragraph) 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.
+ */
+Copyright 2000-2007 Niels Provos <provos@citi.umich.edu>
+Copyright 2007-2009 Niels Provos and Nick Mathewson
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR 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.
+
+Copyright (c) 2013, Google Inc.
+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.
+    * The name of the author may not be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+(Copied from the README.)
+
+--------------------------------------------------------------------------------
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose.  This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library.  If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it.  This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it.  (See the file
+ansi2knr.c for full details.)  However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh).  Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered by
+patents owned by IBM, AT&T, and Mitsubishi.  Hence arithmetic coding cannot
+legally be used without obtaining one or more licenses.  For this reason,
+support for arithmetic coding has been removed from the free JPEG software.
+(Since arithmetic coding provides only a marginal gain over the unpatented
+Huffman mode, it is unlikely that very many implementations will support it.)
+So far as we are aware, there are no patent restrictions on the remaining
+code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs".  This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+    "The Graphics Interchange Format(c) is the Copyright property of
+    CompuServe Incorporated.  GIF(sm) is a Service Mark property of
+    CompuServe Incorporated."
+
+Copyright (C) 2011 Google 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
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT 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 copy of the libpng notices is provided for your convenience.  In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.2.45, July 7, 2011, are
+Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+   Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+   Simon-Pierre Cadieux
+   Eric S. Raymond
+   Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+   There is no warranty against interference with your enjoyment of the
+   library or against infringement.  There is no warranty that our
+   efforts or the library will fulfill any of your particular purposes
+   or needs.  This library is provided with all faults, and the entire
+   risk of satisfactory quality, performance, accuracy, and effort is with
+   the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+   Tom Lane
+   Glenn Randers-Pehrson
+   Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+   John Bowler
+   Kevin Bracey
+   Sam Bushell
+   Magnus Holmgren
+   Greg Roelofs
+   Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+   Andreas Dilger
+   Dave Martindale
+   Guy Eric Schalnat
+   Paul Schmidt
+   Tim Wegner
+
+The PNG Reference Library is supplied "AS IS".  The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose.  The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+   be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+   source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products.  If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+   printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+July 7, 2011
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+    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, sub license, 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 (including the
+    next paragraph) 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 NON-INFRINGEMENT.
+    IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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.
+
+Copyright (c) 2010, Google Inc. 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 Google nor the names of its contributors may
+    be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the WebM Project.
+
+Google 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,
+transfer, and otherwise run, modify and propagate the contents of this
+implementation of VP8, where such license applies only to those patent
+claims, both currently owned by Google and acquired in the future,
+licensable by Google that are necessarily infringed by this
+implementation of VP8. This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation. If you or your agent or exclusive licensee institute or
+order or agree to the institution of patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that this implementation of VP8 or any code incorporated within this
+implementation of VP8 constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of VP8
+shall terminate as of the date such litigation is filed.
+
+Except where otherwise noted in the source code (e.g. the files hash.c,
+list.c and the trio files, which are covered by a similar licence but
+with different Copyright notices) all the files are:
+
+ Copyright (C) 1998-2003 Daniel Veillard.  All Rights Reserved.
+
+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 fur-
+nished 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, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+
+Licence for libxslt except libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Daniel Veillard.  All Rights Reserved.
+
+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 fur-
+nished 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, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+----------------------------------------------------------------------
+
+Licence for libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
+ All Rights Reserved.
+
+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 fur-
+nished 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, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the authors shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+----------------------------------------------------------------------
+
+LZMA SDK is placed in the public domain.
+
+Copyright (c) 2003-2009 Jonathan 'Wolf' Rentzsch: <http://rentzsch.com>
+Some rights reserved: <http://opensource.org/licenses/mit-license.php>
+
+The default Mesa license is as follows:
+
+Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
+
+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
+BRIAN PAUL 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.
+
+
+
+Some parts of Mesa are copyrighted under the GNU LGPL.  See the
+Mesa/docs/COPYRIGHT file for details.
+
+The following is the standard GNU copyright file.
+----------------------------------------------------------------------
+
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+                    675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+ * MODP_B64 - High performance base64 encoder/decoder
+ * Version 1.3 -- 17-Mar-2006
+ * http://modp.com/release/base64
+ *
+ * Copyright (c) 2005, 2006  Nick Galbreath -- nickg [at] modp [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 the modp.com nor the names of its
+ *   contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright 2008 MolokoCacao
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing that the following conditions 
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR 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.
+
+Copyright (c) 2004-2009 Sergey Lyubka
+Portions Copyright (c) 2009 Gilbert Wellisch
+
+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.
+
+
+Copyright 2010-2011, Google Inc.
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2002
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+   A C-program for MT19937, with initialization improved 2002/1/26.
+   Coded by Takuji Nishimura and Makoto Matsumoto.
+
+   Before using, initialize the state by using init_genrand(seed)  
+   or init_by_array(init_key, key_length).
+
+   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+   All rights reserved.                          
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+     1. Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+
+     2. Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in the
+        documentation and/or other materials provided with the distribution.
+
+     3. The names of its contributors may not be used to endorse or promote 
+        products derived from this software without specific prior written 
+        permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Copyright (c) 2006-2009 The Chromium OS Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Version: MPL 1.1/GPL 2.0/LGPL 2.1
+
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is mozilla.org code.
+
+The Initial Developer of the Original Code is
+Netscape Communications Corporation.
+Portions created by the Initial Developer are Copyright (C) 1998
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+
+Alternatively, the contents of this file may be used under the terms of
+either the GNU General Public License Version 2 or later (the "GPL"), or
+the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+in which case the provisions of the GPL or the LGPL are applicable instead
+of those above. If you wish to allow use of your version of this file only
+under the terms of either the GPL or the LGPL, and not to allow others to
+use your version of this file under the terms of the MPL, indicate your
+decision by deleting the provisions above and replace them with the notice
+and other provisions required by the GPL or the LGPL. If you do not delete
+the provisions above, a recipient may use your version of this file under
+the terms of any one of the MPL, the GPL or the LGPL.
+
+  
+  Copyright (c) 2004-2012 by Mulle Kybernetik. All rights reserved.
+
+  Permission to use, copy, modify and distribute this software and its documentation
+  is hereby granted, provided that both the copyright notice and this permission
+  notice appear in all copies of the software, derivative works or modified versions,
+  and any portions thereof, and that both notices appear in supporting documentation,
+  and that credit is given to Mulle Kybernetik in all documents and publicity
+  pertaining to direct or indirect use of this code or its derivatives.
+
+  THIS IS EXPERIMENTAL SOFTWARE AND IT IS KNOWN TO HAVE BUGS, SOME OF WHICH MAY HAVE
+  SERIOUS CONSEQUENCES. THE COPYRIGHT HOLDER ALLOWS FREE USE OF THIS SOFTWARE IN ITS
+  "AS IS" CONDITION. THE COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY
+  DAMAGES WHATSOEVER RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE
+  OR OF ANY DERIVATIVE WORK.
+
+  LICENSE ISSUES
+  ==============
+
+  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+  the OpenSSL License and the original SSLeay license apply to the toolkit.
+  See below for the actual license texts. Actually both licenses are BSD-style
+  Open Source licenses. In case of any license issues related to OpenSSL
+  please contact openssl-core@openssl.org.
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,
+                    Jean-Marc Valin, Timothy B. Terriberry,
+                    CSIRO, Gregory Maxwell, Mark Borgerding,
+                    Erik de Castro Lopo
+
+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 Internet Society, IETF or IETF Trust, nor the 
+names of specific contributors, may be used to endorse or promote
+products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Opus is subject to the royalty-free patent licenses which are
+specified at:
+
+Xiph.Org Foundation:
+https://datatracker.ietf.org/ipr/1524/
+
+Microsoft Corporation:
+https://datatracker.ietf.org/ipr/1914/
+
+Broadcom Corporation:
+https://datatracker.ietf.org/ipr/1526/
+
+// Copyright (c) 2009 The Chromium Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+PLY (Python Lex-Yacc)                   Version 3.4
+
+Copyright (C) 2001-2011,
+David M. Beazley (Dabeaz LLC)
+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 the David Beazley or Dabeaz LLC may be used to
+  endorse or promote products derived from this software without
+  specific prior written permission. 
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// Copyright (c) 2012 The Polymer Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright 2008, Google Inc.
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it.  This code is not
+standalone and requires a support library to be linked with it.  This
+support library is itself covered by the above license.
+
+Copyright (c) 2003-2012, Michael Foord
+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.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+qcms
+Copyright (C) 2009 Mozilla Corporation
+Copyright (C) 1998-2007 Marti Maria
+
+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.
+
+// Copyright (c) 2009 The RE2 Authors. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+                                 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 2011 Google Inc. All Rights Reserved.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+Copyright (c) 2006 Bob Ippolito
+
+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.
+
+// Copyright (c) 2011 Google Inc. 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+All MurmurHash source files are placed in the public domain.
+
+The license below applies to all other code in SMHasher:
+
+Copyright (c) 2011 Google, Inc.
+
+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.
+
+The author disclaims copyright to this source code.  In place of
+a legal notice, here is a blessing:
+
+   May you do good and not evil.
+   May you find forgiveness for yourself and forgive others.
+   May you share freely, never taking more than you give.
+
+SWIG is distributed under the following terms:
+
+I.  
+
+Copyright (c) 1995-1998
+The University of Utah and the Regents of the University of California
+All Rights Reserved
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that 
+(1) The above copyright notice and the following two paragraphs
+appear in all copies of the source code and (2) redistributions
+including binaries reproduces these notices in the supporting
+documentation.   Substantial modifications to this software may be
+copyrighted by their authors and need not follow the licensing terms
+described here, provided that the new terms are clearly indicated in
+all files where they apply.
+
+IN NO EVENT SHALL THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, THE 
+UNIVERSITY OF UTAH OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY
+PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
+EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, AND THE UNIVERSITY OF UTAH
+SPECIFICALLY DISCLAIM ANY WARRANTIES,INCLUDING, BUT NOT LIMITED TO, 
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND 
+THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+
+
+II. 
+
+This software includes contributions that are Copyright (c) 1998-2005
+University of Chicago.
+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
+the University of Chicago 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 UNIVERSITY OF CHICAGO AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF
+CHICAGO OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+III.  
+
+This software includes contributions that are Copyright (c) 2005-2006
+Arizona Board of Regents (University of Arizona).
+All Rights Reserved
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that 
+(1) The above copyright notice and the following two paragraphs
+appear in all copies of the source code and (2) redistributions
+including binaries reproduces these notices in the supporting
+documentation.   Substantial modifications to this software may be
+copyrighted by their authors and need not follow the licensing terms
+described here, provided that the new terms are clearly indicated in
+all files where they apply.
+
+THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF ARIZONA AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF
+ARIZONA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Copyright (c) 2005, Google Inc.
+// 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 Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+All code here is public domain.
+
+Copyright (c) 2012, Linux USB Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+o Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+
+o 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.
+
+o Neither the name of the Linux USB Project nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(Copied from the COPYRIGHT file of
+https://code.google.com/p/sctp-refimpl/source/browse/trunk/COPYRIGHT)
+--------------------------------------------------------------------------------
+
+Copyright (c) 2001, 2002 Cisco Systems, Inc.
+Copyright (c) 2002-12 Randall R. Stewart
+Copyright (c) 2002-12 Michael Tuexen
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+;*****************************************************************************
+;* x86inc.asm
+;*****************************************************************************
+;* Copyright (C) 2005-2011 x264 project
+;*
+;* Authors: Loren Merritt <lorenm@u.washington.edu>
+;*          Anton Mitrofanov <BugMaster@narod.ru>
+;*          Jason Garrett-Glaser <darkshikari@gmail.com>
+;*
+;* Permission to use, copy, modify, and/or distribute this software for any
+;* purpose with or without fee is hereby granted, provided that the above
+;* copyright notice and this permission notice appear in all copies.
+;*
+;* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+;* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+;* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+;* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+;* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+;* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+;* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+;*****************************************************************************
+
+; This is a header file for the x264ASM assembly language, which uses
+; NASM/YASM syntax combined with a large number of macros to provide easy
+; abstraction between different calling conventions (x86_32, win64, linux64).
+; It also has various other useful features to simplify writing the kind of
+; DSP functions that are most often used in x264.
+
+; Unlike the rest of x264, this file is available under an ISC license, as it
+; has significant usefulness outside of x264 and we want it to be available
+; to the largest audience possible.  Of course, if you modify it for your own
+; purposes to add a new feature, we strongly encourage contributing a patch
+; as this feature might be useful for others as well.  Send patches or ideas
+; to x264-devel@videolan.org .
+
+Yasm is Copyright (c) 2001-2010 Peter Johnson and other Yasm developers.
+
+Yasm developers and/or contributors include:
+  Peter Johnson
+  Michael Urman
+  Brian Gladman (Visual Studio build files, other fixes)
+  Stanislav Karchebny (options parser)
+  Mathieu Monnier (SSE4 instruction patches, NASM preprocessor additions)
+  Anonymous "NASM64" developer (NASM preprocessor fixes)
+  Stephen Polkowski (x86 instruction patches)
+  Henryk Richter (Mach-O object format)
+  Ben Skeggs (patches, bug reports)
+  Alexei Svitkine (GAS preprocessor)
+  Samuel Thibault (TASM parser and frontend)
+
+-----------------------------------
+Yasm licensing overview and summary
+-----------------------------------
+
+Note: This document does not provide legal advice nor is it the actual
+license of any part of Yasm.  See the individual licenses for complete
+details.  Consult a lawyer for legal advice.
+
+The primary license of Yasm is the 2-clause BSD license.  Please use this
+license if you plan on submitting code to the project.
+
+Yasm has absolutely no warranty; not even for merchantibility or fitness
+for a particular purpose.
+
+-------
+Libyasm
+-------
+Libyasm is 2-clause or 3-clause BSD licensed, with the exception of
+bitvect, which is triple-licensed under the Artistic license, GPL, and
+LGPL.  Libyasm is thus GPL and LGPL compatible.  In addition, this also
+means that libyasm is free for binary-only distribution as long as the
+terms of the 3-clause BSD license and Artistic license (as it applies to
+bitvect) are fulfilled.
+
+-------
+Modules
+-------
+The modules are 2-clause or 3-clause BSD licensed.
+
+---------
+Frontends
+---------
+The frontends are 2-clause BSD licensed.
+
+-------------
+License Texts
+-------------
+The full text of all licenses are provided in separate files in the source
+distribution.  Each source file may include the entire license (in the case
+of the BSD and Artistic licenses), or may reference the GPL or LGPL license
+file.
+
+BSD.txt - 2-clause and 3-clause BSD licenses
+Artistic.txt - Artistic license
+GNU_GPL-2.0 - GNU General Public License
+GNU_LGPL-2.0 - GNU Library General Public License
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+  version 1.2.4, March 14th, 2010
+
+  Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly
+  Mark Adler
+
+*/
+
+Copyright 2007, Google Inc.
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------------------
+
+The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is
+licensed separately as follows:
+
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is mozilla.org code.
+
+The Initial Developer of the Original Code is
+Netscape Communications Corporation.
+Portions created by the Initial Developer are Copyright (C) 1998
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+  Darin Fisher (original author)
+
+Alternatively, the contents of this file may be used under the terms of
+either the GNU General Public License Version 2 or later (the "GPL"), or
+the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+in which case the provisions of the GPL or the LGPL are applicable instead
+of those above. If you wish to allow use of your version of this file only
+under the terms of either the GPL or the LGPL, and not to allow others to
+use your version of this file under the terms of the MPL, indicate your
+decision by deleting the provisions above and replace them with the notice
+and other provisions required by the GPL or the LGPL. If you do not delete
+the provisions above, a recipient may use your version of this file under
+the terms of any one of the MPL, the GPL or the LGPL.
+
+Copyright 2007, Google Inc.
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------------------
+
+The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is
+licensed separately as follows:
+
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is mozilla.org code.
+
+The Initial Developer of the Original Code is
+Netscape Communications Corporation.
+Portions created by the Initial Developer are Copyright (C) 1998
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+  Darin Fisher (original author)
+
+Alternatively, the contents of this file may be used under the terms of
+either the GNU General Public License Version 2 or later (the "GPL"), or
+the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+in which case the provisions of the GPL or the LGPL are applicable instead
+of those above. If you wish to allow use of your version of this file only
+under the terms of either the GPL or the LGPL, and not to allow others to
+use your version of this file under the terms of the MPL, indicate your
+decision by deleting the provisions above and replace them with the notice
+and other provisions required by the GPL or the LGPL. If you do not delete
+the provisions above, a recipient may use your version of this file under
+the terms of any one of the MPL, the GPL or the LGPL.
+
+This license applies to all parts of V8 that are not externally
+maintained libraries.  The externally maintained libraries used by V8
+are:
+
+  - PCRE test suite, located in
+    test/mjsunit/third_party/regexp-pcre.js.  This is based on the
+    test suite from PCRE-7.3, which is copyrighted by the University
+    of Cambridge and Google, Inc.  The copyright notice and license
+    are embedded in regexp-pcre.js.
+
+  - Layout tests, located in test/mjsunit/third_party.  These are
+    based on layout tests from webkit.org which are copyrighted by
+    Apple Computer, Inc. and released under a 3-clause BSD license.
+
+  - Strongtalk assembler, the basis of the files assembler-arm-inl.h,
+    assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
+    assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h,
+    assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h,
+    assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h.
+    This code is copyrighted by Sun Microsystems Inc. and released
+    under a 3-clause BSD license.
+
+  - Valgrind client API header, located at third_party/valgrind/valgrind.h
+    This is release under the BSD license.
+
+These libraries have their own licenses; we recommend you read them,
+as their terms may differ from the terms below.
+
+Copyright 2006-2012, the V8 project authors. 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 Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+/bin/make_ext4fs
+/bin/mkuserimg.sh
+/lib/libext4_utils_host.a
+------------------------------------------------------------
+
+   Copyright (c) 2010, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+============================================================
+Notices for file(s):
+/lib/libsqlite_jni.so
+------------------------------------------------------------
+This software is copyrighted by Christian Werner <chw@ch-werner.de>
+and others. The following terms apply to all files associated with the
+software unless explicitly disclaimed in individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
+IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+============================================================
+Notices for file(s):
+/lib/libgccdemangle.so
+------------------------------------------------------------
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+/bin/aapt
+/bin/aidl
+/bin/dexdump
+/bin/jasmin
+/bin/split-select
+/framework/android-mock-generatorlib.jar
+/framework/jasmin.jar
+/lib/lib64cutils.a
+/lib/lib64log.a
+/lib/lib64utils.a
+/lib/libandroidfw.a
+/lib/libcutils.a
+/lib/liblog.a
+/lib/liblog.so
+/lib/libnativehelper.so
+/lib/libsqlite3_android.a
+/lib/libutils.a
+/lib/libzipfile.a
+------------------------------------------------------------
+
+   Copyright (c) 2005-2008, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+============================================================
+Notices for file(s):
+/framework/org.eclipse.core.commands_3.6.0.I20100512-1500.jar
+/framework/org.eclipse.core.expressions_3.4.200.v20100505.jar
+/framework/org.eclipse.core.runtime_3.6.0.v20100505.jar
+/framework/org.eclipse.equinox.common_3.6.0.v20100503.jar
+/framework/org.eclipse.jface_3.6.2.M20110210-1200.jar
+/framework/org.eclipse.osgi_3.6.2.R36x_v20110210.jar
+/framework/org.eclipse.ui.workbench.texteditor_3.6.1.r361_v20100714-0800.jar
+/framework/org.eclipse.ui.workbench_3.6.2.M20110210-1200.jar
+/framework/osgi.jar
+/framework/propertysheet.jar
+/framework/swt.jar
+------------------------------------------------------------
+
+    Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+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. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), 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 OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+
+============================================================
+Notices for file(s):
+/framework/bouncycastle-host.jar
+/framework/bouncycastle-hostdex.jar
+------------------------------------------------------------
+Copyright (c) 2000-2013 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
+
+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.
+
+============================================================
+Notices for file(s):
+/framework/commons-compress-1.0.jar
+------------------------------------------------------------
+Apache Commons Compress
+Copyright 2002-2009 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+Original BZip2 classes contributed by Keiron Liddle
+<keiron@aftexsw.com>, Aftex Software to the Apache Ant project
+
+Original Tar classes from contributors of the Apache Ant project
+
+Original Zip classes from contributors of the Apache Ant project
+
+Original CPIO classes contributed by Markus Kuss and the jRPM project
+(jrpm.sourceforge.net)
+
+============================================================
+Notices for file(s):
+/lib/libbcc.so
+------------------------------------------------------------
+==========================
+NOTICE file for libbcc.git
+==========================
+
+* NOTICE for lib/ExecutionEngine/, lib/ScriptCRT/, include and helper/.
+
+   Copyright (c) 2005-2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+
+* NOTICE for runtime/ and lib/CodeGen/.
+  Note: The NOTICE is the same for another git project, external/llvm.git.
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+Autoconf            llvm/autoconf
+                    llvm/projects/ModuleMaker/autoconf
+                    llvm/projects/sample/autoconf
+CellSPU backend     llvm/lib/Target/CellSPU/README.txt
+Google Test         llvm/utils/unittest/googletest
+OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+
+
+* NOTICE for tests/disassem.cpp and tests/disassem.h.
+
+/*      $NetBSD: disassem.c,v 1.14 2003/03/27 16:58:36 mycroft Exp $    */
+
+/*-
+ * Copyright (c) 1996 Mark Brinicombe.
+ * Copyright (c) 1996 Brini.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Brini.
+ * 4. The name of the company nor the name of the author may be used to
+ *    endorse or promote products derived from this software without specific
+ *    prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BRINI ``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 BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * RiscBSD kernel project
+ *
+ * db_disasm.c
+ *
+ * Kernel disassembler
+ *
+ * Created      : 10/02/96
+ *
+ * Structured after the sparc/sparc/db_disasm.c by David S. Miller &
+ * Paul Kranenburg
+ *
+ * This code is not complete. Not all instructions are disassembled.
+ */
+
+============================================================
+Notices for file(s):
+/lib/libfdlibm.a
+------------------------------------------------------------
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+============================================================
+Notices for file(s):
+/bin/emulator-arm
+/bin/emulator-mips
+/bin/emulator-x86
+/bin/emulator
+/bin/emulator64-arm
+/bin/emulator64-mips
+/bin/emulator64-x86
+/lib/emulator-common.a
+/lib/emulator-libelff.a
+/lib/emulator-libjpeg.a
+/lib/emulator-libqemu.a
+/lib/emulator-libui.a
+/lib/emulator-target-arm.a
+/lib/emulator-target-i386.a
+/lib/emulator-target-mips.a
+/lib/emulator64-common.a
+/lib/emulator64-libelff.a
+/lib/emulator64-libjpeg.a
+/lib/emulator64-libqemu.a
+/lib/emulator64-libui.a
+/lib/emulator64-target-arm.a
+/lib/emulator64-target-i386.a
+/lib/emulator64-target-mips.a
+------------------------------------------------------------
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+/framework/groovy-all-1.7.0.jar
+------------------------------------------------------------
+                                 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.
+
+============================================================
+Notices for file(s):
+/lib/libcorkscrew.so
+------------------------------------------------------------
+
+   Copyright (c) 2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+============================================================
+Notices for file(s):
+/framework/liblzf.jar
+------------------------------------------------------------
+Copyright (c) 2000-2009 Marc Alexander Lehmann <schmorp@schmorp.de>
+
+Redistribution and use in source and binary forms, with or without modifica-
+tion, are permitted provided that the following conditions are met:
+
+  1.  Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+  2.  Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
+CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
+CIAL, 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 OTH-
+ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Alternatively, the following files carry an additional notice that
+explicitly allows relicensing under the GPLv2: lzf.c lzf.h lzfP.h lzf_c.c
+lzf_d.c
+
+
+============================================================
+Notices for file(s):
+/lib/libLLVM.so
+------------------------------------------------------------
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+Autoconf            llvm/autoconf
+                    llvm/projects/ModuleMaker/autoconf
+                    llvm/projects/sample/autoconf
+CellSPU backend     llvm/lib/Target/CellSPU/README.txt
+Google Test         llvm/utils/unittest/googletest
+OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+======================================================================
+== LICENSE.TXT for ./autoconf/LICENSE.TXT
+======================================================================
+
+------------------------------------------------------------------------------
+Autoconf Files
+------------------------------------------------------------------------------
+All autoconf files are licensed under the LLVM license with the following
+additions:
+
+llvm/autoconf/install-sh:
+	This script is licensed under the LLVM license, with the following
+	additional copyrights and restrictions:
+
+	Copyright 1991 by the Massachusetts Institute of Technology
+
+	Permission to use, copy, modify, distribute, and sell this software and its
+	documentation for any purpose is hereby granted without fee, provided that
+	the above copyright notice appear in all copies and that both that
+	copyright notice and this permission notice appear in supporting 
+	documentation, and that the name of M.I.T. not be used in advertising or
+	publicity pertaining to distribution of the software without specific,
+	written prior permission.  M.I.T. makes no representations about the
+	suitability of this software for any purpose.  It is provided "as is"
+	without express or implied warranty.
+
+Please see the source files for additional copyrights.
+
+
+======================================================================
+== LICENSE.TXT for ./projects/sample/autoconf/LICENSE.TXT
+======================================================================
+
+------------------------------------------------------------------------------
+Autoconf Files
+------------------------------------------------------------------------------
+All autoconf files are licensed under the LLVM license with the following
+additions:
+
+llvm/autoconf/install-sh:
+	This script is licensed under the LLVM license, with the following
+	additional copyrights and restrictions:
+
+	Copyright 1991 by the Massachusetts Institute of Technology
+
+	Permission to use, copy, modify, distribute, and sell this software and its
+	documentation for any purpose is hereby granted without fee, provided that
+	the above copyright notice appear in all copies and that both that
+	copyright notice and this permission notice appear in supporting 
+	documentation, and that the name of M.I.T. not be used in advertising or
+	publicity pertaining to distribution of the software without specific,
+	written prior permission.  M.I.T. makes no representations about the
+	suitability of this software for any purpose.  It is provided "as is"
+	without express or implied warranty.
+
+Please see the source files for additional copyrights.
+
+
+======================================================================
+== LICENSE.TXT for ./utils/unittest/googletest/LICENSE.TXT
+======================================================================
+
+Copyright 2008, Google Inc.
+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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+======================================================================
+== LICENSE.TXT for ./include/llvm/Support/LICENSE.TXT
+======================================================================
+
+LLVM System Interface Library
+-------------------------------------------------------------------------------
+The LLVM System Interface Library is licensed under the Illinois Open Source
+License and has the following additional copyright:
+
+Copyright (C) 2004 eXtensible Systems, Inc.
+
+============================================================
+Notices for file(s):
+/framework/doclava.jar
+------------------------------------------------------------
+ 
+ Copyright (C) 2010 Google 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
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+======================================================================
+
+jQuery 1.2.6 - New Wave Javascript
+
+Copyright (c) 2008 John Resig (jquery.com)
+Dual licensed under the MIT (MIT-LICENSE.txt)
+and GPL (GPL-LICENSE.txt) licenses.
+
+Copyright (c) 2009 John Resig, http://jquery.com/
+
+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.
+
+
+============================================================
+Notices for file(s):
+/bin/sqlite3
+/lib/libsqlite.so
+------------------------------------------------------------
+2001 September 15
+
+The author disclaims copyright to this source code.  In place of
+a legal notice, here is a blessing:
+
+   May you do good and not evil.
+   May you find forgiveness for yourself and forgive others.
+   May you share freely, never taking more than you give.
+
+
+============================================================
+Notices for file(s):
+/lib/libcrypto-host.so
+/lib/libcrypto_static.a
+/lib/libssl-host.so
+------------------------------------------------------------
+
+  LICENSE ISSUES
+  ==============
+
+  The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+  the OpenSSL License and the original SSLeay license apply to the toolkit.
+  See below for the actual license texts. Actually both licenses are BSD-style
+  Open Source licenses. In case of any license issues related to OpenSSL
+  please contact openssl-core@openssl.org.
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ * 
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ * 
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from 
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ * 
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+============================================================
+Notices for file(s):
+/lib/libexpat-host.so
+/lib/libexpat.a
+------------------------------------------------------------
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+                               and Clark Cooper
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.
+
+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.
+
+============================================================
+Notices for file(s):
+/lib/libLLVMAnalysis.a
+------------------------------------------------------------
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+Autoconf            llvm/autoconf
+                    llvm/projects/ModuleMaker/autoconf
+                    llvm/projects/sample/autoconf
+CellSPU backend     llvm/lib/Target/CellSPU/README.txt
+Google Test         llvm/utils/unittest/googletest
+OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+============================================================
+Notices for file(s):
+/framework/emmalib.jar
+------------------------------------------------------------
+Common Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S
+ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+      a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+      b) in the case of each subsequent Contributor:
+
+      i) changes to the Program, and
+
+      ii) additions to the Program;
+
+      where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was
+added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules
+of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+      a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative
+works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+      b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make,
+use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+      c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the
+Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other
+entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the
+Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+      d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this
+Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+      a) it complies with the terms and conditions of this Agreement; and
+
+      b) its license agreement:
+
+      i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement,
+and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+      ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost
+profits;
+
+      iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+      iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium
+customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+      a) it must be made available under this Agreement; and
+
+      b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the
+Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the
+commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other
+Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a
+third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a
+commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to
+qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate
+with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor
+then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this
+Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any
+patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes
+patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a
+reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the
+Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following
+manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the
+right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new
+version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under
+which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new
+version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal
+action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+/lib/libselinux.a
+------------------------------------------------------------
+This library (libselinux) is public domain software, i.e. not copyrighted.
+
+Warranty Exclusion
+------------------
+You agree that this software is a
+non-commercially developed program that may contain "bugs" (as that
+term is used in the industry) and that it may not function as intended.
+The software is licensed "as is". NSA makes no, and hereby expressly
+disclaims all, warranties, express, implied, statutory, or otherwise
+with respect to the software, including noninfringement and the implied
+warranties of merchantability and fitness for a particular purpose.
+
+Limitation of Liability
+-----------------------
+In no event will NSA be liable for any damages, including loss of data,
+lost profits, cost of cover, or other special, incidental,
+consequential, direct or indirect damages arising from the software or
+the use thereof, however caused and on any theory of liability. This
+limitation will apply even if NSA has been advised of the possibility
+of such damage. You acknowledge that this is a reasonable allocation of
+risk.
+
+============================================================
+Notices for file(s):
+/framework/org-netbeans-api-visual.jar
+/framework/org-openide-util.jar
+------------------------------------------------------------
+The GNU General Public License (GPL) Version 2, June 1991 
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away
+your freedom to share and change it. By contrast, the GNU
+General Public License is intended to guarantee your freedom
+to share and change free software--to make sure the software
+is free for all its users. This General Public License
+applies to most of the Free Software Foundation's software
+and to any other program whose authors commit to using it.
+(Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can
+apply it to your programs, too. When we speak of free
+software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and
+charge for this service if you wish), that you receive
+source code or can get it if you want it, that you can
+change the software or use pieces of it in new free
+programs; and that you know you can do these things. To
+protect your rights, we need to make restrictions that
+forbid anyone to deny you these rights or to ask you to
+surrender the rights. These restrictions translate to
+certain responsibilities for you if you distribute copies of
+the software, or if you modify it.
+
+For example, if you distribute copies of such a program,
+whether gratis or for a fee, you must give the recipients
+all the rights that you have. You must make sure that they,
+too, receive or can get the source code. And you must show
+them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the
+software, and (2) offer you this license which gives you
+legal permission to copy, distribute and/or modify the
+software.
+
+Also, for each author's protection and ours, we want to make
+certain that everyone understands that there is no warranty
+for this free software. If the software is modified by
+someone else and passed on, we want its recipients to know
+that what they have is not the original, so that any
+problems introduced by others will not reflect on the
+original authors' reputations.
+
+Finally, any free program is threatened constantly by
+software patents. We wish to avoid the danger that
+redistributors of a free program will individually obtain
+patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must
+be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution
+and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
+MODIFICATION
+
+0. This License applies to any program or other work which
+contains a notice placed by the copyright holder saying it
+may be distributed under the terms of this General Public
+License. The "Program", below, refers to any such program or
+work, and a "work based on the Program" means either the
+Program or any derivative work under copyright law: that is
+to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into
+another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each
+licensee is addressed as "you".
+
+Activities other than copying, distribution and modification
+are not covered by this License; they are outside its scope.
+The act of running the Program is not restricted, and the
+output from the Program is covered only if its contents
+constitute a work based on the Program (independent of
+having been made by running the Program). Whether that is
+true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the
+Program's source code as you receive it, in any medium,
+provided that you conspicuously and appropriately publish on
+each copy an appropriate copyright notice and disclaimer of
+warranty; keep intact all the notices that refer to this
+License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this License along
+with the Program.
+
+You may charge a fee for the physical act of transferring a
+copy, and you may at your option offer warranty protection
+in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any
+portion of it, thus forming a work based on the Program, and
+copy and distribute such modifications or work under the
+terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+a) You must cause the modified files to carry prominent
+notices stating that you changed the files and the date of
+any change.
+
+b) You must cause any work that you distribute or publish,
+that in whole or in part contains or is derived from the
+Program or any part thereof, to be licensed as a whole at no
+charge to all third parties under the terms of this License.
+
+c) If the modified program normally reads commands
+interactively when run, you must cause it, when started
+running for such interactive use in the most ordinary way,
+to print or display an announcement including an appropriate
+copyright notice and a notice that there is no warranty (or
+else, saying that you provide a warranty) and that users may
+redistribute the program under these conditions, and telling
+the user how to view a copy of this License. (Exception: if
+the Program itself is interactive but does not normally
+print such an announcement, your work based on the Program
+is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the
+Program, and can be reasonably considered independent and
+separate works in themselves, then this License, and its
+terms, do not apply to those sections when you distribute
+them as separate works. But when you distribute the same
+sections as part of a whole which is a work based on the
+Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees
+extend to the entire whole, and thus to each and every part
+regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights
+or contest your rights to work written entirely by you;
+rather, the intent is to exercise the right to control the
+distribution of derivative or collective works based on the
+Program. In addition, mere aggregation of another work not
+based on the Program with the Program (or with a work based
+on the Program) on a volume of a storage or distribution
+medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based
+on it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you
+also do one of the following:
+
+a) Accompany it with the complete corresponding
+machine-readable source code, which must be distributed
+under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least
+three years, to give any third party, for a charge no more
+than your cost of physically performing source distribution,
+a complete machine-readable copy of the corresponding source
+code, to be distributed under the terms of Sections 1 and 2
+above on a medium customarily used for software interchange;
+or,
+
+c) Accompany it with the information you received as to the
+offer to distribute corresponding source code. (This
+alternative is allowed only for noncommercial distribution
+and only if you received the program in object code or
+executable form with such an offer, in accord with
+Subsection b above.)
+
+The source code for a work means the preferred form of the
+work for making modifications to it. For an executable work,
+complete source code means all the source code for all
+modules it contains, plus any associated interface
+definition files, plus the scripts used to control
+compilation and installation of the executable. However, as
+a special exception, the source code distributed need not
+include anything that is normally distributed (in either
+source or binary form) with the major components (compiler,
+kernel, and so on) of the operating system on which the
+executable runs, unless that component itself accompanies
+the executable. If distribution of executable or object code
+is made by offering access to copy from a designated place,
+then offering equivalent access to copy the source code from
+the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the
+source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the
+Program except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense or distribute
+the Program is void, and will automatically terminate your
+rights under this License. However, parties who have
+received copies, or rights, from you under this License will
+not have their licenses terminated so long as such parties
+remain in full compliance.
+
+5. You are not required to accept this License, since you
+have not signed it. However, nothing else grants you
+permission to modify or distribute the Program or its
+derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or
+distributing the Program (or any work based on the Program),
+you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or
+modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based
+on the Program), the recipient automatically receives a
+license from the original licensor to copy, distribute or
+modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein. You are
+not responsible for enforcing compliance by third parties to
+this License.
+
+7. If, as a consequence of a court judgment or allegation of
+patent infringement or for any other reason (not limited to
+patent issues), conditions are imposed on you (whether by
+court order, agreement or otherwise) that contradict the
+conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as
+to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a
+consequence you may not distribute the Program at all. For
+example, if a patent license would not permit royalty-free
+redistribution of the Program by all those who receive
+copies directly or indirectly through you, then the only way
+you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or
+unenforceable under any particular circumstance, the balance
+of the section is intended to apply and the section as a
+whole is intended to apply in other circumstances. It is not
+the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest
+validity of any such claims; this section has the sole
+purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license
+practices. Many people have made generous contributions to
+the wide range of software distributed through that system
+in reliance on consistent application of that system; it is
+up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee
+cannot impose that choice.
+
+This section is intended to make thoroughly clear what is
+believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is
+restricted in certain countries either by patents or by
+copyrighted interfaces, the original copyright holder who
+places the Program under this License may add an explicit
+geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or
+among countries not thus excluded. In such case, this
+License incorporates the limitation as if written in the
+body of this License.
+
+9. The Free Software Foundation may publish revised and/or
+new versions of the General Public License from time to
+time. Such new versions will be similar in spirit to the
+present version, but may differ in detail to address new
+problems or concerns.
+
+Each version is given a distinguishing version number. If
+the Program specifies a version number of this License which
+applies to it and "any later version", you have the option
+of following the terms and conditions either of that version
+or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number
+of this License, you may choose any version ever published
+by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into
+other free programs whose distribution conditions are
+different, write to the author to ask for permission. For
+software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be
+guided by the two goals of preserving the free status of all
+derivatives of our free software and of promoting the
+sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS
+NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
+"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
+IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
+OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED
+TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY
+WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
+ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF
+THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
+LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the
+greatest possible use to the public, the best way to achieve
+this is to make it free software which everyone can
+redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is
+safest to attach them to the start of each source file to
+most effectively convey the exclusion of warranty; and each
+file should have at least the "copyright" line and a pointer
+to where the full notice is found.
+
+One line to give the program's name and a brief idea of what
+it does.
+
+Copyright (C) <year> <name of author>
+This program is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later
+version. This program is distributed in the hope that it
+will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for
+more details. You should have received a copy of the GNU
+General Public License along with this program; if not,
+write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and
+paper mail. If the program is interactive, make it output a
+short notice like this when it starts in an interactive
+mode:
+
+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome to
+redistribute it under certain conditions; type `show c' for
+details. The hypothetical commands `show w' and `show c'
+should show the appropriate parts of the General Public
+License. Of course, the commands you use may be called
+something other than `show w' and `show c'; they could even
+be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a
+programmer) or your school, if any, to sign a "copyright
+disclaimer" for the program, if necessary. Here is a sample;
+alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+This General Public License does not permit incorporating
+your program into proprietary programs. If your program is a
+subroutine library, you may consider it more useful to
+permit linking proprietary applications with the library. If
+this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc. 
+are subject to  the following clarification and special
+exception to the GPL Version 2, but only where Sun has
+expressly included in the particular source file's header
+the words  "Sun designates this particular file as subject
+to the "Classpath" exception as provided by Sun in the
+License file that accompanied this code." 
+
+   Linking this library statically or dynamically with other
+modules is making a combined work based on this library. 
+Thus, the terms and conditions of the GNU General Public
+License Version 2 cover the whole combination. 
+
+  As a special exception, the copyright holders of this
+library give you  permission to link this library with
+independent modules to produce an  executable, regardless of
+the license terms of these independent modules,  and to copy
+and distribute the resulting executable under terms of your 
+choice, provided that you also meet, for each linked
+independent module,  the terms and conditions of the license
+of that module.  An independent  module is a module which is
+not derived from or based on this library.  If  you modify
+this library, you may extend this exception to your version
+of  the library, but you are not obligated to do so.  If you
+do not wish to do so, delete this exception statement from
+your version.
+============================================================
+Notices for file(s):
+/bin/adb
+------------------------------------------------------------
+
+   Copyright (c) 2006-2009, The Android Open Source Project
+   Copyright 2006, Brian Swetland <swetland@frotz.net>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+============================================================
+Notices for file(s):
+/framework/apache-xml-hostdex.jar
+------------------------------------------------------------
+   =========================================================================
+   ==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
+   ==  Version 2.0, in this case for the Apache Xalan Java distribution.  ==
+   =========================================================================
+
+   Apache Xalan (Xalan XSLT processor)
+   Copyright 1999-2006 The Apache Software Foundation
+
+   Apache Xalan (Xalan serializer)
+   Copyright 1999-2006 The Apache Software Foundation
+
+   This product includes software developed at
+   The Apache Software Foundation (http://www.apache.org/).
+
+   =========================================================================
+   Portions of this software was originally based on the following:
+     - software copyright (c) 1999-2002, Lotus Development Corporation.,
+       http://www.lotus.com.
+     - software copyright (c) 2001-2002, Sun Microsystems.,
+       http://www.sun.com.
+     - software copyright (c) 2003, IBM Corporation., 
+       http://www.ibm.com.
+       
+   =========================================================================
+   The binary distribution package (ie. jars, samples and documentation) of
+   this product includes software developed by the following:
+       
+     - The Apache Software Foundation 
+         - Xerces Java - see LICENSE.txt 
+         - JAXP 1.3 APIs - see LICENSE.txt
+         - Bytecode Engineering Library - see LICENSE.txt
+         - Regular Expression - see LICENSE.txt
+       
+     - Scott Hudson, Frank Flannery, C. Scott Ananian 
+         - CUP Parser Generator runtime (javacup\runtime) - see LICENSE.txt 
+ 
+   ========================================================================= 
+   The source distribution package (ie. all source and tools required to build
+   Xalan Java) of this product includes software developed by the following:
+       
+     - The Apache Software Foundation
+         - Xerces Java - see LICENSE.txt 
+         - JAXP 1.3 APIs - see LICENSE.txt
+         - Bytecode Engineering Library - see LICENSE.txt
+         - Regular Expression - see LICENSE.txt
+         - Ant - see LICENSE.txt
+         - Stylebook doc tool - see LICENSE.txt    
+       
+     - Elliot Joel Berk and C. Scott Ananian 
+         - Lexical Analyzer Generator (JLex) - see LICENSE.txt
+
+   =========================================================================       
+   Apache Xerces Java
+   Copyright 1999-2006 The Apache Software Foundation
+
+   This product includes software developed at
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Portions of Apache Xerces Java in xercesImpl.jar and xml-apis.jar
+   were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+     - voluntary contributions made by Paul Eng on behalf of the 
+       Apache Software Foundation that were originally developed at iClick, Inc.,
+       software copyright (c) 1999.    
+
+   =========================================================================   
+   Apache xml-commons xml-apis (redistribution of xml-apis.jar)
+
+   Apache XML Commons
+   Copyright 2001-2003,2006 The Apache Software Foundation.
+
+   This product includes software developed at
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Portions of this software were originally based on the following:
+     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
+     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
+     - software copyright (c) 2000 World Wide Web Consortium, http://www.w3.org
+
+
+============================================================
+Notices for file(s):
+/bin/llvm-rs-cc
+/bin/rs-spec-gen
+/lib/libslang.a
+------------------------------------------------------------
+=========================
+NOTICE file for slang.git
+=========================
+
+   Copyright (c) 2005-2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+
+===========================================
+NOTICE file for external/clang (clang.git).
+Note: libclang*.a are statically linked.
+===========================================
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+<none yet>
+
+
+
+=========================================
+NOTICE file for external/llvm (llvm.git).
+Note: libLLVM*.a are statically linked.
+=========================================
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+Autoconf            llvm/autoconf
+                    llvm/projects/ModuleMaker/autoconf
+                    llvm/projects/sample/autoconf
+CellSPU backend     llvm/lib/Target/CellSPU/README.txt
+Google Test         llvm/utils/unittest/googletest
+OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+============================================================
+Notices for file(s):
+/bin/minigzip
+/lib/libunz.a
+/lib/libz-host.so
+/lib/libz.a
+------------------------------------------------------------
+ (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
+
+============================================================
+Notices for file(s):
+/bin/mksnapshot.arm
+------------------------------------------------------------
+Copyright (c) 1994-2006 Sun Microsystems Inc.
+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.
+
+- Redistribution 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 Sun Microsystems or the names of contributors may
+be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The original source code covered by the above license above has been
+modified significantly by Google Inc.
+Copyright 2006-2008 the V8 project authors. All rights reserved.
+
+============================================================
+Notices for file(s):
+/lib/libpng.a
+------------------------------------------------------------
+
+This copy of the libpng notices is provided for your convenience.  In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.2.46, July 9, 2011, are
+Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+   Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+   Simon-Pierre Cadieux
+   Eric S. Raymond
+   Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+   There is no warranty against interference with your enjoyment of the
+   library or against infringement.  There is no warranty that our
+   efforts or the library will fulfill any of your particular purposes
+   or needs.  This library is provided with all faults, and the entire
+   risk of satisfactory quality, performance, accuracy, and effort is with
+   the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+   Tom Lane
+   Glenn Randers-Pehrson
+   Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+   John Bowler
+   Kevin Bracey
+   Sam Bushell
+   Magnus Holmgren
+   Greg Roelofs
+   Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+   Andreas Dilger
+   Dave Martindale
+   Guy Eric Schalnat
+   Paul Schmidt
+   Tim Wegner
+
+The PNG Reference Library is supplied "AS IS".  The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose.  The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+   be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+   source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products.  If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+   printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+July 9, 2011
+
+============================================================
+Notices for file(s):
+/framework/antlr-runtime.jar
+------------------------------------------------------------
+[The "BSD license"]
+Copyright (c) 201 Terence Parr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR 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.
+
+============================================================
+Notices for file(s):
+/framework/junit.jar
+------------------------------------------------------------
+Common Public License - v 1.0
+
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i)	 changes to the Program, and
+ii)	 additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+
+2. GRANT OF RIGHTS
+
+a)	Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a)	it complies with the terms and conditions of this Agreement; and
+b)	its license agreement:
+i)	effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii)	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a)	it must be made available under this Agreement; and
+b)	a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
+
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+============================================================
+Notices for file(s):
+/framework/ant-glob.jar
+------------------------------------------------------------
+/*
+ *                                 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.
+ */
+
+W3C® SOFTWARE NOTICE AND LICENSE
+http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license. By obtaining, using and/or copying this work, you (the licensee) agree
+that you have read, understood, and will comply with the following terms and
+conditions.
+
+Permission to copy, modify, and distribute this software and its documentation,
+with or without modification, for any purpose and without fee or royalty is
+hereby granted, provided that you include the following on ALL copies of the
+software and documentation or portions thereof, including modifications:
+
+  1. The full text of this NOTICE in a location viewable to users of the
+     redistributed or derivative work. 
+  2. Any pre-existing intellectual property disclaimers, notices, or terms
+     and conditions. If none exist, the W3C Software Short Notice should be
+     included (hypertext is preferred, text is permitted) within the body
+     of any redistributed or derivative code.
+  3. Notice of any changes or modifications to the files, including the date
+     changes were made. (We recommend you provide URIs to the location from
+     which the code is derived.)
+     
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
+NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
+THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
+PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising or
+publicity pertaining to the software without specific, written prior permission.
+Title to copyright in this software and any associated documentation will at
+all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on December 31 2002.
+This version removes the copyright ownership notice such that this license can
+be used with materials other than those owned by the W3C, reflects that ERCIM
+is now a host of the W3C, includes references to this specific dated version of
+the license, and removes the ambiguous grant of "use". Otherwise, this version
+is the same as the previous version and is written so as to preserve the Free
+Software Foundation's assessment of GPL compatibility and OSI's certification
+under the Open Source Definition. Please see our Copyright FAQ for common
+questions about using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other questions about
+this notice can be directed to site-policy@w3.org.
+ 
+Joseph Reagle <site-policy@w3.org> 
+
+This license came from: http://www.megginson.com/SAX/copying.html
+  However please note future versions of SAX may be covered 
+  under http://saxproject.org/?selected=pd
+
+SAX2 is Free!
+
+I hereby abandon any property rights to SAX 2.0 (the Simple API for
+XML), and release all of the SAX 2.0 source code, compiled code, and
+documentation contained in this distribution into the Public Domain.
+SAX comes with NO WARRANTY or guarantee of fitness for any
+purpose.
+
+David Megginson, david@megginson.com
+2000-05-05
+
+============================================================
+Notices for file(s):
+/lib/libclang.so
+/lib/libclangAnalysis.a
+------------------------------------------------------------
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+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
+CONTRIBUTORS 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 WITH THE
+SOFTWARE.
+
+==============================================================================
+The LLVM software contains code written by third parties.  Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program             Directory
+-------             ---------
+<none yet>
+
+============================================================
+Notices for file(s):
+/framework/guavalib.jar
+------------------------------------------------------------
+
+                                 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.
+
+============================================================
+Notices for file(s):
+/core-lambda-stubs.jar
+------------------------------------------------------------
+The GNU General Public License (GPL)
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it.  By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.  This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it.  (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price.  Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights.  These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for
+a fee, you must give the recipients all the rights that you have.  You must
+make sure that they, too, receive or can get the source code.  And you must
+show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software.  If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.  We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License.  The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language.  (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope.  The act of running the Program is
+not restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program).  Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+    a) You must cause the modified files to carry prominent notices stating
+    that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in whole or
+    in part contains or is derived from the Program or any part thereof, to be
+    licensed as a whole at no charge to all third parties under the terms of
+    this License.
+
+    c) If the modified program normally reads commands interactively when run,
+    you must cause it, when started running for such interactive use in the
+    most ordinary way, to print or display an announcement including an
+    appropriate copyright notice and a notice that there is no warranty (or
+    else, saying that you provide a warranty) and that users may redistribute
+    the program under these conditions, and telling the user how to view a copy
+    of this License.  (Exception: if the Program itself is interactive but does
+    not normally print such an announcement, your work based on the Program is
+    not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works.  But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable source
+    code, which must be distributed under the terms of Sections 1 and 2 above
+    on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three years, to
+    give any third party, for a charge no more than your cost of physically
+    performing source distribution, a complete machine-readable copy of the
+    corresponding source code, to be distributed under the terms of Sections 1
+    and 2 above on a medium customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer to
+    distribute corresponding source code.  (This alternative is allowed only
+    for noncommercial distribution and only if you received the program in
+    object code or executable form with such an offer, in accord with
+    Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it.  For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable.  However, as a special exception, the source code
+distributed need not include anything that is normally distributed (in either
+source or binary form) with the major components (compiler, kernel, and so on)
+of the operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source
+code from the same place counts as distribution of the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License.  Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License.  However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works.  These actions are prohibited by law if you do not
+accept this License.  Therefore, by modifying or distributing the Program (or
+any work based on the Program), you indicate your acceptance of this License to
+do so, and all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein.  You are not responsible for enforcing compliance by
+third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues), conditions
+are imposed on you (whether by court order, agreement or otherwise) that
+contradict the conditions of this License, they do not excuse you from the
+conditions of this License.  If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices.  Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded.  In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time.  Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software Foundation.
+If the Program does not specify a version number of this License, you may
+choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission.  For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
+OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+    One line to give the program's name and a brief idea of what it does.
+
+    Copyright (C) <year> <name of author>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+    more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc., 59
+    Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+    with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+    software, and you are welcome to redistribute it under certain conditions;
+    type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.  Here
+is a sample; alter the names:
+
+    Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+    'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+    signature of Ty Coon, 1 April 1989
+
+    Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General Public
+License instead of this License.
+
+
+"CLASSPATH" EXCEPTION TO THE GPL
+
+Certain source files distributed by Oracle America and/or its affiliates are
+subject to the following clarification and special exception to the GPL, but
+only where Oracle has expressly included in the particular source file's header
+the words "Oracle designates this particular file as subject to the "Classpath"
+exception as provided by Oracle in the LICENSE file that accompanied this code."
+
+    Linking this library statically or dynamically with other modules is making
+    a combined work based on this library.  Thus, the terms and conditions of
+    the GNU General Public License cover the whole combination.
+
+    As a special exception, the copyright holders of this library give you
+    permission to link this library with independent modules to produce an
+    executable, regardless of the license terms of these independent modules,
+    and to copy and distribute the resulting executable under terms of your
+    choice, provided that you also meet, for each linked independent module,
+    the terms and conditions of the license of that module.  An independent
+    module is a module which is not derived from or based on this library.  If
+    you modify this library, you may extend this exception to your version of
+    the library, but you are not obligated to do so.  If you do not wish to do
+    so, delete this exception statement from your version.
+
+============================================================
+Notices for file(s):
+/lib/d8.jar
+------------------------------------------------------------
+This file lists all licenses for code distributed.
+All non-library code has the following 3-Clause BSD license.
+
+
+Copyright (c) 2016, the R8 project authors.
+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 Google Inc. nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Summary of distributed libraries:
+
+- artifact: com.google.guava:guava:+
+  name: Guava Google Core Libraries for Java
+  copyrightHolder: The Guava Authors
+  license: The Apache Software License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
+- artifact: com.google.code.gson:gson:+
+  name: Gson
+  license: The Apache Software License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
+  url: https://github.com/google/gson
+- artifact: it.unimi.dsi:fastutil:+
+  name: fastutil
+  license: Apache License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.html
+  url: http://fasutil.di.unimi.it/
+- artifact: net.sf.jopt-simple:jopt-simple:+
+  name: JOpt Simple
+  license: The MIT License
+  licenseUrl: http://www.opensource.org/licenses/mit-license.php
+  url: http://pholser.github.com/jopt-simple
+- artifact: org.ow2.asm:asm-commons:+
+  name: ASM Commons
+  copyrightHolder: INRIA, France Telecom
+  license: ASM license
+  licenseUrl: http://asm.ow2.org/license.html
+  url: http://asm.ow2.org/index.html
+- artifact: org.ow2.asm:asm-tree:+
+  name: ASM Tree
+  copyrightHolder: INRIA, France Telecom
+  license: ASM license
+  licenseUrl: http://asm.ow2.org/license.html
+  url: http://asm.ow2.org/index.html
+- artifact: org.ow2.asm:asm-util:+
+  name: ASM Util
+  copyrightHolder: INRIA, France Telecom
+  license: ASM license
+  licenseUrl: http://asm.ow2.org/license.html
+  url: http://asm.ow2.org/index.html
+- artifact: org.ow2.asm:asm-analysis:+
+  name: ASM Util
+  copyrightHolder: INRIA, France Telecom
+  license: ASM license
+  licenseUrl: http://asm.ow2.org/license.html
+  url: http://asm.ow2.org/index.html
+- artifact: org.ow2.asm:asm:+
+  name: ASM Core
+  copyrightHolder: INRIA, France Telecom
+  license: ASM license
+  licenseUrl: http://asm.ow2.org/license.html
+  url: http://asm.ow2.org/index.html
+- artifact: org.jetbrains.kotlin:kotlin-stdlib:+
+  name: org.jetbrains.kotlin:kotlin-stdlib
+  copyrightHolder: JetBrains s.r.o.
+  license: The Apache License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
+  url: https://kotlinlang.org/
+- artifact: org.jetbrains.kotlin:kotlin-stdlib-common:+
+  name: org.jetbrains.kotlin:kotlin-stdlib
+  copyrightHolder: JetBrains s.r.o.
+  license: The Apache License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
+  url: https://kotlinlang.org/
+- artifact: org.jetbrains.kotlinx:kotlinx-metadata-jvm:+
+  name: org.jetbrains.kotlinx:kotlinx-metadata-jvm
+  copyrightHolder: JetBrains s.r.o.
+  license: The Apache License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
+  url: https://kotlinlang.org/
+- artifact: org.jetbrains:annotations:+
+  name: IntelliJ IDEA Annotations
+  copyrightHolder: JetBrains s.r.o.
+  license: The Apache Software License, Version 2.0
+  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
+  url: http://www.jetbrains.org
+
+
+Licenses details:
+
+
+
+                                 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.
+
+
+Copyright (c) 2000-2011 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+Apache Commons Compress
+Copyright 2002-2016 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The files in the package org.apache.commons.compress.archivers.sevenz
+were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
+which has been placed in the public domain:
+
+"LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html)
+
+
+ The MIT License
+
+ Copyright (c) 2004-2016 Paul R. Holser, Jr.
+
+ 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.
+
+==============================================================================
+Copyright 2008 Google Inc.  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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it.  This code is not
+standalone and requires a support library to be linked with it.  This
+support library is itself covered by the above license.
+
+==============================================================================
+This library (libselinux) is public domain software, i.e. not copyrighted.
+
+Warranty Exclusion
+------------------
+You agree that this software is a
+non-commercially developed program that may contain "bugs" (as that
+term is used in the industry) and that it may not function as intended.
+The software is licensed "as is". NSA makes no, and hereby expressly
+disclaims all, warranties, express, implied, statutory, or otherwise
+with respect to the software, including noninfringement and the implied
+warranties of merchantability and fitness for a particular purpose.
+
+Limitation of Liability
+-----------------------
+In no event will NSA be liable for any damages, including loss of data,
+lost profits, cost of cover, or other special, incidental,
+consequential, direct or indirect damages arising from the software or
+the use thereof, however caused and on any theory of liability. This
+limitation will apply even if NSA has been advised of the possibility
+of such damage. You acknowledge that this is a reasonable allocation of
+risk.
+
+==============================================================================
+2001 September 15
+
+The author disclaims copyright to this source code.  In place of
+a legal notice, here is a blessing:
+
+   May you do good and not evil.
+   May you find forgiveness for yourself and forgive others.
+   May you share freely, never taking more than you give.
+
+
+==============================================================================
+
+   Copyright (c) 2010, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+==============================================================================
+
+   Copyright (c) 2005-2019, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+==============================================================================
+
+                                 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.
+
+Copyright 2010 The Chromium Authors. 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 Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+
+   Copyright (c) 2005-2014, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 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
+
+
+==============================================================================
+version 1.2.11, January 15th, 2017
+
+Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+   claim that you wrote the original software. If you use this software
+   in a product, an acknowledgment in the product documentation would be
+   appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+   misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+==============================================================================
+BSD License
+
+For Zstandard software
+
+Copyright (c) 2016-present, Facebook, Inc. 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 Facebook nor the names of its contributors may be used to
+   endorse or promote products derived from this software without specific
+   prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==============================================================================
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/adb b/adb
index f7731d3..c67e1db 100755
--- a/adb
+++ b/adb
Binary files differ
diff --git a/dmtracedump b/dmtracedump
index a959ea3..e4bce5c 100755
--- a/dmtracedump
+++ b/dmtracedump
Binary files differ
diff --git a/e2fsdroid b/e2fsdroid
index 8d6de30..8d9488c 100755
--- a/e2fsdroid
+++ b/e2fsdroid
Binary files differ
diff --git a/etc1tool b/etc1tool
index b7ced82..89b9d0e 100755
--- a/etc1tool
+++ b/etc1tool
Binary files differ
diff --git a/fastboot b/fastboot
index 6cba0e8..1b5f7b2 100755
--- a/fastboot
+++ b/fastboot
Binary files differ
diff --git a/hprof-conv b/hprof-conv
index ca15cee..57f4db1 100755
--- a/hprof-conv
+++ b/hprof-conv
Binary files differ
diff --git a/lib64/libc++.dylib b/lib64/libc++.dylib
index 9f9d86d..4dff99f 100755
--- a/lib64/libc++.dylib
+++ b/lib64/libc++.dylib
Binary files differ
diff --git a/make_f2fs b/make_f2fs
index 13fe795..5be1848 100755
--- a/make_f2fs
+++ b/make_f2fs
Binary files differ
diff --git a/make_f2fs_casefold b/make_f2fs_casefold
index 2bf7fd8..0ac5171 100755
--- a/make_f2fs_casefold
+++ b/make_f2fs_casefold
Binary files differ
diff --git a/mke2fs b/mke2fs
index bfc691f..5073157 100755
--- a/mke2fs
+++ b/mke2fs
Binary files differ
diff --git a/mke2fs.conf b/mke2fs.conf
old mode 100755
new mode 100644
diff --git a/sload_f2fs b/sload_f2fs
index acbb4d2..de862c6 100755
--- a/sload_f2fs
+++ b/sload_f2fs
Binary files differ
diff --git a/source.properties b/source.properties
index d1a776d..efb7d7b 100644
--- a/source.properties
+++ b/source.properties
@@ -1,2 +1,2 @@
 Pkg.UserSrc=false
-Pkg.Revision=32.0.0
\ No newline at end of file
+Pkg.Revision=33.0.1
\ No newline at end of file
diff --git a/sqlite3 b/sqlite3
index d6eab65..48331e9 100755
--- a/sqlite3
+++ b/sqlite3
Binary files differ
diff --git a/systrace/NOTICE b/systrace/NOTICE
deleted file mode 100644
index 624b6da..0000000
--- a/systrace/NOTICE
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-                                 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
diff --git a/systrace/UPSTREAM_REVISION b/systrace/UPSTREAM_REVISION
deleted file mode 100644
index 7988ceb..0000000
--- a/systrace/UPSTREAM_REVISION
+++ /dev/null
@@ -1 +0,0 @@
-ab9d330fe2a32f84b4b5fe141958c0a0a857c5c9
diff --git a/systrace/catapult/common/bin/run_tests b/systrace/catapult/common/bin/run_tests
deleted file mode 100755
index 632cdbf..0000000
--- a/systrace/catapult/common/bin/run_tests
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..'))
-_TESTS = [
-    {'path': os.path.join(
-        _CATAPULT_PATH, 'common', 'eslint', 'bin', 'run_tests')},
-    {'path': os.path.join(
-        _CATAPULT_PATH, 'common', 'py_trace_event', 'bin', 'run_tests')},
-    {'path': os.path.join(
-        _CATAPULT_PATH, 'common', 'py_utils', 'bin', 'run_tests')},
-    {'path': os.path.join(
-        _CATAPULT_PATH, 'common', 'py_vulcanize', 'bin', 'run_py_tests')},
-]
-
-
-if __name__ == '__main__':
-  sys.path.append(_CATAPULT_PATH)
-  from catapult_build import test_runner
-  sys.exit(test_runner.Main('project', _TESTS, sys.argv))
-
diff --git a/systrace/catapult/common/bin/update_chrome_reference_binaries b/systrace/catapult/common/bin/update_chrome_reference_binaries
deleted file mode 100755
index e148c74..0000000
--- a/systrace/catapult/common/bin/update_chrome_reference_binaries
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Updates the Chrome reference builds.
-
-Usage:
-  $ /path/to/update_reference_build.py
-  $ git commit -a
-  $ git cl upload
-"""
-
-import collections
-import logging
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-import urllib2
-import zipfile
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'py_utils'))
-
-from py_utils import cloud_storage
-from dependency_manager import base_config
-
-
-def BuildNotFoundError(error_string):
-  raise ValueError(error_string)
-
-
-_CHROME_BINARIES_CONFIG = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), '..', '..', 'common',
-    'py_utils', 'py_utils', 'chrome_binaries.json')
-
-CHROME_GS_BUCKET = 'chrome-unsigned'
-
-
-# Remove a platform name from this list to disable updating it.
-# Add one to enable updating it. (Must also update _PLATFORM_MAP.)
-_PLATFORMS_TO_UPDATE = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64',
-                        'android_k_armeabi-v7a', 'android_l_arm64-v8a',
-                        'android_l_armeabi-v7a', 'android_n_armeabi-v7a',
-                        'android_n_arm64-v8a']
-
-# Remove a channel name from this list to disable updating it.
-# Add one to enable updating it.
-_CHANNELS_TO_UPDATE = ['stable', 'canary', 'dev']
-
-
-# Omaha is Chrome's autoupdate server. It reports the current versions used
-# by each platform on each channel.
-_OMAHA_PLATFORMS = { 'stable':  ['mac', 'linux', 'win', 'android'],
-                    'dev':  ['linux'], 'canary': ['mac', 'win']}
-
-
-# All of the information we need to update each platform.
-#   omaha: name omaha uses for the platforms.
-#   zip_name: name of the zip file to be retrieved from cloud storage.
-#   gs_build: name of the Chrome build platform used in cloud storage.
-#   destination: Name of the folder to download the reference build to.
-UpdateInfo = collections.namedtuple('UpdateInfo',
-    'omaha, gs_folder, gs_build, zip_name')
-_PLATFORM_MAP = {'mac_x86_64': UpdateInfo(omaha='mac',
-                                          gs_folder='desktop-*',
-                                          gs_build='mac64',
-                                          zip_name='chrome-mac.zip'),
-                 'win_x86': UpdateInfo(omaha='win',
-                                       gs_folder='desktop-*',
-                                       gs_build='win-clang',
-                                       zip_name='chrome-win-clang.zip'),
-                 'win_AMD64': UpdateInfo(omaha='win',
-                                         gs_folder='desktop-*',
-                                         gs_build='win64-clang',
-                                         zip_name='chrome-win64-clang.zip'),
-                 'linux_x86_64': UpdateInfo(omaha='linux',
-                                            gs_folder='desktop-*',
-                                            gs_build='linux64',
-                                            zip_name='chrome-linux64.zip'),
-                 'android_k_armeabi-v7a': UpdateInfo(omaha='android',
-                                                     gs_folder='android-*',
-                                                     gs_build='arm',
-                                                     zip_name='Chrome.apk'),
-                 'android_l_arm64-v8a': UpdateInfo(omaha='android',
-                                                   gs_folder='android-*',
-                                                   gs_build='arm_64',
-                                                   zip_name='ChromeModern.apk'),
-                 'android_l_armeabi-v7a': UpdateInfo(omaha='android',
-                                                     gs_folder='android-*',
-                                                     gs_build='arm',
-                                                     zip_name='Chrome.apk'),
-                 'android_n_armeabi-v7a': UpdateInfo(omaha='android',
-                                                     gs_folder='android-*',
-                                                     gs_build='arm',
-                                                     zip_name='Monochrome.apk'),
-                 'android_n_arm64-v8a': UpdateInfo(omaha='android',
-                                                   gs_folder='android-*',
-                                                   gs_build='arm_64',
-                                                   zip_name='Monochrome.apk'),
-
-}
-
-
-def _ChannelVersionsMap(channel):
-  rows = _OmahaReportVersionInfo(channel)
-  omaha_versions_map = _OmahaVersionsMap(rows, channel)
-  channel_versions_map = {}
-  for platform in _PLATFORMS_TO_UPDATE:
-    omaha_platform = _PLATFORM_MAP[platform].omaha
-    if omaha_platform in omaha_versions_map:
-      channel_versions_map[platform] = omaha_versions_map[omaha_platform]
-  return channel_versions_map
-
-
-def _OmahaReportVersionInfo(channel):
-  url ='https://omahaproxy.appspot.com/all?channel=%s' % channel
-  lines = urllib2.urlopen(url).readlines()
-  return [l.split(',') for l in lines]
-
-
-def _OmahaVersionsMap(rows, channel):
-  platforms = _OMAHA_PLATFORMS.get(channel, [])
-  if (len(rows) < 1 or
-      not rows[0][0:3] == ['os', 'channel', 'current_version']):
-    raise ValueError(
-        'Omaha report is not in the expected form: %s.' % rows)
-  versions_map = {}
-  for row in rows[1:]:
-    if row[1] != channel:
-      raise ValueError(
-          'Omaha report contains a line with the channel %s' % row[1])
-    if row[0] in platforms:
-      versions_map[row[0]] = row[2]
-  logging.warn('versions map: %s' % versions_map)
-  if not all(platform in versions_map for platform in platforms):
-    raise ValueError(
-        'Omaha report did not contain all desired platforms for channel %s' % channel)
-  return versions_map
-
-
-def _QueuePlatformUpdate(platform, version, config, channel):
-  """ platform: the name of the platform for the browser to
-      be downloaded & updated from cloud storage. """
-  platform_info = _PLATFORM_MAP[platform]
-  filename = platform_info.zip_name
-  # remote_path example: desktop-*/30.0.1595.0/precise32/chrome-precise32.zip
-  remote_path = '%s/%s/%s/%s' % (
-      platform_info.gs_folder, version, platform_info.gs_build, filename)
-  if not cloud_storage.Exists(CHROME_GS_BUCKET, remote_path):
-    cloud_storage_path = 'gs://%s/%s' % (CHROME_GS_BUCKET, remote_path)
-    raise BuildNotFoundError(
-        'Failed to find %s build for version %s at path %s.' % (
-            platform, version, cloud_storage_path))
-  reference_builds_folder = os.path.join(
-      os.path.dirname(os.path.abspath(__file__)), 'chrome_telemetry_build',
-      'reference_builds', channel)
-  if not os.path.exists(reference_builds_folder):
-    os.makedirs(reference_builds_folder)
-  local_dest_path = os.path.join(reference_builds_folder, filename)
-  cloud_storage.Get(CHROME_GS_BUCKET, remote_path, local_dest_path)
-  _ModifyBuildIfNeeded(local_dest_path, platform)
-  config.AddCloudStorageDependencyUpdateJob(
-      'chrome_%s' % channel, platform, local_dest_path, version=version,
-      execute_job=False)
-
-
-def _ModifyBuildIfNeeded(location, platform):
-  """Hook to modify the build before saving it for Telemetry to use.
-
-  This can be used to remove various utilities that cause noise in a
-  test environment. Right now, it is just used to remove Keystone,
-  which is a tool used to autoupdate Chrome.
-  """
-  if platform == 'mac_x86_64':
-    _RemoveKeystoneFromBuild(location)
-    return
-
-  if 'mac' in platform:
-    raise NotImplementedError(
-        'Platform <%s> sounds like it is an OSX version. If so, we may need to '
-        'remove Keystone from it per crbug.com/932615. Please edit this script'
-        ' and teach it what needs to be done :).')
-
-
-def _RemoveKeystoneFromBuild(location):
-  """Removes the Keystone autoupdate binary from the chrome mac zipfile."""
-  logging.info('Removing keystone from mac build at %s' % location)
-  temp_folder = tempfile.mkdtemp(prefix='RemoveKeystoneFromBuild')
-  try:
-    subprocess.check_call(['unzip', '-q', location, '-d', temp_folder])
-    keystone_folder = os.path.join(
-        temp_folder, 'chrome-mac', 'Google Chrome.app', 'Contents',
-        'Frameworks', 'Google Chrome Framework.framework', 'Frameworks',
-        'KeystoneRegistration.framework')
-    shutil.rmtree(keystone_folder)
-    os.remove(location)
-    subprocess.check_call(['zip', '--quiet', '--recurse-paths', '--symlinks',
-                           location, 'chrome-mac'],
-                           cwd=temp_folder)
-  finally:
-    shutil.rmtree(temp_folder)
-
-
-def UpdateBuilds():
-  config = base_config.BaseConfig(_CHROME_BINARIES_CONFIG, writable=True)
-  for channel in _CHANNELS_TO_UPDATE:
-    channel_versions_map = _ChannelVersionsMap(channel)
-    for platform in channel_versions_map:
-      print 'Downloading Chrome (%s channel) on %s' % (channel, platform)
-      current_version = config.GetVersion('chrome_%s' % channel, platform)
-      channel_version =  channel_versions_map.get(platform)
-      print 'current: %s, channel: %s' % (current_version, channel_version)
-      if current_version and current_version == channel_version:
-        continue
-      _QueuePlatformUpdate(platform, channel_version, config, channel)
-
-  print 'Updating chrome builds with downloaded binaries'
-  config.ExecuteUpdateJobs(force=True)
-
-
-def main():
-  logging.getLogger().setLevel(logging.DEBUG)
-  UpdateBuilds()
-
-if __name__ == '__main__':
-  main()
diff --git a/systrace/catapult/common/bin/update_chrome_reference_binaries.py b/systrace/catapult/common/bin/update_chrome_reference_binaries.py
deleted file mode 100755
index 86a1d7f..0000000
--- a/systrace/catapult/common/bin/update_chrome_reference_binaries.py
+++ /dev/null
@@ -1,393 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Updates the Chrome reference builds.
-
-Usage:
-  $ /path/to/update_reference_build.py
-  $ git commit -a
-  $ git cl upload
-"""
-
-import argparse
-import collections
-import logging
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-import urllib2
-import zipfile
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'py_utils'))
-
-from py_utils import cloud_storage
-from dependency_manager import base_config
-
-
-_CHROME_BINARIES_CONFIG = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), '..', '..', 'common',
-    'py_utils', 'py_utils', 'chrome_binaries.json')
-
-_CHROME_GS_BUCKET = 'chrome-unsigned'
-_CHROMIUM_GS_BUCKET = 'chromium-browser-snapshots'
-
-# How many commit positions to search below and above omaha branch position to
-# find closest chromium build snapshot. The value 10 is chosen because it looks
-# more than sufficient from manual inspection of the bucket.
-_CHROMIUM_SNAPSHOT_SEARCH_WINDOW = 10
-
-# Remove a platform name from this list to disable updating it.
-# Add one to enable updating it. (Must also update _PLATFORM_MAP.)
-_PLATFORMS_TO_UPDATE = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64',
-                        'android_k_armeabi-v7a', 'android_l_arm64-v8a',
-                        'android_l_armeabi-v7a', 'android_n_armeabi-v7a',
-                        'android_n_arm64-v8a', 'android_n_bundle_armeabi-v7a',
-                        'android_n_bundle_arm64-v8a']
-
-# Add platforms here if you also want to update chromium binary for it.
-# Must add chromium_info for it in _PLATFORM_MAP.
-_CHROMIUM_PLATFORMS = ['mac_x86_64', 'win_x86', 'win_AMD64', 'linux_x86_64']
-
-# Remove a channel name from this list to disable updating it.
-# Add one to enable updating it.
-_CHANNELS_TO_UPDATE = ['stable', 'canary', 'dev']
-
-
-# Omaha is Chrome's autoupdate server. It reports the current versions used
-# by each platform on each channel.
-_OMAHA_PLATFORMS = { 'stable':  ['mac', 'linux', 'win', 'android'],
-                    'dev':  ['linux'], 'canary': ['mac', 'win']}
-
-
-# All of the information we need to update each platform.
-#   omaha: name omaha uses for the platforms.
-#   zip_name: name of the zip file to be retrieved from cloud storage.
-#   gs_build: name of the Chrome build platform used in cloud storage.
-#   chromium_info: information needed to update chromium (optional).
-#   destination: Name of the folder to download the reference build to.
-UpdateInfo = collections.namedtuple('UpdateInfo',
-    'omaha, gs_folder, gs_build, chromium_info, zip_name')
-# build_dir: name of the build directory in _CHROMIUM_GS_BUCKET.
-# zip_name: name of the zip file to be retrieved from cloud storage.
-ChromiumInfo = collections.namedtuple('ChromiumInfo', 'build_dir, zip_name')
-_PLATFORM_MAP = {'mac_x86_64': UpdateInfo(
-                     omaha='mac',
-                     gs_folder='desktop-*',
-                     gs_build='mac64',
-                     chromium_info=ChromiumInfo(
-                         build_dir='Mac',
-                         zip_name='chrome-mac.zip'),
-                     zip_name='chrome-mac.zip'),
-                 'win_x86': UpdateInfo(
-                     omaha='win',
-                     gs_folder='desktop-*',
-                     gs_build='win-clang',
-                     chromium_info=ChromiumInfo(
-                         build_dir='Win',
-                         zip_name='chrome-win.zip'),
-                     zip_name='chrome-win-clang.zip'),
-                 'win_AMD64': UpdateInfo(
-                     omaha='win',
-                     gs_folder='desktop-*',
-                     gs_build='win64-clang',
-                     chromium_info=ChromiumInfo(
-                        build_dir='Win_x64',
-                        zip_name='chrome-win.zip'),
-                     zip_name='chrome-win64-clang.zip'),
-                 'linux_x86_64': UpdateInfo(
-                     omaha='linux',
-                     gs_folder='desktop-*',
-                     gs_build='linux64',
-                     chromium_info=ChromiumInfo(
-                         build_dir='Linux_x64',
-                         zip_name='chrome-linux.zip'),
-                     zip_name='chrome-linux64.zip'),
-                 'android_k_armeabi-v7a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm',
-                     chromium_info=None,
-                     zip_name='Chrome.apk'),
-                 'android_l_arm64-v8a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm_64',
-                     chromium_info=None,
-                     zip_name='ChromeModern.apk'),
-                 'android_l_armeabi-v7a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm',
-                     chromium_info=None,
-                     zip_name='Chrome.apk'),
-                 'android_n_armeabi-v7a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm',
-                     chromium_info=None,
-                     zip_name='Monochrome.apk'),
-                 'android_n_arm64-v8a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm_64',
-                     chromium_info=None,
-                     zip_name='Monochrome.apk'),
-                 'android_n_bundle_armeabi-v7a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm',
-                     chromium_info=None,
-                     zip_name='Monochrome.apks'),
-                 'android_n_bundle_arm64-v8a': UpdateInfo(
-                     omaha='android',
-                     gs_folder='android-*',
-                     gs_build='arm_64',
-                     chromium_info=None,
-                     zip_name='Monochrome.apks')
-
-}
-
-
-VersionInfo = collections.namedtuple('VersionInfo',
-                                     'version, branch_base_position')
-
-
-def _ChannelVersionsMap(channel):
-  rows = _OmahaReportVersionInfo(channel)
-  omaha_versions_map = _OmahaVersionsMap(rows, channel)
-  channel_versions_map = {}
-  for platform in _PLATFORMS_TO_UPDATE:
-    omaha_platform = _PLATFORM_MAP[platform].omaha
-    if omaha_platform in omaha_versions_map:
-      channel_versions_map[platform] = omaha_versions_map[omaha_platform]
-  return channel_versions_map
-
-
-def _OmahaReportVersionInfo(channel):
-  url ='https://omahaproxy.appspot.com/all?channel=%s' % channel
-  lines = urllib2.urlopen(url).readlines()
-  return [l.split(',') for l in lines]
-
-
-def _OmahaVersionsMap(rows, channel):
-  platforms = _OMAHA_PLATFORMS.get(channel, [])
-  if (len(rows) < 1 or
-      rows[0][0:3] != ['os', 'channel', 'current_version'] or
-      rows[0][7] != 'branch_base_position'):
-    raise ValueError(
-        'Omaha report is not in the expected form: %s.' % rows)
-  versions_map = {}
-  for row in rows[1:]:
-    if row[1] != channel:
-      raise ValueError(
-          'Omaha report contains a line with the channel %s' % row[1])
-    if row[0] in platforms:
-      versions_map[row[0]] = VersionInfo(version=row[2],
-                                         branch_base_position=int(row[7]))
-  logging.warn('versions map: %s' % versions_map)
-  if not all(platform in versions_map for platform in platforms):
-    raise ValueError(
-        'Omaha report did not contain all desired platforms '
-        'for channel %s' % channel)
-  return versions_map
-
-
-RemotePath = collections.namedtuple('RemotePath', 'bucket, path')
-
-
-def _ResolveChromeRemotePath(platform_info, version_info):
-  # Path example: desktop-*/30.0.1595.0/precise32/chrome-precise32.zip
-  return RemotePath(bucket=_CHROME_GS_BUCKET,
-                    path=('%s/%s/%s/%s' % (platform_info.gs_folder,
-                                           version_info.version,
-                                           platform_info.gs_build,
-                                           platform_info.zip_name)))
-
-
-def _FindClosestChromiumSnapshot(base_position, build_dir):
-  """Returns the closest chromium snapshot available in cloud storage.
-
-  Chromium snapshots are pulled from _CHROMIUM_BUILD_DIR in CHROMIUM_GS_BUCKET.
-
-  Continuous chromium snapshots do not always contain the exact release build.
-  This function queries the storage bucket and find the closest snapshot within
-  +/-_CHROMIUM_SNAPSHOT_SEARCH_WINDOW to find the closest build.
-  """
-  min_position = base_position - _CHROMIUM_SNAPSHOT_SEARCH_WINDOW
-  max_position = base_position + _CHROMIUM_SNAPSHOT_SEARCH_WINDOW
-
-  # Getting the full list of objects in cloud storage bucket is prohibitively
-  # slow. It's faster to list objects with a prefix. Assuming we're looking at
-  # +/- 10 commit positions, for commit position 123456, we want to look at
-  # positions between 123446 an 123466. We do this by getting all snapshots
-  # with prefix 12344*, 12345*, and 12346*. This may get a few more snapshots
-  # that we intended, but that's fine since we take the min distance anyways.
-  min_position_prefix = min_position / 10;
-  max_position_prefix = max_position / 10;
-
-  available_positions = []
-  for position_prefix in range(min_position_prefix, max_position_prefix + 1):
-    query = '%s/%d*' % (build_dir, position_prefix)
-    try:
-      ls_results = cloud_storage.ListDirs(_CHROMIUM_GS_BUCKET, query)
-    except cloud_storage.NotFoundError:
-      # It's fine if there is no chromium snapshot available for one prefix.
-      # We will look at the rest of the prefixes.
-      continue
-
-    for entry in ls_results:
-      # entry looks like '/Linux_x64/${commit_position}/'.
-      position = int(entry.split('/')[2])
-      available_positions.append(position)
-
-  if len(available_positions) == 0:
-    raise ValueError('No chromium build found +/-%d commit positions of %d' %
-                     (_CHROMIUM_SNAPSHOT_SEARCH_WINDOW, base_position))
-
-  distance_function = lambda position: abs(position - base_position)
-  min_distance_snapshot = min(available_positions, key=distance_function)
-  return min_distance_snapshot
-
-
-def _ResolveChromiumRemotePath(channel, platform, version_info):
-  platform_info = _PLATFORM_MAP[platform]
-  branch_base_position = version_info.branch_base_position
-  omaha_version = version_info.version
-  build_dir = platform_info.chromium_info.build_dir
-  # Look through chromium-browser-snapshots for closest match.
-  closest_snapshot = _FindClosestChromiumSnapshot(
-      branch_base_position, build_dir)
-  if closest_snapshot != branch_base_position:
-    print ('Channel %s corresponds to commit position ' % channel +
-            '%d on %s, ' % (branch_base_position, platform) +
-            'but closest chromium snapshot available on ' +
-            '%s is %d' % (_CHROMIUM_GS_BUCKET, closest_snapshot))
-  return RemotePath(bucket=_CHROMIUM_GS_BUCKET,
-                    path = ('%s/%s/%s' % (build_dir, closest_snapshot,
-                                        platform_info.chromium_info.zip_name)))
-
-
-def _QueuePlatformUpdate(binary, platform, version_info, config, channel):
-  """ platform: the name of the platform for the browser to
-      be downloaded & updated from cloud storage. """
-  platform_info = _PLATFORM_MAP[platform]
-
-  if binary == 'chrome':
-    remote_path = _ResolveChromeRemotePath(platform_info, version_info)
-  elif binary == 'chromium':
-    remote_path = _ResolveChromiumRemotePath(channel, platform, version_info)
-  else:
-    raise ValueError('binary must be \'chrome\' or \'chromium\'')
-
-  if not cloud_storage.Exists(remote_path.bucket, remote_path.path):
-    cloud_storage_path = 'gs://%s/%s' % (remote_path.bucket, remote_path.path)
-    logging.warn('Failed to find %s build for version %s at path %s.' % (
-        platform, version_info.version, cloud_storage_path))
-    logging.warn('Skipping this update for this platform/channel.')
-    return
-
-  reference_builds_folder = os.path.join(
-      os.path.dirname(os.path.abspath(__file__)), 'chrome_telemetry_build',
-      'reference_builds', binary, channel)
-  if not os.path.exists(reference_builds_folder):
-    os.makedirs(reference_builds_folder)
-  local_dest_path = os.path.join(reference_builds_folder,
-                                 platform,
-                                 platform_info.zip_name)
-  cloud_storage.Get(remote_path.bucket, remote_path.path, local_dest_path)
-  _ModifyBuildIfNeeded(binary, local_dest_path, platform)
-  config.AddCloudStorageDependencyUpdateJob('%s_%s' % (binary, channel),
-      platform, local_dest_path, version=version_info.version,
-      execute_job=False)
-
-
-def _ModifyBuildIfNeeded(binary, location, platform):
-  """Hook to modify the build before saving it for Telemetry to use.
-
-  This can be used to remove various utilities that cause noise in a
-  test environment. Right now, it is just used to remove Keystone,
-  which is a tool used to autoupdate Chrome.
-  """
-  if binary != 'chrome':
-    return
-
-  if platform == 'mac_x86_64':
-    _RemoveKeystoneFromBuild(location)
-    return
-
-  if 'mac' in platform:
-    raise NotImplementedError(
-        'Platform <%s> sounds like it is an OSX version. If so, we may need to '
-        'remove Keystone from it per crbug.com/932615. Please edit this script'
-        ' and teach it what needs to be done :).')
-
-
-def _RemoveKeystoneFromBuild(location):
-  """Removes the Keystone autoupdate binary from the chrome mac zipfile."""
-  logging.info('Removing keystone from mac build at %s' % location)
-  temp_folder = tempfile.mkdtemp(prefix='RemoveKeystoneFromBuild')
-  try:
-    subprocess.check_call(['unzip', '-q', location, '-d', temp_folder])
-    keystone_folder = os.path.join(
-        temp_folder, 'chrome-mac', 'Google Chrome.app', 'Contents',
-        'Frameworks', 'Google Chrome Framework.framework', 'Frameworks',
-        'KeystoneRegistration.framework')
-    shutil.rmtree(keystone_folder)
-    os.remove(location)
-    subprocess.check_call(['zip', '--quiet', '--recurse-paths', '--symlinks',
-                           location, 'chrome-mac'],
-                           cwd=temp_folder)
-  finally:
-    shutil.rmtree(temp_folder)
-
-
-def _NeedsUpdate(config, binary, channel, platform, version_info):
-  channel_version = version_info.version
-  print 'Checking %s (%s channel) on %s' % (binary, channel, platform)
-  current_version = config.GetVersion('%s_%s' % (binary, channel), platform)
-  print 'current: %s, channel: %s' % (current_version, channel_version)
-  if current_version and current_version == channel_version:
-    print 'Already up to date.'
-    return False
-  return True
-
-
-def UpdateBuilds(args):
-  config = base_config.BaseConfig(_CHROME_BINARIES_CONFIG, writable=True)
-  for channel in _CHANNELS_TO_UPDATE:
-    channel_versions_map = _ChannelVersionsMap(channel)
-    for platform in channel_versions_map:
-      version_info = channel_versions_map.get(platform)
-      if args.update_chrome:
-        if _NeedsUpdate(config, 'chrome', channel, platform, version_info):
-          _QueuePlatformUpdate('chrome', platform, version_info, config,
-                               channel)
-      if args.update_chromium and platform in _CHROMIUM_PLATFORMS:
-        if _NeedsUpdate(config, 'chromium', channel, platform, version_info):
-          _QueuePlatformUpdate('chromium', platform, version_info,
-                               config, channel)
-
-  print 'Updating builds with downloaded binaries'
-  config.ExecuteUpdateJobs(force=True)
-
-
-def main():
-  logging.getLogger().setLevel(logging.DEBUG)
-  parser = argparse.ArgumentParser(
-      description='Update reference binaries used by perf bots.')
-  parser.add_argument('--no-update-chrome', action='store_false',
-                      dest='update_chrome', default=True,
-                      help='do not update chrome binaries')
-  parser.add_argument('--no-update-chromium', action='store_false',
-                      dest='update_chromium', default=True,
-                      help='do not update chromium binaries')
-  args = parser.parse_args()
-  UpdateBuilds(args)
-
-if __name__ == '__main__':
-  main()
diff --git a/systrace/catapult/common/eslint/LICENSE b/systrace/catapult/common/eslint/LICENSE
deleted file mode 100644
index f943447..0000000
--- a/systrace/catapult/common/eslint/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-ESLint
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-
-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.
\ No newline at end of file
diff --git a/systrace/catapult/common/eslint/README.md b/systrace/catapult/common/eslint/README.md
deleted file mode 100644
index 8ba5b63..0000000
--- a/systrace/catapult/common/eslint/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-This directory contains the Catapult eslint config, custom Catapult eslint rules,
-and tests for those rules.
-
-Some of our custom rules are modified versions of those included with eslint, as
-suggested in https://goo.gl/uAxFHq.
diff --git a/systrace/catapult/common/eslint/bin/run_eslint b/systrace/catapult/common/eslint/bin/run_eslint
deleted file mode 100755
index 933415b..0000000
--- a/systrace/catapult/common/eslint/bin/run_eslint
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import os
-import sys
-
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__),
-                 os.path.pardir, os.path.pardir, os.path.pardir))
-
-
-_ESLINT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.path.pardir))
-
-
-DIRECTORIES_TO_LINT = [
-  os.path.join(_CATAPULT_PATH, 'dashboard', 'dashboard'),
-  os.path.join(_CATAPULT_PATH, 'tracing', 'tracing')
-]
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-if __name__ == '__main__':
-  _AddToPathIfNeeded(_ESLINT_PATH)
-  import eslint
-
-  parser = argparse.ArgumentParser(
-      description='Wrapper script to run eslint on Catapult code')
-  parser.add_argument('--paths', '-p', default=None, nargs='+', metavar='PATH',
-                      help='List of paths to lint')
-  parser.add_argument('--all', default=None, action='store_true',
-                      help='Runs eslint on all applicable Catapult code')
-  parser.add_argument('--extra-args', default=None, type=str,
-                      help='A string of extra arguments to pass to eslint')
-
-  args = parser.parse_args(sys.argv[1:])
-  if ((args.paths is not None and args.all is not None) or
-      (args.paths is None and args.all is None)):
-    print 'Either --paths or --all must be used, but not both.\n'
-    parser.print_help()
-    sys.exit(1)
-
-  paths = DIRECTORIES_TO_LINT if args.all else args.paths
-  success, output = eslint.RunEslint(paths, extra_args=args.extra_args)
-  print output
-  sys.exit(not success)
diff --git a/systrace/catapult/common/eslint/bin/run_tests b/systrace/catapult/common/eslint/bin/run_tests
deleted file mode 100755
index db10679..0000000
--- a/systrace/catapult/common/eslint/bin/run_tests
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__),
-    os.path.pardir, os.path.pardir, os.path.pardir))
-
-
-_ESLINT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.path.pardir))
-
-
-def _RunTestsOrDie(top_level_dir):
-  exit_code = run_with_typ.Run(top_level_dir, path=[_ESLINT_PATH])
-  if exit_code:
-    sys.exit(exit_code)
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-if __name__ == '__main__':
-  _AddToPathIfNeeded(_CATAPULT_PATH)
-
-  from catapult_build import run_with_typ
-
-  _RunTestsOrDie(os.path.join(_ESLINT_PATH, 'eslint'))
diff --git a/systrace/catapult/common/eslint/eslint/__init__.py b/systrace/catapult/common/eslint/eslint/__init__.py
deleted file mode 100644
index 082178a..0000000
--- a/systrace/catapult/common/eslint/eslint/__init__.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import subprocess
-import sys
-
-
-_CATAPULT_PATH = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)),
-    os.path.pardir, os.path.pardir, os.path.pardir)
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-def _UpdateSysPathIfNeeded():
-  _AddToPathIfNeeded(os.path.join(_CATAPULT_PATH, 'common', 'node_runner'))
-  _AddToPathIfNeeded(os.path.join(_CATAPULT_PATH, 'common', 'py_utils'))
-
-
-_UpdateSysPathIfNeeded()
-
-
-import py_utils
-from node_runner import node_util
-
-
-BASE_ESLINT_CMD = [
-  node_util.GetNodePath(),
-  os.path.join(node_util.GetNodeModulesPath(), 'eslint', 'bin', 'eslint.js'),
-  '--color'
-]
-
-
-DEFAULT_ESLINT_RULES_DIR = os.path.join(
-    py_utils.GetCatapultDir(), 'common', 'eslint', 'rules')
-
-
-def _CreateEslintCommand(rulesdir, extra_args):
-  eslint_cmd = BASE_ESLINT_CMD + [
-      '--rulesdir', rulesdir, '--ext', '.js,.html'
-  ]
-  if extra_args:
-    eslint_cmd.extend(extra_args.strip().split(' '))
-  return eslint_cmd
-
-
-def RunEslint(paths, rules_dir=DEFAULT_ESLINT_RULES_DIR, extra_args=None):
-  """Runs eslint on a list of paths.
-
-  Args:
-    paths: A list of paths to run eslint on.
-    rules_dir: A directory of custom eslint rules.
-    extra_args: A string to append to the end of the eslint command.
-  """
-  if type(paths) is not list or len(paths) == 0:
-    raise ValueError('Must specify a non-empty list of paths to lint.')
-
-  try:
-    eslint_cmd = _CreateEslintCommand(rules_dir, extra_args)
-    return True, subprocess.check_output(eslint_cmd + paths,
-                                         stderr=subprocess.STDOUT).rstrip()
-  except subprocess.CalledProcessError as e:
-    return False, e.output.rstrip()
diff --git a/systrace/catapult/common/eslint/eslint/smoke_test.py b/systrace/catapult/common/eslint/eslint/smoke_test.py
deleted file mode 100644
index 9a0f442..0000000
--- a/systrace/catapult/common/eslint/eslint/smoke_test.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import eslint
-import os
-import tempfile
-import unittest
-
-
-_TEMP_FILE_CONTENTS = '''<!DOCTYPE html>
-<!--
-Copyright 2016 The Chromium Authors. All rights reserved.
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-<script>
-// This should cause a linter error because we require camelCase.
-var non_camel_case = 0;
-</script>
-'''
-
-
-class SmokeTest(unittest.TestCase):
-  def testEslintFindsError(self):
-    try:
-      tmp_file =  tempfile.NamedTemporaryFile(
-          delete=False, dir=os.path.dirname(__file__), suffix=".html")
-      tmp_file.write(_TEMP_FILE_CONTENTS)
-      tmp_file.close()
-
-      success, output = eslint.RunEslint([tmp_file.name])
-      self.assertFalse(success)
-      self.assertTrue('is not in camel case' in output)
-    finally:
-      os.remove(tmp_file.name)
diff --git a/systrace/catapult/common/eslint/rules/catapult-camelcase.js b/systrace/catapult/common/eslint/rules/catapult-camelcase.js
deleted file mode 100644
index bf31052..0000000
--- a/systrace/catapult/common/eslint/rules/catapult-camelcase.js
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-/* eslint-disable */
-
-/**
- * @fileoverview Rule to flag non-camelcased identifiers
- * @author Nicholas C. Zakas
- */
-
-'use strict';
-
-//------------------------------------------------------------------------------
-// Rule Definition
-//------------------------------------------------------------------------------
-
-module.exports = {
-    meta: {
-        docs: {
-            description: "enforce Catapult camelcase naming convention",
-            category: "Stylistic Issues",
-            recommended: false
-        },
-
-        schema: [
-            {
-                type: "object",
-                properties: {
-                    properties: {
-                        enum: ["always", "never"]
-                    }
-                },
-                additionalProperties: false
-            }
-        ]
-    },
-
-    create(context) {
-
-        //--------------------------------------------------------------------------
-        // Helpers
-        //--------------------------------------------------------------------------
-
-        // contains reported nodes to avoid reporting twice on destructuring with shorthand notation
-        var reported = [];
-
-        /**
-         * Checks if a string contains an underscore and isn't all upper-case
-         * @param {string} name The string to check.
-         * @returns {boolean} if the string is underscored
-         * @private
-         */
-        function isUnderscored(name) {
-
-            // if there's an underscore, it might be A_VARANT, which is okay
-            return name.indexOf("_") > -1 && name !== name.toUpperCase();
-        }
-
-        /**
-         * Reports an AST node as a rule violation.
-         * @param {ASTNode} node The node to report.
-         * @returns {void}
-         * @private
-         */
-        function report(node) {
-            if (reported.indexOf(node) < 0) {
-                reported.push(node);
-                context.report(node, "Identifier '{{name}}' is not in camel case.", { name: node.name });
-            }
-        }
-
-        var options = context.options[0] || {};
-        let properties = options.properties || "";
-
-        if (properties !== "always" && properties !== "never") {
-            properties = "always";
-        }
-
-        return {
-
-            Identifier(node) {
-
-                /*
-                 * Leading and trailing underscores are commonly used to flag
-                 * private/protected identifiers, strip them.
-                 *
-                 * NOTE: This has four Catapult-specific style exceptions:
-                 *
-                 *   - The prefix opt_
-                 *   - The prefix g_
-                 *   - The suffix _smallerIsBetter
-                 *   - The suffix _biggerIsBetter
-                 */
-                var name = node.name.replace(/(?:^opt_)|^(?:^g_)|^_+|_+$|(?:_smallerIsBetter)$|(?:_biggerIsBetter)$/g, ""),
-                    effectiveParent = (node.parent.type === "MemberExpression") ? node.parent.parent : node.parent;
-
-                // MemberExpressions get special rules
-                if (node.parent.type === "MemberExpression") {
-
-                    // "never" check properties
-                    if (properties === "never") {
-                        return;
-                    }
-
-                    // Always report underscored object names
-                    if (node.parent.object.type === "Identifier" &&
-                            node.parent.object.name === node.name &&
-                            isUnderscored(name)) {
-                        report(node);
-
-                    // Report AssignmentExpressions only if they are the left side of the assignment
-                    } else if (effectiveParent.type === "AssignmentExpression" &&
-                            isUnderscored(name) &&
-                            (effectiveParent.right.type !== "MemberExpression" ||
-                            effectiveParent.left.type === "MemberExpression" &&
-                            effectiveParent.left.property.name === node.name)) {
-                        report(node);
-                    }
-
-                // Properties have their own rules
-                } else if (node.parent.type === "Property") {
-
-                    // "never" check properties
-                    if (properties === "never") {
-                        return;
-                    }
-
-                    if (node.parent.parent && node.parent.parent.type === "ObjectPattern" &&
-                            node.parent.key === node && node.parent.value !== node) {
-                        return;
-                    }
-
-                    if (isUnderscored(name) && effectiveParent.type !== "CallExpression") {
-                        report(node);
-                    }
-
-                // Check if it's an import specifier
-                } else if (["ImportSpecifier", "ImportNamespaceSpecifier", "ImportDefaultSpecifier"].indexOf(node.parent.type) >= 0) {
-
-                    // Report only if the local imported identifier is underscored
-                    if (node.parent.local && node.parent.local.name === node.name && isUnderscored(name)) {
-                        report(node);
-                    }
-
-                // Report anything that is underscored that isn't a CallExpression
-                } else if (isUnderscored(name) && effectiveParent.type !== "CallExpression") {
-                    report(node);
-                }
-            }
-
-        };
-
-    }
-};
diff --git a/systrace/catapult/common/eslint/tests/catapult-camelcase.js b/systrace/catapult/common/eslint/tests/catapult-camelcase.js
deleted file mode 100644
index f0bdb37..0000000
--- a/systrace/catapult/common/eslint/tests/catapult-camelcase.js
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-/* eslint-disable */
-
-/**
- * @fileoverview Tests for camelcase rule.
- * @author Nicholas C. Zakas
- */
-
-'use strict';
-
-//------------------------------------------------------------------------------
-// Requirements
-//------------------------------------------------------------------------------
-
-var rule = require("../rules/catapult-camelcase"),
-    RuleTester = require("../../node_runner/node_runner/node_modules/eslint/lib/testers/rule-tester");
-
-//------------------------------------------------------------------------------
-// Tests
-//------------------------------------------------------------------------------
-
-var ruleTester = new RuleTester();
-
-ruleTester.run("camelcase", rule, {
-    valid: [
-        "firstName = \"Nicholas\"",
-        "FIRST_NAME = \"Nicholas\"",
-        "__myPrivateVariable = \"Patrick\"",
-        "myPrivateVariable_ = \"Patrick\"",
-        "function doSomething(){}",
-        "do_something()",
-        "foo.do_something()",
-        "var foo = bar.baz_boom;",
-        "var foo = bar.baz_boom.something;",
-        "foo.boom_pow.qux = bar.baz_boom.something;",
-        "if (bar.baz_boom) {}",
-        "var obj = { key: foo.bar_baz };",
-        "var arr = [foo.bar_baz];",
-        "[foo.bar_baz]",
-        "var arr = [foo.bar_baz.qux];",
-        "[foo.bar_baz.nesting]",
-        "if (foo.bar_baz === boom.bam_pow) { [foo.baz_boom] }",
-        // These tests are for Catapult-specific exceptions.
-        "opt_firstName = \"Nicholas\"",
-        "g_firstName = \"Nicholas\"",
-        "sizeInBytes_smallerIsBetter = \"Nicholas\"",
-        "sizeInBytes_biggerIsBetter = \"Nicholas\"",
-        {
-            code: "var o = {key: 1}",
-            options: [{properties: "always"}]
-        },
-        {
-            code: "var o = {bar_baz: 1}",
-            options: [{properties: "never"}]
-        },
-        {
-            code: "obj.a_b = 2;",
-            options: [{properties: "never"}]
-        },
-        {
-            code: "var obj = {\n a_a: 1 \n};\n obj.a_b = 2;",
-            options: [{properties: "never"}]
-        },
-        {
-            code: "obj.foo_bar = function(){};",
-            options: [{properties: "never"}]
-        },
-        {
-            code: "var { category_id: category } = query;",
-            parserOptions: { ecmaVersion: 6 }
-        },
-        {
-            code: "var { category_id: category } = query;",
-            parserOptions: { ecmaVersion: 6 },
-            options: [{properties: "never"}]
-        },
-        {
-            code: "import { camelCased } from \"external module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" }
-        },
-        {
-            code: "import { no_camelcased as camelCased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" }
-        },
-        {
-            code: "import { no_camelcased as camelCased, anoterCamelCased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" }
-        }
-    ],
-    invalid: [
-        {
-            code: "first_name = \"Nicholas\"",
-            errors: [
-                {
-                    message: "Identifier 'first_name' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "__private_first_name = \"Patrick\"",
-            errors: [
-                {
-                    message: "Identifier '__private_first_name' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "function foo_bar(){}",
-            errors: [
-                {
-                    message: "Identifier 'foo_bar' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "obj.foo_bar = function(){};",
-            errors: [
-                {
-                    message: "Identifier 'foo_bar' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "bar_baz.foo = function(){};",
-            errors: [
-                {
-                    message: "Identifier 'bar_baz' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "[foo_bar.baz]",
-            errors: [
-                {
-                    message: "Identifier 'foo_bar' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "if (foo.bar_baz === boom.bam_pow) { [foo_bar.baz] }",
-            errors: [
-                {
-                    message: "Identifier 'foo_bar' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "foo.bar_baz = boom.bam_pow",
-            errors: [
-                {
-                    message: "Identifier 'bar_baz' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "var foo = { bar_baz: boom.bam_pow }",
-            errors: [
-                {
-                    message: "Identifier 'bar_baz' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "foo.qux.boom_pow = { bar: boom.bam_pow }",
-            errors: [
-                {
-                    message: "Identifier 'boom_pow' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "var o = {bar_baz: 1}",
-            options: [{properties: "always"}],
-            errors: [
-                {
-                    message: "Identifier 'bar_baz' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "obj.a_b = 2;",
-            options: [{properties: "always"}],
-            errors: [
-                {
-                    message: "Identifier 'a_b' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "obj.a_b = 2;",
-            options: [{properties: "always"}],
-            errors: [
-                {
-                    message: "Identifier 'a_b' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "var { category_id: category_id } = query;",
-            parserOptions: { ecmaVersion: 6 },
-            errors: [
-                {
-                    message: "Identifier 'category_id' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "var { category_id } = query;",
-            parserOptions: { ecmaVersion: 6 },
-            errors: [
-                {
-                    message: "Identifier 'category_id' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import no_camelcased from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import * as no_camelcased from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import { no_camelcased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import { no_camelcased as no_camel_cased } from \"external module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camel_cased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import { camelCased as no_camel_cased } from \"external module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camel_cased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import { camelCased, no_camelcased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import { no_camelcased as camelCased, another_no_camelcased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'another_no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import camelCased, { no_camelcased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        },
-        {
-            code: "import no_camelcased, { another_no_camelcased as camelCased } from \"external-module\";",
-            parserOptions: { ecmaVersion: 6, sourceType: "module" },
-            errors: [
-                {
-                    message: "Identifier 'no_camelcased' is not in camel case.",
-                    type: "Identifier"
-                }
-            ]
-        }
-    ]
-});
diff --git a/systrace/catapult/common/lab/commits.py b/systrace/catapult/common/lab/commits.py
deleted file mode 100755
index 6d47b91..0000000
--- a/systrace/catapult/common/lab/commits.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Print statistics about the rate of commits to a repository."""
-
-import datetime
-import itertools
-import json
-import math
-import urllib
-import urllib2
-
-
-_BASE_URL = 'https://chromium.googlesource.com'
-# Can be up to 10,000.
-_REVISION_COUNT = 10000
-
-_REPOSITORIES = [
-    'chromium/src',
-    'angle/angle',
-    'skia',
-    'v8/v8',
-]
-
-
-def Pairwise(iterable):
-  """s -> (s0,s1), (s1,s2), (s2, s3), ..."""
-  a, b = itertools.tee(iterable)
-  next(b, None)
-  return itertools.izip(a, b)
-
-
-def Percentile(data, percentile):
-  """Find a percentile of a list of values.
-
-  Parameters:
-    data: A sorted list of values.
-    percentile: The percentile to look up, from 0.0 to 1.0.
-
-  Returns:
-    The percentile.
-
-  Raises:
-    ValueError: If data is empty.
-  """
-  if not data:
-    raise ValueError()
-
-  k = (len(data) - 1) * percentile
-  f = math.floor(k)
-  c = math.ceil(k)
-
-  if f == c:
-    return data[int(k)]
-  return data[int(f)] * (c - k) + data[int(c)] * (k - f)
-
-
-def CommitTimes(repository, revision_count):
-  parameters = urllib.urlencode((('n', revision_count), ('format', 'JSON')))
-  url = '%s/%s/+log?%s' % (_BASE_URL, urllib.quote(repository), parameters)
-  data = json.loads(''.join(urllib2.urlopen(url).read().splitlines()[1:]))
-
-  commit_times = []
-  for revision in data['log']:
-    commit_time_string = revision['committer']['time']
-    commit_time = datetime.datetime.strptime(
-        commit_time_string, '%a %b %d %H:%M:%S %Y')
-    commit_times.append(commit_time - datetime.timedelta(hours=7))
-
-  return commit_times
-
-
-def IsWeekday(time):
-  return time.weekday() >= 0 and time.weekday() < 5
-
-
-def main():
-  for repository in _REPOSITORIES:
-    commit_times = CommitTimes(repository, _REVISION_COUNT)
-
-    commit_durations = []
-    for time1, time2 in Pairwise(commit_times):
-      #if not (IsWeekday(time1) and IsWeekday(time2)):
-      #  continue
-      commit_durations.append((time1 - time2).total_seconds() / 60.)
-    commit_durations.sort()
-
-    print 'REPOSITORY:', repository
-    print 'Start Date:', min(commit_times), 'PDT'
-    print '  End Date:', max(commit_times), 'PDT'
-    print '  Duration:', max(commit_times) - min(commit_times)
-    print '         n:', len(commit_times)
-
-    for p in (0.25, 0.50, 0.90):
-      percentile = Percentile(commit_durations, p)
-      print '%3d%% commit duration:' % (p * 100), '%6.1fm' % percentile
-    mean = math.fsum(commit_durations) / len(commit_durations)
-    print 'Mean commit duration:', '%6.1fm' % mean
-    print
-
-
-if __name__ == '__main__':
-  main()
diff --git a/systrace/catapult/common/lab/hardware.py b/systrace/catapult/common/lab/hardware.py
deleted file mode 100755
index 5e49c5c..0000000
--- a/systrace/catapult/common/lab/hardware.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Query build slave hardware info, and print it to stdout as csv."""
-
-import csv
-import json
-import logging
-import sys
-import urllib2
-
-
-_MASTERS = [
-    'chromium.perf',
-    'chromium.perf.fyi',
-    'client.catapult',
-    'tryserver.chromium.perf',
-    'tryserver.client.catapult',
-]
-
-
-_KEYS = [
-    'master', 'builder', 'hostname',
-
-    'os family', 'os version', 'bitness (userland)',
-
-    'product name', 'architecture', 'processor count', 'processor type',
-    'memory total',
-
-    'facter version', 'git version', 'puppet version', 'python version',
-    'ruby version',
-
-    'android device 1', 'android device 2', 'android device 3',
-    'android device 4', 'android device 5', 'android device 6',
-    'android device 7', 'android device 8',
-]
-_EXCLUDED_KEYS = frozenset([
-    'architecture (userland)',
-    'b directory',
-    'last puppet run',
-    'uptime',
-    'windows version',
-])
-
-
-def main():
-  writer = csv.DictWriter(sys.stdout, _KEYS)
-  writer.writeheader()
-
-  for master_name in _MASTERS:
-    master_data = json.load(urllib2.urlopen(
-        'http://build.chromium.org/p/%s/json/slaves' % master_name))
-
-    slaves = sorted(master_data.iteritems(),
-                    key=lambda x: (x[1]['builders'].keys(), x[0]))
-    for slave_name, slave_data in slaves:
-      for builder_name in slave_data['builders']:
-        row = {
-            'master': master_name,
-            'builder': builder_name,
-            'hostname': slave_name,
-        }
-
-        host_data = slave_data['host']
-        if host_data:
-          host_data = host_data.splitlines()
-          if len(host_data) > 1:
-            for line in host_data:
-              if not line:
-                continue
-              key, value = line.split(': ')
-              if key in _EXCLUDED_KEYS:
-                continue
-              row[key] = value
-
-        # Munge keys.
-        row = {key.replace('_', ' '): value for key, value in row.iteritems()}
-        if 'osfamily' in row:
-          row['os family'] = row.pop('osfamily')
-        if 'product name' not in row and slave_name.startswith('slave'):
-          row['product name'] = 'Google Compute Engine'
-
-        try:
-          writer.writerow(row)
-        except ValueError:
-          logging.error(row)
-          raise
-
-
-if __name__ == '__main__':
-  main()
diff --git a/systrace/catapult/common/lab/keychain_unlock.sh b/systrace/catapult/common/lab/keychain_unlock.sh
deleted file mode 100755
index e550f8d..0000000
--- a/systrace/catapult/common/lab/keychain_unlock.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Script to SSH into a list of bots and set up their keychains for Telemetry.
-# https://www.chromium.org/developers/telemetry/telemetry-mac-keychain-setup
-
-for hostname in "$@"
-do
-  ssh -t "$hostname" 'security unlock-keychain login.keychain
-security delete-generic-password -s "Chrome Safe Storage" login.keychain
-security add-generic-password -a Chrome -w "+NTclOvR4wLMgRlLIL9bHQ==" \
-  -s "Chrome Safe Storage" -A login.keychain'
-done
diff --git a/systrace/catapult/common/node_runner/node_runner/README.md b/systrace/catapult/common/node_runner/node_runner/README.md
deleted file mode 100644
index 47c85ba..0000000
--- a/systrace/catapult/common/node_runner/node_runner/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-Update binaries:
-
-1. Download archives pre-compiled binaries.
-2. Unzip archives.
-3. Re-zip just the binary:
-   `zip new.zip node-v10.14.1-linux-x64/bin/node`
-4. Use the update script:
-   `./dependency_manager/bin/update --config
-   common/node_runner/node_runner/node_binaries.json --dependency node --path
-   new.zip --platform linux_x86_64`
-5. Mail out the automated change to `node_binaries.json` for review and CQ.
diff --git a/systrace/catapult/common/node_runner/node_runner/__init__.py b/systrace/catapult/common/node_runner/node_runner/__init__.py
deleted file mode 100644
index ce33e05..0000000
--- a/systrace/catapult/common/node_runner/node_runner/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
diff --git a/systrace/catapult/common/node_runner/node_runner/minify b/systrace/catapult/common/node_runner/node_runner/minify
deleted file mode 100755
index a5a24cf..0000000
--- a/systrace/catapult/common/node_runner/node_runner/minify
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-/*
-Copyright 2018 The Chromium Authors. All rights reserved.
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
-
-This script wraps common HTML transformations including stripping whitespace and
-comments from HTML, CSS, and Javascript.
-*/
-const dom5 = require('dom5');
-const escodegen = require('escodegen');
-const espree = require('espree');
-const fs = require('fs');
-const nopt = require('nopt');
-
-const args = nopt();
-const filename = args.argv.remain[0];
-
-let html = fs.readFileSync(filename).toString('utf8');
-let parsedHtml = dom5.parse(html);
-// First, collapse text nodes around comments (by removing comment nodes,
-// re-serializing, and re-parsing) in order to prevent multiple extraneous
-// newlines.
-for (const node of dom5.nodeWalkAll(parsedHtml, () => true)) {
-  if (dom5.isCommentNode(node)) {
-    dom5.remove(node);
-  }
-}
-html = dom5.serialize(parsedHtml);
-parsedHtml = dom5.parse(html);
-// Some of these transformations are based on polyclean:
-// https://github.com/googlearchive/polyclean
-for (const node of dom5.nodeWalkAll(parsedHtml, () => true)) {
-  if (dom5.isTextNode(node)) {
-    dom5.setTextContent(node, dom5.getTextContent(node)
-      .replace(/ *\n+ */g, '\n')
-      .replace(/\n+/g, '\n'));
-  } else if (dom5.predicates.hasTagName('script')(node) &&
-             !dom5.predicates.hasAttr('src')(node)) {
-    let text = dom5.getTextContent(node);
-    const ast = espree.parse(text, {ecmaVersion: 2018});
-    text = escodegen.generate(ast, {format: {indent: {style: ''}}});
-    dom5.setTextContent(node, text);
-  } else if (dom5.predicates.hasTagName('style')(node)) {
-    dom5.setTextContent(node, dom5.getTextContent(node)
-      .replace(/[\r\n]/g, '')
-      .replace(/ {2,}/g, ' ')
-      .replace(/(^|[;,\:\{\}]) /g, '$1')
-      .replace(/ ($|[;,\{\}])/g, '$1'));
-  }
-}
-fs.writeFileSync(filename, dom5.serialize(parsedHtml));
diff --git a/systrace/catapult/common/node_runner/node_runner/minifyjs b/systrace/catapult/common/node_runner/node_runner/minifyjs
deleted file mode 100755
index e594169..0000000
--- a/systrace/catapult/common/node_runner/node_runner/minifyjs
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-/*
-Copyright 2019 The Chromium Authors. All rights reserved.
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
-
-This script strips whitespace and comments from Javascript.
-*/
-const escodegen = require('escodegen');
-const espree = require('espree');
-const fs = require('fs');
-const nopt = require('nopt');
-
-const args = nopt();
-const filename = args.argv.remain[0];
-
-let text = fs.readFileSync(filename).toString('utf8');
-const ast = espree.parse(text, {ecmaVersion: 2018});
-text = escodegen.generate(ast, {format: {indent: {style: ''}}});
-fs.writeFileSync(filename, text);
diff --git a/systrace/catapult/common/node_runner/node_runner/node_binaries.json b/systrace/catapult/common/node_runner/node_runner/node_binaries.json
deleted file mode 100644
index 89a73ee..0000000
--- a/systrace/catapult/common/node_runner/node_runner/node_binaries.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-  "config_type": "BaseConfig",
-  "dependencies": {
-    "node": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux_x86_64": {
-          "cloud_storage_hash": "27ad092b0ce59d2da32090a00f717f0c31e65240",
-          "download_path": "bin/node/node-linux64.zip",
-          "path_within_archive": "node-v10.14.1-linux-x64/bin/node",
-          "version_in_cs": "10.14.1"
-        },
-        "mac_x86_64": {
-          "cloud_storage_hash": "1bd87abe88492d52b366e97ae9404f082b34fd15",
-          "download_path": "bin/node/node-mac64.zip",
-          "path_within_archive": "node-v10.14.1-darwin-x64/bin/node",
-          "version_in_cs": "10.14.1"
-        },
-        "win_AMD64": {
-          "cloud_storage_hash": "f1162c6343dc6a3a1acecf76966d4c2acd17fc46",
-          "download_path": "bin/node/node-win64.zip",
-          "path_within_archive": "node-v10.14.1-win-x64/node.exe",
-          "version_in_cs": "10.14.1"
-        }
-      }
-    },
-    "npm": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux_x86_64": {
-          "cloud_storage_hash": "830b8f6761bf82a945b57facfb49925b579c471c",
-          "download_path": "bin/node/npm-linux64.zip",
-          "path_within_archive": "node-v10.14.1-linux-x64/lib/node_modules/npm/bin/npm-cli.js",
-          "version_in_cs": "10.14.1"
-        },
-        "mac_x86_64": {
-          "cloud_storage_hash": "1bd87abe88492d52b366e97ae9404f082b34fd15",
-          "download_path": "bin/node/npm-mac64.zip",
-          "path_within_archive": "node-v10.14.1-darwin-x64/lib/node_modules/npm/bin/npm-cli.js",
-          "version_in_cs": "10.14.1"
-        },
-        "win_AMD64": {
-          "cloud_storage_hash": "f1162c6343dc6a3a1acecf76966d4c2acd17fc46",
-          "download_path": "bin/node/npm-win64.zip",
-          "path_within_archive": "node-v10.14.1-win-x64\\node_modules\\npm\\bin\\npm-cli.js",
-          "version_in_cs": "10.14.1"
-        }
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/common/node_runner/node_runner/node_util.py b/systrace/catapult/common/node_runner/node_runner/node_util.py
deleted file mode 100644
index 05d0084..0000000
--- a/systrace/catapult/common/node_runner/node_runner/node_util.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import subprocess
-import sys
-
-import py_utils
-from py_utils import binary_manager
-from py_utils import dependency_util
-
-
-def _NodeBinariesConfigPath():
-  return os.path.realpath(os.path.join(
-      os.path.dirname(os.path.abspath(__file__)), 'node_binaries.json'))
-
-
-class _NodeManager(object):
-  def __init__(self):
-    self.bm = binary_manager.BinaryManager(
-        [_NodeBinariesConfigPath()])
-    self.os_name = dependency_util.GetOSNameForCurrentDesktopPlatform()
-    self.arch_name = dependency_util.GetArchForCurrentDesktopPlatform(
-        self.os_name)
-    self.node_path = self.bm.FetchPath('node', self.os_name, self.arch_name)
-    self.npm_path = self.bm.FetchPath('npm', self.os_name, self.arch_name)
-
-    self.node_initialized = False
-
-  def InitNode(self):
-    if self.node_initialized:
-      return  # So we only init once per run
-    self.node_initialized = True
-    old_dir = os.path.abspath(os.curdir)
-    os.chdir(os.path.join(os.path.abspath(
-        py_utils.GetCatapultDir()), 'common', 'node_runner', 'node_runner'))
-    subprocess.call([self.node_path, self.npm_path, 'install'])
-    os.chdir(old_dir)
-
-
-_NODE_MANAGER = _NodeManager()
-
-
-def InitNode():
-  _NODE_MANAGER.InitNode()
-
-
-def GetNodePath():
-  return _NODE_MANAGER.node_path
-
-
-def GetNodeModulesPath():
-  _NODE_MANAGER.InitNode()
-  path = os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                      'node_modules'))
-  if sys.platform.startswith('win'):
-    # Escape path on Windows because it's very long and must be passed to NTFS.
-    path = u'\\\\?\\' + path
-  return path
diff --git a/systrace/catapult/common/node_runner/node_runner/package-lock.json b/systrace/catapult/common/node_runner/node_runner/package-lock.json
deleted file mode 100644
index 2e8ef2a..0000000
--- a/systrace/catapult/common/node_runner/node_runner/package-lock.json
+++ /dev/null
@@ -1,7786 +0,0 @@
-{
-  "name": "catapult_base",
-  "version": "1.0.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@babel/code-frame": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-      "requires": {
-        "@babel/highlight": "^7.10.4"
-      }
-    },
-    "@babel/generator": {
-      "version": "7.11.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz",
-      "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==",
-      "requires": {
-        "@babel/types": "^7.11.0",
-        "jsesc": "^2.5.1",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "2.5.2",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "@babel/helper-function-name": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
-      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
-      "requires": {
-        "@babel/helper-get-function-arity": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-get-function-arity": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
-      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
-      "requires": {
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
-      "requires": {
-        "@babel/types": "^7.11.0"
-      }
-    },
-    "@babel/helper-validator-identifier": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
-    },
-    "@babel/highlight": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "js-tokens": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-        }
-      }
-    },
-    "@babel/parser": {
-      "version": "7.11.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz",
-      "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA=="
-    },
-    "@babel/template": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/parser": "^7.10.4",
-        "@babel/types": "^7.10.4"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
-      "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.11.0",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/parser": "^7.11.0",
-        "@babel/types": "^7.11.0",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.19"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "@babel/types": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
-      "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "lodash": "^4.17.19",
-        "to-fast-properties": "^2.0.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.20",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
-        },
-        "to-fast-properties": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
-        }
-      }
-    },
-    "@chopsui/batch-iterator": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@chopsui/batch-iterator/-/batch-iterator-0.1.0.tgz",
-      "integrity": "sha512-rKXkaIe3H6sQ5bQ798Qdim3v5Lb1WD881daiiMgTsnWvHmFftiytsC0yPespE20vxlllDea2CZpzfOxTY6/Wsg=="
-    },
-    "@chopsui/chops-button": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-button/-/chops-button-0.1.11.tgz",
-      "integrity": "sha512-Mf2t8W629ABg+CKmI6friQGAE7C9bed/Q2GF4Bb8QLKKHcYM73XtWDNcivr4h7ej6YeuGf1KzGMWsApk3m/zww==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-checkbox": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-checkbox/-/chops-checkbox-0.1.11.tgz",
-      "integrity": "sha512-nJOXWP04kIw9eZio1yye0wJEwWR5ZWZUBk2XP+//Fuu+RHMafZdkGfG4DNdrHh9VYprdRcZNM4R+LS5Zh9l6JQ==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-header": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-header/-/chops-header-0.1.5.tgz",
-      "integrity": "sha512-AVbOU1IjOsKxO7j3B0TWXLSzWcaznmxAJFCh9Hq0GZUeBF/d+UBzlwoVZ6fXwzZXZ4A54QVbFbeD+bNQJ55piQ==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-input": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-input/-/chops-input-0.1.11.tgz",
-      "integrity": "sha512-B4dE2IoyilBpQAt1ERH3Q4PmpgRNogo2xlFNhag9FedBKXZmYa+o2ygl25IuAMaUa30mWBz1kOKYN8Lsovxv+w==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-loading": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-loading/-/chops-loading-0.1.11.tgz",
-      "integrity": "sha512-IkLWkiQXsJHd76MPN4pfoeAcX+4Ap9g6WSh1j7oFMJd2rzHQZpPfkLlMcAI99nUymmZrLbRjZ3qO48FbViK+kg==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-radio": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-radio/-/chops-radio-0.1.11.tgz",
-      "integrity": "sha512-ZFtS+CtyGg34ezzTod20zLOYPgsHSmpyZ4zmkDdY1fatBdskG3ojSp4u0p/fd9kTKSykG94h0Gtj02GijCCRRg==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-radio-group": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-radio-group/-/chops-radio-group-0.1.11.tgz",
-      "integrity": "sha512-Fq5/RaTI1kpdxOenFKp9P/0fDQXzQYhU7+v1/W+7NgB6SlOtJ6EmsVsotEI/woPuRcOdt7dcrzATj4IQwapKxA==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-signin": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-signin/-/chops-signin-0.1.5.tgz",
-      "integrity": "sha512-4dLoxnc+W6CmErR8iUfFh01da8AUndnbTSjCRnklYMCMhq3oCCgHKF709ISzEjuChsbwKLe6Y0EjEScLeMiVeg==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-switch": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-switch/-/chops-switch-0.1.11.tgz",
-      "integrity": "sha512-ie+7x3xoZA8ADnr6+2HJox6xycCEvZb1Qhhu3lWuXi7TINFFTry0C7vU9W8EoBu31JVM+g47Y+9+HI6jQfaUbA==",
-      "requires": {
-        "@chopsui/chops-checkbox": "^0.1.6",
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-tab": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-tab/-/chops-tab-0.1.11.tgz",
-      "integrity": "sha512-9YUcBNUSaW7Cyk5MNQSZpR4fDhwJul8na7/MwEpgdRVdndbVl7a4juTI4oTftEeoqjirPn/ZEo7+VwlJp0kR7A==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-tab-bar": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-tab-bar/-/chops-tab-bar-0.1.11.tgz",
-      "integrity": "sha512-BeClVVCpYN/h7nKGaAIT9hJS3tLhzam4coIK0t/egImJNPGHj3+Mu07MzjUYZb2dA/rcKjpAdA9cIQFfEzXthA==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/chops-textarea": {
-      "version": "0.1.11",
-      "resolved": "https://registry.npmjs.org/@chopsui/chops-textarea/-/chops-textarea-0.1.11.tgz",
-      "integrity": "sha512-lJDC6OeTpKQV5JYED6Ev5Rkm3oMw/UcOWXyLh6n1/BnlCweg8n1CGqqUQvxtxTG7hc4fhIkiok84zcSnwBcwIg==",
-      "requires": {
-        "lit-element": "^2.0.0"
-      }
-    },
-    "@chopsui/result-channel": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@chopsui/result-channel/-/result-channel-0.1.0.tgz",
-      "integrity": "sha512-9gocIAIwaX74Yj+wnkzlebfgTsvnZed8h+Yc71KDGO/A9rmgMNvl1kC1DoXgMMCUvELM0LybGHfZvzfkM8HKlw=="
-    },
-    "@chopsui/tsmon-client": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/@chopsui/tsmon-client/-/tsmon-client-0.0.1.tgz",
-      "integrity": "sha1-QoowBjL2RNLWDxU9WBj2fWTugF0="
-    },
-    "@polymer/app-route": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@polymer/app-route/-/app-route-3.0.2.tgz",
-      "integrity": "sha1-dJCW+2EPsV0nx7aERkBvMHhs+T0=",
-      "requires": {
-        "@polymer/iron-location": "^3.0.0-pre.26",
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-collapse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-collapse/-/iron-collapse-3.0.1.tgz",
-      "integrity": "sha1-ZBfIT1QF7ZCRh3ZdkkLjuHukYm8=",
-      "requires": {
-        "@polymer/iron-resizable-behavior": "^3.0.0-pre.26",
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-flex-layout": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz",
-      "integrity": "sha1-NvnhqOt5LSebK8ddNiYochrTfww=",
-      "requires": {
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-icon": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-icon/-/iron-icon-3.0.1.tgz",
-      "integrity": "sha1-kyEcOdiCX+SWWmhBlWYDbB3ykes=",
-      "requires": {
-        "@polymer/iron-flex-layout": "^3.0.0-pre.26",
-        "@polymer/iron-meta": "^3.0.0-pre.26",
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-iconset-svg": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-iconset-svg/-/iron-iconset-svg-3.0.1.tgz",
-      "integrity": "sha1-Vo1ufbwSApna5jvjYArroNMN2+o=",
-      "requires": {
-        "@polymer/iron-meta": "^3.0.0-pre.26",
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-location": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-location/-/iron-location-3.0.1.tgz",
-      "integrity": "sha1-Q6WfztJI6nHbWDMRb83voYa3lSc=",
-      "requires": {
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-meta": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-meta/-/iron-meta-3.0.1.tgz",
-      "integrity": "sha1-fxQGKNEnsKKE+ILxuzI6JhvBJfU=",
-      "requires": {
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/iron-resizable-behavior": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.1.tgz",
-      "integrity": "sha1-4oQ0jtfBx+Jj9wOSl1MvqVQCXqI=",
-      "requires": {
-        "@polymer/polymer": "^3.0.0"
-      }
-    },
-    "@polymer/polymer": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.2.0.tgz",
-      "integrity": "sha1-tB/d7E7KxjsSk2uTcmZ40jrdev0=",
-      "requires": {
-        "@webcomponents/shadycss": "^1.8.0"
-      }
-    },
-    "@sinonjs/commons": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz",
-      "integrity": "sha1-ez7C2Wr0gdegMhJS57HJRyTsWng=",
-      "requires": {
-        "type-detect": "4.0.8"
-      }
-    },
-    "@sinonjs/formatio": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz",
-      "integrity": "sha1-UjEPL5vLxnvawYyUrUkBuV/eJn4=",
-      "requires": {
-        "@sinonjs/commons": "^1",
-        "@sinonjs/samsam": "^3.1.0"
-      }
-    },
-    "@sinonjs/samsam": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz",
-      "integrity": "sha1-6IxT+9nZGtnw8rAUDBbHwQf+DQc=",
-      "requires": {
-        "@sinonjs/commons": "^1.0.2",
-        "array-from": "^2.1.1",
-        "lodash": "^4.17.11"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.11",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
-        }
-      }
-    },
-    "@sinonjs/text-encoding": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
-      "integrity": "sha1-jaXGUwkVZT86Hzj9XxAdjD+AecU="
-    },
-    "@types/babel-generator": {
-      "version": "6.25.3",
-      "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.3.tgz",
-      "integrity": "sha512-pGgnuxVddKcYIc+VJkRDop7gxLhqclNKBdlsm/5Vp8d+37pQkkDK7fef8d9YYImRzw9xcojEPc18pUYnbxmjqA==",
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "@types/babel-traverse": {
-      "version": "6.25.5",
-      "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.5.tgz",
-      "integrity": "sha512-WrMbwmu+MWf8FiUMbmVOGkc7bHPzndUafn1CivMaBHthBBoo0VNIcYk1KV71UovYguhsNOwf3UF5oRmkkGOU3w==",
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "@types/babel-types": {
-      "version": "7.0.8",
-      "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.8.tgz",
-      "integrity": "sha512-jvu8g4LR7+p6ao30RhTREnEhHxmP4/R9D9/rOR/Kq14FztORty9SKgtOZUNZNMB9CXLxZ54EWu4dArUE8WdTsw=="
-    },
-    "@types/babylon": {
-      "version": "6.16.5",
-      "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
-      "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "@types/chai": {
-      "version": "4.2.12",
-      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.12.tgz",
-      "integrity": "sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ=="
-    },
-    "@types/chai-subset": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
-      "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
-      "requires": {
-        "@types/chai": "*"
-      }
-    },
-    "@types/chalk": {
-      "version": "0.4.31",
-      "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
-      "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk="
-    },
-    "@types/clone": {
-      "version": "0.1.30",
-      "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
-      "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ="
-    },
-    "@types/cssbeautify": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
-      "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8="
-    },
-    "@types/doctrine": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
-      "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0="
-    },
-    "@types/estree": {
-      "version": "0.0.45",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
-      "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g=="
-    },
-    "@types/is-windows": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
-      "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8="
-    },
-    "@types/minimatch": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
-      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
-    },
-    "@types/node": {
-      "version": "4.2.23",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
-      "integrity": "sha1-kkHwDWTrkQhPaDZ3Ru8Q1fsvL8Q="
-    },
-    "@types/parse5": {
-      "version": "0.0.31",
-      "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz",
-      "integrity": "sha1-6Cekk6RDsVbhtYKi5MO9wAQPLuc=",
-      "requires": {
-        "@types/node": "6.0.*"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "6.0.116",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.116.tgz",
-          "integrity": "sha1-L5zWK07MSSfjlC4mVcGC7s9bRfE="
-        }
-      }
-    },
-    "@types/path-is-inside": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@types/path-is-inside/-/path-is-inside-1.0.0.tgz",
-      "integrity": "sha512-hfnXRGugz+McgX2jxyy5qz9sB21LRzlGn24zlwN2KEgoPtEvjzNRrLtUkOOebPDPZl3Rq7ywKxYvylVcEZDnEw=="
-    },
-    "@types/resolve": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
-      "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/whatwg-url": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-6.4.0.tgz",
-      "integrity": "sha512-tonhlcbQ2eho09am6RHnHOgvtDfDYINd5rgxD+2YSkKENooVCFsWizJz139MQW/PV8FfClyKrNe9ZbdHrSCxGg==",
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@webassemblyjs/ast": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz",
-      "integrity": "sha1-DPxh1hKGJAty/FIst1VhNpnupAo=",
-      "requires": {
-        "@webassemblyjs/helper-module-context": "1.7.10",
-        "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
-        "@webassemblyjs/wast-parser": "1.7.10"
-      }
-    },
-    "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz",
-      "integrity": "sha1-7mPXKcYxGoWGPjaaRz+Zg/mE5Nk="
-    },
-    "@webassemblyjs/helper-api-error": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz",
-      "integrity": "sha1-v8s7vll3U1dHV5CirXsonwmy8Zg="
-    },
-    "@webassemblyjs/helper-buffer": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz",
-      "integrity": "sha1-CoxiTGetCyFNLgA4WZIaGYjLFRs="
-    },
-    "@webassemblyjs/helper-code-frame": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz",
-      "integrity": "sha1-CrfiL60CQaFzF4xzl2/A7fUIMs4=",
-      "requires": {
-        "@webassemblyjs/wast-printer": "1.7.10"
-      }
-    },
-    "@webassemblyjs/helper-fsm": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz",
-      "integrity": "sha1-CRXncT+7tzViCp0+T6PXlR+XrGQ="
-    },
-    "@webassemblyjs/helper-module-context": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz",
-      "integrity": "sha1-m+uD9ydA9ayAdTE7XKxeeWUQ91U="
-    },
-    "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz",
-      "integrity": "sha1-eXsec0u8/eqDmWac3FgwjvHH/8A="
-    },
-    "@webassemblyjs/helper-wasm-section": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz",
-      "integrity": "sha1-wOo3A8YV17w+NQfDt5kch2ey8g4=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/helper-buffer": "1.7.10",
-        "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
-        "@webassemblyjs/wasm-gen": "1.7.10"
-      }
-    },
-    "@webassemblyjs/ieee754": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz",
-      "integrity": "sha1-YsFyi37w9m74Ih4pZqCv1120MN8=",
-      "requires": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "@webassemblyjs/leb128": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz",
-      "integrity": "sha1-Fn4LtLBtdwFYV3KnP7qfTfhUOfY=",
-      "requires": {
-        "@xtuc/long": "4.2.1"
-      }
-    },
-    "@webassemblyjs/utf8": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz",
-      "integrity": "sha1-tnKPW29QNkq8FVvgKflnDmaFYFo="
-    },
-    "@webassemblyjs/wasm-edit": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz",
-      "integrity": "sha1-g/4xQPWlj1owuRRwK+nw5Zo5kJI=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/helper-buffer": "1.7.10",
-        "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
-        "@webassemblyjs/helper-wasm-section": "1.7.10",
-        "@webassemblyjs/wasm-gen": "1.7.10",
-        "@webassemblyjs/wasm-opt": "1.7.10",
-        "@webassemblyjs/wasm-parser": "1.7.10",
-        "@webassemblyjs/wast-printer": "1.7.10"
-      }
-    },
-    "@webassemblyjs/wasm-gen": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz",
-      "integrity": "sha1-TeADgGrinJerNwd4JGm1MplXAXQ=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
-        "@webassemblyjs/ieee754": "1.7.10",
-        "@webassemblyjs/leb128": "1.7.10",
-        "@webassemblyjs/utf8": "1.7.10"
-      }
-    },
-    "@webassemblyjs/wasm-opt": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz",
-      "integrity": "sha1-0VHjFhGTSlVsgnif3uxBqBSZPCo=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/helper-buffer": "1.7.10",
-        "@webassemblyjs/wasm-gen": "1.7.10",
-        "@webassemblyjs/wasm-parser": "1.7.10"
-      }
-    },
-    "@webassemblyjs/wasm-parser": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz",
-      "integrity": "sha1-A2e+e/jwnj5qvJX45IO5IGSH7GU=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/helper-api-error": "1.7.10",
-        "@webassemblyjs/helper-wasm-bytecode": "1.7.10",
-        "@webassemblyjs/ieee754": "1.7.10",
-        "@webassemblyjs/leb128": "1.7.10",
-        "@webassemblyjs/utf8": "1.7.10"
-      }
-    },
-    "@webassemblyjs/wast-parser": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz",
-      "integrity": "sha1-BY9Zi1L3MLI/yHTUd1tihrYkcmQ=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/floating-point-hex-parser": "1.7.10",
-        "@webassemblyjs/helper-api-error": "1.7.10",
-        "@webassemblyjs/helper-code-frame": "1.7.10",
-        "@webassemblyjs/helper-fsm": "1.7.10",
-        "@xtuc/long": "4.2.1"
-      }
-    },
-    "@webassemblyjs/wast-printer": {
-      "version": "1.7.10",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz",
-      "integrity": "sha1-2BeQnSRQrpbGa3YHYk2YozuEIjs=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/wast-parser": "1.7.10",
-        "@xtuc/long": "4.2.1"
-      }
-    },
-    "@webcomponents/shadycss": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.1.tgz",
-      "integrity": "sha1-12n7rfpQTxG4TK7vJnAfiQcOxJo="
-    },
-    "@webpack-contrib/config-loader": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@webpack-contrib/config-loader/-/config-loader-1.2.1.tgz",
-      "integrity": "sha1-Wz3UdOIHQ3k50pTSAMaLewAAjgQ=",
-      "requires": {
-        "@webpack-contrib/schema-utils": "^1.0.0-beta.0",
-        "chalk": "^2.1.0",
-        "cosmiconfig": "^5.0.2",
-        "is-plain-obj": "^1.1.0",
-        "loud-rejection": "^1.6.0",
-        "merge-options": "^1.0.1",
-        "minimist": "^1.2.0",
-        "resolve": "^1.6.0",
-        "webpack-log": "^1.1.2"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "@webpack-contrib/schema-utils": {
-      "version": "1.0.0-beta.0",
-      "resolved": "https://registry.npmjs.org/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz",
-      "integrity": "sha1-v5Y4yUZNF3tIIJ6EIJ4jvuLrT2U=",
-      "requires": {
-        "ajv": "^6.1.0",
-        "ajv-keywords": "^3.1.0",
-        "chalk": "^2.3.2",
-        "strip-ansi": "^4.0.0",
-        "text-table": "^0.2.0",
-        "webpack-log": "^1.1.2"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.5.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
-          "integrity": "sha1-JH1SdBENtlNwa1UPzCt5fKKM/Fk=",
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-keywords": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
-          "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo="
-        },
-        "fast-deep-equal": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
-        }
-      }
-    },
-    "@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A="
-    },
-    "@xtuc/long": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
-      "integrity": "sha1-XIXWYvdvodNFdXZsXc1mFavNMNg="
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
-    },
-    "accepts": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-      "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
-      "requires": {
-        "mime-types": "~2.1.24",
-        "negotiator": "0.6.2"
-      }
-    },
-    "acorn": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz",
-      "integrity": "sha1-8JWCkpdwanyXdpWMCvyJMKm52dg="
-    },
-    "acorn-dynamic-import": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
-      "integrity": "sha1-kBzu5Mf6rvfgetKkfokGddpQong=",
-      "requires": {
-        "acorn": "^5.0.0"
-      }
-    },
-    "acorn-jsx": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
-      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
-      "requires": {
-        "acorn": "^3.0.4"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
-        }
-      }
-    },
-    "after": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
-      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
-    },
-    "agent-base": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
-      "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=",
-      "requires": {
-        "es6-promisify": "^5.0.0"
-      }
-    },
-    "ajv": {
-      "version": "5.5.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-      "requires": {
-        "co": "^4.6.0",
-        "fast-deep-equal": "^1.0.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.3.0"
-      }
-    },
-    "ajv-keywords": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
-      "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "optional": true
-    },
-    "ansi-align": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
-      "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
-      "requires": {
-        "string-width": "^2.0.0"
-      }
-    },
-    "ansi-colors": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
-      "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78="
-    },
-    "ansi-escapes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
-      "integrity": "sha1-9zIHu4EgfXX9bIPxJa8m7qN4yjA="
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
-    },
-    "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=",
-      "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo="
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE="
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
-    },
-    "array-back": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
-      "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
-    },
-    "array-from": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
-      "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU="
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
-    },
-    "arraybuffer.slice": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
-      "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU="
-    },
-    "arrify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
-    },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "assert": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
-      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
-      "requires": {
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assertion-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs="
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
-    },
-    "async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
-      "integrity": "sha1-GDMOp+bjE4h/XS8qkEusb+TdU4E=",
-      "requires": {
-        "lodash": "^4.17.11"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.11",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
-        }
-      }
-    },
-    "async-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
-    },
-    "async-limiter": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
-      "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg="
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k="
-    },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "requires": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=",
-      "requires": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-polyfill": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
-      "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "core-js": "^2.5.0",
-        "regenerator-runtime": "^0.10.5"
-      }
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.11.1",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-          "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
-        }
-      }
-    },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "globals": {
-          "version": "9.18.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-          "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo="
-        }
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM="
-    },
-    "backo2": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
-      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=",
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "base64-arraybuffer": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
-      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
-    },
-    "base64-js": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
-      "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM="
-    },
-    "base64id": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
-      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
-    },
-    "better-assert": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
-      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
-      "requires": {
-        "callsite": "1.0.0"
-      }
-    },
-    "big.js": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
-      "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4="
-    },
-    "binary-extensions": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
-      "integrity": "sha1-wteA9T1Fu6gxeokC1M7q86Y4WxQ="
-    },
-    "blob": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
-      "integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM="
-    },
-    "bluebird": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz",
-      "integrity": "sha1-G+CQjgVKdRdUVJwnBInBUF1KsVo="
-    },
-    "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8="
-    },
-    "body-parser": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
-      "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=",
-      "requires": {
-        "bytes": "3.1.0",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "on-finished": "~2.3.0",
-        "qs": "6.7.0",
-        "raw-body": "2.4.0",
-        "type-is": "~1.6.17"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "http-errors": {
-          "version": "1.7.2",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-          "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
-        }
-      }
-    },
-    "boxen": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
-      "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=",
-      "requires": {
-        "ansi-align": "^2.0.0",
-        "camelcase": "^4.0.0",
-        "chalk": "^2.0.1",
-        "cli-boxes": "^1.0.0",
-        "string-width": "^2.0.0",
-        "term-size": "^1.2.0",
-        "widest-line": "^2.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
-        }
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=",
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-    },
-    "browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA="
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=",
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=",
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "buffer": {
-      "version": "4.9.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
-      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4",
-        "isarray": "^1.0.0"
-      }
-    },
-    "buffer-alloc": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-      "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=",
-      "requires": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
-      }
-    },
-    "buffer-alloc-unsafe": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA="
-    },
-    "buffer-fill": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
-    },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8="
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-    },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-    },
-    "bytes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
-      "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY="
-    },
-    "cacache": {
-      "version": "10.0.4",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
-      "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=",
-      "requires": {
-        "bluebird": "^3.5.1",
-        "chownr": "^1.0.1",
-        "glob": "^7.1.2",
-        "graceful-fs": "^4.1.11",
-        "lru-cache": "^4.1.1",
-        "mississippi": "^2.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.2",
-        "ssri": "^5.2.4",
-        "unique-filename": "^1.1.0",
-        "y18n": "^4.0.0"
-      }
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=",
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "caller-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
-      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
-      "requires": {
-        "callsites": "^0.2.0"
-      }
-    },
-    "callsite": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
-      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
-    },
-    "callsites": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
-      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
-    },
-    "camelcase": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
-      "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I="
-    },
-    "camelcase-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
-      "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
-      "requires": {
-        "camelcase": "^4.1.0",
-        "map-obj": "^2.0.0",
-        "quick-lru": "^1.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
-        }
-      }
-    },
-    "cancel-token": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
-      "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
-      "requires": {
-        "@types/node": "^4.0.30"
-      }
-    },
-    "capture-stack-trace": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
-      "integrity": "sha1-psC74fOPOqC5Ijjstv9Cw0TUE10="
-    },
-    "chai": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
-      "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=",
-      "requires": {
-        "assertion-error": "^1.1.0",
-        "check-error": "^1.0.2",
-        "deep-eql": "^3.0.1",
-        "get-func-name": "^2.0.0",
-        "pathval": "^1.1.0",
-        "type-detect": "^4.0.5"
-      }
-    },
-    "chalk": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-      "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=",
-      "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "chardet": {
-      "version": "0.4.2",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
-      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
-    },
-    "check-error": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
-      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII="
-    },
-    "chokidar": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
-      "integrity": "sha1-NW/04rDo5D4yLRijckYLvPOszSY=",
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.0",
-        "braces": "^2.3.0",
-        "fsevents": "^1.2.2",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.1",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "lodash.debounce": "^4.0.8",
-        "normalize-path": "^2.1.1",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.0.0",
-        "upath": "^1.0.5"
-      }
-    },
-    "chownr": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
-      "integrity": "sha1-VHJri4//TfBTxCGH6AH7RBLfFJQ="
-    },
-    "chrome-trace-event": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
-      "integrity": "sha1-Rakb0sIMlBHwljtarrmhuV4JzEg=",
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "ci-info": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
-      "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc="
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "circular-json": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
-      "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY="
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=",
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "cli-boxes": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
-      "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
-    },
-    "cli-cursor": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
-      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
-      "requires": {
-        "restore-cursor": "^2.0.0"
-      }
-    },
-    "cli-spinners": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
-      "integrity": "sha1-ACwZkJEtDVlYDJO9NsBW3pnkJZo="
-    },
-    "cli-width": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
-    },
-    "clone": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
-      "integrity": "sha1-SYgbj7pn3xKpa98/VsCqueeRMUc=",
-      "requires": {
-        "color-name": "1.1.1"
-      }
-    },
-    "color-name": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok="
-    },
-    "colors": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
-      "integrity": "sha1-OeAF1Uav4B4B+cTKj6UPaGoBIF0="
-    },
-    "command-line-args": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz",
-      "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==",
-      "requires": {
-        "array-back": "^3.0.1",
-        "find-replace": "^3.0.0",
-        "lodash.camelcase": "^4.3.0",
-        "typical": "^4.0.0"
-      }
-    },
-    "command-line-usage": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz",
-      "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==",
-      "requires": {
-        "array-back": "^2.0.0",
-        "chalk": "^2.4.1",
-        "table-layout": "^0.4.3",
-        "typical": "^2.6.1"
-      },
-      "dependencies": {
-        "array-back": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
-          "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
-          "requires": {
-            "typical": "^2.6.1"
-          }
-        },
-        "typical": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
-          "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
-        }
-      }
-    },
-    "commander": {
-      "version": "2.13.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
-      "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w="
-    },
-    "commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
-    },
-    "component-bind": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
-      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
-    },
-    "component-emitter": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
-    },
-    "component-inherit": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
-      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=",
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "configstore": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
-      "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=",
-      "requires": {
-        "dot-prop": "^4.1.0",
-        "graceful-fs": "^4.1.2",
-        "make-dir": "^1.0.0",
-        "unique-string": "^1.0.0",
-        "write-file-atomic": "^2.0.0",
-        "xdg-basedir": "^3.0.0"
-      }
-    },
-    "connect": {
-      "version": "3.6.6",
-      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
-      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
-      "requires": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.0",
-        "parseurl": "~1.3.2",
-        "utils-merge": "1.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "requires": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
-    },
-    "convert-source-map": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
-      "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=",
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "cookie": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
-    },
-    "copy-concurrently": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
-      "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
-      "requires": {
-        "aproba": "^1.1.1",
-        "fs-write-stream-atomic": "^1.0.8",
-        "iferr": "^0.1.5",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.0"
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
-    },
-    "core-js": {
-      "version": "2.5.7",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
-      "integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4="
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "cosmiconfig": {
-      "version": "5.0.6",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz",
-      "integrity": "sha1-3KbPaAoL0DWJr/aEcAhYyBq+6zk=",
-      "requires": {
-        "is-directory": "^0.3.1",
-        "js-yaml": "^3.9.0",
-        "parse-json": "^4.0.0"
-      }
-    },
-    "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      }
-    },
-    "create-error-class": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
-      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
-      "requires": {
-        "capture-stack-trace": "^1.0.0"
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=",
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "cross-spawn": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
-      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
-      "requires": {
-        "lru-cache": "^4.0.1",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "crypto-random-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
-      "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
-    },
-    "cssbeautify": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
-      "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c="
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "custom-event": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
-      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU="
-    },
-    "cyclist": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
-      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA="
-    },
-    "d": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
-      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
-      "requires": {
-        "es5-ext": "^0.10.9"
-      }
-    },
-    "date-format": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz",
-      "integrity": "sha1-fPexcvHsVk8AA7OeowLFSY+5jI8="
-    },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
-    },
-    "dateformat": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
-      "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
-      "requires": {
-        "get-stdin": "^4.0.1",
-        "meow": "^3.3.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
-        },
-        "camelcase-keys": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-          "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-          "requires": {
-            "camelcase": "^2.0.0",
-            "map-obj": "^1.0.0"
-          }
-        },
-        "decamelize": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
-        },
-        "find-up": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-          "requires": {
-            "path-exists": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "indent-string": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-          "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-          "requires": {
-            "repeating": "^2.0.0"
-          }
-        },
-        "load-json-file": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "parse-json": "^2.2.0",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0",
-            "strip-bom": "^2.0.0"
-          }
-        },
-        "map-obj": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
-        },
-        "meow": {
-          "version": "3.7.0",
-          "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-          "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-          "requires": {
-            "camelcase-keys": "^2.0.0",
-            "decamelize": "^1.1.2",
-            "loud-rejection": "^1.0.0",
-            "map-obj": "^1.0.1",
-            "minimist": "^1.1.3",
-            "normalize-package-data": "^2.3.4",
-            "object-assign": "^4.0.1",
-            "read-pkg-up": "^1.0.1",
-            "redent": "^1.0.0",
-            "trim-newlines": "^1.0.0"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        },
-        "parse-json": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-          "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-          "requires": {
-            "error-ex": "^1.2.0"
-          }
-        },
-        "path-exists": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-          "requires": {
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "path-type": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-          "requires": {
-            "graceful-fs": "^4.1.2",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "read-pkg": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-          "requires": {
-            "load-json-file": "^1.0.0",
-            "normalize-package-data": "^2.3.2",
-            "path-type": "^1.0.0"
-          }
-        },
-        "read-pkg-up": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-          "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-          "requires": {
-            "find-up": "^1.0.0",
-            "read-pkg": "^1.0.0"
-          }
-        },
-        "redent": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-          "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-          "requires": {
-            "indent-string": "^2.1.0",
-            "strip-indent": "^1.0.1"
-          }
-        },
-        "strip-bom": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-          "requires": {
-            "is-utf8": "^0.2.0"
-          }
-        },
-        "strip-indent": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-          "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-          "requires": {
-            "get-stdin": "^4.0.1"
-          }
-        },
-        "trim-newlines": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-          "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
-        }
-      }
-    },
-    "debug": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-      "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "decamelize": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
-      "integrity": "sha1-ZW17vICUxMeI6lPFhAkIycfQY8c=",
-      "requires": {
-        "xregexp": "4.0.0"
-      }
-    },
-    "decamelize-keys": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
-      "requires": {
-        "decamelize": "^1.1.0",
-        "map-obj": "^1.0.0"
-      },
-      "dependencies": {
-        "decamelize": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-          "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
-        },
-        "map-obj": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
-        }
-      }
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
-    },
-    "deep-eql": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
-      "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=",
-      "requires": {
-        "type-detect": "^4.0.0"
-      }
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw="
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
-    },
-    "defaults": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
-      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
-      "requires": {
-        "clone": "^1.0.2"
-      }
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=",
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "del": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
-      "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
-      "requires": {
-        "globby": "^5.0.0",
-        "is-path-cwd": "^1.0.0",
-        "is-path-in-cwd": "^1.0.0",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "rimraf": "^2.2.8"
-      }
-    },
-    "depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
-    },
-    "des.js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
-      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "di": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
-      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw="
-    },
-    "diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI="
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "doctrine": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "dom-serialize": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
-      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
-      "requires": {
-        "custom-event": "~1.0.0",
-        "ent": "~2.2.0",
-        "extend": "^3.0.0",
-        "void-elements": "^2.0.0"
-      }
-    },
-    "dom-serializer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
-      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
-      "requires": {
-        "domelementtype": "~1.1.1",
-        "entities": "~1.1.1"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
-          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
-        }
-      }
-    },
-    "dom5": {
-      "version": "1.3.6",
-      "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz",
-      "integrity": "sha1-pwiKn8XzsI3J9u2kx6uuskGUXg0=",
-      "requires": {
-        "@types/clone": "^0.1.29",
-        "@types/node": "^4.0.30",
-        "@types/parse5": "^0.0.31",
-        "clone": "^1.0.2",
-        "parse5": "^1.4.1"
-      }
-    },
-    "domain-browser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto="
-    },
-    "domelementtype": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
-      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
-    },
-    "domhandler": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
-      "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=",
-      "requires": {
-        "domelementtype": "1"
-      }
-    },
-    "domutils": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-      "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=",
-      "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "dot-prop": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
-      "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=",
-      "requires": {
-        "is-obj": "^1.0.0"
-      }
-    },
-    "dot-prop-immutable": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/dot-prop-immutable/-/dot-prop-immutable-1.5.0.tgz",
-      "integrity": "sha512-YcnAEqxtJSect/W3taJeMkKhDrL7NzzvgKlJ515m5aGxJBJpzetXf0wZbGapdrBNwAItWvb4sOn+jX0RBYYM1g=="
-    },
-    "duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
-    },
-    "duplexify": {
-      "version": "3.6.1",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
-      "integrity": "sha1-saeinEq/1jlYXvrszoDWZrHjQSU=",
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
-    },
-    "elliptic": {
-      "version": "6.4.1",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
-      "integrity": "sha1-wtC3d2kRuGcixjLDwGxg8vgZk5o=",
-      "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
-      }
-    },
-    "emojis-list": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
-    },
-    "end-of-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-      "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=",
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "engine.io": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
-      "integrity": "sha1-tgKBw1SEpw7gNR6g6/+D7IyVIqI=",
-      "requires": {
-        "accepts": "~1.3.4",
-        "base64id": "1.0.0",
-        "cookie": "0.3.1",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.0",
-        "ws": "~3.3.1"
-      },
-      "dependencies": {
-        "ws": {
-          "version": "3.3.3",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
-          "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=",
-          "requires": {
-            "async-limiter": "~1.0.0",
-            "safe-buffer": "~5.1.0",
-            "ultron": "~1.1.0"
-          }
-        }
-      }
-    },
-    "engine.io-client": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
-      "integrity": "sha1-b1TAR13khxWKGnx30QF4cItq3TY=",
-      "requires": {
-        "component-emitter": "1.2.1",
-        "component-inherit": "0.0.3",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.1",
-        "has-cors": "1.1.0",
-        "indexof": "0.0.1",
-        "parseqs": "0.0.5",
-        "parseuri": "0.0.5",
-        "ws": "~3.3.1",
-        "xmlhttprequest-ssl": "~1.5.4",
-        "yeast": "0.1.2"
-      },
-      "dependencies": {
-        "ws": {
-          "version": "3.3.3",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
-          "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=",
-          "requires": {
-            "async-limiter": "~1.0.0",
-            "safe-buffer": "~5.1.0",
-            "ultron": "~1.1.0"
-          }
-        }
-      }
-    },
-    "engine.io-parser": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz",
-      "integrity": "sha1-dXq5cPvy37Mse3SwMyFtVznveaY=",
-      "requires": {
-        "after": "0.8.2",
-        "arraybuffer.slice": "~0.0.7",
-        "base64-arraybuffer": "0.1.5",
-        "blob": "0.0.5",
-        "has-binary2": "~1.0.2"
-      }
-    },
-    "enhanced-resolve": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
-      "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=",
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.4.0",
-        "tapable": "^1.0.0"
-      }
-    },
-    "ent": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
-      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0="
-    },
-    "entities": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
-      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
-    },
-    "errno": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
-      "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=",
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es-abstract": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
-      "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=",
-      "requires": {
-        "es-to-primitive": "^1.1.1",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.1",
-        "is-callable": "^1.1.3",
-        "is-regex": "^1.0.4"
-      }
-    },
-    "es-to-primitive": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
-      "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=",
-      "requires": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      }
-    },
-    "es5-ext": {
-      "version": "0.10.46",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz",
-      "integrity": "sha1-79mfZ8Wn7Hibqj2qf3mHA4j39XI=",
-      "requires": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.1",
-        "next-tick": "1"
-      }
-    },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "es6-promise": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz",
-      "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw="
-    },
-    "es6-promisify": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
-      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-      "requires": {
-        "es6-promise": "^4.0.3"
-      },
-      "dependencies": {
-        "es6-promise": {
-          "version": "4.2.6",
-          "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
-          "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q=="
-        }
-      }
-    },
-    "es6-symbol": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
-      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-    },
-    "escodegen": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
-      "integrity": "sha1-snqTiUgdW/1b7Hb3ux6z+PRVZYk=",
-      "requires": {
-        "esprima": "^3.1.3",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.6.1"
-      }
-    },
-    "eslint": {
-      "version": "4.19.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
-      "integrity": "sha1-MtHWU+HZBAiFS/spbwdux+GGowA=",
-      "requires": {
-        "ajv": "^5.3.0",
-        "babel-code-frame": "^6.22.0",
-        "chalk": "^2.1.0",
-        "concat-stream": "^1.6.0",
-        "cross-spawn": "^5.1.0",
-        "debug": "^3.1.0",
-        "doctrine": "^2.1.0",
-        "eslint-scope": "^3.7.1",
-        "eslint-visitor-keys": "^1.0.0",
-        "espree": "^3.5.4",
-        "esquery": "^1.0.0",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^2.0.0",
-        "functional-red-black-tree": "^1.0.1",
-        "glob": "^7.1.2",
-        "globals": "^11.0.1",
-        "ignore": "^3.3.3",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^3.0.6",
-        "is-resolvable": "^1.0.0",
-        "js-yaml": "^3.9.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.4",
-        "minimatch": "^3.0.2",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.2",
-        "path-is-inside": "^1.0.2",
-        "pluralize": "^7.0.0",
-        "progress": "^2.0.0",
-        "regexpp": "^1.0.1",
-        "require-uncached": "^1.0.3",
-        "semver": "^5.3.0",
-        "strip-ansi": "^4.0.0",
-        "strip-json-comments": "~2.0.1",
-        "table": "4.0.2",
-        "text-table": "~0.2.0"
-      }
-    },
-    "eslint-config-google": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.6.0.tgz",
-      "integrity": "sha1-xULsGPsyR5g6wWu6MWYtAWJbdj8=",
-      "requires": {
-        "eslint-config-xo": "^0.13.0"
-      }
-    },
-    "eslint-config-xo": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.13.0.tgz",
-      "integrity": "sha1-+RZ2VDK6Z9L8enF3uLz+8/brBWQ="
-    },
-    "eslint-plugin-html": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.5.tgz",
-      "integrity": "sha1-6Ox+FkhRJEYPO/8xIBb+sKVNllk=",
-      "requires": {
-        "htmlparser2": "^3.8.2"
-      }
-    },
-    "eslint-scope": {
-      "version": "3.7.3",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
-      "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=",
-      "requires": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
-      "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0="
-    },
-    "espree": {
-      "version": "3.5.4",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
-      "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=",
-      "requires": {
-        "acorn": "^5.5.0",
-        "acorn-jsx": "^3.0.0"
-      }
-    },
-    "esprima": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
-      "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
-    },
-    "esquery": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
-      "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=",
-      "requires": {
-        "estraverse": "^4.0.0"
-      }
-    },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
-      "requires": {
-        "estraverse": "^4.1.0"
-      }
-    },
-    "estraverse": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
-    },
-    "eventemitter3": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
-      "integrity": "sha1-LT1I+cNGaY/Og6hdfWZOmFNd9uc="
-    },
-    "events": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
-      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "execa": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
-      "requires": {
-        "cross-spawn": "^5.0.1",
-        "get-stream": "^3.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      }
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "external-editor": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
-      "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=",
-      "requires": {
-        "chardet": "^0.4.0",
-        "iconv-lite": "^0.4.17",
-        "tmp": "^0.0.33"
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=",
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "extract-zip": {
-      "version": "1.6.7",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
-      "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
-      "requires": {
-        "concat-stream": "1.6.2",
-        "debug": "2.6.9",
-        "mkdirp": "0.5.1",
-        "yauzl": "2.4.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "fast-deep-equal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
-    },
-    "fd-slicer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
-      "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
-      "requires": {
-        "pend": "~1.2.0"
-      }
-    },
-    "figures": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
-      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
-      "requires": {
-        "escape-string-regexp": "^1.0.5"
-      }
-    },
-    "file-entry-cache": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
-      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
-      "requires": {
-        "flat-cache": "^1.2.1",
-        "object-assign": "^4.0.1"
-      }
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "finalhandler": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
-      "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.1",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "statuses": "~1.3.1",
-        "unpipe": "~1.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "find-cache-dir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
-      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
-      "requires": {
-        "commondir": "^1.0.1",
-        "make-dir": "^1.0.0",
-        "pkg-dir": "^2.0.0"
-      }
-    },
-    "find-replace": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
-      "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
-      "requires": {
-        "array-back": "^3.0.1"
-      }
-    },
-    "find-up": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "requires": {
-        "locate-path": "^2.0.0"
-      }
-    },
-    "flat-cache": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
-      "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
-      "requires": {
-        "circular-json": "^0.3.1",
-        "del": "^2.0.2",
-        "graceful-fs": "^4.1.2",
-        "write": "^0.2.1"
-      }
-    },
-    "flatted": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
-      "integrity": "sha1-VRIrZTbqSWtLRIk+4mCBQdENmRY="
-    },
-    "flush-write-stream": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
-      "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.4"
-      }
-    },
-    "follow-redirects": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
-      "integrity": "sha1-SJ68GY3A5/ZBZ70jsDxMGbV4THY=",
-      "requires": {
-        "debug": "^3.2.6"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
-        }
-      }
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "from2": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
-      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "fs-access": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
-      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
-      "requires": {
-        "null-check": "^1.0.0"
-      }
-    },
-    "fs-extra": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-      "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=",
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      }
-    },
-    "fs-write-stream-atomic": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
-      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "iferr": "^0.1.5",
-        "imurmurhash": "^0.1.4",
-        "readable-stream": "1 || 2"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "fsevents": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
-      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
-      "optional": true,
-      "requires": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.12.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "deep-extend": {
-          "version": "0.6.0",
-          "bundled": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.3",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true
-        },
-        "minipass": {
-          "version": "2.3.5",
-          "bundled": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.2.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.3.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "debug": "^4.1.0",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.12.0",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.1",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.2.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.6",
-          "bundled": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.4.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.8",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.6.0",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "bundled": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.7.0",
-          "bundled": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.8",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.1.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.3.4",
-            "minizlib": "^1.1.1",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.3",
-          "bundled": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2 || 2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true
-        },
-        "yallist": {
-          "version": "3.0.3",
-          "bundled": true
-        }
-      }
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
-    },
-    "get-func-name": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
-      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
-    },
-    "get-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
-      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
-    },
-    "glob": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-      "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "global-dirs": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
-      "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
-      "requires": {
-        "ini": "^1.3.4"
-      }
-    },
-    "globals": {
-      "version": "11.7.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
-      "integrity": "sha1-pYP6pDBVsayncZFL9oJY4vwSVnM="
-    },
-    "globby": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
-      "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
-      "requires": {
-        "array-union": "^1.0.1",
-        "arrify": "^1.0.0",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "got": {
-      "version": "6.7.1",
-      "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
-      "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
-      "requires": {
-        "create-error-class": "^3.0.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^3.0.0",
-        "is-redirect": "^1.0.0",
-        "is-retry-allowed": "^1.0.0",
-        "is-stream": "^1.0.0",
-        "lowercase-keys": "^1.0.0",
-        "safe-buffer": "^5.0.1",
-        "timed-out": "^4.0.0",
-        "unzip-response": "^2.0.1",
-        "url-parse-lax": "^1.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
-    },
-    "growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4="
-    },
-    "handlebars": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
-      "integrity": "sha1-trN8HO0DBrIh4JT8eso+wjsTG2c=",
-      "requires": {
-        "neo-async": "^2.6.0",
-        "optimist": "^0.6.1",
-        "source-map": "^0.6.1",
-        "uglify-js": "^3.1.4"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.20.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-          "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
-          "optional": true
-        },
-        "uglify-js": {
-          "version": "3.5.9",
-          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.9.tgz",
-          "integrity": "sha512-WpT0RqsDtAWPNJK955DEnb6xjymR8Fn0OlK4TT4pS0ASYsVPqr5ELhgwOwLCP5J5vHeJ4xmMmz3DEgdqC10JeQ==",
-          "optional": true,
-          "requires": {
-            "commander": "~2.20.0",
-            "source-map": "~0.6.1"
-          }
-        }
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-binary2": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
-      "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=",
-      "requires": {
-        "isarray": "2.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
-          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
-        }
-      }
-    },
-    "has-cors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-    },
-    "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q="
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "hash.js": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
-      "integrity": "sha1-44q0uF37HgxA/pJlwOm1SFTCOBI=",
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "hosted-git-info": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
-      "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc="
-    },
-    "htmlparser2": {
-      "version": "3.9.2",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
-      "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
-      "requires": {
-        "domelementtype": "^1.3.0",
-        "domhandler": "^2.3.0",
-        "domutils": "^1.5.1",
-        "entities": "^1.1.1",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "http-proxy": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
-      "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=",
-      "requires": {
-        "eventemitter3": "^3.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-    },
-    "https-proxy-agent": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
-      "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=",
-      "requires": {
-        "agent-base": "^4.1.0",
-        "debug": "^3.1.0"
-      }
-    },
-    "hydrolysis": {
-      "version": "1.25.0",
-      "resolved": "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz",
-      "integrity": "sha1-pPsUo3oeA7DbUtiqpXxoInKhTYQ=",
-      "requires": {
-        "acorn": "^3.2.0",
-        "babel-polyfill": "^6.2.0",
-        "doctrine": "^0.7.0",
-        "dom5": "1.1.0",
-        "escodegen": "^1.7.0",
-        "espree": "^3.1.3",
-        "estraverse": "^3.1.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "3.3.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
-        },
-        "doctrine": {
-          "version": "0.7.2",
-          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
-          "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
-          "requires": {
-            "esutils": "^1.1.6",
-            "isarray": "0.0.1"
-          }
-        },
-        "dom5": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz",
-          "integrity": "sha1-Ogx3AMCDq0xNJpOKeLDwxtzDd5Q=",
-          "requires": {
-            "parse5": "^1.4.1"
-          }
-        },
-        "estraverse": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz",
-          "integrity": "sha1-FeKKRGuLgrxwDMyLlseK9NoNbLo="
-        },
-        "esutils": {
-          "version": "1.1.6",
-          "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz",
-          "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U="
-        },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-        }
-      }
-    },
-    "iconv-lite": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
-      "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=",
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ieee754": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
-      "integrity": "sha1-UL8k5bnIu5ivSWTJQc2wkY2ntgs="
-    },
-    "iferr": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
-      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
-    },
-    "ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM="
-    },
-    "import-lazy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
-    },
-    "import-local": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
-      "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=",
-      "requires": {
-        "pkg-dir": "^2.0.0",
-        "resolve-cwd": "^2.0.0"
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
-    },
-    "indent": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
-      "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk="
-    },
-    "indent-string": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
-      "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok="
-    },
-    "indexof": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
-      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc="
-    },
-    "inquirer": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
-      "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=",
-      "requires": {
-        "ansi-escapes": "^3.0.0",
-        "chalk": "^2.0.0",
-        "cli-cursor": "^2.1.0",
-        "cli-width": "^2.0.0",
-        "external-editor": "^2.0.4",
-        "figures": "^2.0.0",
-        "lodash": "^4.3.0",
-        "mute-stream": "0.0.7",
-        "run-async": "^2.2.0",
-        "rx-lite": "^4.0.8",
-        "rx-lite-aggregates": "^4.0.8",
-        "string-width": "^2.1.0",
-        "strip-ansi": "^4.0.0",
-        "through": "^2.3.6"
-      }
-    },
-    "invariant": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-      "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=",
-      "requires": {
-        "loose-envify": "^1.0.0"
-      }
-    },
-    "irregular-plurals": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz",
-      "integrity": "sha1-OdQPBbAPZW0Lf6RxIw3TtxSvKHI="
-    },
-    "is-accessor-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "requires": {
-        "binary-extensions": "^1.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4="
-    },
-    "is-builtin-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
-      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
-      "requires": {
-        "builtin-modules": "^1.0.0"
-      }
-    },
-    "is-callable": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
-      "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU="
-    },
-    "is-ci": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
-      "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=",
-      "requires": {
-        "ci-info": "^1.5.0"
-      }
-    },
-    "is-data-descriptor": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-date-object": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
-      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
-    },
-    "is-descriptor": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-      "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=",
-      "requires": {
-        "is-accessor-descriptor": "^0.1.6",
-        "is-data-descriptor": "^0.1.4",
-        "kind-of": "^5.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0="
-        }
-      }
-    },
-    "is-directory": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
-      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
-    },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
-    },
-    "is-glob": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
-      "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-installed-globally": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
-      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
-      "requires": {
-        "global-dirs": "^0.1.0",
-        "is-path-inside": "^1.0.0"
-      }
-    },
-    "is-npm": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
-      "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
-    },
-    "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
-    },
-    "is-path-in-cwd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
-      "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=",
-      "requires": {
-        "is-path-inside": "^1.0.0"
-      }
-    },
-    "is-path-inside": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
-      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
-      "requires": {
-        "path-is-inside": "^1.0.1"
-      }
-    },
-    "is-plain-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
-    },
-    "is-redirect": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
-      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
-    },
-    "is-regex": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
-      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
-      "requires": {
-        "has": "^1.0.1"
-      }
-    },
-    "is-resolvable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-      "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg="
-    },
-    "is-retry-allowed": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
-      "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
-    },
-    "is-symbol": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
-      "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=",
-      "requires": {
-        "has-symbols": "^1.0.0"
-      }
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0="
-    },
-    "is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "isbinaryfile": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
-      "integrity": "sha1-XW3vPt6/boyoyunDAYOoBLX4voA=",
-      "requires": {
-        "buffer-alloc": "^1.2.0"
-      }
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
-    },
-    "istanbul": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
-      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
-      "requires": {
-        "abbrev": "1.0.x",
-        "async": "1.x",
-        "escodegen": "1.8.x",
-        "esprima": "2.7.x",
-        "glob": "^5.0.15",
-        "handlebars": "^4.0.1",
-        "js-yaml": "3.x",
-        "mkdirp": "0.5.x",
-        "nopt": "3.x",
-        "once": "1.x",
-        "resolve": "1.1.x",
-        "supports-color": "^3.1.0",
-        "which": "^1.1.1",
-        "wordwrap": "^1.0.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.0.9",
-          "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
-          "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU="
-        },
-        "async": {
-          "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
-        },
-        "escodegen": {
-          "version": "1.8.1",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
-          "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
-          "requires": {
-            "esprima": "^2.7.1",
-            "estraverse": "^1.9.1",
-            "esutils": "^2.0.2",
-            "optionator": "^0.8.1",
-            "source-map": "~0.2.0"
-          }
-        },
-        "esprima": {
-          "version": "2.7.3",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
-          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
-        },
-        "estraverse": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
-          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q="
-        },
-        "glob": {
-          "version": "5.0.15",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
-          "requires": {
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "2 || 3",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
-        },
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
-        },
-        "source-map": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
-          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
-          "optional": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-          "requires": {
-            "has-flag": "^1.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-instrumenter-loader": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
-      "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=",
-      "requires": {
-        "convert-source-map": "^1.5.0",
-        "istanbul-lib-instrument": "^1.7.3",
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^0.3.0"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
-          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
-          "requires": {
-            "ajv": "^5.0.0"
-          }
-        }
-      }
-    },
-    "istanbul-lib-coverage": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
-      "integrity": "sha1-zPftzQoLubj3Kf7rCTBHD5r2ZPA="
-    },
-    "istanbul-lib-instrument": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
-      "integrity": "sha1-H1XtEKw8R/K93dUweTUSZ1TQqco=",
-      "requires": {
-        "babel-generator": "^6.18.0",
-        "babel-template": "^6.16.0",
-        "babel-traverse": "^6.18.0",
-        "babel-types": "^6.18.0",
-        "babylon": "^6.18.0",
-        "istanbul-lib-coverage": "^1.2.1",
-        "semver": "^5.3.0"
-      }
-    },
-    "js-tokens": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
-    },
-    "js-yaml": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "dependencies": {
-        "esprima": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE="
-        }
-      }
-    },
-    "jsesc": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
-    },
-    "json-parse-better-errors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
-      "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk="
-    },
-    "json-schema-traverse": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
-    },
-    "json5": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
-    },
-    "jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "requires": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "jsonschema": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz",
-      "integrity": "sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA=="
-    },
-    "just-extend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz",
-      "integrity": "sha1-8/R/ffyg+YnFVBCn68iFSwcQivw="
-    },
-    "karma": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz",
-      "integrity": "sha1-0HOHyXQ6V1tA+vc+ij61Qhwhk+E=",
-      "requires": {
-        "bluebird": "^3.3.0",
-        "body-parser": "^1.16.1",
-        "braces": "^2.3.2",
-        "chokidar": "^2.0.3",
-        "colors": "^1.1.0",
-        "connect": "^3.6.0",
-        "core-js": "^2.2.0",
-        "di": "^0.0.1",
-        "dom-serialize": "^2.2.0",
-        "flatted": "^2.0.0",
-        "glob": "^7.1.1",
-        "graceful-fs": "^4.1.2",
-        "http-proxy": "^1.13.0",
-        "isbinaryfile": "^3.0.0",
-        "lodash": "^4.17.11",
-        "log4js": "^4.0.0",
-        "mime": "^2.3.1",
-        "minimatch": "^3.0.2",
-        "optimist": "^0.6.1",
-        "qjobs": "^1.1.4",
-        "range-parser": "^1.2.0",
-        "rimraf": "^2.6.0",
-        "safe-buffer": "^5.0.1",
-        "socket.io": "2.1.1",
-        "source-map": "^0.6.1",
-        "tmp": "0.0.33",
-        "useragent": "2.3.0"
-      },
-      "dependencies": {
-        "lodash": {
-          "version": "4.17.11",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-          "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
-        }
-      }
-    },
-    "karma-chrome-launcher": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
-      "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=",
-      "requires": {
-        "fs-access": "^1.0.0",
-        "which": "^1.2.1"
-      }
-    },
-    "karma-coverage": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz",
-      "integrity": "sha1-zAnc61iagxAayl/nDCh2Re84dok=",
-      "requires": {
-        "dateformat": "^1.0.6",
-        "istanbul": "^0.4.0",
-        "lodash": "^4.17.0",
-        "minimatch": "^3.0.0",
-        "source-map": "^0.5.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "karma-mocha": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz",
-      "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=",
-      "requires": {
-        "minimist": "1.2.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "karma-sinon": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.5.tgz",
-      "integrity": "sha1-TjRD8oMP3s/2JNN0cWPxIX2qKpo="
-    },
-    "karma-sourcemap-loader": {
-      "version": "0.3.7",
-      "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz",
-      "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=",
-      "requires": {
-        "graceful-fs": "^4.1.2"
-      }
-    },
-    "karma-webpack": {
-      "version": "4.0.0-rc.6",
-      "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-4.0.0-rc.6.tgz",
-      "integrity": "sha1-AqxqR8f8FmyLIIRGBppCRpgIJAU=",
-      "requires": {
-        "async": "^2.0.0",
-        "loader-utils": "^1.1.0",
-        "source-map": "^0.5.6",
-        "webpack-dev-middleware": "^3.2.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "kind-of": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-      "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE="
-    },
-    "latest-version": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
-      "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
-      "requires": {
-        "package-json": "^4.0.0"
-      }
-    },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "requires": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      }
-    },
-    "lit-element": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.1.0.tgz",
-      "integrity": "sha1-hbw/HaAif0sT3oob6Xgim5+jJ+k=",
-      "requires": {
-        "lit-html": "^1.0.0"
-      }
-    },
-    "lit-html": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.0.0.tgz",
-      "integrity": "sha1-PcN4GoymiptcL/KmHiY2YrmyJns="
-    },
-    "load-json-file": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
-      "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^4.0.0",
-        "pify": "^3.0.0",
-        "strip-bom": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
-        }
-      }
-    },
-    "loader-runner": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz",
-      "integrity": "sha1-Am8S/nwxFZkolqwCugIrqSlxuXk="
-    },
-    "loader-utils": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
-      "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
-      "requires": {
-        "big.js": "^3.1.3",
-        "emojis-list": "^2.0.0",
-        "json5": "^0.5.0"
-      }
-    },
-    "locate-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "requires": {
-        "p-locate": "^2.0.0",
-        "path-exists": "^3.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.11",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-      "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40="
-    },
-    "lodash.camelcase": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
-      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
-    },
-    "lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
-    },
-    "lodash.padend": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
-      "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4="
-    },
-    "lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
-    },
-    "log-symbols": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
-      "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=",
-      "requires": {
-        "chalk": "^2.0.1"
-      }
-    },
-    "log4js": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.1.0.tgz",
-      "integrity": "sha1-V5g8akQ1RqjIYH6csEXSoRfCdkQ=",
-      "requires": {
-        "date-format": "^2.0.0",
-        "debug": "^4.1.1",
-        "flatted": "^2.0.0",
-        "rfdc": "^1.1.2",
-        "streamroller": "^1.0.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
-        }
-      }
-    },
-    "loglevelnext": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz",
-      "integrity": "sha1-NvxPWZbWZA9Tn/IDuoGWQWgNdaI=",
-      "requires": {
-        "es6-symbol": "^3.1.1",
-        "object.assign": "^4.1.0"
-      }
-    },
-    "lolex": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.0.1.tgz",
-      "integrity": "sha1-SpnCJRV51pPGoINEba4OXDhE0/o="
-    },
-    "loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=",
-      "requires": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      }
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
-    "lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8="
-    },
-    "lru-cache": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
-      "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=",
-      "requires": {
-        "pseudomap": "^1.0.2",
-        "yallist": "^2.1.2"
-      }
-    },
-    "magic-string": {
-      "version": "0.22.5",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
-      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
-      "requires": {
-        "vlq": "^0.2.2"
-      }
-    },
-    "make-dir": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
-      "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=",
-      "requires": {
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
-        }
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
-    },
-    "map-obj": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
-      "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk="
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "meant": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz",
-      "integrity": "sha1-ZgRP6i8jIw7IBvtRXv6inETSEV0="
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
-    },
-    "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
-      "requires": {
-        "errno": "^0.1.3",
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "meow": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz",
-      "integrity": "sha1-38c9Y6mvxxSl43F2DrXIi5EHiqQ=",
-      "requires": {
-        "camelcase-keys": "^4.0.0",
-        "decamelize-keys": "^1.0.0",
-        "loud-rejection": "^1.0.0",
-        "minimist-options": "^3.0.1",
-        "normalize-package-data": "^2.3.4",
-        "read-pkg-up": "^3.0.0",
-        "redent": "^2.0.0",
-        "trim-newlines": "^2.0.0",
-        "yargs-parser": "^10.0.0"
-      }
-    },
-    "merge-options": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz",
-      "integrity": "sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=",
-      "requires": {
-        "is-plain-obj": "^1.1"
-      }
-    },
-    "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=",
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      }
-    },
-    "mime": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz",
-      "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg=="
-    },
-    "mime-db": {
-      "version": "1.40.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
-      "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI="
-    },
-    "mime-types": {
-      "version": "2.1.24",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
-      "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=",
-      "requires": {
-        "mime-db": "1.40.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc="
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-    },
-    "minimist-options": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
-      "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=",
-      "requires": {
-        "arrify": "^1.0.1",
-        "is-plain-obj": "^1.1.0"
-      }
-    },
-    "mississippi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
-      "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=",
-      "requires": {
-        "concat-stream": "^1.5.0",
-        "duplexify": "^3.4.2",
-        "end-of-stream": "^1.1.0",
-        "flush-write-stream": "^1.0.0",
-        "from2": "^2.1.0",
-        "parallel-transform": "^1.1.0",
-        "pump": "^2.0.1",
-        "pumpify": "^1.3.3",
-        "stream-each": "^1.1.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "mixin-deep": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
-      "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=",
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=",
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "requires": {
-        "minimist": "0.0.8"
-      }
-    },
-    "mocha": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
-      "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=",
-      "requires": {
-        "browser-stdout": "1.3.1",
-        "commander": "2.15.1",
-        "debug": "3.1.0",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "glob": "7.1.2",
-        "growl": "1.10.5",
-        "he": "1.1.1",
-        "minimatch": "3.0.4",
-        "mkdirp": "0.5.1",
-        "supports-color": "5.4.0"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.15.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-          "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8="
-        },
-        "he": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-          "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
-        },
-        "supports-color": {
-          "version": "5.4.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
-          "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "move-concurrently": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
-      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
-      "requires": {
-        "aproba": "^1.1.1",
-        "copy-concurrently": "^1.0.0",
-        "fs-write-stream-atomic": "^1.0.8",
-        "mkdirp": "^0.5.1",
-        "rimraf": "^2.5.4",
-        "run-queue": "^1.0.3"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-    },
-    "mute-stream": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
-      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
-    },
-    "nan": {
-      "version": "2.13.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
-      "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==",
-      "optional": true
-    },
-    "nanomatch": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-      "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=",
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
-    },
-    "negotiator": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-      "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
-    },
-    "neo-async": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
-      "integrity": "sha1-udFeTXHGdikIZUtRg+04t1M0CDU="
-    },
-    "next-tick": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
-      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
-    },
-    "nise": {
-      "version": "1.4.10",
-      "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz",
-      "integrity": "sha1-rkagmiZDb66Ro4pgkZNWrm2xQ7Y=",
-      "requires": {
-        "@sinonjs/formatio": "^3.1.0",
-        "@sinonjs/text-encoding": "^0.7.1",
-        "just-extend": "^4.0.2",
-        "lolex": "^2.3.2",
-        "path-to-regexp": "^1.7.0"
-      },
-      "dependencies": {
-        "lolex": {
-          "version": "2.7.5",
-          "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz",
-          "integrity": "sha1-ETAB1Wv8fgLVbjYpHMXEE9GqBzM="
-        }
-      }
-    },
-    "node-libs-browser": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
-      "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=",
-      "requires": {
-        "assert": "^1.1.1",
-        "browserify-zlib": "^0.2.0",
-        "buffer": "^4.3.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "^1.0.0",
-        "crypto-browserify": "^3.11.0",
-        "domain-browser": "^1.1.1",
-        "events": "^1.0.0",
-        "https-browserify": "^1.0.0",
-        "os-browserify": "^0.3.0",
-        "path-browserify": "0.0.0",
-        "process": "^0.11.10",
-        "punycode": "^1.2.4",
-        "querystring-es3": "^0.2.0",
-        "readable-stream": "^2.3.3",
-        "stream-browserify": "^2.0.1",
-        "stream-http": "^2.7.2",
-        "string_decoder": "^1.0.0",
-        "timers-browserify": "^2.0.4",
-        "tty-browserify": "0.0.0",
-        "url": "^0.11.0",
-        "util": "^0.10.3",
-        "vm-browserify": "0.0.4"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-        }
-      }
-    },
-    "nopt": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "is-builtin-module": "^1.0.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "requires": {
-        "remove-trailing-separator": "^1.0.1"
-      }
-    },
-    "npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "requires": {
-        "path-key": "^2.0.0"
-      }
-    },
-    "null-check": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
-      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0="
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
-    "object-component": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
-      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-keys": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
-      "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI="
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=",
-      "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "object.values": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
-      "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
-      "requires": {
-        "define-properties": "^1.1.2",
-        "es-abstract": "^1.6.1",
-        "function-bind": "^1.1.0",
-        "has": "^1.0.1"
-      }
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
-      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
-      "requires": {
-        "mimic-fn": "^1.0.0"
-      }
-    },
-    "opn": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz",
-      "integrity": "sha1-y1Reeqt4VivrEao7+rxwQuF2EDU=",
-      "requires": {
-        "is-wsl": "^1.1.0"
-      }
-    },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      },
-      "dependencies": {
-        "wordwrap": {
-          "version": "0.0.3",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
-        }
-      }
-    },
-    "optionator": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
-      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
-      "requires": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.4",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "wordwrap": "~1.0.0"
-      }
-    },
-    "ora": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz",
-      "integrity": "sha1-bK8oMOuSSUGGHsU6FzeZ4Ai1Hls=",
-      "requires": {
-        "chalk": "^2.3.1",
-        "cli-cursor": "^2.1.0",
-        "cli-spinners": "^1.1.0",
-        "log-symbols": "^2.2.0",
-        "strip-ansi": "^4.0.0",
-        "wcwidth": "^1.0.1"
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
-    },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
-    },
-    "p-limit": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-      "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=",
-      "requires": {
-        "p-try": "^1.0.0"
-      }
-    },
-    "p-locate": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "requires": {
-        "p-limit": "^1.1.0"
-      }
-    },
-    "p-try": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
-    },
-    "package-json": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
-      "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
-      "requires": {
-        "got": "^6.7.1",
-        "registry-auth-token": "^3.0.1",
-        "registry-url": "^3.0.3",
-        "semver": "^5.1.0"
-      }
-    },
-    "pako": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
-      "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg="
-    },
-    "parallel-transform": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
-      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
-      "requires": {
-        "cyclist": "~0.2.2",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.1.5"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
-      "integrity": "sha1-9r8pOBgzK9DatU77Fgh3JHRebKg=",
-      "requires": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3"
-      }
-    },
-    "parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
-      "requires": {
-        "error-ex": "^1.3.1",
-        "json-parse-better-errors": "^1.0.1"
-      }
-    },
-    "parse5": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
-      "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
-    },
-    "parseqs": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
-      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseuri": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
-      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseurl": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
-      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
-    },
-    "path": {
-      "version": "0.12.7",
-      "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
-      "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
-      "requires": {
-        "process": "^0.11.1",
-        "util": "^0.10.3"
-      }
-    },
-    "path-browserify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
-      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo="
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
-    },
-    "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
-    },
-    "path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
-    },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw="
-    },
-    "path-posix": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz",
-      "integrity": "sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8="
-    },
-    "path-to-regexp": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
-      "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
-      "requires": {
-        "isarray": "0.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-        }
-      }
-    },
-    "path-type": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-      "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=",
-      "requires": {
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
-        }
-      }
-    },
-    "pathval": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
-      "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA="
-    },
-    "pbkdf2": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
-      "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=",
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
-    },
-    "pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "pkg-dir": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "requires": {
-        "find-up": "^2.1.0"
-      }
-    },
-    "plur": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/plur/-/plur-3.0.1.tgz",
-      "integrity": "sha1-JoZS1gX4FmmbQrhiSN5zyazQanw=",
-      "requires": {
-        "irregular-plurals": "^2.0.0"
-      }
-    },
-    "pluralize": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
-      "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c="
-    },
-    "polymer-analyzer": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.2.4.tgz",
-      "integrity": "sha512-JmxUhMajTuC18tLXbTtu2+aN2x9bTX+4MvCD4IZKJ0rtAL8jWi1iRLfogpHJB4Ig9Dc8EEEuEYipLuzPFl3vqA==",
-      "requires": {
-        "@babel/generator": "^7.0.0-beta.42",
-        "@babel/traverse": "^7.0.0-beta.42",
-        "@babel/types": "^7.0.0-beta.42",
-        "@types/babel-generator": "^6.25.1",
-        "@types/babel-traverse": "^6.25.2",
-        "@types/babel-types": "^6.25.1",
-        "@types/babylon": "^6.16.2",
-        "@types/chai-subset": "^1.3.0",
-        "@types/chalk": "^0.4.30",
-        "@types/clone": "^0.1.30",
-        "@types/cssbeautify": "^0.3.1",
-        "@types/doctrine": "^0.0.1",
-        "@types/is-windows": "^0.2.0",
-        "@types/minimatch": "^3.0.1",
-        "@types/parse5": "^2.2.34",
-        "@types/path-is-inside": "^1.0.0",
-        "@types/resolve": "0.0.6",
-        "@types/whatwg-url": "^6.4.0",
-        "babylon": "^7.0.0-beta.42",
-        "cancel-token": "^0.1.1",
-        "chalk": "^1.1.3",
-        "clone": "^2.0.0",
-        "cssbeautify": "^0.3.1",
-        "doctrine": "^2.0.2",
-        "dom5": "^3.0.0",
-        "indent": "0.0.2",
-        "is-windows": "^1.0.2",
-        "jsonschema": "^1.1.0",
-        "minimatch": "^3.0.4",
-        "parse5": "^4.0.0",
-        "path-is-inside": "^1.0.2",
-        "resolve": "^1.5.0",
-        "shady-css-parser": "^0.1.0",
-        "stable": "^0.1.6",
-        "strip-indent": "^2.0.0",
-        "vscode-uri": "=1.0.6",
-        "whatwg-url": "^6.4.0"
-      },
-      "dependencies": {
-        "@types/babel-types": {
-          "version": "6.25.2",
-          "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
-          "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA=="
-        },
-        "@types/parse5": {
-          "version": "2.2.34",
-          "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
-          "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
-          "requires": {
-            "@types/node": "*"
-          }
-        },
-        "babylon": {
-          "version": "7.0.0-beta.47",
-          "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz",
-          "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ=="
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "clone": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
-        },
-        "dom5": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz",
-          "integrity": "sha512-JPFiouQIr16VQ4dX6i0+Hpbg3H2bMKPmZ+WZgBOSSvOPx9QHwwY8sPzeM2baUtViESYto6wC2nuZOMC/6gulcA==",
-          "requires": {
-            "@types/parse5": "^2.2.34",
-            "clone": "^2.1.0",
-            "parse5": "^4.0.0"
-          }
-        },
-        "parse5": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "polymer-bundler": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-4.0.10.tgz",
-      "integrity": "sha512-nwlN3LQlQDqbZ2sUH3394C/dHZUDHq8tpdS5HARvPDb0Q9IXWD+znOR1cr7wSjF0EZN4LiUH5hWyUoV4QSjhpQ==",
-      "requires": {
-        "@types/babel-generator": "^6.25.1",
-        "@types/babel-traverse": "^6.25.3",
-        "babel-generator": "^6.26.1",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "clone": "^2.1.0",
-        "command-line-args": "^5.0.2",
-        "command-line-usage": "^5.0.5",
-        "dom5": "^3.0.0",
-        "espree": "^3.5.2",
-        "magic-string": "^0.22.4",
-        "mkdirp": "^0.5.1",
-        "parse5": "^4.0.0",
-        "polymer-analyzer": "^3.2.2",
-        "rollup": "^1.3.0",
-        "source-map": "^0.5.6",
-        "vscode-uri": "=1.0.6"
-      },
-      "dependencies": {
-        "@types/parse5": {
-          "version": "2.2.34",
-          "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
-          "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
-          "requires": {
-            "@types/node": "*"
-          }
-        },
-        "clone": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
-        },
-        "dom5": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz",
-          "integrity": "sha512-JPFiouQIr16VQ4dX6i0+Hpbg3H2bMKPmZ+WZgBOSSvOPx9QHwwY8sPzeM2baUtViESYto6wC2nuZOMC/6gulcA==",
-          "requires": {
-            "@types/parse5": "^2.2.34",
-            "clone": "^2.1.0",
-            "parse5": "^4.0.0"
-          }
-        },
-        "parse5": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA=="
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
-    },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
-    },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
-    },
-    "pretty-bytes": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz",
-      "integrity": "sha1-Yjfs+9xlJb6u9N5yLMYKWK4ObG0="
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
-    },
-    "process-nextick-args": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o="
-    },
-    "progress": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
-      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
-    },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
-    },
-    "proxy-from-env": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
-      "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
-    },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
-    },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "pump": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-      "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=",
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=",
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
-    },
-    "puppeteer": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.15.0.tgz",
-      "integrity": "sha512-D2y5kwA9SsYkNUmcBzu9WZ4V1SGHiQTmgvDZSx6sRYFsgV25IebL4V6FaHjF6MbwLK9C6f3G3pmck9qmwM8H3w==",
-      "requires": {
-        "debug": "^4.1.0",
-        "extract-zip": "^1.6.6",
-        "https-proxy-agent": "^2.2.1",
-        "mime": "^2.0.3",
-        "progress": "^2.0.1",
-        "proxy-from-env": "^1.0.0",
-        "rimraf": "^2.6.1",
-        "ws": "^6.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
-        },
-        "progress": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-          "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
-        }
-      }
-    },
-    "qjobs": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
-      "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE="
-    },
-    "qs": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-      "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw="
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
-    },
-    "quick-lru": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
-      "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g="
-    },
-    "randombytes": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
-      "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=",
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=",
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "range-parser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
-      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
-    },
-    "raw-body": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
-      "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=",
-      "requires": {
-        "bytes": "3.1.0",
-        "http-errors": "1.7.2",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "http-errors": {
-          "version": "1.7.2",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-          "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
-        }
-      }
-    },
-    "rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=",
-      "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "read-pkg": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
-      "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
-      "requires": {
-        "load-json-file": "^4.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^3.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
-      "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
-      "requires": {
-        "find-up": "^2.0.0",
-        "read-pkg": "^3.0.0"
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-      "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=",
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "redent": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
-      "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
-      "requires": {
-        "indent-string": "^3.0.0",
-        "strip-indent": "^2.0.0"
-      }
-    },
-    "reduce-flatten": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
-      "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc="
-    },
-    "redux": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz",
-      "integrity": "sha1-Q2yubMQPvkcnaJ18j65EgI8b/vU=",
-      "requires": {
-        "loose-envify": "^1.4.0",
-        "symbol-observable": "^1.2.0"
-      }
-    },
-    "regenerator-runtime": {
-      "version": "0.10.5",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
-      "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=",
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "regexpp": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
-      "integrity": "sha1-DjUW3Qt5BPQT0tQZPc5GGMOmias="
-    },
-    "registry-auth-token": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
-      "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=",
-      "requires": {
-        "rc": "^1.1.6",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "registry-url": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
-      "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
-      "requires": {
-        "rc": "^1.0.1"
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4="
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "require-uncached": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
-      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
-      "requires": {
-        "caller-path": "^0.1.0",
-        "resolve-from": "^1.0.0"
-      }
-    },
-    "requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
-    },
-    "resolve": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
-      "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=",
-      "requires": {
-        "path-parse": "^1.0.5"
-      }
-    },
-    "resolve-cwd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
-      "requires": {
-        "resolve-from": "^3.0.0"
-      },
-      "dependencies": {
-        "resolve-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
-        }
-      }
-    },
-    "resolve-from": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
-      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
-    },
-    "restore-cursor": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
-      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
-      "requires": {
-        "onetime": "^2.0.0",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w="
-    },
-    "rfdc": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
-      "integrity": "sha1-5uctdPXcOd6PU49l4Aw2wYAY40k="
-    },
-    "rimraf": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
-      "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
-      "requires": {
-        "glob": "^7.0.5"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "rollup": {
-      "version": "1.32.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz",
-      "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==",
-      "requires": {
-        "@types/estree": "*",
-        "@types/node": "*",
-        "acorn": "^7.1.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
-          "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w=="
-        }
-      }
-    },
-    "run-async": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
-      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
-      "requires": {
-        "is-promise": "^2.1.0"
-      }
-    },
-    "run-queue": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
-      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
-      "requires": {
-        "aproba": "^1.1.1"
-      }
-    },
-    "rx-lite": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
-      "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
-    },
-    "rx-lite-aggregates": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
-      "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
-      "requires": {
-        "rx-lite": "*"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
-    },
-    "schema-utils": {
-      "version": "0.4.7",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
-      "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=",
-      "requires": {
-        "ajv": "^6.1.0",
-        "ajv-keywords": "^3.1.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.5.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
-          "integrity": "sha1-JH1SdBENtlNwa1UPzCt5fKKM/Fk=",
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-keywords": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
-          "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo="
-        },
-        "fast-deep-equal": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
-        }
-      }
-    },
-    "semver": {
-      "version": "5.5.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
-      "integrity": "sha1-ff3YgUvbfKvHvg+x1zTPtmyUBHc="
-    },
-    "semver-diff": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
-      "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
-      "requires": {
-        "semver": "^5.0.3"
-      }
-    },
-    "serialize-javascript": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
-      "integrity": "sha1-GqM2FiyIqJDdrVOEuuvJOmVRYf4="
-    },
-    "set-value": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
-      "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=",
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "shady-css-parser": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
-      "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA=="
-    },
-    "shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "requires": {
-        "shebang-regex": "^1.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
-    },
-    "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
-    },
-    "sinon": {
-      "version": "7.3.2",
-      "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz",
-      "integrity": "sha1-gtujpthfbSGB4eyiwQ2GV8IWHyg=",
-      "requires": {
-        "@sinonjs/commons": "^1.4.0",
-        "@sinonjs/formatio": "^3.2.1",
-        "@sinonjs/samsam": "^3.3.1",
-        "diff": "^3.5.0",
-        "lolex": "^4.0.1",
-        "nise": "^1.4.10",
-        "supports-color": "^5.5.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "slice-ansi": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
-      "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=",
-      "requires": {
-        "is-fullwidth-code-point": "^2.0.0"
-      }
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=",
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=",
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=",
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=",
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=",
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "socket.io": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
-      "integrity": "sha1-oGnF/qvuPmshSnW0DOBlLhz7mYA=",
-      "requires": {
-        "debug": "~3.1.0",
-        "engine.io": "~3.2.0",
-        "has-binary2": "~1.0.2",
-        "socket.io-adapter": "~1.1.0",
-        "socket.io-client": "2.1.1",
-        "socket.io-parser": "~3.2.0"
-      }
-    },
-    "socket.io-adapter": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
-      "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs="
-    },
-    "socket.io-client": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
-      "integrity": "sha1-3LOBA0NqtFeN2wJmOK4vIbYjZx8=",
-      "requires": {
-        "backo2": "1.0.2",
-        "base64-arraybuffer": "0.1.5",
-        "component-bind": "1.0.0",
-        "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "engine.io-client": "~3.2.0",
-        "has-binary2": "~1.0.2",
-        "has-cors": "1.1.0",
-        "indexof": "0.0.1",
-        "object-component": "0.0.3",
-        "parseqs": "0.0.5",
-        "parseuri": "0.0.5",
-        "socket.io-parser": "~3.2.0",
-        "to-array": "0.1.4"
-      }
-    },
-    "socket.io-parser": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
-      "integrity": "sha1-58Yii2qh+BTmFIrqMltRqpSZ4Hc=",
-      "requires": {
-        "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "isarray": "2.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
-          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
-        }
-      }
-    },
-    "source-list-map": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
-      "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ="
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
-    },
-    "source-map-resolve": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
-      "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=",
-      "requires": {
-        "atob": "^2.1.1",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
-    },
-    "spdx-correct": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
-      "integrity": "sha1-GbtAnpG0exrVQVkkP3MSqFjbPC4=",
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
-      "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc="
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
-      "integrity": "sha1-4qMDI2ysVLBAMfp6WnnH5wHfhS8="
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=",
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
-    },
-    "ssri": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
-      "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=",
-      "requires": {
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "statuses": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
-      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
-    },
-    "stream-browserify": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
-      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "stream-each": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
-      "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=",
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "stream-http": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
-      "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=",
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
-    },
-    "streamroller": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.4.tgz",
-      "integrity": "sha1-1IXHYkeW1eLrNBkMea/L8AavteY=",
-      "requires": {
-        "async": "^2.6.1",
-        "date-format": "^2.0.0",
-        "debug": "^3.1.0",
-        "fs-extra": "^7.0.0",
-        "lodash": "^4.17.10"
-      }
-    },
-    "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
-      "requires": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
-      }
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "strip-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-      "requires": {
-        "ansi-regex": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
-        }
-      }
-    },
-    "strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
-    },
-    "strip-indent": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
-      "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g="
-    },
-    "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
-    },
-    "supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-    },
-    "symbol-observable": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
-      "integrity": "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ="
-    },
-    "table": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
-      "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=",
-      "requires": {
-        "ajv": "^5.2.3",
-        "ajv-keywords": "^2.1.0",
-        "chalk": "^2.1.0",
-        "lodash": "^4.17.4",
-        "slice-ansi": "1.0.0",
-        "string-width": "^2.1.1"
-      }
-    },
-    "table-layout": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
-      "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
-      "requires": {
-        "array-back": "^2.0.0",
-        "deep-extend": "~0.6.0",
-        "lodash.padend": "^4.6.1",
-        "typical": "^2.6.1",
-        "wordwrapjs": "^3.0.0"
-      },
-      "dependencies": {
-        "array-back": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
-          "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
-          "requires": {
-            "typical": "^2.6.1"
-          }
-        },
-        "typical": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
-          "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
-        }
-      }
-    },
-    "tapable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz",
-      "integrity": "sha1-DQdqFy49m6CI/SJysmaPuNGUt4w="
-    },
-    "term-size": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
-      "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
-      "requires": {
-        "execa": "^0.7.0"
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "through2": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
-      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
-      "requires": {
-        "readable-stream": "^2.1.5",
-        "xtend": "~4.0.1"
-      }
-    },
-    "timed-out": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
-      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
-    },
-    "timers-browserify": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
-      "integrity": "sha1-HSjj0qrfHVpZlsTp+VYBzQU0gK4=",
-      "requires": {
-        "setimmediate": "^1.0.4"
-      }
-    },
-    "titleize": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.1.tgz",
-      "integrity": "sha1-Ibwk/Mpljq3G0708OPK9FzdptMU="
-    },
-    "tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
-      "requires": {
-        "os-tmpdir": "~1.0.2"
-      }
-    },
-    "to-array": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
-      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
-    },
-    "to-arraybuffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
-    },
-    "to-fast-properties": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=",
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      }
-    },
-    "toidentifier": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
-      "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
-    },
-    "tr46": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
-      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "trim-newlines": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
-      "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA="
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
-    },
-    "tslib": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
-      "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY="
-    },
-    "tty-browserify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
-      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
-    },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "requires": {
-        "prelude-ls": "~1.1.2"
-      }
-    },
-    "type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw="
-    },
-    "type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      }
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-    },
-    "typical": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
-      "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="
-    },
-    "uglify-es": {
-      "version": "3.3.9",
-      "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
-      "integrity": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=",
-      "requires": {
-        "commander": "~2.13.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "uglifyjs-webpack-plugin": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz",
-      "integrity": "sha1-dfVIFghYFjoIZD4IbV/v4YpdZ94=",
-      "requires": {
-        "cacache": "^10.0.4",
-        "find-cache-dir": "^1.0.0",
-        "schema-utils": "^0.4.5",
-        "serialize-javascript": "^1.4.0",
-        "source-map": "^0.6.1",
-        "uglify-es": "^3.3.4",
-        "webpack-sources": "^1.1.0",
-        "worker-farm": "^1.5.2"
-      }
-    },
-    "ultron": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
-      "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw="
-    },
-    "union-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
-      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^0.4.3"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "set-value": {
-          "version": "0.4.3",
-          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
-          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.1",
-            "to-object-path": "^0.3.0"
-          }
-        }
-      }
-    },
-    "unique-filename": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-      "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=",
-      "requires": {
-        "unique-slug": "^2.0.0"
-      }
-    },
-    "unique-slug": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
-      "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=",
-      "requires": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
-    "unique-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
-      "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
-      "requires": {
-        "crypto-random-string": "^1.0.0"
-      }
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY="
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
-    },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
-        }
-      }
-    },
-    "unzip-response": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
-      "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
-    },
-    "upath": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
-      "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0="
-    },
-    "update-notifier": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
-      "integrity": "sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y=",
-      "requires": {
-        "boxen": "^1.2.1",
-        "chalk": "^2.0.1",
-        "configstore": "^3.0.0",
-        "import-lazy": "^2.1.0",
-        "is-ci": "^1.0.10",
-        "is-installed-globally": "^0.1.0",
-        "is-npm": "^1.0.0",
-        "latest-version": "^3.0.0",
-        "semver-diff": "^2.0.0",
-        "xdg-basedir": "^3.0.0"
-      }
-    },
-    "uri-js": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-      "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
-        }
-      }
-    },
-    "url-parse-lax": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
-      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
-      "requires": {
-        "prepend-http": "^1.0.1"
-      }
-    },
-    "use": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-      "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8="
-    },
-    "useragent": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
-      "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=",
-      "requires": {
-        "lru-cache": "4.1.x",
-        "tmp": "0.0.x"
-      }
-    },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha1-OqASW/5mikZy3liFfTrOJ+y3aQE=",
-      "requires": {
-        "inherits": "2.0.3"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
-    },
-    "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE="
-    },
-    "v8-compile-cache": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz",
-      "integrity": "sha1-pCiyi7JnkHNMT8i8n6EG/M6/amw="
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=",
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "vlq": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
-      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow=="
-    },
-    "vm-browserify": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
-      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
-      "requires": {
-        "indexof": "0.0.1"
-      }
-    },
-    "void-elements": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
-      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
-    },
-    "vscode-uri": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz",
-      "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww=="
-    },
-    "vulcanize": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz",
-      "integrity": "sha1-sM47AETRlK1JCK5PGmxhEKbk1eY=",
-      "requires": {
-        "dom5": "^1.3.1",
-        "es6-promise": "^2.1.0",
-        "hydrolysis": "^1.19.1",
-        "nopt": "^3.0.1",
-        "path-posix": "^1.0.0"
-      }
-    },
-    "watchpack": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
-      "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=",
-      "requires": {
-        "chokidar": "^2.0.2",
-        "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
-      }
-    },
-    "wcwidth": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
-      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
-      "requires": {
-        "defaults": "^1.0.3"
-      }
-    },
-    "webidl-conversions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
-    },
-    "webpack": {
-      "version": "4.23.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz",
-      "integrity": "sha1-23RnsRZ3GuAgxYvf4qCCJ4W7gjk=",
-      "requires": {
-        "@webassemblyjs/ast": "1.7.10",
-        "@webassemblyjs/helper-module-context": "1.7.10",
-        "@webassemblyjs/wasm-edit": "1.7.10",
-        "@webassemblyjs/wasm-parser": "1.7.10",
-        "acorn": "^5.6.2",
-        "acorn-dynamic-import": "^3.0.0",
-        "ajv": "^6.1.0",
-        "ajv-keywords": "^3.1.0",
-        "chrome-trace-event": "^1.0.0",
-        "enhanced-resolve": "^4.1.0",
-        "eslint-scope": "^4.0.0",
-        "json-parse-better-errors": "^1.0.2",
-        "loader-runner": "^2.3.0",
-        "loader-utils": "^1.1.0",
-        "memory-fs": "~0.4.1",
-        "micromatch": "^3.1.8",
-        "mkdirp": "~0.5.0",
-        "neo-async": "^2.5.0",
-        "node-libs-browser": "^2.0.0",
-        "schema-utils": "^0.4.4",
-        "tapable": "^1.1.0",
-        "uglifyjs-webpack-plugin": "^1.2.4",
-        "watchpack": "^1.5.0",
-        "webpack-sources": "^1.3.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "6.5.4",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
-          "integrity": "sha1-JH1SdBENtlNwa1UPzCt5fKKM/Fk=",
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "ajv-keywords": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
-          "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo="
-        },
-        "eslint-scope": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
-          "integrity": "sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI=",
-          "requires": {
-            "esrecurse": "^4.1.0",
-            "estraverse": "^4.1.1"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
-        },
-        "json-schema-traverse": {
-          "version": "0.4.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-          "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
-        }
-      }
-    },
-    "webpack-command": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/webpack-command/-/webpack-command-0.4.1.tgz",
-      "integrity": "sha1-P4iq6HwoKS7QqXKTYVouliocZvQ=",
-      "requires": {
-        "@webpack-contrib/config-loader": "^1.2.0",
-        "@webpack-contrib/schema-utils": "^1.0.0-beta.0",
-        "camelcase": "^5.0.0",
-        "chalk": "^2.3.2",
-        "debug": "^3.1.0",
-        "decamelize": "^2.0.0",
-        "enhanced-resolve": "^4.0.0",
-        "import-local": "^1.0.0",
-        "isobject": "^3.0.1",
-        "loader-utils": "^1.1.0",
-        "log-symbols": "^2.2.0",
-        "loud-rejection": "^1.6.0",
-        "meant": "^1.0.1",
-        "meow": "^5.0.0",
-        "merge-options": "^1.0.0",
-        "object.values": "^1.0.4",
-        "opn": "^5.3.0",
-        "ora": "^2.1.0",
-        "plur": "^3.0.0",
-        "pretty-bytes": "^5.0.0",
-        "strip-ansi": "^4.0.0",
-        "text-table": "^0.2.0",
-        "titleize": "^1.0.1",
-        "update-notifier": "^2.3.0",
-        "v8-compile-cache": "^2.0.0",
-        "webpack-log": "^1.1.2",
-        "wordwrap": "^1.0.0"
-      }
-    },
-    "webpack-dev-middleware": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz",
-      "integrity": "sha1-83onrXwJzX3GfNl2VUE6uqH1WUI=",
-      "requires": {
-        "memory-fs": "^0.4.1",
-        "mime": "^2.3.1",
-        "range-parser": "^1.0.3",
-        "webpack-log": "^2.0.0"
-      },
-      "dependencies": {
-        "webpack-log": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
-          "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=",
-          "requires": {
-            "ansi-colors": "^3.0.0",
-            "uuid": "^3.3.2"
-          }
-        }
-      }
-    },
-    "webpack-log": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz",
-      "integrity": "sha1-pLNM2msitRjbsKsy5WeWLVxypD0=",
-      "requires": {
-        "chalk": "^2.1.0",
-        "log-symbols": "^2.1.0",
-        "loglevelnext": "^1.0.1",
-        "uuid": "^3.1.0"
-      }
-    },
-    "webpack-sources": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
-      "integrity": "sha1-KijcufH0X+lg2PFJMlK17mUw+oU=",
-      "requires": {
-        "source-list-map": "^2.0.0",
-        "source-map": "~0.6.1"
-      }
-    },
-    "whatwg-url": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
-      "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
-      "requires": {
-        "lodash.sortby": "^4.7.0",
-        "tr46": "^1.0.1",
-        "webidl-conversions": "^4.0.2"
-      }
-    },
-    "which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=",
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "widest-line": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
-      "integrity": "sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w=",
-      "requires": {
-        "string-width": "^2.1.1"
-      }
-    },
-    "wordwrap": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
-    },
-    "wordwrapjs": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
-      "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
-      "requires": {
-        "reduce-flatten": "^1.0.1",
-        "typical": "^2.6.1"
-      },
-      "dependencies": {
-        "typical": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
-          "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
-        }
-      }
-    },
-    "worker-farm": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
-      "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=",
-      "requires": {
-        "errno": "~0.1.7"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "write": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
-      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
-      "requires": {
-        "mkdirp": "^0.5.1"
-      }
-    },
-    "write-file-atomic": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
-      "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=",
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "imurmurhash": "^0.1.4",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "ws": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
-      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
-      "requires": {
-        "async-limiter": "~1.0.0"
-      }
-    },
-    "xdg-basedir": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
-      "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
-    },
-    "xmlhttprequest-ssl": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
-      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
-    },
-    "xregexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
-      "integrity": "sha1-5pgYneSd0qGMxWh7BeF8jkOUMCA="
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
-    },
-    "y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms="
-    },
-    "yallist": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
-    },
-    "yargs-parser": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
-      "integrity": "sha1-cgImW4n36eny5XZeD+c1qQXtuqg=",
-      "requires": {
-        "camelcase": "^4.1.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
-        }
-      }
-    },
-    "yauzl": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
-      "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
-      "requires": {
-        "fd-slicer": "~1.0.1"
-      }
-    },
-    "yeast": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
-    }
-  }
-}
diff --git a/systrace/catapult/common/node_runner/node_runner/package.json b/systrace/catapult/common/node_runner/node_runner/package.json
deleted file mode 100644
index 9f6b487..0000000
--- a/systrace/catapult/common/node_runner/node_runner/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "name": "catapult_base",
-  "version": "1.0.0",
-  "description": "Catapult project base",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/catapult-project/catapult/tree/master/catapult_base"
-  },
-  "main": "index.js",
-  "scripts": {
-    "test": "cd ../../../dashboard/dashboard/spa && karma start --coverage --no-colors"
-  },
-  "author": "The Chromium Authors",
-  "license": "BSD-2-Clause",
-  "gypfile": false,
-  "private": true,
-  "dependencies": {
-    "dot-prop-immutable": "1.5.0",
-    "@chopsui/result-channel": "0.1.0",
-    "@chopsui/batch-iterator": "0.1.0",
-    "@chopsui/chops-button": "0.1.11",
-    "@chopsui/chops-checkbox": "0.1.11",
-    "@chopsui/chops-input": "0.1.11",
-    "@chopsui/chops-loading": "0.1.11",
-    "@chopsui/chops-radio": "0.1.11",
-    "@chopsui/chops-radio-group": "0.1.11",
-    "@chopsui/chops-switch": "0.1.11",
-    "@chopsui/chops-tab": "0.1.11",
-    "@chopsui/chops-tab-bar": "0.1.11",
-    "@chopsui/chops-textarea": "0.1.11",
-    "@chopsui/tsmon-client": "0.0.1",
-    "@chopsui/chops-header": "0.1.5",
-    "@chopsui/chops-signin": "0.1.5",
-    "@polymer/app-route": "^3.0.0",
-    "@polymer/iron-collapse": "^3.0.0",
-    "@polymer/iron-icon": "^3.0.0",
-    "@polymer/iron-iconset-svg": "^3.0.0",
-    "@polymer/polymer": "^3.0.0",
-    "chai": "^4.0.2",
-    "dom5": "^1.0.0",
-    "escodegen": "^1.11.0",
-    "eslint": "^4.0.0",
-    "eslint-config-google": "^0.6.0",
-    "eslint-plugin-html": "^4.0.0",
-    "espree": "^3.0.0",
-    "istanbul-instrumenter-loader": "^3.0.1",
-    "lit-element": "^2.0.0",
-    "karma": "^4.0.0",
-    "karma-chrome-launcher": "^2.2.0",
-    "karma-coverage": "^1.1.2",
-    "karma-mocha": "^1.3.0",
-    "karma-sinon": "^1.0.5",
-    "karma-sourcemap-loader": "^0.3.7",
-    "karma-webpack": "4.0.0-rc.6",
-    "mocha": "^5.2.0",
-    "path": "^0.12.7",
-    "puppeteer": "^1.10.0",
-    "redux": "^4.0.0",
-    "sinon": "^7.2.3",
-    "vulcanize": "^1.16.0",
-    "webpack": "^4.16.1",
-    "webpack-command": "^0.4.1",
-    "polymer-bundler": "^4.0.10"
-  }
-}
diff --git a/systrace/catapult/common/py_trace_event/README.txt b/systrace/catapult/common/py_trace_event/README.txt
deleted file mode 100644
index 2f0d33d..0000000
--- a/systrace/catapult/common/py_trace_event/README.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-py_trace_event allows low-overhead instrumentation of a multi-threaded,
-multi-process application in order to study its global performance
-characteristics. It uses the trace event format used in Chromium/Chrome's
-about:tracing system.
-
-Trace files generated by py_trace_event can be viewed and manipulated by
-trace_event_viewer.
diff --git a/systrace/catapult/common/py_trace_event/bin/run_tests b/systrace/catapult/common/py_trace_event/bin/run_tests
deleted file mode 100755
index b9e1cbe..0000000
--- a/systrace/catapult/common/py_trace_event/bin/run_tests
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..', '..'))
-
-_PY_TRACE_EVENT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..'))
-
-
-def _RunTestsOrDie(top_level_dir):
-  # Need everything in one process for tracing to work.
-  exit_code = run_with_typ.Run(
-      top_level_dir, path=[_PY_TRACE_EVENT_PATH], jobs=1)
-  if exit_code:
-    sys.exit(exit_code)
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-if __name__ == '__main__':
-  _AddToPathIfNeeded(_CATAPULT_PATH)
-
-  from catapult_build import run_with_typ
-
-  _RunTestsOrDie(_PY_TRACE_EVENT_PATH)
-
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py b/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py
deleted file mode 100644
index 2cd8dd1..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import os
-import sys
-
-SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
-PY_UTILS = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..', 'py_utils'))
-PROTOBUF = os.path.abspath(os.path.join(
-    SCRIPT_DIR, '..', 'third_party', 'protobuf'))
-sys.path.append(PY_UTILS)
-sys.path.append(PROTOBUF)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/setup.py b/systrace/catapult/common/py_trace_event/py_trace_event/setup.py
deleted file mode 100644
index 0b0070a..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/setup.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2011 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-from distutils.core import setup
-setup(
-    name='py_trace_event',
-    packages=['trace_event_impl'],
-    version='0.1.0',
-    description='Performance tracing for python',
-    author='Nat Duca'
-)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py
deleted file mode 100644
index 88eef21..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py
+++ /dev/null
@@ -1,289 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-from py_trace_event import trace_time
-
-
-r"""Instrumentation-based profiling for Python.
-
-trace_event allows you to hand-instrument your code with areas of interest.
-When enabled, trace_event logs the start and stop times of these events to a
-logfile. These resulting logfiles can be viewed with either Chrome's
-about:tracing UI or with the standalone trace_event_viewer available at
-  http://www.github.com/natduca/trace_event_viewer/
-
-To use trace event, call trace_event_enable and start instrumenting your code:
-   from trace_event import *
-
-   if "--trace" in sys.argv:
-     trace_enable("myfile.trace")
-
-   @traced
-   def foo():
-     ...
-
-   class MyFoo(object):
-     @traced
-     def bar(self):
-       ...
-
-trace_event records trace events to an in-memory buffer. If your application is
-long running and you want to see the results of a trace before it exits, you can
-call trace_flush to write any in-memory events to disk.
-
-To help intregrating trace_event into existing codebases that dont want to add
-trace_event as a dependancy, trace_event is split into an import shim
-(trace_event.py) and an implementaiton (trace_event_impl/*). You can copy the
-shim, trace_event.py, directly into your including codebase. If the
-trace_event_impl is not found, the shim will simply noop.
-
-trace_event is safe with regard to Python threads. Simply trace as you normally
-would and each thread's timing will show up in the trace file.
-
-Multiple processes can safely output into a single trace_event logfile. If you
-fork after enabling tracing, the child process will continue outputting to the
-logfile. Use of the multiprocessing module will work as well. In both cases,
-however, note that disabling tracing in the parent process will not stop tracing
-in the child processes.
-"""
-
-try:
-  import trace_event_impl
-except ImportError:
-  trace_event_impl = None
-
-
-def trace_can_enable():
-  """
-  Returns True if a trace_event_impl was found. If false,
-  trace_enable will fail. Regular tracing methods, including
-  trace_begin and trace_end, will simply be no-ops.
-  """
-  return trace_event_impl != None
-
-# Default TracedMetaClass to type incase trace_event_impl is not defined.
-# This is to avoid exception during import time since TracedMetaClass typically
-# used in class definition scope.
-TracedMetaClass = type
-
-
-if trace_event_impl:
-  import time
-
-  # Trace file formats
-  JSON = trace_event_impl.JSON
-  JSON_WITH_METADATA = trace_event_impl.JSON_WITH_METADATA
-  PROTOBUF = trace_event_impl.PROTOBUF
-
-  def trace_is_enabled():
-    return trace_event_impl.trace_is_enabled()
-
-  def trace_enable(logfile, format=None):
-    return trace_event_impl.trace_enable(logfile, format)
-
-  def trace_disable():
-    return trace_event_impl.trace_disable()
-
-  def trace_flush():
-    trace_event_impl.trace_flush()
-
-  def trace_begin(name, **kwargs):
-    args_to_log = {key: repr(value) for key, value in kwargs.iteritems()}
-    trace_event_impl.add_trace_event("B", trace_time.Now(), "python", name,
-                                     args_to_log)
-
-  def trace_end(name):
-    trace_event_impl.add_trace_event("E", trace_time.Now(), "python", name)
-
-  def trace_set_thread_name(thread_name):
-    trace_event_impl.add_trace_event("M", trace_time.Now(), "__metadata",
-                                     "thread_name", {"name": thread_name})
-
-  def trace_add_benchmark_metadata(*args, **kwargs):
-    trace_event_impl.trace_add_benchmark_metadata(*args, **kwargs)
-
-  def trace_set_clock_snapshot(*args, **kwargs):
-    trace_event_impl.trace_set_clock_snapshot(*args, **kwargs)
-
-  def trace(name, **kwargs):
-    return trace_event_impl.trace(name, **kwargs)
-
-  TracedMetaClass = trace_event_impl.TracedMetaClass
-
-  def traced(fn):
-    return trace_event_impl.traced(fn)
-
-  def clock_sync(*args, **kwargs):
-    return trace_event_impl.clock_sync(*args, **kwargs)
-
-  def is_tracing_controllable():
-    return trace_event_impl.is_tracing_controllable()
-
-else:
-  import contextlib
-
-  # Trace file formats
-  JSON = None
-  JSON_WITH_METADATA = None
-  PROTOBUF = None
-
-  def trace_enable():
-    raise TraceException(
-        "Cannot enable trace_event. No trace_event_impl module found.")
-
-  def trace_disable():
-    pass
-
-  def trace_is_enabled():
-    return False
-
-  def trace_flush():
-    pass
-
-  def trace_begin(name, **kwargs):
-    del name # unused.
-    del kwargs # unused.
-    pass
-
-  def trace_end(name):
-    del name # unused.
-    pass
-
-  def trace_set_thread_name(thread_name):
-    del thread_name # unused.
-    pass
-
-  @contextlib.contextmanager
-  def trace(name, **kwargs):
-    del name # unused
-    del kwargs # unused
-    yield
-
-  def traced(fn):
-    return fn
-
-  def clock_sync(sync_id, issue_ts=None):
-    del sync_id # unused.
-    pass
-
-  def is_tracing_controllable():
-    return False
-
-trace_enable.__doc__ = """Enables tracing.
-
-  Once enabled, the enabled bit propagates to forked processes and
-  multiprocessing subprocesses. Regular child processes, e.g. those created via
-  os.system/popen, or subprocess.Popen instances, will not get traced. You can,
-  however, enable tracing on those subprocess manually.
-
-  Trace files are multiprocess safe, so you can have multiple processes
-  outputting to the same tracelog at once.
-
-  log_file can be one of three things:
-
-    None: a logfile is opened based on sys[argv], namely
-          "./" + sys.argv[0] + ".json"
-
-    string: a logfile of the given name is opened.
-
-    file-like object: the fileno() is is used. The underlying file descriptor
-                      must support fcntl.lockf() operations.
-  """
-
-trace_disable.__doc__ = """Disables tracing, if enabled.
-
-  Will not disable tracing on any existing child proceses that were forked
-  from this process. You must disable them yourself.
-  """
-
-trace_flush.__doc__ = """Flushes any currently-recorded trace data to disk.
-
-  trace_event records traces into an in-memory buffer for efficiency. Flushing
-  is only done at process exit or when this method is called.
-  """
-
-trace_is_enabled.__doc__ = """Returns whether tracing is enabled.
-  """
-
-trace_begin.__doc__ = """Records the beginning of an event of the given name.
-
-  The building block for performance tracing. A typical example is:
-     from trace_event import *
-     def something_heavy():
-        trace_begin("something_heavy")
-
-        trace_begin("read")
-        try:
-          lines = open().readlines()
-        finally:
-          trace_end("read")
-
-        trace_begin("parse")
-        try:
-          parse(lines)
-        finally:
-          trace_end("parse")
-
-        trace_end("something_heavy")
-
-  Note that a trace_end call must be issued for every trace_begin call. When
-  tracing around blocks that might throw exceptions, you should use the trace
-  function, or a try-finally pattern to ensure that the trace_end method is
-  called.
-
-  See the documentation for the @traced decorator for a simpler way to
-  instrument functions and methods.
-  """
-
-trace_end.__doc__ = """Records the end of an event of the given name.
-
-  See the documentation for trace_begin for more information.
-
-  Make sure to issue a trace_end for every trace_begin issued. Failure to pair
-  these calls will lead to bizarrely tall looking traces in the
-  trace_event_viewer UI.
-  """
-
-trace_set_thread_name.__doc__ = """Sets the trace's name for the current thread.
-  """
-
-trace.__doc__ = """Traces a block of code using a with statement.
-
-  Example usage:
-    from trace_event import *
-    def something_heavy(lines):
-      with trace("parse_lines", lines=lines):
-        parse(lines)
-
-  If tracing an entire function call, prefer the @traced decorator.
-  """
-
-traced.__doc__ = """Traces the provided function.
-
-  Traces the provided function, using the function name for the actual generated
-  event.
-
-  Prefer this decorator over the explicit trace_begin and trace_end functions
-  whenever you are tracing the start and stop of a function. It automatically
-  issues trace_begin/end events, even when the wrapped function throws.
-
-  You can also pass the function's argument names to traced, and the argument
-  values will be added to the trace. Example usage:
-    from trace_event import *
-    @traced("url")
-    def send_request(url):
-      urllib2.urlopen(url).read()
-  """
-
-clock_sync.__doc__ = """Issues a clock sync marker event.
-
-  Clock sync markers are used to synchronize the clock domains of different
-  traces so that they can be used together. It takes a sync_id, and if it is
-  the issuer of a clock sync event it will also require an issue_ts. The
-  issue_ts is a timestamp from when the clocksync was first issued. This is used
-  to calculate the time difference between clock domains.
-
-  This function has no effect if trace format is proto and
-  trace_set_clock_snapshot was called before trace start. The synchronization
-  will be performed in trace_processor using clock snapshots in this case.
-  """
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
deleted file mode 100644
index d250e03..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-from log import *
-from decorators import *
-from meta_class import *
-import multiprocessing_shim
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
deleted file mode 100644
index dc753f1..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import contextlib
-import inspect
-import time
-import functools
-
-import log
-from py_trace_event import trace_time
-
-
-@contextlib.contextmanager
-def trace(name, **kwargs):
-  category = "python"
-  start = trace_time.Now()
-  args_to_log = {key: repr(value) for key, value in kwargs.iteritems()}
-  log.add_trace_event("B", start, category, name, args_to_log)
-  try:
-    yield
-  finally:
-    end = trace_time.Now()
-    log.add_trace_event("E", end, category, name)
-
-def traced(*args):
-  def get_wrapper(func):
-    if inspect.isgeneratorfunction(func):
-      raise Exception("Can not trace generators.")
-
-    category = "python"
-
-    arg_spec = inspect.getargspec(func)
-    is_method = arg_spec.args and arg_spec.args[0] == "self"
-
-    def arg_spec_tuple(name):
-      arg_index = arg_spec.args.index(name)
-      defaults_length = len(arg_spec.defaults) if arg_spec.defaults else 0
-      default_index = arg_index + defaults_length - len(arg_spec.args)
-      if default_index >= 0:
-        default = arg_spec.defaults[default_index]
-      else:
-        default = None
-      return (name, arg_index, default)
-
-    args_to_log = map(arg_spec_tuple, arg_names)
-
-    @functools.wraps(func)
-    def traced_function(*args, **kwargs):
-      # Everything outside traced_function is done at decoration-time.
-      # Everything inside traced_function is done at run-time and must be fast.
-      if not log._enabled:  # This check must be at run-time.
-        return func(*args, **kwargs)
-
-      def get_arg_value(name, index, default):
-        if name in kwargs:
-          return kwargs[name]
-        elif index < len(args):
-          return args[index]
-        else:
-          return default
-
-      if is_method:
-        name = "%s.%s" % (args[0].__class__.__name__, func.__name__)
-      else:
-        name = "%s.%s" % (func.__module__, func.__name__)
-
-      # Be sure to repr before calling func. Argument values may change.
-      arg_values = {
-          name: repr(get_arg_value(name, index, default))
-          for name, index, default in args_to_log}
-
-      start = trace_time.Now()
-      log.add_trace_event("B", start, category, name, arg_values)
-      try:
-        return func(*args, **kwargs)
-      finally:
-        end = trace_time.Now()
-        log.add_trace_event("E", end, category, name)
-    return traced_function
-
-  no_decorator_arguments = len(args) == 1 and callable(args[0])
-  if no_decorator_arguments:
-    arg_names = ()
-    return get_wrapper(args[0])
-  else:
-    arg_names = args
-    return get_wrapper
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
deleted file mode 100644
index 434a351..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import decorators
-import logging
-import unittest
-
-from trace_test import TraceTest
-#from .trace_test import TraceTest
-
-def generator():
-  yield 1
-  yield 2
-
-class DecoratorTests(unittest.TestCase):
-  def test_tracing_object_fails(self):
-    self.assertRaises(Exception, lambda: decorators.trace(1))
-    self.assertRaises(Exception, lambda: decorators.trace(""))
-    self.assertRaises(Exception, lambda: decorators.trace([]))
-
-  def test_tracing_generators_fail(self):
-    self.assertRaises(Exception, lambda: decorators.trace(generator))
-
-class ClassToTest(object):
-  @decorators.traced
-  def method1(self):
-    return 1
-
-  @decorators.traced
-  def method2(self):
-    return 1
-
-@decorators.traced
-def traced_func():
-  return 1
-
-class DecoratorTests(TraceTest):
-  def _get_decorated_method_name(self, f):
-    res = self.go(f)
-    events = res.findEventsOnThread(res.findThreadIds()[0])
-
-    # Sanity checks.
-    self.assertEquals(2, len(events))
-    self.assertEquals(events[0]["name"], events[1]["name"])
-    return events[1]["name"]
-
-
-  def test_func_names_work(self):
-    expected_method_name = __name__ + '.traced_func'
-    self.assertEquals(expected_method_name,
-                      self._get_decorated_method_name(traced_func))
-
-  def test_method_names_work(self):
-    ctt = ClassToTest()
-    self.assertEquals('ClassToTest.method1',
-                      self._get_decorated_method_name(ctt.method1))
-    self.assertEquals('ClassToTest.method2',
-                      self._get_decorated_method_name(ctt.method2))
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
deleted file mode 100644
index 130d168..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
+++ /dev/null
@@ -1,436 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import atexit
-import json
-import os
-import sys
-import time
-import threading
-import multiprocessing
-import multiprocessing_shim
-
-from py_trace_event.trace_event_impl import perfetto_trace_writer
-from py_trace_event import trace_time
-
-from py_utils import lock
-
-
-# Trace file formats:
-
-# Legacy format: json list of events.
-# Events can be written from multiple processes, but since no process
-# can be sure that it is the last one, nobody writes the closing ']'.
-# So the resulting file is not technically correct json.
-JSON = "json"
-
-# Full json with events and metadata.
-# This format produces correct json ready to feed into TraceDataBuilder.
-# Note that it is the responsibility of the user of py_trace_event to make sure
-# that trace_disable() is called after all child processes have finished.
-JSON_WITH_METADATA = "json_with_metadata"
-
-# Perfetto protobuf trace format.
-PROTOBUF = "protobuf"
-
-
-_lock = threading.Lock()
-
-_enabled = False
-_log_file = None
-
-_cur_events = [] # events that have yet to be buffered
-_benchmark_metadata = {}
-
-# Default timestamp values for clock snapshot.
-# If a ClockSnapshot message with these default values is emitted, Telemetry
-# events' time will not be translated by trace processor, because both
-# TELEMETRY and BOOTTIME timestamps are the same. This allows the old-style
-# synchronization (using clock_sync events) to take place in catapult.
-# If we want to actually synchronize Telemetry with other trace producers
-# via clock snapshots in trace processor, we should set _boottime_ts to the
-# actual BOOTTIME of the device and _emit_clock_sync to False. In this case,
-# trace processor will translate both Chrome's and telemetry's timestamps
-# to the device time (BOOTTIME) during proto-to-json conversion, and catapult's
-# clock synchronization will not take place because we do not emit the
-# clock_sync event.
-# Note that we can't use both synchronization methods at the same time
-# because that will lead to wrong results.
-_telemetry_ts = trace_time.Now()
-_boottime_ts = _telemetry_ts
-_emit_clock_sync = True
-
-_tls = threading.local() # tls used to detect forking/etc
-_atexit_regsitered_for_pid = None
-
-_control_allowed = True
-
-_original_multiprocessing_process = multiprocessing.Process
-
-class TraceException(Exception):
-  pass
-
-def _note(msg, *args):
-  pass
-#  print "%i: %s" % (os.getpid(), msg)
-
-
-def _locked(fn):
-  def locked_fn(*args,**kwargs):
-    _lock.acquire()
-    try:
-      ret = fn(*args,**kwargs)
-    finally:
-      _lock.release()
-    return ret
-  return locked_fn
-
-def _disallow_tracing_control():
-  global _control_allowed
-  _control_allowed = False
-
-def trace_enable(log_file=None, format=None):
-  """Enable tracing.
-
-  Args:
-    log_file: file to write trace into. Can be a file-like object,
-      a name of file, or None. If None, file name is constructed
-      from executable name.
-    format: trace file format. See trace_event.py for available options.
-  """
-  global _emit_clock_sync
-  if format is None:
-    format = JSON
-  # Can only write clock snapshots in protobuf format. In all other formats
-  # should use clock_syncs.
-  if format != PROTOBUF:
-    _emit_clock_sync = True
-  _trace_enable(log_file, format)
-
-def _write_header():
-  if _format == PROTOBUF:
-    tid = threading.current_thread().ident
-    perfetto_trace_writer.write_clock_snapshot(
-        output=_log_file,
-        tid=tid,
-        telemetry_ts=_telemetry_ts,
-        boottime_ts=_boottime_ts,
-    )
-    perfetto_trace_writer.write_thread_descriptor_event(
-        output=_log_file,
-        pid=os.getpid(),
-        tid=tid,
-        ts=trace_time.Now(),
-    )
-    perfetto_trace_writer.write_event(
-        output=_log_file,
-        ph="M",
-        category="process_argv",
-        name="process_argv",
-        ts=trace_time.Now(),
-        args={"argv": sys.argv},
-        tid=tid,
-    )
-  else:
-    if _format == JSON:
-      _log_file.write('[')
-    elif _format == JSON_WITH_METADATA:
-      _log_file.write('{"traceEvents": [\n')
-    else:
-      raise TraceException("Unknown format: %s" % _format)
-    json.dump({
-        "ph": "M",
-        "category": "process_argv",
-        "pid": os.getpid(),
-        "tid": threading.current_thread().ident,
-        "ts": trace_time.Now(),
-        "name": "process_argv",
-        "args": {"argv": sys.argv},
-    }, _log_file)
-    _log_file.write('\n')
-
-
-@_locked
-def _trace_enable(log_file=None, format=None):
-  global _format
-  _format = format
-  global _enabled
-  if _enabled:
-    raise TraceException("Already enabled")
-  if not _control_allowed:
-    raise TraceException("Tracing control not allowed in child processes.")
-  _enabled = True
-  global _log_file
-  if log_file == None:
-    if sys.argv[0] == '':
-      n = 'trace_event'
-    else:
-      n = sys.argv[0]
-    if _format == PROTOBUF:
-      log_file = open("%s.pb" % n, "ab", False)
-    else:
-      log_file = open("%s.json" % n, "ab", False)
-  elif isinstance(log_file, basestring):
-    log_file = open("%s" % log_file, "ab", False)
-  elif not hasattr(log_file, 'fileno'):
-    raise TraceException(
-        "Log file must be None, a string, or file-like object with a fileno()")
-
-  _note("trace_event: tracelog name is %s" % log_file)
-
-  _log_file = log_file
-  with lock.FileLock(_log_file, lock.LOCK_EX):
-    _log_file.seek(0, os.SEEK_END)
-
-    lastpos = _log_file.tell()
-    creator = lastpos == 0
-    if creator:
-      _note("trace_event: Opened new tracelog, lastpos=%i", lastpos)
-      _write_header()
-    else:
-      _note("trace_event: Opened existing tracelog")
-    _log_file.flush()
-  # Monkeypatch in our process replacement for the multiprocessing.Process class
-  if multiprocessing.Process != multiprocessing_shim.ProcessShim:
-      multiprocessing.Process = multiprocessing_shim.ProcessShim
-
-@_locked
-def trace_flush():
-  if _enabled:
-    _flush()
-
-@_locked
-def trace_disable():
-  global _enabled
-  if not _control_allowed:
-    raise TraceException("Tracing control not allowed in child processes.")
-  if not _enabled:
-    return
-  _enabled = False
-  _flush(close=True)
-  # Clear the collected interned data so that the next trace session
-  # could start from a clean state.
-  perfetto_trace_writer.reset_global_state()
-  multiprocessing.Process = _original_multiprocessing_process
-
-def _write_cur_events():
-  if _format == PROTOBUF:
-    for e in _cur_events:
-      perfetto_trace_writer.write_event(
-          output=_log_file,
-          ph=e["ph"],
-          category=e["category"],
-          name=e["name"],
-          ts=e["ts"],
-          args=e["args"],
-          tid=threading.current_thread().ident,
-      )
-  elif _format in (JSON, JSON_WITH_METADATA):
-    for e in _cur_events:
-      _log_file.write(",\n")
-      json.dump(e, _log_file)
-  else:
-    raise TraceException("Unknown format: %s" % _format)
-  del _cur_events[:]
-
-def _write_footer():
-  if _format in [JSON, PROTOBUF]:
-    # In JSON format we might not be the only process writing to this logfile.
-    # So, we will simply close the file rather than writing the trailing ] that
-    # it technically requires. The trace viewer understands this and
-    # will insert a trailing ] during loading.
-    # In PROTOBUF format there's no need for a footer. The metadata has already
-    # been written in a special proto message.
-    pass
-  elif _format == JSON_WITH_METADATA:
-    _log_file.write('],\n"metadata": ')
-    json.dump(_benchmark_metadata, _log_file)
-    _log_file.write('}')
-  else:
-    raise TraceException("Unknown format: %s" % _format)
-
-def _flush(close=False):
-  global _log_file
-  with lock.FileLock(_log_file, lock.LOCK_EX):
-    _log_file.seek(0, os.SEEK_END)
-    if len(_cur_events):
-      _write_cur_events()
-    if close:
-      _write_footer()
-    _log_file.flush()
-
-  if close:
-    _note("trace_event: Closed")
-    _log_file.close()
-    _log_file = None
-  else:
-    _note("trace_event: Flushed")
-
-@_locked
-def trace_is_enabled():
-  return _enabled
-
-@_locked
-def add_trace_event(ph, ts, category, name, args=None):
-  global _enabled
-  if not _enabled:
-    return
-  if not hasattr(_tls, 'pid') or _tls.pid != os.getpid():
-    _tls.pid = os.getpid()
-    global _atexit_regsitered_for_pid
-    if _tls.pid != _atexit_regsitered_for_pid:
-      _atexit_regsitered_for_pid = _tls.pid
-      atexit.register(_trace_disable_atexit)
-      _tls.pid = os.getpid()
-      del _cur_events[:] # we forked, clear the event buffer!
-    tid = threading.current_thread().ident
-    if not tid:
-      tid = os.getpid()
-    _tls.tid = tid
-
-  _cur_events.append({
-      "ph": ph,
-      "category": category,
-      "pid": _tls.pid,
-      "tid": _tls.tid,
-      "ts": ts,
-      "name": name,
-      "args": args or {},
-  });
-
-def trace_begin(name, args=None):
-  add_trace_event("B", trace_time.Now(), "python", name, args)
-
-def trace_end(name, args=None):
-  add_trace_event("E", trace_time.Now(), "python", name, args)
-
-def trace_set_thread_name(thread_name):
-  add_trace_event("M", trace_time.Now(), "__metadata", "thread_name",
-                  {"name": thread_name})
-
-def trace_add_benchmark_metadata(
-    benchmark_start_time_us,
-    story_run_time_us,
-    benchmark_name,
-    benchmark_description,
-    story_name,
-    story_tags,
-    story_run_index,
-    label=None,
-):
-  """Add benchmark metadata to be written to trace file.
-
-  Args:
-    benchmark_start_time_us: Benchmark start time in microseconds.
-    story_run_time_us: Story start time in microseconds.
-    benchmark_name: Name of the benchmark.
-    benchmark_description: Description of the benchmark.
-    story_name: Name of the story.
-    story_tags: List of story tags.
-    story_run_index: Index of the story run.
-    label: Optional label.
-    had_failures: Whether this story run failed.
-  """
-  global _benchmark_metadata
-  if _format == PROTOBUF:
-    # Write metadata immediately.
-    perfetto_trace_writer.write_metadata(
-        output=_log_file,
-        benchmark_start_time_us=benchmark_start_time_us,
-        story_run_time_us=story_run_time_us,
-        benchmark_name=benchmark_name,
-        benchmark_description=benchmark_description,
-        story_name=story_name,
-        story_tags=story_tags,
-        story_run_index=story_run_index,
-        label=label,
-    )
-    if _emit_clock_sync:
-      perfetto_trace_writer.write_chrome_metadata(
-          output=_log_file,
-          clock_domain="TELEMETRY",
-      )
-  elif _format == JSON_WITH_METADATA:
-    # Store metadata to write it in the footer.
-    telemetry_metadata_for_json = {
-        "benchmarkStart": benchmark_start_time_us / 1000.0,
-        "traceStart": story_run_time_us / 1000.0,
-        "benchmarks": [benchmark_name],
-        "benchmarkDescriptions": [benchmark_description],
-        "stories": [story_name],
-        "storyTags": story_tags,
-        "storysetRepeats": [story_run_index],
-    }
-    if label:
-      telemetry_metadata_for_json["labels"] = [label]
-
-    assert _emit_clock_sync
-    _benchmark_metadata = {
-        # TODO(crbug.com/948633): For right now, we use "TELEMETRY" as the
-        # clock domain to guarantee that Telemetry is given its own clock
-        # domain. Telemetry isn't really a clock domain, though: it's a
-        # system that USES a clock domain like LINUX_CLOCK_MONOTONIC or
-        # WIN_QPC. However, there's a chance that a Telemetry controller
-        # running on Linux (using LINUX_CLOCK_MONOTONIC) is interacting
-        # with an Android phone (also using LINUX_CLOCK_MONOTONIC, but
-        # on a different machine). The current logic collapses clock
-        # domains based solely on the clock domain string, but we really
-        # should to collapse based on some (device ID, clock domain ID)
-        # tuple. Giving Telemetry its own clock domain is a work-around
-        # for this.
-        "clock-domain": "TELEMETRY",
-        "telemetry": telemetry_metadata_for_json,
-    }
-  elif _format == JSON:
-    raise TraceException("Can't write metadata in JSON format")
-  else:
-    raise TraceException("Unknown format: %s" % _format)
-
-def trace_set_clock_snapshot(telemetry_ts, boottime_ts):
-  """Set timestamps to be written in a ClockSnapshot message.
-
-  This function must be called before the trace start. When trace starts,
-  a ClockSnapshot message with given timestamps will be written in protobuf
-  format. In json format, nothing will happen. Use clock_sync function
-  for clock synchronization in json format.
-
-  Args:
-    telemetry_ts: BOOTTIME of the device where Telemetry runs.
-    boottime_ts: BOOTTIME of the device where the tested browser runs.
-  """
-  global _telemetry_ts
-  global _boottime_ts
-  global _emit_clock_sync
-  global _enabled
-  if _enabled:
-    raise TraceException("Can't set the clock snapshot after trace started.")
-  _telemetry_ts = telemetry_ts
-  _boottime_ts = boottime_ts
-  _emit_clock_sync = False
-
-def clock_sync(sync_id, issue_ts=None):
-  """Add a clock sync event to the trace log.
-
-  Adds a clock sync event if the TBMv2-style synchronization is enabled.
-  It's enabled in two cases:
-    1) Trace format is json.
-    2) The clock snapshot was not set before the trace start.
-
-  Args:
-    sync_id: ID of clock sync event.
-    issue_ts: Time at which clock sync was issued, in microseconds.
-  """
-  if _emit_clock_sync:
-    time_stamp = trace_time.Now()
-    args_to_log = {"sync_id": sync_id}
-    if issue_ts: # Issuer if issue_ts is set, else reciever.
-      assert issue_ts <= time_stamp
-      args_to_log["issue_ts"] = issue_ts
-    add_trace_event("c", time_stamp, "python", "clock_sync", args_to_log)
-
-def _trace_disable_atexit():
-  trace_disable()
-
-def is_tracing_controllable():
-  global _control_allowed
-  return _control_allowed
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
deleted file mode 100644
index 6c03ea8..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import logging
-import os
-import sys
-import unittest
-
-from log import *
-from parsed_trace_events import *
-from py_utils import tempfile_ext
-
-
-class LogIOTest(unittest.TestCase):
-  def test_enable_with_file(self):
-    with tempfile_ext.TemporaryFileName() as filename:
-      trace_enable(open(filename, 'w+'))
-      trace_disable()
-      e = ParsedTraceEvents(trace_filename=filename)
-      self.assertTrue(len(e) > 0)
-
-  def test_enable_with_filename(self):
-    with tempfile_ext.TemporaryFileName() as filename:
-      trace_enable(filename)
-      trace_disable()
-      e = ParsedTraceEvents(trace_filename=filename)
-      self.assertTrue(len(e) > 0)
-
-  def test_enable_with_implicit_filename(self):
-    expected_filename = "%s.json" % sys.argv[0]
-    def do_work():
-      trace_enable()
-      trace_disable()
-      e = ParsedTraceEvents(trace_filename=expected_filename)
-      self.assertTrue(len(e) > 0)
-    try:
-      do_work()
-    finally:
-      if os.path.exists(expected_filename):
-        os.unlink(expected_filename)
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
-
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
deleted file mode 100644
index 7aaa3fa..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import types
-
-from py_trace_event.trace_event_impl import decorators
-
-
-class TracedMetaClass(type):
-  def __new__(cls, name, bases, attrs):
-    for attr_name, attr_value in attrs.iteritems():
-      if (not attr_name.startswith('_') and
-          isinstance(attr_value, types.FunctionType)):
-        attrs[attr_name] = decorators.traced(attr_value)
-
-    return super(TracedMetaClass, cls).__new__(cls, name, bases, attrs)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
deleted file mode 100644
index c2295ed..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import multiprocessing
-import log
-import time
-
-
-_RealProcess = multiprocessing.Process
-__all__ = []
-
-
-class ProcessSubclass(_RealProcess):
-  def __init__(self, shim, *args, **kwards):
-    _RealProcess.__init__(self, *args, **kwards)
-    self._shim = shim
-
-  def run(self,*args,**kwargs):
-    log._disallow_tracing_control()
-    try:
-      r = _RealProcess.run(self, *args, **kwargs)
-    finally:
-      if log.trace_is_enabled():
-        log.trace_flush() # todo, reduce need for this...
-    return r
-
-class ProcessShim():
-  def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
-    self._proc = ProcessSubclass(self, group, target, name, args, kwargs)
-    # hint to testing code that the shimming worked
-    self._shimmed_by_trace_event = True
-
-  def run(self):
-    self._proc.run()
-
-  def start(self):
-    self._proc.start()
-
-  def terminate(self):
-    if log.trace_is_enabled():
-      # give the flush a chance to finish --> TODO: find some other way.
-      time.sleep(0.25)
-    self._proc.terminate()
-
-  def join(self, timeout=None):
-    self._proc.join( timeout)
-
-  def is_alive(self):
-    return self._proc.is_alive()
-
-  @property
-  def name(self):
-    return self._proc.name
-
-  @name.setter
-  def name(self, name):
-    self._proc.name = name
-
-  @property
-  def daemon(self):
-    return self._proc.daemon
-
-  @daemon.setter
-  def daemon(self, daemonic):
-    self._proc.daemon = daemonic
-
-  @property
-  def authkey(self):
-    return self._proc._authkey
-
-  @authkey.setter
-  def authkey(self, authkey):
-    self._proc.authkey = AuthenticationString(authkey)
-
-  @property
-  def exitcode(self):
-    return self._proc.exitcode
-
-  @property
-  def ident(self):
-    return self._proc.ident
-
-  @property
-  def pid(self):
-    return self._proc.pid
-
-  def __repr__(self):
-    return self._proc.__repr__()
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
deleted file mode 100644
index fdc7514..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import math
-import json
-
-
-class ParsedTraceEvents(object):
-  def __init__(self, events = None, trace_filename = None):
-    """
-    Utility class for filtering and manipulating trace data.
-
-    events -- An iterable object containing trace events
-    trace_filename -- A file object that contains a complete trace.
-
-    """
-    if trace_filename and events:
-      raise Exception("Provide either a trace file or event list")
-    if not trace_filename and events == None:
-      raise Exception("Provide either a trace file or event list")
-
-    if trace_filename:
-      f = open(trace_filename, 'r')
-      t = f.read()
-      f.close()
-
-      # If the event data begins with a [, then we know it should end with a ].
-      # The reason we check for this is because some tracing implementations
-      # cannot guarantee that a ']' gets written to the trace file. So, we are
-      # forgiving and if this is obviously the case, we fix it up before
-      # throwing the string at JSON.parse.
-      if t[0] == '[':
-        n = len(t);
-        if t[n - 1] != ']' and t[n - 1] != '\n':
-          t = t + ']'
-        elif t[n - 2] != ']' and t[n - 1] == '\n':
-          t = t + ']'
-        elif t[n - 3] != ']' and t[n - 2] == '\r' and t[n - 1] == '\n':
-          t = t + ']'
-
-      try:
-        events = json.loads(t)
-      except ValueError:
-        raise Exception("Corrupt trace, did not parse. Value: %s" % t)
-
-      if 'traceEvents' in events:
-        events = events['traceEvents']
-
-    if not hasattr(events, '__iter__'):
-      raise Exception, 'events must be iteraable.'
-    self.events = events
-    self.pids = None
-    self.tids = None
-
-  def __len__(self):
-    return len(self.events)
-
-  def __getitem__(self, i):
-    return self.events[i]
-
-  def __setitem__(self, i, v):
-    self.events[i] = v
-
-  def __repr__(self):
-    return "[%s]" % ",\n ".join([repr(e) for e in self.events])
-
-  def findProcessIds(self):
-    if self.pids:
-      return self.pids
-    pids = set()
-    for e in self.events:
-      if "pid" in e and e["pid"]:
-        pids.add(e["pid"])
-    self.pids = list(pids)
-    return self.pids
-
-  def findThreadIds(self):
-    if self.tids:
-      return self.tids
-    tids = set()
-    for e in self.events:
-      if "tid" in e and e["tid"]:
-        tids.add(e["tid"])
-    self.tids = list(tids)
-    return self.tids
-
-  def findEventsOnProcess(self, pid):
-    return ParsedTraceEvents([e for e in self.events if e["pid"] == pid])
-
-  def findEventsOnThread(self, tid):
-    return ParsedTraceEvents(
-        [e for e in self.events if e["ph"] != "M" and e["tid"] == tid])
-
-  def findByPhase(self, ph):
-    return ParsedTraceEvents([e for e in self.events if e["ph"] == ph])
-
-  def findByName(self, n):
-    return ParsedTraceEvents([e for e in self.events if e["name"] == n])
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py
deleted file mode 100644
index 5be4a8e..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py
+++ /dev/null
@@ -1,331 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-""" Classes representing perfetto trace protobuf messages.
-
-This module makes use of neither python-protobuf library nor python classes
-compiled from .proto definitions, because currently there's no way to
-deploy those to all the places where telemetry is run.
-
-TODO(crbug.com/944078): Remove this module after the python-protobuf library
-is deployed to all the bots.
-
-Definitions of perfetto messages can be found here:
-https://android.googlesource.com/platform/external/perfetto/+/refs/heads/master/protos/perfetto/trace/
-"""
-
-import encoder
-import wire_format
-
-
-class TracePacket(object):
-  def __init__(self):
-    self.clock_snapshot = None
-    self.timestamp = None
-    self.timestamp_clock_id = None
-    self.interned_data = None
-    self.thread_descriptor = None
-    self.incremental_state_cleared = None
-    self.chrome_event = None
-    self.track_event = None
-    self.trusted_packet_sequence_id = None
-    self.chrome_benchmark_metadata = None
-
-  def encode(self):
-    parts = []
-    if self.chrome_event is not None:
-      tag = encoder.TagBytes(5, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.chrome_event.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.clock_snapshot is not None:
-      tag = encoder.TagBytes(6, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.clock_snapshot.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.timestamp is not None:
-      writer = encoder.UInt64Encoder(8, False, False)
-      writer(parts.append, self.timestamp)
-    if self.trusted_packet_sequence_id is not None:
-      writer = encoder.UInt32Encoder(10, False, False)
-      writer(parts.append, self.trusted_packet_sequence_id)
-    if self.track_event is not None:
-      tag = encoder.TagBytes(11, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.track_event.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.interned_data is not None:
-      tag = encoder.TagBytes(12, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.interned_data.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.incremental_state_cleared is not None:
-      writer = encoder.BoolEncoder(41, False, False)
-      writer(parts.append, self.incremental_state_cleared)
-    if self.thread_descriptor is not None:
-      tag = encoder.TagBytes(44, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.thread_descriptor.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.chrome_benchmark_metadata is not None:
-      tag = encoder.TagBytes(48, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.chrome_benchmark_metadata.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.timestamp_clock_id is not None:
-      writer = encoder.UInt32Encoder(58, False, False)
-      writer(parts.append, self.timestamp_clock_id)
-
-    return b"".join(parts)
-
-
-class InternedData(object):
-  def __init__(self):
-    self.event_category = None
-    self.legacy_event_name = None
-
-  def encode(self):
-    parts = []
-    if self.event_category is not None:
-      tag = encoder.TagBytes(1, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.event_category.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.legacy_event_name is not None:
-      tag = encoder.TagBytes(2, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.legacy_event_name.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-
-    return b"".join(parts)
-
-
-class EventCategory(object):
-  def __init__(self):
-    self.iid = None
-    self.name = None
-
-  def encode(self):
-    if (self.iid is None or self.name is None):
-      raise RuntimeError("Missing mandatory fields.")
-
-    parts = []
-    writer = encoder.UInt32Encoder(1, False, False)
-    writer(parts.append, self.iid)
-    writer = encoder.StringEncoder(2, False, False)
-    writer(parts.append, self.name)
-
-    return b"".join(parts)
-
-
-LegacyEventName = EventCategory
-
-
-class ThreadDescriptor(object):
-  def __init__(self):
-    self.pid = None
-    self.tid = None
-
-  def encode(self):
-    if (self.pid is None or self.tid is None):
-      raise RuntimeError("Missing mandatory fields.")
-
-    parts = []
-    writer = encoder.UInt32Encoder(1, False, False)
-    writer(parts.append, self.pid)
-    writer = encoder.UInt32Encoder(2, False, False)
-    writer(parts.append, self.tid)
-
-    return b"".join(parts)
-
-
-class ChromeEventBundle(object):
-  def __init__(self):
-    self.metadata = []
-
-  def encode(self):
-    parts = []
-    for item in self.metadata:
-      tag = encoder.TagBytes(2, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = item.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-
-    return b"".join(parts)
-
-
-class TrackEvent(object):
-  def __init__(self):
-    self.legacy_event = None
-    self.category_iids = None
-    self.debug_annotations = []
-
-  def encode(self):
-    parts = []
-    if self.category_iids is not None:
-      writer = encoder.UInt32Encoder(3, is_repeated=True, is_packed=False)
-      writer(parts.append, self.category_iids)
-    for annotation in self.debug_annotations:
-      tag = encoder.TagBytes(4, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = annotation.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-    if self.legacy_event is not None:
-      tag = encoder.TagBytes(6, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = self.legacy_event.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-
-    return b"".join(parts)
-
-
-class LegacyEvent(object):
-  def __init__(self):
-    self.phase = None
-    self.name_iid = None
-
-  def encode(self):
-    parts = []
-    if self.name_iid is not None:
-      writer = encoder.UInt32Encoder(1, False, False)
-      writer(parts.append, self.name_iid)
-    if self.phase is not None:
-      writer = encoder.Int32Encoder(2, False, False)
-      writer(parts.append, self.phase)
-
-    return b"".join(parts)
-
-
-class ChromeBenchmarkMetadata(object):
-  def __init__(self):
-    self.benchmark_start_time_us = None
-    self.story_run_time_us = None
-    self.benchmark_name = None
-    self.benchmark_description = None
-    self.story_name = None
-    self.story_tags = None
-    self.story_run_index = None
-    self.label = None
-
-  def encode(self):
-    parts = []
-    if self.benchmark_start_time_us is not None:
-      writer = encoder.Int64Encoder(1, False, False)
-      writer(parts.append, self.benchmark_start_time_us)
-    if self.story_run_time_us is not None:
-      writer = encoder.Int64Encoder(2, False, False)
-      writer(parts.append, self.story_run_time_us)
-    if self.benchmark_name is not None:
-      writer = encoder.StringEncoder(3, False, False)
-      writer(parts.append, self.benchmark_name)
-    if self.benchmark_description is not None:
-      writer = encoder.StringEncoder(4, False, False)
-      writer(parts.append, self.benchmark_description)
-    if self.label is not None:
-      writer = encoder.StringEncoder(5, False, False)
-      writer(parts.append, self.label)
-    if self.story_name is not None:
-      writer = encoder.StringEncoder(6, False, False)
-      writer(parts.append, self.story_name)
-    if self.story_tags is not None:
-      writer = encoder.StringEncoder(7, is_repeated=True, is_packed=False)
-      writer(parts.append, self.story_tags)
-    if self.story_run_index is not None:
-      writer = encoder.Int32Encoder(8, False, False)
-      writer(parts.append, self.story_run_index)
-
-    return b"".join(parts)
-
-
-def write_trace_packet(output, trace_packet):
-  tag = encoder.TagBytes(1, wire_format.WIRETYPE_LENGTH_DELIMITED)
-  output.write(tag)
-  binary_data = trace_packet.encode()
-  encoder._EncodeVarint(output.write, len(binary_data))
-  output.write(binary_data)
-
-
-class DebugAnnotation(object):
-  def __init__(self):
-    self.name = None
-    self.int_value = None
-    self.double_value = None
-    self.string_value = None
-
-  def encode(self):
-    if self.name is None:
-      raise RuntimeError("DebugAnnotation must have a name.")
-    if ((self.string_value is not None) +
-        (self.int_value is not None) +
-        (self.double_value is not None)) != 1:
-      raise RuntimeError("DebugAnnotation must have exactly one value.")
-
-    parts = []
-    writer = encoder.StringEncoder(10, False, False)
-    writer(parts.append, self.name)
-    if self.int_value is not None:
-      writer = encoder.Int64Encoder(4, False, False)
-      writer(parts.append, self.int_value)
-    if self.double_value is not None:
-      writer = encoder.DoubleEncoder(5, False, False)
-      writer(parts.append, self.double_value)
-    if self.string_value is not None:
-      writer = encoder.StringEncoder(6, False, False)
-      writer(parts.append, self.string_value)
-
-    return b"".join(parts)
-
-
-class ChromeMetadata(object):
-  def __init__(self):
-    self.name = None
-    self.string_value = None
-
-  def encode(self):
-    if self.name is None or self.string_value is None:
-      raise RuntimeError("ChromeMetadata must have a name and a value.")
-
-    parts = []
-    writer = encoder.StringEncoder(1, False, False)
-    writer(parts.append, self.name)
-    writer = encoder.StringEncoder(2, False, False)
-    writer(parts.append, self.string_value)
-
-    return b"".join(parts)
-
-
-class Clock(object):
-  def __init__(self):
-    self.clock_id = None
-    self.timestamp = None
-
-  def encode(self):
-    if self.clock_id is None or self.timestamp is None:
-      raise RuntimeError("Clock must have a clock_id and a timestamp.")
-
-    parts = []
-    writer = encoder.UInt32Encoder(1, False, False)
-    writer(parts.append, self.clock_id)
-    writer = encoder.UInt64Encoder(2, False, False)
-    writer(parts.append, self.timestamp)
-
-    return b"".join(parts)
-
-
-class ClockSnapshot(object):
-  def __init__(self):
-    self.clocks = []
-
-  def encode(self):
-    if len(self.clocks) < 2:
-      raise RuntimeError("ClockSnapshot must have at least two clocks.")
-
-    parts = []
-    for clock in self.clocks:
-      tag = encoder.TagBytes(1, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      data = clock.encode()
-      length = encoder._VarintBytes(len(data))
-      parts += [tag, length, data]
-
-    return b"".join(parts)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py
deleted file mode 100644
index 584352c..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py
+++ /dev/null
@@ -1,219 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-""" Functions to write trace data in perfetto protobuf format.
-"""
-
-import collections
-
-import perfetto_proto_classes as proto
-
-CLOCK_BOOTTIME = 6
-CLOCK_TELEMETRY = 64
-
-
-def reset_global_state():
-  global _interned_categories_by_tid
-  global _interned_event_names_by_tid
-  global _next_sequence_id
-  global _sequence_ids
-
-  # Dicts of strings for interning.
-  # Note that each thread has its own interning index.
-  _interned_categories_by_tid = collections.defaultdict(dict)
-  _interned_event_names_by_tid = collections.defaultdict(dict)
-
-  # Trusted sequence ids from telemetry should not overlap with
-  # trusted sequence ids from other trace producers. Chrome assigns
-  # sequence ids incrementally starting from 1 and we expect all its ids
-  # to be well below 10000. Starting from 2^20 will give us enough
-  # confidence that it will not overlap.
-  _next_sequence_id = 1<<20
-  _sequence_ids = {}
-
-
-reset_global_state()
-
-
-def _get_sequence_id(tid):
-  global _sequence_ids
-  global _next_sequence_id
-  if tid not in _sequence_ids:
-    _sequence_ids[tid] = _next_sequence_id
-    _next_sequence_id += 1
-  return _sequence_ids[tid]
-
-
-def _intern_category(category, trace_packet, tid):
-  global _interned_categories_by_tid
-  categories = _interned_categories_by_tid[tid]
-  if category not in categories:
-    # note that interning indices start from 1
-    categories[category] = len(categories) + 1
-    if trace_packet.interned_data is None:
-      trace_packet.interned_data = proto.InternedData()
-    trace_packet.interned_data.event_category = proto.EventCategory()
-    trace_packet.interned_data.event_category.iid = categories[category]
-    trace_packet.interned_data.event_category.name = category
-  return categories[category]
-
-
-def _intern_event_name(event_name, trace_packet, tid):
-  global _interned_event_names_by_tid
-  event_names = _interned_event_names_by_tid[tid]
-  if event_name not in event_names:
-    # note that interning indices start from 1
-    event_names[event_name] = len(event_names) + 1
-    if trace_packet.interned_data is None:
-      trace_packet.interned_data = proto.InternedData()
-    trace_packet.interned_data.legacy_event_name = proto.LegacyEventName()
-    trace_packet.interned_data.legacy_event_name.iid = event_names[event_name]
-    trace_packet.interned_data.legacy_event_name.name = event_name
-  return event_names[event_name]
-
-
-def write_thread_descriptor_event(output, pid, tid, ts):
-  """Write the first event in a sequence.
-
-  Call this function before writing any other events.
-  Note that this function is NOT thread-safe.
-
-  Args:
-    output: a file-like object to write events into.
-    pid: process ID.
-    tid: thread ID.
-    ts: timestamp in microseconds.
-  """
-  thread_descriptor_packet = proto.TracePacket()
-  thread_descriptor_packet.trusted_packet_sequence_id = _get_sequence_id(tid)
-  thread_descriptor_packet.timestamp = int(ts * 1e3)
-  thread_descriptor_packet.timestamp_clock_id = CLOCK_TELEMETRY
-
-  thread_descriptor_packet.thread_descriptor = proto.ThreadDescriptor()
-  thread_descriptor_packet.thread_descriptor.pid = pid
-  # Thread ID from threading module doesn't fit into int32.
-  # But we don't need the exact thread ID, just some number to
-  # distinguish one thread from another. We assume that the last 31 bits
-  # will do for that purpose.
-  thread_descriptor_packet.thread_descriptor.tid = tid & 0x7FFFFFFF
-  thread_descriptor_packet.incremental_state_cleared = True;
-
-  proto.write_trace_packet(output, thread_descriptor_packet)
-
-
-def write_event(output, ph, category, name, ts, args, tid):
-  """Write a trace event.
-
-  Note that this function is NOT thread-safe.
-
-  Args:
-    output: a file-like object to write events into.
-    ph: phase of event.
-    category: category of event.
-    name: event name.
-    ts: timestamp in microseconds.
-    args: dict of arbitrary key-values to be stored as DebugAnnotations.
-    tid: thread ID.
-  """
-  packet = proto.TracePacket()
-  packet.trusted_packet_sequence_id = _get_sequence_id(tid)
-  packet.timestamp = int(ts * 1e3)
-  packet.timestamp_clock_id = CLOCK_TELEMETRY
-
-  packet.track_event = proto.TrackEvent()
-  packet.track_event.category_iids = [_intern_category(category, packet, tid)]
-  legacy_event = proto.LegacyEvent()
-  legacy_event.phase = ord(ph)
-  legacy_event.name_iid = _intern_event_name(name, packet, tid)
-  packet.track_event.legacy_event = legacy_event
-
-  for name, value in args.iteritems():
-    debug_annotation = proto.DebugAnnotation()
-    debug_annotation.name = name
-    if isinstance(value, int):
-      debug_annotation.int_value = value
-    elif isinstance(value, float):
-      debug_annotation.double_value = value
-    else:
-      debug_annotation.string_value = str(value)
-    packet.track_event.debug_annotations.append(debug_annotation)
-
-  proto.write_trace_packet(output, packet)
-
-
-def write_chrome_metadata(output, clock_domain):
-  """Write a chrome trace event with metadata.
-
-  Args:
-    output: a file-like object to write events into.
-    clock_domain: a string representing the trace clock domain.
-  """
-  chrome_metadata = proto.ChromeMetadata()
-  chrome_metadata.name = 'clock-domain'
-  chrome_metadata.string_value = clock_domain
-  chrome_event = proto.ChromeEventBundle()
-  chrome_event.metadata.append(chrome_metadata)
-  packet = proto.TracePacket()
-  packet.chrome_event = chrome_event
-  proto.write_trace_packet(output, packet)
-
-
-def write_metadata(
-    output,
-    benchmark_start_time_us,
-    story_run_time_us,
-    benchmark_name,
-    benchmark_description,
-    story_name,
-    story_tags,
-    story_run_index,
-    label=None,
-):
-  """Write a ChromeBenchmarkMetadata message."""
-  metadata = proto.ChromeBenchmarkMetadata()
-  metadata.benchmark_start_time_us = int(benchmark_start_time_us)
-  metadata.story_run_time_us = int(story_run_time_us)
-  metadata.benchmark_name = benchmark_name
-  metadata.benchmark_description = benchmark_description
-  metadata.story_name = story_name
-  metadata.story_tags = list(story_tags)
-  metadata.story_run_index = int(story_run_index)
-  if label is not None:
-    metadata.label = label
-
-  packet = proto.TracePacket()
-  packet.chrome_benchmark_metadata = metadata
-  proto.write_trace_packet(output, packet)
-
-
-def write_clock_snapshot(
-    output,
-    tid,
-    telemetry_ts=None,
-    boottime_ts=None,
-):
-  """Write a ClockSnapshot message.
-
-  Note that this function is NOT thread-safe.
-
-  Args:
-    output: a file-like object to write events into.
-    telemetry_ts: host BOOTTIME timestamp in microseconds.
-    boottime_ts: device BOOTTIME timestamp in microseconds.
-  """
-  clock_snapshot = proto.ClockSnapshot()
-  if telemetry_ts is not None:
-    clock = proto.Clock()
-    clock.clock_id = CLOCK_TELEMETRY
-    clock.timestamp = int(telemetry_ts * 1e3)
-    clock_snapshot.clocks.append(clock)
-  if boottime_ts is not None:
-    clock = proto.Clock()
-    clock.clock_id = CLOCK_BOOTTIME
-    clock.timestamp = int(boottime_ts * 1e3)
-    clock_snapshot.clocks.append(clock)
-  packet = proto.TracePacket()
-  packet.trusted_packet_sequence_id = _get_sequence_id(tid)
-  packet.clock_snapshot = clock_snapshot
-  proto.write_trace_packet(output, packet)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py
deleted file mode 100644
index 00dafa4..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer_unittest.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-import StringIO
-
-from py_trace_event.trace_event_impl import perfetto_trace_writer
-
-
-class PerfettoTraceWriterTest(unittest.TestCase):
-  """ Tests functions that write perfetto protobufs.
-
-  TODO(crbug.com/944078): Switch to using python-protobuf library
-  and implement proper protobuf parsing then.
-  """
-  def setUp(self):
-    perfetto_trace_writer.reset_global_state()
-
-  def testWriteThreadDescriptorEvent(self):
-    result = StringIO.StringIO()
-    perfetto_trace_writer.write_thread_descriptor_event(
-        output=result,
-        pid=1,
-        tid=2,
-        ts=1556716807306000,
-    )
-    expected_output = (
-        '\n\x1b@\x80\xec\xea\xda\x83\xb6\xa4\xcd\x15P\x80\x80@'
-        '\xc8\x02\x01\xe2\x02\x04\x08\x01\x10\x02\xd0\x03@'
-    )
-    self.assertEqual(expected_output, result.getvalue())
-
-  def testWriteTwoEvents(self):
-    result = StringIO.StringIO()
-    perfetto_trace_writer.write_thread_descriptor_event(
-        output=result,
-        pid=1,
-        tid=2,
-        ts=1556716807306000,
-    )
-    perfetto_trace_writer.write_event(
-        output=result,
-        ph="M",
-        category="category",
-        name="event_name",
-        ts=1556716807406000,
-        args={},
-        tid=2,
-    )
-    expected_output = (
-        '\n\x1b@\x80\xec\xea\xda\x83\xb6\xa4\xcd\x15P\x80\x80@'
-        '\xc8\x02\x01\xe2\x02\x04\x08\x01\x10\x02\xd0\x03@\n;@'
-        '\x80\xb0\xc2\x8a\x84\xb6\xa4\xcd\x15P\x80\x80@Z\x08'
-        '\x18\x012\x04\x08\x01\x10Mb\x1e\n\x0c\x08\x01\x12\x08'
-        'category\x12\x0e\x08\x01\x12\nevent_name\xd0\x03@'
-    )
-    self.assertEqual(expected_output, result.getvalue())
-
-  def testWriteMetadata(self):
-    result = StringIO.StringIO()
-    perfetto_trace_writer.write_metadata(
-        output=result,
-        benchmark_start_time_us=1556716807306000,
-        story_run_time_us=1556716807406000,
-        benchmark_name="benchmark",
-        benchmark_description="description",
-        story_name="story",
-        story_tags=["foo", "bar"],
-        story_run_index=0,
-        label="label",
-    )
-    expected_output = (
-        '\nG\x82\x03D\x08\x90\xf6\xc2\x82\xb6\xfa\xe1'
-        '\x02\x10\xb0\x83\xc9\x82\xb6\xfa\xe1\x02\x1a\tbenchmark"'
-        '\x0bdescription*\x05label2\x05story:\x03foo:\x03bar@\x00'
-    )
-    self.assertEqual(expected_output, result.getvalue())
-
-  def testWriteArgs(self):
-    result = StringIO.StringIO()
-    perfetto_trace_writer.write_thread_descriptor_event(
-        output=result,
-        pid=1,
-        tid=2,
-        ts=0,
-    )
-    perfetto_trace_writer.write_event(
-        output=result,
-        ph="M",
-        category="",
-        name="",
-        ts=0,
-        args={'int': 123, 'double': 1.23, 'string': 'onetwothree'},
-        tid=2,
-    )
-    expected_output = (
-        '\n\x13@\x00P\x80\x80@\xc8\x02\x01\xe2\x02\x04\x08\x01\x10'
-        '\x02\xd0\x03@\nT@\x00P\x80\x80@Z;\x18\x01"\x07R\x03int {"\x11'
-        'R\x06double)\xaeG\xe1z\x14\xae\xf3?"\x15R\x06string2\x0bonetwothree2'
-        '\x04\x08\x01\x10Mb\x0c\n\x04\x08\x01\x12\x00\x12\x04\x08\x01\x12\x00'
-        '\xd0\x03@'
-    )
-    self.assertEqual(expected_output, result.getvalue())
-
-  def testWriteChromeMetadata(self):
-    result = StringIO.StringIO()
-    perfetto_trace_writer.write_chrome_metadata(
-        output=result,
-        clock_domain='FOO',
-    )
-    expected_output = (
-       '\n\x17*\x15\x12\x13\n\x0cclock-domain\x12\x03FOO'
-    )
-    self.assertEqual(expected_output, result.getvalue())
-
-  def testWriteClockSnapshot(self):
-    result = StringIO.StringIO()
-    perfetto_trace_writer.write_clock_snapshot(
-        output=result,
-        tid=1,
-        telemetry_ts=1234.567,
-        boottime_ts=7654.321,
-    )
-    expected_output = (
-       '\n\x172\x11\n\x06\x08@\x10\x87\xadK\n\x07\x08\x06\x10'
-       '\xb1\x97\xd3\x03P\x80\x80@'
-    )
-    self.assertEqual(expected_output, result.getvalue())
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
deleted file mode 100644
index 1216037..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import unittest
-
-#from .log import *
-#from .parsed_trace_events import *
-
-from log import *
-from parsed_trace_events import *
-from py_utils import tempfile_ext
-
-class TraceTest(unittest.TestCase):
-  def __init__(self, *args):
-    """
-    Infrastructure for running tests of the tracing system.
-
-    Does not actually run any tests. Look at subclasses for those.
-    """
-    unittest.TestCase.__init__(self, *args)
-    self._file = None
-
-  def go(self, cb):
-    """
-    Enables tracing, runs the provided callback, and if successful, returns a
-    TraceEvents object with the results.
-    """
-    with tempfile_ext.TemporaryFileName() as filename:
-      self._file = open(filename, 'a+')
-      trace_enable(self._file)
-      try:
-        cb()
-      finally:
-        trace_disable()
-      e = ParsedTraceEvents(trace_filename=self._file.name)
-      self._file.close()
-      self._file = None
-    return e
-
-  @property
-  def trace_filename(self):
-    return self._file.name
-
-  def tearDown(self):
-    if trace_is_enabled():
-      trace_disable()
-    if self._file:
-      self._file.close()
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
deleted file mode 100644
index de7b594..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
+++ /dev/null
@@ -1,528 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import contextlib
-import json
-import logging
-import math
-import multiprocessing
-import os
-import time
-import unittest
-import sys
-
-from py_trace_event import trace_event
-from py_trace_event import trace_time
-from py_trace_event.trace_event_impl import log
-from py_trace_event.trace_event_impl import multiprocessing_shim
-from py_utils import tempfile_ext
-
-
-class TraceEventTests(unittest.TestCase):
-
-  @contextlib.contextmanager
-  def _test_trace(self, disable=True, format=None):
-    with tempfile_ext.TemporaryFileName() as filename:
-      self._log_path = filename
-      try:
-        trace_event.trace_enable(self._log_path, format=format)
-        yield
-      finally:
-        if disable:
-          trace_event.trace_disable()
-
-  def testNoImpl(self):
-    orig_impl = trace_event.trace_event_impl
-    try:
-      trace_event.trace_event_impl = None
-      self.assertFalse(trace_event.trace_can_enable())
-    finally:
-      trace_event.trace_event_impl = orig_impl
-
-  def testImpl(self):
-    self.assertTrue(trace_event.trace_can_enable())
-
-  def testIsEnabledFalse(self):
-    self.assertFalse(trace_event.trace_is_enabled())
-
-  def testIsEnabledTrue(self):
-    with self._test_trace():
-      self.assertTrue(trace_event.trace_is_enabled())
-
-  def testEnable(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 1)
-        self.assertTrue(trace_event.trace_is_enabled())
-        log_output = log_output.pop()
-        self.assertEquals(log_output['category'], 'process_argv')
-        self.assertEquals(log_output['name'], 'process_argv')
-        self.assertTrue(log_output['args']['argv'])
-        self.assertEquals(log_output['ph'], 'M')
-
-  def testDoubleEnable(self):
-    try:
-      with self._test_trace():
-        with self._test_trace():
-          pass
-    except log.TraceException:
-      return
-    assert False
-
-  def testDisable(self):
-    _old_multiprocessing_process = multiprocessing.Process
-    with self._test_trace(disable=False):
-      with open(self._log_path, 'r') as f:
-        self.assertTrue(trace_event.trace_is_enabled())
-        self.assertEqual(
-            multiprocessing.Process, multiprocessing_shim.ProcessShim)
-        trace_event.trace_disable()
-        self.assertEqual(
-            multiprocessing.Process, _old_multiprocessing_process)
-        self.assertEquals(len(json.loads(f.read() + ']')), 1)
-        self.assertFalse(trace_event.trace_is_enabled())
-
-  def testDoubleDisable(self):
-    with self._test_trace():
-      pass
-    trace_event.trace_disable()
-
-  def testFlushChanges(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        trace_event.clock_sync('1')
-        self.assertEquals(len(json.loads(f.read() + ']')), 1)
-        f.seek(0)
-        trace_event.trace_flush()
-        self.assertEquals(len(json.loads(f.read() + ']')), 2)
-
-  def testFlushNoChanges(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        self.assertEquals(len(json.loads(f.read() + ']')),1)
-        f.seek(0)
-        trace_event.trace_flush()
-        self.assertEquals(len(json.loads(f.read() + ']')), 1)
-
-  def testDoubleFlush(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        trace_event.clock_sync('1')
-        self.assertEquals(len(json.loads(f.read() + ']')), 1)
-        f.seek(0)
-        trace_event.trace_flush()
-        trace_event.trace_flush()
-        self.assertEquals(len(json.loads(f.read() + ']')), 2)
-
-  def testTraceBegin(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        trace_event.trace_begin('test_event', this='that')
-        trace_event.trace_flush()
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 2)
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'process_argv')
-        self.assertEquals(current_entry['name'], 'process_argv')
-        self.assertTrue( current_entry['args']['argv'])
-        self.assertEquals( current_entry['ph'], 'M')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], 'test_event')
-        self.assertEquals(current_entry['args']['this'], '\'that\'')
-        self.assertEquals(current_entry['ph'], 'B')
-
-  def testTraceEnd(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        trace_event.trace_end('test_event')
-        trace_event.trace_flush()
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 2)
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'process_argv')
-        self.assertEquals(current_entry['name'], 'process_argv')
-        self.assertTrue(current_entry['args']['argv'])
-        self.assertEquals(current_entry['ph'], 'M')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], 'test_event')
-        self.assertEquals(current_entry['args'], {})
-        self.assertEquals(current_entry['ph'], 'E')
-
-  def testTrace(self):
-   with self._test_trace():
-      with trace_event.trace('test_event', this='that'):
-        pass
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 3)
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'process_argv')
-        self.assertEquals(current_entry['name'], 'process_argv')
-        self.assertTrue(current_entry['args']['argv'])
-        self.assertEquals(current_entry['ph'], 'M')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], 'test_event')
-        self.assertEquals(current_entry['args']['this'], '\'that\'')
-        self.assertEquals(current_entry['ph'], 'B')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], 'test_event')
-        self.assertEquals(current_entry['args'], {})
-        self.assertEquals(current_entry['ph'], 'E')
-
-  def testTracedDecorator(self):
-    @trace_event.traced("this")
-    def test_decorator(this="that"):
-      pass
-
-    with self._test_trace():
-      test_decorator()
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 3)
-        expected_name = __name__ + '.test_decorator'
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'process_argv')
-        self.assertEquals(current_entry['name'], 'process_argv')
-        self.assertTrue(current_entry['args']['argv'])
-        self.assertEquals(current_entry['ph'], 'M')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], expected_name)
-        self.assertEquals(current_entry['args']['this'], '\'that\'')
-        self.assertEquals(current_entry['ph'], 'B')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], expected_name)
-        self.assertEquals(current_entry['args'], {})
-        self.assertEquals(current_entry['ph'], 'E')
-
-  def testClockSyncWithTs(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        trace_event.clock_sync('id', issue_ts=trace_time.Now())
-        trace_event.trace_flush()
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 2)
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'process_argv')
-        self.assertEquals(current_entry['name'], 'process_argv')
-        self.assertTrue(current_entry['args']['argv'])
-        self.assertEquals(current_entry['ph'], 'M')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], 'clock_sync')
-        self.assertTrue(current_entry['args']['issue_ts'])
-        self.assertEquals(current_entry['ph'], 'c')
-
-  def testClockSyncWithoutTs(self):
-    with self._test_trace():
-      with open(self._log_path, 'r') as f:
-        trace_event.clock_sync('id')
-        trace_event.trace_flush()
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 2)
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'process_argv')
-        self.assertEquals(current_entry['name'], 'process_argv')
-        self.assertTrue(current_entry['args']['argv'])
-        self.assertEquals(current_entry['ph'], 'M')
-        current_entry = log_output.pop(0)
-        self.assertEquals(current_entry['category'], 'python')
-        self.assertEquals(current_entry['name'], 'clock_sync')
-        self.assertFalse(current_entry['args'].get('issue_ts'))
-        self.assertEquals(current_entry['ph'], 'c')
-
-  def testTime(self):
-    actual_diff = []
-    def func1():
-      trace_begin("func1")
-      start = time.time()
-      time.sleep(0.25)
-      end = time.time()
-      actual_diff.append(end-start) # Pass via array because of Python scoping
-      trace_end("func1")
-
-    with self._test_trace():
-      start_ts = time.time()
-      trace_event.trace_begin('test')
-      end_ts = time.time()
-      trace_event.trace_end('test')
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 3)
-        meta_data = log_output[0]
-        open_data = log_output[1]
-        close_data = log_output[2]
-        self.assertEquals(meta_data['category'], 'process_argv')
-        self.assertEquals(meta_data['name'], 'process_argv')
-        self.assertTrue(meta_data['args']['argv'])
-        self.assertEquals(meta_data['ph'], 'M')
-        self.assertEquals(open_data['category'], 'python')
-        self.assertEquals(open_data['name'], 'test')
-        self.assertEquals(open_data['ph'], 'B')
-        self.assertEquals(close_data['category'], 'python')
-        self.assertEquals(close_data['name'], 'test')
-        self.assertEquals(close_data['ph'], 'E')
-        event_time_diff = close_data['ts'] - open_data['ts']
-        recorded_time_diff = (end_ts - start_ts) * 1000000
-        self.assertLess(math.fabs(event_time_diff - recorded_time_diff), 1000)
-
-  def testNestedCalls(self):
-    with self._test_trace():
-      trace_event.trace_begin('one')
-      trace_event.trace_begin('two')
-      trace_event.trace_end('two')
-      trace_event.trace_end('one')
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 5)
-        meta_data = log_output[0]
-        one_open = log_output[1]
-        two_open = log_output[2]
-        two_close = log_output[3]
-        one_close = log_output[4]
-        self.assertEquals(meta_data['category'], 'process_argv')
-        self.assertEquals(meta_data['name'], 'process_argv')
-        self.assertTrue(meta_data['args']['argv'])
-        self.assertEquals(meta_data['ph'], 'M')
-
-        self.assertEquals(one_open['category'], 'python')
-        self.assertEquals(one_open['name'], 'one')
-        self.assertEquals(one_open['ph'], 'B')
-        self.assertEquals(one_close['category'], 'python')
-        self.assertEquals(one_close['name'], 'one')
-        self.assertEquals(one_close['ph'], 'E')
-
-        self.assertEquals(two_open['category'], 'python')
-        self.assertEquals(two_open['name'], 'two')
-        self.assertEquals(two_open['ph'], 'B')
-        self.assertEquals(two_close['category'], 'python')
-        self.assertEquals(two_close['name'], 'two')
-        self.assertEquals(two_close['ph'], 'E')
-
-        self.assertLessEqual(one_open['ts'], two_open['ts'])
-        self.assertGreaterEqual(one_close['ts'], two_close['ts'])
-
-  def testInterleavedCalls(self):
-    with self._test_trace():
-      trace_event.trace_begin('one')
-      trace_event.trace_begin('two')
-      trace_event.trace_end('one')
-      trace_event.trace_end('two')
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 5)
-        meta_data = log_output[0]
-        one_open = log_output[1]
-        two_open = log_output[2]
-        two_close = log_output[4]
-        one_close = log_output[3]
-        self.assertEquals(meta_data['category'], 'process_argv')
-        self.assertEquals(meta_data['name'], 'process_argv')
-        self.assertTrue(meta_data['args']['argv'])
-        self.assertEquals(meta_data['ph'], 'M')
-
-        self.assertEquals(one_open['category'], 'python')
-        self.assertEquals(one_open['name'], 'one')
-        self.assertEquals(one_open['ph'], 'B')
-        self.assertEquals(one_close['category'], 'python')
-        self.assertEquals(one_close['name'], 'one')
-        self.assertEquals(one_close['ph'], 'E')
-
-        self.assertEquals(two_open['category'], 'python')
-        self.assertEquals(two_open['name'], 'two')
-        self.assertEquals(two_open['ph'], 'B')
-        self.assertEquals(two_close['category'], 'python')
-        self.assertEquals(two_close['name'], 'two')
-        self.assertEquals(two_close['ph'], 'E')
-
-        self.assertLessEqual(one_open['ts'], two_open['ts'])
-        self.assertLessEqual(one_close['ts'], two_close['ts'])
-
-  # TODO(khokhlov): Fix this test on Windows. See crbug.com/945819 for details.
-  def disabled_testMultiprocess(self):
-    def child_function():
-      with trace_event.trace('child_event'):
-        pass
-
-    with self._test_trace():
-      trace_event.trace_begin('parent_event')
-      trace_event.trace_flush()
-      p = multiprocessing.Process(target=child_function)
-      p.start()
-      self.assertTrue(hasattr(p, "_shimmed_by_trace_event"))
-      p.join()
-      trace_event.trace_end('parent_event')
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 5)
-        meta_data = log_output[0]
-        parent_open = log_output[1]
-        child_open = log_output[2]
-        child_close = log_output[3]
-        parent_close = log_output[4]
-        self.assertEquals(meta_data['category'], 'process_argv')
-        self.assertEquals(meta_data['name'], 'process_argv')
-        self.assertTrue(meta_data['args']['argv'])
-        self.assertEquals(meta_data['ph'], 'M')
-
-        self.assertEquals(parent_open['category'], 'python')
-        self.assertEquals(parent_open['name'], 'parent_event')
-        self.assertEquals(parent_open['ph'], 'B')
-
-        self.assertEquals(child_open['category'], 'python')
-        self.assertEquals(child_open['name'], 'child_event')
-        self.assertEquals(child_open['ph'], 'B')
-
-        self.assertEquals(child_close['category'], 'python')
-        self.assertEquals(child_close['name'], 'child_event')
-        self.assertEquals(child_close['ph'], 'E')
-
-        self.assertEquals(parent_close['category'], 'python')
-        self.assertEquals(parent_close['name'], 'parent_event')
-        self.assertEquals(parent_close['ph'], 'E')
-
-  @unittest.skipIf(sys.platform == 'win32', 'crbug.com/945819')
-  def testTracingControlDisabledInChildButNotInParent(self):
-    def child(resp):
-      # test tracing is not controllable in the child
-      resp.put(trace_event.is_tracing_controllable())
-
-    with self._test_trace():
-      q = multiprocessing.Queue()
-      p = multiprocessing.Process(target=child, args=[q])
-      p.start()
-      # test tracing is controllable in the parent
-      self.assertTrue(trace_event.is_tracing_controllable())
-      self.assertFalse(q.get())
-      p.join()
-
-  def testMultiprocessExceptionInChild(self):
-    def bad_child():
-      trace_event.trace_disable()
-
-    with self._test_trace():
-      p = multiprocessing.Pool(1)
-      trace_event.trace_begin('parent')
-      self.assertRaises(Exception, lambda: p.apply(bad_child, ()))
-      p.close()
-      p.terminate()
-      p.join()
-      trace_event.trace_end('parent')
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-        self.assertEquals(len(log_output), 3)
-        meta_data = log_output[0]
-        parent_open = log_output[1]
-        parent_close = log_output[2]
-        self.assertEquals(parent_open['category'], 'python')
-        self.assertEquals(parent_open['name'], 'parent')
-        self.assertEquals(parent_open['ph'], 'B')
-        self.assertEquals(parent_close['category'], 'python')
-        self.assertEquals(parent_close['name'], 'parent')
-        self.assertEquals(parent_close['ph'], 'E')
-
-  def testFormatJson(self):
-    with self._test_trace(format=trace_event.JSON):
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        log_output = json.loads(f.read() + ']')
-    self.assertEquals(len(log_output), 1)
-    self.assertEquals(log_output[0]['ph'], 'M')
-
-  def testFormatJsonWithMetadata(self):
-    with self._test_trace(format=trace_event.JSON_WITH_METADATA):
-      trace_event.trace_disable()
-      with open(self._log_path, 'r') as f:
-        log_output = json.load(f)
-    self.assertEquals(len(log_output), 2)
-    events = log_output['traceEvents']
-    self.assertEquals(len(events), 1)
-    self.assertEquals(events[0]['ph'], 'M')
-
-  def testFormatProtobuf(self):
-    with self._test_trace(format=trace_event.PROTOBUF):
-      trace_event.trace_flush()
-      with open(self._log_path, 'r') as f:
-        self.assertGreater(len(f.read()), 0)
-
-  def testAddMetadata(self):
-    with self._test_trace(format=trace_event.JSON_WITH_METADATA):
-      trace_event.trace_add_benchmark_metadata(
-          benchmark_start_time_us=1000,
-          story_run_time_us=2000,
-          benchmark_name='benchmark',
-          benchmark_description='desc',
-          story_name='story',
-          story_tags=['tag1', 'tag2'],
-          story_run_index=0,
-      )
-      trace_event.trace_disable()
-      with open(self._log_path, 'r') as f:
-        log_output = json.load(f)
-    self.assertEquals(len(log_output), 2)
-    telemetry_metadata = log_output['metadata']['telemetry']
-    self.assertEquals(len(telemetry_metadata), 7)
-    self.assertEquals(telemetry_metadata['benchmarkStart'], 1)
-    self.assertEquals(telemetry_metadata['traceStart'], 2)
-    self.assertEquals(telemetry_metadata['benchmarks'], ['benchmark'])
-    self.assertEquals(telemetry_metadata['benchmarkDescriptions'], ['desc'])
-    self.assertEquals(telemetry_metadata['stories'], ['story'])
-    self.assertEquals(telemetry_metadata['storyTags'], ['tag1', 'tag2'])
-    self.assertEquals(telemetry_metadata['storysetRepeats'], [0])
-
-  def testAddMetadataProtobuf(self):
-    with self._test_trace(format=trace_event.PROTOBUF):
-      trace_event.trace_add_benchmark_metadata(
-          benchmark_start_time_us=1000,
-          story_run_time_us=2000,
-          benchmark_name='benchmark',
-          benchmark_description='desc',
-          story_name='story',
-          story_tags=['tag1', 'tag2'],
-          story_run_index=0,
-      )
-      trace_event.trace_disable()
-      with open(self._log_path, 'r') as f:
-        self.assertGreater(len(f.read()), 0)
-
-  def testAddMetadataInJsonFormatRaises(self):
-    with self._test_trace(format=trace_event.JSON):
-      with self.assertRaises(log.TraceException):
-        trace_event.trace_add_benchmark_metadata(
-            benchmark_start_time_us=1000,
-            story_run_time_us=2000,
-            benchmark_name='benchmark',
-            benchmark_description='description',
-            story_name='story',
-            story_tags=['tag1', 'tag2'],
-            story_run_index=0,
-        )
-
-  def testSetClockSnapshotProtobuf(self):
-    trace_event.trace_set_clock_snapshot(
-        telemetry_ts=1234.5678,
-        boottime_ts=8765.4321,
-    )
-    with self._test_trace(format=trace_event.PROTOBUF):
-      trace_event.trace_disable()
-      with open(self._log_path, 'r') as f:
-        self.assertGreater(len(f.read()), 0)
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py
deleted file mode 100644
index c5e3fe1..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py
+++ /dev/null
@@ -1,234 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import ctypes
-import ctypes.util
-import logging
-import os
-import platform
-import sys
-import time
-import threading
-
-
-GET_TICK_COUNT_LAST_NOW = 0
-# If GET_TICK_COUNTER_LAST_NOW is less than the current time, the clock has
-# rolled over, and this needs to be accounted for.
-GET_TICK_COUNT_WRAPAROUNDS = 0
-# The current detected platform
-_CLOCK = None
-_NOW_FUNCTION = None
-# Mapping of supported platforms and what is returned by sys.platform.
-_PLATFORMS = {
-    'mac': 'darwin',
-    'linux': 'linux',
-    'windows': 'win32',
-    'cygwin': 'cygwin',
-    'freebsd': 'freebsd',
-    'sunos': 'sunos5',
-    'bsd': 'bsd'
-}
-# Mapping of what to pass get_clocktime based on platform.
-_CLOCK_MONOTONIC = {
-    'linux': 1,
-    'freebsd': 4,
-    'bsd': 3,
-    'sunos5': 4
-}
-
-_LINUX_CLOCK = 'LINUX_CLOCK_MONOTONIC'
-_MAC_CLOCK = 'MAC_MACH_ABSOLUTE_TIME'
-_WIN_HIRES = 'WIN_QPC'
-_WIN_LORES = 'WIN_ROLLOVER_PROTECTED_TIME_GET_TIME'
-
-def InitializeMacNowFunction(plat):
-  """Sets a monotonic clock for the Mac platform.
-
-    Args:
-      plat: Platform that is being run on. Unused in GetMacNowFunction. Passed
-        for consistency between initilaizers.
-  """
-  del plat  # Unused
-  global _CLOCK  # pylint: disable=global-statement
-  global _NOW_FUNCTION  # pylint: disable=global-statement
-  _CLOCK = _MAC_CLOCK
-  libc = ctypes.CDLL('/usr/lib/libc.dylib', use_errno=True)
-  class MachTimebaseInfoData(ctypes.Structure):
-    """System timebase info. Defined in <mach/mach_time.h>."""
-    _fields_ = (('numer', ctypes.c_uint32),
-                ('denom', ctypes.c_uint32))
-
-  mach_absolute_time = libc.mach_absolute_time
-  mach_absolute_time.restype = ctypes.c_uint64
-
-  timebase = MachTimebaseInfoData()
-  libc.mach_timebase_info(ctypes.byref(timebase))
-  ticks_per_second = timebase.numer / timebase.denom * 1.0e9
-
-  def MacNowFunctionImpl():
-    return mach_absolute_time() / ticks_per_second
-  _NOW_FUNCTION = MacNowFunctionImpl
-
-
-def GetClockGetTimeClockNumber(plat):
-  for key in _CLOCK_MONOTONIC:
-    if plat.startswith(key):
-      return _CLOCK_MONOTONIC[key]
-  raise LookupError('Platform not in clock dicitonary')
-
-def InitializeLinuxNowFunction(plat):
-  """Sets a monotonic clock for linux platforms.
-
-    Args:
-      plat: Platform that is being run on.
-  """
-  global _CLOCK  # pylint: disable=global-statement
-  global _NOW_FUNCTION  # pylint: disable=global-statement
-  _CLOCK = _LINUX_CLOCK
-  clock_monotonic = GetClockGetTimeClockNumber(plat)
-  try:
-    # Attempt to find clock_gettime in the C library.
-    clock_gettime = ctypes.CDLL(ctypes.util.find_library('c'),
-                                use_errno=True).clock_gettime
-  except AttributeError:
-    # If not able to find int in the C library, look in rt library.
-    clock_gettime = ctypes.CDLL(ctypes.util.find_library('rt'),
-                                use_errno=True).clock_gettime
-
-  class Timespec(ctypes.Structure):
-    """Time specification, as described in clock_gettime(3)."""
-    _fields_ = (('tv_sec', ctypes.c_long),
-                ('tv_nsec', ctypes.c_long))
-
-  def LinuxNowFunctionImpl():
-    ts = Timespec()
-    if clock_gettime(clock_monotonic, ctypes.pointer(ts)):
-      errno = ctypes.get_errno()
-      raise OSError(errno, os.strerror(errno))
-    return ts.tv_sec + ts.tv_nsec / 1.0e9
-
-  _NOW_FUNCTION = LinuxNowFunctionImpl
-
-
-def IsQPCUsable():
-  """Determines if system can query the performance counter.
-    The performance counter is a high resolution timer on windows systems.
-    Some chipsets have unreliable performance counters, so this checks that one
-    of those chipsets is not present.
-
-    Returns:
-      True if QPC is useable, false otherwise.
-  """
-
-  # Sample output: 'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel'
-  info = platform.processor()
-  if 'AuthenticAMD' in info and 'Family 15' in info:
-    return False
-  if not hasattr(ctypes, 'windll'):
-    return False
-  try:  # If anything goes wrong during this, assume QPC isn't available.
-    frequency = ctypes.c_int64()
-    ctypes.windll.Kernel32.QueryPerformanceFrequency(
-        ctypes.byref(frequency))
-    if float(frequency.value) <= 0:
-      return False
-  except Exception:  # pylint: disable=broad-except
-    logging.exception('Error when determining if QPC is usable.')
-    return False
-  return True
-
-
-def InitializeWinNowFunction(plat):
-  """Sets a monotonic clock for windows platforms.
-
-    Args:
-      plat: Platform that is being run on.
-  """
-  global _CLOCK  # pylint: disable=global-statement
-  global _NOW_FUNCTION  # pylint: disable=global-statement
-
-  if IsQPCUsable():
-    _CLOCK = _WIN_HIRES
-    qpc_return = ctypes.c_int64()
-    qpc_frequency = ctypes.c_int64()
-    ctypes.windll.Kernel32.QueryPerformanceFrequency(
-        ctypes.byref(qpc_frequency))
-    qpc_frequency = float(qpc_frequency.value)
-    qpc = ctypes.windll.Kernel32.QueryPerformanceCounter
-
-    def WinNowFunctionImpl():
-      qpc(ctypes.byref(qpc_return))
-      return qpc_return.value / qpc_frequency
-
-  else:
-    _CLOCK = _WIN_LORES
-    kernel32 = (ctypes.cdll.kernel32
-                if plat.startswith(_PLATFORMS['cygwin'])
-                else ctypes.windll.kernel32)
-    get_tick_count_64 = getattr(kernel32, 'GetTickCount64', None)
-
-    # Windows Vista or newer
-    if get_tick_count_64:
-      get_tick_count_64.restype = ctypes.c_ulonglong
-
-      def WinNowFunctionImpl():
-        return get_tick_count_64() / 1000.0
-
-    else:  # Pre Vista.
-      get_tick_count = kernel32.GetTickCount
-      get_tick_count.restype = ctypes.c_uint32
-      get_tick_count_lock = threading.Lock()
-
-      def WinNowFunctionImpl():
-        global GET_TICK_COUNT_LAST_NOW  # pylint: disable=global-statement
-        global GET_TICK_COUNT_WRAPAROUNDS  # pylint: disable=global-statement
-        with get_tick_count_lock:
-          current_sample = get_tick_count()
-          if current_sample < GET_TICK_COUNT_LAST_NOW:
-            GET_TICK_COUNT_WRAPAROUNDS += 1
-          GET_TICK_COUNT_LAST_NOW = current_sample
-          final_ms = GET_TICK_COUNT_WRAPAROUNDS << 32
-          final_ms += GET_TICK_COUNT_LAST_NOW
-          return final_ms / 1000.0
-
-  _NOW_FUNCTION = WinNowFunctionImpl
-
-
-def InitializeNowFunction(plat):
-  """Sets a monotonic clock for the current platform.
-
-    Args:
-      plat: Platform that is being run on.
-  """
-  if plat.startswith(_PLATFORMS['mac']):
-    InitializeMacNowFunction(plat)
-
-  elif (plat.startswith(_PLATFORMS['linux'])
-        or plat.startswith(_PLATFORMS['freebsd'])
-        or plat.startswith(_PLATFORMS['bsd'])
-        or plat.startswith(_PLATFORMS['sunos'])):
-    InitializeLinuxNowFunction(plat)
-
-  elif (plat.startswith(_PLATFORMS['windows'])
-        or plat.startswith(_PLATFORMS['cygwin'])):
-    InitializeWinNowFunction(plat)
-
-  else:
-    raise RuntimeError('%s is not a supported platform.' % plat)
-
-  global _NOW_FUNCTION
-  global _CLOCK
-  assert _NOW_FUNCTION, 'Now function not properly set during initialization.'
-  assert _CLOCK, 'Clock not properly set during initialization.'
-
-
-def Now():
-  return _NOW_FUNCTION() * 1e6  # convert from seconds to microseconds
-
-
-def GetClock():
-  return _CLOCK
-
-
-InitializeNowFunction(sys.platform)
diff --git a/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py b/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
deleted file mode 100644
index bae7ea8..0000000
--- a/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import logging
-import platform
-import sys
-import unittest
-
-from py_trace_event import trace_time
-
-
-class TimerTest(unittest.TestCase):
-  # Helper methods.
-  @contextlib.contextmanager
-  def ReplacePlatformProcessorCall(self, f):
-    try:
-      old_proc = platform.processor
-      platform.processor = f
-      yield
-    finally:
-      platform.processor = old_proc
-
-  @contextlib.contextmanager
-  def ReplaceQPCCheck(self, f):
-    try:
-      old_qpc = trace_time.IsQPCUsable
-      trace_time.IsQPCUsable = f
-      yield
-    finally:
-      trace_time.IsQPCUsable = old_qpc
-
-  # Platform detection tests.
-  def testInitializeNowFunction_platformNotSupported(self):
-    with self.assertRaises(RuntimeError):
-      trace_time.InitializeNowFunction('invalid_platform')
-
-  def testInitializeNowFunction_windows(self):
-    if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
-            or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
-      return True
-    trace_time.InitializeNowFunction(sys.platform)
-    self.assertTrue(trace_time.GetClock() == trace_time._WIN_HIRES
-                    or trace_time.GetClock() == trace_time._WIN_LORES)
-
-  def testInitializeNowFunction_linux(self):
-    if not sys.platform.startswith(trace_time._PLATFORMS['linux']):
-      return True
-    trace_time.InitializeNowFunction(sys.platform)
-    self.assertEqual(trace_time.GetClock(), trace_time._LINUX_CLOCK)
-
-  def testInitializeNowFunction_mac(self):
-    if not sys.platform.startswith(trace_time._PLATFORMS['mac']):
-      return True
-    trace_time.InitializeNowFunction(sys.platform)
-    self.assertEqual(trace_time.GetClock(), trace_time._MAC_CLOCK)
-
-  # Windows Tests
-  def testIsQPCUsable_buggyAthlonProcReturnsFalse(self):
-    if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
-            or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
-      return True
-
-    def BuggyAthlonProc():
-      return 'AMD64 Family 15 Model 23 Stepping 6, AuthenticAMD'
-
-    with self.ReplacePlatformProcessorCall(BuggyAthlonProc):
-      self.assertFalse(trace_time.IsQPCUsable())
-
-  def testIsQPCUsable_returnsTrueOnWindows(self):
-    if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
-            or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
-      return True
-
-    def Proc():
-      return 'Intel64 Family 15 Model 23 Stepping 6, GenuineIntel'
-
-    with self.ReplacePlatformProcessorCall(Proc):
-      self.assertTrue(trace_time.IsQPCUsable())
-
-  def testGetWinNowFunction_QPC(self):
-    if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
-            or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
-      return True
-    # Test requires QPC to be available on platform.
-    if not trace_time.IsQPCUsable():
-      return True
-    self.assertGreater(trace_time.Now(), 0)
-
-  # Works even if QPC would work.
-  def testGetWinNowFunction_GetTickCount(self):
-    if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
-            or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
-      return True
-    with self.ReplaceQPCCheck(lambda: False):
-      self.assertGreater(trace_time.Now(), 0)
-
-  # Linux tests.
-  def testGetClockGetTimeClockNumber_linux(self):
-    self.assertEquals(trace_time.GetClockGetTimeClockNumber('linux'), 1)
-
-  def testGetClockGetTimeClockNumber_freebsd(self):
-    self.assertEquals(trace_time.GetClockGetTimeClockNumber('freebsd'), 4)
-
-  def testGetClockGetTimeClockNumber_bsd(self):
-    self.assertEquals(trace_time.GetClockGetTimeClockNumber('bsd'), 3)
-
-  def testGetClockGetTimeClockNumber_sunos(self):
-    self.assertEquals(trace_time.GetClockGetTimeClockNumber('sunos5'), 4)
-
-  # Smoke Test.
-  def testMonotonic(self):
-    time_one = trace_time.Now()
-    for _ in xrange(1000):
-      time_two = trace_time.Now()
-      self.assertLessEqual(time_one, time_two)
-      time_one = time_two
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/common/py_trace_event/third_party/protobuf/README.chromium b/systrace/catapult/common/py_trace_event/third_party/protobuf/README.chromium
deleted file mode 100644
index adf4cb8..0000000
--- a/systrace/catapult/common/py_trace_event/third_party/protobuf/README.chromium
+++ /dev/null
@@ -1,12 +0,0 @@
-Name: Protobuf
-URL: https://developers.google.com/protocol-buffers/
-Version: 3.0.0
-License: BSD
-
-Description:
-Protocol buffers are Google's language-neutral, platform-neutral,
-extensible mechanism for serializing structured data.
-
-Local Modifications:
-Removed pretty much everything except functions necessary to write
-bools, ints, floats and strings.
diff --git a/systrace/catapult/common/py_trace_event/third_party/protobuf/encoder.py b/systrace/catapult/common/py_trace_event/third_party/protobuf/encoder.py
deleted file mode 100644
index 50d1046..0000000
--- a/systrace/catapult/common/py_trace_event/third_party/protobuf/encoder.py
+++ /dev/null
@@ -1,306 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# https://developers.google.com/protocol-buffers/
-#
-# 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 Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import six
-import struct
-
-import wire_format
-
-
-def _VarintSize(value):
-  """Compute the size of a varint value."""
-  if value <= 0x7f: return 1
-  if value <= 0x3fff: return 2
-  if value <= 0x1fffff: return 3
-  if value <= 0xfffffff: return 4
-  if value <= 0x7ffffffff: return 5
-  if value <= 0x3ffffffffff: return 6
-  if value <= 0x1ffffffffffff: return 7
-  if value <= 0xffffffffffffff: return 8
-  if value <= 0x7fffffffffffffff: return 9
-  return 10
-
-
-def _SignedVarintSize(value):
-  """Compute the size of a signed varint value."""
-  if value < 0: return 10
-  if value <= 0x7f: return 1
-  if value <= 0x3fff: return 2
-  if value <= 0x1fffff: return 3
-  if value <= 0xfffffff: return 4
-  if value <= 0x7ffffffff: return 5
-  if value <= 0x3ffffffffff: return 6
-  if value <= 0x1ffffffffffff: return 7
-  if value <= 0xffffffffffffff: return 8
-  if value <= 0x7fffffffffffffff: return 9
-  return 10
-
-
-def _VarintEncoder():
-  """Return an encoder for a basic varint value (does not include tag)."""
-
-  def EncodeVarint(write, value):
-    bits = value & 0x7f
-    value >>= 7
-    while value:
-      write(six.int2byte(0x80|bits))
-      bits = value & 0x7f
-      value >>= 7
-    return write(six.int2byte(bits))
-
-  return EncodeVarint
-
-
-def _SignedVarintEncoder():
-  """Return an encoder for a basic signed varint value (does not include
-  tag)."""
-
-  def EncodeSignedVarint(write, value):
-    if value < 0:
-      value += (1 << 64)
-    bits = value & 0x7f
-    value >>= 7
-    while value:
-      write(six.int2byte(0x80|bits))
-      bits = value & 0x7f
-      value >>= 7
-    return write(six.int2byte(bits))
-
-  return EncodeSignedVarint
-
-
-_EncodeVarint = _VarintEncoder()
-_EncodeSignedVarint = _SignedVarintEncoder()
-
-
-def _VarintBytes(value):
-  """Encode the given integer as a varint and return the bytes.  This is only
-  called at startup time so it doesn't need to be fast."""
-
-  pieces = []
-  _EncodeVarint(pieces.append, value)
-  return b"".join(pieces)
-
-
-def TagBytes(field_number, wire_type):
-  """Encode the given tag and return the bytes.  Only called at startup."""
-
-  return _VarintBytes(wire_format.PackTag(field_number, wire_type))
-
-
-def _SimpleEncoder(wire_type, encode_value, compute_value_size):
-  """Return a constructor for an encoder for fields of a particular type.
-
-  Args:
-      wire_type:  The field's wire type, for encoding tags.
-      encode_value:  A function which encodes an individual value, e.g.
-        _EncodeVarint().
-      compute_value_size:  A function which computes the size of an individual
-        value, e.g. _VarintSize().
-  """
-
-  def SpecificEncoder(field_number, is_repeated, is_packed):
-    if is_packed:
-      tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      local_EncodeVarint = _EncodeVarint
-      def EncodePackedField(write, value):
-        write(tag_bytes)
-        size = 0
-        for element in value:
-          size += compute_value_size(element)
-        local_EncodeVarint(write, size)
-        for element in value:
-          encode_value(write, element)
-      return EncodePackedField
-    elif is_repeated:
-      tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeRepeatedField(write, value):
-        for element in value:
-          write(tag_bytes)
-          encode_value(write, element)
-      return EncodeRepeatedField
-    else:
-      tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeField(write, value):
-        write(tag_bytes)
-        return encode_value(write, value)
-      return EncodeField
-
-  return SpecificEncoder
-
-
-def _FloatingPointEncoder(wire_type, format):
-  """Return a constructor for an encoder for float fields.
-
-  This is like StructPackEncoder, but catches errors that may be due to
-  passing non-finite floating-point values to struct.pack, and makes a
-  second attempt to encode those values.
-
-  Args:
-      wire_type:  The field's wire type, for encoding tags.
-      format:  The format string to pass to struct.pack().
-  """
-
-  value_size = struct.calcsize(format)
-  if value_size == 4:
-    def EncodeNonFiniteOrRaise(write, value):
-      # Remember that the serialized form uses little-endian byte order.
-      if value == _POS_INF:
-        write(b'\x00\x00\x80\x7F')
-      elif value == _NEG_INF:
-        write(b'\x00\x00\x80\xFF')
-      elif value != value:           # NaN
-        write(b'\x00\x00\xC0\x7F')
-      else:
-        raise
-  elif value_size == 8:
-    def EncodeNonFiniteOrRaise(write, value):
-      if value == _POS_INF:
-        write(b'\x00\x00\x00\x00\x00\x00\xF0\x7F')
-      elif value == _NEG_INF:
-        write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF')
-      elif value != value:                         # NaN
-        write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F')
-      else:
-        raise
-  else:
-    raise ValueError('Can\'t encode floating-point values that are '
-                     '%d bytes long (only 4 or 8)' % value_size)
-
-  def SpecificEncoder(field_number, is_repeated, is_packed):
-    local_struct_pack = struct.pack
-    if is_packed:
-      tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
-      local_EncodeVarint = _EncodeVarint
-      def EncodePackedField(write, value):
-        write(tag_bytes)
-        local_EncodeVarint(write, len(value) * value_size)
-        for element in value:
-          # This try/except block is going to be faster than any code that
-          # we could write to check whether element is finite.
-          try:
-            write(local_struct_pack(format, element))
-          except SystemError:
-            EncodeNonFiniteOrRaise(write, element)
-      return EncodePackedField
-    elif is_repeated:
-      tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeRepeatedField(write, value):
-        for element in value:
-          write(tag_bytes)
-          try:
-            write(local_struct_pack(format, element))
-          except SystemError:
-            EncodeNonFiniteOrRaise(write, element)
-      return EncodeRepeatedField
-    else:
-      tag_bytes = TagBytes(field_number, wire_type)
-      def EncodeField(write, value):
-        write(tag_bytes)
-        try:
-          write(local_struct_pack(format, value))
-        except SystemError:
-          EncodeNonFiniteOrRaise(write, value)
-      return EncodeField
-
-  return SpecificEncoder
-
-
-Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder(
-    wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize)
-
-UInt32Encoder = UInt64Encoder = _SimpleEncoder(
-    wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize)
-
-FloatEncoder    = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED32, '<f')
-
-DoubleEncoder   = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED64, '<d')
-
-
-def BoolEncoder(field_number, is_repeated, is_packed):
-  """Returns an encoder for a boolean field."""
-
-  false_byte = b'\x00'
-  true_byte = b'\x01'
-  if is_packed:
-    tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
-    local_EncodeVarint = _EncodeVarint
-    def EncodePackedField(write, value):
-      write(tag_bytes)
-      local_EncodeVarint(write, len(value))
-      for element in value:
-        if element:
-          write(true_byte)
-        else:
-          write(false_byte)
-    return EncodePackedField
-  elif is_repeated:
-    tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)
-    def EncodeRepeatedField(write, value):
-      for element in value:
-        write(tag_bytes)
-        if element:
-          write(true_byte)
-        else:
-          write(false_byte)
-    return EncodeRepeatedField
-  else:
-    tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)
-    def EncodeField(write, value):
-      write(tag_bytes)
-      if value:
-        return write(true_byte)
-      return write(false_byte)
-    return EncodeField
-
-
-def StringEncoder(field_number, is_repeated, is_packed):
-  """Returns an encoder for a string field."""
-
-  tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
-  local_EncodeVarint = _EncodeVarint
-  local_len = len
-  assert not is_packed
-  if is_repeated:
-    def EncodeRepeatedField(write, value):
-      for element in value:
-        encoded = element.encode('utf-8')
-        write(tag)
-        local_EncodeVarint(write, local_len(encoded))
-        write(encoded)
-    return EncodeRepeatedField
-  else:
-    def EncodeField(write, value):
-      encoded = value.encode('utf-8')
-      write(tag)
-      local_EncodeVarint(write, local_len(encoded))
-      return write(encoded)
-    return EncodeField
-
diff --git a/systrace/catapult/common/py_trace_event/third_party/protobuf/wire_format.py b/systrace/catapult/common/py_trace_event/third_party/protobuf/wire_format.py
deleted file mode 100644
index 9341e6f..0000000
--- a/systrace/catapult/common/py_trace_event/third_party/protobuf/wire_format.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Protocol Buffers - Google's data interchange format
-# Copyright 2008 Google Inc.  All rights reserved.
-# https://developers.google.com/protocol-buffers/
-#
-# 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 Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-TAG_TYPE_BITS = 3  # Number of bits used to hold type info in a proto tag.
-
-WIRETYPE_VARINT = 0
-WIRETYPE_FIXED64 = 1
-WIRETYPE_LENGTH_DELIMITED = 2
-WIRETYPE_START_GROUP = 3
-WIRETYPE_END_GROUP = 4
-WIRETYPE_FIXED32 = 5
-_WIRETYPE_MAX = 5
-
-def PackTag(field_number, wire_type):
-  """Returns an unsigned 32-bit integer that encodes the field number and
-  wire type information in standard protocol message wire format.
-
-  Args:
-    field_number: Expected to be an integer in the range [1, 1 << 29)
-    wire_type: One of the WIRETYPE_* constants.
-  """
-  if not 0 <= wire_type <= _WIRETYPE_MAX:
-    raise RuntimeError('Unknown wire type: %d' % wire_type)
-  return (field_number << TAG_TYPE_BITS) | wire_type
-
diff --git a/systrace/catapult/common/py_utils/PRESUBMIT.py b/systrace/catapult/common/py_utils/PRESUBMIT.py
deleted file mode 100644
index c1d92fe..0000000
--- a/systrace/catapult/common/py_utils/PRESUBMIT.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
-
-
-def _CommonChecks(input_api, output_api):
-  results = []
-  results += input_api.RunTests(input_api.canned_checks.GetPylint(
-      input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
-      pylintrc='../../pylintrc'))
-  return results
-
-
-def _GetPathsToPrepend(input_api):
-  project_dir = input_api.PresubmitLocalPath()
-  catapult_dir = input_api.os_path.join(project_dir, '..', '..')
-  return [
-      project_dir,
-      input_api.os_path.join(catapult_dir, 'dependency_manager'),
-      input_api.os_path.join(catapult_dir, 'devil'),
-      input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
-      input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'),
-  ]
diff --git a/systrace/catapult/common/py_utils/bin/run_tests b/systrace/catapult/common/py_utils/bin/run_tests
deleted file mode 100755
index 66a4b59..0000000
--- a/systrace/catapult/common/py_utils/bin/run_tests
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..', '..'))
-
-_PY_UTILS_PATH = os.path.abspath(
-    os.path.join(_CATAPULT_PATH, 'common', 'py_utils'))
-
-
-def _RunTestsOrDie(top_level_dir):
-  exit_code = run_with_typ.Run(top_level_dir, path=[_PY_UTILS_PATH])
-  if exit_code:
-    sys.exit(exit_code)
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-if __name__ == '__main__':
-  _AddToPathIfNeeded(_CATAPULT_PATH)
-
-  from hooks import install
-  if '--no-install-hooks' in sys.argv:
-    sys.argv.remove('--no-install-hooks')
-  else:
-    install.InstallHooks()
-
-  from catapult_build import run_with_typ
-  _RunTestsOrDie(_PY_UTILS_PATH)
-  sys.exit(0)
diff --git a/systrace/catapult/common/py_utils/py_utils/__init__.py b/systrace/catapult/common/py_utils/py_utils/__init__.py
deleted file mode 100644
index 0d7b052..0000000
--- a/systrace/catapult/common/py_utils/py_utils/__init__.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import print_function
-
-import functools
-import inspect
-import os
-import sys
-import time
-import platform
-
-
-def GetCatapultDir():
-  return os.path.normpath(
-      os.path.join(os.path.dirname(__file__), '..', '..', '..'))
-
-
-def IsRunningOnCrosDevice():
-  """Returns True if we're on a ChromeOS device."""
-  lsb_release = '/etc/lsb-release'
-  if sys.platform.startswith('linux') and os.path.exists(lsb_release):
-    with open(lsb_release, 'r') as f:
-      res = f.read()
-      if res.count('CHROMEOS_RELEASE_NAME'):
-        return True
-  return False
-
-
-def GetHostOsName():
-  if IsRunningOnCrosDevice():
-    return 'chromeos'
-  elif sys.platform.startswith('linux'):
-    return 'linux'
-  elif sys.platform == 'darwin':
-    return 'mac'
-  elif sys.platform == 'win32':
-    return 'win'
-
-
-def GetHostArchName():
-  return platform.machine()
-
-
-def _ExecutableExtensions():
-  # pathext is, e.g. '.com;.exe;.bat;.cmd'
-  exts = os.getenv('PATHEXT').split(';') #e.g. ['.com','.exe','.bat','.cmd']
-  return [x[1:].upper() for x in exts] #e.g. ['COM','EXE','BAT','CMD']
-
-
-def IsExecutable(path):
-  if os.path.isfile(path):
-    if hasattr(os, 'name') and os.name == 'nt':
-      return path.split('.')[-1].upper() in _ExecutableExtensions()
-    else:
-      return os.access(path, os.X_OK)
-  else:
-    return False
-
-
-def _AddDirToPythonPath(*path_parts):
-  path = os.path.abspath(os.path.join(*path_parts))
-  if os.path.isdir(path) and path not in sys.path:
-    # Some callsite that use telemetry assumes that sys.path[0] is the directory
-    # containing the script, so we add these extra paths to right after it.
-    sys.path.insert(1, path)
-
-_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'devil'))
-_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'dependency_manager'))
-_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'third_party', 'mock'))
-# mox3 is needed for pyfakefs usage, but not for pylint.
-_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'third_party', 'mox3'))
-_AddDirToPythonPath(
-    os.path.join(GetCatapultDir(), 'third_party', 'pyfakefs'))
-
-from devil.utils import timeout_retry  # pylint: disable=wrong-import-position
-from devil.utils import reraiser_thread  # pylint: disable=wrong-import-position
-
-
-# Decorator that adds timeout functionality to a function.
-def Timeout(default_timeout):
-  return lambda func: TimeoutDeco(func, default_timeout)
-
-# Note: Even though the "timeout" keyword argument is the only
-# keyword argument that will need to be given to the decorated function,
-# we still have to use the **kwargs syntax, because we have to use
-# the *args syntax here before (since the decorator decorates functions
-# with different numbers of positional arguments) and Python doesn't allow
-# a single named keyword argument after *args.
-# (e.g., 'def foo(*args, bar=42):' is a syntax error)
-
-def TimeoutDeco(func, default_timeout):
-  @functools.wraps(func)
-  def RunWithTimeout(*args, **kwargs):
-    if 'timeout' in kwargs:
-      timeout = kwargs['timeout']
-    else:
-      timeout = default_timeout
-    try:
-      return timeout_retry.Run(func, timeout, 0, args=args)
-    except reraiser_thread.TimeoutError:
-      print('%s timed out.' % func.__name__)
-      return False
-  return RunWithTimeout
-
-
-MIN_POLL_INTERVAL_IN_SECONDS = 0.1
-MAX_POLL_INTERVAL_IN_SECONDS = 5
-OUTPUT_INTERVAL_IN_SECONDS = 300
-
-def WaitFor(condition, timeout):
-  """Waits for up to |timeout| secs for the function |condition| to return True.
-
-  Polling frequency is (elapsed_time / 10), with a min of .1s and max of 5s.
-
-  Returns:
-    Result of |condition| function (if present).
-  """
-  def GetConditionString():
-    if condition.__name__ == '<lambda>':
-      try:
-        return inspect.getsource(condition).strip()
-      except IOError:
-        pass
-    return condition.__name__
-
-  # Do an initial check to see if its true.
-  res = condition()
-  if res:
-    return res
-  start_time = time.time()
-  last_output_time = start_time
-  elapsed_time = time.time() - start_time
-  while elapsed_time < timeout:
-    res = condition()
-    if res:
-      return res
-    now = time.time()
-    elapsed_time = now - start_time
-    last_output_elapsed_time = now - last_output_time
-    if last_output_elapsed_time > OUTPUT_INTERVAL_IN_SECONDS:
-      last_output_time = time.time()
-    poll_interval = min(max(elapsed_time / 10., MIN_POLL_INTERVAL_IN_SECONDS),
-                        MAX_POLL_INTERVAL_IN_SECONDS)
-    time.sleep(poll_interval)
-  raise TimeoutException('Timed out while waiting %ds for %s.' %
-                         (timeout, GetConditionString()))
-
-class TimeoutException(Exception):
-  """The operation failed to complete because of a timeout.
-
-  It is possible that waiting for a longer period of time would result in a
-  successful operation.
-  """
-  pass
diff --git a/systrace/catapult/common/py_utils/py_utils/atexit_with_log.py b/systrace/catapult/common/py_utils/py_utils/atexit_with_log.py
deleted file mode 100644
index f217c09..0000000
--- a/systrace/catapult/common/py_utils/py_utils/atexit_with_log.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import atexit
-import logging
-
-
-def _WrapFunction(function):
-  def _WrappedFn(*args, **kwargs):
-    logging.debug('Try running %s', repr(function))
-    try:
-      function(*args, **kwargs)
-      logging.debug('Did run %s', repr(function))
-    except Exception:  # pylint: disable=broad-except
-      logging.exception('Exception running %s', repr(function))
-  return _WrappedFn
-
-
-def Register(function, *args, **kwargs):
-  atexit.register(_WrapFunction(function), *args, **kwargs)
diff --git a/systrace/catapult/common/py_utils/py_utils/binary_manager.py b/systrace/catapult/common/py_utils/py_utils/binary_manager.py
deleted file mode 100644
index 2d3ac8a..0000000
--- a/systrace/catapult/common/py_utils/py_utils/binary_manager.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-
-import dependency_manager
-
-
-class BinaryManager(object):
-  """ This class is effectively a subclass of dependency_manager, but uses a
-      different number of arguments for FetchPath and LocalPath.
-  """
-
-  def __init__(self, config_files):
-    if not config_files or not isinstance(config_files, list):
-      raise ValueError(
-          'Must supply a list of config files to the BinaryManager')
-    configs = [dependency_manager.BaseConfig(config) for config in config_files]
-    self._dependency_manager = dependency_manager.DependencyManager(configs)
-
-  def FetchPathWithVersion(self, binary_name, os_name, arch, os_version=None):
-    """ Return a path to the executable for <binary_name>, or None if not found.
-
-    Will attempt to download from cloud storage if needed.
-    """
-    return self._WrapDependencyManagerFunction(
-        self._dependency_manager.FetchPathWithVersion, binary_name, os_name,
-        arch, os_version)
-
-  def FetchPath(self, binary_name, os_name, arch, os_version=None):
-    """ Return a path to the executable for <binary_name>, or None if not found.
-
-    Will attempt to download from cloud storage if needed.
-    """
-    return self._WrapDependencyManagerFunction(
-        self._dependency_manager.FetchPath, binary_name, os_name, arch,
-        os_version)
-
-  def LocalPath(self, binary_name, os_name, arch, os_version=None):
-    """ Return a local path to the given binary name, or None if not found.
-
-    Will not download from cloud_storage.
-    """
-    return self._WrapDependencyManagerFunction(
-        self._dependency_manager.LocalPath, binary_name, os_name, arch,
-        os_version)
-
-  def _WrapDependencyManagerFunction(
-      self, function, binary_name, os_name, arch, os_version):
-    platform = '%s_%s' % (os_name, arch)
-    if os_version:
-      try:
-        versioned_platform = '%s_%s_%s' % (os_name, os_version, arch)
-        return function(binary_name, versioned_platform)
-      except dependency_manager.NoPathFoundError:
-        logging.warning(
-            'Cannot find path for %s on platform %s. Falling back to %s.',
-            binary_name, versioned_platform, platform)
-    return function(binary_name, platform)
-
diff --git a/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py b/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py
deleted file mode 100644
index ccf21ad..0000000
--- a/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py
+++ /dev/null
@@ -1,214 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import os
-
-from pyfakefs import fake_filesystem_unittest
-from dependency_manager import exceptions
-
-from py_utils import binary_manager
-
-class BinaryManagerTest(fake_filesystem_unittest.TestCase):
-  # TODO(aiolos): disable cloud storage use during this test.
-
-  def setUp(self):
-    self.setUpPyfakefs()
-    # pylint: disable=bad-continuation
-    self.expected_dependencies = {
-        'dep_1': {
-          'cloud_storage_base_folder': 'dependencies/fake_config',
-          'cloud_storage_bucket': 'chrome-tel',
-          'file_info': {
-            'linux_x86_64': {
-              'cloud_storage_hash': '661ce936b3276f7ec3d687ab62be05b96d796f21',
-              'download_path': 'bin/linux/x86_64/dep_1'
-            },
-            'mac_x86_64': {
-              'cloud_storage_hash': 'c7b1bfc6399dc683058e88dac1ef0f877edea74b',
-              'download_path': 'bin/mac/x86_64/dep_1'
-            },
-            'win_AMD64': {
-              'cloud_storage_hash': 'ac4fee89a51662b9d920bce443c19b9b2929b198',
-              'download_path': 'bin/win/AMD64/dep_1.exe'
-            },
-            'win_x86': {
-              'cloud_storage_hash': 'e246e183553ea26967d7b323ea269e3357b9c837',
-              'download_path': 'bin/win/x86/dep_1.exe'
-            }
-          }
-        },
-        'dep_2': {
-          'cloud_storage_base_folder': 'dependencies/fake_config',
-          'cloud_storage_bucket': 'chrome-tel',
-          'file_info': {
-            'linux_x86_64': {
-              'cloud_storage_hash': '13a57efae9a680ac0f160b3567e02e81f4ac493c',
-              'download_path': 'bin/linux/x86_64/dep_2',
-              'local_paths': [
-                  '../../example/location/linux/dep_2',
-                  '../../example/location2/linux/dep_2'
-              ]
-            },
-            'mac_x86_64': {
-              'cloud_storage_hash': 'd10c0ddaa8586b20449e951216bee852fa0f8850',
-              'download_path': 'bin/mac/x86_64/dep_2',
-              'local_paths': [
-                  '../../example/location/mac/dep_2',
-                  '../../example/location2/mac/dep_2'
-              ]
-            },
-            'win_AMD64': {
-              'cloud_storage_hash': 'fd5b417f78c7f7d9192a98967058709ded1d399d',
-              'download_path': 'bin/win/AMD64/dep_2.exe',
-              'local_paths': [
-                  '../../example/location/win64/dep_2',
-                  '../../example/location2/win64/dep_2'
-              ]
-            },
-            'win_x86': {
-              'cloud_storage_hash': 'cf5c8fe920378ce30d057e76591d57f63fd31c1a',
-              'download_path': 'bin/win/x86/dep_2.exe',
-              'local_paths': [
-                  '../../example/location/win32/dep_2',
-                  '../../example/location2/win32/dep_2'
-              ]
-            },
-            'android_k_x64': {
-              'cloud_storage_hash': '09177be2fed00b44df0e777932828425440b23b3',
-              'download_path': 'bin/android/x64/k/dep_2.apk',
-              'local_paths': [
-                  '../../example/location/android_x64/k/dep_2',
-                  '../../example/location2/android_x64/k/dep_2'
-              ]
-            },
-            'android_l_x64': {
-              'cloud_storage_hash': '09177be2fed00b44df0e777932828425440b23b3',
-              'download_path': 'bin/android/x64/l/dep_2.apk',
-              'local_paths': [
-                  '../../example/location/android_x64/l/dep_2',
-                  '../../example/location2/android_x64/l/dep_2'
-              ]
-            },
-            'android_k_x86': {
-              'cloud_storage_hash': 'bcf02af039713a48b69b89bd7f0f9c81ed8183a4',
-              'download_path': 'bin/android/x86/k/dep_2.apk',
-              'local_paths': [
-                  '../../example/location/android_x86/k/dep_2',
-                  '../../example/location2/android_x86/k/dep_2'
-              ]
-            },
-            'android_l_x86': {
-              'cloud_storage_hash': '12a74cec071017ba11655b5740b8a58e2f52a219',
-              'download_path': 'bin/android/x86/l/dep_2.apk',
-              'local_paths': [
-                  '../../example/location/android_x86/l/dep_2',
-                  '../../example/location2/android_x86/l/dep_2'
-              ]
-            }
-          }
-        },
-        'dep_3': {
-          'file_info': {
-            'linux_x86_64': {
-              'local_paths': [
-                  '../../example/location/linux/dep_3',
-                  '../../example/location2/linux/dep_3'
-              ]
-            },
-            'mac_x86_64': {
-              'local_paths': [
-                  '../../example/location/mac/dep_3',
-                  '../../example/location2/mac/dep_3'
-              ]
-            },
-            'win_AMD64': {
-              'local_paths': [
-                  '../../example/location/win64/dep_3',
-                  '../../example/location2/win64/dep_3'
-              ]
-            },
-            'win_x86': {
-              'local_paths': [
-                  '../../example/location/win32/dep_3',
-                  '../../example/location2/win32/dep_3'
-              ]
-            }
-          }
-        }
-    }
-    # pylint: enable=bad-continuation
-    fake_config = {
-        'config_type': 'BaseConfig',
-        'dependencies': self.expected_dependencies
-    }
-
-    self.base_config = os.path.join(os.path.dirname(__file__),
-                                    'example_config.json')
-    self.fs.CreateFile(self.base_config, contents=json.dumps(fake_config))
-    linux_file = os.path.join(
-        os.path.dirname(self.base_config),
-        os.path.join('..', '..', 'example', 'location2', 'linux', 'dep_2'))
-    android_file = os.path.join(
-        os.path.dirname(self.base_config),
-        '..', '..', 'example', 'location', 'android_x86', 'l', 'dep_2')
-    self.expected_dep2_linux_file = os.path.abspath(linux_file)
-    self.expected_dep2_android_file = os.path.abspath(android_file)
-    self.fs.CreateFile(self.expected_dep2_linux_file)
-    self.fs.CreateFile(self.expected_dep2_android_file)
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  def testInitializationNoConfig(self):
-    with self.assertRaises(ValueError):
-      binary_manager.BinaryManager(None)
-
-  def testInitializationMissingConfig(self):
-    with self.assertRaises(ValueError):
-      binary_manager.BinaryManager(os.path.join('missing', 'path'))
-
-  def testInitializationWithConfig(self):
-    with self.assertRaises(ValueError):
-      manager = binary_manager.BinaryManager(self.base_config)
-    manager = binary_manager.BinaryManager([self.base_config])
-    self.assertItemsEqual(self.expected_dependencies,
-                          manager._dependency_manager._lookup_dict)
-
-  def testSuccessfulFetchPathNoOsVersion(self):
-    manager = binary_manager.BinaryManager([self.base_config])
-    found_path = manager.FetchPath('dep_2', 'linux', 'x86_64')
-    self.assertEqual(self.expected_dep2_linux_file, found_path)
-
-  def testSuccessfulFetchPathOsVersion(self):
-    manager = binary_manager.BinaryManager([self.base_config])
-    found_path = manager.FetchPath('dep_2', 'android', 'x86', 'l')
-    self.assertEqual(self.expected_dep2_android_file, found_path)
-
-  def testSuccessfulFetchPathFallbackToNoOsVersion(self):
-    manager = binary_manager.BinaryManager([self.base_config])
-    found_path = manager.FetchPath('dep_2', 'linux', 'x86_64', 'fake_version')
-    self.assertEqual(self.expected_dep2_linux_file, found_path)
-
-  def testFailedFetchPathMissingDep(self):
-    manager = binary_manager.BinaryManager([self.base_config])
-    with self.assertRaises(exceptions.NoPathFoundError):
-      manager.FetchPath('missing_dep', 'linux', 'x86_64')
-    with self.assertRaises(exceptions.NoPathFoundError):
-      manager.FetchPath('missing_dep', 'android', 'x86', 'l')
-    with self.assertRaises(exceptions.NoPathFoundError):
-      manager.FetchPath('dep_1', 'linux', 'bad_arch')
-    with self.assertRaises(exceptions.NoPathFoundError):
-      manager.FetchPath('dep_1', 'bad_os', 'x86')
-
-  def testSuccessfulLocalPathNoOsVersion(self):
-    manager = binary_manager.BinaryManager([self.base_config])
-    found_path = manager.LocalPath('dep_2', 'linux', 'x86_64')
-    self.assertEqual(self.expected_dep2_linux_file, found_path)
-
-  def testSuccessfulLocalPathOsVersion(self):
-    manager = binary_manager.BinaryManager([self.base_config])
-    found_path = manager.LocalPath('dep_2', 'android', 'x86', 'l')
-    self.assertEqual(self.expected_dep2_android_file, found_path)
-
diff --git a/systrace/catapult/common/py_utils/py_utils/camel_case.py b/systrace/catapult/common/py_utils/py_utils/camel_case.py
deleted file mode 100644
index dbebb22..0000000
--- a/systrace/catapult/common/py_utils/py_utils/camel_case.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-import re
-import six
-
-
-def ToUnderscore(obj):
-  """Converts a string, list, or dict from camelCase to lower_with_underscores.
-
-  Descends recursively into lists and dicts, converting all dict keys.
-  Returns a newly allocated object of the same structure as the input.
-  """
-  if isinstance(obj, six.string_types):
-    return re.sub('(?!^)([A-Z]+)', r'_\1', obj).lower()
-
-  elif isinstance(obj, list):
-    return [ToUnderscore(item) for item in obj]
-
-  elif isinstance(obj, dict):
-    output = {}
-    for k, v in six.iteritems(obj):
-      if isinstance(v, list) or isinstance(v, dict):
-        output[ToUnderscore(k)] = ToUnderscore(v)
-      else:
-        output[ToUnderscore(k)] = v
-    return output
-
-  else:
-    return obj
diff --git a/systrace/catapult/common/py_utils/py_utils/camel_case_unittest.py b/systrace/catapult/common/py_utils/py_utils/camel_case_unittest.py
deleted file mode 100644
index c748ba2..0000000
--- a/systrace/catapult/common/py_utils/py_utils/camel_case_unittest.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from py_utils import camel_case
-
-
-class CamelCaseTest(unittest.TestCase):
-
-  def testString(self):
-    self.assertEqual(camel_case.ToUnderscore('camelCase'), 'camel_case')
-    self.assertEqual(camel_case.ToUnderscore('CamelCase'), 'camel_case')
-    self.assertEqual(camel_case.ToUnderscore('Camel2Case'), 'camel2_case')
-    self.assertEqual(camel_case.ToUnderscore('Camel2Case2'), 'camel2_case2')
-    self.assertEqual(camel_case.ToUnderscore('2012Q3'), '2012_q3')
-
-  def testList(self):
-    camel_case_list = ['CamelCase', ['NestedList']]
-    underscore_list = ['camel_case', ['nested_list']]
-    self.assertEqual(camel_case.ToUnderscore(camel_case_list), underscore_list)
-
-  def testDict(self):
-    camel_case_dict = {
-        'gpu': {
-            'vendorId': 1000,
-            'deviceId': 2000,
-            'vendorString': 'aString',
-            'deviceString': 'bString'},
-        'secondaryGpus': [
-            {'vendorId': 3000, 'deviceId': 4000,
-             'vendorString': 'k', 'deviceString': 'l'}
-        ]
-    }
-    underscore_dict = {
-        'gpu': {
-            'vendor_id': 1000,
-            'device_id': 2000,
-            'vendor_string': 'aString',
-            'device_string': 'bString'},
-        'secondary_gpus': [
-            {'vendor_id': 3000, 'device_id': 4000,
-             'vendor_string': 'k', 'device_string': 'l'}
-        ]
-    }
-    self.assertEqual(camel_case.ToUnderscore(camel_case_dict), underscore_dict)
-
-  def testOther(self):
-    self.assertEqual(camel_case.ToUnderscore(self), self)
diff --git a/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json b/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json
deleted file mode 100644
index 03f0afd..0000000
--- a/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json
+++ /dev/null
@@ -1,172 +0,0 @@
-{
-  "config_type": "BaseConfig",
-  "dependencies": {
-    "chrome_canary": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chrome-telemetry",
-      "file_info": {
-        "mac_x86_64": {
-          "cloud_storage_hash": "841d45e806a296ce21f7f783cc7a2ae5f857924c",
-          "download_path": "bin/reference_builds/chrome-mac64.zip",
-          "path_within_archive": "chrome-mac/Google Chrome.app/Contents/MacOS/Google Chrome",
-          "version_in_cs": "85.0.4169.0"
-        },
-        "win_AMD64": {
-          "cloud_storage_hash": "121271e6e917886bd2e5b539dd643e74a3aae395",
-          "download_path": "bin\\reference_build\\chrome-win64-clang.zip",
-          "path_within_archive": "chrome-win64-clang\\chrome.exe",
-          "version_in_cs": "86.0.4240.111"
-        },
-        "win_x86": {
-          "cloud_storage_hash": "83e9d11b28d01c10bbcccb7b882288b192b5e756",
-          "download_path": "bin\\reference_build\\chrome-win32-clang.zip",
-          "path_within_archive": "chrome-win32-clang\\chrome.exe",
-          "version_in_cs": "86.0.4240.111"
-        }
-      }
-    },
-    "chrome_dev": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chrome-telemetry",
-      "file_info": {
-        "linux_x86_64": {
-          "cloud_storage_hash": "1b21a60f8e83a43d01e2ddbe83c5df56c8159d56",
-          "download_path": "bin/reference_build/chrome-linux64.zip",
-          "path_within_archive": "chrome-linux64/chrome",
-          "version_in_cs": "85.0.4164.2"
-        }
-      }
-    },
-    "chrome_stable": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chrome-telemetry",
-      "file_info": {
-        "android_k_armeabi-v7a": {
-          "cloud_storage_hash": "cf89ebbcf302fab3d4cd80b5566c5246cdf1504a",
-          "download_path": "bin/reference_build/android_k_armeabi-v7a/ChromeStable.apk",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "android_l_arm64-v8a": {
-          "cloud_storage_hash": "8d3d5fe99655f61a088d4b4d51cad028b1a60f9c",
-          "download_path": "bin/reference_build/android_l_arm64-v8a/ChromeStable.apk",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "android_l_armeabi-v7a": {
-          "cloud_storage_hash": "cf89ebbcf302fab3d4cd80b5566c5246cdf1504a",
-          "download_path": "bin/reference_build/android_l_armeabi-v7a/ChromeStable.apk",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "android_n_arm64-v8a": {
-          "cloud_storage_hash": "8a4a0e3be7c1043c63446b74c210c3bd1387c1f8",
-          "download_path": "bin/reference_build/android_n_arm64-v8a/Monochrome.apk",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "android_n_armeabi-v7a": {
-          "cloud_storage_hash": "3c80e59b2c0fede2a85a6b79dc71a5c787e01d30",
-          "download_path": "bin/reference_build/android_n_armeabi-v7a/Monochrome.apk",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "android_n_bundle_arm64-v8a": {
-          "cloud_storage_hash": "b369c1a955d49d246b52e93b8c5692a80d5356b1",
-          "download_path": "bin/reference_build/android_n_bundle_arm64-v8a/Monochrome.apks",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "android_n_bundle_armeabi-v7a": {
-          "cloud_storage_hash": "8529aa69c987bcc731589e54543a870263dfa431",
-          "download_path": "bin/reference_build/android_n_bundle_armeabi-v7a/Monochrome.apks",
-          "version_in_cs": "83.0.4103.101"
-        },
-        "linux_x86_64": {
-          "cloud_storage_hash": "2eb0469024c127a4b99d6b20ac673e2be7ab1b2d",
-          "download_path": "bin/reference_build/chrome-linux64.zip",
-          "path_within_archive": "chrome-linux64/chrome",
-          "version_in_cs": "83.0.4103.97"
-        },
-        "mac_x86_64": {
-          "cloud_storage_hash": "012c5a5e7b1e69a0960462e7ba7f77f90464a10f",
-          "download_path": "bin/reference_builds/chrome-mac64.zip",
-          "path_within_archive": "chrome-mac/Google Chrome.app/Contents/MacOS/Google Chrome",
-          "version_in_cs": "83.0.4103.97"
-        },
-        "win_AMD64": {
-          "cloud_storage_hash": "e6515496ebab0d02a5294a008fe8bbf9dd3dbc0c",
-          "download_path": "bin\\reference_build\\chrome-win64-clang.zip",
-          "path_within_archive": "chrome-win64-clang\\chrome.exe",
-          "version_in_cs": "83.0.4103.97"
-        },
-        "win_x86": {
-          "cloud_storage_hash": "1749fac72241bc48e4adaf881a9278811b7ee406",
-          "download_path": "bin\\reference_build\\chrome-win-clang.zip",
-          "path_within_archive": "chrome-win-clang\\chrome.exe",
-          "version_in_cs": "83.0.4103.97"
-        }
-      }
-    },
-    "chromium_canary": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chrome-telemetry",
-      "file_info": {
-        "mac_x86_64": {
-          "cloud_storage_hash": "0e1a89d8aabd37e971aca506130d8ef7a1997b14",
-          "download_path": "bin/reference_builds/chrome-mac.zip",
-          "path_within_archive": "chrome-mac/Chromium.app/Contents/MacOS/Chromium",
-          "version_in_cs": "85.0.4169.0"
-        },
-        "win_AMD64": {
-          "cloud_storage_hash": "fed673ad3f4744160b4997af461573be85153a1a",
-          "download_path": "bin\\reference_build\\chrome-win.zip",
-          "path_within_archive": "chrome-win\\chrome.exe",
-          "version_in_cs": "85.0.4169.0"
-        },
-        "win_x86": {
-          "cloud_storage_hash": "e413191b7355f9bb8daad2cfc26cca924f48c44a",
-          "download_path": "bin\\reference_build\\chrome-win32-clang.zip",
-          "path_within_archive": "chrome-win32-clang\\chrome.exe",
-          "version_in_cs": "85.0.4169.0"
-        }
-      }
-    },
-    "chromium_dev": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chrome-telemetry",
-      "file_info": {
-        "linux_x86_64": {
-          "cloud_storage_hash": "b8b8aeaf5174ba09598ee637353b87f25fe9926e",
-          "download_path": "bin/reference_build/chrome-linux.zip",
-          "path_within_archive": "chrome-linux/chrome",
-          "version_in_cs": "85.0.4164.2"
-        }
-      }
-    },
-    "chromium_stable": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chrome-telemetry",
-      "file_info": {
-        "linux_x86_64": {
-          "cloud_storage_hash": "9d7903d1e29589c9a9731b856893a0b6ee4de760",
-          "download_path": "bin/reference_build/chrome-linux.zip",
-          "path_within_archive": "chrome-linux/chrome",
-          "version_in_cs": "83.0.4103.97"
-        },
-        "mac_x86_64": {
-          "cloud_storage_hash": "d1ddbcd3b1d2efd44c5a5030ae871308cca26000",
-          "download_path": "bin/reference_builds/chrome-mac.zip",
-          "path_within_archive": "chrome-mac/Chromium.app/Contents/MacOS/Chromium",
-          "version_in_cs": "83.0.4103.97"
-        },
-        "win_AMD64": {
-          "cloud_storage_hash": "5e503f1bfeae37061ddc80ae1660a1c41594b188",
-          "download_path": "bin\\reference_build\\chrome-win.zip",
-          "path_within_archive": "chrome-win\\chrome.exe",
-          "version_in_cs": "83.0.4103.97"
-        },
-        "win_x86": {
-          "cloud_storage_hash": "66e8c83cc4b57c38d71a56f6928bcafe7da17d80",
-          "download_path": "bin\\reference_build\\chrome-win-clang.zip",
-          "path_within_archive": "chrome-win-clang\\chrome.exe",
-          "version_in_cs": "83.0.4103.97"
-        }
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/common/py_utils/py_utils/class_util.py b/systrace/catapult/common/py_utils/py_utils/class_util.py
deleted file mode 100644
index 4cec430..0000000
--- a/systrace/catapult/common/py_utils/py_utils/class_util.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import inspect
-
-def IsMethodOverridden(parent_cls, child_cls, method_name):
-  assert inspect.isclass(parent_cls), '%s should be a class' % parent_cls
-  assert inspect.isclass(child_cls), '%s should be a class' % child_cls
-  assert parent_cls.__dict__.get(method_name), '%s has no method %s' % (
-      parent_cls, method_name)
-
-  if child_cls.__dict__.get(method_name):
-    # It's overridden
-    return True
-
-  if parent_cls in child_cls.__bases__:
-    # The parent is the base class of the child, we did not find the
-    # overridden method.
-    return False
-
-  # For all the base classes of this class that are not object, check if
-  # they override the method.
-  base_cls = [cls for cls in child_cls.__bases__ if cls and cls != object]
-  return any(
-      IsMethodOverridden(parent_cls, base, method_name) for base in base_cls)
diff --git a/systrace/catapult/common/py_utils/py_utils/class_util_unittest.py b/systrace/catapult/common/py_utils/py_utils/class_util_unittest.py
deleted file mode 100644
index 938bcdc..0000000
--- a/systrace/catapult/common/py_utils/py_utils/class_util_unittest.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from py_utils import class_util
-
-
-class ClassUtilTest(unittest.TestCase):
-
-  def testClassOverridden(self):
-    class Parent(object):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    class Child(Parent):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    self.assertTrue(class_util.IsMethodOverridden(
-        Parent, Child, 'MethodShouldBeOverridden'))
-
-  def testGrandchildOverridden(self):
-    class Parent(object):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    class Child(Parent):
-      pass
-
-    class Grandchild(Child):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    self.assertTrue(class_util.IsMethodOverridden(
-        Parent, Grandchild, 'MethodShouldBeOverridden'))
-
-  def testClassNotOverridden(self):
-    class Parent(object):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    class Child(Parent):
-      def SomeOtherMethod(self):
-        pass
-
-    self.assertFalse(class_util.IsMethodOverridden(
-        Parent, Child, 'MethodShouldBeOverridden'))
-
-  def testGrandchildNotOverridden(self):
-    class Parent(object):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    class Child(Parent):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    class Grandchild(Child):
-      def SomeOtherMethod(self):
-        pass
-
-    self.assertTrue(class_util.IsMethodOverridden(
-        Parent, Grandchild, 'MethodShouldBeOverridden'))
-
-  def testClassNotPresentInParent(self):
-    class Parent(object):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    class Child(Parent):
-      def MethodShouldBeOverridden(self):
-        pass
-
-    self.assertRaises(
-        AssertionError, class_util.IsMethodOverridden,
-        Parent, Child, 'WrongMethod')
-
-  def testInvalidClass(self):
-    class Foo(object):
-      def Bar(self):
-        pass
-
-    self.assertRaises(
-        AssertionError, class_util.IsMethodOverridden, 'invalid', Foo, 'Bar')
-
-    self.assertRaises(
-        AssertionError, class_util.IsMethodOverridden, Foo, 'invalid', 'Bar')
-
-  def testMultipleInheritance(self):
-    class Aaa(object):
-      def One(self):
-        pass
-
-    class Bbb(object):
-      def Two(self):
-        pass
-
-    class Ccc(Aaa, Bbb):
-      pass
-
-    class Ddd(object):
-      def Three(self):
-        pass
-
-    class Eee(Ddd):
-      def Three(self):
-        pass
-
-    class Fff(Ccc, Eee):
-      def One(self):
-        pass
-
-    class Ggg(object):
-      def Four(self):
-        pass
-
-    class Hhh(Fff, Ggg):
-      def Two(self):
-        pass
-
-    class Iii(Hhh):
-      pass
-
-    class Jjj(Iii):
-      pass
-
-    self.assertFalse(class_util.IsMethodOverridden(Aaa, Ccc, 'One'))
-    self.assertTrue(class_util.IsMethodOverridden(Aaa, Fff, 'One'))
-    self.assertTrue(class_util.IsMethodOverridden(Aaa, Hhh, 'One'))
-    self.assertTrue(class_util.IsMethodOverridden(Aaa, Jjj, 'One'))
-    self.assertFalse(class_util.IsMethodOverridden(Bbb, Ccc, 'Two'))
-    self.assertTrue(class_util.IsMethodOverridden(Bbb, Hhh, 'Two'))
-    self.assertTrue(class_util.IsMethodOverridden(Bbb, Jjj, 'Two'))
-    self.assertFalse(class_util.IsMethodOverridden(Eee, Fff, 'Three'))
-
-
diff --git a/systrace/catapult/common/py_utils/py_utils/cloud_storage.py b/systrace/catapult/common/py_utils/py_utils/cloud_storage.py
deleted file mode 100644
index 919add6..0000000
--- a/systrace/catapult/common/py_utils/py_utils/cloud_storage.py
+++ /dev/null
@@ -1,593 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Wrappers for gsutil, for basic interaction with Google Cloud Storage."""
-
-import collections
-import contextlib
-import hashlib
-import logging
-import os
-import re
-import shutil
-import stat
-import subprocess
-import sys
-import tempfile
-import time
-
-import py_utils
-from py_utils import cloud_storage_global_lock  # pylint: disable=unused-import
-from py_utils import lock
-
-# Do a no-op import here so that cloud_storage_global_lock dep is picked up
-# by https://cs.chromium.org/chromium/src/build/android/test_runner.pydeps.
-# TODO(nedn, jbudorick): figure out a way to get rid of this ugly hack.
-
-logger = logging.getLogger(__name__)  # pylint: disable=invalid-name
-
-
-PUBLIC_BUCKET = 'chromium-telemetry'
-PARTNER_BUCKET = 'chrome-partner-telemetry'
-INTERNAL_BUCKET = 'chrome-telemetry'
-TELEMETRY_OUTPUT = 'chrome-telemetry-output'
-
-# Uses ordered dict to make sure that bucket's key-value items are ordered from
-# the most open to the most restrictive.
-BUCKET_ALIASES = collections.OrderedDict((
-    ('public', PUBLIC_BUCKET),
-    ('partner', PARTNER_BUCKET),
-    ('internal', INTERNAL_BUCKET),
-    ('output', TELEMETRY_OUTPUT),
-))
-
-BUCKET_ALIAS_NAMES = list(BUCKET_ALIASES.keys())
-
-
-_GSUTIL_PATH = os.path.join(py_utils.GetCatapultDir(), 'third_party', 'gsutil',
-                            'gsutil')
-
-# TODO(tbarzic): A workaround for http://crbug.com/386416 and
-#     http://crbug.com/359293. See |_RunCommand|.
-_CROS_GSUTIL_HOME_WAR = '/home/chromeos-test/'
-
-
-# If Environment variables has DISABLE_CLOUD_STORAGE_IO set to '1', any method
-# calls that invoke cloud storage network io will throw exceptions.
-DISABLE_CLOUD_STORAGE_IO = 'DISABLE_CLOUD_STORAGE_IO'
-
-# The maximum number of seconds to wait to acquire the pseudo lock for a cloud
-# storage file before raising an exception.
-LOCK_ACQUISITION_TIMEOUT = 10
-
-
-class CloudStorageError(Exception):
-
-  @staticmethod
-  def _GetConfigInstructions():
-    command = _GSUTIL_PATH
-    if py_utils.IsRunningOnCrosDevice():
-      command = 'HOME=%s %s' % (_CROS_GSUTIL_HOME_WAR, _GSUTIL_PATH)
-    return ('To configure your credentials:\n'
-            '  1. Run "%s config" and follow its instructions.\n'
-            '  2. If you have a @google.com account, use that account.\n'
-            '  3. For the project-id, just enter 0.' % command)
-
-
-class PermissionError(CloudStorageError):
-
-  def __init__(self):
-    super(PermissionError, self).__init__(
-        'Attempted to access a file from Cloud Storage but you don\'t '
-        'have permission. ' + self._GetConfigInstructions())
-
-
-class CredentialsError(CloudStorageError):
-
-  def __init__(self):
-    super(CredentialsError, self).__init__(
-        'Attempted to access a file from Cloud Storage but you have no '
-        'configured credentials. ' + self._GetConfigInstructions())
-
-
-class CloudStorageIODisabled(CloudStorageError):
-  pass
-
-
-class NotFoundError(CloudStorageError):
-  pass
-
-
-class ServerError(CloudStorageError):
-  pass
-
-
-# TODO(tonyg/dtu): Can this be replaced with distutils.spawn.find_executable()?
-def _FindExecutableInPath(relative_executable_path, *extra_search_paths):
-  search_paths = list(extra_search_paths) + os.environ['PATH'].split(os.pathsep)
-  for search_path in search_paths:
-    executable_path = os.path.join(search_path, relative_executable_path)
-    if py_utils.IsExecutable(executable_path):
-      return executable_path
-  return None
-
-
-def _EnsureExecutable(gsutil):
-  """chmod +x if gsutil is not executable."""
-  st = os.stat(gsutil)
-  if not st.st_mode & stat.S_IEXEC:
-    os.chmod(gsutil, st.st_mode | stat.S_IEXEC)
-
-
-def _IsRunningOnSwarming():
-  return os.environ.get('SWARMING_HEADLESS') is not None
-
-def _RunCommand(args):
-  # On cros device, as telemetry is running as root, home will be set to /root/,
-  # which is not writable. gsutil will attempt to create a download tracker dir
-  # in home dir and fail. To avoid this, override HOME dir to something writable
-  # when running on cros device.
-  #
-  # TODO(tbarzic): Figure out a better way to handle gsutil on cros.
-  #     http://crbug.com/386416, http://crbug.com/359293.
-  gsutil_env = None
-  if py_utils.IsRunningOnCrosDevice():
-    gsutil_env = os.environ.copy()
-    gsutil_env['HOME'] = _CROS_GSUTIL_HOME_WAR
-  elif _IsRunningOnSwarming():
-    gsutil_env = os.environ.copy()
-
-  if os.name == 'nt':
-    # If Windows, prepend python. Python scripts aren't directly executable.
-    args = [sys.executable, _GSUTIL_PATH] + args
-  else:
-    # Don't do it on POSIX, in case someone is using a shell script to redirect.
-    args = [_GSUTIL_PATH] + args
-    _EnsureExecutable(_GSUTIL_PATH)
-
-  if args[0] not in ('help', 'hash', 'version') and not IsNetworkIOEnabled():
-    raise CloudStorageIODisabled(
-        "Environment variable DISABLE_CLOUD_STORAGE_IO is set to 1. "
-        'Command %s is not allowed to run' % args)
-
-  gsutil = subprocess.Popen(args, stdout=subprocess.PIPE,
-                            stderr=subprocess.PIPE, env=gsutil_env)
-  stdout, stderr = gsutil.communicate()
-
-  if gsutil.returncode:
-    raise GetErrorObjectForCloudStorageStderr(stderr)
-
-  return stdout
-
-
-def GetErrorObjectForCloudStorageStderr(stderr):
-  if (stderr.startswith((
-      'You are attempting to access protected data with no configured',
-      'Failure: No handler was ready to authenticate.')) or
-      re.match('.*401.*does not have .* access to .*', stderr)):
-    return CredentialsError()
-  if ('status=403' in stderr or 'status 403' in stderr or
-      '403 Forbidden' in stderr or
-      re.match('.*403.*does not have .* access to .*', stderr)):
-    return PermissionError()
-  if (stderr.startswith('InvalidUriError') or 'No such object' in stderr or
-      'No URLs matched' in stderr or 'One or more URLs matched no' in stderr):
-    return NotFoundError(stderr)
-  if '500 Internal Server Error' in stderr:
-    return ServerError(stderr)
-  return CloudStorageError(stderr)
-
-
-def IsNetworkIOEnabled():
-  """Returns true if cloud storage is enabled."""
-  disable_cloud_storage_env_val = os.getenv(DISABLE_CLOUD_STORAGE_IO)
-
-  if disable_cloud_storage_env_val and disable_cloud_storage_env_val != '1':
-    logger.error(
-        'Unsupported value of environment variable '
-        'DISABLE_CLOUD_STORAGE_IO. Expected None or \'1\' but got %s.',
-        disable_cloud_storage_env_val)
-
-  return disable_cloud_storage_env_val != '1'
-
-
-def List(bucket, prefix=None):
-  """Returns all paths matching the given prefix in bucket.
-
-  Returned paths are relative to the bucket root.
-  If path is given, 'gsutil ls gs://<bucket>/<path>' will be executed, otherwise
-  'gsutil ls gs://<bucket>' will be executed.
-
-  For more details, see:
-  https://cloud.google.com/storage/docs/gsutil/commands/ls#directory-by-directory,-flat,-and-recursive-listings
-
-  Args:
-    bucket: Name of cloud storage bucket to look at.
-    prefix: Path within the bucket to filter to.
-
-  Returns:
-    A list of files. All returned path are relative to the bucket root
-    directory. For example, List('my-bucket', path='foo/') will returns results
-    of the form ['/foo/123', '/foo/124', ...], as opposed to ['123', '124',
-    ...].
-  """
-  bucket_prefix = 'gs://%s' % bucket
-  if prefix is None:
-    full_path = bucket_prefix
-  else:
-    full_path = '%s/%s' % (bucket_prefix, prefix)
-  stdout = _RunCommand(['ls', full_path])
-  return [url[len(bucket_prefix):] for url in stdout.splitlines()]
-
-
-def ListDirs(bucket, path=''):
-  """Returns only directories matching the given path in bucket.
-
-  Args:
-    bucket: Name of cloud storage bucket to look at.
-    path: Path within the bucket to filter to. Path can include wildcards.
-      path = 'foo*' will return ['mybucket/foo1/', 'mybucket/foo2/, ... ] but
-      not mybucket/foo1/file.txt or mybucket/foo-file.txt.
-
-  Returns:
-    A list of directories. All returned path are relative to the bucket root
-    directory. For example, List('my-bucket', path='foo/') will returns results
-    of the form ['/foo/123', '/foo/124', ...], as opposed to ['123', '124',
-    ...].
-  """
-  bucket_prefix = 'gs://%s' % bucket
-  full_path = '%s/%s' % (bucket_prefix, path)
-  # Note that -d only ensures we don't recurse into subdirectories
-  # unnecessarily. It still lists all non directory files matching the path
-  # following by a blank line. Adding -d here is a performance optimization.
-  stdout = _RunCommand(['ls', '-d', full_path])
-  dirs = []
-  for url in stdout.splitlines():
-    if len(url) == 0:
-      continue
-    # The only way to identify directories is by filtering for trailing slash.
-    # See https://github.com/GoogleCloudPlatform/gsutil/issues/466
-    if url[-1] == '/':
-      dirs.append(url[len(bucket_prefix):])
-  return dirs
-
-def Exists(bucket, remote_path):
-  try:
-    _RunCommand(['ls', 'gs://%s/%s' % (bucket, remote_path)])
-    return True
-  except NotFoundError:
-    return False
-
-
-def Move(bucket1, bucket2, remote_path):
-  url1 = 'gs://%s/%s' % (bucket1, remote_path)
-  url2 = 'gs://%s/%s' % (bucket2, remote_path)
-  logger.info('Moving %s to %s', url1, url2)
-  _RunCommand(['mv', url1, url2])
-
-
-def Copy(bucket_from, bucket_to, remote_path_from, remote_path_to):
-  """Copy a file from one location in CloudStorage to another.
-
-  Args:
-      bucket_from: The cloud storage bucket where the file is currently located.
-      bucket_to: The cloud storage bucket it is being copied to.
-      remote_path_from: The file path where the file is located in bucket_from.
-      remote_path_to: The file path it is being copied to in bucket_to.
-
-  It should: cause no changes locally or to the starting file, and will
-  overwrite any existing files in the destination location.
-  """
-  url1 = 'gs://%s/%s' % (bucket_from, remote_path_from)
-  url2 = 'gs://%s/%s' % (bucket_to, remote_path_to)
-  logger.info('Copying %s to %s', url1, url2)
-  _RunCommand(['cp', url1, url2])
-
-
-def Delete(bucket, remote_path):
-  url = 'gs://%s/%s' % (bucket, remote_path)
-  logger.info('Deleting %s', url)
-  _RunCommand(['rm', url])
-
-
-def Get(bucket, remote_path, local_path):
-  with _FileLock(local_path):
-    _GetLocked(bucket, remote_path, local_path)
-
-
-_CLOUD_STORAGE_GLOBAL_LOCK = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), 'cloud_storage_global_lock.py')
-
-
-@contextlib.contextmanager
-def _FileLock(base_path):
-  pseudo_lock_path = '%s.pseudo_lock' % base_path
-  _CreateDirectoryIfNecessary(os.path.dirname(pseudo_lock_path))
-
-  # Make sure that we guard the creation, acquisition, release, and removal of
-  # the pseudo lock all with the same guard (_CLOUD_STORAGE_GLOBAL_LOCK).
-  # Otherwise, we can get nasty interleavings that result in multiple processes
-  # thinking they have an exclusive lock, like:
-  #
-  # (Process 1) Create and acquire the pseudo lock
-  # (Process 1) Release the pseudo lock
-  # (Process 1) Release the file lock
-  # (Process 2) Open and acquire the existing pseudo lock
-  # (Process 1) Delete the (existing) pseudo lock
-  # (Process 3) Create and acquire a new pseudo lock
-  #
-  # Using the same guard for creation and removal of the pseudo lock guarantees
-  # that all processes are referring to the same lock.
-  pseudo_lock_fd = None
-  pseudo_lock_fd_return = []
-  py_utils.WaitFor(lambda: _AttemptPseudoLockAcquisition(pseudo_lock_path,
-                                                         pseudo_lock_fd_return),
-                   LOCK_ACQUISITION_TIMEOUT)
-  pseudo_lock_fd = pseudo_lock_fd_return[0]
-
-  try:
-    yield
-  finally:
-    py_utils.WaitFor(lambda: _AttemptPseudoLockRelease(pseudo_lock_fd),
-                     LOCK_ACQUISITION_TIMEOUT)
-
-def _AttemptPseudoLockAcquisition(pseudo_lock_path, pseudo_lock_fd_return):
-  """Try to acquire the lock and return a boolean indicating whether the attempt
-  was successful. If the attempt was successful, pseudo_lock_fd_return, which
-  should be an empty array, will be modified to contain a single entry: the file
-  descriptor of the (now acquired) lock file.
-
-  This whole operation is guarded with the global cloud storage lock, which
-  prevents race conditions that might otherwise cause multiple processes to
-  believe they hold the same pseudo lock (see _FileLock for more details).
-  """
-  pseudo_lock_fd = None
-  try:
-    with open(_CLOUD_STORAGE_GLOBAL_LOCK) as global_file:
-      with lock.FileLock(global_file, lock.LOCK_EX | lock.LOCK_NB):
-        # Attempt to acquire the lock in a non-blocking manner. If we block,
-        # then we'll cause deadlock because another process will be unable to
-        # acquire the cloud storage global lock in order to release the pseudo
-        # lock.
-        pseudo_lock_fd = open(pseudo_lock_path, 'w')
-        lock.AcquireFileLock(pseudo_lock_fd, lock.LOCK_EX | lock.LOCK_NB)
-        pseudo_lock_fd_return.append(pseudo_lock_fd)
-        return True
-  except (lock.LockException, IOError):
-    # We failed to acquire either the global cloud storage lock or the pseudo
-    # lock.
-    if pseudo_lock_fd:
-      pseudo_lock_fd.close()
-    return False
-
-
-def _AttemptPseudoLockRelease(pseudo_lock_fd):
-  """Try to release the pseudo lock and return a boolean indicating whether
-  the release was succesful.
-
-  This whole operation is guarded with the global cloud storage lock, which
-  prevents race conditions that might otherwise cause multiple processes to
-  believe they hold the same pseudo lock (see _FileLock for more details).
-  """
-  pseudo_lock_path = pseudo_lock_fd.name
-  try:
-    with open(_CLOUD_STORAGE_GLOBAL_LOCK) as global_file:
-      with lock.FileLock(global_file, lock.LOCK_EX | lock.LOCK_NB):
-        lock.ReleaseFileLock(pseudo_lock_fd)
-        pseudo_lock_fd.close()
-        try:
-          os.remove(pseudo_lock_path)
-        except OSError:
-          # We don't care if the pseudo lock gets removed elsewhere before
-          # we have a chance to do so.
-          pass
-        return True
-  except (lock.LockException, IOError):
-    # We failed to acquire the global cloud storage lock and are thus unable to
-    # release the pseudo lock.
-    return False
-
-
-def _CreateDirectoryIfNecessary(directory):
-  if not os.path.exists(directory):
-    os.makedirs(directory)
-
-
-def _GetLocked(bucket, remote_path, local_path):
-  url = 'gs://%s/%s' % (bucket, remote_path)
-  logger.info('Downloading %s to %s', url, local_path)
-  _CreateDirectoryIfNecessary(os.path.dirname(local_path))
-  with tempfile.NamedTemporaryFile(
-      dir=os.path.dirname(local_path),
-      delete=False) as partial_download_path:
-    try:
-      # Windows won't download to an open file.
-      partial_download_path.close()
-      try:
-        _RunCommand(['cp', url, partial_download_path.name])
-      except ServerError:
-        logger.info('Cloud Storage server error, retrying download')
-        _RunCommand(['cp', url, partial_download_path.name])
-      shutil.move(partial_download_path.name, local_path)
-    finally:
-      if os.path.exists(partial_download_path.name):
-        os.remove(partial_download_path.name)
-
-
-def Insert(bucket, remote_path, local_path, publicly_readable=False):
-  """Upload file in |local_path| to cloud storage.
-
-  Args:
-    bucket: the google cloud storage bucket name.
-    remote_path: the remote file path in |bucket|.
-    local_path: path of the local file to be uploaded.
-    publicly_readable: whether the uploaded file has publicly readable
-    permission.
-
-  Returns:
-    The url where the file is uploaded to.
-  """
-  cloud_filepath = Upload(bucket, remote_path, local_path, publicly_readable)
-  return cloud_filepath.view_url
-
-
-class CloudFilepath(object):
-  def __init__(self, bucket, remote_path):
-    self.bucket = bucket
-    self.remote_path = remote_path
-
-  @property
-  def view_url(self):
-    """Get a human viewable url for the cloud file."""
-    return 'https://console.developers.google.com/m/cloudstorage/b/%s/o/%s' % (
-        self.bucket, self.remote_path)
-
-  @property
-  def fetch_url(self):
-    """Get a machine fetchable url for the cloud file."""
-    return 'gs://%s/%s' % (self.bucket, self.remote_path)
-
-
-def Upload(bucket, remote_path, local_path, publicly_readable=False):
-  """Upload file in |local_path| to cloud storage.
-
-  Newer version of 'Insert()' returns an object instead of a string.
-
-  Args:
-    bucket: the google cloud storage bucket name.
-    remote_path: the remote file path in |bucket|.
-    local_path: path of the local file to be uploaded.
-    publicly_readable: whether the uploaded file has publicly readable
-    permission.
-
-  Returns:
-    A CloudFilepath object providing the location of the object in various
-    formats.
-  """
-  url = 'gs://%s/%s' % (bucket, remote_path)
-  command_and_args = ['cp']
-  extra_info = ''
-  if publicly_readable:
-    command_and_args += ['-a', 'public-read']
-    extra_info = ' (publicly readable)'
-  command_and_args += [local_path, url]
-  logger.info('Uploading %s to %s%s', local_path, url, extra_info)
-  _RunCommand(command_and_args)
-  return CloudFilepath(bucket, remote_path)
-
-
-def GetIfHashChanged(cs_path, download_path, bucket, file_hash):
-  """Downloads |download_path| to |file_path| if |file_path| doesn't exist or
-     it's hash doesn't match |file_hash|.
-
-  Returns:
-    True if the binary was changed.
-  Raises:
-    CredentialsError if the user has no configured credentials.
-    PermissionError if the user does not have permission to access the bucket.
-    NotFoundError if the file is not in the given bucket in cloud_storage.
-  """
-  with _FileLock(download_path):
-    if (os.path.exists(download_path) and
-        CalculateHash(download_path) == file_hash):
-      return False
-    _GetLocked(bucket, cs_path, download_path)
-    return True
-
-
-def GetIfChanged(file_path, bucket):
-  """Gets the file at file_path if it has a hash file that doesn't match or
-  if there is no local copy of file_path, but there is a hash file for it.
-
-  Returns:
-    True if the binary was changed.
-  Raises:
-    CredentialsError if the user has no configured credentials.
-    PermissionError if the user does not have permission to access the bucket.
-    NotFoundError if the file is not in the given bucket in cloud_storage.
-  """
-  with _FileLock(file_path):
-    hash_path = file_path + '.sha1'
-    fetch_ts_path = file_path + '.fetchts'
-    if not os.path.exists(hash_path):
-      logger.warning('Hash file not found: %s', hash_path)
-      return False
-
-    expected_hash = ReadHash(hash_path)
-
-    # To save the time required computing binary hash (which is an expensive
-    # operation, see crbug.com/793609#c2 for details), any time we fetch a new
-    # binary, we save not only that binary but the time of the fetch in
-    # |fetch_ts_path|. Anytime the file needs updated (its
-    # hash in |hash_path| change), we can just need to compare the timestamp of
-    # |hash_path| with the timestamp in |fetch_ts_path| to figure out
-    # if the update operation has been done.
-    #
-    # Notes: for this to work, we make the assumption that only
-    # cloud_storage.GetIfChanged modifies the local |file_path| binary.
-
-    if os.path.exists(fetch_ts_path) and os.path.exists(file_path):
-      with open(fetch_ts_path) as f:
-        data = f.read().strip()
-        last_binary_fetch_ts = float(data)
-
-      if last_binary_fetch_ts > os.path.getmtime(hash_path):
-        return False
-
-    # Whether the binary stored in local already has hash matched
-    # expected_hash or we need to fetch new binary from cloud, update the
-    # timestamp in |fetch_ts_path| with current time anyway since it is
-    # outdated compared with sha1's last modified time.
-    with open(fetch_ts_path, 'w') as f:
-      f.write(str(time.time()))
-
-    if os.path.exists(file_path) and CalculateHash(file_path) == expected_hash:
-      return False
-    _GetLocked(bucket, expected_hash, file_path)
-    if CalculateHash(file_path) != expected_hash:
-      os.remove(fetch_ts_path)
-      raise RuntimeError(
-          'Binary stored in cloud storage does not have hash matching .sha1 '
-          'file. Please make sure that the binary file is uploaded using '
-          'depot_tools/upload_to_google_storage.py script or through automatic '
-          'framework.')
-    return True
-
-
-def GetFilesInDirectoryIfChanged(directory, bucket):
-  """ Scan the directory for .sha1 files, and download them from the given
-  bucket in cloud storage if the local and remote hash don't match or
-  there is no local copy.
-  """
-  if not os.path.isdir(directory):
-    raise ValueError(
-        '%s does not exist. Must provide a valid directory path.' % directory)
-  # Don't allow the root directory to be a serving_dir.
-  if directory == os.path.abspath(os.sep):
-    raise ValueError('Trying to serve root directory from HTTP server.')
-  for dirpath, _, filenames in os.walk(directory):
-    for filename in filenames:
-      path_name, extension = os.path.splitext(
-          os.path.join(dirpath, filename))
-      if extension != '.sha1':
-        continue
-      GetIfChanged(path_name, bucket)
-
-
-def CalculateHash(file_path):
-  """Calculates and returns the hash of the file at file_path."""
-  sha1 = hashlib.sha1()
-  with open(file_path, 'rb') as f:
-    while True:
-      # Read in 1mb chunks, so it doesn't all have to be loaded into memory.
-      chunk = f.read(1024 * 1024)
-      if not chunk:
-        break
-      sha1.update(chunk)
-  return sha1.hexdigest()
-
-
-def ReadHash(hash_path):
-  with open(hash_path, 'rb') as f:
-    return f.read(1024).rstrip()
diff --git a/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py b/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
deleted file mode 100644
index 5718e10..0000000
--- a/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This file is used by cloud_storage._FileLock implementation, don't delete it!
diff --git a/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py b/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
deleted file mode 100644
index afd0394..0000000
--- a/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
+++ /dev/null
@@ -1,432 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import shutil
-import sys
-import tempfile
-import unittest
-
-import mock
-from pyfakefs import fake_filesystem_unittest
-
-import py_utils
-from py_utils import cloud_storage
-from py_utils import lock
-
-_CLOUD_STORAGE_GLOBAL_LOCK_PATH = os.path.join(
-    os.path.dirname(__file__), 'cloud_storage_global_lock.py')
-
-def _FakeReadHash(_):
-  return 'hashthis!'
-
-
-def _FakeCalulateHashMatchesRead(_):
-  return 'hashthis!'
-
-
-def _FakeCalulateHashNewHash(_):
-  return 'omgnewhash'
-
-
-class BaseFakeFsUnitTest(fake_filesystem_unittest.TestCase):
-
-  def setUp(self):
-    self.original_environ = os.environ.copy()
-    os.environ['DISABLE_CLOUD_STORAGE_IO'] = ''
-    self.setUpPyfakefs()
-    self.fs.CreateFile(
-        os.path.join(py_utils.GetCatapultDir(),
-                     'third_party', 'gsutil', 'gsutil'))
-
-  def CreateFiles(self, file_paths):
-    for f in file_paths:
-      self.fs.CreateFile(f)
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-    os.environ = self.original_environ
-
-  def _FakeRunCommand(self, cmd):
-    pass
-
-  def _FakeGet(self, bucket, remote_path, local_path):
-    pass
-
-
-class CloudStorageFakeFsUnitTest(BaseFakeFsUnitTest):
-
-  def _AssertRunCommandRaisesError(self, communicate_strs, error):
-    with mock.patch('py_utils.cloud_storage.subprocess.Popen') as popen:
-      p_mock = mock.Mock()
-      popen.return_value = p_mock
-      p_mock.returncode = 1
-      for stderr in communicate_strs:
-        p_mock.communicate.return_value = ('', stderr)
-        self.assertRaises(error, cloud_storage._RunCommand, [])
-
-  def testRunCommandCredentialsError(self):
-    strs = ['You are attempting to access protected data with no configured',
-            'Failure: No handler was ready to authenticate.']
-    self._AssertRunCommandRaisesError(strs, cloud_storage.CredentialsError)
-
-  def testRunCommandPermissionError(self):
-    strs = ['status=403', 'status 403', '403 Forbidden']
-    self._AssertRunCommandRaisesError(strs, cloud_storage.PermissionError)
-
-  def testRunCommandNotFoundError(self):
-    strs = ['InvalidUriError', 'No such object', 'No URLs matched',
-            'One or more URLs matched no', 'InvalidUriError']
-    self._AssertRunCommandRaisesError(strs, cloud_storage.NotFoundError)
-
-  def testRunCommandServerError(self):
-    strs = ['500 Internal Server Error']
-    self._AssertRunCommandRaisesError(strs, cloud_storage.ServerError)
-
-  def testRunCommandGenericError(self):
-    strs = ['Random string']
-    self._AssertRunCommandRaisesError(strs, cloud_storage.CloudStorageError)
-
-  def testInsertCreatesValidCloudUrl(self):
-    orig_run_command = cloud_storage._RunCommand
-    try:
-      cloud_storage._RunCommand = self._FakeRunCommand
-      remote_path = 'test-remote-path.html'
-      local_path = 'test-local-path.html'
-      cloud_url = cloud_storage.Insert(cloud_storage.PUBLIC_BUCKET,
-                                       remote_path, local_path)
-      self.assertEqual('https://console.developers.google.com/m/cloudstorage'
-                       '/b/chromium-telemetry/o/test-remote-path.html',
-                       cloud_url)
-    finally:
-      cloud_storage._RunCommand = orig_run_command
-
-  def testUploadCreatesValidCloudUrls(self):
-    orig_run_command = cloud_storage._RunCommand
-    try:
-      cloud_storage._RunCommand = self._FakeRunCommand
-      remote_path = 'test-remote-path.html'
-      local_path = 'test-local-path.html'
-      cloud_filepath = cloud_storage.Upload(
-          cloud_storage.PUBLIC_BUCKET, remote_path, local_path)
-      self.assertEqual('https://console.developers.google.com/m/cloudstorage'
-                       '/b/chromium-telemetry/o/test-remote-path.html',
-                       cloud_filepath.view_url)
-      self.assertEqual('gs://chromium-telemetry/test-remote-path.html',
-                       cloud_filepath.fetch_url)
-    finally:
-      cloud_storage._RunCommand = orig_run_command
-
-  @mock.patch('py_utils.cloud_storage.subprocess')
-  def testExistsReturnsFalse(self, subprocess_mock):
-    p_mock = mock.Mock()
-    subprocess_mock.Popen.return_value = p_mock
-    p_mock.communicate.return_value = (
-        '',
-        'CommandException: One or more URLs matched no objects.\n')
-    p_mock.returncode_result = 1
-    self.assertFalse(cloud_storage.Exists('fake bucket',
-                                          'fake remote path'))
-
-  @unittest.skipIf(sys.platform.startswith('win'),
-                   'https://github.com/catapult-project/catapult/issues/1861')
-  def testGetFilesInDirectoryIfChanged(self):
-    self.CreateFiles([
-        'real_dir_path/dir1/1file1.sha1',
-        'real_dir_path/dir1/1file2.txt',
-        'real_dir_path/dir1/1file3.sha1',
-        'real_dir_path/dir2/2file.txt',
-        'real_dir_path/dir3/3file1.sha1'])
-
-    def IncrementFilesUpdated(*_):
-      IncrementFilesUpdated.files_updated += 1
-    IncrementFilesUpdated.files_updated = 0
-    orig_get_if_changed = cloud_storage.GetIfChanged
-    cloud_storage.GetIfChanged = IncrementFilesUpdated
-    try:
-      self.assertRaises(ValueError, cloud_storage.GetFilesInDirectoryIfChanged,
-                        os.path.abspath(os.sep), cloud_storage.PUBLIC_BUCKET)
-      self.assertEqual(0, IncrementFilesUpdated.files_updated)
-      self.assertRaises(ValueError, cloud_storage.GetFilesInDirectoryIfChanged,
-                        'fake_dir_path', cloud_storage.PUBLIC_BUCKET)
-      self.assertEqual(0, IncrementFilesUpdated.files_updated)
-      cloud_storage.GetFilesInDirectoryIfChanged('real_dir_path',
-                                                 cloud_storage.PUBLIC_BUCKET)
-      self.assertEqual(3, IncrementFilesUpdated.files_updated)
-    finally:
-      cloud_storage.GetIfChanged = orig_get_if_changed
-
-  def testCopy(self):
-    orig_run_command = cloud_storage._RunCommand
-
-    def AssertCorrectRunCommandArgs(args):
-      self.assertEqual(expected_args, args)
-    cloud_storage._RunCommand = AssertCorrectRunCommandArgs
-    expected_args = ['cp', 'gs://bucket1/remote_path1',
-                     'gs://bucket2/remote_path2']
-    try:
-      cloud_storage.Copy('bucket1', 'bucket2', 'remote_path1', 'remote_path2')
-    finally:
-      cloud_storage._RunCommand = orig_run_command
-
-  @mock.patch('py_utils.cloud_storage._RunCommand')
-  def testListNoPrefix(self, mock_run_command):
-    mock_run_command.return_value = '\n'.join(['gs://bucket/foo-file.txt',
-                                               'gs://bucket/foo1/',
-                                               'gs://bucket/foo2/'])
-
-    self.assertEqual(cloud_storage.List('bucket'),
-                     ['/foo-file.txt', '/foo1/', '/foo2/'])
-
-  @mock.patch('py_utils.cloud_storage._RunCommand')
-  def testListWithPrefix(self, mock_run_command):
-    mock_run_command.return_value = '\n'.join(['gs://bucket/foo/foo-file.txt',
-                                               'gs://bucket/foo/foo1/',
-                                               'gs://bucket/foo/foo2/'])
-
-    self.assertEqual(cloud_storage.List('bucket', 'foo'),
-                     ['/foo/foo-file.txt', '/foo/foo1/', '/foo/foo2/'])
-
-  @mock.patch('py_utils.cloud_storage._RunCommand')
-  def testListDirs(self, mock_run_command):
-    mock_run_command.return_value = '\n'.join(['gs://bucket/foo-file.txt',
-                                               '',
-                                               'gs://bucket/foo1/',
-                                               'gs://bucket/foo2/',
-                                               'gs://bucket/foo1/file.txt'])
-
-    self.assertEqual(cloud_storage.ListDirs('bucket', 'foo*'),
-                     ['/foo1/', '/foo2/'])
-
-  @mock.patch('py_utils.cloud_storage.subprocess.Popen')
-  def testSwarmingUsesExistingEnv(self, mock_popen):
-    os.environ['SWARMING_HEADLESS'] = '1'
-
-    mock_gsutil = mock_popen()
-    mock_gsutil.communicate = mock.MagicMock(return_value=('a', 'b'))
-    mock_gsutil.returncode = None
-
-    cloud_storage.Copy('bucket1', 'bucket2', 'remote_path1', 'remote_path2')
-
-    mock_popen.assert_called_with(
-        mock.ANY, stderr=-1, env=os.environ, stdout=-1)
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  def testDisableCloudStorageIo(self, unused_lock_mock):
-    os.environ['DISABLE_CLOUD_STORAGE_IO'] = '1'
-    dir_path = 'real_dir_path'
-    self.fs.CreateDirectory(dir_path)
-    file_path = os.path.join(dir_path, 'file1')
-    file_path_sha = file_path + '.sha1'
-
-    def CleanTimeStampFile():
-      os.remove(file_path + '.fetchts')
-
-    self.CreateFiles([file_path, file_path_sha])
-    with open(file_path_sha, 'w') as f:
-      f.write('hash1234')
-    with self.assertRaises(cloud_storage.CloudStorageIODisabled):
-      cloud_storage.Copy('bucket1', 'bucket2', 'remote_path1', 'remote_path2')
-    with self.assertRaises(cloud_storage.CloudStorageIODisabled):
-      cloud_storage.Get('bucket', 'foo', file_path)
-    with self.assertRaises(cloud_storage.CloudStorageIODisabled):
-      cloud_storage.GetIfChanged(file_path, 'foo')
-    with self.assertRaises(cloud_storage.CloudStorageIODisabled):
-      cloud_storage.GetIfHashChanged('bar', file_path, 'bucket', 'hash1234')
-    with self.assertRaises(cloud_storage.CloudStorageIODisabled):
-      cloud_storage.Insert('bucket', 'foo', file_path)
-
-    CleanTimeStampFile()
-    with self.assertRaises(cloud_storage.CloudStorageIODisabled):
-      cloud_storage.GetFilesInDirectoryIfChanged(dir_path, 'bucket')
-
-
-class GetIfChangedTests(BaseFakeFsUnitTest):
-
-  def setUp(self):
-    super(GetIfChangedTests, self).setUp()
-    self._orig_read_hash = cloud_storage.ReadHash
-    self._orig_calculate_hash = cloud_storage.CalculateHash
-
-  def tearDown(self):
-    super(GetIfChangedTests, self).tearDown()
-    cloud_storage.CalculateHash = self._orig_calculate_hash
-    cloud_storage.ReadHash = self._orig_read_hash
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  @mock.patch('py_utils.cloud_storage._GetLocked')
-  def testHashPathDoesNotExists(self, unused_get_locked, unused_lock_mock):
-    cloud_storage.ReadHash = _FakeReadHash
-    cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
-    file_path = 'test-file-path.wpr'
-
-    cloud_storage._GetLocked = self._FakeGet
-    # hash_path doesn't exist.
-    self.assertFalse(cloud_storage.GetIfChanged(file_path,
-                                                cloud_storage.PUBLIC_BUCKET))
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  @mock.patch('py_utils.cloud_storage._GetLocked')
-  def testHashPathExistsButFilePathDoesNot(
-      self, unused_get_locked, unused_lock_mock):
-    cloud_storage.ReadHash = _FakeReadHash
-    cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
-    file_path = 'test-file-path.wpr'
-    hash_path = file_path + '.sha1'
-
-    # hash_path exists, but file_path doesn't.
-    self.CreateFiles([hash_path])
-    self.assertTrue(cloud_storage.GetIfChanged(file_path,
-                                               cloud_storage.PUBLIC_BUCKET))
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  @mock.patch('py_utils.cloud_storage._GetLocked')
-  def testHashPathAndFileHashExistWithSameHash(
-      self, unused_get_locked, unused_lock_mock):
-    cloud_storage.ReadHash = _FakeReadHash
-    cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
-    file_path = 'test-file-path.wpr'
-
-    # hash_path and file_path exist, and have same hash.
-    self.CreateFiles([file_path])
-    self.assertFalse(cloud_storage.GetIfChanged(file_path,
-                                                cloud_storage.PUBLIC_BUCKET))
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  @mock.patch('py_utils.cloud_storage._GetLocked')
-  def testHashPathAndFileHashExistWithDifferentHash(
-      self, mock_get_locked, unused_get_locked):
-    cloud_storage.ReadHash = _FakeReadHash
-    cloud_storage.CalculateHash = _FakeCalulateHashNewHash
-    file_path = 'test-file-path.wpr'
-    hash_path = file_path + '.sha1'
-
-    def _FakeGetLocked(bucket, expected_hash, file_path):
-      del bucket, expected_hash, file_path  # unused
-      cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
-
-    mock_get_locked.side_effect = _FakeGetLocked
-
-    self.CreateFiles([file_path, hash_path])
-    # hash_path and file_path exist, and have different hashes.
-    self.assertTrue(cloud_storage.GetIfChanged(file_path,
-                                               cloud_storage.PUBLIC_BUCKET))
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  @mock.patch('py_utils.cloud_storage.CalculateHash')
-  @mock.patch('py_utils.cloud_storage._GetLocked')
-  def testNoHashComputationNeededUponSecondCall(
-      self, mock_get_locked, mock_calculate_hash, unused_get_locked):
-    mock_calculate_hash.side_effect = _FakeCalulateHashNewHash
-    cloud_storage.ReadHash = _FakeReadHash
-    file_path = 'test-file-path.wpr'
-    hash_path = file_path + '.sha1'
-
-    def _FakeGetLocked(bucket, expected_hash, file_path):
-      del bucket, expected_hash, file_path  # unused
-      cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
-
-    mock_get_locked.side_effect = _FakeGetLocked
-
-    self.CreateFiles([file_path, hash_path])
-    # hash_path and file_path exist, and have different hashes. This first call
-    # will invoke a fetch.
-    self.assertTrue(cloud_storage.GetIfChanged(file_path,
-                                               cloud_storage.PUBLIC_BUCKET))
-
-    # The fetch left a .fetchts file on machine.
-    self.assertTrue(os.path.exists(file_path + '.fetchts'))
-
-    # Subsequent invocations of GetIfChanged should not invoke CalculateHash.
-    mock_calculate_hash.assert_not_called()
-    self.assertFalse(cloud_storage.GetIfChanged(file_path,
-                                                cloud_storage.PUBLIC_BUCKET))
-    self.assertFalse(cloud_storage.GetIfChanged(file_path,
-                                                cloud_storage.PUBLIC_BUCKET))
-
-  @mock.patch('py_utils.cloud_storage._FileLock')
-  @mock.patch('py_utils.cloud_storage.CalculateHash')
-  @mock.patch('py_utils.cloud_storage._GetLocked')
-  def testRefetchingFileUponHashFileChange(
-      self, mock_get_locked, mock_calculate_hash, unused_get_locked):
-    mock_calculate_hash.side_effect = _FakeCalulateHashNewHash
-    cloud_storage.ReadHash = _FakeReadHash
-    file_path = 'test-file-path.wpr'
-    hash_path = file_path + '.sha1'
-
-    def _FakeGetLocked(bucket, expected_hash, file_path):
-      del bucket, expected_hash, file_path  # unused
-      cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
-
-    mock_get_locked.side_effect = _FakeGetLocked
-
-    self.CreateFiles([file_path, hash_path])
-    # hash_path and file_path exist, and have different hashes. This first call
-    # will invoke a fetch.
-    self.assertTrue(cloud_storage.GetIfChanged(file_path,
-                                               cloud_storage.PUBLIC_BUCKET))
-
-    # The fetch left a .fetchts file on machine.
-    self.assertTrue(os.path.exists(file_path + '.fetchts'))
-
-    with open(file_path + '.fetchts') as f:
-      fetchts = float(f.read())
-
-    # Updating the .sha1 hash_path file with the new hash after .fetchts
-    # is created.
-    file_obj = self.fs.GetObject(hash_path)
-    file_obj.SetMTime(fetchts + 100)
-
-    cloud_storage.ReadHash = lambda _: 'hashNeW'
-    def _FakeGetLockedNewHash(bucket, expected_hash, file_path):
-      del bucket, expected_hash, file_path  # unused
-      cloud_storage.CalculateHash = lambda _: 'hashNeW'
-
-    mock_get_locked.side_effect = _FakeGetLockedNewHash
-
-    # hash_path and file_path exist, and have different hashes. This first call
-    # will invoke a fetch.
-    self.assertTrue(cloud_storage.GetIfChanged(file_path,
-                                               cloud_storage.PUBLIC_BUCKET))
-
-
-class CloudStorageRealFsUnitTest(unittest.TestCase):
-
-  def setUp(self):
-    self.original_environ = os.environ.copy()
-    os.environ['DISABLE_CLOUD_STORAGE_IO'] = ''
-
-  def tearDown(self):
-    os.environ = self.original_environ
-
-  @mock.patch('py_utils.cloud_storage.LOCK_ACQUISITION_TIMEOUT', .005)
-  def testGetPseudoLockUnavailableCausesTimeout(self):
-    with tempfile.NamedTemporaryFile(suffix='.pseudo_lock') as pseudo_lock_fd:
-      with lock.FileLock(pseudo_lock_fd, lock.LOCK_EX | lock.LOCK_NB):
-        with self.assertRaises(py_utils.TimeoutException):
-          file_path = pseudo_lock_fd.name.replace('.pseudo_lock', '')
-          cloud_storage.GetIfChanged(file_path, cloud_storage.PUBLIC_BUCKET)
-
-  @mock.patch('py_utils.cloud_storage.LOCK_ACQUISITION_TIMEOUT', .005)
-  def testGetGlobalLockUnavailableCausesTimeout(self):
-    with open(_CLOUD_STORAGE_GLOBAL_LOCK_PATH) as global_lock_fd:
-      with lock.FileLock(global_lock_fd, lock.LOCK_EX | lock.LOCK_NB):
-        tmp_dir = tempfile.mkdtemp()
-        try:
-          file_path = os.path.join(tmp_dir, 'foo')
-          with self.assertRaises(py_utils.TimeoutException):
-            cloud_storage.GetIfChanged(file_path, cloud_storage.PUBLIC_BUCKET)
-        finally:
-          shutil.rmtree(tmp_dir)
-
-
-class CloudStorageErrorHandlingTest(unittest.TestCase):
-  def runTest(self):
-    self.assertIsInstance(cloud_storage.GetErrorObjectForCloudStorageStderr(
-        'ServiceException: 401 Anonymous users does not have '
-        'storage.objects.get access to object chrome-partner-telemetry'),
-                          cloud_storage.CredentialsError)
-    self.assertIsInstance(cloud_storage.GetErrorObjectForCloudStorageStderr(
-        '403 Caller does not have storage.objects.list access to bucket '
-        'chrome-telemetry'), cloud_storage.PermissionError)
diff --git a/systrace/catapult/common/py_utils/py_utils/constants/__init__.py b/systrace/catapult/common/py_utils/py_utils/constants/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/systrace/catapult/common/py_utils/py_utils/constants/__init__.py
+++ /dev/null
diff --git a/systrace/catapult/common/py_utils/py_utils/constants/exit_codes.py b/systrace/catapult/common/py_utils/py_utils/constants/exit_codes.py
deleted file mode 100644
index 9eaac5c..0000000
--- a/systrace/catapult/common/py_utils/py_utils/constants/exit_codes.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-# Lint as: python3
-"""Common exit codes for catapult tools."""
-
-SUCCESS = 0
-TEST_FAILURE = 1
-FATAL_ERROR = 2
-# See crbug.com/1019139#c8 for history on this exit code.
-# Note that some test runners (for example: typ) may continue to return SUCCESS
-# for cases where all tests are skipped.
-ALL_TESTS_SKIPPED = 111
diff --git a/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py b/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py
deleted file mode 100644
index 922d27d..0000000
--- a/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-class _OptionalContextManager(object):
-
-  def __init__(self, manager, condition):
-    self._manager = manager
-    self._condition = condition
-
-  def __enter__(self):
-    if self._condition:
-      return self._manager.__enter__()
-    return None
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    if self._condition:
-      return self._manager.__exit__(exc_type, exc_val, exc_tb)
-    return None
-
-
-def Optional(manager, condition):
-  """Wraps the provided context manager and runs it if condition is True.
-
-  Args:
-    manager: A context manager to conditionally run.
-    condition: If true, runs the given context manager.
-  Returns:
-    A context manager that conditionally executes the given manager.
-  """
-  return _OptionalContextManager(manager, condition)
-
diff --git a/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py b/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
deleted file mode 100644
index b83e7e5..0000000
--- a/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from py_utils import contextlib_ext
-
-
-class OptionalUnittest(unittest.TestCase):
-
-  class SampleContextMgr(object):
-
-    def __init__(self):
-      self.entered = False
-      self.exited = False
-
-    def __enter__(self):
-      self.entered = True
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-      self.exited = True
-
-  def testConditionTrue(self):
-    c = self.SampleContextMgr()
-    with contextlib_ext.Optional(c, True):
-      self.assertTrue(c.entered)
-    self.assertTrue(c.exited)
-
-  def testConditionFalse(self):
-    c = self.SampleContextMgr()
-    with contextlib_ext.Optional(c, False):
-      self.assertFalse(c.entered)
-    self.assertFalse(c.exited)
diff --git a/systrace/catapult/common/py_utils/py_utils/dependency_util.py b/systrace/catapult/common/py_utils/py_utils/dependency_util.py
deleted file mode 100644
index d3cfe89..0000000
--- a/systrace/catapult/common/py_utils/py_utils/dependency_util.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import platform
-import sys
-
-import py_utils
-
-def GetOSAndArchForCurrentDesktopPlatform():
-  os_name = GetOSNameForCurrentDesktopPlatform()
-  return os_name, GetArchForCurrentDesktopPlatform(os_name)
-
-
-def GetOSNameForCurrentDesktopPlatform():
-  if py_utils.IsRunningOnCrosDevice():
-    return 'chromeos'
-  if sys.platform.startswith('linux'):
-    return 'linux'
-  if sys.platform == 'darwin':
-    return 'mac'
-  if sys.platform == 'win32':
-    return 'win'
-  return sys.platform
-
-
-def GetArchForCurrentDesktopPlatform(os_name):
-  if os_name == 'chromeos':
-    # Current tests outside of telemetry don't run on chromeos, and
-    # platform.machine is not the way telemetry gets the arch name on chromeos.
-    raise NotImplementedError()
-  return platform.machine()
-
-
-def GetChromeApkOsVersion(version_name):
-  version = version_name[0]
-  assert version.isupper(), (
-      'First character of versions name %s was not an uppercase letter.')
-  if version < 'L':
-    return 'k'
-  elif version > 'M':
-    return 'n'
-  return 'l'
-
-
-def ChromeBinariesConfigPath():
-  return os.path.realpath(os.path.join(
-      os.path.dirname(os.path.abspath(__file__)), 'chrome_binaries.json'))
diff --git a/systrace/catapult/common/py_utils/py_utils/discover.py b/systrace/catapult/common/py_utils/py_utils/discover.py
deleted file mode 100644
index a9333e2..0000000
--- a/systrace/catapult/common/py_utils/py_utils/discover.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import fnmatch
-import importlib
-import inspect
-import os
-import re
-import sys
-
-from py_utils import camel_case
-
-
-def DiscoverModules(start_dir, top_level_dir, pattern='*'):
-  """Discover all modules in |start_dir| which match |pattern|.
-
-  Args:
-    start_dir: The directory to recursively search.
-    top_level_dir: The top level of the package, for importing.
-    pattern: Unix shell-style pattern for filtering the filenames to import.
-
-  Returns:
-    list of modules.
-  """
-  # start_dir and top_level_dir must be consistent with each other.
-  start_dir = os.path.realpath(start_dir)
-  top_level_dir = os.path.realpath(top_level_dir)
-
-  modules = []
-  sub_paths = list(os.walk(start_dir))
-  # We sort the directories & file paths to ensure a deterministic ordering when
-  # traversing |top_level_dir|.
-  sub_paths.sort(key=lambda paths_tuple: paths_tuple[0])
-  for dir_path, _, filenames in sub_paths:
-    # Sort the directories to walk recursively by the directory path.
-    filenames.sort()
-    for filename in filenames:
-      # Filter out unwanted filenames.
-      if filename.startswith('.') or filename.startswith('_'):
-        continue
-      if os.path.splitext(filename)[1] != '.py':
-        continue
-      if not fnmatch.fnmatch(filename, pattern):
-        continue
-
-      # Find the module.
-      module_rel_path = os.path.relpath(
-          os.path.join(dir_path, filename), top_level_dir)
-      module_name = re.sub(r'[/\\]', '.', os.path.splitext(module_rel_path)[0])
-
-      # Import the module.
-      try:
-        # Make sure that top_level_dir is the first path in the sys.path in case
-        # there are naming conflict in module parts.
-        original_sys_path = sys.path[:]
-        sys.path.insert(0, top_level_dir)
-        module = importlib.import_module(module_name)
-        modules.append(module)
-      finally:
-        sys.path = original_sys_path
-  return modules
-
-
-def AssertNoKeyConflicts(classes_by_key_1, classes_by_key_2):
-  for k in classes_by_key_1:
-    if k in classes_by_key_2:
-      assert classes_by_key_1[k] is classes_by_key_2[k], (
-          'Found conflicting classes for the same key: '
-          'key=%s, class_1=%s, class_2=%s' % (
-              k, classes_by_key_1[k], classes_by_key_2[k]))
-
-
-# TODO(dtu): Normalize all discoverable classes to have corresponding module
-# and class names, then always index by class name.
-def DiscoverClasses(start_dir,
-                    top_level_dir,
-                    base_class,
-                    pattern='*',
-                    index_by_class_name=True,
-                    directly_constructable=False):
-  """Discover all classes in |start_dir| which subclass |base_class|.
-
-  Base classes that contain subclasses are ignored by default.
-
-  Args:
-    start_dir: The directory to recursively search.
-    top_level_dir: The top level of the package, for importing.
-    base_class: The base class to search for.
-    pattern: Unix shell-style pattern for filtering the filenames to import.
-    index_by_class_name: If True, use class name converted to
-        lowercase_with_underscores instead of module name in return dict keys.
-    directly_constructable: If True, will only return classes that can be
-        constructed without arguments
-
-  Returns:
-    dict of {module_name: class} or {underscored_class_name: class}
-  """
-  modules = DiscoverModules(start_dir, top_level_dir, pattern)
-  classes = {}
-  for module in modules:
-    new_classes = DiscoverClassesInModule(
-        module, base_class, index_by_class_name, directly_constructable)
-    # TODO(crbug.com/548652): we should remove index_by_class_name once
-    # benchmark_smoke_unittest in chromium/src/tools/perf no longer relied
-    # naming collisions to reduce the number of smoked benchmark tests.
-    if index_by_class_name:
-      AssertNoKeyConflicts(classes, new_classes)
-    classes = dict(list(classes.items()) + list(new_classes.items()))
-  return classes
-
-
-# TODO(crbug.com/548652): we should remove index_by_class_name once
-# benchmark_smoke_unittest in chromium/src/tools/perf no longer relied
-# naming collisions to reduce the number of smoked benchmark tests.
-def DiscoverClassesInModule(module,
-                            base_class,
-                            index_by_class_name=False,
-                            directly_constructable=False):
-  """Discover all classes in |module| which subclass |base_class|.
-
-  Base classes that contain subclasses are ignored by default.
-
-  Args:
-    module: The module to search.
-    base_class: The base class to search for.
-    index_by_class_name: If True, use class name converted to
-        lowercase_with_underscores instead of module name in return dict keys.
-
-  Returns:
-    dict of {module_name: class} or {underscored_class_name: class}
-  """
-  classes = {}
-  for _, obj in inspect.getmembers(module):
-    # Ensure object is a class.
-    if not inspect.isclass(obj):
-      continue
-    # Include only subclasses of base_class.
-    if not issubclass(obj, base_class):
-      continue
-    # Exclude the base_class itself.
-    if obj is base_class:
-      continue
-    # Exclude protected or private classes.
-    if obj.__name__.startswith('_'):
-      continue
-    # Include only the module in which the class is defined.
-    # If a class is imported by another module, exclude those duplicates.
-    if obj.__module__ != module.__name__:
-      continue
-
-    if index_by_class_name:
-      key_name = camel_case.ToUnderscore(obj.__name__)
-    else:
-      key_name = module.__name__.split('.')[-1]
-    if not directly_constructable or IsDirectlyConstructable(obj):
-      if key_name in classes and index_by_class_name:
-        assert classes[key_name] is obj, (
-            'Duplicate key_name with different objs detected: '
-            'key=%s, obj1=%s, obj2=%s' % (key_name, classes[key_name], obj))
-      else:
-        classes[key_name] = obj
-
-  return classes
-
-
-def IsDirectlyConstructable(cls):
-  """Returns True if instance of |cls| can be construct without arguments."""
-  assert inspect.isclass(cls)
-  if not hasattr(cls, '__init__'):
-    # Case |class A: pass|.
-    return True
-  if cls.__init__ is object.__init__:
-    # Case |class A(object): pass|.
-    return True
-  # Case |class (object):| with |__init__| other than |object.__init__|.
-  args, _, _, defaults = inspect.getargspec(cls.__init__)
-  if defaults is None:
-    defaults = ()
-  # Return true if |self| is only arg without a default.
-  return len(args) == len(defaults) + 1
-
-
-_COUNTER = [0]
-
-
-def _GetUniqueModuleName():
-  _COUNTER[0] += 1
-  return "module_" + str(_COUNTER[0])
diff --git a/systrace/catapult/common/py_utils/py_utils/discover_unittest.py b/systrace/catapult/common/py_utils/py_utils/discover_unittest.py
deleted file mode 100644
index bdc50b2..0000000
--- a/systrace/catapult/common/py_utils/py_utils/discover_unittest.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import os
-import unittest
-
-import six
-
-from py_utils import discover
-
-
-class DiscoverTest(unittest.TestCase):
-
-  def setUp(self):
-    self._base_dir = os.path.join(os.path.dirname(__file__), 'test_data')
-    self._start_dir = os.path.join(self._base_dir, 'discoverable_classes')
-    self._base_class = Exception
-
-  def testDiscoverClassesWithIndexByModuleName(self):
-    classes = discover.DiscoverClasses(self._start_dir,
-                                       self._base_dir,
-                                       self._base_class,
-                                       index_by_class_name=False)
-
-    actual_classes = dict(
-        (name, cls.__name__) for name, cls in six.iteritems(classes))
-    expected_classes = {
-        'another_discover_dummyclass': 'DummyExceptionWithParameterImpl1',
-        'discover_dummyclass': 'DummyException',
-        'parameter_discover_dummyclass': 'DummyExceptionWithParameterImpl2'
-    }
-    self.assertEqual(actual_classes, expected_classes)
-
-  def testDiscoverDirectlyConstructableClassesWithIndexByClassName(self):
-    classes = discover.DiscoverClasses(self._start_dir,
-                                       self._base_dir,
-                                       self._base_class,
-                                       directly_constructable=True)
-
-    actual_classes = dict(
-        (name, cls.__name__) for name, cls in six.iteritems(classes))
-    expected_classes = {
-        'dummy_exception': 'DummyException',
-        'dummy_exception_impl1': 'DummyExceptionImpl1',
-        'dummy_exception_impl2': 'DummyExceptionImpl2',
-    }
-    self.assertEqual(actual_classes, expected_classes)
-
-  def testDiscoverClassesWithIndexByClassName(self):
-    classes = discover.DiscoverClasses(self._start_dir, self._base_dir,
-                                       self._base_class)
-
-    actual_classes = dict(
-        (name, cls.__name__) for name, cls in six.iteritems(classes))
-    expected_classes = {
-        'dummy_exception': 'DummyException',
-        'dummy_exception_impl1': 'DummyExceptionImpl1',
-        'dummy_exception_impl2': 'DummyExceptionImpl2',
-        'dummy_exception_with_parameter_impl1':
-            'DummyExceptionWithParameterImpl1',
-        'dummy_exception_with_parameter_impl2':
-            'DummyExceptionWithParameterImpl2'
-    }
-    self.assertEqual(actual_classes, expected_classes)
-
-  def testDiscoverClassesWithPatternAndIndexByModule(self):
-    classes = discover.DiscoverClasses(self._start_dir,
-                                       self._base_dir,
-                                       self._base_class,
-                                       pattern='another*',
-                                       index_by_class_name=False)
-
-    actual_classes = dict(
-        (name, cls.__name__) for name, cls in six.iteritems(classes))
-    expected_classes = {
-        'another_discover_dummyclass': 'DummyExceptionWithParameterImpl1'
-    }
-    self.assertEqual(actual_classes, expected_classes)
-
-  def testDiscoverDirectlyConstructableClassesWithPatternAndIndexByClassName(
-      self):
-    classes = discover.DiscoverClasses(self._start_dir,
-                                       self._base_dir,
-                                       self._base_class,
-                                       pattern='another*',
-                                       directly_constructable=True)
-
-    actual_classes = dict(
-        (name, cls.__name__) for name, cls in six.iteritems(classes))
-    expected_classes = {
-        'dummy_exception_impl1': 'DummyExceptionImpl1',
-        'dummy_exception_impl2': 'DummyExceptionImpl2',
-    }
-    self.assertEqual(actual_classes, expected_classes)
-
-  def testDiscoverClassesWithPatternAndIndexByClassName(self):
-    classes = discover.DiscoverClasses(self._start_dir,
-                                       self._base_dir,
-                                       self._base_class,
-                                       pattern='another*')
-
-    actual_classes = dict(
-        (name, cls.__name__) for name, cls in six.iteritems(classes))
-    expected_classes = {
-        'dummy_exception_impl1': 'DummyExceptionImpl1',
-        'dummy_exception_impl2': 'DummyExceptionImpl2',
-        'dummy_exception_with_parameter_impl1':
-            'DummyExceptionWithParameterImpl1',
-    }
-    self.assertEqual(actual_classes, expected_classes)
-
-
-class ClassWithoutInitDefOne:  # pylint: disable=old-style-class, no-init
-  pass
-
-
-class ClassWithoutInitDefTwo(object):
-  pass
-
-
-class ClassWhoseInitOnlyHasSelf(object):
-  def __init__(self):
-    pass
-
-
-class ClassWhoseInitWithDefaultArguments(object):
-  def __init__(self, dog=1, cat=None, cow=None, fud='a'):
-    pass
-
-
-class ClassWhoseInitWithDefaultArgumentsAndNonDefaultArguments(object):
-  def __init__(self, x, dog=1, cat=None, fish=None, fud='a'):
-    pass
-
-
-class IsDirectlyConstructableTest(unittest.TestCase):
-
-  def testIsDirectlyConstructableReturnsTrue(self):
-    self.assertTrue(discover.IsDirectlyConstructable(ClassWithoutInitDefOne))
-    self.assertTrue(discover.IsDirectlyConstructable(ClassWithoutInitDefTwo))
-    self.assertTrue(discover.IsDirectlyConstructable(ClassWhoseInitOnlyHasSelf))
-    self.assertTrue(
-        discover.IsDirectlyConstructable(ClassWhoseInitWithDefaultArguments))
-
-  def testIsDirectlyConstructableReturnsFalse(self):
-    self.assertFalse(
-        discover.IsDirectlyConstructable(
-            ClassWhoseInitWithDefaultArgumentsAndNonDefaultArguments))
diff --git a/systrace/catapult/common/py_utils/py_utils/exc_util.py b/systrace/catapult/common/py_utils/py_utils/exc_util.py
deleted file mode 100644
index 538ced2..0000000
--- a/systrace/catapult/common/py_utils/py_utils/exc_util.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import functools
-import logging
-import sys
-
-
-def BestEffort(func):
-  """Decorator to log and dismiss exceptions if one if already being handled.
-
-  Note: This is largely a workaround for the lack of support of exception
-  chaining in Python 2.7, this decorator will no longer be needed in Python 3.
-
-  Typical usage would be in |Close| or |Disconnect| methods, to dismiss but log
-  any further exceptions raised if the current execution context is already
-  handling an exception. For example:
-
-      class Client(object):
-        def Connect(self):
-          # code to connect ...
-
-        @exc_util.BestEffort
-        def Disconnect(self):
-          # code to disconnect ...
-
-      client = Client()
-      try:
-        client.Connect()
-      except:
-        client.Disconnect()
-        raise
-
-  If an exception is raised by client.Connect(), and then a second exception
-  is raised by client.Disconnect(), the decorator will log the second exception
-  and let the original one be re-raised.
-
-  Otherwise, in Python 2.7 and without the decorator, the second exception is
-  the one propagated to the caller; while information about the original one,
-  usually more important, is completely lost.
-
-  Note that if client.Disconnect() is called in a context where an exception
-  is *not* being handled, then any exceptions raised within the method will
-  get through and be passed on to callers for them to handle in the usual way.
-
-  The decorator can also be used on cleanup functions meant to be called on
-  a finally block, however you must also include an except-raise clause to
-  properly signal (in Python 2.7) whether an exception is being handled; e.g.:
-
-      @exc_util.BestEffort
-      def cleanup():
-        # do cleanup things ...
-
-      try:
-        process(thing)
-      except:
-        raise  # Needed to let cleanup know if an exception is being handled.
-      finally:
-        cleanup()
-
-  Failing to include the except-raise block has the same effect as not
-  including the decorator at all. Namely: exceptions during |cleanup| are
-  raised and swallow any prior exceptions that occurred during |process|.
-  """
-  @functools.wraps(func)
-  def Wrapper(*args, **kwargs):
-    exc_type = sys.exc_info()[0]
-    if exc_type is None:
-      # Not currently handling an exception; let any errors raise exceptions
-      # as usual.
-      func(*args, **kwargs)
-    else:
-      # Otherwise, we are currently handling an exception, dismiss and log
-      # any further cascading errors. Callers are responsible to handle the
-      # original exception.
-      try:
-        func(*args, **kwargs)
-      except Exception:  # pylint: disable=broad-except
-        logging.exception(
-            'While handling a %s, the following exception was also raised:',
-            exc_type.__name__)
-
-  return Wrapper
diff --git a/systrace/catapult/common/py_utils/py_utils/exc_util_unittest.py b/systrace/catapult/common/py_utils/py_utils/exc_util_unittest.py
deleted file mode 100644
index 31e3b57..0000000
--- a/systrace/catapult/common/py_utils/py_utils/exc_util_unittest.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import re
-import sys
-import unittest
-
-from py_utils import exc_util
-
-
-class FakeConnectionError(Exception):
-  pass
-
-
-class FakeDisconnectionError(Exception):
-  pass
-
-
-class FakeProcessingError(Exception):
-  pass
-
-
-class FakeCleanupError(Exception):
-  pass
-
-
-class FaultyClient(object):
-  def __init__(self, *args):
-    self.failures = set(args)
-    self.called = set()
-
-  def Connect(self):
-    self.called.add('Connect')
-    if FakeConnectionError in self.failures:
-      raise FakeConnectionError('Oops!')
-
-  def Process(self):
-    self.called.add('Process')
-    if FakeProcessingError in self.failures:
-      raise FakeProcessingError('Oops!')
-
-  @exc_util.BestEffort
-  def Disconnect(self):
-    self.called.add('Disconnect')
-    if FakeDisconnectionError in self.failures:
-      raise FakeDisconnectionError('Oops!')
-
-  @exc_util.BestEffort
-  def Cleanup(self):
-    self.called.add('Cleanup')
-    if FakeCleanupError in self.failures:
-      raise FakeCleanupError('Oops!')
-
-
-class ReraiseTests(unittest.TestCase):
-  def assertLogMatches(self, pattern):
-    self.assertRegexpMatches(
-        sys.stderr.getvalue(), pattern)  # pylint: disable=no-member
-
-  def assertLogNotMatches(self, pattern):
-    self.assertNotRegexpMatches(
-        sys.stderr.getvalue(), pattern)  # pylint: disable=no-member
-
-  def testTryRaisesExceptRaises(self):
-    client = FaultyClient(FakeConnectionError, FakeDisconnectionError)
-
-    # The connection error reaches the top level, while the disconnection
-    # error is logged.
-    with self.assertRaises(FakeConnectionError):
-      try:
-        client.Connect()
-      except:
-        client.Disconnect()
-        raise
-
-    self.assertLogMatches(re.compile(
-        r'While handling a FakeConnectionError, .* was also raised:\n'
-        r'Traceback \(most recent call last\):\n'
-        r'.*\n'
-        r'FakeDisconnectionError: Oops!\n', re.DOTALL))
-    self.assertItemsEqual(client.called, ['Connect', 'Disconnect'])
-
-  def testTryRaisesExceptDoesnt(self):
-    client = FaultyClient(FakeConnectionError)
-
-    # The connection error reaches the top level, disconnecting did not raise
-    # an exception (so nothing is logged).
-    with self.assertRaises(FakeConnectionError):
-      try:
-        client.Connect()
-      except:
-        client.Disconnect()
-        raise
-
-    self.assertLogNotMatches('FakeDisconnectionError')
-    self.assertItemsEqual(client.called, ['Connect', 'Disconnect'])
-
-  def testTryPassesNoException(self):
-    client = FaultyClient(FakeDisconnectionError)
-
-    # If there is no connection error, the except clause is not called (even if
-    # it would have raised an exception).
-    try:
-      client.Connect()
-    except:
-      client.Disconnect()
-      raise
-
-    self.assertLogNotMatches('FakeConnectionError')
-    self.assertLogNotMatches('FakeDisconnectionError')
-    self.assertItemsEqual(client.called, ['Connect'])
-
-  def testTryRaisesFinallyRaises(self):
-    worker = FaultyClient(FakeProcessingError, FakeCleanupError)
-
-    # The processing error reaches the top level, the cleanup error is logged.
-    with self.assertRaises(FakeProcessingError):
-      try:
-        worker.Process()
-      except:
-        raise  # Needed for Cleanup to know if an exception is handled.
-      finally:
-        worker.Cleanup()
-
-    self.assertLogMatches(re.compile(
-        r'While handling a FakeProcessingError, .* was also raised:\n'
-        r'Traceback \(most recent call last\):\n'
-        r'.*\n'
-        r'FakeCleanupError: Oops!\n', re.DOTALL))
-    self.assertItemsEqual(worker.called, ['Process', 'Cleanup'])
-
-  def testTryRaisesFinallyDoesnt(self):
-    worker = FaultyClient(FakeProcessingError)
-
-    # The processing error reaches the top level, the cleanup code runs fine.
-    with self.assertRaises(FakeProcessingError):
-      try:
-        worker.Process()
-      except:
-        raise  # Needed for Cleanup to know if an exception is handled.
-      finally:
-        worker.Cleanup()
-
-    self.assertLogNotMatches('FakeProcessingError')
-    self.assertLogNotMatches('FakeCleanupError')
-    self.assertItemsEqual(worker.called, ['Process', 'Cleanup'])
-
-  def testTryPassesFinallyRaises(self):
-    worker = FaultyClient(FakeCleanupError)
-
-    # The processing code runs fine, the cleanup code raises an exception
-    # which reaches the top level.
-    with self.assertRaises(FakeCleanupError):
-      try:
-        worker.Process()
-      except:
-        raise  # Needed for Cleanup to know if an exception is handled.
-      finally:
-        worker.Cleanup()
-
-    self.assertLogNotMatches('FakeProcessingError')
-    self.assertLogNotMatches('FakeCleanupError')
-    self.assertItemsEqual(worker.called, ['Process', 'Cleanup'])
-
-  def testTryRaisesExceptRaisesFinallyRaises(self):
-    worker = FaultyClient(
-        FakeProcessingError, FakeDisconnectionError, FakeCleanupError)
-
-    # Chaining try-except-finally works fine. Only the processing error reaches
-    # the top level; the other two are logged.
-    with self.assertRaises(FakeProcessingError):
-      try:
-        worker.Process()
-      except:
-        worker.Disconnect()
-        raise
-      finally:
-        worker.Cleanup()
-
-    self.assertLogMatches('FakeDisconnectionError')
-    self.assertLogMatches('FakeCleanupError')
-    self.assertItemsEqual(worker.called, ['Process', 'Disconnect', 'Cleanup'])
diff --git a/systrace/catapult/common/py_utils/py_utils/expectations_parser.py b/systrace/catapult/common/py_utils/py_utils/expectations_parser.py
deleted file mode 100644
index 534b352..0000000
--- a/systrace/catapult/common/py_utils/py_utils/expectations_parser.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-import re
-import six
-
-
-class ParseError(Exception):
-  pass
-
-
-class Expectation(object):
-  def __init__(self, reason, test, conditions, results):
-    """Constructor for expectations.
-
-    Args:
-      reason: String that indicates the reason for disabling.
-      test: String indicating which test is being disabled.
-      conditions: List of tags indicating which conditions to disable for.
-          Conditions are combined using logical and. Example: ['Mac', 'Debug']
-      results: List of outcomes for test. Example: ['Skip', 'Pass']
-    """
-    assert isinstance(reason, six.string_types) or reason is None
-    self._reason = reason
-    assert isinstance(test, six.string_types)
-    self._test = test
-    assert isinstance(conditions, list)
-    self._conditions = conditions
-    assert isinstance(results, list)
-    self._results = results
-
-  def __eq__(self, other):
-    return (self.reason == other.reason and
-            self.test == other.test and
-            self.conditions == other.conditions and
-            self.results == other.results)
-
-  @property
-  def reason(self):
-    return self._reason
-
-  @property
-  def test(self):
-    return self._test
-
-  @property
-  def conditions(self):
-    return self._conditions
-
-  @property
-  def results(self):
-    return self._results
-
-
-class TestExpectationParser(object):
-  """Parse expectations data in TA/DA format.
-
-  This parser covers the 'tagged' test lists format in:
-      bit.ly/chromium-test-list-format
-
-  Takes raw expectations data as a string read from the TA/DA expectation file
-  in the format:
-
-    # This is an example expectation file.
-    #
-    # tags: Mac Mac10.10 Mac10.11
-    # tags: Win Win8
-
-    crbug.com/123 [ Win ] benchmark/story [ Skip ]
-    ...
-  """
-
-  TAG_TOKEN = '# tags:'
-  _MATCH_STRING = r'^(?:(crbug.com/\d+) )?'  # The bug field (optional).
-  _MATCH_STRING += r'(?:\[ (.+) \] )?' # The label field (optional).
-  _MATCH_STRING += r'(\S+) ' # The test path field.
-  _MATCH_STRING += r'\[ ([^\[.]+) \]'  # The expectation field.
-  _MATCH_STRING += r'(\s+#.*)?$' # End comment (optional).
-  MATCHER = re.compile(_MATCH_STRING)
-
-  def __init__(self, raw_data):
-    self._tags = []
-    self._expectations = []
-    self._ParseRawExpectationData(raw_data)
-
-  def _ParseRawExpectationData(self, raw_data):
-    for count, line in list(enumerate(raw_data.splitlines(), start=1)):
-      # Handle metadata and comments.
-      if line.startswith(self.TAG_TOKEN):
-        for word in line[len(self.TAG_TOKEN):].split():
-          # Expectations must be after all tags are declared.
-          if self._expectations:
-            raise ParseError('Tag found after first expectation.')
-          self._tags.append(word)
-      elif line.startswith('#') or not line:
-        continue  # Ignore, it is just a comment or empty.
-      else:
-        self._expectations.append(
-            self._ParseExpectationLine(count, line, self._tags))
-
-  def _ParseExpectationLine(self, line_number, line, tags):
-    match = self.MATCHER.match(line)
-    if not match:
-      raise ParseError(
-          'Expectation has invalid syntax on line %d: %s'
-          % (line_number, line))
-    # Unused group is optional trailing comment.
-    reason, raw_conditions, test, results, _ = match.groups()
-    conditions = [c for c in raw_conditions.split()] if raw_conditions else []
-
-    for c in conditions:
-      if c not in tags:
-        raise ParseError(
-            'Condition %s not found in expectations tag data. Line %d'
-            % (c, line_number))
-    return Expectation(reason, test, conditions, [r for r in results.split()])
-
-  @property
-  def expectations(self):
-    return self._expectations
-
-  @property
-  def tags(self):
-    return self._tags
diff --git a/systrace/catapult/common/py_utils/py_utils/expectations_parser_unittest.py b/systrace/catapult/common/py_utils/py_utils/expectations_parser_unittest.py
deleted file mode 100644
index 82debc5..0000000
--- a/systrace/catapult/common/py_utils/py_utils/expectations_parser_unittest.py
+++ /dev/null
@@ -1,171 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import unittest
-
-from six.moves import range # pylint: disable=redefined-builtin
-
-from py_utils import expectations_parser
-
-
-class TestExpectationParserTest(unittest.TestCase):
-
-  def testInitWithGoodData(self):
-    good_data = """
-# This is a test expectation file.
-#
-# tags: tag1 tag2 tag3
-# tags: tag4 Mac Win Debug
-
-crbug.com/12345 [ Mac ] b1/s1 [ Skip ]
-crbug.com/23456 [ Mac Debug ] b1/s2 [ Skip ]
-"""
-    parser = expectations_parser.TestExpectationParser(good_data)
-    tags = ['tag1', 'tag2', 'tag3', 'tag4', 'Mac', 'Win', 'Debug']
-    self.assertEqual(parser.tags, tags)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            'crbug.com/12345', 'b1/s1', ['Mac'], ['Skip']),
-        expectations_parser.Expectation(
-            'crbug.com/23456', 'b1/s2', ['Mac', 'Debug'], ['Skip'])
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
-
-  def testInitWithBadData(self):
-    bad_data = """
-# This is a test expectation file.
-#
-# tags: tag1 tag2 tag3
-# tags: tag4
-
-crbug.com/12345 [ Mac b1/s1 [ Skip ]
-"""
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(bad_data)
-
-  def testTagAfterExpectationsStart(self):
-    bad_data = """
-# This is a test expectation file.
-#
-# tags: tag1 tag2 tag3
-
-crbug.com/12345 [ tag1 ] b1/s1 [ Skip ]
-
-# tags: tag4
-"""
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(bad_data)
-
-  def testParseExpectationLineEverythingThere(self):
-    raw_data = '# tags: Mac\ncrbug.com/23456 [ Mac ] b1/s2 [ Skip ]'
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            'crbug.com/23456', 'b1/s2', ['Mac'], ['Skip'])
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
-
-  def testParseExpectationLineBadTag(self):
-    raw_data = '# tags: None\ncrbug.com/23456 [ Mac ] b1/s2 [ Skip ]'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineNoConditions(self):
-    raw_data = '# tags: All\ncrbug.com/12345 b1/s1 [ Skip ]'
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            'crbug.com/12345', 'b1/s1', [], ['Skip']),
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
-
-  def testParseExpectationLineNoBug(self):
-    raw_data = '# tags: All\n[ All ] b1/s1 [ Skip ]'
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            None, 'b1/s1', ['All'], ['Skip']),
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
-
-  def testParseExpectationLineNoBugNoConditions(self):
-    raw_data = '# tags: All\nb1/s1 [ Skip ]'
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            None, 'b1/s1', [], ['Skip']),
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
-
-  def testParseExpectationLineMultipleConditions(self):
-    raw_data = ('# tags:All None Batman\n'
-                'crbug.com/123 [ All None Batman ] b1/s1 [ Skip ]')
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            'crbug.com/123', 'b1/s1', ['All', 'None', 'Batman'], ['Skip']),
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
-
-  def testParseExpectationLineBadConditionBracket(self):
-    raw_data = '# tags: Mac\ncrbug.com/23456 ] Mac ] b1/s2 [ Skip ]'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineBadResultBracket(self):
-    raw_data = '# tags: Mac\ncrbug.com/23456 ] Mac ] b1/s2 ] Skip ]'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineBadConditionBracketSpacing(self):
-    raw_data = '# tags: Mac\ncrbug.com/2345 [Mac] b1/s1 [ Skip ]'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineBadResultBracketSpacing(self):
-    raw_data = '# tags: Mac\ncrbug.com/2345 [ Mac ] b1/s1 [Skip]'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineNoClosingConditionBracket(self):
-    raw_data = '# tags: Mac\ncrbug.com/2345 [ Mac b1/s1 [ Skip ]'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineNoClosingResultBracket(self):
-    raw_data = '# tags: Mac\ncrbug.com/2345 [ Mac ] b1/s1 [ Skip'
-    with self.assertRaises(expectations_parser.ParseError):
-      expectations_parser.TestExpectationParser(raw_data)
-
-  def testParseExpectationLineUrlInTestName(self):
-    raw_data = (
-        '# tags: Mac\ncrbug.com/123 [ Mac ] b.1/http://google.com [ Skip ]')
-    expected_outcomes = [
-        expectations_parser.Expectation(
-            'crbug.com/123', 'b.1/http://google.com', ['Mac'], ['Skip'])
-    ]
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcomes[i])
-
-  def testParseExpectationLineEndingComment(self):
-    raw_data = '# tags: Mac\ncrbug.com/23456 [ Mac ] b1/s2 [ Skip ] # abc 123'
-    parser = expectations_parser.TestExpectationParser(raw_data)
-    expected_outcome = [
-        expectations_parser.Expectation(
-            'crbug.com/23456', 'b1/s2', ['Mac'], ['Skip'])
-    ]
-    for i in range(len(parser.expectations)):
-      self.assertEqual(parser.expectations[i], expected_outcome[i])
diff --git a/systrace/catapult/common/py_utils/py_utils/file_util.py b/systrace/catapult/common/py_utils/py_utils/file_util.py
deleted file mode 100644
index b1602c9..0000000
--- a/systrace/catapult/common/py_utils/py_utils/file_util.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import errno
-import os
-import shutil
-
-
-def CopyFileWithIntermediateDirectories(source_path, dest_path):
-  """Copies a file and creates intermediate directories as needed.
-
-  Args:
-    source_path: Path to the source file.
-    dest_path: Path to the destination where the source file should be copied.
-  """
-  assert os.path.exists(source_path)
-  try:
-    os.makedirs(os.path.dirname(dest_path))
-  except OSError as e:
-    if e.errno != errno.EEXIST:
-      raise
-  shutil.copy(source_path, dest_path)
diff --git a/systrace/catapult/common/py_utils/py_utils/file_util_unittest.py b/systrace/catapult/common/py_utils/py_utils/file_util_unittest.py
deleted file mode 100644
index 4bb19a1..0000000
--- a/systrace/catapult/common/py_utils/py_utils/file_util_unittest.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import errno
-import os
-import shutil
-import tempfile
-import unittest
-
-from py_utils import file_util
-
-
-class FileUtilTest(unittest.TestCase):
-
-  def setUp(self):
-    self._tempdir = tempfile.mkdtemp()
-
-  def tearDown(self):
-    shutil.rmtree(self._tempdir)
-
-  def testCopySimple(self):
-    source_path = os.path.join(self._tempdir, 'source')
-    with open(source_path, 'w') as f:
-      f.write('data')
-
-    dest_path = os.path.join(self._tempdir, 'dest')
-
-    self.assertFalse(os.path.exists(dest_path))
-    file_util.CopyFileWithIntermediateDirectories(source_path, dest_path)
-    self.assertTrue(os.path.exists(dest_path))
-    self.assertEqual('data', open(dest_path, 'r').read())
-
-  def testCopyMakeDirectories(self):
-    source_path = os.path.join(self._tempdir, 'source')
-    with open(source_path, 'w') as f:
-      f.write('data')
-
-    dest_path = os.path.join(self._tempdir, 'path', 'to', 'dest')
-
-    self.assertFalse(os.path.exists(dest_path))
-    file_util.CopyFileWithIntermediateDirectories(source_path, dest_path)
-    self.assertTrue(os.path.exists(dest_path))
-    self.assertEqual('data', open(dest_path, 'r').read())
-
-  def testCopyOverwrites(self):
-    source_path = os.path.join(self._tempdir, 'source')
-    with open(source_path, 'w') as f:
-      f.write('source_data')
-
-    dest_path = os.path.join(self._tempdir, 'dest')
-    with open(dest_path, 'w') as f:
-      f.write('existing_data')
-
-    file_util.CopyFileWithIntermediateDirectories(source_path, dest_path)
-    self.assertEqual('source_data', open(dest_path, 'r').read())
-
-  def testRaisesError(self):
-    source_path = os.path.join(self._tempdir, 'source')
-    with open(source_path, 'w') as f:
-      f.write('data')
-
-    dest_path = ""
-    with self.assertRaises(OSError) as cm:
-      file_util.CopyFileWithIntermediateDirectories(source_path, dest_path)
-      self.assertEqual(errno.ENOENT, cm.exception.error_code)
diff --git a/systrace/catapult/common/py_utils/py_utils/lock.py b/systrace/catapult/common/py_utils/py_utils/lock.py
deleted file mode 100644
index ade4d1f..0000000
--- a/systrace/catapult/common/py_utils/py_utils/lock.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-
-LOCK_EX = None  # Exclusive lock
-LOCK_SH = None  # Shared lock
-LOCK_NB = None  # Non-blocking (LockException is raised if resource is locked)
-
-
-class LockException(Exception):
-  pass
-
-
-# pylint: disable=import-error
-# pylint: disable=wrong-import-position
-if os.name == 'nt':
-  import win32con
-  import win32file
-  import pywintypes
-  LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
-  LOCK_SH = 0  # the default
-  LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
-  _OVERLAPPED = pywintypes.OVERLAPPED()
-elif os.name == 'posix':
-  import fcntl
-  LOCK_EX = fcntl.LOCK_EX
-  LOCK_SH = fcntl.LOCK_SH
-  LOCK_NB = fcntl.LOCK_NB
-# pylint: enable=import-error
-# pylint: enable=wrong-import-position
-
-
-@contextlib.contextmanager
-def FileLock(target_file, flags):
-  """ Lock the target file. Similar to AcquireFileLock but allow user to write:
-        with FileLock(f, LOCK_EX):
-           ...do stuff on file f without worrying about race condition
-    Args: see AcquireFileLock's documentation.
-  """
-  AcquireFileLock(target_file, flags)
-  try:
-    yield
-  finally:
-    ReleaseFileLock(target_file)
-
-
-def AcquireFileLock(target_file, flags):
-  """ Lock the target file. Note that if |target_file| is closed, the lock is
-    automatically released.
-  Args:
-    target_file: file handle of the file to acquire lock.
-    flags: can be any of the type LOCK_EX, LOCK_SH, LOCK_NB, or a bitwise
-      OR combination of flags.
-  """
-  assert flags in (
-      LOCK_EX, LOCK_SH, LOCK_NB, LOCK_EX | LOCK_NB, LOCK_SH | LOCK_NB)
-  if os.name == 'nt':
-    _LockImplWin(target_file, flags)
-  elif os.name == 'posix':
-    _LockImplPosix(target_file, flags)
-  else:
-    raise NotImplementedError('%s is not supported' % os.name)
-
-
-def ReleaseFileLock(target_file):
-  """ Unlock the target file.
-  Args:
-    target_file: file handle of the file to release the lock.
-  """
-  if os.name == 'nt':
-    _UnlockImplWin(target_file)
-  elif os.name == 'posix':
-    _UnlockImplPosix(target_file)
-  else:
-    raise NotImplementedError('%s is not supported' % os.name)
-
-# These implementations are based on
-# http://code.activestate.com/recipes/65203/
-
-def _LockImplWin(target_file, flags):
-  hfile = win32file._get_osfhandle(target_file.fileno())
-  try:
-    win32file.LockFileEx(hfile, flags, 0, -0x10000, _OVERLAPPED)
-  except pywintypes.error as exc_value:
-    if exc_value[0] == 33:
-      raise LockException('Error trying acquiring lock of %s: %s' %
-                          (target_file.name, exc_value[2]))
-    else:
-      raise
-
-
-def _UnlockImplWin(target_file):
-  hfile = win32file._get_osfhandle(target_file.fileno())
-  try:
-    win32file.UnlockFileEx(hfile, 0, -0x10000, _OVERLAPPED)
-  except pywintypes.error as exc_value:
-    if exc_value[0] == 158:
-      # error: (158, 'UnlockFileEx', 'The segment is already unlocked.')
-      # To match the 'posix' implementation, silently ignore this error
-      pass
-    else:
-      # Q:  Are there exceptions/codes we should be dealing with here?
-      raise
-
-
-def _LockImplPosix(target_file, flags):
-  try:
-    fcntl.flock(target_file.fileno(), flags)
-  except IOError as exc_value:
-    if exc_value[0] == 11 or exc_value[0] == 35:
-      raise LockException('Error trying acquiring lock of %s: %s' %
-                          (target_file.name, exc_value[1]))
-    else:
-      raise
-
-
-def _UnlockImplPosix(target_file):
-  fcntl.flock(target_file.fileno(), fcntl.LOCK_UN)
diff --git a/systrace/catapult/common/py_utils/py_utils/lock_unittest.py b/systrace/catapult/common/py_utils/py_utils/lock_unittest.py
deleted file mode 100644
index 2ba288b..0000000
--- a/systrace/catapult/common/py_utils/py_utils/lock_unittest.py
+++ /dev/null
@@ -1,170 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import multiprocessing
-import os
-import tempfile
-import time
-import unittest
-
-from six.moves import range  # pylint: disable=redefined-builtin
-
-from py_utils import lock
-
-
-def _AppendTextToFile(file_name):
-  with open(file_name, 'a') as f:
-    lock.AcquireFileLock(f, lock.LOCK_EX)
-    # Sleep 100 ms to increase the chance of another process trying to acquire
-    # the lock of file as the same time.
-    time.sleep(0.1)
-    f.write('Start')
-    for _ in range(10000):
-      f.write('*')
-    f.write('End')
-
-
-def _ReadFileWithSharedLockBlockingThenWrite(read_file, write_file):
-  with open(read_file, 'r') as f:
-    lock.AcquireFileLock(f, lock.LOCK_SH)
-    content = f.read()
-    with open(write_file, 'a') as f2:
-      lock.AcquireFileLock(f2, lock.LOCK_EX)
-      f2.write(content)
-
-
-def _ReadFileWithExclusiveLockNonBlocking(target_file, status_file):
-  with open(target_file, 'r') as f:
-    try:
-      lock.AcquireFileLock(f, lock.LOCK_EX | lock.LOCK_NB)
-      with open(status_file, 'w') as f2:
-        f2.write('LockException was not raised')
-    except lock.LockException:
-      with open(status_file, 'w') as f2:
-        f2.write('LockException raised')
-
-
-class FileLockTest(unittest.TestCase):
-  def setUp(self):
-    tf = tempfile.NamedTemporaryFile(delete=False)
-    tf.close()
-    self.temp_file_path = tf.name
-
-  def tearDown(self):
-    os.remove(self.temp_file_path)
-
-  def testExclusiveLock(self):
-    processess = []
-    for _ in range(10):
-      p = multiprocessing.Process(
-          target=_AppendTextToFile, args=(self.temp_file_path,))
-      p.start()
-      processess.append(p)
-    for p in processess:
-      p.join()
-
-    # If the file lock works as expected, there should be 10 atomic writes of
-    # 'Start***...***End' to the file in some order, which lead to the final
-    # file content as below.
-    expected_file_content = ''.join((['Start'] + ['*']*10000 + ['End']) * 10)
-    with open(self.temp_file_path, 'r') as f:
-      # Use assertTrue instead of assertEquals since the strings are big, hence
-      # assertEquals's assertion failure will contain huge strings.
-      self.assertTrue(expected_file_content == f.read())
-
-  def testSharedLock(self):
-    tf = tempfile.NamedTemporaryFile(delete=False)
-    tf.close()
-    temp_write_file = tf.name
-    try:
-      with open(self.temp_file_path, 'w') as f:
-        f.write('0123456789')
-      with open(self.temp_file_path, 'r') as f:
-        # First, acquire a shared lock on temp_file_path
-        lock.AcquireFileLock(f, lock.LOCK_SH)
-
-        processess = []
-        # Create 10 processes that also try to acquire shared lock from
-        # temp_file_path then append temp_file_path's content to temp_write_file
-        for _ in range(10):
-          p = multiprocessing.Process(
-              target=_ReadFileWithSharedLockBlockingThenWrite,
-              args=(self.temp_file_path, temp_write_file))
-          p.start()
-          processess.append(p)
-        for p in processess:
-          p.join()
-
-      # temp_write_file should contains 10 copy of temp_file_path's content.
-      with open(temp_write_file, 'r') as f:
-        self.assertEquals('0123456789'*10, f.read())
-    finally:
-      os.remove(temp_write_file)
-
-  def testNonBlockingLockAcquiring(self):
-    tf = tempfile.NamedTemporaryFile(delete=False)
-    tf.close()
-    temp_status_file = tf.name
-    try:
-      with open(self.temp_file_path, 'w') as f:
-        lock.AcquireFileLock(f, lock.LOCK_EX)
-        p = multiprocessing.Process(
-            target=_ReadFileWithExclusiveLockNonBlocking,
-            args=(self.temp_file_path, temp_status_file))
-        p.start()
-        p.join()
-      with open(temp_status_file, 'r') as f:
-        self.assertEquals('LockException raised', f.read())
-    finally:
-      os.remove(temp_status_file)
-
-  def testUnlockBeforeClosingFile(self):
-    tf = tempfile.NamedTemporaryFile(delete=False)
-    tf.close()
-    temp_status_file = tf.name
-    try:
-      with open(self.temp_file_path, 'r') as f:
-        lock.AcquireFileLock(f, lock.LOCK_SH)
-        lock.ReleaseFileLock(f)
-        p = multiprocessing.Process(
-            target=_ReadFileWithExclusiveLockNonBlocking,
-            args=(self.temp_file_path, temp_status_file))
-        p.start()
-        p.join()
-      with open(temp_status_file, 'r') as f:
-        self.assertEquals('LockException was not raised', f.read())
-    finally:
-      os.remove(temp_status_file)
-
-  def testContextualLock(self):
-    tf = tempfile.NamedTemporaryFile(delete=False)
-    tf.close()
-    temp_status_file = tf.name
-    try:
-      with open(self.temp_file_path, 'r') as f:
-        with lock.FileLock(f, lock.LOCK_EX):
-          # Within this block, accessing self.temp_file_path from another
-          # process should raise exception.
-          p = multiprocessing.Process(
-              target=_ReadFileWithExclusiveLockNonBlocking,
-              args=(self.temp_file_path, temp_status_file))
-          p.start()
-          p.join()
-          with open(temp_status_file, 'r') as f:
-            self.assertEquals('LockException raised', f.read())
-
-        # Accessing self.temp_file_path here should not raise exception.
-        p = multiprocessing.Process(
-            target=_ReadFileWithExclusiveLockNonBlocking,
-            args=(self.temp_file_path, temp_status_file))
-        p.start()
-        p.join()
-      with open(temp_status_file, 'r') as f:
-        self.assertEquals('LockException was not raised', f.read())
-    finally:
-      os.remove(temp_status_file)
diff --git a/systrace/catapult/common/py_utils/py_utils/logging_util.py b/systrace/catapult/common/py_utils/py_utils/logging_util.py
deleted file mode 100644
index 4357851..0000000
--- a/systrace/catapult/common/py_utils/py_utils/logging_util.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Logging util functions.
-
-It would be named logging, but other modules in this directory use the default
-logging module, so that would break them.
-"""
-
-import contextlib
-import logging
-
-@contextlib.contextmanager
-def CaptureLogs(file_stream):
-  if not file_stream:
-    # No file stream given, just don't capture logs.
-    yield
-    return
-
-  fh = logging.StreamHandler(file_stream)
-
-  logger = logging.getLogger()
-  # Try to copy the current log format, if one is set.
-  if logger.handlers and hasattr(logger.handlers[0], 'formatter'):
-    fh.formatter = logger.handlers[0].formatter
-  else:
-    fh.setFormatter(logging.Formatter(
-        '(%(levelname)s) %(asctime)s %(message)s'))
-  logger.addHandler(fh)
-
-  try:
-    yield
-  finally:
-    logger = logging.getLogger()
-    logger.removeHandler(fh)
diff --git a/systrace/catapult/common/py_utils/py_utils/logging_util_unittest.py b/systrace/catapult/common/py_utils/py_utils/logging_util_unittest.py
deleted file mode 100644
index eb26098..0000000
--- a/systrace/catapult/common/py_utils/py_utils/logging_util_unittest.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import logging
-import unittest
-
-try:
-  from six import StringIO
-except ImportError:
-  from io import StringIO
-
-from py_utils import logging_util
-
-
-class LoggingUtilTest(unittest.TestCase):
-  def testCapture(self):
-    s = StringIO()
-    with logging_util.CaptureLogs(s):
-      logging.fatal('test')
-
-    # Only assert ends with, since the logging message by default has the date
-    # in it.
-    self.assertTrue(s.getvalue().endswith('test\n'))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/common/py_utils/py_utils/memory_debug.py b/systrace/catapult/common/py_utils/py_utils/memory_debug.py
deleted file mode 100755
index 26f10ae..0000000
--- a/systrace/catapult/common/py_utils/py_utils/memory_debug.py
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import heapq
-import logging
-import os
-import sys
-try:
-  import psutil
-except ImportError:
-  psutil = None
-
-
-BYTE_UNITS = ['B', 'KiB', 'MiB', 'GiB']
-
-
-def FormatBytes(value):
-  def GetValueAndUnit(value):
-    for unit in BYTE_UNITS[:-1]:
-      if abs(value) < 1024.0:
-        return value, unit
-      value /= 1024.0
-    return value, BYTE_UNITS[-1]
-
-  if value is not None:
-    return '%.1f %s' % GetValueAndUnit(value)
-  else:
-    return 'N/A'
-
-
-def _GetProcessInfo(p):
-  pinfo = p.as_dict(attrs=['pid', 'name', 'memory_info'])
-  pinfo['mem_rss'] = getattr(pinfo['memory_info'], 'rss', 0)
-  return pinfo
-
-
-def _LogProcessInfo(pinfo, level):
-  pinfo['mem_rss_fmt'] = FormatBytes(pinfo['mem_rss'])
-  logging.log(level, '%(mem_rss_fmt)s (pid=%(pid)s)', pinfo)
-
-
-def LogHostMemoryUsage(top_n=10, level=logging.INFO):
-  if not psutil:
-    logging.warning('psutil module is not found, skipping logging memory info')
-    return
-  if psutil.version_info < (2, 0):
-    logging.warning('psutil %s too old, upgrade to version 2.0 or higher'
-                    ' for memory usage information.', psutil.__version__)
-    return
-
-  # TODO(crbug.com/777865): Remove the following pylint disable. Even if we
-  # check for a recent enough psutil version above, the catapult presubmit
-  # builder (still running some old psutil) fails pylint checks due to API
-  # changes in psutil.
-  # pylint: disable=no-member
-  mem = psutil.virtual_memory()
-  logging.log(level, 'Used %s out of %s memory available.',
-              FormatBytes(mem.used), FormatBytes(mem.total))
-  logging.log(level, 'Memory usage of top %i processes groups', top_n)
-  pinfos_by_names = {}
-  for p in psutil.process_iter():
-    try:
-      pinfo = _GetProcessInfo(p)
-    except psutil.NoSuchProcess:
-      logging.exception('process %s no longer exists', p)
-      continue
-    pname = pinfo['name']
-    if pname not in pinfos_by_names:
-      pinfos_by_names[pname] = {'name': pname, 'total_mem_rss': 0, 'pids': []}
-    pinfos_by_names[pname]['total_mem_rss'] += pinfo['mem_rss']
-    pinfos_by_names[pname]['pids'].append(str(pinfo['pid']))
-
-  sorted_pinfo_groups = heapq.nlargest(
-      top_n,
-      list(pinfos_by_names.values()),
-      key=lambda item: item['total_mem_rss'])
-  for group in sorted_pinfo_groups:
-    group['total_mem_rss_fmt'] = FormatBytes(group['total_mem_rss'])
-    group['pids_fmt'] = ', '.join(group['pids'])
-    logging.log(
-        level, '- %(name)s - %(total_mem_rss_fmt)s - pids: %(pids)s', group)
-  logging.log(level, 'Current process:')
-  pinfo = _GetProcessInfo(psutil.Process(os.getpid()))
-  _LogProcessInfo(pinfo, level)
-
-
-def main():
-  logging.basicConfig(level=logging.INFO)
-  LogHostMemoryUsage()
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/common/py_utils/py_utils/modules_util.py b/systrace/catapult/common/py_utils/py_utils/modules_util.py
deleted file mode 100644
index 6c1106d..0000000
--- a/systrace/catapult/common/py_utils/py_utils/modules_util.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-from distutils import version  # pylint: disable=no-name-in-module
-
-
-def RequireVersion(module, min_version, max_version=None):
-  """Ensure that an imported module's version is within a required range.
-
-  Version strings are parsed with LooseVersion, so versions like "1.8.0rc1"
-  (default numpy on macOS Sierra) and "2.4.13.2" (a version of OpenCV 2.x)
-  are allowed.
-
-  Args:
-    module: An already imported python module.
-    min_version: The module must have this or a higher version.
-    max_version: Optional, the module should not have this or a higher version.
-
-  Raises:
-    ImportError if the module's __version__ is not within the allowed range.
-  """
-  module_version = version.LooseVersion(module.__version__)
-  min_version = version.LooseVersion(str(min_version))
-  valid_version = min_version <= module_version
-
-  if max_version is not None:
-    max_version = version.LooseVersion(str(max_version))
-    valid_version = valid_version and (module_version < max_version)
-    wants_version = 'at or above %s and below %s' % (min_version, max_version)
-  else:
-    wants_version = '%s or higher' % min_version
-
-  if not valid_version:
-    raise ImportError('%s has version %s, but version %s is required' % (
-        module.__name__, module_version, wants_version))
diff --git a/systrace/catapult/common/py_utils/py_utils/modules_util_unittest.py b/systrace/catapult/common/py_utils/py_utils/modules_util_unittest.py
deleted file mode 100644
index aa05674..0000000
--- a/systrace/catapult/common/py_utils/py_utils/modules_util_unittest.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import unittest
-
-from py_utils import modules_util
-
-
-class FakeModule(object):
-  def __init__(self, name, version):
-    self.__name__ = name
-    self.__version__ = version
-
-
-class ModulesUitlTest(unittest.TestCase):
-  def testRequireVersion_valid(self):
-    numpy = FakeModule('numpy', '2.3')
-    try:
-      modules_util.RequireVersion(numpy, '1.0')
-    except ImportError:
-      self.fail('ImportError raised unexpectedly')
-
-  def testRequireVersion_versionTooLow(self):
-    numpy = FakeModule('numpy', '2.3')
-    with self.assertRaises(ImportError) as error:
-      modules_util.RequireVersion(numpy, '2.5')
-    self.assertEqual(
-        str(error.exception),
-        'numpy has version 2.3, but version 2.5 or higher is required')
-
-  def testRequireVersion_versionTooHigh(self):
-    numpy = FakeModule('numpy', '2.3')
-    with self.assertRaises(ImportError) as error:
-      modules_util.RequireVersion(numpy, '1.0', '2.0')
-    self.assertEqual(
-        str(error.exception), 'numpy has version 2.3, but version'
-        ' at or above 1.0 and below 2.0 is required')
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py b/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py
deleted file mode 100644
index 588a5d5..0000000
--- a/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import os
-import sys
-import unittest
-
-import py_utils
-
-
-class PathTest(unittest.TestCase):
-
-  def testIsExecutable(self):
-    self.assertFalse(py_utils.IsExecutable('nonexistent_file'))
-    # We use actual files on disk instead of pyfakefs because the executable is
-    # set different on win that posix platforms and pyfakefs doesn't support
-    # win platform well.
-    self.assertFalse(py_utils.IsExecutable(_GetFileInTestDir('foo.txt')))
-    self.assertTrue(py_utils.IsExecutable(sys.executable))
-
-
-def _GetFileInTestDir(file_name):
-  return os.path.join(os.path.dirname(__file__), 'test_data', file_name)
-
-
-class WaitForTest(unittest.TestCase):
-
-  def testWaitForTrue(self):
-    def ReturnTrue():
-      return True
-    self.assertTrue(py_utils.WaitFor(ReturnTrue, .1))
-
-  def testWaitForFalse(self):
-    def ReturnFalse():
-      return False
-
-    with self.assertRaises(py_utils.TimeoutException):
-      py_utils.WaitFor(ReturnFalse, .1)
-
-  def testWaitForEventuallyTrue(self):
-    # Use list to pass to inner function in order to allow modifying the
-    # variable from the outer scope.
-    c = [0]
-    def ReturnCounterBasedValue():
-      c[0] += 1
-      return c[0] > 2
-
-    self.assertTrue(py_utils.WaitFor(ReturnCounterBasedValue, .5))
-
-  def testWaitForTrueLambda(self):
-    self.assertTrue(py_utils.WaitFor(lambda: True, .1))
-
-  def testWaitForFalseLambda(self):
-    with self.assertRaises(py_utils.TimeoutException):
-      py_utils.WaitFor(lambda: False, .1)
-
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py b/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py
deleted file mode 100644
index 938ff68..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Style-preserving Python code transforms.
-
-This module provides components for modifying and querying Python code. They can
-be used to build custom refactorings and linters.
-"""
-
-import functools
-import multiprocessing
-
-# pylint: disable=wildcard-import
-from py_utils.refactor.annotated_symbol import *  # pylint: disable=redefined-builtin
-from py_utils.refactor.module import Module
-
-
-def _TransformFile(transform, file_path):
-  module = Module(file_path)
-  result = transform(module)
-  module.Write()
-  return result
-
-
-def Transform(transform, file_paths):
-  transform = functools.partial(_TransformFile, transform)
-  return multiprocessing.Pool().map(transform, file_paths)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py b/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
deleted file mode 100644
index 1bed84b..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=wildcard-import
-from py_utils.refactor.annotated_symbol.class_definition import *
-from py_utils.refactor.annotated_symbol.function_definition import *
-from py_utils.refactor.annotated_symbol.import_statement import *
-from py_utils.refactor.annotated_symbol.reference import *  # pylint: disable=redefined-builtin
-from py_utils.refactor import snippet
-
-
-__all__ = [
-    'Annotate',
-
-    'Class',
-    'Function',
-    'Import',
-    'Reference',
-]
-
-
-# Specific symbol types with extra methods for manipulating them.
-# Python's full grammar is here:
-# https://docs.python.org/2/reference/grammar.html
-
-# Annotated Symbols have an Annotate classmethod that takes a symbol type and
-# list of children, and returns an instance of that annotated Symbol.
-
-ANNOTATED_SYMBOLS = (
-    AsName,
-    Class,
-    DottedName,
-    ImportFrom,
-    ImportName,
-    Function,
-)
-
-
-# Unfortunately, some logical groupings are not represented by a node in the
-# parse tree. To work around this, some annotated Symbols have an Annotate
-# classmethod that takes and returns a list of Snippets instead.
-
-ANNOTATED_GROUPINGS = (
-    Reference,
-)
-
-
-def Annotate(f):
-  """Return the syntax tree of the given file."""
-  return _AnnotateNode(snippet.Snippetize(f))
-
-
-def _AnnotateNode(node):
-  if not isinstance(node, snippet.Symbol):
-    return node
-
-  children = [_AnnotateNode(c) for c in node.children]
-
-  for symbol_type in ANNOTATED_GROUPINGS:
-    annotated_grouping = symbol_type.Annotate(children)
-    if annotated_grouping:
-      children = annotated_grouping
-      break
-
-  for symbol_type in ANNOTATED_SYMBOLS:
-    annotated_symbol = symbol_type.Annotate(node.type, children)
-    if annotated_symbol:
-      return annotated_symbol
-
-  return snippet.Symbol(node.type, children)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py b/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
deleted file mode 100644
index bdaec61..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-from six.moves import range # pylint: disable=redefined-builtin
-
-from py_utils.refactor import snippet
-
-
-class AnnotatedSymbol(snippet.Symbol):
-  def __init__(self, symbol_type, children):
-    super(AnnotatedSymbol, self).__init__(symbol_type, children)
-    self._modified = False
-
-  @property
-  def modified(self):
-    if self._modified:
-      return True
-    return super(AnnotatedSymbol, self).modified
-
-  def __setattr__(self, name, value):
-    if (hasattr(self.__class__, name) and
-        isinstance(getattr(self.__class__, name), property)):
-      self._modified = True
-    return super(AnnotatedSymbol, self).__setattr__(name, value)
-
-  def Cut(self, child):
-    for i in range(len(self._children)):
-      if self._children[i] == child:
-        self._modified = True
-        del self._children[i]
-        break
-    else:
-      raise ValueError('%s is not in %s.' % (child, self))
-
-  def Paste(self, child):
-    self._modified = True
-    self._children.append(child)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py b/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
deleted file mode 100644
index a83ac96..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import symbol
-
-from py_utils.refactor.annotated_symbol import base_symbol
-
-
-__all__ = [
-    'Class',
-]
-
-
-class Class(base_symbol.AnnotatedSymbol):
-  @classmethod
-  def Annotate(cls, symbol_type, children):
-    if symbol_type != symbol.stmt:
-      return None
-
-    compound_statement = children[0]
-    if compound_statement.type != symbol.compound_stmt:
-      return None
-
-    statement = compound_statement.children[0]
-    if statement.type == symbol.classdef:
-      return cls(statement.type, statement.children)
-    elif (statement.type == symbol.decorated and
-          statement.children[-1].type == symbol.classdef):
-      return cls(statement.type, statement.children)
-    else:
-      return None
-
-  @property
-  def suite(self):
-    # TODO: Complete.
-    raise NotImplementedError()
-
-  def FindChild(self, snippet_type, **kwargs):
-    return self.suite.FindChild(snippet_type, **kwargs)
-
-  def FindChildren(self, snippet_type):
-    return self.suite.FindChildren(snippet_type)
-
-  def Cut(self, child):
-    self.suite.Cut(child)
-
-  def Paste(self, child):
-    self.suite.Paste(child)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py b/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
deleted file mode 100644
index 384d3cf..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import symbol
-
-from py_utils.refactor.annotated_symbol import base_symbol
-
-
-__all__ = [
-    'Function',
-]
-
-
-class Function(base_symbol.AnnotatedSymbol):
-  @classmethod
-  def Annotate(cls, symbol_type, children):
-    if symbol_type != symbol.stmt:
-      return None
-
-    compound_statement = children[0]
-    if compound_statement.type != symbol.compound_stmt:
-      return None
-
-    statement = compound_statement.children[0]
-    if statement.type == symbol.funcdef:
-      return cls(statement.type, statement.children)
-    elif (statement.type == symbol.decorated and
-          statement.children[-1].type == symbol.funcdef):
-      return cls(statement.type, statement.children)
-    else:
-      return None
-
-  @property
-  def suite(self):
-    # TODO: Complete.
-    raise NotImplementedError()
-
-  def FindChild(self, snippet_type, **kwargs):
-    return self.suite.FindChild(snippet_type, **kwargs)
-
-  def FindChildren(self, snippet_type):
-    return self.suite.FindChildren(snippet_type)
-
-  def Cut(self, child):
-    self.suite.Cut(child)
-
-  def Paste(self, child):
-    self.suite.Paste(child)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py b/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
deleted file mode 100644
index 54a3935..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
+++ /dev/null
@@ -1,331 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import keyword
-import symbol
-import token
-
-from six.moves import zip_longest  # pylint: disable=redefined-builtin
-
-from py_utils.refactor import snippet
-from py_utils.refactor.annotated_symbol import base_symbol
-
-
-__all__ = [
-    'AsName',
-    'DottedName',
-    'Import',
-    'ImportFrom',
-    'ImportName',
-]
-
-
-class DottedName(base_symbol.AnnotatedSymbol):
-  @classmethod
-  def Annotate(cls, symbol_type, children):
-    if symbol_type != symbol.dotted_name:
-      return None
-    return cls(symbol_type, children)
-
-  @property
-  def value(self):
-    return ''.join(token_snippet.value for token_snippet in self._children)
-
-  @value.setter
-  def value(self, value):
-    value_parts = value.split('.')
-    for value_part in value_parts:
-      if keyword.iskeyword(value_part):
-        raise ValueError('%s is a reserved keyword.' % value_part)
-
-    # If we have too many children, cut the list down to size.
-    # pylint: disable=attribute-defined-outside-init
-    self._children = self._children[:len(value_parts)*2-1]
-
-    # Update child nodes.
-    for child, value_part in zip_longest(self._children[::2], value_parts):
-      if child:
-        # Modify existing children. This helps preserve comments and spaces.
-        child.value = value_part
-      else:
-        # Add children as needed.
-        self._children.append(snippet.TokenSnippet.Create(token.DOT, '.'))
-        self._children.append(
-            snippet.TokenSnippet.Create(token.NAME, value_part))
-
-
-class AsName(base_symbol.AnnotatedSymbol):
-  @classmethod
-  def Annotate(cls, symbol_type, children):
-    if (symbol_type != symbol.dotted_as_name and
-        symbol_type != symbol.import_as_name):
-      return None
-    return cls(symbol_type, children)
-
-  @property
-  def name(self):
-    return self.children[0].value
-
-  @name.setter
-  def name(self, value):
-    self.children[0].value = value
-
-  @property
-  def alias(self):
-    if len(self.children) < 3:
-      return None
-    return self.children[2].value
-
-  @alias.setter
-  def alias(self, value):
-    if keyword.iskeyword(value):
-      raise ValueError('%s is a reserved keyword.' % value)
-
-    if value:
-      # pylint: disable=access-member-before-definition
-      if len(self.children) < 3:
-        # If we currently have no alias, add one.
-        # pylint: disable=access-member-before-definition
-        self.children.append(
-            snippet.TokenSnippet.Create(token.NAME, 'as', (0, 1)))
-        # pylint: disable=access-member-before-definition
-        self.children.append(
-            snippet.TokenSnippet.Create(token.NAME, value, (0, 1)))
-      else:
-        # We already have an alias. Just update the value.
-        # pylint: disable=access-member-before-definition
-        self.children[2].value = value
-    else:
-      # Removing the alias. Strip the "as foo".
-      self.children = [self.children[0]] # pylint: disable=line-too-long, attribute-defined-outside-init
-
-
-class Import(base_symbol.AnnotatedSymbol):
-  """An import statement.
-
-  Example:
-    import a.b.c as d
-    from a.b import c as d
-
-  In these examples,
-    path == 'a.b.c'
-    alias == 'd'
-    root == 'a.b' (only for "from" imports)
-    module == 'c' (only for "from" imports)
-    name (read-only) == the name used by references to the module, which is the
-    alias if there is one, the full module path in "full" imports, and the
-    module name in "from" imports.
-  """
-  @property
-  def has_from(self):
-    """Returns True iff the import statment is of the form "from x import y"."""
-    raise NotImplementedError()
-
-  @property
-  def values(self):
-    raise NotImplementedError()
-
-  @property
-  def paths(self):
-    raise NotImplementedError()
-
-  @property
-  def aliases(self):
-    raise NotImplementedError()
-
-  @property
-  def path(self):
-    """The full dotted path of the module."""
-    raise NotImplementedError()
-
-  @path.setter
-  def path(self, value):
-    raise NotImplementedError()
-
-  @property
-  def alias(self):
-    """The alias, if the module is renamed with "as". None otherwise."""
-    raise NotImplementedError()
-
-  @alias.setter
-  def alias(self, value):
-    raise NotImplementedError()
-
-  @property
-  def name(self):
-    """The name used to reference this import's module."""
-    raise NotImplementedError()
-
-
-class ImportName(Import):
-  @classmethod
-  def Annotate(cls, symbol_type, children):
-    if symbol_type != symbol.import_stmt:
-      return None
-    if children[0].type != symbol.import_name:
-      return None
-    assert len(children) == 1
-    return cls(symbol_type, children[0].children)
-
-  @property
-  def has_from(self):
-    return False
-
-  @property
-  def values(self):
-    dotted_as_names = self.children[1]
-    return tuple((dotted_as_name.name, dotted_as_name.alias)
-                 for dotted_as_name in dotted_as_names.children[::2])
-
-  @property
-  def paths(self):
-    return tuple(path for path, _ in self.values)
-
-  @property
-  def aliases(self):
-    return tuple(alias for _, alias in self.values)
-
-  @property
-  def _dotted_as_name(self):
-    dotted_as_names = self.children[1]
-    if len(dotted_as_names.children) != 1:
-      raise NotImplementedError(
-          'This method only works if the statement has one import.')
-    return dotted_as_names.children[0]
-
-  @property
-  def path(self):
-    return self._dotted_as_name.name
-
-  @path.setter
-  def path(self, value):  # pylint: disable=arguments-differ
-    self._dotted_as_name.name = value
-
-  @property
-  def alias(self):
-    return self._dotted_as_name.alias
-
-  @alias.setter
-  def alias(self, value):  # pylint: disable=arguments-differ
-    self._dotted_as_name.alias = value
-
-  @property
-  def name(self):
-    if self.alias:
-      return self.alias
-    else:
-      return self.path
-
-
-class ImportFrom(Import):
-  @classmethod
-  def Annotate(cls, symbol_type, children):
-    if symbol_type != symbol.import_stmt:
-      return None
-    if children[0].type != symbol.import_from:
-      return None
-    assert len(children) == 1
-    return cls(symbol_type, children[0].children)
-
-  @property
-  def has_from(self):
-    return True
-
-  @property
-  def values(self):
-    try:
-      import_as_names = self.FindChild(symbol.import_as_names)
-    except ValueError:
-      return (('*', None),)
-
-    return tuple((import_as_name.name, import_as_name.alias)
-                 for import_as_name in import_as_names.children[::2])
-
-  @property
-  def paths(self):
-    module = self.module
-    return tuple('.'.join((module, name)) for name, _ in self.values)
-
-  @property
-  def aliases(self):
-    return tuple(alias for _, alias in self.values)
-
-  @property
-  def root(self):
-    return self.FindChild(symbol.dotted_name).value
-
-  @root.setter
-  def root(self, value):
-    self.FindChild(symbol.dotted_name).value = value
-
-  @property
-  def _import_as_name(self):
-    try:
-      import_as_names = self.FindChild(symbol.import_as_names)
-    except ValueError:
-      return None
-
-    if len(import_as_names.children) != 1:
-      raise NotImplementedError(
-          'This method only works if the statement has one import.')
-
-    return import_as_names.children[0]
-
-  @property
-  def module(self):
-    import_as_name = self._import_as_name
-    if import_as_name:
-      return import_as_name.name
-    else:
-      return '*'
-
-  @module.setter
-  def module(self, value):
-    if keyword.iskeyword(value):
-      raise ValueError('%s is a reserved keyword.' % value)
-
-    import_as_name = self._import_as_name
-    if value == '*':
-      # TODO: Implement this.
-      raise NotImplementedError()
-    else:
-      if import_as_name:
-        import_as_name.name = value
-      else:
-        # TODO: Implement this.
-        raise NotImplementedError()
-
-  @property
-  def path(self):
-    return '.'.join((self.root, self.module))
-
-  @path.setter
-  def path(self, value):  # pylint: disable=arguments-differ
-    self.root, _, self.module = value.rpartition('.')
-
-  @property
-  def alias(self):
-    import_as_name = self._import_as_name
-    if import_as_name:
-      return import_as_name.alias
-    else:
-      return None
-
-  @alias.setter
-  def alias(self, value):  # pylint: disable=arguments-differ
-    import_as_name = self._import_as_name
-    if not import_as_name:
-      raise NotImplementedError('Cannot change alias for "import *".')
-    import_as_name.alias = value
-
-  @property
-  def name(self):
-    if self.alias:
-      return self.alias
-    else:
-      return self.module
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py b/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
deleted file mode 100644
index 493176e..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import symbol
-import token
-
-from six.moves import range  # pylint: disable=redefined-builtin
-from six.moves import zip_longest  # pylint: disable=redefined-builtin
-
-from py_utils.refactor.annotated_symbol import base_symbol
-from py_utils.refactor import snippet
-
-
-__all__ = [
-    'Reference',
-]
-
-
-class Reference(base_symbol.AnnotatedSymbol):
-  @classmethod
-  def Annotate(cls, nodes):
-    if not nodes:
-      return None
-    if nodes[0].type != symbol.atom:
-      return None
-    if not nodes[0].children or nodes[0].children[0].type != token.NAME:
-      return None
-
-    for i in range(1, len(nodes)):
-      if not nodes:
-        break
-      if nodes[i].type != symbol.trailer:
-        break
-      if len(nodes[i].children) != 2:
-        break
-      if (nodes[i].children[0].type != token.DOT or
-          nodes[i].children[1].type != token.NAME):
-        break
-    else:
-      i = len(nodes)
-
-    return [cls(nodes[:i])] + nodes[i:]
-
-  def __init__(self, children):
-    super(Reference, self).__init__(-1, children)
-
-  @property
-  def type_name(self):
-    return 'attribute_reference'
-
-  @property
-  def value(self):
-    return ''.join(token_snippet.value
-                   for child in self.children
-                   for token_snippet in child.children)
-
-  @value.setter
-  def value(self, value):
-    value_parts = value.split('.')
-
-    # If we have too many children, cut the list down to size.
-    # pylint: disable=attribute-defined-outside-init
-    self._children = self._children[:len(value_parts)]
-
-    # Update child nodes.
-    for child, value_part in zip_longest(self._children, value_parts):
-      if child:
-        # Modify existing children. This helps preserve comments and spaces.
-        child.children[-1].value = value_part
-      else:
-        # Add children as needed.
-        token_snippets = [
-            snippet.TokenSnippet.Create(token.DOT, '.'),
-            snippet.TokenSnippet.Create(token.NAME, value_part),
-        ]
-        self._children.append(snippet.Symbol(symbol.trailer, token_snippets))
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/module.py b/systrace/catapult/common/py_utils/py_utils/refactor/module.py
deleted file mode 100644
index d6eae00..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/module.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from py_utils.refactor import annotated_symbol
-
-
-class Module(object):
-
-  def __init__(self, file_path):
-    self._file_path = file_path
-
-    with open(self._file_path, 'r') as f:
-      self._snippet = annotated_symbol.Annotate(f)
-
-  @property
-  def file_path(self):
-    return self._file_path
-
-  @property
-  def modified(self):
-    return self._snippet.modified
-
-  def FindAll(self, snippet_type):
-    return self._snippet.FindAll(snippet_type)
-
-  def FindChildren(self, snippet_type):
-    return self._snippet.FindChildren(snippet_type)
-
-  def Write(self):
-    """Write modifications to the file."""
-    if not self.modified:
-      return
-
-    # Stringify before opening the file for writing.
-    # If we fail, we won't truncate the file.
-    string = str(self._snippet)
-    with open(self._file_path, 'w') as f:
-      f.write(string)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py b/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py
deleted file mode 100644
index deca085..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# Lint as: python2, python3
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-import collections
-import itertools
-import token
-import tokenize
-from six.moves import zip # pylint: disable=redefined-builtin
-
-
-def _Pairwise(iterable):
-  """s -> (None, s0), (s0, s1), (s1, s2), (s2, s3), ..."""
-  a, b = itertools.tee(iterable)
-  a = itertools.chain((None,), a)
-  return zip(a, b)
-
-
-class OffsetToken(object):
-  """A Python token with a relative position.
-
-  A token is represented by a type defined in Python's token module, a string
-  representing the content, and an offset. Using relative positions makes it
-  easy to insert and remove tokens.
-  """
-
-  def __init__(self, token_type, string, offset):
-    self._type = token_type
-    self._string = string
-    self._offset = offset
-
-  @property
-  def type(self):
-    return self._type
-
-  @property
-  def type_name(self):
-    return token.tok_name[self._type]
-
-  @property
-  def string(self):
-    return self._string
-
-  @string.setter
-  def string(self, value):
-    self._string = value
-
-  @property
-  def offset(self):
-    return self._offset
-
-  def __str__(self):
-    return str((self.type_name, self.string, self.offset))
-
-
-def Tokenize(f):
-  """Read tokens from a file-like object.
-
-  Args:
-    f: Any object that has a readline method.
-
-  Returns:
-    A collections.deque containing OffsetTokens. Deques are cheaper and easier
-    to manipulate sequentially than lists.
-  """
-  f.seek(0)
-  tokenize_tokens = tokenize.generate_tokens(f.readline)
-
-  offset_tokens = collections.deque()
-  for prev_token, next_token in _Pairwise(tokenize_tokens):
-    token_type, string, (srow, scol), _, _ = next_token
-    if not prev_token:
-      offset_tokens.append(OffsetToken(token_type, string, (0, 0)))
-    else:
-      erow, ecol = prev_token[3]
-      if erow == srow:
-        offset_tokens.append(OffsetToken(token_type, string, (0, scol - ecol)))
-      else:
-        offset_tokens.append(OffsetToken(
-            token_type, string, (srow - erow, scol)))
-
-  return offset_tokens
-
-
-def Untokenize(offset_tokens):
-  """Return the string representation of an iterable of OffsetTokens."""
-  # Make a copy. Don't modify the original.
-  offset_tokens = collections.deque(offset_tokens)
-
-  # Strip leading NL tokens.
-  while offset_tokens[0].type == tokenize.NL:
-    offset_tokens.popleft()
-
-  # Strip leading vertical whitespace.
-  first_token = offset_tokens.popleft()
-  # Take care not to modify the existing token. Create a new one in its place.
-  first_token = OffsetToken(first_token.type, first_token.string,
-                            (0, first_token.offset[1]))
-  offset_tokens.appendleft(first_token)
-
-  # Convert OffsetTokens to tokenize tokens.
-  tokenize_tokens = []
-  row = 1
-  col = 0
-  for t in offset_tokens:
-    offset_row, offset_col = t.offset
-    if offset_row == 0:
-      col += offset_col
-    else:
-      row += offset_row
-      col = offset_col
-    tokenize_tokens.append((t.type, t.string, (row, col), (row, col), None))
-
-  # tokenize can't handle whitespace before line continuations.
-  # So add a space.
-  return tokenize.untokenize(tokenize_tokens).replace('\\\n', ' \\\n')
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py b/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py
deleted file mode 100644
index 7056abf..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import print_function
-
-import parser
-import symbol
-import sys
-import token
-import tokenize
-
-from py_utils.refactor import offset_token
-
-
-class Snippet(object):
-  """A node in the Python parse tree.
-
-  The Python grammar is defined at:
-  https://docs.python.org/2/reference/grammar.html
-
-  There are two types of Snippets:
-    TokenSnippets are leaf nodes containing actual text.
-    Symbols are internal nodes representing higher-level groupings, and are
-        defined by the left-hand sides of the BNFs in the above link.
-  """
-  @property
-  def type(self):
-    raise NotImplementedError()
-
-  @property
-  def type_name(self):
-    raise NotImplementedError()
-
-  @property
-  def children(self):
-    """Return a list of this node's children."""
-    raise NotImplementedError()
-
-  @property
-  def tokens(self):
-    """Return a tuple of the tokens this Snippet contains."""
-    raise NotImplementedError()
-
-  def PrintTree(self, indent=0, stream=sys.stdout):
-    """Spew a pretty-printed parse tree. Mostly useful for debugging."""
-    raise NotImplementedError()
-
-  def __str__(self):
-    return offset_token.Untokenize(self.tokens)
-
-  def FindAll(self, snippet_type):
-    if isinstance(snippet_type, int):
-      if self.type == snippet_type:
-        yield self
-    else:
-      if isinstance(self, snippet_type):
-        yield self
-
-    for child in self.children:
-      for snippet in child.FindAll(snippet_type):
-        yield snippet
-
-  def FindChild(self, snippet_type, **kwargs):
-    for child in self.children:
-      if isinstance(snippet_type, int):
-        if child.type != snippet_type:
-          continue
-      else:
-        if not isinstance(child, snippet_type):
-          continue
-
-      for attribute, value in kwargs:
-        if getattr(child, attribute) != value:
-          break
-      else:
-        return child
-    raise ValueError('%s is not in %s. Children are: %s' %
-                     (snippet_type, self, self.children))
-
-  def FindChildren(self, snippet_type):
-    if isinstance(snippet_type, int):
-      for child in self.children:
-        if child.type == snippet_type:
-          yield child
-    else:
-      for child in self.children:
-        if isinstance(child, snippet_type):
-          yield child
-
-
-class TokenSnippet(Snippet):
-  """A Snippet containing a list of tokens.
-
-  A list of tokens may start with any number of comments and non-terminating
-  newlines, but must end with a syntactically meaningful token.
-  """
-
-  def __init__(self, token_type, tokens):
-    # For operators and delimiters, the TokenSnippet's type may be more specific
-    # than the type of the constituent token. E.g. the TokenSnippet type is
-    # token.DOT, but the token type is token.OP. This is because the parser
-    # has more context than the tokenizer.
-    self._type = token_type
-    self._tokens = tokens
-    self._modified = False
-
-  @classmethod
-  def Create(cls, token_type, string, offset=(0, 0)):
-    return cls(token_type,
-               [offset_token.OffsetToken(token_type, string, offset)])
-
-  @property
-  def type(self):
-    return self._type
-
-  @property
-  def type_name(self):
-    return token.tok_name[self.type]
-
-  @property
-  def value(self):
-    return self._tokens[-1].string
-
-  @value.setter
-  def value(self, value):
-    self._tokens[-1].string = value
-    self._modified = True
-
-  @property
-  def children(self):
-    return []
-
-  @property
-  def tokens(self):
-    return tuple(self._tokens)
-
-  @property
-  def modified(self):
-    return self._modified
-
-  def PrintTree(self, indent=0, stream=sys.stdout):
-    stream.write(' ' * indent)
-    if not self.tokens:
-      print(self.type_name, file=stream)
-      return
-
-    print('%-4s' % self.type_name, repr(self.tokens[0].string), file=stream)
-    for tok in self.tokens[1:]:
-      stream.write(' ' * indent)
-      print(' ' * max(len(self.type_name), 4), repr(tok.string), file=stream)
-
-
-class Symbol(Snippet):
-  """A Snippet containing sub-Snippets.
-
-  The possible types and type_names are defined in Python's symbol module."""
-
-  def __init__(self, symbol_type, children):
-    self._type = symbol_type
-    self._children = children
-
-  @property
-  def type(self):
-    return self._type
-
-  @property
-  def type_name(self):
-    return symbol.sym_name[self.type]
-
-  @property
-  def children(self):
-    return self._children
-
-  @children.setter
-  def children(self, value):  # pylint: disable=arguments-differ
-    self._children = value
-
-  @property
-  def tokens(self):
-    tokens = []
-    for child in self.children:
-      tokens += child.tokens
-    return tuple(tokens)
-
-  @property
-  def modified(self):
-    return any(child.modified for child in self.children)
-
-  def PrintTree(self, indent=0, stream=sys.stdout):
-    stream.write(' ' * indent)
-
-    # If there's only one child, collapse it onto the same line.
-    node = self
-    while len(node.children) == 1 and len(node.children[0].children) == 1:
-      print(node.type_name, end=' ', file=stream)
-      node = node.children[0]
-
-    print(node.type_name, file=stream)
-    for child in node.children:
-      child.PrintTree(indent + 2, stream)
-
-
-def Snippetize(f):
-  """Return the syntax tree of the given file."""
-  f.seek(0)
-  syntax_tree = parser.st2list(parser.suite(f.read()))
-  tokens = offset_token.Tokenize(f)
-
-  snippet = _SnippetizeNode(syntax_tree, tokens)
-  assert not tokens
-  return snippet
-
-
-def _SnippetizeNode(node, tokens):
-  # The parser module gives a syntax tree that discards comments,
-  # non-terminating newlines, and whitespace information. Use the tokens given
-  # by the tokenize module to annotate the syntax tree with the information
-  # needed to exactly reproduce the original source code.
-  node_type = node[0]
-
-  if node_type >= token.NT_OFFSET:
-    # Symbol.
-    children = tuple(_SnippetizeNode(child, tokens) for child in node[1:])
-    return Symbol(node_type, children)
-  else:
-    # Token.
-    grabbed_tokens = []
-    while tokens and (
-        tokens[0].type == tokenize.COMMENT or tokens[0].type == tokenize.NL):
-      grabbed_tokens.append(tokens.popleft())
-
-    # parser has 2 NEWLINEs right before the end.
-    # tokenize has 0 or 1 depending on if the file has one.
-    # Create extra nodes without consuming tokens to account for this.
-    if node_type == token.NEWLINE:
-      for tok in tokens:
-        if tok.type == token.ENDMARKER:
-          return TokenSnippet(node_type, grabbed_tokens)
-        if tok.type != token.DEDENT:
-          break
-
-    assert tokens[0].type == token.OP or node_type == tokens[0].type
-
-    grabbed_tokens.append(tokens.popleft())
-    return TokenSnippet(node_type, grabbed_tokens)
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py b/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py
+++ /dev/null
diff --git a/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py b/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py
deleted file mode 100644
index 6d0a7cb..0000000
--- a/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import print_function
-
-import functools
-import os
-import sys
-
-from py_utils import refactor
-
-
-def Run(sources, target, files_to_update):
-  """Move modules and update imports.
-
-  Args:
-    sources: List of source module or package paths.
-    target: Destination module or package path.
-    files_to_update: Modules whose imports we should check for changes.
-  """
-  # TODO(dtu): Support moving classes and functions.
-  moves = tuple(_Move(source, target) for source in sources)
-
-  # Update imports and references.
-  refactor.Transform(functools.partial(_Update, moves), files_to_update)
-
-  # Move files.
-  for move in moves:
-    os.rename(move.source_path, move.target_path)
-
-
-def _Update(moves, module):
-  for import_statement in module.FindAll(refactor.Import):
-    for move in moves:
-      try:
-        if move.UpdateImportAndReferences(module, import_statement):
-          break
-      except NotImplementedError as e:
-        print('Error updating %s: %s' % (module.file_path, e), file=sys.stderr)
-
-
-class _Move(object):
-
-  def __init__(self, source, target):
-    self._source_path = os.path.realpath(source)
-    self._target_path = os.path.realpath(target)
-
-    if os.path.isdir(self._target_path):
-      self._target_path = os.path.join(
-          self._target_path, os.path.basename(self._source_path))
-
-  @property
-  def source_path(self):
-    return self._source_path
-
-  @property
-  def target_path(self):
-    return self._target_path
-
-  @property
-  def source_module_path(self):
-    return _ModulePath(self._source_path)
-
-  @property
-  def target_module_path(self):
-    return _ModulePath(self._target_path)
-
-  def UpdateImportAndReferences(self, module, import_statement):
-    """Update an import statement in a module and all its references..
-
-    Args:
-      module: The refactor.Module to update.
-      import_statement:  The refactor.Import to update.
-
-    Returns:
-      True if the import statement was updated, or False if the import statement
-      needed no updating.
-    """
-    statement_path_parts = import_statement.path.split('.')
-    source_path_parts = self.source_module_path.split('.')
-    if source_path_parts != statement_path_parts[:len(source_path_parts)]:
-      return False
-
-    # Update import statement.
-    old_name_parts = import_statement.name.split('.')
-    new_name_parts = ([self.target_module_path] +
-                      statement_path_parts[len(source_path_parts):])
-    import_statement.path = '.'.join(new_name_parts)
-    new_name = import_statement.name
-
-    # Update references.
-    for reference in module.FindAll(refactor.Reference):
-      reference_parts = reference.value.split('.')
-      if old_name_parts != reference_parts[:len(old_name_parts)]:
-        continue
-
-      new_reference_parts = [new_name] + reference_parts[len(old_name_parts):]
-      reference.value = '.'.join(new_reference_parts)
-
-    return True
-
-
-def _BaseDir(module_path):
-  if not os.path.isdir(module_path):
-    module_path = os.path.dirname(module_path)
-
-  while '__init__.py' in os.listdir(module_path):
-    module_path = os.path.dirname(module_path)
-
-  return module_path
-
-
-def _ModulePath(module_path):
-  if os.path.split(module_path)[1] == '__init__.py':
-    module_path = os.path.dirname(module_path)
-  rel_path = os.path.relpath(module_path, _BaseDir(module_path))
-  return os.path.splitext(rel_path)[0].replace(os.sep, '.')
diff --git a/systrace/catapult/common/py_utils/py_utils/retry_util.py b/systrace/catapult/common/py_utils/py_utils/retry_util.py
deleted file mode 100644
index a11bd80..0000000
--- a/systrace/catapult/common/py_utils/py_utils/retry_util.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-import functools
-import logging
-import time
-from six.moves import range # pylint: disable=redefined-builtin
-
-
-def RetryOnException(exc_type, retries):
-  """Decorator to retry running a function if an exception is raised.
-
-  Implements exponential backoff to wait between each retry attempt, starting
-  with 1 second.
-
-  Note: the default number of retries is defined on the decorator, the decorated
-  function *must* also receive a "retries" argument (although its assigned
-  default value is ignored), and clients of the funtion may override the actual
-  number of retries at the call site.
-
-  The "unused" retries argument on the decorated function must be given to
-  keep pylint happy and to avoid breaking the Principle of Least Astonishment
-  if the decorator were to change the signature of the function.
-
-  For example:
-
-    @retry_util.RetryOnException(OSError, retries=3)  # default no. of retries
-    def ProcessSomething(thing, retries=None):  # this default value is ignored
-      del retries  # Unused. Handled by the decorator.
-      # Do your thing processing here, maybe sometimes raising exeptions.
-
-    ProcessSomething(a_thing)  # retries 3 times.
-    ProcessSomething(b_thing, retries=5)  # retries 5 times.
-
-  Args:
-    exc_type: An exception type (or a tuple of them), on which to retry.
-    retries: Default number of extra attempts to try, the caller may also
-      override this number. If an exception is raised during the last try,
-      then the exception is not caught and passed back to the caller.
-  """
-  def Decorator(f):
-    @functools.wraps(f)
-    def Wrapper(*args, **kwargs):
-      wait = 1
-      kwargs.setdefault('retries', retries)
-      for _ in range(kwargs['retries']):
-        try:
-          return f(*args, **kwargs)
-        except exc_type as exc:
-          logging.warning(
-              '%s raised %s, will retry in %d second%s ...',
-              f.__name__, type(exc).__name__, wait, '' if wait == 1 else 's')
-          time.sleep(wait)
-          wait *= 2
-      # Last try with no exception catching.
-      return f(*args, **kwargs)
-    return Wrapper
-  return Decorator
diff --git a/systrace/catapult/common/py_utils/py_utils/retry_util_unittest.py b/systrace/catapult/common/py_utils/py_utils/retry_util_unittest.py
deleted file mode 100644
index f24577f..0000000
--- a/systrace/catapult/common/py_utils/py_utils/retry_util_unittest.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import unittest
-
-import mock
-
-from py_utils import retry_util
-
-
-class RetryOnExceptionTest(unittest.TestCase):
-  def setUp(self):
-    self.num_calls = 0
-    # Patch time.sleep to make tests run faster (skip waits) and also check
-    # that exponential backoff is implemented correctly.
-    patcher = mock.patch('time.sleep')
-    self.time_sleep = patcher.start()
-    self.addCleanup(patcher.stop)
-
-  def testNoExceptionsReturnImmediately(self):
-    @retry_util.RetryOnException(Exception, retries=3)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      return 'OK!'
-
-    # The function is called once and returns the expected value.
-    self.assertEqual(Test(), 'OK!')
-    self.assertEqual(self.num_calls, 1)
-
-  def testRaisesExceptionIfAlwaysFailing(self):
-    @retry_util.RetryOnException(KeyError, retries=5)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      raise KeyError('oops!')
-
-    # The exception is eventually raised.
-    with self.assertRaises(KeyError):
-      Test()
-    # The function is called the expected number of times.
-    self.assertEqual(self.num_calls, 6)
-    # Waits between retries do follow exponential backoff.
-    self.assertEqual(
-        self.time_sleep.call_args_list,
-        [mock.call(i) for i in (1, 2, 4, 8, 16)])
-
-  def testOtherExceptionsAreNotCaught(self):
-    @retry_util.RetryOnException(KeyError, retries=3)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      raise ValueError('oops!')
-
-    # The exception is raised immediately on the first try.
-    with self.assertRaises(ValueError):
-      Test()
-    self.assertEqual(self.num_calls, 1)
-
-  def testCallerMayOverrideRetries(self):
-    @retry_util.RetryOnException(KeyError, retries=3)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      raise KeyError('oops!')
-
-    with self.assertRaises(KeyError):
-      Test(retries=10)
-    # The value on the caller overrides the default on the decorator.
-    self.assertEqual(self.num_calls, 11)
-
-  def testCanEventuallySucceed(self):
-    @retry_util.RetryOnException(KeyError, retries=5)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      if self.num_calls < 3:
-        raise KeyError('oops!')
-      else:
-        return 'OK!'
-
-    # The value is returned after the expected number of calls.
-    self.assertEqual(Test(), 'OK!')
-    self.assertEqual(self.num_calls, 3)
-
-  def testRetriesCanBeSwitchedOff(self):
-    @retry_util.RetryOnException(KeyError, retries=5)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      if self.num_calls < 3:
-        raise KeyError('oops!')
-      else:
-        return 'OK!'
-
-    # We fail immediately on the first try.
-    with self.assertRaises(KeyError):
-      Test(retries=0)
-    self.assertEqual(self.num_calls, 1)
-
-  def testCanRetryOnMultipleExceptions(self):
-    @retry_util.RetryOnException((KeyError, ValueError), retries=3)
-    def Test(retries=None):
-      del retries
-      self.num_calls += 1
-      if self.num_calls == 1:
-        raise KeyError('oops!')
-      elif self.num_calls == 2:
-        raise ValueError('uh oh!')
-      else:
-        return 'OK!'
-
-    # Call eventually succeeds after enough tries.
-    self.assertEqual(Test(retries=5), 'OK!')
-    self.assertEqual(self.num_calls, 3)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/common/py_utils/py_utils/shell_util.py b/systrace/catapult/common/py_utils/py_utils/shell_util.py
deleted file mode 100644
index 6af7f8e..0000000
--- a/systrace/catapult/common/py_utils/py_utils/shell_util.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Shell scripting helpers (created for Telemetry dependency roll scripts).
-
-from __future__ import print_function
-
-import os as _os
-import shutil as _shutil
-import subprocess as _subprocess
-import tempfile as _tempfile
-from contextlib import contextmanager as _contextmanager
-
-@_contextmanager
-def ScopedChangeDir(new_path):
-  old_path = _os.getcwd()
-  _os.chdir(new_path)
-  print('> cd', _os.getcwd())
-  try:
-    yield
-  finally:
-    _os.chdir(old_path)
-    print('> cd', old_path)
-
-@_contextmanager
-def ScopedTempDir():
-  temp_dir = _tempfile.mkdtemp()
-  try:
-    with ScopedChangeDir(temp_dir):
-      yield
-  finally:
-    _shutil.rmtree(temp_dir)
-
-def CallProgram(path_parts, *args, **kwargs):
-  '''Call an executable os.path.join(*path_parts) with the arguments specified
-  by *args. Any keyword arguments are passed as environment variables.'''
-  args = [_os.path.join(*path_parts)] + list(args)
-  env = dict(_os.environ)
-  env.update(kwargs)
-  print('>', ' '.join(args))
-  _subprocess.check_call(args, env=env)
diff --git a/systrace/catapult/common/py_utils/py_utils/slots_metaclass.py b/systrace/catapult/common/py_utils/py_utils/slots_metaclass.py
deleted file mode 100644
index ae36c67..0000000
--- a/systrace/catapult/common/py_utils/py_utils/slots_metaclass.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-class SlotsMetaclass(type):
-  """This metaclass requires all subclasses to define __slots__.
-
-  Usage:
-    class Foo(object):
-      __metaclass__ = slots_metaclass.SlotsMetaclass
-      __slots__ = '_property0', '_property1',
-
-  __slots__ must be a tuple containing string names of all properties that the
-  class contains.
-  Defining __slots__ reduces memory usage, accelerates property access, and
-  prevents dynamically adding unlisted properties.
-  If you need to dynamically add unlisted properties to a class with this
-  metaclass, then take a step back and rethink your goals. If you really really
-  need to dynamically add unlisted properties to a class with this metaclass,
-  add '__dict__' to its __slots__.
-  """
-
-  def __new__(mcs, name, bases, attrs):
-    assert '__slots__' in attrs, 'Class "%s" must define __slots__' % name
-    assert isinstance(attrs['__slots__'], tuple), '__slots__ must be a tuple'
-
-    return super(SlotsMetaclass, mcs).__new__(mcs, name, bases, attrs)
diff --git a/systrace/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py b/systrace/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py
deleted file mode 100644
index 702371a..0000000
--- a/systrace/catapult/common/py_utils/py_utils/slots_metaclass_unittest.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import unittest
-
-import six
-
-from py_utils import slots_metaclass
-
-
-class SlotsMetaclassUnittest(unittest.TestCase):
-
-  def testSlotsMetaclass(self):
-
-    class NiceClass(six.with_metaclass(slots_metaclass.SlotsMetaclass, object)):
-      __slots__ = '_nice',
-
-      def __init__(self, nice):
-        self._nice = nice
-
-    NiceClass(42)
-
-    with self.assertRaises(AssertionError):
-      class NaughtyClass(NiceClass):
-        def __init__(self, naughty):
-          super(NaughtyClass, self).__init__(42)
-          self._naughty = naughty
-
-      # Metaclasses are called when the class is defined, so no need to
-      # instantiate it.
-
-    with self.assertRaises(AttributeError):
-      class NaughtyClass2(NiceClass):
-        __slots__ = ()
-
-        def __init__(self, naughty):
-          super(NaughtyClass2, self).__init__(42)
-          self._naughty = naughty  # pylint: disable=assigning-non-slot
-
-      # SlotsMetaclass is happy that __slots__ is defined, but python won't be
-      # happy about assigning _naughty when the class is instantiated because it
-      # isn't listed in __slots__, even if you disable the pylint error.
-      NaughtyClass2(666)
diff --git a/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py b/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py
deleted file mode 100644
index ba68c52..0000000
--- a/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import shutil
-import tempfile
-
-
-@contextlib.contextmanager
-def NamedTemporaryDirectory(suffix='', prefix='tmp', dir=None):
-  """A context manager that manages a temporary directory.
-
-  This is a context manager version of tempfile.mkdtemp. The arguments to this
-  function are the same as the arguments for that one.
-
-  This can be used to automatically manage the lifetime of a temporary file
-  without maintaining an open file handle on it. Doing so can be useful in
-  scenarios where a parent process calls a child process to create a temporary
-  file and then does something with the resulting file.
-  """
-  # This uses |dir| as a parameter name for consistency with mkdtemp.
-  # pylint: disable=redefined-builtin
-
-  d = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=dir)
-  try:
-    yield d
-  finally:
-    shutil.rmtree(d)
-
-
-@contextlib.contextmanager
-def NamedTemporaryFile(mode='w+b', suffix='', prefix='tmp'):
-  """A conext manager to hold a named temporary file.
-
-  It's similar to Python's tempfile.NamedTemporaryFile except:
-  - The file is _not_ deleted when you close the temporary file handle, so you
-    can close it and then use the name of the file to re-open it later.
-  - The file *is* always deleted when exiting the context managed code.
-  """
-  with NamedTemporaryDirectory() as temp_dir:
-    yield tempfile.NamedTemporaryFile(
-        mode=mode, suffix=suffix, prefix=prefix, dir=temp_dir, delete=False)
-
-
-@contextlib.contextmanager
-def TemporaryFileName(prefix='tmp', suffix=''):
-  """A context manager to just get the path to a file that does not exist.
-
-  The parent directory of the file is a newly clreated temporary directory,
-  and the name of the file is just `prefix + suffix`. The file istelf is not
-  created, you are in fact guaranteed that it does not exit.
-
-  The entire parent directory, possibly including the named temporary file and
-  any sibling files, is entirely deleted when exiting the context managed code.
-  """
-  with NamedTemporaryDirectory() as temp_dir:
-    yield os.path.join(temp_dir, prefix + suffix)
diff --git a/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py b/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
deleted file mode 100644
index 76a0efd..0000000
--- a/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import filecmp
-import os
-import shutil
-
-from py_utils import tempfile_ext
-from pyfakefs import fake_filesystem_unittest
-
-
-class NamedTemporaryDirectoryTest(fake_filesystem_unittest.TestCase):
-  def setUp(self):
-    self.setUpPyfakefs()
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  def testBasic(self):
-    with tempfile_ext.NamedTemporaryDirectory() as d:
-      self.assertTrue(os.path.exists(d))
-      self.assertTrue(os.path.isdir(d))
-    self.assertFalse(os.path.exists(d))
-
-  def testSuffix(self):
-    test_suffix = 'foo'
-    with tempfile_ext.NamedTemporaryDirectory(suffix=test_suffix) as d:
-      self.assertTrue(os.path.basename(d).endswith(test_suffix))
-
-  def testPrefix(self):
-    test_prefix = 'bar'
-    with tempfile_ext.NamedTemporaryDirectory(prefix=test_prefix) as d:
-      self.assertTrue(os.path.basename(d).startswith(test_prefix))
-
-  def testDir(self):
-    test_dir = '/baz'
-    self.fs.CreateDirectory(test_dir)
-    with tempfile_ext.NamedTemporaryDirectory(dir=test_dir) as d:
-      self.assertEquals(test_dir, os.path.dirname(d))
-
-
-class TemporaryFilesTest(fake_filesystem_unittest.TestCase):
-  def setUp(self):
-    self.setUpPyfakefs()
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  def testNamedTemporaryFile(self):
-    with tempfile_ext.NamedTemporaryFile() as f:
-      self.assertTrue(os.path.isfile(f.name))
-      f.write('<data>')
-      f.close()
-      self.assertTrue(os.path.exists(f.name))
-      with open(f.name) as f2:
-        self.assertEqual(f2.read(), '<data>')
-
-    self.assertFalse(os.path.exists(f.name))
-
-  def testTemporaryFileName(self):
-    with tempfile_ext.TemporaryFileName('foo') as filepath:
-      self.assertTrue(os.path.basename(filepath), 'foo')
-      self.assertFalse(os.path.exists(filepath))
-
-      with open(filepath, 'w') as f:
-        f.write('<data>')
-      self.assertTrue(os.path.exists(filepath))
-
-      shutil.copyfile(filepath, filepath + '.bak')
-      self.assertTrue(filecmp.cmp(filepath, filepath + '.bak'))
-
-    self.assertFalse(os.path.exists(filepath))
-    self.assertFalse(os.path.exists(os.path.dirname(filepath)))
diff --git a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/__init__.py b/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/__init__.py
deleted file mode 100644
index 9228df8..0000000
--- a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py b/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py
deleted file mode 100644
index 0459ccf..0000000
--- a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/another_discover_dummyclass.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""More dummy exception subclasses used by core/discover.py's unit tests."""
-
-# Import class instead of module explicitly so that inspect.getmembers() returns
-# two Exception subclasses in this current file.
-# Suppress complaints about unable to import class.  The directory path is
-# added at runtime by telemetry test runner.
-#pylint: disable=import-error
-from discoverable_classes import discover_dummyclass
-
-
-class _PrivateDummyException(discover_dummyclass.DummyException):
-  def __init__(self):
-    super(_PrivateDummyException, self).__init__()
-
-
-class DummyExceptionImpl1(_PrivateDummyException):
-  def __init__(self):
-    super(DummyExceptionImpl1, self).__init__()
-
-
-class DummyExceptionImpl2(_PrivateDummyException):
-  def __init__(self):
-    super(DummyExceptionImpl2, self).__init__()
-
-
-class DummyExceptionWithParameterImpl1(_PrivateDummyException):
-  def __init__(self, parameter):
-    super(DummyExceptionWithParameterImpl1, self).__init__()
-    del parameter
diff --git a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py b/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py
deleted file mode 100644
index 15dcb35..0000000
--- a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/discover_dummyclass.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A dummy exception subclass used by core/discover.py's unit tests."""
-
-class DummyException(Exception):
-  def __init__(self):
-    super(DummyException, self).__init__()
diff --git a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py b/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py
deleted file mode 100644
index c37f4a9..0000000
--- a/systrace/catapult/common/py_utils/py_utils/test_data/discoverable_classes/parameter_discover_dummyclass.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A dummy exception subclass used by core/discover.py's unit tests."""
-from discoverable_classes import discover_dummyclass
-
-class DummyExceptionWithParameterImpl2(discover_dummyclass.DummyException):
-  def __init__(self, parameter1, parameter2):
-    super(DummyExceptionWithParameterImpl2, self).__init__()
-    del parameter1, parameter2
diff --git a/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt b/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt
deleted file mode 100644
index a9cac3e..0000000
--- a/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is not executable.
diff --git a/systrace/catapult/common/py_utils/py_utils/ts_proxy_server.py b/systrace/catapult/common/py_utils/py_utils/ts_proxy_server.py
deleted file mode 100644
index ffed090..0000000
--- a/systrace/catapult/common/py_utils/py_utils/ts_proxy_server.py
+++ /dev/null
@@ -1,225 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Start and stop tsproxy."""
-
-import logging
-import os
-import re
-import signal
-import subprocess
-import sys
-import time
-
-try:
-  import fcntl
-except ImportError:
-  fcntl = None
-
-import py_utils
-from py_utils import retry_util
-from py_utils import atexit_with_log
-
-_TSPROXY_PATH = os.path.join(
-    py_utils.GetCatapultDir(), 'third_party', 'tsproxy', 'tsproxy.py')
-
-class TsProxyServerError(Exception):
-  """Catch-all exception for tsProxy Server."""
-  pass
-
-def ParseTsProxyPortFromOutput(output_line):
-  port_re = re.compile(
-      r'Started Socks5 proxy server on '
-      r'(?P<host>[^:]*):'
-      r'(?P<port>\d+)')
-  m = port_re.match(output_line)
-  if m:
-    return int(m.group('port'))
-
-
-class TsProxyServer(object):
-  """Start and stop tsproxy.
-
-  TsProxy provides basic latency, download and upload traffic shaping. This
-  class provides a programming API to the tsproxy script in
-  catapult/third_party/tsproxy/tsproxy.py
-
-  This class can be used as a context manager.
-  """
-
-  def __init__(self, host_ip=None, http_port=None, https_port=None):
-    """
-    Initialize TsProxyServer.
-
-    Args:
-
-      host_ip: A string of the host ip address.
-      http_port: A decimal of the port used for http traffic.
-      https_port: a decimal of the port used for https traffic.
-
-    """
-    self._proc = None
-    self._port = None
-    self._is_running = False
-    self._host_ip = host_ip
-    assert bool(http_port) == bool(https_port)
-    self._http_port = http_port
-    self._https_port = https_port
-    self._non_blocking = False
-    self._rtt = None
-    self._inbkps = None
-    self._outkbps = None
-
-  @property
-  def port(self):
-    return self._port
-
-  @retry_util.RetryOnException(TsProxyServerError, retries=3)
-  def StartServer(self, timeout=10, retries=None):
-    """Start TsProxy server and verify that it started."""
-    del retries # Handled by decorator.
-    cmd_line = [sys.executable, _TSPROXY_PATH]
-    # Use port 0 so tsproxy picks a random available port.
-    cmd_line.extend(['--port=0'])
-    if self._host_ip:
-      cmd_line.append('--desthost=%s' % self._host_ip)
-    if self._http_port:
-      cmd_line.append(
-          '--mapports=443:%s,*:%s' % (self._https_port, self._http_port))
-      logging.info('Tsproxy commandline: %s', cmd_line)
-    self._proc = subprocess.Popen(
-        cmd_line, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
-        stderr=subprocess.PIPE, bufsize=1)
-    self._non_blocking = False
-    if fcntl:
-      logging.info('fcntl is supported, trying to set '
-                   'non blocking I/O for the ts_proxy process')
-      fd = self._proc.stdout.fileno()
-      fl = fcntl.fcntl(fd, fcntl.F_GETFL)
-      fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
-      self._non_blocking = True
-
-    atexit_with_log.Register(self.StopServer)
-    try:
-      py_utils.WaitFor(self._IsStarted, timeout)
-      logging.info('TsProxy port: %s', self._port)
-      self._is_running = True
-    except py_utils.TimeoutException:
-      err = self.StopServer()
-      if err:
-        logging.error('Error stopping WPR server:\n%s', err)
-      raise TsProxyServerError(
-          'Error starting tsproxy: timed out after %s seconds' % timeout)
-
-  def _IsStarted(self):
-    assert not self._is_running
-    assert self._proc
-    if self._proc.poll() is not None:
-      return False
-    self._proc.stdout.flush()
-    output_line = self._ReadLineTsProxyStdout(timeout=5)
-    logging.debug('TsProxy output: %s', output_line)
-    self._port = ParseTsProxyPortFromOutput(output_line)
-    return self._port != None
-
-  def _ReadLineTsProxyStdout(self, timeout):
-    def ReadSingleLine():
-      try:
-        return self._proc.stdout.readline().strip()
-      except IOError:
-        # Add a sleep to avoid trying to read self._proc.stdout too often.
-        if self._non_blocking:
-          time.sleep(0.5)
-        return None
-    return py_utils.WaitFor(ReadSingleLine, timeout)
-
-  @retry_util.RetryOnException(TsProxyServerError, retries=3)
-  def _IssueCommand(self, command_string, timeout, retries=None):
-    del retries  # handled by the decorator
-    logging.info('Issuing command to ts_proxy_server: %s', command_string)
-    command_output = []
-    self._proc.stdin.write('%s\n' % command_string)
-    def CommandStatusIsRead():
-      self._proc.stdin.flush()
-      self._proc.stdout.flush()
-      command_output.append(self._ReadLineTsProxyStdout(timeout))
-      return command_output[-1] == 'OK' or command_output[-1] == 'ERROR'
-
-    py_utils.WaitFor(CommandStatusIsRead, timeout)
-
-    success = 'OK' in command_output
-    logging.log(logging.DEBUG if success else logging.ERROR,
-                'TsProxy output:\n%s', '\n'.join(command_output))
-    if not success:
-      raise TsProxyServerError('Failed to execute command: %s', command_string)
-
-  def UpdateOutboundPorts(self, http_port, https_port, timeout=5):
-    assert http_port and https_port
-    assert http_port != https_port
-    assert isinstance(http_port, int) and isinstance(https_port, int)
-    assert 1 <= http_port <= 65535
-    assert 1 <= https_port <= 65535
-    self._IssueCommand('set mapports 443:%i,*:%i' % (https_port, http_port),
-                       timeout)
-
-  def UpdateTrafficSettings(
-      self, round_trip_latency_ms=None,
-      download_bandwidth_kbps=None, upload_bandwidth_kbps=None, timeout=20):
-    """Update traffic settings of the proxy server.
-
-    Notes that this method only updates the specified parameter.
-    """
-    # Memorize the traffic settings & only execute the command if the traffic
-    # settings are different.
-    if round_trip_latency_ms is not None and self._rtt != round_trip_latency_ms:
-      self._IssueCommand('set rtt %s' % round_trip_latency_ms, timeout)
-      self._rtt = round_trip_latency_ms
-
-    if (download_bandwidth_kbps is not None and
-        self._inbkps != download_bandwidth_kbps):
-      self._IssueCommand('set inkbps %s' % download_bandwidth_kbps, timeout)
-      self._inbkps = download_bandwidth_kbps
-
-    if (upload_bandwidth_kbps is not None and
-        self._outkbps != upload_bandwidth_kbps):
-      self._IssueCommand('set outkbps %s' % upload_bandwidth_kbps, timeout)
-      self._outkbps = upload_bandwidth_kbps
-
-  def StopServer(self):
-    """Stop TsProxy Server."""
-    if not self._is_running:
-      logging.debug('Attempting to stop TsProxy server that is not running.')
-      return
-    if not self._proc:
-      return
-    try:
-      self._IssueCommand('exit', timeout=10)
-      py_utils.WaitFor(lambda: self._proc.poll() is not None, 10)
-    except py_utils.TimeoutException:
-      # signal.SIGINT is not supported on Windows.
-      if not sys.platform.startswith('win'):
-        try:
-          # Use a SIGNINT so that it can do graceful cleanup
-          self._proc.send_signal(signal.SIGINT)
-        except ValueError:
-          logging.warning('Unable to stop ts_proxy_server gracefully.\n')
-      self._proc.terminate()
-    _, err = self._proc.communicate()
-
-    self._proc = None
-    self._port = None
-    self._is_running = False
-    self._rtt = None
-    self._inbkps = None
-    self._outkbps = None
-    return err
-
-  def __enter__(self):
-    """Add support for with-statement."""
-    self.StartServer()
-    return self
-
-  def __exit__(self, unused_exc_type, unused_exc_val, unused_exc_tb):
-    """Add support for with-statement."""
-    self.StopServer()
diff --git a/systrace/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py b/systrace/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py
deleted file mode 100644
index 4bb75c8..0000000
--- a/systrace/catapult/common/py_utils/py_utils/ts_proxy_server_unittest.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from py_utils import ts_proxy_server
-
-class TsProxyServerTest(unittest.TestCase):
-  def testParseTsProxyPort(self):
-    self.assertEquals(
-        ts_proxy_server.ParseTsProxyPortFromOutput(
-            'Started Socks5 proxy server on 127.0.0.1:54430 \n'),
-        54430)
-    self.assertEquals(
-        ts_proxy_server.ParseTsProxyPortFromOutput(
-            'Started Socks5 proxy server on foo.bar.com:430 \n'),
-        430)
-    self.assertEquals(
-        ts_proxy_server.ParseTsProxyPortFromOutput(
-            'Failed to start sock5 proxy.'),
-        None)
-
-  def testSmokeStartingTsProxyServer(self):
-    with ts_proxy_server.TsProxyServer() as server:
-      self.assertIsNotNone(server.port)
-    with ts_proxy_server.TsProxyServer(None, 37124, 37125) as server:
-      self.assertIsNotNone(server.port)
-
-  def testSmokeUpdatingOutboundPorts(self):
-    with ts_proxy_server.TsProxyServer() as server:
-      self.assertIsNotNone(server.port)
-      server.UpdateOutboundPorts(31242, 14220)
-
-  def testSmokeUpdateOutboundPortsInvalid(self):
-    with ts_proxy_server.TsProxyServer() as server:
-      self.assertIsNotNone(server.port)
-      with self.assertRaises(AssertionError):
-        server.UpdateOutboundPorts(31242, 'abcde')
-
-  def testSmokeUpdateTrafficSettings(self):
-    with ts_proxy_server.TsProxyServer() as server:
-      server.UpdateTrafficSettings(round_trip_latency_ms=100)
-      server.UpdateTrafficSettings(download_bandwidth_kbps=5000)
-      server.UpdateTrafficSettings(upload_bandwidth_kbps=2000)
-
-      self.assertEquals(server._rtt, 100)
-      self.assertEquals(server._inbkps, 5000)
-      self.assertEquals(server._outkbps, 2000)
-
-      server.UpdateTrafficSettings(
-          round_trip_latency_ms=200, download_bandwidth_kbps=500,
-          upload_bandwidth_kbps=2000)
-      self.assertEquals(server._rtt, 200)
-      self.assertEquals(server._inbkps, 500)
-      self.assertEquals(server._outkbps, 2000)
diff --git a/systrace/catapult/common/py_utils/py_utils/webpagereplay_go_server.py b/systrace/catapult/common/py_utils/py_utils/webpagereplay_go_server.py
deleted file mode 100644
index 95e4495..0000000
--- a/systrace/catapult/common/py_utils/py_utils/webpagereplay_go_server.py
+++ /dev/null
@@ -1,442 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Start and stop Web Page Replay."""
-
-import logging
-import os
-import re
-import signal
-import subprocess
-import sys
-import tempfile
-import urllib
-
-import py_utils
-from py_utils import atexit_with_log
-from py_utils import binary_manager
-
-_WPR_DIR = os.path.abspath(os.path.join(
-    py_utils.GetCatapultDir(), 'web_page_replay_go'))
-
-TELEMETRY_PROJECT_CONFIG = os.path.join(
-    py_utils.GetCatapultDir(), 'telemetry', 'telemetry',
-    'binary_dependencies.json')
-
-CHROME_BINARY_CONFIG = os.path.join(
-    py_utils.GetCatapultDir(), 'common', 'py_utils', 'py_utils',
-    'chrome_binaries.json')
-
-RECORD = '--record'
-INJECT_SCRIPTS = '--inject_scripts='
-USE_LOCAL_WPR = '--use-local-wpr'
-DISABLE_FUZZY_URL_MATCHING = '--disable-fuzzy-url-matching'
-
-class ReplayError(Exception):
-  """Catch-all exception for the module."""
-  pass
-
-
-class ReplayNotFoundError(ReplayError):
-  def __init__(self, label, path):
-    """
-    Create a ReplayNotFoundError instance.
-
-    Args:
-
-      label: A string of label of this error.
-      path: A string of the path in this error.
-
-    """
-    super(ReplayNotFoundError, self).__init__()
-    self.args = (label, path)
-
-  def __str__(self):
-    label, path = self.args
-    return 'Path does not exist for %s: %s' % (label, path)
-
-
-class ReplayNotStartedError(ReplayError):
-  pass
-
-
-class ReplayServer(object):
-  """Start and Stop Web Page Replay.
-
-  Web Page Replay is a proxy that can record and "replay" web pages with
-  simulated network characteristics -- without having to edit the pages
-  by hand. With WPR, tests can use "real" web content, and catch
-  performance issues that may result from introducing network delays and
-  bandwidth throttling.
-
-  This class could be used as a context manager.
-
-  Example:
-     with ReplayServer(archive_path):
-       self.NavigateToURL(start_url)
-       self.WaitUntil(...)
-  """
-
-  _go_binary_path = None
-
-  def __init__(self, archive_path, replay_host, http_port, https_port,
-               replay_options, binary_downloader=None):
-    """Initialize ReplayServer.
-
-    Args:
-      archive_path: a path to a specific WPR archive.
-      replay_host: the hostname to serve traffic.
-      http_port: an integer port on which to serve HTTP traffic. May be zero
-          to let the OS choose an available port.
-      https_port: an integer port on which to serve HTTPS traffic. May be zero
-          to let the OS choose an available port.
-      replay_options: an iterable of options strings to forward to replay.py.
-      binary_downloader: a function to be used to fetch binary. May be None to
-          use py_utils.binary_manager.FetchPath as default downloader.
-    """
-    self.archive_path = archive_path
-    self._replay_host = replay_host
-    self._started_ports = {}  # a dict such as {'http': 80, 'https': 443}
-
-    # A temporary path for storing stdout & stderr of the webpagereplay
-    # subprocess.
-    self._temp_log_file_path = None
-
-    self._downloader = binary_downloader
-    self._replay_options = replay_options
-    self._cmd_line = self._GetCommandLine(
-        self._GetGoBinaryPath(replay_options), http_port, https_port,
-        replay_options, archive_path)
-
-    if RECORD in replay_options or 'record' in replay_options:
-      self._AssertPathExists('archive directory',
-                             os.path.dirname(self.archive_path))
-    elif not os.path.exists(self.archive_path):
-      self._AssertPathExists('archive file', self.archive_path)
-
-    self.replay_process = None
-
-  def _GetDownloader(self):
-    """Gets the downloader used to download wpr_go binary from GCS."""
-    if ReplayServer._go_binary_path:
-      # If the _go_binary_path was already set, then no need to use downloader
-      # to download via binary_manager.
-      self._downloader = None
-    elif not self._downloader:
-      configs = [CHROME_BINARY_CONFIG, TELEMETRY_PROJECT_CONFIG]
-      self._downloader = binary_manager.BinaryManager(configs).FetchPath
-    return self._downloader
-
-  def _GetGoBinaryPath(self, replay_options):
-    """Gets the _go_binary_path if it already set, or downloads it."""
-    if USE_LOCAL_WPR in replay_options:
-      # Build WPR
-      go_folder = os.path.join(_WPR_DIR, 'src')
-      cur_cwd = os.getcwd()
-      os.chdir(go_folder)
-      try:
-        print subprocess.check_output(['go', 'build', os.path.join(go_folder, 'wpr.go')])
-      except subprocess.CalledProcessError:
-        exit(1)
-      os.chdir(cur_cwd)
-
-      return os.path.join(go_folder, 'wpr')
-
-    if not ReplayServer._go_binary_path:
-      downloader = self._GetDownloader()
-      if not downloader:
-        raise RuntimeError('downloader should not be None '
-                           'while _go_binary_path is None')
-      ReplayServer._go_binary_path = downloader(
-          'wpr_go', py_utils.GetHostOsName(), py_utils.GetHostArchName())
-    return ReplayServer._go_binary_path
-
-  @classmethod
-  def SetGoBinaryPath(cls, go_binary_path):
-    """Overrides the _go_binary_path.
-
-    This allows the server to use WPRGO files retrieved from somewhere
-    other than GCS via binary_manager, such as test isolation.
-
-    For chromium project to use WPR, it is encourage to use test isolation,
-    and therefore should call SetGoBinaryPath to set _go_binary_path.
-
-    For Catapult/Telemetry project, the tradition is to download wpr_go
-    binary via binary_manager. So do not call SetGoBinaryPath.
-    """
-    if not os.path.exists(go_binary_path):
-      raise ValueError('SetGoBinaryPath could not set {} as it does not exist'
-                       .format(go_binary_path))
-    cls._go_binary_path = go_binary_path
-
-  @property
-  def http_port(self):
-    return self._started_ports['http']
-
-  @property
-  def https_port(self):
-    return self._started_ports['https']
-
-  @staticmethod
-  def _GetCommandLine(go_binary_path, http_port, https_port,
-                      options, archive_path):
-    """Set WPR command-line arguments. Can be overridden if needed.
-
-    Keyword arguments:
-
-    * go_binary_path: A string of the path to the wpr.go binary.
-    * http_port: A decimal of the port that handles http requests.
-    * https_port: A decimal of the port that handles https requests.
-    * options: A list of options, such as '--record',
-        '--inject_scripts', etc.
-    * archive_path: A string of the path to the archive file.
-
-    """
-    bad_options = []
-    for option in options:
-      if option not in [RECORD, INJECT_SCRIPTS,
-                        USE_LOCAL_WPR, DISABLE_FUZZY_URL_MATCHING]:
-        bad_options.append(option)
-    if len(bad_options) > 0:
-      raise ValueError("Invalid replay options %s" % bad_options)
-
-    cmd_line = [go_binary_path]
-    if RECORD in options:
-      cmd_line.append('record')
-    else:
-      cmd_line.append('replay')
-    if DISABLE_FUZZY_URL_MATCHING in options:
-      cmd_line.append('--disable_fuzzy_url_matching')
-    key_file = os.path.join(_WPR_DIR, 'wpr_key.pem')
-    cert_file = os.path.join(_WPR_DIR, 'wpr_cert.pem')
-    inject_script = os.path.join(_WPR_DIR, 'deterministic.js')
-    cmd_line.extend([
-        '--http_port=%s' % http_port,
-        '--https_port=%s' % https_port,
-        '--https_key_file=%s' % key_file,
-        '--https_cert_file=%s' % cert_file])
-    if INJECT_SCRIPTS in options:
-      cmd_line.append(INJECT_SCRIPTS)
-    else:
-      cmd_line.append('--inject_scripts=%s' % inject_script)
-    cmd_line.append(archive_path)
-    return cmd_line
-
-  def _AssertPathExists(self, label, path):
-    if not os.path.exists(path):
-      raise ReplayNotFoundError(label, path)
-
-  def _OpenLogFile(self):
-    """Opens the log file for writing."""
-    log_dir = os.path.dirname(self._temp_log_file_path)
-    if not os.path.isdir(log_dir):
-      os.makedirs(log_dir)
-    return open(self._temp_log_file_path, 'w')
-
-  def _LogLines(self):
-    """Yields any log lines that have been writtent to disk."""
-    if (not self._temp_log_file_path or
-        not os.path.isfile(self._temp_log_file_path)):
-      yield '(N/A)'
-      return
-    with open(self._temp_log_file_path) as f:
-      for line in f:
-        yield line
-
-  def _IsStarted(self):
-    """Returns true if the server is up and running."""
-    if not self._IsReplayProcessStarted():
-      return False
-
-    def HasIncompleteStartedPorts():
-      return ('http' not in self._started_ports or
-              'https' not in self._started_ports)
-
-    if HasIncompleteStartedPorts():
-      self._started_ports = self._ParseLogFilePorts(self._LogLines())
-    if HasIncompleteStartedPorts():
-      return False
-
-    try:
-      # HTTPS may require SNI (which urllib does not speak), so only check
-      # that HTTP responds.
-      return self._UrlOpen('web-page-replay-generate-200').getcode() == 200
-    except IOError:
-      return False
-
-  @staticmethod
-  def _ParseLogFilePorts(log_lines):
-    """Returns the ports on which replay listens as reported in its log file.
-
-    Only matches HTTP, HTTPS, and DNS. One call may return only some
-    of the ports depending on what has been written to the log file.
-
-    Example log lines:
-      2014-09-03 17:04:27,978 Starting server on http://:51673
-      2014-09-03 17:04:27,978 Starting server on https://:35270
-
-    Returns:
-      a dict with ports available in log_lines. For example,
-         {}  # no ports found
-         {'http': 1234, 'https': 2345, 'dns': 3456}
-    """
-    ports = {}
-    port_re = re.compile(
-        r'.*Starting server on '
-        r'(?P<protocol>http|https)://'
-        r'(?P<host>[^:]*):'
-        r'(?P<port>\d+)')
-    for line in log_lines:
-      m = port_re.match(line.strip())
-      if m:
-        protocol = m.group('protocol').lower()
-        ports[protocol] = int(m.group('port'))
-    return ports
-
-  def StartServer(self):
-    """Start Web Page Replay and verify that it started.
-
-    Returns:
-      A dictionary mapping the keys 'http', 'https', and (if used) 'dns'
-      to the respective ports of the replay server.
-    Raises:
-      ReplayNotStartedError: if Replay start-up fails.
-    """
-    is_posix = sys.platform.startswith('linux') or sys.platform == 'darwin'
-    logging.info('Starting Web-Page-Replay: %s', self._cmd_line)
-    self._CreateTempLogFilePath()
-    with self._OpenLogFile() as log_fh:
-      self.replay_process = subprocess.Popen(
-          self._cmd_line, stdout=log_fh, stderr=subprocess.STDOUT,
-          preexec_fn=(_ResetInterruptHandler if is_posix else None))
-    try:
-      # TODO(crbug.com/805418): consider changing this to wait with I/O timeout.
-      # The 120s timeout is based on past failures (e.g: crbug.com/812639).
-      py_utils.WaitFor(self._IsStarted, timeout=120)
-      logging.info('WPR ports: %s', self._started_ports)
-      atexit_with_log.Register(self.StopServer)
-      return dict(self._started_ports)
-    except Exception:
-      self.StopServer(logging.ERROR)
-      raise ReplayNotStartedError('Web Page Replay failed to start.')
-
-  def _IsReplayProcessStarted(self):
-    if not self.replay_process:
-      return False
-    return self.replay_process and self.replay_process.poll() is None
-
-  def StopServer(self, log_level=logging.DEBUG):
-    """Stop Web Page Replay.
-
-    This also attempts to return stdout/stderr logs of wpr process if there is
-    any. If there is none, '(N/A)' string is returned (see _LogLines()
-    implementation).
-    """
-    if self._IsReplayProcessStarted():
-      self._StopReplayProcess()
-    self._CleanUpTempLogFilePath(log_level)
-    self._started_ports = {}
-
-  def _StopReplayProcess(self):
-    if not self.replay_process:
-      return
-    logging.debug('Trying to stop Web-Page-Replay gracefully')
-    try:
-      if self._started_ports:
-        self._UrlOpen('web-page-replay-command-exit').close()
-    except IOError:
-      # IOError is possible because the server might exit without response.
-      pass
-    try:
-      py_utils.WaitFor(lambda: self.replay_process.poll() is not None, 10)
-    except py_utils.TimeoutException:
-      try:
-        # Use a SIGINT so that it can do graceful cleanup.
-        self.replay_process.send_signal(signal.SIGINT)
-      except Exception:  # pylint: disable=broad-except
-        # On Windows, we are left with no other option than terminate().
-        is_primary_nameserver_changed_by_replay = (
-            self._replay_host == '127.0.0.1')
-        if is_primary_nameserver_changed_by_replay:
-          # Replay changes the DNS nameserver configuration so that DNS
-          # requests are resolved by replay's own DNS server. It resolves
-          # all DNS requests to it own IP address to it can server the
-          # HTTP and HTTPS requests.
-          # If the replay host is not '127.0.0.1', then replay skips the
-          # nameserver change because it assumes a different mechanism
-          # will be used to route DNS requests to replay's DNS server.
-          logging.warning(
-              'Unable to stop Web-Page-Replay gracefully.\n'
-              'Replay changed the DNS nameserver configuration to make replay '
-              'the primary nameserver. That might not be restored!')
-        self.replay_process.terminate()
-      self.replay_process.communicate()
-    finally:
-      self.replay_process = None
-
-  def _CreateTempLogFilePath(self):
-    assert self._temp_log_file_path is None
-    handle, self._temp_log_file_path = tempfile.mkstemp()
-    os.close(handle)
-
-  def _CleanUpTempLogFilePath(self, log_level):
-    if not self._temp_log_file_path:
-      return ''
-    if logging.getLogger('').isEnabledFor(log_level) or USE_LOCAL_WPR in self._replay_options:
-      with open(self._temp_log_file_path, 'r') as f:
-        wpr_log_output = f.read()
-      output = ('************************** WPR LOG *****************************\n' +
-                '\n'.join(wpr_log_output.split('\n')) +
-                '************************** END OF WPR LOG **********************')
-      if logging.getLogger('').isEnabledFor(log_level):
-        logging.log(log_level, output)
-      else:
-        print output
-
-    os.remove(self._temp_log_file_path)
-    self._temp_log_file_path = None
-
-  def __enter__(self):
-    """Add support for with-statement."""
-    self.StartServer()
-    return self
-
-  def __exit__(self, unused_exc_type, unused_exc_val, unused_exc_tb):
-    """Add support for with-statement."""
-    self.StopServer()
-
-  def _UrlOpen(self, url_path, protocol='http'):
-    """Open a Replay URL.
-
-    For matching requests in the archive, Replay relies on the "Host:" header.
-    For Replay command URLs, the "Host:" header is not needed.
-
-    Args:
-      url_path: WPR server request path.
-      protocol: 'http' or 'https'
-    Returns:
-      a file-like object from urllib.urlopen
-    """
-    url = '%s://%s:%s/%s' % (
-        protocol, self._replay_host, self._started_ports[protocol], url_path)
-    return urllib.urlopen(url, proxies={})
-
-def _ResetInterruptHandler():
-  """Reset the interrupt handler back to the default.
-
-  The replay process is stopped gracefully by making an HTTP request
-  ('web-page-replay-command-exit'). The graceful exit is important for
-  restoring the DNS configuration. If the HTTP request fails, the fallback
-  is to send SIGINT to the process.
-
-  On posix system, running this function before starting replay fixes a
-  bug that shows up when Telemetry is run as a background command from a
-  script. https://crbug.com/254572.
-
-  Background: Signal masks on Linux are inherited from parent
-  processes. If anything invoking us accidentally masks SIGINT
-  (e.g. by putting a process in the background from a shell script),
-  sending a SIGINT to the child will fail to terminate it.
-  """
-  signal.signal(signal.SIGINT, signal.SIG_DFL)
diff --git a/systrace/catapult/common/py_utils/py_utils/xvfb.py b/systrace/catapult/common/py_utils/py_utils/xvfb.py
deleted file mode 100644
index 06ce7dd..0000000
--- a/systrace/catapult/common/py_utils/py_utils/xvfb.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import os
-import logging
-import subprocess
-import platform
-import time
-
-
-def ShouldStartXvfb():
-  # TODO(crbug.com/973847): Note that you can locally change this to return
-  # False to diagnose timeouts for dev server tests.
-  return platform.system() == 'Linux'
-
-
-def StartXvfb():
-  display = ':99'
-  xvfb_command = ['Xvfb', display, '-screen', '0', '1024x769x24', '-ac']
-  xvfb_process = subprocess.Popen(
-      xvfb_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-  time.sleep(0.2)
-  returncode = xvfb_process.poll()
-  if returncode is None:
-    os.environ['DISPLAY'] = display
-  else:
-    logging.error('Xvfb did not start, returncode: %s, stdout:\n%s',
-                  returncode, xvfb_process.stdout.read())
-    xvfb_process = None
-  return xvfb_process
diff --git a/systrace/catapult/common/py_vulcanize/README.chromium b/systrace/catapult/common/py_vulcanize/README.chromium
deleted file mode 100644
index 0b32761..0000000
--- a/systrace/catapult/common/py_vulcanize/README.chromium
+++ /dev/null
@@ -1,8 +0,0 @@
-Name: py_vulcanize
-URL: N/A
-Version: N/A
-
-Description:
-Py-vulcanize, formerly known as TVCM (trace-viewer component model).
-This code doesn't actually live anywhere else currently, but it may
-be split out into a separate repository in the future.
diff --git a/systrace/catapult/common/py_vulcanize/bin/run_py_tests b/systrace/catapult/common/py_vulcanize/bin/run_py_tests
deleted file mode 100755
index 904c213..0000000
--- a/systrace/catapult/common/py_vulcanize/bin/run_py_tests
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), os.path.pardir, os.path.pardir, os.path.pardir))
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-if __name__ == '__main__':
-  _AddToPathIfNeeded(_CATAPULT)
-
-  from hooks import install
-  if '--no-install-hooks' in sys.argv:
-    sys.argv.remove('--no-install-hooks')
-  else:
-    install.InstallHooks()
-
-  from catapult_build import run_with_typ
-  sys.exit(run_with_typ.Run(
-      os.path.join(_CATAPULT, 'common', 'py_vulcanize')))
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/__init__.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/__init__.py
deleted file mode 100644
index f3a4bd1..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Trace-viewer component model.
-
-This module implements trace-viewer's component model.
-"""
-
-from py_vulcanize.generate import *  # pylint: disable=wildcard-import
-from py_vulcanize.project import Project
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py
deleted file mode 100644
index 40b01bb..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/fake_fs.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import codecs
-import collections
-import os
-import sys
-
-import six
-
-
-class WithableStringIO(six.StringIO):
-
-  def __enter__(self, *args):
-    return self
-
-  def __exit__(self, *args):
-    pass
-
-
-class FakeFS(object):
-
-  def __init__(self, initial_filenames_and_contents=None):
-    self._file_contents = {}
-    if initial_filenames_and_contents:
-      for k, v in six.iteritems(initial_filenames_and_contents):
-        self._file_contents[k] = v
-
-    self._bound = False
-    self._real_codecs_open = codecs.open
-    self._real_open = sys.modules['__builtin__'].open
-    self._real_abspath = os.path.abspath
-    self._real_exists = os.path.exists
-    self._real_walk = os.walk
-    self._real_listdir = os.listdir
-
-  def __enter__(self):
-    self.Bind()
-    return self
-
-  def __exit__(self, *args):
-    self.Unbind()
-
-  def Bind(self):
-    assert not self._bound
-    codecs.open = self._FakeCodecsOpen
-    sys.modules['__builtin__'].open = self._FakeOpen
-    os.path.abspath = self._FakeAbspath
-    os.path.exists = self._FakeExists
-    os.walk = self._FakeWalk
-    os.listdir = self._FakeListDir
-    self._bound = True
-
-  def Unbind(self):
-    assert self._bound
-    codecs.open = self._real_codecs_open
-    sys.modules['__builtin__'].open = self._real_open
-    os.path.abspath = self._real_abspath
-    os.path.exists = self._real_exists
-    os.walk = self._real_walk
-    os.listdir = self._real_listdir
-    self._bound = False
-
-  def AddFile(self, path, contents):
-    assert path not in self._file_contents
-    path = os.path.normpath(path)
-    self._file_contents[path] = contents
-
-  def _FakeOpen(self, path, mode=None):
-    if mode is None:
-      mode = 'r'
-    if mode == 'r' or mode == 'rU' or mode == 'rb':
-      if path not in self._file_contents:
-        return self._real_open(path, mode)
-      return WithableStringIO(self._file_contents[path])
-
-    raise NotImplementedError()
-
-  def _FakeCodecsOpen(self, path, mode=None,
-                      encoding=None):  # pylint: disable=unused-argument
-    if mode is None:
-      mode = 'r'
-    if mode == 'r' or mode == 'rU' or mode == 'rb':
-      if path not in self._file_contents:
-        return self._real_open(path, mode)
-      return WithableStringIO(self._file_contents[path])
-
-    raise NotImplementedError()
-
-  def _FakeAbspath(self, path):
-    """Normalize the path and ensure it starts with os.path.sep.
-
-    The tests all assume paths start with things like '/my/project',
-    and this abspath implementaion makes that assumption work correctly
-    on Windows.
-    """
-    normpath = os.path.normpath(path)
-    if not normpath.startswith(os.path.sep):
-      normpath = os.path.sep + normpath
-    return normpath
-
-  def _FakeExists(self, path):
-    if path in self._file_contents:
-      return True
-    return self._real_exists(path)
-
-  def _FakeWalk(self, top):
-    assert os.path.isabs(top)
-    all_filenames = list(self._file_contents.keys())
-    pending_prefixes = collections.deque()
-    pending_prefixes.append(top)
-    visited_prefixes = set()
-    while len(pending_prefixes):
-      prefix = pending_prefixes.popleft()
-      if prefix in visited_prefixes:
-        continue
-      visited_prefixes.add(prefix)
-      if prefix.endswith(os.path.sep):
-        prefix_with_trailing_sep = prefix
-      else:
-        prefix_with_trailing_sep = prefix + os.path.sep
-
-      dirs = set()
-      files = []
-      for filename in all_filenames:
-        if not filename.startswith(prefix_with_trailing_sep):
-          continue
-        relative_to_prefix = os.path.relpath(filename, prefix)
-
-        dirpart = os.path.dirname(relative_to_prefix)
-        if len(dirpart) == 0:
-          files.append(relative_to_prefix)
-          continue
-        parts = dirpart.split(os.sep)
-        if len(parts) == 0:
-          dirs.add(dirpart)
-        else:
-          pending = os.path.join(prefix, parts[0])
-          dirs.add(parts[0])
-          pending_prefixes.appendleft(pending)
-
-      dirs = sorted(dirs)
-      yield prefix, dirs, files
-
-  def _FakeListDir(self, dirname):
-    raise NotImplementedError()
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py
deleted file mode 100644
index 7e225f5..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/fake_fs_unittest.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-
-from py_vulcanize import fake_fs
-
-
-class FakeFSUnittest(unittest.TestCase):
-
-  def testBasic(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/blah/x', 'foobar')
-    with fs:
-      assert os.path.exists(os.path.normpath('/blah/x'))
-      self.assertEquals(
-          'foobar',
-          open(os.path.normpath('/blah/x'), 'r').read())
-
-  def testWithableOpen(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/blah/x', 'foobar')
-    with fs:
-      with open(os.path.normpath('/blah/x'), 'r') as f:
-        self.assertEquals('foobar', f.read())
-
-  def testWalk(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/x/w2/w3/z3.txt', '')
-    fs.AddFile('/x/w/z.txt', '')
-    fs.AddFile('/x/y.txt', '')
-    fs.AddFile('/a.txt', 'foobar')
-    with fs:
-      gen = os.walk(os.path.normpath('/'))
-      r = next(gen)
-      self.assertEquals((os.path.normpath('/'), ['x'], ['a.txt']), r)
-
-      r = next(gen)
-      self.assertEquals((os.path.normpath('/x'), ['w', 'w2'], ['y.txt']), r)
-
-      r = next(gen)
-      self.assertEquals((os.path.normpath('/x/w'), [], ['z.txt']), r)
-
-      r = next(gen)
-      self.assertEquals((os.path.normpath('/x/w2'), ['w3'], []), r)
-
-      r = next(gen)
-      self.assertEquals((os.path.normpath('/x/w2/w3'), [], ['z3.txt']), r)
-
-      self.assertRaises(StopIteration, gen.next)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/generate.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/generate.py
deleted file mode 100644
index 8af3731..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/generate.py
+++ /dev/null
@@ -1,301 +0,0 @@
-# Copyright (c) 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import os
-import subprocess
-import sys
-import tempfile
-
-from py_vulcanize import html_generation_controller
-
-try:
-  from six import StringIO
-except ImportError:
-  from io import StringIO
-
-
-
-html_warning_message = """
-
-
-<!--
-WARNING: This file is auto generated.
-
-         Do not edit directly.
--->
-"""
-
-js_warning_message = """
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/* WARNING: This file is auto generated.
- *
- * Do not edit directly.
- */
-"""
-
-css_warning_message = """
-/* Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* WARNING: This file is auto-generated.
- *
- * Do not edit directly.
- */
-"""
-
-origin_trial_tokens = [
-  # WebComponent V0 origin trial token for googleusercontent.com + subdomains.
-  # This is the domain from which traces in cloud storage are served.
-  # Expires Nov 5, 2020. See https://crbug.com/1021137
-  "AnYuQDtUf6OrWCmR9Okd67JhWVTbmnRedvPi1TEvAxac8+1p6o9q08FoDO6oCbLD0xEqev+SkZFiIhFSzlY9HgUAAABxeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXVzZXJjb250ZW50LmNvbTo0NDMiLCJmZWF0dXJlIjoiV2ViQ29tcG9uZW50c1YwIiwiZXhwaXJ5IjoxNjA0NjE0NTM4LCJpc1N1YmRvbWFpbiI6dHJ1ZX0=",
-  # This is for chromium-build-stats.appspot.com (ukai@)
-  # Expires Feb 2, 2021. see https://crbug.com/1050215
-  "AkFXw3wHnOs/XXYqFXpc3diDLrRFd9PTgGs/gs43haZmngI/u1g8L4bDnSKLZkB6fecjmjTwcAMQFCpWMAoHSQEAAAB8eyJvcmlnaW4iOiJodHRwczovL2Nocm9taXVtLWJ1aWxkLXN0YXRzLmFwcHNwb3QuY29tOjQ0MyIsImZlYXR1cmUiOiJXZWJDb21wb25lbnRzVjAiLCJleHBpcnkiOjE2MTIyMjM5OTksImlzU3ViZG9tYWluIjp0cnVlfQ==",
-  # This is for chromium-build-stats-staging.appspot.com (ukai@)
-  # Expires Feb 2, 2021, see https://crbug.com/1050215
-  "AtQY4wpX9+nj+Vn27cTgygzIPbtB2WoAoMQR5jK9mCm/H2gRIDH6MmGVAaziv9XnYTDKjhBnQYtecbTiIHCQiAIAAACEeyJvcmlnaW4iOiJodHRwczovL2Nocm9taXVtLWJ1aWxkLXN0YXRzLXN0YWdpbmcuYXBwc3BvdC5jb206NDQzIiwiZmVhdHVyZSI6IldlYkNvbXBvbmVudHNWMCIsImV4cGlyeSI6MTYxMjIyMzk5OSwiaXNTdWJkb21haW4iOnRydWV9"
-  #
-  # Add more tokens here if traces are served from other domains.
-  # WebComponent V0 origin tiral token is generated on
-  # https://developers.chrome.com/origintrials/#/trials/active
-]
-
-def _AssertIsUTF8(f):
-  if isinstance(f, StringIO):
-    return
-  assert f.encoding == 'utf-8'
-
-
-def _MinifyJS(input_js):
-  py_vulcanize_path = os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..'))
-  rjsmin_path = os.path.abspath(
-      os.path.join(py_vulcanize_path, 'third_party', 'rjsmin', 'rjsmin.py'))
-
-  with tempfile.NamedTemporaryFile() as _:
-    args = [
-        'python',
-        rjsmin_path
-    ]
-    p = subprocess.Popen(args,
-                         stdin=subprocess.PIPE,
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE)
-    res = p.communicate(input=input_js.encode('utf-8'))
-    errorcode = p.wait()
-    if errorcode != 0:
-      sys.stderr.write('rJSmin exited with error code %d' % errorcode)
-      sys.stderr.write(res[1])
-      raise Exception('Failed to minify, omgah')
-    return res[0].decode('utf-8')
-
-
-def GenerateJS(load_sequence,
-               use_include_tags_for_scripts=False,
-               dir_for_include_tag_root=None,
-               minify=False,
-               report_sizes=False):
-  f = StringIO()
-  GenerateJSToFile(f,
-                   load_sequence,
-                   use_include_tags_for_scripts,
-                   dir_for_include_tag_root,
-                   minify=minify,
-                   report_sizes=report_sizes)
-
-  return f.getvalue()
-
-
-def GenerateJSToFile(f,
-                     load_sequence,
-                     use_include_tags_for_scripts=False,
-                     dir_for_include_tag_root=None,
-                     minify=False,
-                     report_sizes=False):
-  _AssertIsUTF8(f)
-  if use_include_tags_for_scripts and dir_for_include_tag_root is None:
-    raise Exception('Must provide dir_for_include_tag_root')
-
-  f.write(js_warning_message)
-  f.write('\n')
-
-  if not minify:
-    flatten_to_file = f
-  else:
-    flatten_to_file = StringIO()
-
-  for module in load_sequence:
-    module.AppendJSContentsToFile(flatten_to_file,
-                                  use_include_tags_for_scripts,
-                                  dir_for_include_tag_root)
-  if minify:
-    js = flatten_to_file.getvalue()
-    minified_js = _MinifyJS(js)
-    f.write(minified_js)
-    f.write('\n')
-
-  if report_sizes:
-    for module in load_sequence:
-      s = StringIO()
-      module.AppendJSContentsToFile(s,
-                                    use_include_tags_for_scripts,
-                                    dir_for_include_tag_root)
-
-      # Add minified size info.
-      js = s.getvalue()
-      min_js_size = str(len(_MinifyJS(js)))
-
-      # Print names for this module. Some domain-specific simplifications
-      # are included to make pivoting more obvious.
-      parts = module.name.split('.')
-      if parts[:2] == ['base', 'ui']:
-        parts = ['base_ui'] + parts[2:]
-      if parts[:2] == ['tracing', 'importer']:
-        parts = ['importer'] + parts[2:]
-      tln = parts[0]
-      sln = '.'.join(parts[:2])
-
-      # Output
-      print(('%i\t%s\t%s\t%s\t%s' %
-             (len(js), min_js_size, module.name, tln, sln)))
-      sys.stdout.flush()
-
-
-class ExtraScript(object):
-
-  def __init__(self, script_id=None, text_content=None, content_type=None):
-    if script_id is not None:
-      assert script_id[0] != '#'
-    self.script_id = script_id
-    self.text_content = text_content
-    self.content_type = content_type
-
-  def WriteToFile(self, output_file):
-    _AssertIsUTF8(output_file)
-    attrs = []
-    if self.script_id:
-      attrs.append('id="%s"' % self.script_id)
-    if self.content_type:
-      attrs.append('content-type="%s"' % self.content_type)
-
-    if len(attrs) > 0:
-      output_file.write('<script %s>\n' % ' '.join(attrs))
-    else:
-      output_file.write('<script>\n')
-    if self.text_content:
-      output_file.write(self.text_content)
-    output_file.write('</script>\n')
-
-
-def _MinifyCSS(css_text):
-  py_vulcanize_path = os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..'))
-  rcssmin_path = os.path.abspath(
-      os.path.join(py_vulcanize_path, 'third_party', 'rcssmin', 'rcssmin.py'))
-
-  with tempfile.NamedTemporaryFile() as _:
-    rcssmin_args = ['python', rcssmin_path]
-    p = subprocess.Popen(rcssmin_args,
-                         stdin=subprocess.PIPE,
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE)
-    res = p.communicate(input=css_text)
-    errorcode = p.wait()
-    if errorcode != 0:
-      sys.stderr.write('rCSSmin exited with error code %d' % errorcode)
-      sys.stderr.write(res[1])
-      raise Exception('Failed to generate css for %s.' % css_text)
-    return res[0]
-
-
-def GenerateStandaloneHTMLAsString(*args, **kwargs):
-  f = StringIO()
-  GenerateStandaloneHTMLToFile(f, *args, **kwargs)
-  return f.getvalue()
-
-def _WriteOriginTrialTokens(output_file):
-  for token in origin_trial_tokens:
-    output_file.write('  <meta http-equiv="origin-trial" content="')
-    output_file.write(token)
-    output_file.write('">\n')
-
-def GenerateStandaloneHTMLToFile(output_file,
-                                 load_sequence,
-                                 title=None,
-                                 flattened_js_url=None,
-                                 extra_scripts=None,
-                                 minify=False,
-                                 report_sizes=False,
-                                 output_html_head_and_body=True):
-  """Writes a HTML file with the content of all modules in a load sequence.
-
-  The load_sequence is a list of (HTML or JS) Module objects; the order that
-  they're inserted into the file depends on their type and position in the load
-  sequence.
-  """
-  _AssertIsUTF8(output_file)
-  extra_scripts = extra_scripts or []
-
-  if output_html_head_and_body:
-    output_file.write(
-        '<!DOCTYPE html>\n'
-        '<html>\n'
-        '  <head i18n-values="dir:textdirection;">\n'
-        '  <meta http-equiv="Content-Type" content="text/html;'
-        'charset=utf-8">\n')
-    _WriteOriginTrialTokens(output_file)
-    if title:
-      output_file.write('  <title>%s</title>\n  ' % title)
-  else:
-    assert title is None
-
-  loader = load_sequence[0].loader
-
-  written_style_sheets = set()
-
-  class HTMLGenerationController(
-      html_generation_controller.HTMLGenerationController):
-
-    def __init__(self, module):
-      self.module = module
-
-    def GetHTMLForStylesheetHRef(self, href):
-      resource = self.module.HRefToResource(
-          href, '<link rel="stylesheet" href="%s">' % href)
-      style_sheet = loader.LoadStyleSheet(resource.name)
-
-      if style_sheet in written_style_sheets:
-        return None
-      written_style_sheets.add(style_sheet)
-
-      text = style_sheet.contents_with_inlined_images
-      if minify:
-        text = _MinifyCSS(text)
-      return '<style>\n%s\n</style>' % text
-
-  for module in load_sequence:
-    controller = HTMLGenerationController(module)
-    module.AppendHTMLContentsToFile(output_file, controller, minify=minify)
-
-  if flattened_js_url:
-    output_file.write('<script src="%s"></script>\n' % flattened_js_url)
-  else:
-    output_file.write('<script>\n')
-    js = GenerateJS(load_sequence, minify=minify, report_sizes=report_sizes)
-    output_file.write(js)
-    output_file.write('</script>\n')
-
-  for extra_script in extra_scripts:
-    extra_script.WriteToFile(output_file)
-
-  if output_html_head_and_body:
-    output_file.write('</head>\n  <body>\n  </body>\n</html>\n')
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py
deleted file mode 100644
index 1e83cb4..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/generate_unittest.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright (c) 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-
-from py_vulcanize import generate
-from py_vulcanize import fake_fs
-from py_vulcanize import project as project_module
-
-
-class GenerateTests(unittest.TestCase):
-
-  def setUp(self):
-    self.fs = fake_fs.FakeFS()
-    self.fs.AddFile(
-        '/x/foo/my_module.html',
-        ('<!DOCTYPE html>\n'
-         '<link rel="import" href="/foo/other_module.html">\n'))
-    self.fs.AddFile(
-        '/x/foo/other_module.html',
-        ('<!DOCTYPE html>\n'
-         '<script src="/foo/raw/raw_script.js"></script>\n'
-         '<script>\n'
-         '  \'use strict\';\n'
-         '  HelloWorld();\n'
-         '</script>\n'))
-    self.fs.AddFile('/x/foo/raw/raw_script.js', '\n/* raw script */\n')
-    self.fs.AddFile('/x/components/polymer/polymer.min.js', '\n')
-
-    self.fs.AddFile('/x/foo/external_script.js', 'External()')
-    self.fs.AddFile('/x/foo/inline_and_external_module.html',
-                    ('<!DOCTYPE html>\n'
-                    '<script>Script1()</script>'
-                    '<script src=/foo/external_script.js></script>'
-                    '<script>Script2()</script>'))
-
-    self.project = project_module.Project([os.path.normpath('/x')])
-
-  def testJSGeneration(self):
-    with self.fs:
-      load_sequence = self.project.CalcLoadSequenceForModuleNames(
-          [os.path.normpath('foo.my_module')])
-      generate.GenerateJS(load_sequence)
-
-  def testHTMLGeneration(self):
-    with self.fs:
-      load_sequence = self.project.CalcLoadSequenceForModuleNames(
-          [os.path.normpath('foo.my_module')])
-      result = generate.GenerateStandaloneHTMLAsString(load_sequence)
-      self.assertIn('HelloWorld();', result)
-
-  def testExtraScriptWithWriteContentsFunc(self):
-    with self.fs:
-      load_sequence = self.project.CalcLoadSequenceForModuleNames(
-          [os.path.normpath('foo.my_module')])
-
-      class ExtraScript(generate.ExtraScript):
-
-        def WriteToFile(self, f):
-          f.write('<script>ExtraScript!</script>')
-
-      result = generate.GenerateStandaloneHTMLAsString(
-          load_sequence, title='Title', extra_scripts=[ExtraScript()])
-      self.assertIn('ExtraScript', result)
-
-  def testScriptOrdering(self):
-    with self.fs:
-      load_sequence = self.project.CalcLoadSequenceForModuleNames(
-          [os.path.normpath('foo.inline_and_external_module')])
-      result = generate.GenerateStandaloneHTMLAsString(load_sequence)
-      script1_pos = result.index('Script1()')
-      script2_pos = result.index('Script2()')
-      external_pos = result.index('External()')
-      self.assertTrue(script1_pos < external_pos < script2_pos)
-
-  def testScriptOrderingWithIncludeTag(self):
-    with self.fs:
-      load_sequence = self.project.CalcLoadSequenceForModuleNames(
-          [os.path.normpath('foo.inline_and_external_module')])
-      result = generate.GenerateJS(load_sequence,
-                                   use_include_tags_for_scripts = True,
-      dir_for_include_tag_root='/x/')
-      script1_pos = result.index('Script1()')
-      script2_pos = result.index('Script2()')
-      external_path = os.path.join('foo', 'external_script.js')
-      external_pos = result.index('<include src="{0}">'.format(external_path))
-      self.assertTrue(script1_pos < external_pos < script2_pos)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py
deleted file mode 100644
index c804fe8..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/html_generation_controller.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import re
-from py_vulcanize import style_sheet
-
-
-class HTMLGenerationController(object):
-
-  def __init__(self):
-    self.current_module = None
-
-  def GetHTMLForStylesheetHRef(self, href):  # pylint: disable=unused-argument
-    return None
-
-  def GetHTMLForInlineStylesheet(self, contents):
-    if self.current_module is None:
-      if re.search('url\(.+\)', contents):
-        raise Exception(
-            'Default HTMLGenerationController cannot handle inline style urls')
-      return contents
-
-    module_dirname = os.path.dirname(self.current_module.resource.absolute_path)
-    ss = style_sheet.ParsedStyleSheet(
-        self.current_module.loader, module_dirname, contents)
-    return ss.contents_with_inlined_images
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/html_module.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/html_module.py
deleted file mode 100644
index 5e1c754..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/html_module.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import re
-
-from py_vulcanize import js_utils
-from py_vulcanize import module
-from py_vulcanize import parse_html_deps
-from py_vulcanize import style_sheet
-
-
-def IsHTMLResourceTheModuleGivenConflictingResourceNames(
-    js_resource, html_resource):  # pylint: disable=unused-argument
-  return 'polymer-element' in html_resource.contents
-
-
-class HTMLModule(module.Module):
-
-  @property
-  def _module_dir_name(self):
-    return os.path.dirname(self.resource.absolute_path)
-
-  def Parse(self, excluded_scripts):
-    try:
-      parser_results = parse_html_deps.HTMLModuleParser().Parse(self.contents)
-    except Exception as ex:
-      raise Exception('While parsing %s: %s' % (self.name, str(ex)))
-
-    self.dependency_metadata = Parse(self.loader,
-                                     self.name,
-                                     self._module_dir_name,
-                                     self.IsThirdPartyComponent(),
-                                     parser_results,
-                                     excluded_scripts)
-    self._parser_results = parser_results
-    self.scripts = parser_results.scripts
-
-  def Load(self, excluded_scripts):
-    super(HTMLModule, self).Load(excluded_scripts=excluded_scripts)
-
-    reachable_names = set([m.name
-                           for m in self.all_dependent_modules_recursive])
-    if 'tr.exportTo' in self.contents:
-      if 'tracing.base.base' not in reachable_names:
-        raise Exception('%s: Does not have a dependency on base' %
-                        os.path.relpath(self.resource.absolute_path))
-
-    for script in self.scripts:
-      if script.is_external:
-        if excluded_scripts and any(re.match(pattern, script.src) for
-            pattern in excluded_scripts):
-          continue
-
-        resource = _HRefToResource(self.loader, self.name, self._module_dir_name,
-                                   script.src,
-                                   tag_for_err_msg='<script src="%s">' % script.src)
-        path = resource.unix_style_relative_path
-        raw_script = self.loader.LoadRawScript(path)
-        self.dependent_raw_scripts.append(raw_script)
-        script.loaded_raw_script = raw_script
-
-  def GetTVCMDepsModuleType(self):
-    return 'py_vulcanize.HTML_MODULE_TYPE'
-
-  def AppendHTMLContentsToFile(self, f, ctl, minify=False):
-    super(HTMLModule, self).AppendHTMLContentsToFile(f, ctl)
-
-    ctl.current_module = self
-    try:
-      for piece in self._parser_results.YieldHTMLInPieces(ctl, minify=minify):
-        f.write(piece)
-    finally:
-      ctl.current_module = None
-
-  def HRefToResource(self, href, tag_for_err_msg):
-    return _HRefToResource(self.loader, self.name, self._module_dir_name,
-                           href, tag_for_err_msg)
-
-  def AppendDirectlyDependentFilenamesTo(
-      self, dependent_filenames, include_raw_scripts=True):
-    super(HTMLModule, self).AppendDirectlyDependentFilenamesTo(
-        dependent_filenames, include_raw_scripts)
-    for contents in self._parser_results.inline_stylesheets:
-      module_dirname = os.path.dirname(self.resource.absolute_path)
-      ss = style_sheet.ParsedStyleSheet(
-          self.loader, module_dirname, contents)
-      ss.AppendDirectlyDependentFilenamesTo(dependent_filenames)
-
-def _HRefToResource(
-    loader, module_name, module_dir_name, href, tag_for_err_msg):
-  if href[0] == '/':
-    resource = loader.FindResourceGivenRelativePath(
-        os.path.normpath(href[1:]))
-  else:
-    abspath = os.path.normpath(os.path.join(module_dir_name,
-                                            os.path.normpath(href)))
-    resource = loader.FindResourceGivenAbsolutePath(abspath)
-
-  if not resource:
-    raise module.DepsException(
-        'In %s, the %s cannot be loaded because '
-        'it is not in the search path' % (module_name, tag_for_err_msg))
-  try:
-    resource.contents
-  except:
-    raise module.DepsException('In %s, %s points at a nonexistent file ' % (
-        module_name, tag_for_err_msg))
-  return resource
-
-
-def Parse(loader, module_name, module_dir_name, is_component, parser_results,
-          exclude_scripts=None):
-  res = module.ModuleDependencyMetadata()
-  if is_component:
-    return res
-
-  # External script references.
-  for href in parser_results.scripts_external:
-    if exclude_scripts and any(re.match(pattern, href) for
-        pattern in exclude_scripts):
-      continue
-
-    resource = _HRefToResource(loader, module_name, module_dir_name,
-                               href,
-                               tag_for_err_msg='<script src="%s">' % href)
-    res.dependent_raw_script_relative_paths.append(
-        resource.unix_style_relative_path)
-
-  # External imports. Mostly the same as <script>, but we know its a module.
-  for href in parser_results.imports:
-    if exclude_scripts and any(re.match(pattern, href) for
-        pattern in exclude_scripts):
-      continue
-
-    if not href.endswith('.html'):
-      raise Exception(
-          'In %s, the <link rel="import" href="%s"> must point at a '
-          'file with an html suffix' % (module_name, href))
-
-    resource = _HRefToResource(
-        loader, module_name, module_dir_name, href,
-        tag_for_err_msg='<link rel="import" href="%s">' % href)
-    res.dependent_module_names.append(resource.name)
-
-  # Style sheets.
-  for href in parser_results.stylesheets:
-    resource = _HRefToResource(
-        loader, module_name, module_dir_name, href,
-        tag_for_err_msg='<link rel="stylesheet" href="%s">' % href)
-    res.style_sheet_names.append(resource.name)
-
-  return res
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py
deleted file mode 100644
index e8438f4..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/html_module_unittest.py
+++ /dev/null
@@ -1,325 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import os
-import unittest
-
-from py_vulcanize import fake_fs
-from py_vulcanize import generate
-from py_vulcanize import html_generation_controller
-from py_vulcanize import html_module
-from py_vulcanize import parse_html_deps
-from py_vulcanize import project as project_module
-from py_vulcanize import resource
-from py_vulcanize import resource_loader as resource_loader
-import six
-
-
-class ResourceWithFakeContents(resource.Resource):
-
-  def __init__(self, toplevel_dir, absolute_path, fake_contents):
-    """A resource with explicitly provided contents.
-
-    If the resource does not exist, then pass fake_contents=None. This will
-    cause accessing the resource contents to raise an exception mimicking the
-    behavior of regular resources."""
-    super(ResourceWithFakeContents, self).__init__(toplevel_dir, absolute_path)
-    self._fake_contents = fake_contents
-
-  @property
-  def contents(self):
-    if self._fake_contents is None:
-      raise Exception('File not found')
-    return self._fake_contents
-
-
-class FakeLoader(object):
-
-  def __init__(self, source_paths, initial_filenames_and_contents=None):
-    self._source_paths = source_paths
-    self._file_contents = {}
-    if initial_filenames_and_contents:
-      for k, v in six.iteritems(initial_filenames_and_contents):
-        self._file_contents[k] = v
-
-  def FindResourceGivenAbsolutePath(self, absolute_path):
-    candidate_paths = []
-    for source_path in self._source_paths:
-      if absolute_path.startswith(source_path):
-        candidate_paths.append(source_path)
-    if len(candidate_paths) == 0:
-      return None
-
-    # Sort by length. Longest match wins.
-    candidate_paths.sort(lambda x, y: len(x) - len(y))
-    longest_candidate = candidate_paths[-1]
-
-    return ResourceWithFakeContents(
-        longest_candidate, absolute_path,
-        self._file_contents.get(absolute_path, None))
-
-  def FindResourceGivenRelativePath(self, relative_path):
-    absolute_path = None
-    for script_path in self._source_paths:
-      absolute_path = os.path.join(script_path, relative_path)
-      if absolute_path in self._file_contents:
-        return ResourceWithFakeContents(script_path, absolute_path,
-                                        self._file_contents[absolute_path])
-    return None
-
-
-class ParseTests(unittest.TestCase):
-
-  def testValidExternalScriptReferenceToRawScript(self):
-    parse_results = parse_html_deps.HTMLModuleParserResults("""<!DOCTYPE html>
-      <script src="../foo.js">
-      """)
-
-    file_contents = {}
-    file_contents[os.path.normpath('/tmp/a/foo.js')] = """
-'i am just some raw script';
-"""
-
-    metadata = html_module.Parse(
-        FakeLoader([os.path.normpath('/tmp')], file_contents),
-        'a.b.start',
-        '/tmp/a/b/',
-        is_component=False,
-        parser_results=parse_results)
-    self.assertEquals([], metadata.dependent_module_names)
-    self.assertEquals(
-        ['a/foo.js'], metadata.dependent_raw_script_relative_paths)
-
-  def testExternalScriptReferenceToModuleOutsideScriptPath(self):
-    parse_results = parse_html_deps.HTMLModuleParserResults("""<!DOCTYPE html>
-      <script src="/foo.js">
-      """)
-
-    file_contents = {}
-    file_contents[os.path.normpath('/foo.js')] = ''
-
-    def DoIt():
-      html_module.Parse(FakeLoader([os.path.normpath('/tmp')], file_contents),
-                        'a.b.start',
-                        '/tmp/a/b/',
-                        is_component=False,
-                        parser_results=parse_results)
-    self.assertRaises(Exception, DoIt)
-
-  def testExternalScriptReferenceToFileThatDoesntExist(self):
-    parse_results = parse_html_deps.HTMLModuleParserResults("""<!DOCTYPE html>
-      <script src="/foo.js">
-      """)
-
-    file_contents = {}
-
-    def DoIt():
-      html_module.Parse(FakeLoader([os.path.normpath('/tmp')], file_contents),
-                        'a.b.start',
-                        '/tmp/a/b/',
-                        is_component=False,
-                        parser_results=parse_results)
-    self.assertRaises(Exception, DoIt)
-
-  def testValidImportOfModule(self):
-    parse_results = parse_html_deps.HTMLModuleParserResults("""<!DOCTYPE html>
-      <link rel="import" href="../foo.html">
-      """)
-
-    file_contents = {}
-    file_contents[os.path.normpath('/tmp/a/foo.html')] = """
-"""
-
-    metadata = html_module.Parse(
-        FakeLoader([os.path.normpath('/tmp')], file_contents),
-        'a.b.start',
-        '/tmp/a/b/',
-        is_component=False,
-        parser_results=parse_results)
-    self.assertEquals(['a.foo'], metadata.dependent_module_names)
-
-  def testStyleSheetImport(self):
-    parse_results = parse_html_deps.HTMLModuleParserResults("""<!DOCTYPE html>
-      <link rel="stylesheet" href="../foo.css">
-      """)
-
-    file_contents = {}
-    file_contents[os.path.normpath('/tmp/a/foo.css')] = """
-"""
-    metadata = html_module.Parse(
-        FakeLoader([os.path.normpath('/tmp')], file_contents),
-        'a.b.start',
-        '/tmp/a/b/',
-        is_component=False,
-        parser_results=parse_results)
-    self.assertEquals([], metadata.dependent_module_names)
-    self.assertEquals(['a.foo'], metadata.style_sheet_names)
-
-  def testUsingAbsoluteHref(self):
-    parse_results = parse_html_deps.HTMLModuleParserResults("""<!DOCTYPE html>
-      <script src="/foo.js">
-      """)
-
-    file_contents = {}
-    file_contents[os.path.normpath('/src/foo.js')] = ''
-
-    metadata = html_module.Parse(
-        FakeLoader([os.path.normpath("/tmp"), os.path.normpath("/src")],
-                   file_contents),
-        "a.b.start",
-        "/tmp/a/b/",
-        is_component=False,
-        parser_results=parse_results)
-    self.assertEquals(['foo.js'], metadata.dependent_raw_script_relative_paths)
-
-
-class HTMLModuleTests(unittest.TestCase):
-
-  def testBasicModuleGeneration(self):
-    file_contents = {}
-    file_contents[os.path.normpath('/tmp/a/b/start.html')] = """
-<!DOCTYPE html>
-<link rel="import" href="/widget.html">
-<link rel="stylesheet" href="../common.css">
-<script src="/raw_script.js"></script>
-<script src="/excluded_script.js"></script>
-<dom-module id="start">
-  <template>
-  </template>
-  <script>
-    'use strict';
-    console.log('inline script for start.html got written');
-  </script>
-</dom-module>
-"""
-    file_contents[os.path.normpath('/py_vulcanize/py_vulcanize.html')] = """<!DOCTYPE html>
-"""
-    file_contents[os.path.normpath('/components/widget.html')] = """
-<!DOCTYPE html>
-<link rel="import" href="/py_vulcanize.html">
-<widget name="widget.html"></widget>
-<script>
-'use strict';
-console.log('inline script for widget.html');
-</script>
-"""
-    file_contents[os.path.normpath('/tmp/a/common.css')] = """
-/* /tmp/a/common.css was written */
-"""
-    file_contents[os.path.normpath('/raw/raw_script.js')] = """
-console.log('/raw/raw_script.js was written');
-"""
-    file_contents[os.path.normpath(
-        '/raw/components/polymer/polymer.min.js')] = """
-"""
-
-    with fake_fs.FakeFS(file_contents):
-      project = project_module.Project(
-          [os.path.normpath('/py_vulcanize/'),
-           os.path.normpath('/tmp/'),
-           os.path.normpath('/components/'),
-           os.path.normpath('/raw/')])
-      loader = resource_loader.ResourceLoader(project)
-      a_b_start_module = loader.LoadModule(
-          module_name='a.b.start', excluded_scripts=['\/excluded_script.js'])
-      load_sequence = project.CalcLoadSequenceForModules([a_b_start_module])
-
-      # Check load sequence names.
-      load_sequence_names = [x.name for x in load_sequence]
-      self.assertEquals(['py_vulcanize',
-                         'widget',
-                         'a.b.start'], load_sequence_names)
-
-      # Check module_deps on a_b_start_module
-      def HasDependentModule(module, name):
-        return [x for x in module.dependent_modules
-                if x.name == name]
-      assert HasDependentModule(a_b_start_module, 'widget')
-
-      # Check JS generation.
-      js = generate.GenerateJS(load_sequence)
-      assert 'inline script for start.html' in js
-      assert 'inline script for widget.html' in js
-      assert '/raw/raw_script.js' in js
-      assert 'excluded_script.js' not in js
-
-      # Check HTML generation.
-      html = generate.GenerateStandaloneHTMLAsString(
-          load_sequence, title='', flattened_js_url='/blah.js')
-      assert '<dom-module id="start">' in html
-      assert 'inline script for widget.html' not in html
-      assert 'common.css' in html
-
-  def testPolymerConversion(self):
-    file_contents = {}
-    file_contents[os.path.normpath('/tmp/a/b/my_component.html')] = """
-<!DOCTYPE html>
-<dom-module id="my-component">
-  <template>
-  </template>
-  <script>
-    'use strict';
-    Polymer ( {
-      is: "my-component"
-    });
-  </script>
-</dom-module>
-"""
-    with fake_fs.FakeFS(file_contents):
-      project = project_module.Project([
-          os.path.normpath('/py_vulcanize/'), os.path.normpath('/tmp/')])
-      loader = resource_loader.ResourceLoader(project)
-      my_component = loader.LoadModule(module_name='a.b.my_component')
-
-      f = six.StringIO()
-      my_component.AppendJSContentsToFile(
-          f,
-          use_include_tags_for_scripts=False,
-          dir_for_include_tag_root=None)
-      js = f.getvalue().rstrip()
-      expected_js = """
-    'use strict';
-    Polymer ( {
-      is: "my-component"
-    });
-""".rstrip()
-      self.assertEquals(expected_js, js)
-
-  def testInlineStylesheetURLs(self):
-    file_contents = {}
-    file_contents[os.path.normpath('/tmp/a/b/my_component.html')] = """
-<!DOCTYPE html>
-<style>
-.some-rule {
-    background-image: url('../something.jpg');
-}
-</style>
-"""
-    file_contents[os.path.normpath('/tmp/a/something.jpg')] = 'jpgdata'
-    with fake_fs.FakeFS(file_contents):
-      project = project_module.Project([
-          os.path.normpath('/py_vulcanize/'), os.path.normpath('/tmp/')])
-      loader = resource_loader.ResourceLoader(project)
-      my_component = loader.LoadModule(module_name='a.b.my_component')
-
-      computed_deps = []
-      my_component.AppendDirectlyDependentFilenamesTo(computed_deps)
-      self.assertEquals(set(computed_deps),
-                        set([os.path.normpath('/tmp/a/b/my_component.html'),
-                             os.path.normpath('/tmp/a/something.jpg')]))
-
-      f = six.StringIO()
-      ctl = html_generation_controller.HTMLGenerationController()
-      my_component.AppendHTMLContentsToFile(f, ctl)
-      html = f.getvalue().rstrip()
-      # FIXME: This is apparently not used.
-      expected_html = """
-.some-rule {
-    background-image: url(data:image/jpg;base64,anBnZGF0YQ==);
-}
-""".rstrip()
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/js_utils.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/js_utils.py
deleted file mode 100644
index 6e6ca9d..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/js_utils.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-def EscapeJSIfNeeded(js):
-  return js.replace('</script>', '<\/script>')
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py
deleted file mode 100644
index cb8025c..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/js_utils_unittest.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from py_vulcanize import js_utils
-
-
-class ValidateStrictModeTests(unittest.TestCase):
-
-  def testEscapeJSIfNeeded(self):
-    self.assertEqual(
-        '<script>var foo;<\/script>',
-        js_utils.EscapeJSIfNeeded('<script>var foo;</script>'))
-    self.assertEqual(
-        '<script>var foo;<\/script>',
-        js_utils.EscapeJSIfNeeded('<script>var foo;<\/script>'))
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/module.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/module.py
deleted file mode 100644
index d27f350..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/module.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""This module contains the Module class and other classes for resources.
-
-The Module class represents a module in the trace viewer system. A module has
-a name, and may require a variety of other resources, such as stylesheets,
-template objects, raw JavaScript, or other modules.
-
-Other resources include HTML templates, raw JavaScript files, and stylesheets.
-"""
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import codecs
-import inspect
-import os
-
-from py_vulcanize import js_utils
-import six
-
-
-class DepsException(Exception):
-  """Exceptions related to module dependency resolution."""
-
-  def __init__(self, fmt, *args):
-    from py_vulcanize import style_sheet as style_sheet_module
-    context = []
-    frame = inspect.currentframe()
-    while frame:
-      frame_locals = frame.f_locals
-
-      module_name = None
-      if 'self' in frame_locals:
-        s = frame_locals['self']
-        if isinstance(s, Module):
-          module_name = s.name
-        if isinstance(s, style_sheet_module.StyleSheet):
-          module_name = s.name + '.css'
-      if not module_name:
-        if 'module' in frame_locals:
-          module = frame_locals['module']
-          if isinstance(s, Module):
-            module_name = module.name
-        elif 'm' in frame_locals:
-          module = frame_locals['m']
-          if isinstance(s, Module):
-            module_name = module.name
-
-      if module_name:
-        if len(context):
-          if context[-1] != module_name:
-            context.append(module_name)
-        else:
-          context.append(module_name)
-
-      frame = frame.f_back
-
-    context.reverse()
-    self.context = context
-    context_str = '\n'.join('  %s' % x for x in context)
-    Exception.__init__(
-        self, 'While loading:\n%s\nGot: %s' % (context_str, (fmt % args)))
-
-
-class ModuleDependencyMetadata(object):
-
-  def __init__(self):
-    self.dependent_module_names = []
-    self.dependent_raw_script_relative_paths = []
-    self.style_sheet_names = []
-
-  def AppendMetdata(self, other):
-    self.dependent_module_names += other.dependent_module_names
-    self.dependent_raw_script_relative_paths += \
-        other.dependent_raw_script_relative_paths
-    self.style_sheet_names += other.style_sheet_names
-
-
-_next_module_id = 1
-
-
-class Module(object):
-  """Represents a JavaScript module.
-
-  Interesting properties include:
-    name: Module name, may include a namespace, e.g. 'py_vulcanize.foo'.
-    filename: The filename of the actual module.
-    contents: The text contents of the module.
-    dependent_modules: Other modules that this module depends on.
-
-  In addition to these properties, a Module also contains lists of other
-  resources that it depends on.
-  """
-
-  def __init__(self, loader, name, resource, load_resource=True):
-    assert isinstance(name, six.string_types), 'Got %s instead' % repr(name)
-
-    global _next_module_id
-    self._id = _next_module_id
-    _next_module_id += 1
-
-    self.loader = loader
-    self.name = name
-    self.resource = resource
-
-    if load_resource:
-      f = codecs.open(self.filename, mode='r', encoding='utf-8')
-      self.contents = f.read()
-      f.close()
-    else:
-      self.contents = None
-
-    # Dependency metadata, set up during Parse().
-    self.dependency_metadata = None
-
-    # Actual dependencies, set up during load().
-    self.dependent_modules = []
-    self.dependent_raw_scripts = []
-    self.scripts = []
-    self.style_sheets = []
-
-    # Caches.
-    self._all_dependent_modules_recursive = None
-
-  def __repr__(self):
-    return '%s(%s)' % (self.__class__.__name__, self.name)
-
-  @property
-  def id(self):
-    return self._id
-
-  @property
-  def filename(self):
-    return self.resource.absolute_path
-
-  def IsThirdPartyComponent(self):
-    """Checks whether this module is a third-party Polymer component."""
-    if os.path.join('third_party', 'components') in self.filename:
-      return True
-    if os.path.join('third_party', 'polymer', 'components') in self.filename:
-      return True
-    return False
-
-  def Parse(self, excluded_scripts):
-    """Parses self.contents and fills in the module's dependency metadata."""
-    raise NotImplementedError()
-
-  def GetTVCMDepsModuleType(self):
-    """Returns the py_vulcanize.setModuleInfo type for this module"""
-    raise NotImplementedError()
-
-  def AppendJSContentsToFile(self,
-                             f,
-                             use_include_tags_for_scripts,
-                             dir_for_include_tag_root):
-    """Appends the js for this module to the provided file."""
-    for script in self.scripts:
-      script.AppendJSContentsToFile(f, use_include_tags_for_scripts,
-                                    dir_for_include_tag_root)
-
-  def AppendHTMLContentsToFile(self, f, ctl, minify=False):
-    """Appends the HTML for this module [without links] to the provided file."""
-    pass
-
-  def Load(self, excluded_scripts=None):
-    """Loads the sub-resources that this module depends on from its dependency
-    metadata.
-
-    Raises:
-      DepsException: There was a problem finding one of the dependencies.
-      Exception: There was a problem parsing a module that this one depends on.
-    """
-    assert self.name, 'Module name must be set before dep resolution.'
-    assert self.filename, 'Module filename must be set before dep resolution.'
-    assert self.name in self.loader.loaded_modules, (
-        'Module must be registered in resource loader before loading.')
-
-    metadata = self.dependency_metadata
-    for name in metadata.dependent_module_names:
-      module = self.loader.LoadModule(module_name=name,
-                                      excluded_scripts=excluded_scripts)
-      self.dependent_modules.append(module)
-
-    for name in metadata.style_sheet_names:
-      style_sheet = self.loader.LoadStyleSheet(name)
-      self.style_sheets.append(style_sheet)
-
-  @property
-  def all_dependent_modules_recursive(self):
-    if self._all_dependent_modules_recursive:
-      return self._all_dependent_modules_recursive
-
-    self._all_dependent_modules_recursive = set(self.dependent_modules)
-    for dependent_module in self.dependent_modules:
-      self._all_dependent_modules_recursive.update(
-          dependent_module.all_dependent_modules_recursive)
-    return self._all_dependent_modules_recursive
-
-  def ComputeLoadSequenceRecursive(self, load_sequence, already_loaded_set,
-                                   depth=0):
-    """Recursively builds up a load sequence list.
-
-    Args:
-      load_sequence: A list which will be incrementally built up.
-      already_loaded_set: A set of modules that has already been added to the
-          load sequence list.
-      depth: The depth of recursion. If it too deep, that indicates a loop.
-    """
-    if depth > 32:
-      raise Exception('Include loop detected on %s', self.name)
-    for dependent_module in self.dependent_modules:
-      if dependent_module.name in already_loaded_set:
-        continue
-      dependent_module.ComputeLoadSequenceRecursive(
-          load_sequence, already_loaded_set, depth + 1)
-    if self.name not in already_loaded_set:
-      already_loaded_set.add(self.name)
-      load_sequence.append(self)
-
-  def GetAllDependentFilenamesRecursive(self, include_raw_scripts=True):
-    dependent_filenames = []
-
-    visited_modules = set()
-
-    def Get(module):
-      module.AppendDirectlyDependentFilenamesTo(
-          dependent_filenames, include_raw_scripts)
-      visited_modules.add(module)
-      for m in module.dependent_modules:
-        if m in visited_modules:
-          continue
-        Get(m)
-
-    Get(self)
-    return dependent_filenames
-
-  def AppendDirectlyDependentFilenamesTo(
-      self, dependent_filenames, include_raw_scripts=True):
-    dependent_filenames.append(self.resource.absolute_path)
-    if include_raw_scripts:
-      for raw_script in self.dependent_raw_scripts:
-        dependent_filenames.append(raw_script.resource.absolute_path)
-    for style_sheet in self.style_sheets:
-      style_sheet.AppendDirectlyDependentFilenamesTo(dependent_filenames)
-
-
-class RawScript(object):
-  """Represents a raw script resource referenced by a module via the
-  py_vulcanize.requireRawScript(xxx) directive."""
-
-  def __init__(self, resource):
-    self.resource = resource
-
-  @property
-  def filename(self):
-    return self.resource.absolute_path
-
-  @property
-  def contents(self):
-    return self.resource.contents
-
-  def __repr__(self):
-    return 'RawScript(%s)' % self.filename
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py
deleted file mode 100644
index ed92db3..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/module_unittest.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Tests for the module module, which contains Module and related classes."""
-
-import os
-import unittest
-
-from py_vulcanize import fake_fs
-from py_vulcanize import module
-from py_vulcanize import resource_loader
-from py_vulcanize import project as project_module
-
-
-class ModuleIntegrationTests(unittest.TestCase):
-
-  def test_module(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/src/x.html', """
-<!DOCTYPE html>
-<link rel="import" href="/y.html">
-<link rel="import" href="/z.html">
-<script>
-'use strict';
-</script>
-""")
-    fs.AddFile('/src/y.html', """
-<!DOCTYPE html>
-<link rel="import" href="/z.html">
-""")
-    fs.AddFile('/src/z.html', """
-<!DOCTYPE html>
-""")
-    fs.AddFile('/src/py_vulcanize.html', '<!DOCTYPE html>')
-    with fs:
-      project = project_module.Project([os.path.normpath('/src/')])
-      loader = resource_loader.ResourceLoader(project)
-      x_module = loader.LoadModule('x')
-
-      self.assertEquals([loader.loaded_modules['y'],
-                         loader.loaded_modules['z']],
-                        x_module.dependent_modules)
-
-      already_loaded_set = set()
-      load_sequence = []
-      x_module.ComputeLoadSequenceRecursive(load_sequence, already_loaded_set)
-
-      self.assertEquals([loader.loaded_modules['z'],
-                         loader.loaded_modules['y'],
-                         x_module],
-                        load_sequence)
-
-  def testBasic(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/x/src/my_module.html', """
-<!DOCTYPE html>
-<link rel="import" href="/py_vulcanize/foo.html">
-});
-""")
-    fs.AddFile('/x/py_vulcanize/foo.html', """
-<!DOCTYPE html>
-});
-""")
-    project = project_module.Project([os.path.normpath('/x')])
-    loader = resource_loader.ResourceLoader(project)
-    with fs:
-      my_module = loader.LoadModule(module_name='src.my_module')
-      dep_names = [x.name for x in my_module.dependent_modules]
-      self.assertEquals(['py_vulcanize.foo'], dep_names)
-
-  def testDepsExceptionContext(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/x/src/my_module.html', """
-<!DOCTYPE html>
-<link rel="import" href="/py_vulcanize/foo.html">
-""")
-    fs.AddFile('/x/py_vulcanize/foo.html', """
-<!DOCTYPE html>
-<link rel="import" href="missing.html">
-""")
-    project = project_module.Project([os.path.normpath('/x')])
-    loader = resource_loader.ResourceLoader(project)
-    with fs:
-      exc = None
-      try:
-        loader.LoadModule(module_name='src.my_module')
-        assert False, 'Expected an exception'
-      except module.DepsException as e:
-        exc = e
-      self.assertEquals(
-          ['src.my_module', 'py_vulcanize.foo'],
-          exc.context)
-
-  def testGetAllDependentFilenamesRecursive(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/x/y/z/foo.html', """
-<!DOCTYPE html>
-<link rel="import" href="/z/foo2.html">
-<link rel="stylesheet" href="/z/foo.css">
-<script src="/bar.js"></script>
-""")
-    fs.AddFile('/x/y/z/foo.css', """
-.x .y {
-    background-image: url(foo.jpeg);
-}
-""")
-    fs.AddFile('/x/y/z/foo.jpeg', '')
-    fs.AddFile('/x/y/z/foo2.html', """
-<!DOCTYPE html>
-""")
-    fs.AddFile('/x/raw/bar.js', 'hello')
-    project = project_module.Project([
-        os.path.normpath('/x/y'), os.path.normpath('/x/raw/')])
-    loader = resource_loader.ResourceLoader(project)
-    with fs:
-      my_module = loader.LoadModule(module_name='z.foo')
-      self.assertEquals(1, len(my_module.dependent_raw_scripts))
-
-      dependent_filenames = my_module.GetAllDependentFilenamesRecursive()
-      self.assertEquals(
-          [
-              os.path.normpath('/x/y/z/foo.html'),
-              os.path.normpath('/x/raw/bar.js'),
-              os.path.normpath('/x/y/z/foo.css'),
-              os.path.normpath('/x/y/z/foo.jpeg'),
-              os.path.normpath('/x/y/z/foo2.html'),
-          ],
-          dependent_filenames)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py
deleted file mode 100644
index 88ce218..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps.py
+++ /dev/null
@@ -1,288 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-
-import os
-import sys
-
-from py_vulcanize import html_generation_controller
-from py_vulcanize import js_utils
-from py_vulcanize import module
-from py_vulcanize import strip_js_comments
-import six
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-def _InitBeautifulSoup():
-  catapult_path = os.path.abspath(
-      os.path.join(os.path.dirname(__file__),
-                   os.path.pardir, os.path.pardir, os.path.pardir))
-  bs_path = os.path.join(catapult_path, 'third_party', 'beautifulsoup4')
-  _AddToPathIfNeeded(bs_path)
-
-  html5lib_path = os.path.join(catapult_path, 'third_party', 'html5lib-python')
-  _AddToPathIfNeeded(html5lib_path)
-
-  six_path = os.path.join(catapult_path, 'third_party', 'six')
-  _AddToPathIfNeeded(six_path)
-
-
-_InitBeautifulSoup()
-import bs4
-
-class Script(object):
-
-  def __init__(self, soup):
-    if not soup:
-      raise module.DepsException('Script object created without soup')
-    self._soup = soup
-
-  def AppendJSContentsToFile(self, f, *args, **kwargs):
-    raise NotImplementedError()
-
-class InlineScript(Script):
-
-  def __init__(self, soup):
-    super(InlineScript, self).__init__(soup)
-    self._stripped_contents = None
-    self._open_tags = None
-    self.is_external = False
-
-  @property
-  def contents(self):
-    return six.text_type(self._soup.string)
-
-  @property
-  def stripped_contents(self):
-    if not self._stripped_contents:
-      self._stripped_contents = strip_js_comments.StripJSComments(
-          self.contents)
-    return self._stripped_contents
-
-  @property
-  def open_tags(self):
-    if self._open_tags:
-      return self._open_tags
-    open_tags = []
-    cur = self._soup.parent
-    while cur:
-      if isinstance(cur, bs4.BeautifulSoup):
-        break
-
-      open_tags.append(_Tag(cur.name, cur.attrs))
-      cur = cur.parent
-
-    open_tags.reverse()
-    assert open_tags[-1].tag == 'script'
-    del open_tags[-1]
-
-    self._open_tags = open_tags
-    return self._open_tags
-
-  def AppendJSContentsToFile(self, f, *args, **kwargs):
-    js = self.contents
-    escaped_js = js_utils.EscapeJSIfNeeded(js)
-    f.write(escaped_js)
-    f.write('\n')
-
-class ExternalScript(Script):
-
-  def __init__(self, soup):
-    super(ExternalScript, self).__init__(soup)
-    if 'src' not in soup.attrs:
-      raise Exception("{0} is not an external script.".format(soup))
-    self.is_external = True
-    self._loaded_raw_script = None
-
-  @property
-  def loaded_raw_script(self):
-    if self._loaded_raw_script:
-      return self._loaded_raw_script
-
-    return None
-
-  @loaded_raw_script.setter
-  def loaded_raw_script(self, value):
-    self._loaded_raw_script = value
-
-  @property
-  def src(self):
-    return self._soup.attrs['src']
-
-  def AppendJSContentsToFile(self,
-                             f,
-                             use_include_tags_for_scripts,
-                             dir_for_include_tag_root):
-    raw_script = self.loaded_raw_script
-    if not raw_script:
-      return
-
-    if use_include_tags_for_scripts:
-      rel_filename = os.path.relpath(raw_script.filename,
-                                    dir_for_include_tag_root)
-      f.write("""<include src="%s">\n""" % rel_filename)
-    else:
-      f.write(js_utils.EscapeJSIfNeeded(raw_script.contents))
-      f.write('\n')
-
-def _CreateSoupWithoutHeadOrBody(html):
-  soupCopy = bs4.BeautifulSoup(html, 'html5lib')
-  soup = bs4.BeautifulSoup()
-  soup.reset()
-  if soupCopy.head:
-    for n in soupCopy.head.contents:
-      n.extract()
-      soup.append(n)
-  if soupCopy.body:
-    for n in soupCopy.body.contents:
-      n.extract()
-      soup.append(n)
-  return soup
-
-
-class HTMLModuleParserResults(object):
-
-  def __init__(self, html):
-    self._soup = bs4.BeautifulSoup(html, 'html5lib')
-    self._inline_scripts = None
-    self._scripts = None
-
-  @property
-  def scripts_external(self):
-    tags = self._soup.findAll('script', src=True)
-    return [t['src'] for t in tags]
-
-  @property
-  def inline_scripts(self):
-    if not self._inline_scripts:
-      tags = self._soup.findAll('script', src=None)
-      self._inline_scripts = [InlineScript(t.string) for t in tags]
-    return self._inline_scripts
-
-  @property
-  def scripts(self):
-    if not self._scripts:
-      self._scripts = []
-      script_elements = self._soup.findAll('script')
-      for element in script_elements:
-        if 'src' in element.attrs:
-          self._scripts.append(ExternalScript(element))
-        else:
-          self._scripts.append(InlineScript(element))
-    return self._scripts
-
-  @property
-  def imports(self):
-    tags = self._soup.findAll('link', rel='import')
-    return [t['href'] for t in tags]
-
-  @property
-  def stylesheets(self):
-    tags = self._soup.findAll('link', rel='stylesheet')
-    return [t['href'] for t in tags]
-
-  @property
-  def inline_stylesheets(self):
-    tags = self._soup.findAll('style')
-    return [six.text_type(t.string) for t in tags]
-
-  def YieldHTMLInPieces(self, controller, minify=False):
-    yield self.GenerateHTML(controller, minify)
-
-  def GenerateHTML(self, controller, minify=False, prettify=False):
-    soup = _CreateSoupWithoutHeadOrBody(six.text_type(self._soup))
-
-    # Remove declaration.
-    for x in soup.contents:
-      if isinstance(x, bs4.Doctype):
-        x.extract()
-
-    # Remove declaration.
-    for x in soup.contents:
-      if isinstance(x, bs4.Declaration):
-        x.extract()
-
-    # Remove all imports.
-    imports = soup.findAll('link', rel='import')
-    for imp in imports:
-      imp.extract()
-
-    # Remove all script links.
-    scripts_external = soup.findAll('script', src=True)
-    for script in scripts_external:
-      script.extract()
-
-    # Remove all in-line scripts.
-    scripts_external = soup.findAll('script', src=None)
-    for script in scripts_external:
-      script.extract()
-
-    # Process all in-line styles.
-    inline_styles = soup.findAll('style')
-    for style in inline_styles:
-      html = controller.GetHTMLForInlineStylesheet(six.text_type(style.string))
-      if html:
-        ns = soup.new_tag('style')
-        ns.append(bs4.NavigableString(html))
-        style.replaceWith(ns)
-      else:
-        style.extract()
-
-    # Rewrite all external stylesheet hrefs or remove, as needed.
-    stylesheet_links = soup.findAll('link', rel='stylesheet')
-    for stylesheet_link in stylesheet_links:
-      html = controller.GetHTMLForStylesheetHRef(stylesheet_link['href'])
-      if html:
-        tmp = bs4.BeautifulSoup(html, 'html5lib').findAll('style')
-        assert len(tmp) == 1
-        stylesheet_link.replaceWith(tmp[0])
-      else:
-        stylesheet_link.extract()
-
-    # Remove comments if minifying.
-    if minify:
-      comments = soup.findAll(
-          text=lambda text: isinstance(text, bs4.Comment))
-      for comment in comments:
-        comment.extract()
-    if prettify:
-      return soup.prettify('utf-8').strip()
-
-    # We are done.
-    return six.text_type(soup).strip()
-
-  @property
-  def html_contents_without_links_and_script(self):
-    return self.GenerateHTML(
-        html_generation_controller.HTMLGenerationController())
-
-
-class _Tag(object):
-
-  def __init__(self, tag, attrs):
-    self.tag = tag
-    self.attrs = attrs
-
-  def __repr__(self):
-    attr_string = ' '.join('%s="%s"' % (x[0], x[1]) for x in self.attrs)
-    return '<%s %s>' % (self.tag, attr_string)
-
-
-class HTMLModuleParser():
-
-  def Parse(self, html):
-    if html is None:
-      html = ''
-    else:
-      if html.find('< /script>') != -1:
-        raise Exception('Escape script tags with <\/script>')
-
-    return HTMLModuleParserResults(html)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py
deleted file mode 100755
index 2a30a29..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/parse_html_deps_unittest.py
+++ /dev/null
@@ -1,292 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import re
-import unittest
-
-from py_vulcanize import parse_html_deps
-from py_vulcanize import html_generation_controller
-
-
-class ParseTests(unittest.TestCase):
-
-  def test_parse_empty(self):
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse('')
-    self.assertEquals([], module.scripts_external)
-    self.assertEquals([], module.inline_scripts)
-    self.assertEquals([], module.stylesheets)
-    self.assertEquals([], module.imports)
-
-  def test_parse_none(self):
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(None)
-    self.assertEquals([], module.scripts_external)
-    self.assertEquals([], module.inline_scripts)
-    self.assertEquals([], module.stylesheets)
-    self.assertEquals([], module.imports)
-
-  def test_parse_script_src_basic(self):
-    html = """<!DOCTYPE html>
-              <html>
-                <head>
-                  <script src="polymer.min.js"></script>
-                  <script src="foo.js"></script>
-                </head>
-                <body>
-                </body>
-              </html>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals(['polymer.min.js', 'foo.js'], module.scripts_external)
-    self.assertEquals([], module.inline_scripts)
-    self.assertEquals([], module.stylesheets)
-    self.assertEquals([], module.imports)
-    self.assertNotIn(
-        'DOCTYPE html',
-        module.html_contents_without_links_and_script)
-
-  def test_parse_link_rel_import(self):
-    html = """<!DOCTYPE html>
-              <html>
-                <head>
-                  <link rel="import" href="x-foo.html">
-                </head>
-                <body>
-                </body>
-              </html>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals([], module.scripts_external)
-    self.assertEquals([], module.inline_scripts)
-    self.assertEquals([], module.stylesheets)
-    self.assertEquals(['x-foo.html'], module.imports)
-
-  def test_parse_script_inline(self):
-    html = """<polymer-element name="tk-element-proto">
-                <template>
-                </template>
-                <script>
-                  py_vulcanize.require("foo");
-                  py_vulcanize.require('bar');
-                </script>
-              </polymer-element>"""
-
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals([], module.scripts_external)
-    self.assertEquals(1, len(module.inline_scripts))
-    self.assertEquals([], module.stylesheets)
-    self.assertEquals([], module.imports)
-
-    script0 = module.inline_scripts[0]
-    val = re.sub(r'\s+', '', script0.contents)
-    inner_script = """py_vulcanize.require("foo");py_vulcanize.require('bar');"""
-    self.assertEquals(inner_script, val)
-
-    self.assertEquals(3, len(script0.open_tags))
-    self.assertEquals('polymer-element', script0.open_tags[2].tag)
-
-    self.assertNotIn(
-        'py_vulcanize.require("foo");',
-        module.html_contents_without_links_and_script)
-
-  def test_parse_script_inline_and_external(self):
-    html = """<polymer-element name="tk-element-proto">
-                <template>
-                </template>
-                <script>window = {}</script>
-                <script src="foo.js"></script>
-                <script>window = undefined</script>
-              </polymer-element>"""
-
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals(3, len(module.scripts))
-    self.assertEquals('window = {}', module.scripts[0].contents)
-    self.assertEquals("foo.js",module.scripts[1].src)
-    self.assertTrue(module.scripts[1].is_external)
-    self.assertEquals('window = undefined', module.scripts[2].contents)
-    self.assertEquals([], module.imports)
-
-  def test_parse_script_src_sripping(self):
-    html = """
-<script src="blah.js"></script>
-"""
-    module = parse_html_deps.HTMLModuleParser().Parse(html)
-    self.assertEquals('',
-                      module.html_contents_without_links_and_script)
-
-  def test_parse_link_rel_stylesheet(self):
-    html = """<polymer-element name="hi">
-                <template>
-                  <link rel="stylesheet" href="frameworkstyles.css">
-                </template>
-              </polymer-element>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals([], module.scripts_external)
-    self.assertEquals([], module.inline_scripts)
-    self.assertEquals(['frameworkstyles.css'], module.stylesheets)
-    self.assertEquals([], module.imports)
-
-    class Ctl(html_generation_controller.HTMLGenerationController):
-
-      def GetHTMLForStylesheetHRef(self, href):
-        if href == 'frameworkstyles.css':
-          return '<style>FRAMEWORK</style>'
-        return None
-
-    gen_html = module.GenerateHTML(Ctl())
-    ghtm = """<polymer-element name="hi">
-                <template>
-                  <style>FRAMEWORK</style>
-                </template>
-              </polymer-element>"""
-    self.assertEquals(ghtm, gen_html)
-
-  def test_parse_inline_style(self):
-    html = """<style>
-  hello
-</style>"""
-    module = parse_html_deps.HTMLModuleParser().Parse(html)
-    self.assertEquals(html, module.html_contents_without_links_and_script)
-
-    class Ctl(html_generation_controller.HTMLGenerationController):
-
-      def GetHTMLForInlineStylesheet(self, contents):
-        if contents == '\n  hello\n':
-          return '\n  HELLO\n'
-        return None
-
-    gen_html = module.GenerateHTML(Ctl())
-    ghtm = """<style>
-  HELLO
-</style>"""
-    self.assertEquals(ghtm, gen_html)
-
-  def test_parse_style_import(self):
-    html = """<polymer-element name="x-blink">
-                <template>
-                  <style>
-                    @import url(awesome.css);
-                  </style>
-                </template>
-              </polymer-element>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    self.assertRaises(lambda: parser.Parse(html))
-
-  def test_nested_templates(self):
-    orig_html = """<template>
-                  <template>
-                    <div id="foo"></div>
-                  </template>
-                </template>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    res = parser.Parse(orig_html)
-    html = res.html_contents_without_links_and_script
-    self.assertEquals(html, orig_html)
-
-  def test_html_contents_basic(self):
-    html = """<a b="c">d</a>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals(html, module.html_contents_without_links_and_script)
-
-  def test_html_contents_with_entity(self):
-    html = """<a>&rarr;</a>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals(u'<a>\u2192</a>',
-                      module.html_contents_without_links_and_script)
-
-  def test_html_content_with_charref(self):
-    html = """<a>&#62;</a>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals('<a>&gt;</a>',
-                      module.html_contents_without_links_and_script)
-
-  def test_html_content_start_end_br(self):
-    html = """<a><br /></a>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals('<a><br/></a>',
-                      module.html_contents_without_links_and_script)
-
-  def test_html_content_start_end_img(self):
-    html = """<a><img src="foo.png" id="bar" /></a>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals('<a><img id="bar" src="foo.png"/></a>',
-                      module.html_contents_without_links_and_script)
-
-  def test_html_contents_with_link_stripping(self):
-    html = """<a b="c">d</a>
-              <link rel="import" href="x-foo.html">"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals("""<a b="c">d</a>""",
-                      module.html_contents_without_links_and_script.strip())
-
-  def test_html_contents_with_style_link_stripping(self):
-    html = """<a b="c">d</a>
-              <link rel="stylesheet" href="frameworkstyles.css">"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals("""<a b="c">d</a>""",
-                      module.html_contents_without_links_and_script.strip())
-
-  def test_br_does_not_raise(self):
-    html = """<div><br/></div>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    parser.Parse(html)
-
-  def test_p_does_not_raises(self):
-    html = """<div></p></div>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    parser.Parse(html)
-
-  def test_link_endlink_does_not_raise(self):
-    html = """<link rel="stylesheet" href="foo.css"></link>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    parser.Parse(html)
-
-  def test_link_script_does_not_raise(self):
-    html = """<link rel="stylesheet" href="foo.css">
-              <script>
-              </script>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    parser.Parse(html)
-
-  def test_script_with_script_inside_as_js(self):
-    html = """<script>
-              var html_lines = [
-                '<script>',
-                '<\/script>',
-              ];
-              </script>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    parser.Parse(html)
-
-  def test_invalid_script_escaping_raises(self):
-    html = """<script>
-              var html_lines = [
-                '<script>',
-                '< /script>',
-              ];
-              </script>"""
-    parser = parse_html_deps.HTMLModuleParser()
-
-    def DoIt():
-      parser.Parse(html)
-    self.assertRaises(Exception, DoIt)
-
-  def test_script_with_cdata(self):
-    html = """<script></h2></script>"""
-    parser = parse_html_deps.HTMLModuleParser()
-    module = parser.Parse(html)
-    self.assertEquals(1, len(module.inline_scripts))
-    self.assertEquals('</h2>', module.inline_scripts[0].contents)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/project.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/project.py
deleted file mode 100644
index 7a16988..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/project.py
+++ /dev/null
@@ -1,239 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-import collections
-import os
-
-try:
-  from six import StringIO
-except ImportError:
-  from io import StringIO
-
-from py_vulcanize import resource_loader
-import six
-
-
-def _FindAllFilesRecursive(source_paths):
-  all_filenames = set()
-  for source_path in source_paths:
-    for dirpath, _, filenames in os.walk(source_path):
-      for f in filenames:
-        if f.startswith('.'):
-          continue
-        x = os.path.abspath(os.path.join(dirpath, f))
-        all_filenames.add(x)
-  return all_filenames
-
-
-class AbsFilenameList(object):
-
-  def __init__(self, willDirtyCallback):
-    self._willDirtyCallback = willDirtyCallback
-    self._filenames = []
-    self._filenames_set = set()
-
-  def _WillBecomeDirty(self):
-    if self._willDirtyCallback:
-      self._willDirtyCallback()
-
-  def append(self, filename):
-    assert os.path.isabs(filename)
-    self._WillBecomeDirty()
-    self._filenames.append(filename)
-    self._filenames_set.add(filename)
-
-  def extend(self, iterable):
-    self._WillBecomeDirty()
-    for filename in iterable:
-      assert os.path.isabs(filename)
-      self._filenames.append(filename)
-      self._filenames_set.add(filename)
-
-  def appendRel(self, basedir, filename):
-    assert os.path.isabs(basedir)
-    self._WillBecomeDirty()
-    n = os.path.abspath(os.path.join(basedir, filename))
-    self._filenames.append(n)
-    self._filenames_set.add(n)
-
-  def extendRel(self, basedir, iterable):
-    self._WillBecomeDirty()
-    assert os.path.isabs(basedir)
-    for filename in iterable:
-      n = os.path.abspath(os.path.join(basedir, filename))
-      self._filenames.append(n)
-      self._filenames_set.add(n)
-
-  def __contains__(self, x):
-    return x in self._filenames_set
-
-  def __len__(self):
-    return self._filenames.__len__()
-
-  def __iter__(self):
-    return iter(self._filenames)
-
-  def __repr__(self):
-    return repr(self._filenames)
-
-  def __str__(self):
-    return str(self._filenames)
-
-
-class Project(object):
-
-  py_vulcanize_path = os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..'))
-
-  def __init__(self, source_paths=None):
-    """
-    source_paths: A list of top-level directories in which modules and raw
-        scripts can be found. Module paths are relative to these directories.
-    """
-    self._loader = None
-    self._frozen = False
-    self.source_paths = AbsFilenameList(self._WillPartOfPathChange)
-
-    if source_paths is not None:
-      self.source_paths.extend(source_paths)
-
-  def Freeze(self):
-    self._frozen = True
-
-  def _WillPartOfPathChange(self):
-    if self._frozen:
-      raise Exception('The project is frozen. You cannot edit it now')
-    self._loader = None
-
-  @staticmethod
-  def FromDict(d):
-    return Project(d['source_paths'])
-
-  def AsDict(self):
-    return {
-        'source_paths': list(self.source_paths)
-    }
-
-  def __repr__(self):
-    return "Project(%s)" % repr(self.source_paths)
-
-  def AddSourcePath(self, path):
-    self.source_paths.append(path)
-
-  @property
-  def loader(self):
-    if self._loader is None:
-      self._loader = resource_loader.ResourceLoader(self)
-    return self._loader
-
-  def ResetLoader(self):
-    self._loader = None
-
-  def _Load(self, filenames):
-    return [self.loader.LoadModule(module_filename=filename) for
-            filename in filenames]
-
-  def LoadModule(self, module_name=None, module_filename=None):
-    return self.loader.LoadModule(module_name=module_name,
-                                  module_filename=module_filename)
-
-  def CalcLoadSequenceForModuleNames(self, module_names,
-                                     excluded_scripts=None):
-    modules = [self.loader.LoadModule(module_name=name,
-                                      excluded_scripts=excluded_scripts) for
-               name in module_names]
-    return self.CalcLoadSequenceForModules(modules)
-
-  def CalcLoadSequenceForModules(self, modules):
-    already_loaded_set = set()
-    load_sequence = []
-    for m in modules:
-      m.ComputeLoadSequenceRecursive(load_sequence, already_loaded_set)
-    return load_sequence
-
-  def GetDepsGraphFromModuleNames(self, module_names):
-    modules = [self.loader.LoadModule(module_name=name) for
-               name in module_names]
-    return self.GetDepsGraphFromModules(modules)
-
-  def GetDepsGraphFromModules(self, modules):
-    load_sequence = self.CalcLoadSequenceForModules(modules)
-    g = _Graph()
-    for m in load_sequence:
-      g.AddModule(m)
-
-      for dep in m.dependent_modules:
-        g.AddEdge(m, dep.id)
-
-    # FIXME: _GetGraph is not defined. Maybe `return g` is intended?
-    return _GetGraph(load_sequence)
-
-  def GetDominatorGraphForModulesNamed(self, module_names, load_sequence):
-    modules = [self.loader.LoadModule(module_name=name)
-               for name in module_names]
-    return self.GetDominatorGraphForModules(modules, load_sequence)
-
-  def GetDominatorGraphForModules(self, start_modules, load_sequence):
-    modules_by_id = {}
-    for m in load_sequence:
-      modules_by_id[m.id] = m
-
-    module_referrers = collections.defaultdict(list)
-    for m in load_sequence:
-      for dep in m.dependent_modules:
-        module_referrers[dep].append(m)
-
-    # Now start at the top module and reverse.
-    visited = set()
-    g = _Graph()
-
-    pending = collections.deque()
-    pending.extend(start_modules)
-    while len(pending):
-      cur = pending.pop()
-
-      g.AddModule(cur)
-      visited.add(cur)
-
-      for out_dep in module_referrers[cur]:
-        if out_dep in visited:
-          continue
-        g.AddEdge(out_dep, cur)
-        visited.add(out_dep)
-        pending.append(out_dep)
-
-    # Visited -> Dot
-    return g.GetDot()
-
-
-class _Graph(object):
-
-  def __init__(self):
-    self.nodes = []
-    self.edges = []
-
-  def AddModule(self, m):
-    f = StringIO()
-    m.AppendJSContentsToFile(f, False, None)
-
-    attrs = {
-        'label': '%s (%i)' % (m.name, f.tell())
-    }
-
-    f.close()
-
-    attr_items = ['%s="%s"' % (x, y) for x, y in six.iteritems(attrs)]
-    node = 'M%i [%s];' % (m.id, ','.join(attr_items))
-    self.nodes.append(node)
-
-  def AddEdge(self, mFrom, mTo):
-    edge = 'M%i -> M%i;' % (mFrom.id, mTo.id)
-    self.edges.append(edge)
-
-  def GetDot(self):
-    return 'digraph deps {\n\n%s\n\n%s\n}\n' % (
-        '\n'.join(self.nodes), '\n'.join(self.edges))
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/resource.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/resource.py
deleted file mode 100644
index 853dff9..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/resource.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A Resource is a file and its various associated canonical names."""
-
-import codecs
-import os
-
-
-class Resource(object):
-  """Represents a file found via a path search."""
-
-  def __init__(self, toplevel_dir, absolute_path, binary=False):
-    self.toplevel_dir = toplevel_dir
-    self.absolute_path = absolute_path
-    self._contents = None
-    self._binary = binary
-
-  @property
-  def relative_path(self):
-    """The path to the file from the top-level directory"""
-    return os.path.relpath(self.absolute_path, self.toplevel_dir)
-
-  @property
-  def unix_style_relative_path(self):
-    return self.relative_path.replace(os.sep, '/')
-
-  @property
-  def name(self):
-    """The dotted name for this resource based on its relative path."""
-    return self.name_from_relative_path(self.relative_path)
-
-  @staticmethod
-  def name_from_relative_path(relative_path):
-    dirname = os.path.dirname(relative_path)
-    basename = os.path.basename(relative_path)
-    modname = os.path.splitext(basename)[0]
-    if len(dirname):
-      name = dirname.replace(os.path.sep, '.') + '.' + modname
-    else:
-      name = modname
-    return name
-
-  @property
-  def contents(self):
-    if self._contents:
-      return self._contents
-    if not os.path.exists(self.absolute_path):
-      raise Exception('%s not found.' % self.absolute_path)
-    if self._binary:
-      f = open(self.absolute_path, mode='rb')
-    else:
-      f = codecs.open(self.absolute_path, mode='r', encoding='utf-8')
-    self._contents = f.read()
-    f.close()
-    return self._contents
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py
deleted file mode 100644
index 015adaa..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# Copyright (c) 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""ResourceFinder is a helper class for finding resources given their name."""
-
-import codecs
-import os
-
-from py_vulcanize import module
-from py_vulcanize import style_sheet as style_sheet_module
-from py_vulcanize import resource as resource_module
-from py_vulcanize import html_module
-from py_vulcanize import strip_js_comments
-
-
-class ResourceLoader(object):
-  """Manges loading modules and their dependencies from files.
-
-  Modules handle parsing and the construction of their individual dependency
-  pointers. The loader deals with bookkeeping of what has been loaded, and
-  mapping names to file resources.
-  """
-
-  def __init__(self, project):
-    self.project = project
-    self.stripped_js_by_filename = {}
-    self.loaded_modules = {}
-    self.loaded_raw_scripts = {}
-    self.loaded_style_sheets = {}
-    self.loaded_images = {}
-
-  @property
-  def source_paths(self):
-    """A list of base directories to search for modules under."""
-    return self.project.source_paths
-
-  def FindResource(self, some_path, binary=False):
-    """Finds a Resource for the given path.
-
-    Args:
-      some_path: A relative or absolute path to a file.
-
-    Returns:
-      A Resource or None.
-    """
-    if os.path.isabs(some_path):
-      return self.FindResourceGivenAbsolutePath(some_path, binary)
-    else:
-      return self.FindResourceGivenRelativePath(some_path, binary)
-
-  def FindResourceGivenAbsolutePath(self, absolute_path, binary=False):
-    """Returns a Resource for the given absolute path."""
-    candidate_paths = []
-    for source_path in self.source_paths:
-      if absolute_path.startswith(source_path):
-        candidate_paths.append(source_path)
-    if len(candidate_paths) == 0:
-      return None
-
-    # Sort by length. Longest match wins.
-    candidate_paths.sort(lambda x, y: len(x) - len(y))
-    longest_candidate = candidate_paths[-1]
-    return resource_module.Resource(longest_candidate, absolute_path, binary)
-
-  def FindResourceGivenRelativePath(self, relative_path, binary=False):
-    """Returns a Resource for the given relative path."""
-    absolute_path = None
-    for script_path in self.source_paths:
-      absolute_path = os.path.join(script_path, relative_path)
-      if os.path.exists(absolute_path):
-        return resource_module.Resource(script_path, absolute_path, binary)
-    return None
-
-  def _FindResourceGivenNameAndSuffix(
-        self, requested_name, extension, return_resource=False):
-    """Searches for a file and reads its contents.
-
-    Args:
-      requested_name: The name of the resource that was requested.
-      extension: The extension for this requested resource.
-
-    Returns:
-      A (path, contents) pair.
-    """
-    pathy_name = requested_name.replace('.', os.sep)
-    filename = pathy_name + extension
-
-    resource = self.FindResourceGivenRelativePath(filename)
-    if return_resource:
-      return resource
-    if not resource:
-      return None, None
-    return _read_file(resource.absolute_path)
-
-  def FindModuleResource(self, requested_module_name):
-    """Finds a module javascript file and returns a Resource, or none."""
-    js_resource = self._FindResourceGivenNameAndSuffix(
-        requested_module_name, '.js', return_resource=True)
-    html_resource = self._FindResourceGivenNameAndSuffix(
-        requested_module_name, '.html', return_resource=True)
-    if js_resource and html_resource:
-      if html_module.IsHTMLResourceTheModuleGivenConflictingResourceNames(
-          js_resource, html_resource):
-        return html_resource
-      return js_resource
-    elif js_resource:
-      return js_resource
-    return html_resource
-
-  def LoadModule(self, module_name=None, module_filename=None,
-                 excluded_scripts=None):
-    assert bool(module_name) ^ bool(module_filename), (
-        'Must provide either module_name or module_filename.')
-    if module_filename:
-      resource = self.FindResource(module_filename)
-      if not resource:
-        raise Exception('Could not find %s in %s' % (
-            module_filename, repr(self.source_paths)))
-      module_name = resource.name
-    else:
-      resource = None  # Will be set if we end up needing to load.
-
-    if module_name in self.loaded_modules:
-      assert self.loaded_modules[module_name].contents
-      return self.loaded_modules[module_name]
-
-    if not resource:  # happens when module_name was given
-      resource = self.FindModuleResource(module_name)
-      if not resource:
-        raise module.DepsException('No resource for module "%s"' % module_name)
-
-    m = html_module.HTMLModule(self, module_name, resource)
-    self.loaded_modules[module_name] = m
-
-    # Fake it, this is probably either polymer.min.js or platform.js which are
-    # actually .js files....
-    if resource.absolute_path.endswith('.js'):
-      return m
-
-    m.Parse(excluded_scripts)
-    m.Load(excluded_scripts)
-    return m
-
-  def LoadRawScript(self, relative_raw_script_path):
-    resource = None
-    for source_path in self.source_paths:
-      possible_absolute_path = os.path.join(
-          source_path, os.path.normpath(relative_raw_script_path))
-      if os.path.exists(possible_absolute_path):
-        resource = resource_module.Resource(
-            source_path, possible_absolute_path)
-        break
-    if not resource:
-      raise module.DepsException(
-          'Could not find a file for raw script %s in %s' %
-          (relative_raw_script_path, self.source_paths))
-    assert relative_raw_script_path == resource.unix_style_relative_path, (
-        'Expected %s == %s' % (relative_raw_script_path,
-                               resource.unix_style_relative_path))
-
-    if resource.absolute_path in self.loaded_raw_scripts:
-      return self.loaded_raw_scripts[resource.absolute_path]
-
-    raw_script = module.RawScript(resource)
-    self.loaded_raw_scripts[resource.absolute_path] = raw_script
-    return raw_script
-
-  def LoadStyleSheet(self, name):
-    if name in self.loaded_style_sheets:
-      return self.loaded_style_sheets[name]
-
-    resource = self._FindResourceGivenNameAndSuffix(
-        name, '.css', return_resource=True)
-    if not resource:
-      raise module.DepsException(
-          'Could not find a file for stylesheet %s' % name)
-
-    style_sheet = style_sheet_module.StyleSheet(self, name, resource)
-    style_sheet.load()
-    self.loaded_style_sheets[name] = style_sheet
-    return style_sheet
-
-  def LoadImage(self, abs_path):
-    if abs_path in self.loaded_images:
-      return self.loaded_images[abs_path]
-
-    if not os.path.exists(abs_path):
-      raise module.DepsException("url('%s') did not exist" % abs_path)
-
-    res = self.FindResourceGivenAbsolutePath(abs_path, binary=True)
-    if res is None:
-      raise module.DepsException("url('%s') was not in search path" % abs_path)
-
-    image = style_sheet_module.Image(res)
-    self.loaded_images[abs_path] = image
-    return image
-
-  def GetStrippedJSForFilename(self, filename, early_out_if_no_py_vulcanize):
-    if filename in self.stripped_js_by_filename:
-      return self.stripped_js_by_filename[filename]
-
-    with open(filename, 'r') as f:
-      contents = f.read(4096)
-    if early_out_if_no_py_vulcanize and ('py_vulcanize' not in contents):
-      return None
-
-    s = strip_js_comments.StripJSComments(contents)
-    self.stripped_js_by_filename[filename] = s
-    return s
-
-
-def _read_file(absolute_path):
-  """Reads a file and returns a (path, contents) pair.
-
-  Args:
-    absolute_path: Absolute path to a file.
-
-  Raises:
-    Exception: The given file doesn't exist.
-    IOError: There was a problem opening or reading the file.
-  """
-  if not os.path.exists(absolute_path):
-    raise Exception('%s not found.' % absolute_path)
-  f = codecs.open(absolute_path, mode='r', encoding='utf-8')
-  contents = f.read()
-  f.close()
-  return absolute_path, contents
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py
deleted file mode 100644
index 4da2355..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/resource_unittest.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-
-from py_vulcanize import resource
-
-
-class ResourceUnittest(unittest.TestCase):
-
-  def testBasic(self):
-    r = resource.Resource('/a', '/a/b/c.js')
-    self.assertEquals('b.c', r.name)
-    self.assertEquals(os.path.join('b', 'c.js'), r.relative_path)
-    self.assertEquals('b/c.js', r.unix_style_relative_path)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py
deleted file mode 100644
index 73c3a88..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Utility function for stripping comments out of JavaScript source code."""
-
-import re
-
-
-def _TokenizeJS(text):
-  """Splits source code text into segments in preparation for comment stripping.
-
-  Note that this doesn't tokenize for parsing. There is no notion of statements,
-  variables, etc. The only tokens of interest are comment-related tokens.
-
-  Args:
-    text: The contents of a JavaScript file.
-
-  Yields:
-    A succession of strings in the file, including all comment-related symbols.
-  """
-  rest = text
-  tokens = ['//', '/*', '*/', '\n']
-  next_tok = re.compile('|'.join(re.escape(x) for x in tokens))
-  while len(rest):
-    m = next_tok.search(rest)
-    if not m:
-      # end of string
-      yield rest
-      return
-    min_index = m.start()
-    end_index = m.end()
-
-    if min_index > 0:
-      yield rest[:min_index]
-
-    yield rest[min_index:end_index]
-    rest = rest[end_index:]
-
-
-def StripJSComments(text):
-  """Strips comments out of JavaScript source code.
-
-  Args:
-    text: JavaScript source text.
-
-  Returns:
-    JavaScript source text with comments stripped out.
-  """
-  result_tokens = []
-  token_stream = _TokenizeJS(text).__iter__()
-  while True:
-    try:
-      t = next(token_stream)
-    except StopIteration:
-      break
-
-    if t == '//':
-      while True:
-        try:
-          t2 = next(token_stream)
-          if t2 == '\n':
-            break
-        except StopIteration:
-          break
-    elif t == '/*':
-      nesting = 1
-      while True:
-        try:
-          t2 = next(token_stream)
-          if t2 == '/*':
-            nesting += 1
-          elif t2 == '*/':
-            nesting -= 1
-            if nesting == 0:
-              break
-        except StopIteration:
-          break
-    else:
-      result_tokens.append(t)
-  return ''.join(result_tokens)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py
deleted file mode 100644
index 685cb82..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments_unittest.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Tests for strip_js_comments module."""
-
-import unittest
-
-from py_vulcanize import strip_js_comments
-
-
-# This test case tests a protected method.
-# pylint: disable=W0212
-class JavaScriptStripCommentTests(unittest.TestCase):
-  """Test case for _strip_js_comments and _TokenizeJS."""
-
-  def test_strip_comments(self):
-    self.assertEquals(
-        'A ', strip_js_comments.StripJSComments('A // foo'))
-    self.assertEquals(
-        'A bar', strip_js_comments.StripJSComments('A // foo\nbar'))
-    self.assertEquals(
-        'A  b', strip_js_comments.StripJSComments('A /* foo */ b'))
-    self.assertEquals(
-        'A  b', strip_js_comments.StripJSComments('A /* foo\n */ b'))
-
-  def test_tokenize_empty(self):
-    tokens = list(strip_js_comments._TokenizeJS(''))
-    self.assertEquals([], tokens)
-
-  def test_tokenize_nl(self):
-    tokens = list(strip_js_comments._TokenizeJS('\n'))
-    self.assertEquals(['\n'], tokens)
-
-  def test_tokenize_slashslash_comment(self):
-    tokens = list(strip_js_comments._TokenizeJS('A // foo'))
-    self.assertEquals(['A ', '//', ' foo'], tokens)
-
-  def test_tokenize_slashslash_comment_then_newline(self):
-    tokens = list(strip_js_comments._TokenizeJS('A // foo\nbar'))
-    self.assertEquals(['A ', '//', ' foo', '\n', 'bar'], tokens)
-
-  def test_tokenize_cstyle_comment_one_line(self):
-    tokens = list(strip_js_comments._TokenizeJS('A /* foo */'))
-    self.assertEquals(['A ', '/*', ' foo ', '*/'], tokens)
-
-  def test_tokenize_cstyle_comment_multi_line(self):
-    tokens = list(strip_js_comments._TokenizeJS('A /* foo\n*bar\n*/'))
-    self.assertEquals(['A ', '/*', ' foo', '\n', '*bar', '\n', '*/'], tokens)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py
deleted file mode 100644
index 5338762..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import base64
-import os
-import re
-
-
-class Image(object):
-
-  def __init__(self, resource):
-    self.resource = resource
-    self.aliases = []
-
-  @property
-  def relative_path(self):
-    return self.resource.relative_path
-
-  @property
-  def absolute_path(self):
-    return self.resource.absolute_path
-
-  @property
-  def contents(self):
-    return self.resource.contents
-
-
-class ParsedStyleSheet(object):
-
-  def __init__(self, loader, containing_dirname, contents):
-    self.loader = loader
-    self.contents = contents
-    self._images = None
-    self._Load(containing_dirname)
-
-  @property
-  def images(self):
-    return self._images
-
-  def AppendDirectlyDependentFilenamesTo(self, dependent_filenames):
-    for i in self.images:
-      dependent_filenames.append(i.resource.absolute_path)
-
-  @property
-  def contents_with_inlined_images(self):
-    images_by_url = {}
-    for i in self.images:
-      for a in i.aliases:
-        images_by_url[a] = i
-
-    def InlineUrl(m):
-      url = m.group('url')
-      image = images_by_url[url]
-
-      ext = os.path.splitext(image.absolute_path)[1]
-      data = base64.standard_b64encode(image.contents)
-
-      return 'url(data:image/%s;base64,%s)' % (ext[1:], data)
-
-    # I'm assuming we only have url()'s associated with images
-    return re.sub('url\((?P<quote>"|\'|)(?P<url>[^"\'()]*)(?P=quote)\)',
-                  InlineUrl, self.contents)
-
-  def AppendDirectlyDependentFilenamesTo(self, dependent_filenames):
-    for i in self.images:
-      dependent_filenames.append(i.resource.absolute_path)
-
-  def _Load(self, containing_dirname):
-    if self.contents.find('@import') != -1:
-      raise Exception('@imports are not supported')
-
-    matches = re.findall(
-        'url\((?:["|\']?)([^"\'()]*)(?:["|\']?)\)',
-        self.contents)
-
-    def resolve_url(url):
-      if os.path.isabs(url):
-        # FIXME: module is used here, but py_vulcanize.module is never imported.
-        # However, py_vulcanize.module cannot be imported since py_vulcanize.module may import
-        # style_sheet, leading to an import loop.
-        raise module.DepsException('URL references must be relative')
-      # URLS are relative to this module's directory
-      abs_path = os.path.abspath(os.path.join(containing_dirname, url))
-      image = self.loader.LoadImage(abs_path)
-      image.aliases.append(url)
-      return image
-
-    self._images = [resolve_url(x) for x in matches]
-
-
-class StyleSheet(object):
-  """Represents a stylesheet resource referenced by a module via the
-  base.requireStylesheet(xxx) directive."""
-
-  def __init__(self, loader, name, resource):
-    self.loader = loader
-    self.name = name
-    self.resource = resource
-    self._parsed_style_sheet = None
-
-  @property
-  def filename(self):
-    return self.resource.absolute_path
-
-  @property
-  def contents(self):
-    return self.resource.contents
-
-  def __repr__(self):
-    return 'StyleSheet(%s)' % self.name
-
-  @property
-  def images(self):
-    self._InitParsedStyleSheetIfNeeded()
-    return self._parsed_style_sheet.images
-
-  def AppendDirectlyDependentFilenamesTo(self, dependent_filenames):
-    self._InitParsedStyleSheetIfNeeded()
-
-    dependent_filenames.append(self.resource.absolute_path)
-    self._parsed_style_sheet.AppendDirectlyDependentFilenamesTo(
-        dependent_filenames)
-
-  @property
-  def contents_with_inlined_images(self):
-    self._InitParsedStyleSheetIfNeeded()
-    return self._parsed_style_sheet.contents_with_inlined_images
-
-  def load(self):
-    self._InitParsedStyleSheetIfNeeded()
-
-  def _InitParsedStyleSheetIfNeeded(self):
-    if self._parsed_style_sheet:
-      return
-    module_dirname = os.path.dirname(self.resource.absolute_path)
-    self._parsed_style_sheet = ParsedStyleSheet(
-        self.loader, module_dirname, self.contents)
diff --git a/systrace/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py b/systrace/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py
deleted file mode 100644
index 4ebc71d..0000000
--- a/systrace/catapult/common/py_vulcanize/py_vulcanize/style_sheet_unittest.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import base64
-import os
-import unittest
-
-from py_vulcanize import project as project_module
-from py_vulcanize import resource_loader
-from py_vulcanize import fake_fs
-from py_vulcanize import module
-
-
-class StyleSheetUnittest(unittest.TestCase):
-
-  def testImages(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/src/foo/x.css', """
-.x .y {
-    background-image: url(../images/bar.jpeg);
-}
-""")
-    fs.AddFile('/src/images/bar.jpeg', 'hello world')
-    with fs:
-      project = project_module.Project([os.path.normpath('/src/')])
-      loader = resource_loader.ResourceLoader(project)
-
-      foo_x = loader.LoadStyleSheet('foo.x')
-      self.assertEquals(1, len(foo_x.images))
-
-      r0 = foo_x.images[0]
-      self.assertEquals(os.path.normpath('/src/images/bar.jpeg'),
-                        r0.absolute_path)
-
-      inlined = foo_x.contents_with_inlined_images
-      self.assertEquals("""
-.x .y {
-    background-image: url(data:image/jpeg;base64,%s);
-}
-""" % base64.standard_b64encode('hello world'), inlined)
-
-  def testURLResolveFails(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/src/foo/x.css', """
-.x .y {
-    background-image: url(../images/missing.jpeg);
-}
-""")
-    with fs:
-      project = project_module.Project([os.path.normpath('/src')])
-      loader = resource_loader.ResourceLoader(project)
-
-      self.assertRaises(module.DepsException,
-                        lambda: loader.LoadStyleSheet('foo.x'))
-
-  def testImportsCauseFailure(self):
-    fs = fake_fs.FakeFS()
-    fs.AddFile('/src/foo/x.css', """
-@import url(awesome.css);
-""")
-    with fs:
-      project = project_module.Project([os.path.normpath('/src')])
-      loader = resource_loader.ResourceLoader(project)
-
-      self.assertRaises(Exception,
-                        lambda: loader.LoadStyleSheet('foo.x'))
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 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/systrace/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST
deleted file mode 100644
index a0384d9..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/MANIFEST
+++ /dev/null
@@ -1,354 +0,0 @@
-LICENSE
-MANIFEST
-PKG-INFO
-README.rst
-_setup/__init__.py
-_setup/include/cext.h
-_setup/py2/__init__.py
-_setup/py2/commands.py
-_setup/py2/data.py
-_setup/py2/dist.py
-_setup/py2/ext.py
-_setup/py2/setup.py
-_setup/py2/shell.py
-_setup/py2/term/__init__.py
-_setup/py2/term/_term.py
-_setup/py2/util.py
-_setup/py3/__init__.py
-_setup/py3/commands.py
-_setup/py3/data.py
-_setup/py3/dist.py
-_setup/py3/ext.py
-_setup/py3/setup.py
-_setup/py3/shell.py
-_setup/py3/term/__init__.py
-_setup/py3/term/_term.py
-_setup/py3/util.py
-bench
-bench.sh
-bench/LICENSE.cssmin
-bench/__init__.py
-bench/cssmin.py
-bench/main.py
-bench/wikipedia.css
-bench/wikipedia.min.css
-bench/write.py
-docs/BENCHMARKS
-docs/CHANGES
-docs/CLASSIFIERS
-docs/DESCRIPTION
-docs/PROVIDES
-docs/SUMMARY
-docs/apidoc/api-objects.txt
-docs/apidoc/crarr.png
-docs/apidoc/epydoc.css
-docs/apidoc/epydoc.js
-docs/apidoc/help.html
-docs/apidoc/identifier-index.html
-docs/apidoc/index.html
-docs/apidoc/module-tree.html
-docs/apidoc/rcssmin-module.html
-docs/apidoc/rcssmin-pysrc.html
-docs/apidoc/redirect.html
-package.cfg
-rcssmin.c
-rcssmin.py
-run_tests.py
-setup.py
-tests
-tests/main/atgroup_00.css
-tests/main/atgroup_01.css
-tests/main/atgroup_02.css
-tests/main/atgroup_03.css
-tests/main/atgroup_04.css
-tests/main/atgroup_05.css
-tests/main/atgroup_06.css
-tests/main/atgroup_07.css
-tests/main/atgroup_08.css
-tests/main/atgroup_09.css
-tests/main/atgroup_10.css
-tests/main/atgroup_11.css
-tests/main/comment_00.css
-tests/main/comment_01.css
-tests/main/comment_02.css
-tests/main/comment_03.css
-tests/main/comment_04.css
-tests/main/escape_00.css
-tests/main/escape_01.css
-tests/main/escape_02.css
-tests/main/escape_03.css
-tests/main/escape_04.css
-tests/main/escape_05.css
-tests/main/escape_06.css
-tests/main/first_00.css
-tests/main/first_01.css
-tests/main/first_02.css
-tests/main/out/atgroup_00.out
-tests/main/out/atgroup_00.out.b
-tests/main/out/atgroup_01.out
-tests/main/out/atgroup_01.out.b
-tests/main/out/atgroup_02.out
-tests/main/out/atgroup_02.out.b
-tests/main/out/atgroup_03.out
-tests/main/out/atgroup_03.out.b
-tests/main/out/atgroup_04.out
-tests/main/out/atgroup_04.out.b
-tests/main/out/atgroup_05.out
-tests/main/out/atgroup_05.out.b
-tests/main/out/atgroup_06.out
-tests/main/out/atgroup_06.out.b
-tests/main/out/atgroup_07.out
-tests/main/out/atgroup_07.out.b
-tests/main/out/atgroup_08.out
-tests/main/out/atgroup_08.out.b
-tests/main/out/atgroup_09.out
-tests/main/out/atgroup_09.out.b
-tests/main/out/atgroup_10.out
-tests/main/out/atgroup_10.out.b
-tests/main/out/atgroup_11.out
-tests/main/out/atgroup_11.out.b
-tests/main/out/comment_00.out
-tests/main/out/comment_00.out.b
-tests/main/out/comment_01.out
-tests/main/out/comment_01.out.b
-tests/main/out/comment_02.out
-tests/main/out/comment_02.out.b
-tests/main/out/comment_03.out
-tests/main/out/comment_03.out.b
-tests/main/out/comment_04.out
-tests/main/out/comment_04.out.b
-tests/main/out/escape_00.out
-tests/main/out/escape_00.out.b
-tests/main/out/escape_01.out
-tests/main/out/escape_01.out.b
-tests/main/out/escape_02.out
-tests/main/out/escape_02.out.b
-tests/main/out/escape_03.out
-tests/main/out/escape_03.out.b
-tests/main/out/escape_04.out
-tests/main/out/escape_04.out.b
-tests/main/out/escape_05.out
-tests/main/out/escape_05.out.b
-tests/main/out/escape_06.out
-tests/main/out/escape_06.out.b
-tests/main/out/first_00.out
-tests/main/out/first_00.out.b
-tests/main/out/first_01.out
-tests/main/out/first_01.out.b
-tests/main/out/first_02.out
-tests/main/out/first_02.out.b
-tests/main/out/url_00.out
-tests/main/out/url_00.out.b
-tests/main/out/url_01.out
-tests/main/out/url_01.out.b
-tests/main/out/url_02.out
-tests/main/out/url_02.out.b
-tests/main/out/url_03.out
-tests/main/out/url_03.out.b
-tests/main/out/url_04.out
-tests/main/out/url_04.out.b
-tests/main/out/url_05.out
-tests/main/out/url_05.out.b
-tests/main/out/url_06.out
-tests/main/out/url_06.out.b
-tests/main/out/url_07.out
-tests/main/out/url_07.out.b
-tests/main/out/url_08.out
-tests/main/out/url_08.out.b
-tests/main/out/url_09.out
-tests/main/out/url_09.out.b
-tests/main/url_00.css
-tests/main/url_01.css
-tests/main/url_02.css
-tests/main/url_03.css
-tests/main/url_04.css
-tests/main/url_05.css
-tests/main/url_06.css
-tests/main/url_07.css
-tests/main/url_08.css
-tests/main/url_09.css
-tests/yui/README
-tests/yui/background-position.css
-tests/yui/background-position.css.min
-tests/yui/border-none.css
-tests/yui/border-none.css.min
-tests/yui/box-model-hack.css
-tests/yui/box-model-hack.css.min
-tests/yui/bug2527974.css
-tests/yui/bug2527974.css.min
-tests/yui/bug2527991.css
-tests/yui/bug2527991.css.min
-tests/yui/bug2527998.css
-tests/yui/bug2527998.css.min
-tests/yui/bug2528034.css
-tests/yui/bug2528034.css.min
-tests/yui/charset-media.css
-tests/yui/charset-media.css.min
-tests/yui/color-simple.css
-tests/yui/color-simple.css.min
-tests/yui/color.css
-tests/yui/color.css.min
-tests/yui/comment.css
-tests/yui/comment.css.min
-tests/yui/concat-charset.css
-tests/yui/concat-charset.css.min
-tests/yui/dataurl-base64-doublequotes.css
-tests/yui/dataurl-base64-doublequotes.css.min
-tests/yui/dataurl-base64-eof.css
-tests/yui/dataurl-base64-eof.css.min
-tests/yui/dataurl-base64-linebreakindata.css
-tests/yui/dataurl-base64-linebreakindata.css.min
-tests/yui/dataurl-base64-noquotes.css
-tests/yui/dataurl-base64-noquotes.css.min
-tests/yui/dataurl-base64-singlequotes.css
-tests/yui/dataurl-base64-singlequotes.css.min
-tests/yui/dataurl-base64-twourls.css
-tests/yui/dataurl-base64-twourls.css.min
-tests/yui/dataurl-dbquote-font.css
-tests/yui/dataurl-dbquote-font.css.min
-tests/yui/dataurl-nonbase64-doublequotes.css
-tests/yui/dataurl-nonbase64-doublequotes.css.min
-tests/yui/dataurl-nonbase64-noquotes.css
-tests/yui/dataurl-nonbase64-noquotes.css.min
-tests/yui/dataurl-nonbase64-singlequotes.css
-tests/yui/dataurl-nonbase64-singlequotes.css.min
-tests/yui/dataurl-noquote-multiline-font.css
-tests/yui/dataurl-noquote-multiline-font.css.min
-tests/yui/dataurl-realdata-doublequotes.css
-tests/yui/dataurl-realdata-doublequotes.css.min
-tests/yui/dataurl-realdata-noquotes.css
-tests/yui/dataurl-realdata-noquotes.css.min
-tests/yui/dataurl-realdata-singlequotes.css
-tests/yui/dataurl-realdata-singlequotes.css.min
-tests/yui/dataurl-realdata-yuiapp.css
-tests/yui/dataurl-realdata-yuiapp.css.min
-tests/yui/dataurl-singlequote-font.css
-tests/yui/dataurl-singlequote-font.css.min
-tests/yui/decimals.css
-tests/yui/decimals.css.min
-tests/yui/dollar-header.css
-tests/yui/dollar-header.css.min
-tests/yui/font-face.css
-tests/yui/font-face.css.min
-tests/yui/ie5mac.css
-tests/yui/ie5mac.css.min
-tests/yui/media-empty-class.css
-tests/yui/media-empty-class.css.min
-tests/yui/media-multi.css
-tests/yui/media-multi.css.min
-tests/yui/media-test.css
-tests/yui/media-test.css.min
-tests/yui/opacity-filter.css
-tests/yui/opacity-filter.css.min
-tests/yui/out/background-position.out
-tests/yui/out/background-position.out.b
-tests/yui/out/border-none.out
-tests/yui/out/border-none.out.b
-tests/yui/out/box-model-hack.out
-tests/yui/out/box-model-hack.out.b
-tests/yui/out/bug2527974.out
-tests/yui/out/bug2527974.out.b
-tests/yui/out/bug2527991.out
-tests/yui/out/bug2527991.out.b
-tests/yui/out/bug2527998.out
-tests/yui/out/bug2527998.out.b
-tests/yui/out/bug2528034.out
-tests/yui/out/bug2528034.out.b
-tests/yui/out/charset-media.out
-tests/yui/out/charset-media.out.b
-tests/yui/out/color-simple.out
-tests/yui/out/color-simple.out.b
-tests/yui/out/color.out
-tests/yui/out/color.out.b
-tests/yui/out/comment.out
-tests/yui/out/comment.out.b
-tests/yui/out/concat-charset.out
-tests/yui/out/concat-charset.out.b
-tests/yui/out/dataurl-base64-doublequotes.out
-tests/yui/out/dataurl-base64-doublequotes.out.b
-tests/yui/out/dataurl-base64-eof.out
-tests/yui/out/dataurl-base64-eof.out.b
-tests/yui/out/dataurl-base64-linebreakindata.out
-tests/yui/out/dataurl-base64-linebreakindata.out.b
-tests/yui/out/dataurl-base64-noquotes.out
-tests/yui/out/dataurl-base64-noquotes.out.b
-tests/yui/out/dataurl-base64-singlequotes.out
-tests/yui/out/dataurl-base64-singlequotes.out.b
-tests/yui/out/dataurl-base64-twourls.out
-tests/yui/out/dataurl-base64-twourls.out.b
-tests/yui/out/dataurl-dbquote-font.out
-tests/yui/out/dataurl-dbquote-font.out.b
-tests/yui/out/dataurl-nonbase64-doublequotes.out
-tests/yui/out/dataurl-nonbase64-doublequotes.out.b
-tests/yui/out/dataurl-nonbase64-noquotes.out
-tests/yui/out/dataurl-nonbase64-noquotes.out.b
-tests/yui/out/dataurl-nonbase64-singlequotes.out
-tests/yui/out/dataurl-nonbase64-singlequotes.out.b
-tests/yui/out/dataurl-noquote-multiline-font.out
-tests/yui/out/dataurl-noquote-multiline-font.out.b
-tests/yui/out/dataurl-realdata-doublequotes.out
-tests/yui/out/dataurl-realdata-doublequotes.out.b
-tests/yui/out/dataurl-realdata-noquotes.out
-tests/yui/out/dataurl-realdata-noquotes.out.b
-tests/yui/out/dataurl-realdata-singlequotes.out
-tests/yui/out/dataurl-realdata-singlequotes.out.b
-tests/yui/out/dataurl-realdata-yuiapp.out
-tests/yui/out/dataurl-realdata-yuiapp.out.b
-tests/yui/out/dataurl-singlequote-font.out
-tests/yui/out/dataurl-singlequote-font.out.b
-tests/yui/out/decimals.out
-tests/yui/out/decimals.out.b
-tests/yui/out/dollar-header.out
-tests/yui/out/dollar-header.out.b
-tests/yui/out/font-face.out
-tests/yui/out/font-face.out.b
-tests/yui/out/ie5mac.out
-tests/yui/out/ie5mac.out.b
-tests/yui/out/media-empty-class.out
-tests/yui/out/media-empty-class.out.b
-tests/yui/out/media-multi.out
-tests/yui/out/media-multi.out.b
-tests/yui/out/media-test.out
-tests/yui/out/media-test.out.b
-tests/yui/out/opacity-filter.out
-tests/yui/out/opacity-filter.out.b
-tests/yui/out/preserve-case.out
-tests/yui/out/preserve-case.out.b
-tests/yui/out/preserve-new-line.out
-tests/yui/out/preserve-new-line.out.b
-tests/yui/out/preserve-strings.out
-tests/yui/out/preserve-strings.out.b
-tests/yui/out/pseudo-first.out
-tests/yui/out/pseudo-first.out.b
-tests/yui/out/pseudo.out
-tests/yui/out/pseudo.out.b
-tests/yui/out/special-comments.out
-tests/yui/out/special-comments.out.b
-tests/yui/out/star-underscore-hacks.out
-tests/yui/out/star-underscore-hacks.out.b
-tests/yui/out/string-in-comment.out
-tests/yui/out/string-in-comment.out.b
-tests/yui/out/webkit-transform.out
-tests/yui/out/webkit-transform.out.b
-tests/yui/out/zeros.out
-tests/yui/out/zeros.out.b
-tests/yui/preserve-case.css
-tests/yui/preserve-case.css.min
-tests/yui/preserve-new-line.css
-tests/yui/preserve-new-line.css.min
-tests/yui/preserve-strings.css
-tests/yui/preserve-strings.css.min
-tests/yui/pseudo-first.css
-tests/yui/pseudo-first.css.min
-tests/yui/pseudo.css
-tests/yui/pseudo.css.min
-tests/yui/special-comments.css
-tests/yui/special-comments.css.min
-tests/yui/star-underscore-hacks.css
-tests/yui/star-underscore-hacks.css.min
-tests/yui/string-in-comment.css
-tests/yui/string-in-comment.css.min
-tests/yui/webkit-transform.css
-tests/yui/webkit-transform.css.min
-tests/yui/zeros.css
-tests/yui/zeros.css.min
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO
deleted file mode 100644
index d4ee866..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/PKG-INFO
+++ /dev/null
@@ -1,316 +0,0 @@
-Metadata-Version: 1.1
-Name: rcssmin
-Version: 1.0.5
-Summary: CSS Minifier
-Home-page: http://opensource.perlig.de/rcssmin/
-Author: André Malo
-Author-email: nd@perlig.de
-License:                                  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.
-Download-URL: http://storage.perlig.de/rcssmin/
-Description: ==============
-         CSS Minifier
-        ==============
-        
-        RCSSmin is a CSS minifier.
-        
-        The minifier is based on the semantics of the `YUI compressor`_\, which itself
-        is based on `the rule list by Isaac Schlueter`_\.
-        
-        This module is a re-implementation aiming for speed instead of maximum
-        compression, so it can be used at runtime (rather than during a preprocessing
-        step). RCSSmin does syntactical compression only (removing spaces, comments
-        and possibly semicolons). It does not provide semantic compression (like
-        removing empty blocks, collapsing redundant properties etc). It does, however,
-        support various CSS hacks (by keeping them working as intended).
-        
-        Here's a feature list:
-        
-        - Strings are kept, except that escaped newlines are stripped
-        - Space/Comments before the very end or before various characters are
-          stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
-          space is kept if it's outside a ruleset.)
-        - Space/Comments at the very beginning or after various characters are
-          stripped: ``{}(=:>+[,!``
-        - Optional space after unicode escapes is kept, resp. replaced by a simple
-          space
-        - whitespaces inside ``url()`` definitions are stripped
-        - Comments starting with an exclamation mark (``!``) can be kept optionally.
-        - All other comments and/or whitespace characters are replaced by a single
-          space.
-        - Multiple consecutive semicolons are reduced to one
-        - The last semicolon within a ruleset is stripped
-        - CSS Hacks supported:
-        
-          - IE7 hack (``>/**/``)
-          - Mac-IE5 hack (``/*\*/.../**/``)
-          - The boxmodelhack is supported naturally because it relies on valid CSS2
-            strings
-          - Between ``:first-line`` and the following comma or curly brace a space is
-            inserted. (apparently it's needed for IE6)
-          - Same for ``:first-letter``
-        
-        rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
-        factor 100 or so (depending on the input). docs/BENCHMARKS in the source
-        distribution contains the details.
-        
-        Both python 2 (>= 2.4) and python 3 are supported.
-        
-        .. _YUI compressor: https://github.com/yui/yuicompressor/
-        
-        .. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
-        
-        
-        Copyright and License
-        ~~~~~~~~~~~~~~~~~~~~~
-        
-        Copyright 2011 - 2014
-        André Malo or his licensors, as applicable.
-        
-        The whole package (except for the files in the bench/ directory) is
-        distributed under the Apache License Version 2.0. You'll find a copy in the
-        root directory of the distribution or online at:
-        <http://www.apache.org/licenses/LICENSE-2.0>.
-        
-        
-        Bugs
-        ~~~~
-        
-        No bugs, of course. ;-)
-        But if you've found one or have an idea how to improve rcssmin, feel free
-        to send a pull request on `github <https://github.com/ndparker/rcssmin>`_
-        or send a mail to <rcssmin-bugs@perlig.de>.
-        
-        
-        Author Information
-        ~~~~~~~~~~~~~~~~~~
-        
-        André "nd" Malo <nd perlig.de>
-        GPG: 0x8103A37E
-        
-        
-            If God intended people to be naked, they would be born that way.
-            -- Oscar Wilde
-        
-        .. vim:tw=72 syntax=rest
-Keywords: CSS,Minimization
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Web Environment
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved
-Classifier: License :: OSI Approved :: Apache License, Version 2.0
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: Jython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Text Processing
-Classifier: Topic :: Text Processing :: Filters
-Classifier: Topic :: Utilities
-Provides: rcssmin (1.0)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium
deleted file mode 100644
index b1350fc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/README.chromium
+++ /dev/null
@@ -1,16 +0,0 @@
-Name: rCSSmin
-Short Name: rcssmin
-URL: http://opensource.perlig.de/rcssmin/
-Version: 1.0.5
-License: Apache 2.0
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-rCSSmin is a CSS minifier written in python.
-The minifier is based on the semantics of the YUI compressor, which itself is
-based on the rule list by Isaac Schlueter.
-
-Modifications made:
- - Removed the bench.sh since the file doesn't have the licensing info and
-   caused license checker to fail.
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/README.rst b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/README.rst
deleted file mode 100644
index 95fb308..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/README.rst
+++ /dev/null
@@ -1,153 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-=====================================
- rCSSmin - A CSS Minifier For Python
-=====================================
-
-TABLE OF CONTENTS
------------------
-
-1. Introduction
-2. Copyright and License
-3. System Requirements
-4. Installation
-5. Documentation
-6. Bugs
-7. Author Information
-
-
-INTRODUCTION
-------------
-
-RCSSmin is a CSS minifier written in python.
-
-The minifier is based on the semantics of the `YUI compressor`_\, which itself
-is based on `the rule list by Isaac Schlueter`_\.
-
-This module is a re-implementation aiming for speed instead of maximum
-compression, so it can be used at runtime (rather than during a preprocessing
-step). RCSSmin does syntactical compression only (removing spaces, comments
-and possibly semicolons). It does not provide semantic compression (like
-removing empty blocks, collapsing redundant properties etc). It does, however,
-support various CSS hacks (by keeping them working as intended).
-
-Here's a feature list:
-
-- Strings are kept, except that escaped newlines are stripped
-- Space/Comments before the very end or before various characters are
-  stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
-  space is kept if it's outside a ruleset.)
-- Space/Comments at the very beginning or after various characters are
-  stripped: ``{}(=:>+[,!``
-- Optional space after unicode escapes is kept, resp. replaced by a simple
-  space
-- whitespaces inside ``url()`` definitions are stripped
-- Comments starting with an exclamation mark (``!``) can be kept optionally.
-- All other comments and/or whitespace characters are replaced by a single
-  space.
-- Multiple consecutive semicolons are reduced to one
-- The last semicolon within a ruleset is stripped
-- CSS Hacks supported:
-
-  - IE7 hack (``>/**/``)
-  - Mac-IE5 hack (``/*\*/.../**/``)
-  - The boxmodelhack is supported naturally because it relies on valid CSS2
-    strings
-  - Between ``:first-line`` and the following comma or curly brace a space is
-    inserted. (apparently it's needed for IE6)
-  - Same for ``:first-letter``
-
-rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
-factor 100 or so (depending on the input). docs/BENCHMARKS in the source
-distribution contains the details.
-
-.. _YUI compressor: https://github.com/yui/yuicompressor/
-
-.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
-
-
-COPYRIGHT AND LICENSE
----------------------
-
-Copyright 2011 - 2014
-André Malo or his licensors, as applicable.
-
-The whole package (except for the files in the bench/ directory)
-is distributed under the Apache License Version 2.0. You'll find a copy in the
-root directory of the distribution or online at:
-<http://www.apache.org/licenses/LICENSE-2.0>.
-
-
-SYSTEM REQUIREMENTS
--------------------
-
-Both python 2 (>=2.4) and python 3 are supported.
-
-
-INSTALLATION
-------------
-
-Using pip
-~~~~~~~~~
- 
-$ pip install rcssmin
- 
-
-Using distutils
-~~~~~~~~~~~~~~~
- 
-$ python setup.py install
- 
-The following extra options to the install command may be of interest:
- 
-   --without-c-extensions  Don't install C extensions
-   --without-docs          Do not install documentation files
- 
-
-Drop-in
-~~~~~~~
- 
-rCSSmin effectively consists of two files: rcssmin.py and rcssmin.c, the
-latter being entirely optional. So, for simple integration you can just
-copy rcssmin.py into your project and use it.
-
-
-DOCUMENTATION
--------------
-
-A generated API documentation is available in the docs/apidoc/ directory.
-But you can just look into the module. It provides a simple function,
-called cssmin which takes the CSS as a string and returns the minified
-CSS as a string.
-
-The module additionally provides a "streamy" interface:
-
-$ python -mrcssmin <css >minified
-
-It takes two options:
-
-  -b  Keep bang-comments (Comments starting with an exclamation mark)
-  -p  Force using the python implementation (not the C implementation)
-
-The latest documentation is also available online at
-<http://opensource.perlig.de/rcssmin/>.
-
-
-BUGS
-----
-
-No bugs, of course. ;-)
-But if you've found one or have an idea how to improve rcssmin, feel free to
-send a pull request on `github <https://github.com/ndparker/rcssmin>`_ or
-send a mail to <rcssmin-bugs@perlig.de>.
-
-
-AUTHOR INFORMATION
-------------------
-
-André "nd" Malo <nd@perlig.de>
-GPG: 0x8103A37E
-
-
-  If God intended people to be naked, they would be born that way.
-                                                   -- Oscar Wilde
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin
deleted file mode 100644
index c10ccb0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/LICENSE.cssmin
+++ /dev/null
@@ -1,64 +0,0 @@
-`cssmin.py` - A Python port of the YUI CSS compressor.
-
-Copyright (c) 2010 Zachary Voase
-
-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.
-
--------------------------------------------------------------------------------
-
-This software contains portions of the YUI CSS Compressor, notably some regular
-expressions for reducing the size of CSS. The YUI Compressor source code can be
-found at <http://github.com/yui/yuicompressor>, and is licensed as follows:
-
-> YUI Compressor Copyright License Agreement (BSD License)
-> 
-> Copyright (c) 2009, Yahoo! Inc.
-> All rights reserved.
-> 
-> Redistribution and use of this software 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 Yahoo! Inc. nor the names of its
->   contributors may be used to endorse or promote products
->   derived from this software without specific prior
->   written permission of Yahoo! Inc.
-> 
-> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-> IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-> DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-> FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-> SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-> OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py
deleted file mode 100644
index 705dd0c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/__init__.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: ascii -*-
-r"""
-=================================
- Benchmark cssmin implementations
-=================================
-
-Benchmark cssmin implementations.
-
-:Copyright:
-
- Copyright 2011 - 2014
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-"""
-if __doc__:
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py
deleted file mode 100644
index cbfbf8d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/cssmin.py
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""`cssmin` - A Python port of the YUI CSS compressor.
-
-:Copyright:
-
- Copyright 2011 - 2014
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-"""
-
-try:
-    from StringIO import StringIO # The pure-Python StringIO supports unicode.
-except ImportError:
-    from io import StringIO
-import re
-
-
-__version__ = '0.2.0'
-
-
-def remove_comments(css):
-    """Remove all CSS comment blocks."""
-
-    iemac = False
-    preserve = False
-    comment_start = css.find("/*")
-    while comment_start >= 0:
-        # Preserve comments that look like `/*!...*/`.
-        # Slicing is used to make sure we don"t get an IndexError.
-        preserve = css[comment_start + 2:comment_start + 3] == "!"
-
-        comment_end = css.find("*/", comment_start + 2)
-        if comment_end < 0:
-            if not preserve:
-                css = css[:comment_start]
-                break
-        elif comment_end >= (comment_start + 2):
-            if css[comment_end - 1] == "\\":
-                # This is an IE Mac-specific comment; leave this one and the
-                # following one alone.
-                comment_start = comment_end + 2
-                iemac = True
-            elif iemac:
-                comment_start = comment_end + 2
-                iemac = False
-            elif not preserve:
-                css = css[:comment_start] + css[comment_end + 2:]
-            else:
-                comment_start = comment_end + 2
-        comment_start = css.find("/*", comment_start)
-
-    return css
-
-
-def remove_unnecessary_whitespace(css):
-    """Remove unnecessary whitespace characters."""
-
-    def pseudoclasscolon(css):
-
-        """
-        Prevents 'p :link' from becoming 'p:link'.
-
-        Translates 'p :link' into 'p ___PSEUDOCLASSCOLON___link'; this is
-        translated back again later.
-        """
-
-        regex = re.compile(r"(^|\})(([^\{\:])+\:)+([^\{]*\{)")
-        match = regex.search(css)
-        while match:
-            css = ''.join([
-                css[:match.start()],
-                match.group().replace(":", "___PSEUDOCLASSCOLON___"),
-                css[match.end():]])
-            match = regex.search(css)
-        return css
-
-    css = pseudoclasscolon(css)
-    # Remove spaces from before things.
-    css = re.sub(r"\s+([!{};:>+\(\)\],])", r"\1", css)
-
-    # If there is a `@charset`, then only allow one, and move to the beginning.
-    css = re.sub(r"^(.*)(@charset \"[^\"]*\";)", r"\2\1", css)
-    css = re.sub(r"^(\s*@charset [^;]+;\s*)+", r"\1", css)
-
-    # Put the space back in for a few cases, such as `@media screen` and
-    # `(-webkit-min-device-pixel-ratio:0)`.
-    css = re.sub(r"\band\(", "and (", css)
-
-    # Put the colons back.
-    css = css.replace('___PSEUDOCLASSCOLON___', ':')
-
-    # Remove spaces from after things.
-    css = re.sub(r"([!{}:;>+\(\[,])\s+", r"\1", css)
-
-    return css
-
-
-def remove_unnecessary_semicolons(css):
-    """Remove unnecessary semicolons."""
-
-    return re.sub(r";+\}", "}", css)
-
-
-def remove_empty_rules(css):
-    """Remove empty rules."""
-
-    return re.sub(r"[^\}\{]+\{\}", "", css)
-
-
-def normalize_rgb_colors_to_hex(css):
-    """Convert `rgb(51,102,153)` to `#336699`."""
-
-    regex = re.compile(r"rgb\s*\(\s*([0-9,\s]+)\s*\)")
-    match = regex.search(css)
-    while match:
-        colors = map(lambda s: s.strip(), match.group(1).split(","))
-        hexcolor = '#%.2x%.2x%.2x' % tuple(map(int, colors))
-        css = css.replace(match.group(), hexcolor)
-        match = regex.search(css)
-    return css
-
-
-def condense_zero_units(css):
-    """Replace `0(px, em, %, etc)` with `0`."""
-
-    return re.sub(r"([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", r"\1\2", css)
-
-
-def condense_multidimensional_zeros(css):
-    """Replace `:0 0 0 0;`, `:0 0 0;` etc. with `:0;`."""
-
-    css = css.replace(":0 0 0 0;", ":0;")
-    css = css.replace(":0 0 0;", ":0;")
-    css = css.replace(":0 0;", ":0;")
-
-    # Revert `background-position:0;` to the valid `background-position:0 0;`.
-    css = css.replace("background-position:0;", "background-position:0 0;")
-
-    return css
-
-
-def condense_floating_points(css):
-    """Replace `0.6` with `.6` where possible."""
-
-    return re.sub(r"(:|\s)0+\.(\d+)", r"\1.\2", css)
-
-
-def condense_hex_colors(css):
-    """Shorten colors from #AABBCC to #ABC where possible."""
-
-    regex = re.compile(r"([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])")
-    match = regex.search(css)
-    while match:
-        first = match.group(3) + match.group(5) + match.group(7)
-        second = match.group(4) + match.group(6) + match.group(8)
-        if first.lower() == second.lower():
-            css = css.replace(match.group(), match.group(1) + match.group(2) + '#' + first)
-            match = regex.search(css, match.end() - 3)
-        else:
-            match = regex.search(css, match.end())
-    return css
-
-
-def condense_whitespace(css):
-    """Condense multiple adjacent whitespace characters into one."""
-
-    return re.sub(r"\s+", " ", css)
-
-
-def condense_semicolons(css):
-    """Condense multiple adjacent semicolon characters into one."""
-
-    return re.sub(r";;+", ";", css)
-
-
-def wrap_css_lines(css, line_length):
-    """Wrap the lines of the given CSS to an approximate length."""
-
-    lines = []
-    line_start = 0
-    for i, char in enumerate(css):
-        # It's safe to break after `}` characters.
-        if char == '}' and (i - line_start >= line_length):
-            lines.append(css[line_start:i + 1])
-            line_start = i + 1
-
-    if line_start < len(css):
-        lines.append(css[line_start:])
-    return '\n'.join(lines)
-
-
-def cssmin(css, wrap=None):
-    css = remove_comments(css)
-    css = condense_whitespace(css)
-    # A pseudo class for the Box Model Hack
-    # (see http://tantek.com/CSS/Examples/boxmodelhack.html)
-    css = css.replace('"\\"}\\""', "___PSEUDOCLASSBMH___")
-    css = remove_unnecessary_whitespace(css)
-    css = remove_unnecessary_semicolons(css)
-    css = condense_zero_units(css)
-    css = condense_multidimensional_zeros(css)
-    css = condense_floating_points(css)
-    css = normalize_rgb_colors_to_hex(css)
-    css = condense_hex_colors(css)
-    if wrap is not None:
-        css = wrap_css_lines(css, wrap)
-    css = css.replace("___PSEUDOCLASSBMH___", '"\\"}\\""')
-    css = condense_semicolons(css)
-    return css.strip()
-
-
-def main():
-    import optparse
-    import sys
-
-    p = optparse.OptionParser(
-        prog="cssmin", version=__version__,
-        usage="%prog [--wrap N]",
-        description="""Reads raw CSS from stdin, and writes compressed CSS to stdout.""")
-
-    p.add_option(
-        '-w', '--wrap', type='int', default=None, metavar='N',
-        help="Wrap output to approximately N chars per line.")
-
-    options, args = p.parse_args()
-    sys.stdout.write(cssmin(sys.stdin.read(), wrap=options.wrap))
-
-
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
deleted file mode 100644
index 0781506..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/main.py
+++ /dev/null
@@ -1,236 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-r"""
-==================================
- Benchmark cssmin implementations
-==================================
-
-Benchmark cssmin implementations.
-
-:Copyright:
-
- Copyright 2011 - 2014
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-Usage::
-
-    python -mbench.main [-c COUNT] [-p file] cssfile ...
-
-    -c COUNT  number of runs per cssfile and minifier. Defaults to 10.
-    -p file   File to write the benchmark results in (pickled)
-
-"""
-if __doc__:
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
-__license__ = "Apache License, Version 2.0"
-__version__ = "1.0.0"
-
-import sys as _sys
-import time as _time
-
-import_notes = []
-class _p_02__rcssmin(object):
-    def __init__(self):
-        import rcssmin
-        cssmin = rcssmin._make_cssmin(python_only=True)
-        self.cssmin = lambda x: cssmin(x, keep_bang_comments=True)
-
-class _p_03__rcssmin(object):
-    def __init__(self):
-        import _rcssmin
-        cssmin = _rcssmin.cssmin
-        self.cssmin = lambda x: cssmin(x, keep_bang_comments=True)
-
-class cssmins(object):
-    from bench import cssmin as p_01_cssmin
-    p_02_rcssmin = _p_02__rcssmin()
-    try:
-        p_03__rcssmin = _p_03__rcssmin()
-    except ImportError:
-        import_notes.append("_rcssmin (C-Port) not available")
-        print(import_notes[-1])
-
-print("Python Release: %s" % ".".join(map(str, _sys.version_info[:3])))
-print("")
-
-
-def slurp(filename):
-    """ Load a file """
-    fp = open(filename)
-    try:
-        return fp.read()
-    finally:
-        fp.close()
-
-
-def print_(*value, **kwargs):
-    """ Print stuff """
-    (kwargs.get('file') or _sys.stdout).write(
-        ''.join(value) + kwargs.get('end', '\n')
-    )
-
-
-def bench(filenames, count):
-    """
-    Benchmark the minifiers with given css samples
-
-    :Parameters:
-      `filenames` : sequence
-        List of filenames
-
-      `count` : ``int``
-        Number of runs per css file and minifier
-
-    :Exceptions:
-      - `RuntimeError` : empty filenames sequence
-    """
-    if not filenames:
-        raise RuntimeError("Missing files to benchmark")
-    try:
-        xrange
-    except NameError:
-        xrange = range
-    try:
-        cmp
-    except NameError:
-        cmp = lambda a, b: (a > b) - (a < b)
-
-    ports = [item for item in dir(cssmins) if item.startswith('p_')]
-    ports.sort()
-    space = max(map(len, ports)) - 4
-    ports = [(item[5:], getattr(cssmins, item).cssmin) for item in ports]
-    flush = _sys.stdout.flush
-
-    struct = []
-    inputs = [(filename, slurp(filename)) for filename in filenames]
-    for filename, style in inputs:
-        print_("Benchmarking %r..." % filename, end=" ")
-        flush()
-        outputs = []
-        for _, cssmin in ports:
-            try:
-                outputs.append(cssmin(style))
-            except (SystemExit, KeyboardInterrupt):
-                raise
-            except:
-                outputs.append(None)
-        struct.append(dict(
-            filename=filename,
-            sizes=[
-                (item is not None and len(item) or None) for item in outputs
-            ],
-            size=len(style),
-            messages=[],
-            times=[],
-        ))
-        print_("(%.1f KiB)" % (struct[-1]['size'] / 1024.0,))
-        flush()
-        times = []
-        for idx, (name, cssmin) in enumerate(ports):
-            if outputs[idx] is None:
-                print_("  FAILED %s" % (name,))
-                struct[-1]['times'].append((name, None))
-            else:
-                print_("  Timing %s%s... (%5.1f KiB %s)" % (
-                    name,
-                    " " * (space - len(name)),
-                    len(outputs[idx]) / 1024.0,
-                    idx == 0 and '*' or ['=', '>', '<'][
-                        cmp(len(outputs[idx]), len(outputs[0]))
-                    ],
-                ), end=" ")
-                flush()
-
-                xcount = count
-                while True:
-                    counted = [None for _ in xrange(xcount)]
-                    start = _time.time()
-                    for _ in counted:
-                        cssmin(style)
-                    end = _time.time()
-                    result = (end - start) * 1000
-                    if result < 10: # avoid measuring within the error range
-                        xcount *= 10
-                        continue
-                    times.append(result / xcount)
-                    break
-
-                print_("%8.2f ms" % times[-1], end=" ")
-                flush()
-                if len(times) <= 1:
-                    print_()
-                else:
-                    print_("(factor: %s)" % (', '.join([
-                        '%.2f' % (timed / times[-1]) for timed in times[:-1]
-                    ])))
-                struct[-1]['times'].append((name, times[-1]))
-
-            flush()
-        print_()
-
-    return struct
-
-
-def main(argv=None):
-    """ Main """
-    import getopt as _getopt
-    import os as _os
-    import pickle as _pickle
-
-    if argv is None:
-        argv = _sys.argv[1:]
-    try:
-        opts, args = _getopt.getopt(argv, "hc:p:", ["help"])
-    except getopt.GetoptError:
-        e = _sys.exc_info()[0](_sys.exc_info()[1])
-        print >> _sys.stderr, "%s\nTry %s -mbench.main --help" % (
-            e,
-            _os.path.basename(_sys.executable),
-        )
-        _sys.exit(2)
-
-    count, pickle = 10, None
-    for key, value in opts:
-        if key in ("-h", "--help"):
-            print >> _sys.stderr, (
-                "%s -mbench.main [-c count] [-p file] cssfile ..." % (
-                    _os.path.basename(_sys.executable),
-                )
-            )
-            _sys.exit(0)
-        elif key == '-c':
-            count = int(value)
-        elif key == '-p':
-            pickle = str(value)
-
-    struct = bench(args, count)
-    if pickle:
-        fp = open(pickle, 'wb')
-        try:
-            fp.write(_pickle.dumps((
-                ".".join(map(str, _sys.version_info[:3])),
-                import_notes,
-                struct,
-            ), 0))
-        finally:
-            fp.close()
-
-
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css
deleted file mode 100644
index 03079e3..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.css
+++ /dev/null
@@ -1,3861 +0,0 @@
-/*
- * This CSS is taken from wikipedia / mediawiki, it's the combined files of
- * the vector skin described at:
- *
- * http://en.wikipedia.org/wiki/Wikipedia:Catalogue_of_CSS_classes
- */
-
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs
- * should be prepended with @embed in a comment block.
- *
- * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-
-/* Framework */
-html,
-body {
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	font-family: sans-serif;
-	font-size: 1em;
-}
-body {
-	background-color: #f3f3f3;
-	/* @embed */
-	background-image: url(images/page-base.png);
-}
-/* Content */
-div#content {
-	margin-left: 10em;
-	padding: 1em;
-	/* @embed */
-	background-image: url(images/border.png);
-	background-position: top left;
-	background-repeat: repeat-y;
-	background-color: white;
-	color: black;
-	direction: ltr;
-}
-/* Head */
-#mw-page-base {
-	height: 5em;
-	background-color: white;
-	/* @embed */
-	background-image: url(images/page-fade.png);
-	background-position: bottom left;
-	background-repeat: repeat-x;
-}
-#mw-head-base {
-	margin-top: -5em;
-	margin-left: 10em;
-	height: 5em;
-	/* @embed */
-	background-image: url(images/border.png);
-	background-position: bottom left;
-	background-repeat: repeat-x;
-}
-div#mw-head {
-	position: absolute;
-	top: 0;
-	right: 0;
-	width: 100%;
-}
-div#mw-head h5 {
-	margin: 0;
-	padding: 0;
-}
-/* Hide empty portlets */
-div.emptyPortlet {
-		display: none;
-}
-/* Personal */
-#p-personal {
-	position: absolute;
-	top: 0;
-	right: 0.75em;
-}
-#p-personal h5 {
-	display: none;
-}
-#p-personal ul {
-	list-style: none;
-	margin: 0;
-	padding-left: 10em; /* Keep from overlapping logo */
-}
-/* @noflip */
-#p-personal li {
-	line-height: 1.125em;
-	float: left;
-}
-/* This one flips! */
-#p-personal li {
-	margin-left: 0.75em;
-	margin-top: 0.5em;
-	font-size: 0.75em;
-	white-space: nowrap;
-}
-/* Navigation Containers */
-#left-navigation {
-	position: absolute;
-	left: 10em;
-	top: 2.5em;
-}
-#right-navigation {
-	float: right;
-	margin-top: 2.5em;
-}
-/* Navigation Labels */
-div.vectorTabs h5,
-div.vectorMenu h5 span {
-	display: none;
-}
-/* Namespaces and Views */
-/* @noflip */
-div.vectorTabs {
-	float: left;
-	height: 2.5em;
-}
-div.vectorTabs {
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-position: bottom left;
-	background-repeat: no-repeat;
-	padding-left: 1px;
-}
-/* @noflip */
-div.vectorTabs ul {
-	float: left;
-}
-div.vectorTabs ul {
-	height: 100%;
-	list-style: none;
-	margin: 0;
-	padding: 0;
-}
-/* @noflip */
-div.vectorTabs ul li {
-	float: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs ul li {
-	line-height: 1.125em;
-	display: inline-block;
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	background-color: #f3f3f3;
-	/* @embed */
-	background-image: url(images/tab-normal-fade.png);
-	background-position: bottom left;
-	background-repeat: repeat-x;
-	white-space:nowrap;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs ul > li {
-	display: block;
-}
-div.vectorTabs li.selected {
-	/* @embed */
-	background-image: url(images/tab-current-fade.png);
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs li a {
-	display: inline-block;
-	height: 1.9em;
-	padding-left: 0.5em;
-	padding-right: 0.5em;
-	color: #0645ad;
-	cursor: pointer;
-	font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs li > a {
-	display: block;
-}
-div.vectorTabs li.icon a {
-	background-position: bottom right;
-	background-repeat: no-repeat;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs span a  {
-	display: inline-block;
-	padding-top: 1.25em;
-}
-/* IGNORED BY IE6 */
-/* @noflip */
-div.vectorTabs span > a {
-	float: left;
-	display: block;
-}
-div.vectorTabs span {
-	display: inline-block;
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-position: bottom right;
-	background-repeat: no-repeat;
-}
-div.vectorTabs li.selected a,
-div.vectorTabs li.selected a:visited{
-	color: #333333;
-	text-decoration: none;
-}
-div.vectorTabs li.new a,
-div.vectorTabs li.new a:visited{
-	color: #a55858;
-}
-/* Variants and Actions */
-/* @noflip */
-div.vectorMenu {
-	direction: ltr;
-	float: left;
-	/* @embed */
-	background-image: url(images/arrow-down-icon.png);
-	background-position: 100% 60%;
-	background-repeat: no-repeat;
-	cursor: pointer;
-}
-div.vectorMenuFocus {
-	/* @embed */
-	background-image: url(images/arrow-down-focus-icon.png);
-	background-position: 100% 60%;
-}
-/* @noflip */
-body.rtl div.vectorMenu {
-	direction: rtl;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-div#mw-head div.vectorMenu h5 {
-	float: left;
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div#mw-head div.vectorMenu h5 {
-	background-position: bottom left;
-	margin-left: -1px;
-}
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h5 {
-	background-image: none;
-}
-div#mw-head div.vectorMenu h4 {
-	display: inline-block;
-	float: left;
-	font-size: 0.8em;
-	padding-left: 0.5em;
-	padding-top: 1.375em;
-	font-weight: normal;
-	border: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-div.vectorMenu h5 a {
-	display: inline-block;
-	width: 24px;
-	height: 2.5em;
-	text-decoration: none;
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div.vectorMenu h5 a {
-	background-position: bottom right;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu h5 > a {
-	display: block;
-}
-div.vectorMenu div.menu {
-	position: relative;
-	display: none;
-	clear: both;
-	text-align: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-body.rtl div.vectorMenu div.menu {
-	margin-left: 24px;
-}
-/* IGNORED BY IE6 */
-/* @noflip */
-body.rtl div.vectorMenu > div.menu {
-	margin-left: auto;
-}
-/* IGNORED BY IE6 */
-/* Also fixes old versions of FireFox */
-/* @noflip */
-body.rtl div.vectorMenu > div.menu,
-x:-moz-any-link {
-	margin-left: 23px;
-}
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu div.menuForceShow {
-	display: block;
-}
-div.vectorMenu ul {
-	position: absolute;
-	background-color: white;
-	border: solid 1px silver;
-	border-top-width: 0;
-	list-style: none;
-	list-style-image: none;
-	list-style-type: none;
-	padding: 0;
-	margin: 0;
-	margin-left: -1px;
-	text-align: left;
-}
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
-	min-width: 5em;
-}
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
-	min-width: 0;
-}
-div.vectorMenu li {
-	padding: 0;
-	margin: 0;
-	text-align: left;
-	line-height: 1em;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
-	display: inline-block;
-	padding: 0.5em;
-	white-space: nowrap;
-	color: #0645ad;
-	cursor: pointer;
-	font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
-	display: block;
-}
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
-	color: #333333;
-	text-decoration: none;
-}
-/* Search */
-#p-search h5 {
-	display: none;
-}
-/* @noflip */
-#p-search {
-	float: left;
-}
-#p-search {
-	margin-right: 0.5em;
-	margin-left: 0.5em;
-}
-#p-search form,
-#p-search input {
-	margin: 0;
-	margin-top: 0.4em;
-}
-div#simpleSearch {
-	display: block;
-	width: 14em;
-	height: 1.4em;
-	margin-top: 0.65em;
-	position: relative;
-	min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-	border: solid 1px #AAAAAA;
-	color: black;
-	background-color: white;
-	/* @embed */
-	background-image: url(images/search-fade.png);
-	background-position: top left;
-	background-repeat: repeat-x;
-}
-div#simpleSearch label {
-	/*
-	 * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-	 * this from ever being shown anyways.
-	*/
-	font-size: 13px;
-	top: 0.25em;
-	direction: ltr;
-}
-div#simpleSearch input {
-	color: black;
-	direction: ltr;
-}
-div#simpleSearch input:focus {
-	outline: none;
-}
-div#simpleSearch input.placeholder {
-	color: #999999;
-}
-div#simpleSearch input::-webkit-input-placeholder {
-	color: #999999;
-}
-div#simpleSearch input#searchInput {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 90%;
-	margin: 0;
-	padding: 0;
-	padding-left: 0.2em;
-	padding-top: 0.2em;
-	padding-bottom: 0.2em;
-	outline: none;
-	border: none;
-	/*
-	 * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-	 * this from ever being shown anyways.
-	*/
-	font-size: 13px;
-	background-color: transparent;
-	direction: ltr;
-}
-div#simpleSearch button#searchButton {
-	position: absolute;
-	width: 10%;
-	right: 0;
-	top: 0;
-	padding: 0;
-	padding-top: 0.3em;
-	padding-bottom: 0.2em;
-	padding-right: 0.4em;
-	margin: 0;
-	border: none;
-	cursor: pointer;
-	background-color: transparent;
-	background-image: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#simpleSearch button#searchButton img {
-	border: none;
-	margin: 0;
-	margin-top: -3px;
-	padding: 0;
-}
-/* IGNORED BY IE6 */
-div#simpleSearch button#searchButton > img {
-	margin: 0;
-}
-/* Panel */
-div#mw-panel {
-	position: absolute;
-	top: 160px;
-	padding-top: 1em;
-	width: 10em;
-	left: 0;
-}
-div#mw-panel div.portal {
-	padding-bottom: 1.5em;
-	direction: ltr;
-}
-div#mw-panel div.portal h5 {
-	font-weight: normal;
-	color: #444444;
-	padding: 0.25em;
-	padding-top: 0;
-	padding-left: 1.75em;
-	cursor: default;
-	border: none;
-	font-size: 0.75em;
-}
-div#mw-panel div.portal div.body {
-	margin: 0;
-	padding-top: 0.5em;
-	margin-left: 1.25em;
-	/* @embed */
-	background-image: url(images/portal-break.png);
-	background-repeat: no-repeat;
-	background-position: top left;
-}
-div#mw-panel div.portal div.body ul {
-	list-style: none;
-	list-style-image: none;
-	list-style-type: none;
-	padding: 0;
-	margin: 0;
-}
-div#mw-panel div.portal div.body ul li {
-	line-height: 1.125em;
-	padding: 0;
-	padding-bottom: 0.5em;
-	margin: 0;
-	overflow: hidden;
-	font-size: 0.75em;
-}
-div#mw-panel div.portal div.body ul li a {
-	color: #0645ad;
-}
-div#mw-panel div.portal div.body ul li a:visited {
-	color: #0b0080;
-}
-/* Footer */
-div#footer {
-	margin-left: 10em;
-	margin-top: 0;
-	padding: 0.75em;
-	/* @embed */
-	background-image: url(images/border.png);
-	background-position: top left;
-	background-repeat: repeat-x;
-	direction: ltr;
-}
-div#footer ul {
-	list-style: none;
-	list-style-image: none;
-	list-style-type: none;
-	margin: 0;
-	padding: 0;
-}
-div#footer ul li {
-	margin: 0;
-	padding: 0;
-	padding-top: 0.5em;
-	padding-bottom: 0.5em;
-	color: #333333;
-	font-size: 0.7em;
-}
-div#footer #footer-icons {
-	float: right;
-}
-/* @noflip */
-body.ltr div#footer #footer-places {
-	float: left;
-}
-div#footer #footer-info li {
-	line-height: 1.4em;
-}
-div#footer #footer-icons li {
-	float: left;
-	margin-left: 0.5em;
-	line-height: 2em;
-	text-align: right;
-}
-div#footer #footer-places li {
-	float: left;
-	margin-right: 1em;
-	line-height: 2em;
-}
-/* Logo */
-#p-logo {
-	position: absolute;
-	top: -160px;
-	left: 0;
-	width: 10em;
-	height: 160px;
-}
-#p-logo a {
-	display: block;
-	width: 10em;
-	height: 160px;
-	background-repeat: no-repeat;
-	background-position: center center;
-	text-decoration: none;
-}
-
-/*
- *
- * The following code is highly modified from monobook. It would be nice if the
- * preftoc id was more human readable like preferences-toc for instance,
- * howerver this would require backporting the other skins.
- */
-
-/* Preferences */
-#preftoc {
-	/* Tabs */
-	width: 100%;
-	float: left;
-	clear: both;
-	margin: 0 !important;
-	padding: 0 !important;
-	/* @embed */
-	background-image: url(images/preferences-break.png);
-	background-position: bottom left;
-	background-repeat: no-repeat;
-}
-	#preftoc li {
-		/* Tab */
-		float: left;
-		margin: 0;
-		padding: 0;
-		padding-right: 1px;
-		height: 2.25em;
-		white-space: nowrap;
-		list-style-type: none;
-		list-style-image: none;
-		/* @embed */
-		background-image: url(images/preferences-break.png);
-		background-position: bottom right;
-		background-repeat: no-repeat;
-	}
-	/* Sadly, IE6 won't understand this */
-	#preftoc li:first-child {
-		margin-left: 1px;
-	}
-	#preftoc a,
-	#preftoc a:active {
-		display: inline-block;
-		position: relative;
-		color: #0645ad;
-		padding: 0.5em;
-		text-decoration: none;
-		background-image: none;
-		font-size: 0.9em;
-	}
-	#preftoc a:hover,
-	#preftoc a:focus {
-		text-decoration: underline;
-	}
-	#preftoc li.selected a {
-		/* @embed */
-		background-image: url(images/preferences-fade.png);
-		background-position: bottom;
-		background-repeat: repeat-x;
-		color: #333333;
-		text-decoration: none;
-	}
-#preferences {
-	float: left;
-	width: 100%;
-	margin: 0;
-	margin-top: -2px;
-	clear: both;
-	border: solid 1px #cccccc;
-	background-color: #f9f9f9;
-	/* @embed */
-	background-image: url(images/preferences-base.png);
-}
-#preferences fieldset {
-	border: none;
-	border-top: solid 1px #cccccc;
-}
-#preferences fieldset.prefsection {
-	border: none;
-	padding: 0;
-	margin: 1em;
-}
-#preferences legend {
-	color: #666666;
-}
-#preferences fieldset.prefsection legend.mainLegend {
-	display: none;
-}
-#preferences td {
-	padding-left: 0.5em;
-	padding-right: 0.5em;
-}
-#preferences td.htmlform-tip {
-	font-size: x-small;
-	padding: .2em 2em;
-	color: #666666;
-}
-#preferences div.mw-prefs-buttons {
-	padding: 1em;
-}
-#preferences div.mw-prefs-buttons input {
-	margin-right: 0.25em;
-}
-
-/**
- * The following code is slightly modified from monobook
- */
-div#content {
-	line-height: 1.5em;
-}
-#bodyContent {
-	font-size: 0.8em;
-}
-
-.editsection {
-	float: right;
-}
-
-ul {
-	/* @embed */
-	list-style-image: url(images/bullet-icon.png);
-}
-
-pre {
-	line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-	font-size: 0.8em;
-}
-#firstHeading {
-	padding-top: 0;
-	margin-top: 0;
-	padding-top: 0;
-	font-size: 1.6em;
-}
-div#content a.external,
-div#content a.external[href ^="gopher://"] {
-	/* @embed */
-	background: url(images/external-link-ltr-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
-	/* @embed */
-	background: url(images/lock-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
-	/* @embed */
-	background: url(images/mail-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
-	/* @embed */
-	background: url(images/news-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
-	/* @embed */
-	background: url(images/file-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
-	/* @embed */
-	background: url(images/talk-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
-div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
-div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
-div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
-div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
-div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
-.link-audio {
-	/* @embed */
-	background: url(images/audio-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
-div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
-div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
-div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
-.link-video {
-	/* @embed */
-	background: url(images/video-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
-div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
-div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
-.link-document {
-	/* @embed */
-	background: url(images/document-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
-	/* @embed */
-	background: url(images/user-icon.png) left top no-repeat;
-	padding-left: 15px !important;
-	text-transform: none;
-}
-
-.redirectText {
-	font-size: 140%;
-}
-
-.redirectMsg img {
-	vertical-align: text-bottom;
-}
-
-#bodyContent {
-	position: relative;
-	width: 100%;
-}
-#mw-js-message {
-	font-size: 0.8em;
-}
-div#bodyContent {
-	line-height: 1.5em;
-}
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
-	margin: 0;
-	padding: 0;
-	outline: none;
-	display: block;
-	width: 26px;
-	/* This hides the text but shows the background image */
-	padding-top: 3.1em;
-	margin-top: 0;
-	/* Only applied in IE6 */
-	margin-top: -0.8em !ie;
-	height: 0;
-	overflow: hidden;
-	/* @embed */
-	background-image: url(images/watch-icons.png);
-}
-#ca-unwatch.icon a {
-	background-position: -43px 60%;
-}
-#ca-watch.icon a {
-	background-position: 5px 60%;
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
-	background-position: -67px 60%;
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
-	background-position: -19px 60%;
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
-	/* @embed */
-	background-image: url(images/watch-icon-loading.gif);
-	background-position: 5px 60%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
-	display: none;
-}
-div.vectorTabs ul {
-	/* @embed */
-	background-image:url(images/tab-break.png);
-	background-position:right bottom;
-	background-repeat:no-repeat;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-	font-size: 0.8em;
-}
-/**
- * CSS in this file is used by *all* skins (that have any CSS at all). Be
- * careful what you put in here, since what looks good in one skin may not in
- * another, but don't ignore the poor pre-Monobook users either.
- */
-
-/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
-
-/**
- * These classes should be used for text depending on the content direction.
- * Content stuff like editsection, ul/ol and TOC depend on this.
- */
-.mw-content-ltr {
-	/* @noflip */
-	direction: ltr;
-}
-.mw-content-rtl {
-	/* @noflip */
-	direction: rtl;
-}
-
-/* Most input fields should be in site direction */
-.sitedir-ltr textarea,
-.sitedir-ltr input {
-	/* @noflip */
-	direction: ltr;
-}
-.sitedir-rtl textarea,
-.sitedir-rtl input {
-	/* @noflip */
-	direction: rtl;
-}
-
-/* Input types that should follow user direction, like buttons */
-/* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
-	direction: ltr;
-}
-
-/* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
-	/* @noflip */
-	direction: ltr;
-}
-textarea[dir="rtl"],
-input[dir="rtl"] {
-	/* @noflip */
-	direction: rtl;
-}
-
-/* Default style for semantic tags */
-abbr,
-acronym,
-.explain {
-	border-bottom: 1px dotted;
-	cursor: help;
-}
-
-/* Colored watchlist and recent changes numbers */
-.mw-plusminus-pos {
-	color: #006400; /* dark green */
-}
-.mw-plusminus-neg {
-	color: #8b0000; /* dark red */
-}
-.mw-plusminus-null {
-	color: #aaa; /* gray */
-}
-
-/**
- * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
- * [[Special:Watchlist/edit]] and in category listings.
- */
-.allpagesredirect,
-.redirect-in-category,
-.watchlistredir {
-	font-style: italic;
-}
-
-/* Comment and username portions of RC entries */
-span.comment {
-	font-style: italic;
-}
-
-span.changedby {
-	font-size: 95%;
-}
-
-/* Math */
-.texvc {
-	direction: ltr;
-	unicode-bidi: embed;
-}
-img.tex {
-	vertical-align: middle;
-}
-span.texhtml {
-	font-family: serif;
-}
-
-/**
- * Add a bit of margin space between the preview and the toolbar.
- * This replaces the ugly <p><br /></p> we used to insert into the page source
- */
-#wikiPreview.ontop {
-	margin-bottom: 1em;
-}
-
-/* Stop floats from intruding into edit area in previews */
-#editform,
-#toolbar,
-#wpTextbox1 {
-	clear: both;
-}
-#toolbar img {
-	cursor: pointer;
-}
-div#mw-js-message {
-	margin: 1em 5%;
-	padding: 0.5em 2.5%;
-	border: solid 1px #ddd;
-	background-color: #fcfcfc;
-}
-
-/* Edit section links */
-.editsection {
-	float: right;
-	margin-left: 5px;
-}
-/* Correct directionality when page dir is different from site/user dir */
-.mw-content-ltr .editsection,
-.mw-content-rtl .mw-content-ltr .editsection {
-	/* @noflip */
-	float: right;
-}
-.mw-content-rtl .editsection,
-.mw-content-ltr .mw-content-rtl .editsection {
-	/* @noflip */
-	float: left;
-}
-
-/**
- * File description page
- */
-
-div.mw-filepage-resolutioninfo {
-	font-size: smaller;
-}
-
-/**
- * File histories
- */
-h2#filehistory {
-	clear: both;
-}
-
-table.filehistory th,
-table.filehistory td {
-	vertical-align: top;
-}
-table.filehistory th {
-	text-align: left;
-}
-table.filehistory td.mw-imagepage-filesize,
-table.filehistory th.mw-imagepage-filesize {
-	white-space: nowrap;
-}
-
-table.filehistory td.filehistory-selected {
-	font-weight: bold;
-}
-
-/**
- * Add a checkered background image on hover for file
- * description pages. (bug 26470)
- */
-.filehistory a img,
-#file img:hover {
-	/* @embed */
-	background: white url(images/Checker-16x16.png) repeat;
-}
-
-/**
- * rev_deleted stuff
- */
-li span.deleted,
-span.history-deleted {
-	text-decoration: line-through;
-	color: #888;
-	font-style: italic;
-}
-
-/**
- * Patrol stuff
- */
-.not-patrolled {
-	background-color: #ffa;
-}
-
-.unpatrolled {
-	font-weight: bold;
-	color: red;
-}
-
-div.patrollink {
-	font-size: 75%;
-	text-align: right;
-}
-
-/**
- * Forms
- */
-td.mw-label {
-	text-align: right;
-}
-td.mw-input {
-	text-align: left;
-}
-td.mw-submit {
-	text-align: left;
-}
-
-td.mw-label {
-	vertical-align: top;
-}
-.prefsection td.mw-label {
-	width: 20%;
-}
-.prefsection table {
-	width: 100%;
-}
-td.mw-submit {
-	white-space: nowrap;
-}
-
-table.mw-htmlform-nolabel td.mw-label {
-	width: 1px;
-}
-
-tr.mw-htmlform-vertical-label td.mw-label {
-	text-align: left !important;
-}
-
-.mw-htmlform-invalid-input td.mw-input input {
-	border-color: red;
-}
-
-.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
-	display: inline;
-	margin-right: 1em;
-	white-space: nowrap;
-}
-
-input#wpSummary {
-	width: 80%;
-}
-
-/**
- * Image captions
- */
-.thumbcaption {
-	text-align: left;
-}
-.magnify {
-	float: right;
-}
-
-/**
- * Categories
- */
-#catlinks {
-	/**
-	 * Overrides text justification (user preference)
-	 * See bug 31990
-	 */
-	text-align: left;
-}
-.catlinks ul {
-	display: inline;
-	margin: 0;
-	padding: 0;
-	list-style: none;
-	list-style-type: none;
-	list-style-image: none;
-	vertical-align: middle !ie;
-}
-
-.catlinks li {
-	display: inline-block;
-	line-height: 1.25em;
-	border-left: 1px solid #AAA;
-	margin: 0.125em 0;
-	padding: 0 0.5em;
-	zoom: 1;
-	display: inline !ie;
-}
-
-.catlinks li:first-child {
-	padding-left: 0.25em;
-	border-left: none;
-}
-/**
- * Hidden categories
- */
-.mw-hidden-cats-hidden {
-	display: none;
-}
-.catlinks-allhidden {
-	display: none;
-}
-
-/* Convenience links to edit block, delete and protect reasons */
-p.mw-ipb-conveniencelinks,
-p.mw-protect-editreasons,
-p.mw-filedelete-editreasons,
-p.mw-delete-editreasons,
-p.mw-revdel-editreasons {
-	font-size: 90%;
-	text-align: right;
-}
-
-/**
- * OpenSearch ajax suggestions
- */
-.os-suggest {
-	overflow: auto;
-	overflow-x: hidden;
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 0;
-	background-color: white;
-	border-style: solid;
-	border-color: #AAAAAA;
-	border-width: 1px;
-	z-index:99;
-	font-size:95%;
-}
-
-table.os-suggest-results {
-	font-size: 95%;
-	cursor: pointer;
-	border: 0;
-	border-collapse: collapse;
-	width: 100%;
-}
-
-.os-suggest-result,
-.os-suggest-result-hl {
-	white-space: nowrap;
-	background-color: white;
-	color: black;
-	padding: 2px;
-}
-.os-suggest-result-hl,
-.os-suggest-result-hl-webkit {
-	background-color: #4C59A6;
-	color: white;
-}
-
-.os-suggest-toggle {
-	position: relative;
-	left: 1ex;
-	font-size: 65%;
-}
-.os-suggest-toggle-def {
-	position: absolute;
-	top: 0;
-	left: 0;
-	font-size: 65%;
-	visibility: hidden;
-}
-
-/* Page history styling */
-
-/* The auto-generated edit comments */
-.autocomment {
-	color: gray;
-}
-#pagehistory .history-user {
-	margin-left: 0.4em;
-	margin-right: 0.2em;
-}
-#pagehistory span.minor {
-	font-weight: bold;
-}
-#pagehistory li {
-	border: 1px solid white;
-}
-#pagehistory li.selected {
-	background-color: #f9f9f9;
-	border: 1px dashed #aaa;
-}
-
-.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
-	float: right;
-}
-
-/** Generic minor/bot/newpage styling (recent changes) */
-.newpage,
-.minoredit,
-.botedit {
-	font-weight: bold;
-}
-
-#shared-image-dup,
-#shared-image-conflict {
-	font-style: italic;
-}
-
-/**
- * Recreating deleted page warning
- * Reupload file warning
- * Page protection warning
- * incl. log entries for these warnings
- */
-div.mw-warning-with-logexcerpt {
-	padding: 3px;
-	margin-bottom: 3px;
-	border: 2px solid #2F6FAB;
-	clear: both;
-}
-div.mw-warning-with-logexcerpt ul li {
-	font-size: 90%;
-}
-
-/* (show/hide) revision deletion links */
-span.mw-revdelundel-link,
-strong.mw-revdelundel-link {
-	font-size: 90%;
-}
-span.mw-revdelundel-hidden,
-input.mw-revdelundel-hidden {
-	visibility: hidden;
-}
-
-td.mw-revdel-checkbox,
-th.mw-revdel-checkbox {
-	padding-right: 10px;
-	text-align: center;
-}
-
-/* feed links */
-a.feedlink {
-	/* @embed */
-	background: url(images/feed-icon.png) center left no-repeat;
-	padding-left: 16px;
-}
-
-/* Plainlinks - this can be used to switch
- * off special external link styling */
-.plainlinks a {
-	background: none !important;
-	padding: 0 !important;
-}
-/* External URLs should always be treated as LTR (bug 4330) */
-/* @noflip */ .rtl a.external.free,
-.rtl a.external.autonumber {
-	direction: ltr;
-	unicode-bidi: embed;
-}
-
-/**
- * wikitable class for skinning normal tables
- * keep in sync with commonPrint.css
- */
-table.wikitable {
-	margin: 1em 1em 1em 0;
-	background-color: #f9f9f9;
-	border: 1px #aaa solid;
-	border-collapse: collapse;
-	color: black;
-}
-table.wikitable > tr > th,
-table.wikitable > tr > td,
-table.wikitable > * > tr > th,
-table.wikitable > * > tr > td {
-	border: 1px #aaa solid;
-	padding: 0.2em;
-}
-table.wikitable > tr > th,
-table.wikitable > * > tr > th {
-	background-color: #f2f2f2;
-	text-align: center;
-}
-table.wikitable > caption {
-	font-weight: bold;
-}
-
-/* hide initially collapsed collapsable tables */
-table.collapsed tr.collapsable {
-	display: none;
-}
-
-/* success and error messages */
-.success {
-	color: green;
-	font-size: larger;
-}
-.warning {
-	color: #FFA500; /* orange */
-	font-size: larger;
-}
-.error {
-	color: red;
-	font-size: larger;
-}
-.errorbox,
-.warningbox,
-.successbox {
-	font-size: larger;
-	border: 2px solid;
-	padding: .5em 1em;
-	float: left;
-	margin-bottom: 2em;
-	color: #000;
-}
-.errorbox {
-	border-color: red;
-	background-color: #fff2f2;
-}
-.warningbox {
-	border-color: #FF8C00; /* darkorange */
-	background-color: #FFFFC0;
-}
-.successbox {
-	border-color: green;
-	background-color: #dfd;
-}
-.errorbox h2,
-.warningbox h2,
-.successbox h2 {
-	font-size: 1em;
-	font-weight: bold;
-	display: inline;
-	margin: 0 .5em 0 0;
-	border: none;
-}
-
-/* general info/warning box for SP */
-.mw-infobox {
-	border: 2px solid #ff7f00;
-	margin: 0.5em;
-	clear: left;
-	overflow: hidden;
-}
-
-.mw-infobox-left {
-	margin: 7px;
-	float: left;
-	width: 35px;
-}
-
-.mw-infobox-right {
-	margin: 0.5em 0.5em 0.5em 49px;
-}
-
-/* Note on preview page */
-.previewnote {
-	color: #c00;
-	margin-bottom: 1em;
-}
-
-.previewnote p {
-	text-indent: 3em;
-	margin: 0.8em 0;
-}
-
-.visualClear {
-	clear: both;
-}
-
-#mw_trackbacks {
-	border: solid 1px #bbbbff;
-	background-color: #eeeeff;
-	padding: 0.2em;
-}
-
-/**
- * Data table style
- *
- * Transparent table with suddle borders
- * and blue row-highlighting.
- */
-.mw-datatable {
-	border-collapse: collapse;
-}
-.mw-datatable,
-.mw-datatable td,
-.mw-datatable th {
-	border: 1px solid #aaaaaa;
-	padding: 0 0.15em 0 0.15em;
-}
-.mw-datatable th {
-	background-color: #ddddff;
-}
-.mw-datatable td {
-	background-color: #ffffff;
-}
-.mw-datatable tr:hover td {
-	background-color: #eeeeff;
-}
-
-
-/**
- * TablePager tables generated by the TablePager PHP class
- * in MediaWiki (e.g. Special:ListFiles).
- */
-.TablePager {
-	min-width: 80%;
-}
-.TablePager_nav {
-	margin: 0 auto;
-}
-.TablePager_nav td {
-	padding: 3px;
-	text-align: center;
-}
-.TablePager_nav a {
-	text-decoration: none;
-}
-
-.imagelist td,
-.imagelist th {
-	white-space: nowrap;
-}
-.imagelist .TablePager_col_links {
-	background-color: #eeeeff;
-}
-.imagelist .TablePager_col_img_description {
-	white-space: normal;
-}
-.imagelist th.TablePager_sort {
-	background-color: #ccccff;
-}
-
-/* filetoc */
-ul#filetoc {
-	text-align: center;
-	border: 1px solid #aaaaaa;
-	background-color: #f9f9f9;
-	padding: 5px;
-	font-size: 95%;
-	margin-bottom: 0.5em;
-	margin-left: 0;
-	margin-right: 0;
-}
-
-#filetoc li {
-	display: inline;
-	list-style-type: none;
-	padding-right: 2em;
-}
-
-/* Classes for EXIF data display */
-table.mw_metadata {
-	font-size: 0.8em;
-	margin-left: 0.5em;
-	margin-bottom: 0.5em;
-	width: 400px;
-}
-
-table.mw_metadata caption {
-	font-weight: bold;
-}
-
-table.mw_metadata th {
-	font-weight: normal;
-}
-
-table.mw_metadata td {
-	padding: 0.1em;
-}
-
-table.mw_metadata {
-	border: none;
-	border-collapse: collapse;
-}
-
-table.mw_metadata td,
-table.mw_metadata th {
-	text-align: center;
-	border: 1px solid #aaaaaa;
-	padding-left: 5px;
-	padding-right: 5px;
-}
-
-table.mw_metadata th {
-	background-color: #f9f9f9;
-}
-
-table.mw_metadata td {
-	background-color: #fcfcfc;
-}
-
-table.mw_metadata ul.metadata-langlist {
-	list-style-type: none;
-	list-style-image: none;
-	padding-right: 5px;
-	padding-left: 5px;
-	margin: 0;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-.mw-content-ltr ul,
-.mw-content-rtl .mw-content-ltr ul {
-	/* @noflip */
-	margin: 0.3em 0 0 1.6em;
-	padding: 0;
-}
-.mw-content-rtl ul,
-.mw-content-ltr .mw-content-rtl ul {
-	/* @noflip */
-	margin: 0.3em 1.6em 0 0;
-	padding: 0;
-}
-.mw-content-ltr ol,
-.mw-content-rtl .mw-content-ltr ol {
-	/* @noflip */
-	margin: 0.3em 0 0 3.2em;
-	padding: 0;
-}
-.mw-content-rtl ol,
-.mw-content-ltr .mw-content-rtl ol {
-	/* @noflip */
-	margin: 0.3em 3.2em 0 0;
-	padding: 0;
-}
-/* @noflip */
-.mw-content-ltr dd,
-.mw-content-rtl .mw-content-ltr dd {
-	margin-left: 1.6em;
-	margin-right: 0;
-}
-/* @noflip */
-.mw-content-rtl dd,
-.mw-content-ltr .mw-content-rtl dd {
-	margin-right: 1.6em;
-	margin-left: 0;
-}
-
-/* Galleries */
-/* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update commonPrint.css */
-li.gallerybox {
-	vertical-align: top;
-	border: solid 2px white;
-	display: -moz-inline-box;
-	display: inline-block;
-}
-
-ul.gallery,
-li.gallerybox {
-	zoom: 1;
-	*display: inline;
-}
-
-ul.gallery {
-	margin: 2px;
-	padding: 2px;
-	display: block;
-}
-
-li.gallerycaption {
-	font-weight: bold;
-	text-align: center;
-	display: block;
-	word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-	text-align: center;
-	border: 1px solid #ccc;
-	background-color: #f9f9f9;
-	margin: 2px;
-}
-
-li.gallerybox div.thumb img {
-	display: block;
-	margin: 0 auto;
-}
-
-div.gallerytext {
-	overflow: hidden;
-	font-size: 94%;
-	padding: 2px 4px;
-	word-wrap: break-word;
-}
-
-.mw-ajax-loader {
-	/* @embed */
-	background-image: url(images/ajax-loader.gif);
-	background-position: center center;
-	background-repeat: no-repeat;
-	padding: 16px;
-	position: relative;
-	top: -16px;
-}
-
-.mw-small-spinner {
-	padding: 10px !important;
-	margin-right: 0.6em;
-	/* @embed */
-	background-image: url(images/spinner.gif);
-	background-position: center center;
-	background-repeat: no-repeat;
-}
-
-/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
-/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
-h1:lang(as),
-h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
-h1:lang(bho),
-h1:lang(bn),
-h1:lang(gu),
-h1:lang(hi),
-h1:lang(kn),
-h1:lang(ml),
-h1:lang(mr),
-h1:lang(or),
-h1:lang(pa),
-h1:lang(sa),
-h1:lang(ta),
-h1:lang(te) {
-	line-height: 1.5em !important;
-}
-h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
-h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
-h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
-h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
-h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
-h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
-h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
-h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
-h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
-h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
-h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
-h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
-h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
-h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
-	line-height: 1.2em;
-}
-
-/* Localised ordered list numbering for some languages */
-ol:lang(bcc) li,
-ol:lang(bqi) li,
-ol:lang(fa) li,
-ol:lang(glk) li,
-ol:lang(kk-arab) li,
-ol:lang(mzn) li {
-	list-style-type: -moz-persian;
-	list-style-type: persian;
-}
-
-ol:lang(ckb) li {
-	list-style-type: -moz-arabic-indic;
-	list-style-type: arabic-indic;
-}
-
-ol:lang(hi) li,
-ol:lang(mr) li {
-	list-style-type: -moz-devanagari;
-	list-style-type: devanagari;
-}
-
-ol:lang(as) li,
-ol:lang(bn) li {
-	list-style-type: -moz-bengali;
-	list-style-type: bengali;
-}
-
-ol:lang(or) li {
-	list-style-type: -moz-oriya;
-	list-style-type: oriya;
-}
-
-#toc ul, .toc ul {
-	margin: .3em 0;
-}
-
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */ .mw-content-ltr .toc ul,
-.mw-content-ltr #toc ul,
-.mw-content-rtl .mw-content-ltr .toc ul,
-.mw-content-rtl .mw-content-ltr #toc ul {
-	text-align: left;
-}
-/* @noflip */ .mw-content-rtl .toc ul,
-.mw-content-rtl #toc ul,
-.mw-content-ltr .mw-content-rtl .toc ul,
-.mw-content-ltr .mw-content-rtl #toc ul {
-	text-align: right;
-}
-/* @noflip */ .mw-content-ltr .toc ul ul,
-.mw-content-ltr #toc ul ul,
-.mw-content-rtl .mw-content-ltr .toc ul ul,
-.mw-content-rtl .mw-content-ltr #toc ul ul {
-	margin: 0 0 0 2em;
-}
-/* @noflip */ .mw-content-rtl .toc ul ul,
-.mw-content-rtl #toc ul ul,
-.mw-content-ltr .mw-content-rtl .toc ul ul,
-.mw-content-ltr .mw-content-rtl #toc ul ul {
-	margin: 0 2em 0 0;
-}
-
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
-	direction: ltr;
-}
-
-/* tooltip styles */
-.mw-help-field-hint {
-	display: none;
-	margin-left: 2px;
-	margin-bottom: -8px;
-	padding: 0 0 0 15px;
-	/* @embed */
-	background-image: url('images/help-question.gif');
-	background-position: left center;
-	background-repeat: no-repeat;
-	cursor: pointer;
-	font-size: .8em;
-	text-decoration: underline;
-	color: #0645ad;
-}
-.mw-help-field-hint:hover {
-	/* @embed */
-	background-image: url('images/help-question-hover.gif');
-}
-.mw-help-field-data {
-	display: block;
-	background-color: #d6f3ff;
-	padding:5px 8px 4px 8px;
-	border: 1px solid #5dc9f4;
-	margin-left: 20px;
-}
-.tipsy {
-	padding: 5px 5px 10px;
-	font-size: 12px;
-	position: absolute;
-	z-index: 100000;
-	overflow: visible;
-}
-.tipsy-inner {
-	padding: 5px 8px 4px 8px;
-	background-color: #d6f3ff;
-	color: black;
-	border: 1px solid #5dc9f4;
-	max-width: 300px;
-	text-align: left;
-}
-.tipsy-arrow {
-	position: absolute;
-	/* @embed */
-	background: url(images/tipsy-arrow.gif) no-repeat top left;
-	width: 13px;
-	height: 13px;
-}
-.tipsy-se .tipsy-arrow {
-	bottom: -2px;
-	right: 10px;
-	background-position: 0% 100%;
-}
-
-#mw-clearyourcache,
-#mw-sitecsspreview,
-#mw-sitejspreview,
-#mw-usercsspreview,
-#mw-userjspreview {
-	direction: ltr;
-	unicode-bidi: embed;
-}
-
-/* Correct user & content directionality when viewing a diff */
-.diff-currentversion-title,
-.diff {
-	direction: ltr;
-	unicode-bidi: embed;
-}
-/* @noflip */ .diff-contentalign-right td {
-	direction: rtl;
-	unicode-bidi: embed;
-}
-/* @noflip */ .diff-contentalign-left td {
-	direction: ltr;
-	unicode-bidi: embed;
-}
-.diff-otitle,
-.diff-ntitle,
-.diff-lineno {
-	direction: ltr !important;
-	unicode-bidi: embed;
-}
-
-#mw-revision-info,
-#mw-revision-info-current,
-#mw-revision-nav {
-	direction: ltr;
-	display: inline;
-}
-
-/* Images */
-
-/* @noflip */ div.tright,
-div.floatright,
-table.floatright {
-	clear: right;
-	float: right;
-}
-/* @noflip */ div.tleft,
-div.floatleft,
-table.floatleft {
-	float: left;
-	clear: left;
-}
-div.floatright,
-table.floatright,
-div.floatleft,
-table.floatleft {
-	position: relative;
-}
-
-/* bug 12205 */
-#mw-credits a {
-	unicode-bidi: embed;
-}
-
-/* Accessibility */
-.mw-jump,
-#jump-to-nav {
-	overflow: hidden;
-	height: 0;
-	zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */
-}
-
-/* Print footer should be hidden by default in screen. */
-.printfooter {
-	display: none;
-}
-
-/* For developpers */
-.xdebug-error {
-	position: absolute;
-	z-index: 99;
-}
-
-.editsection, .toctoggle {
-    -moz-user-select: none;
-    -webkit-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-}
-/**
- * MediaWiki Print style sheet for CSS2-capable browsers.
- * Copyright Gabriel Wicke, http://www.aulinx.de/
- *
- * Derived from the plone (http://plone.org/) styles
- * Copyright Alexander Limi
- */
-
-/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
-a.stub,
-a.new {
-	color: #ba0000;
-	text-decoration: none;
-}
-
-#toc {
-	border: 1px solid #aaaaaa;
-	background-color: #f9f9f9;
-	padding: 5px;
-}
-
-/* images */
-div.floatright {
-	float: right;
-	clear: right;
-	position: relative;
-	margin: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p {
-	font-style: italic;
-}
-div.floatleft {
-	float: left;
-	clear: left;
-	position: relative;
-	margin: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p {
-	font-style: italic;
-}
-div.center {
-	text-align: center;
-}
-
-/* thumbnails */
-div.thumb {
-	border: none;
-	width: auto;
-	margin-top: 0.5em;
-	margin-bottom: 0.8em;
-	background-color: transparent;
-}
-div.thumbinner {
-	border:1px solid #cccccc;
-	padding: 3px !important;
-	background-color: White;
-	font-size: 94%;
-	text-align: center;
-	overflow: hidden;
-}
-html .thumbimage {
-	border: 1px solid #cccccc;
-}
-html .thumbcaption {
-	border: none;
-	text-align: left;
-	line-height: 1.4em;
-	padding: 3px !important;
-	font-size: 94%;
-}
-
-div.magnify {
-	display: none;
-}
-/* @noflip */
-div.tright {
-	float: right;
-	clear: right;
-	margin: 0.5em 0 0.8em 1.4em;
-}
-/* @noflip */
-div.tleft {
-	float: left;
-	clear: left;
-	margin: 0.5em 1.4em 0.8em 0;
-}
-img.thumbborder {
-	border: 1px solid #dddddd;
-}
-
-/* table standards */
-table.rimage {
-	float: right;
-	width: 1pt;
-	position: relative;
-	margin-left: 1em;
-	margin-bottom: 1em;
-	text-align: center;
-}
-
-body {
-	background: white;
-	color: black;
-	margin: 0;
-	padding: 0;
-}
-
-.noprint,
-div#jump-to-nav,
-.mw-jump,
-div.top,
-div#column-one,
-#colophon,
-.editsection,
-.toctoggle,
-.tochidden,
-div#f-poweredbyico,
-div#f-copyrightico,
-li#viewcount,
-li#about,
-li#disclaimer,
-li#mobileview,
-li#privacy,
-#footer-places,
-.mw-hidden-catlinks,
-tr.mw-metadata-show-hide-extended,
-span.mw-filepage-other-resolutions,
-#filetoc {
-	/* Hides all the elements irrelevant for printing */
-	display: none;
-}
-
-ul {
-	list-style-type: square;
-}
-
-#content {
-	background: none;
-	border: none !important;
-	padding: 0 !important;
-	margin: 0 !important;
-	direction: ltr;
-}
-#footer {
-	background : white;
-	color : black;
-	margin-top: 1em;
-	border-top: 1px solid #AAA;
-	direction: ltr;
-}
-
-h1, h2, h3, h4, h5, h6 {
-	font-weight: bold;
-}
-
-p {
-	margin: 1em 0;
-	line-height: 1.2em;
-}
-
-pre {
-	border: 1pt dashed black;
-	white-space: pre;
-	font-size: 8pt;
-	overflow: auto;
-	padding: 1em 0;
-	background: white;
-	color: black;
-}
-
-table.listing,
-table.listing td {
-	border: 1pt solid black;
-	border-collapse: collapse;
-}
-
-a {
-	color: black !important;
-	background: none !important;
-	padding: 0 !important;
-}
-
-a:link, a:visited {
-	color: #520;
-	background: transparent;
-	text-decoration: underline;
-}
-
-#content a.external.text:after,
-#content a.external.autonumber:after {
-	/* Expand URLs for printing */
-	content: " (" attr(href) ") ";
-}
-
-#globalWrapper {
-	width: 100% !important;
-	min-width: 0 !important;
-}
-
-#content {
-	background: white;
-	color: black;
-}
-
-#column-content {
-	margin: 0 !important;
-}
-
-#column-content #content {
-	padding: 1em;
-	margin: 0 !important;
-}
-
-/* MSIE/Win doesn't understand 'inherit' */
-a,
-a.external,
-a.new,
-a.stub {
-	color: black !important;
-	text-decoration: none !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-	color: inherit !important;
-	text-decoration: inherit !important;
-}
-
-img {
-	border: none;
-	vertical-align: middle;
-}
-
-/* math */
-span.texhtml {
-	font-family: serif;
-}
-
-#siteNotice {
-	display: none;
-}
-
-/* Galleries (see shared.css for more info) */
-li.gallerybox {
-	vertical-align: top;
-	border: solid 2px white;
-	display: -moz-inline-box;
-	display: inline-block;
-}
-
-ul.gallery, li.gallerybox {
-	zoom: 1;
-	*display: inline;
-}
-
-ul.gallery {
-	margin: 2px;
-	padding: 2px;
-	display: block;
-}
-
-li.gallerycaption {
-	font-weight: bold;
-	text-align: center;
-	display: block;
-	word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-	text-align: center;
-	border: 1px solid #ccc;
-	margin: 2px;
-}
-
-div.gallerytext {
-	overflow: hidden;
-	font-size: 94%;
-	padding: 2px 4px;
-	word-wrap: break-word;
-}
-
-/**
- * Diff rendering
- */
-table.diff {
-	background: white;
-}
-td.diff-otitle {
-	background: #ffffff;
-}
-td.diff-ntitle {
-	background: #ffffff;
-}
-td.diff-addedline {
-	background: #ccffcc;
-	font-size: smaller;
-	border: solid 2px black;
-}
-td.diff-deletedline {
-	background: #ffffaa;
-	font-size: smaller;
-	border: dotted 2px black;
-}
-td.diff-context {
-	background: #eeeeee;
-	font-size: smaller;
-}
-.diffchange {
-	color: silver;
-	font-weight: bold;
-	text-decoration: underline;
-}
-
-/**
- * Table rendering
- * As on shared.css but with white background.
- */
-table.wikitable,
-table.mw_metadata {
-	margin: 1em 1em 1em 0;
-	border: 1px #aaa solid;
-	background: white;
-	border-collapse: collapse;
-}
-table.wikitable > tr > th, table.wikitable > tr > td,
-table.wikitable > * > tr > th, table.wikitable > * > tr > td,
-.mw_metadata th, .mw_metadata td {
-	border: 1px #aaa solid;
-	padding: 0.2em;
-}
-table.wikitable > tr > th,
-table.wikitable > * > tr > th,
-.mw_metadata th {
-	text-align: center;
-	background: white;
-	font-weight: bold;
-}
-table.wikitable > caption,
-.mw_metadata caption {
-	font-weight: bold;
-}
-
-a.sortheader {
-	margin: 0 0.3em;
-}
-
-/* Some pagination options */
-.wikitable, .thumb, img {
-	page-break-inside: avoid;
-}
-h2, h3, h4, h5, h6, h7 {
-	page-break-after: avoid;
-}
-p {
-	widows: 3;
-	orphans: 3;
-}
-
-/**
- * Categories
- */
-.catlinks ul {
-	display: inline;
-	margin: 0;
-	padding: 0;
-	list-style: none;
-	list-style-type: none;
-	list-style-image: none;
-	vertical-align: middle !ie;
-}
-
-.catlinks li {
-	display: inline-block;
-	line-height: 1.15em;
-	padding: 0 .4em;
-	border-left: 1px solid #AAA;
-	margin: 0.1em 0;
-	zoom: 1;
-	display: inline !ie;
-}
-
-.catlinks li:first-child {
-	padding-left: .2em;
-	border-left: none;
-}
-/* Default styling for HTML elements */
-dfn {
-    font-style: inherit;  /* Reset default styling for <dfn> */
-}
-sup, sub {
-    line-height: 1em;     /* Reduce line-height for <sup> and <sub> */
-}
- 
-/* Main page fixes */
-#interwiki-completelist {
-    font-weight: bold;
-}
-body.page-Main_Page #ca-delete {
-    display: none !important;
-}
-body.page-Main_Page #mp-topbanner {
-    clear: both;
-}
- 
-/* Edit window toolbar */
-#toolbar {
-    height: 22px;
-    margin-bottom: 6px;
-}
- 
-/* Highlight data points in the info action if specified in the URL */
-body.action-info :target {
-    background: #DEF;
-}
- 
-/* Make the list of references smaller */
-ol.references,
-div.reflist,
-div.refbegin {
-    font-size: 90%;            /* Default font-size */
-    margin-bottom: 0.5em;
-}
-div.refbegin-100 {
-    font-size: 100%;           /* Option for normal fontsize in {{refbegin}} */
-}
-div.reflist ol.references {
-    font-size: 100%;           /* Reset font-size when nested in div.reflist */
-    list-style-type: inherit;  /* Enable custom list style types */
-}
- 
-/* Reset top margin for lists embedded in columns */
-div.columns {
-    margin-top: 0.3em;
-}
-div.columns dl,
-div.columns ol,
-div.columns ul {
-    margin-top: 0;
-}
- 
-/* Avoid list items from breaking between columns */
-div.columns li,
-div.columns dd dd {
-    -webkit-column-break-inside: avoid;
-    page-break-inside: avoid;
-    break-inside: avoid-column;
-}
- 
-/* Highlight clicked reference in blue to help navigation */
-ol.references li:target,
-sup.reference:target,
-span.citation:target {
-    background-color: #DEF;
-}
- 
-/* Ensure refs in table headers and the like aren't bold or italic */
-sup.reference {
-    font-weight: normal;
-    font-style: normal;
-}
- 
-/* Allow hidden ref errors to be shown by user CSS */
-span.brokenref {
-    display: none;
-}
- 
-/* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */
-.citation {
-    word-wrap: break-word;
-}
- 
-/* For linked citation numbers and document IDs, where
-   the number need not be shown on a screen or a handheld,
-   but should be included in the printed version */
-@media screen, handheld {
-    .citation *.printonly {
-        display: none;
-    }
-}
- 
-/* Style for [[Template:Flowlist]] that Lets lists flow around floating objecs */
-.flowlist ul {
-    overflow-x: hidden;
-    margin-left: 0em;
-    padding-left: 1.6em;
-}
-.flowlist ol {
-    overflow-x: hidden;
-    margin-left: 0em;
-    padding-left: 3.2em;
-}
-.flowlist dl {
-    overflow-x: hidden;
-}
- 
-/* Style for horizontal lists (separator following item).
-   IE8-specific classes are assigned in [[MediaWiki:Common.js/IEFixes.js]].
-   @source mediawiki.org/wiki/Snippets/Horizontal_lists
-   @revision 4.3 (2014-01-06)
-   @author [[User:Edokter]]
- */
-.hlist dl,
-.hlist ol,
-.hlist ul {
-    margin: 0;
-    padding: 0;
-}
-/* Display list items inline */
-.hlist dd,
-.hlist dt,
-.hlist li {
-    margin: 0;
-    display: inline;
-}
-/* Display nested lists inline */
-.hlist dl dl, .hlist dl ol, .hlist dl ul,
-.hlist ol dl, .hlist ol ol, .hlist ol ul,
-.hlist ul dl, .hlist ul ol, .hlist ul ul {
-    display: inline;
-}
-/* Generate interpuncts */
-.hlist dt:after {
-    content: ": ";
-}
-.hlist dd:after,
-.hlist li:after {
-    content: " · ";
-    font-weight: bold;
-}
-.hlist dd:last-child:after,
-.hlist dt:last-child:after,
-.hlist li:last-child:after {
-    content: none;
-}
-/* For IE8 */
-.hlist dd.hlist-last-child:after,
-.hlist dt.hlist-last-child:after,
-.hlist li.hlist-last-child:after {
-    content: none;
-}
-/* Add parentheses around nested lists */
-.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,
-.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,
-.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {
-    content: " (";
-    font-weight: normal;
-}
-.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,
-.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,
-.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {
-    content: ") ";
-    font-weight: normal;
-}
-/* For IE8 */
-.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,
-.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,
-.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {
-    content: ") ";
-    font-weight: normal;
-}
-/* Put ordinals in front of ordered list items */
-.hlist ol {
-    counter-reset: listitem;
-}
-.hlist ol > li {
-    counter-increment: listitem;
-}
-.hlist ol > li:before {
-    content: " " counter(listitem) " ";
-}
-.hlist dd ol > li:first-child:before,
-.hlist dt ol > li:first-child:before,
-.hlist li ol > li:first-child:before {
-    content: " (" counter(listitem) " ";
-}
- 
-/* Unbulleted lists */
-.plainlist ul {
-    line-height: inherit;
-    list-style: none none;
-    margin: 0;
-}
-.plainlist ul li {
-    margin-bottom: 0;
-}
- 
-/* Default style for navigation boxes */
-.navbox {                     /* Navbox container style */
-    border: 1px solid #aaa;
-    width: 100%;
-    margin: auto;
-    clear: both;
-    font-size: 88%;
-    text-align: center;
-    padding: 1px;
-}
-.navbox-inner,
-.navbox-subgroup {
-    width: 100%;
-}
-.navbox-group,
-.navbox-title,
-.navbox-abovebelow {
-    padding: 0.25em 1em;      /* Title, group and above/below styles */
-    line-height: 1.5em;
-    text-align: center;
-}
-th.navbox-group {             /* Group style */
-    white-space: nowrap;
-    /* @noflip */
-    text-align: right;
-}
-.navbox,
-.navbox-subgroup {
-    background: #fdfdfd;      /* Background color */
-}
-.navbox-list {
-    line-height: 1.8em;
-    border-color: #fdfdfd;    /* Must match background color */
-}
-.navbox th,
-.navbox-title {
-    background: #ccccff;      /* Level 1 color */
-}
-.navbox-abovebelow,
-th.navbox-group,
-.navbox-subgroup .navbox-title {
-    background: #ddddff;      /* Level 2 color */
-}
-.navbox-subgroup .navbox-group,
-.navbox-subgroup .navbox-abovebelow {
-    background: #e6e6ff;      /* Level 3 color */
-}
-.navbox-even {
-    background: #f7f7f7;      /* Even row striping */
-}
-.navbox-odd {
-    background: transparent;  /* Odd row striping */
-}
-table.navbox + table.navbox {  /* Single pixel border between adjacent navboxes */
-    margin-top: -1px;          /* (doesn't work for IE6, but that's okay)       */
-}
-.navbox .hlist td dl,
-.navbox .hlist td ol,
-.navbox .hlist td ul,
-.navbox td.hlist dl,
-.navbox td.hlist ol,
-.navbox td.hlist ul {
-    padding: 0.125em 0;       /* Adjust hlist padding in navboxes */
-}
-ol + table.navbox,
-ul + table.navbox {
-    margin-top: 0.5em;        /* Prevent lists from clinging to navboxes */
-}
- 
-/* Default styling for Navbar template */
-.navbar {
-    display: inline;
-    font-size: 88%;
-    font-weight: normal;
-}
-.navbar ul {
-    display: inline;
-    white-space: nowrap;
-}
-.navbar li {
-    word-spacing: -0.125em;
-}
-.navbar.mini li span {
-  font-variant: small-caps;
-}
-/* Navbar styling when nested in infobox and navbox */
-.infobox .navbar {
-    font-size: 100%;
-}
-.navbox .navbar {
-    display: block;
-    font-size: 100%;
-}
-.navbox-title .navbar {
-    /* @noflip */
-    float: left;
-    /* @noflip */
-    text-align: left;
-    /* @noflip */
-    margin-right: 0.5em;
-    width: 6em;
-}
- 
-/* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript
-   in [[MediaWiki:Common.js]] are styled here so they can be customised. */
-.collapseButton {
-    /* @noflip */
-    float: right;
-    font-weight: normal;
-    /* @noflip */
-    margin-left: 0.5em;
-    /* @noflip */
-    text-align: right;
-    width: auto;
-}
-/* In navboxes, the show/hide button balances the v·d·e links
-   from [[Template:Navbar]], so they need to be the same width. */
-.navbox .collapseButton {
-    width: 6em;
-}
- 
-/* Styling for JQuery makeCollapsible, matching that of collapseButton */
-.mw-collapsible-toggle {
-    font-weight: normal;
-    /* @noflip */
-    text-align: right;
-}
-.navbox .mw-collapsible-toggle {
-    width: 6em;
-}
- 
-/* Infobox template style */
-.infobox {
-    border: 1px solid #aaa;
-    background-color: #f9f9f9;
-    color: black;
-    /* @noflip */
-    margin: 0.5em 0 0.5em 1em;
-    padding: 0.2em;
-    /* @noflip */
-    float: right;
-    /* @noflip */
-    clear: right;
-    /* @noflip */
-    text-align: left;
-    font-size: 88%;
-    line-height: 1.5em;
-}
-.infobox caption {
-    font-size: 125%;
-    font-weight: bold;
-}
-.infobox td,
-.infobox th {
-    vertical-align: top;
-}
-.infobox.bordered {
-    border-collapse: collapse;
-}
-.infobox.bordered td,
-.infobox.bordered th {
-    border: 1px solid #aaa;
-}
-.infobox.bordered .borderless td,
-.infobox.bordered .borderless th {
-    border: 0;
-}
- 
-.infobox.sisterproject {
-    width: 20em;
-    font-size: 90%;
-}
- 
-.infobox.standard-talk {
-    border: 1px solid #c0c090;
-    background-color: #f8eaba;
-}
-.infobox.standard-talk.bordered td,
-.infobox.standard-talk.bordered th {
-    border: 1px solid #c0c090;
-}
- 
-/* styles for bordered infobox with merged rows */
-.infobox.bordered .mergedtoprow td,
-.infobox.bordered .mergedtoprow th {
-    border: 0;
-    border-top: 1px solid #aaa;
-    /* @noflip */
-    border-right: 1px solid #aaa;
-}
- 
-.infobox.bordered .mergedrow td,
-.infobox.bordered .mergedrow th {
-    border: 0;
-    /* @noflip */
-    border-right: 1px solid #aaa;
-}
- 
-/* Styles for geography infoboxes, eg countries,
-   country subdivisions, cities, etc.            */
-.infobox.geography {
-    border-collapse: collapse;
-    line-height: 1.2em;
-    font-size: 90%;
-}
- 
-.infobox.geography  td,
-.infobox.geography  th {
-    border-top: 1px solid #aaa;
-    padding: 0.4em 0.6em 0.4em 0.6em;
-}
-.infobox.geography .mergedtoprow td,
-.infobox.geography .mergedtoprow th {
-    border-top: 1px solid #aaa;
-    padding: 0.4em 0.6em 0.2em 0.6em;
-}
- 
-.infobox.geography .mergedrow td,
-.infobox.geography .mergedrow th {
-    border: 0;
-    padding: 0 0.6em 0.2em 0.6em;
-}
- 
-.infobox.geography .mergedbottomrow td,
-.infobox.geography .mergedbottomrow th {
-    border-top: 0;
-    border-bottom: 1px solid #aaa;
-    padding: 0 0.6em 0.4em 0.6em;
-}
- 
-.infobox.geography .maptable td,
-.infobox.geography .maptable th {
-    border: 0;
-    padding: 0;
-}
- 
-/* Normal font styling for table row headers with scope="row" tag */
-.wikitable.plainrowheaders th[scope=row] {
-    font-weight: normal;
-    /* @noflip */
-    text-align: left;
-}
- 
-/* Lists in data cells are always left-aligned */
-.wikitable td ul,
-.wikitable td ol,
-.wikitable td dl {
-    /* @noflip */
-    text-align: left;
-}
-/* ...unless they also use the hlist class */
-.wikitable.hlist td ul,
-.wikitable.hlist td ol,
-.wikitable.hlist td dl {
-    text-align: inherit;
-}
- 
-/* Icons for medialist templates [[Template:Listen]],
-   [[Template:Multi-listen_start]], [[Template:Video]],
-   [[Template:Multi-video_start]] */
-div.listenlist {
-    background: url("//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg") no-repeat scroll 0% 0% transparent;
-    background-size: 30px;
-    padding-left: 40px;
-}
- 
-/* Fix for hieroglyphs specificality issue in infoboxes ([[Bugzilla:41869]]) */
-table.mw-hiero-table td {
-    vertical-align: middle;
-}
- 
-/* Style rules for media list templates */
-div.medialist {
-    min-height: 50px;
-    margin: 1em;
-    /* @noflip */
-    background-position: top left;
-    background-repeat: no-repeat;
-}
-div.medialist ul {
-    list-style-type: none;
-    list-style-image: none;
-    margin: 0;
-}
-div.medialist ul li {
-    padding-bottom: 0.5em;
-}
-div.medialist ul li li {
-    font-size: 91%;
-    padding-bottom: 0;
-}
- 
-/* Change the external link icon to an Adobe icon for all PDF files
-   in browsers that support these CSS selectors, like Mozilla and Opera */
-div#content a[href$=".pdf"].external,
-div#content a[href*=".pdf?"].external,
-div#content a[href*=".pdf#"].external,
-div#content a[href$=".PDF"].external,
-div#content a[href*=".PDF?"].external,
-div#content a[href*=".PDF#"].external,
-div#mw_content a[href$=".pdf"].external,
-div#mw_content a[href*=".pdf?"].external,
-div#mw_content a[href*=".pdf#"].external,
-div#mw_content a[href$=".PDF"].external,
-div#mw_content a[href*=".PDF?"].external,
-div#mw_content a[href*=".PDF#"].external {
-    background: url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;
-    /* @noflip */
-    padding-right: 18px;
-}
- 
-/* Change the external link icon to an Adobe icon anywhere the PDFlink class
-   is used (notably Template:PDFlink). This works in IE, unlike the above. */
-div#content span.PDFlink a,
-div#mw_content span.PDFlink a {
-    background: url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;
-    /* @noflip */
-    padding-right: 18px;
-}
- 
-/* Content in columns with CSS instead of tables ([[Template:Columns]]) */
-div.columns-2 div.column {
-    /* @noflip */
-    float: left;
-    width: 50%;
-    min-width: 300px;
-}
-div.columns-3 div.column {
-    /* @noflip */
-    float: left;
-    width: 33.3%;
-    min-width: 200px;
-}
-div.columns-4 div.column {
-    /* @noflip */
-    float: left;
-    width: 25%;
-    min-width: 150px;
-}
-div.columns-5 div.column {
-    /* @noflip */
-    float: left;
-    width: 20%;
-    min-width: 120px;
-}
- 
-/* Messagebox templates */
-.messagebox {
-    border: 1px solid #aaa;
-    background-color: #f9f9f9;
-    width: 80%;
-    margin: 0 auto 1em auto;
-    padding: .2em;
-}
-.messagebox.merge {
-    border: 1px solid #c0b8cc;
-    background-color: #f0e5ff;
-    text-align: center;
-}
-.messagebox.cleanup {
-    border: 1px solid #9f9fff;
-    background-color: #efefff;
-    text-align: center;
-}
-.messagebox.standard-talk {
-    border: 1px solid #c0c090;
-    background-color: #f8eaba;
-    margin: 4px auto;
-}
-/* For old WikiProject banners inside banner shells. */
-.mbox-inside .standard-talk,
-.messagebox.nested-talk {
-    border: 1px solid #c0c090;
-    background-color: #f8eaba;
-    width: 100%;
-    margin: 2px 0;
-    padding: 2px;
-}
-.messagebox.small {
-    width: 238px;
-    font-size: 85%;
-    /* @noflip */
-    float: right;
-    clear: both;
-    /* @noflip */
-    margin: 0 0 1em 1em;
-    line-height: 1.25em;
-}
-.messagebox.small-talk {
-    width: 238px;
-    font-size: 85%;
-    /* @noflip */
-    float: right;
-    clear: both;
-    /* @noflip */
-    margin: 0 0 1em 1em;
-    line-height: 1.25em;
-    background: #F8EABA;
-}
- 
-/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */
-th.mbox-text, td.mbox-text {   /* The message body cell(s) */
-    border: none;
-    /* @noflip */
-    padding: 0.25em 0.9em;     /* 0.9em left/right */
-    width: 100%;               /* Make all mboxes the same width regardless of text length */
-}
-td.mbox-image {                /* The left image cell */
-    border: none;
-    /* @noflip */
-    padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */
-    text-align: center;
-}
-td.mbox-imageright {           /* The right image cell */
-    border: none;
-    /* @noflip */
-    padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */
-    text-align: center;
-}
-td.mbox-empty-cell {           /* An empty narrow cell */
-    border: none;
-    padding: 0px;
-    width: 1px;
-}
- 
-/* Article message box styles */
-table.ambox {
-    margin: 0px 10%;                  /* 10% = Will not overlap with other elements */
-    border: 1px solid #aaa;
-    /* @noflip */
-    border-left: 10px solid #1e90ff;  /* Default "notice" blue */
-    background: #fbfbfb;
-}
-table.ambox + table.ambox {      /* Single border between stacked boxes. */
-    margin-top: -1px;
-}
-.ambox th.mbox-text,
-.ambox td.mbox-text {            /* The message body cell(s) */
-    padding: 0.25em 0.5em;       /* 0.5em left/right */
-}
-.ambox td.mbox-image {           /* The left image cell */
-    /* @noflip */
-    padding: 2px 0 2px 0.5em;    /* 0.5em left, 0px right */
-}
-.ambox td.mbox-imageright {      /* The right image cell */
-    /* @noflip */
-    padding: 2px 0.5em 2px 0;    /* 0px left, 0.5em right */
-}
- 
-table.ambox-notice {
-    /* @noflip */
-    border-left: 10px solid #1e90ff;    /* Blue */
-}
-table.ambox-speedy {
-    /* @noflip */
-    border-left: 10px solid #b22222;    /* Red */
-    background: #fee;                   /* Pink */
-}
-table.ambox-delete {
-    /* @noflip */
-    border-left: 10px solid #b22222;    /* Red */
-}
-table.ambox-content {
-    /* @noflip */
-    border-left: 10px solid #f28500;    /* Orange */
-}
-table.ambox-style {
-    /* @noflip */
-    border-left: 10px solid #f4c430;    /* Yellow */
-}
-table.ambox-move {
-    /* @noflip */
-    border-left: 10px solid #9932cc;    /* Purple */
-}
-table.ambox-protection {
-    /* @noflip */
-    border-left: 10px solid #bba;       /* Gray-gold */
-}
- 
-/* Image message box styles */
-table.imbox {
-    margin: 4px 10%;
-    border-collapse: collapse;
-    border: 3px solid #1e90ff;    /* Default "notice" blue */
-    background: #fbfbfb;
-}
-.imbox .mbox-text .imbox {  /* For imboxes inside imbox-text cells. */
-    margin: 0 -0.5em;       /* 0.9 - 0.5 = 0.4em left/right.        */
-    display: block;         /* Fix for webkit to force 100% width.  */
-}
-.mbox-inside .imbox {       /* For imboxes inside other templates.  */
-    margin: 4px;
-}
- 
-table.imbox-notice {
-    border: 3px solid #1e90ff;    /* Blue */
-}
-table.imbox-speedy {
-    border: 3px solid #b22222;    /* Red */
-    background: #fee;             /* Pink */
-}
-table.imbox-delete {
-    border: 3px solid #b22222;    /* Red */
-}
-table.imbox-content {
-    border: 3px solid #f28500;    /* Orange */
-}
-table.imbox-style {
-    border: 3px solid #f4c430;    /* Yellow */
-}
-table.imbox-move {
-    border: 3px solid #9932cc;    /* Purple */
-}
-table.imbox-protection {
-    border: 3px solid #bba;       /* Gray-gold */
-}
-table.imbox-license {
-    border: 3px solid #88a;       /* Dark gray */
-    background: #f7f8ff;          /* Light gray */
-}
-table.imbox-featured {
-    border: 3px solid #cba135;    /* Brown-gold */
-}
- 
-/* Category message box styles */
-table.cmbox {
-    margin: 3px 10%;
-    border-collapse: collapse;
-    border: 1px solid #aaa;
-    background: #DFE8FF;    /* Default "notice" blue */
-}
- 
-table.cmbox-notice {
-    background: #D8E8FF;    /* Blue */
-}
-table.cmbox-speedy {
-    margin-top: 4px;
-    margin-bottom: 4px;
-    border: 4px solid #b22222;    /* Red */
-    background: #FFDBDB;          /* Pink */
-}
-table.cmbox-delete {
-    background: #FFDBDB;    /* Red */
-}
-table.cmbox-content {
-    background: #FFE7CE;    /* Orange */
-}
-table.cmbox-style {
-    background: #FFF9DB;    /* Yellow */
-}
-table.cmbox-move {
-    background: #E4D8FF;    /* Purple */
-}
-table.cmbox-protection {
-    background: #EFEFE1;    /* Gray-gold */
-}
- 
-/* Other pages message box styles */
-table.ombox {
-    margin: 4px 10%;
-    border-collapse: collapse;
-    border: 1px solid #aaa;       /* Default "notice" gray */
-    background: #f9f9f9;
-}
- 
-table.ombox-notice {
-    border: 1px solid #aaa;       /* Gray */
-}
-table.ombox-speedy {
-    border: 2px solid #b22222;    /* Red */
-    background: #fee;             /* Pink */
-}
-table.ombox-delete {
-    border: 2px solid #b22222;    /* Red */
-}
-table.ombox-content {
-    border: 1px solid #f28500;    /* Orange */
-}
-table.ombox-style {
-    border: 1px solid #f4c430;    /* Yellow */
-}
-table.ombox-move {
-    border: 1px solid #9932cc;    /* Purple */
-}
-table.ombox-protection {
-    border: 2px solid #bba;       /* Gray-gold */
-}
- 
-/* Talk page message box styles */
-table.tmbox {
-    margin: 4px 10%;
-    border-collapse: collapse;
-    border: 1px solid #c0c090;    /* Default "notice" gray-brown */
-    background: #f8eaba;
-}
-.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" class ensures that */
-    margin: 2px 0;               /* this declaration overrides other styles (including mbox-small above)   */
-    width: 100%;                 /* For Safari and Opera */
-}
-.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when  */
-    line-height: 1.5em;          /* also "nested", so reset styles that are   */
-    font-size: 100%;             /* set in "mbox-small" above.                */
-}
- 
-table.tmbox-speedy {
-    border: 2px solid #b22222;    /* Red */
-    background: #fee;             /* Pink */
-}
-table.tmbox-delete {
-    border: 2px solid #b22222;    /* Red */
-}
-table.tmbox-content {
-    border: 2px solid #f28500;    /* Orange */
-}
-table.tmbox-style {
-    border: 2px solid #f4c430;    /* Yellow */
-}
-table.tmbox-move {
-    border: 2px solid #9932cc;    /* Purple */
-}
-table.tmbox-protection,
-table.tmbox-notice {
-    border: 1px solid #c0c090;    /* Gray-brown */
-}
- 
-/* Disambig and set index box styles */
-table.dmbox {
-    clear: both;
-    margin: 0.9em 1em;
-    border-top: 1px solid #ccc;
-    border-bottom: 1px solid #ccc;
-    background: transparent;
-}
- 
-/* Footer and header message box styles */
-table.fmbox {
-    clear: both;
-    margin: 0.2em 0;
-    width: 100%;
-    border: 1px solid #aaa;
-    background: #f9f9f9;     /* Default "system" gray */
-}
-table.fmbox-system {
-    background: #f9f9f9;
-}
-table.fmbox-warning {
-    border: 1px solid #bb7070;  /* Dark pink */
-    background: #ffdbdb;        /* Pink */
-}
-table.fmbox-editnotice {
-    background: transparent;
-}
-/* Div based "warning" style fmbox messages. */
-div.mw-warning-with-logexcerpt,
-div.mw-lag-warn-high,
-div.mw-cascadeprotectedwarning,
-div#mw-protect-cascadeon {
-    clear: both;
-    margin: 0.2em 0;
-    border: 1px solid #bb7070;
-    background: #ffdbdb;
-    padding: 0.25em 0.9em;
-}
-/* Div based "system" style fmbox messages.
-   Used in [[MediaWiki:Readonly lag]]. */
-div.mw-lag-warn-normal,
-div.fmbox-system {
-    clear: both;
-    margin: 0.2em 0;
-    border: 1px solid #aaa;
-    background: #f9f9f9;
-    padding: 0.25em 0.9em;
-}
- 
-/* These mbox-small classes must be placed after all other
-   ambox/tmbox/ombox etc classes. "body.mediawiki" is so
-   they override "table.ambox + table.ambox" above. */
-body.mediawiki table.mbox-small {   /* For the "small=yes" option. */
-    /* @noflip */
-    clear: right;
-    /* @noflip */
-    float: right;
-    /* @noflip */
-    margin: 4px 0 4px 1em;
-    width: 238px;
-    font-size: 88%;
-    line-height: 1.25em;
-}
-body.mediawiki table.mbox-small-left {   /* For the "small=left" option. */
-    /* @noflip */
-    margin: 4px 1em 4px 0;
-    width: 238px;
-    border-collapse: collapse;
-    font-size: 88%;
-    line-height: 1.25em;
-}
- 
-/* Style for compact ambox */
-/* Hide the images */
-.compact-ambox table .mbox-image,
-.compact-ambox table .mbox-imageright,
-.compact-ambox table .mbox-empty-cell {
-    display: none;
-}
-/* Remove borders, backgrounds, padding, etc. */
-.compact-ambox table.ambox {
-    border: none;
-    border-collapse: collapse;
-    background: transparent;
-    margin: 0 0 0 1.6em !important;
-    padding: 0 !important;
-    width: auto;
-    display: block;
-}
-body.mediawiki .compact-ambox table.mbox-small-left {
-    font-size: 100%;
-    width: auto;
-    margin: 0;
-}
-/* Style the text cell as a list item and remove its padding */
-.compact-ambox table .mbox-text {
-    padding: 0 !important;
-    margin: 0 !important;
-}
-.compact-ambox table .mbox-text-span {
-    display: list-item;
-    line-height: 1.5em;
-    list-style-type: square;
-    list-style-image: url(//bits.wikimedia.org/skins/common/images/bullet.gif);
-}
-.skin-vector .compact-ambox table .mbox-text-span {
-    list-style-type: circle;
-    list-style-image: url(//bits.wikimedia.org/skins/vector/images/bullet-icon.png)
-}
-/* Allow for hiding text in compact form */
-.compact-ambox .hide-when-compact {
-    display: none;
-}
- 
-/* Remove default styles for [[MediaWiki:Noarticletext]]. */
-div.noarticletext {
-    border: none;
-    background: transparent;
-    padding: 0;
-}
- 
-/* Hide (formatting) elements from screen, but not from screenreaders */
-.visualhide {
-    position: absolute;
-    left: -10000px;
-    top: auto;
-    width: 1px;
-    height: 1px;
-    overflow: hidden;
-}
- 
-/* Bold save button */
-#wpSave {
-    font-weight: bold;
-}
- 
-/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */
-.hiddenStructure {
-    display: inline !important;
-    color: #f00;
-    background-color: #0f0;
-}
- 
-/* suppress missing interwiki image links where #ifexist cannot
-   be used due to high number of requests see .hidden-redlink on
-   [[m:MediaWiki:Common.css]] */
-.check-icon a.new {
-    display: none;
-    speak: none;
-}
- 
-/* Removes underlines from certain links */
-.nounderlines a,
-.IPA a:link, .IPA a:visited {
-    text-decoration: none !important;
-}
- 
-/* Standard Navigationsleisten, aka box hiding thingy
-   from .de.  Documentation at [[Wikipedia:NavFrame]]. */
-div.NavFrame {
-    margin: 0;
-    padding: 4px;
-    border: 1px solid #aaa;
-    text-align: center;
-    border-collapse: collapse;
-    font-size: 95%;
-}
-div.NavFrame + div.NavFrame {
-    border-top-style: none;
-    border-top-style: hidden;
-}
-div.NavPic {
-    background-color: #fff;
-    margin: 0;
-    padding: 2px;
-    /* @noflip */
-    float: left;
-}
-div.NavFrame div.NavHead {
-    height: 1.6em;
-    font-weight: bold;
-    background-color: #ccf;
-    position: relative;
-}
-div.NavFrame p,
-div.NavFrame div.NavContent,
-div.NavFrame div.NavContent p {
-    font-size: 100%;
-}
-div.NavEnd {
-    margin: 0;
-    padding: 0;
-    line-height: 1px;
-    clear: both;
-}
-a.NavToggle {
-    position: absolute;
-    top: 0;
-    /* @noflip */
-    right: 3px;
-    font-weight: normal;
-    font-size: 90%;
-}
- 
-/* Hatnotes and disambiguation notices */
-.rellink,
-.dablink {
-    font-style: italic;
-    /* @noflip */
-    padding-left: 1.6em;
-    margin-bottom: 0.5em;
-}
-.rellink i,
-.dablink i {
-    font-style: normal;
-}
- 
-/* Allow transcluded pages to display in lists rather than a table.
-   Compatible in Firefox; incompatible in IE6. */
-.listify td    { display: list-item; }
-.listify tr    { display: block; }
-.listify table { display: block; }
- 
-/* Geographical coordinates defaults. See [[Template:Coord/link]]
-   for how these are used. The classes "geo", "longitude", and
-   "latitude" are used by the [[Geo microformat]]. */
-.geo-default, .geo-dms, .geo-dec  { display: inline; }
-.geo-nondefault, .geo-multi-punct { display: none; }
-.longitude, .latitude             { white-space: nowrap; }
- 
-/* When <div class="nonumtoc"> is used on the table of contents,
-   the ToC will display without numbers */
-.nonumtoc .tocnumber { display: none; }
-.nonumtoc #toc ul,
-.nonumtoc .toc ul {
-    line-height: 1.5em;
-    list-style: none none;
-    margin: .3em 0 0;
-    padding: 0;
-}
-.nonumtoc #toc ul ul,
-.nonumtoc .toc ul ul {
-    /* @noflip */
-    margin: 0 0 0 2em;
-}
- 
-/* Allow limiting of which header levels are shown in a TOC;
-   <div class="toclimit-3">, for instance, will limit to
-   showing ==headings== and ===headings=== but no further
-   (as long as there are no =headings= on the page, which
-   there shouldn't be according to the MoS). */
-.toclimit-2 .toclevel-1 ul,
-.toclimit-3 .toclevel-2 ul,
-.toclimit-4 .toclevel-3 ul,
-.toclimit-5 .toclevel-4 ul,
-.toclimit-6 .toclevel-5 ul,
-.toclimit-7 .toclevel-6 ul {
-    display: none;
-}
- 
-/* Styling for Template:Quote */
-blockquote.templatequote {
-     margin-top: 0;
-}
-blockquote.templatequote div.templatequotecite {
-    line-height: 1em;
-    /* @noflip */
-    text-align: left;
-    /* @noflip */
-    padding-left: 2em;
-    margin-top: 0;
-}
-blockquote.templatequote div.templatequotecite cite {
-    font-size: 85%;
-}
- 
-/* User block messages */
-div.user-block {
-    padding: 5px;
-    margin-bottom: 0.5em;
-    border: 1px solid #A9A9A9;
-    background-color: #FFEFD5;
-}
- 
-/* Prevent line breaks in silly places:
-   1) Where desired
-   2) Links when we don't want them to
-   3) Bold "links" to the page itself
-   4) Ref tags with group names <ref group="Note"> --> "[Note 1]" */
-.nowrap,
-.nowraplinks a,
-.nowraplinks .selflink,
-sup.reference a {
-    white-space: nowrap;
-}
-/* But allow wrapping where desired: */
-.wrap,
-.wraplinks a {
-    white-space: normal;
-}
- 
-/* For template documentation */
-.template-documentation {
-    clear: both;
-    margin: 1em 0 0 0;
-    border: 1px solid #aaa;
-    background-color: #ecfcf4;
-    padding: 1em;
-}
- 
-/* Inline divs in ImageMaps (code borrowed from de.wiki) */
-.imagemap-inline div {
-    display: inline;
-}
- 
-/* Increase the height of the image upload box */
-#wpUploadDescription {
-    height: 13em;
-}
- 
-/* Minimum thumb width */
-.thumbinner {
-    min-width: 100px;
-}
- 
-/* Makes the background of a framed image white instead of gray.
-   Only visible with transparent images. */
-div.thumb .thumbimage {
-    background-color: #fff;
-}
- 
-/* The backgrounds for galleries. */
-div#content .gallerybox div.thumb {
-    /* Light gray padding */
-    background-color: #F9F9F9;
-}
-/* Put a chequered background behind images, only visible if they have transparency.
-   '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */
-.gallerybox .thumb img {
-    background: #fff url(//bits.wikimedia.org/skins/common/images/Checker-16x16.png) repeat;
-}
-/* But not on articles, user pages, portals or with opt-out. */
-.ns-0 .gallerybox .thumb img,
-.ns-2 .gallerybox .thumb img,
-.ns-100 .gallerybox .thumb img,
-.nochecker .gallerybox .thumb img {
-    background: #fff;
-}
- 
-/* Prevent floating boxes from overlapping any category listings,
-   file histories, edit previews, and edit [Show changes] views. */
-#mw-subcategories, #mw-pages, #mw-category-media,
-#filehistory, #wikiPreview, #wikiDiff {
-    clear: both;
-}
- 
-body.rtl #mw-articlefeedbackv5, body.rtl #mw-articlefeedback {
-    display: block;   /* Override inline block mode */
-    margin-bottom: 1em;
-    /* @noflip */
-    clear: right;     /* Clear any info boxes that stick out */
-    /* @noflip */
-    float: right;     /* Prevents margin collapsing */
-}
- 
-/* Selectively hide headers in WikiProject banners */
-.wpb .wpb-header             { display: none; }
-.wpbs-inner .wpb .wpb-header { display: block; }     /* for IE */
-.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */
-.wpbs-inner .wpb-outside     { display: none; }      /* hide things that should only display outside shells */
- 
-/* Styling for Abuse Filter tags */
-.mw-tag-markers {
-    font-family:sans-serif;
-    font-style:italic;
-    font-size:90%;
-}
- 
-/* Hide stuff meant for accounts with special permissions. Made visible again in
-   [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-accountcreator.css]],
-   [[MediaWiki:Group-templateeditor.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */
-.sysop-show,
-.accountcreator-show,
-.templateeditor-show,
-.autoconfirmed-show {
-    display: none;
-}
- 
-/**
- * Hide the redlink generated by {{Editnotice}},
- * this overrides the ".sysop-show { display: none; }" above that applies
- * to the same link as well.
- */
-.ve-init-mw-viewPageTarget-toolbar-editNotices-notice .editnotice-redlink {
-    display: none !important;
-}
- 
-/* Remove bullets when there are multiple edit page warnings */
-ul.permissions-errors > li {
-    list-style: none none;
-}
-ul.permissions-errors {
-    margin: 0;
-}
- 
-/* No linewrap on the labels of the login/signup page */
-body.page-Special_UserLogin .mw-label label,
-body.page-Special_UserLogin_signup .mw-label label {
-    white-space: nowrap;
-}
- 
-/* Pie chart test: Transparent borders */
-.transborder {
-    border: solid transparent;
-}
-* html .transborder {  /* IE6 */
-    border: solid #000001;
-    filter: chroma(color=#000001);
-}
- 
-/* Styling for updated markers on watchlist, history and recent/related changes.
-   Bullets are handled in skin-specific stylesheets. */
-.updatedmarker {
-    background-color: transparent;
-    color: #006400;
-}
-li.mw-changeslist-line-watched .mw-title,
-table.mw-changeslist-line-watched .mw-title,
-table.mw-enhanced-watch .mw-enhanced-rctime {
-    font-weight: normal;
-}
- 
-/* Adjust font for inline HTML generated formulae */
-span.texhtml {
-    font-family: "Times New Roman", "Nimbus Roman No9 L", Times, serif;
-    font-size: 118%;
-    white-space: nowrap;
-}
-span.texhtml span.texhtml {
-    font-size: 100%;
-}
- 
-/* Fix so <syntaxhighlight> tags and .css and .js pages get normal text size.
-   [[Bugzilla:26204]]. See also [[Wikipedia:Typography#The monospace 'bug']] */
-div.mw-geshi div,
-div.mw-geshi div pre,
-span.mw-geshi,
-pre.source-css,
-pre.source-javascript,
-pre.source-lua {
-    font-family: monospace, Courier !important;
-}
- 
-/* Fix styling of transcluded prefindex tables */
-table#mw-prefixindex-list-table,
-table#mw-prefixindex-nav-table {
-    width: 98%;
-}
- 
-/* For portals, added 2011-12-07 -bv
-   On wide screens, show these as two columns
-   On narrow and mobile screens, let them collapse into a single column */
-.portal-column-left {
-    float: left;
-    width: 50%;
-}
-.portal-column-right {
-    float: right;
-    width: 49%;
-}
-.portal-column-left-wide {
-    float: left;
-    width: 60%;
-}
-.portal-column-right-narrow {
-    float: right;
-    width: 39%;
-}
-.portal-column-left-extra-wide {
-    float: left;
-    width: 70%;
-}
-.portal-column-right-extra-narrow {
-    float: right;
-    width: 29%;
-}
-@media only screen and (max-width: 800px) {
-    /* Decouple the columns on narrow screens */
-    .portal-column-left,
-    .portal-column-right,
-    .portal-column-left-wide,
-    .portal-column-right-narrow,
-    .portal-column-left-extra-wide,
-    .portal-column-right-extra-narrow {
-        float: inherit;
-        width: inherit;
-    }
-}
- 
-/* For announcements */
-#bodyContent .letterhead {
-    background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');
-    background-repeat:no-repeat;
-    padding: 2em;
-    background-color: #faf9f2;
-}
- 
-/* Tree style lists */
-.treeview ul {
-    padding: 0;
-    margin: 0;
-}
-.treeview li {
-    padding: 0;
-    margin: 0;
-    list-style-type: none;
-    list-style-image: none;
-    zoom: 1; /* BE KIND TO IE6 */;
-}
-.treeview li li {
-    background: url("//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png") no-repeat 0 -2981px;
-    /* @noflip */
-    padding-left: 20px;
-    text-indent: 0.3em;
-}
-.treeview li li.lastline {
-    background-position: 0 -5971px
-}
-.treeview li.emptyline > ul {
-    /* @noflip */
-    margin-left: -1px;
-}
-.treeview li.emptyline > ul > li:first-child {
-    background-position: 0 9px
-}
- 
-/* hidden sortkey for tablesorter */
-td .sortkey,
-th .sortkey {
-    display: none;
-    speak: none;
-}
- 
-/* Make it possible to hide checkboxes in <inputbox> */
-.inputbox-hidecheckboxes form .inputbox-element {
-    display: none !important;
-}
- 
-/* Hide charinsert base for those not using the gadget */
-#editpage-specialchars {
-    display: none;
-}
- 
-/* work-around for [[bugzilla:23965]] (Kaltura advertisement) */
-.k-player .k-attribution {
-    visibility: hidden;
-}
- 
-/* [[MediaZilla:35337]] */
-@media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx), (min-resolution: 144dpi) {
-        #p-logo a {
-                background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/204px-Wikipedia-logo-v2-en.svg.png") !important;
-                background-size: 136px auto;
-        }
-}
-@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 2dppx), (min-resolution: 192dpi) {
-        #p-logo a {
-                background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/270px-Wikipedia-logo-v2-en.svg.png") !important;
-                background-size: 135px auto;
-        }
-}
-/* Do not print:
-   1: When in mainspace: Article message boxes,
-      navboxes, sister project boxes, disambig links,
-      and items marked as metadata.
-   2: section edit links.
-   3: navbar links.
-   4: Show/hide toggles for collapsible items.
-*/
-.ns-0 .ambox, 
-.ns-0 .navbox, 
-.ns-0 .vertical-navbox, 
-.ns-0 .infobox.sisterproject, 
-.ns-0 .dablink, 
-.ns-0 .metadata,
-.editlink,
-.navbar,
-a.NavToggle, span.collapseButton, span.mw-collapsible-toggle,
-th .sortkey, td .sortkey {
-    display: none !important;
-}
- 
-/* Add formatting to make sure that "external references" from templates
-   like [[Template:Ref]] do not get URL expansion, not even when printed.
-   The anchor itself has class "external autonumber" and the url expansion
-   is inserted when printing (see the common printing style sheet at
-   http://en.wikipedia.org/skins-1.5/common/commonPrint.css) using the
-   ":after" pseudo-element of CSS. Also hide in <cite> elements.
-*/
-#content cite a.external.text:after,
-.nourlexpansion a.external.text:after,
-.nourlexpansion a.external.autonumber:after {
-    display: none !important;
-}
- 
-/* Uncollapse collapsible tables/divs.
-   The proper way to do this for tables is to use display:table-row,
-   but this is not supported by all browsers, so use display:block as fallback.
-*/
-table.collapsible tr, div.NavPic, div.NavContent {
-    display: block !important;
-}
-table.collapsible tr {
-    display: table-row !important;
-}
- 
-/* On websites with siteSub visible, the margin on the firstHeading is not needed. */
-#firstHeading {
-    margin: 0px;
-}
- 
-/* We don't want very long URLs (that are added to the content in print) to widen the canvas */
-#content a.external.text:after,
-#content a.external.autonumber:after {
-	word-wrap: break-word;
-}
-/* Don't display some stuff on the main page */
-body.page-Main_Page #deleteconfirm,
-body.page-Main_Page #t-cite,
-body.page-Main_Page #footer-info-lastmod,
-body.action-view.page-Main_Page #siteSub,
-body.action-view.page-Main_Page #contentSub,
-body.action-view.page-Main_Page h1.firstHeading {
-    display: none !important;
-}
- 
-/* Position Main Page top banner */
-body.page-Main_Page #mp-topbanner {
-  margin-top: 0 !important;
-}
- 
-/* Position coordinates */
-#coordinates {
-    position: absolute;
-    top: 0em;
-    right: 0em;
-    float: right;
-    margin: 0em;
-    padding: 0em;
-    line-height: 1.5em;
-    text-align: right;
-    text-indent: 0;
-    font-size: 85%;
-    text-transform: none;
-    white-space: nowrap;
-}
- 
-/* For positioning icons at top-right, used in Templates
-   "Spoken Article" and "Featured Article" */
-div.topicon {
-    position: absolute;
-    top: -2em;
-    margin-right: -10px;
-    display: block !important;
-}
- 
-/* FR topicon position */
-div.flaggedrevs_short {
-    position: absolute;
-    top: -3em;
-    right: 80px;
-    z-index: 1;
-    margin-left: 0;
-    /* Because this is not yet a topicon, we emulate it's behavior,
-       this ensure compatibility with edit lead section gadget. */
-    margin-right: -10px;
-}
- 
-/* On rtl interfaces, we need to override the defaults.
-   It is content included (so ltr), but positioned in part of the rtl interface. */
-body.rtl #protected-icon {
-    /* @noflip */
-    left: 55px;
-}
-body.rtl #spoken-icon,
-body.rtl #commons-icon {
-    /* @noflip */
-    left: 30px;
-}
-body.rtl #featured-star {
-    /* @noflip */
-    left: 10px;
-}
- 
-/* Menu over FR box */
-div.vectorMenu div {
-    z-index: 2;
-}
- 
-/* Display "From Wikipedia, the free encyclopedia" */
-#siteSub {
-    display: inline;
-    font-size: 92%;
-}
- 
-/* Bullets for Good and Featured interwiki links */
-li.GA {
-    list-style-image: url(//upload.wikimedia.org/wikipedia/commons/4/42/Monobook-bullet-ga.png);
-}
-li.FA {
-    list-style-image: url(//upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png);
-}
- 
-/* Styling for updated markers on watchlist, history and recent/related changes */
-li.mw-changeslist-line-watched,
-li.mw-history-line-updated {
-    list-style-image: url(//upload.wikimedia.org/wikipedia/commons/c/c2/ChangedBulletVector.png);
-}
- 
-/* Blue instead of yellow padlock for secure links. */
-#bodyContent a.external[href ^="https://"],
-.link-https {
-    background: url(//upload.wikimedia.org/wikipedia/en/0/00/Lock_icon_blue.gif) center right no-repeat;
-    /* @noflip */
-    padding-right: 16px;
-}
- 
-/* (Soft) redirect styling (bug:26544) */
-div.redirectMsg img {
-    vertical-align: text-bottom;
-}
-.redirectText {
-    font-size: 150%;
-    margin: 5px;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css
deleted file mode 100644
index eecfc91..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/wikipedia.min.css
+++ /dev/null
@@ -1 +0,0 @@
-html,body{height:100%;margin:0;padding:0;font-family:sans-serif;font-size:1em}body{background-color:#f3f3f3;background-image:url(images/page-base.png)}div#content{margin-left:10em;padding:1em;background-image:url(images/border.png);background-position:top left;background-repeat:repeat-y;background-color:white;color:black;direction:ltr}#mw-page-base{height:5em;background-color:white;background-image:url(images/page-fade.png);background-position:bottom left;background-repeat:repeat-x}#mw-head-base{margin-top:-5em;margin-left:10em;height:5em;background-image:url(images/border.png);background-position:bottom left;background-repeat:repeat-x}div#mw-head{position:absolute;top:0;right:0;width:100%}div#mw-head h5{margin:0;padding:0}div.emptyPortlet{display:none}#p-personal{position:absolute;top:0;right:.75em}#p-personal h5{display:none}#p-personal ul{list-style:none;margin:0;padding-left:10em}#p-personal li{line-height:1.125em;float:left}#p-personal li{margin-left:.75em;margin-top:.5em;font-size:.75em;white-space:nowrap}#left-navigation{position:absolute;left:10em;top:2.5em}#right-navigation{float:right;margin-top:2.5em}div.vectorTabs h5,div.vectorMenu h5 span{display:none}div.vectorTabs{float:left;height:2.5em}div.vectorTabs{background-image:url(images/tab-break.png);background-position:bottom left;background-repeat:no-repeat;padding-left:1px}div.vectorTabs ul{float:left}div.vectorTabs ul{height:100%;list-style:none;margin:0;padding:0}div.vectorTabs ul li{float:left}div.vectorTabs ul li{line-height:1.125em;display:inline-block;height:100%;margin:0;padding:0;background-color:#f3f3f3;background-image:url(images/tab-normal-fade.png);background-position:bottom left;background-repeat:repeat-x;white-space:nowrap}div.vectorTabs ul>li{display:block}div.vectorTabs li.selected{background-image:url(images/tab-current-fade.png)}div.vectorTabs li a{display:inline-block;height:1.9em;padding-left:.5em;padding-right:.5em;color:#0645ad;cursor:pointer;font-size:.8em}div.vectorTabs li>a{display:block}div.vectorTabs li.icon a{background-position:bottom right;background-repeat:no-repeat}div.vectorTabs span a{display:inline-block;padding-top:1.25em}div.vectorTabs span>a{float:left;display:block}div.vectorTabs span{display:inline-block;background-image:url(images/tab-break.png);background-position:bottom right;background-repeat:no-repeat}div.vectorTabs li.selected a,div.vectorTabs li.selected a:visited{color:#333;text-decoration:none}div.vectorTabs li.new a,div.vectorTabs li.new a:visited{color:#a55858}div.vectorMenu{direction:ltr;float:left;background-image:url(images/arrow-down-icon.png);background-position:100% 60%;background-repeat:no-repeat;cursor:pointer}div.vectorMenuFocus{background-image:url(images/arrow-down-focus-icon.png);background-position:100% 60%}body.rtl div.vectorMenu{direction:rtl}div#mw-head div.vectorMenu h5{float:left;background-image:url(images/tab-break.png);background-repeat:no-repeat}div#mw-head div.vectorMenu h5{background-position:bottom left;margin-left:-1px}div#mw-head div.vectorMenu>h5{background-image:none}div#mw-head div.vectorMenu h4{display:inline-block;float:left;font-size:.8em;padding-left:.5em;padding-top:1.375em;font-weight:normal;border:none}div.vectorMenu h5 a{display:inline-block;width:24px;height:2.5em;text-decoration:none;background-image:url(images/tab-break.png);background-repeat:no-repeat}div.vectorMenu h5 a{background-position:bottom right}div.vectorMenu h5>a{display:block}div.vectorMenu div.menu{position:relative;display:none;clear:both;text-align:left}body.rtl div.vectorMenu div.menu{margin-left:24px}body.rtl div.vectorMenu>div.menu{margin-left:auto}body.rtl div.vectorMenu>div.menu,x:-moz-any-link{margin-left:23px}div.vectorMenu:hover div.menu,div.vectorMenu div.menuForceShow{display:block}div.vectorMenu ul{position:absolute;background-color:white;border:solid 1px silver;border-top-width:0;list-style:none;list-style-image:none;list-style-type:none;padding:0;margin:0;margin-left:-1px;text-align:left}div.vectorMenu ul,x:-moz-any-link{min-width:5em}div.vectorMenu ul,x:-moz-any-link,x:default{min-width:0}div.vectorMenu li{padding:0;margin:0;text-align:left;line-height:1em}div.vectorMenu li a{display:inline-block;padding:.5em;white-space:nowrap;color:#0645ad;cursor:pointer;font-size:.8em}div.vectorMenu li>a{display:block}div.vectorMenu li.selected a,div.vectorMenu li.selected a:visited{color:#333;text-decoration:none}#p-search h5{display:none}#p-search{float:left}#p-search{margin-right:.5em;margin-left:.5em}#p-search form,#p-search input{margin:0;margin-top:.4em}div#simpleSearch{display:block;width:14em;height:1.4em;margin-top:.65em;position:relative;min-height:1px;border:solid 1px #AAA;color:black;background-color:white;background-image:url(images/search-fade.png);background-position:top left;background-repeat:repeat-x}div#simpleSearch label{font-size:13px;top:.25em;direction:ltr}div#simpleSearch input{color:black;direction:ltr}div#simpleSearch input:focus{outline:none}div#simpleSearch input.placeholder{color:#999}div#simpleSearch input::-webkit-input-placeholder{color:#999}div#simpleSearch input#searchInput{position:absolute;top:0;left:0;width:90%;margin:0;padding:0;padding-left:.2em;padding-top:.2em;padding-bottom:.2em;outline:none;border:none;font-size:13px;background-color:transparent;direction:ltr}div#simpleSearch button#searchButton{position:absolute;width:10%;right:0;top:0;padding:0;padding-top:.3em;padding-bottom:.2em;padding-right:.4em;margin:0;border:none;cursor:pointer;background-color:transparent;background-image:none}div#simpleSearch button#searchButton img{border:none;margin:0;margin-top:-3px;padding:0}div#simpleSearch button#searchButton>img{margin:0}div#mw-panel{position:absolute;top:160px;padding-top:1em;width:10em;left:0}div#mw-panel div.portal{padding-bottom:1.5em;direction:ltr}div#mw-panel div.portal h5{font-weight:normal;color:#444;padding:.25em;padding-top:0;padding-left:1.75em;cursor:default;border:none;font-size:.75em}div#mw-panel div.portal div.body{margin:0;padding-top:.5em;margin-left:1.25em;background-image:url(images/portal-break.png);background-repeat:no-repeat;background-position:top left}div#mw-panel div.portal div.body ul{list-style:none;list-style-image:none;list-style-type:none;padding:0;margin:0}div#mw-panel div.portal div.body ul li{line-height:1.125em;padding:0;padding-bottom:.5em;margin:0;overflow:hidden;font-size:.75em}div#mw-panel div.portal div.body ul li a{color:#0645ad}div#mw-panel div.portal div.body ul li a:visited{color:#0b0080}div#footer{margin-left:10em;margin-top:0;padding:.75em;background-image:url(images/border.png);background-position:top left;background-repeat:repeat-x;direction:ltr}div#footer ul{list-style:none;list-style-image:none;list-style-type:none;margin:0;padding:0}div#footer ul li{margin:0;padding:0;padding-top:.5em;padding-bottom:.5em;color:#333;font-size:.7em}div#footer #footer-icons{float:right}body.ltr div#footer #footer-places{float:left}div#footer #footer-info li{line-height:1.4em}div#footer #footer-icons li{float:left;margin-left:.5em;line-height:2em;text-align:right}div#footer #footer-places li{float:left;margin-right:1em;line-height:2em}#p-logo{position:absolute;top:-160px;left:0;width:10em;height:160px}#p-logo a{display:block;width:10em;height:160px;background-repeat:no-repeat;background-position:center center;text-decoration:none}#preftoc{width:100%;float:left;clear:both;margin:0!important;padding:0!important;background-image:url(images/preferences-break.png);background-position:bottom left;background-repeat:no-repeat}#preftoc li{float:left;margin:0;padding:0;padding-right:1px;height:2.25em;white-space:nowrap;list-style-type:none;list-style-image:none;background-image:url(images/preferences-break.png);background-position:bottom right;background-repeat:no-repeat}#preftoc li:first-child{margin-left:1px}#preftoc a,#preftoc a:active{display:inline-block;position:relative;color:#0645ad;padding:.5em;text-decoration:none;background-image:none;font-size:.9em}#preftoc a:hover,#preftoc a:focus{text-decoration:underline}#preftoc li.selected a{background-image:url(images/preferences-fade.png);background-position:bottom;background-repeat:repeat-x;color:#333;text-decoration:none}#preferences{float:left;width:100%;margin:0;margin-top:-2px;clear:both;border:solid 1px #ccc;background-color:#f9f9f9;background-image:url(images/preferences-base.png)}#preferences fieldset{border:none;border-top:solid 1px #ccc}#preferences fieldset.prefsection{border:none;padding:0;margin:1em}#preferences legend{color:#666}#preferences fieldset.prefsection legend.mainLegend{display:none}#preferences td{padding-left:.5em;padding-right:.5em}#preferences td.htmlform-tip{font-size:x-small;padding:.2em 2em;color:#666}#preferences div.mw-prefs-buttons{padding:1em}#preferences div.mw-prefs-buttons input{margin-right:.25em}div#content{line-height:1.5em}#bodyContent{font-size:.8em}.editsection{float:right}ul{list-style-image:url(images/bullet-icon.png)}pre{line-height:1.3em}#siteNotice{font-size:.8em}#firstHeading{padding-top:0;margin-top:0;padding-top:0;font-size:1.6em}div#content a.external,div#content a.external[href ^="gopher://"]{background:url(images/external-link-ltr-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="https://"],.link-https{background:url(images/lock-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="mailto:"],.link-mailto{background:url(images/mail-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="news:"]{background:url(images/news-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="ftp://"],.link-ftp{background:url(images/file-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href ^="irc://"],div#content a.external[href ^="ircs://"],.link-irc{background:url(images/talk-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".ogg"],div#content a.external[href $=".OGG"],div#content a.external[href $=".mid"],div#content a.external[href $=".MID"],div#content a.external[href $=".midi"],div#content a.external[href $=".MIDI"],div#content a.external[href $=".mp3"],div#content a.external[href $=".MP3"],div#content a.external[href $=".wav"],div#content a.external[href $=".WAV"],div#content a.external[href $=".wma"],div#content a.external[href $=".WMA"],.link-audio{background:url(images/audio-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".ogm"],div#content a.external[href $=".OGM"],div#content a.external[href $=".avi"],div#content a.external[href $=".AVI"],div#content a.external[href $=".mpeg"],div#content a.external[href $=".MPEG"],div#content a.external[href $=".mpg"],div#content a.external[href $=".MPG"],.link-video{background:url(images/video-icon.png) center right no-repeat;padding-right:13px}div#content a.external[href $=".pdf"],div#content a.external[href $=".PDF"],div#content a.external[href *=".pdf#"],div#content a.external[href *=".PDF#"],div#content a.external[href *=".pdf?"],div#content a.external[href *=".PDF?"],.link-document{background:url(images/document-icon.png) center right no-repeat;padding-right:13px}#pt-userpage,#pt-anonuserpage,#pt-login{background:url(images/user-icon.png) left top no-repeat;padding-left:15px!important;text-transform:none}.redirectText{font-size:140%}.redirectMsg img{vertical-align:text-bottom}#bodyContent{position:relative;width:100%}#mw-js-message{font-size:.8em}div#bodyContent{line-height:1.5em}#ca-unwatch.icon a,#ca-watch.icon a{margin:0;padding:0;outline:none;display:block;width:26px;padding-top:3.1em;margin-top:0;margin-top:-0.8em!ie;height:0;overflow:hidden;background-image:url(images/watch-icons.png)}#ca-unwatch.icon a{background-position:-43px 60%}#ca-watch.icon a{background-position:5px 60%}#ca-unwatch.icon a:hover,#ca-unwatch.icon a:focus{background-position:-67px 60%}#ca-watch.icon a:hover,#ca-watch.icon a:focus{background-position:-19px 60%}#ca-unwatch.icon a.loading,#ca-watch.icon a.loading{background-image:url(images/watch-icon-loading.gif);background-position:5px 60%}#ca-unwatch.icon a span,#ca-watch.icon a span{display:none}div.vectorTabs ul{background-image:url(images/tab-break.png);background-position:right bottom;background-repeat:no-repeat}.tipsy{font-size:.8em}.mw-content-ltr{direction:ltr}.mw-content-rtl{direction:rtl}.sitedir-ltr textarea,.sitedir-ltr input{direction:ltr}.sitedir-rtl textarea,.sitedir-rtl input{direction:rtl}input[type="submit"],input[type="button"],input[type="reset"],input[type="file"]{direction:ltr}textarea[dir="ltr"],input[dir="ltr"]{direction:ltr}textarea[dir="rtl"],input[dir="rtl"]{direction:rtl}abbr,acronym,.explain{border-bottom:1px dotted;cursor:help}.mw-plusminus-pos{color:#006400}.mw-plusminus-neg{color:#8b0000}.mw-plusminus-null{color:#aaa}.allpagesredirect,.redirect-in-category,.watchlistredir{font-style:italic}span.comment{font-style:italic}span.changedby{font-size:95%}.texvc{direction:ltr;unicode-bidi:embed}img.tex{vertical-align:middle}span.texhtml{font-family:serif}#wikiPreview.ontop{margin-bottom:1em}#editform,#toolbar,#wpTextbox1{clear:both}#toolbar img{cursor:pointer}div#mw-js-message{margin:1em 5%;padding:.5em 2.5%;border:solid 1px #ddd;background-color:#fcfcfc}.editsection{float:right;margin-left:5px}.mw-content-ltr .editsection,.mw-content-rtl .mw-content-ltr .editsection{float:right}.mw-content-rtl .editsection,.mw-content-ltr .mw-content-rtl .editsection{float:left}div.mw-filepage-resolutioninfo{font-size:smaller}h2#filehistory{clear:both}table.filehistory th,table.filehistory td{vertical-align:top}table.filehistory th{text-align:left}table.filehistory td.mw-imagepage-filesize,table.filehistory th.mw-imagepage-filesize{white-space:nowrap}table.filehistory td.filehistory-selected{font-weight:bold}.filehistory a img,#file img:hover{background:white url(images/Checker-16x16.png) repeat}li span.deleted,span.history-deleted{text-decoration:line-through;color:#888;font-style:italic}.not-patrolled{background-color:#ffa}.unpatrolled{font-weight:bold;color:red}div.patrollink{font-size:75%;text-align:right}td.mw-label{text-align:right}td.mw-input{text-align:left}td.mw-submit{text-align:left}td.mw-label{vertical-align:top}.prefsection td.mw-label{width:20%}.prefsection table{width:100%}td.mw-submit{white-space:nowrap}table.mw-htmlform-nolabel td.mw-label{width:1px}tr.mw-htmlform-vertical-label td.mw-label{text-align:left!important}.mw-htmlform-invalid-input td.mw-input input{border-color:red}.mw-htmlform-flatlist div.mw-htmlform-flatlist-item{display:inline;margin-right:1em;white-space:nowrap}input#wpSummary{width:80%}.thumbcaption{text-align:left}.magnify{float:right}#catlinks{text-align:left}.catlinks ul{display:inline;margin:0;padding:0;list-style:none;list-style-type:none;list-style-image:none;vertical-align:middle!ie}.catlinks li{display:inline-block;line-height:1.25em;border-left:1px solid #AAA;margin:.125em 0;padding:0 .5em;zoom:1;display:inline!ie}.catlinks li:first-child{padding-left:.25em;border-left:none}.mw-hidden-cats-hidden{display:none}.catlinks-allhidden{display:none}p.mw-ipb-conveniencelinks,p.mw-protect-editreasons,p.mw-filedelete-editreasons,p.mw-delete-editreasons,p.mw-revdel-editreasons{font-size:90%;text-align:right}.os-suggest{overflow:auto;overflow-x:hidden;position:absolute;top:0;left:0;width:0;background-color:white;border-style:solid;border-color:#AAA;border-width:1px;z-index:99;font-size:95%}table.os-suggest-results{font-size:95%;cursor:pointer;border:0;border-collapse:collapse;width:100%}.os-suggest-result,.os-suggest-result-hl{white-space:nowrap;background-color:white;color:black;padding:2px}.os-suggest-result-hl,.os-suggest-result-hl-webkit{background-color:#4C59A6;color:white}.os-suggest-toggle{position:relative;left:1ex;font-size:65%}.os-suggest-toggle-def{position:absolute;top:0;left:0;font-size:65%;visibility:hidden}.autocomment{color:gray}#pagehistory .history-user{margin-left:.4em;margin-right:.2em}#pagehistory span.minor{font-weight:bold}#pagehistory li{border:1px solid white}#pagehistory li.selected{background-color:#f9f9f9;border:1px dashed #aaa}.mw-history-revisiondelete-button,#mw-fileduplicatesearch-icon{float:right}.newpage,.minoredit,.botedit{font-weight:bold}#shared-image-dup,#shared-image-conflict{font-style:italic}div.mw-warning-with-logexcerpt{padding:3px;margin-bottom:3px;border:2px solid #2F6FAB;clear:both}div.mw-warning-with-logexcerpt ul li{font-size:90%}span.mw-revdelundel-link,strong.mw-revdelundel-link{font-size:90%}span.mw-revdelundel-hidden,input.mw-revdelundel-hidden{visibility:hidden}td.mw-revdel-checkbox,th.mw-revdel-checkbox{padding-right:10px;text-align:center}a.feedlink{background:url(images/feed-icon.png) center left no-repeat;padding-left:16px}.plainlinks a{background:none!important;padding:0!important}.rtl a.external.free,.rtl a.external.autonumber{direction:ltr;unicode-bidi:embed}table.wikitable{margin:1em 1em 1em 0;background-color:#f9f9f9;border:1px #aaa solid;border-collapse:collapse;color:black}table.wikitable>tr>th,table.wikitable>tr>td,table.wikitable>*>tr>th,table.wikitable>*>tr>td{border:1px #aaa solid;padding:.2em}table.wikitable>tr>th,table.wikitable>*>tr>th{background-color:#f2f2f2;text-align:center}table.wikitable>caption{font-weight:bold}table.collapsed tr.collapsable{display:none}.success{color:green;font-size:larger}.warning{color:#FFA500;font-size:larger}.error{color:red;font-size:larger}.errorbox,.warningbox,.successbox{font-size:larger;border:2px solid;padding:.5em 1em;float:left;margin-bottom:2em;color:#000}.errorbox{border-color:red;background-color:#fff2f2}.warningbox{border-color:#FF8C00;background-color:#FFFFC0}.successbox{border-color:green;background-color:#dfd}.errorbox h2,.warningbox h2,.successbox h2{font-size:1em;font-weight:bold;display:inline;margin:0 .5em 0 0;border:none}.mw-infobox{border:2px solid #ff7f00;margin:.5em;clear:left;overflow:hidden}.mw-infobox-left{margin:7px;float:left;width:35px}.mw-infobox-right{margin:.5em .5em .5em 49px}.previewnote{color:#c00;margin-bottom:1em}.previewnote p{text-indent:3em;margin:.8em 0}.visualClear{clear:both}#mw_trackbacks{border:solid 1px #bbf;background-color:#eef;padding:.2em}.mw-datatable{border-collapse:collapse}.mw-datatable,.mw-datatable td,.mw-datatable th{border:1px solid #aaa;padding:0 .15em 0 .15em}.mw-datatable th{background-color:#ddf}.mw-datatable td{background-color:#fff}.mw-datatable tr:hover td{background-color:#eef}.TablePager{min-width:80%}.TablePager_nav{margin:0 auto}.TablePager_nav td{padding:3px;text-align:center}.TablePager_nav a{text-decoration:none}.imagelist td,.imagelist th{white-space:nowrap}.imagelist .TablePager_col_links{background-color:#eef}.imagelist .TablePager_col_img_description{white-space:normal}.imagelist th.TablePager_sort{background-color:#ccf}ul#filetoc{text-align:center;border:1px solid #aaa;background-color:#f9f9f9;padding:5px;font-size:95%;margin-bottom:.5em;margin-left:0;margin-right:0}#filetoc li{display:inline;list-style-type:none;padding-right:2em}table.mw_metadata{font-size:.8em;margin-left:.5em;margin-bottom:.5em;width:400px}table.mw_metadata caption{font-weight:bold}table.mw_metadata th{font-weight:normal}table.mw_metadata td{padding:.1em}table.mw_metadata{border:none;border-collapse:collapse}table.mw_metadata td,table.mw_metadata th{text-align:center;border:1px solid #aaa;padding-left:5px;padding-right:5px}table.mw_metadata th{background-color:#f9f9f9}table.mw_metadata td{background-color:#fcfcfc}table.mw_metadata ul.metadata-langlist{list-style-type:none;list-style-image:none;padding-right:5px;padding-left:5px;margin:0}.mw-content-ltr ul,.mw-content-rtl .mw-content-ltr ul{margin:.3em 0 0 1.6em;padding:0}.mw-content-rtl ul,.mw-content-ltr .mw-content-rtl ul{margin:.3em 1.6em 0 0;padding:0}.mw-content-ltr ol,.mw-content-rtl .mw-content-ltr ol{margin:.3em 0 0 3.2em;padding:0}.mw-content-rtl ol,.mw-content-ltr .mw-content-rtl ol{margin:.3em 3.2em 0 0;padding:0}.mw-content-ltr dd,.mw-content-rtl .mw-content-ltr dd{margin-left:1.6em;margin-right:0}.mw-content-rtl dd,.mw-content-ltr .mw-content-rtl dd{margin-right:1.6em;margin-left:0}li.gallerybox{vertical-align:top;border:solid 2px white;display:-moz-inline-box;display:inline-block}ul.gallery,li.gallerybox{zoom:1;*display:inline}ul.gallery{margin:2px;padding:2px;display:block}li.gallerycaption{font-weight:bold;text-align:center;display:block;word-wrap:break-word}li.gallerybox div.thumb{text-align:center;border:1px solid #ccc;background-color:#f9f9f9;margin:2px}li.gallerybox div.thumb img{display:block;margin:0 auto}div.gallerytext{overflow:hidden;font-size:94%;padding:2px 4px;word-wrap:break-word}.mw-ajax-loader{background-image:url(images/ajax-loader.gif);background-position:center center;background-repeat:no-repeat;padding:16px;position:relative;top:-16px}.mw-small-spinner{padding:10px!important;margin-right:.6em;background-image:url(images/spinner.gif);background-position:center center;background-repeat:no-repeat}h1:lang(as),h1:lang(bh),h1:lang(bho),h1:lang(bn),h1:lang(gu),h1:lang(hi),h1:lang(kn),h1:lang(ml),h1:lang(mr),h1:lang(or),h1:lang(pa),h1:lang(sa),h1:lang(ta),h1:lang(te){line-height:1.5em!important}h2:lang(as),h3:lang(as),h4:lang(as),h5:lang(as),h6:lang(as),h2:lang(bho),h3:lang(bho),h4:lang(bho),h5:lang(bho),h6:lang(bho),h2:lang(bh),h3:lang(bh),h4:lang(bh),h5:lang(bh),h6:lang(bh),h2:lang(bn),h3:lang(bn),h4:lang(bn),h5:lang(bn),h6:lang(bn),h2:lang(gu),h3:lang(gu),h4:lang(gu),h5:lang(gu),h6:lang(gu),h2:lang(hi),h3:lang(hi),h4:lang(hi),h5:lang(hi),h6:lang(hi),h2:lang(kn),h3:lang(kn),h4:lang(kn),h5:lang(kn),h6:lang(kn),h2:lang(ml),h3:lang(ml),h4:lang(ml),h5:lang(ml),h6:lang(ml),h2:lang(mr),h3:lang(mr),h4:lang(mr),h5:lang(mr),h6:lang(mr),h2:lang(or),h3:lang(or),h4:lang(or),h5:lang(or),h6:lang(or),h2:lang(pa),h3:lang(pa),h4:lang(pa),h5:lang(pa),h6:lang(pa),h2:lang(sa),h3:lang(sa),h4:lang(sa),h5:lang(sa),h6:lang(sa),h2:lang(ta),h3:lang(ta),h4:lang(ta),h5:lang(ta),h6:lang(ta),h2:lang(te),h3:lang(te),h4:lang(te),h5:lang(te),h6:lang(te){line-height:1.2em}ol:lang(bcc) li,ol:lang(bqi) li,ol:lang(fa) li,ol:lang(glk) li,ol:lang(kk-arab) li,ol:lang(mzn) li{list-style-type:-moz-persian;list-style-type:persian}ol:lang(ckb) li{list-style-type:-moz-arabic-indic;list-style-type:arabic-indic}ol:lang(hi) li,ol:lang(mr) li{list-style-type:-moz-devanagari;list-style-type:devanagari}ol:lang(as) li,ol:lang(bn) li{list-style-type:-moz-bengali;list-style-type:bengali}ol:lang(or) li{list-style-type:-moz-oriya;list-style-type:oriya}#toc ul,.toc ul{margin:.3em 0}.mw-content-ltr .toc ul,.mw-content-ltr #toc ul,.mw-content-rtl .mw-content-ltr .toc ul,.mw-content-rtl .mw-content-ltr #toc ul{text-align:left}.mw-content-rtl .toc ul,.mw-content-rtl #toc ul,.mw-content-ltr .mw-content-rtl .toc ul,.mw-content-ltr .mw-content-rtl #toc ul{text-align:right}.mw-content-ltr .toc ul ul,.mw-content-ltr #toc ul ul,.mw-content-rtl .mw-content-ltr .toc ul ul,.mw-content-rtl .mw-content-ltr #toc ul ul{margin:0 0 0 2em}.mw-content-rtl .toc ul ul,.mw-content-rtl #toc ul ul,.mw-content-ltr .mw-content-rtl .toc ul ul,.mw-content-ltr .mw-content-rtl #toc ul ul{margin:0 2em 0 0}#toc #toctitle,.toc #toctitle,#toc .toctitle,.toc .toctitle{direction:ltr}.mw-help-field-hint{display:none;margin-left:2px;margin-bottom:-8px;padding:0 0 0 15px;background-image:url('images/help-question.gif');background-position:left center;background-repeat:no-repeat;cursor:pointer;font-size:.8em;text-decoration:underline;color:#0645ad}.mw-help-field-hint:hover{background-image:url('images/help-question-hover.gif')}.mw-help-field-data{display:block;background-color:#d6f3ff;padding:5px 8px 4px 8px;border:1px solid #5dc9f4;margin-left:20px}.tipsy{padding:5px 5px 10px;font-size:12px;position:absolute;z-index:100000;overflow:visible}.tipsy-inner{padding:5px 8px 4px 8px;background-color:#d6f3ff;color:black;border:1px solid #5dc9f4;max-width:300px;text-align:left}.tipsy-arrow{position:absolute;background:url(images/tipsy-arrow.gif) no-repeat top left;width:13px;height:13px}.tipsy-se .tipsy-arrow{bottom:-2px;right:10px;background-position:0 100%}#mw-clearyourcache,#mw-sitecsspreview,#mw-sitejspreview,#mw-usercsspreview,#mw-userjspreview{direction:ltr;unicode-bidi:embed}.diff-currentversion-title,.diff{direction:ltr;unicode-bidi:embed}.diff-contentalign-right td{direction:rtl;unicode-bidi:embed}.diff-contentalign-left td{direction:ltr;unicode-bidi:embed}.diff-otitle,.diff-ntitle,.diff-lineno{direction:ltr!important;unicode-bidi:embed}#mw-revision-info,#mw-revision-info-current,#mw-revision-nav{direction:ltr;display:inline}div.tright,div.floatright,table.floatright{clear:right;float:right}div.tleft,div.floatleft,table.floatleft{float:left;clear:left}div.floatright,table.floatright,div.floatleft,table.floatleft{position:relative}#mw-credits a{unicode-bidi:embed}.mw-jump,#jump-to-nav{overflow:hidden;height:0;zoom:1}.printfooter{display:none}.xdebug-error{position:absolute;z-index:99}.editsection,.toctoggle{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}a.stub,a.new{color:#ba0000;text-decoration:none}#toc{border:1px solid #aaa;background-color:#f9f9f9;padding:5px}div.floatright{float:right;clear:right;position:relative;margin:.5em 0 .8em 1.4em}div.floatright p{font-style:italic}div.floatleft{float:left;clear:left;position:relative;margin:.5em 1.4em .8em 0}div.floatleft p{font-style:italic}div.center{text-align:center}div.thumb{border:none;width:auto;margin-top:.5em;margin-bottom:.8em;background-color:transparent}div.thumbinner{border:1px solid #ccc;padding:3px!important;background-color:White;font-size:94%;text-align:center;overflow:hidden}html .thumbimage{border:1px solid #ccc}html .thumbcaption{border:none;text-align:left;line-height:1.4em;padding:3px!important;font-size:94%}div.magnify{display:none}div.tright{float:right;clear:right;margin:.5em 0 .8em 1.4em}div.tleft{float:left;clear:left;margin:.5em 1.4em .8em 0}img.thumbborder{border:1px solid #ddd}table.rimage{float:right;width:1pt;position:relative;margin-left:1em;margin-bottom:1em;text-align:center}body{background:white;color:black;margin:0;padding:0}.noprint,div#jump-to-nav,.mw-jump,div.top,div#column-one,#colophon,.editsection,.toctoggle,.tochidden,div#f-poweredbyico,div#f-copyrightico,li#viewcount,li#about,li#disclaimer,li#mobileview,li#privacy,#footer-places,.mw-hidden-catlinks,tr.mw-metadata-show-hide-extended,span.mw-filepage-other-resolutions,#filetoc{display:none}ul{list-style-type:square}#content{background:none;border:none!important;padding:0!important;margin:0!important;direction:ltr}#footer{background:white;color:black;margin-top:1em;border-top:1px solid #AAA;direction:ltr}h1,h2,h3,h4,h5,h6{font-weight:bold}p{margin:1em 0;line-height:1.2em}pre{border:1pt dashed black;white-space:pre;font-size:8pt;overflow:auto;padding:1em 0;background:white;color:black}table.listing,table.listing td{border:1pt solid black;border-collapse:collapse}a{color:black!important;background:none!important;padding:0!important}a:link,a:visited{color:#520;background:transparent;text-decoration:underline}#content a.external.text:after,#content a.external.autonumber:after{content:"(" attr(href) ") "}#globalWrapper{width:100%!important;min-width:0!important}#content{background:white;color:black}#column-content{margin:0!important}#column-content #content{padding:1em;margin:0!important}a,a.external,a.new,a.stub{color:black!important;text-decoration:none!important}a,a.external,a.new,a.stub{color:inherit!important;text-decoration:inherit!important}img{border:none;vertical-align:middle}span.texhtml{font-family:serif}#siteNotice{display:none}li.gallerybox{vertical-align:top;border:solid 2px white;display:-moz-inline-box;display:inline-block}ul.gallery,li.gallerybox{zoom:1;*display:inline}ul.gallery{margin:2px;padding:2px;display:block}li.gallerycaption{font-weight:bold;text-align:center;display:block;word-wrap:break-word}li.gallerybox div.thumb{text-align:center;border:1px solid #ccc;margin:2px}div.gallerytext{overflow:hidden;font-size:94%;padding:2px 4px;word-wrap:break-word}table.diff{background:white}td.diff-otitle{background:#fff}td.diff-ntitle{background:#fff}td.diff-addedline{background:#cfc;font-size:smaller;border:solid 2px black}td.diff-deletedline{background:#ffa;font-size:smaller;border:dotted 2px black}td.diff-context{background:#eee;font-size:smaller}.diffchange{color:silver;font-weight:bold;text-decoration:underline}table.wikitable,table.mw_metadata{margin:1em 1em 1em 0;border:1px #aaa solid;background:white;border-collapse:collapse}table.wikitable>tr>th,table.wikitable>tr>td,table.wikitable>*>tr>th,table.wikitable>*>tr>td,.mw_metadata th,.mw_metadata td{border:1px #aaa solid;padding:.2em}table.wikitable>tr>th,table.wikitable>*>tr>th,.mw_metadata th{text-align:center;background:white;font-weight:bold}table.wikitable>caption,.mw_metadata caption{font-weight:bold}a.sortheader{margin:0 .3em}.wikitable,.thumb,img{page-break-inside:avoid}h2,h3,h4,h5,h6,h7{page-break-after:avoid}p{widows:3;orphans:3}.catlinks ul{display:inline;margin:0;padding:0;list-style:none;list-style-type:none;list-style-image:none;vertical-align:middle!ie}.catlinks li{display:inline-block;line-height:1.15em;padding:0 .4em;border-left:1px solid #AAA;margin:.1em 0;zoom:1;display:inline!ie}.catlinks li:first-child{padding-left:.2em;border-left:none}dfn{font-style:inherit}sup,sub{line-height:1em}#interwiki-completelist{font-weight:bold}body.page-Main_Page #ca-delete{display:none!important}body.page-Main_Page #mp-topbanner{clear:both}#toolbar{height:22px;margin-bottom:6px}body.action-info :target{background:#DEF}ol.references,div.reflist,div.refbegin{font-size:90%;margin-bottom:.5em}div.refbegin-100{font-size:100%}div.reflist ol.references{font-size:100%;list-style-type:inherit}div.columns{margin-top:.3em}div.columns dl,div.columns ol,div.columns ul{margin-top:0}div.columns li,div.columns dd dd{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid-column}ol.references li:target,sup.reference:target,span.citation:target{background-color:#DEF}sup.reference{font-weight:normal;font-style:normal}span.brokenref{display:none}.citation{word-wrap:break-word}@media screen,handheld{.citation *.printonly{display:none}}.flowlist ul{overflow-x:hidden;margin-left:0;padding-left:1.6em}.flowlist ol{overflow-x:hidden;margin-left:0;padding-left:3.2em}.flowlist dl{overflow-x:hidden}.hlist dl,.hlist ol,.hlist ul{margin:0;padding:0}.hlist dd,.hlist dt,.hlist li{margin:0;display:inline}.hlist dl dl,.hlist dl ol,.hlist dl ul,.hlist ol dl,.hlist ol ol,.hlist ol ul,.hlist ul dl,.hlist ul ol,.hlist ul ul{display:inline}.hlist dt:after{content:":"}.hlist dd:after,.hlist li:after{content:" · ";font-weight:bold}.hlist dd:last-child:after,.hlist dt:last-child:after,.hlist li:last-child:after{content:none}.hlist dd.hlist-last-child:after,.hlist dt.hlist-last-child:after,.hlist li.hlist-last-child:after{content:none}.hlist dd dd:first-child:before,.hlist dd dt:first-child:before,.hlist dd li:first-child:before,.hlist dt dd:first-child:before,.hlist dt dt:first-child:before,.hlist dt li:first-child:before,.hlist li dd:first-child:before,.hlist li dt:first-child:before,.hlist li li:first-child:before{content:"(";font-weight:normal}.hlist dd dd:last-child:after,.hlist dd dt:last-child:after,.hlist dd li:last-child:after,.hlist dt dd:last-child:after,.hlist dt dt:last-child:after,.hlist dt li:last-child:after,.hlist li dd:last-child:after,.hlist li dt:last-child:after,.hlist li li:last-child:after{content:") ";font-weight:normal}.hlist dd dd.hlist-last-child:after,.hlist dd dt.hlist-last-child:after,.hlist dd li.hlist-last-child:after,.hlist dt dd.hlist-last-child:after,.hlist dt dt.hlist-last-child:after,.hlist dt li.hlist-last-child:after,.hlist li dd.hlist-last-child:after,.hlist li dt.hlist-last-child:after,.hlist li li.hlist-last-child:after{content:") ";font-weight:normal}.hlist ol{counter-reset:listitem}.hlist ol>li{counter-increment:listitem}.hlist ol>li:before{content:" " counter(listitem) " "}.hlist dd ol>li:first-child:before,.hlist dt ol>li:first-child:before,.hlist li ol>li:first-child:before{content:"(" counter(listitem) " "}.plainlist ul{line-height:inherit;list-style:none none;margin:0}.plainlist ul li{margin-bottom:0}.navbox{border:1px solid #aaa;width:100%;margin:auto;clear:both;font-size:88%;text-align:center;padding:1px}.navbox-inner,.navbox-subgroup{width:100%}.navbox-group,.navbox-title,.navbox-abovebelow{padding:.25em 1em;line-height:1.5em;text-align:center}th.navbox-group{white-space:nowrap;text-align:right}.navbox,.navbox-subgroup{background:#fdfdfd}.navbox-list{line-height:1.8em;border-color:#fdfdfd}.navbox th,.navbox-title{background:#ccf}.navbox-abovebelow,th.navbox-group,.navbox-subgroup .navbox-title{background:#ddf}.navbox-subgroup .navbox-group,.navbox-subgroup .navbox-abovebelow{background:#e6e6ff}.navbox-even{background:#f7f7f7}.navbox-odd{background:transparent}table.navbox+table.navbox{margin-top:-1px}.navbox .hlist td dl,.navbox .hlist td ol,.navbox .hlist td ul,.navbox td.hlist dl,.navbox td.hlist ol,.navbox td.hlist ul{padding:.125em 0}ol+table.navbox,ul+table.navbox{margin-top:.5em}.navbar{display:inline;font-size:88%;font-weight:normal}.navbar ul{display:inline;white-space:nowrap}.navbar li{word-spacing:-0.125em}.navbar.mini li span{font-variant:small-caps}.infobox .navbar{font-size:100%}.navbox .navbar{display:block;font-size:100%}.navbox-title .navbar{float:left;text-align:left;margin-right:.5em;width:6em}.collapseButton{float:right;font-weight:normal;margin-left:.5em;text-align:right;width:auto}.navbox .collapseButton{width:6em}.mw-collapsible-toggle{font-weight:normal;text-align:right}.navbox .mw-collapsible-toggle{width:6em}.infobox{border:1px solid #aaa;background-color:#f9f9f9;color:black;margin:.5em 0 .5em 1em;padding:.2em;float:right;clear:right;text-align:left;font-size:88%;line-height:1.5em}.infobox caption{font-size:125%;font-weight:bold}.infobox td,.infobox th{vertical-align:top}.infobox.bordered{border-collapse:collapse}.infobox.bordered td,.infobox.bordered th{border:1px solid #aaa}.infobox.bordered .borderless td,.infobox.bordered .borderless th{border:0}.infobox.sisterproject{width:20em;font-size:90%}.infobox.standard-talk{border:1px solid #c0c090;background-color:#f8eaba}.infobox.standard-talk.bordered td,.infobox.standard-talk.bordered th{border:1px solid #c0c090}.infobox.bordered .mergedtoprow td,.infobox.bordered .mergedtoprow th{border:0;border-top:1px solid #aaa;border-right:1px solid #aaa}.infobox.bordered .mergedrow td,.infobox.bordered .mergedrow th{border:0;border-right:1px solid #aaa}.infobox.geography{border-collapse:collapse;line-height:1.2em;font-size:90%}.infobox.geography td,.infobox.geography th{border-top:1px solid #aaa;padding:.4em .6em .4em .6em}.infobox.geography .mergedtoprow td,.infobox.geography .mergedtoprow th{border-top:1px solid #aaa;padding:.4em .6em .2em .6em}.infobox.geography .mergedrow td,.infobox.geography .mergedrow th{border:0;padding:0 .6em .2em .6em}.infobox.geography .mergedbottomrow td,.infobox.geography .mergedbottomrow th{border-top:0;border-bottom:1px solid #aaa;padding:0 .6em .4em .6em}.infobox.geography .maptable td,.infobox.geography .maptable th{border:0;padding:0}.wikitable.plainrowheaders th[scope=row]{font-weight:normal;text-align:left}.wikitable td ul,.wikitable td ol,.wikitable td dl{text-align:left}.wikitable.hlist td ul,.wikitable.hlist td ol,.wikitable.hlist td dl{text-align:inherit}div.listenlist{background:url("//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg") no-repeat scroll 0 0 transparent;background-size:30px;padding-left:40px}table.mw-hiero-table td{vertical-align:middle}div.medialist{min-height:50px;margin:1em;background-position:top left;background-repeat:no-repeat}div.medialist ul{list-style-type:none;list-style-image:none;margin:0}div.medialist ul li{padding-bottom:.5em}div.medialist ul li li{font-size:91%;padding-bottom:0}div#content a[href$=".pdf"].external,div#content a[href*=".pdf?"].external,div#content a[href*=".pdf#"].external,div#content a[href$=".PDF"].external,div#content a[href*=".PDF?"].external,div#content a[href*=".PDF#"].external,div#mw_content a[href$=".pdf"].external,div#mw_content a[href*=".pdf?"].external,div#mw_content a[href*=".pdf#"].external,div#mw_content a[href$=".PDF"].external,div#mw_content a[href*=".PDF?"].external,div#mw_content a[href*=".PDF#"].external{background:url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;padding-right:18px}div#content span.PDFlink a,div#mw_content span.PDFlink a{background:url("//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif") no-repeat right;padding-right:18px}div.columns-2 div.column{float:left;width:50%;min-width:300px}div.columns-3 div.column{float:left;width:33.3%;min-width:200px}div.columns-4 div.column{float:left;width:25%;min-width:150px}div.columns-5 div.column{float:left;width:20%;min-width:120px}.messagebox{border:1px solid #aaa;background-color:#f9f9f9;width:80%;margin:0 auto 1em auto;padding:.2em}.messagebox.merge{border:1px solid #c0b8cc;background-color:#f0e5ff;text-align:center}.messagebox.cleanup{border:1px solid #9f9fff;background-color:#efefff;text-align:center}.messagebox.standard-talk{border:1px solid #c0c090;background-color:#f8eaba;margin:4px auto}.mbox-inside .standard-talk,.messagebox.nested-talk{border:1px solid #c0c090;background-color:#f8eaba;width:100%;margin:2px 0;padding:2px}.messagebox.small{width:238px;font-size:85%;float:right;clear:both;margin:0 0 1em 1em;line-height:1.25em}.messagebox.small-talk{width:238px;font-size:85%;float:right;clear:both;margin:0 0 1em 1em;line-height:1.25em;background:#F8EABA}th.mbox-text,td.mbox-text{border:none;padding:.25em .9em;width:100%}td.mbox-image{border:none;padding:2px 0 2px .9em;text-align:center}td.mbox-imageright{border:none;padding:2px .9em 2px 0;text-align:center}td.mbox-empty-cell{border:none;padding:0;width:1px}table.ambox{margin:0 10%;border:1px solid #aaa;border-left:10px solid #1e90ff;background:#fbfbfb}table.ambox+table.ambox{margin-top:-1px}.ambox th.mbox-text,.ambox td.mbox-text{padding:.25em .5em}.ambox td.mbox-image{padding:2px 0 2px .5em}.ambox td.mbox-imageright{padding:2px .5em 2px 0}table.ambox-notice{border-left:10px solid #1e90ff}table.ambox-speedy{border-left:10px solid #b22222;background:#fee}table.ambox-delete{border-left:10px solid #b22222}table.ambox-content{border-left:10px solid #f28500}table.ambox-style{border-left:10px solid #f4c430}table.ambox-move{border-left:10px solid #9932cc}table.ambox-protection{border-left:10px solid #bba}table.imbox{margin:4px 10%;border-collapse:collapse;border:3px solid #1e90ff;background:#fbfbfb}.imbox .mbox-text .imbox{margin:0 -0.5em;display:block}.mbox-inside .imbox{margin:4px}table.imbox-notice{border:3px solid #1e90ff}table.imbox-speedy{border:3px solid #b22222;background:#fee}table.imbox-delete{border:3px solid #b22222}table.imbox-content{border:3px solid #f28500}table.imbox-style{border:3px solid #f4c430}table.imbox-move{border:3px solid #9932cc}table.imbox-protection{border:3px solid #bba}table.imbox-license{border:3px solid #88a;background:#f7f8ff}table.imbox-featured{border:3px solid #cba135}table.cmbox{margin:3px 10%;border-collapse:collapse;border:1px solid #aaa;background:#DFE8FF}table.cmbox-notice{background:#D8E8FF}table.cmbox-speedy{margin-top:4px;margin-bottom:4px;border:4px solid #b22222;background:#FFDBDB}table.cmbox-delete{background:#FFDBDB}table.cmbox-content{background:#FFE7CE}table.cmbox-style{background:#FFF9DB}table.cmbox-move{background:#E4D8FF}table.cmbox-protection{background:#EFEFE1}table.ombox{margin:4px 10%;border-collapse:collapse;border:1px solid #aaa;background:#f9f9f9}table.ombox-notice{border:1px solid #aaa}table.ombox-speedy{border:2px solid #b22222;background:#fee}table.ombox-delete{border:2px solid #b22222}table.ombox-content{border:1px solid #f28500}table.ombox-style{border:1px solid #f4c430}table.ombox-move{border:1px solid #9932cc}table.ombox-protection{border:2px solid #bba}table.tmbox{margin:4px 10%;border-collapse:collapse;border:1px solid #c0c090;background:#f8eaba}.mediawiki .mbox-inside .tmbox{margin:2px 0;width:100%}.mbox-inside .tmbox.mbox-small{line-height:1.5em;font-size:100%}table.tmbox-speedy{border:2px solid #b22222;background:#fee}table.tmbox-delete{border:2px solid #b22222}table.tmbox-content{border:2px solid #f28500}table.tmbox-style{border:2px solid #f4c430}table.tmbox-move{border:2px solid #9932cc}table.tmbox-protection,table.tmbox-notice{border:1px solid #c0c090}table.dmbox{clear:both;margin:.9em 1em;border-top:1px solid #ccc;border-bottom:1px solid #ccc;background:transparent}table.fmbox{clear:both;margin:.2em 0;width:100%;border:1px solid #aaa;background:#f9f9f9}table.fmbox-system{background:#f9f9f9}table.fmbox-warning{border:1px solid #bb7070;background:#ffdbdb}table.fmbox-editnotice{background:transparent}div.mw-warning-with-logexcerpt,div.mw-lag-warn-high,div.mw-cascadeprotectedwarning,div#mw-protect-cascadeon{clear:both;margin:.2em 0;border:1px solid #bb7070;background:#ffdbdb;padding:.25em .9em}div.mw-lag-warn-normal,div.fmbox-system{clear:both;margin:.2em 0;border:1px solid #aaa;background:#f9f9f9;padding:.25em .9em}body.mediawiki table.mbox-small{clear:right;float:right;margin:4px 0 4px 1em;width:238px;font-size:88%;line-height:1.25em}body.mediawiki table.mbox-small-left{margin:4px 1em 4px 0;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.compact-ambox table .mbox-image,.compact-ambox table .mbox-imageright,.compact-ambox table .mbox-empty-cell{display:none}.compact-ambox table.ambox{border:none;border-collapse:collapse;background:transparent;margin:0 0 0 1.6em!important;padding:0!important;width:auto;display:block}body.mediawiki .compact-ambox table.mbox-small-left{font-size:100%;width:auto;margin:0}.compact-ambox table .mbox-text{padding:0!important;margin:0!important}.compact-ambox table .mbox-text-span{display:list-item;line-height:1.5em;list-style-type:square;list-style-image:url(//bits.wikimedia.org/skins/common/images/bullet.gif)}.skin-vector .compact-ambox table .mbox-text-span{list-style-type:circle;list-style-image:url(//bits.wikimedia.org/skins/vector/images/bullet-icon.png)}.compact-ambox .hide-when-compact{display:none}div.noarticletext{border:none;background:transparent;padding:0}.visualhide{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}#wpSave{font-weight:bold}.hiddenStructure{display:inline!important;color:#f00;background-color:#0f0}.check-icon a.new{display:none;speak:none}.nounderlines a,.IPA a:link,.IPA a:visited{text-decoration:none!important}div.NavFrame{margin:0;padding:4px;border:1px solid #aaa;text-align:center;border-collapse:collapse;font-size:95%}div.NavFrame+div.NavFrame{border-top-style:none;border-top-style:hidden}div.NavPic{background-color:#fff;margin:0;padding:2px;float:left}div.NavFrame div.NavHead{height:1.6em;font-weight:bold;background-color:#ccf;position:relative}div.NavFrame p,div.NavFrame div.NavContent,div.NavFrame div.NavContent p{font-size:100%}div.NavEnd{margin:0;padding:0;line-height:1px;clear:both}a.NavToggle{position:absolute;top:0;right:3px;font-weight:normal;font-size:90%}.rellink,.dablink{font-style:italic;padding-left:1.6em;margin-bottom:.5em}.rellink i,.dablink i{font-style:normal}.listify td{display:list-item}.listify tr{display:block}.listify table{display:block}.geo-default,.geo-dms,.geo-dec{display:inline}.geo-nondefault,.geo-multi-punct{display:none}.longitude,.latitude{white-space:nowrap}.nonumtoc .tocnumber{display:none}.nonumtoc #toc ul,.nonumtoc .toc ul{line-height:1.5em;list-style:none none;margin:.3em 0 0;padding:0}.nonumtoc #toc ul ul,.nonumtoc .toc ul ul{margin:0 0 0 2em}.toclimit-2 .toclevel-1 ul,.toclimit-3 .toclevel-2 ul,.toclimit-4 .toclevel-3 ul,.toclimit-5 .toclevel-4 ul,.toclimit-6 .toclevel-5 ul,.toclimit-7 .toclevel-6 ul{display:none}blockquote.templatequote{margin-top:0}blockquote.templatequote div.templatequotecite{line-height:1em;text-align:left;padding-left:2em;margin-top:0}blockquote.templatequote div.templatequotecite cite{font-size:85%}div.user-block{padding:5px;margin-bottom:.5em;border:1px solid #A9A9A9;background-color:#FFEFD5}.nowrap,.nowraplinks a,.nowraplinks .selflink,sup.reference a{white-space:nowrap}.wrap,.wraplinks a{white-space:normal}.template-documentation{clear:both;margin:1em 0 0 0;border:1px solid #aaa;background-color:#ecfcf4;padding:1em}.imagemap-inline div{display:inline}#wpUploadDescription{height:13em}.thumbinner{min-width:100px}div.thumb .thumbimage{background-color:#fff}div#content .gallerybox div.thumb{background-color:#F9F9F9}.gallerybox .thumb img{background:#fff url(//bits.wikimedia.org/skins/common/images/Checker-16x16.png) repeat}.ns-0 .gallerybox .thumb img,.ns-2 .gallerybox .thumb img,.ns-100 .gallerybox .thumb img,.nochecker .gallerybox .thumb img{background:#fff}#mw-subcategories,#mw-pages,#mw-category-media,#filehistory,#wikiPreview,#wikiDiff{clear:both}body.rtl #mw-articlefeedbackv5,body.rtl #mw-articlefeedback{display:block;margin-bottom:1em;clear:right;float:right}.wpb .wpb-header{display:none}.wpbs-inner .wpb .wpb-header{display:block}.wpbs-inner .wpb .wpb-header{display:table-row}.wpbs-inner .wpb-outside{display:none}.mw-tag-markers{font-family:sans-serif;font-style:italic;font-size:90%}.sysop-show,.accountcreator-show,.templateeditor-show,.autoconfirmed-show{display:none}.ve-init-mw-viewPageTarget-toolbar-editNotices-notice .editnotice-redlink{display:none!important}ul.permissions-errors>li{list-style:none none}ul.permissions-errors{margin:0}body.page-Special_UserLogin .mw-label label,body.page-Special_UserLogin_signup .mw-label label{white-space:nowrap}.transborder{border:solid transparent}* html .transborder{border:solid #000001;filter:chroma(color=#000001)}.updatedmarker{background-color:transparent;color:#006400}li.mw-changeslist-line-watched .mw-title,table.mw-changeslist-line-watched .mw-title,table.mw-enhanced-watch .mw-enhanced-rctime{font-weight:normal}span.texhtml{font-family:"Times New Roman","Nimbus Roman No9 L",Times,serif;font-size:118%;white-space:nowrap}span.texhtml span.texhtml{font-size:100%}div.mw-geshi div,div.mw-geshi div pre,span.mw-geshi,pre.source-css,pre.source-javascript,pre.source-lua{font-family:monospace,Courier!important}table#mw-prefixindex-list-table,table#mw-prefixindex-nav-table{width:98%}.portal-column-left{float:left;width:50%}.portal-column-right{float:right;width:49%}.portal-column-left-wide{float:left;width:60%}.portal-column-right-narrow{float:right;width:39%}.portal-column-left-extra-wide{float:left;width:70%}.portal-column-right-extra-narrow{float:right;width:29%}@media only screen and (max-width:800px){.portal-column-left,.portal-column-right,.portal-column-left-wide,.portal-column-right-narrow,.portal-column-left-extra-wide,.portal-column-right-extra-narrow{float:inherit;width:inherit}}#bodyContent .letterhead{background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');background-repeat:no-repeat;padding:2em;background-color:#faf9f2}.treeview ul{padding:0;margin:0}.treeview li{padding:0;margin:0;list-style-type:none;list-style-image:none;zoom:1}.treeview li li{background:url("//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png") no-repeat 0 -2981px;padding-left:20px;text-indent:.3em}.treeview li li.lastline{background-position:0 -5971px}.treeview li.emptyline>ul{margin-left:-1px}.treeview li.emptyline>ul>li:first-child{background-position:0 9px}td .sortkey,th .sortkey{display:none;speak:none}.inputbox-hidecheckboxes form .inputbox-element{display:none!important}#editpage-specialchars{display:none}.k-player .k-attribution{visibility:hidden}@media(-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(min-resolution:1.5dppx),(min-resolution:144dpi){#p-logo a{background-image:url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/204px-Wikipedia-logo-v2-en.svg.png")!important;background-size:136px auto}}@media(-webkit-min-device-pixel-ratio:2),(min--moz-device-pixel-ratio:2),(min-resolution:2dppx),(min-resolution:192dpi){#p-logo a{background-image:url("//upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/270px-Wikipedia-logo-v2-en.svg.png")!important;background-size:135px auto}}.ns-0 .ambox,.ns-0 .navbox,.ns-0 .vertical-navbox,.ns-0 .infobox.sisterproject,.ns-0 .dablink,.ns-0 .metadata,.editlink,.navbar,a.NavToggle,span.collapseButton,span.mw-collapsible-toggle,th .sortkey,td .sortkey{display:none!important}#content cite a.external.text:after,.nourlexpansion a.external.text:after,.nourlexpansion a.external.autonumber:after{display:none!important}table.collapsible tr,div.NavPic,div.NavContent{display:block!important}table.collapsible tr{display:table-row!important}#firstHeading{margin:0}#content a.external.text:after,#content a.external.autonumber:after{word-wrap:break-word}body.page-Main_Page #deleteconfirm,body.page-Main_Page #t-cite,body.page-Main_Page #footer-info-lastmod,body.action-view.page-Main_Page #siteSub,body.action-view.page-Main_Page #contentSub,body.action-view.page-Main_Page h1.firstHeading{display:none!important}body.page-Main_Page #mp-topbanner{margin-top:0!important}#coordinates{position:absolute;top:0;right:0;float:right;margin:0;padding:0;line-height:1.5em;text-align:right;text-indent:0;font-size:85%;text-transform:none;white-space:nowrap}div.topicon{position:absolute;top:-2em;margin-right:-10px;display:block!important}div.flaggedrevs_short{position:absolute;top:-3em;right:80px;z-index:1;margin-left:0;margin-right:-10px}body.rtl #protected-icon{left:55px}body.rtl #spoken-icon,body.rtl #commons-icon{left:30px}body.rtl #featured-star{left:10px}div.vectorMenu div{z-index:2}#siteSub{display:inline;font-size:92%}li.GA{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/4/42/Monobook-bullet-ga.png)}li.FA{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/d/d4/Monobook-bullet-star.png)}li.mw-changeslist-line-watched,li.mw-history-line-updated{list-style-image:url(//upload.wikimedia.org/wikipedia/commons/c/c2/ChangedBulletVector.png)}#bodyContent a.external[href ^="https://"],.link-https{background:url(//upload.wikimedia.org/wikipedia/en/0/00/Lock_icon_blue.gif) center right no-repeat;padding-right:16px}div.redirectMsg img{vertical-align:text-bottom}.redirectText{font-size:150%;margin:5px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
deleted file mode 100644
index 939e11d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/bench/write.py
+++ /dev/null
@@ -1,344 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-r"""
-=========================
- Write benchmark results
-=========================
-
-Write benchmark results.
-
-:Copyright:
-
- Copyright 2014
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-Usage::
-
-    python -mbench.write [-p plain] [-t table] <pickled
-
-    -p plain  Plain file to write to (like docs/BENCHMARKS).
-    -t table  Table file to write to (like docs/_userdoc/benchmark.txt).
-
-"""
-if __doc__:
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
-__license__ = "Apache License, Version 2.0"
-__version__ = "1.0.0"
-
-import os as _os
-import re as _re
-import sys as _sys
-
-
-try:
-    unicode
-except NameError:
-    def uni(v):
-        if hasattr(v, 'decode'):
-            return v.decode('latin-1')
-        return str(v)
-else:
-    def uni(v):
-        if isinstance(v, unicode):
-            return v.encode('utf-8')
-        return str(v)
-
-
-def write_table(filename, results):
-    """
-    Output tabled benchmark results
-
-    :Parameters:
-      `filename` : ``str``
-        Filename to write to
-
-      `results` : ``list``
-        Results
-    """
-    try:
-        next
-    except NameError:
-        next = lambda i: (getattr(i, 'next', None) or i.__next__)()
-    try:
-        cmp
-    except NameError:
-        cmp = lambda a, b: (a > b) - (a < b)
-
-    names = [
-        ('cssmin', 'YUI Port'),
-        ('rcssmin', '|rcssmin|'),
-        ('_rcssmin', r'_\ |rcssmin|'),
-    ]
-    benched_per_table = 2
-
-    results = sorted(results, reverse=True)
-
-    # First we transform our data into a table (list of lists)
-    pythons, widths = [], [0] * (benched_per_table + 1)
-    last_version = None
-    for version, _, result in results:
-        version = uni(version)
-        if not(last_version is None or version.startswith('2.')):
-            continue
-        last_version = version
-
-        namesub = _re.compile(r'(?:-\d+(?:\.\d+)*)?\.css$').sub
-        result = iter(result)
-        tables = []
-
-        # given our data it's easier to create the table transposed...
-        for benched in result:
-            rows = [['Name'] + [desc for _, desc in names]]
-            for _ in range(benched_per_table):
-                if _:
-                    try:
-                        benched = next(result)
-                    except StopIteration:
-                        rows.append([''] + ['' for _ in names])
-                        continue
-
-                times = dict((
-                    uni(port), (time, benched['sizes'][idx])
-                ) for idx, (port, time) in enumerate(benched['times']))
-                columns = ['%s (%.1f)' % (
-                    namesub('', _os.path.basename(uni(benched['filename']))),
-                    benched['size'] / 1024.0,
-                )]
-                for idx, (port, _) in enumerate(names):
-                    if port not in times:
-                        columns.append('n/a')
-                        continue
-                    time, size = times[port]
-                    if time is None:
-                        columns.append('(failed)')
-                        continue
-                    columns.append('%s%.2f ms (%.1f %s)' % (
-                        idx == 0 and ' ' or '',
-                        time,
-                        size / 1024.0,
-                        idx == 0 and '\\*' or ['=', '>', '<'][
-                            cmp(size, benched['sizes'][0])
-                        ],
-                    ))
-                rows.append(columns)
-
-            # calculate column widths (global for all tables)
-            for idx, row in enumerate(rows):
-                widths[idx] = max(widths[idx], max(map(len, row)))
-
-            # ... and transpose it back.
-            tables.append(zip(*rows))
-        pythons.append((version, tables))
-
-        if last_version.startswith('2.'):
-            break
-
-    # Second we create a rest table from it
-    lines = []
-    separator = lambda c='-': '+'.join([''] + [
-        c * (width + 2) for width in widths
-    ] + [''])
-
-    for idx, (version, tables) in enumerate(pythons):
-        if idx:
-            lines.append('')
-            lines.append('')
-
-        line = 'Python %s' % (version,)
-        lines.append(line)
-        lines.append('~' * len(line))
-
-        for table in tables:
-            lines.append('')
-            lines.append('.. rst-class:: benchmark')
-            lines.append('')
-
-            for idx, row in enumerate(table):
-                if idx == 0:
-                    # header
-                    lines.append(separator())
-                    lines.append('|'.join([''] + [
-                        ' %s%*s ' % (col, len(col) - width, '')
-                        for width, col in zip(widths, row)
-                    ] + ['']))
-                    lines.append(separator('='))
-                else: # data
-                    lines.append('|'.join([''] + [
-                        j == 0 and (
-                            ' %s%*s ' % (col, len(col) - widths[j], '')
-                        ) or (
-                            ['%*s  ', ' %*s '][idx == 1] % (widths[j], col)
-                        )
-                        for j, col in enumerate(row)
-                    ] + ['']))
-                    lines.append(separator())
-
-    fplines = []
-    fp = open(filename)
-    try:
-        fpiter = iter(fp)
-        for line in fpiter:
-            line = line.rstrip()
-            if line == '.. begin tables':
-                buf = []
-                for line in fpiter:
-                    line = line.rstrip()
-                    if line == '.. end tables':
-                        fplines.append('.. begin tables')
-                        fplines.append('')
-                        fplines.extend(lines)
-                        fplines.append('')
-                        fplines.append('.. end tables')
-                        buf = []
-                        break
-                    else:
-                        buf.append(line)
-                else:
-                    fplines.extend(buf)
-                    _sys.stderr.write("Placeholder container not found!\n")
-            else:
-                fplines.append(line)
-    finally:
-        fp.close()
-
-    fp = open(filename, 'w')
-    try:
-        fp.write('\n'.join(fplines) + '\n')
-    finally:
-        fp.close()
-
-
-def write_plain(filename, results):
-    """
-    Output plain benchmark results
-
-    :Parameters:
-      `filename` : ``str``
-        Filename to write to
-
-      `results` : ``list``
-        Results
-    """
-    lines = []
-    results = sorted(results, reverse=True)
-    for idx, (version, import_notes, result) in enumerate(results):
-        if idx:
-            lines.append('')
-            lines.append('')
-
-        lines.append('$ python%s -OO bench/main.py bench/*.css' % (
-            '.'.join(version.split('.')[:2])
-        ))
-        lines.append('~' * 72)
-        for note in import_notes:
-            lines.append(uni(note))
-        lines.append('Python Release: %s' % (version,))
-
-        for single in result:
-            lines.append('')
-            lines.append('Benchmarking %r... (%.1f KiB)' % (
-                uni(single['filename']), single['size'] / 1024.0
-            ))
-            for msg in single['messages']:
-                lines.append(msg)
-            times = []
-            space = max([len(uni(port)) for port, _ in single['times']])
-            for idx, (port, time) in enumerate(single['times']):
-                port = uni(port)
-                if time is None:
-                    lines.append("  FAILED %s" % (port,))
-                else:
-                    times.append(time)
-                    lines.append(
-                        "  Timing %s%s ... (%5.1f KiB %s) %8.2f ms" % (
-                            port,
-                            " " * (space - len(port)),
-                            single['sizes'][idx] / 1024.0,
-                            idx == 0 and '*' or ['=', '>', '<'][
-                                cmp(single['sizes'][idx], single['sizes'][0])
-                            ],
-                            time
-                        )
-                    )
-                    if len(times) > 1:
-                        lines[-1] += " (factor: %s)" % (', '.join([
-                            '%.2f' % (timed / time) for timed in times[:-1]
-                        ]))
-
-    lines.append('')
-    lines.append('')
-    lines.append('# vim: nowrap')
-    fp = open(filename, 'w')
-    try:
-        fp.write('\n'.join(lines) + '\n')
-    finally:
-        fp.close()
-
-
-def main(argv=None):
-    """ Main """
-    import getopt as _getopt
-    import pickle as _pickle
-
-    if argv is None:
-        argv = _sys.argv[1:]
-    try:
-        opts, args = _getopt.getopt(argv, "hp:t:", ["help"])
-    except getopt.GetoptError:
-        e = _sys.exc_info()[0](_sys.exc_info()[1])
-        print >> _sys.stderr, "%s\nTry %s -mbench.write --help" % (
-            e,
-            _os.path.basename(_sys.executable),
-        )
-        _sys.exit(2)
-
-    plain, table = None, None
-    for key, value in opts:
-        if key in ("-h", "--help"):
-            print >> _sys.stderr, (
-                "%s -mbench.write [-p plain] [-t table] <pickled" % (
-                    _os.path.basename(_sys.executable),
-                )
-            )
-            _sys.exit(0)
-        elif key == '-p':
-            plain = str(value)
-        elif key == '-t':
-            table = str(value)
-
-    struct = []
-    _sys.stdin = getattr(_sys.stdin, 'detach', lambda: _sys.stdin)()
-    try:
-        while True:
-            version, import_notes, result = _pickle.load(_sys.stdin)
-            if hasattr(version, 'decode'):
-                version = version.decode('latin-1')
-            struct.append((version, import_notes, result))
-    except EOFError:
-        pass
-
-    if plain:
-        write_plain(plain, struct)
-
-    if table:
-        write_table(table, struct)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS
deleted file mode 100644
index 9a49e9b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/BENCHMARKS
+++ /dev/null
@@ -1,61 +0,0 @@
-$ python3.4 -OO bench/main.py bench/*.css
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 3.4.2
-
-Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   163.11 ms
-  Timing rcssmin  ... ( 49.6 KiB >)    45.48 ms (factor: 3.59)
-  Timing _rcssmin ... ( 49.6 KiB >)     0.43 ms (factor: 378.93, 105.66)
-
-Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   119.00 ms
-  Timing rcssmin  ... ( 49.4 KiB =)    20.94 ms (factor: 5.68)
-  Timing _rcssmin ... ( 49.4 KiB =)     0.26 ms (factor: 454.45, 79.98)
-
-
-$ python3.3 -OO bench/main.py bench/*.css
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 3.3.5
-
-Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   185.01 ms
-  Timing rcssmin  ... ( 49.6 KiB >)    59.30 ms (factor: 3.12)
-  Timing _rcssmin ... ( 49.6 KiB >)     0.52 ms (factor: 356.38, 114.23)
-
-Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   136.26 ms
-  Timing rcssmin  ... ( 49.4 KiB =)    25.51 ms (factor: 5.34)
-  Timing _rcssmin ... ( 49.4 KiB =)     0.26 ms (factor: 515.24, 96.47)
-
-
-$ python3.2 -OO bench/main.py bench/*.css
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 3.2.5
-
-Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   225.32 ms
-  Timing rcssmin  ... ( 49.6 KiB >)    57.51 ms (factor: 3.92)
-  Timing _rcssmin ... ( 49.6 KiB >)     0.43 ms (factor: 527.98, 134.77)
-
-Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   129.43 ms
-  Timing rcssmin  ... ( 49.4 KiB =)    24.45 ms (factor: 5.29)
-  Timing _rcssmin ... ( 49.4 KiB =)     0.25 ms (factor: 526.94, 99.55)
-
-
-$ python2.7 -OO bench/main.py bench/*.css
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 2.7.7
-
-Benchmarking 'bench/wikipedia.css'... (81.0 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   175.98 ms
-  Timing rcssmin  ... ( 49.6 KiB >)    46.22 ms (factor: 3.81)
-  Timing _rcssmin ... ( 49.6 KiB >)     0.45 ms (factor: 390.95, 102.68)
-
-Benchmarking 'bench/wikipedia.min.css'... (49.4 KiB)
-  Timing cssmin   ... ( 49.4 KiB *)   126.19 ms
-  Timing rcssmin  ... ( 49.4 KiB =)    19.92 ms (factor: 6.33)
-  Timing _rcssmin ... ( 49.4 KiB =)     0.27 ms (factor: 469.78, 74.17)
-
-
-# vim: nowrap
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES
deleted file mode 100644
index e179dce..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/CHANGES
+++ /dev/null
@@ -1,42 +0,0 @@
-Changes with version 1.0.5
-
- *) Added support for pypy 2.2
-
- *) Updated benchmarks
-
- *) Relint with newer pylint
-
- *) Fix locale problem with the setup script on python3.
-    Submitted by https://github.com/svenstaro
-
-
-Changes with version 1.0.4
-
- *) Documentation and benchmark updates
-
-
-Changes with version 1.0.3
-
- *) Added support for the following grouping @-rules:
-    @supports, @document, @keyframes
-
- *) Added support for Python 3.4 and Jython 2.7
-
-
-Changes with version 1.0.2
-
- *) Added compat option to setup.py supporting the pip installer
-
- *) Added support for pypy (1.9, 2.0)
-
- *) Added support for jython (2.5)
-
-
-Changes with version 1.0.1
-
- *) Added support for Python 3.3
-
-
-Changes with version 1.0.0
-
- *) First stable release.
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS
deleted file mode 100644
index 10d5965..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/CLASSIFIERS
+++ /dev/null
@@ -1,19 +0,0 @@
-Development Status :: 5 - Production/Stable
-Environment :: Web Environment
-Intended Audience :: Developers
-License :: OSI Approved
-License :: OSI Approved :: Apache License, Version 2.0
-Operating System :: OS Independent
-Programming Language :: C
-Programming Language :: Python
-Programming Language :: Python :: 2
-Programming Language :: Python :: 3
-Programming Language :: Python :: Implementation :: CPython
-Programming Language :: Python :: Implementation :: Jython
-Programming Language :: Python :: Implementation :: PyPy
-Topic :: Internet :: WWW/HTTP :: Dynamic Content
-Topic :: Software Development :: Libraries
-Topic :: Software Development :: Libraries :: Python Modules
-Topic :: Text Processing
-Topic :: Text Processing :: Filters
-Topic :: Utilities
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION
deleted file mode 100644
index b51a7fd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/DESCRIPTION
+++ /dev/null
@@ -1,85 +0,0 @@
-==============
- CSS Minifier
-==============
-
-RCSSmin is a CSS minifier.
-
-The minifier is based on the semantics of the `YUI compressor`_\, which itself
-is based on `the rule list by Isaac Schlueter`_\.
-
-This module is a re-implementation aiming for speed instead of maximum
-compression, so it can be used at runtime (rather than during a preprocessing
-step). RCSSmin does syntactical compression only (removing spaces, comments
-and possibly semicolons). It does not provide semantic compression (like
-removing empty blocks, collapsing redundant properties etc). It does, however,
-support various CSS hacks (by keeping them working as intended).
-
-Here's a feature list:
-
-- Strings are kept, except that escaped newlines are stripped
-- Space/Comments before the very end or before various characters are
-  stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
-  space is kept if it's outside a ruleset.)
-- Space/Comments at the very beginning or after various characters are
-  stripped: ``{}(=:>+[,!``
-- Optional space after unicode escapes is kept, resp. replaced by a simple
-  space
-- whitespaces inside ``url()`` definitions are stripped
-- Comments starting with an exclamation mark (``!``) can be kept optionally.
-- All other comments and/or whitespace characters are replaced by a single
-  space.
-- Multiple consecutive semicolons are reduced to one
-- The last semicolon within a ruleset is stripped
-- CSS Hacks supported:
-
-  - IE7 hack (``>/**/``)
-  - Mac-IE5 hack (``/*\*/.../**/``)
-  - The boxmodelhack is supported naturally because it relies on valid CSS2
-    strings
-  - Between ``:first-line`` and the following comma or curly brace a space is
-    inserted. (apparently it's needed for IE6)
-  - Same for ``:first-letter``
-
-rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
-factor 100 or so (depending on the input). docs/BENCHMARKS in the source
-distribution contains the details.
-
-Both python 2 (>= 2.4) and python 3 are supported.
-
-.. _YUI compressor: https://github.com/yui/yuicompressor/
-
-.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
-
-
-Copyright and License
-~~~~~~~~~~~~~~~~~~~~~
-
-Copyright 2011 - 2014
-André Malo or his licensors, as applicable.
-
-The whole package (except for the files in the bench/ directory) is
-distributed under the Apache License Version 2.0. You'll find a copy in the
-root directory of the distribution or online at:
-<http://www.apache.org/licenses/LICENSE-2.0>.
-
-
-Bugs
-~~~~
-
-No bugs, of course. ;-)
-But if you've found one or have an idea how to improve rcssmin, feel free
-to send a pull request on `github <https://github.com/ndparker/rcssmin>`_
-or send a mail to <rcssmin-bugs@perlig.de>.
-
-
-Author Information
-~~~~~~~~~~~~~~~~~~
-
-André "nd" Malo <nd perlig.de>
-GPG: 0x8103A37E
-
-
-    If God intended people to be naked, they would be born that way.
-    -- Oscar Wilde
-
-.. vim:tw=72 syntax=rest
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES
deleted file mode 100644
index d6d4e9e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/PROVIDES
+++ /dev/null
@@ -1 +0,0 @@
-rcssmin (1.0)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY
deleted file mode 100644
index 490e537..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/SUMMARY
+++ /dev/null
@@ -1 +0,0 @@
-CSS Minifier
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt
deleted file mode 100644
index f4ed223..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/api-objects.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-rcssmin	rcssmin-module.html
-rcssmin.__license__	rcssmin-module.html#__license__
-rcssmin._make_cssmin	rcssmin-module.html#_make_cssmin
-rcssmin.__doc__	rcssmin-module.html#__doc__
-rcssmin.__package__	rcssmin-module.html#__package__
-rcssmin.cssmin	rcssmin-module.html#cssmin
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png
deleted file mode 100644
index 26b43c5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/crarr.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css
deleted file mode 100644
index 86d4170..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.css
+++ /dev/null
@@ -1,322 +0,0 @@
-
-
-/* Epydoc CSS Stylesheet
- *
- * This stylesheet can be used to customize the appearance of epydoc's
- * HTML output.
- *
- */
-
-/* Default Colors & Styles
- *   - Set the default foreground & background color with 'body'; and 
- *     link colors with 'a:link' and 'a:visited'.
- *   - Use bold for decision list terms.
- *   - The heading styles defined here are used for headings *within*
- *     docstring descriptions.  All headings used by epydoc itself use
- *     either class='epydoc' or class='toc' (CSS styles for both
- *     defined below).
- */
-body                        { background: #ffffff; color: #000000; }
-p                           { margin-top: 0.5em; margin-bottom: 0.5em; }
-a:link                      { color: #0000ff; }
-a:visited                   { color: #204080; }
-dt                          { font-weight: bold; }
-h1                          { font-size: +140%; font-style: italic;
-                              font-weight: bold; }
-h2                          { font-size: +125%; font-style: italic;
-                              font-weight: bold; }
-h3                          { font-size: +110%; font-style: italic;
-                              font-weight: normal; }
-code                        { font-size: 100%; }
-/* N.B.: class, not pseudoclass */
-a.link                      { font-family: monospace; }
- 
-/* Page Header & Footer
- *   - The standard page header consists of a navigation bar (with
- *     pointers to standard pages such as 'home' and 'trees'); a
- *     breadcrumbs list, which can be used to navigate to containing
- *     classes or modules; options links, to show/hide private
- *     variables and to show/hide frames; and a page title (using
- *     <h1>).  The page title may be followed by a link to the
- *     corresponding source code (using 'span.codelink').
- *   - The footer consists of a navigation bar, a timestamp, and a
- *     pointer to epydoc's homepage.
- */ 
-h1.epydoc                   { margin: 0; font-size: +140%; font-weight: bold; }
-h2.epydoc                   { font-size: +130%; font-weight: bold; }
-h3.epydoc                   { font-size: +115%; font-weight: bold;
-                              margin-top: 0.2em; }
-td h3.epydoc                { font-size: +115%; font-weight: bold;
-                              margin-bottom: 0; }
-table.navbar                { background: #a0c0ff; color: #000000;
-                              border: 2px groove #c0d0d0; }
-table.navbar table          { color: #000000; }
-th.navbar-select            { background: #70b0ff;
-                              color: #000000; } 
-table.navbar a              { text-decoration: none; }  
-table.navbar a:link         { color: #0000ff; }
-table.navbar a:visited      { color: #204080; }
-span.breadcrumbs            { font-size: 85%; font-weight: bold; }
-span.options                { font-size: 70%; }
-span.codelink               { font-size: 85%; }
-td.footer                   { font-size: 85%; }
-
-/* Table Headers
- *   - Each summary table and details section begins with a 'header'
- *     row.  This row contains a section title (marked by
- *     'span.table-header') as well as a show/hide private link
- *     (marked by 'span.options', defined above).
- *   - Summary tables that contain user-defined groups mark those
- *     groups using 'group header' rows.
- */
-td.table-header             { background: #70b0ff; color: #000000;
-                              border: 1px solid #608090; }
-td.table-header table       { color: #000000; }
-td.table-header table a:link      { color: #0000ff; }
-td.table-header table a:visited   { color: #204080; }
-span.table-header           { font-size: 120%; font-weight: bold; }
-th.group-header             { background: #c0e0f8; color: #000000;
-                              text-align: left; font-style: italic; 
-                              font-size: 115%; 
-                              border: 1px solid #608090; }
-
-/* Summary Tables (functions, variables, etc)
- *   - Each object is described by a single row of the table with
- *     two cells.  The left cell gives the object's type, and is
- *     marked with 'code.summary-type'.  The right cell gives the
- *     object's name and a summary description.
- *   - CSS styles for the table's header and group headers are
- *     defined above, under 'Table Headers'
- */
-table.summary               { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090;
-                              margin-bottom: 0.5em; }
-td.summary                  { border: 1px solid #608090; }
-code.summary-type           { font-size: 85%; }
-table.summary a:link        { color: #0000ff; }
-table.summary a:visited     { color: #204080; }
-
-
-/* Details Tables (functions, variables, etc)
- *   - Each object is described in its own div.
- *   - A single-row summary table w/ table-header is used as
- *     a header for each details section (CSS style for table-header
- *     is defined above, under 'Table Headers').
- */
-table.details               { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090;
-                              margin: .2em 0 0 0; }
-table.details table         { color: #000000; }
-table.details a:link        { color: #0000ff; }
-table.details a:visited     { color: #204080; }
-
-/* Fields */
-dl.fields                   { margin-left: 2em; margin-top: 1em;
-                              margin-bottom: 1em; }
-dl.fields dd ul             { margin-left: 0em; padding-left: 0em; }
-dl.fields dd ul li ul       { margin-left: 2em; padding-left: 0em; }
-div.fields                  { margin-left: 2em; }
-div.fields p                { margin-bottom: 0.5em; }
-
-/* Index tables (identifier index, term index, etc)
- *   - link-index is used for indices containing lists of links
- *     (namely, the identifier index & term index).
- *   - index-where is used in link indices for the text indicating
- *     the container/source for each link.
- *   - metadata-index is used for indices containing metadata
- *     extracted from fields (namely, the bug index & todo index).
- */
-table.link-index            { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090; }
-td.link-index               { border-width: 0px; }
-table.link-index a:link     { color: #0000ff; }
-table.link-index a:visited  { color: #204080; }
-span.index-where            { font-size: 70%; }
-table.metadata-index        { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090; 
-                              margin: .2em 0 0 0; }
-td.metadata-index           { border-width: 1px; border-style: solid; }
-table.metadata-index a:link { color: #0000ff; }
-table.metadata-index a:visited  { color: #204080; }
-
-/* Function signatures
- *   - sig* is used for the signature in the details section.
- *   - .summary-sig* is used for the signature in the summary 
- *     table, and when listing property accessor functions.
- * */
-.sig-name                   { color: #006080; }
-.sig-arg                    { color: #008060; }
-.sig-default                { color: #602000; }
-.summary-sig                { font-family: monospace; }
-.summary-sig-name           { color: #006080; font-weight: bold; }
-table.summary a.summary-sig-name:link
-                            { color: #006080; font-weight: bold; }
-table.summary a.summary-sig-name:visited
-                            { color: #006080; font-weight: bold; }
-.summary-sig-arg            { color: #006040; }
-.summary-sig-default        { color: #501800; }
-
-/* Subclass list
- */
-ul.subclass-list { display: inline; }
-ul.subclass-list li { display: inline; }
-
-/* To render variables, classes etc. like functions */
-table.summary .summary-name { color: #006080; font-weight: bold;
-                              font-family: monospace; }
-table.summary
-     a.summary-name:link    { color: #006080; font-weight: bold;
-                              font-family: monospace; }
-table.summary
-    a.summary-name:visited  { color: #006080; font-weight: bold;
-                              font-family: monospace; }
-
-/* Variable values
- *   - In the 'variable details' sections, each varaible's value is
- *     listed in a 'pre.variable' box.  The width of this box is
- *     restricted to 80 chars; if the value's repr is longer than
- *     this it will be wrapped, using a backslash marked with
- *     class 'variable-linewrap'.  If the value's repr is longer
- *     than 3 lines, the rest will be ellided; and an ellipsis
- *     marker ('...' marked with 'variable-ellipsis') will be used.
- *   - If the value is a string, its quote marks will be marked
- *     with 'variable-quote'.
- *   - If the variable is a regexp, it is syntax-highlighted using
- *     the re* CSS classes.
- */
-pre.variable                { padding: .5em; margin: 0;
-                              background: #dce4ec; color: #000000;
-                              border: 1px solid #708890; }
-.variable-linewrap          { color: #604000; font-weight: bold; }
-.variable-ellipsis          { color: #604000; font-weight: bold; }
-.variable-quote             { color: #604000; font-weight: bold; }
-.variable-group             { color: #008000; font-weight: bold; }
-.variable-op                { color: #604000; font-weight: bold; }
-.variable-string            { color: #006030; }
-.variable-unknown           { color: #a00000; font-weight: bold; }
-.re                         { color: #000000; }
-.re-char                    { color: #006030; }
-.re-op                      { color: #600000; }
-.re-group                   { color: #003060; }
-.re-ref                     { color: #404040; }
-
-/* Base tree
- *   - Used by class pages to display the base class hierarchy.
- */
-pre.base-tree               { font-size: 80%; margin: 0; }
-
-/* Frames-based table of contents headers
- *   - Consists of two frames: one for selecting modules; and
- *     the other listing the contents of the selected module.
- *   - h1.toc is used for each frame's heading
- *   - h2.toc is used for subheadings within each frame.
- */
-h1.toc                      { text-align: center; font-size: 105%;
-                              margin: 0; font-weight: bold;
-                              padding: 0; }
-h2.toc                      { font-size: 100%; font-weight: bold; 
-                              margin: 0.5em 0 0 -0.3em; }
-
-/* Syntax Highlighting for Source Code
- *   - doctest examples are displayed in a 'pre.py-doctest' block.
- *     If the example is in a details table entry, then it will use
- *     the colors specified by the 'table pre.py-doctest' line.
- *   - Source code listings are displayed in a 'pre.py-src' block.
- *     Each line is marked with 'span.py-line' (used to draw a line
- *     down the left margin, separating the code from the line
- *     numbers).  Line numbers are displayed with 'span.py-lineno'.
- *     The expand/collapse block toggle button is displayed with
- *     'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not
- *     modify the font size of the text.)
- *   - If a source code page is opened with an anchor, then the
- *     corresponding code block will be highlighted.  The code
- *     block's header is highlighted with 'py-highlight-hdr'; and
- *     the code block's body is highlighted with 'py-highlight'.
- *   - The remaining py-* classes are used to perform syntax
- *     highlighting (py-string for string literals, py-name for names,
- *     etc.)
- */
-pre.py-doctest              { padding: .5em; margin: 1em;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #708890; }
-table pre.py-doctest        { background: #dce4ec;
-                              color: #000000; }
-pre.py-src                  { border: 2px solid #000000; 
-                              background: #f0f0f0; color: #000000; }
-.py-line                    { border-left: 2px solid #000000; 
-                              margin-left: .2em; padding-left: .4em; }
-.py-lineno                  { font-style: italic; font-size: 90%;
-                              padding-left: .5em; }
-a.py-toggle                 { text-decoration: none; }
-div.py-highlight-hdr        { border-top: 2px solid #000000;
-                              border-bottom: 2px solid #000000;
-                              background: #d8e8e8; }
-div.py-highlight            { border-bottom: 2px solid #000000;
-                              background: #d0e0e0; }
-.py-prompt                  { color: #005050; font-weight: bold;}
-.py-more                    { color: #005050; font-weight: bold;}
-.py-string                  { color: #006030; }
-.py-comment                 { color: #003060; }
-.py-keyword                 { color: #600000; }
-.py-output                  { color: #404040; }
-.py-name                    { color: #000050; }
-.py-name:link               { color: #000050 !important; }
-.py-name:visited            { color: #000050 !important; }
-.py-number                  { color: #005000; }
-.py-defname                 { color: #000060; font-weight: bold; }
-.py-def-name                { color: #000060; font-weight: bold; }
-.py-base-class              { color: #000060; }
-.py-param                   { color: #000060; }
-.py-docstring               { color: #006030; }
-.py-decorator               { color: #804020; }
-/* Use this if you don't want links to names underlined: */
-/*a.py-name                   { text-decoration: none; }*/
-
-/* Graphs & Diagrams
- *   - These CSS styles are used for graphs & diagrams generated using
- *     Graphviz dot.  'img.graph-without-title' is used for bare
- *     diagrams (to remove the border created by making the image
- *     clickable).
- */
-img.graph-without-title     { border: none; }
-img.graph-with-title        { border: 1px solid #000000; }
-span.graph-title            { font-weight: bold; }
-span.graph-caption          { }
-
-/* General-purpose classes
- *   - 'p.indent-wrapped-lines' defines a paragraph whose first line
- *     is not indented, but whose subsequent lines are.
- *   - The 'nomargin-top' class is used to remove the top margin (e.g.
- *     from lists).  The 'nomargin' class is used to remove both the
- *     top and bottom margin (but not the left or right margin --
- *     for lists, that would cause the bullets to disappear.)
- */
-p.indent-wrapped-lines      { padding: 0 0 0 7em; text-indent: -7em; 
-                              margin: 0; }
-.nomargin-top               { margin-top: 0; }
-.nomargin                   { margin-top: 0; margin-bottom: 0; }
-
-/* HTML Log */
-div.log-block               { padding: 0; margin: .5em 0 .5em 0;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #000000; }
-div.log-error               { padding: .1em .3em .1em .3em; margin: 4px;
-                              background: #ffb0b0; color: #000000;
-                              border: 1px solid #000000; }
-div.log-warning             { padding: .1em .3em .1em .3em; margin: 4px;
-                              background: #ffffb0; color: #000000;
-                              border: 1px solid #000000; }
-div.log-info               { padding: .1em .3em .1em .3em; margin: 4px;
-                              background: #b0ffb0; color: #000000;
-                              border: 1px solid #000000; }
-h2.log-hdr                  { background: #70b0ff; color: #000000;
-                              margin: 0; padding: 0em 0.5em 0em 0.5em;
-                              border-bottom: 1px solid #000000; font-size: 110%; }
-p.log                       { font-weight: bold; margin: .5em 0 .5em 0; }
-tr.opt-changed              { color: #000000; font-weight: bold; }
-tr.opt-default              { color: #606060; }
-pre.log                     { margin: 0; padding: 0; padding-left: 1em; }
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js
deleted file mode 100644
index e787dbc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/epydoc.js
+++ /dev/null
@@ -1,293 +0,0 @@
-function toggle_private() {
-        // Search for any private/public links on this page.  Store
-        // their old text in "cmd," so we will know what action to
-        // take; and change their text to the opposite action.
-        var cmd = "?";
-        var elts = document.getElementsByTagName("a");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "privatelink") {
-            cmd = elts[i].innerHTML;
-            elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")?
-                                    "hide&nbsp;private":"show&nbsp;private");
-          }
-        }
-        // Update all DIVs containing private objects.
-        var elts = document.getElementsByTagName("div");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
-          }
-          else if (elts[i].className == "public") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"block":"none");
-          }
-        }
-        // Update all table rows containing private objects.  Note, we
-        // use "" instead of "block" becaue IE & firefox disagree on what
-        // this should be (block vs table-row), and "" just gives the
-        // default for both browsers.
-        var elts = document.getElementsByTagName("tr");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"");
-          }
-        }
-        // Update all list items containing private objects.
-        var elts = document.getElementsByTagName("li");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?
-                                        "none":"");
-          }
-        }
-        // Update all list items containing private objects.
-        var elts = document.getElementsByTagName("ul");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
-          }
-        }
-        // Set a cookie to remember the current option.
-        document.cookie = "EpydocPrivate="+cmd;
-      }
-function show_private() {
-        var elts = document.getElementsByTagName("a");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "privatelink") {
-            cmd = elts[i].innerHTML;
-            if (cmd && cmd.substr(0,4)=="show")
-                toggle_private();
-          }
-        }
-      }
-function getCookie(name) {
-        var dc = document.cookie;
-        var prefix = name + "=";
-        var begin = dc.indexOf("; " + prefix);
-        if (begin == -1) {
-          begin = dc.indexOf(prefix);
-          if (begin != 0) return null;
-        } else
-        { begin += 2; }
-        var end = document.cookie.indexOf(";", begin);
-        if (end == -1)
-        { end = dc.length; }
-        return unescape(dc.substring(begin + prefix.length, end));
-      }
-function setFrame(url1, url2) {
-          parent.frames[1].location.href = url1;
-          parent.frames[2].location.href = url2;
-      }
-function checkCookie() {
-        var cmd=getCookie("EpydocPrivate");
-        if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0)
-            toggle_private();
-      }
-function toggleCallGraph(id) {
-        var elt = document.getElementById(id);
-        if (elt.style.display == "none")
-            elt.style.display = "block";
-        else
-            elt.style.display = "none";
-      }
-function expand(id) {
-  var elt = document.getElementById(id+"-expanded");
-  if (elt) elt.style.display = "block";
-  var elt = document.getElementById(id+"-expanded-linenums");
-  if (elt) elt.style.display = "block";
-  var elt = document.getElementById(id+"-collapsed");
-  if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
-  var elt = document.getElementById(id+"-collapsed-linenums");
-  if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
-  var elt = document.getElementById(id+"-toggle");
-  if (elt) { elt.innerHTML = "-"; }
-}
-
-function collapse(id) {
-  var elt = document.getElementById(id+"-expanded");
-  if (elt) elt.style.display = "none";
-  var elt = document.getElementById(id+"-expanded-linenums");
-  if (elt) elt.style.display = "none";
-  var elt = document.getElementById(id+"-collapsed-linenums");
-  if (elt) { elt.innerHTML = "<br />"; elt.style.display="block"; }
-  var elt = document.getElementById(id+"-toggle");
-  if (elt) { elt.innerHTML = "+"; }
-  var elt = document.getElementById(id+"-collapsed");
-  if (elt) {
-    elt.style.display = "block";
-    
-    var indent = elt.getAttribute("indent");
-    var pad = elt.getAttribute("pad");
-    var s = "<tt class='py-lineno'>";
-    for (var i=0; i<pad.length; i++) { s += "&nbsp;" }
-    s += "</tt>";
-    s += "&nbsp;&nbsp;<tt class='py-line'>";
-    for (var i=0; i<indent.length; i++) { s += "&nbsp;" }
-    s += "<a href='#' onclick='expand(\"" + id;
-    s += "\");return false'>...</a></tt><br />";
-    elt.innerHTML = s;
-  }
-}
-
-function toggle(id) {
-  elt = document.getElementById(id+"-toggle");
-  if (elt.innerHTML == "-")
-      collapse(id); 
-  else
-      expand(id);
-  return false;
-}
-
-function highlight(id) {
-  var elt = document.getElementById(id+"-def");
-  if (elt) elt.className = "py-highlight-hdr";
-  var elt = document.getElementById(id+"-expanded");
-  if (elt) elt.className = "py-highlight";
-  var elt = document.getElementById(id+"-collapsed");
-  if (elt) elt.className = "py-highlight";
-}
-
-function num_lines(s) {
-  var n = 1;
-  var pos = s.indexOf("\n");
-  while ( pos > 0) {
-    n += 1;
-    pos = s.indexOf("\n", pos+1);
-  }
-  return n;
-}
-
-// Collapse all blocks that mave more than `min_lines` lines.
-function collapse_all(min_lines) {
-  var elts = document.getElementsByTagName("div");
-  for (var i=0; i<elts.length; i++) {
-    var elt = elts[i];
-    var split = elt.id.indexOf("-");
-    if (split > 0)
-      if (elt.id.substring(split, elt.id.length) == "-expanded")
-        if (num_lines(elt.innerHTML) > min_lines)
-          collapse(elt.id.substring(0, split));
-  }
-}
-
-function expandto(href) {
-  var start = href.indexOf("#")+1;
-  if (start != 0 && start != href.length) {
-    if (href.substring(start, href.length) != "-") {
-      collapse_all(4);
-      pos = href.indexOf(".", start);
-      while (pos != -1) {
-        var id = href.substring(start, pos);
-        expand(id);
-        pos = href.indexOf(".", pos+1);
-      }
-      var id = href.substring(start, href.length);
-      expand(id);
-      highlight(id);
-    }
-  }
-}
-
-function kill_doclink(id) {
-  var parent = document.getElementById(id);
-  parent.removeChild(parent.childNodes.item(0));
-}
-function auto_kill_doclink(ev) {
-  if (!ev) var ev = window.event;
-  if (!this.contains(ev.toElement)) {
-    var parent = document.getElementById(this.parentID);
-    parent.removeChild(parent.childNodes.item(0));
-  }
-}
-
-function doclink(id, name, targets_id) {
-  var elt = document.getElementById(id);
-
-  // If we already opened the box, then destroy it.
-  // (This case should never occur, but leave it in just in case.)
-  if (elt.childNodes.length > 1) {
-    elt.removeChild(elt.childNodes.item(0));
-  }
-  else {
-    // The outer box: relative + inline positioning.
-    var box1 = document.createElement("div");
-    box1.style.position = "relative";
-    box1.style.display = "inline";
-    box1.style.top = 0;
-    box1.style.left = 0;
-  
-    // A shadow for fun
-    var shadow = document.createElement("div");
-    shadow.style.position = "absolute";
-    shadow.style.left = "-1.3em";
-    shadow.style.top = "-1.3em";
-    shadow.style.background = "#404040";
-    
-    // The inner box: absolute positioning.
-    var box2 = document.createElement("div");
-    box2.style.position = "relative";
-    box2.style.border = "1px solid #a0a0a0";
-    box2.style.left = "-.2em";
-    box2.style.top = "-.2em";
-    box2.style.background = "white";
-    box2.style.padding = ".3em .4em .3em .4em";
-    box2.style.fontStyle = "normal";
-    box2.onmouseout=auto_kill_doclink;
-    box2.parentID = id;
-
-    // Get the targets
-    var targets_elt = document.getElementById(targets_id);
-    var targets = targets_elt.getAttribute("targets");
-    var links = "";
-    target_list = targets.split(",");
-    for (var i=0; i<target_list.length; i++) {
-        var target = target_list[i].split("=");
-        links += "<li><a href='" + target[1] + 
-               "' style='text-decoration:none'>" +
-               target[0] + "</a></li>";
-    }
-  
-    // Put it all together.
-    elt.insertBefore(box1, elt.childNodes.item(0));
-    //box1.appendChild(box2);
-    box1.appendChild(shadow);
-    shadow.appendChild(box2);
-    box2.innerHTML =
-        "Which <b>"+name+"</b> do you want to see documentation for?" +
-        "<ul style='margin-bottom: 0;'>" +
-        links + 
-        "<li><a href='#' style='text-decoration:none' " +
-        "onclick='kill_doclink(\""+id+"\");return false;'>"+
-        "<i>None of the above</i></a></li></ul>";
-  }
-  return false;
-}
-
-function get_anchor() {
-          var href = location.href;
-          var start = href.indexOf("#")+1;
-          if ((start != 0) && (start != href.length))
-              return href.substring(start, href.length);
-      }
-function redirect_url(dottedName) {
-          // Scan through each element of the "pages" list, and check
-          // if "name" matches with any of them.
-          for (var i=0; i<pages.length; i++) {
-
-              // Each page has the form "<pagename>-m" or "<pagename>-c";
-              // extract the <pagename> portion & compare it to dottedName.
-              var pagename = pages[i].substring(0, pages[i].length-2);
-              if (pagename == dottedName.substring(0,pagename.length)) {
-
-                  // We've found a page that matches `dottedName`;
-                  // construct its URL, using leftover `dottedName`
-                  // content to form an anchor.
-                  var pagetype = pages[i].charAt(pages[i].length-1);
-                  var url = pagename + ((pagetype=="m")?"-module.html":
-                                                        "-class.html");
-                  if (dottedName.length > pagename.length)
-                      url += "#" + dottedName.substring(pagename.length+1,
-                                                        dottedName.length);
-                  return url;
-              }
-          }
-      }
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html
deleted file mode 100644
index d1bf1c8..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/help.html
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Help</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Help&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">&nbsp;</td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-
-<h1 class="epydoc"> API Documentation </h1>
-
-<p> This document contains the API (Application Programming Interface)
-documentation for this project.  Documentation for the Python
-objects defined by the project is divided into separate pages for each
-package, module, and class.  The API documentation also includes two
-pages containing information about the project as a whole: a trees
-page, and an index page.  </p>
-
-<h2> Object Documentation </h2>
-
-  <p>Each <strong>Package Documentation</strong> page contains: </p>
-  <ul>
-    <li> A description of the package. </li>
-    <li> A list of the modules and sub-packages contained by the
-    package.  </li>
-    <li> A summary of the classes defined by the package. </li>
-    <li> A summary of the functions defined by the package. </li>
-    <li> A summary of the variables defined by the package. </li>
-    <li> A detailed description of each function defined by the
-    package. </li>
-    <li> A detailed description of each variable defined by the
-    package. </li>
-  </ul>
-  
-  <p>Each <strong>Module Documentation</strong> page contains:</p>
-  <ul>
-    <li> A description of the module. </li>
-    <li> A summary of the classes defined by the module. </li>
-    <li> A summary of the functions defined by the module. </li>
-    <li> A summary of the variables defined by the module. </li>
-    <li> A detailed description of each function defined by the
-    module. </li>
-    <li> A detailed description of each variable defined by the
-    module. </li>
-  </ul>
-  
-  <p>Each <strong>Class Documentation</strong> page contains: </p>
-  <ul>
-    <li> A class inheritance diagram. </li>
-    <li> A list of known subclasses. </li>
-    <li> A description of the class. </li>
-    <li> A summary of the methods defined by the class. </li>
-    <li> A summary of the instance variables defined by the class. </li>
-    <li> A summary of the class (static) variables defined by the
-    class. </li> 
-    <li> A detailed description of each method defined by the
-    class. </li>
-    <li> A detailed description of each instance variable defined by the
-    class. </li> 
-    <li> A detailed description of each class (static) variable defined
-    by the class. </li> 
-  </ul>
-
-<h2> Project Documentation </h2>
-
-  <p> The <strong>Trees</strong> page contains the module and class hierarchies: </p>
-  <ul>
-    <li> The <em>module hierarchy</em> lists every package and module, with
-    modules grouped into packages.  At the top level, and within each
-    package, modules and sub-packages are listed alphabetically. </li>
-    <li> The <em>class hierarchy</em> lists every class, grouped by base
-    class.  If a class has more than one base class, then it will be
-    listed under each base class.  At the top level, and under each base
-    class, classes are listed alphabetically. </li>
-  </ul>
-  
-  <p> The <strong>Index</strong> page contains indices of terms and
-  identifiers: </p>
-  <ul>
-    <li> The <em>term index</em> lists every term indexed by any object's
-    documentation.  For each term, the index provides links to each
-    place where the term is indexed. </li>
-    <li> The <em>identifier index</em> lists the (short) name of every package,
-    module, class, method, function, variable, and parameter.  For each
-    identifier, the index provides a short description, and a link to
-    its documentation. </li>
-  </ul>
-
-<h2> The Table of Contents </h2>
-
-<p> The table of contents occupies the two frames on the left side of
-the window.  The upper-left frame displays the <em>project
-contents</em>, and the lower-left frame displays the <em>module
-contents</em>: </p>
-
-<table class="help summary" border="1" cellspacing="0" cellpadding="3">
-  <tr style="height: 30%">
-    <td align="center" style="font-size: small">
-       Project<br />Contents<hr />...</td>
-    <td align="center" style="font-size: small" rowspan="2" width="70%">
-      API<br />Documentation<br />Frame<br /><br /><br />
-    </td>
-  </tr>
-  <tr>
-    <td align="center" style="font-size: small">
-      Module<br />Contents<hr />&nbsp;<br />...<br />&nbsp;
-    </td>
-  </tr>
-</table><br />
-
-<p> The <strong>project contents frame</strong> contains a list of all packages
-and modules that are defined by the project.  Clicking on an entry
-will display its contents in the module contents frame.  Clicking on a
-special entry, labeled "Everything," will display the contents of
-the entire project. </p>
-
-<p> The <strong>module contents frame</strong> contains a list of every
-submodule, class, type, exception, function, and variable defined by a
-module or package.  Clicking on an entry will display its
-documentation in the API documentation frame.  Clicking on the name of
-the module, at the top of the frame, will display the documentation
-for the module itself. </p>
-
-<p> The "<strong>frames</strong>" and "<strong>no frames</strong>" buttons below the top
-navigation bar can be used to control whether the table of contents is
-displayed or not. </p>
-
-<h2> The Navigation Bar </h2>
-
-<p> A navigation bar is located at the top and bottom of every page.
-It indicates what type of page you are currently viewing, and allows
-you to go to related pages.  The following table describes the labels
-on the navigation bar.  Note that not some labels (such as
-[Parent]) are not displayed on all pages. </p>
-
-<table class="summary" border="1" cellspacing="0" cellpadding="3" width="100%">
-<tr class="summary">
-  <th>Label</th>
-  <th>Highlighted when...</th>
-  <th>Links to...</th>
-</tr>
-  <tr><td valign="top"><strong>[Parent]</strong></td>
-      <td valign="top"><em>(never highlighted)</em></td>
-      <td valign="top"> the parent of the current package </td></tr>
-  <tr><td valign="top"><strong>[Package]</strong></td>
-      <td valign="top">viewing a package</td>
-      <td valign="top">the package containing the current object
-      </td></tr>
-  <tr><td valign="top"><strong>[Module]</strong></td>
-      <td valign="top">viewing a module</td>
-      <td valign="top">the module containing the current object
-      </td></tr> 
-  <tr><td valign="top"><strong>[Class]</strong></td>
-      <td valign="top">viewing a class </td>
-      <td valign="top">the class containing the current object</td></tr>
-  <tr><td valign="top"><strong>[Trees]</strong></td>
-      <td valign="top">viewing the trees page</td>
-      <td valign="top"> the trees page </td></tr>
-  <tr><td valign="top"><strong>[Index]</strong></td>
-      <td valign="top">viewing the index page</td>
-      <td valign="top"> the index page </td></tr>
-  <tr><td valign="top"><strong>[Help]</strong></td>
-      <td valign="top">viewing the help page</td>
-      <td valign="top"> the help page </td></tr>
-</table>
-
-<p> The "<strong>show private</strong>" and "<strong>hide private</strong>" buttons below
-the top navigation bar can be used to control whether documentation
-for private objects is displayed.  Private objects are usually defined
-as objects whose (short) names begin with a single underscore, but do
-not end with an underscore.  For example, "<code>_x</code>",
-"<code>__pprint</code>", and "<code>epydoc.epytext._tokenize</code>"
-are private objects; but "<code>re.sub</code>",
-"<code>__init__</code>", and "<code>type_</code>" are not.  However,
-if a module defines the "<code>__all__</code>" variable, then its
-contents are used to decide which objects are private. </p>
-
-<p> A timestamp below the bottom navigation bar indicates when each
-page was last updated. </p>
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Help&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html
deleted file mode 100644
index 82acafd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/identifier-index.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Identifier Index</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Indices&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">&nbsp;</td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<table border="0" width="100%">
-<tr valign="bottom"><td>
-<h1 class="epydoc">Identifier Index</h1>
-</td><td>
-[
-  A
-  B
- <a href="#C">C</a>
-  D
-  E
-  F
-  G
-  H
-  I
-  J
-  K
-  L
-  M
-  N
-  O
-  P
-  Q
- <a href="#R">R</a>
-  S
-  T
-  U
-  V
-  W
-  X
-  Y
-  Z
- <a href="#_">_</a>
-]
-</td></table>
-<table border="0" width="100%">
-<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="C">C</a></h2></td>
-<td valign="top">
-<table class="link-index" width="100%" border="1">
-<tr>
-<td width="33%" class="link-index"><a href="rcssmin-module.html#cssmin">cssmin()</a><br />
-<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
-<td width="33%" class="link-index">&nbsp;</td>
-<td width="33%" class="link-index">&nbsp;</td>
-</tr>
-<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
-</table>
-</td></tr>
-<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="R">R</a></h2></td>
-<td valign="top">
-<table class="link-index" width="100%" border="1">
-<tr>
-<td width="33%" class="link-index"><a href="rcssmin-module.html">rcssmin</a></td>
-<td width="33%" class="link-index">&nbsp;</td>
-<td width="33%" class="link-index">&nbsp;</td>
-</tr>
-<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
-</table>
-</td></tr>
-<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="_">_</a></h2></td>
-<td valign="top">
-<table class="link-index" width="100%" border="1">
-<tr>
-<td width="33%" class="link-index"><a href="rcssmin-module.html#__doc__">__doc__</a><br />
-<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
-<td width="33%" class="link-index"><a href="rcssmin-module.html#__license__">__license__</a><br />
-<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
-<td width="33%" class="link-index"><a href="rcssmin-module.html#__package__">__package__</a><br />
-<span class="index-where">(in&nbsp;<a href="rcssmin-module.html">rcssmin</a>)</span></td>
-</tr>
-<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
-</table>
-</td></tr>
-</table>
-<br /><br /><!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Indices&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html
deleted file mode 100644
index 84ffddd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/index.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>rcssmin</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">
-      <span class="breadcrumbs">
-        Module&nbsp;rcssmin
-      </span>
-    </td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<!-- ==================== MODULE DESCRIPTION ==================== -->
-<h1 class="epydoc">Module rcssmin</h1><p class="nomargin-top"><span class="codelink"><a href="rcssmin-pysrc.html">source&nbsp;code</a></span></p>
-<p>CSS Minifier.</p>
-<p>The minifier is based on the semantics of the <a class="rst-reference external" href="https://github.com/yui/yuicompressor/" target="_top">YUI compressor</a>, which
-itself is based on <a class="rst-reference external" href="https://github.com/isaacs/cssmin/" target="_top">the rule list by Isaac Schlueter</a>.</p>
-<p>This module is a re-implementation aiming for speed instead of maximum
-compression, so it can be used at runtime (rather than during a preprocessing
-step). RCSSmin does syntactical compression only (removing spaces, comments
-and possibly semicolons). It does not provide semantic compression (like
-removing empty blocks, collapsing redundant properties etc). It does, however,
-support various CSS hacks (by keeping them working as intended).</p>
-<p>Here's a feature list:</p>
-<ul class="rst-simple">
-<li>Strings are kept, except that escaped newlines are stripped</li>
-<li>Space/Comments before the very end or before various characters are
-stripped: <tt class="rst-docutils literal"><span class="pre">:{});=&gt;+],!</span></tt> (The colon (<tt class="rst-docutils literal">:</tt>) is a special case, a single
-space is kept if it's outside a ruleset.)</li>
-<li>Space/Comments at the very beginning or after various characters are
-stripped: <tt class="rst-docutils literal"><span class="pre">{}(=:&gt;+[,!</span></tt></li>
-<li>Optional space after unicode escapes is kept, resp. replaced by a simple
-space</li>
-<li>whitespaces inside <tt class="rst-docutils literal">url()</tt> definitions are stripped</li>
-<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally.</li>
-<li>All other comments and/or whitespace characters are replaced by a single
-space.</li>
-<li>Multiple consecutive semicolons are reduced to one</li>
-<li>The last semicolon within a ruleset is stripped</li>
-<li>CSS Hacks supported:<ul>
-<li>IE7 hack (<tt class="rst-docutils literal"><span class="pre">&gt;/**/</span></tt>)</li>
-<li>Mac-IE5 hack (<tt class="rst-docutils literal"><span class="pre">/*\*/.../**/</span></tt>)</li>
-<li>The boxmodelhack is supported naturally because it relies on valid CSS2
-strings</li>
-<li>Between <tt class="rst-docutils literal"><span class="pre">:first-line</span></tt> and the following comma or curly brace a space is
-inserted. (apparently it's needed for IE6)</li>
-<li>Same for <tt class="rst-docutils literal"><span class="pre">:first-letter</span></tt></li>
-</ul>
-</li>
-</ul>
-<p>rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
-factor 100 or so (depending on the input). docs/BENCHMARKS in the source
-distribution contains the details.</p>
-<p>Both python 2 (&gt;= 2.4) and python 3 are supported.</p>
-
-<hr />
-<div class="fields">      <p><strong>Copyright:</strong>
-        Copyright 2011 - 2014
-Andr&#233; Malo or his licensors, as applicable
-      </p>
-      <p><strong>License:</strong>
-        <p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at</p>
-<blockquote>
-<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote>
-<p>Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.</p>
-      </p>
-      <p><strong>Version:</strong>
-        1.0.5
-      </p>
-      <p><strong>Author:</strong>
-        Andr&#233; Malo
-      </p>
-</div><!-- ==================== FUNCTIONS ==================== -->
-<a name="section-Functions"></a>
-<table class="summary" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Functions</span></td>
-</tr>
-<tr>
-    <td width="15%" align="right" valign="top" class="summary">
-      <span class="summary-type"><tt class="rst-docutils literal">str</tt></span>
-    </td><td class="summary">
-      <table width="100%" cellpadding="0" cellspacing="0" border="0">
-        <tr>
-          <td><span class="summary-sig"><a href="rcssmin-module.html#cssmin" class="summary-sig-name">cssmin</a>(<span class="summary-sig-arg">style</span>,
-        <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br />
-      Minify CSS.</td>
-          <td align="right" valign="top">
-            <span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>
-            
-          </td>
-        </tr>
-      </table>
-      
-    </td>
-  </tr>
-</table>
-<!-- ==================== FUNCTION DETAILS ==================== -->
-<a name="section-FunctionDetails"></a>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Function Details</span></td>
-</tr>
-</table>
-<a name="cssmin"></a>
-<div>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr><td>
-  <table width="100%" cellpadding="0" cellspacing="0" border="0">
-  <tr valign="top"><td>
-  <h3 class="epydoc"><span class="sig"><span class="sig-name">cssmin</span>(<span class="sig-arg">style</span>,
-        <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span>
-  </h3>
-  </td><td align="right" valign="top"
-    ><span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>&nbsp;
-    </td>
-  </tr></table>
-  
-  Minify CSS.
-  <dl class="fields">
-    <dt>Parameters:</dt>
-    <dd><ul class="nomargin-top">
-        <li><strong class="pname"><code>style</code></strong> (<tt class="rst-docutils literal">str</tt>) - CSS to minify</li>
-        <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li>
-    </ul></dd>
-    <dt>Returns: <tt class="rst-docutils literal">str</tt></dt>
-        <dd>Minified style</dd>
-  </dl>
-</td></tr></table>
-</div>
-<br />
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html
deleted file mode 100644
index e522dd1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/module-tree.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Module Hierarchy</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Trees&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">&nbsp;</td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<h1 class="epydoc">Module Hierarchy</h1>
-<ul class="nomargin-top">
-    <li> <strong class="uidlink"><a href="rcssmin-module.html">rcssmin</a></strong>: <em class="summary">CSS Minifier.</em>    </li>
-</ul>
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rcssmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Trees&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html
deleted file mode 100644
index 84ffddd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-module.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>rcssmin</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">
-      <span class="breadcrumbs">
-        Module&nbsp;rcssmin
-      </span>
-    </td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<!-- ==================== MODULE DESCRIPTION ==================== -->
-<h1 class="epydoc">Module rcssmin</h1><p class="nomargin-top"><span class="codelink"><a href="rcssmin-pysrc.html">source&nbsp;code</a></span></p>
-<p>CSS Minifier.</p>
-<p>The minifier is based on the semantics of the <a class="rst-reference external" href="https://github.com/yui/yuicompressor/" target="_top">YUI compressor</a>, which
-itself is based on <a class="rst-reference external" href="https://github.com/isaacs/cssmin/" target="_top">the rule list by Isaac Schlueter</a>.</p>
-<p>This module is a re-implementation aiming for speed instead of maximum
-compression, so it can be used at runtime (rather than during a preprocessing
-step). RCSSmin does syntactical compression only (removing spaces, comments
-and possibly semicolons). It does not provide semantic compression (like
-removing empty blocks, collapsing redundant properties etc). It does, however,
-support various CSS hacks (by keeping them working as intended).</p>
-<p>Here's a feature list:</p>
-<ul class="rst-simple">
-<li>Strings are kept, except that escaped newlines are stripped</li>
-<li>Space/Comments before the very end or before various characters are
-stripped: <tt class="rst-docutils literal"><span class="pre">:{});=&gt;+],!</span></tt> (The colon (<tt class="rst-docutils literal">:</tt>) is a special case, a single
-space is kept if it's outside a ruleset.)</li>
-<li>Space/Comments at the very beginning or after various characters are
-stripped: <tt class="rst-docutils literal"><span class="pre">{}(=:&gt;+[,!</span></tt></li>
-<li>Optional space after unicode escapes is kept, resp. replaced by a simple
-space</li>
-<li>whitespaces inside <tt class="rst-docutils literal">url()</tt> definitions are stripped</li>
-<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally.</li>
-<li>All other comments and/or whitespace characters are replaced by a single
-space.</li>
-<li>Multiple consecutive semicolons are reduced to one</li>
-<li>The last semicolon within a ruleset is stripped</li>
-<li>CSS Hacks supported:<ul>
-<li>IE7 hack (<tt class="rst-docutils literal"><span class="pre">&gt;/**/</span></tt>)</li>
-<li>Mac-IE5 hack (<tt class="rst-docutils literal"><span class="pre">/*\*/.../**/</span></tt>)</li>
-<li>The boxmodelhack is supported naturally because it relies on valid CSS2
-strings</li>
-<li>Between <tt class="rst-docutils literal"><span class="pre">:first-line</span></tt> and the following comma or curly brace a space is
-inserted. (apparently it's needed for IE6)</li>
-<li>Same for <tt class="rst-docutils literal"><span class="pre">:first-letter</span></tt></li>
-</ul>
-</li>
-</ul>
-<p>rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
-factor 100 or so (depending on the input). docs/BENCHMARKS in the source
-distribution contains the details.</p>
-<p>Both python 2 (&gt;= 2.4) and python 3 are supported.</p>
-
-<hr />
-<div class="fields">      <p><strong>Copyright:</strong>
-        Copyright 2011 - 2014
-Andr&#233; Malo or his licensors, as applicable
-      </p>
-      <p><strong>License:</strong>
-        <p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at</p>
-<blockquote>
-<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote>
-<p>Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.</p>
-      </p>
-      <p><strong>Version:</strong>
-        1.0.5
-      </p>
-      <p><strong>Author:</strong>
-        Andr&#233; Malo
-      </p>
-</div><!-- ==================== FUNCTIONS ==================== -->
-<a name="section-Functions"></a>
-<table class="summary" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Functions</span></td>
-</tr>
-<tr>
-    <td width="15%" align="right" valign="top" class="summary">
-      <span class="summary-type"><tt class="rst-docutils literal">str</tt></span>
-    </td><td class="summary">
-      <table width="100%" cellpadding="0" cellspacing="0" border="0">
-        <tr>
-          <td><span class="summary-sig"><a href="rcssmin-module.html#cssmin" class="summary-sig-name">cssmin</a>(<span class="summary-sig-arg">style</span>,
-        <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br />
-      Minify CSS.</td>
-          <td align="right" valign="top">
-            <span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>
-            
-          </td>
-        </tr>
-      </table>
-      
-    </td>
-  </tr>
-</table>
-<!-- ==================== FUNCTION DETAILS ==================== -->
-<a name="section-FunctionDetails"></a>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Function Details</span></td>
-</tr>
-</table>
-<a name="cssmin"></a>
-<div>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr><td>
-  <table width="100%" cellpadding="0" cellspacing="0" border="0">
-  <tr valign="top"><td>
-  <h3 class="epydoc"><span class="sig"><span class="sig-name">cssmin</span>(<span class="sig-arg">style</span>,
-        <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span>
-  </h3>
-  </td><td align="right" valign="top"
-    ><span class="codelink"><a href="rcssmin-pysrc.html#cssmin">source&nbsp;code</a></span>&nbsp;
-    </td>
-  </tr></table>
-  
-  Minify CSS.
-  <dl class="fields">
-    <dt>Parameters:</dt>
-    <dd><ul class="nomargin-top">
-        <li><strong class="pname"><code>style</code></strong> (<tt class="rst-docutils literal">str</tt>) - CSS to minify</li>
-        <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li>
-    </ul></dd>
-    <dt>Returns: <tt class="rst-docutils literal">str</tt></dt>
-        <dd>Minified style</dd>
-  </dl>
-</td></tr></table>
-</div>
-<br />
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html
deleted file mode 100644
index 6856bac..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/rcssmin-pysrc.html
+++ /dev/null
@@ -1,477 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>rcssmin</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">
-      <span class="breadcrumbs">
-        Module&nbsp;rcssmin
-      </span>
-    </td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<h1 class="epydoc">Source Code for <a href="rcssmin-module.html">Module rcssmin</a></h1>
-<pre class="py-src">
-<a name="L1"></a><tt class="py-lineno">  1</tt>  <tt class="py-line"><tt class="py-comment">#!/usr/bin/env python</tt> </tt>
-<a name="L2"></a><tt class="py-lineno">  2</tt>  <tt class="py-line"><tt class="py-comment"># -*- coding: ascii -*-</tt> </tt>
-<a name="L3"></a><tt class="py-lineno">  3</tt>  <tt class="py-line"><tt class="py-docstring">r"""</tt> </tt>
-<a name="L4"></a><tt class="py-lineno">  4</tt>  <tt class="py-line"><tt class="py-docstring">==============</tt> </tt>
-<a name="L5"></a><tt class="py-lineno">  5</tt>  <tt class="py-line"><tt class="py-docstring"> CSS Minifier</tt> </tt>
-<a name="L6"></a><tt class="py-lineno">  6</tt>  <tt class="py-line"><tt class="py-docstring">==============</tt> </tt>
-<a name="L7"></a><tt class="py-lineno">  7</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L8"></a><tt class="py-lineno">  8</tt>  <tt class="py-line"><tt class="py-docstring">CSS Minifier.</tt> </tt>
-<a name="L9"></a><tt class="py-lineno">  9</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L10"></a><tt class="py-lineno"> 10</tt>  <tt class="py-line"><tt class="py-docstring">The minifier is based on the semantics of the `YUI compressor`_\\, which</tt> </tt>
-<a name="L11"></a><tt class="py-lineno"> 11</tt>  <tt class="py-line"><tt class="py-docstring">itself is based on `the rule list by Isaac Schlueter`_\\.</tt> </tt>
-<a name="L12"></a><tt class="py-lineno"> 12</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L13"></a><tt class="py-lineno"> 13</tt>  <tt class="py-line"><tt class="py-docstring">:Copyright:</tt> </tt>
-<a name="L14"></a><tt class="py-lineno"> 14</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L15"></a><tt class="py-lineno"> 15</tt>  <tt class="py-line"><tt class="py-docstring"> Copyright 2011 - 2014</tt> </tt>
-<a name="L16"></a><tt class="py-lineno"> 16</tt>  <tt class="py-line"><tt class="py-docstring"> Andr\xe9 Malo or his licensors, as applicable</tt> </tt>
-<a name="L17"></a><tt class="py-lineno"> 17</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L18"></a><tt class="py-lineno"> 18</tt>  <tt class="py-line"><tt class="py-docstring">:License:</tt> </tt>
-<a name="L19"></a><tt class="py-lineno"> 19</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L20"></a><tt class="py-lineno"> 20</tt>  <tt class="py-line"><tt class="py-docstring"> Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt>
-<a name="L21"></a><tt class="py-lineno"> 21</tt>  <tt class="py-line"><tt class="py-docstring"> you may not use this file except in compliance with the License.</tt> </tt>
-<a name="L22"></a><tt class="py-lineno"> 22</tt>  <tt class="py-line"><tt class="py-docstring"> You may obtain a copy of the License at</tt> </tt>
-<a name="L23"></a><tt class="py-lineno"> 23</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L24"></a><tt class="py-lineno"> 24</tt>  <tt class="py-line"><tt class="py-docstring">     http://www.apache.org/licenses/LICENSE-2.0</tt> </tt>
-<a name="L25"></a><tt class="py-lineno"> 25</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L26"></a><tt class="py-lineno"> 26</tt>  <tt class="py-line"><tt class="py-docstring"> Unless required by applicable law or agreed to in writing, software</tt> </tt>
-<a name="L27"></a><tt class="py-lineno"> 27</tt>  <tt class="py-line"><tt class="py-docstring"> distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt>
-<a name="L28"></a><tt class="py-lineno"> 28</tt>  <tt class="py-line"><tt class="py-docstring"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt>
-<a name="L29"></a><tt class="py-lineno"> 29</tt>  <tt class="py-line"><tt class="py-docstring"> See the License for the specific language governing permissions and</tt> </tt>
-<a name="L30"></a><tt class="py-lineno"> 30</tt>  <tt class="py-line"><tt class="py-docstring"> limitations under the License.</tt> </tt>
-<a name="L31"></a><tt class="py-lineno"> 31</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L32"></a><tt class="py-lineno"> 32</tt>  <tt class="py-line"><tt class="py-docstring">This module is a re-implementation aiming for speed instead of maximum</tt> </tt>
-<a name="L33"></a><tt class="py-lineno"> 33</tt>  <tt class="py-line"><tt class="py-docstring">compression, so it can be used at runtime (rather than during a preprocessing</tt> </tt>
-<a name="L34"></a><tt class="py-lineno"> 34</tt>  <tt class="py-line"><tt class="py-docstring">step). RCSSmin does syntactical compression only (removing spaces, comments</tt> </tt>
-<a name="L35"></a><tt class="py-lineno"> 35</tt>  <tt class="py-line"><tt class="py-docstring">and possibly semicolons). It does not provide semantic compression (like</tt> </tt>
-<a name="L36"></a><tt class="py-lineno"> 36</tt>  <tt class="py-line"><tt class="py-docstring">removing empty blocks, collapsing redundant properties etc). It does, however,</tt> </tt>
-<a name="L37"></a><tt class="py-lineno"> 37</tt>  <tt class="py-line"><tt class="py-docstring">support various CSS hacks (by keeping them working as intended).</tt> </tt>
-<a name="L38"></a><tt class="py-lineno"> 38</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L39"></a><tt class="py-lineno"> 39</tt>  <tt class="py-line"><tt class="py-docstring">Here's a feature list:</tt> </tt>
-<a name="L40"></a><tt class="py-lineno"> 40</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L41"></a><tt class="py-lineno"> 41</tt>  <tt class="py-line"><tt class="py-docstring">- Strings are kept, except that escaped newlines are stripped</tt> </tt>
-<a name="L42"></a><tt class="py-lineno"> 42</tt>  <tt class="py-line"><tt class="py-docstring">- Space/Comments before the very end or before various characters are</tt> </tt>
-<a name="L43"></a><tt class="py-lineno"> 43</tt>  <tt class="py-line"><tt class="py-docstring">  stripped: ``:{});=&gt;+],!`` (The colon (``:``) is a special case, a single</tt> </tt>
-<a name="L44"></a><tt class="py-lineno"> 44</tt>  <tt class="py-line"><tt class="py-docstring">  space is kept if it's outside a ruleset.)</tt> </tt>
-<a name="L45"></a><tt class="py-lineno"> 45</tt>  <tt class="py-line"><tt class="py-docstring">- Space/Comments at the very beginning or after various characters are</tt> </tt>
-<a name="L46"></a><tt class="py-lineno"> 46</tt>  <tt class="py-line"><tt class="py-docstring">  stripped: ``{}(=:&gt;+[,!``</tt> </tt>
-<a name="L47"></a><tt class="py-lineno"> 47</tt>  <tt class="py-line"><tt class="py-docstring">- Optional space after unicode escapes is kept, resp. replaced by a simple</tt> </tt>
-<a name="L48"></a><tt class="py-lineno"> 48</tt>  <tt class="py-line"><tt class="py-docstring">  space</tt> </tt>
-<a name="L49"></a><tt class="py-lineno"> 49</tt>  <tt class="py-line"><tt class="py-docstring">- whitespaces inside ``url()`` definitions are stripped</tt> </tt>
-<a name="L50"></a><tt class="py-lineno"> 50</tt>  <tt class="py-line"><tt class="py-docstring">- Comments starting with an exclamation mark (``!``) can be kept optionally.</tt> </tt>
-<a name="L51"></a><tt class="py-lineno"> 51</tt>  <tt class="py-line"><tt class="py-docstring">- All other comments and/or whitespace characters are replaced by a single</tt> </tt>
-<a name="L52"></a><tt class="py-lineno"> 52</tt>  <tt class="py-line"><tt class="py-docstring">  space.</tt> </tt>
-<a name="L53"></a><tt class="py-lineno"> 53</tt>  <tt class="py-line"><tt class="py-docstring">- Multiple consecutive semicolons are reduced to one</tt> </tt>
-<a name="L54"></a><tt class="py-lineno"> 54</tt>  <tt class="py-line"><tt class="py-docstring">- The last semicolon within a ruleset is stripped</tt> </tt>
-<a name="L55"></a><tt class="py-lineno"> 55</tt>  <tt class="py-line"><tt class="py-docstring">- CSS Hacks supported:</tt> </tt>
-<a name="L56"></a><tt class="py-lineno"> 56</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L57"></a><tt class="py-lineno"> 57</tt>  <tt class="py-line"><tt class="py-docstring">  - IE7 hack (``&gt;/**/``)</tt> </tt>
-<a name="L58"></a><tt class="py-lineno"> 58</tt>  <tt class="py-line"><tt class="py-docstring">  - Mac-IE5 hack (``/*\\*/.../**/``)</tt> </tt>
-<a name="L59"></a><tt class="py-lineno"> 59</tt>  <tt class="py-line"><tt class="py-docstring">  - The boxmodelhack is supported naturally because it relies on valid CSS2</tt> </tt>
-<a name="L60"></a><tt class="py-lineno"> 60</tt>  <tt class="py-line"><tt class="py-docstring">    strings</tt> </tt>
-<a name="L61"></a><tt class="py-lineno"> 61</tt>  <tt class="py-line"><tt class="py-docstring">  - Between ``:first-line`` and the following comma or curly brace a space is</tt> </tt>
-<a name="L62"></a><tt class="py-lineno"> 62</tt>  <tt class="py-line"><tt class="py-docstring">    inserted. (apparently it's needed for IE6)</tt> </tt>
-<a name="L63"></a><tt class="py-lineno"> 63</tt>  <tt class="py-line"><tt class="py-docstring">  - Same for ``:first-letter``</tt> </tt>
-<a name="L64"></a><tt class="py-lineno"> 64</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L65"></a><tt class="py-lineno"> 65</tt>  <tt class="py-line"><tt class="py-docstring">rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to</tt> </tt>
-<a name="L66"></a><tt class="py-lineno"> 66</tt>  <tt class="py-line"><tt class="py-docstring">factor 100 or so (depending on the input). docs/BENCHMARKS in the source</tt> </tt>
-<a name="L67"></a><tt class="py-lineno"> 67</tt>  <tt class="py-line"><tt class="py-docstring">distribution contains the details.</tt> </tt>
-<a name="L68"></a><tt class="py-lineno"> 68</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L69"></a><tt class="py-lineno"> 69</tt>  <tt class="py-line"><tt class="py-docstring">Both python 2 (&gt;= 2.4) and python 3 are supported.</tt> </tt>
-<a name="L70"></a><tt class="py-lineno"> 70</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L71"></a><tt class="py-lineno"> 71</tt>  <tt class="py-line"><tt class="py-docstring">.. _YUI compressor: https://github.com/yui/yuicompressor/</tt> </tt>
-<a name="L72"></a><tt class="py-lineno"> 72</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L73"></a><tt class="py-lineno"> 73</tt>  <tt class="py-line"><tt class="py-docstring">.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/</tt> </tt>
-<a name="L74"></a><tt class="py-lineno"> 74</tt>  <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
-<a name="L75"></a><tt class="py-lineno"> 75</tt>  <tt class="py-line"><tt class="py-keyword">if</tt> <tt id="link-0" class="py-name" targets="Variable rcssmin.__doc__=rcssmin-module.html#__doc__"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-0', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">:</tt> </tt>
-<a name="L76"></a><tt class="py-lineno"> 76</tt>  <tt class="py-line">    <tt class="py-comment"># pylint: disable = W0622</tt> </tt>
-<a name="L77"></a><tt class="py-lineno"> 77</tt>  <tt class="py-line">    <tt id="link-1" class="py-name"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-1', '__doc__', 'link-0');">__doc__</a></tt> <tt class="py-op">=</tt> <tt id="link-2" class="py-name"><a title="rcssmin.__doc__" class="py-name" href="#" onclick="return doclink('link-2', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt>
-<a name="L78"></a><tt class="py-lineno"> 78</tt>  <tt class="py-line"><tt class="py-name">__author__</tt> <tt class="py-op">=</tt> <tt class="py-string">r"Andr\xe9 Malo"</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt>
-<a name="L79"></a><tt class="py-lineno"> 79</tt>  <tt class="py-line"><tt class="py-name">__docformat__</tt> <tt class="py-op">=</tt> <tt class="py-string">"restructuredtext en"</tt> </tt>
-<a name="L80"></a><tt class="py-lineno"> 80</tt>  <tt class="py-line"><tt id="link-3" class="py-name" targets="Variable rcssmin.__license__=rcssmin-module.html#__license__"><a title="rcssmin.__license__" class="py-name" href="#" onclick="return doclink('link-3', '__license__', 'link-3');">__license__</a></tt> <tt class="py-op">=</tt> <tt class="py-string">"Apache License, Version 2.0"</tt> </tt>
-<a name="L81"></a><tt class="py-lineno"> 81</tt>  <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'1.0.5'</tt> </tt>
-<a name="L82"></a><tt class="py-lineno"> 82</tt>  <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-string">'cssmin'</tt><tt class="py-op">]</tt> </tt>
-<a name="L83"></a><tt class="py-lineno"> 83</tt>  <tt class="py-line"> </tt>
-<a name="L84"></a><tt class="py-lineno"> 84</tt>  <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_re</tt> </tt>
-<a name="L85"></a><tt class="py-lineno"> 85</tt>  <tt class="py-line"> </tt>
-<a name="L86"></a><tt class="py-lineno"> 86</tt>  <tt class="py-line"> </tt>
-<a name="_make_cssmin"></a><div id="_make_cssmin-def"><a name="L87"></a><tt class="py-lineno"> 87</tt> <a class="py-toggle" href="#" id="_make_cssmin-toggle" onclick="return toggle('_make_cssmin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="rcssmin-module.html#_make_cssmin">_make_cssmin</a><tt class="py-op">(</tt><tt class="py-param">python_only</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-</div><div id="_make_cssmin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="_make_cssmin-expanded"><a name="L88"></a><tt class="py-lineno"> 88</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
-<a name="L89"></a><tt class="py-lineno"> 89</tt>  <tt class="py-line"><tt class="py-docstring">    Generate CSS minifier.</tt> </tt>
-<a name="L90"></a><tt class="py-lineno"> 90</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L91"></a><tt class="py-lineno"> 91</tt>  <tt class="py-line"><tt class="py-docstring">    :Parameters:</tt> </tt>
-<a name="L92"></a><tt class="py-lineno"> 92</tt>  <tt class="py-line"><tt class="py-docstring">      `python_only` : ``bool``</tt> </tt>
-<a name="L93"></a><tt class="py-lineno"> 93</tt>  <tt class="py-line"><tt class="py-docstring">        Use only the python variant. If true, the c extension is not even</tt> </tt>
-<a name="L94"></a><tt class="py-lineno"> 94</tt>  <tt class="py-line"><tt class="py-docstring">        tried to be loaded.</tt> </tt>
-<a name="L95"></a><tt class="py-lineno"> 95</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L96"></a><tt class="py-lineno"> 96</tt>  <tt class="py-line"><tt class="py-docstring">    :Return: Minifier</tt> </tt>
-<a name="L97"></a><tt class="py-lineno"> 97</tt>  <tt class="py-line"><tt class="py-docstring">    :Rtype: ``callable``</tt> </tt>
-<a name="L98"></a><tt class="py-lineno"> 98</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
-<a name="L99"></a><tt class="py-lineno"> 99</tt>  <tt class="py-line">    <tt class="py-comment"># pylint: disable = R0912, R0914, W0612</tt> </tt>
-<a name="L100"></a><tt class="py-lineno">100</tt>  <tt class="py-line"> </tt>
-<a name="L101"></a><tt class="py-lineno">101</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">python_only</tt><tt class="py-op">:</tt> </tt>
-<a name="L102"></a><tt class="py-lineno">102</tt>  <tt class="py-line">        <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
-<a name="L103"></a><tt class="py-lineno">103</tt>  <tt class="py-line">            <tt class="py-keyword">import</tt> <tt class="py-name">_rcssmin</tt> </tt>
-<a name="L104"></a><tt class="py-lineno">104</tt>  <tt class="py-line">        <tt class="py-keyword">except</tt> <tt class="py-name">ImportError</tt><tt class="py-op">:</tt> </tt>
-<a name="L105"></a><tt class="py-lineno">105</tt>  <tt class="py-line">            <tt class="py-keyword">pass</tt> </tt>
-<a name="L106"></a><tt class="py-lineno">106</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L107"></a><tt class="py-lineno">107</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">_rcssmin</tt><tt class="py-op">.</tt><tt id="link-4" class="py-name" targets="Function rcssmin.cssmin()=rcssmin-module.html#cssmin"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-4', 'cssmin', 'link-4');">cssmin</a></tt> </tt>
-<a name="L108"></a><tt class="py-lineno">108</tt>  <tt class="py-line"> </tt>
-<a name="L109"></a><tt class="py-lineno">109</tt>  <tt class="py-line">    <tt class="py-name">nl</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:[\n\f]|\r\n?)'</tt>  <tt class="py-comment"># pylint: disable = C0103</tt> </tt>
-<a name="L110"></a><tt class="py-lineno">110</tt>  <tt class="py-line">    <tt class="py-name">spacechar</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[\r\n\f\040\t]'</tt> </tt>
-<a name="L111"></a><tt class="py-lineno">111</tt>  <tt class="py-line"> </tt>
-<a name="L112"></a><tt class="py-lineno">112</tt>  <tt class="py-line">    <tt class="py-name">unicoded</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?'</tt> </tt>
-<a name="L113"></a><tt class="py-lineno">113</tt>  <tt class="py-line">    <tt class="py-name">escaped</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\n\r\f0-9a-fA-F]'</tt> </tt>
-<a name="L114"></a><tt class="py-lineno">114</tt>  <tt class="py-line">    <tt class="py-name">escape</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\\(?:%(unicoded)s|%(escaped)s))'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L115"></a><tt class="py-lineno">115</tt>  <tt class="py-line"> </tt>
-<a name="L116"></a><tt class="py-lineno">116</tt>  <tt class="py-line">    <tt class="py-name">nmchar</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]'</tt> </tt>
-<a name="L117"></a><tt class="py-lineno">117</tt>  <tt class="py-line">    <tt class="py-comment">#nmstart = r'[^\000-\100\133-\136\140\173-\177]'</tt> </tt>
-<a name="L118"></a><tt class="py-lineno">118</tt>  <tt class="py-line">    <tt class="py-comment">#ident = (r'(?:'</tt> </tt>
-<a name="L119"></a><tt class="py-lineno">119</tt>  <tt class="py-line">    <tt class="py-comment">#    r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*'</tt> </tt>
-<a name="L120"></a><tt class="py-lineno">120</tt>  <tt class="py-line">    <tt class="py-comment">#r')') % locals()</tt> </tt>
-<a name="L121"></a><tt class="py-lineno">121</tt>  <tt class="py-line"> </tt>
-<a name="L122"></a><tt class="py-lineno">122</tt>  <tt class="py-line">    <tt class="py-name">comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
-<a name="L123"></a><tt class="py-lineno">123</tt>  <tt class="py-line"> </tt>
-<a name="L124"></a><tt class="py-lineno">124</tt>  <tt class="py-line">    <tt class="py-comment"># only for specific purposes. The bang is grouped:</tt> </tt>
-<a name="L125"></a><tt class="py-lineno">125</tt>  <tt class="py-line">    <tt class="py-name">_bang_comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
-<a name="L126"></a><tt class="py-lineno">126</tt>  <tt class="py-line"> </tt>
-<a name="L127"></a><tt class="py-lineno">127</tt>  <tt class="py-line">    <tt class="py-name">string1</tt> <tt class="py-op">=</tt> \ </tt>
-<a name="L128"></a><tt class="py-lineno">128</tt>  <tt class="py-line">        <tt class="py-string">r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)'</tt> </tt>
-<a name="L129"></a><tt class="py-lineno">129</tt>  <tt class="py-line">    <tt class="py-name">string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")'</tt> </tt>
-<a name="L130"></a><tt class="py-lineno">130</tt>  <tt class="py-line">    <tt class="py-name">strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">string1</tt><tt class="py-op">,</tt> <tt class="py-name">string2</tt><tt class="py-op">)</tt> </tt>
-<a name="L131"></a><tt class="py-lineno">131</tt>  <tt class="py-line"> </tt>
-<a name="L132"></a><tt class="py-lineno">132</tt>  <tt class="py-line">    <tt class="py-name">nl_string1</tt> <tt class="py-op">=</tt> \ </tt>
-<a name="L133"></a><tt class="py-lineno">133</tt>  <tt class="py-line">        <tt class="py-string">r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)'</tt> </tt>
-<a name="L134"></a><tt class="py-lineno">134</tt>  <tt class="py-line">    <tt class="py-name">nl_string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")'</tt> </tt>
-<a name="L135"></a><tt class="py-lineno">135</tt>  <tt class="py-line">    <tt class="py-name">nl_strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">nl_string1</tt><tt class="py-op">,</tt> <tt class="py-name">nl_string2</tt><tt class="py-op">)</tt> </tt>
-<a name="L136"></a><tt class="py-lineno">136</tt>  <tt class="py-line"> </tt>
-<a name="L137"></a><tt class="py-lineno">137</tt>  <tt class="py-line">    <tt class="py-name">uri_nl_string1</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)'</tt> </tt>
-<a name="L138"></a><tt class="py-lineno">138</tt>  <tt class="py-line">    <tt class="py-name">uri_nl_string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")'</tt> </tt>
-<a name="L139"></a><tt class="py-lineno">139</tt>  <tt class="py-line">    <tt class="py-name">uri_nl_strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">uri_nl_string1</tt><tt class="py-op">,</tt> <tt class="py-name">uri_nl_string2</tt><tt class="py-op">)</tt> </tt>
-<a name="L140"></a><tt class="py-lineno">140</tt>  <tt class="py-line"> </tt>
-<a name="L141"></a><tt class="py-lineno">141</tt>  <tt class="py-line">    <tt class="py-name">nl_escaped</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\\%(nl)s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L142"></a><tt class="py-lineno">142</tt>  <tt class="py-line"> </tt>
-<a name="L143"></a><tt class="py-lineno">143</tt>  <tt class="py-line">    <tt class="py-name">space</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%(spacechar)s|%(comment)s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L144"></a><tt class="py-lineno">144</tt>  <tt class="py-line"> </tt>
-<a name="L145"></a><tt class="py-lineno">145</tt>  <tt class="py-line">    <tt class="py-name">ie7hack</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:&gt;/\*\*/)'</tt> </tt>
-<a name="L146"></a><tt class="py-lineno">146</tt>  <tt class="py-line"> </tt>
-<a name="L147"></a><tt class="py-lineno">147</tt>  <tt class="py-line">    <tt class="py-name">uri</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt><tt class="py-string">r'(?:'</tt> </tt>
-<a name="L148"></a><tt class="py-lineno">148</tt>  <tt class="py-line">        <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt>
-<a name="L149"></a><tt class="py-lineno">149</tt>  <tt class="py-line">        <tt class="py-string">r'(?:[^\000-\040"\047()\\\177]*'</tt> </tt>
-<a name="L150"></a><tt class="py-lineno">150</tt>  <tt class="py-line">            <tt class="py-string">r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)'</tt> </tt>
-<a name="L151"></a><tt class="py-lineno">151</tt>  <tt class="py-line">        <tt class="py-string">r'(?:'</tt> </tt>
-<a name="L152"></a><tt class="py-lineno">152</tt>  <tt class="py-line">            <tt class="py-string">r'(?:%(spacechar)s+|%(nl_escaped)s+)'</tt> </tt>
-<a name="L153"></a><tt class="py-lineno">153</tt>  <tt class="py-line">            <tt class="py-string">r'(?:'</tt> </tt>
-<a name="L154"></a><tt class="py-lineno">154</tt>  <tt class="py-line">                <tt class="py-string">r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)'</tt> </tt>
-<a name="L155"></a><tt class="py-lineno">155</tt>  <tt class="py-line">                <tt class="py-string">r'[^\000-\040"\047()\\\177]*'</tt> </tt>
-<a name="L156"></a><tt class="py-lineno">156</tt>  <tt class="py-line">                <tt class="py-string">r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*'</tt> </tt>
-<a name="L157"></a><tt class="py-lineno">157</tt>  <tt class="py-line">            <tt class="py-string">r')+'</tt> </tt>
-<a name="L158"></a><tt class="py-lineno">158</tt>  <tt class="py-line">        <tt class="py-string">r')*'</tt> </tt>
-<a name="L159"></a><tt class="py-lineno">159</tt>  <tt class="py-line">    <tt class="py-string">r')'</tt><tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L160"></a><tt class="py-lineno">160</tt>  <tt class="py-line"> </tt>
-<a name="L161"></a><tt class="py-lineno">161</tt>  <tt class="py-line">    <tt class="py-name">nl_unesc_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">nl_escaped</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L162"></a><tt class="py-lineno">162</tt>  <tt class="py-line"> </tt>
-<a name="L163"></a><tt class="py-lineno">163</tt>  <tt class="py-line">    <tt class="py-name">uri_space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L164"></a><tt class="py-lineno">164</tt>  <tt class="py-line">        <tt class="py-string">r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+'</tt> </tt>
-<a name="L165"></a><tt class="py-lineno">165</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L166"></a><tt class="py-lineno">166</tt>  <tt class="py-line">    <tt class="py-name">uri_space_subber</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt> </tt>
-<a name="L167"></a><tt class="py-lineno">167</tt>  <tt class="py-line"> </tt>
-<a name="L168"></a><tt class="py-lineno">168</tt>  <tt class="py-line">    <tt class="py-name">space_sub_simple</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L169"></a><tt class="py-lineno">169</tt>  <tt class="py-line">        <tt class="py-string">r'[\r\n\f\040\t;]+|(%(comment)s+)'</tt> </tt>
-<a name="L170"></a><tt class="py-lineno">170</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L171"></a><tt class="py-lineno">171</tt>  <tt class="py-line">    <tt class="py-name">space_sub_banged</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L172"></a><tt class="py-lineno">172</tt>  <tt class="py-line">        <tt class="py-string">r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)'</tt> </tt>
-<a name="L173"></a><tt class="py-lineno">173</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L174"></a><tt class="py-lineno">174</tt>  <tt class="py-line"> </tt>
-<a name="L175"></a><tt class="py-lineno">175</tt>  <tt class="py-line">    <tt class="py-name">post_esc_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-string">r'[\r\n\f\t]+'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L176"></a><tt class="py-lineno">176</tt>  <tt class="py-line"> </tt>
-<a name="L177"></a><tt class="py-lineno">177</tt>  <tt class="py-line">    <tt class="py-name">main_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L178"></a><tt class="py-lineno">178</tt>  <tt class="py-line">        <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt>
-<a name="L179"></a><tt class="py-lineno">179</tt>  <tt class="py-line">        <tt class="py-string">r'([^\\"\047u&gt;@\r\n\f\040\t/;:{}]+)'</tt> </tt>
-<a name="L180"></a><tt class="py-lineno">180</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=[{}(=:&gt;+[,!])(%(space)s+)'</tt> </tt>
-<a name="L181"></a><tt class="py-lineno">181</tt>  <tt class="py-line">        <tt class="py-string">r'|^(%(space)s+)'</tt> </tt>
-<a name="L182"></a><tt class="py-lineno">182</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(space)s+)(?=(([:{});=&gt;+\],!])|$)?)'</tt> </tt>
-<a name="L183"></a><tt class="py-lineno">183</tt>  <tt class="py-line">        <tt class="py-string">r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)'</tt> </tt>
-<a name="L184"></a><tt class="py-lineno">184</tt>  <tt class="py-line">        <tt class="py-string">r'|(\{)'</tt> </tt>
-<a name="L185"></a><tt class="py-lineno">185</tt>  <tt class="py-line">        <tt class="py-string">r'|(\})'</tt> </tt>
-<a name="L186"></a><tt class="py-lineno">186</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(strings)s)'</tt> </tt>
-<a name="L187"></a><tt class="py-lineno">187</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;!%(nmchar)s)url\(%(spacechar)s*('</tt> </tt>
-<a name="L188"></a><tt class="py-lineno">188</tt>  <tt class="py-line">                <tt class="py-string">r'%(uri_nl_strings)s'</tt> </tt>
-<a name="L189"></a><tt class="py-lineno">189</tt>  <tt class="py-line">                <tt class="py-string">r'|%(uri)s'</tt> </tt>
-<a name="L190"></a><tt class="py-lineno">190</tt>  <tt class="py-line">            <tt class="py-string">r')%(spacechar)s*\)'</tt> </tt>
-<a name="L191"></a><tt class="py-lineno">191</tt>  <tt class="py-line">        <tt class="py-string">r'|(@(?:'</tt> </tt>
-<a name="L192"></a><tt class="py-lineno">192</tt>  <tt class="py-line">              <tt class="py-string">r'[mM][eE][dD][iI][aA]'</tt> </tt>
-<a name="L193"></a><tt class="py-lineno">193</tt>  <tt class="py-line">              <tt class="py-string">r'|[sS][uU][pP][pP][oO][rR][tT][sS]'</tt> </tt>
-<a name="L194"></a><tt class="py-lineno">194</tt>  <tt class="py-line">              <tt class="py-string">r'|[dD][oO][cC][uU][mM][eE][nN][tT]'</tt> </tt>
-<a name="L195"></a><tt class="py-lineno">195</tt>  <tt class="py-line">              <tt class="py-string">r'|(?:-(?:'</tt> </tt>
-<a name="L196"></a><tt class="py-lineno">196</tt>  <tt class="py-line">                  <tt class="py-string">r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]'</tt> </tt>
-<a name="L197"></a><tt class="py-lineno">197</tt>  <tt class="py-line">                <tt class="py-string">r')-)?'</tt> </tt>
-<a name="L198"></a><tt class="py-lineno">198</tt>  <tt class="py-line">                <tt class="py-string">r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]'</tt> </tt>
-<a name="L199"></a><tt class="py-lineno">199</tt>  <tt class="py-line">            <tt class="py-string">r'))(?!%(nmchar)s)'</tt> </tt>
-<a name="L200"></a><tt class="py-lineno">200</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(ie7hack)s)(%(space)s*)'</tt> </tt>
-<a name="L201"></a><tt class="py-lineno">201</tt>  <tt class="py-line">        <tt class="py-string">r'|(:[fF][iI][rR][sS][tT]-[lL]'</tt> </tt>
-<a name="L202"></a><tt class="py-lineno">202</tt>  <tt class="py-line">            <tt class="py-string">r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))'</tt> </tt>
-<a name="L203"></a><tt class="py-lineno">203</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*)(?=[{,])'</tt> </tt>
-<a name="L204"></a><tt class="py-lineno">204</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(nl_strings)s)'</tt> </tt>
-<a name="L205"></a><tt class="py-lineno">205</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(escape)s[^\\"\047u&gt;@\r\n\f\040\t/;:{}]*)'</tt> </tt>
-<a name="L206"></a><tt class="py-lineno">206</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L207"></a><tt class="py-lineno">207</tt>  <tt class="py-line"> </tt>
-<a name="L208"></a><tt class="py-lineno">208</tt>  <tt class="py-line">    <tt class="py-comment">#print main_sub.__self__.pattern</tt> </tt>
-<a name="L209"></a><tt class="py-lineno">209</tt>  <tt class="py-line"> </tt>
-<a name="L210"></a><tt class="py-lineno">210</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">main_subber</tt><tt class="py-op">(</tt><tt class="py-param">keep_bang_comments</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L211"></a><tt class="py-lineno">211</tt>  <tt class="py-line">        <tt class="py-docstring">""" Make main subber """</tt> </tt>
-<a name="L212"></a><tt class="py-lineno">212</tt>  <tt class="py-line">        <tt class="py-name">in_macie5</tt><tt class="py-op">,</tt> <tt class="py-name">in_rule</tt><tt class="py-op">,</tt> <tt class="py-name">at_group</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
-<a name="L213"></a><tt class="py-lineno">213</tt>  <tt class="py-line"> </tt>
-<a name="L214"></a><tt class="py-lineno">214</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">:</tt> </tt>
-<a name="L215"></a><tt class="py-lineno">215</tt>  <tt class="py-line">            <tt class="py-name">space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">space_sub_banged</tt> </tt>
-<a name="L216"></a><tt class="py-lineno">216</tt>  <tt class="py-line"> </tt>
-<a name="L217"></a><tt class="py-lineno">217</tt>  <tt class="py-line">            <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L218"></a><tt class="py-lineno">218</tt>  <tt class="py-line">                <tt class="py-docstring">""" Space|Comment subber """</tt> </tt>
-<a name="L219"></a><tt class="py-lineno">219</tt>  <tt class="py-line">                <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">:</tt> </tt>
-<a name="L220"></a><tt class="py-lineno">220</tt>  <tt class="py-line">                    <tt class="py-name">group1</tt><tt class="py-op">,</tt> <tt class="py-name">group2</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">,</tt> <tt class="py-number">2</tt><tt class="py-op">)</tt> </tt>
-<a name="L221"></a><tt class="py-lineno">221</tt>  <tt class="py-line">                    <tt class="py-keyword">if</tt> <tt class="py-name">group2</tt><tt class="py-op">:</tt> </tt>
-<a name="L222"></a><tt class="py-lineno">222</tt>  <tt class="py-line">                        <tt class="py-keyword">if</tt> <tt class="py-name">group1</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L223"></a><tt class="py-lineno">223</tt>  <tt class="py-line">                            <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
-<a name="L224"></a><tt class="py-lineno">224</tt>  <tt class="py-line">                        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L225"></a><tt class="py-lineno">225</tt>  <tt class="py-line">                            <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
-<a name="L226"></a><tt class="py-lineno">226</tt>  <tt class="py-line">                        <tt class="py-keyword">return</tt> <tt class="py-name">group1</tt> </tt>
-<a name="L227"></a><tt class="py-lineno">227</tt>  <tt class="py-line">                    <tt class="py-keyword">elif</tt> <tt class="py-name">group1</tt><tt class="py-op">:</tt> </tt>
-<a name="L228"></a><tt class="py-lineno">228</tt>  <tt class="py-line">                        <tt class="py-keyword">if</tt> <tt class="py-name">group1</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L229"></a><tt class="py-lineno">229</tt>  <tt class="py-line">                            <tt class="py-keyword">if</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L230"></a><tt class="py-lineno">230</tt>  <tt class="py-line">                                <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
-<a name="L231"></a><tt class="py-lineno">231</tt>  <tt class="py-line">                            <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
-<a name="L232"></a><tt class="py-lineno">232</tt>  <tt class="py-line">                            <tt class="py-keyword">return</tt> <tt class="py-string">r'/*\*/'</tt> </tt>
-<a name="L233"></a><tt class="py-lineno">233</tt>  <tt class="py-line">                        <tt class="py-keyword">elif</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L234"></a><tt class="py-lineno">234</tt>  <tt class="py-line">                            <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
-<a name="L235"></a><tt class="py-lineno">235</tt>  <tt class="py-line">                            <tt class="py-keyword">return</tt> <tt class="py-string">'/**/'</tt> </tt>
-<a name="L236"></a><tt class="py-lineno">236</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
-</div><a name="L237"></a><tt class="py-lineno">237</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L238"></a><tt class="py-lineno">238</tt>  <tt class="py-line">            <tt class="py-name">space_sub</tt> <tt class="py-op">=</tt> <tt class="py-name">space_sub_simple</tt> </tt>
-<a name="L239"></a><tt class="py-lineno">239</tt>  <tt class="py-line"> </tt>
-<a name="L240"></a><tt class="py-lineno">240</tt>  <tt class="py-line">            <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L241"></a><tt class="py-lineno">241</tt>  <tt class="py-line">                <tt class="py-docstring">""" Space|Comment subber """</tt> </tt>
-<a name="L242"></a><tt class="py-lineno">242</tt>  <tt class="py-line">                <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">:</tt> </tt>
-<a name="L243"></a><tt class="py-lineno">243</tt>  <tt class="py-line">                    <tt class="py-keyword">if</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">endswith</tt><tt class="py-op">(</tt><tt class="py-string">r'\*/'</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L244"></a><tt class="py-lineno">244</tt>  <tt class="py-line">                        <tt class="py-keyword">if</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L245"></a><tt class="py-lineno">245</tt>  <tt class="py-line">                            <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
-<a name="L246"></a><tt class="py-lineno">246</tt>  <tt class="py-line">                        <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
-<a name="L247"></a><tt class="py-lineno">247</tt>  <tt class="py-line">                        <tt class="py-keyword">return</tt> <tt class="py-string">r'/*\*/'</tt> </tt>
-<a name="L248"></a><tt class="py-lineno">248</tt>  <tt class="py-line">                    <tt class="py-keyword">elif</tt> <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L249"></a><tt class="py-lineno">249</tt>  <tt class="py-line">                        <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
-<a name="L250"></a><tt class="py-lineno">250</tt>  <tt class="py-line">                        <tt class="py-keyword">return</tt> <tt class="py-string">'/**/'</tt> </tt>
-<a name="L251"></a><tt class="py-lineno">251</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
-</div><a name="L252"></a><tt class="py-lineno">252</tt>  <tt class="py-line"> </tt>
-<a name="L253"></a><tt class="py-lineno">253</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_space_post</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L254"></a><tt class="py-lineno">254</tt>  <tt class="py-line">            <tt class="py-docstring">""" space with token after """</tt> </tt>
-<a name="L255"></a><tt class="py-lineno">255</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">5</tt><tt class="py-op">)</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt> <tt class="py-keyword">or</tt> <tt class="py-op">(</tt> </tt>
-<a name="L256"></a><tt class="py-lineno">256</tt>  <tt class="py-line">                    <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">6</tt><tt class="py-op">)</tt> <tt class="py-op">==</tt> <tt class="py-string">':'</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L257"></a><tt class="py-lineno">257</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L258"></a><tt class="py-lineno">258</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">4</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L259"></a><tt class="py-lineno">259</tt>  <tt class="py-line"> </tt>
-<a name="L260"></a><tt class="py-lineno">260</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_semicolon</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L261"></a><tt class="py-lineno">261</tt>  <tt class="py-line">            <tt class="py-docstring">""" ; handler """</tt> </tt>
-<a name="L262"></a><tt class="py-lineno">262</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">';'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L263"></a><tt class="py-lineno">263</tt>  <tt class="py-line"> </tt>
-<a name="L264"></a><tt class="py-lineno">264</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_semicolon2</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L265"></a><tt class="py-lineno">265</tt>  <tt class="py-line">            <tt class="py-docstring">""" ; handler """</tt> </tt>
-<a name="L266"></a><tt class="py-lineno">266</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L267"></a><tt class="py-lineno">267</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L268"></a><tt class="py-lineno">268</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">';'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">7</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L269"></a><tt class="py-lineno">269</tt>  <tt class="py-line"> </tt>
-<a name="L270"></a><tt class="py-lineno">270</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_open</tt><tt class="py-op">(</tt><tt class="py-param">_</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L271"></a><tt class="py-lineno">271</tt>  <tt class="py-line">            <tt class="py-docstring">""" { handler """</tt> </tt>
-<a name="L272"></a><tt class="py-lineno">272</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L273"></a><tt class="py-lineno">273</tt>  <tt class="py-line">                <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">-=</tt> <tt class="py-number">1</tt> </tt>
-<a name="L274"></a><tt class="py-lineno">274</tt>  <tt class="py-line">            <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L275"></a><tt class="py-lineno">275</tt>  <tt class="py-line">                <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">1</tt> </tt>
-<a name="L276"></a><tt class="py-lineno">276</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">'{'</tt> </tt>
-</div><a name="L277"></a><tt class="py-lineno">277</tt>  <tt class="py-line"> </tt>
-<a name="L278"></a><tt class="py-lineno">278</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_close</tt><tt class="py-op">(</tt><tt class="py-param">_</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L279"></a><tt class="py-lineno">279</tt>  <tt class="py-line">            <tt class="py-docstring">""" } handler """</tt> </tt>
-<a name="L280"></a><tt class="py-lineno">280</tt>  <tt class="py-line">            <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
-<a name="L281"></a><tt class="py-lineno">281</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">'}'</tt> </tt>
-</div><a name="L282"></a><tt class="py-lineno">282</tt>  <tt class="py-line"> </tt>
-<a name="L283"></a><tt class="py-lineno">283</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_at_group</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L284"></a><tt class="py-lineno">284</tt>  <tt class="py-line">            <tt class="py-docstring">""" @xxx group handler """</tt> </tt>
-<a name="L285"></a><tt class="py-lineno">285</tt>  <tt class="py-line">            <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">+=</tt> <tt class="py-number">1</tt> </tt>
-<a name="L286"></a><tt class="py-lineno">286</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">13</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L287"></a><tt class="py-lineno">287</tt>  <tt class="py-line"> </tt>
-<a name="L288"></a><tt class="py-lineno">288</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">fn_ie7hack</tt><tt class="py-op">(</tt><tt class="py-param">group</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L289"></a><tt class="py-lineno">289</tt>  <tt class="py-line">            <tt class="py-docstring">""" IE7 Hack handler """</tt> </tt>
-<a name="L290"></a><tt class="py-lineno">290</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">in_rule</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-keyword">not</tt> <tt class="py-name">at_group</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L291"></a><tt class="py-lineno">291</tt>  <tt class="py-line">                <tt class="py-name">in_macie5</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-op">=</tt> <tt class="py-number">0</tt> </tt>
-<a name="L292"></a><tt class="py-lineno">292</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">14</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">15</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L293"></a><tt class="py-lineno">293</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">'&gt;'</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">15</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L294"></a><tt class="py-lineno">294</tt>  <tt class="py-line"> </tt>
-<a name="L295"></a><tt class="py-lineno">295</tt>  <tt class="py-line">        <tt class="py-name">table</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt>
-<a name="L296"></a><tt class="py-lineno">296</tt>  <tt class="py-line">            <tt class="py-comment"># noqa pylint: disable = C0330</tt> </tt>
-<a name="L297"></a><tt class="py-lineno">297</tt>  <tt class="py-line">            <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
-<a name="L298"></a><tt class="py-lineno">298</tt>  <tt class="py-line">            <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
-<a name="L299"></a><tt class="py-lineno">299</tt>  <tt class="py-line">            <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
-<a name="L300"></a><tt class="py-lineno">300</tt>  <tt class="py-line">            <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
-<a name="L301"></a><tt class="py-lineno">301</tt>  <tt class="py-line">            <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt>                       <tt class="py-comment"># space with token after</tt> </tt>
-<a name="L302"></a><tt class="py-lineno">302</tt>  <tt class="py-line">            <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt>                       <tt class="py-comment"># space with token after</tt> </tt>
-<a name="L303"></a><tt class="py-lineno">303</tt>  <tt class="py-line">            <tt class="py-name">fn_space_post</tt><tt class="py-op">,</tt>                       <tt class="py-comment"># space with token after</tt> </tt>
-<a name="L304"></a><tt class="py-lineno">304</tt>  <tt class="py-line">            <tt class="py-name">fn_semicolon</tt><tt class="py-op">,</tt>                        <tt class="py-comment"># semicolon</tt> </tt>
-<a name="L305"></a><tt class="py-lineno">305</tt>  <tt class="py-line">            <tt class="py-name">fn_semicolon2</tt><tt class="py-op">,</tt>                       <tt class="py-comment"># semicolon</tt> </tt>
-<a name="L306"></a><tt class="py-lineno">306</tt>  <tt class="py-line">            <tt class="py-name">fn_open</tt><tt class="py-op">,</tt>                             <tt class="py-comment"># {</tt> </tt>
-<a name="L307"></a><tt class="py-lineno">307</tt>  <tt class="py-line">            <tt class="py-name">fn_close</tt><tt class="py-op">,</tt>                            <tt class="py-comment"># }</tt> </tt>
-<a name="L308"></a><tt class="py-lineno">308</tt>  <tt class="py-line">            <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">11</tt><tt class="py-op">)</tt><tt class="py-op">,</tt>                     <tt class="py-comment"># string</tt> </tt>
-<a name="L309"></a><tt class="py-lineno">309</tt>  <tt class="py-line">            <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-string">'url(%s)'</tt> <tt class="py-op">%</tt> <tt class="py-name">uri_space_sub</tt><tt class="py-op">(</tt><tt class="py-name">uri_space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">12</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L310"></a><tt class="py-lineno">310</tt>  <tt class="py-line">                                                 <tt class="py-comment"># url(...)</tt> </tt>
-<a name="L311"></a><tt class="py-lineno">311</tt>  <tt class="py-line">            <tt class="py-name">fn_at_group</tt><tt class="py-op">,</tt>                         <tt class="py-comment"># @xxx expecting {...}</tt> </tt>
-<a name="L312"></a><tt class="py-lineno">312</tt>  <tt class="py-line">            <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
-<a name="L313"></a><tt class="py-lineno">313</tt>  <tt class="py-line">            <tt class="py-name">fn_ie7hack</tt><tt class="py-op">,</tt>                          <tt class="py-comment"># ie7hack</tt> </tt>
-<a name="L314"></a><tt class="py-lineno">314</tt>  <tt class="py-line">            <tt class="py-name">None</tt><tt class="py-op">,</tt> </tt>
-<a name="L315"></a><tt class="py-lineno">315</tt>  <tt class="py-line">            <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">16</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">' '</tt> <tt class="py-op">+</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">17</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L316"></a><tt class="py-lineno">316</tt>  <tt class="py-line">                                                 <tt class="py-comment"># :first-line|letter followed</tt> </tt>
-<a name="L317"></a><tt class="py-lineno">317</tt>  <tt class="py-line">                                                 <tt class="py-comment"># by [{,] (apparently space</tt> </tt>
-<a name="L318"></a><tt class="py-lineno">318</tt>  <tt class="py-line">                                                 <tt class="py-comment"># needed for IE6)</tt> </tt>
-<a name="L319"></a><tt class="py-lineno">319</tt>  <tt class="py-line">            <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">nl_unesc_sub</tt><tt class="py-op">(</tt><tt class="py-string">''</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">18</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt>   <tt class="py-comment"># nl_string</tt> </tt>
-<a name="L320"></a><tt class="py-lineno">320</tt>  <tt class="py-line">            <tt class="py-keyword">lambda</tt> <tt class="py-name">g</tt><tt class="py-op">:</tt> <tt class="py-name">post_esc_sub</tt><tt class="py-op">(</tt><tt class="py-string">' '</tt><tt class="py-op">,</tt> <tt class="py-name">g</tt><tt class="py-op">(</tt><tt class="py-number">19</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt>  <tt class="py-comment"># escape</tt> </tt>
-<a name="L321"></a><tt class="py-lineno">321</tt>  <tt class="py-line">        <tt class="py-op">)</tt> </tt>
-<a name="L322"></a><tt class="py-lineno">322</tt>  <tt class="py-line"> </tt>
-<a name="L323"></a><tt class="py-lineno">323</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">func</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L324"></a><tt class="py-lineno">324</tt>  <tt class="py-line">            <tt class="py-docstring">""" Main subber """</tt> </tt>
-<a name="L325"></a><tt class="py-lineno">325</tt>  <tt class="py-line">            <tt class="py-name">idx</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">lastindex</tt><tt class="py-op">,</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">group</tt> </tt>
-<a name="L326"></a><tt class="py-lineno">326</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">idx</tt> <tt class="py-op">&gt;</tt> <tt class="py-number">3</tt><tt class="py-op">:</tt> </tt>
-<a name="L327"></a><tt class="py-lineno">327</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-name">table</tt><tt class="py-op">[</tt><tt class="py-name">idx</tt><tt class="py-op">]</tt><tt class="py-op">(</tt><tt class="py-name">group</tt><tt class="py-op">)</tt> </tt>
-<a name="L328"></a><tt class="py-lineno">328</tt>  <tt class="py-line"> </tt>
-<a name="L329"></a><tt class="py-lineno">329</tt>  <tt class="py-line">            <tt class="py-comment"># shortcuts for frequent operations below:</tt> </tt>
-<a name="L330"></a><tt class="py-lineno">330</tt>  <tt class="py-line">            <tt class="py-keyword">elif</tt> <tt class="py-name">idx</tt> <tt class="py-op">==</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt>     <tt class="py-comment"># not interesting</tt> </tt>
-<a name="L331"></a><tt class="py-lineno">331</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt> </tt>
-<a name="L332"></a><tt class="py-lineno">332</tt>  <tt class="py-line">            <tt class="py-comment">#else: # space with token before or at the beginning</tt> </tt>
-<a name="L333"></a><tt class="py-lineno">333</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">space_sub</tt><tt class="py-op">(</tt><tt class="py-name">space_subber</tt><tt class="py-op">,</tt> <tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-name">idx</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L334"></a><tt class="py-lineno">334</tt>  <tt class="py-line"> </tt>
-<a name="L335"></a><tt class="py-lineno">335</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">func</tt> </tt>
-</div><a name="L336"></a><tt class="py-lineno">336</tt>  <tt class="py-line"> </tt>
-<a name="L337"></a><tt class="py-lineno">337</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">cssmin</tt><tt class="py-op">(</tt><tt class="py-param">style</tt><tt class="py-op">,</tt> <tt class="py-param">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt>  <tt class="py-comment"># pylint: disable = W0621</tt> </tt>
-<a name="L338"></a><tt class="py-lineno">338</tt>  <tt class="py-line">        <tt class="py-docstring">"""</tt> </tt>
-<a name="L339"></a><tt class="py-lineno">339</tt>  <tt class="py-line"><tt class="py-docstring">        Minify CSS.</tt> </tt>
-<a name="L340"></a><tt class="py-lineno">340</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L341"></a><tt class="py-lineno">341</tt>  <tt class="py-line"><tt class="py-docstring">        :Parameters:</tt> </tt>
-<a name="L342"></a><tt class="py-lineno">342</tt>  <tt class="py-line"><tt class="py-docstring">          `style` : ``str``</tt> </tt>
-<a name="L343"></a><tt class="py-lineno">343</tt>  <tt class="py-line"><tt class="py-docstring">            CSS to minify</tt> </tt>
-<a name="L344"></a><tt class="py-lineno">344</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L345"></a><tt class="py-lineno">345</tt>  <tt class="py-line"><tt class="py-docstring">          `keep_bang_comments` : ``bool``</tt> </tt>
-<a name="L346"></a><tt class="py-lineno">346</tt>  <tt class="py-line"><tt class="py-docstring">            Keep comments starting with an exclamation mark? (``/*!...*/``)</tt> </tt>
-<a name="L347"></a><tt class="py-lineno">347</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L348"></a><tt class="py-lineno">348</tt>  <tt class="py-line"><tt class="py-docstring">        :Return: Minified style</tt> </tt>
-<a name="L349"></a><tt class="py-lineno">349</tt>  <tt class="py-line"><tt class="py-docstring">        :Rtype: ``str``</tt> </tt>
-<a name="L350"></a><tt class="py-lineno">350</tt>  <tt class="py-line"><tt class="py-docstring">        """</tt> </tt>
-<a name="L351"></a><tt class="py-lineno">351</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">main_sub</tt><tt class="py-op">(</tt><tt class="py-name">main_subber</tt><tt class="py-op">(</tt><tt class="py-name">keep_bang_comments</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">style</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L352"></a><tt class="py-lineno">352</tt>  <tt class="py-line"> </tt>
-<a name="L353"></a><tt class="py-lineno">353</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt id="link-5" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-5', 'cssmin', 'link-4');">cssmin</a></tt> </tt>
-</div><a name="L354"></a><tt class="py-lineno">354</tt>  <tt class="py-line"> </tt>
-<a name="L355"></a><tt class="py-lineno">355</tt>  <tt class="py-line"><tt id="link-6" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-6', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_cssmin</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L356"></a><tt class="py-lineno">356</tt>  <tt class="py-line"> </tt>
-<a name="L357"></a><tt class="py-lineno">357</tt>  <tt class="py-line"> </tt>
-<a name="L358"></a><tt class="py-lineno">358</tt>  <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">'__main__'</tt><tt class="py-op">:</tt> </tt>
-<a name="main"></a><div id="main-def"><a name="L359"></a><tt class="py-lineno">359</tt> <a class="py-toggle" href="#" id="main-toggle" onclick="return toggle('main');">-</a><tt class="py-line">    <tt class="py-keyword">def</tt> <a class="py-def-name" href="rcssmin-module.html#main">main</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-</div><div id="main-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="main-expanded"><a name="L360"></a><tt class="py-lineno">360</tt>  <tt class="py-line">        <tt class="py-docstring">""" Main """</tt> </tt>
-<a name="L361"></a><tt class="py-lineno">361</tt>  <tt class="py-line">        <tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_sys</tt> </tt>
-<a name="L362"></a><tt class="py-lineno">362</tt>  <tt class="py-line">        <tt class="py-name">keep_bang_comments</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt>
-<a name="L363"></a><tt class="py-lineno">363</tt>  <tt class="py-line">            <tt class="py-string">'-b'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
-<a name="L364"></a><tt class="py-lineno">364</tt>  <tt class="py-line">            <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
-<a name="L365"></a><tt class="py-lineno">365</tt>  <tt class="py-line">            <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
-<a name="L366"></a><tt class="py-lineno">366</tt>  <tt class="py-line">        <tt class="py-op">)</tt> </tt>
-<a name="L367"></a><tt class="py-lineno">367</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-string">'-p'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> \ </tt>
-<a name="L368"></a><tt class="py-lineno">368</tt>  <tt class="py-line">                <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L369"></a><tt class="py-lineno">369</tt>  <tt class="py-line">            <tt class="py-keyword">global</tt> <tt id="link-7" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-7', 'cssmin', 'link-4');">cssmin</a></tt>  <tt class="py-comment"># pylint: disable = W0603</tt> </tt>
-<a name="L370"></a><tt class="py-lineno">370</tt>  <tt class="py-line">            <tt id="link-8" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-8', 'cssmin', 'link-4');">cssmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_cssmin</tt><tt class="py-op">(</tt><tt class="py-name">python_only</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt> </tt>
-<a name="L371"></a><tt class="py-lineno">371</tt>  <tt class="py-line">        <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">.</tt><tt class="py-name">write</tt><tt class="py-op">(</tt><tt id="link-9" class="py-name"><a title="rcssmin.cssmin" class="py-name" href="#" onclick="return doclink('link-9', 'cssmin', 'link-4');">cssmin</a></tt><tt class="py-op">(</tt> </tt>
-<a name="L372"></a><tt class="py-lineno">372</tt>  <tt class="py-line">            <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdin</tt><tt class="py-op">.</tt><tt class="py-name">read</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">keep_bang_comments</tt> </tt>
-<a name="L373"></a><tt class="py-lineno">373</tt>  <tt class="py-line">        <tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L374"></a><tt class="py-lineno">374</tt>  <tt class="py-line">    <tt class="py-name">main</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L375"></a><tt class="py-lineno">375</tt>  <tt class="py-line"> </tt><script type="text/javascript">
-<!--
-expandto(location.href);
-// -->
-</script>
-</pre>
-<br />
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rcssmin/" target="_top">Visit rcssmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html
deleted file mode 100644
index 95728fd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/docs/apidoc/redirect.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<html><head><title>Epydoc Redirect Page</title>
-<meta http-equiv="cache-control" content="no-cache" />
-<meta http-equiv="expires" content="0" />
-<meta http-equiv="pragma" content="no-cache" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-<body>
-<script type="text/javascript">
-<!--
-var pages = ["rcssmin-m"];
-var dottedName = get_anchor();
-if (dottedName) {
-    var target = redirect_url(dottedName);
-    if (target) window.location.replace(target);
-}
-// -->
-</script>
-
-<h3>Epydoc Auto-redirect page</h3>
-
-<p>When javascript is enabled, this page will redirect URLs of
-the form <tt>redirect.html#<i>dotted.name</i></tt> to the
-documentation for the object with the given fully-qualified
-dotted name.</p>
-<p><a id="message"> &nbsp; </a></p>
-
-<script type="text/javascript">
-<!--
-if (dottedName) {
-    var msg = document.getElementById("message");
-    msg.innerHTML = "No documentation found for <tt>"+
-                    dottedName+"</tt>";
-}
-// -->
-</script>
-
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg
deleted file mode 100644
index c09bbd0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/package.cfg
+++ /dev/null
@@ -1,84 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright 2009 - 2014
-# André Malo or his licensors, as applicable
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-[package]
-name = rcssmin
-
-python.min = 2.3
-python.max = 3.4
-pypy.min = 1.9
-pypy.max = 2.2
-jython.min = 2.5
-jython.max = 2.7
-
-version.number = 1.0.5
-
-author.name = André Malo
-author.email = nd@perlig.de
-#maintainer.name =
-#maintainer.email = 
-url.homepage = http://opensource.perlig.de/rcssmin/
-url.download = http://storage.perlig.de/rcssmin/
-
-
-[docs]
-meta.classifiers = docs/CLASSIFIERS
-meta.description = docs/DESCRIPTION
-meta.summary = docs/SUMMARY
-meta.provides = docs/PROVIDES
-meta.license = LICENSE
-meta.keywords =
-    CSS
-    Minimization
-
-apidoc.dir = docs/apidoc
-apidoc.strip = 1
-#apidoc.ignore =
-
-#userdoc.dir = docs/userdoc
-#userdoc.strip = 1
-#userdoc.ignore =
-#    .buildinfo
-
-#examples.dir = docs/examples
-#examples.strip = 1
-#examples.ignore =
-
-#man =
-
-extra =
-    README.rst
-    docs/CHANGES
-    docs/BENCHMARKS
-
-
-[manifest]
-#packages.lib = .
-#packages.collect =
-modules = rcssmin
-
-packages.extra =
-    _setup.py2.term
-    _setup.py3.term
-
-#scripts =
-
-dist =
-    tests
-    run_tests.py
-    bench
-    bench.sh
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c
deleted file mode 100644
index a722fc2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.c
+++ /dev/null
@@ -1,1163 +0,0 @@
-/*
- * Copyright 2011 - 2014
- * Andr\xe9 Malo or his licensors, as applicable
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "cext.h"
-EXT_INIT_FUNC;
-
-#ifdef EXT3
-typedef Py_UNICODE rchar;
-#else
-typedef unsigned char rchar;
-#endif
-#define U(c) ((rchar)(c))
-
-typedef struct {
-    const rchar *start;
-    const rchar *sentinel;
-    const rchar *tsentinel;
-    Py_ssize_t at_group;
-    int in_macie5;
-    int in_rule;
-    int keep_bang_comments;
-} rcssmin_ctx_t;
-
-typedef enum {
-    NEED_SPACE_MAYBE = 0,
-    NEED_SPACE_NEVER
-} need_space_flag;
-
-
-#define RCSSMIN_DULL_BIT         (1 << 0)
-#define RCSSMIN_HEX_BIT          (1 << 1)
-#define RCSSMIN_ESC_BIT          (1 << 2)
-#define RCSSMIN_SPACE_BIT        (1 << 3)
-#define RCSSMIN_STRING_DULL_BIT  (1 << 4)
-#define RCSSMIN_NMCHAR_BIT       (1 << 5)
-#define RCSSMIN_URI_DULL_BIT     (1 << 6)
-#define RCSSMIN_PRE_CHAR_BIT     (1 << 7)
-#define RCSSMIN_POST_CHAR_BIT    (1 << 8)
-
-static const unsigned short rcssmin_charmask[128] = {
-     21,  21,  21,  21,  21,  21,  21,  21,
-     21,  28,   8,  21,   8,   8,  21,  21,
-     21,  21,  21,  21,  21,  21,  21,  21,
-     21,  21,  21,  21,  21,  21,  21,  21,
-     28, 469,   4,  85,  85,  85,  85,   4,
-    149, 277,  85, 469, 469, 117,  85,  84,
-    115, 115, 115, 115, 115, 115, 115, 115,
-    115, 115, 468, 340,  85, 469, 468,  85,
-     84, 115, 115, 115, 115, 115, 115, 117,
-    117, 117, 117, 117, 117, 117, 117, 117,
-    117, 117, 117, 117, 117, 117, 117, 117,
-    117, 117, 117, 213,   4, 341,  85, 117,
-     85, 115, 115, 115, 115, 115, 115, 117,
-    117, 117, 117, 117, 117, 117, 117, 117,
-    117, 117, 117, 117, 117, 116, 117, 117,
-    117, 117, 117, 468,  85, 468,  85,  21
-};
-
-#define RCSSMIN_IS_DULL(c) ((U(c) > 127) || \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_DULL_BIT))
-
-#define RCSSMIN_IS_HEX(c) ((U(c) <= 127) && \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_HEX_BIT))
-
-#define RCSSMIN_IS_ESC(c) ((U(c) > 127) || \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_ESC_BIT))
-
-#define RCSSMIN_IS_SPACE(c) ((U(c) <= 127) && \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_SPACE_BIT))
-
-#define RCSSMIN_IS_STRING_DULL(c) ((U(c) > 127) || \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_STRING_DULL_BIT))
-
-#define RCSSMIN_IS_NMCHAR(c) ((U(c) > 127) || \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_NMCHAR_BIT))
-
-#define RCSSMIN_IS_URI_DULL(c) ((U(c) > 127) || \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_URI_DULL_BIT))
-
-#define RCSSMIN_IS_PRE_CHAR(c) ((U(c) <= 127) && \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_PRE_CHAR_BIT))
-
-#define RCSSMIN_IS_POST_CHAR(c) ((U(c) <= 127) && \
-    (rcssmin_charmask[U(c) & 0x7F] & RCSSMIN_POST_CHAR_BIT))
-
-
-static const rchar pattern_url[] = {
-    /*U('u'),*/ U('r'), U('l'), U('(')
-};
-
-static const rchar pattern_ie7[] = {
-    /*U('>'),*/ U('/'), U('*'), U('*'), U('/')
-};
-
-static const rchar pattern_media[] = {
-    U('m'), U('e'), U('d'), U('i'), U('a'),
-    U('M'), U('E'), U('D'), U('I'), U('A')
-};
-
-static const rchar pattern_document[] = {
-    U('d'), U('o'), U('c'), U('u'), U('m'), U('e'), U('n'), U('t'),
-    U('D'), U('O'), U('C'), U('U'), U('M'), U('E'), U('N'), U('T')
-};
-
-static const rchar pattern_supports[] = {
-    U('s'), U('u'), U('p'), U('p'), U('o'), U('r'), U('t'), U('s'),
-    U('S'), U('U'), U('P'), U('P'), U('O'), U('R'), U('T'), U('S')
-};
-
-static const rchar pattern_keyframes[] = {
-    U('k'), U('e'), U('y'), U('f'), U('r'), U('a'), U('m'), U('e'), U('s'),
-    U('K'), U('E'), U('Y'), U('F'), U('R'), U('A'), U('M'), U('E'), U('S')
-};
-
-static const rchar pattern_vendor_o[] = {
-    U('-'), U('o'), U('-'),
-    U('-'), U('O'), U('-')
-};
-
-static const rchar pattern_vendor_moz[] = {
-    U('-'), U('m'), U('o'), U('z'), U('-'),
-    U('-'), U('M'), U('O'), U('Z'), U('-')
-};
-
-static const rchar pattern_vendor_webkit[] = {
-    U('-'), U('w'), U('e'), U('b'), U('k'), U('i'), U('t'), U('-'),
-    U('-'), U('W'), U('E'), U('B'), U('K'), U('I'), U('T'), U('-')
-};
-
-static const rchar pattern_vendor_ms[] = {
-    U('-'), U('m'), U('s'), U('-'),
-    U('-'), U('M'), U('S'), U('-')
-};
-
-static const rchar pattern_first[] = {
-    U('f'), U('i'), U('r'), U('s'), U('t'), U('-'), U('l'),
-    U('F'), U('I'), U('R'), U('S'), U('T'), U('-'), U('L')
-};
-
-static const rchar pattern_line[] = {
-    U('i'), U('n'), U('e'),
-    U('I'), U('N'), U('E'),
-};
-
-static const rchar pattern_letter[] = {
-    U('e'), U('t'), U('t'), U('e'), U('r'),
-    U('E'), U('T'), U('T'), U('E'), U('R')
-};
-
-static const rchar pattern_macie5_init[] = {
-    U('/'), U('*'), U('\\'), U('*'), U('/')
-};
-
-static const rchar pattern_macie5_exit[] = {
-    U('/'), U('*'), U('*'), U('/')
-};
-
-/*
- * Match a pattern (and copy immediately to target)
- */
-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstrict-overflow"
-#endif
-static int
-copy_match(const rchar *pattern, const rchar *psentinel,
-           const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-    rchar c;
-
-    while (pattern < psentinel
-           && source < ctx->sentinel && target < ctx->tsentinel
-           && ((c = *source++) == *pattern++))
-        *target++ = c;
-
-    *source_ = source;
-    *target_ = target;
-
-    return (pattern == psentinel);
-}
-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-#pragma GCC diagnostic pop
-#endif
-
-#define MATCH(PAT, source, target, ctx) (                              \
-    copy_match(pattern_##PAT,                                          \
-               pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar),  \
-               source, target, ctx)                                    \
-)
-
-
-/*
- * Match a pattern (and copy immediately to target) - CI version
- */
-static int
-copy_imatch(const rchar *pattern, const rchar *psentinel,
-            const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_, *pstart = pattern;
-    rchar *target = *target_;
-    rchar c;
-
-    while (pattern < psentinel
-           && source < ctx->sentinel && target < ctx->tsentinel
-           && ((c = *source++) == *pattern
-               || c == pstart[(pattern - pstart) + (psentinel - pstart)])) {
-        ++pattern;
-        *target++ = c;
-    }
-
-    *source_ = source;
-    *target_ = target;
-
-    return (pattern == psentinel);
-}
-
-#define IMATCH(PAT, source, target, ctx) (                                  \
-    copy_imatch(pattern_##PAT,                                              \
-                pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar) / 2,  \
-                source, target, ctx)                                        \
-)
-
-
-/*
- * Copy characters
- */
-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstrict-overflow"
-#endif
-static int
-copy(const rchar *source, const rchar *sentinel, rchar **target_,
-     rcssmin_ctx_t *ctx)
-{
-    rchar *target = *target_;
-
-    while (source < sentinel && target < ctx->tsentinel)
-        *target++ = *source++;
-
-    *target_ = target;
-
-    return (source == sentinel);
-}
-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
-#pragma GCC diagnostic pop
-#endif
-
-#define COPY_PAT(PAT, target, ctx) (                             \
-    copy(pattern_##PAT,                                          \
-         pattern_##PAT + sizeof(pattern_##PAT) / sizeof(rchar),  \
-         target, ctx)                                            \
-)
-
-
-/*
- * The ABORT macros work with known local variables!
- */
-#define ABORT_(RET) do {                                         \
-    if (source < ctx->sentinel && !(target < ctx->tsentinel)) {  \
-        *source_ = source;                                       \
-        *target_ = target;                                       \
-    }                                                            \
-    return RET;                                                  \
-} while(0)
-
-
-#define CRAPPY_C90_COMPATIBLE_EMPTY
-#define ABORT ABORT_(CRAPPY_C90_COMPATIBLE_EMPTY)
-#define RABORT(RET) ABORT_((RET))
-
-
-/*
- * Copy escape
- */
-static void
-copy_escape(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_, *hsentinel;
-    rchar *target = *target_;
-    rchar c;
-
-    *target++ = U('\\');
-    *target_ = target;
-
-    if (source < ctx->sentinel && target < ctx->tsentinel) {
-        c = *source++;
-        if (RCSSMIN_IS_ESC(c)) {
-            *target++ = c;
-        }
-        else if (RCSSMIN_IS_HEX(c)) {
-            *target++ = c;
-
-            /* 6 hex chars max, one we got already */
-            if (ctx->sentinel - source > 5)
-                hsentinel = source + 5;
-            else
-                hsentinel = ctx->sentinel;
-
-            while (source < hsentinel && target < ctx->tsentinel
-                   && (c = *source, RCSSMIN_IS_HEX(c))) {
-                ++source;
-                *target++ = c;
-            }
-
-            /* One optional space after */
-            if (source < ctx->sentinel && target < ctx->tsentinel) {
-                if (source == hsentinel)
-                    c = *source;
-                if (RCSSMIN_IS_SPACE(c)) {
-                    ++source;
-                    *target++ = U(' ');
-                    if (c == U('\r') && source < ctx->sentinel
-                        && *source == U('\n'))
-                        ++source;
-                }
-            }
-        }
-    }
-
-    *target_ = target;
-    *source_ = source;
-}
-
-
-/*
- * Copy string
- */
-static void
-copy_string(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-    rchar c, quote = source[-1];
-
-    *target++ = quote;
-    *target_ = target;
-
-    while (source < ctx->sentinel && target < ctx->tsentinel) {
-        c = *target++ = *source++;
-        if (RCSSMIN_IS_STRING_DULL(c))
-            continue;
-
-        switch (c) {
-        case U('\''): case U('"'):
-            if (c == quote) {
-                *target_ = target;
-                *source_ = source;
-                return;
-            }
-            continue;
-
-        case U('\\'):
-            if (source < ctx->sentinel && target < ctx->tsentinel) {
-                c = *source++;
-                switch (c) {
-                case U('\r'):
-                    if (source < ctx->sentinel && *source == U('\n'))
-                        ++source;
-                    /* fall through */
-
-                case U('\n'): case U('\f'):
-                    --target;
-                    break;
-
-                default:
-                    *target++ = c;
-                }
-            }
-            continue;
-        }
-        break; /* forbidden characters */
-    }
-
-    ABORT;
-}
-
-
-/*
- * Copy URI string
- */
-static int
-copy_uri_string(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-    rchar c, quote = source[-1];
-
-    *target++ = quote;
-    *target_ = target;
-
-    while (source < ctx->sentinel && target < ctx->tsentinel) {
-        c = *source++;
-        if (RCSSMIN_IS_SPACE(c))
-            continue;
-        *target++ = c;
-        if (RCSSMIN_IS_STRING_DULL(c))
-            continue;
-
-        switch (c) {
-        case U('\''): case U('"'):
-            if (c == quote) {
-                *target_ = target;
-                *source_ = source;
-                return 0;
-            }
-            continue;
-
-        case U('\\'):
-            if (source < ctx->sentinel && target < ctx->tsentinel) {
-                c = *source;
-                switch (c) {
-                case U('\r'):
-                    if ((source + 1) < ctx->sentinel && source[1] == U('\n'))
-                        ++source;
-                    /* fall through */
-
-                case U('\n'): case U('\f'):
-                    --target;
-                    ++source;
-                    break;
-
-                default:
-                    --target;
-                    copy_escape(&source, &target, ctx);
-                }
-            }
-            continue;
-        }
-
-        break; /* forbidden characters */
-    }
-
-    RABORT(-1);
-}
-
-
-/*
- * Copy URI (unquoted)
- */
-static int
-copy_uri_unquoted(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-    rchar c;
-
-    *target++ = source[-1];
-    *target_ = target;
-
-    while (source < ctx->sentinel && target < ctx->tsentinel) {
-        c = *source++;
-        if (RCSSMIN_IS_SPACE(c))
-            continue;
-        *target++ = c;
-        if (RCSSMIN_IS_URI_DULL(c))
-            continue;
-
-        switch (c) {
-
-        case U(')'):
-            *target_ = target - 1;
-            *source_ = source - 1;
-            return 0;
-
-        case U('\\'):
-            if (source < ctx->sentinel && target < ctx->tsentinel) {
-                c = *source;
-                switch (c) {
-                case U('\r'):
-                    if ((source + 1) < ctx->sentinel && source[1] == U('\n'))
-                        ++source;
-                    /* fall through */
-
-                case U('\n'): case U('\f'):
-                    --target;
-                    ++source;
-                    break;
-
-                default:
-                    --target;
-                    copy_escape(&source, &target, ctx);
-                }
-            }
-            continue;
-        }
-
-        break; /* forbidden characters */
-    }
-
-    RABORT(-1);
-}
-
-
-/*
- * Copy url
- */
-static void
-copy_url(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-    rchar c;
-
-    *target++ = U('u');
-    *target_ = target;
-
-    /* Must not be inside an identifier */
-    if ((source != ctx->start + 1) && RCSSMIN_IS_NMCHAR(source[-2]))
-        return;
-
-    if (!MATCH(url, &source, &target, ctx)
-        || !(source < ctx->sentinel && target < ctx->tsentinel))
-        ABORT;
-
-    while (source < ctx->sentinel && RCSSMIN_IS_SPACE(*source))
-        ++source;
-
-    if (!(source < ctx->sentinel))
-        ABORT;
-
-    c = *source++;
-    switch (c) {
-    case U('"'): case U('\''):
-        if (copy_uri_string(&source, &target, ctx) == -1)
-            ABORT;
-
-        while (source < ctx->sentinel && RCSSMIN_IS_SPACE(*source))
-            ++source;
-        break;
-
-    default:
-        if (copy_uri_unquoted(&source, &target, ctx) == -1)
-            ABORT;
-    }
-
-    if (!(source < ctx->sentinel && target < ctx->tsentinel))
-        ABORT;
-
-    if ((*target++ = *source++) != U(')'))
-        ABORT;
-
-    *target_ = target;
-    *source_ = source;
-}
-
-
-/*
- * Copy @-group
- */
-static void
-copy_at_group(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-
-    *target++ = U('@');
-    *target_ = target;
-
-#define REMATCH(what) ( \
-    source = *source_, \
-    target = *target_, \
-    IMATCH(what, &source, &target, ctx) \
-)
-#define CMATCH(what) IMATCH(what, &source, &target, ctx)
-
-    if ((  !CMATCH(media)
-        && !REMATCH(supports)
-        && !REMATCH(document)
-        && !REMATCH(keyframes)
-        && !(REMATCH(vendor_webkit) && CMATCH(keyframes))
-        && !(REMATCH(vendor_moz) && CMATCH(keyframes))
-        && !(REMATCH(vendor_o) && CMATCH(keyframes))
-        && !(REMATCH(vendor_ms) && CMATCH(keyframes)))
-        || !(source < ctx->sentinel && target < ctx->tsentinel)
-        || RCSSMIN_IS_NMCHAR(*source))
-        ABORT;
-
-#undef CMATCH
-#undef REMATCH
-
-    ++ctx->at_group;
-
-    *target_ = target;
-    *source_ = source;
-}
-
-
-/*
- * Skip space
- */
-static const rchar *
-skip_space(const rchar *source, rcssmin_ctx_t *ctx)
-{
-    const rchar *begin = source;
-    int res;
-    rchar c;
-
-    while (source < ctx->sentinel) {
-        c = *source;
-        if (RCSSMIN_IS_SPACE(c)) {
-            ++source;
-            continue;
-        }
-        else if (c == U('/')) {
-            ++source;
-            if (!(source < ctx->sentinel && *source == U('*'))) {
-                --source;
-                break;
-            }
-            ++source;
-            res = 0;
-            while (source < ctx->sentinel) {
-                c = *source++;
-                if (c != U('*'))
-                    continue;
-                if (!(source < ctx->sentinel))
-                    return begin;
-                if (*source != U('/'))
-                    continue;
-
-                /* Comment complete */
-                ++source;
-                res = 1;
-                break;
-            }
-            if (!res)
-                return begin;
-
-            continue;
-        }
-
-        break;
-    }
-
-    return source;
-}
-
-
-/*
- * Copy space
- */
-static void
-copy_space(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx,
-           need_space_flag need_space)
-{
-    const rchar *source = *source_, *end, *comment;
-    rchar *target = *target_;
-    int res;
-    rchar c;
-
-    --source;
-    if (need_space == NEED_SPACE_MAYBE
-        && source > ctx->start
-        && !RCSSMIN_IS_PRE_CHAR(source[-1])
-        && (end = skip_space(source, ctx)) < ctx->sentinel
-        && (!RCSSMIN_IS_POST_CHAR(*end)
-            || (*end == U(':') && !ctx->in_rule && !ctx->at_group))) {
-
-        if (!(target < ctx->tsentinel))
-            ABORT;
-        *target++ = U(' ');
-    }
-
-    while (source < ctx->sentinel) {
-        switch (c = *source) {
-
-        /* comment */
-        case U('/'):
-            comment = source++;
-            if (!((source < ctx->sentinel && *source == U('*')))) {
-                --source;
-                break;
-            }
-            ++source;
-            res = 0;
-            while (source < ctx->sentinel) {
-                c = *source++;
-                if (c != U('*'))
-                    continue;
-                if (!(source < ctx->sentinel))
-                    ABORT;
-                if (*source != U('/'))
-                    continue;
-
-                /* Comment complete */
-                ++source;
-                res = 1;
-
-                if (ctx->keep_bang_comments && comment[2] == U('!')) {
-                    ctx->in_macie5 = (source[-3] == U('\\'));
-                    if (!copy(comment, source, &target, ctx))
-                        ABORT;
-                }
-                else if (source[-3] == U('\\')) {
-                    if (!ctx->in_macie5) {
-                        if (!COPY_PAT(macie5_init, &target, ctx))
-                            ABORT;
-                    }
-                    ctx->in_macie5 = 1;
-                }
-                else if (ctx->in_macie5) {
-                    if (!COPY_PAT(macie5_exit, &target, ctx))
-                        ABORT;
-                    ctx->in_macie5 = 0;
-                }
-                /* else don't copy anything */
-                break;
-            }
-            if (!res)
-                ABORT;
-            continue;
-
-        /* space */
-        case U(' '): case U('\t'): case U('\r'): case U('\n'): case U('\f'):
-            ++source;
-            continue;
-        }
-
-        break;
-    }
-
-    *source_ = source;
-    *target_ = target;
-}
-
-
-/*
- * Copy space if comment
- */
-static int
-copy_space_comment(const rchar **source_, rchar **target_,
-                   rcssmin_ctx_t *ctx, need_space_flag need_space)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-
-    if (source < ctx->sentinel && *source == U('*')) {
-        copy_space(source_, target_, ctx, need_space);
-        if (*source_ > source)
-            return 0;
-    }
-    if (!(target < ctx->tsentinel))
-        RABORT(-1);
-
-    *target++ = source[-1];
-
-    /* *source_ = source; <-- unchanged */
-    *target_ = target;
-
-    return -1;
-}
-
-
-/*
- * Copy space if exists
- */
-static int
-copy_space_optional(const rchar **source_, rchar **target_,
-                    rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-
-    if (!(source < ctx->sentinel))
-        return -1;
-
-    if (*source == U('/')) {
-        *source_ = source + 1;
-        return copy_space_comment(source_, target_, ctx, NEED_SPACE_NEVER);
-    }
-    else if (RCSSMIN_IS_SPACE(*source)) {
-        *source_ = source + 1;
-        copy_space(source_, target_, ctx, NEED_SPACE_NEVER);
-        return 0;
-    }
-
-    return -1;
-}
-
-
-/*
- * Copy :first-line|letter
- */
-static void
-copy_first(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_, *next, *source_fork;
-    rchar *target = *target_, *target_fork;
-
-    *target++ = U(':');
-    *target_ = target;
-
-    if (!IMATCH(first, &source, &target, ctx)
-        || !(source < ctx->sentinel && target < ctx->tsentinel))
-        ABORT;
-
-    source_fork = source;
-    target_fork = target;
-
-    if (!IMATCH(line, &source, &target, ctx)) {
-        source = source_fork;
-        target = target_fork;
-
-        if (!IMATCH(letter, &source, &target, ctx)
-            || !(source < ctx->sentinel && target < ctx->tsentinel))
-            ABORT;
-    }
-
-    next = skip_space(source, ctx);
-    if (!(next < ctx->sentinel && target < ctx->tsentinel
-        && (*next == U('{') || *next == U(','))))
-        ABORT;
-
-    *target++ = U(' ');
-    *target_ = target;
-    *source_ = source;
-    (void)copy_space_optional(source_, target_, ctx);
-}
-
-
-/*
- * Copy IE7 hack
- */
-static void
-copy_ie7hack(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_;
-    rchar *target = *target_;
-
-    *target++ = U('>');
-    *target_ = target;
-
-    if (ctx->in_rule || ctx->at_group)
-        return; /* abort */
-
-    if (!MATCH(ie7, &source, &target, ctx))
-        ABORT;
-
-    ctx->in_macie5 = 0;
-
-    *target_ = target;
-    *source_ = source;
-
-    (void)copy_space_optional(source_, target_, ctx);
-}
-
-
-/*
- * Copy semicolon; miss out duplicates or even this one (before '}')
- */
-static void
-copy_semicolon(const rchar **source_, rchar **target_, rcssmin_ctx_t *ctx)
-{
-    const rchar *source = *source_, *begin, *end;
-    rchar *target = *target_;
-
-    begin = source;
-    while (source < ctx->sentinel) {
-        end = skip_space(source, ctx);
-        if (!(end < ctx->sentinel)) {
-            if (!(target < ctx->tsentinel))
-                ABORT;
-            *target++ = U(';');
-            break;
-        }
-        switch (*end) {
-        case U(';'):
-            source = end + 1;
-            continue;
-
-        case U('}'):
-            if (ctx->in_rule)
-                break;
-
-            /* fall through */
-        default:
-            if (!(target < ctx->tsentinel))
-                ABORT;
-            *target++ = U(';');
-            break;
-        }
-
-        break;
-    }
-
-    source = begin;
-    *target_ = target;
-    while (source < ctx->sentinel) {
-        if (*source == U(';')) {
-            ++source;
-            continue;
-        }
-
-        if (copy_space_optional(&source, target_, ctx) == 0)
-            continue;
-
-        break;
-    }
-
-    *source_ = source;
-}
-
-
-/*
- * Main function
- *
- * The return value determines the result length (kept in the target buffer).
- * However, if the target buffer is too small, the return value is greater
- * than tlength. The difference to tlength is the number of unconsumed source
- * characters at the time the buffer was full. In this case you should resize
- * the target buffer to the return value and call rcssmin again. Repeat as
- * often as needed.
- */
-static Py_ssize_t
-rcssmin(const rchar *source, rchar *target, Py_ssize_t slength,
-        Py_ssize_t tlength, int keep_bang_comments)
-{
-    rcssmin_ctx_t ctx_, *ctx = &ctx_;
-    const rchar *tstart = target;
-    rchar c;
-
-    ctx->start = source;
-    ctx->sentinel = source + slength;
-    ctx->tsentinel = target + tlength;
-    ctx->at_group = 0;
-    ctx->in_macie5 = 0;
-    ctx->in_rule = 0;
-    ctx->keep_bang_comments = keep_bang_comments;
-
-    while (source < ctx->sentinel && target < ctx->tsentinel) {
-        c = *source++;
-        if (RCSSMIN_IS_DULL(c)) {
-            *target++ = c;
-            continue;
-        }
-        else if (RCSSMIN_IS_SPACE(c)) {
-            copy_space(&source, &target, ctx, NEED_SPACE_MAYBE);
-            continue;
-        }
-
-        switch (c) {
-
-        /* Escape */
-        case U('\\'):
-            copy_escape(&source, &target, ctx);
-            continue;
-
-        /* String */
-        case U('"'): case U('\''):
-            copy_string(&source, &target, ctx);
-            continue;
-
-        /* URL */
-        case U('u'):
-            copy_url(&source, &target, ctx);
-            continue;
-
-        /* IE7hack */
-        case U('>'):
-            copy_ie7hack(&source, &target, ctx);
-            continue;
-
-        /* @-group */
-        case U('@'):
-            copy_at_group(&source, &target, ctx);
-            continue;
-
-        /* ; */
-        case U(';'):
-            copy_semicolon(&source, &target, ctx);
-            continue;
-
-        /* :first-line|letter followed by [{,] */
-        /* (apparently needed for IE6) */
-        case U(':'):
-            copy_first(&source, &target, ctx);
-            continue;
-
-        /* { */
-        case U('{'):
-            if (ctx->at_group)
-                --ctx->at_group;
-            else
-                ++ctx->in_rule;
-            *target++ = c;
-            continue;
-
-        /* } */
-        case U('}'):
-            if (ctx->in_rule)
-                --ctx->in_rule;
-            *target++ = c;
-            continue;
-
-        /* space starting with comment */
-        case U('/'):
-            (void)copy_space_comment(&source, &target, ctx, NEED_SPACE_MAYBE);
-            continue;
-
-        /* Fallback: copy character. Better safe than sorry. Should not be
-         * reached, though */
-        default:
-            *target++ = c;
-            continue;
-        }
-    }
-
-    return
-        (Py_ssize_t)(target - tstart) + (Py_ssize_t)(ctx->sentinel - source);
-}
-
-
-PyDoc_STRVAR(rcssmin_cssmin__doc__,
-"cssmin(style, keep_bang_comments=False)\n\
-\n\
-Minify CSS.\n\
-\n\
-:Note: This is a hand crafted C implementation built on the regex\n\
-       semantics.\n\
-\n\
-:Parameters:\n\
-  `style` : ``str``\n\
-    CSS to minify\n\
-\n\
-:Return: Minified style\n\
-:Rtype: ``str``");
-
-static PyObject *
-rcssmin_cssmin(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    PyObject *style, *keep_bang_comments_ = NULL, *result;
-    static char *kwlist[] = {"style", "keep_bang_comments", NULL};
-    Py_ssize_t rlength, slength, length;
-    int keep_bang_comments;
-#ifdef EXT2
-    int uni;
-#define UOBJ "O"
-#endif
-#ifdef EXT3
-#define UOBJ "U"
-#endif
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, UOBJ "|O", kwlist,
-                                     &style, &keep_bang_comments_))
-        return NULL;
-
-    if (!keep_bang_comments_)
-        keep_bang_comments = 0;
-    else {
-        keep_bang_comments = PyObject_IsTrue(keep_bang_comments_);
-        if (keep_bang_comments == -1)
-            return NULL;
-    }
-
-#ifdef EXT2
-    if (PyUnicode_Check(style)) {
-        if (!(style = PyUnicode_AsUTF8String(style)))
-            return NULL;
-        uni = 1;
-    }
-    else {
-        if (!(style = PyObject_Str(style)))
-            return NULL;
-        uni = 0;
-    }
-#endif
-
-#ifdef EXT3
-    Py_INCREF(style);
-#define PyString_GET_SIZE PyUnicode_GET_SIZE
-#define PyString_AS_STRING PyUnicode_AS_UNICODE
-#define _PyString_Resize PyUnicode_Resize
-#define PyString_FromStringAndSize PyUnicode_FromUnicode
-#endif
-
-    rlength = slength = PyString_GET_SIZE(style);
-
-again:
-    if (!(result = PyString_FromStringAndSize(NULL, rlength))) {
-        Py_DECREF(style);
-        return NULL;
-    }
-    Py_BEGIN_ALLOW_THREADS
-    length = rcssmin((rchar *)PyString_AS_STRING(style),
-                     (rchar *)PyString_AS_STRING(result),
-                     slength, rlength, keep_bang_comments);
-    Py_END_ALLOW_THREADS
-
-    if (length > rlength) {
-        Py_DECREF(result);
-        rlength = length;
-        goto again;
-    }
-
-    Py_DECREF(style);
-    if (length < 0) {
-        Py_DECREF(result);
-        return NULL;
-    }
-    if (length != rlength && _PyString_Resize(&result, length) == -1)
-        return NULL;
-
-#ifdef EXT2
-    if (uni) {
-        style = PyUnicode_DecodeUTF8(PyString_AS_STRING(result),
-                                     PyString_GET_SIZE(result), "strict");
-        Py_DECREF(result);
-        if (!style)
-            return NULL;
-        result = style;
-    }
-#endif
-    return result;
-}
-
-/* ------------------------ BEGIN MODULE DEFINITION ------------------------ */
-
-EXT_METHODS = {
-    {"cssmin",
-        (PyCFunction)rcssmin_cssmin, METH_VARARGS | METH_KEYWORDS,
-        rcssmin_cssmin__doc__},
-
-    {NULL}  /* Sentinel */
-};
-
-PyDoc_STRVAR(EXT_DOCS_VAR,
-"C implementation of rcssmin\n\
-===========================\n\
-\n\
-C implementation of rcssmin.");
-
-
-EXT_DEFINE(EXT_MODULE_NAME, EXT_METHODS_VAR, EXT_DOCS_VAR);
-
-EXT_INIT_FUNC {
-    PyObject *m;
-
-    /* Create the module and populate stuff */
-    if (!(m = EXT_CREATE(&EXT_DEFINE_VAR)))
-        EXT_INIT_ERROR(NULL);
-
-    EXT_ADD_UNICODE(m, "__author__", "Andr\xe9 Malo", "latin-1");
-    EXT_ADD_STRING(m, "__docformat__", "restructuredtext en");
-
-    EXT_INIT_RETURN(m);
-}
-
-/* ------------------------- END MODULE DEFINITION ------------------------- */
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py
deleted file mode 100644
index ae1cefc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/rcssmin.py
+++ /dev/null
@@ -1,374 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-r"""
-==============
- CSS Minifier
-==============
-
-CSS Minifier.
-
-The minifier is based on the semantics of the `YUI compressor`_\\, which
-itself is based on `the rule list by Isaac Schlueter`_\\.
-
-:Copyright:
-
- Copyright 2011 - 2014
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT 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 module is a re-implementation aiming for speed instead of maximum
-compression, so it can be used at runtime (rather than during a preprocessing
-step). RCSSmin does syntactical compression only (removing spaces, comments
-and possibly semicolons). It does not provide semantic compression (like
-removing empty blocks, collapsing redundant properties etc). It does, however,
-support various CSS hacks (by keeping them working as intended).
-
-Here's a feature list:
-
-- Strings are kept, except that escaped newlines are stripped
-- Space/Comments before the very end or before various characters are
-  stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single
-  space is kept if it's outside a ruleset.)
-- Space/Comments at the very beginning or after various characters are
-  stripped: ``{}(=:>+[,!``
-- Optional space after unicode escapes is kept, resp. replaced by a simple
-  space
-- whitespaces inside ``url()`` definitions are stripped
-- Comments starting with an exclamation mark (``!``) can be kept optionally.
-- All other comments and/or whitespace characters are replaced by a single
-  space.
-- Multiple consecutive semicolons are reduced to one
-- The last semicolon within a ruleset is stripped
-- CSS Hacks supported:
-
-  - IE7 hack (``>/**/``)
-  - Mac-IE5 hack (``/*\\*/.../**/``)
-  - The boxmodelhack is supported naturally because it relies on valid CSS2
-    strings
-  - Between ``:first-line`` and the following comma or curly brace a space is
-    inserted. (apparently it's needed for IE6)
-  - Same for ``:first-letter``
-
-rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to
-factor 100 or so (depending on the input). docs/BENCHMARKS in the source
-distribution contains the details.
-
-Both python 2 (>= 2.4) and python 3 are supported.
-
-.. _YUI compressor: https://github.com/yui/yuicompressor/
-
-.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/
-"""
-if __doc__:
-    # pylint: disable = W0622
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
-__license__ = "Apache License, Version 2.0"
-__version__ = '1.0.5'
-__all__ = ['cssmin']
-
-import re as _re
-
-
-def _make_cssmin(python_only=False):
-    """
-    Generate CSS minifier.
-
-    :Parameters:
-      `python_only` : ``bool``
-        Use only the python variant. If true, the c extension is not even
-        tried to be loaded.
-
-    :Return: Minifier
-    :Rtype: ``callable``
-    """
-    # pylint: disable = R0912, R0914, W0612
-
-    if not python_only:
-        try:
-            import _rcssmin
-        except ImportError:
-            pass
-        else:
-            return _rcssmin.cssmin
-
-    nl = r'(?:[\n\f]|\r\n?)'  # pylint: disable = C0103
-    spacechar = r'[\r\n\f\040\t]'
-
-    unicoded = r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?'
-    escaped = r'[^\n\r\f0-9a-fA-F]'
-    escape = r'(?:\\(?:%(unicoded)s|%(escaped)s))' % locals()
-
-    nmchar = r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]'
-    #nmstart = r'[^\000-\100\133-\136\140\173-\177]'
-    #ident = (r'(?:'
-    #    r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*'
-    #r')') % locals()
-
-    comment = r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
-
-    # only for specific purposes. The bang is grouped:
-    _bang_comment = r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)'
-
-    string1 = \
-        r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)'
-    string2 = r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")'
-    strings = r'(?:%s|%s)' % (string1, string2)
-
-    nl_string1 = \
-        r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)'
-    nl_string2 = r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")'
-    nl_strings = r'(?:%s|%s)' % (nl_string1, nl_string2)
-
-    uri_nl_string1 = r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)'
-    uri_nl_string2 = r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")'
-    uri_nl_strings = r'(?:%s|%s)' % (uri_nl_string1, uri_nl_string2)
-
-    nl_escaped = r'(?:\\%(nl)s)' % locals()
-
-    space = r'(?:%(spacechar)s|%(comment)s)' % locals()
-
-    ie7hack = r'(?:>/\*\*/)'
-
-    uri = (r'(?:'
-        # noqa pylint: disable = C0330
-        r'(?:[^\000-\040"\047()\\\177]*'
-            r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)'
-        r'(?:'
-            r'(?:%(spacechar)s+|%(nl_escaped)s+)'
-            r'(?:'
-                r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)'
-                r'[^\000-\040"\047()\\\177]*'
-                r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*'
-            r')+'
-        r')*'
-    r')') % locals()
-
-    nl_unesc_sub = _re.compile(nl_escaped).sub
-
-    uri_space_sub = _re.compile((
-        r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+'
-    ) % locals()).sub
-    uri_space_subber = lambda m: m.groups()[0] or ''
-
-    space_sub_simple = _re.compile((
-        r'[\r\n\f\040\t;]+|(%(comment)s+)'
-    ) % locals()).sub
-    space_sub_banged = _re.compile((
-        r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)'
-    ) % locals()).sub
-
-    post_esc_sub = _re.compile(r'[\r\n\f\t]+').sub
-
-    main_sub = _re.compile((
-        # noqa pylint: disable = C0330
-        r'([^\\"\047u>@\r\n\f\040\t/;:{}]+)'
-        r'|(?<=[{}(=:>+[,!])(%(space)s+)'
-        r'|^(%(space)s+)'
-        r'|(%(space)s+)(?=(([:{});=>+\],!])|$)?)'
-        r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)'
-        r'|(\{)'
-        r'|(\})'
-        r'|(%(strings)s)'
-        r'|(?<!%(nmchar)s)url\(%(spacechar)s*('
-                r'%(uri_nl_strings)s'
-                r'|%(uri)s'
-            r')%(spacechar)s*\)'
-        r'|(@(?:'
-              r'[mM][eE][dD][iI][aA]'
-              r'|[sS][uU][pP][pP][oO][rR][tT][sS]'
-              r'|[dD][oO][cC][uU][mM][eE][nN][tT]'
-              r'|(?:-(?:'
-                  r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]'
-                r')-)?'
-                r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]'
-            r'))(?!%(nmchar)s)'
-        r'|(%(ie7hack)s)(%(space)s*)'
-        r'|(:[fF][iI][rR][sS][tT]-[lL]'
-            r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))'
-            r'(%(space)s*)(?=[{,])'
-        r'|(%(nl_strings)s)'
-        r'|(%(escape)s[^\\"\047u>@\r\n\f\040\t/;:{}]*)'
-    ) % locals()).sub
-
-    #print main_sub.__self__.pattern
-
-    def main_subber(keep_bang_comments):
-        """ Make main subber """
-        in_macie5, in_rule, at_group = [0], [0], [0]
-
-        if keep_bang_comments:
-            space_sub = space_sub_banged
-
-            def space_subber(match):
-                """ Space|Comment subber """
-                if match.lastindex:
-                    group1, group2 = match.group(1, 2)
-                    if group2:
-                        if group1.endswith(r'\*/'):
-                            in_macie5[0] = 1
-                        else:
-                            in_macie5[0] = 0
-                        return group1
-                    elif group1:
-                        if group1.endswith(r'\*/'):
-                            if in_macie5[0]:
-                                return ''
-                            in_macie5[0] = 1
-                            return r'/*\*/'
-                        elif in_macie5[0]:
-                            in_macie5[0] = 0
-                            return '/**/'
-                return ''
-        else:
-            space_sub = space_sub_simple
-
-            def space_subber(match):
-                """ Space|Comment subber """
-                if match.lastindex:
-                    if match.group(1).endswith(r'\*/'):
-                        if in_macie5[0]:
-                            return ''
-                        in_macie5[0] = 1
-                        return r'/*\*/'
-                    elif in_macie5[0]:
-                        in_macie5[0] = 0
-                        return '/**/'
-                return ''
-
-        def fn_space_post(group):
-            """ space with token after """
-            if group(5) is None or (
-                    group(6) == ':' and not in_rule[0] and not at_group[0]):
-                return ' ' + space_sub(space_subber, group(4))
-            return space_sub(space_subber, group(4))
-
-        def fn_semicolon(group):
-            """ ; handler """
-            return ';' + space_sub(space_subber, group(7))
-
-        def fn_semicolon2(group):
-            """ ; handler """
-            if in_rule[0]:
-                return space_sub(space_subber, group(7))
-            return ';' + space_sub(space_subber, group(7))
-
-        def fn_open(_):
-            """ { handler """
-            if at_group[0]:
-                at_group[0] -= 1
-            else:
-                in_rule[0] = 1
-            return '{'
-
-        def fn_close(_):
-            """ } handler """
-            in_rule[0] = 0
-            return '}'
-
-        def fn_at_group(group):
-            """ @xxx group handler """
-            at_group[0] += 1
-            return group(13)
-
-        def fn_ie7hack(group):
-            """ IE7 Hack handler """
-            if not in_rule[0] and not at_group[0]:
-                in_macie5[0] = 0
-                return group(14) + space_sub(space_subber, group(15))
-            return '>' + space_sub(space_subber, group(15))
-
-        table = (
-            # noqa pylint: disable = C0330
-            None,
-            None,
-            None,
-            None,
-            fn_space_post,                       # space with token after
-            fn_space_post,                       # space with token after
-            fn_space_post,                       # space with token after
-            fn_semicolon,                        # semicolon
-            fn_semicolon2,                       # semicolon
-            fn_open,                             # {
-            fn_close,                            # }
-            lambda g: g(11),                     # string
-            lambda g: 'url(%s)' % uri_space_sub(uri_space_subber, g(12)),
-                                                 # url(...)
-            fn_at_group,                         # @xxx expecting {...}
-            None,
-            fn_ie7hack,                          # ie7hack
-            None,
-            lambda g: g(16) + ' ' + space_sub(space_subber, g(17)),
-                                                 # :first-line|letter followed
-                                                 # by [{,] (apparently space
-                                                 # needed for IE6)
-            lambda g: nl_unesc_sub('', g(18)),   # nl_string
-            lambda g: post_esc_sub(' ', g(19)),  # escape
-        )
-
-        def func(match):
-            """ Main subber """
-            idx, group = match.lastindex, match.group
-            if idx > 3:
-                return table[idx](group)
-
-            # shortcuts for frequent operations below:
-            elif idx == 1:     # not interesting
-                return group(1)
-            #else: # space with token before or at the beginning
-            return space_sub(space_subber, group(idx))
-
-        return func
-
-    def cssmin(style, keep_bang_comments=False):  # pylint: disable = W0621
-        """
-        Minify CSS.
-
-        :Parameters:
-          `style` : ``str``
-            CSS to minify
-
-          `keep_bang_comments` : ``bool``
-            Keep comments starting with an exclamation mark? (``/*!...*/``)
-
-        :Return: Minified style
-        :Rtype: ``str``
-        """
-        return main_sub(main_subber(keep_bang_comments), style)
-
-    return cssmin
-
-cssmin = _make_cssmin()
-
-
-if __name__ == '__main__':
-    def main():
-        """ Main """
-        import sys as _sys
-        keep_bang_comments = (
-            '-b' in _sys.argv[1:]
-            or '-bp' in _sys.argv[1:]
-            or '-pb' in _sys.argv[1:]
-        )
-        if '-p' in _sys.argv[1:] or '-bp' in _sys.argv[1:] \
-                or '-pb' in _sys.argv[1:]:
-            global cssmin  # pylint: disable = W0603
-            cssmin = _make_cssmin(python_only=True)
-        _sys.stdout.write(cssmin(
-            _sys.stdin.read(), keep_bang_comments=keep_bang_comments
-        ))
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py
deleted file mode 100755
index 9128d74..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/run_tests.py
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-#
-# Copyright 2014
-# Andr\xe9 Malo or his licensors, as applicable
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""
-===========
- Run tests
-===========
-
-Run tests.
-"""
-__author__ = "Andr\xe9 Malo"
-__author__ = getattr(__author__, 'decode', lambda x: __author__)('latin-1')
-__docformat__ = "restructuredtext en"
-
-import os as _os
-import re as _re
-import sys as _sys
-
-from _setup import shell
-from _setup import term
-
-
-def run_tests(basedir, libdir):
-    """ Run output based tests """
-    import rcssmin as _rcssmin
-    py_cssmin = _rcssmin._make_cssmin(python_only=True)
-    c_cssmin = _rcssmin._make_cssmin(python_only=False)
-
-    def run_test(example, output_file):
-        """ Run it """
-        try:
-            fp = open(example, 'r')
-        except IOError:
-            return
-        else:
-            try:
-                input = fp.read()
-            finally:
-                fp.close()
-
-        def load_output(filename):
-            try:
-                fp = open(filename, 'r')
-            except IOError:
-                return None
-            else:
-                try:
-                    output = fp.read()
-                finally:
-                    fp.close()
-            output = output.strip()
-            if _re.search(r'(?<!\\)(?:\\\\)*\\[0-9a-zA-Z]{1,6}$', output):
-                output += ' '
-            return output
-
-        output = load_output(output_file)
-        output_b = load_output(output_file + '.b')
-
-        def do_test(cssmin, output, **options):
-            try:
-                genout = cssmin(input, **options)
-            except (KeyboardInterrupt, SystemExit):
-                raise
-            except:
-                return 1, "%(RED)s exc%(NORMAL)s "
-            else:
-                if output is None:
-                    return 1, "%(RED)smiss%(NORMAL)s "
-                elif genout == output or genout == output.rstrip():
-                    return 0, "%(GREEN)sOK%(NORMAL)s   "
-                else:
-                    return 1, "%(RED)sfail%(NORMAL)s "
-
-        erred, out = do_test(py_cssmin, output)
-        erred, c_out = do_test(c_cssmin, output)
-        erred, out_b = do_test(py_cssmin, output_b, keep_bang_comments=True)
-        erred, c_out_b = do_test(c_cssmin, output_b, keep_bang_comments=True)
-
-        term.write(
-            "%(out)s %(out_b)s  |  %(c_out)s %(c_out_b)s - %%(example)s\n"
-                % locals(),
-            example=_os.path.basename(example),
-        )
-        return erred
-
-    # end
-    # begin main test code
-
-    erred = 0
-    basedir = shell.native(basedir)
-    strip = len(basedir) - len(_os.path.basename(basedir))
-    for dirname, dirs, files in shell.walk(basedir):
-        dirs[:] = [
-            item for item in dirs if item not in ('.svn', '.git', 'out')
-        ]
-        dirs.sort()
-        files = [item for item in files if item.endswith('.css')]
-        if not files:
-            continue
-        if not _os.path.isdir(_os.path.join(basedir, dirname, 'out')):
-            continue
-        term.yellow("---> %s" % (dirname[strip:],))
-        files.sort()
-        for filename in files:
-            if run_test(
-                _os.path.join(dirname, filename),
-                _os.path.join(dirname, 'out', filename[:-4] + '.out'),
-            ): erred = 1
-        term.yellow("<--- %s" % (dirname[strip:],))
-    return erred
-
-
-def main():
-    """ Main """
-    basedir, libdir = None, None
-    accept_opts = True
-    args = []
-    for arg in _sys.argv[1:]:
-        if accept_opts:
-            if arg == '--':
-                accept_opts = False
-                continue
-            elif arg == '-q':
-                term.write = term.green = term.red = term.yellow = \
-                    term.announce = \
-                    lambda fmt, **kwargs: None
-                continue
-            elif arg == '-p':
-                info = {}
-                for key in term.terminfo():
-                    info[key] = ''
-                info['ERASE'] = '\n'
-                term.terminfo.info = info
-                continue
-            elif arg.startswith('-'):
-                _sys.stderr.write("Unrecognized option %r\n" % (arg,))
-                return 2
-        args.append(arg)
-    if len(args) > 2:
-        _sys.stderr.write("Too many arguments\n")
-        return 2
-    elif len(args) < 1:
-        _sys.stderr.write("Missing arguments\n")
-        return 2
-    basedir = args[0]
-    if len(args) > 1:
-        libdir = args[1]
-    return run_tests(basedir, libdir)
-
-
-if __name__ == '__main__':
-    _sys.exit(main())
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/setup.py b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/setup.py
deleted file mode 100644
index d4ca570..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/setup.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-#
-# Copyright 2006 - 2013
-# Andr\xe9 Malo or his licensors, as applicable
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import sys as _sys
-from _setup import run
-
-
-def setup(args=None, _manifest=0):
-    """ Main setup function """
-    from _setup.ext import Extension
-
-    if 'java' in _sys.platform.lower():
-        # no c extension for jython
-        ext = None
-    else:
-        ext=[Extension('_rcssmin', sources=['rcssmin.c'])]
-
-    return run(script_args=args, ext=ext, manifest_only=_manifest)
-
-
-def manifest():
-    """ Create List of packaged files """
-    return setup((), _manifest=1)
-
-
-if __name__ == '__main__':
-    setup()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_00.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_00.css
deleted file mode 100644
index 6f66822..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_00.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@page :first {
-    margin-left: 1cm;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_01.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_01.css
deleted file mode 100644
index a8c5cba..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_01.css
+++ /dev/null
@@ -1,15 +0,0 @@
-@document url(http://www.w3.org/),
-               url-prefix(http://www.w3.org/Style/),
-               domain(mozilla.org),
-               regexp("https:.*")
-{
-  /* CSS rules here apply to:
-     + The page "http://www.w3.org/".
-     + Any page whose URL begins with "http://www.w3.org/Style/"
-     + Any page whose URL's host is "mozilla.org" or ends with
-       ".mozilla.org"
-     + Any page whose URL starts with "https:" */
-
-  /* make the above-mentioned pages really ugly */
-  body { color: purple; background: yellow; }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_02.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_02.css
deleted file mode 100644
index 430859e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_02.css
+++ /dev/null
@@ -1,17 +0,0 @@
-@media all and (min-width:500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-      /* CSS rules here apply to:
-         + The page "http://www.w3.org/".
-         + Any page whose URL begins with "http://www.w3.org/Style/"
-         + Any page whose URL's host is "mozilla.org" or ends with
-           ".mozilla.org"
-         + Any page whose URL starts with "https:" */
-
-      /* make the above-mentioned pages really ugly */
-      body { color: purple; background: yellow; }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_03.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_03.css
deleted file mode 100644
index 65b74d2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_03.css
+++ /dev/null
@@ -1,11 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @page :last {
-            margin : 3in;
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_04.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_04.css
deleted file mode 100644
index 57e35ab..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_04.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_05.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_05.css
deleted file mode 100644
index fc2bfdd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_05.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @keyframes slidein {
-                from {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_06.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_06.css
deleted file mode 100644
index 7cb7ffb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_06.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@mEdia all and (min-width : 500px) {
-    @docuMent url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @suPpoRts ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @keyFRames slidein {
-                from {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @pagE :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_07.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_07.css
deleted file mode 100644
index 94453d2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_07.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @keyframes slidein {
-                from :blub {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_08.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_08.css
deleted file mode 100644
index c190e17..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_08.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @-o-keyframes slidein {
-                from :blub {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_09.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_09.css
deleted file mode 100644
index 8ffd0da..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_09.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @-moz-keyframes slidein {
-                from :blub {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_10.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_10.css
deleted file mode 100644
index b083bf6..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_10.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @-webkit-keyframes slidein {
-                from :blub {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_11.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_11.css
deleted file mode 100644
index e68b738..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/atgroup_11.css
+++ /dev/null
@@ -1,31 +0,0 @@
-@media all and (min-width : 500px) {
-    @document url(http://www.w3.org/),
-                   url-prefix(http://www.w3.org/Style/),
-                   domain(mozilla.org),
-                   regexp("https:.*")
-    {
-        @supports ( (perspective: 10px) or (-moz-perspective: 10px) or (-webkit-perspective: 10px) or (-ms-perspective: 10px) or (-o-perspective: 10px) ) {
-            @-ms-keyframes slidein {
-                from :blub {
-                    margin-left : 100%;
-                    width: 300%
-                }
-      
-                75% {
-                    font-size:300%;
-                    margin-left:25%;
-                    width:150%;
-                }
-      
-                to {
-                    margin-left:0%;
-                    width:100%;
-                }
-            }
-
-            @page :last {
-                margin : 3in;
-            }
-        }
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_00.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_00.css
deleted file mode 100644
index 27a079d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_00.css
+++ /dev/null
@@ -1 +0,0 @@
-/* this is a comment */i {love: comments; /*! yes */; /*YES*/}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_01.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_01.css
deleted file mode 100644
index 3498967..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_01.css
+++ /dev/null
@@ -1,7 +0,0 @@
-#mainnav li.hover dl.subsearch select {
-    margin-top /*\**/:4px\9;
-    margin-bottom /*\**/:0px\9;
-    }
-#mainnav li.hover dl.subsearch label {
-    margin-top /*\**/:4px\9;
-    }
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_02.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_02.css
deleted file mode 100644
index 63ea916..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_02.css
+++ /dev/null
@@ -1 +0,0 @@
-/*/
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_03.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_03.css
deleted file mode 100644
index c307e63..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_03.css
+++ /dev/null
@@ -1 +0,0 @@
-a/***/b
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_04.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_04.css
deleted file mode 100644
index f140a4f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/comment_04.css
+++ /dev/null
@@ -1 +0,0 @@
-a/**\/*/b
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_00.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_00.css
deleted file mode 100644
index 1b7689b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_00.css
+++ /dev/null
@@ -1 +0,0 @@
-\\0
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_01.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_01.css
deleted file mode 100644
index d62fa9d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_01.css
+++ /dev/null
@@ -1 +0,0 @@
-\0
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_02.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_02.css
deleted file mode 100644
index 270feae..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_02.css
+++ /dev/null
@@ -1 +0,0 @@
-\10
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_03.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_03.css
deleted file mode 100644
index aab5566..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_03.css
+++ /dev/null
@@ -1 +0,0 @@
-\0345
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_04.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_04.css
deleted file mode 100644
index 05e2c62..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_04.css
+++ /dev/null
@@ -1 +0,0 @@
-\01234567
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_05.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_05.css
deleted file mode 100644
index c8f0d86..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_05.css
+++ /dev/null
@@ -1 +0,0 @@
-\012345 la
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_06.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_06.css
deleted file mode 100644
index 32f9dbc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/escape_06.css
+++ /dev/null
@@ -1 +0,0 @@
-\a bc
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_00.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_00.css
deleted file mode 100644
index a1eefcc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_00.css
+++ /dev/null
@@ -1 +0,0 @@
-x:first-line{bla: blub;}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_01.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_01.css
deleted file mode 100644
index 9645721..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_01.css
+++ /dev/null
@@ -1 +0,0 @@
-x:first-letter{bla: blub;}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_02.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_02.css
deleted file mode 100644
index fce5c2c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/first_02.css
+++ /dev/null
@@ -1 +0,0 @@
-x:first-letter{bla:blub}y:first-line{foo:bar}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_00.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_00.out
deleted file mode 100644
index 4b5aae8..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_00.out
+++ /dev/null
@@ -1 +0,0 @@
-@page :first{margin-left:1cm}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_00.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_00.out.b
deleted file mode 100644
index 4b5aae8..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_00.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@page :first{margin-left:1cm}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_01.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_01.out
deleted file mode 100644
index 674e2ab..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_01.out
+++ /dev/null
@@ -1 +0,0 @@
-@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){body{color:purple;background:yellow}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_01.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_01.out.b
deleted file mode 100644
index 674e2ab..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_01.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){body{color:purple;background:yellow}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_02.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_02.out
deleted file mode 100644
index 1c688eb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_02.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){body{color:purple;background:yellow}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_02.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_02.out.b
deleted file mode 100644
index 1c688eb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_02.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){body{color:purple;background:yellow}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_03.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_03.out
deleted file mode 100644
index 576ccdf..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_03.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@page :last{margin:3in}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_03.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_03.out.b
deleted file mode 100644
index 576ccdf..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_03.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@page :last{margin:3in}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_04.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_04.out
deleted file mode 100644
index a086a8b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_04.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_04.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_04.out.b
deleted file mode 100644
index a086a8b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_04.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_05.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_05.out
deleted file mode 100644
index f134c5d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_05.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@keyframes slidein{from{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_05.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_05.out.b
deleted file mode 100644
index f134c5d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_05.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@keyframes slidein{from{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_06.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_06.out
deleted file mode 100644
index a6cc57a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_06.out
+++ /dev/null
@@ -1 +0,0 @@
-@mEdia all and (min-width:500px){@docuMent url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@suPpoRts ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@keyFRames slidein{from{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@pagE :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_06.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_06.out.b
deleted file mode 100644
index a6cc57a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_06.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@mEdia all and (min-width:500px){@docuMent url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@suPpoRts ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@keyFRames slidein{from{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@pagE :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_07.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_07.out
deleted file mode 100644
index 6d8b689..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_07.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_07.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_07.out.b
deleted file mode 100644
index 6d8b689..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_07.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_08.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_08.out
deleted file mode 100644
index 8c0d6b1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_08.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-o-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_08.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_08.out.b
deleted file mode 100644
index 8c0d6b1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_08.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-o-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_09.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_09.out
deleted file mode 100644
index ddb2b2a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_09.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-moz-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_09.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_09.out.b
deleted file mode 100644
index ddb2b2a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_09.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-moz-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_10.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_10.out
deleted file mode 100644
index f0b137c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_10.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-webkit-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_10.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_10.out.b
deleted file mode 100644
index f0b137c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_10.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-webkit-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_11.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_11.out
deleted file mode 100644
index 3a621f0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_11.out
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-ms-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_11.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_11.out.b
deleted file mode 100644
index 3a621f0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/atgroup_11.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media all and (min-width:500px){@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){@supports ((perspective:10px) or (-moz-perspective:10px) or (-webkit-perspective:10px) or (-ms-perspective:10px) or (-o-perspective:10px)){@-ms-keyframes slidein{from :blub{margin-left:100%;width:300%}75%{font-size:300%;margin-left:25%;width:150%}to{margin-left:0%;width:100%}}@page :last{margin:3in}}}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_00.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_00.out
deleted file mode 100644
index 046b074..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_00.out
+++ /dev/null
@@ -1 +0,0 @@
-i{love:comments}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_00.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_00.out.b
deleted file mode 100644
index 3975a8b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_00.out.b
+++ /dev/null
@@ -1 +0,0 @@
-i{love:comments/*! yes */}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_01.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_01.out
deleted file mode 100644
index 2a13c23..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_01.out
+++ /dev/null
@@ -1 +0,0 @@
-#mainnav li.hover dl.subsearch select{margin-top:4px\9;margin-bottom:0px\9}#mainnav li.hover dl.subsearch label{margin-top:4px\9}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_01.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_01.out.b
deleted file mode 100644
index 2a13c23..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_01.out.b
+++ /dev/null
@@ -1 +0,0 @@
-#mainnav li.hover dl.subsearch select{margin-top:4px\9;margin-bottom:0px\9}#mainnav li.hover dl.subsearch label{margin-top:4px\9}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_02.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_02.out
deleted file mode 100644
index aa51ac1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_02.out
+++ /dev/null
@@ -1 +0,0 @@
-/*/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_02.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_02.out.b
deleted file mode 100644
index aa51ac1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_02.out.b
+++ /dev/null
@@ -1 +0,0 @@
-/*/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_03.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_03.out
deleted file mode 100644
index 9eb1507..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_03.out
+++ /dev/null
@@ -1 +0,0 @@
-a b
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_03.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_03.out.b
deleted file mode 100644
index 9eb1507..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_03.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a b
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_04.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_04.out
deleted file mode 100644
index 9eb1507..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_04.out
+++ /dev/null
@@ -1 +0,0 @@
-a b
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_04.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_04.out.b
deleted file mode 100644
index 9eb1507..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/comment_04.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a b
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_00.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_00.out
deleted file mode 100644
index 68ec29b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_00.out
+++ /dev/null
@@ -1 +0,0 @@
-\\0
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_00.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_00.out.b
deleted file mode 100644
index 68ec29b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_00.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\\0
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_01.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_01.out
deleted file mode 100644
index e4939bd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_01.out
+++ /dev/null
@@ -1 +0,0 @@
-\0 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_01.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_01.out.b
deleted file mode 100644
index e4939bd..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_01.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\0 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_02.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_02.out
deleted file mode 100644
index 8e45022..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_02.out
+++ /dev/null
@@ -1 +0,0 @@
-\10 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_02.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_02.out.b
deleted file mode 100644
index 8e45022..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_02.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\10 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_03.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_03.out
deleted file mode 100644
index 4b5a949..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_03.out
+++ /dev/null
@@ -1 +0,0 @@
-\0345 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_03.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_03.out.b
deleted file mode 100644
index 4b5a949..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_03.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\0345 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_04.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_04.out
deleted file mode 100644
index 23aa989..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_04.out
+++ /dev/null
@@ -1 +0,0 @@
-\01234567
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_04.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_04.out.b
deleted file mode 100644
index 23aa989..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_04.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\01234567
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_05.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_05.out
deleted file mode 100644
index c3375f4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_05.out
+++ /dev/null
@@ -1 +0,0 @@
-\012345 la
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_05.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_05.out.b
deleted file mode 100644
index c3375f4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_05.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\012345 la
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_06.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_06.out
deleted file mode 100644
index a525cd5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_06.out
+++ /dev/null
@@ -1 +0,0 @@
-\a bc
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_06.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_06.out.b
deleted file mode 100644
index a525cd5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/escape_06.out.b
+++ /dev/null
@@ -1 +0,0 @@
-\a bc
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_00.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_00.out
deleted file mode 100644
index ff2f806..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_00.out
+++ /dev/null
@@ -1 +0,0 @@
-x:first-line {bla:blub}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_00.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_00.out.b
deleted file mode 100644
index ff2f806..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_00.out.b
+++ /dev/null
@@ -1 +0,0 @@
-x:first-line {bla:blub}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_01.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_01.out
deleted file mode 100644
index c76af38..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_01.out
+++ /dev/null
@@ -1 +0,0 @@
-x:first-letter {bla:blub}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_01.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_01.out.b
deleted file mode 100644
index c76af38..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_01.out.b
+++ /dev/null
@@ -1 +0,0 @@
-x:first-letter {bla:blub}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_02.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_02.out
deleted file mode 100644
index 1831996..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_02.out
+++ /dev/null
@@ -1 +0,0 @@
-x:first-letter {bla:blub}y:first-line {foo:bar}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_02.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_02.out.b
deleted file mode 100644
index 1831996..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/first_02.out.b
+++ /dev/null
@@ -1 +0,0 @@
-x:first-letter {bla:blub}y:first-line {foo:bar}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_00.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_00.out
deleted file mode 100644
index c283d2b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_00.out
+++ /dev/null
@@ -1 +0,0 @@
-xurl(la la la)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_00.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_00.out.b
deleted file mode 100644
index c283d2b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_00.out.b
+++ /dev/null
@@ -1 +0,0 @@
-xurl(la la la)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_01.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_01.out
deleted file mode 100644
index 1244651..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_01.out
+++ /dev/null
@@ -1 +0,0 @@
-url(lalala) 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_01.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_01.out.b
deleted file mode 100644
index 1244651..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_01.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url(lalala) 
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_02.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_02.out
deleted file mode 100644
index 2345a4b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_02.out
+++ /dev/null
@@ -1 +0,0 @@
-url(lalala)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_02.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_02.out.b
deleted file mode 100644
index 2345a4b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_02.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url(lalala)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_03.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_03.out
deleted file mode 100644
index 315887f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_03.out
+++ /dev/null
@@ -1 +0,0 @@
-url("lalala")
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_03.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_03.out.b
deleted file mode 100644
index 315887f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_03.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url("lalala")
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_04.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_04.out
deleted file mode 100644
index 315887f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_04.out
+++ /dev/null
@@ -1 +0,0 @@
-url("lalala")
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_04.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_04.out.b
deleted file mode 100644
index 315887f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_04.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url("lalala")
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_05.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_05.out
deleted file mode 100644
index 239ac2f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_05.out
+++ /dev/null
@@ -1 +0,0 @@
-url(lala\)lala)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_05.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_05.out.b
deleted file mode 100644
index 239ac2f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_05.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url(lala\)lala)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_06.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_06.out
deleted file mode 100644
index d79c151..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_06.out
+++ /dev/null
@@ -1 +0,0 @@
-url(lala\)lalalololo)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_06.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_06.out.b
deleted file mode 100644
index d79c151..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_06.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url(lala\)lalalololo)
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_07.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_07.out
deleted file mode 100644
index 8fdd4fe..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_07.out
+++ /dev/null
@@ -1 +0,0 @@
-url(lalala l
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_07.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_07.out.b
deleted file mode 100644
index 8fdd4fe..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_07.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url(lalala l
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_08.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_08.out
deleted file mode 100644
index 6105592..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_08.out
+++ /dev/null
@@ -1 +0,0 @@
-url("lalala l
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_08.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_08.out.b
deleted file mode 100644
index 6105592..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_08.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url("lalala l
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_09.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_09.out
deleted file mode 100644
index 6e1f640..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_09.out
+++ /dev/null
@@ -1 +0,0 @@
-url(lal " ala     l ")
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_09.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_09.out.b
deleted file mode 100644
index 6e1f640..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/out/url_09.out.b
+++ /dev/null
@@ -1 +0,0 @@
-url(lal " ala     l ")
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_00.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_00.css
deleted file mode 100644
index 4e1f889..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_00.css
+++ /dev/null
@@ -1 +0,0 @@
-xurl( la la la )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_01.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_01.css
deleted file mode 100644
index e474113..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_01.css
+++ /dev/null
@@ -1 +0,0 @@
-url( la la la )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_02.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_02.css
deleted file mode 100644
index dba1742..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_02.css
+++ /dev/null
@@ -1,2 +0,0 @@
-url( la 
-la la )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_03.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_03.css
deleted file mode 100644
index 24ae8ef..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_03.css
+++ /dev/null
@@ -1 +0,0 @@
-url( "la la la" )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_04.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_04.css
deleted file mode 100644
index 630305c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_04.css
+++ /dev/null
@@ -1,2 +0,0 @@
-url( "la 
-la la" )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_05.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_05.css
deleted file mode 100644
index 54d2d03..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_05.css
+++ /dev/null
@@ -1,2 +0,0 @@
-url( lala \) la la\
-)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_06.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_06.css
deleted file mode 100644
index a895129..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_06.css
+++ /dev/null
@@ -1,3 +0,0 @@
-url( lala \) la la\
-lolo  \
-lo)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_07.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_07.css
deleted file mode 100644
index 825b5ab..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_07.css
+++ /dev/null
@@ -1 +0,0 @@
-url( lalala  l
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_08.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_08.css
deleted file mode 100644
index 821e6db..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_08.css
+++ /dev/null
@@ -1 +0,0 @@
-url( "lalala  l
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_09.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_09.css
deleted file mode 100644
index 07435bb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/main/url_09.css
+++ /dev/null
@@ -1 +0,0 @@
-url(   lal " ala     l " )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/README b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/README
deleted file mode 100644
index 841b568..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/README
+++ /dev/null
@@ -1,61 +0,0 @@
-These test inputs are originally taken from the YUI compressor suite
-(https://github.com/yui/yuicompressor/). The outputs (in the out/ directory) are
-my own.
-
-The YUI tests are licensed as follows:
-
-===========================================================================
-YUI Compressor Copyright License Agreement (BSD License)
-
-Copyright (c) 2011, Yahoo! Inc.
-All rights reserved.
-
-Redistribution and use of this software 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 Yahoo! Inc. nor the names of its
-  contributors may be used to endorse or promote products
-  derived from this software without specific prior
-  written permission of Yahoo! Inc.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-This software also requires access to software from the following sources:
-
-The Jarg Library v 1.0 ( http://jargs.sourceforge.net/ ) is available
-under a BSD License - Copyright (c) 2001-2003 Steve Purcell,
-Copyright (c) 2002 Vidar Holen, Copyright (c) 2002 Michal Ceresna and
-Copyright (c) 2005 Ewan Mellor.
-
-The Rhino Library ( http://www.mozilla.org/rhino/ ) is dually available
-under an MPL 1.1/GPL 2.0 license, with portions subject to a BSD license.
-
-Additionally, this software contains modified versions of the following
-component files from the Rhino Library:
-
-[org/mozilla/javascript/Decompiler.java]
-[org/mozilla/javascript/Parser.java]
-[org/mozilla/javascript/Token.java]
-[org/mozilla/javascript/TokenStream.java]
-
-The modified versions of these files are distributed under the MPL v 1.1
-( http://www.mozilla.org/MPL/MPL-1.1.html )
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/background-position.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/background-position.css
deleted file mode 100644
index 4cdff82..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/background-position.css
+++ /dev/null
@@ -1,2 +0,0 @@
-a {background-position: 0 0 0 0;}
-b {BACKGROUND-POSITION: 0 0;}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/background-position.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/background-position.css.min
deleted file mode 100644
index 0895e1a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/background-position.css.min
+++ /dev/null
@@ -1 +0,0 @@
-a{background-position:0 0}b{background-position:0 0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/border-none.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/border-none.css
deleted file mode 100644
index 29f9cba..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/border-none.css
+++ /dev/null
@@ -1,5 +0,0 @@
-a {
-    border: none;
-}
-b {BACKGROUND:none}
-s {border-top: none;}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/border-none.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/border-none.css.min
deleted file mode 100644
index 1ed1b65..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/border-none.css.min
+++ /dev/null
@@ -1 +0,0 @@
-a{border:0}b{background:0}s{border-top:0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/box-model-hack.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/box-model-hack.css
deleted file mode 100644
index c00e32f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/box-model-hack.css
+++ /dev/null
@@ -1,9 +0,0 @@
-#elem { 
- width: 100px; 
- voice-family: "\"}\""; 
- voice-family:inherit;
- width: 200px;
-}
-html>body #elem {
- width: 200px;
-} 
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/box-model-hack.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/box-model-hack.css.min
deleted file mode 100644
index 3340179..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/box-model-hack.css.min
+++ /dev/null
@@ -1 +0,0 @@
-#elem{width:100px;voice-family:"\"}\"";voice-family:inherit;width:200px}html>body #elem{width:200px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527974.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527974.css
deleted file mode 100644
index b3bc2c8..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527974.css
+++ /dev/null
@@ -1,10 +0,0 @@
-/*	this file contains no css, it exists purely to put the revision number into the 
-	combined css before uploading it to SiteManager. The exclaimation at the start
-	of the comment informs yuicompressor not to strip the comment out */
- 
-/*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */
- 
-body {
-    yo: cats;
-}
-ul[id$=foo] label:hover {yo: yo;}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527974.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527974.css.min
deleted file mode 100644
index 00cc007..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527974.css.min
+++ /dev/null
@@ -1 +0,0 @@
-/*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */body{yo:cats}ul[id$=foo] label:hover{yo:yo}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527991.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527991.css
deleted file mode 100644
index d4c80ff..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527991.css
+++ /dev/null
@@ -1,19 +0,0 @@
-@media screen and/*!YUI-Compresser */(-webkit-min-device-pixel-ratio:0) {
-  a{
-    b: 1;
-  }
-}
-
-
-@media screen and/*! */ /*! */(-webkit-min-device-pixel-ratio:0) {
-  a{
-    b: 1;
-  }
-}
-
-
-@media -webkit-min-device-pixel-ratio:0 {
-  a{
-    b: 1;
-  }
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527991.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527991.css.min
deleted file mode 100644
index 965755a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527991.css.min
+++ /dev/null
@@ -1 +0,0 @@
-@media screen and/*!YUI-Compresser */(-webkit-min-device-pixel-ratio:0){a{b:1}}@media screen and/*! *//*! */(-webkit-min-device-pixel-ratio:0){a{b:1}}@media -webkit-min-device-pixel-ratio:0{a{b:1}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527998.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527998.css
deleted file mode 100644
index 9c6c00e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527998.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! special */
-body {
-
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527998.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527998.css.min
deleted file mode 100644
index 7fabf8a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2527998.css.min
+++ /dev/null
@@ -1 +0,0 @@
-/*! special */
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2528034.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2528034.css
deleted file mode 100644
index c315cb1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2528034.css
+++ /dev/null
@@ -1,5 +0,0 @@
-a[href$="/test/"] span:first-child { b:1; }
-a[href$="/test/"] span:first-child { }
-
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2528034.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2528034.css.min
deleted file mode 100644
index 1543777..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/bug2528034.css.min
+++ /dev/null
@@ -1 +0,0 @@
-a[href$="/test/"] span:first-child{b:1}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/charset-media.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/charset-media.css
deleted file mode 100644
index bd02f38..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/charset-media.css
+++ /dev/null
@@ -1,9 +0,0 @@
-/* re: 2495387 */
-@charset 'utf-8';
-@media all {
-body {
-}
-body {
-background-color: gold;
-}
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/charset-media.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/charset-media.css.min
deleted file mode 100644
index dcaf49d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/charset-media.css.min
+++ /dev/null
@@ -1 +0,0 @@
-@charset 'utf-8';@media all{body{background-color:gold}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color-simple.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color-simple.css
deleted file mode 100644
index bb33ec3..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color-simple.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.foo, #AABBCC {
-  background-color:#aabbcc;
-  border-color:#Ee66aA #ABCDEF #FeAb2C;
-  filter:chroma(color = #FFFFFF );
-  filter:chroma(color="#AABBCC");
-  filter:chroma(color='#BBDDEE');
-  color:#112233
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color-simple.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color-simple.css.min
deleted file mode 100644
index 1e39e23..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color-simple.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.foo,#AABBCC{background-color:#abc;border-color:#e6a #abcdef #feab2c;filter:chroma(color = #FFFFFF);filter:chroma(color="#AABBCC");filter:chroma(color='#BBDDEE');color:#123}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color.css
deleted file mode 100644
index 030b8a0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color.css
+++ /dev/null
@@ -1,46 +0,0 @@
-.color {
-  me: rgb(123, 123, 123);
-  impressed: #FfEedD;
-  again: #ABCDEF;
-  andagain:#aa66cc;
-  background-color:#aa66ccc;
-  filter: chroma(color="#FFFFFF");
-  background: none repeat scroll 0 0 rgb(255, 0,0);
-  alpha: rgba(1, 2, 3, 4);
-  color:#1122aa
-}
-
-#AABBCC {
-  background-color:#ffee11;
-  filter: chroma(color = #FFFFFF );
-  color:#441122;
-  foo:#00fF11 #ABC #AABbCc #123344;
-  border-color:#aa66ccC
-}
-
-.foo #AABBCC {
-  background-color:#fFEe11;
-  color:#441122;
-  border-color:#AbC;
-  filter: chroma(color= #FFFFFF)
-}
-
-.bar, #AABBCC {
-  background-color:#FFee11;
-  border-color:#00fF11 #ABCDEF;
-  filter: chroma(color=#11FFFFFF);
-  color:#441122;
-}
-
-.foo, #AABBCC.foobar {
-  background-color:#ffee11;
-  border-color:#00fF11 #ABCDEF #AABbCc;
-  color:#441122;
-}
-
-@media screen {
-    .bar, #AABBCC {
-      background-color:#ffEE11;
-      color:#441122
-    }
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color.css.min
deleted file mode 100644
index cf2103a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/color.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.color{me:#7b7b7b;impressed:#fed;again:#abcdef;andagain:#a6c;background-color:#aa66ccc;filter:chroma(color="#FFFFFF");background:none repeat scroll 0 0 #f00;alpha:rgba(1,2,3,4);color:#12a}#AABBCC{background-color:#fe1;filter:chroma(color = #FFFFFF);color:#412;foo:#0f1 #ABC #abc #123344;border-color:#aa66ccC}.foo #AABBCC{background-color:#fe1;color:#412;border-color:#AbC;filter:chroma(color= #FFFFFF)}.bar,#AABBCC{background-color:#fe1;border-color:#0f1 #abcdef;filter:chroma(color=#11FFFFFF);color:#412}.foo,#AABBCC.foobar{background-color:#fe1;border-color:#0f1 #abcdef #abc;color:#412}@media screen{.bar,#AABBCC{background-color:#fe1;color:#412}}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/comment.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/comment.css
deleted file mode 100644
index 7073b9e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/comment.css
+++ /dev/null
@@ -1,3 +0,0 @@
-html >/**/ body p {
-    color: blue; 
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/comment.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/comment.css.min
deleted file mode 100644
index b280371..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/comment.css.min
+++ /dev/null
@@ -1 +0,0 @@
-html>/**/body p{color:blue}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/concat-charset.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/concat-charset.css
deleted file mode 100644
index 87ca565..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/concat-charset.css
+++ /dev/null
@@ -1,15 +0,0 @@
-/* This is invalid CSS, but frequently happens as a result of concatenation. */
-@charset "utf-8";
-#foo {
-	border-width:1px;
-}
-/*
-Note that this is erroneous!
-The actual CSS file can only have a single charset.
-However, this is the job of the author/application.
-The compressor should not get involved.
-*/
-@charset "another one";
-#bar {
-	border-width:10px;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/concat-charset.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/concat-charset.css.min
deleted file mode 100644
index 73e8d3b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/concat-charset.css.min
+++ /dev/null
@@ -1 +0,0 @@
-@charset "utf-8";#foo{border-width:1px}#bar{border-width:10px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-doublequotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-doublequotes.css
deleted file mode 100644
index 49a1315..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-doublequotes.css
+++ /dev/null
@@ -1,23 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,
-.yui3-skin-night .yui3-dial-center-button-vml,
-.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night .yui3-dial-marker-vml,
-.yui3-skin-night .yui3-dial-handle-vml {
-    background: none;
-    opacity:1;
-}
-
-div.base64-doublequotes {
-    width:100px;
-    height:100px;
-    background-image:url(   "data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ" );
-    background-position:center center;
-    border:1px solid #00aa00;
-}
-
-.yui-skin-sam .yui-h-slider {
-    background: url(bg-h.gif) no-repeat 5px 0;
-    height: 28px;
-    width: 228px;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-doublequotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-doublequotes.css.min
deleted file mode 100644
index 223d27a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-doublequotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ");background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-eof.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-eof.css
deleted file mode 100644
index a50ad77..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-eof.css
+++ /dev/null
@@ -1,10 +0,0 @@
-div.base64-singlequotes {
-    width:100px;
-    height:100px;
-    background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');
-    background-position:center center;
-    border:1px solid #00aa00;
-}
-div.otherdataurl {
-    background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-eof.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-eof.css.min
deleted file mode 100644
index 1f6d2e2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-eof.css.min
+++ /dev/null
@@ -1 +0,0 @@
-div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #0a0}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-linebreakindata.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-linebreakindata.css
deleted file mode 100644
index c3f686f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-linebreakindata.css
+++ /dev/null
@@ -1,34 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,
-.yui3-skin-night .yui3-dial-center-button-vml,
-.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night .yui3-dial-marker-vml,
-.yui3-skin-night .yui3-dial-handle-vml {
-    background: none;
-    opacity:1;
-}
-
-div.base64-doublequotes {
-    width:100px;
-    height:100px;
-    background-image:url(   "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwq
-                                                    wjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWi
-                                                    iBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv
-                                                    1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOM
-                                                    hWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtT
-                                                    vICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYm
-                                                    yeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDi
-                                                    QonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BW
-                                                    rozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OB
-                                                    GjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2Fu
-                                                    pH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6
-                                                    EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC" );
-    background-position:center center;
-    border:1px solid #00aa00;
-}
-
-.yui-skin-sam .yui-h-slider {
-    background: url(bg-h.gif) no-repeat 5px 0;
-    height: 28px;
-    width: 228px;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-linebreakindata.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-linebreakindata.css.min
deleted file mode 100644
index 1ac0e17..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-linebreakindata.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-noquotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-noquotes.css
deleted file mode 100644
index 71b0962..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-noquotes.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,
-.yui3-skin-night .yui3-dial-center-button-vml,
-.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night .yui3-dial-marker-vml,
-.yui3-skin-night .yui3-dial-handle-vml {
-    background: none;
-    opacity:1;
-}
-
-div.base64-noquotes {
-    width:100px;
-    height:100px;
-    background-image:url(   
-        data:image/jpeg;base64,
-        %2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ   
-    );
-    background-position:center center;
-    border:1px solid #00aa00;
-}
-
-.yui-skin-sam .yui-h-slider {
-    background: url(bg-h.gif) no-repeat 5px 0;
-    height: 28px;
-    width: 228px;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-noquotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-noquotes.css.min
deleted file mode 100644
index f57be99..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-noquotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-noquotes{width:100px;height:100px;background-image:url(data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ);background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-singlequotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-singlequotes.css
deleted file mode 100644
index 1ec9f67..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-singlequotes.css
+++ /dev/null
@@ -1,23 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,
-.yui3-skin-night .yui3-dial-center-button-vml,
-.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night .yui3-dial-marker-vml,
-.yui3-skin-night .yui3-dial-handle-vml {
-    background: none;
-    opacity:1;
-}
-
-div.base64-singlequotes {
-    width:100px;
-    height:100px;
-    background-image:url('data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ');
-    background-position:center center;
-    border:1px solid #00aa00;
-}
-
-.yui-skin-sam .yui-h-slider {
-    background: url(bg-h.gif) no-repeat 5px 0;
-    height: 28px;
-    width: 228px;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-singlequotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-singlequotes.css.min
deleted file mode 100644
index 8f3398d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-singlequotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ');background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-twourls.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-twourls.css
deleted file mode 100644
index 222342f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-twourls.css
+++ /dev/null
@@ -1,27 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,
-.yui3-skin-night .yui3-dial-center-button-vml,
-.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night v\:oval.yui3-dial-marker-max-min,
-.yui3-skin-night .yui3-dial-marker-vml,
-.yui3-skin-night .yui3-dial-handle-vml {
-    background: none;
-    opacity:1;
-}
-
-div.base64-singlequotes {
-    width:100px;
-    height:100px;
-    background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');
-    background-position:center center;
-    border:1px solid #00aa00;
-}
-
-div.otherdataurl {
-    background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");
-}
-
-.yui-skin-sam .yui-h-slider {
-    background: url(bg-h.gif) no-repeat 5px 0;
-    height: 28px;
-    width: 228px;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-twourls.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-twourls.css.min
deleted file mode 100644
index d919bca..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-base64-twourls.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #0a0}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-dbquote-font.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-dbquote-font.css
deleted file mode 100644
index f9799d7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-dbquote-font.css
+++ /dev/null
@@ -1,30 +0,0 @@
-/*csslint fontfamily: true*/
-
-/**
- * Foo
- */
-
-.y-ff-1 {
-    font-family:"Foo Bar",Helvetica,Arial;
-    text-rendering: optimizeLegibility;
-}
-
-.ua-op .y-ff-1 {
-    /* Some Comment */
-    font-family:Helvetica,Arial;
-}
-
-/*
-Foo
-
-Bar
-*/
-
-@font-face {
-	font-family: "Foo Bar";
-    src: url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"),
-	     url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");
-	font-weight: normal;
-	font-style: normal;
-}
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-dbquote-font.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-dbquote-font.css.min
deleted file mode 100644
index 7c4c0ed..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-dbquote-font.css.min
+++ /dev/null
@@ -1,5 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-doublequotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-doublequotes.css
deleted file mode 100644
index 0d45c94..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-doublequotes.css
+++ /dev/null
@@ -1,13 +0,0 @@
-div.nonbase64-doublequotes {
-    width:100px;
-    height:100px;
-    background-image:url(
-        "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82"
-    );
-    border:1px solid #00aa00;
-}
-
-span.othercss {
-    font-family:"Times New Roman";
-    font-weight:inherit;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-doublequotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-doublequotes.css.min
deleted file mode 100644
index 1acc41d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-doublequotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-doublequotes{width:100px;height:100px;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82");border:1px solid #0a0}span.othercss{font-family:"Times New Roman";font-weight:inherit}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-noquotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-noquotes.css
deleted file mode 100644
index b4bc9b2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-noquotes.css
+++ /dev/null
@@ -1,11 +0,0 @@
-div.nonbase64-noquotes {
-    width:100px;
-    height:100px;
-    background-image:url( data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82 );
-    border:1px solid red;
-}
-
-span.othercss {
-    font-family:"Times New Roman";
-    font-weight:inherit;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-noquotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-noquotes.css.min
deleted file mode 100644
index 8f4bf08..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-noquotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-noquotes{width:100px;height:100px;background-image:url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82);border:1px solid red}span.othercss{font-family:"Times New Roman";font-weight:inherit}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-singlequotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-singlequotes.css
deleted file mode 100644
index 0488549..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-singlequotes.css
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Some Comment */
-
-div.nonbase64-singlequotes {
-    width:100px;
-    height:100px;
-    background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82');
-    border:1px solid #0000aa;
-}
-
-/* Some Other Comment */
-
-span.othercss {
-    font-family:"Times New Roman";
-    font-weight:inherit;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-singlequotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-singlequotes.css.min
deleted file mode 100644
index badbf06..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-nonbase64-singlequotes.css.min
+++ /dev/null
@@ -1,2 +0,0 @@
-div.nonbase64-singlequotes{width:100px;height:100px;background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82');border:1px solid #00a}span.othercss{font-family:"Times New Roman";font-weight:inherit}
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-noquote-multiline-font.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-noquote-multiline-font.css
deleted file mode 100644
index 722c7ed..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-noquote-multiline-font.css
+++ /dev/null
@@ -1,31 +0,0 @@
-/*csslint fontfamily: true*/
-
-/**
- * Foo
- */
-
-.y-ff-1 {
-    font-family:"Foo Bar",Helvetica,Arial;
-    text-rendering: optimizeLegibility;
-}
-
-.ua-op .y-ff-1 {
-    /* Some Comment */
-    font-family:Helvetica,Arial;
-}
-
-/*
-Foo
-
-Bar
-*/
-
-@font-face {
-    font-family: "Foo Bar";
-    src: url(
-            data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"),
-         url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");
-    font-weight: normal;
-    font-style: normal;
-}
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-noquote-multiline-font.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-noquote-multiline-font.css.min
deleted file mode 100644
index 6b32e33..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-noquote-multiline-font.css.min
+++ /dev/null
@@ -1,3 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url(data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-doublequotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-doublequotes.css
deleted file mode 100644
index e86097c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-doublequotes.css
+++ /dev/null
@@ -1,90 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar {
-    -webkit-transform: translate3d(0, 0, 0);
-    -moz-transform: translate(0, 0); 
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, 
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-radius:3px;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==");
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-bottom-right-radius:0; 
-    border-bottom-left-radius:0;
-
-    -webkit-border-bottom-right-radius:0; 
-    -webkit-border-bottom-left-radius:0;
-
-    -moz-border-radius-bottomright:0; 
-    -moz-border-radius-bottomleft:0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-radius:0; 
-    border-bottom-right-radius:3px; 
-    border-bottom-left-radius:3px; 
-
-    -webkit-border-radius:0; 
-    -webkit-border-bottom-right-radius:3px; 
-    -webkit-border-bottom-left-radius:3px; 
-    -webkit-transform: translate3d(0, 0, 0);
-
-    -moz-border-radius:0; 
-    -moz-border-radius-bottomright:3px; 
-    -moz-border-radius-bottomleft:3px; 
-    -moz-transform: translate(0, 0);
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle {
-    border-radius:0; 
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0; 
-
-    -webkit-transform: translate3d(0,0,0) scaleY(1); 
-    -webkit-transform-origin-y: 0;
-
-    -moz-transform: translate(0,0) scaleY(1); 
-    -moz-transform-origin: 0 0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last {
-    border-top-right-radius: 0;
-    border-bottom-left-radius: 3px;
- 
-    -webkit-border-top-right-radius: 0;
-    -webkit-border-bottom-left-radius: 3px;
-
-    -moz-border-radius-topright: 0;
-    -moz-border-radius-bottomleft: 3px;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last {
-    border-bottom-left-radius: 0; 
-    border-top-right-radius: 3px;
-
-    -webkit-border-bottom-left-radius: 0; 
-    -webkit-border-top-right-radius: 3px;
-
-    -moz-border-radius-bottomleft: 0; 
-    -moz-border-radius-topright: 3px; 
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { 
-    -webkit-transform: translate3d(0,0,0) scaleX(1); 
-    -webkit-transform-origin: 0 0;
-
-    -moz-transform: translate(0,0) scaleX(1); 
-    -moz-transform-origin: 0 0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child {
-    background-color: #aaa;
-    background-image: none;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-doublequotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-doublequotes.css.min
deleted file mode 100644
index f9e7600..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-doublequotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==")}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-noquotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-noquotes.css
deleted file mode 100644
index ddf720e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-noquotes.css
+++ /dev/null
@@ -1,90 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar {
-    -webkit-transform: translate3d(0, 0, 0);
-    -moz-transform: translate(0, 0); 
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, 
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-radius:3px;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==);
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-bottom-right-radius:0; 
-    border-bottom-left-radius:0;
-
-    -webkit-border-bottom-right-radius:0; 
-    -webkit-border-bottom-left-radius:0;
-
-    -moz-border-radius-bottomright:0; 
-    -moz-border-radius-bottomleft:0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-radius:0; 
-    border-bottom-right-radius:3px; 
-    border-bottom-left-radius:3px; 
-
-    -webkit-border-radius:0; 
-    -webkit-border-bottom-right-radius:3px; 
-    -webkit-border-bottom-left-radius:3px; 
-    -webkit-transform: translate3d(0, 0, 0);
-
-    -moz-border-radius:0; 
-    -moz-border-radius-bottomright:3px; 
-    -moz-border-radius-bottomleft:3px; 
-    -moz-transform: translate(0, 0);
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle {
-    border-radius:0; 
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0; 
-
-    -webkit-transform: translate3d(0,0,0) scaleY(1); 
-    -webkit-transform-origin-y: 0;
-
-    -moz-transform: translate(0,0) scaleY(1); 
-    -moz-transform-origin: 0 0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last {
-    border-top-right-radius: 0;
-    border-bottom-left-radius: 3px;
- 
-    -webkit-border-top-right-radius: 0;
-    -webkit-border-bottom-left-radius: 3px;
-
-    -moz-border-radius-topright: 0;
-    -moz-border-radius-bottomleft: 3px;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last {
-    border-bottom-left-radius: 0; 
-    border-top-right-radius: 3px;
-
-    -webkit-border-bottom-left-radius: 0; 
-    -webkit-border-top-right-radius: 3px;
-
-    -moz-border-radius-bottomleft: 0; 
-    -moz-border-radius-topright: 3px; 
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { 
-    -webkit-transform: translate3d(0,0,0) scaleX(1); 
-    -webkit-transform-origin: 0 0;
-
-    -moz-transform: translate(0,0) scaleX(1); 
-    -moz-transform-origin: 0 0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child {
-    background-color: #aaa;
-    background-image: none;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-noquotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-noquotes.css.min
deleted file mode 100644
index 110f9fc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-noquotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-singlequotes.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-singlequotes.css
deleted file mode 100644
index 9d6ec7a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-singlequotes.css
+++ /dev/null
@@ -1,90 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar {
-    -webkit-transform: translate3d(0, 0, 0);
-    -moz-transform: translate(0, 0); 
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, 
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-radius:3px;
-    -webkit-border-radius: 3px;
-    -moz-border-radius: 3px;
-    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==');
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-bottom-right-radius:0; 
-    border-bottom-left-radius:0;
-
-    -webkit-border-bottom-right-radius:0; 
-    -webkit-border-bottom-left-radius:0;
-
-    -moz-border-radius-bottomright:0; 
-    -moz-border-radius-bottomleft:0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last {
-    border-radius:0; 
-    border-bottom-right-radius:3px; 
-    border-bottom-left-radius:3px; 
-
-    -webkit-border-radius:0; 
-    -webkit-border-bottom-right-radius:3px; 
-    -webkit-border-bottom-left-radius:3px; 
-    -webkit-transform: translate3d(0, 0, 0);
-
-    -moz-border-radius:0; 
-    -moz-border-radius-bottomright:3px; 
-    -moz-border-radius-bottomleft:3px; 
-    -moz-transform: translate(0, 0);
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle {
-    border-radius:0; 
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0; 
-
-    -webkit-transform: translate3d(0,0,0) scaleY(1); 
-    -webkit-transform-origin-y: 0;
-
-    -moz-transform: translate(0,0) scaleY(1); 
-    -moz-transform-origin: 0 0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last {
-    border-top-right-radius: 0;
-    border-bottom-left-radius: 3px;
- 
-    -webkit-border-top-right-radius: 0;
-    -webkit-border-bottom-left-radius: 3px;
-
-    -moz-border-radius-topright: 0;
-    -moz-border-radius-bottomleft: 3px;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last {
-    border-bottom-left-radius: 0; 
-    border-top-right-radius: 3px;
-
-    -webkit-border-bottom-left-radius: 0; 
-    -webkit-border-top-right-radius: 3px;
-
-    -moz-border-radius-bottomleft: 0; 
-    -moz-border-radius-topright: 3px; 
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { 
-    -webkit-transform: translate3d(0,0,0) scaleX(1); 
-    -webkit-transform-origin: 0 0;
-
-    -moz-transform: translate(0,0) scaleX(1); 
-    -moz-transform-origin: 0 0;
-}
-
-.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,
-.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child {
-    background-color: #aaa;
-    background-image: none;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-singlequotes.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-singlequotes.css.min
deleted file mode 100644
index 1a4e2c6..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-singlequotes.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==')}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-yuiapp.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-yuiapp.css
deleted file mode 100644
index 78d615d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-yuiapp.css
+++ /dev/null
@@ -1,106 +0,0 @@
-html {
-    background: #fff;
-    color: #555;
-    height: 100%;
-}
- 
-#hd, #bd, #ft {
-    padding: 0 50px;
-}
- 
-#bd {
-    padding-bottom: 50px;
-    border-bottom: 1px solid #006e9c;
-}
- 
-#ft {
-    background: transparent no-repeat 0% 100%;
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=);
-    /* image width: 55px */
-    padding: 0 0 40px 0;
-    margin: 50px;
-}
- 
-#hd, #bd {
-    background: #f9f9f9;
-}
- 
-body {
-    margin: 0;
-    padding: 0;
-    font: 12px "Helvetica Nueue", Arial, sans-serif;
-}
- 
-#hd {
-    color: #fff;
-    padding-top: 50px;
-    margin: 0;
-}
- 
-#hd, h1, h2, p, .color {
-    margin: auto;
-}
- 
-h1, h2, a {
-    color: #006e9c;
-}
- 
-h1, h2 {
-    margin-top: 0;
-}
- 
-h4 .title  {
-    font-weight: bold;
-    letter-spacing: -2px;
-    font-size: 47px;
-    text-shadow: 0 1px 0 #369;
-    background: #006e9d;
-    color: #fff;
-    padding: 0 10px;
-}
- 
-h4 {
-    display: block;
-    float: right;
-    margin: 0 0 0 20px;
-}
- 
-h4 .what {
-    display: block;
-    padding: 4px;
-    text-align: center;
-    font-weight: normal;
-}
- 
-h4 .version {
-    font-size: 11px;
-    color: #ccc;
-}
- 
-h2 {
-    font-size: 40px;
-    font-family: "HelveticaNeue-Light", "Helvetica Neue Light",
-                 "Helvetica Neue", sans-serif;
-    font-weight: 300;
-}
- 
-h4, p {
-    padding: 6px 0 6px;
-}
- 
-#ft p.fine, #ft p.fine a {
-    color: #999;
-}
- 
-#ft p.intro {
-    font-size: 12px;
-}
- 
-#bd {
-    font-size: 14px;
-    color: #666;
-}
- 
-#ft p {
-    font-size: 11px;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-yuiapp.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-yuiapp.css.min
deleted file mode 100644
index 8d58663..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-realdata-yuiapp.css.min
+++ /dev/null
@@ -1 +0,0 @@
-html{background:#fff;color:#555;height:100%}#hd,#bd,#ft{padding:0 50px}#bd{padding-bottom:50px;border-bottom:1px solid #006e9c}#ft{background:transparent no-repeat 0 100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=);padding:0 0 40px 0;margin:50px}#hd,#bd{background:#f9f9f9}body{margin:0;padding:0;font:12px "Helvetica Nueue",Arial,sans-serif}#hd{color:#fff;padding-top:50px;margin:0}#hd,h1,h2,p,.color{margin:auto}h1,h2,a{color:#006e9c}h1,h2{margin-top:0}h4 .title{font-weight:bold;letter-spacing:-2px;font-size:47px;text-shadow:0 1px 0 #369;background:#006e9d;color:#fff;padding:0 10px}h4{display:block;float:right;margin:0 0 0 20px}h4 .what{display:block;padding:4px;text-align:center;font-weight:normal}h4 .version{font-size:11px;color:#ccc}h2{font-size:40px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:300}h4,p{padding:6px 0 6px}#ft p.fine,#ft p.fine a{color:#999}#ft p.intro{font-size:12px}#bd{font-size:14px;color:#666}#ft p{font-size:11px}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-singlequote-font.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-singlequote-font.css
deleted file mode 100644
index 91bb3ed..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-singlequote-font.css
+++ /dev/null
@@ -1,30 +0,0 @@
-/*csslint fontfamily: true*/
-
-/**
- * Foo
- */
-
-.y-ff-1 {
-    font-family:"Foo Bar",Helvetica,Arial;
-    text-rendering: optimizeLegibility;
-}
-
-.ua-op .y-ff-1 {
-    /* Some Comment */
-    font-family:Helvetica,Arial;
-}
-
-/*
-Foo
-
-Bar
-*/
-
-@font-face {
-    font-family: "Foo Bar";
-    src: url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"),
-         url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");
-    font-weight: normal;
-    font-style: normal;
-}
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-singlequote-font.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-singlequote-font.css.min
deleted file mode 100644
index fd51d54..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dataurl-singlequote-font.css.min
+++ /dev/null
@@ -1,3 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/decimals.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/decimals.css
deleted file mode 100644
index 9593979..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/decimals.css
+++ /dev/null
@@ -1,3 +0,0 @@
-::selection { 
-  margin: 0.6px 0.333pt 1.2em 8.8cm;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/decimals.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/decimals.css.min
deleted file mode 100644
index 4dadedc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/decimals.css.min
+++ /dev/null
@@ -1 +0,0 @@
-::selection{margin:.6px .333pt 1.2em 8.8cm}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dollar-header.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dollar-header.css
deleted file mode 100644
index 43999c4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dollar-header.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
-$Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $
-*/
-
-foo {
-	bar: baz
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dollar-header.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dollar-header.css.min
deleted file mode 100644
index 9308100..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/dollar-header.css.min
+++ /dev/null
@@ -1,3 +0,0 @@
-/*!
-$Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $
-*/foo{bar:baz}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/font-face.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/font-face.css
deleted file mode 100644
index 4b6956c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/font-face.css
+++ /dev/null
@@ -1,6 +0,0 @@
-@font-face {
-  font-family: 'gzipper';
-  src: url(yanone.eot);
-  src: local('gzipper'), 
-          url(yanone.ttf) format('truetype');
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/font-face.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/font-face.css.min
deleted file mode 100644
index 3a1077c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/font-face.css.min
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:'gzipper';src:url(yanone.eot);src:local('gzipper'),url(yanone.ttf) format('truetype')}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/ie5mac.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/ie5mac.css
deleted file mode 100644
index e4d5204..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/ie5mac.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Ignore the next rule in IE mac \*/
-.selector {
-   color: khaki;
-}
-/* Stop ignoring in IE mac */
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/ie5mac.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/ie5mac.css.min
deleted file mode 100644
index f90df41..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/ie5mac.css.min
+++ /dev/null
@@ -1 +0,0 @@
-/*\*/.selector{color:khaki}/**/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-empty-class.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-empty-class.css
deleted file mode 100644
index d2f22d5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-empty-class.css
+++ /dev/null
@@ -1,16 +0,0 @@
-/*! preserved */
-emptiness {}
-
-@import "another.css";
-/* I'm empty - delete me */
-empty { ;}
-
-@media print {
-	.noprint { display: none; }
-}
-
-@media screen {
-	/* this rule should be removed, not simply minified.*/
-	.breakme {}
-	.printonly { display: none; }
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-empty-class.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-empty-class.css.min
deleted file mode 100644
index 0350c7f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-empty-class.css.min
+++ /dev/null
@@ -1 +0,0 @@
-/*! preserved */@import "another.css";@media print{.noprint{display:none}}@media screen{.printonly{display:none}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-multi.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-multi.css
deleted file mode 100644
index c589771..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-multi.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@media only all and (max-width:50em), only all and (max-device-width:800px), only all and (max-width:780px) {
-  some-css : here
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-multi.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-multi.css.min
deleted file mode 100644
index 57b52f7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-multi.css.min
+++ /dev/null
@@ -1 +0,0 @@
-@media only all and (max-width:50em),only all and (max-device-width:800px),only all and (max-width:780px){some-css:here}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-test.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-test.css
deleted file mode 100644
index af118ff..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-test.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@media screen and (-webkit-min-device-pixel-ratio:0) {
-  some-css : here
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-test.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-test.css.min
deleted file mode 100644
index 0e7168e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/media-test.css.min
+++ /dev/null
@@ -1 +0,0 @@
-@media screen and (-webkit-min-device-pixel-ratio:0){some-css:here}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/opacity-filter.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/opacity-filter.css
deleted file mode 100644
index 60deca7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/opacity-filter.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/*  example from https://developer.mozilla.org/en/CSS/opacity */
-pre {                               /* make the box translucent (80% opaque) */
-   border: solid red;
-   opacity: 0.8;                    /* Firefox, Safari(WebKit), Opera */
-   -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE 8 */
-   filter: PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80);       /* IE 4-7 */
-   zoom: 1;       /* set "zoom", "width" or "height" to trigger "hasLayout" in IE 7 and lower */ 
-}
-
-/** and again */
-code {
-   -ms-filter: "PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE 8 */
-   filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);       /* IE 4-7 */
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/opacity-filter.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/opacity-filter.css.min
deleted file mode 100644
index 99b4fa8..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/opacity-filter.css.min
+++ /dev/null
@@ -1 +0,0 @@
-pre{border:solid red;opacity:.8;-ms-filter:"alpha(opacity=80)";filter:alpha(opacity=80);zoom:1}code{-ms-filter:"alpha(opacity=80)";filter:alpha(opacity=80)}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/background-position.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/background-position.out
deleted file mode 100644
index fd00a91..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/background-position.out
+++ /dev/null
@@ -1 +0,0 @@
-a{background-position:0 0 0 0}b{BACKGROUND-POSITION:0 0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/background-position.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/background-position.out.b
deleted file mode 100644
index fd00a91..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/background-position.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a{background-position:0 0 0 0}b{BACKGROUND-POSITION:0 0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/border-none.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/border-none.out
deleted file mode 100644
index 2d0a801..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/border-none.out
+++ /dev/null
@@ -1 +0,0 @@
-a{border:none}b{BACKGROUND:none}s{border-top:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/border-none.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/border-none.out.b
deleted file mode 100644
index 2d0a801..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/border-none.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a{border:none}b{BACKGROUND:none}s{border-top:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/box-model-hack.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/box-model-hack.out
deleted file mode 100644
index 3340179..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/box-model-hack.out
+++ /dev/null
@@ -1 +0,0 @@
-#elem{width:100px;voice-family:"\"}\"";voice-family:inherit;width:200px}html>body #elem{width:200px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/box-model-hack.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/box-model-hack.out.b
deleted file mode 100644
index 3340179..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/box-model-hack.out.b
+++ /dev/null
@@ -1 +0,0 @@
-#elem{width:100px;voice-family:"\"}\"";voice-family:inherit;width:200px}html>body #elem{width:200px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527974.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527974.out
deleted file mode 100644
index 223a62e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527974.out
+++ /dev/null
@@ -1 +0,0 @@
-body{yo:cats}ul[id$=foo] label:hover{yo:yo}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527974.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527974.out.b
deleted file mode 100644
index 00cc007..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527974.out.b
+++ /dev/null
@@ -1 +0,0 @@
-/*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */body{yo:cats}ul[id$=foo] label:hover{yo:yo}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527991.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527991.out
deleted file mode 100644
index d382e11..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527991.out
+++ /dev/null
@@ -1 +0,0 @@
-@media screen and (-webkit-min-device-pixel-ratio:0){a{b:1}}@media screen and (-webkit-min-device-pixel-ratio:0){a{b:1}}@media -webkit-min-device-pixel-ratio:0{a{b:1}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527991.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527991.out.b
deleted file mode 100644
index e417b6a..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527991.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media screen and /*!YUI-Compresser */(-webkit-min-device-pixel-ratio:0){a{b:1}}@media screen and /*! *//*! */(-webkit-min-device-pixel-ratio:0){a{b:1}}@media -webkit-min-device-pixel-ratio:0{a{b:1}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527998.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527998.out
deleted file mode 100644
index ab5f11c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527998.out
+++ /dev/null
@@ -1 +0,0 @@
-body{}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527998.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527998.out.b
deleted file mode 100644
index 9d49cde..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2527998.out.b
+++ /dev/null
@@ -1 +0,0 @@
-/*! special */body{}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2528034.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2528034.out
deleted file mode 100644
index d43fa34..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2528034.out
+++ /dev/null
@@ -1 +0,0 @@
-a[href$="/test/"] span:first-child{b:1}a[href$="/test/"] span:first-child{}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2528034.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2528034.out.b
deleted file mode 100644
index d43fa34..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/bug2528034.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a[href$="/test/"] span:first-child{b:1}a[href$="/test/"] span:first-child{}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/charset-media.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/charset-media.out
deleted file mode 100644
index 9387b8f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/charset-media.out
+++ /dev/null
@@ -1 +0,0 @@
-@charset 'utf-8';@media all{body{}body{background-color:gold}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/charset-media.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/charset-media.out.b
deleted file mode 100644
index 9387b8f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/charset-media.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@charset 'utf-8';@media all{body{}body{background-color:gold}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color-simple.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color-simple.out
deleted file mode 100644
index 2174146..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color-simple.out
+++ /dev/null
@@ -1 +0,0 @@
-.foo,#AABBCC{background-color:#aabbcc;border-color:#Ee66aA #ABCDEF #FeAb2C;filter:chroma(color=#FFFFFF);filter:chroma(color="#AABBCC");filter:chroma(color='#BBDDEE');color:#112233}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color-simple.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color-simple.out.b
deleted file mode 100644
index 2174146..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color-simple.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.foo,#AABBCC{background-color:#aabbcc;border-color:#Ee66aA #ABCDEF #FeAb2C;filter:chroma(color=#FFFFFF);filter:chroma(color="#AABBCC");filter:chroma(color='#BBDDEE');color:#112233}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color.out
deleted file mode 100644
index 1f098e4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color.out
+++ /dev/null
@@ -1 +0,0 @@
-.color{me:rgb(123,123,123);impressed:#FfEedD;again:#ABCDEF;andagain:#aa66cc;background-color:#aa66ccc;filter:chroma(color="#FFFFFF");background:none repeat scroll 0 0 rgb(255,0,0);alpha:rgba(1,2,3,4);color:#1122aa}#AABBCC{background-color:#ffee11;filter:chroma(color=#FFFFFF);color:#441122;foo:#00fF11 #ABC #AABbCc #123344;border-color:#aa66ccC}.foo #AABBCC{background-color:#fFEe11;color:#441122;border-color:#AbC;filter:chroma(color=#FFFFFF)}.bar,#AABBCC{background-color:#FFee11;border-color:#00fF11 #ABCDEF;filter:chroma(color=#11FFFFFF);color:#441122}.foo,#AABBCC.foobar{background-color:#ffee11;border-color:#00fF11 #ABCDEF #AABbCc;color:#441122}@media screen{.bar,#AABBCC{background-color:#ffEE11;color:#441122}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color.out.b
deleted file mode 100644
index 1f098e4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/color.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.color{me:rgb(123,123,123);impressed:#FfEedD;again:#ABCDEF;andagain:#aa66cc;background-color:#aa66ccc;filter:chroma(color="#FFFFFF");background:none repeat scroll 0 0 rgb(255,0,0);alpha:rgba(1,2,3,4);color:#1122aa}#AABBCC{background-color:#ffee11;filter:chroma(color=#FFFFFF);color:#441122;foo:#00fF11 #ABC #AABbCc #123344;border-color:#aa66ccC}.foo #AABBCC{background-color:#fFEe11;color:#441122;border-color:#AbC;filter:chroma(color=#FFFFFF)}.bar,#AABBCC{background-color:#FFee11;border-color:#00fF11 #ABCDEF;filter:chroma(color=#11FFFFFF);color:#441122}.foo,#AABBCC.foobar{background-color:#ffee11;border-color:#00fF11 #ABCDEF #AABbCc;color:#441122}@media screen{.bar,#AABBCC{background-color:#ffEE11;color:#441122}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/comment.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/comment.out
deleted file mode 100644
index b280371..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/comment.out
+++ /dev/null
@@ -1 +0,0 @@
-html>/**/body p{color:blue}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/comment.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/comment.out.b
deleted file mode 100644
index b280371..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/comment.out.b
+++ /dev/null
@@ -1 +0,0 @@
-html>/**/body p{color:blue}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/concat-charset.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/concat-charset.out
deleted file mode 100644
index 20967ab..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/concat-charset.out
+++ /dev/null
@@ -1 +0,0 @@
-@charset "utf-8";#foo{border-width:1px}@charset "another one";#bar{border-width:10px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/concat-charset.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/concat-charset.out.b
deleted file mode 100644
index 20967ab..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/concat-charset.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@charset "utf-8";#foo{border-width:1px}@charset "another one";#bar{border-width:10px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-doublequotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-doublequotes.out
deleted file mode 100644
index 1db2942..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-doublequotes.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ");background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-doublequotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-doublequotes.out.b
deleted file mode 100644
index 1db2942..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-doublequotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ");background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-eof.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-eof.out
deleted file mode 100644
index d9007b5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-eof.out
+++ /dev/null
@@ -1 +0,0 @@
-div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #00aa00}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-eof.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-eof.out.b
deleted file mode 100644
index d9007b5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-eof.out.b
+++ /dev/null
@@ -1 +0,0 @@
-div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #00aa00}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-linebreakindata.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-linebreakindata.out
deleted file mode 100644
index 64dbe31..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-linebreakindata.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-linebreakindata.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-linebreakindata.out.b
deleted file mode 100644
index 64dbe31..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-linebreakindata.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-noquotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-noquotes.out
deleted file mode 100644
index 7a34c0c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-noquotes.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-noquotes{width:100px;height:100px;background-image:url(data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ);background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-noquotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-noquotes.out.b
deleted file mode 100644
index 7a34c0c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-noquotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-noquotes{width:100px;height:100px;background-image:url(data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ);background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-singlequotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-singlequotes.out
deleted file mode 100644
index 1da5b6d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-singlequotes.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ');background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-singlequotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-singlequotes.out.b
deleted file mode 100644
index 1da5b6d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-singlequotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/jpeg;base64,%2F9j%2F4AAQSkZJRgABAgEAZABkAAD%2F4RfJRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAAD0JAAAAnEAAPQkAAACcQQWRvYmUgUGhvdG9zaG9wIENTMiBNYWNpbnRvc2gAMjAwODowNzoxOSAxNDo1ODowNQAAA6ABAAMAAAAB%2F%2F8AAKACAAQAAAABAAABwqADAAQAAAABAAABRQAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABaTAAAAAAAAAEgAAAABAAAASAAAAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZ%2F%2B01IlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D6gAAAAAYEDw%2FeG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8%2BCjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk%2BCgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0aW9uPC9rZXk%2BCgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJPGRpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC9rZXk%2BCgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q%2BCgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxSZXM8L2tleT4KCQkJCTxyZWFsPjcyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk%2BCgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJCQkJPHJlYWw%2BMTwvcmVhbD4KCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk%2BCgk8ZGljdD4KCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNUFBEUGFwZXJDb2RlTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BUE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPm5hLWxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk%2BCgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk%2BCgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw%2BCgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJOYW1lPC9rZXk%2BCgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk%2BCgkJCQkJPGludGVnZXI%2BMDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q%2BCgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk%2BCgkJPGRpY3Q%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk%2BCgkJCTxzdHJpbmc%2BY29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk%2BCgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BMC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw%2BCgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw%2BLTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw%2BCgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw%2BNTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc%2BCgkJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLnBwZC5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpbmc%2BVVMgTGV0dGVyPC9zdHJpbmc%2BCgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI%2BCgkJCQk8L2RpY3Q%2BCgkJCTwvYXJyYXk%2BCgkJPC9kaWN0PgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk%2BCgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk%2BY29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk%2BCgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc%2BCgk8L2RpY3Q%2BCgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc%2BY29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo4QklNA%2BkAAAAAAHgAAwAAAEgASAAAAAAC3gJA%2F%2B7%2F7gMGAlIDZwUoA%2FwAAgAAAEgASAAAAAAC2AIoAAEAAABkAAAAAQADAwMAAAABf%2F8AAQABAAAAAAAAAAAAAAAAaAgAGQGQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNA%2B0AAAAAABAAZAAAAAEAAQBkAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD%2BAAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA%2FUAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA%2FgAAAAAAHAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAAAD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FA%2BgAAAAA%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwPoAAAAAP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8D6AAAOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1UAAAAGAAAAAAAAAAAAAAFFAAABwgAAABAAcwB3AGkAcwBzAF8AYQByAG0AeQBfAGsAbgBpAGYAZQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABwgAAAUUAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAUUAAAAAUmdodGxvbmcAAAHCAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAFFAAAAAFJnaHRsb25nAAABwgAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAE%2F8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAAThCSU0EDAAAAAAWrwAAAAEAAACgAAAAdAAAAeAAANmAAAAWkwAYAAH%2F2P%2FgABBKRklGAAECAABIAEgAAP%2FtAAxBZG9iZV9DTQAC%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgAdACgAwEiAAIRAQMRAf%2FdAAQACv%2FEAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5%2FcRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14%2FNGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x%2F%2FaAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUs4uDSWiXRoOJKFi3Ovx2Wvbse4e5gMwRo5soypdOyN9mTSRHpWvj4Oc4%2FwDVf9WkpupJJJKUkkkkpSSSSSlJJJJKUkkkkp%2F%2F0PVUklCqxttbbG%2FReA4fApKZpJJJKUo2WNrrdY8w1gLnHyAlVOsWvowXZDZ%2FQOZa8D9xrmm3%2FNr3PUswm%2FpmQGamyl4bHiWuhJTYqsFtTLBw9od94U1Q6FkfaOk4tszuqYfwV9JSll1%2FoOt2sOguDXgeTm7f%2FPmN%2FwCCLUWZ1VhrysbKA%2Bjua7zgtuZ%2F1FqIUXTSQcvKZi47sh7XOY0tBDYJhzms3akfR3blVd13prMtuI%2Bwse%2F6L3Ahm7n0%2FU%2Bi2zafzkFOgq9%2Bdj0ZFOM4k3ZDtrGNEnhzt7v3WbWPU8bJpyavVpduZuc2eNWONb2%2F2XtXOY2VU7rA6hnO9RuJS%2Br1hO1lguGJbuYz2extvv3fzLPU%2FwCESU9QkkkkpSSSSSlJJJJKf%2F%2FR9VWf0iwiu3Ff9LGsewT%2B6D7P%2FAyxy0FmunH6xPDMpgd%2FbZFT%2FwDoOx%2F%2B20Qp0lC02CtxqALwDtB4J8FNJBTVovx%2Bo4jvbLLGlltTuRMssrf%2FANJiz%2BhZDqMO%2FEyCX2dOc6t%2Bkuc1gmt%2B3%2FhaPTeoZ5s6R1IZrBGDlkNvI%2BjXcYYyx%2F7tWV9B%2FwDw%2FwDwlyD1LqWH0jq2N1O55rxOogY1rwC4C9uuP6mzdt9Wl1v6T%2Bb%2FAFdFS%2F1Myq%2F2VThusa%2B2tst2k6sPuY73Brm%2Fo3Vv2fy%2F3F0S4TAzq%2Bm%2FWDquKGnbhWOya62DUUlrcmyulktZ6f2ey19Wz8%2F2Ls2Z%2BFYx1jL6yxgBe%2FcIAI3CXfNIqZX3ursqqrZ6j7TqJgNY2PUsPP0dypfWJ%2Fo9NOT2xrarHTxs3tZkf%2By77VR6v9bejdNsbkb3Zbqm2sfVjgOOhrdZFljqsffXs%2FmvV9V%2F%2BDXHdZ%2BuvU8zA6i%2Bj02Y1zawaZLt2LY21tltb7XOb6j6%2FwDR1V%2FzV36v6rPVYFU%2BiCs5PS7cd43O2WUOB77d1X%2FT27lwvVnNyKK8d15q6hij207o9dg3DHdW9m9zLv8AQ%2F4Wu71K%2FTtr9aqzJ%2BuHV8tmR0zNoyLvsXU8Nr7cdtjmtN1J9K%2B2podsbk1%2Fo%2F8A0YsnG6te%2BnLZbdXXY6pttADNwucwmhv2cWbv0tnr%2FpKnfpKbKf8AtsqD1DvrjnfV70cKlldgzgbqjf7QHB3p2sG0sb6lv0%2FfZ6TEcZg630xz2vezK6jVbfhVtf6biQ%2BxltmNY7a2z9Js3Vu%2FwayvrHh1%2BhhdKv3XubjBhY9wDbHtPpOdXkOH6t1Dd%2FRsl%2F6C%2FwDomV7Fg9Wc%2FF%2Bq3RL6biben5WVjh4lljdxbexltf06La9vvp%2FM%2FwAFZ%2FhEuqn0r6lfXM9WYzpvVoo6wxvcbBcGj9Ltr09LLoj9bxf%2BvU%2Fof5mz9avrJd0%2B2jBwHAZTrcd17iA7bVZa2nY0H%2FCXw9v%2FAAdf%2FWl5zidQZ9ZcY3l3oddwg2z1mHZ6zWfQv3t2%2Bnk0%2FwCn%2FwDRf8xf6Df1DqvXGZ%2Be5tzsi7Gd6lm2kPsqNbqqOG1%2F4Cuxnpt%2FS7%2F9I9ALjR1Gh7f96%2BuJJpA1KZj2WNDmODmnhwMhJaySSSSU%2FwD%2F0vVVn9airFGYSGjEcLXuOkV%2Fzd5J%2FdZU%2FwBX%2Fra0EHM9D7Jf9pE4%2Fpv9YHX2bT6mn9RIKcE9U6lgXnJDv2l0jN%2FS497S39C530sOyxn%2BBc%2F%2Bh5P83%2F2kyfS%2FR5NlPrv16uwczExsPHFozLBRWHz6rriWM9Ouv6Hs9T3vseue6B9buoZF5xBU84BDC%2BtoZYW1PczG%2B02Gxm71Gb2XP2fod7P5mtct167q%2FT87Gdfk%2FbscWHI6V1NrQNGu3O2NZ6fp5FN9dTcrH3epR6f9RKwRYXzhKEuGYo%2FxfSMvM6lZlF%2FVfSobU11Q9MGyqLfa%2BrP9PJsr9Kz09n6bGq%2F7dWN1z9VxC3KfZT0%2B%2BPUyGg5NIaPdU7ezZe7KxPR%2FR5Gyr1sX9Db6%2FwDguZx%2Bv352be4WNwft%2B9tb2n21mza%2F07Xn2%2Fp7qmVep6dbP0vqfolqZD7mY91eDmXh9pBAZDGjT9awvb%2Bkp3W%2Fp2Mdkfpav1b%2BXUb0WulTeP23h5Di3JL3UYWTYzlzbKn1sc5rN7baM3FZ9pw8xrvSvr%2FQf0im6uvH6vY7G6hfS2mx1WFYaq7bnk%2Bo2r0rKPTa7bustxX20%2Bz%2Blf4RW%2FqPXeM403s%2FQ9LpdbQ4v97Wl4DcW1nud6PqfrH2e9nszMavNx%2Fs9%2F2hA6i5r77HZLH24Tn1W4%2BUwj2Pva3Jdj5bfzaHb8n7Fk%2F4P9YxP0tX8wulqaWfb1CzZ6GaM30622WDD%2FSV1mp3sfY6tjWOsY1tf8776a%2FTQ7s27qFNVIrqwAfUsbZRXt9S0N9Ky1tX83%2Bgre%2F1sej%2FAE1lzKltdDtbi9ZJsqqbTaBXdS0TbW68PycUxNj8qrIbR%2FpPU%2FSb6%2FTyv6VWf0qvOrzmsYasnGzHmk7gx1Za6K2XR7sd%2B5v6K79JXi3bPU%2FV8i71RRU5%2FWaLMv6kYj7SGX9L6g%2BqK%2Fosrymeux1cf4B17fYsrpuPmNxftz63Pcwl9DWDQ2sIqZkNJ%2FNZe6luR6f%2FAAX%2FAAS1f2pXX0vq%2BJln7LfkVVta3ZAfl4929myn%2FA76rLq86r%2Bbo%2F4qyhVruoZfSek4ldmM12Pe227D9XQBtvptu3%2B7d6Vr66Xf2PU%2FwiSnsuqnDyLMfFtMZORj%2BrXSPeHFseo2l7g31La%2FV%2Bh%2F2oq%2FwfqfpFznVcd9uDZivaxzDZXa1zztZaXB1LW%2Bv%2Fgb%2FZVXi5tv83%2FRsj9AsLqfXv2j0%2FpXqPFedgNurfa10F3uqsx8lv8Ao3Obvrf%2FAMT6n%2BFQquq59%2FURec1zb7CHXMc8htmw7n47v8BtucPUb6v6P9Ld69iNoS9H6Vk0Zzcpj3tqqeW1AAtuc%2F8Am7Meyhv6WvZ%2FNZX%2FAIEugzuk14eLiN69fbi49u6wgBjyWNb6dP6IOa52V6vt247P0dD%2FAFP0ajjdc6kBeekYQd1DIs2tsZVZbdVXt9tYqsG9%2B3%2FTPZ%2Bl%2FwBCsajpXV%2BtX2Zwo%2Fal7Wuvv9S0Mea2%2FT2%2BvZ7m1e1j6GV76PZ%2FpK0NE7avpH1Z69ndU6Ti4mP6mVZktBdbkP3uqbWTRkjKuYGb9t1e6v2776rP9Iuyw8VuJjtoaS8tkueeXOcdz3%2F2nLyb6vdZv6DjDKwmVt3lzbsZz3VsZcHluTgX499hfRYxuzJwn%2FznsyKrLLv8H2vT%2Fr9hODK%2BsM%2FZuSWkvrtFjC1wLmvr%2FWKqW%2Fm%2BzbZ%2BkRR4vVpKn03q%2FTeq47Mnp%2BQy%2Bt7WvG0%2B4Bw3N9Ss%2FpK%2F%2BuNVxBT%2FAP%2FT9VTOa17SxwDmuBDmnUEHsU6SSnxf6x9CzPqt1ECix7GMeben5Q0caneyylzvouto3MruZ%2Fhav0np%2FpFUryaMjFvrzps6dkPbZmUsHvx7zFber4f7rbLP6Wz%2FAEln%2BivYvY%2Bu9L6f1Xpl2H1GG0OG71SQ01uH0b2Pd9B7P%2FUb%2FwBGvH8vpF3T7%2FQpcH5NIea7az6leXSd2%2BzHjdW70qHbMnE%2FwlSZrE2NuzfjKHMY%2BGfpzR2n%2FL9H95wM%2FByOk5hxsgiyuwb6rm613VH6N1X%2FAKMrW10jqbrmHDyHl8MhjY3G6sHd6PO318dv6eiz07fW9P0v%2BOHiPxc6n9j552Ydh3YmVy7FtP5%2Bvvfiu%2Fw%2F%2FB%2Fpf5zehYv1a6pVk5WLnh%2BJZhML6rmiWvsBY6t1Fn0n1NY77Tvp%2FSf8WnijqNWnOEscjGQ4ZB7Oig0fV7Lf01rr8rqR2tez3XPbBx67XsYzayxjbMl9m38%2F9J%2Bl%2FS%2BpzrvUxMWqvqNVuJksx3402zW5oosbdScig725OHd9qY6v%2Bc2ZOLT6Nn88y3e6X1uyk9NexznYd%2BPdi2Mc1lTxl4ztznWu3bKfWZZXbs9T06f0ypdY6J1Hr%2FVH9Wrtpsx6mMqFDS%2F1WisF30XNa5%2B577bf0eyz%2FRV%2BqnHwW1RotDF6xay49Tviks9OHNBAc9g2sfc1m7Zu2%2FoG%2FQxv3PST9Lw2dTblM%2B1W1sdDixoM2vu3f0936Ot3pOZsurp%2FQ5H%2Bj%2FwaJj4GXf052ZjepRjbmOrywNzNjHulh9Meg5zN%2B1lrn%2F4R9fp%2FpFYxcHD6ey6nItdSGAOtdlFwhlh%2FRuHpN3Ppbv8A5xnqemgFOZ1%2FDyMW77T1DIOQy4vra91bqC00en%2BiYx%2F06Nrqnev%2FAIf%2FAEj1WxaG2sxKOo9Mu6iK32UYeOLHML3vLrNrrmu3%2Blv%2FAPRi1cvpl1PUqW3Nfh5VJ34%2BNmO9XEurHu%2FV7t1jGMsYf0noP9n%2FAANqv9Q6W84w630hn2cuFd1jcYGysjS6qzLxmiu3Fyadv896NX%2Bl%2B2eqhSSBQ1u%2Fwed6z9X%2BrtFJH1dZj1agENsqZuIB9EPsvbkW7Wj6eS%2F6fq%2Bj%2BjWOcbNw8hnqdNxq3tizZYXOa4Ty7fkWbmNd%2FObfof4RdpT1fqHUs1rc%2FLfktyRU2vGa4bSHNePtFL3el6VmLlVejZ7f0m%2F1cj%2BZ%2B0WbvSfqn0%2Fq1eTjdRIdlVspsqcxwBqc8PbfW%2BrX376%2FTtf%2FAKH0bcS6v2WJXqulj4YCXEDZqurxn1dxXdRosuw78hnXcR5dSWu22OrY2bqsdn03ZFTt932Oz2ZWL6lVLPWoXS19Hzup9Pq%2BsfTMYty8kn7ZRXDCy5hdVb1DEre%2F9NU79LvxHbLclj7Kf5rIspXE5mPm9J6q%2FLqa82YrmvfVJHqUsd%2BgyqLatln0a%2F03pP8AWxLmerV%2B5j%2Bz%2FU7qvR%2Bp9Cot6QNlLJbZQ5xdZXb9O1l73S99jnu3%2Bq7%2Be%2FnEmN57qv1X6b9c%2Fq99oxWNx%2BuYxcyx7g9rjc2PXxM5t36x6djmt9H1v02L%2Bi9L%2FCVWcz9VPr51npPWX9H%2Bsxuy8bItFNoyDvtot9tIcN%2F06He316P%2FAEKo%2FwAJ9p9hbXW17ntaA98b3AQXQIbuP5y43%2FGB9Q2dfp%2FaXTWtZ1iloEGGjIY3%2FAPe7%2BayG%2F8AafJ%2F6zb%2Bi%2FSUJT2TK66xtraGAAABoAEAbW8fyVJecfUbqP8AjHPV31dXxMjJ6c%2Fay27LaMd1JaNgsoDxX9o9rf0zaW2%2Br%2FPep%2FpPR0lP%2F9T1VJJJJSDNL%2Fsr9geXGABW1rnakD6F36P%2BsuAwumV%2FWXNrxHvcymqh2S7IqLnRa%2B7Jfj2UPcGtqdvyfVspZ7K%2FQ%2By1%2FoaV6Ffj05FZqvYLKyQS13Eg7m%2F9JKimvHprorEV1NDGDwDRtakkEg2NCNnxDqdGb0Lru3qFDHX41rLTWGxVeyR7626tdVmNa%2F1P3LPWr9i2cmzrpY5tdB6gzpL7Kq7WGXPqqf6D8HIc1gZ9upo%2F7T%2FzmVX%2FADXqr0brOF0%2B4135bWVFgc05kD1WMP06ari17q25P81Z%2B%2FX%2Bi%2BnauTysfqnQeoM6h06l91eW2H4jwf1uhgc70Lq3DdV1XGxm78d7%2FwCfo%2FQXfpK7GIRFX4s2fN7vAeGpRjwk93IyOj5VDnN6U5%2FUMa%2FflYlLGuLm%2BqxnpfadrG1tdk302Ufav%2Bs2en%2FNrQ%2Brd9%2BNlNdfS%2FDuDXMy8e7R1bmjfJ%2FkNhl9Nv59KtOeLbMDO6FktJte%2B%2FCstLh%2Bhcaxm4mY5oc5tLMr08XK3st9H7TRd%2FSqPWW11fA%2Fa%2BOOpdOc6jqeMNllYjcdvudjWt9zfVr3b8d%2F%2Fom%2F1E%2B2F5jpf1u6Dj9RyLKcqu3peaf1rF1aGh%2Bhym0XMr91TfZksr%2Fncb%2FSWY9bFTwftfUOpdQwRZvxsDLOLh2uBexrLH21YzLLAHv9K3ZX%2FwAH%2FOLUw%2BnfU%2F6xVDB6lg4%2FTutEFrLaG%2BgLXD%2FC42zY2x%2F%2Blw7f01f8ur9On%2BroyPqllZfThhMsqBZblWhxFjahFLLWE%2B27HZv3sbsr9H9N63%2FBjW1L9J9PDa%2F6udcx%2FU6Ta7bSH6uxLT7W0Oc0%2Fo6HT6mFl1fzX%2BnV9n1R6v07bbhZv2za4w149K0Vk6enkMeWPu2fzn8xVb%2Fwf0F1GVh4mdSW3MD2vbAfA3AH9xyoYmRZ0o%2FY894%2BztBNGS7QbR%2Ba8n6Oz%2FwH%2FttLyRbyPUcXMqzznY2Nfh9TrbZbkkVyxzQBvzm%2Bm04vr7f0d%2Fo2frX%2BD%2FTV2rc%2BrmH0bqHT8fcW%2Fb2Ned1FrmWsaXOZLfRLH01W%2Bpu9L%2BaXUiCJHBWGegM6d1IdU6WzbJi%2FFbAaWuPvdV%2FV%2FnPTStN6U4%2FWfqPk5jhRj2BorDrMXLOjqnge2m1rNrnV3e1lnpf8b%2FO1Urm%2FqLlZH1a%2BseT03IwLa7s97K8nFrY%2Bx9fp%2Bp6OfjupZ6VvT3%2BrY3I%2F0P6Oyn9F%2BjXrKSCFJJJJKUkkkkp%2F%2F9X1VJJJJSkkkklKQM3Dpzcd2PbuAdBa9hLXscNWWVPb9CxjkdJJTxHVfq4Ol5bc%2Bq55dlvLLq2Dax1lprY7IFbP5i63b77Kf9H%2Bk%2FQrpPq%2FcLMAVlgrupcWXM4duBj9I0y7f%2F1f00vrB0hnVunPo%2BjkMmzFtGjq7QC1tlb9Njvd%2FqxS6dWMj0upH9FfbXsyqwIabGwx30%2Ff%2BifW9n9RHopwvrBh4eF1V%2BXkU%2FqmZQQLSB6deYxwux7HAfpGvs9L%2FB%2F8J6ivWVZ2dj4vV8FgfbkY%2Fo5WO8hosrdr3%2Bi6t7nrefWx8b2h20hzZEwR9Fw%2FlIOLg4%2BI652OCxt7vUfWD7Q4%2FScxv5m%2F89K1IujYj8PpWLjWDa%2BusB7SZIcfc5u6XfnFW31seIe0OEzBE6%2FNSSQUpJJJJSkkkklKSSSSUpJJJJT%2FAP%2FW9VSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2Bqkl8qpJKfqpJfKqSSn6qSXyqkkp%2F%2FZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAMgAAAAEAOEJJTQQGAAAAAAAHAAIAAAABAQD%2F4TkjaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu%2B7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI%2FPgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSIzLjEuMS0xMTIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI%2BCiAgICAgICAgIDx4YXBNTTpEb2N1bWVudElEPnV1aWQ6RTcxOTVFNTY1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkRvY3VtZW50SUQ%2BCiAgICAgICAgIDx4YXBNTTpJbnN0YW5jZUlEPnV1aWQ6RTcxOTVFNTc1NzMzMTFERDlFNzJGQ0E2QjkwQUZBRjU8L3hhcE1NOkluc3RhbmNlSUQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eGFwOkNyZWF0ZURhdGU%2BMjAwOC0wNy0xOVQxNDo1Nzo0MS0wNTowMDwveGFwOkNyZWF0ZURhdGU%2BCiAgICAgICAgIDx4YXA6TW9kaWZ5RGF0ZT4yMDA4LTA3LTE5VDE0OjU4OjA1LTA1OjAwPC94YXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhhcDpNZXRhZGF0YURhdGU%2BMjAwOC0wNy0xOVQxNDo1ODowNS0wNTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhhcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1MyIE1hY2ludG9zaDwveGFwOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9qcGVnPC9kYzpmb3JtYXQ%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iPgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOkhpc3RvcnkvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xMDAwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpOYXRpdmVEaWdlc3Q%2BMjU2LDI1NywyNTgsMjU5LDI2MiwyNzQsMjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwyNzEsMjcyLDMwNSwzMTUsMzM0MzI7QzA1QTE5MDRGRjAwQUJEQzA1MUJERkFGMDIwNEVBNTE8L3RpZmY6TmF0aXZlRGlnZXN0PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24%2BNDUwPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjMyNTwvZXhpZjpQaXhlbFlEaW1lbnNpb24%2BCiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U%2BLTE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtENDYzN0NCOUQ0MUExMEJBN0VGNUVCQ0RCNjMxODMyOTwvZXhpZjpOYXRpdmVEaWdlc3Q%2BCiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY%2BCjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8%2B%2F%2B4ADkFkb2JlAGSAAAAAAf%2FbAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEJCAgJCgkLCQkLDgsNCw4RDg4ODhERDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM%2F8AAEQgBRQHCAwEiAAIRAQMRAf%2FdAAQAHf%2FEAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4%2FPE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BCk5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0%2BPzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1%2Bf3OEhYaHiImKi4yNjo%2BDlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq%2Bv%2FaAAwDAQACEQMRAD8A7%2FmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVdmrlHI2utXn6WltnFESb0RFSp41WjD5q3LCBaslzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2E2rj0LuzvF7PxftUf8AXPLDnC3XI0ewdpOkTK4P08T%2FAMK2Ec1TLNgaxmE9pFIDy%2BEAn3GxwTgV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F%2F0e%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXYUeZpfR0a4kpUAx19h6i74b4X65CbjR76FV5FoJKKe5C1GIVLdDuGhuXs2IKOX4gfsvGdx%2FskKtkiyD6bctHHbXgPImOC4qOpXj6E1ff4Mm4Ndxkpc770BvNmzZFLs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Lv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVokKCT0G%2F3ZgaioNQemANZuhaWLyE0LlY1%2BbGn6sWspA8QA%2FZ%2FUcVRWbNmxV2bNmxV2bNmxV2NZQwKnodj9OOzYqwDT4iiPZsa%2FVLm5sj7I%2F76L%2BOTXTpjPZQSt9pkAb5r8JyKXqfUvMOpIQOFxFDfoP8qFvTl%2F4Q5INDkrFPAf8AdUhI%2FwBV%2FiH8cnLeAPcxHMprmzZsgydmzZsVdmzZsVdmzZsVdmzYyWRIo2kkYKiirMdgAMVX5sjTeaGl1CzsbSAOLuX0w7k14KCzyAD%2BUZJBirebNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV%2F9Pv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVo4CXUFa9e0CbJRWkr%2B0RWlMHZEJ5WtPMtzE5%2BGYJKnyK0%2F4kuEC1ZeM2IW0okjFT8S7H%2BuL4FYz52mMWn2tDTlcpX6FbDHR5ecCH%2BZevywl%2FMM8dJtn7LdJ%2BKvgry9ccrOJ69KVw9E9GS5s2bAh2bNmxV2bNmxV2bNmxVi3miFU1LSbxvsStJYzH%2FJnSi%2F8ADYpoEzLcxq1T68FGr%2FvyE8GrgjzdC0mhXEsY%2Fe2pS5i%2F1omDf8RwttJRHdrcDaNbhZVI6endIG%2F4mcnHeJCDzDL82bNkEuzZs2KuzZs2KuzZs2KurkZ843Zhs4bVTQzvVqfyrvg3zHNPb2UMsLtGBPGJSpIqjEqRUb9ch%2BvSSvp0JlcvJCLyMuxJb4JNvi%2F1SuEBVvkaX9L%2BZbm8Sv1fTbf0Y6%2F78lPxH%2FgFzpeRvyPbWcXlyyubWBIXuoxJOUG7uKjk5%2FaOSSoxPNXZs2bArs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FU7%2FmzZsVQ2osyWM7o3FlQkMOxGPtZhPBHKCDyUE08e%2BM1Bedjcr4xPT%2FgThV5cvBJbpGergEfMDcYa2PkqfZs2bArs2bNirs2bNirs2bNirshfnRGtb7T9TX7LcoJD2qDzSv3vk0wl81WDajodzDGKzRj1oR35R%2FFT6RthHNXaVcrKsUtftDi304dZz7yrqPrQCIncdMnsEnqRK%2Fcjf54yVjP5gwtJ5ckcD%2B5mik%2BivH%2FAI3wD5RnEtpwrWgw983RGby1qiqKlYGkA%2F4x%2FvP%2BNchnke5BIUGoPQ%2FPEJHJ6XG3JFbxAOPxOA1iX7sUwIdmzZsVdmzZsVdmzZsVUbqBbq2mtm%2BzMjRn5MKZDLP4rC2UVq9qYj7SWshWn%2BtxOTnIVG4ttWvdNaiiK7FxGDtWG6Ti%2FwDwMuShzRLky%2B1lE9vFMP8AdiK33gYscKtBmDWhtq%2FHbOyMp68SeSH5UOGpyJ5pYde3moWPmW5KzH0pIo2WNt0A3Wv0ts2D73zJ6FgzxqqXpKpHG9eDMx7EYXed45VeC4gPCdYyqua0I5q5VgOv2cAW8sWo2QMqhwwoyHcVyQFhVOLzvrNrdf6fFHLFX4kVeBH%2Br1%2F4bJlp%2Bt2GqWrXFnICyKWeJtnUgV3XOP67qFjaFLHUrprecy%2BlZajxPDmN1jn8Dv8Aa%2By%2BIaXrclrdtZ34NrfR1USofgeo2K06c%2F8AgcBCXr%2FlvXRrdnzk4rcoSJFXYfMbnDzOV%2BTr82eqAOQIpaBq7AV2r%2BOdTriRSEp8z8RoN9I5AWJPV5HYD0yHr%2BGQg3Ntq1lcLazx3CiZviiYOKzQo9Kjb7YzoWqRevpt5AOskEij5lCOmc60%2BWCK0j9ONYo5IYp%2BEahQWBeNjRafEcMVTvTb%2B80fyHZ3FugE9vSORJBUqPVZW%2BEHw3yVaXeC%2FsobulGkX41HQMNmH%2FBZzC%2B1iTTbadZUkjtJjzkQqSKqNm5fsdMPfyr1%2FRdT8vra2E5N5C8kl3bSMTKpkctz%2BL7SP9peOA7fFkIkgkCwOfkz7NlA1y8DF2bNmxV2bEJLy1injtpJVWeavpREjk3Hc8V64virs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F9Xv%2BbNmxVplDqUbcMKH5HIPokjWsstqx%2BK2lZPf4Wpk5yF6nF9R8xswHGO8QSj%2FAFh8D%2Fqrkoc6VmSMHUOOjAEfTjsAaZMXhMRPxRnYf5J6YPyJV2bNmxV2bNmxVQuzOtu729PVUclBFa07U98DafqsF6i9EkI6ePywwyF6vG2i6oJRUWl6xZCP2JOrr%2FsvtLhG6s0yiK4X6Zfi4QI7Vb9lv5h%2FXDHrgV5c8B0LzLc2Q%2BGF29WDw4SfF%2Fwp%2BHOg6ZMHi4j2YfTkZ%2FMGwpFaazGDytm9GYj%2FAH25%2BEn%2FAFX%2FAOJ4N8uXwliicnps305LmFZDewrc2dxbt0lieNvkylc45%2BX10UCQzHjLATE4P%2BQeNc6L55e5i0J57WVonikRmZDSq7jf2yB2Op%2FVYor2%2FwBNjktpAGjv7ZvU%2BInoy8Vao%2Fa44xCQ9as25RVBqKnfBGRby9rBEsljcIY0aQ%2Bg5FCCQD6bj9lslGAikN5s2bArs2bGyOI0aRuiAsfoFcVS%2B%2F1q2sJltyrSytuyp%2ByDsC3zwxBqAfHfI%2Fodmt2z6pcjnJK5dAexPT%2FgRkhxV2c782mSy82WUgNIdUhNs4PTmlXQ%2FwDBDOiZAvzLb6nHpOrlFkjs7lWdG9yvxVG%2FwiuGJ3Up3YTJFr7op%2BC8t1ljHjxodv8AYtkiyHbxx6XfKx%2FcXBilJ3%2BAsVUV8FRlyYA4Z80DkkPmq3EtlHJSpR%2BJPgHBH66ZBtIufqt9Np8pALHnEpO5p1oM6Xq0P1jTriPoePIfNdxnLtZtrGZluBcG3vF%2BFJYuJfx40IIxHJKzzb5et9ZtZYp1LwygcgPtKy%2FZkT%2FKWuRKKCOC6tNH1CblcWiILDUWHH6wg6wyDejx9Fw4sfOMjEBY5biH1HgLy8VYulOfJV%2By38q4ndH9LlL219K4iilHrWzLxlhI6SgE1%2F2SnFKo0Czxy28zMqcSzspIYBPj2I%2F1cd%2FytnVZdNQ2D1I%2BESMoPw%2FzMftdMG20TSQyyblmjenzoc4TY6ld6ddyKwMUsbFZoHqNwd1KnGXRXs9n5%2Fv7lg98GlWhMjwk1A%2Fm4k%2FF7jDSwSPULTTJI3PGBphGNwG4OHVW%2BgnONX%2BsWFpDFPaSSJcTESG3TcRlf2uRK%2Fazq%2BkR3aeT7e%2BjnX6yoW8ibht%2B9i9Tg%2B%2FQ98QVZHqstutowuSPSdSpV91IPVWzif1i98t%2BZ7m40FjbSWUrNCqEmkex4EH7acT9lv2c6lonmbTvMUTWdwgiumWktrLQhge6H9of6uRLzd5ZurDVP8Q2KetYFUW7jXeSKi%2Bm0hH7UZH7X7OCY4g2YM0sMrjvexB5SHcXsnkPz3Y%2BcdPqKQ6lAB9bta%2F8lI69Y2%2F4XJeDXPJlvPe6JqMeq6NMYLuE842To6ntToyuv2k%2Faz0J5E8%2B2HnGyI2t9VgA%2Bt2ZP0epH%2FNEf%2BEyESeUuff3tmbFAx8bB9H8Uf4sZ8%2F6P82TMMLNb1iDRrQ3EpBkkPC3j7s5%2FwCNV%2B0%2BGVc4n5m8yfpnzJcsr%2F6HYsLe232PBv3j0%2Fy3%2BH%2FY5JxkLourX175%2Ftb28maSZrloqsdlQ1Tgo%2FZUDO755%2B8uxlvPcMI6i6LAe2zZ6BwlS7NmzYFdmzZsVdmzZsVdmzZsVdmzZsVdmzZsVf%2FW7%2FmzZsVdkb83W5%2BrW1%2Bg%2BK1kAc%2F5D%2FCf%2BG45JMC6jare2FxaEf3qMo%2BdPh%2F4bCNiqV6VOOcTV%2BGReB37%2FaX9WHoyFaJMz23BqiWE7juCh%2FsyaRsHRXHRgCPpwy52gLs2bNkUuzZs2Kuwu1rS49W06Wzb4XI5Qv8Ayuu6nDHMemKvONE1KWGVrG7rHPCxRgeqsppk7sb0XC8W2lUbjxHiMhnnnTHtLmPXrZfgakd1TsR9iQ%2FP7LYtomq%2FWI0Iakybof4H55LmFZdqNlFqNjcWMwqk6FD8z9k%2FQc515XuZbW4l0%2B5%2BGWFzE6n%2BZTTOlW063EQkXY9GXwPhnO%2FNsS6T5qtbofBHqaniexmi%2B2v%2BsU4v%2FlfFgHcrPTFbanZNb3caywyApLE3Qj3zjutwW%2FljzBc6Pp6fV9JHpsLNSSgR1HIorV3Vvizq2jXQk%2BAndlBA9xnNvzRiWPzJBJWnr2gJP%2FGNyv8AHAdikJ3YGf0o5pZDIboSD1GJJ9aAgh6%2F5aUzoFnN9YtYZ6gmRFY06VI3zlXk%2FVI5bi2hnlBgdBuxFFahhfr0rSNsnHlXU4JI5NJaSt1avIQm%2B8RaquD0I%2BLjkpbgIZJmzZsirsDagC1jcqvUxOB%2FwJwTjXUMrK32WBB%2BWKpfofE6Xb8f5d%2FnhjkMPmvR%2FKlrJBqkxBSVkjC0PIDpTfI15s%2FMNbu3jbR5plsZVp69swRi9N0eSjMnH%2BRcVpm669cWWtXGnatwjgKma2uPsj0x%2FNXw%2FayOfmLr%2BhX3l%2BPTYrkXM%2BpGtm1uPUUceX7yRx8KLtx%2F1s5xoN%2FefpVr6C8muVVfUuLO8kMrEIeTem7faRk5Iy5FdTuZ9B169trGZvqkc5eFD8SmJzzUcTtsrceWHzTT3fRJv0p5UZvtOYYrgCu%2FJV4P%2FwANHnPrj83vM2lX9zpWoBJYInaJ540pOi1%2BGRQDxf4cln5Z3qT2stjWrK0iexEgE60%2F2XLOUfmHYNZeZbhWP94Ayn%2FV%2BD%2FjVclLlbEdQn955q1wTiU3huLadeQCsfSljO9VNev%2FAA0bYHub1Z7V5yWkhHxpcVHJNwGiuP8AKStVk%2FbyGafqLQxyafO5S2lPJWUAmGQ%2F7uiB8f8Ad0X%2B7F%2Fy8Ctd6jpl3Lb3v%2BkQTpxniqTDcQn7LoR%2FwUb%2FALDZCyyekWl9ZyaFLPelZGN2tqDEtZJHenEs67ckpVXwq1bU7G1iKWvqtcCR4bkkhFYx%2FCHXhvvX48C%2BU7H1SbK3k9Wya5hv4HchSBF8FxBL2WeOJ1k%2F4s9P4cu%2F0j%2Fc1FphmFxPLeOhZBxAiL8jt40%2Fa5YegV6PprvLpcE8sfpTNbh3QVoGK12zluoQ2PnZih42fmWIVt5z8Md4q9I5P5J17Z2A8YrWVl%2BERoaDwoNvupnLtb02LzREdR0hBba7bVe4tEPFZwpr6sH%2FABb%2FAJOSkgPNLqGaG7e3v42iuoTwlicUIK9iM755KnGoeT7ZX6m1CH%2FYSNCf%2BFOctnuIfNkSWeqEWuu249OC8ccfW47elcd%2Bf%2BVnQ%2FyyS5t9Dk067jMVzaSXMLK3hRJlp4r9rjkQl5PbalcaRd%2BlI7PbwysI5lNJIirU%2BH%2FmnOueV%2FOUeo%2BnY6hIpuWX9xPtwnU%2Fhz%2FnTOPeY4zY%2BYNTgpVBcSVQ9CrHkP14Gsb9rFgRWSzY1K1%2BKNh%2B0p%2FZcY2Qdlev%2BZ%2FLKxK19pcdYBUzWqdYx1Lwj%2BT%2BaP8AZ%2FZyHW9xe6ZfQ6ppk7QXsBDRTIevsR%2B0p%2FlyY%2BUPNR1KJLK5lD3KrW3m6esg67f79T9pMD%2BZtCjTnqVilIW%2BKeFRshPWVAP2P9%2BJ%2BzkZRB3DPFlljlxRPz5Edx8mcw%2Fm3aXvkzULyUC3122jET2oNA8kh9NZYT%2FJvzb%2BTOZabIhnWkgaOQcwxO577%2F5fjhKIYndoZvgaUD05v5SN1J%2FyG6YI0RZ4tS%2BoyKQS1HTwYHsffALrdOQwM%2BLGOEHfhu6PWvJ6f5FsfrXnqW8K%2FDBEZD4cmAVf1Z2fOSeSLmfT9RrHEWlvDSZaVagNR0%2BztnW8mWsuzZs2BDs2bNirs2bNirs2bNirs2bNirs2bNir%2F9fv%2BbNmxV2Y5so4qw6WL9HeYLiLpFcUnjHQfH9r%2FhuWSbTnBgMXeJiv0H4l%2FA4T%2Ba4fTW01FRvDJ6chA%2FYfpX5MMGaXcBmHxbSrsCdi6%2F2f8RyZ3j7kdU4zZzrTfO2qQa3eaHrkax6haux%2Br9FkgJ%2FdT2790ZP%2BGydWWoWt%2BnK3erAfHGdmX5rkSEovNm2yiQASTQDqcCt5sL5dZ06Ko9YSMNqRAv8Aiu2Iv5i0qJecsrKo%2FwAkk%2FctTho9yo69htbi2e2vApgmHB1cgA1%2BffOYX%2BnXflXUghJezkNbabxH8jH%2BdcPPN82l65b2j213DN9WdmmtefCRkdeJaNSVb1I%2FtYXWM8cVk2javM95pUv9zcPvLB%2FI3LvwwhIT2x12KCBrxjyjRS06jrxG5YD%2BZcrzzpkXmjyhLPpzCSaFVv8ATZozuXjHP4GH%2B%2FE5JkUmju9BujaTsJYHHKC4G6Sxn9r%2FAJqwJH5g1fyjDaw2KrcaE0zSNE27RiQmtuXPSJ6%2FuW%2FYkxI6hUg8ia9qulatHe3s0k8DgxGKZywBk%2By3%2BTkn%2FN63a8ttG1a3rHL%2B9hIB%2BIdGK%2F8ABA5DNbS0tL%2B4ksJOenzETWrjYiOT4gjD9l4WqjL%2FAJOTTU9XtNc8r6dDP8E8rc4iSP71RwkTfcP%2FALsX%2Bflgq09zFvKeoTMwV2NeCsB0BaNqf8a5N9Zu59K83W2pWb%2Bn9cjBo24ZXUNxI%2F1lyCWsL6fNb3LLxid24tSgINA9Puyb67pd%2Fr2kaPc6bxN5b8owWYKAYW%2BGpP8Ak4RyQU8ufOF7JLD9XRLaAj96ZPiYv4A9An%2FDYOfz9oEbtA0kjXSqG%2Brqh5NtU%2BkW4iQL%2Fk5yK%2FiuNagjEcpTU7Rj6YqaSAbtG3%2FFin4om%2Fa%2BxhXcGeWxlDgpPbfvUFaPDKpFXiI%2FYk%2Fk%2FmwFXr0n5hfXBJFpVtxmC84jOa81%2FaKqv7Sfy5GL7zJq2rwXFhqF40AlWiSQfAEPVW%2BH7Sfz%2FwCRkTl1dLW3t7xi8108C3g9EBArCnI8jtVvtNRcR1zzTdJcQvYwRW7y28dwzFfUblIvI05fAo%2F2OGxSt3zSW9LPXITMlCjiuzofsyRt2YfsPkd0iabTtQksp1Zra4U84X6SJ%2Bw4%2FwAoD7Ei5dzqV7LFCt7KZnVAY%2BRqyg9aj%2BX%2BTJdouuaHrltb2PmCNfrkKmO2vKcT%2FkgsP2v5cjtapfo0Jt%2FMllFGHltZvVeK4ptwWNi6yU%2BzIvRlwm1mUarpNtJHEWutOkuIbh0FSbfkGiZ2%2Fb4MxH%2Bpk6uZNM8saddywStNK605tsKnYcF%2FmbOZy3s2nWaLE%2FG4e4%2BsK43HELxowOzK%2FL4lx5fFWb%2FlprP1TWLQMaLMFRh%2FlRtxr%2FwLYn%2BfNjLp%2Bp2WpwghWLxuf2SGoRX%2FAIDI9peo2kMtjfWQMUi3JM9u24j5rT4D%2B1G5qyfyfYzp%2FwCcdimr%2BUra%2FG%2FwpISOoIpXJDcIPN4HDcR3Scl2I6qeoOGNvcQyw%2Fo%2B%2FJWGpNvP1aBz%2B0PGFv8Adkf%2BzXIxSaym2NCOh7MMNYLhLlOS7H9pfA5FU30vUNQ8uaqjIqsaqHiO8UsZ6EeKsrfA%2BS3yUr6p5iudTl2S1RvRTchTKeCgV%2FlTlkOsvUveOn8VkdatauxoyN%2FID%2B0r%2FwAmTfyYHsrnTdPasc1%2FNczXMZArwhT04g3%2FAD05Yjml6Fditlcmu%2FpvX%2FgTnK5bS4sp1mDtFID6kLioPXZgc61NGTBNH4o1PpUjIpNbyX0Ulvcw%2FV9Tst7i2IqHWn99EP2kZf7xF%2F18nMX1pANMR1TTYfMkRuYYlt%2FMEY5EfYW7UftL%2FwAXjDf8u%2FMFzM8mnX6MJLWRFkMh4yiqtGUYU%2FZP82IzW%2FH4DVQG%2FduPtRP1FG%2Flb9lsG6ZJDJfPcvGI9WCoJZwPhmRGHF2X%2Ffi4AP2peafmBE8Hmq8LgATCOVaeBUL%2BtcjauUPip6qe%2BdJ82x293Pb2GtyL9ZmWRoL5QAUZZGQK47p9nOd39hdaZctaXScXXdSN1YHoynupwFCL0zUX0y4SVGf6uWDqybPG46On%2BWv%2FAA652nRtY%2FTdqJbfjLdqnK4gjpSVen1iBf5G%2FwB3Rf7qfOCxycaqwqjfaH8ck%2Fk%2B61K11AC1kZYIT6gmB%2Bxy2oP%2BMi%2FC6f7LEGlZCbBr%2B%2Bu%2FqqpBCjP6cbtxHwn4ljrX%2FgckOj2EMcC6lK6yTRKYmkIoYl6gE9xT7L5HhcTJqM1jJCEjjQSQsK7qT3rgi%2FuJ7PTDKQ31S5f03ZPi3SrfGP5RiKG6bej%2BQPzB0CG%2BuNHvB9VeZx9WvZKBX7cCf2P8jOvghgGU1B3BHfPHaQrfuEt3DHkAJakKhP8AO37A%2BedX8i%2BYPOen6dNp2qK5t4JFjs5HClyoNJfTdieUaL8S%2FwDCZEcRNEc%2BrfOOKWMTgeGUaEoHfi%2FpRP8Aunt2Ab3UorWqAc5QK8egHzOPhuoTYrdesJYgnJptgDTqdu%2FtkT1C9XnLPIwofjLduJ6fhkgLcYsi0vVRfSSRSUWRd1UeGGgyN%2BVrCSkmrXKlXnHC3RtuMXXlT%2BaTJKMTV7JdmzZsCuzZs2KuzZs2KuzZs2Kv%2F9Dv%2BbNmxV2bNmxVB6rafXtOuLXvIh4HwYbr%2BORbRL%2BsMTMaSQsOSnrseLZNDnIdfXXtP8zXtnZGC2tJWEsUz8pH4yAE8Y14rs3JfibJRPMKyf8AMXye3mKyh1LTH%2Bra1px9S0ulFSV6mNwPtRnIb5e8wXlw%2FwCj9VR9N1u12PGoD9vUgfpJG%2F7UedN8uapcXsH1e7C%2BrAi%2FvV6OPs1K%2FsttgLzP5Ysr%2B3NzHFxmjPMlNj%2FrLTdWHtiNtlU9I82sxa11lAssf2bmMfA9PFf2G%2F4XIt501y81SykEEjRQRMGEaMV5L0%2BKn2sq4ke3j9O4asuyLNSnMduX%2BV%2FxLCfVZ%2FS0u8cDkVhYhfGgxodGQDDZPMculusTzpwryMT7mneh%2B0uTVNL1e%2Bsob1tLmmtJlEkbFW5FGFR8NfUzi2iQ%2FXNXtLjUAXWe6hE3L%2BQyKHG%2FbjnqzzP5ok0H0baxgWVyodi5IRU6KBx74ASrzOzsfL1tcH69ppMtdxM0h4%2F883OS2GLS7239K1pGpGwj%2BEr%2FALHphVcecBcyrc6vBFdabL%2B7lV0UPbt12KDnx%2FlYYGvrWKwP1nTp3kirsT0BpWgcdf8AZDJg%2FFjSanSb8xC2ursXtpG5kt7dkVRGaU4g%2FETy%2FwBbIzc60xSeylsgphDJeafNtIY%2BnqREfCygYcWPmV14x3qkqQDzAo4X%2BYr%2B0ME6h%2BidZZImjM90FLQzQj40BFNn2%2B1X7DYkd2yi%2BrHNIh8uXbLp7yLJdToZbZJDX1EU0NOXxCeL9tf%2BJ4PhbTLya58sXqqt3EoKlV9MSoRUMn8ssf7XH%2FXyD%2BcfKFzoWnRatFqUUU%2BnSGSGAsBcFXZaFeHJVZDu2HOn3See9Kt1%2BsCx8x2y%2BpaXabB2TxH8pP21%2FZwAnu3VQuV1CC2iW9cx%2FwCkS28kMtA5dKLHL1%2B00TJyZPhk%2B1nS%2FKN59Z0GSNno6yI6e1V4v%2Fwy5z9pv8YWj6Hrcf6P836EWmiiHSfiv2ox%2B2kwH7P2ftLk28uxrbeXYLhYXV7gMzxkE0IqPiqNq%2Fy4gb%2BSk7PNdX1m%2BHmqaytJ%2FTtTdx%2FBGoSu6swZqcj8YbCnRmM97drKxKXcslu7tXb1%2BSBq%2FwCSzZK9c06xuNUutStkBls5IFkAIAMoHqUUfzNRkbCPW5Xs70rZcVtL0%2BtCoAFVc1oK%2FwArni2RIShdD0rU9Z0g2UNW1DR5JLG%2BirRlQuXhmp1ZP72M%2FwCph75g0K2sra21G8ch5baGJUpt6yARuvL6OWEQk1eJrq9s55YLxBzuGhJEjr3LKvxSqv7WISanq2oQRXGryvd2MtVhuSQ8aNQch8OyNjsqElhK1hbcr%2Fcv3K%2FyV%2FycRSQBmUiifsfQM6FpfljSbrR0mCy3EjDlDIzN9sGnphU%2FZ%2FlbIrqnl%2F6jM3Cb1VRqOoU8078XoOHPISIiQCd5ckgE3tyS4StK6xSy%2FDJ%2B7HqseO%2FYVw0W2thatp10he2b7YH21cfZljP86f8AD%2FYxO4tbO4so4I7ZUvG5Lpl3PssprUws392JD%2Fut%2FwCbAOh6sLuU6VqYMF4hKRu2x5DrFID0YY7rsh4tMn06%2FkspjzjniaS1nQfDIE%2BJWXwdafEv7Od0ugnmL8tmYipWEOB1oGWp%2FwCH5Zy4hoT9WuU5BTzj7FHp%2FeIe3%2BX%2FADrnR%2FysvRfaHeaJIwZ4RJGo8QDzQ%2F8AAy5OPVBfPNxbpMpifYqaBu4IwFYWlx9fEIJU7lmH7S%2F83ZJ9e0x7K9unRg8azMkoHWJySVR%2F9YH4W%2Bzj%2FKtvFdaxBDLQKzAVO243G%2F8ArYPJUXb2NvDZtdyWxe3B4meCQ%2BtG37Jkjb9lafaXHRXl9q2r6etnWJ7Yxx28h%2B1UNyMjt%2FlH4myX6lp1poPm57CIFLG8jikCsKisqqXWncc2%2BzhLZW0Om35hCuLiCeSgIHFY67KT9rl4YaV63IwMVSakg1pt27eGRuzvrTWILdYbnlcIWXSdQc8W5pXlp91%2FLIP91M%2F94mG9tcfW3AQ14xgsPH4c4Zp%2Btz6HqN2rJ61nNIy3loTTkA54yIf91zR%2FailyRNUinpV0iXqyyxw%2BjdW5Md%2FaN1iPdqf74f8A5Jtka1ZZ4LWYxsySKpaCRT8QI%2BIxkj2Hw5KLe6%2FTsUF%2Fp1wsmrRRk2l0QAL6Fft290g%2Fu7uP7Lo395hFquqaL9XZmmWCRwySWTgs8MgG6Oo%2FY5fZbAUhC%2BZ9JsfMl1SKYW%2BqyQRT2DMf3UvJeTwt4M5%2BJchKyrOr6D5gQwTQEpFK%2FwDeQv8Ayn%2BZDk%2B1Gyj1ew0SaC4gS5ntmCtX0ELQtQAM%2FEcv5Fwv1bQxr%2Bnhr4oms2ymP6xuCStSIbof6v8AdzYOaGAQ%2BXdTm1NdLjj5SN8QkG6FOvqBu%2BTjTrS2sbZLCMcVUmkpFGLn7Rf%2FAFv%2BFxTTme102DTuILIwZpKksW%2BzxWtW41%2FZyU2XlW41HhcahytOQJZVHKaXw%2Fd%2F7rY%2FzviAqQ21ldXtytrDG0k524qKmnj8sO736roNmNIltfVv7hFeaMnkUqTwpxNA2S2MaT5etS9w6WdtEvx1b42A7Symh%2F2C5zTzb%2BZun3swOjacGVKwrqMgoajeiJSr%2FOTDVdVZPYa3pOj%2BW7u31uKKzuZGP1dePP1Iz1UovxtJ%2FlYU%2Fl%2F5hOtyS%2BWrlis1Gm0pyfiR4%2Fi9Kv7SumcrvNYnu5DcXH7yToamrfSf6YL8ratLZ%2BZtJvoT6bwXMbEjuCwVh8uJauPFuFe%2Bx%2BYJ4NMawQiOFzyZOlDX4h%2FwQyQeVtAn1BY9R1QN9WU1toG%2Fa3qGYeGE3lnRLPVfM19LdAyWkTtcW8a7xOGaq1kGz7k%2FAM6moAACigA2AxJ7lojn72wANgKAbDLzZsirs2bNirs2bNirs2bNirs2bNir%2F9Hv%2BbNmxV2bNmxV2Qzz3p3P6rqKbFKwyt%2Fkn4lJPseWTPOVfnX5gmstNtdBtnMbajykuXHX0YyPh%2F2b%2FwDEcbrfm24MRzZI447GR59w6pMfNyWl7EdD1KM3Cp6dwoKldj%2B1zHE%2FRko0rz1rUtz9SvLe2lm2Hp8jC7BhWqV5xvUb%2FDnn01jPEin8pHgckemXmsTaHcxANw05o57O7IIKxliJYll%2FaRT%2B84%2FsNkIZhIkSjRDl6zs%2FwIjJCXFHkb5gp3%2Ba2r%2BbdPuEvYLVbLRpiFL27c2EvWkj0%2Fd8v2VpkGsfN2p3Kra3V2XicgEsQeQJ3qSNs7d%2BkdO1rSbKw1LhN%2BlbRXVJKFZyq8ZV3%2F3YGHLOEecvKFx5TvTLDym0idv3EvdG%2FwB9yf5a%2Fst%2B3lpHUOvsua4iNwbWCruHK%2FB0qN9j0zoy%2BarW48r2Oq3l1Le2sSizuGkqk6zgUVXMda8F%2FwCDTOO2M01rIs0XCRQ4kHqCqGnZl74NgkTlMqSOIZpPVNrXjGG8Qvfj2wXzSyqz1eO%2FtNSjQM8sVubhFbbkIpPiI%2BUR5Yca3q17IdPmtZ2js7yztriONNhyAKSciPtMJUfIZaXDWL%2Bra0jcq0ZYAV4yAq6mv8ynJf5Yex1PRjpUsfO%2F0pnuLJWNPUgkNZ4l%2Fm9Nh6vH%2BVpMRa2uvBcXej2Gp2rSC5tJJbOZkqW4v%2B%2FgY%2Bx%2FeJhtBB5sOi313boLa9ihMlo3EB5ClGkULy%2B16XJk4rhlZarBFAbZljtrS5Tg%2FoIF4fyOT1JjbC1L%2BbSbowyMwu4WrzJryX9h1PQpxw%2FFWFXNut9PB6srS6frlqI4JZHJ%2Br30bCsbOf5phx3%2FAN1T%2FwCRgPQbtreVrEFrW8gfnDU0dJUPF09unHD%2FAFeygjjvbi2haTQbpxcXlpHvLp9x9n6xClfjtjXi1P2P3b%2FGseE99ol9qtyjIKamYlktb6Mn0L5QKJ8Zp6d3x%2BH4vt8OD%2FvciTXPZaZ%2Bkdp5%2Bgt19Yad5p0%2Fe0vU2Y8T0NPiaM%2FtJ%2FuvOj6lcGysFaRlYxJWUjfkUXk3z5MM5p%2BV2l3U2pPdalFHK1sOLyqQxSZaFOdDWOT7W%2F7eTTzK8UdlcxREhXBTf%2BdzWg%2B7JxNji70HnTz%2B51GXyrrFxaapD69nfcRqSftqxHL1oj%2FOjPjtQ0GNYCfrCXWi3QMtlelhyjkYbFfdvsyx4M87Wy6zqemTq4X9KwQnmegkK%2Bmf%2BSi5G9M1PVfLUt3od3CJIGDEQS7iKUD4Zov8%2FjyErqrruPNkK58%2FJN7Sx0%2B0sDe3k0k9xA6JBJACGqwPHiKp8S8fts2F0mrDS3nubPThH6ZLa5YcQsnBvs3kSsCnJeXJuK%2FB%2FwAYmwQ%2FrXdjEsQRizhvjKCrUp8If4uW%2FwCyuK3Fs893p1nezfVdeDCOxmHFi8ZH%2B89wSeBjP2YuX%2BVFiYggA70Pmt9QzfyjdxXeiPeaY3rNYt9ZjdKUkgP2gyj7L8ftL%2FPgTz2tuLdJIT6cN1JFcxzJ2U7Sb%2Fs%2Fa5BsKfLEMvlPXby2sJI40uF%2F0izVuUcb05n0z3gkTlw%2F3237vHeddXN5pEMdnbmOys4BFcy0qDcF6GJa%2FwDFacmyX8Pu2R1QOi6Yupabd2F78dj6xjLVFUlpySaHwkUf7F0%2BDIrrvl6dr42N0eOtRIHs7ldkv4B9ijf8tKgfB%2FP%2FAHX28mPluyb0Vs7OdTL6SSReoK8%2FTZqN%2FrqOPL%2FJwTqdhFr9m1lqUhjnhcm2uv8AdltN%2FMKf7pb9tP8AZrjVhWHaHrEWqxjTb9gt9GKQytsXptxNf2sl35d3J0jznJbCojuQlR26cT%2Btc55qthdyXcyyJ9X8wWfx3ESbC6UbrcwfzS8fjfj%2FAHyfvPt88N%2FKuq3F3q1hqBIEyc4pWZuCkoAwck9MA50VPJV%2FMq2k0TznfCJQUmPJom%2BzJG%2FxcW9t%2FwDY4Q6cILa6ZY2eKRwslv6goaDfjy%2FaK4f%2FAJleadM80a8t1pcZ9GCJYmuG2MrD7TAfsqv2V%2Fmwr0WyuNXUw%2FVxci1%2BKLt%2Fw23wrg6qGVanr1vrK2t3csIry1aESBjxJEYYOQff4cjvm3zLbpZXLWTGC5vr%2FwCswRjfjBGoC8yfi%2BIjCPX2vNMu%2FqZDRNGKSAgUqxqgqKruF%2BH4sjsyPPIZZSXJ7knfG1e9%2Flxrdt5ksbqdSFu7eMLcW5O4%2BE0cV6xvnF75uVzcb14yyBW7%2FaO2KeS9RutC8yWd7DMYLfn6d3L%2Bx6D7SLJ7YhdkNd3UkRDRSXErxMDUFGclT9IwndCtpWrz6ZN8MskcDsGdojxkjcfZmip%2B2v8AL%2B3iWoySfXbiHUmFy14frKXqH4nL14zK%2FVuX7cbYEeJWDPQVpU0Pj0x6yqLL0pJUW4tXE1o5O9SaSRbeP28Cob1Z1T6vPKzxjeNSSQK9aV%2BznXLfUrdtDt9T1U%2BjeRxpa3iMvF5V41jcg%2Ftrx%2BLOd6VbaTqJlS7lMl5Iri3hHwRiQj920snhzODppWsii6zcGeSZg3po3NSy%2FD%2Fen4K9V542r0LyheaXcm5uaCCWNhxkl%2FvClOqcvs4rrn5g2enI9tpKi4uqlWck0rSvxP8Atf7HITazpccriNaLGD%2FozGnBVIJkZP261%2BFuWE4juLqSZo2pbJMjyitAQeVPwrjxbUE01reuXGvCKPUZJ2Cs0iqgUgFtunw%2FCKfDhWLXSzayW73jxuGElWgJUbUoSDhkLcXEjJDSJqkoSd%2BH7OGlh5a1HzDONIit%2FWvZEMkJRlQtGlKsCxVX4%2Fy%2FawWtILTLTTmeMmbTrm1jXe0nmMLOwH2nZlrWv%2BVhlBb6Lql09zpemrbx2cJe5WNqiRi3EKrfyj%2BZR8WJ6x%2BVPnXQrK41i9sljsrUB5pBLGzAVCgiNWLNufs4I8h6hp738sNxRBexei5BoBJWscg%2F2Xw4VZjoMllFbx635Y52k9mvPUdKaRjHIF%2B08PInhJQV6%2Fa%2BHOq6d5%2F0G7toZzK%2FBwKzBCVrTo3GpQ%2F62cYW21DQ%2FMUVrFH%2B5vyInPSIqzfE1f2afawkmtp42klt0f6uzuInWoDqrFQRQjkMJV9Q2ms6VfitpeRS%2BwYV%2FwCBNDg2ozzr5Y1vTI7V9L1PnbTDk8E4Qs7M1KKHBDp9GTfQfOdosSxw6txkp8UN0DxBG37WNea09UzZBNY%2FM3SfLcVrLrDIyXZKwm2bmW40DsF3%2BFa%2FF8eTW1uoby2iu7ducMyCSNh3VhUYEK2bNXNirs2bNirs2bNir%2F%2FS7%2FmzZsVdmzZsVdnE%2FwA9rKYXmj6jT9w0ctuT4OpEgB%2F1lOdsyO%2Bd%2FLUfmvy%2FcaXstxtNZyHosybofk32G%2F1sB5ORpMoxZ4TPIGj7pbPl%2BNPrERi%2FaG6H38MkPlXzh%2BjhHo%2BrmunCqwXFKmDmfiSRf27d%2FwBv9pMJBDcWN7JaXcRhuYHKTRPsVdT0P%2FNWB9RiWO6ag%2FdygSL7cuv3HKpkwImPcXoM2KGaHhy3B3BHf3h6B5qslXQooNOVof0a7Xdi6fDxBPKQQ78vT35xNl6Fr1l5s0yXSNZRHujHxlRhtMv%2B%2FE8JB9r%2FAIfILo2pT6XfLd8mmiKehPAzE8oT%2ByvKtOPWP%2BXKvrafSpl1XT2L6ez84LqLrE1a8WH7PH7NDlkMoluPiHRarRz05F%2BqJ5SHf1CT%2BZ%2FLlz5WvvTUmXT5jW2nP%2FEH%2FwCLB%2Fw2FauD8Sn6c67a3Vh5x0p7G%2BRfrAWskY6EHpLFXp%2FxpnLdc0S88t3ptrir27msE3ZlH6nX9pcmR1HJxFS3uA4oftDBlvcz2lxHc2sjQzxMGjlTYgjCVG6Mh%2BWD4ZRIvv3GC1Z7pdxHraNJCViukq13aswVAO9xCW%2F3Uf8Adkf%2B6%2F8AVw1t5NPkKabe3SyqKG2uIquYDX7Jc7ei37a%2FZ%2Fazm9tdT2dxHdWzcJYzyQ9R4UI7qw%2BFhkwhvDqECTaZbExyHhPbqKmCYivBf%2BKZPtR%2F8DgIkSDxVHqK%2FSyBFbjfvR8k1xY6gVtLb6vJbVWZbhvVLo38yAemYZF%2F4XCjW0McX986%2BX72Uem6V56bekVAYLu0D%2F8AJSL%2FAItjw7W0utVgj0%2B7k9DULc%2BnaSMaFkrvaz%2F8yXP%2Bpgq00iztbkaVcP8AWBer6NzEworLWjRsoJ4yRv8AEjr9jGOMDbn5y3UyJ8vcyfyHpl1puhy31zEE1e9cJfKxXjK8JMaTqfGZCrt%2FN9rCX8wda%2BqyabAGAM85aYA9FUcV%2FwCGyZXElvb20VgHb1LeNDEKmpKDhGS%2FfOK%2BcrhtU1G8vLZ%2BYsz6M0Q%2B0nBh6cwH%2B%2B5af7F8slsAAxG5tkesTm68saddo3GbTZ5bb1B1G%2FrRfrxGTW7LzPpcrahALfzDpir9biI4tJESAZowftJ8Svx%2FY%2F1cD6VMb3RNTsShJmhju4gVP2ovtH%2FgG%2BLBVnb6b5g0ux1JGWDXNDj4SEiongQcGjk%2F34hX7LfsYBukt%2BWba4gWHWmj%2BsWdpK0Dwqy%2BoWkonJE%2FvHZOfNcKdasnk80288TN6EEqxOXNWSOJiS7n2p8eB4bySw1ilv8Au4OQk47kKo%2BLv%2FLX7WK6jr4u9Uee1jItndiIiasyv9sV%2Fl3wWAFZBbvYajqsV%2FDSP1yITPUgSKH9SSinYcIRw%2BH7TSJhr%2BYOr2sOkWmnhHSK6YiRolFF5A%2Bn6ngJif8AWyP2ML6dbiRI%2FrqsAI3SRAsMY%2BxHKrlGhfl%2FefB%2B8%2F3XgXXYppJG1m2unkbj6Op2pUSKVAqksSNsif5L%2FFH9vHoUlrytdtDCgdmV7d5I2boU%2BINGT%2FLhpr3nLTKJ9UT19TB4zNHtCe3Jj3b2XIssp1Y8bUfFOQsix7SCSlAXpTmj4av5OnsdM%2BuzB3Zm9OWaNGD2%2FMgRTolP3sXP4Zv92fyYi6oITDVrG28x6NBeBvqWoWS1ivSeIikU8jFI%2BzLA6%2FGn%2B%2B3yFaq1pcXix28ZUGi3U2wadx%2FuziAEWv8Aq%2FH9vDLV7TzXeWrqbaWO4VhHeNHtFdCP7EhX5D4v9%2BfbwpC3liGgvIoVdSqt6pLPGr0pTj%2Bz8Xw4CUkEGil7RwRu9ZzwjPx8UZiKePShyb%2BRfMdhHM2kLEV%2BsDlDLQFncUCxcRX7WEF1DCs63zCs6r6c1Nkencr7rgXSpFsb5zCForepC9PiUEfZr4DADRVD%2BddUkPmPU4lUgVNtNG4qDw2Bof2kP2GyK1LECpY%2BAqTnUFhsta1Ce%2B1G3inuZCrySsgqwqFNRkwu9R8m%2BWIwscEHrharDBGjSH5tT4f9kcIoop4da6Vqt2GW0tbiQHbikbkH57UwHNFLbSvb3CNFLExSSJxxKsuzKwPQjOu3%2Fmq%2B1mFo1C2NmFMjhTQLGu%2FKRtumQfU%2FMWh3uoTXx0r1pJePKSWSnJlVU5lQNufHnhQxmOYxklSPiFCDvUZQKUIpUn7Jr0%2B7D8eYrBP7nRbUf61W%2FhmPmtkBFvptnEezCMkj78CpRZOY5w%2FBmWhBCjseuSyyn0pIpIr2CSr2gtbYTQt6aylufPp8PBWbCZPNurROskYgVkYOv7tSAVNRtg2780%2BYPNd5CdWuRJHEWkWONFjRaih%2BFAPljsqLeRrVh%2BjQt3GBRoXBBKAfFwag%2BLJ15B17yfealE2taTHcXMG63Eq%2FvbYL%2FvyH%2B6eFK%2F3iJyT9vAXkPygPNEuoxx3KQ3VrAHtYWP8AeOxpv%2FxWqijMv2WZMLdS8vBLx4pg9jqVqTFJIvwup6fvP5lP%2FDLillv5i%2BStPtL867pEEcem6hxkivLWjIk%2FevHb05ftZF9Okd5Et5mayvoWEtrdRmnCUfYmhYfzftp%2B3k3%2FAC68zLfx%2FwCFdWt1eElrbUoW%2BwGIrDPGv7CyU%2BLj%2B18eIeavKM3lq7WqfWNOkYizuXFeNesE9P8AiX7WNbqCncfm2fzRoUmg6zEqa7ZPDPPCv93eQRMC00A%2Fa%2FZaWLCHzf8Al7oOra5b6h5KuBHe3rj61Ywr%2B5Xlu0%2FL%2FdDfzx%2F8Qwpup4VWBrORhfW7iS0YkrJbkdRLKv2om%2FY4fbzsvkXU7fWNHju3jhj1ZAI9UEKhSJvEmg%2BF1%2BPEhXgPm%2B98y%2BWriTyxrM0iCMBo5VVW9aDoJIZm%2BLif5ftRthN5X8zxWXm%2FTZ9dHq6HH%2Foz2z1eNLd1Kq4TvwY%2Bo2el%2FPXkjTPPGkNY3n7q7hq9jeqPjikp%2FwANE%2F8AuxM8mazo%2Bq%2BV9UuNI1KL07y2PFlbdWU%2FZljP7UTfstih9Jy6d%2BVV3f2dja3ltHe6ipezS2mrzAFfh%2B2iMf2K%2FE2Xcfk5ojoTZ311bz1JEjFXG%2FitE%2F4lnlh3USLKCY7lSGLQ7UI3DA9mz0L%2BVP5wLqxi8s%2BaZRHqIpHZX0hAE9NljlPaf%2FK%2F3Z%2FrYqqal%2BS%2BoXb2EYvraWG3kcyvLG3IRuwY%2BkgPFW2PfJjZ%2BRruwuFa21iRYFACKFKsKf6r%2Bmf%2BReTUDxy6Yqo20LQQpE8rzso3lkpyb58QBi2bNirs2bNirs2bNir%2FAP%2FT7%2FmzZsVdmzZsVdlEA9cvNirzb8zvIf6bhOu6REP0tbL%2B%2BjUb3EQ%2FZ%2F4yp%2Bx%2FP9jOHagvqWsMw%2B1ETGwPWh33z1znI%2FzL8hqEutf0qP4JRzvrdR9lwR%2FpCDw%2F37%2FweRnGxTtNBreExw5DsD6Sen9F4gpphto2prYSSQ3Ketp11RbyAiu3QSoP50%2F4ZcK5YzG5Q7eGPEUyRpMykRSEhH7MV2IzGAkDY5h3OSEMkDjyCxL8beaZaglxoOpxTW7qLSWkmn3cX2eJ34nx%2FwApclMsen%2BcdIeC4QCZQPXjH2kanwyxe2RjT7%2B2e0bRtVHLT5SWhl%2Fat5Ozr%2FxWx%2B2uJWtxe6HqSw8wtxDvBL%2BxLGegP8yOMyceQEbcuo7nnNVpZ4JmMtwd4y%2FnD9bENU0y80C%2BazuRyTrHIPsunZh%2FTKil4kSIaj%2BGdZ1HTtM846SXUenKv2gN3glp1%2FykP%2FD5yO9s7vRb2SxvU4sh3I6MOzp7NkyOo5OKmSuGUMvQ9MMdF1m40S%2FjvoAHUfDPA32ZIz9pGH%2FDIf2Gwjt5Qh3%2Bw3%2BdcFnrir0GW5Kyx6hav6ltfqDHddW5Dbi1do5V%2Bw6%2FzZLPLbQ6nP8AWrpAby3oJGI2kXqkrfyyqR9rOU6HrKWHq2N8Gl0y6p66Lu0bjZZ4v%2BLF%2FaX%2FAHYmda8p2i2tk8sjrI7miTITxkj%2B1HJQ7huJ%2BLJR3K3snuq3fo2ruoqQC3idvsgD%2FWpnMJ%2FJ%2Fme4Msq2jC9tuUaXcXER3drJ1japH72NW%2BFmX%2Fit%2FwB5nTdIksyzW0c%2FryxVZgzBmCsa4eCZAKHDIWgbPDvK9jquh6xaW%2BtW81rDL6lozTKaFJQVAB%2BKtfhwvs47myvL%2BNQfTs2kD9UK8gQKlv2Xp8StnR%2FzQ1GW08u%2BlZO0d3dTxxQshKsKHm7hh9jiq%2Fazi6MxEiI5YOa3NyxJMjVrux%2BIrlctmQ3TS91E3jCG2jHI09R1qOdOgFf91r%2Fw2CLKFYxyJBIFZJOwHgMC2NryG3wRnq56t%2FZhusZiihu7cMWt5ir2zpyikUAU9T%2BYcuWR5pdPqiacQrWqXCzR1USVBAb%2FAHYp%2FnwutdVhtdTa%2FgWVBOAk8BcNG9BTqyk4c6rc2dxe2F3c2kcKJGI7qx4kUjpyR0B6Vr%2FNhBqc9haSxpHERaXRaWIt%2FuvcoTRa75PlyQn%2FAJZvYI%2FMUS2SNELiVTEygUjnVW9OlftI8hVWVsnSXVxfTGS6laSViCS2wodjsNs5%2Fo8rrL69qwd6pIrqAw%2Fd%2FYPw9OmSua51GVJ762swQXLCD1AiryNQrMfi2%2FyVwxKkIjW7%2BezjR7PTpr%2BUbv6WyUH8zfa6duOEPnjT7SEWmrxxkSXatazowA5KY%2BScgD9qIrxwQ3mPX7EetqFhAtqPtegzySAewA45F%2FMHm1dcRIGjMdvC%2FqRIKcuVCvJ2%2BR%2BzglLY2yhjnLaESfcEquburW8M5HpzKvIr1FaDl79cRbRr6S8%2Br245GCoac%2FCjKp67%2FwAww%2F8AL3li01qBLgPJO8f7t4wP7s%2FsE9fhOHer%2BVtfgg%2BvabcJe1FJrPjwZVUU%2Fdy%2FR9llyIFixuEzjKEjCYojmGM6jaajZ28RjBiEisJzULTi3iSKR0wboHkTXdWt21OLT5ru2A5RlN1k8SrsVWT%2FAGD5ena1aXA%2Bo6pD%2B9J2WcenL%2FlBJR8D%2FwCrnSfy880W%2Flyzl0m7uJZtJR%2BVmXSsltyNXhYD7cP7ScfiT%2BXDXcxosR1D8rvP2qWUdlZadHZW7kPcPcXEYeSn2EKR8%2BKJ9rh%2FNkRu%2FwArtc026ey1FooJo9yKs4IP7StQclz0brf5jeXtKhR7eYX0sieoiQHYL29Rv2Cf5T8WQ7W%2FMj%2BZrOKd0t1Ct%2B6eDk7xMaj05CaNxb%2FVwEgCy249PlyECMefJ4235fXQ63Uf%2FAt%2FXC7VvKsmkfV7iab1dPlISW7jTeFz%2BxJHWoPg37edQ5kyNDIvpyx%2FbQ%2B%2FQg91OB7hFCurIssUq8JoHFUdD%2Byw%2FU2IIIsMMmKeOZhkiYyHMF5g%2BhCNipcyFf3nwD7cH%2B%2FoT%2B1x%2FwB2J%2BziNyW01%2BNseVtMoMc4G7VH82TCbyxfWMxtUMlnDIPrOli55JIh%2FwCK2ZeMqthYYOMVxBNb%2Fu2HK%2Fsl6JU7Xlp%2B1xDfbT%2FdeFgmPknW7q0eC%2FsZ%2BOoWTck5ftRnrG9PtIfstnatY0iw%2FMfQ4%2FMWh8bfXbdSjxnbmyD47S4%2F5ky55gWcaZqDPp1yZo42Ppz8SvIePHOn%2BTfO2qaXML%2FSHiPqcRf2M9fTYf78Xj8XIfs4qoWsGsQ64Tpp%2Bo31zGbK9WYfFE8Z9TceI4FP9lnpNbWDVdGit9RRbiO4gT1g3QkqCW9jX4lzksE1z5382DU7WzEKoqq5UVAoOIeV9uR%2BL%2Fgc7RDGsMMcS%2FZjUIPkopj0UvHtQ%2FKnV9H1F9X8vXCajyYt9TuQoYLSijkx9OTj%2FlcMS8q%2BaLny95guoNYs2s%2FrfEXsLLxKyJXjLH4pxOdpwl1zy1p%2BvCOSctDcw19K5ioHAOxU1HxJ%2Fk4otNoZYriJJoWDxSKGRh0II2IyF%2FmN%2BXll550z4OMGs2oJsLynfr6Mv80L%2FwDCfayU6RYNplhDYNMZxACqyEBSVqSoIH8uDj0xV8NappV7pd7Np%2BoQNbX9qxSaJuoYfrr9pWwuSNg4NSHBqKbEHxrnrL80Py2g86WX1%2BwCw69aJS3kOyzoN%2Fq8x%2F5NP%2Bw2eXm0q8guZoblGglicpNA4pIroaMjfy0OKvpf8lvMusa5ol1ZazOLqXS3jiiuTvIyOvJRIf2ylKc86eM8y%2Fk35usfK2r3FtfyMtjqoRZZ3qRFNGT6bP4IQ7I%2F%2BxztF1%2BaHke01SDR31aN7mZ%2FTLRVeKNu3qTD4F5dMVZlmylIZQwNQdwRuMvFXZs2bFXZs2bFX%2F%2FU7%2FmzZsVdmzZsVdmzZsVdjXVXVlYclIIIPQg47GSOsaNI5oqgsx9h1xV4R%2BZvkA6VK2r6VH%2FuPlarIv8Aulz%2Bz%2Fxjb%2Fdf%2FA5EoJLK%2FwBFh0yOJU1AyrH6oABboqJItebtyJkjZP8AKVs73qnm%2FwAsyW89les7xzwtSMxMRKG%2BHghpx55w%2FwAy%2BWpbIHWNNjeGKFkDjlVw5%2BIPGwp8S%2FtcfsZGUauQHvdvpNWJxjhyyMZA%2BiXQ%2BUmMXNtcWVzJaXSGOeJisiHsRtll1uLf6rcMeKb20vVoW%2F6pP%2B0v7GHsLr5ptvq7mOPU4ElmEhHH1eCII4kp%2Bz6aO7%2FtephBNBPbytDcRtFNGaPG4oR7EZVKJHrhz%2B92JjDPA4cw3HMdR%2FSiiNG1m7028EiEC4j%2BGWMn4JU7qf8AjVslmvaBp3nLSFvbCiTKCY2P2opP24pKfs%2F9d5BTFFIys5ZGX9pKch9B65JvKmrSaVdevxea1m%2BCcEFQyj9tR%2FvxMtxZBIV8x3Oi1eknp5Ud4n6Zd%2F7XmskVxp11JY3sZikjbiyHsf8Amk%2Fs4caPay6peQadE6rJMwVXboF6k%2B%2FEDOn%2BdPIkfmSyGp6QA12qc4JFpSVPtcG9%2FwDjfI35a8qzaFNa3urKrXLmscfI1gP7NSv2n%2FmywxouIN1DWPKDW95DY6K0t5IfgnaUKgD05cl49I6H7TZ0bynBAmmjSVvhcz2qEM60%2BHnVRw9om%2BH%2FAFsItfhndg1q%2FpNdxmIuDQVU%2FECf8oYReSLk6R5nWBw1bmT6sSD8FGBb4h%2FNyXDyPvbsWITE9%2FVGJkB30jPKV1PpOsrBduRLFcPb3JY9VditW%2F2XxZ0%2B91O2spIoJWL3E54wW0Y5SOf9UdF%2Fmdvhzm%2Fm2w%2BoeapJlBVdRjWdCDsZE2cfeuHdvfQW0BngZptVvEH1u%2FlG6gj%2B5hH7Kr0xHc0pD%2BYg8wa1NDFZWjSWtsrCRoiGJcn46b1YdF2yFWemzxsW1CN4Ej%2FZlUofubOs2WpxpNGl2oMP2eSbEe5yTXGkadqFpJaT26T2860YEVBB6EHx8MeCzdpunlEtpHYQ38GqRrFNaPA8EgJcFa%2FGqhadao2XBGlmbe2uCzevbGeRo2PcNJx%2F2S%2FDht51s3sLpYLoH6ncIq21wRU1UceLt9Hxf8Hhj5f8pXerWc%2Bq2VrHqE1oqQWdvNLwUoijmJB%2FO9W4%2Fs8cjVH3LezEvM2mXWqyabNozB7SS1WJ5SwBrHWnLv8A3ZUbfy4onlazmtrKC%2BJlNoHFFNFbmQaHvtTJ9rPlzU7GOO6vrRbeNioQQMrRxmn938IXj4YE0fQLnXBdQ2062l1CP3SSry9Xav7og0%2F4LDsikps7C3s1WK2iWJB%2Bygpg5lNOX0YAVr7TL0xXsxcxsVlhktwpFPtLVWwbf%2Ban0e8tp7LTYrmyILlpyT6hoRw2%2Fu%2FTbdlw3taoK4v7a1dY2dW5GjQ1qVHj%2FwA24Vah5a03VlNxZEQTtvyX7LH%2FAClyfjyfo3nrTrbV9PRNI1i6gM8qRENC8gb05OUI%2BNR6nR1%2F4HIRqOj655Vu%2FQ1SBogT%2B7mU1ikA7pJ0%2FwBi3xZGwdizhOeOXFCRBSPSZNX8maml1MhNsfgldPijdD1H%2BS37S8s6ZLrEEZt2uEe1W6VWtLsg%2BlKGHIGOReS%2F6wOR9dWtRp11dSQ%2FWHt4Wk%2Br93IGyU%2Fysk%2Fk%2FW5INATT9Z0eAWczGT6gr%2BoIlfcgBxsf2vT%2FAGMYxMSeE2D07m7PqBmjEzjWSO3EOUo%2BY72M%2BYfLcd3FJeQRxyo7EzQU792GQ60bU9Hkf9HTAwts1jdVeNl%2FyX%2B2n%2FEc7ZL5XstVSS58p6kYZqVbTrysif6tWPrRr%2FspVzmuvaDq2jzsup2JtA5NCfjtmNf91Tjb%2FYyccJ8tmgJPqV4JJLJpI3sYLqJ2uY%2FtBgP91q6jpIy8Vw0sNNn8tG11m8KWNnqTrAums5YhTvyct%2B0R8fw%2FYb%2FWwLdRpfaVEkkPO50r1HhjJALRSg9HpX92%2FwCzgSW4TV9Hga5uppdVspFt7a0FOMNshHJm3VuZY8fV%2B0zfBlZHq3BNigOnm52LIfDHCYwMCJmVXI8IqMYnzI4f85l%2BsRQc7eSKVRPHKts4ruUkPAcv9R%2FiwbZaY1p5gtrHUoipjnjWZOo4lhRv8pGwcPL9pcROZo2S6ZkaXgyqoaFVk4hn%2BJ9uPqNxwVrmsWupvYzalF9S1K1lTi6GscsYYMpV%2FFWUNx%2FlwYoSjd8jybO0suLMcUsdmUQROxRrnH75PQtd8vaT5itBZapAJI0YPE6njJGw%2FajcfZzg%2FwCZWh3GhW%2Fr2wH1vSZ0DXlPia1m%2FuZuK7MV%2FuLj%2BbPQ1pdR3ltHcxGqyCtOtD3H0HIF%2BZFnb3k8EMqhxPBJHOh6MnIUDfSdssDq3zfqWmR6lFJqenRCO6iHK%2Fsk3FD0ng%2FmjfC3SNVudJuUvrKQJdQOrxc1DoafaSRGqrK%2FRlyU32i3XlnU4RHOYrF2Isr1hy9Jm%2F495%2F8AimT%2FACsKte0Zp%2FW1Kxg9KaL%2FAI6Nipr6bH%2Fd0X88En2lfFX0%2FwDlz5x0fzbpAlsIYrO%2BgAF%2FYxBVCOR%2FeIBTlE%2F7Lf7HJpniLyz5m1TyrqVtq2ly8ZYzuvVWX9qOQftI37WeufJnnHTfOekJqViwSZaLd2pNXhk7qf8AJP7D%2FtYFZJmzZsVdmzZsVaOct%2FNj8sx5ntJNb0NfT1uBayxrt9ajUfY%2F4zqP7tv2vsZ1PKOKvhz0CsbwMzqSSHPRgw2%2BL3%2FmwrlheB%2BD9exHQjxGeqfPH5Oad5lupdW0icabqU3xTqV5QTN%2FOyr8SOf2nX%2FgM59H%2BQfmu5nWC9ns4rbl8U6OzMB%2FkpwGKr%2Fyk%2FOBtOMPlnzTMWsyRHY6g5qYq9I5j3i%2Flf8A3XnoxWV1VkIZWAKsNwQehGc68sfkv5Q8vBZriE6rdrQ%2BpdAemCO6wj4f%2BD550VVCqFUUVRQAbAAYq3mzZsVdmzZsVf%2FV7%2FmzZsVdmzZsVdmzZsVdiNzNDbwSTXLBIUUmRj0A98WwNfPaJbSm%2BKi2pSUv9mh2pirAPON5pMWiStoiPJfM1bVI4yy1G8jDkCnwrhDrD6jFb%2BWbC7Wt36Ecl%2BCP%2BKiZHbtyJajf5WDvP9xZRaNCfKtxKb4zj04IOR403JKkfAOfH%2FWws84ajNd3EEklFuSOUtK%2FDRVXiKduQOFIeeatpk0F5PeaUj%2BlATLIYwSYhXd%2Fh%2ByleuLP9U12ykmiWO2vrWOW4n3PxgcAFXmaty3cf77%2Bx9jO1%2Flvo0EejT388SvJqDMjFxXlEvw8TX9ls5h%2BY%2FkSTyne%2FpHTVY6LdsVUj%2FdDt1hf%2Fitv91t%2FsMgRW4dxo9X4vDiySqcfon%2FO%2FoyYJsQGHfJL5FsrXUdZk0m6uTbR3UTvHQAgzRjkONSODla5GgcX0%2FUJNL1S0v41DPFINm8G%2BE%2Frym%2BHMD0k52txeLppjqPUPfF6l5X8xWlm995evZlguLSdkjR9gTWjrXovP4XTEPM6wwzKSKCT4tuoIO%2B3vke80xXU2tW13ZQ%2Bo15bq8npJ8UlELVp%2B3sMBWOsXOtWy2iEyXNuCyIw5Myf8VsaseFP7tvizL4tq%2BTzNUfvT%2BOU6npky9ZrciVAO5Xw%2Ba8sis01rp%2FmC01O5YrSWJ4kXcyFiB9nsK%2Ft5fljzLXzMlg0bRQujQESbVlDcl5IenL4kyeebPIp8y6j5e1DSEjX0XWO4QsqKYk%2FfRgV%2Fb5gx8cHMe5lGUom4mjuPnzSW%2F1OfVL6R7sJW2keKFUGygGhIJ3PKmNVy%2FTAk1pdWc9zBdrwuElcTIezA%2FEMj%2FmjXbvQtaW3tEBgCJM6PuCHFQExtizSKI1DHJv5VuxKrWMp%2BwC8JPh%2B0v0ZCNLvrfUrGG9tjWOVQfkf2lP%2BqcPdHme3vIZV24sKn2Ox%2FDJBSyzzBplrqWnSQSxLI0P76EsoIDqO3%2BsMgmlaxceUdRXU7ZS9jJRb62XoUP7QH80f2k%2F4HOgXdyVYgHp1%2BWQW8g4TzQyoQpJIVh1VuhGJCh7FG9hrempKhW4sryMMp6hlYV%2B%2FOWa%2FbXfk%2FU0ZJOEL1ayu2%2By1P91udv3if8OuCPJ%2FmhPL1xaaJetx0y4rFFMx2imJJSvhHLXj%2Fr4N%2FO9G%2FwAJ28o%2FYvY69%2BqOMgdlYzqPmWy8xr615aouoxAA3dk4dJB0%2FfRGjofBl54U%2BnCySRNSa1l%2B2vQq3861%2By65GPKcztqxjY7NEw4jYbU32zoNppF1qfrw2JX6yierHExoJivWIf5fH7DYYnZaY3pN9N5N1n9JJEbuIwyRoisY1kDbpVu3F%2FidM7xpl3Y%2BadFt7m5tle3vIUkaCYBx8Qowof5WB%2BPONG0jvLY28qlRUgqwoyOOu37LpiXl3XbjyZqk7XglmtZIfTEKNQGh5REFvsxr8XLjgIrdWQedvy7GiQPrfl4SNaxVe5s1q7Rp3ki%2FaaNf20%2B1kT07WGCqwcMjdJFNQc9C2N9BqNvHc29WiljSVGI2KyCopkFv%2FwAotHu9cOq2d1JYW0x53dhAo4O53JQt8MYf9ocMFyB23ZwGOQIkeCQGxqwfIsatNQSQrIrmOUbrIhoQfEEb5LLHzPP6X1TV4RqFo4ozFVL0%2FwApD8EmFms%2FlxeWBNxoEpuIhubSQj1B%2FqPsHwo0%2B4ltUmW7Ro5ojRo3BVhT2OWCi1t%2BbPJ1pFCfMXlJgtl%2Fx92VCyRHuwjb4kX%2Bdf2ciOlG2huhcX2n8JI2BE8FHHzMTb%2F8TVc6FpWutaySPblJEmHGeCQVVwP1ZGtcsIbe5N3p0Ui2MlWaM7mB%2FwBpQ4%2B1F%2FLkTGulhnDIYnYprf6tYaxaxxCDlxIaG7iko8Z7kGtWr%2B3ywxsdGl1WwitzGbkgkRzugDGnRm34R0%2FZbIJBZwxv9YhAVx8Qp0JPiBnafJl1eXekLNdyrKOXGNgADQD4g3Gg%2BE7Y8WyTLfiHNJbbQvNHle%2Fe50eQX%2BnXAD3Vg53EoWnKImhQmn7Pwv8AyYRX9xql1dmXWOS3XHiqMnp0QEkKq%2BA5fazrQwHqOmWmqQGC7j5D9lxsynxVsFsLeO39hb39tJbXMYlhlHGSNuhB%2FUffOZXy3%2Fl7UV05n5MgrpN1LTjLCT8VncEj%2FYf5Odt1nQbzR3JcerasfgnA2%2BT%2FAMrYB%2F5V3Y%2BdtAvhefubrn%2FuNux1jkQUYkD7Ubnir%2F6uEq8D1rTFk9XUdNgaHix%2Bu2XVoHPcD%2FfbfstnQfyAeb%2FFktC%2FptaSF1VgFNGTiXFfiA%2BLj%2FlZC9WuNd8p6kNM1e04anYsY2mY7TW%2FZG2pKjfsS4K003mkCHzl5WmDLazercWoB9WCvX1FB%2FeQt9lv8nIofYNRl5FPI3njTfO2li7taRXkQUXlp3Rj0Zf5on%2FYbJXirs2bNirs2bNirs2bNirs2bNirs2bNirs2bNir%2F%2FW7%2FmzZsVdmzZsVdmzZsVdgHVY9PmtHi1JlW3cgEuQBUbr1wdgPUdNttTtzb3IJWoZSOoYdxirzHztP%2Bi20aTyvdm6uDcJSCMJIPTVhRWKj7Bbbi2B9b8keZrnV3FvberbsQsVwHUKFJ6tU8hSvhk%2B%2FwAPGy1GwvLOkqK5ju0cIP3YQ%2BnItAPiif8A4nkkphKQaQOk6eml6ba6fGQVt4whPif2j%2FwWO1LTbPVrGfTr%2BITWtyhSWMjqD%2FEfs4MzEVwIsg2Ni%2BVPOHlm58p65NpU1XhP72znP%2B7IWPwn%2FXX7En%2BVgW28s63f2kWr29m76Ys6xyXQpxUggNUfa4iv2uOen9c8t6J5it0t9as0uo4zyjLVDKf8l1oy5EL7TriGW30Lytp7Q6Dbs0d7xI4Oz%2FFWPlycmNvib%2BfKziufETs7WXahOn8Ph9dVIn6a7%2FewDzPd3ukNplzYtxtEhW2adVBKzRktTkalOdf%2BBw60bydZ%2BaNR%2FwARaPq0VjOIw509bcLIkw%2B16yh%2FjRm%2F3an28de6dLYTXGk6xDztpx8aHoyn7Lqfb9nI3YX%2BreQ9ThS3pcWhcvazMBWSE%2FbgaQ%2FF8P8AJlrrDvunvmryB9buFvzAtnrkQD84z%2B6mKHkGRtu%2F82HWnO%2BoadLpU5aC4ZeUL9Gil%2B0jKR0aOYZOLO80jzho0d3Zv6kMn2WFPUhlGxVh%2By6H7WQWaO80rV1hvwBMjcfUAoskTbLIP%2BNsIr5oSu10tfOt7Ikt4th5ijQC6hkSsdz6fwfWIiCCr7UmTj%2Fl5JG%2FKTSdTjg%2FxDILh4UCUgHD7P8Axafj45GPMdkYtRkvbWf6jewEXNhcr9ppT9pEVatJWnxJx%2BznRPIfmz%2FFujfW5Y%2FSvLZ%2Fq94gBCmQCvNQfiVX%2B1xb7OA2NleaX%2Fkr%2FA19Jb2rO%2BlXbc7UvuFbuvL%2Bb%2FiWC7M7HOuarpdrq9jLY3i8o5Bse6t2df8AKXOP6jbaj5dvpLK5USBd0fcB07Ov8cMT3qkP5l6trkWp2kNi8sVr6CShoyVDyH7RJHXj8OQpfNfmCN1%2BsXcsnBeCrOfUAUdFHP4uP052ny%2Fq2g6veR6T5hgX94Almsp%2Fdsw%2F3W%2F%2BU37GSHUfyp8n6hUpavZse8DkD%2FgH5p%2BGCXNeTwM%2BbzeWxtr%2B3SVHFGMZKMP8oBqr%2FwANh9qv5gpr3kVfLV9zk1O3uIjFOwrzt4w1GZhUeqn2P8rJD5i%2FJJrK2lvNKufrSx%2FEYCnCXiOtCpKPx%2F1M503lq7tpDxDNUUUGlPwyJtWQflfpMWseaFtLgssZtZnDJ1VhxCn3651e38qanp%2Bs2ZX95brKG%2BtR7UVfio6%2Fs16YS%2Fk3pGmWxvNR%2BspJqfEW7WnR4kryLFW3PqN%2FL%2FLnW8I2UsW8x%2BVo71n1LT0CXp3mjGwlp3%2F4yD%2Fhsgl9oyXUaxX1u8LoCY2dStV%2FaG%2Fgc7JTEbiztrr0zcRrIYmDxlhWjDJCXQoeVeW9Rv8Ay1PKL25kuNO9ELEo%2BIjgaoKk%2FAqJyzqtrdQXkCXNs3qQyqGjcdCCK7ZFPMPl1Yg95aLWA7zQjfjXqw%2FycB6JrNzY3BW7uAbARKgUqSQVIC8KfCq8K8vhxq9wlntK4DvtJ07UgBfW6TU6FhvTwqN8FRyRyoHiYOjCoZTUEHH5FDC9Y%2FL6wuSZ9Ic2M3X0tzEfo6p%2FscL9B%2FLy8XVJNS8y3Yuo41aKz0%2BEkQrGwoWlO3N2zomVTDZV4l5n8s3Plq94oS%2BnTk%2FVZj27%2Bk5%2FnX%2FhsMNI893Wj2ht2thNVSEp8PGSlBK%2F%2BSf286nqOnWmqWcllexiSGQbg9QezKf2WGco13yhdaVMUT95A39zL0DDwPg%2BIZc3pPlzU5dStGa4IaeNgGZaAFWHJWoMOc5v5E1B7Wf6tcAoD%2B5PLb3jP0fYzo4xIYrZIo5UaOVQ6MKMrCoIPtidrZ29lAttaoI4UrxQdBU1OL5sCsO8%2FwD5e6V5708RXNINQgB%2Bp3oFStf2JAKc4m%2F4XOIWX5R%2FmVoOpummwIySAxNMssZhZG2q3Mqen80eeoKZqYq8l8h%2Fk%2FceW9Qt9Z1DU3W4gPJLS0JCEGvwTytT1U3%2Bx6arnWs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F1%2B%2F5s2bFXZs2bFXZs2bFXZs2bFXUzZs2KuzZs2KoXUjILG49E0k4EKetK43TYkhsoQp5EqGZvEnvgp1DKVbdW2I9jhDdaDqT%2FuLLWJbOzP8AulEVnAPVVkb4hiqB8wWUXmS%2BXTYWQi3ikZphuUlqOKmn7P8ANnOtRsiPW0TWUKqD9ofajYfZkQ%2B3%2FDLnYtH0Wy0W3aC0BJc8pJHPJ2J8ThV5u8tJrdoZrdQL6EH0z0Lj%2BQ%2F8a4bTbxXQPMGq%2Fl9r7mSs9jcUN3Cv2Zo%2B1xD4Sp%2FzZnaNYhtfNmgRaho7JcMwE1pKCASP246%2Fsn%2BZf58gsugWWtaPFp1xRL21qFkFCyP3U96YR%2BUfMt7%2BX%2BqvpmqEtpUsnGeOtQjE0FxD%2FwAzUxOy%2B5kHmGCOa1s7%2BVeEsFYpHI3SvwyBvDi647RtH1by3qEXmPT5VlgnWmo2C1Amj6rIrH4RMnVcCz3FvJ5x1pIqX2h30cVy3ouv2nQEeka9XZW5ZJNPult7dbZpTLasP9HlYUalP7uVf2JlH2v%2BEw891ZzY3tvqNtHdWz84pBUHoQe6sP2WX9rC7zJoEOu2Xp7LdRVa3lPY90b%2FACHwi0IahBqtdOo9hKf9LjY0Vf8ALU%2F78ybZFD591jS3R3gnRo5Ymp4MjA9snHkr8weRi0LzJII7pQEtdQc0SYdFWQ%2Fsy%2F5X7eH%2FAJw8uLqMDX9qg%2BtRL%2B8Uf7sQf8bLnJbuyjcNFKnND1U%2Fw8Dh5pfQo3Gc487eVFhMmq2KfuHNbmNR%2Fdsf92KP5G%2Fa%2FlyPeXPM%2Fmfy2Y4pmk1PRqfBBKpNwiDr6E3%2B7OH8j51%2B1ubXU7JLiKklvcJWjDqrDdWH%2FEsV5PntoFiuUuQOFxFvHKpKsPpWnLJZ5b8w65p1xEguXuIp3q8d07P1%2FZVm%2Bx%2Fkccbr%2Bhm2125sbPggX95AZq8FRhy3p%2FL8Srk181aDHqempqtvRLu2hDngPheMDmV%2F2P2ozjsrKLW5ju4Eni%2By4rQ9Qe4OL5D%2FACp5hgu7iOwkkUXFxD6yx9DWM8HNMmGJFFDRFRQioPUHIhrmgrAXubdK2z19WOleFepH%2BRkwymCkUIqD1BxBpWIaNq09o31WURrZoiem32ePEheCIB8VV%2BLJcGB3BBHtka1LQXVne0XnC9eUQ%2B0tevHxXA2lxazHfW620rx2atW4gkSqFOPCgdvjDClVwkA7hWYZswzZFXYnNBFPG0UyCSNvtKwqDimbFWE6voE1hIbu0Be3BrQVLIP8rxXJRo92b3T4Z2%2B1Ti3zG1cGkAih3B7ZSRpGvCNQqjsooN8NquzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Dv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxViPmbyo91cfpvQiINVT%2B%2Bh6RXSD9iXwl%2F33N%2FwWQzW9AXXo%2FXaFg7L%2B%2BhK0mjdBuafzACjrnYcDTWNrPKk8kYMsZDI42NR40w3tRW3z1p2l6ho%2BotLAfXVE5OgDVljA%2BLj%2FxZGv7OS2BbeaRbscpI5YuLQq3ETIfiQcv2ZVP90%2F8AsMk3mi1FjqBnt0CpcIHIUU%2BNT8RFP5tuWRDTFEulwPaP9YjVSfVjBIFGPM%2F7BvHCOSXqXlu6trnTI1t7Y2Zj%2BGW1YhmQ%2BJcfb5fzYcZBPKl1I7GRXHKGi3AY%2FajPRvdsnQNd8BFFDjnL%2FPWhJaXguIKRw33KngklPi%2F2Pxcs6jkY892Ul3onqwoZJLWRZeAHIlT8D7fJsAVBaLpUeueS9PtriYPcWykQXkfZ4yVDD%2FJP2WwX5X1NJ2NrQIGXkoXpzQ8JP65GPJfmOTR5G0zXLmGCzlYmzhZPSeE05ceP7UTjfliOhagkWs3CW0gkUXbPZjoZVkY8kQHr8OSHUJZD540vmYtVRBIAvoTo260JrGzU7cvhzaJ5jgm0t9O1u7giu%2FRdY%2BJ48oyCg%2Fd9QyfZ%2FwArJhPBFcwvbzqHikBV0PQg9sgt%2FwCSLpJy9pxniPRiQsgH8rfzYB5ql%2Fkq1hXU4ZigNwjsizftemU3Uf5Jzp%2BRXyloF%2Fpj3FzqYiR3YraxREsyx%2FzTOaL6j%2Fyp8CZKsSUOzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Hv%2BbNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxV2bNmxVg35iPrMEFld6XbR3CRM%2Fro1fUIIHwx%2Fs4U%2FlrqOkz3c1lYQmENFJI8DCgRzIDIg5b1JavTOiajZLf2cls1KsKofBh9k5ydpJPL%2FmzT9ZcBIWY2t5sFoD8Ls5C1%2FwCDkyQ5KyjWdLGi6ml3brSyvKxuo6I58P8AJPVclOiXZurPi5rLAfTf5fsn7sE3drBqFq9vLR4pV2I7dwy%2B%2BF2j6Xf2F5dS3EqNbyhViVa8iV%2Fbfag6%2FZXBdj3KnWURXLzYFYV5n8n3us6ut7btEITGsbc6hl418B8WFd75Ym8svHqVqPrQiCsJSPiikH2jQfsNnScayhwVYBlOxB3BGG1Sby7rf6YgZ5KCZftIBSmHeFllodlp95LeWqlDMKGIfYB7kDDPE%2BSuzZs2BXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F%2F0u%2F5s2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZFfM%2BipLW%2BSJZAf71CtaMPsygf8SyVZRAIIO4PbCDW6pP5YvDd6Wiu1Zbc%2Bi%2B9Tt9mv%2Bxw5xG3tbe1Vlt41jDHkwUUqfE4tgPNXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFXZs2bFX%2F9Pv%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV9%2F5s8AZsVff%2BbPAGbFX3%2FmzwBmxV%2F%2FZ');background-position:center center;border:1px solid #00aa00}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-twourls.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-twourls.out
deleted file mode 100644
index a0a8b21..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-twourls.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #00aa00}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-twourls.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-twourls.out.b
deleted file mode 100644
index a0a8b21..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-base64-twourls.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:none;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #00aa00}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-dbquote-font.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-dbquote-font.out
deleted file mode 100644
index 7c4c0ed..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-dbquote-font.out
+++ /dev/null
@@ -1,5 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-dbquote-font.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-dbquote-font.out.b
deleted file mode 100644
index 7c4c0ed..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-dbquote-font.out.b
+++ /dev/null
@@ -1,5 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-doublequotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-doublequotes.out
deleted file mode 100644
index 8301f10..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-doublequotes.out
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-doublequotes{width:100px;height:100px;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82");border:1px solid #00aa00}span.othercss{font-family:"Times New Roman";font-weight:inherit}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-doublequotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-doublequotes.out.b
deleted file mode 100644
index 8301f10..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-doublequotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-doublequotes{width:100px;height:100px;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82");border:1px solid #00aa00}span.othercss{font-family:"Times New Roman";font-weight:inherit}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-noquotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-noquotes.out
deleted file mode 100644
index 8f4bf08..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-noquotes.out
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-noquotes{width:100px;height:100px;background-image:url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82);border:1px solid red}span.othercss{font-family:"Times New Roman";font-weight:inherit}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-noquotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-noquotes.out.b
deleted file mode 100644
index 8f4bf08..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-noquotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-noquotes{width:100px;height:100px;background-image:url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82);border:1px solid red}span.othercss{font-family:"Times New Roman";font-weight:inherit}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-singlequotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-singlequotes.out
deleted file mode 100644
index 863100e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-singlequotes.out
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-singlequotes{width:100px;height:100px;background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82');border:1px solid #0000aa}span.othercss{font-family:"Times New Roman";font-weight:inherit}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-singlequotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-singlequotes.out.b
deleted file mode 100644
index 863100e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-nonbase64-singlequotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-div.nonbase64-singlequotes{width:100px;height:100px;background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82');border:1px solid #0000aa}span.othercss{font-family:"Times New Roman";font-weight:inherit}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-noquote-multiline-font.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-noquote-multiline-font.out
deleted file mode 100644
index 6b32e33..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-noquote-multiline-font.out
+++ /dev/null
@@ -1,3 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url(data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-noquote-multiline-font.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-noquote-multiline-font.out.b
deleted file mode 100644
index 6b32e33..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-noquote-multiline-font.out.b
+++ /dev/null
@@ -1,3 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url(data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-doublequotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-doublequotes.out
deleted file mode 100644
index f9e7600..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-doublequotes.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==")}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-doublequotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-doublequotes.out.b
deleted file mode 100644
index f9e7600..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-doublequotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==")}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-noquotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-noquotes.out
deleted file mode 100644
index 110f9fc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-noquotes.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-noquotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-noquotes.out.b
deleted file mode 100644
index 110f9fc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-noquotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-singlequotes.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-singlequotes.out
deleted file mode 100644
index 1a4e2c6..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-singlequotes.out
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==')}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-singlequotes.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-singlequotes.out.b
deleted file mode 100644
index 1a4e2c6..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-singlequotes.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==')}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-yuiapp.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-yuiapp.out
deleted file mode 100644
index ed5e998..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-yuiapp.out
+++ /dev/null
@@ -1 +0,0 @@
-html{background:#fff;color:#555;height:100%}#hd,#bd,#ft{padding:0 50px}#bd{padding-bottom:50px;border-bottom:1px solid #006e9c}#ft{background:transparent no-repeat 0% 100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=);padding:0 0 40px 0;margin:50px}#hd,#bd{background:#f9f9f9}body{margin:0;padding:0;font:12px "Helvetica Nueue",Arial,sans-serif}#hd{color:#fff;padding-top:50px;margin:0}#hd,h1,h2,p,.color{margin:auto}h1,h2,a{color:#006e9c}h1,h2{margin-top:0}h4 .title{font-weight:bold;letter-spacing:-2px;font-size:47px;text-shadow:0 1px 0 #369;background:#006e9d;color:#fff;padding:0 10px}h4{display:block;float:right;margin:0 0 0 20px}h4 .what{display:block;padding:4px;text-align:center;font-weight:normal}h4 .version{font-size:11px;color:#ccc}h2{font-size:40px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:300}h4,p{padding:6px 0 6px}#ft p.fine,#ft p.fine a{color:#999}#ft p.intro{font-size:12px}#bd{font-size:14px;color:#666}#ft p{font-size:11px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-yuiapp.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-yuiapp.out.b
deleted file mode 100644
index ed5e998..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-realdata-yuiapp.out.b
+++ /dev/null
@@ -1 +0,0 @@
-html{background:#fff;color:#555;height:100%}#hd,#bd,#ft{padding:0 50px}#bd{padding-bottom:50px;border-bottom:1px solid #006e9c}#ft{background:transparent no-repeat 0% 100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=);padding:0 0 40px 0;margin:50px}#hd,#bd{background:#f9f9f9}body{margin:0;padding:0;font:12px "Helvetica Nueue",Arial,sans-serif}#hd{color:#fff;padding-top:50px;margin:0}#hd,h1,h2,p,.color{margin:auto}h1,h2,a{color:#006e9c}h1,h2{margin-top:0}h4 .title{font-weight:bold;letter-spacing:-2px;font-size:47px;text-shadow:0 1px 0 #369;background:#006e9d;color:#fff;padding:0 10px}h4{display:block;float:right;margin:0 0 0 20px}h4 .what{display:block;padding:4px;text-align:center;font-weight:normal}h4 .version{font-size:11px;color:#ccc}h2{font-size:40px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:300}h4,p{padding:6px 0 6px}#ft p.fine,#ft p.fine a{color:#999}#ft p.intro{font-size:12px}#bd{font-size:14px;color:#666}#ft p{font-size:11px}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-singlequote-font.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-singlequote-font.out
deleted file mode 100644
index fd51d54..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-singlequote-font.out
+++ /dev/null
@@ -1,3 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-singlequote-font.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-singlequote-font.out.b
deleted file mode 100644
index fd51d54..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dataurl-singlequote-font.out.b
+++ /dev/null
@@ -1,3 +0,0 @@
-.y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:normal;font-style:normal}
-
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/decimals.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/decimals.out
deleted file mode 100644
index a7ef730..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/decimals.out
+++ /dev/null
@@ -1 +0,0 @@
-::selection{margin:0.6px 0.333pt 1.2em 8.8cm}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/decimals.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/decimals.out.b
deleted file mode 100644
index a7ef730..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/decimals.out.b
+++ /dev/null
@@ -1 +0,0 @@
-::selection{margin:0.6px 0.333pt 1.2em 8.8cm}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dollar-header.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dollar-header.out
deleted file mode 100644
index faf5e12..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dollar-header.out
+++ /dev/null
@@ -1 +0,0 @@
-foo{bar:baz}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dollar-header.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dollar-header.out.b
deleted file mode 100644
index 9308100..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/dollar-header.out.b
+++ /dev/null
@@ -1,3 +0,0 @@
-/*!
-$Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $
-*/foo{bar:baz}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/font-face.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/font-face.out
deleted file mode 100644
index 3a1077c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/font-face.out
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:'gzipper';src:url(yanone.eot);src:local('gzipper'),url(yanone.ttf) format('truetype')}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/font-face.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/font-face.out.b
deleted file mode 100644
index 3a1077c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/font-face.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:'gzipper';src:url(yanone.eot);src:local('gzipper'),url(yanone.ttf) format('truetype')}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/ie5mac.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/ie5mac.out
deleted file mode 100644
index f90df41..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/ie5mac.out
+++ /dev/null
@@ -1 +0,0 @@
-/*\*/.selector{color:khaki}/**/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/ie5mac.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/ie5mac.out.b
deleted file mode 100644
index f90df41..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/ie5mac.out.b
+++ /dev/null
@@ -1 +0,0 @@
-/*\*/.selector{color:khaki}/**/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-empty-class.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-empty-class.out
deleted file mode 100644
index 0442012..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-empty-class.out
+++ /dev/null
@@ -1 +0,0 @@
-emptiness{}@import "another.css";empty{}@media print{.noprint{display:none}}@media screen{.breakme{}.printonly{display:none}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-empty-class.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-empty-class.out.b
deleted file mode 100644
index c95413d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-empty-class.out.b
+++ /dev/null
@@ -1 +0,0 @@
-/*! preserved */emptiness{}@import "another.css";empty{}@media print{.noprint{display:none}}@media screen{.breakme{}.printonly{display:none}}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-multi.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-multi.out
deleted file mode 100644
index 648ac7d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-multi.out
+++ /dev/null
@@ -1 +0,0 @@
-@media only all and (max-width:50em),only all and (max-device-width:800px),only all and (max-width:780px){some-css :here}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-multi.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-multi.out.b
deleted file mode 100644
index 648ac7d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-multi.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media only all and (max-width:50em),only all and (max-device-width:800px),only all and (max-width:780px){some-css :here}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-test.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-test.out
deleted file mode 100644
index b6afff5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-test.out
+++ /dev/null
@@ -1 +0,0 @@
-@media screen and (-webkit-min-device-pixel-ratio:0){some-css :here}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-test.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-test.out.b
deleted file mode 100644
index b6afff5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/media-test.out.b
+++ /dev/null
@@ -1 +0,0 @@
-@media screen and (-webkit-min-device-pixel-ratio:0){some-css :here}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/opacity-filter.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/opacity-filter.out
deleted file mode 100644
index cf15296..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/opacity-filter.out
+++ /dev/null
@@ -1 +0,0 @@
-pre{border:solid red;opacity:0.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80);zoom:1}code{-ms-filter:"PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80)}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/opacity-filter.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/opacity-filter.out.b
deleted file mode 100644
index cf15296..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/opacity-filter.out.b
+++ /dev/null
@@ -1 +0,0 @@
-pre{border:solid red;opacity:0.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80);zoom:1}code{-ms-filter:"PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80)}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-case.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-case.out
deleted file mode 100644
index 373bcbb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-case.out
+++ /dev/null
@@ -1 +0,0 @@
-#AddAddressForm{padding:0}#AddAddressForm .messageBoxNeutral{padding:0}#FeedbackMailForm{padding:0}#FeedbackMailForm .classe{margin:0}.classes,#FeedBackMailForm{margin:0}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-case.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-case.out.b
deleted file mode 100644
index 373bcbb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-case.out.b
+++ /dev/null
@@ -1 +0,0 @@
-#AddAddressForm{padding:0}#AddAddressForm .messageBoxNeutral{padding:0}#FeedbackMailForm{padding:0}#FeedbackMailForm .classe{margin:0}.classes,#FeedBackMailForm{margin:0}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-new-line.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-new-line.out
deleted file mode 100644
index f2fe1ea..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-new-line.out
+++ /dev/null
@@ -1 +0,0 @@
-#sel-o{content:"on\"ce upon a time";content:'once upon a ti\'me'}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-new-line.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-new-line.out.b
deleted file mode 100644
index f2fe1ea..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-new-line.out.b
+++ /dev/null
@@ -1 +0,0 @@
-#sel-o{content:"on\"ce upon a time";content:'once upon a ti\'me'}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-strings.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-strings.out
deleted file mode 100644
index 3f1d010..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-strings.out
+++ /dev/null
@@ -1 +0,0 @@
-.sele{content:"\"keep  \"    me";something:'\\\' .     . ';else:'empty{}';content:"/* test */"}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-strings.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-strings.out.b
deleted file mode 100644
index 3f1d010..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/preserve-strings.out.b
+++ /dev/null
@@ -1 +0,0 @@
-.sele{content:"\"keep  \"    me";something:'\\\' .     . ';else:'empty{}';content:"/* test */"}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo-first.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo-first.out
deleted file mode 100644
index 687117c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo-first.out
+++ /dev/null
@@ -1 +0,0 @@
-p:first-letter {buh:hum}p:first-line {baa:1}p:first-line ,a,p:first-letter ,b{color:red}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo-first.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo-first.out.b
deleted file mode 100644
index 687117c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo-first.out.b
+++ /dev/null
@@ -1 +0,0 @@
-p:first-letter {buh:hum}p:first-line {baa:1}p:first-line ,a,p:first-letter ,b{color:red}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo.out
deleted file mode 100644
index bb7f8e7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo.out
+++ /dev/null
@@ -1 +0,0 @@
-p :link{ba:zinga;foo:bar}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo.out.b
deleted file mode 100644
index bb7f8e7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/pseudo.out.b
+++ /dev/null
@@ -1 +0,0 @@
-p :link{ba:zinga;foo:bar}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/special-comments.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/special-comments.out
deleted file mode 100644
index 97eb92b..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/special-comments.out
+++ /dev/null
@@ -1 +0,0 @@
-#yo{ma:"ma"}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/special-comments.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/special-comments.out.b
deleted file mode 100644
index 92ecbac..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/special-comments.out.b
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!************88****
- Preserving comments
-    as they are
- ********************
- Keep the initial !
- *******************/#yo{ma:"ma"}/*!
-I said
-pre-
-serve! */
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/star-underscore-hacks.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/star-underscore-hacks.out
deleted file mode 100644
index 0a014c3..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/star-underscore-hacks.out
+++ /dev/null
@@ -1 +0,0 @@
-#elementarr{width:1px;*width:3pt;_width:2em}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/star-underscore-hacks.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/star-underscore-hacks.out.b
deleted file mode 100644
index 0a014c3..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/star-underscore-hacks.out.b
+++ /dev/null
@@ -1 +0,0 @@
-#elementarr{width:1px;*width:3pt;_width:2em}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/string-in-comment.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/string-in-comment.out
deleted file mode 100644
index f1f7324..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/string-in-comment.out
+++ /dev/null
@@ -1 +0,0 @@
-a{a:1}b{content:"/**/"}/*\*/c{c:3}/**/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/string-in-comment.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/string-in-comment.out.b
deleted file mode 100644
index 7cdec2d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/string-in-comment.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a{a:1}/*!"preserve" me*/b{content:"/**/"}/*\*/c{c:3}/**/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/webkit-transform.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/webkit-transform.out
deleted file mode 100644
index 3aeed66..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/webkit-transform.out
+++ /dev/null
@@ -1 +0,0 @@
-c{-webkit-transform-origin:0 0}d{-MOZ-TRANSFORM-ORIGIN:0 0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/webkit-transform.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/webkit-transform.out.b
deleted file mode 100644
index 3aeed66..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/webkit-transform.out.b
+++ /dev/null
@@ -1 +0,0 @@
-c{-webkit-transform-origin:0 0}d{-MOZ-TRANSFORM-ORIGIN:0 0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/zeros.out b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/zeros.out
deleted file mode 100644
index 0ef73c4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/zeros.out
+++ /dev/null
@@ -1 +0,0 @@
-a{margin:0px 0pt 0em 0%;_padding-top:0ex;background-position:0 0;padding:0in 0cm 0mm 0pc}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/zeros.out.b b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/zeros.out.b
deleted file mode 100644
index 0ef73c4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/out/zeros.out.b
+++ /dev/null
@@ -1 +0,0 @@
-a{margin:0px 0pt 0em 0%;_padding-top:0ex;background-position:0 0;padding:0in 0cm 0mm 0pc}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-case.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-case.css
deleted file mode 100644
index 06818f0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-case.css
+++ /dev/null
@@ -1,15 +0,0 @@
-#AddAddressForm {
-    padding: 0;
-}
-#AddAddressForm .messageBoxNeutral {
-    padding: 0;
-}
-#FeedbackMailForm{
-    padding: 0;
-}
-#FeedbackMailForm .classe{
-    margin: 0;
-}
-.classes, #FeedBackMailForm {
-    margin: 0;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-case.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-case.css.min
deleted file mode 100644
index 373bcbb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-case.css.min
+++ /dev/null
@@ -1 +0,0 @@
-#AddAddressForm{padding:0}#AddAddressForm .messageBoxNeutral{padding:0}#FeedbackMailForm{padding:0}#FeedbackMailForm .classe{margin:0}.classes,#FeedBackMailForm{margin:0}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-new-line.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-new-line.css
deleted file mode 100644
index e1f0c92..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-new-line.css
+++ /dev/null
@@ -1,6 +0,0 @@
-#sel-o {
-  content: "on\"ce upon \
-a time";
-  content: 'once upon \
-a ti\'me';
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-new-line.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-new-line.css.min
deleted file mode 100644
index 6ac20b6..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-new-line.css.min
+++ /dev/null
@@ -1,3 +0,0 @@
-#sel-o{content:"on\"ce upon \
-a time";content:'once upon \
-a ti\'me'}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-strings.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-strings.css
deleted file mode 100644
index 9151373..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-strings.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/* preserving strings */
-.sele {
-  content: "\"keep  \"    me";
-  something: '\\\' .     . ';
-  else: 'empty{}';
-  content: "/* test */"; /* <---- this is not a comment, should be be kept */
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-strings.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-strings.css.min
deleted file mode 100644
index 3f1d010..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/preserve-strings.css.min
+++ /dev/null
@@ -1 +0,0 @@
-.sele{content:"\"keep  \"    me";something:'\\\' .     . ';else:'empty{}';content:"/* test */"}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo-first.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo-first.css
deleted file mode 100644
index dbadef4..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo-first.css
+++ /dev/null
@@ -1,16 +0,0 @@
-/* 
-because of IE6 first-letter and first-line
-must be followed by a space
-http://reference.sitepoint.com/css/pseudoelement-firstletter
-Thanks: P.Sorokin comment at http://www.phpied.com/cssmin-js/ 
-*/
-p:first-letter{
-  buh: hum;
-}
-p:first-line{
-  baa: 1;
-}
-
-p:first-line,a,p:first-letter,b{
-  color: red;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo-first.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo-first.css.min
deleted file mode 100644
index 687117c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo-first.css.min
+++ /dev/null
@@ -1 +0,0 @@
-p:first-letter {buh:hum}p:first-line {baa:1}p:first-line ,a,p:first-letter ,b{color:red}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo.css
deleted file mode 100644
index 126a5b1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo.css
+++ /dev/null
@@ -1,4 +0,0 @@
-p :link { 
-  ba:zinga;;;
-  foo: bar;;;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo.css.min
deleted file mode 100644
index bb7f8e7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/pseudo.css.min
+++ /dev/null
@@ -1 +0,0 @@
-p :link{ba:zinga;foo:bar}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/special-comments.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/special-comments.css
deleted file mode 100644
index 4e184ba..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/special-comments.css
+++ /dev/null
@@ -1,13 +0,0 @@
-/*!************88****
- Preserving comments
-    as they are
- ********************
- Keep the initial !
- *******************/
-#yo {
-    ma: "ma";
-}
-/*!
-I said
-pre-
-serve! */
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/special-comments.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/special-comments.css.min
deleted file mode 100644
index 92ecbac..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/special-comments.css.min
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!************88****
- Preserving comments
-    as they are
- ********************
- Keep the initial !
- *******************/#yo{ma:"ma"}/*!
-I said
-pre-
-serve! */
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/star-underscore-hacks.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/star-underscore-hacks.css
deleted file mode 100644
index 8b6e517..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/star-underscore-hacks.css
+++ /dev/null
@@ -1,5 +0,0 @@
-#elementarr {
-  width: 1px;
-  *width: 3pt;
-  _width: 2em;
-}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/star-underscore-hacks.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/star-underscore-hacks.css.min
deleted file mode 100644
index 0a014c3..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/star-underscore-hacks.css.min
+++ /dev/null
@@ -1 +0,0 @@
-#elementarr{width:1px;*width:3pt;_width:2em}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/string-in-comment.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/string-in-comment.css
deleted file mode 100644
index d94d192..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/string-in-comment.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/* te " st */
-a{a:1}
-/*!"preserve" me*/
-b{content: "/**/"}
-/* quite " quote ' \' \" */
-/* ie mac \*/
-c {c : 3}
-/* end hiding */
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/string-in-comment.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/string-in-comment.css.min
deleted file mode 100644
index 7cdec2d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/string-in-comment.css.min
+++ /dev/null
@@ -1 +0,0 @@
-a{a:1}/*!"preserve" me*/b{content:"/**/"}/*\*/c{c:3}/**/
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/webkit-transform.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/webkit-transform.css
deleted file mode 100644
index 83a50f2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/webkit-transform.css
+++ /dev/null
@@ -1,2 +0,0 @@
-c {-webkit-transform-origin: 0 0;}
-d {-MOZ-TRANSFORM-ORIGIN: 0 0 }
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/webkit-transform.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/webkit-transform.css.min
deleted file mode 100644
index b640ddf..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/webkit-transform.css.min
+++ /dev/null
@@ -1 +0,0 @@
-c{-webkit-transform-origin:0 0}d{-moz-transform-origin:0 0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/zeros.css b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/zeros.css
deleted file mode 100644
index a5a4da2..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/zeros.css
+++ /dev/null
@@ -1,6 +0,0 @@
-a { 
-  margin: 0px 0pt 0em 0%;
-  _padding-top: 0ex;
-  background-position: 0 0;
-  padding: 0in 0cm 0mm 0pc
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/zeros.css.min b/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/zeros.css.min
deleted file mode 100644
index 14ac7a9..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rcssmin/tests/yui/zeros.css.min
+++ /dev/null
@@ -1 +0,0 @@
-a{margin:0;_padding-top:0;background-position:0 0;padding:0}
\ No newline at end of file
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/LICENSE b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/LICENSE
deleted file mode 100644
index 261eeb9..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 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/systrace/catapult/common/py_vulcanize/third_party/rjsmin/MANIFEST b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/MANIFEST
deleted file mode 100644
index 474e6f6..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/MANIFEST
+++ /dev/null
@@ -1,57 +0,0 @@
-LICENSE
-MANIFEST
-PKG-INFO
-README.rst
-_setup/__init__.py
-_setup/include/cext.h
-_setup/py2/__init__.py
-_setup/py2/commands.py
-_setup/py2/data.py
-_setup/py2/dist.py
-_setup/py2/ext.py
-_setup/py2/setup.py
-_setup/py2/shell.py
-_setup/py2/util.py
-_setup/py3/__init__.py
-_setup/py3/commands.py
-_setup/py3/data.py
-_setup/py3/dist.py
-_setup/py3/ext.py
-_setup/py3/setup.py
-_setup/py3/shell.py
-_setup/py3/util.py
-bench
-bench.sh
-bench/DateTimeShortcuts.js
-bench/__init__.py
-bench/apiviewer.js
-bench/bootstrap.js
-bench/jquery-1.7.1.js
-bench/jsmin.c
-bench/jsmin.py
-bench/jsmin_2_0_9.py
-bench/knockout-2.0.0.js
-bench/main.py
-bench/markermanager.js
-bench/write.py
-docs/BENCHMARKS
-docs/CHANGES
-docs/CLASSIFIERS
-docs/DESCRIPTION
-docs/PROVIDES
-docs/SUMMARY
-docs/apidoc/api-objects.txt
-docs/apidoc/crarr.png
-docs/apidoc/epydoc.css
-docs/apidoc/epydoc.js
-docs/apidoc/help.html
-docs/apidoc/identifier-index.html
-docs/apidoc/index.html
-docs/apidoc/module-tree.html
-docs/apidoc/redirect.html
-docs/apidoc/rjsmin-module.html
-docs/apidoc/rjsmin-pysrc.html
-package.cfg
-rjsmin.c
-rjsmin.py
-setup.py
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/PKG-INFO b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/PKG-INFO
deleted file mode 100644
index 983bc4f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/PKG-INFO
+++ /dev/null
@@ -1,304 +0,0 @@
-Metadata-Version: 1.1
-Name: rjsmin
-Version: 1.0.12
-Summary: Javascript Minifier
-Home-page: http://opensource.perlig.de/rjsmin/
-Author: André Malo
-Author-email: nd@perlig.de
-License:                                  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.
-Download-URL: http://storage.perlig.de/rjsmin/
-Description: =====================
-         Javascript Minifier
-        =====================
-        
-        rJSmin is a javascript minifier written in python.
-        
-        The minifier is based on the semantics of `jsmin.c by Douglas Crockford`_\.
-        
-        The module is a re-implementation aiming for speed, so it can be used at
-        runtime (rather than during a preprocessing step). Usually it produces the
-        same results as the original ``jsmin.c``. It differs in the following ways:
-        
-        - there is no error detection: unterminated string, regex and comment
-          literals are treated as regular javascript code and minified as such.
-        - Control characters inside string and regex literals are left untouched; they
-          are not converted to spaces (nor to \n)
-        - Newline characters are not allowed inside string and regex literals, except
-          for line continuations in string literals (ECMA-5).
-        - "return /regex/" is recognized correctly.
-        - Line terminators after regex literals are handled more sensibly
-        - "+ +" and "- -" sequences are not collapsed to '++' or '--'
-        - Newlines before ! operators are removed more sensibly
-        - Comments starting with an exclamation mark (``!``) can be kept optionally
-        - rJSmin does not handle streams, but only complete strings. (However, the
-          module provides a "streamy" interface).
-        
-        Since most parts of the logic are handled by the regex engine it's way faster
-        than the original python port of ``jsmin.c`` by Baruch Even. The speed factor
-        varies between about 6 and 55 depending on input and python version (it gets
-        faster the more compressed the input already is).  Compared to the
-        speed-refactored python port by Dave St.Germain the performance gain is less
-        dramatic but still between 3 and 50 (for huge inputs)). See the
-        docs/BENCHMARKS file for details.
-        
-        rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.
-        
-        Both python 2 (>=2.4) and python 3 are supported.
-        
-        .. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c
-        
-        
-        Copyright and License
-        ~~~~~~~~~~~~~~~~~~~~~
-        
-        Copyright 2011 - 2015
-        André Malo or his licensors, as applicable.
-        
-        The whole package (except for the files in the bench/ directory) is
-        distributed under the Apache License Version 2.0. You'll find a copy in the
-        root directory of the distribution or online at:
-        <http://www.apache.org/licenses/LICENSE-2.0>.
-        
-        
-        Bugs
-        ~~~~
-        
-        No bugs, of course. ;-)
-        But if you've found one or have an idea how to improve rjsmin, feel free
-        to send a pull request on `github <https://github.com/ndparker/rjsmin>`_
-        or send a mail to <rjsmin-bugs@perlig.de>.
-        
-        
-        Author Information
-        ~~~~~~~~~~~~~~~~~~
-        
-        André "nd" Malo <nd perlig.de>
-        GPG: 0x8103A37E
-        
-        
-            If God intended people to be naked, they would be born that way.
-            -- Oscar Wilde
-        
-        .. vim:tw=72 syntax=rest
-Keywords: Javascript,Minimization
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Web Environment
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved
-Classifier: License :: OSI Approved :: Apache License, Version 2.0
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: Jython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Text Processing
-Classifier: Topic :: Text Processing :: Filters
-Classifier: Topic :: Utilities
-Provides: rjsmin (1.0)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/README.chromium b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/README.chromium
deleted file mode 100644
index 256518f..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/README.chromium
+++ /dev/null
@@ -1,18 +0,0 @@
-Short Name: rJSmin
-URL: http://opensource.perlig.de/rjsmin/
-Version: 1.0.12
-License: Apache 2.0
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-rJSmin is a javascript minifier written in python.
-The minifier is based on the semantics of jsmin.c by Douglas Crockford.
-The module is a re-implementation aiming for speed, so it can be used at runtime (rather than during a preprocessing step). Usually it produces the same results as the original jsmin.c.
-
-Modifications made:
- - Removed the bench.sh since the file doesn't have the licensing info and
-   caused license checker to fail.
- - Added a small hack to not clobber template strings. (Not a complete solution
-   since it won't handle nesting. E.g. `${'`'} foo` would probably cause
-   problems).
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/README.rst b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/README.rst
deleted file mode 100644
index 27ae5a1..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/README.rst
+++ /dev/null
@@ -1,142 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-===========================================
- rJSmin - A Javascript Minifier For Python
-===========================================
-
-TABLE OF CONTENTS
------------------
-
-1. Introduction
-2. Copyright and License
-3. System Requirements
-4. Installation
-5. Documentation
-6. Bugs
-7. Author Information
-
-
-INTRODUCTION
-------------
-
-rJSmin is a javascript minifier written in python.
-
-The minifier is based on the semantics of `jsmin.c by Douglas Crockford`_\.
-
-The module is a re-implementation aiming for speed, so it can be used at
-runtime (rather than during a preprocessing step). Usually it produces the
-same results as the original ``jsmin.c``. It differs in the following ways:
-
-- there is no error detection: unterminated string, regex and comment
-  literals are treated as regular javascript code and minified as such.
-- Control characters inside string and regex literals are left untouched; they
-  are not converted to spaces (nor to \\n)
-- Newline characters are not allowed inside string and regex literals, except
-  for line continuations in string literals (ECMA-5).
-- "return /regex/" is recognized correctly.
-- Line terminators after regex literals are handled more sensibly
-- "+ +" and "- -" sequences are not collapsed to '++' or '--'
-- Newlines before ! operators are removed more sensibly
-- Comments starting with an exclamation mark (``!``) can be kept optionally
-- rJSmin does not handle streams, but only complete strings. (However, the
-  module provides a "streamy" interface).
-
-Since most parts of the logic are handled by the regex engine it's way faster
-than the original python port of ``jsmin.c`` by Baruch Even. The speed factor
-varies between about 6 and 55 depending on input and python version (it gets
-faster the more compressed the input already is).  Compared to the
-speed-refactored python port by Dave St.Germain the performance gain is less
-dramatic but still between 3 and 50 (for huge inputs). See the docs/BENCHMARKS
-file for details.
-
-rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.
-
-.. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c
-
-
-COPYRIGHT AND LICENSE
----------------------
-
-Copyright 2011 - 2015
-André Malo or his licensors, as applicable.
-
-The whole package (except for the files in the bench/ directory)
-is distributed under the Apache License Version 2.0. You'll find a copy in the
-root directory of the distribution or online at:
-<http://www.apache.org/licenses/LICENSE-2.0>.
-
-
-SYSTEM REQUIREMENTS
--------------------
-
-Both python 2 (>=2.4) and python 3 are supported.
-
-
-INSTALLATION
-------------
-
-Using pip
-~~~~~~~~~
-
-$ pip install rjsmin
-
-
-Using distutils
-~~~~~~~~~~~~~~~
-
-$ python setup.py install
-
-The following extra options to the install command may be of interest:
-
-  --without-c-extensions  Don't install C extensions
-  --without-docs          Do not install documentation files
-
-
-Drop-in
-~~~~~~~
-
-rJSmin effectively consists of two files: rjsmin.py and rjsmin.c, the
-latter being entirely optional. So, for simple integration you can just
-copy rjsmin.py into your project and use it.
-
-
-DOCUMENTATION
--------------
-
-A generated API documentation is available in the docs/apidoc/ directory.
-But you can just look into the module. It provides a simple function,
-called jsmin which takes the script as a string and returns the minified
-script as a string.
-
-The module additionally provides a "streamy" interface similar to the one
-jsmin.c provides:
-
-$ python -mrjsmin <script >minified
-
-It takes two options:
-
-  -b  Keep bang-comments (Comments starting with an exclamation mark)
-  -p  Force using the python implementation (not the C implementation)
-
-The latest documentation is also available online at
-<http://opensource.perlig.de/rjsmin/>.
-
-
-BUGS
-----
-
-No bugs, of course. ;-)
-But if you've found one or have an idea how to improve rjsmin, feel free
-to send a pull request on `github <https://github.com/ndparker/rjsmin>`_
-or send a mail to <rjsmin-bugs@perlig.de>.
-
-
-AUTHOR INFORMATION
-------------------
-
-André "nd" Malo <nd@perlig.de>
-GPG: 0x8103A37E
-
-
-  If God intended people to be naked, they would be born that way.
-                                                   -- Oscar Wilde
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/DateTimeShortcuts.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/DateTimeShortcuts.js
deleted file mode 100644
index d347d6d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/DateTimeShortcuts.js
+++ /dev/null
@@ -1,388 +0,0 @@
-/*! Taken from django release 1.8.5
-
-Copyright (c) Django Software Foundation and individual contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-    1. Redistributions of source code must retain the above copyright notice,
-       this list of conditions and the following disclaimer.
-
-    2. Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-
-    3. Neither the name of Django nor the names of its contributors may be used
-       to endorse or promote products derived from this software without
-       specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-// Inserts shortcut buttons after all of the following:
-//     <input type="text" class="vDateField">
-//     <input type="text" class="vTimeField">
-
-var DateTimeShortcuts = {
-    calendars: [],
-    calendarInputs: [],
-    clockInputs: [],
-    dismissClockFunc: [],
-    dismissCalendarFunc: [],
-    calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
-    calendarDivName2: 'calendarin',  // name of <div> that contains calendar
-    calendarLinkName: 'calendarlink',// name of the link that is used to toggle
-    clockDivName: 'clockbox',        // name of clock <div> that gets toggled
-    clockLinkName: 'clocklink',      // name of the link that is used to toggle
-    shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
-    timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch
-    timezoneOffset: 0,
-    admin_media_prefix: '',
-    init: function() {
-        // Get admin_media_prefix by grabbing it off the window object. It's
-        // set in the admin/base.html template, so if it's not there, someone's
-        // overridden the template. In that case, we'll set a clearly-invalid
-        // value in the hopes that someone will examine HTTP requests and see it.
-        if (window.__admin_media_prefix__ != undefined) {
-            DateTimeShortcuts.admin_media_prefix = window.__admin_media_prefix__;
-        } else {
-            DateTimeShortcuts.admin_media_prefix = '/missing-admin-media-prefix/';
-        }
-
-        if (window.__admin_utc_offset__ != undefined) {
-            var serverOffset = window.__admin_utc_offset__;
-            var localOffset = new Date().getTimezoneOffset() * -60;
-            DateTimeShortcuts.timezoneOffset = localOffset - serverOffset;
-        }
-
-        var inputs = document.getElementsByTagName('input');
-        for (i=0; i<inputs.length; i++) {
-            var inp = inputs[i];
-            if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {
-                DateTimeShortcuts.addClock(inp);
-                DateTimeShortcuts.addTimezoneWarning(inp);
-            }
-            else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {
-                DateTimeShortcuts.addCalendar(inp);
-                DateTimeShortcuts.addTimezoneWarning(inp);
-            }
-        }
-    },
-    // Return the current time while accounting for the server timezone.
-    now: function() {
-        if (window.__admin_utc_offset__ != undefined) {
-            var serverOffset = window.__admin_utc_offset__;
-            var localNow = new Date();
-            var localOffset = localNow.getTimezoneOffset() * -60;
-            localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset));
-            return localNow;
-        } else {
-            return new Date();
-        }
-    },
-    // Add a warning when the time zone in the browser and backend do not match.
-    addTimezoneWarning: function(inp) {
-        var $ = django.jQuery;
-        var warningClass = DateTimeShortcuts.timezoneWarningClass;
-        var timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600;
-
-        // Only warn if there is a time zone mismatch.
-        if (!timezoneOffset)
-            return;
-
-        // Check if warning is already there.
-        if ($(inp).siblings('.' + warningClass).length)
-            return;
-
-        var message;
-        if (timezoneOffset > 0) {
-            message = ngettext(
-                'Note: You are %s hour ahead of server time.',
-                'Note: You are %s hours ahead of server time.',
-                timezoneOffset
-            );
-        }
-        else {
-            timezoneOffset *= -1
-            message = ngettext(
-                'Note: You are %s hour behind server time.',
-                'Note: You are %s hours behind server time.',
-                timezoneOffset
-            );
-        }
-        message = interpolate(message, [timezoneOffset]);
-
-        var $warning = $('<span>');
-        $warning.attr('class', warningClass);
-        $warning.text(message);
-
-        $(inp).parent()
-            .append($('<br>'))
-            .append($warning)
-    },
-    // Add clock widget to a given field
-    addClock: function(inp) {
-        var num = DateTimeShortcuts.clockInputs.length;
-        DateTimeShortcuts.clockInputs[num] = inp;
-        DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; };
-
-        // Shortcut links (clock icon and "Now" link)
-        var shortcuts_span = document.createElement('span');
-        shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
-        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
-        var now_link = document.createElement('a');
-        now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");
-        now_link.appendChild(document.createTextNode(gettext('Now')));
-        var clock_link = document.createElement('a');
-        clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
-        clock_link.id = DateTimeShortcuts.clockLinkName + num;
-        quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_clock.gif', 'alt', gettext('Clock'));
-        shortcuts_span.appendChild(document.createTextNode('\240'));
-        shortcuts_span.appendChild(now_link);
-        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
-        shortcuts_span.appendChild(clock_link);
-
-        // Create clock link div
-        //
-        // Markup looks like:
-        // <div id="clockbox1" class="clockbox module">
-        //     <h2>Choose a time</h2>
-        //     <ul class="timelist">
-        //         <li><a href="#">Now</a></li>
-        //         <li><a href="#">Midnight</a></li>
-        //         <li><a href="#">6 a.m.</a></li>
-        //         <li><a href="#">Noon</a></li>
-        //     </ul>
-        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
-        // </div>
-
-        var clock_box = document.createElement('div');
-        clock_box.style.display = 'none';
-        clock_box.style.position = 'absolute';
-        clock_box.className = 'clockbox module';
-        clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
-        document.body.appendChild(clock_box);
-        addEvent(clock_box, 'click', cancelEventPropagation);
-
-        quickElement('h2', clock_box, gettext('Choose a time'));
-        var time_list = quickElement('ul', clock_box);
-        time_list.className = 'timelist';
-        quickElement("a", quickElement("li", time_list), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");
-        quickElement("a", quickElement("li", time_list), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 0);");
-        quickElement("a", quickElement("li", time_list), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 6);");
-        quickElement("a", quickElement("li", time_list), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 12);");
-
-        var cancel_p = quickElement('p', clock_box);
-        cancel_p.className = 'calendar-cancel';
-        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
-        django.jQuery(document).bind('keyup', function(event) {
-            if (event.which == 27) {
-                // ESC key closes popup
-                DateTimeShortcuts.dismissClock(num);
-                event.preventDefault();
-            }
-        });
-    },
-    openClock: function(num) {
-        var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num)
-        var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num)
-
-        // Recalculate the clockbox position
-        // is it left-to-right or right-to-left layout ?
-        if (getStyle(document.body,'direction')!='rtl') {
-            clock_box.style.left = findPosX(clock_link) + 17 + 'px';
-        }
-        else {
-            // since style's width is in em, it'd be tough to calculate
-            // px value of it. let's use an estimated px for now
-            // TODO: IE returns wrong value for findPosX when in rtl mode
-            //       (it returns as it was left aligned), needs to be fixed.
-            clock_box.style.left = findPosX(clock_link) - 110 + 'px';
-        }
-        clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px';
-
-        // Show the clock box
-        clock_box.style.display = 'block';
-        addEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
-    },
-    dismissClock: function(num) {
-       document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
-       removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
-    },
-    handleClockQuicklink: function(num, val) {
-       var d;
-       if (val == -1) {
-           d = DateTimeShortcuts.now();
-       }
-       else {
-           d = new Date(1970, 1, 1, val, 0, 0, 0)
-       }
-       DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);
-       DateTimeShortcuts.clockInputs[num].focus();
-       DateTimeShortcuts.dismissClock(num);
-    },
-    // Add calendar widget to a given field.
-    addCalendar: function(inp) {
-        var num = DateTimeShortcuts.calendars.length;
-
-        DateTimeShortcuts.calendarInputs[num] = inp;
-        DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; };
-
-        // Shortcut links (calendar icon and "Today" link)
-        var shortcuts_span = document.createElement('span');
-        shortcuts_span.className = DateTimeShortcuts.shortCutsClass;
-        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
-        var today_link = document.createElement('a');
-        today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
-        today_link.appendChild(document.createTextNode(gettext('Today')));
-        var cal_link = document.createElement('a');
-        cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');
-        cal_link.id = DateTimeShortcuts.calendarLinkName + num;
-        quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_calendar.gif', 'alt', gettext('Calendar'));
-        shortcuts_span.appendChild(document.createTextNode('\240'));
-        shortcuts_span.appendChild(today_link);
-        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
-        shortcuts_span.appendChild(cal_link);
-
-        // Create calendarbox div.
-        //
-        // Markup looks like:
-        //
-        // <div id="calendarbox3" class="calendarbox module">
-        //     <h2>
-        //           <a href="#" class="link-previous">&lsaquo;</a>
-        //           <a href="#" class="link-next">&rsaquo;</a> February 2003
-        //     </h2>
-        //     <div class="calendar" id="calendarin3">
-        //         <!-- (cal) -->
-        //     </div>
-        //     <div class="calendar-shortcuts">
-        //          <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
-        //     </div>
-        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
-        // </div>
-        var cal_box = document.createElement('div');
-        cal_box.style.display = 'none';
-        cal_box.style.position = 'absolute';
-        cal_box.className = 'calendarbox module';
-        cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);
-        document.body.appendChild(cal_box);
-        addEvent(cal_box, 'click', cancelEventPropagation);
-
-        // next-prev links
-        var cal_nav = quickElement('div', cal_box);
-        var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');
-        cal_nav_prev.className = 'calendarnav-previous';
-        var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');
-        cal_nav_next.className = 'calendarnav-next';
-
-        // main box
-        var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
-        cal_main.className = 'calendar';
-        DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
-        DateTimeShortcuts.calendars[num].drawCurrent();
-
-        // calendar shortcuts
-        var shortcuts = quickElement('div', cal_box);
-        shortcuts.className = 'calendar-shortcuts';
-        quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');
-        shortcuts.appendChild(document.createTextNode('\240|\240'));
-        quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
-        shortcuts.appendChild(document.createTextNode('\240|\240'));
-        quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');
-
-        // cancel bar
-        var cancel_p = quickElement('p', cal_box);
-        cancel_p.className = 'calendar-cancel';
-        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
-        django.jQuery(document).bind('keyup', function(event) {
-            if (event.which == 27) {
-                // ESC key closes popup
-                DateTimeShortcuts.dismissCalendar(num);
-                event.preventDefault();
-            }
-        });
-    },
-    openCalendar: function(num) {
-        var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num)
-        var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num)
-        var inp = DateTimeShortcuts.calendarInputs[num];
-
-        // Determine if the current value in the input has a valid date.
-        // If so, draw the calendar with that date's year and month.
-        if (inp.value) {
-            var format = get_format('DATE_INPUT_FORMATS')[0];
-            var selected = inp.value.strptime(format);
-            var year = selected.getFullYear();
-            var month = selected.getMonth() + 1;
-            var re = /\d{4}/
-            if (re.test(year.toString()) && month >= 1 && month <= 12) {
-                DateTimeShortcuts.calendars[num].drawDate(month, year, selected);
-            }
-        }
-
-        // Recalculate the clockbox position
-        // is it left-to-right or right-to-left layout ?
-        if (getStyle(document.body,'direction')!='rtl') {
-            cal_box.style.left = findPosX(cal_link) + 17 + 'px';
-        }
-        else {
-            // since style's width is in em, it'd be tough to calculate
-            // px value of it. let's use an estimated px for now
-            // TODO: IE returns wrong value for findPosX when in rtl mode
-            //       (it returns as it was left aligned), needs to be fixed.
-            cal_box.style.left = findPosX(cal_link) - 180 + 'px';
-        }
-        cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px';
-
-        cal_box.style.display = 'block';
-        addEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
-    },
-    dismissCalendar: function(num) {
-        document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';
-        removeEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
-    },
-    drawPrev: function(num) {
-        DateTimeShortcuts.calendars[num].drawPreviousMonth();
-    },
-    drawNext: function(num) {
-        DateTimeShortcuts.calendars[num].drawNextMonth();
-    },
-    handleCalendarCallback: function(num) {
-        var format = get_format('DATE_INPUT_FORMATS')[0];
-        // the format needs to be escaped a little
-        format = format.replace('\\', '\\\\');
-        format = format.replace('\r', '\\r');
-        format = format.replace('\n', '\\n');
-        format = format.replace('\t', '\\t');
-        format = format.replace("'", "\\'");
-        return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[",
-               num,
-               "].value = new Date(y, m-1, d).strftime('",
-               format,
-               "');DateTimeShortcuts.calendarInputs[",
-               num,
-               "].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",
-               num,
-               ").style.display='none';}"].join('');
-    },
-    handleCalendarQuickLink: function(num, offset) {
-       var d = DateTimeShortcuts.now();
-       d.setDate(d.getDate() + offset)
-       DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
-       DateTimeShortcuts.calendarInputs[num].focus();
-       DateTimeShortcuts.dismissCalendar(num);
-    }
-}
-
-addEvent(window, 'load', DateTimeShortcuts.init);
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/__init__.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/__init__.py
deleted file mode 100644
index a9b2847..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/__init__.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: ascii -*-
-r"""
-=================================
- Benchmark jsmin implementations
-=================================
-
-Benchmark jsmin implementations.
-
-:Copyright:
-
- Copyright 2011 - 2015
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-"""
-if __doc__:
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/apiviewer.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/apiviewer.js
deleted file mode 100644
index e70ebf8..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/apiviewer.js
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
-This file is part of the qooxdoo framework.
-
-qooxdoo is dual-licensed under the GNU Lesser General Public License (LGPL) and the Eclipse Public License (EPL). As a recipient of qooxdoo, you may choose which license to receive the code under. 
-*/
-
-(function(){
-
-if (!window.qx) window.qx = {};
-
-qx.$$start = new Date();
-  
-if (!window.qxsettings) qxsettings = {};
-var settings = {"qx.application":"apiviewer.Application","qx.nativeScrollBars":true,"qx.theme":"apiviewer.Theme","qx.version":"1.3"};
-for (var k in settings) qxsettings[k] = settings[k];
-
-if (!window.qxvariants) qxvariants = {};
-var variants = {"qx.aspects":"off","qx.debug":"off"};
-for (var k in variants) qxvariants[k] = variants[k];
-
-if (!qx.$$libraries) qx.$$libraries = {};
-var libinfo = {"__out__":{"sourceUri":"script"},"apiviewer":{"resourceUri":"resource","sourceUri":"script","version":"trunk"},"qx":{"resourceUri":"resource","sourceUri":"script","version":"1.3"}};
-for (var k in libinfo) qx.$$libraries[k] = libinfo[k];
-
-qx.$$resources = {};
-qx.$$translations = {};
-qx.$$locales = {};
-qx.$$packageData = {};
-
-qx.$$loader = {
-  parts : {"boot":[0]},
-  uris : [["__out__:apiviewer.js"]],
-  urisBefore : [],
-  packageHashes : {"0":"9b3309ed13dc"},
-  boot : "boot",
-  closureParts : {},
-  bootIsInline : true,
-  addNoCacheParam : true,
-  
-  decodeUris : function(compressedUris)
-  {
-    var libs = qx.$$libraries;
-    var uris = [];
-    for (var i=0; i<compressedUris.length; i++)
-    {
-      var uri = compressedUris[i].split(":");
-      var euri;
-      if (uri.length==2 && uri[0] in libs) {
-        var prefix = libs[uri[0]].sourceUri;
-        euri = prefix + "/" + uri[1];
-      } else {
-        euri = compressedUris[i];
-      }
-      if (qx.$$loader.addNoCacheParam) {
-        euri += "?nocache=" + Math.random();
-      }
-      
-      uris.push(euri);
-    }
-    return uris;      
-  }
-};  
-
-function loadScript(uri, callback) {
-  var elem = document.createElement("script");
-  elem.charset = "utf-8";
-  elem.src = uri;
-  elem.onreadystatechange = elem.onload = function()
-  {
-    if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")
-    {
-      elem.onreadystatechange = elem.onload = null;
-      callback();
-    }
-  };
-  var head = document.getElementsByTagName("head")[0];
-  head.appendChild(elem);
-}
-
-var isWebkit = /AppleWebKit\/([^ ]+)/.test(navigator.userAgent);
-
-function loadScriptList(list, callback) {
-  if (list.length == 0) {
-    callback();
-    return;
-  }
-  loadScript(list.shift(), function() {
-    if (isWebkit) {
-      // force asynchronous load
-      // Safari fails with an "maximum recursion depth exceeded" error if it is
-      // called sync.      
-      window.setTimeout(function() {
-        loadScriptList(list, callback);
-      }, 0);
-    } else {
-      loadScriptList(list, callback);
-    }
-  });
-}
-
-var fireContentLoadedEvent = function() {
-  qx.$$domReady = true;
-  document.removeEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
-};
-if (document.addEventListener) {
-  document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
-}
-
-qx.$$loader.importPackageData = function (dataMap) {
-  if (dataMap["resources"]){
-    var resMap = dataMap["resources"];
-    for (var k in resMap) qx.$$resources[k] = resMap[k];
-  }
-  if (dataMap["locales"]){
-    var locMap = dataMap["locales"];
-    var qxlocs = qx.$$locales;
-    for (var lang in locMap){
-      if (!qxlocs[lang]) qxlocs[lang] = locMap[lang];
-      else 
-        for (var k in locMap[lang]) qxlocs[lang][k] = locMap[lang][k];
-    }
-  }
-  if (dataMap["translations"]){
-    var trMap   = dataMap["translations"];
-    var qxtrans = qx.$$translations;
-    for (var lang in trMap){
-      if (!qxtrans[lang]) qxtrans[lang] = trMap[lang];
-      else 
-        for (var k in trMap[lang]) qxtrans[lang][k] = trMap[lang][k];
-    }
-  }
-}
-
-qx.$$loader.signalStartup = function () 
-{
-  qx.$$loader.scriptLoaded = true;
-  if (window.qx && qx.event && qx.event.handler && qx.event.handler.Application) {
-    qx.event.handler.Application.onScriptLoaded();
-    qx.$$loader.applicationHandlerReady = true; 
-  } else {
-    qx.$$loader.applicationHandlerReady = false;
-  }
-}
-
-qx.$$loader.init = function(){
-  var l=qx.$$loader;
-  if (l.urisBefore.length>0){
-    loadScriptList(l.urisBefore, function(){
-      l.initUris();
-    });
-  } else {
-    l.initUris();
-  }
-}
-
-qx.$$loader.initUris = function(){
-  var l=qx.$$loader;
-  var bootPackageHash=l.packageHashes[l.parts[l.boot][0]];
-  if (l.bootIsInline){
-    l.importPackageData(qx.$$packageData[bootPackageHash]);
-    l.signalStartup();
-  } else {
-    loadScriptList(l.decodeUris(l.uris[l.parts[l.boot]]), function(){
-      // Opera needs this extra time to parse the scripts
-      window.setTimeout(function(){
-        l.importPackageData(qx.$$packageData[bootPackageHash] || {});
-        l.signalStartup();
-      }, 0);
-    });
-  }
-}
-})();
-
-qx.$$packageData['9b3309ed13dc']={"locales":{"C":{"alternateQuotationEnd":"’","alternateQuotationStart":"‘","cldr_am":"AM","cldr_date_format_full":"EEEE, MMMM d, y","cldr_date_format_long":"MMMM d, y","cldr_date_format_medium":"MMM d, y","cldr_date_format_short":"M/d/yy","cldr_date_time_format_EEEd":"d EEE","cldr_date_time_format_Hm":"H:mm","cldr_date_time_format_Hms":"H:mm:ss","cldr_date_time_format_M":"L","cldr_date_time_format_MEd":"E, M/d","cldr_date_time_format_MMM":"LLL","cldr_date_time_format_MMMEd":"E, MMM d","cldr_date_time_format_MMMMEd":"E, MMMM d","cldr_date_time_format_MMMMd":"MMMM d","cldr_date_time_format_MMMd":"MMM d","cldr_date_time_format_Md":"M/d","cldr_date_time_format_d":"d","cldr_date_time_format_hm":"h:mm a","cldr_date_time_format_ms":"mm:ss","cldr_date_time_format_y":"y","cldr_date_time_format_yM":"M/yyyy","cldr_date_time_format_yMEd":"EEE, M/d/yyyy","cldr_date_time_format_yMMM":"MMM y","cldr_date_time_format_yMMMEd":"EEE, MMM d, y","cldr_date_time_format_yMMMM":"MMMM y","cldr_date_time_format_yQ":"Q yyyy","cldr_date_time_format_yQQQ":"QQQ y","cldr_day_format_abbreviated_fri":"Fri","cldr_day_format_abbreviated_mon":"Mon","cldr_day_format_abbreviated_sat":"Sat","cldr_day_format_abbreviated_sun":"Sun","cldr_day_format_abbreviated_thu":"Thu","cldr_day_format_abbreviated_tue":"Tue","cldr_day_format_abbreviated_wed":"Wed","cldr_day_format_narrow_fri":"F","cldr_day_format_narrow_mon":"M","cldr_day_format_narrow_sat":"S","cldr_day_format_narrow_sun":"S","cldr_day_format_narrow_thu":"T","cldr_day_format_narrow_tue":"T","cldr_day_format_narrow_wed":"W","cldr_day_format_wide_fri":"Friday","cldr_day_format_wide_mon":"Monday","cldr_day_format_wide_sat":"Saturday","cldr_day_format_wide_sun":"Sunday","cldr_day_format_wide_thu":"Thursday","cldr_day_format_wide_tue":"Tuesday","cldr_day_format_wide_wed":"Wednesday","cldr_day_stand-alone_abbreviated_fri":"Fri","cldr_day_stand-alone_abbreviated_mon":"Mon","cldr_day_stand-alone_abbreviated_sat":"Sat","cldr_day_stand-alone_abbreviated_sun":"Sun","cldr_day_stand-alone_abbreviated_thu":"Thu","cldr_day_stand-alone_abbreviated_tue":"Tue","cldr_day_stand-alone_abbreviated_wed":"Wed","cldr_day_stand-alone_narrow_fri":"F","cldr_day_stand-alone_narrow_mon":"M","cldr_day_stand-alone_narrow_sat":"S","cldr_day_stand-alone_narrow_sun":"S","cldr_day_stand-alone_narrow_thu":"T","cldr_day_stand-alone_narrow_tue":"T","cldr_day_stand-alone_narrow_wed":"W","cldr_day_stand-alone_wide_fri":"Friday","cldr_day_stand-alone_wide_mon":"Monday","cldr_day_stand-alone_wide_sat":"Saturday","cldr_day_stand-alone_wide_sun":"Sunday","cldr_day_stand-alone_wide_thu":"Thursday","cldr_day_stand-alone_wide_tue":"Tuesday","cldr_day_stand-alone_wide_wed":"Wednesday","cldr_month_format_abbreviated_1":"Jan","cldr_month_format_abbreviated_10":"Oct","cldr_month_format_abbreviated_11":"Nov","cldr_month_format_abbreviated_12":"Dec","cldr_month_format_abbreviated_2":"Feb","cldr_month_format_abbreviated_3":"Mar","cldr_month_format_abbreviated_4":"Apr","cldr_month_format_abbreviated_5":"May","cldr_month_format_abbreviated_6":"Jun","cldr_month_format_abbreviated_7":"Jul","cldr_month_format_abbreviated_8":"Aug","cldr_month_format_abbreviated_9":"Sep","cldr_month_format_wide_1":"January","cldr_month_format_wide_10":"October","cldr_month_format_wide_11":"November","cldr_month_format_wide_12":"December","cldr_month_format_wide_2":"February","cldr_month_format_wide_3":"March","cldr_month_format_wide_4":"April","cldr_month_format_wide_5":"May","cldr_month_format_wide_6":"June","cldr_month_format_wide_7":"July","cldr_month_format_wide_8":"August","cldr_month_format_wide_9":"September","cldr_month_stand-alone_narrow_1":"J","cldr_month_stand-alone_narrow_10":"O","cldr_month_stand-alone_narrow_11":"N","cldr_month_stand-alone_narrow_12":"D","cldr_month_stand-alone_narrow_2":"F","cldr_month_stand-alone_narrow_3":"M","cldr_month_stand-alone_narrow_4":"A","cldr_month_stand-alone_narrow_5":"M","cldr_month_stand-alone_narrow_6":"J","cldr_month_stand-alone_narrow_7":"J","cldr_month_stand-alone_narrow_8":"A","cldr_month_stand-alone_narrow_9":"S","cldr_number_decimal_separator":".","cldr_number_group_separator":",","cldr_number_percent_format":"#,##0%","cldr_pm":"PM","cldr_time_format_full":"h:mm:ss a zzzz","cldr_time_format_long":"h:mm:ss a z","cldr_time_format_medium":"h:mm:ss a","cldr_time_format_short":"h:mm a","quotationEnd":"”","quotationStart":"“"}},"resources":{"apiviewer/css/apiviewer.css":"apiviewer","apiviewer/image/blank.gif":[1,1,"gif","apiviewer"],"apiviewer/image/childcontrol18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-540],"apiviewer/image/class18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-324],"apiviewer/image/class_abstract18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-486],"apiviewer/image/class_abstract_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-306],"apiviewer/image/class_singleton18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-612],"apiviewer/image/class_singleton_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-252],"apiviewer/image/class_static18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-234],"apiviewer/image/class_static_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-144],"apiviewer/image/class_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-342],"apiviewer/image/close.gif":[17,13,"gif","apiviewer"],"apiviewer/image/colorstrip.gif":[192,10,"gif","apiviewer"],"apiviewer/image/constant18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-504],"apiviewer/image/constructor18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-558],"apiviewer/image/cross.gif":[18,18,"gif","apiviewer"],"apiviewer/image/event18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-198],"apiviewer/image/information18.png":[18,18,"png","apiviewer"],"apiviewer/image/interface18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-432],"apiviewer/image/interface_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-450],"apiviewer/image/method_private18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-270],"apiviewer/image/method_protected18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-216],"apiviewer/image/method_public18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-126],"apiviewer/image/method_public_inherited18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-18],"apiviewer/image/mixin18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-162],"apiviewer/image/mixin_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-108],"apiviewer/image/nextlevel.gif":[18,18,"gif","apiviewer"],"apiviewer/image/open.gif":[17,13,"gif","apiviewer"],"apiviewer/image/overlay_abstract18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,0],"apiviewer/image/overlay_constructor18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-36],"apiviewer/image/overlay_error18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-414],"apiviewer/image/overlay_inherited18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-576],"apiviewer/image/overlay_mixin18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-180],"apiviewer/image/overlay_overridden18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-288],"apiviewer/image/overlay_static18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-378],"apiviewer/image/overlay_themeable18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-360],"apiviewer/image/overlay_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-594],"apiviewer/image/package18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-54],"apiviewer/image/package_warning18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-90],"apiviewer/image/property18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-522],"apiviewer/image/property_private18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-72],"apiviewer/image/property_protected18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-468],"apiviewer/image/property_themeable18.gif":[18,18,"gif","apiviewer","apiviewer/imagesCombined/symbols.gif",0,-396],"apiviewer/image/search18.png":[18,18,"png","apiviewer"],"apiviewer/image/vline.gif":[18,18,"gif","apiviewer"],"apiviewer/imagesCombined/symbols.gif":[18,630,"gif","apiviewer"],"qx/decoration/Modern/app-header.png":[110,20,"png","qx"],"qx/decoration/Modern/arrows-combined.png":[87,8,"png","qx"],"qx/decoration/Modern/arrows/down-invert.png":[8,5,"png","qx","qx/decoration/Modern/arrows-combined.png",-74,0],"qx/decoration/Modern/arrows/down-small-invert.png":[5,3,"png","qx","qx/decoration/Modern/arrows-combined.png",-69,0],"qx/decoration/Modern/arrows/down-small.png":[5,3,"png","qx","qx/decoration/Modern/arrows-combined.png",-49,0],"qx/decoration/Modern/arrows/down.png":[8,5,"png","qx","qx/decoration/Modern/arrows-combined.png",-20,0],"qx/decoration/Modern/arrows/forward.png":[10,8,"png","qx","qx/decoration/Modern/arrows-combined.png",-59,0],"qx/decoration/Modern/arrows/left-invert.png":[5,8,"png","qx","qx/decoration/Modern/arrows-combined.png",0,0],"qx/decoration/Modern/arrows/left.png":[5,8,"png","qx","qx/decoration/Modern/arrows-combined.png",-44,0],"qx/decoration/Modern/arrows/rewind.png":[10,8,"png","qx","qx/decoration/Modern/arrows-combined.png",-10,0],"qx/decoration/Modern/arrows/right-invert.png":[5,8,"png","qx","qx/decoration/Modern/arrows-combined.png",-5,0],"qx/decoration/Modern/arrows/right.png":[5,8,"png","qx","qx/decoration/Modern/arrows-combined.png",-54,0],"qx/decoration/Modern/arrows/up-invert.png":[8,5,"png","qx","qx/decoration/Modern/arrows-combined.png",-28,0],"qx/decoration/Modern/arrows/up-small.png":[5,3,"png","qx","qx/decoration/Modern/arrows-combined.png",-82,0],"qx/decoration/Modern/arrows/up.png":[8,5,"png","qx","qx/decoration/Modern/arrows-combined.png",-36,0],"qx/decoration/Modern/button-lr-combined.png":[72,52,"png","qx"],"qx/decoration/Modern/button-tb-combined.png":[4,216,"png","qx"],"qx/decoration/Modern/checkradio-combined.png":[504,14,"png","qx"],"qx/decoration/Modern/colorselector-combined.gif":[46,11,"gif","qx"],"qx/decoration/Modern/colorselector/brightness-field.png":[19,256,"png","qx"],"qx/decoration/Modern/colorselector/brightness-handle.gif":[35,11,"gif","qx","qx/decoration/Modern/colorselector-combined.gif",0,0],"qx/decoration/Modern/colorselector/huesaturation-field.jpg":[256,256,"jpeg","qx"],"qx/decoration/Modern/colorselector/huesaturation-handle.gif":[11,11,"gif","qx","qx/decoration/Modern/colorselector-combined.gif",-35,0],"qx/decoration/Modern/cursors-combined.gif":[71,20,"gif","qx"],"qx/decoration/Modern/cursors/alias.gif":[19,15,"gif","qx","qx/decoration/Modern/cursors-combined.gif",-52,0],"qx/decoration/Modern/cursors/copy.gif":[19,15,"gif","qx","qx/decoration/Modern/cursors-combined.gif",-33,0],"qx/decoration/Modern/cursors/move.gif":[13,9,"gif","qx","qx/decoration/Modern/cursors-combined.gif",-20,0],"qx/decoration/Modern/cursors/nodrop.gif":[20,20,"gif","qx","qx/decoration/Modern/cursors-combined.gif",0,0],"qx/decoration/Modern/form/button-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-72],"qx/decoration/Modern/form/button-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-204],"qx/decoration/Modern/form/button-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-188],"qx/decoration/Modern/form/button-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-checked-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-36],"qx/decoration/Modern/form/button-checked-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-84],"qx/decoration/Modern/form/button-checked-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-184],"qx/decoration/Modern/form/button-checked-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-checked-focused-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-156],"qx/decoration/Modern/form/button-checked-focused-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-208],"qx/decoration/Modern/form/button-checked-focused-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-160],"qx/decoration/Modern/form/button-checked-focused-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-checked-focused-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-40,0],"qx/decoration/Modern/form/button-checked-focused-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-32,0],"qx/decoration/Modern/form/button-checked-focused-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-28],"qx/decoration/Modern/form/button-checked-focused-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-24],"qx/decoration/Modern/form/button-checked-focused-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-48],"qx/decoration/Modern/form/button-checked-focused.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-checked-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-16,0],"qx/decoration/Modern/form/button-checked-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-60,0],"qx/decoration/Modern/form/button-checked-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-140],"qx/decoration/Modern/form/button-checked-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-56],"qx/decoration/Modern/form/button-checked-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-112],"qx/decoration/Modern/form/button-checked.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-disabled-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-40],"qx/decoration/Modern/form/button-disabled-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-136],"qx/decoration/Modern/form/button-disabled-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-16],"qx/decoration/Modern/form/button-disabled-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-disabled-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-68,0],"qx/decoration/Modern/form/button-disabled-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-4,0],"qx/decoration/Modern/form/button-disabled-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-116],"qx/decoration/Modern/form/button-disabled-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-168],"qx/decoration/Modern/form/button-disabled-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-60],"qx/decoration/Modern/form/button-disabled.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-focused-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-68],"qx/decoration/Modern/form/button-focused-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-144],"qx/decoration/Modern/form/button-focused-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-8],"qx/decoration/Modern/form/button-focused-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-focused-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-24,0],"qx/decoration/Modern/form/button-focused-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-44,0],"qx/decoration/Modern/form/button-focused-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-192],"qx/decoration/Modern/form/button-focused-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-148],"qx/decoration/Modern/form/button-focused-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-104],"qx/decoration/Modern/form/button-focused.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-hovered-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-108],"qx/decoration/Modern/form/button-hovered-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-32],"qx/decoration/Modern/form/button-hovered-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-128],"qx/decoration/Modern/form/button-hovered-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-hovered-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-20,0],"qx/decoration/Modern/form/button-hovered-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-48,0],"qx/decoration/Modern/form/button-hovered-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-44],"qx/decoration/Modern/form/button-hovered-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-76],"qx/decoration/Modern/form/button-hovered-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-88],"qx/decoration/Modern/form/button-hovered.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-56,0],"qx/decoration/Modern/form/button-preselected-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-124],"qx/decoration/Modern/form/button-preselected-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-176],"qx/decoration/Modern/form/button-preselected-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-200],"qx/decoration/Modern/form/button-preselected-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-preselected-focused-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,0],"qx/decoration/Modern/form/button-preselected-focused-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-4],"qx/decoration/Modern/form/button-preselected-focused-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-152],"qx/decoration/Modern/form/button-preselected-focused-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-preselected-focused-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-28,0],"qx/decoration/Modern/form/button-preselected-focused-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-36,0],"qx/decoration/Modern/form/button-preselected-focused-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-196],"qx/decoration/Modern/form/button-preselected-focused-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-164],"qx/decoration/Modern/form/button-preselected-focused-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-212],"qx/decoration/Modern/form/button-preselected-focused.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-preselected-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-8,0],"qx/decoration/Modern/form/button-preselected-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-64,0],"qx/decoration/Modern/form/button-preselected-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-96],"qx/decoration/Modern/form/button-preselected-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-80],"qx/decoration/Modern/form/button-preselected-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-132],"qx/decoration/Modern/form/button-preselected.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-pressed-b.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-12],"qx/decoration/Modern/form/button-pressed-bl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-52],"qx/decoration/Modern/form/button-pressed-br.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-20],"qx/decoration/Modern/form/button-pressed-c.png":[40,52,"png","qx"],"qx/decoration/Modern/form/button-pressed-l.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-52,0],"qx/decoration/Modern/form/button-pressed-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",-12,0],"qx/decoration/Modern/form/button-pressed-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-100],"qx/decoration/Modern/form/button-pressed-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-172],"qx/decoration/Modern/form/button-pressed-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-64],"qx/decoration/Modern/form/button-pressed.png":[80,60,"png","qx"],"qx/decoration/Modern/form/button-r.png":[4,52,"png","qx","qx/decoration/Modern/button-lr-combined.png",0,0],"qx/decoration/Modern/form/button-t.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-92],"qx/decoration/Modern/form/button-tl.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-120],"qx/decoration/Modern/form/button-tr.png":[4,4,"png","qx","qx/decoration/Modern/button-tb-combined.png",0,-180],"qx/decoration/Modern/form/button.png":[80,60,"png","qx"],"qx/decoration/Modern/form/checkbox-checked-disabled.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-126,0],"qx/decoration/Modern/form/checkbox-checked-focused-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-322,0],"qx/decoration/Modern/form/checkbox-checked-focused.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-294,0],"qx/decoration/Modern/form/checkbox-checked-hovered-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-364,0],"qx/decoration/Modern/form/checkbox-checked-hovered.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-490,0],"qx/decoration/Modern/form/checkbox-checked-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-224,0],"qx/decoration/Modern/form/checkbox-checked-pressed-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-378,0],"qx/decoration/Modern/form/checkbox-checked-pressed.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-84,0],"qx/decoration/Modern/form/checkbox-checked.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-182,0],"qx/decoration/Modern/form/checkbox-disabled.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-42,0],"qx/decoration/Modern/form/checkbox-focused-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-392,0],"qx/decoration/Modern/form/checkbox-focused.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-210,0],"qx/decoration/Modern/form/checkbox-hovered-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-14,0],"qx/decoration/Modern/form/checkbox-hovered.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-238,0],"qx/decoration/Modern/form/checkbox-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-462,0],"qx/decoration/Modern/form/checkbox-pressed-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-112,0],"qx/decoration/Modern/form/checkbox-pressed.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-448,0],"qx/decoration/Modern/form/checkbox-undetermined-disabled.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox-undetermined-focused-invalid.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox-undetermined-focused.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox-undetermined-hovered-invalid.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox-undetermined-hovered.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox-undetermined-invalid.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox-undetermined.png":[14,14,"png","qx"],"qx/decoration/Modern/form/checkbox.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-140,0],"qx/decoration/Modern/form/input-focused.png":[40,12,"png","qx"],"qx/decoration/Modern/form/input.png":[84,12,"png","qx"],"qx/decoration/Modern/form/radiobutton-checked-disabled.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-196,0],"qx/decoration/Modern/form/radiobutton-checked-focused-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-168,0],"qx/decoration/Modern/form/radiobutton-checked-focused.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-98,0],"qx/decoration/Modern/form/radiobutton-checked-hovered-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-308,0],"qx/decoration/Modern/form/radiobutton-checked-hovered.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-406,0],"qx/decoration/Modern/form/radiobutton-checked-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-28,0],"qx/decoration/Modern/form/radiobutton-checked-pressed-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-350,0],"qx/decoration/Modern/form/radiobutton-checked-pressed.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-266,0],"qx/decoration/Modern/form/radiobutton-checked.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-252,0],"qx/decoration/Modern/form/radiobutton-disabled.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-336,0],"qx/decoration/Modern/form/radiobutton-focused-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-476,0],"qx/decoration/Modern/form/radiobutton-focused.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-420,0],"qx/decoration/Modern/form/radiobutton-hovered-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-56,0],"qx/decoration/Modern/form/radiobutton-hovered.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",0,0],"qx/decoration/Modern/form/radiobutton-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-154,0],"qx/decoration/Modern/form/radiobutton-pressed-invalid.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-434,0],"qx/decoration/Modern/form/radiobutton-pressed.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-280,0],"qx/decoration/Modern/form/radiobutton.png":[14,14,"png","qx","qx/decoration/Modern/checkradio-combined.png",-70,0],"qx/decoration/Modern/form/tooltip-error-arrow.png":[11,14,"png","qx"],"qx/decoration/Modern/form/tooltip-error-b.png":[6,6,"png","qx","qx/decoration/Modern/tooltip-error-tb-combined.png",0,-30],"qx/decoration/Modern/form/tooltip-error-bl.png":[6,6,"png","qx","qx/decoration/Modern/tooltip-error-tb-combined.png",0,-24],"qx/decoration/Modern/form/tooltip-error-br.png":[6,6,"png","qx","qx/decoration/Modern/tooltip-error-tb-combined.png",0,0],"qx/decoration/Modern/form/tooltip-error-c.png":[40,18,"png","qx"],"qx/decoration/Modern/form/tooltip-error-l.png":[6,18,"png","qx","qx/decoration/Modern/tooltip-error-lr-combined.png",-6,0],"qx/decoration/Modern/form/tooltip-error-r.png":[6,18,"png","qx","qx/decoration/Modern/tooltip-error-lr-combined.png",0,0],"qx/decoration/Modern/form/tooltip-error-t.png":[6,6,"png","qx","qx/decoration/Modern/tooltip-error-tb-combined.png",0,-6],"qx/decoration/Modern/form/tooltip-error-tl.png":[6,6,"png","qx","qx/decoration/Modern/tooltip-error-tb-combined.png",0,-18],"qx/decoration/Modern/form/tooltip-error-tr.png":[6,6,"png","qx","qx/decoration/Modern/tooltip-error-tb-combined.png",0,-12],"qx/decoration/Modern/form/tooltip-error.png":[127,30,"png","qx"],"qx/decoration/Modern/group-item.png":[110,20,"png","qx"],"qx/decoration/Modern/groupbox-lr-combined.png":[8,51,"png","qx"],"qx/decoration/Modern/groupbox-tb-combined.png":[4,24,"png","qx"],"qx/decoration/Modern/groupbox/groupbox-b.png":[4,4,"png","qx","qx/decoration/Modern/groupbox-tb-combined.png",0,-12],"qx/decoration/Modern/groupbox/groupbox-bl.png":[4,4,"png","qx","qx/decoration/Modern/groupbox-tb-combined.png",0,-16],"qx/decoration/Modern/groupbox/groupbox-br.png":[4,4,"png","qx","qx/decoration/Modern/groupbox-tb-combined.png",0,-8],"qx/decoration/Modern/groupbox/groupbox-c.png":[40,51,"png","qx"],"qx/decoration/Modern/groupbox/groupbox-l.png":[4,51,"png","qx","qx/decoration/Modern/groupbox-lr-combined.png",-4,0],"qx/decoration/Modern/groupbox/groupbox-r.png":[4,51,"png","qx","qx/decoration/Modern/groupbox-lr-combined.png",0,0],"qx/decoration/Modern/groupbox/groupbox-t.png":[4,4,"png","qx","qx/decoration/Modern/groupbox-tb-combined.png",0,-4],"qx/decoration/Modern/groupbox/groupbox-tl.png":[4,4,"png","qx","qx/decoration/Modern/groupbox-tb-combined.png",0,0],"qx/decoration/Modern/groupbox/groupbox-tr.png":[4,4,"png","qx","qx/decoration/Modern/groupbox-tb-combined.png",0,-20],"qx/decoration/Modern/groupbox/groupbox.png":[255,59,"png","qx"],"qx/decoration/Modern/menu-background-combined.png":[80,49,"png","qx"],"qx/decoration/Modern/menu-checkradio-combined.gif":[64,7,"gif","qx"],"qx/decoration/Modern/menu/background.png":[40,49,"png","qx","qx/decoration/Modern/menu-background-combined.png",-40,0],"qx/decoration/Modern/menu/bar-background.png":[40,20,"png","qx","qx/decoration/Modern/menu-background-combined.png",0,0],"qx/decoration/Modern/menu/checkbox-invert.gif":[16,7,"gif","qx","qx/decoration/Modern/menu-checkradio-combined.gif",-16,0],"qx/decoration/Modern/menu/checkbox.gif":[16,7,"gif","qx","qx/decoration/Modern/menu-checkradio-combined.gif",-48,0],"qx/decoration/Modern/menu/radiobutton-invert.gif":[16,5,"gif","qx","qx/decoration/Modern/menu-checkradio-combined.gif",-32,0],"qx/decoration/Modern/menu/radiobutton.gif":[16,5,"gif","qx","qx/decoration/Modern/menu-checkradio-combined.gif",0,0],"qx/decoration/Modern/pane-lr-combined.png":[12,238,"png","qx"],"qx/decoration/Modern/pane-tb-combined.png":[6,36,"png","qx"],"qx/decoration/Modern/pane/pane-b.png":[6,6,"png","qx","qx/decoration/Modern/pane-tb-combined.png",0,-30],"qx/decoration/Modern/pane/pane-bl.png":[6,6,"png","qx","qx/decoration/Modern/pane-tb-combined.png",0,-18],"qx/decoration/Modern/pane/pane-br.png":[6,6,"png","qx","qx/decoration/Modern/pane-tb-combined.png",0,-12],"qx/decoration/Modern/pane/pane-c.png":[40,238,"png","qx"],"qx/decoration/Modern/pane/pane-l.png":[6,238,"png","qx","qx/decoration/Modern/pane-lr-combined.png",0,0],"qx/decoration/Modern/pane/pane-r.png":[6,238,"png","qx","qx/decoration/Modern/pane-lr-combined.png",-6,0],"qx/decoration/Modern/pane/pane-t.png":[6,6,"png","qx","qx/decoration/Modern/pane-tb-combined.png",0,0],"qx/decoration/Modern/pane/pane-tl.png":[6,6,"png","qx","qx/decoration/Modern/pane-tb-combined.png",0,-24],"qx/decoration/Modern/pane/pane-tr.png":[6,6,"png","qx","qx/decoration/Modern/pane-tb-combined.png",0,-6],"qx/decoration/Modern/pane/pane.png":[185,250,"png","qx"],"qx/decoration/Modern/scrollbar-combined.png":[54,12,"png","qx"],"qx/decoration/Modern/scrollbar/scrollbar-bg-horizontal.png":[76,15,"png","qx"],"qx/decoration/Modern/scrollbar/scrollbar-bg-pressed-horizontal.png":[19,10,"png","qx"],"qx/decoration/Modern/scrollbar/scrollbar-bg-pressed-vertical.png":[10,19,"png","qx"],"qx/decoration/Modern/scrollbar/scrollbar-bg-vertical.png":[15,76,"png","qx"],"qx/decoration/Modern/scrollbar/scrollbar-button-bg-horizontal.png":[12,10,"png","qx","qx/decoration/Modern/scrollbar-combined.png",-34,0],"qx/decoration/Modern/scrollbar/scrollbar-button-bg-vertical.png":[10,12,"png","qx","qx/decoration/Modern/scrollbar-combined.png",-6,0],"qx/decoration/Modern/scrollbar/scrollbar-down.png":[6,4,"png","qx","qx/decoration/Modern/scrollbar-combined.png",-28,0],"qx/decoration/Modern/scrollbar/scrollbar-left.png":[4,6,"png","qx","qx/decoration/Modern/scrollbar-combined.png",-50,0],"qx/decoration/Modern/scrollbar/scrollbar-right.png":[4,6,"png","qx","qx/decoration/Modern/scrollbar-combined.png",-46,0],"qx/decoration/Modern/scrollbar/scrollbar-up.png":[6,4,"png","qx","qx/decoration/Modern/scrollbar-combined.png",0,0],"qx/decoration/Modern/scrollbar/slider-knob-background.png":[12,10,"png","qx","qx/decoration/Modern/scrollbar-combined.png",-16,0],"qx/decoration/Modern/selection.png":[110,20,"png","qx"],"qx/decoration/Modern/shadow-lr-combined.png":[30,382,"png","qx"],"qx/decoration/Modern/shadow-small-lr-combined.png":[10,136,"png","qx"],"qx/decoration/Modern/shadow-small-tb-combined.png":[5,30,"png","qx"],"qx/decoration/Modern/shadow-tb-combined.png":[15,90,"png","qx"],"qx/decoration/Modern/shadow/shadow-b.png":[15,15,"png","qx","qx/decoration/Modern/shadow-tb-combined.png",0,-30],"qx/decoration/Modern/shadow/shadow-bl.png":[15,15,"png","qx","qx/decoration/Modern/shadow-tb-combined.png",0,-15],"qx/decoration/Modern/shadow/shadow-br.png":[15,15,"png","qx","qx/decoration/Modern/shadow-tb-combined.png",0,-45],"qx/decoration/Modern/shadow/shadow-c.png":[40,382,"png","qx"],"qx/decoration/Modern/shadow/shadow-l.png":[15,382,"png","qx","qx/decoration/Modern/shadow-lr-combined.png",0,0],"qx/decoration/Modern/shadow/shadow-r.png":[15,382,"png","qx","qx/decoration/Modern/shadow-lr-combined.png",-15,0],"qx/decoration/Modern/shadow/shadow-small-b.png":[5,5,"png","qx","qx/decoration/Modern/shadow-small-tb-combined.png",0,-20],"qx/decoration/Modern/shadow/shadow-small-bl.png":[5,5,"png","qx","qx/decoration/Modern/shadow-small-tb-combined.png",0,-15],"qx/decoration/Modern/shadow/shadow-small-br.png":[5,5,"png","qx","qx/decoration/Modern/shadow-small-tb-combined.png",0,-10],"qx/decoration/Modern/shadow/shadow-small-c.png":[40,136,"png","qx"],"qx/decoration/Modern/shadow/shadow-small-l.png":[5,136,"png","qx","qx/decoration/Modern/shadow-small-lr-combined.png",0,0],"qx/decoration/Modern/shadow/shadow-small-r.png":[5,136,"png","qx","qx/decoration/Modern/shadow-small-lr-combined.png",-5,0],"qx/decoration/Modern/shadow/shadow-small-t.png":[5,5,"png","qx","qx/decoration/Modern/shadow-small-tb-combined.png",0,-5],"qx/decoration/Modern/shadow/shadow-small-tl.png":[5,5,"png","qx","qx/decoration/Modern/shadow-small-tb-combined.png",0,0],"qx/decoration/Modern/shadow/shadow-small-tr.png":[5,5,"png","qx","qx/decoration/Modern/shadow-small-tb-combined.png",0,-25],"qx/decoration/Modern/shadow/shadow-small.png":[114,146,"png","qx"],"qx/decoration/Modern/shadow/shadow-t.png":[15,15,"png","qx","qx/decoration/Modern/shadow-tb-combined.png",0,-60],"qx/decoration/Modern/shadow/shadow-tl.png":[15,15,"png","qx","qx/decoration/Modern/shadow-tb-combined.png",0,-75],"qx/decoration/Modern/shadow/shadow-tr.png":[15,15,"png","qx","qx/decoration/Modern/shadow-tb-combined.png",0,0],"qx/decoration/Modern/shadow/shadow.png":[381,412,"png","qx"],"qx/decoration/Modern/splitpane-knobs-combined.png":[8,9,"png","qx"],"qx/decoration/Modern/splitpane/knob-horizontal.png":[1,8,"png","qx","qx/decoration/Modern/splitpane-knobs-combined.png",0,-1],"qx/decoration/Modern/splitpane/knob-vertical.png":[8,1,"png","qx","qx/decoration/Modern/splitpane-knobs-combined.png",0,0],"qx/decoration/Modern/table-combined.png":[94,18,"png","qx"],"qx/decoration/Modern/table/ascending.png":[8,5,"png","qx","qx/decoration/Modern/table-combined.png",0,0],"qx/decoration/Modern/table/boolean-false.png":[14,14,"png","qx","qx/decoration/Modern/table-combined.png",-80,0],"qx/decoration/Modern/table/boolean-true.png":[14,14,"png","qx","qx/decoration/Modern/table-combined.png",-26,0],"qx/decoration/Modern/table/descending.png":[8,5,"png","qx","qx/decoration/Modern/table-combined.png",-18,0],"qx/decoration/Modern/table/header-cell.png":[40,18,"png","qx","qx/decoration/Modern/table-combined.png",-40,0],"qx/decoration/Modern/table/select-column-order.png":[10,9,"png","qx","qx/decoration/Modern/table-combined.png",-8,0],"qx/decoration/Modern/tabview-button-bottom-active-lr-combined.png":[10,14,"png","qx"],"qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png":[5,30,"png","qx"],"qx/decoration/Modern/tabview-button-bottom-inactive-b-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-bottom-inactive-lr-combined.png":[6,15,"png","qx"],"qx/decoration/Modern/tabview-button-bottom-inactive-t-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-left-active-lr-combined.png":[10,37,"png","qx"],"qx/decoration/Modern/tabview-button-left-active-tb-combined.png":[5,30,"png","qx"],"qx/decoration/Modern/tabview-button-left-inactive-b-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-left-inactive-lr-combined.png":[6,39,"png","qx"],"qx/decoration/Modern/tabview-button-left-inactive-t-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-right-active-lr-combined.png":[10,37,"png","qx"],"qx/decoration/Modern/tabview-button-right-active-tb-combined.png":[5,30,"png","qx"],"qx/decoration/Modern/tabview-button-right-inactive-b-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-right-inactive-lr-combined.png":[6,39,"png","qx"],"qx/decoration/Modern/tabview-button-right-inactive-t-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-top-active-lr-combined.png":[10,12,"png","qx"],"qx/decoration/Modern/tabview-button-top-active-tb-combined.png":[5,30,"png","qx"],"qx/decoration/Modern/tabview-button-top-inactive-b-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-button-top-inactive-lr-combined.png":[6,15,"png","qx"],"qx/decoration/Modern/tabview-button-top-inactive-t-combined.png":[3,9,"png","qx"],"qx/decoration/Modern/tabview-pane-lr-combined.png":[60,2,"png","qx"],"qx/decoration/Modern/tabview-pane-tb-combined.png":[30,180,"png","qx"],"qx/decoration/Modern/tabview/tab-button-bottom-active-b.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png",0,-10],"qx/decoration/Modern/tabview/tab-button-bottom-active-bl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png",0,-15],"qx/decoration/Modern/tabview/tab-button-bottom-active-br.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png",0,-5],"qx/decoration/Modern/tabview/tab-button-bottom-active-c.png":[40,14,"png","qx"],"qx/decoration/Modern/tabview/tab-button-bottom-active-l.png":[5,14,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-bottom-active-r.png":[5,14,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-lr-combined.png",-5,0],"qx/decoration/Modern/tabview/tab-button-bottom-active-t.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png",0,-20],"qx/decoration/Modern/tabview/tab-button-bottom-active-tl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png",0,-25],"qx/decoration/Modern/tabview/tab-button-bottom-active-tr.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-bottom-active-tb-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-bottom-active.png":[49,24,"png","qx"],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-b.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-b-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-bl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-b-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-br.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-b-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-c.png":[40,15,"png","qx"],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-l.png":[3,15,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-lr-combined.png",-3,0],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-r.png":[3,15,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-t.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-t-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-tl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-t-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-bottom-inactive-tr.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-bottom-inactive-t-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-bottom-inactive.png":[45,21,"png","qx"],"qx/decoration/Modern/tabview/tab-button-left-active-b.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-left-active-tb-combined.png",0,-5],"qx/decoration/Modern/tabview/tab-button-left-active-bl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-left-active-tb-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-left-active-br.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-left-active-tb-combined.png",0,-25],"qx/decoration/Modern/tabview/tab-button-left-active-c.png":[40,37,"png","qx"],"qx/decoration/Modern/tabview/tab-button-left-active-l.png":[5,37,"png","qx","qx/decoration/Modern/tabview-button-left-active-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-left-active-r.png":[5,37,"png","qx","qx/decoration/Modern/tabview-button-left-active-lr-combined.png",-5,0],"qx/decoration/Modern/tabview/tab-button-left-active-t.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-left-active-tb-combined.png",0,-15],"qx/decoration/Modern/tabview/tab-button-left-active-tl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-left-active-tb-combined.png",0,-10],"qx/decoration/Modern/tabview/tab-button-left-active-tr.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-left-active-tb-combined.png",0,-20],"qx/decoration/Modern/tabview/tab-button-left-active.png":[22,47,"png","qx"],"qx/decoration/Modern/tabview/tab-button-left-inactive-b.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-b-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-left-inactive-bl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-b-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-left-inactive-br.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-b-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-left-inactive-c.png":[40,39,"png","qx"],"qx/decoration/Modern/tabview/tab-button-left-inactive-l.png":[3,39,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-lr-combined.png",-3,0],"qx/decoration/Modern/tabview/tab-button-left-inactive-r.png":[3,39,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-left-inactive-t.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-t-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-left-inactive-tl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-t-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-left-inactive-tr.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-left-inactive-t-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-left-inactive.png":[20,45,"png","qx"],"qx/decoration/Modern/tabview/tab-button-right-active-b.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-right-active-tb-combined.png",0,-25],"qx/decoration/Modern/tabview/tab-button-right-active-bl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-right-active-tb-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-right-active-br.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-right-active-tb-combined.png",0,-20],"qx/decoration/Modern/tabview/tab-button-right-active-c.png":[40,37,"png","qx"],"qx/decoration/Modern/tabview/tab-button-right-active-l.png":[5,37,"png","qx","qx/decoration/Modern/tabview-button-right-active-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-right-active-r.png":[5,37,"png","qx","qx/decoration/Modern/tabview-button-right-active-lr-combined.png",-5,0],"qx/decoration/Modern/tabview/tab-button-right-active-t.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-right-active-tb-combined.png",0,-5],"qx/decoration/Modern/tabview/tab-button-right-active-tl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-right-active-tb-combined.png",0,-15],"qx/decoration/Modern/tabview/tab-button-right-active-tr.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-right-active-tb-combined.png",0,-10],"qx/decoration/Modern/tabview/tab-button-right-active.png":[22,47,"png","qx"],"qx/decoration/Modern/tabview/tab-button-right-inactive-b.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-b-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-right-inactive-bl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-b-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-right-inactive-br.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-b-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-right-inactive-c.png":[40,39,"png","qx"],"qx/decoration/Modern/tabview/tab-button-right-inactive-l.png":[3,39,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-right-inactive-r.png":[3,39,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-lr-combined.png",-3,0],"qx/decoration/Modern/tabview/tab-button-right-inactive-t.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-t-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-right-inactive-tl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-t-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-right-inactive-tr.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-right-inactive-t-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-right-inactive.png":[20,45,"png","qx"],"qx/decoration/Modern/tabview/tab-button-top-active-b.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-top-active-tb-combined.png",0,-20],"qx/decoration/Modern/tabview/tab-button-top-active-bl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-top-active-tb-combined.png",0,-15],"qx/decoration/Modern/tabview/tab-button-top-active-br.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-top-active-tb-combined.png",0,-10],"qx/decoration/Modern/tabview/tab-button-top-active-c.png":[40,14,"png","qx"],"qx/decoration/Modern/tabview/tab-button-top-active-l.png":[5,12,"png","qx","qx/decoration/Modern/tabview-button-top-active-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-top-active-r.png":[5,12,"png","qx","qx/decoration/Modern/tabview-button-top-active-lr-combined.png",-5,0],"qx/decoration/Modern/tabview/tab-button-top-active-t.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-top-active-tb-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-top-active-tl.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-top-active-tb-combined.png",0,-25],"qx/decoration/Modern/tabview/tab-button-top-active-tr.png":[5,5,"png","qx","qx/decoration/Modern/tabview-button-top-active-tb-combined.png",0,-5],"qx/decoration/Modern/tabview/tab-button-top-active.png":[48,22,"png","qx"],"qx/decoration/Modern/tabview/tab-button-top-inactive-b.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-b-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-top-inactive-bl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-b-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-top-inactive-br.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-b-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-top-inactive-c.png":[40,15,"png","qx"],"qx/decoration/Modern/tabview/tab-button-top-inactive-l.png":[3,15,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-top-inactive-r.png":[3,15,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-lr-combined.png",-3,0],"qx/decoration/Modern/tabview/tab-button-top-inactive-t.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-t-combined.png",0,-3],"qx/decoration/Modern/tabview/tab-button-top-inactive-tl.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-t-combined.png",0,0],"qx/decoration/Modern/tabview/tab-button-top-inactive-tr.png":[3,3,"png","qx","qx/decoration/Modern/tabview-button-top-inactive-t-combined.png",0,-6],"qx/decoration/Modern/tabview/tab-button-top-inactive.png":[45,21,"png","qx"],"qx/decoration/Modern/tabview/tabview-pane-b.png":[30,30,"png","qx","qx/decoration/Modern/tabview-pane-tb-combined.png",0,-60],"qx/decoration/Modern/tabview/tabview-pane-bl.png":[30,30,"png","qx","qx/decoration/Modern/tabview-pane-tb-combined.png",0,0],"qx/decoration/Modern/tabview/tabview-pane-br.png":[30,30,"png","qx","qx/decoration/Modern/tabview-pane-tb-combined.png",0,-120],"qx/decoration/Modern/tabview/tabview-pane-c.png":[40,120,"png","qx"],"qx/decoration/Modern/tabview/tabview-pane-l.png":[30,2,"png","qx","qx/decoration/Modern/tabview-pane-lr-combined.png",0,0],"qx/decoration/Modern/tabview/tabview-pane-r.png":[30,2,"png","qx","qx/decoration/Modern/tabview-pane-lr-combined.png",-30,0],"qx/decoration/Modern/tabview/tabview-pane-t.png":[30,30,"png","qx","qx/decoration/Modern/tabview-pane-tb-combined.png",0,-150],"qx/decoration/Modern/tabview/tabview-pane-tl.png":[30,30,"png","qx","qx/decoration/Modern/tabview-pane-tb-combined.png",0,-30],"qx/decoration/Modern/tabview/tabview-pane-tr.png":[30,30,"png","qx","qx/decoration/Modern/tabview-pane-tb-combined.png",0,-90],"qx/decoration/Modern/tabview/tabview-pane.png":[185,250,"png","qx"],"qx/decoration/Modern/toolbar-combined.png":[80,130,"png","qx"],"qx/decoration/Modern/toolbar/toolbar-gradient-blue.png":[40,130,"png","qx","qx/decoration/Modern/toolbar-combined.png",-40,0],"qx/decoration/Modern/toolbar/toolbar-gradient.png":[40,130,"png","qx","qx/decoration/Modern/toolbar-combined.png",0,0],"qx/decoration/Modern/toolbar/toolbar-handle-knob.gif":[1,8,"gif","qx"],"qx/decoration/Modern/toolbar/toolbar-part.gif":[7,1,"gif","qx"],"qx/decoration/Modern/tooltip-error-lr-combined.png":[12,18,"png","qx"],"qx/decoration/Modern/tooltip-error-tb-combined.png":[6,36,"png","qx"],"qx/decoration/Modern/tree-combined.png":[32,8,"png","qx"],"qx/decoration/Modern/tree/closed-selected.png":[8,8,"png","qx","qx/decoration/Modern/tree-combined.png",-24,0],"qx/decoration/Modern/tree/closed.png":[8,8,"png","qx","qx/decoration/Modern/tree-combined.png",-16,0],"qx/decoration/Modern/tree/open-selected.png":[8,8,"png","qx","qx/decoration/Modern/tree-combined.png",-8,0],"qx/decoration/Modern/tree/open.png":[8,8,"png","qx","qx/decoration/Modern/tree-combined.png",0,0],"qx/decoration/Modern/window-captionbar-buttons-combined.png":[108,9,"png","qx"],"qx/decoration/Modern/window-captionbar-lr-active-combined.png":[12,9,"png","qx"],"qx/decoration/Modern/window-captionbar-lr-inactive-combined.png":[12,9,"png","qx"],"qx/decoration/Modern/window-captionbar-tb-active-combined.png":[6,36,"png","qx"],"qx/decoration/Modern/window-captionbar-tb-inactive-combined.png":[6,36,"png","qx"],"qx/decoration/Modern/window-statusbar-lr-combined.png":[8,7,"png","qx"],"qx/decoration/Modern/window-statusbar-tb-combined.png":[4,24,"png","qx"],"qx/decoration/Modern/window/captionbar-active-b.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-active-combined.png",0,-18],"qx/decoration/Modern/window/captionbar-active-bl.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-active-combined.png",0,-24],"qx/decoration/Modern/window/captionbar-active-br.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-active-combined.png",0,-12],"qx/decoration/Modern/window/captionbar-active-c.png":[40,9,"png","qx"],"qx/decoration/Modern/window/captionbar-active-l.png":[6,9,"png","qx","qx/decoration/Modern/window-captionbar-lr-active-combined.png",-6,0],"qx/decoration/Modern/window/captionbar-active-r.png":[6,9,"png","qx","qx/decoration/Modern/window-captionbar-lr-active-combined.png",0,0],"qx/decoration/Modern/window/captionbar-active-t.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-active-combined.png",0,-6],"qx/decoration/Modern/window/captionbar-active-tl.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-active-combined.png",0,0],"qx/decoration/Modern/window/captionbar-active-tr.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-active-combined.png",0,-30],"qx/decoration/Modern/window/captionbar-active.png":[69,21,"png","qx"],"qx/decoration/Modern/window/captionbar-inactive-b.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-inactive-combined.png",0,-24],"qx/decoration/Modern/window/captionbar-inactive-bl.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-inactive-combined.png",0,-6],"qx/decoration/Modern/window/captionbar-inactive-br.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-inactive-combined.png",0,-30],"qx/decoration/Modern/window/captionbar-inactive-c.png":[40,9,"png","qx"],"qx/decoration/Modern/window/captionbar-inactive-l.png":[6,9,"png","qx","qx/decoration/Modern/window-captionbar-lr-inactive-combined.png",0,0],"qx/decoration/Modern/window/captionbar-inactive-r.png":[6,9,"png","qx","qx/decoration/Modern/window-captionbar-lr-inactive-combined.png",-6,0],"qx/decoration/Modern/window/captionbar-inactive-t.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-inactive-combined.png",0,0],"qx/decoration/Modern/window/captionbar-inactive-tl.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-inactive-combined.png",0,-12],"qx/decoration/Modern/window/captionbar-inactive-tr.png":[6,6,"png","qx","qx/decoration/Modern/window-captionbar-tb-inactive-combined.png",0,-18],"qx/decoration/Modern/window/captionbar-inactive.png":[69,21,"png","qx"],"qx/decoration/Modern/window/close-active-hovered.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-27,0],"qx/decoration/Modern/window/close-active.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-9,0],"qx/decoration/Modern/window/close-inactive.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-90,0],"qx/decoration/Modern/window/maximize-active-hovered.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-18,0],"qx/decoration/Modern/window/maximize-active.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-81,0],"qx/decoration/Modern/window/maximize-inactive.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-54,0],"qx/decoration/Modern/window/minimize-active-hovered.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-63,0],"qx/decoration/Modern/window/minimize-active.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-72,0],"qx/decoration/Modern/window/minimize-inactive.png":[9,9,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-36,0],"qx/decoration/Modern/window/restore-active-hovered.png":[9,8,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",0,0],"qx/decoration/Modern/window/restore-active.png":[9,8,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-99,0],"qx/decoration/Modern/window/restore-inactive.png":[9,8,"png","qx","qx/decoration/Modern/window-captionbar-buttons-combined.png",-45,0],"qx/decoration/Modern/window/statusbar-b.png":[4,4,"png","qx","qx/decoration/Modern/window-statusbar-tb-combined.png",0,-16],"qx/decoration/Modern/window/statusbar-bl.png":[4,4,"png","qx","qx/decoration/Modern/window-statusbar-tb-combined.png",0,-20],"qx/decoration/Modern/window/statusbar-br.png":[4,4,"png","qx","qx/decoration/Modern/window-statusbar-tb-combined.png",0,-4],"qx/decoration/Modern/window/statusbar-c.png":[40,7,"png","qx"],"qx/decoration/Modern/window/statusbar-l.png":[4,7,"png","qx","qx/decoration/Modern/window-statusbar-lr-combined.png",-4,0],"qx/decoration/Modern/window/statusbar-r.png":[4,7,"png","qx","qx/decoration/Modern/window-statusbar-lr-combined.png",0,0],"qx/decoration/Modern/window/statusbar-t.png":[4,4,"png","qx","qx/decoration/Modern/window-statusbar-tb-combined.png",0,0],"qx/decoration/Modern/window/statusbar-tl.png":[4,4,"png","qx","qx/decoration/Modern/window-statusbar-tb-combined.png",0,-8],"qx/decoration/Modern/window/statusbar-tr.png":[4,4,"png","qx","qx/decoration/Modern/window-statusbar-tb-combined.png",0,-12],"qx/decoration/Modern/window/statusbar.png":[369,15,"png","qx"],"qx/icon/Tango/16/actions/dialog-cancel.png":[16,16,"png","qx"],"qx/icon/Tango/16/actions/dialog-ok.png":[16,16,"png","qx"],"qx/icon/Tango/16/actions/view-refresh.png":[16,16,"png","qx"],"qx/icon/Tango/16/actions/window-close.png":[16,16,"png","qx"],"qx/icon/Tango/16/apps/office-calendar.png":[16,16,"png","qx"],"qx/icon/Tango/16/apps/utilities-color-chooser.png":[16,16,"png","qx"],"qx/icon/Tango/16/mimetypes/office-document.png":[16,16,"png","qx"],"qx/icon/Tango/16/places/folder-open.png":[16,16,"png","qx"],"qx/icon/Tango/16/places/folder.png":[16,16,"png","qx"],"qx/icon/Tango/22/actions/edit-find.png":[22,22,"png","qx"],"qx/icon/Tango/22/actions/media-seek-forward.png":[22,22,"png","qx"],"qx/icon/Tango/22/apps/utilities-dictionary.png":[22,22,"png","qx"],"qx/icon/Tango/22/apps/utilities-graphics-viewer.png":[22,22,"png","qx"],"qx/icon/Tango/22/apps/utilities-help.png":[22,22,"png","qx"],"qx/icon/Tango/22/mimetypes/office-document.png":[22,22,"png","qx"],"qx/icon/Tango/22/places/folder-open.png":[22,22,"png","qx"],"qx/icon/Tango/22/places/folder.png":[22,22,"png","qx"],"qx/icon/Tango/32/mimetypes/office-document.png":[32,32,"png","qx"],"qx/icon/Tango/32/places/folder-open.png":[32,32,"png","qx"],"qx/icon/Tango/32/places/folder.png":[32,32,"png","qx"],"qx/static/blank.gif":[1,1,"gif","qx"],"qx/static/blank.html":"qx"},"translations":{"C":{}}};
-(function(){var m="toString",k=".",j="default",h="Object",g='"',f="Array",e="()",d="String",c="Function",b=".prototype",L="function",K="Boolean",J="Error",I="constructor",H="warn",G="hasOwnProperty",F="string",E="toLocaleString",D="RegExp",C='\", "',t="info",u="BROKEN_IE",r="isPrototypeOf",s="Date",p="",q="qx.Bootstrap",n="]",o="Class",v="error",w="[Class ",y="valueOf",x="Number",A="count",z="debug",B="ES5";if(!window.qx){window.qx={};}qx.Bootstrap={genericToString:function(){return w+this.classname+n;},createNamespace:function(name,M){var O=name.split(k);var parent=window;var N=O[0];for(var i=0,P=O.length-1;i<P;i++,N=O[i]){if(!parent[N]){parent=parent[N]={};}else{parent=parent[N];}}parent[N]=M;return N;},setDisplayName:function(Q,R,name){Q.displayName=R+k+name+e;},setDisplayNames:function(S,T){for(var name in S){var U=S[name];if(U instanceof Function){U.displayName=T+k+name+e;}}},define:function(name,V){if(!V){var V={statics:{}};}var bb;var Y=null;qx.Bootstrap.setDisplayNames(V.statics,name);if(V.members||V.extend){qx.Bootstrap.setDisplayNames(V.members,name+b);bb=V.construct||new Function;if(V.extend){this.extendClass(bb,bb,V.extend,name,ba);}var W=V.statics||{};for(var i=0,bc=qx.Bootstrap.getKeys(W),l=bc.length;i<l;i++){var bd=bc[i];bb[bd]=W[bd];}Y=bb.prototype;var X=V.members||{};for(var i=0,bc=qx.Bootstrap.getKeys(X),l=bc.length;i<l;i++){var bd=bc[i];Y[bd]=X[bd];}}else{bb=V.statics||{};}var ba=this.createNamespace(name,bb);bb.name=bb.classname=name;bb.basename=ba;bb.$$type=o;if(!bb.hasOwnProperty(m)){bb.toString=this.genericToString;}if(V.defer){V.defer(bb,Y);}qx.Bootstrap.$$registry[name]=V.statics;return bb;}};qx.Bootstrap.define(q,{statics:{LOADSTART:qx.$$start||new Date(),createNamespace:qx.Bootstrap.createNamespace,define:qx.Bootstrap.define,setDisplayName:qx.Bootstrap.setDisplayName,setDisplayNames:qx.Bootstrap.setDisplayNames,genericToString:qx.Bootstrap.genericToString,extendClass:function(be,bf,bg,name,bh){var bk=bg.prototype;var bj=new Function;bj.prototype=bk;var bi=new bj;be.prototype=bi;bi.name=bi.classname=name;bi.basename=bh;bf.base=be.superclass=bg;bf.self=be.constructor=bi.constructor=be;},getByName:function(name){return qx.Bootstrap.$$registry[name];},$$registry:{},objectGetLength:({"count":function(bl){return bl.__count__;},"default":function(bm){var length=0;for(var bn in bm){length++;}return length;}})[(({}).__count__==0)?A:j],objectMergeWith:function(bo,bp,bq){if(bq===undefined){bq=true;}for(var br in bp){if(bq||bo[br]===undefined){bo[br]=bp[br];}}return bo;},__id:[r,G,E,m,y,I],getKeys:({"ES5":Object.keys,"BROKEN_IE":function(bs){var bt=[];var bv=Object.prototype.hasOwnProperty;for(var bw in bs){if(bv.call(bs,bw)){bt.push(bw);}}var bu=qx.Bootstrap.__id;for(var i=0,a=bu,l=a.length;i<l;i++){if(bv.call(bs,a[i])){bt.push(a[i]);}}return bt;},"default":function(bx){var by=[];var bz=Object.prototype.hasOwnProperty;for(var bA in bx){if(bz.call(bx,bA)){by.push(bA);}}return by;}})[typeof (Object.keys)==L?B:(function(){for(var bB in {toString:1}){return bB;}})()!==m?u:j],getKeysAsString:function(bC){var bD=qx.Bootstrap.getKeys(bC);if(bD.length==0){return p;}return g+bD.join(C)+g;},__ie:{"[object String]":d,"[object Array]":f,"[object Object]":h,"[object RegExp]":D,"[object Number]":x,"[object Boolean]":K,"[object Date]":s,"[object Function]":c,"[object Error]":J},bind:function(bE,self,bF){var bG=Array.prototype.slice.call(arguments,2,arguments.length);return function(){var bH=Array.prototype.slice.call(arguments,0,arguments.length);return bE.apply(self,bG.concat(bH));};},firstUp:function(bI){return bI.charAt(0).toUpperCase()+bI.substr(1);},firstLow:function(bJ){return bJ.charAt(0).toLowerCase()+bJ.substr(1);},getClass:function(bK){var bL=Object.prototype.toString.call(bK);return (qx.Bootstrap.__ie[bL]||bL.slice(8,-1));},isString:function(bM){return (bM!==null&&(typeof bM===F||qx.Bootstrap.getClass(bM)==d||bM instanceof String||(!!bM&&!!bM.$$isString)));},isArray:function(bN){return (bN!==null&&(bN instanceof Array||(bN&&qx.data&&qx.data.IListData&&qx.Bootstrap.hasInterface(bN.constructor,qx.data.IListData))||qx.Bootstrap.getClass(bN)==f||(!!bN&&!!bN.$$isArray)));},isObject:function(bO){return (bO!==undefined&&bO!==null&&qx.Bootstrap.getClass(bO)==h);},isFunction:function(bP){return qx.Bootstrap.getClass(bP)==c;},classIsDefined:function(name){return qx.Bootstrap.getByName(name)!==undefined;},getPropertyDefinition:function(bQ,name){while(bQ){if(bQ.$$properties&&bQ.$$properties[name]){return bQ.$$properties[name];}bQ=bQ.superclass;}return null;},hasProperty:function(bR,name){return !!qx.Bootstrap.getPropertyDefinition(bR,name);},getEventType:function(bS,name){var bS=bS.constructor;while(bS.superclass){if(bS.$$events&&bS.$$events[name]!==undefined){return bS.$$events[name];}bS=bS.superclass;}return null;},supportsEvent:function(bT,name){return !!qx.Bootstrap.getEventType(bT,name);},getByInterface:function(bU,bV){var bW,i,l;while(bU){if(bU.$$implements){bW=bU.$$flatImplements;for(i=0,l=bW.length;i<l;i++){if(bW[i]===bV){return bU;}}}bU=bU.superclass;}return null;},hasInterface:function(bX,bY){return !!qx.Bootstrap.getByInterface(bX,bY);},getMixins:function(ca){var cb=[];while(ca){if(ca.$$includes){cb.push.apply(cb,ca.$$flatIncludes);}ca=ca.superclass;}return cb;},$$logs:[],debug:function(cc,cd){qx.Bootstrap.$$logs.push([z,arguments]);},info:function(ce,cf){qx.Bootstrap.$$logs.push([t,arguments]);},warn:function(cg,ch){qx.Bootstrap.$$logs.push([H,arguments]);},error:function(ci,cj){qx.Bootstrap.$$logs.push([v,arguments]);},trace:function(ck){}}});})();(function(){var g="qx.Mixin",f=".prototype",e="constructor",d="[Mixin ",c="]",b="destruct",a="Mixin";qx.Bootstrap.define(g,{statics:{define:function(name,h){if(h){if(h.include&&!(h.include instanceof Array)){h.include=[h.include];}{};var k=h.statics?h.statics:{};qx.Bootstrap.setDisplayNames(k,name);for(var j in k){if(k[j] instanceof Function){k[j].$$mixin=k;}}if(h.construct){k.$$constructor=h.construct;qx.Bootstrap.setDisplayName(h.construct,name,e);}if(h.include){k.$$includes=h.include;}if(h.properties){k.$$properties=h.properties;}if(h.members){k.$$members=h.members;qx.Bootstrap.setDisplayNames(h.members,name+f);}for(var j in k.$$members){if(k.$$members[j] instanceof Function){k.$$members[j].$$mixin=k;}}if(h.events){k.$$events=h.events;}if(h.destruct){k.$$destructor=h.destruct;qx.Bootstrap.setDisplayName(h.destruct,name,b);}}else{var k={};}k.$$type=a;k.name=name;k.toString=this.genericToString;k.basename=qx.Bootstrap.createNamespace(name,k);this.$$registry[name]=k;return k;},checkCompatibility:function(m){var p=this.flatten(m);var q=p.length;if(q<2){return true;}var t={};var s={};var r={};var o;for(var i=0;i<q;i++){o=p[i];for(var n in o.events){if(r[n]){throw new Error('Conflict between mixin "'+o.name+'" and "'+r[n]+'" in member "'+n+'"!');}r[n]=o.name;}for(var n in o.properties){if(t[n]){throw new Error('Conflict between mixin "'+o.name+'" and "'+t[n]+'" in property "'+n+'"!');}t[n]=o.name;}for(var n in o.members){if(s[n]){throw new Error('Conflict between mixin "'+o.name+'" and "'+s[n]+'" in member "'+n+'"!');}s[n]=o.name;}}return true;},isCompatible:function(u,v){var w=qx.Bootstrap.getMixins(v);w.push(u);return qx.Mixin.checkCompatibility(w);},getByName:function(name){return this.$$registry[name];},isDefined:function(name){return this.getByName(name)!==undefined;},getTotalNumber:function(){return qx.Bootstrap.objectGetLength(this.$$registry);},flatten:function(x){if(!x){return [];}var y=x.concat();for(var i=0,l=x.length;i<l;i++){if(x[i].$$includes){y.push.apply(y,this.flatten(x[i].$$includes));}}return y;},genericToString:function(){return d+this.name+c;},$$registry:{},__er:null,__es:function(){}}});})();(function(){var h="qx.allowUrlSettings",g="&",f="qx.core.Setting",e="qx.allowUrlVariants",d="qx.propertyDebugLevel",c="qxsetting",b=":",a=".";qx.Bootstrap.define(f,{statics:{__eu:{},define:function(j,k){if(k===undefined){throw new Error('Default value of setting "'+j+'" must be defined!');}if(!this.__eu[j]){this.__eu[j]={};}else if(this.__eu[j].defaultValue!==undefined){throw new Error('Setting "'+j+'" is already defined!');}this.__eu[j].defaultValue=k;},get:function(l){var m=this.__eu[l];if(m===undefined){throw new Error('Setting "'+l+'" is not defined.');}if(m.value!==undefined){return m.value;}return m.defaultValue;},set:function(n,o){if((n.split(a)).length<2){throw new Error('Malformed settings key "'+n+'". Must be following the schema "namespace.key".');}if(!this.__eu[n]){this.__eu[n]={};}this.__eu[n].value=o;},__ev:function(){if(window.qxsettings){for(var p in window.qxsettings){this.set(p,window.qxsettings[p]);}window.qxsettings=undefined;try{delete window.qxsettings;}catch(q){}this.__ew();}},__ew:function(){if(this.get(h)!=true){return;}var s=document.location.search.slice(1).split(g);for(var i=0;i<s.length;i++){var r=s[i].split(b);if(r.length!=3||r[0]!=c){continue;}this.set(r[1],decodeURIComponent(r[2]));}}},defer:function(t){t.define(h,false);t.define(e,false);t.define(d,0);t.__ev();}});})();(function(){var h="function",g="Boolean",f="qx.Interface",e="]",d="toggle",c="Interface",b="is",a="[Interface ";qx.Bootstrap.define(f,{statics:{define:function(name,j){if(j){if(j.extend&&!(j.extend instanceof Array)){j.extend=[j.extend];}{};var k=j.statics?j.statics:{};if(j.extend){k.$$extends=j.extend;}if(j.properties){k.$$properties=j.properties;}if(j.members){k.$$members=j.members;}if(j.events){k.$$events=j.events;}}else{var k={};}k.$$type=c;k.name=name;k.toString=this.genericToString;k.basename=qx.Bootstrap.createNamespace(name,k);qx.Interface.$$registry[name]=k;return k;},getByName:function(name){return this.$$registry[name];},isDefined:function(name){return this.getByName(name)!==undefined;},getTotalNumber:function(){return qx.Bootstrap.objectGetLength(this.$$registry);},flatten:function(m){if(!m){return [];}var n=m.concat();for(var i=0,l=m.length;i<l;i++){if(m[i].$$extends){n.push.apply(n,this.flatten(m[i].$$extends));}}return n;},__fI:function(o,p,q,r){var v=q.$$members;if(v){for(var u in v){if(qx.Bootstrap.isFunction(v[u])){var t=this.__fJ(p,u);var s=t||qx.Bootstrap.isFunction(o[u]);if(!s){throw new Error('Implementation of method "'+u+'" is missing in class "'+p.classname+'" required by interface "'+q.name+'"');}var w=r===true&&!t&&!qx.Bootstrap.hasInterface(p,q);if(w){o[u]=this.__fM(q,o[u],u,v[u]);}}else{if(typeof o[u]===undefined){if(typeof o[u]!==h){throw new Error('Implementation of member "'+u+'" is missing in class "'+p.classname+'" required by interface "'+q.name+'"');}}}}}},__fJ:function(x,y){var C=y.match(/^(is|toggle|get|set|reset)(.*)$/);if(!C){return false;}var z=qx.Bootstrap.firstLow(C[2]);var A=qx.Bootstrap.getPropertyDefinition(x,z);if(!A){return false;}var B=C[0]==b||C[0]==d;if(B){return qx.Bootstrap.getPropertyDefinition(x,z).check==g;}return true;},__fK:function(D,E){if(E.$$properties){for(var F in E.$$properties){if(!qx.Bootstrap.getPropertyDefinition(D,F)){throw new Error('The property "'+F+'" is not supported by Class "'+D.classname+'"!');}}}},__fL:function(G,H){if(H.$$events){for(var I in H.$$events){if(!qx.Bootstrap.supportsEvent(G,I)){throw new Error('The event "'+I+'" is not supported by Class "'+G.classname+'"!');}}}},assertObject:function(J,K){var M=J.constructor;this.__fI(J,M,K,false);this.__fK(M,K);this.__fL(M,K);var L=K.$$extends;if(L){for(var i=0,l=L.length;i<l;i++){this.assertObject(J,L[i]);}}},assert:function(N,O,P){this.__fI(N.prototype,N,O,P);this.__fK(N,O);this.__fL(N,O);var Q=O.$$extends;if(Q){for(var i=0,l=Q.length;i<l;i++){this.assert(N,Q[i],P);}}},genericToString:function(){return a+this.name+e;},$$registry:{},__fM:function(){},__fN:null,__fO:function(){}}});})();(function(){var g="emulated",f="native",e='"',d="qx.lang.Core",c="\\\\",b="\\\"",a="[object Error]";qx.Bootstrap.define(d,{statics:{errorToString:{"native":Error.prototype.toString,"emulated":function(){return this.message;}}[(!Error.prototype.toString||Error.prototype.toString()==a)?g:f],arrayIndexOf:{"native":Array.prototype.indexOf,"emulated":function(h,j){if(j==null){j=0;}else if(j<0){j=Math.max(0,this.length+j);}for(var i=j;i<this.length;i++){if(this[i]===h){return i;}}return -1;}}[Array.prototype.indexOf?f:g],arrayLastIndexOf:{"native":Array.prototype.lastIndexOf,"emulated":function(k,m){if(m==null){m=this.length-1;}else if(m<0){m=Math.max(0,this.length+m);}for(var i=m;i>=0;i--){if(this[i]===k){return i;}}return -1;}}[Array.prototype.lastIndexOf?f:g],arrayForEach:{"native":Array.prototype.forEach,"emulated":function(n,o){var l=this.length;for(var i=0;i<l;i++){var p=this[i];if(p!==undefined){n.call(o||window,p,i,this);}}}}[Array.prototype.forEach?f:g],arrayFilter:{"native":Array.prototype.filter,"emulated":function(q,r){var s=[];var l=this.length;for(var i=0;i<l;i++){var t=this[i];if(t!==undefined){if(q.call(r||window,t,i,this)){s.push(this[i]);}}}return s;}}[Array.prototype.filter?f:g],arrayMap:{"native":Array.prototype.map,"emulated":function(u,v){var w=[];var l=this.length;for(var i=0;i<l;i++){var x=this[i];if(x!==undefined){w[i]=u.call(v||window,x,i,this);}}return w;}}[Array.prototype.map?f:g],arraySome:{"native":Array.prototype.some,"emulated":function(y,z){var l=this.length;for(var i=0;i<l;i++){var A=this[i];if(A!==undefined){if(y.call(z||window,A,i,this)){return true;}}}return false;}}[Array.prototype.some?f:g],arrayEvery:{"native":Array.prototype.every,"emulated":function(B,C){var l=this.length;for(var i=0;i<l;i++){var D=this[i];if(D!==undefined){if(!B.call(C||window,D,i,this)){return false;}}}return true;}}[Array.prototype.every?f:g],stringQuote:{"native":String.prototype.quote,"emulated":function(){return e+this.replace(/\\/g,c).replace(/\"/g,b)+e;}}[String.prototype.quote?f:g]}});Error.prototype.toString=qx.lang.Core.errorToString;Array.prototype.indexOf=qx.lang.Core.arrayIndexOf;Array.prototype.lastIndexOf=qx.lang.Core.arrayLastIndexOf;Array.prototype.forEach=qx.lang.Core.arrayForEach;Array.prototype.filter=qx.lang.Core.arrayFilter;Array.prototype.map=qx.lang.Core.arrayMap;Array.prototype.some=qx.lang.Core.arraySome;Array.prototype.every=qx.lang.Core.arrayEvery;String.prototype.quote=qx.lang.Core.stringQuote;})();(function(){var cv=';',cu='computed=this.',ct='=value;',cs='this.',cr="set",cq="setThemed",cp="setRuntime",co="init",cn='if(this.',cm='delete this.',bw='!==undefined)',bv='}',bu="resetThemed",bt='else if(this.',bs="string",br='return this.',bq="reset",bp="boolean",bo="resetRuntime",bn='!==undefined){',cC="",cD="refresh",cA='=true;',cB="this.",cy=";",cz='old=this.',cw="();",cx='else ',cE='if(old===undefined)old=this.',cF='old=computed=this.',bU="return this.",bT="get",bW='(value);',bV="(a[",bY='if(old===computed)return value;',bX='if(old===undefined)old=null;',cb=' of an instance of ',ca=' is not (yet) ready!");',bS="]);",bR='!==inherit){',c='qx.lang.Type.isString(value) && qx.util.ColorUtil.isValidPropertyValue(value)',d='value !== null && qx.theme.manager.Font.getInstance().isDynamic(value)',e='value !== null && value.nodeType === 9 && value.documentElement',f='===value)return value;',g='value !== null && value.$$type === "Mixin"',h='return init;',j='var init=this.',k='value !== null && value.nodeType === 1 && value.attributes',m="var parent = this.getLayoutParent();",n="Error in property ",cT='var a=this._getChildren();if(a)for(var i=0,l=a.length;i<l;i++){',cS='.validate.call(this, value);',cR='qx.core.Assert.assertInstance(value, Date, msg) || true',cQ='else{',cX="if (!parent) return;",cW=" in method ",cV='qx.core.Assert.assertInstance(value, Error, msg) || true',cU='=computed;',da='Undefined value is not allowed!',cY='(backup);',M="MSIE 6.0",N='if(computed===inherit){',K="inherit",L='Is invalid!',Q='if(value===undefined)prop.error(this,2,"',R='var computed, old=this.',O='else if(computed===undefined)',P="': ",I=" of class ",J='value !== null && value.nodeType !== undefined',v='===undefined)return;',u='value !== null && qx.theme.manager.Decoration.getInstance().isValidPropertyValue(value)',x="')){",w='qx.core.Assert.assertPositiveInteger(value, msg) || true',r='else this.',q='value=this.',t='","',s='if(init==qx.core.Property.$$inherit)init=null;',p='value !== null && value.$$type === "Interface"',o='var inherit=prop.$$inherit;',W="', qx.event.type.Data, [computed, old]",X="var value = parent.",Y="$$useinit_",ba='computed=undefined;delete this.',S="(value);",T='Requires exactly one argument!',U='",value);',V='computed=value;',bb="$$runtime_",bc=';}',F="$$user_",E='){',D='qx.core.Assert.assertArray(value, msg) || true',C='if(computed===undefined||computed===inherit){',B='qx.core.Assert.assertPositiveNumber(value, msg) || true',A=".prototype",z="Boolean",y=")}",H='(computed, old, "',G='return value;',bd='if(init==qx.core.Property.$$inherit)throw new Error("Inheritable property ',be="if(reg.hasListener(this, '",bf='Does not allow any arguments!',bg=')a[i].',bh="()",bi="var a=arguments[0] instanceof Array?arguments[0]:arguments;",bj='.$$properties.',bk='value !== null && value.$$type === "Theme"',bl="var reg=qx.event.Registration;",bm="())",bA='return null;',bz='qx.core.Assert.assertObject(value, msg) || true',by='");',bx='qx.core.Assert.assertString(value, msg) || true',bE='var pa=this.getLayoutParent();if(pa)computed=pa.',bD="if (value===undefined) value = parent.",bC='value !== null && value.$$type === "Class"',bB='qx.core.Assert.assertFunction(value, msg) || true',bG='!==undefined&&',bF='var computed, old;',bN='var backup=computed;',bO='}else{',bL="object",bM="$$init_",bJ="$$theme_",bK='if(computed===undefined)computed=null;',bH='qx.core.Assert.assertMap(value, msg) || true',bI='qx.core.Assert.assertNumber(value, msg) || true',bP='if((computed===undefined||computed===inherit)&&',bQ="reg.fireEvent(this, '",cf='Null value is not allowed!',ce='qx.core.Assert.assertInteger(value, msg) || true',ch="value",cg="rv:1.8.1",cj="shorthand",ci='qx.core.Assert.assertInstance(value, RegExp, msg) || true',cl='value !== null && value.type !== undefined',ck='value !== null && value.document',cd='throw new Error("Property ',cc="(!this.",cM='qx.core.Assert.assertBoolean(value, msg) || true',cN='if(a[i].',cO="toggle",cP="$$inherit_",cI='var prop=qx.core.Property;',cJ=" with incoming value '",cK="a=qx.lang.Array.fromShortHand(qx.lang.Array.fromArguments(a));",cL='if(computed===undefined||computed==inherit)computed=null;',cG="qx.core.Property",cH="is",b='Could not change or apply init value after constructing phase!';qx.Bootstrap.define(cG,{statics:{__lF:{"Boolean":cM,"String":bx,"Number":bI,"Integer":ce,"PositiveNumber":B,"PositiveInteger":w,"Error":cV,"RegExp":ci,"Object":bz,"Array":D,"Map":bH,"Function":bB,"Date":cR,"Node":J,"Element":k,"Document":e,"Window":ck,"Event":cl,"Class":bC,"Mixin":g,"Interface":p,"Theme":bk,"Color":c,"Decorator":u,"Font":d},__lG:{"Node":true,"Element":true,"Document":true,"Window":true,"Event":true},$$inherit:K,$$store:{runtime:{},user:{},theme:{},inherit:{},init:{},useinit:{}},$$method:{get:{},set:{},reset:{},init:{},refresh:{},setRuntime:{},resetRuntime:{},setThemed:{},resetThemed:{}},$$allowedKeys:{name:bs,dereference:bp,inheritable:bp,nullable:bp,themeable:bp,refine:bp,init:null,apply:bs,event:bs,check:null,transform:bs,deferredInit:bp,validate:null},$$allowedGroupKeys:{name:bs,group:bL,mode:bs,themeable:bp},$$inheritable:{},__lH:function(db){var dc=this.__lI(db);if(!dc.length){var dd=qx.lang.Function.empty;}else{dd=this.__lJ(dc);}db.prototype.$$refreshInheritables=dd;},__lI:function(de){var dg=[];while(de){var df=de.$$properties;if(df){for(var name in this.$$inheritable){if(df[name]&&df[name].inheritable){dg.push(name);}}}de=de.superclass;}return dg;},__lJ:function(dh){var dl=this.$$store.inherit;var dk=this.$$store.init;var dj=this.$$method.refresh;var di=[m,cX];for(var i=0,l=dh.length;i<l;i++){var name=dh[i];di.push(X,dl[name],cy,bD,dk[name],cy,cB,dj[name],S);}return new Function(di.join(cC));},attachRefreshInheritables:function(dm){dm.prototype.$$refreshInheritables=function(){qx.core.Property.__lH(dm);return this.$$refreshInheritables();};},attachMethods:function(dn,name,dp){dp.group?this.__lK(dn,dp,name):this.__lL(dn,dp,name);},__lK:function(dq,dr,name){var dy=qx.Bootstrap.firstUp(name);var dx=dq.prototype;var dz=dr.themeable===true;{};var dA=[];var du=[];if(dz){var ds=[];var dw=[];}var dv=bi;dA.push(dv);if(dz){ds.push(dv);}if(dr.mode==cj){var dt=cK;dA.push(dt);if(dz){ds.push(dt);}}for(var i=0,a=dr.group,l=a.length;i<l;i++){{};dA.push(cB,this.$$method.set[a[i]],bV,i,bS);du.push(cB,this.$$method.reset[a[i]],cw);if(dz){{};ds.push(cB,this.$$method.setThemed[a[i]],bV,i,bS);dw.push(cB,this.$$method.resetThemed[a[i]],cw);}}this.$$method.set[name]=cr+dy;dx[this.$$method.set[name]]=new Function(dA.join(cC));this.$$method.reset[name]=bq+dy;dx[this.$$method.reset[name]]=new Function(du.join(cC));if(dz){this.$$method.setThemed[name]=cq+dy;dx[this.$$method.setThemed[name]]=new Function(ds.join(cC));this.$$method.resetThemed[name]=bu+dy;dx[this.$$method.resetThemed[name]]=new Function(dw.join(cC));}},__lL:function(dB,dC,name){var dE=qx.Bootstrap.firstUp(name);var dG=dB.prototype;{};if(dC.dereference===undefined&&typeof dC.check===bs){dC.dereference=this.__lM(dC.check);}var dF=this.$$method;var dD=this.$$store;dD.runtime[name]=bb+name;dD.user[name]=F+name;dD.theme[name]=bJ+name;dD.init[name]=bM+name;dD.inherit[name]=cP+name;dD.useinit[name]=Y+name;dF.get[name]=bT+dE;dG[dF.get[name]]=function(){return qx.core.Property.executeOptimizedGetter(this,dB,name,bT);};dF.set[name]=cr+dE;dG[dF.set[name]]=function(dH){return qx.core.Property.executeOptimizedSetter(this,dB,name,cr,arguments);};dF.reset[name]=bq+dE;dG[dF.reset[name]]=function(){return qx.core.Property.executeOptimizedSetter(this,dB,name,bq);};if(dC.inheritable||dC.apply||dC.event||dC.deferredInit){dF.init[name]=co+dE;dG[dF.init[name]]=function(dI){return qx.core.Property.executeOptimizedSetter(this,dB,name,co,arguments);};}if(dC.inheritable){dF.refresh[name]=cD+dE;dG[dF.refresh[name]]=function(dJ){return qx.core.Property.executeOptimizedSetter(this,dB,name,cD,arguments);};}dF.setRuntime[name]=cp+dE;dG[dF.setRuntime[name]]=function(dK){return qx.core.Property.executeOptimizedSetter(this,dB,name,cp,arguments);};dF.resetRuntime[name]=bo+dE;dG[dF.resetRuntime[name]]=function(){return qx.core.Property.executeOptimizedSetter(this,dB,name,bo);};if(dC.themeable){dF.setThemed[name]=cq+dE;dG[dF.setThemed[name]]=function(dL){return qx.core.Property.executeOptimizedSetter(this,dB,name,cq,arguments);};dF.resetThemed[name]=bu+dE;dG[dF.resetThemed[name]]=function(){return qx.core.Property.executeOptimizedSetter(this,dB,name,bu);};}if(dC.check===z){dG[cO+dE]=new Function(bU+dF.set[name]+cc+dF.get[name]+bm);dG[cH+dE]=new Function(bU+dF.get[name]+bh);}},__lM:function(dM){return !!this.__lG[dM];},__lN:function(dN){return this.__lG[dN]||qx.Bootstrap.classIsDefined(dN)||(qx.Interface&&qx.Interface.isDefined(dN));},__lO:{0:b,1:T,2:da,3:bf,4:cf,5:L},error:function(dO,dP,dQ,dR,dS){var dT=dO.constructor.classname;var dU=n+dQ+I+dT+cW+this.$$method[dR][dQ]+cJ+dS+P;throw new Error(dU+(this.__lO[dP]||"Unknown reason: "+dP));},__lP:function(dV,dW,name,dX,dY,ea){var eb=this.$$method[dX][name];{dW[eb]=new Function(ch,dY.join(cC));};{};qx.Bootstrap.setDisplayName(dW[eb],dV.classname+A,eb);if(ea===undefined){return dV[eb]();}else{return dV[eb](ea[0]);}},executeOptimizedGetter:function(ec,ed,name,ee){var eg=ed.$$properties[name];var ei=ed.prototype;var ef=[];var eh=this.$$store;ef.push(cn,eh.runtime[name],bw);ef.push(br,eh.runtime[name],cv);if(eg.inheritable){ef.push(bt,eh.inherit[name],bw);ef.push(br,eh.inherit[name],cv);ef.push(cx);}ef.push(cn,eh.user[name],bw);ef.push(br,eh.user[name],cv);if(eg.themeable){ef.push(bt,eh.theme[name],bw);ef.push(br,eh.theme[name],cv);}if(eg.deferredInit&&eg.init===undefined){ef.push(bt,eh.init[name],bw);ef.push(br,eh.init[name],cv);}ef.push(cx);if(eg.init!==undefined){if(eg.inheritable){ef.push(j,eh.init[name],cv);if(eg.nullable){ef.push(s);}else if(eg.init!==undefined){ef.push(br,eh.init[name],cv);}else{ef.push(bd,name,cb,ed.classname,ca);}ef.push(h);}else{ef.push(br,eh.init[name],cv);}}else if(eg.inheritable||eg.nullable){ef.push(bA);}else{ef.push(cd,name,cb,ed.classname,ca);}return this.__lP(ec,ei,name,ee,ef);},executeOptimizedSetter:function(ej,ek,name,el,em){var er=ek.$$properties[name];var eq=ek.prototype;var eo=[];var en=el===cr||el===cq||el===cp||(el===co&&er.init===undefined);var ep=er.apply||er.event||er.inheritable;var es=this.__lQ(el,name);this.__lR(eo,er,name,el,en);if(en){this.__lS(eo,ek,er,name);}if(ep){this.__lT(eo,en,es,el);}if(er.inheritable){eo.push(o);}{};if(!ep){this.__lV(eo,name,el,en);}else{this.__lW(eo,er,name,el,en);}if(er.inheritable){this.__lX(eo,er,name,el);}else if(ep){this.__lY(eo,er,name,el);}if(ep){this.__ma(eo,er,name);if(er.inheritable&&eq._getChildren){this.__mb(eo,name);}}if(en){eo.push(G);}return this.__lP(ej,eq,name,el,eo,em);},__lQ:function(et,name){if(et===cp||et===bo){var eu=this.$$store.runtime[name];}else if(et===cq||et===bu){eu=this.$$store.theme[name];}else if(et===co){eu=this.$$store.init[name];}else{eu=this.$$store.user[name];}return eu;},__lR:function(ev,ew,name,ex,ey){{if(!ew.nullable||ew.check||ew.inheritable){ev.push(cI);}if(ex===cr){ev.push(Q,name,t,ex,U);}};},__lS:function(ez,eA,eB,name){if(eB.transform){ez.push(q,eB.transform,bW);}if(eB.validate){if(typeof eB.validate===bs){ez.push(cs,eB.validate,bW);}else if(eB.validate instanceof Function){ez.push(eA.classname,bj,name);ez.push(cS);}}},__lT:function(eC,eD,eE,eF){var eG=(eF===bq||eF===bu||eF===bo);if(eD){eC.push(cn,eE,f);}else if(eG){eC.push(cn,eE,v);}},__lU:undefined,__lV:function(eH,name,eI,eJ){if(eI===cp){eH.push(cs,this.$$store.runtime[name],ct);}else if(eI===bo){eH.push(cn,this.$$store.runtime[name],bw);eH.push(cm,this.$$store.runtime[name],cv);}else if(eI===cr){eH.push(cs,this.$$store.user[name],ct);}else if(eI===bq){eH.push(cn,this.$$store.user[name],bw);eH.push(cm,this.$$store.user[name],cv);}else if(eI===cq){eH.push(cs,this.$$store.theme[name],ct);}else if(eI===bu){eH.push(cn,this.$$store.theme[name],bw);eH.push(cm,this.$$store.theme[name],cv);}else if(eI===co&&eJ){eH.push(cs,this.$$store.init[name],ct);}},__lW:function(eK,eL,name,eM,eN){if(eL.inheritable){eK.push(R,this.$$store.inherit[name],cv);}else{eK.push(bF);}eK.push(cn,this.$$store.runtime[name],bn);if(eM===cp){eK.push(cu,this.$$store.runtime[name],ct);}else if(eM===bo){eK.push(cm,this.$$store.runtime[name],cv);eK.push(cn,this.$$store.user[name],bw);eK.push(cu,this.$$store.user[name],cv);eK.push(bt,this.$$store.theme[name],bw);eK.push(cu,this.$$store.theme[name],cv);eK.push(bt,this.$$store.init[name],bn);eK.push(cu,this.$$store.init[name],cv);eK.push(cs,this.$$store.useinit[name],cA);eK.push(bv);}else{eK.push(cF,this.$$store.runtime[name],cv);if(eM===cr){eK.push(cs,this.$$store.user[name],ct);}else if(eM===bq){eK.push(cm,this.$$store.user[name],cv);}else if(eM===cq){eK.push(cs,this.$$store.theme[name],ct);}else if(eM===bu){eK.push(cm,this.$$store.theme[name],cv);}else if(eM===co&&eN){eK.push(cs,this.$$store.init[name],ct);}}eK.push(bv);eK.push(bt,this.$$store.user[name],bn);if(eM===cr){if(!eL.inheritable){eK.push(cz,this.$$store.user[name],cv);}eK.push(cu,this.$$store.user[name],ct);}else if(eM===bq){if(!eL.inheritable){eK.push(cz,this.$$store.user[name],cv);}eK.push(cm,this.$$store.user[name],cv);eK.push(cn,this.$$store.runtime[name],bw);eK.push(cu,this.$$store.runtime[name],cv);eK.push(cn,this.$$store.theme[name],bw);eK.push(cu,this.$$store.theme[name],cv);eK.push(bt,this.$$store.init[name],bn);eK.push(cu,this.$$store.init[name],cv);eK.push(cs,this.$$store.useinit[name],cA);eK.push(bv);}else{if(eM===cp){eK.push(cu,this.$$store.runtime[name],ct);}else if(eL.inheritable){eK.push(cu,this.$$store.user[name],cv);}else{eK.push(cF,this.$$store.user[name],cv);}if(eM===cq){eK.push(cs,this.$$store.theme[name],ct);}else if(eM===bu){eK.push(cm,this.$$store.theme[name],cv);}else if(eM===co&&eN){eK.push(cs,this.$$store.init[name],ct);}}eK.push(bv);if(eL.themeable){eK.push(bt,this.$$store.theme[name],bn);if(!eL.inheritable){eK.push(cz,this.$$store.theme[name],cv);}if(eM===cp){eK.push(cu,this.$$store.runtime[name],ct);}else if(eM===cr){eK.push(cu,this.$$store.user[name],ct);}else if(eM===cq){eK.push(cu,this.$$store.theme[name],ct);}else if(eM===bu){eK.push(cm,this.$$store.theme[name],cv);eK.push(cn,this.$$store.init[name],bn);eK.push(cu,this.$$store.init[name],cv);eK.push(cs,this.$$store.useinit[name],cA);eK.push(bv);}else if(eM===co){if(eN){eK.push(cs,this.$$store.init[name],ct);}eK.push(cu,this.$$store.theme[name],cv);}else if(eM===cD){eK.push(cu,this.$$store.theme[name],cv);}eK.push(bv);}eK.push(bt,this.$$store.useinit[name],E);if(!eL.inheritable){eK.push(cz,this.$$store.init[name],cv);}if(eM===co){if(eN){eK.push(cu,this.$$store.init[name],ct);}else{eK.push(cu,this.$$store.init[name],cv);}}else if(eM===cr||eM===cp||eM===cq||eM===cD){eK.push(cm,this.$$store.useinit[name],cv);if(eM===cp){eK.push(cu,this.$$store.runtime[name],ct);}else if(eM===cr){eK.push(cu,this.$$store.user[name],ct);}else if(eM===cq){eK.push(cu,this.$$store.theme[name],ct);}else if(eM===cD){eK.push(cu,this.$$store.init[name],cv);}}eK.push(bv);if(eM===cr||eM===cp||eM===cq||eM===co){eK.push(cQ);if(eM===cp){eK.push(cu,this.$$store.runtime[name],ct);}else if(eM===cr){eK.push(cu,this.$$store.user[name],ct);}else if(eM===cq){eK.push(cu,this.$$store.theme[name],ct);}else if(eM===co){if(eN){eK.push(cu,this.$$store.init[name],ct);}else{eK.push(cu,this.$$store.init[name],cv);}eK.push(cs,this.$$store.useinit[name],cA);}eK.push(bv);}},__lX:function(eO,eP,name,eQ){eO.push(C);if(eQ===cD){eO.push(V);}else{eO.push(bE,this.$$store.inherit[name],cv);}eO.push(bP);eO.push(cs,this.$$store.init[name],bG);eO.push(cs,this.$$store.init[name],bR);eO.push(cu,this.$$store.init[name],cv);eO.push(cs,this.$$store.useinit[name],cA);eO.push(bO);eO.push(cm,this.$$store.useinit[name],bc);eO.push(bv);eO.push(bY);eO.push(N);eO.push(ba,this.$$store.inherit[name],cv);eO.push(bv);eO.push(O);eO.push(cm,this.$$store.inherit[name],cv);eO.push(r,this.$$store.inherit[name],cU);eO.push(bN);if(eP.init!==undefined&&eQ!==co){eO.push(cE,this.$$store.init[name],cy);}else{eO.push(bX);}eO.push(cL);},__lY:function(eR,eS,name,eT){if(eT!==cr&&eT!==cp&&eT!==cq){eR.push(bK);}eR.push(bY);if(eS.init!==undefined&&eT!==co){eR.push(cE,this.$$store.init[name],cy);}else{eR.push(bX);}},__ma:function(eU,eV,name){if(eV.apply){eU.push(cs,eV.apply,H,name,by);}if(eV.event){eU.push(bl,be,eV.event,x,bQ,eV.event,W,y);}},__mb:function(eW,name){eW.push(cT);eW.push(cN,this.$$method.refresh[name],bg,this.$$method.refresh[name],cY);eW.push(bv);}},defer:function(eX){var fa=navigator.userAgent.indexOf(M)!=-1;var eY=navigator.userAgent.indexOf(cg)!=-1;if(fa||eY){eX.__lM=eX.__lN;}}});})();(function(){var q="[Class ",p="]",o="$$init_",n="toString",m="constructor",k="singleton",j=".prototype",h="extend",g="Class",f="destruct",c="qx.Class",e=".",d="static",b="qx.event.type.Data";qx.Bootstrap.define(c,{statics:{define:function(name,r){if(!r){var r={};}if(r.include&&!(r.include instanceof Array)){r.include=[r.include];}if(r.implement&&!(r.implement instanceof Array)){r.implement=[r.implement];}var s=false;if(!r.hasOwnProperty(h)&&!r.type){r.type=d;s=true;}{};var t=this.__bX(name,r.type,r.extend,r.statics,r.construct,r.destruct,r.include);if(r.extend){if(r.properties){this.__ca(t,r.properties,true);}if(r.members){this.__cc(t,r.members,true,true,false);}if(r.events){this.__bY(t,r.events,true);}if(r.include){for(var i=0,l=r.include.length;i<l;i++){this.__cg(t,r.include[i],false);}}}if(r.settings){for(var u in r.settings){qx.core.Setting.define(u,r.settings[u]);}}if(r.variants){for(var u in r.variants){qx.core.Variant.define(u,r.variants[u].allowedValues,r.variants[u].defaultValue);}}if(r.implement){for(var i=0,l=r.implement.length;i<l;i++){this.__ce(t,r.implement[i]);}}{};if(r.defer){r.defer.self=t;r.defer(t,t.prototype,{add:function(name,v){var w={};w[name]=v;qx.Class.__ca(t,w,true);}});}return t;},undefine:function(name){delete this.$$registry[name];var x=name.split(e);var z=[window];for(var i=0;i<x.length;i++){z.push(z[i][x[i]]);}for(var i=z.length-1;i>=1;i--){var y=z[i];var parent=z[i-1];if(qx.Bootstrap.isFunction(y)||qx.Bootstrap.objectGetLength(y)===0){delete parent[x[i-1]];}else{break;}}},isDefined:qx.Bootstrap.classIsDefined,getTotalNumber:function(){return qx.Bootstrap.objectGetLength(this.$$registry);},getByName:qx.Bootstrap.getByName,include:function(A,B){{};qx.Class.__cg(A,B,false);},patch:function(C,D){{};qx.Class.__cg(C,D,true);},isSubClassOf:function(E,F){if(!E){return false;}if(E==F){return true;}if(E.prototype instanceof F){return true;}return false;},getPropertyDefinition:qx.Bootstrap.getPropertyDefinition,getProperties:function(G){var H=[];while(G){if(G.$$properties){H.push.apply(H,qx.Bootstrap.getKeys(G.$$properties));}G=G.superclass;}return H;},getByProperty:function(I,name){while(I){if(I.$$properties&&I.$$properties[name]){return I;}I=I.superclass;}return null;},hasProperty:qx.Bootstrap.hasProperty,getEventType:qx.Bootstrap.getEventType,supportsEvent:qx.Bootstrap.supportsEvent,hasOwnMixin:function(J,K){return J.$$includes&&J.$$includes.indexOf(K)!==-1;},getByMixin:function(L,M){var N,i,l;while(L){if(L.$$includes){N=L.$$flatIncludes;for(i=0,l=N.length;i<l;i++){if(N[i]===M){return L;}}}L=L.superclass;}return null;},getMixins:qx.Bootstrap.getMixins,hasMixin:function(O,P){return !!this.getByMixin(O,P);},hasOwnInterface:function(Q,R){return Q.$$implements&&Q.$$implements.indexOf(R)!==-1;},getByInterface:qx.Bootstrap.getByInterface,getInterfaces:function(S){var T=[];while(S){if(S.$$implements){T.push.apply(T,S.$$flatImplements);}S=S.superclass;}return T;},hasInterface:qx.Bootstrap.hasInterface,implementsInterface:function(U,V){var W=U.constructor;if(this.hasInterface(W,V)){return true;}try{qx.Interface.assertObject(U,V);return true;}catch(X){}try{qx.Interface.assert(W,V,false);return true;}catch(Y){}return false;},getInstance:function(){if(!this.$$instance){this.$$allowconstruct=true;this.$$instance=new this;delete this.$$allowconstruct;}return this.$$instance;},genericToString:function(){return q+this.classname+p;},$$registry:qx.Bootstrap.$$registry,__bT:null,__bU:null,__bV:function(){},__bW:function(){},__bX:function(name,ba,bb,bc,bd,be,bf){var bi;if(!bb&&true){bi=bc||{};qx.Bootstrap.setDisplayNames(bi,name);}else{var bi={};if(bb){if(!bd){bd=this.__ch();}if(this.__cj(bb,bf)){bi=this.__ck(bd,name,ba);}else{bi=bd;}if(ba===k){bi.getInstance=this.getInstance;}qx.Bootstrap.setDisplayName(bd,name,m);}if(bc){qx.Bootstrap.setDisplayNames(bc,name);var bj;for(var i=0,a=qx.Bootstrap.getKeys(bc),l=a.length;i<l;i++){bj=a[i];var bg=bc[bj];{bi[bj]=bg;};}}}var bh=qx.Bootstrap.createNamespace(name,bi);bi.name=bi.classname=name;bi.basename=bh;bi.$$type=g;if(ba){bi.$$classtype=ba;}if(!bi.hasOwnProperty(n)){bi.toString=this.genericToString;}if(bb){qx.Bootstrap.extendClass(bi,bd,bb,name,bh);if(be){{};bi.$$destructor=be;qx.Bootstrap.setDisplayName(be,name,f);}}this.$$registry[name]=bi;return bi;},__bY:function(bk,bl,bm){var bn,bn;{};if(bk.$$events){for(var bn in bl){bk.$$events[bn]=bl[bn];}}else{bk.$$events=bl;}},__ca:function(bo,bp,bq){var br;if(bq===undefined){bq=false;}var bs=bo.prototype;for(var name in bp){br=bp[name];{};br.name=name;if(!br.refine){if(bo.$$properties===undefined){bo.$$properties={};}bo.$$properties[name]=br;}if(br.init!==undefined){bo.prototype[o+name]=br.init;}if(br.event!==undefined){var event={};event[br.event]=b;this.__bY(bo,event,bq);}if(br.inheritable){qx.core.Property.$$inheritable[name]=true;if(!bs.$$refreshInheritables){qx.core.Property.attachRefreshInheritables(bo);}}if(!br.refine){qx.core.Property.attachMethods(bo,name,br);}}},__cb:null,__cc:function(bt,bu,bv,bw,bx){var by=bt.prototype;var bA,bz;qx.Bootstrap.setDisplayNames(bu,bt.classname+j);for(var i=0,a=qx.Bootstrap.getKeys(bu),l=a.length;i<l;i++){bA=a[i];bz=bu[bA];{};if(bw!==false&&bz instanceof Function&&bz.$$type==null){if(bx==true){bz=this.__cd(bz,by[bA]);}else{if(by[bA]){bz.base=by[bA];}bz.self=bt;}{};}by[bA]=bz;}},__cd:function(bB,bC){if(bC){return function(){var bE=bB.base;bB.base=bC;var bD=bB.apply(this,arguments);bB.base=bE;return bD;};}else{return bB;}},__ce:function(bF,bG){{};var bH=qx.Interface.flatten([bG]);if(bF.$$implements){bF.$$implements.push(bG);bF.$$flatImplements.push.apply(bF.$$flatImplements,bH);}else{bF.$$implements=[bG];bF.$$flatImplements=bH;}},__cf:function(bI){var name=bI.classname;var bJ=this.__ck(bI,name,bI.$$classtype);for(var i=0,a=qx.Bootstrap.getKeys(bI),l=a.length;i<l;i++){bK=a[i];bJ[bK]=bI[bK];}bJ.prototype=bI.prototype;var bM=bI.prototype;for(var i=0,a=qx.Bootstrap.getKeys(bM),l=a.length;i<l;i++){bK=a[i];var bN=bM[bK];if(bN&&bN.self==bI){bN.self=bJ;}}for(var bK in this.$$registry){var bL=this.$$registry[bK];if(!bL){continue;}if(bL.base==bI){bL.base=bJ;}if(bL.superclass==bI){bL.superclass=bJ;}if(bL.$$original){if(bL.$$original.base==bI){bL.$$original.base=bJ;}if(bL.$$original.superclass==bI){bL.$$original.superclass=bJ;}}}qx.Bootstrap.createNamespace(name,bJ);this.$$registry[name]=bJ;return bJ;},__cg:function(bO,bP,bQ){{};if(this.hasMixin(bO,bP)){return;}var bT=bO.$$original;if(bP.$$constructor&&!bT){bO=this.__cf(bO);}var bS=qx.Mixin.flatten([bP]);var bR;for(var i=0,l=bS.length;i<l;i++){bR=bS[i];if(bR.$$events){this.__bY(bO,bR.$$events,bQ);}if(bR.$$properties){this.__ca(bO,bR.$$properties,bQ);}if(bR.$$members){this.__cc(bO,bR.$$members,bQ,bQ,bQ);}}if(bO.$$includes){bO.$$includes.push(bP);bO.$$flatIncludes.push.apply(bO.$$flatIncludes,bS);}else{bO.$$includes=[bP];bO.$$flatIncludes=bS;}},__ch:function(){function bU(){bU.base.apply(this,arguments);}return bU;},__ci:function(){return function(){};},__cj:function(bV,bW){{};if(bV&&bV.$$includes){var bX=bV.$$flatIncludes;for(var i=0,l=bX.length;i<l;i++){if(bX[i].$$constructor){return true;}}}if(bW){var bY=qx.Mixin.flatten(bW);for(var i=0,l=bY.length;i<l;i++){if(bY[i].$$constructor){return true;}}}return false;},__ck:function(ca,name,cb){var cc;var cd=function(){var cg=cd;{};var cf=cg.$$original.apply(this,arguments);if(cg.$$includes){var ce=cg.$$flatIncludes;for(var i=0,l=ce.length;i<l;i++){if(ce[i].$$constructor){ce[i].$$constructor.apply(this,arguments);}}}{};return cf;};{};cd.$$original=ca;ca.wrapper=cd;return cd;}},defer:function(){var ch,ci,cj;{};}});})();(function(){var s="gecko",r="1.9.0.0",q=".",p="[object Opera]",o="function",n="[^\\.0-9]",m="525.26",l="",k="mshtml",j="AppleWebKit/",d="unknown",i="9.6.0",g="4.0",c="Gecko",b="opera",f="webkit",e="0.0.0",h="8.0",a="qx.bom.client.Engine";qx.Bootstrap.define(a,{statics:{NAME:"",FULLVERSION:"0.0.0",VERSION:0.0,OPERA:false,WEBKIT:false,GECKO:false,MSHTML:false,UNKNOWN_ENGINE:false,UNKNOWN_VERSION:false,DOCUMENT_MODE:null,__et:function(){var t=d;var x=e;var w=window.navigator.userAgent;var z=false;var v=false;if(window.opera&&Object.prototype.toString.call(window.opera)==p){t=b;this.OPERA=true;if(/Opera[\s\/]([0-9]+)\.([0-9])([0-9]*)/.test(w)){x=RegExp.$1+q+RegExp.$2;if(RegExp.$3!=l){x+=q+RegExp.$3;}}else{v=true;x=i;}}else if(window.navigator.userAgent.indexOf(j)!=-1){t=f;this.WEBKIT=true;if(/AppleWebKit\/([^ ]+)/.test(w)){x=RegExp.$1;var y=RegExp(n).exec(x);if(y){x=x.slice(0,y.index);}}else{v=true;x=m;}}else if(window.controllers&&window.navigator.product===c){t=s;this.GECKO=true;if(/rv\:([^\);]+)(\)|;)/.test(w)){x=RegExp.$1;}else{v=true;x=r;}}else if(window.navigator.cpuClass&&/MSIE\s+([^\);]+)(\)|;)/.test(w)){t=k;x=RegExp.$1;if(document.documentMode){this.DOCUMENT_MODE=document.documentMode;}if(x<8&&/Trident\/([^\);]+)(\)|;)/.test(w)){if(RegExp.$1===g){x=h;}}this.MSHTML=true;}else{var u=window.qxFail;if(u&&typeof u===o){var t=u();if(t.NAME&&t.FULLVERSION){t=t.NAME;this[t.toUpperCase()]=true;x=t.FULLVERSION;}}else{z=true;v=true;x=r;t=s;this.GECKO=true;qx.Bootstrap.warn("Unsupported client: "+w+"! Assumed gecko version 1.9.0.0 (Firefox 3.0).");}}this.UNKNOWN_ENGINE=z;this.UNKNOWN_VERSION=v;this.NAME=t;this.FULLVERSION=x;this.VERSION=parseFloat(x);}},defer:function(A){A.__et();}});})();(function(){var x="off",w="on",u="|",t="default",s="object",r="&",q="qx.aspects",p="qx.mobile.nativescroll",o="qx.mobile.emulatetouch",n="$",e="qx.allowUrlVariants",m="qx.debug",h="qx.client",c="qx.dynlocale",b="webkit",g="qxvariant",f="opera",j=":",a="qx.core.Variant",k="mshtml",d="gecko";qx.Bootstrap.define(a,{statics:{__kX:{},__kY:{},compilerIsSet:function(){return true;},define:function(y,z,A){{};if(!this.__kX[y]){this.__kX[y]={};}else{}this.__kX[y].allowedValues=z;this.__kX[y].defaultValue=A;},get:function(B){var C=this.__kX[B];{};if(C.value!==undefined){return C.value;}return C.defaultValue;},__la:function(){if(window.qxvariants){for(var D in qxvariants){{};if(!this.__kX[D]){this.__kX[D]={};}this.__kX[D].value=qxvariants[D];}window.qxvariants=undefined;try{delete window.qxvariants;}catch(E){}this.__lb(this.__kX);}},__lb:function(){if(qx.core.Setting.get(e)!=true){return;}var F=document.location.search.slice(1).split(r);for(var i=0;i<F.length;i++){var G=F[i].split(j);if(G.length!=3||G[0]!=g){continue;}var H=G[1];if(!this.__kX[H]){this.__kX[H]={};}this.__kX[H].value=decodeURIComponent(G[2]);}},select:function(I,J){{};for(var K in J){if(this.isSet(I,K)){return J[K];}}if(J[t]!==undefined){return J[t];}{};},isSet:function(L,M){var N=L+n+M;if(this.__kY[N]!==undefined){return this.__kY[N];}var P=false;if(M.indexOf(u)<0){P=this.get(L)===M;}else{var O=M.split(u);for(var i=0,l=O.length;i<l;i++){if(this.get(L)===O[i]){P=true;break;}}}this.__kY[N]=P;return P;},__lc:function(v){return typeof v===s&&v!==null&&v instanceof Array;},__ld:function(v){return typeof v===s&&v!==null&&!(v instanceof Array);},__le:function(Q,R){for(var i=0,l=Q.length;i<l;i++){if(Q[i]==R){return true;}}return false;}},defer:function(S){S.define(h,[d,k,f,b],qx.bom.client.Engine.NAME);S.define(m,[w,x],w);S.define(q,[w,x],x);S.define(c,[w,x],w);S.define(o,[w,x],x);S.define(p,[w,x],x);S.__la();}});})();(function(){var d="qx.dom.Node",c="qx.client",b="";qx.Class.define(d,{statics:{ELEMENT:1,ATTRIBUTE:2,TEXT:3,CDATA_SECTION:4,ENTITY_REFERENCE:5,ENTITY:6,PROCESSING_INSTRUCTION:7,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,NOTATION:12,getDocument:function(e){return e.nodeType===this.DOCUMENT?e:e.ownerDocument||e.document;},getWindow:qx.core.Variant.select(c,{"mshtml":function(f){if(f.nodeType==null){return f;}if(f.nodeType!==this.DOCUMENT){f=f.ownerDocument;}return f.parentWindow;},"default":function(g){if(g.nodeType==null){return g;}if(g.nodeType!==this.DOCUMENT){g=g.ownerDocument;}return g.defaultView;}}),getDocumentElement:function(h){return this.getDocument(h).documentElement;},getBodyElement:function(j){return this.getDocument(j).body;},isNode:function(k){return !!(k&&k.nodeType!=null);},isElement:function(l){return !!(l&&l.nodeType===this.ELEMENT);},isDocument:function(m){return !!(m&&m.nodeType===this.DOCUMENT);},isText:function(n){return !!(n&&n.nodeType===this.TEXT);},isWindow:function(o){return !!(o&&o.history&&o.location&&o.document);},isNodeName:function(p,q){if(!q||!p||!p.nodeName){return false;}return q.toLowerCase()==qx.dom.Node.getName(p);},getName:function(r){if(!r||!r.nodeName){return null;}return r.nodeName.toLowerCase();},getText:function(s){if(!s||!s.nodeType){return null;}switch(s.nodeType){case 1:var i,a=[],t=s.childNodes,length=t.length;for(i=0;i<length;i++){a[i]=this.getText(t[i]);}return a.join(b);case 2:return s.nodeValue;break;case 3:return s.nodeValue;break;}return null;},isBlockNode:function(u){if(!qx.dom.Node.isElement(u)){return false;}u=qx.dom.Node.getName(u);return /^(body|form|textarea|fieldset|ul|ol|dl|dt|dd|li|div|hr|p|h[1-6]|quote|pre|table|thead|tbody|tfoot|tr|td|th|iframe|address|blockquote)$/.test(u);}}});})();(function(){var j="on",i="qx.client",h="gecko",g="function",f="HTMLEvents",d="mousedown",c="qx.bom.Event",b="return;",a="mouseover";qx.Class.define(c,{statics:{addNativeListener:function(k,l,m,n){if(k.addEventListener){k.addEventListener(l,m,!!n);}else if(k.attachEvent){k.attachEvent(j+l,m);}},removeNativeListener:function(o,p,q,r){if(o.removeEventListener){o.removeEventListener(p,q,!!r);}else if(o.detachEvent){try{o.detachEvent(j+p,q);}catch(e){if(e.number!==-2146828218){throw e;}}}},getTarget:function(e){return e.target||e.srcElement;},getRelatedTarget:function(e){if(e.relatedTarget!==undefined){if(qx.core.Variant.isSet(i,h)){try{e.relatedTarget&&e.relatedTarget.nodeType;}catch(e){return null;}}return e.relatedTarget;}else if(e.fromElement!==undefined&&e.type===a){return e.fromElement;}else if(e.toElement!==undefined){return e.toElement;}else{return null;}},preventDefault:function(e){if(e.preventDefault){if(qx.core.Variant.isSet(i,h)&&qx.bom.client.Engine.VERSION>=1.9&&e.type==d&&e.button==2){return;}e.preventDefault();if(qx.core.Variant.isSet(i,h)&&qx.bom.client.Engine.VERSION<1.9){try{e.keyCode=0;}catch(s){}}}else{try{e.keyCode=0;}catch(t){}e.returnValue=false;}},stopPropagation:function(e){if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}},fire:function(u,v){if(document.createEvent){var w=document.createEvent(f);w.initEvent(v,true,true);return !u.dispatchEvent(w);}else{var w=document.createEventObject();return u.fireEvent(j+v,w);}},supportsEvent:qx.core.Variant.select(i,{"webkit":function(x,y){return x.hasOwnProperty(j+y);},"default":function(z,A){var B=j+A;var C=(B in z);if(!C){C=typeof z[B]==g;if(!C&&z.setAttribute){z.setAttribute(B,b);C=typeof z[B]==g;z.removeAttribute(B);}}return C;}})}});})();(function(){var r="|bubble",q="|capture",p="|",o="",n="_",m="unload",k="UNKNOWN_",j="__fs",h="c",g="DOM_",c="__ft",f="WIN_",e="QX_",b="qx.event.Manager",a="capture",d="DOCUMENT_";qx.Class.define(b,{extend:Object,construct:function(s,t){this.__fo=s;this.__fp=qx.core.ObjectRegistry.toHashCode(s);this.__fq=t;if(s.qx!==qx){var self=this;qx.bom.Event.addNativeListener(s,m,qx.event.GlobalError.observeMethod(function(){qx.bom.Event.removeNativeListener(s,m,arguments.callee);self.dispose();}));}this.__fr={};this.__fs={};this.__ft={};this.__fu={};},statics:{__fv:0,getNextUniqueId:function(){return (this.__fv++)+o;}},members:{__fq:null,__fr:null,__ft:null,__fw:null,__fs:null,__fu:null,__fo:null,__fp:null,getWindow:function(){return this.__fo;},getWindowId:function(){return this.__fp;},getHandler:function(u){var v=this.__fs[u.classname];if(v){return v;}return this.__fs[u.classname]=new u(this);},getDispatcher:function(w){var x=this.__ft[w.classname];if(x){return x;}return this.__ft[w.classname]=new w(this,this.__fq);},getListeners:function(y,z,A){var B=y.$$hash||qx.core.ObjectRegistry.toHashCode(y);var D=this.__fr[B];if(!D){return null;}var E=z+(A?q:r);var C=D[E];return C?C.concat():null;},serializeListeners:function(F){var M=F.$$hash||qx.core.ObjectRegistry.toHashCode(F);var O=this.__fr[M];var K=[];if(O){var I,N,G,J,L;for(var H in O){I=H.indexOf(p);N=H.substring(0,I);G=H.charAt(I+1)==h;J=O[H];for(var i=0,l=J.length;i<l;i++){L=J[i];K.push({self:L.context,handler:L.handler,type:N,capture:G});}}}return K;},toggleAttachedEvents:function(P,Q){var V=P.$$hash||qx.core.ObjectRegistry.toHashCode(P);var X=this.__fr[V];if(X){var S,W,R,T;for(var U in X){S=U.indexOf(p);W=U.substring(0,S);R=U.charCodeAt(S+1)===99;T=X[U];if(Q){this.__fx(P,W,R);}else{this.__fy(P,W,R);}}}},hasListener:function(Y,ba,bb){{};var bc=Y.$$hash||qx.core.ObjectRegistry.toHashCode(Y);var be=this.__fr[bc];if(!be){return false;}var bf=ba+(bb?q:r);var bd=be[bf];return bd&&bd.length>0;},importListeners:function(bg,bh){{};var bn=bg.$$hash||qx.core.ObjectRegistry.toHashCode(bg);var bo=this.__fr[bn]={};var bk=qx.event.Manager;for(var bi in bh){var bl=bh[bi];var bm=bl.type+(bl.capture?q:r);var bj=bo[bm];if(!bj){bj=bo[bm]=[];this.__fx(bg,bl.type,bl.capture);}bj.push({handler:bl.listener,context:bl.self,unique:bl.unique||(bk.__fv++)+o});}},addListener:function(bp,bq,br,self,bs){var bw;{};var bx=bp.$$hash||qx.core.ObjectRegistry.toHashCode(bp);var bz=this.__fr[bx];if(!bz){bz=this.__fr[bx]={};}var bv=bq+(bs?q:r);var bu=bz[bv];if(!bu){bu=bz[bv]=[];}if(bu.length===0){this.__fx(bp,bq,bs);}var by=(qx.event.Manager.__fv++)+o;var bt={handler:br,context:self,unique:by};bu.push(bt);return bv+p+by;},findHandler:function(bA,bB){var bN=false,bF=false,bO=false,bC=false;var bL;if(bA.nodeType===1){bN=true;bL=g+bA.tagName.toLowerCase()+n+bB;}else if(bA.nodeType===9){bC=true;bL=d+bB;}else if(bA==this.__fo){bF=true;bL=f+bB;}else if(bA.classname){bO=true;bL=e+bA.classname+n+bB;}else{bL=k+bA+n+bB;}var bH=this.__fu;if(bH[bL]){return bH[bL];}var bK=this.__fq.getHandlers();var bG=qx.event.IEventHandler;var bI,bJ,bE,bD;for(var i=0,l=bK.length;i<l;i++){bI=bK[i];bE=bI.SUPPORTED_TYPES;if(bE&&!bE[bB]){continue;}bD=bI.TARGET_CHECK;if(bD){var bM=false;if(bN&&((bD&bG.TARGET_DOMNODE)!=0)){bM=true;}else if(bF&&((bD&bG.TARGET_WINDOW)!=0)){bM=true;}else if(bO&&((bD&bG.TARGET_OBJECT)!=0)){bM=true;}else if(bC&&((bD&bG.TARGET_DOCUMENT)!=0)){bM=true;}if(!bM){continue;}}bJ=this.getHandler(bK[i]);if(bI.IGNORE_CAN_HANDLE||bJ.canHandleEvent(bA,bB)){bH[bL]=bJ;return bJ;}}return null;},__fx:function(bP,bQ,bR){var bS=this.findHandler(bP,bQ);if(bS){bS.registerEvent(bP,bQ,bR);return;}{};},removeListener:function(bT,bU,bV,self,bW){var cb;{};var cc=bT.$$hash||qx.core.ObjectRegistry.toHashCode(bT);var cd=this.__fr[cc];if(!cd){return false;}var bX=bU+(bW?q:r);var bY=cd[bX];if(!bY){return false;}var ca;for(var i=0,l=bY.length;i<l;i++){ca=bY[i];if(ca.handler===bV&&ca.context===self){qx.lang.Array.removeAt(bY,i);if(bY.length==0){this.__fy(bT,bU,bW);}return true;}}return false;},removeListenerById:function(ce,cf){var cl;{};var cj=cf.split(p);var co=cj[0];var cg=cj[1].charCodeAt(0)==99;var cn=cj[2];var cm=ce.$$hash||qx.core.ObjectRegistry.toHashCode(ce);var cp=this.__fr[cm];if(!cp){return false;}var ck=co+(cg?q:r);var ci=cp[ck];if(!ci){return false;}var ch;for(var i=0,l=ci.length;i<l;i++){ch=ci[i];if(ch.unique===cn){qx.lang.Array.removeAt(ci,i);if(ci.length==0){this.__fy(ce,co,cg);}return true;}}return false;},removeAllListeners:function(cq){var cu=cq.$$hash||qx.core.ObjectRegistry.toHashCode(cq);var cw=this.__fr[cu];if(!cw){return false;}var cs,cv,cr;for(var ct in cw){if(cw[ct].length>0){cs=ct.split(p);cv=cs[0];cr=cs[1]===a;this.__fy(cq,cv,cr);}}delete this.__fr[cu];return true;},deleteAllListeners:function(cx){delete this.__fr[cx];},__fy:function(cy,cz,cA){var cB=this.findHandler(cy,cz);if(cB){cB.unregisterEvent(cy,cz,cA);return;}{};},dispatchEvent:function(cC,event){var cH;{};var cI=event.getType();if(!event.getBubbles()&&!this.hasListener(cC,cI)){qx.event.Pool.getInstance().poolObject(event);return true;}if(!event.getTarget()){event.setTarget(cC);}var cG=this.__fq.getDispatchers();var cF;var cE=false;for(var i=0,l=cG.length;i<l;i++){cF=this.getDispatcher(cG[i]);if(cF.canDispatchEvent(cC,event,cI)){cF.dispatchEvent(cC,event,cI);cE=true;break;}}if(!cE){{};return true;}var cD=event.getDefaultPrevented();qx.event.Pool.getInstance().poolObject(event);return !cD;},dispose:function(){this.__fq.removeManager(this);qx.util.DisposeUtil.disposeMap(this,j);qx.util.DisposeUtil.disposeMap(this,c);this.__fr=this.__fo=this.__fw=null;this.__fq=this.__fu=null;}}});})();(function(){var g="mshtml",f="qx.client",e="[object Array]",d="qx.lang.Array",c="qx",b="number",a="string";qx.Class.define(d,{statics:{toArray:function(h,j){return this.cast(h,Array,j);},cast:function(k,m,n){if(k.constructor===m){return k;}if(qx.Class.hasInterface(k,qx.data.IListData)){var k=k.toArray();}var o=new m;if(qx.core.Variant.isSet(f,g)){if(k.item){for(var i=n||0,l=k.length;i<l;i++){o.push(k[i]);}return o;}}if(Object.prototype.toString.call(k)===e&&n==null){o.push.apply(o,k);}else{o.push.apply(o,Array.prototype.slice.call(k,n||0));}return o;},fromArguments:function(p,q){return Array.prototype.slice.call(p,q||0);},fromCollection:function(r){if(qx.core.Variant.isSet(f,g)){if(r.item){var s=[];for(var i=0,l=r.length;i<l;i++){s[i]=r[i];}return s;}}return Array.prototype.slice.call(r,0);},fromShortHand:function(t){var v=t.length;var u=qx.lang.Array.clone(t);switch(v){case 1:u[1]=u[2]=u[3]=u[0];break;case 2:u[2]=u[0];case 3:u[3]=u[1];}return u;},clone:function(w){return w.concat();},insertAt:function(x,y,i){x.splice(i,0,y);return x;},insertBefore:function(z,A,B){var i=z.indexOf(B);if(i==-1){z.push(A);}else{z.splice(i,0,A);}return z;},insertAfter:function(C,D,E){var i=C.indexOf(E);if(i==-1||i==(C.length-1)){C.push(D);}else{C.splice(i+1,0,D);}return C;},removeAt:function(F,i){return F.splice(i,1)[0];},removeAll:function(G){G.length=0;return this;},append:function(H,I){{};Array.prototype.push.apply(H,I);return H;},exclude:function(J,K){{};for(var i=0,M=K.length,L;i<M;i++){L=J.indexOf(K[i]);if(L!=-1){J.splice(L,1);}}return J;},remove:function(N,O){var i=N.indexOf(O);if(i!=-1){N.splice(i,1);return O;}},contains:function(P,Q){return P.indexOf(Q)!==-1;},equals:function(R,S){var length=R.length;if(length!==S.length){return false;}for(var i=0;i<length;i++){if(R[i]!==S[i]){return false;}}return true;},sum:function(T){var U=0;for(var i=0,l=T.length;i<l;i++){U+=T[i];}return U;},max:function(V){{};var i,X=V.length,W=V[0];for(i=1;i<X;i++){if(V[i]>W){W=V[i];}}return W===undefined?null:W;},min:function(Y){{};var i,bb=Y.length,ba=Y[0];for(i=1;i<bb;i++){if(Y[i]<ba){ba=Y[i];}}return ba===undefined?null:ba;},unique:function(bc){var bm=[],be={},bh={},bj={};var bi,bd=0;var bn=c+qx.lang.Date.now();var bf=false,bl=false,bo=false;for(var i=0,bk=bc.length;i<bk;i++){bi=bc[i];if(bi===null){if(!bf){bf=true;bm.push(bi);}}else if(bi===undefined){}else if(bi===false){if(!bl){bl=true;bm.push(bi);}}else if(bi===true){if(!bo){bo=true;bm.push(bi);}}else if(typeof bi===a){if(!be[bi]){be[bi]=1;bm.push(bi);}}else if(typeof bi===b){if(!bh[bi]){bh[bi]=1;bm.push(bi);}}else{bg=bi[bn];if(bg==null){bg=bi[bn]=bd++;}if(!bj[bg]){bj[bg]=bi;bm.push(bi);}}}for(var bg in bj){try{delete bj[bg][bn];}catch(bp){try{bj[bg][bn]=null;}catch(bq){throw new Error("Cannot clean-up map entry doneObjects["+bg+"]["+bn+"]");}}}return bm;}}});})();(function(){var f="()",e=".",d=".prototype.",c='anonymous()',b="qx.lang.Function",a=".constructor()";qx.Class.define(b,{statics:{getCaller:function(g){return g.caller?g.caller.callee:g.callee.caller;},getName:function(h){if(h.displayName){return h.displayName;}if(h.$$original||h.wrapper||h.classname){return h.classname+a;}if(h.$$mixin){for(var j in h.$$mixin.$$members){if(h.$$mixin.$$members[j]==h){return h.$$mixin.name+d+j+f;}}for(var j in h.$$mixin){if(h.$$mixin[j]==h){return h.$$mixin.name+e+j+f;}}}if(h.self){var k=h.self.constructor;if(k){for(var j in k.prototype){if(k.prototype[j]==h){return k.classname+d+j+f;}}for(var j in k){if(k[j]==h){return k.classname+e+j+f;}}}}var i=h.toString().match(/function\s*(\w*)\s*\(.*/);if(i&&i.length>=1&&i[1]){return i[1]+f;}return c;},globalEval:function(l){if(window.execScript){return window.execScript(l);}else{return eval.call(window,l);}},empty:function(){},returnTrue:function(){return true;},returnFalse:function(){return false;},returnNull:function(){return null;},returnThis:function(){return this;},returnZero:function(){return 0;},create:function(m,n){{};if(!n){return m;}if(!(n.self||n.args||n.delay!=null||n.periodical!=null||n.attempt)){return m;}return function(event){{};var p=qx.lang.Array.fromArguments(arguments);if(n.args){p=n.args.concat(p);}if(n.delay||n.periodical){var o=qx.event.GlobalError.observeMethod(function(){return m.apply(n.self||this,p);});if(n.delay){return window.setTimeout(o,n.delay);}if(n.periodical){return window.setInterval(o,n.periodical);}}else if(n.attempt){var q=false;try{q=m.apply(n.self||this,p);}catch(r){}return q;}else{return m.apply(n.self||this,p);}};},bind:function(s,self,t){return this.create(s,{self:self,args:arguments.length>2?qx.lang.Array.fromArguments(arguments,2):null});},curry:function(u,v){return this.create(u,{args:arguments.length>1?qx.lang.Array.fromArguments(arguments,1):null});},listener:function(w,self,x){if(arguments.length<3){return function(event){return w.call(self||this,event||window.event);};}else{var y=qx.lang.Array.fromArguments(arguments,2);return function(event){var z=[event||window.event];z.push.apply(z,y);w.apply(self||this,z);};}},attempt:function(A,self,B){return this.create(A,{self:self,attempt:true,args:arguments.length>2?qx.lang.Array.fromArguments(arguments,2):null})();},delay:function(C,D,self,E){return this.create(C,{delay:D,self:self,args:arguments.length>3?qx.lang.Array.fromArguments(arguments,3):null})();},periodical:function(F,G,self,H){return this.create(F,{periodical:G,self:self,args:arguments.length>3?qx.lang.Array.fromArguments(arguments,3):null})();}}});})();(function(){var c="qx.event.Registration";qx.Class.define(c,{statics:{__fc:{},getManager:function(d){if(d==null){{};d=window;}else if(d.nodeType){d=qx.dom.Node.getWindow(d);}else if(!qx.dom.Node.isWindow(d)){d=window;}var f=d.$$hash||qx.core.ObjectRegistry.toHashCode(d);var e=this.__fc[f];if(!e){e=new qx.event.Manager(d,this);this.__fc[f]=e;}return e;},removeManager:function(g){var h=g.getWindowId();delete this.__fc[h];},addListener:function(i,j,k,self,l){return this.getManager(i).addListener(i,j,k,self,l);},removeListener:function(m,n,o,self,p){return this.getManager(m).removeListener(m,n,o,self,p);},removeListenerById:function(q,r){return this.getManager(q).removeListenerById(q,r);},removeAllListeners:function(s){return this.getManager(s).removeAllListeners(s);},deleteAllListeners:function(t){var u=t.$$hash;if(u){this.getManager(t).deleteAllListeners(u);}},hasListener:function(v,w,x){return this.getManager(v).hasListener(v,w,x);},serializeListeners:function(y){return this.getManager(y).serializeListeners(y);},createEvent:function(z,A,B){{};if(A==null){A=qx.event.type.Event;}var C=qx.event.Pool.getInstance().getObject(A);B?C.init.apply(C,B):C.init();if(z){C.setType(z);}return C;},dispatchEvent:function(D,event){return this.getManager(D).dispatchEvent(D,event);},fireEvent:function(E,F,G,H){var I;{};var J=this.createEvent(F,G||null,H);return this.getManager(E).dispatchEvent(E,J);},fireNonBubblingEvent:function(K,L,M,N){{};var O=this.getManager(K);if(!O.hasListener(K,L,false)){return true;}var P=this.createEvent(L,M||null,N);return O.dispatchEvent(K,P);},PRIORITY_FIRST:-32000,PRIORITY_NORMAL:0,PRIORITY_LAST:32000,__fd:[],addHandler:function(Q){{};this.__fd.push(Q);this.__fd.sort(function(a,b){return a.PRIORITY-b.PRIORITY;});},getHandlers:function(){return this.__fd;},__fe:[],addDispatcher:function(R,S){{};this.__fe.push(R);this.__fe.sort(function(a,b){return a.PRIORITY-b.PRIORITY;});},getDispatchers:function(){return this.__fe;}}});})();(function(){var e="$$hash",d="",c="qx.core.ObjectRegistry";qx.Class.define(c,{statics:{inShutDown:false,__cM:{},__cN:0,__cO:[],register:function(f){var j=this.__cM;if(!j){return;}var h=f.$$hash;if(h==null){var g=this.__cO;if(g.length>0){h=g.pop();}else{h=(this.__cN++)+d;}f.$$hash=h;}{};j[h]=f;},unregister:function(k){var m=k.$$hash;if(m==null){return;}var n=this.__cM;if(n&&n[m]){delete n[m];this.__cO.push(m);}try{delete k.$$hash;}catch(o){if(k.removeAttribute){k.removeAttribute(e);}}},toHashCode:function(p){{};var r=p.$$hash;if(r!=null){return r;}var q=this.__cO;if(q.length>0){r=q.pop();}else{r=(this.__cN++)+d;}return p.$$hash=r;},clearHashCode:function(s){{};var t=s.$$hash;if(t!=null){this.__cO.push(t);try{delete s.$$hash;}catch(u){if(s.removeAttribute){s.removeAttribute(e);}}}},fromHashCode:function(v){return this.__cM[v]||null;},shutdown:function(){this.inShutDown=true;var x=this.__cM;var z=[];for(var y in x){z.push(y);}z.sort(function(a,b){return parseInt(b,10)-parseInt(a,10);});var w,i=0,l=z.length;while(true){try{for(;i<l;i++){y=z[i];w=x[y];if(w&&w.dispose){w.dispose();}}}catch(A){qx.Bootstrap.error(this,"Could not dispose object "+w.toString()+": "+A);if(i!==l){i++;continue;}}break;}qx.Bootstrap.debug(this,"Disposed "+l+" objects");delete this.__cM;},getRegistry:function(){return this.__cM;}}});})();(function(){var a="qx.data.MBinding";qx.Mixin.define(a,{members:{bind:function(b,c,d,e){return qx.data.SingleValueBinding.bind(this,b,c,d,e);},removeBinding:function(f){qx.data.SingleValueBinding.removeBindingFromObject(this,f);},removeAllBindings:function(){qx.data.SingleValueBinding.removeAllBindingsForObject(this);},getBindings:function(){return qx.data.SingleValueBinding.getAllBindingsForObject(this);}}});})();(function(){var a="qx.lang.RingBuffer";qx.Class.define(a,{extend:Object,construct:function(b){this.setMaxEntries(b||50);},members:{__iq:0,__ir:0,__is:false,__it:0,__iu:null,__iv:null,setMaxEntries:function(c){this.__iv=c;this.clear();},getMaxEntries:function(){return this.__iv;},addEntry:function(d){this.__iu[this.__iq]=d;this.__iq=this.__iw(this.__iq,1);var e=this.getMaxEntries();if(this.__ir<e){this.__ir++;}if(this.__is&&(this.__it<e)){this.__it++;}},mark:function(){this.__is=true;this.__it=0;},clearMark:function(){this.__is=false;},getAllEntries:function(){return this.getEntries(this.getMaxEntries(),false);},getEntries:function(f,g){if(f>this.__ir){f=this.__ir;}if(g&&this.__is&&(f>this.__it)){f=this.__it;}if(f>0){var i=this.__iw(this.__iq,-1);var h=this.__iw(i,-f+1);var j;if(h<=i){j=this.__iu.slice(h,i+1);}else{j=this.__iu.slice(h,this.__ir).concat(this.__iu.slice(0,i+1));}}else{j=[];}return j;},clear:function(){this.__iu=new Array(this.getMaxEntries());this.__ir=0;this.__it=0;this.__iq=0;},__iw:function(k,l){var m=this.getMaxEntries();var n=(k+l)%m;if(n<0){n+=m;}return n;}}});})();(function(){var a="qx.log.appender.RingBuffer";qx.Class.define(a,{extend:qx.lang.RingBuffer,construct:function(b){this.setMaxMessages(b||50);},members:{setMaxMessages:function(c){this.setMaxEntries(c);},getMaxMessages:function(){return this.getMaxEntries();},process:function(d){this.addEntry(d);},getAllLogEvents:function(){return this.getAllEntries();},retrieveLogEvents:function(e,f){return this.getEntries(e,f);},clearHistory:function(){this.clear();}}});})();(function(){var j=":",h="qx.client",g="anonymous",f="...",e="qx.dev.StackTrace",d="",c="\n",b="/source/class/",a=".";qx.Class.define(e,{statics:{getStackTrace:qx.core.Variant.select(h,{"gecko":function(){try{throw new Error();}catch(x){var r=this.getStackTraceFromError(x);qx.lang.Array.removeAt(r,0);var p=this.getStackTraceFromCaller(arguments);var n=p.length>r.length?p:r;for(var i=0;i<Math.min(p.length,r.length);i++){var o=p[i];if(o.indexOf(g)>=0){continue;}var v=o.split(j);if(v.length!=2){continue;}var t=v[0];var m=v[1];var l=r[i];var w=l.split(j);var s=w[0];var k=w[1];if(qx.Class.getByName(s)){var q=s;}else{q=t;}var u=q+j;if(m){u+=m+j;}u+=k;n[i]=u;}return n;}},"mshtml|webkit":function(){return this.getStackTraceFromCaller(arguments);},"opera":function(){var y;try{y.bar();}catch(A){var z=this.getStackTraceFromError(A);qx.lang.Array.removeAt(z,0);return z;}return [];}}),getStackTraceFromCaller:qx.core.Variant.select(h,{"opera":function(B){return [];},"default":function(C){var H=[];var G=qx.lang.Function.getCaller(C);var D={};while(G){var E=qx.lang.Function.getName(G);H.push(E);try{G=G.caller;}catch(I){break;}if(!G){break;}var F=qx.core.ObjectRegistry.toHashCode(G);if(D[F]){H.push(f);break;}D[F]=G;}return H;}}),getStackTraceFromError:qx.core.Variant.select(h,{"gecko":function(J){if(!J.stack){return [];}var P=/@(.+):(\d+)$/gm;var K;var L=[];while((K=P.exec(J.stack))!=null){var M=K[1];var O=K[2];var N=this.__kR(M);L.push(N+j+O);}return L;},"webkit":function(Q){if(Q.sourceURL&&Q.line){return [this.__kR(Q.sourceURL)+j+Q.line];}else{return [];}},"opera":function(R){if(R.message.indexOf("Backtrace:")<0){return [];}var T=[];var U=qx.lang.String.trim(R.message.split("Backtrace:")[1]);var V=U.split(c);for(var i=0;i<V.length;i++){var S=V[i].match(/\s*Line ([0-9]+) of.* (\S.*)/);if(S&&S.length>=2){var X=S[1];var W=this.__kR(S[2]);T.push(W+j+X);}}return T;},"default":function(){return [];}}),__kR:function(Y){var bc=b;var ba=Y.indexOf(bc);var bb=(ba==-1)?Y:Y.substring(ba+bc.length).replace(/\//g,a).replace(/\.js$/,d);return bb;}}});})();(function(){var k="",j="g",h="0",g='\\$1',f="%",e='-',d="qx.lang.String",c=' ',b='\n',a="undefined";qx.Class.define(d,{statics:{camelCase:function(l){return l.replace(/\-([a-z])/g,function(m,n){return n.toUpperCase();});},hyphenate:function(o){return o.replace(/[A-Z]/g,function(p){return (e+p.charAt(0).toLowerCase());});},capitalize:function(q){return q.replace(/\b[a-z]/g,function(r){return r.toUpperCase();});},clean:function(s){return this.trim(s.replace(/\s+/g,c));},trimLeft:function(t){return t.replace(/^\s+/,k);},trimRight:function(u){return u.replace(/\s+$/,k);},trim:function(v){return v.replace(/^\s+|\s+$/g,k);},startsWith:function(w,x){return w.indexOf(x)===0;},endsWith:function(y,z){return y.substring(y.length-z.length,y.length)===z;},repeat:function(A,B){return A.length>0?new Array(B+1).join(A):k;},pad:function(C,length,D){var E=length-C.length;if(E>0){if(typeof D===a){D=h;}return this.repeat(D,E)+C;}else{return C;}},firstUp:qx.Bootstrap.firstUp,firstLow:qx.Bootstrap.firstLow,contains:function(F,G){return F.indexOf(G)!=-1;},format:function(H,I){var J=H;for(var i=0;i<I.length;i++){J=J.replace(new RegExp(f+(i+1),j),I[i]+k);}return J;},escapeRegexpChars:function(K){return K.replace(/([.*+?^${}()|[\]\/\\])/g,g);},toArray:function(L){return L.split(/\B|\b/g);},stripTags:function(M){return M.replace(/<\/?[^>]+>/gi,k);},stripScripts:function(N,O){var Q=k;var P=N.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){Q+=arguments[1]+b;return k;});if(O===true){qx.lang.Function.globalEval(Q);}return P;}}});})();(function(){var k="node",j="error",h="...(+",g="array",f=")",e="info",d="instance",c="string",b="null",a="class",H="number",G="stringify",F="]",E="date",D="unknown",C="function",B="boolean",A="debug",z="map",y="undefined",s="qx.log.Logger",t="[",q="#",r="warn",o="document",p="{...(",m="text[",n="[...(",u="\n",v=")}",x=")]",w="object";qx.Class.define(s,{statics:{__ff:A,setLevel:function(I){this.__ff=I;},getLevel:function(){return this.__ff;},setTreshold:function(J){this.__fi.setMaxMessages(J);},getTreshold:function(){return this.__fi.getMaxMessages();},__fg:{},__fh:0,register:function(K){if(K.$$id){return;}var M=this.__fh++;this.__fg[M]=K;K.$$id=M;var L=this.__fj;var N=this.__fi.getAllLogEvents();for(var i=0,l=N.length;i<l;i++){if(L[N[i].level]>=L[this.__ff]){K.process(N[i]);}}},unregister:function(O){var P=O.$$id;if(P==null){return;}delete this.__fg[P];delete O.$$id;},debug:function(Q,R){qx.log.Logger.__fk(A,arguments);},info:function(S,T){qx.log.Logger.__fk(e,arguments);},warn:function(U,V){qx.log.Logger.__fk(r,arguments);},error:function(W,X){qx.log.Logger.__fk(j,arguments);},trace:function(Y){qx.log.Logger.__fk(e,[Y,qx.dev.StackTrace.getStackTrace().join(u)]);},deprecatedMethodWarning:function(ba,bb){var bc;{};},deprecatedClassWarning:function(bd,be){var bf;{};},deprecatedEventWarning:function(bg,event,bh){var bi;{};},deprecatedMixinWarning:function(bj,bk){var bl;{};},deprecatedConstantWarning:function(bm,bn,bo){var self,bp;{};},deprecateMethodOverriding:function(bq,br,bs,bt){var bu;{};},clear:function(){this.__fi.clearHistory();},__fi:new qx.log.appender.RingBuffer(50),__fj:{debug:0,info:1,warn:2,error:3},__fk:function(bv,bw){var bB=this.__fj;if(bB[bv]<bB[this.__ff]){return;}var by=bw.length<2?null:bw[0];var bA=by?1:0;var bx=[];for(var i=bA,l=bw.length;i<l;i++){bx.push(this.__fm(bw[i],true));}var bC=new Date;var bD={time:bC,offset:bC-qx.Bootstrap.LOADSTART,level:bv,items:bx,win:window};if(by){if(by.$$hash!==undefined){bD.object=by.$$hash;}else if(by.$$type){bD.clazz=by;}}this.__fi.process(bD);var bE=this.__fg;for(var bz in bE){bE[bz].process(bD);}},__fl:function(bF){if(bF===undefined){return y;}else if(bF===null){return b;}if(bF.$$type){return a;}var bG=typeof bF;if(bG===C||bG==c||bG===H||bG===B){return bG;}else if(bG===w){if(bF.nodeType){return k;}else if(bF.classname){return d;}else if(bF instanceof Array){return g;}else if(bF instanceof Error){return j;}else if(bF instanceof Date){return E;}else{return z;}}if(bF.toString){return G;}return D;},__fm:function(bH,bI){var bP=this.__fl(bH);var bL=D;var bK=[];switch(bP){case b:case y:bL=bP;break;case c:case H:case B:case E:bL=bH;break;case k:if(bH.nodeType===9){bL=o;}else if(bH.nodeType===3){bL=m+bH.nodeValue+F;}else if(bH.nodeType===1){bL=bH.nodeName.toLowerCase();if(bH.id){bL+=q+bH.id;}}else{bL=k;}break;case C:bL=qx.lang.Function.getName(bH)||bP;break;case d:bL=bH.basename+t+bH.$$hash+F;break;case a:case G:bL=bH.toString();break;case j:bK=qx.dev.StackTrace.getStackTraceFromError(bH);bL=bH.toString();break;case g:if(bI){bL=[];for(var i=0,l=bH.length;i<l;i++){if(bL.length>20){bL.push(h+(l-i)+f);break;}bL.push(this.__fm(bH[i],false));}}else{bL=n+bH.length+x;}break;case z:if(bI){var bJ;var bO=[];for(var bN in bH){bO.push(bN);}bO.sort();bL=[];for(var i=0,l=bO.length;i<l;i++){if(bL.length>20){bL.push(h+(l-i)+f);break;}bN=bO[i];bJ=this.__fm(bH[bN],false);bJ.key=bN;bL.push(bJ);}}else{var bM=0;for(var bN in bH){bM++;}bL=p+bM+v;}break;}return {type:bP,text:bL,trace:bK};}},defer:function(bQ){var bR=qx.Bootstrap.$$logs;for(var i=0;i<bR.length;i++){bQ.__fk(bR[i][0],bR[i][1]);}qx.Bootstrap.debug=bQ.debug;qx.Bootstrap.info=bQ.info;qx.Bootstrap.warn=bQ.warn;qx.Bootstrap.error=bQ.error;qx.Bootstrap.trace=bQ.trace;}});})();(function(){var q="set",p="get",o="reset",n="MSIE 6.0",m="info",k="qx.core.Object",j="error",h="warn",g="]",f="debug",b="[",d="$$user_",c="rv:1.8.1",a="Object";qx.Class.define(k,{extend:Object,include:[qx.data.MBinding],construct:function(){qx.core.ObjectRegistry.register(this);},statics:{$$type:a},members:{toHashCode:function(){return this.$$hash;},toString:function(){return this.classname+b+this.$$hash+g;},base:function(r,s){{};if(arguments.length===1){return r.callee.base.call(this);}else{return r.callee.base.apply(this,Array.prototype.slice.call(arguments,1));}},self:function(t){return t.callee.self;},clone:function(){var v=this.constructor;var u=new v;var x=qx.Class.getProperties(v);var w=qx.core.Property.$$store.user;var y=qx.core.Property.$$method.set;var name;for(var i=0,l=x.length;i<l;i++){name=x[i];if(this.hasOwnProperty(w[name])){u[y[name]](this[w[name]]);}}return u;},set:function(z,A){var C=qx.core.Property.$$method.set;if(qx.Bootstrap.isString(z)){if(!this[C[z]]){if(this[q+qx.Bootstrap.firstUp(z)]!=undefined){this[q+qx.Bootstrap.firstUp(z)](A);return this;}{};}return this[C[z]](A);}else{for(var B in z){if(!this[C[B]]){if(this[q+qx.Bootstrap.firstUp(B)]!=undefined){this[q+qx.Bootstrap.firstUp(B)](z[B]);continue;}{};}this[C[B]](z[B]);}return this;}},get:function(D){var E=qx.core.Property.$$method.get;if(!this[E[D]]){if(this[p+qx.Bootstrap.firstUp(D)]!=undefined){return this[p+qx.Bootstrap.firstUp(D)]();}{};}return this[E[D]]();},reset:function(F){var G=qx.core.Property.$$method.reset;if(!this[G[F]]){if(this[o+qx.Bootstrap.firstUp(F)]!=undefined){this[o+qx.Bootstrap.firstUp(F)]();return;}{};}this[G[F]]();},__lw:qx.event.Registration,addListener:function(H,I,self,J){if(!this.$$disposed){return this.__lw.addListener(this,H,I,self,J);}return null;},addListenerOnce:function(K,L,self,M){var N=function(e){this.removeListener(K,N,this,M);L.call(self||this,e);};return this.addListener(K,N,this,M);},removeListener:function(O,P,self,Q){if(!this.$$disposed){return this.__lw.removeListener(this,O,P,self,Q);}return false;},removeListenerById:function(R){if(!this.$$disposed){return this.__lw.removeListenerById(this,R);}return false;},hasListener:function(S,T){return this.__lw.hasListener(this,S,T);},dispatchEvent:function(U){if(!this.$$disposed){return this.__lw.dispatchEvent(this,U);}return true;},fireEvent:function(V,W,X){if(!this.$$disposed){return this.__lw.fireEvent(this,V,W,X);}return true;},fireNonBubblingEvent:function(Y,ba,bb){if(!this.$$disposed){return this.__lw.fireNonBubblingEvent(this,Y,ba,bb);}return true;},fireDataEvent:function(bc,bd,be,bf){if(!this.$$disposed){if(be===undefined){be=null;}return this.__lw.fireNonBubblingEvent(this,bc,qx.event.type.Data,[bd,be,!!bf]);}return true;},__lx:null,setUserData:function(bg,bh){if(!this.__lx){this.__lx={};}this.__lx[bg]=bh;},getUserData:function(bi){if(!this.__lx){return null;}var bj=this.__lx[bi];return bj===undefined?null:bj;},__ly:qx.log.Logger,debug:function(bk){this.__lz(f,arguments);},info:function(bl){this.__lz(m,arguments);},warn:function(bm){this.__lz(h,arguments);},error:function(bn){this.__lz(j,arguments);},trace:function(){this.__ly.trace(this);},__lz:function(bo,bp){var bq=qx.lang.Array.fromArguments(bp);bq.unshift(this);this.__ly[bo].apply(this.__ly,bq);},isDisposed:function(){return this.$$disposed||false;},dispose:function(){var bv,bt,bs,bw;if(this.$$disposed){return;}this.$$disposed=true;this.$$instance=null;this.$$allowconstruct=null;{};var bu=this.constructor;var br;while(bu.superclass){if(bu.$$destructor){bu.$$destructor.call(this);}if(bu.$$includes){br=bu.$$flatIncludes;for(var i=0,l=br.length;i<l;i++){if(br[i].$$destructor){br[i].$$destructor.call(this);}}}bu=bu.superclass;}if(this.__lA){this.__lA();}{};},__lA:null,__lB:function(){var bx=qx.Class.getProperties(this.constructor);for(var i=0,l=bx.length;i<l;i++){delete this[d+bx[i]];}},_disposeObjects:function(by){qx.util.DisposeUtil.disposeObjects(this,arguments);},_disposeSingletonObjects:function(bz){qx.util.DisposeUtil.disposeObjects(this,arguments,true);},_disposeArray:function(bA){qx.util.DisposeUtil.disposeArray(this,bA);},_disposeMap:function(bB){qx.util.DisposeUtil.disposeMap(this,bB);}},settings:{"qx.disposerDebugLevel":0},defer:function(bC,bD){{};var bF=navigator.userAgent.indexOf(n)!=-1;var bE=navigator.userAgent.indexOf(c)!=-1;if(bF||bE){bD.__lA=bD.__lB;}},destruct:function(){if(!qx.core.ObjectRegistry.inShutDown){qx.event.Registration.removeAllListeners(this);}else{qx.event.Registration.deleteAllListeners(this);}qx.core.ObjectRegistry.unregister(this);this.__lx=null;var bI=this.constructor;var bM;var bN=qx.core.Property.$$store;var bK=bN.user;var bL=bN.theme;var bG=bN.inherit;var bJ=bN.useinit;var bH=bN.init;while(bI){bM=bI.$$properties;if(bM){for(var name in bM){if(bM[name].dereference){this[bK[name]]=this[bL[name]]=this[bG[name]]=this[bJ[name]]=this[bH[name]]=undefined;}}}bI=bI.superclass;}}});})();(function(){var f="changeSelection",e="qx.event.type.Data",d="tabView",c="apiviewer.TabViewController",b="classLinkClicked",a="itemName";qx.Class.define(c,{extend:qx.core.Object,construct:function(g){qx.core.Object.call(this);apiviewer.TabViewController.instance=this;this._tabView=g.getWidgetById(d);this._tabView.addListener(f,this.__Sm,this);},events:{"classLinkClicked":e,"changeSelection":e},members:{showTabView:function(){this._tabView.show();},onSelectItem:function(h){this.fireDataEvent(b,h);},showItem:function(i){qx.ui.core.queue.Manager.flush();var j=this._tabView.getSelection()[0];j.setUserData(a,i);return j.getChildren()[0].showItem(i);},openPackage:function(k,l){this.__Sj(k,apiviewer.ui.tabview.PackagePage,l);},openClass:function(m,n){this.__Sj(m,apiviewer.ui.tabview.ClassPage,n);},__Sj:function(o,p,q){var r=this._tabView.getSelection()[0];if(q==true||r==null){this.__Sk(p,o);}else{if(r instanceof p){r.setClassNode(o);}else{this.__Sk(p,o);this.__Sl(r);}}},__Sk:function(s,t){var u=new s(t);this._tabView.add(u);this._tabView.setSelection([u]);},__Sl:function(v){this._tabView.remove(v);v.destroy();},__Sm:function(event){var w=event.getOldData();var x=event.getData();this.fireDataEvent(f,x,w);},__Sn:function(y,z){var A=new qx.event.type.Mouse();A.init(y,z,null,true,true);A.stop();return A;}},destruct:function(){this._tabView.destroy();this._tabView=null;}});})();(function(){var a="qx.event.type.Event";qx.Class.define(a,{extend:qx.core.Object,statics:{CAPTURING_PHASE:1,AT_TARGET:2,BUBBLING_PHASE:3},members:{init:function(b,c){{};this._type=null;this._target=null;this._currentTarget=null;this._relatedTarget=null;this._originalTarget=null;this._stopPropagation=false;this._preventDefault=false;this._bubbles=!!b;this._cancelable=!!c;this._timeStamp=(new Date()).getTime();this._eventPhase=null;return this;},clone:function(d){if(d){var e=d;}else{var e=qx.event.Pool.getInstance().getObject(this.constructor);}e._type=this._type;e._target=this._target;e._currentTarget=this._currentTarget;e._relatedTarget=this._relatedTarget;e._originalTarget=this._originalTarget;e._stopPropagation=this._stopPropagation;e._bubbles=this._bubbles;e._preventDefault=this._preventDefault;e._cancelable=this._cancelable;return e;},stop:function(){if(this._bubbles){this.stopPropagation();}if(this._cancelable){this.preventDefault();}},stopPropagation:function(){{};this._stopPropagation=true;},getPropagationStopped:function(){return !!this._stopPropagation;},preventDefault:function(){{};this._preventDefault=true;},getDefaultPrevented:function(){return !!this._preventDefault;},getType:function(){return this._type;},setType:function(f){this._type=f;},getEventPhase:function(){return this._eventPhase;},setEventPhase:function(g){this._eventPhase=g;},getTimeStamp:function(){return this._timeStamp;},getTarget:function(){return this._target;},setTarget:function(h){this._target=h;},getCurrentTarget:function(){return this._currentTarget||this._target;},setCurrentTarget:function(i){this._currentTarget=i;},getRelatedTarget:function(){return this._relatedTarget;},setRelatedTarget:function(j){this._relatedTarget=j;},getOriginalTarget:function(){return this._originalTarget;},setOriginalTarget:function(k){this._originalTarget=k;},getBubbles:function(){return this._bubbles;},setBubbles:function(l){this._bubbles=l;},isCancelable:function(){return this._cancelable;},setCancelable:function(m){this._cancelable=m;}},destruct:function(){this._target=this._currentTarget=this._relatedTarget=this._originalTarget=null;}});})();(function(){var a="qx.event.type.Data";qx.Class.define(a,{extend:qx.event.type.Event,members:{__jO:null,__jP:null,init:function(b,c,d){qx.event.type.Event.prototype.init.call(this,false,d);this.__jO=b;this.__jP=c;return this;},clone:function(e){var f=qx.event.type.Event.prototype.clone.call(this,e);f.__jO=this.__jO;f.__jP=this.__jP;return f;},getData:function(){return this.__jO;},getOldData:function(){return this.__jP;}},destruct:function(){this.__jO=this.__jP=null;}});})();(function(){var c="qx.globalErrorHandling",b="on",a="qx.event.GlobalError";qx.Bootstrap.define(a,{statics:{setErrorHandler:function(d,f){this.__kx=d||null;this.__ky=f||window;if(qx.core.Setting.get(c)===b){if(d&&window.onerror){var g=qx.Bootstrap.bind(this.__kA,this);if(this.__kz==null){this.__kz=window.onerror;}var self=this;window.onerror=function(e){self.__kz(e);g(e);};}if(d&&!window.onerror){window.onerror=qx.Bootstrap.bind(this.__kA,this);}if(this.__kx==null){if(this.__kz!=null){window.onerror=this.__kz;this.__kz=null;}else{window.onerror=null;}}}},__kA:function(h,i,j){if(this.__kx){this.handleError(new qx.core.WindowError(h,i,j));return true;}},observeMethod:function(k){if(qx.core.Setting.get(c)===b){var self=this;return function(){if(!self.__kx){return k.apply(this,arguments);}try{return k.apply(this,arguments);}catch(l){self.handleError(new qx.core.GlobalError(l,arguments));}};}else{return k;}},handleError:function(m){if(this.__kx){this.__kx.call(this.__ky,m);}}},defer:function(n){qx.core.Setting.define(c,b);n.setErrorHandler(null,null);}});})();(function(){var b="",a="qx.core.WindowError";qx.Bootstrap.define(a,{extend:Error,construct:function(c,d,e){Error.call(this,c);this.__cW=c;this.__cX=d||b;this.__cY=e===undefined?-1:e;},members:{__cW:null,__cX:null,__cY:null,toString:function(){return this.__cW;},getUri:function(){return this.__cX;},getLineNumber:function(){return this.__cY;}}});})();(function(){var b="GlobalError: ",a="qx.core.GlobalError";qx.Bootstrap.define(a,{extend:Error,construct:function(c,d){{};this.__kS=b+(c&&c.message?c.message:c);Error.call(this,this.__kS);this.__kT=d;this.__kU=c;},members:{__kU:null,__kT:null,__kS:null,toString:function(){return this.__kS;},getArguments:function(){return this.__kT;},getSourceException:function(){return this.__kU;}},destruct:function(){this.__kU=null;this.__kT=null;this.__kS=null;}});})();(function(){var a="qx.event.IEventHandler";qx.Interface.define(a,{statics:{TARGET_DOMNODE:1,TARGET_WINDOW:2,TARGET_OBJECT:4,TARGET_DOCUMENT:8},members:{canHandleEvent:function(b,c){},registerEvent:function(d,e,f){},unregisterEvent:function(g,h,i){}}});})();(function(){var c="qx.event.type.Data",b="qx.event.type.Event",a="qx.data.IListData";qx.Interface.define(a,{events:{"change":c,"changeLength":b},members:{getItem:function(d){},setItem:function(e,f){},splice:function(g,h,i){},contains:function(j){},getLength:function(){},toArray:function(){}}});})();(function(){var a="qx.lang.Date";qx.Class.define(a,{statics:{now:function(){return +new Date;}}});})();(function(){var b="qx.util.ObjectPool",a="Integer";qx.Class.define(b,{extend:qx.core.Object,construct:function(c){qx.core.Object.call(this);this.__fH={};if(c!=null){this.setSize(c);}},properties:{size:{check:a,init:Infinity}},members:{__fH:null,getObject:function(d){if(this.$$disposed){return new d;}if(!d){throw new Error("Class needs to be defined!");}var e=null;var f=this.__fH[d.classname];if(f){e=f.pop();}if(e){e.$$pooled=false;}else{e=new d;}return e;},poolObject:function(g){if(!this.__fH){return;}var h=g.classname;var j=this.__fH[h];if(g.$$pooled){throw new Error("Object is already pooled: "+g);}if(!j){this.__fH[h]=j=[];}if(j.length>this.getSize()){if(g.destroy){g.destroy();}else{g.dispose();}return;}g.$$pooled=true;j.push(g);}},destruct:function(){var n=this.__fH;var k,m,i,l;for(k in n){m=n[k];for(i=0,l=m.length;i<l;i++){m[i].dispose();}}delete this.__fH;}});})();(function(){var b="singleton",a="qx.event.Pool";qx.Class.define(a,{extend:qx.util.ObjectPool,type:b,construct:function(){qx.util.ObjectPool.call(this,30);}});})();(function(){var a="qx.util.DisposeUtil";qx.Class.define(a,{statics:{disposeObjects:function(b,c,d){var name;for(var i=0,l=c.length;i<l;i++){name=c[i];if(b[name]==null||!b.hasOwnProperty(name)){continue;}if(!qx.core.ObjectRegistry.inShutDown){if(b[name].dispose){if(!d&&b[name].constructor.$$instance){throw new Error("The object stored in key "+name+" is a singleton! Please use disposeSingleton instead.");}else{b[name].dispose();}}else{throw new Error("Has no disposable object under key: "+name+"!");}}b[name]=null;}},disposeArray:function(e,f){var h=e[f];if(!h){return;}if(qx.core.ObjectRegistry.inShutDown){e[f]=null;return;}try{var g;for(var i=h.length-1;i>=0;i--){g=h[i];if(g){g.dispose();}}}catch(j){throw new Error("The array field: "+f+" of object: "+e+" has non disposable entries: "+j);}h.length=0;e[f]=null;},disposeMap:function(k,m){var o=k[m];if(!o){return;}if(qx.core.ObjectRegistry.inShutDown){k[m]=null;return;}try{var n;for(var p in o){n=o[p];if(o.hasOwnProperty(p)&&n){n.dispose();}}}catch(q){throw new Error("The map field: "+m+" of object: "+k+" has non disposable entries: "+q);}k[m]=null;},disposeTriggeredBy:function(r,s){var t=s.dispose;s.dispose=function(){t.call(s);r.dispose();};}}});})();(function(){var m="get",l="",k="[",h="last",g="change",f="]",d=".",c="Number",b="String",a="set",D="deepBinding",C="item",B="reset",A="' (",z="Boolean",y=") to the object '",x="Integer",w=" of object ",v="qx.data.SingleValueBinding",u="Binding property ",s="Binding from '",t="PositiveNumber",q="PositiveInteger",r="Binding does not exist!",o=").",p="Date",n=" not possible: No event available. ";qx.Class.define(v,{statics:{DEBUG_ON:false,__gl:{},bind:function(E,F,G,H,I){var S=this.__gn(E,F,G,H,I);var N=F.split(d);var K=this.__gt(N);var R=[];var O=[];var P=[];var L=[];var M=E;for(var i=0;i<N.length;i++){if(K[i]!==l){L.push(g);}else{L.push(this.__go(M,N[i]));}R[i]=M;if(i==N.length-1){if(K[i]!==l){var V=K[i]===h?M.length-1:K[i];var J=M.getItem(V);this.__gs(J,G,H,I,E);P[i]=this.__gu(M,L[i],G,H,I,K[i]);}else{if(N[i]!=null&&M[m+qx.lang.String.firstUp(N[i])]!=null){var J=M[m+qx.lang.String.firstUp(N[i])]();this.__gs(J,G,H,I,E);}P[i]=this.__gu(M,L[i],G,H,I);}}else{var T={index:i,propertyNames:N,sources:R,listenerIds:P,arrayIndexValues:K,targetObject:G,targetPropertyChain:H,options:I,listeners:O};var Q=qx.lang.Function.bind(this.__gm,this,T);O.push(Q);P[i]=M.addListener(L[i],Q);}if(M[m+qx.lang.String.firstUp(N[i])]==null){M=null;}else if(K[i]!==l){M=M[m+qx.lang.String.firstUp(N[i])](K[i]);}else{M=M[m+qx.lang.String.firstUp(N[i])]();}if(!M){break;}}var U={type:D,listenerIds:P,sources:R,targetListenerIds:S.listenerIds,targets:S.targets};this.__gv(U,E,F,G,H);return U;},__gm:function(W){if(W.options&&W.options.onUpdate){W.options.onUpdate(W.sources[W.index],W.targetObject);}for(var j=W.index+1;j<W.propertyNames.length;j++){var bb=W.sources[j];W.sources[j]=null;if(!bb){continue;}bb.removeListenerById(W.listenerIds[j]);}var bb=W.sources[W.index];for(var j=W.index+1;j<W.propertyNames.length;j++){if(W.arrayIndexValues[j-1]!==l){bb=bb[m+qx.lang.String.firstUp(W.propertyNames[j-1])](W.arrayIndexValues[j-1]);}else{bb=bb[m+qx.lang.String.firstUp(W.propertyNames[j-1])]();}W.sources[j]=bb;if(!bb){this.__gp(W.targetObject,W.targetPropertyChain);break;}if(j==W.propertyNames.length-1){if(qx.Class.implementsInterface(bb,qx.data.IListData)){var bc=W.arrayIndexValues[j]===h?bb.length-1:W.arrayIndexValues[j];var Y=bb.getItem(bc);this.__gs(Y,W.targetObject,W.targetPropertyChain,W.options,W.sources[W.index]);W.listenerIds[j]=this.__gu(bb,g,W.targetObject,W.targetPropertyChain,W.options,W.arrayIndexValues[j]);}else{if(W.propertyNames[j]!=null&&bb[m+qx.lang.String.firstUp(W.propertyNames[j])]!=null){var Y=bb[m+qx.lang.String.firstUp(W.propertyNames[j])]();this.__gs(Y,W.targetObject,W.targetPropertyChain,W.options,W.sources[W.index]);}var ba=this.__go(bb,W.propertyNames[j]);W.listenerIds[j]=this.__gu(bb,ba,W.targetObject,W.targetPropertyChain,W.options);}}else{if(W.listeners[j]==null){var X=qx.lang.Function.bind(this.__gm,this,W);W.listeners.push(X);}if(qx.Class.implementsInterface(bb,qx.data.IListData)){var ba=g;}else{var ba=this.__go(bb,W.propertyNames[j]);}W.listenerIds[j]=bb.addListener(ba,W.listeners[j]);}}},__gn:function(bd,be,bf,bg,bh){var bl=bg.split(d);var bj=this.__gt(bl);var bq=[];var bp=[];var bn=[];var bm=[];var bk=bf;for(var i=0;i<bl.length-1;i++){if(bj[i]!==l){bm.push(g);}else{try{bm.push(this.__go(bk,bl[i]));}catch(e){break;}}bq[i]=bk;var bo=function(){for(var j=i+1;j<bl.length-1;j++){var bt=bq[j];bq[j]=null;if(!bt){continue;}bt.removeListenerById(bn[j]);}var bt=bq[i];for(var j=i+1;j<bl.length-1;j++){var br=qx.lang.String.firstUp(bl[j-1]);if(bj[j-1]!==l){var bu=bj[j-1]===h?bt.getLength()-1:bj[j-1];bt=bt[m+br](bu);}else{bt=bt[m+br]();}bq[j]=bt;if(bp[j]==null){bp.push(bo);}if(qx.Class.implementsInterface(bt,qx.data.IListData)){var bs=g;}else{try{var bs=qx.data.SingleValueBinding.__go(bt,bl[j]);}catch(e){break;}}bn[j]=bt.addListener(bs,bp[j]);}qx.data.SingleValueBinding.updateTarget(bd,be,bf,bg,bh);};bp.push(bo);bn[i]=bk.addListener(bm[i],bo);var bi=qx.lang.String.firstUp(bl[i]);if(bk[m+bi]==null){bk=null;}else if(bj[i]!==l){bk=bk[m+bi](bj[i]);}else{bk=bk[m+bi]();}if(!bk){break;}}return {listenerIds:bn,targets:bq};},updateTarget:function(bv,bw,bx,by,bz){var bD=this.__gr(bv,bw);if(bD!=null){var bF=bw.substring(bw.lastIndexOf(d)+1,bw.length);if(bF.charAt(bF.length-1)==f){var bA=bF.substring(bF.lastIndexOf(k)+1,bF.length-1);var bC=bF.substring(0,bF.lastIndexOf(k));var bE=bD[m+qx.lang.String.firstUp(bC)]();if(bA==h){bA=bE.length-1;}if(bE!=null){var bB=bE.getItem(bA);}}else{var bB=bD[m+qx.lang.String.firstUp(bF)]();}}bB=qx.data.SingleValueBinding.__gw(bB,bx,by,bz);this.__gq(bx,by,bB);},__go:function(bG,bH){var bI=this.__gx(bG,bH);if(bI==null){if(qx.Class.supportsEvent(bG.constructor,bH)){bI=bH;}else if(qx.Class.supportsEvent(bG.constructor,g+qx.lang.String.firstUp(bH))){bI=g+qx.lang.String.firstUp(bH);}else{throw new qx.core.AssertionError(u+bH+w+bG+n);}}return bI;},__gp:function(bJ,bK){var bL=this.__gr(bJ,bK);if(bL!=null){var bM=bK.substring(bK.lastIndexOf(d)+1,bK.length);if(bM.charAt(bM.length-1)==f){this.__gq(bJ,bK,null);return;}if(bL[B+qx.lang.String.firstUp(bM)]!=undefined){bL[B+qx.lang.String.firstUp(bM)]();}else{bL[a+qx.lang.String.firstUp(bM)](null);}}},__gq:function(bN,bO,bP){var bT=this.__gr(bN,bO);if(bT!=null){var bU=bO.substring(bO.lastIndexOf(d)+1,bO.length);if(bU.charAt(bU.length-1)==f){var bQ=bU.substring(bU.lastIndexOf(k)+1,bU.length-1);var bS=bU.substring(0,bU.lastIndexOf(k));var bR=bT[m+qx.lang.String.firstUp(bS)]();if(bQ==h){bQ=bR.length-1;}if(bR!=null){bR.setItem(bQ,bP);}}else{bT[a+qx.lang.String.firstUp(bU)](bP);}}},__gr:function(bV,bW){var ca=bW.split(d);var cb=bV;for(var i=0;i<ca.length-1;i++){try{var bY=ca[i];if(bY.indexOf(f)==bY.length-1){var bX=bY.substring(bY.indexOf(k)+1,bY.length-1);bY=bY.substring(0,bY.indexOf(k));}cb=cb[m+qx.lang.String.firstUp(bY)]();if(bX!=null){if(bX==h){bX=cb.length-1;}cb=cb.getItem(bX);bX=null;}}catch(cc){return null;}}return cb;},__gs:function(cd,ce,cf,cg,ch){cd=this.__gw(cd,ce,cf,cg);if(cd===undefined){this.__gp(ce,cf);}if(cd!==undefined){try{this.__gq(ce,cf,cd);if(cg&&cg.onUpdate){cg.onUpdate(ch,ce,cd);}}catch(e){if(!(e instanceof qx.core.ValidationError)){throw e;}if(cg&&cg.onSetFail){cg.onSetFail(e);}else{qx.log.Logger.warn("Failed so set value "+cd+" on "+ce+". Error message: "+e);}}}},__gt:function(ci){var cj=[];for(var i=0;i<ci.length;i++){var name=ci[i];if(qx.lang.String.endsWith(name,f)){var ck=name.substring(name.indexOf(k)+1,name.indexOf(f));if(name.indexOf(f)!=name.length-1){throw new Error("Please use only one array at a time: "+name+" does not work.");}if(ck!==h){if(ck==l||isNaN(parseInt(ck,10))){throw new Error("No number or 'last' value hast been given"+" in a array binding: "+name+" does not work.");}}if(name.indexOf(k)!=0){ci[i]=name.substring(0,name.indexOf(k));cj[i]=l;cj[i+1]=ck;ci.splice(i+1,0,C);i++;}else{cj[i]=ck;ci.splice(i,1,C);}}else{cj[i]=l;}}return cj;},__gu:function(cl,cm,cn,co,cp,cq){var cr;{};var ct=function(cu,e){if(cu!==l){if(cu===h){cu=cl.length-1;}var cx=cl.getItem(cu);if(cx===undefined){qx.data.SingleValueBinding.__gp(cn,co);}var cv=e.getData().start;var cw=e.getData().end;if(cu<cv||cu>cw){return;}}else{var cx=e.getData();}if(qx.data.SingleValueBinding.DEBUG_ON){qx.log.Logger.debug("Binding executed from "+cl+" by "+cm+" to "+cn+" ("+co+")");qx.log.Logger.debug("Data before conversion: "+cx);}cx=qx.data.SingleValueBinding.__gw(cx,cn,co,cp);if(qx.data.SingleValueBinding.DEBUG_ON){qx.log.Logger.debug("Data after conversion: "+cx);}try{if(cx!==undefined){qx.data.SingleValueBinding.__gq(cn,co,cx);}else{qx.data.SingleValueBinding.__gp(cn,co);}if(cp&&cp.onUpdate){cp.onUpdate(cl,cn,cx);}}catch(e){if(!(e instanceof qx.core.ValidationError)){throw e;}if(cp&&cp.onSetFail){cp.onSetFail(e);}else{qx.log.Logger.warn("Failed so set value "+cx+" on "+cn+". Error message: "+e);}}};if(!cq){cq=l;}ct=qx.lang.Function.bind(ct,cl,cq);var cs=cl.addListener(cm,ct);return cs;},__gv:function(cy,cz,cA,cB,cC){if(this.__gl[cz.toHashCode()]===undefined){this.__gl[cz.toHashCode()]=[];}this.__gl[cz.toHashCode()].push([cy,cz,cA,cB,cC]);},__gw:function(cD,cE,cF,cG){if(cG&&cG.converter){var cI;if(cE.getModel){cI=cE.getModel();}return cG.converter(cD,cI);}else{var cK=this.__gr(cE,cF);var cL=cF.substring(cF.lastIndexOf(d)+1,cF.length);if(cK==null){return cD;}var cJ=qx.Class.getPropertyDefinition(cK.constructor,cL);var cH=cJ==null?l:cJ.check;return this.__gy(cD,cH);}},__gx:function(cM,cN){var cO=qx.Class.getPropertyDefinition(cM.constructor,cN);if(cO==null){return null;}return cO.event;},__gy:function(cP,cQ){var cR=qx.lang.Type.getClass(cP);if((cR==c||cR==b)&&(cQ==x||cQ==q)){cP=parseInt(cP,10);}if((cR==z||cR==c||cR==p)&&cQ==b){cP=cP+l;}if((cR==c||cR==b)&&(cQ==c||cQ==t)){cP=parseFloat(cP);}return cP;},removeBindingFromObject:function(cS,cT){if(cT.type==D){for(var i=0;i<cT.sources.length;i++){if(cT.sources[i]){cT.sources[i].removeListenerById(cT.listenerIds[i]);}}for(var i=0;i<cT.targets.length;i++){if(cT.targets[i]){cT.targets[i].removeListenerById(cT.targetListenerIds[i]);}}}else{cS.removeListenerById(cT);}var cU=this.__gl[cS.toHashCode()];if(cU!=undefined){for(var i=0;i<cU.length;i++){if(cU[i][0]==cT){qx.lang.Array.remove(cU,cU[i]);return;}}}throw new Error("Binding could not be found!");},removeAllBindingsForObject:function(cV){{};var cW=this.__gl[cV.toHashCode()];if(cW!=undefined){for(var i=cW.length-1;i>=0;i--){this.removeBindingFromObject(cV,cW[i][0]);}}},getAllBindingsForObject:function(cX){if(this.__gl[cX.toHashCode()]===undefined){this.__gl[cX.toHashCode()]=[];}return this.__gl[cX.toHashCode()];},removeAllBindings:function(){for(var da in this.__gl){var cY=qx.core.ObjectRegistry.fromHashCode(da);if(cY==null){delete this.__gl[da];continue;}this.removeAllBindingsForObject(cY);}this.__gl={};},getAllBindings:function(){return this.__gl;},showBindingInLog:function(db,dc){var de;for(var i=0;i<this.__gl[db.toHashCode()].length;i++){if(this.__gl[db.toHashCode()][i][0]==dc){de=this.__gl[db.toHashCode()][i];break;}}if(de===undefined){var dd=r;}else{var dd=s+de[1]+A+de[2]+y+de[3]+A+de[4]+o;}qx.log.Logger.debug(dd);},showAllBindingsInLog:function(){for(var dg in this.__gl){var df=qx.core.ObjectRegistry.fromHashCode(dg);for(var i=0;i<this.__gl[dg].length;i++){this.showBindingInLog(df,this.__gl[dg][i][0]);}}}}});})();(function(){var c=": ",b="qx.type.BaseError",a="";qx.Class.define(b,{extend:Error,construct:function(d,e){Error.call(this,e);this.__cL=d||a;this.message=e||qx.type.BaseError.DEFAULTMESSAGE;},statics:{DEFAULTMESSAGE:"error"},members:{__cL:null,message:null,getComment:function(){return this.__cL;},toString:function(){return this.__cL+c+this.message;}}});})();(function(){var a="qx.core.AssertionError";qx.Class.define(a,{extend:qx.type.BaseError,construct:function(b,c){qx.type.BaseError.call(this,b,c);this.__lC=qx.dev.StackTrace.getStackTrace();},members:{__lC:null,getStackTrace:function(){return this.__lC;}}});})();(function(){var a="qx.core.ValidationError";qx.Class.define(a,{extend:qx.type.BaseError});})();(function(){var f="qx.lang.Type",e="Error",d="RegExp",c="Date",b="Number",a="Boolean";qx.Class.define(f,{statics:{getClass:qx.Bootstrap.getClass,isString:qx.Bootstrap.isString,isArray:qx.Bootstrap.isArray,isObject:qx.Bootstrap.isObject,isFunction:qx.Bootstrap.isFunction,isRegExp:function(g){return this.getClass(g)==d;},isNumber:function(h){return (h!==null&&(this.getClass(h)==b||h instanceof Number));},isBoolean:function(i){return (i!==null&&(this.getClass(i)==a||i instanceof Boolean));},isDate:function(j){return (j!==null&&(this.getClass(j)==c||j instanceof Date));},isError:function(k){return (k!==null&&(this.getClass(k)==e||k instanceof Error));}}});})();(function(){var a="qx.event.IEventDispatcher";qx.Interface.define(a,{members:{canDispatchEvent:function(b,event,c){this.assertInstance(event,qx.event.type.Event);this.assertString(c);},dispatchEvent:function(d,event,e){this.assertInstance(event,qx.event.type.Event);this.assertString(e);}}});})();(function(){var a="qx.event.dispatch.Direct";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventDispatcher,construct:function(b){this._manager=b;},statics:{PRIORITY:qx.event.Registration.PRIORITY_LAST},members:{canDispatchEvent:function(c,event,d){return !event.getBubbles();},dispatchEvent:function(e,event,f){var j,g;{};event.setEventPhase(qx.event.type.Event.AT_TARGET);var k=this._manager.getListeners(e,f,false);if(k){for(var i=0,l=k.length;i<l;i++){var h=k[i].context||e;k[i].handler.call(h,event);}}}},defer:function(m){qx.event.Registration.addDispatcher(m);}});})();(function(){var a="qx.event.handler.Object";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,statics:{PRIORITY:qx.event.Registration.PRIORITY_LAST,SUPPORTED_TYPES:null,TARGET_CHECK:qx.event.IEventHandler.TARGET_OBJECT,IGNORE_CAN_HANDLE:false},members:{canHandleEvent:function(b,c){return qx.Class.supportsEvent(b.constructor,c);},registerEvent:function(d,e,f){},unregisterEvent:function(g,h,i){}},defer:function(j){qx.event.Registration.addHandler(j);}});})();(function(){var k="indexOf",j="lastIndexOf",h="slice",g="concat",f="join",e="toLocaleUpperCase",d="shift",c="substr",b="filter",a="unshift",I="match",H="quote",G="qx.lang.Generics",F="localeCompare",E="sort",D="some",C="charAt",B="split",A="substring",z="pop",t="toUpperCase",u="replace",q="push",r="charCodeAt",o="every",p="reverse",m="search",n="forEach",v="map",w="toLowerCase",y="splice",x="toLocaleLowerCase";qx.Class.define(G,{statics:{__eY:{"Array":[f,p,E,q,z,d,a,y,g,h,k,j,n,v,b,D,o],"String":[H,A,w,t,C,r,k,j,x,e,F,I,m,u,B,c,g,h]},__fa:function(J,K){return function(s){return J.prototype[K].apply(s,Array.prototype.slice.call(arguments,1));};},__fb:function(){var L=qx.lang.Generics.__eY;for(var P in L){var N=window[P];var M=L[P];for(var i=0,l=M.length;i<l;i++){var O=M[i];if(!N[O]){N[O]=qx.lang.Generics.__fa(N,O);}}}}},defer:function(Q){Q.__fb();}});})();(function(){var b="qx.util.DeferredCallManager",a="singleton";qx.Class.define(b,{extend:qx.core.Object,type:a,construct:function(){this.__gf={};this.__gg=qx.lang.Function.bind(this.__gk,this);this.__gh=false;},members:{__gi:null,__gj:null,__gf:null,__gh:null,__gg:null,schedule:function(c){if(this.__gi==null){this.__gi=window.setTimeout(this.__gg,0);}var d=c.toHashCode();if(this.__gj&&this.__gj[d]){return;}this.__gf[d]=c;this.__gh=true;},cancel:function(e){var f=e.toHashCode();if(this.__gj&&this.__gj[f]){this.__gj[f]=null;return;}delete this.__gf[f];if(qx.lang.Object.isEmpty(this.__gf)&&this.__gi!=null){window.clearTimeout(this.__gi);this.__gi=null;}},__gk:qx.event.GlobalError.observeMethod(function(){this.__gi=null;while(this.__gh){this.__gj=qx.lang.Object.clone(this.__gf);this.__gf={};this.__gh=false;for(var h in this.__gj){var g=this.__gj[h];if(g){this.__gj[h]=null;g.call();}}}this.__gj=null;})},destruct:function(){if(this.__gi!=null){window.clearTimeout(this.__gi);}this.__gg=this.__gf=null;}});})();(function(){var a="qx.util.DeferredCall";qx.Class.define(a,{extend:qx.core.Object,construct:function(b,c){qx.core.Object.call(this);this.__ia=b;this.__ib=c||null;this.__ic=qx.util.DeferredCallManager.getInstance();},members:{__ia:null,__ib:null,__ic:null,cancel:function(){this.__ic.cancel(this);},schedule:function(){this.__ic.schedule(this);},call:function(){this.__ib?this.__ia.apply(this.__ib):this.__ia();}},destruct:function(d,e){this.cancel();this.__ib=this.__ia=this.__ic=null;}});})();(function(){var m="element",k="qx.client",j="qxSelectable",h="off",g="on",f="text",d="div",c="",b="mshtml",a="none",F="scroll",E="qx.html.Element",D="|capture|",C="activate",B="__dz",A="blur",z="deactivate",w="capture",v="userSelect",u="-moz-none",s="visible",t="releaseCapture",q="|bubble|",r="tabIndex",o="focus",p="MozUserSelect",n="hidden";qx.Class.define(E,{extend:qx.core.Object,construct:function(G,H,I){qx.core.Object.call(this);this.__dd=G||d;this.__de=H||null;this.__df=I||null;},statics:{DEBUG:false,_modified:{},_visibility:{},_scroll:{},_actions:[],__dg:{},_scheduleFlush:function(J){qx.html.Element.__dK.schedule();},flush:function(){var U;{};var M=this.__dh();var L=M.getFocus();if(L&&this.__dl(L)){M.blur(L);}var bc=M.getActive();if(bc&&this.__dl(bc)){qx.bom.Element.deactivate(bc);}var P=this.__dj();if(P&&this.__dl(P)){qx.bom.Element.releaseCapture(P);}var V=[];var W=this._modified;for(var T in W){U=W[T];if(U.__dD()){if(U.__dm&&qx.dom.Hierarchy.isRendered(U.__dm)){V.push(U);}else{{};U.__dC();}delete W[T];}}for(var i=0,l=V.length;i<l;i++){U=V[i];{};U.__dC();}var R=this._visibility;for(var T in R){U=R[T];var X=U.__dm;if(!X){delete R[T];continue;}{};if(!U.$$disposed){X.style.display=U.__dp?c:a;if(qx.core.Variant.isSet(k,b)){if(!(document.documentMode>=8)){X.style.visibility=U.__dp?s:n;}}}delete R[T];}var scroll=this._scroll;for(var T in scroll){U=scroll[T];var bd=U.__dm;if(bd&&bd.offsetWidth){var O=true;if(U.__ds!=null){U.__dm.scrollLeft=U.__ds;delete U.__ds;}if(U.__dt!=null){U.__dm.scrollTop=U.__dt;delete U.__dt;}var Y=U.__dq;if(Y!=null){var S=Y.element.getDomElement();if(S&&S.offsetWidth){qx.bom.element.Scroll.intoViewX(S,bd,Y.align);delete U.__dq;}else{O=false;}}var ba=U.__dr;if(ba!=null){var S=ba.element.getDomElement();if(S&&S.offsetWidth){qx.bom.element.Scroll.intoViewY(S,bd,ba.align);delete U.__dr;}else{O=false;}}if(O){delete scroll[T];}}}var N={"releaseCapture":1,"blur":1,"deactivate":1};for(var i=0;i<this._actions.length;i++){var bb=this._actions[i];var X=bb.element.__dm;if(!X||!N[bb.type]&&!bb.element.__dD()){continue;}var Q=bb.args;Q.unshift(X);qx.bom.Element[bb.type].apply(qx.bom.Element,Q);}this._actions=[];for(var T in this.__dg){var K=this.__dg[T];var bd=K.element.__dm;if(bd){qx.bom.Selection.set(bd,K.start,K.end);delete this.__dg[T];}}qx.event.handler.Appear.refresh();},__dh:function(){if(!this.__di){var be=qx.event.Registration.getManager(window);this.__di=be.getHandler(qx.event.handler.Focus);}return this.__di;},__dj:function(){if(!this.__dk){var bf=qx.event.Registration.getManager(window);this.__dk=bf.getDispatcher(qx.event.dispatch.MouseCapture);}return this.__dk.getCaptureElement();},__dl:function(bg){var bh=qx.core.ObjectRegistry.fromHashCode(bg.$$element);return bh&&!bh.__dD();}},members:{__dd:null,__dm:null,__dn:false,__do:true,__dp:true,__dq:null,__dr:null,__ds:null,__dt:null,__du:null,__dv:null,__dw:null,__de:null,__df:null,__dx:null,__dy:null,__dz:null,__dA:null,__dB:null,_scheduleChildrenUpdate:function(){if(this.__dA){return;}this.__dA=true;qx.html.Element._modified[this.$$hash]=this;qx.html.Element._scheduleFlush(m);},_createDomElement:function(){return qx.bom.Element.create(this.__dd);},__dC:function(){{};var length;var bi=this.__dz;if(bi){length=bi.length;var bj;for(var i=0;i<length;i++){bj=bi[i];if(bj.__dp&&bj.__do&&!bj.__dm){bj.__dC();}}}if(!this.__dm){this.__dm=this._createDomElement();this.__dm.$$element=this.$$hash;this._copyData(false);if(bi&&length>0){this._insertChildren();}}else{this._syncData();if(this.__dA){this._syncChildren();}}delete this.__dA;},_insertChildren:function(){var bk=this.__dz;var length=bk.length;var bm;if(length>2){var bl=document.createDocumentFragment();for(var i=0;i<length;i++){bm=bk[i];if(bm.__dm&&bm.__do){bl.appendChild(bm.__dm);}}this.__dm.appendChild(bl);}else{var bl=this.__dm;for(var i=0;i<length;i++){bm=bk[i];if(bm.__dm&&bm.__do){bl.appendChild(bm.__dm);}}}},_syncChildren:function(){var br;var bw=qx.core.ObjectRegistry;var bn=this.__dz;var bu=bn.length;var bo;var bs;var bq=this.__dm;var bt=bq.childNodes;var bp=0;var bv;{};for(var i=bt.length-1;i>=0;i--){bv=bt[i];bs=bw.fromHashCode(bv.$$element);if(!bs||!bs.__do||bs.__dB!==this){bq.removeChild(bv);{};}}for(var i=0;i<bu;i++){bo=bn[i];if(bo.__do){bs=bo.__dm;bv=bt[bp];if(!bs){continue;}if(bs!=bv){if(bv){bq.insertBefore(bs,bv);}else{bq.appendChild(bs);}{};}bp++;}}{};},_copyData:function(bx){var bB=this.__dm;var bA=this.__df;if(bA){var by=qx.bom.element.Attribute;for(var bC in bA){by.set(bB,bC,bA[bC]);}}var bA=this.__de;if(bA){var bz=qx.bom.element.Style;if(bx){bz.setStyles(bB,bA);}else{bz.setCss(bB,bz.compile(bA));}}var bA=this.__dx;if(bA){for(var bC in bA){this._applyProperty(bC,bA[bC]);}}var bA=this.__dy;if(bA){qx.event.Registration.getManager(bB).importListeners(bB,bA);delete this.__dy;}},_syncData:function(){var bH=this.__dm;var bG=qx.bom.element.Attribute;var bE=qx.bom.element.Style;var bF=this.__dv;if(bF){var bK=this.__df;if(bK){var bI;for(var bJ in bF){bI=bK[bJ];if(bI!==undefined){bG.set(bH,bJ,bI);}else{bG.reset(bH,bJ);}}}this.__dv=null;}var bF=this.__du;if(bF){var bK=this.__de;if(bK){var bD={};for(var bJ in bF){bD[bJ]=bK[bJ];}bE.setStyles(bH,bD);}this.__du=null;}var bF=this.__dw;if(bF){var bK=this.__dx;if(bK){var bI;for(var bJ in bF){this._applyProperty(bJ,bK[bJ]);}}this.__dw=null;}},__dD:function(){var bL=this;while(bL){if(bL.__dn){return true;}if(!bL.__do||!bL.__dp){return false;}bL=bL.__dB;}return false;},__dE:function(bM){if(bM.__dB===this){throw new Error("Child is already in: "+bM);}if(bM.__dn){throw new Error("Root elements could not be inserted into other ones.");}if(bM.__dB){bM.__dB.remove(bM);}bM.__dB=this;if(!this.__dz){this.__dz=[];}if(this.__dm){this._scheduleChildrenUpdate();}},__dF:function(bN){if(bN.__dB!==this){throw new Error("Has no child: "+bN);}if(this.__dm){this._scheduleChildrenUpdate();}delete bN.__dB;},__dG:function(bO){if(bO.__dB!==this){throw new Error("Has no child: "+bO);}if(this.__dm){this._scheduleChildrenUpdate();}},getChildren:function(){return this.__dz||null;},getChild:function(bP){var bQ=this.__dz;return bQ&&bQ[bP]||null;},hasChildren:function(){var bR=this.__dz;return bR&&bR[0]!==undefined;},indexOf:function(bS){var bT=this.__dz;return bT?bT.indexOf(bS):-1;},hasChild:function(bU){var bV=this.__dz;return bV&&bV.indexOf(bU)!==-1;},add:function(bW){if(arguments[1]){for(var i=0,l=arguments.length;i<l;i++){this.__dE(arguments[i]);}this.__dz.push.apply(this.__dz,arguments);}else{this.__dE(bW);this.__dz.push(bW);}return this;},addAt:function(bX,bY){this.__dE(bX);qx.lang.Array.insertAt(this.__dz,bX,bY);return this;},remove:function(ca){var cb=this.__dz;if(!cb){return;}if(arguments[1]){var cc;for(var i=0,l=arguments.length;i<l;i++){cc=arguments[i];this.__dF(cc);qx.lang.Array.remove(cb,cc);}}else{this.__dF(ca);qx.lang.Array.remove(cb,ca);}return this;},removeAt:function(cd){var ce=this.__dz;if(!ce){throw new Error("Has no children!");}var cf=ce[cd];if(!cf){throw new Error("Has no child at this position!");}this.__dF(cf);qx.lang.Array.removeAt(this.__dz,cd);return this;},removeAll:function(){var cg=this.__dz;if(cg){for(var i=0,l=cg.length;i<l;i++){this.__dF(cg[i]);}cg.length=0;}return this;},getParent:function(){return this.__dB||null;},insertInto:function(parent,ch){parent.__dE(this);if(ch==null){parent.__dz.push(this);}else{qx.lang.Array.insertAt(this.__dz,this,ch);}return this;},insertBefore:function(ci){var parent=ci.__dB;parent.__dE(this);qx.lang.Array.insertBefore(parent.__dz,this,ci);return this;},insertAfter:function(cj){var parent=cj.__dB;parent.__dE(this);qx.lang.Array.insertAfter(parent.__dz,this,cj);return this;},moveTo:function(ck){var parent=this.__dB;parent.__dG(this);var cl=parent.__dz.indexOf(this);if(cl===ck){throw new Error("Could not move to same index!");}else if(cl<ck){ck--;}qx.lang.Array.removeAt(parent.__dz,cl);qx.lang.Array.insertAt(parent.__dz,this,ck);return this;},moveBefore:function(cm){var parent=this.__dB;return this.moveTo(parent.__dz.indexOf(cm));},moveAfter:function(cn){var parent=this.__dB;return this.moveTo(parent.__dz.indexOf(cn)+1);},free:function(){var parent=this.__dB;if(!parent){throw new Error("Has no parent to remove from.");}if(!parent.__dz){return;}parent.__dF(this);qx.lang.Array.remove(parent.__dz,this);return this;},getDomElement:function(){return this.__dm||null;},getNodeName:function(){return this.__dd;},setNodeName:function(name){this.__dd=name;},setRoot:function(co){this.__dn=co;},useMarkup:function(cp){if(this.__dm){throw new Error("Could not overwrite existing element!");}if(qx.core.Variant.isSet(k,b)){var cq=document.createElement(d);}else{var cq=qx.bom.Element.getHelperElement();}cq.innerHTML=cp;this.useElement(cq.firstChild);return this.__dm;},useElement:function(cr){if(this.__dm){throw new Error("Could not overwrite existing element!");}this.__dm=cr;this.__dm.$$element=this.$$hash;this._copyData(true);},isFocusable:function(){var ct=this.getAttribute(r);if(ct>=1){return true;}var cs=qx.event.handler.Focus.FOCUSABLE_ELEMENTS;if(ct>=0&&cs[this.__dd]){return true;}return false;},setSelectable:qx.core.Variant.select(k,{"webkit":function(cu){this.setAttribute(j,cu?g:h);this.setStyle(v,cu?f:a);},"gecko":function(cv){this.setAttribute(j,cv?g:h);this.setStyle(p,cv?f:u);},"default":function(cw){this.setAttribute(j,cw?g:h);}}),isNativelyFocusable:function(){return !!qx.event.handler.Focus.FOCUSABLE_ELEMENTS[this.__dd];},include:function(){if(this.__do){return;}delete this.__do;if(this.__dB){this.__dB._scheduleChildrenUpdate();}return this;},exclude:function(){if(!this.__do){return;}this.__do=false;if(this.__dB){this.__dB._scheduleChildrenUpdate();}return this;},isIncluded:function(){return this.__do===true;},show:function(){if(this.__dp){return;}if(this.__dm){qx.html.Element._visibility[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}if(this.__dB){this.__dB._scheduleChildrenUpdate();}delete this.__dp;},hide:function(){if(!this.__dp){return;}if(this.__dm){qx.html.Element._visibility[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}this.__dp=false;},isVisible:function(){return this.__dp===true;},scrollChildIntoViewX:function(cx,cy,cz){var cA=this.__dm;var cB=cx.getDomElement();if(cz!==false&&cA&&cA.offsetWidth&&cB&&cB.offsetWidth){qx.bom.element.Scroll.intoViewX(cB,cA,cy);}else{this.__dq={element:cx,align:cy};qx.html.Element._scroll[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}delete this.__ds;},scrollChildIntoViewY:function(cC,cD,cE){var cF=this.__dm;var cG=cC.getDomElement();if(cE!==false&&cF&&cF.offsetWidth&&cG&&cG.offsetWidth){qx.bom.element.Scroll.intoViewY(cG,cF,cD);}else{this.__dr={element:cC,align:cD};qx.html.Element._scroll[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}delete this.__dt;},scrollToX:function(x,cH){var cI=this.__dm;if(cH!==true&&cI&&cI.offsetWidth){cI.scrollLeft=x;}else{this.__ds=x;qx.html.Element._scroll[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}delete this.__dq;},getScrollX:function(){var cJ=this.__dm;if(cJ){return cJ.scrollLeft;}return this.__ds||0;},scrollToY:function(y,cK){var cL=this.__dm;if(cK!==true&&cL&&cL.offsetWidth){cL.scrollTop=y;}else{this.__dt=y;qx.html.Element._scroll[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}delete this.__dr;},getScrollY:function(){var cM=this.__dm;if(cM){return cM.scrollTop;}return this.__dt||0;},disableScrolling:function(){this.enableScrolling();this.scrollToX(0);this.scrollToY(0);this.addListener(F,this.__dI,this);},enableScrolling:function(){this.removeListener(F,this.__dI,this);},__dH:null,__dI:function(e){if(!this.__dH){this.__dH=true;this.__dm.scrollTop=0;this.__dm.scrollLeft=0;delete this.__dH;}},getTextSelection:function(){var cN=this.__dm;if(cN){return qx.bom.Selection.get(cN);}return null;},getTextSelectionLength:function(){var cO=this.__dm;if(cO){return qx.bom.Selection.getLength(cO);}return null;},getTextSelectionStart:function(){var cP=this.__dm;if(cP){return qx.bom.Selection.getStart(cP);}return null;},getTextSelectionEnd:function(){var cQ=this.__dm;if(cQ){return qx.bom.Selection.getEnd(cQ);}return null;},setTextSelection:function(cR,cS){var cT=this.__dm;if(cT){qx.bom.Selection.set(cT,cR,cS);return;}qx.html.Element.__dg[this.toHashCode()]={element:this,start:cR,end:cS};qx.html.Element._scheduleFlush(m);},clearTextSelection:function(){var cU=this.__dm;if(cU){qx.bom.Selection.clear(cU);}delete qx.html.Element.__dg[this.toHashCode()];},__dJ:function(cV,cW){var cX=qx.html.Element._actions;cX.push({type:cV,element:this,args:cW||[]});qx.html.Element._scheduleFlush(m);},focus:function(){this.__dJ(o);},blur:function(){this.__dJ(A);},activate:function(){this.__dJ(C);},deactivate:function(){this.__dJ(z);},capture:function(cY){this.__dJ(w,[cY!==false]);},releaseCapture:function(){this.__dJ(t);},setStyle:function(da,dc,dd){if(!this.__de){this.__de={};}if(this.__de[da]==dc){return;}if(dc==null){delete this.__de[da];}else{this.__de[da]=dc;}if(this.__dm){if(dd){qx.bom.element.Style.set(this.__dm,da,dc);return this;}if(!this.__du){this.__du={};}this.__du[da]=true;qx.html.Element._modified[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}return this;},setStyles:function(de,df){var dg=qx.bom.element.Style;if(!this.__de){this.__de={};}if(this.__dm){if(!this.__du){this.__du={};}for(var di in de){var dh=de[di];if(this.__de[di]==dh){continue;}if(dh==null){delete this.__de[di];}else{this.__de[di]=dh;}if(df){dg.set(this.__dm,di,dh);continue;}this.__du[di]=true;}qx.html.Element._modified[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}else{for(var di in de){var dh=de[di];if(this.__de[di]==dh){continue;}if(dh==null){delete this.__de[di];}else{this.__de[di]=dh;}}}return this;},removeStyle:function(dj,dk){this.setStyle(dj,null,dk);},getStyle:function(dl){return this.__de?this.__de[dl]:null;},getAllStyles:function(){return this.__de||null;},setAttribute:function(dm,dn,dp){if(!this.__df){this.__df={};}if(this.__df[dm]==dn){return;}if(dn==null){delete this.__df[dm];}else{this.__df[dm]=dn;}if(this.__dm){if(dp){qx.bom.element.Attribute.set(this.__dm,dm,dn);return this;}if(!this.__dv){this.__dv={};}this.__dv[dm]=true;qx.html.Element._modified[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}return this;},setAttributes:function(dq,dr){for(var ds in dq){this.setAttribute(ds,dq[ds],dr);}return this;},removeAttribute:function(dt,du){this.setAttribute(dt,null,du);},getAttribute:function(dv){return this.__df?this.__df[dv]:null;},_applyProperty:function(name,dw){},_setProperty:function(dx,dy,dz){if(!this.__dx){this.__dx={};}if(this.__dx[dx]==dy){return;}if(dy==null){delete this.__dx[dx];}else{this.__dx[dx]=dy;}if(this.__dm){if(dz){this._applyProperty(dx,dy);return this;}if(!this.__dw){this.__dw={};}this.__dw[dx]=true;qx.html.Element._modified[this.$$hash]=this;qx.html.Element._scheduleFlush(m);}return this;},_removeProperty:function(dA,dB){this._setProperty(dA,null,dB);},_getProperty:function(dC){var dD=this.__dx;if(!dD){return null;}var dE=dD[dC];return dE==null?null:dE;},addListener:function(dF,dG,self,dH){var dI;if(this.$$disposed){return null;}{};if(this.__dm){return qx.event.Registration.addListener(this.__dm,dF,dG,self,dH);}if(!this.__dy){this.__dy={};}if(dH==null){dH=false;}var dJ=qx.event.Manager.getNextUniqueId();var dK=dF+(dH?D:q)+dJ;this.__dy[dK]={type:dF,listener:dG,self:self,capture:dH,unique:dJ};return dK;},removeListener:function(dL,dM,self,dN){var dO;if(this.$$disposed){return null;}{};if(this.__dm){qx.event.Registration.removeListener(this.__dm,dL,dM,self,dN);}else{var dQ=this.__dy;var dP;if(dN==null){dN=false;}for(var dR in dQ){dP=dQ[dR];if(dP.listener===dM&&dP.self===self&&dP.capture===dN&&dP.type===dL){delete dQ[dR];break;}}}return this;},removeListenerById:function(dS){if(this.$$disposed){return null;}if(this.__dm){qx.event.Registration.removeListenerById(this.__dm,dS);}else{delete this.__dy[dS];}return this;},hasListener:function(dT,dU){if(this.$$disposed){return false;}if(this.__dm){return qx.event.Registration.hasListener(this.__dm,dT,dU);}var dW=this.__dy;var dV;if(dU==null){dU=false;}for(var dX in dW){dV=dW[dX];if(dV.capture===dU&&dV.type===dT){return true;}}return false;}},defer:function(dY){dY.__dK=new qx.util.DeferredCall(dY.flush,dY);},destruct:function(){var ea=this.__dm;if(ea){qx.event.Registration.getManager(ea).removeAllListeners(ea);ea.$$element=c;}if(!qx.core.ObjectRegistry.inShutDown){var parent=this.__dB;if(parent&&!parent.$$disposed){parent.remove(this);}}this._disposeArray(B);this.__df=this.__de=this.__dy=this.__dx=this.__dv=this.__du=this.__dw=this.__dm=this.__dB=this.__dq=this.__dr=null;}});})();(function(){var g="qx.bom.client.Feature",f="CSS1Compat",d="label",c="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",b="input",a="pointerEvents";qx.Bootstrap.define(g,{statics:{STANDARD_MODE:false,QUIRKS_MODE:false,CONTENT_BOX:false,BORDER_BOX:false,SVG:false,CANVAS:!!window.CanvasRenderingContext2D,VML:false,XPATH:!!document.evaluate,AIR:navigator.userAgent.indexOf("adobeair")!==-1,GEARS:!!(window.google&&window.google.gears),SSL:window.location.protocol==="https:",ECMA_OBJECT_COUNT:(({}).__count__==0),CSS_POINTER_EVENTS:false,XUL:false,CSS_TEXT_OVERFLOW:("textOverflow" in document.documentElement.style||"OTextOverflow" in document.documentElement.style),HTML5_CLASSLIST:!!(document.documentElement.classList&&qx.Bootstrap.getClass(document.documentElement.classList)==="DOMTokenList"),TOUCH:("ontouchstart" in window),PLACEHOLDER:false,__gG:function(){this.QUIRKS_MODE=this.__gH();this.STANDARD_MODE=!this.QUIRKS_MODE;this.CONTENT_BOX=!qx.bom.client.Engine.MSHTML||this.STANDARD_MODE;this.BORDER_BOX=!this.CONTENT_BOX;this.SVG=document.implementation&&document.implementation.hasFeature&&(document.implementation.hasFeature("org.w3c.dom.svg","1.0")||document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1"));this.VML=qx.bom.client.Engine.MSHTML;try{document.createElementNS(c,d);this.XUL=true;}catch(e){this.XUL=false;}var i=document.createElement(b);this.PLACEHOLDER="placeholder" in i;if(a in document.documentElement.style){if(qx.bom.client.Engine.OPERA){this.CSS_POINTER_EVENTS=false;}else{this.CSS_POINTER_EVENTS=true;}}},__gH:function(){if(qx.bom.client.Engine.MSHTML&&qx.bom.client.Engine.VERSION>=8){return qx.bom.client.Engine.DOCUMENT_MODE===5;}else{return document.compatMode!==f;}}},defer:function(h){h.__gG();}});})();(function(){var a="qx.event.handler.UserAction";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(b){qx.core.Object.call(this);this.__kB=b;this.__kC=b.getWindow();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{useraction:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_WINDOW,IGNORE_CAN_HANDLE:true},members:{__kB:null,__kC:null,canHandleEvent:function(c,d){},registerEvent:function(e,f,g){},unregisterEvent:function(h,i,j){}},destruct:function(){this.__kB=this.__kC=null;},defer:function(k){qx.event.Registration.addHandler(k);}});})();(function(){var d='ie',c="qx.ui.core.queue.Manager",b="useraction",a="touchend";qx.Class.define(c,{statics:{__lg:false,__lh:{},__li:0,MAX_RETRIES:10,scheduleFlush:function(f){var self=qx.ui.core.queue.Manager;self.__lh[f]=true;if(!self.__lg){self.__ln.schedule();self.__lg=true;}},flush:function(){if(qx.ui.core.queue.Manager.PAUSE){return;}var self=qx.ui.core.queue.Manager;if(self.__lj){return;}self.__lj=true;self.__ln.cancel();var g=self.__lh;self.__lk(function(){while(g.visibility||g.widget||g.appearance||g.layout||g.element){if(g.widget){delete g.widget;qx.ui.core.queue.Widget.flush();}if(g.visibility){delete g.visibility;qx.ui.core.queue.Visibility.flush();}if(g.appearance){delete g.appearance;qx.ui.core.queue.Appearance.flush();}if(g.widget||g.visibility||g.appearance){continue;}if(g.layout){delete g.layout;qx.ui.core.queue.Layout.flush();}if(g.widget||g.visibility||g.appearance||g.layout){continue;}if(g.element){delete g.element;qx.html.Element.flush();}}},function(){self.__lg=false;});self.__lk(function(){if(g.dispose){delete g.dispose;qx.ui.core.queue.Dispose.flush();}},function(){self.__lj=false;});self.__li=0;},__lk:function(h,i){var self=qx.ui.core.queue.Manager;try{h();}catch(e){{};self.__lg=false;self.__lj=false;self.__li+=1;if(qx.bom.client.Browser.NAME==d&&qx.bom.client.Browser.VERSION<=7){i();}if(self.__li<=self.MAX_RETRIES){self.scheduleFlush();}else{throw new Error("Fatal Error: Flush terminated "+(self.__li-1)+" times in a row"+" due to exceptions in user code. The application has to be reloaded!");}throw e;}finally{i();}},__ll:function(e){var j=qx.ui.core.queue.Manager;if(e.getData()==a){j.PAUSE=true;if(j.__lm){window.clearTimeout(j.__lm);}j.__lm=window.setTimeout(function(){j.PAUSE=false;j.__lm=null;j.flush();},500);}else{j.flush();}}},defer:function(k){k.__ln=new qx.util.DeferredCall(k.flush);qx.html.Element._scheduleFlush=k.scheduleFlush;qx.event.Registration.addListener(window,b,qx.bom.client.Feature.TOUCH?k.__ll:k.flush);}});})();(function(){var a="qx.lang.Object";qx.Class.define(a,{statics:{empty:function(b){{};for(var c in b){if(b.hasOwnProperty(c)){delete b[c];}}},isEmpty:(qx.bom.client.Feature.ECMA_OBJECT_COUNT)?function(d){{};return d.__count__===0;}:function(e){{};for(var f in e){return false;}return true;},hasMinLength:(qx.bom.client.Feature.ECMA_OBJECT_COUNT)?function(g,h){{};return g.__count__>=h;}:function(j,k){{};if(k<=0){return true;}var length=0;for(var m in j){if((++length)>=k){return true;}}return false;},getLength:qx.Bootstrap.objectGetLength,getKeys:qx.Bootstrap.getKeys,getKeysAsString:qx.Bootstrap.getKeysAsString,getValues:function(n){{};var p=[];var o=this.getKeys(n);for(var i=0,l=o.length;i<l;i++){p.push(n[o[i]]);}return p;},mergeWith:qx.Bootstrap.objectMergeWith,carefullyMergeWith:function(q,r){{};return qx.lang.Object.mergeWith(q,r,false);},merge:function(s,t){{};var u=arguments.length;for(var i=1;i<u;i++){qx.lang.Object.mergeWith(s,arguments[i]);}return s;},clone:function(v){{};var w={};for(var x in v){w[x]=v[x];}return w;},invert:function(y){{};var z={};for(var A in y){z[y[A].toString()]=A;}return z;},getKeyFromValue:function(B,C){{};for(var D in B){if(B.hasOwnProperty(D)&&B[D]===C){return D;}}return null;},contains:function(E,F){{};return this.getKeyFromValue(E,F)!==null;},select:function(G,H){{};return H[G];},fromArray:function(I){{};var J={};for(var i=0,l=I.length;i<l;i++){{};J[I[i].toString()]=true;}return J;}}});})();(function(){var b="-",a="qx.event.handler.Element";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(c){qx.core.Object.call(this);this._manager=c;this._registeredEvents={};},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{abort:true,scroll:true,select:true,reset:true,submit:true},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:true},members:{canHandleEvent:function(d,e){},registerEvent:function(f,g,h){var k=qx.core.ObjectRegistry.toHashCode(f);var i=k+b+g;var j=qx.lang.Function.listener(this._onNative,this,i);qx.bom.Event.addNativeListener(f,g,j);this._registeredEvents[i]={element:f,type:g,listener:j};},unregisterEvent:function(l,m,n){var q=this._registeredEvents;if(!q){return;}var r=qx.core.ObjectRegistry.toHashCode(l);var o=r+b+m;var p=this._registeredEvents[o];if(p){qx.bom.Event.removeNativeListener(l,m,p.listener);}delete this._registeredEvents[o];},_onNative:qx.event.GlobalError.observeMethod(function(s,t){var v=this._registeredEvents;if(!v){return;}var u=v[t];qx.event.Registration.fireNonBubblingEvent(u.element,u.type,qx.event.type.Native,[s]);})},destruct:function(){var w;var x=this._registeredEvents;for(var y in x){w=x[y];qx.bom.Event.removeNativeListener(w.element,w.type,w.listener);}this._manager=this._registeredEvents=null;},defer:function(z){qx.event.Registration.addHandler(z);}});})();(function(){var e="orientationchange",d="resize",c="landscape",b="portrait",a="qx.event.handler.Orientation";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(f){qx.core.Object.call(this);this.__hU=f;this.__hV=f.getWindow();this._initObserver();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{orientationchange:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_WINDOW,IGNORE_CAN_HANDLE:true},members:{__hU:null,__hV:null,__hW:null,__hX:null,__hY:null,canHandleEvent:function(g,h){},registerEvent:function(i,j,k){},unregisterEvent:function(l,m,n){},_initObserver:function(){this.__hY=qx.lang.Function.listener(this._onNative,this);this.__hW=qx.bom.Event.supportsEvent(this.__hV,e)?e:d;var Event=qx.bom.Event;Event.addNativeListener(this.__hV,this.__hW,this.__hY);},_stopObserver:function(){var Event=qx.bom.Event;Event.removeNativeListener(this.__hV,this.__hW,this.__hY);},_onNative:qx.event.GlobalError.observeMethod(function(o){var q=qx.bom.Viewport;var p=q.getOrientation();if(this.__hX!=p){this.__hX=p;var r=q.isLandscape()?c:b;qx.event.Registration.fireEvent(this.__hV,e,qx.event.type.Orientation,[p,r]);}})},destruct:function(){this._stopObserver();this.__hU=this.__hV=null;},defer:function(s){qx.event.Registration.addHandler(s);}});})();(function(){var t="qx.mobile.emulatetouch",s="touchend",r="touchstart",q="touchmove",p="mousemove",o="touchcancel",n="mouseup",m="mousedown",l="qx.client",k="mshtml",d="qx.event.handler.Touch",j="useraction",h="swipe",c="qx.mobile.nativescroll",b="webkit",g="off",f="tap",i="x",a="y";qx.Class.define(d,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(u){qx.core.Object.call(this);this.__hc=u;this.__hd=u.getWindow();this.__he=this.__hd.document;this._initTouchObserver();this._initMouseObserver();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{touchstart:1,touchmove:1,touchend:1,touchcancel:1,tap:1,swipe:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE+qx.event.IEventHandler.TARGET_DOCUMENT,IGNORE_CAN_HANDLE:true,MOUSE_TO_TOUCH_MAPPING:{"mousedown":"touchstart","mousemove":"touchmove","mouseup":"touchend"},SWIPE_DIRECTION:{x:["left","right"],y:["up","down"]},TAP_MAX_DISTANCE:10,SWIPE_MIN_DISTANCE:11,SWIPE_MIN_VELOCITY:0},members:{__hf:null,__hg:null,__hc:null,__hd:null,__he:null,__hh:null,__hi:null,__hj:null,__hk:null,__hl:false,__hm:null,canHandleEvent:function(v,w){},registerEvent:function(x,y,z){},unregisterEvent:function(A,B,C){},__hn:function(D){var E=qx.bom.Event.getTarget(D);if(qx.core.Variant.isSet(l,b)){if(E&&E.nodeType==3){E=E.parentNode;}}return E;},__ho:function(F,G,H,I){if(!H){H=this.__hn(F);}var G=G||F.type;if(H&&H.nodeType){qx.event.Registration.fireEvent(H,G,I||qx.event.type.Touch,[F,H,null,true,true]);}qx.event.Registration.fireEvent(this.__hd,j,qx.event.type.Data,[G]);},__hp:function(J,K,L){if(!L){L=this.__hn(J);}var K=K||J.type;if(K==r){this.__hq(J,L);}else if(K==q){this.__hr(J,L);}else if(K==s){this.__hs(J,L);}},__hq:function(M,N){var O=M.changedTouches[0];this.__hh=O.screenX;this.__hi=O.screenY;this.__hj=new Date().getTime();this.__hk=M.changedTouches.length===1;},__hr:function(P,Q){if(this.__hk&&P.changedTouches.length>1){this.__hk=false;}},__hs:function(R,S){if(this.__hk){var T=R.changedTouches[0];var V={x:T.screenX-this.__hh,y:T.screenY-this.__hi};var W=qx.event.handler.Touch;if(this.__hm==S&&Math.abs(V.x)<=W.TAP_MAX_DISTANCE&&Math.abs(V.y)<=W.TAP_MAX_DISTANCE){this.__ho(R,f,S,qx.event.type.Tap);}else{var U=this.__ht(R,S,V);if(U){R.swipe=U;this.__ho(R,h,S,qx.event.type.Swipe);}}}},__ht:function(X,Y,ba){var be=qx.event.handler.Touch;var bf=new Date().getTime()-this.__hj;var bh=(Math.abs(ba.x)>=Math.abs(ba.y))?i:a;var bb=ba[bh];var bc=be.SWIPE_DIRECTION[bh][bb<0?0:1];var bg=(bf!==0)?bb/bf:0;var bd=null;if(Math.abs(bg)>=be.SWIPE_MIN_VELOCITY&&Math.abs(bb)>=be.SWIPE_MIN_DISTANCE){bd={startTime:this.__hj,duration:bf,axis:bh,direction:bc,distance:bb,velocity:bg};}return bd;},__hu:qx.core.Variant.select(t,{"on":function(bi){var bj=bi.type;var bl=qx.event.handler.Touch.MOUSE_TO_TOUCH_MAPPING;if(bl[bj]){bj=bl[bj];if(bj==r&&this.__hv(bi)){this.__hl=true;}else if(bj==s){this.__hl=false;}var bm=this.__hw(bi);var bk=(bj==s?[]:[bm]);bi.touches=bk;bi.targetTouches=bk;bi.changedTouches=[bm];}return bj;},"default":qx.lang.Function.empty}),__hv:qx.core.Variant.select(t,{"on":function(bn){if(qx.core.Variant.isSet(l,k)){var bo=1;}else{var bo=0;}return bn.button==bo;},"default":qx.lang.Function.empty}),__hw:qx.core.Variant.select(t,{"on":function(bp){var bq=this.__hn(bp);return {clientX:bp.clientX,clientY:bp.clientY,screenX:bp.screenX,screenY:bp.screenY,pageX:bp.pageX,pageY:bp.pageY,identifier:1,target:bq};},"default":qx.lang.Function.empty}),_initTouchObserver:function(){this.__hf=qx.lang.Function.listener(this._onTouchEvent,this);var Event=qx.bom.Event;Event.addNativeListener(this.__he,r,this.__hf);Event.addNativeListener(this.__he,q,this.__hf);Event.addNativeListener(this.__he,s,this.__hf);Event.addNativeListener(this.__he,o,this.__hf);},_initMouseObserver:qx.core.Variant.select(t,{"on":function(){if(!qx.bom.client.Feature.TOUCH){this.__hg=qx.lang.Function.listener(this._onMouseEvent,this);var Event=qx.bom.Event;Event.addNativeListener(this.__he,m,this.__hg);Event.addNativeListener(this.__he,p,this.__hg);Event.addNativeListener(this.__he,n,this.__hg);}},"default":qx.lang.Function.empty}),_stopTouchObserver:function(){var Event=qx.bom.Event;Event.removeNativeListener(this.__he,r,this.__hf);Event.removeNativeListener(this.__he,q,this.__hf);Event.removeNativeListener(this.__he,s,this.__hf);Event.removeNativeListener(this.__he,o,this.__hf);},_stopMouseObserver:qx.core.Variant.select(t,{"on":function(){if(!qx.bom.client.Feature.TOUCH){var Event=qx.bom.Event;Event.removeNativeListener(this.__he,m,this.__hg);Event.removeNativeListener(this.__he,p,this.__hg);Event.removeNativeListener(this.__he,n,this.__hg);}},"default":qx.lang.Function.empty}),_onTouchEvent:qx.event.GlobalError.observeMethod(function(br){this._commonTouchEventHandler(br);}),_onMouseEvent:qx.core.Variant.select(t,{"on":qx.event.GlobalError.observeMethod(function(bs){if(!qx.bom.client.Feature.TOUCH){if(bs.type==p&&!this.__hl){return;}var bt=this.__hu(bs);this._commonTouchEventHandler(bs,bt);}}),"default":qx.lang.Function.empty}),_commonTouchEventHandler:function(bu,bv){var bv=bv||bu.type;if(bv==r){this.__hm=this.__hn(bu);}this.__ho(bu,bv);this.__hp(bu,bv);}},destruct:function(){this._stopTouchObserver();this._stopMouseObserver();this.__hc=this.__hd=this.__he=this.__hm=null;},defer:function(bw){qx.event.Registration.addHandler(bw);if(qx.bom.client.Feature.TOUCH){if(qx.core.Variant.isSet(c,g)){document.addEventListener(q,function(e){e.preventDefault();});}qx.event.Registration.getManager(document).getHandler(bw);}}});})();(function(){var n="iPod",m="Win32",l="",k="Win64",j="Linux",i="BSD",h="Macintosh",g="iPhone",f="Windows",e="qx.bom.client.Platform",b="iPad",d="X11",c="MacIntel",a="MacPPC";qx.Class.define(e,{statics:{NAME:"",WIN:false,MAC:false,UNIX:false,UNKNOWN_PLATFORM:false,__kH:function(){var o=navigator.platform;if(o==null||o===l){o=navigator.userAgent;}if(o.indexOf(f)!=-1||o.indexOf(m)!=-1||o.indexOf(k)!=-1){this.WIN=true;this.NAME="win";}else if(o.indexOf(h)!=-1||o.indexOf(a)!=-1||o.indexOf(c)!=-1||o.indexOf(n)!=-1||o.indexOf(g)!=-1||o.indexOf(b)!=-1){this.MAC=true;this.NAME="mac";}else if(o.indexOf(d)!=-1||o.indexOf(j)!=-1||o.indexOf(i)!=-1){this.UNIX=true;this.NAME="unix";}else{this.UNKNOWN_PLATFORM=true;this.WIN=true;this.NAME="win";}}},defer:function(p){p.__kH();}});})();(function(){var j="win98",i="osx2",h="osx0",g="osx4",f="win95",e="win2000",d="osx1",c="osx5",b="osx3",a="Windows NT 5.01",I=")",H="winxp",G="freebsd",F="sunos",E="SV1",D="|",C="nintendods",B="winnt4",A="wince",z="winme",q="os9",r="\.",o="osx",p="linux",m="netbsd",n="winvista",k="openbsd",l="(",s="win2003",t="iPad",v="symbian",u="win7",x="g",w="qx.bom.client.System",y=" Mobile/";qx.Bootstrap.define(w,{statics:{NAME:"",SP1:false,SP2:false,WIN95:false,WIN98:false,WINME:false,WINNT4:false,WIN2000:false,WINXP:false,WIN2003:false,WINVISTA:false,WIN7:false,WINCE:false,LINUX:false,SUNOS:false,FREEBSD:false,NETBSD:false,OPENBSD:false,OSX:false,OS9:false,SYMBIAN:false,NINTENDODS:false,PSP:false,IPHONE:false,IPAD:false,UNKNOWN_SYSTEM:false,__lu:{"Windows NT 6.1":u,"Windows NT 6.0":n,"Windows NT 5.2":s,"Windows NT 5.1":H,"Windows NT 5.0":e,"Windows 2000":e,"Windows NT 4.0":B,"Win 9x 4.90":z,"Windows CE":A,"Windows 98":j,"Win98":j,"Windows 95":f,"Win95":f,"Linux":p,"FreeBSD":G,"NetBSD":m,"OpenBSD":k,"SunOS":F,"Symbian System":v,"Nitro":C,"PSP":"sonypsp","Mac OS X 10_5":c,"Mac OS X 10.5":c,"Mac OS X 10_4":g,"Mac OS X 10.4":g,"Mac OS X 10_3":b,"Mac OS X 10.3":b,"Mac OS X 10_2":i,"Mac OS X 10.2":i,"Mac OS X 10_1":d,"Mac OS X 10.1":d,"Mac OS X 10_0":h,"Mac OS X 10.0":h,"Mac OS X":o,"Mac OS 9":q},__lv:function(){var L=navigator.userAgent;var K=[];for(var J in this.__lu){K.push(J);}var M=new RegExp(l+K.join(D).replace(/\./g,r)+I,x);if(!M.test(L)){this.UNKNOWN_SYSTEM=true;if(!qx.bom.client.Platform.UNKNOWN_PLATFORM){if(qx.bom.client.Platform.UNIX){this.NAME="linux";this.LINUX=true;}else if(qx.bom.client.Platform.MAC){this.NAME="osx5";this.OSX=true;}else{this.NAME="winxp";this.WINXP=true;}}else{this.NAME="winxp";this.WINXP=true;}return;}if(qx.bom.client.Engine.WEBKIT&&RegExp(y).test(navigator.userAgent)){if(RegExp(t).test(navigator.userAgent)){this.IPAD=true;this.NAME="ipad";}else{this.IPHONE=true;this.NAME="iphone";}}else{this.NAME=this.__lu[RegExp.$1];this[this.NAME.toUpperCase()]=true;if(qx.bom.client.Platform.WIN){if(L.indexOf(a)!==-1){this.SP1=true;}else if(qx.bom.client.Engine.MSHTML&&L.indexOf(E)!==-1){this.SP2=true;}}}}},defer:function(N){N.__lv();}});})();(function(){var p="mouseup",o="click",n="qx.client",m="mousedown",l="contextmenu",k="mousewheel",j="dblclick",h="mouseover",g="mouseout",f="mousemove",c="on",e="useraction",d="DOMMouseScroll",b="gecko|webkit",a="qx.event.handler.Mouse";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(q){qx.core.Object.call(this);this.__eD=q;this.__eE=q.getWindow();this.__eF=this.__eE.document;this._initButtonObserver();this._initMoveObserver();this._initWheelObserver();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{mousemove:1,mouseover:1,mouseout:1,mousedown:1,mouseup:1,click:1,dblclick:1,contextmenu:1,mousewheel:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:true},members:{__eG:null,__eH:null,__eI:null,__eJ:null,__eK:null,__eD:null,__eE:null,__eF:null,canHandleEvent:function(r,s){},registerEvent:qx.bom.client.System.IPHONE?function(t,u,v){t[c+u]=qx.lang.Function.returnNull;}:qx.lang.Function.returnNull,unregisterEvent:qx.bom.client.System.IPHONE?function(w,x,y){w[c+x]=undefined;}:qx.lang.Function.returnNull,__eL:function(z,A,B){if(!B){B=qx.bom.Event.getTarget(z);}if(B&&B.nodeType){qx.event.Registration.fireEvent(B,A||z.type,A==k?qx.event.type.MouseWheel:qx.event.type.Mouse,[z,B,null,true,true]);}qx.event.Registration.fireEvent(this.__eE,e,qx.event.type.Data,[A||z.type]);},__eM:function(){var D=[this.__eE,this.__eF,this.__eF.body];var E=this.__eE;var C=d;for(var i=0;i<D.length;i++){if(qx.bom.Event.supportsEvent(D[i],k)){C=k;E=D[i];break;}}return {type:C,target:E};},_initButtonObserver:function(){this.__eG=qx.lang.Function.listener(this._onButtonEvent,this);var Event=qx.bom.Event;Event.addNativeListener(this.__eF,m,this.__eG);Event.addNativeListener(this.__eF,p,this.__eG);Event.addNativeListener(this.__eF,o,this.__eG);Event.addNativeListener(this.__eF,j,this.__eG);Event.addNativeListener(this.__eF,l,this.__eG);},_initMoveObserver:function(){this.__eH=qx.lang.Function.listener(this._onMoveEvent,this);var Event=qx.bom.Event;Event.addNativeListener(this.__eF,f,this.__eH);Event.addNativeListener(this.__eF,h,this.__eH);Event.addNativeListener(this.__eF,g,this.__eH);},_initWheelObserver:function(){this.__eI=qx.lang.Function.listener(this._onWheelEvent,this);var F=this.__eM();qx.bom.Event.addNativeListener(F.target,F.type,this.__eI);},_stopButtonObserver:function(){var Event=qx.bom.Event;Event.removeNativeListener(this.__eF,m,this.__eG);Event.removeNativeListener(this.__eF,p,this.__eG);Event.removeNativeListener(this.__eF,o,this.__eG);Event.removeNativeListener(this.__eF,j,this.__eG);Event.removeNativeListener(this.__eF,l,this.__eG);},_stopMoveObserver:function(){var Event=qx.bom.Event;Event.removeNativeListener(this.__eF,f,this.__eH);Event.removeNativeListener(this.__eF,h,this.__eH);Event.removeNativeListener(this.__eF,g,this.__eH);},_stopWheelObserver:function(){var G=this.__eM();qx.bom.Event.removeNativeListener(G.target,G.type,this.__eI);},_onMoveEvent:qx.event.GlobalError.observeMethod(function(H){this.__eL(H);}),_onButtonEvent:qx.event.GlobalError.observeMethod(function(I){var J=I.type;var K=qx.bom.Event.getTarget(I);if(qx.core.Variant.isSet(n,b)){if(K&&K.nodeType==3){K=K.parentNode;}}if(this.__eN){this.__eN(I,J,K);}if(this.__eP){this.__eP(I,J,K);}this.__eL(I,J,K);if(this.__eO){this.__eO(I,J,K);}if(this.__eQ){this.__eQ(I,J,K);}this.__eJ=J;}),_onWheelEvent:qx.event.GlobalError.observeMethod(function(L){this.__eL(L,k);}),__eN:qx.core.Variant.select(n,{"webkit":function(M,N,O){if(qx.bom.client.Engine.VERSION<530){if(N==l){this.__eL(M,p,O);}}},"default":null}),__eO:qx.core.Variant.select(n,{"opera":function(P,Q,R){if(Q==p&&P.button==2){this.__eL(P,l,R);}},"default":null}),__eP:qx.core.Variant.select(n,{"mshtml":function(S,T,U){if(S.target!==undefined){return;}if(T==p&&this.__eJ==o){this.__eL(S,m,U);}else if(T==j){this.__eL(S,o,U);}},"default":null}),__eQ:qx.core.Variant.select(n,{"mshtml":null,"default":function(V,W,X){switch(W){case m:this.__eK=X;break;case p:if(X!==this.__eK){var Y=qx.dom.Hierarchy.getCommonParent(X,this.__eK);this.__eL(V,o,Y);}}}})},destruct:function(){this._stopButtonObserver();this._stopMoveObserver();this._stopWheelObserver();this.__eD=this.__eE=this.__eF=this.__eK=null;},defer:function(ba){qx.event.Registration.addHandler(ba);}});})();(function(){var m="keydown",l="qx.client",k="keypress",j="NumLock",i="keyup",h="Enter",g="0",f="9",e="-",d="PageUp",bu="+",bt="PrintScreen",bs="gecko",br="A",bq="Z",bp="Left",bo="F5",bn="Down",bm="Up",bl="F11",t="F6",u="useraction",r="F3",s="keyinput",p="Insert",q="F8",n="End",o="/",B="Delete",C="*",O="cmd",K="F1",W="F4",R="Home",bh="F2",bc="F12",G="PageDown",bk="F7",bj="Win",bi="F9",F="F10",I="Right",J="text",M="Escape",P="webkit",S="5",Y="3",be="Meta",v="7",w="CapsLock",H="input",V="Control",U="Space",T="Tab",bb="Shift",ba="Pause",Q="Unidentified",X="qx.event.handler.Keyboard",a="mshtml|webkit",bd="6",x="off",y="Apps",L="4",b="Alt",c="mshtml",E="2",z="Scroll",A="1",D="8",N="autoComplete",bg=",",bf="Backspace";qx.Class.define(X,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(bv){qx.core.Object.call(this);this.__gO=bv;this.__gP=bv.getWindow();if(qx.core.Variant.isSet(l,bs)){this.__gQ=this.__gP;}else{this.__gQ=this.__gP.document.documentElement;}this.__gR={};this._initKeyObserver();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{keyup:1,keydown:1,keypress:1,keyinput:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:true,isValidKeyIdentifier:function(bw){if(this._identifierToKeyCodeMap[bw]){return true;}if(bw.length!=1){return false;}if(bw>=g&&bw<=f){return true;}if(bw>=br&&bw<=bq){return true;}switch(bw){case bu:case e:case C:case o:return true;default:return false;}}},members:{__gS:null,__gO:null,__gP:null,__gQ:null,__gR:null,__gT:null,__gU:null,__gV:null,canHandleEvent:function(bx,by){},registerEvent:function(bz,bA,bB){},unregisterEvent:function(bC,bD,bE){},_fireInputEvent:function(bF,bG){var bH=this.__gW();if(bH&&bH.offsetWidth!=0){var event=qx.event.Registration.createEvent(s,qx.event.type.KeyInput,[bF,bH,bG]);this.__gO.dispatchEvent(bH,event);}if(this.__gP){qx.event.Registration.fireEvent(this.__gP,u,qx.event.type.Data,[s]);}},_fireSequenceEvent:function(bI,bJ,bK){var bL=this.__gW();var bM=bI.keyCode;var event=qx.event.Registration.createEvent(bJ,qx.event.type.KeySequence,[bI,bL,bK]);this.__gO.dispatchEvent(bL,event);if(qx.core.Variant.isSet(l,a)){if(bJ==m&&event.getDefaultPrevented()){if(!this._isNonPrintableKeyCode(bM)&&!this._emulateKeyPress[bM]){this._fireSequenceEvent(bI,k,bK);}}}if(this.__gP){qx.event.Registration.fireEvent(this.__gP,u,qx.event.type.Data,[bJ]);}},__gW:function(){var bN=this.__gO.getHandler(qx.event.handler.Focus);var bO=bN.getActive();if(!bO||bO.offsetWidth==0){bO=bN.getFocus();}if(!bO||bO.offsetWidth==0){bO=this.__gO.getWindow().document.body;}return bO;},_initKeyObserver:function(){this.__gS=qx.lang.Function.listener(this.__gX,this);this.__gV=qx.lang.Function.listener(this.__ha,this);var Event=qx.bom.Event;Event.addNativeListener(this.__gQ,i,this.__gS);Event.addNativeListener(this.__gQ,m,this.__gS);Event.addNativeListener(this.__gQ,k,this.__gV);},_stopKeyObserver:function(){var Event=qx.bom.Event;Event.removeNativeListener(this.__gQ,i,this.__gS);Event.removeNativeListener(this.__gQ,m,this.__gS);Event.removeNativeListener(this.__gQ,k,this.__gV);for(var bQ in (this.__gU||{})){var bP=this.__gU[bQ];Event.removeNativeListener(bP.target,k,bP.callback);}delete (this.__gU);},__gX:qx.event.GlobalError.observeMethod(qx.core.Variant.select(l,{"mshtml":function(bR){bR=window.event||bR;var bU=bR.keyCode;var bS=0;var bT=bR.type;if(!(this.__gR[bU]==m&&bT==m)){this._idealKeyHandler(bU,bS,bT,bR);}if(bT==m){if(this._isNonPrintableKeyCode(bU)||this._emulateKeyPress[bU]){this._idealKeyHandler(bU,bS,k,bR);}}this.__gR[bU]=bT;},"gecko":function(bV){var ca=this._keyCodeFix[bV.keyCode]||bV.keyCode;var bX=0;var bY=bV.type;if(qx.bom.client.Platform.WIN){var bW=ca?this._keyCodeToIdentifier(ca):this._charCodeToIdentifier(bX);if(!(this.__gR[bW]==m&&bY==m)){this._idealKeyHandler(ca,bX,bY,bV);}this.__gR[bW]=bY;}else{this._idealKeyHandler(ca,bX,bY,bV);}this.__gY(bV.target,bY,ca);},"webkit":function(cb){var ce=0;var cc=0;var cd=cb.type;if(qx.bom.client.Engine.VERSION<525.13){if(cd==i||cd==m){ce=this._charCode2KeyCode[cb.charCode]||cb.keyCode;}else{if(this._charCode2KeyCode[cb.charCode]){ce=this._charCode2KeyCode[cb.charCode];}else{cc=cb.charCode;}}this._idealKeyHandler(ce,cc,cd,cb);}else{ce=cb.keyCode;this._idealKeyHandler(ce,cc,cd,cb);if(cd==m){if(this._isNonPrintableKeyCode(ce)||this._emulateKeyPress[ce]){this._idealKeyHandler(ce,cc,k,cb);}}this.__gR[ce]=cd;}},"opera":function(cf){this.__gT=cf.keyCode;this._idealKeyHandler(cf.keyCode,0,cf.type,cf);}})),__gY:qx.core.Variant.select(l,{"gecko":function(cg,ch,ci){if(ch===m&&(ci==33||ci==34||ci==38||ci==40)&&cg.type==J&&cg.tagName.toLowerCase()===H&&cg.getAttribute(N)!==x){if(!this.__gU){this.__gU={};}var ck=qx.core.ObjectRegistry.toHashCode(cg);if(this.__gU[ck]){return;}var self=this;this.__gU[ck]={target:cg,callback:function(cl){qx.bom.Event.stopPropagation(cl);self.__ha(cl);}};var cj=qx.event.GlobalError.observeMethod(this.__gU[ck].callback);qx.bom.Event.addNativeListener(cg,k,cj);}},"default":null}),__ha:qx.event.GlobalError.observeMethod(qx.core.Variant.select(l,{"mshtml":function(cm){cm=window.event||cm;if(this._charCode2KeyCode[cm.keyCode]){this._idealKeyHandler(this._charCode2KeyCode[cm.keyCode],0,cm.type,cm);}else{this._idealKeyHandler(0,cm.keyCode,cm.type,cm);}},"gecko":function(cn){var cq=this._keyCodeFix[cn.keyCode]||cn.keyCode;var co=cn.charCode;var cp=cn.type;this._idealKeyHandler(cq,co,cp,cn);},"webkit":function(cr){if(qx.bom.client.Engine.VERSION<525.13){var cu=0;var cs=0;var ct=cr.type;if(ct==i||ct==m){cu=this._charCode2KeyCode[cr.charCode]||cr.keyCode;}else{if(this._charCode2KeyCode[cr.charCode]){cu=this._charCode2KeyCode[cr.charCode];}else{cs=cr.charCode;}}this._idealKeyHandler(cu,cs,ct,cr);}else{if(this._charCode2KeyCode[cr.keyCode]){this._idealKeyHandler(this._charCode2KeyCode[cr.keyCode],0,cr.type,cr);}else{this._idealKeyHandler(0,cr.keyCode,cr.type,cr);}}},"opera":function(cv){var cx=cv.keyCode;var cw=cv.type;if(cx!=this.__gT){this._idealKeyHandler(0,this.__gT,cw,cv);}else{if(this._keyCodeToIdentifierMap[cv.keyCode]){this._idealKeyHandler(cv.keyCode,0,cv.type,cv);}else{this._idealKeyHandler(0,cv.keyCode,cv.type,cv);}}}})),_idealKeyHandler:function(cy,cz,cA,cB){var cC;if(cy||(!cy&&!cz)){cC=this._keyCodeToIdentifier(cy);this._fireSequenceEvent(cB,cA,cC);}else{cC=this._charCodeToIdentifier(cz);this._fireSequenceEvent(cB,k,cC);this._fireInputEvent(cB,cz);}},_specialCharCodeMap:{8:bf,9:T,13:h,27:M,32:U},_emulateKeyPress:qx.core.Variant.select(l,{"mshtml":{8:true,9:true},"webkit":{8:true,9:true,27:true},"default":{}}),_keyCodeToIdentifierMap:{16:bb,17:V,18:b,20:w,224:be,37:bp,38:bm,39:I,40:bn,33:d,34:G,35:n,36:R,45:p,46:B,112:K,113:bh,114:r,115:W,116:bo,117:t,118:bk,119:q,120:bi,121:F,122:bl,123:bc,144:j,44:bt,145:z,19:ba,91:qx.bom.client.Platform.MAC?O:bj,92:bj,93:qx.bom.client.Platform.MAC?O:y},_numpadToCharCode:{96:g.charCodeAt(0),97:A.charCodeAt(0),98:E.charCodeAt(0),99:Y.charCodeAt(0),100:L.charCodeAt(0),101:S.charCodeAt(0),102:bd.charCodeAt(0),103:v.charCodeAt(0),104:D.charCodeAt(0),105:f.charCodeAt(0),106:C.charCodeAt(0),107:bu.charCodeAt(0),109:e.charCodeAt(0),110:bg.charCodeAt(0),111:o.charCodeAt(0)},_charCodeA:br.charCodeAt(0),_charCodeZ:bq.charCodeAt(0),_charCode0:g.charCodeAt(0),_charCode9:f.charCodeAt(0),_isNonPrintableKeyCode:function(cD){return this._keyCodeToIdentifierMap[cD]?true:false;},_isIdentifiableKeyCode:function(cE){if(cE>=this._charCodeA&&cE<=this._charCodeZ){return true;}if(cE>=this._charCode0&&cE<=this._charCode9){return true;}if(this._specialCharCodeMap[cE]){return true;}if(this._numpadToCharCode[cE]){return true;}if(this._isNonPrintableKeyCode(cE)){return true;}return false;},_keyCodeToIdentifier:function(cF){if(this._isIdentifiableKeyCode(cF)){var cG=this._numpadToCharCode[cF];if(cG){return String.fromCharCode(cG);}return (this._keyCodeToIdentifierMap[cF]||this._specialCharCodeMap[cF]||String.fromCharCode(cF));}else{return Q;}},_charCodeToIdentifier:function(cH){return this._specialCharCodeMap[cH]||String.fromCharCode(cH).toUpperCase();},_identifierToKeyCode:function(cI){return qx.event.handler.Keyboard._identifierToKeyCodeMap[cI]||cI.charCodeAt(0);}},destruct:function(){this._stopKeyObserver();this.__gT=this.__gO=this.__gP=this.__gQ=this.__gR=null;},defer:function(cJ,cK){qx.event.Registration.addHandler(cJ);if(!cJ._identifierToKeyCodeMap){cJ._identifierToKeyCodeMap={};for(var cL in cK._keyCodeToIdentifierMap){cJ._identifierToKeyCodeMap[cK._keyCodeToIdentifierMap[cL]]=parseInt(cL,10);}for(var cL in cK._specialCharCodeMap){cJ._identifierToKeyCodeMap[cK._specialCharCodeMap[cL]]=parseInt(cL,10);}}if(qx.core.Variant.isSet(l,c)){cK._charCode2KeyCode={13:13,27:27};}else if(qx.core.Variant.isSet(l,bs)){cK._keyCodeFix={12:cK._identifierToKeyCode(j)};}else if(qx.core.Variant.isSet(l,P)){if(qx.bom.client.Engine.VERSION<525.13){cK._charCode2KeyCode={63289:cK._identifierToKeyCode(j),63276:cK._identifierToKeyCode(d),63277:cK._identifierToKeyCode(G),63275:cK._identifierToKeyCode(n),63273:cK._identifierToKeyCode(R),63234:cK._identifierToKeyCode(bp),63232:cK._identifierToKeyCode(bm),63235:cK._identifierToKeyCode(I),63233:cK._identifierToKeyCode(bn),63272:cK._identifierToKeyCode(B),63302:cK._identifierToKeyCode(p),63236:cK._identifierToKeyCode(K),63237:cK._identifierToKeyCode(bh),63238:cK._identifierToKeyCode(r),63239:cK._identifierToKeyCode(W),63240:cK._identifierToKeyCode(bo),63241:cK._identifierToKeyCode(t),63242:cK._identifierToKeyCode(bk),63243:cK._identifierToKeyCode(q),63244:cK._identifierToKeyCode(bi),63245:cK._identifierToKeyCode(F),63246:cK._identifierToKeyCode(bl),63247:cK._identifierToKeyCode(bc),63248:cK._identifierToKeyCode(bt),3:cK._identifierToKeyCode(h),12:cK._identifierToKeyCode(j),13:cK._identifierToKeyCode(h)};}else{cK._charCode2KeyCode={13:13,27:27};}}}});})();(function(){var a="qx.event.handler.Capture";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{capture:true,losecapture:true},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:true},members:{canHandleEvent:function(b,c){},registerEvent:function(d,e,f){},unregisterEvent:function(g,h,i){}},defer:function(j){qx.event.Registration.addHandler(j);}});})();(function(){var k="alias",j="copy",i="blur",h="mouseout",g="keydown",f="Ctrl",d="Shift",c="mousemove",b="move",a="mouseover",A="Alt",z="keyup",y="mouseup",x="dragend",w="on",v="mousedown",u="qxDraggable",t="drag",s="drop",r="qxDroppable",p="qx.event.handler.DragDrop",q="droprequest",n="dragstart",o="dragchange",l="dragleave",m="dragover";qx.Class.define(p,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(B){qx.core.Object.call(this);this.__jt=B;this.__ju=B.getWindow().document.documentElement;this.__jt.addListener(this.__ju,v,this._onMouseDown,this);this.__jG();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{dragstart:1,dragend:1,dragover:1,dragleave:1,drop:1,drag:1,dragchange:1,droprequest:1},IGNORE_CAN_HANDLE:true},members:{__jt:null,__ju:null,__jv:null,__jw:null,__jx:null,__jy:null,__jz:null,__jA:null,__jB:null,__jC:null,__jD:false,__jE:0,__jF:0,canHandleEvent:function(C,D){},registerEvent:function(E,F,G){},unregisterEvent:function(H,I,J){},addType:function(K){this.__jx[K]=true;},addAction:function(L){this.__jy[L]=true;},supportsType:function(M){return !!this.__jx[M];},supportsAction:function(N){return !!this.__jy[N];},getData:function(O){if(!this.__jN||!this.__jv){throw new Error("This method must not be used outside the drop event listener!");}if(!this.__jx[O]){throw new Error("Unsupported data type: "+O+"!");}if(!this.__jA[O]){this.__jB=O;this.__jI(q,this.__jw,this.__jv,false);}if(!this.__jA[O]){throw new Error("Please use a droprequest listener to the drag source to fill the manager with data!");}return this.__jA[O]||null;},getCurrentAction:function(){return this.__jC;},addData:function(P,Q){this.__jA[P]=Q;},getCurrentType:function(){return this.__jB;},isSessionActive:function(){return this.__jD;},__jG:function(){this.__jx={};this.__jy={};this.__jz={};this.__jA={};},__jH:function(){if(this.__jw==null){return;}var T=this.__jy;var R=this.__jz;var S=null;if(this.__jN){if(R.Shift&&R.Ctrl&&T.alias){S=k;}else if(R.Shift&&R.Alt&&T.copy){S=j;}else if(R.Shift&&T.move){S=b;}else if(R.Alt&&T.alias){S=k;}else if(R.Ctrl&&T.copy){S=j;}else if(T.move){S=b;}else if(T.copy){S=j;}else if(T.alias){S=k;}}if(S!=this.__jC){this.__jC=S;this.__jI(o,this.__jw,this.__jv,false);}},__jI:function(U,V,W,X,Y){var bb=qx.event.Registration;var ba=bb.createEvent(U,qx.event.type.Drag,[X,Y]);if(V!==W){ba.setRelatedTarget(W);}return bb.dispatchEvent(V,ba);},__jJ:function(bc){while(bc&&bc.nodeType==1){if(bc.getAttribute(u)==w){return bc;}bc=bc.parentNode;}return null;},__jK:function(bd){while(bd&&bd.nodeType==1){if(bd.getAttribute(r)==w){return bd;}bd=bd.parentNode;}return null;},__jL:function(){this.__jw=null;this.__jt.removeListener(this.__ju,c,this._onMouseMove,this,true);this.__jt.removeListener(this.__ju,y,this._onMouseUp,this,true);qx.event.Registration.removeListener(window,i,this._onWindowBlur,this);this.__jG();},__jM:function(){if(this.__jD){this.__jt.removeListener(this.__ju,a,this._onMouseOver,this,true);this.__jt.removeListener(this.__ju,h,this._onMouseOut,this,true);this.__jt.removeListener(this.__ju,g,this._onKeyDown,this,true);this.__jt.removeListener(this.__ju,z,this._onKeyUp,this,true);this.__jI(x,this.__jw,this.__jv,false);this.__jD=false;}this.__jN=false;this.__jv=null;this.__jL();},__jN:false,_onWindowBlur:function(e){this.__jM();},_onKeyDown:function(e){var be=e.getKeyIdentifier();switch(be){case A:case f:case d:if(!this.__jz[be]){this.__jz[be]=true;this.__jH();}}},_onKeyUp:function(e){var bf=e.getKeyIdentifier();switch(bf){case A:case f:case d:if(this.__jz[bf]){this.__jz[bf]=false;this.__jH();}}},_onMouseDown:function(e){if(this.__jD){return;}var bg=this.__jJ(e.getTarget());if(bg){this.__jE=e.getDocumentLeft();this.__jF=e.getDocumentTop();this.__jw=bg;this.__jt.addListener(this.__ju,c,this._onMouseMove,this,true);this.__jt.addListener(this.__ju,y,this._onMouseUp,this,true);qx.event.Registration.addListener(window,i,this._onWindowBlur,this);}},_onMouseUp:function(e){if(this.__jN){this.__jI(s,this.__jv,this.__jw,false,e);}if(this.__jD){e.stopPropagation();}this.__jM();},_onMouseMove:function(e){if(this.__jD){if(!this.__jI(t,this.__jw,this.__jv,true,e)){this.__jM();}}else{if(Math.abs(e.getDocumentLeft()-this.__jE)>3||Math.abs(e.getDocumentTop()-this.__jF)>3){if(this.__jI(n,this.__jw,this.__jv,true,e)){this.__jD=true;this.__jt.addListener(this.__ju,a,this._onMouseOver,this,true);this.__jt.addListener(this.__ju,h,this._onMouseOut,this,true);this.__jt.addListener(this.__ju,g,this._onKeyDown,this,true);this.__jt.addListener(this.__ju,z,this._onKeyUp,this,true);var bh=this.__jz;bh.Ctrl=e.isCtrlPressed();bh.Shift=e.isShiftPressed();bh.Alt=e.isAltPressed();this.__jH();}else{this.__jI(x,this.__jw,this.__jv,false);this.__jL();}}}},_onMouseOver:function(e){var bi=e.getTarget();var bj=this.__jK(bi);if(bj&&bj!=this.__jv){this.__jN=this.__jI(m,bj,this.__jw,true,e);this.__jv=bj;this.__jH();}},_onMouseOut:function(e){var bl=this.__jK(e.getTarget());var bk=this.__jK(e.getRelatedTarget());if(bl&&bl!==bk&&bl==this.__jv){this.__jI(l,this.__jv,bk,false,e);this.__jv=null;this.__jN=false;qx.event.Timer.once(this.__jH,this,0);}}},destruct:function(){this.__jw=this.__jv=this.__jt=this.__ju=this.__jx=this.__jy=this.__jz=this.__jA=null;},defer:function(bm){qx.event.Registration.addHandler(bm);}});})();(function(){var c="qx.event.handler.Appear",b="disappear",a="appear";qx.Class.define(c,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(d){qx.core.Object.call(this);this.__cl=d;this.__cm={};qx.event.handler.Appear.__cn[this.$$hash]=this;},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{appear:true,disappear:true},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:true,__cn:{},refresh:function(){var e=this.__cn;for(var f in e){e[f].refresh();}}},members:{__cl:null,__cm:null,canHandleEvent:function(g,h){},registerEvent:function(i,j,k){var l=qx.core.ObjectRegistry.toHashCode(i)+j;var m=this.__cm;if(m&&!m[l]){m[l]=i;i.$$displayed=i.offsetWidth>0;}},unregisterEvent:function(n,o,p){var q=qx.core.ObjectRegistry.toHashCode(n)+o;var r=this.__cm;if(!r){return;}if(r[q]){delete r[q];}},refresh:function(){var v=this.__cm;var w;for(var u in v){w=v[u];var s=w.offsetWidth>0;if((!!w.$$displayed)!==s){w.$$displayed=s;var t=qx.event.Registration.createEvent(s?a:b);this.__cl.dispatchEvent(w,t);}}}},destruct:function(){this.__cl=this.__cm=null;delete qx.event.handler.Appear.__cn[this.$$hash];},defer:function(x){qx.event.Registration.addHandler(x);}});})();(function(){var b="abstract",a="qx.event.dispatch.AbstractBubbling";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventDispatcher,type:b,construct:function(c){this._manager=c;},members:{_getParent:function(d){throw new Error("Missing implementation");},canDispatchEvent:function(e,event,f){return event.getBubbles();},dispatchEvent:function(g,event,h){var parent=g;var s=this._manager;var p,w;var n;var r,u;var t;var v=[];p=s.getListeners(g,h,true);w=s.getListeners(g,h,false);if(p){v.push(p);}if(w){v.push(w);}var parent=this._getParent(g);var l=[];var k=[];var m=[];var q=[];while(parent!=null){p=s.getListeners(parent,h,true);if(p){m.push(p);q.push(parent);}w=s.getListeners(parent,h,false);if(w){l.push(w);k.push(parent);}parent=this._getParent(parent);}event.setEventPhase(qx.event.type.Event.CAPTURING_PHASE);for(var i=m.length-1;i>=0;i--){t=q[i];event.setCurrentTarget(t);n=m[i];for(var j=0,o=n.length;j<o;j++){r=n[j];u=r.context||t;r.handler.call(u,event);}if(event.getPropagationStopped()){return;}}event.setEventPhase(qx.event.type.Event.AT_TARGET);event.setCurrentTarget(g);for(var i=0,x=v.length;i<x;i++){n=v[i];for(var j=0,o=n.length;j<o;j++){r=n[j];u=r.context||g;r.handler.call(u,event);}if(event.getPropagationStopped()){return;}}event.setEventPhase(qx.event.type.Event.BUBBLING_PHASE);for(var i=0,x=l.length;i<x;i++){t=k[i];event.setCurrentTarget(t);n=l[i];for(var j=0,o=n.length;j<o;j++){r=n[j];u=r.context||t;r.handler.call(u,event);}if(event.getPropagationStopped()){return;}}}}});})();(function(){var a="qx.event.dispatch.DomBubbling";qx.Class.define(a,{extend:qx.event.dispatch.AbstractBubbling,statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL},members:{_getParent:function(b){return b.parentNode;},canDispatchEvent:function(c,event,d){return c.nodeType!==undefined&&event.getBubbles();}},defer:function(e){qx.event.Registration.addDispatcher(e);}});})();(function(){var q="mshtml",p="",o="qx.client",n=" ",m=">",k="<",h="='",g="none",f="<INPUT TYPE='RADIO' NAME='RADIOTEST' VALUE='Second Choice'>",d="qx.bom.Element",a="' ",c="div",b="></";qx.Class.define(d,{statics:{__kI:{"onload":true,"onpropertychange":true,"oninput":true,"onchange":true,"name":true,"type":true,"checked":true,"disabled":true},__kJ:{},__kK:{},allowCreationWithMarkup:function(r){if(!r){r=window;}var s=r.location.href;if(qx.bom.Element.__kK[s]==undefined){try{r.document.createElement(f);qx.bom.Element.__kK[s]=true;}catch(e){qx.bom.Element.__kK[s]=false;}}return qx.bom.Element.__kK[s];},getHelperElement:function(t){if(!t){t=window;}var v=t.location.href;if(!qx.bom.Element.__kJ[v]){var u=qx.bom.Element.__kJ[v]=t.document.createElement(c);if(qx.bom.client.Engine.WEBKIT){u.style.display=g;t.document.body.appendChild(u);}}return qx.bom.Element.__kJ[v];},create:function(name,w,x){if(!x){x=window;}if(!name){throw new Error("The tag name is missing!");}var z=this.__kI;var y=p;for(var B in w){if(z[B]){y+=B+h+w[B]+a;}}var C;if(y!=p){if(qx.bom.Element.allowCreationWithMarkup(x)){C=x.document.createElement(k+name+n+y+m);}else{var A=qx.bom.Element.getHelperElement(x);A.innerHTML=k+name+n+y+b+name+m;C=A.firstChild;}}else{C=x.document.createElement(name);}for(var B in w){if(!z[B]){qx.bom.element.Attribute.set(C,B,w[B]);}}return C;},empty:function(D){return D.innerHTML=p;},addListener:function(E,F,G,self,H){return qx.event.Registration.addListener(E,F,G,self,H);},removeListener:function(I,J,K,self,L){return qx.event.Registration.removeListener(I,J,K,self,L);},removeListenerById:function(M,N){return qx.event.Registration.removeListenerById(M,N);},hasListener:function(O,P,Q){return qx.event.Registration.hasListener(O,P,Q);},focus:function(R){qx.event.Registration.getManager(R).getHandler(qx.event.handler.Focus).focus(R);},blur:function(S){qx.event.Registration.getManager(S).getHandler(qx.event.handler.Focus).blur(S);},activate:function(T){qx.event.Registration.getManager(T).getHandler(qx.event.handler.Focus).activate(T);},deactivate:function(U){qx.event.Registration.getManager(U).getHandler(qx.event.handler.Focus).deactivate(U);},capture:function(V,W){qx.event.Registration.getManager(V).getDispatcher(qx.event.dispatch.MouseCapture).activateCapture(V,W);},releaseCapture:function(X){qx.event.Registration.getManager(X).getDispatcher(qx.event.dispatch.MouseCapture).releaseCapture(X);},matchesSelector:function(Y,ba){if(ba){return qx.bom.Selector.query(ba,Y.parentNode).length>0;}else{return false;}},clone:function(bb,bc){var bf;if(bc||(qx.core.Variant.isSet(o,q)&&!qx.xml.Document.isXmlDocument(bb))){var bj=qx.event.Registration.getManager(bb);var bd=qx.dom.Hierarchy.getDescendants(bb);bd.push(bb);}if(qx.core.Variant.isSet(o,q)){for(var i=0,l=bd.length;i<l;i++){bj.toggleAttachedEvents(bd[i],false);}}var bf=bb.cloneNode(true);if(qx.core.Variant.isSet(o,q)){for(var i=0,l=bd.length;i<l;i++){bj.toggleAttachedEvents(bd[i],true);}}if(bc===true){var bm=qx.dom.Hierarchy.getDescendants(bf);bm.push(bf);var be,bh,bl,bg;for(var i=0,bk=bd.length;i<bk;i++){bl=bd[i];be=bj.serializeListeners(bl);if(be.length>0){bh=bm[i];for(var j=0,bi=be.length;j<bi;j++){bg=be[j];bj.addListener(bh,bg.type,bg.handler,bg.self,bg.capture);}}}}return bf;}}});})();(function(){var a="qx.event.type.Native";qx.Class.define(a,{extend:qx.event.type.Event,members:{init:function(b,c,d,e,f){qx.event.type.Event.prototype.init.call(this,e,f);this._target=c||qx.bom.Event.getTarget(b);this._relatedTarget=d||qx.bom.Event.getRelatedTarget(b);if(b.timeStamp){this._timeStamp=b.timeStamp;}this._native=b;this._returnValue=null;return this;},clone:function(g){var h=qx.event.type.Event.prototype.clone.call(this,g);var i={};h._native=this._cloneNativeEvent(this._native,i);h._returnValue=this._returnValue;return h;},_cloneNativeEvent:function(j,k){k.preventDefault=qx.lang.Function.empty;return k;},preventDefault:function(){qx.event.type.Event.prototype.preventDefault.call(this);qx.bom.Event.preventDefault(this._native);},getNativeEvent:function(){return this._native;},setReturnValue:function(l){this._returnValue=l;},getReturnValue:function(){return this._returnValue;}},destruct:function(){this._native=this._returnValue=null;}});})();(function(){var b="qx.client",a="qx.bom.Viewport";qx.Class.define(a,{statics:{getWidth:qx.core.Variant.select(b,{"opera":function(c){if(qx.bom.client.Engine.VERSION<9.5){return (c||window).document.body.clientWidth;}else{var d=(c||window).document;return qx.bom.Document.isStandardMode(c)?d.documentElement.clientWidth:d.body.clientWidth;}},"webkit":function(e){if(qx.bom.client.Engine.VERSION<523.15){return (e||window).innerWidth;}else{var f=(e||window).document;return qx.bom.Document.isStandardMode(e)?f.documentElement.clientWidth:f.body.clientWidth;}},"default":function(g){var h=(g||window).document;return qx.bom.Document.isStandardMode(g)?h.documentElement.clientWidth:h.body.clientWidth;}}),getHeight:qx.core.Variant.select(b,{"opera":function(i){if(qx.bom.client.Engine.VERSION<9.5){return (i||window).document.body.clientHeight;}else{var j=(i||window).document;return qx.bom.Document.isStandardMode(i)?j.documentElement.clientHeight:j.body.clientHeight;}},"webkit":function(k){if(qx.bom.client.Engine.VERSION<523.15){return (k||window).innerHeight;}else{var l=(k||window).document;return qx.bom.Document.isStandardMode(k)?l.documentElement.clientHeight:l.body.clientHeight;}},"default":function(m){var n=(m||window).document;return qx.bom.Document.isStandardMode(m)?n.documentElement.clientHeight:n.body.clientHeight;}}),getScrollLeft:qx.core.Variant.select(b,{"mshtml":function(o){var p=(o||window).document;return p.documentElement.scrollLeft||p.body.scrollLeft;},"default":function(q){return (q||window).pageXOffset;}}),getScrollTop:qx.core.Variant.select(b,{"mshtml":function(r){var s=(r||window).document;return s.documentElement.scrollTop||s.body.scrollTop;},"default":function(t){return (t||window).pageYOffset;}}),getOrientation:function(u){var v=(u||window).orientation;if(v==null){v=this.getWidth(u)>this.getHeight(u)?90:0;}return v;},isLandscape:function(w){return Math.abs(this.getOrientation(w))==90;},isPortrait:function(x){var y=this.getOrientation(x);return (y==0||y==180);}}});})();(function(){var f="CSS1Compat",e="position:absolute;width:0;height:0;width:1",d="qx.bom.Document",c="1px",b="qx.client",a="div";qx.Class.define(d,{statics:{isQuirksMode:qx.core.Variant.select(b,{"mshtml":function(g){if(qx.bom.client.Engine.VERSION>=8){return (g||window).document.documentMode===5;}else{return (g||window).document.compatMode!==f;}},"webkit":function(h){if(document.compatMode===undefined){var i=(h||window).document.createElement(a);i.style.cssText=e;return i.style.width===c?true:false;}else{return (h||window).document.compatMode!==f;}},"default":function(j){return (j||window).document.compatMode!==f;}}),isStandardMode:function(k){return !this.isQuirksMode(k);},getWidth:function(l){var m=(l||window).document;var n=qx.bom.Viewport.getWidth(l);var scroll=this.isStandardMode(l)?m.documentElement.scrollWidth:m.body.scrollWidth;return Math.max(scroll,n);},getHeight:function(o){var p=(o||window).document;var q=qx.bom.Viewport.getHeight(o);var scroll=this.isStandardMode(o)?p.documentElement.scrollHeight:p.body.scrollHeight;return Math.max(scroll,q);}}});})();(function(){var c="landscape",b="qx.event.type.Orientation",a="portrait";qx.Class.define(b,{extend:qx.event.type.Event,members:{__eB:null,__eC:null,init:function(d,e){qx.event.type.Event.prototype.init.call(this,false,false);this.__eB=d;this.__eC=e;return this;},clone:function(f){var g=qx.event.type.Event.prototype.clone.call(this,f);g.__eB=this.__eB;g.__eC=this.__eC;return g;},getOrientation:function(){return this.__eB;},isLandscape:function(){return this.__eC==c;},isPortrait:function(){return this.__eC==a;}}});})();(function(){var a="qx.event.type.Dom";qx.Class.define(a,{extend:qx.event.type.Native,statics:{SHIFT_MASK:1,CTRL_MASK:2,ALT_MASK:4,META_MASK:8},members:{_cloneNativeEvent:function(b,c){var c=qx.event.type.Native.prototype._cloneNativeEvent.call(this,b,c);c.shiftKey=b.shiftKey;c.ctrlKey=b.ctrlKey;c.altKey=b.altKey;c.metaKey=b.metaKey;return c;},getModifiers:function(){var e=0;var d=this._native;if(d.shiftKey){e|=qx.event.type.Dom.SHIFT_MASK;}if(d.ctrlKey){e|=qx.event.type.Dom.CTRL_MASK;}if(d.altKey){e|=qx.event.type.Dom.ALT_MASK;}if(d.metaKey){e|=qx.event.type.Dom.META_MASK;}return e;},isCtrlPressed:function(){return this._native.ctrlKey;},isShiftPressed:function(){return this._native.shiftKey;},isAltPressed:function(){return this._native.altKey;},isMetaPressed:function(){return this._native.metaKey;},isCtrlOrCommandPressed:function(){if(qx.bom.client.Platform.MAC){return this._native.metaKey;}else{return this._native.ctrlKey;}}}});})();(function(){var c="touchcancel",b="qx.event.type.Touch",a="touchend";qx.Class.define(b,{extend:qx.event.type.Dom,members:{_cloneNativeEvent:function(d,e){var e=qx.event.type.Dom.prototype._cloneNativeEvent.call(this,d,e);e.pageX=d.pageX;e.pageY=d.pageY;e.layerX=d.layerX;e.layerY=d.layerY;e.scale=d.scale;e.rotation=d.rotation;e.srcElement=d.srcElement;e.targetTouches=[];for(var i=0;i<d.targetTouches.length;i++){e.targetTouches[i]=d.targetTouches[i];}e.changedTouches=[];for(var i=0;i<d.changedTouches.length;i++){e.changedTouches[i]=d.changedTouches[i];}e.touches=[];for(var i=0;i<d.touches.length;i++){e.touches[i]=d.touches[i];}return e;},stop:function(){this.stopPropagation();},getAllTouches:function(){return this._native.touches;},getTargetTouches:function(){return this._native.targetTouches;},getChangedTargetTouches:function(){return this._native.changedTouches;},isMultiTouch:function(){return this.__cG().length>1;},getScale:function(){return this._native.scale;},getRotation:function(){return this._native.rotation;},getDocumentLeft:function(f){return this.__cF(f).pageX;},getDocumentTop:function(g){return this.__cF(g).pageY;},getScreenLeft:function(h){return this.__cF(h).screenX;},getScreenTop:function(j){return this.__cF(j).screenY;},getViewportLeft:function(k){return this.__cF(k).clientX;},getViewportTop:function(l){return this.__cF(l).clientY;},getIdentifier:function(m){return this.__cF(m).identifier;},__cF:function(n){n=n==null?0:n;return this.__cG()[n];},__cG:function(){var o=(this._isTouchEnd()?this.getChangedTargetTouches():this.getTargetTouches());return o;},_isTouchEnd:function(){return (this.getType()==a||this.getType()==c);}}});})();(function(){var a="qx.event.type.Tap";qx.Class.define(a,{extend:qx.event.type.Touch,members:{_isTouchEnd:function(){return true;}}});})();(function(){var a="qx.event.type.Swipe";qx.Class.define(a,{extend:qx.event.type.Touch,members:{_cloneNativeEvent:function(b,c){var c=qx.event.type.Touch.prototype._cloneNativeEvent.call(this,b,c);c.swipe=b.swipe;return c;},_isTouchEnd:function(){return true;},getStartTime:function(){return this._native.swipe.startTime;},getDuration:function(){return this._native.swipe.duration;},getAxis:function(){return this._native.swipe.axis;},getDirection:function(){return this._native.swipe.direction;},getVelocity:function(){return this._native.swipe.velocity;},getDistance:function(){return this._native.swipe.distance;}}});})();(function(){var h="left",g="right",f="middle",e="none",d="click",c="contextmenu",b="qx.event.type.Mouse",a="qx.client";qx.Class.define(b,{extend:qx.event.type.Dom,members:{_cloneNativeEvent:function(i,j){var j=qx.event.type.Dom.prototype._cloneNativeEvent.call(this,i,j);j.button=i.button;j.clientX=i.clientX;j.clientY=i.clientY;j.pageX=i.pageX;j.pageY=i.pageY;j.screenX=i.screenX;j.screenY=i.screenY;j.wheelDelta=i.wheelDelta;j.detail=i.detail;j.srcElement=i.srcElement;j.target=i.target;return j;},__kD:{0:h,2:g,1:f},__kE:{1:h,2:g,4:f},stop:function(){this.stopPropagation();},getButton:function(){switch(this._type){case c:return g;case d:if(this.__kF){return this.__kF();}default:if(this._native.target!==undefined){return this.__kD[this._native.button]||e;}else{return this.__kE[this._native.button]||e;}}},__kF:qx.core.Variant.select(a,{"mshtml":function(){return h;},"default":null}),isLeftPressed:function(){return this.getButton()===h;},isMiddlePressed:function(){return this.getButton()===f;},isRightPressed:function(){return this.getButton()===g;},getRelatedTarget:function(){return this._relatedTarget;},getViewportLeft:function(){return this._native.clientX;},getViewportTop:function(){return this._native.clientY;},getDocumentLeft:function(){if(this._native.pageX!==undefined){return this._native.pageX;}else{var k=qx.dom.Node.getWindow(this._native.srcElement);return this._native.clientX+qx.bom.Viewport.getScrollLeft(k);}},getDocumentTop:function(){if(this._native.pageY!==undefined){return this._native.pageY;}else{var l=qx.dom.Node.getWindow(this._native.srcElement);return this._native.clientY+qx.bom.Viewport.getScrollTop(l);}},getScreenLeft:function(){return this._native.screenX;},getScreenTop:function(){return this._native.screenY;}}});})();(function(){var c="qx.client",b="chrome",a="qx.event.type.MouseWheel";qx.Class.define(a,{extend:qx.event.type.Mouse,members:{stop:function(){this.stopPropagation();this.preventDefault();},getWheelDelta:qx.core.Variant.select(c,{"default":function(){return -(this._native.wheelDelta/40);},"gecko":function(){return this._native.detail;},"webkit":function(){if(qx.bom.client.Browser.NAME==b){if(qx.bom.client.Platform.MAC){return -(this._native.wheelDelta/1200);}else{return -(this._native.wheelDelta/120);}}else{if(qx.bom.client.Platform.WIN){var d=120;if(qx.bom.client.Engine.VERSION==533.16){d=1200;}}else{d=40;if(qx.bom.client.Engine.VERSION==533.16||qx.bom.client.Engine.VERSION==533.17||qx.bom.client.Engine.VERSION==533.18){d=1200;}}return -(this._native.wheelDelta/d);}}})}});})();(function(){var j="qx.client",i="ie",h="msie",g="android",f="operamini",e="mobile chrome",d=")(/| )([0-9]+\.[0-9])",c="iemobile",b="opera mobi",a="Mobile Safari",x="operamobile",w="mobile safari",v="IEMobile|Maxthon|MSIE",u="qx.bom.client.Browser",t="opera mini",s="(",r="opera",q="mshtml",p="Opera Mini|Opera Mobi|Opera",o="AdobeAIR|Titanium|Fluid|Chrome|Android|Epiphany|Konqueror|iCab|OmniWeb|Maxthon|Pre|Mobile Safari|Safari",m="webkit",n="5.0",k="prism|Fennec|Camino|Kmeleon|Galeon|Netscape|SeaMonkey|Firefox",l="Mobile/";qx.Bootstrap.define(u,{statics:{UNKNOWN:true,NAME:"unknown",TITLE:"unknown 0.0",VERSION:0.0,FULLVERSION:"0.0.0",__lE:function(y){var z=navigator.userAgent;var B=new RegExp(s+y+d);var C=z.match(B);if(!C){return;}var name=C[1].toLowerCase();var A=C[3];if(z.match(/Version(\/| )([0-9]+\.[0-9])/)){A=RegExp.$2;}if(qx.core.Variant.isSet(j,m)){if(name===g){name=e;}else if(z.indexOf(a)!==-1||z.indexOf(l)!==-1){name=w;}}else if(qx.core.Variant.isSet(j,q)){if(name===h){name=i;if(qx.bom.client.System.WINCE&&name===i){name=c;A=n;}}}else if(qx.core.Variant.isSet(j,r)){if(name===b){name=x;}else if(name===t){name=f;}}this.NAME=name;this.FULLVERSION=A;this.VERSION=parseFloat(A,10);this.TITLE=name+" "+this.VERSION;this.UNKNOWN=false;}},defer:qx.core.Variant.select(j,{"webkit":function(D){D.__lE(o);},"gecko":function(E){E.__lE(k);},"mshtml":function(F){F.__lE(v);},"opera":function(G){G.__lE(p);}})});})();(function(){var f="qx.client",e="qx.dom.Hierarchy",d="previousSibling",c="*",b="nextSibling",a="parentNode";qx.Class.define(e,{statics:{getNodeIndex:function(g){var h=0;while(g&&(g=g.previousSibling)){h++;}return h;},getElementIndex:function(i){var j=0;var k=qx.dom.Node.ELEMENT;while(i&&(i=i.previousSibling)){if(i.nodeType==k){j++;}}return j;},getNextElementSibling:function(l){while(l&&(l=l.nextSibling)&&!qx.dom.Node.isElement(l)){continue;}return l||null;},getPreviousElementSibling:function(m){while(m&&(m=m.previousSibling)&&!qx.dom.Node.isElement(m)){continue;}return m||null;},contains:qx.core.Variant.select(f,{"webkit|mshtml|opera":function(n,o){if(qx.dom.Node.isDocument(n)){var p=qx.dom.Node.getDocument(o);return n&&p==n;}else if(qx.dom.Node.isDocument(o)){return false;}else{return n.contains(o);}},"gecko":function(q,r){return !!(q.compareDocumentPosition(r)&16);},"default":function(s,t){while(t){if(s==t){return true;}t=t.parentNode;}return false;}}),isRendered:qx.core.Variant.select(f,{"mshtml":function(u){if(!u.parentNode||!u.offsetParent){return false;}var v=u.ownerDocument||u.document;return v.body.contains(u);},"gecko":function(w){var x=w.ownerDocument||w.document;return !!(x.compareDocumentPosition(w)&16);},"default":function(y){if(!y.parentNode||!y.offsetParent){return false;}var z=y.ownerDocument||y.document;return z.body.contains(y);}}),isDescendantOf:function(A,B){return this.contains(B,A);},getCommonParent:qx.core.Variant.select(f,{"mshtml|opera":function(C,D){if(C===D){return C;}while(C&&qx.dom.Node.isElement(C)){if(C.contains(D)){return C;}C=C.parentNode;}return null;},"default":function(E,F){if(E===F){return E;}var G={};var J=qx.core.ObjectRegistry;var I,H;while(E||F){if(E){I=J.toHashCode(E);if(G[I]){return G[I];}G[I]=E;E=E.parentNode;}if(F){H=J.toHashCode(F);if(G[H]){return G[H];}G[H]=F;F=F.parentNode;}}return null;}}),getAncestors:function(K){return this._recursivelyCollect(K,a);},getChildElements:function(L){L=L.firstChild;if(!L){return [];}var M=this.getNextSiblings(L);if(L.nodeType===1){M.unshift(L);}return M;},getDescendants:function(N){return qx.lang.Array.fromCollection(N.getElementsByTagName(c));},getFirstDescendant:function(O){O=O.firstChild;while(O&&O.nodeType!=1){O=O.nextSibling;}return O;},getLastDescendant:function(P){P=P.lastChild;while(P&&P.nodeType!=1){P=P.previousSibling;}return P;},getPreviousSiblings:function(Q){return this._recursivelyCollect(Q,d);},getNextSiblings:function(R){return this._recursivelyCollect(R,b);},_recursivelyCollect:function(S,T){var U=[];while(S=S[T]){if(S.nodeType==1){U.push(S);}}return U;},getSiblings:function(V){return this.getPreviousSiblings(V).reverse().concat(this.getNextSiblings(V));},isEmpty:function(W){W=W.firstChild;while(W){if(W.nodeType===qx.dom.Node.ELEMENT||W.nodeType===qx.dom.Node.TEXT){return false;}W=W.nextSibling;}return true;},cleanWhitespace:function(X){var Y=X.firstChild;while(Y){var ba=Y.nextSibling;if(Y.nodeType==3&&!/\S/.test(Y.nodeValue)){X.removeChild(Y);}Y=ba;}}}});})();(function(){var a="qx.event.type.KeyInput";qx.Class.define(a,{extend:qx.event.type.Dom,members:{init:function(b,c,d){qx.event.type.Dom.prototype.init.call(this,b,c,null,true,true);this._charCode=d;return this;},clone:function(e){var f=qx.event.type.Dom.prototype.clone.call(this,e);f._charCode=this._charCode;return f;},getCharCode:function(){return this._charCode;},getChar:function(){return String.fromCharCode(this._charCode);}}});})();(function(){var a="qx.event.type.KeySequence";qx.Class.define(a,{extend:qx.event.type.Dom,members:{init:function(b,c,d){qx.event.type.Dom.prototype.init.call(this,b,c,null,true,true);this._keyCode=b.keyCode;this._identifier=d;return this;},clone:function(e){var f=qx.event.type.Dom.prototype.clone.call(this,e);f._keyCode=this._keyCode;f._identifier=this._identifier;return f;},getKeyIdentifier:function(){return this._identifier;},getKeyCode:function(){return this._keyCode;}}});})();(function(){var j="qx.client",i="mousedown",h="mouseup",g="blur",f="focus",e="on",d="selectstart",c="DOMFocusOut",b="focusin",a="focusout",z="DOMFocusIn",y="draggesture",x="qx.event.handler.Focus",w="_applyFocus",v="deactivate",u="textarea",t="_applyActive",s='character',r="input",q="qxSelectable",o="tabIndex",p="off",m="activate",n="mshtml",k="qxKeepFocus",l="qxKeepActive";qx.Class.define(x,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(A){qx.core.Object.call(this);this._manager=A;this._window=A.getWindow();this._document=this._window.document;this._root=this._document.documentElement;this._body=this._document.body;this._initObserver();},properties:{active:{apply:t,nullable:true},focus:{apply:w,nullable:true}},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{focus:1,blur:1,focusin:1,focusout:1,activate:1,deactivate:1},IGNORE_CAN_HANDLE:true,FOCUSABLE_ELEMENTS:qx.core.Variant.select("qx.client",{"mshtml|gecko":{a:1,body:1,button:1,frame:1,iframe:1,img:1,input:1,object:1,select:1,textarea:1},"opera|webkit":{button:1,input:1,select:1,textarea:1}})},members:{__jQ:null,__jR:null,__jS:null,__jT:null,__jU:null,__jV:null,__jW:null,__jX:null,__jY:null,__ka:null,canHandleEvent:function(B,C){},registerEvent:function(D,E,F){},unregisterEvent:function(G,H,I){},focus:function(J){if(qx.core.Variant.isSet(j,n)){window.setTimeout(function(){try{J.focus();var K=qx.bom.Selection.get(J);if(K.length==0){var L=J.createTextRange();L.moveStart(s,J.value.length);L.collapse();L.select();}}catch(M){}},0);}else{try{J.focus();}catch(N){}}this.setFocus(J);this.setActive(J);},activate:function(O){this.setActive(O);},blur:function(P){try{P.blur();}catch(Q){}if(this.getActive()===P){this.resetActive();}if(this.getFocus()===P){this.resetFocus();}},deactivate:function(R){if(this.getActive()===R){this.resetActive();}},tryActivate:function(S){var T=this.__kp(S);if(T){this.setActive(T);}},__kb:function(U,V,W,X){var ba=qx.event.Registration;var Y=ba.createEvent(W,qx.event.type.Focus,[U,V,X]);ba.dispatchEvent(U,Y);},_windowFocused:true,__kc:function(){if(this._windowFocused){this._windowFocused=false;this.__kb(this._window,null,g,false);}},__kd:function(){if(!this._windowFocused){this._windowFocused=true;this.__kb(this._window,null,f,false);}},_initObserver:qx.core.Variant.select(j,{"gecko":function(){this.__jQ=qx.lang.Function.listener(this.__kj,this);this.__jR=qx.lang.Function.listener(this.__kk,this);this.__jS=qx.lang.Function.listener(this.__ki,this);this.__jT=qx.lang.Function.listener(this.__kh,this);this.__jU=qx.lang.Function.listener(this.__ke,this);qx.bom.Event.addNativeListener(this._document,i,this.__jQ,true);qx.bom.Event.addNativeListener(this._document,h,this.__jR,true);qx.bom.Event.addNativeListener(this._window,f,this.__jS,true);qx.bom.Event.addNativeListener(this._window,g,this.__jT,true);qx.bom.Event.addNativeListener(this._window,y,this.__jU,true);},"mshtml":function(){this.__jQ=qx.lang.Function.listener(this.__kj,this);this.__jR=qx.lang.Function.listener(this.__kk,this);this.__jW=qx.lang.Function.listener(this.__kf,this);this.__jX=qx.lang.Function.listener(this.__kg,this);this.__jV=qx.lang.Function.listener(this.__km,this);qx.bom.Event.addNativeListener(this._document,i,this.__jQ);qx.bom.Event.addNativeListener(this._document,h,this.__jR);qx.bom.Event.addNativeListener(this._document,b,this.__jW);qx.bom.Event.addNativeListener(this._document,a,this.__jX);qx.bom.Event.addNativeListener(this._document,d,this.__jV);},"webkit":function(){this.__jQ=qx.lang.Function.listener(this.__kj,this);this.__jR=qx.lang.Function.listener(this.__kk,this);this.__jX=qx.lang.Function.listener(this.__kg,this);this.__jS=qx.lang.Function.listener(this.__ki,this);this.__jT=qx.lang.Function.listener(this.__kh,this);this.__jV=qx.lang.Function.listener(this.__km,this);qx.bom.Event.addNativeListener(this._document,i,this.__jQ,true);qx.bom.Event.addNativeListener(this._document,h,this.__jR,true);qx.bom.Event.addNativeListener(this._document,d,this.__jV,false);qx.bom.Event.addNativeListener(this._window,c,this.__jX,true);qx.bom.Event.addNativeListener(this._window,f,this.__jS,true);qx.bom.Event.addNativeListener(this._window,g,this.__jT,true);},"opera":function(){this.__jQ=qx.lang.Function.listener(this.__kj,this);this.__jR=qx.lang.Function.listener(this.__kk,this);this.__jW=qx.lang.Function.listener(this.__kf,this);this.__jX=qx.lang.Function.listener(this.__kg,this);qx.bom.Event.addNativeListener(this._document,i,this.__jQ,true);qx.bom.Event.addNativeListener(this._document,h,this.__jR,true);qx.bom.Event.addNativeListener(this._window,z,this.__jW,true);qx.bom.Event.addNativeListener(this._window,c,this.__jX,true);}}),_stopObserver:qx.core.Variant.select(j,{"gecko":function(){qx.bom.Event.removeNativeListener(this._document,i,this.__jQ,true);qx.bom.Event.removeNativeListener(this._document,h,this.__jR,true);qx.bom.Event.removeNativeListener(this._window,f,this.__jS,true);qx.bom.Event.removeNativeListener(this._window,g,this.__jT,true);qx.bom.Event.removeNativeListener(this._window,y,this.__jU,true);},"mshtml":function(){qx.bom.Event.removeNativeListener(this._document,i,this.__jQ);qx.bom.Event.removeNativeListener(this._document,h,this.__jR);qx.bom.Event.removeNativeListener(this._document,b,this.__jW);qx.bom.Event.removeNativeListener(this._document,a,this.__jX);qx.bom.Event.removeNativeListener(this._document,d,this.__jV);},"webkit":function(){qx.bom.Event.removeNativeListener(this._document,i,this.__jQ,true);qx.bom.Event.removeNativeListener(this._document,h,this.__jR,true);qx.bom.Event.removeNativeListener(this._document,d,this.__jV,false);qx.bom.Event.removeNativeListener(this._window,c,this.__jX,true);qx.bom.Event.removeNativeListener(this._window,f,this.__jS,true);qx.bom.Event.removeNativeListener(this._window,g,this.__jT,true);},"opera":function(){qx.bom.Event.removeNativeListener(this._document,i,this.__jQ,true);qx.bom.Event.removeNativeListener(this._document,h,this.__jR,true);qx.bom.Event.removeNativeListener(this._window,z,this.__jW,true);qx.bom.Event.removeNativeListener(this._window,c,this.__jX,true);}}),__ke:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"gecko":function(bb){var bc=qx.bom.Event.getTarget(bb);if(!this.__kq(bc)){qx.bom.Event.preventDefault(bb);}},"default":null})),__kf:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"mshtml":function(bd){this.__kd();var bf=qx.bom.Event.getTarget(bd);var be=this.__ko(bf);if(be){this.setFocus(be);}this.tryActivate(bf);},"opera":function(bg){var bh=qx.bom.Event.getTarget(bg);if(bh==this._document||bh==this._window){this.__kd();if(this.__jY){this.setFocus(this.__jY);delete this.__jY;}if(this.__ka){this.setActive(this.__ka);delete this.__ka;}}else{this.setFocus(bh);this.tryActivate(bh);if(!this.__kq(bh)){bh.selectionStart=0;bh.selectionEnd=0;}}},"default":null})),__kg:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"mshtml":function(bi){if(!bi.toElement){this.__kc();this.resetFocus();this.resetActive();}},"webkit":function(bj){var bk=qx.bom.Event.getTarget(bj);if(bk===this.getFocus()){this.resetFocus();}if(bk===this.getActive()){this.resetActive();}},"opera":function(bl){var bm=qx.bom.Event.getTarget(bl);if(bm==this._document){this.__kc();this.__jY=this.getFocus();this.__ka=this.getActive();this.resetFocus();this.resetActive();}else{if(bm===this.getFocus()){this.resetFocus();}if(bm===this.getActive()){this.resetActive();}}},"default":null})),__kh:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"gecko":function(bn){var bo=qx.bom.Event.getTarget(bn);if(bo===this._window||bo===this._document){this.__kc();this.resetActive();this.resetFocus();}},"webkit":function(bp){var bq=qx.bom.Event.getTarget(bp);if(bq===this._window||bq===this._document){this.__kc();this.__jY=this.getFocus();this.__ka=this.getActive();this.resetActive();this.resetFocus();}},"default":null})),__ki:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"gecko":function(br){var bs=qx.bom.Event.getTarget(br);if(bs===this._window||bs===this._document){this.__kd();bs=this._body;}this.setFocus(bs);this.tryActivate(bs);},"webkit":function(bt){var bu=qx.bom.Event.getTarget(bt);if(bu===this._window||bu===this._document){this.__kd();if(this.__jY){this.setFocus(this.__jY);delete this.__jY;}if(this.__ka){this.setActive(this.__ka);delete this.__ka;}}else{this.setFocus(bu);this.tryActivate(bu);}},"default":null})),__kj:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"gecko":function(bv){var bx=qx.bom.Event.getTarget(bv);var bw=this.__ko(bx);if(!bw){qx.bom.Event.preventDefault(bv);}else if(bw===this._body){this.setFocus(bw);}},"mshtml":function(by){var bA=qx.bom.Event.getTarget(by);var bz=this.__ko(bA);if(bz){if(!this.__kq(bA)){bA.unselectable=e;try{document.selection.empty();}catch(bB){}try{bz.focus();}catch(bC){}}}else{qx.bom.Event.preventDefault(by);if(!this.__kq(bA)){bA.unselectable=e;}}},"webkit":function(bD){var bF=qx.bom.Event.getTarget(bD);var bE=this.__ko(bF);if(bE){this.setFocus(bE);}else{qx.bom.Event.preventDefault(bD);}},"opera":function(bG){var bJ=qx.bom.Event.getTarget(bG);var bH=this.__ko(bJ);if(!this.__kq(bJ)){qx.bom.Event.preventDefault(bG);if(bH){var bI=this.getFocus();if(bI&&bI.selectionEnd){bI.selectionStart=0;bI.selectionEnd=0;bI.blur();}if(bH){this.setFocus(bH);}}}else if(bH){this.setFocus(bH);}},"default":null})),__kk:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"mshtml":function(bK){var bL=qx.bom.Event.getTarget(bK);if(bL.unselectable){bL.unselectable=p;}this.tryActivate(this.__kl(bL));},"gecko":function(bM){var bN=qx.bom.Event.getTarget(bM);while(bN&&bN.offsetWidth===undefined){bN=bN.parentNode;}if(bN){this.tryActivate(bN);}},"webkit|opera":function(bO){var bP=qx.bom.Event.getTarget(bO);this.tryActivate(this.__kl(bP));},"default":null})),__kl:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"mshtml|webkit":function(bQ){var bR=this.getFocus();if(bR&&bQ!=bR&&(bR.nodeName.toLowerCase()===r||bR.nodeName.toLowerCase()===u)){bQ=bR;}return bQ;},"default":function(bS){return bS;}})),__km:qx.event.GlobalError.observeMethod(qx.core.Variant.select(j,{"mshtml|webkit":function(bT){var bU=qx.bom.Event.getTarget(bT);if(!this.__kq(bU)){qx.bom.Event.preventDefault(bT);}},"default":null})),__kn:function(bV){var bW=qx.bom.element.Attribute.get(bV,o);if(bW>=1){return true;}var bX=qx.event.handler.Focus.FOCUSABLE_ELEMENTS;if(bW>=0&&bX[bV.tagName]){return true;}return false;},__ko:function(bY){while(bY&&bY.nodeType===1){if(bY.getAttribute(k)==e){return null;}if(this.__kn(bY)){return bY;}bY=bY.parentNode;}return this._body;},__kp:function(ca){var cb=ca;while(ca&&ca.nodeType===1){if(ca.getAttribute(l)==e){return null;}ca=ca.parentNode;}return cb;},__kq:function(cc){while(cc&&cc.nodeType===1){var cd=cc.getAttribute(q);if(cd!=null){return cd===e;}cc=cc.parentNode;}return true;},_applyActive:function(ce,cf){if(cf){this.__kb(cf,ce,v,true);}if(ce){this.__kb(ce,cf,m,true);}},_applyFocus:function(cg,ch){if(ch){this.__kb(ch,cg,a,true);}if(cg){this.__kb(cg,ch,b,true);}if(ch){this.__kb(ch,cg,g,false);}if(cg){this.__kb(cg,ch,f,false);}}},destruct:function(){this._stopObserver();this._manager=this._window=this._document=this._root=this._body=this.__kr=null;},defer:function(ci){qx.event.Registration.addHandler(ci);var cj=ci.FOCUSABLE_ELEMENTS;for(var ck in cj){cj[ck.toUpperCase()]=1;}}});})();(function(){var k="qx.client",j="character",i="EndToEnd",h="input",g="textarea",f="StartToStart",e='character',d="qx.bom.Selection",c="button",b="#text",a="body";qx.Class.define(d,{statics:{getSelectionObject:qx.core.Variant.select(k,{"mshtml":function(l){return l.selection;},"default":function(m){return qx.dom.Node.getWindow(m).getSelection();}}),get:qx.core.Variant.select(k,{"mshtml":function(n){var o=qx.bom.Range.get(qx.dom.Node.getDocument(n));return o.text;},"default":function(p){if(this.__lf(p)){return p.value.substring(p.selectionStart,p.selectionEnd);}else{return this.getSelectionObject(qx.dom.Node.getDocument(p)).toString();}}}),getLength:qx.core.Variant.select(k,{"mshtml":function(q){var s=this.get(q);var r=qx.util.StringSplit.split(s,/\r\n/);return s.length-(r.length-1);},"opera":function(t){var y,w,u;if(this.__lf(t)){var x=t.selectionStart;var v=t.selectionEnd;y=t.value.substring(x,v);w=v-x;}else{y=qx.bom.Selection.get(t);w=y.length;}u=qx.util.StringSplit.split(y,/\r\n/);return w-(u.length-1);},"default":function(z){if(this.__lf(z)){return z.selectionEnd-z.selectionStart;}else{return this.get(z).length;}}}),getStart:qx.core.Variant.select(k,{"mshtml":function(A){if(this.__lf(A)){var F=qx.bom.Range.get();if(!A.contains(F.parentElement())){return -1;}var G=qx.bom.Range.get(A);var E=A.value.length;G.moveToBookmark(F.getBookmark());G.moveEnd(e,E);return E-G.text.length;}else{var G=qx.bom.Range.get(A);var C=G.parentElement();var H=qx.bom.Range.get();H.moveToElementText(C);var B=qx.bom.Range.get(qx.dom.Node.getBodyElement(A));B.setEndPoint(f,G);B.setEndPoint(i,H);if(H.compareEndPoints(f,B)==0){return 0;}var D;var I=0;while(true){D=B.moveStart(j,-1);if(H.compareEndPoints(f,B)==0){break;}if(D==0){break;}else{I++;}}return ++I;}},"gecko|webkit":function(J){if(this.__lf(J)){return J.selectionStart;}else{var L=qx.dom.Node.getDocument(J);var K=this.getSelectionObject(L);if(K.anchorOffset<K.focusOffset){return K.anchorOffset;}else{return K.focusOffset;}}},"default":function(M){if(this.__lf(M)){return M.selectionStart;}else{return qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(M)).anchorOffset;}}}),getEnd:qx.core.Variant.select(k,{"mshtml":function(N){if(this.__lf(N)){var S=qx.bom.Range.get();if(!N.contains(S.parentElement())){return -1;}var T=qx.bom.Range.get(N);var R=N.value.length;T.moveToBookmark(S.getBookmark());T.moveStart(e,-R);return T.text.length;}else{var T=qx.bom.Range.get(N);var P=T.parentElement();var U=qx.bom.Range.get();U.moveToElementText(P);var R=U.text.length;var O=qx.bom.Range.get(qx.dom.Node.getBodyElement(N));O.setEndPoint(i,T);O.setEndPoint(f,U);if(U.compareEndPoints(i,O)==0){return R-1;}var Q;var V=0;while(true){Q=O.moveEnd(j,1);if(U.compareEndPoints(i,O)==0){break;}if(Q==0){break;}else{V++;}}return R-(++V);}},"gecko|webkit":function(W){if(this.__lf(W)){return W.selectionEnd;}else{var Y=qx.dom.Node.getDocument(W);var X=this.getSelectionObject(Y);if(X.focusOffset>X.anchorOffset){return X.focusOffset;}else{return X.anchorOffset;}}},"default":function(ba){if(this.__lf(ba)){return ba.selectionEnd;}else{return qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(ba)).focusOffset;}}}),__lf:function(bb){return qx.dom.Node.isElement(bb)&&(bb.nodeName.toLowerCase()==h||bb.nodeName.toLowerCase()==g);},set:qx.core.Variant.select(k,{"mshtml":function(bc,bd,be){var bf;if(qx.dom.Node.isDocument(bc)){bc=bc.body;}if(qx.dom.Node.isElement(bc)||qx.dom.Node.isText(bc)){switch(bc.nodeName.toLowerCase()){case h:case g:case c:if(be===undefined){be=bc.value.length;}if(bd>=0&&bd<=bc.value.length&&be>=0&&be<=bc.value.length){bf=qx.bom.Range.get(bc);bf.collapse(true);bf.moveStart(j,bd);bf.moveEnd(j,be-bd);bf.select();return true;}break;case b:if(be===undefined){be=bc.nodeValue.length;}if(bd>=0&&bd<=bc.nodeValue.length&&be>=0&&be<=bc.nodeValue.length){bf=qx.bom.Range.get(qx.dom.Node.getBodyElement(bc));bf.moveToElementText(bc.parentNode);bf.collapse(true);bf.moveStart(j,bd);bf.moveEnd(j,be-bd);bf.select();return true;}break;default:if(be===undefined){be=bc.childNodes.length-1;}if(bc.childNodes[bd]&&bc.childNodes[be]){bf=qx.bom.Range.get(qx.dom.Node.getBodyElement(bc));bf.moveToElementText(bc.childNodes[bd]);bf.collapse(true);var bg=qx.bom.Range.get(qx.dom.Node.getBodyElement(bc));bg.moveToElementText(bc.childNodes[be]);bf.setEndPoint(i,bg);bf.select();return true;}}}return false;},"default":function(bh,bi,bj){var bn=bh.nodeName.toLowerCase();if(qx.dom.Node.isElement(bh)&&(bn==h||bn==g)){if(bj===undefined){bj=bh.value.length;}if(bi>=0&&bi<=bh.value.length&&bj>=0&&bj<=bh.value.length){bh.focus();bh.select();bh.setSelectionRange(bi,bj);return true;}}else{var bl=false;var bm=qx.dom.Node.getWindow(bh).getSelection();var bk=qx.bom.Range.get(bh);if(qx.dom.Node.isText(bh)){if(bj===undefined){bj=bh.length;}if(bi>=0&&bi<bh.length&&bj>=0&&bj<=bh.length){bl=true;}}else if(qx.dom.Node.isElement(bh)){if(bj===undefined){bj=bh.childNodes.length-1;}if(bi>=0&&bh.childNodes[bi]&&bj>=0&&bh.childNodes[bj]){bl=true;}}else if(qx.dom.Node.isDocument(bh)){bh=bh.body;if(bj===undefined){bj=bh.childNodes.length-1;}if(bi>=0&&bh.childNodes[bi]&&bj>=0&&bh.childNodes[bj]){bl=true;}}if(bl){if(!bm.isCollapsed){bm.collapseToStart();}bk.setStart(bh,bi);if(qx.dom.Node.isText(bh)){bk.setEnd(bh,bj);}else{bk.setEndAfter(bh.childNodes[bj]);}if(bm.rangeCount>0){bm.removeAllRanges();}bm.addRange(bk);return true;}}return false;}}),setAll:function(bo){return qx.bom.Selection.set(bo,0);},clear:qx.core.Variant.select(k,{"mshtml":function(bp){var bq=qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(bp));var br=qx.bom.Range.get(bp);var parent=br.parentElement();var bs=qx.bom.Range.get(qx.dom.Node.getDocument(bp));if(parent==bs.parentElement()&&parent==bp){bq.empty();}},"default":function(bt){var bv=qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(bt));var bx=bt.nodeName.toLowerCase();if(qx.dom.Node.isElement(bt)&&(bx==h||bx==g)){bt.setSelectionRange(0,0);qx.bom.Element.blur(bt);}else if(qx.dom.Node.isDocument(bt)||bx==a){bv.collapse(bt.body?bt.body:bt,0);}else{var bw=qx.bom.Range.get(bt);if(!bw.collapsed){var by;var bu=bw.commonAncestorContainer;if(qx.dom.Node.isElement(bt)&&qx.dom.Node.isText(bu)){by=bu.parentNode;}else{by=bu;}if(by==bt){bv.collapse(bt,0);}}}}})}});})();(function(){var l="button",k="qx.bom.Range",j="text",i="password",h="file",g="submit",f="reset",e="textarea",d="input",c="hidden",a="qx.client",b="body";qx.Class.define(k,{statics:{get:qx.core.Variant.select(a,{"mshtml":function(m){if(qx.dom.Node.isElement(m)){switch(m.nodeName.toLowerCase()){case d:switch(m.type){case j:case i:case c:case l:case f:case h:case g:return m.createTextRange();break;default:return qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(m)).createRange();}break;case e:case b:case l:return m.createTextRange();break;default:return qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(m)).createRange();}}else{if(m==null){m=window;}return qx.bom.Selection.getSelectionObject(qx.dom.Node.getDocument(m)).createRange();}},"default":function(n){var o=qx.dom.Node.getDocument(n);var p=qx.bom.Selection.getSelectionObject(o);if(p.rangeCount>0){return p.getRangeAt(0);}else{return o.createRange();}}})}});})();(function(){var j="",h="m",g="g",f="^",e="qx.util.StringSplit",d="i",c="$(?!\\s)",b="[object RegExp]",a="y";qx.Class.define(e,{statics:{split:function(k,l,m){if(Object.prototype.toString.call(l)!==b){return String.prototype.split.call(k,l,m);}var t=[],n=0,r=(l.ignoreCase?d:j)+(l.multiline?h:j)+(l.sticky?a:j),l=RegExp(l.source,r+g),q,u,o,p,s=/()??/.exec(j)[1]===undefined;k=k+j;if(!s){q=RegExp(f+l.source+c,r);}if(m===undefined||+m<0){m=Infinity;}else{m=Math.floor(+m);if(!m){return [];}}while(u=l.exec(k)){o=u.index+u[0].length;if(o>n){t.push(k.slice(n,u.index));if(!s&&u.length>1){u[0].replace(q,function(){for(var i=1;i<arguments.length-2;i++){if(arguments[i]===undefined){u[i]=undefined;}}});}if(u.length>1&&u.index<k.length){Array.prototype.push.apply(t,u.slice(1));}p=u[0].length;n=o;if(t.length>=m){break;}}if(l.lastIndex===u.index){l.lastIndex++;}}if(n===k.length){if(p||!l.test(j)){t.push(j);}}else{t.push(k.slice(n));}return t.length>m?t.slice(0,m):t;}}});})();(function(){var a="qx.event.type.Focus";qx.Class.define(a,{extend:qx.event.type.Event,members:{init:function(b,c,d){qx.event.type.Event.prototype.init.call(this,d,false);this._target=b;this._relatedTarget=c;return this;}}});})();(function(){var j="",i="undefined",h="qx.client",g="readOnly",f="accessKey",e="qx.bom.element.Attribute",d="rowSpan",c="vAlign",b="className",a="textContent",y="'",x="htmlFor",w="longDesc",v="cellSpacing",u="frameBorder",t="='",s="useMap",r="innerText",q="innerHTML",p="tabIndex",n="dateTime",o="maxLength",l="mshtml",m="cellPadding",k="colSpan";qx.Class.define(e,{statics:{__hb:{names:{"class":b,"for":x,html:q,text:qx.core.Variant.isSet(h,l)?r:a,colspan:k,rowspan:d,valign:c,datetime:n,accesskey:f,tabindex:p,maxlength:o,readonly:g,longdesc:w,cellpadding:m,cellspacing:v,frameborder:u,usemap:s},runtime:{"html":1,"text":1},bools:{compact:1,nowrap:1,ismap:1,declare:1,noshade:1,checked:1,disabled:1,readOnly:1,multiple:1,selected:1,noresize:1,defer:1,allowTransparency:1},property:{$$html:1,$$widget:1,disabled:1,checked:1,readOnly:1,multiple:1,selected:1,value:1,maxLength:1,className:1,innerHTML:1,innerText:1,textContent:1,htmlFor:1,tabIndex:1},qxProperties:{$$widget:1,$$html:1},propertyDefault:{disabled:false,checked:false,readOnly:false,multiple:false,selected:false,value:j,className:j,innerHTML:j,innerText:j,textContent:j,htmlFor:j,tabIndex:0,maxLength:qx.core.Variant.select(h,{"mshtml":2147483647,"webkit":524288,"default":-1})},removeableProperties:{disabled:1,multiple:1,maxLength:1},original:{href:1,src:1,type:1}},compile:function(z){var A=[];var C=this.__hb.runtime;for(var B in z){if(!C[B]){A.push(B,t,z[B],y);}}return A.join(j);},get:qx.core.Variant.select(h,{"mshtml":function(D,name){var F=this.__hb;var E;name=F.names[name]||name;if(F.original[name]){E=D.getAttribute(name,2);}else if(F.property[name]){E=D[name];if(typeof F.propertyDefault[name]!==i&&E==F.propertyDefault[name]){if(typeof F.bools[name]===i){return null;}else{return E;}}}else{E=D.getAttribute(name);}if(F.bools[name]){return !!E;}return E;},"default":function(G,name){var I=this.__hb;var H;name=I.names[name]||name;if(I.property[name]){H=G[name];if(typeof I.propertyDefault[name]!==i&&H==I.propertyDefault[name]){if(typeof I.bools[name]===i){return null;}else{return H;}}}else{H=G.getAttribute(name);}if(I.bools[name]){return !!H;}return H;}}),set:function(J,name,K){if(typeof K===i){return;}var L=this.__hb;name=L.names[name]||name;if(L.bools[name]){K=!!K;}if(L.property[name]&&(!(J[name]===undefined)||L.qxProperties[name])){if(K==null){if(L.removeableProperties[name]){J.removeAttribute(name);return;}else if(typeof L.propertyDefault[name]!==i){K=L.propertyDefault[name];}}J[name]=K;}else{if(K===true){J.setAttribute(name,name);}else if(K===false||K===null){J.removeAttribute(name);}else{J.setAttribute(name,K);}}},reset:function(M,name){this.set(M,name,null);}}});})();(function(){var a="qx.event.type.Drag";qx.Class.define(a,{extend:qx.event.type.Event,members:{init:function(b,c){qx.event.type.Event.prototype.init.call(this,true,b);if(c){this._native=c.getNativeEvent()||null;this._originalTarget=c.getTarget()||null;}else{this._native=null;this._originalTarget=null;}return this;},clone:function(d){var e=qx.event.type.Event.prototype.clone.call(this,d);e._native=this._native;return e;},getDocumentLeft:function(){if(this._native==null){return 0;}if(this._native.pageX!==undefined){return this._native.pageX;}else{var f=qx.dom.Node.getWindow(this._native.srcElement);return this._native.clientX+qx.bom.Viewport.getScrollLeft(f);}},getDocumentTop:function(){if(this._native==null){return 0;}if(this._native.pageY!==undefined){return this._native.pageY;}else{var g=qx.dom.Node.getWindow(this._native.srcElement);return this._native.clientY+qx.bom.Viewport.getScrollTop(g);}},getManager:function(){return qx.event.Registration.getManager(this.getTarget()).getHandler(qx.event.handler.DragDrop);},addType:function(h){this.getManager().addType(h);},addAction:function(i){this.getManager().addAction(i);},supportsType:function(j){return this.getManager().supportsType(j);},supportsAction:function(k){return this.getManager().supportsAction(k);},addData:function(l,m){this.getManager().addData(l,m);},getData:function(n){return this.getManager().getData(n);},getCurrentType:function(){return this.getManager().getCurrentType();},getCurrentAction:function(){return this.getManager().getCurrentAction();}}});})();(function(){var h="interval",g="qx.event.Timer",f="_applyInterval",d="_applyEnabled",c="Boolean",b="qx.event.type.Event",a="Integer";qx.Class.define(g,{extend:qx.core.Object,construct:function(i){qx.core.Object.call(this);this.setEnabled(false);if(i!=null){this.setInterval(i);}var self=this;this.__ey=function(){self._oninterval.call(self);};},events:{"interval":b},statics:{once:function(j,k,l){var m=new qx.event.Timer(l);m.__ez=j;m.addListener(h,function(e){m.stop();j.call(k,e);m.dispose();k=null;},k);m.start();return m;}},properties:{enabled:{init:true,check:c,apply:d},interval:{check:a,init:1000,apply:f}},members:{__eA:null,__ey:null,_applyInterval:function(n,o){if(this.getEnabled()){this.restart();}},_applyEnabled:function(p,q){if(q){window.clearInterval(this.__eA);this.__eA=null;}else if(p){this.__eA=window.setInterval(this.__ey,this.getInterval());}},start:function(){this.setEnabled(true);},startWith:function(r){this.setInterval(r);this.start();},stop:function(){this.setEnabled(false);},restart:function(){this.stop();this.start();},restartWith:function(s){this.stop();this.startWith(s);},_oninterval:qx.event.GlobalError.observeMethod(function(){if(this.$$disposed){return;}if(this.getEnabled()){this.fireEvent(h);}})},destruct:function(){if(this.__eA){window.clearInterval(this.__eA);}this.__eA=this.__ey=null;}});})();(function(){var h="losecapture",g="qx.client",f="blur",e="focus",d="click",c="qx.event.dispatch.MouseCapture",b="capture",a="scroll";qx.Class.define(c,{extend:qx.event.dispatch.AbstractBubbling,construct:function(i,j){qx.event.dispatch.AbstractBubbling.call(this,i);this.__ix=i.getWindow();this.__iy=j;i.addListener(this.__ix,f,this.releaseCapture,this);i.addListener(this.__ix,e,this.releaseCapture,this);i.addListener(this.__ix,a,this.releaseCapture,this);},statics:{PRIORITY:qx.event.Registration.PRIORITY_FIRST},members:{__iy:null,__iz:null,__iA:true,__ix:null,_getParent:function(k){return k.parentNode;},canDispatchEvent:function(l,event,m){return (this.__iz&&this.__iB[m]);},dispatchEvent:function(n,event,o){if(o==d){event.stopPropagation();this.releaseCapture();return;}if(this.__iA||!qx.dom.Hierarchy.contains(this.__iz,n)){n=this.__iz;}qx.event.dispatch.AbstractBubbling.prototype.dispatchEvent.call(this,n,event,o);},__iB:{"mouseup":1,"mousedown":1,"click":1,"dblclick":1,"mousemove":1,"mouseout":1,"mouseover":1},activateCapture:function(p,q){var q=q!==false;if(this.__iz===p&&this.__iA==q){return;}if(this.__iz){this.releaseCapture();}this.nativeSetCapture(p,q);if(this.hasNativeCapture){var self=this;qx.bom.Event.addNativeListener(p,h,function(){qx.bom.Event.removeNativeListener(p,h,arguments.callee);self.releaseCapture();});}this.__iA=q;this.__iz=p;this.__iy.fireEvent(p,b,qx.event.type.Event,[true,false]);},getCaptureElement:function(){return this.__iz;},releaseCapture:function(){var r=this.__iz;if(!r){return;}this.__iz=null;this.__iy.fireEvent(r,h,qx.event.type.Event,[true,false]);this.nativeReleaseCapture(r);},hasNativeCapture:qx.bom.client.Engine.MSHTML,nativeSetCapture:qx.core.Variant.select(g,{"mshtml":function(s,t){qx.event.Timer.once(function(){s.setCapture(t!==false);},this,0);},"default":qx.lang.Function.empty}),nativeReleaseCapture:qx.core.Variant.select(g,{"mshtml":function(u){qx.event.Timer.once(function(){u.releaseCapture();},this,0);},"default":qx.lang.Function.empty})},destruct:function(){this.__iz=this.__ix=this.__iy=null;},defer:function(v){qx.event.Registration.addDispatcher(v);}});})();(function(){var a="qx.event.handler.Window";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(b){qx.core.Object.call(this);this._manager=b;this._window=b.getWindow();this._initWindowObserver();},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{error:1,load:1,beforeunload:1,unload:1,resize:1,scroll:1,beforeshutdown:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_WINDOW,IGNORE_CAN_HANDLE:true},members:{canHandleEvent:function(c,d){},registerEvent:function(f,g,h){},unregisterEvent:function(i,j,k){},_initWindowObserver:function(){this._onNativeWrapper=qx.lang.Function.listener(this._onNative,this);var m=qx.event.handler.Window.SUPPORTED_TYPES;for(var l in m){qx.bom.Event.addNativeListener(this._window,l,this._onNativeWrapper);}},_stopWindowObserver:function(){var o=qx.event.handler.Window.SUPPORTED_TYPES;for(var n in o){qx.bom.Event.removeNativeListener(this._window,n,this._onNativeWrapper);}},_onNative:qx.event.GlobalError.observeMethod(function(e){if(this.isDisposed()){return;}var q=this._window;try{var t=q.document;}catch(e){return ;}var r=t.documentElement;var p=qx.bom.Event.getTarget(e);if(p==null||p===q||p===t||p===r){var event=qx.event.Registration.createEvent(e.type,qx.event.type.Native,[e,q]);qx.event.Registration.dispatchEvent(q,event);var s=event.getReturnValue();if(s!=null){e.returnValue=s;return s;}}})},destruct:function(){this._stopWindowObserver();this._manager=this._window=null;},defer:function(u){qx.event.Registration.addHandler(u);}});})();(function(){var c="qx.bom.Selector";qx.Class.define(c,{statics:{query:null,matches:null}});(function(){var o=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,v=0,r=Object.prototype.toString,p=false,x=true;[0,0].sort(function(){x=false;return 0;});var g=function(z,A,B,C){B=B||[];A=A||document;var L=A;if(A.nodeType!==1&&A.nodeType!==9){return [];}if(!z||typeof z!=="string"){return B;}var m,F,D,H,J,G,M,i,N=true,E=g.isXML(A),I=[],K=z;do{o.exec("");m=o.exec(K);if(m){K=m[3];I.push(m[1]);if(m[2]){H=m[3];break;}}}while(m);if(I.length>1&&q.exec(z)){if(I.length===2&&k.relative[I[0]]){F=h(I[0]+I[1],A);}else{F=k.relative[I[0]]?[A]:g(I.shift(),A);while(I.length){z=I.shift();if(k.relative[z]){z+=I.shift();}F=h(z,F);}}}else{if(!C&&I.length>1&&A.nodeType===9&&!E&&k.match.ID.test(I[0])&&!k.match.ID.test(I[I.length-1])){J=g.find(I.shift(),A,E);A=J.expr?g.filter(J.expr,J.set)[0]:J.set[0];}if(A){J=C?{expr:I.pop(),set:f(C)}:g.find(I.pop(),I.length===1&&(I[0]==="~"||I[0]==="+")&&A.parentNode?A.parentNode:A,E);F=J.expr?g.filter(J.expr,J.set):J.set;if(I.length>0){D=f(F);}else{N=false;}while(I.length){G=I.pop();M=G;if(!k.relative[G]){G="";}else{M=I.pop();}if(M==null){M=A;}k.relative[G](D,M,E);}}else{D=I=[];}}if(!D){D=F;}if(!D){g.error(G||z);}if(r.call(D)==="[object Array]"){if(!N){B.push.apply(B,D);}else if(A&&A.nodeType===1){for(i=0;D[i]!=null;i++){if(D[i]&&(D[i]===true||D[i].nodeType===1&&g.contains(A,D[i]))){B.push(F[i]);}}}else{for(i=0;D[i]!=null;i++){if(D[i]&&D[i].nodeType===1){B.push(F[i]);}}}}else{f(D,B);}if(H){g(H,L,B,C);g.uniqueSort(B);}return B;};g.uniqueSort=function(O){if(s){p=x;O.sort(s);if(p){for(var i=1;i<O.length;i++){if(O[i]===O[i-1]){O.splice(i--,1);}}}}return O;};g.matches=function(P,Q){return g(P,null,null,Q);};g.matchesSelector=function(R,S){return g(S,null,null,[R]).length>0;};g.find=function(T,U,V){var W;if(!T){return [];}for(var i=0,l=k.order.length;i<l;i++){var Y,X=k.order[i];if((Y=k.leftMatch[X].exec(T))){var ba=Y[1];Y.splice(1,1);if(ba.substr(ba.length-1)!=="\\"){Y[1]=(Y[1]||"").replace(/\\/g,"");W=k.find[X](Y,U,V);if(W!=null){T=T.replace(k.match[X],"");break;}}}}if(!W){W=U.getElementsByTagName("*");}return {set:W,expr:T};};g.filter=function(bb,bc,bd,be){var br,bq,bf=bb,bk=[],bg=bc,bh=bc&&bc[0]&&g.isXML(bc[0]);while(bb&&bc.length){for(var bo in k.filter){if((br=k.leftMatch[bo].exec(bb))!=null&&br[2]){var bn,bj,bi=k.filter[bo],bs=br[1];bq=false;br.splice(1,1);if(bs.substr(bs.length-1)==="\\"){continue;}if(bg===bk){bk=[];}if(k.preFilter[bo]){br=k.preFilter[bo](br,bg,bd,bk,be,bh);if(!br){bq=bn=true;}else if(br===true){continue;}}if(br){for(var i=0;(bj=bg[i])!=null;i++){if(bj){bn=bi(bj,br,i,bg);var bm=be^!!bn;if(bd&&bn!=null){if(bm){bq=true;}else{bg[i]=false;}}else if(bm){bk.push(bj);bq=true;}}}}if(bn!==undefined){if(!bd){bg=bk;}bb=bb.replace(k.match[bo],"");if(!bq){return [];}break;}}}if(bb===bf){if(bq==null){g.error(bb);}else{break;}}bf=bb;}return bg;};g.error=function(bt){throw "Syntax error, unrecognized expression: "+bt;};var k=g.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(bu){return bu.getAttribute("href");}},relative:{"+":function(bv,bw){var bx=typeof bw==="string",bz=bx&&!/\W/.test(bw),bA=bx&&!bz;if(bz){bw=bw.toLowerCase();}for(var i=0,l=bv.length,by;i<l;i++){if((by=bv[i])){while((by=by.previousSibling)&&by.nodeType!==1){}bv[i]=bA||by&&by.nodeName.toLowerCase()===bw?by||false:by===bw;}}if(bA){g.filter(bw,bv,true);}},">":function(bB,bC){var bE,bD=typeof bC==="string",i=0,l=bB.length;if(bD&&!/\W/.test(bC)){bC=bC.toLowerCase();for(;i<l;i++){bE=bB[i];if(bE){var parent=bE.parentNode;bB[i]=parent.nodeName.toLowerCase()===bC?parent:false;}}}else{for(;i<l;i++){bE=bB[i];if(bE){bB[i]=bD?bE.parentNode:bE.parentNode===bC;}}if(bD){g.filter(bC,bB,true);}}},"":function(bF,bG,bH){var bK,bI=v++,bJ=w;if(typeof bG==="string"&&!/\W/.test(bG)){bG=bG.toLowerCase();bK=bG;bJ=y;}bJ("parentNode",bG,bI,bF,bK,bH);},"~":function(bL,bM,bN){var bQ,bO=v++,bP=w;if(typeof bM==="string"&&!/\W/.test(bM)){bM=bM.toLowerCase();bQ=bM;bP=y;}bP("previousSibling",bM,bO,bL,bQ,bN);}},find:{ID:function(bR,bS,bT){if(typeof bS.getElementById!=="undefined"&&!bT){var m=bS.getElementById(bR[1]);return m&&m.parentNode?[m]:[];}},NAME:function(bU,bV){if(typeof bV.getElementsByName!=="undefined"){var bX=[],bW=bV.getElementsByName(bU[1]);for(var i=0,l=bW.length;i<l;i++){if(bW[i].getAttribute("name")===bU[1]){bX.push(bW[i]);}}return bX.length===0?null:bX;}},TAG:function(bY,ca){return ca.getElementsByTagName(bY[1]);}},preFilter:{CLASS:function(cb,cc,cd,ce,cf,cg){cb=" "+cb[1].replace(/\\/g,"")+" ";if(cg){return cb;}for(var i=0,ch;(ch=cc[i])!=null;i++){if(ch){if(cf^(ch.className&&(" "+ch.className+" ").replace(/[\t\n]/g," ").indexOf(cb)>=0)){if(!cd){ce.push(ch);}}else if(cd){cc[i]=false;}}}return false;},ID:function(ci){return ci[1].replace(/\\/g,"");},TAG:function(cj,ck){return cj[1].toLowerCase();},CHILD:function(cl){if(cl[1]==="nth"){var cm=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(cl[2]==="even"&&"2n"||cl[2]==="odd"&&"2n+1"||!/\D/.test(cl[2])&&"0n+"+cl[2]||cl[2]);cl[2]=(cm[1]+(cm[2]||1))-0;cl[3]=cm[3]-0;}cl[0]=v++;return cl;},ATTR:function(cn,co,cp,cq,cr,cs){var name=cn[1].replace(/\\/g,"");if(!cs&&k.attrMap[name]){cn[1]=k.attrMap[name];}if(cn[2]==="~="){cn[4]=" "+cn[4]+" ";}return cn;},PSEUDO:function(ct,cu,cv,cw,cx){if(ct[1]==="not"){if((o.exec(ct[3])||"").length>1||/^\w/.test(ct[3])){ct[3]=g(ct[3],null,null,cu);}else{var cy=g.filter(ct[3],cu,cv,true^cx);if(!cv){cw.push.apply(cw,cy);}return false;}}else if(k.match.POS.test(ct[0])||k.match.CHILD.test(ct[0])){return true;}return ct;},POS:function(cz){cz.unshift(true);return cz;}},filters:{enabled:function(cA){return cA.disabled===false&&cA.type!=="hidden";},disabled:function(cB){return cB.disabled===true;},checked:function(cC){return cC.checked===true;},selected:function(cD){cD.parentNode.selectedIndex;return cD.selected===true;},parent:function(cE){return !!cE.firstChild;},empty:function(cF){return !cF.firstChild;},has:function(cG,i,cH){return !!g(cH[3],cG).length;},header:function(cI){return (/h\d/i).test(cI.nodeName);},text:function(cJ){return "text"===cJ.type;},radio:function(cK){return "radio"===cK.type;},checkbox:function(cL){return "checkbox"===cL.type;},file:function(cM){return "file"===cM.type;},password:function(cN){return "password"===cN.type;},submit:function(cO){return "submit"===cO.type;},image:function(cP){return "image"===cP.type;},reset:function(cQ){return "reset"===cQ.type;},button:function(cR){return "button"===cR.type||cR.nodeName.toLowerCase()==="button";},input:function(cS){return (/input|select|textarea|button/i).test(cS.nodeName);}},setFilters:{first:function(cT,i){return i===0;},last:function(cU,i,cV,cW){return i===cW.length-1;},even:function(cX,i){return i%2===0;},odd:function(cY,i){return i%2===1;},lt:function(da,i,db){return i<db[3]-0;},gt:function(dc,i,dd){return i>dd[3]-0;},nth:function(de,i,df){return df[3]-0===i;},eq:function(dg,i,dh){return dh[3]-0===i;}},filter:{PSEUDO:function(di,dj,i,dk){var name=dj[1],dl=k.filters[name];if(dl){return dl(di,i,dj,dk);}else if(name==="contains"){return (di.textContent||di.innerText||g.getText([di])||"").indexOf(dj[3])>=0;}else if(name==="not"){var dm=dj[3];for(var j=0,l=dm.length;j<l;j++){if(dm[j]===di){return false;}}return true;}else{g.error("Syntax error, unrecognized expression: "+name);}},CHILD:function(dn,dp){var dv=dp[1],dq=dn;switch(dv){case "only":case "first":while((dq=dq.previousSibling)){if(dq.nodeType===1){return false;}}if(dv==="first"){return true;}dq=dn;case "last":while((dq=dq.nextSibling)){if(dq.nodeType===1){return false;}}return true;case "nth":var dw=dp[2],ds=dp[3];if(dw===1&&ds===0){return true;}var du=dp[0],parent=dn.parentNode;if(parent&&(parent.sizcache!==du||!dn.nodeIndex)){var dr=0;for(dq=parent.firstChild;dq;dq=dq.nextSibling){if(dq.nodeType===1){dq.nodeIndex=++dr;}}parent.sizcache=du;}var dt=dn.nodeIndex-ds;if(dw===0){return dt===0;}else{return (dt%dw===0&&dt/dw>=0);}}},ID:function(dx,dy){return dx.nodeType===1&&dx.getAttribute("id")===dy;},TAG:function(dz,dA){return (dA==="*"&&dz.nodeType===1)||dz.nodeName.toLowerCase()===dA;},CLASS:function(dB,dC){return (" "+(dB.className||dB.getAttribute("class"))+" ").indexOf(dC)>-1;},ATTR:function(dD,dE){var name=dE[1],dI=k.attrHandle[name]?k.attrHandle[name](dD):dD[name]!=null?dD[name]:dD.getAttribute(name),dH=dI+"",dG=dE[2],dF=dE[4];return dI==null?dG==="!=":dG==="="?dH===dF:dG==="*="?dH.indexOf(dF)>=0:dG==="~="?(" "+dH+" ").indexOf(dF)>=0:!dF?dH&&dI!==false:dG==="!="?dH!==dF:dG==="^="?dH.indexOf(dF)===0:dG==="$="?dH.substr(dH.length-dF.length)===dF:dG==="|="?dH===dF||dH.substr(0,dF.length+1)===dF+"-":false;},POS:function(dJ,dK,i,dL){var name=dK[2],dM=k.setFilters[name];if(dM){return dM(dJ,i,dK,dL);}}}};var q=k.match.POS,d=function(dN,dO){return "\\"+(dO-0+1);};for(var u in k.match){k.match[u]=new RegExp(k.match[u].source+(/(?![^\[]*\])(?![^\(]*\))/.source));k.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+k.match[u].source.replace(/\\(\d+)/g,d));}var f=function(dP,dQ){dP=Array.prototype.slice.call(dP,0);if(dQ){dQ.push.apply(dQ,dP);return dQ;}return dP;};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType;}catch(e){f=function(dR,dS){var i=0,dT=dS||[];if(r.call(dR)==="[object Array]"){Array.prototype.push.apply(dT,dR);}else{if(typeof dR.length==="number"){for(var l=dR.length;i<l;i++){dT.push(dR[i]);}}else{for(;dR[i];i++){dT.push(dR[i]);}}}return dT;};}var s,n;if(document.documentElement.compareDocumentPosition){s=function(a,b){if(a===b){p=true;return 0;}if(!a.compareDocumentPosition||!b.compareDocumentPosition){return a.compareDocumentPosition?-1:1;}return a.compareDocumentPosition(b)&4?-1:1;};}else{s=function(a,b){var dY,dW,ea=[],eb=[],dV=a.parentNode,dX=b.parentNode,dU=dV;if(a===b){p=true;return 0;}else if(dV===dX){return n(a,b);}else if(!dV){return -1;}else if(!dX){return 1;}while(dU){ea.unshift(dU);dU=dU.parentNode;}dU=dX;while(dU){eb.unshift(dU);dU=dU.parentNode;}dY=ea.length;dW=eb.length;for(var i=0;i<dY&&i<dW;i++){if(ea[i]!==eb[i]){return n(ea[i],eb[i]);}}return i===dY?n(a,eb[i],-1):n(ea[i],b,1);};n=function(a,b,ec){if(a===b){return ec;}var ed=a.nextSibling;while(ed){if(ed===b){return -1;}ed=ed.nextSibling;}return 1;};}g.getText=function(ee){var eg="",ef;for(var i=0;ee[i];i++){ef=ee[i];if(ef.nodeType===3||ef.nodeType===4){eg+=ef.nodeValue;}else if(ef.nodeType!==8){eg+=g.getText(ef.childNodes);}}return eg;};(function(){var ej=document.createElement("div"),ei="script"+(new Date()).getTime(),eh=document.documentElement;ej.innerHTML="<a name='"+ei+"'/>";eh.insertBefore(ej,eh.firstChild);if(document.getElementById(ei)){k.find.ID=function(ek,el,em){if(typeof el.getElementById!=="undefined"&&!em){var m=el.getElementById(ek[1]);return m?m.id===ek[1]||typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id").nodeValue===ek[1]?[m]:undefined:[];}};k.filter.ID=function(en,eo){var ep=typeof en.getAttributeNode!=="undefined"&&en.getAttributeNode("id");return en.nodeType===1&&ep&&ep.nodeValue===eo;};}eh.removeChild(ej);eh=ej=null;})();(function(){var eq=document.createElement("div");eq.appendChild(document.createComment(""));if(eq.getElementsByTagName("*").length>0){k.find.TAG=function(er,es){var eu=es.getElementsByTagName(er[1]);if(er[1]==="*"){var et=[];for(var i=0;eu[i];i++){if(eu[i].nodeType===1){et.push(eu[i]);}}eu=et;}return eu;};}eq.innerHTML="<a href='#'></a>";if(eq.firstChild&&typeof eq.firstChild.getAttribute!=="undefined"&&eq.firstChild.getAttribute("href")!=="#"){k.attrHandle.href=function(ev){return ev.getAttribute("href",2);};}eq=null;})();if(document.querySelectorAll){(function(){var ex=g,ew=document.createElement("div"),ey="__sizzle__";ew.innerHTML="<p class='TEST'></p>";if(ew.querySelectorAll&&ew.querySelectorAll(".TEST").length===0){return;}g=function(eA,eB,eC,eD){eB=eB||document;eA=eA.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!eD&&!g.isXML(eB)){if(eB.nodeType===9){try{return f(eB.querySelectorAll(eA),eC);}catch(eG){}}else if(eB.nodeType===1&&eB.nodeName.toLowerCase()!=="object"){var eE=eB.getAttribute("id"),eF=eE||ey;if(!eE){eB.setAttribute("id",eF);}try{return f(eB.querySelectorAll("#"+eF+" "+eA),eC);}catch(eH){}finally{if(!eE){eB.removeAttribute("id");}}}}return ex(eA,eB,eC,eD);};for(var ez in ex){g[ez]=ex[ez];}ew=null;})();}(function(){var eK=document.documentElement,eI=eK.matchesSelector||eK.mozMatchesSelector||eK.webkitMatchesSelector||eK.msMatchesSelector,eJ=false;try{eI.call(document.documentElement,"[test!='']:sizzle");}catch(eL){eJ=true;}if(eI){g.matchesSelector=function(eM,eN){eN=eN.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!g.isXML(eM)){try{if(eJ||!k.match.PSEUDO.test(eN)&&!/!=/.test(eN)){return eI.call(eM,eN);}}catch(e){}}return g(eN,null,null,[eM]).length>0;};}})();(function(){var eO=document.createElement("div");eO.innerHTML="<div class='test e'></div><div class='test'></div>";if(!eO.getElementsByClassName||eO.getElementsByClassName("e").length===0){return;}eO.lastChild.className="e";if(eO.getElementsByClassName("e").length===1){return;}k.order.splice(1,0,"CLASS");k.find.CLASS=function(eP,eQ,eR){if(typeof eQ.getElementsByClassName!=="undefined"&&!eR){return eQ.getElementsByClassName(eP[1]);}};eO=null;})();function y(eS,eT,eU,eV,eW,eX){for(var i=0,l=eV.length;i<l;i++){var fa=eV[i];if(fa){var eY=false;fa=fa[eS];while(fa){if(fa.sizcache===eU){eY=eV[fa.sizset];break;}if(fa.nodeType===1&&!eX){fa.sizcache=eU;fa.sizset=i;}if(fa.nodeName.toLowerCase()===eT){eY=fa;break;}fa=fa[eS];}eV[i]=eY;}}}function w(fb,fc,fd,fe,ff,fg){for(var i=0,l=fe.length;i<l;i++){var fi=fe[i];if(fi){var fh=false;fi=fi[fb];while(fi){if(fi.sizcache===fd){fh=fe[fi.sizset];break;}if(fi.nodeType===1){if(!fg){fi.sizcache=fd;fi.sizset=i;}if(typeof fc!=="string"){if(fi===fc){fh=true;break;}}else if(g.filter(fc,[fi]).length>0){fh=fi;break;}}fi=fi[fb];}fe[i]=fh;}}}if(document.documentElement.contains){g.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):true);};}else if(document.documentElement.compareDocumentPosition){g.contains=function(a,b){return !!(a.compareDocumentPosition(b)&16);};}else{g.contains=function(){return false;};}g.isXML=function(fj){var fk=(fj?fj.ownerDocument||fj:0).documentElement;return fk?fk.nodeName!=="HTML":false;};var h=function(fl,fm){var fq,fo=[],fn="",fp=fm.nodeType?[fm]:fm;while((fq=k.match.PSEUDO.exec(fl))){fn+=fq[0];fl=fl.replace(k.match.PSEUDO,"");}fl=k.relative[fl]?fl+"*":fl;for(var i=0,l=fp.length;i<l;i++){g(fl,fp[i],fo);}return g.filter(fn,fo);};var t=qx.bom.Selector;t.query=function(fr,fs){return g(fr,fs);};t.matches=function(ft,fu){return g(ft,null,null,fu);};})();})();(function(){var r="qx.client",q="",p="mshtml",o="'",n="SelectionLanguage",m="qx.xml.Document",k=" />",j="MSXML2.DOMDocument.3.0",h='<\?xml version="1.0" encoding="utf-8"?>\n<',g="MSXML2.XMLHTTP.3.0",c="MSXML2.XMLHTTP.6.0",f=" xmlns='",e="text/xml",b="XPath",a="MSXML2.DOMDocument.6.0",d="HTML";qx.Class.define(m,{statics:{DOMDOC:null,XMLHTTP:null,isXmlDocument:function(s){if(s.nodeType===9){return s.documentElement.nodeName!==d;}else if(s.ownerDocument){return this.isXmlDocument(s.ownerDocument);}else{return false;}},create:qx.core.Variant.select(r,{"mshtml":function(t,u){var v=new ActiveXObject(this.DOMDOC);v.setProperty(n,b);if(u){var w=h;w+=u;if(t){w+=f+t+o;}w+=k;v.loadXML(w);}return v;},"default":function(x,y){return document.implementation.createDocument(x||q,y||q,null);}}),fromString:qx.core.Variant.select(r,{"mshtml":function(z){var A=qx.xml.Document.create();A.loadXML(z);return A;},"default":function(B){var C=new DOMParser();return C.parseFromString(B,e);}})},defer:function(D){if(qx.core.Variant.isSet(r,p)){var E=[a,j];var F=[c,g];for(var i=0,l=E.length;i<l;i++){try{new ActiveXObject(E[i]);new ActiveXObject(F[i]);}catch(G){continue;}D.DOMDOC=E[i];D.XMLHTTP=F[i];break;}}}});})();(function(){var k="visible",j="scroll",i="borderBottomWidth",h="borderTopWidth",g="left",f="borderLeftWidth",e="bottom",d="top",c="right",b="qx.bom.element.Scroll",a="borderRightWidth";qx.Class.define(b,{statics:{intoViewX:function(l,stop,m){var parent=l.parentNode;var r=qx.dom.Node.getDocument(l);var n=r.body;var z,x,u;var B,s,C;var v,D,G;var E,p,y,o;var t,F,w;var q=m===g;var A=m===c;stop=stop?stop.parentNode:r;while(parent&&parent!=stop){if(parent.scrollWidth>parent.clientWidth&&(parent===n||qx.bom.element.Overflow.getY(parent)!=k)){if(parent===n){x=parent.scrollLeft;u=x+qx.bom.Viewport.getWidth();B=qx.bom.Viewport.getWidth();s=parent.clientWidth;C=parent.scrollWidth;v=0;D=0;G=0;}else{z=qx.bom.element.Location.get(parent);x=z.left;u=z.right;B=parent.offsetWidth;s=parent.clientWidth;C=parent.scrollWidth;v=parseInt(qx.bom.element.Style.get(parent,f),10)||0;D=parseInt(qx.bom.element.Style.get(parent,a),10)||0;G=B-s-v-D;}E=qx.bom.element.Location.get(l);p=E.left;y=E.right;o=l.offsetWidth;t=p-x-v;F=y-u+D;w=0;if(q){w=t;}else if(A){w=F+G;}else if(t<0||o>s){w=t;}else if(F>0){w=F+G;}parent.scrollLeft+=w;if(qx.bom.client.Engine.GECKO||qx.bom.client.Engine.OPERA){qx.event.Registration.fireNonBubblingEvent(parent,j);}}if(parent===n){break;}parent=parent.parentNode;}},intoViewY:function(H,stop,I){var parent=H.parentNode;var O=qx.dom.Node.getDocument(H);var J=O.body;var W,K,S;var Y,V,Q;var M,N,L;var bb,bc,X,R;var U,P,bd;var ba=I===d;var T=I===e;stop=stop?stop.parentNode:O;while(parent&&parent!=stop){if(parent.scrollHeight>parent.clientHeight&&(parent===J||qx.bom.element.Overflow.getY(parent)!=k)){if(parent===J){K=parent.scrollTop;S=K+qx.bom.Viewport.getHeight();Y=qx.bom.Viewport.getHeight();V=parent.clientHeight;Q=parent.scrollHeight;M=0;N=0;L=0;}else{W=qx.bom.element.Location.get(parent);K=W.top;S=W.bottom;Y=parent.offsetHeight;V=parent.clientHeight;Q=parent.scrollHeight;M=parseInt(qx.bom.element.Style.get(parent,h),10)||0;N=parseInt(qx.bom.element.Style.get(parent,i),10)||0;L=Y-V-M-N;}bb=qx.bom.element.Location.get(H);bc=bb.top;X=bb.bottom;R=H.offsetHeight;U=bc-K-M;P=X-S+N;bd=0;if(ba){bd=U;}else if(T){bd=P+L;}else if(U<0||R>V){bd=U;}else if(P>0){bd=P+L;}parent.scrollTop+=bd;if(qx.bom.client.Engine.GECKO||qx.bom.client.Engine.OPERA){qx.event.Registration.fireNonBubblingEvent(parent,j);}}if(parent===J){break;}parent=parent.parentNode;}},intoView:function(be,stop,bf,bg){this.intoViewX(be,stop,bf);this.intoViewY(be,stop,bg);}}});})();(function(){var k="",j="qx.client",i="hidden",h="-moz-scrollbars-none",g="overflow",f=";",e="overflowY",d=":",b="overflowX",a="overflow:",y="none",x="scroll",w="borderLeftStyle",v="borderRightStyle",u="div",r="borderRightWidth",q="overflow-y",p="borderLeftWidth",o="-moz-scrollbars-vertical",n="100px",l="qx.bom.element.Overflow",m="overflow-x";qx.Class.define(l,{statics:{__kL:null,getScrollbarWidth:function(){if(this.__kL!==null){return this.__kL;}var z=qx.bom.element.Style;var B=function(F,G){return parseInt(z.get(F,G),10)||0;};var C=function(H){return (z.get(H,v)==y?0:B(H,r));};var A=function(I){return (z.get(I,w)==y?0:B(I,p));};var E=qx.core.Variant.select(j,{"mshtml":function(J){if(z.get(J,e)==i||J.clientWidth==0){return C(J);}return Math.max(0,J.offsetWidth-J.clientLeft-J.clientWidth);},"default":function(K){if(K.clientWidth==0){var L=z.get(K,g);var M=(L==x||L==o?16:0);return Math.max(0,C(K)+M);}return Math.max(0,(K.offsetWidth-K.clientWidth-A(K)));}});var D=function(N){return E(N)-C(N);};var t=document.createElement(u);var s=t.style;s.height=s.width=n;s.overflow=x;document.body.appendChild(t);var c=D(t);this.__kL=c?c:16;document.body.removeChild(t);return this.__kL;},_compile:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(O,P){if(P==i){P=h;}return a+P+f;}:function(Q,R){return Q+d+R+f;},"opera":qx.bom.client.Engine.VERSION<9.5?function(S,T){return a+T+f;}:function(U,V){return U+d+V+f;},"default":function(W,X){return W+d+X+f;}}),compileX:function(Y){return this._compile(m,Y);},compileY:function(ba){return this._compile(q,ba);},getX:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(bb,bc){var bd=qx.bom.element.Style.get(bb,g,bc,false);if(bd===h){bd=i;}return bd;}:function(be,bf){return qx.bom.element.Style.get(be,b,bf,false);},"opera":qx.bom.client.Engine.VERSION<9.5?function(bg,bh){return qx.bom.element.Style.get(bg,g,bh,false);}:function(bi,bj){return qx.bom.element.Style.get(bi,b,bj,false);},"default":function(bk,bl){return qx.bom.element.Style.get(bk,b,bl,false);}}),setX:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(bm,bn){if(bn==i){bn=h;}bm.style.overflow=bn;}:function(bo,bp){bo.style.overflowX=bp;},"opera":qx.bom.client.Engine.VERSION<9.5?function(bq,br){bq.style.overflow=br;}:function(bs,bt){bs.style.overflowX=bt;},"default":function(bu,bv){bu.style.overflowX=bv;}}),resetX:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(bw){bw.style.overflow=k;}:function(bx){bx.style.overflowX=k;},"opera":qx.bom.client.Engine.VERSION<9.5?function(by,bz){by.style.overflow=k;}:function(bA,bB){bA.style.overflowX=k;},"default":function(bC){bC.style.overflowX=k;}}),getY:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(bD,bE){var bF=qx.bom.element.Style.get(bD,g,bE,false);if(bF===h){bF=i;}return bF;}:function(bG,bH){return qx.bom.element.Style.get(bG,e,bH,false);},"opera":qx.bom.client.Engine.VERSION<9.5?function(bI,bJ){return qx.bom.element.Style.get(bI,g,bJ,false);}:function(bK,bL){return qx.bom.element.Style.get(bK,e,bL,false);},"default":function(bM,bN){return qx.bom.element.Style.get(bM,e,bN,false);}}),setY:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(bO,bP){if(bP===i){bP=h;}bO.style.overflow=bP;}:function(bQ,bR){bQ.style.overflowY=bR;},"opera":qx.bom.client.Engine.VERSION<9.5?function(bS,bT){bS.style.overflow=bT;}:function(bU,bV){bU.style.overflowY=bV;},"default":function(bW,bX){bW.style.overflowY=bX;}}),resetY:qx.core.Variant.select(j,{"gecko":qx.bom.client.Engine.VERSION<1.8?function(bY){bY.style.overflow=k;}:function(ca){ca.style.overflowY=k;},"opera":qx.bom.client.Engine.VERSION<9.5?function(cb,cc){cb.style.overflow=k;}:function(cd,ce){cd.style.overflowY=k;},"default":function(cf){cf.style.overflowY=k;}})}});})();(function(){var q="qx.client",p="",o="boxSizing",n="box-sizing",m=":",k="border-box",j="qx.bom.element.BoxSizing",h="KhtmlBoxSizing",g="-moz-box-sizing",f="WebkitBoxSizing",c=";",e="-khtml-box-sizing",d="content-box",b="-webkit-box-sizing",a="MozBoxSizing";qx.Class.define(j,{statics:{__cH:qx.core.Variant.select(q,{"mshtml":null,"webkit":[o,h,f],"gecko":[a],"opera":[o]}),__cI:qx.core.Variant.select(q,{"mshtml":null,"webkit":[n,e,b],"gecko":[g],"opera":[n]}),__cJ:{tags:{button:true,select:true},types:{search:true,button:true,submit:true,reset:true,checkbox:true,radio:true}},__cK:function(r){var s=this.__cJ;return s.tags[r.tagName.toLowerCase()]||s.types[r.type];},compile:qx.core.Variant.select(q,{"mshtml":function(t){{};},"default":function(u){var w=this.__cI;var v=p;if(w){for(var i=0,l=w.length;i<l;i++){v+=w[i]+m+u+c;}}return v;}}),get:qx.core.Variant.select(q,{"mshtml":function(x){if(qx.bom.Document.isStandardMode(qx.dom.Node.getDocument(x))){if(!this.__cK(x)){return d;}}return k;},"default":function(y){var A=this.__cH;var z;if(A){for(var i=0,l=A.length;i<l;i++){z=qx.bom.element.Style.get(y,A[i],null,false);if(z!=null&&z!==p){return z;}}}return p;}}),set:qx.core.Variant.select(q,{"mshtml":function(B,C){{};},"default":function(D,E){var F=this.__cH;if(F){for(var i=0,l=F.length;i<l;i++){D.style[F[i]]=E;}}}}),reset:function(G){this.set(G,p);}}});})();(function(){var k="n-resize",j="e-resize",i="nw-resize",h="ne-resize",g="",f="cursor:",e="qx.client",d=";",c="qx.bom.element.Cursor",b="cursor",a="hand";qx.Class.define(c,{statics:{__eR:qx.core.Variant.select(e,{"mshtml":{"cursor":a,"ew-resize":j,"ns-resize":k,"nesw-resize":h,"nwse-resize":i},"opera":{"col-resize":j,"row-resize":k,"ew-resize":j,"ns-resize":k,"nesw-resize":h,"nwse-resize":i},"default":{}}),compile:function(l){return f+(this.__eR[l]||l)+d;},get:function(m,n){return qx.bom.element.Style.get(m,b,n,false);},set:function(o,p){o.style.cursor=this.__eR[p]||p;},reset:function(q){q.style.cursor=g;}}});})();(function(){var o="auto",n="px",m=",",l="clip:auto;",k="rect(",j=");",i="",h=")",g="qx.bom.element.Clip",f="string",c="clip:rect(",e=" ",d="clip",b="rect(auto,auto,auto,auto)",a="rect(auto, auto, auto, auto)";qx.Class.define(g,{statics:{compile:function(p){if(!p){return l;}var u=p.left;var top=p.top;var t=p.width;var s=p.height;var q,r;if(u==null){q=(t==null?o:t+n);u=o;}else{q=(t==null?o:u+t+n);u=u+n;}if(top==null){r=(s==null?o:s+n);top=o;}else{r=(s==null?o:top+s+n);top=top+n;}return c+top+m+q+m+r+m+u+j;},get:function(v,w){var y=qx.bom.element.Style.get(v,d,w,false);var E,top,C,B;var x,z;if(typeof y===f&&y!==o&&y!==i){y=qx.lang.String.trim(y);if(/\((.*)\)/.test(y)){var D=RegExp.$1;if(/,/.test(D)){var A=D.split(m);}else{var A=D.split(e);}top=qx.lang.String.trim(A[0]);x=qx.lang.String.trim(A[1]);z=qx.lang.String.trim(A[2]);E=qx.lang.String.trim(A[3]);if(E===o){E=null;}if(top===o){top=null;}if(x===o){x=null;}if(z===o){z=null;}if(top!=null){top=parseInt(top,10);}if(x!=null){x=parseInt(x,10);}if(z!=null){z=parseInt(z,10);}if(E!=null){E=parseInt(E,10);}if(x!=null&&E!=null){C=x-E;}else if(x!=null){C=x;}if(z!=null&&top!=null){B=z-top;}else if(z!=null){B=z;}}else{throw new Error("Could not parse clip string: "+y);}}return {left:E||null,top:top||null,width:C||null,height:B||null};},set:function(F,G){if(!G){F.style.clip=b;return;}var L=G.left;var top=G.top;var K=G.width;var J=G.height;var H,I;if(L==null){H=(K==null?o:K+n);L=o;}else{H=(K==null?o:L+K+n);L=L+n;}if(top==null){I=(J==null?o:J+n);top=o;}else{I=(J==null?o:top+J+n);top=top+n;}F.style.clip=k+top+m+H+m+I+m+L+h;},reset:function(M){M.style.clip=a;}}});})();(function(){var m="",l="qx.client",k=";",j="opacity:",i="opacity",h="filter",g="MozOpacity",f=");",e=")",d="zoom:1;filter:alpha(opacity=",a="qx.bom.element.Opacity",c="alpha(opacity=",b="-moz-opacity:";qx.Class.define(a,{statics:{SUPPORT_CSS3_OPACITY:false,compile:qx.core.Variant.select(l,{"mshtml":function(n){if(n>=1){n=1;}if(n<0.00001){n=0;}if(qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){return j+n+k;}else{return d+(n*100)+f;}},"gecko":function(o){if(o>=1){o=0.999999;}if(!qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){return b+o+k;}else{return j+o+k;}},"default":function(p){if(p>=1){return m;}return j+p+k;}}),set:qx.core.Variant.select(l,{"mshtml":function(q,r){if(qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){if(r>=1){r=m;}q.style.opacity=r;}else{var s=qx.bom.element.Style.get(q,h,qx.bom.element.Style.COMPUTED_MODE,false);if(r>=1){r=1;}if(r<0.00001){r=0;}if(!q.currentStyle||!q.currentStyle.hasLayout){q.style.zoom=1;}q.style.filter=s.replace(/alpha\([^\)]*\)/gi,m)+c+r*100+e;}},"gecko":function(t,u){if(u>=1){u=0.999999;}if(!qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){t.style.MozOpacity=u;}else{t.style.opacity=u;}},"default":function(v,w){if(w>=1){w=m;}v.style.opacity=w;}}),reset:qx.core.Variant.select(l,{"mshtml":function(x){if(qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){x.style.opacity=m;}else{var y=qx.bom.element.Style.get(x,h,qx.bom.element.Style.COMPUTED_MODE,false);x.style.filter=y.replace(/alpha\([^\)]*\)/gi,m);}},"gecko":function(z){if(!qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){z.style.MozOpacity=m;}else{z.style.opacity=m;}},"default":function(A){A.style.opacity=m;}}),get:qx.core.Variant.select(l,{"mshtml":function(B,C){if(qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY){var D=qx.bom.element.Style.get(B,i,C,false);if(D!=null){return parseFloat(D);}return 1.0;}else{var E=qx.bom.element.Style.get(B,h,C,false);if(E){var D=E.match(/alpha\(opacity=(.*)\)/);if(D&&D[1]){return parseFloat(D[1])/100;}}return 1.0;}},"gecko":function(F,G){var H=qx.bom.element.Style.get(F,!qx.bom.element.Opacity.SUPPORT_CSS3_OPACITY?g:i,G,false);if(H==0.999999){H=1.0;}if(H!=null){return parseFloat(H);}return 1.0;},"default":function(I,J){var K=qx.bom.element.Style.get(I,i,J,false);if(K!=null){return parseFloat(K);}return 1.0;}})},defer:function(L){L.SUPPORT_CSS3_OPACITY=(typeof document.documentElement.style.opacity=="string");}});})();(function(){var m="",k="qx.client",h="userSelect",g="style",f="MozUserModify",e="px",d="float",c="borderImage",b="styleFloat",a="appearance",F="pixelHeight",E='Ms',D=":",C="cssFloat",B="pixelTop",A="pixelLeft",z='O',y="qx.bom.element.Style",x='Khtml',w='string',t="pixelRight",u='Moz',r="pixelWidth",s="pixelBottom",p=";",q="textOverflow",n="userModify",o='Webkit',v="WebkitUserModify";qx.Class.define(y,{statics:{__cr:function(){var G=[a,h,q,c];var K={};var H=document.documentElement.style;var L=[u,o,x,z,E];for(var i=0,l=G.length;i<l;i++){var M=G[i];var I=M;if(H[M]){K[I]=M;continue;}M=qx.lang.String.firstUp(M);for(var j=0,N=L.length;j<N;j++){var J=L[j]+M;if(typeof H[J]==w){K[I]=J;break;}}}this.__cs=K;this.__cs[n]=qx.core.Variant.select(k,{"gecko":f,"webkit":v,"default":h});this.__ct={};for(var I in K){this.__ct[I]=this.__cx(K[I]);}this.__cs[d]=qx.core.Variant.select(k,{"mshtml":b,"default":C});},__cu:{width:r,height:F,left:A,right:t,top:B,bottom:s},__cv:{clip:qx.bom.element.Clip,cursor:qx.bom.element.Cursor,opacity:qx.bom.element.Opacity,boxSizing:qx.bom.element.BoxSizing,overflowX:{set:qx.lang.Function.bind(qx.bom.element.Overflow.setX,qx.bom.element.Overflow),get:qx.lang.Function.bind(qx.bom.element.Overflow.getX,qx.bom.element.Overflow),reset:qx.lang.Function.bind(qx.bom.element.Overflow.resetX,qx.bom.element.Overflow),compile:qx.lang.Function.bind(qx.bom.element.Overflow.compileX,qx.bom.element.Overflow)},overflowY:{set:qx.lang.Function.bind(qx.bom.element.Overflow.setY,qx.bom.element.Overflow),get:qx.lang.Function.bind(qx.bom.element.Overflow.getY,qx.bom.element.Overflow),reset:qx.lang.Function.bind(qx.bom.element.Overflow.resetY,qx.bom.element.Overflow),compile:qx.lang.Function.bind(qx.bom.element.Overflow.compileY,qx.bom.element.Overflow)}},compile:function(O){var Q=[];var S=this.__cv;var R=this.__ct;var name,P;for(name in O){P=O[name];if(P==null){continue;}name=R[name]||name;if(S[name]){Q.push(S[name].compile(P));}else{Q.push(this.__cx(name),D,P,p);}}return Q.join(m);},__cw:{},__cx:function(T){var U=this.__cw;var V=U[T];if(!V){V=U[T]=qx.lang.String.hyphenate(T);}return V;},setCss:qx.core.Variant.select(k,{"mshtml":function(W,X){W.style.cssText=X;},"default":function(Y,ba){Y.setAttribute(g,ba);}}),getCss:qx.core.Variant.select(k,{"mshtml":function(bb){return bb.style.cssText.toLowerCase();},"default":function(bc){return bc.getAttribute(g);}}),isPropertySupported:function(bd){return (this.__cv[bd]||this.__cs[bd]||bd in document.documentElement.style);},COMPUTED_MODE:1,CASCADED_MODE:2,LOCAL_MODE:3,set:function(be,name,bf,bg){{};name=this.__cs[name]||name;if(bg!==false&&this.__cv[name]){return this.__cv[name].set(be,bf);}else{be.style[name]=bf!==null?bf:m;}},setStyles:function(bh,bi,bj){{};var bm=this.__cs;var bo=this.__cv;var bk=bh.style;for(var bn in bi){var bl=bi[bn];var name=bm[bn]||bn;if(bl===undefined){if(bj!==false&&bo[name]){bo[name].reset(bh);}else{bk[name]=m;}}else{if(bj!==false&&bo[name]){bo[name].set(bh,bl);}else{bk[name]=bl!==null?bl:m;}}}},reset:function(bp,name,bq){name=this.__cs[name]||name;if(bq!==false&&this.__cv[name]){return this.__cv[name].reset(bp);}else{bp.style[name]=m;}},get:qx.core.Variant.select(k,{"mshtml":function(br,name,bs,bt){name=this.__cs[name]||name;if(bt!==false&&this.__cv[name]){return this.__cv[name].get(br,bs);}if(!br.currentStyle){return br.style[name]||m;}switch(bs){case this.LOCAL_MODE:return br.style[name]||m;case this.CASCADED_MODE:return br.currentStyle[name]||m;default:var bx=br.currentStyle[name]||m;if(/^-?[\.\d]+(px)?$/i.test(bx)){return bx;}var bw=this.__cu[name];if(bw){var bu=br.style[name];br.style[name]=bx||0;var bv=br.style[bw]+e;br.style[name]=bu;return bv;}if(/^-?[\.\d]+(em|pt|%)?$/i.test(bx)){throw new Error("Untranslated computed property value: "+name+". Only pixel values work well across different clients.");}return bx;}},"default":function(by,name,bz,bA){name=this.__cs[name]||name;if(bA!==false&&this.__cv[name]){return this.__cv[name].get(by,bz);}switch(bz){case this.LOCAL_MODE:return by.style[name]||m;case this.CASCADED_MODE:if(by.currentStyle){return by.currentStyle[name]||m;}throw new Error("Cascaded styles are not supported in this browser!");default:var bB=qx.dom.Node.getDocument(by);var bC=bB.defaultView.getComputedStyle(by,null);return bC?bC[name]:m;}}})},defer:function(bD){bD.__cr();}});})();(function(){var j="borderTopWidth",i="borderLeftWidth",h="marginTop",g="marginLeft",f="scroll",e="qx.client",d="border-box",c="borderBottomWidth",b="borderRightWidth",a="auto",y="padding",x="qx.bom.element.Location",w="paddingLeft",v="static",u="marginBottom",t="visible",s="BODY",r="paddingBottom",q="paddingTop",p="marginRight",n="position",o="margin",l="overflow",m="paddingRight",k="border";qx.Class.define(x,{statics:{__iY:function(z,A){return qx.bom.element.Style.get(z,A,qx.bom.element.Style.COMPUTED_MODE,false);},__ja:function(B,C){return parseInt(qx.bom.element.Style.get(B,C,qx.bom.element.Style.COMPUTED_MODE,false),10)||0;},__jb:function(D){var G=0,top=0;if(D.getBoundingClientRect&&!qx.bom.client.Engine.OPERA){var F=qx.dom.Node.getWindow(D);G-=qx.bom.Viewport.getScrollLeft(F);top-=qx.bom.Viewport.getScrollTop(F);}else{var E=qx.dom.Node.getDocument(D).body;D=D.parentNode;while(D&&D!=E){G+=D.scrollLeft;top+=D.scrollTop;D=D.parentNode;}}return {left:G,top:top};},__jc:qx.core.Variant.select(e,{"mshtml":function(H){var J=qx.dom.Node.getDocument(H);var I=J.body;var K=0;var top=0;K-=I.clientLeft+J.documentElement.clientLeft;top-=I.clientTop+J.documentElement.clientTop;if(qx.bom.client.Feature.STANDARD_MODE){K+=this.__ja(I,i);top+=this.__ja(I,j);}return {left:K,top:top};},"webkit":function(L){var N=qx.dom.Node.getDocument(L);var M=N.body;var O=M.offsetLeft;var top=M.offsetTop;if(qx.bom.client.Engine.VERSION<530.17){O+=this.__ja(M,i);top+=this.__ja(M,j);}return {left:O,top:top};},"gecko":function(P){var Q=qx.dom.Node.getDocument(P).body;var R=Q.offsetLeft;var top=Q.offsetTop;if(qx.bom.client.Engine.VERSION<1.9){R+=this.__ja(Q,g);top+=this.__ja(Q,h);}if(qx.bom.element.BoxSizing.get(Q)!==d){R+=this.__ja(Q,i);top+=this.__ja(Q,j);}return {left:R,top:top};},"default":function(S){var T=qx.dom.Node.getDocument(S).body;var U=T.offsetLeft;var top=T.offsetTop;return {left:U,top:top};}}),__jd:qx.core.Variant.select(e,{"mshtml|webkit":function(V){var X=qx.dom.Node.getDocument(V);if(V.getBoundingClientRect){var Y=V.getBoundingClientRect();var ba=Y.left;var top=Y.top;}else{var ba=V.offsetLeft;var top=V.offsetTop;V=V.offsetParent;var W=X.body;while(V&&V!=W){ba+=V.offsetLeft;top+=V.offsetTop;ba+=this.__ja(V,i);top+=this.__ja(V,j);V=V.offsetParent;}}return {left:ba,top:top};},"gecko":function(bb){if(bb.getBoundingClientRect){var be=bb.getBoundingClientRect();var bf=Math.round(be.left);var top=Math.round(be.top);}else{var bf=0;var top=0;var bc=qx.dom.Node.getDocument(bb).body;var bd=qx.bom.element.BoxSizing;if(bd.get(bb)!==d){bf-=this.__ja(bb,i);top-=this.__ja(bb,j);}while(bb&&bb!==bc){bf+=bb.offsetLeft;top+=bb.offsetTop;if(bd.get(bb)!==d){bf+=this.__ja(bb,i);top+=this.__ja(bb,j);}if(bb.parentNode&&this.__iY(bb.parentNode,l)!=t){bf+=this.__ja(bb.parentNode,i);top+=this.__ja(bb.parentNode,j);}bb=bb.offsetParent;}}return {left:bf,top:top};},"default":function(bg){var bi=0;var top=0;var bh=qx.dom.Node.getDocument(bg).body;while(bg&&bg!==bh){bi+=bg.offsetLeft;top+=bg.offsetTop;bg=bg.offsetParent;}return {left:bi,top:top};}}),get:function(bj,bk){if(bj.tagName==s){var location=this.__je(bj);var br=location.left;var top=location.top;}else{var bl=this.__jc(bj);var bq=this.__jd(bj);var scroll=this.__jb(bj);var br=bq.left+bl.left-scroll.left;var top=bq.top+bl.top-scroll.top;}var bm=br+bj.offsetWidth;var bn=top+bj.offsetHeight;if(bk){if(bk==y||bk==f){var bo=qx.bom.element.Overflow.getX(bj);if(bo==f||bo==a){bm+=bj.scrollWidth-bj.offsetWidth+this.__ja(bj,i)+this.__ja(bj,b);}var bp=qx.bom.element.Overflow.getY(bj);if(bp==f||bp==a){bn+=bj.scrollHeight-bj.offsetHeight+this.__ja(bj,j)+this.__ja(bj,c);}}switch(bk){case y:br+=this.__ja(bj,w);top+=this.__ja(bj,q);bm-=this.__ja(bj,m);bn-=this.__ja(bj,r);case f:br-=bj.scrollLeft;top-=bj.scrollTop;bm-=bj.scrollLeft;bn-=bj.scrollTop;case k:br+=this.__ja(bj,i);top+=this.__ja(bj,j);bm-=this.__ja(bj,b);bn-=this.__ja(bj,c);break;case o:br-=this.__ja(bj,g);top-=this.__ja(bj,h);bm+=this.__ja(bj,p);bn+=this.__ja(bj,u);break;}}return {left:br,top:top,right:bm,bottom:bn};},__je:qx.core.Variant.select(e,{"default":function(bs){var top=bs.offsetTop+this.__ja(bs,h);var bt=bs.offsetLeft+this.__ja(bs,g);return {left:bt,top:top};},"mshtml":function(bu){var top=bu.offsetTop;var bv=bu.offsetLeft;if(!((qx.bom.client.Engine.VERSION<8||qx.bom.client.Engine.DOCUMENT_MODE<8)&&!qx.bom.client.Feature.QUIRKS_MODE)){top+=this.__ja(bu,h);bv+=this.__ja(bu,g);}return {left:bv,top:top};},"gecko":function(bw){var top=bw.offsetTop+this.__ja(bw,h)+this.__ja(bw,i);var bx=bw.offsetLeft+this.__ja(bw,g)+this.__ja(bw,j);return {left:bx,top:top};}}),getLeft:function(by,bz){return this.get(by,bz).left;},getTop:function(bA,bB){return this.get(bA,bB).top;},getRight:function(bC,bD){return this.get(bC,bD).right;},getBottom:function(bE,bF){return this.get(bE,bF).bottom;},getRelative:function(bG,bH,bI,bJ){var bL=this.get(bG,bI);var bK=this.get(bH,bJ);return {left:bL.left-bK.left,top:bL.top-bK.top,right:bL.right-bK.right,bottom:bL.bottom-bK.bottom};},getPosition:function(bM){return this.getRelative(bM,this.getOffsetParent(bM));},getOffsetParent:function(bN){var bP=bN.offsetParent||document.body;var bO=qx.bom.element.Style;while(bP&&(!/^body|html$/i.test(bP.tagName)&&bO.get(bP,n)===v)){bP=bP.offsetParent;}return bP;}}});})();(function(){var b="qx.ui.core.queue.Widget",a="widget";qx.Class.define(b,{statics:{__iQ:{},remove:function(c){delete this.__iQ[c.$$hash];},add:function(d){var e=this.__iQ;if(e[d.$$hash]){return;}e[d.$$hash]=d;qx.ui.core.queue.Manager.scheduleFlush(a);},flush:function(){var f=this.__iQ;var h;for(var g in f){h=f[g];delete f[g];h.syncWidget();}for(var g in f){return;}this.__iQ={};}}});})();(function(){var b="qx.ui.core.queue.Visibility",a="visibility";qx.Class.define(b,{statics:{__iC:{},__iD:{},remove:function(c){var d=c.$$hash;delete this.__iD[d];delete this.__iC[d];},isVisible:function(e){return this.__iD[e.$$hash]||false;},__iE:function(f){var h=this.__iD;var g=f.$$hash;var i;if(f.isExcluded()){i=false;}else{var parent=f.$$parent;if(parent){i=this.__iE(parent);}else{i=f.isRootWidget();}}return h[g]=i;},add:function(j){var k=this.__iC;if(k[j.$$hash]){return;}k[j.$$hash]=j;qx.ui.core.queue.Manager.scheduleFlush(a);},flush:function(){var l=this.__iC;var p=this.__iD;for(var m in l){if(p[m]!=null){l[m].addChildrenToQueue(l);}}var o={};for(var m in l){o[m]=p[m];p[m]=null;}for(var m in l){var n=l[m];delete l[m];if(p[m]==null){this.__iE(n);}if(p[m]&&p[m]!=o[m]){n.checkAppearanceNeeds();}}this.__iC={};}}});})();(function(){var b="appearance",a="qx.ui.core.queue.Appearance";qx.Class.define(a,{statics:{__hL:{},remove:function(c){delete this.__hL[c.$$hash];},add:function(d){var e=this.__hL;if(e[d.$$hash]){return;}e[d.$$hash]=d;qx.ui.core.queue.Manager.scheduleFlush(b);},has:function(f){return !!this.__hL[f.$$hash];},flush:function(){var j=qx.ui.core.queue.Visibility;var g=this.__hL;var i;for(var h in g){i=g[h];delete g[h];if(j.isVisible(i)){i.syncAppearance();}else{i.$$stateChanges=true;}}}}});})();(function(){var b="qx.ui.core.queue.Layout",a="layout";qx.Class.define(b,{statics:{__if:{},remove:function(c){delete this.__if[c.$$hash];},add:function(d){this.__if[d.$$hash]=d;qx.ui.core.queue.Manager.scheduleFlush(a);},flush:function(){var e=this.__ii();for(var i=e.length-1;i>=0;i--){var f=e[i];if(f.hasValidLayout()){continue;}if(f.isRootWidget()&&!f.hasUserBounds()){var h=f.getSizeHint();f.renderLayout(0,0,h.width,h.height);}else{var g=f.getBounds();f.renderLayout(g.left,g.top,g.width,g.height);}}},getNestingLevel:function(j){var k=this.__ih;var m=0;var parent=j;while(true){if(k[parent.$$hash]!=null){m+=k[parent.$$hash];break;}if(!parent.$$parent){break;}parent=parent.$$parent;m+=1;}var l=m;while(j&&j!==parent){k[j.$$hash]=l--;j=j.$$parent;}return m;},__ig:function(){var s=qx.ui.core.queue.Visibility;this.__ih={};var r=[];var q=this.__if;var n,p;for(var o in q){n=q[o];if(s.isVisible(n)){p=this.getNestingLevel(n);if(!r[p]){r[p]={};}r[p][o]=n;delete q[o];}}return r;},__ii:function(){var w=[];var y=this.__ig();for(var v=y.length-1;v>=0;v--){if(!y[v]){continue;}for(var u in y[v]){var t=y[v][u];if(v==0||t.isRootWidget()||t.hasUserBounds()){w.push(t);t.invalidateLayoutCache();continue;}var A=t.getSizeHint(false);if(A){t.invalidateLayoutCache();var x=t.getSizeHint();var z=(!t.getBounds()||A.minWidth!==x.minWidth||A.width!==x.width||A.maxWidth!==x.maxWidth||A.minHeight!==x.minHeight||A.height!==x.height||A.maxHeight!==x.maxHeight);}else{z=true;}if(z){var parent=t.getLayoutParent();if(!y[v-1]){y[v-1]={};}y[v-1][parent.$$hash]=parent;}else{w.push(t);}}}return w;}}});})();(function(){var b="dispose",a="qx.ui.core.queue.Dispose";qx.Class.define(a,{statics:{__eX:{},add:function(c){var d=this.__eX;if(d[c.$$hash]){return;}d[c.$$hash]=c;qx.ui.core.queue.Manager.scheduleFlush(b);},flush:function(){var e=this.__eX;for(var g in e){var f=e[g];delete e[g];f.dispose();}for(var g in e){return;}this.__eX={};}}});})();(function(){var a="qx.ui.core.MChildrenHandling";qx.Mixin.define(a,{members:{getChildren:function(){return this._getChildren();},hasChildren:function(){return this._hasChildren();},indexOf:function(b){return this._indexOf(b);},add:function(c,d){this._add(c,d);},addAt:function(e,f,g){this._addAt(e,f,g);},addBefore:function(h,i,j){this._addBefore(h,i,j);},addAfter:function(k,l,m){this._addAfter(k,l,m);},remove:function(n){this._remove(n);},removeAt:function(o){return this._removeAt(o);},removeAll:function(){this._removeAll();}},statics:{remap:function(p){p.getChildren=p._getChildren;p.hasChildren=p._hasChildren;p.indexOf=p._indexOf;p.add=p._add;p.addAt=p._addAt;p.addBefore=p._addBefore;p.addAfter=p._addAfter;p.remove=p._remove;p.removeAt=p._removeAt;p.removeAll=p._removeAll;}}});})();(function(){var a="qx.ui.core.MLayoutHandling";qx.Mixin.define(a,{members:{setLayout:function(b){return this._setLayout(b);},getLayout:function(){return this._getLayout();}},statics:{remap:function(c){c.getLayout=c._getLayout;c.setLayout=c._setLayout;}}});})();(function(){var j="Integer",i="_applyDimension",h="Boolean",g="_applyStretching",f="_applyMargin",e="shorthand",d="_applyAlign",c="allowShrinkY",b="bottom",a="baseline",x="marginBottom",w="qx.ui.core.LayoutItem",v="center",u="marginTop",t="allowGrowX",s="middle",r="marginLeft",q="allowShrinkX",p="top",o="right",m="marginRight",n="abstract",k="allowGrowY",l="left";qx.Class.define(w,{type:n,extend:qx.core.Object,properties:{minWidth:{check:j,nullable:true,apply:i,init:null,themeable:true},width:{check:j,nullable:true,apply:i,init:null,themeable:true},maxWidth:{check:j,nullable:true,apply:i,init:null,themeable:true},minHeight:{check:j,nullable:true,apply:i,init:null,themeable:true},height:{check:j,nullable:true,apply:i,init:null,themeable:true},maxHeight:{check:j,nullable:true,apply:i,init:null,themeable:true},allowGrowX:{check:h,apply:g,init:true,themeable:true},allowShrinkX:{check:h,apply:g,init:true,themeable:true},allowGrowY:{check:h,apply:g,init:true,themeable:true},allowShrinkY:{check:h,apply:g,init:true,themeable:true},allowStretchX:{group:[t,q],mode:e,themeable:true},allowStretchY:{group:[k,c],mode:e,themeable:true},marginTop:{check:j,init:0,apply:f,themeable:true},marginRight:{check:j,init:0,apply:f,themeable:true},marginBottom:{check:j,init:0,apply:f,themeable:true},marginLeft:{check:j,init:0,apply:f,themeable:true},margin:{group:[u,m,x,r],mode:e,themeable:true},alignX:{check:[l,v,o],nullable:true,apply:d,themeable:true},alignY:{check:[p,s,b,a],nullable:true,apply:d,themeable:true}},members:{__fz:null,__fA:null,__fB:null,__fC:null,__fD:null,__fE:null,__fF:null,getBounds:function(){return this.__fE||this.__fA||null;},clearSeparators:function(){},renderSeparator:function(y,z){},renderLayout:function(A,top,B,C){var D;{};var E=null;if(this.getHeight()==null&&this._hasHeightForWidth()){var E=this._getHeightForWidth(B);}if(E!=null&&E!==this.__fz){this.__fz=E;qx.ui.core.queue.Layout.add(this);return null;}var G=this.__fA;if(!G){G=this.__fA={};}var F={};if(A!==G.left||top!==G.top){F.position=true;G.left=A;G.top=top;}if(B!==G.width||C!==G.height){F.size=true;G.width=B;G.height=C;}if(this.__fB){F.local=true;delete this.__fB;}if(this.__fD){F.margin=true;delete this.__fD;}return F;},isExcluded:function(){return false;},hasValidLayout:function(){return !this.__fB;},scheduleLayoutUpdate:function(){qx.ui.core.queue.Layout.add(this);},invalidateLayoutCache:function(){this.__fB=true;this.__fC=null;},getSizeHint:function(H){var I=this.__fC;if(I){return I;}if(H===false){return null;}I=this.__fC=this._computeSizeHint();if(this._hasHeightForWidth()&&this.__fz&&this.getHeight()==null){I.height=this.__fz;}if(I.minWidth>I.width){I.width=I.minWidth;}if(I.maxWidth<I.width){I.width=I.maxWidth;}if(!this.getAllowGrowX()){I.maxWidth=I.width;}if(!this.getAllowShrinkX()){I.minWidth=I.width;}if(I.minHeight>I.height){I.height=I.minHeight;}if(I.maxHeight<I.height){I.height=I.maxHeight;}if(!this.getAllowGrowY()){I.maxHeight=I.height;}if(!this.getAllowShrinkY()){I.minHeight=I.height;}return I;},_computeSizeHint:function(){var N=this.getMinWidth()||0;var K=this.getMinHeight()||0;var O=this.getWidth()||N;var M=this.getHeight()||K;var J=this.getMaxWidth()||Infinity;var L=this.getMaxHeight()||Infinity;return {minWidth:N,width:O,maxWidth:J,minHeight:K,height:M,maxHeight:L};},_hasHeightForWidth:function(){var P=this._getLayout();if(P){return P.hasHeightForWidth();}return false;},_getHeightForWidth:function(Q){var R=this._getLayout();if(R&&R.hasHeightForWidth()){return R.getHeightForWidth(Q);}return null;},_getLayout:function(){return null;},_applyMargin:function(){this.__fD=true;var parent=this.$$parent;if(parent){parent.updateLayoutProperties();}},_applyAlign:function(){var parent=this.$$parent;if(parent){parent.updateLayoutProperties();}},_applyDimension:function(){qx.ui.core.queue.Layout.add(this);},_applyStretching:function(){qx.ui.core.queue.Layout.add(this);},hasUserBounds:function(){return !!this.__fE;},setUserBounds:function(S,top,T,U){this.__fE={left:S,top:top,width:T,height:U};qx.ui.core.queue.Layout.add(this);},resetUserBounds:function(){delete this.__fE;qx.ui.core.queue.Layout.add(this);},__fG:{},setLayoutProperties:function(V){if(V==null){return;}var W=this.__fF;if(!W){W=this.__fF={};}var parent=this.getLayoutParent();if(parent){parent.updateLayoutProperties(V);}for(var X in V){if(V[X]==null){delete W[X];}else{W[X]=V[X];}}},getLayoutProperties:function(){return this.__fF||this.__fG;},clearLayoutProperties:function(){delete this.__fF;},updateLayoutProperties:function(Y){var ba=this._getLayout();if(ba){var bb;{};ba.invalidateChildrenCache();}qx.ui.core.queue.Layout.add(this);},getApplicationRoot:function(){return qx.core.Init.getApplication().getRoot();},getLayoutParent:function(){return this.$$parent||null;},setLayoutParent:function(parent){if(this.$$parent===parent){return;}this.$$parent=parent||null;qx.ui.core.queue.Visibility.add(this);},isRootWidget:function(){return false;},_getRoot:function(){var parent=this;while(parent){if(parent.isRootWidget()){return parent;}parent=parent.$$parent;}return null;},clone:function(){var bc=qx.core.Object.prototype.clone.call(this);var bd=this.__fF;if(bd){bc.__fF=qx.lang.Object.clone(bd);}return bc;}},destruct:function(){this.$$parent=this.$$subparent=this.__fF=this.__fA=this.__fE=this.__fC=null;}});})();(function(){var a="qx.locale.MTranslation";qx.Mixin.define(a,{members:{tr:function(b,c){var d=qx.locale.Manager;if(d){return d.tr.apply(d,arguments);}throw new Error("To enable localization please include qx.locale.Manager into your build!");},trn:function(e,f,g,h){var i=qx.locale.Manager;if(i){return i.trn.apply(i,arguments);}throw new Error("To enable localization please include qx.locale.Manager into your build!");},trc:function(j,k,l){var m=qx.locale.Manager;if(m){return m.trc.apply(m,arguments);}throw new Error("To enable localization please include qx.locale.Manager into your build!");},marktr:function(n){var o=qx.locale.Manager;if(o){return o.marktr.apply(o,arguments);}throw new Error("To enable localization please include qx.locale.Manager into your build!");}}});})();(function(){var b="qx.ui.core.DecoratorFactory",a="$$nopool$$";qx.Class.define(b,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__cU={};},statics:{MAX_SIZE:15,__cV:a},members:{__cU:null,getDecoratorElement:function(c){var h=qx.ui.core.DecoratorFactory;if(qx.lang.Type.isString(c)){var f=c;var e=qx.theme.manager.Decoration.getInstance().resolve(c);}else{var f=h.__cV;e=c;}var g=this.__cU;if(g[f]&&g[f].length>0){var d=g[f].pop();}else{var d=this._createDecoratorElement(e,f);}d.$$pooled=false;return d;},poolDecorator:function(i){if(!i||i.$$pooled||i.isDisposed()){return;}var l=qx.ui.core.DecoratorFactory;var j=i.getId();if(j==l.__cV){i.dispose();return;}var k=this.__cU;if(!k[j]){k[j]=[];}if(k[j].length>l.MAX_SIZE){i.dispose();}else{i.$$pooled=true;k[j].push(i);}},_createDecoratorElement:function(m,n){var o=new qx.html.Decorator(m,n);{};return o;},toString:function(){return qx.core.Object.prototype.toString.call(this);}},destruct:function(){if(!qx.core.ObjectRegistry.inShutDown){var q=this.__cU;for(var p in q){qx.util.DisposeUtil.disposeArray(q,p);}}this.__cU=null;}});})();(function(){var bV="px",bU="Boolean",bT="qx.event.type.Drag",bS="qx.event.type.Mouse",bR="visible",bQ="qx.event.type.Focus",bP="on",bO="Integer",bN="qx.event.type.Touch",bM="excluded",bx="qx.event.type.Data",bw="_applyPadding",bv="qx.event.type.Event",bu="hidden",bt="contextmenu",bs="String",br="tabIndex",bq="focused",bp="changeVisibility",bo="mshtml",cd="hovered",ce="qx.event.type.KeySequence",cb="qx.client",cc="absolute",bY="backgroundColor",ca="drag",bW="div",bX="disabled",cf="move",cg="dragstart",bF="qx.dynlocale",bE="dragchange",bH="dragend",bG="resize",bJ="Decorator",bI="zIndex",bL="opacity",bK="default",bD="Color",bC="changeToolTipText",c="beforeContextmenuOpen",d="_applyNativeContextMenu",f="_applyBackgroundColor",g="_applyFocusable",h="changeShadow",j="qx.event.type.KeyInput",k="createChildControl",m="__dQ",n="Font",o="_applyShadow",ck="_applyEnabled",cj="_applySelectable",ci="Number",ch="_applyKeepActive",co="__ea",cn="_applyVisibility",cm="repeat",cl="qxDraggable",cq="__dR",cp="syncAppearance",N="paddingLeft",O="_applyDroppable",L="__ec",M="#",R="qx.event.type.MouseWheel",S="_applyCursor",P="_applyDraggable",Q="changeTextColor",J="$$widget",K="changeContextMenu",w="paddingTop",v="changeSelectable",y="hideFocus",x="none",s="outline",r="_applyAppearance",u="_applyOpacity",t="url(",q=")",p="qx.ui.core.Widget",X="_applyFont",Y="cursor",ba="qxDroppable",bb="changeZIndex",T="changeEnabled",U="changeFont",V="__ee",W="__dU",bc="_applyDecorator",bd="_applyZIndex",G="_applyTextColor",F="qx.ui.menu.Menu",E="_applyToolTipText",D="true",C="widget",B="changeDecorator",A="__dV",z="_applyTabIndex",I="changeAppearance",H="shorthand",be="/",bf="",bg="_applyContextMenu",bh="paddingBottom",bi="__dW",bj="changeNativeContextMenu",bk="qx.ui.tooltip.ToolTip",bl="qxKeepActive",bm="_applyKeepFocus",bn="paddingRight",bB="changeBackgroundColor",bA="changeLocale",bz="qxKeepFocus",by="qx/static/blank.gif";qx.Class.define(p,{extend:qx.ui.core.LayoutItem,include:[qx.locale.MTranslation],construct:function(){qx.ui.core.LayoutItem.call(this);this.__dQ=this._createContainerElement();this.__dR=this.__ed();this.__dQ.add(this.__dR);this.initFocusable();this.initSelectable();this.initNativeContextMenu();},events:{appear:bv,disappear:bv,createChildControl:bx,resize:bx,move:bx,syncAppearance:bx,mousemove:bS,mouseover:bS,mouseout:bS,mousedown:bS,mouseup:bS,click:bS,dblclick:bS,contextmenu:bS,beforeContextmenuOpen:bx,mousewheel:R,touchstart:bN,touchend:bN,touchmove:bN,touchcancel:bN,tap:bN,swipe:bN,keyup:ce,keydown:ce,keypress:ce,keyinput:j,focus:bQ,blur:bQ,focusin:bQ,focusout:bQ,activate:bQ,deactivate:bQ,capture:bv,losecapture:bv,drop:bT,dragleave:bT,dragover:bT,drag:bT,dragstart:bT,dragend:bT,dragchange:bT,droprequest:bT},properties:{paddingTop:{check:bO,init:0,apply:bw,themeable:true},paddingRight:{check:bO,init:0,apply:bw,themeable:true},paddingBottom:{check:bO,init:0,apply:bw,themeable:true},paddingLeft:{check:bO,init:0,apply:bw,themeable:true},padding:{group:[w,bn,bh,N],mode:H,themeable:true},zIndex:{nullable:true,init:null,apply:bd,event:bb,check:bO,themeable:true},decorator:{nullable:true,init:null,apply:bc,event:B,check:bJ,themeable:true},shadow:{nullable:true,init:null,apply:o,event:h,check:bJ,themeable:true},backgroundColor:{nullable:true,check:bD,apply:f,event:bB,themeable:true},textColor:{nullable:true,check:bD,apply:G,event:Q,themeable:true,inheritable:true},font:{nullable:true,apply:X,check:n,event:U,themeable:true,inheritable:true,dereference:true},opacity:{check:ci,apply:u,themeable:true,nullable:true,init:null},cursor:{check:bs,apply:S,themeable:true,inheritable:true,nullable:true,init:null},toolTip:{check:bk,nullable:true},toolTipText:{check:bs,nullable:true,event:bC,apply:E},toolTipIcon:{check:bs,nullable:true,event:bC},blockToolTip:{check:bU,init:false},visibility:{check:[bR,bu,bM],init:bR,apply:cn,event:bp},enabled:{init:true,check:bU,inheritable:true,apply:ck,event:T},anonymous:{init:false,check:bU},tabIndex:{check:bO,nullable:true,apply:z},focusable:{check:bU,init:false,apply:g},keepFocus:{check:bU,init:false,apply:bm},keepActive:{check:bU,init:false,apply:ch},draggable:{check:bU,init:false,apply:P},droppable:{check:bU,init:false,apply:O},selectable:{check:bU,init:false,event:v,apply:cj},contextMenu:{check:F,apply:bg,nullable:true,event:K},nativeContextMenu:{check:bU,init:false,themeable:true,event:bj,apply:d},appearance:{check:bs,init:C,apply:r,event:I}},statics:{DEBUG:false,getWidgetByElement:function(cr,cs){while(cr){var ct=cr.$$widget;if(ct!=null){var cu=qx.core.ObjectRegistry.fromHashCode(ct);if(!cs||!cu.getAnonymous()){return cu;}}try{cr=cr.parentNode;}catch(e){return null;}}return null;},contains:function(parent,cv){while(cv){if(parent==cv){return true;}cv=cv.getLayoutParent();}return false;},__dS:new qx.ui.core.DecoratorFactory(),__dT:new qx.ui.core.DecoratorFactory()},members:{__dQ:null,__dR:null,__dU:null,__dV:null,__dW:null,__dX:null,__dY:null,__ea:null,_getLayout:function(){return this.__ea;},_setLayout:function(cw){{};if(this.__ea){this.__ea.connectToWidget(null);}if(cw){cw.connectToWidget(this);}this.__ea=cw;qx.ui.core.queue.Layout.add(this);},setLayoutParent:function(parent){if(this.$$parent===parent){return;}var cx=this.getContainerElement();if(this.$$parent&&!this.$$parent.$$disposed){this.$$parent.getContentElement().remove(cx);}this.$$parent=parent||null;if(parent&&!parent.$$disposed){this.$$parent.getContentElement().add(cx);}this.$$refreshInheritables();qx.ui.core.queue.Visibility.add(this);},_updateInsets:null,__eb:function(a,b){if(a==b){return false;}if(a==null||b==null){return true;}var cy=qx.theme.manager.Decoration.getInstance();var cA=cy.resolve(a).getInsets();var cz=cy.resolve(b).getInsets();if(cA.top!=cz.top||cA.right!=cz.right||cA.bottom!=cz.bottom||cA.left!=cz.left){return true;}return false;},renderLayout:function(cB,top,cC,cD){var cM=qx.ui.core.LayoutItem.prototype.renderLayout.call(this,cB,top,cC,cD);if(!cM){return null;}var cF=this.getContainerElement();var content=this.getContentElement();var cJ=cM.size||this._updateInsets;var cN=bV;var cK={};if(cM.position){cK.left=cB+cN;cK.top=top+cN;}if(cM.size){cK.width=cC+cN;cK.height=cD+cN;}if(cM.position||cM.size){cF.setStyles(cK);}if(cJ||cM.local||cM.margin){var cE=this.getInsets();var innerWidth=cC-cE.left-cE.right;var innerHeight=cD-cE.top-cE.bottom;innerWidth=innerWidth<0?0:innerWidth;innerHeight=innerHeight<0?0:innerHeight;}var cH={};if(this._updateInsets){cH.left=cE.left+cN;cH.top=cE.top+cN;}if(cJ){cH.width=innerWidth+cN;cH.height=innerHeight+cN;}if(cJ||this._updateInsets){content.setStyles(cH);}if(cM.size){var cL=this.__dW;if(cL){cL.setStyles({width:cC+bV,height:cD+bV});}}if(cM.size||this._updateInsets){if(this.__dU){this.__dU.resize(cC,cD);}}if(cM.size){if(this.__dV){var cE=this.__dV.getInsets();var cI=cC+cE.left+cE.right;var cG=cD+cE.top+cE.bottom;this.__dV.resize(cI,cG);}}if(cJ||cM.local||cM.margin){if(this.__ea&&this.hasLayoutChildren()){this.__ea.renderLayout(innerWidth,innerHeight);}else if(this.hasLayoutChildren()){throw new Error("At least one child in control "+this._findTopControl()+" requires a layout, but no one was defined!");}}if(cM.position&&this.hasListener(cf)){this.fireDataEvent(cf,this.getBounds());}if(cM.size&&this.hasListener(bG)){this.fireDataEvent(bG,this.getBounds());}delete this._updateInsets;return cM;},__ec:null,clearSeparators:function(){var cP=this.__ec;if(!cP){return;}var cQ=qx.ui.core.Widget.__dS;var content=this.getContentElement();var cO;for(var i=0,l=cP.length;i<l;i++){cO=cP[i];cQ.poolDecorator(cO);content.remove(cO);}cP.length=0;},renderSeparator:function(cR,cS){var cT=qx.ui.core.Widget.__dS.getDecoratorElement(cR);this.getContentElement().add(cT);cT.resize(cS.width,cS.height);cT.setStyles({left:cS.left+bV,top:cS.top+bV});if(!this.__ec){this.__ec=[cT];}else{this.__ec.push(cT);}},_computeSizeHint:function(){var db=this.getWidth();var da=this.getMinWidth();var cV=this.getMaxWidth();var cY=this.getHeight();var cW=this.getMinHeight();var cX=this.getMaxHeight();{};var dc=this._getContentHint();var cU=this.getInsets();var de=cU.left+cU.right;var dd=cU.top+cU.bottom;if(db==null){db=dc.width+de;}if(cY==null){cY=dc.height+dd;}if(da==null){da=de;if(dc.minWidth!=null){da+=dc.minWidth;}}if(cW==null){cW=dd;if(dc.minHeight!=null){cW+=dc.minHeight;}}if(cV==null){if(dc.maxWidth==null){cV=Infinity;}else{cV=dc.maxWidth+de;}}if(cX==null){if(dc.maxHeight==null){cX=Infinity;}else{cX=dc.maxHeight+dd;}}return {width:db,minWidth:da,maxWidth:cV,height:cY,minHeight:cW,maxHeight:cX};},invalidateLayoutCache:function(){qx.ui.core.LayoutItem.prototype.invalidateLayoutCache.call(this);if(this.__ea){this.__ea.invalidateLayoutCache();}},_getContentHint:function(){var dg=this.__ea;if(dg){if(this.hasLayoutChildren()){var df;var dh=dg.getSizeHint();{};return dh;}else{return {width:0,height:0};}}else{return {width:100,height:50};}},_getHeightForWidth:function(di){var dm=this.getInsets();var dq=dm.left+dm.right;var dp=dm.top+dm.bottom;var dn=di-dq;var dk=this._getLayout();if(dk&&dk.hasHeightForWidth()){var dj=dk.getHeightForWidth(di);}else{dj=this._getContentHeightForWidth(dn);}var dl=dj+dp;return dl;},_getContentHeightForWidth:function(dr){throw new Error("Abstract method call: _getContentHeightForWidth()!");},getInsets:function(){var top=this.getPaddingTop();var dt=this.getPaddingRight();var dv=this.getPaddingBottom();var du=this.getPaddingLeft();if(this.__dU){var ds=this.__dU.getInsets();{};top+=ds.top;dt+=ds.right;dv+=ds.bottom;du+=ds.left;}return {"top":top,"right":dt,"bottom":dv,"left":du};},getInnerSize:function(){var dx=this.getBounds();if(!dx){return null;}var dw=this.getInsets();return {width:dx.width-dw.left-dw.right,height:dx.height-dw.top-dw.bottom};},show:function(){this.setVisibility(bR);},hide:function(){this.setVisibility(bu);},exclude:function(){this.setVisibility(bM);},isVisible:function(){return this.getVisibility()===bR;},isHidden:function(){return this.getVisibility()!==bR;},isExcluded:function(){return this.getVisibility()===bM;},isSeeable:function(){var dz=this.getContainerElement().getDomElement();if(dz){return dz.offsetWidth>0;}var dy=this;do{if(!dy.isVisible()){return false;}if(dy.isRootWidget()){return true;}dy=dy.getLayoutParent();}while(dy);return false;},_createContainerElement:function(){var dB={"$$widget":this.toHashCode()};{};var dA={zIndex:0,position:cc};return new qx.html.Element(bW,dA,dB);},__ed:function(){var dC=this._createContentElement();{};dC.setStyles({"position":cc,"zIndex":10});return dC;},_createContentElement:function(){return new qx.html.Element(bW,{overflowX:bu,overflowY:bu});},getContainerElement:function(){return this.__dQ;},getContentElement:function(){return this.__dR;},getDecoratorElement:function(){return this.__dU||null;},getShadowElement:function(){return this.__dV||null;},__ee:null,getLayoutChildren:function(){var dE=this.__ee;if(!dE){return this.__ef;}var dF;for(var i=0,l=dE.length;i<l;i++){var dD=dE[i];if(dD.hasUserBounds()||dD.isExcluded()){if(dF==null){dF=dE.concat();}qx.lang.Array.remove(dF,dD);}}return dF||dE;},scheduleLayoutUpdate:function(){qx.ui.core.queue.Layout.add(this);},invalidateLayoutChildren:function(){var dG=this.__ea;if(dG){dG.invalidateChildrenCache();}qx.ui.core.queue.Layout.add(this);},hasLayoutChildren:function(){var dH=this.__ee;if(!dH){return false;}var dI;for(var i=0,l=dH.length;i<l;i++){dI=dH[i];if(!dI.hasUserBounds()&&!dI.isExcluded()){return true;}}return false;},getChildrenContainer:function(){return this;},__ef:[],_getChildren:function(){return this.__ee||this.__ef;},_indexOf:function(dJ){var dK=this.__ee;if(!dK){return -1;}return dK.indexOf(dJ);},_hasChildren:function(){var dL=this.__ee;return dL!=null&&(!!dL[0]);},addChildrenToQueue:function(dM){var dN=this.__ee;if(!dN){return;}var dO;for(var i=0,l=dN.length;i<l;i++){dO=dN[i];dM[dO.$$hash]=dO;dO.addChildrenToQueue(dM);}},_add:function(dP,dQ){if(dP.getLayoutParent()==this){qx.lang.Array.remove(this.__ee,dP);}if(this.__ee){this.__ee.push(dP);}else{this.__ee=[dP];}this.__eg(dP,dQ);},_addAt:function(dR,dS,dT){if(!this.__ee){this.__ee=[];}if(dR.getLayoutParent()==this){qx.lang.Array.remove(this.__ee,dR);}var dU=this.__ee[dS];if(dU===dR){dR.setLayoutProperties(dT);}if(dU){qx.lang.Array.insertBefore(this.__ee,dR,dU);}else{this.__ee.push(dR);}this.__eg(dR,dT);},_addBefore:function(dV,dW,dX){{};if(dV==dW){return;}if(!this.__ee){this.__ee=[];}if(dV.getLayoutParent()==this){qx.lang.Array.remove(this.__ee,dV);}qx.lang.Array.insertBefore(this.__ee,dV,dW);this.__eg(dV,dX);},_addAfter:function(dY,ea,eb){{};if(dY==ea){return;}if(!this.__ee){this.__ee=[];}if(dY.getLayoutParent()==this){qx.lang.Array.remove(this.__ee,dY);}qx.lang.Array.insertAfter(this.__ee,dY,ea);this.__eg(dY,eb);},_remove:function(ec){if(!this.__ee){throw new Error("This widget has no children!");}qx.lang.Array.remove(this.__ee,ec);this.__eh(ec);},_removeAt:function(ed){if(!this.__ee){throw new Error("This widget has no children!");}var ee=this.__ee[ed];qx.lang.Array.removeAt(this.__ee,ed);this.__eh(ee);return ee;},_removeAll:function(){if(!this.__ee){return;}var ef=this.__ee.concat();this.__ee.length=0;for(var i=ef.length-1;i>=0;i--){this.__eh(ef[i]);}qx.ui.core.queue.Layout.add(this);},_afterAddChild:null,_afterRemoveChild:null,__eg:function(eg,eh){{};var parent=eg.getLayoutParent();if(parent&&parent!=this){parent._remove(eg);}eg.setLayoutParent(this);if(eh){eg.setLayoutProperties(eh);}else{this.updateLayoutProperties();}if(this._afterAddChild){this._afterAddChild(eg);}},__eh:function(ei){{};if(ei.getLayoutParent()!==this){throw new Error("Remove Error: "+ei+" is not a child of this widget!");}ei.setLayoutParent(null);if(this.__ea){this.__ea.invalidateChildrenCache();}qx.ui.core.queue.Layout.add(this);if(this._afterRemoveChild){this._afterRemoveChild(ei);}},capture:function(ej){this.getContainerElement().capture(ej);},releaseCapture:function(){this.getContainerElement().releaseCapture();},_applyPadding:function(ek,em,name){this._updateInsets=true;qx.ui.core.queue.Layout.add(this);},_createProtectorElement:function(){if(this.__dW){return;}var en=this.__dW=new qx.html.Element;{};en.setStyles({position:cc,top:0,left:0,zIndex:7});var eo=this.getBounds();if(eo){this.__dW.setStyles({width:eo.width+bV,height:eo.height+bV});}if(qx.core.Variant.isSet(cb,bo)){en.setStyles({backgroundImage:t+qx.util.ResourceManager.getInstance().toUri(by)+q,backgroundRepeat:cm});}this.getContainerElement().add(en);},_applyDecorator:function(ep,eq){{};var et=qx.ui.core.Widget.__dS;var er=this.getContainerElement();if(!this.__dW&&!qx.bom.client.Feature.CSS_POINTER_EVENTS){this._createProtectorElement();}if(eq){er.remove(this.__dU);et.poolDecorator(this.__dU);}if(ep){var es=this.__dU=et.getDecoratorElement(ep);es.setStyle(bI,5);er.add(es);}else{delete this.__dU;}this._applyBackgroundColor(this.getBackgroundColor());if(this.__eb(eq,ep)){this._updateInsets=true;qx.ui.core.queue.Layout.add(this);}else if(ep){var eu=this.getBounds();if(eu){es.resize(eu.width,eu.height);this.__dW&&this.__dW.setStyles({width:eu.width+bV,height:eu.height+bV});}}},_applyShadow:function(ev,ew){var eD=qx.ui.core.Widget.__dT;var ey=this.getContainerElement();if(ew){ey.remove(this.__dV);eD.poolDecorator(this.__dV);}if(ev){var eA=this.__dV=eD.getDecoratorElement(ev);ey.add(eA);var eC=eA.getInsets();eA.setStyles({left:(-eC.left)+bV,top:(-eC.top)+bV});var eB=this.getBounds();if(eB){var ez=eB.width+eC.left+eC.right;var ex=eB.height+eC.top+eC.bottom;eA.resize(ez,ex);}eA.tint(null);}else{delete this.__dV;}},_applyToolTipText:function(eE,eF){if(qx.core.Variant.isSet(bF,bP)){if(this.__dY){return;}var eG=qx.locale.Manager.getInstance();this.__dY=eG.addListener(bA,function(){var eH=this.getToolTipText();if(eH&&eH.translate){this.setToolTipText(eH.translate());}},this);}},_applyTextColor:function(eI,eJ){},_applyZIndex:function(eK,eL){this.getContainerElement().setStyle(bI,eK==null?0:eK);},_applyVisibility:function(eM,eN){var eO=this.getContainerElement();if(eM===bR){eO.show();}else{eO.hide();}var parent=this.$$parent;if(parent&&(eN==null||eM==null||eN===bM||eM===bM)){parent.invalidateLayoutChildren();}qx.ui.core.queue.Visibility.add(this);},_applyOpacity:function(eP,eQ){this.getContainerElement().setStyle(bL,eP==1?null:eP);if(qx.core.Variant.isSet(cb,bo)&&qx.bom.element.Decoration.isAlphaImageLoaderEnabled()){if(!qx.Class.isSubClassOf(this.getContentElement().constructor,qx.html.Image)){var eR=(eP==1||eP==null)?null:0.99;this.getContentElement().setStyle(bL,eR);}}},_applyCursor:function(eS,eT){if(eS==null&&!this.isSelectable()){eS=bK;}this.getContainerElement().setStyle(Y,eS,qx.bom.client.Engine.OPERA);},_applyBackgroundColor:function(eU,eV){var eW=this.getBackgroundColor();var eY=this.getContainerElement();if(this.__dU){this.__dU.tint(eW);eY.setStyle(bY,null);}else{var eX=qx.theme.manager.Color.getInstance().resolve(eW);eY.setStyle(bY,eX);}},_applyFont:function(fa,fb){},__ei:null,$$stateChanges:null,_forwardStates:null,hasState:function(fc){var fd=this.__ei;return !!fd&&!!fd[fc];},addState:function(fe){var ff=this.__ei;if(!ff){ff=this.__ei={};}if(ff[fe]){return;}this.__ei[fe]=true;if(fe===cd){this.syncAppearance();}else if(!qx.ui.core.queue.Visibility.isVisible(this)){this.$$stateChanges=true;}else{qx.ui.core.queue.Appearance.add(this);}var forward=this._forwardStates;var fi=this.__el;if(forward&&forward[fe]&&fi){var fg;for(var fh in fi){fg=fi[fh];if(fg instanceof qx.ui.core.Widget){fi[fh].addState(fe);}}}},removeState:function(fj){var fk=this.__ei;if(!fk||!fk[fj]){return;}delete this.__ei[fj];if(fj===cd){this.syncAppearance();}else if(!qx.ui.core.queue.Visibility.isVisible(this)){this.$$stateChanges=true;}else{qx.ui.core.queue.Appearance.add(this);}var forward=this._forwardStates;var fn=this.__el;if(forward&&forward[fj]&&fn){for(var fm in fn){var fl=fn[fm];if(fl instanceof qx.ui.core.Widget){fl.removeState(fj);}}}},replaceState:function(fo,fp){var fq=this.__ei;if(!fq){fq=this.__ei={};}if(!fq[fp]){fq[fp]=true;}if(fq[fo]){delete fq[fo];}if(!qx.ui.core.queue.Visibility.isVisible(this)){this.$$stateChanges=true;}else{qx.ui.core.queue.Appearance.add(this);}var forward=this._forwardStates;var ft=this.__el;if(forward&&forward[fp]&&ft){for(var fs in ft){var fr=ft[fs];if(fr instanceof qx.ui.core.Widget){fr.replaceState(fo,fp);}}}},__ej:null,__ek:null,syncAppearance:function(){var fy=this.__ei;var fx=this.__ej;var fz=qx.theme.manager.Appearance.getInstance();var fv=qx.core.Property.$$method.setThemed;var fD=qx.core.Property.$$method.resetThemed;if(this.__ek){delete this.__ek;if(fx){var fu=fz.styleFrom(fx,fy,null,this.getAppearance());if(fu){fx=null;}}}if(!fx){var fw=this;var fC=[];do{fC.push(fw.$$subcontrol||fw.getAppearance());}while(fw=fw.$$subparent);fx=fC.reverse().join(be).replace(/#[0-9]+/g,bf);this.__ej=fx;}var fA=fz.styleFrom(fx,fy,null,this.getAppearance());if(fA){var fB;if(fu){for(var fB in fu){if(fA[fB]===undefined){this[fD[fB]]();}}}{};for(var fB in fA){fA[fB]===undefined?this[fD[fB]]():this[fv[fB]](fA[fB]);}}else if(fu){for(var fB in fu){this[fD[fB]]();}}this.fireDataEvent(cp,this.__ei);},_applyAppearance:function(fE,fF){this.updateAppearance();},checkAppearanceNeeds:function(){if(!this.__dX){qx.ui.core.queue.Appearance.add(this);this.__dX=true;}else if(this.$$stateChanges){qx.ui.core.queue.Appearance.add(this);delete this.$$stateChanges;}},updateAppearance:function(){this.__ek=true;qx.ui.core.queue.Appearance.add(this);var fI=this.__el;if(fI){var fG;for(var fH in fI){fG=fI[fH];if(fG instanceof qx.ui.core.Widget){fG.updateAppearance();}}}},syncWidget:function(){},getEventTarget:function(){var fJ=this;while(fJ.getAnonymous()){fJ=fJ.getLayoutParent();if(!fJ){return null;}}return fJ;},getFocusTarget:function(){var fK=this;if(!fK.getEnabled()){return null;}while(fK.getAnonymous()||!fK.getFocusable()){fK=fK.getLayoutParent();if(!fK||!fK.getEnabled()){return null;}}return fK;},getFocusElement:function(){return this.getContainerElement();},isTabable:function(){return (!!this.getContainerElement().getDomElement())&&this.isFocusable();},_applyFocusable:function(fL,fM){var fN=this.getFocusElement();if(fL){var fO=this.getTabIndex();if(fO==null){fO=1;}fN.setAttribute(br,fO);if(qx.core.Variant.isSet(cb,bo)){fN.setAttribute(y,D);}else{fN.setStyle(s,x);}}else{if(fN.isNativelyFocusable()){fN.setAttribute(br,-1);}else if(fM){fN.setAttribute(br,null);}}},_applyKeepFocus:function(fP){var fQ=this.getFocusElement();fQ.setAttribute(bz,fP?bP:null);},_applyKeepActive:function(fR){var fS=this.getContainerElement();fS.setAttribute(bl,fR?bP:null);},_applyTabIndex:function(fT){if(fT==null){fT=1;}else if(fT<1||fT>32000){throw new Error("TabIndex property must be between 1 and 32000");}if(this.getFocusable()&&fT!=null){this.getFocusElement().setAttribute(br,fT);}},_applySelectable:function(fU,fV){if(fV!==null){this._applyCursor(this.getCursor());}this.getContentElement().setSelectable(fU);},_applyEnabled:function(fW,fX){if(fW===false){this.addState(bX);this.removeState(cd);if(this.isFocusable()){this.removeState(bq);this._applyFocusable(false,true);}if(this.isDraggable()){this._applyDraggable(false,true);}if(this.isDroppable()){this._applyDroppable(false,true);}}else{this.removeState(bX);if(this.isFocusable()){this._applyFocusable(true,false);}if(this.isDraggable()){this._applyDraggable(true,false);}if(this.isDroppable()){this._applyDroppable(true,false);}}},_applyNativeContextMenu:function(fY,ga,name){},_applyContextMenu:function(gb,gc){if(gc){gc.removeState(bt);if(gc.getOpener()==this){gc.resetOpener();}if(!gb){this.removeListener(bt,this._onContextMenuOpen);gc.removeListener(bp,this._onBeforeContextMenuOpen,this);}}if(gb){gb.setOpener(this);gb.addState(bt);if(!gc){this.addListener(bt,this._onContextMenuOpen);gb.addListener(bp,this._onBeforeContextMenuOpen,this);}}},_onContextMenuOpen:function(e){this.getContextMenu().openAtMouse(e);e.stop();},_onBeforeContextMenuOpen:function(e){if(e.getData()==bR&&this.hasListener(c)){this.fireDataEvent(c,e);}},_onStopEvent:function(e){e.stopPropagation();},_applyDraggable:function(gd,ge){if(!this.isEnabled()&&gd===true){gd=false;}qx.ui.core.DragDropCursor.getInstance();if(gd){this.addListener(cg,this._onDragStart);this.addListener(ca,this._onDrag);this.addListener(bH,this._onDragEnd);this.addListener(bE,this._onDragChange);}else{this.removeListener(cg,this._onDragStart);this.removeListener(ca,this._onDrag);this.removeListener(bH,this._onDragEnd);this.removeListener(bE,this._onDragChange);}this.getContainerElement().setAttribute(cl,gd?bP:null);},_applyDroppable:function(gf,gg){if(!this.isEnabled()&&gf===true){gf=false;}this.getContainerElement().setAttribute(ba,gf?bP:null);},_onDragStart:function(e){qx.ui.core.DragDropCursor.getInstance().placeToMouse(e);this.getApplicationRoot().setGlobalCursor(bK);},_onDrag:function(e){qx.ui.core.DragDropCursor.getInstance().placeToMouse(e);},_onDragEnd:function(e){qx.ui.core.DragDropCursor.getInstance().moveTo(-1000,-1000);this.getApplicationRoot().resetGlobalCursor();},_onDragChange:function(e){var gh=qx.ui.core.DragDropCursor.getInstance();var gi=e.getCurrentAction();gi?gh.setAction(gi):gh.resetAction();},visualizeFocus:function(){this.addState(bq);},visualizeBlur:function(){this.removeState(bq);},scrollChildIntoView:function(gj,gk,gl,gm){this.scrollChildIntoViewX(gj,gk,gm);this.scrollChildIntoViewY(gj,gl,gm);},scrollChildIntoViewX:function(gn,go,gp){this.getContentElement().scrollChildIntoViewX(gn.getContainerElement(),go,gp);},scrollChildIntoViewY:function(gq,gr,gs){this.getContentElement().scrollChildIntoViewY(gq.getContainerElement(),gr,gs);},focus:function(){if(this.isFocusable()){this.getFocusElement().focus();}else{throw new Error("Widget is not focusable!");}},blur:function(){if(this.isFocusable()){this.getFocusElement().blur();}else{throw new Error("Widget is not focusable!");}},activate:function(){this.getContainerElement().activate();},deactivate:function(){this.getContainerElement().deactivate();},tabFocus:function(){this.getFocusElement().focus();},hasChildControl:function(gt){if(!this.__el){return false;}return !!this.__el[gt];},__el:null,_getCreatedChildControls:function(){return this.__el;},getChildControl:function(gu,gv){if(!this.__el){if(gv){return null;}this.__el={};}var gw=this.__el[gu];if(gw){return gw;}if(gv===true){return null;}return this._createChildControl(gu);},_showChildControl:function(gx){var gy=this.getChildControl(gx);gy.show();return gy;},_excludeChildControl:function(gz){var gA=this.getChildControl(gz,true);if(gA){gA.exclude();}},_isChildControlVisible:function(gB){var gC=this.getChildControl(gB,true);if(gC){return gC.isVisible();}return false;},_createChildControl:function(gD){if(!this.__el){this.__el={};}else if(this.__el[gD]){throw new Error("Child control '"+gD+"' already created!");}var gH=gD.indexOf(M);if(gH==-1){var gE=this._createChildControlImpl(gD);}else{var gE=this._createChildControlImpl(gD.substring(0,gH),gD.substring(gH+1,gD.length));}if(!gE){throw new Error("Unsupported control: "+gD);}gE.$$subcontrol=gD;gE.$$subparent=this;var gF=this.__ei;var forward=this._forwardStates;if(gF&&forward&&gE instanceof qx.ui.core.Widget){for(var gG in gF){if(forward[gG]){gE.addState(gG);}}}this.fireDataEvent(k,gE);return this.__el[gD]=gE;},_createChildControlImpl:function(gI,gJ){return null;},_disposeChildControls:function(){var gN=this.__el;if(!gN){return;}var gL=qx.ui.core.Widget;for(var gM in gN){var gK=gN[gM];if(!gL.contains(this,gK)){gK.destroy();}else{gK.dispose();}}delete this.__el;},_findTopControl:function(){var gO=this;while(gO){if(!gO.$$subparent){return gO;}gO=gO.$$subparent;}return null;},getContainerLocation:function(gP){var gQ=this.getContainerElement().getDomElement();return gQ?qx.bom.element.Location.get(gQ,gP):null;},getContentLocation:function(gR){var gS=this.getContentElement().getDomElement();return gS?qx.bom.element.Location.get(gS,gR):null;},setDomLeft:function(gT){var gU=this.getContainerElement().getDomElement();if(gU){gU.style.left=gT+bV;}else{throw new Error("DOM element is not yet created!");}},setDomTop:function(gV){var gW=this.getContainerElement().getDomElement();if(gW){gW.style.top=gV+bV;}else{throw new Error("DOM element is not yet created!");}},setDomPosition:function(gX,top){var gY=this.getContainerElement().getDomElement();if(gY){gY.style.left=gX+bV;gY.style.top=top+bV;}else{throw new Error("DOM element is not yet created!");}},destroy:function(){if(this.$$disposed){return;}var parent=this.$$parent;if(parent){parent._remove(this);}qx.ui.core.queue.Dispose.add(this);},clone:function(){var ha=qx.ui.core.LayoutItem.prototype.clone.call(this);if(this.getChildren){var hb=this.getChildren();for(var i=0,l=hb.length;i<l;i++){ha.add(hb[i].clone());}}return ha;}},destruct:function(){if(!qx.core.ObjectRegistry.inShutDown){if(qx.core.Variant.isSet(bF,bP)){if(this.__dY){qx.locale.Manager.getInstance().removeListenerById(this.__dY);}}this.getContainerElement().setAttribute(J,null,true);this._disposeChildControls();qx.ui.core.queue.Appearance.remove(this);qx.ui.core.queue.Layout.remove(this);qx.ui.core.queue.Visibility.remove(this);qx.ui.core.queue.Widget.remove(this);}if(!qx.core.ObjectRegistry.inShutDown){var hd=qx.ui.core.Widget;var hc=this.getContainerElement();if(this.__dU){hc.remove(this.__dU);hd.__dS.poolDecorator(this.__dU);}if(this.__dV){hc.remove(this.__dV);hd.__dT.poolDecorator(this.__dV);}this.clearSeparators();this.__dU=this.__dV=this.__ec=null;}else{this._disposeArray(L);this._disposeObjects(W,A);}this._disposeArray(V);this.__ei=this.__el=null;this._disposeObjects(co,m,cq,bi);}});})();(function(){var d="qx.event.type.Data",c="qx.ui.container.Composite",b="addChildWidget",a="removeChildWidget";qx.Class.define(c,{extend:qx.ui.core.Widget,include:[qx.ui.core.MChildrenHandling,qx.ui.core.MLayoutHandling],construct:function(e){qx.ui.core.Widget.call(this);if(e!=null){this._setLayout(e);}},events:{addChildWidget:d,removeChildWidget:d},members:{_afterAddChild:function(f){this.fireNonBubblingEvent(b,qx.event.type.Data,[f]);},_afterRemoveChild:function(g){this.fireNonBubblingEvent(a,qx.event.type.Data,[g]);}},defer:function(h,i){qx.ui.core.MChildrenHandling.remap(i);qx.ui.core.MLayoutHandling.remap(i);}});})();(function(){var l="button",k="",j="close",i="String",h="_applyIcon",g="page",f="qx.event.type.Event",e="_applyShowCloseButton",d="tabview-page",c="qx.ui.tabview.Page",a="_applyLabel",b="Boolean";qx.Class.define(c,{extend:qx.ui.container.Composite,construct:function(m,n){qx.ui.container.Composite.call(this);this._createChildControl(l);if(m!=null){this.setLabel(m);}if(n!=null){this.setIcon(n);}},events:{"close":f},properties:{appearance:{refine:true,init:d},label:{check:i,init:k,apply:a},icon:{check:i,init:k,apply:h},showCloseButton:{check:b,init:false,apply:e}},members:{_forwardStates:{barTop:1,barRight:1,barBottom:1,barLeft:1,firstTab:1,lastTab:1},_applyIcon:function(o,p){this.getChildControl(l).setIcon(o);},_applyLabel:function(q,r){this.getChildControl(l).setLabel(q);},_applyEnabled:function(s,t){qx.ui.container.Composite.prototype._applyEnabled.call(this,s,t);var u=this.getChildControl(l);s==null?u.resetEnabled():u.setEnabled(s);},_createChildControlImpl:function(v,w){var x;switch(v){case l:x=new qx.ui.tabview.TabButton;x.setAllowGrowX(true);x.setAllowGrowY(true);x.setUserData(g,this);x.addListener(j,this._onButtonClose,this);break;}return x||qx.ui.container.Composite.prototype._createChildControlImpl.call(this,v);},_applyShowCloseButton:function(y,z){this.getChildControl(l).setShowCloseButton(y);},_onButtonClose:function(){this.fireEvent(j);},getButton:function(){return this.getChildControl(l);}}});})();(function(){var i="showPrivate",h="expandProperties",g="showInherited",f="showProtected",d="_applyClassNode",c="apiviewer.ui.tabview.AbstractPage",b="nodeName",a="abstract";qx.Class.define(c,{extend:qx.ui.tabview.Page,type:a,construct:function(j){qx.ui.tabview.Page.call(this);this.setLayout(new qx.ui.layout.Canvas());this.setShowCloseButton(true);this._bindings=[];this._viewer=this._createViewer();this.add(this._viewer,{edge:0});this.__So(this._viewer);this.setClassNode(j);},properties:{classNode:{apply:d}},members:{_viewer:null,_bindings:null,_createViewer:function(){throw new Error("Abstract method call!");},_applyClassNode:function(k,l){this._viewer.setDocNode(k);this.setLabel(k.getFullName());this.setIcon(apiviewer.TreeUtil.getIconUrl(k));this.setUserData(b,k.getFullName());qx.event.Timer.once(function(e){this._viewer.getContentElement().scrollToY(0);},this,0);},__So:function(m){var n=apiviewer.UiModel.getInstance();var o=this._bindings;o.push(n.bind(g,m,g));o.push(n.bind(h,m,h));o.push(n.bind(f,m,f));o.push(n.bind(i,m,i));},__Sp:function(){var p=apiviewer.UiModel.getInstance();var q=this._bindings;while(q.length>0){var r=q.pop();p.removeBinding(r);}}},destruct:function(){this.__Sp();this._viewer.destroy();this._viewer=null;}});})();(function(){var a="apiviewer.ui.tabview.PackagePage";qx.Class.define(a,{extend:apiviewer.ui.tabview.AbstractPage,members:{_createViewer:function(){return new apiviewer.ui.PackageViewer();}}});})();(function(){var m="ready",l="qx.client",k="mshtml",j="load",i="unload",h="qx.event.handler.Application",g="complete",f="qx.application",d="gecko|opera|webkit",c="left",a="DOMContentLoaded",b="shutdown";qx.Class.define(h,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(n){qx.core.Object.call(this);this._window=n.getWindow();this.__ij=false;this.__ik=false;this._initObserver();qx.event.handler.Application.$$instance=this;},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{ready:1,shutdown:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_WINDOW,IGNORE_CAN_HANDLE:true,onScriptLoaded:function(){var o=qx.event.handler.Application.$$instance;if(o){o.__in();}}},members:{canHandleEvent:function(p,q){},registerEvent:function(r,s,t){},unregisterEvent:function(u,v,w){},__il:null,__ij:null,__ik:null,__im:null,__in:function(){if(!this.__il&&this.__ij&&qx.$$loader.scriptLoaded){try{var x=qx.core.Setting.get(f);if(!qx.Class.getByName(x)){return;}}catch(e){}if(qx.core.Variant.isSet(l,k)){if(qx.event.Registration.hasListener(this._window,m)){this.__il=true;qx.event.Registration.fireEvent(this._window,m);}}else{this.__il=true;qx.event.Registration.fireEvent(this._window,m);}}},isApplicationReady:function(){return this.__il;},_initObserver:function(){if(qx.$$domReady||document.readyState==g||document.readyState==m){this.__ij=true;this.__in();}else{this._onNativeLoadWrapped=qx.lang.Function.bind(this._onNativeLoad,this);if(qx.core.Variant.isSet(l,d)){qx.bom.Event.addNativeListener(this._window,a,this._onNativeLoadWrapped);}else if(qx.core.Variant.isSet(l,k)){var self=this;var y=function(){try{document.documentElement.doScroll(c);if(document.body){self._onNativeLoadWrapped();}}catch(z){window.setTimeout(y,100);}};y();}qx.bom.Event.addNativeListener(this._window,j,this._onNativeLoadWrapped);}this._onNativeUnloadWrapped=qx.lang.Function.bind(this._onNativeUnload,this);qx.bom.Event.addNativeListener(this._window,i,this._onNativeUnloadWrapped);},_stopObserver:function(){if(this._onNativeLoadWrapped){qx.bom.Event.removeNativeListener(this._window,j,this._onNativeLoadWrapped);}qx.bom.Event.removeNativeListener(this._window,i,this._onNativeUnloadWrapped);this._onNativeLoadWrapped=null;this._onNativeUnloadWrapped=null;},_onNativeLoad:qx.event.GlobalError.observeMethod(function(){this.__ij=true;this.__in();}),_onNativeUnload:qx.event.GlobalError.observeMethod(function(){if(!this.__im){this.__im=true;try{qx.event.Registration.fireEvent(this._window,b);}catch(e){throw e;}finally{qx.core.ObjectRegistry.shutdown();}}})},destruct:function(){this._stopObserver();this._window=null;},defer:function(A){qx.event.Registration.addHandler(A);}});})();(function(){var f="ready",d="qx.application",c="beforeunload",b="qx.core.Init",a="shutdown";qx.Class.define(b,{statics:{getApplication:function(){return this.__ku||null;},ready:function(){if(this.__ku){return;}if(qx.bom.client.Engine.UNKNOWN_ENGINE){qx.log.Logger.warn("Could not detect engine!");}if(qx.bom.client.Engine.UNKNOWN_VERSION){qx.log.Logger.warn("Could not detect the version of the engine!");}if(qx.bom.client.Platform.UNKNOWN_PLATFORM){qx.log.Logger.warn("Could not detect platform!");}if(qx.bom.client.System.UNKNOWN_SYSTEM){qx.log.Logger.warn("Could not detect system!");}qx.log.Logger.debug(this,"Load runtime: "+(new Date-qx.Bootstrap.LOADSTART)+"ms");var h=qx.core.Setting.get(d);var i=qx.Class.getByName(h);if(i){this.__ku=new i;var g=new Date;this.__ku.main();qx.log.Logger.debug(this,"Main runtime: "+(new Date-g)+"ms");var g=new Date;this.__ku.finalize();qx.log.Logger.debug(this,"Finalize runtime: "+(new Date-g)+"ms");}else{qx.log.Logger.warn("Missing application class: "+h);}},__kv:function(e){var j=this.__ku;if(j){e.setReturnValue(j.close());}},__kw:function(){var k=this.__ku;if(k){k.terminate();}}},defer:function(l){qx.event.Registration.addListener(window,f,l.ready,l);qx.event.Registration.addListener(window,a,l.__kw,l);qx.event.Registration.addListener(window,c,l.__kv,l);}});})();(function(){var h="object",g="__cq",f="_applyTheme",e="qx.theme.manager.Decoration",d="Theme",c="changeTheme",b="string",a="singleton";qx.Class.define(e,{type:a,extend:qx.core.Object,properties:{theme:{check:d,nullable:true,apply:f,event:c}},members:{__cq:null,resolve:function(i){if(!i){return null;}if(typeof i===h){return i;}var l=this.getTheme();if(!l){return null;}var l=this.getTheme();if(!l){return null;}var m=this.__cq;if(!m){m=this.__cq={};}var j=m[i];if(j){return j;}var k=l.decorations[i];if(!k){return null;}var n=k.decorator;if(n==null){throw new Error("Missing definition of which decorator to use in entry: "+i+"!");}return m[i]=(new n).set(k.style);},isValidPropertyValue:function(o){if(typeof o===b){return this.isDynamic(o);}else if(typeof o===h){var p=o.constructor;return qx.Class.hasInterface(p,qx.ui.decoration.IDecorator);}return false;},isDynamic:function(q){if(!q){return false;}var r=this.getTheme();if(!r){return false;}return !!r.decorations[q];},_applyTheme:function(s,t){var v=qx.util.AliasManager.getInstance();if(t){for(var u in t.aliases){v.remove(u);}}if(s){for(var u in s.aliases){v.add(u,s.aliases[u]);}}if(!s){this.__cq={};}}},destruct:function(){this._disposeMap(g);}});})();(function(){var a="qx.ui.decoration.IDecorator";qx.Interface.define(a,{members:{getMarkup:function(){},resize:function(b,c,d){},tint:function(e,f){},getInsets:function(){}}});})();(function(){var b="qx.util.ValueManager",a="abstract";qx.Class.define(b,{type:a,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this._dynamic={};},members:{_dynamic:null,resolveDynamic:function(c){return this._dynamic[c];},isDynamic:function(d){return !!this._dynamic[d];},resolve:function(e){if(e&&this._dynamic[e]){return this._dynamic[e];}return e;},_setDynamic:function(f){this._dynamic=f;},_getDynamic:function(){return this._dynamic;}},destruct:function(){this._dynamic=null;}});})();(function(){var j="/",i="0",h="qx/static",g="http://",f="https://",e="file://",d="qx.util.AliasManager",c="singleton",b=".",a="static";qx.Class.define(d,{type:c,extend:qx.util.ValueManager,construct:function(){qx.util.ValueManager.call(this);this.__gF={};this.add(a,h);},members:{__gF:null,_preprocess:function(k){var n=this._getDynamic();if(n[k]===false){return k;}else if(n[k]===undefined){if(k.charAt(0)===j||k.charAt(0)===b||k.indexOf(g)===0||k.indexOf(f)===i||k.indexOf(e)===0){n[k]=false;return k;}if(this.__gF[k]){return this.__gF[k];}var m=k.substring(0,k.indexOf(j));var l=this.__gF[m];if(l!==undefined){n[k]=l+k.substring(m.length);}}return k;},add:function(o,p){this.__gF[o]=p;var r=this._getDynamic();for(var q in r){if(q.substring(0,q.indexOf(j))===o){r[q]=p+q.substring(o.length);}}},remove:function(s){delete this.__gF[s];},resolve:function(t){var u=this._getDynamic();if(t!=null){t=this._preprocess(t);}return u[t]||t;}},destruct:function(){this.__gF=null;}});})();(function(){var c="none",b="qx.html.Decorator",a="absolute";qx.Class.define(b,{extend:qx.html.Element,construct:function(d,e){var f={position:a,top:0,left:0};if(qx.bom.client.Feature.CSS_POINTER_EVENTS){f.pointerEvents=c;}qx.html.Element.call(this,null,f);this.__ks=d;this.__kt=e||d.toHashCode();this.useMarkup(d.getMarkup());},members:{__kt:null,__ks:null,getId:function(){return this.__kt;},getDecorator:function(){return this.__ks;},resize:function(g,h){this.__ks.resize(this.getDomElement(),g,h);},tint:function(i){this.__ks.tint(this.getDomElement(),i);},getInsets:function(){return this.__ks.getInsets();}},destruct:function(){this.__ks=null;}});})();(function(){var f="blur",e="focus",d="input",c="load",b="qx.ui.core.EventHandler",a="activate";qx.Class.define(b,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(){qx.core.Object.call(this);this.__em=qx.event.Registration.getManager(window);},statics:{PRIORITY:qx.event.Registration.PRIORITY_FIRST,SUPPORTED_TYPES:{mousemove:1,mouseover:1,mouseout:1,mousedown:1,mouseup:1,click:1,dblclick:1,contextmenu:1,mousewheel:1,keyup:1,keydown:1,keypress:1,keyinput:1,capture:1,losecapture:1,focusin:1,focusout:1,focus:1,blur:1,activate:1,deactivate:1,appear:1,disappear:1,dragstart:1,dragend:1,dragover:1,dragleave:1,drop:1,drag:1,dragchange:1,droprequest:1,touchstart:1,touchend:1,touchmove:1,touchcancel:1,tap:1,swipe:1},IGNORE_CAN_HANDLE:false},members:{__em:null,__en:{focusin:1,focusout:1,focus:1,blur:1},__eo:{mouseover:1,mouseout:1,appear:1,disappear:1},canHandleEvent:function(g,h){return g instanceof qx.ui.core.Widget;},_dispatchEvent:function(j){var p=j.getTarget();var o=qx.ui.core.Widget.getWidgetByElement(p);var q=false;while(o&&o.isAnonymous()){var q=true;o=o.getLayoutParent();}if(o&&q&&j.getType()==a){o.getContainerElement().activate();}if(this.__en[j.getType()]){o=o&&o.getFocusTarget();if(!o){return;}}if(j.getRelatedTarget){var x=j.getRelatedTarget();var w=qx.ui.core.Widget.getWidgetByElement(x);while(w&&w.isAnonymous()){w=w.getLayoutParent();}if(w){if(this.__en[j.getType()]){w=w.getFocusTarget();}if(w===o){return;}}}var s=j.getCurrentTarget();var u=qx.ui.core.Widget.getWidgetByElement(s);if(!u||u.isAnonymous()){return;}if(this.__en[j.getType()]){u=u.getFocusTarget();}var v=j.getType();if(!u||!(u.isEnabled()||this.__eo[v])){return;}var k=j.getEventPhase()==qx.event.type.Event.CAPTURING_PHASE;var r=this.__em.getListeners(u,v,k);if(!r||r.length===0){return;}var m=qx.event.Pool.getInstance().getObject(j.constructor);j.clone(m);m.setTarget(o);m.setRelatedTarget(w||null);m.setCurrentTarget(u);var y=j.getOriginalTarget();if(y){var n=qx.ui.core.Widget.getWidgetByElement(y);while(n&&n.isAnonymous()){n=n.getLayoutParent();}m.setOriginalTarget(n);}else{m.setOriginalTarget(p);}for(var i=0,l=r.length;i<l;i++){var t=r[i].context||u;r[i].handler.call(t,m);}if(m.getPropagationStopped()){j.stopPropagation();}if(m.getDefaultPrevented()){j.preventDefault();}qx.event.Pool.getInstance().poolObject(m);},registerEvent:function(z,A,B){var C;if(A===e||A===f){C=z.getFocusElement();}else if(A===c||A===d){C=z.getContentElement();}else{C=z.getContainerElement();}if(C){C.addListener(A,this._dispatchEvent,this,B);}},unregisterEvent:function(D,E,F){var G;if(E===e||E===f){G=D.getFocusElement();}else if(E===c||E===d){G=D.getContentElement();}else{G=D.getContainerElement();}if(G){G.removeListener(E,this._dispatchEvent,this,F);}}},destruct:function(){this.__em=null;},defer:function(H){qx.event.Registration.addHandler(H);}});})();(function(){var i="",h="/",g="mshtml",f="qx.client",e="//",d="?",c="string",b="qx.util.ResourceManager",a="singleton";qx.Class.define(b,{extend:qx.core.Object,type:a,statics:{__co:qx.$$resources||{},__cp:{}},members:{has:function(j){return !!this.self(arguments).__co[j];},getData:function(k){return this.self(arguments).__co[k]||null;},getImageWidth:function(l){var m=this.self(arguments).__co[l];return m?m[0]:null;},getImageHeight:function(n){var o=this.self(arguments).__co[n];return o?o[1]:null;},getImageFormat:function(p){var q=this.self(arguments).__co[p];return q?q[2]:null;},isClippedImage:function(r){var s=this.self(arguments).__co[r];return s&&s.length>4;},toUri:function(t){if(t==null){return t;}var u=this.self(arguments).__co[t];if(!u){return t;}if(typeof u===c){var w=u;}else{var w=u[3];if(!w){return t;}}var v=i;if(qx.core.Variant.isSet(f,g)&&qx.bom.client.Feature.SSL){v=this.self(arguments).__cp[w];}return v+qx.$$libraries[w].resourceUri+h+t;}},defer:function(x){if(qx.core.Variant.isSet(f,g)){if(qx.bom.client.Feature.SSL){for(var B in qx.$$libraries){var z;if(qx.$$libraries[B].resourceUri){z=qx.$$libraries[B].resourceUri;}else{x.__cp[B]=i;continue;}if(z.match(/^\/\//)!=null){x.__cp[B]=window.location.protocol;}else if(z.match(/^\//)!=null){x.__cp[B]=window.location.protocol+e+window.location.host;}else if(z.match(/^\.\//)!=null){var y=document.URL;x.__cp[B]=y.substring(0,y.lastIndexOf(h)+1);}else if(z.match(/^http/)!=null){x.__cp[B]=i;}else{var C=window.location.href.indexOf(d);var A;if(C==-1){A=window.location.href;}else{A=window.location.href.substring(0,C);}x.__cp[B]=A.substring(0,A.lastIndexOf(h)+1);}}}}}});})();(function(){var c="qx.bom.client.Locale",b="-",a="";qx.Class.define(c,{statics:{LOCALE:"",VARIANT:"",__lD:function(){var d=(navigator.userLanguage||navigator.language).toLowerCase();var f=a;var e=d.indexOf(b);if(e!=-1){f=d.substr(e+1);d=d.substr(0,e);}this.LOCALE=d;this.VARIANT=f;}},defer:function(g){g.__lD();}});})();(function(){var t="",s='indexOf',r='slice',q='concat',p='toLocaleLowerCase',o="qx.type.BaseString",n='match',m='toLocaleUpperCase',k='search',j='replace',c='toLowerCase',h='charCodeAt',f='split',b='substring',a='lastIndexOf',e='substr',d='toUpperCase',g='charAt';qx.Class.define(o,{extend:Object,construct:function(u){var u=u||t;this.__mc=u;this.length=u.length;},members:{$$isString:true,length:0,__mc:null,toString:function(){return this.__mc;},charAt:null,valueOf:null,charCodeAt:null,concat:null,indexOf:null,lastIndexOf:null,match:null,replace:null,search:null,slice:null,split:null,substr:null,substring:null,toLowerCase:null,toUpperCase:null,toHashCode:function(){return qx.core.ObjectRegistry.toHashCode(this);},toLocaleLowerCase:null,toLocaleUpperCase:null,base:function(v,w){return qx.core.Object.prototype.base.apply(this,arguments);}},defer:function(x,y){{};var z=[g,h,q,s,a,n,j,k,r,f,e,b,c,d,p,m];y.valueOf=y.toString;if(new x(t).valueOf()==null){delete y.valueOf;}for(var i=0,l=z.length;i<l;i++){y[z[i]]=String.prototype[z[i]];}}});})();(function(){var a="qx.locale.LocalizedString";qx.Class.define(a,{extend:qx.type.BaseString,construct:function(b,c,d){qx.type.BaseString.call(this,b);this.__ep=c;this.__eq=d;},members:{__ep:null,__eq:null,translate:function(){return qx.locale.Manager.getInstance().translate(this.__ep,this.__eq);}}});})();(function(){var k="_",j="",h="_applyLocale",g="changeLocale",f="C",e="qx.dynlocale",d="on",c="qx.locale.Manager",b="String",a="singleton";qx.Class.define(c,{type:a,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__jf=qx.$$translations||{};this.__jg=qx.$$locales||{};var n=qx.bom.client.Locale;var l=n.LOCALE;var m=n.VARIANT;if(m!==j){l+=k+m;}this.__jh=l;this.setLocale(l||this.__ji);},statics:{tr:function(o,p){var q=qx.lang.Array.fromArguments(arguments);q.splice(0,1);return qx.locale.Manager.getInstance().translate(o,q);},trn:function(r,s,t,u){var v=qx.lang.Array.fromArguments(arguments);v.splice(0,3);if(t!=1){return qx.locale.Manager.getInstance().translate(s,v);}else{return qx.locale.Manager.getInstance().translate(r,v);}},trc:function(w,x,y){var z=qx.lang.Array.fromArguments(arguments);z.splice(0,2);return qx.locale.Manager.getInstance().translate(x,z);},marktr:function(A){return A;}},properties:{locale:{check:b,nullable:true,apply:h,event:g}},members:{__ji:f,__jj:null,__jk:null,__jf:null,__jg:null,__jh:null,getLanguage:function(){return this.__jk;},getTerritory:function(){return this.getLocale().split(k)[1]||j;},getAvailableLocales:function(){var C=[];for(var B in this.__jg){if(B!=this.__ji){C.push(B);}}return C;},__jl:function(D){var F;var E=D.indexOf(k);if(E==-1){F=D;}else{F=D.substring(0,E);}return F;},_applyLocale:function(G,H){{};this.__jj=G;this.__jk=this.__jl(G);},addTranslation:function(I,J){var K=this.__jf;if(K[I]){for(var L in J){K[I][L]=J[L];}}else{K[I]=J;}},addLocale:function(M,N){var O=this.__jg;if(O[M]){for(var P in N){O[M][P]=N[P];}}else{O[M]=N;}},translate:function(Q,R,S){var T=this.__jf;return this.__jm(T,Q,R,S);},localize:function(U,V,W){var X=this.__jg;return this.__jm(X,U,V,W);},__jm:function(Y,ba,bb,bc){var bd;if(!Y){return ba;}if(bc){var bf=this.__jl(bc);}else{bc=this.__jj;bf=this.__jk;}if(!bd&&Y[bc]){bd=Y[bc][ba];}if(!bd&&Y[bf]){bd=Y[bf][ba];}if(!bd&&Y[this.__ji]){bd=Y[this.__ji][ba];}if(!bd){bd=ba;}if(bb.length>0){var be=[];for(var i=0;i<bb.length;i++){var bg=bb[i];if(bg&&bg.translate){be[i]=bg.translate();}else{be[i]=bg;}}bd=qx.lang.String.format(bd,be);}if(qx.core.Variant.isSet(e,d)){bd=new qx.locale.LocalizedString(bd,ba,bb);}return bd;}},destruct:function(){this.__jf=this.__jg=null;}});})();(function(){var k="px",j="qx.client",i="div",h="img",g="",f="no-repeat",d="scale-x",c="mshtml",b="scale",a="scale-y",G="qx/icon",F="repeat",E=".png",D="crop",C="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='",B='<div style="',A="repeat-y",z='<img src="',y="qx.bom.element.Decoration",x="', sizingMethod='",r="png",s="')",p='"></div>',q='"/>',n='" style="',o="none",l="webkit",m=" ",t="repeat-x",u="DXImageTransform.Microsoft.AlphaImageLoader",w="qx/static/blank.gif",v="absolute";qx.Class.define(y,{statics:{DEBUG:false,__hx:{},__hy:qx.core.Variant.isSet(j,c)&&qx.bom.client.Engine.VERSION<9,__hz:qx.core.Variant.select(j,{"mshtml":{"scale-x":true,"scale-y":true,"scale":true,"no-repeat":true},"default":null}),__hA:{"scale-x":h,"scale-y":h,"scale":h,"repeat":i,"no-repeat":i,"repeat-x":i,"repeat-y":i},update:function(H,I,J,K){var M=this.getTagName(J,I);if(M!=H.tagName.toLowerCase()){throw new Error("Image modification not possible because elements could not be replaced at runtime anymore!");}var N=this.getAttributes(I,J,K);if(M===h){H.src=N.src||qx.util.ResourceManager.getInstance().toUri(w);}if(H.style.backgroundPosition!=g&&N.style.backgroundPosition===undefined){N.style.backgroundPosition=null;}if(H.style.clip!=g&&N.style.clip===undefined){N.style.clip=null;}var L=qx.bom.element.Style;L.setStyles(H,N.style);if(this.__hy){try{H.filters[u].apply();}catch(e){}}},create:function(O,P,Q){var R=this.getTagName(P,O);var T=this.getAttributes(O,P,Q);var S=qx.bom.element.Style.compile(T.style);if(R===h){return z+T.src+n+S+q;}else{return B+S+p;}},getTagName:function(U,V){if(qx.core.Variant.isSet(j,c)){if(V&&this.__hy&&this.__hz[U]&&qx.lang.String.endsWith(V,E)){return i;}}return this.__hA[U];},getAttributes:function(W,X,Y){if(!Y){Y={};}if(!Y.position){Y.position=v;}if(qx.core.Variant.isSet(j,c)){Y.fontSize=0;Y.lineHeight=0;}else if(qx.core.Variant.isSet(j,l)){Y.WebkitUserDrag=o;}var bb=qx.util.ResourceManager.getInstance().getImageFormat(W)||qx.io.ImageLoader.getFormat(W);{};var ba;if(this.__hy&&this.__hz[X]&&bb===r){ba=this.__hD(Y,X,W);}else{if(X===b){ba=this.__hE(Y,X,W);}else if(X===d||X===a){ba=this.__hF(Y,X,W);}else{ba=this.__hI(Y,X,W);}}return ba;},__hB:function(bc,bd,be){if(bc.width==null&&bd!=null){bc.width=bd+k;}if(bc.height==null&&be!=null){bc.height=be+k;}return bc;},__hC:function(bf){var bh=qx.util.ResourceManager.getInstance().getImageWidth(bf)||qx.io.ImageLoader.getWidth(bf);var bi=qx.util.ResourceManager.getInstance().getImageHeight(bf)||qx.io.ImageLoader.getHeight(bf);return {width:bh,height:bi};},__hD:function(bj,bk,bl){var bo=this.__hC(bl);bj=this.__hB(bj,bo.width,bo.height);var bn=bk==f?D:b;var bm=C+qx.util.ResourceManager.getInstance().toUri(bl)+x+bn+s;bj.filter=bm;bj.backgroundImage=bj.backgroundRepeat=g;return {style:bj};},__hE:function(bp,bq,br){var bs=qx.util.ResourceManager.getInstance().toUri(br);var bt=this.__hC(br);bp=this.__hB(bp,bt.width,bt.height);return {src:bs,style:bp};},__hF:function(bu,bv,bw){var bA=qx.util.ResourceManager.getInstance();var bz=bA.isClippedImage(bw);var bB=this.__hC(bw);if(bz){var by=bA.getData(bw);var bx=bA.toUri(by[4]);if(bv===d){bu=this.__hG(bu,by,bB.height);}else{bu=this.__hH(bu,by,bB.width);}return {src:bx,style:bu};}else{{};if(bv==d){bu.height=bB.height==null?null:bB.height+k;}else if(bv==a){bu.width=bB.width==null?null:bB.width+k;}var bx=bA.toUri(bw);return {src:bx,style:bu};}},__hG:function(bC,bD,bE){var bF=qx.util.ResourceManager.getInstance().getImageHeight(bD[4]);bC.clip={top:-bD[6],height:bE};bC.height=bF+k;if(bC.top!=null){bC.top=(parseInt(bC.top,10)+bD[6])+k;}else if(bC.bottom!=null){bC.bottom=(parseInt(bC.bottom,10)+bE-bF-bD[6])+k;}return bC;},__hH:function(bG,bH,bI){var bJ=qx.util.ResourceManager.getInstance().getImageWidth(bH[4]);bG.clip={left:-bH[5],width:bI};bG.width=bJ+k;if(bG.left!=null){bG.left=(parseInt(bG.left,10)+bH[5])+k;}else if(bG.right!=null){bG.right=(parseInt(bG.right,10)+bI-bJ-bH[5])+k;}return bG;},__hI:function(bK,bL,bM){var bR=qx.util.ResourceManager.getInstance().isClippedImage(bM);var bQ=this.__hC(bM);if(bR&&bL!==F){var bP=qx.util.ResourceManager.getInstance().getData(bM);var bO=qx.bom.element.Background.getStyles(bP[4],bL,bP[5],bP[6]);for(var bN in bO){bK[bN]=bO[bN];}if(bQ.width!=null&&bK.width==null&&(bL==A||bL===f)){bK.width=bQ.width+k;}if(bQ.height!=null&&bK.height==null&&(bL==t||bL===f)){bK.height=bQ.height+k;}return {style:bK};}else{{};bK=this.__hB(bK,bQ.width,bQ.height);bK=this.__hJ(bK,bM,bL);return {style:bK};}},__hJ:function(bS,bT,bU){var top=null;var bY=null;if(bS.backgroundPosition){var bV=bS.backgroundPosition.split(m);bY=parseInt(bV[0],10);if(isNaN(bY)){bY=bV[0];}top=parseInt(bV[1],10);if(isNaN(top)){top=bV[1];}}var bX=qx.bom.element.Background.getStyles(bT,bU,bY,top);for(var bW in bX){bS[bW]=bX[bW];}if(bS.filter){bS.filter=g;}return bS;},__hK:function(ca){if(this.DEBUG&&qx.util.ResourceManager.getInstance().has(ca)&&ca.indexOf(G)==-1){if(!this.__hx[ca]){qx.log.Logger.debug("Potential clipped image candidate: "+ca);this.__hx[ca]=true;}}},isAlphaImageLoaderEnabled:qx.core.Variant.select(j,{"mshtml":function(){return qx.bom.element.Decoration.__hy;},"default":function(){return false;}})}});})();(function(){var c="qx.client",b="load",a="qx.io.ImageLoader";qx.Bootstrap.define(a,{statics:{__lo:{},__lp:{width:null,height:null},__lq:/\.(png|gif|jpg|jpeg|bmp)\b/i,isLoaded:function(d){var e=this.__lo[d];return !!(e&&e.loaded);},isFailed:function(f){var g=this.__lo[f];return !!(g&&g.failed);},isLoading:function(h){var j=this.__lo[h];return !!(j&&j.loading);},getFormat:function(k){var m=this.__lo[k];return m?m.format:null;},getSize:function(n){var o=this.__lo[n];return o?{width:o.width,height:o.height}:this.__lp;},getWidth:function(p){var q=this.__lo[p];return q?q.width:null;},getHeight:function(r){var s=this.__lo[r];return s?s.height:null;},load:function(t,u,v){var w=this.__lo[t];if(!w){w=this.__lo[t]={};}if(u&&!v){v=window;}if(w.loaded||w.loading||w.failed){if(u){if(w.loading){w.callbacks.push(u,v);}else{u.call(v,t,w);}}}else{w.loading=true;w.callbacks=[];if(u){w.callbacks.push(u,v);}var y=new Image();var x=qx.lang.Function.listener(this.__lr,this,y,t);y.onload=x;y.onerror=x;y.src=t;w.element=y;}},abort:function(z){var A=this.__lo[z];if(A&&!A.loaded){A.aborted=true;var C=A.callbacks;var B=A.element;B.onload=B.onerror=null;delete A.callbacks;delete A.element;delete A.loading;for(var i=0,l=C.length;i<l;i+=2){C[i].call(C[i+1],z,A);}}this.__lo[z]=null;},__lr:qx.event.GlobalError.observeMethod(function(event,D,E){var F=this.__lo[E];if(event.type===b){F.loaded=true;F.width=this.__ls(D);F.height=this.__lt(D);var G=this.__lq.exec(E);if(G!=null){F.format=G[1];}}else{F.failed=true;}D.onload=D.onerror=null;var H=F.callbacks;delete F.loading;delete F.callbacks;delete F.element;for(var i=0,l=H.length;i<l;i+=2){H[i].call(H[i+1],E,F);}}),__ls:qx.core.Variant.select(c,{"gecko":function(I){return I.naturalWidth;},"default":function(J){return J.width;}}),__lt:qx.core.Variant.select(c,{"gecko":function(K){return K.naturalHeight;},"default":function(L){return L.height;}})}});})();(function(){var m="number",l="0",k="px",j=";",i="background-image:url(",h=");",g="",f=")",e="background-repeat:",d=" ",a="qx.bom.element.Background",c="url(",b="background-position:";qx.Class.define(a,{statics:{__da:[i,null,h,b,null,j,e,null,j],__db:{backgroundImage:null,backgroundPosition:null,backgroundRepeat:null},__dc:function(n,top){var o=qx.bom.client.Engine;if(o.GECKO&&o.VERSION<1.9&&n==top&&typeof n==m){top+=0.01;}if(n){var p=(typeof n==m)?n+k:n;}else{p=l;}if(top){var q=(typeof top==m)?top+k:top;}else{q=l;}return p+d+q;},compile:function(r,s,t,top){var u=this.__dc(t,top);var v=qx.util.ResourceManager.getInstance().toUri(r);var w=this.__da;w[1]=v;w[4]=u;w[7]=s;return w.join(g);},getStyles:function(x,y,z,top){if(!x){return this.__db;}var A=this.__dc(z,top);var B=qx.util.ResourceManager.getInstance().toUri(x);var C={backgroundPosition:A,backgroundImage:c+B+f};if(y!=null){C.backgroundRepeat=y;}return C;},set:function(D,E,F,G,top){var H=this.getStyles(E,F,G,top);for(var I in H){D.style[I]=H[I];}}}});})();(function(){var j="source",i="scale",h="no-repeat",g="qx.client",f="mshtml",e="webkit",d="backgroundImage",c="div",b="qx.html.Image",a="qx/static/blank.gif";qx.Class.define(b,{extend:qx.html.Element,members:{tagNameHint:null,_applyProperty:function(name,k){qx.html.Element.prototype._applyProperty.call(this,name,k);if(name===j){var o=this.getDomElement();var l=this.getAllStyles();if(this.getNodeName()==c&&this.getStyle(d)){l.backgroundPosition=null;l.backgroundRepeat=null;}var m=this._getProperty(j);var n=this._getProperty(i);var p=n?i:h;if(m!=null){qx.bom.element.Decoration.update(o,m,p,l);}}},_createDomElement:function(){var r=this._getProperty(i);var s=r?i:h;if(qx.core.Variant.isSet(g,f)){var q=this._getProperty(j);if(this.tagNameHint!=null){this.setNodeName(this.tagNameHint);}else{this.setNodeName(qx.bom.element.Decoration.getTagName(s,q));}}else{this.setNodeName(qx.bom.element.Decoration.getTagName(s));}return qx.html.Element.prototype._createDomElement.call(this);},_copyData:function(t){return qx.html.Element.prototype._copyData.call(this,true);},setSource:function(u){this._setProperty(j,u);return this;},getSource:function(){return this._getProperty(j);},resetSource:function(){if(qx.core.Variant.isSet(g,e)){this._setProperty(j,qx.util.ResourceManager.getInstance().toUri(a));}else{this._removeProperty(j,true);}return this;},setScale:function(v){this._setProperty(i,v);return this;},getScale:function(){return this._getProperty(i);}}});})();(function(){var f="_applyTheme",e="qx.theme.manager.Color",d="Theme",c="changeTheme",b="string",a="singleton";qx.Class.define(e,{type:a,extend:qx.util.ValueManager,properties:{theme:{check:d,nullable:true,apply:f,event:c}},members:{_applyTheme:function(g){var h={};if(g){var i=g.colors;var j=qx.util.ColorUtil;var k;for(var l in i){k=i[l];if(typeof k===b){if(!j.isCssString(k)){throw new Error("Could not parse color: "+k);}}else if(k instanceof Array){k=j.rgbToRgbString(k);}else{throw new Error("Could not parse color: "+k);}h[l]=k;}}this._setDynamic(h);},resolve:function(m){var p=this._dynamic;var n=p[m];if(n){return n;}var o=this.getTheme();if(o!==null&&o.colors[m]){return p[m]=o.colors[m];}return m;},isDynamic:function(q){var s=this._dynamic;if(q&&(s[q]!==undefined)){return true;}var r=this.getTheme();if(r!==null&&q&&(r.colors[q]!==undefined)){s[q]=r.colors[q];return true;}return false;}}});})();(function(){var h=",",e="rgb(",d=")",c="qx.theme.manager.Color",a="qx.util.ColorUtil";qx.Class.define(a,{statics:{REGEXP:{hex3:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,rgb:/^rgb\(\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*\)$/,rgba:/^rgba\(\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*\)$/},SYSTEM:{activeborder:true,activecaption:true,appworkspace:true,background:true,buttonface:true,buttonhighlight:true,buttonshadow:true,buttontext:true,captiontext:true,graytext:true,highlight:true,highlighttext:true,inactiveborder:true,inactivecaption:true,inactivecaptiontext:true,infobackground:true,infotext:true,menu:true,menutext:true,scrollbar:true,threeddarkshadow:true,threedface:true,threedhighlight:true,threedlightshadow:true,threedshadow:true,window:true,windowframe:true,windowtext:true},NAMED:{black:[0,0,0],silver:[192,192,192],gray:[128,128,128],white:[255,255,255],maroon:[128,0,0],red:[255,0,0],purple:[128,0,128],fuchsia:[255,0,255],green:[0,128,0],lime:[0,255,0],olive:[128,128,0],yellow:[255,255,0],navy:[0,0,128],blue:[0,0,255],teal:[0,128,128],aqua:[0,255,255],transparent:[-1,-1,-1],magenta:[255,0,255],orange:[255,165,0],brown:[165,42,42]},isNamedColor:function(j){return this.NAMED[j]!==undefined;},isSystemColor:function(k){return this.SYSTEM[k]!==undefined;},supportsThemes:function(){return qx.Class.isDefined(c);},isThemedColor:function(l){if(!this.supportsThemes()){return false;}return qx.theme.manager.Color.getInstance().isDynamic(l);},stringToRgb:function(m){if(this.supportsThemes()&&this.isThemedColor(m)){var m=qx.theme.manager.Color.getInstance().resolveDynamic(m);}if(this.isNamedColor(m)){return this.NAMED[m];}else if(this.isSystemColor(m)){throw new Error("Could not convert system colors to RGB: "+m);}else if(this.isRgbString(m)){return this.__gB();}else if(this.isHex3String(m)){return this.__gD();}else if(this.isHex6String(m)){return this.__gE();}throw new Error("Could not parse color: "+m);},cssStringToRgb:function(n){if(this.isNamedColor(n)){return this.NAMED[n];}else if(this.isSystemColor(n)){throw new Error("Could not convert system colors to RGB: "+n);}else if(this.isRgbString(n)){return this.__gB();}else if(this.isRgbaString(n)){return this.__gC();}else if(this.isHex3String(n)){return this.__gD();}else if(this.isHex6String(n)){return this.__gE();}throw new Error("Could not parse color: "+n);},stringToRgbString:function(o){return this.rgbToRgbString(this.stringToRgb(o));},rgbToRgbString:function(s){return e+s[0]+h+s[1]+h+s[2]+d;},rgbToHexString:function(u){return (qx.lang.String.pad(u[0].toString(16).toUpperCase(),2)+qx.lang.String.pad(u[1].toString(16).toUpperCase(),2)+qx.lang.String.pad(u[2].toString(16).toUpperCase(),2));},isValidPropertyValue:function(v){return this.isThemedColor(v)||this.isNamedColor(v)||this.isHex3String(v)||this.isHex6String(v)||this.isRgbString(v);},isCssString:function(w){return this.isSystemColor(w)||this.isNamedColor(w)||this.isHex3String(w)||this.isHex6String(w)||this.isRgbString(w);},isHex3String:function(x){return this.REGEXP.hex3.test(x);},isHex6String:function(y){return this.REGEXP.hex6.test(y);},isRgbString:function(z){return this.REGEXP.rgb.test(z);},isRgbaString:function(A){return this.REGEXP.rgba.test(A);},__gB:function(){var D=parseInt(RegExp.$1,10);var C=parseInt(RegExp.$2,10);var B=parseInt(RegExp.$3,10);return [D,C,B];},__gC:function(){var G=parseInt(RegExp.$1,10);var F=parseInt(RegExp.$2,10);var E=parseInt(RegExp.$3,10);return [G,F,E];},__gD:function(){var J=parseInt(RegExp.$1,16)*17;var I=parseInt(RegExp.$2,16)*17;var H=parseInt(RegExp.$3,16)*17;return [J,I,H];},__gE:function(){var M=(parseInt(RegExp.$1,16)*16)+parseInt(RegExp.$2,16);var L=(parseInt(RegExp.$3,16)*16)+parseInt(RegExp.$4,16);var K=(parseInt(RegExp.$5,16)*16)+parseInt(RegExp.$6,16);return [M,L,K];},hex3StringToRgb:function(N){if(this.isHex3String(N)){return this.__gD(N);}throw new Error("Invalid hex3 value: "+N);},hex6StringToRgb:function(O){if(this.isHex6String(O)){return this.__gE(O);}throw new Error("Invalid hex6 value: "+O);},hexStringToRgb:function(P){if(this.isHex3String(P)){return this.__gD(P);}if(this.isHex6String(P)){return this.__gE(P);}throw new Error("Invalid hex value: "+P);},rgbToHsb:function(Q){var S,T,V;var bc=Q[0];var Y=Q[1];var R=Q[2];var bb=(bc>Y)?bc:Y;if(R>bb){bb=R;}var U=(bc<Y)?bc:Y;if(R<U){U=R;}V=bb/255.0;if(bb!=0){T=(bb-U)/bb;}else{T=0;}if(T==0){S=0;}else{var X=(bb-bc)/(bb-U);var ba=(bb-Y)/(bb-U);var W=(bb-R)/(bb-U);if(bc==bb){S=W-ba;}else if(Y==bb){S=2.0+X-W;}else{S=4.0+ba-X;}S=S/6.0;if(S<0){S=S+1.0;}}return [Math.round(S*360),Math.round(T*100),Math.round(V*100)];},hsbToRgb:function(bd){var i,f,p,q,t;var be=bd[0]/360;var bf=bd[1]/100;var bg=bd[2]/100;if(be>=1.0){be%=1.0;}if(bf>1.0){bf=1.0;}if(bg>1.0){bg=1.0;}var bh=Math.floor(255*bg);var bi={};if(bf==0.0){bi.red=bi.green=bi.blue=bh;}else{be*=6.0;i=Math.floor(be);f=be-i;p=Math.floor(bh*(1.0-bf));q=Math.floor(bh*(1.0-(bf*f)));t=Math.floor(bh*(1.0-(bf*(1.0-f))));switch(i){case 0:bi.red=bh;bi.green=t;bi.blue=p;break;case 1:bi.red=q;bi.green=bh;bi.blue=p;break;case 2:bi.red=p;bi.green=bh;bi.blue=t;break;case 3:bi.red=p;bi.green=q;bi.blue=bh;break;case 4:bi.red=t;bi.green=p;bi.blue=bh;break;case 5:bi.red=bh;bi.green=p;bi.blue=q;break;}}return [bi.red,bi.green,bi.blue];},randomColor:function(){var r=Math.round(Math.random()*255);var g=Math.round(Math.random()*255);var b=Math.round(Math.random()*255);return this.rgbToRgbString([r,g,b]);}}});})();(function(){var h="string",g="_applyTheme",f="qx.theme.manager.Appearance",e=":",d="Theme",c="changeTheme",b="/",a="singleton";qx.Class.define(f,{type:a,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__dL={};this.__dM={};},properties:{theme:{check:d,nullable:true,event:c,apply:g}},members:{__dN:{},__dL:null,__dM:null,_applyTheme:function(j,k){this.__dM={};this.__dL={};},__dO:function(l,m,n){var s=m.appearances;var v=s[l];if(!v){var w=b;var p=[];var u=l.split(w);var t;while(!v&&u.length>0){p.unshift(u.pop());var q=u.join(w);v=s[q];if(v){t=v.alias||v;if(typeof t===h){var r=t+w+p.join(w);return this.__dO(r,m,n);}}}for(var i=0;i<p.length-1;i++){p.shift();var q=p.join(w);var o=this.__dO(q,m);if(o){return o;}}if(n!=null){return this.__dO(n,m);}return null;}else if(typeof v===h){return this.__dO(v,m,n);}else if(v.include&&!v.style){return this.__dO(v.include,m,n);}return l;},styleFrom:function(x,y,z,A){if(!z){z=this.getTheme();}var G=this.__dM;var B=G[x];if(!B){B=G[x]=this.__dO(x,z,A);}var L=z.appearances[B];if(!L){this.warn("Missing appearance: "+x);return null;}if(!L.style){return null;}var M=B;if(y){var N=L.$$bits;if(!N){N=L.$$bits={};L.$$length=0;}var E=0;for(var H in y){if(!y[H]){continue;}if(N[H]==null){N[H]=1<<L.$$length++;}E+=N[H];}if(E>0){M+=e+E;}}var F=this.__dL;if(F[M]!==undefined){return F[M];}if(!y){y=this.__dN;}var J;if(L.include||L.base){var D=L.style(y);var C;if(L.include){C=this.styleFrom(L.include,y,z,A);}J={};if(L.base){var I=this.styleFrom(B,y,L.base,A);if(L.include){for(var K in I){if(!C.hasOwnProperty(K)&&!D.hasOwnProperty(K)){J[K]=I[K];}}}else{for(var K in I){if(!D.hasOwnProperty(K)){J[K]=I[K];}}}}if(L.include){for(var K in C){if(!D.hasOwnProperty(K)){J[K]=C[K];}}}for(var K in D){J[K]=D[K];}}else{J=L.style(y);}return F[M]=J||null;}},destruct:function(){this.__dL=this.__dM=null;}});})();(function(){var j="nonScaled",i="scaled",h="alphaScaled",g=".png",f="qx.client",e="div",d="replacement",c="qx.event.type.Event",b="hidden",a="Boolean",y="px",x="scale",w="changeSource",v="__fP",u="qx.ui.basic.Image",t="loaded",s="-disabled.$1",r="loadingFailed",q="String",p="_applySource",n="img",o="image",l="mshtml",m="_applyScale",k="no-repeat";qx.Class.define(u,{extend:qx.ui.core.Widget,construct:function(z){this.__fP={};qx.ui.core.Widget.call(this);if(z){this.setSource(z);}},properties:{source:{check:q,init:null,nullable:true,event:w,apply:p,themeable:true},scale:{check:a,init:false,themeable:true,apply:m},appearance:{refine:true,init:o},allowShrinkX:{refine:true,init:false},allowShrinkY:{refine:true,init:false},allowGrowX:{refine:true,init:false},allowGrowY:{refine:true,init:false}},events:{loadingFailed:c,loaded:c},members:{__fQ:null,__fR:null,__fS:null,__fP:null,getContentElement:function(){return this.__fW();},_createContentElement:function(){return this.__fW();},_getContentHint:function(){return {width:this.__fQ||0,height:this.__fR||0};},_applyEnabled:function(A,B){qx.ui.core.Widget.prototype._applyEnabled.call(this,A,B);if(this.getSource()){this._styleSource();}},_applySource:function(C){this._styleSource();},_applyScale:function(D){this._styleSource();},__fT:function(E){this.__fS=E;},__fU:function(){if(this.__fS==null){var G=this.getSource();var F=false;if(G!=null){F=qx.lang.String.endsWith(G,g);}if(this.getScale()&&F&&qx.bom.element.Decoration.isAlphaImageLoaderEnabled()){this.__fS=h;}else if(this.getScale()){this.__fS=i;}else{this.__fS=j;}}return this.__fS;},__fV:function(H){var I;var J;if(H==h){I=true;J=e;}else if(H==j){I=false;J=e;}else{I=true;J=n;}var K=new qx.html.Image(J);K.setScale(I);K.setStyles({"overflowX":b,"overflowY":b});return K;},__fW:function(){var L=this.__fU();if(this.__fP[L]==null){this.__fP[L]=this.__fV(L);}return this.__fP[L];},_styleSource:function(){var M=qx.util.AliasManager.getInstance().resolve(this.getSource());if(!M){this.getContentElement().resetSource();return;}this.__fX(M);if(qx.core.Variant.isSet(f,l)){var N=this.getScale()?x:k;this.getContentElement().tagNameHint=qx.bom.element.Decoration.getTagName(N,M);}if(qx.util.ResourceManager.getInstance().has(M)){this.__ga(this.getContentElement(),M);}else if(qx.io.ImageLoader.isLoaded(M)){this.__gb(this.getContentElement(),M);}else{this.__gc(this.getContentElement(),M);}},__fX:qx.core.Variant.select(f,{"mshtml":function(O){var Q=qx.bom.element.Decoration.isAlphaImageLoaderEnabled();var P=qx.lang.String.endsWith(O,g);if(Q&&P){if(this.getScale()&&this.__fU()!=h){this.__fT(h);}else if(!this.getScale()&&this.__fU()!=j){this.__fT(j);}}else{if(this.getScale()&&this.__fU()!=i){this.__fT(i);}else if(!this.getScale()&&this.__fU()!=j){this.__fT(j);}}this.__fY(this.__fW());},"default":function(R){if(this.getScale()&&this.__fU()!=i){this.__fT(i);}else if(!this.getScale()&&this.__fU(j)){this.__fT(j);}this.__fY(this.__fW());}}),__fY:function(S){var V=this.getContainerElement();var W=V.getChild(0);if(W!=S){if(W!=null){var Y=y;var T={};var U=this.getInnerSize();if(U!=null){T.width=U.width+Y;T.height=U.height+Y;}var X=this.getInsets();T.left=X.left+Y;T.top=X.top+Y;T.zIndex=10;S.setStyles(T,true);S.setSelectable(this.getSelectable());}V.removeAt(0);V.addAt(S,0);}},__ga:function(ba,bb){var bd=qx.util.ResourceManager.getInstance();if(!this.getEnabled()){var bc=bb.replace(/\.([a-z]+)$/,s);if(bd.has(bc)){bb=bc;this.addState(d);}else{this.removeState(d);}}if(ba.getSource()===bb){return;}ba.setSource(bb);this.__ge(bd.getImageWidth(bb),bd.getImageHeight(bb));},__gb:function(be,bf){var bh=qx.io.ImageLoader;be.setSource(bf);var bg=bh.getWidth(bf);var bi=bh.getHeight(bf);this.__ge(bg,bi);},__gc:function(bj,bk){var self;var bl=qx.io.ImageLoader;{};if(!bl.isFailed(bk)){bl.load(bk,this.__gd,this);}else{if(bj!=null){bj.resetSource();}}},__gd:function(bm,bn){if(this.$$disposed===true){return;}if(bm!==qx.util.AliasManager.getInstance().resolve(this.getSource())){return;}if(bn.failed){this.warn("Image could not be loaded: "+bm);this.fireEvent(r);}else{this.fireEvent(t);}this._styleSource();},__ge:function(bo,bp){if(bo!==this.__fQ||bp!==this.__fR){this.__fQ=bo;this.__fR=bp;qx.ui.core.queue.Layout.add(this);}}},destruct:function(){this._disposeMap(v);}});})();(function(){var j="Integer",i="interval",h="keep-align",g="disappear",f="best-fit",e="mouse",d="bottom-left",c="direct",b="Boolean",a="bottom-right",x="widget",w="qx.ui.core.MPlacement",v="left-top",u="offsetRight",t="shorthand",s="offsetLeft",r="top-left",q="appear",p="offsetBottom",o="top-right",m="offsetTop",n="right-bottom",k="right-top",l="left-bottom";qx.Mixin.define(w,{statics:{__iR:null,setVisibleElement:function(y){this.__iR=y;},getVisibleElement:function(){return this.__iR;}},properties:{position:{check:[r,o,d,a,v,l,k,n],init:d,themeable:true},placeMethod:{check:[x,e],init:e,themeable:true},domMove:{check:b,init:false},placementModeX:{check:[c,h,f],init:h,themeable:true},placementModeY:{check:[c,h,f],init:h,themeable:true},offsetLeft:{check:j,init:0,themeable:true},offsetTop:{check:j,init:0,themeable:true},offsetRight:{check:j,init:0,themeable:true},offsetBottom:{check:j,init:0,themeable:true},offset:{group:[m,u,p,s],mode:t,themeable:true}},members:{__iS:null,__iT:null,__iU:null,getLayoutLocation:function(z){var C,B,D,top;B=z.getBounds();D=B.left;top=B.top;var E=B;z=z.getLayoutParent();while(z&&!z.isRootWidget()){B=z.getBounds();D+=B.left;top+=B.top;C=z.getInsets();D+=C.left;top+=C.top;z=z.getLayoutParent();}if(z.isRootWidget()){var A=z.getContainerLocation();if(A){D+=A.left;top+=A.top;}}return {left:D,top:top,right:D+E.width,bottom:top+E.height};},moveTo:function(F,top){var H=qx.ui.core.MPlacement.getVisibleElement();if(H){var J=this.getBounds();var G=H.getContentLocation();if(J&&G){var K=top+J.height;var I=F+J.width;if((I>G.left&&F<G.right)&&(K>G.top&&top<G.bottom)){F=Math.max(G.left-J.width,0);}}}if(this.getDomMove()){this.setDomPosition(F,top);}else{this.setLayoutProperties({left:F,top:top});}},placeToWidget:function(L,M){if(M){this.__iV();this.__iS=qx.lang.Function.bind(this.placeToWidget,this,L,false);qx.event.Idle.getInstance().addListener(i,this.__iS);this.__iU=function(){this.__iV();};this.addListener(g,this.__iU,this);}var N=L.getContainerLocation()||this.getLayoutLocation(L);this.__iX(N);},__iV:function(){if(this.__iS){qx.event.Idle.getInstance().removeListener(i,this.__iS);this.__iS=null;}if(this.__iU){this.removeListener(g,this.__iU,this);this.__iU=null;}},placeToMouse:function(event){var P=event.getDocumentLeft();var top=event.getDocumentTop();var O={left:P,top:top,right:P,bottom:top};this.__iX(O);},placeToElement:function(Q,R){var location=qx.bom.element.Location.get(Q);var S={left:location.left,top:location.top,right:location.left+Q.offsetWidth,bottom:location.top+Q.offsetHeight};if(R){this.__iS=qx.lang.Function.bind(this.placeToElement,this,Q,false);qx.event.Idle.getInstance().addListener(i,this.__iS);this.addListener(g,function(){if(this.__iS){qx.event.Idle.getInstance().removeListener(i,this.__iS);this.__iS=null;}},this);}this.__iX(S);},placeToPoint:function(T){var U={left:T.left,top:T.top,right:T.left,bottom:T.top};this.__iX(U);},_getPlacementOffsets:function(){return {left:this.getOffsetLeft(),top:this.getOffsetTop(),right:this.getOffsetRight(),bottom:this.getOffsetBottom()};},__iW:function(V){var W=null;if(this._computePlacementSize){var W=this._computePlacementSize();}else if(this.isVisible()){var W=this.getBounds();}if(W==null){this.addListenerOnce(q,function(){this.__iW(V);},this);}else{V.call(this,W);}},__iX:function(X){this.__iW(function(Y){var ba=qx.util.placement.Placement.compute(Y,this.getLayoutParent().getBounds(),X,this._getPlacementOffsets(),this.getPosition(),this.getPlacementModeX(),this.getPlacementModeY());this.moveTo(ba.left,ba.top);});}},destruct:function(){this.__iV();}});})();(function(){var g="dragdrop-cursor",f="_applyAction",e="alias",d="qx.ui.core.DragDropCursor",c="move",b="singleton",a="copy";qx.Class.define(d,{extend:qx.ui.basic.Image,include:qx.ui.core.MPlacement,type:b,construct:function(){qx.ui.basic.Image.call(this);this.setZIndex(1e8);this.setDomMove(true);var h=this.getApplicationRoot();h.add(this,{left:-1000,top:-1000});},properties:{appearance:{refine:true,init:g},action:{check:[e,a,c],apply:f,nullable:true}},members:{_applyAction:function(i,j){if(j){this.removeState(j);}if(i){this.addState(i);}}}});})();(function(){var f="interval",e="Number",d="_applyTimeoutInterval",c="qx.event.type.Event",b="qx.event.Idle",a="singleton";qx.Class.define(b,{extend:qx.core.Object,type:a,construct:function(){qx.core.Object.call(this);var g=new qx.event.Timer(this.getTimeoutInterval());g.addListener(f,this._onInterval,this);g.start();this.__kM=g;},events:{"interval":c},properties:{timeoutInterval:{check:e,init:100,apply:d}},members:{__kM:null,_applyTimeoutInterval:function(h){this.__kM.setInterval(h);},_onInterval:function(){this.fireEvent(f);}},destruct:function(){if(this.__kM){this.__kM.stop();}this.__kM=null;}});})();(function(){var o="top",n="right",m="bottom",l="left",k="align-start",j="qx.util.placement.AbstractAxis",i="edge-start",h="align-end",g="edge-end",f="-",c="best-fit",e="qx.util.placement.Placement",d="keep-align",b="direct",a='__hM';qx.Class.define(e,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__hM=new qx.util.placement.DirectAxis();},properties:{axisX:{check:j},axisY:{check:j},edge:{check:[o,n,m,l],init:o},align:{check:[o,n,m,l],init:n}},statics:{__hN:null,compute:function(p,q,r,s,t,u,v){this.__hN=this.__hN||new qx.util.placement.Placement();var y=t.split(f);var x=y[0];var w=y[1];this.__hN.set({axisX:this.__hR(u),axisY:this.__hR(v),edge:x,align:w});return this.__hN.compute(p,q,r,s);},__hO:null,__hP:null,__hQ:null,__hR:function(z){switch(z){case b:this.__hO=this.__hO||new qx.util.placement.DirectAxis();return this.__hO;case d:this.__hP=this.__hP||new qx.util.placement.KeepAlignAxis();return this.__hP;case c:this.__hQ=this.__hQ||new qx.util.placement.BestFitAxis();return this.__hQ;default:throw new Error("Invalid 'mode' argument!'");}}},members:{__hM:null,compute:function(A,B,C,D){{};var E=this.getAxisX()||this.__hM;var G=E.computeStart(A.width,{start:C.left,end:C.right},{start:D.left,end:D.right},B.width,this.__hS());var F=this.getAxisY()||this.__hM;var top=F.computeStart(A.height,{start:C.top,end:C.bottom},{start:D.top,end:D.bottom},B.height,this.__hT());return {left:G,top:top};},__hS:function(){var I=this.getEdge();var H=this.getAlign();if(I==l){return i;}else if(I==n){return g;}else if(H==l){return k;}else if(H==n){return h;}},__hT:function(){var K=this.getEdge();var J=this.getAlign();if(K==o){return i;}else if(K==m){return g;}else if(J==o){return k;}else if(J==m){return h;}}},destruct:function(){this._disposeObjects(a);}});})();(function(){var e="edge-start",d="align-start",c="align-end",b="edge-end",a="qx.util.placement.AbstractAxis";qx.Class.define(a,{extend:qx.core.Object,members:{computeStart:function(f,g,h,i,j){throw new Error("abstract method call!");},_moveToEdgeAndAlign:function(k,l,m,n){switch(n){case e:return l.start-m.end-k;case b:return l.end+m.start;case d:return l.start+m.start;case c:return l.end-m.end-k;}},_isInRange:function(o,p,q){return o>=0&&o+p<=q;}}});})();(function(){var a="qx.util.placement.DirectAxis";qx.Class.define(a,{extend:qx.util.placement.AbstractAxis,members:{computeStart:function(b,c,d,e,f){return this._moveToEdgeAndAlign(b,c,d,f);}}});})();(function(){var c="qx.util.placement.KeepAlignAxis",b="edge-start",a="edge-end";qx.Class.define(c,{extend:qx.util.placement.AbstractAxis,members:{computeStart:function(d,e,f,g,h){var i=this._moveToEdgeAndAlign(d,e,f,h);var j,k;if(this._isInRange(i,d,g)){return i;}if(h==b||h==a){j=e.start-f.end;k=e.end+f.start;}else{j=e.end-f.end;k=e.start+f.start;}if(j>g-k){i=j-d;}else{i=k;}return i;}}});})();(function(){var a="qx.util.placement.BestFitAxis";qx.Class.define(a,{extend:qx.util.placement.AbstractAxis,members:{computeStart:function(b,c,d,e,f){var g=this._moveToEdgeAndAlign(b,c,d,f);if(this._isInRange(g,b,e)){return g;}if(g<0){g=Math.min(0,e-b);}if(g+b>e){g=Math.max(0,e-b);}return g;}}});})();(function(){var b="qx.ui.form.IRadioItem",a="qx.event.type.Data";qx.Interface.define(b,{events:{"changeValue":a},members:{setValue:function(c){},getValue:function(){},setGroup:function(d){this.assertInstance(d,qx.ui.form.RadioGroup);},getGroup:function(){}}});})();(function(){var b="changeModel",a="qx.ui.form.MModelProperty";qx.Mixin.define(a,{properties:{model:{nullable:true,event:b,dereference:true}}});})();(function(){var b="qx.ui.form.IBooleanForm",a="qx.event.type.Data";qx.Interface.define(b,{events:{"changeValue":a},members:{setValue:function(c){return arguments.length==1;},resetValue:function(){},getValue:function(){}}});})();(function(){var b="qx.ui.form.IModel",a="qx.event.type.Data";qx.Interface.define(b,{events:{"changeModel":a},members:{setModel:function(c){},getModel:function(){},resetModel:function(){}}});})();(function(){var b="qx.event.type.Data",a="qx.ui.form.IForm";qx.Interface.define(a,{events:{"changeEnabled":b,"changeValid":b,"changeInvalidMessage":b,"changeRequired":b},members:{setEnabled:function(c){return arguments.length==1;},getEnabled:function(){},setRequired:function(d){return arguments.length==1;},getRequired:function(){},setValid:function(e){return arguments.length==1;},getValid:function(){},setInvalidMessage:function(f){return arguments.length==1;},getInvalidMessage:function(){},setRequiredInvalidMessage:function(g){return arguments.length==1;},getRequiredInvalidMessage:function(){}}});})();(function(){var b="qx.ui.form.IExecutable",a="qx.event.type.Data";qx.Interface.define(b,{events:{"execute":a},members:{setCommand:function(c){return arguments.length==1;},getCommand:function(){},execute:function(){}}});})();(function(){var n="execute",m="toolTipText",l="icon",k="label",j="qx.ui.core.MExecutable",h="value",g="qx.event.type.Event",f="_applyCommand",d="enabled",c="menu",a="changeCommand",b="qx.ui.core.Command";qx.Mixin.define(j,{events:{"execute":g},properties:{command:{check:b,apply:f,event:a,nullable:true}},members:{__kN:null,__kO:false,__kP:null,_bindableProperties:[d,k,l,m,h,c],execute:function(){var o=this.getCommand();if(o){if(this.__kO){this.__kO=false;}else{this.__kO=true;o.execute(this);}}this.fireEvent(n);},__kQ:function(e){if(this.__kO){this.__kO=false;return;}this.__kO=true;this.execute();},_applyCommand:function(p,q){if(q!=null){q.removeListenerById(this.__kP);}if(p!=null){this.__kP=p.addListener(n,this.__kQ,this);}var t=this.__kN;if(t==null){this.__kN=t={};}for(var i=0;i<this._bindableProperties.length;i++){var s=this._bindableProperties[i];if(q!=null&&t[s]!=null){q.removeBinding(t[s]);t[s]=null;}if(p!=null&&qx.Class.hasProperty(this.constructor,s)){var r=p.get(s);if(r==null){var u=this.get(s);}t[s]=p.bind(s,this,s);if(u){this.set(s,u);}}}}},destruct:function(){this.__kN=null;}});})();(function(){var j="label",i="icon",h="Boolean",g="both",f="String",e="left",d="changeGap",c="changeShow",b="bottom",a="_applyCenter",y="changeIcon",x="qx.ui.basic.Atom",w="changeLabel",v="Integer",u="_applyIconPosition",t="bottom-left",s="top-left",r="top",q="right",p="_applyRich",n="_applyIcon",o="_applyShow",l="_applyLabel",m="_applyGap",k="atom";qx.Class.define(x,{extend:qx.ui.core.Widget,construct:function(z,A){{};qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.Atom());if(z!=null){this.setLabel(z);}if(A!=null){this.setIcon(A);}},properties:{appearance:{refine:true,init:k},label:{apply:l,nullable:true,check:f,event:w},rich:{check:h,init:false,apply:p},icon:{check:f,apply:n,nullable:true,themeable:true,event:y},gap:{check:v,nullable:false,event:d,apply:m,themeable:true,init:4},show:{init:g,check:[g,j,i],themeable:true,inheritable:true,apply:o,event:c},iconPosition:{init:e,check:[r,q,b,e,s,t],themeable:true,apply:u},center:{init:false,check:h,themeable:true,apply:a}},members:{_createChildControlImpl:function(B,C){var D;switch(B){case j:D=new qx.ui.basic.Label(this.getLabel());D.setAnonymous(true);D.setRich(this.getRich());this._add(D);if(this.getLabel()==null||this.getShow()===i){D.exclude();}break;case i:D=new qx.ui.basic.Image(this.getIcon());D.setAnonymous(true);this._addAt(D,0);if(this.getIcon()==null||this.getShow()===j){D.exclude();}break;}return D||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,B);},_forwardStates:{focused:true,hovered:true},_handleLabel:function(){if(this.getLabel()==null||this.getShow()===i){this._excludeChildControl(j);}else{this._showChildControl(j);}},_handleIcon:function(){if(this.getIcon()==null||this.getShow()===j){this._excludeChildControl(i);}else{this._showChildControl(i);}},_applyLabel:function(E,F){var G=this.getChildControl(j,true);if(G){G.setValue(E);}this._handleLabel();},_applyRich:function(H,I){var J=this.getChildControl(j,true);if(J){J.setRich(H);}},_applyIcon:function(K,L){var M=this.getChildControl(i,true);if(M){M.setSource(K);}this._handleIcon();},_applyGap:function(N,O){this._getLayout().setGap(N);},_applyShow:function(P,Q){this._handleLabel();this._handleIcon();},_applyIconPosition:function(R,S){this._getLayout().setIconPosition(R);},_applyCenter:function(T,U){this._getLayout().setCenter(T);}}});})();(function(){var o="pressed",n="abandoned",m="hovered",l="Enter",k="Space",j="dblclick",i="qx.ui.form.Button",h="mouseup",g="mousedown",f="mouseover",b="mouseout",d="keydown",c="button",a="keyup";qx.Class.define(i,{extend:qx.ui.basic.Atom,include:[qx.ui.core.MExecutable],implement:[qx.ui.form.IExecutable],construct:function(p,q,r){qx.ui.basic.Atom.call(this,p,q);if(r!=null){this.setCommand(r);}this.addListener(f,this._onMouseOver);this.addListener(b,this._onMouseOut);this.addListener(g,this._onMouseDown);this.addListener(h,this._onMouseUp);this.addListener(d,this._onKeyDown);this.addListener(a,this._onKeyUp);this.addListener(j,this._onStopEvent);},properties:{appearance:{refine:true,init:c},focusable:{refine:true,init:true}},members:{_forwardStates:{focused:true,hovered:true,pressed:true,disabled:true},press:function(){if(this.hasState(n)){return;}this.addState(o);},release:function(){if(this.hasState(o)){this.removeState(o);}},reset:function(){this.removeState(o);this.removeState(n);this.removeState(m);},_onMouseOver:function(e){if(!this.isEnabled()||e.getTarget()!==this){return;}if(this.hasState(n)){this.removeState(n);this.addState(o);}this.addState(m);},_onMouseOut:function(e){if(!this.isEnabled()||e.getTarget()!==this){return;}this.removeState(m);if(this.hasState(o)){this.removeState(o);this.addState(n);}},_onMouseDown:function(e){if(!e.isLeftPressed()){return;}e.stopPropagation();this.capture();this.removeState(n);this.addState(o);},_onMouseUp:function(e){this.releaseCapture();var s=this.hasState(o);var t=this.hasState(n);if(s){this.removeState(o);}if(t){this.removeState(n);}else{this.addState(m);if(s){this.execute();}}e.stopPropagation();},_onKeyDown:function(e){switch(e.getKeyIdentifier()){case l:case k:this.removeState(n);this.addState(o);e.stopPropagation();}},_onKeyUp:function(e){switch(e.getKeyIdentifier()){case l:case k:if(this.hasState(o)){this.removeState(n);this.removeState(o);this.execute();e.stopPropagation();}}}}});})();(function(){var m="qx.dynlocale",l="Boolean",k="changeLocale",j="changeInvalidMessage",i="on",h="String",g="invalid",f="",d="qx.ui.form.MForm",c="_applyValid",a="changeRequired",b="changeValid";qx.Mixin.define(d,{construct:function(){if(qx.core.Variant.isSet(m,i)){qx.locale.Manager.getInstance().addListener(k,this.__fn,this);}},properties:{valid:{check:l,init:true,apply:c,event:b},required:{check:l,init:false,event:a},invalidMessage:{check:h,init:f,event:j},requiredInvalidMessage:{check:h,nullable:true,event:j}},members:{_applyValid:function(n,o){n?this.removeState(g):this.addState(g);},__fn:qx.core.Variant.select(m,{"on":function(e){var p=this.getInvalidMessage();if(p&&p.translate){this.setInvalidMessage(p.translate());}var q=this.getRequiredInvalidMessage();if(q&&q.translate){this.setRequiredInvalidMessage(q.translate());}},"off":null})},destruct:function(){if(qx.core.Variant.isSet(m,i)){qx.locale.Manager.getInstance().removeListener(k,this.__fn,this);}}});})();(function(){var o="checked",n="keypress",m="Boolean",l="Right",k="_applyValue",j="changeValue",i="qx.ui.form.RadioButton",h="radiobutton",g="Left",f="qx.ui.form.RadioGroup",b="Down",d="_applyGroup",c="Up",a="execute";qx.Class.define(i,{extend:qx.ui.form.Button,include:[qx.ui.form.MForm,qx.ui.form.MModelProperty],implement:[qx.ui.form.IRadioItem,qx.ui.form.IForm,qx.ui.form.IBooleanForm,qx.ui.form.IModel],construct:function(p){{};qx.ui.form.Button.call(this,p);this.addListener(a,this._onExecute);this.addListener(n,this._onKeyPress);},properties:{group:{check:f,nullable:true,apply:d},value:{check:m,nullable:true,event:j,apply:k,init:false},appearance:{refine:true,init:h},allowGrowX:{refine:true,init:false}},members:{_applyValue:function(q,r){q?this.addState(o):this.removeState(o);if(q&&this.getFocusable()){this.focus();}},_applyGroup:function(s,t){if(t){t.remove(this);}if(s){s.add(this);}},_onExecute:function(e){this.setValue(true);},_onKeyPress:function(e){var u=this.getGroup();if(!u){return;}switch(e.getKeyIdentifier()){case g:case c:u.selectPrevious();break;case l:case b:u.selectNext();break;}}}});})();(function(){var o="close-button",n="middle",m="left",l="icon",k="label",j="right",i="click",h="Boolean",g="bottom",f="qx.ui.tabview.TabButton",c="center",e="_applyShowCloseButton",d="top",b="close",a="qx.event.type.Data";qx.Class.define(f,{extend:qx.ui.form.RadioButton,implement:qx.ui.form.IRadioItem,construct:function(){qx.ui.form.RadioButton.call(this);var p=new qx.ui.layout.Grid(2,0);p.setRowAlign(0,m,n);p.setColumnAlign(0,j,n);this._getLayout().dispose();this._setLayout(p);this.initShowCloseButton();},events:{"close":a},properties:{showCloseButton:{check:h,init:false,apply:e}},members:{_forwardStates:{focused:true,checked:true},_applyIconPosition:function(q,r){var s={icon:this.getChildControl(l),label:this.getChildControl(k),closeButton:this.getShowCloseButton()?this.getChildControl(o):null};for(var t in s){if(s[t]){this._remove(s[t]);}}switch(q){case d:this._add(s.label,{row:3,column:2});this._add(s.icon,{row:1,column:2});if(s.closeButton){this._add(s.closeButton,{row:0,column:4});}break;case g:this._add(s.label,{row:1,column:2});this._add(s.icon,{row:3,column:2});if(s.closeButton){this._add(s.closeButton,{row:0,column:4});}break;case m:this._add(s.label,{row:0,column:2});this._add(s.icon,{row:0,column:0});if(s.closeButton){this._add(s.closeButton,{row:0,column:4});}break;case j:this._add(s.label,{row:0,column:0});this._add(s.icon,{row:0,column:2});if(s.closeButton){this._add(s.closeButton,{row:0,column:4});}break;}},_createChildControlImpl:function(u,v){var w;switch(u){case k:var w=new qx.ui.basic.Label(this.getLabel());w.setAnonymous(true);this._add(w,{row:0,column:2});this._getLayout().setColumnFlex(2,1);break;case l:w=new qx.ui.basic.Image(this.getIcon());w.setAnonymous(true);this._add(w,{row:0,column:0});break;case o:w=new qx.ui.form.Button();w.addListener(i,this._onCloseButtonClick,this);this._add(w,{row:0,column:4});if(!this.getShowCloseButton()){w.exclude();}break;}return w||qx.ui.form.RadioButton.prototype._createChildControlImpl.call(this,u);},_onCloseButtonClick:function(){this.fireDataEvent(b,this);},_applyShowCloseButton:function(x,y){if(x){this._showChildControl(o);}else{this._excludeChildControl(o);}},_applyCenter:function(z){var A=this._getLayout();if(z){A.setColumnAlign(2,c,n);}else{A.setColumnAlign(2,m,n);}}}});})();(function(){var e="change",d="__mp",c="qx.event.type.Data",b="qx.ui.form.MModelSelection",a="changeSelection";qx.Mixin.define(b,{construct:function(){this.__mp=new qx.data.Array();this.__mp.addListener(e,this.__ms,this);this.addListener(a,this.__mr,this);},events:{changeModelSelection:c},members:{__mp:null,__mq:false,__mr:function(){if(this.__mq){return;}var h=this.getSelection();var f=[];for(var i=0;i<h.length;i++){var k=h[i];var g=k.getModel?k.getModel():null;if(g!==null){f.push(g);}}if(f.length===h.length){this.setModelSelection(f);}},__ms:function(){this.__mq=true;var m=this.getSelectables(true);var o=[];var n=this.__mp.toArray();for(var i=0;i<n.length;i++){var q=n[i];for(var j=0;j<m.length;j++){var r=m[j];var l=r.getModel?r.getModel():null;if(q===l){o.push(r);break;}}}this.setSelection(o);this.__mq=false;var p=this.getSelection();if(!qx.lang.Array.equals(p,o)){this.__mr();}},getModelSelection:function(){return this.__mp;},setModelSelection:function(s){if(!s){this.__mp.removeAll();return;}{};s.unshift(this.__mp.getLength());s.unshift(0);var t=this.__mp.splice.apply(this.__mp,s);t.dispose();}},destruct:function(){this._disposeObjects(d);}});})();(function(){var a="qx.ui.form.IModelSelection";qx.Interface.define(a,{members:{setModelSelection:function(b){},getModelSelection:function(){}}});})();(function(){var b="qx.ui.core.ISingleSelection",a="qx.event.type.Data";qx.Interface.define(b,{events:{"changeSelection":a},members:{getSelection:function(){return true;},setSelection:function(c){return arguments.length==1;},resetSelection:function(){return true;},isSelected:function(d){return arguments.length==1;},isSelectionEmpty:function(){return true;},getSelectables:function(e){return arguments.length==1;}}});})();(function(){var f="qx.ui.core.MSingleSelectionHandling",d="__my",c="changeSelection",b="changeSelected",a="qx.event.type.Data";qx.Mixin.define(f,{events:{"changeSelection":a},members:{__my:null,getSelection:function(){var g=this.__mz().getSelected();if(g){return [g];}else{return [];}},setSelection:function(h){switch(h.length){case 0:this.resetSelection();break;case 1:this.__mz().setSelected(h[0]);break;default:throw new Error("Could only select one item, but the selection "+" array contains "+h.length+" items!");}},resetSelection:function(){this.__mz().resetSelected();},isSelected:function(i){return this.__mz().isSelected(i);},isSelectionEmpty:function(){return this.__mz().isSelectionEmpty();},getSelectables:function(j){return this.__mz().getSelectables(j);},_onChangeSelected:function(e){var l=e.getData();var k=e.getOldData();l==null?l=[]:l=[l];k==null?k=[]:k=[k];this.fireDataEvent(c,l,k);},__mz:function(){if(this.__my==null){var m=this;this.__my=new qx.ui.core.SingleSelectionManager({getItems:function(){return m._getItems();},isItemSelectable:function(n){if(m._isItemSelectable){return m._isItemSelectable(n);}else{return n.isVisible();}}});this.__my.addListener(b,this._onChangeSelected,this);}this.__my.setAllowEmptySelection(this._isAllowEmptySelection());return this.__my;}},destruct:function(){this._disposeObjects(d);}});})();(function(){var r="Boolean",q="changeInvalidMessage",p="changeValue",o="String",n="_applyAllowEmptySelection",m="_applyInvalidMessage",k="qx.ui.form.RadioGroup",j="_applyValid",h="",g="changeRequired",c="changeValid",f="changeEnabled",d="__a",b="changeSelection",a="_applyEnabled";qx.Class.define(k,{extend:qx.core.Object,implement:[qx.ui.core.ISingleSelection,qx.ui.form.IForm,qx.ui.form.IModelSelection],include:[qx.ui.core.MSingleSelectionHandling,qx.ui.form.MModelSelection],construct:function(s){qx.core.Object.call(this);this.__a=[];this.addListener(b,this.__b,this);if(s!=null){this.add.apply(this,arguments);}},properties:{enabled:{check:r,apply:a,event:f,init:true},wrap:{check:r,init:true},allowEmptySelection:{check:r,init:false,apply:n},valid:{check:r,init:true,apply:j,event:c},required:{check:r,init:false,event:g},invalidMessage:{check:o,init:h,event:q,apply:m},requiredInvalidMessage:{check:o,nullable:true,event:q}},members:{__a:null,getItems:function(){return this.__a;},add:function(t){var u=this.__a;var v;for(var i=0,l=arguments.length;i<l;i++){v=arguments[i];if(qx.lang.Array.contains(u,v)){continue;}v.addListener(p,this._onItemChangeChecked,this);u.push(v);v.setGroup(this);if(v.getValue()){this.setSelection([v]);}}if(!this.isAllowEmptySelection()&&u.length>0&&!this.getSelection()[0]){this.setSelection([u[0]]);}},remove:function(w){var x=this.__a;if(qx.lang.Array.contains(x,w)){qx.lang.Array.remove(x,w);if(w.getGroup()===this){w.resetGroup();}w.removeListener(p,this._onItemChangeChecked,this);if(w.getValue()){this.resetSelection();}}},getChildren:function(){return this.__a;},_onItemChangeChecked:function(e){var y=e.getTarget();if(y.getValue()){this.setSelection([y]);}else if(this.getSelection()[0]==y){this.resetSelection();}},_applyInvalidMessage:function(z,A){for(var i=0;i<this.__a.length;i++){this.__a[i].setInvalidMessage(z);}},_applyValid:function(B,C){for(var i=0;i<this.__a.length;i++){this.__a[i].setValid(B);}},_applyEnabled:function(D,E){var F=this.__a;if(D==null){for(var i=0,l=F.length;i<l;i++){F[i].resetEnabled();}}else{for(var i=0,l=F.length;i<l;i++){F[i].setEnabled(D);}}},_applyAllowEmptySelection:function(G,H){if(!G&&this.isSelectionEmpty()){this.resetSelection();}},selectNext:function(){var I=this.getSelection()[0];var K=this.__a;var J=K.indexOf(I);if(J==-1){return;}var i=0;var length=K.length;if(this.getWrap()){J=(J+1)%length;}else{J=Math.min(J+1,length-1);}while(i<length&&!K[J].getEnabled()){J=(J+1)%length;i++;}this.setSelection([K[J]]);},selectPrevious:function(){var L=this.getSelection()[0];var N=this.__a;var M=N.indexOf(L);if(M==-1){return;}var i=0;var length=N.length;if(this.getWrap()){M=(M-1+length)%length;}else{M=Math.max(M-1,0);}while(i<length&&!N[M].getEnabled()){M=(M-1+length)%length;i++;}this.setSelection([N[M]]);},_getItems:function(){return this.getItems();},_isAllowEmptySelection:function(){return this.isAllowEmptySelection();},__b:function(e){var P=e.getData()[0];var O=e.getOldData()[0];if(O){O.setValue(false);}if(P){P.setValue(true);}}},destruct:function(){this._disposeArray(d);}});})();(function(){var h="[",g="]",f=".",d="idBubble",c="changeBubble",b="qx.data.marshal.MEventBubbling",a="qx.event.type.Data";qx.Mixin.define(b,{events:{"changeBubble":a},members:{_applyEventPropagation:function(i,j,name){this.fireDataEvent(c,{value:i,name:name,old:j});this._registerEventChaining(i,j,name);},_registerEventChaining:function(k,l,name){if((k instanceof qx.core.Object)&&qx.Class.hasMixin(k.constructor,qx.data.marshal.MEventBubbling)){var m=qx.lang.Function.bind(this.__mA,this,name);var n=k.addListener(c,m,this);k.setUserData(d,n);}if(l!=null&&l.getUserData&&l.getUserData(d)!=null){l.removeListenerById(l.getUserData(d));}},__mA:function(name,e){var v=e.getData();var r=v.value;var p=v.old;if(qx.Class.hasInterface(e.getTarget().constructor,qx.data.IListData)){if(v.name.indexOf){var u=v.name.indexOf(f)!=-1?v.name.indexOf(f):v.name.length;var s=v.name.indexOf(h)!=-1?v.name.indexOf(h):v.name.length;if(u<s){var o=v.name.substring(0,u);var t=v.name.substring(u+1,v.name.length);if(t[0]!=h){t=f+t;}var q=name+h+o+g+t;}else if(s<u){var o=v.name.substring(0,s);var t=v.name.substring(s,v.name.length);var q=name+h+o+g+t;}else{var q=name+h+v.name+g;}}else{var q=name+h+v.name+g;}}else{var q=name+f+v.name;}this.fireDataEvent(c,{value:r,name:q,old:p});}}});})();(function(){var l="change",k="add",j="remove",h="order",g="qx.event.type.Data",f="",e="qx.data.Array",d="?",c="changeBubble",b="number",a="changeLength";qx.Class.define(e,{extend:qx.core.Object,include:qx.data.marshal.MEventBubbling,implement:[qx.data.IListData],construct:function(m){qx.core.Object.call(this);if(m==undefined){this.__mm=[];}else if(arguments.length>1){this.__mm=[];for(var i=0;i<arguments.length;i++){this.__mm.push(arguments[i]);}}else if(typeof m==b){this.__mm=new Array(m);}else if(m instanceof Array){this.__mm=qx.lang.Array.clone(m);}else{this.__mm=[];throw new Error("Type of the parameter not supported!");}for(var i=0;i<this.__mm.length;i++){this._applyEventPropagation(this.__mm[i],null,i);}this.__mn();},events:{"change":g,"changeLength":g},members:{__mm:null,concat:function(n){if(n){var o=this.__mm.concat(n);}else{var o=this.__mm.concat();}return new qx.data.Array(o);},join:function(p){return this.__mm.join(p);},pop:function(){var q=this.__mm.pop();this.__mn();this._applyEventPropagation(null,q,this.length-1);this.fireDataEvent(l,{start:this.length-1,end:this.length-1,type:j,items:[q]},null);return q;},push:function(r){for(var i=0;i<arguments.length;i++){this.__mm.push(arguments[i]);this.__mn();this._applyEventPropagation(arguments[i],null,this.length-1);this.fireDataEvent(l,{start:this.length-1,end:this.length-1,type:k,items:[arguments[i]]},null);}return this.length;},reverse:function(){this.__mm.reverse();this.fireDataEvent(l,{start:0,end:this.length-1,type:h,items:null},null);},shift:function(){var s=this.__mm.shift();this.__mn();this._applyEventPropagation(null,s,this.length-1);this.fireDataEvent(l,{start:0,end:this.length-1,type:j,items:[s]},null);return s;},slice:function(t,u){return new qx.data.Array(this.__mm.slice(t,u));},splice:function(v,w,x){var D=this.__mm.length;var A=this.__mm.splice.apply(this.__mm,arguments);if(this.__mm.length!=D){this.__mn();}var B=w>0;var y=arguments.length>2;var z=null;if(B||y){if(this.__mm.length>D){var C=k;}else if(this.__mm.length<D){var C=j;z=A;}else{var C=h;}this.fireDataEvent(l,{start:v,end:this.length-1,type:C,items:z},null);}for(var i=2;i<arguments.length;i++){this._registerEventChaining(arguments[i],null,v+i);}this.fireDataEvent(c,{value:this,name:d,old:A});for(var i=0;i<A.length;i++){this._applyEventPropagation(null,A[i],i);}return (new qx.data.Array(A));},sort:function(E){this.__mm.sort.apply(this.__mm,arguments);this.fireDataEvent(l,{start:0,end:this.length-1,type:h,items:null},null);},unshift:function(F){for(var i=arguments.length-1;i>=0;i--){this.__mm.unshift(arguments[i]);this.__mn();this._applyEventPropagation(arguments[i],null,0);this.fireDataEvent(l,{start:0,end:this.length-1,type:k,items:[arguments[i]]},null);}return this.length;},toArray:function(){return this.__mm;},getItem:function(G){return this.__mm[G];},setItem:function(H,I){var J=this.__mm[H];if(J===I){return;}this.__mm[H]=I;this._applyEventPropagation(I,J,H);if(this.length!=this.__mm.length){this.__mn();}this.fireDataEvent(l,{start:H,end:H,type:k,items:[I]},null);},getLength:function(){return this.length;},indexOf:function(K){return this.__mm.indexOf(K);},toString:function(){if(this.__mm!=null){return this.__mm.toString();}return f;},contains:function(L){return this.__mm.indexOf(L)!==-1;},copy:function(){return this.concat();},insertAt:function(M,N){this.splice(M,0,N);},insertBefore:function(O,P){var Q=this.indexOf(O);if(Q==-1){this.push(P);}else{this.splice(Q,0,P);}},insertAfter:function(R,S){var T=this.indexOf(R);if(T==-1||T==(this.length-1)){this.push(S);}else{this.splice(T+1,0,S);}},removeAt:function(U){return this.splice(U,1).getItem(0);},removeAll:function(){for(var i=0;i<this.__mm.length;i++){this._applyEventPropagation(null,this.__mm[i],i);}var W=this.getLength();var V=this.__mm.concat();this.__mm.length=0;this.__mn();this.fireDataEvent(l,{start:0,end:W-1,type:j,items:V},null);},append:function(X){if(X instanceof qx.data.Array){X=X.toArray();}{};for(var i=0;i<X.length;i++){this._applyEventPropagation(X[i],null,this.__mm.length+i);}Array.prototype.push.apply(this.__mm,X);var Y=this.length;this.__mn();this.fireDataEvent(l,{start:Y,end:this.length-1,type:k,items:X},null);},remove:function(ba){var bb=this.indexOf(ba);if(bb!=-1){this.splice(bb,1);return ba;}},equals:function(bc){if(this.length!==bc.length){return false;}for(var i=0;i<this.length;i++){if(this.getItem(i)!==bc.getItem(i)){return false;}}return true;},sum:function(){var bd=0;for(var i=0;i<this.length;i++){bd+=this.getItem(i);}return bd;},max:function(){var be=this.getItem(0);for(var i=1;i<this.length;i++){if(this.getItem(i)>be){be=this.getItem(i);}}return be===undefined?null:be;},min:function(){var bf=this.getItem(0);for(var i=1;i<this.length;i++){if(this.getItem(i)<bf){bf=this.getItem(i);}}return bf===undefined?null:bf;},forEach:function(bg,bh){for(var i=0;i<this.__mm.length;i++){bg.call(bh,this.__mm[i]);}},__mn:function(){var bi=this.length;this.length=this.__mm.length;this.fireDataEvent(a,this.length,bi);}},destruct:function(){for(var i=0;i<this.__mm.length;i++){this._applyEventPropagation(null,this.__mm[i],i);}this.__mm=null;}});})();(function(){var g="Boolean",f="qx.ui.core.SingleSelectionManager",e="__mv",d="__mt",c="__mu",b="changeSelected",a="qx.event.type.Data";qx.Class.define(f,{extend:qx.core.Object,construct:function(h){qx.core.Object.call(this);{};this.__mt=h;},events:{"changeSelected":a},properties:{allowEmptySelection:{check:g,init:true,apply:e}},members:{__mu:null,__mt:null,getSelected:function(){return this.__mu;},setSelected:function(j){if(!this.__mx(j)){throw new Error("Could not select "+j+", because it is not a child element!");}this.__mw(j);},resetSelected:function(){this.__mw(null);},isSelected:function(k){if(!this.__mx(k)){throw new Error("Could not check if "+k+" is selected,"+" because it is not a child element!");}return this.__mu===k;},isSelectionEmpty:function(){return this.__mu==null;},getSelectables:function(l){var m=this.__mt.getItems();var n=[];for(var i=0;i<m.length;i++){if(this.__mt.isItemSelectable(m[i])){n.push(m[i]);}}if(!l){for(var i=n.length-1;i>=0;i--){if(!n[i].getEnabled()){n.splice(i,1);}}}return n;},__mv:function(o,p){if(!o){this.__mw(this.__mu);}},__mw:function(q){var t=this.__mu;var s=q;if(s!=null&&t===s){return;}if(!this.isAllowEmptySelection()&&s==null){var r=this.getSelectables(true)[0];if(r){s=r;}}this.__mu=s;this.fireDataEvent(b,s,t);},__mx:function(u){var v=this.__mt.getItems();for(var i=0;i<v.length;i++){if(v[i]===u){return true;}}return false;}},destruct:function(){if(this.__mt.toHashCode){this._disposeObjects(d);}else{this.__mt=null;}this._disposeObjects(c);}});})();(function(){var b="abstract",a="qx.ui.layout.Abstract";qx.Class.define(a,{type:b,extend:qx.core.Object,members:{__gz:null,_invalidChildrenCache:null,__gA:null,invalidateLayoutCache:function(){this.__gz=null;},renderLayout:function(c,d){this.warn("Missing renderLayout() implementation!");},getSizeHint:function(){if(this.__gz){return this.__gz;}return this.__gz=this._computeSizeHint();},hasHeightForWidth:function(){return false;},getHeightForWidth:function(e){this.warn("Missing getHeightForWidth() implementation!");return null;},_computeSizeHint:function(){return null;},invalidateChildrenCache:function(){this._invalidChildrenCache=true;},verifyLayoutProperty:null,_clearSeparators:function(){var f=this.__gA;if(f instanceof qx.ui.core.LayoutItem){f.clearSeparators();}},_renderSeparator:function(g,h){this.__gA.renderSeparator(g,h);},connectToWidget:function(i){if(i&&this.__gA){throw new Error("It is not possible to manually set the connected widget.");}this.__gA=i;this.invalidateChildrenCache();},_getWidget:function(){return this.__gA;},_applyLayoutChange:function(){if(this.__gA){this.__gA.scheduleLayoutUpdate();}},_getLayoutChildren:function(){return this.__gA.getLayoutChildren();}},destruct:function(){this.__gA=this.__gz=null;}});})();(function(){var m="bottom",l="top",k="_applyLayoutChange",j="top-left",h="bottom-left",g="left",f="right",e="middle",d="center",c="qx.ui.layout.Atom",a="Integer",b="Boolean";qx.Class.define(c,{extend:qx.ui.layout.Abstract,properties:{gap:{check:a,init:4,apply:k},iconPosition:{check:[g,l,f,m,j,h],init:g,apply:k},center:{check:b,init:false,apply:k}},members:{verifyLayoutProperty:null,renderLayout:function(n,o){var x=qx.ui.layout.Util;var q=this.getIconPosition();var t=this._getLayoutChildren();var length=t.length;var I,top,y,r;var D,w;var B=this.getGap();var G=this.getCenter();if(q===m||q===f){var z=length-1;var u=-1;var s=-1;}else{var z=0;var u=length;var s=1;}if(q==l||q==m){if(G){var C=0;for(var i=z;i!=u;i+=s){r=t[i].getSizeHint().height;if(r>0){C+=r;if(i!=z){C+=B;}}}top=Math.round((o-C)/2);}else{top=0;}for(var i=z;i!=u;i+=s){D=t[i];w=D.getSizeHint();y=Math.min(w.maxWidth,Math.max(n,w.minWidth));r=w.height;I=x.computeHorizontalAlignOffset(d,y,n);D.renderLayout(I,top,y,r);if(r>0){top+=r+B;}}}else{var v=n;var p=null;var F=0;for(var i=z;i!=u;i+=s){D=t[i];y=D.getSizeHint().width;if(y>0){if(!p&&D instanceof qx.ui.basic.Label){p=D;}else{v-=y;}F++;}}if(F>1){var E=(F-1)*B;v-=E;}if(p){var w=p.getSizeHint();var A=Math.max(w.minWidth,Math.min(v,w.maxWidth));v-=A;}if(G&&v>0){I=Math.round(v/2);}else{I=0;}for(var i=z;i!=u;i+=s){D=t[i];w=D.getSizeHint();r=Math.min(w.maxHeight,Math.max(o,w.minHeight));if(D===p){y=A;}else{y=w.width;}var H=e;if(q==j){H=l;}else if(q==h){H=m;}top=x.computeVerticalAlignOffset(H,w.height,o);D.renderLayout(I,top,y,r);if(y>0){I+=y+B;}}}},_computeSizeHint:function(){var T=this._getLayoutChildren();var length=T.length;var L,R;if(length===1){var L=T[0].getSizeHint();R={width:L.width,height:L.height,minWidth:L.minWidth,minHeight:L.minHeight};}else{var P=0,Q=0;var M=0,O=0;var N=this.getIconPosition();var S=this.getGap();if(N===l||N===m){var J=0;for(var i=0;i<length;i++){L=T[i].getSizeHint();Q=Math.max(Q,L.width);P=Math.max(P,L.minWidth);if(L.height>0){O+=L.height;M+=L.minHeight;J++;}}if(J>1){var K=(J-1)*S;O+=K;M+=K;}}else{var J=0;for(var i=0;i<length;i++){L=T[i].getSizeHint();O=Math.max(O,L.height);M=Math.max(M,L.minHeight);if(L.width>0){Q+=L.width;P+=L.minWidth;J++;}}if(J>1){var K=(J-1)*S;Q+=K;P+=K;}}R={minWidth:P,width:Q,minHeight:M,height:O};}return R;}}});})();(function(){var g="middle",f="qx.ui.layout.Util",e="left",d="center",c="top",b="bottom",a="right";qx.Class.define(f,{statics:{PERCENT_VALUE:/[0-9]+(?:\.[0-9]+)?%/,computeFlexOffsets:function(h,j,k){var n,r,m,s;var o=j>k;var t=Math.abs(j-k);var u,p;var q={};for(r in h){n=h[r];q[r]={potential:o?n.max-n.value:n.value-n.min,flex:o?n.flex:1/n.flex,offset:0};}while(t!=0){s=Infinity;m=0;for(r in q){n=q[r];if(n.potential>0){m+=n.flex;s=Math.min(s,n.potential/n.flex);}}if(m==0){break;}s=Math.min(t,s*m)/m;u=0;for(r in q){n=q[r];if(n.potential>0){p=Math.min(t,n.potential,Math.ceil(s*n.flex));u+=p-s*n.flex;if(u>=1){u-=1;p-=1;}n.potential-=p;if(o){n.offset+=p;}else{n.offset-=p;}t-=p;}}}return q;},computeHorizontalAlignOffset:function(v,w,x,y,z){if(y==null){y=0;}if(z==null){z=0;}var A=0;switch(v){case e:A=y;break;case a:A=x-w-z;break;case d:A=Math.round((x-w)/2);if(A<y){A=y;}else if(A<z){A=Math.max(y,x-w-z);}break;}return A;},computeVerticalAlignOffset:function(B,C,D,E,F){if(E==null){E=0;}if(F==null){F=0;}var G=0;switch(B){case c:G=E;break;case b:G=D-C-F;break;case g:G=Math.round((D-C)/2);if(G<E){G=E;}else if(G<F){G=Math.max(E,D-C-F);}break;}return G;},collapseMargins:function(H){var I=0,K=0;for(var i=0,l=arguments.length;i<l;i++){var J=arguments[i];if(J<0){K=Math.min(K,J);}else if(J>0){I=Math.max(I,J);}}return I+K;},computeHorizontalGaps:function(L,M,N){if(M==null){M=0;}var O=0;if(N){O+=L[0].getMarginLeft();for(var i=1,l=L.length;i<l;i+=1){O+=this.collapseMargins(M,L[i-1].getMarginRight(),L[i].getMarginLeft());}O+=L[l-1].getMarginRight();}else{for(var i=1,l=L.length;i<l;i+=1){O+=L[i].getMarginLeft()+L[i].getMarginRight();}O+=(M*(l-1));}return O;},computeVerticalGaps:function(P,Q,R){if(Q==null){Q=0;}var S=0;if(R){S+=P[0].getMarginTop();for(var i=1,l=P.length;i<l;i+=1){S+=this.collapseMargins(Q,P[i-1].getMarginBottom(),P[i].getMarginTop());}S+=P[l-1].getMarginBottom();}else{for(var i=1,l=P.length;i<l;i+=1){S+=P[i].getMarginTop()+P[i].getMarginBottom();}S+=(Q*(l-1));}return S;},computeHorizontalSeparatorGaps:function(T,U,V){var Y=qx.theme.manager.Decoration.getInstance().resolve(V);var X=Y.getInsets();var W=X.left+X.right;var ba=0;for(var i=0,l=T.length;i<l;i++){var bb=T[i];ba+=bb.getMarginLeft()+bb.getMarginRight();}ba+=(U+W+U)*(l-1);return ba;},computeVerticalSeparatorGaps:function(bc,bd,be){var bh=qx.theme.manager.Decoration.getInstance().resolve(be);var bg=bh.getInsets();var bf=bg.top+bg.bottom;var bi=0;for(var i=0,l=bc.length;i<l;i++){var bj=bc[i];bi+=bj.getMarginTop()+bj.getMarginBottom();}bi+=(bd+bf+bd)*(l-1);return bi;},arrangeIdeals:function(bk,bl,bm,bn,bo,bp){if(bl<bk||bo<bn){if(bl<bk&&bo<bn){bl=bk;bo=bn;}else if(bl<bk){bo-=(bk-bl);bl=bk;if(bo<bn){bo=bn;}}else if(bo<bn){bl-=(bn-bo);bo=bn;if(bl<bk){bl=bk;}}}if(bl>bm||bo>bp){if(bl>bm&&bo>bp){bl=bm;bo=bp;}else if(bl>bm){bo+=(bl-bm);bl=bm;if(bo>bp){bo=bp;}}else if(bo>bp){bl+=(bo-bp);bo=bp;if(bl>bm){bl=bm;}}}return {begin:bl,end:bo};}}});})();(function(){var b="qx.event.type.Data",a="qx.ui.form.IStringForm";qx.Interface.define(a,{events:{"changeValue":b},members:{setValue:function(c){return arguments.length==1;},resetValue:function(){},getValue:function(){}}});})();(function(){var k="qx.dynlocale",j="Boolean",i="color",h="changeLocale",g="enabled",f="on",d="_applyTextAlign",c="qx.ui.core.Widget",b="nowrap",a="changeTextAlign",C="_applyWrap",B="A",A="changeContent",z="qx.ui.basic.Label",y="whiteSpace",x="_applyValue",w="center",v="_applyBuddy",u="String",t="textAlign",r="right",s="changeRich",p="normal",q="_applyRich",n="click",o="label",l="left",m="changeValue";qx.Class.define(z,{extend:qx.ui.core.Widget,implement:[qx.ui.form.IStringForm],construct:function(D){qx.ui.core.Widget.call(this);if(D!=null){this.setValue(D);}if(qx.core.Variant.isSet(k,f)){qx.locale.Manager.getInstance().addListener(h,this._onChangeLocale,this);}},properties:{rich:{check:j,init:false,event:s,apply:q},wrap:{check:j,init:true,apply:C},value:{check:u,apply:x,event:m,nullable:true},buddy:{check:c,apply:v,nullable:true,init:null,dereference:true},textAlign:{check:[l,w,r],nullable:true,themeable:true,apply:d,event:a},appearance:{refine:true,init:o},selectable:{refine:true,init:false},allowGrowX:{refine:true,init:false},allowGrowY:{refine:true,init:false},allowShrinkY:{refine:true,init:false}},members:{__gI:null,__gJ:null,__gK:null,__gL:null,_getContentHint:function(){if(this.__gJ){this.__gM=this.__gN();delete this.__gJ;}return {width:this.__gM.width,height:this.__gM.height};},_hasHeightForWidth:function(){return this.getRich()&&this.getWrap();},_applySelectable:function(E){if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){if(E&&!this.isRich()){{};return;}}qx.ui.core.Widget.prototype._applySelectable.call(this,E);},_getContentHeightForWidth:function(F){if(!this.getRich()&&!this.getWrap()){return null;}return this.__gN(F).height;},_createContentElement:function(){return new qx.html.Label;},_applyTextAlign:function(G,H){this.getContentElement().setStyle(t,G);},_applyTextColor:function(I,J){if(I){this.getContentElement().setStyle(i,qx.theme.manager.Color.getInstance().resolve(I));}else{this.getContentElement().removeStyle(i);}},__gM:{width:0,height:0},_applyFont:function(K,L){var M;if(K){this.__gI=qx.theme.manager.Font.getInstance().resolve(K);M=this.__gI.getStyles();}else{this.__gI=null;M=qx.bom.Font.getDefaultStyles();}this.getContentElement().setStyles(M);this.__gJ=true;qx.ui.core.queue.Layout.add(this);},__gN:function(N){var R=qx.bom.Label;var P=this.getFont();var O=P?this.__gI.getStyles():qx.bom.Font.getDefaultStyles();var content=this.getValue()||B;var Q=this.getRich();return Q?R.getHtmlSize(content,O,N):R.getTextSize(content,O);},_applyBuddy:function(S,T){if(T!=null){T.removeBinding(this.__gK);this.__gK=null;this.removeListenerById(this.__gL);this.__gL=null;}if(S!=null){this.__gK=S.bind(g,this,g);this.__gL=this.addListener(n,function(){if(S.isFocusable()){S.focus.apply(S);}},this);}},_applyRich:function(U){this.getContentElement().setRich(U);this.__gJ=true;qx.ui.core.queue.Layout.add(this);},_applyWrap:function(V,W){if(V&&!this.isRich()){{};}if(this.isRich()){var X=V?p:b;this.getContentElement().setStyle(y,X);}},_onChangeLocale:qx.core.Variant.select(k,{"on":function(e){var content=this.getValue();if(content&&content.translate){this.setValue(content.translate());}},"off":null}),_applyValue:function(Y,ba){this.getContentElement().setValue(Y);this.__gJ=true;qx.ui.core.queue.Layout.add(this);this.fireDataEvent(A,Y,ba);}},destruct:function(){if(qx.core.Variant.isSet(k,f)){qx.locale.Manager.getInstance().removeListener(h,this._onChangeLocale,this);}if(this.__gK!=null){var bb=this.getBuddy();if(bb!=null&&!bb.isDisposed()){bb.removeBinding(this.__gK);}}this.__gI=this.__gK=null;}});})();(function(){var b="value",a="qx.html.Label";qx.Class.define(a,{extend:qx.html.Element,members:{__dP:null,_applyProperty:function(name,c){qx.html.Element.prototype._applyProperty.call(this,name,c);if(name==b){var d=this.getDomElement();qx.bom.Label.setValue(d,c);}},_createDomElement:function(){var f=this.__dP;var e=qx.bom.Label.create(this._content,f);return e;},_copyData:function(g){return qx.html.Element.prototype._copyData.call(this,true);},setRich:function(h){var i=this.getDomElement();if(i){throw new Error("The label mode cannot be modified after initial creation");}h=!!h;if(this.__dP==h){return;}this.__dP=h;return this;},setValue:function(j){this._setProperty(b,j);return this;},getValue:function(){return this._getProperty(b);}}});})();(function(){var j="div",i="inherit",h="text",g="qx.client",f="value",e="",d="hidden",c="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",b="nowrap",a="auto",z="0",y="ellipsis",x="normal",w="label",v="px",u="crop",t="gecko",s="end",r="100%",q="visible",o="qx.bom.Label",p="opera",m="mshtml",n="block",k="-1000px",l="absolute";qx.Class.define(o,{statics:{__jn:{fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},__jo:function(){var A=this.__jq(false);document.body.insertBefore(A,document.body.firstChild);return this._textElement=A;},__jp:function(){var B=this.__jq(true);document.body.insertBefore(B,document.body.firstChild);return this._htmlElement=B;},__jq:function(C){var D=qx.bom.Element.create(j);var E=D.style;E.width=E.height=a;E.left=E.top=k;E.visibility=d;E.position=l;E.overflow=q;if(C){E.whiteSpace=x;}else{E.whiteSpace=b;if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){var F=document.createElementNS(c,w);var E=F.style;E.padding=z;for(var G in this.__jn){E[G]=i;}D.appendChild(F);}}return D;},__jr:function(H){var I={};if(H){I.whiteSpace=x;}else if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){I.display=n;}else{I.overflow=d;I.whiteSpace=b;I.textOverflow=y;if(qx.core.Variant.isSet(g,p)){I.OTextOverflow=y;}}return I;},create:function(content,J,K){if(!K){K=window;}if(J){var L=K.document.createElement(j);L.useHtml=true;}else if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){var L=K.document.createElement(j);var N=K.document.createElementNS(c,w);var M=N.style;M.cursor=i;M.color=i;M.overflow=d;M.maxWidth=r;M.padding=z;for(var O in this.__jn){N.style[O]=i;}N.setAttribute(u,s);L.appendChild(N);}else{var L=K.document.createElement(j);qx.bom.element.Style.setStyles(L,this.__jr(J));}if(content){this.setValue(L,content);}return L;},setValue:function(P,Q){Q=Q||e;if(P.useHtml){P.innerHTML=Q;}else if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){P.firstChild.setAttribute(f,Q);}else{qx.bom.element.Attribute.set(P,h,Q);}},getValue:function(R){if(R.useHtml){return R.innerHTML;}else if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){return R.firstChild.getAttribute(f)||e;}else{return qx.bom.element.Attribute.get(R,h);}},getHtmlSize:function(content,S,T){var U=this._htmlElement||this.__jp();U.style.width=T!==undefined?T+v:a;U.innerHTML=content;return this.__js(U,S);},getTextSize:function(V,W){var X=this._textElement||this.__jo();if(!qx.bom.client.Feature.CSS_TEXT_OVERFLOW&&qx.bom.client.Feature.XUL){X.firstChild.setAttribute(f,V);}else{qx.bom.element.Attribute.set(X,h,V);}return this.__js(X,W);},__js:function(Y,ba){var bb=this.__jn;if(!ba){ba={};}for(var bc in bb){Y.style[bc]=ba[bc]||e;}var bd=qx.bom.element.Dimension.getSize(Y);if(qx.core.Variant.isSet(g,t)){if(!qx.bom.client.Platform.WIN){bd.width++;}}if(qx.core.Variant.isSet(g,m)&&qx.bom.client.Engine.VERSION>=9){bd.width++;}return bd;}}});})();(function(){var i="0px",h="qx.client",g="mshtml",f="qx.bom.element.Dimension",e="paddingRight",d="paddingLeft",c="opera",b="paddingTop",a="paddingBottom";qx.Class.define(f,{statics:{getWidth:qx.core.Variant.select(h,{"gecko":function(j){if(j.getBoundingClientRect){var k=j.getBoundingClientRect();return Math.round(k.right)-Math.round(k.left);}else{return j.offsetWidth;}},"default":function(l){return l.offsetWidth;}}),getHeight:qx.core.Variant.select(h,{"gecko":function(m){if(m.getBoundingClientRect){var n=m.getBoundingClientRect();return Math.round(n.bottom)-Math.round(n.top);}else{return m.offsetHeight;}},"default":function(o){return o.offsetHeight;}}),getSize:function(p){return {width:this.getWidth(p),height:this.getHeight(p)};},__ip:{visible:true,hidden:true},getContentWidth:function(q){var s=qx.bom.element.Style;var t=qx.bom.element.Overflow.getX(q);var u=parseInt(s.get(q,d)||i,10);var x=parseInt(s.get(q,e)||i,10);if(this.__ip[t]){var w=q.clientWidth;if(qx.core.Variant.isSet(h,c)){w=w-u-x;}else{if(qx.dom.Node.isBlockNode(q)){w=w-u-x;}}return w;}else{if(q.clientWidth>=q.scrollWidth){return Math.max(q.clientWidth,q.scrollWidth)-u-x;}else{var v=q.scrollWidth-u;var r=qx.bom.client.Engine;if(r.NAME===g&&r.VERSION==6){v-=x;}return v;}}},getContentHeight:function(y){var A=qx.bom.element.Style;var C=qx.bom.element.Overflow.getY(y);var D=parseInt(A.get(y,b)||i,10);var B=parseInt(A.get(y,a)||i,10);if(this.__ip[C]){return y.clientHeight-D-B;}else{if(y.clientHeight>=y.scrollHeight){return Math.max(y.clientHeight,y.scrollHeight)-D-B;}else{var E=y.scrollHeight-D;var z=qx.bom.client.Engine;if(z.NAME===g&&z.VERSION==6){E-=B;}return E;}}},getContentSize:function(F){return {width:this.getContentWidth(F),height:this.getContentHeight(F)};}}});})();(function(){var e="qx.theme.manager.Font",d="Theme",c="changeTheme",b="_applyTheme",a="singleton";qx.Class.define(e,{type:a,extend:qx.util.ValueManager,properties:{theme:{check:d,nullable:true,apply:b,event:c}},members:{resolveDynamic:function(f){var g=this._dynamic;return f instanceof qx.bom.Font?f:g[f];},resolve:function(h){var k=this._dynamic;var i=k[h];if(i){return i;}var j=this.getTheme();if(j!==null&&j.fonts[h]){return k[h]=(new qx.bom.Font).set(j.fonts[h]);}return h;},isDynamic:function(l){var n=this._dynamic;if(l&&(l instanceof qx.bom.Font||n[l]!==undefined)){return true;}var m=this.getTheme();if(m!==null&&l&&m.fonts[l]){n[l]=(new qx.bom.Font).set(m.fonts[l]);return true;}return false;},__io:function(o,p){if(o[p].include){var q=o[o[p].include];o[p].include=null;delete o[p].include;o[p]=qx.lang.Object.mergeWith(o[p],q,false);this.__io(o,p);}},_applyTheme:function(r){var s=this._getDynamic();for(var v in s){if(s[v].themed){s[v].dispose();delete s[v];}}if(r){var t=r.fonts;var u=qx.bom.Font;for(var v in t){if(t[v].include&&t[t[v].include]){this.__io(t,v);}s[v]=(new u).set(t[v]);s[v].themed=true;}}this._setDynamic(s);}}});})();(function(){var k="",j="underline",h="Boolean",g="px",f='"',e="italic",d="normal",c="bold",b="_applyItalic",a="_applyBold",x="Integer",w="_applyFamily",v="_applyLineHeight",u="Array",t="overline",s="line-through",r="qx.bom.Font",q="Number",p="_applyDecoration",o=" ",m="_applySize",n=",";qx.Class.define(r,{extend:qx.core.Object,construct:function(y,z){qx.core.Object.call(this);if(y!==undefined){this.setSize(y);}if(z!==undefined){this.setFamily(z);}},statics:{fromString:function(A){var E=new qx.bom.Font();var C=A.split(/\s+/);var name=[];var D;for(var i=0;i<C.length;i++){switch(D=C[i]){case c:E.setBold(true);break;case e:E.setItalic(true);break;case j:E.setDecoration(j);break;default:var B=parseInt(D,10);if(B==D||qx.lang.String.contains(D,g)){E.setSize(B);}else{name.push(D);}break;}}if(name.length>0){E.setFamily(name);}return E;},fromConfig:function(F){var G=new qx.bom.Font;G.set(F);return G;},__cy:{fontFamily:k,fontSize:k,fontWeight:k,fontStyle:k,textDecoration:k,lineHeight:1.2},getDefaultStyles:function(){return this.__cy;}},properties:{size:{check:x,nullable:true,apply:m},lineHeight:{check:q,nullable:true,apply:v},family:{check:u,nullable:true,apply:w},bold:{check:h,nullable:true,apply:a},italic:{check:h,nullable:true,apply:b},decoration:{check:[j,s,t],nullable:true,apply:p}},members:{__cz:null,__cA:null,__cB:null,__cC:null,__cD:null,__cE:null,_applySize:function(H,I){this.__cz=H===null?null:H+g;},_applyLineHeight:function(J,K){this.__cE=J===null?null:J;},_applyFamily:function(L,M){var N=k;for(var i=0,l=L.length;i<l;i++){if(L[i].indexOf(o)>0){N+=f+L[i]+f;}else{N+=L[i];}if(i!==l-1){N+=n;}}this.__cA=N;},_applyBold:function(O,P){this.__cB=O===null?null:O?c:d;},_applyItalic:function(Q,R){this.__cC=Q===null?null:Q?e:d;},_applyDecoration:function(S,T){this.__cD=S===null?null:S;},getStyles:function(){return {fontFamily:this.__cA,fontSize:this.__cz,fontWeight:this.__cB,fontStyle:this.__cC,textDecoration:this.__cD,lineHeight:this.__cE};}}});})();(function(){var r="left",q="top",p="_applyLayoutChange",o="hAlign",n="flex",m="vAlign",h="Integer",g="minWidth",f="width",e="minHeight",b="qx.ui.layout.Grid",d="height",c="maxHeight",a="maxWidth";qx.Class.define(b,{extend:qx.ui.layout.Abstract,construct:function(s,t){qx.ui.layout.Abstract.call(this);this.__iF=[];this.__iG=[];if(s){this.setSpacingX(s);}if(t){this.setSpacingY(t);}},properties:{spacingX:{check:h,init:0,apply:p},spacingY:{check:h,init:0,apply:p}},members:{__iH:null,__iF:null,__iG:null,__iI:null,__iJ:null,__iK:null,__iL:null,__iM:null,__iN:null,verifyLayoutProperty:null,__iO:function(){var B=[];var A=[];var C=[];var w=-1;var v=-1;var E=this._getLayoutChildren();for(var i=0,l=E.length;i<l;i++){var z=E[i];var D=z.getLayoutProperties();var F=D.row;var u=D.column;D.colSpan=D.colSpan||1;D.rowSpan=D.rowSpan||1;if(F==null||u==null){throw new Error("The layout properties 'row' and 'column' of the child widget '"+z+"' must be defined!");}if(B[F]&&B[F][u]){throw new Error("Cannot add widget '"+z+"'!. "+"There is already a widget '"+B[F][u]+"' in this cell ("+F+", "+u+")");}for(var x=u;x<u+D.colSpan;x++){for(var y=F;y<F+D.rowSpan;y++){if(B[y]==undefined){B[y]=[];}B[y][x]=z;v=Math.max(v,x);w=Math.max(w,y);}}if(D.rowSpan>1){C.push(z);}if(D.colSpan>1){A.push(z);}}for(var y=0;y<=w;y++){if(B[y]==undefined){B[y]=[];}}this.__iH=B;this.__iI=A;this.__iJ=C;this.__iK=w;this.__iL=v;this.__iM=null;this.__iN=null;delete this._invalidChildrenCache;},_setRowData:function(G,H,I){var J=this.__iF[G];if(!J){this.__iF[G]={};this.__iF[G][H]=I;}else{J[H]=I;}},_setColumnData:function(K,L,M){var N=this.__iG[K];if(!N){this.__iG[K]={};this.__iG[K][L]=M;}else{N[L]=M;}},setSpacing:function(O){this.setSpacingY(O);this.setSpacingX(O);return this;},setColumnAlign:function(P,Q,R){{};this._setColumnData(P,o,Q);this._setColumnData(P,m,R);this._applyLayoutChange();return this;},getColumnAlign:function(S){var T=this.__iG[S]||{};return {vAlign:T.vAlign||q,hAlign:T.hAlign||r};},setRowAlign:function(U,V,W){{};this._setRowData(U,o,V);this._setRowData(U,m,W);this._applyLayoutChange();return this;},getRowAlign:function(X){var Y=this.__iF[X]||{};return {vAlign:Y.vAlign||q,hAlign:Y.hAlign||r};},getCellWidget:function(ba,bb){if(this._invalidChildrenCache){this.__iO();}var ba=this.__iH[ba]||{};return ba[bb]||null;},getRowCount:function(){if(this._invalidChildrenCache){this.__iO();}return this.__iK+1;},getColumnCount:function(){if(this._invalidChildrenCache){this.__iO();}return this.__iL+1;},getCellAlign:function(bc,bd){var bj=q;var bh=r;var bi=this.__iF[bc];var bf=this.__iG[bd];var be=this.__iH[bc][bd];if(be){var bg={vAlign:be.getAlignY(),hAlign:be.getAlignX()};}else{bg={};}if(bg.vAlign){bj=bg.vAlign;}else if(bi&&bi.vAlign){bj=bi.vAlign;}else if(bf&&bf.vAlign){bj=bf.vAlign;}if(bg.hAlign){bh=bg.hAlign;}else if(bf&&bf.hAlign){bh=bf.hAlign;}else if(bi&&bi.hAlign){bh=bi.hAlign;}return {vAlign:bj,hAlign:bh};},setColumnFlex:function(bk,bl){this._setColumnData(bk,n,bl);this._applyLayoutChange();return this;},getColumnFlex:function(bm){var bn=this.__iG[bm]||{};return bn.flex!==undefined?bn.flex:0;},setRowFlex:function(bo,bp){this._setRowData(bo,n,bp);this._applyLayoutChange();return this;},getRowFlex:function(bq){var br=this.__iF[bq]||{};var bs=br.flex!==undefined?br.flex:0;return bs;},setColumnMaxWidth:function(bt,bu){this._setColumnData(bt,a,bu);this._applyLayoutChange();return this;},getColumnMaxWidth:function(bv){var bw=this.__iG[bv]||{};return bw.maxWidth!==undefined?bw.maxWidth:Infinity;},setColumnWidth:function(bx,by){this._setColumnData(bx,f,by);this._applyLayoutChange();return this;},getColumnWidth:function(bz){var bA=this.__iG[bz]||{};return bA.width!==undefined?bA.width:null;},setColumnMinWidth:function(bB,bC){this._setColumnData(bB,g,bC);this._applyLayoutChange();return this;},getColumnMinWidth:function(bD){var bE=this.__iG[bD]||{};return bE.minWidth||0;},setRowMaxHeight:function(bF,bG){this._setRowData(bF,c,bG);this._applyLayoutChange();return this;},getRowMaxHeight:function(bH){var bI=this.__iF[bH]||{};return bI.maxHeight||Infinity;},setRowHeight:function(bJ,bK){this._setRowData(bJ,d,bK);this._applyLayoutChange();return this;},getRowHeight:function(bL){var bM=this.__iF[bL]||{};return bM.height!==undefined?bM.height:null;},setRowMinHeight:function(bN,bO){this._setRowData(bN,e,bO);this._applyLayoutChange();return this;},getRowMinHeight:function(bP){var bQ=this.__iF[bP]||{};return bQ.minHeight||0;},__iP:function(bR){var bV=bR.getSizeHint();var bU=bR.getMarginLeft()+bR.getMarginRight();var bT=bR.getMarginTop()+bR.getMarginBottom();var bS={height:bV.height+bT,width:bV.width+bU,minHeight:bV.minHeight+bT,minWidth:bV.minWidth+bU,maxHeight:bV.maxHeight+bT,maxWidth:bV.maxWidth+bU};return bS;},_fixHeightsRowSpan:function(bW){var ck=this.getSpacingY();for(var i=0,l=this.__iJ.length;i<l;i++){var ca=this.__iJ[i];var cc=this.__iP(ca);var cd=ca.getLayoutProperties();var bY=cd.row;var ci=ck*(cd.rowSpan-1);var bX=ci;var cf={};for(var j=0;j<cd.rowSpan;j++){var cm=cd.row+j;var cb=bW[cm];var cl=this.getRowFlex(cm);if(cl>0){cf[cm]={min:cb.minHeight,value:cb.height,max:cb.maxHeight,flex:cl};}ci+=cb.height;bX+=cb.minHeight;}if(ci<cc.height){if(!qx.lang.Object.isEmpty(cf)){var cj=qx.ui.layout.Util.computeFlexOffsets(cf,cc.height,ci);for(var k=0;k<cd.rowSpan;k++){var ce=cj[bY+k]?cj[bY+k].offset:0;bW[bY+k].height+=ce;}}else{var cg=ck*(cd.rowSpan-1);var ch=cc.height-cg;var cb=Math.floor(ch/cd.rowSpan);for(var k=0;k<cd.rowSpan;k++){bW[bY+k].height=cb;}}}if(bX<cc.minHeight){var cj=qx.ui.layout.Util.computeFlexOffsets(cf,cc.minHeight,bX);for(var j=0;j<cd.rowSpan;j++){var ce=cj[bY+j]?cj[bY+j].offset:0;bW[bY+j].minHeight+=ce;}}}},_fixWidthsColSpan:function(cn){var cr=this.getSpacingX();for(var i=0,l=this.__iI.length;i<l;i++){var co=this.__iI[i];var cq=this.__iP(co);var ct=co.getLayoutProperties();var cp=ct.column;var cz=cr*(ct.colSpan-1);var cs=cz;var cu={};var cw;for(var j=0;j<ct.colSpan;j++){var cA=ct.column+j;var cy=cn[cA];var cx=this.getColumnFlex(cA);if(cx>0){cu[cA]={min:cy.minWidth,value:cy.width,max:cy.maxWidth,flex:cx};}cz+=cy.width;cs+=cy.minWidth;}if(cz<cq.width){var cv=qx.ui.layout.Util.computeFlexOffsets(cu,cq.width,cz);for(var j=0;j<ct.colSpan;j++){cw=cv[cp+j]?cv[cp+j].offset:0;cn[cp+j].width+=cw;}}if(cs<cq.minWidth){var cv=qx.ui.layout.Util.computeFlexOffsets(cu,cq.minWidth,cs);for(var j=0;j<ct.colSpan;j++){cw=cv[cp+j]?cv[cp+j].offset:0;cn[cp+j].minWidth+=cw;}}}},_getRowHeights:function(){if(this.__iM!=null){return this.__iM;}var cK=[];var cD=this.__iK;var cC=this.__iL;for(var cL=0;cL<=cD;cL++){var cE=0;var cG=0;var cF=0;for(var cJ=0;cJ<=cC;cJ++){var cB=this.__iH[cL][cJ];if(!cB){continue;}var cH=cB.getLayoutProperties().rowSpan||0;if(cH>1){continue;}var cI=this.__iP(cB);if(this.getRowFlex(cL)>0){cE=Math.max(cE,cI.minHeight);}else{cE=Math.max(cE,cI.height);}cG=Math.max(cG,cI.height);}var cE=Math.max(cE,this.getRowMinHeight(cL));var cF=this.getRowMaxHeight(cL);if(this.getRowHeight(cL)!==null){var cG=this.getRowHeight(cL);}else{var cG=Math.max(cE,Math.min(cG,cF));}cK[cL]={minHeight:cE,height:cG,maxHeight:cF};}if(this.__iJ.length>0){this._fixHeightsRowSpan(cK);}this.__iM=cK;return cK;},_getColWidths:function(){if(this.__iN!=null){return this.__iN;}var cQ=[];var cN=this.__iL;var cP=this.__iK;for(var cV=0;cV<=cN;cV++){var cT=0;var cS=0;var cO=Infinity;for(var cW=0;cW<=cP;cW++){var cM=this.__iH[cW][cV];if(!cM){continue;}var cR=cM.getLayoutProperties().colSpan||0;if(cR>1){continue;}var cU=this.__iP(cM);if(this.getColumnFlex(cV)>0){cS=Math.max(cS,cU.minWidth);}else{cS=Math.max(cS,cU.width);}cT=Math.max(cT,cU.width);}var cS=Math.max(cS,this.getColumnMinWidth(cV));var cO=this.getColumnMaxWidth(cV);if(this.getColumnWidth(cV)!==null){var cT=this.getColumnWidth(cV);}else{var cT=Math.max(cS,Math.min(cT,cO));}cQ[cV]={minWidth:cS,width:cT,maxWidth:cO};}if(this.__iI.length>0){this._fixWidthsColSpan(cQ);}this.__iN=cQ;return cQ;},_getColumnFlexOffsets:function(cX){var cY=this.getSizeHint();var dd=cX-cY.width;if(dd==0){return {};}var db=this._getColWidths();var da={};for(var i=0,l=db.length;i<l;i++){var de=db[i];var dc=this.getColumnFlex(i);if((dc<=0)||(de.width==de.maxWidth&&dd>0)||(de.width==de.minWidth&&dd<0)){continue;}da[i]={min:de.minWidth,value:de.width,max:de.maxWidth,flex:dc};}return qx.ui.layout.Util.computeFlexOffsets(da,cX,cY.width);},_getRowFlexOffsets:function(df){var dg=this.getSizeHint();var dj=df-dg.height;if(dj==0){return {};}var dk=this._getRowHeights();var dh={};for(var i=0,l=dk.length;i<l;i++){var dl=dk[i];var di=this.getRowFlex(i);if((di<=0)||(dl.height==dl.maxHeight&&dj>0)||(dl.height==dl.minHeight&&dj<0)){continue;}dh[i]={min:dl.minHeight,value:dl.height,max:dl.maxHeight,flex:di};}return qx.ui.layout.Util.computeFlexOffsets(dh,df,dg.height);},renderLayout:function(dm,dn){if(this._invalidChildrenCache){this.__iO();}var dC=qx.ui.layout.Util;var dq=this.getSpacingX();var dw=this.getSpacingY();var dH=this._getColWidths();var dG=this._getColumnFlexOffsets(dm);var dr=[];var dJ=this.__iL;var dp=this.__iK;var dI;for(var dK=0;dK<=dJ;dK++){dI=dG[dK]?dG[dK].offset:0;dr[dK]=dH[dK].width+dI;}var dz=this._getRowHeights();var dB=this._getRowFlexOffsets(dn);var dQ=[];for(var dx=0;dx<=dp;dx++){dI=dB[dx]?dB[dx].offset:0;dQ[dx]=dz[dx].height+dI;}var dR=0;for(var dK=0;dK<=dJ;dK++){var top=0;for(var dx=0;dx<=dp;dx++){var dE=this.__iH[dx][dK];if(!dE){top+=dQ[dx]+dw;continue;}var ds=dE.getLayoutProperties();if(ds.row!==dx||ds.column!==dK){top+=dQ[dx]+dw;continue;}var dP=dq*(ds.colSpan-1);for(var i=0;i<ds.colSpan;i++){dP+=dr[dK+i];}var dF=dw*(ds.rowSpan-1);for(var i=0;i<ds.rowSpan;i++){dF+=dQ[dx+i];}var dt=dE.getSizeHint();var dN=dE.getMarginTop();var dD=dE.getMarginLeft();var dA=dE.getMarginBottom();var dv=dE.getMarginRight();var dy=Math.max(dt.minWidth,Math.min(dP-dD-dv,dt.maxWidth));var dO=Math.max(dt.minHeight,Math.min(dF-dN-dA,dt.maxHeight));var dL=this.getCellAlign(dx,dK);var dM=dR+dC.computeHorizontalAlignOffset(dL.hAlign,dy,dP,dD,dv);var du=top+dC.computeVerticalAlignOffset(dL.vAlign,dO,dF,dN,dA);dE.renderLayout(dM,du,dy,dO);top+=dQ[dx]+dw;}dR+=dr[dK]+dq;}},invalidateLayoutCache:function(){qx.ui.layout.Abstract.prototype.invalidateLayoutCache.call(this);this.__iN=null;this.__iM=null;},_computeSizeHint:function(){if(this._invalidChildrenCache){this.__iO();}var dW=this._getColWidths();var dY=0,ea=0;for(var i=0,l=dW.length;i<l;i++){var eb=dW[i];if(this.getColumnFlex(i)>0){dY+=eb.minWidth;}else{dY+=eb.width;}ea+=eb.width;}var ec=this._getRowHeights();var dU=0,dX=0;for(var i=0,l=ec.length;i<l;i++){var ed=ec[i];if(this.getRowFlex(i)>0){dU+=ed.minHeight;}else{dU+=ed.height;}dX+=ed.height;}var dT=this.getSpacingX()*(dW.length-1);var dS=this.getSpacingY()*(ec.length-1);var dV={minWidth:dY+dT,width:ea+dT,minHeight:dU+dS,height:dX+dS};return dV;}},destruct:function(){this.__iH=this.__iF=this.__iG=this.__iI=this.__iJ=this.__iN=this.__iM=null;}});})();(function(){var b="number",a="qx.ui.layout.Canvas";qx.Class.define(a,{extend:qx.ui.layout.Abstract,members:{verifyLayoutProperty:null,renderLayout:function(c,d){var q=this._getLayoutChildren();var g,p,n;var s,top,e,f,j,h;var o,m,r,k;for(var i=0,l=q.length;i<l;i++){g=q[i];p=g.getSizeHint();n=g.getLayoutProperties();o=g.getMarginTop();m=g.getMarginRight();r=g.getMarginBottom();k=g.getMarginLeft();s=n.left!=null?n.left:n.edge;if(qx.lang.Type.isString(s)){s=Math.round(parseFloat(s)*c/100);}e=n.right!=null?n.right:n.edge;if(qx.lang.Type.isString(e)){e=Math.round(parseFloat(e)*c/100);}top=n.top!=null?n.top:n.edge;if(qx.lang.Type.isString(top)){top=Math.round(parseFloat(top)*d/100);}f=n.bottom!=null?n.bottom:n.edge;if(qx.lang.Type.isString(f)){f=Math.round(parseFloat(f)*d/100);}if(s!=null&&e!=null){j=c-s-e-k-m;if(j<p.minWidth){j=p.minWidth;}else if(j>p.maxWidth){j=p.maxWidth;}s+=k;}else{j=n.width;if(j==null){j=p.width;}else{j=Math.round(parseFloat(j)*c/100);if(j<p.minWidth){j=p.minWidth;}else if(j>p.maxWidth){j=p.maxWidth;}}if(e!=null){s=c-j-e-m-k;}else if(s==null){s=k;}else{s+=k;}}if(top!=null&&f!=null){h=d-top-f-o-r;if(h<p.minHeight){h=p.minHeight;}else if(h>p.maxHeight){h=p.maxHeight;}top+=o;}else{h=n.height;if(h==null){h=p.height;}else{h=Math.round(parseFloat(h)*d/100);if(h<p.minHeight){h=p.minHeight;}else if(h>p.maxHeight){h=p.maxHeight;}}if(f!=null){top=d-h-f-r-o;}else if(top==null){top=o;}else{top+=o;}}g.renderLayout(s,top,j,h);}},_computeSizeHint:function(){var I=0,H=0;var F=0,D=0;var B,A;var z,x;var t=this._getLayoutChildren();var w,G,v;var J,top,u,y;for(var i=0,l=t.length;i<l;i++){w=t[i];G=w.getLayoutProperties();v=w.getSizeHint();var E=w.getMarginLeft()+w.getMarginRight();var C=w.getMarginTop()+w.getMarginBottom();B=v.width+E;A=v.minWidth+E;J=G.left!=null?G.left:G.edge;if(J&&typeof J===b){B+=J;A+=J;}u=G.right!=null?G.right:G.edge;if(u&&typeof u===b){B+=u;A+=u;}I=Math.max(I,B);H=Math.max(H,A);z=v.height+C;x=v.minHeight+C;top=G.top!=null?G.top:G.edge;if(top&&typeof top===b){z+=top;x+=top;}y=G.bottom!=null?G.bottom:G.edge;if(y&&typeof y===b){z+=y;x+=y;}F=Math.max(F,z);D=Math.max(D,x);}return {width:I,minWidth:H,height:F,minHeight:D};}}});})();(function(){var k="_",j="_PROT",h="_PUB",g="mixin",f="_PRIV",e="_ABSTRACT",d="_STATIC",c="_INHERITED",b="OVERLAY_",a="_THEMEABLE",F="ICON_CHILDCONTROL",E="_ERROR",D="_OVERRIDDEN",C="ICON_PACKAGE",B="interface",A="ICON_CTOR",z="PROT",y="ICON_CLASS",x="ICON_INTERFACE",w="apiviewer.TreeUtil",r="_MIXIN",s="PUB",p="ICON_EVENT",q="ICON_PROPERTY",n="_WARN",o="ICON_METHOD",l="ICON_MIXIN",m="ICON_APPEARANCE",t="PRIV",u="ICON_CONSTANT",v="_SINGLETON";qx.Class.define(w,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);},statics:{getChild:function(G,H){if(G!=null&&G.children!=null){for(var i=0;i<G.children.length;i++){if(G.children[i].type==H){return G.children[i];}}}return null;},getChildByAttribute:function(I,J,K){if(I.children!=null){for(var i=0;i<I.children.length;i++){var L=I.children[i];if(L.attributes&&L.attributes[J]==K){return L;}}}return null;},getIconUrl:function(M,N){var O;var P=apiviewer.dao;if(M instanceof P.Package){O=C;}else if(M instanceof P.Class){switch(M.getType()){case g:O=l;break;case B:O=x;break;default:O=y;if(M.isStatic()){O+=d;}else if(M.isAbstract()){O+=e;}else if(M.isSingleton()){O+=v;}}}else if(M instanceof P.Property){O=q;if(M.isPublic()){O+=h;}else if(M.isProtected()){O+=j;}else if(M.isPrivate()||M.isInternal()){O+=f;}if(M.isThemeable()){O+=a;}}else if(M instanceof P.Event){O=p;}else if(M instanceof P.Method){if(M.isConstructor()){var O=A;}else{O=o;if(M.isPublic()){O+=h;}else if(M.isProtected()){O+=j;}else if(M.isPrivate()||M.isInternal()){O+=f;}}if(M.isStatic()){O+=d;}else if(M.isAbstract()){O+=e;}if(M.getClass().getType()==g){O+=r;}}else if(M instanceof P.Constant){O=u;}else if(M instanceof P.Appearance){O=m;}else if(M instanceof P.ChildControl){O=F;}else{throw new Error("Unknown node type: "+M.type);}if(M instanceof P.ClassItem){if(N){O+=c;}else if(M.getOverriddenFrom&&M.getOverriddenFrom()){O+=D;}if(M.getErrors().length>0){O+=E;}}if(M.hasWarning()){O+=n;}return apiviewer.TreeUtil.iconNameToIconPath(O);},iconNameToIconPath:function(Q){var T=apiviewer.TreeUtil[Q];if(!T){var S=Q.split(k);var V=S[0]+k+S[1];if(S[2]==s||S[2]==z||S[2]==t){V+=k+S[2];var U=3;}else{U=2;}T=[apiviewer.TreeUtil[V]];if(T[0]==null){throw new Error("Unknown img constant: "+V);}for(var i=U;i<S.length;i++){var R=apiviewer.TreeUtil[b+S[i]];if(R==null){throw new Error("Unknown img constant: OVERLAY_"+S[i]);}T.push(R);}}return T;},ICON_BLANK:"apiviewer/image/blank.gif",OVERLAY_ABSTRACT:"apiviewer/image/overlay_abstract18.gif",OVERLAY_ERROR:"apiviewer/image/overlay_error18.gif",OVERLAY_INHERITED:"apiviewer/image/overlay_inherited18.gif",OVERLAY_OVERRIDDEN:"apiviewer/image/overlay_overridden18.gif",OVERLAY_THEMEABLE:"apiviewer/image/overlay_themeable18.gif",OVERLAY_STATIC:"apiviewer/image/overlay_static18.gif",OVERLAY_WARN:"apiviewer/image/overlay_warning18.gif",OVERLAY_MIXIN:"apiviewer/image/overlay_mixin18.gif",ICON_PACKAGE:"apiviewer/image/package18.gif",ICON_PACKAGE_WARN:"apiviewer/image/package_warning18.gif",ICON_CLASS:"apiviewer/image/class18.gif",ICON_CLASS_WARN:"apiviewer/image/class_warning18.gif",ICON_CLASS_ERROR:"apiviewer/image/class_warning18.gif",ICON_CLASS_STATIC:"apiviewer/image/class_static18.gif",ICON_CLASS_STATIC_WARN:"apiviewer/image/class_static_warning18.gif",ICON_CLASS_STATIC_ERROR:"apiviewer/image/class_static_warning18.gif",ICON_CLASS_ABSTRACT:"apiviewer/image/class_abstract18.gif",ICON_CLASS_ABSTRACT_WARN:"apiviewer/image/class_abstract_warning18.gif",ICON_CLASS_ABSTRACT_ERROR:"apiviewer/image/class_abstract_warning18.gif",ICON_CLASS_SINGLETON:"apiviewer/image/class_singleton18.gif",ICON_CLASS_SINGLETON_WARN:"apiviewer/image/class_singleton_warning18.gif",ICON_CLASS_SINGLETON_ERROR:"apiviewer/image/class_singleton_warning18.gif",ICON_PROPERTY_PUB:"apiviewer/image/property18.gif",ICON_PROPERTY_PROT:"apiviewer/image/property_protected18.gif",ICON_PROPERTY_PRIV:"apiviewer/image/property_private18.gif",ICON_PROPERTY_PUB_THEMEABLE:"apiviewer/image/property_themeable18.gif",ICON_EVENT:"apiviewer/image/event18.gif",ICON_INTERFACE:"apiviewer/image/interface18.gif",ICON_INTERFACE_WARN:"apiviewer/image/interface_warning18.gif",ICON_MIXIN:"apiviewer/image/mixin18.gif",ICON_MIXIN_WARN:"apiviewer/image/mixin_warning18.gif",ICON_METHOD_PUB:"apiviewer/image/method_public18.gif",ICON_METHOD_PUB_INHERITED:"apiviewer/image/method_public_inherited18.gif",ICON_CTOR:"apiviewer/image/constructor18.gif",ICON_METHOD_PROT:"apiviewer/image/method_protected18.gif",ICON_METHOD_PRIV:"apiviewer/image/method_private18.gif",ICON_CONSTANT:"apiviewer/image/constant18.gif",ICON_APPEARANCE:"apiviewer/image/constant18.gif",ICON_CHILDCONTROL:"apiviewer/image/childcontrol18.gif"},defer:function(W,X,Y){W.PRELOAD_IMAGES=[W.ICON_INFO,W.ICON_SEARCH,W.OVERLAY_ABSTRACT,W.OVERLAY_ERROR,W.OVERLAY_INHERITED,W.OVERLAY_OVERRIDDEN,W.OVERLAY_STATIC,W.OVERLAY_WARN,W.OVERLAY_MIXIN,W.OVERLAY_THEMEABLE,W.ICON_PACKAGE,W.ICON_PACKAGE_WARN,W.ICON_CLASS,W.ICON_CLASS_WARN,W.ICON_CLASS_ERROR,W.ICON_CLASS_STATIC,W.ICON_CLASS_STATIC_WARN,W.ICON_CLASS_STATIC_ERROR,W.ICON_CLASS_ABSTRACT,W.ICON_CLASS_ABSTRACT_WARN,W.ICON_CLASS_ABSTRACT_ERROR,W.ICON_CLASS_SINGLETON,W.ICON_CLASS_SINGLETON_WARN,W.ICON_CLASS_SINGLETON_ERROR,W.ICON_PROPERTY_PUB,W.ICON_PROPERTY_PROT,W.ICON_PROPERTY_PRIV,W.ICON_PROPERTY_PUB_THEMEABLE,W.ICON_EVENT,W.ICON_INTERFACE,W.ICON_INTERFACE_WARN,W.ICON_MIXIN,W.ICON_MIXIN_WARN,W.ICON_METHOD_PUB,W.ICON_METHOD_PUB_INHERITED,W.ICON_CTOR,W.ICON_METHOD_PROT,W.ICON_METHOD_PRIV,W.ICON_CONSTANT,W.ICON_CHILDCONTROL];}});})();(function(){var g="Boolean",f="changeShowInherited",e="changeShowProtected",d="changeExpandProperties",c="apiviewer.UiModel",b="changeShowPrivate",a="singleton";qx.Class.define(c,{extend:qx.core.Object,type:a,properties:{showInherited:{check:g,init:false,event:f},expandProperties:{check:g,init:false,event:d},showProtected:{check:g,init:false,event:e},showPrivate:{check:g,init:false,event:b}}});})();(function(){var i="auto",h="overflowX",g="visible",f="hidden",e="scroll",d="overflowY",c="_applyOverflowX",b="_applyOverflowY",a="qx.ui.core.MNativeOverflow";qx.Mixin.define(a,{properties:{overflowX:{check:[f,g,e,i],nullable:true,apply:c},overflowY:{check:[f,g,e,i],nullable:true,apply:b},overflow:{group:[h,d]}},members:{_applyOverflowX:function(j){this.getContentElement().setStyle(h,j);},_applyOverflowY:function(k){this.getContentElement().setStyle(d,k);}}});})();(function(){var o="none",n="text",m="",l="userSelect",k="color",j="String",i="0px",h="webkit",g="changeHtml",f="_applyCssClass",c="class",e="qx.ui.embed.Html",d="_applyHtml",b="qx.client",a="html";qx.Class.define(e,{extend:qx.ui.core.Widget,include:[qx.ui.core.MNativeOverflow],construct:function(p){qx.ui.core.Widget.call(this);if(p!=null){this.setHtml(p);}},properties:{html:{check:j,apply:d,event:g,nullable:true},cssClass:{check:j,init:m,apply:f},selectable:{refine:true,init:true},focusable:{refine:true,init:true}},members:{getFocusElement:function(){return this.getContentElement();},_applyHtml:function(q,r){var s=this.getContentElement();s.setAttribute(a,q||m);s.setStyles({"padding":i,"border":o});},_applyCssClass:function(t,u){this.getContentElement().setAttribute(c,t);},_applySelectable:function(v){qx.ui.core.Widget.prototype._applySelectable.call(this,v);if(qx.core.Variant.isSet(b,h)){this.getContainerElement().setStyle(l,v?n:o);this.getContentElement().setStyle(l,v?n:o);}},_applyFont:function(w,x){var y=w?qx.theme.manager.Font.getInstance().resolve(w).getStyles():qx.bom.Font.getDefaultStyles();this.getContentElement().setStyles(y);},_applyTextColor:function(z,A){if(z){this.getContentElement().setStyle(k,qx.theme.manager.Color.getInstance().resolve(z));}else{this.getContentElement().removeStyle(k);}}}});})();(function(){var l="Boolean",k="_updatePanels",j="auto",h='</div>',g='<div>',f='apiviewer/image/close.gif',e="javascript",d='<div style="padding:24px;">',c="_blank",b="apiviewer.dao.Node",y="string",x="http://",w="pre",v="_infoPanels",u='apiviewer/image/open.gif',t="appear",s="img",r="_applyDocNode",q="detailviewer",p='<h1></h1>',n="abstract",o="apiviewer.ui.AbstractViewer",m="a";qx.Class.define(o,{type:n,extend:qx.ui.embed.Html,construct:function(){qx.ui.embed.Html.call(this);this._infoPanelHash={};this._infoPanels=[];this.setOverflowX(j);this.setOverflowY(j);this.setAppearance(q);this._infoPanelHash={};this._infoPanels=[];apiviewer.ObjectRegistry.register(this);},properties:{docNode:{check:b,init:null,nullable:true,apply:r},showInherited:{check:l,init:false,apply:k},expandProperties:{check:l,init:false,apply:k},showProtected:{check:l,init:false,apply:k},showPrivate:{check:l,init:false,apply:k}},statics:{fixLinks:function(z){var a=z.getElementsByTagName(m);for(var i=0;i<a.length;i++){if(typeof a[i].href==y&&a[i].href.indexOf(x)==0){a[i].target=c;}}},highlightCode:function(A){var B=A.getElementsByTagName(w);for(var i=0;i<B.length;i++){var C=B[i];if(C.className!==e){continue;}C.innerHTML=qx.dev.Tokenizer.javaScriptToHtml(C.innerHTML);}}},members:{_infoPanelHash:null,_infoPanels:null,__Sq:null,_init:function(D){this.__Sr();this.setDocNode(D);this.addListenerOnce(t,function(){this._syncHtml();this._applyDocNode(this.__Sq);},this);},__Sr:function(){var F=new qx.util.StringBuilder();F.add(d);F.add(p);F.add(g,h);var E=this.getPanels();for(var i=0;i<E.length;i++){var G=E[i];F.add(G.getPanelHtml(this));}F.add(h);this.setHtml(F.get());},_getTitleHtml:function(H){throw new Error("Abstract method called!");},_getDescriptionHtml:function(I){throw new Error("Abstract method called!");},_syncHtml:function(){var M=this.getContentElement().getDomElement().firstChild;var J=M.childNodes;var K=this.getPanels();apiviewer.ui.AbstractViewer.fixLinks(M);this._titleElem=J[0];this._classDescElem=J[1];for(var i=0;i<K.length;i++){var L=K[i];L.setElement(J[i+2]);}},addInfoPanel:function(N){this._infoPanelHash[N.toHashCode()]=N;this._infoPanels.push(N);},getPanels:function(){return this._infoPanels;},getPanelFromHashCode:function(O){return this._infoPanelHash[O];},_updatePanels:function(){var P=this.getPanels();for(var i=0;i<P.length;i++){var Q=P[i];Q.update(this,this.__Sq);}},_applyDocNode:function(R){this.__Sq=R;if(!this._titleElem){return ;}this._titleElem.innerHTML=this._getTitleHtml(R);this._classDescElem.innerHTML=this._getDescriptionHtml(R);apiviewer.ui.AbstractViewer.fixLinks(this._classDescElem);apiviewer.ui.AbstractViewer.highlightCode(this._classDescElem);this._updatePanels();},togglePanelVisibility:function(S){try{S.setIsOpen(!S.getIsOpen());var T=S.getTitleElement().getElementsByTagName(s)[0];T.src=qx.util.ResourceManager.getInstance().toUri(S.getIsOpen()?f:u);S.update(this,this.getDocNode());}catch(U){this.error("Toggling info body failed",U);}}},destruct:function(){this._classDescElem=this._titleElem=this._infoPanelHash=this.__Sq=null;this._disposeArray(v,1);}});})();(function(){var n="classes",m="functions",l="",k="packages",j="class",i="interfaces",h='<div class="class-description">',g='<small>package</small>',f='</div>',e="ClassViewer",b="mixins",d="interface",c="apiviewer.ui.PackageViewer",a="mixin";qx.Class.define(c,{extend:apiviewer.ui.AbstractViewer,construct:function(){apiviewer.ui.AbstractViewer.call(this);this.addInfoPanel(new apiviewer.ui.panels.MethodPanel(m,m));this.addInfoPanel(new apiviewer.ui.panels.ClassPanel(n,n,j));this.addInfoPanel(new apiviewer.ui.panels.ClassPanel(n,i,d));this.addInfoPanel(new apiviewer.ui.panels.ClassPanel(n,b,a));this.addInfoPanel(new apiviewer.ui.panels.PackagePanel(k,k));this.getContentElement().setAttribute(j,e);this._init(new apiviewer.dao.Package({}));},members:{_getTitleHtml:function(o){var p=l;p+=g;p+=o.getFullName();return p;},_getDescriptionHtml:function(q){var r=new qx.util.StringBuilder();var s=q.getDescription();if(s!=l){r.add(h,apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(s,q),f);}return r.get();}}});})();(function(){var a="apiviewer.ObjectRegistry";qx.Class.define(a,{statics:{__Ss:{},register:function(b){var c=qx.core.ObjectRegistry.toHashCode(b);this.__Ss[c]=b;},getObjectFromHashCode:function(d){return this.__Ss[d];}}});})();(function(){var l="</span>",k="sym",j="nl",h="qxkey",g="ws",f=">",e="qqstr",d="<",c="qstr",b="linecomment",bg="ident",bf="keyword",be="regexp",bd="&",bc="|",bb="fullcomment",ba="atom",Y="\\r\\n|\\r|\\n",X="\\s*\\)*",W="\\s",s="^",t='["][^"]*["]',q="real",r="\\s*[,\\)]",o="<span class='string'>",p="[a-zA-Z_][a-zA-Z0-9_]*\\b",m="<span class='comment'>",n="[+-]?\\d+",w="\\s*\\(*\\s*",x="&nbsp;",F="qx.dev.Tokenizer",D="\\t",M="\\s*\\)*\\s*\\)",H="\\.(?:replace)\\s*\\(\\s*\\(*\\s*",S="\\)*\\.(?:test|exec)\\s*\\(\\s*",Q="<span class='regexp'>",z="int",V="'>",U="<span class='",T="(?:\\/(?!\\*)[^\\t\\n\\r\\f\\v\\/]+?\\/[mgi]*)",y=".",B="\\s*\\)*\\s*?,?",C="[\\(,]\\s*",E="<span class='ident'>",G="g",I="[+-]?\\d+(([.]\\d+)*([eE][+-]?\\d+))?",N="\\/\\*(?:.|[\\n\\r])*?\\*\\/",R="\n",u="$",v="['][^']*[']",A="tab",L="\\/\\/.*?[\\n\\r$]",K="<br>",J=" ",P="(?::|=|\\?)\\s*\\(*\\s*",O="\\.(?:match|search|split)\\s*\\(\\s*\\(*\\s*";qx.Class.define(F,{extend:qx.core.Object,statics:{tokenizeJavaScript:function(bh){var bL={"break":1,"case":1,"catch":1,"continue":1,"default":1,"delete":1,"do":1,"else":1,"finally":1,"for":1,"function":1,"if":1,"in":1,"instanceof":1,"new":1,"return":1,"switch":1,"throw":1,"try":1,"typeof":1,"var":1,"while":1,"with":1};var bB={"void":1,"null":1,"true":1,"false":1,"NaN":1,"Infinity":1,"this":1};var bx={"statics":1,"members":1,"construct":1,"destruct":1,"events":1,"properties":1,"extend":1,"implement":1};var bt=function(bM){return new RegExp(s+bM+u);};var bE=L;var bu=N;var bo=p;var bw=n;var br=I;var bz=t;var by=v;var bm=D;var bH=Y;var bJ=W;var bs=T;var bv=[O+bs+M,H+bs+B,w+bs+S,P+bs+X,C+bs+r].join(bc);var bF=bt(bE);var bp=bt(bu);var bC=bt(bo);var bl=bt(bw);var bI=bt(br);var bk=bt(bz);var bj=bt(by);var bD=bt(bm);var bq=bt(bH);var bi=bt(bJ);var bn=bt(bv);var bA=new RegExp([bE,bu,bo,bw,br,bz,by,by,bm,bH,bJ,bv,y].join(bc),G);var bG=[];var a=bh.match(bA);for(var i=0;i<a.length;i++){var bK=a[i];if(bK.match(bF)){bG.push({type:b,value:bK});}else if(bK.match(bp)){bG.push({type:bb,value:bK});}else if(bK.match(bn)){bG.push({type:be,value:bK});}else if(bK.match(bj)){bG.push({type:c,value:bK});}else if(bK.match(bk)){bG.push({type:e,value:bK});}else if(bL[bK]){bG.push({type:bf,value:bK});}else if(bB[bK]){bG.push({type:ba,value:bK});}else if(bx[bK]){bG.push({type:h,value:bK});}else if(bK.match(bC)){bG.push({type:bg,value:bK});}else if(bK.match(bI)){bG.push({type:q,value:bK});}else if(bK.match(bl)){bG.push({type:z,value:bK});}else if(bK.match(bq)){bG.push({type:j,value:bK});}else if(bK.match(bt(bi))){bG.push({type:g,value:bK});}else if(bK.match(bD)){bG.push({type:A,value:bK});}else if(bK==f){bG.push({type:k,value:f});}else if(bK==d){bG.push({type:k,value:d});}else if(bK==bd){bG.push({type:k,value:bd});}else{bG.push({type:k,value:bK});}}return bG;},javaScriptToHtml:function(bN){var bR=qx.dev.Tokenizer.tokenizeJavaScript(bN);var bQ=new qx.util.StringBuilder();for(var i=0;i<bR.length;i++){var bS=bR[i];var bP=qx.bom.String.escape(bS.value);switch(bS.type){case be:bQ.add(Q,bP,l);break;case bg:bQ.add(E,bP,l);break;case b:case bb:bQ.add(m,bP,l);break;case c:case e:bQ.add(o,bP,l);break;case bf:case ba:case h:bQ.add(U,bS.type,V,bP,l);break;case j:var bO=qx.bom.client.Engine.MSHTML?K:R;bQ.add(bO);break;case g:var bT=qx.bom.client.Engine.MSHTML?x:J;bQ.add(bT);break;default:bQ.add(bP);}}return bQ.get();}}});})();(function(){var f="mshtml",e="pop.push.reverse.shift.sort.splice.unshift.join.slice",d="number",c="qx.type.BaseArray",b="qx.client",a=".";qx.Class.define(c,{extend:Array,construct:function(g){},members:{toArray:null,valueOf:null,pop:null,push:null,reverse:null,shift:null,sort:null,splice:null,unshift:null,concat:null,join:null,slice:null,toString:null,indexOf:null,lastIndexOf:null,forEach:null,filter:null,map:null,some:null,every:null}});(function(){function k(l){if(qx.core.Variant.isSet(b,f)){j.prototype={length:0,$$isArray:true};var o=e.split(a);for(var length=o.length;length;){j.prototype[o[--length]]=Array.prototype[o[length]];}}var p=Array.prototype.slice;j.prototype.concat=function(){var r=this.slice(0);for(var i=0,length=arguments.length;i<length;i++){var q;if(arguments[i] instanceof j){q=p.call(arguments[i],0);}else if(arguments[i] instanceof Array){q=arguments[i];}else{q=[arguments[i]];}r.push.apply(r,q);}return r;};j.prototype.toString=function(){return p.call(this,0).toString();};j.prototype.toLocaleString=function(){return p.call(this,0).toLocaleString();};j.prototype.constructor=j;j.prototype.indexOf=qx.lang.Core.arrayIndexOf;j.prototype.lastIndexOf=qx.lang.Core.arrayLastIndexOf;j.prototype.forEach=qx.lang.Core.arrayForEach;j.prototype.some=qx.lang.Core.arraySome;j.prototype.every=qx.lang.Core.arrayEvery;var m=qx.lang.Core.arrayFilter;var n=qx.lang.Core.arrayMap;j.prototype.filter=function(){var s=new this.constructor;s.push.apply(s,m.apply(this,arguments));return s;};j.prototype.map=function(){var t=new this.constructor;t.push.apply(t,n.apply(this,arguments));return t;};j.prototype.slice=function(){var u=new this.constructor;u.push.apply(u,Array.prototype.slice.apply(this,arguments));return u;};j.prototype.splice=function(){var v=new this.constructor;v.push.apply(v,Array.prototype.splice.apply(this,arguments));return v;};j.prototype.toArray=function(){return Array.prototype.slice.call(this,0);};j.prototype.valueOf=function(){return this.length;};return j;}function j(length){if(arguments.length===1&&typeof length===d){this.length=-1<length&&length===length>>.5?length:this.push(length);}else if(arguments.length){this.push.apply(this,arguments);}}function h(){}h.prototype=[];j.prototype=new h;j.prototype.length=0;qx.type.BaseArray=k(j);})();})();(function(){var b="",a="qx.util.StringBuilder";qx.Class.define(a,{extend:qx.type.BaseArray,members:{clear:function(){this.length=0;},get:function(){return this.join(b);},add:null,isEmpty:function(){return this.length===0;},size:function(){return this.join(b).length;}},defer:function(c,d){d.add=d.push;d.toString=d.get;d.valueOf=d.get;}});})();(function(){var p="",o="!",n="'!",m="'",k="Expected '",j="' (rgb(",h=",",g=")), but found value '",f="Event (",d="Expected value to be the CSS color '",bw="' but found ",bv="The value '",bu=" != ",bt="qx.core.Object",bs="Expected value to be an array but found ",br=") was fired.",bq="Expected value to be an integer >= 0 but found ",bp="' to be not equal with '",bo="' to '",bn="qx.ui.core.Widget",w="Called assertTrue with '",x="Expected value to be a map but found ",u="The function did not raise an exception!",v="Expected value to be undefined but found ",s="Expected value to be a DOM element but found  '",t="Expected value to be a regular expression but found ",q="' to implement the interface '",r="Expected value to be null but found ",E="Invalid argument 'type'",F="Called assert with 'false'",R="Assertion error! ",N="Expected value to be a string but found ",ba="null",U="' but found '",bj="' must must be a key of the map '",bf="The String '",J="Expected value not to be undefined but found ",bm="qx.util.ColorUtil",bl=": ",bk="The raised exception does not have the expected type! ",I=") not fired.",L="qx.core.Assert",M="Expected value to be typeof object but found ",P="' (identical) but found '",S="' must have any of the values defined in the array '",V="Expected value to be a number but found ",bc="Called assertFalse with '",bh="]",y="Expected value to be a qooxdoo object but found ",z="' arguments.",K="Expected value not to be null but found ",Y="Array[",X="' does not match the regular expression '",W="' to be not identical with '",be="' arguments but found '",bd="', which cannot be converted to a CSS color!",T="Expected object '",bb="qx.core.AssertionError",a="Expected value to be a boolean but found ",bg="))!",A="Expected value to be a qooxdoo widget but found ",B="Expected value '%1' to be in the range '%2'..'%3'!",O="Expected value to be typeof '",b="Expected value to be typeof function but found ",c="Expected value to be an integer but found ",H="Called fail().",C="The parameter 're' must be a string or a regular expression.",D="Expected value to be a number >= 0 but found ",G="Expected value to be instanceof '",Q="Wrong number of arguments given. Expected '",bi="object";qx.Class.define(L,{statics:{__tN:true,__tO:function(bx,by){var bz=p;for(var i=1,l=arguments.length;i<l;i++){bz=bz+this.__tP(arguments[i]);}var bB=R+bx+bl+bz;if(this.__tN){qx.Bootstrap.error(bB);}if(qx.Class.isDefined(bb)){var bA=new qx.core.AssertionError(bx,bz);if(this.__tN){qx.Bootstrap.error("Stack trace: \n"+bA.getStackTrace());}throw bA;}else{throw new Error(bB);}},__tP:function(bC){var bD;if(bC===null){bD=ba;}else if(qx.lang.Type.isArray(bC)&&bC.length>10){bD=Y+bC.length+bh;}else if((bC instanceof Object)&&(bC.toString==null)){bD=qx.lang.Json.stringify(bC,null,2);}else{try{bD=bC.toString();}catch(e){bD=p;}}return bD;},assert:function(bE,bF){bE==true||this.__tO(bF||p,F);},fail:function(bG){this.__tO(bG||p,H);},assertTrue:function(bH,bI){(bH===true)||this.__tO(bI||p,w,bH,m);},assertFalse:function(bJ,bK){(bJ===false)||this.__tO(bK||p,bc,bJ,m);},assertEquals:function(bL,bM,bN){bL==bM||this.__tO(bN||p,k,bL,U,bM,n);},assertNotEquals:function(bO,bP,bQ){bO!=bP||this.__tO(bQ||p,k,bO,bp,bP,n);},assertIdentical:function(bR,bS,bT){bR===bS||this.__tO(bT||p,k,bR,P,bS,n);},assertNotIdentical:function(bU,bV,bW){bU!==bV||this.__tO(bW||p,k,bU,W,bV,n);},assertNotUndefined:function(bX,bY){bX!==undefined||this.__tO(bY||p,J,bX,o);},assertUndefined:function(ca,cb){ca===undefined||this.__tO(cb||p,v,ca,o);},assertNotNull:function(cc,cd){cc!==null||this.__tO(cd||p,K,cc,o);},assertNull:function(ce,cf){ce===null||this.__tO(cf||p,r,ce,o);},assertJsonEquals:function(cg,ch,ci){this.assertEquals(qx.lang.Json.stringify(cg),qx.lang.Json.stringify(ch),ci);},assertMatch:function(cj,ck,cl){this.assertString(cj);this.assert(qx.lang.Type.isRegExp(ck)||qx.lang.Type.isString(ck),C);cj.search(ck)>=0||this.__tO(cl||p,bf,cj,X,ck.toString(),n);},assertArgumentsCount:function(cm,cn,co,cp){var cq=cm.length;(cq>=cn&&cq<=co)||this.__tO(cp||p,Q,cn,bo,co,be,arguments.length,z);},assertEventFired:function(cr,event,cs,ct,cu){var cw=false;var cv=function(e){if(ct){ct.call(cr,e);}cw=true;};var cx;try{cx=cr.addListener(event,cv,cr);cs.call();}catch(cy){throw cy;}finally{try{cr.removeListenerById(cx);}catch(cz){}}cw===true||this.__tO(cu||p,f,event,I);},assertEventNotFired:function(cA,event,cB,cC){var cE=false;var cD=function(e){cE=true;};var cF=cA.addListener(event,cD,cA);cB.call();cE===false||this.__tO(cC||p,f,event,br);cA.removeListenerById(cF);},assertException:function(cG,cH,cI,cJ){var cH=cH||Error;var cK;try{this.__tN=false;cG();}catch(cL){cK=cL;}finally{this.__tN=true;}if(cK==null){this.__tO(cJ||p,u);}cK instanceof cH||this.__tO(cJ||p,bk,cH,bu,cK);if(cI){this.assertMatch(cK.toString(),cI,cJ);}},assertInArray:function(cM,cN,cO){cN.indexOf(cM)!==-1||this.__tO(cO||p,bv,cM,S,cN,m);},assertArrayEquals:function(cP,cQ,cR){this.assertArray(cP,cR);this.assertArray(cQ,cR);this.assertEquals(cP.length,cQ.length,cR);for(var i=0;i<cP.length;i++){this.assertIdentical(cP[i],cQ[i],cR);}},assertKeyInMap:function(cS,cT,cU){cT[cS]!==undefined||this.__tO(cU||p,bv,cS,bj,cT,m);},assertFunction:function(cV,cW){qx.lang.Type.isFunction(cV)||this.__tO(cW||p,b,cV,o);},assertString:function(cX,cY){qx.lang.Type.isString(cX)||this.__tO(cY||p,N,cX,o);},assertBoolean:function(da,db){qx.lang.Type.isBoolean(da)||this.__tO(db||p,a,da,o);},assertNumber:function(dc,dd){(qx.lang.Type.isNumber(dc)&&isFinite(dc))||this.__tO(dd||p,V,dc,o);},assertPositiveNumber:function(de,df){(qx.lang.Type.isNumber(de)&&isFinite(de)&&de>=0)||this.__tO(df||p,D,de,o);},assertInteger:function(dg,dh){(qx.lang.Type.isNumber(dg)&&isFinite(dg)&&dg%1===0)||this.__tO(dh||p,c,dg,o);},assertPositiveInteger:function(di,dj){var dk=(qx.lang.Type.isNumber(di)&&isFinite(di)&&di%1===0&&di>=0);dk||this.__tO(dj||p,bq,di,o);},assertInRange:function(dl,dm,dn,dp){(dl>=dm&&dl<=dn)||this.__tO(dp||p,qx.lang.String.format(B,[dl,dm,dn]));},assertObject:function(dq,dr){var ds=dq!==null&&(qx.lang.Type.isObject(dq)||typeof dq===bi);ds||this.__tO(dr||p,M,(dq),o);},assertArray:function(dt,du){qx.lang.Type.isArray(dt)||this.__tO(du||p,bs,dt,o);},assertMap:function(dv,dw){qx.lang.Type.isObject(dv)||this.__tO(dw||p,x,dv,o);},assertRegExp:function(dx,dy){qx.lang.Type.isRegExp(dx)||this.__tO(dy||p,t,dx,o);},assertType:function(dz,dA,dB){this.assertString(dA,E);typeof (dz)===dA||this.__tO(dB||p,O,dA,bw,dz,o);},assertInstance:function(dC,dD,dE){var dF=dD.classname||dD+p;dC instanceof dD||this.__tO(dE||p,G,dF,bw,dC,o);},assertInterface:function(dG,dH,dI){qx.Class.implementsInterface(dG,dH)||this.__tO(dI||p,T,dG,q,dH,n);},assertCssColor:function(dJ,dK,dL){var dM=qx.Class.getByName(bm);if(!dM){throw new Error("qx.util.ColorUtil not available! Your code must have a dependency on 'qx.util.ColorUtil'");}var dO=dM.stringToRgb(dJ);try{var dN=dM.stringToRgb(dK);}catch(dQ){this.__tO(dL||p,d,dJ,j,dO.join(h),g,dK,bd);}var dP=dO[0]==dN[0]&&dO[1]==dN[1]&&dO[2]==dN[2];dP||this.__tO(dL||p,d,dO,j,dO.join(h),g,dK,j,dN.join(h),bg);},assertElement:function(dR,dS){!!(dR&&dR.nodeType===1)||this.__tO(dS||p,s,dR,n);},assertQxObject:function(dT,dU){this.__tQ(dT,bt)||this.__tO(dU||p,y,dT,o);},assertQxWidget:function(dV,dW){this.__tQ(dV,bn)||this.__tO(dW||p,A,dV,o);},__tQ:function(dX,dY){if(!dX){return false;}var ea=dX.constructor;while(ea){if(ea.classname===dY){return true;}ea=ea.superclass;}return false;}}});})();(function(){var p='',o='"',m=':',l=']',h='null',g=': ',f='object',e='function',d=',',b='\n',ba='\\u',Y=',\n',X='0000',W='string',V="Cannot stringify a recursive object.",U='0',T='-',S='}',R='String',Q='Boolean',x='\\\\',y='\\f',u='\\t',w='{\n',s='[]',t="qx.lang.JsonImpl",q='Z',r='\\n',z='Object',A='{}',H='@',F='.',K='(',J='Array',M='T',L='\\r',C='{',P='JSON.parse',O=' ',N='[',B='Number',D=')',E='[\n',G='\\"',I='\\b';qx.Class.define(t,{extend:Object,construct:function(){this.stringify=qx.lang.Function.bind(this.stringify,this);this.parse=qx.lang.Function.bind(this.parse,this);},members:{__tT:null,__tU:null,__tV:null,__tW:null,stringify:function(bb,bc,bd){this.__tT=p;this.__tU=p;this.__tW=[];if(qx.lang.Type.isNumber(bd)){var bd=Math.min(10,Math.floor(bd));for(var i=0;i<bd;i+=1){this.__tU+=O;}}else if(qx.lang.Type.isString(bd)){if(bd.length>10){bd=bd.slice(0,10);}this.__tU=bd;}if(bc&&(qx.lang.Type.isFunction(bc)||qx.lang.Type.isArray(bc))){this.__tV=bc;}else{this.__tV=null;}return this.__tX(p,{'':bb});},__tX:function(be,bf){var bi=this.__tT,bg,bj=bf[be];if(bj&&qx.lang.Type.isFunction(bj.toJSON)){bj=bj.toJSON(be);}else if(qx.lang.Type.isDate(bj)){bj=this.dateToJSON(bj);}if(typeof this.__tV===e){bj=this.__tV.call(bf,be,bj);}if(bj===null){return h;}if(bj===undefined){return undefined;}switch(qx.lang.Type.getClass(bj)){case R:return this.__tY(bj);case B:return isFinite(bj)?String(bj):h;case Q:return String(bj);case J:this.__tT+=this.__tU;bg=[];if(this.__tW.indexOf(bj)!==-1){throw new TypeError(V);}this.__tW.push(bj);var length=bj.length;for(var i=0;i<length;i+=1){bg[i]=this.__tX(i,bj)||h;}this.__tW.pop();if(bg.length===0){var bh=s;}else if(this.__tT){bh=E+this.__tT+bg.join(Y+this.__tT)+b+bi+l;}else{bh=N+bg.join(d)+l;}this.__tT=bi;return bh;case z:this.__tT+=this.__tU;bg=[];if(this.__tW.indexOf(bj)!==-1){throw new TypeError(V);}this.__tW.push(bj);if(this.__tV&&typeof this.__tV===f){var length=this.__tV.length;for(var i=0;i<length;i+=1){var k=this.__tV[i];if(typeof k===W){var v=this.__tX(k,bj);if(v){bg.push(this.__tY(k)+(this.__tT?g:m)+v);}}}}else{for(var k in bj){if(Object.hasOwnProperty.call(bj,k)){var v=this.__tX(k,bj);if(v){bg.push(this.__tY(k)+(this.__tT?g:m)+v);}}}}this.__tW.pop();if(bg.length===0){var bh=A;}else if(this.__tT){bh=w+this.__tT+bg.join(Y+this.__tT)+b+bi+S;}else{bh=C+bg.join(d)+S;}this.__tT=bi;return bh;}},dateToJSON:function(bk){var bl=function(n){return n<10?U+n:n;};var bm=function(n){var bn=bl(n);return n<100?U+bn:bn;};return isFinite(bk.valueOf())?bk.getUTCFullYear()+T+bl(bk.getUTCMonth()+1)+T+bl(bk.getUTCDate())+M+bl(bk.getUTCHours())+m+bl(bk.getUTCMinutes())+m+bl(bk.getUTCSeconds())+F+bm(bk.getUTCMilliseconds())+q:null;},__tY:function(bo){var bp={'\b':I,'\t':u,'\n':r,'\f':y,'\r':L,'"':G,'\\':x};var bq=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;bq.lastIndex=0;if(bq.test(bo)){return o+bo.replace(bq,function(a){var c=bp[a];return typeof c===W?c:ba+(X+a.charCodeAt(0).toString(16)).slice(-4);})+o;}else{return o+bo+o;}},parse:function(br,bs){var bt=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;bt.lastIndex=0;if(bt.test(br)){br=br.replace(bt,function(a){return ba+(X+a.charCodeAt(0).toString(16)).slice(-4);});}if(/^[\],:{}\s]*$/.test(br.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,H).replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,l).replace(/(?:^|:|,)(?:\s*\[)+/g,p))){var j=eval(K+br+D);return typeof bs===e?this.__ua({'':j},p,bs):j;}throw new SyntaxError(P);},__ua:function(bu,bv,bw){var bx=bu[bv];if(bx&&typeof bx===f){for(var k in bx){if(Object.hasOwnProperty.call(bx,k)){var v=this.__ua(bx,k,bw);if(v!==undefined){bx[k]=v;}else{delete bx[k];}}}}return bw.call(bu,bv,bx);}}});})();(function(){var a="qx.lang.Json";qx.Class.define(a,{statics:{JSON:(qx.lang.Type.getClass(window.JSON)=="JSON"&&JSON.parse('{"x":1}').x===1)?window.JSON:new qx.lang.JsonImpl(),stringify:null,parse:null},defer:function(b){b.stringify=b.JSON.stringify;b.parse=b.JSON.parse;}});})();(function(){var g="",f="<br",e=" &nbsp;",d="<br>",c=" ",b="\n",a="qx.bom.String";qx.Class.define(a,{statics:{TO_CHARCODE:{"quot":34,"amp":38,"lt":60,"gt":62,"nbsp":160,"iexcl":161,"cent":162,"pound":163,"curren":164,"yen":165,"brvbar":166,"sect":167,"uml":168,"copy":169,"ordf":170,"laquo":171,"not":172,"shy":173,"reg":174,"macr":175,"deg":176,"plusmn":177,"sup2":178,"sup3":179,"acute":180,"micro":181,"para":182,"middot":183,"cedil":184,"sup1":185,"ordm":186,"raquo":187,"frac14":188,"frac12":189,"frac34":190,"iquest":191,"Agrave":192,"Aacute":193,"Acirc":194,"Atilde":195,"Auml":196,"Aring":197,"AElig":198,"Ccedil":199,"Egrave":200,"Eacute":201,"Ecirc":202,"Euml":203,"Igrave":204,"Iacute":205,"Icirc":206,"Iuml":207,"ETH":208,"Ntilde":209,"Ograve":210,"Oacute":211,"Ocirc":212,"Otilde":213,"Ouml":214,"times":215,"Oslash":216,"Ugrave":217,"Uacute":218,"Ucirc":219,"Uuml":220,"Yacute":221,"THORN":222,"szlig":223,"agrave":224,"aacute":225,"acirc":226,"atilde":227,"auml":228,"aring":229,"aelig":230,"ccedil":231,"egrave":232,"eacute":233,"ecirc":234,"euml":235,"igrave":236,"iacute":237,"icirc":238,"iuml":239,"eth":240,"ntilde":241,"ograve":242,"oacute":243,"ocirc":244,"otilde":245,"ouml":246,"divide":247,"oslash":248,"ugrave":249,"uacute":250,"ucirc":251,"uuml":252,"yacute":253,"thorn":254,"yuml":255,"fnof":402,"Alpha":913,"Beta":914,"Gamma":915,"Delta":916,"Epsilon":917,"Zeta":918,"Eta":919,"Theta":920,"Iota":921,"Kappa":922,"Lambda":923,"Mu":924,"Nu":925,"Xi":926,"Omicron":927,"Pi":928,"Rho":929,"Sigma":931,"Tau":932,"Upsilon":933,"Phi":934,"Chi":935,"Psi":936,"Omega":937,"alpha":945,"beta":946,"gamma":947,"delta":948,"epsilon":949,"zeta":950,"eta":951,"theta":952,"iota":953,"kappa":954,"lambda":955,"mu":956,"nu":957,"xi":958,"omicron":959,"pi":960,"rho":961,"sigmaf":962,"sigma":963,"tau":964,"upsilon":965,"phi":966,"chi":967,"psi":968,"omega":969,"thetasym":977,"upsih":978,"piv":982,"bull":8226,"hellip":8230,"prime":8242,"Prime":8243,"oline":8254,"frasl":8260,"weierp":8472,"image":8465,"real":8476,"trade":8482,"alefsym":8501,"larr":8592,"uarr":8593,"rarr":8594,"darr":8595,"harr":8596,"crarr":8629,"lArr":8656,"uArr":8657,"rArr":8658,"dArr":8659,"hArr":8660,"forall":8704,"part":8706,"exist":8707,"empty":8709,"nabla":8711,"isin":8712,"notin":8713,"ni":8715,"prod":8719,"sum":8721,"minus":8722,"lowast":8727,"radic":8730,"prop":8733,"infin":8734,"ang":8736,"and":8743,"or":8744,"cap":8745,"cup":8746,"int":8747,"there4":8756,"sim":8764,"cong":8773,"asymp":8776,"ne":8800,"equiv":8801,"le":8804,"ge":8805,"sub":8834,"sup":8835,"sube":8838,"supe":8839,"oplus":8853,"otimes":8855,"perp":8869,"sdot":8901,"lceil":8968,"rceil":8969,"lfloor":8970,"rfloor":8971,"lang":9001,"rang":9002,"loz":9674,"spades":9824,"clubs":9827,"hearts":9829,"diams":9830,"OElig":338,"oelig":339,"Scaron":352,"scaron":353,"Yuml":376,"circ":710,"tilde":732,"ensp":8194,"emsp":8195,"thinsp":8201,"zwnj":8204,"zwj":8205,"lrm":8206,"rlm":8207,"ndash":8211,"mdash":8212,"lsquo":8216,"rsquo":8217,"sbquo":8218,"ldquo":8220,"rdquo":8221,"bdquo":8222,"dagger":8224,"Dagger":8225,"permil":8240,"lsaquo":8249,"rsaquo":8250,"euro":8364},escape:function(h){return qx.util.StringEscape.escape(h,qx.bom.String.FROM_CHARCODE);},unescape:function(i){return qx.util.StringEscape.unescape(i,qx.bom.String.TO_CHARCODE);},fromText:function(j){return qx.bom.String.escape(j).replace(/(  |\n)/g,function(k){var l={"  ":e,"\n":d};return l[k]||k;});},toText:function(m){return qx.bom.String.unescape(m.replace(/\s+|<([^>])+>/gi,function(n){if(n.indexOf(f)===0){return b;}else if(n.length>0&&n.replace(/^\s*/,g).replace(/\s*$/,g)==g){return c;}else{return g;}}));}},defer:function(o){o.FROM_CHARCODE=qx.lang.Object.invert(o.TO_CHARCODE);}});})();(function(){var g=";",f="&",e='X',d="",c='#',b="&#",a="qx.util.StringEscape";qx.Class.define(a,{statics:{escape:function(h,j){var m,o=d;for(var i=0,l=h.length;i<l;i++){var n=h.charAt(i);var k=n.charCodeAt(0);if(j[k]){m=f+j[k]+g;}else{if(k>0x7F){m=b+k+g;}else{m=n;}}o+=m;}return o;},unescape:function(p,q){return p.replace(/&[#\w]+;/gi,function(r){var s=r;var r=r.substring(1,r.length-1);var t=q[r];if(t){s=String.fromCharCode(t);}else{if(r.charAt(0)==c){if(r.charAt(1).toUpperCase()==e){t=r.substring(2);if(t.match(/^[0-9A-Fa-f]+$/gi)){s=String.fromCharCode(parseInt(t,16));}}else{t=r.substring(1);if(t.match(/^\d+$/gi)){s=String.fromCharCode(parseInt(t,10));}}}}return s;});}}});})();(function(){var bU="",bT='</div>',bS='<div class="item-detail-text">',bR='<div class="item-detail-headline">',bQ="#",bP='</td>',bO="'",bN="(",bM='">',bL=" ",bv=".",bu=",'",bt=")",bs=".toggleShowItemDetails('",br='"',bq="&nbsp;",bp='<div class="item-detail-error">',bo="none",bn="</p>",bm='" onclick="',cc=')">',cd="properties",ca='>',cb="events",bX="methods",bY="mixin",bV='.togglePanelVisibility(',bW='</span>',ce="apiviewer.ObjectRegistry.getObjectFromHashCode('",cf='<td class="type">',bE='<td class="toggle">',bD="apiviewer/image/open.gif",bG='<div class="info-panel"><h2>',bF="apiviewer.dao.Node",bI="Inherited from:",bH='open.gif',bK='\'); return false;"',bJ=' title="',bC='//',bB="</span>",a="'>",b="Documentation errors:",c="<span class='",d='package',e='#',f='" onmouseup="apiviewer.TabViewController.instance.onSelectItem(\'',g='" href="',h="Included from mixin:",k=' onclick="',m=", Column:",cj="; ",ci="&#160;",ch="margin-left:18px;",cg='<td class="text">',cn=" <br/>",cm="See also:",cl="Deprecated:",ck='<a style="',cp='<img src="',co=" is deprecated!",L='apiviewer/image/',M='apiviewer/image/open.gif',J="[]",K="apiviewer.ui.panels.InfoPanel",P='close.gif',Q="_itemName",N='<',O='" alt="',H="Boolean",I="Line: ",u='<h3',t="This ",w='</h2><div></div></div>',v='<span onclick="',q="item-private",p="class",s="item-internal",r="Access:",o="interface",n='title="',V='<td class="icon" ',W='" onclick="return false;"',X='</h3>',Y="')",R=" | ",S=", ",T="private",U="Element",ba='<tr class="',bb='apiviewer/image/close.gif',E='</tr>',D="item-deprecated",C="item-protected",B='<div _itemName="',A='',z='</a></span>',y="qx.client",x="Required by:",G=')"/>',F="overlay_",bc='<img class="openclose" src="',bd="String",be="Overrides:",bf="_applyElement",bg="internal",bh='<span style="white-space: nowrap;">',bi="TBODY",bj='<div class="item-desc">',bk='<table cellspacing="0" cellpadding="0" class="info" width="100%">',bl=')"/> ',bz="abstract",by="protected",bx="webkit",bw='</table>',bA="undefined";qx.Class.define(K,{type:bz,extend:qx.core.Object,construct:function(cq,cr){qx.core.Object.call(this);this.setListName(cq);this._labelText=cr;apiviewer.ObjectRegistry.register(this);},properties:{element:{check:U,init:null,nullable:true,apply:bf},listName:{check:bd},isOpen:{check:H,init:true},docNode:{check:bF,nullable:true}},statics:{ITEM_SPEC_REGEX:/^(([\w\.]+)?(#\w+(\([^\)]*\))?)?)(\s+(.*))?$/,SENTENCE_END_REGEX:/[^\.].\.(\s|<)/,resolveLinkAttributes:function(cs,ct){var cw=/\{@link([^\}]*)\}/mg;var cv=new qx.util.StringBuilder();var cu;var cx=0;while((cu=cw.exec(cs))!=null){cv.add(cs.substring(cx,cu.index)+this.createItemLinkHtml(cu[1],ct));cx=cu.index+cu[0].length;}cv.add(cs.substring(cx,cs.length));return cv.get();},createItemLinkHtml:function(cy,cz,cA,cB){if(cA==null){cA=true;}cy=qx.lang.String.trim(cy);if(cy.charAt(0)==br||cy.charAt(0)==N){return cy;}else{var cE=this.ITEM_SPEC_REGEX.exec(cy);if(cE==null){return cy;}else{var cK=cE[2];var cS=cE[3];var cJ=cE[6];var cD=bU;if(cK==null||cK.length==0){cK=cz.getFullName();}else if(cz&&cK.indexOf(bv)==-1){var name=cz.getName();if(cz instanceof apiviewer.dao.Package){var cG=cz.getFullName();}else{var cQ=cz.getFullName();var cG=cQ.substring(0,cQ.length-name.length-1);}cK=cG+bv+cK;}if(cJ==null||cJ.length==0){cJ=cE[1];}if(cA){var cO=apiviewer.dao.Class.getClassByName(cK);if(cO){var cT;if(cS){var cI=cS.substring(1);var cM=cI.indexOf(bN);if(cM!=-1){cI=qx.lang.String.trim(cI.substring(0,cM));}cT=this.__St(cI,cO);}else{cT=cO;}if(cT){if(cT.getNodeType()!==d){cK=cT.getClass().getFullName();}var cL=apiviewer.TreeUtil.getIconUrl(cT);var cC=apiviewer.ui.ClassViewer.createImageHtml(cL);if(qx.core.Variant.isSet(y,bx)){if(cC.indexOf(F)!==-1){cD=ch;}}}}}var cR=cK+(cS?cS:bU);var cP,cH,cN;if(qx.bom.client.Engine.OPERA&&qx.bom.client.Engine.VERSION>9){cP=location.protocol;cH=location.host;cN=location.pathname;}else{cP=window.location.protocol;cH=window.location.host;cN=window.location.pathname;}var cF=[bh,(typeof cC!=bA?cC:bU),ck+cD+g+cP,bC,cH,cN,e,cR,W,f,cR,bK,bJ,cR,bM,cJ,z];return cF.join(bU);}}},createSeeAlsoHtml:function(cU){var cV=cU.getSee();if(cV.length>0){var cX=new qx.util.StringBuilder();for(var i=0;i<cV.length;i++){if(cX.length!=0){cX.add(S);}cX.add(this.createItemLinkHtml(cV[i],cU.getClass()));}if(!cX.isEmpty()){var cW=new qx.util.StringBuilder();cW.add(bR,cm,bT,bS,cX,bT);return cW.get();}}return bU;},createInheritedFromHtml:function(cY,da){if(cY.getClass().getType()!=bY&&cY.getClass()!=da){var db=new qx.util.StringBuilder(bR,bI,bT,bS,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(cY.getClass().getFullName()+bQ+cY.getName()),bT);return db.get();}else{return bU;}},createOverwriddenFromHtml:function(dc){if(dc.getOverriddenFrom()){var dd=new qx.util.StringBuilder(bR,be,bT,bS,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(dc.getOverriddenFrom().getFullName()+bQ+dc.getName()),bT);return dd.get();}else{return bU;}},createIncludedFromHtml:function(de,df){if(de.getClass()!=df){if(de.getClass().getType()==bY){var dg=new qx.util.StringBuilder(bR,h,bT,bS,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(de.getClass().getFullName()+bQ+de.getName()),bT);return dg.get();}}else{return bU;}},__St:function(dh,di){var dk=di.getItem(dh);if(dk){return dk;}else{var dl=di.getClassHierarchy();for(var i=0,l=dl.length;i<l;i++){var dj=dl[i];dk=dj.getItem(dh);if(dk){break;}}return dk;}},createDescriptionHtml:function(dm,dn,dp){var dq=dm.getDescription();if(dq){if(!dp){dq=this.__Su(dq);}return bj+this.resolveLinkAttributes(dq,dn)+bT;}else{return bU;}},__Su:function(dr){var du=dr;var dt=du.indexOf(bn);if(dt!=-1){du=du.substr(0,dt+4);var ds=this.SENTENCE_END_REGEX.exec(du);if(ds!=null){du=dr.substring(0,ds.index+ds[0].length-1)+bn;}}return du;},descriptionHasDetails:function(dv){var dw=dv.getDescription();if(dw){return this.__Su(dw)!=dw;}else{return false;}},createTypeHtml:function(dx,dy,dz){if(dz==null){dz=true;}var dF=[];var dA,dB,dC;if(dx){dF=dx.getTypes();}var dD=new qx.util.StringBuilder();if(dF.length==0){dD.add(dy);}else{if(dF.length>1){dD.add(bN);}for(var j=0;j<dF.length;j++){if(j>0){dD.add(R);}dB=dF[j].type;dA=dF[j].dimensions;if(apiviewer.ui.ClassViewer.PRIMITIVES[dB]){dD.add(dB);}else{dC=dB;if(dz){var dE=dB.lastIndexOf(bv);if(dE!=-1){dC+=bL+dB.substring(dE+1);}}dD.add(apiviewer.ui.panels.InfoPanel.createItemLinkHtml(dC,dx.getClass(),false,true));}if(dA){for(var i=0;i<parseInt(dA);i++){dD.add(J);}}}if(dF.length>1){dD.add(bt);}}return dD.get();},createErrorHtml:function(dG,dH){var dI=dG.getDocNode();var dJ=dI.getErrors();if(dJ.length>0){var dK=new qx.util.StringBuilder(bp,b,bT);for(var i=0;i<dJ.length;i++){dK.add(bS,dJ[i].attributes.msg,cn);dK.add(bN);if(dG.getClass()!=dH){dK.add(dG.getClass().getFullName(),cj);}dK.add(I,dJ[i].attributes.line,m,dJ[i].attributes.column+bt,bT);}return dK.get();}else{return bU;}},createDeprecationHtml:function(dL,dM){if(!dL.isDeprecated()){return bU;}var dN=new qx.util.StringBuilder();dN.add(bp,cl,bT);dN.add(bS);var dO=dL.getDeprecationText();if(dO){dN.add(dO);}else{dN.add(t,dM,co);}dN.add(bT);return dN.get();},createAccessHtml:function(dP){if(dP.isPublic()){return bU;}var dR=new qx.util.StringBuilder();dR.add(bR,r,bT);dR.add(bS);var dQ=[];if(dP.isPrivate()){dQ.push(T);}if(dP.isInternal()){dQ.push(bg);}if(dP.isProtected()){dQ.push(by);}dR.add(dQ.join(bL));dR.add(bT);return dR.get();},createInfoRequiredByHtml:function(dS){var dU=new qx.util.StringBuilder();var dT=dS.getRequiredBy();if(dT.length>0){dU.add(bR,x,bT);for(var i=0;i<dT.length;i++){dU.add(bS,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(dT[i].getFullName()+bQ+dS.getName()),bT);}}return dU.get();},setTitleClass:function(dV,dW){var dX=[c,bU,a,dW,bB];dX[1]=this.getItemCssClasses(dV);return dX.join(bU);},getItemCssClasses:function(dY){var ea=[];if(dY.isDeprecated()){ea.push(D);}if(dY.isPrivate()){ea.push(q);}if(dY.isInternal()){ea.push(s);}if(dY.isProtected()){ea.push(C);}return ea.join(bL);}},members:{canDisplayItem:function(eb){return (eb.getListName()==this.getListName());},getItemTypeHtml:function(ec,ed){throw new Error("Abstract method called!");},getItemTitleHtml:function(ee,ef){throw new Error("Abstract method called!");},getItemTextHtml:function(eg,eh,ei){throw new Error("Abstract method called!");},getItemTooltip:function(ej,ek){return bU;},getItemHtml:function(el,em,en){if((el instanceof apiviewer.dao.Class)||el instanceof apiviewer.dao.Package){var es=el.getPackage();}else{var es=el.getClass();}var er=new qx.util.StringBuilder();var et=(es!=em)&&es.getType()==p;var eq=apiviewer.TreeUtil.getIconUrl(el,et);er.add(ba,apiviewer.ui.panels.InfoPanel.getItemCssClasses(el),bM);var eu=this.getItemTooltip(el,em);var ep=eu?n+eu+O+eu+br:A;er.add(V,ep,ca,apiviewer.ui.ClassViewer.createImageHtml(eq),bP);var eo=this.getItemTypeHtml(el,em);er.add(cf,((eo)?(eo+bq):bq),bP);er.add(bE);if(this.itemHasDetails(el,em)){er.add(cp,qx.util.ResourceManager.getInstance().toUri(bD),bm,this.__Sv(this),bs,el.getName(),bO,((es!=em)?bu+es.getFullName()+bO:bU),G);}else{er.add(ci);}er.add(bP);er.add(cg);er.add(u);if(this.itemHasDetails(el,em)){er.add(k,this.__Sv(this),bs,el.getName(),bO,((es!=em)?bu+es.getFullName()+bO:bU),cc);}else{er.add(ca);}er.add(this.getItemTitleHtml(el,em));er.add(X);er.add(B,el.getName(),bM);er.add(this.getItemTextHtml(el,em,en));er.add(bT);er.add(bP);er.add(E);return er.get();},itemHasDetails:qx.lang.Function.returnTrue,__Sv:function(ev){return ce+ev.toHashCode()+Y;},getPanelHtml:function(ew){var ey=this._labelText.charAt(0).toUpperCase()+this._labelText.substring(1);var ex=new qx.util.StringBuilder(bG);ex.add(bc,qx.util.ResourceManager.getInstance().toUri(L+(this.getIsOpen()?P:bH)),bm,this.__Sv(ew),bV+this.__Sv(this),bl,v,this.__Sv(ew),bV,this.__Sv(this),cc,ey,bW);ex.add(w);return ex.get();},_getPanelItems:function(ez,eA){if(!eA){return [];}var eB=this.getListName();var eD=[];var eG={};if(ez&&(eB==cb||eB==cd||eB==bX)){if(eA.getType()==o){var eE=eA.getInterfaceHierarchy();}else{var eE=eA.getClassHierarchy();}}else{eE=[eA];}for(var eH=0;eH<eE.length;eH++){var eF=eE[eH];var eC=eF.getItemList(eB);if(eB==cb||eB==cd||eB==bX){qx.lang.Array.append(eC,eF.getNodesOfTypeFromMixins(this.getListName()));}for(var i=0;i<eC.length;i++){var name=eC[i].getName();if(!(Object.prototype.hasOwnProperty.call(eG,name))){eG[name]=eF;eD.push(eC[i]);}}}return eD;},__Sw:function(eI,eJ,eK,eL,eM){var eO=eI.concat();for(var i=eI.length-1;i>=0;i--){var eN=eI[i];if(eN.isPropertyGenerated()&&!eJ){qx.lang.Array.removeAt(eO,i);}else if(eN.isPrivate()&&!eL){qx.lang.Array.removeAt(eO,i);}else if(eN.isProtected()&&!eK){qx.lang.Array.removeAt(eO,i);}else if(eN.isInternal()&&!eM){qx.lang.Array.removeAt(eO,i);}}return eO;},_sortItems:function(eP){eP.sort(function(eQ,eR){var eU=0;if(eQ.isInternal()){eU+=4;}if(eQ.isPrivate()){eU+=2;}if(eQ.isProtected()){eU+=1;}var eT=0;if(eR.isInternal()){eT+=4;}if(eR.isPrivate()){eT+=2;}if(eR.isProtected()){eT+=1;}if(eU==eT){var eV=eQ.getName();var eS=eR.getName();return eV.toLowerCase()<eS.toLowerCase()?-1:1;}else{return eU-eT;}});},_displayNodes:function(eW,eX){if(eW&&eW.length>0){var eY=new qx.util.StringBuilder(bk);for(var i=0;i<eW.length;i++){eY.add(this.getItemHtml(eW[i],eX,false));}eY.add(bw);this.getBodyElement().innerHTML=eY.get();apiviewer.ui.AbstractViewer.fixLinks(this.getBodyElement());apiviewer.ui.AbstractViewer.highlightCode(this.getBodyElement());this.getBodyElement().style.display=!this.getIsOpen()?bo:bU;this.getElement().style.display=bU;}else{this.getElement().style.display=bo;}},update:function(fa,fb){if(!this.getElement()){return;}this.setDocNode(fb);var ff=fa.getShowInherited();var fc=this._getPanelItems(ff,fb);if(fc&&fc.length>0){var fh=fa.getExpandProperties();var fd=fa.getShowProtected();var fg=fa.getShowPrivate();var fe=fg;fc=this.__Sw(fc,fh,fd,fg,fe);this._sortItems(fc);}this._displayNodes(fc,fb);},_applyElement:function(fi){this._titleElement=fi.firstChild;this._bodyElement=fi.lastChild;},getTitleElement:function(){return this._titleElement;},getBodyElement:function(){return this._bodyElement;},getItemElement:function(name){var fj=this.getBodyElement().getElementsByTagName(bi)[0].childNodes;for(var i=0;i<fj.length;i++){if(fj[i].childNodes[3].childNodes[1].getAttribute(Q)==name){return fj[i].childNodes[3].childNodes[1];}}},toggleShowItemDetails:function(fk,fl){try{var fn=this.getItemElement(fk);if(!fn){throw Error("Element for name '"+fk+"' not found!");}var fm=fn._showDetails?!fn._showDetails:true;fn._showDetails=fm;if(fl){var fq=apiviewer.dao.Class.getClassByName(fl);}else{fq=this.getDocNode();}var fo=fq.getItemByListAndName(this.getListName(),fk);var fp=fn.parentNode.previousSibling.firstChild;fp.src=qx.util.ResourceManager.getInstance().toUri(fm?bb:M);fn.innerHTML=this.getItemTextHtml(fo,this.getDocNode(),fm);apiviewer.ui.AbstractViewer.fixLinks(fn);apiviewer.ui.AbstractViewer.highlightCode(fn);}catch(fr){this.error("Toggling item details failed");this.error(fr);}}},destruct:function(){this._titleElement=this._bodyElement=null;}});})();(function(){var k='</div>',j='<div class="item-detail-text">',h='<div class="item-detail-headline">',g='</span>',f="var",e='<span class="parameter-type">',d=" ",c="function",b='</span> <code>',a="<code>",D="Parameters:",C="Throws:",B="Apply method of property:",A='</code>',z=") ",y="</code>",x="apiviewer.ui.panels.MethodPanel",w="void",v='<span class="method-signature"><span class="parenthesis">(</span>',u="Returns:",r=" (default: ",s="[]",p='<span class="separator">,</span> ',q='<span class="parenthesis">)</span></span>',n="Creates a new instance of ",o='<span class="item-detail-optional">',l="?",m="abstract ",t=".";qx.Class.define(x,{extend:apiviewer.ui.panels.InfoPanel,members:{getItemTitleHtml:function(E){if(E.isConstructor()){var I=E.getClass().getName();}else{I=E.getName();}var F=new qx.util.StringBuilder(apiviewer.ui.panels.InfoPanel.setTitleClass(E,I));F.add(v);var G=E.getParams();for(var i=0;i<G.length;i++){var H=G[i];if(i!=0){F.add(p);}F.add(e,apiviewer.ui.panels.InfoPanel.createTypeHtml(H,f),b,H.getName(),A);if(H.getDefaultValue()){F.add(l);}}F.add(q);return F.get();},getItemTypeHtml:function(J){var K=new qx.util.StringBuilder();if(J.isAbstract()){K.add(m);}if(!J.isConstructor()){K.add(apiviewer.ui.panels.InfoPanel.createTypeHtml(J.getDocNode().getReturn(),w));}return K.get();},getItemTextHtml:function(L,M,N){var U=L.getClass();var X=new qx.util.StringBuilder();if(L.isConstructor()&&!L.getDescription()){X.add(n,U.getName(),t);}else{X.add(apiviewer.ui.panels.InfoPanel.createDescriptionHtml(L,U,N));}if(N){var V=L.getDocNode().getParams();if(V.length>0){X.add(h,D,k);for(var i=0;i<V.length;i++){var R=V[i];var O=R.getType()?R.getType():f;var T=R.getArrayDimensions();if(T){for(var i=0;i<T;i++){O+=s;}}var Y=R.getDefaultValue();X.add(j);if(Y){X.add(o);}X.add(a,R.getName(),y);if(Y){X.add(r,Y,z,g);}var ba=R.getDescription();if(ba){X.add(d,apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(ba,U));}X.add(k);}}var P=L.getDocNode().getReturn();if(P){var ba=P.getDescription();if(ba){X.add(h,u,k,j,apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(ba,U),k);}}if(L.getApply()){X.add(h,B,k,j,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(L.getApply(),L.getClass(),true,true),k);}var S=L.getDocNode().getThrows();if(S.length>0){X.add(h,C,k);for(var i=0;i<S.length;i++){var W=S[i];var Q=W.getType()?W.getType():W.getDefaultType();X.add(j);X.add(e,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(Q),g);var ba=W.getDescription();if(ba){X.add(d,apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(ba,U));}X.add(k);}}X.add(apiviewer.ui.panels.InfoPanel.createAccessHtml(L));X.add(apiviewer.ui.panels.InfoPanel.createIncludedFromHtml(L,M));X.add(apiviewer.ui.panels.InfoPanel.createOverwriddenFromHtml(L));X.add(apiviewer.ui.panels.InfoPanel.createInheritedFromHtml(L,M));X.add(apiviewer.ui.panels.InfoPanel.createInfoRequiredByHtml(L));X.add(apiviewer.ui.panels.InfoPanel.createSeeAlsoHtml(L));X.add(apiviewer.ui.panels.InfoPanel.createErrorHtml(L,M));X.add(apiviewer.ui.panels.InfoPanel.createDeprecationHtml(L,c));}return X.get();},itemHasDetails:function(bb,bc){var bd=bb.getDocNode();var be=bd.getReturn()&&bd.getReturn().getDescription();return (bb.getClass()!=bc||bb.getOverriddenFrom()!=null||bb.getRequiredBy().length>0||bd.getParams().length>0||bd.getThrows().length>0||be||bb.getSee().length>0||bb.getErrors().length>0||bb.isDeprecated()||bb.getApply()||apiviewer.ui.panels.InfoPanel.descriptionHasDetails(bb));}}});})();(function(){var h="",g="deprecated",f="internal",e="protected",d="errors",c="apiviewer.dao.Node",b="string",a="private";qx.Class.define(c,{extend:qx.core.Object,construct:function(j){qx.core.Object.call(this);this._docNode=j;j.children=j.children||[];j.attributes=j.attributes||{};j.cls=this;this._initializeFields();for(var i=0;i<j.children.length;i++){var k=j.children[i];if(!this._addChildNode(k)){throw new Error("Unknown child type: "+k.type+" node: "+qx.util.Json.stringify(k));}}},members:{getNode:function(){return this._docNode;},getNodeType:function(){return this._docNode.type;},getErrors:function(){return this._errors;},getDeprecationText:function(){return this._deprecated||h;},isDeprecated:function(){return typeof (this._deprecated)==b?true:false;},isInternal:function(){return this._docNode.attributes.access==f;},isPrivate:function(){return this._docNode.attributes.access==a;},isProtected:function(){return this._docNode.attributes.access==e;},isPropertyGenerated:function(){return this._docNode.attributes.fromProperty!=null;},isPublic:function(){return (!this.isPrivate()&&!this.isProtected()&&!this.isInternal());},hasWarning:function(){return this._docNode.attributes.hasWarning||false;},_createNodeList:function(l,m,n,o){if(m){var p=[];for(var i=0;i<l.children.length;i++){p.push(new m(l.children[i],n,o));}return p;}else{return l.children;}},_initializeFields:function(){this._errors=[];},_addChildNode:function(q){switch(q.type){case g:this._deprecated=q.children?q.children[0].attributes.text||h:h;break;case d:this._errors=this._createNodeList(q);break;default:return false;}return true;}},destruct:function(){this._docNode=this._errors=null;}});})();(function(){var k="",h="getClasses",g="getPackages",f="functions",e="getFunctions",d="packages",c="desc",b="classes",a="apiviewer.dao.Package";qx.Class.define(a,{extend:apiviewer.dao.Node,construct:function(l,m){apiviewer.dao.Node.call(this,l);this._package=m;apiviewer.dao.Class.registerClass(this);},members:{getName:function(){return this._docNode.attributes.name;},getFullName:function(){return this._docNode.attributes.fullName||k;},getDescription:function(){return this._desc||k;},getClasses:function(){return this._classes;},getFunctions:function(){return this._functions;},getPackages:function(){return this._packages;},getPackage:function(){return this._package;},addClass:function(n){var o=n.getFullName();var p=this.getClasses();for(var i=0;i<p.length;i++){if(p[i].getFullName()==o){p[i]=n;return;}}p.push(n);},getItem:function(q){var r=[h,g];for(var i=0;i<r.length;i++){var s=this[r[i]]();for(var j=0;j<s.length;j++){if(q==s[j].getName()){return s[j];}}}},getItemList:function(t){var u={"classes":h,"packages":g,"functions":e};return this[u[t]]();},getItemByListAndName:function(v,w){var x=this.getItemList(v);for(var j=0;j<x.length;j++){if(w==x[j].getName()){return x[j];}}},_initializeFields:function(){apiviewer.dao.Node.prototype._initializeFields.call(this);this._classes=[];this._packages=[];this._functions=[];},_addChildNode:function(y){switch(y.type){case b:this._classes=this._createNodeList(y,apiviewer.dao.Class,this);break;case f:this._functions=this._createNodeList(y,apiviewer.dao.Method,this);break;case d:this._packages=this._createNodeList(y,apiviewer.dao.Package,this);break;case c:this._desc=y.attributes.text||k;break;default:return apiviewer.dao.Node.prototype._addChildNode.call(this,y);}return true;}},destruct:function(){this._package=this._classes=this._functions=this._packages=null;}});})();(function(){var n=",",m="",k="string",j="null",h='"',g=':',f="qx.jsonDebugging",e='-',d='\\u00',c="__qL",N="new Date(Date.UTC(",M='\\\\',L='\\f',K='\\"',J='Z',I="))",H="__qB",G="__qD",F="}",E='(',u='.',v="{",s='\\r',t=":",q='\\t',r="]",o="[",p="__qE",w="qx.jsonEncodeUndefined",x='T',z='\\b',y="__qC",B="qx.util.Json",A=')',D='\\n',C="__qM";qx.Class.define(B,{statics:{__qz:null,BEAUTIFYING_INDENT:"  ",BEAUTIFYING_LINE_END:"\n",CONVERT_DATES:null,__qA:{"function":H,"boolean":y,"number":G,"string":p,"object":c,"undefined":C},__qB:function(O,P){return String(O);},__qC:function(Q,R){return String(Q);},__qD:function(S,T){return isFinite(S)?String(S):j;},__qE:function(U,V){var W;if(/["\\\x00-\x1f]/.test(U)){W=U.replace(/([\x00-\x1f\\"])/g,qx.util.Json.__qG);}else{W=U;}return h+W+h;},__qF:{'\b':z,'\t':q,'\n':D,'\f':L,'\r':s,'"':K,'\\':M},__qG:function(a,b){var X=qx.util.Json.__qF[b];if(X){return X;}X=b.charCodeAt();return d+Math.floor(X/16).toString(16)+(X%16).toString(16);},__qH:function(Y,ba){var bc=[],bf=true,be,bb;var bd=qx.util.Json.__qO;bc.push(o);if(bd){qx.util.Json.__qI+=qx.util.Json.BEAUTIFYING_INDENT;bc.push(qx.util.Json.__qI);}for(var i=0,l=Y.length;i<l;i++){bb=Y[i];be=this.__qA[typeof bb];if(be){bb=this[be](bb,i+m);if(typeof bb==k){if(!bf){bc.push(n);if(bd){bc.push(qx.util.Json.__qI);}}bc.push(bb);bf=false;}}}if(bd){qx.util.Json.__qI=qx.util.Json.__qI.substring(0,qx.util.Json.__qI.length-qx.util.Json.BEAUTIFYING_INDENT.length);bc.push(qx.util.Json.__qI);}bc.push(r);return bc.join(m);},__qJ:function(bg,bh){if(!qx.util.Json.CONVERT_DATES){if(bg.toJSON&&!qx.bom.client.Engine.OPERA){return bg.toJSON();}var bi=qx.util.format.NumberFormat.getInstance();bi.setMinimumIntegerDigits(2);var bk=bg.getUTCFullYear()+e+bi.format(bg.getUTCMonth()+1)+e+bi.format(bg.getUTCDate())+x+bi.format(bg.getUTCHours())+g+bi.format(bg.getUTCMinutes())+g+bi.format(bg.getUTCSeconds())+u;bi.setMinimumIntegerDigits(3);return bk+bi.format(bg.getUTCMilliseconds())+J;}else{var bj=bg.getUTCFullYear()+n+bg.getUTCMonth()+n+bg.getUTCDate()+n+bg.getUTCHours()+n+bg.getUTCMinutes()+n+bg.getUTCSeconds()+n+bg.getUTCMilliseconds();return N+bj+I;}},__qK:function(bl,bm){var bp=[],br=true,bo,bn;var bq=qx.util.Json.__qO;bp.push(v);if(bq){qx.util.Json.__qI+=qx.util.Json.BEAUTIFYING_INDENT;bp.push(qx.util.Json.__qI);}for(var bm in bl){bn=bl[bm];bo=this.__qA[typeof bn];if(bo){bn=this[bo](bn,bm);if(typeof bn==k){if(!br){bp.push(n);if(bq){bp.push(qx.util.Json.__qI);}}bp.push(this.__qE(bm),t,bn);br=false;}}}if(bq){qx.util.Json.__qI=qx.util.Json.__qI.substring(0,qx.util.Json.__qI.length-qx.util.Json.BEAUTIFYING_INDENT.length);bp.push(qx.util.Json.__qI);}bp.push(F);return bp.join(m);},__qL:function(bs,bt){if(bs){if(qx.lang.Type.isFunction(bs.toJSON)&&bs.toJSON!==this.__qz){return this.__qN(bs.toJSON(bt),bt);}else if(qx.lang.Type.isDate(bs)){return this.__qJ(bs,bt);}else if(qx.lang.Type.isArray(bs)){return this.__qH(bs,bt);}else if(qx.lang.Type.isObject(bs)){return this.__qK(bs,bt);}return m;}return j;},__qM:function(bu,bv){if(qx.core.Setting.get(w)){return j;}},__qN:function(bw,bx){return this[this.__qA[typeof bw]](bw,bx);},stringify:function(by,bz){this.__qO=bz;this.__qI=this.BEAUTIFYING_LINE_END;var bA=this.__qN(by,m);if(typeof bA!=k){bA=null;}if(qx.core.Setting.get(f)){qx.log.Logger.debug(this,"JSON request: "+bA);}return bA;},parse:function(bB,bC){if(bC===undefined){bC=true;}if(qx.core.Setting.get(f)){qx.log.Logger.debug(this,"JSON response: "+bB);}if(bC){if(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(bB.replace(/"(\\.|[^"\\])*"/g,m))){throw new Error("Could not parse JSON string!");}}try{var bD=(bB&&bB.length>0)?eval(E+bB+A):null;return bD;}catch(bE){throw new Error("Could not evaluate JSON string: "+bE.message);}}},settings:{"qx.jsonEncodeUndefined":true,"qx.jsonDebugging":false},defer:function(bF){bF.__qz=Date.prototype.toJSON;}});})();(function(){var a="qx.util.format.IFormat";qx.Interface.define(a,{members:{format:function(b){},parse:function(c){}}});})();(function(){var t="",s="Number",r="-",q="0",p="String",o="changeNumberFormat",n='(',m="g",l="Boolean",k="$",d="NaN",j='([0-9]{1,3}(?:',g='{0,1}[0-9]{3}){0,})',c='\\d+){0,1}',b="qx.util.format.NumberFormat",f="Infinity",e="^",h=".",a="-Infinity",i='([-+]){0,1}';qx.Class.define(b,{extend:qx.core.Object,implement:qx.util.format.IFormat,construct:function(u){qx.core.Object.call(this);this.__ro=u;},statics:{getIntegerInstance:function(){var v=qx.util.format.NumberFormat;if(v._integerInstance==null){v._integerInstance=new v();v._integerInstance.setMaximumFractionDigits(0);}return v._integerInstance;},getInstance:function(){if(!this._instance){this._instance=new this;}return this._instance;}},properties:{minimumIntegerDigits:{check:s,init:0},maximumIntegerDigits:{check:s,nullable:true},minimumFractionDigits:{check:s,init:0},maximumFractionDigits:{check:s,nullable:true},groupingUsed:{check:l,init:true},prefix:{check:p,init:t,event:o},postfix:{check:p,init:t,event:o}},members:{__ro:null,format:function(w){switch(w){case Infinity:return f;case -Infinity:return a;case NaN:return d;}var A=(w<0);if(A){w=-w;}if(this.getMaximumFractionDigits()!=null){var H=Math.pow(10,this.getMaximumFractionDigits());w=Math.round(w*H)/H;}var G=String(Math.floor(w)).length;var x=t+w;var D=x.substring(0,G);while(D.length<this.getMinimumIntegerDigits()){D=q+D;}if(this.getMaximumIntegerDigits()!=null&&D.length>this.getMaximumIntegerDigits()){D=D.substring(D.length-this.getMaximumIntegerDigits());}var C=x.substring(G+1);while(C.length<this.getMinimumFractionDigits()){C+=q;}if(this.getMaximumFractionDigits()!=null&&C.length>this.getMaximumFractionDigits()){C=C.substring(0,this.getMaximumFractionDigits());}if(this.getGroupingUsed()){var z=D;D=t;var F;for(F=z.length;F>3;F-=3){D=t+qx.locale.Number.getGroupSeparator(this.__ro)+z.substring(F-3,F)+D;}D=z.substring(0,F)+D;}var B=this.getPrefix()?this.getPrefix():t;var y=this.getPostfix()?this.getPostfix():t;var E=B+(A?r:t)+D;if(C.length>0){E+=t+qx.locale.Number.getDecimalSeparator(this.__ro)+C;}E+=y;return E;},parse:function(I){var N=qx.lang.String.escapeRegexpChars(qx.locale.Number.getGroupSeparator(this.__ro)+t);var L=qx.lang.String.escapeRegexpChars(qx.locale.Number.getDecimalSeparator(this.__ro)+t);var J=new RegExp(e+qx.lang.String.escapeRegexpChars(this.getPrefix())+i+j+N+g+n+L+c+qx.lang.String.escapeRegexpChars(this.getPostfix())+k);var M=J.exec(I);if(M==null){throw new Error("Number string '"+I+"' does not match the number format");}var O=(M[1]==r);var Q=M[2];var P=M[3];Q=Q.replace(new RegExp(N,m),t);var K=(O?r:t)+Q;if(P!=null&&P.length!=0){P=P.replace(new RegExp(L),t);K+=h+P;}return parseFloat(K);}}});})();(function(){var d="cldr_number_decimal_separator",c="cldr_number_percent_format",b="qx.locale.Number",a="cldr_number_group_separator";qx.Class.define(b,{statics:{getDecimalSeparator:function(e){return qx.locale.Manager.getInstance().localize(d,[],e);},getGroupSeparator:function(f){return qx.locale.Manager.getInstance().localize(a,[],f);},getPercentFormat:function(g){return qx.locale.Manager.getInstance().localize(c,[],g);}}});})();(function(){var m="",k=",",h="constructor",g="appearances",f="getAppearances",e="getStatics",d="getChildControls",c="constants",b="getProperties",a="methods",D="properties",C="getEvents",B="getMembers",A="events",z="methods-static",y="getConstants",x="apiviewer.dao.Class",w="superMixins",v="childControls",u="class",s="_constructor",t="desc",q="see",r="getConstructor",o="getSuperInterfaces",p="superInterfaces",n="getSuperMixins";qx.Class.define(x,{extend:apiviewer.dao.Node,construct:function(E,F){apiviewer.dao.Node.call(this,E);this.self(arguments).registerClass(this);this._package=F;},statics:{_class_registry:{},_top_level_classes:[],registerClass:function(G){if(!G.getFullName()){return;}this._class_registry[G.getFullName()]=G;if(!G._docNode.attributes.superClass){this._top_level_classes.push(G);}},getClassByName:function(H){return this._class_registry[H];},getAllTopLevelClasses:function(){return this._top_level_classes;}},members:{getName:function(){return this._docNode.attributes.name;},getClass:function(){return this;},getPackage:function(){return this._package;},isLoaded:function(){return this._docNode.attributes.externalRef!=true;},getFullName:function(){return this._docNode.attributes.fullName||m;},getPackageName:function(){return this._docNode.attributes.packageName||m;},getDescription:function(){return this._desc||m;},getType:function(){return this._docNode.attributes.type||u;},isAbstract:function(){return this._docNode.attributes.isAbstract||false;},isStatic:function(){return this._docNode.attributes.isStatic||false;},isSingleton:function(){return this._docNode.attributes.isSingleton||false;},getSee:function(){return this._see;},getSuperClass:function(){return this.self(arguments).getClassByName(this._docNode.attributes.superClass);},getChildClasses:function(){return this._docNode.attributes.childClasses?this._docNode.attributes.childClasses.split(k):[];},getInterfaces:function(){return this._docNode.attributes.interfaces?this._docNode.attributes.interfaces.split(k):[];},getMixins:function(){return this._docNode.attributes.mixins?this._docNode.attributes.mixins.split(k):[];},getImplementations:function(){return this._docNode.attributes.implementations?this._docNode.attributes.implementations.split(k):[];},getIncluder:function(){return this._docNode.attributes.includer?this._docNode.attributes.includer.split(k):[];},getConstructor:function(){if(this._constructor!=null){return this._constructor;}var I=apiviewer.TreeUtil.getChild(this.getNode(),h);if(I){this._constructor=new apiviewer.dao.Method(I.children[0],this,I.type);}else{this._constructor=m;var K=this.getSuperClass();while(K){var J=K.getConstructor();if(J){var I=J.getNode();this._constructor=new apiviewer.dao.Method(I,this,h);break;}K=K.getSuperClass();}}return this._constructor;},getMembers:function(){if(this._members!=null){return this._members;}else{var L=apiviewer.TreeUtil.getChild(this.getNode(),a);this._members=L?this._createNodeList(L,apiviewer.dao.Method,this,L.type):[];return this._members;}},getStatics:function(){if(this._statics!=null){return this._statics;}else{var M=apiviewer.TreeUtil.getChild(this.getNode(),z);this._statics=M?this._createNodeList(M,apiviewer.dao.Method,this,M.type):[];return this._statics;}},getEvents:function(){if(this._events!=null){return this._events;}else{var N=apiviewer.TreeUtil.getChild(this.getNode(),A);this._events=N?this._createNodeList(N,apiviewer.dao.Event,this,N.type):[];return this._events;}},getProperties:function(){if(this._properties!=null){return this._properties;}else{var O=apiviewer.TreeUtil.getChild(this.getNode(),D);this._properties=O?this._createNodeList(O,apiviewer.dao.Property,this,O.type):[];return this._properties;}},getConstants:function(){if(this._constants!=null){return this._constants;}else{var P=apiviewer.TreeUtil.getChild(this.getNode(),c);this._constants=P?this._createNodeList(P,apiviewer.dao.Constant,this,P.type):[];return this._constants;}},getAppearances:function(){if(this._appearances!=null){return this._appearances;}else{var Q=apiviewer.TreeUtil.getChild(this.getNode(),g);this._appearances=Q?this._createNodeList(Q,apiviewer.dao.Appearance,this,Q.type):[];return this._appearances;}},getSuperInterfaces:function(){return this._superInterfaces;},getSuperMixins:function(){return this._superMixins;},getChildControls:function(){return this._childControls;},getClassHierarchy:function(){var S=[];var R=this;while(R){S.push(R);R=R.getSuperClass();}return S;},getInterfaceHierarchy:function(){var W=this;var U=[W];var V=W.getSuperInterfaces();while(V&&V.length>0){for(var i=0,l=V.length;i<l;i++){var T=apiviewer.dao.Class.getClassByName(V[i].getName());U.push(T);V=T.getSuperInterfaces();}}return U;},getItem:function(X){var Y=[B,e,C,b,y,f,d];for(var i=0;i<Y.length;i++){var ba=this[Y[i]]();for(var j=0;j<ba.length;j++){if(X==ba[j].getName()){return ba[j];}}}},getItemList:function(bb){var bc={"events":C,"constructor":r,"properties":b,"methods":B,"methods-static":e,"constants":y,"appearances":f,"superInterfaces":o,"superMixins":n,"childControls":d};if(bb==h){return this.getConstructor()?[this.getConstructor()]:[];}else{return this[bc[bb]]();}},getItemByListAndName:function(bd,be){var bf=this.getItemList(bd);for(var j=0;j<bf.length;j++){if(be==bf[j].getName()){return bf[j];}}},getClassAppearance:function(){var bg=this.getAppearances();for(var i=0;i<bg.length;i++){if(bg[i].getType()==this){return bg[i];}}return null;},getAllInterfaces:function(bh){if(bh){var bk=this.getClassHierarchy();}else{bk=[this];}var bn=[];for(var bm=0;bm<bk.length;bm++){var bl=bk[bm];var bi=function(bo){var bp=apiviewer.dao.Class.getClassByName(bo);bn.push(bp);var bq=bp.getSuperInterfaces();for(var i=0;i<bq.length;i++){bi(bq[i].getName());}};var bj=bl.getInterfaces();for(var i=0;i<bj.length;i++){bi(bj[i]);}}return bn;},getNodesOfTypeFromMixins:function(br){var bu=this.getMixins();var bv=[];for(var bw=0;bw<bu.length;bw++){var bs=function(bx){var by=bx.getItemList(br);for(var i=0;i<by.length;i++){bv.push(by[i]);}var bz=bx.getSuperMixins();for(var i=0;i<bz.length;i++){bs(apiviewer.dao.Class.getClassByName(bz[i].getName()));}};var bt=apiviewer.dao.Class.getClassByName(bu[bw]);bs(bt);}return bv;},getDependendClasses:function(){return this._findClasses(this,[]);},getDocNode:function(){return this;},_findClasses:function(bA,bB){bB.push(bA);var bJ=bA.getSuperClass();if(bJ){this._findClasses(bJ,bB);}var bG=bA.getMixins();for(var i=0;i<bG.length;i++){var bK=apiviewer.dao.Class.getClassByName(bG[i]);if(bK){this._findClasses(bK,bB);}else{this.warn("Missing mixin: "+bG[i]);}}var bH=bA.getSuperMixins();for(var i=0;i<bH.length;i++){var bI=apiviewer.dao.Class.getClassByName(bH[i]);if(bI){this._findClasses(bI,bB);}else{this.warn("Missing super mixin: "+bH[i]);}}var bF=bA.getInterfaces();for(var i=0;i<bF.length;i++){var bD=apiviewer.dao.Class.getClassByName(bF[i]);if(bD){this._findClasses(bD,bB);}else{this.warn("Missing interface: "+bF[i]);}}var bE=bA.getSuperInterfaces();for(var i=0;i<bE.length;i++){var bC=apiviewer.dao.Class.getClassByName(bE[i]);if(bC){this._findClasses(bC,bB);}else{this.warn("Missing super interface: "+bE[i]);}}return bB;},_initializeFields:function(){apiviewer.dao.Node.prototype._initializeFields.call(this);this._desc=m;this._see=[];this._superInterfaces=[];this._superMixins=[];this._childControls=[];},_addChildNode:function(bL){switch(bL.type){case h:case a:case z:case A:case D:case c:case g:break;case p:this._superInterfaces=this._createNodeList(bL,apiviewer.dao.ClassItem,this,bL.type);break;case w:this._superMixins=this._createNodeList(bL,apiviewer.dao.ClassItem,this,bL.type);break;case v:this._childControls=this._createNodeList(bL,apiviewer.dao.ChildControl,this,bL.type);break;case t:this._desc=bL.attributes.text||m;break;case q:this._see.push(bL.attributes.name);break;default:return apiviewer.dao.Node.prototype._addChildNode.call(this,bL);}return true;}},destruct:function(){this._see=this._superInterfaces=this._superMixins=this._events=this._statics=this._properties=this._constants=this._appearances=this._members=this._package=null;this._disposeObjects(s);}});})();(function(){var f="",e="name",d="desc",c="see",b="types",a="apiviewer.dao.ClassItem";qx.Class.define(a,{extend:apiviewer.dao.Node,construct:function(g,h,k){this._class=h;this._listName=k;apiviewer.dao.Node.call(this,g);},members:{getClass:function(){return this._class;},getName:function(){return this._docNode.attributes.name;},getListName:function(){return this._listName;},getDescription:function(){return this.getDocNode()._desc||f;},getTypes:function(){var m=[];for(var i=0;i<this._types.length;i++){var l={};if(this._types[i].attributes.dimensions){l.dimensions=this._types[i].attributes.dimensions;}l.type=this._types[i].attributes.type;m.push(l);}return m;},getSee:function(){return this._see;},getOverriddenFrom:function(){return apiviewer.dao.Class.getClassByName(this._docNode.attributes.overriddenFrom);},getDocNode:function(){if(this._itemDocNode){return this._itemDocNode;}this._itemDocNode=this;var n=apiviewer.dao.Class.getClassByName(this._docNode.attributes.docFrom);if(n){var o=n.getItemList(this._listName);for(var i=0;i<o.length;i++){if(o[i].getName()==this.getName()){this._itemDocNode=o[i];break;}}}return this._itemDocNode;},isRequiredByInterface:function(p){var r=apiviewer.TreeUtil.getChild(p.getNode(),this._listName);if(r){var q=apiviewer.TreeUtil.getChildByAttribute(r,e,this.getName());return q?true:false;}return false;},getRequiredBy:function(){if(this._requiredBy){return this._requiredBy;}var s=[];var t=this.getClass().getAllInterfaces(true);for(var j=0;j<t.length;j++){if(this.isRequiredByInterface(t[j])){s.push(t[j]);}}this._requiredBy=s;return s;},_initializeFields:function(){apiviewer.dao.Node.prototype._initializeFields.call(this);this._see=[];this._types=[];},_addChildNode:function(u){switch(u.type){case d:this._desc=u.attributes.text||f;break;case c:this._see.push(u.attributes.name);break;case b:this._types=this._createNodeList(u);break;default:return apiviewer.dao.Node.prototype._addChildNode.call(this,u);}return true;}},destruct:function(){this._class=this._itemDocNode=this._requiredBy=this._see=this._types=null;}});})();(function(){var h="params",g="return",f="throws",e="",d="apiviewer.dao.Method",c="_return",b="construct",a="properties";qx.Class.define(d,{extend:apiviewer.dao.ClassItem,construct:function(i,j,k){apiviewer.dao.ClassItem.call(this,i,j,k);},members:{getName:function(){if(this.isConstructor()){return b;}else{return this._docNode.attributes.name;}},isStatic:function(){return this._docNode.attributes.isStatic||false;},isAbstract:function(){return this._docNode.attributes.isAbstract||false;},isConstructor:function(){return this._docNode.attributes.isCtor||false;},isFromProperty:function(){return !!this._docNode.attributes.fromProperty;},getParams:function(){if(this._params!=null){return this._params;}else{var l=apiviewer.TreeUtil.getChild(this.getDocNode().getNode(),h);this._params=l?this._createNodeList(l,apiviewer.dao.Param,this.getClass(),this):[];return this._params;}},getReturn:function(){if(this._return!=null){return this._return;}else{var m=apiviewer.TreeUtil.getChild(this.getDocNode().getNode(),g);this._return=m?new apiviewer.dao.Param(m,this.getClass(),this):e;return this._return;}},getThrows:function(){if(this._throws!=null){return this._throws;}else{var n=apiviewer.TreeUtil.getChild(this.getDocNode().getNode(),f);this._throws=n?this._createNodeList(n,apiviewer.dao.ThrowsEntry,this.getClass(),this):[];return this._throws;}},getApply:function(){return this._docNode.attributes.apply;},getFromProperty:function(){return this.getClass().getItemByListAndName(a,this._docNode.attributes.fromProperty);},_addChildNode:function(o){switch(o.type){case h:case g:case f:break;default:return apiviewer.dao.ClassItem.prototype._addChildNode.call(this,o);}return true;}},destruct:function(){this._params=this._throws=null;this._disposeObjects(c);}});})();(function(){var b="apiviewer.dao.Param",a="properties";qx.Class.define(b,{extend:apiviewer.dao.ClassItem,construct:function(c,d,e){apiviewer.dao.ClassItem.call(this,c,d);this._method=e;},members:{getTypes:function(){var i=this.getMethod().getFromProperty();if(i){if(i.isPropertyGroup()){var g=this.getClass().getItemByListAndName(a,this.getName());if(g){return g.getTypes();}}else{return i.getTypes();}}var h=apiviewer.dao.ClassItem.prototype.getTypes.call(this);var f=this._docNode.attributes;if(f.type){h.push({type:f.type,dimensions:f.dimensions});}return h;},getMethod:function(){return this._method;},getArrayDimensions:function(){return this._docNode.attributes.arrayDimensions;},getType:function(){return this._docNode.attributes.type;},getDefaultValue:function(){return this._docNode.attributes.defaultValue;}},destruct:function(){this._method=null;}});})();(function(){var b="apiviewer.dao.ThrowsEntry",a="Error";qx.Class.define(b,{extend:apiviewer.dao.ClassItem,construct:function(c,d,e){apiviewer.dao.ClassItem.call(this,c,d);},members:{getType:function(){return this._docNode.attributes.type||null;},getDefaultType:function(){return a;},getDescription:function(){return this._docNode.attributes.text;}}});})();(function(){var b="types",a="apiviewer.dao.Event";qx.Class.define(a,{extend:apiviewer.dao.ClassItem,construct:function(c,d,e){apiviewer.dao.ClassItem.call(this,c,d,e);},members:{getType:function(){return apiviewer.dao.Class.getClassByName(this._type);},getTypes:function(){if(this._type){return [{type:this._type}];}else{return null;}},_addChildNode:function(f){switch(f.type){case b:this._type=f.children[0].attributes.type;break;default:return apiviewer.dao.ClassItem.prototype._addChildNode.call(this,f);}return true;}}});})();(function(){var d=",",c="new",b="true",a="apiviewer.dao.Property";qx.Class.define(a,{extend:apiviewer.dao.ClassItem,members:{getTypes:function(){var g=apiviewer.dao.ClassItem.prototype.getTypes.call(this);var e=this.getDocNode();var f=e.getType();if(f){g.push({type:f,dimensions:e.getNode().attributes.dimensions});}return g;},getCheck:function(){var h=this.getDocNode()._docNode.attributes;if(h.check){if(!apiviewer.dao.Class.getClassByName(h.check)&&!apiviewer.ui.ClassViewer.PRIMITIVES[h.check]){return h.check;}}return null;},getClassname:function(){return this._docNode.attributes.classname;},getInstance:function(){return this._docNode.attributes.instance;},getPossibleValues:function(){var i=this._docNode.attributes.possibleValues;if(i){i=i.split(d);return i;}else{return [];}},getGroup:function(){var j=this.getDocNode()._docNode.attributes.group;if(j){return j.split(d);}return [];},isPropertyGroup:function(){return !!this.getDocNode()._docNode.attributes.group;},getType:function(){var k=this._docNode.attributes;if(k.type){return k.type;}if(k.check){if(apiviewer.dao.Class.getClassByName(k.check)||apiviewer.ui.ClassViewer.PRIMITIVES[k.check]){return k.check;}}return null;},getPropertyType:function(){return this.getDocNode()._docNode.attributes.propertyType||c;},getEvent:function(){return this.getDocNode()._docNode.attributes.event;},getApplyMethod:function(){return this.getDocNode()._docNode.attributes.apply;},isNullable:function(){return this.getDocNode()._docNode.attributes.allowNull===b;},getDefaultValue:function(){return this._docNode.attributes.defaultValue;},isInheritable:function(){return this.getDocNode()._docNode.attributes.inheritable||false;},isThemeable:function(){return this.getDocNode()._docNode.attributes.themeable||false;},isRefined:function(){return this._docNode.attributes.refine||false;}}});})();(function(){var bv="mixin",bu="",bt='</div>',bs="<h2>",br="</h2>",bq="interface",bp='',bo="constructor",bn=';',bm="events",bb='</h2>',ba="apiviewer/image/nextlevel.gif",Y='px',X='<p>',W='"',V='">',U="appearances",T='</p>',S="constants",R="This ",bC='px;height:',bD='<h2 class="warning">',bA="properties",bB=' style="',by='<div class="class-description">',bz="methods",bw="Inheritance hierarchy:",bx='</span>',bE="Implementations of this interface:",bF="childControls",bf="sub interfaces",be=";vertical-align:top",bh='" src="',bg=' title="',bj="Internal:",bi="width:18px",bl="Included mixins:",bk="margin-right:-18px;",bd="Interface",bc="apiviewer/image/cross.gif",a='/>',b=' </span>',c='<span style="display:inline-block;display:inline;padding-right:18px;position:relative;top:-2px;left:0;width:',d="superMixins",f="methods-static",g="string",h="<br />\n",k="Deprecated:",l="sub mixins",m=":",bJ='<img src="',bI='</small>',bH=" is deprecated!",bG="position:absolute;top:0px;left:0px",bN="Singleton ",bM='" class="img"',bL='"/>',bK="Direct ",bP="position:absolute;top:0px;left:0px;padding-right:18px;",bO="apiviewer/image/blank.gif",B="apiviewer/image/class18.gif",C='<span style="display:inline;position:relative;top:-2px;width:',z=" is internal!",A="px",F='<span class="type">',G="Classes including this mixin:",D='<img',E="class",x="Implemented interfaces:",y="Class",u="top",t="Object<br/>",w=", ",v="margin-left:",q="construct",p="left",s='<div>',r="child controls",o="Abstract ",n="sub classes",L="vertical-align:top",M="static methods",N="ClassViewer",O="Static ",H="apiviewer.ui.ClassViewer",I='<small>',J="Mixin",K="marked",P="apiviewer/image/vline.gif",Q="superInterfaces";qx.Class.define(H,{extend:apiviewer.ui.AbstractViewer,construct:function(){apiviewer.ui.AbstractViewer.call(this);this.addInfoPanel(new apiviewer.ui.panels.MethodPanel(bo,bo));this.addInfoPanel(new apiviewer.ui.panels.EventPanel(bm,bm,true,true));this.addInfoPanel(new apiviewer.ui.panels.PropertyPanel(bA,bA,true,true));this.addInfoPanel(new apiviewer.ui.panels.MethodPanel(bz,bz));this.addInfoPanel(new apiviewer.ui.panels.MethodPanel(f,M));this.addInfoPanel(new apiviewer.ui.panels.ConstantPanel(S,S,false,true));this.addInfoPanel(new apiviewer.ui.panels.AppearancePanel(U,U,false,true));this.addInfoPanel(new apiviewer.ui.panels.ChildControlsPanel(bF,r));this.getContentElement().setAttribute(E,N);this._init(new apiviewer.dao.Class({}));},statics:{PRIMITIVES:{"var":true,"void":true,"undefined":true,"arguments":true,"null":true,"varargs":true,"Boolean":true,"String":true,"Number":true,"Integer":true,"PositiveNumber":true,"PositiveInteger":true,"Float":true,"Double":true,"Error":true,"RegExp":true,"Object":true,"Array":true,"Map":true,"Function":true,"Date":true,"Node":true,"Element":true,"Document":true,"Window":true,"Event":true,"Class":true,"Bootstrap":true,"List":true,"Mixin":true,"Interface":true,"Theme":true,"Color":true,"Decorator":true,"Font":true},createImageHtml:function(bQ,bR,bS){if(typeof bQ==g){return bJ+qx.util.ResourceManager.getInstance().toUri(bQ)+bM+(bS?bB+bS+W:bu)+a;}else{if(bS){bS+=be;}else{bS=L;}return apiviewer.ui.ClassViewer.createOverlayImageHtml(18,18,bQ,bR,bS);}},createOverlayImageHtml:function(bT,bU,bV,bW,bX){var ca=bp;var bY;if(qx.bom.client.Engine.WEBKIT){ca=C+bT+bC+bU+Y+((bX==null)?bp:(bn+bX))+V;}else{ca=c+bT+bC+bU+Y+((bX==null)?bp:(bn+bX))+V;}if(qx.bom.client.Engine.WEBKIT){bY=bP;}else if(qx.bom.client.Engine.OPERA){bY=bk;}else{bY=bG;}for(var i=0;i<bV.length;i++){ca+=D;if(bW!=null){ca+=bg+bW+W;}ca+=bB+bY+bh+qx.util.ResourceManager.getInstance().toUri(bV[i])+bL;}ca+=bx;return ca;}},members:{_getTitleHtml:function(cb){switch(cb.getType()){case bv:var cd=J;break;case bq:var cd=bd;break;default:var cd=y;break;}var cc=new qx.util.StringBuilder();cc.add(I,cb.getPackageName(),bI);cc.add(F);if(cb.isAbstract()){cc.add(o);}else if(cb.isStatic()){cc.add(O);}else if(cb.isSingleton()){cc.add(bN);}cc.add(cd,b);cc.add(apiviewer.ui.panels.InfoPanel.setTitleClass(cb,cb.getName()));return cc.get();},_getDescriptionHtml:function(ce){switch(ce.getType()){case bv:var cf=l;break;case bq:var cf=bf;break;default:var cf=n;break;}var ch=new qx.util.StringBuilder();var ci=ce.getDescription();if(ci!=bu){ch.add(by,apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(ci,ce),bt);}if(ce.getErrors().length>0){ch.add(by,apiviewer.ui.panels.InfoPanel.createErrorHtml(ce,ce),bt);}switch(ce.getType()){case bv:case bq:ch.add(this.__Sz(ce));break;default:ch.add(this.__Sy(ce));break;}ch.add(this.__Sx(ce.getChildClasses(),bK+cf+m));ch.add(this.__Sx(ce.getInterfaces(),x));ch.add(this.__Sx(ce.getMixins(),bl));ch.add(this.__Sx(ce.getImplementations(),bE));ch.add(this.__Sx(ce.getIncluder(),G));var cg=ce.getConstructor();if(cg){ch.add(apiviewer.ui.panels.InfoPanel.createSeeAlsoHtml(cg));}if(ce.isDeprecated()){ch.add(bD,k,bb);ch.add(X);var ci=ce.getDeprecationText();if(ci){ch.add(ci);}else{ch.add(R,ce.getType(),bH);}ch.add(T);}if(ce.isInternal()){ch.add(bD,bj,bb);ch.add(X);ch.add(R,ce.getType(),z);ch.add(T);}return ch.get();},__Sx:function(cj,ck){if(cj.length>0){var cl=new qx.util.StringBuilder(bs,ck,br);for(var i=0;i<cj.length;i++){if(i!=0){cl.add(w);}cl.add(apiviewer.ui.panels.InfoPanel.createItemLinkHtml(cj[i],null,true,false));}cl=cl.get();}else{cl=bu;}return cl;},__Sy:function(cm){var co=apiviewer.ui.ClassViewer;var cp=new qx.util.StringBuilder(bs,bw,br);var cq=cm.getClassHierarchy();cp.add(co.createImageHtml(B),t);var cn=0;for(var i=cq.length-1;i>=0;i--){cp.add(s);cp.add(co.createImageHtml(ba,null,v+cn+A),co.createImageHtml(apiviewer.TreeUtil.getIconUrl(cq[i])));if(i!=0){cp.add(apiviewer.ui.panels.InfoPanel.createItemLinkHtml(cq[i].getFullName(),null,false));}else{cp.add(cq[i].getFullName());}cn+=18;cp.add(bt);}return cp.get();},__Sz:function(cr){if(cr.getType()==bv){var cs=d;}else{cs=Q;}var cu=apiviewer.ui.ClassViewer;var ct=cu.createImageHtml(bO,null,bi);var cw=function(cx,cy){var cA=[];for(var cz=0;cz<cx.length;cz++){var cD=new qx.util.StringBuilder();var cB=cx[cz];if(!cy){if(cz==cx.length-1){cD.add(cu.createImageHtml(ba));}else{cD.add(cu.createImageHtml(bc));}}else{if(!cy){cD.add(ct);}}cD.add(cu.createImageHtml(apiviewer.TreeUtil.getIconUrl(cB)));if(!cy){cD.add(apiviewer.ui.panels.InfoPanel.createItemLinkHtml(cB.getFullName(),null,false));}else{cD.add(cB.getFullName());}cA.push(cD.get());var cC=qx.lang.Array.clone(cB.getItemList(cs));for(var j=0;j<cC.length;j++){cC[j]=apiviewer.dao.Class.getClassByName(cC[j].getName());}if(cC.length>0){var cE=cw(cC);for(var i=0;i<cE.length;i++){if(cz==cx.length-1){if(cy){cA.push(cE[i]);}else{cA.push(ct+cE[i]);}}else{cA.push(cu.createImageHtml(P)+cE[i]);}}}}return cA;};var cv=new qx.util.StringBuilder();if(cr.getItemList(cs).length>0){cv.add(bs,bw,br);cv.add(cw([cr],true).join(h));}return cv.get();},showItem:function(cF){var cI;if(cF==q){cI=this.getDocNode().getConstructor();}else{cI=this.getDocNode().getItem(cF);}if(!cI){return false;}this.__SA(cI,cF);var cJ=this._getPanelForItemNode(cI);var cG=cJ.getItemElement(cI.getName());if(!cG){return false;}var cH=cG.parentNode.parentNode;if(this._markedElement){this._markedElement.className=bu;}cH.className=K;this._markedElement=cH;qx.event.Timer.once(function(e){qx.bom.element.Scroll.intoView(cH,null,p,u);},this,0);return true;},__SA:function(cK,cL){var cM=apiviewer.UiModel.getInstance();if(cK.isFromProperty&&cK.isFromProperty()){cM.setExpandProperties(true);if(cK.isProtected()){cM.setShowProtected(true);}if(cK.isPrivate()){cM.setShowPrivate(true);}}else if(cK.getListName()=="methods"){if(cL.indexOf("__")===0){cM.setShowPrivate(true);}else if(cL.indexOf("_")===0){cM.setShowProtected(true);}}},_getPanelForItemNode:function(cN){var cO=this.getPanels();for(var i=0;i<cO.length;i++){var cP=cO[i];if(cP.canDisplayItem(cN)){return cP;}}}},destruct:function(){this._titleElem=this._classDescElem=this._markedElement=null;}});})();(function(){var c="apiviewer.ui.panels.EventPanel",b="var",a="event";qx.Class.define(c,{extend:apiviewer.ui.panels.InfoPanel,members:{itemHasDetails:function(d,e){return (d.getClass()!=e||d.getSee().length>0||d.getErrors().length>0||apiviewer.ui.panels.InfoPanel.descriptionHasDetails(d));},getItemTypeHtml:function(f){return apiviewer.ui.panels.InfoPanel.createTypeHtml(f,b);},getItemTitleHtml:function(g){return apiviewer.ui.panels.InfoPanel.setTitleClass(g,g.getName());},getItemTextHtml:function(h,i,j){var k=new qx.util.StringBuilder(apiviewer.ui.panels.InfoPanel.createDescriptionHtml(h,h.getClass(),j));if(j){k.add(apiviewer.ui.panels.InfoPanel.createInheritedFromHtml(h,i));k.add(apiviewer.ui.panels.InfoPanel.createSeeAlsoHtml(h));k.add(apiviewer.ui.panels.InfoPanel.createErrorHtml(h,i));k.add(apiviewer.ui.panels.InfoPanel.createDeprecationHtml(h,a));}return k.get();}}});})();(function(){var j='</div>',i='<div class="item-detail-headline">',h='<div class="item-detail-text">',g="#",f="null",e="instances of ",d="apiviewer.ui.panels.PropertyPanel",c='<div class="javascript">',b="var",a="Apply method:",v="property",u="Check:",t="Allowed values:",s='</code>',r="</code>",q="any ",p="Init value:",o='<code>',n="<code>",m="</code>, <code>",k="Change event:",l=" or sub classes";qx.Class.define(d,{extend:apiviewer.ui.panels.InfoPanel,members:{__SB:function(w,x){if(w.isRefined()){return "";}if(w.isPrivate()){var y="__";var name=w.getName().substring(2);}else if(w.isProtected()){y="_";name=w.getName().substring(1);}else{y="";name=w.getName();}name=qx.lang.String.firstUp(name);var A=[];if(w.getPropertyType()=="fast"){A.push("{@link #"+y+"get"+name+"}</td><td> Get the property value.");}else{A.push("{@link #"+y+"set"+name+"}</td><td> Set the property value.");if(!w.isPropertyGroup()){A.push("{@link #"+y+"get"+name+"}</td><td> Get the property value.");A.push("{@link #"+y+"init"+name+"}</td><td> Call apply method with the init value.");}A.push("{@link #"+y+"reset"+name+"}</td><td> Reset the property value.");if(w.getType()=="Boolean"){A.push("{@link #"+y+"toggle"+name+"}</td><td> Toggle the property value.");A.push("{@link #"+y+"is"+name+"}</td><td> Check whether the property equals <code>true</code>.");}}var z=new qx.util.StringBuilder();z.add('<div class="item-detail-headline">',"Generated methods:",'</div>','<div class="item-detail-text">');z.add("<table><tr><td>");z.add(A.join("</td></tr><tr><td>"));z.add("</td></tr></table>");z.add('</div>');return apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(z.get(),x);},__SC:function(B){var C=[];if(B.isNullable()){C.push("This property allows 'null' values");}if(B.isInheritable()){C.push("The property value can be inherited from a parent object.");}if(B.isThemeable()){C.push("The property value can be set using appearance themes.");}if(B.isPropertyGroup()){C.push("The property is a property group.");}if(B.isRefined()){C.push("The property refines the init value of an existing property.");}if(C.length>0){var D=new qx.util.StringBuilder();D.add('<div class="item-detail-headline">',"Property attributes:",'</div>','<div class="item-detail-text">');D.add("<ul><li>");D.add(C.join("</li><li>"));D.add("</li></ul>");D.add('</div>');return D.get();}else{return "";}},__SD:function(E){if(E.isRefined()){var F=new qx.util.StringBuilder('<div class="item-detail-headline">',"Refined property:",'</div>','<div class="item-detail-text">',apiviewer.ui.panels.InfoPanel.createItemLinkHtml(E.getOverriddenFrom().getFullName()+"#"+E.getName()),'</div>');return F.get();}else{return "";}},getItemTypeHtml:function(G){return apiviewer.ui.panels.InfoPanel.createTypeHtml(G,b);},getItemTitleHtml:function(H){return apiviewer.ui.panels.InfoPanel.setTitleClass(H,H.getName());},getItemTextHtml:function(I,J,K){var L=I.getDocNode();var N=new qx.util.StringBuilder(apiviewer.ui.panels.InfoPanel.createDescriptionHtml(I,I.getClass(),K));if(K){var O=null;var M=qx.lang.Array.clone(I.getPossibleValues());if(M.length>0){if(I.isNullable()){M.push(f);}O=n+M.join(m)+r;}else if(I.getClassname()){O=e+I.getClassname();}else if(I.getInstance()){O=e+I.getInstance()+l;}else if(I.getType()){O=q+I.getType();}if(O){N.add(i,t,j,h);N.add(O,j);}if(I.getCheck()){N.add(i,u,j,c,qx.dev.Tokenizer.javaScriptToHtml(I.getCheck()),j);}if(!I.isPropertyGroup()){N.add(i,p,j,h,o,(I.getDefaultValue()?I.getDefaultValue():f),s,j);}if(I.getEvent()&&!I.isRefined()){N.add(i,k,j,h,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(g+I.getEvent(),I.getClass(),true,true),j);}if(I.getApplyMethod()&&!I.isRefined()){N.add(i,a,j,h,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(g+I.getApplyMethod(),I.getClass(),true,true),j);}N.add(this.__SC(I));N.add(this.__SB(I,J));N.add(apiviewer.ui.panels.InfoPanel.createIncludedFromHtml(I,J));N.add(this.__SD(I));N.add(apiviewer.ui.panels.InfoPanel.createInheritedFromHtml(I,J));N.add(apiviewer.ui.panels.InfoPanel.createInfoRequiredByHtml(I));N.add(apiviewer.ui.panels.InfoPanel.createSeeAlsoHtml(L));N.add(apiviewer.ui.panels.InfoPanel.createErrorHtml(I,J));N.add(apiviewer.ui.panels.InfoPanel.createDeprecationHtml(L,v));}return N.get();}}});})();(function(){var c="apiviewer.ui.panels.ConstantPanel",b="var",a="constant";qx.Class.define(c,{extend:apiviewer.ui.panels.InfoPanel,members:{itemHasDetails:function(d,e){return (d.getSee().length>0||d.getErrors().length>0||apiviewer.ui.panels.InfoPanel.descriptionHasDetails(d)||this.__SE(d));},getItemTypeHtml:function(f){return apiviewer.ui.panels.InfoPanel.createTypeHtml(f,b);},getItemTitleHtml:function(g){return apiviewer.ui.panels.InfoPanel.setTitleClass(g,g.getName());},getItemTextHtml:function(h,i,j){var k=apiviewer.ui.panels.InfoPanel.createDescriptionHtml(h,h.getClass(),j);if(j){k+=this.__SF(h);k+=apiviewer.ui.panels.InfoPanel.createSeeAlsoHtml(h);k+=apiviewer.ui.panels.InfoPanel.createErrorHtml(h,i);k+=apiviewer.ui.panels.InfoPanel.createDeprecationHtml(h,a);}return k;},__SE:function(l){return l.getValue()?true:false;},__SF:function(m){if(this.__SE(m)){var n=new qx.util.StringBuilder('<div class="item-detail-headline">',"Value: ",'</div>','<div class="item-detail-text">',qx.bom.String.escape(qx.util.Json.stringify(m.getValue())),'</div>');return n.get();}else{return "";}}}});})();(function(){var m='</div>',l=" <span class='item-detail-define'>defined by ",k=" (default appearance of the class)",j="</p></div>",h="</span>: ",g='<div class="item-desc">',f=" ",e="apiviewer.ui.panels.AppearancePanel",d='<div class="item-detail-headline">',c="</code><p>",a="<div class='item-detail-text'><code>",b="States:";qx.Class.define(e,{extend:apiviewer.ui.panels.InfoPanel,members:{__SG:function(n){var r=n.getStates();if(r.length>0){var t=qx.lang.Array.clone(r);}else{t=[];}var u=n.getType();var v=n.getClass();var s=1;if(u!=v){v=u;s=0;}var q=v.getClassHierarchy();for(var i=s;i<q.length;i++){v=q[i];var o=v.getClassAppearance();if(o){var p=o.getStates();if(p){qx.lang.Array.append(t,p);}}}return t;},_getPanelItems:function(w,x){var z=apiviewer.ui.panels.InfoPanel.prototype._getPanelItems.call(this,w,x);if(!w){return z;}var A=x.getClassHierarchy();for(var i=0;i<A.length;i++){var B=A[i];var y=B.getClassAppearance();if(y){if(y.getType()!=x){z.push(y);}return z;}}},getItemTypeHtml:function(C){var E=C.getName();if(C.getType()==C.getClass()){var D=E+k;}else{var D=E;}return D;},getItemTitleHtml:function(F){return apiviewer.ui.panels.InfoPanel.setTitleClass(F,F.getName());},getItemTextHtml:function(G,H,I){var M=new qx.util.StringBuilder();M.add(g,apiviewer.ui.panels.InfoPanel.createDescriptionHtml(G,G.getClass(),true),m);if(I){var K=this.__SG(G);if(K.length>0){M.add(d,b,m);for(var i=0;i<K.length;i++){var L=K[i];M.add(a,L.getName(),c);var J=L.getAppearance();if(J.getType()!=G.getClass()){M.add(l,apiviewer.ui.panels.InfoPanel.createItemLinkHtml(J.getType().getFullName()),h);}var N=L.getDescription();if(N){M.add(f,apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(N,L.getClass()));}M.add(j);}M.add(m);}}return M.get();},itemHasDetails:function(O,P){return this.__SG(O).length>0;}}});})();(function(){var i='</div>',h="apiviewer.ui.panels.ChildControlsPanel",g="null",f="var",e='<div class="item-detail-headline">',d='</code>',c='<code>',b="Default value:",a='<div class="item-detail-text">';qx.Class.define(h,{extend:apiviewer.ui.panels.InfoPanel,members:{getItemTypeHtml:function(j,k){return apiviewer.ui.panels.InfoPanel.createTypeHtml(j,f,true);},getItemTitleHtml:function(l,m){return apiviewer.ui.panels.InfoPanel.setTitleClass(l,l.getName());},getItemTextHtml:function(n,o,p){var q=new qx.util.StringBuilder(n.getDescription());if(p){q.add(e,b,i,a,c,(n.getDefaultValue()?n.getDefaultValue():g),d,i);}return q.get();}}});})();(function(){var a="apiviewer.dao.Constant";qx.Class.define(a,{extend:apiviewer.dao.ClassItem,construct:function(b,c,d){apiviewer.dao.ClassItem.call(this,b,c,d);},members:{getValue:function(){return this._docNode.attributes.value;}}});})();(function(){var b="states",a="apiviewer.dao.Appearance";qx.Class.define(a,{extend:apiviewer.dao.ClassItem,construct:function(c,d,e){apiviewer.dao.ClassItem.call(this,c,d,e);},members:{getType:function(){return apiviewer.dao.Class.getClassByName(this._docNode.attributes.type);},getTypes:function(){return [{type:this._docNode.attributes.type}];},getAppearance:function(){return this.getClass();},getStates:function(){return this._states||[];},_addChildNode:function(f){switch(f.type){case b:this._states=this._createNodeList(f,apiviewer.dao.State,this);break;default:return apiviewer.dao.ClassItem.prototype._addChildNode.call(this,f);}return true;}}});})();(function(){var a="apiviewer.dao.State";qx.Class.define(a,{extend:apiviewer.dao.ClassItem,construct:function(b,parent){apiviewer.dao.ClassItem.call(this,b,parent);},members:{getClass:function(){return this._class.getClass();},getAppearance:function(){return this._class;}}});})();(function(){var a="apiviewer.dao.ChildControl";qx.Class.define(a,{extend:apiviewer.dao.ClassItem,construct:function(b,c,d){apiviewer.dao.ClassItem.call(this,b,c);this._listName=d;},members:{getTypes:function(){var f=apiviewer.dao.ClassItem.prototype.getTypes.call(this);var e=this._docNode.attributes;if(e.type){f.push({type:e.type});}return f;},getType:function(){return this._docNode.attributes.type;},getDefaultValue:function(){return this._docNode.attributes.defaultValue;}}});})();(function(){var n="class",m="interface",l="mixin",k="list",j="",h="apiviewer.ui.panels.ClassPanel",g="Singleton ",f="Abstract ",e="bootstrap",d="Static ",a="Class",c="Interface",b="Mixin";qx.Class.define(h,{extend:apiviewer.ui.panels.InfoPanel,construct:function(o,p,q){apiviewer.ui.panels.InfoPanel.call(this,o,p);this.setType(q);},properties:{type:{check:[n,l,m]}},members:{getItemTypeHtml:function(r){return apiviewer.ui.panels.InfoPanel.createItemLinkHtml(r.getName(),r,false,true);},getItemTitleHtml:function(s){return s.getFullName();},getItemTextHtml:function(t,u,v){if(v){return apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(t.getDescription(),t);}else{return apiviewer.ui.panels.InfoPanel.createDescriptionHtml(t,t.getClass(),v);}},getItemTooltip:function(w,x){if(w.isAbstract()){var y=f;}else if(w.isStatic()){var y=d;}else if(w.isSingleton()){var y=g;}else{var y=j;}switch(w.getType()){case l:y+=b;break;case m:y+=c;break;default:y+=a;break;}return y;},itemHasDetails:function(z,A){return apiviewer.ui.panels.InfoPanel.descriptionHasDetails(z);},update:function(B,C){if(!this.getElement()){return;}this.setDocNode(C);var E=C.getClasses();var D=[];var F;for(var i=0;i<E.length;i++){F=E[i].getType();if(F===e||F===k){F=n;}if(F===this.getType()){D.push(E[i]);}}if(D&&D.length>0){this._sortItems(D);}this._displayNodes(D,C);}}});})();(function(){var b="Package",a="apiviewer.ui.panels.PackagePanel";qx.Class.define(a,{extend:apiviewer.ui.panels.InfoPanel,members:{getItemTypeHtml:function(c){return apiviewer.ui.panels.InfoPanel.createItemLinkHtml(c.getFullName(),null,false,true);},getItemTitleHtml:function(d){return d.getFullName();},getItemTextHtml:function(e,f,g){if(g){return apiviewer.ui.panels.InfoPanel.resolveLinkAttributes(e.getDescription(),e);}else{return apiviewer.ui.panels.InfoPanel.createDescriptionHtml(e,e.getPackage(),g);}},getItemTooltip:function(h,i){return b;},itemHasDetails:function(j,k){return apiviewer.ui.panels.InfoPanel.descriptionHasDetails(j);},update:function(l,m){if(!this.getElement()){return;}this.setDocNode(m);var n=m.getPackages();if(n&&n.length>0){this._sortItems(n);}this._displayNodes(n,m);}}});})();(function(){var a="apiviewer.ui.tabview.ClassPage";qx.Class.define(a,{extend:apiviewer.ui.tabview.AbstractPage,members:{_createViewer:function(){return new apiviewer.ui.ClassViewer();}}});})();(function(){var m="value",l="separator-vertical",k="_tabView",j="qooxdoo",h="_packageViewer",g="_searchView",f="_tree",d="_detailLoader",c="apiviewer.Viewer",b="_classViewer",a="tree";qx.Class.define(c,{extend:qx.ui.container.Composite,construct:function(){qx.ui.container.Composite.call(this);this.__SH={};var p=new qx.ui.layout.VBox;p.setSeparator(l);this.setLayout(p);this.add(this.__SQ());this.add(this.__SM());var n=new apiviewer.ui.PackageTree();n.setId(a);this._searchView=new apiviewer.ui.SearchView();var q=new apiviewer.ui.LegendView();var r=this.__SL(n,this._searchView,q);var o=this.__SN();this.add(this.__SP(r,o),{flex:1});},members:{__SI:null,__SJ:null,__SH:null,__SK:null,__SL:function(s,t,u){var v=new qx.ui.container.Stack;v.setAppearance("toggleview");v.add(s);v.add(t);v.add(u);this.__SK.addListener("changeSelection",function(e){var w=e.getData()[0];var x=w!=null?w.getUserData("value"):null;switch(x){case "packages":v.setSelection([s]);v.show();break;case "search":v.setSelection([t]);v.show();qx.lang.Function.delay(this._onShowSearch,100,this);break;case "legend":v.setSelection([u]);v.show();break;default:v.exclude();}},this);return v;},__SM:function(){var toolbar=new qx.ui.toolbar.ToolBar;var B=new qx.ui.toolbar.Part;toolbar.add(B);this.__SI=B.toHashCode();var E=new qx.ui.toolbar.RadioButton(this.tr("Content"),"icon/22/apps/utilities-dictionary.png");E.setUserData("value","packages");E.setValue(true);E.setToolTipText(this.tr("Show/hide the packages."));B.add(E);var H=new qx.ui.toolbar.RadioButton(this.tr("Search"),"icon/22/actions/edit-find.png");H.setUserData("value","search");H.setToolTipText(this.tr("Search for packages, classes and members."));B.add(H);var y=new qx.ui.toolbar.RadioButton(this.tr("Legend"),"icon/22/apps/utilities-help.png");y.setUserData("value","legend");y.setToolTipText(this.tr("Show/hide the legend."));B.add(y);var z=new qx.ui.form.RadioGroup(E,H,y);z.setAllowEmptySelection(true);this.__SK=z;toolbar.addSpacer();var B=new qx.ui.toolbar.Part;toolbar.add(B);var F=new qx.ui.toolbar.CheckBox(this.tr("Properties"),"apiviewer/image/property18.gif");F.setId("btn_expand");F.setValue(true);F.setToolTipText(this.tr("Show/hide all generated property methods."));B.add(F);var D=new qx.ui.toolbar.CheckBox(this.tr("Inherited"),"apiviewer/image/method_public_inherited18.gif");D.setId("btn_inherited");D.setToolTipText(this.tr("Show/hide inherited members of the current class."));B.add(D);var A=new qx.ui.toolbar.CheckBox(this.tr("Protected"),"apiviewer/image/method_protected18.gif");A.setId("btn_protected");A.setToolTipText(this.tr("Show/hide protected members of the current class."));B.add(A);var G=new qx.ui.toolbar.CheckBox(this.tr("Private"),"apiviewer/image/method_private18.gif");G.setId("btn_private");G.setToolTipText(this.tr("Show/hide private members of the current class."));B.add(G);toolbar.setOverflowHandling(true);var C=new qx.ui.toolbar.MenuButton(null,"icon/22/actions/media-seek-forward.png");C.setAppearance("toolbar-button");toolbar.add(C);toolbar.setOverflowIndicator(C);this.__SJ=new qx.ui.menu.Menu();C.setMenu(this.__SJ);toolbar.addListener("hideItem",function(e){var I=e.getData();var J=this._getMenuItems(I);for(var i=0;i<J.length;i++){J[i].setVisibility("visible");}},this);toolbar.addListener("showItem",function(e){var K=e.getData();var L=this._getMenuItems(K);for(var i=0;i<L.length;i++){L[i].setVisibility("excluded");}},this);return toolbar;},_getMenuItems:function(M){var O=M.getChildren();var P=[];if(M.toHashCode()===this.__SI){var N=this.__SH[M.toHashCode()];if(!N){N=new qx.ui.menu.Separator();this.__SJ.addAt(N,0);this.__SH[M.toHashCode()]=N;}P.push(N);}for(var i=O.length-1;i>=0;i--){var Q=O[i];N=this.__SH[Q.toHashCode()];if(!N){if(Q instanceof qx.ui.toolbar.RadioButton){var N=new qx.ui.menu.RadioButton(Q.getLabel());}else{N=new qx.ui.menu.CheckBox(Q.getLabel());}Q.bind(m,N,m);N.bind(m,Q,m);this.__SJ.addAt(N,0);this.__SH[Q.toHashCode()]=N;}P.push(N);}return P;},__SN:function(){var R=new qx.ui.container.Composite(new qx.ui.layout.Canvas);R.getContentElement().setAttribute("class","content");this._detailLoader=new qx.ui.embed.Html('<div style="padding:10px;"><h1><small>please wait</small>Loading data...</h1></div>');this._detailLoader.getContentElement().setAttribute("id","SplashScreen");this._detailLoader.setAppearance("detailviewer");this._detailLoader.setId("detail_loader");R.add(this._detailLoader,{edge:0});this._tabView=new qx.ui.tabview.TabView();this._tabView.setId("tabView");this._tabView.exclude();R.add(this._tabView,{edge:0});return R;},__SO:function(toolbar,S){var T=new qx.ui.container.Composite;T.setLayout(new qx.ui.layout.VBox);T.add(toolbar);T.add(S,{flex:1});return T;},__SP:function(U,V){var W=new qx.ui.splitpane.Pane("horizontal");W.add(U,0);W.add(V,1);return W;},__SQ:function(){var ba=new qx.ui.layout.HBox();var X=new qx.ui.container.Composite(ba);X.setAppearance("app-header");var bb=new qx.ui.basic.Label("API Documentation");var Y=new qx.ui.basic.Label("qooxdoo "+qx.core.Setting.get("qx.version"));X.add(bb);X.add(new qx.ui.core.Spacer,{flex:1});X.add(Y);return X;},_onShowSearch:function(){this._searchView.sinput.focus();}},settings:{"apiviewer.title":j,"apiviewer.initialTreeDepth":1},destruct:function(){this._classTreeNodeHash=this.__SK=null;this._disposeObjects(f,d,b,h,g,k);}});})();(function(){var n="_applyLayoutChange",m="top",k="left",j="middle",h="Decorator",g="center",f="_applyReversed",e="bottom",d="qx.ui.layout.VBox",c="Integer",a="right",b="Boolean";qx.Class.define(d,{extend:qx.ui.layout.Abstract,construct:function(o,p,q){qx.ui.layout.Abstract.call(this);if(o){this.setSpacing(o);}if(p){this.setAlignY(p);}if(q){this.setSeparator(q);}},properties:{alignY:{check:[m,j,e],init:m,apply:n},alignX:{check:[k,g,a],init:k,apply:n},spacing:{check:c,init:0,apply:n},separator:{check:h,nullable:true,apply:n},reversed:{check:b,init:false,apply:f}},members:{__eS:null,__eT:null,__eU:null,__eV:null,_applyReversed:function(){this._invalidChildrenCache=true;this._applyLayoutChange();},__eW:function(){var w=this._getLayoutChildren();var length=w.length;var s=false;var r=this.__eS&&this.__eS.length!=length&&this.__eT&&this.__eS;var u;var t=r?this.__eS:new Array(length);var v=r?this.__eT:new Array(length);if(this.getReversed()){w=w.concat().reverse();}for(var i=0;i<length;i++){u=w[i].getLayoutProperties();if(u.height!=null){t[i]=parseFloat(u.height)/100;}if(u.flex!=null){v[i]=u.flex;s=true;}else{v[i]=0;}}if(!r){this.__eS=t;this.__eT=v;}this.__eU=s;this.__eV=w;delete this._invalidChildrenCache;},verifyLayoutProperty:null,renderLayout:function(x,y){if(this._invalidChildrenCache){this.__eW();}var F=this.__eV;var length=F.length;var P=qx.ui.layout.Util;var O=this.getSpacing();var S=this.getSeparator();if(S){var C=P.computeVerticalSeparatorGaps(F,O,S);}else{var C=P.computeVerticalGaps(F,O,true);}var i,A,B,J;var K=[];var Q=C;for(i=0;i<length;i+=1){J=this.__eS[i];B=J!=null?Math.floor((y-C)*J):F[i].getSizeHint().height;K.push(B);Q+=B;}if(this.__eU&&Q!=y){var H={};var N,R;for(i=0;i<length;i+=1){N=this.__eT[i];if(N>0){G=F[i].getSizeHint();H[i]={min:G.minHeight,value:K[i],max:G.maxHeight,flex:N};}}var D=P.computeFlexOffsets(H,y,Q);for(i in D){R=D[i].offset;K[i]+=R;Q+=R;}}var top=F[0].getMarginTop();if(Q<y&&this.getAlignY()!=m){top=y-Q;if(this.getAlignY()===j){top=Math.round(top/2);}}var G,U,L,B,I,M,E;this._clearSeparators();if(S){var T=qx.theme.manager.Decoration.getInstance().resolve(S).getInsets();var z=T.top+T.bottom;}for(i=0;i<length;i+=1){A=F[i];B=K[i];G=A.getSizeHint();M=A.getMarginLeft();E=A.getMarginRight();L=Math.max(G.minWidth,Math.min(x-M-E,G.maxWidth));U=P.computeHorizontalAlignOffset(A.getAlignX()||this.getAlignX(),L,x,M,E);if(i>0){if(S){top+=I+O;this._renderSeparator(S,{top:top,left:0,height:z,width:x});top+=z+O+A.getMarginTop();}else{top+=P.collapseMargins(O,I,A.getMarginTop());}}A.renderLayout(U,top,L,B);top+=B;I=A.getMarginBottom();}},_computeSizeHint:function(){if(this._invalidChildrenCache){this.__eW();}var bc=qx.ui.layout.Util;var bk=this.__eV;var X=0,bb=0,ba=0;var V=0,bd=0;var bh,W,bj;for(var i=0,l=bk.length;i<l;i+=1){bh=bk[i];W=bh.getSizeHint();bb+=W.height;var bg=this.__eT[i];var Y=this.__eS[i];if(bg){X+=W.minHeight;}else if(Y){ba=Math.max(ba,Math.round(W.minHeight/Y));}else{X+=W.height;}bj=bh.getMarginLeft()+bh.getMarginRight();if((W.width+bj)>bd){bd=W.width+bj;}if((W.minWidth+bj)>V){V=W.minWidth+bj;}}X+=ba;var bf=this.getSpacing();var bi=this.getSeparator();if(bi){var be=bc.computeVerticalSeparatorGaps(bk,bf,bi);}else{var be=bc.computeVerticalGaps(bk,bf,true);}return {minHeight:X+be,height:bb+be,minWidth:V,width:bd};}},destruct:function(){this.__eS=this.__eT=this.__eV=null;}});})();(function(){var b="qx.nativeScrollBars",a="qx.ui.core.scroll.MScrollBarFactory";qx.core.Setting.define(b,false);qx.Mixin.define(a,{members:{_createScrollBar:function(c){if(qx.core.Setting.get(b)){return new qx.ui.core.scroll.NativeScrollBar(c);}else{return new qx.ui.core.scroll.ScrollBar(c);}}}});})();(function(){var k="scrollbar-y",j="scrollbar-x",i="pane",h="auto",g="corner",f="scrollbar-",d="on",c="_computeScrollbars",b="getDocument",a="changeVisibility",D="off",C="x",B="scroll",A="touchmove",z="scrollY",y="Left",x="mousewheel",w="scrollbarX",v="scrollarea",u="y",r="vertical",s="scrollX",p="touchstart",q="horizontal",n="qx.ui.core.scroll.AbstractScrollArea",o="abstract",l="update",m="scrollbarY",t="Top";qx.Class.define(n,{extend:qx.ui.core.Widget,include:qx.ui.core.scroll.MScrollBarFactory,type:o,construct:function(){qx.ui.core.Widget.call(this);var E=new qx.ui.layout.Grid();E.setColumnFlex(0,1);E.setRowFlex(0,1);this._setLayout(E);this.addListener(x,this._onMouseWheel,this);if(qx.bom.client.Feature.TOUCH){this.addListener(A,this._onTouchMove,this);this.addListener(p,function(){this.__qP={"x":0,"y":0};},this);this.__qP={};this.__qQ={};}},properties:{appearance:{refine:true,init:v},width:{refine:true,init:100},height:{refine:true,init:200},scrollbarX:{check:[h,d,D],init:h,themeable:true,apply:c},scrollbarY:{check:[h,d,D],init:h,themeable:true,apply:c},scrollbar:{group:[w,m]}},members:{__qP:null,__qQ:null,_createChildControlImpl:function(F,G){var H;switch(F){case i:H=new qx.ui.core.scroll.ScrollPane();H.addListener(l,this._computeScrollbars,this);H.addListener(s,this._onScrollPaneX,this);H.addListener(z,this._onScrollPaneY,this);this._add(H,{row:0,column:0});break;case j:H=this._createScrollBar(q);H.setMinWidth(0);H.exclude();H.addListener(B,this._onScrollBarX,this);H.addListener(a,this._onChangeScrollbarXVisibility,this);this._add(H,{row:1,column:0});break;case k:H=this._createScrollBar(r);H.setMinHeight(0);H.exclude();H.addListener(B,this._onScrollBarY,this);H.addListener(a,this._onChangeScrollbarYVisibility,this);this._add(H,{row:0,column:1});break;case g:H=new qx.ui.core.Widget();H.setWidth(0);H.setHeight(0);H.exclude();this._add(H,{row:1,column:1});break;}return H||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,F);},getPaneSize:function(){return this.getChildControl(i).getInnerSize();},getItemTop:function(I){return this.getChildControl(i).getItemTop(I);},getItemBottom:function(J){return this.getChildControl(i).getItemBottom(J);},getItemLeft:function(K){return this.getChildControl(i).getItemLeft(K);},getItemRight:function(L){return this.getChildControl(i).getItemRight(L);},scrollToX:function(M){qx.ui.core.queue.Manager.flush();this.getChildControl(j).scrollTo(M);},scrollByX:function(N){qx.ui.core.queue.Manager.flush();this.getChildControl(j).scrollBy(N);},getScrollX:function(){var O=this.getChildControl(j,true);return O?O.getPosition():0;},scrollToY:function(P){qx.ui.core.queue.Manager.flush();this.getChildControl(k).scrollTo(P);},scrollByY:function(Q){qx.ui.core.queue.Manager.flush();this.getChildControl(k).scrollBy(Q);},getScrollY:function(){var R=this.getChildControl(k,true);return R?R.getPosition():0;},_onScrollBarX:function(e){this.getChildControl(i).scrollToX(e.getData());},_onScrollBarY:function(e){this.getChildControl(i).scrollToY(e.getData());},_onScrollPaneX:function(e){this.scrollToX(e.getData());},_onScrollPaneY:function(e){this.scrollToY(e.getData());},_onMouseWheel:function(e){var T=this._isChildControlVisible(j);var U=this._isChildControlVisible(k);var S=(U)?this.getChildControl(k,true):(T?this.getChildControl(j,true):null);if(S){S.scrollBySteps(e.getWheelDelta());e.stop();}},_onTouchMove:function(e){this._onTouchMoveDirectional(C,e);this._onTouchMoveDirectional(u,e);e.stop();},_onTouchMoveDirectional:function(V,e){var W=(V==C?y:t);var Y=this.getChildControl(f+V,true);var ba=this._isChildControlVisible(f+V);if(ba&&Y){if(this.__qP[V]==0){var X=0;}else{var X=-(e[b+W]()-this.__qP[V]);}this.__qP[V]=e[b+W]();Y.scrollBy(X);if(this.__qQ[V]){clearTimeout(this.__qQ[V]);this.__qQ[V]=null;}this.__qQ[V]=setTimeout(qx.lang.Function.bind(function(bb){this.__qR(bb,V);},this,X),100);}},__qR:function(bc,bd){this.__qQ[bd]=null;var bf=this._isChildControlVisible(f+bd);if(bc==0||!bf){return;}if(bc>0){bc=Math.max(0,bc-3);}else{bc=Math.min(0,bc+3);}this.__qQ[bd]=setTimeout(qx.lang.Function.bind(function(bg,bh){this.__qR(bg,bh);},this,bc,bd),20);var be=this.getChildControl(f+bd,true);be.scrollBy(bc);},_onChangeScrollbarXVisibility:function(e){var bi=this._isChildControlVisible(j);var bj=this._isChildControlVisible(k);if(!bi){this.scrollToX(0);}bi&&bj?this._showChildControl(g):this._excludeChildControl(g);},_onChangeScrollbarYVisibility:function(e){var bk=this._isChildControlVisible(j);var bl=this._isChildControlVisible(k);if(!bl){this.scrollToY(0);}bk&&bl?this._showChildControl(g):this._excludeChildControl(g);},_computeScrollbars:function(){var bs=this.getChildControl(i);var content=bs.getChildren()[0];if(!content){this._excludeChildControl(j);this._excludeChildControl(k);return;}var bm=this.getInnerSize();var br=bs.getInnerSize();var bp=bs.getScrollSize();if(!br||!bp){return;}var bt=this.getScrollbarX();var bu=this.getScrollbarY();if(bt===h&&bu===h){var bq=bp.width>bm.width;var bv=bp.height>bm.height;if((bq||bv)&&!(bq&&bv)){if(bq){bv=bp.height>br.height;}else if(bv){bq=bp.width>br.width;}}}else{var bq=bt===d;var bv=bu===d;if(bp.width>(bq?br.width:bm.width)&&bt===h){bq=true;}if(bp.height>(bq?br.height:bm.height)&&bu===h){bv=true;}}if(bq){var bo=this.getChildControl(j);bo.show();bo.setMaximum(Math.max(0,bp.width-br.width));bo.setKnobFactor((bp.width===0)?0:br.width/bp.width);}else{this._excludeChildControl(j);}if(bv){var bn=this.getChildControl(k);bn.show();bn.setMaximum(Math.max(0,bp.height-br.height));bn.setKnobFactor((bp.height===0)?0:br.height/bp.height);}else{this._excludeChildControl(k);}}}});})();(function(){var p="Integer",o="_applyContentPadding",n="resetPaddingRight",m="setPaddingBottom",l="resetPaddingTop",k="qx.ui.core.MContentPadding",j="resetPaddingLeft",i="setPaddingTop",h="setPaddingRight",g="resetPaddingBottom",c="contentPaddingLeft",f="setPaddingLeft",e="contentPaddingTop",b="shorthand",a="contentPaddingRight",d="contentPaddingBottom";qx.Mixin.define(k,{properties:{contentPaddingTop:{check:p,init:0,apply:o,themeable:true},contentPaddingRight:{check:p,init:0,apply:o,themeable:true},contentPaddingBottom:{check:p,init:0,apply:o,themeable:true},contentPaddingLeft:{check:p,init:0,apply:o,themeable:true},contentPadding:{group:[e,a,d,c],mode:b,themeable:true}},members:{__kV:{contentPaddingTop:i,contentPaddingRight:h,contentPaddingBottom:m,contentPaddingLeft:f},__kW:{contentPaddingTop:l,contentPaddingRight:n,contentPaddingBottom:g,contentPaddingLeft:j},_applyContentPadding:function(q,r,name){var s=this._getContentPaddingTarget();if(q==null){var t=this.__kW[name];s[t]();}else{var u=this.__kV[name];s[u](q);}}}});})();(function(){var v="single",u="Boolean",t="one",s="changeSelection",r="__nt",q="mouseup",p="mousedown",o="losecapture",n="multi",m="_applyQuickSelection",d="mouseover",l="_applySelectionMode",h="_applyDragSelection",c="qx.ui.core.MMultiSelectionHandling",b="removeItem",g="keypress",f="qx.event.type.Data",j="addItem",a="additive",k="mousemove";qx.Mixin.define(c,{construct:function(){var x=this.SELECTION_MANAGER;var w=this.__nt=new x(this);this.addListener(p,w.handleMouseDown,w);this.addListener(q,w.handleMouseUp,w);this.addListener(d,w.handleMouseOver,w);this.addListener(k,w.handleMouseMove,w);this.addListener(o,w.handleLoseCapture,w);this.addListener(g,w.handleKeyPress,w);this.addListener(j,w.handleAddItem,w);this.addListener(b,w.handleRemoveItem,w);w.addListener(s,this._onSelectionChange,this);},events:{"changeSelection":f},properties:{selectionMode:{check:[v,n,a,t],init:v,apply:l},dragSelection:{check:u,init:false,apply:h},quickSelection:{check:u,init:false,apply:m}},members:{__nt:null,selectAll:function(){this.__nt.selectAll();},isSelected:function(y){if(!qx.ui.core.Widget.contains(this,y)){throw new Error("Could not test if "+y+" is selected, because it is not a child element!");}return this.__nt.isItemSelected(y);},addToSelection:function(z){if(!qx.ui.core.Widget.contains(this,z)){throw new Error("Could not add + "+z+" to selection, because it is not a child element!");}this.__nt.addItem(z);},removeFromSelection:function(A){if(!qx.ui.core.Widget.contains(this,A)){throw new Error("Could not remove "+A+" from selection, because it is not a child element!");}this.__nt.removeItem(A);},selectRange:function(B,C){this.__nt.selectItemRange(B,C);},resetSelection:function(){this.__nt.clearSelection();},setSelection:function(D){for(var i=0;i<D.length;i++){if(!qx.ui.core.Widget.contains(this,D[i])){throw new Error("Could not select "+D[i]+", because it is not a child element!");}}if(D.length===0){this.resetSelection();}else{var E=this.getSelection();if(!qx.lang.Array.equals(E,D)){this.__nt.replaceSelection(D);}}},getSelection:function(){return this.__nt.getSelection();},getSortedSelection:function(){return this.__nt.getSortedSelection();},isSelectionEmpty:function(){return this.__nt.isSelectionEmpty();},getSelectionContext:function(){return this.__nt.getSelectionContext();},_getManager:function(){return this.__nt;},getSelectables:function(F){return this.__nt.getSelectables(F);},invertSelection:function(){this.__nt.invertSelection();},_getLeadItem:function(){var G=this.__nt.getMode();if(G===v||G===t){return this.__nt.getSelectedItem();}else{return this.__nt.getLeadItem();}},_applySelectionMode:function(H,I){this.__nt.setMode(H);},_applyDragSelection:function(J,K){this.__nt.setDrag(J);},_applyQuickSelection:function(L,M){this.__nt.setQuick(L);},_onSelectionChange:function(e){this.fireDataEvent(s,e.getData());}},destruct:function(){this._disposeObjects(r);}});})();(function(){var a="qx.ui.core.IMultiSelection";qx.Interface.define(a,{extend:qx.ui.core.ISingleSelection,members:{selectAll:function(){return true;},addToSelection:function(b){return arguments.length==1;},removeFromSelection:function(c){return arguments.length==1;}}});})();(function(){var o="one",n="single",m="selected",k="additive",j="multi",h="PageUp",g="under",f="Left",d="lead",c="Down",M="Up",L="Boolean",K="PageDown",J="anchor",I="End",H="Home",G="Right",F="right",E="click",D="above",v="left",w="Escape",t="A",u="Space",r="_applyMode",s="interval",p="changeSelection",q="qx.event.type.Data",x="quick",y="__oG",A="key",z="abstract",C="drag",B="qx.ui.core.selection.Abstract";qx.Class.define(B,{type:z,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__oD={};},events:{"changeSelection":q},properties:{mode:{check:[n,j,k,o],init:n,apply:r},drag:{check:L,init:false},quick:{check:L,init:false}},members:{__oE:0,__oF:0,__oG:null,__oH:null,__oI:null,__oJ:null,__oK:null,__oL:null,__oM:null,__oN:null,__oO:null,__oP:null,__oQ:null,__oR:null,__oS:null,__oT:null,__oU:null,__oD:null,__oV:null,__oW:null,_userInteraction:false,__oX:null,getSelectionContext:function(){return this.__oT;},selectAll:function(){var N=this.getMode();if(N==n||N==o){throw new Error("Can not select all items in selection mode: "+N);}this._selectAllItems();this._fireChange();},selectItem:function(O){this._setSelectedItem(O);var P=this.getMode();if(P!==n&&P!==o){this._setLeadItem(O);this._setAnchorItem(O);}this._scrollItemIntoView(O);this._fireChange();},addItem:function(Q){var R=this.getMode();if(R===n||R===o){this._setSelectedItem(Q);}else{if(!this._getAnchorItem()){this._setAnchorItem(Q);}this._setLeadItem(Q);this._addToSelection(Q);}this._scrollItemIntoView(Q);this._fireChange();},removeItem:function(S){this._removeFromSelection(S);if(this.getMode()===o&&this.isSelectionEmpty()){var T=this._getFirstSelectable();if(T){this.addItem(T);}if(T==S){return;}}if(this.getLeadItem()==S){this._setLeadItem(null);}if(this._getAnchorItem()==S){this._setAnchorItem(null);}this._fireChange();},selectItemRange:function(U,V){var W=this.getMode();if(W==n||W==o){throw new Error("Can not select multiple items in selection mode: "+W);}this._selectItemRange(U,V);this._setAnchorItem(U);this._setLeadItem(V);this._scrollItemIntoView(V);this._fireChange();},clearSelection:function(){if(this.getMode()==o){return;}this._clearSelection();this._setLeadItem(null);this._setAnchorItem(null);this._fireChange();},replaceSelection:function(X){var Y=this.getMode();if(Y==o||Y===n){if(X.length>1){throw new Error("Could not select more than one items in mode: "+Y+"!");}if(X.length==1){this.selectItem(X[0]);}else{this.clearSelection();}return;}else{this._replaceMultiSelection(X);}},getSelectedItem:function(){var ba=this.getMode();if(ba===n||ba===o){return this._getSelectedItem()||null;}throw new Error("The method getSelectedItem() is only supported in 'single' and 'one' selection mode!");},getSelection:function(){return qx.lang.Object.getValues(this.__oD);},getSortedSelection:function(){var bc=this.getSelectables();var bb=qx.lang.Object.getValues(this.__oD);bb.sort(function(a,b){return bc.indexOf(a)-bc.indexOf(b);});return bb;},isItemSelected:function(bd){var be=this._selectableToHashCode(bd);return this.__oD[be]!==undefined;},isSelectionEmpty:function(){return qx.lang.Object.isEmpty(this.__oD);},invertSelection:function(){var bg=this.getMode();if(bg===n||bg===o){throw new Error("The method invertSelection() is only supported in 'multi' and 'additive' selection mode!");}var bf=this.getSelectables();for(var i=0;i<bf.length;i++){this._toggleInSelection(bf[i]);}this._fireChange();},_setLeadItem:function(bh){var bi=this.__oU;if(bi!==null){this._styleSelectable(bi,d,false);}if(bh!==null){this._styleSelectable(bh,d,true);}this.__oU=bh;},getLeadItem:function(){return this.__oU!==null?this.__oU:null;},_setAnchorItem:function(bj){var bk=this.__oV;if(bk){this._styleSelectable(bk,J,false);}if(bj){this._styleSelectable(bj,J,true);}this.__oV=bj;},_getAnchorItem:function(){return this.__oV!==null?this.__oV:null;},_isSelectable:function(bl){throw new Error("Abstract method call: _isSelectable()");},_getSelectableFromMouseEvent:function(event){var bm=event.getTarget();if(bm&&this._isSelectable(bm)){return bm;}return null;},_selectableToHashCode:function(bn){throw new Error("Abstract method call: _selectableToHashCode()");},_styleSelectable:function(bo,bp,bq){throw new Error("Abstract method call: _styleSelectable()");},_capture:function(){throw new Error("Abstract method call: _capture()");},_releaseCapture:function(){throw new Error("Abstract method call: _releaseCapture()");},_getLocation:function(){throw new Error("Abstract method call: _getLocation()");},_getDimension:function(){throw new Error("Abstract method call: _getDimension()");},_getSelectableLocationX:function(br){throw new Error("Abstract method call: _getSelectableLocationX()");},_getSelectableLocationY:function(bs){throw new Error("Abstract method call: _getSelectableLocationY()");},_getScroll:function(){throw new Error("Abstract method call: _getScroll()");},_scrollBy:function(bt,bu){throw new Error("Abstract method call: _scrollBy()");},_scrollItemIntoView:function(bv){throw new Error("Abstract method call: _scrollItemIntoView()");},getSelectables:function(bw){throw new Error("Abstract method call: getSelectables()");},_getSelectableRange:function(bx,by){throw new Error("Abstract method call: _getSelectableRange()");},_getFirstSelectable:function(){throw new Error("Abstract method call: _getFirstSelectable()");},_getLastSelectable:function(){throw new Error("Abstract method call: _getLastSelectable()");},_getRelatedSelectable:function(bz,bA){throw new Error("Abstract method call: _getRelatedSelectable()");},_getPage:function(bB,bC){throw new Error("Abstract method call: _getPage()");},_applyMode:function(bD,bE){this._setLeadItem(null);this._setAnchorItem(null);this._clearSelection();if(bD===o){var bF=this._getFirstSelectable();if(bF){this._setSelectedItem(bF);this._scrollItemIntoView(bF);}}this._fireChange();},handleMouseOver:function(event){if(this.__oX!=null&&this.__oX!=this._getScroll().top){this.__oX=null;return;}this._userInteraction=true;if(!this.getQuick()){this._userInteraction=false;return;}var bH=this.getMode();if(bH!==o&&bH!==n){this._userInteraction=false;return;}var bG=this._getSelectableFromMouseEvent(event);if(bG===null){this._userInteraction=false;return;}this._setSelectedItem(bG);this._fireChange(x);this._userInteraction=false;},handleMouseDown:function(event){this._userInteraction=true;var bJ=this._getSelectableFromMouseEvent(event);if(bJ===null){this._userInteraction=false;return;}var bL=event.isCtrlPressed()||(qx.bom.client.Platform.MAC&&event.isMetaPressed());var bI=event.isShiftPressed();if(this.isItemSelected(bJ)&&!bI&&!bL&&!this.getDrag()){this.__oW=bJ;this._userInteraction=false;return;}else{this.__oW=null;}this._scrollItemIntoView(bJ);switch(this.getMode()){case n:case o:this._setSelectedItem(bJ);break;case k:this._setLeadItem(bJ);this._setAnchorItem(bJ);this._toggleInSelection(bJ);break;case j:this._setLeadItem(bJ);if(bI){var bK=this._getAnchorItem();if(bK===null){bK=this._getFirstSelectable();this._setAnchorItem(bK);}this._selectItemRange(bK,bJ,bL);}else if(bL){this._setAnchorItem(bJ);this._toggleInSelection(bJ);}else{this._setAnchorItem(bJ);this._setSelectedItem(bJ);}break;}var bM=this.getMode();if(this.getDrag()&&bM!==n&&bM!==o&&!bI&&!bL){this.__oK=this._getLocation();this.__oH=this._getScroll();this.__oL=event.getDocumentLeft()+this.__oH.left;this.__oM=event.getDocumentTop()+this.__oH.top;this.__oN=true;this._capture();}this._fireChange(E);this._userInteraction=false;},handleMouseUp:function(event){this._userInteraction=true;var bQ=event.isCtrlPressed()||(qx.bom.client.Platform.MAC&&event.isMetaPressed());var bN=event.isShiftPressed();if(!bQ&&!bN&&this.__oW){var bO=this._getSelectableFromMouseEvent(event);if(bO===null||!this.isItemSelected(bO)){this._userInteraction=false;return;}var bP=this.getMode();if(bP===k){this._removeFromSelection(bO);}else{this._setSelectedItem(bO);if(this.getMode()===j){this._setLeadItem(bO);this._setAnchorItem(bO);}}this._userInteraction=false;}this._cleanup();},handleLoseCapture:function(event){this._cleanup();},handleMouseMove:function(event){if(!this.__oN){return;}this.__oO=event.getDocumentLeft();this.__oP=event.getDocumentTop();this._userInteraction=true;var bS=this.__oO+this.__oH.left;if(bS>this.__oL){this.__oQ=1;}else if(bS<this.__oL){this.__oQ=-1;}else{this.__oQ=0;}var bR=this.__oP+this.__oH.top;if(bR>this.__oM){this.__oR=1;}else if(bR<this.__oM){this.__oR=-1;}else{this.__oR=0;}var location=this.__oK;if(this.__oO<location.left){this.__oE=this.__oO-location.left;}else if(this.__oO>location.right){this.__oE=this.__oO-location.right;}else{this.__oE=0;}if(this.__oP<location.top){this.__oF=this.__oP-location.top;}else if(this.__oP>location.bottom){this.__oF=this.__oP-location.bottom;}else{this.__oF=0;}if(!this.__oG){this.__oG=new qx.event.Timer(100);this.__oG.addListener(s,this._onInterval,this);}this.__oG.start();this._autoSelect();event.stopPropagation();this._userInteraction=false;},handleAddItem:function(e){var bT=e.getData();if(this.getMode()===o&&this.isSelectionEmpty()){this.addItem(bT);}},handleRemoveItem:function(e){this.removeItem(e.getData());},_cleanup:function(){if(!this.getDrag()&&this.__oN){return;}if(this.__oS){this._fireChange(E);}delete this.__oN;delete this.__oI;delete this.__oJ;this._releaseCapture();if(this.__oG){this.__oG.stop();}},_onInterval:function(e){this._scrollBy(this.__oE,this.__oF);this.__oH=this._getScroll();this._autoSelect();},_autoSelect:function(){var cd=this._getDimension();var bV=Math.max(0,Math.min(this.__oO-this.__oK.left,cd.width))+this.__oH.left;var bU=Math.max(0,Math.min(this.__oP-this.__oK.top,cd.height))+this.__oH.top;if(this.__oI===bV&&this.__oJ===bU){return;}this.__oI=bV;this.__oJ=bU;var cf=this._getAnchorItem();var bX=cf;var cb=this.__oQ;var ce,bW;while(cb!==0){ce=cb>0?this._getRelatedSelectable(bX,F):this._getRelatedSelectable(bX,v);if(ce!==null){bW=this._getSelectableLocationX(ce);if((cb>0&&bW.left<=bV)||(cb<0&&bW.right>=bV)){bX=ce;continue;}}break;}var cc=this.__oR;var ca,bY;while(cc!==0){ca=cc>0?this._getRelatedSelectable(bX,g):this._getRelatedSelectable(bX,D);if(ca!==null){bY=this._getSelectableLocationY(ca);if((cc>0&&bY.top<=bU)||(cc<0&&bY.bottom>=bU)){bX=ca;continue;}}break;}var cg=this.getMode();if(cg===j){this._selectItemRange(cf,bX);}else if(cg===k){if(this.isItemSelected(cf)){this._selectItemRange(cf,bX,true);}else{this._deselectItemRange(cf,bX);}this._setAnchorItem(bX);}this._fireChange(C);},__oY:{Home:1,Down:1,Right:1,PageDown:1,End:1,Up:1,Left:1,PageUp:1},handleKeyPress:function(event){this._userInteraction=true;var cm,cl;var co=event.getKeyIdentifier();var cn=this.getMode();var ci=event.isCtrlPressed()||(qx.bom.client.Platform.MAC&&event.isMetaPressed());var cj=event.isShiftPressed();var ck=false;if(co===t&&ci){if(cn!==n&&cn!==o){this._selectAllItems();ck=true;}}else if(co===w){if(cn!==n&&cn!==o){this._clearSelection();ck=true;}}else if(co===u){var ch=this.getLeadItem();if(ch&&!cj){if(ci||cn===k){this._toggleInSelection(ch);}else{this._setSelectedItem(ch);}ck=true;}}else if(this.__oY[co]){ck=true;if(cn===n||cn==o){cm=this._getSelectedItem();}else{cm=this.getLeadItem();}if(cm!==null){switch(co){case H:cl=this._getFirstSelectable();break;case I:cl=this._getLastSelectable();break;case M:cl=this._getRelatedSelectable(cm,D);break;case c:cl=this._getRelatedSelectable(cm,g);break;case f:cl=this._getRelatedSelectable(cm,v);break;case G:cl=this._getRelatedSelectable(cm,F);break;case h:cl=this._getPage(cm,true);break;case K:cl=this._getPage(cm,false);break;}}else{switch(co){case H:case c:case G:case K:cl=this._getFirstSelectable();break;case I:case M:case f:case h:cl=this._getLastSelectable();break;}}if(cl!==null){switch(cn){case n:case o:this._setSelectedItem(cl);break;case k:this._setLeadItem(cl);break;case j:if(cj){var cp=this._getAnchorItem();if(cp===null){this._setAnchorItem(cp=this._getFirstSelectable());}this._setLeadItem(cl);this._selectItemRange(cp,cl,ci);}else{this._setAnchorItem(cl);this._setLeadItem(cl);if(!ci){this._setSelectedItem(cl);}}break;}this.__oX=this._getScroll().top;this._scrollItemIntoView(cl);}}if(ck){event.stop();this._fireChange(A);}this._userInteraction=false;},_selectAllItems:function(){var cq=this.getSelectables();for(var i=0,l=cq.length;i<l;i++){this._addToSelection(cq[i]);}},_clearSelection:function(){var cr=this.__oD;for(var cs in cr){this._removeFromSelection(cr[cs]);}this.__oD={};},_selectItemRange:function(ct,cu,cv){var cy=this._getSelectableRange(ct,cu);if(!cv){var cx=this.__oD;var cz=this.__pa(cy);for(var cw in cx){if(!cz[cw]){this._removeFromSelection(cx[cw]);}}}for(var i=0,l=cy.length;i<l;i++){this._addToSelection(cy[i]);}},_deselectItemRange:function(cA,cB){var cC=this._getSelectableRange(cA,cB);for(var i=0,l=cC.length;i<l;i++){this._removeFromSelection(cC[i]);}},__pa:function(cD){var cF={};var cE;for(var i=0,l=cD.length;i<l;i++){cE=cD[i];cF[this._selectableToHashCode(cE)]=cE;}return cF;},_getSelectedItem:function(){for(var cG in this.__oD){return this.__oD[cG];}return null;},_setSelectedItem:function(cH){if(this._isSelectable(cH)){var cI=this.__oD;var cJ=this._selectableToHashCode(cH);if(!cI[cJ]||qx.lang.Object.hasMinLength(cI,2)){this._clearSelection();this._addToSelection(cH);}}},_addToSelection:function(cK){var cL=this._selectableToHashCode(cK);if(!this.__oD[cL]&&this._isSelectable(cK)){this.__oD[cL]=cK;this._styleSelectable(cK,m,true);this.__oS=true;}},_toggleInSelection:function(cM){var cN=this._selectableToHashCode(cM);if(!this.__oD[cN]){this.__oD[cN]=cM;this._styleSelectable(cM,m,true);}else{delete this.__oD[cN];this._styleSelectable(cM,m,false);}this.__oS=true;},_removeFromSelection:function(cO){var cP=this._selectableToHashCode(cO);if(this.__oD[cP]!=null){delete this.__oD[cP];this._styleSelectable(cO,m,false);this.__oS=true;}},_replaceMultiSelection:function(cQ){var cT=false;var cW,cV;var cR={};for(var i=0,l=cQ.length;i<l;i++){cW=cQ[i];if(this._isSelectable(cW)){cV=this._selectableToHashCode(cW);cR[cV]=cW;}}var cX=cQ[0];var cS=cW;var cU=this.__oD;for(var cV in cU){if(cR[cV]){delete cR[cV];}else{cW=cU[cV];delete cU[cV];this._styleSelectable(cW,m,false);cT=true;}}for(var cV in cR){cW=cU[cV]=cR[cV];this._styleSelectable(cW,m,true);cT=true;}if(!cT){return false;}this._scrollItemIntoView(cS);this._setLeadItem(cX);this._setAnchorItem(cX);this.__oS=true;this._fireChange();},_fireChange:function(cY){if(this.__oS){this.__oT=cY||null;this.fireDataEvent(p,this.getSelection());delete this.__oS;}}},destruct:function(){this._disposeObjects(y);this.__oD=this.__oW=this.__oV=null;this.__oU=null;}});})();(function(){var f="vertical",e="under",d="above",c="qx.ui.core.selection.Widget",b="left",a="right";qx.Class.define(c,{extend:qx.ui.core.selection.Abstract,construct:function(g){qx.ui.core.selection.Abstract.call(this);this.__nW=g;},members:{__nW:null,_isSelectable:function(h){return this._isItemSelectable(h)&&h.getLayoutParent()===this.__nW;},_selectableToHashCode:function(j){return j.$$hash;},_styleSelectable:function(k,m,n){n?k.addState(m):k.removeState(m);},_capture:function(){this.__nW.capture();},_releaseCapture:function(){this.__nW.releaseCapture();},_isItemSelectable:function(o){if(this._userInteraction){return o.isVisible()&&o.isEnabled();}else{return o.isVisible();}},_getWidget:function(){return this.__nW;},_getLocation:function(){var p=this.__nW.getContentElement().getDomElement();return p?qx.bom.element.Location.get(p):null;},_getDimension:function(){return this.__nW.getInnerSize();},_getSelectableLocationX:function(q){var r=q.getBounds();if(r){return {left:r.left,right:r.left+r.width};}},_getSelectableLocationY:function(s){var t=s.getBounds();if(t){return {top:t.top,bottom:t.top+t.height};}},_getScroll:function(){return {left:0,top:0};},_scrollBy:function(u,v){},_scrollItemIntoView:function(w){this.__nW.scrollChildIntoView(w);},getSelectables:function(x){var y=false;if(!x){y=this._userInteraction;this._userInteraction=true;}var B=this.__nW.getChildren();var z=[];var A;for(var i=0,l=B.length;i<l;i++){A=B[i];if(this._isItemSelectable(A)){z.push(A);}}this._userInteraction=y;return z;},_getSelectableRange:function(C,D){if(C===D){return [C];}var H=this.__nW.getChildren();var E=[];var G=false;var F;for(var i=0,l=H.length;i<l;i++){F=H[i];if(F===C||F===D){if(G){E.push(F);break;}else{G=true;}}if(G&&this._isItemSelectable(F)){E.push(F);}}return E;},_getFirstSelectable:function(){var I=this.__nW.getChildren();for(var i=0,l=I.length;i<l;i++){if(this._isItemSelectable(I[i])){return I[i];}}return null;},_getLastSelectable:function(){var J=this.__nW.getChildren();for(var i=J.length-1;i>0;i--){if(this._isItemSelectable(J[i])){return J[i];}}return null;},_getRelatedSelectable:function(K,L){var O=this.__nW.getOrientation()===f;var N=this.__nW.getChildren();var M=N.indexOf(K);var P;if((O&&L===d)||(!O&&L===b)){for(var i=M-1;i>=0;i--){P=N[i];if(this._isItemSelectable(P)){return P;}}}else if((O&&L===e)||(!O&&L===a)){for(var i=M+1;i<N.length;i++){P=N[i];if(this._isItemSelectable(P)){return P;}}}return null;},_getPage:function(Q,R){if(R){return this._getFirstSelectable();}else{return this._getLastSelectable();}}},destruct:function(){this.__nW=null;}});})();(function(){var a="qx.ui.core.selection.ScrollArea";qx.Class.define(a,{extend:qx.ui.core.selection.Widget,members:{_isSelectable:function(b){return this._isItemSelectable(b)&&b.getLayoutParent()===this._getWidget().getChildrenContainer();},_getDimension:function(){return this._getWidget().getPaneSize();},_getScroll:function(){var c=this._getWidget();return {left:c.getScrollX(),top:c.getScrollY()};},_scrollBy:function(d,e){var f=this._getWidget();f.scrollByX(d);f.scrollByY(e);},_getPage:function(g,h){var m=this.getSelectables();var length=m.length;var p=m.indexOf(g);if(p===-1){throw new Error("Invalid lead item: "+g);}var j=this._getWidget();var r=j.getScrollY();var innerHeight=j.getInnerSize().height;var top,l,q;if(h){var o=r;var i=p;while(1){for(;i>=0;i--){top=j.getItemTop(m[i]);if(top<o){q=i+1;break;}}if(q==null){var s=this._getFirstSelectable();return s==g?null:s;}if(q>=p){o-=innerHeight+r-j.getItemBottom(g);q=null;continue;}return m[q];}}else{var n=innerHeight+r;var i=p;while(1){for(;i<length;i++){l=j.getItemBottom(m[i]);if(l>n){q=i-1;break;}}if(q==null){var k=this._getLastSelectable();return k==g?null:k;}if(q<=p){n+=j.getItemTop(g)-r;q=null;continue;}return m[q];}}}}});})();(function(){var e="right",d="above",c="left",b="under",a="qx.ui.tree.SelectionManager";qx.Class.define(a,{extend:qx.ui.core.selection.ScrollArea,members:{_getSelectableLocationY:function(f){var g=f.getBounds();if(g){var top=this._getWidget().getItemTop(f);return {top:top,bottom:top+g.height};}},_isSelectable:function(h){return this._isItemSelectable(h)&&h instanceof qx.ui.tree.AbstractTreeItem;},_getSelectableFromMouseEvent:function(event){return this._getWidget().getTreeItem(event.getTarget());},getSelectables:function(j){var m=false;if(!j){m=this._userInteraction;this._userInteraction=true;}var l=this._getWidget();var n=[];if(l.getRoot()!=null){var k=l.getRoot().getItems(true,!!j,l.getHideRoot());for(var i=0;i<k.length;i++){if(this._isSelectable(k[i])){n.push(k[i]);}}}this._userInteraction=m;return n;},_getSelectableRange:function(o,p){if(o===p){return [o];}var q=this.getSelectables();var r=q.indexOf(o);var s=q.indexOf(p);if(r<0||s<0){return [];}if(r<s){return q.slice(r,s+1);}else{return q.slice(s,r+1);}},_getFirstSelectable:function(){return this.getSelectables()[0]||null;},_getLastSelectable:function(){var t=this.getSelectables();if(t.length>0){return t[t.length-1];}else{return null;}},_getRelatedSelectable:function(u,v){var w=this._getWidget();var x=null;switch(v){case d:x=w.getPreviousNodeOf(u,false);break;case b:x=w.getNextNodeOf(u,false);break;case c:case e:break;}if(!x){return null;}if(this._isSelectable(x)){return x;}else{return this._getRelatedSelectable(x,v);}}}});})();(function(){var l="dblclick",k="click",j="Boolean",h="excluded",g="visible",f="qx.event.type.Data",d="_applyOpenMode",c="Space",b="Left",a="Enter",z="changeOpenMode",y="_applyRootOpenClose",x="changeSelection",w="qx.ui.tree.Tree",v="tree",u="_applyHideRoot",t="changeRoot",s="_applyRoot",r="keypress",q="none",o="pane",p="Right",m="qx.ui.tree.AbstractTreeItem",n="__sv";qx.Class.define(w,{extend:qx.ui.core.scroll.AbstractScrollArea,implement:[qx.ui.core.IMultiSelection,qx.ui.form.IModelSelection,qx.ui.form.IForm],include:[qx.ui.core.MMultiSelectionHandling,qx.ui.core.MContentPadding,qx.ui.form.MModelSelection,qx.ui.form.MForm],construct:function(){qx.ui.core.scroll.AbstractScrollArea.call(this);this.__sv=new qx.ui.container.Composite(new qx.ui.layout.VBox()).set({allowShrinkY:false,allowGrowX:true});this.getChildControl(o).add(this.__sv);this.initOpenMode();this.initRootOpenClose();this.addListener(x,this._onChangeSelection,this);this.addListener(r,this._onKeyPress,this);},events:{addItem:f,removeItem:f},properties:{openMode:{check:[k,l,q],init:l,apply:d,event:z,themeable:true},root:{check:m,init:null,nullable:true,event:t,apply:s},hideRoot:{check:j,init:false,apply:u},rootOpenClose:{check:j,init:false,apply:y},appearance:{refine:true,init:v},focusable:{refine:true,init:true}},members:{__sv:null,SELECTION_MANAGER:qx.ui.tree.SelectionManager,getChildrenContainer:function(){return this.__sv;},_applyRoot:function(A,B){var C=this.getChildrenContainer();if(B){C.remove(B);if(B.hasChildren()){C.remove(B.getChildrenContainer());}}if(A){C.add(A);if(A.hasChildren()){C.add(A.getChildrenContainer());}A.setVisibility(this.getHideRoot()?h:g);A.recursiveAddToWidgetQueue();}},_applyHideRoot:function(D,E){var F=this.getRoot();if(!F){return;}F.setVisibility(D?h:g);F.recursiveAddToWidgetQueue();},_applyRootOpenClose:function(G,H){var I=this.getRoot();if(!I){return;}I.recursiveAddToWidgetQueue();},_getContentPaddingTarget:function(){return this.__sv;},getNextNodeOf:function(J,K){if((K!==false||J.isOpen())&&J.hasChildren()){return J.getChildren()[0];}while(J){var parent=J.getParent();if(!parent){return null;}var M=parent.getChildren();var L=M.indexOf(J);if(L>-1&&L<M.length-1){return M[L+1];}J=parent;}return null;},getPreviousNodeOf:function(N,O){var parent=N.getParent();if(!parent){return null;}if(this.getHideRoot()){if(parent==this.getRoot()){if(parent.getChildren()[0]==N){return null;}}}else{if(N==this.getRoot()){return null;}}var R=parent.getChildren();var P=R.indexOf(N);if(P>0){var Q=R[P-1];while((O!==false||Q.isOpen())&&Q.hasChildren()){var S=Q.getChildren();Q=S[S.length-1];}return Q;}else{return parent;}},getNextSiblingOf:function(T){if(T==this.getRoot()){return null;}var parent=T.getParent();var U=parent.getChildren();var V=U.indexOf(T);if(V<U.length-1){return U[V+1];}return null;},getPreviousSiblingOf:function(W){if(W==this.getRoot()){return null;}var parent=W.getParent();var X=parent.getChildren();var Y=X.indexOf(W);if(Y>0){return X[Y-1];}return null;},getItems:function(ba,bb){if(this.getRoot()!=null){return this.getRoot().getItems(ba,bb,this.getHideRoot());}else{return [];}},getChildren:function(){if(this.getRoot()!=null){return [this.getRoot()];}else{return [];}},getTreeItem:function(bc){while(bc){if(bc==this){return null;}if(bc instanceof qx.ui.tree.AbstractTreeItem){return bc;}bc=bc.getLayoutParent();}return null;},_applyOpenMode:function(bd,be){if(be==k){this.removeListener(k,this._onOpen,this);}else if(be==l){this.removeListener(l,this._onOpen,this);}if(bd==k){this.addListener(k,this._onOpen,this);}else if(bd==l){this.addListener(l,this._onOpen,this);}},_onOpen:function(e){var bf=this.getTreeItem(e.getTarget());if(!bf||!bf.isOpenable()){return;}bf.setOpen(!bf.isOpen());e.stopPropagation();},_onChangeSelection:function(e){var bh=e.getData();for(var i=0;i<bh.length;i++){var bg=bh[i];while(bg.getParent()!=null){bg=bg.getParent();bg.setOpen(true);}}},_onKeyPress:function(e){var bi=this._getLeadItem();if(bi!==null){switch(e.getKeyIdentifier()){case b:if(bi.isOpenable()&&bi.isOpen()){bi.setOpen(false);}break;case p:if(bi.isOpenable()&&!bi.isOpen()){bi.setOpen(true);}break;case a:case c:if(bi.isOpenable()){bi.toggleOpen();}break;}}}},destruct:function(){this._disposeObjects(n);}});})();(function(){var d=".",c="apiviewer.ui.PackageTree",b="Documentation",a="__SR";qx.Class.define(c,{extend:qx.ui.tree.Tree,construct:function(){qx.ui.tree.Tree.call(this,b);this.setDecorator(null);this.__SR=new qx.ui.tree.TreeFolder("Packages");this.__SR.setOpen(true);this.setRoot(this.__SR);this.setSelection([this.__SR]);this._classTreeNodeHash={};},members:{__SR:null,setTreeData:function(e){this._docTree=e;this.__ST(this.__SR,e,0);if(this._wantedClassName){this.selectTreeNodeByClassName(this._wantedClassName);this._wantedClassName=null;}},selectTreeNodeByClassName:function(f){if(this._docTree==null){this._wantedClassName=f;return true;}var j=f.split(d);var h=j[0];var i=0;do{var g=this._classTreeNodeHash[h];if(!g){return false;}if(!g.loaded){g.setOpen(true);}i++;h+=d+j[i];}while(i<j.length);this.setSelection([g]);this.scrollChildIntoView(g);return true;},__SS:function(k,l,m){var self=this;return function(){if(!k.loaded){self.__ST(k,l,m+1);k.setOpenSymbolMode("always");}};},__ST:function(n,o,p){n.loaded=true;var s=apiviewer.ui.PackageTree;var q=o.getPackages();for(var i=0;i<q.length;i++){var r=q[i];var v=apiviewer.TreeUtil.getIconUrl(r);var w=new qx.ui.tree.TreeFolder(r.getName());w.setIcon(v);w.setOpenSymbolMode("always");w.setUserData("nodeName",r.getFullName());n.add(w);w.addListener("changeOpen",this.__SS(w,r,p+1),this);if(p<qx.core.Setting.get("apiviewer.initialTreeDepth")&&r.getPackages().length>0){w.setOpen(true);}this._classTreeNodeHash[r.getFullName()]=w;}var x=o.getClasses();for(var i=0;i<x.length;i++){var u=x[i];var v=apiviewer.TreeUtil.getIconUrl(u);var t=new qx.ui.tree.TreeFolder(u.getName());t.setIcon(v);t.setUserData("nodeName",u.getFullName());t.treeType=s.PACKAGE_TREE;n.add(t);this._classTreeNodeHash[u.getFullName()]=t;}}},destruct:function(){this._docTree=this._classTreeNodeHash=null;this._disposeObjects(a);}});})();(function(){var b="qx.ui.core.scroll.IScrollBar",a="qx.event.type.Data";qx.Interface.define(b,{events:{"scroll":a},properties:{orientation:{},maximum:{},position:{},knobFactor:{}},members:{scrollTo:function(c){this.assertNumber(c);},scrollBy:function(d){this.assertNumber(d);},scrollBySteps:function(e){this.assertNumber(e);}}});})();(function(){var k="horizontal",j="px",i="scroll",h="vertical",g="-1px",f="qx.client",d="0",c="hidden",b="mousedown",a="qx.ui.core.scroll.NativeScrollBar",z="PositiveNumber",y="__pT",x="Integer",w="mousemove",v="_applyMaximum",u="_applyOrientation",t="appear",s="opera",r="PositiveInteger",q="mshtml",o="mouseup",p="Number",m="_applyPosition",n="scrollbar",l="native";qx.Class.define(a,{extend:qx.ui.core.Widget,implement:qx.ui.core.scroll.IScrollBar,construct:function(A){qx.ui.core.Widget.call(this);this.addState(l);this.getContentElement().addListener(i,this._onScroll,this);this.addListener(b,this._stopPropagation,this);this.addListener(o,this._stopPropagation,this);this.addListener(w,this._stopPropagation,this);if(qx.core.Variant.isSet(f,s)){this.addListener(t,this._onAppear,this);}this.getContentElement().add(this._getScrollPaneElement());if(A!=null){this.setOrientation(A);}else{this.initOrientation();}},properties:{appearance:{refine:true,init:n},orientation:{check:[k,h],init:k,apply:u},maximum:{check:r,apply:v,init:100},position:{check:p,init:0,apply:m,event:i},singleStep:{check:x,init:20},knobFactor:{check:z,nullable:true}},members:{__pS:null,__pT:null,_getScrollPaneElement:function(){if(!this.__pT){this.__pT=new qx.html.Element();}return this.__pT;},renderLayout:function(B,top,C,D){var E=qx.ui.core.Widget.prototype.renderLayout.call(this,B,top,C,D);this._updateScrollBar();return E;},_getContentHint:function(){var F=qx.bom.element.Overflow.getScrollbarWidth();return {width:this.__pS?100:F,maxWidth:this.__pS?null:F,minWidth:this.__pS?null:F,height:this.__pS?F:100,maxHeight:this.__pS?F:null,minHeight:this.__pS?F:null};},_applyEnabled:function(G,H){qx.ui.core.Widget.prototype._applyEnabled.call(this,G,H);this._updateScrollBar();},_applyMaximum:function(I){this._updateScrollBar();},_applyPosition:function(J){var content=this.getContentElement();if(this.__pS){content.scrollToX(J);}else{content.scrollToY(J);}},_applyOrientation:function(K,L){var M=this.__pS=K===k;this.set({allowGrowX:M,allowShrinkX:M,allowGrowY:!M,allowShrinkY:!M});if(M){this.replaceState(h,k);}else{this.replaceState(k,h);}this.getContentElement().setStyles({overflowX:M?i:c,overflowY:M?c:i});qx.ui.core.queue.Layout.add(this);},_updateScrollBar:function(){var O=this.__pS;var P=this.getBounds();if(!P){return;}if(this.isEnabled()){var Q=O?P.width:P.height;var N=this.getMaximum()+Q;}else{N=0;}if(qx.core.Variant.isSet(f,q)){var P=this.getBounds();this.getContentElement().setStyles({left:O?d:g,top:O?g:d,width:(O?P.width:P.width+1)+j,height:(O?P.height+1:P.height)+j});}this._getScrollPaneElement().setStyles({left:0,top:0,width:(O?N:1)+j,height:(O?1:N)+j});this.scrollTo(this.getPosition());},scrollTo:function(R){this.setPosition(Math.max(0,Math.min(this.getMaximum(),R)));},scrollBy:function(S){this.scrollTo(this.getPosition()+S);},scrollBySteps:function(T){var U=this.getSingleStep();this.scrollBy(T*U);},_onScroll:function(e){var W=this.getContentElement();var V=this.__pS?W.getScrollX():W.getScrollY();this.setPosition(V);},_onAppear:function(e){this.scrollTo(this.getPosition());},_stopPropagation:function(e){e.stopPropagation();}},destruct:function(){this._disposeObjects(y);}});})();(function(){var k="slider",j="horizontal",i="button-begin",h="vertical",g="button-end",f="Integer",d="execute",c="right",b="left",a="down",z="up",y="PositiveNumber",x="changeValue",w="qx.lang.Type.isNumber(value)&&value>=0&&value<=this.getMaximum()",v="_applyKnobFactor",u="knob",t="qx.ui.core.scroll.ScrollBar",s="resize",r="_applyOrientation",q="_applyPageStep",o="PositiveInteger",p="scroll",m="_applyPosition",n="scrollbar",l="_applyMaximum";qx.Class.define(t,{extend:qx.ui.core.Widget,implement:qx.ui.core.scroll.IScrollBar,construct:function(A){qx.ui.core.Widget.call(this);this._createChildControl(i);this._createChildControl(k).addListener(s,this._onResizeSlider,this);this._createChildControl(g);if(A!=null){this.setOrientation(A);}else{this.initOrientation();}},properties:{appearance:{refine:true,init:n},orientation:{check:[j,h],init:j,apply:r},maximum:{check:o,apply:l,init:100},position:{check:w,init:0,apply:m,event:p},singleStep:{check:f,init:20},pageStep:{check:f,init:10,apply:q},knobFactor:{check:y,apply:v,nullable:true}},members:{__oC:2,_createChildControlImpl:function(B,C){var D;switch(B){case k:D=new qx.ui.core.scroll.ScrollSlider();D.setPageStep(100);D.setFocusable(false);D.addListener(x,this._onChangeSliderValue,this);this._add(D,{flex:1});break;case i:D=new qx.ui.form.RepeatButton();D.setFocusable(false);D.addListener(d,this._onExecuteBegin,this);this._add(D);break;case g:D=new qx.ui.form.RepeatButton();D.setFocusable(false);D.addListener(d,this._onExecuteEnd,this);this._add(D);break;}return D||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,B);},_applyMaximum:function(E){this.getChildControl(k).setMaximum(E);},_applyPosition:function(F){this.getChildControl(k).setValue(F);},_applyKnobFactor:function(G){this.getChildControl(k).setKnobFactor(G);},_applyPageStep:function(H){this.getChildControl(k).setPageStep(H);},_applyOrientation:function(I,J){var K=this._getLayout();if(K){K.dispose();}if(I===j){this._setLayout(new qx.ui.layout.HBox());this.setAllowStretchX(true);this.setAllowStretchY(false);this.replaceState(h,j);this.getChildControl(i).replaceState(z,b);this.getChildControl(g).replaceState(a,c);}else{this._setLayout(new qx.ui.layout.VBox());this.setAllowStretchX(false);this.setAllowStretchY(true);this.replaceState(j,h);this.getChildControl(i).replaceState(b,z);this.getChildControl(g).replaceState(c,a);}this.getChildControl(k).setOrientation(I);},scrollTo:function(L){this.getChildControl(k).slideTo(L);},scrollBy:function(M){this.getChildControl(k).slideBy(M);},scrollBySteps:function(N){var O=this.getSingleStep();this.getChildControl(k).slideBy(N*O);},_onExecuteBegin:function(e){this.scrollBy(-this.getSingleStep());},_onExecuteEnd:function(e){this.scrollBy(this.getSingleStep());},_onChangeSliderValue:function(e){this.setPosition(e.getData());},_onResizeSlider:function(e){var P=this.getChildControl(k).getChildControl(u);var S=P.getSizeHint();var Q=false;var R=this.getChildControl(k).getInnerSize();if(this.getOrientation()==h){if(R.height<S.minHeight+this.__oC){Q=true;}}else{if(R.width<S.minWidth+this.__oC){Q=true;}}if(Q){P.exclude();}else{P.show();}}}});})();(function(){var a="qx.ui.form.IRange";qx.Interface.define(a,{members:{setMinimum:function(b){return arguments.length==1;},getMinimum:function(){},setMaximum:function(c){return arguments.length==1;},getMaximum:function(){},setSingleStep:function(d){return arguments.length==1;},getSingleStep:function(){},setPageStep:function(e){return arguments.length==1;},getPageStep:function(){}}});})();(function(){var b="qx.ui.form.INumberForm",a="qx.event.type.Data";qx.Interface.define(b,{events:{"changeValue":a},members:{setValue:function(c){return arguments.length==1;},resetValue:function(){},getValue:function(){}}});})();(function(){var k="knob",j="horizontal",i="vertical",h="Integer",g="hovered",f="left",d="top",c="mouseup",b="pressed",a="px",V="changeValue",U="interval",T="mousemove",S="resize",R="slider",Q="mousedown",P="PageUp",O="mouseout",N='qx.event.type.Data',M="Left",r="Down",s="Up",p="dblclick",q="qx.ui.form.Slider",n="PageDown",o="mousewheel",l="_applyValue",m="_applyKnobFactor",t="End",u="height",B="Right",z="width",F="_applyOrientation",D="Home",I="mouseover",H="floor",w="_applyMinimum",L="click",K="typeof value==='number'&&value>=this.getMinimum()&&value<=this.getMaximum()",J="keypress",v="ceil",x="losecapture",y="contextmenu",A="_applyMaximum",C="Number",E="changeMaximum",G="changeMinimum";qx.Class.define(q,{extend:qx.ui.core.Widget,implement:[qx.ui.form.IForm,qx.ui.form.INumberForm,qx.ui.form.IRange],include:[qx.ui.form.MForm],construct:function(W){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.Canvas());this.addListener(J,this._onKeyPress);this.addListener(o,this._onMouseWheel);this.addListener(Q,this._onMouseDown);this.addListener(c,this._onMouseUp);this.addListener(x,this._onMouseUp);this.addListener(S,this._onUpdate);this.addListener(y,this._onStopEvent);this.addListener(L,this._onStopEvent);this.addListener(p,this._onStopEvent);if(W!=null){this.setOrientation(W);}else{this.initOrientation();}},events:{changeValue:N},properties:{appearance:{refine:true,init:R},focusable:{refine:true,init:true},orientation:{check:[j,i],init:j,apply:F},value:{check:K,init:0,apply:l,nullable:true},minimum:{check:h,init:0,apply:w,event:G},maximum:{check:h,init:100,apply:A,event:E},singleStep:{check:h,init:1},pageStep:{check:h,init:10},knobFactor:{check:C,apply:m,nullable:true}},members:{__nA:null,__nB:null,__nC:null,__nD:null,__nE:null,__nF:null,__nG:null,__nH:null,__nI:null,__nJ:null,__nK:null,__nL:null,_forwardStates:{invalid:true},_createChildControlImpl:function(X,Y){var ba;switch(X){case k:ba=new qx.ui.core.Widget();ba.addListener(S,this._onUpdate,this);ba.addListener(I,this._onMouseOver);ba.addListener(O,this._onMouseOut);this._add(ba);break;}return ba||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,X);},_onMouseOver:function(e){this.addState(g);},_onMouseOut:function(e){this.removeState(g);},_onMouseWheel:function(e){var bb=e.getWheelDelta()>0?1:-1;this.slideBy(bb*this.getSingleStep());e.stop();},_onKeyPress:function(e){var bd=this.getOrientation()===j;var bc=bd?M:s;var forward=bd?B:r;switch(e.getKeyIdentifier()){case forward:this.slideForward();break;case bc:this.slideBack();break;case n:this.slidePageForward();break;case P:this.slidePageBack();break;case D:this.slideToBegin();break;case t:this.slideToEnd();break;default:return;}e.stop();},_onMouseDown:function(e){if(this.__nD){return;}var bg=this.__nN;var be=this.getChildControl(k);var bf=bg?f:d;var bi=bg?e.getDocumentLeft():e.getDocumentTop();var bj=this.__nA=qx.bom.element.Location.get(this.getContentElement().getDomElement())[bf];var bh=this.__nB=qx.bom.element.Location.get(be.getContainerElement().getDomElement())[bf];if(e.getTarget()===be){this.__nD=true;if(!this.__nJ){this.__nJ=new qx.event.Timer(100);this.__nJ.addListener(U,this._fireValue,this);}this.__nJ.start();this.__nE=bi+bj-bh;be.addState(b);}else{this.__nF=true;this.__nG=bi<=bh?-1:1;this.__nO(e);this._onInterval();if(!this.__nI){this.__nI=new qx.event.Timer(100);this.__nI.addListener(U,this._onInterval,this);}this.__nI.start();}this.addListener(T,this._onMouseMove);this.capture();e.stopPropagation();},_onMouseUp:function(e){if(this.__nD){this.releaseCapture();delete this.__nD;this.__nJ.stop();this._fireValue();delete this.__nE;this.getChildControl(k).removeState(b);if(e.getType()===c){var bl;var bm;var bk;if(this.__nN){bl=e.getDocumentLeft()-(this._valueToPosition(this.getValue())+this.__nA);bk=qx.bom.element.Location.get(this.getContentElement().getDomElement())[d];bm=e.getDocumentTop()-(bk+this.getChildControl(k).getBounds().top);}else{bl=e.getDocumentTop()-(this._valueToPosition(this.getValue())+this.__nA);bk=qx.bom.element.Location.get(this.getContentElement().getDomElement())[f];bm=e.getDocumentLeft()-(bk+this.getChildControl(k).getBounds().left);}if(bm<0||bm>this.__nC||bl<0||bl>this.__nC){this.getChildControl(k).removeState(g);}}}else if(this.__nF){this.__nI.stop();this.releaseCapture();delete this.__nF;delete this.__nG;delete this.__nH;}this.removeListener(T,this._onMouseMove);if(e.getType()===c){e.stopPropagation();}},_onMouseMove:function(e){if(this.__nD){var bo=this.__nN?e.getDocumentLeft():e.getDocumentTop();var bn=bo-this.__nE;this.slideTo(this._positionToValue(bn));}else if(this.__nF){this.__nO(e);}e.stopPropagation();},_onInterval:function(e){var bp=this.getValue()+(this.__nG*this.getPageStep());if(bp<this.getMinimum()){bp=this.getMinimum();}else if(bp>this.getMaximum()){bp=this.getMaximum();}var bq=this.__nG==-1;if((bq&&bp<=this.__nH)||(!bq&&bp>=this.__nH)){bp=this.__nH;}this.slideTo(bp);},_onUpdate:function(e){var bs=this.getInnerSize();var bt=this.getChildControl(k).getBounds();var br=this.__nN?z:u;this._updateKnobSize();this.__nM=bs[br]-bt[br];this.__nC=bt[br];this._updateKnobPosition();},__nN:false,__nM:0,__nO:function(e){var bu=this.__nN;var bB=bu?e.getDocumentLeft():e.getDocumentTop();var bD=this.__nA;var bv=this.__nB;var bF=this.__nC;var bC=bB-bD;if(bB>=bv){bC-=bF;}var bz=this._positionToValue(bC);var bw=this.getMinimum();var bx=this.getMaximum();if(bz<bw){bz=bw;}else if(bz>bx){bz=bx;}else{var bA=this.getValue();var by=this.getPageStep();var bE=this.__nG<0?H:v;bz=bA+(Math[bE]((bz-bA)/by)*by);}if(this.__nH==null||(this.__nG==-1&&bz<=this.__nH)||(this.__nG==1&&bz>=this.__nH)){this.__nH=bz;}},_positionToValue:function(bG){var bH=this.__nM;if(bH==null||bH==0){return 0;}var bJ=bG/bH;if(bJ<0){bJ=0;}else if(bJ>1){bJ=1;}var bI=this.getMaximum()-this.getMinimum();return this.getMinimum()+Math.round(bI*bJ);},_valueToPosition:function(bK){var bL=this.__nM;if(bL==null){return 0;}var bM=this.getMaximum()-this.getMinimum();if(bM==0){return 0;}var bK=bK-this.getMinimum();var bN=bK/bM;if(bN<0){bN=0;}else if(bN>1){bN=1;}return Math.round(bL*bN);},_updateKnobPosition:function(){this._setKnobPosition(this._valueToPosition(this.getValue()));},_setKnobPosition:function(bO){var bP=this.getChildControl(k).getContainerElement();if(this.__nN){bP.setStyle(f,bO+a,true);}else{bP.setStyle(d,bO+a,true);}},_updateKnobSize:function(){var bR=this.getKnobFactor();if(bR==null){return;}var bQ=this.getInnerSize();if(bQ==null){return;}if(this.__nN){this.getChildControl(k).setWidth(Math.round(bR*bQ.width));}else{this.getChildControl(k).setHeight(Math.round(bR*bQ.height));}},slideToBegin:function(){this.slideTo(this.getMinimum());},slideToEnd:function(){this.slideTo(this.getMaximum());},slideForward:function(){this.slideBy(this.getSingleStep());},slideBack:function(){this.slideBy(-this.getSingleStep());},slidePageForward:function(){this.slideBy(this.getPageStep());},slidePageBack:function(){this.slideBy(-this.getPageStep());},slideBy:function(bS){this.slideTo(this.getValue()+bS);},slideTo:function(bT){if(bT<this.getMinimum()){bT=this.getMinimum();}else if(bT>this.getMaximum()){bT=this.getMaximum();}else{bT=this.getMinimum()+Math.round((bT-this.getMinimum())/this.getSingleStep())*this.getSingleStep();}this.setValue(bT);},_applyOrientation:function(bU,bV){var bW=this.getChildControl(k);this.__nN=bU===j;if(this.__nN){this.removeState(i);bW.removeState(i);this.addState(j);bW.addState(j);bW.setLayoutProperties({top:0,right:null,bottom:0});}else{this.removeState(j);bW.removeState(j);this.addState(i);bW.addState(i);bW.setLayoutProperties({right:0,bottom:null,left:0});}this._updateKnobPosition();},_applyKnobFactor:function(bX,bY){if(bX!=null){this._updateKnobSize();}else{if(this.__nN){this.getChildControl(k).resetWidth();}else{this.getChildControl(k).resetHeight();}}},_applyValue:function(ca,cb){if(ca!=null){this._updateKnobPosition();if(this.__nD){this.__nL=[ca,cb];}else{this.fireEvent(V,qx.event.type.Data,[ca,cb]);}}else{this.resetValue();}},_fireValue:function(){if(!this.__nL){return;}var cc=this.__nL;this.__nL=null;this.fireEvent(V,qx.event.type.Data,cc);},_applyMinimum:function(cd,ce){if(this.getValue()<cd){this.setValue(cd);}this._updateKnobPosition();},_applyMaximum:function(cf,cg){if(this.getValue()>cf){this.setValue(cf);}this._updateKnobPosition();}}});})();(function(){var d="horizontal",c="mousewheel",b="qx.ui.core.scroll.ScrollSlider",a="keypress";qx.Class.define(b,{extend:qx.ui.form.Slider,construct:function(e){qx.ui.form.Slider.call(this,e);this.removeListener(a,this._onKeyPress);this.removeListener(c,this._onMouseWheel);},members:{getSizeHint:function(f){var g=qx.ui.form.Slider.prototype.getSizeHint.call(this);if(this.getOrientation()===d){g.width=0;}else{g.height=0;}return g;}}});})();(function(){var n="pressed",m="abandoned",l="Integer",k="hovered",j="qx.event.type.Event",i="Enter",h="Space",g="press",f="qx.ui.form.RepeatButton",d="release",a="interval",c="__nS",b="execute";qx.Class.define(f,{extend:qx.ui.form.Button,construct:function(o,p){qx.ui.form.Button.call(this,o,p);this.__nS=new qx.event.AcceleratingTimer();this.__nS.addListener(a,this._onInterval,this);},events:{"execute":j,"press":j,"release":j},properties:{interval:{check:l,init:100},firstInterval:{check:l,init:500},minTimer:{check:l,init:20},timerDecrease:{check:l,init:2}},members:{__nT:null,__nS:null,press:function(){if(this.isEnabled()){if(!this.hasState(n)){this.__nU();}this.removeState(m);this.addState(n);}},release:function(q){if(!this.isEnabled()){return;}if(this.hasState(n)){if(!this.__nT){this.execute();}}this.removeState(n);this.removeState(m);this.__nV();},_applyEnabled:function(r,s){qx.ui.form.Button.prototype._applyEnabled.call(this,r,s);if(!r){this.removeState(n);this.removeState(m);this.__nV();}},_onMouseOver:function(e){if(!this.isEnabled()||e.getTarget()!==this){return;}if(this.hasState(m)){this.removeState(m);this.addState(n);this.__nS.start();}this.addState(k);},_onMouseOut:function(e){if(!this.isEnabled()||e.getTarget()!==this){return;}this.removeState(k);if(this.hasState(n)){this.removeState(n);this.addState(m);this.__nS.stop();}},_onMouseDown:function(e){if(!e.isLeftPressed()){return;}this.capture();this.__nU();e.stopPropagation();},_onMouseUp:function(e){this.releaseCapture();if(!this.hasState(m)){this.addState(k);if(this.hasState(n)&&!this.__nT){this.execute();}}this.__nV();e.stopPropagation();},_onKeyUp:function(e){switch(e.getKeyIdentifier()){case i:case h:if(this.hasState(n)){if(!this.__nT){this.execute();}this.removeState(n);this.removeState(m);e.stopPropagation();this.__nV();}}},_onKeyDown:function(e){switch(e.getKeyIdentifier()){case i:case h:this.removeState(m);this.addState(n);e.stopPropagation();this.__nU();}},_onInterval:function(e){this.__nT=true;this.fireEvent(b);},__nU:function(){this.fireEvent(g);this.__nT=false;this.__nS.set({interval:this.getInterval(),firstInterval:this.getFirstInterval(),minimum:this.getMinTimer(),decrease:this.getTimerDecrease()}).start();this.removeState(m);this.addState(n);},__nV:function(){this.fireEvent(d);this.__nS.stop();this.removeState(m);this.removeState(n);}},destruct:function(){this._disposeObjects(c);}});})();(function(){var e="Integer",d="interval",c="qx.event.type.Event",b="qx.event.AcceleratingTimer",a="__qn";qx.Class.define(b,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__qn=new qx.event.Timer(this.getInterval());this.__qn.addListener(d,this._onInterval,this);},events:{"interval":c},properties:{interval:{check:e,init:100},firstInterval:{check:e,init:500},minimum:{check:e,init:20},decrease:{check:e,init:2}},members:{__qn:null,__qo:null,start:function(){this.__qn.setInterval(this.getFirstInterval());this.__qn.start();},stop:function(){this.__qn.stop();this.__qo=null;},_onInterval:function(){this.__qn.stop();if(this.__qo==null){this.__qo=this.getInterval();}this.__qo=Math.max(this.getMinimum(),this.__qo-this.getDecrease());this.__qn.setInterval(this.__qo);this.__qn.start();this.fireEvent(d);}},destruct:function(){this._disposeObjects(a);}});})();(function(){var n="_applyLayoutChange",m="left",k="center",j="top",h="Decorator",g="middle",f="_applyReversed",e="bottom",d="Boolean",c="right",a="Integer",b="qx.ui.layout.HBox";qx.Class.define(b,{extend:qx.ui.layout.Abstract,construct:function(o,p,q){qx.ui.layout.Abstract.call(this);if(o){this.setSpacing(o);}if(p){this.setAlignX(p);}if(q){this.setSeparator(q);}},properties:{alignX:{check:[m,k,c],init:m,apply:n},alignY:{check:[j,g,e],init:j,apply:n},spacing:{check:a,init:0,apply:n},separator:{check:h,nullable:true,apply:n},reversed:{check:d,init:false,apply:f}},members:{__cP:null,__cQ:null,__cR:null,__cS:null,_applyReversed:function(){this._invalidChildrenCache=true;this._applyLayoutChange();},__cT:function(){var w=this._getLayoutChildren();var length=w.length;var t=false;var r=this.__cP&&this.__cP.length!=length&&this.__cQ&&this.__cP;var u;var s=r?this.__cP:new Array(length);var v=r?this.__cQ:new Array(length);if(this.getReversed()){w=w.concat().reverse();}for(var i=0;i<length;i++){u=w[i].getLayoutProperties();if(u.width!=null){s[i]=parseFloat(u.width)/100;}if(u.flex!=null){v[i]=u.flex;t=true;}else{v[i]=0;}}if(!r){this.__cP=s;this.__cQ=v;}this.__cR=t;this.__cS=w;delete this._invalidChildrenCache;},verifyLayoutProperty:null,renderLayout:function(x,y){if(this._invalidChildrenCache){this.__cT();}var E=this.__cS;var length=E.length;var N=qx.ui.layout.Util;var M=this.getSpacing();var Q=this.getSeparator();if(Q){var B=N.computeHorizontalSeparatorGaps(E,M,Q);}else{var B=N.computeHorizontalGaps(E,M,true);}var i,z,K,J;var P=[];var F=B;for(i=0;i<length;i+=1){J=this.__cP[i];K=J!=null?Math.floor((x-B)*J):E[i].getSizeHint().width;P.push(K);F+=K;}if(this.__cR&&F!=x){var H={};var L,O;for(i=0;i<length;i+=1){L=this.__cQ[i];if(L>0){G=E[i].getSizeHint();H[i]={min:G.minWidth,value:P[i],max:G.maxWidth,flex:L};}}var C=N.computeFlexOffsets(H,x,F);for(i in C){O=C[i].offset;P[i]+=O;F+=O;}}var U=E[0].getMarginLeft();if(F<x&&this.getAlignX()!=m){U=x-F;if(this.getAlignX()===k){U=Math.round(U/2);}}var G,top,A,K,D,S,I;var M=this.getSpacing();this._clearSeparators();if(Q){var R=qx.theme.manager.Decoration.getInstance().resolve(Q).getInsets();var T=R.left+R.right;}for(i=0;i<length;i+=1){z=E[i];K=P[i];G=z.getSizeHint();S=z.getMarginTop();I=z.getMarginBottom();A=Math.max(G.minHeight,Math.min(y-S-I,G.maxHeight));top=N.computeVerticalAlignOffset(z.getAlignY()||this.getAlignY(),A,y,S,I);if(i>0){if(Q){U+=D+M;this._renderSeparator(Q,{left:U,top:0,width:T,height:y});U+=T+M+z.getMarginLeft();}else{U+=N.collapseMargins(M,D,z.getMarginLeft());}}z.renderLayout(U,top,K,A);U+=K;D=z.getMarginRight();}},_computeSizeHint:function(){if(this._invalidChildrenCache){this.__cT();}var bc=qx.ui.layout.Util;var bk=this.__cS;var V=0,bd=0,ba=0;var Y=0,bb=0;var bh,W,bj;for(var i=0,l=bk.length;i<l;i+=1){bh=bk[i];W=bh.getSizeHint();bd+=W.width;var bg=this.__cQ[i];var X=this.__cP[i];if(bg){V+=W.minWidth;}else if(X){ba=Math.max(ba,Math.round(W.minWidth/X));}else{V+=W.width;}bj=bh.getMarginTop()+bh.getMarginBottom();if((W.height+bj)>bb){bb=W.height+bj;}if((W.minHeight+bj)>Y){Y=W.minHeight+bj;}}V+=ba;var bf=this.getSpacing();var bi=this.getSeparator();if(bi){var be=bc.computeHorizontalSeparatorGaps(bk,bf,bi);}else{var be=bc.computeHorizontalGaps(bk,bf,true);}return {minWidth:V+be,width:bd+be,minHeight:Y,height:bb};}},destruct:function(){this.__cP=this.__cQ=this.__cS=null;}});})();(function(){var m="resize",l="scrollY",k="update",j="scrollX",i="_applyScrollX",h="_applyScrollY",g="qx.lang.Type.isNumber(value)&&value>=0&&value<=this.getScrollMaxX()",f="appear",d="qx.lang.Type.isNumber(value)&&value>=0&&value<=this.getScrollMaxY()",c="qx.event.type.Event",a="qx.ui.core.scroll.ScrollPane",b="scroll";qx.Class.define(a,{extend:qx.ui.core.Widget,construct:function(){qx.ui.core.Widget.call(this);this.set({minWidth:0,minHeight:0});this._setLayout(new qx.ui.layout.Grow());this.addListener(m,this._onUpdate);var n=this.getContentElement();n.addListener(b,this._onScroll,this);n.addListener(f,this._onAppear,this);},events:{update:c},properties:{scrollX:{check:g,apply:i,event:j,init:0},scrollY:{check:d,apply:h,event:l,init:0}},members:{add:function(o){var p=this._getChildren()[0];if(p){this._remove(p);p.removeListener(m,this._onUpdate,this);}if(o){this._add(o);o.addListener(m,this._onUpdate,this);}},remove:function(q){if(q){this._remove(q);q.removeListener(m,this._onUpdate,this);}},getChildren:function(){return this._getChildren();},_onUpdate:function(e){this.fireEvent(k);},_onScroll:function(e){var r=this.getContentElement();this.setScrollX(r.getScrollX());this.setScrollY(r.getScrollY());},_onAppear:function(e){var v=this.getContentElement();var s=this.getScrollX();var t=v.getScrollX();if(s!=t){v.scrollToX(s);}var w=this.getScrollY();var u=v.getScrollY();if(w!=u){v.scrollToY(w);}},getItemTop:function(z){var top=0;do{top+=z.getBounds().top;z=z.getLayoutParent();}while(z&&z!==this);return top;},getItemBottom:function(A){return this.getItemTop(A)+A.getBounds().height;},getItemLeft:function(B){var C=0;var parent;do{C+=B.getBounds().left;parent=B.getLayoutParent();if(parent){C+=parent.getInsets().left;}B=parent;}while(B&&B!==this);return C;},getItemRight:function(D){return this.getItemLeft(D)+D.getBounds().width;},getScrollSize:function(){return this.getChildren()[0].getBounds();},getScrollMaxX:function(){var F=this.getInnerSize();var E=this.getScrollSize();if(F&&E){return Math.max(0,E.width-F.width);}return 0;},getScrollMaxY:function(){var H=this.getInnerSize();var G=this.getScrollSize();if(H&&G){return Math.max(0,G.height-H.height);}return 0;},scrollToX:function(I){var J=this.getScrollMaxX();if(I<0){I=0;}else if(I>J){I=J;}this.setScrollX(I);},scrollToY:function(K){var L=this.getScrollMaxY();if(K<0){K=0;}else if(K>L){K=L;}this.setScrollY(K);},scrollByX:function(x){this.scrollToX(this.getScrollX()+x);},scrollByY:function(y){this.scrollToY(this.getScrollY()+y);},_applyScrollX:function(M){this.getContentElement().scrollToX(M);},_applyScrollY:function(N){this.getContentElement().scrollToY(N);}}});})();(function(){var a="qx.ui.layout.Grow";qx.Class.define(a,{extend:qx.ui.layout.Abstract,members:{verifyLayoutProperty:null,renderLayout:function(b,c){var g=this._getLayoutChildren();var f,h,e,d;for(var i=0,l=g.length;i<l;i++){f=g[i];h=f.getSizeHint();e=b;if(e<h.minWidth){e=h.minWidth;}else if(e>h.maxWidth){e=h.maxWidth;}d=c;if(d<h.minHeight){d=h.minHeight;}else if(d>h.maxHeight){d=h.maxHeight;}f.renderLayout(0,0,e,d);}},_computeSizeHint:function(){var q=this._getLayoutChildren();var o,s;var r=0,p=0;var n=0,k=0;var j=Infinity,m=Infinity;for(var i=0,l=q.length;i<l;i++){o=q[i];s=o.getSizeHint();r=Math.max(r,s.width);p=Math.max(p,s.height);n=Math.max(n,s.minWidth);k=Math.max(k,s.minHeight);j=Math.min(j,s.maxWidth);m=Math.min(m,s.maxHeight);}return {width:r,height:p,minWidth:n,minHeight:k,maxWidth:j,maxHeight:m};}}});})();(function(){var m="open",k="icon",j="auto",h="middle",g="String",f="label",d="changeOpen",c="excluded",b="visible",a="opened",H="always",G="qx.ui.tree.AbstractTreeItem",F="_applyIconOpened",E="Boolean",D="__px",C="Integer",B="_applyIndent",A="changeOpenSymbolMode",z="_applyOpenSymbolMode",y="__pu",t="__pt",u="resize",r="",s="removeItem",p="addItem",q="iconOpened",n="abstract",o="never",v="_applyIcon",w="_applyOpen",x="_applyLabel";qx.Class.define(G,{extend:qx.ui.core.Widget,type:n,include:[qx.ui.form.MModelProperty],implement:[qx.ui.form.IModel],construct:function(){qx.ui.core.Widget.call(this);this.__pt=[];this._setLayout(new qx.ui.layout.HBox());this._addWidgets();this.initOpen();},properties:{open:{check:E,init:false,event:d,apply:w},openSymbolMode:{check:[H,o,j],init:j,event:A,apply:z},indent:{check:C,init:19,apply:B,themeable:true},parent:{check:G,nullable:true},icon:{check:g,apply:v,nullable:true,themeable:true},iconOpened:{check:g,apply:F,nullable:true,themeable:true},label:{check:g,apply:x,init:r}},members:{__pt:null,__pu:null,__pv:null,__pw:null,__px:null,__py:null,_addWidgets:function(){throw new Error("Abstract method call.");},_createChildControlImpl:function(I,J){var K;switch(I){case f:K=new qx.ui.basic.Label().set({alignY:h,value:this.getLabel()});break;case k:K=new qx.ui.basic.Image().set({alignY:h,source:this.getIcon()});break;case m:K=new qx.ui.tree.FolderOpenButton().set({alignY:h});K.addListener(d,this._onChangeOpen,this);K.addListener(u,this._updateIndent,this);break;}return K||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,I);},getTree:function(){var M=this;while(M.getParent()){M=M.getParent();}var L=M.getLayoutParent()?M.getLayoutParent().getLayoutParent():0;if(L&&L instanceof qx.ui.core.scroll.ScrollPane){return L.getLayoutParent();}return null;},addWidget:function(N,O){this._add(N,O);},addSpacer:function(){if(!this.__px){this.__px=new qx.ui.core.Spacer();}else{this._remove(this.__px);}this._add(this.__px);},addOpenButton:function(){this._add(this.getChildControl(m));},_onChangeOpen:function(e){if(this.isOpenable()){this.setOpen(e.getData());}},addIcon:function(){var P=this.getChildControl(k);if(this.__pw){this._remove(P);}this._add(P);this.__pw=true;},addLabel:function(Q){var R=this.getChildControl(f);if(this.__pv){this._remove(R);}if(Q){this.setLabel(Q);}else{R.setValue(this.getLabel());}this._add(R);this.__pv=true;},addState:function(S){qx.ui.core.Widget.prototype.addState.call(this,S);var U=this._getChildren();for(var i=0,l=U.length;i<l;i++){var T=U[i];if(T.addState){U[i].addState(S);}}},removeState:function(V){qx.ui.core.Widget.prototype.removeState.call(this,V);var X=this._getChildren();for(var i=0,l=X.length;i<l;i++){var W=X[i];if(W.addState){X[i].removeState(V);}}},_applyIcon:function(Y,ba){if(!this.__pA()){this.__pB(Y);}else if(!this.isOpen()){this.__pB(Y);}},_applyIconOpened:function(bb,bc){if(this.isOpen()){if(this.__pz()&&this.__pA()){this.__pB(bb);}else if(!this.__pz()&&this.__pA()){this.__pB(bb);}}},_applyLabel:function(bd,be){var bf=this.getChildControl(f,true);if(bf){bf.setValue(bd);}},_applyOpen:function(bg,bh){if(this.hasChildren()){this.getChildrenContainer().setVisibility(bg?b:c);}var open=this.getChildControl(m,true);if(open){open.setOpen(bg);}var bi;if(bg){bi=this.__pA()?this.getIconOpened():null;}else{bi=this.getIcon();}if(bi){this.__pB(bi);}bg?this.addState(a):this.removeState(a);},__pz:function(){return qx.util.PropertyUtil.getUserValue(this,k);},__pA:function(){return qx.util.PropertyUtil.getUserValue(this,q);},__pB:function(bj){var bk=this.getChildControl(k,true);if(bk){bk.setSource(bj);}},isOpenable:function(){var bl=this.getOpenSymbolMode();return (bl===H||bl===j&&this.hasChildren());},_shouldShowOpenSymbol:function(){var open=this.getChildControl(m,true);if(!open){return false;}var bm=this.getTree();if(!bm.getRootOpenClose()){if(bm.getHideRoot()){if(bm.getRoot()==this.getParent()){return false;}}else{if(bm.getRoot()==this){return false;}}}return this.isOpenable();},_applyOpenSymbolMode:function(bn,bo){this._updateIndent();},_updateIndent:function(){if(!this.getTree()){return;}var bq=0;var open=this.getChildControl(m,true);if(open){if(this._shouldShowOpenSymbol()){open.show();var bp=open.getBounds();if(bp){bq=bp.width;}else{return;}}else{open.exclude();}}if(this.__px){this.__px.setWidth((this.getLevel()+1)*this.getIndent()-bq);}},_applyIndent:function(br,bs){this._updateIndent();},getLevel:function(){var bt=this.getTree();if(!bt){return;}var bu=this;var bv=-1;while(bu){bu=bu.getParent();bv+=1;}if(bt.getHideRoot()){bv-=1;}if(!bt.getRootOpenClose()){bv-=1;}return bv;},syncWidget:function(){this._updateIndent();},getChildrenContainer:function(){if(!this.__pu){this.__pu=new qx.ui.container.Composite(new qx.ui.layout.VBox()).set({visibility:this.isOpen()?b:c});}return this.__pu;},hasChildrenContainer:function(){return this.__pu;},getParentChildrenContainer:function(){if(this.getParent()){return this.getParent().getChildrenContainer();}else if(this.getLayoutParent()){return this.getLayoutParent();}else{return null;}},getChildren:function(){return this.__pt;},hasChildren:function(){return this.__pt?this.__pt.length>0:false;},getItems:function(bw,bx,by){if(by!==false){var bz=[];}else{var bz=[this];}var bC=this.hasChildren()&&(bx!==false||this.isOpen());if(bC){var bB=this.getChildren();if(bw===false){bz=bz.concat(bB);}else{for(var i=0,bA=bB.length;i<bA;i++){bz=bz.concat(bB[i].getItems(bw,bx,false));}}}return bz;},recursiveAddToWidgetQueue:function(){var bD=this.getItems(true,true,false);for(var i=0,l=bD.length;i<l;i++){qx.ui.core.queue.Widget.add(bD[i]);}},__pC:function(){if(this.getParentChildrenContainer()){this.getParentChildrenContainer()._addAfter(this.getChildrenContainer(),this);}},add:function(bE){var bF=this.getChildrenContainer();var bI=this.getTree();for(var i=0,l=arguments.length;i<l;i++){var bJ=arguments[i];var bH=bJ.getParent();if(bH){bH.remove(bJ);}bJ.setParent(this);var bG=this.hasChildren();bF.add(bJ);if(bJ.hasChildren()){bF.add(bJ.getChildrenContainer());}this.__pt.push(bJ);if(!bG){this.__pC();}if(bI){bJ.recursiveAddToWidgetQueue();bI.fireNonBubblingEvent(p,qx.event.type.Data,[bJ]);}}if(bI){qx.ui.core.queue.Widget.add(this);}},addAt:function(bK,bL){{};if(bL==this.__pt.length){this.add(bK);return;}var bP=bK.getParent();if(bP){bP.remove(bK);}var bN=this.getChildrenContainer();bK.setParent(this);var bO=this.hasChildren();var bM=this.__pt[bL];bN.addBefore(bK,bM);if(bK.hasChildren()){bN.addAfter(bK.getChildrenContainer(),bK);}qx.lang.Array.insertAt(this.__pt,bK,bL);if(!bO){this.__pC();}if(this.getTree()){bK.recursiveAddToWidgetQueue();qx.ui.core.queue.Widget.add(this);}},addBefore:function(bQ,bR){{};var bS=bQ.getParent();if(bS){bS.remove(bQ);}this.addAt(bQ,this.__pt.indexOf(bR));},addAfter:function(bT,bU){{};var bV=bT.getParent();if(bV){bV.remove(bT);}this.addAt(bT,this.__pt.indexOf(bU)+1);},addAtBegin:function(bW){this.addAt(bW,0);},remove:function(bX){for(var i=0,l=arguments.length;i<l;i++){var cc=arguments[i];if(this.__pt.indexOf(cc)==-1){this.warn("Cannot remove treeitem '"+cc+"'. It is not a child of this tree item.");return;}var bY=this.getChildrenContainer();if(cc.hasChildrenContainer()){var cb=cc.getChildrenContainer();if(bY.getChildren().indexOf(cb)>=0){bY.remove(cb);}}qx.lang.Array.remove(this.__pt,cc);cc.setParent(null);bY.remove(cc);}var ca=this.getTree();if(ca){ca.fireNonBubblingEvent(s,qx.event.type.Data,[cc]);}qx.ui.core.queue.Widget.add(this);},removeAt:function(cd){var ce=this.__pt[cd];if(ce){this.remove(ce);}},removeAll:function(){for(var i=this.__pt.length-1;i>=0;i--){this.remove(this.__pt[i]);}}},destruct:function(){this._disposeArray(t);this._disposeObjects(D,y);}});})();(function(){var i="opened",h="click",g="changeOpen",f="Boolean",d="qx.ui.tree.FolderOpenButton",c="_applyOpen",b="mouseup",a="mousedown";qx.Class.define(d,{extend:qx.ui.basic.Image,include:qx.ui.core.MExecutable,construct:function(){qx.ui.basic.Image.call(this);this.initOpen();this.addListener(h,this._onClick);this.addListener(a,this._stopPropagation,this);this.addListener(b,this._stopPropagation,this);},properties:{open:{check:f,init:false,event:g,apply:c}},members:{_applyOpen:function(j,k){j?this.addState(i):this.removeState(i);this.execute();},_stopPropagation:function(e){e.stopPropagation();},_onClick:function(e){this.toggleOpen();e.stopPropagation();}}});})();(function(){var a="qx.ui.core.Spacer";qx.Class.define(a,{extend:qx.ui.core.LayoutItem,construct:function(b,c){qx.ui.core.LayoutItem.call(this);this.setWidth(b!=null?b:0);this.setHeight(c!=null?c:0);},members:{checkAppearanceNeeds:function(){},addChildrenToQueue:function(d){},destroy:function(){if(this.$$disposed){return;}var parent=this.$$parent;if(parent){parent._remove(this);}qx.ui.core.queue.Dispose.add(this);}}});})();(function(){var d="$$theme_",c="$$user_",b="$$init_",a="qx.util.PropertyUtil";qx.Class.define(a,{statics:{getProperties:function(e){return e.$$properties;},getAllProperties:function(f){var i={};var j=f;while(j!=qx.core.Object){var h=this.getProperties(j);for(var g in h){i[g]=h[g];}j=j.superclass;}return i;},getUserValue:function(k,l){return k[c+l];},setUserValue:function(m,n,o){m[c+n]=o;},deleteUserValue:function(p,q){delete (p[c+q]);},getInitValue:function(r,s){return r[b+s];},setInitValue:function(t,u,v){t[b+u]=v;},deleteInitValue:function(w,x){delete (w[b+x]);},getThemeValue:function(y,z){return y[d+z];},setThemeValue:function(A,B,C){A[d+B]=C;},deleteThemeValue:function(D,E){delete (D[d+E]);},setThemed:function(F,G,H){var I=qx.core.Property.$$method.setThemed;F[I[G]](H);},resetThemed:function(J,K){var L=qx.core.Property.$$method.resetThemed;J[L[K]]();}}});})();(function(){var b="tree-folder",a="qx.ui.tree.TreeFolder";qx.Class.define(a,{extend:qx.ui.tree.AbstractTreeItem,construct:function(c){qx.ui.tree.AbstractTreeItem.call(this);if(c){this.setLabel(c);}},properties:{appearance:{refine:true,init:b}},members:{_addWidgets:function(){this.addSpacer();this.addOpenButton();this.addIcon();this.addLabel();}}});})();(function(){var o="",n="/",m="i",k="ICON_",j="separator-vertical",h="sinput",g=")",f="failed",d="CLASS",c="INTERFACE",H="__SV",G="listdata",F="1*",E="#",D="PACKAGE",C="0*",B="changeSelection",A="Search...",z="Results",y="__SW",v="(",w="completed",t="./script/apiindex.json",u="keyup",r="s",s=" Result",p="apiviewer.ui.SearchView",q="appear",x="disappear";qx.Class.define(p,{extend:qx.ui.container.Composite,construct:function(){qx.ui.container.Composite.call(this);var I=new qx.ui.layout.VBox();I.setSeparator(j);this.setLayout(I);this.__SU=false;this.listdata=[];this.apiindex={};this._showSearchForm();},members:{__SV:null,__SW:null,__SU:null,__SX:null,_showSearchForm:function(){var Q=new qx.ui.layout.HBox(4);var K=new qx.ui.container.Composite(Q);K.setPadding(10);this.sinput=new qx.ui.form.TextField().set({allowGrowY:true,placeholder:A});this.__SW=new qx.ui.form.Button("Find");this.__SW.setEnabled(false);K.add(this.sinput,{flex:1});K.add(this.__SW);this.add(K);var O=[];var N=this._tableModel=new qx.ui.table.model.Simple();N.setColumns([o,z]);N.setData(O);var J={tableColumnModel:function(R){return new qx.ui.table.columnmodel.Resize(R);}};var P=new qx.ui.table.Table(N,J);P.setDecorator(null);P.setShowCellFocusIndicator(false);P.setStatusBarVisible(false);P.setColumnVisibilityButtonVisible(false);this._selectionModel=P.getSelectionManager().getSelectionModel();this._selectionModel.addListener(B,this._callDetailFrame,this);this._table=P;var M=P.getTableColumnModel();var L=M.getBehavior();L.set(0,{width:C,minWidth:42,maxWidth:100});L.set(1,{width:F});var M=P.getTableColumnModel();M.setDataCellRenderer(0,new qx.ui.table.cellrenderer.Image());this.__SU=true;this.__SX=P;P.addListener(q,this.__Ta,this);P.addListener(x,function(e){this.__SV.hide();},this);this.add(P,{flex:1});qx.event.Timer.once(this._load,this,0);this.sinput.focus();this.sinput.addListener(u,function(e){this._searchResult(this.sinput.getValue()||o);},this);},_searchResult:function(S){var S=qx.lang.String.trim(S);if(S.length>0){this.__SV.hide();}else{this.__SV.show();}if(S.length<3){if(this.__SU){this.listdata.splice(0,this.listdata.length);}this._resetElements();return;}else{var U=[];try{var T=this._validateInput(S);new RegExp(T[0]);this.__SW.setEnabled(true);}catch(V){if(this.__SU){this.listdata.splice(0,this.listdata.length);}this._resetElements();return;}U=this._searchIndex(T[0],T[1]);this._tableModel.setColumns([o,(U.length+s+((U.length!=1)?r:o))]);this._tableModel.setData(U);this._table.resetSelection();}},_validateInput:function(W){var X=[];if(/^([\w\.]*\w+)(#\w+|\.\w+\(\)|#\.[\*|\+|\?]?)?$/.test(W)){if(RegExp.$2&&RegExp.$2.length>1){X=[RegExp.$2,RegExp.$1];}else if(RegExp.$1.length>1){X=[RegExp.$1,null];}else{return null;}}else{X=[W,null];}return X;},_searchIndex:function(Y,ba){var bf=[];var bd=new RegExp(Y,(/^.*[A-Z].*$/).test(Y)?o:m);var bb=this.apiindex.__index__;var be=this.apiindex.__fullNames__;var bi=this.apiindex.__types__;for(var bg in bb){if(bd.test(bg)){if(ba){for(var i=0,l=bb[bg].length;i<l;i++){var bh=be[bb[bg][i][1]];if(new RegExp(ba,m).test(bh)){var bc=bi[bb[bg][i][0]].toUpperCase();var bj=apiviewer.TreeUtil[k+bc];bf.push([bj,bh+bg]);}}}else{for(var i=0,l=bb[bg].length;i<l;i++){bc=bi[bb[bg][i][0]].toUpperCase();bh=be[bb[bg][i][1]];if(bc==d){bj=apiviewer.TreeUtil.getIconUrl(apiviewer.dao.Class.getClassByName(bh));}else{if(bc!=D&&bc!=c){bh+=bg;}bj=apiviewer.TreeUtil[k+bc];}bf.push([bj,bh]);}}}}return bf;},_setListdata:function(bk){bk.sort(function(a,b){if(a[1]<b[1]){return -1;}if(a[1]>b[1]){return 1;}return 0;});for(var i=0,l=bk.length;i<l;i++){var bl=bk[i][0];var bm={icon:bl,html:o,iconWidth:18,iconHeight:18};this.listdata.push({icon:bm,result:{text:bk[i][1]}});}},_sortByIcons:function(a,b){var bp={"package":0,"class":1,"interface":2,"mixin":3,"method_public":4,"method_protected":5,"method_private":6,"property":7,"property_protected":8,"property_private":9,"event":10,"constructor":11,"constant":12,"childControl":13};var bn=a.substr(a.lastIndexOf(n)+1);var bo=b.substr(b.lastIndexOf(n)+1);a=bp[bn.substr(0,bn.length-6)];b=bp[bo.substr(0,bo.length-6)];return a-b;},_load:function(){var bq=t;var br=new qx.io.remote.Request(bq);br.setAsynchronous(true);br.setTimeout(30000);br.setProhibitCaching(false);br.addListener(w,function(bs){this.apiindex=eval(v+bs.getContent()+g);},this);br.addListener(f,function(bt){this.warn("Couldn't load file: "+bq);},this);br.send();},_callDetailFrame:function(){var bv=this._selectionModel.getAnchorSelectionIndex();var by=this._tableModel.getData()[bv];var bA=qx.core.Init.getApplication().controller;var bu=apiviewer.UiModel.getInstance();if(by!=undefined){var bB=by[1];var bw=by[0];var bz=bB;var bC=null;var bx=bB.indexOf(E);if(bx!=-1){bz=bB.substring(0,bx);bC=bB.substring(bx+1);}if(/protected/.test(bw)){bu.setShowProtected(true);}else if(/private/.test(bw)){bu.setShowPrivate(true);}bA._updateHistory(bB);}},_resetElements:function(){this._tableModel.setData([]);this._tableModel.setColumns([o,o]);this.__SW.setEnabled(false);},__SY:function(bD){this.__SV=new qx.ui.popup.Popup(new qx.ui.layout.Canvas).set({autoHide:false,width:170});var bE=this.tr("Hint: You can use regular expressions in the search field.");var bF=new qx.ui.basic.Label(bE);bF.setRich(true);this.__SV.add(bF,{edge:3});this.__SV.setPosition("bottom-left");this.__SV.placeToWidget(this.sinput,false);this.__SV.show();},__Ta:function(e){if(this.__SV){if(qx.lang.String.trim(this.sinput.getValue()||o).length==0){this.__SV.show();}}else{this.__SY();}}},destruct:function(){this.apiindex=this._table=this.__SX=this._tableModel=this._selectionModel=null;this._disposeObjects(h,y,H);this._disposeArray(G);}});})();(function(){var k="showingPlaceholder",j="",i="none",h="qx.dynlocale",g="Boolean",f="qx.client",d="color",c="qx.event.type.Data",b="readonly",a="placeholder",Y="input",X="focusin",W="visibility",V="focusout",U="changeLocale",T="on",S="readOnly",R="text",Q="_applyTextAlign",P="px",r="RegExp",s=")",p="syncAppearance",q="change",n="textAlign",o="focused",l="center",m="visible",v="disabled",w="url(",D="off",B="String",H="resize",F="qx.ui.form.AbstractField",L="transparent",J="spellcheck",y="false",O="right",N="PositiveInteger",M="mshtml",x="abstract",z="block",A="webkit",C="_applyReadOnly",E="_applyPlaceholder",G="hidden",I="left",K="qx/static/blank.gif",t="changeReadOnly",u="absolute";qx.Class.define(F,{extend:qx.ui.core.Widget,implement:[qx.ui.form.IStringForm,qx.ui.form.IForm],include:[qx.ui.form.MForm],type:x,construct:function(ba){qx.ui.core.Widget.call(this);this.__H=!qx.bom.client.Feature.PLACEHOLDER;if(ba!=null){this.setValue(ba);}this.getContentElement().addListener(q,this._onChangeContent,this);if(this.__H){this.addListener(p,this._syncPlaceholder,this);}if(qx.core.Variant.isSet(h,T)){qx.locale.Manager.getInstance().addListener(U,this._onChangeLocale,this);}},events:{"input":c,"changeValue":c},properties:{textAlign:{check:[I,l,O],nullable:true,themeable:true,apply:Q},readOnly:{check:g,apply:C,event:t,init:false},selectable:{refine:true,init:true},focusable:{refine:true,init:true},maxLength:{check:N,init:Infinity},liveUpdate:{check:g,init:false},placeholder:{check:B,nullable:true,apply:E},filter:{check:r,nullable:true,init:null}},members:{__I:true,__J:null,__K:null,__L:null,__H:true,getFocusElement:function(){var bb=this.getContentElement();if(bb){return bb;}},_createInputElement:function(){return new qx.html.Input(R);},renderLayout:function(bc,top,bd,be){var bf=this._updateInsets;var bj=qx.ui.core.Widget.prototype.renderLayout.call(this,bc,top,bd,be);if(!bj){return;}var bh=bj.size||bf;var bk=P;if(bh||bj.local||bj.margin){var bg=this.getInsets();var innerWidth=bd-bg.left-bg.right;var innerHeight=be-bg.top-bg.bottom;innerWidth=innerWidth<0?0:innerWidth;innerHeight=innerHeight<0?0:innerHeight;}var bi=this.getContentElement();if(bf&&this.__H){this.__O().setStyles({"left":bg.left+bk,"top":bg.top+bk});}if(bh){if(this.__H){this.__O().setStyles({"width":innerWidth+bk,"height":innerHeight+bk});}bi.setStyles({"width":innerWidth+bk,"height":innerHeight+bk});this._renderContentElement(innerHeight,bi);}},_renderContentElement:function(innerHeight,bl){},_createContentElement:function(){var bm=this._createInputElement();bm.setStyles({"border":i,"padding":0,"margin":0,"display":z,"background":L,"outline":i,"appearance":i,"position":u,"autoComplete":D});bm.setSelectable(this.getSelectable());bm.setEnabled(this.getEnabled());bm.addListener(Y,this._onHtmlInput,this);bm.setAttribute(J,y);if(qx.core.Variant.isSet(f,A)){bm.setStyle(H,i);}if(qx.core.Variant.isSet(f,M)){bm.setStyles({backgroundImage:w+qx.util.ResourceManager.getInstance().toUri(K)+s});}return bm;},_applyEnabled:function(bn,bo){qx.ui.core.Widget.prototype._applyEnabled.call(this,bn,bo);this.getContentElement().setEnabled(bn);if(this.__H){if(bn){this._showPlaceholder();}else{this._removePlaceholder();}}else{var bp=this.getContentElement();bp.setAttribute(a,bn?this.getPlaceholder():j);}},__M:{width:16,height:16},_getContentHint:function(){return {width:this.__M.width*10,height:this.__M.height||16};},_applyFont:function(bq,br){var bs;if(bq){var bt=qx.theme.manager.Font.getInstance().resolve(bq);bs=bt.getStyles();}else{bs=qx.bom.Font.getDefaultStyles();}this.getContentElement().setStyles(bs);if(this.__H){this.__O().setStyles(bs);}if(bq){this.__M=qx.bom.Label.getTextSize("A",bs);}else{delete this.__M;}qx.ui.core.queue.Layout.add(this);},_applyTextColor:function(bu,bv){if(bu){this.getContentElement().setStyle(d,qx.theme.manager.Color.getInstance().resolve(bu));}else{this.getContentElement().removeStyle(d);}},tabFocus:function(){qx.ui.core.Widget.prototype.tabFocus.call(this);this.selectAllText();},_getTextSize:function(){return this.__M;},_onHtmlInput:function(e){var bz=e.getData();var by=true;this.__I=false;if(this.getFilter()!=null){var bA=j;var bw=bz.search(this.getFilter());var bx=bz;while(bw>=0){bA=bA+(bx.charAt(bw));bx=bx.substring(bw+1,bx.length);bw=bx.search(this.getFilter());}if(bA!=bz){by=false;bz=bA;this.getContentElement().setValue(bz);}}if(bz.length>this.getMaxLength()){var by=false;this.getContentElement().setValue(bz.substr(0,this.getMaxLength()));}if(by){this.fireDataEvent(Y,bz,this.__L);this.__L=bz;if(this.getLiveUpdate()){this.__N(bz);}}},__N:function(bB){var bC=this.__K;this.__K=bB;if(bC!=bB){this.fireNonBubblingEvent("changeValue",qx.event.type.Data,[bB,bC]);}},setValue:function(bD){if(bD===null){if(this.__I){return bD;}bD=j;this.__I=true;}else{this.__I=false;if(this.__H){this._removePlaceholder();}}if(qx.lang.Type.isString(bD)){var bF=this.getContentElement();if(bD.length>this.getMaxLength()){bD=bD.substr(0,this.getMaxLength());}if(bF.getValue()!=bD){var bG=bF.getValue();bF.setValue(bD);var bE=this.__I?null:bD;this.__K=bG;this.__N(bE);}if(this.__H){this._showPlaceholder();}return bD;}throw new Error("Invalid value type: "+bD);},getValue:function(){var bH=this.getContentElement().getValue();return this.__I?null:bH;},resetValue:function(){this.setValue(null);},_onChangeContent:function(e){this.__I=e.getData()===null;this.__N(e.getData());},getTextSelection:function(){return this.getContentElement().getTextSelection();},getTextSelectionLength:function(){return this.getContentElement().getTextSelectionLength();},getTextSelectionStart:function(){return this.getContentElement().getTextSelectionStart();},getTextSelectionEnd:function(){return this.getContentElement().getTextSelectionEnd();},setTextSelection:function(bI,bJ){this.getContentElement().setTextSelection(bI,bJ);},clearTextSelection:function(){this.getContentElement().clearTextSelection();},selectAllText:function(){this.setTextSelection(0);},_showPlaceholder:function(){var bL=this.getValue()||j;var bK=this.getPlaceholder();if(bK!=null&&bL==j&&!this.hasState(o)&&!this.hasState(v)){if(this.hasState(k)){this._syncPlaceholder();}else{this.addState(k);}}},_removePlaceholder:function(){if(this.hasState(k)){this.__O().setStyle(W,G);this.removeState(k);}},_syncPlaceholder:function(){if(this.hasState(k)){this.__O().setStyle(W,m);}},__O:function(){if(this.__J==null){this.__J=new qx.html.Label();var bM=qx.theme.manager.Color.getInstance();this.__J.setStyles({"visibility":"hidden","zIndex":6,"position":"absolute","color":bM.resolve("text-placeholder")});this.getContainerElement().add(this.__J);}return this.__J;},_onChangeLocale:qx.core.Variant.select(h,{"on":function(e){var content=this.getPlaceholder();if(content&&content.translate){this.setPlaceholder(content.translate());}},"off":null}),_applyPlaceholder:function(bN,bO){if(this.__H){this.__O().setValue(bN);if(bN!=null){this.addListener(X,this._removePlaceholder,this);this.addListener(V,this._showPlaceholder,this);this._showPlaceholder();}else{this.removeListener(X,this._removePlaceholder,this);this.removeListener(V,this._showPlaceholder,this);this._removePlaceholder();}}else{if(this.getEnabled()){this.getContentElement().setAttribute(a,bN);}}},_applyTextAlign:function(bP,bQ){this.getContentElement().setStyle(n,bP);},_applyReadOnly:function(bR,bS){var bT=this.getContentElement();bT.setAttribute(S,bR);if(bR){this.addState(b);this.setFocusable(false);}else{this.removeState(b);this.setFocusable(true);}}},destruct:function(){this.__J=null;if(qx.core.Variant.isSet(h,T)){qx.locale.Manager.getInstance().removeListener(U,this._onChangeLocale,this);}}});})();(function(){var b="qx.ui.form.TextField",a="textfield";qx.Class.define(b,{extend:qx.ui.form.AbstractField,properties:{appearance:{refine:true,init:a},allowGrowY:{refine:true,init:false},allowShrinkY:{refine:true,init:false}},members:{_renderContentElement:function(innerHeight,c){}}});})();(function(){var k="wrap",j="value",i="textarea",h="none",g="qx.client",f="",e="input",d="qx.html.Input",c="select",b="disabled",a="read-only";qx.Class.define(d,{extend:qx.html.Element,construct:function(l,m,n){if(l===c||l===i){var o=l;}else{o=e;}qx.html.Element.call(this,o,m,n);this.__c=l;},members:{__c:null,__d:null,__e:null,_createDomElement:function(){return qx.bom.Input.create(this.__c);},_applyProperty:function(name,p){qx.html.Element.prototype._applyProperty.call(this,name,p);var q=this.getDomElement();if(name===j){qx.bom.Input.setValue(q,p);}else if(name===k){qx.bom.Input.setWrap(q,p);}},setEnabled:qx.core.Variant.select(g,{"webkit":function(r){this.__e=r;if(!r){this.setStyles({"userModify":a,"userSelect":h});}else{this.setStyles({"userModify":null,"userSelect":this.__d?null:h});}},"default":function(s){this.setAttribute(b,s===false);}}),setSelectable:qx.core.Variant.select(g,{"webkit":function(t){this.__d=t;qx.html.Element.prototype.setSelectable.call(this,this.__e&&t);},"default":function(u){qx.html.Element.prototype.setSelectable.call(this,u);}}),setValue:function(v){var w=this.getDomElement();if(w){if(w.value!=v){qx.bom.Input.setValue(w,v);}}else{this._setProperty(j,v);}return this;},getValue:function(){var x=this.getDomElement();if(x){return qx.bom.Input.getValue(x);}return this._getProperty(j)||f;},setWrap:function(y){if(this.__c===i){this._setProperty(k,y);}else{throw new Error("Text wrapping is only support by textareas!");}return this;},getWrap:function(){if(this.__c===i){return this._getProperty(k);}else{throw new Error("Text wrapping is only support by textareas!");}}}});})();(function(){var w="change",v="input",u="qx.client",t="text",s="password",r="checkbox",q="radio",p="textarea",n="keypress",m="opera",d="propertychange",k="blur",h="keydown",c="keyup",b="select-multiple",g="checked",f="value",j="select",a="qx.event.handler.Input";qx.Class.define(a,{extend:qx.core.Object,implement:qx.event.IEventHandler,construct:function(){qx.core.Object.call(this);this._onChangeCheckedWrapper=qx.lang.Function.listener(this._onChangeChecked,this);this._onChangeValueWrapper=qx.lang.Function.listener(this._onChangeValue,this);this._onInputWrapper=qx.lang.Function.listener(this._onInput,this);this._onPropertyWrapper=qx.lang.Function.listener(this._onProperty,this);if(qx.core.Variant.isSet(u,m)){this._onKeyDownWrapper=qx.lang.Function.listener(this._onKeyDown,this);this._onKeyUpWrapper=qx.lang.Function.listener(this._onKeyUp,this);this._onBlurWrapper=qx.lang.Function.listener(this._onBlur,this);}},statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{input:1,change:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:false},members:{__g:false,__h:null,__i:null,canHandleEvent:function(x,y){var z=x.tagName.toLowerCase();if(y===v&&(z===v||z===p)){return true;}if(y===w&&(z===v||z===p||z===j)){return true;}return false;},registerEvent:qx.core.Variant.select(u,{"mshtml":function(A,B,C){if(!A.__j){var D=A.tagName.toLowerCase();var E=A.type;if(E===t||E===s||D===p||E===r||E===q){qx.bom.Event.addNativeListener(A,d,this._onPropertyWrapper);}if(E!==r&&E!==q){qx.bom.Event.addNativeListener(A,w,this._onChangeValueWrapper);}if(E===t||E===s){this._onKeyPressWrapped=qx.lang.Function.listener(this._onKeyPress,this,A);qx.bom.Event.addNativeListener(A,n,this._onKeyPressWrapped);}A.__j=true;}},"default":function(F,G,H){if(G===v){this.__k(F);}else if(G===w){if(F.type===q||F.type===r){qx.bom.Event.addNativeListener(F,w,this._onChangeCheckedWrapper);}else{qx.bom.Event.addNativeListener(F,w,this._onChangeValueWrapper);}if(qx.core.Variant.isSet(u,m)){if(F.type===t||F.type===s){this._onKeyPressWrapped=qx.lang.Function.listener(this._onKeyPress,this,F);qx.bom.Event.addNativeListener(F,n,this._onKeyPressWrapped);}}}}}),__k:qx.core.Variant.select(u,{"mshtml":null,"webkit":function(I){var J=I.tagName.toLowerCase();if(qx.bom.client.Engine.VERSION<532&&J==p){qx.bom.Event.addNativeListener(I,n,this._onInputWrapper);}qx.bom.Event.addNativeListener(I,v,this._onInputWrapper);},"opera":function(K){qx.bom.Event.addNativeListener(K,c,this._onKeyUpWrapper);qx.bom.Event.addNativeListener(K,h,this._onKeyDownWrapper);qx.bom.Event.addNativeListener(K,k,this._onBlurWrapper);qx.bom.Event.addNativeListener(K,v,this._onInputWrapper);},"default":function(L){qx.bom.Event.addNativeListener(L,v,this._onInputWrapper);}}),unregisterEvent:qx.core.Variant.select(u,{"mshtml":function(M,N){if(M.__j){var O=M.tagName.toLowerCase();var P=M.type;if(P===t||P===s||O===p||P===r||P===q){qx.bom.Event.removeNativeListener(M,d,this._onPropertyWrapper);}if(P!==r&&P!==q){qx.bom.Event.removeNativeListener(M,w,this._onChangeValueWrapper);}if(P===t||P===s){qx.bom.Event.removeNativeListener(M,n,this._onKeyPressWrapped);}try{delete M.__j;}catch(Q){M.__j=null;}}},"default":function(R,S){if(S===v){this.__k(R);}else if(S===w){if(R.type===q||R.type===r){qx.bom.Event.removeNativeListener(R,w,this._onChangeCheckedWrapper);}else{qx.bom.Event.removeNativeListener(R,w,this._onChangeValueWrapper);}}if(qx.core.Variant.isSet(u,m)){if(R.type===t||R.type===s){qx.bom.Event.removeNativeListener(R,n,this._onKeyPressWrapped);}}}}),__l:qx.core.Variant.select(u,{"mshtml":null,"webkit":function(T){var U=T.tagName.toLowerCase();if(qx.bom.client.Engine.VERSION<532&&U==p){qx.bom.Event.removeNativeListener(T,n,this._onInputWrapper);}qx.bom.Event.removeNativeListener(T,v,this._onInputWrapper);},"opera":function(V){qx.bom.Event.removeNativeListener(V,c,this._onKeyUpWrapper);qx.bom.Event.removeNativeListener(V,h,this._onKeyDownWrapper);qx.bom.Event.removeNativeListener(V,k,this._onBlurWrapper);qx.bom.Event.removeNativeListener(V,v,this._onInputWrapper);},"default":function(W){qx.bom.Event.removeNativeListener(W,v,this._onInputWrapper);}}),_onKeyPress:qx.core.Variant.select(u,{"mshtml|opera":function(e,X){if(e.keyCode===13){if(X.value!==this.__i){this.__i=X.value;qx.event.Registration.fireEvent(X,w,qx.event.type.Data,[X.value]);}}},"default":null}),_onKeyDown:qx.core.Variant.select(u,{"opera":function(e){if(e.keyCode===13){this.__g=true;}},"default":null}),_onKeyUp:qx.core.Variant.select(u,{"opera":function(e){if(e.keyCode===13){this.__g=false;}},"default":null}),_onBlur:qx.core.Variant.select(u,{"opera":function(e){if(this.__h){window.clearTimeout(this.__h);}},"default":null}),_onInput:qx.event.GlobalError.observeMethod(function(e){var Y=qx.bom.Event.getTarget(e);if(!this.__g){if(qx.core.Variant.isSet(u,m)){this.__h=window.setTimeout(function(){qx.event.Registration.fireEvent(Y,v,qx.event.type.Data,[Y.value]);},0);}else{qx.event.Registration.fireEvent(Y,v,qx.event.type.Data,[Y.value]);}}}),_onChangeValue:qx.event.GlobalError.observeMethod(function(e){var bb=qx.bom.Event.getTarget(e);var ba=bb.value;if(bb.type===b){var ba=[];for(var i=0,o=bb.options,l=o.length;i<l;i++){if(o[i].selected){ba.push(o[i].value);}}}qx.event.Registration.fireEvent(bb,w,qx.event.type.Data,[ba]);}),_onChangeChecked:qx.event.GlobalError.observeMethod(function(e){var bc=qx.bom.Event.getTarget(e);if(bc.type===q){if(bc.checked){qx.event.Registration.fireEvent(bc,w,qx.event.type.Data,[bc.value]);}}else{qx.event.Registration.fireEvent(bc,w,qx.event.type.Data,[bc.checked]);}}),_onProperty:qx.core.Variant.select(u,{"mshtml":qx.event.GlobalError.observeMethod(function(e){var bd=qx.bom.Event.getTarget(e);var be=e.propertyName;if(be===f&&(bd.type===t||bd.type===s||bd.tagName.toLowerCase()===p)){if(!bd.$$inValueSet){qx.event.Registration.fireEvent(bd,v,qx.event.type.Data,[bd.value]);}}else if(be===g){if(bd.type===r){qx.event.Registration.fireEvent(bd,w,qx.event.type.Data,[bd.checked]);}else if(bd.checked){qx.event.Registration.fireEvent(bd,w,qx.event.type.Data,[bd.value]);}}}),"default":function(){}})},defer:function(bf){qx.event.Registration.addHandler(bf);}});})();(function(){var v="",u="select",t="soft",s="off",r="qx.client",q="textarea",p="wrap",o="text",n="mshtml",m="number",d="checkbox",k="select-one",g="input",c="option",b="value",f="radio",e="qx.bom.Input",h="nowrap",a="auto",j="normal";qx.Class.define(e,{statics:{__f:{text:1,textarea:1,select:1,checkbox:1,radio:1,password:1,hidden:1,submit:1,image:1,file:1,search:1,reset:1,button:1},create:function(w,x,y){{};var x=x?qx.lang.Object.clone(x):{};var z;if(w===q||w===u){z=w;}else{z=g;x.type=w;}return qx.bom.Element.create(z,x,y);},setValue:function(A,B){var G=A.nodeName.toLowerCase();var D=A.type;var Array=qx.lang.Array;var H=qx.lang.Type;if(typeof B===m){B+=v;}if((D===d||D===f)){if(H.isArray(B)){A.checked=Array.contains(B,A.value);}else{A.checked=A.value==B;}}else if(G===u){var C=H.isArray(B);var I=A.options;var E,F;for(var i=0,l=I.length;i<l;i++){E=I[i];F=E.getAttribute(b);if(F==null){F=E.text;}E.selected=C?Array.contains(B,F):B==F;}if(C&&B.length==0){A.selectedIndex=-1;}}else if((D===o||D===q)&&qx.core.Variant.isSet(r,n)){A.$$inValueSet=true;A.value=B;A.$$inValueSet=null;}else{A.value=B;}},getValue:function(J){var P=J.nodeName.toLowerCase();if(P===c){return (J.attributes.value||{}).specified?J.value:J.text;}if(P===u){var K=J.selectedIndex;if(K<0){return null;}var Q=[];var S=J.options;var R=J.type==k;var O=qx.bom.Input;var N;for(var i=R?K:0,M=R?K+1:S.length;i<M;i++){var L=S[i];if(L.selected){N=O.getValue(L);if(R){return N;}Q.push(N);}}return Q;}else{return (J.value||v).replace(/\r/g,v);}},setWrap:qx.core.Variant.select(r,{"mshtml":function(T,U){T.wrap=U?t:s;},"gecko|webkit":function(V,W){var Y=W?t:s;var X=W?v:a;V.setAttribute(p,Y);V.style.overflow=X;},"default":function(ba,bb){ba.style.whiteSpace=bb?j:h;}})}});})();(function(){var c="qx.event.type.Data",b="qx.event.type.Event",a="qx.ui.table.ITableModel";qx.Interface.define(a,{events:{"dataChanged":c,"metaDataChanged":b,"sorted":c},members:{getRowCount:function(){},getRowData:function(d){},getColumnCount:function(){},getColumnId:function(e){},getColumnIndexById:function(f){},getColumnName:function(g){},isColumnEditable:function(h){},isColumnSortable:function(i){},sortByColumn:function(j,k){},getSortColumnIndex:function(){},isSortAscending:function(){},prefetchRows:function(l,m){},getValue:function(n,o){},getValueById:function(p,q){},setValue:function(r,s,t){},setValueById:function(u,v,w){}}});})();(function(){var e="metaDataChanged",d="qx.event.type.Data",c="qx.event.type.Event",b="abstract",a="qx.ui.table.model.Abstract";qx.Class.define(a,{type:b,extend:qx.core.Object,implement:qx.ui.table.ITableModel,events:{"dataChanged":d,"metaDataChanged":c,"sorted":d},construct:function(){qx.core.Object.call(this);this.__vM=[];this.__vN=[];this.__vO={};},members:{__vM:null,__vN:null,__vO:null,__vP:null,init:function(f){},getRowCount:function(){throw new Error("getRowCount is abstract");},getRowData:function(g){return null;},isColumnEditable:function(h){return false;},isColumnSortable:function(j){return false;},sortByColumn:function(k,l){},getSortColumnIndex:function(){return -1;},isSortAscending:function(){return true;},prefetchRows:function(m,n){},getValue:function(o,p){throw new Error("getValue is abstract");},getValueById:function(q,r){return this.getValue(this.getColumnIndexById(q),r);},setValue:function(s,t,u){throw new Error("setValue is abstract");},setValueById:function(v,w,x){this.setValue(this.getColumnIndexById(v),w,x);},getColumnCount:function(){return this.__vM.length;},getColumnIndexById:function(y){return this.__vO[y];},getColumnId:function(z){return this.__vM[z];},getColumnName:function(A){return this.__vN[A];},setColumnIds:function(B){this.__vM=B;this.__vO={};for(var i=0;i<B.length;i++){this.__vO[B[i]]=i;}this.__vN=new Array(B.length);if(!this.__vP){this.fireEvent(e);}},setColumnNamesByIndex:function(C){if(this.__vM.length!=C.length){throw new Error("this.__columnIdArr and columnNameArr have different length: "+this.__vM.length+" != "+C.length);}this.__vN=C;this.fireEvent(e);},setColumnNamesById:function(D){this.__vN=new Array(this.__vM.length);for(var i=0;i<this.__vM.length;++i){this.__vN[i]=D[this.__vM[i]];}},setColumns:function(E,F){var G=this.__vM.length==0||F;if(F==null){if(this.__vM.length==0){F=E;}else{F=this.__vM;}}if(F.length!=E.length){throw new Error("columnIdArr and columnNameArr have different length: "+F.length+" != "+E.length);}if(G){this.__vP=true;this.setColumnIds(F);this.__vP=false;}this.setColumnNamesByIndex(E);}},destruct:function(){this.__vM=this.__vN=this.__vO=null;}});})();(function(){var e="dataChanged",d="metaDataChanged",c="qx.ui.table.model.Simple",b="Boolean",a="sorted";qx.Class.define(c,{extend:qx.ui.table.model.Abstract,construct:function(){qx.ui.table.model.Abstract.call(this);this.__xM=[];this.__xN=-1;this.__xO=[];this.__xP=null;},properties:{caseSensitiveSorting:{check:b,init:true}},statics:{_defaultSortComparatorAscending:function(f,g){var h=f[arguments.callee.columnIndex];var k=g[arguments.callee.columnIndex];if(qx.lang.Type.isNumber(h)&&qx.lang.Type.isNumber(k)){var l=isNaN(h)?isNaN(k)?0:1:isNaN(k)?-1:null;if(l!=null){return l;}}return (h>k)?1:((h==k)?0:-1);},_defaultSortComparatorInsensitiveAscending:function(m,n){var o=(m[arguments.callee.columnIndex].toLowerCase?m[arguments.callee.columnIndex].toLowerCase():m[arguments.callee.columnIndex]);var p=(n[arguments.callee.columnIndex].toLowerCase?n[arguments.callee.columnIndex].toLowerCase():n[arguments.callee.columnIndex]);if(qx.lang.Type.isNumber(o)&&qx.lang.Type.isNumber(p)){var q=isNaN(o)?isNaN(p)?0:1:isNaN(p)?-1:null;if(q!=null){return q;}}return (o>p)?1:((o==p)?0:-1);},_defaultSortComparatorDescending:function(r,s){var t=r[arguments.callee.columnIndex];var u=s[arguments.callee.columnIndex];if(qx.lang.Type.isNumber(t)&&qx.lang.Type.isNumber(u)){var v=isNaN(t)?isNaN(u)?0:1:isNaN(u)?-1:null;if(v!=null){return v;}}return (t<u)?1:((t==u)?0:-1);},_defaultSortComparatorInsensitiveDescending:function(w,x){var y=(w[arguments.callee.columnIndex].toLowerCase?w[arguments.callee.columnIndex].toLowerCase():w[arguments.callee.columnIndex]);var z=(x[arguments.callee.columnIndex].toLowerCase?x[arguments.callee.columnIndex].toLowerCase():x[arguments.callee.columnIndex]);if(qx.lang.Type.isNumber(y)&&qx.lang.Type.isNumber(z)){var A=isNaN(y)?isNaN(z)?0:1:isNaN(z)?-1:null;if(A!=null){return A;}}return (y<z)?1:((y==z)?0:-1);}},members:{__xM:null,__xP:null,__xQ:null,__xO:null,__xN:null,__xR:null,getRowData:function(B){var C=this.__xM[B];if(C==null||C.originalData==null){return C;}else{return C.originalData;}},getRowDataAsMap:function(D){var F=this.__xM[D];if(F!=null){var E={};for(var G=0;G<this.getColumnCount();G++){E[this.getColumnId(G)]=F[G];}if(F.originalData!=null){for(var H in F.originalData){if(E[H]==undefined){E[H]=F.originalData[H];}}}return E;}return (F&&F.originalData)?F.originalData:null;},getDataAsMapArray:function(){var J=this.getRowCount();var I=[];for(var i=0;i<J;i++){I.push(this.getRowDataAsMap(i));}return I;},setEditable:function(K){this.__xP=[];for(var L=0;L<this.getColumnCount();L++){this.__xP[L]=K;}this.fireEvent(d);},setColumnEditable:function(M,N){if(N!=this.isColumnEditable(M)){if(this.__xP==null){this.__xP=[];}this.__xP[M]=N;this.fireEvent(d);}},isColumnEditable:function(O){return this.__xP?(this.__xP[O]==true):false;},setColumnSortable:function(P,Q){if(Q!=this.isColumnSortable(P)){if(this.__xQ==null){this.__xQ=[];}this.__xQ[P]=Q;this.fireEvent(d);}},isColumnSortable:function(R){return (this.__xQ?(this.__xQ[R]!==false):true);},sortByColumn:function(S,T){var W;var V=this.__xO[S];if(V){W=(T?V.ascending:V.descending);}else{if(this.getCaseSensitiveSorting()){W=(T?qx.ui.table.model.Simple._defaultSortComparatorAscending:qx.ui.table.model.Simple._defaultSortComparatorDescending);}else{W=(T?qx.ui.table.model.Simple._defaultSortComparatorInsensitiveAscending:qx.ui.table.model.Simple._defaultSortComparatorInsensitiveDescending);}}W.columnIndex=S;this.__xM.sort(W);this.__xN=S;this.__xR=T;var U={columnIndex:S,ascending:T};this.fireDataEvent(a,U);this.fireEvent(d);},setSortMethods:function(X,Y){var ba;if(qx.lang.Type.isFunction(Y)){ba={ascending:Y,descending:function(bb,bc){return Y(bc,bb);}};}else{ba=Y;}this.__xO[X]=ba;},getSortMethods:function(bd){return this.__xO[bd];},clearSorting:function(){if(this.__xN!=-1){this.__xN=-1;this.__xR=true;this.fireEvent(d);}},getSortColumnIndex:function(){return this.__xN;},_setSortColumnIndex:function(be){this.__xN=be;},isSortAscending:function(){return this.__xR;},_setSortAscending:function(bf){this.__xR=bf;},getRowCount:function(){return this.__xM.length;},getValue:function(bg,bh){if(bh<0||bh>=this.__xM.length){throw new Error("this.__rowArr out of bounds: "+bh+" (0.."+this.__xM.length+")");}return this.__xM[bh][bg];},setValue:function(bi,bj,bk){if(this.__xM[bj][bi]!=bk){this.__xM[bj][bi]=bk;if(this.hasListener(e)){var bl={firstRow:bj,lastRow:bj,firstColumn:bi,lastColumn:bi};this.fireDataEvent(e,bl);}if(bi==this.__xN){this.clearSorting();}}},setData:function(bm,bn){this.__xM=bm;if(this.hasListener(e)){var bo={firstRow:0,lastRow:bm.length-1,firstColumn:0,lastColumn:this.getColumnCount()-1};this.fireDataEvent(e,bo);}if(bn!==false){this.clearSorting();}},getData:function(){return this.__xM;},setDataAsMapArray:function(bp,bq,br){this.setData(this._mapArray2RowArr(bp,bq),br);},addRows:function(bs,bt,bu){if(bt==null){bt=this.__xM.length;}bs.splice(0,0,bt,0);Array.prototype.splice.apply(this.__xM,bs);var bv={firstRow:bt,lastRow:this.__xM.length-1,firstColumn:0,lastColumn:this.getColumnCount()-1};this.fireDataEvent(e,bv);if(bu!==false){this.clearSorting();}},addRowsAsMapArray:function(bw,bx,by,bz){this.addRows(this._mapArray2RowArr(bw,by),bx,bz);},setRows:function(bA,bB,bC){if(bB==null){bB=0;}bA.splice(0,0,bB,bA.length);Array.prototype.splice.apply(this.__xM,bA);var bD={firstRow:bB,lastRow:this.__xM.length-1,firstColumn:0,lastColumn:this.getColumnCount()-1};this.fireDataEvent(e,bD);if(bC!==false){this.clearSorting();}},setRowsAsMapArray:function(bE,bF,bG,bH){this.setRows(this._mapArray2RowArr(bE,bG),bF,bH);},removeRows:function(bI,bJ,bK){this.__xM.splice(bI,bJ);var bL={firstRow:bI,lastRow:this.__xM.length-1,firstColumn:0,lastColumn:this.getColumnCount()-1,removeStart:bI,removeCount:bJ};this.fireDataEvent(e,bL);if(bK!==false){this.clearSorting();}},_mapArray2RowArr:function(bM,bN){var bR=bM.length;var bO=this.getColumnCount();var bQ=new Array(bR);var bP;for(var i=0;i<bR;++i){bP=[];if(bN){bP.originalData=bM[i];}for(var j=0;j<bO;++j){bP[j]=bM[i][this.getColumnId(j)];}bQ[i]=bP;}return bQ;}},destruct:function(){this.__xM=this.__xP=this.__xO=this.__xQ=null;}});})();(function(){var a="qx.ui.table.ICellEditorFactory";qx.Interface.define(a,{members:{createCellEditor:function(b){return true;},getCellEditorValue:function(c){return true;}}});})();(function(){var f="",e="Function",d="abstract",c="number",b="appear",a="qx.ui.table.celleditor.AbstractField";qx.Class.define(a,{extend:qx.core.Object,implement:qx.ui.table.ICellEditorFactory,type:d,properties:{validationFunction:{check:e,nullable:true,init:null}},members:{_createEditor:function(){throw new Error("Abstract method call!");},createCellEditor:function(g){var h=this._createEditor();h.originalValue=g.value;if(g.value===null||g.value===undefined){g.value=f;}h.setValue(f+g.value);h.addListener(b,function(){h.selectAllText();});return h;},getCellEditorValue:function(i){var k=i.getValue();var j=this.getValidationFunction();if(j){k=j(k,i.originalValue);}if(typeof i.originalValue==c){k=parseFloat(k);}return k;}}});})();(function(){var c="number",b="qx.ui.table.celleditor.TextField",a="table-editor-textfield";qx.Class.define(b,{extend:qx.ui.table.celleditor.AbstractField,members:{getCellEditorValue:function(d){var f=d.getValue();var e=this.getValidationFunction();if(e){f=e(f,d.originalValue);}if(typeof d.originalValue==c){if(f!=null){f=parseFloat(f);}}return f;},_createEditor:function(){var g=new qx.ui.form.TextField();g.setAppearance(a);return g;}}});})();(function(){var a="qx.ui.table.IHeaderRenderer";qx.Interface.define(a,{members:{createHeaderCell:function(b){return true;},updateHeaderCell:function(c,d){return true;}}});})();(function(){var b="qx.ui.table.headerrenderer.Default",a="String";qx.Class.define(b,{extend:qx.core.Object,implement:qx.ui.table.IHeaderRenderer,statics:{STATE_SORTED:"sorted",STATE_SORTED_ASCENDING:"sortedAscending"},properties:{toolTip:{check:a,init:null,nullable:true}},members:{createHeaderCell:function(c){var d=new qx.ui.table.headerrenderer.HeaderCell();this.updateHeaderCell(c,d);return d;},updateHeaderCell:function(e,f){var g=qx.ui.table.headerrenderer.Default;if(e.name&&e.name.translate){f.setLabel(e.name.translate());}else{f.setLabel(e.name);}var h=f.getToolTip();if(this.getToolTip()!=null){if(h==null){h=new qx.ui.tooltip.ToolTip(this.getToolTip());f.setToolTip(h);qx.util.DisposeUtil.disposeTriggeredBy(h,f);}else{h.setLabel(this.getToolTip());}}e.sorted?f.addState(g.STATE_SORTED):f.removeState(g.STATE_SORTED);e.sortedAscending?f.addState(g.STATE_SORTED_ASCENDING):f.removeState(g.STATE_SORTED_ASCENDING);}}});})();(function(){var l="qx.client",k="head",j="text/css",h="stylesheet",g="}",f='@import "',e="{",d='";',c="qx.bom.Stylesheet",b="link",a="style";qx.Class.define(c,{statics:{includeFile:function(m,n){if(!n){n=document;}var o=n.createElement(b);o.type=j;o.rel=h;o.href=qx.util.ResourceManager.getInstance().toUri(m);var p=n.getElementsByTagName(k)[0];p.appendChild(o);},createElement:qx.core.Variant.select(l,{"mshtml":function(q){var r=document.createStyleSheet();if(q){r.cssText=q;}return r;},"default":function(s){var t=document.createElement(a);t.type=j;if(s){t.appendChild(document.createTextNode(s));}document.getElementsByTagName(k)[0].appendChild(t);return t.sheet;}}),addRule:qx.core.Variant.select(l,{"mshtml":function(u,v,w){u.addRule(v,w);},"default":function(x,y,z){x.insertRule(y+e+z+g,x.cssRules.length);}}),removeRule:qx.core.Variant.select(l,{"mshtml":function(A,B){var C=A.rules;var D=C.length;for(var i=D-1;i>=0;--i){if(C[i].selectorText==B){A.removeRule(i);}}},"default":function(E,F){var G=E.cssRules;var H=G.length;for(var i=H-1;i>=0;--i){if(G[i].selectorText==F){E.deleteRule(i);}}}}),removeAllRules:qx.core.Variant.select(l,{"mshtml":function(I){var J=I.rules;var K=J.length;for(var i=K-1;i>=0;i--){I.removeRule(i);}},"default":function(L){var M=L.cssRules;var N=M.length;for(var i=N-1;i>=0;i--){L.deleteRule(i);}}}),addImport:qx.core.Variant.select(l,{"mshtml":function(O,P){O.addImport(P);},"default":function(Q,R){Q.insertRule(f+R+d,Q.cssRules.length);}}),removeImport:qx.core.Variant.select(l,{"mshtml":function(S,T){var U=S.imports;var V=U.length;for(var i=V-1;i>=0;i--){if(U[i].href==T){S.removeImport(i);}}},"default":function(W,X){var Y=W.cssRules;var ba=Y.length;for(var i=ba-1;i>=0;i--){if(Y[i].href==X){W.deleteRule(i);}}}}),removeAllImports:qx.core.Variant.select(l,{"mshtml":function(bb){var bc=bb.imports;var bd=bc.length;for(var i=bd-1;i>=0;i--){bb.removeImport(i);}},"default":function(be){var bf=be.cssRules;var bg=bf.length;for(var i=bg-1;i>=0;i--){if(bf[i].type==bf[i].IMPORT_RULE){be.deleteRule(i);}}}})}});})();(function(){var a="qx.ui.table.ICellRenderer";qx.Interface.define(a,{members:{createDataCellHtml:function(b,c){return true;}}});})();(function(){var j="",i="px;",h=".qooxdoo-table-cell {",g="qooxdoo-table-cell",f='" ',e="nowrap",d="default",c="qx.client",b="}",a="width:",H=".qooxdoo-table-cell-right { text-align:right } ",G="0px 6px",F='<div class="',E="0px",D="height:",C="1px solid ",B=".qooxdoo-table-cell-bold { font-weight:bold } ",A="table-row-line",z="String",y='>',q="mshtml",r='</div>',o="ellipsis",p="content-box",m='left:',n="qx.ui.table.cellrenderer.Abstract",k='" style="',l="abstract",s="none",t="hidden",v="} ",u='px;',x=".qooxdoo-table-cell-italic { font-style:italic} ",w="absolute";qx.Class.define(n,{type:l,implement:qx.ui.table.ICellRenderer,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);var I=qx.ui.table.cellrenderer.Abstract;if(!I.__wp){var K=qx.theme.manager.Color.getInstance();I.__wp=this.self(arguments);var J=h+qx.bom.element.Style.compile({position:w,top:E,overflow:t,whiteSpace:e,borderRight:C+K.resolve(A),padding:G,cursor:d,textOverflow:o,userSelect:s})+v+H+x+B;if(!qx.core.Variant.isSet(c,q)){J+=h+qx.bom.element.BoxSizing.compile(p)+b;}I.__wp.stylesheet=qx.bom.Stylesheet.createElement(J);}},properties:{defaultCellStyle:{init:null,check:z,nullable:true}},members:{_insetX:6+6+1,_insetY:0,_getCellClass:function(L){return g;},_getCellStyle:function(M){return M.style||j;},_getCellAttributes:function(N){return j;},_getContentHtml:function(O){return O.value||j;},_getCellSizeStyle:function(P,Q,R,S){var T=j;if(qx.bom.client.Feature.CONTENT_BOX){P-=R;Q-=S;}T+=a+Math.max(P,0)+i;T+=D+Math.max(Q,0)+i;return T;},createDataCellHtml:function(U,V){V.push(F,this._getCellClass(U),k,m,U.styleLeft,u,this._getCellSizeStyle(U.styleWidth,U.styleHeight,this._insetX,this._insetY),this._getCellStyle(U),f,this._getCellAttributes(U),y+this._getContentHtml(U),r);}}});})();(function(){var h="",g="number",f="Boolean",e="qx.ui.table.cellrenderer.Default",d=" qooxdoo-table-cell-bold",c=" qooxdoo-table-cell-right",b=" qooxdoo-table-cell-italic",a="string";qx.Class.define(e,{extend:qx.ui.table.cellrenderer.Abstract,statics:{STYLEFLAG_ALIGN_RIGHT:1,STYLEFLAG_BOLD:2,STYLEFLAG_ITALIC:4,_numberFormat:null},properties:{useAutoAlign:{check:f,init:true}},members:{_getStyleFlags:function(i){if(this.getUseAutoAlign()){if(typeof i.value==g){return qx.ui.table.cellrenderer.Default.STYLEFLAG_ALIGN_RIGHT;}}return 0;},_getCellClass:function(j){var k=qx.ui.table.cellrenderer.Abstract.prototype._getCellClass.call(this,j);if(!k){return h;}var l=this._getStyleFlags(j);if(l&qx.ui.table.cellrenderer.Default.STYLEFLAG_ALIGN_RIGHT){k+=c;}if(l&qx.ui.table.cellrenderer.Default.STYLEFLAG_BOLD){k+=d;}if(l&qx.ui.table.cellrenderer.Default.STYLEFLAG_ITALIC){k+=b;}return k;},_getContentHtml:function(m){return qx.bom.String.escape(this._formatValue(m));},_formatValue:function(n){var p=n.value;var o;if(p==null){return h;}if(typeof p==a){return p;}else if(typeof p==g){if(!qx.ui.table.cellrenderer.Default._numberFormat){qx.ui.table.cellrenderer.Default._numberFormat=new qx.util.format.NumberFormat();qx.ui.table.cellrenderer.Default._numberFormat.setMaximumFractionDigits(2);}var o=qx.ui.table.cellrenderer.Default._numberFormat.format(p);}else if(p instanceof Date){o=qx.util.format.DateFormat.getDateInstance().format(p);}else{o=p;}return o;}}});})();(function(){var k="qx.event.type.Data",j="visibilityChanged",h="orderChanged",g="visibilityChangedPre",f="__wv",e="__ww",d="widthChanged",c="qx.ui.table.columnmodel.Basic",b="__wx",a="headerCellRendererChanged";qx.Class.define(c,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__wq=[];this.__wr=[];},events:{"widthChanged":k,"visibilityChangedPre":k,"visibilityChanged":k,"orderChanged":k,"headerCellRendererChanged":k},statics:{DEFAULT_WIDTH:100,DEFAULT_HEADER_RENDERER:qx.ui.table.headerrenderer.Default,DEFAULT_DATA_RENDERER:qx.ui.table.cellrenderer.Default,DEFAULT_EDITOR_FACTORY:qx.ui.table.celleditor.TextField},members:{__ws:null,__wt:null,__wr:null,__wq:null,__wu:null,__wv:null,__ww:null,__wx:null,init:function(l,m){{};this.__wu=[];var q=qx.ui.table.columnmodel.Basic.DEFAULT_WIDTH;var r=this.__wv||(this.__wv=new qx.ui.table.columnmodel.Basic.DEFAULT_HEADER_RENDERER());var o=this.__ww||(this.__ww=new qx.ui.table.columnmodel.Basic.DEFAULT_DATA_RENDERER());var n=this.__wx||(this.__wx=new qx.ui.table.columnmodel.Basic.DEFAULT_EDITOR_FACTORY());this.__wq=[];this.__wr=[];var t;if(m){t=m.getInitiallyHiddenColumns();}t=t||[];for(var u=0;u<l;u++){this.__wu[u]={width:q,headerRenderer:r,dataRenderer:o,editorFactory:n};this.__wq[u]=u;this.__wr[u]=u;}this.__wt=null;this.__ws=true;for(var s=0;s<t.length;s++){this.setColumnVisible(t[s],false);}this.__ws=false;for(u=0;u<l;u++){var p={col:u,visible:this.isColumnVisible(u)};this.fireDataEvent(g,p);this.fireDataEvent(j,p);}},getVisibleColumns:function(){return this.__wr!=null?this.__wr:[];},setColumnWidth:function(v,w,y){{};var A=this.__wu[v].width;if(A!=w){this.__wu[v].width=w;var z={col:v,newWidth:w,oldWidth:A,isMouseAction:y||false};this.fireDataEvent(d,z);}},getColumnWidth:function(B){{};return this.__wu[B].width;},setHeaderCellRenderer:function(C,D){{};var E=this.__wu[C].headerRenderer;if(E!==this.__wv){E.dispose();}this.__wu[C].headerRenderer=D;this.fireDataEvent(a,{col:C});},getHeaderCellRenderer:function(F){{};return this.__wu[F].headerRenderer;},setDataCellRenderer:function(G,H){{};this.__wu[G].dataRenderer=H;var I=this.__wu[G].dataRenderer;if(I!==this.__ww){return I;}return null;},getDataCellRenderer:function(J){{};return this.__wu[J].dataRenderer;},setCellEditorFactory:function(K,L){{};var M=this.__wu[K].headerRenderer;if(M!==this.__wx){M.dispose();}this.__wu[K].editorFactory=L;},getCellEditorFactory:function(N){{};return this.__wu[N].editorFactory;},_getColToXPosMap:function(){if(this.__wt==null){this.__wt={};for(var Q=0;Q<this.__wq.length;Q++){var P=this.__wq[Q];this.__wt[P]={overX:Q};}for(var O=0;O<this.__wr.length;O++){var P=this.__wr[O];this.__wt[P].visX=O;}}return this.__wt;},getVisibleColumnCount:function(){return this.__wr!=null?this.__wr.length:0;},getVisibleColumnAtX:function(R){{};return this.__wr[R];},getVisibleX:function(S){{};return this._getColToXPosMap()[S].visX;},getOverallColumnCount:function(){return this.__wq.length;},getOverallColumnAtX:function(T){{};return this.__wq[T];},getOverallX:function(U){{};return this._getColToXPosMap()[U].overX;},isColumnVisible:function(V){{};return (this._getColToXPosMap()[V].visX!=null);},setColumnVisible:function(W,X){{};if(X!=this.isColumnVisible(W)){if(X){var be=this._getColToXPosMap();var bb=be[W].overX;if(bb==null){throw new Error("Showing column failed: "+W+". The column is not added to this TablePaneModel.");}var bc;for(var x=bb+1;x<this.__wq.length;x++){var bd=this.__wq[x];var Y=be[bd].visX;if(Y!=null){bc=Y;break;}}if(bc==null){bc=this.__wr.length;}this.__wr.splice(bc,0,W);}else{var ba=this.getVisibleX(W);this.__wr.splice(ba,1);}this.__wt=null;if(!this.__ws){var bf={col:W,visible:X};this.fireDataEvent(g,bf);this.fireDataEvent(j,bf);}}},moveColumn:function(bg,bh){{};this.__ws=true;var bk=this.__wq[bg];var bi=this.isColumnVisible(bk);if(bi){this.setColumnVisible(bk,false);}this.__wq.splice(bg,1);this.__wq.splice(bh,0,bk);this.__wt=null;if(bi){this.setColumnVisible(bk,true);}this.__ws=false;var bj={col:bk,fromOverXPos:bg,toOverXPos:bh};this.fireDataEvent(h,bj);},setColumnsOrder:function(bl){{};if(bl.length==this.__wq.length){this.__ws=true;var bo=new Array(bl.length);for(var bm=0;bm<this.__wq.length;bm++){var bn=this.isColumnVisible(bm);bo[bm]=bn;if(bn){this.setColumnVisible(bm,false);}}this.__wq=qx.lang.Array.clone(bl);this.__wt=null;for(var bm=0;bm<this.__wq.length;bm++){if(bo[bm]){this.setColumnVisible(bm,true);}}this.__ws=false;this.fireDataEvent(h);}else{throw new Error("setColumnsOrder: Invalid number of column positions given, expected "+this.__wq.length+", got "+bl.length);}}},destruct:function(){for(var i=0;i<this.__wu.length;i++){this.__wu[i].headerRenderer.dispose();this.__wu[i].dataRenderer.dispose();this.__wu[i].editorFactory.dispose();}this.__wq=this.__wr=this.__wu=this.__wt=null;this._disposeObjects(f,e,b);}});})();(function(){var n="appear",m="columnVisibilityMenuCreateEnd",l="tableWidthChanged",k="verticalScrollBarChanged",j="qx.ui.table.columnmodel.resizebehavior.Abstract",i="qx.ui.table.columnmodel.Resize",h="_applyBehavior",g="separator",f="visibilityChanged",e="Reset column widths",b="changeBehavior",d="user-button",c="widthChanged",a="execute";qx.Class.define(i,{extend:qx.ui.table.columnmodel.Basic,include:qx.locale.MTranslation,construct:function(){qx.ui.table.columnmodel.Basic.call(this);this.__yb=false;this.__yc=false;},properties:{behavior:{check:j,init:null,nullable:true,apply:h,event:b}},members:{__yc:null,__yb:null,__yd:null,_applyBehavior:function(p,q){if(q!=null){q.dispose();q=null;}p._setNumColumns(this.getOverallColumnCount());p.setTableColumnModel(this);},init:function(r,s){qx.ui.table.columnmodel.Basic.prototype.init.call(this,r,s);if(this.__yd==null){this.__yd=s;s.addListener(n,this._onappear,this);s.addListener(l,this._onTableWidthChanged,this);s.addListener(k,this._onverticalscrollbarchanged,this);s.addListener(m,this._addResetColumnWidthButton,this);this.addListener(c,this._oncolumnwidthchanged,this);this.addListener(f,this._onvisibilitychanged,this);}if(this.getBehavior()==null){this.setBehavior(new qx.ui.table.columnmodel.resizebehavior.Default());}this.getBehavior()._setNumColumns(r);},getTable:function(){return this.__yd;},_addResetColumnWidthButton:function(event){var v=event.getData();var u=v.columnButton;var t=v.menu;var o;o=u.factory(g);t.add(o);o=u.factory(d,{text:this.tr(e)});t.add(o);o.addListener(a,this._onappear,this);},_onappear:function(event){if(this.__yb){return ;}this.__yb=true;{};this.getBehavior().onAppear(event,event.getType()!==n);this.__yd._updateScrollerWidths();this.__yd._updateScrollBarVisibility();this.__yb=false;this.__yc=true;},_onTableWidthChanged:function(event){if(this.__yb||!this.__yc){return ;}this.__yb=true;{};this.getBehavior().onTableWidthChanged(event);this.__yb=false;},_onverticalscrollbarchanged:function(event){if(this.__yb||!this.__yc){return ;}this.__yb=true;{};this.getBehavior().onVerticalScrollBarChanged(event);qx.event.Timer.once(function(){if(this.__yd&&!this.__yd.isDisposed()){this.__yd._updateScrollerWidths();this.__yd._updateScrollBarVisibility();}},this,0);this.__yb=false;},_oncolumnwidthchanged:function(event){if(this.__yb||!this.__yc){return ;}this.__yb=true;{};this.getBehavior().onColumnWidthChanged(event);this.__yb=false;},_onvisibilitychanged:function(event){if(this.__yb||!this.__yc){return ;}this.__yb=true;{};this.getBehavior().onVisibilityChanged(event);this.__yb=false;}},destruct:function(){this.__yd=null;}});})();(function(){var i="icon",h="label",g="String",f="sort-icon",e="_applySortIcon",d="_applyIcon",c="table-header-cell",b="qx.ui.table.headerrenderer.HeaderCell",a="_applyLabel";qx.Class.define(b,{extend:qx.ui.container.Composite,construct:function(){qx.ui.container.Composite.call(this);var j=new qx.ui.layout.Grid();j.setRowFlex(0,1);j.setColumnFlex(1,1);j.setColumnFlex(2,1);this.setLayout(j);},properties:{appearance:{refine:true,init:c},label:{check:g,init:null,nullable:true,apply:a},sortIcon:{check:g,init:null,nullable:true,apply:e,themeable:true},icon:{check:g,init:null,nullable:true,apply:d}},members:{_applyLabel:function(k,l){if(k){this._showChildControl(h).setValue(k);}else{this._excludeChildControl(h);}},_applySortIcon:function(m,n){if(m){this._showChildControl(f).setSource(m);}else{this._excludeChildControl(f);}},_applyIcon:function(o,p){if(o){this._showChildControl(i).setSource(o);}else{this._excludeChildControl(i);}},_createChildControlImpl:function(q,r){var s;switch(q){case h:s=new qx.ui.basic.Label(this.getLabel()).set({anonymous:true,allowShrinkX:true});this._add(s,{row:0,column:1});break;case f:s=new qx.ui.basic.Image(this.getSortIcon());s.setAnonymous(true);this._add(s,{row:0,column:2});break;case i:s=new qx.ui.basic.Image(this.getIcon()).set({anonymous:true,allowShrinkX:true});this._add(s,{row:0,column:0});break;}return s||qx.ui.container.Composite.prototype._createChildControlImpl.call(this,q);}}});})();(function(){var e="qx.ui.popup.Popup",d="visible",c="excluded",b="popup",a="Boolean";qx.Class.define(e,{extend:qx.ui.container.Composite,include:qx.ui.core.MPlacement,construct:function(f){qx.ui.container.Composite.call(this,f);qx.core.Init.getApplication().getRoot().add(this);this.initVisibility();},properties:{appearance:{refine:true,init:b},visibility:{refine:true,init:c},autoHide:{check:a,init:true}},members:{_applyVisibility:function(g,h){qx.ui.container.Composite.prototype._applyVisibility.call(this,g,h);var i=qx.ui.popup.Manager.getInstance();g===d?i.add(this):i.remove(this);}},destruct:function(){qx.ui.popup.Manager.getInstance().remove(this);}});})();(function(){var l="atom",k="Integer",j="String",i="_applyRich",h="qx.ui.tooltip.ToolTip",g="_applyIcon",f="tooltip",d="qx.ui.core.Widget",c="mouseover",b="Boolean",a="_applyLabel";qx.Class.define(h,{extend:qx.ui.popup.Popup,construct:function(m,n){qx.ui.popup.Popup.call(this);this.setLayout(new qx.ui.layout.Grow);this._createChildControl(l);if(m!=null){this.setLabel(m);}if(n!=null){this.setIcon(n);}this.addListener(c,this._onMouseOver,this);},properties:{appearance:{refine:true,init:f},showTimeout:{check:k,init:700,themeable:true},hideTimeout:{check:k,init:4000,themeable:true},label:{check:j,nullable:true,apply:a},icon:{check:j,nullable:true,apply:g,themeable:true},rich:{check:b,init:false,apply:i},opener:{check:d,nullable:true}},members:{_createChildControlImpl:function(o,p){var q;switch(o){case l:q=new qx.ui.basic.Atom;this._add(q);break;}return q||qx.ui.popup.Popup.prototype._createChildControlImpl.call(this,o);},_onMouseOver:function(e){this.hide();},_applyIcon:function(r,s){var t=this.getChildControl(l);r==null?t.resetIcon():t.setIcon(r);},_applyLabel:function(u,v){var w=this.getChildControl(l);u==null?w.resetLabel():w.setLabel(u);},_applyRich:function(x,y){var z=this.getChildControl(l);z.setRich(x);}}});})();(function(){var f="mousedown",d="__rz",c="blur",b="singleton",a="qx.ui.popup.Manager";qx.Class.define(a,{type:b,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__rz=[];qx.event.Registration.addListener(document.documentElement,f,this.__rB,this,true);qx.bom.Element.addListener(window,c,this.hideAll,this);},members:{__rz:null,add:function(g){{};this.__rz.push(g);this.__rA();},remove:function(h){{};if(this.__rz){qx.lang.Array.remove(this.__rz,h);this.__rA();}},hideAll:function(){if(this.__rz){for(var i=0;i<this.__rz.length;i++){this.__rz[i].exclude();}}},__rA:function(){var j=1e7;for(var i=0;i<this.__rz.length;i++){this.__rz[i].setZIndex(j++);}},__rB:function(e){var l=qx.ui.core.Widget.getWidgetByElement(e.getTarget());var m=this.__rz;for(var i=0;i<m.length;i++){var k=m[i];if(!k.getAutoHide()||l==k||qx.ui.core.Widget.contains(k,l)){continue;}k.exclude();}}},destruct:function(){qx.event.Registration.removeListener(document.documentElement,f,this.__rB,this,true);this._disposeArray(d);}});})();(function(){var bD="(\\d\\d?)",bC="format",bB="",bA="abbreviated",bz="wide",by="(",bx=")",bw="|",bv="stand-alone",bu="wildcard",bj="default",bi="literal",bh="'",bg="hour",bf="(\\d\\d?\\d?)",be="ms",bd="narrow",bc="-",bb="quoted_literal",ba='a',bK="HH:mm:ss",bL="+",bI="HHmmss",bJ="long",bG='z',bH="0",bE="sec",bF="day",bM='Z',bN=" ",bn="min",bm="mm",bp="(\\d+)",bo="h",br="KK",bq='L',bt="Z",bs="(\\d\\d+)",bl="EEEE",bk="^",a=":",b='y',c="K",d="a",e="([\\+\\-]\\d\\d:?\\d\\d)",f="GMT",g="dd",h="qx.util.format.DateFormat",j="yyy",k="H",bR="YYYY",bQ="y",bP="HH",bO="EE",bV='h',bU="S",bT='s',bS='A',bX="yyyyyy",bW="kk",J="ss",K='H',H='S',I="MMMM",N='c',O="d",L="([a-zA-Z]+)",M='k',F="m",G='Y',s='D',r="yyyyy",u='K',t="hh",o="SSS",n="MM",q="yy",p="(\\d\\d\\d\\d\\d\\d+)",m="yyyy-MM-dd HH:mm:ss",l="(\\d\\d\\d\\d\\d+)",T="short",U='d',V="unkown",W='m',P="(\\d\\d\\d\\d)",Q="(\\d\\d\\d+)",R="k",S='M',X="(\\d\\d\\d\\d+)",Y="SS",C="MMM",B="s",A="M",z='w',y="EEE",x="$",w="?",v='E',E="z",D="yyyy";qx.Class.define(h,{extend:qx.core.Object,implement:qx.util.format.IFormat,construct:function(bY,ca){qx.core.Object.call(this);if(!ca){this.__wy=qx.locale.Manager.getInstance().getLocale();}else{this.__wy=ca;}if(bY!=null){this.__wz=bY.toString();}else{this.__wz=qx.locale.Date.getDateFormat(bJ,this.__wy)+bN+qx.locale.Date.getDateTimeFormat(bI,bK,this.__wy);}},statics:{getDateTimeInstance:function(){var cc=qx.util.format.DateFormat;var cb=qx.locale.Date.getDateFormat(bJ)+bN+qx.locale.Date.getDateTimeFormat(bI,bK);if(cc._dateInstance==null||cc._dateInstance.__wz!=cb){cc._dateTimeInstance=new cc();}return cc._dateTimeInstance;},getDateInstance:function(){var ce=qx.util.format.DateFormat;var cd=qx.locale.Date.getDateFormat(T)+bB;if(ce._dateInstance==null||ce._dateInstance.__wz!=cd){ce._dateInstance=new ce(cd);}return ce._dateInstance;},ASSUME_YEAR_2000_THRESHOLD:30,LOGGING_DATE_TIME__format:m,AM_MARKER:"am",PM_MARKER:"pm",MEDIUM_TIMEZONE_NAMES:["GMT"],FULL_TIMEZONE_NAMES:["Greenwich Mean Time"]},members:{__wy:null,__wz:null,__wA:null,__wB:null,__wC:null,__wD:function(cf,cg){var ch=bB+cf;while(ch.length<cg){ch=bH+ch;}return ch;},__wE:function(ci){var cj=new Date(ci.getTime());var ck=cj.getDate();while(cj.getMonth()!=0){cj.setDate(-1);ck+=cj.getDate()+1;}return ck;},__wF:function(cl){return new Date(cl.getTime()+(3-((cl.getDay()+6)%7))*86400000);},__wG:function(cm){var co=this.__wF(cm);var cp=co.getFullYear();var cn=this.__wF(new Date(cp,0,4));return Math.floor(1.5+(co.getTime()-cn.getTime())/86400000/7);},format:function(cq){if(cq==null){return null;}var cw=qx.util.format.DateFormat;var cx=this.__wy;var cH=cq.getFullYear();var cB=cq.getMonth();var cJ=cq.getDate();var cr=cq.getDay();var cC=cq.getHours();var cy=cq.getMinutes();var cD=cq.getSeconds();var cF=cq.getMilliseconds();var cI=cq.getTimezoneOffset();var cu=cI>0?1:-1;var cs=Math.floor(Math.abs(cI)/60);var cz=Math.abs(cI)%60;this.__wH();var cG=bB;for(var i=0;i<this.__wC.length;i++){var cE=this.__wC[i];if(cE.type==bi){cG+=cE.text;}else{var cv=cE.character;var cA=cE.size;var ct=w;switch(cv){case b:case G:if(cA==2){ct=this.__wD(cH%100,2);}else{ct=cH+bB;if(cA>ct.length){for(var i=ct.length;i<cA;i++){ct=bH+ct;}}}break;case s:ct=this.__wD(this.__wE(cq),cA);break;case U:ct=this.__wD(cJ,cA);break;case z:ct=this.__wD(this.__wG(cq),cA);break;case v:if(cA==2){ct=qx.locale.Date.getDayName(bd,cr,cx,bC);}else if(cA==3){ct=qx.locale.Date.getDayName(bA,cr,cx,bC);}else if(cA==4){ct=qx.locale.Date.getDayName(bz,cr,cx,bC);}break;case N:if(cA==2){ct=qx.locale.Date.getDayName(bd,cr,cx,bv);}else if(cA==3){ct=qx.locale.Date.getDayName(bA,cr,cx,bv);}else if(cA==4){ct=qx.locale.Date.getDayName(bz,cr,cx,bv);}break;case S:if(cA==1||cA==2){ct=this.__wD(cB+1,cA);}else if(cA==3){ct=qx.locale.Date.getMonthName(bA,cB,cx,bC);}else if(cA==4){ct=qx.locale.Date.getMonthName(bz,cB,cx,bC);}break;case bq:if(cA==1||cA==2){ct=this.__wD(cB+1,cA);}else if(cA==3){ct=qx.locale.Date.getMonthName(bA,cB,cx,bv);}else if(cA==4){ct=qx.locale.Date.getMonthName(bz,cB,cx,bv);}break;case ba:ct=(cC<12)?qx.locale.Date.getAmMarker(cx):qx.locale.Date.getPmMarker(cx);break;case K:ct=this.__wD(cC,cA);break;case M:ct=this.__wD((cC==0)?24:cC,cA);break;case u:ct=this.__wD(cC%12,cA);break;case bV:ct=this.__wD(((cC%12)==0)?12:(cC%12),cA);break;case W:ct=this.__wD(cy,cA);break;case bT:ct=this.__wD(cD,cA);break;case H:ct=this.__wD(cF,cA);break;case bG:if(cA==1){ct=f+((cu>0)?bc:bL)+this.__wD(Math.abs(cs))+a+this.__wD(cz,2);}else if(cA==2){ct=cw.MEDIUM_TIMEZONE_NAMES[cs];}else if(cA==3){ct=cw.FULL_TIMEZONE_NAMES[cs];}break;case bM:ct=((cu>0)?bc:bL)+this.__wD(Math.abs(cs),2)+this.__wD(cz,2);break;}cG+=ct;}}return cG;},parse:function(cK){this.__wI();var cQ=this.__wA.regex.exec(cK);if(cQ==null){throw new Error("Date string '"+cK+"' does not match the date format: "+this.__wz);}var cL={year:1970,month:0,day:1,hour:0,ispm:false,min:0,sec:0,ms:0};var cM=1;for(var i=0;i<this.__wA.usedRules.length;i++){var cO=this.__wA.usedRules[i];var cN=cQ[cM];if(cO.field!=null){cL[cO.field]=parseInt(cN,10);}else{cO.manipulator(cL,cN);}cM+=(cO.groups==null)?1:cO.groups;}var cP=new Date(cL.year,cL.month,cL.day,(cL.ispm)?(cL.hour+12):cL.hour,cL.min,cL.sec,cL.ms);if(cL.month!=cP.getMonth()||cL.year!=cP.getFullYear()){throw new Error("Error parsing date '"+cK+"': the value for day or month is too large");}return cP;},__wH:function(){if(this.__wC!=null){return;}this.__wC=[];var cV;var cT=0;var cX=bB;var cR=this.__wz;var cU=bj;var i=0;while(i<cR.length){var cW=cR.charAt(i);switch(cU){case bb:if(cW==bh){if(i+1>=cR.length){i++;break;}var cS=cR.charAt(i+1);if(cS==bh){cX+=cW;i++;}else{i++;cU=V;}}else{cX+=cW;i++;}break;case bu:if(cW==cV){cT++;i++;}else{this.__wC.push({type:bu,character:cV,size:cT});cV=null;cT=0;cU=bj;}break;default:if((cW>=ba&&cW<=bG)||(cW>=bS&&cW<=bM)){cV=cW;cU=bu;}else if(cW==bh){if(i+1>=cR.length){cX+=cW;i++;break;}var cS=cR.charAt(i+1);if(cS==bh){cX+=cW;i++;}i++;cU=bb;}else{cU=bj;}if(cU!=bj){if(cX.length>0){this.__wC.push({type:bi,text:cX});cX=bB;}}else{cX+=cW;i++;}break;}}if(cV!=null){this.__wC.push({type:bu,character:cV,size:cT});}else if(cX.length>0){this.__wC.push({type:bi,text:cX});}},__wI:function(){if(this.__wA!=null){return ;}var dc=this.__wz;this.__wJ();this.__wH();var di=[];var de=bk;for(var da=0;da<this.__wC.length;da++){var dj=this.__wC[da];if(dj.type==bi){de+=qx.lang.String.escapeRegexpChars(dj.text);}else{var db=dj.character;var df=dj.size;var dd;for(var dk=0;dk<this.__wB.length;dk++){var dg=this.__wB[dk];if(db==dg.pattern.charAt(0)&&df==dg.pattern.length){dd=dg;break;}}if(dd==null){var dh=bB;for(var i=0;i<df;i++){dh+=db;}throw new Error("Malformed date format: "+dc+". Wildcard "+dh+" is not supported");}else{di.push(dd);de+=dd.regex;}}}de+=x;var cY;try{cY=new RegExp(de);}catch(dl){throw new Error("Malformed date format: "+dc);}this.__wA={regex:cY,"usedRules":di,pattern:de};},__wJ:function(){var dw=qx.util.format.DateFormat;var dz=qx.lang.String;if(this.__wB!=null){return ;}var dx=this.__wB=[];var dn=qx.locale.Date.getAmMarker(this.__wy).toString()||dw.AM_MARKER;var dE=qx.locale.Date.getPmMarker(this.__wy).toString()||dw.PM_MARKER;var ds=function(dI,dJ){dJ=parseInt(dJ,10);if(dJ<dw.ASSUME_YEAR_2000_THRESHOLD){dJ+=2000;}else if(dJ<100){dJ+=1900;}dI.year=dJ;};var du=function(dK,dL){dK.month=parseInt(dL,10)-1;};var dq=function(dM,dN){var dO=qx.locale.Date.getPmMarker(this.__wy).toString()||dw.PM_MARKER;dM.ispm=(dN==dO);};var dG=function(dP,dQ){dP.hour=parseInt(dQ,10)%24;};var dp=function(dR,dS){dR.hour=parseInt(dS,10)%12;};var dB=function(dT,dU){return;};var dH=qx.locale.Date.getMonthNames(bA,this.__wy,bC);for(var i=0;i<dH.length;i++){dH[i]=dz.escapeRegexpChars(dH[i].toString());}var dr=function(dV,dW){dW=dz.escapeRegexpChars(dW);dV.month=dH.indexOf(dW);};var dy=qx.locale.Date.getMonthNames(bz,this.__wy,bC);for(var i=0;i<dy.length;i++){dy[i]=dz.escapeRegexpChars(dy[i].toString());}var dC=function(dX,dY){dY=dz.escapeRegexpChars(dY);dX.month=dy.indexOf(dY);};var dm=qx.locale.Date.getDayNames(bd,this.__wy,bC);for(var i=0;i<dm.length;i++){dm[i]=dz.escapeRegexpChars(dm[i].toString());}var dF=function(ea,eb){eb=dz.escapeRegexpChars(eb);ea.month=dm.indexOf(eb);};var dD=qx.locale.Date.getDayNames(bA,this.__wy,bC);for(var i=0;i<dD.length;i++){dD[i]=dz.escapeRegexpChars(dD[i].toString());}var dt=function(ec,ed){ed=dz.escapeRegexpChars(ed);ec.month=dD.indexOf(ed);};var dA=qx.locale.Date.getDayNames(bz,this.__wy,bC);for(var i=0;i<dA.length;i++){dA[i]=dz.escapeRegexpChars(dA[i].toString());}var dv=function(ee,ef){ef=dz.escapeRegexpChars(ef);ee.month=dA.indexOf(ef);};dx.push({pattern:bR,regex:P,manipulator:ds});dx.push({pattern:bQ,regex:bp,manipulator:ds});dx.push({pattern:q,regex:bs,manipulator:ds});dx.push({pattern:j,regex:Q,manipulator:ds});dx.push({pattern:D,regex:X,manipulator:ds});dx.push({pattern:r,regex:l,manipulator:ds});dx.push({pattern:bX,regex:p,manipulator:ds});dx.push({pattern:A,regex:bD,manipulator:du});dx.push({pattern:n,regex:bD,manipulator:du});dx.push({pattern:C,regex:by+dH.join(bw)+bx,manipulator:dr});dx.push({pattern:I,regex:by+dy.join(bw)+bx,manipulator:dC});dx.push({pattern:g,regex:bD,field:bF});dx.push({pattern:O,regex:bD,field:bF});dx.push({pattern:bO,regex:by+dm.join(bw)+bx,manipulator:dF});dx.push({pattern:y,regex:by+dD.join(bw)+bx,manipulator:dt});dx.push({pattern:bl,regex:by+dA.join(bw)+bx,manipulator:dv});dx.push({pattern:d,regex:by+dn+bw+dE+bx,manipulator:dq});dx.push({pattern:bP,regex:bD,field:bg});dx.push({pattern:k,regex:bD,field:bg});dx.push({pattern:bW,regex:bD,manipulator:dG});dx.push({pattern:R,regex:bD,manipulator:dG});dx.push({pattern:br,regex:bD,field:bg});dx.push({pattern:c,regex:bD,field:bg});dx.push({pattern:t,regex:bD,manipulator:dp});dx.push({pattern:bo,regex:bD,manipulator:dp});dx.push({pattern:bm,regex:bD,field:bn});dx.push({pattern:F,regex:bD,field:bn});dx.push({pattern:J,regex:bD,field:bE});dx.push({pattern:B,regex:bD,field:bE});dx.push({pattern:o,regex:bf,field:be});dx.push({pattern:Y,regex:bf,field:be});dx.push({pattern:bU,regex:bf,field:be});dx.push({pattern:bt,regex:e,manipulator:dB});dx.push({pattern:E,regex:L,manipulator:dB});}},destruct:function(){this.__wC=this.__wA=this.__wB=null;}});})();(function(){var k="_",j="format",h="thu",g="sat",f="cldr_day_",e="cldr_month_",d="wed",c="fri",b="tue",a="mon",B="sun",A="short",z="HH:mm",y="HHmmsszz",x="HHmm",w="HHmmss",v="cldr_date_format_",u="HH:mm:ss zz",t="full",s="cldr_pm",q="long",r="medium",o="cldr_am",p="qx.locale.Date",m="cldr_date_time_format_",n="cldr_time_format_",l="HH:mm:ss";qx.Class.define(p,{statics:{__wK:qx.locale.Manager.getInstance(),getAmMarker:function(C){return this.__wK.localize(o,[],C);},getPmMarker:function(D){return this.__wK.localize(s,[],D);},getDayNames:function(length,E,F){var F=F?F:j;{};var H=[B,a,b,d,h,c,g];var I=[];for(var i=0;i<H.length;i++){var G=f+F+k+length+k+H[i];I.push(this.__wK.localize(G,[],E));}return I;},getDayName:function(length,J,K,L){var L=L?L:j;{};var N=[B,a,b,d,h,c,g];var M=f+L+k+length+k+N[J];return this.__wK.localize(M,[],K);},getMonthNames:function(length,O,P){var P=P?P:j;{};var R=[];for(var i=0;i<12;i++){var Q=e+P+k+length+k+(i+1);R.push(this.__wK.localize(Q,[],O));}return R;},getMonthName:function(length,S,T,U){var U=U?U:j;{};var V=e+U+k+length+k+(S+1);return this.__wK.localize(V,[],T);},getDateFormat:function(W,X){{};var Y=v+W;return this.__wK.localize(Y,[],X);},getDateTimeFormat:function(ba,bb,bc){var be=m+ba;var bd=this.__wK.localize(be,[],bc);if(bd==be){bd=bb;}return bd;},getTimeFormat:function(bf,bg){{};var bi=n+bf;var bh=this.__wK.localize(bi,[],bg);if(bh!=bi){return bh;}switch(bf){case A:case r:return qx.locale.Date.getDateTimeFormat(x,z);case q:return qx.locale.Date.getDateTimeFormat(w,l);case t:return qx.locale.Date.getDateTimeFormat(y,u);default:throw new Error("This case should never happen.");}},getWeekStart:function(bj){var bk={"MV":5,"AE":6,"AF":6,"BH":6,"DJ":6,"DZ":6,"EG":6,"ER":6,"ET":6,"IQ":6,"IR":6,"JO":6,"KE":6,"KW":6,"LB":6,"LY":6,"MA":6,"OM":6,"QA":6,"SA":6,"SD":6,"SO":6,"TN":6,"YE":6,"AS":0,"AU":0,"AZ":0,"BW":0,"CA":0,"CN":0,"FO":0,"GE":0,"GL":0,"GU":0,"HK":0,"IE":0,"IL":0,"IS":0,"JM":0,"JP":0,"KG":0,"KR":0,"LA":0,"MH":0,"MN":0,"MO":0,"MP":0,"MT":0,"NZ":0,"PH":0,"PK":0,"SG":0,"TH":0,"TT":0,"TW":0,"UM":0,"US":0,"UZ":0,"VI":0,"ZA":0,"ZW":0,"MW":0,"NG":0,"TJ":0};var bl=qx.locale.Date._getTerritory(bj);return bk[bl]!=null?bk[bl]:1;},getWeekendStart:function(bm){var bo={"EG":5,"IL":5,"SY":5,"IN":0,"AE":4,"BH":4,"DZ":4,"IQ":4,"JO":4,"KW":4,"LB":4,"LY":4,"MA":4,"OM":4,"QA":4,"SA":4,"SD":4,"TN":4,"YE":4};var bn=qx.locale.Date._getTerritory(bm);return bo[bn]!=null?bo[bn]:6;},getWeekendEnd:function(bp){var bq={"AE":5,"BH":5,"DZ":5,"IQ":5,"JO":5,"KW":5,"LB":5,"LY":5,"MA":5,"OM":5,"QA":5,"SA":5,"SD":5,"TN":5,"YE":5,"AF":5,"IR":5,"EG":6,"IL":6,"SY":6};var br=qx.locale.Date._getTerritory(bp);return bq[br]!=null?bq[br]:0;},isWeekend:function(bs,bt){var bv=qx.locale.Date.getWeekendStart(bt);var bu=qx.locale.Date.getWeekendEnd(bt);if(bu>bv){return ((bs>=bv)&&(bs<=bu));}else{return ((bs>=bv)||(bs<=bu));}},_getTerritory:function(bw){if(bw){var bx=bw.split(k)[1]||bw;}else{bx=this.__wK.getTerritory()||this.__wK.getLanguage();}return bx.toUpperCase();}}});})();(function(){var e="auto",d="string",c="number",b="*",a="qx.ui.core.ColumnData";qx.Class.define(a,{extend:qx.ui.core.LayoutItem,construct:function(){qx.ui.core.LayoutItem.call(this);this.setColumnWidth(e);},members:{__ye:null,renderLayout:function(f,top,g,h){this.__ye=g;},getComputedWidth:function(){return this.__ye;},getFlex:function(){return this.getLayoutProperties().flex||0;},setColumnWidth:function(i,j){var j=j||0;var k=null;if(typeof i==c){this.setWidth(i);}else if(typeof i==d){if(i==e){j=1;}else{var l=i.match(/^[0-9]+(?:\.[0-9]+)?([%\*])$/);if(l){if(l[1]==b){j=parseFloat(i);}else{k=i;}}}}this.setLayoutProperties({flex:j,width:k});}},settings:{"qx.tableResizeDebug":false}});})();(function(){var b="qx.ui.table.columnmodel.resizebehavior.Abstract",a="abstract";qx.Class.define(b,{type:a,extend:qx.core.Object,members:{_setNumColumns:function(c){throw new Error("_setNumColumns is abstract");},onAppear:function(event,d){throw new Error("onAppear is abstract");},onTableWidthChanged:function(event){throw new Error("onTableWidthChanged is abstract");},onVerticalScrollBarChanged:function(event){throw new Error("onVerticalScrollBarChanged is abstract");},onColumnWidthChanged:function(event){throw new Error("onColumnWidthChanged is abstract");},onVisibilityChanged:function(event){throw new Error("onVisibilityChanged is abstract");},_getAvailableWidth:function(){var f=this.getTableColumnModel();var i=f.getTable();var e=i._getPaneScrollerArr();if(!e[0]||!e[0].getLayoutParent().getBounds()){return null;}var h=e[0].getLayoutParent().getBounds().width;var g=e[e.length-1];h-=g.getPaneInsetRight();return h;}}});})();(function(){var j="Function",h="Boolean",g="minWidth",f="width",e="__yg",d="qx.ui.table.columnmodel.Resize",c="qx.ui.table.columnmodel.resizebehavior.Default",b="__yh",a="maxWidth";qx.Class.define(c,{extend:qx.ui.table.columnmodel.resizebehavior.Abstract,construct:function(){qx.ui.table.columnmodel.resizebehavior.Abstract.call(this);this.__yf=[];this.__yg=new qx.ui.layout.HBox();this.__yg.connectToWidget(this);this.__yh=new qx.util.DeferredCall(this._computeColumnsFlexWidth,this);},properties:{newResizeBehaviorColumnData:{check:j,init:function(k){return new qx.ui.core.ColumnData();}},initializeWidthsOnEveryAppear:{check:h,init:false},tableColumnModel:{check:d}},members:{__yg:null,__yi:null,__yf:null,__yh:null,__yj:false,setWidth:function(m,n,o){if(m>=this.__yf.length){throw new Error("Column number out of range");}this.__yf[m].setColumnWidth(n,o);this.__yh.schedule();},setMinWidth:function(p,q){if(p>=this.__yf.length){throw new Error("Column number out of range");}this.__yf[p].setMinWidth(q);this.__yh.schedule();},setMaxWidth:function(r,s){if(r>=this.__yf.length){throw new Error("Column number out of range");}this.__yf[r].setMaxWidth(s);this.__yh.schedule();},set:function(t,u){for(var v in u){switch(v){case f:this.setWidth(t,u[v]);break;case g:this.setMinWidth(t,u[v]);break;case a:this.setMaxWidth(t,u[v]);break;default:throw new Error("Unknown property: "+v);}}},onAppear:function(event,w){if(w===true||!this.__yj||this.getInitializeWidthsOnEveryAppear()){this._computeColumnsFlexWidth();this.__yj=true;}},onTableWidthChanged:function(event){this._computeColumnsFlexWidth();},onVerticalScrollBarChanged:function(event){this._computeColumnsFlexWidth();},onColumnWidthChanged:function(event){this._extendNextColumn(event);},onVisibilityChanged:function(event){var x=event.getData();if(x.visible){this._computeColumnsFlexWidth();return;}this._extendLastColumn(event);},_setNumColumns:function(y){var z=this.__yf;if(y<=z.length){z.splice(y,z.length);return;}for(var i=z.length;i<y;i++){z[i]=this.getNewResizeBehaviorColumnData()();z[i].columnNumber=i;}},getLayoutChildren:function(){return this.__yi;},_computeColumnsFlexWidth:function(){this.__yh.cancel();var E=this._getAvailableWidth();if(E===null){return;}var A=this.getTableColumnModel();var C=A.getVisibleColumns();var D=C.length;var B=this.__yf;var i,l;if(D===0){return;}var G=[];for(i=0;i<D;i++){G.push(B[C[i]]);}this.__yi=G;this.__yk();this.__yg.renderLayout(E,100);for(i=0,l=G.length;i<l;i++){var F=G[i].getComputedWidth();A.setColumnWidth(C[i],F);}},__yk:function(){this.__yg.invalidateChildrenCache();var H=this.__yi;for(var i=0,l=H.length;i<l;i++){H[i].invalidateLayoutCache();}},_extendNextColumn:function(event){var M=this.getTableColumnModel();var P=event.getData();var K=M.getVisibleColumns();var J=this._getAvailableWidth();var I=K.length;if(P.newWidth>P.oldWidth){return ;}var i;var L;var O=0;for(i=0;i<I;i++){O+=M.getColumnWidth(K[i]);}if(O<J){for(i=0;i<K.length;i++){if(K[i]==P.col){L=K[i+1];break;}}if(L){var N=(J-(O-M.getColumnWidth(L)));M.setColumnWidth(L,N);}}},_extendLastColumn:function(event){var T=this.getTableColumnModel();var X=event.getData();if(X.visible){return;}var S=T.getVisibleColumns();if(S.length==0){return;}var R=this._getAvailableWidth(T);var Q=S.length;var i;var V;var W=0;for(i=0;i<Q;i++){W+=T.getColumnWidth(S[i]);}if(W<R){V=S[S.length-1];var U=(R-(W-T.getColumnWidth(V)));T.setColumnWidth(V,U);}},_getResizeColumnData:function(){return this.__yf;}},destruct:function(){this.__yf=this.__yi=null;this._disposeObjects(e,b);}});})();(function(){var p="Boolean",o="column-button",n="Function",m="qx.event.type.Data",k="statusbar",j="qx.ui.table.pane.CellEvent",h="function",g="PageUp",f="dataChanged",e='"',bF="changeLocale",bE="changeSelection",bD="qx.dynlocale",bC="__wd",bB="Enter",bA="metaDataChanged",bz="on",by="_applyStatusBarVisible",bx="columnVisibilityMenuCreateStart",bw="blur",w="qx.ui.table.Table",y="columnVisibilityMenuCreateEnd",u="changeVisible",v="_applyResetSelectionOnHeaderClick",s="_applyMetaColumnCounts",t="focus",q="changeDataRowRenderer",r="changeHeaderCellHeight",F="Escape",G="A",X="changeSelectionModel",T="Left",bg="__vS",bb="Down",bs="Integer",bm="_applyHeaderCellHeight",N="__wb",bv="visibilityChanged",bu="qx.ui.table.ITableModel",bt="orderChanged",L="_applySelectionModel",P="menu-button",R="menu",V="_applyAdditionalStatusBarText",Y="_applyFocusCellOnMouseMove",bc="table",bi="_applyColumnVisibilityButtonVisible",bo="changeTableModel",z="qx.event.type.Event",A="tableWidthChanged",O="_applyHeaderCellsVisible",bf="Object",be="_applyShowCellFocusIndicator",bd="resize",bk="verticalScrollBarChanged",bj="__wc",ba="changeScrollY",bh="_applyTableModel",a="End",bn="_applyKeepFirstVisibleRowComplete",B="widthChanged",C="one of one row",U="Home",b="_applyRowHeight",d="F2",K="appear",D="Up",E="%1 rows",I="qx.ui.table.selection.Model",W="one row",bq="PageDown",bp="%1 of %2 rows",Q="keypress",br="changeRowHeight",M="__vT",bl="Number",H="header",J="qx.ui.table.IRowRenderer",c="Right",S="Space";qx.Class.define(w,{extend:qx.ui.core.Widget,construct:function(bG,bH){qx.ui.core.Widget.call(this);if(!bH){bH={};}if(bH.initiallyHiddenColumns){this.setInitiallyHiddenColumns(bH.initiallyHiddenColumns);}if(bH.selectionManager){this.setNewSelectionManager(bH.selectionManager);}if(bH.selectionModel){this.setNewSelectionModel(bH.selectionModel);}if(bH.tableColumnModel){this.setNewTableColumnModel(bH.tableColumnModel);}if(bH.tablePane){this.setNewTablePane(bH.tablePane);}if(bH.tablePaneHeader){this.setNewTablePaneHeader(bH.tablePaneHeader);}if(bH.tablePaneScroller){this.setNewTablePaneScroller(bH.tablePaneScroller);}if(bH.tablePaneModel){this.setNewTablePaneModel(bH.tablePaneModel);}if(bH.columnMenu){this.setNewColumnMenu(bH.columnMenu);}this._setLayout(new qx.ui.layout.VBox());this.__vS=new qx.ui.container.Composite(new qx.ui.layout.HBox());this._add(this.__vS,{flex:1});this.setDataRowRenderer(new qx.ui.table.rowrenderer.Default(this));this.__vT=this.getNewSelectionManager()(this);this.setSelectionModel(this.getNewSelectionModel()(this));this.setTableModel(bG||this.getEmptyTableModel());this.setMetaColumnCounts([-1]);this.setTabIndex(1);this.addListener(Q,this._onKeyPress);this.addListener(t,this._onFocusChanged);this.addListener(bw,this._onFocusChanged);var bI=new qx.ui.core.Widget().set({height:0});this._add(bI);bI.addListener(bd,this._onResize,this);this.__vU=null;this.__vV=null;if(qx.core.Variant.isSet(bD,bz)){qx.locale.Manager.getInstance().addListener(bF,this._onChangeLocale,this);}this.initStatusBarVisible();bG=this.getTableModel();if(bG.init&&typeof (bG.init)==h){bG.init(this);}},events:{"columnVisibilityMenuCreateStart":m,"columnVisibilityMenuCreateEnd":m,"tableWidthChanged":z,"verticalScrollBarChanged":m,"cellClick":j,"cellDblclick":j,"cellContextmenu":j,"dataEdited":m},statics:{__vW:{cellClick:1,cellDblclick:1,cellContextmenu:1}},properties:{appearance:{refine:true,init:bc},focusable:{refine:true,init:true},minWidth:{refine:true,init:50},initiallyHiddenColumns:{init:null},selectable:{refine:true,init:false},selectionModel:{check:I,apply:L,event:X},tableModel:{check:bu,apply:bh,event:bo},rowHeight:{check:bl,init:20,apply:b,event:br},forceLineHeight:{check:p,init:true},headerCellsVisible:{check:p,init:true,apply:O},headerCellHeight:{check:bs,init:16,apply:bm,event:r,nullable:true},statusBarVisible:{check:p,init:true,apply:by},additionalStatusBarText:{nullable:true,init:null,apply:V},columnVisibilityButtonVisible:{check:p,init:true,apply:bi},metaColumnCounts:{check:bf,apply:s},focusCellOnMouseMove:{check:p,init:false,apply:Y},rowFocusChangeModifiesSelection:{check:p,init:true},showCellFocusIndicator:{check:p,init:true,apply:be},keepFirstVisibleRowComplete:{check:p,init:true,apply:bn},alwaysUpdateCells:{check:p,init:false},resetSelectionOnHeaderClick:{check:p,init:true,apply:v},dataRowRenderer:{check:J,init:null,nullable:true,event:q},modalCellEditorPreOpenFunction:{check:n,init:null,nullable:true},newColumnMenu:{check:n,init:function(){return new qx.ui.table.columnmenu.Button();}},newSelectionManager:{check:n,init:function(bJ){return new qx.ui.table.selection.Manager(bJ);}},newSelectionModel:{check:n,init:function(bK){return new qx.ui.table.selection.Model(bK);}},newTableColumnModel:{check:n,init:function(bL){return new qx.ui.table.columnmodel.Basic(bL);}},newTablePane:{check:n,init:function(bM){return new qx.ui.table.pane.Pane(bM);}},newTablePaneHeader:{check:n,init:function(bN){return new qx.ui.table.pane.Header(bN);}},newTablePaneScroller:{check:n,init:function(bO){return new qx.ui.table.pane.Scroller(bO);}},newTablePaneModel:{check:n,init:function(bP){return new qx.ui.table.pane.Model(bP);}}},members:{__vU:null,__vV:null,__vS:null,__vT:null,__vX:null,__vY:null,__wa:null,__wb:null,__wc:null,__wd:null,_createChildControlImpl:function(bQ,bR){var bS;switch(bQ){case k:bS=new qx.ui.basic.Label();bS.set({allowGrowX:true});this._add(bS);break;case o:bS=this.getNewColumnMenu()();bS.set({focusable:false});var bT=bS.factory(R,{table:this});bT.addListener(K,this._initColumnMenu,this);break;}return bS||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,bQ);},_applySelectionModel:function(bU,bV){this.__vT.setSelectionModel(bU);if(bV!=null){bV.removeListener(bE,this._onSelectionChanged,this);}bU.addListener(bE,this._onSelectionChanged,this);},_applyRowHeight:function(bW,bX){var bY=this._getPaneScrollerArr();for(var i=0;i<bY.length;i++){bY[i].updateVerScrollBarMaximum();}},_applyHeaderCellsVisible:function(ca,cb){var cc=this._getPaneScrollerArr();for(var i=0;i<cc.length;i++){cc[i]._excludeChildControl(H);}},_applyHeaderCellHeight:function(cd,ce){var cf=this._getPaneScrollerArr();for(var i=0;i<cf.length;i++){cf[i].getHeader().setHeight(cd);}},getEmptyTableModel:function(){if(!this.__wd){this.__wd=new qx.ui.table.model.Simple();this.__wd.setColumns([]);this.__wd.setData([]);}return this.__wd;},_applyTableModel:function(cg,ch){this.getTableColumnModel().init(cg.getColumnCount(),this);if(ch!=null){ch.removeListener(bA,this._onTableModelMetaDataChanged,this);ch.removeListener(f,this._onTableModelDataChanged,this);}cg.addListener(bA,this._onTableModelMetaDataChanged,this);cg.addListener(f,this._onTableModelDataChanged,this);this._updateStatusBar();this._updateTableData(0,cg.getRowCount(),0,cg.getColumnCount());this._onTableModelMetaDataChanged();if(ch&&cg.init&&typeof (cg.init)==h){cg.init(this);}},getTableColumnModel:function(){if(!this.__wc){var ck=this.__wc=this.getNewTableColumnModel()(this);ck.addListener(bv,this._onColVisibilityChanged,this);ck.addListener(B,this._onColWidthChanged,this);ck.addListener(bt,this._onColOrderChanged,this);var cj=this.getTableModel();ck.init(cj.getColumnCount(),this);var ci=this._getPaneScrollerArr();for(var i=0;i<ci.length;i++){var cl=ci[i];var cm=cl.getTablePaneModel();cm.setTableColumnModel(ck);}}return this.__wc;},_applyStatusBarVisible:function(cn,co){if(cn){this._showChildControl(k);}else{this._excludeChildControl(k);}if(cn){this._updateStatusBar();}},_applyAdditionalStatusBarText:function(cp,cq){this.__vX=cp;this._updateStatusBar();},_applyColumnVisibilityButtonVisible:function(cr,cs){if(cr){this._showChildControl(o);}else{this._excludeChildControl(o);}},_applyMetaColumnCounts:function(ct,cu){var cB=ct;var cv=this._getPaneScrollerArr();var cz={};if(ct>cu){var cD=qx.event.Registration.getManager(cv[0]);for(var cE in qx.ui.table.Table.__vW){cz[cE]={};cz[cE].capture=cD.getListeners(cv[0],cE,true);cz[cE].bubble=cD.getListeners(cv[0],cE,false);}}this._cleanUpMetaColumns(cB.length);var cA=0;for(var i=0;i<cv.length;i++){var cF=cv[i];var cC=cF.getTablePaneModel();cC.setFirstColumnX(cA);cC.setMaxColumnCount(cB[i]);cA+=cB[i];}if(cB.length>cv.length){var cy=this.getTableColumnModel();for(var i=cv.length;i<cB.length;i++){var cC=this.getNewTablePaneModel()(cy);cC.setFirstColumnX(cA);cC.setMaxColumnCount(cB[i]);cA+=cB[i];var cF=this.getNewTablePaneScroller()(this);cF.setTablePaneModel(cC);cF.addListener(ba,this._onScrollY,this);for(cE in qx.ui.table.Table.__vW){if(!cz[cE]){break;}if(cz[cE].capture&&cz[cE].capture.length>0){var cw=cz[cE].capture;for(var i=0;i<cw.length;i++){var cx=cw[i].context;if(!cx){cx=this;}else if(cx==cv[0]){cx=cF;}cF.addListener(cE,cw[i].handler,cx,true);}}if(cz[cE].bubble&&cz[cE].bubble.length>0){var cH=cz[cE].bubble;for(var i=0;i<cH.length;i++){var cx=cH[i].context;if(!cx){cx=this;}else if(cx==cv[0]){cx=cF;}cF.addListener(cE,cH[i].handler,cx,false);}}}var cG=(i==cB.length-1)?1:0;this.__vS.add(cF,{flex:cG});cv=this._getPaneScrollerArr();}}for(var i=0;i<cv.length;i++){var cF=cv[i];var cI=(i==(cv.length-1));cF.getHeader().setHeight(this.getHeaderCellHeight());cF.setTopRightWidget(cI?this.getChildControl(o):null);}if(!this.isColumnVisibilityButtonVisible()){this._excludeChildControl(o);}this._updateScrollerWidths();this._updateScrollBarVisibility();},_applyFocusCellOnMouseMove:function(cJ,cK){var cL=this._getPaneScrollerArr();for(var i=0;i<cL.length;i++){cL[i].setFocusCellOnMouseMove(cJ);}},_applyShowCellFocusIndicator:function(cM,cN){var cO=this._getPaneScrollerArr();for(var i=0;i<cO.length;i++){cO[i].setShowCellFocusIndicator(cM);}},_applyKeepFirstVisibleRowComplete:function(cP,cQ){var cR=this._getPaneScrollerArr();for(var i=0;i<cR.length;i++){cR[i].onKeepFirstVisibleRowCompleteChanged();}},_applyResetSelectionOnHeaderClick:function(cS,cT){var cU=this._getPaneScrollerArr();for(var i=0;i<cU.length;i++){cU[i].setResetSelectionOnHeaderClick(cS);}},getSelectionManager:function(){return this.__vT;},_getPaneScrollerArr:function(){return this.__vS.getChildren();},getPaneScroller:function(cV){return this._getPaneScrollerArr()[cV];},_cleanUpMetaColumns:function(cW){var cX=this._getPaneScrollerArr();if(cX!=null){for(var i=cX.length-1;i>=cW;i--){cX[i].destroy();}}},_onChangeLocale:function(cY){this.updateContent();this._updateStatusBar();},_onSelectionChanged:function(da){var db=this._getPaneScrollerArr();for(var i=0;i<db.length;i++){db[i].onSelectionChanged();}this._updateStatusBar();},_onTableModelMetaDataChanged:function(dc){var dd=this._getPaneScrollerArr();for(var i=0;i<dd.length;i++){dd[i].onTableModelMetaDataChanged();}this._updateStatusBar();},_onTableModelDataChanged:function(de){var df=de.getData();this._updateTableData(df.firstRow,df.lastRow,df.firstColumn,df.lastColumn,df.removeStart,df.removeCount);},_updateTableData:function(dg,dh,di,dj,dk,dl){var dm=this._getPaneScrollerArr();if(dl){this.getSelectionModel().removeSelectionInterval(dk,dk+dl);if(this.__vV>=dk&&this.__vV<(dk+dl)){this.setFocusedCell();}}for(var i=0;i<dm.length;i++){dm[i].onTableModelDataChanged(dg,dh,di,dj);}var dn=this.getTableModel().getRowCount();if(dn!=this.__vY){this.__vY=dn;this._updateScrollBarVisibility();this._updateStatusBar();}},_onScrollY:function(dp){if(!this.__wa){this.__wa=true;var dq=this._getPaneScrollerArr();for(var i=0;i<dq.length;i++){dq[i].setScrollY(dp.getData());}this.__wa=false;}},_onKeyPress:function(dr){if(!this.getEnabled()){return;}var dy=this.__vV;var dv=true;var dz=dr.getKeyIdentifier();if(this.isEditing()){if(dr.getModifiers()==0){switch(dz){case bB:this.stopEditing();var dy=this.__vV;this.moveFocusedCell(0,1);if(this.__vV!=dy){dv=this.startEditing();}break;case F:this.cancelEditing();this.focus();break;default:dv=false;break;}}}else{if(dr.isCtrlPressed()){dv=true;switch(dz){case G:var dw=this.getTableModel().getRowCount();if(dw>0){this.getSelectionModel().setSelectionInterval(0,dw-1);}break;default:dv=false;break;}}else{switch(dz){case S:this.__vT.handleSelectKeyDown(this.__vV,dr);break;case d:case bB:this.startEditing();dv=true;break;case U:this.setFocusedCell(this.__vU,0,true);break;case a:var dw=this.getTableModel().getRowCount();this.setFocusedCell(this.__vU,dw-1,true);break;case T:this.moveFocusedCell(-1,0);break;case c:this.moveFocusedCell(1,0);break;case D:this.moveFocusedCell(0,-1);break;case bb:this.moveFocusedCell(0,1);break;case g:case bq:var du=this.getPaneScroller(0);var dx=du.getTablePane();var dt=this.getRowHeight();var ds=(dz==g)?-1:1;dw=dx.getVisibleRowCount()-1;du.setScrollY(du.getScrollY()+ds*dw*dt);this.moveFocusedCell(0,ds*dw);break;default:dv=false;}}}if(dy!=this.__vV&&this.getRowFocusChangeModifiesSelection()){this.__vT.handleMoveKeyDown(this.__vV,dr);}if(dv){dr.preventDefault();dr.stopPropagation();}},_onFocusChanged:function(dA){var dB=this._getPaneScrollerArr();for(var i=0;i<dB.length;i++){dB[i].onFocusChanged();}},_onColVisibilityChanged:function(dC){var dD=this._getPaneScrollerArr();for(var i=0;i<dD.length;i++){dD[i].onColVisibilityChanged();}var dE=dC.getData();if(this.__wb!=null&&dE.col!=null&&dE.visible!=null){this.__wb[dE.col].setVisible(dE.visible);}this._updateScrollerWidths();this._updateScrollBarVisibility();},_onColWidthChanged:function(dF){var dG=this._getPaneScrollerArr();for(var i=0;i<dG.length;i++){var dH=dF.getData();dG[i].setColumnWidth(dH.col,dH.newWidth);}this._updateScrollerWidths();this._updateScrollBarVisibility();},_onColOrderChanged:function(dI){var dJ=this._getPaneScrollerArr();for(var i=0;i<dJ.length;i++){dJ[i].onColOrderChanged();}this._updateScrollerWidths();this._updateScrollBarVisibility();},getTablePaneScrollerAtPageX:function(dK){var dL=this._getMetaColumnAtPageX(dK);return (dL!=-1)?this.getPaneScroller(dL):null;},setFocusedCell:function(dM,dN,dO){if(!this.isEditing()&&(dM!=this.__vU||dN!=this.__vV)){if(dM===null){dM=0;}this.__vU=dM;this.__vV=dN;var dP=this._getPaneScrollerArr();for(var i=0;i<dP.length;i++){dP[i].setFocusedCell(dM,dN);}if(dM!==null&&dO){this.scrollCellVisible(dM,dN);}}},resetSelection:function(){this.getSelectionModel().resetSelection();},resetCellFocus:function(){this.setFocusedCell(null,null,false);},getFocusedColumn:function(){return this.__vU;},getFocusedRow:function(){return this.__vV;},highlightFocusedRow:function(dQ){this.getDataRowRenderer().setHighlightFocusRow(dQ);},clearFocusedRowHighlight:function(dR){if(dR){var dT=dR.getRelatedTarget();if(dT instanceof qx.ui.table.pane.Pane||dT instanceof qx.ui.table.pane.FocusIndicator){return;}}this.resetCellFocus();var dS=this._getPaneScrollerArr();for(var i=0;i<dS.length;i++){dS[i].onFocusChanged();}},moveFocusedCell:function(dU,dV){var ea=this.__vU;var eb=this.__vV;if(ea===null||eb===null){return;}if(dU!=0){var dY=this.getTableColumnModel();var x=dY.getVisibleX(ea);var dX=dY.getVisibleColumnCount();x=qx.lang.Number.limit(x+dU,0,dX-1);ea=dY.getVisibleColumnAtX(x);}if(dV!=0){var dW=this.getTableModel();eb=qx.lang.Number.limit(eb+dV,0,dW.getRowCount()-1);}this.setFocusedCell(ea,eb,true);},scrollCellVisible:function(ec,ed){var ee=this.getTableColumnModel();var x=ee.getVisibleX(ec);var ef=this._getMetaColumnAtColumnX(x);if(ef!=-1){this.getPaneScroller(ef).scrollCellVisible(ec,ed);}},isEditing:function(){if(this.__vU!=null){var x=this.getTableColumnModel().getVisibleX(this.__vU);var eg=this._getMetaColumnAtColumnX(x);return this.getPaneScroller(eg).isEditing();}return false;},startEditing:function(){if(this.__vU!=null){var x=this.getTableColumnModel().getVisibleX(this.__vU);var ei=this._getMetaColumnAtColumnX(x);var eh=this.getPaneScroller(ei).startEditing();return eh;}return false;},stopEditing:function(){if(this.__vU!=null){var x=this.getTableColumnModel().getVisibleX(this.__vU);var ej=this._getMetaColumnAtColumnX(x);this.getPaneScroller(ej).stopEditing();}},cancelEditing:function(){if(this.__vU!=null){var x=this.getTableColumnModel().getVisibleX(this.__vU);var ek=this._getMetaColumnAtColumnX(x);this.getPaneScroller(ek).cancelEditing();}},updateContent:function(){var el=this._getPaneScrollerArr();for(var i=0;i<el.length;i++){el[i].getTablePane().updateContent(true);}},blockHeaderElements:function(){var em=this._getPaneScrollerArr();for(var i=0;i<em.length;i++){em[i].getHeader().getBlocker().blockContent(20);}this.getChildControl(o).getBlocker().blockContent(20);},unblockHeaderElements:function(){var en=this._getPaneScrollerArr();for(var i=0;i<en.length;i++){en[i].getHeader().getBlocker().unblockContent();}this.getChildControl(o).getBlocker().unblockContent();},_getMetaColumnAtPageX:function(eo){var ep=this._getPaneScrollerArr();for(var i=0;i<ep.length;i++){var eq=ep[i].getContainerLocation();if(eo>=eq.left&&eo<=eq.right){return i;}}return -1;},_getMetaColumnAtColumnX:function(er){var et=this.getMetaColumnCounts();var eu=0;for(var i=0;i<et.length;i++){var es=et[i];eu+=es;if(es==-1||er<eu){return i;}}return -1;},_updateStatusBar:function(){var ev=this.getTableModel();if(this.getStatusBarVisible()){var ew=this.getSelectionModel().getSelectedCount();var ey=ev.getRowCount();var ex;if(ey>=0){if(ew==0){ex=this.trn(W,E,ey,ey);}else{ex=this.trn(C,bp,ey,ew,ey);}}if(this.__vX){if(ex){ex+=this.__vX;}else{ex=this.__vX;}}if(ex){this.getChildControl(k).setValue(ex);}}},_updateScrollerWidths:function(){var ez=this._getPaneScrollerArr();for(var i=0;i<ez.length;i++){var eB=(i==(ez.length-1));var eC=ez[i].getTablePaneModel().getTotalWidth();ez[i].setPaneWidth(eC);var eA=eB?1:0;ez[i].setLayoutProperties({flex:eA});}},_updateScrollBarVisibility:function(){if(!this.getBounds()){return;}var eG=qx.ui.table.pane.Scroller.HORIZONTAL_SCROLLBAR;var eJ=qx.ui.table.pane.Scroller.VERTICAL_SCROLLBAR;var eD=this._getPaneScrollerArr();var eF=false;var eI=false;for(var i=0;i<eD.length;i++){var eK=(i==(eD.length-1));var eE=eD[i].getNeededScrollBars(eF,!eK);if(eE&eG){eF=true;}if(eK&&(eE&eJ)){eI=true;}}for(var i=0;i<eD.length;i++){var eK=(i==(eD.length-1));var eH;eD[i].setHorizontalScrollBarVisible(eF);if(eK){eH=eD[i].getVerticalScrollBarVisible();}eD[i].setVerticalScrollBarVisible(eK&&eI);if(eK&&eI!=eH){this.fireDataEvent(bk,eI);}}},_initColumnMenu:function(){var eN=this.getTableModel();var eO=this.getTableColumnModel();var eP=this.getChildControl(o);eP.empty();var eM=eP.getMenu();var eQ={table:this,menu:eM,columnButton:eP};this.fireDataEvent(bx,eQ);this.__wb={};for(var eR=0,l=eN.getColumnCount();eR<l;eR++){var eL=eP.factory(P,{text:eN.getColumnName(eR),column:eR,bVisible:eO.isColumnVisible(eR)});qx.core.Assert.assertInterface(eL,qx.ui.table.IColumnMenuItem);eL.addListener(u,this._createColumnVisibilityCheckBoxHandler(eR),this);this.__wb[eR]=eL;}eQ={table:this,menu:eM,columnButton:eP};this.fireDataEvent(y,eQ);},_createColumnVisibilityCheckBoxHandler:function(eS){return function(eT){var eU=this.getTableColumnModel();eU.setColumnVisible(eS,eT.getData());};},setColumnWidth:function(eV,eW){this.getTableColumnModel().setColumnWidth(eV,eW);},_onResize:function(){this.fireEvent(A);this._updateScrollerWidths();this._updateScrollBarVisibility();},addListener:function(eX,eY,self,fa){if(this.self(arguments).__vW[eX]){var fc=[eX];for(var i=0,fb=this._getPaneScrollerArr();i<fb.length;i++){fc.push(fb[i].addListener.apply(fb[i],arguments));}return fc.join(e);}else{return qx.ui.core.Widget.prototype.addListener.call(this,eX,eY,self,fa);}},removeListener:function(fd,fe,self,ff){if(this.self(arguments).__vW[fd]){for(var i=0,fg=this._getPaneScrollerArr();i<fg.length;i++){fg[i].removeListener.apply(fg[i],arguments);}}else{qx.ui.core.Widget.prototype.removeListener.call(this,fd,fe,self,ff);}},removeListenerById:function(fh){var fl=fh.split(e);var fk=fl.shift();if(this.self(arguments).__vW[fk]){var fj=true;for(var i=0,fi=this._getPaneScrollerArr();i<fi.length;i++){fj=fi[i].removeListenerById.call(fi[i],fl[i])&&fj;}return fj;}else{return qx.ui.core.Widget.prototype.removeListenerById.call(this,fh);}},destroy:function(){this.getChildControl(o).getMenu().destroy();qx.ui.core.Widget.prototype.destroy.call(this);}},destruct:function(){if(qx.core.Variant.isSet(bD,bz)){qx.locale.Manager.getInstance().removeListener(bF,this._onChangeLocale,this);}var fn=this.getSelectionModel();if(fn){fn.dispose();}var fm=this.getDataRowRenderer();if(fm){fm.dispose();}this._cleanUpMetaColumns(0);this.getTableColumnModel().dispose();this._disposeObjects(M,bg,bC,bC,bj);this._disposeMap(N);}});})();(function(){var a="qx.ui.table.IRowRenderer";qx.Interface.define(a,{members:{updateDataRowElement:function(b,c){},getRowHeightStyle:function(d){},createRowStyle:function(e){},getRowClass:function(f){}}});})();(function(){var t="",s="table-row-background-even",r="table-row-background-selected",q="table-row",p="background-color:",o="table-row-background-focused",n=';border-bottom: 1px solid ',m=';color:',l="table-row-selected",k="table-row-background-odd",d="default",j="table-row-background-focused-selected",g="qx.ui.table.rowrenderer.Default",c="table-row-line",b="'",f="height:",e=";",h="px;",a="1px solid ",i="Boolean";qx.Class.define(g,{extend:qx.core.Object,implement:qx.ui.table.IRowRenderer,construct:function(){qx.core.Object.call(this);this.__wi=t;this.__wi={};this.__wj={};this._renderFont(qx.theme.manager.Font.getInstance().resolve(d));var u=qx.theme.manager.Color.getInstance();this.__wj.bgcolFocusedSelected=u.resolve(j);this.__wj.bgcolFocused=u.resolve(o);this.__wj.bgcolSelected=u.resolve(r);this.__wj.bgcolEven=u.resolve(s);this.__wj.bgcolOdd=u.resolve(k);this.__wj.colSelected=u.resolve(l);this.__wj.colNormal=u.resolve(q);this.__wj.horLine=u.resolve(c);},properties:{highlightFocusRow:{check:i,init:true}},members:{__wj:null,__wk:null,__wi:null,_insetY:1,_renderFont:function(v){if(v){this.__wk=v.getStyles();this.__wi=qx.bom.element.Style.compile(this.__wk);this.__wi=this.__wi.replace(/"/g,b);}else{this.__wi=t;this.__wk=qx.bom.Font.getDefaultStyles();}},updateDataRowElement:function(w,x){var z=this.__wk;var y=x.style;qx.bom.element.Style.setStyles(x,z);if(w.focusedRow&&this.getHighlightFocusRow()){y.backgroundColor=w.selected?this.__wj.bgcolFocusedSelected:this.__wj.bgcolFocused;}else{if(w.selected){y.backgroundColor=this.__wj.bgcolSelected;}else{y.backgroundColor=(w.row%2==0)?this.__wj.bgcolEven:this.__wj.bgcolOdd;}}y.color=w.selected?this.__wj.colSelected:this.__wj.colNormal;y.borderBottom=a+this.__wj.horLine;},getRowHeightStyle:function(A){if(qx.bom.client.Feature.CONTENT_BOX){A-=this._insetY;}return f+A+h;},createRowStyle:function(B){var C=[];C.push(e);C.push(this.__wi);C.push(p);if(B.focusedRow&&this.getHighlightFocusRow()){C.push(B.selected?this.__wj.bgcolFocusedSelected:this.__wj.bgcolFocused);}else{if(B.selected){C.push(this.__wj.bgcolSelected);}else{C.push((B.row%2==0)?this.__wj.bgcolEven:this.__wj.bgcolOdd);}}C.push(m);C.push(B.selected?this.__wj.colSelected:this.__wj.colNormal);C.push(n,this.__wj.horLine);return C.join(t);},getRowClass:function(D){return t;},getRowAttributes:function(E){return t;}},destruct:function(){this.__wj=this.__wk=this.__wi=null;}});})();(function(){var a="qx.ui.table.IColumnMenuButton";qx.Interface.define(a,{properties:{menu:{}},members:{factory:function(b,c){return true;},empty:function(){return true;}}});})();(function(){var l="pressed",k="hovered",j="changeVisibility",i="qx.ui.menu.Menu",h="submenu",g="Enter",f="contextmenu",d="changeMenu",c="qx.ui.form.MenuButton",b="abandoned",a="_applyMenu";qx.Class.define(c,{extend:qx.ui.form.Button,construct:function(m,n,o){qx.ui.form.Button.call(this,m,n);if(o!=null){this.setMenu(o);}},properties:{menu:{check:i,nullable:true,apply:a,event:d}},members:{_applyMenu:function(p,q){if(q){q.removeListener(j,this._onMenuChange,this);q.resetOpener();}if(p){p.addListener(j,this._onMenuChange,this);p.setOpener(this);p.removeState(h);p.removeState(f);}},open:function(r){var s=this.getMenu();if(s){qx.ui.menu.Manager.getInstance().hideAll();s.setOpener(this);s.open();if(r){var t=s.getSelectables()[0];if(t){s.setSelectedButton(t);}}}},_onMenuChange:function(e){var u=this.getMenu();if(u.isVisible()){this.addState(l);}else{this.removeState(l);}},_onMouseDown:function(e){qx.ui.form.Button.prototype._onMouseDown.call(this,e);var v=this.getMenu();if(v){if(!v.isVisible()){this.open();}else{v.exclude();}e.stopPropagation();}},_onMouseUp:function(e){qx.ui.form.Button.prototype._onMouseUp.call(this,e);e.stopPropagation();},_onMouseOver:function(e){this.addState(k);},_onMouseOut:function(e){this.removeState(k);},_onKeyDown:function(e){switch(e.getKeyIdentifier()){case g:this.removeState(b);this.addState(l);var w=this.getMenu();if(w){if(!w.isVisible()){this.open();}else{w.exclude();}}e.stopPropagation();}},_onKeyUp:function(e){}},destruct:function(){if(this.getMenu()){if(!qx.core.ObjectRegistry.inShutDown){this.getMenu().destroy();}}}});})();(function(){var f="menu-button",e="table-column-reset-button",d="separator",c="user-button",b="qx.ui.table.columnmenu.Button",a="menu";qx.Class.define(b,{extend:qx.ui.form.MenuButton,implement:qx.ui.table.IColumnMenuButton,construct:function(){qx.ui.form.MenuButton.call(this);this.__wl=new qx.ui.core.Blocker(this);},members:{__wm:null,__wl:null,factory:function(g,h){switch(g){case a:var j=new qx.ui.menu.Menu();this.setMenu(j);return j;case f:var m=new qx.ui.table.columnmenu.MenuItem(h.text);m.setVisible(h.bVisible);this.getMenu().add(m);return m;case c:var k=new qx.ui.menu.Button(h.text);k.set({appearance:e});return k;case d:return new qx.ui.menu.Separator();default:throw new Error("Unrecognized factory request: "+g);}},getBlocker:function(){return this.__wl;},empty:function(){var n=this.getMenu();var o=n.getChildren();for(var i=0,l=o.length;i<l;i++){o[0].destroy();}}},destruct:function(){this.__wl.dispose();}});})();(function(){var t="keypress",s="interval",r="keydown",q="mousedown",p="keyup",o="__on",n="blur",m="Enter",l="__oo",k="Up",c="Escape",j="qx.ui.menu.Manager",g="Left",b="__om",a="Down",f="Right",d="singleton",h="Space";qx.Class.define(j,{type:d,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__om=[];var u=document.body;var v=qx.event.Registration;v.addListener(window.document.documentElement,q,this._onMouseDown,this,true);v.addListener(u,r,this._onKeyUpDown,this,true);v.addListener(u,p,this._onKeyUpDown,this,true);v.addListener(u,t,this._onKeyPress,this,true);if(!qx.bom.client.Feature.TOUCH){qx.bom.Element.addListener(window,n,this.hideAll,this);}this.__on=new qx.event.Timer;this.__on.addListener(s,this._onOpenInterval,this);this.__oo=new qx.event.Timer;this.__oo.addListener(s,this._onCloseInterval,this);},members:{__op:null,__oq:null,__on:null,__oo:null,__om:null,_getChild:function(w,x,y,z){var A=w.getChildren();var length=A.length;var B;for(var i=x;i<length&&i>=0;i+=y){B=A[i];if(B.isEnabled()&&!B.isAnonymous()){return B;}}if(z){i=i==length?0:length-1;for(;i!=x;i+=y){B=A[i];if(B.isEnabled()&&!B.isAnonymous()){return B;}}}return null;},_isInMenu:function(C){while(C){if(C instanceof qx.ui.menu.Menu){return true;}C=C.getLayoutParent();}return false;},_getMenuButton:function(D){while(D){if(D instanceof qx.ui.menu.AbstractButton){return D;}D=D.getLayoutParent();}return null;},add:function(E){{};var F=this.__om;F.push(E);E.setZIndex(1e6+F.length);},remove:function(G){{};var H=this.__om;if(H){qx.lang.Array.remove(H,G);}},hideAll:function(){var I=this.__om;if(I){for(var i=I.length-1;i>=0;i--){I[i].exclude();}}},getActiveMenu:function(){var J=this.__om;return J.length>0?J[J.length-1]:null;},scheduleOpen:function(K){this.cancelClose(K);if(K.isVisible()){if(this.__op){this.cancelOpen(this.__op);}}else if(this.__op!=K){this.__op=K;this.__on.restartWith(K.getOpenInterval());}},scheduleClose:function(L){this.cancelOpen(L);if(!L.isVisible()){if(this.__oq){this.cancelClose(this.__oq);}}else if(this.__oq!=L){this.__oq=L;this.__oo.restartWith(L.getCloseInterval());}},cancelOpen:function(M){if(this.__op==M){this.__on.stop();this.__op=null;}},cancelClose:function(N){if(this.__oq==N){this.__oo.stop();this.__oq=null;}},_onOpenInterval:function(e){this.__on.stop();this.__op.open();this.__op=null;},_onCloseInterval:function(e){this.__oo.stop();this.__oq.exclude();this.__oq=null;},_onMouseDown:function(e){var O=e.getTarget();O=qx.ui.core.Widget.getWidgetByElement(O,true);if(O==null){this.hideAll();return;}if(O.getMenu&&O.getMenu()&&O.getMenu().isVisible()){return;}if(this.__om.length>0&&!this._isInMenu(O)){this.hideAll();}},__or:{"Enter":1,"Space":1},__os:{"Escape":1,"Up":1,"Down":1,"Left":1,"Right":1},_onKeyUpDown:function(e){var P=this.getActiveMenu();if(!P){return;}var Q=e.getKeyIdentifier();if(this.__os[Q]||(this.__or[Q]&&P.getSelectedButton())){e.stopPropagation();}},_onKeyPress:function(e){var R=this.getActiveMenu();if(!R){return;}var S=e.getKeyIdentifier();var U=this.__os[S];var T=this.__or[S];if(U){switch(S){case k:this._onKeyPressUp(R);break;case a:this._onKeyPressDown(R);break;case g:this._onKeyPressLeft(R);break;case f:this._onKeyPressRight(R);break;case c:this.hideAll();break;}e.stopPropagation();e.preventDefault();}else if(T){var V=R.getSelectedButton();if(V){switch(S){case m:this._onKeyPressEnter(R,V,e);break;case h:this._onKeyPressSpace(R,V,e);break;}e.stopPropagation();e.preventDefault();}}},_onKeyPressUp:function(W){var X=W.getSelectedButton();var Y=W.getChildren();var bb=X?W.indexOf(X)-1:Y.length-1;var ba=this._getChild(W,bb,-1,true);if(ba){W.setSelectedButton(ba);}else{W.resetSelectedButton();}},_onKeyPressDown:function(bc){var bd=bc.getSelectedButton();var bf=bd?bc.indexOf(bd)+1:0;var be=this._getChild(bc,bf,1,true);if(be){bc.setSelectedButton(be);}else{bc.resetSelectedButton();}},_onKeyPressLeft:function(bg){var bl=bg.getOpener();if(!bl){return;}if(bl instanceof qx.ui.menu.AbstractButton){var bi=bl.getLayoutParent();bi.resetOpenedButton();bi.setSelectedButton(bl);}else if(bl instanceof qx.ui.menubar.Button){var bk=bl.getMenuBar().getMenuButtons();var bh=bk.indexOf(bl);if(bh===-1){return;}var bm=null;var length=bk.length;for(var i=1;i<=length;i++){var bj=bk[(bh-i+length)%length];if(bj.isEnabled()){bm=bj;break;}}if(bm&&bm!=bl){bm.open(true);}}},_onKeyPressRight:function(bn){var bp=bn.getSelectedButton();if(bp){var bo=bp.getMenu();if(bo){bn.setOpenedButton(bp);var bv=this._getChild(bo,0,1);if(bv){bo.setSelectedButton(bv);}return;}}else if(!bn.getOpenedButton()){var bv=this._getChild(bn,0,1);if(bv){bn.setSelectedButton(bv);if(bv.getMenu()){bn.setOpenedButton(bv);}return;}}var bt=bn.getOpener();if(bt instanceof qx.ui.menu.Button&&bp){while(bt){bt=bt.getLayoutParent();if(bt instanceof qx.ui.menu.Menu){bt=bt.getOpener();if(bt instanceof qx.ui.menubar.Button){break;}}else{break;}}if(!bt){return;}}if(bt instanceof qx.ui.menubar.Button){var bs=bt.getMenuBar().getMenuButtons();var bq=bs.indexOf(bt);if(bq===-1){return;}var bu=null;var length=bs.length;for(var i=1;i<=length;i++){var br=bs[(bq+i)%length];if(br.isEnabled()){bu=br;break;}}if(bu&&bu!=bt){bu.open(true);}}},_onKeyPressEnter:function(bw,bx,e){if(bx.hasListener(t)){var by=e.clone();by.setBubbles(false);by.setTarget(bx);bx.dispatchEvent(by);}this.hideAll();},_onKeyPressSpace:function(bz,bA,e){if(bA.hasListener(t)){var bB=e.clone();bB.setBubbles(false);bB.setTarget(bA);bA.dispatchEvent(bB);}}},destruct:function(){var bD=qx.event.Registration;var bC=document.body;bD.removeListener(window.document.documentElement,q,this._onMouseDown,this,true);bD.removeListener(bC,r,this._onKeyUpDown,this,true);bD.removeListener(bC,p,this._onKeyUpDown,this,true);bD.removeListener(bC,t,this._onKeyPress,this,true);this._disposeObjects(o,l);this._disposeArray(b);}});})();(function(){var l="indexOf",k="addAfter",j="add",i="addBefore",h="_",g="addAt",f="hasChildren",e="removeAt",d="removeAll",c="getChildren",a="remove",b="qx.ui.core.MRemoteChildrenHandling";qx.Mixin.define(b,{members:{__ex:function(m,n,o,p){var q=this.getChildrenContainer();if(q===this){m=h+m;}return (q[m])(n,o,p);},getChildren:function(){return this.__ex(c);},hasChildren:function(){return this.__ex(f);},add:function(r,s){return this.__ex(j,r,s);},remove:function(t){return this.__ex(a,t);},removeAll:function(){return this.__ex(d);},indexOf:function(u){return this.__ex(l,u);},addAt:function(v,w,x){this.__ex(g,v,w,x);},addBefore:function(y,z,A){this.__ex(i,y,z,A);},addAfter:function(B,C,D){this.__ex(k,B,C,D);},removeAt:function(E){this.__ex(e,E);}}});})();(function(){var l="slidebar",k="Integer",j="resize",h="qx.ui.core.Widget",g="selected",f="visible",d="Boolean",c="mouseout",b="excluded",a="menu",A="_applySelectedButton",z="_applyOpenInterval",y="_applySpacingY",x="_blocker",w="_applyCloseInterval",v="_applyBlockerColor",u="_applyIconColumnWidth",t="mouseover",s="qx.ui.menu.Menu",r="Color",p="Number",q="_applyOpenedButton",n="_applySpacingX",o="_applyBlockerOpacity",m="_applyArrowColumnWidth";qx.Class.define(s,{extend:qx.ui.core.Widget,include:[qx.ui.core.MPlacement,qx.ui.core.MRemoteChildrenHandling],construct:function(){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.menu.Layout);var B=this.getApplicationRoot();B.add(this);this.addListener(t,this._onMouseOver);this.addListener(c,this._onMouseOut);this.addListener(j,this._onResize,this);B.addListener(j,this._onResize,this);this._blocker=new qx.ui.core.Blocker(B);this.initVisibility();this.initKeepFocus();this.initKeepActive();},properties:{appearance:{refine:true,init:a},allowGrowX:{refine:true,init:false},allowGrowY:{refine:true,init:false},visibility:{refine:true,init:b},keepFocus:{refine:true,init:true},keepActive:{refine:true,init:true},spacingX:{check:k,apply:n,init:0,themeable:true},spacingY:{check:k,apply:y,init:0,themeable:true},iconColumnWidth:{check:k,init:0,themeable:true,apply:u},arrowColumnWidth:{check:k,init:0,themeable:true,apply:m},blockerColor:{check:r,init:null,nullable:true,apply:v,themeable:true},blockerOpacity:{check:p,init:1,apply:o,themeable:true},selectedButton:{check:h,nullable:true,apply:A},openedButton:{check:h,nullable:true,apply:q},opener:{check:h,nullable:true},openInterval:{check:k,themeable:true,init:250,apply:z},closeInterval:{check:k,themeable:true,init:250,apply:w},blockBackground:{check:d,themeable:true,init:false}},members:{__qv:null,__qw:null,_blocker:null,open:function(){if(this.getOpener()!=null){this.placeToWidget(this.getOpener());this.__qy();this.show();this._placementTarget=this.getOpener();}else{this.warn("The menu instance needs a configured 'opener' widget!");}},openAtMouse:function(e){this.placeToMouse(e);this.__qy();this.show();this._placementTarget={left:e.getDocumentLeft(),top:e.getDocumentTop()};},openAtPoint:function(C){this.placeToPoint(C);this.__qy();this.show();this._placementTarget=C;},addSeparator:function(){this.add(new qx.ui.menu.Separator);},getColumnSizes:function(){return this._getMenuLayout().getColumnSizes();},getSelectables:function(){var D=[];var E=this.getChildren();for(var i=0;i<E.length;i++){if(E[i].isEnabled()){D.push(E[i]);}}return D;},_applyIconColumnWidth:function(F,G){this._getMenuLayout().setIconColumnWidth(F);},_applyArrowColumnWidth:function(H,I){this._getMenuLayout().setArrowColumnWidth(H);},_applySpacingX:function(J,K){this._getMenuLayout().setColumnSpacing(J);},_applySpacingY:function(L,M){this._getMenuLayout().setSpacing(L);},_applyVisibility:function(N,O){qx.ui.core.Widget.prototype._applyVisibility.call(this,N,O);var P=qx.ui.menu.Manager.getInstance();if(N===f){P.add(this);var Q=this.getParentMenu();if(Q){Q.setOpenedButton(this.getOpener());}}else if(O===f){P.remove(this);var Q=this.getParentMenu();if(Q&&Q.getOpenedButton()==this.getOpener()){Q.resetOpenedButton();}this.resetOpenedButton();this.resetSelectedButton();}this.__qx();},__qx:function(){if(this.isVisible()){if(this.getBlockBackground()){var R=this.getZIndex();this._blocker.blockContent(R-1);}}else{if(this._blocker.isContentBlocked()){this._blocker.unblockContent();}}},getParentMenu:function(){var S=this.getOpener();if(!S||!(S instanceof qx.ui.menu.AbstractButton)){return null;}while(S&&!(S instanceof qx.ui.menu.Menu)){S=S.getLayoutParent();}return S;},_applySelectedButton:function(T,U){if(U){U.removeState(g);}if(T){T.addState(g);}},_applyOpenedButton:function(V,W){if(W){W.getMenu().exclude();}if(V){V.getMenu().open();}},_applyBlockerColor:function(X,Y){this._blocker.setColor(X);},_applyBlockerOpacity:function(ba,bb){this._blocker.setOpacity(ba);},getChildrenContainer:function(){return this.getChildControl(l,true)||this;},_createChildControlImpl:function(bc,bd){var be;switch(bc){case l:var be=new qx.ui.menu.MenuSlideBar();var bg=this._getLayout();this._setLayout(new qx.ui.layout.Grow());var bf=be.getLayout();be.setLayout(bg);bf.dispose();var bh=qx.lang.Array.clone(this.getChildren());for(var i=0;i<bh.length;i++){be.add(bh[i]);}this.removeListener(j,this._onResize,this);be.getChildrenContainer().addListener(j,this._onResize,this);this._add(be);break;}return be||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,bc);},_getMenuLayout:function(){if(this.hasChildControl(l)){return this.getChildControl(l).getChildrenContainer().getLayout();}else{return this._getLayout();}},_getMenuBounds:function(){if(this.hasChildControl(l)){return this.getChildControl(l).getChildrenContainer().getBounds();}else{return this.getBounds();}},_computePlacementSize:function(){return this._getMenuBounds();},__qy:function(){var bj=this._getMenuBounds();if(!bj){this.addListenerOnce(j,this.__qy,this);return;}var bi=this.getLayoutParent().getBounds().height;var top=this.getLayoutProperties().top;var bk=this.getLayoutProperties().left;if(top<0){this._assertSlideBar(function(){this.setHeight(bj.height+top);this.moveTo(bk,0);});}else if(top+bj.height>bi){this._assertSlideBar(function(){this.setHeight(bi-top);});}else{this.setHeight(null);}},_assertSlideBar:function(bl){if(this.hasChildControl(l)){return bl.call(this);}this.__qw=bl;qx.ui.core.queue.Widget.add(this);},syncWidget:function(){this.getChildControl(l);if(this.__qw){this.__qw.call(this);delete this.__qw;}},_onResize:function(){if(this.isVisible()){var bm=this._placementTarget;if(!bm){return;}else if(bm instanceof qx.ui.core.Widget){this.placeToWidget(bm);}else if(bm.top!==undefined){this.placeToPoint(bm);}else{throw new Error("Unknown target: "+bm);}this.__qy();}},_onMouseOver:function(e){var bo=qx.ui.menu.Manager.getInstance();bo.cancelClose(this);var bp=e.getTarget();if(bp.isEnabled()&&bp instanceof qx.ui.menu.AbstractButton){this.setSelectedButton(bp);var bn=bp.getMenu&&bp.getMenu();if(bn){bn.setOpener(bp);bo.scheduleOpen(bn);this.__qv=bn;}else{var bq=this.getOpenedButton();if(bq){bo.scheduleClose(bq.getMenu());}if(this.__qv){bo.cancelOpen(this.__qv);this.__qv=null;}}}else if(!this.getOpenedButton()){this.resetSelectedButton();}},_onMouseOut:function(e){var br=qx.ui.menu.Manager.getInstance();if(!qx.ui.core.Widget.contains(this,e.getRelatedTarget())){var bs=this.getOpenedButton();bs?this.setSelectedButton(bs):this.resetSelectedButton();if(bs){br.cancelClose(bs.getMenu());}if(this.__qv){br.cancelOpen(this.__qv);}}}},destruct:function(){if(!qx.core.ObjectRegistry.inShutDown){qx.ui.menu.Manager.getInstance().remove(this);}this.getApplicationRoot().removeListener(j,this._onResize,this);this._placementTarget=null;this._disposeObjects(x);}});})();(function(){var c="Integer",b="_applyLayoutChange",a="qx.ui.menu.Layout";qx.Class.define(a,{extend:qx.ui.layout.VBox,properties:{columnSpacing:{check:c,init:0,apply:b},spanColumn:{check:c,init:1,nullable:true,apply:b},iconColumnWidth:{check:c,init:0,themeable:true,apply:b},arrowColumnWidth:{check:c,init:0,themeable:true,apply:b}},members:{__qm:null,_computeSizeHint:function(){var q=this._getLayoutChildren();var o,g,j;var e=this.getSpanColumn();var h=this.__qm=[0,0,0,0];var m=this.getColumnSpacing();var k=0;var f=0;for(var i=0,l=q.length;i<l;i++){o=q[i];if(o.isAnonymous()){continue;}g=o.getChildrenSizes();for(var n=0;n<g.length;n++){if(e!=null&&n==e&&g[e+1]==0){k=Math.max(k,g[n]);}else{h[n]=Math.max(h[n],g[n]);}}var d=q[i].getInsets();f=Math.max(f,d.left+d.right);}if(e!=null&&h[e]+m+h[e+1]<k){h[e]=k-h[e+1]-m;}if(k==0){j=m*2;}else{j=m*3;}if(h[0]==0){h[0]=this.getIconColumnWidth();}if(h[3]==0){h[3]=this.getArrowColumnWidth();}var p=qx.ui.layout.VBox.prototype._computeSizeHint.call(this).height;return {minHeight:p,height:p,width:qx.lang.Array.sum(h)+f+j};},getColumnSizes:function(){return this.__qm||null;}},destruct:function(){this.__qm=null;}});})();(function(){var l="zIndex",k="px",j="keydown",h="deactivate",g="resize",f="keyup",d="keypress",c="backgroundColor",b="_applyOpacity",a="Boolean",x="__sg",w="__se",v="opacity",u="interval",t="Tab",s="Color",r="qx.ui.root.Page",q="Number",p="qx.ui.core.Blocker",o="__sc",m="qx.ui.root.Application",n="_applyColor";qx.Class.define(p,{extend:qx.core.Object,construct:function(y){qx.core.Object.call(this);this._widget=y;this._isPageRoot=(qx.Class.isDefined(r)&&y instanceof qx.ui.root.Page);if(this._isPageRoot){y.addListener(g,this.__sh,this);}if(qx.Class.isDefined(m)&&y instanceof qx.ui.root.Application){this.setKeepBlockerActive(true);}this.__rY=[];this.__sa=[];this.__sb=[];},properties:{color:{check:s,init:null,nullable:true,apply:n,themeable:true},opacity:{check:q,init:1,apply:b,themeable:true},keepBlockerActive:{check:a,init:false}},members:{__sc:null,__sd:0,__se:null,__sb:null,__rY:null,__sa:null,__sf:null,__sg:null,_isPageRoot:false,_widget:null,__sh:function(e){var z=e.getData();if(this.isContentBlocked()){this.getContentBlockerElement().setStyles({width:z.width,height:z.height});}if(this.isBlocked()){this.getBlockerElement().setStyles({width:z.width,height:z.height});}},_applyColor:function(A,B){var C=qx.theme.manager.Color.getInstance().resolve(A);this.__si(c,C);},_applyOpacity:function(D,E){this.__si(v,D);},__si:function(F,G){var H=[];this.__sc&&H.push(this.__sc);this.__se&&H.push(this.__se);for(var i=0;i<H.length;i++){H[i].setStyle(F,G);}},_backupActiveWidget:function(){var I=qx.event.Registration.getManager(window).getHandler(qx.event.handler.Focus);this.__rY.push(I.getActive());this.__sa.push(I.getFocus());if(this._widget.isFocusable()){this._widget.focus();}},_restoreActiveWidget:function(){var L=this.__rY.length;if(L>0){var K=this.__rY[L-1];if(K){qx.bom.Element.activate(K);}this.__rY.pop();}var J=this.__sa.length;if(J>0){var K=this.__sa[J-1];if(K){qx.bom.Element.focus(this.__sa[J-1]);}this.__sa.pop();}},__sj:function(){return new qx.html.Blocker(this.getColor(),this.getOpacity());},getBlockerElement:function(){if(!this.__sc){this.__sc=this.__sj();this.__sc.setStyle(l,15);this._widget.getContainerElement().add(this.__sc);this.__sc.exclude();}return this.__sc;},block:function(){this.__sd++;if(this.__sd<2){this._backupActiveWidget();var M=this.getBlockerElement();M.include();M.activate();M.addListener(h,this.__so,this);M.addListener(d,this.__sn,this);M.addListener(j,this.__sn,this);M.addListener(f,this.__sn,this);}},isBlocked:function(){return this.__sd>0;},unblock:function(){if(!this.isBlocked()){return;}this.__sd--;if(this.__sd<1){this.__sk();this.__sd=0;}},forceUnblock:function(){if(!this.isBlocked()){return;}this.__sd=0;this.__sk();},__sk:function(){this._restoreActiveWidget();var N=this.getBlockerElement();N.removeListener(h,this.__so,this);N.removeListener(d,this.__sn,this);N.removeListener(j,this.__sn,this);N.removeListener(f,this.__sn,this);N.exclude();},getContentBlockerElement:function(){if(!this.__se){this.__se=this.__sj();this._widget.getContentElement().add(this.__se);this.__se.exclude();}return this.__se;},blockContent:function(O){var P=this.getContentBlockerElement();P.setStyle(l,O);this.__sb.push(O);if(this.__sb.length<2){P.include();if(this._isPageRoot){if(!this.__sg){this.__sg=new qx.event.Timer(300);this.__sg.addListener(u,this.__sm,this);}this.__sg.start();this.__sm();}}},isContentBlocked:function(){return this.__sb.length>0;},unblockContent:function(){if(!this.isContentBlocked()){return;}this.__sb.pop();var Q=this.__sb[this.__sb.length-1];var R=this.getContentBlockerElement();R.setStyle(l,Q);if(this.__sb.length<1){this.__sl();this.__sb=[];}},forceUnblockContent:function(){if(!this.isContentBlocked()){return;}this.__sb=[];var S=this.getContentBlockerElement();S.setStyle(l,null);this.__sl();},__sl:function(){this.getContentBlockerElement().exclude();if(this._isPageRoot){this.__sg.stop();}},__sm:function(){var T=this._widget.getContainerElement().getDomElement();var U=qx.dom.Node.getDocument(T);this.getContentBlockerElement().setStyles({height:U.documentElement.scrollHeight+k,width:U.documentElement.scrollWidth+k});},__sn:function(e){if(e.getKeyIdentifier()==t){e.stop();}},__so:function(){if(this.getKeepBlockerActive()){this.getBlockerElement().activate();}}},destruct:function(){if(this._isPageRoot){this._widget.removeListener(g,this.__sh,this);}this._disposeObjects(w,o,x);this.__sf=this.__rY=this.__sa=this._widget=this.__sb=null;}});})();(function(){var i="qx.ui.window.Window",h="changeModal",g="changeVisibility",f="changeActive",d="_applyActiveWindow",c="__og",b="__of",a="qx.ui.window.MDesktop";qx.Mixin.define(a,{properties:{activeWindow:{check:i,apply:d,init:null,nullable:true}},members:{__of:null,__og:null,getWindowManager:function(){if(!this.__og){this.setWindowManager(new qx.ui.window.Window.DEFAULT_MANAGER_CLASS());}return this.__og;},supportsMaximize:function(){return true;},setWindowManager:function(j){if(this.__og){this.__og.setDesktop(null);}j.setDesktop(this);this.__og=j;},_onChangeActive:function(e){if(e.getData()){this.setActiveWindow(e.getTarget());}else if(this.getActiveWindow()==e.getTarget()){this.setActiveWindow(null);}},_applyActiveWindow:function(k,l){this.getWindowManager().changeActiveWindow(k,l);this.getWindowManager().updateStack();},_onChangeModal:function(e){this.getWindowManager().updateStack();},_onChangeVisibility:function(){this.getWindowManager().updateStack();},_afterAddChild:function(m){if(qx.Class.isDefined(i)&&m instanceof qx.ui.window.Window){this._addWindow(m);}},_addWindow:function(n){if(!qx.lang.Array.contains(this.getWindows(),n)){this.getWindows().push(n);n.addListener(f,this._onChangeActive,this);n.addListener(h,this._onChangeModal,this);n.addListener(g,this._onChangeVisibility,this);}if(n.getActive()){this.setActiveWindow(n);}this.getWindowManager().updateStack();},_afterRemoveChild:function(o){if(qx.Class.isDefined(i)&&o instanceof qx.ui.window.Window){this._removeWindow(o);}},_removeWindow:function(p){qx.lang.Array.remove(this.getWindows(),p);p.removeListener(f,this._onChangeActive,this);p.removeListener(h,this._onChangeModal,this);p.removeListener(g,this._onChangeVisibility,this);this.getWindowManager().updateStack();},getWindows:function(){if(!this.__of){this.__of=[];}return this.__of;}},destruct:function(){this._disposeArray(b);this._disposeObjects(c);}});})();(function(){var f="_applyBlockerColor",e="Number",d="__rQ",c="qx.ui.core.MBlocker",b="_applyBlockerOpacity",a="Color";qx.Mixin.define(c,{construct:function(){this.__rQ=new qx.ui.core.Blocker(this);},properties:{blockerColor:{check:a,init:null,nullable:true,apply:f,themeable:true},blockerOpacity:{check:e,init:1,apply:b,themeable:true}},members:{__rQ:null,_applyBlockerColor:function(g,h){this.__rQ.setColor(g);},_applyBlockerOpacity:function(i,j){this.__rQ.setOpacity(i);},block:function(){this.__rQ.block();},isBlocked:function(){return this.__rQ.isBlocked();},unblock:function(){this.__rQ.unblock();},forceUnblock:function(){this.__rQ.forceUnblock();},blockContent:function(k){this.__rQ.blockContent(k);},isContentBlocked:function(){return this.__rQ.isContentBlocked();},unblockContent:function(){this.__rQ.unblockContent();},forceUnblockContent:function(){this.__rQ.forceUnblockContent();},getBlocker:function(){return this.__rQ;}},destruct:function(){this._disposeObjects(d);}});})();(function(){var p="contextmenu",o="help",n="qx.client",m="changeGlobalCursor",l="abstract",k="Boolean",j="root",i="",h=" !important",g="_applyGlobalCursor",c="_applyNativeHelp",f=";",d="qx.ui.root.Abstract",b="String",a="*";qx.Class.define(d,{type:l,extend:qx.ui.core.Widget,include:[qx.ui.core.MChildrenHandling,qx.ui.core.MBlocker,qx.ui.window.MDesktop],construct:function(){qx.ui.core.Widget.call(this);qx.ui.core.FocusHandler.getInstance().addRoot(this);qx.ui.core.queue.Visibility.add(this);this.initNativeHelp();},properties:{appearance:{refine:true,init:j},enabled:{refine:true,init:true},focusable:{refine:true,init:true},globalCursor:{check:b,nullable:true,themeable:true,apply:g,event:m},nativeContextMenu:{refine:true,init:false},nativeHelp:{check:k,init:false,apply:c}},members:{__mS:null,isRootWidget:function(){return true;},getLayout:function(){return this._getLayout();},_applyGlobalCursor:qx.core.Variant.select(n,{"mshtml":function(q,r){},"default":function(s,t){var u=qx.bom.Stylesheet;var v=this.__mS;if(!v){this.__mS=v=u.createElement();}u.removeAllRules(v);if(s){u.addRule(v,a,qx.bom.element.Cursor.compile(s).replace(f,i)+h);}}}),_applyNativeContextMenu:function(w,x){if(w){this.removeListener(p,this._onNativeContextMenu,this,true);}else{this.addListener(p,this._onNativeContextMenu,this,true);}},_onNativeContextMenu:function(e){if(e.getTarget().getNativeContextMenu()){return;}e.preventDefault();},_applyNativeHelp:qx.core.Variant.select(n,{"mshtml":function(y,z){if(z===false){qx.bom.Event.removeNativeListener(document,o,qx.lang.Function.returnFalse);}if(y===false){qx.bom.Event.addNativeListener(document,o,qx.lang.Function.returnFalse);}},"default":function(){}})},destruct:function(){this.__mS=null;},defer:function(A,B){qx.ui.core.MChildrenHandling.remap(B);}});})();(function(){var n="resize",m="position",l="0px",k="webkit",j="paddingLeft",i="$$widget",h="qx.ui.root.Application",g="hidden",f="qx.client",d="div",a="paddingTop",c="100%",b="absolute";qx.Class.define(h,{extend:qx.ui.root.Abstract,construct:function(o){this.__pj=qx.dom.Node.getWindow(o);this.__pk=o;qx.ui.root.Abstract.call(this);qx.event.Registration.addListener(this.__pj,n,this._onResize,this);this._setLayout(new qx.ui.layout.Canvas());qx.ui.core.queue.Layout.add(this);qx.ui.core.FocusHandler.getInstance().connectTo(this);this.getContentElement().disableScrolling();},members:{__pj:null,__pk:null,_createContainerElement:function(){var p=this.__pk;if(qx.core.Variant.isSet(f,k)){if(!p.body){alert("The application could not be started due to a missing body tag in the HTML file!");}}var t=p.documentElement.style;var q=p.body.style;t.overflow=q.overflow=g;t.padding=t.margin=q.padding=q.margin=l;t.width=t.height=q.width=q.height=c;var s=p.createElement(d);p.body.appendChild(s);var r=new qx.html.Root(s);r.setStyle(m,b);r.setAttribute(i,this.toHashCode());return r;},_onResize:function(e){qx.ui.core.queue.Layout.add(this);},_computeSizeHint:function(){var u=qx.bom.Viewport.getWidth(this.__pj);var v=qx.bom.Viewport.getHeight(this.__pj);return {minWidth:u,width:u,maxWidth:u,minHeight:v,height:v,maxHeight:v};},_applyPadding:function(w,x,name){if(w&&(name==a||name==j)){throw new Error("The root widget does not support 'left', or 'top' paddings!");}qx.ui.root.Abstract.prototype._applyPadding.call(this,w,x,name);},_applyDecorator:function(y,z){qx.ui.root.Abstract.prototype._applyDecorator.call(this,y,z);if(!y){return;}var A=this.getDecoratorElement().getInsets();if(A.left||A.top){throw new Error("The root widget does not support decorators with 'left', or 'top' insets!");}}},destruct:function(){this.__pj=this.__pk=null;}});})();(function(){var k="keypress",j="focusout",h="activate",g="Tab",f="singleton",d="__bE",c="deactivate",b="focusin",a="qx.ui.core.FocusHandler";qx.Class.define(a,{extend:qx.core.Object,type:f,construct:function(){qx.core.Object.call(this);this.__bE={};},members:{__bE:null,__bF:null,__bG:null,__bH:null,connectTo:function(m){m.addListener(k,this.__bI,this);m.addListener(b,this._onFocusIn,this,true);m.addListener(j,this._onFocusOut,this,true);m.addListener(h,this._onActivate,this,true);m.addListener(c,this._onDeactivate,this,true);},addRoot:function(n){this.__bE[n.$$hash]=n;},removeRoot:function(o){delete this.__bE[o.$$hash];},getActiveWidget:function(){return this.__bF;},isActive:function(p){return this.__bF==p;},getFocusedWidget:function(){return this.__bG;},isFocused:function(q){return this.__bG==q;},isFocusRoot:function(r){return !!this.__bE[r.$$hash];},_onActivate:function(e){var t=e.getTarget();this.__bF=t;var s=this.__bJ(t);if(s!=this.__bH){this.__bH=s;}},_onDeactivate:function(e){var u=e.getTarget();if(this.__bF==u){this.__bF=null;}},_onFocusIn:function(e){var v=e.getTarget();if(v!=this.__bG){this.__bG=v;v.visualizeFocus();}},_onFocusOut:function(e){var w=e.getTarget();if(w==this.__bG){this.__bG=null;w.visualizeBlur();}},__bI:function(e){if(e.getKeyIdentifier()!=g){return;}if(!this.__bH){return;}e.stopPropagation();e.preventDefault();var x=this.__bG;if(!e.isShiftPressed()){var y=x?this.__bN(x):this.__bL();}else{var y=x?this.__bO(x):this.__bM();}if(y){y.tabFocus();}},__bJ:function(z){var A=this.__bE;while(z){if(A[z.$$hash]){return z;}z=z.getLayoutParent();}return null;},__bK:function(B,C){if(B===C){return 0;}var E=B.getTabIndex()||0;var D=C.getTabIndex()||0;if(E!=D){return E-D;}var J=B.getContainerElement().getDomElement();var I=C.getContainerElement().getDomElement();var H=qx.bom.element.Location;var G=H.get(J);var F=H.get(I);if(G.top!=F.top){return G.top-F.top;}if(G.left!=F.left){return G.left-F.left;}var K=B.getZIndex();var L=C.getZIndex();if(K!=L){return K-L;}return 0;},__bL:function(){return this.__bR(this.__bH,null);},__bM:function(){return this.__bS(this.__bH,null);},__bN:function(M){var N=this.__bH;if(N==M){return this.__bL();}while(M&&M.getAnonymous()){M=M.getLayoutParent();}if(M==null){return [];}var O=[];this.__bP(N,M,O);O.sort(this.__bK);var P=O.length;return P>0?O[0]:this.__bL();},__bO:function(Q){var R=this.__bH;if(R==Q){return this.__bM();}while(Q&&Q.getAnonymous()){Q=Q.getLayoutParent();}if(Q==null){return [];}var S=[];this.__bQ(R,Q,S);S.sort(this.__bK);var T=S.length;return T>0?S[T-1]:this.__bM();},__bP:function(parent,U,V){var W=parent.getLayoutChildren();var X;for(var i=0,l=W.length;i<l;i++){X=W[i];if(!(X instanceof qx.ui.core.Widget)){continue;}if(!this.isFocusRoot(X)&&X.isEnabled()&&X.isVisible()){if(X.isTabable()&&this.__bK(U,X)<0){V.push(X);}this.__bP(X,U,V);}}},__bQ:function(parent,Y,ba){var bb=parent.getLayoutChildren();var bc;for(var i=0,l=bb.length;i<l;i++){bc=bb[i];if(!(bc instanceof qx.ui.core.Widget)){continue;}if(!this.isFocusRoot(bc)&&bc.isEnabled()&&bc.isVisible()){if(bc.isTabable()&&this.__bK(Y,bc)>0){ba.push(bc);}this.__bQ(bc,Y,ba);}}},__bR:function(parent,bd){var be=parent.getLayoutChildren();var bf;for(var i=0,l=be.length;i<l;i++){bf=be[i];if(!(bf instanceof qx.ui.core.Widget)){continue;}if(!this.isFocusRoot(bf)&&bf.isEnabled()&&bf.isVisible()){if(bf.isTabable()){if(bd==null||this.__bK(bf,bd)<0){bd=bf;}}bd=this.__bR(bf,bd);}}return bd;},__bS:function(parent,bg){var bh=parent.getLayoutChildren();var bi;for(var i=0,l=bh.length;i<l;i++){bi=bh[i];if(!(bi instanceof qx.ui.core.Widget)){continue;}if(!this.isFocusRoot(bi)&&bi.isEnabled()&&bi.isVisible()){if(bi.isTabable()){if(bg==null||this.__bK(bi,bg)>0){bg=bi;}}bg=this.__bS(bi,bg);}}return bg;}},destruct:function(){this._disposeMap(d);this.__bG=this.__bF=this.__bH=null;}});})();(function(){var a="qx.html.Root";qx.Class.define(a,{extend:qx.html.Element,construct:function(b){qx.html.Element.call(this);if(b!=null){this.useElement(b);}},members:{useElement:function(c){qx.html.Element.prototype.useElement.call(this,c);this.setRoot(true);qx.html.Element._modified[this.$$hash]=this;}}});})();(function(){var k="cursor",j="100%",i="repeat",h="mousedown",g="url(",f=")",d="mouseout",c="qx.client",b="div",a="dblclick",w="mousewheel",v="qx.html.Blocker",u="mousemove",t="mouseover",s="appear",r="click",q="mshtml",p="mouseup",o="contextmenu",n="disappear",l="qx/static/blank.gif",m="absolute";qx.Class.define(v,{extend:qx.html.Element,construct:function(x,y){var x=x?qx.theme.manager.Color.getInstance().resolve(x):null;var z={position:m,width:j,height:j,opacity:y||0,backgroundColor:x};if(qx.core.Variant.isSet(c,q)){z.backgroundImage=g+qx.util.ResourceManager.getInstance().toUri(l)+f;z.backgroundRepeat=i;}qx.html.Element.call(this,b,z);this.addListener(h,this._stopPropagation,this);this.addListener(p,this._stopPropagation,this);this.addListener(r,this._stopPropagation,this);this.addListener(a,this._stopPropagation,this);this.addListener(u,this._stopPropagation,this);this.addListener(t,this._stopPropagation,this);this.addListener(d,this._stopPropagation,this);this.addListener(w,this._stopPropagation,this);this.addListener(o,this._stopPropagation,this);this.addListener(s,this.__qp,this);this.addListener(n,this.__qp,this);},members:{_stopPropagation:function(e){e.stopPropagation();},__qp:function(){var A=this.getStyle(k);this.setStyle(k,null,true);this.setStyle(k,A,true);}}});})();(function(){var b="menu-separator",a="qx.ui.menu.Separator";qx.Class.define(a,{extend:qx.ui.core.Widget,properties:{appearance:{refine:true,init:b},anonymous:{refine:true,init:true}}});})();(function(){var t="icon",s="label",r="arrow",q="shortcut",p="changeLocale",o="qx.dynlocale",n="submenu",m="on",l="String",k="qx.ui.menu.Menu",d="qx.ui.menu.AbstractButton",j="keypress",h="",c="_applyIcon",b="mouseup",g="abstract",f="_applyLabel",i="_applyMenu",a="changeCommand";qx.Class.define(d,{extend:qx.ui.core.Widget,include:[qx.ui.core.MExecutable],implement:[qx.ui.form.IExecutable],type:g,construct:function(){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.menu.ButtonLayout);this.addListener(b,this._onMouseUp);this.addListener(j,this._onKeyPress);this.addListener(a,this._onChangeCommand,this);},properties:{blockToolTip:{refine:true,init:true},label:{check:l,apply:f,nullable:true},menu:{check:k,apply:i,nullable:true,dereference:true},icon:{check:l,apply:c,themeable:true,nullable:true}},members:{_createChildControlImpl:function(u,v){var w;switch(u){case t:w=new qx.ui.basic.Image;w.setAnonymous(true);this._add(w,{column:0});break;case s:w=new qx.ui.basic.Label;w.setAnonymous(true);this._add(w,{column:1});break;case q:w=new qx.ui.basic.Label;w.setAnonymous(true);this._add(w,{column:2});break;case r:w=new qx.ui.basic.Image;w.setAnonymous(true);this._add(w,{column:3});break;}return w||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,u);},_forwardStates:{selected:1},getChildrenSizes:function(){var x=0,y=0,z=0,D=0;if(this._isChildControlVisible(t)){var E=this.getChildControl(t);x=E.getMarginLeft()+E.getSizeHint().width+E.getMarginRight();}if(this._isChildControlVisible(s)){var B=this.getChildControl(s);y=B.getMarginLeft()+B.getSizeHint().width+B.getMarginRight();}if(this._isChildControlVisible(q)){var A=this.getChildControl(q);z=A.getMarginLeft()+A.getSizeHint().width+A.getMarginRight();}if(this._isChildControlVisible(r)){var C=this.getChildControl(r);D=C.getMarginLeft()+C.getSizeHint().width+C.getMarginRight();}return [x,y,z,D];},_onMouseUp:function(e){},_onKeyPress:function(e){},_onChangeCommand:function(e){var H=e.getData();if(qx.core.Variant.isSet(o,m)){var F=e.getOldData();if(!F){qx.locale.Manager.getInstance().addListener(p,this._onChangeLocale,this);}if(!H){qx.locale.Manager.getInstance().removeListener(p,this._onChangeLocale,this);}}var G=H!=null?H.toString():h;this.getChildControl(q).setValue(G);},_onChangeLocale:qx.core.Variant.select(o,{"on":function(e){var I=this.getCommand();if(I!=null){this.getChildControl(q).setValue(I.toString());}},"off":null}),_applyIcon:function(J,K){if(J){this._showChildControl(t).setSource(J);}else{this._excludeChildControl(t);}},_applyLabel:function(L,M){if(L){this._showChildControl(s).setValue(L);}else{this._excludeChildControl(s);}},_applyMenu:function(N,O){if(O){O.resetOpener();O.removeState(n);}if(N){this._showChildControl(r);N.setOpener(this);N.addState(n);}else{this._excludeChildControl(r);}}},destruct:function(){if(this.getMenu()){if(!qx.core.ObjectRegistry.inShutDown){this.getMenu().destroy();}}if(qx.core.Variant.isSet(o,m)){qx.locale.Manager.getInstance().removeListener(p,this._onChangeLocale,this);}}});})();(function(){var c="middle",b="qx.ui.menu.ButtonLayout",a="left";qx.Class.define(b,{extend:qx.ui.layout.Abstract,members:{verifyLayoutProperty:null,renderLayout:function(d,e){var q=this._getLayoutChildren();var p;var g;var h=[];for(var i=0,l=q.length;i<l;i++){p=q[i];g=p.getLayoutProperties().column;h[g]=p;}var o=this.__ob(q[0]);var r=o.getColumnSizes();var k=o.getSpacingX();var j=qx.lang.Array.sum(r)+k*(r.length-1);if(j<d){r[1]+=d-j;}var s=0,top=0;var m=qx.ui.layout.Util;for(var i=0,l=r.length;i<l;i++){p=h[i];if(p){var f=p.getSizeHint();var top=m.computeVerticalAlignOffset(p.getAlignY()||c,f.height,e,0,0);var n=m.computeHorizontalAlignOffset(p.getAlignX()||a,f.width,r[i],p.getMarginLeft(),p.getMarginRight());p.renderLayout(s+n,top,f.width,f.height);}s+=r[i]+k;}},__ob:function(t){while(!(t instanceof qx.ui.menu.Menu)){t=t.getLayoutParent();}return t;},_computeSizeHint:function(){var w=this._getLayoutChildren();var v=0;var x=0;for(var i=0,l=w.length;i<l;i++){var u=w[i].getSizeHint();x+=u.width;v=Math.max(v,u.height);}return {width:x,height:v};}}});})();(function(){var a="qx.ui.core.MRemoteLayoutHandling";qx.Mixin.define(a,{members:{setLayout:function(b){return this.getChildrenContainer().setLayout(b);},getLayout:function(){return this.getChildrenContainer().getLayout();}}});})();(function(){var q="horizontal",p="scrollpane",o="vertical",n="button-backward",m="button-forward",l="content",k="execute",j="qx.ui.container.SlideBar",i="scrollY",h="removeChildWidget",c="scrollX",g="_applyOrientation",f="mousewheel",b="Integer",a="slidebar",d="update";qx.Class.define(j,{extend:qx.ui.core.Widget,include:[qx.ui.core.MRemoteChildrenHandling,qx.ui.core.MRemoteLayoutHandling],construct:function(r){qx.ui.core.Widget.call(this);var s=this.getChildControl(p);this._add(s,{flex:1});if(r!=null){this.setOrientation(r);}else{this.initOrientation();}this.addListener(f,this._onMouseWheel,this);},properties:{appearance:{refine:true,init:a},orientation:{check:[q,o],init:q,apply:g},scrollStep:{check:b,init:15,themeable:true}},members:{getChildrenContainer:function(){return this.getChildControl(l);},_createChildControlImpl:function(t,u){var v;switch(t){case m:v=new qx.ui.form.RepeatButton;v.addListener(k,this._onExecuteForward,this);v.setFocusable(false);this._addAt(v,2);break;case n:v=new qx.ui.form.RepeatButton;v.addListener(k,this._onExecuteBackward,this);v.setFocusable(false);this._addAt(v,0);break;case l:v=new qx.ui.container.Composite();if(qx.bom.client.Engine.GECKO){v.addListener(h,this._onRemoveChild,this);}this.getChildControl(p).add(v);break;case p:v=new qx.ui.core.scroll.ScrollPane();v.addListener(d,this._onResize,this);v.addListener(c,this._onScroll,this);v.addListener(i,this._onScroll,this);break;}return v||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,t);},_forwardStates:{barLeft:true,barTop:true,barRight:true,barBottom:true},scrollBy:function(w){var x=this.getChildControl(p);if(this.getOrientation()===q){x.scrollByX(w);}else{x.scrollByY(w);}},scrollTo:function(y){var z=this.getChildControl(p);if(this.getOrientation()===q){z.scrollToX(y);}else{z.scrollToY(y);}},_applyOrientation:function(A,B){var E=[this.getLayout(),this._getLayout()];var D=this.getChildControl(m);var C=this.getChildControl(n);if(B==o){D.removeState(o);C.removeState(o);D.addState(q);C.addState(q);}else if(B==q){D.removeState(q);C.removeState(q);D.addState(o);C.addState(o);}if(A==q){this._setLayout(new qx.ui.layout.HBox());this.setLayout(new qx.ui.layout.HBox());}else{this._setLayout(new qx.ui.layout.VBox());this.setLayout(new qx.ui.layout.VBox());}if(E[0]){E[0].dispose();}if(E[1]){E[1].dispose();}},_onMouseWheel:function(e){this.scrollBy(e.getWheelDelta()*this.getScrollStep());e.stop();},_onScroll:function(){this._updateArrowsEnabled();},_onResize:function(e){var content=this.getChildControl(p).getChildren()[0];if(!content){return;}var F=this.getInnerSize();var H=content.getBounds();var G=(this.getOrientation()===q)?H.width>F.width:H.height>F.height;if(G){this._showArrows();this._updateArrowsEnabled();}else{this._hideArrows();}},_onExecuteBackward:function(){this.scrollBy(-this.getScrollStep());},_onExecuteForward:function(){this.scrollBy(this.getScrollStep());},_onRemoveChild:function(){qx.event.Timer.once(function(){this.scrollBy(this.getChildControl(p).getScrollX());},this,50);},_updateArrowsEnabled:function(){var J=this.getChildControl(p);if(this.getOrientation()===q){var I=J.getScrollX();var K=J.getScrollMaxX();}else{var I=J.getScrollY();var K=J.getScrollMaxY();}this.getChildControl(n).setEnabled(I>0);this.getChildControl(m).setEnabled(I<K);},_showArrows:function(){this._showChildControl(m);this._showChildControl(n);},_hideArrows:function(){this._excludeChildControl(m);this._excludeChildControl(n);this.scrollTo(0);}}});})();(function(){var f="execute",e="button-backward",d="vertical",c="button-forward",b="menu-slidebar",a="qx.ui.menu.MenuSlideBar";qx.Class.define(a,{extend:qx.ui.container.SlideBar,construct:function(){qx.ui.container.SlideBar.call(this,d);},properties:{appearance:{refine:true,init:b}},members:{_createChildControlImpl:function(g,h){var i;switch(g){case c:i=new qx.ui.form.HoverButton();i.addListener(f,this._onExecuteForward,this);this._addAt(i,2);break;case e:i=new qx.ui.form.HoverButton();i.addListener(f,this._onExecuteBackward,this);this._addAt(i,0);break;}return i||qx.ui.container.SlideBar.prototype._createChildControlImpl.call(this,g);}}});})();(function(){var i="Integer",h="hovered",g="hover-button",f="interval",d="mouseover",c="mouseout",b="__nk",a="qx.ui.form.HoverButton";qx.Class.define(a,{extend:qx.ui.basic.Atom,include:[qx.ui.core.MExecutable],implement:[qx.ui.form.IExecutable],construct:function(j,k){qx.ui.basic.Atom.call(this,j,k);this.addListener(d,this._onMouseOver,this);this.addListener(c,this._onMouseOut,this);this.__nk=new qx.event.AcceleratingTimer();this.__nk.addListener(f,this._onInterval,this);},properties:{appearance:{refine:true,init:g},interval:{check:i,init:80},firstInterval:{check:i,init:200},minTimer:{check:i,init:20},timerDecrease:{check:i,init:2}},members:{__nk:null,_onMouseOver:function(e){if(!this.isEnabled()||e.getTarget()!==this){return;}this.__nk.set({interval:this.getInterval(),firstInterval:this.getFirstInterval(),minimum:this.getMinTimer(),decrease:this.getTimerDecrease()}).start();this.addState(h);},_onMouseOut:function(e){this.__nk.stop();this.removeState(h);if(!this.isEnabled()||e.getTarget()!==this){return;}},_onInterval:function(){if(this.isEnabled()){this.execute();}else{this.__nk.stop();}}},destruct:function(){this._disposeObjects(b);}});})();(function(){var h="pressed",g="hovered",f="inherit",d="qx.ui.menubar.Button",c="keydown",b="menubar-button",a="keyup";qx.Class.define(d,{extend:qx.ui.form.MenuButton,construct:function(i,j,k){qx.ui.form.MenuButton.call(this,i,j,k);this.removeListener(c,this._onKeyDown);this.removeListener(a,this._onKeyUp);},properties:{appearance:{refine:true,init:b},show:{refine:true,init:f},focusable:{refine:true,init:false}},members:{getMenuBar:function(){var parent=this;while(parent){if(parent instanceof qx.ui.toolbar.ToolBar){return parent;}parent=parent.getLayoutParent();}return null;},open:function(l){qx.ui.form.MenuButton.prototype.open.call(this,l);var menubar=this.getMenuBar();menubar._setAllowMenuOpenHover(true);},_onMenuChange:function(e){var m=this.getMenu();var menubar=this.getMenuBar();if(m.isVisible()){this.addState(h);if(menubar){menubar.setOpenMenu(m);}}else{this.removeState(h);if(menubar&&menubar.getOpenMenu()==m){menubar.resetOpenMenu();menubar._setAllowMenuOpenHover(false);}}},_onMouseUp:function(e){qx.ui.form.MenuButton.prototype._onMouseUp.call(this,e);var n=this.getMenu();if(n&&n.isVisible()&&!this.hasState(h)){this.addState(h);}},_onMouseOver:function(e){this.addState(g);if(this.getMenu()){var menubar=this.getMenuBar();if(menubar._isAllowMenuOpenHover()){qx.ui.menu.Manager.getInstance().hideAll();menubar._setAllowMenuOpenHover(true);if(this.isEnabled()){this.open();}}}}}});})();(function(){var w="visible",v="excluded",u="resize",t="qx.event.type.Data",s="both",r="qx.ui.menu.Menu",q="_applySpacing",p="showItem",o="Boolean",n="icon",d="label",m="qx.ui.core.Widget",h="_applyOverflowIndicator",c="_applyOverflowHandling",b="changeShow",g="Integer",f="qx.ui.toolbar.ToolBar",j="hideItem",a="toolbar",k="changeOpenMenu";qx.Class.define(f,{extend:qx.ui.core.Widget,include:qx.ui.core.MChildrenHandling,construct:function(){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.HBox());this.__rp=[];this.__rq=[];},properties:{appearance:{refine:true,init:a},openMenu:{check:r,event:k,nullable:true},show:{init:s,check:[s,d,n],inheritable:true,event:b},spacing:{nullable:true,check:g,themeable:true,apply:q},overflowIndicator:{check:m,nullable:true,apply:h},overflowHandling:{init:false,check:o,apply:c}},events:{"hideItem":t,"showItem":t},members:{__rp:null,__rq:null,_computeSizeHint:function(){var z=qx.ui.core.Widget.prototype._computeSizeHint.call(this);if(true&&this.getOverflowHandling()){var x=0;var y=this.getOverflowIndicator();if(y){x=y.getSizeHint().width+this.getSpacing();}z.minWidth=x;}return z;},_onResize:function(e){this._recalculateOverflow(e.getData().width);},_recalculateOverflow:function(A){if(!this.getOverflowHandling()){return;}var C=this.getSizeHint().width;var B=this.getOverflowIndicator();var F=0;if(B){F=B.getSizeHint().width;}if(A<C){do{var G=this._getNextToHide();if(!G){return;}var H=G.getMarginLeft()+G.getMarginRight();var E=G.getSizeHint().width+H;this.__rs(G);C-=E;if(B&&B.getVisibility()!=w){B.setVisibility(w);C+=F;}}while(C>A);}else{do{var I=this.__rp[0];if(I){var H=I.getMarginLeft()+I.getMarginRight();var D=I.getSizeHint().width+H;if(A>C+D+this.getSpacing()||(this.__rp.length==1&&A>C+D-F+this.getSpacing())){this.__rr(I);A+=D;if(B&&this.__rp.length==0){B.setVisibility(v);}}else{return;}}}while(A>=C&&this.__rp.length>0);}},__rr:function(J){J.setVisibility(w);this.__rp.shift();this.fireDataEvent(p,J);},__rs:function(K){if(!K){return;}this.__rp.unshift(K);K.setVisibility(v);this.fireDataEvent(j,K);},_getNextToHide:function(){for(var i=this.__rq.length-1;i>=0;i--){var L=this.__rq[i];if(L&&L.getVisibility&&L.getVisibility()==w){return L;}}var M=this._getChildren();for(var i=M.length-1;i>=0;i--){var N=M[i];if(N==this.getOverflowIndicator()){continue;}if(N.getVisibility&&N.getVisibility()==w){return N;}}},setRemovePriority:function(O,P,Q){if(!Q&&this.__rq[P]!=undefined){throw new Error("Priority already in use!");}this.__rq[P]=O;},_applyOverflowHandling:function(R,S){this.invalidateLayoutCache();var parent=this.getLayoutParent();if(parent){parent.invalidateLayoutCache();}var U=this.getBounds();if(U&&U.width){this._recalculateOverflow(U.width);}if(R){this.addListener(u,this._onResize,this);}else{this.removeListener(u,this._onResize,this);var T=this.getOverflowIndicator();if(T){T.setVisibility(v);}for(var i=0;i<this.__rp.length;i++){this.__rp[i].setVisibility(w);}this.__rp=[];}},_applyOverflowIndicator:function(V,W){if(W){this._remove(W);}if(V){if(this._indexOf(V)==-1){throw new Error("Widget must be child of the toolbar.");}V.setVisibility(v);}},__rt:false,_setAllowMenuOpenHover:function(X){this.__rt=X;},_isAllowMenuOpenHover:function(){return this.__rt;},_applySpacing:function(Y,ba){var bb=this._getLayout();Y==null?bb.resetSpacing():bb.setSpacing(Y);},addSpacer:function(){var bc=new qx.ui.core.Spacer;this._add(bc,{flex:1});return bc;},addSeparator:function(){this.add(new qx.ui.toolbar.Separator);},getMenuButtons:function(){var be=this.getChildren();var bd=[];var bf;for(var i=0,l=be.length;i<l;i++){bf=be[i];if(bf instanceof qx.ui.menubar.Button){bd.push(bf);}else if(bf instanceof qx.ui.toolbar.Part){bd.push.apply(bd,bf.getMenuButtons());}}return bd;}},destruct:function(){if(this.hasListener(u)){this.removeListener(u,this._onResize,this);}}});})();(function(){var b="toolbar-separator",a="qx.ui.toolbar.Separator";qx.Class.define(a,{extend:qx.ui.core.Widget,properties:{appearance:{refine:true,init:b},anonymous:{refine:true,init:true},width:{refine:true,init:0},height:{refine:true,init:0}}});})();(function(){var m="container",k="handle",j="both",h="Integer",g="middle",f="qx.ui.toolbar.Part",e="icon",d="label",c="changeShow",b="_applySpacing",a="toolbar/part";qx.Class.define(f,{extend:qx.ui.core.Widget,include:[qx.ui.core.MRemoteChildrenHandling],construct:function(){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.HBox);this._createChildControl(k);},properties:{appearance:{refine:true,init:a},show:{init:j,check:[j,d,e],inheritable:true,event:c},spacing:{nullable:true,check:h,themeable:true,apply:b}},members:{_createChildControlImpl:function(n,o){var p;switch(n){case k:p=new qx.ui.basic.Image();p.setAlignY(g);this._add(p);break;case m:p=new qx.ui.toolbar.PartContainer;this._add(p);break;}return p||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,n);},getChildrenContainer:function(){return this.getChildControl(m);},_applySpacing:function(q,r){var s=this.getChildControl(m).getLayout();q==null?s.resetSpacing():s.setSpacing(q);},addSeparator:function(){this.add(new qx.ui.toolbar.Separator);},getMenuButtons:function(){var u=this.getChildren();var t=[];var v;for(var i=0,l=u.length;i<l;i++){v=u[i];if(v instanceof qx.ui.menubar.Button){t.push(v);}}return t;}}});})();(function(){var f="both",e="toolbar/part/container",d="icon",c="changeShow",b="qx.ui.toolbar.PartContainer",a="label";qx.Class.define(b,{extend:qx.ui.container.Composite,construct:function(){qx.ui.container.Composite.call(this);this._setLayout(new qx.ui.layout.HBox);},properties:{appearance:{refine:true,init:e},show:{init:f,check:[f,a,d],inheritable:true,event:c}}});})();(function(){var b="qx.ui.menu.Button",a="menu-button";qx.Class.define(b,{extend:qx.ui.menu.AbstractButton,construct:function(c,d,f,g){qx.ui.menu.AbstractButton.call(this);if(c!=null){this.setLabel(c);}if(d!=null){this.setIcon(d);}if(f!=null){this.setCommand(f);}if(g!=null){this.setMenu(g);}},properties:{appearance:{refine:true,init:a}},members:{_onMouseUp:function(e){if(e.isLeftPressed()){this.execute();if(this.getMenu()){return;}}qx.ui.menu.Manager.getInstance().hideAll();},_onKeyPress:function(e){this.execute();}}});})();(function(){var b="qx.ui.table.IColumnMenuItem",a="qx.event.type.Data";qx.Interface.define(b,{properties:{visible:{}},events:{changeVisible:a}});})();(function(){var h="checked",g="menu-checkbox",f="Boolean",d="_applyValue",c="changeValue",b="qx.ui.menu.CheckBox",a="execute";qx.Class.define(b,{extend:qx.ui.menu.AbstractButton,implement:[qx.ui.form.IBooleanForm],construct:function(i,j){qx.ui.menu.AbstractButton.call(this);if(i!=null){if(i.translate){this.setLabel(i.translate());}else{this.setLabel(i);}}if(j!=null){this.setMenu(j);}this.addListener(a,this._onExecute,this);},properties:{appearance:{refine:true,init:g},value:{check:f,init:false,apply:d,event:c,nullable:true}},members:{_applyValue:function(k,l){k?this.addState(h):this.removeState(h);},_onExecute:function(e){this.toggleValue();},_onMouseUp:function(e){if(e.isLeftPressed()){this.execute();}qx.ui.menu.Manager.getInstance().hideAll();},_onKeyPress:function(e){this.execute();}}});})();(function(){var f="changeVisible",d="qx.ui.table.columnmenu.MenuItem",c="_applyVisible",b="Boolean",a="changeValue";qx.Class.define(d,{extend:qx.ui.menu.CheckBox,implement:qx.ui.table.IColumnMenuItem,properties:{visible:{check:b,init:true,apply:c,event:f}},construct:function(g){qx.ui.menu.CheckBox.call(this,g);this.addListener(a,function(e){this.bInListener=true;this.setVisible(e.getData());this.bInListener=false;});},members:{__wn:false,_applyVisible:function(h,i){if(!this.bInListener){this.setValue(h);}}}});})();(function(){var b="qx.ui.table.selection.Model",a="qx.ui.table.selection.Manager";qx.Class.define(a,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);},properties:{selectionModel:{check:b}},members:{__wo:null,handleMouseDown:function(c,d){if(d.isLeftPressed()){var e=this.getSelectionModel();if(!e.isSelectedIndex(c)){this._handleSelectEvent(c,d);this.__wo=true;}else{this.__wo=false;}}else if(d.isRightPressed()&&d.getModifiers()==0){var e=this.getSelectionModel();if(!e.isSelectedIndex(c)){e.setSelectionInterval(c,c);}}},handleMouseUp:function(f,g){if(g.isLeftPressed()&&!this.__wo){this._handleSelectEvent(f,g);}},handleClick:function(h,i){},handleSelectKeyDown:function(j,k){this._handleSelectEvent(j,k);},handleMoveKeyDown:function(l,m){var o=this.getSelectionModel();switch(m.getModifiers()){case 0:o.setSelectionInterval(l,l);break;case qx.event.type.Dom.SHIFT_MASK:var n=o.getAnchorSelectionIndex();if(n==-1){o.setSelectionInterval(l,l);}else{o.setSelectionInterval(n,l);}break;}},_handleSelectEvent:function(p,q){var t=this.getSelectionModel();var r=t.getLeadSelectionIndex();var s=t.getAnchorSelectionIndex();if(q.isShiftPressed()){if(p!=r||t.isSelectionEmpty()){if(s==-1){s=p;}if(q.isCtrlOrCommandPressed()){t.addSelectionInterval(s,p);}else{t.setSelectionInterval(s,p);}}}else if(q.isCtrlOrCommandPressed()){if(t.isSelectedIndex(p)){t.removeSelectionInterval(p,p);}else{t.addSelectionInterval(p,p);}}else{t.setSelectionInterval(p,p);}}}});})();(function(){var l="]",k="..",h="changeSelection",g="_applySelectionMode",f='ie',d="qx.event.type.Event",c="Ranges:",b="qx.ui.table.selection.Model",a=" [";qx.Class.define(b,{extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__we=[];this.__wf=-1;this.__wg=-1;this.hasBatchModeRefCount=0;this.__wh=false;},events:{"changeSelection":d},statics:{NO_SELECTION:1,SINGLE_SELECTION:2,SINGLE_INTERVAL_SELECTION:3,MULTIPLE_INTERVAL_SELECTION:4,MULTIPLE_INTERVAL_SELECTION_TOGGLE:5},properties:{selectionMode:{init:2,check:[1,2,3,4,5],apply:g}},members:{__wh:null,__wf:null,__wg:null,__we:null,_applySelectionMode:function(m){this.resetSelection();},setBatchMode:function(n){if(n){this.hasBatchModeRefCount+=1;}else{if(this.hasBatchModeRefCount==0){throw new Error("Try to turn off batch mode althoug it was not turned on.");}this.hasBatchModeRefCount-=1;if(this.__wh){this.__wh=false;this._fireChangeSelection();}}return this.hasBatchMode();},hasBatchMode:function(){return this.hasBatchModeRefCount>0;},getAnchorSelectionIndex:function(){return this.__wf;},_setAnchorSelectionIndex:function(o){this.__wf=o;},getLeadSelectionIndex:function(){return this.__wg;},_setLeadSelectionIndex:function(p){this.__wg=p;},_getSelectedRangeArr:function(){return this.__we;},resetSelection:function(){if(!this.isSelectionEmpty()){this._resetSelection();this._fireChangeSelection();}},isSelectionEmpty:function(){return this.__we.length==0;},getSelectedCount:function(){var r=0;for(var i=0;i<this.__we.length;i++){var q=this.__we[i];r+=q.maxIndex-q.minIndex+1;}return r;},isSelectedIndex:function(s){for(var i=0;i<this.__we.length;i++){var t=this.__we[i];if(s>=t.minIndex&&s<=t.maxIndex){return true;}}return false;},getSelectedRanges:function(){var u=[];for(var i=0;i<this.__we.length;i++){u.push({minIndex:this.__we[i].minIndex,maxIndex:this.__we[i].maxIndex});}return u;},iterateSelection:function(v,w){for(var i=0;i<this.__we.length;i++){for(var j=this.__we[i].minIndex;j<=this.__we[i].maxIndex;j++){v.call(w,j);}}},setSelectionInterval:function(x,y){var z=this.self(arguments);switch(this.getSelectionMode()){case z.NO_SELECTION:return;case z.SINGLE_SELECTION:if(this.isSelectedIndex(y)){return;}x=y;break;case z.MULTIPLE_INTERVAL_SELECTION_TOGGLE:this.setBatchMode(true);try{for(var i=x;i<=y;i++){if(!this.isSelectedIndex(i)){this._addSelectionInterval(i,i);}else{this.removeSelectionInterval(i,i);}}}catch(e){if(qx.bom.client.Browser.NAME==f&&qx.bom.client.Browser.VERSION<=7){this.setBatchMode(false);}throw e;}finally{this.setBatchMode(false);}this._fireChangeSelection();return;}this._resetSelection();this._addSelectionInterval(x,y);this._fireChangeSelection();},addSelectionInterval:function(A,B){var C=qx.ui.table.selection.Model;switch(this.getSelectionMode()){case C.NO_SELECTION:return;case C.MULTIPLE_INTERVAL_SELECTION:case C.MULTIPLE_INTERVAL_SELECTION_TOGGLE:this._addSelectionInterval(A,B);this._fireChangeSelection();break;default:this.setSelectionInterval(A,B);break;}},removeSelectionInterval:function(D,E){this.__wf=D;this.__wg=E;var F=Math.min(D,E);var H=Math.max(D,E);for(var i=0;i<this.__we.length;i++){var J=this.__we[i];if(J.minIndex>H){break;}else if(J.maxIndex>=F){var K=(J.minIndex>=F)&&(J.minIndex<=H);var I=(J.maxIndex>=F)&&(J.maxIndex<=H);if(K&&I){this.__we.splice(i,1);i--;}else if(K){J.minIndex=H+1;}else if(I){J.maxIndex=F-1;}else{var G={minIndex:H+1,maxIndex:J.maxIndex};this.__we.splice(i+1,0,G);J.maxIndex=F-1;break;}}}this._fireChangeSelection();},_resetSelection:function(){this.__we=[];this.__wf=-1;this.__wg=-1;},_addSelectionInterval:function(L,M){this.__wf=L;this.__wg=M;var N=Math.min(L,M);var P=Math.max(L,M);var O=0;for(;O<this.__we.length;O++){var Q=this.__we[O];if(Q.minIndex>N){break;}}this.__we.splice(O,0,{minIndex:N,maxIndex:P});var R=this.__we[0];for(var i=1;i<this.__we.length;i++){var Q=this.__we[i];if(R.maxIndex+1>=Q.minIndex){R.maxIndex=Math.max(R.maxIndex,Q.maxIndex);this.__we.splice(i,1);i--;}else{R=Q;}}},_dumpRanges:function(){var S=c;for(var i=0;i<this.__we.length;i++){var T=this.__we[i];S+=a+T.minIndex+k+T.maxIndex+l;}this.debug(S);},_fireChangeSelection:function(){if(this.hasBatchMode()){this.__wh=true;}else{this.fireEvent(h);}}},destruct:function(){this.__we=null;}});})();(function(){var k="",j="Number",h='</div>',g='" ',f="paneUpdated",e='<div>',d="</div>",c="overflow: hidden;",b="qx.event.type.Data",a="paneReloadsData",E="div",D='style="',C="_applyMaxCacheLines",B="qx.ui.table.pane.Pane",A="width: 100%;",z="qx.event.type.Event",w="_applyVisibleRowCount",v='>',u="line-height: ",t="appear",r='class="',s="width:100%;",p="px;",q='<div ',n="'>",o="_applyFirstVisibleRow",l="<div style='",m=";position:relative;";qx.Class.define(B,{extend:qx.ui.core.Widget,construct:function(F){qx.ui.core.Widget.call(this);this.__wL=F;this.__wM=0;this.__wN=0;this.__wO=[];},events:{"paneReloadsData":b,"paneUpdated":z},properties:{firstVisibleRow:{check:j,init:0,apply:o},visibleRowCount:{check:j,init:0,apply:w},maxCacheLines:{check:j,init:1000,apply:C},allowShrinkX:{refine:true,init:false}},members:{__wN:null,__wM:null,__wL:null,__wP:null,__wQ:null,__wR:null,__wO:null,__wS:0,_applyFirstVisibleRow:function(G,H){this.updateContent(false,G-H);},_applyVisibleRowCount:function(I,J){this.updateContent(true);},_getContentHint:function(){return {width:this.getPaneScroller().getTablePaneModel().getTotalWidth(),height:400};},getPaneScroller:function(){return this.__wL;},getTable:function(){return this.__wL.getTable();},setFocusedCell:function(K,L,M){if(K!=this.__wR||L!=this.__wQ){var N=this.__wQ;this.__wR=K;this.__wQ=L;if(L!=N&&!M){if(N!==null){this.updateContent(false,null,N,true);}if(L!==null){this.updateContent(false,null,L,true);}}}},onSelectionChanged:function(){this.updateContent(false,null,null,true);},onFocusChanged:function(){this.updateContent(false,null,null,true);},setColumnWidth:function(O,P){this.updateContent(true);},onColOrderChanged:function(){this.updateContent(true);},onPaneModelChanged:function(){this.updateContent(true);},onTableModelDataChanged:function(Q,R,S,T){this.__wT();var V=this.getFirstVisibleRow();var U=this.getVisibleRowCount();if(R==-1||R>=V&&Q<V+U){this.updateContent();}},onTableModelMetaDataChanged:function(){this.updateContent(true);},_applyMaxCacheLines:function(W,X){if(this.__wS>=W&&W!==-1){this.__wT();}},__wT:function(){this.__wO=[];this.__wS=0;},__wU:function(Y,ba,bb){if(!ba&&!bb&&this.__wO[Y]){return this.__wO[Y];}else{return null;}},__wV:function(bc,bd,be,bf){var bg=this.getMaxCacheLines();if(!be&&!bf&&!this.__wO[bc]&&bg>0){this._applyMaxCacheLines(bg);this.__wO[bc]=bd;this.__wS+=1;}},updateContent:function(bh,bi,bj,bk){if(bh){this.__wT();}if(bi&&Math.abs(bi)<=Math.min(10,this.getVisibleRowCount())){this._scrollContent(bi);}else if(bk&&!this.getTable().getAlwaysUpdateCells()){this._updateRowStyles(bj);}else{this._updateAllRows();}},_updateRowStyles:function(bl){var bp=this.getContentElement().getDomElement();if(!bp||!bp.firstChild){this._updateAllRows();return;}var bt=this.getTable();var bn=bt.getSelectionModel();var bq=bt.getTableModel();var bu=bt.getDataRowRenderer();var bo=bp.firstChild.childNodes;var bs={table:bt};var bv=this.getFirstVisibleRow();var y=0;var bm=bo.length;if(bl!=null){var br=bl-bv;if(br>=0&&br<bm){bv=bl;y=br;bm=br+1;}else{return;}}for(;y<bm;y++,bv++){bs.row=bv;bs.selected=bn.isSelectedIndex(bv);bs.focusedRow=(this.__wQ==bv);bs.rowData=bq.getRowData(bv);bu.updateDataRowElement(bs,bo[y]);}},_getRowsHtml:function(bw,bx){var bD=this.getTable();var bG=bD.getSelectionModel();var bA=bD.getTableModel();var bB=bD.getTableColumnModel();var bV=this.getPaneScroller().getTablePaneModel();var bL=bD.getDataRowRenderer();bA.prefetchRows(bw,bw+bx-1);var bS=bD.getRowHeight();var bU=bV.getColumnCount();var bC=0;var bz=[];for(var x=0;x<bU;x++){var bY=bV.getColumnAtX(x);var bF=bB.getColumnWidth(bY);bz.push({col:bY,xPos:x,editable:bA.isColumnEditable(bY),focusedCol:this.__wR==bY,styleLeft:bC,styleWidth:bF});bC+=bF;}var bX=[];var ca=false;for(var bE=bw;bE<bw+bx;bE++){var bH=bG.isSelectedIndex(bE);var bK=(this.__wQ==bE);var bP=this.__wU(bE,bH,bK);if(bP){bX.push(bP);continue;}var by=[];var bR={table:bD};bR.styleHeight=bS;bR.row=bE;bR.selected=bH;bR.focusedRow=bK;bR.rowData=bA.getRowData(bE);if(!bR.rowData){ca=true;}by.push(q);var bO=bL.getRowAttributes(bR);if(bO){by.push(bO);}var bN=bL.getRowClass(bR);if(bN){by.push(r,bN,g);}var bM=bL.createRowStyle(bR);bM+=m+bL.getRowHeightStyle(bS)+s;if(bM){by.push(D,bM,g);}by.push(v);var bW=false;for(x=0;x<bU&&!bW;x++){var bI=bz[x];for(var bT in bI){bR[bT]=bI[bT];}var bY=bR.col;bR.value=bA.getValue(bY,bE);var bJ=bB.getDataCellRenderer(bY);bR.style=bJ.getDefaultCellStyle();bW=bJ.createDataCellHtml(bR,by)||false;}by.push(h);var bQ=by.join(k);this.__wV(bE,bQ,bH,bK);bX.push(bQ);}this.fireDataEvent(a,ca);return bX.join(k);},_scrollContent:function(cb){var cc=this.getContentElement().getDomElement();if(!(cc&&cc.firstChild)){this._updateAllRows();return;}var cl=cc.firstChild;var cd=cl.childNodes;var cj=this.getVisibleRowCount();var ci=this.getFirstVisibleRow();var cg=this.getTable().getTableModel();var cm=0;cm=cg.getRowCount();if(ci+cj>cm){this._updateAllRows();return;}var cn=cb<0?cj+cb:0;var ce=cb<0?0:cj-cb;for(i=Math.abs(cb)-1;i>=0;i--){var ch=cd[cn];try{cl.removeChild(ch);}catch(co){break;}}if(!this.__wP){this.__wP=document.createElement(E);}var ck=e;ck+=this._getRowsHtml(ci+ce,Math.abs(cb));ck+=h;this.__wP.innerHTML=ck;var cf=this.__wP.firstChild.childNodes;if(cb>0){for(var i=cf.length-1;i>=0;i--){var ch=cf[0];cl.appendChild(ch);}}else{for(var i=cf.length-1;i>=0;i--){var ch=cf[cf.length-1];cl.insertBefore(ch,cl.firstChild);}}if(this.__wQ!==null){this._updateRowStyles(this.__wQ-cb);this._updateRowStyles(this.__wQ);}this.fireEvent(f);},_updateAllRows:function(){var cs=this.getContentElement().getDomElement();if(!cs){this.addListenerOnce(t,arguments.callee,this);return;}var cy=this.getTable();var cv=cy.getTableModel();var cx=this.getPaneScroller().getTablePaneModel();var cw=cx.getColumnCount();var cp=cy.getRowHeight();var ct=this.getFirstVisibleRow();var cq=this.getVisibleRowCount();var cz=cv.getRowCount();if(ct+cq>cz){cq=Math.max(0,cz-ct);}var cr=cx.getTotalWidth();var cu;if(cq>0){cu=[l,A,(cy.getForceLineHeight()?u+cp+p:k),c,n,this._getRowsHtml(ct,cq),d];}else{cu=[];}var cA=cu.join(k);cs.innerHTML=cA;this.setWidth(cr);this.__wM=cw;this.__wN=cq;this.fireEvent(f);}},destruct:function(){this.__wP=this.__wL=this.__wO=null;}});})();(function(){var c="hovered",b="__wX",a="qx.ui.table.pane.Header";qx.Class.define(a,{extend:qx.ui.core.Widget,construct:function(d){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.HBox());this.__wW=new qx.ui.core.Blocker(this);this.__wX=d;},members:{__wX:null,__wY:null,__xa:null,__wW:null,getPaneScroller:function(){return this.__wX;},getTable:function(){return this.__wX.getTable();},getBlocker:function(){return this.__wW;},onColOrderChanged:function(){this._updateContent(true);},onPaneModelChanged:function(){this._updateContent(true);},onTableModelMetaDataChanged:function(){this._updateContent();},setColumnWidth:function(e,f,g){var h=this.getHeaderWidgetAtColumn(e);if(h!=null){h.setWidth(f);}},setMouseOverColumn:function(i){if(i!=this.__xa){if(this.__xa!=null){var j=this.getHeaderWidgetAtColumn(this.__xa);if(j!=null){j.removeState(c);}}if(i!=null){this.getHeaderWidgetAtColumn(i).addState(c);}this.__xa=i;}},getHeaderWidgetAtColumn:function(k){var l=this.getPaneScroller().getTablePaneModel().getX(k);return this._getChildren()[l];},showColumnMoveFeedback:function(m,x){var q=this.getContainerLocation();if(this.__wY==null){var v=this.getTable();var n=this.getPaneScroller().getTablePaneModel().getX(m);var p=this._getChildren()[n];var r=v.getTableModel();var t=v.getTableColumnModel();var u={xPos:n,col:m,name:r.getColumnName(m),table:v};var s=t.getHeaderCellRenderer(m);var o=s.createHeaderCell(u);var w=p.getBounds();o.setWidth(w.width);o.setHeight(w.height);o.setZIndex(1000000);o.setOpacity(0.8);o.setLayoutProperties({top:q.top});this.getApplicationRoot().add(o);this.__wY=o;}this.__wY.setLayoutProperties({left:q.left+x});this.__wY.show();},hideColumnMoveFeedback:function(){if(this.__wY!=null){this.__wY.destroy();this.__wY=null;}},isShowingColumnMoveFeedback:function(){return this.__wY!=null;},_updateContent:function(y){var I=this.getTable();var C=I.getTableModel();var F=I.getTableColumnModel();var H=this.getPaneScroller().getTablePaneModel();var K=this._getChildren();var D=H.getColumnCount();var G=C.getSortColumnIndex();if(y){this._cleanUpCells();}var z={};z.sortedAscending=C.isSortAscending();for(var x=0;x<D;x++){var B=H.getColumnAtX(x);if(B===undefined){continue;}var J=F.getColumnWidth(B);var E=F.getHeaderCellRenderer(B);z.xPos=x;z.col=B;z.name=C.getColumnName(B);z.editable=C.isColumnEditable(B);z.sorted=(B==G);z.table=I;var A=K[x];if(A==null){A=E.createHeaderCell(z);A.set({width:J});this._add(A);}else{E.updateHeaderCell(z,A);}}},_cleanUpCells:function(){var M=this._getChildren();for(var x=M.length-1;x>=0;x--){var L=M[x];L.destroy();}}},destruct:function(){this.__wW.dispose();this._disposeObjects(b);}});})();(function(){var m="Boolean",l="resize-line",k="mousedown",j="qx.event.type.Data",i="mouseup",h="qx.ui.table.pane.CellEvent",g="scroll",d="focus-indicator",c="excluded",b="scrollbar-y",bm="table-scroller-focus-indicator",bl="visible",bk="mousemove",bj="header",bi="editing",bh="click",bg="modelChanged",bf="scrollbar-x",be="cellClick",bd="pane",t="__xi",u="__xc",r="mouseout",s="__xh",p="changeHorizontalScrollBarVisible",q="bottom",n="_applyScrollTimeout",o="changeScrollX",z="_applyTablePaneModel",A="Integer",I="__xg",G="dblclick",Q="dataEdited",L="mousewheel",Y="interval",V="qx.ui.table.pane.Scroller",C="__xk",bc="_applyShowCellFocusIndicator",bb="__xe",ba="resize",B="vertical",E="changeScrollY",F="appear",H="table-scroller",J="beforeSort",M="__xd",S="cellDblclick",X="horizontal",v="losecapture",w="contextmenu",D="col-resize",P="disappear",O="_applyVerticalScrollBarVisible",N="_applyHorizontalScrollBarVisible",U="cellContextmenu",T="__xj",K="close",R="changeTablePaneModel",a="__xf",W="qx.ui.table.pane.Model",y="changeVerticalScrollBarVisible";qx.Class.define(V,{extend:qx.ui.core.Widget,include:qx.ui.core.scroll.MScrollBarFactory,construct:function(bn){qx.ui.core.Widget.call(this);this.__xb=bn;var bo=new qx.ui.layout.Grid();bo.setColumnFlex(0,1);bo.setRowFlex(1,1);this._setLayout(bo);this.__xc=this._showChildControl(bf);this.__xd=this._showChildControl(b);this.__xe=this._showChildControl(bj);this.__xf=this._showChildControl(bd);this.__xg=new qx.ui.container.Composite(new qx.ui.layout.HBox()).set({minWidth:0});this._add(this.__xg,{row:0,column:0,colSpan:2});this.__xh=new qx.ui.table.pane.Clipper();this.__xh.add(this.__xe);this.__xh.addListener(v,this._onChangeCaptureHeader,this);this.__xh.addListener(bk,this._onMousemoveHeader,this);this.__xh.addListener(k,this._onMousedownHeader,this);this.__xh.addListener(i,this._onMouseupHeader,this);this.__xh.addListener(bh,this._onClickHeader,this);this.__xg.add(this.__xh,{flex:1});this.__xi=new qx.ui.table.pane.Clipper();this.__xi.add(this.__xf);this.__xi.addListener(L,this._onMousewheel,this);this.__xi.addListener(bk,this._onMousemovePane,this);this.__xi.addListener(k,this._onMousedownPane,this);this.__xi.addListener(i,this._onMouseupPane,this);this.__xi.addListener(bh,this._onClickPane,this);this.__xi.addListener(w,this._onContextMenu,this);this.__xi.addListener(G,this._onDblclickPane,this);this.__xi.addListener(ba,this._onResizePane,this);this._add(this.__xi,{row:1,column:0});this.__xj=this.getChildControl(d);this.initShowCellFocusIndicator();this.getChildControl(l).hide();this.addListener(r,this._onMouseout,this);this.addListener(F,this._onAppear,this);this.addListener(P,this._onDisappear,this);this.__xk=new qx.event.Timer();this.__xk.addListener(Y,this._oninterval,this);this.initScrollTimeout();},statics:{MIN_COLUMN_WIDTH:10,RESIZE_REGION_RADIUS:5,CLICK_TOLERANCE:5,HORIZONTAL_SCROLLBAR:1,VERTICAL_SCROLLBAR:2},events:{"changeScrollY":j,"changeScrollX":j,"cellClick":h,"cellDblclick":h,"cellContextmenu":h,"beforeSort":j},properties:{horizontalScrollBarVisible:{check:m,init:true,apply:N,event:p},verticalScrollBarVisible:{check:m,init:true,apply:O,event:y},tablePaneModel:{check:W,apply:z,event:R},liveResize:{check:m,init:false},focusCellOnMouseMove:{check:m,init:false},selectBeforeFocus:{check:m,init:false},showCellFocusIndicator:{check:m,init:true,apply:bc},resetSelectionOnHeaderClick:{check:m,init:true},scrollTimeout:{check:A,init:100,apply:n},appearance:{refine:true,init:H}},members:{__xl:null,__xb:null,__xm:null,__xn:null,__xo:null,__xp:null,__xq:null,__xr:null,__xs:null,__xt:null,__xu:null,__xv:null,__xw:null,__xx:null,__xy:false,__xz:null,__xA:null,__xB:null,__xC:null,__xD:null,__xE:null,__xF:null,__xG:null,__xc:null,__xd:null,__xe:null,__xh:null,__xf:null,__xi:null,__xj:null,__xg:null,__xk:null,getPaneInsetRight:function(){var bq=this.getTopRightWidget();var br=bq&&bq.isVisible()&&bq.getBounds()?bq.getBounds().width:0;var bp=this.getVerticalScrollBarVisible()?this.getVerticalScrollBarWidth():0;return Math.max(br,bp);},setPaneWidth:function(bs){if(this.isVerticalScrollBarVisible()){bs+=this.getPaneInsetRight();}this.setWidth(bs);},_createChildControlImpl:function(bt,bu){var bv;switch(bt){case bj:bv=(this.getTable().getNewTablePaneHeader())(this);break;case bd:bv=(this.getTable().getNewTablePane())(this);break;case d:bv=new qx.ui.table.pane.FocusIndicator(this);bv.setUserBounds(0,0,0,0);bv.setZIndex(1000);bv.addListener(i,this._onMouseupFocusIndicator,this);this.__xi.add(bv);bv.show();bv.setDecorator(null);break;case l:bv=new qx.ui.core.Widget();bv.setUserBounds(0,0,0,0);bv.setZIndex(1000);this.__xi.add(bv);break;case bf:bv=this._createScrollBar(X).set({minWidth:0,alignY:q});bv.addListener(g,this._onScrollX,this);this._add(bv,{row:2,column:0});break;case b:bv=this._createScrollBar(B);bv.addListener(g,this._onScrollY,this);this._add(bv,{row:1,column:1});break;}return bv||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,bt);},_applyHorizontalScrollBarVisible:function(bw,bx){this.__xc.setVisibility(bw?bl:c);},_applyVerticalScrollBarVisible:function(by,bz){this.__xd.setVisibility(by?bl:c);},_applyTablePaneModel:function(bA,bB){if(bB!=null){bB.removeListener(bg,this._onPaneModelChanged,this);}bA.addListener(bg,this._onPaneModelChanged,this);},_applyShowCellFocusIndicator:function(bC,bD){if(bC){this.__xj.setDecorator(bm);this._updateFocusIndicator();}else{if(this.__xj){this.__xj.setDecorator(null);}}},getScrollY:function(){return this.__xd.getPosition();},setScrollY:function(scrollY,bE){this.__xd.scrollTo(scrollY);if(bE){this._updateContent();}},getScrollX:function(){return this.__xc.getPosition();},setScrollX:function(scrollX){this.__xc.scrollTo(scrollX);},getTable:function(){return this.__xb;},onColVisibilityChanged:function(){this.updateHorScrollBarMaximum();this._updateFocusIndicator();},setColumnWidth:function(bF,bG){this.__xe.setColumnWidth(bF,bG);this.__xf.setColumnWidth(bF,bG);var bH=this.getTablePaneModel();var x=bH.getX(bF);if(x!=-1){this.updateHorScrollBarMaximum();this._updateFocusIndicator();}},onColOrderChanged:function(){this.__xe.onColOrderChanged();this.__xf.onColOrderChanged();this.updateHorScrollBarMaximum();},onTableModelDataChanged:function(bI,bJ,bK,bL){this.__xf.onTableModelDataChanged(bI,bJ,bK,bL);var bM=this.getTable().getTableModel().getRowCount();if(bM!=this.__xl){this.updateVerScrollBarMaximum();if(this.getFocusedRow()>=bM){if(bM==0){this.setFocusedCell(null,null);}else{this.setFocusedCell(this.getFocusedColumn(),bM-1);}}this.__xl=bM;}},onSelectionChanged:function(){this.__xf.onSelectionChanged();},onFocusChanged:function(){this.__xf.onFocusChanged();},onTableModelMetaDataChanged:function(){this.__xe.onTableModelMetaDataChanged();this.__xf.onTableModelMetaDataChanged();},_onPaneModelChanged:function(){this.__xe.onPaneModelChanged();this.__xf.onPaneModelChanged();},_onResizePane:function(){this.updateHorScrollBarMaximum();this.updateVerScrollBarMaximum();this._updateContent();this.__xe._updateContent();this.__xb._updateScrollBarVisibility();},updateHorScrollBarMaximum:function(){var bQ=this.__xi.getInnerSize();if(!bQ){return ;}var bO=this.getTablePaneModel().getTotalWidth();var bP=this.__xc;if(bQ.width<bO){var bN=Math.max(0,bO-bQ.width);bP.setMaximum(bN);bP.setKnobFactor(bQ.width/bO);var bR=bP.getPosition();bP.setPosition(Math.min(bR,bN));}else{bP.setMaximum(0);bP.setKnobFactor(1);bP.setPosition(0);}},updateVerScrollBarMaximum:function(){var ca=this.__xi.getInnerSize();if(!ca){return ;}var bX=this.getTable().getTableModel();var bT=bX.getRowCount();if(this.getTable().getKeepFirstVisibleRowComplete()){bT+=1;}var bS=this.getTable().getRowHeight();var bV=bT*bS;var bY=this.__xd;if(ca.height<bV){var bU=Math.max(0,bV-ca.height);bY.setMaximum(bU);bY.setKnobFactor(ca.height/bV);var bW=bY.getPosition();bY.setPosition(Math.min(bW,bU));}else{bY.setMaximum(0);bY.setKnobFactor(1);bY.setPosition(0);}},onKeepFirstVisibleRowCompleteChanged:function(){this.updateVerScrollBarMaximum();this._updateContent();},_onAppear:function(){this._startInterval(this.getScrollTimeout());},_onDisappear:function(){this._stopInterval();},_onScrollX:function(e){var cb=e.getData();this.fireDataEvent(o,cb,e.getOldData());this.__xh.scrollToX(cb);this.__xi.scrollToX(cb);},_onScrollY:function(e){this.fireDataEvent(E,e.getData(),e.getOldData());this._postponedUpdateContent();},_onMousewheel:function(e){var cc=this.getTable();if(!cc.getEnabled()){return;}var ce=qx.bom.client.Engine.GECKO?1:3;var cd=this.__xd.getPosition()+((e.getWheelDelta()*ce)*cc.getRowHeight());this.__xd.scrollTo(cd);if(this.__xA&&this.getFocusCellOnMouseMove()){this._focusCellAtPagePos(this.__xA,this.__xB);}e.stop();},__xH:function(cf){var ck=this.getTable();var cl=this.__xe.getHeaderWidgetAtColumn(this.__xu);var cg=cl.getSizeHint().minWidth;var ci=Math.max(cg,this.__xw+cf-this.__xv);if(this.getLiveResize()){var ch=ck.getTableColumnModel();ch.setColumnWidth(this.__xu,ci,true);}else{this.__xe.setColumnWidth(this.__xu,ci,true);var cj=this.getTablePaneModel();this._showResizeLine(cj.getColumnLeft(this.__xu)+ci);}this.__xv+=ci-this.__xw;this.__xw=ci;},__xI:function(cm){var cn=qx.ui.table.pane.Scroller.CLICK_TOLERANCE;if(this.__xe.isShowingColumnMoveFeedback()||cm>this.__xt+cn||cm<this.__xt-cn){this.__xq+=cm-this.__xt;this.__xe.showColumnMoveFeedback(this.__xp,this.__xq);var co=this.__xb.getTablePaneScrollerAtPageX(cm);if(this.__xs&&this.__xs!=co){this.__xs.hideColumnMoveFeedback();}if(co!=null){this.__xr=co.showColumnMoveFeedback(cm);}else{this.__xr=null;}this.__xs=co;this.__xt=cm;}},_onMousemoveHeader:function(e){var cv=this.getTable();if(!cv.getEnabled()){return;}var cw=false;var cp=null;var ct=e.getDocumentLeft();var cu=e.getDocumentTop();this.__xA=ct;this.__xB=cu;if(this.__xu!=null){this.__xH(ct);cw=true;e.stopPropagation();}else if(this.__xp!=null){this.__xI(ct);e.stopPropagation();}else{var cq=this._getResizeColumnForPageX(ct);if(cq!=-1){cw=true;}else{var cs=cv.getTableModel();var cx=this._getColumnForPageX(ct);if(cx!=null&&cs.isColumnSortable(cx)){cp=cx;}}}var cr=cw?D:null;this.getApplicationRoot().setGlobalCursor(cr);this.setCursor(cr);this.__xe.setMouseOverColumn(cp);},_onMousemovePane:function(e){var cy=this.getTable();if(!cy.getEnabled()){return;}var cA=e.getDocumentLeft();var cB=e.getDocumentTop();this.__xA=cA;this.__xB=cB;var cz=this._getRowForPagePos(cA,cB);if(cz!=null&&this._getColumnForPageX(cA)!=null){if(this.getFocusCellOnMouseMove()){this._focusCellAtPagePos(cA,cB);}}this.__xe.setMouseOverColumn(null);},_onMousedownHeader:function(e){if(!this.getTable().getEnabled()){return;}var cD=e.getDocumentLeft();var cE=this._getResizeColumnForPageX(cD);if(cE!=-1){this._startResizeHeader(cE,cD);e.stop();}else{var cC=this._getColumnForPageX(cD);if(cC!=null){this._startMoveHeader(cC,cD);e.stop();}}},_startResizeHeader:function(cF,cG){var cH=this.getTable().getTableColumnModel();this.__xu=cF;this.__xv=cG;this.__xw=cH.getColumnWidth(this.__xu);this.__xh.capture();},_startMoveHeader:function(cI,cJ){this.__xp=cI;this.__xt=cJ;this.__xq=this.getTablePaneModel().getColumnLeft(cI);this.__xh.capture();},_onMousedownPane:function(e){var cN=this.getTable();if(!cN.getEnabled()){return;}if(cN.isEditing()){cN.stopEditing();}var cK=e.getDocumentLeft();var cM=e.getDocumentTop();var cP=this._getRowForPagePos(cK,cM);var cO=this._getColumnForPageX(cK);if(cP!==null){this.__xx={row:cP,col:cO};this.__xy=false;var cL=this.getSelectBeforeFocus();if(cL){cN.getSelectionManager().handleMouseDown(cP,e);}if(!this.getFocusCellOnMouseMove()){this._focusCellAtPagePos(cK,cM);}if(!cL){cN.getSelectionManager().handleMouseDown(cP,e);}}},_onMouseupFocusIndicator:function(e){if(this.__xx&&!this.__xy&&!this.isEditing()&&this.__xj.getRow()==this.__xx.row&&this.__xj.getColumn()==this.__xx.col){this.fireEvent(be,qx.ui.table.pane.CellEvent,[this,e,this.__xx.row,this.__xx.col],true);this.__xy=true;}else if(!this.isEditing()){this._onMousedownPane(e);}},_onChangeCaptureHeader:function(e){if(this.__xu!=null){this._stopResizeHeader();}if(this.__xp!=null){this._stopMoveHeader();}},_stopResizeHeader:function(){var cQ=this.getTable().getTableColumnModel();if(!this.getLiveResize()){this._hideResizeLine();cQ.setColumnWidth(this.__xu,this.__xw,true);}this.__xu=null;this.__xh.releaseCapture();this.getApplicationRoot().setGlobalCursor(null);this.setCursor(null);if(this.isEditing()){var cR=this.__xE.getBounds().height;this.__xE.setUserBounds(0,0,this.__xw,cR);}},_stopMoveHeader:function(){var cW=this.getTable().getTableColumnModel();var cX=this.getTablePaneModel();this.__xe.hideColumnMoveFeedback();if(this.__xs){this.__xs.hideColumnMoveFeedback();}if(this.__xr!=null){var da=cX.getFirstColumnX()+cX.getX(this.__xp);var cV=this.__xr;if(cV!=da&&cV!=da+1){var cY=cW.getVisibleColumnAtX(da);var cU=cW.getVisibleColumnAtX(cV);var cT=cW.getOverallX(cY);var cS=(cU!=null)?cW.getOverallX(cU):cW.getOverallColumnCount();if(cS>cT){cS--;}cW.moveColumn(cT,cS);this._updateFocusIndicator();}}this.__xp=null;this.__xr=null;this.__xh.releaseCapture();},_onMouseupPane:function(e){var db=this.getTable();if(!db.getEnabled()){return;}var dc=this._getRowForPagePos(e.getDocumentLeft(),e.getDocumentTop());if(dc!=-1&&dc!=null&&this._getColumnForPageX(e.getDocumentLeft())!=null){db.getSelectionManager().handleMouseUp(dc,e);}},_onMouseupHeader:function(e){var dd=this.getTable();if(!dd.getEnabled()){return;}if(this.__xu!=null){this._stopResizeHeader();this.__xz=true;e.stop();}else if(this.__xp!=null){this._stopMoveHeader();e.stop();}},_onClickHeader:function(e){if(this.__xz){this.__xz=false;return;}var di=this.getTable();if(!di.getEnabled()){return;}var dg=di.getTableModel();var dh=e.getDocumentLeft();var df=this._getResizeColumnForPageX(dh);if(df==-1){var dl=this._getColumnForPageX(dh);if(dl!=null&&dg.isColumnSortable(dl)){var de=dg.getSortColumnIndex();var dj=(dl!=de)?true:!dg.isSortAscending();var dk={column:dl,ascending:dj,clickEvent:e};if(this.fireDataEvent(J,dk,null,true)){dg.sortByColumn(dl,dj);if(this.getResetSelectionOnHeaderClick()){di.getSelectionModel().resetSelection();}}}}e.stop();},_onClickPane:function(e){var dm=this.getTable();if(!dm.getEnabled()){return;}var dq=e.getDocumentLeft();var dr=e.getDocumentTop();var dn=this._getRowForPagePos(dq,dr);var dp=this._getColumnForPageX(dq);if(dn!=null&&dp!=null){dm.getSelectionManager().handleClick(dn,e);if(this.__xj.isHidden()||(this.__xx&&!this.__xy&&!this.isEditing()&&dn==this.__xx.row&&dp==this.__xx.col)){this.fireEvent(be,qx.ui.table.pane.CellEvent,[this,e,dn,dp],true);this.__xy=true;}}},_onContextMenu:function(e){var dv=e.getDocumentLeft();var dw=e.getDocumentTop();var dt=this._getRowForPagePos(dv,dw);var du=this._getColumnForPageX(dv);if(this.__xj.isHidden()||(this.__xx&&dt==this.__xx.row&&du==this.__xx.col)){this.fireEvent(U,qx.ui.table.pane.CellEvent,[this,e,dt,du],true);var ds=this.getTable().getContextMenu();if(ds){if(ds.getChildren().length>0){ds.openAtMouse(e);}else{ds.exclude();}e.preventDefault();}}},_onContextMenuOpen:function(e){},_onDblclickPane:function(e){var dy=e.getDocumentLeft();var dz=e.getDocumentTop();this._focusCellAtPagePos(dy,dz);this.startEditing();var dx=this._getRowForPagePos(dy,dz);if(dx!=-1&&dx!=null){this.fireEvent(S,qx.ui.table.pane.CellEvent,[this,e,dx],true);}},_onMouseout:function(e){var dA=this.getTable();if(!dA.getEnabled()){return;}if(this.__xu==null){this.setCursor(null);this.getApplicationRoot().setGlobalCursor(null);}this.__xe.setMouseOverColumn(null);},_showResizeLine:function(x){var dC=this._showChildControl(l);var dB=dC.getWidth();var dD=this.__xi.getBounds();dC.setUserBounds(x-Math.round(dB/2),0,dB,dD.height);},_hideResizeLine:function(){this._excludeChildControl(l);},showColumnMoveFeedback:function(dE){var dN=this.getTablePaneModel();var dM=this.getTable().getTableColumnModel();var dH=this.__xf.getContainerLocation().left;var dL=dN.getColumnCount();var dI=0;var dG=0;var dQ=dH;for(var dF=0;dF<dL;dF++){var dJ=dN.getColumnAtX(dF);var dO=dM.getColumnWidth(dJ);if(dE<dQ+dO/2){break;}dQ+=dO;dI=dF+1;dG=dQ-dH;}var dK=this.__xi.getContainerLocation().left;var dP=this.__xi.getBounds().width;var scrollX=dK-dH;dG=qx.lang.Number.limit(dG,scrollX+2,scrollX+dP-1);this._showResizeLine(dG);return dN.getFirstColumnX()+dI;},hideColumnMoveFeedback:function(){this._hideResizeLine();},_focusCellAtPagePos:function(dR,dS){var dU=this._getRowForPagePos(dR,dS);if(dU!=-1&&dU!=null){var dT=this._getColumnForPageX(dR);this.__xb.setFocusedCell(dT,dU);}},setFocusedCell:function(dV,dW){if(!this.isEditing()){this.__xf.setFocusedCell(dV,dW,this.__xn);this.__xC=dV;this.__xD=dW;this._updateFocusIndicator();}},getFocusedColumn:function(){return this.__xC;},getFocusedRow:function(){return this.__xD;},scrollCellVisible:function(dX,dY){var ej=this.getTablePaneModel();var ea=ej.getX(dX);if(ea!=-1){var eg=this.__xi.getInnerSize();if(!eg){return;}var eh=this.getTable().getTableColumnModel();var ed=ej.getColumnLeft(dX);var ek=eh.getColumnWidth(dX);var eb=this.getTable().getRowHeight();var el=dY*eb;var scrollX=this.getScrollX();var scrollY=this.getScrollY();var ei=Math.min(ed,ed+ek-eg.width);var ef=ed;this.setScrollX(Math.max(ei,Math.min(ef,scrollX)));var ec=el+eb-eg.height;if(this.getTable().getKeepFirstVisibleRowComplete()){ec+=eb;}var ee=el;this.setScrollY(Math.max(ec,Math.min(ee,scrollY)),true);}},isEditing:function(){return this.__xE!=null;},startEditing:function(){var eq=this.getTable();var eo=eq.getTableModel();var es=this.__xC;if(!this.isEditing()&&(es!=null)&&eo.isColumnEditable(es)){var et=this.__xD;var em=this.getTablePaneModel().getX(es);var en=eo.getValue(es,et);this.__xF=eq.getTableColumnModel().getCellEditorFactory(es);var ep={col:es,row:et,xPos:em,value:en,table:eq};this.__xE=this.__xF.createCellEditor(ep);if(this.__xE===null){return false;}else if(this.__xE instanceof qx.ui.window.Window){this.__xE.setModal(true);this.__xE.setShowClose(false);this.__xE.addListener(K,this._onCellEditorModalWindowClose,this);var f=eq.getModalCellEditorPreOpenFunction();if(f!=null){f(this.__xE,ep);}this.__xE.open();}else{var er=this.__xj.getInnerSize();this.__xE.setUserBounds(0,0,er.width,er.height);this.__xj.addListener(k,function(e){this.__xx={row:this.__xD,col:this.__xC};e.stopPropagation();},this);this.__xj.add(this.__xE);this.__xj.addState(bi);this.__xj.setKeepActive(false);this.__xj.setDecorator(bm);this.__xE.focus();this.__xE.activate();}return true;}return false;},stopEditing:function(){if(!this.getShowCellFocusIndicator()){this.__xj.setDecorator(null);}this.flushEditor();this.cancelEditing();},flushEditor:function(){if(this.isEditing()){var ev=this.__xF.getCellEditorValue(this.__xE);var eu=this.getTable().getTableModel().getValue(this.__xC,this.__xD);this.getTable().getTableModel().setValue(this.__xC,this.__xD,ev);this.__xb.focus();this.__xb.fireDataEvent(Q,{row:this.__xD,col:this.__xC,oldValue:eu,value:ev});}},cancelEditing:function(){if(this.isEditing()&&!this.__xE.pendingDispose){if(this._cellEditorIsModalWindow){this.__xE.destroy();this.__xE=null;this.__xF=null;this.__xE.pendingDispose=true;}else{this.__xj.removeState(bi);this.__xj.setKeepActive(true);this.__xE.destroy();this.__xE=null;this.__xF=null;}}},_onCellEditorModalWindowClose:function(e){this.stopEditing();},_getColumnForPageX:function(ew){var ez=this.getTable().getTableColumnModel();var eA=this.getTablePaneModel();var ey=eA.getColumnCount();var eC=this.__xe.getContainerLocation().left;for(var x=0;x<ey;x++){var ex=eA.getColumnAtX(x);var eB=ez.getColumnWidth(ex);eC+=eB;if(ew<eC){return ex;}}return null;},_getResizeColumnForPageX:function(eD){var eH=this.getTable().getTableColumnModel();var eI=this.getTablePaneModel();var eG=eI.getColumnCount();var eK=this.__xe.getContainerLocation().left;var eE=qx.ui.table.pane.Scroller.RESIZE_REGION_RADIUS;for(var x=0;x<eG;x++){var eF=eI.getColumnAtX(x);var eJ=eH.getColumnWidth(eF);eK+=eJ;if(eD>=(eK-eE)&&eD<=(eK+eE)){return eF;}}return -1;},_getRowForPagePos:function(eL,eM){var eN=this.__xf.getContentLocation();if(eL<eN.left||eL>eN.right){return null;}if(eM>=eN.top&&eM<=eN.bottom){var eO=this.getTable().getRowHeight();var scrollY=this.__xd.getPosition();if(this.getTable().getKeepFirstVisibleRowComplete()){scrollY=Math.floor(scrollY/eO)*eO;}var eR=scrollY+eM-eN.top;var eT=Math.floor(eR/eO);var eS=this.getTable().getTableModel();var eP=eS.getRowCount();return (eT<eP)?eT:null;}var eQ=this.__xe.getContainerLocation();if(eM>=eQ.top&&eM<=eQ.bottom&&eL<=eQ.right){return -1;}return null;},setTopRightWidget:function(eU){var eV=this.__xG;if(eV!=null){this.__xg.remove(eV);}if(eU!=null){this.__xg.add(eU);}this.__xG=eU;},getTopRightWidget:function(){return this.__xG;},getHeader:function(){return this.__xe;},getTablePane:function(){return this.__xf;},getVerticalScrollBarWidth:function(){var eW=this.__xd;return eW.isVisible()?(eW.getSizeHint().width||0):0;},getNeededScrollBars:function(eX,eY){var ff=this.__xd.getSizeHint().width;var fg=this.__xi.getInnerSize();var fa=fg?fg.width:0;if(this.getVerticalScrollBarVisible()){fa+=ff;}var fj=fg?fg.height:0;if(this.getHorizontalScrollBarVisible()){fj+=ff;}var fd=this.getTable().getTableModel();var fh=fd.getRowCount();var fk=this.getTablePaneModel().getTotalWidth();var fi=this.getTable().getRowHeight()*fh;var fc=false;var fl=false;if(fk>fa){fc=true;if(fi>fj-ff){fl=true;}}else if(fi>fj){fl=true;if(!eY&&(fk>fa-ff)){fc=true;}}var fe=qx.ui.table.pane.Scroller.HORIZONTAL_SCROLLBAR;var fb=qx.ui.table.pane.Scroller.VERTICAL_SCROLLBAR;return ((eX||fc)?fe:0)|((eY||!fl)?0:fb);},getPaneClipper:function(){return this.__xi;},_applyScrollTimeout:function(fm,fn){this._startInterval(fm);},_startInterval:function(fo){this.__xk.setInterval(fo);this.__xk.start();},_stopInterval:function(){this.__xk.stop();},_postponedUpdateContent:function(){this._updateContent();},_oninterval:qx.event.GlobalError.observeMethod(function(){if(this.__xn&&!this.__xf._layoutPending){this.__xn=false;this._updateContent();}}),_updateContent:function(){var ft=this.__xi.getInnerSize();if(!ft){return;}var fw=ft.height;var scrollX=this.__xc.getPosition();var scrollY=this.__xd.getPosition();var fq=this.getTable().getRowHeight();var fr=Math.floor(scrollY/fq);var fv=this.__xf.getFirstVisibleRow();this.__xf.setFirstVisibleRow(fr);var fs=Math.ceil(fw/fq);var fp=0;var fu=this.getTable().getKeepFirstVisibleRowComplete();if(!fu){fs++;fp=scrollY%fq;}this.__xf.setVisibleRowCount(fs);if(fr!=fv){this._updateFocusIndicator();}this.__xi.scrollToX(scrollX);if(!fu){this.__xi.scrollToY(fp);}},_updateFocusIndicator:function(){var fx=this.getTable();if(!fx.getEnabled()){return;}this.__xj.moveToCell(this.__xC,this.__xD);}},destruct:function(){this._stopInterval();var fy=this.getTablePaneModel();if(fy){fy.dispose();}this.__xx=this.__xG=this.__xb=null;this._disposeObjects(u,M,s,t,T,bb,a,I,C);}});})();(function(){var a="qx.ui.table.pane.Clipper";qx.Class.define(a,{extend:qx.ui.container.Composite,construct:function(){qx.ui.container.Composite.call(this,new qx.ui.layout.Grow());this.setMinWidth(0);},members:{scrollToX:function(b){this.getContentElement().scrollToX(b,false);},scrollToY:function(c){this.getContentElement().scrollToY(c,true);}}});})();(function(){var g="Integer",f="Escape",d="keypress",c="Enter",b="excluded",a="qx.ui.table.pane.FocusIndicator";qx.Class.define(a,{extend:qx.ui.container.Composite,construct:function(h){qx.ui.container.Composite.call(this);this.__xJ=h;this.setKeepActive(true);this.addListener(d,this._onKeyPress,this);},properties:{visibility:{refine:true,init:b},row:{check:g,nullable:true},column:{check:g,nullable:true}},members:{__xJ:null,_onKeyPress:function(e){var i=e.getKeyIdentifier();if(i!==f&&i!==c){e.stopPropagation();}},moveToCell:function(j,k){if(!this.__xJ.getShowCellFocusIndicator()&&!this.__xJ.getTable().getTableModel().isColumnEditable(j)){this.exclude();return;}else{this.show();}if(j==null){this.hide();this.setRow(null);this.setColumn(null);}else{var l=this.__xJ.getTablePaneModel().getX(j);if(l==-1){this.hide();this.setRow(null);this.setColumn(null);}else{var q=this.__xJ.getTable();var o=q.getTableColumnModel();var p=this.__xJ.getTablePaneModel();var n=this.__xJ.getTablePane().getFirstVisibleRow();var m=q.getRowHeight();this.setUserBounds(p.getColumnLeft(j)-2,(k-n)*m-2,o.getColumnWidth(j)+3,m+3);this.show();this.setRow(k);this.setColumn(j);}}}},destruct:function(){this.__xJ=null;}});})();(function(){var b="Integer",a="qx.ui.table.pane.CellEvent";qx.Class.define(a,{extend:qx.event.type.Mouse,properties:{row:{check:b,nullable:true},column:{check:b,nullable:true}},members:{init:function(c,d,e,f){d.clone(this);this.setBubbles(false);if(e!=null){this.setRow(e);}else{this.setRow(c._getRowForPagePos(this.getDocumentLeft(),this.getDocumentTop()));}if(f!=null){this.setColumn(f);}else{this.setColumn(c._getColumnForPageX(this.getDocumentLeft()));}},clone:function(g){var h=qx.event.type.Mouse.prototype.clone.call(this,g);h.set({row:this.getRow(),column:this.getColumn()});return h;}}});})();(function(){var a="qx.lang.Number";qx.Class.define(a,{statics:{isInRange:function(b,c,d){return b>=c&&b<=d;},isBetweenRange:function(e,f,g){return e>f&&e<g;},limit:function(h,i,j){if(j!=null&&h>j){return j;}else if(i!=null&&h<i){return i;}else{return h;}}}});})();(function(){var l="move",k="Boolean",j="mouseup",i="mousedown",h="losecapture",g="qx.ui.core.MMovable",f="__Y",d="__ba",c="mousemove",b="maximized",a="move-frame";qx.Mixin.define(g,{properties:{movable:{check:k,init:true},useMoveFrame:{check:k,init:false}},members:{__Y:null,__ba:null,__bb:null,__bc:null,__bd:null,__be:null,__bf:null,__bg:false,__bh:null,__bi:0,_activateMoveHandle:function(m){if(this.__Y){throw new Error("The move handle could not be redefined!");}this.__Y=m;m.addListener(i,this._onMoveMouseDown,this);m.addListener(j,this._onMoveMouseUp,this);m.addListener(c,this._onMoveMouseMove,this);m.addListener(h,this.__bm,this);},__bj:function(){var n=this.__ba;if(!n){n=this.__ba=new qx.ui.core.Widget();n.setAppearance(a);n.exclude();qx.core.Init.getApplication().getRoot().add(n);}return n;},__bk:function(){var location=this.getContainerLocation();var p=this.getBounds();var o=this.__bj();o.setUserBounds(location.left,location.top,p.width,p.height);o.show();o.setZIndex(this.getZIndex()+1);},__bl:function(e){var r=this.__bb;var u=Math.max(r.left,Math.min(r.right,e.getDocumentLeft()));var t=Math.max(r.top,Math.min(r.bottom,e.getDocumentTop()));var q=this.__bc+u;var s=this.__bd+t;return {viewportLeft:q,viewportTop:s,parentLeft:q-this.__be,parentTop:s-this.__bf};},_onMoveMouseDown:function(e){if(!this.getMovable()||this.hasState(b)){return;}var parent=this.getLayoutParent();var w=parent.getContentLocation();var x=parent.getBounds();if(qx.Class.implementsInterface(parent,qx.ui.window.IDesktop)){if(!parent.isContentBlocked()){this.__bh=parent.getBlockerColor();this.__bi=parent.getBlockerOpacity();parent.setBlockerColor(null);parent.setBlockerOpacity(1);parent.blockContent(this.getZIndex()-1);this.__bg=true;}}this.__bb={left:w.left,top:w.top,right:w.left+x.width,bottom:w.top+x.height};var v=this.getContainerLocation();this.__be=w.left;this.__bf=w.top;this.__bc=v.left-e.getDocumentLeft();this.__bd=v.top-e.getDocumentTop();this.addState(l);this.__Y.capture();if(this.getUseMoveFrame()){this.__bk();}e.stop();},_onMoveMouseMove:function(e){if(!this.hasState(l)){return;}var y=this.__bl(e);if(this.getUseMoveFrame()){this.__bj().setDomPosition(y.viewportLeft,y.viewportTop);}else{this.setDomPosition(y.parentLeft,y.parentTop);}e.stopPropagation();},_onMoveMouseUp:function(e){if(!this.hasState(l)){return;}this.removeState(l);var parent=this.getLayoutParent();if(qx.Class.implementsInterface(parent,qx.ui.window.IDesktop)){if(this.__bg){parent.unblockContent();parent.setBlockerColor(this.__bh);parent.setBlockerOpacity(this.__bi);this.__bh=null;this.__bi=0;this.__bg=false;}}this.__Y.releaseCapture();var z=this.__bl(e);this.setLayoutProperties({left:z.parentLeft,top:z.parentTop});if(this.getUseMoveFrame()){this.__bj().exclude();}e.stopPropagation();},__bm:function(e){if(!this.hasState(l)){return;}this.removeState(l);if(this.getUseMoveFrame()){this.__bj().exclude();}}},destruct:function(){this._disposeObjects(d,f);this.__bb=null;}});})();(function(){var k="Boolean",j="resize",i="mousedown",h="w-resize",g="sw-resize",f="n-resize",d="resizableRight",c="ne-resize",b="se-resize",a="Integer",z="e-resize",y="resizableLeft",x="mousemove",w="move",v="shorthand",u="maximized",t="nw-resize",s="mouseout",r="qx.ui.core.MResizable",q="mouseup",o="losecapture",p="resize-frame",m="resizableBottom",n="s-resize",l="resizableTop";qx.Mixin.define(r,{construct:function(){this.addListener(i,this.__bz,this,true);this.addListener(q,this.__bA,this);this.addListener(x,this.__bC,this);this.addListener(s,this.__bD,this);this.addListener(o,this.__bB,this);var A=this.getContainerElement().getDomElement();if(A==null){A=window;}this.__bn=qx.event.Registration.getManager(A).getHandler(qx.event.handler.DragDrop);},properties:{resizableTop:{check:k,init:true},resizableRight:{check:k,init:true},resizableBottom:{check:k,init:true},resizableLeft:{check:k,init:true},resizable:{group:[l,d,m,y],mode:v},resizeSensitivity:{check:a,init:5},useResizeFrame:{check:k,init:true}},members:{__bn:null,__bo:null,__bp:null,__bq:null,__br:null,__bs:null,__bt:null,RESIZE_TOP:1,RESIZE_BOTTOM:2,RESIZE_LEFT:4,RESIZE_RIGHT:8,__bu:function(){var B=this.__bo;if(!B){B=this.__bo=new qx.ui.core.Widget();B.setAppearance(p);B.exclude();qx.core.Init.getApplication().getRoot().add(B);}return B;},__bv:function(){var D=this.__bs;var C=this.__bu();C.setUserBounds(D.left,D.top,D.width,D.height);C.show();C.setZIndex(this.getZIndex()+1);},__bw:function(e){var F=this.__bp;var G=this.getSizeHint();var J=this.__bt;var I=this.__bs;var E=I.width;var H=I.height;var L=I.left;var top=I.top;var K;if((F&this.RESIZE_TOP)||(F&this.RESIZE_BOTTOM)){K=Math.max(J.top,Math.min(J.bottom,e.getDocumentTop()))-this.__br;if(F&this.RESIZE_TOP){H-=K;}else{H+=K;}if(H<G.minHeight){H=G.minHeight;}else if(H>G.maxHeight){H=G.maxHeight;}if(F&this.RESIZE_TOP){top+=I.height-H;}}if((F&this.RESIZE_LEFT)||(F&this.RESIZE_RIGHT)){K=Math.max(J.left,Math.min(J.right,e.getDocumentLeft()))-this.__bq;if(F&this.RESIZE_LEFT){E-=K;}else{E+=K;}if(E<G.minWidth){E=G.minWidth;}else if(E>G.maxWidth){E=G.maxWidth;}if(F&this.RESIZE_LEFT){L+=I.width-E;}}return {viewportLeft:L,viewportTop:top,parentLeft:I.bounds.left+L-I.left,parentTop:I.bounds.top+top-I.top,width:E,height:H};},__bx:{1:f,2:n,4:h,8:z,5:t,6:g,9:c,10:b},__by:function(e){var O=this.getContentLocation();var M=this.getResizeSensitivity();var Q=e.getDocumentLeft();var P=e.getDocumentTop();var N=0;if(this.getResizableTop()&&Math.abs(O.top-P)<M){N+=this.RESIZE_TOP;}else if(this.getResizableBottom()&&Math.abs(O.bottom-P)<M){N+=this.RESIZE_BOTTOM;}if(this.getResizableLeft()&&Math.abs(O.left-Q)<M){N+=this.RESIZE_LEFT;}else if(this.getResizableRight()&&Math.abs(O.right-Q)<M){N+=this.RESIZE_RIGHT;}this.__bp=N;},__bz:function(e){if(!this.__bp){return;}this.addState(j);this.__bq=e.getDocumentLeft();this.__br=e.getDocumentTop();var location=this.getContainerLocation();var T=this.getBounds();this.__bs={top:location.top,left:location.left,width:T.width,height:T.height,bounds:qx.lang.Object.clone(T)};var parent=this.getLayoutParent();var R=parent.getContentLocation();var S=parent.getBounds();this.__bt={left:R.left,top:R.top,right:R.left+S.width,bottom:R.top+S.height};if(this.getUseResizeFrame()){this.__bv();}this.capture();e.stop();},__bA:function(e){if(!this.hasState(j)){return;}if(this.getUseResizeFrame()){this.__bu().exclude();}var U=this.__bw(e);this.setWidth(U.width);this.setHeight(U.height);if(this.getResizableLeft()||this.getResizableTop()){this.setLayoutProperties({left:U.parentLeft,top:U.parentTop});}this.__bp=0;this.removeState(j);this.resetCursor();this.getApplicationRoot().resetGlobalCursor();this.releaseCapture();e.stopPropagation();},__bB:function(e){if(!this.__bp){return;}this.resetCursor();this.getApplicationRoot().resetGlobalCursor();this.removeState(w);if(this.getUseResizeFrame()){this.__bu().exclude();}},__bC:function(e){if(this.hasState(j)){var Y=this.__bw(e);if(this.getUseResizeFrame()){var W=this.__bu();W.setUserBounds(Y.viewportLeft,Y.viewportTop,Y.width,Y.height);}else{this.setWidth(Y.width);this.setHeight(Y.height);if(this.getResizableLeft()||this.getResizableTop()){this.setLayoutProperties({left:Y.parentLeft,top:Y.parentTop});}}e.stopPropagation();}else if(!this.hasState(u)&&!this.__bn.isSessionActive()){this.__by(e);var ba=this.__bp;var X=this.getApplicationRoot();if(ba){var V=this.__bx[ba];this.setCursor(V);X.setGlobalCursor(V);}else if(this.getCursor()){this.resetCursor();X.resetGlobalCursor();}}},__bD:function(e){if(this.getCursor()&&!this.hasState(j)){this.resetCursor();this.getApplicationRoot().resetGlobalCursor();}}},destruct:function(){if(this.__bo!=null&&!qx.core.ObjectRegistry.inShutDown){this.__bo.destroy();this.__bo=null;}this.__bn=null;}});})();(function(){var a="qx.ui.window.IWindowManager";qx.Interface.define(a,{members:{setDesktop:function(b){this.assertInterface(b,qx.ui.window.IDesktop);},changeActiveWindow:function(c,d){},updateStack:function(){},bringToFront:function(e){this.assertInstance(e,qx.ui.window.Window);},sendToBack:function(f){this.assertInstance(f,qx.ui.window.Window);}}});})();(function(){var b="__X",a="qx.ui.window.Manager";qx.Class.define(a,{extend:qx.core.Object,implement:qx.ui.window.IWindowManager,members:{__X:null,setDesktop:function(c){this.__X=c;this.updateStack();},getDesktop:function(){return this.__X;},changeActiveWindow:function(d,e){if(d){this.bringToFront(d);d.setActive(true);}if(e){e.resetActive();}},_minZIndex:1e5,updateStack:function(){qx.ui.core.queue.Widget.add(this);},syncWidget:function(){this.__X.forceUnblockContent();var f=this.__X.getWindows();var h=this._minZIndex;var m=h+f.length*2;var j=h+f.length*4;var k=null;for(var i=0,l=f.length;i<l;i++){var g=f[i];if(!g.isVisible()){continue;}k=k||g;if(g.isModal()){g.setZIndex(j);this.__X.blockContent(j-1);j+=2;k=g;}else if(g.isAlwaysOnTop()){g.setZIndex(m);m+=2;}else{g.setZIndex(h);h+=2;}if(!k.isModal()&&g.isActive()||g.getZIndex()>k.getZIndex()){k=g;}}this.__X.setActiveWindow(k);},bringToFront:function(n){var o=this.__X.getWindows();var p=qx.lang.Array.remove(o,n);if(p){o.push(n);this.updateStack();}},sendToBack:function(q){var r=this.__X.getWindows();var s=qx.lang.Array.remove(r,q);if(s){r.unshift(q);this.updateStack();}}},destruct:function(){this._disposeObjects(b);}});})();(function(){var k="Boolean",j="qx.event.type.Event",i="captionbar",h="_applyCaptionBarChange",g="maximize-button",f="restore-button",d="minimize-button",c="close-button",b="maximized",a="execute",Q="pane",P="title",O="icon",N="statusbar-text",M="statusbar",L="String",K="normal",J="active",I="beforeClose",H="beforeMinimize",r="mousedown",s="changeStatus",p="changeIcon",q="excluded",n="dblclick",o="_applyActive",l="beforeRestore",m="minimize",t="changeModal",u="changeAlwaysOnTop",z="_applyShowStatusbar",y="_applyStatus",B="qx.ui.window.Window",A="changeCaption",D="focusout",C="beforeMaximize",w="maximize",G="restore",F="window",E="close",v="changeActive",x="minimized";qx.Class.define(B,{extend:qx.ui.core.Widget,include:[qx.ui.core.MRemoteChildrenHandling,qx.ui.core.MRemoteLayoutHandling,qx.ui.core.MResizable,qx.ui.core.MMovable,qx.ui.core.MContentPadding],construct:function(R,S){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.VBox());this._createChildControl(i);this._createChildControl(Q);if(S!=null){this.setIcon(S);}if(R!=null){this.setCaption(R);}this._updateCaptionBar();this.addListener(r,this._onWindowMouseDown,this,true);this.addListener(D,this._onWindowFocusOut,this);qx.core.Init.getApplication().getRoot().add(this);this.initVisibility();qx.ui.core.FocusHandler.getInstance().addRoot(this);},statics:{DEFAULT_MANAGER_CLASS:qx.ui.window.Manager},events:{"beforeClose":j,"close":j,"beforeMinimize":j,"minimize":j,"beforeMaximize":j,"maximize":j,"beforeRestore":j,"restore":j},properties:{appearance:{refine:true,init:F},visibility:{refine:true,init:q},focusable:{refine:true,init:true},active:{check:k,init:false,apply:o,event:v},alwaysOnTop:{check:k,init:false,event:u},modal:{check:k,init:false,event:t},caption:{apply:h,event:A,nullable:true},icon:{check:L,nullable:true,apply:h,event:p,themeable:true},status:{check:L,nullable:true,apply:y,event:s},showClose:{check:k,init:true,apply:h,themeable:true},showMaximize:{check:k,init:true,apply:h,themeable:true},showMinimize:{check:k,init:true,apply:h,themeable:true},allowClose:{check:k,init:true,apply:h},allowMaximize:{check:k,init:true,apply:h},allowMinimize:{check:k,init:true,apply:h},showStatusbar:{check:k,init:false,apply:z}},members:{__V:null,__W:null,getChildrenContainer:function(){return this.getChildControl(Q);},_forwardStates:{active:true,maximized:true},setLayoutParent:function(parent){{};qx.ui.core.Widget.prototype.setLayoutParent.call(this,parent);},_createChildControlImpl:function(T,U){var V;switch(T){case M:V=new qx.ui.container.Composite(new qx.ui.layout.HBox());this._add(V);V.add(this.getChildControl(N));break;case N:V=new qx.ui.basic.Label();V.setValue(this.getStatus());break;case Q:V=new qx.ui.container.Composite();this._add(V,{flex:1});break;case i:var X=new qx.ui.layout.Grid();X.setRowFlex(0,1);X.setColumnFlex(1,1);V=new qx.ui.container.Composite(X);this._add(V);V.addListener(n,this._onCaptionMouseDblClick,this);this._activateMoveHandle(V);break;case O:V=new qx.ui.basic.Image(this.getIcon());this.getChildControl(i).add(V,{row:0,column:0});break;case P:V=new qx.ui.basic.Label(this.getCaption());V.setWidth(0);V.setAllowGrowX(true);var W=this.getChildControl(i);W.add(V,{row:0,column:1});break;case d:V=new qx.ui.form.Button();V.setFocusable(false);V.addListener(a,this._onMinimizeButtonClick,this);this.getChildControl(i).add(V,{row:0,column:2});break;case f:V=new qx.ui.form.Button();V.setFocusable(false);V.addListener(a,this._onRestoreButtonClick,this);this.getChildControl(i).add(V,{row:0,column:3});break;case g:V=new qx.ui.form.Button();V.setFocusable(false);V.addListener(a,this._onMaximizeButtonClick,this);this.getChildControl(i).add(V,{row:0,column:4});break;case c:V=new qx.ui.form.Button();V.setFocusable(false);V.addListener(a,this._onCloseButtonClick,this);this.getChildControl(i).add(V,{row:0,column:6});break;}return V||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,T);},_updateCaptionBar:function(){var ba;var bb=this.getIcon();if(bb){this.getChildControl(O).setSource(bb);this._showChildControl(O);}else{this._excludeChildControl(O);}var Y=this.getCaption();if(Y){this.getChildControl(P).setValue(Y);this._showChildControl(P);}else{this._excludeChildControl(P);}if(this.getShowMinimize()){this._showChildControl(d);ba=this.getChildControl(d);this.getAllowMinimize()?ba.resetEnabled():ba.setEnabled(false);}else{this._excludeChildControl(d);}if(this.getShowMaximize()){if(this.isMaximized()){this._showChildControl(f);this._excludeChildControl(g);}else{this._showChildControl(g);this._excludeChildControl(f);}ba=this.getChildControl(g);this.getAllowMaximize()?ba.resetEnabled():ba.setEnabled(false);}else{this._excludeChildControl(g);this._excludeChildControl(f);}if(this.getShowClose()){this._showChildControl(c);ba=this.getChildControl(c);this.getAllowClose()?ba.resetEnabled():ba.setEnabled(false);}else{this._excludeChildControl(c);}},close:function(){if(!this.isVisible()){return;}if(this.fireNonBubblingEvent(I,qx.event.type.Event,[false,true])){this.hide();this.fireEvent(E);}},open:function(){this.show();this.setActive(true);this.focus();},center:function(){var parent=this.getLayoutParent();if(parent){var bd=parent.getBounds();if(bd){var be=this.getSizeHint();var bc=Math.round((bd.width-be.width)/2);var top=Math.round((bd.height-be.height)/2);if(top<0){top=0;}this.moveTo(bc,top);return;}}{};},maximize:function(){if(this.isMaximized()){return;}var parent=this.getLayoutParent();if(parent!=null&&parent.supportsMaximize()){if(this.fireNonBubblingEvent(C,qx.event.type.Event,[false,true])){if(!this.isVisible()){this.open();}var bf=this.getLayoutProperties();this.__W=bf.left===undefined?0:bf.left;this.__V=bf.top===undefined?0:bf.top;this.setLayoutProperties({left:null,top:null,edge:0});this.addState(b);this._updateCaptionBar();this.fireEvent(w);}}},minimize:function(){if(!this.isVisible()){return;}if(this.fireNonBubblingEvent(H,qx.event.type.Event,[false,true])){var bg=this.getLayoutProperties();this.__W=bg.left===undefined?0:bg.left;this.__V=bg.top===undefined?0:bg.top;this.removeState(b);this.hide();this.fireEvent(m);}},restore:function(){if(this.getMode()===K){return;}if(this.fireNonBubblingEvent(l,qx.event.type.Event,[false,true])){if(!this.isVisible()){this.open();}var bh=this.__W;var top=this.__V;this.setLayoutProperties({edge:null,left:bh,top:top});this.removeState(b);this._updateCaptionBar();this.fireEvent(G);}},moveTo:function(bi,top){if(this.isMaximized()){return;}this.setLayoutProperties({left:bi,top:top});},isMaximized:function(){return this.hasState(b);},getMode:function(){if(!this.isVisible()){return x;}else{if(this.isMaximized()){return b;}else{return K;}}},_applyActive:function(bj,bk){if(bk){this.removeState(J);}else{this.addState(J);}},_getContentPaddingTarget:function(){return this.getChildControl(Q);},_applyShowStatusbar:function(bl,bm){if(bl){this._showChildControl(M);}else{this._excludeChildControl(M);}},_applyCaptionBarChange:function(bn,bo){this._updateCaptionBar();},_applyStatus:function(bp,bq){var br=this.getChildControl(N,true);if(br){br.setValue(bp);}},_onWindowEventStop:function(e){e.stopPropagation();},_onWindowMouseDown:function(e){this.setActive(true);},_onWindowFocusOut:function(e){if(this.getModal()){return;}var bs=e.getRelatedTarget();if(bs!=null&&!qx.ui.core.Widget.contains(this,bs)){this.setActive(false);}},_onCaptionMouseDblClick:function(e){if(this.getAllowMaximize()){this.isMaximized()?this.restore():this.maximize();}},_onMinimizeButtonClick:function(e){this.minimize();this.getChildControl(d).reset();},_onRestoreButtonClick:function(e){this.restore();this.getChildControl(f).reset();},_onMaximizeButtonClick:function(e){this.maximize();this.getChildControl(g).reset();},_onCloseButtonClick:function(e){this.close();this.getChildControl(c).reset();}}});})();(function(){var a="qx.ui.window.IDesktop";qx.Interface.define(a,{members:{setWindowManager:function(b){this.assertInterface(b,qx.ui.window.IWindowManager);},getWindows:function(){},supportsMaximize:function(){},blockContent:function(c){this.assertInteger(c);},unblockContent:function(){},isContentBlocked:function(){}}});})();(function(){var h="headerCellRendererChanged",g="visibilityChangedPre",f="Number",e="qx.event.type.Event",d="_applyFirstColumnX",c="Integer",b="qx.ui.table.pane.Model",a="_applyMaxColumnCount";qx.Class.define(b,{extend:qx.core.Object,construct:function(i){qx.core.Object.call(this);this.setTableColumnModel(i);},events:{"modelChanged":e},statics:{EVENT_TYPE_MODEL_CHANGED:"modelChanged"},properties:{firstColumnX:{check:c,init:0,apply:d},maxColumnCount:{check:f,init:-1,apply:a}},members:{__xK:null,__xL:null,_applyFirstColumnX:function(j,k){this.__xK=null;this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);},_applyMaxColumnCount:function(l,m){this.__xK=null;this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);},setTableColumnModel:function(n){if(this.__xL){this.__xL.removeListener(g,this._onColVisibilityChanged,this);this.__xL.removeListener(h,this._onColVisibilityChanged,this);}this.__xL=n;this.__xL.addListener(g,this._onColVisibilityChanged,this);this.__xL.addListener(h,this._onHeaderCellRendererChanged,this);this.__xK=null;},_onColVisibilityChanged:function(o){this.__xK=null;this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);},_onHeaderCellRendererChanged:function(p){this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);},getColumnCount:function(){if(this.__xK==null){var q=this.getFirstColumnX();var s=this.getMaxColumnCount();var r=this.__xL.getVisibleColumnCount();if(s==-1||(q+s)>r){this.__xK=r-q;}else{this.__xK=s;}}return this.__xK;},getColumnAtX:function(t){var u=this.getFirstColumnX();return this.__xL.getVisibleColumnAtX(u+t);},getX:function(v){var w=this.getFirstColumnX();var y=this.getMaxColumnCount();var x=this.__xL.getVisibleX(v)-w;if(x>=0&&(y==-1||x<y)){return x;}else{return -1;}},getColumnLeft:function(z){var C=0;var B=this.getColumnCount();for(var x=0;x<B;x++){var A=this.getColumnAtX(x);if(A==z){return C;}C+=this.__xL.getColumnWidth(A);}return -1;},getTotalWidth:function(){var D=0;var E=this.getColumnCount();for(var x=0;x<E;x++){var F=this.getColumnAtX(x);D+=this.__xL.getColumnWidth(F);}return D;}},destruct:function(){if(this.__xL){this.__xL.removeListener(g,this._onColVisibilityChanged,this);this.__xL.removeListener(h,this._onColVisibilityChanged,this);}this.__xL=null;}});})();(function(){var r="px",q=".qooxdoo-table-cell-icon {",p="abstract",o="",n="qx.ui.table.cellrenderer.AbstractImage",m=" qooxdoo-table-cell-icon",l="<div></div>",k="'",j="no-repeat",i="}",c="  text-align:center;",h="inline-block",f="static",b="top",a="  padding-top:1px;",e="title='",d="string",g="-moz-inline-box";qx.Class.define(n,{extend:qx.ui.table.cellrenderer.Abstract,type:p,construct:function(){qx.ui.table.cellrenderer.Abstract.call(this);var s=this.self(arguments);if(!s.stylesheet){s.stylesheet=qx.bom.Stylesheet.createElement(q+c+a+i);}},members:{__Hw:16,__Hx:16,__Hy:null,_insetY:2,_identifyImage:function(t){throw new Error("_identifyImage is abstract");},_getImageInfos:function(u){var v=this._identifyImage(u);if(v==null||typeof v==d){v={url:v,tooltip:null};}if(!v.imageWidth||!v.imageHeight){var w=this.__Hz(v.url);v.imageWidth=w.width;v.imageHeight=w.height;}v.width=v.imageWidth;v.height=v.imageHeight;return v;},__Hz:function(x){var A=qx.util.ResourceManager.getInstance();var z=qx.io.ImageLoader;var y,B;if(A.has(x)){y=A.getImageWidth(x);B=A.getImageHeight(x);}else if(z.isLoaded(x)){y=z.getWidth(x);B=z.getHeight(x);}else{y=this.__Hw;B=this.__Hx;}return {width:y,height:B};},createDataCellHtml:function(C,D){this.__Hy=this._getImageInfos(C);return qx.ui.table.cellrenderer.Abstract.prototype.createDataCellHtml.call(this,C,D);},_getCellClass:function(E){return qx.ui.table.cellrenderer.Abstract.prototype._getCellClass.call(this)+m;},_getContentHtml:function(F){var content=l;if(this.__Hy.url){content=qx.bom.element.Decoration.create(this.__Hy.url,j,{width:this.__Hy.width+r,height:this.__Hy.height+r,display:qx.bom.client.Engine.GECKO&&qx.bom.client.Engine.VERSION<1.9?g:h,verticalAlign:b,position:f});}return content;},_getCellAttributes:function(G){var H=this.__Hy.tooltip;if(H){return e+H+k;}else{return o;}}},destruct:function(){this.__Hy=null;}});})();(function(){var b="qx.ui.table.cellrenderer.Image",a="";qx.Class.define(b,{extend:qx.ui.table.cellrenderer.AbstractImage,construct:function(c,d){qx.ui.table.cellrenderer.AbstractImage.call(this);if(c){this.__HA=c;}if(d){this.__HB=d;}this.__HC=qx.util.AliasManager.getInstance();},members:{__HC:null,__HB:16,__HA:16,_identifyImage:function(e){var f={imageWidth:this.__HA,imageHeight:this.__HB};if(e.value==a){f.url=null;}else{f.url=this.__HC.resolve(e.value);}f.tooltip=e.tooltip;return f;}},destruct:function(){this.__HC=null;}});})();(function(){var k="Boolean",j="qx.event.type.Event",i="queued",h="String",g="sending",f="receiving",d="aborted",c="failed",b="nocache",a="completed",P="qx.io.remote.Response",O="POST",N="configured",M="timeout",L="GET",K="Pragma",J="no-url-params-on-post",I="PUT",H="no-cache",G="Cache-Control",r="Content-Type",s="text/plain",p="application/xml",q="application/json",n="text/html",o="application/x-www-form-urlencoded",l="qx.io.remote.Exchange",m="Integer",t="X-Qooxdoo-Response-Type",u="HEAD",y="qx.io.remote.Request",x="_applyResponseType",A="_applyState",z="text/javascript",C="changeState",B="_applyProhibitCaching",w="",F="_applyMethod",E="DELETE",D="boolean";qx.Class.define(y,{extend:qx.core.Object,construct:function(Q,R,S){qx.core.Object.call(this);this.__sp={};this.__sq={};this.__sr={};this.__ss={};if(Q!==undefined){this.setUrl(Q);}if(R!==undefined){this.setMethod(R);}if(S!==undefined){this.setResponseType(S);}this.setProhibitCaching(true);this.__st=++qx.io.remote.Request.__st;},events:{"created":j,"configured":j,"sending":j,"receiving":j,"completed":P,"aborted":j,"failed":P,"timeout":P},statics:{__st:0,methodAllowsRequestBody:function(T){return (T==O)||(T==I);}},properties:{url:{check:h,init:w},method:{check:[L,O,I,u,E],apply:F,init:L},asynchronous:{check:k,init:true},data:{check:h,nullable:true},username:{check:h,nullable:true},password:{check:h,nullable:true},state:{check:[N,i,g,f,a,d,M,c],init:N,apply:A,event:C},responseType:{check:[s,z,q,p,n],init:s,apply:x},timeout:{check:m,nullable:true},prohibitCaching:{check:function(v){return typeof v==D||v===J;},init:true,apply:B},crossDomain:{check:k,init:false},fileUpload:{check:k,init:false},transport:{check:l,nullable:true},useBasicHttpAuth:{check:k,init:false},parseJson:{check:k,init:true}},members:{__sp:null,__sq:null,__sr:null,__ss:null,__st:null,send:function(){qx.io.remote.RequestQueue.getInstance().add(this);},abort:function(){qx.io.remote.RequestQueue.getInstance().abort(this);},reset:function(){switch(this.getState()){case g:case f:this.error("Aborting already sent request!");case i:this.abort();break;}},isConfigured:function(){return this.getState()===N;},isQueued:function(){return this.getState()===i;},isSending:function(){return this.getState()===g;},isReceiving:function(){return this.getState()===f;},isCompleted:function(){return this.getState()===a;},isAborted:function(){return this.getState()===d;},isTimeout:function(){return this.getState()===M;},isFailed:function(){return this.getState()===c;},__su:qx.event.GlobalError.observeMethod(function(e){var U=e.clone();U.setTarget(this);this.dispatchEvent(U);}),_onqueued:function(e){this.setState(i);this.__su(e);},_onsending:function(e){this.setState(g);this.__su(e);},_onreceiving:function(e){this.setState(f);this.__su(e);},_oncompleted:function(e){this.setState(a);this.__su(e);this.dispose();},_onaborted:function(e){this.setState(d);this.__su(e);this.dispose();},_ontimeout:function(e){this.setState(M);this.__su(e);this.dispose();},_onfailed:function(e){this.setState(c);this.__su(e);this.dispose();},_applyState:function(V,W){{};},_applyProhibitCaching:function(X,Y){if(!X){this.removeParameter(b);this.removeRequestHeader(K);this.removeRequestHeader(G);return;}if(X!==J||this.getMethod()!=O){this.setParameter(b,new Date().valueOf());}else{this.removeParameter(b);}this.setRequestHeader(K,H);this.setRequestHeader(G,H);},_applyMethod:function(ba,bb){if(qx.io.remote.Request.methodAllowsRequestBody(ba)){this.setRequestHeader(r,o);}else{this.removeRequestHeader(r);}var bc=this.getProhibitCaching();this._applyProhibitCaching(bc,bc);},_applyResponseType:function(bd,be){this.setRequestHeader(t,bd);},setRequestHeader:function(bf,bg){this.__sp[bf]=bg;},removeRequestHeader:function(bh){delete this.__sp[bh];},getRequestHeader:function(bi){return this.__sp[bi]||null;},getRequestHeaders:function(){return this.__sp;},setParameter:function(bj,bk,bl){if(bl){this.__sr[bj]=bk;}else{this.__sq[bj]=bk;}},removeParameter:function(bm,bn){if(bn){delete this.__sr[bm];}else{delete this.__sq[bm];}},getParameter:function(bo,bp){if(bp){return this.__sr[bo]||null;}else{return this.__sq[bo]||null;}},getParameters:function(bq){return (bq?this.__sr:this.__sq);},setFormField:function(br,bs){this.__ss[br]=bs;},removeFormField:function(bt){delete this.__ss[bt];},getFormField:function(bu){return this.__ss[bu]||null;},getFormFields:function(){return this.__ss;},getSequenceNumber:function(){return this.__st;}},destruct:function(){this.setTransport(null);this.__sp=this.__sq=this.__sr=this.__ss=null;}});})();(function(){var b=".",a="qx.bom.client.Transport";qx.Class.define(a,{statics:{getMaxConcurrentRequestCount:function(){var h;var c=qx.bom.client.Engine;var g=c.FULLVERSION.split(b);var e=0;var d=0;var f=0;if(g[0]){e=g[0];}if(g[1]){d=g[1];}if(g[2]){f=g[2];}if(window.maxConnectionsPerServer){h=window.maxConnectionsPerServer;}else if(c.OPERA){h=8;}else if(c.WEBKIT){h=4;}else if(c.GECKO&&((e>1)||((e==1)&&(d>9))||((e==1)&&(d==9)&&(f>=1)))){h=6;}else{h=2;}return h;}}});})();(function(){var s="Integer",r="aborted",q="_onaborted",p="_on",o="_applyEnabled",n="Boolean",m="sending",l="__pc",k="interval",j="__pe",c="failed",h="qx.io.remote.RequestQueue",g="timeout",b="completed",a="queued",f="receiving",d="singleton";qx.Class.define(h,{type:d,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.__pb=[];this.__pc=[];this.__pd=0;this.__pe=new qx.event.Timer(500);this.__pe.addListener(k,this._oninterval,this);},properties:{enabled:{init:true,check:n,apply:o},maxTotalRequests:{check:s,nullable:true},maxConcurrentRequests:{check:s,init:qx.bom.client.Transport.getMaxConcurrentRequestCount()},defaultTimeout:{check:s,init:5000}},members:{__pb:null,__pc:null,__pd:null,__pe:null,getRequestQueue:function(){return this.__pb;},getActiveQueue:function(){return this.__pc;},_debug:function(){var t;{};},_check:function(){this._debug();if(this.__pc.length==0&&this.__pb.length==0){this.__pe.stop();}if(!this.getEnabled()){return;}if(this.__pb.length==0||(this.__pb[0].isAsynchronous()&&this.__pc.length>=this.getMaxConcurrentRequests())){return;}if(this.getMaxTotalRequests()!=null&&this.__pd>=this.getMaxTotalRequests()){return;}var u=this.__pb.shift();var v=new qx.io.remote.Exchange(u);this.__pd++;this.__pc.push(v);this._debug();v.addListener(m,this._onsending,this);v.addListener(f,this._onreceiving,this);v.addListener(b,this._oncompleted,this);v.addListener(r,this._oncompleted,this);v.addListener(g,this._oncompleted,this);v.addListener(c,this._oncompleted,this);v._start=(new Date).valueOf();v.send();if(this.__pb.length>0){this._check();}},_remove:function(w){qx.lang.Array.remove(this.__pc,w);w.dispose();this._check();},__pf:0,_onsending:function(e){{};e.getTarget().getRequest()._onsending(e);},_onreceiving:function(e){e.getTarget().getRequest()._onreceiving(e);},_oncompleted:function(e){{};var y=e.getTarget().getRequest();var x=p+e.getType();try{if(y[x]){y[x](e);}}catch(z){this.error("Request "+y+" handler "+x+" threw an error: ",z);try{if(y[q]){var event=qx.event.Registration.createEvent(r,qx.event.type.Event);y[q](event);}}catch(A){}}finally{this._remove(e.getTarget());}},_oninterval:function(e){var H=this.__pc;if(H.length==0){this.__pe.stop();return;}var C=(new Date).valueOf();var F;var D;var G=this.getDefaultTimeout();var E;var B;for(var i=H.length-1;i>=0;i--){F=H[i];D=F.getRequest();if(D.isAsynchronous()){E=D.getTimeout();if(E==0){continue;}if(E==null){E=G;}B=C-F._start;if(B>E){this.warn("Timeout: transport "+F.toHashCode());this.warn(B+"ms > "+E+"ms");F.timeout();}}}},_applyEnabled:function(I,J){if(I){this._check();}this.__pe.setEnabled(I);},add:function(K){K.setState(a);if(K.isAsynchronous()){this.__pb.push(K);}else{this.__pb.unshift(K);}this._check();if(this.getEnabled()){this.__pe.start();}},abort:function(L){var M=L.getTransport();if(M){M.abort();}else if(qx.lang.Array.contains(this.__pb,L)){qx.lang.Array.remove(this.__pb,L);}}},destruct:function(){this._disposeArray(l);this._disposeObjects(j);this.__pb=null;}});})();(function(){var o="failed",n="sending",m="completed",k="receiving",j="aborted",h="timeout",g="qx.event.type.Event",f="Connection dropped",d="qx.io.remote.Response",c="=",bp="configured",bo="&",bn="Unknown status code. ",bm="qx.io.remote.transport.XmlHttp",bl="qx.io.remote.transport.Abstract",bk="Request-URL too large",bj="MSHTML-specific HTTP status code",bi="Not available",bh="Precondition failed",bg="Server error",v="Moved temporarily",w="qx.io.remote.Exchange",t="Possibly due to a cross-domain request?",u="Bad gateway",r="Gone",s="See other",p="Partial content",q="Server timeout",B="qx.io.remote.transport.Script",C="HTTP version not supported",L="Unauthorized",I="Possibly due to application URL using 'file:' protocol?",T="Multiple choices",O="Payment required",bc="Not implemented",Y="Proxy authentication required",E="Length required",bf="_applyState",be="changeState",bd="Not modified",D="qx.io.remote.Request",G="Connection closed by server",H="Moved permanently",K="_applyImplementation",M="",P="Method not allowed",V="Forbidden",bb="Use proxy",x="Ok",y="Conflict",F="Not found",S="Not acceptable",R="Request time-out",Q="Bad request",X="No content",W="file:",N="qx.io.remote.transport.Iframe",U="Request entity too large",a="Unknown status code",ba="Unsupported media type",z="Gateway time-out",A="created",J="Out of resources",b="undefined";qx.Class.define(w,{extend:qx.core.Object,construct:function(bq){qx.core.Object.call(this);this.setRequest(bq);bq.setTransport(this);},events:{"sending":g,"receiving":g,"completed":d,"aborted":g,"failed":d,"timeout":d},statics:{typesOrder:[bm,N,B],typesReady:false,typesAvailable:{},typesSupported:{},registerType:function(br,bs){qx.io.remote.Exchange.typesAvailable[bs]=br;},initTypes:function(){if(qx.io.remote.Exchange.typesReady){return;}for(var bu in qx.io.remote.Exchange.typesAvailable){var bt=qx.io.remote.Exchange.typesAvailable[bu];if(bt.isSupported()){qx.io.remote.Exchange.typesSupported[bu]=bt;}}qx.io.remote.Exchange.typesReady=true;if(qx.lang.Object.isEmpty(qx.io.remote.Exchange.typesSupported)){throw new Error("No supported transport types were found!");}},canHandle:function(bv,bw,bx){if(!qx.lang.Array.contains(bv.handles.responseTypes,bx)){return false;}for(var by in bw){if(!bv.handles[by]){return false;}}return true;},_nativeMap:{0:A,1:bp,2:n,3:k,4:m},wasSuccessful:function(bz,bA,bB){if(bB){switch(bz){case null:case 0:return true;case -1:return bA<4;default:return typeof bz===b;}}else{switch(bz){case -1:{};return bA<4;case 200:case 304:return true;case 201:case 202:case 203:case 204:case 205:return true;case 206:{};return bA!==4;case 300:case 301:case 302:case 303:case 305:case 400:case 401:case 402:case 403:case 404:case 405:case 406:case 407:case 408:case 409:case 410:case 411:case 412:case 413:case 414:case 415:case 500:case 501:case 502:case 503:case 504:case 505:{};return false;case 12002:case 12007:case 12029:case 12030:case 12031:case 12152:case 13030:{};return false;default:if(bz>206&&bz<300){return true;}qx.log.Logger.debug(this,"Unknown status code: "+bz+" ("+bA+")");return false;}}},statusCodeToString:function(bC){switch(bC){case -1:return bi;case 0:var bD=window.location.href;if(qx.lang.String.startsWith(bD.toLowerCase(),W)){return (bn+I);}else{return (bn+t);}break;case 200:return x;case 304:return bd;case 206:return p;case 204:return X;case 300:return T;case 301:return H;case 302:return v;case 303:return s;case 305:return bb;case 400:return Q;case 401:return L;case 402:return O;case 403:return V;case 404:return F;case 405:return P;case 406:return S;case 407:return Y;case 408:return R;case 409:return y;case 410:return r;case 411:return E;case 412:return bh;case 413:return U;case 414:return bk;case 415:return ba;case 500:return bg;case 501:return bc;case 502:return u;case 503:return J;case 504:return z;case 505:return C;case 12002:return q;case 12029:return f;case 12030:return f;case 12031:return f;case 12152:return G;case 13030:return bj;default:return a;}}},properties:{request:{check:D,nullable:true},implementation:{check:bl,nullable:true,apply:K},state:{check:[bp,n,k,m,j,h,o],init:bp,event:be,apply:bf}},members:{send:function(){var bH=this.getRequest();if(!bH){return this.error("Please attach a request object first");}qx.io.remote.Exchange.initTypes();var bF=qx.io.remote.Exchange.typesOrder;var bE=qx.io.remote.Exchange.typesSupported;var bJ=bH.getResponseType();var bK={};if(bH.getAsynchronous()){bK.asynchronous=true;}else{bK.synchronous=true;}if(bH.getCrossDomain()){bK.crossDomain=true;}if(bH.getFileUpload()){bK.fileUpload=true;}for(var bI in bH.getFormFields()){bK.programaticFormFields=true;break;}var bL,bG;for(var i=0,l=bF.length;i<l;i++){bL=bE[bF[i]];if(bL){if(!qx.io.remote.Exchange.canHandle(bL,bK,bJ)){continue;}try{{};bG=new bL;this.setImplementation(bG);bG.setUseBasicHttpAuth(bH.getUseBasicHttpAuth());bG.send();return true;}catch(bM){this.error("Request handler throws error");this.error(bM);return;}}}this.error("There is no transport implementation available to handle this request: "+bH);},abort:function(){var bN=this.getImplementation();if(bN){{};bN.abort();}else{{};this.setState(j);}},timeout:function(){var bQ=this.getImplementation();if(bQ){var bP=M;for(var bO in bQ.getParameters()){bP+=bo+bO+c+bQ.getParameters()[bO];}this.warn("Timeout: implementation "+bQ.toHashCode()+", "+bQ.getUrl()+" ["+bQ.getMethod()+"], "+bP);bQ.timeout();}else{this.warn("Timeout: forcing state to timeout");this.setState(h);}this.__rx();},__rx:function(){var bR=this.getRequest();if(bR){bR.setTimeout(0);}},_onsending:function(e){this.setState(n);},_onreceiving:function(e){this.setState(k);},_oncompleted:function(e){this.setState(m);},_onabort:function(e){this.setState(j);},_onfailed:function(e){this.setState(o);},_ontimeout:function(e){this.setState(h);},_applyImplementation:function(bS,bT){if(bT){bT.removeListener(n,this._onsending,this);bT.removeListener(k,this._onreceiving,this);bT.removeListener(m,this._oncompleted,this);bT.removeListener(j,this._onabort,this);bT.removeListener(h,this._ontimeout,this);bT.removeListener(o,this._onfailed,this);}if(bS){var bV=this.getRequest();bS.setUrl(bV.getUrl());bS.setMethod(bV.getMethod());bS.setAsynchronous(bV.getAsynchronous());bS.setUsername(bV.getUsername());bS.setPassword(bV.getPassword());bS.setParameters(bV.getParameters(false));bS.setFormFields(bV.getFormFields());bS.setRequestHeaders(bV.getRequestHeaders());if(bS instanceof qx.io.remote.transport.XmlHttp){bS.setParseJson(bV.getParseJson());}var bY=bV.getData();if(bY===null){var ca=bV.getParameters(true);var bX=[];for(var bU in ca){var bW=ca[bU];if(bW instanceof Array){for(var i=0;i<bW.length;i++){bX.push(encodeURIComponent(bU)+c+encodeURIComponent(bW[i]));}}else{bX.push(encodeURIComponent(bU)+c+encodeURIComponent(bW));}}if(bX.length>0){bS.setData(bX.join(bo));}}else{bS.setData(bY);}bS.setResponseType(bV.getResponseType());bS.addListener(n,this._onsending,this);bS.addListener(k,this._onreceiving,this);bS.addListener(m,this._oncompleted,this);bS.addListener(j,this._onabort,this);bS.addListener(h,this._ontimeout,this);bS.addListener(o,this._onfailed,this);}},_applyState:function(cb,cc){{};switch(cb){case n:this.fireEvent(n);break;case k:this.fireEvent(k);break;case m:case j:case h:case o:var ce=this.getImplementation();if(!ce){break;}this.__rx();if(this.hasListener(cb)){var cf=qx.event.Registration.createEvent(cb,qx.io.remote.Response);if(cb==m){var cd=ce.getResponseContent();cf.setContent(cd);if(cd===null){{};cb=o;}}else if(cb==o){cf.setContent(ce.getResponseContent());}cf.setStatusCode(ce.getStatusCode());cf.setResponseHeaders(ce.getResponseHeaders());this.dispatchEvent(cf);}this.setImplementation(null);ce.dispose();break;}}},settings:{"qx.ioRemoteDebug":false,"qx.ioRemoteDebugData":false},destruct:function(){var cg=this.getImplementation();if(cg){this.setImplementation(null);cg.dispose();}this.setRequest(null);}});})();(function(){var q="qx.event.type.Event",p="String",o="failed",n="timeout",m="created",l="aborted",k="sending",j="configured",i="receiving",h="completed",c="Object",g="Boolean",f="abstract",b="_applyState",a="GET",e="changeState",d="qx.io.remote.transport.Abstract";qx.Class.define(d,{type:f,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);this.setRequestHeaders({});this.setParameters({});this.setFormFields({});},events:{"created":q,"configured":q,"sending":q,"receiving":q,"completed":q,"aborted":q,"failed":q,"timeout":q},properties:{url:{check:p,nullable:true},method:{check:p,nullable:true,init:a},asynchronous:{check:g,nullable:true,init:true},data:{check:p,nullable:true},username:{check:p,nullable:true},password:{check:p,nullable:true},state:{check:[m,j,k,i,h,l,n,o],init:m,event:e,apply:b},requestHeaders:{check:c,nullable:true},parameters:{check:c,nullable:true},formFields:{check:c,nullable:true},responseType:{check:p,nullable:true},useBasicHttpAuth:{check:g,nullable:true}},members:{send:function(){throw new Error("send is abstract");},abort:function(){{};this.setState(l);},timeout:function(){{};this.setState(n);},failed:function(){{};this.setState(o);},setRequestHeader:function(r,s){throw new Error("setRequestHeader is abstract");},getResponseHeader:function(t){throw new Error("getResponseHeader is abstract");},getResponseHeaders:function(){throw new Error("getResponseHeaders is abstract");},getStatusCode:function(){throw new Error("getStatusCode is abstract");},getStatusText:function(){throw new Error("getStatusText is abstract");},getResponseText:function(){throw new Error("getResponseText is abstract");},getResponseXml:function(){throw new Error("getResponseXml is abstract");},getFetchedLength:function(){throw new Error("getFetchedLength is abstract");},_applyState:function(u,v){{};switch(u){case m:this.fireEvent(m);break;case j:this.fireEvent(j);break;case k:this.fireEvent(k);break;case i:this.fireEvent(i);break;case h:this.fireEvent(h);break;case l:this.fireEvent(l);break;case o:this.fireEvent(o);break;case n:this.fireEvent(n);break;}return true;}},destruct:function(){this.setRequestHeaders(null);this.setParameters(null);this.setFormFields(null);}});})();(function(){var l="=",k="",j="&",h="application/xml",g="application/json",f="text/html",d="qx.client",c="textarea",b="_data_",a="load",G="text/plain",F="text/javascript",E="completed",D="readystatechange",C="?",B="qx.io.remote.transport.Iframe",A="none",z="display",y="gecko",x="frame_",s="aborted",t="pre",q="javascript:void(0)",r="sending",o="form",p="failed",m="mshtml",n="form_",u="opera",v="timeout",w="qx/static/blank.gif";qx.Class.define(B,{extend:qx.io.remote.transport.Abstract,construct:function(){qx.io.remote.transport.Abstract.call(this);var H=(new Date).valueOf();var I=x+H;var J=n+H;var K;if(qx.core.Variant.isSet(d,m)){K=q;}this.__oh=qx.bom.Iframe.create({id:I,name:I,src:K});qx.bom.element.Style.set(this.__oh,z,A);this.__oi=qx.bom.Element.create(o,{id:J,name:J,target:I});qx.bom.element.Style.set(this.__oi,z,A);qx.dom.Element.insertEnd(this.__oi,qx.dom.Node.getBodyElement(document));this.__oj=qx.bom.Element.create(c,{id:b,name:b});qx.dom.Element.insertEnd(this.__oj,this.__oi);qx.dom.Element.insertEnd(this.__oh,qx.dom.Node.getBodyElement(document));qx.event.Registration.addListener(this.__oh,a,this._onload,this);this.__ok=qx.lang.Function.listener(this._onreadystatechange,this);qx.bom.Event.addNativeListener(this.__oh,D,this.__ok);},statics:{handles:{synchronous:false,asynchronous:true,crossDomain:false,fileUpload:true,programaticFormFields:true,responseTypes:[G,F,g,h,f]},isSupported:function(){return true;},_numericMap:{"uninitialized":1,"loading":2,"loaded":2,"interactive":3,"complete":4}},members:{__oj:null,__ol:0,__oi:null,__oh:null,__ok:null,send:function(){var M=this.getMethod();var O=this.getUrl();var S=this.getParameters(false);var R=[];for(var N in S){var P=S[N];if(P instanceof Array){for(var i=0;i<P.length;i++){R.push(encodeURIComponent(N)+l+encodeURIComponent(P[i]));}}else{R.push(encodeURIComponent(N)+l+encodeURIComponent(P));}}if(R.length>0){O+=(O.indexOf(C)>=0?j:C)+R.join(j);}if(this.getData()===null){var S=this.getParameters(true);var R=[];for(var N in S){var P=S[N];if(P instanceof Array){for(var i=0;i<P.length;i++){R.push(encodeURIComponent(N)+l+encodeURIComponent(P[i]));}}else{R.push(encodeURIComponent(N)+l+encodeURIComponent(P));}}if(R.length>0){this.setData(R.join(j));}}var L=this.getFormFields();for(var N in L){var Q=document.createElement(c);Q.name=N;Q.appendChild(document.createTextNode(L[N]));this.__oi.appendChild(Q);}this.__oi.action=O;this.__oi.method=M;this.__oj.appendChild(document.createTextNode(this.getData()));this.__oi.submit();this.setState(r);},_onload:qx.event.GlobalError.observeMethod(function(e){if(qx.bom.client.Engine.NAME==u&&this.getIframeHtmlContent()==k){return;}if(this.__oi.src){return;}this._switchReadyState(qx.io.remote.transport.Iframe._numericMap.complete);}),_onreadystatechange:qx.event.GlobalError.observeMethod(function(e){this._switchReadyState(qx.io.remote.transport.Iframe._numericMap[this.__oh.readyState]);}),_switchReadyState:function(T){switch(this.getState()){case E:case s:case p:case v:this.warn("Ignore Ready State Change");return;}while(this.__ol<T){this.setState(qx.io.remote.Exchange._nativeMap[++this.__ol]);}},setRequestHeader:function(U,V){},getResponseHeader:function(W){return null;},getResponseHeaders:function(){return {};},getStatusCode:function(){return 200;},getStatusText:function(){return k;},getIframeWindow:function(){return qx.bom.Iframe.getWindow(this.__oh);},getIframeDocument:function(){return qx.bom.Iframe.getDocument(this.__oh);},getIframeBody:function(){return qx.bom.Iframe.getBody(this.__oh);},getIframeTextContent:function(){var X=this.getIframeBody();if(!X){return null;}if(!X.firstChild){return k;}if(X.firstChild.tagName&&X.firstChild.tagName.toLowerCase()==t){return X.firstChild.innerHTML;}else{return X.innerHTML;}},getIframeHtmlContent:function(){var Y=this.getIframeBody();return Y?Y.innerHTML:null;},getFetchedLength:function(){return 0;},getResponseContent:function(){if(this.getState()!==E){{};return null;}{};var ba=this.getIframeTextContent();switch(this.getResponseType()){case G:{};return ba;break;case f:ba=this.getIframeHtmlContent();{};return ba;break;case g:ba=this.getIframeHtmlContent();{};try{return ba&&ba.length>0?qx.util.Json.parse(ba,false):null;}catch(bb){return this.error("Could not execute json: ("+ba+")",bb);}case F:ba=this.getIframeHtmlContent();{};try{return ba&&ba.length>0?window.eval(ba):null;}catch(bc){return this.error("Could not execute javascript: ("+ba+")",bc);}case h:ba=this.getIframeDocument();{};return ba;default:this.warn("No valid responseType specified ("+this.getResponseType()+")!");return null;}}},defer:function(){qx.io.remote.Exchange.registerType(qx.io.remote.transport.Iframe,B);},destruct:function(){if(this.__oh){qx.event.Registration.removeListener(this.__oh,a,this._onload,this);qx.bom.Event.removeNativeListener(this.__oh,D,this.__ok);if(qx.core.Variant.isSet(d,y)){this.__oh.src=qx.util.ResourceManager.getInstance().toUri(w);}qx.dom.Element.remove(this.__oh);}if(this.__oi){qx.dom.Element.remove(this.__oi);}this.__oh=this.__oi=this.__oj=null;}});})();(function(){var c="qx.event.handler.Iframe",b="load",a="iframe";qx.Class.define(c,{extend:qx.core.Object,implement:qx.event.IEventHandler,statics:{PRIORITY:qx.event.Registration.PRIORITY_NORMAL,SUPPORTED_TYPES:{load:1},TARGET_CHECK:qx.event.IEventHandler.TARGET_DOMNODE,IGNORE_CAN_HANDLE:false,onevent:qx.event.GlobalError.observeMethod(function(d){qx.event.Registration.fireEvent(d,b);})},members:{canHandleEvent:function(e,f){return e.tagName.toLowerCase()===a;},registerEvent:function(g,h,i){},unregisterEvent:function(j,k,l){}},defer:function(m){qx.event.Registration.addHandler(m);}});})();(function(){var e="qx.client",d="webkit",c="body",b="iframe",a="qx.bom.Iframe";qx.Class.define(a,{statics:{DEFAULT_ATTRIBUTES:{onload:"qx.event.handler.Iframe.onevent(this)",frameBorder:0,frameSpacing:0,marginWidth:0,marginHeight:0,hspace:0,vspace:0,border:0,allowTransparency:true},create:function(f,g){var f=f?qx.lang.Object.clone(f):{};var h=qx.bom.Iframe.DEFAULT_ATTRIBUTES;for(var i in h){if(f[i]==null){f[i]=h[i];}}return qx.bom.Element.create(b,f,g);},getWindow:qx.core.Variant.select(e,{"mshtml|gecko":function(j){try{return j.contentWindow;}catch(k){return null;}},"default":function(l){try{var m=this.getDocument(l);return m?m.defaultView:null;}catch(n){return null;}}}),getDocument:qx.core.Variant.select(e,{"mshtml":function(o){try{var p=this.getWindow(o);return p?p.document:null;}catch(q){return null;}},"default":function(r){try{return r.contentDocument;}catch(s){return null;}}}),getBody:function(t){try{var u=this.getDocument(t);return u?u.getElementsByTagName(c)[0]:null;}catch(v){return null;}},setSource:function(w,x){try{if(this.getWindow(w)&&qx.dom.Hierarchy.isRendered(w)){try{if(qx.core.Variant.isSet(e,d)&&qx.bom.client.Platform.MAC){var y=this.getContentWindow();if(y){y.stop();}}this.getWindow(w).location.replace(x);}catch(z){w.src=x;}}else{w.src=x;}}catch(A){qx.log.Logger.warn("Iframe source could not be set!");}},queryCurrentUrl:function(B){var C=this.getDocument(B);try{if(C&&C.location){return C.location.href;}}catch(D){}return null;}}});})();(function(){var a="qx.dom.Element";qx.Class.define(a,{statics:{hasChild:function(parent,b){return b.parentNode===parent;},hasChildren:function(c){return !!c.firstChild;},hasChildElements:function(d){d=d.firstChild;while(d){if(d.nodeType===1){return true;}d=d.nextSibling;}return false;},getParentElement:function(e){return e.parentNode;},isInDom:function(f,g){if(!g){g=window;}var h=g.document.getElementsByTagName(f.nodeName);for(var i=0,l=h.length;i<l;i++){if(h[i]===f){return true;}}return false;},insertAt:function(j,parent,k){var m=parent.childNodes[k];if(m){parent.insertBefore(j,m);}else{parent.appendChild(j);}return true;},insertBegin:function(n,parent){if(parent.firstChild){this.insertBefore(n,parent.firstChild);}else{parent.appendChild(n);}},insertEnd:function(o,parent){parent.appendChild(o);},insertBefore:function(p,q){q.parentNode.insertBefore(p,q);return true;},insertAfter:function(r,s){var parent=s.parentNode;if(s==parent.lastChild){parent.appendChild(r);}else{return this.insertBefore(r,s.nextSibling);}return true;},remove:function(t){if(!t.parentNode){return false;}t.parentNode.removeChild(t);return true;},removeChild:function(u,parent){if(u.parentNode!==parent){return false;}parent.removeChild(u);return true;},removeChildAt:function(v,parent){var w=parent.childNodes[v];if(!w){return false;}parent.removeChild(w);return true;},replaceChild:function(x,y){if(!y.parentNode){return false;}y.parentNode.replaceChild(x,y);return true;},replaceAt:function(z,A,parent){var B=parent.childNodes[A];if(!B){return false;}parent.replaceChild(z,B);return true;}}});})();(function(){var r="&",q="=",p="?",o="application/json",n="completed",m="text/plain",l="text/javascript",k="qx.io.remote.transport.Script",j="",h="_ScriptTransport_data",c="script",g="timeout",f="_ScriptTransport_",b="_ScriptTransport_id",a="aborted",e="utf-8",d="failed";qx.Class.define(k,{extend:qx.io.remote.transport.Abstract,construct:function(){qx.io.remote.transport.Abstract.call(this);var s=++qx.io.remote.transport.Script.__pg;if(s>=2000000000){qx.io.remote.transport.Script.__pg=s=1;}this.__ph=null;this.__pg=s;},statics:{__pg:0,_instanceRegistry:{},ScriptTransport_PREFIX:f,ScriptTransport_ID_PARAM:b,ScriptTransport_DATA_PARAM:h,handles:{synchronous:false,asynchronous:true,crossDomain:true,fileUpload:false,programaticFormFields:false,responseTypes:[m,l,o]},isSupported:function(){return true;},_numericMap:{"uninitialized":1,"loading":2,"loaded":2,"interactive":3,"complete":4},_requestFinished:qx.event.GlobalError.observeMethod(function(t,content){var u=qx.io.remote.transport.Script._instanceRegistry[t];if(u==null){{};}else{u._responseContent=content;u._switchReadyState(qx.io.remote.transport.Script._numericMap.complete);}})},members:{__pi:0,__ph:null,__pg:null,send:function(){var x=this.getUrl();x+=(x.indexOf(p)>=0?r:p)+qx.io.remote.transport.Script.ScriptTransport_ID_PARAM+q+this.__pg;var A=this.getParameters();var z=[];for(var w in A){if(w.indexOf(qx.io.remote.transport.Script.ScriptTransport_PREFIX)==0){this.error("Illegal parameter name. The following prefix is used internally by qooxdoo): "+qx.io.remote.transport.Script.ScriptTransport_PREFIX);}var y=A[w];if(y instanceof Array){for(var i=0;i<y.length;i++){z.push(encodeURIComponent(w)+q+encodeURIComponent(y[i]));}}else{z.push(encodeURIComponent(w)+q+encodeURIComponent(y));}}if(z.length>0){x+=r+z.join(r);}var v=this.getData();if(v!=null){x+=r+qx.io.remote.transport.Script.ScriptTransport_DATA_PARAM+q+encodeURIComponent(v);}qx.io.remote.transport.Script._instanceRegistry[this.__pg]=this;this.__ph=document.createElement(c);this.__ph.charset=e;this.__ph.src=x;{};document.body.appendChild(this.__ph);},_switchReadyState:function(B){switch(this.getState()){case n:case a:case d:case g:this.warn("Ignore Ready State Change");return;}while(this.__pi<B){this.setState(qx.io.remote.Exchange._nativeMap[++this.__pi]);}},setRequestHeader:function(C,D){},getResponseHeader:function(E){return null;},getResponseHeaders:function(){return {};},getStatusCode:function(){return 200;},getStatusText:function(){return j;},getFetchedLength:function(){return 0;},getResponseContent:function(){if(this.getState()!==n){{};return null;}{};switch(this.getResponseType()){case m:case o:case l:{};var F=this._responseContent;return (F===0?0:(F||null));default:this.warn("No valid responseType specified ("+this.getResponseType()+")!");return null;}}},defer:function(){qx.io.remote.Exchange.registerType(qx.io.remote.transport.Script,k);},destruct:function(){if(this.__ph){delete qx.io.remote.transport.Script._instanceRegistry[this.__pg];document.body.removeChild(this.__ph);}this.__ph=this._responseContent=null;}});})();(function(){var m="failed",k="completed",j="=",h="aborted",g="",f="sending",d="&",c="configured",b="timeout",a="application/xml",J="qx.io.remote.transport.XmlHttp",I="application/json",H="text/html",G="qx.client",F="receiving",E="text/plain",D="text/javascript",C="?",B="created",A="Boolean",u='Referer',v='Basic ',r="\n</pre>",t="string",p='Authorization',q="<pre>Could not execute json: \n",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o=':',w="parseerror",x="file:",z="webkit",y="object";qx.Class.define(J,{extend:qx.io.remote.transport.Abstract,statics:{handles:{synchronous:true,asynchronous:true,crossDomain:false,fileUpload:false,programaticFormFields:false,responseTypes:[E,D,I,a,H]},requestObjects:[],requestObjectCount:0,createRequestObject:qx.core.Variant.select(G,{"default":function(){return new XMLHttpRequest;},"mshtml":function(){if(window.ActiveXObject&&qx.xml.Document.XMLHTTP){return new ActiveXObject(qx.xml.Document.XMLHTTP);}if(window.XMLHttpRequest){return new XMLHttpRequest;}}}),isSupported:function(){return !!this.createRequestObject();}},properties:{parseJson:{check:A,init:true}},members:{__nh:false,__ni:0,__nj:null,getRequest:function(){if(this.__nj===null){this.__nj=qx.io.remote.transport.XmlHttp.createRequestObject();this.__nj.onreadystatechange=qx.lang.Function.bind(this._onreadystatechange,this);}return this.__nj;},send:function(){this.__ni=0;var O=this.getRequest();var K=this.getMethod();var R=this.getAsynchronous();var Q=this.getUrl();var M=(window.location.protocol===x&&!(/^http(s){0,1}\:/.test(Q)));this.__nh=M;var U=this.getParameters(false);var S=[];for(var L in U){var P=U[L];if(P instanceof Array){for(var i=0;i<P.length;i++){S.push(encodeURIComponent(L)+j+encodeURIComponent(P[i]));}}else{S.push(encodeURIComponent(L)+j+encodeURIComponent(P));}}if(S.length>0){Q+=(Q.indexOf(C)>=0?d:C)+S.join(d);}if(this.getData()===null){var U=this.getParameters(true);var S=[];for(var L in U){var P=U[L];if(P instanceof Array){for(var i=0;i<P.length;i++){S.push(encodeURIComponent(L)+j+encodeURIComponent(P[i]));}}else{S.push(encodeURIComponent(L)+j+encodeURIComponent(P));}}if(S.length>0){this.setData(S.join(d));}}var T=function(V){var bb=n;var bf=g;var Y,X,W;var bc,bd,be,ba;var i=0;do{Y=V.charCodeAt(i++);X=V.charCodeAt(i++);W=V.charCodeAt(i++);bc=Y>>2;bd=((Y&3)<<4)|(X>>4);be=((X&15)<<2)|(W>>6);ba=W&63;if(isNaN(X)){be=ba=64;}else if(isNaN(W)){ba=64;}bf+=bb.charAt(bc)+bb.charAt(bd)+bb.charAt(be)+bb.charAt(ba);}while(i<V.length);return bf;};try{if(this.getUsername()){if(this.getUseBasicHttpAuth()){O.open(K,Q,R);O.setRequestHeader(p,v+T(this.getUsername()+o+this.getPassword()));}else{O.open(K,Q,R,this.getUsername(),this.getPassword());}}else{O.open(K,Q,R);}}catch(bg){this.error("Failed with exception: "+bg);this.failed();return;}if(!qx.core.Variant.isSet(G,z)){O.setRequestHeader(u,window.location.href);}var N=this.getRequestHeaders();for(var L in N){O.setRequestHeader(L,N[L]);}try{{};O.send(this.getData());}catch(bh){if(M){this.failedLocally();}else{this.error("Failed to send data: "+bh,"send");this.failed();}return;}if(!R){this._onreadystatechange();}},failedLocally:function(){if(this.getState()===m){return;}this.warn("Could not load from file: "+this.getUrl());this.failed();},_onreadystatechange:qx.event.GlobalError.observeMethod(function(e){switch(this.getState()){case k:case h:case m:case b:{};return;}var bi=this.getReadyState();if(bi==4){if(!qx.io.remote.Exchange.wasSuccessful(this.getStatusCode(),bi,this.__nh)){if(this.getState()===c){this.setState(f);}this.failed();return;}}while(this.__ni<bi){this.setState(qx.io.remote.Exchange._nativeMap[++this.__ni]);}}),getReadyState:function(){var bj=null;try{bj=this.getRequest().readyState;}catch(bk){}return bj;},setRequestHeader:function(bl,bm){this.getRequestHeaders()[bl]=bm;},getResponseHeader:function(bn){var bo=null;try{bo=this.getRequest().getResponseHeader(bn)||null;}catch(bp){}return bo;},getStringResponseHeaders:function(){var br=null;try{var bq=this.getRequest().getAllResponseHeaders();if(bq){br=bq;}}catch(bs){}return br;},getResponseHeaders:function(){var bv=this.getStringResponseHeaders();var bw={};if(bv){var bt=bv.split(/[\r\n]+/g);for(var i=0,l=bt.length;i<l;i++){var bu=bt[i].match(/^([^:]+)\s*:\s*(.+)$/i);if(bu){bw[bu[1]]=bu[2];}}}return bw;},getStatusCode:function(){var bx=-1;try{bx=this.getRequest().status;}catch(by){}return bx;},getStatusText:function(){var bz=g;try{bz=this.getRequest().statusText;}catch(bA){}return bz;},getResponseText:function(){var bB=null;try{bB=this.getRequest().responseText;}catch(bC){bB=null;}return bB;},getResponseXml:function(){var bF=null;var bD=this.getStatusCode();var bE=this.getReadyState();if(qx.io.remote.Exchange.wasSuccessful(bD,bE,this.__nh)){try{bF=this.getRequest().responseXML;}catch(bG){}}if(typeof bF==y&&bF!=null){if(!bF.documentElement){var s=String(this.getRequest().responseText).replace(/<\?xml[^\?]*\?>/,g);bF.loadXML(s);}if(!bF.documentElement){throw new Error("Missing Document Element!");}if(bF.documentElement.tagName==w){throw new Error("XML-File is not well-formed!");}}else{throw new Error("Response was not a valid xml document ["+this.getRequest().responseText+"]");}return bF;},getFetchedLength:function(){var bH=this.getResponseText();return typeof bH==t?bH.length:0;},getResponseContent:function(){var bI=this.getState();if(bI!==k&&bI!=m){{};return null;}{};var bK=this.getResponseText();if(bI==m){{};return bK;}switch(this.getResponseType()){case E:case H:{};return bK;case I:{};try{if(bK&&bK.length>0){var bJ;if(this.getParseJson()){bJ=qx.util.Json.parse(bK,false);bJ=(bJ===0?0:(bJ||null));}else{bJ=bK;}return bJ;}else{return null;}}catch(bL){this.error("Could not execute json: ["+bK+"]",bL);return q+bK+r;}case D:{};try{if(bK&&bK.length>0){var bJ=window.eval(bK);return (bJ===0?0:(bJ||null));}else{return null;}}catch(bM){this.error("Could not execute javascript: ["+bK+"]",bM);return null;}case a:bK=this.getResponseXml();{};return (bK===0?0:(bK||null));default:this.warn("No valid responseType specified ("+this.getResponseType()+")!");return null;}},_applyState:function(bN,bO){{};switch(bN){case B:this.fireEvent(B);break;case c:this.fireEvent(c);break;case f:this.fireEvent(f);break;case F:this.fireEvent(F);break;case k:this.fireEvent(k);break;case m:this.fireEvent(m);break;case h:this.getRequest().abort();this.fireEvent(h);break;case b:this.getRequest().abort();this.fireEvent(b);break;}}},defer:function(){qx.io.remote.Exchange.registerType(qx.io.remote.transport.XmlHttp,J);},destruct:function(){var bP=this.getRequest();if(bP){bP.onreadystatechange=qx.lang.Function.empty;switch(bP.readyState){case 1:case 2:case 3:bP.abort();}}this.__nj=null;}});})();(function(){var c="Integer",b="Object",a="qx.io.remote.Response";qx.Class.define(a,{extend:qx.event.type.Event,properties:{state:{check:c,nullable:true},statusCode:{check:c,nullable:true},content:{nullable:true},responseHeaders:{check:b,nullable:true}},members:{clone:function(d){var e=qx.event.type.Event.prototype.clone.call(this,d);e.setType(this.getType());e.setState(this.getState());e.setStatusCode(this.getStatusCode());e.setContent(this.getContent());e.setResponseHeaders(this.getResponseHeaders());return e;},getResponseHeader:function(f){var g=this.getResponseHeaders();if(g){return g[f]||null;}return null;}}});})();(function(){var b="pane",a="qx.ui.container.Scroll";qx.Class.define(a,{extend:qx.ui.core.scroll.AbstractScrollArea,include:[qx.ui.core.MContentPadding],construct:function(content){qx.ui.core.scroll.AbstractScrollArea.call(this);if(content){this.add(content);}},members:{add:function(c){this.getChildControl(b).add(c);},remove:function(d){this.getChildControl(b).remove(d);},getChildren:function(){return this.getChildControl(b).getChildren();},_getContentPaddingTarget:function(){return this.getChildControl(b);}}});})();(function(){var k="legendview-label-important",j="Package/Class/Mixin/Interface is not fully documented",h="ICON_PROPERTY_PUB",g="Themeable Property",f="Child Control",e="ICON_CLASS_SINGLETON",d="Public Property",c="Private Method",b="Public Method",a="ICON_CHILDCONTROL",bd="string",bc="ICON_INTERFACE",bb='<span style="text-decoration: line-through;color: #7193b9;">deprecated</span>',ba="center",Y="ICON_EVENT",X="apiviewer.ui.LegendView",W="Singleton Class",V="Private Property",U="OVERLAY_WARN",T="ICON_PACKAGE",r="Method/Property/Event is inherited from one of the super classes",s="legend",p="ICON_PROPERTY_PRIV",q="middle",n="ICON_BLANK",o="__Tb",l="ICON_PROPERTY_PROT",m="ICON_CLASS_ABSTRACT",v="ICON_CLASS",w="ICON_PROPERTY_PUB_THEMEABLE",E="Protected Method",C="Constant",L="Method/Property/Event is not fully documented",G="OVERLAY_OVERRIDDEN",P="Abstract Class",N="OVERLAY_MIXIN",y="Class",S="Interface",R="ICON_METHOD_PUB",Q="Event",x="Mixin",A="Package",B="Protected Property",D="OVERLAY_ERROR",F="ICON_MIXIN",H="legendview-label",M="ICON_CLASS_STATIC",O="Method/Property overrides the Method/Property of the super class",t="ICON_METHOD_PRIV",u="Static Class",z="Method/Property is included from a mixin",K="ICON_METHOD_PROT",J="OVERLAY_INHERITED",I="ICON_CONSTANT";qx.Class.define(X,{extend:qx.ui.container.Scroll,construct:function(){qx.ui.container.Scroll.call(this);this.setAppearance(s);var be=new qx.ui.layout.Grid(10,10);be.setColumnWidth(1,150);be.setColumnFlex(1,1);var content=new qx.ui.container.Composite(be);this.__Tb=[{icon:T,desc:A},{icon:v,desc:y},{icon:M,desc:u},{icon:m,desc:P},{icon:e,desc:W},{icon:bc,desc:S},{icon:F,desc:x},{icon:a,desc:f},{icon:R,desc:b},{icon:K,desc:E},{icon:t,desc:c},{icon:h,desc:d},{icon:l,desc:B},{icon:p,desc:V},{icon:w,desc:g},{icon:Y,desc:Q},{icon:I,desc:C},{icon:n,desc:bb},{icon:U,desc:j},{icon:D,desc:L},{icon:N,desc:z},{icon:J,desc:r},{icon:G,desc:O}];var length=this.__Tb.length;var bg,bf;for(var i=0;i<length;i++){bg=this.__Tb[i];bf=apiviewer.TreeUtil.iconNameToIconPath(bg.icon);if(typeof (bf)!=bd){bf=bf[0];}content.add(new qx.ui.basic.Image(bf).set({alignX:ba,alignY:q}),{row:i,column:0});content.add(new qx.ui.basic.Label(bg.desc).set({rich:true,appearance:(i<17)?k:H}),{row:i,column:1});}this.add(content);},members:{__Tb:null},destruct:function(){this._disposeMap(o);}});})();(function(){var d="_applyDynamic",c="changeSelection",b="Boolean",a="qx.ui.container.Stack";qx.Class.define(a,{extend:qx.ui.core.Widget,implement:qx.ui.core.ISingleSelection,include:qx.ui.core.MSingleSelectionHandling,construct:function(){qx.ui.core.Widget.call(this);this._setLayout(new qx.ui.layout.Grow);this.addListener(c,this.__nu,this);},properties:{dynamic:{check:b,init:false,apply:d}},members:{_applyDynamic:function(f){var h=this._getChildren();var g=this.getSelection()[0];var j;for(var i=0,l=h.length;i<l;i++){j=h[i];if(j!=g){if(f){h[i].exclude();}else{h[i].hide();}}}},_getItems:function(){return this.getChildren();},_isAllowEmptySelection:function(){return true;},_isItemSelectable:function(k){return true;},__nu:function(e){var m=e.getOldData()[0];var n=e.getData()[0];if(m){if(this.isDynamic()){m.exclude();}else{m.hide();}}if(n){n.show();}},add:function(o){this._add(o);var p=this.getSelection()[0];if(!p){this.setSelection([o]);}else if(p!==o){if(this.isDynamic()){o.exclude();}else{o.hide();}}},remove:function(q){this._remove(q);if(this.getSelection()[0]===q){var r=this._getChildren()[0];if(r){this.setSelection([r]);}else{this.resetSelection();}}},indexOf:function(s){return this._indexOf(s);},getChildren:function(){return this._getChildren();},previous:function(){var v=this.getSelection()[0];var t=this._indexOf(v)-1;var w=this._getChildren();if(t<0){t=w.length-1;}var u=w[t];this.setSelection([u]);},next:function(){var y=this.getSelection()[0];var x=this._indexOf(y)+1;var z=this._getChildren();var A=z[x]||z[0];this.setSelection([A]);}}});})();(function(){var k="pressed",j="abandoned",i="hovered",h="Boolean",g="Space",f="undetermined",d="Enter",c="checked",b="mousedown",a="_applyTriState",w="mouseout",v="changeValue",u="keydown",t="_applyGroup",s="button",r="execute",q="qx.ui.form.RadioGroup",p="_applyValue",o="qx.ui.form.ToggleButton",n="mouseover",l="keyup",m="mouseup";qx.Class.define(o,{extend:qx.ui.basic.Atom,include:[qx.ui.core.MExecutable],implement:[qx.ui.form.IBooleanForm,qx.ui.form.IExecutable,qx.ui.form.IRadioItem],construct:function(x,y){qx.ui.basic.Atom.call(this,x,y);this.addListener(n,this._onMouseOver);this.addListener(w,this._onMouseOut);this.addListener(b,this._onMouseDown);this.addListener(m,this._onMouseUp);this.addListener(u,this._onKeyDown);this.addListener(l,this._onKeyUp);this.addListener(r,this._onExecute,this);},properties:{appearance:{refine:true,init:s},focusable:{refine:true,init:true},value:{check:h,nullable:true,event:v,apply:p,init:false},group:{check:q,nullable:true,apply:t},triState:{check:h,apply:a,nullable:true,init:null}},members:{_applyGroup:function(z,A){if(A){A.remove(this);}if(z){z.add(this);}},_applyValue:function(B,C){B?this.addState(c):this.removeState(c);if(this.isTriState()){if(B===null){this.addState(f);}else if(C===null){this.removeState(f);}}},_applyTriState:function(D,E){this._applyValue(this.getValue());},_onExecute:function(e){this.toggleValue();},_onMouseOver:function(e){if(e.getTarget()!==this){return;}this.addState(i);if(this.hasState(j)){this.removeState(j);this.addState(k);}},_onMouseOut:function(e){if(e.getTarget()!==this){return;}this.removeState(i);if(this.hasState(k)){if(!this.getValue()){this.removeState(k);}this.addState(j);}},_onMouseDown:function(e){if(!e.isLeftPressed()){return;}this.capture();this.removeState(j);this.addState(k);e.stopPropagation();},_onMouseUp:function(e){this.releaseCapture();if(this.hasState(j)){this.removeState(j);}else if(this.hasState(k)){this.execute();}this.removeState(k);e.stopPropagation();},_onKeyDown:function(e){switch(e.getKeyIdentifier()){case d:case g:this.removeState(j);this.addState(k);e.stopPropagation();}},_onKeyUp:function(e){if(!this.hasState(k)){return;}switch(e.getKeyIdentifier()){case d:case g:this.removeState(j);this.execute();this.removeState(k);e.stopPropagation();}}}});})();(function(){var e="inherit",d="toolbar-button",c="qx.ui.toolbar.CheckBox",b="keydown",a="keyup";qx.Class.define(c,{extend:qx.ui.form.ToggleButton,construct:function(f,g){qx.ui.form.ToggleButton.call(this,f,g);this.removeListener(b,this._onKeyDown);this.removeListener(a,this._onKeyUp);},properties:{appearance:{refine:true,init:d},show:{refine:true,init:e},focusable:{refine:true,init:false}}});})();(function(){var a="qx.ui.toolbar.RadioButton";qx.Class.define(a,{extend:qx.ui.toolbar.CheckBox,include:[qx.ui.form.MModelProperty],implement:[qx.ui.form.IModel,qx.ui.form.IRadioItem],members:{_applyValue:function(b,c){qx.ui.toolbar.CheckBox.prototype._applyValue.call(this,b,c);if(b){var d=this.getGroup();if(d){d.setSelection([this]);}}},_onExecute:function(e){var f=this.getGroup();if(f&&f.getAllowEmptySelection()||!f){this.toggleValue();}else{this.setValue(true);}}}});})();(function(){var e="arrow",d="qx.ui.toolbar.MenuButton",c="Boolean",b="_applyShowArrow",a="toolbar-menubutton";qx.Class.define(d,{extend:qx.ui.menubar.Button,properties:{appearance:{refine:true,init:a},showArrow:{check:c,init:false,themeable:true,apply:b}},members:{_createChildControlImpl:function(f,g){var h;switch(f){case e:h=new qx.ui.basic.Image();h.setAnonymous(true);this._addAt(h,10);break;}return h||qx.ui.menubar.Button.prototype._createChildControlImpl.call(this,f);},_applyShowArrow:function(i,j){if(i){this._showChildControl(e);}else{this._excludeChildControl(e);}}}});})();(function(){var j="checked",i="qx.ui.form.RadioGroup",h="Boolean",g="menu-radiobutton",f="_applyValue",d="qx.ui.menu.RadioButton",c="changeValue",b="_applyGroup",a="execute";qx.Class.define(d,{extend:qx.ui.menu.AbstractButton,include:[qx.ui.form.MModelProperty],implement:[qx.ui.form.IRadioItem,qx.ui.form.IBooleanForm,qx.ui.form.IModel],construct:function(k,l){qx.ui.menu.AbstractButton.call(this);if(k!=null){this.setLabel(k);}if(l!=null){this.setMenu(l);}this.addListener(a,this._onExecute,this);},properties:{appearance:{refine:true,init:g},value:{check:h,nullable:true,event:c,apply:f,init:false},group:{check:i,nullable:true,apply:b}},members:{_applyValue:function(m,n){m?this.addState(j):this.removeState(j);},_applyGroup:function(o,p){if(p){p.remove(this);}if(o){o.add(this);}},_onExecute:function(e){this.setValue(true);},_onMouseUp:function(e){if(e.isLeftPressed()){this.execute();}qx.ui.menu.Manager.getInstance().hideAll();},_onKeyPress:function(e){this.execute();}}});})();(function(){var x="pane",w="lastTab",v="page",u="bar",t="firstTab",s="right",r="button",q="bottom",p="left",o="close",f="top",n="changeSelection",j="tabview",c="vertical",b="horizontal",h="_applyBarPosition",g="beforeChangeSelection",k="__DQ",a="qx.ui.tabview.TabView",m="close-button",d="qx.event.type.Data";qx.Class.define(a,{extend:qx.ui.core.Widget,implement:qx.ui.core.ISingleSelection,include:[qx.ui.core.MContentPadding],construct:function(y){qx.ui.core.Widget.call(this);this.__DP={top:"barTop",right:"barRight",bottom:"barBottom",left:"barLeft"};this._createChildControl(u);this._createChildControl(x);var z=this.__DQ=new qx.ui.form.RadioGroup;z.setWrap(false);z.addListener(n,this._onChangeSelection,this);if(y!=null){this.setBarPosition(y);}else{this.initBarPosition();}},events:{"changeSelection":d},properties:{appearance:{refine:true,init:j},barPosition:{check:[p,s,f,q],init:f,apply:h}},members:{__DQ:null,_createChildControlImpl:function(A,B){var C;switch(A){case u:C=new qx.ui.container.SlideBar();C.setZIndex(10);this._add(C);break;case x:C=new qx.ui.container.Stack;C.setZIndex(5);this._add(C,{flex:1});break;}return C||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,A);},_getContentPaddingTarget:function(){return this.getChildControl(x);},add:function(D){{};var E=D.getButton();var F=this.getChildControl(u);var H=this.getChildControl(x);D.exclude();F.add(E);H.add(D);this.__DQ.add(E);D.addState(this.__DP[this.getBarPosition()]);D.addState(w);var G=this.getChildren();if(G[0]==D){D.addState(t);}else{G[G.length-2].removeState(w);}D.addListener(o,this._onPageClose,this);},remove:function(I){var N=this.getChildControl(x);var L=this.getChildControl(u);var K=I.getButton();var M=N.getChildren();if(this.getSelection()[0]==I){var J=M.indexOf(I);if(J==0){if(M[1]){this.setSelection([M[1]]);}else{this.resetSelection();}}else{this.setSelection([M[J-1]]);}}L.remove(K);N.remove(I);this.__DQ.remove(K);I.removeState(this.__DP[this.getBarPosition()]);if(I.hasState(t)){I.removeState(t);if(M[0]){M[0].addState(t);}}if(I.hasState(w)){I.removeState(w);if(M.length>0){M[M.length-1].addState(w);}}I.removeListener(o,this._onPageClose,this);},getChildren:function(){return this.getChildControl(x).getChildren();},indexOf:function(O){return this.getChildControl(x).indexOf(O);},__DP:null,_applyBarPosition:function(P,Q){var R=this.getChildControl(u);var W=P==p||P==s;var U=P==s||P==q;var V=W?qx.ui.layout.HBox:qx.ui.layout.VBox;var Y=this._getLayout();if(Y&&Y instanceof V){}else{this._setLayout(Y=new V);}Y.setReversed(U);R.setOrientation(W?c:b);var X=this.getChildren();if(Q){var S=this.__DP[Q];R.removeState(S);for(var i=0,l=X.length;i<l;i++){X[i].removeState(S);}}if(P){var T=this.__DP[P];R.addState(T);for(var i=0,l=X.length;i<l;i++){X[i].addState(T);}}},getSelection:function(){var ba=this.__DQ.getSelection();var bb=[];for(var i=0;i<ba.length;i++){bb.push(ba[i].getUserData(v));}return bb;},setSelection:function(bc){var bd=[];for(var i=0;i<bc.length;i++){bd.push(bc[i].getChildControl(r));}this.__DQ.setSelection(bd);},resetSelection:function(){this.__DQ.resetSelection();},isSelected:function(be){var bf=be.getChildControl(r);return this.__DQ.isSelected(bf);},isSelectionEmpty:function(){return this.__DQ.isSelectionEmpty();},getSelectables:function(bg){var bh=this.__DQ.getSelectables(bg);var bi=[];for(var i=0;i<bh.length;i++){bi.push(bh[i].getUserData(v));}return bi;},_onChangeSelection:function(e){var bn=this.getChildControl(x);var bk=e.getData()[0];var bm=e.getOldData()[0];var bj=[];var bl=[];if(bk){bj=[bk.getUserData(v)];bn.setSelection(bj);bk.focus();this.scrollChildIntoView(bk,null,null,false);}else{bn.resetSelection();}if(bm){bl=[bm.getUserData(v)];}this.fireDataEvent(n,bj,bl);},_onBeforeChangeSelection:function(e){if(!this.fireNonBubblingEvent(g,qx.event.type.Event,[false,true])){e.preventDefault();}},_onRadioChangeSelection:function(e){var bo=e.getData()[0];if(bo){this.setSelection([bo.getUserData(v)]);}else{this.resetSelection();}},_onPageClose:function(e){var bq=e.getTarget();var bp=bq.getButton().getChildControl(m);bp.reset();this.remove(bq);}},destruct:function(){this._disposeObjects(k);this.__DP=null;}});})();(function(){var k="slider",j="splitter",i="horizontal",h="px",g="vertical",f="knob",d="mousedown",c="mouseout",b="Integer",a="height",D="mousemove",C="move",B="maxHeight",A="resize",z="width",w="_applyOrientation",v="_applyOffset",u="splitpane",t="qx.ui.splitpane.Pane",s="top",q="minHeight",r="mouseup",o="minWidth",p="appear",m="losecapture",n="left",l="maxWidth";qx.Class.define(t,{extend:qx.ui.core.Widget,construct:function(E){qx.ui.core.Widget.call(this);this.__mT=[];if(E){this.setOrientation(E);}else{this.initOrientation();}this.__nc.addListener(d,this._onMouseDown,this);this.__nc.addListener(r,this._onMouseUp,this);this.__nc.addListener(D,this._onMouseMove,this);this.__nc.addListener(c,this._onMouseOut,this);this.__nc.addListener(m,this._onMouseUp,this);},properties:{appearance:{refine:true,init:u},offset:{check:b,init:6,apply:v},orientation:{init:i,check:[i,g],apply:w}},members:{__mU:null,__mV:false,__mW:null,__mX:null,__mY:null,__na:null,__nb:null,__mT:null,__nc:null,_createChildControlImpl:function(F,G){var H;switch(F){case k:H=new qx.ui.splitpane.Slider(this);H.exclude();this._add(H,{type:F});break;case j:H=new qx.ui.splitpane.Splitter(this);this._add(H,{type:F});H.addListener(C,this.__nd,this);break;}return H||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,F);},__nd:function(e){this.__nf(e.getData());},__ne:function(I){this.__nc=new qx.ui.splitpane.Blocker(I);this.getContentElement().add(this.__nc);var J=this.getChildControl(j);var K=J.getWidth();if(!K){J.addListenerOnce(p,function(){this.__nf();},this);}J.addListener(A,function(e){var L=e.getData();if(L.height==0||L.width==0){this.__nc.hide();}else{this.__nc.show();}},this);},getBlocker:function(){return this.__nc;},_applyOrientation:function(M,N){var O=this.getChildControl(k);var R=this.getChildControl(j);this.__mY=M===i;if(!this.__nc){this.__ne(M);}this.__nc.setOrientation(M);var Q=this._getLayout();if(Q){Q.dispose();}var P=M===g?new qx.ui.splitpane.VLayout:new qx.ui.splitpane.HLayout;this._setLayout(P);R.removeState(N);R.addState(M);R.getChildControl(f).removeState(N);R.getChildControl(f).addState(M);O.removeState(N);O.addState(M);qx.ui.core.queue.Manager.flush();this.__nf();},_applyOffset:function(S,T){this.__nf();},__nf:function(U){var V=this.getChildControl(j);var ba=this.getOffset();var bb=V.getBounds();var Y=V.getContainerElement().getDomElement();if(!Y){return;}if(this.__mY){var X=null;if(U){X=U.width;}else if(bb){X=bb.width;}var bc=U&&U.left;if(X){if(!bc){bc=qx.bom.element.Location.getPosition(Y).left;}this.__nc.setWidth(ba,X);this.__nc.setLeft(ba,bc);}}else{var W=null;if(U){W=U.height;}else if(bb){W=bb.height;}var top=U&&U.top;if(W){if(!top){top=qx.bom.element.Location.getPosition(Y).top;}this.__nc.setHeight(ba,W);this.__nc.setTop(ba,top);}}},add:function(bd,be){if(be==null){this._add(bd);}else{this._add(bd,{flex:be});}this.__mT.push(bd);},remove:function(bf){this._remove(bf);qx.lang.Array.remove(this.__mT,bf);},getChildren:function(){return this.__mT;},_onMouseDown:function(e){if(!e.isLeftPressed()){return;}var bg=this.getChildControl(j);var bi=bg.getContainerLocation();var bh=this.getContentLocation();this.__mU=this.__mY?e.getDocumentLeft()-bi.left+bh.left:e.getDocumentTop()-bi.top+bh.top;var bk=this.getChildControl(k);var bj=bg.getBounds();bk.setUserBounds(bj.left,bj.top,bj.width,bj.height);bk.setZIndex(bg.getZIndex()+1);bk.show();this.__mV=true;this.__nc.capture();e.stop();},_onMouseMove:function(e){this._setLastMousePosition(e.getDocumentLeft(),e.getDocumentTop());if(this.__mV){this.__ng();var bl=this.getChildControl(k);var bm=this.__na;if(this.__mY){bl.setDomLeft(bm);this.__nc.setStyle(n,(bm-this.getOffset())+h);}else{bl.setDomTop(bm);this.__nc.setStyle(s,(bm-this.getOffset())+h);}e.stop();}},_onMouseOut:function(e){this._setLastMousePosition(e.getDocumentLeft(),e.getDocumentTop());},_onMouseUp:function(e){if(!this.__mV){return;}this._finalizeSizes();var bn=this.getChildControl(k);bn.exclude();this.__mV=false;this.releaseCapture();e.stop();},_finalizeSizes:function(){var br=this.__na;var bo=this.__nb;if(br==null){return;}var bt=this._getChildren();var bs=bt[2];var bp=bt[3];var bq=bs.getLayoutProperties().flex;var bu=bp.getLayoutProperties().flex;if((bq!=0)&&(bu!=0)){bs.setLayoutProperties({flex:br});bp.setLayoutProperties({flex:bo});}else{if(this.__mY){bs.setWidth(br);bp.setWidth(bo);}else{bs.setHeight(br);bp.setHeight(bo);}}},__ng:function(){if(this.__mY){var bx=o,bE=z,by=l,bC=this.__mW;}else{var bx=q,bE=a,by=B,bC=this.__mX;}var bD=this._getChildren();var bv=bD[2].getSizeHint();var bA=bD[3].getSizeHint();var bB=bD[2].getBounds()[bE]+bD[3].getBounds()[bE];var bz=bC-this.__mU;var bw=bB-bz;if(bz<bv[bx]){bw-=bv[bx]-bz;bz=bv[bx];}else if(bw<bA[bx]){bz-=bA[bx]-bw;bw=bA[bx];}if(bz>bv[by]){bw+=bz-bv[by];bz=bv[by];}else if(bw>bA[by]){bz+=bw-bA[by];bw=bA[by];}this.__na=bz;this.__nb=bw;},_isActiveDragSession:function(){return this.__mV;},_setLastMousePosition:function(x,y){this.__mW=x;this.__mX=y;}},destruct:function(){this.__mT=null;}});})();(function(){var a="qx.ui.splitpane.Slider";qx.Class.define(a,{extend:qx.ui.core.Widget,properties:{allowShrinkX:{refine:true,init:false},allowShrinkY:{refine:true,init:false}}});})();(function(){var e="center",d="knob",c="middle",b="qx.ui.splitpane.Splitter",a="vertical";qx.Class.define(b,{extend:qx.ui.core.Widget,construct:function(f){qx.ui.core.Widget.call(this);if(f.getOrientation()==a){this._setLayout(new qx.ui.layout.HBox(0,e));this._getLayout().setAlignY(c);}else{this._setLayout(new qx.ui.layout.VBox(0,c));this._getLayout().setAlignX(e);}this._createChildControl(d);},properties:{allowShrinkX:{refine:true,init:false},allowShrinkY:{refine:true,init:false}},members:{_createChildControlImpl:function(g,h){var i;switch(g){case d:i=new qx.ui.basic.Image;this._add(i);break;}return i||qx.ui.core.Widget.prototype._createChildControlImpl.call(this,g);}}});})();(function(){var o="px",n="horizontal",m="top",l="height",k="width",j="left",i="100%",h="cursor",g="vertical",f="_applyOrientation",c="qx.ui.splitpane.Blocker",e="col-resize",d="row-resize",b="div",a="absolute";qx.Class.define(c,{extend:qx.html.Element,construct:function(p){var q={position:a,zIndex:11};qx.html.Element.call(this,b,q);if(p){this.setOrientation(p);}else{this.initOrientation();}},properties:{orientation:{init:n,check:[n,g],apply:f}},members:{_applyOrientation:function(r,s){if(r==n){this.setStyle(l,i);this.setStyle(h,e);this.setStyle(m,null);}else{this.setStyle(k,i);this.setStyle(j,null);this.setStyle(h,d);}},setWidth:function(t,u){var v=u+2*t;this.setStyle(k,v+o);},setHeight:function(w,x){var y=x+2*w;this.setStyle(l,y+o);},setLeft:function(z,A){var B=A-z;this.setStyle(j,B+o);},setTop:function(C,D){var top=D-C;this.setStyle(m,top+o);}}});})();(function(){var c="slider",b="splitter",a="qx.ui.splitpane.VLayout";qx.Class.define(a,{extend:qx.ui.layout.Abstract,members:{verifyLayoutProperty:null,renderLayout:function(d,e){var v=this._getLayoutChildren();var length=v.length;var r,u;var g,f,p,h;for(var i=0;i<length;i++){r=v[i];u=r.getLayoutProperties().type;if(u===b){f=r;}else if(u===c){p=r;}else if(!g){g=r;}else{h=r;}}if(g&&h){var x=g.getLayoutProperties().flex;var k=h.getLayoutProperties().flex;if(x==null){x=1;}if(k==null){k=1;}var w=g.getSizeHint();var n=f.getSizeHint();var o=h.getSizeHint();var j=w.height;var s=n.height;var t=o.height;if(x>0&&k>0){var l=x+k;var m=e-s;var j=Math.round((m/l)*x);var t=m-j;var q=qx.ui.layout.Util.arrangeIdeals(w.minHeight,j,w.maxHeight,o.minHeight,t,o.maxHeight);j=q.begin;t=q.end;}else if(x>0){j=e-s-t;if(j<w.minHeight){j=w.minHeight;}if(j>w.maxHeight){j=w.maxHeight;}}else if(k>0){t=e-j-s;if(t<o.minHeight){t=o.minHeight;}if(t>o.maxHeight){t=o.maxHeight;}}g.renderLayout(0,0,d,j);f.renderLayout(0,j,d,s);h.renderLayout(0,j+s,d,t);}else{f.renderLayout(0,0,0,0);if(g){g.renderLayout(0,0,d,e);}else if(h){h.renderLayout(0,0,d,e);}}},_computeSizeHint:function(){var H=this._getLayoutChildren();var length=H.length;var A,z,G;var B=0,D=0,C=0;var E=0,F=0,y=0;for(var i=0;i<length;i++){A=H[i];G=A.getLayoutProperties();if(G.type===c){continue;}z=A.getSizeHint();B+=z.minHeight;D+=z.height;C+=z.maxHeight;if(z.minWidth>E){E=z.minWidth;}if(z.width>F){F=z.width;}if(z.maxWidth>y){y=z.maxWidth;}}return {minHeight:B,height:D,maxHeight:C,minWidth:E,width:F,maxWidth:y};}}});})();(function(){var c="slider",b="splitter",a="qx.ui.splitpane.HLayout";qx.Class.define(a,{extend:qx.ui.layout.Abstract,members:{verifyLayoutProperty:null,renderLayout:function(d,e){var v=this._getLayoutChildren();var length=v.length;var s,u;var g,f,p,h;for(var i=0;i<length;i++){s=v[i];u=s.getLayoutProperties().type;if(u===b){f=s;}else if(u===c){p=s;}else if(!g){g=s;}else{h=s;}}if(g&&h){var x=g.getLayoutProperties().flex;var j=h.getLayoutProperties().flex;if(x==null){x=1;}if(j==null){j=1;}var w=g.getSizeHint();var m=f.getSizeHint();var o=h.getSizeHint();var t=w.width;var r=m.width;var q=o.width;if(x>0&&j>0){var k=x+j;var l=d-r;var t=Math.round((l/k)*x);var q=l-t;var n=qx.ui.layout.Util.arrangeIdeals(w.minWidth,t,w.maxWidth,o.minWidth,q,o.maxWidth);t=n.begin;q=n.end;}else if(x>0){t=d-r-q;if(t<w.minWidth){t=w.minWidth;}if(t>w.maxWidth){t=w.maxWidth;}}else if(j>0){q=d-t-r;if(q<o.minWidth){q=o.minWidth;}if(q>o.maxWidth){q=o.maxWidth;}}g.renderLayout(0,0,t,e);f.renderLayout(t,0,r,e);h.renderLayout(t+r,0,q,e);}else{f.renderLayout(0,0,0,0);if(g){g.renderLayout(0,0,d,e);}else if(h){h.renderLayout(0,0,d,e);}}},_computeSizeHint:function(){var H=this._getLayoutChildren();var length=H.length;var A,z,G;var E=0,F=0,y=0;var B=0,D=0,C=0;for(var i=0;i<length;i++){A=H[i];G=A.getLayoutProperties();if(G.type===c){continue;}z=A.getSizeHint();E+=z.minWidth;F+=z.width;y+=z.maxWidth;if(z.minHeight>B){B=z.minHeight;}if(z.height>D){D=z.height;}if(z.maxHeight>C){C=z.maxHeight;}}return {minWidth:E,width:F,maxWidth:y,minHeight:B,height:D,maxHeight:C};}}});})();(function(){var a="apiviewer.test.LayoutItem";qx.Class.define(a,{extend:qx.core.Object,members:{renderSeparator:function(b,c){}}});})();(function(){var p="other",o="widgets",n="fonts",m="appearances",k="qx.Theme",j="]",h="[Theme ",g="colors",f="decorations",e="Theme",b="meta",d="borders",c="icons";qx.Bootstrap.define(k,{statics:{define:function(name,q){if(!q){var q={};}q.include=this.__rg(q.include);q.patch=this.__rg(q.patch);{};var r={$$type:e,name:name,title:q.title,toString:this.genericToString};if(q.extend){r.supertheme=q.extend;}r.basename=qx.Bootstrap.createNamespace(name,r);this.__rj(r,q);this.__rh(r,q);this.$$registry[name]=r;for(var i=0,a=q.include,l=a.length;i<l;i++){this.include(r,a[i]);}for(var i=0,a=q.patch,l=a.length;i<l;i++){this.patch(r,a[i]);}},__rg:function(s){if(!s){return [];}if(qx.Bootstrap.isArray(s)){return s;}else{return [s];}},__rh:function(t,u){var v=u.aliases||{};if(u.extend&&u.extend.aliases){qx.Bootstrap.objectMergeWith(v,u.extend.aliases,false);}t.aliases=v;},getAll:function(){return this.$$registry;},getByName:function(name){return this.$$registry[name];},isDefined:function(name){return this.getByName(name)!==undefined;},getTotalNumber:function(){return qx.Bootstrap.objectGetLength(this.$$registry);},genericToString:function(){return h+this.name+j;},__ri:function(w){for(var i=0,x=this.__rk,l=x.length;i<l;i++){if(w[x[i]]){return x[i];}}},__rj:function(y,z){var C=this.__ri(z);if(z.extend&&!C){C=z.extend.type;}y.type=C||p;if(!C){return;}var E=function(){};if(z.extend){E.prototype=new z.extend.$$clazz;}var D=E.prototype;var B=z[C];for(var A in B){D[A]=B[A];if(D[A].base){{};D[A].base=z.extend;}}y.$$clazz=E;y[C]=new E;},$$registry:{},__rk:[g,d,f,n,c,o,m,b],__rl:null,__rm:null,__rn:function(){},patch:function(F,G){var I=this.__ri(G);if(I!==this.__ri(F)){throw new Error("The mixins '"+F.name+"' are not compatible '"+G.name+"'!");}var H=G[I];var J=F.$$clazz.prototype;for(var K in H){J[K]=H[K];}},include:function(L,M){var O=M.type;if(O!==L.type){throw new Error("The mixins '"+L.name+"' are not compatible '"+M.name+"'!");}var N=M[O];var P=L.$$clazz.prototype;for(var Q in N){if(P[Q]!==undefined){continue;}P[Q]=N[Q];}}}});})();(function(){var dN="button-frame",dM="atom",dL="widget",dK="main",dJ="button",dI="bold",dH="text-selected",dG="image",dF="middle",dE="selected",co="background-light",cn="cell",cm="text-disabled",cl="groupbox",ck="decoration/arrows/down.png",cj="label",ci="border-invalid",ch="input",cg="white",cf="input-disabled",dU="menu-button",dV="input-focused-invalid",dS="toolbar-button",dT="spinner",dQ="input-focused",dR="popup",dO="tooltip",dP="list",dW="tree-item",dX="treevirtual-contract",dk="scrollbar",dj="datechooser/nav-button",dm="text-hovered",dl="center",dp="treevirtual-expand",dn="textfield",dr="decoration/arrows/right.png",dq="background-application",di="radiobutton",dh="invalid",k="combobox",l="right-top",m="checkbox",n="text-title",o="icon/16/places/folder-open.png",p="qx/static/blank.gif",q="scrollbar/button",r="right",s="combobox/button",t="icon/16/places/folder.png",em="text-label",el="decoration/tree/closed.png",ek="scrollbar-slider-horizontal",ej="checkbox-checked",eq="decoration/arrows/left.png",ep="button-focused",eo="text-light",en="menu-slidebar-button",es="checkbox-undetermined",er="text-input",bm="slidebar/button-forward",bn="background-splitpane",bk=".png",bl="decoration/tree/open.png",bq="default",br="decoration/arrows/down-small.png",bo="datechooser",bp="slidebar/button-backward",bi="selectbox",bj="treevirtual-folder",N="shadow-popup",M="icon/16/mimetypes/office-document.png",P="background-medium",O="icon/32/places/folder-open.png",J="icon/22/places/folder-open.png",I="table",L="decoration/arrows/up.png",K="decoration/form/",H="",G="-invalid",bx="button-checked",by="decoration/window/maximize-active-hovered.png",bz="radiobutton-hovered",bA="keyboard-focus",bt="group-item",bu="decoration/cursors/",bv="slidebar",bw="tooltip-error-arrow",bB="table-scroller-focus-indicator",bC="move-frame",bb="nodrop",ba="decoration/table/boolean-true.png",Y="table-header-cell",X="menu",W="app-header",V="row-layer",U="text-inactive",T="move",bf="radiobutton-checked-focused",be="decoration/window/restore-active-hovered.png",bD="shadow-window",bE="table-column-button",bF="right.png",bG="checkbox-undetermined-hovered",bH="tabview-page-button-bottom-inactive",bI="tooltip-error",bJ="window-statusbar",bK="button-hovered",bL="decoration/scrollbar/scrollbar-",bM="background-tip",cw="scrollbar-slider-horizontal-disabled",cv="table-scroller-header",cu="button-pressed",ct="table-pane",cA="decoration/window/close-active.png",cz="native",cy="checkbox-hovered",cx="button-invalid-shadow",cE="decoration/window/minimize-active-hovered.png",cD="menubar",dc="icon/16/actions/dialog-cancel.png",dd="tabview-page-button-top-inactive",da="tabview-page-button-left-inactive",db="menu-slidebar",cX="toolbar-button-checked",cY="decoration/tree/open-selected.png",cV="radiobutton-checked",cW="decoration/window/minimize-inactive.png",de="icon/16/apps/office-calendar.png",df="group",dv="tabview-page-button-right-inactive",du="decoration/window/minimize-active.png",dx="decoration/window/restore-inactive.png",dw="checkbox-checked-focused",dz="splitpane",dy="combobox/textfield",dB="button-preselected-focused",dA="decoration/window/close-active-hovered.png",dt="qx/icon/Tango/16/actions/window-close.png",ds="checkbox-pressed",ef="button-disabled",eg="selected-dragover",eh="border-separator",ei="decoration/window/maximize-inactive.png",eb="dragover",ec="scrollarea",ed="scrollbar-vertical",ee="decoration/menu/checkbox-invert.gif",dY="decoration/toolbar/toolbar-handle-knob.gif",ea="icon/22/mimetypes/office-document.png",j="button-preselected",i="button-checked-focused",h="up.png",g="best-fit",f="decoration/tree/closed-selected.png",e="qx.theme.modern.Appearance",d="text-active",c="toolbar-button-hovered",b="progressive-table-header",a="decoration/table/select-column-order.png",w="decoration/menu/radiobutton.gif",x="decoration/arrows/forward.png",u="decoration/table/descending.png",v="progressbar",A="window-captionbar-active",B="checkbox-checked-hovered",y="scrollbar-slider-vertical",z="toolbar",D="alias",E="decoration/window/restore-active.png",cI="decoration/table/boolean-false.png",cC="icon/32/mimetypes/office-document.png",cP="radiobutton-checked-disabled",cL="tabview-pane",cr="decoration/arrows/rewind.png",cp="checkbox-focused",R="top",cs="icon/16/actions/dialog-ok.png",bd="radiobutton-checked-hovered",bc="table-header-cell-hovered",bW="window",bX="text-gray",bY="decoration/menu/radiobutton-invert.gif",ca="text-placeholder",cb="slider",cc="keep-align",cd="down.png",ce="tabview-page-button-top-active",bT="icon/22/places/folder.png",bU="decoration/window/maximize-active.png",cq="checkbox-checked-pressed",cO="decoration/window/close-inactive.png",cN="tabview-page-button-left-active",cM="toolbar-part",cT="decoration/splitpane/knob-vertical.png",cS=".gif",cR="radiobutton-checked-pressed",cQ="table-statusbar",cK="radiobutton-pressed",cJ="window-captionbar-inactive",C="copy",bh="radiobutton-focused",bg="decoration/arrows/down-invert.png",cB="decoration/menu/checkbox.gif",bs="decoration/splitpane/knob-horizontal.png",cH="icon/32/places/folder.png",cG="toolbar-separator",cF="tabview-page-button-bottom-active",Q="decoration/arrows/up-small.png",cU="decoration/table/ascending.png",F="decoration/arrows/up-invert.png",S="small",bN="tabview-page-button-right-active",bO="-disabled",bP="scrollbar-horizontal",bQ="checkbox-undetermined-focused",bR="progressive-table-header-cell",bS="menu-separator",dg="pane",bV="decoration/arrows/right-invert.png",dD="left.png",dC="icon/16/actions/view-refresh.png";qx.Theme.define(e,{appearances:{"widget":{},"root":{style:function(et){return {backgroundColor:dq,textColor:em,font:bq};}},"label":{style:function(eu){return {textColor:eu.disabled?cm:undefined};}},"move-frame":{style:function(ev){return {decorator:dK};}},"resize-frame":bC,"dragdrop-cursor":{style:function(ew){var ex=bb;if(ew.copy){ex=C;}else if(ew.move){ex=T;}else if(ew.alias){ex=D;}return {source:bu+ex+cS,position:l,offset:[2,16,2,6]};}},"image":{style:function(ey){return {opacity:!ey.replacement&&ey.disabled?0.3:1};}},"atom":{},"atom/label":cj,"atom/icon":dG,"popup":{style:function(ez){return {decorator:dK,backgroundColor:co,shadow:N};}},"button-frame":{alias:dM,style:function(eA){var eC,eB;if(eA.checked&&eA.focused&&!eA.inner){eC=i;eB=undefined;}else if(eA.disabled){eC=ef;eB=undefined;}else if(eA.pressed){eC=cu;eB=dm;}else if(eA.checked){eC=bx;eB=undefined;}else if(eA.hovered){eC=bK;eB=dm;}else if(eA.preselected&&eA.focused&&!eA.inner){eC=dB;eB=dm;}else if(eA.preselected){eC=j;eB=dm;}else if(eA.focused&&!eA.inner){eC=ep;eB=undefined;}else{eC=dJ;eB=undefined;}return {decorator:eC,textColor:eB,shadow:eA.invalid&&!eA.disabled?cx:undefined};}},"button-frame/image":{style:function(eD){return {opacity:!eD.replacement&&eD.disabled?0.5:1};}},"button":{alias:dN,include:dN,style:function(eE){return {padding:[2,8],center:true};}},"hover-button":{alias:dM,include:dM,style:function(eF){return {decorator:eF.hovered?dE:undefined,textColor:eF.hovered?dH:undefined};}},"splitbutton":{},"splitbutton/button":dJ,"splitbutton/arrow":{alias:dJ,include:dJ,style:function(eG){return {icon:ck,padding:2,marginLeft:1};}},"checkbox":{alias:dM,style:function(eH){var eJ;if(eH.checked){if(eH.disabled){eJ=ej;}else if(eH.focused){eJ=dw;}else if(eH.pressed){eJ=cq;}else if(eH.hovered){eJ=B;}else{eJ=ej;}}else if(eH.undetermined){if(eH.disabled){eJ=es;}else if(eH.focused){eJ=bQ;}else if(eH.hovered){eJ=bG;}else{eJ=es;}}else if(!eH.disabled){if(eH.focused){eJ=cp;}else if(eH.pressed){eJ=ds;}else if(eH.hovered){eJ=cy;}}eJ=eJ||m;var eI=eH.invalid&&!eH.disabled?G:H;return {icon:K+eJ+eI+bk,gap:6};}},"radiobutton":{alias:dM,style:function(eK){var eM;if(eK.checked&&eK.focused){eM=bf;}else if(eK.checked&&eK.disabled){eM=cP;}else if(eK.checked&&eK.pressed){eM=cR;}else if(eK.checked&&eK.hovered){eM=bd;}else if(eK.checked){eM=cV;}else if(eK.focused){eM=bh;}else if(eK.pressed){eM=cK;}else if(eK.hovered){eM=bz;}else{eM=di;}var eL=eK.invalid&&!eK.disabled?G:H;return {icon:K+eM+eL+bk,gap:6};}},"textfield":{style:function(eN){var eS;var eQ=!!eN.focused;var eR=!!eN.invalid;var eO=!!eN.disabled;if(eQ&&eR&&!eO){eS=dV;}else if(eQ&&!eR&&!eO){eS=dQ;}else if(eO){eS=cf;}else if(!eQ&&eR&&!eO){eS=ci;}else{eS=ch;}var eP;if(eN.disabled){eP=cm;}else if(eN.showingPlaceholder){eP=ca;}else{eP=er;}return {decorator:eS,padding:[2,4,1],textColor:eP};}},"textarea":{include:dn,style:function(eT){return {padding:4};}},"spinner":{style:function(eU){var eY;var eW=!!eU.focused;var eX=!!eU.invalid;var eV=!!eU.disabled;if(eW&&eX&&!eV){eY=dV;}else if(eW&&!eX&&!eV){eY=dQ;}else if(eV){eY=cf;}else if(!eW&&eX&&!eV){eY=ci;}else{eY=ch;}return {decorator:eY};}},"spinner/textfield":{style:function(fa){return {marginRight:2,padding:[2,4,1],textColor:fa.disabled?cm:er};}},"spinner/upbutton":{alias:dN,include:dN,style:function(fb){return {icon:Q,padding:fb.pressed?[2,2,0,4]:[1,3,1,3],shadow:undefined};}},"spinner/downbutton":{alias:dN,include:dN,style:function(fc){return {icon:br,padding:fc.pressed?[2,2,0,4]:[1,3,1,3],shadow:undefined};}},"datefield":k,"datefield/button":{alias:s,include:s,style:function(fd){return {icon:de,padding:[0,3],decorator:undefined};}},"datefield/textfield":dy,"datefield/list":{alias:bo,include:bo,style:function(fe){return {decorator:undefined};}},"groupbox":{style:function(ff){return {legendPosition:R};}},"groupbox/legend":{alias:dM,style:function(fg){return {padding:[1,0,1,4],textColor:fg.invalid?dh:n,font:dI};}},"groupbox/frame":{style:function(fh){return {padding:12,decorator:df};}},"check-groupbox":cl,"check-groupbox/legend":{alias:m,include:m,style:function(fi){return {padding:[1,0,1,4],textColor:fi.invalid?dh:n,font:dI};}},"radio-groupbox":cl,"radio-groupbox/legend":{alias:di,include:di,style:function(fj){return {padding:[1,0,1,4],textColor:fj.invalid?dh:n,font:dI};}},"scrollarea":{style:function(fk){return {minWidth:50,minHeight:50};}},"scrollarea/corner":{style:function(fl){return {backgroundColor:dq};}},"scrollarea/pane":dL,"scrollarea/scrollbar-x":dk,"scrollarea/scrollbar-y":dk,"scrollbar":{style:function(fm){if(fm[cz]){return {};}return {width:fm.horizontal?undefined:16,height:fm.horizontal?16:undefined,decorator:fm.horizontal?bP:ed,padding:1};}},"scrollbar/slider":{alias:cb,style:function(fn){return {padding:fn.horizontal?[0,1,0,1]:[1,0,1,0]};}},"scrollbar/slider/knob":{include:dN,style:function(fo){var fp=fo.horizontal?ek:y;if(fo.disabled){fp+=bO;}return {decorator:fp,minHeight:fo.horizontal?undefined:9,minWidth:fo.horizontal?9:undefined};}},"scrollbar/button":{alias:dN,include:dN,style:function(fq){var fr=bL;if(fq.left){fr+=dD;}else if(fq.right){fr+=bF;}else if(fq.up){fr+=h;}else{fr+=cd;}if(fq.left||fq.right){return {padding:[0,0,0,fq.left?3:4],icon:fr,width:15,height:14};}else{return {padding:[0,0,0,2],icon:fr,width:14,height:15};}}},"scrollbar/button-begin":q,"scrollbar/button-end":q,"slider":{style:function(fs){var fw;var fu=!!fs.focused;var fv=!!fs.invalid;var ft=!!fs.disabled;if(fu&&fv&&!ft){fw=dV;}else if(fu&&!fv&&!ft){fw=dQ;}else if(ft){fw=cf;}else if(!fu&&fv&&!ft){fw=ci;}else{fw=ch;}return {decorator:fw};}},"slider/knob":{include:dN,style:function(fx){return {decorator:fx.disabled?cw:ek,shadow:undefined,height:14,width:14};}},"list":{alias:ec,style:function(fy){var fC;var fA=!!fy.focused;var fB=!!fy.invalid;var fz=!!fy.disabled;if(fA&&fB&&!fz){fC=dV;}else if(fA&&!fB&&!fz){fC=dQ;}else if(fz){fC=cf;}else if(!fA&&fB&&!fz){fC=ci;}else{fC=ch;}return {backgroundColor:co,decorator:fC};}},"list/pane":dL,"listitem":{alias:dM,style:function(fD){var fE;if(fD.dragover){fE=fD.selected?eg:eb;}else{fE=fD.selected?dE:undefined;}return {padding:fD.dragover?[4,4,2,4]:4,textColor:fD.selected?dH:undefined,decorator:fE};}},"slidebar":{},"slidebar/scrollpane":{},"slidebar/content":{},"slidebar/button-forward":{alias:dN,include:dN,style:function(fF){return {padding:5,center:true,icon:fF.vertical?ck:dr};}},"slidebar/button-backward":{alias:dN,include:dN,style:function(fG){return {padding:5,center:true,icon:fG.vertical?L:eq};}},"tabview":{style:function(fH){return {contentPadding:16};}},"tabview/bar":{alias:bv,style:function(fI){var fJ={marginBottom:fI.barTop?-1:0,marginTop:fI.barBottom?-4:0,marginLeft:fI.barRight?-3:0,marginRight:fI.barLeft?-1:0,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0};if(fI.barTop||fI.barBottom){fJ.paddingLeft=5;fJ.paddingRight=7;}else{fJ.paddingTop=5;fJ.paddingBottom=7;}return fJ;}},"tabview/bar/button-forward":{include:bm,alias:bm,style:function(fK){if(fK.barTop||fK.barBottom){return {marginTop:2,marginBottom:2};}else{return {marginLeft:2,marginRight:2};}}},"tabview/bar/button-backward":{include:bp,alias:bp,style:function(fL){if(fL.barTop||fL.barBottom){return {marginTop:2,marginBottom:2};}else{return {marginLeft:2,marginRight:2};}}},"tabview/bar/scrollpane":{},"tabview/pane":{style:function(fM){return {decorator:cL,minHeight:100,marginBottom:fM.barBottom?-1:0,marginTop:fM.barTop?-1:0,marginLeft:fM.barLeft?-1:0,marginRight:fM.barRight?-1:0};}},"tabview-page":dL,"tabview-page/button":{alias:dM,style:function(fN){var fT,fP=0;var fS=0,fO=0,fQ=0,fR=0;if(fN.checked){if(fN.barTop){fT=ce;fP=[6,14];fQ=fN.firstTab?0:-5;fR=fN.lastTab?0:-5;}else if(fN.barBottom){fT=cF;fP=[6,14];fQ=fN.firstTab?0:-5;fR=fN.lastTab?0:-5;}else if(fN.barRight){fT=bN;fP=[6,13];fS=fN.firstTab?0:-5;fO=fN.lastTab?0:-5;}else{fT=cN;fP=[6,13];fS=fN.firstTab?0:-5;fO=fN.lastTab?0:-5;}}else{if(fN.barTop){fT=dd;fP=[4,10];fS=4;fQ=fN.firstTab?5:1;fR=1;}else if(fN.barBottom){fT=bH;fP=[4,10];fO=4;fQ=fN.firstTab?5:1;fR=1;}else if(fN.barRight){fT=dv;fP=[4,10];fR=5;fS=fN.firstTab?5:1;fO=1;fQ=1;}else{fT=da;fP=[4,10];fQ=5;fS=fN.firstTab?5:1;fO=1;fR=1;}}return {zIndex:fN.checked?10:5,decorator:fT,padding:fP,marginTop:fS,marginBottom:fO,marginLeft:fQ,marginRight:fR,textColor:fN.checked?d:U};}},"tabview-page/button/label":{alias:cj,style:function(fU){return {padding:[0,1,0,1],margin:fU.focused?0:1,decorator:fU.focused?bA:undefined};}},"tabview-page/button/close-button":{alias:dM,style:function(fV){return {icon:dt};}},"toolbar":{style:function(fW){return {decorator:z,spacing:2};}},"toolbar/part":{style:function(fX){return {decorator:cM,spacing:2};}},"toolbar/part/container":{style:function(fY){return {paddingLeft:2,paddingRight:2};}},"toolbar/part/handle":{style:function(ga){return {source:dY,marginLeft:3,marginRight:3};}},"toolbar-button":{alias:dM,style:function(gb){return {marginTop:2,marginBottom:2,padding:(gb.pressed||gb.checked||gb.hovered)&&!gb.disabled||(gb.disabled&&gb.checked)?3:5,decorator:gb.pressed||(gb.checked&&!gb.hovered)||(gb.checked&&gb.disabled)?cX:gb.hovered&&!gb.disabled?c:undefined};}},"toolbar-menubutton":{alias:dS,include:dS,style:function(gc){return {showArrow:true};}},"toolbar-menubutton/arrow":{alias:dG,include:dG,style:function(gd){return {source:br};}},"toolbar-splitbutton":{style:function(ge){return {marginTop:2,marginBottom:2};}},"toolbar-splitbutton/button":{alias:dS,include:dS,style:function(gf){return {icon:ck,marginTop:undefined,marginBottom:undefined};}},"toolbar-splitbutton/arrow":{alias:dS,include:dS,style:function(gg){if(gg.pressed||gg.checked||(gg.hovered&&!gg.disabled)){var gh=1;}else{var gh=3;}return {padding:gh,icon:ck,marginTop:undefined,marginBottom:undefined};}},"toolbar-separator":{style:function(gi){return {decorator:cG,margin:7};}},"tree":dP,"tree-item":{style:function(gj){return {padding:[2,6],textColor:gj.selected?dH:undefined,decorator:gj.selected?dE:undefined};}},"tree-item/icon":{include:dG,style:function(gk){return {paddingRight:5};}},"tree-item/label":cj,"tree-item/open":{include:dG,style:function(gl){var gm;if(gl.selected&&gl.opened){gm=cY;}else if(gl.selected&&!gl.opened){gm=f;}else if(gl.opened){gm=bl;}else{gm=el;}return {padding:[0,5,0,2],source:gm};}},"tree-folder":{include:dW,alias:dW,style:function(gn){var gp,go;if(gn.small){gp=gn.opened?o:t;go=o;}else if(gn.large){gp=gn.opened?O:cH;go=O;}else{gp=gn.opened?J:bT;go=J;}return {icon:gp,iconOpened:go};}},"tree-file":{include:dW,alias:dW,style:function(gq){return {icon:gq.small?M:gq.large?cC:ea};}},"treevirtual":I,"treevirtual-folder":{style:function(gr){return {icon:gr.opened?o:t};}},"treevirtual-file":{include:bj,alias:bj,style:function(gs){return {icon:M};}},"treevirtual-line":{style:function(gt){return {icon:p};}},"treevirtual-contract":{style:function(gu){return {icon:bl,paddingLeft:5,paddingTop:2};}},"treevirtual-expand":{style:function(gv){return {icon:el,paddingLeft:5,paddingTop:2};}},"treevirtual-only-contract":dX,"treevirtual-only-expand":dp,"treevirtual-start-contract":dX,"treevirtual-start-expand":dp,"treevirtual-end-contract":dX,"treevirtual-end-expand":dp,"treevirtual-cross-contract":dX,"treevirtual-cross-expand":dp,"treevirtual-end":{style:function(gw){return {icon:p};}},"treevirtual-cross":{style:function(gx){return {icon:p};}},"tooltip":{include:dR,style:function(gy){return {backgroundColor:bM,padding:[1,3,2,3],offset:[15,5,5,5]};}},"tooltip/atom":dM,"tooltip-error":{include:dO,style:function(gz){return {textColor:dH,placeMethod:dL,offset:[0,0,0,14],marginTop:-2,position:l,showTimeout:100,hideTimeout:10000,decorator:bI,shadow:bw,font:dI};}},"tooltip-error/atom":dM,"window":{style:function(gA){return {shadow:bD,contentPadding:[10,10,10,10]};}},"window/pane":{style:function(gB){return {decorator:bW};}},"window/captionbar":{style:function(gC){return {decorator:gC.active?A:cJ,textColor:gC.active?cg:bX,minHeight:26,paddingRight:2};}},"window/icon":{style:function(gD){return {margin:[5,0,3,6]};}},"window/title":{style:function(gE){return {alignY:dF,font:dI,marginLeft:6,marginRight:12};}},"window/minimize-button":{alias:dM,style:function(gF){return {icon:gF.active?gF.hovered?cE:du:cW,margin:[4,8,2,0]};}},"window/restore-button":{alias:dM,style:function(gG){return {icon:gG.active?gG.hovered?be:E:dx,margin:[5,8,2,0]};}},"window/maximize-button":{alias:dM,style:function(gH){return {icon:gH.active?gH.hovered?by:bU:ei,margin:[4,8,2,0]};}},"window/close-button":{alias:dM,style:function(gI){return {icon:gI.active?gI.hovered?dA:cA:cO,margin:[4,8,2,0]};}},"window/statusbar":{style:function(gJ){return {padding:[2,6],decorator:bJ,minHeight:18};}},"window/statusbar-text":{style:function(gK){return {font:S};}},"iframe":{style:function(gL){return {decorator:dK};}},"resizer":{style:function(gM){return {decorator:dg};}},"splitpane":{style:function(gN){return {decorator:dz};}},"splitpane/splitter":{style:function(gO){return {width:gO.horizontal?3:undefined,height:gO.vertical?3:undefined,backgroundColor:bn};}},"splitpane/splitter/knob":{style:function(gP){return {source:gP.horizontal?bs:cT};}},"splitpane/slider":{style:function(gQ){return {width:gQ.horizontal?3:undefined,height:gQ.vertical?3:undefined,backgroundColor:bn};}},"selectbox":{alias:dN,include:dN,style:function(gR){return {padding:[2,8]};}},"selectbox/atom":dM,"selectbox/popup":dR,"selectbox/list":{alias:dP},"selectbox/arrow":{include:dG,style:function(gS){return {source:ck,paddingLeft:5};}},"datechooser":{style:function(gT){var gX;var gV=!!gT.focused;var gW=!!gT.invalid;var gU=!!gT.disabled;if(gV&&gW&&!gU){gX=dV;}else if(gV&&!gW&&!gU){gX=dQ;}else if(gU){gX=cf;}else if(!gV&&gW&&!gU){gX=ci;}else{gX=ch;}return {padding:2,decorator:gX,backgroundColor:co};}},"datechooser/navigation-bar":{},"datechooser/nav-button":{include:dN,alias:dN,style:function(gY){var ha={padding:[2,4],shadow:undefined};if(gY.lastYear){ha.icon=cr;ha.marginRight=1;}else if(gY.lastMonth){ha.icon=eq;}else if(gY.nextYear){ha.icon=x;ha.marginLeft=1;}else if(gY.nextMonth){ha.icon=dr;}return ha;}},"datechooser/last-year-button-tooltip":dO,"datechooser/last-month-button-tooltip":dO,"datechooser/next-year-button-tooltip":dO,"datechooser/next-month-button-tooltip":dO,"datechooser/last-year-button":dj,"datechooser/last-month-button":dj,"datechooser/next-month-button":dj,"datechooser/next-year-button":dj,"datechooser/month-year-label":{style:function(hb){return {font:dI,textAlign:dl,textColor:hb.disabled?cm:undefined};}},"datechooser/date-pane":{style:function(hc){return {textColor:hc.disabled?cm:undefined,marginTop:2};}},"datechooser/weekday":{style:function(hd){return {textColor:hd.disabled?cm:hd.weekend?eo:undefined,textAlign:dl,paddingTop:2,backgroundColor:P};}},"datechooser/week":{style:function(he){return {textAlign:dl,padding:[2,4],backgroundColor:P};}},"datechooser/day":{style:function(hf){return {textAlign:dl,decorator:hf.disabled?undefined:hf.selected?dE:undefined,textColor:hf.disabled?cm:hf.selected?dH:hf.otherMonth?eo:undefined,font:hf.today?dI:undefined,padding:[2,4]};}},"combobox":{style:function(hg){var hk;var hi=!!hg.focused;var hj=!!hg.invalid;var hh=!!hg.disabled;if(hi&&hj&&!hh){hk=dV;}else if(hi&&!hj&&!hh){hk=dQ;}else if(hh){hk=cf;}else if(!hi&&hj&&!hh){hk=ci;}else{hk=ch;}return {decorator:hk};}},"combobox/popup":dR,"combobox/list":{alias:dP},"combobox/button":{include:dN,alias:dN,style:function(hl){var hm={icon:ck,padding:2};if(hl.selected){hm.decorator=ep;}return hm;}},"combobox/textfield":{include:dn,style:function(hn){return {decorator:undefined};}},"menu":{style:function(ho){var hp={decorator:X,shadow:N,spacingX:6,spacingY:1,iconColumnWidth:16,arrowColumnWidth:4,placementModeY:ho.submenu||ho.contextmenu?g:cc};if(ho.submenu){hp.position=l;hp.offset=[-2,-3];}return hp;}},"menu/slidebar":db,"menu-slidebar":dL,"menu-slidebar-button":{style:function(hq){return {decorator:hq.hovered?dE:undefined,padding:7,center:true};}},"menu-slidebar/button-backward":{include:en,style:function(hr){return {icon:hr.hovered?F:L};}},"menu-slidebar/button-forward":{include:en,style:function(hs){return {icon:hs.hovered?bg:ck};}},"menu-separator":{style:function(ht){return {height:0,decorator:bS,margin:[4,2]};}},"menu-button":{alias:dM,style:function(hu){return {decorator:hu.selected?dE:undefined,textColor:hu.selected?dH:undefined,padding:[4,6]};}},"menu-button/icon":{include:dG,style:function(hv){return {alignY:dF};}},"menu-button/label":{include:cj,style:function(hw){return {alignY:dF,padding:1};}},"menu-button/shortcut":{include:cj,style:function(hx){return {alignY:dF,marginLeft:14,padding:1};}},"menu-button/arrow":{include:dG,style:function(hy){return {source:hy.selected?bV:dr,alignY:dF};}},"menu-checkbox":{alias:dU,include:dU,style:function(hz){return {icon:!hz.checked?undefined:hz.selected?ee:cB};}},"menu-radiobutton":{alias:dU,include:dU,style:function(hA){return {icon:!hA.checked?undefined:hA.selected?bY:w};}},"menubar":{style:function(hB){return {decorator:cD};}},"menubar-button":{alias:dM,style:function(hC){return {decorator:(hC.pressed||hC.hovered)&&!hC.disabled?dE:undefined,textColor:hC.pressed||hC.hovered?dH:undefined,padding:[3,8]};}},"colorselector":dL,"colorselector/control-bar":dL,"colorselector/control-pane":dL,"colorselector/visual-pane":cl,"colorselector/preset-grid":dL,"colorselector/colorbucket":{style:function(hD){return {decorator:dK,width:16,height:16};}},"colorselector/preset-field-set":cl,"colorselector/input-field-set":cl,"colorselector/preview-field-set":cl,"colorselector/hex-field-composite":dL,"colorselector/hex-field":dn,"colorselector/rgb-spinner-composite":dL,"colorselector/rgb-spinner-red":dT,"colorselector/rgb-spinner-green":dT,"colorselector/rgb-spinner-blue":dT,"colorselector/hsb-spinner-composite":dL,"colorselector/hsb-spinner-hue":dT,"colorselector/hsb-spinner-saturation":dT,"colorselector/hsb-spinner-brightness":dT,"colorselector/preview-content-old":{style:function(hE){return {decorator:dK,width:50,height:10};}},"colorselector/preview-content-new":{style:function(hF){return {decorator:dK,backgroundColor:co,width:50,height:10};}},"colorselector/hue-saturation-field":{style:function(hG){return {decorator:dK,margin:5};}},"colorselector/brightness-field":{style:function(hH){return {decorator:dK,margin:[5,7]};}},"colorselector/hue-saturation-pane":dL,"colorselector/hue-saturation-handle":dL,"colorselector/brightness-pane":dL,"colorselector/brightness-handle":dL,"colorpopup":{alias:dR,include:dR,style:function(hI){return {padding:5,backgroundColor:dq};}},"colorpopup/field":{style:function(hJ){return {decorator:dK,margin:2,width:14,height:14,backgroundColor:co};}},"colorpopup/selector-button":dJ,"colorpopup/auto-button":dJ,"colorpopup/preview-pane":cl,"colorpopup/current-preview":{style:function(hK){return {height:20,padding:4,marginLeft:4,decorator:dK,allowGrowX:true};}},"colorpopup/selected-preview":{style:function(hL){return {height:20,padding:4,marginRight:4,decorator:dK,allowGrowX:true};}},"colorpopup/colorselector-okbutton":{alias:dJ,include:dJ,style:function(hM){return {icon:cs};}},"colorpopup/colorselector-cancelbutton":{alias:dJ,include:dJ,style:function(hN){return {icon:dc};}},"table":{alias:dL,style:function(hO){return {decorator:I};}},"table-header":{},"table/statusbar":{style:function(hP){return {decorator:cQ,padding:[0,2]};}},"table/column-button":{alias:dN,style:function(hQ){return {decorator:bE,padding:3,icon:a};}},"table-column-reset-button":{include:dU,alias:dU,style:function(){return {icon:dC};}},"table-scroller":dL,"table-scroller/scrollbar-x":dk,"table-scroller/scrollbar-y":dk,"table-scroller/header":{style:function(hR){return {decorator:cv};}},"table-scroller/pane":{style:function(hS){return {backgroundColor:ct};}},"table-scroller/focus-indicator":{style:function(hT){return {decorator:bB};}},"table-scroller/resize-line":{style:function(hU){return {backgroundColor:eh,width:2};}},"table-header-cell":{alias:dM,style:function(hV){return {minWidth:13,minHeight:20,padding:hV.hovered?[3,4,2,4]:[3,4],decorator:hV.hovered?bc:Y,sortIcon:hV.sorted?(hV.sortedAscending?cU:u):undefined};}},"table-header-cell/label":{style:function(hW){return {minWidth:0,alignY:dF,paddingRight:5};}},"table-header-cell/sort-icon":{style:function(hX){return {alignY:dF,alignX:r};}},"table-header-cell/icon":{style:function(hY){return {minWidth:0,alignY:dF,paddingRight:5};}},"table-editor-textfield":{include:dn,style:function(ia){return {decorator:undefined,padding:[2,2],backgroundColor:co};}},"table-editor-selectbox":{include:bi,alias:bi,style:function(ib){return {padding:[0,2],backgroundColor:co};}},"table-editor-combobox":{include:k,alias:k,style:function(ic){return {decorator:undefined,backgroundColor:co};}},"progressive-table-header":{alias:dL,style:function(id){return {decorator:b};}},"progressive-table-header-cell":{alias:dM,style:function(ie){return {minWidth:40,minHeight:25,paddingLeft:6,decorator:bR};}},"app-header":{style:function(ig){return {font:dI,textColor:dH,padding:[8,12],decorator:W};}},"virtual-list":dP,"virtual-list/row-layer":V,"row-layer":{style:function(ih){return {colorEven:cg,colorOdd:cg};}},"group-item":{include:cj,alias:cj,style:function(ii){return {padding:4,decorator:bt,textColor:cg,font:dI};}},"column-layer":dL,"cell":{style:function(ij){return {textColor:ij.selected?dH:em,padding:[3,6],font:bq};}},"cell-string":cn,"cell-number":{include:cn,style:function(ik){return {textAlign:r};}},"cell-image":cn,"cell-boolean":{include:cn,style:function(il){return {iconTrue:ba,iconFalse:cI};}},"cell-atom":cn,"cell-date":cn,"cell-html":cn,"htmlarea":{"include":dL,style:function(im){return {backgroundColor:cg};}},"progressbar":{style:function(io){return {decorator:v,padding:[1],backgroundColor:cg};}},"progressbar/progress":{style:function(ip){return {decorator:dE};}}}});})();(function(){var g="#134275",f="scrollarea",e="main",d="Theme for API Viewer",c="apiviewer.Appearance",b="white",a="bold";qx.Theme.define(c,{title:d,extend:qx.theme.modern.Appearance,appearances:{"toggleview":{style:function(h){return {width:240,decorator:e};}},"detailviewer":{style:function(i){return {backgroundColor:b,decorator:e};}},"legend":{include:f,alias:f,style:function(j){return {contentPadding:[10,10,10,10]};}},"legendview-label-important":{style:function(k){return {textColor:g,font:a};}},"legendview-label":{style:function(l){return {textColor:g};}},"tabview":{style:function(m){return {contentPadding:0};}},"tabview/pane":{style:function(n){return {minHeight:100,marginBottom:n.barBottom?-1:0,marginTop:n.barTop?-1:0,marginLeft:n.barLeft?-1:0,marginRight:n.barRight?-1:0};}}}});})();(function(){var a="apiviewer.test.Widget";qx.Class.define(a,{extend:apiviewer.test.LayoutItem,members:{renderSeparator:function(b,c){}}});})();(function(){var a="apiviewer.test.Methods";qx.Class.define(a,{extend:Object,members:{toString:function(){},valueOf:function(){},isPrototypeOf:function(){},hasOwnProperty:function(){},toLocaleString:function(){}}});})();(function(){var h="apiviewer.ClassLoader",g="(",f=")",e=".json",d="completed",c=".",b="/",a="failed";qx.Class.define(h,{extend:qx.core.Object,construct:function(j){qx.core.Object.call(this);this._baseUri=j;},members:{load:function(k,l,m,self){var n=this._baseUri+b+k+e;var o=new qx.io.remote.Request(n);var p=null;o.setAsynchronous(l);o.setTimeout(30000);o.setProhibitCaching(false);o.addListener(d,function(q){var content=eval(g+q.getContent()+f);var r=k.substring(0,k.lastIndexOf(c));var s=apiviewer.dao.Class.getClassByName(r);p=new apiviewer.dao.Class(content,s);s.addClass(p);this.__Tc(p,m,self);},this);o.addListener(a,function(t){alert("Couldn't load file: "+n);},this);o.send();return p;},__Tc:function(u,v,self){if(v){if(self){v.call(self,u);}else{v(u);}}},__Td:function(w,x,self){var z=[];var y=0;var A,i;for(i=0;i<w.length;i++){A=w[i];if(!A.isLoaded()){z.push(A);}}for(i=0;i<z.length;i++){this.load(z[i].getFullName(),true,function(B){y+=1;if(y==z.length){this.__Tc(apiviewer.dao.Class.getClassByName(w[0].getFullName()),x,self);}},this);}if(z.length==0){this.__Tc(w[0],x,self);}},classLoadDependendClasses:function(C,D,self){var E=C.getDependendClasses();this.__Td(E,D,self);},packageLoadDependendClasses:function(F,G,self){var H=F.getClasses();this.__Td(H,G,self);}}});})();(function(){var a="qx.application.IApplication";qx.Interface.define(a,{members:{main:function(){},finalize:function(){},close:function(){},terminate:function(){}}});})();(function(){var b="abstract",a="qx.application.AbstractGui";qx.Class.define(a,{type:b,extend:qx.core.Object,implement:[qx.application.IApplication],include:qx.locale.MTranslation,members:{__nv:null,_createRootWidget:function(){throw new Error("Abstract method call");},getRoot:function(){return this.__nv;},main:function(){qx.theme.manager.Meta.getInstance().initialize();qx.ui.tooltip.Manager.getInstance();this.__nv=this._createRootWidget();},finalize:function(){this.render();},render:function(){qx.ui.core.queue.Manager.flush();},close:function(c){},terminate:function(){}},destruct:function(){this.__nv=null;}});})();(function(){var a="qx.application.Standalone";qx.Class.define(a,{extend:qx.application.AbstractGui,members:{_createRootWidget:function(){return new qx.ui.root.Application(document);}}});})();(function(){var e="controller",d="script/apidata.json",c="apiviewer/css/apiviewer.css",b="apiviewer.Application",a="viewer";qx.Class.define(b,{extend:qx.application.Standalone,construct:function(){qx.application.Standalone.call(this);qx.bom.Stylesheet.includeFile(c);},members:{main:function(){qx.application.Standalone.prototype.main.call(this);{};qx.Class.include(qx.ui.core.Widget,apiviewer.MWidgetRegistry);this.viewer=new apiviewer.Viewer();this.controller=new apiviewer.Controller();this.getRoot().add(this.viewer,{edge:0});},finalize:function(){qx.application.Standalone.prototype.finalize.call(this);this.controller.load(d);}},destruct:function(){this._disposeObjects(a,e);}});})();(function(){var f="_applyTheme",e="qx.theme",d="qx.theme.manager.Meta",c="qx.theme.Modern",b="Theme",a="singleton";qx.Class.define(d,{type:a,extend:qx.core.Object,properties:{theme:{check:b,nullable:true,apply:f}},members:{_applyTheme:function(g,h){var k=null;var n=null;var q=null;var r=null;var m=null;if(g){k=g.meta.color||null;n=g.meta.decoration||null;q=g.meta.font||null;r=g.meta.icon||null;m=g.meta.appearance||null;}var o=qx.theme.manager.Color.getInstance();var p=qx.theme.manager.Decoration.getInstance();var i=qx.theme.manager.Font.getInstance();var l=qx.theme.manager.Icon.getInstance();var j=qx.theme.manager.Appearance.getInstance();o.setTheme(k);p.setTheme(n);i.setTheme(q);l.setTheme(r);j.setTheme(m);},initialize:function(){var t=qx.core.Setting;var s,u;s=t.get(e);if(s){u=qx.Theme.getByName(s);if(!u){throw new Error("The theme to use is not available: "+s);}this.setTheme(u);}}},settings:{"qx.theme":c}});})();(function(){var e="qx.theme.manager.Icon",d="Theme",c="changeTheme",b="_applyTheme",a="singleton";qx.Class.define(e,{type:a,extend:qx.core.Object,properties:{theme:{check:d,nullable:true,apply:b,event:c}},members:{_applyTheme:function(f,g){var i=qx.util.AliasManager.getInstance();if(g){for(var h in g.aliases){i.remove(h);}}if(f){for(var h in f.aliases){i.add(h,f.aliases[h]);}}}}});})();(function(){var p="Boolean",o="focusout",n="interval",m="mouseover",l="mouseout",k="mousemove",j="widget",i="qx.ui.tooltip.ToolTip",h="_applyCurrent",g="qx.ui.tooltip.Manager",c="__qV",f="__qS",d="tooltip-error",b="__qT",a="singleton";qx.Class.define(g,{type:a,extend:qx.core.Object,construct:function(){qx.core.Object.call(this);qx.event.Registration.addListener(document.body,m,this.__rd,this,true);this.__qS=new qx.event.Timer();this.__qS.addListener(n,this.__ra,this);this.__qT=new qx.event.Timer();this.__qT.addListener(n,this.__rb,this);this.__qU={left:0,top:0};},properties:{current:{check:i,nullable:true,apply:h},showInvalidToolTips:{check:p,init:true},showToolTips:{check:p,init:true}},members:{__qU:null,__qT:null,__qS:null,__qV:null,__qW:null,__qX:function(){if(!this.__qV){this.__qV=new qx.ui.tooltip.ToolTip().set({rich:true});}return this.__qV;},__qY:function(){if(!this.__qW){this.__qW=new qx.ui.tooltip.ToolTip().set({appearance:d});this.__qW.syncAppearance();}return this.__qW;},_applyCurrent:function(q,r){if(r&&qx.ui.core.Widget.contains(r,q)){return;}if(r){if(!r.isDisposed()){r.exclude();}this.__qS.stop();this.__qT.stop();}var t=qx.event.Registration;var s=document.body;if(q){this.__qS.startWith(q.getShowTimeout());t.addListener(s,l,this.__re,this,true);t.addListener(s,o,this.__rf,this,true);t.addListener(s,k,this.__rc,this,true);}else{t.removeListener(s,l,this.__re,this,true);t.removeListener(s,o,this.__rf,this,true);t.removeListener(s,k,this.__rc,this,true);}},__ra:function(e){var u=this.getCurrent();if(u&&!u.isDisposed()){this.__qT.startWith(u.getHideTimeout());if(u.getPlaceMethod()==j){u.placeToWidget(u.getOpener());}else{u.placeToPoint(this.__qU);}u.show();}this.__qS.stop();},__rb:function(e){var v=this.getCurrent();if(v&&!v.isDisposed()){v.exclude();}this.__qT.stop();this.resetCurrent();},__rc:function(e){var w=this.__qU;w.left=e.getDocumentLeft();w.top=e.getDocumentTop();},__rd:function(e){var z=qx.ui.core.Widget.getWidgetByElement(e.getTarget());if(!z){return;}var A,B,y,x;while(z!=null){A=z.getToolTip();B=z.getToolTipText()||null;y=z.getToolTipIcon()||null;if(qx.Class.hasInterface(z.constructor,qx.ui.form.IForm)&&!z.isValid()){x=z.getInvalidMessage();}if(A||B||y||x){break;}z=z.getLayoutParent();}if(!z||!z.getEnabled()||z.isBlockToolTip()||(!x&&!this.getShowToolTips())||(x&&!this.getShowInvalidToolTips())){return;}if(x){A=this.__qY().set({label:x});}if(!A){A=this.__qX().set({label:B,icon:y});}this.setCurrent(A);A.setOpener(z);},__re:function(e){var C=qx.ui.core.Widget.getWidgetByElement(e.getTarget());if(!C){return;}var D=qx.ui.core.Widget.getWidgetByElement(e.getRelatedTarget());if(!D){return;}var E=this.getCurrent();if(E&&(D==E||qx.ui.core.Widget.contains(E,D))){return;}if(D&&C&&qx.ui.core.Widget.contains(C,D)){return;}if(E&&!D){this.setCurrent(null);}else{this.resetCurrent();}},__rf:function(e){var F=qx.ui.core.Widget.getWidgetByElement(e.getTarget());if(!F){return;}var G=this.getCurrent();if(G&&G==F.getToolTip()){this.setCurrent(null);}}},destruct:function(){qx.event.Registration.removeListener(document.body,m,this.__rd,this,true);this._disposeObjects(f,b,c);this.__qU=null;}});})();(function(){var c="_applyId",b="String",a="apiviewer.MWidgetRegistry";qx.Mixin.define(a,{properties:{id:{check:b,apply:c,nullable:true,init:null}},members:{_applyId:function(d,e){var f=apiviewer.MWidgetRegistry;if(e){f.unregister(this,e);}if(d){f.register(this,d);}},getWidgetById:function(g){return apiviewer.MWidgetRegistry.getWidgetById(g);}},statics:{__Te:{},getWidgetById:function(h){return this.__Te[h];},register:function(i,j){if(this.__Te[j]){throw new Error("An object with the id '"+j+"' already exists.");}this.__Te[j]=i;},unregister:function(k,l){if(this.__Te[l]!==k){throw new Error("The object is not registered with the id '"+l+"'.");}delete (this.__Te[l]);}}});})();(function(){var k="value",j="nodeName",i="showPrivate",h="#",g="expandProperties",f="changeSelection",d="(",c="showInherited",b="showProtected",a="request",L="mousedown",K="btn_inherited",J=")",I="application",H="_detailLoader",G="aborted",F="_classLoader",E="btn_protected",D="detail_loader",C=" - ",r="btn_expand",s="$1#$2",p="package",q="tree",n="./script",o="btn_private",l="apiviewer.Controller",m="_tabViewController",t="completed",u="failed",x="$1~$2",w="API Documentation",z="file:",y="_history",B="_tree",A="itemName",v="classLinkClicked";qx.Class.define(l,{extend:qx.core.Object,construct:function(M){qx.core.Object.call(this);this._widgetRegistry=apiviewer.MWidgetRegistry;this._titlePrefix=w;document.title=this._titlePrefix;this._classLoader=new apiviewer.ClassLoader(n);this._detailLoader=this._widgetRegistry.getWidgetById(D);this._tabViewController=new apiviewer.TabViewController(this._widgetRegistry);this.__Tg();this._tree=this._widgetRegistry.getWidgetById(q);this.__Th();this.__Ti();this._history=qx.bom.History.getInstance();this.__Tj();qx.core.Init.getApplication().getRoot().addListener(L,function(e){this.__Tf=e.isShiftPressed()||e.isCtrlOrCommandPressed();},this,true);},members:{__Tf:false,$$logCategory:I,load:function(N){var P=new qx.io.remote.Request(N);P.setTimeout(180000);P.setProhibitCaching(false);P.addListener(t,function(R){var V=new Date();{};var content=R.getContent();var S=new Date();var T=eval(d+content+J);var U=new Date();{};qx.event.Timer.once(function(){this.__Tk(T);qx.event.Timer.once(function(){var W=this._history.getState();if(W){this.__Tl(this.__Tn(W));}else{var Y=this.__To(T);var X=Y.attributes.fullName;this.__Tl(X);}},this,0);},this,0);},this);var O=function(ba){this.error("Couldn't load file: "+N);if(window.location.protocol==z){alert("Failed to load API data from the file system.\n\n"+"The security settings of your browser may prohibit AJAX "+"when using the file protocol. Please try the http protocol "+"instead.");}};P.addListener(u,O,this);P.addListener(G,O,this);var Q=new Date();P.send();},__Tg:function(){this._tabViewController.addListener(v,function(bb){this._updateHistory(bb.getData());},this);this._tabViewController.addListener(f,function(bc){var be=bc.getData()[0];if(this._ignoreTabViewSelection==true){return;}if(be&&be.getUserData(j)){var bf=be.getUserData(j);var bd=be.getUserData(A);if(bd!=null){this._updateHistory(bf+h+bd);}else{this._updateHistory(bf);}}else{this._tree.resetSelection();}},this);},__Th:function(){this._tree.addListener(f,function(bg){var bh=bg.getData()[0];if(bh&&bh.getUserData(j)&&!this._ignoreTreeSelection){var bi=bh.getUserData(j);this._updateHistory(bi);}},this);},__Ti:function(){var bk=apiviewer.UiModel.getInstance();var bm=this._widgetRegistry.getWidgetById(K);bm.bind(k,bk,c);bk.bind(c,bm,k);var bj=this._widgetRegistry.getWidgetById(r);bj.bind(k,bk,g);bk.bind(g,bj,k);var bl=this._widgetRegistry.getWidgetById(E);bl.bind(k,bk,b);bk.bind(b,bl,k);var bn=this._widgetRegistry.getWidgetById(o);bn.bind(k,bk,i);bk.bind(i,bn,k);},__Tj:function(){this._history.addListener(a,function(bo){var bp=this.__Tn(bo.getData());if(bp){this.__Tl(bp);}},this);},__Tk:function(bq){var br=new Date();var bs=new apiviewer.dao.Package(bq);var bt=new Date();{};var br=new Date();this._tree.setTreeData(bs);var bt=new Date();{};return true;},_updateHistory:function(bu){var bv=bu+C+this._titlePrefix;qx.bom.History.getInstance().addToHistory(this.__Tm(bu),bv);},_selectClass:function(bw,bx,self){this._detailLoader.exclude();this._tabViewController.showTabView();var by=bx?qx.lang.Function.bind(bx,self):function(){};if(bw instanceof apiviewer.dao.Class){this._classLoader.classLoadDependendClasses(bw,function(bz){this._tabViewController.openClass(bz,this.__Tf);by();},this);}else{this._classLoader.packageLoadDependendClasses(bw,function(){this._tabViewController.openPackage(bw,this.__Tf);by();},this);}},__Tl:function(bA){var bD=bA;var bG=null;var bC=bA.indexOf(h);if(bC!=-1){bD=bA.substring(0,bC);bG=bA.substring(bC+1);var bE=bG.indexOf(d);if(bE!=-1){bG=qx.lang.String.trim(bG.substring(0,bE));}}this._ignoreTreeSelection=true;var bF=this._tree.selectTreeNodeByClassName(bD);this._ignoreTreeSelection=false;if(!bF){this.error("Unknown class: "+bD);alert("Unknown class: "+bD);return;}var bB=this._tree.getSelection()[0].getUserData(j)||bD;this._ignoreTabViewSelection=true;this._selectClass(apiviewer.dao.Class.getClassByName(bB),function(){if(bG){if(!this._tabViewController.showItem(bG)){this.error("Unknown item of class '"+bD+"': "+bG);alert("Unknown item of class '"+bD+"': "+bG);this._updateHistory(bD);this._ignoreTabViewSelection=false;return;}}this._updateHistory(bA);this._ignoreTabViewSelection=false;},this);},__Tm:function(bH){return bH.replace(/(.*)#(.*)/g,x);},__Tn:function(bI){return bI.replace(/(.*)~(.*)/g,s);},__To:function(bJ){if(bJ.type&&bJ.type==p){return bJ;}else{return this.__To(bJ.children[0]);}}},destruct:function(){this._widgetRegistry=null;this._disposeObjects(H,F,B,y,m);}});})();(function(){var m="",l='#',k="String",j="request",i="mshtml",h="changeTitle",g="abstract",f="_applyState",e="qx.client",d="changeState",a="qx.bom.History",c="_applyTitle",b="qx.event.type.Data";qx.Class.define(a,{extend:qx.core.Object,type:g,construct:function(){qx.core.Object.call(this);this._baseUrl=window.location.href.split(l)[0]+l;this.__vx={};this._setInitialState();},events:{"request":b},statics:{SUPPORTS_HASH_CHANGE_EVENT:(qx.bom.client.Engine.MSHTML&&document.documentMode>=8)||(!qx.bom.client.Engine.MSHTML&&document.documentMode&&"onhashchange" in window),getInstance:function(){if(!this.$$instance){if(this.SUPPORTS_HASH_CHANGE_EVENT){this.$$instance=new qx.bom.NativeHistory();}else if(qx.core.Variant.isSet(e,i)){this.$$instance=new qx.bom.IframeHistory();}else{this.$$instance=new qx.bom.NativeHistory();}}return this.$$instance;}},properties:{title:{check:k,event:h,nullable:true,apply:c},state:{check:k,event:d,nullable:true,apply:f}},members:{__vx:null,_applyState:function(n,o){this._writeState(n);},_setInitialState:function(){this.setState(this._readState());},_encode:function(p){if(qx.lang.Type.isString(p)){return encodeURIComponent(p);}return m;},_decode:function(q){if(qx.lang.Type.isString(q)){return decodeURIComponent(q);}return m;},_applyTitle:function(r){if(r!=null){document.title=r||m;}},addToHistory:function(s,t){if(!qx.lang.Type.isString(s)){s=s+m;}if(qx.lang.Type.isString(t)){this.setTitle(t);this.__vx[s]=t;}if(this.getState()!==s){this._writeState(s);}},navigateBack:function(){qx.event.Timer.once(function(){history.back();},0);},navigateForward:function(){qx.event.Timer.once(function(){history.forward();},0);},_onHistoryLoad:function(u){this.setState(u);this.fireDataEvent(j,u);if(this.__vx[u]!=null){this.setTitle(this.__vx[u]);}},_readState:function(){throw new Error("Abstract method call");},_writeState:function(){throw new Error("Abstract method call");},_setHash:function(v){var w=this._baseUrl+(v||m);var x=window.location;if(w!=x.href){x.href=w;}},_getHash:function(){var y=/#(.*)$/.exec(window.location.href);return y&&y[1]?y[1]:m;}},destruct:function(){this.__vx=null;}});})();(function(){var d="hashchange",c="interval",b="qx.bom.NativeHistory",a="qx.client";qx.Class.define(b,{extend:qx.bom.History,construct:function(){qx.bom.History.call(this);this.__vz();},members:{__vy:null,__vz:function(){if(qx.bom.History.SUPPORTS_HASH_CHANGE_EVENT){this.__vy=qx.lang.Function.bind(this.__vB,this);qx.bom.Event.addNativeListener(window,d,this.__vy);}else{qx.event.Idle.getInstance().addListener(c,this.__vB,this);}},__vA:function(){if(qx.bom.History.SUPPORTS_HASH_CHANGE_EVENT){qx.bom.Event.removeNativeListener(window,d,this.__vy);}else{qx.event.Idle.getInstance().removeListener(c,this.__vB,this);}},__vB:function(){var e=this._readState();if(qx.lang.Type.isString(e)&&e!=this.getState()){this._onHistoryLoad(e);}},_readState:function(){return this._decode(this._getHash());},_writeState:qx.core.Variant.select(a,{"opera":function(f){qx.event.Timer.once(function(){this._setHash(this._encode(f));},this,0);},"default":function(g){this._setHash(this._encode(g));}})},destruct:function(){this.__vA();}});})();(function(){var n="interval",m="-1000px",l="mshtml",k="",j="qx.bom.IframeHistory",i="qx/static/blank.html",h="state",g='<html><body><div id="state">',f='</div></body></html>',d="hidden",a="qx.client",c="undefined",b="absolute";if(qx.core.Variant.isSet(a,l)){qx.Class.define(j,{extend:qx.bom.History,construct:function(){qx.bom.History.call(this);this.__vF();},members:{__vC:null,__vD:false,__vE:null,_setInitialState:function(){qx.bom.History.prototype._setInitialState.call(this);this.__vE=this._getHash();},_setHash:function(o){qx.bom.History.prototype._setHash.call(this,o);this.__vE=this._encode(o);},_readState:function(){if(!this.__vD){return this._decode(this._getHash());}var p=this.__vC.contentWindow.document;var q=p.getElementById(h);return q?this._decode(q.innerText):k;},_writeState:function(r){var r=this._encode(r);this._setHash(r);this.__vE=r;try{var s=this.__vC.contentWindow.document;s.open();s.write(g+r+f);s.close();}catch(t){}},__vF:function(){this.__vJ(function(){qx.event.Idle.getInstance().addListener(n,this.__vG,this);});},__vG:function(e){var v=null;var u=this._getHash();if(!this.__vI(u)){v=this.__vH(u);}else{v=this._readState();}if(qx.lang.Type.isString(v)&&v!=this.getState()){this._onHistoryLoad(v);}},__vH:function(w){w=this._decode(w);this._writeState(w);return w;},__vI:function(x){return qx.lang.Type.isString(x)&&x==this.__vE;},__vJ:function(y){this.__vC=this.__vK();document.body.appendChild(this.__vC);this.__vL(function(){this._writeState(this.getState());if(y){y.call(this);}},this);},__vK:function(){var z=qx.bom.Iframe.create({src:qx.util.ResourceManager.getInstance().toUri(i)});z.style.visibility=d;z.style.position=b;z.style.left=m;z.style.top=m;return z;},__vL:function(A,B,C){if(typeof C===c){C=0;}if(!this.__vC.contentWindow||!this.__vC.contentWindow.document){if(C>20){throw new Error("can't initialize iframe");}qx.event.Timer.once(function(){this.__vL(A,B,++C);},this,10);return;}this.__vD=true;A.call(B||window);}},destruct:function(){this.__vC=null;qx.event.Idle.getInstance().addListener(n,this.__vG,this);}});}})();(function(){var n="Liberation Sans",m="Arial",l="Lucida Grande",k="sans-serif",j="Tahoma",i="Candara",h="Segoe UI",g="Consolas",f="Courier New",e="Monaco",b="monospace",d="Lucida Console",c="qx.theme.modern.Font",a="DejaVu Sans Mono";qx.Theme.define(c,{fonts:{"default":{size:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?12:11,lineHeight:1.4,family:qx.bom.client.Platform.MAC?[l]:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?[h,i]:[j,n,m,k]},"bold":{size:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?12:11,lineHeight:1.4,family:qx.bom.client.Platform.MAC?[l]:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?[h,i]:[j,n,m,k],bold:true},"small":{size:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?11:10,lineHeight:1.4,family:qx.bom.client.Platform.MAC?[l]:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?[h,i]:[j,n,m,k]},"monospace":{size:11,lineHeight:1.4,family:qx.bom.client.Platform.MAC?[d,e]:(qx.bom.client.System.WINVISTA||qx.bom.client.System.WIN7)?[g]:[g,a,f,b]}}});})();(function(){var c="Tango",b="qx/icon/Tango",a="qx.theme.icon.Tango";qx.Theme.define(a,{title:c,aliases:{"icon":b},icons:{}});})();(function(){var i="Number",h="_applyInsets",g="abstract",f="insetRight",e="insetTop",d="insetBottom",c="qx.ui.decoration.Abstract",b="shorthand",a="insetLeft";qx.Class.define(c,{extend:qx.core.Object,implement:[qx.ui.decoration.IDecorator],type:g,properties:{insetLeft:{check:i,nullable:true,apply:h},insetRight:{check:i,nullable:true,apply:h},insetBottom:{check:i,nullable:true,apply:h},insetTop:{check:i,nullable:true,apply:h},insets:{group:[e,f,d,a],mode:b}},members:{__oa:null,_getDefaultInsets:function(){throw new Error("Abstract method called.");},_isInitialized:function(){throw new Error("Abstract method called.");},_resetInsets:function(){this.__oa=null;},getInsets:function(){if(this.__oa){return this.__oa;}var j=this._getDefaultInsets();return this.__oa={left:this.getInsetLeft()==null?j.left:this.getInsetLeft(),right:this.getInsetRight()==null?j.right:this.getInsetRight(),bottom:this.getInsetBottom()==null?j.bottom:this.getInsetBottom(),top:this.getInsetTop()==null?j.top:this.getInsetTop()};},_applyInsets:function(){{};this.__oa=null;}},destruct:function(){this.__oa=null;}});})();(function(){var q="_applyBackground",p="repeat",o="mshtml",n="backgroundPositionX",m="",l="backgroundPositionY",k="no-repeat",j="scale",i=" ",h="repeat-x",c="qx.client",g="repeat-y",f="hidden",b="qx.ui.decoration.MBackgroundImage",a="String",e='"></div>',d='<div style="';qx.Mixin.define(b,{properties:{backgroundImage:{check:a,nullable:true,apply:q},backgroundRepeat:{check:[p,h,g,k,j],init:p,apply:q},backgroundPositionX:{nullable:true,apply:q},backgroundPositionY:{nullable:true,apply:q},backgroundPosition:{group:[l,n]}},members:{_generateBackgroundMarkup:function(r){var v=m;var u=this.getBackgroundImage();var t=this.getBackgroundRepeat();var top=this.getBackgroundPositionY();if(top==null){top=0;}var w=this.getBackgroundPositionX();if(w==null){w=0;}r.backgroundPosition=w+i+top;if(u){var s=qx.util.AliasManager.getInstance().resolve(u);v=qx.bom.element.Decoration.create(s,t,r);}else{if(r){if(qx.core.Variant.isSet(c,o)){if(qx.bom.client.Engine.VERSION<7||qx.bom.client.Feature.QUIRKS_MODE){r.overflow=f;}}v=d+qx.bom.element.Style.compile(r)+e;}}return v;},_applyBackground:function(){{};}}});})();(function(){var j="_applyStyle",i="solid",h="Color",g="",f="double",e="px",d="px ",c="dotted",b="_applyWidth",a="dashed",E="Number",D=" ",C="shorthand",B="widthTop",A="styleRight",z="styleLeft",y="widthLeft",x="widthBottom",w="styleTop",v="colorBottom",q="styleBottom",r="widthRight",o="colorLeft",p="colorRight",m="colorTop",n="border-top",k="border-left",l="border-right",s="qx.ui.decoration.Single",t="border-bottom",u="absolute";qx.Class.define(s,{extend:qx.ui.decoration.Abstract,include:[qx.ui.decoration.MBackgroundImage],construct:function(F,G,H){qx.ui.decoration.Abstract.call(this);if(F!=null){this.setWidth(F);}if(G!=null){this.setStyle(G);}if(H!=null){this.setColor(H);}},properties:{widthTop:{check:E,init:0,apply:b},widthRight:{check:E,init:0,apply:b},widthBottom:{check:E,init:0,apply:b},widthLeft:{check:E,init:0,apply:b},styleTop:{nullable:true,check:[i,c,a,f],init:i,apply:j},styleRight:{nullable:true,check:[i,c,a,f],init:i,apply:j},styleBottom:{nullable:true,check:[i,c,a,f],init:i,apply:j},styleLeft:{nullable:true,check:[i,c,a,f],init:i,apply:j},colorTop:{nullable:true,check:h,apply:j},colorRight:{nullable:true,check:h,apply:j},colorBottom:{nullable:true,check:h,apply:j},colorLeft:{nullable:true,check:h,apply:j},backgroundColor:{check:h,nullable:true,apply:j},left:{group:[y,z,o]},right:{group:[r,A,p]},top:{group:[B,w,m]},bottom:{group:[x,q,v]},width:{group:[B,r,x,y],mode:C},style:{group:[w,A,q,z],mode:C},color:{group:[m,p,v,o],mode:C}},members:{__pl:null,_getDefaultInsets:function(){return {top:this.getWidthTop(),right:this.getWidthRight(),bottom:this.getWidthBottom(),left:this.getWidthLeft()};},_isInitialized:function(){return !!this.__pl;},getMarkup:function(I){if(this.__pl){return this.__pl;}var J=qx.theme.manager.Color.getInstance();var K={};var M=this.getWidthTop();if(M>0){K[n]=M+d+this.getStyleTop()+D+(J.resolve(this.getColorTop())||g);}var M=this.getWidthRight();if(M>0){K[l]=M+d+this.getStyleRight()+D+(J.resolve(this.getColorRight())||g);}var M=this.getWidthBottom();if(M>0){K[t]=M+d+this.getStyleBottom()+D+(J.resolve(this.getColorBottom())||g);}var M=this.getWidthLeft();if(M>0){K[k]=M+d+this.getStyleLeft()+D+(J.resolve(this.getColorLeft())||g);}{};K.position=u;K.top=0;K.left=0;var L=this._generateBackgroundMarkup(K);return this.__pl=L;},resize:function(N,O,P){var Q=this.getInsets();O-=Q.left+Q.right;P-=Q.top+Q.bottom;if(O<0){O=0;}if(P<0){P=0;}N.style.width=O+e;N.style.height=P+e;N.style.left=(parseInt(N.style.left,10)+Q.left-this.getWidthLeft())+e;N.style.top=(parseInt(N.style.top,10)+Q.top-this.getWidthTop())+e;},tint:function(R,S){var T=qx.theme.manager.Color.getInstance();if(S==null){S=this.getBackgroundColor();}R.style.backgroundColor=T.resolve(S)||g;},_applyWidth:function(){{};this._resetInsets();},_applyStyle:function(){{};}},destruct:function(){this.__pl=null;}});})();(function(){var f="px",e="qx.ui.decoration.Background",d="",c="_applyStyle",b="Color",a="absolute";qx.Class.define(e,{extend:qx.ui.decoration.Abstract,include:[qx.ui.decoration.MBackgroundImage],construct:function(g){qx.ui.decoration.Abstract.call(this);if(g!=null){this.setBackgroundColor(g);}},properties:{backgroundColor:{check:b,nullable:true,apply:c}},members:{__oe:null,_getDefaultInsets:function(){return {top:0,right:0,bottom:0,left:0};},_isInitialized:function(){return !!this.__oe;},getMarkup:function(){if(this.__oe){return this.__oe;}var h={position:a,top:0,left:0};var i=this._generateBackgroundMarkup(h);return this.__oe=i;},resize:function(j,k,l){var m=this.getInsets();j.style.width=(k-m.left-m.right)+f;j.style.height=(l-m.top-m.bottom)+f;j.style.left=-m.left+f;j.style.top=-m.top+f;},tint:function(n,o){var p=qx.theme.manager.Color.getInstance();if(o==null){o=this.getBackgroundColor();}n.style.backgroundColor=p.resolve(o)||d;},_applyStyle:function(){{};}},destruct:function(){this.__oe=null;}});})();(function(){var j="_applyStyle",i='"></div>',h="Color",g="1px",f='<div style="',e='border:',d="1px solid ",c="",b=";",a="px",v='</div>',u="qx.ui.decoration.Beveled",t='<div style="position:absolute;top:1px;left:1px;',s='border-bottom:',r='border-right:',q='border-left:',p='border-top:',o="Number",n='<div style="position:absolute;top:1px;left:0px;',m='position:absolute;top:0px;left:1px;',k='<div style="overflow:hidden;font-size:0;line-height:0;">',l="absolute";qx.Class.define(u,{extend:qx.ui.decoration.Abstract,include:[qx.ui.decoration.MBackgroundImage],construct:function(w,x,y){qx.ui.decoration.Abstract.call(this);if(w!=null){this.setOuterColor(w);}if(x!=null){this.setInnerColor(x);}if(y!=null){this.setInnerOpacity(y);}},properties:{innerColor:{check:h,nullable:true,apply:j},innerOpacity:{check:o,init:1,apply:j},outerColor:{check:h,nullable:true,apply:j},backgroundColor:{check:h,nullable:true,apply:j}},members:{__ry:null,_getDefaultInsets:function(){return {top:2,right:2,bottom:2,left:2};},_isInitialized:function(){return !!this.__ry;},_applyStyle:function(){{};},getMarkup:function(){if(this.__ry){return this.__ry;}var z=qx.theme.manager.Color.getInstance();var A=[];var D=d+z.resolve(this.getOuterColor())+b;var C=d+z.resolve(this.getInnerColor())+b;A.push(k);A.push(f);A.push(e,D);A.push(qx.bom.element.Opacity.compile(0.35));A.push(i);A.push(n);A.push(q,D);A.push(r,D);A.push(qx.bom.element.Opacity.compile(1));A.push(i);A.push(f);A.push(m);A.push(p,D);A.push(s,D);A.push(qx.bom.element.Opacity.compile(1));A.push(i);var B={position:l,top:g,left:g,opacity:1};A.push(this._generateBackgroundMarkup(B));A.push(t);A.push(e,C);A.push(qx.bom.element.Opacity.compile(this.getInnerOpacity()));A.push(i);A.push(v);return this.__ry=A.join(c);},resize:function(E,F,G){if(F<4){F=4;}if(G<4){G=4;}if(qx.bom.client.Feature.CONTENT_BOX){var outerWidth=F-2;var outerHeight=G-2;var M=outerWidth;var L=outerHeight;var innerWidth=F-4;var innerHeight=G-4;}else{var outerWidth=F;var outerHeight=G;var M=F-2;var L=G-2;var innerWidth=M;var innerHeight=L;}var O=a;var K=E.childNodes[0].style;K.width=outerWidth+O;K.height=outerHeight+O;var J=E.childNodes[1].style;J.width=outerWidth+O;J.height=L+O;var I=E.childNodes[2].style;I.width=M+O;I.height=outerHeight+O;var H=E.childNodes[3].style;H.width=M+O;H.height=L+O;var N=E.childNodes[4].style;N.width=innerWidth+O;N.height=innerHeight+O;},tint:function(P,Q){var R=qx.theme.manager.Color.getInstance();if(Q==null){Q=this.getBackgroundColor();}P.childNodes[3].style.backgroundColor=R.resolve(Q)||c;}},destruct:function(){this.__ry=null;}});})();(function(){var o="_applyStyle",n="",m="Color",l="px",k="solid",j="dotted",i="double",h="dashed",g="_applyWidth",f="qx.ui.decoration.Uniform",c="px ",e=" ",d="scale",b="PositiveInteger",a="absolute";qx.Class.define(f,{extend:qx.ui.decoration.Abstract,include:[qx.ui.decoration.MBackgroundImage],construct:function(p,q,r){qx.ui.decoration.Abstract.call(this);if(p!=null){this.setWidth(p);}if(q!=null){this.setStyle(q);}if(r!=null){this.setColor(r);}},properties:{width:{check:b,init:0,apply:g},style:{nullable:true,check:[k,j,h,i],init:k,apply:o},color:{nullable:true,check:m,apply:o},backgroundColor:{check:m,nullable:true,apply:o}},members:{__rP:null,_getDefaultInsets:function(){var s=this.getWidth();return {top:s,right:s,bottom:s,left:s};},_isInitialized:function(){return !!this.__rP;},getMarkup:function(){if(this.__rP){return this.__rP;}var t={position:a,top:0,left:0};var u=this.getWidth();{};var w=qx.theme.manager.Color.getInstance();t.border=u+c+this.getStyle()+e+(w.resolve(this.getColor())||n);var v=this._generateBackgroundMarkup(t);return this.__rP=v;},resize:function(x,y,z){var B=this.getBackgroundImage()&&this.getBackgroundRepeat()==d;if(B||qx.bom.client.Feature.CONTENT_BOX){var A=this.getWidth()*2;y-=A;z-=A;if(y<0){y=0;}if(z<0){z=0;}}x.style.width=y+l;x.style.height=z+l;},tint:function(C,D){var E=qx.theme.manager.Color.getInstance();if(D==null){D=this.getBackgroundColor();}C.style.backgroundColor=E.resolve(D)||n;},_applyWidth:function(){{};this._resetInsets();},_applyStyle:function(){{};}},destruct:function(){this.__rP=null;}});})();(function(){var m="Number",l="_applyInsets",k="-l",j="insetRight",i="insetTop",h="_applyBaseImage",g="insetBottom",f="set",e="shorthand",d="-t",a="insetLeft",c="String",b="qx.ui.decoration.Grid";qx.Class.define(b,{extend:qx.core.Object,implement:[qx.ui.decoration.IDecorator],construct:function(n,o){qx.core.Object.call(this);if(qx.ui.decoration.css3.BorderImage.IS_SUPPORTED){this.__oA=new qx.ui.decoration.css3.BorderImage();if(n){this.__oB(n);}}else{this.__oA=new qx.ui.decoration.GridDiv(n);}if(o!=null){this.__oA.setInsets(o);}},properties:{baseImage:{check:c,nullable:true,apply:h},insetLeft:{check:m,nullable:true,apply:l},insetRight:{check:m,nullable:true,apply:l},insetBottom:{check:m,nullable:true,apply:l},insetTop:{check:m,nullable:true,apply:l},insets:{group:[i,j,g,a],mode:e}},members:{__oA:null,getMarkup:function(){return this.__oA.getMarkup();},resize:function(p,q,r){this.__oA.resize(p,q,r);},tint:function(s,t){},getInsets:function(){return this.__oA.getInsets();},_applyInsets:function(u,v,name){var w=f+qx.lang.String.firstUp(name);this.__oA[w](u);},_applyBaseImage:function(x,y){if(this.__oA instanceof qx.ui.decoration.GridDiv){this.__oA.setBaseImage(x);}else{this.__oB(x);}},__oB:function(z){var B,D;this.__oA.setBorderImage(z);var F=qx.util.AliasManager.getInstance().resolve(z);var G=/(.*)(\.[a-z]+)$/.exec(F);var C=G[1];var E=G[2];var A=qx.util.ResourceManager.getInstance();var H=A.getImageHeight(C+d+E);var I=A.getImageWidth(C+k+E);{};this.__oA.setSlice([H,I]);}},destruct:function(){this.__oA=null;}});})();(function(){var m="solid",l="scale",k="border-main",j="white",i="repeat-x",h="border-separator",g="background-light",f="invalid",e="border-focused-invalid",d="border-input",bt="border-disabled",bs="decoration/table/header-cell.png",br="decoration/form/input.png",bq="#f8f8f8",bp="decoration/scrollbar/scrollbar-button-bg-horizontal.png",bo="#b6b6b6",bn="background-pane",bm="repeat-y",bl="decoration/form/input-focused.png",bk="#33508D",t="decoration/selection.png",u="decoration/scrollbar/scrollbar-button-bg-vertical.png",r="decoration/tabview/tab-button-top-active.png",s="black",p="decoration/group-item.png",q="decoration/form/button-c.png",n="decoration/scrollbar/scrollbar-bg-vertical.png",o="decoration/form/button.png",B="decoration/form/button-checked.png",C="decoration/tabview/tab-button-left-inactive.png",O="decoration/groupbox/groupbox.png",K="#FAFAFA",W="decoration/pane/pane.png",R="dotted",bg="decoration/toolbar/toolbar-part.gif",bc="decoration/tabview/tab-button-top-inactive.png",G="decoration/menu/bar-background.png",bj="center",bi="decoration/tabview/tab-button-bottom-active.png",bh="decoration/form/button-hovered.png",F="decoration/form/tooltip-error-arrow.png",I="decoration/window/captionbar-inactive.png",J="qx/decoration/Modern",M="decoration/menu/background.png",P="decoration/window/statusbar.png",S="border-focused",Y="table-focus-indicator",be="#F2F2F2",v="decoration/form/button-checked-c.png",w="decoration/scrollbar/scrollbar-bg-horizontal.png",H="qx.theme.modern.Decoration",V="#f4f4f4",U="decoration/shadow/shadow-small.png",T="decoration/app-header.png",bb="decoration/tabview/tabview-pane.png",ba="decoration/form/tooltip-error.png",Q="decoration/form/button-focused.png",X="decoration/tabview/tab-button-bottom-inactive.png",a="decoration/form/button-disabled.png",bd="decoration/tabview/tab-button-right-active.png",x="decoration/form/button-pressed.png",y="no-repeat",L="decoration/window/captionbar-active.png",b="decoration/tabview/tab-button-left-active.png",c="background-splitpane",E="decoration/form/button-checked-focused.png",z="#C5C5C5",A="decoration/toolbar/toolbar-gradient.png",D="decoration/tabview/tab-button-right-inactive.png",N="#b8b8b8",bf="decoration/shadow/shadow.png";qx.Theme.define(H,{aliases:{decoration:J},decorations:{"main":{decorator:qx.ui.decoration.Uniform,style:{width:1,color:k}},"selected":{decorator:qx.ui.decoration.Background,style:{backgroundImage:t,backgroundRepeat:l}},"selected-dragover":{decorator:qx.ui.decoration.Single,style:{backgroundImage:t,backgroundRepeat:l,bottom:[2,m,bk]}},"dragover":{decorator:qx.ui.decoration.Single,style:{bottom:[2,m,bk]}},"pane":{decorator:qx.ui.decoration.Grid,style:{baseImage:W,insets:[0,2,3,0]}},"group":{decorator:qx.ui.decoration.Grid,style:{baseImage:O}},"border-invalid":{decorator:qx.ui.decoration.Beveled,style:{outerColor:f,innerColor:j,innerOpacity:0.5,backgroundImage:br,backgroundRepeat:i,backgroundColor:g}},"keyboard-focus":{decorator:qx.ui.decoration.Single,style:{width:1,color:s,style:R}},"separator-horizontal":{decorator:qx.ui.decoration.Single,style:{widthLeft:1,colorLeft:h}},"separator-vertical":{decorator:qx.ui.decoration.Single,style:{widthTop:1,colorTop:h}},"tooltip-error":{decorator:qx.ui.decoration.Grid,style:{baseImage:ba,insets:[2,5,5,2]}},"tooltip-error-arrow":{decorator:qx.ui.decoration.Background,style:{backgroundImage:F,backgroundPositionY:bj,backgroundRepeat:y,insets:[0,0,0,10]}},"shadow-window":{decorator:qx.ui.decoration.Grid,style:{baseImage:bf,insets:[4,8,8,4]}},"shadow-popup":{decorator:qx.ui.decoration.Grid,style:{baseImage:U,insets:[0,3,3,0]}},"scrollbar-horizontal":{decorator:qx.ui.decoration.Background,style:{backgroundImage:w,backgroundRepeat:i}},"scrollbar-vertical":{decorator:qx.ui.decoration.Background,style:{backgroundImage:n,backgroundRepeat:bm}},"scrollbar-slider-horizontal":{decorator:qx.ui.decoration.Beveled,style:{backgroundImage:bp,backgroundRepeat:l,outerColor:k,innerColor:j,innerOpacity:0.5}},"scrollbar-slider-horizontal-disabled":{decorator:qx.ui.decoration.Beveled,style:{backgroundImage:bp,backgroundRepeat:l,outerColor:bt,innerColor:j,innerOpacity:0.3}},"scrollbar-slider-vertical":{decorator:qx.ui.decoration.Beveled,style:{backgroundImage:u,backgroundRepeat:l,outerColor:k,innerColor:j,innerOpacity:0.5}},"scrollbar-slider-vertical-disabled":{decorator:qx.ui.decoration.Beveled,style:{backgroundImage:u,backgroundRepeat:l,outerColor:bt,innerColor:j,innerOpacity:0.3}},"button":{decorator:qx.ui.decoration.Grid,style:{baseImage:o,insets:2}},"button-disabled":{decorator:qx.ui.decoration.Grid,style:{baseImage:a,insets:2}},"button-focused":{decorator:qx.ui.decoration.Grid,style:{baseImage:Q,insets:2}},"button-hovered":{decorator:qx.ui.decoration.Grid,style:{baseImage:bh,insets:2}},"button-pressed":{decorator:qx.ui.decoration.Grid,style:{baseImage:x,insets:2}},"button-checked":{decorator:qx.ui.decoration.Grid,style:{baseImage:B,insets:2}},"button-checked-focused":{decorator:qx.ui.decoration.Grid,style:{baseImage:E,insets:2}},"button-invalid-shadow":{decorator:qx.ui.decoration.Beveled,style:{outerColor:f,innerColor:e,insets:[1]}},"checkbox-invalid-shadow":{decorator:qx.ui.decoration.Beveled,style:{outerColor:f,innerColor:e,insets:[0]}},"input":{decorator:qx.ui.decoration.Beveled,style:{outerColor:d,innerColor:j,innerOpacity:0.5,backgroundImage:br,backgroundRepeat:i,backgroundColor:g}},"input-focused":{decorator:qx.ui.decoration.Beveled,style:{outerColor:d,innerColor:S,backgroundImage:bl,backgroundRepeat:i,backgroundColor:g}},"input-focused-invalid":{decorator:qx.ui.decoration.Beveled,style:{outerColor:f,innerColor:e,backgroundImage:bl,backgroundRepeat:i,backgroundColor:g,insets:[2]}},"input-disabled":{decorator:qx.ui.decoration.Beveled,style:{outerColor:bt,innerColor:j,innerOpacity:0.5,backgroundImage:br,backgroundRepeat:i,backgroundColor:g}},"toolbar":{decorator:qx.ui.decoration.Background,style:{backgroundImage:A,backgroundRepeat:l}},"toolbar-button-hovered":{decorator:qx.ui.decoration.Beveled,style:{outerColor:bo,innerColor:bq,backgroundImage:q,backgroundRepeat:l}},"toolbar-button-checked":{decorator:qx.ui.decoration.Beveled,style:{outerColor:bo,innerColor:bq,backgroundImage:v,backgroundRepeat:l}},"toolbar-separator":{decorator:qx.ui.decoration.Single,style:{widthLeft:1,widthRight:1,colorLeft:N,colorRight:V,styleLeft:m,styleRight:m}},"toolbar-part":{decorator:qx.ui.decoration.Background,style:{backgroundImage:bg,backgroundRepeat:bm}},"tabview-pane":{decorator:qx.ui.decoration.Grid,style:{baseImage:bb,insets:[4,6,7,4]}},"tabview-page-button-top-active":{decorator:qx.ui.decoration.Grid,style:{baseImage:r}},"tabview-page-button-top-inactive":{decorator:qx.ui.decoration.Grid,style:{baseImage:bc}},"tabview-page-button-bottom-active":{decorator:qx.ui.decoration.Grid,style:{baseImage:bi}},"tabview-page-button-bottom-inactive":{decorator:qx.ui.decoration.Grid,style:{baseImage:X}},"tabview-page-button-left-active":{decorator:qx.ui.decoration.Grid,style:{baseImage:b}},"tabview-page-button-left-inactive":{decorator:qx.ui.decoration.Grid,style:{baseImage:C}},"tabview-page-button-right-active":{decorator:qx.ui.decoration.Grid,style:{baseImage:bd}},"tabview-page-button-right-inactive":{decorator:qx.ui.decoration.Grid,style:{baseImage:D}},"splitpane":{decorator:qx.ui.decoration.Uniform,style:{backgroundColor:bn,width:3,color:c,style:m}},"window":{decorator:qx.ui.decoration.Single,style:{backgroundColor:bn,width:1,color:k,widthTop:0}},"window-captionbar-active":{decorator:qx.ui.decoration.Grid,style:{baseImage:L}},"window-captionbar-inactive":{decorator:qx.ui.decoration.Grid,style:{baseImage:I}},"window-statusbar":{decorator:qx.ui.decoration.Grid,style:{baseImage:P}},"table":{decorator:qx.ui.decoration.Single,style:{width:1,color:k,style:m}},"table-statusbar":{decorator:qx.ui.decoration.Single,style:{widthTop:1,colorTop:k,style:m}},"table-scroller-header":{decorator:qx.ui.decoration.Single,style:{backgroundImage:bs,backgroundRepeat:l,widthBottom:1,colorBottom:k,style:m}},"table-header-cell":{decorator:qx.ui.decoration.Single,style:{widthRight:1,colorRight:h,styleRight:m}},"table-header-cell-hovered":{decorator:qx.ui.decoration.Single,style:{widthRight:1,colorRight:h,styleRight:m,widthBottom:1,colorBottom:j,styleBottom:m}},"table-column-button":{decorator:qx.ui.decoration.Single,style:{backgroundImage:bs,backgroundRepeat:l,widthBottom:1,colorBottom:k,style:m}},"table-scroller-focus-indicator":{decorator:qx.ui.decoration.Single,style:{width:2,color:Y,style:m}},"progressive-table-header":{decorator:qx.ui.decoration.Single,style:{width:1,color:k,style:m}},"progressive-table-header-cell":{decorator:qx.ui.decoration.Single,style:{backgroundImage:bs,backgroundRepeat:l,widthRight:1,colorRight:be,style:m}},"menu":{decorator:qx.ui.decoration.Single,style:{backgroundImage:M,backgroundRepeat:l,width:1,color:k,style:m}},"menu-separator":{decorator:qx.ui.decoration.Single,style:{widthTop:1,colorTop:z,widthBottom:1,colorBottom:K}},"menubar":{decorator:qx.ui.decoration.Single,style:{backgroundImage:G,backgroundRepeat:l,width:1,color:h,style:m}},"app-header":{decorator:qx.ui.decoration.Background,style:{backgroundImage:T,backgroundRepeat:l}},"progressbar":{decorator:qx.ui.decoration.Single,style:{width:1,color:d}},"group-item":{decorator:qx.ui.decoration.Background,style:{backgroundImage:p,backgroundRepeat:l}}}});})();(function(){var j="#CCCCCC",i="#F3F3F3",h="#E4E4E4",g="#1a1a1a",f="#084FAB",e="gray",d="#fffefe",c="white",b="#4a4a4a",a="#EEEEEE",K="#80B4EF",J="#C72B2B",I="#ffffdd",H="#334866",G="#00204D",F="#666666",E="#CBC8CD",D="#99C3FE",C="#808080",B="#F4F4F4",q="#001533",r="#909090",o="#FCFCFC",p="#314a6e",m="#B6B6B6",n="#0880EF",k="#4d4d4d",l="#DFDFDF",s="#000000",t="#FF9999",w="#7B7A7E",v="#26364D",y="#990000",x="#AFAFAF",A="#404955",z="#AAAAAA",u="qx.theme.modern.Color";qx.Theme.define(u,{colors:{"background-application":l,"background-pane":i,"background-light":o,"background-medium":a,"background-splitpane":x,"background-tip":I,"background-tip-error":J,"background-odd":h,"text-light":r,"text-gray":b,"text-label":g,"text-title":p,"text-input":s,"text-hovered":q,"text-disabled":w,"text-selected":d,"text-active":v,"text-inactive":A,"text-placeholder":E,"border-main":k,"border-separator":C,"border-input":H,"border-disabled":m,"border-pane":G,"border-button":F,"border-column":j,"border-focused":D,"invalid":y,"border-focused-invalid":t,"table-pane":i,"table-focus-indicator":n,"table-row-background-focused-selected":f,"table-row-background-focused":K,"table-row-background-selected":f,"table-row-background-even":i,"table-row-background-odd":h,"table-row-selected":d,"table-row":g,"table-row-line":j,"table-column-line":j,"progressive-table-header":z,"progressive-table-row-background-even":B,"progressive-table-row-background-odd":h,"progressive-progressbar-background":e,"progressive-progressbar-indicator-done":j,"progressive-progressbar-indicator-undone":c,"progressive-progressbar-percent-background":e,"progressive-progressbar-percent-text":c}});})();(function(){var b="apiviewer.Theme",a="APIViewer theme";qx.Theme.define(b,{title:a,meta:{color:qx.theme.modern.Color,decoration:qx.theme.modern.Decoration,font:qx.theme.modern.Font,appearance:apiviewer.Appearance,icon:qx.theme.icon.Tango}});})();(function(){var j="_applyStyle",i="stretch",h="Integer",g="px",f=" ",e="repeat",d="round",c="shorthand",b="px ",a="sliceBottom",y=";'></div>",x="<div style='",w="sliceLeft",v="sliceRight",u="repeatX",t="String",s="qx.ui.decoration.css3.BorderImage",r="border-box",q="",p='") ',n="sliceTop",o='url("',l="hidden",m="repeatY",k="absolute";qx.Class.define(s,{extend:qx.ui.decoration.Abstract,construct:function(z,A){qx.ui.decoration.Abstract.call(this);if(z!=null){this.setBorderImage(z);}if(A!=null){this.setSlice(A);}},statics:{IS_SUPPORTED:qx.bom.element.Style.isPropertySupported("borderImage")},properties:{borderImage:{check:t,nullable:true,apply:j},sliceTop:{check:h,init:0,apply:j},sliceRight:{check:h,init:0,apply:j},sliceBottom:{check:h,init:0,apply:j},sliceLeft:{check:h,init:0,apply:j},slice:{group:[n,v,a,w],mode:c},repeatX:{check:[i,e,d],init:i,apply:j},repeatY:{check:[i,e,d],init:i,apply:j},repeat:{group:[u,m],mode:c}},members:{__nw:null,_getDefaultInsets:function(){return {top:0,right:0,bottom:0,left:0};},_isInitialized:function(){return !!this.__nw;},getMarkup:function(){if(this.__nw){return this.__nw;}var B=this._resolveImageUrl(this.getBorderImage());var C=[this.getSliceTop(),this.getSliceRight(),this.getSliceBottom(),this.getSliceLeft()];var D=[this.getRepeatX(),this.getRepeatY()].join(f);this.__nw=[x,qx.bom.element.Style.compile({"borderImage":o+B+p+C.join(f)+f+D,position:k,lineHeight:0,fontSize:0,overflow:l,boxSizing:r,borderWidth:C.join(b)+g}),y].join(q);return this.__nw;},resize:function(E,F,G){E.style.width=F+g;E.style.height=G+g;},tint:function(H,I){},_applyStyle:function(){{};},_resolveImageUrl:function(J){return qx.util.ResourceManager.getInstance().toUri(qx.util.AliasManager.getInstance().resolve(J));}},destruct:function(){this.__nw=null;}});})();(function(){var j="px",i="0px",h="-1px",g="no-repeat",f="scale-x",e="scale-y",d="-tr",c="-l",b='</div>',a="scale",x="qx.client",w="-br",v="-t",u="-tl",t="-r",s='<div style="position:absolute;top:0;left:0;overflow:hidden;font-size:0;line-height:0;">',r="_applyBaseImage",q="-b",p="String",o="",m="-bl",n="qx.ui.decoration.GridDiv",k="-c",l="mshtml";qx.Class.define(n,{extend:qx.ui.decoration.Abstract,construct:function(y,z){qx.ui.decoration.Abstract.call(this);if(y!=null){this.setBaseImage(y);}if(z!=null){this.setInsets(z);}},properties:{baseImage:{check:p,nullable:true,apply:r}},members:{__nx:null,__ny:null,__nz:null,_getDefaultInsets:function(){return {top:0,right:0,bottom:0,left:0};},_isInitialized:function(){return !!this.__nx;},getMarkup:function(){if(this.__nx){return this.__nx;}var A=qx.bom.element.Decoration;var B=this.__ny;var C=this.__nz;var D=[];D.push(s);D.push(A.create(B.tl,g,{top:0,left:0}));D.push(A.create(B.t,f,{top:0,left:C.left+j}));D.push(A.create(B.tr,g,{top:0,right:0}));D.push(A.create(B.bl,g,{bottom:0,left:0}));D.push(A.create(B.b,f,{bottom:0,left:C.left+j}));D.push(A.create(B.br,g,{bottom:0,right:0}));D.push(A.create(B.l,e,{top:C.top+j,left:0}));D.push(A.create(B.c,a,{top:C.top+j,left:C.left+j}));D.push(A.create(B.r,e,{top:C.top+j,right:0}));D.push(b);return this.__nx=D.join(o);},resize:function(E,F,G){var H=this.__nz;var innerWidth=F-H.left-H.right;var innerHeight=G-H.top-H.bottom;if(innerWidth<0){innerWidth=0;}if(innerHeight<0){innerHeight=0;}E.style.width=F+j;E.style.height=G+j;E.childNodes[1].style.width=innerWidth+j;E.childNodes[4].style.width=innerWidth+j;E.childNodes[7].style.width=innerWidth+j;E.childNodes[6].style.height=innerHeight+j;E.childNodes[7].style.height=innerHeight+j;E.childNodes[8].style.height=innerHeight+j;if(qx.core.Variant.isSet(x,l)){if(qx.bom.client.Engine.VERSION<7||(qx.bom.client.Feature.QUIRKS_MODE&&qx.bom.client.Engine.VERSION<8)){if(F%2==1){E.childNodes[2].style.marginRight=h;E.childNodes[5].style.marginRight=h;E.childNodes[8].style.marginRight=h;}else{E.childNodes[2].style.marginRight=i;E.childNodes[5].style.marginRight=i;E.childNodes[8].style.marginRight=i;}if(G%2==1){E.childNodes[3].style.marginBottom=h;E.childNodes[4].style.marginBottom=h;E.childNodes[5].style.marginBottom=h;}else{E.childNodes[3].style.marginBottom=i;E.childNodes[4].style.marginBottom=i;E.childNodes[5].style.marginBottom=i;}}}},tint:function(I,J){},_applyBaseImage:function(K,L){{};if(K){var P=this._resolveImageUrl(K);var Q=/(.*)(\.[a-z]+)$/.exec(P);var O=Q[1];var N=Q[2];var M=this.__ny={tl:O+u+N,t:O+v+N,tr:O+d+N,bl:O+m+N,b:O+q+N,br:O+w+N,l:O+c+N,c:O+k+N,r:O+t+N};this.__nz=this._computeEdgeSizes(M);}},_resolveImageUrl:function(R){return qx.util.AliasManager.getInstance().resolve(R);},_computeEdgeSizes:function(S){var T=qx.util.ResourceManager.getInstance();return {top:T.getImageHeight(S.t),bottom:T.getImageHeight(S.b),left:T.getImageWidth(S.l),right:T.getImageWidth(S.r)};}},destruct:function(){this.__nx=this.__ny=this.__nz=null;}});})();(function(){var a="apiviewer.test.StringExtend";qx.Class.define(a,{extend:String,members:{}});})();
-
-qx.$$loader.init();
-
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/bootstrap.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/bootstrap.js
deleted file mode 100644
index c7b9d89..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/bootstrap.js
+++ /dev/null
@@ -1,1829 +0,0 @@
-/* Modifications: replaced one ; with \n for testing purposes
- * Before the second !function -- nd */
-
-/* ===================================================
- * bootstrap-transition.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  $(function () {
-
-    "use strict"; // jshint ;_;
-
-
-    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
-     * ======================================================= */
-
-    $.support.transition = (function () {
-
-      var transitionEnd = (function () {
-
-        var el = document.createElement('bootstrap')
-          , transEndEventNames = {
-               'WebkitTransition' : 'webkitTransitionEnd'
-            ,  'MozTransition'    : 'transitionend'
-            ,  'OTransition'      : 'oTransitionEnd'
-            ,  'msTransition'     : 'MSTransitionEnd'
-            ,  'transition'       : 'transitionend'
-            }
-          , name
-
-        for (name in transEndEventNames){
-          if (el.style[name] !== undefined) {
-            return transEndEventNames[name]
-          }
-        }
-
-      }())
-
-      return transitionEnd && {
-        end: transitionEnd
-      }
-
-    })()
-
-  })
-
-}(window.jQuery)
-/* ==========================================================
- * bootstrap-alert.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* ALERT CLASS DEFINITION
-  * ====================== */
-
-  var dismiss = '[data-dismiss="alert"]'
-    , Alert = function (el) {
-        $(el).on('click', dismiss, this.close)
-      }
-
-  Alert.prototype.close = function (e) {
-    var $this = $(this)
-      , selector = $this.attr('data-target')
-      , $parent
-
-    if (!selector) {
-      selector = $this.attr('href')
-      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-    }
-
-    $parent = $(selector)
-
-    e && e.preventDefault()
-
-    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
-
-    $parent.trigger(e = $.Event('close'))
-
-    if (e.isDefaultPrevented()) return
-
-    $parent.removeClass('in')
-
-    function removeElement() {
-      $parent
-        .trigger('closed')
-        .remove()
-    }
-
-    $.support.transition && $parent.hasClass('fade') ?
-      $parent.on($.support.transition.end, removeElement) :
-      removeElement()
-  }
-
-
- /* ALERT PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.alert = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('alert')
-      if (!data) $this.data('alert', (data = new Alert(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.alert.Constructor = Alert
-
-
- /* ALERT DATA-API
-  * ============== */
-
-  $(function () {
-    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
-  })
-
-}(window.jQuery);/* ============================================================
- * bootstrap-button.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* BUTTON PUBLIC CLASS DEFINITION
-  * ============================== */
-
-  var Button = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.button.defaults, options)
-  }
-
-  Button.prototype.setState = function (state) {
-    var d = 'disabled'
-      , $el = this.$element
-      , data = $el.data()
-      , val = $el.is('input') ? 'val' : 'html'
-
-    state = state + 'Text'
-    data.resetText || $el.data('resetText', $el[val]())
-
-    $el[val](data[state] || this.options[state])
-
-    // push to event loop to allow forms to submit
-    setTimeout(function () {
-      state == 'loadingText' ?
-        $el.addClass(d).attr(d, d) :
-        $el.removeClass(d).removeAttr(d)
-    }, 0)
-  }
-
-  Button.prototype.toggle = function () {
-    var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
-
-    $parent && $parent
-      .find('.active')
-      .removeClass('active')
-
-    this.$element.toggleClass('active')
-  }
-
-
- /* BUTTON PLUGIN DEFINITION
-  * ======================== */
-
-  $.fn.button = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('button')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('button', (data = new Button(this, options)))
-      if (option == 'toggle') data.toggle()
-      else if (option) data.setState(option)
-    })
-  }
-
-  $.fn.button.defaults = {
-    loadingText: 'loading...'
-  }
-
-  $.fn.button.Constructor = Button
-
-
- /* BUTTON DATA-API
-  * =============== */
-
-  $(function () {
-    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
-      var $btn = $(e.target)
-      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
-      $btn.button('toggle')
-    })
-  })
-
-}(window.jQuery);/* ==========================================================
- * bootstrap-carousel.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* CAROUSEL CLASS DEFINITION
-  * ========================= */
-
-  var Carousel = function (element, options) {
-    this.$element = $(element)
-    this.options = options
-    this.options.slide && this.slide(this.options.slide)
-    this.options.pause == 'hover' && this.$element
-      .on('mouseenter', $.proxy(this.pause, this))
-      .on('mouseleave', $.proxy(this.cycle, this))
-  }
-
-  Carousel.prototype = {
-
-    cycle: function (e) {
-      if (!e) this.paused = false
-      this.options.interval
-        && !this.paused
-        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-      return this
-    }
-
-  , to: function (pos) {
-      var $active = this.$element.find('.active')
-        , children = $active.parent().children()
-        , activePos = children.index($active)
-        , that = this
-
-      if (pos > (children.length - 1) || pos < 0) return
-
-      if (this.sliding) {
-        return this.$element.one('slid', function () {
-          that.to(pos)
-        })
-      }
-
-      if (activePos == pos) {
-        return this.pause().cycle()
-      }
-
-      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
-    }
-
-  , pause: function (e) {
-      if (!e) this.paused = true
-      clearInterval(this.interval)
-      this.interval = null
-      return this
-    }
-
-  , next: function () {
-      if (this.sliding) return
-      return this.slide('next')
-    }
-
-  , prev: function () {
-      if (this.sliding) return
-      return this.slide('prev')
-    }
-
-  , slide: function (type, next) {
-      var $active = this.$element.find('.active')
-        , $next = next || $active[type]()
-        , isCycling = this.interval
-        , direction = type == 'next' ? 'left' : 'right'
-        , fallback  = type == 'next' ? 'first' : 'last'
-        , that = this
-        , e = $.Event('slide')
-
-      this.sliding = true
-
-      isCycling && this.pause()
-
-      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
-
-      if ($next.hasClass('active')) return
-
-      if ($.support.transition && this.$element.hasClass('slide')) {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $next.addClass(type)
-        $next[0].offsetWidth // force reflow
-        $active.addClass(direction)
-        $next.addClass(direction)
-        this.$element.one($.support.transition.end, function () {
-          $next.removeClass([type, direction].join(' ')).addClass('active')
-          $active.removeClass(['active', direction].join(' '))
-          that.sliding = false
-          setTimeout(function () { that.$element.trigger('slid') }, 0)
-        })
-      } else {
-        this.$element.trigger(e)
-        if (e.isDefaultPrevented()) return
-        $active.removeClass('active')
-        $next.addClass('active')
-        this.sliding = false
-        this.$element.trigger('slid')
-      }
-
-      isCycling && this.cycle()
-
-      return this
-    }
-
-  }
-
-
- /* CAROUSEL PLUGIN DEFINITION
-  * ========================== */
-
-  $.fn.carousel = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('carousel')
-        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
-      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
-      if (typeof option == 'number') data.to(option)
-      else if (typeof option == 'string' || (option = options.slide)) data[option]()
-      else if (options.interval) data.cycle()
-    })
-  }
-
-  $.fn.carousel.defaults = {
-    interval: 5000
-  , pause: 'hover'
-  }
-
-  $.fn.carousel.Constructor = Carousel
-
-
- /* CAROUSEL DATA-API
-  * ================= */
-
-  $(function () {
-    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
-      var $this = $(this), href
-        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
-      $target.carousel(options)
-      e.preventDefault()
-    })
-  })
-
-}(window.jQuery);/* =============================================================
- * bootstrap-collapse.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* COLLAPSE PUBLIC CLASS DEFINITION
-  * ================================ */
-
-  var Collapse = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.collapse.defaults, options)
-
-    if (this.options.parent) {
-      this.$parent = $(this.options.parent)
-    }
-
-    this.options.toggle && this.toggle()
-  }
-
-  Collapse.prototype = {
-
-    constructor: Collapse
-
-  , dimension: function () {
-      var hasWidth = this.$element.hasClass('width')
-      return hasWidth ? 'width' : 'height'
-    }
-
-  , show: function () {
-      var dimension
-        , scroll
-        , actives
-        , hasData
-
-      if (this.transitioning) return
-
-      dimension = this.dimension()
-      scroll = $.camelCase(['scroll', dimension].join('-'))
-      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
-
-      if (actives && actives.length) {
-        hasData = actives.data('collapse')
-        if (hasData && hasData.transitioning) return
-        actives.collapse('hide')
-        hasData || actives.data('collapse', null)
-      }
-
-      this.$element[dimension](0)
-      this.transition('addClass', $.Event('show'), 'shown')
-      this.$element[dimension](this.$element[0][scroll])
-    }
-
-  , hide: function () {
-      var dimension
-      if (this.transitioning) return
-      dimension = this.dimension()
-      this.reset(this.$element[dimension]())
-      this.transition('removeClass', $.Event('hide'), 'hidden')
-      this.$element[dimension](0)
-    }
-
-  , reset: function (size) {
-      var dimension = this.dimension()
-
-      this.$element
-        .removeClass('collapse')
-        [dimension](size || 'auto')
-        [0].offsetWidth
-
-      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
-
-      return this
-    }
-
-  , transition: function (method, startEvent, completeEvent) {
-      var that = this
-        , complete = function () {
-            if (startEvent.type == 'show') that.reset()
-            that.transitioning = 0
-            that.$element.trigger(completeEvent)
-          }
-
-      this.$element.trigger(startEvent)
-
-      if (startEvent.isDefaultPrevented()) return
-
-      this.transitioning = 1
-
-      this.$element[method]('in')
-
-      $.support.transition && this.$element.hasClass('collapse') ?
-        this.$element.one($.support.transition.end, complete) :
-        complete()
-    }
-
-  , toggle: function () {
-      this[this.$element.hasClass('in') ? 'hide' : 'show']()
-    }
-
-  }
-
-
- /* COLLAPSIBLE PLUGIN DEFINITION
-  * ============================== */
-
-  $.fn.collapse = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('collapse')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.collapse.defaults = {
-    toggle: true
-  }
-
-  $.fn.collapse.Constructor = Collapse
-
-
- /* COLLAPSIBLE DATA-API
-  * ==================== */
-
-  $(function () {
-    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
-      var $this = $(this), href
-        , target = $this.attr('data-target')
-          || e.preventDefault()
-          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
-        , option = $(target).data('collapse') ? 'toggle' : $this.data()
-      $(target).collapse(option)
-    })
-  })
-
-}(window.jQuery);/* ============================================================
- * bootstrap-dropdown.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* DROPDOWN CLASS DEFINITION
-  * ========================= */
-
-  var toggle = '[data-toggle="dropdown"]'
-    , Dropdown = function (element) {
-        var $el = $(element).on('click.dropdown.data-api', this.toggle)
-        $('html').on('click.dropdown.data-api', function () {
-          $el.parent().removeClass('open')
-        })
-      }
-
-  Dropdown.prototype = {
-
-    constructor: Dropdown
-
-  , toggle: function (e) {
-      var $this = $(this)
-        , $parent
-        , selector
-        , isActive
-
-      if ($this.is('.disabled, :disabled')) return
-
-      selector = $this.attr('data-target')
-
-      if (!selector) {
-        selector = $this.attr('href')
-        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-      }
-
-      $parent = $(selector)
-      $parent.length || ($parent = $this.parent())
-
-      isActive = $parent.hasClass('open')
-
-      clearMenus()
-
-      if (!isActive) $parent.toggleClass('open')
-
-      return false
-    }
-
-  }
-
-  function clearMenus() {
-    $(toggle).parent().removeClass('open')
-  }
-
-
-  /* DROPDOWN PLUGIN DEFINITION
-   * ========================== */
-
-  $.fn.dropdown = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('dropdown')
-      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
-      if (typeof option == 'string') data[option].call($this)
-    })
-  }
-
-  $.fn.dropdown.Constructor = Dropdown
-
-
-  /* APPLY TO STANDARD DROPDOWN ELEMENTS
-   * =================================== */
-
-  $(function () {
-    $('html').on('click.dropdown.data-api', clearMenus)
-    $('body')
-      .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
-      .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
-  })
-
-}(window.jQuery);/* =========================================================
- * bootstrap-modal.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#modals
- * =========================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================= */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* MODAL CLASS DEFINITION
-  * ====================== */
-
-  var Modal = function (content, options) {
-    this.options = options
-    this.$element = $(content)
-      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
-  }
-
-  Modal.prototype = {
-
-      constructor: Modal
-
-    , toggle: function () {
-        return this[!this.isShown ? 'show' : 'hide']()
-      }
-
-    , show: function () {
-        var that = this
-          , e = $.Event('show')
-
-        this.$element.trigger(e)
-
-        if (this.isShown || e.isDefaultPrevented()) return
-
-        $('body').addClass('modal-open')
-
-        this.isShown = true
-
-        escape.call(this)
-        backdrop.call(this, function () {
-          var transition = $.support.transition && that.$element.hasClass('fade')
-
-          if (!that.$element.parent().length) {
-            that.$element.appendTo(document.body) //don't move modals dom position
-          }
-
-          that.$element
-            .show()
-
-          if (transition) {
-            that.$element[0].offsetWidth // force reflow
-          }
-
-          that.$element.addClass('in')
-
-          transition ?
-            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
-            that.$element.trigger('shown')
-
-        })
-      }
-
-    , hide: function (e) {
-        e && e.preventDefault()
-
-        var that = this
-
-        e = $.Event('hide')
-
-        this.$element.trigger(e)
-
-        if (!this.isShown || e.isDefaultPrevented()) return
-
-        this.isShown = false
-
-        $('body').removeClass('modal-open')
-
-        escape.call(this)
-
-        this.$element.removeClass('in')
-
-        $.support.transition && this.$element.hasClass('fade') ?
-          hideWithTransition.call(this) :
-          hideModal.call(this)
-      }
-
-  }
-
-
- /* MODAL PRIVATE METHODS
-  * ===================== */
-
-  function hideWithTransition() {
-    var that = this
-      , timeout = setTimeout(function () {
-          that.$element.off($.support.transition.end)
-          hideModal.call(that)
-        }, 500)
-
-    this.$element.one($.support.transition.end, function () {
-      clearTimeout(timeout)
-      hideModal.call(that)
-    })
-  }
-
-  function hideModal(that) {
-    this.$element
-      .hide()
-      .trigger('hidden')
-
-    backdrop.call(this)
-  }
-
-  function backdrop(callback) {
-    var that = this
-      , animate = this.$element.hasClass('fade') ? 'fade' : ''
-
-    if (this.isShown && this.options.backdrop) {
-      var doAnimate = $.support.transition && animate
-
-      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
-        .appendTo(document.body)
-
-      if (this.options.backdrop != 'static') {
-        this.$backdrop.click($.proxy(this.hide, this))
-      }
-
-      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
-      this.$backdrop.addClass('in')
-
-      doAnimate ?
-        this.$backdrop.one($.support.transition.end, callback) :
-        callback()
-
-    } else if (!this.isShown && this.$backdrop) {
-      this.$backdrop.removeClass('in')
-
-      $.support.transition && this.$element.hasClass('fade')?
-        this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
-        removeBackdrop.call(this)
-
-    } else if (callback) {
-      callback()
-    }
-  }
-
-  function removeBackdrop() {
-    this.$backdrop.remove()
-    this.$backdrop = null
-  }
-
-  function escape() {
-    var that = this
-    if (this.isShown && this.options.keyboard) {
-      $(document).on('keyup.dismiss.modal', function ( e ) {
-        e.which == 27 && that.hide()
-      })
-    } else if (!this.isShown) {
-      $(document).off('keyup.dismiss.modal')
-    }
-  }
-
-
- /* MODAL PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.modal = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('modal')
-        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
-      if (!data) $this.data('modal', (data = new Modal(this, options)))
-      if (typeof option == 'string') data[option]()
-      else if (options.show) data.show()
-    })
-  }
-
-  $.fn.modal.defaults = {
-      backdrop: true
-    , keyboard: true
-    , show: true
-  }
-
-  $.fn.modal.Constructor = Modal
-
-
- /* MODAL DATA-API
-  * ============== */
-
-  $(function () {
-    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
-      var $this = $(this), href
-        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-        , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
-
-      e.preventDefault()
-      $target.modal(option)
-    })
-  })
-
-}(window.jQuery);/* ===========================================================
- * bootstrap-tooltip.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Tooltip = function (element, options) {
-    this.init('tooltip', element, options)
-  }
-
-  Tooltip.prototype = {
-
-    constructor: Tooltip
-
-  , init: function (type, element, options) {
-      var eventIn
-        , eventOut
-
-      this.type = type
-      this.$element = $(element)
-      this.options = this.getOptions(options)
-      this.enabled = true
-
-      if (this.options.trigger != 'manual') {
-        eventIn  = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
-        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
-        this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
-        this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
-      }
-
-      this.options.selector ?
-        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
-        this.fixTitle()
-    }
-
-  , getOptions: function (options) {
-      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
-
-      if (options.delay && typeof options.delay == 'number') {
-        options.delay = {
-          show: options.delay
-        , hide: options.delay
-        }
-      }
-
-      return options
-    }
-
-  , enter: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (!self.options.delay || !self.options.delay.show) return self.show()
-
-      clearTimeout(this.timeout)
-      self.hoverState = 'in'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'in') self.show()
-      }, self.options.delay.show)
-    }
-
-  , leave: function (e) {
-      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
-
-      if (this.timeout) clearTimeout(this.timeout)
-      if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
-      self.hoverState = 'out'
-      this.timeout = setTimeout(function() {
-        if (self.hoverState == 'out') self.hide()
-      }, self.options.delay.hide)
-    }
-
-  , show: function () {
-      var $tip
-        , inside
-        , pos
-        , actualWidth
-        , actualHeight
-        , placement
-        , tp
-
-      if (this.hasContent() && this.enabled) {
-        $tip = this.tip()
-        this.setContent()
-
-        if (this.options.animation) {
-          $tip.addClass('fade')
-        }
-
-        placement = typeof this.options.placement == 'function' ?
-          this.options.placement.call(this, $tip[0], this.$element[0]) :
-          this.options.placement
-
-        inside = /in/.test(placement)
-
-        $tip
-          .remove()
-          .css({ top: 0, left: 0, display: 'block' })
-          .appendTo(inside ? this.$element : document.body)
-
-        pos = this.getPosition(inside)
-
-        actualWidth = $tip[0].offsetWidth
-        actualHeight = $tip[0].offsetHeight
-
-        switch (inside ? placement.split(' ')[1] : placement) {
-          case 'bottom':
-            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'top':
-            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
-            break
-          case 'left':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
-            break
-          case 'right':
-            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
-            break
-        }
-
-        $tip
-          .css(tp)
-          .addClass(placement)
-          .addClass('in')
-      }
-    }
-
-  , isHTML: function(text) {
-      // html string detection logic adapted from jQuery
-      return typeof text != 'string'
-        || ( text.charAt(0) === "<"
-          && text.charAt( text.length - 1 ) === ">"
-          && text.length >= 3
-        ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
-    }
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-
-      $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
-      $tip.removeClass('fade in top bottom left right')
-    }
-
-  , hide: function () {
-      var that = this
-        , $tip = this.tip()
-
-      $tip.removeClass('in')
-
-      function removeWithAnimation() {
-        var timeout = setTimeout(function () {
-          $tip.off($.support.transition.end).remove()
-        }, 500)
-
-        $tip.one($.support.transition.end, function () {
-          clearTimeout(timeout)
-          $tip.remove()
-        })
-      }
-
-      $.support.transition && this.$tip.hasClass('fade') ?
-        removeWithAnimation() :
-        $tip.remove()
-    }
-
-  , fixTitle: function () {
-      var $e = this.$element
-      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
-        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
-      }
-    }
-
-  , hasContent: function () {
-      return this.getTitle()
-    }
-
-  , getPosition: function (inside) {
-      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
-        width: this.$element[0].offsetWidth
-      , height: this.$element[0].offsetHeight
-      })
-    }
-
-  , getTitle: function () {
-      var title
-        , $e = this.$element
-        , o = this.options
-
-      title = $e.attr('data-original-title')
-        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
-
-      return title
-    }
-
-  , tip: function () {
-      return this.$tip = this.$tip || $(this.options.template)
-    }
-
-  , validate: function () {
-      if (!this.$element[0].parentNode) {
-        this.hide()
-        this.$element = null
-        this.options = null
-      }
-    }
-
-  , enable: function () {
-      this.enabled = true
-    }
-
-  , disable: function () {
-      this.enabled = false
-    }
-
-  , toggleEnabled: function () {
-      this.enabled = !this.enabled
-    }
-
-  , toggle: function () {
-      this[this.tip().hasClass('in') ? 'hide' : 'show']()
-    }
-
-  }
-
-
- /* TOOLTIP PLUGIN DEFINITION
-  * ========================= */
-
-  $.fn.tooltip = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tooltip')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tooltip.Constructor = Tooltip
-
-  $.fn.tooltip.defaults = {
-    animation: true
-  , placement: 'top'
-  , selector: false
-  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
-  , trigger: 'hover'
-  , title: ''
-  , delay: 0
-  }
-
-}(window.jQuery);
-/* ===========================================================
- * bootstrap-popover.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* POPOVER PUBLIC CLASS DEFINITION
-  * =============================== */
-
-  var Popover = function ( element, options ) {
-    this.init('popover', element, options)
-  }
-
-
-  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
-     ========================================== */
-
-  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
-
-    constructor: Popover
-
-  , setContent: function () {
-      var $tip = this.tip()
-        , title = this.getTitle()
-        , content = this.getContent()
-
-      $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
-      $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
-
-      $tip.removeClass('fade top bottom left right in')
-    }
-
-  , hasContent: function () {
-      return this.getTitle() || this.getContent()
-    }
-
-  , getContent: function () {
-      var content
-        , $e = this.$element
-        , o = this.options
-
-      content = $e.attr('data-content')
-        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
-
-      return content
-    }
-
-  , tip: function () {
-      if (!this.$tip) {
-        this.$tip = $(this.options.template)
-      }
-      return this.$tip
-    }
-
-  })
-
-
- /* POPOVER PLUGIN DEFINITION
-  * ======================= */
-
-  $.fn.popover = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('popover')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('popover', (data = new Popover(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.popover.Constructor = Popover
-
-  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
-    placement: 'right'
-  , content: ''
-  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
-  })
-
-}(window.jQuery);/* =============================================================
- * bootstrap-scrollspy.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
-  /* SCROLLSPY CLASS DEFINITION
-   * ========================== */
-
-  function ScrollSpy( element, options) {
-    var process = $.proxy(this.process, this)
-      , $element = $(element).is('body') ? $(window) : $(element)
-      , href
-    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
-    this.$scrollElement = $element.on('scroll.scroll.data-api', process)
-    this.selector = (this.options.target
-      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
-      || '') + ' .nav li > a'
-    this.$body = $('body')
-    this.refresh()
-    this.process()
-  }
-
-  ScrollSpy.prototype = {
-
-      constructor: ScrollSpy
-
-    , refresh: function () {
-        var self = this
-          , $targets
-
-        this.offsets = $([])
-        this.targets = $([])
-
-        $targets = this.$body
-          .find(this.selector)
-          .map(function () {
-            var $el = $(this)
-              , href = $el.data('target') || $el.attr('href')
-              , $href = /^#\w/.test(href) && $(href)
-            return ( $href
-              && href.length
-              && [[ $href.position().top, href ]] ) || null
-          })
-          .sort(function (a, b) { return a[0] - b[0] })
-          .each(function () {
-            self.offsets.push(this[0])
-            self.targets.push(this[1])
-          })
-      }
-
-    , process: function () {
-        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
-          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
-          , maxScroll = scrollHeight - this.$scrollElement.height()
-          , offsets = this.offsets
-          , targets = this.targets
-          , activeTarget = this.activeTarget
-          , i
-
-        if (scrollTop >= maxScroll) {
-          return activeTarget != (i = targets.last()[0])
-            && this.activate ( i )
-        }
-
-        for (i = offsets.length; i--;) {
-          activeTarget != targets[i]
-            && scrollTop >= offsets[i]
-            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
-            && this.activate( targets[i] )
-        }
-      }
-
-    , activate: function (target) {
-        var active
-          , selector
-
-        this.activeTarget = target
-
-        $(this.selector)
-          .parent('.active')
-          .removeClass('active')
-
-        selector = this.selector
-          + '[data-target="' + target + '"],'
-          + this.selector + '[href="' + target + '"]'
-
-        active = $(selector)
-          .parent('li')
-          .addClass('active')
-
-        if (active.parent('.dropdown-menu'))  {
-          active = active.closest('li.dropdown').addClass('active')
-        }
-
-        active.trigger('activate')
-      }
-
-  }
-
-
- /* SCROLLSPY PLUGIN DEFINITION
-  * =========================== */
-
-  $.fn.scrollspy = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('scrollspy')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.scrollspy.Constructor = ScrollSpy
-
-  $.fn.scrollspy.defaults = {
-    offset: 10
-  }
-
-
- /* SCROLLSPY DATA-API
-  * ================== */
-
-  $(function () {
-    $('[data-spy="scroll"]').each(function () {
-      var $spy = $(this)
-      $spy.scrollspy($spy.data())
-    })
-  })
-
-}(window.jQuery);/* ========================================================
- * bootstrap-tab.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ======================================================== */
-
-
-!function ($) {
-
-  "use strict"; // jshint ;_;
-
-
- /* TAB CLASS DEFINITION
-  * ==================== */
-
-  var Tab = function ( element ) {
-    this.element = $(element)
-  }
-
-  Tab.prototype = {
-
-    constructor: Tab
-
-  , show: function () {
-      var $this = this.element
-        , $ul = $this.closest('ul:not(.dropdown-menu)')
-        , selector = $this.attr('data-target')
-        , previous
-        , $target
-        , e
-
-      if (!selector) {
-        selector = $this.attr('href')
-        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
-      }
-
-      if ( $this.parent('li').hasClass('active') ) return
-
-      previous = $ul.find('.active a').last()[0]
-
-      e = $.Event('show', {
-        relatedTarget: previous
-      })
-
-      $this.trigger(e)
-
-      if (e.isDefaultPrevented()) return
-
-      $target = $(selector)
-
-      this.activate($this.parent('li'), $ul)
-      this.activate($target, $target.parent(), function () {
-        $this.trigger({
-          type: 'shown'
-        , relatedTarget: previous
-        })
-      })
-    }
-
-  , activate: function ( element, container, callback) {
-      var $active = container.find('> .active')
-        , transition = callback
-            && $.support.transition
-            && $active.hasClass('fade')
-
-      function next() {
-        $active
-          .removeClass('active')
-          .find('> .dropdown-menu > .active')
-          .removeClass('active')
-
-        element.addClass('active')
-
-        if (transition) {
-          element[0].offsetWidth // reflow for transition
-          element.addClass('in')
-        } else {
-          element.removeClass('fade')
-        }
-
-        if ( element.parent('.dropdown-menu') ) {
-          element.closest('li.dropdown').addClass('active')
-        }
-
-        callback && callback()
-      }
-
-      transition ?
-        $active.one($.support.transition.end, next) :
-        next()
-
-      $active.removeClass('in')
-    }
-  }
-
-
- /* TAB PLUGIN DEFINITION
-  * ===================== */
-
-  $.fn.tab = function ( option ) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('tab')
-      if (!data) $this.data('tab', (data = new Tab(this)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.tab.Constructor = Tab
-
-
- /* TAB DATA-API
-  * ============ */
-
-  $(function () {
-    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
-      e.preventDefault()
-      $(this).tab('show')
-    })
-  })
-
-}(window.jQuery);/* =============================================================
- * bootstrap-typeahead.js v2.0.4
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * Copyright 2012 Twitter, 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============================================================ */
-
-
-!function($){
-
-  "use strict"; // jshint ;_;
-
-
- /* TYPEAHEAD PUBLIC CLASS DEFINITION
-  * ================================= */
-
-  var Typeahead = function (element, options) {
-    this.$element = $(element)
-    this.options = $.extend({}, $.fn.typeahead.defaults, options)
-    this.matcher = this.options.matcher || this.matcher
-    this.sorter = this.options.sorter || this.sorter
-    this.highlighter = this.options.highlighter || this.highlighter
-    this.updater = this.options.updater || this.updater
-    this.$menu = $(this.options.menu).appendTo('body')
-    this.source = this.options.source
-    this.shown = false
-    this.listen()
-  }
-
-  Typeahead.prototype = {
-
-    constructor: Typeahead
-
-  , select: function () {
-      var val = this.$menu.find('.active').attr('data-value')
-      this.$element
-        .val(this.updater(val))
-        .change()
-      return this.hide()
-    }
-
-  , updater: function (item) {
-      return item
-    }
-
-  , show: function () {
-      var pos = $.extend({}, this.$element.offset(), {
-        height: this.$element[0].offsetHeight
-      })
-
-      this.$menu.css({
-        top: pos.top + pos.height
-      , left: pos.left
-      })
-
-      this.$menu.show()
-      this.shown = true
-      return this
-    }
-
-  , hide: function () {
-      this.$menu.hide()
-      this.shown = false
-      return this
-    }
-
-  , lookup: function (event) {
-      var that = this
-        , items
-        , q
-
-      this.query = this.$element.val()
-
-      if (!this.query) {
-        return this.shown ? this.hide() : this
-      }
-
-      items = $.grep(this.source, function (item) {
-        return that.matcher(item)
-      })
-
-      items = this.sorter(items)
-
-      if (!items.length) {
-        return this.shown ? this.hide() : this
-      }
-
-      return this.render(items.slice(0, this.options.items)).show()
-    }
-
-  , matcher: function (item) {
-      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
-    }
-
-  , sorter: function (items) {
-      var beginswith = []
-        , caseSensitive = []
-        , caseInsensitive = []
-        , item
-
-      while (item = items.shift()) {
-        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
-        else if (~item.indexOf(this.query)) caseSensitive.push(item)
-        else caseInsensitive.push(item)
-      }
-
-      return beginswith.concat(caseSensitive, caseInsensitive)
-    }
-
-  , highlighter: function (item) {
-      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
-      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
-        return '<strong>' + match + '</strong>'
-      })
-    }
-
-  , render: function (items) {
-      var that = this
-
-      items = $(items).map(function (i, item) {
-        i = $(that.options.item).attr('data-value', item)
-        i.find('a').html(that.highlighter(item))
-        return i[0]
-      })
-
-      items.first().addClass('active')
-      this.$menu.html(items)
-      return this
-    }
-
-  , next: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , next = active.next()
-
-      if (!next.length) {
-        next = $(this.$menu.find('li')[0])
-      }
-
-      next.addClass('active')
-    }
-
-  , prev: function (event) {
-      var active = this.$menu.find('.active').removeClass('active')
-        , prev = active.prev()
-
-      if (!prev.length) {
-        prev = this.$menu.find('li').last()
-      }
-
-      prev.addClass('active')
-    }
-
-  , listen: function () {
-      this.$element
-        .on('blur',     $.proxy(this.blur, this))
-        .on('keypress', $.proxy(this.keypress, this))
-        .on('keyup',    $.proxy(this.keyup, this))
-
-      if ($.browser.webkit || $.browser.msie) {
-        this.$element.on('keydown', $.proxy(this.keypress, this))
-      }
-
-      this.$menu
-        .on('click', $.proxy(this.click, this))
-        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
-    }
-
-  , keyup: function (e) {
-      switch(e.keyCode) {
-        case 40: // down arrow
-        case 38: // up arrow
-          break
-
-        case 9: // tab
-        case 13: // enter
-          if (!this.shown) return
-          this.select()
-          break
-
-        case 27: // escape
-          if (!this.shown) return
-          this.hide()
-          break
-
-        default:
-          this.lookup()
-      }
-
-      e.stopPropagation()
-      e.preventDefault()
-  }
-
-  , keypress: function (e) {
-      if (!this.shown) return
-
-      switch(e.keyCode) {
-        case 9: // tab
-        case 13: // enter
-        case 27: // escape
-          e.preventDefault()
-          break
-
-        case 38: // up arrow
-          if (e.type != 'keydown') break
-          e.preventDefault()
-          this.prev()
-          break
-
-        case 40: // down arrow
-          if (e.type != 'keydown') break
-          e.preventDefault()
-          this.next()
-          break
-      }
-
-      e.stopPropagation()
-    }
-
-  , blur: function (e) {
-      var that = this
-      setTimeout(function () { that.hide() }, 150)
-    }
-
-  , click: function (e) {
-      e.stopPropagation()
-      e.preventDefault()
-      this.select()
-    }
-
-  , mouseenter: function (e) {
-      this.$menu.find('.active').removeClass('active')
-      $(e.currentTarget).addClass('active')
-    }
-
-  }
-
-
-  /* TYPEAHEAD PLUGIN DEFINITION
-   * =========================== */
-
-  $.fn.typeahead = function (option) {
-    return this.each(function () {
-      var $this = $(this)
-        , data = $this.data('typeahead')
-        , options = typeof option == 'object' && option
-      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
-      if (typeof option == 'string') data[option]()
-    })
-  }
-
-  $.fn.typeahead.defaults = {
-    source: []
-  , items: 8
-  , menu: '<ul class="typeahead dropdown-menu"></ul>'
-  , item: '<li><a href="#"></a></li>'
-  }
-
-  $.fn.typeahead.Constructor = Typeahead
-
-
- /* TYPEAHEAD DATA-API
-  * ================== */
-
-  $(function () {
-    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
-      var $this = $(this)
-      if ($this.data('typeahead')) return
-      e.preventDefault()
-      $this.typeahead($this.data())
-    })
-  })
-
-}(window.jQuery);
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jquery-1.7.1.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jquery-1.7.1.js
deleted file mode 100644
index 8ccd0ea..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jquery-1.7.1.js
+++ /dev/null
@@ -1,9266 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.7.1
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Mon Nov 21 21:11:03 2011 -0500
- */
-(function( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
-	navigator = window.navigator,
-	location = window.location;
-var jQuery = (function() {
-
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
-		// The jQuery object is actually just the init constructor 'enhanced'
-		return new jQuery.fn.init( selector, context, rootjQuery );
-	},
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$,
-
-	// A central reference to the root jQuery(document)
-	rootjQuery,
-
-	// A simple way to check for HTML strings or ID strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
-	// Check if a string has a non-whitespace character in it
-	rnotwhite = /\S/,
-
-	// Used for trimming whitespace
-	trimLeft = /^\s+/,
-	trimRight = /\s+$/,
-
-	// Match a standalone tag
-	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
-	// JSON RegExp
-	rvalidchars = /^[\],:{}\s]*$/,
-	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
-	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
-	// Useragent RegExp
-	rwebkit = /(webkit)[ \/]([\w.]+)/,
-	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
-	rmsie = /(msie) ([\w.]+)/,
-	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
-	// Matches dashed string for camelizing
-	rdashAlpha = /-([a-z]|[0-9])/ig,
-	rmsPrefix = /^-ms-/,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return ( letter + "" ).toUpperCase();
-	},
-
-	// Keep a UserAgent string for use with jQuery.browser
-	userAgent = navigator.userAgent,
-
-	// For matching the engine and version of the browser
-	browserMatch,
-
-	// The deferred used on DOM ready
-	readyList,
-
-	// The ready event handler
-	DOMContentLoaded,
-
-	// Save a reference to some core methods
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	push = Array.prototype.push,
-	slice = Array.prototype.slice,
-	trim = String.prototype.trim,
-	indexOf = Array.prototype.indexOf,
-
-	// [[Class]] -> type pairs
-	class2type = {};
-
-jQuery.fn = jQuery.prototype = {
-	constructor: jQuery,
-	init: function( selector, context, rootjQuery ) {
-		var match, elem, ret, doc;
-
-		// Handle $(""), $(null), or $(undefined)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Handle $(DOMElement)
-		if ( selector.nodeType ) {
-			this.context = this[0] = selector;
-			this.length = 1;
-			return this;
-		}
-
-		// The body element only exists once, optimize finding it
-		if ( selector === "body" && !context && document.body ) {
-			this.context = document;
-			this[0] = document.body;
-			this.selector = selector;
-			this.length = 1;
-			return this;
-		}
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			// Are we dealing with HTML string or an ID?
-			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = quickExpr.exec( selector );
-			}
-
-			// Verify a match, and that no context was specified for #id
-			if ( match && (match[1] || !context) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[1] ) {
-					context = context instanceof jQuery ? context[0] : context;
-					doc = ( context ? context.ownerDocument || context : document );
-
-					// If a single string is passed in and it's a single tag
-					// just do a createElement and skip the rest
-					ret = rsingleTag.exec( selector );
-
-					if ( ret ) {
-						if ( jQuery.isPlainObject( context ) ) {
-							selector = [ document.createElement( ret[1] ) ];
-							jQuery.fn.attr.call( selector, context, true );
-
-						} else {
-							selector = [ doc.createElement( ret[1] ) ];
-						}
-
-					} else {
-						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
-						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
-					}
-
-					return jQuery.merge( this, selector );
-
-				// HANDLE: $("#id")
-				} else {
-					elem = document.getElementById( match[2] );
-
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE and Opera return items
-						// by name instead of ID
-						if ( elem.id !== match[2] ) {
-							return rootjQuery.find( selector );
-						}
-
-						// Otherwise, we inject the element directly into the jQuery object
-						this.length = 1;
-						this[0] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || rootjQuery ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return rootjQuery.ready( selector );
-		}
-
-		if ( selector.selector !== undefined ) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	},
-
-	// Start with an empty selector
-	selector: "",
-
-	// The current version of jQuery being used
-	jquery: "1.7.1",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	// The number of elements contained in the matched element set
-	size: function() {
-		return this.length;
-	},
-
-	toArray: function() {
-		return slice.call( this, 0 );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num == null ?
-
-			// Return a 'clean' array
-			this.toArray() :
-
-			// Return just the object
-			( num < 0 ? this[ this.length + num ] : this[ num ] );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems, name, selector ) {
-		// Build a new jQuery matched element set
-		var ret = this.constructor();
-
-		if ( jQuery.isArray( elems ) ) {
-			push.apply( ret, elems );
-
-		} else {
-			jQuery.merge( ret, elems );
-		}
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-
-		ret.context = this.context;
-
-		if ( name === "find" ) {
-			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-		} else if ( name ) {
-			ret.selector = this.selector + "." + name + "(" + selector + ")";
-		}
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	// (You can seed the arguments with an array of args, but this is
-	// only used internally.)
-	each: function( callback, args ) {
-		return jQuery.each( this, callback, args );
-	},
-
-	ready: function( fn ) {
-		// Attach the listeners
-		jQuery.bindReady();
-
-		// Add the callback
-		readyList.add( fn );
-
-		return this;
-	},
-
-	eq: function( i ) {
-		i = +i;
-		return i === -1 ?
-			this.slice( i ) :
-			this.slice( i, i + 1 );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	slice: function() {
-		return this.pushStack( slice.apply( this, arguments ),
-			"slice", slice.call(arguments).join(",") );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map(this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		}));
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor(null);
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: push,
-	sort: [].sort,
-	splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[0] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-		target = arguments[1] || {};
-		// skip the boolean and the target
-		i = 2;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-		target = {};
-	}
-
-	// extend jQuery itself if only one argument is passed
-	if ( length === i ) {
-		target = this;
-		--i;
-	}
-
-	for ( ; i < length; i++ ) {
-		// Only deal with non-null/undefined values
-		if ( (options = arguments[ i ]) != null ) {
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray(src) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject(src) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend({
-	noConflict: function( deep ) {
-		if ( window.$ === jQuery ) {
-			window.$ = _$;
-		}
-
-		if ( deep && window.jQuery === jQuery ) {
-			window.jQuery = _jQuery;
-		}
-
-		return jQuery;
-	},
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-		// Either a released hold or an DOMready/load event and not yet ready
-		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
-			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-			if ( !document.body ) {
-				return setTimeout( jQuery.ready, 1 );
-			}
-
-			// Remember that the DOM is ready
-			jQuery.isReady = true;
-
-			// If a normal DOM Ready event fired, decrement, and wait if need be
-			if ( wait !== true && --jQuery.readyWait > 0 ) {
-				return;
-			}
-
-			// If there are functions bound, to execute
-			readyList.fireWith( document, [ jQuery ] );
-
-			// Trigger any bound ready events
-			if ( jQuery.fn.trigger ) {
-				jQuery( document ).trigger( "ready" ).off( "ready" );
-			}
-		}
-	},
-
-	bindReady: function() {
-		if ( readyList ) {
-			return;
-		}
-
-		readyList = jQuery.Callbacks( "once memory" );
-
-		// Catch cases where $(document).ready() is called after the
-		// browser event has already occurred.
-		if ( document.readyState === "complete" ) {
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			return setTimeout( jQuery.ready, 1 );
-		}
-
-		// Mozilla, Opera and webkit nightlies currently support this event
-		if ( document.addEventListener ) {
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", jQuery.ready, false );
-
-		// If IE event model is used
-		} else if ( document.attachEvent ) {
-			// ensure firing before onload,
-			// maybe late but safe also for iframes
-			document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
-			// A fallback to window.onload, that will always work
-			window.attachEvent( "onload", jQuery.ready );
-
-			// If IE and not a frame
-			// continually check to see if the document is ready
-			var toplevel = false;
-
-			try {
-				toplevel = window.frameElement == null;
-			} catch(e) {}
-
-			if ( document.documentElement.doScroll && toplevel ) {
-				doScrollCheck();
-			}
-		}
-	},
-
-	// See test/unit/core.js for details concerning isFunction.
-	// Since version 1.3, DOM methods and functions like alert
-	// aren't supported. They return false on IE (#2968).
-	isFunction: function( obj ) {
-		return jQuery.type(obj) === "function";
-	},
-
-	isArray: Array.isArray || function( obj ) {
-		return jQuery.type(obj) === "array";
-	},
-
-	// A crude way of determining if an object is a window
-	isWindow: function( obj ) {
-		return obj && typeof obj === "object" && "setInterval" in obj;
-	},
-
-	isNumeric: function( obj ) {
-		return !isNaN( parseFloat(obj) ) && isFinite( obj );
-	},
-
-	type: function( obj ) {
-		return obj == null ?
-			String( obj ) :
-			class2type[ toString.call(obj) ] || "object";
-	},
-
-	isPlainObject: function( obj ) {
-		// Must be an Object.
-		// Because of IE, we also have to check the presence of the constructor property.
-		// Make sure that DOM nodes and window objects don't pass through, as well
-		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		try {
-			// Not own constructor property must be Object
-			if ( obj.constructor &&
-				!hasOwn.call(obj, "constructor") &&
-				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-				return false;
-			}
-		} catch ( e ) {
-			// IE8,9 Will throw exceptions on certain host objects #9897
-			return false;
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own.
-
-		var key;
-		for ( key in obj ) {}
-
-		return key === undefined || hasOwn.call( obj, key );
-	},
-
-	isEmptyObject: function( obj ) {
-		for ( var name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	parseJSON: function( data ) {
-		if ( typeof data !== "string" || !data ) {
-			return null;
-		}
-
-		// Make sure leading/trailing whitespace is removed (IE can't handle it)
-		data = jQuery.trim( data );
-
-		// Attempt to parse using the native JSON parser first
-		if ( window.JSON && window.JSON.parse ) {
-			return window.JSON.parse( data );
-		}
-
-		// Make sure the incoming data is actual JSON
-		// Logic borrowed from http://json.org/json2.js
-		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-			.replace( rvalidtokens, "]" )
-			.replace( rvalidbraces, "")) ) {
-
-			return ( new Function( "return " + data ) )();
-
-		}
-		jQuery.error( "Invalid JSON: " + data );
-	},
-
-	// Cross-browser xml parsing
-	parseXML: function( data ) {
-		var xml, tmp;
-		try {
-			if ( window.DOMParser ) { // Standard
-				tmp = new DOMParser();
-				xml = tmp.parseFromString( data , "text/xml" );
-			} else { // IE
-				xml = new ActiveXObject( "Microsoft.XMLDOM" );
-				xml.async = "false";
-				xml.loadXML( data );
-			}
-		} catch( e ) {
-			xml = undefined;
-		}
-		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-			jQuery.error( "Invalid XML: " + data );
-		}
-		return xml;
-	},
-
-	noop: function() {},
-
-	// Evaluates a script in a global context
-	// Workarounds based on findings by Jim Driscoll
-	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-	globalEval: function( data ) {
-		if ( data && rnotwhite.test( data ) ) {
-			// We use execScript on Internet Explorer
-			// We use an anonymous function so that context is window
-			// rather than jQuery in Firefox
-			( window.execScript || function( data ) {
-				window[ "eval" ].call( window, data );
-			} )( data );
-		}
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
-	},
-
-	// args is for internal usage only
-	each: function( object, callback, args ) {
-		var name, i = 0,
-			length = object.length,
-			isObj = length === undefined || jQuery.isFunction( object );
-
-		if ( args ) {
-			if ( isObj ) {
-				for ( name in object ) {
-					if ( callback.apply( object[ name ], args ) === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( ; i < length; ) {
-					if ( callback.apply( object[ i++ ], args ) === false ) {
-						break;
-					}
-				}
-			}
-
-		// A special, fast, case for the most common use of each
-		} else {
-			if ( isObj ) {
-				for ( name in object ) {
-					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( ; i < length; ) {
-					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
-						break;
-					}
-				}
-			}
-		}
-
-		return object;
-	},
-
-	// Use native String.trim function wherever possible
-	trim: trim ?
-		function( text ) {
-			return text == null ?
-				"" :
-				trim.call( text );
-		} :
-
-		// Otherwise use our own trimming functionality
-		function( text ) {
-			return text == null ?
-				"" :
-				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
-		},
-
-	// results is for internal usage only
-	makeArray: function( array, results ) {
-		var ret = results || [];
-
-		if ( array != null ) {
-			// The window, strings (and functions) also have 'length'
-			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-			var type = jQuery.type( array );
-
-			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
-				push.call( ret, array );
-			} else {
-				jQuery.merge( ret, array );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, array, i ) {
-		var len;
-
-		if ( array ) {
-			if ( indexOf ) {
-				return indexOf.call( array, elem, i );
-			}
-
-			len = array.length;
-			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-			for ( ; i < len; i++ ) {
-				// Skip accessing in sparse arrays
-				if ( i in array && array[ i ] === elem ) {
-					return i;
-				}
-			}
-		}
-
-		return -1;
-	},
-
-	merge: function( first, second ) {
-		var i = first.length,
-			j = 0;
-
-		if ( typeof second.length === "number" ) {
-			for ( var l = second.length; j < l; j++ ) {
-				first[ i++ ] = second[ j ];
-			}
-
-		} else {
-			while ( second[j] !== undefined ) {
-				first[ i++ ] = second[ j++ ];
-			}
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, inv ) {
-		var ret = [], retVal;
-		inv = !!inv;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( var i = 0, length = elems.length; i < length; i++ ) {
-			retVal = !!callback( elems[ i ], i );
-			if ( inv !== retVal ) {
-				ret.push( elems[ i ] );
-			}
-		}
-
-		return ret;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var value, key, ret = [],
-			i = 0,
-			length = elems.length,
-			// jquery objects are treated as arrays
-			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
-		// Go through the array, translating each of the items to their
-		if ( isArray ) {
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( key in elems ) {
-				value = callback( elems[ key ], key, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return ret.concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		if ( typeof context === "string" ) {
-			var tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		var args = slice.call( arguments, 2 ),
-			proxy = function() {
-				return fn.apply( context, args.concat( slice.call( arguments ) ) );
-			};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	// Mutifunctional method to get and set values to a collection
-	// The value/s can optionally be executed if it's a function
-	access: function( elems, key, value, exec, fn, pass ) {
-		var length = elems.length;
-
-		// Setting many attributes
-		if ( typeof key === "object" ) {
-			for ( var k in key ) {
-				jQuery.access( elems, k, key[k], exec, fn, value );
-			}
-			return elems;
-		}
-
-		// Setting one attribute
-		if ( value !== undefined ) {
-			// Optionally, function values get executed if exec is true
-			exec = !pass && exec && jQuery.isFunction(value);
-
-			for ( var i = 0; i < length; i++ ) {
-				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
-			}
-
-			return elems;
-		}
-
-		// Getting an attribute
-		return length ? fn( elems[0], key ) : undefined;
-	},
-
-	now: function() {
-		return ( new Date() ).getTime();
-	},
-
-	// Use of jQuery.browser is frowned upon.
-	// More details: http://docs.jquery.com/Utilities/jQuery.browser
-	uaMatch: function( ua ) {
-		ua = ua.toLowerCase();
-
-		var match = rwebkit.exec( ua ) ||
-			ropera.exec( ua ) ||
-			rmsie.exec( ua ) ||
-			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
-			[];
-
-		return { browser: match[1] || "", version: match[2] || "0" };
-	},
-
-	sub: function() {
-		function jQuerySub( selector, context ) {
-			return new jQuerySub.fn.init( selector, context );
-		}
-		jQuery.extend( true, jQuerySub, this );
-		jQuerySub.superclass = this;
-		jQuerySub.fn = jQuerySub.prototype = this();
-		jQuerySub.fn.constructor = jQuerySub;
-		jQuerySub.sub = this.sub;
-		jQuerySub.fn.init = function init( selector, context ) {
-			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-				context = jQuerySub( context );
-			}
-
-			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-		};
-		jQuerySub.fn.init.prototype = jQuerySub.fn;
-		var rootjQuerySub = jQuerySub(document);
-		return jQuerySub;
-	},
-
-	browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
-	jQuery.browser[ browserMatch.browser ] = true;
-	jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
-	jQuery.browser.safari = true;
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
-	trimLeft = /^[\s\xA0]+/;
-	trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
-	DOMContentLoaded = function() {
-		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-		jQuery.ready();
-	};
-
-} else if ( document.attachEvent ) {
-	DOMContentLoaded = function() {
-		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-		if ( document.readyState === "complete" ) {
-			document.detachEvent( "onreadystatechange", DOMContentLoaded );
-			jQuery.ready();
-		}
-	};
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
-	if ( jQuery.isReady ) {
-		return;
-	}
-
-	try {
-		// If IE is used, use the trick by Diego Perini
-		// http://javascript.nwbox.com/IEContentLoaded/
-		document.documentElement.doScroll("left");
-	} catch(e) {
-		setTimeout( doScrollCheck, 1 );
-		return;
-	}
-
-	// and execute any waiting functions
-	jQuery.ready();
-}
-
-return jQuery;
-
-})();
-
-
-// String to Object flags format cache
-var flagsCache = {};
-
-// Convert String-formatted flags into Object-formatted ones and store in cache
-function createFlags( flags ) {
-	var object = flagsCache[ flags ] = {},
-		i, length;
-	flags = flags.split( /\s+/ );
-	for ( i = 0, length = flags.length; i < length; i++ ) {
-		object[ flags[i] ] = true;
-	}
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	flags:	an optional list of space-separated flags that will change how
- *			the callback list behaves
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible flags:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( flags ) {
-
-	// Convert flags from String-formatted to Object-formatted
-	// (we check in cache first)
-	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
-
-	var // Actual callback list
-		list = [],
-		// Stack of fire calls for repeatable lists
-		stack = [],
-		// Last fire value (for non-forgettable lists)
-		memory,
-		// Flag to know if list is currently firing
-		firing,
-		// First callback to fire (used internally by add and fireWith)
-		firingStart,
-		// End of the loop when firing
-		firingLength,
-		// Index of currently firing callback (modified by remove if needed)
-		firingIndex,
-		// Add one or several callbacks to the list
-		add = function( args ) {
-			var i,
-				length,
-				elem,
-				type,
-				actual;
-			for ( i = 0, length = args.length; i < length; i++ ) {
-				elem = args[ i ];
-				type = jQuery.type( elem );
-				if ( type === "array" ) {
-					// Inspect recursively
-					add( elem );
-				} else if ( type === "function" ) {
-					// Add if not in unique mode and callback is not in
-					if ( !flags.unique || !self.has( elem ) ) {
-						list.push( elem );
-					}
-				}
-			}
-		},
-		// Fire callbacks
-		fire = function( context, args ) {
-			args = args || [];
-			memory = !flags.memory || [ context, args ];
-			firing = true;
-			firingIndex = firingStart || 0;
-			firingStart = 0;
-			firingLength = list.length;
-			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
-					memory = true; // Mark as halted
-					break;
-				}
-			}
-			firing = false;
-			if ( list ) {
-				if ( !flags.once ) {
-					if ( stack && stack.length ) {
-						memory = stack.shift();
-						self.fireWith( memory[ 0 ], memory[ 1 ] );
-					}
-				} else if ( memory === true ) {
-					self.disable();
-				} else {
-					list = [];
-				}
-			}
-		},
-		// Actual Callbacks object
-		self = {
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-					var length = list.length;
-					add( arguments );
-					// Do we need to add the callbacks to the
-					// current firing batch?
-					if ( firing ) {
-						firingLength = list.length;
-					// With memory, if we're not firing then
-					// we should call right away, unless previous
-					// firing was halted (stopOnFalse)
-					} else if ( memory && memory !== true ) {
-						firingStart = length;
-						fire( memory[ 0 ], memory[ 1 ] );
-					}
-				}
-				return this;
-			},
-			// Remove a callback from the list
-			remove: function() {
-				if ( list ) {
-					var args = arguments,
-						argIndex = 0,
-						argLength = args.length;
-					for ( ; argIndex < argLength ; argIndex++ ) {
-						for ( var i = 0; i < list.length; i++ ) {
-							if ( args[ argIndex ] === list[ i ] ) {
-								// Handle firingIndex and firingLength
-								if ( firing ) {
-									if ( i <= firingLength ) {
-										firingLength--;
-										if ( i <= firingIndex ) {
-											firingIndex--;
-										}
-									}
-								}
-								// Remove the element
-								list.splice( i--, 1 );
-								// If we have some unicity property then
-								// we only need to do this once
-								if ( flags.unique ) {
-									break;
-								}
-							}
-						}
-					}
-				}
-				return this;
-			},
-			// Control if a given callback is in the list
-			has: function( fn ) {
-				if ( list ) {
-					var i = 0,
-						length = list.length;
-					for ( ; i < length; i++ ) {
-						if ( fn === list[ i ] ) {
-							return true;
-						}
-					}
-				}
-				return false;
-			},
-			// Remove all callbacks from the list
-			empty: function() {
-				list = [];
-				return this;
-			},
-			// Have the list do nothing anymore
-			disable: function() {
-				list = stack = memory = undefined;
-				return this;
-			},
-			// Is it disabled?
-			disabled: function() {
-				return !list;
-			},
-			// Lock the list in its current state
-			lock: function() {
-				stack = undefined;
-				if ( !memory || memory === true ) {
-					self.disable();
-				}
-				return this;
-			},
-			// Is it locked?
-			locked: function() {
-				return !stack;
-			},
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				if ( stack ) {
-					if ( firing ) {
-						if ( !flags.once ) {
-							stack.push( [ context, args ] );
-						}
-					} else if ( !( flags.once && memory ) ) {
-						fire( context, args );
-					}
-				}
-				return this;
-			},
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!memory;
-			}
-		};
-
-	return self;
-};
-
-
-
-
-var // Static reference to slice
-	sliceDeferred = [].slice;
-
-jQuery.extend({
-
-	Deferred: function( func ) {
-		var doneList = jQuery.Callbacks( "once memory" ),
-			failList = jQuery.Callbacks( "once memory" ),
-			progressList = jQuery.Callbacks( "memory" ),
-			state = "pending",
-			lists = {
-				resolve: doneList,
-				reject: failList,
-				notify: progressList
-			},
-			promise = {
-				done: doneList.add,
-				fail: failList.add,
-				progress: progressList.add,
-
-				state: function() {
-					return state;
-				},
-
-				// Deprecated
-				isResolved: doneList.fired,
-				isRejected: failList.fired,
-
-				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
-					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
-					return this;
-				},
-				always: function() {
-					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
-					return this;
-				},
-				pipe: function( fnDone, fnFail, fnProgress ) {
-					return jQuery.Deferred(function( newDefer ) {
-						jQuery.each( {
-							done: [ fnDone, "resolve" ],
-							fail: [ fnFail, "reject" ],
-							progress: [ fnProgress, "notify" ]
-						}, function( handler, data ) {
-							var fn = data[ 0 ],
-								action = data[ 1 ],
-								returned;
-							if ( jQuery.isFunction( fn ) ) {
-								deferred[ handler ](function() {
-									returned = fn.apply( this, arguments );
-									if ( returned && jQuery.isFunction( returned.promise ) ) {
-										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
-									} else {
-										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-									}
-								});
-							} else {
-								deferred[ handler ]( newDefer[ action ] );
-							}
-						});
-					}).promise();
-				},
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					if ( obj == null ) {
-						obj = promise;
-					} else {
-						for ( var key in promise ) {
-							obj[ key ] = promise[ key ];
-						}
-					}
-					return obj;
-				}
-			},
-			deferred = promise.promise({}),
-			key;
-
-		for ( key in lists ) {
-			deferred[ key ] = lists[ key ].fire;
-			deferred[ key + "With" ] = lists[ key ].fireWith;
-		}
-
-		// Handle state
-		deferred.done( function() {
-			state = "resolved";
-		}, failList.disable, progressList.lock ).fail( function() {
-			state = "rejected";
-		}, doneList.disable, progressList.lock );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( firstParam ) {
-		var args = sliceDeferred.call( arguments, 0 ),
-			i = 0,
-			length = args.length,
-			pValues = new Array( length ),
-			count = length,
-			pCount = length,
-			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
-				firstParam :
-				jQuery.Deferred(),
-			promise = deferred.promise();
-		function resolveFunc( i ) {
-			return function( value ) {
-				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-				if ( !( --count ) ) {
-					deferred.resolveWith( deferred, args );
-				}
-			};
-		}
-		function progressFunc( i ) {
-			return function( value ) {
-				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-				deferred.notifyWith( promise, pValues );
-			};
-		}
-		if ( length > 1 ) {
-			for ( ; i < length; i++ ) {
-				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
-					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
-				} else {
-					--count;
-				}
-			}
-			if ( !count ) {
-				deferred.resolveWith( deferred, args );
-			}
-		} else if ( deferred !== firstParam ) {
-			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
-		}
-		return promise;
-	}
-});
-
-
-
-
-jQuery.support = (function() {
-
-	var support,
-		all,
-		a,
-		select,
-		opt,
-		input,
-		marginDiv,
-		fragment,
-		tds,
-		events,
-		eventName,
-		i,
-		isSupported,
-		div = document.createElement( "div" ),
-		documentElement = document.documentElement;
-
-	// Preliminary tests
-	div.setAttribute("className", "t");
-	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
-	all = div.getElementsByTagName( "*" );
-	a = div.getElementsByTagName( "a" )[ 0 ];
-
-	// Can't get basic test support
-	if ( !all || !all.length || !a ) {
-		return {};
-	}
-
-	// First batch of supports tests
-	select = document.createElement( "select" );
-	opt = select.appendChild( document.createElement("option") );
-	input = div.getElementsByTagName( "input" )[ 0 ];
-
-	support = {
-		// IE strips leading whitespace when .innerHTML is used
-		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-		// Make sure that tbody elements aren't automatically inserted
-		// IE will insert them into empty tables
-		tbody: !div.getElementsByTagName("tbody").length,
-
-		// Make sure that link elements get serialized correctly by innerHTML
-		// This requires a wrapper element in IE
-		htmlSerialize: !!div.getElementsByTagName("link").length,
-
-		// Get the style information from getAttribute
-		// (IE uses .cssText instead)
-		style: /top/.test( a.getAttribute("style") ),
-
-		// Make sure that URLs aren't manipulated
-		// (IE normalizes it by default)
-		hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-		// Make sure that element opacity exists
-		// (IE uses filter instead)
-		// Use a regex to work around a WebKit issue. See #5145
-		opacity: /^0.55/.test( a.style.opacity ),
-
-		// Verify style float existence
-		// (IE uses styleFloat instead of cssFloat)
-		cssFloat: !!a.style.cssFloat,
-
-		// Make sure that if no value is specified for a checkbox
-		// that it defaults to "on".
-		// (WebKit defaults to "" instead)
-		checkOn: ( input.value === "on" ),
-
-		// Make sure that a selected-by-default option has a working selected property.
-		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-		optSelected: opt.selected,
-
-		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-		getSetAttribute: div.className !== "t",
-
-		// Tests for enctype support on a form(#6743)
-		enctype: !!document.createElement("form").enctype,
-
-		// Makes sure cloning an html5 element does not cause problems
-		// Where outerHTML is undefined, this still works
-		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-		// Will be defined later
-		submitBubbles: true,
-		changeBubbles: true,
-		focusinBubbles: false,
-		deleteExpando: true,
-		noCloneEvent: true,
-		inlineBlockNeedsLayout: false,
-		shrinkWrapBlocks: false,
-		reliableMarginRight: true
-	};
-
-	// Make sure checked status is properly cloned
-	input.checked = true;
-	support.noCloneChecked = input.cloneNode( true ).checked;
-
-	// Make sure that the options inside disabled selects aren't marked as disabled
-	// (WebKit marks them as disabled)
-	select.disabled = true;
-	support.optDisabled = !opt.disabled;
-
-	// Test to see if it's possible to delete an expando from an element
-	// Fails in Internet Explorer
-	try {
-		delete div.test;
-	} catch( e ) {
-		support.deleteExpando = false;
-	}
-
-	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-		div.attachEvent( "onclick", function() {
-			// Cloning a node shouldn't copy over any
-			// bound event handlers (IE does this)
-			support.noCloneEvent = false;
-		});
-		div.cloneNode( true ).fireEvent( "onclick" );
-	}
-
-	// Check if a radio maintains its value
-	// after being appended to the DOM
-	input = document.createElement("input");
-	input.value = "t";
-	input.setAttribute("type", "radio");
-	support.radioValue = input.value === "t";
-
-	input.setAttribute("checked", "checked");
-	div.appendChild( input );
-	fragment = document.createDocumentFragment();
-	fragment.appendChild( div.lastChild );
-
-	// WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Check if a disconnected checkbox will retain its checked
-	// value of true after appended to the DOM (IE6/7)
-	support.appendChecked = input.checked;
-
-	fragment.removeChild( input );
-	fragment.appendChild( div );
-
-	div.innerHTML = "";
-
-	// Check if div with explicit width and no margin-right incorrectly
-	// gets computed margin-right based on width of container. For more
-	// info see bug #3333
-	// Fails in WebKit before Feb 2011 nightlies
-	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-	if ( window.getComputedStyle ) {
-		marginDiv = document.createElement( "div" );
-		marginDiv.style.width = "0";
-		marginDiv.style.marginRight = "0";
-		div.style.width = "2px";
-		div.appendChild( marginDiv );
-		support.reliableMarginRight =
-			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
-	}
-
-	// Technique from Juriy Zaytsev
-	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-	// We only care about the case where non-standard event systems
-	// are used, namely in IE. Short-circuiting here helps us to
-	// avoid an eval call (in setAttribute) which can cause CSP
-	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-	if ( div.attachEvent ) {
-		for( i in {
-			submit: 1,
-			change: 1,
-			focusin: 1
-		}) {
-			eventName = "on" + i;
-			isSupported = ( eventName in div );
-			if ( !isSupported ) {
-				div.setAttribute( eventName, "return;" );
-				isSupported = ( typeof div[ eventName ] === "function" );
-			}
-			support[ i + "Bubbles" ] = isSupported;
-		}
-	}
-
-	fragment.removeChild( div );
-
-	// Null elements to avoid leaks in IE
-	fragment = select = opt = marginDiv = div = input = null;
-
-	// Run tests that need a body at doc ready
-	jQuery(function() {
-		var container, outer, inner, table, td, offsetSupport,
-			conMarginTop, ptlm, vb, style, html,
-			body = document.getElementsByTagName("body")[0];
-
-		if ( !body ) {
-			// Return for frameset docs that don't have a body
-			return;
-		}
-
-		conMarginTop = 1;
-		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
-		vb = "visibility:hidden;border:0;";
-		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
-		html = "<div " + style + "><div></div></div>" +
-			"<table " + style + " cellpadding='0' cellspacing='0'>" +
-			"<tr><td></td></tr></table>";
-
-		container = document.createElement("div");
-		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
-		body.insertBefore( container, body.firstChild );
-
-		// Construct the test element
-		div = document.createElement("div");
-		container.appendChild( div );
-
-		// Check if table cells still have offsetWidth/Height when they are set
-		// to display:none and there are still other visible table cells in a
-		// table row; if so, offsetWidth/Height are not reliable for use when
-		// determining if an element has been hidden directly using
-		// display:none (it is still safe to use offsets if a parent element is
-		// hidden; don safety goggles and see bug #4512 for more information).
-		// (only IE 8 fails this test)
-		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
-		tds = div.getElementsByTagName( "td" );
-		isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-		tds[ 0 ].style.display = "";
-		tds[ 1 ].style.display = "none";
-
-		// Check if empty table cells still have offsetWidth/Height
-		// (IE <= 8 fail this test)
-		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-		// Figure out if the W3C box model works as expected
-		div.innerHTML = "";
-		div.style.width = div.style.paddingLeft = "1px";
-		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
-
-		if ( typeof div.style.zoom !== "undefined" ) {
-			// Check if natively block-level elements act like inline-block
-			// elements when setting their display to 'inline' and giving
-			// them layout
-			// (IE < 8 does this)
-			div.style.display = "inline";
-			div.style.zoom = 1;
-			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
-			// Check if elements with layout shrink-wrap their children
-			// (IE 6 does this)
-			div.style.display = "";
-			div.innerHTML = "<div style='width:4px;'></div>";
-			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
-		}
-
-		div.style.cssText = ptlm + vb;
-		div.innerHTML = html;
-
-		outer = div.firstChild;
-		inner = outer.firstChild;
-		td = outer.nextSibling.firstChild.firstChild;
-
-		offsetSupport = {
-			doesNotAddBorder: ( inner.offsetTop !== 5 ),
-			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
-		};
-
-		inner.style.position = "fixed";
-		inner.style.top = "20px";
-
-		// safari subtracts parent border width here which is 5px
-		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
-		inner.style.position = inner.style.top = "";
-
-		outer.style.overflow = "hidden";
-		outer.style.position = "relative";
-
-		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
-		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
-		body.removeChild( container );
-		div  = container = null;
-
-		jQuery.extend( support, offsetSupport );
-	});
-
-	return support;
-})();
-
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
-	rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
-	cache: {},
-
-	// Please use with caution
-	uuid: 0,
-
-	// Unique for each copy of jQuery on the page
-	// Non-digits removed to match rinlinejQuery
-	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
-	// The following elements throw uncatchable exceptions if you
-	// attempt to add expando properties to them.
-	noData: {
-		"embed": true,
-		// Ban all objects except for Flash (which handle expandos)
-		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-		"applet": true
-	},
-
-	hasData: function( elem ) {
-		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-		return !!elem && !isEmptyDataObject( elem );
-	},
-
-	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-		if ( !jQuery.acceptData( elem ) ) {
-			return;
-		}
-
-		var privateCache, thisCache, ret,
-			internalKey = jQuery.expando,
-			getByName = typeof name === "string",
-
-			// We have to handle DOM nodes and JS objects differently because IE6-7
-			// can't GC object references properly across the DOM-JS boundary
-			isNode = elem.nodeType,
-
-			// Only DOM nodes need the global jQuery cache; JS object data is
-			// attached directly to the object so GC can occur automatically
-			cache = isNode ? jQuery.cache : elem,
-
-			// Only defining an ID for JS objects if its cache already exists allows
-			// the code to shortcut on the same path as a DOM node with no cache
-			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
-			isEvents = name === "events";
-
-		// Avoid doing any more work than we need to when trying to get data on an
-		// object that has no data at all
-		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
-			return;
-		}
-
-		if ( !id ) {
-			// Only DOM nodes need a new unique ID for each element since their data
-			// ends up in the global cache
-			if ( isNode ) {
-				elem[ internalKey ] = id = ++jQuery.uuid;
-			} else {
-				id = internalKey;
-			}
-		}
-
-		if ( !cache[ id ] ) {
-			cache[ id ] = {};
-
-			// Avoids exposing jQuery metadata on plain JS objects when the object
-			// is serialized using JSON.stringify
-			if ( !isNode ) {
-				cache[ id ].toJSON = jQuery.noop;
-			}
-		}
-
-		// An object can be passed to jQuery.data instead of a key/value pair; this gets
-		// shallow copied over onto the existing cache
-		if ( typeof name === "object" || typeof name === "function" ) {
-			if ( pvt ) {
-				cache[ id ] = jQuery.extend( cache[ id ], name );
-			} else {
-				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-			}
-		}
-
-		privateCache = thisCache = cache[ id ];
-
-		// jQuery data() is stored in a separate object inside the object's internal data
-		// cache in order to avoid key collisions between internal data and user-defined
-		// data.
-		if ( !pvt ) {
-			if ( !thisCache.data ) {
-				thisCache.data = {};
-			}
-
-			thisCache = thisCache.data;
-		}
-
-		if ( data !== undefined ) {
-			thisCache[ jQuery.camelCase( name ) ] = data;
-		}
-
-		// Users should not attempt to inspect the internal events object using jQuery.data,
-		// it is undocumented and subject to change. But does anyone listen? No.
-		if ( isEvents && !thisCache[ name ] ) {
-			return privateCache.events;
-		}
-
-		// Check for both converted-to-camel and non-converted data property names
-		// If a data property was specified
-		if ( getByName ) {
-
-			// First Try to find as-is property data
-			ret = thisCache[ name ];
-
-			// Test for null|undefined property data
-			if ( ret == null ) {
-
-				// Try to find the camelCased property
-				ret = thisCache[ jQuery.camelCase( name ) ];
-			}
-		} else {
-			ret = thisCache;
-		}
-
-		return ret;
-	},
-
-	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-		if ( !jQuery.acceptData( elem ) ) {
-			return;
-		}
-
-		var thisCache, i, l,
-
-			// Reference to internal data cache key
-			internalKey = jQuery.expando,
-
-			isNode = elem.nodeType,
-
-			// See jQuery.data for more information
-			cache = isNode ? jQuery.cache : elem,
-
-			// See jQuery.data for more information
-			id = isNode ? elem[ internalKey ] : internalKey;
-
-		// If there is already no cache entry for this object, there is no
-		// purpose in continuing
-		if ( !cache[ id ] ) {
-			return;
-		}
-
-		if ( name ) {
-
-			thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-			if ( thisCache ) {
-
-				// Support array or space separated string names for data keys
-				if ( !jQuery.isArray( name ) ) {
-
-					// try the string as a key before any manipulation
-					if ( name in thisCache ) {
-						name = [ name ];
-					} else {
-
-						// split the camel cased version by spaces unless a key with the spaces exists
-						name = jQuery.camelCase( name );
-						if ( name in thisCache ) {
-							name = [ name ];
-						} else {
-							name = name.split( " " );
-						}
-					}
-				}
-
-				for ( i = 0, l = name.length; i < l; i++ ) {
-					delete thisCache[ name[i] ];
-				}
-
-				// If there is no data left in the cache, we want to continue
-				// and let the cache object itself get destroyed
-				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-					return;
-				}
-			}
-		}
-
-		// See jQuery.data for more information
-		if ( !pvt ) {
-			delete cache[ id ].data;
-
-			// Don't destroy the parent cache unless the internal data object
-			// had been the only thing left in it
-			if ( !isEmptyDataObject(cache[ id ]) ) {
-				return;
-			}
-		}
-
-		// Browsers that fail expando deletion also refuse to delete expandos on
-		// the window, but it will allow it on all other JS objects; other browsers
-		// don't care
-		// Ensure that `cache` is not a window object #10080
-		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
-			delete cache[ id ];
-		} else {
-			cache[ id ] = null;
-		}
-
-		// We destroyed the cache and need to eliminate the expando on the node to avoid
-		// false lookups in the cache for entries that no longer exist
-		if ( isNode ) {
-			// IE does not allow us to delete expando properties from nodes,
-			// nor does it have a removeAttribute function on Document nodes;
-			// we must handle all of these cases
-			if ( jQuery.support.deleteExpando ) {
-				delete elem[ internalKey ];
-			} else if ( elem.removeAttribute ) {
-				elem.removeAttribute( internalKey );
-			} else {
-				elem[ internalKey ] = null;
-			}
-		}
-	},
-
-	// For internal use only.
-	_data: function( elem, name, data ) {
-		return jQuery.data( elem, name, data, true );
-	},
-
-	// A method for determining if a DOM node can handle the data expando
-	acceptData: function( elem ) {
-		if ( elem.nodeName ) {
-			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-			if ( match ) {
-				return !(match === true || elem.getAttribute("classid") !== match);
-			}
-		}
-
-		return true;
-	}
-});
-
-jQuery.fn.extend({
-	data: function( key, value ) {
-		var parts, attr, name,
-			data = null;
-
-		if ( typeof key === "undefined" ) {
-			if ( this.length ) {
-				data = jQuery.data( this[0] );
-
-				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
-					attr = this[0].attributes;
-					for ( var i = 0, l = attr.length; i < l; i++ ) {
-						name = attr[i].name;
-
-						if ( name.indexOf( "data-" ) === 0 ) {
-							name = jQuery.camelCase( name.substring(5) );
-
-							dataAttr( this[0], name, data[ name ] );
-						}
-					}
-					jQuery._data( this[0], "parsedAttrs", true );
-				}
-			}
-
-			return data;
-
-		} else if ( typeof key === "object" ) {
-			return this.each(function() {
-				jQuery.data( this, key );
-			});
-		}
-
-		parts = key.split(".");
-		parts[1] = parts[1] ? "." + parts[1] : "";
-
-		if ( value === undefined ) {
-			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
-			// Try to fetch any internally stored data first
-			if ( data === undefined && this.length ) {
-				data = jQuery.data( this[0], key );
-				data = dataAttr( this[0], key, data );
-			}
-
-			return data === undefined && parts[1] ?
-				this.data( parts[0] ) :
-				data;
-
-		} else {
-			return this.each(function() {
-				var self = jQuery( this ),
-					args = [ parts[0], value ];
-
-				self.triggerHandler( "setData" + parts[1] + "!", args );
-				jQuery.data( this, key, value );
-				self.triggerHandler( "changeData" + parts[1] + "!", args );
-			});
-		}
-	},
-
-	removeData: function( key ) {
-		return this.each(function() {
-			jQuery.removeData( this, key );
-		});
-	}
-});
-
-function dataAttr( elem, key, data ) {
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-
-		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-				data === "false" ? false :
-				data === "null" ? null :
-				jQuery.isNumeric( data ) ? parseFloat( data ) :
-					rbrace.test( data ) ? jQuery.parseJSON( data ) :
-					data;
-			} catch( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			jQuery.data( elem, key, data );
-
-		} else {
-			data = undefined;
-		}
-	}
-
-	return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-	for ( var name in obj ) {
-
-		// if the public data object is empty, the private is still empty
-		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-			continue;
-		}
-		if ( name !== "toJSON" ) {
-			return false;
-		}
-	}
-
-	return true;
-}
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
-	var deferDataKey = type + "defer",
-		queueDataKey = type + "queue",
-		markDataKey = type + "mark",
-		defer = jQuery._data( elem, deferDataKey );
-	if ( defer &&
-		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
-		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
-		// Give room for hard-coded callbacks to fire first
-		// and eventually mark/queue something else on the element
-		setTimeout( function() {
-			if ( !jQuery._data( elem, queueDataKey ) &&
-				!jQuery._data( elem, markDataKey ) ) {
-				jQuery.removeData( elem, deferDataKey, true );
-				defer.fire();
-			}
-		}, 0 );
-	}
-}
-
-jQuery.extend({
-
-	_mark: function( elem, type ) {
-		if ( elem ) {
-			type = ( type || "fx" ) + "mark";
-			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
-		}
-	},
-
-	_unmark: function( force, elem, type ) {
-		if ( force !== true ) {
-			type = elem;
-			elem = force;
-			force = false;
-		}
-		if ( elem ) {
-			type = type || "fx";
-			var key = type + "mark",
-				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
-			if ( count ) {
-				jQuery._data( elem, key, count );
-			} else {
-				jQuery.removeData( elem, key, true );
-				handleQueueMarkDefer( elem, type, "mark" );
-			}
-		}
-	},
-
-	queue: function( elem, type, data ) {
-		var q;
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			q = jQuery._data( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !q || jQuery.isArray(data) ) {
-					q = jQuery._data( elem, type, jQuery.makeArray(data) );
-				} else {
-					q.push( data );
-				}
-			}
-			return q || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			fn = queue.shift(),
-			hooks = {};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-		}
-
-		if ( fn ) {
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			jQuery._data( elem, type + ".run", hooks );
-			fn.call( elem, function() {
-				jQuery.dequeue( elem, type );
-			}, hooks );
-		}
-
-		if ( !queue.length ) {
-			jQuery.removeData( elem, type + "queue " + type + ".run", true );
-			handleQueueMarkDefer( elem, type, "queue" );
-		}
-	}
-});
-
-jQuery.fn.extend({
-	queue: function( type, data ) {
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-		}
-
-		if ( data === undefined ) {
-			return jQuery.queue( this[0], type );
-		}
-		return this.each(function() {
-			var queue = jQuery.queue( this, type, data );
-
-			if ( type === "fx" && queue[0] !== "inprogress" ) {
-				jQuery.dequeue( this, type );
-			}
-		});
-	},
-	dequeue: function( type ) {
-		return this.each(function() {
-			jQuery.dequeue( this, type );
-		});
-	},
-	// Based off of the plugin by Clint Helfers, with permission.
-	// http://blindsignals.com/index.php/2009/07/jquery-delay/
-	delay: function( time, type ) {
-		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-		type = type || "fx";
-
-		return this.queue( type, function( next, hooks ) {
-			var timeout = setTimeout( next, time );
-			hooks.stop = function() {
-				clearTimeout( timeout );
-			};
-		});
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, object ) {
-		if ( typeof type !== "string" ) {
-			object = type;
-			type = undefined;
-		}
-		type = type || "fx";
-		var defer = jQuery.Deferred(),
-			elements = this,
-			i = elements.length,
-			count = 1,
-			deferDataKey = type + "defer",
-			queueDataKey = type + "queue",
-			markDataKey = type + "mark",
-			tmp;
-		function resolve() {
-			if ( !( --count ) ) {
-				defer.resolveWith( elements, [ elements ] );
-			}
-		}
-		while( i-- ) {
-			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
-					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
-						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
-					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
-				count++;
-				tmp.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise();
-	}
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
-	rspace = /\s+/,
-	rreturn = /\r/g,
-	rtype = /^(?:button|input)$/i,
-	rfocusable = /^(?:button|input|object|select|textarea)$/i,
-	rclickable = /^a(?:rea)?$/i,
-	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-	getSetAttribute = jQuery.support.getSetAttribute,
-	nodeHook, boolHook, fixSpecified;
-
-jQuery.fn.extend({
-	attr: function( name, value ) {
-		return jQuery.access( this, name, value, true, jQuery.attr );
-	},
-
-	removeAttr: function( name ) {
-		return this.each(function() {
-			jQuery.removeAttr( this, name );
-		});
-	},
-
-	prop: function( name, value ) {
-		return jQuery.access( this, name, value, true, jQuery.prop );
-	},
-
-	removeProp: function( name ) {
-		name = jQuery.propFix[ name ] || name;
-		return this.each(function() {
-			// try/catch handles cases where IE balks (such as removing a property on window)
-			try {
-				this[ name ] = undefined;
-				delete this[ name ];
-			} catch( e ) {}
-		});
-	},
-
-	addClass: function( value ) {
-		var classNames, i, l, elem,
-			setClass, c, cl;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).addClass( value.call(this, j, this.className) );
-			});
-		}
-
-		if ( value && typeof value === "string" ) {
-			classNames = value.split( rspace );
-
-			for ( i = 0, l = this.length; i < l; i++ ) {
-				elem = this[ i ];
-
-				if ( elem.nodeType === 1 ) {
-					if ( !elem.className && classNames.length === 1 ) {
-						elem.className = value;
-
-					} else {
-						setClass = " " + elem.className + " ";
-
-						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
-								setClass += classNames[ c ] + " ";
-							}
-						}
-						elem.className = jQuery.trim( setClass );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classNames, i, l, elem, className, c, cl;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).removeClass( value.call(this, j, this.className) );
-			});
-		}
-
-		if ( (value && typeof value === "string") || value === undefined ) {
-			classNames = ( value || "" ).split( rspace );
-
-			for ( i = 0, l = this.length; i < l; i++ ) {
-				elem = this[ i ];
-
-				if ( elem.nodeType === 1 && elem.className ) {
-					if ( value ) {
-						className = (" " + elem.className + " ").replace( rclass, " " );
-						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-							className = className.replace(" " + classNames[ c ] + " ", " ");
-						}
-						elem.className = jQuery.trim( className );
-
-					} else {
-						elem.className = "";
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value,
-			isBool = typeof stateVal === "boolean";
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( i ) {
-				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-			});
-		}
-
-		return this.each(function() {
-			if ( type === "string" ) {
-				// toggle individual class names
-				var className,
-					i = 0,
-					self = jQuery( this ),
-					state = stateVal,
-					classNames = value.split( rspace );
-
-				while ( (className = classNames[ i++ ]) ) {
-					// check each className given, space seperated list
-					state = isBool ? state : !self.hasClass( className );
-					self[ state ? "addClass" : "removeClass" ]( className );
-				}
-
-			} else if ( type === "undefined" || type === "boolean" ) {
-				if ( this.className ) {
-					// store className if set
-					jQuery._data( this, "__className__", this.className );
-				}
-
-				// toggle whole className
-				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-			}
-		});
-	},
-
-	hasClass: function( selector ) {
-		var className = " " + selector + " ",
-			i = 0,
-			l = this.length;
-		for ( ; i < l; i++ ) {
-			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	val: function( value ) {
-		var hooks, ret, isFunction,
-			elem = this[0];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
-
-				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-					// handle most common string cases
-					ret.replace(rreturn, "") :
-					// handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each(function( i ) {
-			var self = jQuery(this), val;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, self.val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-			} else if ( typeof val === "number" ) {
-				val += "";
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map(val, function ( value ) {
-					return value == null ? "" : value + "";
-				});
-			}
-
-			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	valHooks: {
-		option: {
-			get: function( elem ) {
-				// attributes.value is undefined in Blackberry 4.7 but
-				// uses .value. See #6932
-				var val = elem.attributes.value;
-				return !val || val.specified ? elem.value : elem.text;
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, i, max, option,
-					index = elem.selectedIndex,
-					values = [],
-					options = elem.options,
-					one = elem.type === "select-one";
-
-				// Nothing was selected
-				if ( index < 0 ) {
-					return null;
-				}
-
-				// Loop through all the selected options
-				i = one ? index : 0;
-				max = one ? index + 1 : options.length;
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// Don't return options that are disabled or in a disabled optgroup
-					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-				if ( one && !values.length && options.length ) {
-					return jQuery( options[ index ] ).val();
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var values = jQuery.makeArray( value );
-
-				jQuery(elem).find("option").each(function() {
-					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-				});
-
-				if ( !values.length ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	},
-
-	attrFn: {
-		val: true,
-		css: true,
-		html: true,
-		text: true,
-		data: true,
-		width: true,
-		height: true,
-		offset: true
-	},
-
-	attr: function( elem, name, value, pass ) {
-		var ret, hooks, notxml,
-			nType = elem.nodeType;
-
-		// don't get/set attributes on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		if ( pass && name in jQuery.attrFn ) {
-			return jQuery( elem )[ name ]( value );
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === "undefined" ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		// All attributes are lowercase
-		// Grab necessary hook if one is defined
-		if ( notxml ) {
-			name = name.toLowerCase();
-			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-		}
-
-		if ( value !== undefined ) {
-
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-				return;
-
-			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				elem.setAttribute( name, "" + value );
-				return value;
-			}
-
-		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-			return ret;
-
-		} else {
-
-			ret = elem.getAttribute( name );
-
-			// Non-existent attributes return null, we normalize to undefined
-			return ret === null ?
-				undefined :
-				ret;
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var propName, attrNames, name, l,
-			i = 0;
-
-		if ( value && elem.nodeType === 1 ) {
-			attrNames = value.toLowerCase().split( rspace );
-			l = attrNames.length;
-
-			for ( ; i < l; i++ ) {
-				name = attrNames[ i ];
-
-				if ( name ) {
-					propName = jQuery.propFix[ name ] || name;
-
-					// See #9699 for explanation of this approach (setting first, then removal)
-					jQuery.attr( elem, name, "" );
-					elem.removeAttribute( getSetAttribute ? name : propName );
-
-					// Set corresponding property to false for boolean attributes
-					if ( rboolean.test( name ) && propName in elem ) {
-						elem[ propName ] = false;
-					}
-				}
-			}
-		}
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				// We can't allow the type property to be changed (since it causes problems in IE)
-				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-					jQuery.error( "type property can't be changed" );
-				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-					// Setting the type on a radio button after the value resets the value in IE6-9
-					// Reset value to it's default in case type is set after value
-					// This is for element creation
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		},
-		// Use the value property for back compat
-		// Use the nodeHook for button elements in IE6/7 (#1954)
-		value: {
-			get: function( elem, name ) {
-				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-					return nodeHook.get( elem, name );
-				}
-				return name in elem ?
-					elem.value :
-					null;
-			},
-			set: function( elem, value, name ) {
-				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-					return nodeHook.set( elem, value, name );
-				}
-				// Does not return so that setAttribute is also used
-				elem.value = value;
-			}
-		}
-	},
-
-	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( elem, name, value ) {
-		var ret, hooks, notxml,
-			nType = elem.nodeType;
-
-		// don't get/set properties on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		if ( notxml ) {
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				return ( elem[ name ] = value );
-			}
-
-		} else {
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-				return ret;
-
-			} else {
-				return elem[ name ];
-			}
-		}
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				var attributeNode = elem.getAttributeNode("tabindex");
-
-				return attributeNode && attributeNode.specified ?
-					parseInt( attributeNode.value, 10 ) :
-					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-						0 :
-						undefined;
-			}
-		}
-	}
-});
-
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
-boolHook = {
-	get: function( elem, name ) {
-		// Align boolean attributes with corresponding properties
-		// Fall back to attribute presence where some booleans are not supported
-		var attrNode,
-			property = jQuery.prop( elem, name );
-		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-			name.toLowerCase() :
-			undefined;
-	},
-	set: function( elem, value, name ) {
-		var propName;
-		if ( value === false ) {
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else {
-			// value is true since we know at this point it's type boolean and not false
-			// Set boolean attributes to the same name and set the DOM property
-			propName = jQuery.propFix[ name ] || name;
-			if ( propName in elem ) {
-				// Only set the IDL specifically if it already exists on the element
-				elem[ propName ] = true;
-			}
-
-			elem.setAttribute( name, name.toLowerCase() );
-		}
-		return name;
-	}
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-	fixSpecified = {
-		name: true,
-		id: true
-	};
-
-	// Use this for any attribute in IE6/7
-	// This fixes almost every IE6/7 issue
-	nodeHook = jQuery.valHooks.button = {
-		get: function( elem, name ) {
-			var ret;
-			ret = elem.getAttributeNode( name );
-			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
-				ret.nodeValue :
-				undefined;
-		},
-		set: function( elem, value, name ) {
-			// Set the existing or create a new attribute node
-			var ret = elem.getAttributeNode( name );
-			if ( !ret ) {
-				ret = document.createAttribute( name );
-				elem.setAttributeNode( ret );
-			}
-			return ( ret.nodeValue = value + "" );
-		}
-	};
-
-	// Apply the nodeHook to tabindex
-	jQuery.attrHooks.tabindex.set = nodeHook.set;
-
-	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
-	// This is for removals
-	jQuery.each([ "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-			set: function( elem, value ) {
-				if ( value === "" ) {
-					elem.setAttribute( name, "auto" );
-					return value;
-				}
-			}
-		});
-	});
-
-	// Set contenteditable to false on removals(#10429)
-	// Setting to empty string throws an error as an invalid value
-	jQuery.attrHooks.contenteditable = {
-		get: nodeHook.get,
-		set: function( elem, value, name ) {
-			if ( value === "" ) {
-				value = "false";
-			}
-			nodeHook.set( elem, value, name );
-		}
-	};
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
-	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-			get: function( elem ) {
-				var ret = elem.getAttribute( name, 2 );
-				return ret === null ? undefined : ret;
-			}
-		});
-	});
-}
-
-if ( !jQuery.support.style ) {
-	jQuery.attrHooks.style = {
-		get: function( elem ) {
-			// Return undefined in the case of empty string
-			// Normalize to lowercase since IE uppercases css property names
-			return elem.style.cssText.toLowerCase() || undefined;
-		},
-		set: function( elem, value ) {
-			return ( elem.style.cssText = "" + value );
-		}
-	};
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-
-			if ( parent ) {
-				parent.selectedIndex;
-
-				// Make sure that it also works with optgroups, see #5701
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-			return null;
-		}
-	});
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-	jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
-	jQuery.each([ "radio", "checkbox" ], function() {
-		jQuery.valHooks[ this ] = {
-			get: function( elem ) {
-				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-				return elem.getAttribute("value") === null ? "on" : elem.value;
-			}
-		};
-	});
-}
-jQuery.each([ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-			}
-		}
-	});
-});
-
-
-
-
-var rformElems = /^(?:textarea|input|select)$/i,
-	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
-	rhoverHack = /\bhover(\.\S+)?\b/,
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|contextmenu)|click/,
-	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
-	quickParse = function( selector ) {
-		var quick = rquickIs.exec( selector );
-		if ( quick ) {
-			//   0  1    2   3
-			// [ _, tag, id, class ]
-			quick[1] = ( quick[1] || "" ).toLowerCase();
-			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
-		}
-		return quick;
-	},
-	quickIs = function( elem, m ) {
-		var attrs = elem.attributes || {};
-		return (
-			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
-			(!m[2] || (attrs.id || {}).value === m[2]) &&
-			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
-		);
-	},
-	hoverHack = function( events ) {
-		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-	};
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	add: function( elem, types, handler, data, selector ) {
-
-		var elemData, eventHandle, events,
-			t, tns, type, namespaces, handleObj,
-			handleObjIn, quick, handlers, special;
-
-		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
-		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		events = elemData.events;
-		if ( !events ) {
-			elemData.events = events = {};
-		}
-		eventHandle = elemData.handle;
-		if ( !eventHandle ) {
-			elemData.handle = eventHandle = function( e ) {
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-					undefined;
-			};
-			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-			eventHandle.elem = elem;
-		}
-
-		// Handle multiple events separated by a space
-		// jQuery(...).bind("mouseover mouseout", fn);
-		types = jQuery.trim( hoverHack(types) ).split( " " );
-		for ( t = 0; t < types.length; t++ ) {
-
-			tns = rtypenamespace.exec( types[t] ) || [];
-			type = tns[1];
-			namespaces = ( tns[2] || "" ).split( "." ).sort();
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend({
-				type: type,
-				origType: tns[1],
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				quick: quickParse( selector ),
-				namespace: namespaces.join(".")
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			handlers = events[ type ];
-			if ( !handlers ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener/attachEvent if the special events handler returns false
-				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-					// Bind the global event handler to the element
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle, false );
-
-					} else if ( elem.attachEvent ) {
-						elem.attachEvent( "on" + type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-		// Nullify elem to prevent memory leaks in IE
-		elem = null;
-	},
-
-	global: {},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-
-		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
-			t, tns, type, origType, namespaces, origCount,
-			j, events, special, handle, eventType, handleObj;
-
-		if ( !elemData || !(events = elemData.events) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-		for ( t = 0; t < types.length; t++ ) {
-			tns = rtypenamespace.exec( types[t] ) || [];
-			type = origType = tns[1];
-			namespaces = tns[2];
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector? special.delegateType : special.bindType ) || type;
-			eventType = events[ type ] || [];
-			origCount = eventType.length;
-			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-
-			// Remove matching events
-			for ( j = 0; j < eventType.length; j++ ) {
-				handleObj = eventType[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					 ( !handler || handler.guid === handleObj.guid ) &&
-					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-					eventType.splice( j--, 1 );
-
-					if ( handleObj.selector ) {
-						eventType.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( eventType.length === 0 && origCount !== eventType.length ) {
-				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			handle = elemData.handle;
-			if ( handle ) {
-				handle.elem = null;
-			}
-
-			// removeData also checks for emptiness and clears the expando if empty
-			// so use it instead of delete
-			jQuery.removeData( elem, [ "events", "handle" ], true );
-		}
-	},
-
-	// Events that are safe to short-circuit if no handlers are attached.
-	// Native DOM events should not be added, they may have inline handlers.
-	customEvent: {
-		"getData": true,
-		"setData": true,
-		"changeData": true
-	},
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-		// Don't do events on text and comment nodes
-		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-			return;
-		}
-
-		// Event object or event type
-		var type = event.type || event,
-			namespaces = [],
-			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf( "!" ) >= 0 ) {
-			// Exclusive events trigger only for the exact event (no namespaces)
-			type = type.slice(0, -1);
-			exclusive = true;
-		}
-
-		if ( type.indexOf( "." ) >= 0 ) {
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split(".");
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-
-		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-			// No jQuery handlers for this event type, and it can't have inline handlers
-			return;
-		}
-
-		// Caller can pass in an Event, Object, or just an event type string
-		event = typeof event === "object" ?
-			// jQuery.Event object
-			event[ jQuery.expando ] ? event :
-			// Object literal
-			new jQuery.Event( type, event ) :
-			// Just the event type (string)
-			new jQuery.Event( type );
-
-		event.type = type;
-		event.isTrigger = true;
-		event.exclusive = exclusive;
-		event.namespace = namespaces.join( "." );
-		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
-		// Handle a global trigger
-		if ( !elem ) {
-
-			// TODO: Stop taunting the data cache; remove global events and always attach to document
-			cache = jQuery.cache;
-			for ( i in cache ) {
-				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-				}
-			}
-			return;
-		}
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data != null ? jQuery.makeArray( data ) : [];
-		data.unshift( event );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		eventPath = [[ elem, special.bindType || type ]];
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-			old = null;
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push([ cur, bubbleType ]);
-				old = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( old && old === elem.ownerDocument ) {
-				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
-			}
-		}
-
-		// Fire handlers on the event path
-		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
-			cur = eventPath[i][0];
-			event.type = eventPath[i][1];
-
-			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-			// Note that this is a bare JS function and not a jQuery handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
-				event.preventDefault();
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name name as the event.
-				// Can't use an .isFunction() check here because IE6/7 fails that test.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				// IE<9 dies on focus/blur to hidden element (#1486)
-				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					old = elem[ ontype ];
-
-					if ( old ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					elem[ type ]();
-					jQuery.event.triggered = undefined;
-
-					if ( old ) {
-						elem[ ontype ] = old;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	dispatch: function( event ) {
-
-		// Make a writable jQuery.Event from the native event object
-		event = jQuery.event.fix( event || window.event );
-
-		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-			delegateCount = handlers.delegateCount,
-			args = [].slice.call( arguments, 0 ),
-			run_all = !event.exclusive && !event.namespace,
-			handlerQueue = [],
-			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[0] = event;
-		event.delegateTarget = this;
-
-		// Determine handlers that should run if there are delegated events
-		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
-		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
-
-			// Pregenerate a single jQuery object for reuse with .is()
-			jqcur = jQuery(this);
-			jqcur.context = this.ownerDocument || this;
-
-			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-				selMatch = {};
-				matches = [];
-				jqcur[0] = cur;
-				for ( i = 0; i < delegateCount; i++ ) {
-					handleObj = handlers[ i ];
-					sel = handleObj.selector;
-
-					if ( selMatch[ sel ] === undefined ) {
-						selMatch[ sel ] = (
-							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
-						);
-					}
-					if ( selMatch[ sel ] ) {
-						matches.push( handleObj );
-					}
-				}
-				if ( matches.length ) {
-					handlerQueue.push({ elem: cur, matches: matches });
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( handlers.length > delegateCount ) {
-			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-		}
-
-		// Run delegates first; they may want to stop propagation beneath us
-		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-			matched = handlerQueue[ i ];
-			event.currentTarget = matched.elem;
-
-			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-				handleObj = matched.matches[ j ];
-
-				// Triggered event must either 1) be non-exclusive and have no namespace, or
-				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
-					event.data = handleObj.data;
-					event.handleObj = handleObj;
-
-					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-							.apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						event.result = ret;
-						if ( ret === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	// Includes some event props shared by KeyEvent and MouseEvent
-	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-	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( event, original ) {
-
-			// Add which for key events
-			if ( event.which == null ) {
-				event.which = original.charCode != null ? original.charCode : original.keyCode;
-			}
-
-			return event;
-		}
-	},
-
-	mouseHooks: {
-		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-		filter: function( event, original ) {
-			var eventDoc, doc, body,
-				button = original.button,
-				fromElement = original.fromElement;
-
-			// Calculate pageX/Y if missing and clientX/Y available
-			if ( event.pageX == null && original.clientX != null ) {
-				eventDoc = event.target.ownerDocument || document;
-				doc = eventDoc.documentElement;
-				body = eventDoc.body;
-
-				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-			}
-
-			// Add relatedTarget, if necessary
-			if ( !event.relatedTarget && fromElement ) {
-				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-			}
-
-			// Add which for click: 1 === left; 2 === middle; 3 === right
-			// Note: button is not normalized, so don't use it
-			if ( !event.which && button !== undefined ) {
-				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-			}
-
-			return event;
-		}
-	},
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// Create a writable copy of the event object and normalize some properties
-		var i, prop,
-			originalEvent = event,
-			fixHook = jQuery.event.fixHooks[ event.type ] || {},
-			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-		event = jQuery.Event( originalEvent );
-
-		for ( i = copy.length; i; ) {
-			prop = copy[ --i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-		if ( !event.target ) {
-			event.target = originalEvent.srcElement || document;
-		}
-
-		// Target should not be a text node (#504, Safari)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
-		if ( event.metaKey === undefined ) {
-			event.metaKey = event.ctrlKey;
-		}
-
-		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-	},
-
-	special: {
-		ready: {
-			// Make sure the ready event is setup
-			setup: jQuery.bindReady
-		},
-
-		load: {
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-
-		focus: {
-			delegateType: "focusin"
-		},
-		blur: {
-			delegateType: "focusout"
-		},
-
-		beforeunload: {
-			setup: function( data, namespaces, eventHandle ) {
-				// We only want to do this special case on windows
-				if ( jQuery.isWindow( this ) ) {
-					this.onbeforeunload = eventHandle;
-				}
-			},
-
-			teardown: function( namespaces, eventHandle ) {
-				if ( this.onbeforeunload === eventHandle ) {
-					this.onbeforeunload = null;
-				}
-			}
-		}
-	},
-
-	simulate: function( type, elem, event, bubble ) {
-		// Piggyback on a donor event to simulate a different one.
-		// Fake originalEvent to avoid donor's stopPropagation, but if the
-		// simulated event prevents default then we do the same on the donor.
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{ type: type,
-				isSimulated: true,
-				originalEvent: {}
-			}
-		);
-		if ( bubble ) {
-			jQuery.event.trigger( e, null, elem );
-		} else {
-			jQuery.event.dispatch.call( elem, e );
-		}
-		if ( e.isDefaultPrevented() ) {
-			event.preventDefault();
-		}
-	}
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
-	function( elem, type, handle ) {
-		if ( elem.removeEventListener ) {
-			elem.removeEventListener( type, handle, false );
-		}
-	} :
-	function( elem, type, handle ) {
-		if ( elem.detachEvent ) {
-			elem.detachEvent( "on" + type, handle );
-		}
-	};
-
-jQuery.Event = function( src, props ) {
-	// Allow instantiation without the 'new' keyword
-	if ( !(this instanceof jQuery.Event) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
-	return false;
-}
-function returnTrue() {
-	return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	preventDefault: function() {
-		this.isDefaultPrevented = returnTrue;
-
-		var e = this.originalEvent;
-		if ( !e ) {
-			return;
-		}
-
-		// if preventDefault exists run it on the original event
-		if ( e.preventDefault ) {
-			e.preventDefault();
-
-		// otherwise set the returnValue property of the original event to false (IE)
-		} else {
-			e.returnValue = false;
-		}
-	},
-	stopPropagation: function() {
-		this.isPropagationStopped = returnTrue;
-
-		var e = this.originalEvent;
-		if ( !e ) {
-			return;
-		}
-		// if stopPropagation exists run it on the original event
-		if ( e.stopPropagation ) {
-			e.stopPropagation();
-		}
-		// otherwise set the cancelBubble property of the original event to true (IE)
-		e.cancelBubble = true;
-	},
-	stopImmediatePropagation: function() {
-		this.isImmediatePropagationStopped = returnTrue;
-		this.stopPropagation();
-	},
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-	mouseenter: "mouseover",
-	mouseleave: "mouseout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj,
-				selector = handleObj.selector,
-				ret;
-
-			// For mousenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
-	jQuery.event.special.submit = {
-		setup: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Lazy-add a submit handler when a descendant form may potentially be submitted
-			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-				// Node name check avoids a VML-related crash in IE (#9807)
-				var elem = e.target,
-					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-				if ( form && !form._submit_attached ) {
-					jQuery.event.add( form, "submit._submit", function( event ) {
-						// If form was submitted by the user, bubble the event up the tree
-						if ( this.parentNode && !event.isTrigger ) {
-							jQuery.event.simulate( "submit", this.parentNode, event, true );
-						}
-					});
-					form._submit_attached = true;
-				}
-			});
-			// return undefined since we don't need an event listener
-		},
-
-		teardown: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-			jQuery.event.remove( this, "._submit" );
-		}
-	};
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
-	jQuery.event.special.change = {
-
-		setup: function() {
-
-			if ( rformElems.test( this.nodeName ) ) {
-				// IE doesn't fire change on a check/radio until blur; trigger it on click
-				// after a propertychange. Eat the blur-change in special.change.handle.
-				// This still fires onchange a second time for check/radio after blur.
-				if ( this.type === "checkbox" || this.type === "radio" ) {
-					jQuery.event.add( this, "propertychange._change", function( event ) {
-						if ( event.originalEvent.propertyName === "checked" ) {
-							this._just_changed = true;
-						}
-					});
-					jQuery.event.add( this, "click._change", function( event ) {
-						if ( this._just_changed && !event.isTrigger ) {
-							this._just_changed = false;
-							jQuery.event.simulate( "change", this, event, true );
-						}
-					});
-				}
-				return false;
-			}
-			// Delegated event; lazy-add a change handler on descendant inputs
-			jQuery.event.add( this, "beforeactivate._change", function( e ) {
-				var elem = e.target;
-
-				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
-					jQuery.event.add( elem, "change._change", function( event ) {
-						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-							jQuery.event.simulate( "change", this.parentNode, event, true );
-						}
-					});
-					elem._change_attached = true;
-				}
-			});
-		},
-
-		handle: function( event ) {
-			var elem = event.target;
-
-			// Swallow native change events from checkbox/radio, we already triggered them above
-			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-				return event.handleObj.handler.apply( this, arguments );
-			}
-		},
-
-		teardown: function() {
-			jQuery.event.remove( this, "._change" );
-
-			return rformElems.test( this.nodeName );
-		}
-	};
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler while someone wants focusin/focusout
-		var attaches = 0,
-			handler = function( event ) {
-				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-			};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				if ( attaches++ === 0 ) {
-					document.addEventListener( orig, handler, true );
-				}
-			},
-			teardown: function() {
-				if ( --attaches === 0 ) {
-					document.removeEventListener( orig, handler, true );
-				}
-			}
-		};
-	});
-}
-
-jQuery.fn.extend({
-
-	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-		var origFn, type;
-
-		// Types can be a map of types/handlers
-		if ( typeof types === "object" ) {
-			// ( types-Object, selector, data )
-			if ( typeof selector !== "string" ) {
-				// ( types-Object, data )
-				data = selector;
-				selector = undefined;
-			}
-			for ( type in types ) {
-				this.on( type, selector, data, types[ type ], one );
-			}
-			return this;
-		}
-
-		if ( data == null && fn == null ) {
-			// ( types, fn )
-			fn = selector;
-			data = selector = undefined;
-		} else if ( fn == null ) {
-			if ( typeof selector === "string" ) {
-				// ( types, selector, fn )
-				fn = data;
-				data = undefined;
-			} else {
-				// ( types, data, fn )
-				fn = data;
-				data = selector;
-				selector = undefined;
-			}
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		} else if ( !fn ) {
-			return this;
-		}
-
-		if ( one === 1 ) {
-			origFn = fn;
-			fn = function( event ) {
-				// Can use an empty set, since event contains the info
-				jQuery().off( event );
-				return origFn.apply( this, arguments );
-			};
-			// Use same guid so caller can remove using origFn
-			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-		}
-		return this.each( function() {
-			jQuery.event.add( this, types, fn, data, selector );
-		});
-	},
-	one: function( types, selector, data, fn ) {
-		return this.on.call( this, types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		if ( types && types.preventDefault && types.handleObj ) {
-			// ( event )  dispatched jQuery.Event
-			var handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-			// ( types-object [, selector] )
-			for ( var type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each(function() {
-			jQuery.event.remove( this, types, fn, selector );
-		});
-	},
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	live: function( types, data, fn ) {
-		jQuery( this.context ).on( types, this.selector, data, fn );
-		return this;
-	},
-	die: function( types, fn ) {
-		jQuery( this.context ).off( types, this.selector || "**", fn );
-		return this;
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
-	},
-
-	trigger: function( type, data ) {
-		return this.each(function() {
-			jQuery.event.trigger( type, data, this );
-		});
-	},
-	triggerHandler: function( type, data ) {
-		if ( this[0] ) {
-			return jQuery.event.trigger( type, data, this[0], true );
-		}
-	},
-
-	toggle: function( fn ) {
-		// Save reference to arguments for access in closure
-		var args = arguments,
-			guid = fn.guid || jQuery.guid++,
-			i = 0,
-			toggler = function( event ) {
-				// Figure out which function to execute
-				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-				// Make sure that clicks stop
-				event.preventDefault();
-
-				// and execute the function
-				return args[ lastToggle ].apply( this, arguments ) || false;
-			};
-
-		// link all the functions, so any of them can unbind this click handler
-		toggler.guid = guid;
-		while ( i < args.length ) {
-			args[ i++ ].guid = guid;
-		}
-
-		return this.click( toggler );
-	},
-
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-});
-
-jQuery.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( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		if ( fn == null ) {
-			fn = data;
-			data = null;
-		}
-
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-
-	if ( jQuery.attrFn ) {
-		jQuery.attrFn[ name ] = true;
-	}
-
-	if ( rkeyEvent.test( name ) ) {
-		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-	}
-
-	if ( rmouseEvent.test( name ) ) {
-		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-	}
-});
-
-
-
-/*!
- * Sizzle CSS Selector Engine
- *  Copyright 2011, The Dojo Foundation
- *  Released under the MIT, BSD, and GPL Licenses.
- *  More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-	expando = "sizcache" + (Math.random() + '').replace('.', ''),
-	done = 0,
-	toString = Object.prototype.toString,
-	hasDuplicate = false,
-	baseHasDuplicate = true,
-	rBackslash = /\\/g,
-	rReturn = /\r\n/g,
-	rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-//   Thus far that includes Google Chrome.
-[0, 0].sort(function() {
-	baseHasDuplicate = false;
-	return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
-	results = results || [];
-	context = context || document;
-
-	var origContext = context;
-
-	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
-		return [];
-	}
-	
-	if ( !selector || typeof selector !== "string" ) {
-		return results;
-	}
-
-	var m, set, checkSet, extra, ret, cur, pop, i,
-		prune = true,
-		contextXML = Sizzle.isXML( context ),
-		parts = [],
-		soFar = selector;
-	
-	// Reset the position of the chunker regexp (start from head)
-	do {
-		chunker.exec( "" );
-		m = chunker.exec( soFar );
-
-		if ( m ) {
-			soFar = m[3];
-		
-			parts.push( m[1] );
-		
-			if ( m[2] ) {
-				extra = m[3];
-				break;
-			}
-		}
-	} while ( m );
-
-	if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
-		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
-			set = posProcess( parts[0] + parts[1], context, seed );
-
-		} else {
-			set = Expr.relative[ parts[0] ] ?
-				[ context ] :
-				Sizzle( parts.shift(), context );
-
-			while ( parts.length ) {
-				selector = parts.shift();
-
-				if ( Expr.relative[ selector ] ) {
-					selector += parts.shift();
-				}
-				
-				set = posProcess( selector, set, seed );
-			}
-		}
-
-	} else {
-		// Take a shortcut and set the context if the root selector is an ID
-		// (but not if it'll be faster if the inner selector is an ID)
-		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
-				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
-			ret = Sizzle.find( parts.shift(), context, contextXML );
-			context = ret.expr ?
-				Sizzle.filter( ret.expr, ret.set )[0] :
-				ret.set[0];
-		}
-
-		if ( context ) {
-			ret = seed ?
-				{ expr: parts.pop(), set: makeArray(seed) } :
-				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
-			set = ret.expr ?
-				Sizzle.filter( ret.expr, ret.set ) :
-				ret.set;
-
-			if ( parts.length > 0 ) {
-				checkSet = makeArray( set );
-
-			} else {
-				prune = false;
-			}
-
-			while ( parts.length ) {
-				cur = parts.pop();
-				pop = cur;
-
-				if ( !Expr.relative[ cur ] ) {
-					cur = "";
-				} else {
-					pop = parts.pop();
-				}
-
-				if ( pop == null ) {
-					pop = context;
-				}
-
-				Expr.relative[ cur ]( checkSet, pop, contextXML );
-			}
-
-		} else {
-			checkSet = parts = [];
-		}
-	}
-
-	if ( !checkSet ) {
-		checkSet = set;
-	}
-
-	if ( !checkSet ) {
-		Sizzle.error( cur || selector );
-	}
-
-	if ( toString.call(checkSet) === "[object Array]" ) {
-		if ( !prune ) {
-			results.push.apply( results, checkSet );
-
-		} else if ( context && context.nodeType === 1 ) {
-			for ( i = 0; checkSet[i] != null; i++ ) {
-				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
-					results.push( set[i] );
-				}
-			}
-
-		} else {
-			for ( i = 0; checkSet[i] != null; i++ ) {
-				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
-					results.push( set[i] );
-				}
-			}
-		}
-
-	} else {
-		makeArray( checkSet, results );
-	}
-
-	if ( extra ) {
-		Sizzle( extra, origContext, results, seed );
-		Sizzle.uniqueSort( results );
-	}
-
-	return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
-	if ( sortOrder ) {
-		hasDuplicate = baseHasDuplicate;
-		results.sort( sortOrder );
-
-		if ( hasDuplicate ) {
-			for ( var i = 1; i < results.length; i++ ) {
-				if ( results[i] === results[ i - 1 ] ) {
-					results.splice( i--, 1 );
-				}
-			}
-		}
-	}
-
-	return results;
-};
-
-Sizzle.matches = function( expr, set ) {
-	return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
-	return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
-	var set, i, len, match, type, left;
-
-	if ( !expr ) {
-		return [];
-	}
-
-	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
-		type = Expr.order[i];
-		
-		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
-			left = match[1];
-			match.splice( 1, 1 );
-
-			if ( left.substr( left.length - 1 ) !== "\\" ) {
-				match[1] = (match[1] || "").replace( rBackslash, "" );
-				set = Expr.find[ type ]( match, context, isXML );
-
-				if ( set != null ) {
-					expr = expr.replace( Expr.match[ type ], "" );
-					break;
-				}
-			}
-		}
-	}
-
-	if ( !set ) {
-		set = typeof context.getElementsByTagName !== "undefined" ?
-			context.getElementsByTagName( "*" ) :
-			[];
-	}
-
-	return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
-	var match, anyFound,
-		type, found, item, filter, left,
-		i, pass,
-		old = expr,
-		result = [],
-		curLoop = set,
-		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
-	while ( expr && set.length ) {
-		for ( type in Expr.filter ) {
-			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
-				filter = Expr.filter[ type ];
-				left = match[1];
-
-				anyFound = false;
-
-				match.splice(1,1);
-
-				if ( left.substr( left.length - 1 ) === "\\" ) {
-					continue;
-				}
-
-				if ( curLoop === result ) {
-					result = [];
-				}
-
-				if ( Expr.preFilter[ type ] ) {
-					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
-					if ( !match ) {
-						anyFound = found = true;
-
-					} else if ( match === true ) {
-						continue;
-					}
-				}
-
-				if ( match ) {
-					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
-						if ( item ) {
-							found = filter( item, match, i, curLoop );
-							pass = not ^ found;
-
-							if ( inplace && found != null ) {
-								if ( pass ) {
-									anyFound = true;
-
-								} else {
-									curLoop[i] = false;
-								}
-
-							} else if ( pass ) {
-								result.push( item );
-								anyFound = true;
-							}
-						}
-					}
-				}
-
-				if ( found !== undefined ) {
-					if ( !inplace ) {
-						curLoop = result;
-					}
-
-					expr = expr.replace( Expr.match[ type ], "" );
-
-					if ( !anyFound ) {
-						return [];
-					}
-
-					break;
-				}
-			}
-		}
-
-		// Improper expression
-		if ( expr === old ) {
-			if ( anyFound == null ) {
-				Sizzle.error( expr );
-
-			} else {
-				break;
-			}
-		}
-
-		old = expr;
-	}
-
-	return curLoop;
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
-    var i, node,
-		nodeType = elem.nodeType,
-		ret = "";
-
-	if ( nodeType ) {
-		if ( nodeType === 1 || nodeType === 9 ) {
-			// Use textContent || innerText for elements
-			if ( typeof elem.textContent === 'string' ) {
-				return elem.textContent;
-			} else if ( typeof elem.innerText === 'string' ) {
-				// Replace IE's carriage returns
-				return elem.innerText.replace( rReturn, '' );
-			} else {
-				// Traverse it's children
-				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
-					ret += getText( elem );
-				}
-			}
-		} else if ( nodeType === 3 || nodeType === 4 ) {
-			return elem.nodeValue;
-		}
-	} else {
-
-		// If no nodeType, this is expected to be an array
-		for ( i = 0; (node = elem[i]); i++ ) {
-			// Do not traverse comment nodes
-			if ( node.nodeType !== 8 ) {
-				ret += getText( node );
-			}
-		}
-	}
-	return ret;
-};
-
-var Expr = Sizzle.selectors = {
-	order: [ "ID", "NAME", "TAG" ],
-
-	match: {
-		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
-		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
-		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
-		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
-		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
-		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
-	},
-
-	leftMatch: {},
-
-	attrMap: {
-		"class": "className",
-		"for": "htmlFor"
-	},
-
-	attrHandle: {
-		href: function( elem ) {
-			return elem.getAttribute( "href" );
-		},
-		type: function( elem ) {
-			return elem.getAttribute( "type" );
-		}
-	},
-
-	relative: {
-		"+": function(checkSet, part){
-			var isPartStr = typeof part === "string",
-				isTag = isPartStr && !rNonWord.test( part ),
-				isPartStrNotTag = isPartStr && !isTag;
-
-			if ( isTag ) {
-				part = part.toLowerCase();
-			}
-
-			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
-				if ( (elem = checkSet[i]) ) {
-					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
-					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
-						elem || false :
-						elem === part;
-				}
-			}
-
-			if ( isPartStrNotTag ) {
-				Sizzle.filter( part, checkSet, true );
-			}
-		},
-
-		">": function( checkSet, part ) {
-			var elem,
-				isPartStr = typeof part === "string",
-				i = 0,
-				l = checkSet.length;
-
-			if ( isPartStr && !rNonWord.test( part ) ) {
-				part = part.toLowerCase();
-
-				for ( ; i < l; i++ ) {
-					elem = checkSet[i];
-
-					if ( elem ) {
-						var parent = elem.parentNode;
-						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
-					}
-				}
-
-			} else {
-				for ( ; i < l; i++ ) {
-					elem = checkSet[i];
-
-					if ( elem ) {
-						checkSet[i] = isPartStr ?
-							elem.parentNode :
-							elem.parentNode === part;
-					}
-				}
-
-				if ( isPartStr ) {
-					Sizzle.filter( part, checkSet, true );
-				}
-			}
-		},
-
-		"": function(checkSet, part, isXML){
-			var nodeCheck,
-				doneName = done++,
-				checkFn = dirCheck;
-
-			if ( typeof part === "string" && !rNonWord.test( part ) ) {
-				part = part.toLowerCase();
-				nodeCheck = part;
-				checkFn = dirNodeCheck;
-			}
-
-			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
-		},
-
-		"~": function( checkSet, part, isXML ) {
-			var nodeCheck,
-				doneName = done++,
-				checkFn = dirCheck;
-
-			if ( typeof part === "string" && !rNonWord.test( part ) ) {
-				part = part.toLowerCase();
-				nodeCheck = part;
-				checkFn = dirNodeCheck;
-			}
-
-			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
-		}
-	},
-
-	find: {
-		ID: function( match, context, isXML ) {
-			if ( typeof context.getElementById !== "undefined" && !isXML ) {
-				var m = context.getElementById(match[1]);
-				// Check parentNode to catch when Blackberry 4.6 returns
-				// nodes that are no longer in the document #6963
-				return m && m.parentNode ? [m] : [];
-			}
-		},
-
-		NAME: function( match, context ) {
-			if ( typeof context.getElementsByName !== "undefined" ) {
-				var ret = [],
-					results = context.getElementsByName( match[1] );
-
-				for ( var i = 0, l = results.length; i < l; i++ ) {
-					if ( results[i].getAttribute("name") === match[1] ) {
-						ret.push( results[i] );
-					}
-				}
-
-				return ret.length === 0 ? null : ret;
-			}
-		},
-
-		TAG: function( match, context ) {
-			if ( typeof context.getElementsByTagName !== "undefined" ) {
-				return context.getElementsByTagName( match[1] );
-			}
-		}
-	},
-	preFilter: {
-		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
-			match = " " + match[1].replace( rBackslash, "" ) + " ";
-
-			if ( isXML ) {
-				return match;
-			}
-
-			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-				if ( elem ) {
-					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
-						if ( !inplace ) {
-							result.push( elem );
-						}
-
-					} else if ( inplace ) {
-						curLoop[i] = false;
-					}
-				}
-			}
-
-			return false;
-		},
-
-		ID: function( match ) {
-			return match[1].replace( rBackslash, "" );
-		},
-
-		TAG: function( match, curLoop ) {
-			return match[1].replace( rBackslash, "" ).toLowerCase();
-		},
-
-		CHILD: function( match ) {
-			if ( match[1] === "nth" ) {
-				if ( !match[2] ) {
-					Sizzle.error( match[0] );
-				}
-
-				match[2] = match[2].replace(/^\+|\s*/g, '');
-
-				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
-					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
-					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
-				// calculate the numbers (first)n+(last) including if they are negative
-				match[2] = (test[1] + (test[2] || 1)) - 0;
-				match[3] = test[3] - 0;
-			}
-			else if ( match[2] ) {
-				Sizzle.error( match[0] );
-			}
-
-			// TODO: Move to normal caching system
-			match[0] = done++;
-
-			return match;
-		},
-
-		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
-			var name = match[1] = match[1].replace( rBackslash, "" );
-			
-			if ( !isXML && Expr.attrMap[name] ) {
-				match[1] = Expr.attrMap[name];
-			}
-
-			// Handle if an un-quoted value was used
-			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
-			if ( match[2] === "~=" ) {
-				match[4] = " " + match[4] + " ";
-			}
-
-			return match;
-		},
-
-		PSEUDO: function( match, curLoop, inplace, result, not ) {
-			if ( match[1] === "not" ) {
-				// If we're dealing with a complex expression, or a simple one
-				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
-					match[3] = Sizzle(match[3], null, null, curLoop);
-
-				} else {
-					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
-					if ( !inplace ) {
-						result.push.apply( result, ret );
-					}
-
-					return false;
-				}
-
-			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
-				return true;
-			}
-			
-			return match;
-		},
-
-		POS: function( match ) {
-			match.unshift( true );
-
-			return match;
-		}
-	},
-	
-	filters: {
-		enabled: function( elem ) {
-			return elem.disabled === false && elem.type !== "hidden";
-		},
-
-		disabled: function( elem ) {
-			return elem.disabled === true;
-		},
-
-		checked: function( elem ) {
-			return elem.checked === true;
-		},
-		
-		selected: function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-			
-			return elem.selected === true;
-		},
-
-		parent: function( elem ) {
-			return !!elem.firstChild;
-		},
-
-		empty: function( elem ) {
-			return !elem.firstChild;
-		},
-
-		has: function( elem, i, match ) {
-			return !!Sizzle( match[3], elem ).length;
-		},
-
-		header: function( elem ) {
-			return (/h\d/i).test( elem.nodeName );
-		},
-
-		text: function( elem ) {
-			var attr = elem.getAttribute( "type" ), type = elem.type;
-			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
-			// use getAttribute instead to test this case
-			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
-		},
-
-		radio: function( elem ) {
-			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
-		},
-
-		checkbox: function( elem ) {
-			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
-		},
-
-		file: function( elem ) {
-			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
-		},
-
-		password: function( elem ) {
-			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
-		},
-
-		submit: function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return (name === "input" || name === "button") && "submit" === elem.type;
-		},
-
-		image: function( elem ) {
-			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
-		},
-
-		reset: function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return (name === "input" || name === "button") && "reset" === elem.type;
-		},
-
-		button: function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && "button" === elem.type || name === "button";
-		},
-
-		input: function( elem ) {
-			return (/input|select|textarea|button/i).test( elem.nodeName );
-		},
-
-		focus: function( elem ) {
-			return elem === elem.ownerDocument.activeElement;
-		}
-	},
-	setFilters: {
-		first: function( elem, i ) {
-			return i === 0;
-		},
-
-		last: function( elem, i, match, array ) {
-			return i === array.length - 1;
-		},
-
-		even: function( elem, i ) {
-			return i % 2 === 0;
-		},
-
-		odd: function( elem, i ) {
-			return i % 2 === 1;
-		},
-
-		lt: function( elem, i, match ) {
-			return i < match[3] - 0;
-		},
-
-		gt: function( elem, i, match ) {
-			return i > match[3] - 0;
-		},
-
-		nth: function( elem, i, match ) {
-			return match[3] - 0 === i;
-		},
-
-		eq: function( elem, i, match ) {
-			return match[3] - 0 === i;
-		}
-	},
-	filter: {
-		PSEUDO: function( elem, match, i, array ) {
-			var name = match[1],
-				filter = Expr.filters[ name ];
-
-			if ( filter ) {
-				return filter( elem, i, match, array );
-
-			} else if ( name === "contains" ) {
-				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
-			} else if ( name === "not" ) {
-				var not = match[3];
-
-				for ( var j = 0, l = not.length; j < l; j++ ) {
-					if ( not[j] === elem ) {
-						return false;
-					}
-				}
-
-				return true;
-
-			} else {
-				Sizzle.error( name );
-			}
-		},
-
-		CHILD: function( elem, match ) {
-			var first, last,
-				doneName, parent, cache,
-				count, diff,
-				type = match[1],
-				node = elem;
-
-			switch ( type ) {
-				case "only":
-				case "first":
-					while ( (node = node.previousSibling) )	 {
-						if ( node.nodeType === 1 ) { 
-							return false; 
-						}
-					}
-
-					if ( type === "first" ) { 
-						return true; 
-					}
-
-					node = elem;
-
-				case "last":
-					while ( (node = node.nextSibling) )	 {
-						if ( node.nodeType === 1 ) { 
-							return false; 
-						}
-					}
-
-					return true;
-
-				case "nth":
-					first = match[2];
-					last = match[3];
-
-					if ( first === 1 && last === 0 ) {
-						return true;
-					}
-					
-					doneName = match[0];
-					parent = elem.parentNode;
-	
-					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
-						count = 0;
-						
-						for ( node = parent.firstChild; node; node = node.nextSibling ) {
-							if ( node.nodeType === 1 ) {
-								node.nodeIndex = ++count;
-							}
-						} 
-
-						parent[ expando ] = doneName;
-					}
-					
-					diff = elem.nodeIndex - last;
-
-					if ( first === 0 ) {
-						return diff === 0;
-
-					} else {
-						return ( diff % first === 0 && diff / first >= 0 );
-					}
-			}
-		},
-
-		ID: function( elem, match ) {
-			return elem.nodeType === 1 && elem.getAttribute("id") === match;
-		},
-
-		TAG: function( elem, match ) {
-			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
-		},
-		
-		CLASS: function( elem, match ) {
-			return (" " + (elem.className || elem.getAttribute("class")) + " ")
-				.indexOf( match ) > -1;
-		},
-
-		ATTR: function( elem, match ) {
-			var name = match[1],
-				result = Sizzle.attr ?
-					Sizzle.attr( elem, name ) :
-					Expr.attrHandle[ name ] ?
-					Expr.attrHandle[ name ]( elem ) :
-					elem[ name ] != null ?
-						elem[ name ] :
-						elem.getAttribute( name ),
-				value = result + "",
-				type = match[2],
-				check = match[4];
-
-			return result == null ?
-				type === "!=" :
-				!type && Sizzle.attr ?
-				result != null :
-				type === "=" ?
-				value === check :
-				type === "*=" ?
-				value.indexOf(check) >= 0 :
-				type === "~=" ?
-				(" " + value + " ").indexOf(check) >= 0 :
-				!check ?
-				value && result !== false :
-				type === "!=" ?
-				value !== check :
-				type === "^=" ?
-				value.indexOf(check) === 0 :
-				type === "$=" ?
-				value.substr(value.length - check.length) === check :
-				type === "|=" ?
-				value === check || value.substr(0, check.length + 1) === check + "-" :
-				false;
-		},
-
-		POS: function( elem, match, i, array ) {
-			var name = match[2],
-				filter = Expr.setFilters[ name ];
-
-			if ( filter ) {
-				return filter( elem, i, match, array );
-			}
-		}
-	}
-};
-
-var origPOS = Expr.match.POS,
-	fescape = function(all, num){
-		return "\\" + (num - 0 + 1);
-	};
-
-for ( var type in Expr.match ) {
-	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
-	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-
-var makeArray = function( array, results ) {
-	array = Array.prototype.slice.call( array, 0 );
-
-	if ( results ) {
-		results.push.apply( results, array );
-		return results;
-	}
-	
-	return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
-	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
-	makeArray = function( array, results ) {
-		var i = 0,
-			ret = results || [];
-
-		if ( toString.call(array) === "[object Array]" ) {
-			Array.prototype.push.apply( ret, array );
-
-		} else {
-			if ( typeof array.length === "number" ) {
-				for ( var l = array.length; i < l; i++ ) {
-					ret.push( array[i] );
-				}
-
-			} else {
-				for ( ; array[i]; i++ ) {
-					ret.push( array[i] );
-				}
-			}
-		}
-
-		return ret;
-	};
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
-			return a.compareDocumentPosition ? -1 : 1;
-		}
-
-		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
-	};
-
-} else {
-	sortOrder = function( a, b ) {
-		// The nodes are identical, we can exit early
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-
-		// Fallback to using sourceIndex (in IE) if it's available on both nodes
-		} else if ( a.sourceIndex && b.sourceIndex ) {
-			return a.sourceIndex - b.sourceIndex;
-		}
-
-		var al, bl,
-			ap = [],
-			bp = [],
-			aup = a.parentNode,
-			bup = b.parentNode,
-			cur = aup;
-
-		// If the nodes are siblings (or identical) we can do a quick check
-		if ( aup === bup ) {
-			return siblingCheck( a, b );
-
-		// If no parents were found then the nodes are disconnected
-		} else if ( !aup ) {
-			return -1;
-
-		} else if ( !bup ) {
-			return 1;
-		}
-
-		// Otherwise they're somewhere else in the tree so we need
-		// to build up a full list of the parentNodes for comparison
-		while ( cur ) {
-			ap.unshift( cur );
-			cur = cur.parentNode;
-		}
-
-		cur = bup;
-
-		while ( cur ) {
-			bp.unshift( cur );
-			cur = cur.parentNode;
-		}
-
-		al = ap.length;
-		bl = bp.length;
-
-		// Start walking down the tree looking for a discrepancy
-		for ( var i = 0; i < al && i < bl; i++ ) {
-			if ( ap[i] !== bp[i] ) {
-				return siblingCheck( ap[i], bp[i] );
-			}
-		}
-
-		// We ended someplace up the tree so do a sibling check
-		return i === al ?
-			siblingCheck( a, bp[i], -1 ) :
-			siblingCheck( ap[i], b, 1 );
-	};
-
-	siblingCheck = function( a, b, ret ) {
-		if ( a === b ) {
-			return ret;
-		}
-
-		var cur = a.nextSibling;
-
-		while ( cur ) {
-			if ( cur === b ) {
-				return -1;
-			}
-
-			cur = cur.nextSibling;
-		}
-
-		return 1;
-	};
-}
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
-	// We're going to inject a fake input element with a specified name
-	var form = document.createElement("div"),
-		id = "script" + (new Date()).getTime(),
-		root = document.documentElement;
-
-	form.innerHTML = "<a name='" + id + "'/>";
-
-	// Inject it into the root element, check its status, and remove it quickly
-	root.insertBefore( form, root.firstChild );
-
-	// The workaround has to do additional checks after a getElementById
-	// Which slows things down for other browsers (hence the branching)
-	if ( document.getElementById( id ) ) {
-		Expr.find.ID = function( match, context, isXML ) {
-			if ( typeof context.getElementById !== "undefined" && !isXML ) {
-				var m = context.getElementById(match[1]);
-
-				return m ?
-					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
-						[m] :
-						undefined :
-					[];
-			}
-		};
-
-		Expr.filter.ID = function( elem, match ) {
-			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
-			return elem.nodeType === 1 && node && node.nodeValue === match;
-		};
-	}
-
-	root.removeChild( form );
-
-	// release memory in IE
-	root = form = null;
-})();
-
-(function(){
-	// Check to see if the browser returns only elements
-	// when doing getElementsByTagName("*")
-
-	// Create a fake element
-	var div = document.createElement("div");
-	div.appendChild( document.createComment("") );
-
-	// Make sure no comments are found
-	if ( div.getElementsByTagName("*").length > 0 ) {
-		Expr.find.TAG = function( match, context ) {
-			var results = context.getElementsByTagName( match[1] );
-
-			// Filter out possible comments
-			if ( match[1] === "*" ) {
-				var tmp = [];
-
-				for ( var i = 0; results[i]; i++ ) {
-					if ( results[i].nodeType === 1 ) {
-						tmp.push( results[i] );
-					}
-				}
-
-				results = tmp;
-			}
-
-			return results;
-		};
-	}
-
-	// Check to see if an attribute returns normalized href attributes
-	div.innerHTML = "<a href='#'></a>";
-
-	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
-			div.firstChild.getAttribute("href") !== "#" ) {
-
-		Expr.attrHandle.href = function( elem ) {
-			return elem.getAttribute( "href", 2 );
-		};
-	}
-
-	// release memory in IE
-	div = null;
-})();
-
-if ( document.querySelectorAll ) {
-	(function(){
-		var oldSizzle = Sizzle,
-			div = document.createElement("div"),
-			id = "__sizzle__";
-
-		div.innerHTML = "<p class='TEST'></p>";
-
-		// Safari can't handle uppercase or unicode characters when
-		// in quirks mode.
-		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
-			return;
-		}
-	
-		Sizzle = function( query, context, extra, seed ) {
-			context = context || document;
-
-			// Only use querySelectorAll on non-XML documents
-			// (ID selectors don't work in non-HTML documents)
-			if ( !seed && !Sizzle.isXML(context) ) {
-				// See if we find a selector to speed up
-				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-				
-				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
-					// Speed-up: Sizzle("TAG")
-					if ( match[1] ) {
-						return makeArray( context.getElementsByTagName( query ), extra );
-					
-					// Speed-up: Sizzle(".CLASS")
-					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
-						return makeArray( context.getElementsByClassName( match[2] ), extra );
-					}
-				}
-				
-				if ( context.nodeType === 9 ) {
-					// Speed-up: Sizzle("body")
-					// The body element only exists once, optimize finding it
-					if ( query === "body" && context.body ) {
-						return makeArray( [ context.body ], extra );
-						
-					// Speed-up: Sizzle("#ID")
-					} else if ( match && match[3] ) {
-						var elem = context.getElementById( match[3] );
-
-						// Check parentNode to catch when Blackberry 4.6 returns
-						// nodes that are no longer in the document #6963
-						if ( elem && elem.parentNode ) {
-							// Handle the case where IE and Opera return items
-							// by name instead of ID
-							if ( elem.id === match[3] ) {
-								return makeArray( [ elem ], extra );
-							}
-							
-						} else {
-							return makeArray( [], extra );
-						}
-					}
-					
-					try {
-						return makeArray( context.querySelectorAll(query), extra );
-					} catch(qsaError) {}
-
-				// qSA works strangely on Element-rooted queries
-				// We can work around this by specifying an extra ID on the root
-				// and working up from there (Thanks to Andrew Dupont for the technique)
-				// IE 8 doesn't work on object elements
-				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-					var oldContext = context,
-						old = context.getAttribute( "id" ),
-						nid = old || id,
-						hasParent = context.parentNode,
-						relativeHierarchySelector = /^\s*[+~]/.test( query );
-
-					if ( !old ) {
-						context.setAttribute( "id", nid );
-					} else {
-						nid = nid.replace( /'/g, "\\$&" );
-					}
-					if ( relativeHierarchySelector && hasParent ) {
-						context = context.parentNode;
-					}
-
-					try {
-						if ( !relativeHierarchySelector || hasParent ) {
-							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
-						}
-
-					} catch(pseudoError) {
-					} finally {
-						if ( !old ) {
-							oldContext.removeAttribute( "id" );
-						}
-					}
-				}
-			}
-		
-			return oldSizzle(query, context, extra, seed);
-		};
-
-		for ( var prop in oldSizzle ) {
-			Sizzle[ prop ] = oldSizzle[ prop ];
-		}
-
-		// release memory in IE
-		div = null;
-	})();
-}
-
-(function(){
-	var html = document.documentElement,
-		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
-	if ( matches ) {
-		// Check to see if it's possible to do matchesSelector
-		// on a disconnected node (IE 9 fails this)
-		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
-			pseudoWorks = false;
-
-		try {
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( document.documentElement, "[test!='']:sizzle" );
-	
-		} catch( pseudoError ) {
-			pseudoWorks = true;
-		}
-
-		Sizzle.matchesSelector = function( node, expr ) {
-			// Make sure that attribute selectors are quoted
-			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
-			if ( !Sizzle.isXML( node ) ) {
-				try { 
-					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
-						var ret = matches.call( node, expr );
-
-						// IE 9's matchesSelector returns false on disconnected nodes
-						if ( ret || !disconnectedMatch ||
-								// As well, disconnected nodes are said to be in a document
-								// fragment in IE 9, so check for that
-								node.document && node.document.nodeType !== 11 ) {
-							return ret;
-						}
-					}
-				} catch(e) {}
-			}
-
-			return Sizzle(expr, null, null, [node]).length > 0;
-		};
-	}
-})();
-
-(function(){
-	var div = document.createElement("div");
-
-	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
-	// Opera can't find a second classname (in 9.6)
-	// Also, make sure that getElementsByClassName actually exists
-	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
-		return;
-	}
-
-	// Safari caches class attributes, doesn't catch changes (in 3.2)
-	div.lastChild.className = "e";
-
-	if ( div.getElementsByClassName("e").length === 1 ) {
-		return;
-	}
-	
-	Expr.order.splice(1, 0, "CLASS");
-	Expr.find.CLASS = function( match, context, isXML ) {
-		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
-			return context.getElementsByClassName(match[1]);
-		}
-	};
-
-	// release memory in IE
-	div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-		var elem = checkSet[i];
-
-		if ( elem ) {
-			var match = false;
-
-			elem = elem[dir];
-
-			while ( elem ) {
-				if ( elem[ expando ] === doneName ) {
-					match = checkSet[elem.sizset];
-					break;
-				}
-
-				if ( elem.nodeType === 1 && !isXML ){
-					elem[ expando ] = doneName;
-					elem.sizset = i;
-				}
-
-				if ( elem.nodeName.toLowerCase() === cur ) {
-					match = elem;
-					break;
-				}
-
-				elem = elem[dir];
-			}
-
-			checkSet[i] = match;
-		}
-	}
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-		var elem = checkSet[i];
-
-		if ( elem ) {
-			var match = false;
-			
-			elem = elem[dir];
-
-			while ( elem ) {
-				if ( elem[ expando ] === doneName ) {
-					match = checkSet[elem.sizset];
-					break;
-				}
-
-				if ( elem.nodeType === 1 ) {
-					if ( !isXML ) {
-						elem[ expando ] = doneName;
-						elem.sizset = i;
-					}
-
-					if ( typeof cur !== "string" ) {
-						if ( elem === cur ) {
-							match = true;
-							break;
-						}
-
-					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
-						match = elem;
-						break;
-					}
-				}
-
-				elem = elem[dir];
-			}
-
-			checkSet[i] = match;
-		}
-	}
-}
-
-if ( document.documentElement.contains ) {
-	Sizzle.contains = function( a, b ) {
-		return a !== b && (a.contains ? a.contains(b) : true);
-	};
-
-} else if ( document.documentElement.compareDocumentPosition ) {
-	Sizzle.contains = function( a, b ) {
-		return !!(a.compareDocumentPosition(b) & 16);
-	};
-
-} else {
-	Sizzle.contains = function() {
-		return false;
-	};
-}
-
-Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833) 
-	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context, seed ) {
-	var match,
-		tmpSet = [],
-		later = "",
-		root = context.nodeType ? [context] : context;
-
-	// Position selectors must be done after the filter
-	// And so must :not(positional) so we move all PSEUDOs to the end
-	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
-		later += match[0];
-		selector = selector.replace( Expr.match.PSEUDO, "" );
-	}
-
-	selector = Expr.relative[selector] ? selector + "*" : selector;
-
-	for ( var i = 0, l = root.length; i < l; i++ ) {
-		Sizzle( selector, root[i], tmpSet, seed );
-	}
-
-	return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-Sizzle.selectors.attrMap = {};
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
-	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
-	// Note: This RegExp should be improved, or likely pulled from Sizzle
-	rmultiselector = /,/,
-	isSimple = /^.[^:#\[\.,]*$/,
-	slice = Array.prototype.slice,
-	POS = jQuery.expr.match.POS,
-	// methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend({
-	find: function( selector ) {
-		var self = this,
-			i, l;
-
-		if ( typeof selector !== "string" ) {
-			return jQuery( selector ).filter(function() {
-				for ( i = 0, l = self.length; i < l; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			});
-		}
-
-		var ret = this.pushStack( "", "find", selector ),
-			length, n, r;
-
-		for ( i = 0, l = this.length; i < l; i++ ) {
-			length = ret.length;
-			jQuery.find( selector, this[i], ret );
-
-			if ( i > 0 ) {
-				// Make sure that the results are unique
-				for ( n = length; n < ret.length; n++ ) {
-					for ( r = 0; r < length; r++ ) {
-						if ( ret[r] === ret[n] ) {
-							ret.splice(n--, 1);
-							break;
-						}
-					}
-				}
-			}
-		}
-
-		return ret;
-	},
-
-	has: function( target ) {
-		var targets = jQuery( target );
-		return this.filter(function() {
-			for ( var i = 0, l = targets.length; i < l; i++ ) {
-				if ( jQuery.contains( this, targets[i] ) ) {
-					return true;
-				}
-			}
-		});
-	},
-
-	not: function( selector ) {
-		return this.pushStack( winnow(this, selector, false), "not", selector);
-	},
-
-	filter: function( selector ) {
-		return this.pushStack( winnow(this, selector, true), "filter", selector );
-	},
-
-	is: function( selector ) {
-		return !!selector && ( 
-			typeof selector === "string" ?
-				// If this is a positional selector, check membership in the returned set
-				// so $("p:first").is("p:last") won't return true for a doc with two "p".
-				POS.test( selector ) ? 
-					jQuery( selector, this.context ).index( this[0] ) >= 0 :
-					jQuery.filter( selector, this ).length > 0 :
-				this.filter( selector ).length > 0 );
-	},
-
-	closest: function( selectors, context ) {
-		var ret = [], i, l, cur = this[0];
-		
-		// Array (deprecated as of jQuery 1.7)
-		if ( jQuery.isArray( selectors ) ) {
-			var level = 1;
-
-			while ( cur && cur.ownerDocument && cur !== context ) {
-				for ( i = 0; i < selectors.length; i++ ) {
-
-					if ( jQuery( cur ).is( selectors[ i ] ) ) {
-						ret.push({ selector: selectors[ i ], elem: cur, level: level });
-					}
-				}
-
-				cur = cur.parentNode;
-				level++;
-			}
-
-			return ret;
-		}
-
-		// String
-		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
-				jQuery( selectors, context || this.context ) :
-				0;
-
-		for ( i = 0, l = this.length; i < l; i++ ) {
-			cur = this[i];
-
-			while ( cur ) {
-				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-					ret.push( cur );
-					break;
-
-				} else {
-					cur = cur.parentNode;
-					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
-						break;
-					}
-				}
-			}
-		}
-
-		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
-		return this.pushStack( ret, "closest", selectors );
-	},
-
-	// Determine the position of an element within
-	// the matched set of elements
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-		}
-
-		// index in selector
-		if ( typeof elem === "string" ) {
-			return jQuery.inArray( this[0], jQuery( elem ) );
-		}
-
-		// Locate the position of the desired element
-		return jQuery.inArray(
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[0] : elem, this );
-	},
-
-	add: function( selector, context ) {
-		var set = typeof selector === "string" ?
-				jQuery( selector, context ) :
-				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-			all = jQuery.merge( this.get(), set );
-
-		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-			all :
-			jQuery.unique( all ) );
-	},
-
-	andSelf: function() {
-		return this.add( this.prevObject );
-	}
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
-	return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return jQuery.dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return jQuery.nth( elem, 2, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return jQuery.nth( elem, 2, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return jQuery.dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return jQuery.dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return jQuery.sibling( elem.parentNode.firstChild, elem );
-	},
-	children: function( elem ) {
-		return jQuery.sibling( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return jQuery.nodeName( elem, "iframe" ) ?
-			elem.contentDocument || elem.contentWindow.document :
-			jQuery.makeArray( elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var ret = jQuery.map( this, fn, until );
-
-		if ( !runtil.test( name ) ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			ret = jQuery.filter( selector, ret );
-		}
-
-		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
-		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
-			ret = ret.reverse();
-		}
-
-		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
-	};
-});
-
-jQuery.extend({
-	filter: function( expr, elems, not ) {
-		if ( not ) {
-			expr = ":not(" + expr + ")";
-		}
-
-		return elems.length === 1 ?
-			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-			jQuery.find.matches(expr, elems);
-	},
-
-	dir: function( elem, dir, until ) {
-		var matched = [],
-			cur = elem[ dir ];
-
-		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-			if ( cur.nodeType === 1 ) {
-				matched.push( cur );
-			}
-			cur = cur[dir];
-		}
-		return matched;
-	},
-
-	nth: function( cur, result, dir, elem ) {
-		result = result || 1;
-		var num = 0;
-
-		for ( ; cur; cur = cur[dir] ) {
-			if ( cur.nodeType === 1 && ++num === result ) {
-				break;
-			}
-		}
-
-		return cur;
-	},
-
-	sibling: function( n, elem ) {
-		var r = [];
-
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType === 1 && n !== elem ) {
-				r.push( n );
-			}
-		}
-
-		return r;
-	}
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
-	// Can't pass null or undefined to indexOf in Firefox 4
-	// Set to 0 to skip string check
-	qualifier = qualifier || 0;
-
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			var retVal = !!qualifier.call( elem, i, elem );
-			return retVal === keep;
-		});
-
-	} else if ( qualifier.nodeType ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			return ( elem === qualifier ) === keep;
-		});
-
-	} else if ( typeof qualifier === "string" ) {
-		var filtered = jQuery.grep(elements, function( elem ) {
-			return elem.nodeType === 1;
-		});
-
-		if ( isSimple.test( qualifier ) ) {
-			return jQuery.filter(qualifier, filtered, !keep);
-		} else {
-			qualifier = jQuery.filter( qualifier, filtered );
-		}
-	}
-
-	return jQuery.grep(elements, function( elem, i ) {
-		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-	});
-}
-
-
-
-
-function createSafeFragment( document ) {
-	var list = nodeNames.split( "|" ),
-	safeFrag = document.createDocumentFragment();
-
-	if ( safeFrag.createElement ) {
-		while ( list.length ) {
-			safeFrag.createElement(
-				list.pop()
-			);
-		}
-	}
-	return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
-		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
-	rleadingWhitespace = /^\s+/,
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
-	rtagName = /<([\w:]+)/,
-	rtbody = /<tbody/i,
-	rhtml = /<|&#?\w+;/,
-	rnoInnerhtml = /<(?:script|style)/i,
-	rnocache = /<(?:script|object|embed|option|style)/i,
-	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptType = /\/(java|ecma)script/i,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
-	wrapMap = {
-		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, "", "" ]
-	},
-	safeFragment = createSafeFragment( document );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize <link> and <script> tags normally
-if ( !jQuery.support.htmlSerialize ) {
-	wrapMap._default = [ 1, "div<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
-	text: function( text ) {
-		if ( jQuery.isFunction(text) ) {
-			return this.each(function(i) {
-				var self = jQuery( this );
-
-				self.text( text.call(this, i, self.text()) );
-			});
-		}
-
-		if ( typeof text !== "object" && text !== undefined ) {
-			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-		}
-
-		return jQuery.text( this );
-	},
-
-	wrapAll: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapAll( html.call(this, i) );
-			});
-		}
-
-		if ( this[0] ) {
-			// The elements to wrap the target around
-			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
-			if ( this[0].parentNode ) {
-				wrap.insertBefore( this[0] );
-			}
-
-			wrap.map(function() {
-				var elem = this;
-
-				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-					elem = elem.firstChild;
-				}
-
-				return elem;
-			}).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapInner( html.call(this, i) );
-			});
-		}
-
-		return this.each(function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		});
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each(function(i) {
-			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-		});
-	},
-
-	unwrap: function() {
-		return this.parent().each(function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		}).end();
-	},
-
-	append: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 ) {
-				this.appendChild( elem );
-			}
-		});
-	},
-
-	prepend: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 ) {
-				this.insertBefore( elem, this.firstChild );
-			}
-		});
-	},
-
-	before: function() {
-		if ( this[0] && this[0].parentNode ) {
-			return this.domManip(arguments, false, function( elem ) {
-				this.parentNode.insertBefore( elem, this );
-			});
-		} else if ( arguments.length ) {
-			var set = jQuery.clean( arguments );
-			set.push.apply( set, this.toArray() );
-			return this.pushStack( set, "before", arguments );
-		}
-	},
-
-	after: function() {
-		if ( this[0] && this[0].parentNode ) {
-			return this.domManip(arguments, false, function( elem ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			});
-		} else if ( arguments.length ) {
-			var set = this.pushStack( this, "after", arguments );
-			set.push.apply( set, jQuery.clean(arguments) );
-			return set;
-		}
-	},
-
-	// keepData is for internal use only--do not document
-	remove: function( selector, keepData ) {
-		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-				if ( !keepData && elem.nodeType === 1 ) {
-					jQuery.cleanData( elem.getElementsByTagName("*") );
-					jQuery.cleanData( [ elem ] );
-				}
-
-				if ( elem.parentNode ) {
-					elem.parentNode.removeChild( elem );
-				}
-			}
-		}
-
-		return this;
-	},
-
-	empty: function() {
-		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-			// Remove element nodes and prevent memory leaks
-			if ( elem.nodeType === 1 ) {
-				jQuery.cleanData( elem.getElementsByTagName("*") );
-			}
-
-			// Remove any remaining nodes
-			while ( elem.firstChild ) {
-				elem.removeChild( elem.firstChild );
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function () {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		});
-	},
-
-	html: function( value ) {
-		if ( value === undefined ) {
-			return this[0] && this[0].nodeType === 1 ?
-				this[0].innerHTML.replace(rinlinejQuery, "") :
-				null;
-
-		// See if we can take a shortcut and just use innerHTML
-		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
-			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
-
-			value = value.replace(rxhtmlTag, "<$1></$2>");
-
-			try {
-				for ( var i = 0, l = this.length; i < l; i++ ) {
-					// Remove element nodes and prevent memory leaks
-					if ( this[i].nodeType === 1 ) {
-						jQuery.cleanData( this[i].getElementsByTagName("*") );
-						this[i].innerHTML = value;
-					}
-				}
-
-			// If using innerHTML throws an exception, use the fallback method
-			} catch(e) {
-				this.empty().append( value );
-			}
-
-		} else if ( jQuery.isFunction( value ) ) {
-			this.each(function(i){
-				var self = jQuery( this );
-
-				self.html( value.call(this, i, self.html()) );
-			});
-
-		} else {
-			this.empty().append( value );
-		}
-
-		return this;
-	},
-
-	replaceWith: function( value ) {
-		if ( this[0] && this[0].parentNode ) {
-			// Make sure that the elements are removed from the DOM before they are inserted
-			// this can help fix replacing a parent with child elements
-			if ( jQuery.isFunction( value ) ) {
-				return this.each(function(i) {
-					var self = jQuery(this), old = self.html();
-					self.replaceWith( value.call( this, i, old ) );
-				});
-			}
-
-			if ( typeof value !== "string" ) {
-				value = jQuery( value ).detach();
-			}
-
-			return this.each(function() {
-				var next = this.nextSibling,
-					parent = this.parentNode;
-
-				jQuery( this ).remove();
-
-				if ( next ) {
-					jQuery(next).before( value );
-				} else {
-					jQuery(parent).append( value );
-				}
-			});
-		} else {
-			return this.length ?
-				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-				this;
-		}
-	},
-
-	detach: function( selector ) {
-		return this.remove( selector, true );
-	},
-
-	domManip: function( args, table, callback ) {
-		var results, first, fragment, parent,
-			value = args[0],
-			scripts = [];
-
-		// We can't cloneNode fragments that contain checked, in WebKit
-		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
-			return this.each(function() {
-				jQuery(this).domManip( args, table, callback, true );
-			});
-		}
-
-		if ( jQuery.isFunction(value) ) {
-			return this.each(function(i) {
-				var self = jQuery(this);
-				args[0] = value.call(this, i, table ? self.html() : undefined);
-				self.domManip( args, table, callback );
-			});
-		}
-
-		if ( this[0] ) {
-			parent = value && value.parentNode;
-
-			// If we're in a fragment, just use that instead of building a new one
-			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
-				results = { fragment: parent };
-
-			} else {
-				results = jQuery.buildFragment( args, this, scripts );
-			}
-
-			fragment = results.fragment;
-
-			if ( fragment.childNodes.length === 1 ) {
-				first = fragment = fragment.firstChild;
-			} else {
-				first = fragment.firstChild;
-			}
-
-			if ( first ) {
-				table = table && jQuery.nodeName( first, "tr" );
-
-				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
-					callback.call(
-						table ?
-							root(this[i], first) :
-							this[i],
-						// Make sure that we do not leak memory by inadvertently discarding
-						// the original fragment (which might have attached data) instead of
-						// using it; in addition, use the original fragment object for the last
-						// item instead of first because it can end up being emptied incorrectly
-						// in certain situations (Bug #8070).
-						// Fragments from the fragment cache must always be cloned and never used
-						// in place.
-						results.cacheable || ( l > 1 && i < lastIndex ) ?
-							jQuery.clone( fragment, true, true ) :
-							fragment
-					);
-				}
-			}
-
-			if ( scripts.length ) {
-				jQuery.each( scripts, evalScript );
-			}
-		}
-
-		return this;
-	}
-});
-
-function root( elem, cur ) {
-	return jQuery.nodeName(elem, "table") ?
-		(elem.getElementsByTagName("tbody")[0] ||
-		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-		elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-
-	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-		return;
-	}
-
-	var type, i, l,
-		oldData = jQuery._data( src ),
-		curData = jQuery._data( dest, oldData ),
-		events = oldData.events;
-
-	if ( events ) {
-		delete curData.handle;
-		curData.events = {};
-
-		for ( type in events ) {
-			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
-			}
-		}
-	}
-
-	// make the cloned public data object a copy from the original
-	if ( curData.data ) {
-		curData.data = jQuery.extend( {}, curData.data );
-	}
-}
-
-function cloneFixAttributes( src, dest ) {
-	var nodeName;
-
-	// We do not need to do anything for non-Elements
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	// clearAttributes removes the attributes, which we don't want,
-	// but also removes the attachEvent events, which we *do* want
-	if ( dest.clearAttributes ) {
-		dest.clearAttributes();
-	}
-
-	// mergeAttributes, in contrast, only merges back on the
-	// original attributes, not the events
-	if ( dest.mergeAttributes ) {
-		dest.mergeAttributes( src );
-	}
-
-	nodeName = dest.nodeName.toLowerCase();
-
-	// IE6-8 fail to clone children inside object elements that use
-	// the proprietary classid attribute value (rather than the type
-	// attribute) to identify the type of content to display
-	if ( nodeName === "object" ) {
-		dest.outerHTML = src.outerHTML;
-
-	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
-		// IE6-8 fails to persist the checked state of a cloned checkbox
-		// or radio button. Worse, IE6-7 fail to give the cloned element
-		// a checked appearance if the defaultChecked value isn't also set
-		if ( src.checked ) {
-			dest.defaultChecked = dest.checked = src.checked;
-		}
-
-		// IE6-7 get confused and end up setting the value of a cloned
-		// checkbox/radio button to an empty string instead of "on"
-		if ( dest.value !== src.value ) {
-			dest.value = src.value;
-		}
-
-	// IE6-8 fails to return the selected option to the default selected
-	// state when cloning options
-	} else if ( nodeName === "option" ) {
-		dest.selected = src.defaultSelected;
-
-	// IE6-8 fails to set the defaultValue to the correct value when
-	// cloning other types of input fields
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-
-	// Event data gets referenced instead of copied if the expando
-	// gets copied too
-	dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, nodes, scripts ) {
-	var fragment, cacheable, cacheresults, doc,
-	first = args[ 0 ];
-
-	// nodes may contain either an explicit document object,
-	// a jQuery collection or context object.
-	// If nodes[0] contains a valid object to assign to doc
-	if ( nodes && nodes[0] ) {
-		doc = nodes[0].ownerDocument || nodes[0];
-	}
-
-	// Ensure that an attr object doesn't incorrectly stand in as a document object
-	// Chrome and Firefox seem to allow this to occur and will throw exception
-	// Fixes #8950
-	if ( !doc.createDocumentFragment ) {
-		doc = document;
-	}
-
-	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-	// Cloning options loses the selected state, so don't cache them
-	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
-		first.charAt(0) === "<" && !rnocache.test( first ) &&
-		(jQuery.support.checkClone || !rchecked.test( first )) &&
-		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
-		cacheable = true;
-
-		cacheresults = jQuery.fragments[ first ];
-		if ( cacheresults && cacheresults !== 1 ) {
-			fragment = cacheresults;
-		}
-	}
-
-	if ( !fragment ) {
-		fragment = doc.createDocumentFragment();
-		jQuery.clean( args, doc, fragment, scripts );
-	}
-
-	if ( cacheable ) {
-		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
-	}
-
-	return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var ret = [],
-			insert = jQuery( selector ),
-			parent = this.length === 1 && this[0].parentNode;
-
-		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
-			insert[ original ]( this[0] );
-			return this;
-
-		} else {
-			for ( var i = 0, l = insert.length; i < l; i++ ) {
-				var elems = ( i > 0 ? this.clone(true) : this ).get();
-				jQuery( insert[i] )[ original ]( elems );
-				ret = ret.concat( elems );
-			}
-
-			return this.pushStack( ret, name, insert.selector );
-		}
-	};
-});
-
-function getAll( elem ) {
-	if ( typeof elem.getElementsByTagName !== "undefined" ) {
-		return elem.getElementsByTagName( "*" );
-
-	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
-		return elem.querySelectorAll( "*" );
-
-	} else {
-		return [];
-	}
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-	if ( elem.type === "checkbox" || elem.type === "radio" ) {
-		elem.defaultChecked = elem.checked;
-	}
-}
-// Finds all inputs and passes them to fixDefaultChecked
-function findInputs( elem ) {
-	var nodeName = ( elem.nodeName || "" ).toLowerCase();
-	if ( nodeName === "input" ) {
-		fixDefaultChecked( elem );
-	// Skip scripts, get other children
-	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
-		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
-	}
-}
-
-// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
-function shimCloneNode( elem ) {
-	var div = document.createElement( "div" );
-	safeFragment.appendChild( div );
-
-	div.innerHTML = elem.outerHTML;
-	return div.firstChild;
-}
-
-jQuery.extend({
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var srcElements,
-			destElements,
-			i,
-			// IE<=8 does not properly clone detached, unknown element nodes
-			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
-				elem.cloneNode( true ) :
-				shimCloneNode( elem );
-
-		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-			// IE copies events bound via attachEvent when using cloneNode.
-			// Calling detachEvent on the clone will also remove the events
-			// from the original. In order to get around this, we use some
-			// proprietary methods to clear the events. Thanks to MooTools
-			// guys for this hotness.
-
-			cloneFixAttributes( elem, clone );
-
-			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-			srcElements = getAll( elem );
-			destElements = getAll( clone );
-
-			// Weird iteration because IE will replace the length property
-			// with an element if you are cloning the body and one of the
-			// elements on the page has a name or id of "length"
-			for ( i = 0; srcElements[i]; ++i ) {
-				// Ensure that the destination node is not null; Fixes #9587
-				if ( destElements[i] ) {
-					cloneFixAttributes( srcElements[i], destElements[i] );
-				}
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			cloneCopyEvent( elem, clone );
-
-			if ( deepDataAndEvents ) {
-				srcElements = getAll( elem );
-				destElements = getAll( clone );
-
-				for ( i = 0; srcElements[i]; ++i ) {
-					cloneCopyEvent( srcElements[i], destElements[i] );
-				}
-			}
-		}
-
-		srcElements = destElements = null;
-
-		// Return the cloned set
-		return clone;
-	},
-
-	clean: function( elems, context, fragment, scripts ) {
-		var checkScriptType;
-
-		context = context || document;
-
-		// !context.createElement fails in IE with an error but returns typeof 'object'
-		if ( typeof context.createElement === "undefined" ) {
-			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
-		}
-
-		var ret = [], j;
-
-		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-			if ( typeof elem === "number" ) {
-				elem += "";
-			}
-
-			if ( !elem ) {
-				continue;
-			}
-
-			// Convert html string into DOM nodes
-			if ( typeof elem === "string" ) {
-				if ( !rhtml.test( elem ) ) {
-					elem = context.createTextNode( elem );
-				} else {
-					// Fix "XHTML"-style tags in all browsers
-					elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
-					// Trim whitespace, otherwise indexOf won't work as expected
-					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
-						wrap = wrapMap[ tag ] || wrapMap._default,
-						depth = wrap[0],
-						div = context.createElement("div");
-
-					// Append wrapper element to unknown element safe doc fragment
-					if ( context === document ) {
-						// Use the fragment we've already created for this document
-						safeFragment.appendChild( div );
-					} else {
-						// Use a fragment created with the owner document
-						createSafeFragment( context ).appendChild( div );
-					}
-
-					// Go to html and back, then peel off extra wrappers
-					div.innerHTML = wrap[1] + elem + wrap[2];
-
-					// Move to the right depth
-					while ( depth-- ) {
-						div = div.lastChild;
-					}
-
-					// Remove IE's autoinserted <tbody> from table fragments
-					if ( !jQuery.support.tbody ) {
-
-						// String was a <table>, *may* have spurious <tbody>
-						var hasBody = rtbody.test(elem),
-							tbody = tag === "table" && !hasBody ?
-								div.firstChild && div.firstChild.childNodes :
-
-								// String was a bare <thead> or <tfoot>
-								wrap[1] === "<table>" && !hasBody ?
-									div.childNodes :
-									[];
-
-						for ( j = tbody.length - 1; j >= 0 ; --j ) {
-							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-								tbody[ j ].parentNode.removeChild( tbody[ j ] );
-							}
-						}
-					}
-
-					// IE completely kills leading whitespace when innerHTML is used
-					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-					}
-
-					elem = div.childNodes;
-				}
-			}
-
-			// Resets defaultChecked for any radios and checkboxes
-			// about to be appended to the DOM in IE 6/7 (#8060)
-			var len;
-			if ( !jQuery.support.appendChecked ) {
-				if ( elem[0] && typeof (len = elem.length) === "number" ) {
-					for ( j = 0; j < len; j++ ) {
-						findInputs( elem[j] );
-					}
-				} else {
-					findInputs( elem );
-				}
-			}
-
-			if ( elem.nodeType ) {
-				ret.push( elem );
-			} else {
-				ret = jQuery.merge( ret, elem );
-			}
-		}
-
-		if ( fragment ) {
-			checkScriptType = function( elem ) {
-				return !elem.type || rscriptType.test( elem.type );
-			};
-			for ( i = 0; ret[i]; i++ ) {
-				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
-					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
-
-				} else {
-					if ( ret[i].nodeType === 1 ) {
-						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
-
-						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-					}
-					fragment.appendChild( ret[i] );
-				}
-			}
-		}
-
-		return ret;
-	},
-
-	cleanData: function( elems ) {
-		var data, id,
-			cache = jQuery.cache,
-			special = jQuery.event.special,
-			deleteExpando = jQuery.support.deleteExpando;
-
-		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
-				continue;
-			}
-
-			id = elem[ jQuery.expando ];
-
-			if ( id ) {
-				data = cache[ id ];
-
-				if ( data && data.events ) {
-					for ( var type in data.events ) {
-						if ( special[ type ] ) {
-							jQuery.event.remove( elem, type );
-
-						// This is a shortcut to avoid jQuery.event.remove's overhead
-						} else {
-							jQuery.removeEvent( elem, type, data.handle );
-						}
-					}
-
-					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
-					if ( data.handle ) {
-						data.handle.elem = null;
-					}
-				}
-
-				if ( deleteExpando ) {
-					delete elem[ jQuery.expando ];
-
-				} else if ( elem.removeAttribute ) {
-					elem.removeAttribute( jQuery.expando );
-				}
-
-				delete cache[ id ];
-			}
-		}
-	}
-});
-
-function evalScript( i, elem ) {
-	if ( elem.src ) {
-		jQuery.ajax({
-			url: elem.src,
-			async: false,
-			dataType: "script"
-		});
-	} else {
-		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
-	}
-
-	if ( elem.parentNode ) {
-		elem.parentNode.removeChild( elem );
-	}
-}
-
-
-
-
-var ralpha = /alpha\([^)]*\)/i,
-	ropacity = /opacity=([^)]*)/,
-	// fixed for IE9, see #8346
-	rupper = /([A-Z]|^ms)/g,
-	rnumpx = /^-?\d+(?:px)?$/i,
-	rnum = /^-?\d/,
-	rrelNum = /^([\-+])=([\-+.\de]+)/,
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssWidth = [ "Left", "Right" ],
-	cssHeight = [ "Top", "Bottom" ],
-	curCSS,
-
-	getComputedStyle,
-	currentStyle;
-
-jQuery.fn.css = function( name, value ) {
-	// Setting 'undefined' is a no-op
-	if ( arguments.length === 2 && value === undefined ) {
-		return this;
-	}
-
-	return jQuery.access( this, name, value, true, function( elem, name, value ) {
-		return value !== undefined ?
-			jQuery.style( elem, name, value ) :
-			jQuery.css( elem, name );
-	});
-};
-
-jQuery.extend({
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity", "opacity" );
-					return ret === "" ? "1" : ret;
-
-				} else {
-					return elem.style.opacity;
-				}
-			}
-		}
-	},
-
-	// Exclude the following css properties to add px
-	cssNumber: {
-		"fillOpacity": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		// normalize float css property
-		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, origName = jQuery.camelCase( name ),
-			style = elem.style, hooks = jQuery.cssHooks[ origName ];
-
-		name = jQuery.cssProps[ origName ] || origName;
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// convert relative number strings (+= or -=) to relative numbers. #7345
-			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that NaN and null values aren't set. See: #7116
-			if ( value == null || type === "number" && isNaN( value ) ) {
-				return;
-			}
-
-			// If a number was passed in, add 'px' to the (except for certain CSS properties)
-			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-				value += "px";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
-				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-				// Fixes bug #5509
-				try {
-					style[ name ] = value;
-				} catch(e) {}
-			}
-
-		} else {
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra ) {
-		var ret, hooks;
-
-		// Make sure that we're working with the right name
-		name = jQuery.camelCase( name );
-		hooks = jQuery.cssHooks[ name ];
-		name = jQuery.cssProps[ name ] || name;
-
-		// cssFloat needs a special treatment
-		if ( name === "cssFloat" ) {
-			name = "float";
-		}
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
-			return ret;
-
-		// Otherwise, if a way to get the computed value exists, use that
-		} else if ( curCSS ) {
-			return curCSS( elem, name );
-		}
-	},
-
-	// A method for quickly swapping in/out CSS properties to get correct calculations
-	swap: function( elem, options, callback ) {
-		var old = {};
-
-		// Remember the old values, and insert the new ones
-		for ( var name in options ) {
-			old[ name ] = elem.style[ name ];
-			elem.style[ name ] = options[ name ];
-		}
-
-		callback.call( elem );
-
-		// Revert the old values
-		for ( name in options ) {
-			elem.style[ name ] = old[ name ];
-		}
-	}
-});
-
-// DEPRECATED, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-jQuery.each(["height", "width"], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			var val;
-
-			if ( computed ) {
-				if ( elem.offsetWidth !== 0 ) {
-					return getWH( elem, name, extra );
-				} else {
-					jQuery.swap( elem, cssShow, function() {
-						val = getWH( elem, name, extra );
-					});
-				}
-
-				return val;
-			}
-		},
-
-		set: function( elem, value ) {
-			if ( rnumpx.test( value ) ) {
-				// ignore negative width and height values #1599
-				value = parseFloat( value );
-
-				if ( value >= 0 ) {
-					return value + "px";
-				}
-
-			} else {
-				return value;
-			}
-		}
-	};
-});
-
-if ( !jQuery.support.opacity ) {
-	jQuery.cssHooks.opacity = {
-		get: function( elem, computed ) {
-			// IE uses filters for opacity
-			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-				( parseFloat( RegExp.$1 ) / 100 ) + "" :
-				computed ? "1" : "";
-		},
-
-		set: function( elem, value ) {
-			var style = elem.style,
-				currentStyle = elem.currentStyle,
-				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-				filter = currentStyle && currentStyle.filter || style.filter || "";
-
-			// IE has trouble with opacity if it does not have layout
-			// Force it by setting the zoom level
-			style.zoom = 1;
-
-			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
-
-				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-				// if "filter:" is present at all, clearType is disabled, we want to avoid this
-				// style.removeAttribute is IE Only, but so apparently is this code path...
-				style.removeAttribute( "filter" );
-
-				// if there there is no filter style applied in a css rule, we are done
-				if ( currentStyle && !currentStyle.filter ) {
-					return;
-				}
-			}
-
-			// otherwise, set new filter values
-			style.filter = ralpha.test( filter ) ?
-				filter.replace( ralpha, opacity ) :
-				filter + " " + opacity;
-		}
-	};
-}
-
-jQuery(function() {
-	// This hook cannot be added until DOM ready because the support test
-	// for it is not run until after DOM ready
-	if ( !jQuery.support.reliableMarginRight ) {
-		jQuery.cssHooks.marginRight = {
-			get: function( elem, computed ) {
-				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-				// Work around by temporarily setting element display to inline-block
-				var ret;
-				jQuery.swap( elem, { "display": "inline-block" }, function() {
-					if ( computed ) {
-						ret = curCSS( elem, "margin-right", "marginRight" );
-					} else {
-						ret = elem.style.marginRight;
-					}
-				});
-				return ret;
-			}
-		};
-	}
-});
-
-if ( document.defaultView && document.defaultView.getComputedStyle ) {
-	getComputedStyle = function( elem, name ) {
-		var ret, defaultView, computedStyle;
-
-		name = name.replace( rupper, "-$1" ).toLowerCase();
-
-		if ( (defaultView = elem.ownerDocument.defaultView) &&
-				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
-			ret = computedStyle.getPropertyValue( name );
-			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-				ret = jQuery.style( elem, name );
-			}
-		}
-
-		return ret;
-	};
-}
-
-if ( document.documentElement.currentStyle ) {
-	currentStyle = function( elem, name ) {
-		var left, rsLeft, uncomputed,
-			ret = elem.currentStyle && elem.currentStyle[ name ],
-			style = elem.style;
-
-		// Avoid setting ret to empty string here
-		// so we don't default to auto
-		if ( ret === null && style && (uncomputed = style[ name ]) ) {
-			ret = uncomputed;
-		}
-
-		// From the awesome hack by Dean Edwards
-		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-		// If we're not dealing with a regular pixel number
-		// but a number that has a weird ending, we need to convert it to pixels
-		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
-
-			// Remember the original values
-			left = style.left;
-			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-
-			// Put in the new values to get a computed value out
-			if ( rsLeft ) {
-				elem.runtimeStyle.left = elem.currentStyle.left;
-			}
-			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
-			ret = style.pixelLeft + "px";
-
-			// Revert the changed values
-			style.left = left;
-			if ( rsLeft ) {
-				elem.runtimeStyle.left = rsLeft;
-			}
-		}
-
-		return ret === "" ? "auto" : ret;
-	};
-}
-
-curCSS = getComputedStyle || currentStyle;
-
-function getWH( elem, name, extra ) {
-
-	// Start with offset property
-	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-		which = name === "width" ? cssWidth : cssHeight,
-		i = 0,
-		len = which.length;
-
-	if ( val > 0 ) {
-		if ( extra !== "border" ) {
-			for ( ; i < len; i++ ) {
-				if ( !extra ) {
-					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
-				}
-				if ( extra === "margin" ) {
-					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
-				} else {
-					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
-				}
-			}
-		}
-
-		return val + "px";
-	}
-
-	// Fall back to computed then uncomputed css if necessary
-	val = curCSS( elem, name, name );
-	if ( val < 0 || val == null ) {
-		val = elem.style[ name ] || 0;
-	}
-	// Normalize "", auto, and prepare for extra
-	val = parseFloat( val ) || 0;
-
-	// Add padding, border, margin
-	if ( extra ) {
-		for ( ; i < len; i++ ) {
-			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
-			if ( extra !== "padding" ) {
-				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
-			}
-			if ( extra === "margin" ) {
-				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
-			}
-		}
-	}
-
-	return val + "px";
-}
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.hidden = function( elem ) {
-		var width = elem.offsetWidth,
-			height = elem.offsetHeight;
-
-		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
-	};
-
-	jQuery.expr.filters.visible = function( elem ) {
-		return !jQuery.expr.filters.hidden( elem );
-	};
-}
-
-
-
-
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rhash = /#.*$/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-	rquery = /\?/,
-	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-	rselectTextarea = /^(?:select|textarea)/i,
-	rspacesAjax = /\s+/,
-	rts = /([?&])_=[^&]*/,
-	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
-
-	// Keep a copy of the old load method
-	_load = jQuery.fn.load,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Document location
-	ajaxLocation,
-
-	// Document location segments
-	ajaxLocParts,
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = ["*/"] + ["*"];
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-	ajaxLocation = location.href;
-} catch( e ) {
-	// Use the href attribute of an A element
-	// since IE will modify it given document.location
-	ajaxLocation = document.createElement( "a" );
-	ajaxLocation.href = "";
-	ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		if ( jQuery.isFunction( func ) ) {
-			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
-				i = 0,
-				length = dataTypes.length,
-				dataType,
-				list,
-				placeBefore;
-
-			// For each dataType in the dataTypeExpression
-			for ( ; i < length; i++ ) {
-				dataType = dataTypes[ i ];
-				// We control if we're asked to add before
-				// any existing element
-				placeBefore = /^\+/.test( dataType );
-				if ( placeBefore ) {
-					dataType = dataType.substr( 1 ) || "*";
-				}
-				list = structure[ dataType ] = structure[ dataType ] || [];
-				// then we add to the structure accordingly
-				list[ placeBefore ? "unshift" : "push" ]( func );
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-		dataType /* internal */, inspected /* internal */ ) {
-
-	dataType = dataType || options.dataTypes[ 0 ];
-	inspected = inspected || {};
-
-	inspected[ dataType ] = true;
-
-	var list = structure[ dataType ],
-		i = 0,
-		length = list ? list.length : 0,
-		executeOnly = ( structure === prefilters ),
-		selection;
-
-	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-		selection = list[ i ]( options, originalOptions, jqXHR );
-		// If we got redirected to another dataType
-		// we try there if executing only and not done already
-		if ( typeof selection === "string" ) {
-			if ( !executeOnly || inspected[ selection ] ) {
-				selection = undefined;
-			} else {
-				options.dataTypes.unshift( selection );
-				selection = inspectPrefiltersOrTransports(
-						structure, options, originalOptions, jqXHR, selection, inspected );
-			}
-		}
-	}
-	// If we're only executing or nothing was selected
-	// we try the catchall dataType if not done already
-	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-		selection = inspectPrefiltersOrTransports(
-				structure, options, originalOptions, jqXHR, "*", inspected );
-	}
-	// unnecessary when only executing (prefilters)
-	// but it'll be ignored by the caller in that case
-	return selection;
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var key, deep,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-}
-
-jQuery.fn.extend({
-	load: function( url, params, callback ) {
-		if ( typeof url !== "string" && _load ) {
-			return _load.apply( this, arguments );
-
-		// Don't do a request if no elements are being requested
-		} else if ( !this.length ) {
-			return this;
-		}
-
-		var off = url.indexOf( " " );
-		if ( off >= 0 ) {
-			var selector = url.slice( off, url.length );
-			url = url.slice( 0, off );
-		}
-
-		// Default to a GET request
-		var type = "GET";
-
-		// If the second parameter was provided
-		if ( params ) {
-			// If it's a function
-			if ( jQuery.isFunction( params ) ) {
-				// We assume that it's the callback
-				callback = params;
-				params = undefined;
-
-			// Otherwise, build a param string
-			} else if ( typeof params === "object" ) {
-				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
-				type = "POST";
-			}
-		}
-
-		var self = this;
-
-		// Request the remote document
-		jQuery.ajax({
-			url: url,
-			type: type,
-			dataType: "html",
-			data: params,
-			// Complete callback (responseText is used internally)
-			complete: function( jqXHR, status, responseText ) {
-				// Store the response as specified by the jqXHR object
-				responseText = jqXHR.responseText;
-				// If successful, inject the HTML into all the matched elements
-				if ( jqXHR.isResolved() ) {
-					// #4825: Get the actual response in case
-					// a dataFilter is present in ajaxSettings
-					jqXHR.done(function( r ) {
-						responseText = r;
-					});
-					// See if a selector was specified
-					self.html( selector ?
-						// Create a dummy div to hold the results
-						jQuery("<div>")
-							// inject the contents of the document in, removing the scripts
-							// to avoid any 'Permission Denied' errors in IE
-							.append(responseText.replace(rscript, ""))
-
-							// Locate the specified elements
-							.find(selector) :
-
-						// If not, just inject the full result
-						responseText );
-				}
-
-				if ( callback ) {
-					self.each( callback, [ responseText, status, jqXHR ] );
-				}
-			}
-		});
-
-		return this;
-	},
-
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-
-	serializeArray: function() {
-		return this.map(function(){
-			return this.elements ? jQuery.makeArray( this.elements ) : this;
-		})
-		.filter(function(){
-			return this.name && !this.disabled &&
-				( this.checked || rselectTextarea.test( this.nodeName ) ||
-					rinput.test( this.type ) );
-		})
-		.map(function( i, elem ){
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val, i ){
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					}) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		}).get();
-	}
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-	jQuery.fn[ o ] = function( f ){
-		return this.on( o, f );
-	};
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-		// shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		return jQuery.ajax({
-			type: method,
-			url: url,
-			data: data,
-			success: callback,
-			dataType: type
-		});
-	};
-});
-
-jQuery.extend({
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		if ( settings ) {
-			// Building a settings object
-			ajaxExtend( target, jQuery.ajaxSettings );
-		} else {
-			// Extending ajaxSettings
-			settings = target;
-			target = jQuery.ajaxSettings;
-		}
-		ajaxExtend( target, settings );
-		return target;
-	},
-
-	ajaxSettings: {
-		url: ajaxLocation,
-		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-		global: true,
-		type: "GET",
-		contentType: "application/x-www-form-urlencoded",
-		processData: true,
-		async: true,
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			xml: "application/xml, text/xml",
-			html: "text/html",
-			text: "text/plain",
-			json: "application/json, text/javascript",
-			"*": allTypes
-		},
-
-		contents: {
-			xml: /xml/,
-			html: /html/,
-			json: /json/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText"
-		},
-
-		// List of data converters
-		// 1) key format is "source_type destination_type" (a single space in-between)
-		// 2) the catchall symbol "*" can be used for source_type
-		converters: {
-
-			// Convert anything to text
-			"* text": window.String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			context: true,
-			url: true
-		}
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var // Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-			// Callbacks context
-			callbackContext = s.context || s,
-			// Context for global events
-			// It's the callbackContext if one was provided in the options
-			// and if it's a DOM node or a jQuery collection
-			globalEventContext = callbackContext !== s &&
-				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-						jQuery( callbackContext ) : jQuery.event,
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks( "once memory" ),
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-			// ifModified key
-			ifModifiedKey,
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-			// Response headers
-			responseHeadersString,
-			responseHeaders,
-			// transport
-			transport,
-			// timeout handle
-			timeoutTimer,
-			// Cross-domain detection vars
-			parts,
-			// The jqXHR state
-			state = 0,
-			// To know if global events are to be dispatched
-			fireGlobals,
-			// Loop variable
-			i,
-			// Fake xhr
-			jqXHR = {
-
-				readyState: 0,
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					if ( !state ) {
-						var lname = name.toLowerCase();
-						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match === undefined ? null : match;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					statusText = statusText || "abort";
-					if ( transport ) {
-						transport.abort( statusText );
-					}
-					done( 0, statusText );
-					return this;
-				}
-			};
-
-		// Callback for when everything is done
-		// It is defined here because jslint complains if it is declared
-		// at the end of the function (which would be more logical and readable)
-		function done( status, nativeStatusText, responses, headers ) {
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			var isSuccess,
-				success,
-				error,
-				statusText = nativeStatusText,
-				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
-				lastModified,
-				etag;
-
-			// If successful, handle type chaining
-			if ( status >= 200 && status < 300 || status === 304 ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-
-					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
-						jQuery.lastModified[ ifModifiedKey ] = lastModified;
-					}
-					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
-						jQuery.etag[ ifModifiedKey ] = etag;
-					}
-				}
-
-				// If not modified
-				if ( status === 304 ) {
-
-					statusText = "notmodified";
-					isSuccess = true;
-
-				// If we have data
-				} else {
-
-					try {
-						success = ajaxConvert( s, response );
-						statusText = "success";
-						isSuccess = true;
-					} catch(e) {
-						// We have a parsererror
-						statusText = "parsererror";
-						error = e;
-					}
-				}
-			} else {
-				// We extract error from statusText
-				// then normalize statusText and status for non-aborts
-				error = statusText;
-				if ( !statusText || status ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = "" + ( nativeStatusText || statusText );
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-						[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		// Attach deferreds
-		deferred.promise( jqXHR );
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-		jqXHR.complete = completeDeferred.add;
-
-		// Status-dependent callbacks
-		jqXHR.statusCode = function( map ) {
-			if ( map ) {
-				var tmp;
-				if ( state < 2 ) {
-					for ( tmp in map ) {
-						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-					}
-				} else {
-					tmp = map[ jqXHR.status ];
-					jqXHR.then( tmp, tmp );
-				}
-			}
-			return this;
-		};
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
-		// Determine if a cross-domain request is in order
-		if ( s.crossDomain == null ) {
-			parts = rurl.exec( s.url.toLowerCase() );
-			s.crossDomain = !!( parts &&
-				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
-					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-			);
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefiler, stop there
-		if ( state === 2 ) {
-			return false;
-		}
-
-		// We can fire global events as of now if asked to
-		fireGlobals = s.global;
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Get ifModifiedKey before adding the anti-cache parameter
-			ifModifiedKey = s.url;
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-
-				var ts = jQuery.now(),
-					// try replacing _= if it is there
-					ret = s.url.replace( rts, "$1_=" + ts );
-
-				// if nothing was replaced, add timestamp to the end
-				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			ifModifiedKey = ifModifiedKey || s.url;
-			if ( jQuery.lastModified[ ifModifiedKey ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-			}
-			if ( jQuery.etag[ ifModifiedKey ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
-			}
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-				// Abort if not done already
-				jqXHR.abort();
-				return false;
-
-		}
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = setTimeout( function(){
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch (e) {
-				// Propagate exception as error if not done
-				if ( state < 2 ) {
-					done( -1, e );
-				// Simply rethrow otherwise
-				} else {
-					throw e;
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	// Serialize an array of form elements or a set of
-	// key/values into a query string
-	param: function( a, traditional ) {
-		var s = [],
-			add = function( key, value ) {
-				// If value is a function, invoke it and return its value
-				value = jQuery.isFunction( value ) ? value() : value;
-				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-			};
-
-		// Set traditional to true for jQuery <= 1.3.2 behavior.
-		if ( traditional === undefined ) {
-			traditional = jQuery.ajaxSettings.traditional;
-		}
-
-		// If an array was passed in, assume that it is an array of form elements.
-		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-			// Serialize the form elements
-			jQuery.each( a, function() {
-				add( this.name, this.value );
-			});
-
-		} else {
-			// If traditional, encode the "old" way (the way 1.3.2 or older
-			// did it), otherwise encode params recursively.
-			for ( var prefix in a ) {
-				buildParams( prefix, a[ prefix ], traditional, add );
-			}
-		}
-
-		// Return the resulting serialization
-		return s.join( "&" ).replace( r20, "+" );
-	}
-});
-
-function buildParams( prefix, obj, traditional, add ) {
-	if ( jQuery.isArray( obj ) ) {
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-				// If array item is non-scalar (array or object), encode its
-				// numeric index to resolve deserialization ambiguity issues.
-				// Note that rack (as of 1.0.0) can't currently deserialize
-				// nested arrays properly, and attempting to do so may cause
-				// a server error. Possible fixes are to modify rack's
-				// deserialization algorithm or to provide an option or flag
-				// to force array serialization to be shallow.
-				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
-			}
-		});
-
-	} else if ( !traditional && obj != null && typeof obj === "object" ) {
-		// Serialize object item.
-		for ( var name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-jQuery.extend({
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-	var contents = s.contents,
-		dataTypes = s.dataTypes,
-		responseFields = s.responseFields,
-		ct,
-		type,
-		finalDataType,
-		firstDataType;
-
-	// Fill responseXXX fields
-	for ( type in responseFields ) {
-		if ( type in responses ) {
-			jqXHR[ responseFields[type] ] = responses[ type ];
-		}
-	}
-
-	// Remove auto dataType and get content-type in the process
-	while( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
-	// Apply the dataFilter if provided
-	if ( s.dataFilter ) {
-		response = s.dataFilter( response, s.dataType );
-	}
-
-	var dataTypes = s.dataTypes,
-		converters = {},
-		i,
-		key,
-		length = dataTypes.length,
-		tmp,
-		// Current and previous dataTypes
-		current = dataTypes[ 0 ],
-		prev,
-		// Conversion expression
-		conversion,
-		// Conversion function
-		conv,
-		// Conversion functions (transitive conversion)
-		conv1,
-		conv2;
-
-	// For each dataType in the chain
-	for ( i = 1; i < length; i++ ) {
-
-		// Create converters map
-		// with lowercased keys
-		if ( i === 1 ) {
-			for ( key in s.converters ) {
-				if ( typeof key === "string" ) {
-					converters[ key.toLowerCase() ] = s.converters[ key ];
-				}
-			}
-		}
-
-		// Get the dataTypes
-		prev = current;
-		current = dataTypes[ i ];
-
-		// If current is auto dataType, update it to prev
-		if ( current === "*" ) {
-			current = prev;
-		// If no auto and dataTypes are actually different
-		} else if ( prev !== "*" && prev !== current ) {
-
-			// Get the converter
-			conversion = prev + " " + current;
-			conv = converters[ conversion ] || converters[ "* " + current ];
-
-			// If there is no direct converter, search transitively
-			if ( !conv ) {
-				conv2 = undefined;
-				for ( conv1 in converters ) {
-					tmp = conv1.split( " " );
-					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
-						conv2 = converters[ tmp[1] + " " + current ];
-						if ( conv2 ) {
-							conv1 = converters[ conv1 ];
-							if ( conv1 === true ) {
-								conv = conv2;
-							} else if ( conv2 === true ) {
-								conv = conv1;
-							}
-							break;
-						}
-					}
-				}
-			}
-			// If we found no converter, dispatch an error
-			if ( !( conv || conv2 ) ) {
-				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
-			}
-			// If found converter is not an equivalence
-			if ( conv !== true ) {
-				// Convert with 1 or 2 converters accordingly
-				response = conv ? conv( response ) : conv2( conv1(response) );
-			}
-		}
-	}
-	return response;
-}
-
-
-
-
-var jsc = jQuery.now(),
-	jsre = /(\=)\?(&|$)|\?\?/i;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-	jsonp: "callback",
-	jsonpCallback: function() {
-		return jQuery.expando + "_" + ( jsc++ );
-	}
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
-		( typeof s.data === "string" );
-
-	if ( s.dataTypes[ 0 ] === "jsonp" ||
-		s.jsonp !== false && ( jsre.test( s.url ) ||
-				inspectData && jsre.test( s.data ) ) ) {
-
-		var responseContainer,
-			jsonpCallback = s.jsonpCallback =
-				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
-			previous = window[ jsonpCallback ],
-			url = s.url,
-			data = s.data,
-			replace = "$1" + jsonpCallback + "$2";
-
-		if ( s.jsonp !== false ) {
-			url = url.replace( jsre, replace );
-			if ( s.url === url ) {
-				if ( inspectData ) {
-					data = data.replace( jsre, replace );
-				}
-				if ( s.data === data ) {
-					// Add callback manually
-					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
-				}
-			}
-		}
-
-		s.url = url;
-		s.data = data;
-
-		// Install callback
-		window[ jsonpCallback ] = function( response ) {
-			responseContainer = [ response ];
-		};
-
-		// Clean-up function
-		jqXHR.always(function() {
-			// Set callback back to previous value
-			window[ jsonpCallback ] = previous;
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( previous ) ) {
-				window[ jsonpCallback ]( responseContainer[ 0 ] );
-			}
-		});
-
-		// Use data converter to retrieve json after script execution
-		s.converters["script json"] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( jsonpCallback + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Delegate to script
-		return "script";
-	}
-});
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup({
-	accepts: {
-		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /javascript|ecmascript/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-		s.global = false;
-	}
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-
-		var script,
-			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
-		return {
-
-			send: function( _, callback ) {
-
-				script = document.createElement( "script" );
-
-				script.async = "async";
-
-				if ( s.scriptCharset ) {
-					script.charset = s.scriptCharset;
-				}
-
-				script.src = s.url;
-
-				// Attach handlers for all browsers
-				script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-						// Handle memory leak in IE
-						script.onload = script.onreadystatechange = null;
-
-						// Remove the script
-						if ( head && script.parentNode ) {
-							head.removeChild( script );
-						}
-
-						// Dereference the script
-						script = undefined;
-
-						// Callback if not abort
-						if ( !isAbort ) {
-							callback( 200, "success" );
-						}
-					}
-				};
-				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-				// This arises when a base node is used (#2709 and #4378).
-				head.insertBefore( script, head.firstChild );
-			},
-
-			abort: function() {
-				if ( script ) {
-					script.onload( 0, 1 );
-				}
-			}
-		};
-	}
-});
-
-
-
-
-var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-	xhrOnUnloadAbort = window.ActiveXObject ? function() {
-		// Abort all pending requests
-		for ( var key in xhrCallbacks ) {
-			xhrCallbacks[ key ]( 0, 1 );
-		}
-	} : false,
-	xhrId = 0,
-	xhrCallbacks;
-
-// Functions to create xhrs
-function createStandardXHR() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch( e ) {}
-}
-
-function createActiveXHR() {
-	try {
-		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-	} catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-	/* Microsoft failed to properly
-	 * implement the XMLHttpRequest in IE7 (can't request local files),
-	 * so we use the ActiveXObject when it is available
-	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-	 * we need a fallback.
-	 */
-	function() {
-		return !this.isLocal && createStandardXHR() || createActiveXHR();
-	} :
-	// For all other browsers, use the standard XMLHttpRequest object
-	createStandardXHR;
-
-// Determine support properties
-(function( xhr ) {
-	jQuery.extend( jQuery.support, {
-		ajax: !!xhr,
-		cors: !!xhr && ( "withCredentials" in xhr )
-	});
-})( jQuery.ajaxSettings.xhr() );
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
-	jQuery.ajaxTransport(function( s ) {
-		// Cross domain only allowed if supported through XMLHttpRequest
-		if ( !s.crossDomain || jQuery.support.cors ) {
-
-			var callback;
-
-			return {
-				send: function( headers, complete ) {
-
-					// Get a new xhr
-					var xhr = s.xhr(),
-						handle,
-						i;
-
-					// Open the socket
-					// Passing null username, generates a login popup on Opera (#2865)
-					if ( s.username ) {
-						xhr.open( s.type, s.url, s.async, s.username, s.password );
-					} else {
-						xhr.open( s.type, s.url, s.async );
-					}
-
-					// Apply custom fields if provided
-					if ( s.xhrFields ) {
-						for ( i in s.xhrFields ) {
-							xhr[ i ] = s.xhrFields[ i ];
-						}
-					}
-
-					// Override mime type if needed
-					if ( s.mimeType && xhr.overrideMimeType ) {
-						xhr.overrideMimeType( s.mimeType );
-					}
-
-					// X-Requested-With header
-					// For cross-domain requests, seeing as conditions for a preflight are
-					// akin to a jigsaw puzzle, we simply never set it to be sure.
-					// (it can always be set on a per-request basis or even using ajaxSetup)
-					// For same-domain requests, won't change header if already provided.
-					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-						headers[ "X-Requested-With" ] = "XMLHttpRequest";
-					}
-
-					// Need an extra try/catch for cross domain requests in Firefox 3
-					try {
-						for ( i in headers ) {
-							xhr.setRequestHeader( i, headers[ i ] );
-						}
-					} catch( _ ) {}
-
-					// Do send the request
-					// This may raise an exception which is actually
-					// handled in jQuery.ajax (so no try/catch here)
-					xhr.send( ( s.hasContent && s.data ) || null );
-
-					// Listener
-					callback = function( _, isAbort ) {
-
-						var status,
-							statusText,
-							responseHeaders,
-							responses,
-							xml;
-
-						// Firefox throws exceptions when accessing properties
-						// of an xhr when a network error occured
-						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-						try {
-
-							// Was never called and is aborted or complete
-							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-								// Only called once
-								callback = undefined;
-
-								// Do not keep as active anymore
-								if ( handle ) {
-									xhr.onreadystatechange = jQuery.noop;
-									if ( xhrOnUnloadAbort ) {
-										delete xhrCallbacks[ handle ];
-									}
-								}
-
-								// If it's an abort
-								if ( isAbort ) {
-									// Abort it manually if needed
-									if ( xhr.readyState !== 4 ) {
-										xhr.abort();
-									}
-								} else {
-									status = xhr.status;
-									responseHeaders = xhr.getAllResponseHeaders();
-									responses = {};
-									xml = xhr.responseXML;
-
-									// Construct response list
-									if ( xml && xml.documentElement /* #4958 */ ) {
-										responses.xml = xml;
-									}
-									responses.text = xhr.responseText;
-
-									// Firefox throws an exception when accessing
-									// statusText for faulty cross-domain requests
-									try {
-										statusText = xhr.statusText;
-									} catch( e ) {
-										// We normalize with Webkit giving an empty statusText
-										statusText = "";
-									}
-
-									// Filter status for non standard behaviors
-
-									// If the request is local and we have data: assume a success
-									// (success with no data won't get notified, that's the best we
-									// can do given current implementations)
-									if ( !status && s.isLocal && !s.crossDomain ) {
-										status = responses.text ? 200 : 404;
-									// IE - #1450: sometimes returns 1223 when it should be 204
-									} else if ( status === 1223 ) {
-										status = 204;
-									}
-								}
-							}
-						} catch( firefoxAccessException ) {
-							if ( !isAbort ) {
-								complete( -1, firefoxAccessException );
-							}
-						}
-
-						// Call complete if needed
-						if ( responses ) {
-							complete( status, statusText, responses, responseHeaders );
-						}
-					};
-
-					// if we're in sync mode or it's in cache
-					// and has been retrieved directly (IE6 & IE7)
-					// we need to manually fire the callback
-					if ( !s.async || xhr.readyState === 4 ) {
-						callback();
-					} else {
-						handle = ++xhrId;
-						if ( xhrOnUnloadAbort ) {
-							// Create the active xhrs callbacks list if needed
-							// and attach the unload handler
-							if ( !xhrCallbacks ) {
-								xhrCallbacks = {};
-								jQuery( window ).unload( xhrOnUnloadAbort );
-							}
-							// Add to list of active xhrs callbacks
-							xhrCallbacks[ handle ] = callback;
-						}
-						xhr.onreadystatechange = callback;
-					}
-				},
-
-				abort: function() {
-					if ( callback ) {
-						callback(0,1);
-					}
-				}
-			};
-		}
-	});
-}
-
-
-
-
-var elemdisplay = {},
-	iframe, iframeDoc,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
-	timerId,
-	fxAttrs = [
-		// height animations
-		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
-		// width animations
-		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
-		// opacity animations
-		[ "opacity" ]
-	],
-	fxNow;
-
-jQuery.fn.extend({
-	show: function( speed, easing, callback ) {
-		var elem, display;
-
-		if ( speed || speed === 0 ) {
-			return this.animate( genFx("show", 3), speed, easing, callback );
-
-		} else {
-			for ( var i = 0, j = this.length; i < j; i++ ) {
-				elem = this[ i ];
-
-				if ( elem.style ) {
-					display = elem.style.display;
-
-					// Reset the inline display of this element to learn if it is
-					// being hidden by cascaded rules or not
-					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
-						display = elem.style.display = "";
-					}
-
-					// Set elements which have been overridden with display: none
-					// in a stylesheet to whatever the default browser style is
-					// for such an element
-					if ( display === "" && jQuery.css(elem, "display") === "none" ) {
-						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
-					}
-				}
-			}
-
-			// Set the display of most of the elements in a second loop
-			// to avoid the constant reflow
-			for ( i = 0; i < j; i++ ) {
-				elem = this[ i ];
-
-				if ( elem.style ) {
-					display = elem.style.display;
-
-					if ( display === "" || display === "none" ) {
-						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
-					}
-				}
-			}
-
-			return this;
-		}
-	},
-
-	hide: function( speed, easing, callback ) {
-		if ( speed || speed === 0 ) {
-			return this.animate( genFx("hide", 3), speed, easing, callback);
-
-		} else {
-			var elem, display,
-				i = 0,
-				j = this.length;
-
-			for ( ; i < j; i++ ) {
-				elem = this[i];
-				if ( elem.style ) {
-					display = jQuery.css( elem, "display" );
-
-					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
-						jQuery._data( elem, "olddisplay", display );
-					}
-				}
-			}
-
-			// Set the display of the elements in a second loop
-			// to avoid the constant reflow
-			for ( i = 0; i < j; i++ ) {
-				if ( this[i].style ) {
-					this[i].style.display = "none";
-				}
-			}
-
-			return this;
-		}
-	},
-
-	// Save the old toggle function
-	_toggle: jQuery.fn.toggle,
-
-	toggle: function( fn, fn2, callback ) {
-		var bool = typeof fn === "boolean";
-
-		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
-			this._toggle.apply( this, arguments );
-
-		} else if ( fn == null || bool ) {
-			this.each(function() {
-				var state = bool ? fn : jQuery(this).is(":hidden");
-				jQuery(this)[ state ? "show" : "hide" ]();
-			});
-
-		} else {
-			this.animate(genFx("toggle", 3), fn, fn2, callback);
-		}
-
-		return this;
-	},
-
-	fadeTo: function( speed, to, easing, callback ) {
-		return this.filter(":hidden").css("opacity", 0).show().end()
-					.animate({opacity: to}, speed, easing, callback);
-	},
-
-	animate: function( prop, speed, easing, callback ) {
-		var optall = jQuery.speed( speed, easing, callback );
-
-		if ( jQuery.isEmptyObject( prop ) ) {
-			return this.each( optall.complete, [ false ] );
-		}
-
-		// Do not change referenced properties as per-property easing will be lost
-		prop = jQuery.extend( {}, prop );
-
-		function doAnimation() {
-			// XXX 'this' does not always have a nodeName when running the
-			// test suite
-
-			if ( optall.queue === false ) {
-				jQuery._mark( this );
-			}
-
-			var opt = jQuery.extend( {}, optall ),
-				isElement = this.nodeType === 1,
-				hidden = isElement && jQuery(this).is(":hidden"),
-				name, val, p, e,
-				parts, start, end, unit,
-				method;
-
-			// will store per property easing and be used to determine when an animation is complete
-			opt.animatedProperties = {};
-
-			for ( p in prop ) {
-
-				// property name normalization
-				name = jQuery.camelCase( p );
-				if ( p !== name ) {
-					prop[ name ] = prop[ p ];
-					delete prop[ p ];
-				}
-
-				val = prop[ name ];
-
-				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
-				if ( jQuery.isArray( val ) ) {
-					opt.animatedProperties[ name ] = val[ 1 ];
-					val = prop[ name ] = val[ 0 ];
-				} else {
-					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
-				}
-
-				if ( val === "hide" && hidden || val === "show" && !hidden ) {
-					return opt.complete.call( this );
-				}
-
-				if ( isElement && ( name === "height" || name === "width" ) ) {
-					// Make sure that nothing sneaks out
-					// Record all 3 overflow attributes because IE does not
-					// change the overflow attribute when overflowX and
-					// overflowY are set to the same value
-					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
-
-					// Set display property to inline-block for height/width
-					// animations on inline elements that are having width/height animated
-					if ( jQuery.css( this, "display" ) === "inline" &&
-							jQuery.css( this, "float" ) === "none" ) {
-
-						// inline-level elements accept inline-block;
-						// block-level elements need to be inline with layout
-						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
-							this.style.display = "inline-block";
-
-						} else {
-							this.style.zoom = 1;
-						}
-					}
-				}
-			}
-
-			if ( opt.overflow != null ) {
-				this.style.overflow = "hidden";
-			}
-
-			for ( p in prop ) {
-				e = new jQuery.fx( this, opt, p );
-				val = prop[ p ];
-
-				if ( rfxtypes.test( val ) ) {
-
-					// Tracks whether to show or hide based on private
-					// data attached to the element
-					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
-					if ( method ) {
-						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
-						e[ method ]();
-					} else {
-						e[ val ]();
-					}
-
-				} else {
-					parts = rfxnum.exec( val );
-					start = e.cur();
-
-					if ( parts ) {
-						end = parseFloat( parts[2] );
-						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
-						// We need to compute starting value
-						if ( unit !== "px" ) {
-							jQuery.style( this, p, (end || 1) + unit);
-							start = ( (end || 1) / e.cur() ) * start;
-							jQuery.style( this, p, start + unit);
-						}
-
-						// If a +=/-= token was provided, we're doing a relative animation
-						if ( parts[1] ) {
-							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
-						}
-
-						e.custom( start, end, unit );
-
-					} else {
-						e.custom( start, val, "" );
-					}
-				}
-			}
-
-			// For JS strict compliance
-			return true;
-		}
-
-		return optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-
-	stop: function( type, clearQueue, gotoEnd ) {
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each(function() {
-			var index,
-				hadTimers = false,
-				timers = jQuery.timers,
-				data = jQuery._data( this );
-
-			// clear marker counters if we know they won't be
-			if ( !gotoEnd ) {
-				jQuery._unmark( true, this );
-			}
-
-			function stopQueue( elem, data, index ) {
-				var hooks = data[ index ];
-				jQuery.removeData( elem, index, true );
-				hooks.stop( gotoEnd );
-			}
-
-			if ( type == null ) {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
-						stopQueue( this, data, index );
-					}
-				}
-			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
-				stopQueue( this, data, index );
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-					if ( gotoEnd ) {
-
-						// force the next step to be the last
-						timers[ index ]( true );
-					} else {
-						timers[ index ].saveState();
-					}
-					hadTimers = true;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// start the next in the queue if the last step wasn't forced
-			// timers currently will call their complete callbacks, which will dequeue
-			// but only if they were gotoEnd
-			if ( !( gotoEnd && hadTimers ) ) {
-				jQuery.dequeue( this, type );
-			}
-		});
-	}
-
-});
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	setTimeout( clearFxNow, 0 );
-	return ( fxNow = jQuery.now() );
-}
-
-function clearFxNow() {
-	fxNow = undefined;
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, num ) {
-	var obj = {};
-
-	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
-		obj[ this ] = type;
-	});
-
-	return obj;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-	slideDown: genFx( "show", 1 ),
-	slideUp: genFx( "hide", 1 ),
-	slideToggle: genFx( "toggle", 1 ),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-});
-
-jQuery.extend({
-	speed: function( speed, easing, fn ) {
-		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-			complete: fn || !fn && easing ||
-				jQuery.isFunction( speed ) && speed,
-			duration: speed,
-			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-		};
-
-		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-		// normalize opt.queue - true/undefined/null -> "fx"
-		if ( opt.queue == null || opt.queue === true ) {
-			opt.queue = "fx";
-		}
-
-		// Queueing
-		opt.old = opt.complete;
-
-		opt.complete = function( noUnmark ) {
-			if ( jQuery.isFunction( opt.old ) ) {
-				opt.old.call( this );
-			}
-
-			if ( opt.queue ) {
-				jQuery.dequeue( this, opt.queue );
-			} else if ( noUnmark !== false ) {
-				jQuery._unmark( this );
-			}
-		};
-
-		return opt;
-	},
-
-	easing: {
-		linear: function( p, n, firstNum, diff ) {
-			return firstNum + diff * p;
-		},
-		swing: function( p, n, firstNum, diff ) {
-			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
-		}
-	},
-
-	timers: [],
-
-	fx: function( elem, options, prop ) {
-		this.options = options;
-		this.elem = elem;
-		this.prop = prop;
-
-		options.orig = options.orig || {};
-	}
-
-});
-
-jQuery.fx.prototype = {
-	// Simple function for setting a style value
-	update: function() {
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
-	},
-
-	// Get the current size
-	cur: function() {
-		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
-			return this.elem[ this.prop ];
-		}
-
-		var parsed,
-			r = jQuery.css( this.elem, this.prop );
-		// Empty strings, null, undefined and "auto" are converted to 0,
-		// complex values such as "rotate(1rad)" are returned as is,
-		// simple values such as "10px" are parsed to Float.
-		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
-	},
-
-	// Start an animation from one number to another
-	custom: function( from, to, unit ) {
-		var self = this,
-			fx = jQuery.fx;
-
-		this.startTime = fxNow || createFxNow();
-		this.end = to;
-		this.now = this.start = from;
-		this.pos = this.state = 0;
-		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-
-		function t( gotoEnd ) {
-			return self.step( gotoEnd );
-		}
-
-		t.queue = this.options.queue;
-		t.elem = this.elem;
-		t.saveState = function() {
-			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
-				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
-			}
-		};
-
-		if ( t() && jQuery.timers.push(t) && !timerId ) {
-			timerId = setInterval( fx.tick, fx.interval );
-		}
-	},
-
-	// Simple 'show' function
-	show: function() {
-		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
-
-		// Remember where we started, so that we can go back to it later
-		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
-		this.options.show = true;
-
-		// Begin the animation
-		// Make sure that we start at a small width/height to avoid any flash of content
-		if ( dataShow !== undefined ) {
-			// This show is picking up where a previous hide or show left off
-			this.custom( this.cur(), dataShow );
-		} else {
-			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
-		}
-
-		// Start by showing the element
-		jQuery( this.elem ).show();
-	},
-
-	// Simple 'hide' function
-	hide: function() {
-		// Remember where we started, so that we can go back to it later
-		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
-		this.options.hide = true;
-
-		// Begin the animation
-		this.custom( this.cur(), 0 );
-	},
-
-	// Each step of an animation
-	step: function( gotoEnd ) {
-		var p, n, complete,
-			t = fxNow || createFxNow(),
-			done = true,
-			elem = this.elem,
-			options = this.options;
-
-		if ( gotoEnd || t >= options.duration + this.startTime ) {
-			this.now = this.end;
-			this.pos = this.state = 1;
-			this.update();
-
-			options.animatedProperties[ this.prop ] = true;
-
-			for ( p in options.animatedProperties ) {
-				if ( options.animatedProperties[ p ] !== true ) {
-					done = false;
-				}
-			}
-
-			if ( done ) {
-				// Reset the overflow
-				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
-
-					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
-						elem.style[ "overflow" + value ] = options.overflow[ index ];
-					});
-				}
-
-				// Hide the element if the "hide" operation was done
-				if ( options.hide ) {
-					jQuery( elem ).hide();
-				}
-
-				// Reset the properties, if the item has been hidden or shown
-				if ( options.hide || options.show ) {
-					for ( p in options.animatedProperties ) {
-						jQuery.style( elem, p, options.orig[ p ] );
-						jQuery.removeData( elem, "fxshow" + p, true );
-						// Toggle data is no longer needed
-						jQuery.removeData( elem, "toggle" + p, true );
-					}
-				}
-
-				// Execute the complete function
-				// in the event that the complete function throws an exception
-				// we must ensure it won't be called twice. #5684
-
-				complete = options.complete;
-				if ( complete ) {
-
-					options.complete = false;
-					complete.call( elem );
-				}
-			}
-
-			return false;
-
-		} else {
-			// classical easing cannot be used with an Infinity duration
-			if ( options.duration == Infinity ) {
-				this.now = t;
-			} else {
-				n = t - this.startTime;
-				this.state = n / options.duration;
-
-				// Perform the easing function, defaults to swing
-				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
-				this.now = this.start + ( (this.end - this.start) * this.pos );
-			}
-			// Perform the next step of the animation
-			this.update();
-		}
-
-		return true;
-	}
-};
-
-jQuery.extend( jQuery.fx, {
-	tick: function() {
-		var timer,
-			timers = jQuery.timers,
-			i = 0;
-
-		for ( ; i < timers.length; i++ ) {
-			timer = timers[ i ];
-			// Checks the timer has not already been removed
-			if ( !timer() && timers[ i ] === timer ) {
-				timers.splice( i--, 1 );
-			}
-		}
-
-		if ( !timers.length ) {
-			jQuery.fx.stop();
-		}
-	},
-
-	interval: 13,
-
-	stop: function() {
-		clearInterval( timerId );
-		timerId = null;
-	},
-
-	speeds: {
-		slow: 600,
-		fast: 200,
-		// Default speed
-		_default: 400
-	},
-
-	step: {
-		opacity: function( fx ) {
-			jQuery.style( fx.elem, "opacity", fx.now );
-		},
-
-		_default: function( fx ) {
-			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
-				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
-			} else {
-				fx.elem[ fx.prop ] = fx.now;
-			}
-		}
-	}
-});
-
-// Adds width/height step functions
-// Do not set anything below 0
-jQuery.each([ "width", "height" ], function( i, prop ) {
-	jQuery.fx.step[ prop ] = function( fx ) {
-		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
-	};
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.animated = function( elem ) {
-		return jQuery.grep(jQuery.timers, function( fn ) {
-			return elem === fn.elem;
-		}).length;
-	};
-}
-
-// Try to restore the default display value of an element
-function defaultDisplay( nodeName ) {
-
-	if ( !elemdisplay[ nodeName ] ) {
-
-		var body = document.body,
-			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
-			display = elem.css( "display" );
-		elem.remove();
-
-		// If the simple way fails,
-		// get element's real default display by attaching it to a temp iframe
-		if ( display === "none" || display === "" ) {
-			// No iframe to use yet, so create it
-			if ( !iframe ) {
-				iframe = document.createElement( "iframe" );
-				iframe.frameBorder = iframe.width = iframe.height = 0;
-			}
-
-			body.appendChild( iframe );
-
-			// Create a cacheable copy of the iframe document on first call.
-			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-			// document to it; WebKit & Firefox won't allow reusing the iframe document.
-			if ( !iframeDoc || !iframe.createElement ) {
-				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
-				iframeDoc.close();
-			}
-
-			elem = iframeDoc.createElement( nodeName );
-
-			iframeDoc.body.appendChild( elem );
-
-			display = jQuery.css( elem, "display" );
-			body.removeChild( iframe );
-		}
-
-		// Store the correct default display
-		elemdisplay[ nodeName ] = display;
-	}
-
-	return elemdisplay[ nodeName ];
-}
-
-
-
-
-var rtable = /^t(?:able|d|h)$/i,
-	rroot = /^(?:body|html)$/i;
-
-if ( "getBoundingClientRect" in document.documentElement ) {
-	jQuery.fn.offset = function( options ) {
-		var elem = this[0], box;
-
-		if ( options ) {
-			return this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-		}
-
-		if ( !elem || !elem.ownerDocument ) {
-			return null;
-		}
-
-		if ( elem === elem.ownerDocument.body ) {
-			return jQuery.offset.bodyOffset( elem );
-		}
-
-		try {
-			box = elem.getBoundingClientRect();
-		} catch(e) {}
-
-		var doc = elem.ownerDocument,
-			docElem = doc.documentElement;
-
-		// Make sure we're not dealing with a disconnected DOM node
-		if ( !box || !jQuery.contains( docElem, elem ) ) {
-			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
-		}
-
-		var body = doc.body,
-			win = getWindow(doc),
-			clientTop  = docElem.clientTop  || body.clientTop  || 0,
-			clientLeft = docElem.clientLeft || body.clientLeft || 0,
-			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
-			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
-			top  = box.top  + scrollTop  - clientTop,
-			left = box.left + scrollLeft - clientLeft;
-
-		return { top: top, left: left };
-	};
-
-} else {
-	jQuery.fn.offset = function( options ) {
-		var elem = this[0];
-
-		if ( options ) {
-			return this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-		}
-
-		if ( !elem || !elem.ownerDocument ) {
-			return null;
-		}
-
-		if ( elem === elem.ownerDocument.body ) {
-			return jQuery.offset.bodyOffset( elem );
-		}
-
-		var computedStyle,
-			offsetParent = elem.offsetParent,
-			prevOffsetParent = elem,
-			doc = elem.ownerDocument,
-			docElem = doc.documentElement,
-			body = doc.body,
-			defaultView = doc.defaultView,
-			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
-			top = elem.offsetTop,
-			left = elem.offsetLeft;
-
-		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
-			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-				break;
-			}
-
-			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
-			top  -= elem.scrollTop;
-			left -= elem.scrollLeft;
-
-			if ( elem === offsetParent ) {
-				top  += elem.offsetTop;
-				left += elem.offsetLeft;
-
-				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
-					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-				}
-
-				prevOffsetParent = offsetParent;
-				offsetParent = elem.offsetParent;
-			}
-
-			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
-				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-			}
-
-			prevComputedStyle = computedStyle;
-		}
-
-		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
-			top  += body.offsetTop;
-			left += body.offsetLeft;
-		}
-
-		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-			top  += Math.max( docElem.scrollTop, body.scrollTop );
-			left += Math.max( docElem.scrollLeft, body.scrollLeft );
-		}
-
-		return { top: top, left: left };
-	};
-}
-
-jQuery.offset = {
-
-	bodyOffset: function( body ) {
-		var top = body.offsetTop,
-			left = body.offsetLeft;
-
-		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-		}
-
-		return { top: top, left: left };
-	},
-
-	setOffset: function( elem, options, i ) {
-		var position = jQuery.css( elem, "position" );
-
-		// set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		var curElem = jQuery( elem ),
-			curOffset = curElem.offset(),
-			curCSSTop = jQuery.css( elem, "top" ),
-			curCSSLeft = jQuery.css( elem, "left" ),
-			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-			props = {}, curPosition = {}, curTop, curLeft;
-
-		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-			options = options.call( elem, i, curOffset );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-
-jQuery.fn.extend({
-
-	position: function() {
-		if ( !this[0] ) {
-			return null;
-		}
-
-		var elem = this[0],
-
-		// Get *real* offsetParent
-		offsetParent = this.offsetParent(),
-
-		// Get correct offsets
-		offset       = this.offset(),
-		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
-		// Subtract element margins
-		// note: when an element has margin: auto the offsetLeft and marginLeft
-		// are the same in Safari causing offset.left to incorrectly be 0
-		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
-		// Add offsetParent borders
-		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
-		// Subtract the two offsets
-		return {
-			top:  offset.top  - parentOffset.top,
-			left: offset.left - parentOffset.left
-		};
-	},
-
-	offsetParent: function() {
-		return this.map(function() {
-			var offsetParent = this.offsetParent || document.body;
-			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-			return offsetParent;
-		});
-	}
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( ["Left", "Top"], function( i, name ) {
-	var method = "scroll" + name;
-
-	jQuery.fn[ method ] = function( val ) {
-		var elem, win;
-
-		if ( val === undefined ) {
-			elem = this[ 0 ];
-
-			if ( !elem ) {
-				return null;
-			}
-
-			win = getWindow( elem );
-
-			// Return the scroll offset
-			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
-				jQuery.support.boxModel && win.document.documentElement[ method ] ||
-					win.document.body[ method ] :
-				elem[ method ];
-		}
-
-		// Set the scroll offset
-		return this.each(function() {
-			win = getWindow( this );
-
-			if ( win ) {
-				win.scrollTo(
-					!i ? val : jQuery( win ).scrollLeft(),
-					 i ? val : jQuery( win ).scrollTop()
-				);
-
-			} else {
-				this[ method ] = val;
-			}
-		});
-	};
-});
-
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ?
-		elem :
-		elem.nodeType === 9 ?
-			elem.defaultView || elem.parentWindow :
-			false;
-}
-
-
-
-
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function( i, name ) {
-
-	var type = name.toLowerCase();
-
-	// innerHeight and innerWidth
-	jQuery.fn[ "inner" + name ] = function() {
-		var elem = this[0];
-		return elem ?
-			elem.style ?
-			parseFloat( jQuery.css( elem, type, "padding" ) ) :
-			this[ type ]() :
-			null;
-	};
-
-	// outerHeight and outerWidth
-	jQuery.fn[ "outer" + name ] = function( margin ) {
-		var elem = this[0];
-		return elem ?
-			elem.style ?
-			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
-			this[ type ]() :
-			null;
-	};
-
-	jQuery.fn[ type ] = function( size ) {
-		// Get window width or height
-		var elem = this[0];
-		if ( !elem ) {
-			return size == null ? null : this;
-		}
-
-		if ( jQuery.isFunction( size ) ) {
-			return this.each(function( i ) {
-				var self = jQuery( this );
-				self[ type ]( size.call( this, i, self[ type ]() ) );
-			});
-		}
-
-		if ( jQuery.isWindow( elem ) ) {
-			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
-			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
-			var docElemProp = elem.document.documentElement[ "client" + name ],
-				body = elem.document.body;
-			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
-				body && body[ "client" + name ] || docElemProp;
-
-		// Get document width or height
-		} else if ( elem.nodeType === 9 ) {
-			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
-			return Math.max(
-				elem.documentElement["client" + name],
-				elem.body["scroll" + name], elem.documentElement["scroll" + name],
-				elem.body["offset" + name], elem.documentElement["offset" + name]
-			);
-
-		// Get or set width or height on the element
-		} else if ( size === undefined ) {
-			var orig = jQuery.css( elem, type ),
-				ret = parseFloat( orig );
-
-			return jQuery.isNumeric( ret ) ? ret : orig;
-
-		// Set the width or height on the element (default to pixels if value is unitless)
-		} else {
-			return this.css( type, typeof size === "string" ? size : size + "px" );
-		}
-	};
-
-});
-
-
-
-
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-	define( "jquery", [], function () { return jQuery; } );
-}
-
-
-
-})( window );
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin.c b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin.c
deleted file mode 100644
index 0315828..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* jsmin.c
-   2011-01-22
-
-Copyright (c) 2002 Douglas Crockford  (www.crockford.com)
-
-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 shall be used for Good, not Evil.
-
-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.
-*/
-
-#include <stdlib.h>
-#include <stdio.h>
-
-static int   theA;
-static int   theB;
-static int   theLookahead = EOF;
-
-
-/* isAlphanum -- return true if the character is a letter, digit, underscore,
-        dollar sign, or non-ASCII character.
-*/
-
-static int
-isAlphanum(int c)
-{
-    return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
-        (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' ||
-        c > 126);
-}
-
-
-/* get -- return the next character from stdin. Watch out for lookahead. If
-        the character is a control character, translate it to a space or
-        linefeed.
-*/
-
-static int
-get()
-{
-    int c = theLookahead;
-    theLookahead = EOF;
-    if (c == EOF) {
-        c = getc(stdin);
-    }
-    if (c >= ' ' || c == '\n' || c == EOF) {
-        return c;
-    }
-    if (c == '\r') {
-        return '\n';
-    }
-    return ' ';
-}
-
-
-/* peek -- get the next character without getting it.
-*/
-
-static int
-peek()
-{
-    theLookahead = get();
-    return theLookahead;
-}
-
-
-/* next -- get the next character, excluding comments. peek() is used to see
-        if a '/' is followed by a '/' or '*'.
-*/
-
-static int
-next()
-{
-    int c = get();
-    if  (c == '/') {
-        switch (peek()) {
-        case '/':
-            for (;;) {
-                c = get();
-                if (c <= '\n') {
-                    return c;
-                }
-            }
-        case '*':
-            get();
-            for (;;) {
-                switch (get()) {
-                case '*':
-                    if (peek() == '/') {
-                        get();
-                        return ' ';
-                    }
-                    break;
-                case EOF:
-                    fprintf(stderr, "Error: JSMIN Unterminated comment.\n");
-                    exit(1);
-                }
-            }
-        default:
-            return c;
-        }
-    }
-    return c;
-}
-
-
-/* action -- do something! What you do is determined by the argument:
-        1   Output A. Copy B to A. Get the next B.
-        2   Copy B to A. Get the next B. (Delete A).
-        3   Get the next B. (Delete B).
-   action treats a string as a single character. Wow!
-   action recognizes a regular expression if it is preceded by ( or , or =.
-*/
-
-static void
-action(int d)
-{
-    switch (d) {
-    case 1:
-        putc(theA, stdout);
-    case 2:
-        theA = theB;
-        if (theA == '\'' || theA == '"') {
-            for (;;) {
-                putc(theA, stdout);
-                theA = get();
-                if (theA == theB) {
-                    break;
-                }
-                if (theA == '\\') {
-                    putc(theA, stdout);
-                    theA = get();
-                }
-                if (theA == EOF) {
-                    fprintf(stderr, "Error: JSMIN unterminated string literal.");
-                    exit(1);
-                }
-            }
-        }
-    case 3:
-        theB = next();
-        if (theB == '/' && (theA == '(' || theA == ',' || theA == '=' ||
-                            theA == ':' || theA == '[' || theA == '!' ||
-                            theA == '&' || theA == '|' || theA == '?' ||
-                            theA == '{' || theA == '}' || theA == ';' ||
-                            theA == '\n')) {
-            putc(theA, stdout);
-            putc(theB, stdout);
-            for (;;) {
-                theA = get();
-                if (theA == '[') {
-					for (;;) {
-						putc(theA, stdout);
-						theA = get();
-						if (theA == ']') {
-							break;
-						} 
-						if (theA == '\\') {
-							putc(theA, stdout);
-							theA = get();
-						} 
-						if (theA == EOF) {
-							fprintf(stderr, 
-								"Error: JSMIN unterminated set in Regular Expression literal.\n");
-							exit(1);
-						}
-					}
-				} else if (theA == '/') {
-                    break;
-                } else if (theA =='\\') {
-                    putc(theA, stdout);
-                    theA = get();
-                }
-                if (theA == EOF) {
-                    fprintf(stderr,
-						"Error: JSMIN unterminated Regular Expression literal.\n");
-                    exit(1);
-                }
-                putc(theA, stdout);
-            }
-            theB = next();
-        }
-    }
-}
-
-
-/* jsmin -- Copy the input to the output, deleting the characters which are
-        insignificant to JavaScript. Comments will be removed. Tabs will be
-        replaced with spaces. Carriage returns will be replaced with linefeeds.
-        Most spaces and linefeeds will be removed.
-*/
-
-static void
-jsmin()
-{
-    theA = '\n';
-    action(3);
-    while (theA != EOF) {
-        switch (theA) {
-        case ' ':
-            if (isAlphanum(theB)) {
-                action(1);
-            } else {
-                action(2);
-            }
-            break;
-        case '\n':
-            switch (theB) {
-            case '{':
-            case '[':
-            case '(':
-            case '+':
-            case '-':
-                action(1);
-                break;
-            case ' ':
-                action(3);
-                break;
-            default:
-                if (isAlphanum(theB)) {
-                    action(1);
-                } else {
-                    action(2);
-                }
-            }
-            break;
-        default:
-            switch (theB) {
-            case ' ':
-                if (isAlphanum(theA)) {
-                    action(1);
-                    break;
-                }
-                action(3);
-                break;
-            case '\n':
-                switch (theA) {
-                case '}':
-                case ']':
-                case ')':
-                case '+':
-                case '-':
-                case '"':
-                case '\'':
-                    action(1);
-                    break;
-                default:
-                    if (isAlphanum(theA)) {
-                        action(1);
-                    } else {
-                        action(3);
-                    }
-                }
-                break;
-            default:
-                action(1);
-                break;
-            }
-        }
-    }
-}
-
-
-/* main -- Output any command line arguments as comments
-        and then minify the input.
-*/
-extern int
-main(int argc, char* argv[])
-{
-    int i;
-    for (i = 1; i < argc; i += 1) {
-        fprintf(stdout, "// %s\n", argv[i]);
-    }
-    jsmin();
-    return 0;
-}
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin.py
deleted file mode 100644
index b1f7dd7..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin.py
+++ /dev/null
@@ -1,226 +0,0 @@
-#!/usr/bin/env python
-
-# This code is original from jsmin by Douglas Crockford, it was translated to
-# Python by Baruch Even. The original code had the following copyright and
-# license.
-#
-# /* jsmin.c
-#    2007-05-22
-#
-# Copyright (c) 2002 Douglas Crockford  (www.crockford.com)
-#
-# 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 shall be used for Good, not Evil.
-#
-# 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.
-# */
-
-# imports adjusted for speed (cStringIO) and python 3 (io) -- nd
-try:
-    from cStringIO import StringIO
-except ImportError:
-    try:
-        from StringIO import StringIO
-    except ImportError:
-        from io import StringIO
-
-
-def jsmin(js):
-    ins = StringIO(js)
-    outs = StringIO()
-    JavascriptMinify().minify(ins, outs)
-    str = outs.getvalue()
-    if len(str) > 0 and str[0] == '\n':
-        str = str[1:]
-    return str
-
-def isAlphanum(c):
-    """return true if the character is a letter, digit, underscore,
-           dollar sign, or non-ASCII character.
-    """
-    return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or
-            (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126));
-
-class UnterminatedComment(Exception):
-    pass
-
-class UnterminatedStringLiteral(Exception):
-    pass
-
-class UnterminatedRegularExpression(Exception):
-    pass
-
-class JavascriptMinify(object):
-
-    def _outA(self):
-        self.outstream.write(self.theA)
-    def _outB(self):
-        self.outstream.write(self.theB)
-
-    def _get(self):
-        """return the next character from stdin. Watch out for lookahead. If
-           the character is a control character, translate it to a space or
-           linefeed.
-        """
-        c = self.theLookahead
-        self.theLookahead = None
-        if c == None:
-            c = self.instream.read(1)
-        if c >= ' ' or c == '\n':
-            return c
-        if c == '': # EOF
-            return '\000'
-        if c == '\r':
-            return '\n'
-        return ' '
-
-    def _peek(self):
-        self.theLookahead = self._get()
-        return self.theLookahead
-
-    def _next(self):
-        """get the next character, excluding comments. peek() is used to see
-           if an unescaped '/' is followed by a '/' or '*'.
-        """
-        c = self._get()
-        if c == '/' and self.theA != '\\':
-            p = self._peek()
-            if p == '/':
-                c = self._get()
-                while c > '\n':
-                    c = self._get()
-                return c
-            if p == '*':
-                c = self._get()
-                while 1:
-                    c = self._get()
-                    if c == '*':
-                        if self._peek() == '/':
-                            self._get()
-                            return ' '
-                    if c == '\000':
-                        raise UnterminatedComment()
-
-        return c
-
-    def _action(self, action):
-        """do something! What you do is determined by the argument:
-           1   Output A. Copy B to A. Get the next B.
-           2   Copy B to A. Get the next B. (Delete A).
-           3   Get the next B. (Delete B).
-           action treats a string as a single character. Wow!
-           action recognizes a regular expression if it is preceded by ( or , or =.
-        """
-        if action <= 1:
-            self._outA()
-
-        if action <= 2:
-            self.theA = self.theB
-            if self.theA == "'" or self.theA == '"':
-                while 1:
-                    self._outA()
-                    self.theA = self._get()
-                    if self.theA == self.theB:
-                        break
-                    if self.theA <= '\n':
-                        raise UnterminatedStringLiteral()
-                    if self.theA == '\\':
-                        self._outA()
-                        self.theA = self._get()
-
-
-        if action <= 3:
-            self.theB = self._next()
-            if self.theB == '/' and (self.theA == '(' or self.theA == ',' or
-                                     self.theA == '=' or self.theA == ':' or
-                                     self.theA == '[' or self.theA == '?' or
-                                     self.theA == '!' or self.theA == '&' or
-                                     self.theA == '|' or self.theA == ';' or
-                                     self.theA == '{' or self.theA == '}' or
-                                     self.theA == '\n'):
-                self._outA()
-                self._outB()
-                while 1:
-                    self.theA = self._get()
-                    if self.theA == '/':
-                        break
-                    elif self.theA == '\\':
-                        self._outA()
-                        self.theA = self._get()
-                    elif self.theA <= '\n':
-                        raise UnterminatedRegularExpression()
-                    self._outA()
-                self.theB = self._next()
-
-
-    def _jsmin(self):
-        """Copy the input to the output, deleting the characters which are
-           insignificant to JavaScript. Comments will be removed. Tabs will be
-           replaced with spaces. Carriage returns will be replaced with linefeeds.
-           Most spaces and linefeeds will be removed.
-        """
-        self.theA = '\n'
-        self._action(3)
-
-        while self.theA != '\000':
-            if self.theA == ' ':
-                if isAlphanum(self.theB):
-                    self._action(1)
-                else:
-                    self._action(2)
-            elif self.theA == '\n':
-                if self.theB in ['{', '[', '(', '+', '-']:
-                    self._action(1)
-                elif self.theB == ' ':
-                    self._action(3)
-                else:
-                    if isAlphanum(self.theB):
-                        self._action(1)
-                    else:
-                        self._action(2)
-            else:
-                if self.theB == ' ':
-                    if isAlphanum(self.theA):
-                        self._action(1)
-                    else:
-                        self._action(3)
-                elif self.theB == '\n':
-                    if self.theA in ['}', ']', ')', '+', '-', '"', '\'']:
-                        self._action(1)
-                    else:
-                        if isAlphanum(self.theA):
-                            self._action(1)
-                        else:
-                            self._action(3)
-                else:
-                    self._action(1)
-
-    def minify(self, instream, outstream):
-        self.instream = instream
-        self.outstream = outstream
-        self.theA = '\n'
-        self.theB = None
-        self.theLookahead = None
-
-        self._jsmin()
-        self.instream.close()
-
-if __name__ == '__main__':
-    import sys
-    jsm = JavascriptMinify()
-    jsm.minify(sys.stdin, sys.stdout)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin_2_0_9.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin_2_0_9.py
deleted file mode 100644
index 23bed60..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/jsmin_2_0_9.py
+++ /dev/null
@@ -1,233 +0,0 @@
-# This code is original from jsmin by Douglas Crockford, it was translated to
-# Python by Baruch Even. It was rewritten by Dave St.Germain for speed.
-#
-# The MIT License (MIT)
-# 
-# Copyright (c) 2013 Dave St.Germain
-# 
-# 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.
-
-
-import sys
-is_3 = sys.version_info >= (3, 0)
-if is_3:
-    import io
-else:
-    import StringIO
-    try:
-        import cStringIO
-    except ImportError:
-        cStringIO = None
-
-
-__all__ = ['jsmin', 'JavascriptMinify']
-__version__ = '2.0.9'
-
-
-def jsmin(js):
-    """
-    returns a minified version of the javascript string
-    """
-    if not is_3:        
-        if cStringIO and not isinstance(js, unicode):
-            # strings can use cStringIO for a 3x performance
-            # improvement, but unicode (in python2) cannot
-            klass = cStringIO.StringIO
-        else:
-            klass = StringIO.StringIO
-    else:
-        klass = io.StringIO
-    ins = klass(js)
-    outs = klass()
-    JavascriptMinify(ins, outs).minify()
-    return outs.getvalue()
-
-
-class JavascriptMinify(object):
-    """
-    Minify an input stream of javascript, writing
-    to an output stream
-    """
-
-    def __init__(self, instream=None, outstream=None):
-        self.ins = instream
-        self.outs = outstream
-
-    def minify(self, instream=None, outstream=None):
-        if instream and outstream:
-            self.ins, self.outs = instream, outstream
-        
-        self.is_return = False
-        self.return_buf = ''
-        
-        def write(char):
-            # all of this is to support literal regular expressions.
-            # sigh
-            if char in 'return':
-                self.return_buf += char
-                self.is_return = self.return_buf == 'return'
-            self.outs.write(char)
-            if self.is_return:
-                self.return_buf = ''
-
-        read = self.ins.read
-
-        space_strings = "abcdefghijklmnopqrstuvwxyz"\
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$\\"
-        starters, enders = '{[(+-', '}])+-"\''
-        newlinestart_strings = starters + space_strings
-        newlineend_strings = enders + space_strings
-        do_newline = False
-        do_space = False
-        escape_slash_count = 0
-        doing_single_comment = False
-        previous_before_comment = ''
-        doing_multi_comment = False
-        in_re = False
-        in_quote = ''
-        quote_buf = []
-        
-        previous = read(1)
-        if previous == '\\':
-            escape_slash_count += 1
-        next1 = read(1)
-        if previous == '/':
-            if next1 == '/':
-                doing_single_comment = True
-            elif next1 == '*':
-                doing_multi_comment = True
-                previous = next1
-                next1 = read(1)
-            else:
-                write(previous)
-        elif not previous:
-            return
-        elif previous >= '!':
-            if previous in "'\"":
-                in_quote = previous
-            write(previous)
-            previous_non_space = previous
-        else:
-            previous_non_space = ' '
-        if not next1:
-            return
-
-        while 1:
-            next2 = read(1)
-            if not next2:
-                last = next1.strip()
-                if not (doing_single_comment or doing_multi_comment)\
-                    and last not in ('', '/'):
-                    if in_quote:
-                        write(''.join(quote_buf))
-                    write(last)
-                break
-            if doing_multi_comment:
-                if next1 == '*' and next2 == '/':
-                    doing_multi_comment = False
-                    next2 = read(1)
-            elif doing_single_comment:
-                if next1 in '\r\n':
-                    doing_single_comment = False
-                    while next2 in '\r\n':
-                        next2 = read(1)
-                        if not next2:
-                            break
-                    if previous_before_comment in ')}]':
-                        do_newline = True
-                    elif previous_before_comment in space_strings:
-                        write('\n')
-            elif in_quote:
-                quote_buf.append(next1)
-
-                if next1 == in_quote:
-                    numslashes = 0
-                    for c in reversed(quote_buf[:-1]):
-                        if c != '\\':
-                            break
-                        else:
-                            numslashes += 1
-                    if numslashes % 2 == 0:
-                        in_quote = ''
-                        write(''.join(quote_buf))
-            elif next1 in '\r\n':
-                if previous_non_space in newlineend_strings \
-                    or previous_non_space > '~':
-                    while 1:
-                        if next2 < '!':
-                            next2 = read(1)
-                            if not next2:
-                                break
-                        else:
-                            if next2 in newlinestart_strings \
-                                or next2 > '~' or next2 == '/':
-                                do_newline = True
-                            break
-            elif next1 < '!' and not in_re:
-                if (previous_non_space in space_strings \
-                    or previous_non_space > '~') \
-                    and (next2 in space_strings or next2 > '~'):
-                    do_space = True
-                elif previous_non_space in '-+' and next2 == previous_non_space:
-                    # protect against + ++ or - -- sequences
-                    do_space = True
-                elif self.is_return and next2 == '/':
-                    # returning a regex...
-                    write(' ')
-            elif next1 == '/':
-                if do_space:
-                    write(' ')
-                if in_re:
-                    if previous != '\\' or (not escape_slash_count % 2) or next2 in 'gimy':
-                        in_re = False
-                    write('/')
-                elif next2 == '/':                    
-                    doing_single_comment = True
-                    previous_before_comment = previous_non_space
-                elif next2 == '*':
-                    doing_multi_comment = True
-                    previous = next1
-                    next1 = next2
-                    next2 = read(1)
-                else:
-                    in_re = previous_non_space in '(,=:[?!&|' or self.is_return # literal regular expression
-                    write('/')
-            else:
-                if do_space:
-                    do_space = False
-                    write(' ')
-                if do_newline:
-                    write('\n')
-                    do_newline = False
-                    
-                write(next1)
-                if not in_re and next1 in "'\"":
-                    in_quote = next1
-                    quote_buf = []
-
-            previous = next1
-            next1 = next2
-
-            if previous >= '!':
-                previous_non_space = previous
-
-            if previous == '\\':
-                escape_slash_count += 1
-            else:
-                escape_slash_count = 0
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/knockout-2.0.0.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/knockout-2.0.0.js
deleted file mode 100644
index e5577eb..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/knockout-2.0.0.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Knockout JavaScript library v2.0.0
-// (c) Steven Sanderson - http://knockoutjs.com/
-// License: MIT (http://www.opensource.org/licenses/mit-license.php)
-
-(function(window,undefined){ 
-function c(a){throw a;}var l=void 0,m=!0,o=null,p=!1,r=window.ko={};r.b=function(a,b){for(var d=a.split("."),e=window,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=b};r.l=function(a,b,d){a[b]=d};
-r.a=new function(){function a(a,e){if("INPUT"!=a.tagName||!a.type)return p;if("click"!=e.toLowerCase())return p;var b=a.type.toLowerCase();return"checkbox"==b||"radio"==b}var b=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,d={},e={};d[/Firefox\/2/i.test(navigator.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];d.MouseEvents="click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave".split(",");for(var f in d){var h=d[f];if(h.length)for(var g=0,i=h.length;g<i;g++)e[h[g]]=
-f}var j=function(){for(var a=3,e=document.createElement("div"),b=e.getElementsByTagName("i");e.innerHTML="<\!--[if gt IE "+ ++a+"]><i></i><![endif]--\>",b[0];);return 4<a?a:l}();return{Ba:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],n:function(a,e){for(var b=0,f=a.length;b<f;b++)e(a[b])},k:function(a,e){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,e);for(var b=0,f=a.length;b<f;b++)if(a[b]===e)return b;return-1},Wa:function(a,e,b){for(var f=0,d=
-a.length;f<d;f++)if(e.call(b,a[f]))return a[f];return o},ca:function(a,e){var b=r.a.k(a,e);0<=b&&a.splice(b,1)},ya:function(a){for(var a=a||[],e=[],b=0,f=a.length;b<f;b++)0>r.a.k(e,a[b])&&e.push(a[b]);return e},ba:function(a,e){for(var a=a||[],b=[],f=0,d=a.length;f<d;f++)b.push(e(a[f]));return b},aa:function(a,e){for(var a=a||[],b=[],f=0,d=a.length;f<d;f++)e(a[f])&&b.push(a[f]);return b},J:function(a,e){for(var b=0,f=e.length;b<f;b++)a.push(e[b]);return a},extend:function(a,e){for(var b in e)e.hasOwnProperty(b)&&
-(a[b]=e[b]);return a},U:function(a){for(;a.firstChild;)r.removeNode(a.firstChild)},oa:function(a,e){r.a.U(a);e&&r.a.n(e,function(e){a.appendChild(e)})},Ja:function(a,e){var b=a.nodeType?[a]:a;if(0<b.length){for(var f=b[0],d=f.parentNode,h=0,g=e.length;h<g;h++)d.insertBefore(e[h],f);h=0;for(g=b.length;h<g;h++)r.removeNode(b[h])}},La:function(a,e){0<=navigator.userAgent.indexOf("MSIE 6")?a.setAttribute("selected",e):a.selected=e},z:function(a){return(a||"").replace(b,"")},Db:function(a,e){for(var b=
-[],f=(a||"").split(e),d=0,h=f.length;d<h;d++){var g=r.a.z(f[d]);""!==g&&b.push(g)}return b},Cb:function(a,e){a=a||"";return e.length>a.length?p:a.substring(0,e.length)===e},hb:function(a){for(var e=Array.prototype.slice.call(arguments,1),b="return ("+a+")",f=0;f<e.length;f++)e[f]&&"object"==typeof e[f]&&(b="with(sc["+f+"]) { "+b+" } ");return(new Function("sc",b))(e)},fb:function(a,e){if(e.compareDocumentPosition)return 16==(e.compareDocumentPosition(a)&16);for(;a!=o;){if(a==e)return m;a=a.parentNode}return p},
-ga:function(a){return r.a.fb(a,document)},s:function(e,b,f){if("undefined"!=typeof jQuery){if(a(e,b))var d=f,f=function(a,e){var b=this.checked;if(e)this.checked=e.Ya!==m;d.call(this,a);this.checked=b};jQuery(e).bind(b,f)}else"function"==typeof e.addEventListener?e.addEventListener(b,f,p):"undefined"!=typeof e.attachEvent?e.attachEvent("on"+b,function(a){f.call(e,a)}):c(Error("Browser doesn't support addEventListener or attachEvent"))},sa:function(b,f){(!b||!b.nodeType)&&c(Error("element must be a DOM node when calling triggerEvent"));
-if("undefined"!=typeof jQuery){var d=[];a(b,f)&&d.push({Ya:b.checked});jQuery(b).trigger(f,d)}else if("function"==typeof document.createEvent)"function"==typeof b.dispatchEvent?(d=document.createEvent(e[f]||"HTMLEvents"),d.initEvent(f,m,m,window,0,0,0,0,0,p,p,p,p,0,b),b.dispatchEvent(d)):c(Error("The supplied element doesn't support dispatchEvent"));else if("undefined"!=typeof b.fireEvent){if("click"==f&&"INPUT"==b.tagName&&("checkbox"==b.type.toLowerCase()||"radio"==b.type.toLowerCase()))b.checked=
-b.checked!==m;b.fireEvent("on"+f)}else c(Error("Browser doesn't support triggering events"))},d:function(a){return r.V(a)?a():a},eb:function(a,e){return 0<=r.a.k((a.className||"").split(/\s+/),e)},Qa:function(a,e,b){var f=r.a.eb(a,e);if(b&&!f)a.className=(a.className||"")+" "+e;else if(f&&!b){for(var b=(a.className||"").split(/\s+/),f="",d=0;d<b.length;d++)b[d]!=e&&(f+=b[d]+" ");a.className=r.a.z(f)}},outerHTML:function(a){if(j===l){var e=a.outerHTML;if("string"==typeof e)return e}e=window.document.createElement("div");
-e.appendChild(a.cloneNode(m));return e.innerHTML},Ma:function(a,e){var b=r.a.d(e);if(b===o||b===l)b="";"innerText"in a?a.innerText=b:a.textContent=b;if(9<=j)a.innerHTML=a.innerHTML},yb:function(a,e){for(var a=r.a.d(a),e=r.a.d(e),b=[],f=a;f<=e;f++)b.push(f);return b},X:function(a){for(var e=[],b=0,f=a.length;b<f;b++)e.push(a[b]);return e},ob:6===j,pb:7===j,Ca:function(a,e){for(var b=r.a.X(a.getElementsByTagName("INPUT")).concat(r.a.X(a.getElementsByTagName("TEXTAREA"))),f="string"==typeof e?function(a){return a.name===
-e}:function(a){return e.test(a.name)},d=[],h=b.length-1;0<=h;h--)f(b[h])&&d.push(b[h]);return d},vb:function(a){return"string"==typeof a&&(a=r.a.z(a))?window.JSON&&window.JSON.parse?window.JSON.parse(a):(new Function("return "+a))():o},qa:function(a){("undefined"==typeof JSON||"undefined"==typeof JSON.stringify)&&c(Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"));
-return JSON.stringify(r.a.d(a))},wb:function(a,e,b){var b=b||{},f=b.params||{},d=b.includeFields||this.Ba,h=a;if("object"==typeof a&&"FORM"==a.tagName)for(var h=a.action,g=d.length-1;0<=g;g--)for(var j=r.a.Ca(a,d[g]),i=j.length-1;0<=i;i--)f[j[i].name]=j[i].value;var e=r.a.d(e),u=document.createElement("FORM");u.style.display="none";u.action=h;u.method="post";for(var y in e)a=document.createElement("INPUT"),a.name=y,a.value=r.a.qa(r.a.d(e[y])),u.appendChild(a);for(y in f)a=document.createElement("INPUT"),
-a.name=y,a.value=f[y],u.appendChild(a);document.body.appendChild(u);b.submitter?b.submitter(u):u.submit();setTimeout(function(){u.parentNode.removeChild(u)},0)}}};r.b("ko.utils",r.a);
-r.a.n([["arrayForEach",r.a.n],["arrayFirst",r.a.Wa],["arrayFilter",r.a.aa],["arrayGetDistinctValues",r.a.ya],["arrayIndexOf",r.a.k],["arrayMap",r.a.ba],["arrayPushAll",r.a.J],["arrayRemoveItem",r.a.ca],["extend",r.a.extend],["fieldsIncludedWithJsonPost",r.a.Ba],["getFormFields",r.a.Ca],["postJson",r.a.wb],["parseJson",r.a.vb],["registerEventHandler",r.a.s],["stringifyJson",r.a.qa],["range",r.a.yb],["toggleDomNodeCssClass",r.a.Qa],["triggerEvent",r.a.sa],["unwrapObservable",r.a.d]],function(a){r.b("ko.utils."+
-a[0],a[1])});Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,d=Array.prototype.slice.call(arguments),a=d.shift();return function(){return b.apply(a,d.concat(Array.prototype.slice.call(arguments)))}});
-r.a.e=new function(){var a=0,b="__ko__"+(new Date).getTime(),d={};return{get:function(a,b){var d=r.a.e.getAll(a,p);return d===l?l:d[b]},set:function(a,b,d){d===l&&r.a.e.getAll(a,p)===l||(r.a.e.getAll(a,m)[b]=d)},getAll:function(e,f){var h=e[b];if(!(h&&"null"!==h)){if(!f)return;h=e[b]="ko"+a++;d[h]={}}return d[h]},clear:function(a){var f=a[b];f&&(delete d[f],a[b]=o)}}};r.b("ko.utils.domData",r.a.e);r.b("ko.utils.domData.clear",r.a.e.clear);
-r.a.A=new function(){function a(a,b){var h=r.a.e.get(a,d);h===l&&b&&(h=[],r.a.e.set(a,d,h));return h}function b(e){var b=a(e,p);if(b)for(var b=b.slice(0),d=0;d<b.length;d++)b[d](e);r.a.e.clear(e);"function"==typeof jQuery&&"function"==typeof jQuery.cleanData&&jQuery.cleanData([e])}var d="__ko_domNodeDisposal__"+(new Date).getTime();return{va:function(e,b){"function"!=typeof b&&c(Error("Callback must be a function"));a(e,m).push(b)},Ia:function(e,b){var h=a(e,p);h&&(r.a.ca(h,b),0==h.length&&r.a.e.set(e,
-d,l))},F:function(a){if(!(1!=a.nodeType&&9!=a.nodeType)){b(a);var f=[];r.a.J(f,a.getElementsByTagName("*"));for(var a=0,d=f.length;a<d;a++)b(f[a])}},removeNode:function(a){r.F(a);a.parentNode&&a.parentNode.removeChild(a)}}};r.F=r.a.A.F;r.removeNode=r.a.A.removeNode;r.b("ko.cleanNode",r.F);r.b("ko.removeNode",r.removeNode);r.b("ko.utils.domNodeDisposal",r.a.A);r.b("ko.utils.domNodeDisposal.addDisposeCallback",r.a.A.va);r.b("ko.utils.domNodeDisposal.removeDisposeCallback",r.a.A.Ia);
-r.a.ma=function(a){var b;if("undefined"!=typeof jQuery){if((b=jQuery.clean([a]))&&b[0]){for(a=b[0];a.parentNode&&11!==a.parentNode.nodeType;)a=a.parentNode;a.parentNode&&a.parentNode.removeChild(a)}}else{var d=r.a.z(a).toLowerCase();b=document.createElement("div");d=d.match(/^<(thead|tbody|tfoot)/)&&[1,"<table>","</table>"]||!d.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!d.indexOf("<td")||!d.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||[0,"",""];a="ignored<div>"+
-d[1]+a+d[2]+"</div>";for("function"==typeof window.innerShiv?b.appendChild(window.innerShiv(a)):b.innerHTML=a;d[0]--;)b=b.lastChild;b=r.a.X(b.lastChild.childNodes)}return b};r.a.Z=function(a,b){r.a.U(a);if(b!==o&&b!==l)if("string"!=typeof b&&(b=b.toString()),"undefined"!=typeof jQuery)jQuery(a).html(b);else for(var d=r.a.ma(b),e=0;e<d.length;e++)a.appendChild(d[e])};r.b("ko.utils.parseHtmlFragment",r.a.ma);r.b("ko.utils.setHtml",r.a.Z);
-r.r=function(){function a(){return(4294967296*(1+Math.random())|0).toString(16).substring(1)}function b(a,f){if(a)if(8==a.nodeType){var d=r.r.Ga(a.nodeValue);d!=o&&f.push({cb:a,tb:d})}else if(1==a.nodeType)for(var d=0,g=a.childNodes,i=g.length;d<i;d++)b(g[d],f)}var d={};return{ka:function(b){"function"!=typeof b&&c(Error("You can only pass a function to ko.memoization.memoize()"));var f=a()+a();d[f]=b;return"<\!--[ko_memo:"+f+"]--\>"},Ra:function(a,b){var h=d[a];h===l&&c(Error("Couldn't find any memo with ID "+
-a+". Perhaps it's already been unmemoized."));try{return h.apply(o,b||[]),m}finally{delete d[a]}},Sa:function(a,f){var d=[];b(a,d);for(var g=0,i=d.length;g<i;g++){var j=d[g].cb,k=[j];f&&r.a.J(k,f);r.r.Ra(d[g].tb,k);j.nodeValue="";j.parentNode&&j.parentNode.removeChild(j)}},Ga:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:o}}}();r.b("ko.memoization",r.r);r.b("ko.memoization.memoize",r.r.ka);r.b("ko.memoization.unmemoize",r.r.Ra);r.b("ko.memoization.parseMemoText",r.r.Ga);
-r.b("ko.memoization.unmemoizeDomNodeAndDescendants",r.r.Sa);r.Aa={throttle:function(a,b){a.throttleEvaluation=b;var d=o;return r.i({read:a,write:function(e){clearTimeout(d);d=setTimeout(function(){a(e)},b)}})},notify:function(a,b){a.equalityComparer="always"==b?function(){return p}:r.w.fn.equalityComparer;return a}};r.b("ko.extenders",r.Aa);r.Oa=function(a,b){this.da=a;this.bb=b;r.l(this,"dispose",this.v)};r.Oa.prototype.v=function(){this.nb=m;this.bb()};
-r.R=function(){this.u={};r.a.extend(this,r.R.fn);r.l(this,"subscribe",this.ra);r.l(this,"extend",this.extend);r.l(this,"getSubscriptionsCount",this.kb)};
-r.R.fn={ra:function(a,b,d){var d=d||"change",a=b?a.bind(b):a,e=new r.Oa(a,function(){r.a.ca(this.u[d],e)}.bind(this));this.u[d]||(this.u[d]=[]);this.u[d].push(e);return e},notifySubscribers:function(a,b){b=b||"change";this.u[b]&&r.a.n(this.u[b].slice(0),function(b){b&&b.nb!==m&&b.da(a)})},kb:function(){var a=0,b;for(b in this.u)this.u.hasOwnProperty(b)&&(a+=this.u[b].length);return a},extend:function(a){var b=this;if(a)for(var d in a){var e=r.Aa[d];"function"==typeof e&&(b=e(b,a[d]))}return b}};
-r.Ea=function(a){return"function"==typeof a.ra&&"function"==typeof a.notifySubscribers};r.b("ko.subscribable",r.R);r.b("ko.isSubscribable",r.Ea);r.T=function(){var a=[];return{Xa:function(b){a.push({da:b,za:[]})},end:function(){a.pop()},Ha:function(b){r.Ea(b)||c("Only subscribable things can act as dependencies");if(0<a.length){var d=a[a.length-1];0<=r.a.k(d.za,b)||(d.za.push(b),d.da(b))}}}}();var B={undefined:m,"boolean":m,number:m,string:m};
-r.w=function(a){function b(){if(0<arguments.length){if(!b.equalityComparer||!b.equalityComparer(d,arguments[0]))b.H(),d=arguments[0],b.G();return this}r.T.Ha(b);return d}var d=a;r.R.call(b);b.G=function(){b.notifySubscribers(d)};b.H=function(){b.notifySubscribers(d,"beforeChange")};r.a.extend(b,r.w.fn);r.l(b,"valueHasMutated",b.G);r.l(b,"valueWillMutate",b.H);return b};r.w.fn={B:r.w,equalityComparer:function(a,b){return a===o||typeof a in B?a===b:p}};
-r.V=function(a){return a===o||a===l||a.B===l?p:a.B===r.w?m:r.V(a.B)};r.P=function(a){return"function"==typeof a&&a.B===r.w?m:"function"==typeof a&&a.B===r.i&&a.lb?m:p};r.b("ko.observable",r.w);r.b("ko.isObservable",r.V);r.b("ko.isWriteableObservable",r.P);
-r.Q=function(a){0==arguments.length&&(a=[]);a!==o&&a!==l&&!("length"in a)&&c(Error("The argument passed when initializing an observable array must be an array, or null, or undefined."));var b=new r.w(a);r.a.extend(b,r.Q.fn);r.l(b,"remove",b.remove);r.l(b,"removeAll",b.zb);r.l(b,"destroy",b.fa);r.l(b,"destroyAll",b.ab);r.l(b,"indexOf",b.indexOf);r.l(b,"replace",b.replace);return b};
-r.Q.fn={remove:function(a){for(var b=this(),d=[],e="function"==typeof a?a:function(b){return b===a},f=0;f<b.length;f++){var h=b[f];e(h)&&(0===d.length&&this.H(),d.push(h),b.splice(f,1),f--)}d.length&&this.G();return d},zb:function(a){if(a===l){var b=this(),d=b.slice(0);this.H();b.splice(0,b.length);this.G();return d}return!a?[]:this.remove(function(b){return 0<=r.a.k(a,b)})},fa:function(a){var b=this(),d="function"==typeof a?a:function(b){return b===a};this.H();for(var e=b.length-1;0<=e;e--)d(b[e])&&
-(b[e]._destroy=m);this.G()},ab:function(a){return a===l?this.fa(function(){return m}):!a?[]:this.fa(function(b){return 0<=r.a.k(a,b)})},indexOf:function(a){var b=this();return r.a.k(b,a)},replace:function(a,b){var d=this.indexOf(a);0<=d&&(this.H(),this()[d]=b,this.G())}};r.a.n("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){r.Q.fn[a]=function(){var b=this();this.H();b=b[a].apply(b,arguments);this.G();return b}});
-r.a.n(["slice"],function(a){r.Q.fn[a]=function(){var b=this();return b[a].apply(b,arguments)}});r.b("ko.observableArray",r.Q);function C(a,b){a&&"object"==typeof a?b=a:(b=b||{},b.read=a||b.read);"function"!=typeof b.read&&c("Pass a function that returns the value of the dependentObservable");return b}
-r.i=function(a,b,d){function e(){r.a.n(q,function(a){a.v()});q=[]}function f(){var a=g.throttleEvaluation;a&&0<=a?(clearTimeout(v),v=setTimeout(h,a)):h()}function h(){if(j&&"function"==typeof d.disposeWhen&&d.disposeWhen())g.v();else{try{e();r.T.Xa(function(a){q.push(a.ra(f))});var a=d.read.call(d.owner||b);g.notifySubscribers(i,"beforeChange");i=a}finally{r.T.end()}g.notifySubscribers(i);j=m}}function g(){if(0<arguments.length)"function"===typeof d.write?d.write.apply(d.owner||b,arguments):c("Cannot write a value to a dependentObservable unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
-else return j||h(),r.T.Ha(g),i}var i,j=p,d=C(a,d),k="object"==typeof d.disposeWhenNodeIsRemoved?d.disposeWhenNodeIsRemoved:o,n=o;if(k){n=function(){g.v()};r.a.A.va(k,n);var t=d.disposeWhen;d.disposeWhen=function(){return!r.a.ga(k)||"function"==typeof t&&t()}}var q=[],v=o;g.jb=function(){return q.length};g.lb="function"===typeof d.write;g.v=function(){k&&r.a.A.Ia(k,n);e()};r.R.call(g);r.a.extend(g,r.i.fn);d.deferEvaluation!==m&&h();r.l(g,"dispose",g.v);r.l(g,"getDependenciesCount",g.jb);return g};
-r.i.fn={B:r.i};r.i.B=r.w;r.b("ko.dependentObservable",r.i);r.b("ko.computed",r.i);
-(function(){function a(e,f,h){h=h||new d;e=f(e);if(!("object"==typeof e&&e!==o&&e!==l&&!(e instanceof Date)))return e;var g=e instanceof Array?[]:{};h.save(e,g);b(e,function(b){var d=f(e[b]);switch(typeof d){case "boolean":case "number":case "string":case "function":g[b]=d;break;case "object":case "undefined":var k=h.get(d);g[b]=k!==l?k:a(d,f,h)}});return g}function b(a,b){if(a instanceof Array)for(var d=0;d<a.length;d++)b(d);else for(d in a)b(d)}function d(){var a=[],b=[];this.save=function(d,g){var i=
-r.a.k(a,d);0<=i?b[i]=g:(a.push(d),b.push(g))};this.get=function(d){d=r.a.k(a,d);return 0<=d?b[d]:l}}r.Pa=function(b){0==arguments.length&&c(Error("When calling ko.toJS, pass the object you want to convert."));return a(b,function(a){for(var b=0;r.V(a)&&10>b;b++)a=a();return a})};r.toJSON=function(a){a=r.Pa(a);return r.a.qa(a)}})();r.b("ko.toJS",r.Pa);r.b("ko.toJSON",r.toJSON);
-r.h={q:function(a){return"OPTION"==a.tagName?a.__ko__hasDomDataOptionValue__===m?r.a.e.get(a,r.c.options.la):a.getAttribute("value"):"SELECT"==a.tagName?0<=a.selectedIndex?r.h.q(a.options[a.selectedIndex]):l:a.value},S:function(a,b){if("OPTION"==a.tagName)switch(typeof b){case "string":r.a.e.set(a,r.c.options.la,l);"__ko__hasDomDataOptionValue__"in a&&delete a.__ko__hasDomDataOptionValue__;a.value=b;break;default:r.a.e.set(a,r.c.options.la,b),a.__ko__hasDomDataOptionValue__=m,a.value="number"===typeof b?
-b:""}else if("SELECT"==a.tagName)for(var d=a.options.length-1;0<=d;d--){if(r.h.q(a.options[d])==b){a.selectedIndex=d;break}}else{if(b===o||b===l)b="";a.value=b}}};r.b("ko.selectExtensions",r.h);r.b("ko.selectExtensions.readValue",r.h.q);r.b("ko.selectExtensions.writeValue",r.h.S);
-r.j=function(){function a(a,e){for(var d=o;a!=d;)d=a,a=a.replace(b,function(a,b){return e[b]});return a}var b=/\@ko_token_(\d+)\@/g,d=/^[\_$a-z][\_$a-z0-9]*(\[.*?\])*(\.[\_$a-z][\_$a-z0-9]*(\[.*?\])*)*$/i,e=["true","false"];return{D:[],Y:function(b){var e=r.a.z(b);if(3>e.length)return[];"{"===e.charAt(0)&&(e=e.substring(1,e.length-1));for(var b=[],d=o,i,j=0;j<e.length;j++){var k=e.charAt(j);if(d===o)switch(k){case '"':case "'":case "/":d=j,i=k}else if(k==i&&"\\"!==e.charAt(j-1)){k=e.substring(d,j+
-1);b.push(k);var n="@ko_token_"+(b.length-1)+"@",e=e.substring(0,d)+n+e.substring(j+1),j=j-(k.length-n.length),d=o}}i=d=o;for(var t=0,q=o,j=0;j<e.length;j++){k=e.charAt(j);if(d===o)switch(k){case "{":d=j;q=k;i="}";break;case "(":d=j;q=k;i=")";break;case "[":d=j,q=k,i="]"}k===q?t++:k===i&&(t--,0===t&&(k=e.substring(d,j+1),b.push(k),n="@ko_token_"+(b.length-1)+"@",e=e.substring(0,d)+n+e.substring(j+1),j-=k.length-n.length,d=o))}i=[];e=e.split(",");d=0;for(j=e.length;d<j;d++)t=e[d],q=t.indexOf(":"),
-0<q&&q<t.length-1?(k=t.substring(q+1),i.push({key:a(t.substring(0,q),b),value:a(k,b)})):i.push({unknown:a(t,b)});return i},ia:function(a){for(var b="string"===typeof a?r.j.Y(a):a,g=[],a=[],i,j=0;i=b[j];j++)if(0<g.length&&g.push(","),i.key){var k;a:{k=i.key;var n=r.a.z(k);switch(n.length&&n.charAt(0)){case "'":case '"':break a;default:k="'"+n+"'"}}i=i.value;g.push(k);g.push(":");g.push(i);n=r.a.z(i);if(0<=r.a.k(e,r.a.z(n).toLowerCase())?0:n.match(d)!==o)0<a.length&&a.push(", "),a.push(k+" : function(__ko_value) { "+
-i+" = __ko_value; }")}else i.unknown&&g.push(i.unknown);b=g.join("");0<a.length&&(b=b+", '_ko_property_writers' : { "+a.join("")+" } ");return b},rb:function(a,b){for(var e=0;e<a.length;e++)if(r.a.z(a[e].key)==b)return m;return p}}}();r.b("ko.jsonExpressionRewriting",r.j);r.b("ko.jsonExpressionRewriting.bindingRewriteValidators",r.j.D);r.b("ko.jsonExpressionRewriting.parseObjectLiteral",r.j.Y);r.b("ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson",r.j.ia);
-(function(){function a(a){return 8==a.nodeType&&(f?a.text:a.nodeValue).match(h)}function b(a){return 8==a.nodeType&&(f?a.text:a.nodeValue).match(g)}function d(e,d){for(var f=e,g=1,h=[];f=f.nextSibling;){if(b(f)&&(g--,0===g))return h;h.push(f);a(f)&&g++}d||c(Error("Cannot find closing comment tag to match: "+e.nodeValue));return o}function e(a,b){var e=d(a,b);return e?0<e.length?e[e.length-1].nextSibling:a.nextSibling:o}var f="<\!--test--\>"===document.createComment("test").text,h=f?/^<\!--\s*ko\s+(.*\:.*)\s*--\>$/:
-/^\s*ko\s+(.*\:.*)\s*$/,g=f?/^<\!--\s*\/ko\s*--\>$/:/^\s*\/ko\s*$/,i={ul:m,ol:m};r.f={C:{},childNodes:function(b){return a(b)?d(b):b.childNodes},ha:function(b){if(a(b))for(var b=r.f.childNodes(b),e=0,d=b.length;e<d;e++)r.removeNode(b[e]);else r.a.U(b)},oa:function(b,e){if(a(b)){r.f.ha(b);for(var d=b.nextSibling,f=0,g=e.length;f<g;f++)d.parentNode.insertBefore(e[f],d)}else r.a.oa(b,e)},xb:function(b,e){a(b)?b.parentNode.insertBefore(e,b.nextSibling):b.firstChild?b.insertBefore(e,b.firstChild):b.appendChild(e)},
-mb:function(b,e,d){a(b)?b.parentNode.insertBefore(e,d.nextSibling):d.nextSibling?b.insertBefore(e,d.nextSibling):b.appendChild(e)},nextSibling:function(d){return a(d)?e(d).nextSibling:d.nextSibling&&b(d.nextSibling)?l:d.nextSibling},ta:function(b){return(b=a(b))?b[1]:o},ib:function(a){if(r.f.ta(a)){var b;b=r.f.childNodes(a);for(var e=[],d=0,f=b.length;d<f;d++)r.a.A.F(b[d]),e.push(r.a.outerHTML(b[d]));b=String.prototype.concat.apply("",e);r.f.ha(a);(new r.m.I(a)).text(b)}},Fa:function(d){if(i[d.tagName.toLowerCase()]){var f=
-d.firstChild;if(f){do if(1===f.nodeType){var g;g=f.firstChild;var h=o;if(g){do if(h)h.push(g);else if(a(g)){var q=e(g,m);q?g=q:h=[g]}else b(g)&&(h=[g]);while(g=g.nextSibling)}if(g=h){h=f.nextSibling;for(q=0;q<g.length;q++)h?d.insertBefore(g[q],h):d.appendChild(g[q])}}while(f=f.nextSibling)}}}}})();r.L=function(){};
-r.a.extend(r.L.prototype,{nodeHasBindings:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind")!=o;case 8:return r.f.ta(a)!=o;default:return p}},getBindings:function(a,b){var d=this.getBindingsString(a,b);return d?this.parseBindingsString(d,b):o},getBindingsString:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind");case 8:return r.f.ta(a);default:return o}},parseBindingsString:function(a,b){try{var d=b.$data,e=" { "+r.j.ia(a)+" } ";return r.a.hb(e,d===o?window:
-d,b)}catch(f){c(Error("Unable to parse bindings.\nMessage: "+f+";\nBindings value: "+a))}}});r.L.instance=new r.L;r.b("ko.bindingProvider",r.L);
-(function(){function a(a,d){for(var h,g=d.childNodes[0];h=g;)g=r.f.nextSibling(h),b(a,h,p)}function b(b,f,h){var g=m,i=1==f.nodeType;i&&r.f.Fa(f);if(i&&h||r.L.instance.nodeHasBindings(f))g=d(f,o,b,h).Bb;i&&g&&a(b,f)}function d(a,b,d,g){function i(a){return function(){return n[a]}}function j(){return n}var k=0;r.f.ib(a);var n,t;new r.i(function(){var q=d&&d instanceof r.K?d:new r.K(r.a.d(d)),v=q.$data;g&&r.Na(a,q);if(n=("function"==typeof b?b():b)||r.L.instance.getBindings(a,q)){if(0===k){k=1;for(var s in n){var w=
-r.c[s];w&&8===a.nodeType&&!r.f.C[s]&&c(Error("The binding '"+s+"' cannot be used with virtual elements"));if(w&&"function"==typeof w.init&&(w=(0,w.init)(a,i(s),j,v,q))&&w.controlsDescendantBindings)t!==l&&c(Error("Multiple bindings ("+t+" and "+s+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.")),t=s}k=2}if(2===k)for(s in n)(w=r.c[s])&&"function"==typeof w.update&&(0,w.update)(a,i(s),j,v,q)}},o,{disposeWhenNodeIsRemoved:a});
-return{Bb:t===l}}r.c={};r.K=function(a,b){this.$data=a;b?(this.$parent=b.$data,this.$parents=(b.$parents||[]).slice(0),this.$parents.unshift(this.$parent),this.$root=b.$root):(this.$parents=[],this.$root=a)};r.K.prototype.createChildContext=function(a){return new r.K(a,this)};r.Na=function(a,b){if(2==arguments.length)r.a.e.set(a,"__ko_bindingContext__",b);else return r.a.e.get(a,"__ko_bindingContext__")};r.xa=function(a,b,h){1===a.nodeType&&r.f.Fa(a);return d(a,b,h,m)};r.Ta=function(b,d){1===d.nodeType&&
-a(b,d)};r.wa=function(a,d){d&&1!==d.nodeType&&8!==d.nodeType&&c(Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"));d=d||window.document.body;b(a,d,m)};r.ea=function(a){switch(a.nodeType){case 1:case 8:var b=r.Na(a);if(b)return b;if(a.parentNode)return r.ea(a.parentNode)}};r.$a=function(a){return(a=r.ea(a))?a.$data:l};r.b("ko.bindingHandlers",r.c);r.b("ko.applyBindings",r.wa);r.b("ko.applyBindingsToDescendants",r.Ta);r.b("ko.applyBindingsToNode",
-r.xa);r.b("ko.contextFor",r.ea);r.b("ko.dataFor",r.$a)})();r.a.n(["click"],function(a){r.c[a]={init:function(b,d,e,f){return r.c.event.init.call(this,b,function(){var b={};b[a]=d();return b},e,f)}}});
-r.c.event={init:function(a,b,d,e){var f=b()||{},h;for(h in f)(function(){var f=h;"string"==typeof f&&r.a.s(a,f,function(a){var h,k=b()[f];if(k){var n=d();try{var t=r.a.X(arguments);t.unshift(e);h=k.apply(e,t)}finally{if(h!==m)a.preventDefault?a.preventDefault():a.returnValue=p}if(n[f+"Bubble"]===p)a.cancelBubble=m,a.stopPropagation&&a.stopPropagation()}})})()}};
-r.c.submit={init:function(a,b,d,e){"function"!=typeof b()&&c(Error("The value for a submit binding must be a function"));r.a.s(a,"submit",function(d){var h,g=b();try{h=g.call(e,a)}finally{if(h!==m)d.preventDefault?d.preventDefault():d.returnValue=p}})}};r.c.visible={update:function(a,b){var d=r.a.d(b()),e="none"!=a.style.display;if(d&&!e)a.style.display="";else if(!d&&e)a.style.display="none"}};
-r.c.enable={update:function(a,b){var d=r.a.d(b());if(d&&a.disabled)a.removeAttribute("disabled");else if(!d&&!a.disabled)a.disabled=m}};r.c.disable={update:function(a,b){r.c.enable.update(a,function(){return!r.a.d(b())})}};function D(a,b,d){d&&b!==r.h.q(a)&&r.h.S(a,b);b!==r.h.q(a)&&r.a.sa(a,"change")}
-r.c.value={init:function(a,b,d){var e=["change"],f=d().valueUpdate;f&&("string"==typeof f&&(f=[f]),r.a.J(e,f),e=r.a.ya(e));r.a.n(e,function(e){var f=p;r.a.Cb(e,"after")&&(f=m,e=e.substring(5));var i=f?function(a){setTimeout(a,0)}:function(a){a()};r.a.s(a,e,function(){i(function(){var e=b(),f=r.h.q(a);r.P(e)?e(f):(e=d(),e._ko_property_writers&&e._ko_property_writers.value&&e._ko_property_writers.value(f))})})})},update:function(a,b){var d=r.a.d(b()),e=r.h.q(a),f=d!=e;0===d&&0!==e&&"0"!==e&&(f=m);f&&
-(e=function(){r.h.S(a,d)},e(),"SELECT"==a.tagName&&setTimeout(e,0));"SELECT"==a.tagName&&0<a.length&&D(a,d,p)}};
-r.c.options={update:function(a,b,d){"SELECT"!=a.tagName&&c(Error("options binding applies only to SELECT elements"));var e=0==a.length,f=r.a.ba(r.a.aa(a.childNodes,function(a){return a.tagName&&"OPTION"==a.tagName&&a.selected}),function(a){return r.h.q(a)||a.innerText||a.textContent}),h=a.scrollTop;a.scrollTop=0;for(var g=r.a.d(b());0<a.length;)r.F(a.options[0]),a.remove(0);if(g){d=d();"number"!=typeof g.length&&(g=[g]);if(d.optionsCaption){var i=document.createElement("OPTION");r.a.Z(i,d.optionsCaption);
-r.h.S(i,l);a.appendChild(i)}for(var b=0,j=g.length;b<j;b++){var i=document.createElement("OPTION"),k="string"==typeof d.optionsValue?g[b][d.optionsValue]:g[b],k=r.a.d(k);r.h.S(i,k);var n=d.optionsText,k="function"==typeof n?n(g[b]):"string"==typeof n?g[b][n]:k;if(k===o||k===l)k="";r.a.Ma(i,k);a.appendChild(i)}g=a.getElementsByTagName("OPTION");b=i=0;for(j=g.length;b<j;b++)0<=r.a.k(f,r.h.q(g[b]))&&(r.a.La(g[b],m),i++);if(h)a.scrollTop=h;e&&"value"in d&&D(a,r.a.d(d.value),m)}}};r.c.options.la="__ko.optionValueDomData__";
-r.c.selectedOptions={Da:function(a){for(var b=[],a=a.childNodes,d=0,e=a.length;d<e;d++){var f=a[d];"OPTION"==f.tagName&&f.selected&&b.push(r.h.q(f))}return b},init:function(a,b,d){r.a.s(a,"change",function(){var a=b();r.P(a)?a(r.c.selectedOptions.Da(this)):(a=d(),a._ko_property_writers&&a._ko_property_writers.value&&a._ko_property_writers.value(r.c.selectedOptions.Da(this)))})},update:function(a,b){"SELECT"!=a.tagName&&c(Error("values binding applies only to SELECT elements"));var d=r.a.d(b());if(d&&
-"number"==typeof d.length)for(var e=a.childNodes,f=0,h=e.length;f<h;f++){var g=e[f];"OPTION"==g.tagName&&r.a.La(g,0<=r.a.k(d,r.h.q(g)))}}};r.c.text={update:function(a,b){r.a.Ma(a,b())}};r.c.html={init:function(){return{controlsDescendantBindings:m}},update:function(a,b){var d=r.a.d(b());r.a.Z(a,d)}};r.c.css={update:function(a,b){var d=r.a.d(b()||{}),e;for(e in d)if("string"==typeof e){var f=r.a.d(d[e]);r.a.Qa(a,e,f)}}};
-r.c.style={update:function(a,b){var d=r.a.d(b()||{}),e;for(e in d)if("string"==typeof e){var f=r.a.d(d[e]);a.style[e]=f||""}}};r.c.uniqueName={init:function(a,b){if(b())a.name="ko_unique_"+ ++r.c.uniqueName.Za,(r.a.ob||r.a.pb)&&a.mergeAttributes(document.createElement("<input name='"+a.name+"'/>"),p)}};r.c.uniqueName.Za=0;
-r.c.checked={init:function(a,b,d){r.a.s(a,"click",function(){var e;if("checkbox"==a.type)e=a.checked;else if("radio"==a.type&&a.checked)e=a.value;else return;var f=b();"checkbox"==a.type&&r.a.d(f)instanceof Array?(e=r.a.k(r.a.d(f),a.value),a.checked&&0>e?f.push(a.value):!a.checked&&0<=e&&f.splice(e,1)):r.P(f)?f()!==e&&f(e):(f=d(),f._ko_property_writers&&f._ko_property_writers.checked&&f._ko_property_writers.checked(e))});"radio"==a.type&&!a.name&&r.c.uniqueName.init(a,function(){return m})},update:function(a,
-b){var d=r.a.d(b());if("checkbox"==a.type)a.checked=d instanceof Array?0<=r.a.k(d,a.value):d;else if("radio"==a.type)a.checked=a.value==d}};r.c.attr={update:function(a,b){var d=r.a.d(b())||{},e;for(e in d)if("string"==typeof e){var f=r.a.d(d[e]);f===p||f===o||f===l?a.removeAttribute(e):a.setAttribute(e,f.toString())}}};
-r.c.hasfocus={init:function(a,b,d){function e(a){var e=b();a!=r.a.d(e)&&(r.P(e)?e(a):(e=d(),e._ko_property_writers&&e._ko_property_writers.hasfocus&&e._ko_property_writers.hasfocus(a)))}r.a.s(a,"focus",function(){e(m)});r.a.s(a,"focusin",function(){e(m)});r.a.s(a,"blur",function(){e(p)});r.a.s(a,"focusout",function(){e(p)})},update:function(a,b){var d=r.a.d(b());d?a.focus():a.blur();r.a.sa(a,d?"focusin":"focusout")}};
-r.c["with"]={o:function(a){return function(){var b=a();return{"if":b,data:b,templateEngine:r.p.M}}},init:function(a,b){return r.c.template.init(a,r.c["with"].o(b))},update:function(a,b,d,e,f){return r.c.template.update(a,r.c["with"].o(b),d,e,f)}};r.j.D["with"]=p;r.f.C["with"]=m;r.c["if"]={o:function(a){return function(){return{"if":a(),templateEngine:r.p.M}}},init:function(a,b){return r.c.template.init(a,r.c["if"].o(b))},update:function(a,b,d,e,f){return r.c.template.update(a,r.c["if"].o(b),d,e,f)}};
-r.j.D["if"]=p;r.f.C["if"]=m;r.c.ifnot={o:function(a){return function(){return{ifnot:a(),templateEngine:r.p.M}}},init:function(a,b){return r.c.template.init(a,r.c.ifnot.o(b))},update:function(a,b,d,e,f){return r.c.template.update(a,r.c.ifnot.o(b),d,e,f)}};r.j.D.ifnot=p;r.f.C.ifnot=m;
-r.c.foreach={o:function(a){return function(){var b=r.a.d(a());return!b||"number"==typeof b.length?{foreach:b,templateEngine:r.p.M}:{foreach:b.data,includeDestroyed:b.includeDestroyed,afterAdd:b.afterAdd,beforeRemove:b.beforeRemove,afterRender:b.afterRender,templateEngine:r.p.M}}},init:function(a,b){return r.c.template.init(a,r.c.foreach.o(b))},update:function(a,b,d,e,f){return r.c.template.update(a,r.c.foreach.o(b),d,e,f)}};r.j.D.foreach=p;r.f.C.foreach=m;r.b("ko.allowedVirtualElementBindings",r.f.C);
-r.t=function(){};r.t.prototype.renderTemplateSource=function(){c("Override renderTemplateSource")};r.t.prototype.createJavaScriptEvaluatorBlock=function(){c("Override createJavaScriptEvaluatorBlock")};r.t.prototype.makeTemplateSource=function(a){if("string"==typeof a){var b=document.getElementById(a);b||c(Error("Cannot find template with ID "+a));return new r.m.g(b)}if(1==a.nodeType||8==a.nodeType)return new r.m.I(a);c(Error("Unknown template type: "+a))};
-r.t.prototype.renderTemplate=function(a,b,d){return this.renderTemplateSource(this.makeTemplateSource(a),b,d)};r.t.prototype.isTemplateRewritten=function(a){return this.allowTemplateRewriting===p?m:this.W&&this.W[a]?m:this.makeTemplateSource(a).data("isRewritten")};r.t.prototype.rewriteTemplate=function(a,b){var d=this.makeTemplateSource(a),e=b(d.text());d.text(e);d.data("isRewritten",m);if("string"==typeof a)this.W=this.W||{},this.W[a]=m};r.b("ko.templateEngine",r.t);
-r.$=function(){function a(a,b,d){for(var a=r.j.Y(a),g=r.j.D,i=0;i<a.length;i++){var j=a[i].key;if(g.hasOwnProperty(j)){var k=g[j];"function"===typeof k?(j=k(a[i].value))&&c(Error(j)):k||c(Error("This template engine does not support the '"+j+"' binding within its templates"))}}a="ko.templateRewriting.applyMemoizedBindingsToNextSibling(function() {             return (function() { return { "+r.j.ia(a)+" } })()         })";return d.createJavaScriptEvaluatorBlock(a)+b}var b=/(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi,
-d=/<\!--\s*ko\b\s*([\s\S]*?)\s*--\>/g;return{gb:function(a,b){b.isTemplateRewritten(a)||b.rewriteTemplate(a,function(a){return r.$.ub(a,b)})},ub:function(e,f){return e.replace(b,function(b,e,d,j,k,n,t){return a(t,e,f)}).replace(d,function(b,e){return a(e,"<\!-- ko --\>",f)})},Ua:function(a){return r.r.ka(function(b,d){b.nextSibling&&r.xa(b.nextSibling,a,d)})}}}();r.b("ko.templateRewriting",r.$);r.b("ko.templateRewriting.applyMemoizedBindingsToNextSibling",r.$.Ua);r.m={};r.m.g=function(a){this.g=a};
-r.m.g.prototype.text=function(){if(0==arguments.length)return"script"==this.g.tagName.toLowerCase()?this.g.text:this.g.innerHTML;var a=arguments[0];"script"==this.g.tagName.toLowerCase()?this.g.text=a:r.a.Z(this.g,a)};r.m.g.prototype.data=function(a){if(1===arguments.length)return r.a.e.get(this.g,"templateSourceData_"+a);r.a.e.set(this.g,"templateSourceData_"+a,arguments[1])};r.m.I=function(a){this.g=a};r.m.I.prototype=new r.m.g;
-r.m.I.prototype.text=function(){if(0==arguments.length)return r.a.e.get(this.g,"__ko_anon_template__");r.a.e.set(this.g,"__ko_anon_template__",arguments[0])};r.b("ko.templateSources",r.m);r.b("ko.templateSources.domElement",r.m.g);r.b("ko.templateSources.anonymousTemplate",r.m.I);
-(function(){function a(a,b,d){for(var g=0;node=a[g];g++)node.parentNode===b&&(1===node.nodeType||8===node.nodeType)&&d(node)}function b(a,b,h,g,i){var i=i||{},j=i.templateEngine||d;r.$.gb(h,j);h=j.renderTemplate(h,g,i);("number"!=typeof h.length||0<h.length&&"number"!=typeof h[0].nodeType)&&c("Template engine must return an array of DOM nodes");j=p;switch(b){case "replaceChildren":r.f.oa(a,h);j=m;break;case "replaceNode":r.a.Ja(a,h);j=m;break;case "ignoreTargetNode":break;default:c(Error("Unknown renderMode: "+
-b))}j&&(r.ua(h,g),i.afterRender&&i.afterRender(h,g.$data));return h}var d;r.pa=function(a){a!=l&&!(a instanceof r.t)&&c("templateEngine must inherit from ko.templateEngine");d=a};r.ua=function(b,d){var h=r.a.J([],b),g=0<b.length?b[0].parentNode:o;a(h,g,function(a){r.wa(d,a)});a(h,g,function(a){r.r.Sa(a,[d])})};r.na=function(a,f,h,g,i){h=h||{};(h.templateEngine||d)==l&&c("Set a template engine before calling renderTemplate");i=i||"replaceChildren";if(g){var j=g.nodeType?g:0<g.length?g[0]:o;return new r.i(function(){var d=
-f&&f instanceof r.K?f:new r.K(r.a.d(f)),n="function"==typeof a?a(d.$data):a,d=b(g,i,n,d,h);"replaceNode"==i&&(g=d,j=g.nodeType?g:0<g.length?g[0]:o)},o,{disposeWhen:function(){return!j||!r.a.ga(j)},disposeWhenNodeIsRemoved:j&&"replaceNode"==i?j.parentNode:j})}return r.r.ka(function(b){r.na(a,f,h,b,"replaceNode")})};r.Ab=function(a,d,h,g,i){function j(a,b){var d=k(a);r.ua(b,d);h.afterRender&&h.afterRender(b,d.$data)}function k(a){return i.createChildContext(r.a.d(a))}return new r.i(function(){var i=
-r.a.d(d)||[];"undefined"==typeof i.length&&(i=[i]);i=r.a.aa(i,function(a){return h.includeDestroyed||a===l||a===o||!r.a.d(a._destroy)});r.a.Ka(g,i,function(d){var f="function"==typeof a?a(d):a;return b(o,"ignoreTargetNode",f,k(d),h)},h,j)},o,{disposeWhenNodeIsRemoved:g})};r.c.template={init:function(a,b){var d=r.a.d(b());"string"!=typeof d&&!d.name&&1==a.nodeType&&((new r.m.I(a)).text(a.innerHTML),r.a.U(a));return{controlsDescendantBindings:m}},update:function(a,b,d,g,i){b=r.a.d(b());g=m;"string"==
-typeof b?d=b:(d=b.name,"if"in b&&(g=g&&r.a.d(b["if"])),"ifnot"in b&&(g=g&&!r.a.d(b.ifnot)));var j=o;"object"===typeof b&&"foreach"in b?j=r.Ab(d||a,g&&b.foreach||[],b,a,i):g?(i="object"==typeof b&&"data"in b?i.createChildContext(r.a.d(b.data)):i,j=r.na(d||a,i,b,a)):r.f.ha(a);i=j;(b=r.a.e.get(a,"__ko__templateSubscriptionDomDataKey__"))&&"function"==typeof b.v&&b.v();r.a.e.set(a,"__ko__templateSubscriptionDomDataKey__",i)}};r.j.D.template=function(a){a=r.j.Y(a);return 1==a.length&&a[0].unknown?o:r.j.rb(a,
-"name")?o:"This template engine does not support anonymous templates nested within its templates"};r.f.C.template=m})();r.b("ko.setTemplateEngine",r.pa);r.b("ko.renderTemplate",r.na);
-r.a.N=function(a,b,d){if(d===l)return r.a.N(a,b,1)||r.a.N(a,b,10)||r.a.N(a,b,Number.MAX_VALUE);for(var a=a||[],b=b||[],e=a,f=b,h=[],g=0;g<=f.length;g++)h[g]=[];for(var g=0,i=Math.min(e.length,d);g<=i;g++)h[0][g]=g;g=1;for(i=Math.min(f.length,d);g<=i;g++)h[g][0]=g;for(var i=e.length,j,k=f.length,g=1;g<=i;g++){j=Math.max(1,g-d);for(var n=Math.min(k,g+d);j<=n;j++)h[j][g]=e[g-1]===f[j-1]?h[j-1][g-1]:Math.min(h[j-1][g]===l?Number.MAX_VALUE:h[j-1][g]+1,h[j][g-1]===l?Number.MAX_VALUE:h[j][g-1]+1)}d=a.length;
-e=b.length;f=[];g=h[e][d];if(g===l)h=o;else{for(;0<d||0<e;){i=h[e][d];k=0<e?h[e-1][d]:g+1;n=0<d?h[e][d-1]:g+1;j=0<e&&0<d?h[e-1][d-1]:g+1;if(k===l||k<i-1)k=g+1;if(n===l||n<i-1)n=g+1;j<i-1&&(j=g+1);k<=n&&k<j?(f.push({status:"added",value:b[e-1]}),e--):(n<k&&n<j?f.push({status:"deleted",value:a[d-1]}):(f.push({status:"retained",value:a[d-1]}),e--),d--)}h=f.reverse()}return h};r.b("ko.utils.compareArrays",r.a.N);
-(function(){function a(a){if(2<a.length){for(var b=a[0],f=a[a.length-1],h=[b];b!==f;){b=b.nextSibling;if(!b)return;h.push(b)}Array.prototype.splice.apply(a,[0,a.length].concat(h))}}function b(b,e,f,h){var g=[],b=r.i(function(){var b=e(f)||[];0<g.length&&(a(g),r.a.Ja(g,b),h&&h(f,b));g.splice(0,g.length);r.a.J(g,b)},o,{disposeWhenNodeIsRemoved:b,disposeWhen:function(){return 0==g.length||!r.a.ga(g[0])}});return{sb:g,i:b}}r.a.Ka=function(d,e,f,h,g){for(var e=e||[],h=h||{},i=r.a.e.get(d,"setDomNodeChildrenFromArrayMapping_lastMappingResult")===
-l,j=r.a.e.get(d,"setDomNodeChildrenFromArrayMapping_lastMappingResult")||[],k=r.a.ba(j,function(a){return a.Va}),n=r.a.N(k,e),e=[],t=0,q=[],k=[],v=o,s=0,w=n.length;s<w;s++)switch(n[s].status){case "retained":var x=j[t];e.push(x);0<x.O.length&&(v=x.O[x.O.length-1]);t++;break;case "deleted":j[t].i.v();a(j[t].O);r.a.n(j[t].O,function(a){q.push({element:a,index:s,value:n[s].value});v=a});t++;break;case "added":var x=n[s].value,z=b(d,f,x,g),u=z.sb;e.push({Va:n[s].value,O:u,i:z.i});for(var z=0,y=u.length;z<
-y;z++){var A=u[z];k.push({element:A,index:s,value:n[s].value});v==o?r.f.xb(d,A):r.f.mb(d,A,v);v=A}g&&g(x,u)}r.a.n(q,function(a){r.F(a.element)});f=p;if(!i){if(h.afterAdd)for(s=0;s<k.length;s++)h.afterAdd(k[s].element,k[s].index,k[s].value);if(h.beforeRemove){for(s=0;s<q.length;s++)h.beforeRemove(q[s].element,q[s].index,q[s].value);f=m}}f||r.a.n(q,function(a){r.removeNode(a.element)});r.a.e.set(d,"setDomNodeChildrenFromArrayMapping_lastMappingResult",e)}})();
-r.b("ko.utils.setDomNodeChildrenFromArrayMapping",r.a.Ka);r.p=function(){this.allowTemplateRewriting=p};r.p.prototype=new r.t;r.p.prototype.renderTemplateSource=function(a){a=a.text();return r.a.ma(a)};r.p.M=new r.p;r.pa(r.p.M);r.b("ko.nativeTemplateEngine",r.p);
-(function(){r.ja=function(){var a=this.qb=function(){if("undefined"==typeof jQuery||!jQuery.tmpl)return 0;try{if(0<=jQuery.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(d,e,f){f=f||{};2>a&&c(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later."));var h=d.data("precompiled");h||(h=d.text()||"",h=jQuery.template(o,"{{ko_with $item.koBindingContext}}"+h+"{{/ko_with}}"),d.data("precompiled",h));
-d=[e.$data];e=jQuery.extend({koBindingContext:e},f.templateOptions);e=jQuery.tmpl(h,d,e);e.appendTo(document.createElement("div"));jQuery.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){document.write("<script type='text/html' id='"+a+"'>"+b+"<\/script>")};if(0<a)jQuery.tmpl.tag.ko_code={open:"__.push($1 || '');"},jQuery.tmpl.tag.ko_with={open:"with($1) {",close:"} "}};r.ja.prototype=new r.t;
-var a=new r.ja;0<a.qb&&r.pa(a);r.b("ko.jqueryTmplTemplateEngine",r.ja)})();
-})(window);                  
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py
deleted file mode 100644
index c438105..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/main.py
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-r"""
-=================================
- Benchmark jsmin implementations
-=================================
-
-Benchmark jsmin implementations.
-
-:Copyright:
-
- Copyright 2011 - 2015
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-Usage::
-
-    python -mbench.main [-c COUNT] [-p file] jsfile ...
-
-    -c COUNT  number of runs per jsfile and minifier. Defaults to 10.
-    -p file   File to write the benchmark results in (pickled)
-
-"""
-if __doc__:
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
-__license__ = "Apache License, Version 2.0"
-__version__ = "1.0.0"
-
-import sys as _sys
-import time as _time
-
-import_notes = []
-class jsmins(object):
-    from bench import jsmin as p_01_simple_port
-    if _sys.version_info >= (2, 4):
-        from bench import jsmin_2_0_9 as p_02_jsmin_2_0_9
-    else:
-        import_notes.append(
-            "jsmin_2_0_9 available for python 2.4 and later..."
-        )
-        print(import_notes[-1])
-
-    import rjsmin as p_05_rjsmin
-    try:
-        import _rjsmin as p_06__rjsmin
-    except ImportError:
-        import_notes.append("_rjsmin (C-Port) not available")
-        print(import_notes[-1])
-jsmins.p_05_rjsmin.jsmin = jsmins.p_05_rjsmin._make_jsmin(
-    python_only=True
-)
-print("Python Release: %s" % ".".join(map(str, _sys.version_info[:3])))
-print("")
-
-
-def slurp(filename):
-    """ Load a file """
-    fp = open(filename)
-    try:
-        return fp.read()
-    finally:
-        fp.close()
-
-
-def print_(*value, **kwargs):
-    """ Print stuff """
-    (kwargs.get('file') or _sys.stdout).write(
-        ''.join(value) + kwargs.get('end', '\n')
-    )
-
-
-def bench(filenames, count):
-    """
-    Benchmark the minifiers with given javascript samples
-
-    :Parameters:
-      `filenames` : sequence
-        List of filenames
-
-      `count` : ``int``
-        Number of runs per js file and minifier
-
-    :Exceptions:
-      - `RuntimeError` : empty filenames sequence
-    """
-    if not filenames:
-        raise RuntimeError("Missing files to benchmark")
-    try:
-        xrange
-    except NameError:
-        xrange = range
-    try:
-        cmp
-    except NameError:
-        cmp = lambda a, b: (a > b) - (a < b)
-
-    ports = [item for item in dir(jsmins) if item.startswith('p_')]
-    ports.sort()
-    space = max(map(len, ports)) - 4
-    ports = [(item[5:], getattr(jsmins, item).jsmin) for item in ports]
-    flush = _sys.stdout.flush
-
-    struct = []
-    inputs = [(filename, slurp(filename)) for filename in filenames]
-    for filename, script in inputs:
-        print_("Benchmarking %r..." % filename, end=" ")
-        flush()
-        outputs = []
-        for _, jsmin in ports:
-            try:
-                outputs.append(jsmin(script))
-            except (SystemExit, KeyboardInterrupt):
-                raise
-            except:
-                outputs.append(None)
-        struct.append(dict(
-            filename=filename,
-            sizes=[
-                (item is not None and len(item) or None) for item in outputs
-            ],
-            size=len(script),
-            messages=[],
-            times=[],
-        ))
-        print_("(%.1f KiB)" % (struct[-1]['size'] / 1024.0,))
-        flush()
-        times = []
-        for idx, (name, jsmin) in enumerate(ports):
-            if outputs[idx] is None:
-                print_("  FAILED %s" % (name,))
-                struct[-1]['times'].append((name, None))
-            else:
-                print_("  Timing %s%s... (%5.1f KiB %s)" % (
-                    name,
-                    " " * (space - len(name)),
-                    len(outputs[idx]) / 1024.0,
-                    idx == 0 and '*' or ['=', '>', '<'][
-                        cmp(len(outputs[idx]), len(outputs[0]))
-                    ],
-                ), end=" ")
-                flush()
-
-                xcount = count
-                while True:
-                    counted = [None for _ in xrange(xcount)]
-                    start = _time.time()
-                    for _ in counted:
-                        jsmin(script)
-                    end = _time.time()
-                    result = (end - start) * 1000
-                    if result < 10: # avoid measuring within the error range
-                        xcount *= 10
-                        continue
-                    times.append(result / xcount)
-                    break
-
-                print_("%8.2f ms" % times[-1], end=" ")
-                flush()
-                if len(times) <= 1:
-                    print_()
-                else:
-                    print_("(factor: %s)" % (', '.join([
-                        '%.2f' % (timed / times[-1]) for timed in times[:-1]
-                    ])))
-                struct[-1]['times'].append((name, times[-1]))
-
-            flush()
-        print_()
-
-    return struct
-
-
-def main(argv=None):
-    """ Main """
-    import getopt as _getopt
-    import os as _os
-    import pickle as _pickle
-
-    if argv is None:
-        argv = _sys.argv[1:]
-    try:
-        opts, args = _getopt.getopt(argv, "hc:p:", ["help"])
-    except getopt.GetoptError:
-        e = _sys.exc_info()[0](_sys.exc_info()[1])
-        print >> _sys.stderr, "%s\nTry %s -mbench.main --help" % (
-            e,
-            _os.path.basename(_sys.executable),
-        )
-        _sys.exit(2)
-
-    count, pickle = 10, None
-    for key, value in opts:
-        if key in ("-h", "--help"):
-            print >> _sys.stderr, (
-                "%s -mbench.main [-c count] [-p file] cssfile ..." % (
-                    _os.path.basename(_sys.executable),
-                )
-            )
-            _sys.exit(0)
-        elif key == '-c':
-            count = int(value)
-        elif key == '-p':
-            pickle = str(value)
-
-    struct = bench(args, count)
-    if pickle:
-        fp = open(pickle, 'wb')
-        try:
-            fp.write(_pickle.dumps((
-                ".".join(map(str, _sys.version_info[:3])),
-                import_notes,
-                struct,
-            ), 0))
-        finally:
-            fp.close()
-
-
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/markermanager.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/markermanager.js
deleted file mode 100644
index 1006650..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/markermanager.js
+++ /dev/null
@@ -1,976 +0,0 @@
-/**
- * @name MarkerManager v3
- * @version 1.0
- * @copyright (c) 2007 Google Inc.
- * @author Doug Ricket, Bjorn Brala (port to v3), others,
- *
- * @fileoverview Marker manager is an interface between the map and the user,
- * designed to manage adding and removing many points when the viewport changes.
- * <br /><br />
- * <b>How it Works</b>:<br/>
- * The MarkerManager places its markers onto a grid, similar to the map tiles.
- * When the user moves the viewport, it computes which grid cells have
- * entered or left the viewport, and shows or hides all the markers in those
- * cells.
- * (If the users scrolls the viewport beyond the markers that are loaded,
- * no markers will be visible until the <code>EVENT_moveend</code>
- * triggers an update.)
- * In practical consequences, this allows 10,000 markers to be distributed over
- * a large area, and as long as only 100-200 are visible in any given viewport,
- * the user will see good performance corresponding to the 100 visible markers,
- * rather than poor performance corresponding to the total 10,000 markers.
- * Note that some code is optimized for speed over space,
- * with the goal of accommodating thousands of markers.
- */
-
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @name MarkerManagerOptions
- * @class This class represents optional arguments to the {@link MarkerManager}
- *     constructor.
- * @property {Number} maxZoom Sets the maximum zoom level monitored by a
- *     marker manager. If not given, the manager assumes the maximum map zoom
- *     level. This value is also used when markers are added to the manager
- *     without the optional {@link maxZoom} parameter.
- * @property {Number} borderPadding Specifies, in pixels, the extra padding
- *     outside the map's current viewport monitored by a manager. Markers that
- *     fall within this padding are added to the map, even if they are not fully
- *     visible.
- * @property {Boolean} trackMarkers=false Indicates whether or not a marker
- *     manager should track markers' movements. If you wish to move managed
- *     markers using the {@link setPoint}/{@link setLatLng} methods,
- *     this option should be set to {@link true}.
- */
-
-/**
- * Creates a new MarkerManager that will show/hide markers on a map.
- *
- * Events:
- * @event changed (Parameters: shown bounds, shown markers) Notify listeners when the state of what is displayed changes.
- * @event loaded MarkerManager has succesfully been initialized.
- *
- * @constructor
- * @param {Map} map The map to manage.
- * @param {Object} opt_opts A container for optional arguments:
- *   {Number} maxZoom The maximum zoom level for which to create tiles.
- *   {Number} borderPadding The width in pixels beyond the map border,
- *                   where markers should be display.
- *   {Boolean} trackMarkers Whether or not this manager should track marker
- *                   movements.
- */
-function MarkerManager(map, opt_opts) {
-  var me = this;
-  me.map_ = map;
-  me.mapZoom_ = map.getZoom();
-
-  me.projectionHelper_ = new ProjectionHelperOverlay(map);
-  google.maps.event.addListener(me.projectionHelper_, 'ready', function () {
-    me.projection_ = this.getProjection();
-    me.initialize(map, opt_opts);
-  });
-}
-
-
-MarkerManager.prototype.initialize = function (map, opt_opts) {
-  var me = this;
-
-  opt_opts = opt_opts || {};
-  me.tileSize_ = MarkerManager.DEFAULT_TILE_SIZE_;
-
-  var mapTypes = map.mapTypes;
-
-  // Find max zoom level
-  var mapMaxZoom = 1;
-  for (var sType in mapTypes ) {
-    if (typeof map.mapTypes.get(sType) === 'object' && typeof map.mapTypes.get(sType).maxZoom === 'number') {
-      var mapTypeMaxZoom = map.mapTypes.get(sType).maxZoom;
-      if (mapTypeMaxZoom > mapMaxZoom) {
-        mapMaxZoom = mapTypeMaxZoom;
-      }
-    }
-  }
-
-  me.maxZoom_  = opt_opts.maxZoom || 19;
-
-  me.trackMarkers_ = opt_opts.trackMarkers;
-  me.show_ = opt_opts.show || true;
-
-  var padding;
-  if (typeof opt_opts.borderPadding === 'number') {
-    padding = opt_opts.borderPadding;
-  } else {
-    padding = MarkerManager.DEFAULT_BORDER_PADDING_;
-  }
-  // The padding in pixels beyond the viewport, where we will pre-load markers.
-  me.swPadding_ = new google.maps.Size(-padding, padding);
-  me.nePadding_ = new google.maps.Size(padding, -padding);
-  me.borderPadding_ = padding;
-
-  me.gridWidth_ = {};
-
-  me.grid_ = {};
-  me.grid_[me.maxZoom_] = {};
-  me.numMarkers_ = {};
-  me.numMarkers_[me.maxZoom_] = 0;
-
-
-  google.maps.event.addListener(map, 'dragend', function () {
-    me.onMapMoveEnd_();
-  });
-  google.maps.event.addListener(map, 'zoom_changed', function () {
-    me.onMapMoveEnd_();
-  });
-
-
-
-  /**
-   * This closure provide easy access to the map.
-   * They are used as callbacks, not as methods.
-   * @param GMarker marker Marker to be removed from the map
-   * @private
-   */
-  me.removeOverlay_ = function (marker) {
-    marker.setMap(null);
-    me.shownMarkers_--;
-  };
-
-  /**
-   * This closure provide easy access to the map.
-   * They are used as callbacks, not as methods.
-   * @param GMarker marker Marker to be added to the map
-   * @private
-   */
-  me.addOverlay_ = function (marker) {
-    if (me.show_) {
-      marker.setMap(me.map_);
-      me.shownMarkers_++;
-    }
-  };
-
-  me.resetManager_();
-  me.shownMarkers_ = 0;
-
-  me.shownBounds_ = me.getMapGridBounds_();
-
-  google.maps.event.trigger(me, 'loaded');
-
-};
-
-/**
- *  Default tile size used for deviding the map into a grid.
- */
-MarkerManager.DEFAULT_TILE_SIZE_ = 1024;
-
-/*
- *  How much extra space to show around the map border so
- *  dragging doesn't result in an empty place.
- */
-MarkerManager.DEFAULT_BORDER_PADDING_ = 100;
-
-/**
- *  Default tilesize of single tile world.
- */
-MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE = 256;
-
-
-/**
- * Initializes MarkerManager arrays for all zoom levels
- * Called by constructor and by clearAllMarkers
- */
-MarkerManager.prototype.resetManager_ = function () {
-  var mapWidth = MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;
-  for (var zoom = 0; zoom <= this.maxZoom_; ++zoom) {
-    this.grid_[zoom] = {};
-    this.numMarkers_[zoom] = 0;
-    this.gridWidth_[zoom] = Math.ceil(mapWidth / this.tileSize_);
-    mapWidth <<= 1;
-  }
-
-};
-
-/**
- * Removes all markers in the manager, and
- * removes any visible markers from the map.
- */
-MarkerManager.prototype.clearMarkers = function () {
-  this.processAll_(this.shownBounds_, this.removeOverlay_);
-  this.resetManager_();
-};
-
-
-/**
- * Gets the tile coordinate for a given latlng point.
- *
- * @param {LatLng} latlng The geographical point.
- * @param {Number} zoom The zoom level.
- * @param {google.maps.Size} padding The padding used to shift the pixel coordinate.
- *               Used for expanding a bounds to include an extra padding
- *               of pixels surrounding the bounds.
- * @return {GPoint} The point in tile coordinates.
- *
- */
-MarkerManager.prototype.getTilePoint_ = function (latlng, zoom, padding) {
-
-  var pixelPoint = this.projectionHelper_.LatLngToPixel(latlng, zoom);
-
-  var point = new google.maps.Point(
-    Math.floor((pixelPoint.x + padding.width) / this.tileSize_),
-    Math.floor((pixelPoint.y + padding.height) / this.tileSize_)
-  );
-
-  return point;
-};
-
-
-/**
- * Finds the appropriate place to add the marker to the grid.
- * Optimized for speed; does not actually add the marker to the map.
- * Designed for batch-processing thousands of markers.
- *
- * @param {Marker} marker The marker to add.
- * @param {Number} minZoom The minimum zoom for displaying the marker.
- * @param {Number} maxZoom The maximum zoom for displaying the marker.
- */
-MarkerManager.prototype.addMarkerBatch_ = function (marker, minZoom, maxZoom) {
-  var me = this;
-
-  var mPoint = marker.getPosition();
-  marker.MarkerManager_minZoom = minZoom;
-
-
-  // Tracking markers is expensive, so we do this only if the
-  // user explicitly requested it when creating marker manager.
-  if (this.trackMarkers_) {
-    google.maps.event.addListener(marker, 'changed', function (a, b, c) {
-      me.onMarkerMoved_(a, b, c);
-    });
-  }
-
-  var gridPoint = this.getTilePoint_(mPoint, maxZoom, new google.maps.Size(0, 0, 0, 0));
-
-  for (var zoom = maxZoom; zoom >= minZoom; zoom--) {
-    var cell = this.getGridCellCreate_(gridPoint.x, gridPoint.y, zoom);
-    cell.push(marker);
-
-    gridPoint.x = gridPoint.x >> 1;
-    gridPoint.y = gridPoint.y >> 1;
-  }
-};
-
-
-/**
- * Returns whether or not the given point is visible in the shown bounds. This
- * is a helper method that takes care of the corner case, when shownBounds have
- * negative minX value.
- *
- * @param {Point} point a point on a grid.
- * @return {Boolean} Whether or not the given point is visible in the currently
- * shown bounds.
- */
-MarkerManager.prototype.isGridPointVisible_ = function (point) {
-  var vertical = this.shownBounds_.minY <= point.y &&
-      point.y <= this.shownBounds_.maxY;
-  var minX = this.shownBounds_.minX;
-  var horizontal = minX <= point.x && point.x <= this.shownBounds_.maxX;
-  if (!horizontal && minX < 0) {
-    // Shifts the negative part of the rectangle. As point.x is always less
-    // than grid width, only test shifted minX .. 0 part of the shown bounds.
-    var width = this.gridWidth_[this.shownBounds_.z];
-    horizontal = minX + width <= point.x && point.x <= width - 1;
-  }
-  return vertical && horizontal;
-};
-
-
-/**
- * Reacts to a notification from a marker that it has moved to a new location.
- * It scans the grid all all zoom levels and moves the marker from the old grid
- * location to a new grid location.
- *
- * @param {Marker} marker The marker that moved.
- * @param {LatLng} oldPoint The old position of the marker.
- * @param {LatLng} newPoint The new position of the marker.
- */
-MarkerManager.prototype.onMarkerMoved_ = function (marker, oldPoint, newPoint) {
-  // NOTE: We do not know the minimum or maximum zoom the marker was
-  // added at, so we start at the absolute maximum. Whenever we successfully
-  // remove a marker at a given zoom, we add it at the new grid coordinates.
-  var zoom = this.maxZoom_;
-  var changed = false;
-  var oldGrid = this.getTilePoint_(oldPoint, zoom, new google.maps.Size(0, 0, 0, 0));
-  var newGrid = this.getTilePoint_(newPoint, zoom, new google.maps.Size(0, 0, 0, 0));
-  while (zoom >= 0 && (oldGrid.x !== newGrid.x || oldGrid.y !== newGrid.y)) {
-    var cell = this.getGridCellNoCreate_(oldGrid.x, oldGrid.y, zoom);
-    if (cell) {
-      if (this.removeFromArray_(cell, marker)) {
-        this.getGridCellCreate_(newGrid.x, newGrid.y, zoom).push(marker);
-      }
-    }
-    // For the current zoom we also need to update the map. Markers that no
-    // longer are visible are removed from the map. Markers that moved into
-    // the shown bounds are added to the map. This also lets us keep the count
-    // of visible markers up to date.
-    if (zoom === this.mapZoom_) {
-      if (this.isGridPointVisible_(oldGrid)) {
-        if (!this.isGridPointVisible_(newGrid)) {
-          this.removeOverlay_(marker);
-          changed = true;
-        }
-      } else {
-        if (this.isGridPointVisible_(newGrid)) {
-          this.addOverlay_(marker);
-          changed = true;
-        }
-      }
-    }
-    oldGrid.x = oldGrid.x >> 1;
-    oldGrid.y = oldGrid.y >> 1;
-    newGrid.x = newGrid.x >> 1;
-    newGrid.y = newGrid.y >> 1;
-    --zoom;
-  }
-  if (changed) {
-    this.notifyListeners_();
-  }
-};
-
-
-/**
- * Removes marker from the manager and from the map
- * (if it's currently visible).
- * @param {GMarker} marker The marker to delete.
- */
-MarkerManager.prototype.removeMarker = function (marker) {
-  var zoom = this.maxZoom_;
-  var changed = false;
-  var point = marker.getPosition();
-  var grid = this.getTilePoint_(point, zoom, new google.maps.Size(0, 0, 0, 0));
-  while (zoom >= 0) {
-    var cell = this.getGridCellNoCreate_(grid.x, grid.y, zoom);
-
-    if (cell) {
-      this.removeFromArray_(cell, marker);
-    }
-    // For the current zoom we also need to update the map. Markers that no
-    // longer are visible are removed from the map. This also lets us keep the count
-    // of visible markers up to date.
-    if (zoom === this.mapZoom_) {
-      if (this.isGridPointVisible_(grid)) {
-        this.removeOverlay_(marker);
-        changed = true;
-      }
-    }
-    grid.x = grid.x >> 1;
-    grid.y = grid.y >> 1;
-    --zoom;
-  }
-  if (changed) {
-    this.notifyListeners_();
-  }
-  this.numMarkers_[marker.MarkerManager_minZoom]--;
-};
-
-
-/**
- * Add many markers at once.
- * Does not actually update the map, just the internal grid.
- *
- * @param {Array of Marker} markers The markers to add.
- * @param {Number} minZoom The minimum zoom level to display the markers.
- * @param {Number} opt_maxZoom The maximum zoom level to display the markers.
- */
-MarkerManager.prototype.addMarkers = function (markers, minZoom, opt_maxZoom) {
-  var maxZoom = this.getOptMaxZoom_(opt_maxZoom);
-  for (var i = markers.length - 1; i >= 0; i--) {
-    this.addMarkerBatch_(markers[i], minZoom, maxZoom);
-  }
-
-  this.numMarkers_[minZoom] += markers.length;
-};
-
-
-/**
- * Returns the value of the optional maximum zoom. This method is defined so
- * that we have just one place where optional maximum zoom is calculated.
- *
- * @param {Number} opt_maxZoom The optinal maximum zoom.
- * @return The maximum zoom.
- */
-MarkerManager.prototype.getOptMaxZoom_ = function (opt_maxZoom) {
-  return opt_maxZoom || this.maxZoom_;
-};
-
-
-/**
- * Calculates the total number of markers potentially visible at a given
- * zoom level.
- *
- * @param {Number} zoom The zoom level to check.
- */
-MarkerManager.prototype.getMarkerCount = function (zoom) {
-  var total = 0;
-  for (var z = 0; z <= zoom; z++) {
-    total += this.numMarkers_[z];
-  }
-  return total;
-};
-
-/**
- * Returns a marker given latitude, longitude and zoom. If the marker does not
- * exist, the method will return a new marker. If a new marker is created,
- * it will NOT be added to the manager.
- *
- * @param {Number} lat - the latitude of a marker.
- * @param {Number} lng - the longitude of a marker.
- * @param {Number} zoom - the zoom level
- * @return {GMarker} marker - the marker found at lat and lng
- */
-MarkerManager.prototype.getMarker = function (lat, lng, zoom) {
-  var mPoint = new google.maps.LatLng(lat, lng);
-  var gridPoint = this.getTilePoint_(mPoint, zoom, new google.maps.Size(0, 0, 0, 0));
-
-  var marker = new google.maps.Marker({position: mPoint});
-
-  var cellArray = this.getGridCellNoCreate_(gridPoint.x, gridPoint.y, zoom);
-  if (cellArray !== undefined) {
-    for (var i = 0; i < cellArray.length; i++)
-    {
-      if (lat === cellArray[i].getLatLng().lat() && lng === cellArray[i].getLatLng().lng()) {
-        marker = cellArray[i];
-      }
-    }
-  }
-  return marker;
-};
-
-/**
- * Add a single marker to the map.
- *
- * @param {Marker} marker The marker to add.
- * @param {Number} minZoom The minimum zoom level to display the marker.
- * @param {Number} opt_maxZoom The maximum zoom level to display the marker.
- */
-MarkerManager.prototype.addMarker = function (marker, minZoom, opt_maxZoom) {
-  var maxZoom = this.getOptMaxZoom_(opt_maxZoom);
-  this.addMarkerBatch_(marker, minZoom, maxZoom);
-  var gridPoint = this.getTilePoint_(marker.getPosition(), this.mapZoom_, new google.maps.Size(0, 0, 0, 0));
-  if (this.isGridPointVisible_(gridPoint) &&
-      minZoom <= this.shownBounds_.z &&
-      this.shownBounds_.z <= maxZoom) {
-    this.addOverlay_(marker);
-    this.notifyListeners_();
-  }
-  this.numMarkers_[minZoom]++;
-};
-
-
-/**
- * Helper class to create a bounds of INT ranges.
- * @param bounds Array.<Object.<string, number>> Bounds object.
- * @constructor
- */
-function GridBounds(bounds) {
-  // [sw, ne]
-
-  this.minX = Math.min(bounds[0].x, bounds[1].x);
-  this.maxX = Math.max(bounds[0].x, bounds[1].x);
-  this.minY = Math.min(bounds[0].y, bounds[1].y);
-  this.maxY = Math.max(bounds[0].y, bounds[1].y);
-
-}
-
-/**
- * Returns true if this bounds equal the given bounds.
- * @param {GridBounds} gridBounds GridBounds The bounds to test.
- * @return {Boolean} This Bounds equals the given GridBounds.
- */
-GridBounds.prototype.equals = function (gridBounds) {
-  if (this.maxX === gridBounds.maxX && this.maxY === gridBounds.maxY && this.minX === gridBounds.minX && this.minY === gridBounds.minY) {
-    return true;
-  } else {
-    return false;
-  }
-};
-
-/**
- * Returns true if this bounds (inclusively) contains the given point.
- * @param {Point} point  The point to test.
- * @return {Boolean} This Bounds contains the given Point.
- */
-GridBounds.prototype.containsPoint = function (point) {
-  var outer = this;
-  return (outer.minX <= point.x && outer.maxX >= point.x && outer.minY <= point.y && outer.maxY >= point.y);
-};
-
-/**
- * Get a cell in the grid, creating it first if necessary.
- *
- * Optimization candidate
- *
- * @param {Number} x The x coordinate of the cell.
- * @param {Number} y The y coordinate of the cell.
- * @param {Number} z The z coordinate of the cell.
- * @return {Array} The cell in the array.
- */
-MarkerManager.prototype.getGridCellCreate_ = function (x, y, z) {
-  var grid = this.grid_[z];
-  if (x < 0) {
-    x += this.gridWidth_[z];
-  }
-  var gridCol = grid[x];
-  if (!gridCol) {
-    gridCol = grid[x] = [];
-    return (gridCol[y] = []);
-  }
-  var gridCell = gridCol[y];
-  if (!gridCell) {
-    return (gridCol[y] = []);
-  }
-  return gridCell;
-};
-
-
-/**
- * Get a cell in the grid, returning undefined if it does not exist.
- *
- * NOTE: Optimized for speed -- otherwise could combine with getGridCellCreate_.
- *
- * @param {Number} x The x coordinate of the cell.
- * @param {Number} y The y coordinate of the cell.
- * @param {Number} z The z coordinate of the cell.
- * @return {Array} The cell in the array.
- */
-MarkerManager.prototype.getGridCellNoCreate_ = function (x, y, z) {
-  var grid = this.grid_[z];
-
-  if (x < 0) {
-    x += this.gridWidth_[z];
-  }
-  var gridCol = grid[x];
-  return gridCol ? gridCol[y] : undefined;
-};
-
-
-/**
- * Turns at geographical bounds into a grid-space bounds.
- *
- * @param {LatLngBounds} bounds The geographical bounds.
- * @param {Number} zoom The zoom level of the bounds.
- * @param {google.maps.Size} swPadding The padding in pixels to extend beyond the
- * given bounds.
- * @param {google.maps.Size} nePadding The padding in pixels to extend beyond the
- * given bounds.
- * @return {GridBounds} The bounds in grid space.
- */
-MarkerManager.prototype.getGridBounds_ = function (bounds, zoom, swPadding, nePadding) {
-  zoom = Math.min(zoom, this.maxZoom_);
-
-  var bl = bounds.getSouthWest();
-  var tr = bounds.getNorthEast();
-  var sw = this.getTilePoint_(bl, zoom, swPadding);
-
-  var ne = this.getTilePoint_(tr, zoom, nePadding);
-  var gw = this.gridWidth_[zoom];
-
-  // Crossing the prime meridian requires correction of bounds.
-  if (tr.lng() < bl.lng() || ne.x < sw.x) {
-    sw.x -= gw;
-  }
-  if (ne.x - sw.x  + 1 >= gw) {
-    // Computed grid bounds are larger than the world; truncate.
-    sw.x = 0;
-    ne.x = gw - 1;
-  }
-
-  var gridBounds = new GridBounds([sw, ne]);
-  gridBounds.z = zoom;
-
-  return gridBounds;
-};
-
-
-/**
- * Gets the grid-space bounds for the current map viewport.
- *
- * @return {Bounds} The bounds in grid space.
- */
-MarkerManager.prototype.getMapGridBounds_ = function () {
-  return this.getGridBounds_(this.map_.getBounds(), this.mapZoom_, this.swPadding_, this.nePadding_);
-};
-
-
-/**
- * Event listener for map:movend.
- * NOTE: Use a timeout so that the user is not blocked
- * from moving the map.
- *
- * Removed this because a a lack of a scopy override/callback function on events.
- */
-MarkerManager.prototype.onMapMoveEnd_ = function () {
-  this.objectSetTimeout_(this, this.updateMarkers_, 0);
-};
-
-
-/**
- * Call a function or evaluate an expression after a specified number of
- * milliseconds.
- *
- * Equivalent to the standard window.setTimeout function, but the given
- * function executes as a method of this instance. So the function passed to
- * objectSetTimeout can contain references to this.
- *    objectSetTimeout(this, function () { alert(this.x) }, 1000);
- *
- * @param {Object} object  The target object.
- * @param {Function} command  The command to run.
- * @param {Number} milliseconds  The delay.
- * @return {Boolean}  Success.
- */
-MarkerManager.prototype.objectSetTimeout_ = function (object, command, milliseconds) {
-  return window.setTimeout(function () {
-    command.call(object);
-  }, milliseconds);
-};
-
-
-/**
- * Is this layer visible?
- *
- * Returns visibility setting
- *
- * @return {Boolean} Visible
- */
-MarkerManager.prototype.visible = function () {
-  return this.show_ ? true : false;
-};
-
-
-/**
- * Returns true if the manager is hidden.
- * Otherwise returns false.
- * @return {Boolean} Hidden
- */
-MarkerManager.prototype.isHidden = function () {
-  return !this.show_;
-};
-
-
-/**
- * Shows the manager if it's currently hidden.
- */
-MarkerManager.prototype.show = function () {
-  this.show_ = true;
-  this.refresh();
-};
-
-
-/**
- * Hides the manager if it's currently visible
- */
-MarkerManager.prototype.hide = function () {
-  this.show_ = false;
-  this.refresh();
-};
-
-
-/**
- * Toggles the visibility of the manager.
- */
-MarkerManager.prototype.toggle = function () {
-  this.show_ = !this.show_;
-  this.refresh();
-};
-
-
-/**
- * Refresh forces the marker-manager into a good state.
- * <ol>
- *   <li>If never before initialized, shows all the markers.</li>
- *   <li>If previously initialized, removes and re-adds all markers.</li>
- * </ol>
- */
-MarkerManager.prototype.refresh = function () {
-  if (this.shownMarkers_ > 0) {
-    this.processAll_(this.shownBounds_, this.removeOverlay_);
-  }
-  // An extra check on this.show_ to increase performance (no need to processAll_)
-  if (this.show_) {
-    this.processAll_(this.shownBounds_, this.addOverlay_);
-  }
-  this.notifyListeners_();
-};
-
-
-/**
- * After the viewport may have changed, add or remove markers as needed.
- */
-MarkerManager.prototype.updateMarkers_ = function () {
-  this.mapZoom_ = this.map_.getZoom();
-  var newBounds = this.getMapGridBounds_();
-
-  // If the move does not include new grid sections,
-  // we have no work to do:
-  if (newBounds.equals(this.shownBounds_) && newBounds.z === this.shownBounds_.z) {
-    return;
-  }
-
-  if (newBounds.z !== this.shownBounds_.z) {
-    this.processAll_(this.shownBounds_, this.removeOverlay_);
-    if (this.show_) { // performance
-      this.processAll_(newBounds, this.addOverlay_);
-    }
-  } else {
-    // Remove markers:
-    this.rectangleDiff_(this.shownBounds_, newBounds, this.removeCellMarkers_);
-
-    // Add markers:
-    if (this.show_) { // performance
-      this.rectangleDiff_(newBounds, this.shownBounds_, this.addCellMarkers_);
-    }
-  }
-  this.shownBounds_ = newBounds;
-
-  this.notifyListeners_();
-};
-
-
-/**
- * Notify listeners when the state of what is displayed changes.
- */
-MarkerManager.prototype.notifyListeners_ = function () {
-  google.maps.event.trigger(this, 'changed', this.shownBounds_, this.shownMarkers_);
-};
-
-
-/**
- * Process all markers in the bounds provided, using a callback.
- *
- * @param {Bounds} bounds The bounds in grid space.
- * @param {Function} callback The function to call for each marker.
- */
-MarkerManager.prototype.processAll_ = function (bounds, callback) {
-  for (var x = bounds.minX; x <= bounds.maxX; x++) {
-    for (var y = bounds.minY; y <= bounds.maxY; y++) {
-      this.processCellMarkers_(x, y,  bounds.z, callback);
-    }
-  }
-};
-
-
-/**
- * Process all markers in the grid cell, using a callback.
- *
- * @param {Number} x The x coordinate of the cell.
- * @param {Number} y The y coordinate of the cell.
- * @param {Number} z The z coordinate of the cell.
- * @param {Function} callback The function to call for each marker.
- */
-MarkerManager.prototype.processCellMarkers_ = function (x, y, z, callback) {
-  var cell = this.getGridCellNoCreate_(x, y, z);
-  if (cell) {
-    for (var i = cell.length - 1; i >= 0; i--) {
-      callback(cell[i]);
-    }
-  }
-};
-
-
-/**
- * Remove all markers in a grid cell.
- *
- * @param {Number} x The x coordinate of the cell.
- * @param {Number} y The y coordinate of the cell.
- * @param {Number} z The z coordinate of the cell.
- */
-MarkerManager.prototype.removeCellMarkers_ = function (x, y, z) {
-  this.processCellMarkers_(x, y, z, this.removeOverlay_);
-};
-
-
-/**
- * Add all markers in a grid cell.
- *
- * @param {Number} x The x coordinate of the cell.
- * @param {Number} y The y coordinate of the cell.
- * @param {Number} z The z coordinate of the cell.
- */
-MarkerManager.prototype.addCellMarkers_ = function (x, y, z) {
-  this.processCellMarkers_(x, y, z, this.addOverlay_);
-};
-
-
-/**
- * Use the rectangleDiffCoords_ function to process all grid cells
- * that are in bounds1 but not bounds2, using a callback, and using
- * the current MarkerManager object as the instance.
- *
- * Pass the z parameter to the callback in addition to x and y.
- *
- * @param {Bounds} bounds1 The bounds of all points we may process.
- * @param {Bounds} bounds2 The bounds of points to exclude.
- * @param {Function} callback The callback function to call
- *                   for each grid coordinate (x, y, z).
- */
-MarkerManager.prototype.rectangleDiff_ = function (bounds1, bounds2, callback) {
-  var me = this;
-  me.rectangleDiffCoords_(bounds1, bounds2, function (x, y) {
-    callback.apply(me, [x, y, bounds1.z]);
-  });
-};
-
-
-/**
- * Calls the function for all points in bounds1, not in bounds2
- *
- * @param {Bounds} bounds1 The bounds of all points we may process.
- * @param {Bounds} bounds2 The bounds of points to exclude.
- * @param {Function} callback The callback function to call
- *                   for each grid coordinate.
- */
-MarkerManager.prototype.rectangleDiffCoords_ = function (bounds1, bounds2, callback) {
-  var minX1 = bounds1.minX;
-  var minY1 = bounds1.minY;
-  var maxX1 = bounds1.maxX;
-  var maxY1 = bounds1.maxY;
-  var minX2 = bounds2.minX;
-  var minY2 = bounds2.minY;
-  var maxX2 = bounds2.maxX;
-  var maxY2 = bounds2.maxY;
-
-  var x, y;
-  for (x = minX1; x <= maxX1; x++) {  // All x in R1
-    // All above:
-    for (y = minY1; y <= maxY1 && y < minY2; y++) {  // y in R1 above R2
-      callback(x, y);
-    }
-    // All below:
-    for (y = Math.max(maxY2 + 1, minY1);  // y in R1 below R2
-         y <= maxY1; y++) {
-      callback(x, y);
-    }
-  }
-
-  for (y = Math.max(minY1, minY2);
-       y <= Math.min(maxY1, maxY2); y++) {  // All y in R2 and in R1
-    // Strictly left:
-    for (x = Math.min(maxX1 + 1, minX2) - 1;
-         x >= minX1; x--) {  // x in R1 left of R2
-      callback(x, y);
-    }
-    // Strictly right:
-    for (x = Math.max(minX1, maxX2 + 1);  // x in R1 right of R2
-         x <= maxX1; x++) {
-      callback(x, y);
-    }
-  }
-};
-
-
-/**
- * Removes value from array. O(N).
- *
- * @param {Array} array  The array to modify.
- * @param {any} value  The value to remove.
- * @param {Boolean} opt_notype  Flag to disable type checking in equality.
- * @return {Number}  The number of instances of value that were removed.
- */
-MarkerManager.prototype.removeFromArray_ = function (array, value, opt_notype) {
-  var shift = 0;
-  for (var i = 0; i < array.length; ++i) {
-    if (array[i] === value || (opt_notype && array[i] === value)) {
-      array.splice(i--, 1);
-      shift++;
-    }
-  }
-  return shift;
-};
-
-
-
-
-
-
-
-/**
-*   Projection overlay helper. Helps in calculating
-*   that markers get into the right grid.
-*   @constructor
-*   @param {Map} map The map to manage.
-**/
-function ProjectionHelperOverlay(map) {
-
-  this.setMap(map);
-
-  var TILEFACTOR = 8;
-  var TILESIDE = 1 << TILEFACTOR;
-  var RADIUS = 7;
-
-  this._map = map;
-  this._zoom = -1;
-  this._X0 =
-  this._Y0 =
-  this._X1 =
-  this._Y1 = -1;
-
-
-}
-if (typeof(google) != 'undefined' && google.maps) { // make sure it exists -- amalo
-ProjectionHelperOverlay.prototype = new google.maps.OverlayView();
-}
-
-/**
- *  Helper function to convert Lng to X
- *  @private
- *  @param {float} lng
- **/
-ProjectionHelperOverlay.prototype.LngToX_ = function (lng) {
-  return (1 + lng / 180);
-};
-
-/**
- *  Helper function to convert Lat to Y
- *  @private
- *  @param {float} lat
- **/
-ProjectionHelperOverlay.prototype.LatToY_ = function (lat) {
-  var sinofphi = Math.sin(lat * Math.PI / 180);
-  return (1 - 0.5 / Math.PI * Math.log((1 + sinofphi) / (1 - sinofphi)));
-};
-
-/**
-*   Old school LatLngToPixel
-*   @param {LatLng} latlng google.maps.LatLng object
-*   @param {Number} zoom Zoom level
-*   @return {position} {x: pixelPositionX, y: pixelPositionY}
-**/
-ProjectionHelperOverlay.prototype.LatLngToPixel = function (latlng, zoom) {
-  var map = this._map;
-  var div = this.getProjection().fromLatLngToDivPixel(latlng);
-  var abs = {x: ~~(0.5 + this.LngToX_(latlng.lng()) * (2 << (zoom + 6))), y: ~~(0.5 + this.LatToY_(latlng.lat()) * (2 << (zoom + 6)))};
-  return abs;
-};
-
-
-/**
- * Draw function only triggers a ready event for
- * MarkerManager to know projection can proceed to
- * initialize.
- */
-ProjectionHelperOverlay.prototype.draw = function () {
-  if (!this.ready) {
-    this.ready = true;
-    google.maps.event.trigger(this, 'ready');
-  }
-};
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py
deleted file mode 100644
index e91c3d0..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/bench/write.py
+++ /dev/null
@@ -1,345 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-r"""
-=========================
- Write benchmark results
-=========================
-
-Write benchmark results.
-
-:Copyright:
-
- Copyright 2014 - 2015
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-Usage::
-
-    python -mbench.write [-p plain] [-t table] <pickled
-
-    -p plain  Plain file to write to (like docs/BENCHMARKS).
-    -t table  Table file to write to (like docs/_userdoc/benchmark.txt).
-
-"""
-if __doc__:
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
-__license__ = "Apache License, Version 2.0"
-__version__ = "1.0.0"
-
-import os as _os
-import re as _re
-import sys as _sys
-
-
-try:
-    unicode
-except NameError:
-    def uni(v):
-        if hasattr(v, 'decode'):
-            return v.decode('latin-1')
-        return str(v)
-else:
-    def uni(v):
-        if isinstance(v, unicode):
-            return v.encode('utf-8')
-        return str(v)
-
-
-def write_table(filename, results):
-    """
-    Output tabled benchmark results
-
-    :Parameters:
-      `filename` : ``str``
-        Filename to write to
-
-      `results` : ``list``
-        Results
-    """
-    try:
-        next
-    except NameError:
-        next = lambda i: (getattr(i, 'next', None) or i.__next__)()
-    try:
-        cmp
-    except NameError:
-        cmp = lambda a, b: (a > b) - (a < b)
-
-    names = [
-        ('simple_port', 'Simple Port'),
-        ('jsmin_2_0_9', 'jsmin 2.0.9'),
-        ('rjsmin', '|rjsmin|'),
-        ('_rjsmin', r'_\ |rjsmin|'),
-    ]
-    benched_per_table = 2
-
-    results = sorted(results, reverse=True)
-
-    # First we transform our data into a table (list of lists)
-    pythons, widths = [], [0] * (benched_per_table + 1)
-    last_version = None
-    for version, _, result in results:
-        version = uni(version)
-        if not(last_version is None or version.startswith('2.')):
-            continue
-        last_version = version
-
-        namesub = _re.compile(r'(?:-\d+(?:\.\d+)*)?\.js$').sub
-        result = iter(result)
-        tables = []
-
-        # given our data it's easier to create the table transposed...
-        for benched in result:
-            rows = [['Name'] + [desc for _, desc in names]]
-            for _ in range(benched_per_table):
-                if _:
-                    try:
-                        benched = next(result)
-                    except StopIteration:
-                        rows.append([''] + ['' for _ in names])
-                        continue
-
-                times = dict((
-                    uni(port), (time, benched['sizes'][idx])
-                ) for idx, (port, time) in enumerate(benched['times']))
-                columns = ['%s (%.1f)' % (
-                    namesub('', _os.path.basename(uni(benched['filename']))),
-                    benched['size'] / 1024.0,
-                )]
-                for idx, (port, _) in enumerate(names):
-                    if port not in times:
-                        columns.append('n/a')
-                        continue
-                    time, size = times[port]
-                    if time is None:
-                        columns.append('(failed)')
-                        continue
-                    columns.append('%s%.2f ms (%.1f %s)' % (
-                        idx == 0 and ' ' or '',
-                        time,
-                        size / 1024.0,
-                        idx == 0 and '\\*' or ['=', '>', '<'][
-                            cmp(size, benched['sizes'][0])
-                        ],
-                    ))
-                rows.append(columns)
-
-            # calculate column widths (global for all tables)
-            for idx, row in enumerate(rows):
-                widths[idx] = max(widths[idx], max(map(len, row)))
-
-            # ... and transpose it back.
-            tables.append(zip(*rows))
-        pythons.append((version, tables))
-
-        if last_version.startswith('2.'):
-            break
-
-    # Second we create a rest table from it
-    lines = []
-    separator = lambda c='-': '+'.join([''] + [
-        c * (width + 2) for width in widths
-    ] + [''])
-
-    for idx, (version, tables) in enumerate(pythons):
-        if idx:
-            lines.append('')
-            lines.append('')
-
-        line = 'Python %s' % (version,)
-        lines.append(line)
-        lines.append('~' * len(line))
-
-        for table in tables:
-            lines.append('')
-            lines.append('.. rst-class:: benchmark')
-            lines.append('')
-
-            for idx, row in enumerate(table):
-                if idx == 0:
-                    # header
-                    lines.append(separator())
-                    lines.append('|'.join([''] + [
-                        ' %s%*s ' % (col, len(col) - width, '')
-                        for width, col in zip(widths, row)
-                    ] + ['']))
-                    lines.append(separator('='))
-                else: # data
-                    lines.append('|'.join([''] + [
-                        j == 0 and (
-                            ' %s%*s ' % (col, len(col) - widths[j], '')
-                        ) or (
-                            ['%*s  ', ' %*s '][idx == 1] % (widths[j], col)
-                        )
-                        for j, col in enumerate(row)
-                    ] + ['']))
-                    lines.append(separator())
-
-    fplines = []
-    fp = open(filename)
-    try:
-        fpiter = iter(fp)
-        for line in fpiter:
-            line = line.rstrip()
-            if line == '.. begin tables':
-                buf = []
-                for line in fpiter:
-                    line = line.rstrip()
-                    if line == '.. end tables':
-                        fplines.append('.. begin tables')
-                        fplines.append('')
-                        fplines.extend(lines)
-                        fplines.append('')
-                        fplines.append('.. end tables')
-                        buf = []
-                        break
-                    else:
-                        buf.append(line)
-                else:
-                    fplines.extend(buf)
-                    _sys.stderr.write("Placeholder container not found!\n")
-            else:
-                fplines.append(line)
-    finally:
-        fp.close()
-
-    fp = open(filename, 'w')
-    try:
-        fp.write('\n'.join(fplines) + '\n')
-    finally:
-        fp.close()
-
-
-def write_plain(filename, results):
-    """
-    Output plain benchmark results
-
-    :Parameters:
-      `filename` : ``str``
-        Filename to write to
-
-      `results` : ``list``
-        Results
-    """
-    lines = []
-    results = sorted(results, reverse=True)
-    for idx, (version, import_notes, result) in enumerate(results):
-        if idx:
-            lines.append('')
-            lines.append('')
-
-        lines.append('$ python%s -OO bench/main.py bench/*.js' % (
-            '.'.join(version.split('.')[:2])
-        ))
-        lines.append('~' * 72)
-        for note in import_notes:
-            lines.append(uni(note))
-        lines.append('Python Release: %s' % (version,))
-
-        for single in result:
-            lines.append('')
-            lines.append('Benchmarking %r... (%.1f KiB)' % (
-                uni(single['filename']), single['size'] / 1024.0
-            ))
-            for msg in single['messages']:
-                lines.append(msg)
-            times = []
-            space = max([len(uni(port)) for port, _ in single['times']])
-            for idx, (port, time) in enumerate(single['times']):
-                port = uni(port)
-                if time is None:
-                    lines.append("  FAILED %s" % (port,))
-                else:
-                    times.append(time)
-                    lines.append(
-                        "  Timing %s%s ... (%5.1f KiB %s) %8.2f ms" % (
-                            port,
-                            " " * (space - len(port)),
-                            single['sizes'][idx] / 1024.0,
-                            idx == 0 and '*' or ['=', '>', '<'][
-                                cmp(single['sizes'][idx], single['sizes'][0])
-                            ],
-                            time
-                        )
-                    )
-                    if len(times) > 1:
-                        lines[-1] += " (factor: %s)" % (', '.join([
-                            '%.2f' % (timed / time) for timed in times[:-1]
-                        ]))
-
-    lines.append('')
-    lines.append('')
-    lines.append('# vim: nowrap')
-    fp = open(filename, 'w')
-    try:
-        fp.write('\n'.join(lines) + '\n')
-    finally:
-        fp.close()
-
-
-def main(argv=None):
-    """ Main """
-    import getopt as _getopt
-    import pickle as _pickle
-
-    if argv is None:
-        argv = _sys.argv[1:]
-    try:
-        opts, args = _getopt.getopt(argv, "hp:t:", ["help"])
-    except getopt.GetoptError:
-        e = _sys.exc_info()[0](_sys.exc_info()[1])
-        print >> _sys.stderr, "%s\nTry %s -mbench.write --help" % (
-            e,
-            _os.path.basename(_sys.executable),
-        )
-        _sys.exit(2)
-
-    plain, table = None, None
-    for key, value in opts:
-        if key in ("-h", "--help"):
-            print >> _sys.stderr, (
-                "%s -mbench.write [-p plain] [-t table] <pickled" % (
-                    _os.path.basename(_sys.executable),
-                )
-            )
-            _sys.exit(0)
-        elif key == '-p':
-            plain = str(value)
-        elif key == '-t':
-            table = str(value)
-
-    struct = []
-    _sys.stdin = getattr(_sys.stdin, 'detach', lambda: _sys.stdin)()
-    try:
-        while True:
-            version, import_notes, result = _pickle.load(_sys.stdin)
-            if hasattr(version, 'decode'):
-                version = version.decode('latin-1')
-            struct.append((version, import_notes, result))
-    except EOFError:
-        pass
-
-    if plain:
-        write_plain(plain, struct)
-
-    if table:
-        write_table(table, struct)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/BENCHMARKS b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/BENCHMARKS
deleted file mode 100644
index 00fbc90..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/BENCHMARKS
+++ /dev/null
@@ -1,165 +0,0 @@
-$ python3.5 -OO bench/main.py bench/*.js
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 3.5.0
-
-Benchmarking 'bench/apiviewer.js'... (953.2 KiB)
-  Timing simple_port ... (951.5 KiB *)  1417.14 ms
-  Timing jsmin_2_0_9 ... (951.5 KiB >)  1682.43 ms (factor: 0.84)
-  Timing rjsmin      ... (951.5 KiB =)    36.38 ms (factor: 38.95, 46.25)
-  Timing _rjsmin     ... (951.5 KiB =)     1.81 ms (factor: 783.54, 930.22, 20.11)
-
-Benchmarking 'bench/bootstrap.js'... (49.0 KiB)
-  Timing simple_port ... ( 26.4 KiB *)    58.49 ms
-  Timing jsmin_2_0_9 ... ( 26.4 KiB >)    23.18 ms (factor: 2.52)
-  Timing rjsmin      ... ( 26.4 KiB >)     8.93 ms (factor: 6.55, 2.60)
-  Timing _rjsmin     ... ( 26.4 KiB >)     0.13 ms (factor: 444.62, 176.25, 67.89)
-
-Benchmarking 'bench/DateTimeShortcuts.js'... (18.3 KiB)
-  Timing simple_port ... ( 10.2 KiB *)    21.83 ms
-  Timing jsmin_2_0_9 ... ( 10.3 KiB >)     8.87 ms (factor: 2.46)
-  Timing rjsmin      ... ( 10.2 KiB >)     2.42 ms (factor: 9.03, 3.67)
-  Timing _rjsmin     ... ( 10.2 KiB >)     0.05 ms (factor: 479.81, 194.97, 53.16)
-
-Benchmarking 'bench/jquery-1.7.1.js'... (242.4 KiB)
-  Timing simple_port ... (135.9 KiB *)   306.41 ms
-  Timing jsmin_2_0_9 ... (136.8 KiB >)   156.45 ms (factor: 1.96)
-  Timing rjsmin      ... (135.9 KiB =)    61.57 ms (factor: 4.98, 2.54)
-  Timing _rjsmin     ... (135.9 KiB =)     0.83 ms (factor: 368.52, 188.17, 74.05)
-
-Benchmarking 'bench/knockout-2.0.0.js'... (38.9 KiB)
-  Timing simple_port ... ( 38.6 KiB *)    56.58 ms
-  Timing jsmin_2_0_9 ... ( 38.6 KiB >)    25.53 ms (factor: 2.22)
-  Timing rjsmin      ... ( 38.6 KiB >)     1.88 ms (factor: 30.11, 13.58)
-  Timing _rjsmin     ... ( 38.6 KiB >)     0.08 ms (factor: 736.51, 332.27, 24.46)
-
-Benchmarking 'bench/markermanager.js'... (28.6 KiB)
-  Timing simple_port ... ( 11.6 KiB *)    28.61 ms
-  Timing jsmin_2_0_9 ... ( 11.6 KiB >)    11.74 ms (factor: 2.44)
-  Timing rjsmin      ... ( 11.6 KiB =)     3.81 ms (factor: 7.51, 3.08)
-  Timing _rjsmin     ... ( 11.6 KiB =)     0.06 ms (factor: 497.49, 204.19, 66.25)
-
-
-$ python3.4 -OO bench/main.py bench/*.js
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 3.4.3
-
-Benchmarking 'bench/apiviewer.js'... (953.2 KiB)
-  Timing simple_port ... (951.5 KiB *)  1486.02 ms
-  Timing jsmin_2_0_9 ... (951.5 KiB >)  1798.61 ms (factor: 0.83)
-  Timing rjsmin      ... (951.5 KiB =)    37.49 ms (factor: 39.64, 47.98)
-  Timing _rjsmin     ... (951.5 KiB =)     1.90 ms (factor: 780.39, 944.55, 19.69)
-
-Benchmarking 'bench/bootstrap.js'... (49.0 KiB)
-  Timing simple_port ... ( 26.4 KiB *)    63.29 ms
-  Timing jsmin_2_0_9 ... ( 26.4 KiB >)    27.47 ms (factor: 2.30)
-  Timing rjsmin      ... ( 26.4 KiB >)     9.30 ms (factor: 6.80, 2.95)
-  Timing _rjsmin     ... ( 26.4 KiB >)     0.14 ms (factor: 459.12, 199.29, 67.47)
-
-Benchmarking 'bench/DateTimeShortcuts.js'... (18.3 KiB)
-  Timing simple_port ... ( 10.2 KiB *)    23.70 ms
-  Timing jsmin_2_0_9 ... ( 10.3 KiB >)     9.66 ms (factor: 2.45)
-  Timing rjsmin      ... ( 10.2 KiB >)     2.51 ms (factor: 9.44, 3.85)
-  Timing _rjsmin     ... ( 10.2 KiB >)     0.05 ms (factor: 485.22, 197.80, 51.38)
-
-Benchmarking 'bench/jquery-1.7.1.js'... (242.4 KiB)
-  Timing simple_port ... (135.9 KiB *)   332.05 ms
-  Timing jsmin_2_0_9 ... (136.8 KiB >)   170.77 ms (factor: 1.94)
-  Timing rjsmin      ... (135.9 KiB =)    64.29 ms (factor: 5.17, 2.66)
-  Timing _rjsmin     ... (135.9 KiB =)     0.86 ms (factor: 385.59, 198.30, 74.65)
-
-Benchmarking 'bench/knockout-2.0.0.js'... (38.9 KiB)
-  Timing simple_port ... ( 38.6 KiB *)    60.90 ms
-  Timing jsmin_2_0_9 ... ( 38.6 KiB >)    27.06 ms (factor: 2.25)
-  Timing rjsmin      ... ( 38.6 KiB >)     1.99 ms (factor: 30.55, 13.57)
-  Timing _rjsmin     ... ( 38.6 KiB >)     0.08 ms (factor: 731.84, 325.16, 23.96)
-
-Benchmarking 'bench/markermanager.js'... (28.6 KiB)
-  Timing simple_port ... ( 11.6 KiB *)    31.08 ms
-  Timing jsmin_2_0_9 ... ( 11.6 KiB >)    12.89 ms (factor: 2.41)
-  Timing rjsmin      ... ( 11.6 KiB =)     3.99 ms (factor: 7.78, 3.23)
-  Timing _rjsmin     ... ( 11.6 KiB =)     0.06 ms (factor: 512.70, 212.64, 65.88)
-
-
-$ python3.3 -OO bench/main.py bench/*.js
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 3.3.5
-
-Benchmarking 'bench/apiviewer.js'... (953.2 KiB)
-  Timing simple_port ... (951.5 KiB *)  1824.95 ms
-  Timing jsmin_2_0_9 ... (951.5 KiB >)  1874.17 ms (factor: 0.97)
-  Timing rjsmin      ... (951.5 KiB =)    45.03 ms (factor: 40.53, 41.63)
-  Timing _rjsmin     ... (951.5 KiB =)     1.86 ms (factor: 982.48, 1008.98, 24.24)
-
-Benchmarking 'bench/bootstrap.js'... (49.0 KiB)
-  Timing simple_port ... ( 26.4 KiB *)    72.87 ms
-  Timing jsmin_2_0_9 ... ( 26.4 KiB >)    27.80 ms (factor: 2.62)
-  Timing rjsmin      ... ( 26.4 KiB >)    10.58 ms (factor: 6.89, 2.63)
-  Timing _rjsmin     ... ( 26.4 KiB >)     0.14 ms (factor: 528.45, 201.57, 76.74)
-
-Benchmarking 'bench/DateTimeShortcuts.js'... (18.3 KiB)
-  Timing simple_port ... ( 10.2 KiB *)    27.12 ms
-  Timing jsmin_2_0_9 ... ( 10.3 KiB >)    10.54 ms (factor: 2.57)
-  Timing rjsmin      ... ( 10.2 KiB >)     2.76 ms (factor: 9.82, 3.82)
-  Timing _rjsmin     ... ( 10.2 KiB >)     0.05 ms (factor: 560.00, 217.65, 57.00)
-
-Benchmarking 'bench/jquery-1.7.1.js'... (242.4 KiB)
-  Timing simple_port ... (135.9 KiB *)   385.43 ms
-  Timing jsmin_2_0_9 ... (136.8 KiB >)   183.31 ms (factor: 2.10)
-  Timing rjsmin      ... (135.9 KiB =)    73.03 ms (factor: 5.28, 2.51)
-  Timing _rjsmin     ... (135.9 KiB =)     0.87 ms (factor: 445.30, 211.78, 84.38)
-
-Benchmarking 'bench/knockout-2.0.0.js'... (38.9 KiB)
-  Timing simple_port ... ( 38.6 KiB *)    71.85 ms
-  Timing jsmin_2_0_9 ... ( 38.6 KiB >)    29.80 ms (factor: 2.41)
-  Timing rjsmin      ... ( 38.6 KiB >)     2.37 ms (factor: 30.28, 12.56)
-  Timing _rjsmin     ... ( 38.6 KiB >)     0.08 ms (factor: 897.57, 372.29, 29.64)
-
-Benchmarking 'bench/markermanager.js'... (28.6 KiB)
-  Timing simple_port ... ( 11.6 KiB *)    35.54 ms
-  Timing jsmin_2_0_9 ... ( 11.6 KiB >)    14.17 ms (factor: 2.51)
-  Timing rjsmin      ... ( 11.6 KiB =)     4.80 ms (factor: 7.40, 2.95)
-  Timing _rjsmin     ... ( 11.6 KiB =)     0.06 ms (factor: 592.11, 236.04, 80.03)
-
-
-$ python2.7 -OO bench/main.py bench/*.js
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Python Release: 2.7.10
-
-Benchmarking 'bench/apiviewer.js'... (953.2 KiB)
-  Timing simple_port ... (951.5 KiB *)  1838.28 ms
-  Timing jsmin_2_0_9 ... (951.5 KiB >)  2031.25 ms (factor: 0.91)
-  Timing rjsmin      ... (951.5 KiB =)    44.39 ms (factor: 41.41, 45.76)
-  Timing _rjsmin     ... (951.5 KiB =)     1.65 ms (factor: 1114.11, 1231.06, 26.90)
-
-Benchmarking 'bench/bootstrap.js'... (49.0 KiB)
-  Timing simple_port ... ( 26.4 KiB *)    73.95 ms
-  Timing jsmin_2_0_9 ... ( 26.4 KiB >)    31.02 ms (factor: 2.38)
-  Timing rjsmin      ... ( 26.4 KiB >)     9.36 ms (factor: 7.90, 3.32)
-  Timing _rjsmin     ... ( 26.4 KiB >)     0.13 ms (factor: 582.62, 244.42, 73.71)
-
-Benchmarking 'bench/DateTimeShortcuts.js'... (18.3 KiB)
-  Timing simple_port ... ( 10.2 KiB *)    27.22 ms
-  Timing jsmin_2_0_9 ... ( 10.3 KiB >)    11.76 ms (factor: 2.32)
-  Timing rjsmin      ... ( 10.2 KiB >)     2.57 ms (factor: 10.59, 4.57)
-  Timing _rjsmin     ... ( 10.2 KiB >)     0.04 ms (factor: 772.01, 333.43, 72.92)
-
-Benchmarking 'bench/jquery-1.7.1.js'... (242.4 KiB)
-  Timing simple_port ... (135.9 KiB *)   379.62 ms
-  Timing jsmin_2_0_9 ... (136.8 KiB >)   207.60 ms (factor: 1.83)
-  Timing rjsmin      ... (135.9 KiB =)    65.50 ms (factor: 5.80, 3.17)
-  Timing _rjsmin     ... (135.9 KiB =)     0.80 ms (factor: 475.82, 260.21, 82.10)
-
-Benchmarking 'bench/knockout-2.0.0.js'... (38.9 KiB)
-  Timing simple_port ... ( 38.6 KiB *)    73.44 ms
-  Timing jsmin_2_0_9 ... ( 38.6 KiB >)    34.63 ms (factor: 2.12)
-  Timing rjsmin      ... ( 38.6 KiB >)     2.05 ms (factor: 35.80, 16.89)
-  Timing _rjsmin     ... ( 38.6 KiB >)     0.07 ms (factor: 1000.09, 471.65, 27.93)
-
-Benchmarking 'bench/markermanager.js'... (28.6 KiB)
-  Timing simple_port ... ( 11.6 KiB *)    36.26 ms
-  Timing jsmin_2_0_9 ... ( 11.6 KiB >)    15.54 ms (factor: 2.33)
-  Timing rjsmin      ... ( 11.6 KiB =)     4.06 ms (factor: 8.94, 3.83)
-  Timing _rjsmin     ... ( 11.6 KiB =)     0.05 ms (factor: 663.56, 284.44, 74.24)
-
-
-# vim: nowrap
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/CHANGES b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/CHANGES
deleted file mode 100644
index ce74c4c..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/CHANGES
+++ /dev/null
@@ -1,111 +0,0 @@
-Changes with version 1.0.12
-
- *) Benchmark updates, dropped slimit benchmarks, because of installation
-    trouble
-
- *) Reworked handling of comments starting with exclamation marks. The matcher
-    should no longer get out of sync, even if they appear in the middle of other
-    matches.
-
- *) Handle line terminators before and after regex literals more sensible
-
-
-Changes with version 1.0.11
-
- *) Benchmark updates
-
- *) Lifted max restrictions for CPython and Jython as well.
-
- *) Lifted max restrictions for pypy versions. Added pypy3 support.
-    Submitted by https://github.com/tony
-
-
-Changes with version 1.0.10
-
- *) Added support for pypy 2.2
-
- *) Relint with newer pylint
-
- *) Fix locale problem with the setup script on python3.
-    Submitted by https://github.com/svenstaro
-
-
-Changes with version 1.0.9
-
- *) Documentation and benchmark updates
-
-
-Changes with version 1.0.8
-
- *) Updated benchmarks
-
- *) Added command line option for keeping comments starting with an exclamation
-    mark (-b)
-
- *) Added command line option for disabling the C implemention (-p)
-
- *) Added support for python 3.4
-
- *) Added support for keeping comments starting with an exclamation mark. This
-    feature can be enabled by passing keep_bang_comments=True to the jsmin
-    function.
-
-
-Changes with version 1.0.7
-
- *) Fix inconsistency between Python and C (Python implementation was buggy).
-    Spotted by: Dave Smith <dave thesmithfam.org>
-
- *) Added support for jython 2.7
-
-
-Changes with version 1.0.6
-
- *) Added compat option to setup.py supporting the pip installer
-
- *) Added support for pypy (1.9, 2.0)
-
- *) Added support for jython (2.5)
-
-
-Changes with version 1.0.5
-
- *) Newline removal before ! operator was made more sensible.
-
-
-Changes with version 1.0.4
-
- *) Added support for Python 3.3
-
- *) Collapsion protection was reduced to "+ +" and "- -" sequences (which
-    still includes longer sequences like "+ ++")
-
-
-Changes with version 1.0.3
-
- *) "+ ++" and "- --" sequences are no longer collapsed. They were before,
-    because the original jsmin collapsed them, too.
-
- *) Updated benchmarks, added slimit and removed jsmin v8 (because it produced
-    invalid results).
-
- *) Removed "classic" regex variant.
-
-
-Changes with version 1.0.2
-
- *) Although it should work, python 2.3 is no longer supported.
-    (No suitable test environment)
-
- *) "return /regex/" is now recognized as regex expression. It wasn't before,
-    because the original jsmin ignored that, too.
-
-
-Changes with version 1.0.1
-
- *) Add C extension reimplementing the regex from rjsmin.py
-
-
-Changes with version 1.0.0
-
- *) First stable release.
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/CLASSIFIERS b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/CLASSIFIERS
deleted file mode 100644
index 10d5965..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/CLASSIFIERS
+++ /dev/null
@@ -1,19 +0,0 @@
-Development Status :: 5 - Production/Stable
-Environment :: Web Environment
-Intended Audience :: Developers
-License :: OSI Approved
-License :: OSI Approved :: Apache License, Version 2.0
-Operating System :: OS Independent
-Programming Language :: C
-Programming Language :: Python
-Programming Language :: Python :: 2
-Programming Language :: Python :: 3
-Programming Language :: Python :: Implementation :: CPython
-Programming Language :: Python :: Implementation :: Jython
-Programming Language :: Python :: Implementation :: PyPy
-Topic :: Internet :: WWW/HTTP :: Dynamic Content
-Topic :: Software Development :: Libraries
-Topic :: Software Development :: Libraries :: Python Modules
-Topic :: Text Processing
-Topic :: Text Processing :: Filters
-Topic :: Utilities
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/DESCRIPTION b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/DESCRIPTION
deleted file mode 100644
index 26a5fb3..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/DESCRIPTION
+++ /dev/null
@@ -1,73 +0,0 @@
-=====================
- Javascript Minifier
-=====================
-
-rJSmin is a javascript minifier written in python.
-
-The minifier is based on the semantics of `jsmin.c by Douglas Crockford`_\.
-
-The module is a re-implementation aiming for speed, so it can be used at
-runtime (rather than during a preprocessing step). Usually it produces the
-same results as the original ``jsmin.c``. It differs in the following ways:
-
-- there is no error detection: unterminated string, regex and comment
-  literals are treated as regular javascript code and minified as such.
-- Control characters inside string and regex literals are left untouched; they
-  are not converted to spaces (nor to \n)
-- Newline characters are not allowed inside string and regex literals, except
-  for line continuations in string literals (ECMA-5).
-- "return /regex/" is recognized correctly.
-- Line terminators after regex literals are handled more sensibly
-- "+ +" and "- -" sequences are not collapsed to '++' or '--'
-- Newlines before ! operators are removed more sensibly
-- Comments starting with an exclamation mark (``!``) can be kept optionally
-- rJSmin does not handle streams, but only complete strings. (However, the
-  module provides a "streamy" interface).
-
-Since most parts of the logic are handled by the regex engine it's way faster
-than the original python port of ``jsmin.c`` by Baruch Even. The speed factor
-varies between about 6 and 55 depending on input and python version (it gets
-faster the more compressed the input already is).  Compared to the
-speed-refactored python port by Dave St.Germain the performance gain is less
-dramatic but still between 3 and 50 (for huge inputs)). See the
-docs/BENCHMARKS file for details.
-
-rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.
-
-Both python 2 (>=2.4) and python 3 are supported.
-
-.. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c
-
-
-Copyright and License
-~~~~~~~~~~~~~~~~~~~~~
-
-Copyright 2011 - 2015
-André Malo or his licensors, as applicable.
-
-The whole package (except for the files in the bench/ directory) is
-distributed under the Apache License Version 2.0. You'll find a copy in the
-root directory of the distribution or online at:
-<http://www.apache.org/licenses/LICENSE-2.0>.
-
-
-Bugs
-~~~~
-
-No bugs, of course. ;-)
-But if you've found one or have an idea how to improve rjsmin, feel free
-to send a pull request on `github <https://github.com/ndparker/rjsmin>`_
-or send a mail to <rjsmin-bugs@perlig.de>.
-
-
-Author Information
-~~~~~~~~~~~~~~~~~~
-
-André "nd" Malo <nd perlig.de>
-GPG: 0x8103A37E
-
-
-    If God intended people to be naked, they would be born that way.
-    -- Oscar Wilde
-
-.. vim:tw=72 syntax=rest
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/PROVIDES b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/PROVIDES
deleted file mode 100644
index 8e9e663..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/PROVIDES
+++ /dev/null
@@ -1 +0,0 @@
-rjsmin (1.0)
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/SUMMARY b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/SUMMARY
deleted file mode 100644
index 52064ce..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/SUMMARY
+++ /dev/null
@@ -1 +0,0 @@
-Javascript Minifier
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/api-objects.txt b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/api-objects.txt
deleted file mode 100644
index e5f2e82..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/api-objects.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-rjsmin	rjsmin-module.html
-rjsmin.__license__	rjsmin-module.html#__license__
-rjsmin.jsmin	rjsmin-module.html#jsmin
-rjsmin.__package__	rjsmin-module.html#__package__
-rjsmin._make_jsmin	rjsmin-module.html#_make_jsmin
-rjsmin.jsmin_for_posers	rjsmin-module.html#jsmin_for_posers
-rjsmin.__doc__	rjsmin-module.html#__doc__
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/crarr.png b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/crarr.png
deleted file mode 100644
index 26b43c5..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/crarr.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/epydoc.css b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/epydoc.css
deleted file mode 100644
index 86d4170..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/epydoc.css
+++ /dev/null
@@ -1,322 +0,0 @@
-
-
-/* Epydoc CSS Stylesheet
- *
- * This stylesheet can be used to customize the appearance of epydoc's
- * HTML output.
- *
- */
-
-/* Default Colors & Styles
- *   - Set the default foreground & background color with 'body'; and 
- *     link colors with 'a:link' and 'a:visited'.
- *   - Use bold for decision list terms.
- *   - The heading styles defined here are used for headings *within*
- *     docstring descriptions.  All headings used by epydoc itself use
- *     either class='epydoc' or class='toc' (CSS styles for both
- *     defined below).
- */
-body                        { background: #ffffff; color: #000000; }
-p                           { margin-top: 0.5em; margin-bottom: 0.5em; }
-a:link                      { color: #0000ff; }
-a:visited                   { color: #204080; }
-dt                          { font-weight: bold; }
-h1                          { font-size: +140%; font-style: italic;
-                              font-weight: bold; }
-h2                          { font-size: +125%; font-style: italic;
-                              font-weight: bold; }
-h3                          { font-size: +110%; font-style: italic;
-                              font-weight: normal; }
-code                        { font-size: 100%; }
-/* N.B.: class, not pseudoclass */
-a.link                      { font-family: monospace; }
- 
-/* Page Header & Footer
- *   - The standard page header consists of a navigation bar (with
- *     pointers to standard pages such as 'home' and 'trees'); a
- *     breadcrumbs list, which can be used to navigate to containing
- *     classes or modules; options links, to show/hide private
- *     variables and to show/hide frames; and a page title (using
- *     <h1>).  The page title may be followed by a link to the
- *     corresponding source code (using 'span.codelink').
- *   - The footer consists of a navigation bar, a timestamp, and a
- *     pointer to epydoc's homepage.
- */ 
-h1.epydoc                   { margin: 0; font-size: +140%; font-weight: bold; }
-h2.epydoc                   { font-size: +130%; font-weight: bold; }
-h3.epydoc                   { font-size: +115%; font-weight: bold;
-                              margin-top: 0.2em; }
-td h3.epydoc                { font-size: +115%; font-weight: bold;
-                              margin-bottom: 0; }
-table.navbar                { background: #a0c0ff; color: #000000;
-                              border: 2px groove #c0d0d0; }
-table.navbar table          { color: #000000; }
-th.navbar-select            { background: #70b0ff;
-                              color: #000000; } 
-table.navbar a              { text-decoration: none; }  
-table.navbar a:link         { color: #0000ff; }
-table.navbar a:visited      { color: #204080; }
-span.breadcrumbs            { font-size: 85%; font-weight: bold; }
-span.options                { font-size: 70%; }
-span.codelink               { font-size: 85%; }
-td.footer                   { font-size: 85%; }
-
-/* Table Headers
- *   - Each summary table and details section begins with a 'header'
- *     row.  This row contains a section title (marked by
- *     'span.table-header') as well as a show/hide private link
- *     (marked by 'span.options', defined above).
- *   - Summary tables that contain user-defined groups mark those
- *     groups using 'group header' rows.
- */
-td.table-header             { background: #70b0ff; color: #000000;
-                              border: 1px solid #608090; }
-td.table-header table       { color: #000000; }
-td.table-header table a:link      { color: #0000ff; }
-td.table-header table a:visited   { color: #204080; }
-span.table-header           { font-size: 120%; font-weight: bold; }
-th.group-header             { background: #c0e0f8; color: #000000;
-                              text-align: left; font-style: italic; 
-                              font-size: 115%; 
-                              border: 1px solid #608090; }
-
-/* Summary Tables (functions, variables, etc)
- *   - Each object is described by a single row of the table with
- *     two cells.  The left cell gives the object's type, and is
- *     marked with 'code.summary-type'.  The right cell gives the
- *     object's name and a summary description.
- *   - CSS styles for the table's header and group headers are
- *     defined above, under 'Table Headers'
- */
-table.summary               { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090;
-                              margin-bottom: 0.5em; }
-td.summary                  { border: 1px solid #608090; }
-code.summary-type           { font-size: 85%; }
-table.summary a:link        { color: #0000ff; }
-table.summary a:visited     { color: #204080; }
-
-
-/* Details Tables (functions, variables, etc)
- *   - Each object is described in its own div.
- *   - A single-row summary table w/ table-header is used as
- *     a header for each details section (CSS style for table-header
- *     is defined above, under 'Table Headers').
- */
-table.details               { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090;
-                              margin: .2em 0 0 0; }
-table.details table         { color: #000000; }
-table.details a:link        { color: #0000ff; }
-table.details a:visited     { color: #204080; }
-
-/* Fields */
-dl.fields                   { margin-left: 2em; margin-top: 1em;
-                              margin-bottom: 1em; }
-dl.fields dd ul             { margin-left: 0em; padding-left: 0em; }
-dl.fields dd ul li ul       { margin-left: 2em; padding-left: 0em; }
-div.fields                  { margin-left: 2em; }
-div.fields p                { margin-bottom: 0.5em; }
-
-/* Index tables (identifier index, term index, etc)
- *   - link-index is used for indices containing lists of links
- *     (namely, the identifier index & term index).
- *   - index-where is used in link indices for the text indicating
- *     the container/source for each link.
- *   - metadata-index is used for indices containing metadata
- *     extracted from fields (namely, the bug index & todo index).
- */
-table.link-index            { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090; }
-td.link-index               { border-width: 0px; }
-table.link-index a:link     { color: #0000ff; }
-table.link-index a:visited  { color: #204080; }
-span.index-where            { font-size: 70%; }
-table.metadata-index        { border-collapse: collapse;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #608090; 
-                              margin: .2em 0 0 0; }
-td.metadata-index           { border-width: 1px; border-style: solid; }
-table.metadata-index a:link { color: #0000ff; }
-table.metadata-index a:visited  { color: #204080; }
-
-/* Function signatures
- *   - sig* is used for the signature in the details section.
- *   - .summary-sig* is used for the signature in the summary 
- *     table, and when listing property accessor functions.
- * */
-.sig-name                   { color: #006080; }
-.sig-arg                    { color: #008060; }
-.sig-default                { color: #602000; }
-.summary-sig                { font-family: monospace; }
-.summary-sig-name           { color: #006080; font-weight: bold; }
-table.summary a.summary-sig-name:link
-                            { color: #006080; font-weight: bold; }
-table.summary a.summary-sig-name:visited
-                            { color: #006080; font-weight: bold; }
-.summary-sig-arg            { color: #006040; }
-.summary-sig-default        { color: #501800; }
-
-/* Subclass list
- */
-ul.subclass-list { display: inline; }
-ul.subclass-list li { display: inline; }
-
-/* To render variables, classes etc. like functions */
-table.summary .summary-name { color: #006080; font-weight: bold;
-                              font-family: monospace; }
-table.summary
-     a.summary-name:link    { color: #006080; font-weight: bold;
-                              font-family: monospace; }
-table.summary
-    a.summary-name:visited  { color: #006080; font-weight: bold;
-                              font-family: monospace; }
-
-/* Variable values
- *   - In the 'variable details' sections, each varaible's value is
- *     listed in a 'pre.variable' box.  The width of this box is
- *     restricted to 80 chars; if the value's repr is longer than
- *     this it will be wrapped, using a backslash marked with
- *     class 'variable-linewrap'.  If the value's repr is longer
- *     than 3 lines, the rest will be ellided; and an ellipsis
- *     marker ('...' marked with 'variable-ellipsis') will be used.
- *   - If the value is a string, its quote marks will be marked
- *     with 'variable-quote'.
- *   - If the variable is a regexp, it is syntax-highlighted using
- *     the re* CSS classes.
- */
-pre.variable                { padding: .5em; margin: 0;
-                              background: #dce4ec; color: #000000;
-                              border: 1px solid #708890; }
-.variable-linewrap          { color: #604000; font-weight: bold; }
-.variable-ellipsis          { color: #604000; font-weight: bold; }
-.variable-quote             { color: #604000; font-weight: bold; }
-.variable-group             { color: #008000; font-weight: bold; }
-.variable-op                { color: #604000; font-weight: bold; }
-.variable-string            { color: #006030; }
-.variable-unknown           { color: #a00000; font-weight: bold; }
-.re                         { color: #000000; }
-.re-char                    { color: #006030; }
-.re-op                      { color: #600000; }
-.re-group                   { color: #003060; }
-.re-ref                     { color: #404040; }
-
-/* Base tree
- *   - Used by class pages to display the base class hierarchy.
- */
-pre.base-tree               { font-size: 80%; margin: 0; }
-
-/* Frames-based table of contents headers
- *   - Consists of two frames: one for selecting modules; and
- *     the other listing the contents of the selected module.
- *   - h1.toc is used for each frame's heading
- *   - h2.toc is used for subheadings within each frame.
- */
-h1.toc                      { text-align: center; font-size: 105%;
-                              margin: 0; font-weight: bold;
-                              padding: 0; }
-h2.toc                      { font-size: 100%; font-weight: bold; 
-                              margin: 0.5em 0 0 -0.3em; }
-
-/* Syntax Highlighting for Source Code
- *   - doctest examples are displayed in a 'pre.py-doctest' block.
- *     If the example is in a details table entry, then it will use
- *     the colors specified by the 'table pre.py-doctest' line.
- *   - Source code listings are displayed in a 'pre.py-src' block.
- *     Each line is marked with 'span.py-line' (used to draw a line
- *     down the left margin, separating the code from the line
- *     numbers).  Line numbers are displayed with 'span.py-lineno'.
- *     The expand/collapse block toggle button is displayed with
- *     'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not
- *     modify the font size of the text.)
- *   - If a source code page is opened with an anchor, then the
- *     corresponding code block will be highlighted.  The code
- *     block's header is highlighted with 'py-highlight-hdr'; and
- *     the code block's body is highlighted with 'py-highlight'.
- *   - The remaining py-* classes are used to perform syntax
- *     highlighting (py-string for string literals, py-name for names,
- *     etc.)
- */
-pre.py-doctest              { padding: .5em; margin: 1em;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #708890; }
-table pre.py-doctest        { background: #dce4ec;
-                              color: #000000; }
-pre.py-src                  { border: 2px solid #000000; 
-                              background: #f0f0f0; color: #000000; }
-.py-line                    { border-left: 2px solid #000000; 
-                              margin-left: .2em; padding-left: .4em; }
-.py-lineno                  { font-style: italic; font-size: 90%;
-                              padding-left: .5em; }
-a.py-toggle                 { text-decoration: none; }
-div.py-highlight-hdr        { border-top: 2px solid #000000;
-                              border-bottom: 2px solid #000000;
-                              background: #d8e8e8; }
-div.py-highlight            { border-bottom: 2px solid #000000;
-                              background: #d0e0e0; }
-.py-prompt                  { color: #005050; font-weight: bold;}
-.py-more                    { color: #005050; font-weight: bold;}
-.py-string                  { color: #006030; }
-.py-comment                 { color: #003060; }
-.py-keyword                 { color: #600000; }
-.py-output                  { color: #404040; }
-.py-name                    { color: #000050; }
-.py-name:link               { color: #000050 !important; }
-.py-name:visited            { color: #000050 !important; }
-.py-number                  { color: #005000; }
-.py-defname                 { color: #000060; font-weight: bold; }
-.py-def-name                { color: #000060; font-weight: bold; }
-.py-base-class              { color: #000060; }
-.py-param                   { color: #000060; }
-.py-docstring               { color: #006030; }
-.py-decorator               { color: #804020; }
-/* Use this if you don't want links to names underlined: */
-/*a.py-name                   { text-decoration: none; }*/
-
-/* Graphs & Diagrams
- *   - These CSS styles are used for graphs & diagrams generated using
- *     Graphviz dot.  'img.graph-without-title' is used for bare
- *     diagrams (to remove the border created by making the image
- *     clickable).
- */
-img.graph-without-title     { border: none; }
-img.graph-with-title        { border: 1px solid #000000; }
-span.graph-title            { font-weight: bold; }
-span.graph-caption          { }
-
-/* General-purpose classes
- *   - 'p.indent-wrapped-lines' defines a paragraph whose first line
- *     is not indented, but whose subsequent lines are.
- *   - The 'nomargin-top' class is used to remove the top margin (e.g.
- *     from lists).  The 'nomargin' class is used to remove both the
- *     top and bottom margin (but not the left or right margin --
- *     for lists, that would cause the bullets to disappear.)
- */
-p.indent-wrapped-lines      { padding: 0 0 0 7em; text-indent: -7em; 
-                              margin: 0; }
-.nomargin-top               { margin-top: 0; }
-.nomargin                   { margin-top: 0; margin-bottom: 0; }
-
-/* HTML Log */
-div.log-block               { padding: 0; margin: .5em 0 .5em 0;
-                              background: #e8f0f8; color: #000000;
-                              border: 1px solid #000000; }
-div.log-error               { padding: .1em .3em .1em .3em; margin: 4px;
-                              background: #ffb0b0; color: #000000;
-                              border: 1px solid #000000; }
-div.log-warning             { padding: .1em .3em .1em .3em; margin: 4px;
-                              background: #ffffb0; color: #000000;
-                              border: 1px solid #000000; }
-div.log-info               { padding: .1em .3em .1em .3em; margin: 4px;
-                              background: #b0ffb0; color: #000000;
-                              border: 1px solid #000000; }
-h2.log-hdr                  { background: #70b0ff; color: #000000;
-                              margin: 0; padding: 0em 0.5em 0em 0.5em;
-                              border-bottom: 1px solid #000000; font-size: 110%; }
-p.log                       { font-weight: bold; margin: .5em 0 .5em 0; }
-tr.opt-changed              { color: #000000; font-weight: bold; }
-tr.opt-default              { color: #606060; }
-pre.log                     { margin: 0; padding: 0; padding-left: 1em; }
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/epydoc.js b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/epydoc.js
deleted file mode 100644
index e787dbc..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/epydoc.js
+++ /dev/null
@@ -1,293 +0,0 @@
-function toggle_private() {
-        // Search for any private/public links on this page.  Store
-        // their old text in "cmd," so we will know what action to
-        // take; and change their text to the opposite action.
-        var cmd = "?";
-        var elts = document.getElementsByTagName("a");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "privatelink") {
-            cmd = elts[i].innerHTML;
-            elts[i].innerHTML = ((cmd && cmd.substr(0,4)=="show")?
-                                    "hide&nbsp;private":"show&nbsp;private");
-          }
-        }
-        // Update all DIVs containing private objects.
-        var elts = document.getElementsByTagName("div");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
-          }
-          else if (elts[i].className == "public") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"block":"none");
-          }
-        }
-        // Update all table rows containing private objects.  Note, we
-        // use "" instead of "block" becaue IE & firefox disagree on what
-        // this should be (block vs table-row), and "" just gives the
-        // default for both browsers.
-        var elts = document.getElementsByTagName("tr");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"");
-          }
-        }
-        // Update all list items containing private objects.
-        var elts = document.getElementsByTagName("li");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?
-                                        "none":"");
-          }
-        }
-        // Update all list items containing private objects.
-        var elts = document.getElementsByTagName("ul");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "private") {
-            elts[i].style.display = ((cmd && cmd.substr(0,4)=="hide")?"none":"block");
-          }
-        }
-        // Set a cookie to remember the current option.
-        document.cookie = "EpydocPrivate="+cmd;
-      }
-function show_private() {
-        var elts = document.getElementsByTagName("a");
-        for(var i=0; i<elts.length; i++) {
-          if (elts[i].className == "privatelink") {
-            cmd = elts[i].innerHTML;
-            if (cmd && cmd.substr(0,4)=="show")
-                toggle_private();
-          }
-        }
-      }
-function getCookie(name) {
-        var dc = document.cookie;
-        var prefix = name + "=";
-        var begin = dc.indexOf("; " + prefix);
-        if (begin == -1) {
-          begin = dc.indexOf(prefix);
-          if (begin != 0) return null;
-        } else
-        { begin += 2; }
-        var end = document.cookie.indexOf(";", begin);
-        if (end == -1)
-        { end = dc.length; }
-        return unescape(dc.substring(begin + prefix.length, end));
-      }
-function setFrame(url1, url2) {
-          parent.frames[1].location.href = url1;
-          parent.frames[2].location.href = url2;
-      }
-function checkCookie() {
-        var cmd=getCookie("EpydocPrivate");
-        if (cmd && cmd.substr(0,4)!="show" && location.href.indexOf("#_") < 0)
-            toggle_private();
-      }
-function toggleCallGraph(id) {
-        var elt = document.getElementById(id);
-        if (elt.style.display == "none")
-            elt.style.display = "block";
-        else
-            elt.style.display = "none";
-      }
-function expand(id) {
-  var elt = document.getElementById(id+"-expanded");
-  if (elt) elt.style.display = "block";
-  var elt = document.getElementById(id+"-expanded-linenums");
-  if (elt) elt.style.display = "block";
-  var elt = document.getElementById(id+"-collapsed");
-  if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
-  var elt = document.getElementById(id+"-collapsed-linenums");
-  if (elt) { elt.innerHTML = ""; elt.style.display = "none"; }
-  var elt = document.getElementById(id+"-toggle");
-  if (elt) { elt.innerHTML = "-"; }
-}
-
-function collapse(id) {
-  var elt = document.getElementById(id+"-expanded");
-  if (elt) elt.style.display = "none";
-  var elt = document.getElementById(id+"-expanded-linenums");
-  if (elt) elt.style.display = "none";
-  var elt = document.getElementById(id+"-collapsed-linenums");
-  if (elt) { elt.innerHTML = "<br />"; elt.style.display="block"; }
-  var elt = document.getElementById(id+"-toggle");
-  if (elt) { elt.innerHTML = "+"; }
-  var elt = document.getElementById(id+"-collapsed");
-  if (elt) {
-    elt.style.display = "block";
-    
-    var indent = elt.getAttribute("indent");
-    var pad = elt.getAttribute("pad");
-    var s = "<tt class='py-lineno'>";
-    for (var i=0; i<pad.length; i++) { s += "&nbsp;" }
-    s += "</tt>";
-    s += "&nbsp;&nbsp;<tt class='py-line'>";
-    for (var i=0; i<indent.length; i++) { s += "&nbsp;" }
-    s += "<a href='#' onclick='expand(\"" + id;
-    s += "\");return false'>...</a></tt><br />";
-    elt.innerHTML = s;
-  }
-}
-
-function toggle(id) {
-  elt = document.getElementById(id+"-toggle");
-  if (elt.innerHTML == "-")
-      collapse(id); 
-  else
-      expand(id);
-  return false;
-}
-
-function highlight(id) {
-  var elt = document.getElementById(id+"-def");
-  if (elt) elt.className = "py-highlight-hdr";
-  var elt = document.getElementById(id+"-expanded");
-  if (elt) elt.className = "py-highlight";
-  var elt = document.getElementById(id+"-collapsed");
-  if (elt) elt.className = "py-highlight";
-}
-
-function num_lines(s) {
-  var n = 1;
-  var pos = s.indexOf("\n");
-  while ( pos > 0) {
-    n += 1;
-    pos = s.indexOf("\n", pos+1);
-  }
-  return n;
-}
-
-// Collapse all blocks that mave more than `min_lines` lines.
-function collapse_all(min_lines) {
-  var elts = document.getElementsByTagName("div");
-  for (var i=0; i<elts.length; i++) {
-    var elt = elts[i];
-    var split = elt.id.indexOf("-");
-    if (split > 0)
-      if (elt.id.substring(split, elt.id.length) == "-expanded")
-        if (num_lines(elt.innerHTML) > min_lines)
-          collapse(elt.id.substring(0, split));
-  }
-}
-
-function expandto(href) {
-  var start = href.indexOf("#")+1;
-  if (start != 0 && start != href.length) {
-    if (href.substring(start, href.length) != "-") {
-      collapse_all(4);
-      pos = href.indexOf(".", start);
-      while (pos != -1) {
-        var id = href.substring(start, pos);
-        expand(id);
-        pos = href.indexOf(".", pos+1);
-      }
-      var id = href.substring(start, href.length);
-      expand(id);
-      highlight(id);
-    }
-  }
-}
-
-function kill_doclink(id) {
-  var parent = document.getElementById(id);
-  parent.removeChild(parent.childNodes.item(0));
-}
-function auto_kill_doclink(ev) {
-  if (!ev) var ev = window.event;
-  if (!this.contains(ev.toElement)) {
-    var parent = document.getElementById(this.parentID);
-    parent.removeChild(parent.childNodes.item(0));
-  }
-}
-
-function doclink(id, name, targets_id) {
-  var elt = document.getElementById(id);
-
-  // If we already opened the box, then destroy it.
-  // (This case should never occur, but leave it in just in case.)
-  if (elt.childNodes.length > 1) {
-    elt.removeChild(elt.childNodes.item(0));
-  }
-  else {
-    // The outer box: relative + inline positioning.
-    var box1 = document.createElement("div");
-    box1.style.position = "relative";
-    box1.style.display = "inline";
-    box1.style.top = 0;
-    box1.style.left = 0;
-  
-    // A shadow for fun
-    var shadow = document.createElement("div");
-    shadow.style.position = "absolute";
-    shadow.style.left = "-1.3em";
-    shadow.style.top = "-1.3em";
-    shadow.style.background = "#404040";
-    
-    // The inner box: absolute positioning.
-    var box2 = document.createElement("div");
-    box2.style.position = "relative";
-    box2.style.border = "1px solid #a0a0a0";
-    box2.style.left = "-.2em";
-    box2.style.top = "-.2em";
-    box2.style.background = "white";
-    box2.style.padding = ".3em .4em .3em .4em";
-    box2.style.fontStyle = "normal";
-    box2.onmouseout=auto_kill_doclink;
-    box2.parentID = id;
-
-    // Get the targets
-    var targets_elt = document.getElementById(targets_id);
-    var targets = targets_elt.getAttribute("targets");
-    var links = "";
-    target_list = targets.split(",");
-    for (var i=0; i<target_list.length; i++) {
-        var target = target_list[i].split("=");
-        links += "<li><a href='" + target[1] + 
-               "' style='text-decoration:none'>" +
-               target[0] + "</a></li>";
-    }
-  
-    // Put it all together.
-    elt.insertBefore(box1, elt.childNodes.item(0));
-    //box1.appendChild(box2);
-    box1.appendChild(shadow);
-    shadow.appendChild(box2);
-    box2.innerHTML =
-        "Which <b>"+name+"</b> do you want to see documentation for?" +
-        "<ul style='margin-bottom: 0;'>" +
-        links + 
-        "<li><a href='#' style='text-decoration:none' " +
-        "onclick='kill_doclink(\""+id+"\");return false;'>"+
-        "<i>None of the above</i></a></li></ul>";
-  }
-  return false;
-}
-
-function get_anchor() {
-          var href = location.href;
-          var start = href.indexOf("#")+1;
-          if ((start != 0) && (start != href.length))
-              return href.substring(start, href.length);
-      }
-function redirect_url(dottedName) {
-          // Scan through each element of the "pages" list, and check
-          // if "name" matches with any of them.
-          for (var i=0; i<pages.length; i++) {
-
-              // Each page has the form "<pagename>-m" or "<pagename>-c";
-              // extract the <pagename> portion & compare it to dottedName.
-              var pagename = pages[i].substring(0, pages[i].length-2);
-              if (pagename == dottedName.substring(0,pagename.length)) {
-
-                  // We've found a page that matches `dottedName`;
-                  // construct its URL, using leftover `dottedName`
-                  // content to form an anchor.
-                  var pagetype = pages[i].charAt(pages[i].length-1);
-                  var url = pagename + ((pagetype=="m")?"-module.html":
-                                                        "-class.html");
-                  if (dottedName.length > pagename.length)
-                      url += "#" + dottedName.substring(pagename.length+1,
-                                                        dottedName.length);
-                  return url;
-              }
-          }
-      }
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/help.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/help.html
deleted file mode 100644
index 729bb89..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/help.html
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Help</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rjsmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Help&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">&nbsp;</td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-
-<h1 class="epydoc"> API Documentation </h1>
-
-<p> This document contains the API (Application Programming Interface)
-documentation for this project.  Documentation for the Python
-objects defined by the project is divided into separate pages for each
-package, module, and class.  The API documentation also includes two
-pages containing information about the project as a whole: a trees
-page, and an index page.  </p>
-
-<h2> Object Documentation </h2>
-
-  <p>Each <strong>Package Documentation</strong> page contains: </p>
-  <ul>
-    <li> A description of the package. </li>
-    <li> A list of the modules and sub-packages contained by the
-    package.  </li>
-    <li> A summary of the classes defined by the package. </li>
-    <li> A summary of the functions defined by the package. </li>
-    <li> A summary of the variables defined by the package. </li>
-    <li> A detailed description of each function defined by the
-    package. </li>
-    <li> A detailed description of each variable defined by the
-    package. </li>
-  </ul>
-  
-  <p>Each <strong>Module Documentation</strong> page contains:</p>
-  <ul>
-    <li> A description of the module. </li>
-    <li> A summary of the classes defined by the module. </li>
-    <li> A summary of the functions defined by the module. </li>
-    <li> A summary of the variables defined by the module. </li>
-    <li> A detailed description of each function defined by the
-    module. </li>
-    <li> A detailed description of each variable defined by the
-    module. </li>
-  </ul>
-  
-  <p>Each <strong>Class Documentation</strong> page contains: </p>
-  <ul>
-    <li> A class inheritance diagram. </li>
-    <li> A list of known subclasses. </li>
-    <li> A description of the class. </li>
-    <li> A summary of the methods defined by the class. </li>
-    <li> A summary of the instance variables defined by the class. </li>
-    <li> A summary of the class (static) variables defined by the
-    class. </li> 
-    <li> A detailed description of each method defined by the
-    class. </li>
-    <li> A detailed description of each instance variable defined by the
-    class. </li> 
-    <li> A detailed description of each class (static) variable defined
-    by the class. </li> 
-  </ul>
-
-<h2> Project Documentation </h2>
-
-  <p> The <strong>Trees</strong> page contains the module and class hierarchies: </p>
-  <ul>
-    <li> The <em>module hierarchy</em> lists every package and module, with
-    modules grouped into packages.  At the top level, and within each
-    package, modules and sub-packages are listed alphabetically. </li>
-    <li> The <em>class hierarchy</em> lists every class, grouped by base
-    class.  If a class has more than one base class, then it will be
-    listed under each base class.  At the top level, and under each base
-    class, classes are listed alphabetically. </li>
-  </ul>
-  
-  <p> The <strong>Index</strong> page contains indices of terms and
-  identifiers: </p>
-  <ul>
-    <li> The <em>term index</em> lists every term indexed by any object's
-    documentation.  For each term, the index provides links to each
-    place where the term is indexed. </li>
-    <li> The <em>identifier index</em> lists the (short) name of every package,
-    module, class, method, function, variable, and parameter.  For each
-    identifier, the index provides a short description, and a link to
-    its documentation. </li>
-  </ul>
-
-<h2> The Table of Contents </h2>
-
-<p> The table of contents occupies the two frames on the left side of
-the window.  The upper-left frame displays the <em>project
-contents</em>, and the lower-left frame displays the <em>module
-contents</em>: </p>
-
-<table class="help summary" border="1" cellspacing="0" cellpadding="3">
-  <tr style="height: 30%">
-    <td align="center" style="font-size: small">
-       Project<br />Contents<hr />...</td>
-    <td align="center" style="font-size: small" rowspan="2" width="70%">
-      API<br />Documentation<br />Frame<br /><br /><br />
-    </td>
-  </tr>
-  <tr>
-    <td align="center" style="font-size: small">
-      Module<br />Contents<hr />&nbsp;<br />...<br />&nbsp;
-    </td>
-  </tr>
-</table><br />
-
-<p> The <strong>project contents frame</strong> contains a list of all packages
-and modules that are defined by the project.  Clicking on an entry
-will display its contents in the module contents frame.  Clicking on a
-special entry, labeled "Everything," will display the contents of
-the entire project. </p>
-
-<p> The <strong>module contents frame</strong> contains a list of every
-submodule, class, type, exception, function, and variable defined by a
-module or package.  Clicking on an entry will display its
-documentation in the API documentation frame.  Clicking on the name of
-the module, at the top of the frame, will display the documentation
-for the module itself. </p>
-
-<p> The "<strong>frames</strong>" and "<strong>no frames</strong>" buttons below the top
-navigation bar can be used to control whether the table of contents is
-displayed or not. </p>
-
-<h2> The Navigation Bar </h2>
-
-<p> A navigation bar is located at the top and bottom of every page.
-It indicates what type of page you are currently viewing, and allows
-you to go to related pages.  The following table describes the labels
-on the navigation bar.  Note that not some labels (such as
-[Parent]) are not displayed on all pages. </p>
-
-<table class="summary" border="1" cellspacing="0" cellpadding="3" width="100%">
-<tr class="summary">
-  <th>Label</th>
-  <th>Highlighted when...</th>
-  <th>Links to...</th>
-</tr>
-  <tr><td valign="top"><strong>[Parent]</strong></td>
-      <td valign="top"><em>(never highlighted)</em></td>
-      <td valign="top"> the parent of the current package </td></tr>
-  <tr><td valign="top"><strong>[Package]</strong></td>
-      <td valign="top">viewing a package</td>
-      <td valign="top">the package containing the current object
-      </td></tr>
-  <tr><td valign="top"><strong>[Module]</strong></td>
-      <td valign="top">viewing a module</td>
-      <td valign="top">the module containing the current object
-      </td></tr> 
-  <tr><td valign="top"><strong>[Class]</strong></td>
-      <td valign="top">viewing a class </td>
-      <td valign="top">the class containing the current object</td></tr>
-  <tr><td valign="top"><strong>[Trees]</strong></td>
-      <td valign="top">viewing the trees page</td>
-      <td valign="top"> the trees page </td></tr>
-  <tr><td valign="top"><strong>[Index]</strong></td>
-      <td valign="top">viewing the index page</td>
-      <td valign="top"> the index page </td></tr>
-  <tr><td valign="top"><strong>[Help]</strong></td>
-      <td valign="top">viewing the help page</td>
-      <td valign="top"> the help page </td></tr>
-</table>
-
-<p> The "<strong>show private</strong>" and "<strong>hide private</strong>" buttons below
-the top navigation bar can be used to control whether documentation
-for private objects is displayed.  Private objects are usually defined
-as objects whose (short) names begin with a single underscore, but do
-not end with an underscore.  For example, "<code>_x</code>",
-"<code>__pprint</code>", and "<code>epydoc.epytext._tokenize</code>"
-are private objects; but "<code>re.sub</code>",
-"<code>__init__</code>", and "<code>type_</code>" are not.  However,
-if a module defines the "<code>__all__</code>" variable, then its
-contents are used to decide which objects are private. </p>
-
-<p> A timestamp below the bottom navigation bar indicates when each
-page was last updated. </p>
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rjsmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Help&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/identifier-index.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/identifier-index.html
deleted file mode 100644
index 37b4b98..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/identifier-index.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Identifier Index</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rjsmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Indices&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">&nbsp;</td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<table border="0" width="100%">
-<tr valign="bottom"><td>
-<h1 class="epydoc">Identifier Index</h1>
-</td><td>
-[
-  A
-  B
-  C
-  D
-  E
-  F
-  G
-  H
-  I
- <a href="#J">J</a>
-  K
-  L
-  M
-  N
-  O
-  P
-  Q
- <a href="#R">R</a>
-  S
-  T
-  U
-  V
-  W
-  X
-  Y
-  Z
- <a href="#_">_</a>
-]
-</td></table>
-<table border="0" width="100%">
-<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="J">J</a></h2></td>
-<td valign="top">
-<table class="link-index" width="100%" border="1">
-<tr>
-<td width="33%" class="link-index"><a href="rjsmin-module.html#jsmin">jsmin()</a><br />
-<span class="index-where">(in&nbsp;<a href="rjsmin-module.html">rjsmin</a>)</span></td>
-<td width="33%" class="link-index">&nbsp;</td>
-<td width="33%" class="link-index">&nbsp;</td>
-</tr>
-<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
-</table>
-</td></tr>
-<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="R">R</a></h2></td>
-<td valign="top">
-<table class="link-index" width="100%" border="1">
-<tr>
-<td width="33%" class="link-index"><a href="rjsmin-module.html">rjsmin</a></td>
-<td width="33%" class="link-index">&nbsp;</td>
-<td width="33%" class="link-index">&nbsp;</td>
-</tr>
-<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
-</table>
-</td></tr>
-<tr valign="top"><td valign="top" width="1%"><h2 class="epydoc"><a name="_">_</a></h2></td>
-<td valign="top">
-<table class="link-index" width="100%" border="1">
-<tr>
-<td width="33%" class="link-index"><a href="rjsmin-module.html#__doc__">__doc__</a><br />
-<span class="index-where">(in&nbsp;<a href="rjsmin-module.html">rjsmin</a>)</span></td>
-<td width="33%" class="link-index"><a href="rjsmin-module.html#__license__">__license__</a><br />
-<span class="index-where">(in&nbsp;<a href="rjsmin-module.html">rjsmin</a>)</span></td>
-<td width="33%" class="link-index"><a href="rjsmin-module.html#__package__">__package__</a><br />
-<span class="index-where">(in&nbsp;<a href="rjsmin-module.html">rjsmin</a>)</span></td>
-</tr>
-<tr><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td><td class="link-index">&nbsp;</td></tr>
-</table>
-</td></tr>
-</table>
-<br /><br /><!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rjsmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Indices&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/index.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/index.html
deleted file mode 100644
index e51b6da..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/index.html
+++ /dev/null
@@ -1,216 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>rjsmin</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">
-      <span class="breadcrumbs">
-        Module&nbsp;rjsmin
-      </span>
-    </td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<!-- ==================== MODULE DESCRIPTION ==================== -->
-<h1 class="epydoc">Module rjsmin</h1><p class="nomargin-top"><span class="codelink"><a href="rjsmin-pysrc.html">source&nbsp;code</a></span></p>
-<p>rJSmin is a javascript minifier written in python.</p>
-<p>The minifier is based on the semantics of <a class="rst-reference external" href="http://www.crockford.com/javascript/jsmin.c" target="_top">jsmin.c by Douglas Crockford</a>.</p>
-<p>The module is a re-implementation aiming for speed, so it can be used at
-runtime (rather than during a preprocessing step). Usually it produces the
-same results as the original <tt class="rst-docutils literal">jsmin.c</tt>. It differs in the following ways:</p>
-<ul class="rst-simple">
-<li>there is no error detection: unterminated string, regex and comment
-literals are treated as regular javascript code and minified as such.</li>
-<li>Control characters inside string and regex literals are left untouched; they
-are not converted to spaces (nor to n)</li>
-<li>Newline characters are not allowed inside string and regex literals, except
-for line continuations in string literals (ECMA-5).</li>
-<li>&quot;return /regex/&quot; is recognized correctly.</li>
-<li>Line terminators after regex literals are handled more sensibly</li>
-<li>&quot;+ +&quot; and &quot;- -&quot; sequences are not collapsed to '++' or '--'</li>
-<li>Newlines before ! operators are removed more sensibly</li>
-<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally</li>
-<li>rJSmin does not handle streams, but only complete strings. (However, the
-module provides a &quot;streamy&quot; interface).</li>
-</ul>
-<p>Since most parts of the logic are handled by the regex engine it's way faster
-than the original python port of <tt class="rst-docutils literal">jsmin.c</tt> by Baruch Even. The speed factor
-varies between about 6 and 55 depending on input and python version (it gets
-faster the more compressed the input already is). Compared to the
-speed-refactored python port by Dave St.Germain the performance gain is less
-dramatic but still between 3 and 50 (for huge inputs). See the docs/BENCHMARKS
-file for details.</p>
-<p>rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.</p>
-<p>Both python 2 and python 3 are supported.</p>
-
-<hr />
-<div class="fields">      <p><strong>Copyright:</strong>
-        Copyright 2011 - 2015
-Andr&#233; Malo or his licensors, as applicable
-      </p>
-      <p><strong>License:</strong>
-        <p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at</p>
-<blockquote>
-<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote>
-<p>Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.</p>
-      </p>
-      <p><strong>Version:</strong>
-        1.0.12
-      </p>
-      <p><strong>Author:</strong>
-        Andr&#233; Malo
-      </p>
-</div><!-- ==================== FUNCTIONS ==================== -->
-<a name="section-Functions"></a>
-<table class="summary" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Functions</span></td>
-</tr>
-<tr>
-    <td width="15%" align="right" valign="top" class="summary">
-      <span class="summary-type"><tt class="rst-docutils literal">str</tt></span>
-    </td><td class="summary">
-      <table width="100%" cellpadding="0" cellspacing="0" border="0">
-        <tr>
-          <td><span class="summary-sig"><a href="rjsmin-module.html#jsmin" class="summary-sig-name">jsmin</a>(<span class="summary-sig-arg">script</span>,
-        <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br />
-      Minify javascript based on <a class="rst-reference external" href="http://www.crockford.com/javascript/jsmin.c" target="_top">jsmin.c by Douglas Crockford</a>.</td>
-          <td align="right" valign="top">
-            <span class="codelink"><a href="rjsmin-pysrc.html#jsmin">source&nbsp;code</a></span>
-            
-          </td>
-        </tr>
-      </table>
-      
-    </td>
-  </tr>
-</table>
-<!-- ==================== FUNCTION DETAILS ==================== -->
-<a name="section-FunctionDetails"></a>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Function Details</span></td>
-</tr>
-</table>
-<a name="jsmin"></a>
-<div>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr><td>
-  <table width="100%" cellpadding="0" cellspacing="0" border="0">
-  <tr valign="top"><td>
-  <h3 class="epydoc"><span class="sig"><span class="sig-name">jsmin</span>(<span class="sig-arg">script</span>,
-        <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span>
-  </h3>
-  </td><td align="right" valign="top"
-    ><span class="codelink"><a href="rjsmin-pysrc.html#jsmin">source&nbsp;code</a></span>&nbsp;
-    </td>
-  </tr></table>
-  
-  <p>Minify javascript based on <a class="rst-reference external" href="http://www.crockford.com/javascript/jsmin.c" target="_top">jsmin.c by Douglas Crockford</a>.</p>
-<p>Instead of parsing the stream char by char, it uses a regular
-expression approach which minifies the whole script with one big
-substitution regex.</p>
-  <dl class="fields">
-    <dt>Parameters:</dt>
-    <dd><ul class="nomargin-top">
-        <li><strong class="pname"><code>script</code></strong> (<tt class="rst-docutils literal">str</tt>) - Script to minify</li>
-        <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li>
-    </ul></dd>
-    <dt>Returns: <tt class="rst-docutils literal">str</tt></dt>
-        <dd>Minified script</dd>
-  </dl>
-</td></tr></table>
-</div>
-<br />
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/module-tree.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/module-tree.html
deleted file mode 100644
index d89305d..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/module-tree.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>Module Hierarchy</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rjsmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Trees&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">&nbsp;</td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<h1 class="epydoc">Module Hierarchy</h1>
-<ul class="nomargin-top">
-    <li> <strong class="uidlink"><a href="rjsmin-module.html">rjsmin</a></strong>: <em class="summary">rJSmin is a javascript minifier written in python.</em>    </li>
-</ul>
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="rjsmin-module.html">Home</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Trees&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/redirect.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/redirect.html
deleted file mode 100644
index 50aee0e..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/redirect.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<html><head><title>Epydoc Redirect Page</title>
-<meta http-equiv="cache-control" content="no-cache" />
-<meta http-equiv="expires" content="0" />
-<meta http-equiv="pragma" content="no-cache" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-<body>
-<script type="text/javascript">
-<!--
-var pages = ["rjsmin-m"];
-var dottedName = get_anchor();
-if (dottedName) {
-    var target = redirect_url(dottedName);
-    if (target) window.location.replace(target);
-}
-// -->
-</script>
-
-<h3>Epydoc Auto-redirect page</h3>
-
-<p>When javascript is enabled, this page will redirect URLs of
-the form <tt>redirect.html#<i>dotted.name</i></tt> to the
-documentation for the object with the given fully-qualified
-dotted name.</p>
-<p><a id="message"> &nbsp; </a></p>
-
-<script type="text/javascript">
-<!--
-if (dottedName) {
-    var msg = document.getElementById("message");
-    msg.innerHTML = "No documentation found for <tt>"+
-                    dottedName+"</tt>";
-}
-// -->
-</script>
-
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/rjsmin-module.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/rjsmin-module.html
deleted file mode 100644
index e51b6da..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/rjsmin-module.html
+++ /dev/null
@@ -1,216 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>rjsmin</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">
-      <span class="breadcrumbs">
-        Module&nbsp;rjsmin
-      </span>
-    </td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<!-- ==================== MODULE DESCRIPTION ==================== -->
-<h1 class="epydoc">Module rjsmin</h1><p class="nomargin-top"><span class="codelink"><a href="rjsmin-pysrc.html">source&nbsp;code</a></span></p>
-<p>rJSmin is a javascript minifier written in python.</p>
-<p>The minifier is based on the semantics of <a class="rst-reference external" href="http://www.crockford.com/javascript/jsmin.c" target="_top">jsmin.c by Douglas Crockford</a>.</p>
-<p>The module is a re-implementation aiming for speed, so it can be used at
-runtime (rather than during a preprocessing step). Usually it produces the
-same results as the original <tt class="rst-docutils literal">jsmin.c</tt>. It differs in the following ways:</p>
-<ul class="rst-simple">
-<li>there is no error detection: unterminated string, regex and comment
-literals are treated as regular javascript code and minified as such.</li>
-<li>Control characters inside string and regex literals are left untouched; they
-are not converted to spaces (nor to n)</li>
-<li>Newline characters are not allowed inside string and regex literals, except
-for line continuations in string literals (ECMA-5).</li>
-<li>&quot;return /regex/&quot; is recognized correctly.</li>
-<li>Line terminators after regex literals are handled more sensibly</li>
-<li>&quot;+ +&quot; and &quot;- -&quot; sequences are not collapsed to '++' or '--'</li>
-<li>Newlines before ! operators are removed more sensibly</li>
-<li>Comments starting with an exclamation mark (<tt class="rst-docutils literal">!</tt>) can be kept optionally</li>
-<li>rJSmin does not handle streams, but only complete strings. (However, the
-module provides a &quot;streamy&quot; interface).</li>
-</ul>
-<p>Since most parts of the logic are handled by the regex engine it's way faster
-than the original python port of <tt class="rst-docutils literal">jsmin.c</tt> by Baruch Even. The speed factor
-varies between about 6 and 55 depending on input and python version (it gets
-faster the more compressed the input already is). Compared to the
-speed-refactored python port by Dave St.Germain the performance gain is less
-dramatic but still between 3 and 50 (for huge inputs). See the docs/BENCHMARKS
-file for details.</p>
-<p>rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.</p>
-<p>Both python 2 and python 3 are supported.</p>
-
-<hr />
-<div class="fields">      <p><strong>Copyright:</strong>
-        Copyright 2011 - 2015
-Andr&#233; Malo or his licensors, as applicable
-      </p>
-      <p><strong>License:</strong>
-        <p>Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at</p>
-<blockquote>
-<a class="rst-reference external" href="http://www.apache.org/licenses/LICENSE-2.0" target="_top">http://www.apache.org/licenses/LICENSE-2.0</a></blockquote>
-<p>Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.</p>
-      </p>
-      <p><strong>Version:</strong>
-        1.0.12
-      </p>
-      <p><strong>Author:</strong>
-        Andr&#233; Malo
-      </p>
-</div><!-- ==================== FUNCTIONS ==================== -->
-<a name="section-Functions"></a>
-<table class="summary" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Functions</span></td>
-</tr>
-<tr>
-    <td width="15%" align="right" valign="top" class="summary">
-      <span class="summary-type"><tt class="rst-docutils literal">str</tt></span>
-    </td><td class="summary">
-      <table width="100%" cellpadding="0" cellspacing="0" border="0">
-        <tr>
-          <td><span class="summary-sig"><a href="rjsmin-module.html#jsmin" class="summary-sig-name">jsmin</a>(<span class="summary-sig-arg">script</span>,
-        <span class="summary-sig-arg">keep_bang_comments</span>=<span class="summary-sig-default">False</span>)</span><br />
-      Minify javascript based on <a class="rst-reference external" href="http://www.crockford.com/javascript/jsmin.c" target="_top">jsmin.c by Douglas Crockford</a>.</td>
-          <td align="right" valign="top">
-            <span class="codelink"><a href="rjsmin-pysrc.html#jsmin">source&nbsp;code</a></span>
-            
-          </td>
-        </tr>
-      </table>
-      
-    </td>
-  </tr>
-</table>
-<!-- ==================== FUNCTION DETAILS ==================== -->
-<a name="section-FunctionDetails"></a>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr bgcolor="#70b0f0" class="table-header">
-  <td align="left" colspan="2" class="table-header">
-    <span class="table-header">Function Details</span></td>
-</tr>
-</table>
-<a name="jsmin"></a>
-<div>
-<table class="details" border="1" cellpadding="3"
-       cellspacing="0" width="100%" bgcolor="white">
-<tr><td>
-  <table width="100%" cellpadding="0" cellspacing="0" border="0">
-  <tr valign="top"><td>
-  <h3 class="epydoc"><span class="sig"><span class="sig-name">jsmin</span>(<span class="sig-arg">script</span>,
-        <span class="sig-arg">keep_bang_comments</span>=<span class="sig-default">False</span>)</span>
-  </h3>
-  </td><td align="right" valign="top"
-    ><span class="codelink"><a href="rjsmin-pysrc.html#jsmin">source&nbsp;code</a></span>&nbsp;
-    </td>
-  </tr></table>
-  
-  <p>Minify javascript based on <a class="rst-reference external" href="http://www.crockford.com/javascript/jsmin.c" target="_top">jsmin.c by Douglas Crockford</a>.</p>
-<p>Instead of parsing the stream char by char, it uses a regular
-expression approach which minifies the whole script with one big
-substitution regex.</p>
-  <dl class="fields">
-    <dt>Parameters:</dt>
-    <dd><ul class="nomargin-top">
-        <li><strong class="pname"><code>script</code></strong> (<tt class="rst-docutils literal">str</tt>) - Script to minify</li>
-        <li><strong class="pname"><code>keep_bang_comments</code></strong> (<tt class="rst-docutils literal">bool</tt>) - Keep comments starting with an exclamation mark? (<tt class="rst-docutils literal"><span class="pre">/*!...*/</span></tt>)</li>
-    </ul></dd>
-    <dt>Returns: <tt class="rst-docutils literal">str</tt></dt>
-        <dd>Minified script</dd>
-  </dl>
-</td></tr></table>
-</div>
-<br />
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/rjsmin-pysrc.html b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/rjsmin-pysrc.html
deleted file mode 100644
index acf0aaa..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/docs/apidoc/rjsmin-pysrc.html
+++ /dev/null
@@ -1,617 +0,0 @@
-<?xml version="1.0" encoding="ascii"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-          "DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-  <title>rjsmin</title>
-  <link rel="stylesheet" href="epydoc.css" type="text/css" />
-  <script type="text/javascript" src="epydoc.js"></script>
-</head>
-
-<body bgcolor="white" text="black" link="blue" vlink="#204080"
-      alink="#204080">
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-<table width="100%" cellpadding="0" cellspacing="0">
-  <tr valign="top">
-    <td width="100%">
-      <span class="breadcrumbs">
-        Module&nbsp;rjsmin
-      </span>
-    </td>
-    <td>
-      <table cellpadding="0" cellspacing="0">
-        <!-- hide/show private -->
-      </table>
-    </td>
-  </tr>
-</table>
-<h1 class="epydoc">Source Code for <a href="rjsmin-module.html">Module rjsmin</a></h1>
-<pre class="py-src">
-<a name="L1"></a><tt class="py-lineno">  1</tt>  <tt class="py-line"><tt class="py-comment">#!/usr/bin/env python</tt> </tt>
-<a name="L2"></a><tt class="py-lineno">  2</tt>  <tt class="py-line"><tt class="py-comment"># -*- coding: ascii -*-</tt> </tt>
-<a name="L3"></a><tt class="py-lineno">  3</tt>  <tt class="py-line"><tt class="py-docstring">r"""</tt> </tt>
-<a name="L4"></a><tt class="py-lineno">  4</tt>  <tt class="py-line"><tt class="py-docstring">=====================</tt> </tt>
-<a name="L5"></a><tt class="py-lineno">  5</tt>  <tt class="py-line"><tt class="py-docstring"> Javascript Minifier</tt> </tt>
-<a name="L6"></a><tt class="py-lineno">  6</tt>  <tt class="py-line"><tt class="py-docstring">=====================</tt> </tt>
-<a name="L7"></a><tt class="py-lineno">  7</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L8"></a><tt class="py-lineno">  8</tt>  <tt class="py-line"><tt class="py-docstring">rJSmin is a javascript minifier written in python.</tt> </tt>
-<a name="L9"></a><tt class="py-lineno">  9</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L10"></a><tt class="py-lineno"> 10</tt>  <tt class="py-line"><tt class="py-docstring">The minifier is based on the semantics of `jsmin.c by Douglas Crockford`_\\.</tt> </tt>
-<a name="L11"></a><tt class="py-lineno"> 11</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L12"></a><tt class="py-lineno"> 12</tt>  <tt class="py-line"><tt class="py-docstring">:Copyright:</tt> </tt>
-<a name="L13"></a><tt class="py-lineno"> 13</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L14"></a><tt class="py-lineno"> 14</tt>  <tt class="py-line"><tt class="py-docstring"> Copyright 2011 - 2015</tt> </tt>
-<a name="L15"></a><tt class="py-lineno"> 15</tt>  <tt class="py-line"><tt class="py-docstring"> Andr\xe9 Malo or his licensors, as applicable</tt> </tt>
-<a name="L16"></a><tt class="py-lineno"> 16</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L17"></a><tt class="py-lineno"> 17</tt>  <tt class="py-line"><tt class="py-docstring">:License:</tt> </tt>
-<a name="L18"></a><tt class="py-lineno"> 18</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L19"></a><tt class="py-lineno"> 19</tt>  <tt class="py-line"><tt class="py-docstring"> Licensed under the Apache License, Version 2.0 (the "License");</tt> </tt>
-<a name="L20"></a><tt class="py-lineno"> 20</tt>  <tt class="py-line"><tt class="py-docstring"> you may not use this file except in compliance with the License.</tt> </tt>
-<a name="L21"></a><tt class="py-lineno"> 21</tt>  <tt class="py-line"><tt class="py-docstring"> You may obtain a copy of the License at</tt> </tt>
-<a name="L22"></a><tt class="py-lineno"> 22</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L23"></a><tt class="py-lineno"> 23</tt>  <tt class="py-line"><tt class="py-docstring">     http://www.apache.org/licenses/LICENSE-2.0</tt> </tt>
-<a name="L24"></a><tt class="py-lineno"> 24</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L25"></a><tt class="py-lineno"> 25</tt>  <tt class="py-line"><tt class="py-docstring"> Unless required by applicable law or agreed to in writing, software</tt> </tt>
-<a name="L26"></a><tt class="py-lineno"> 26</tt>  <tt class="py-line"><tt class="py-docstring"> distributed under the License is distributed on an "AS IS" BASIS,</tt> </tt>
-<a name="L27"></a><tt class="py-lineno"> 27</tt>  <tt class="py-line"><tt class="py-docstring"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</tt> </tt>
-<a name="L28"></a><tt class="py-lineno"> 28</tt>  <tt class="py-line"><tt class="py-docstring"> See the License for the specific language governing permissions and</tt> </tt>
-<a name="L29"></a><tt class="py-lineno"> 29</tt>  <tt class="py-line"><tt class="py-docstring"> limitations under the License.</tt> </tt>
-<a name="L30"></a><tt class="py-lineno"> 30</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L31"></a><tt class="py-lineno"> 31</tt>  <tt class="py-line"><tt class="py-docstring">The module is a re-implementation aiming for speed, so it can be used at</tt> </tt>
-<a name="L32"></a><tt class="py-lineno"> 32</tt>  <tt class="py-line"><tt class="py-docstring">runtime (rather than during a preprocessing step). Usually it produces the</tt> </tt>
-<a name="L33"></a><tt class="py-lineno"> 33</tt>  <tt class="py-line"><tt class="py-docstring">same results as the original ``jsmin.c``. It differs in the following ways:</tt> </tt>
-<a name="L34"></a><tt class="py-lineno"> 34</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L35"></a><tt class="py-lineno"> 35</tt>  <tt class="py-line"><tt class="py-docstring">- there is no error detection: unterminated string, regex and comment</tt> </tt>
-<a name="L36"></a><tt class="py-lineno"> 36</tt>  <tt class="py-line"><tt class="py-docstring">  literals are treated as regular javascript code and minified as such.</tt> </tt>
-<a name="L37"></a><tt class="py-lineno"> 37</tt>  <tt class="py-line"><tt class="py-docstring">- Control characters inside string and regex literals are left untouched; they</tt> </tt>
-<a name="L38"></a><tt class="py-lineno"> 38</tt>  <tt class="py-line"><tt class="py-docstring">  are not converted to spaces (nor to \\n)</tt> </tt>
-<a name="L39"></a><tt class="py-lineno"> 39</tt>  <tt class="py-line"><tt class="py-docstring">- Newline characters are not allowed inside string and regex literals, except</tt> </tt>
-<a name="L40"></a><tt class="py-lineno"> 40</tt>  <tt class="py-line"><tt class="py-docstring">  for line continuations in string literals (ECMA-5).</tt> </tt>
-<a name="L41"></a><tt class="py-lineno"> 41</tt>  <tt class="py-line"><tt class="py-docstring">- "return /regex/" is recognized correctly.</tt> </tt>
-<a name="L42"></a><tt class="py-lineno"> 42</tt>  <tt class="py-line"><tt class="py-docstring">- Line terminators after regex literals are handled more sensibly</tt> </tt>
-<a name="L43"></a><tt class="py-lineno"> 43</tt>  <tt class="py-line"><tt class="py-docstring">- "+ +" and "- -" sequences are not collapsed to '++' or '--'</tt> </tt>
-<a name="L44"></a><tt class="py-lineno"> 44</tt>  <tt class="py-line"><tt class="py-docstring">- Newlines before ! operators are removed more sensibly</tt> </tt>
-<a name="L45"></a><tt class="py-lineno"> 45</tt>  <tt class="py-line"><tt class="py-docstring">- Comments starting with an exclamation mark (``!``) can be kept optionally</tt> </tt>
-<a name="L46"></a><tt class="py-lineno"> 46</tt>  <tt class="py-line"><tt class="py-docstring">- rJSmin does not handle streams, but only complete strings. (However, the</tt> </tt>
-<a name="L47"></a><tt class="py-lineno"> 47</tt>  <tt class="py-line"><tt class="py-docstring">  module provides a "streamy" interface).</tt> </tt>
-<a name="L48"></a><tt class="py-lineno"> 48</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L49"></a><tt class="py-lineno"> 49</tt>  <tt class="py-line"><tt class="py-docstring">Since most parts of the logic are handled by the regex engine it's way faster</tt> </tt>
-<a name="L50"></a><tt class="py-lineno"> 50</tt>  <tt class="py-line"><tt class="py-docstring">than the original python port of ``jsmin.c`` by Baruch Even. The speed factor</tt> </tt>
-<a name="L51"></a><tt class="py-lineno"> 51</tt>  <tt class="py-line"><tt class="py-docstring">varies between about 6 and 55 depending on input and python version (it gets</tt> </tt>
-<a name="L52"></a><tt class="py-lineno"> 52</tt>  <tt class="py-line"><tt class="py-docstring">faster the more compressed the input already is). Compared to the</tt> </tt>
-<a name="L53"></a><tt class="py-lineno"> 53</tt>  <tt class="py-line"><tt class="py-docstring">speed-refactored python port by Dave St.Germain the performance gain is less</tt> </tt>
-<a name="L54"></a><tt class="py-lineno"> 54</tt>  <tt class="py-line"><tt class="py-docstring">dramatic but still between 3 and 50 (for huge inputs). See the docs/BENCHMARKS</tt> </tt>
-<a name="L55"></a><tt class="py-lineno"> 55</tt>  <tt class="py-line"><tt class="py-docstring">file for details.</tt> </tt>
-<a name="L56"></a><tt class="py-lineno"> 56</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L57"></a><tt class="py-lineno"> 57</tt>  <tt class="py-line"><tt class="py-docstring">rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.</tt> </tt>
-<a name="L58"></a><tt class="py-lineno"> 58</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L59"></a><tt class="py-lineno"> 59</tt>  <tt class="py-line"><tt class="py-docstring">Both python 2 and python 3 are supported.</tt> </tt>
-<a name="L60"></a><tt class="py-lineno"> 60</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L61"></a><tt class="py-lineno"> 61</tt>  <tt class="py-line"><tt class="py-docstring">.. _jsmin.c by Douglas Crockford:</tt> </tt>
-<a name="L62"></a><tt class="py-lineno"> 62</tt>  <tt class="py-line"><tt class="py-docstring">   http://www.crockford.com/javascript/jsmin.c</tt> </tt>
-<a name="L63"></a><tt class="py-lineno"> 63</tt>  <tt class="py-line"><tt class="py-docstring">"""</tt> </tt>
-<a name="L64"></a><tt class="py-lineno"> 64</tt>  <tt class="py-line"><tt class="py-keyword">if</tt> <tt id="link-0" class="py-name" targets="Variable rjsmin.__doc__=rjsmin-module.html#__doc__"><a title="rjsmin.__doc__" class="py-name" href="#" onclick="return doclink('link-0', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">:</tt> </tt>
-<a name="L65"></a><tt class="py-lineno"> 65</tt>  <tt class="py-line">    <tt class="py-comment"># pylint: disable = redefined-builtin</tt> </tt>
-<a name="L66"></a><tt class="py-lineno"> 66</tt>  <tt class="py-line">    <tt id="link-1" class="py-name"><a title="rjsmin.__doc__" class="py-name" href="#" onclick="return doclink('link-1', '__doc__', 'link-0');">__doc__</a></tt> <tt class="py-op">=</tt> <tt id="link-2" class="py-name"><a title="rjsmin.__doc__" class="py-name" href="#" onclick="return doclink('link-2', '__doc__', 'link-0');">__doc__</a></tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt>
-<a name="L67"></a><tt class="py-lineno"> 67</tt>  <tt class="py-line"><tt class="py-name">__author__</tt> <tt class="py-op">=</tt> <tt class="py-string">r"Andr\xe9 Malo"</tt><tt class="py-op">.</tt><tt class="py-name">encode</tt><tt class="py-op">(</tt><tt class="py-string">'ascii'</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">decode</tt><tt class="py-op">(</tt><tt class="py-string">'unicode_escape'</tt><tt class="py-op">)</tt> </tt>
-<a name="L68"></a><tt class="py-lineno"> 68</tt>  <tt class="py-line"><tt class="py-name">__docformat__</tt> <tt class="py-op">=</tt> <tt class="py-string">"restructuredtext en"</tt> </tt>
-<a name="L69"></a><tt class="py-lineno"> 69</tt>  <tt class="py-line"><tt id="link-3" class="py-name" targets="Variable rjsmin.__license__=rjsmin-module.html#__license__"><a title="rjsmin.__license__" class="py-name" href="#" onclick="return doclink('link-3', '__license__', 'link-3');">__license__</a></tt> <tt class="py-op">=</tt> <tt class="py-string">"Apache License, Version 2.0"</tt> </tt>
-<a name="L70"></a><tt class="py-lineno"> 70</tt>  <tt class="py-line"><tt class="py-name">__version__</tt> <tt class="py-op">=</tt> <tt class="py-string">'1.0.12'</tt> </tt>
-<a name="L71"></a><tt class="py-lineno"> 71</tt>  <tt class="py-line"><tt class="py-name">__all__</tt> <tt class="py-op">=</tt> <tt class="py-op">[</tt><tt class="py-string">'jsmin'</tt><tt class="py-op">]</tt> </tt>
-<a name="L72"></a><tt class="py-lineno"> 72</tt>  <tt class="py-line"> </tt>
-<a name="L73"></a><tt class="py-lineno"> 73</tt>  <tt class="py-line"><tt class="py-keyword">import</tt> <tt class="py-name">re</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_re</tt> </tt>
-<a name="L74"></a><tt class="py-lineno"> 74</tt>  <tt class="py-line"> </tt>
-<a name="L75"></a><tt class="py-lineno"> 75</tt>  <tt class="py-line"> </tt>
-<a name="_make_jsmin"></a><div id="_make_jsmin-def"><a name="L76"></a><tt class="py-lineno"> 76</tt> <a class="py-toggle" href="#" id="_make_jsmin-toggle" onclick="return toggle('_make_jsmin');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="rjsmin-module.html#_make_jsmin">_make_jsmin</a><tt class="py-op">(</tt><tt class="py-param">python_only</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-</div><div id="_make_jsmin-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="_make_jsmin-expanded"><a name="L77"></a><tt class="py-lineno"> 77</tt>  <tt class="py-line">    <tt class="py-docstring">"""</tt> </tt>
-<a name="L78"></a><tt class="py-lineno"> 78</tt>  <tt class="py-line"><tt class="py-docstring">    Generate JS minifier based on `jsmin.c by Douglas Crockford`_</tt> </tt>
-<a name="L79"></a><tt class="py-lineno"> 79</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L80"></a><tt class="py-lineno"> 80</tt>  <tt class="py-line"><tt class="py-docstring">    .. _jsmin.c by Douglas Crockford:</tt> </tt>
-<a name="L81"></a><tt class="py-lineno"> 81</tt>  <tt class="py-line"><tt class="py-docstring">       http://www.crockford.com/javascript/jsmin.c</tt> </tt>
-<a name="L82"></a><tt class="py-lineno"> 82</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L83"></a><tt class="py-lineno"> 83</tt>  <tt class="py-line"><tt class="py-docstring">    :Parameters:</tt> </tt>
-<a name="L84"></a><tt class="py-lineno"> 84</tt>  <tt class="py-line"><tt class="py-docstring">      `python_only` : ``bool``</tt> </tt>
-<a name="L85"></a><tt class="py-lineno"> 85</tt>  <tt class="py-line"><tt class="py-docstring">        Use only the python variant. If true, the c extension is not even</tt> </tt>
-<a name="L86"></a><tt class="py-lineno"> 86</tt>  <tt class="py-line"><tt class="py-docstring">        tried to be loaded.</tt> </tt>
-<a name="L87"></a><tt class="py-lineno"> 87</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L88"></a><tt class="py-lineno"> 88</tt>  <tt class="py-line"><tt class="py-docstring">    :Return: Minifier</tt> </tt>
-<a name="L89"></a><tt class="py-lineno"> 89</tt>  <tt class="py-line"><tt class="py-docstring">    :Rtype: ``callable``</tt> </tt>
-<a name="L90"></a><tt class="py-lineno"> 90</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
-<a name="L91"></a><tt class="py-lineno"> 91</tt>  <tt class="py-line">    <tt class="py-comment"># pylint: disable = unused-variable</tt> </tt>
-<a name="L92"></a><tt class="py-lineno"> 92</tt>  <tt class="py-line">    <tt class="py-comment"># pylint: disable = too-many-locals</tt> </tt>
-<a name="L93"></a><tt class="py-lineno"> 93</tt>  <tt class="py-line"> </tt>
-<a name="L94"></a><tt class="py-lineno"> 94</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">python_only</tt><tt class="py-op">:</tt> </tt>
-<a name="L95"></a><tt class="py-lineno"> 95</tt>  <tt class="py-line">        <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
-<a name="L96"></a><tt class="py-lineno"> 96</tt>  <tt class="py-line">            <tt class="py-keyword">import</tt> <tt class="py-name">_rjsmin</tt> </tt>
-<a name="L97"></a><tt class="py-lineno"> 97</tt>  <tt class="py-line">        <tt class="py-keyword">except</tt> <tt class="py-name">ImportError</tt><tt class="py-op">:</tt> </tt>
-<a name="L98"></a><tt class="py-lineno"> 98</tt>  <tt class="py-line">            <tt class="py-keyword">pass</tt> </tt>
-<a name="L99"></a><tt class="py-lineno"> 99</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L100"></a><tt class="py-lineno">100</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">_rjsmin</tt><tt class="py-op">.</tt><tt id="link-4" class="py-name" targets="Function rjsmin.jsmin()=rjsmin-module.html#jsmin"><a title="rjsmin.jsmin" class="py-name" href="#" onclick="return doclink('link-4', 'jsmin', 'link-4');">jsmin</a></tt> </tt>
-<a name="L101"></a><tt class="py-lineno">101</tt>  <tt class="py-line">    <tt class="py-keyword">try</tt><tt class="py-op">:</tt> </tt>
-<a name="L102"></a><tt class="py-lineno">102</tt>  <tt class="py-line">        <tt class="py-name">xrange</tt> </tt>
-<a name="L103"></a><tt class="py-lineno">103</tt>  <tt class="py-line">    <tt class="py-keyword">except</tt> <tt class="py-name">NameError</tt><tt class="py-op">:</tt> </tt>
-<a name="L104"></a><tt class="py-lineno">104</tt>  <tt class="py-line">        <tt class="py-name">xrange</tt> <tt class="py-op">=</tt> <tt class="py-name">range</tt>  <tt class="py-comment"># pylint: disable = redefined-builtin</tt> </tt>
-<a name="L105"></a><tt class="py-lineno">105</tt>  <tt class="py-line"> </tt>
-<a name="L106"></a><tt class="py-lineno">106</tt>  <tt class="py-line">    <tt class="py-name">space_chars</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[\000-\011\013\014\016-\040]'</tt> </tt>
-<a name="L107"></a><tt class="py-lineno">107</tt>  <tt class="py-line"> </tt>
-<a name="L108"></a><tt class="py-lineno">108</tt>  <tt class="py-line">    <tt class="py-name">line_comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?://[^\r\n]*)'</tt> </tt>
-<a name="L109"></a><tt class="py-lineno">109</tt>  <tt class="py-line">    <tt class="py-name">space_comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
-<a name="L110"></a><tt class="py-lineno">110</tt>  <tt class="py-line">    <tt class="py-name">space_comment_nobang</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
-<a name="L111"></a><tt class="py-lineno">111</tt>  <tt class="py-line">    <tt class="py-name">bang_comment</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/\*![^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
-<a name="L112"></a><tt class="py-lineno">112</tt>  <tt class="py-line"> </tt>
-<a name="L113"></a><tt class="py-lineno">113</tt>  <tt class="py-line">    <tt class="py-name">string1</tt> <tt class="py-op">=</tt> \ </tt>
-<a name="L114"></a><tt class="py-lineno">114</tt>  <tt class="py-line">        <tt class="py-string">r'(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)'</tt> </tt>
-<a name="L115"></a><tt class="py-lineno">115</tt>  <tt class="py-line">    <tt class="py-name">string2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^"\\\r\n]*)*")'</tt> </tt>
-<a name="L116"></a><tt class="py-lineno">116</tt>  <tt class="py-line">    <tt class="py-name">strings</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">string1</tt><tt class="py-op">,</tt> <tt class="py-name">string2</tt><tt class="py-op">)</tt> </tt>
-<a name="L117"></a><tt class="py-lineno">117</tt>  <tt class="py-line"> </tt>
-<a name="L118"></a><tt class="py-lineno">118</tt>  <tt class="py-line">    <tt class="py-name">charclass</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\])'</tt> </tt>
-<a name="L119"></a><tt class="py-lineno">119</tt>  <tt class="py-line">    <tt class="py-name">nospecial</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^/\\\[\r\n]'</tt> </tt>
-<a name="L120"></a><tt class="py-lineno">120</tt>  <tt class="py-line">    <tt class="py-name">regex</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L121"></a><tt class="py-lineno">121</tt>  <tt class="py-line">        <tt class="py-name">nospecial</tt><tt class="py-op">,</tt> <tt class="py-name">charclass</tt><tt class="py-op">,</tt> <tt class="py-name">nospecial</tt> </tt>
-<a name="L122"></a><tt class="py-lineno">122</tt>  <tt class="py-line">    <tt class="py-op">)</tt> </tt>
-<a name="L123"></a><tt class="py-lineno">123</tt>  <tt class="py-line">    <tt class="py-name">space</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s|%s)'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">space_chars</tt><tt class="py-op">,</tt> <tt class="py-name">space_comment</tt><tt class="py-op">)</tt> </tt>
-<a name="L124"></a><tt class="py-lineno">124</tt>  <tt class="py-line">    <tt class="py-name">newline</tt> <tt class="py-op">=</tt> <tt class="py-string">r'(?:%s?[\r\n])'</tt> <tt class="py-op">%</tt> <tt class="py-name">line_comment</tt> </tt>
-<a name="L125"></a><tt class="py-lineno">125</tt>  <tt class="py-line"> </tt>
-<a name="L126"></a><tt class="py-lineno">126</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">fix_charclass</tt><tt class="py-op">(</tt><tt class="py-param">result</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L127"></a><tt class="py-lineno">127</tt>  <tt class="py-line">        <tt class="py-docstring">""" Fixup string of chars to fit into a regex char class """</tt> </tt>
-<a name="L128"></a><tt class="py-lineno">128</tt>  <tt class="py-line">        <tt class="py-name">pos</tt> <tt class="py-op">=</tt> <tt class="py-name">result</tt><tt class="py-op">.</tt><tt class="py-name">find</tt><tt class="py-op">(</tt><tt class="py-string">'-'</tt><tt class="py-op">)</tt> </tt>
-<a name="L129"></a><tt class="py-lineno">129</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">pos</tt> <tt class="py-op">&gt;=</tt> <tt class="py-number">0</tt><tt class="py-op">:</tt> </tt>
-<a name="L130"></a><tt class="py-lineno">130</tt>  <tt class="py-line">            <tt class="py-name">result</tt> <tt class="py-op">=</tt> <tt class="py-string">r'%s%s-'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt><tt class="py-name">result</tt><tt class="py-op">[</tt><tt class="py-op">:</tt><tt class="py-name">pos</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> <tt class="py-name">result</tt><tt class="py-op">[</tt><tt class="py-name">pos</tt> <tt class="py-op">+</tt> <tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
-<a name="L131"></a><tt class="py-lineno">131</tt>  <tt class="py-line"> </tt>
-<a name="L132"></a><tt class="py-lineno">132</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">sequentize</tt><tt class="py-op">(</tt><tt class="py-param">string</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L133"></a><tt class="py-lineno">133</tt>  <tt class="py-line">            <tt class="py-docstring">"""</tt> </tt>
-<a name="L134"></a><tt class="py-lineno">134</tt>  <tt class="py-line"><tt class="py-docstring">            Notate consecutive characters as sequence</tt> </tt>
-<a name="L135"></a><tt class="py-lineno">135</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L136"></a><tt class="py-lineno">136</tt>  <tt class="py-line"><tt class="py-docstring">            (1-4 instead of 1234)</tt> </tt>
-<a name="L137"></a><tt class="py-lineno">137</tt>  <tt class="py-line"><tt class="py-docstring">            """</tt> </tt>
-<a name="L138"></a><tt class="py-lineno">138</tt>  <tt class="py-line">            <tt class="py-name">first</tt><tt class="py-op">,</tt> <tt class="py-name">last</tt><tt class="py-op">,</tt> <tt class="py-name">result</tt> <tt class="py-op">=</tt> <tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-name">None</tt><tt class="py-op">,</tt> <tt class="py-op">[</tt><tt class="py-op">]</tt> </tt>
-<a name="L139"></a><tt class="py-lineno">139</tt>  <tt class="py-line">            <tt class="py-keyword">for</tt> <tt class="py-name">char</tt> <tt class="py-keyword">in</tt> <tt class="py-name">map</tt><tt class="py-op">(</tt><tt class="py-name">ord</tt><tt class="py-op">,</tt> <tt class="py-name">string</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L140"></a><tt class="py-lineno">140</tt>  <tt class="py-line">                <tt class="py-keyword">if</tt> <tt class="py-name">last</tt> <tt class="py-keyword">is</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
-<a name="L141"></a><tt class="py-lineno">141</tt>  <tt class="py-line">                    <tt class="py-name">first</tt> <tt class="py-op">=</tt> <tt class="py-name">last</tt> <tt class="py-op">=</tt> <tt class="py-name">char</tt> </tt>
-<a name="L142"></a><tt class="py-lineno">142</tt>  <tt class="py-line">                <tt class="py-keyword">elif</tt> <tt class="py-name">last</tt> <tt class="py-op">+</tt> <tt class="py-number">1</tt> <tt class="py-op">==</tt> <tt class="py-name">char</tt><tt class="py-op">:</tt> </tt>
-<a name="L143"></a><tt class="py-lineno">143</tt>  <tt class="py-line">                    <tt class="py-name">last</tt> <tt class="py-op">=</tt> <tt class="py-name">char</tt> </tt>
-<a name="L144"></a><tt class="py-lineno">144</tt>  <tt class="py-line">                <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L145"></a><tt class="py-lineno">145</tt>  <tt class="py-line">                    <tt class="py-name">result</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">first</tt><tt class="py-op">,</tt> <tt class="py-name">last</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L146"></a><tt class="py-lineno">146</tt>  <tt class="py-line">                    <tt class="py-name">first</tt> <tt class="py-op">=</tt> <tt class="py-name">last</tt> <tt class="py-op">=</tt> <tt class="py-name">char</tt> </tt>
-<a name="L147"></a><tt class="py-lineno">147</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">last</tt> <tt class="py-keyword">is</tt> <tt class="py-keyword">not</tt> <tt class="py-name">None</tt><tt class="py-op">:</tt> </tt>
-<a name="L148"></a><tt class="py-lineno">148</tt>  <tt class="py-line">                <tt class="py-name">result</tt><tt class="py-op">.</tt><tt class="py-name">append</tt><tt class="py-op">(</tt><tt class="py-op">(</tt><tt class="py-name">first</tt><tt class="py-op">,</tt> <tt class="py-name">last</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L149"></a><tt class="py-lineno">149</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-op">[</tt><tt class="py-string">'%s%s%s'</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L150"></a><tt class="py-lineno">150</tt>  <tt class="py-line">                <tt class="py-name">chr</tt><tt class="py-op">(</tt><tt class="py-name">first</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L151"></a><tt class="py-lineno">151</tt>  <tt class="py-line">                <tt class="py-name">last</tt> <tt class="py-op">&gt;</tt> <tt class="py-name">first</tt> <tt class="py-op">+</tt> <tt class="py-number">1</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'-'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L152"></a><tt class="py-lineno">152</tt>  <tt class="py-line">                <tt class="py-name">last</tt> <tt class="py-op">!=</tt> <tt class="py-name">first</tt> <tt class="py-keyword">and</tt> <tt class="py-name">chr</tt><tt class="py-op">(</tt><tt class="py-name">last</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt> </tt>
-<a name="L153"></a><tt class="py-lineno">153</tt>  <tt class="py-line">            <tt class="py-op">)</tt> <tt class="py-keyword">for</tt> <tt class="py-name">first</tt><tt class="py-op">,</tt> <tt class="py-name">last</tt> <tt class="py-keyword">in</tt> <tt class="py-name">result</tt><tt class="py-op">]</tt><tt class="py-op">)</tt>  <tt class="py-comment"># noqa</tt> </tt>
-</div><a name="L154"></a><tt class="py-lineno">154</tt>  <tt class="py-line"> </tt>
-<a name="L155"></a><tt class="py-lineno">155</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt> </tt>
-<a name="L156"></a><tt class="py-lineno">156</tt>  <tt class="py-line">            <tt class="py-string">r'([\000-\040\047])'</tt><tt class="py-op">,</tt>  <tt class="py-comment"># \047 for better portability</tt> </tt>
-<a name="L157"></a><tt class="py-lineno">157</tt>  <tt class="py-line">            <tt class="py-keyword">lambda</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> <tt class="py-string">'\\%03o'</tt> <tt class="py-op">%</tt> <tt class="py-name">ord</tt><tt class="py-op">(</tt><tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">group</tt><tt class="py-op">(</tt><tt class="py-number">1</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-op">(</tt> </tt>
-<a name="L158"></a><tt class="py-lineno">158</tt>  <tt class="py-line">                <tt class="py-name">sequentize</tt><tt class="py-op">(</tt><tt class="py-name">result</tt><tt class="py-op">)</tt> </tt>
-<a name="L159"></a><tt class="py-lineno">159</tt>  <tt class="py-line">                <tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'\\'</tt><tt class="py-op">,</tt> <tt class="py-string">'\\\\'</tt><tt class="py-op">)</tt> </tt>
-<a name="L160"></a><tt class="py-lineno">160</tt>  <tt class="py-line">                <tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">'['</tt><tt class="py-op">,</tt> <tt class="py-string">'\\['</tt><tt class="py-op">)</tt> </tt>
-<a name="L161"></a><tt class="py-lineno">161</tt>  <tt class="py-line">                <tt class="py-op">.</tt><tt class="py-name">replace</tt><tt class="py-op">(</tt><tt class="py-string">']'</tt><tt class="py-op">,</tt> <tt class="py-string">'\\]'</tt><tt class="py-op">)</tt> </tt>
-<a name="L162"></a><tt class="py-lineno">162</tt>  <tt class="py-line">            <tt class="py-op">)</tt> </tt>
-<a name="L163"></a><tt class="py-lineno">163</tt>  <tt class="py-line">        <tt class="py-op">)</tt> </tt>
-</div><a name="L164"></a><tt class="py-lineno">164</tt>  <tt class="py-line"> </tt>
-<a name="L165"></a><tt class="py-lineno">165</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">id_literal_</tt><tt class="py-op">(</tt><tt class="py-param">what</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L166"></a><tt class="py-lineno">166</tt>  <tt class="py-line">        <tt class="py-docstring">""" Make id_literal like char class """</tt> </tt>
-<a name="L167"></a><tt class="py-lineno">167</tt>  <tt class="py-line">        <tt class="py-name">match</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">what</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">match</tt> </tt>
-<a name="L168"></a><tt class="py-lineno">168</tt>  <tt class="py-line">        <tt class="py-name">result</tt> <tt class="py-op">=</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-op">[</tt> </tt>
-<a name="L169"></a><tt class="py-lineno">169</tt>  <tt class="py-line">            <tt class="py-name">chr</tt><tt class="py-op">(</tt><tt class="py-name">c</tt><tt class="py-op">)</tt> <tt class="py-keyword">for</tt> <tt class="py-name">c</tt> <tt class="py-keyword">in</tt> <tt class="py-name">xrange</tt><tt class="py-op">(</tt><tt class="py-number">127</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">chr</tt><tt class="py-op">(</tt><tt class="py-name">c</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L170"></a><tt class="py-lineno">170</tt>  <tt class="py-line">        <tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
-<a name="L171"></a><tt class="py-lineno">171</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-string">'[^%s]'</tt> <tt class="py-op">%</tt> <tt class="py-name">fix_charclass</tt><tt class="py-op">(</tt><tt class="py-name">result</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L172"></a><tt class="py-lineno">172</tt>  <tt class="py-line"> </tt>
-<a name="L173"></a><tt class="py-lineno">173</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">not_id_literal_</tt><tt class="py-op">(</tt><tt class="py-param">keep</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L174"></a><tt class="py-lineno">174</tt>  <tt class="py-line">        <tt class="py-docstring">""" Make negated id_literal like char class """</tt> </tt>
-<a name="L175"></a><tt class="py-lineno">175</tt>  <tt class="py-line">        <tt class="py-name">match</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-name">id_literal_</tt><tt class="py-op">(</tt><tt class="py-name">keep</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">match</tt> </tt>
-<a name="L176"></a><tt class="py-lineno">176</tt>  <tt class="py-line">        <tt class="py-name">result</tt> <tt class="py-op">=</tt> <tt class="py-string">''</tt><tt class="py-op">.</tt><tt class="py-name">join</tt><tt class="py-op">(</tt><tt class="py-op">[</tt> </tt>
-<a name="L177"></a><tt class="py-lineno">177</tt>  <tt class="py-line">            <tt class="py-name">chr</tt><tt class="py-op">(</tt><tt class="py-name">c</tt><tt class="py-op">)</tt> <tt class="py-keyword">for</tt> <tt class="py-name">c</tt> <tt class="py-keyword">in</tt> <tt class="py-name">xrange</tt><tt class="py-op">(</tt><tt class="py-number">127</tt><tt class="py-op">)</tt> <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">match</tt><tt class="py-op">(</tt><tt class="py-name">chr</tt><tt class="py-op">(</tt><tt class="py-name">c</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-<a name="L178"></a><tt class="py-lineno">178</tt>  <tt class="py-line">        <tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
-<a name="L179"></a><tt class="py-lineno">179</tt>  <tt class="py-line">        <tt class="py-keyword">return</tt> <tt class="py-string">r'[%s]'</tt> <tt class="py-op">%</tt> <tt class="py-name">fix_charclass</tt><tt class="py-op">(</tt><tt class="py-name">result</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L180"></a><tt class="py-lineno">180</tt>  <tt class="py-line"> </tt>
-<a name="L181"></a><tt class="py-lineno">181</tt>  <tt class="py-line">    <tt class="py-name">not_id_literal</tt> <tt class="py-op">=</tt> <tt class="py-name">not_id_literal_</tt><tt class="py-op">(</tt><tt class="py-string">r'[a-zA-Z0-9_$]'</tt><tt class="py-op">)</tt> </tt>
-<a name="L182"></a><tt class="py-lineno">182</tt>  <tt class="py-line">    <tt class="py-name">preregex1</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[(,=:\[!&amp;|?{};\r\n]'</tt> </tt>
-<a name="L183"></a><tt class="py-lineno">183</tt>  <tt class="py-line">    <tt class="py-name">preregex2</tt> <tt class="py-op">=</tt> <tt class="py-string">r'%(not_id_literal)sreturn'</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L184"></a><tt class="py-lineno">184</tt>  <tt class="py-line"> </tt>
-<a name="L185"></a><tt class="py-lineno">185</tt>  <tt class="py-line">    <tt class="py-name">id_literal</tt> <tt class="py-op">=</tt> <tt class="py-name">id_literal_</tt><tt class="py-op">(</tt><tt class="py-string">r'[a-zA-Z0-9_$]'</tt><tt class="py-op">)</tt> </tt>
-<a name="L186"></a><tt class="py-lineno">186</tt>  <tt class="py-line">    <tt class="py-name">id_literal_open</tt> <tt class="py-op">=</tt> <tt class="py-name">id_literal_</tt><tt class="py-op">(</tt><tt class="py-string">r'[a-zA-Z0-9_${\[(!+-]'</tt><tt class="py-op">)</tt> </tt>
-<a name="L187"></a><tt class="py-lineno">187</tt>  <tt class="py-line">    <tt class="py-name">id_literal_close</tt> <tt class="py-op">=</tt> <tt class="py-name">id_literal_</tt><tt class="py-op">(</tt><tt class="py-string">r'[a-zA-Z0-9_$}\])"\047+-]'</tt><tt class="py-op">)</tt> </tt>
-<a name="L188"></a><tt class="py-lineno">188</tt>  <tt class="py-line">    <tt class="py-name">post_regex_off</tt> <tt class="py-op">=</tt> <tt class="py-name">id_literal_</tt><tt class="py-op">(</tt><tt class="py-string">r'[^\000-\040}\])?:|,;.&amp;=+-]'</tt><tt class="py-op">)</tt> </tt>
-<a name="L189"></a><tt class="py-lineno">189</tt>  <tt class="py-line"> </tt>
-<a name="L190"></a><tt class="py-lineno">190</tt>  <tt class="py-line">    <tt class="py-name">dull</tt> <tt class="py-op">=</tt> <tt class="py-string">r'[^\047"/\000-\040]'</tt> </tt>
-<a name="L191"></a><tt class="py-lineno">191</tt>  <tt class="py-line"> </tt>
-<a name="L192"></a><tt class="py-lineno">192</tt>  <tt class="py-line">    <tt class="py-name">space_sub_simple</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L193"></a><tt class="py-lineno">193</tt>  <tt class="py-line">        <tt class="py-comment"># noqa pylint: disable = bad-continuation</tt> </tt>
-<a name="L194"></a><tt class="py-lineno">194</tt>  <tt class="py-line"> </tt>
-<a name="L195"></a><tt class="py-lineno">195</tt>  <tt class="py-line">        <tt class="py-string">r'(%(dull)s+)'</tt>                                         <tt class="py-comment"># 0</tt> </tt>
-<a name="L196"></a><tt class="py-lineno">196</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(strings)s%(dull)s*)'</tt>                             <tt class="py-comment"># 1</tt> </tt>
-<a name="L197"></a><tt class="py-lineno">197</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(preregex1)s)'</tt> </tt>
-<a name="L198"></a><tt class="py-lineno">198</tt>  <tt class="py-line">            <tt class="py-string">r'%(space)s*(?:%(newline)s%(space)s*)*'</tt> </tt>
-<a name="L199"></a><tt class="py-lineno">199</tt>  <tt class="py-line">            <tt class="py-string">r'(%(regex)s)'</tt>                                     <tt class="py-comment"># 2</tt> </tt>
-<a name="L200"></a><tt class="py-lineno">200</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:%(newline)s%(space)s*)+'</tt>           <tt class="py-comment"># 3</tt> </tt>
-<a name="L201"></a><tt class="py-lineno">201</tt>  <tt class="py-line">                <tt class="py-string">r'(?=%(post_regex_off)s))?'</tt> </tt>
-<a name="L202"></a><tt class="py-lineno">202</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(preregex2)s)'</tt> </tt>
-<a name="L203"></a><tt class="py-lineno">203</tt>  <tt class="py-line">            <tt class="py-string">r'%(space)s*(?:(%(newline)s)%(space)s*)*'</tt>          <tt class="py-comment"># 4</tt> </tt>
-<a name="L204"></a><tt class="py-lineno">204</tt>  <tt class="py-line">            <tt class="py-string">r'(%(regex)s)'</tt>                                     <tt class="py-comment"># 5</tt> </tt>
-<a name="L205"></a><tt class="py-lineno">205</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:%(newline)s%(space)s*)+'</tt>           <tt class="py-comment"># 6</tt> </tt>
-<a name="L206"></a><tt class="py-lineno">206</tt>  <tt class="py-line">                <tt class="py-string">r'(?=%(post_regex_off)s))?'</tt> </tt>
-<a name="L207"></a><tt class="py-lineno">207</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(id_literal_close)s)'</tt> </tt>
-<a name="L208"></a><tt class="py-lineno">208</tt>  <tt class="py-line">            <tt class="py-string">r'%(space)s*(?:(%(newline)s)%(space)s*)+'</tt>          <tt class="py-comment"># 7</tt> </tt>
-<a name="L209"></a><tt class="py-lineno">209</tt>  <tt class="py-line">            <tt class="py-string">r'(?=%(id_literal_open)s)'</tt> </tt>
-<a name="L210"></a><tt class="py-lineno">210</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)'</tt>  <tt class="py-comment"># 8</tt> </tt>
-<a name="L211"></a><tt class="py-lineno">211</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=\+)(%(space)s)+(?=\+)'</tt>                          <tt class="py-comment"># 9</tt> </tt>
-<a name="L212"></a><tt class="py-lineno">212</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=-)(%(space)s)+(?=-)'</tt>                            <tt class="py-comment"># 10</tt> </tt>
-<a name="L213"></a><tt class="py-lineno">213</tt>  <tt class="py-line">        <tt class="py-string">r'|%(space)s+'</tt> </tt>
-<a name="L214"></a><tt class="py-lineno">214</tt>  <tt class="py-line">        <tt class="py-string">r'|(?:%(newline)s%(space)s*)+'</tt> </tt>
-<a name="L215"></a><tt class="py-lineno">215</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L216"></a><tt class="py-lineno">216</tt>  <tt class="py-line"> </tt>
-<a name="L217"></a><tt class="py-lineno">217</tt>  <tt class="py-line">    <tt class="py-comment"># print space_sub_simple.__self__.pattern</tt> </tt>
-<a name="L218"></a><tt class="py-lineno">218</tt>  <tt class="py-line"> </tt>
-<a name="L219"></a><tt class="py-lineno">219</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber_simple</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L220"></a><tt class="py-lineno">220</tt>  <tt class="py-line">        <tt class="py-docstring">""" Substitution callback """</tt> </tt>
-<a name="L221"></a><tt class="py-lineno">221</tt>  <tt class="py-line">        <tt class="py-comment"># pylint: disable = too-many-return-statements</tt> </tt>
-<a name="L222"></a><tt class="py-lineno">222</tt>  <tt class="py-line"> </tt>
-<a name="L223"></a><tt class="py-lineno">223</tt>  <tt class="py-line">        <tt class="py-name">groups</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L224"></a><tt class="py-lineno">224</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L225"></a><tt class="py-lineno">225</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
-<a name="L226"></a><tt class="py-lineno">226</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L227"></a><tt class="py-lineno">227</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
-<a name="L228"></a><tt class="py-lineno">228</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L229"></a><tt class="py-lineno">229</tt>  <tt class="py-line">            <tt class="py-keyword">if</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">3</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L230"></a><tt class="py-lineno">230</tt>  <tt class="py-line">                <tt class="py-keyword">return</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'\n'</tt> </tt>
-<a name="L231"></a><tt class="py-lineno">231</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> </tt>
-<a name="L232"></a><tt class="py-lineno">232</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L233"></a><tt class="py-lineno">233</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">"%s%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L234"></a><tt class="py-lineno">234</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L235"></a><tt class="py-lineno">235</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> </tt>
-<a name="L236"></a><tt class="py-lineno">236</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">6</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L237"></a><tt class="py-lineno">237</tt>  <tt class="py-line">            <tt class="py-op">)</tt> </tt>
-<a name="L238"></a><tt class="py-lineno">238</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">7</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L239"></a><tt class="py-lineno">239</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">'\n'</tt> </tt>
-<a name="L240"></a><tt class="py-lineno">240</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">8</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">9</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">10</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L241"></a><tt class="py-lineno">241</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">' '</tt> </tt>
-<a name="L242"></a><tt class="py-lineno">242</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L243"></a><tt class="py-lineno">243</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">''</tt> </tt>
-</div><a name="L244"></a><tt class="py-lineno">244</tt>  <tt class="py-line"> </tt>
-<a name="L245"></a><tt class="py-lineno">245</tt>  <tt class="py-line">    <tt class="py-name">space_sub_banged</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L246"></a><tt class="py-lineno">246</tt>  <tt class="py-line">        <tt class="py-comment"># noqa pylint: disable = bad-continuation</tt> </tt>
-<a name="L247"></a><tt class="py-lineno">247</tt>  <tt class="py-line"> </tt>
-<a name="L248"></a><tt class="py-lineno">248</tt>  <tt class="py-line">        <tt class="py-string">r'(%(dull)s+)'</tt>                                         <tt class="py-comment"># 0</tt> </tt>
-<a name="L249"></a><tt class="py-lineno">249</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(strings)s%(dull)s*)'</tt>                             <tt class="py-comment"># 1</tt> </tt>
-<a name="L250"></a><tt class="py-lineno">250</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(preregex1)s)'</tt> </tt>
-<a name="L251"></a><tt class="py-lineno">251</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:%(newline)s%(space)s*)*)'</tt>          <tt class="py-comment"># 2</tt> </tt>
-<a name="L252"></a><tt class="py-lineno">252</tt>  <tt class="py-line">            <tt class="py-string">r'(%(regex)s)'</tt>                                     <tt class="py-comment"># 3</tt> </tt>
-<a name="L253"></a><tt class="py-lineno">253</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:%(newline)s%(space)s*)+'</tt>           <tt class="py-comment"># 4</tt> </tt>
-<a name="L254"></a><tt class="py-lineno">254</tt>  <tt class="py-line">                <tt class="py-string">r'(?=%(post_regex_off)s))?'</tt> </tt>
-<a name="L255"></a><tt class="py-lineno">255</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(preregex2)s)'</tt> </tt>
-<a name="L256"></a><tt class="py-lineno">256</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:(%(newline)s)%(space)s*)*)'</tt>        <tt class="py-comment"># 5, 6</tt> </tt>
-<a name="L257"></a><tt class="py-lineno">257</tt>  <tt class="py-line">            <tt class="py-string">r'(%(regex)s)'</tt>                                     <tt class="py-comment"># 7</tt> </tt>
-<a name="L258"></a><tt class="py-lineno">258</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:%(newline)s%(space)s*)+'</tt>           <tt class="py-comment"># 8</tt> </tt>
-<a name="L259"></a><tt class="py-lineno">259</tt>  <tt class="py-line">                <tt class="py-string">r'(?=%(post_regex_off)s))?'</tt> </tt>
-<a name="L260"></a><tt class="py-lineno">260</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(id_literal_close)s)'</tt> </tt>
-<a name="L261"></a><tt class="py-lineno">261</tt>  <tt class="py-line">            <tt class="py-string">r'(%(space)s*(?:%(newline)s%(space)s*)+)'</tt>          <tt class="py-comment"># 9</tt> </tt>
-<a name="L262"></a><tt class="py-lineno">262</tt>  <tt class="py-line">            <tt class="py-string">r'(?=%(id_literal_open)s)'</tt> </tt>
-<a name="L263"></a><tt class="py-lineno">263</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=%(id_literal)s)(%(space)s+)(?=%(id_literal)s)'</tt>  <tt class="py-comment"># 10</tt> </tt>
-<a name="L264"></a><tt class="py-lineno">264</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=\+)(%(space)s+)(?=\+)'</tt>                          <tt class="py-comment"># 11</tt> </tt>
-<a name="L265"></a><tt class="py-lineno">265</tt>  <tt class="py-line">        <tt class="py-string">r'|(?&lt;=-)(%(space)s+)(?=-)'</tt>                            <tt class="py-comment"># 12</tt> </tt>
-<a name="L266"></a><tt class="py-lineno">266</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(space)s+)'</tt>                                       <tt class="py-comment"># 13</tt> </tt>
-<a name="L267"></a><tt class="py-lineno">267</tt>  <tt class="py-line">        <tt class="py-string">r'|((?:%(newline)s%(space)s*)+)'</tt>                       <tt class="py-comment"># 14</tt> </tt>
-<a name="L268"></a><tt class="py-lineno">268</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L269"></a><tt class="py-lineno">269</tt>  <tt class="py-line"> </tt>
-<a name="L270"></a><tt class="py-lineno">270</tt>  <tt class="py-line">    <tt class="py-comment"># print space_sub_banged.__self__.pattern</tt> </tt>
-<a name="L271"></a><tt class="py-lineno">271</tt>  <tt class="py-line"> </tt>
-<a name="L272"></a><tt class="py-lineno">272</tt>  <tt class="py-line">    <tt class="py-name">keep</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L273"></a><tt class="py-lineno">273</tt>  <tt class="py-line">        <tt class="py-string">r'%(space_chars)s+|%(space_comment_nobang)s+|%(newline)s+'</tt> </tt>
-<a name="L274"></a><tt class="py-lineno">274</tt>  <tt class="py-line">        <tt class="py-string">r'|(%(bang_comment)s+)'</tt> </tt>
-<a name="L275"></a><tt class="py-lineno">275</tt>  <tt class="py-line">    <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L276"></a><tt class="py-lineno">276</tt>  <tt class="py-line">    <tt class="py-name">keeper</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt> </tt>
-<a name="L277"></a><tt class="py-lineno">277</tt>  <tt class="py-line"> </tt>
-<a name="L278"></a><tt class="py-lineno">278</tt>  <tt class="py-line">    <tt class="py-comment"># print keep.__self__.pattern</tt> </tt>
-<a name="L279"></a><tt class="py-lineno">279</tt>  <tt class="py-line"> </tt>
-<a name="L280"></a><tt class="py-lineno">280</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">space_subber_banged</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L281"></a><tt class="py-lineno">281</tt>  <tt class="py-line">        <tt class="py-docstring">""" Substitution callback """</tt> </tt>
-<a name="L282"></a><tt class="py-lineno">282</tt>  <tt class="py-line">        <tt class="py-comment"># pylint: disable = too-many-return-statements</tt> </tt>
-<a name="L283"></a><tt class="py-lineno">283</tt>  <tt class="py-line"> </tt>
-<a name="L284"></a><tt class="py-lineno">284</tt>  <tt class="py-line">        <tt class="py-name">groups</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L285"></a><tt class="py-lineno">285</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L286"></a><tt class="py-lineno">286</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> </tt>
-<a name="L287"></a><tt class="py-lineno">287</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L288"></a><tt class="py-lineno">288</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> </tt>
-<a name="L289"></a><tt class="py-lineno">289</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">3</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L290"></a><tt class="py-lineno">290</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">"%s%s%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L291"></a><tt class="py-lineno">291</tt>  <tt class="py-line">                <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L292"></a><tt class="py-lineno">292</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">3</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> </tt>
-<a name="L293"></a><tt class="py-lineno">293</tt>  <tt class="py-line">                <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L294"></a><tt class="py-lineno">294</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L295"></a><tt class="py-lineno">295</tt>  <tt class="py-line">            <tt class="py-op">)</tt> </tt>
-<a name="L296"></a><tt class="py-lineno">296</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">7</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L297"></a><tt class="py-lineno">297</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-string">"%s%s%s%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L298"></a><tt class="py-lineno">298</tt>  <tt class="py-line">                <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L299"></a><tt class="py-lineno">299</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">6</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L300"></a><tt class="py-lineno">300</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">7</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> </tt>
-<a name="L301"></a><tt class="py-lineno">301</tt>  <tt class="py-line">                <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">8</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L302"></a><tt class="py-lineno">302</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">8</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L303"></a><tt class="py-lineno">303</tt>  <tt class="py-line">            <tt class="py-op">)</tt> </tt>
-<a name="L304"></a><tt class="py-lineno">304</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">9</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L305"></a><tt class="py-lineno">305</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">9</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-op">+</tt> <tt class="py-string">'\n'</tt> </tt>
-<a name="L306"></a><tt class="py-lineno">306</tt>  <tt class="py-line">        <tt class="py-keyword">elif</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">10</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">11</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">12</tt><tt class="py-op">]</tt><tt class="py-op">:</tt> </tt>
-<a name="L307"></a><tt class="py-lineno">307</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">10</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">11</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">12</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-string">' '</tt> </tt>
-<a name="L308"></a><tt class="py-lineno">308</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L309"></a><tt class="py-lineno">309</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">13</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">14</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L310"></a><tt class="py-lineno">310</tt>  <tt class="py-line"> </tt>
-<a name="L311"></a><tt class="py-lineno">311</tt>  <tt class="py-line">    <tt class="py-keyword">def</tt> <tt class="py-def-name">jsmin</tt><tt class="py-op">(</tt><tt class="py-param">script</tt><tt class="py-op">,</tt> <tt class="py-param">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L312"></a><tt class="py-lineno">312</tt>  <tt class="py-line">        <tt class="py-docstring">r"""</tt> </tt>
-<a name="L313"></a><tt class="py-lineno">313</tt>  <tt class="py-line"><tt class="py-docstring">        Minify javascript based on `jsmin.c by Douglas Crockford`_\.</tt> </tt>
-<a name="L314"></a><tt class="py-lineno">314</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L315"></a><tt class="py-lineno">315</tt>  <tt class="py-line"><tt class="py-docstring">        Instead of parsing the stream char by char, it uses a regular</tt> </tt>
-<a name="L316"></a><tt class="py-lineno">316</tt>  <tt class="py-line"><tt class="py-docstring">        expression approach which minifies the whole script with one big</tt> </tt>
-<a name="L317"></a><tt class="py-lineno">317</tt>  <tt class="py-line"><tt class="py-docstring">        substitution regex.</tt> </tt>
-<a name="L318"></a><tt class="py-lineno">318</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L319"></a><tt class="py-lineno">319</tt>  <tt class="py-line"><tt class="py-docstring">        .. _jsmin.c by Douglas Crockford:</tt> </tt>
-<a name="L320"></a><tt class="py-lineno">320</tt>  <tt class="py-line"><tt class="py-docstring">           http://www.crockford.com/javascript/jsmin.c</tt> </tt>
-<a name="L321"></a><tt class="py-lineno">321</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L322"></a><tt class="py-lineno">322</tt>  <tt class="py-line"><tt class="py-docstring">        :Parameters:</tt> </tt>
-<a name="L323"></a><tt class="py-lineno">323</tt>  <tt class="py-line"><tt class="py-docstring">          `script` : ``str``</tt> </tt>
-<a name="L324"></a><tt class="py-lineno">324</tt>  <tt class="py-line"><tt class="py-docstring">            Script to minify</tt> </tt>
-<a name="L325"></a><tt class="py-lineno">325</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L326"></a><tt class="py-lineno">326</tt>  <tt class="py-line"><tt class="py-docstring">          `keep_bang_comments` : ``bool``</tt> </tt>
-<a name="L327"></a><tt class="py-lineno">327</tt>  <tt class="py-line"><tt class="py-docstring">            Keep comments starting with an exclamation mark? (``/*!...*/``)</tt> </tt>
-<a name="L328"></a><tt class="py-lineno">328</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L329"></a><tt class="py-lineno">329</tt>  <tt class="py-line"><tt class="py-docstring">        :Return: Minified script</tt> </tt>
-<a name="L330"></a><tt class="py-lineno">330</tt>  <tt class="py-line"><tt class="py-docstring">        :Rtype: ``str``</tt> </tt>
-<a name="L331"></a><tt class="py-lineno">331</tt>  <tt class="py-line"><tt class="py-docstring">        """</tt> </tt>
-<a name="L332"></a><tt class="py-lineno">332</tt>  <tt class="py-line">        <tt class="py-comment"># pylint: disable = redefined-outer-name</tt> </tt>
-<a name="L333"></a><tt class="py-lineno">333</tt>  <tt class="py-line"> </tt>
-<a name="L334"></a><tt class="py-lineno">334</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">:</tt> </tt>
-<a name="L335"></a><tt class="py-lineno">335</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">space_sub_banged</tt><tt class="py-op">(</tt> </tt>
-<a name="L336"></a><tt class="py-lineno">336</tt>  <tt class="py-line">                <tt class="py-name">space_subber_banged</tt><tt class="py-op">,</tt> <tt class="py-string">'\n%s\n'</tt> <tt class="py-op">%</tt> <tt class="py-name">script</tt> </tt>
-<a name="L337"></a><tt class="py-lineno">337</tt>  <tt class="py-line">            <tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L338"></a><tt class="py-lineno">338</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L339"></a><tt class="py-lineno">339</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-name">space_sub_simple</tt><tt class="py-op">(</tt> </tt>
-<a name="L340"></a><tt class="py-lineno">340</tt>  <tt class="py-line">                <tt class="py-name">space_subber_simple</tt><tt class="py-op">,</tt> <tt class="py-string">'\n%s\n'</tt> <tt class="py-op">%</tt> <tt class="py-name">script</tt> </tt>
-<a name="L341"></a><tt class="py-lineno">341</tt>  <tt class="py-line">            <tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L342"></a><tt class="py-lineno">342</tt>  <tt class="py-line"> </tt>
-<a name="L343"></a><tt class="py-lineno">343</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt id="link-5" class="py-name"><a title="rjsmin.jsmin" class="py-name" href="#" onclick="return doclink('link-5', 'jsmin', 'link-4');">jsmin</a></tt> </tt>
-</div><a name="L344"></a><tt class="py-lineno">344</tt>  <tt class="py-line"> </tt>
-<a name="L345"></a><tt class="py-lineno">345</tt>  <tt class="py-line"><tt id="link-6" class="py-name"><a title="rjsmin.jsmin" class="py-name" href="#" onclick="return doclink('link-6', 'jsmin', 'link-4');">jsmin</a></tt> <tt class="py-op">=</tt> <tt class="py-name">_make_jsmin</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L346"></a><tt class="py-lineno">346</tt>  <tt class="py-line"> </tt>
-<a name="L347"></a><tt class="py-lineno">347</tt>  <tt class="py-line"> </tt>
-<a name="jsmin_for_posers"></a><div id="jsmin_for_posers-def"><a name="L348"></a><tt class="py-lineno">348</tt> <a class="py-toggle" href="#" id="jsmin_for_posers-toggle" onclick="return toggle('jsmin_for_posers');">-</a><tt class="py-line"><tt class="py-keyword">def</tt> <a class="py-def-name" href="rjsmin-module.html#jsmin_for_posers">jsmin_for_posers</a><tt class="py-op">(</tt><tt class="py-param">script</tt><tt class="py-op">,</tt> <tt class="py-param">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">False</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-</div><div id="jsmin_for_posers-collapsed" style="display:none;" pad="+++" indent="++++"></div><div id="jsmin_for_posers-expanded"><a name="L349"></a><tt class="py-lineno">349</tt>  <tt class="py-line">    <tt class="py-docstring">r"""</tt> </tt>
-<a name="L350"></a><tt class="py-lineno">350</tt>  <tt class="py-line"><tt class="py-docstring">    Minify javascript based on `jsmin.c by Douglas Crockford`_\.</tt> </tt>
-<a name="L351"></a><tt class="py-lineno">351</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L352"></a><tt class="py-lineno">352</tt>  <tt class="py-line"><tt class="py-docstring">    Instead of parsing the stream char by char, it uses a regular</tt> </tt>
-<a name="L353"></a><tt class="py-lineno">353</tt>  <tt class="py-line"><tt class="py-docstring">    expression approach which minifies the whole script with one big</tt> </tt>
-<a name="L354"></a><tt class="py-lineno">354</tt>  <tt class="py-line"><tt class="py-docstring">    substitution regex.</tt> </tt>
-<a name="L355"></a><tt class="py-lineno">355</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L356"></a><tt class="py-lineno">356</tt>  <tt class="py-line"><tt class="py-docstring">    .. _jsmin.c by Douglas Crockford:</tt> </tt>
-<a name="L357"></a><tt class="py-lineno">357</tt>  <tt class="py-line"><tt class="py-docstring">       http://www.crockford.com/javascript/jsmin.c</tt> </tt>
-<a name="L358"></a><tt class="py-lineno">358</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L359"></a><tt class="py-lineno">359</tt>  <tt class="py-line"><tt class="py-docstring">    :Warning: This function is the digest of a _make_jsmin() call. It just</tt> </tt>
-<a name="L360"></a><tt class="py-lineno">360</tt>  <tt class="py-line"><tt class="py-docstring">              utilizes the resulting regexes. It's here for fun and may</tt> </tt>
-<a name="L361"></a><tt class="py-lineno">361</tt>  <tt class="py-line"><tt class="py-docstring">              vanish any time. Use the `jsmin` function instead.</tt> </tt>
-<a name="L362"></a><tt class="py-lineno">362</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L363"></a><tt class="py-lineno">363</tt>  <tt class="py-line"><tt class="py-docstring">    :Parameters:</tt> </tt>
-<a name="L364"></a><tt class="py-lineno">364</tt>  <tt class="py-line"><tt class="py-docstring">      `script` : ``str``</tt> </tt>
-<a name="L365"></a><tt class="py-lineno">365</tt>  <tt class="py-line"><tt class="py-docstring">        Script to minify</tt> </tt>
-<a name="L366"></a><tt class="py-lineno">366</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L367"></a><tt class="py-lineno">367</tt>  <tt class="py-line"><tt class="py-docstring">      `keep_bang_comments` : ``bool``</tt> </tt>
-<a name="L368"></a><tt class="py-lineno">368</tt>  <tt class="py-line"><tt class="py-docstring">        Keep comments starting with an exclamation mark? (``/*!...*/``)</tt> </tt>
-<a name="L369"></a><tt class="py-lineno">369</tt>  <tt class="py-line"><tt class="py-docstring"></tt> </tt>
-<a name="L370"></a><tt class="py-lineno">370</tt>  <tt class="py-line"><tt class="py-docstring">    :Return: Minified script</tt> </tt>
-<a name="L371"></a><tt class="py-lineno">371</tt>  <tt class="py-line"><tt class="py-docstring">    :Rtype: ``str``</tt> </tt>
-<a name="L372"></a><tt class="py-lineno">372</tt>  <tt class="py-line"><tt class="py-docstring">    """</tt> </tt>
-<a name="L373"></a><tt class="py-lineno">373</tt>  <tt class="py-line">    <tt class="py-keyword">if</tt> <tt class="py-keyword">not</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">:</tt> </tt>
-<a name="L374"></a><tt class="py-lineno">374</tt>  <tt class="py-line">        <tt class="py-name">rex</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt>
-<a name="L375"></a><tt class="py-lineno">375</tt>  <tt class="py-line">            <tt class="py-string">r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'</tt> </tt>
-<a name="L376"></a><tt class="py-lineno">376</tt>  <tt class="py-line">            <tt class="py-string">r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'</tt> </tt>
-<a name="L377"></a><tt class="py-lineno">377</tt>  <tt class="py-line">            <tt class="py-string">r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?&lt;=[(,=:\[!&amp;|?'</tt> </tt>
-<a name="L378"></a><tt class="py-lineno">378</tt>  <tt class="py-line">            <tt class="py-string">r'{};\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*'</tt> </tt>
-<a name="L379"></a><tt class="py-lineno">379</tt>  <tt class="py-line">            <tt class="py-string">r'][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\0'</tt> </tt>
-<a name="L380"></a><tt class="py-lineno">380</tt>  <tt class="py-line">            <tt class="py-string">r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r'</tt> </tt>
-<a name="L381"></a><tt class="py-lineno">381</tt>  <tt class="py-line">            <tt class="py-string">r'\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r'</tt> </tt>
-<a name="L382"></a><tt class="py-lineno">382</tt>  <tt class="py-line">            <tt class="py-string">r'\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\014'</tt> </tt>
-<a name="L383"></a><tt class="py-lineno">383</tt>  <tt class="py-line">            <tt class="py-string">r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'</tt> </tt>
-<a name="L384"></a><tt class="py-lineno">384</tt>  <tt class="py-line">            <tt class="py-string">r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'</tt> </tt>
-<a name="L385"></a><tt class="py-lineno">385</tt>  <tt class="py-line">            <tt class="py-string">r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&amp;)+,.:;=?\]|}-]))?|(?&lt;=[\00'</tt> </tt>
-<a name="L386"></a><tt class="py-lineno">386</tt>  <tt class="py-line">            <tt class="py-string">r'0-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\016-\040]|(?'</tt> </tt>
-<a name="L387"></a><tt class="py-lineno">387</tt>  <tt class="py-line">            <tt class="py-string">r':/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]'</tt> </tt>
-<a name="L388"></a><tt class="py-lineno">388</tt>  <tt class="py-line">            <tt class="py-string">r'))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'</tt> </tt>
-<a name="L389"></a><tt class="py-lineno">389</tt>  <tt class="py-line">            <tt class="py-string">r'\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\['</tt> </tt>
-<a name="L390"></a><tt class="py-lineno">390</tt>  <tt class="py-line">            <tt class="py-string">r'[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))(('</tt> </tt>
-<a name="L391"></a><tt class="py-lineno">391</tt>  <tt class="py-line">            <tt class="py-string">r'?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'</tt> </tt>
-<a name="L392"></a><tt class="py-lineno">392</tt>  <tt class="py-line">            <tt class="py-string">r'*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\04'</tt> </tt>
-<a name="L393"></a><tt class="py-lineno">393</tt>  <tt class="py-line">            <tt class="py-string">r'0]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&amp;)+,.:;'</tt> </tt>
-<a name="L394"></a><tt class="py-lineno">394</tt>  <tt class="py-line">            <tt class="py-string">r'=?\]|}-]))?|(?&lt;=[^\000-!#%&amp;(*,./:-@\[\\^`{|~])(?:[\000-\011\01'</tt> </tt>
-<a name="L395"></a><tt class="py-lineno">395</tt>  <tt class="py-line">            <tt class="py-string">r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?:'</tt> </tt>
-<a name="L396"></a><tt class="py-lineno">396</tt>  <tt class="py-line">            <tt class="py-string">r'//[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'</tt> </tt>
-<a name="L397"></a><tt class="py-lineno">397</tt>  <tt class="py-line">            <tt class="py-string">r'*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^'</tt> </tt>
-<a name="L398"></a><tt class="py-lineno">398</tt>  <tt class="py-line">            <tt class="py-string">r'`|-~])|(?&lt;=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\014\0'</tt> </tt>
-<a name="L399"></a><tt class="py-lineno">399</tt>  <tt class="py-line">            <tt class="py-string">r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./'</tt> </tt>
-<a name="L400"></a><tt class="py-lineno">400</tt>  <tt class="py-line">            <tt class="py-string">r':-@\[-^`{-~-])|(?&lt;=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*['</tt> </tt>
-<a name="L401"></a><tt class="py-lineno">401</tt>  <tt class="py-line">            <tt class="py-string">r'^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?&lt;=-)((?:[\000-\011\013'</tt> </tt>
-<a name="L402"></a><tt class="py-lineno">402</tt>  <tt class="py-line">            <tt class="py-string">r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:['</tt> </tt>
-<a name="L403"></a><tt class="py-lineno">403</tt>  <tt class="py-line">            <tt class="py-string">r'\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'</tt> </tt>
-<a name="L404"></a><tt class="py-lineno">404</tt>  <tt class="py-line">            <tt class="py-string">r')+|(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]'</tt> </tt>
-<a name="L405"></a><tt class="py-lineno">405</tt>  <tt class="py-line">            <tt class="py-string">r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+'</tt> </tt>
-<a name="L406"></a><tt class="py-lineno">406</tt>  <tt class="py-line">        <tt class="py-op">)</tt> </tt>
-<a name="L407"></a><tt class="py-lineno">407</tt>  <tt class="py-line"> </tt>
-<a name="L408"></a><tt class="py-lineno">408</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L409"></a><tt class="py-lineno">409</tt>  <tt class="py-line">            <tt class="py-docstring">""" Substitution callback """</tt> </tt>
-<a name="L410"></a><tt class="py-lineno">410</tt>  <tt class="py-line">            <tt class="py-name">groups</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L411"></a><tt class="py-lineno">411</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-op">(</tt> </tt>
-<a name="L412"></a><tt class="py-lineno">412</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L413"></a><tt class="py-lineno">413</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L414"></a><tt class="py-lineno">414</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">3</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'\n'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L415"></a><tt class="py-lineno">415</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L416"></a><tt class="py-lineno">416</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">"%s%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L417"></a><tt class="py-lineno">417</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L418"></a><tt class="py-lineno">418</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> </tt>
-<a name="L419"></a><tt class="py-lineno">419</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">6</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L420"></a><tt class="py-lineno">420</tt>  <tt class="py-line">                <tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L421"></a><tt class="py-lineno">421</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">7</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L422"></a><tt class="py-lineno">422</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">8</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L423"></a><tt class="py-lineno">423</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">9</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L424"></a><tt class="py-lineno">424</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">10</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L425"></a><tt class="py-lineno">425</tt>  <tt class="py-line">                <tt class="py-string">''</tt> </tt>
-<a name="L426"></a><tt class="py-lineno">426</tt>  <tt class="py-line">            <tt class="py-op">)</tt> </tt>
-</div><a name="L427"></a><tt class="py-lineno">427</tt>  <tt class="py-line">    <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L428"></a><tt class="py-lineno">428</tt>  <tt class="py-line">        <tt class="py-name">rex</tt> <tt class="py-op">=</tt> <tt class="py-op">(</tt> </tt>
-<a name="L429"></a><tt class="py-lineno">429</tt>  <tt class="py-line">            <tt class="py-string">r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'</tt> </tt>
-<a name="L430"></a><tt class="py-lineno">430</tt>  <tt class="py-line">            <tt class="py-string">r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'</tt> </tt>
-<a name="L431"></a><tt class="py-lineno">431</tt>  <tt class="py-line">            <tt class="py-string">r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?&lt;=[(,=:\[!&amp;|?'</tt> </tt>
-<a name="L432"></a><tt class="py-lineno">432</tt>  <tt class="py-line">            <tt class="py-string">r'{};\r\n])((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'</tt> </tt>
-<a name="L433"></a><tt class="py-lineno">433</tt>  <tt class="py-line">            <tt class="py-string">r'*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013'</tt> </tt>
-<a name="L434"></a><tt class="py-lineno">434</tt>  <tt class="py-line">            <tt class="py-string">r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?!'</tt> </tt>
-<a name="L435"></a><tt class="py-lineno">435</tt>  <tt class="py-line">            <tt class="py-string">r'[\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^'</tt> </tt>
-<a name="L436"></a><tt class="py-lineno">436</tt>  <tt class="py-line">            <tt class="py-string">r'\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\01'</tt> </tt>
-<a name="L437"></a><tt class="py-lineno">437</tt>  <tt class="py-line">            <tt class="py-string">r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^'</tt> </tt>
-<a name="L438"></a><tt class="py-lineno">438</tt>  <tt class="py-line">            <tt class="py-string">r'\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+('</tt> </tt>
-<a name="L439"></a><tt class="py-lineno">439</tt>  <tt class="py-line">            <tt class="py-string">r'?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&amp;)+,.:;=?\]|}-]))?|(?&lt;=['</tt> </tt>
-<a name="L440"></a><tt class="py-lineno">440</tt>  <tt class="py-line">            <tt class="py-string">r'\000-#%-,./:-@\[-^`{-~-]return)((?:[\000-\011\013\014\016-\040'</tt> </tt>
-<a name="L441"></a><tt class="py-lineno">441</tt>  <tt class="py-line">            <tt class="py-string">r']|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?['</tt> </tt>
-<a name="L442"></a><tt class="py-lineno">442</tt>  <tt class="py-line">            <tt class="py-string">r'\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]['</tt> </tt>
-<a name="L443"></a><tt class="py-lineno">443</tt>  <tt class="py-line">            <tt class="py-string">r'^*]*\*+)*/))*)*)((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|'</tt> </tt>
-<a name="L444"></a><tt class="py-lineno">444</tt>  <tt class="py-line">            <tt class="py-string">r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*'</tt> </tt>
-<a name="L445"></a><tt class="py-lineno">445</tt>  <tt class="py-line">            <tt class="py-string">r'/))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]'</tt> </tt>
-<a name="L446"></a><tt class="py-lineno">446</tt>  <tt class="py-line">            <tt class="py-string">r'*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\01'</tt> </tt>
-<a name="L447"></a><tt class="py-lineno">447</tt>  <tt class="py-line">            <tt class="py-string">r'6-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&amp;)'</tt> </tt>
-<a name="L448"></a><tt class="py-lineno">448</tt>  <tt class="py-line">            <tt class="py-string">r'+,.:;=?\]|}-]))?|(?&lt;=[^\000-!#%&amp;(*,./:-@\[\\^`{|~])((?:[\000-'</tt> </tt>
-<a name="L449"></a><tt class="py-lineno">449</tt>  <tt class="py-line">            <tt class="py-string">r'\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:'</tt> </tt>
-<a name="L450"></a><tt class="py-lineno">450</tt>  <tt class="py-line">            <tt class="py-string">r'(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/'</tt> </tt>
-<a name="L451"></a><tt class="py-lineno">451</tt>  <tt class="py-line">            <tt class="py-string">r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)(?=[^\000-\040"#%-\047)*,./'</tt> </tt>
-<a name="L452"></a><tt class="py-lineno">452</tt>  <tt class="py-line">            <tt class="py-string">r':-@\\-^`|-~])|(?&lt;=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\01'</tt> </tt>
-<a name="L453"></a><tt class="py-lineno">453</tt>  <tt class="py-line">            <tt class="py-string">r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=[^\000'</tt> </tt>
-<a name="L454"></a><tt class="py-lineno">454</tt>  <tt class="py-line">            <tt class="py-string">r'-#%-,./:-@\[-^`{-~-])|(?&lt;=\+)((?:[\000-\011\013\014\016-\040]|'</tt> </tt>
-<a name="L455"></a><tt class="py-lineno">455</tt>  <tt class="py-line">            <tt class="py-string">r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=\+)|(?&lt;=-)((?:[\000-\0'</tt> </tt>
-<a name="L456"></a><tt class="py-lineno">456</tt>  <tt class="py-line">            <tt class="py-string">r'11\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=-'</tt> </tt>
-<a name="L457"></a><tt class="py-lineno">457</tt>  <tt class="py-line">            <tt class="py-string">r')|((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'</tt> </tt>
-<a name="L458"></a><tt class="py-lineno">458</tt>  <tt class="py-line">            <tt class="py-string">r'\*+)*/))+)|((?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014'</tt> </tt>
-<a name="L459"></a><tt class="py-lineno">459</tt>  <tt class="py-line">            <tt class="py-string">r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)'</tt> </tt>
-<a name="L460"></a><tt class="py-lineno">460</tt>  <tt class="py-line">        <tt class="py-op">)</tt> </tt>
-<a name="L461"></a><tt class="py-lineno">461</tt>  <tt class="py-line"> </tt>
-<a name="L462"></a><tt class="py-lineno">462</tt>  <tt class="py-line">        <tt class="py-name">keep</tt> <tt class="py-op">=</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">compile</tt><tt class="py-op">(</tt><tt class="py-op">(</tt> </tt>
-<a name="L463"></a><tt class="py-lineno">463</tt>  <tt class="py-line">            <tt class="py-string">r'[\000-\011\013\014\016-\040]+|(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*'</tt> </tt>
-<a name="L464"></a><tt class="py-lineno">464</tt>  <tt class="py-line">            <tt class="py-string">r'\*+)*/)+|(?:(?://[^\r\n]*)?[\r\n])+|((?:/\*![^*]*\*+(?:[^/*][^'</tt> </tt>
-<a name="L465"></a><tt class="py-lineno">465</tt>  <tt class="py-line">            <tt class="py-string">r'*]*\*+)*/)+)'</tt> </tt>
-<a name="L466"></a><tt class="py-lineno">466</tt>  <tt class="py-line">        <tt class="py-op">)</tt> <tt class="py-op">%</tt> <tt class="py-name">locals</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt> </tt>
-<a name="L467"></a><tt class="py-lineno">467</tt>  <tt class="py-line">        <tt class="py-name">keeper</tt> <tt class="py-op">=</tt> <tt class="py-keyword">lambda</tt> <tt class="py-name">m</tt><tt class="py-op">:</tt> <tt class="py-name">m</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt> </tt>
-<a name="L468"></a><tt class="py-lineno">468</tt>  <tt class="py-line"> </tt>
-<a name="L469"></a><tt class="py-lineno">469</tt>  <tt class="py-line">        <tt class="py-keyword">def</tt> <tt class="py-def-name">subber</tt><tt class="py-op">(</tt><tt class="py-param">match</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-<a name="L470"></a><tt class="py-lineno">470</tt>  <tt class="py-line">            <tt class="py-docstring">""" Substitution callback """</tt> </tt>
-<a name="L471"></a><tt class="py-lineno">471</tt>  <tt class="py-line">            <tt class="py-name">groups</tt> <tt class="py-op">=</tt> <tt class="py-name">match</tt><tt class="py-op">.</tt><tt class="py-name">groups</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L472"></a><tt class="py-lineno">472</tt>  <tt class="py-line">            <tt class="py-keyword">return</tt> <tt class="py-op">(</tt> </tt>
-<a name="L473"></a><tt class="py-lineno">473</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">0</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L474"></a><tt class="py-lineno">474</tt>  <tt class="py-line">                <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L475"></a><tt class="py-lineno">475</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">3</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">"%s%s%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L476"></a><tt class="py-lineno">476</tt>  <tt class="py-line">                    <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">2</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L477"></a><tt class="py-lineno">477</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">3</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> </tt>
-<a name="L478"></a><tt class="py-lineno">478</tt>  <tt class="py-line">                    <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L479"></a><tt class="py-lineno">479</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">4</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L480"></a><tt class="py-lineno">480</tt>  <tt class="py-line">                <tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L481"></a><tt class="py-lineno">481</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">7</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">"%s%s%s%s%s"</tt> <tt class="py-op">%</tt> <tt class="py-op">(</tt> </tt>
-<a name="L482"></a><tt class="py-lineno">482</tt>  <tt class="py-line">                    <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">5</tt><tt class="py-op">]</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L483"></a><tt class="py-lineno">483</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">6</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L484"></a><tt class="py-lineno">484</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">7</tt><tt class="py-op">]</tt><tt class="py-op">,</tt> </tt>
-<a name="L485"></a><tt class="py-lineno">485</tt>  <tt class="py-line">                    <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">8</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> </tt>
-<a name="L486"></a><tt class="py-lineno">486</tt>  <tt class="py-line">                    <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">8</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-string">'\n'</tt> <tt class="py-keyword">or</tt> <tt class="py-string">''</tt><tt class="py-op">,</tt> </tt>
-<a name="L487"></a><tt class="py-lineno">487</tt>  <tt class="py-line">                <tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L488"></a><tt class="py-lineno">488</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">9</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">9</tt><tt class="py-op">]</tt> <tt class="py-op">+</tt> <tt class="py-string">'\n'</tt><tt class="py-op">)</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L489"></a><tt class="py-lineno">489</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">10</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">10</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L490"></a><tt class="py-lineno">490</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">11</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">11</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L491"></a><tt class="py-lineno">491</tt>  <tt class="py-line">                <tt class="py-op">(</tt><tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">12</tt><tt class="py-op">]</tt> <tt class="py-keyword">and</tt> <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">12</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> <tt class="py-string">' '</tt><tt class="py-op">)</tt> <tt class="py-keyword">or</tt> </tt>
-<a name="L492"></a><tt class="py-lineno">492</tt>  <tt class="py-line">                <tt class="py-name">keep</tt><tt class="py-op">(</tt><tt class="py-name">keeper</tt><tt class="py-op">,</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">13</tt><tt class="py-op">]</tt> <tt class="py-keyword">or</tt> <tt class="py-name">groups</tt><tt class="py-op">[</tt><tt class="py-number">14</tt><tt class="py-op">]</tt><tt class="py-op">)</tt> </tt>
-<a name="L493"></a><tt class="py-lineno">493</tt>  <tt class="py-line">            <tt class="py-op">)</tt> </tt>
-</div><a name="L494"></a><tt class="py-lineno">494</tt>  <tt class="py-line"> </tt>
-<a name="L495"></a><tt class="py-lineno">495</tt>  <tt class="py-line">    <tt class="py-keyword">return</tt> <tt class="py-name">_re</tt><tt class="py-op">.</tt><tt class="py-name">sub</tt><tt class="py-op">(</tt><tt class="py-name">rex</tt><tt class="py-op">,</tt> <tt class="py-name">subber</tt><tt class="py-op">,</tt> <tt class="py-string">'\n%s\n'</tt> <tt class="py-op">%</tt> <tt class="py-name">script</tt><tt class="py-op">)</tt><tt class="py-op">.</tt><tt class="py-name">strip</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L496"></a><tt class="py-lineno">496</tt>  <tt class="py-line"> </tt>
-<a name="L497"></a><tt class="py-lineno">497</tt>  <tt class="py-line"> </tt>
-<a name="L498"></a><tt class="py-lineno">498</tt>  <tt class="py-line"><tt class="py-keyword">if</tt> <tt class="py-name">__name__</tt> <tt class="py-op">==</tt> <tt class="py-string">'__main__'</tt><tt class="py-op">:</tt> </tt>
-<a name="main"></a><div id="main-def"><a name="L499"></a><tt class="py-lineno">499</tt> <a class="py-toggle" href="#" id="main-toggle" onclick="return toggle('main');">-</a><tt class="py-line">    <tt class="py-keyword">def</tt> <a class="py-def-name" href="rjsmin-module.html#main">main</a><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">:</tt> </tt>
-</div><div id="main-collapsed" style="display:none;" pad="+++" indent="++++++++"></div><div id="main-expanded"><a name="L500"></a><tt class="py-lineno">500</tt>  <tt class="py-line">        <tt class="py-docstring">""" Main """</tt> </tt>
-<a name="L501"></a><tt class="py-lineno">501</tt>  <tt class="py-line">        <tt class="py-keyword">import</tt> <tt class="py-name">sys</tt> <tt class="py-keyword">as</tt> <tt class="py-name">_sys</tt> </tt>
-<a name="L502"></a><tt class="py-lineno">502</tt>  <tt class="py-line"> </tt>
-<a name="L503"></a><tt class="py-lineno">503</tt>  <tt class="py-line">        <tt class="py-name">argv</tt> <tt class="py-op">=</tt> <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">argv</tt><tt class="py-op">[</tt><tt class="py-number">1</tt><tt class="py-op">:</tt><tt class="py-op">]</tt> </tt>
-<a name="L504"></a><tt class="py-lineno">504</tt>  <tt class="py-line">        <tt class="py-name">keep_bang_comments</tt> <tt class="py-op">=</tt> <tt class="py-string">'-b'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">argv</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">argv</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">argv</tt> </tt>
-<a name="L505"></a><tt class="py-lineno">505</tt>  <tt class="py-line">        <tt class="py-keyword">if</tt> <tt class="py-string">'-p'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">argv</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-bp'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">argv</tt> <tt class="py-keyword">or</tt> <tt class="py-string">'-pb'</tt> <tt class="py-keyword">in</tt> <tt class="py-name">argv</tt><tt class="py-op">:</tt> </tt>
-<a name="L506"></a><tt class="py-lineno">506</tt>  <tt class="py-line">            <tt class="py-name">xjsmin</tt> <tt class="py-op">=</tt> <tt class="py-name">_make_jsmin</tt><tt class="py-op">(</tt><tt class="py-name">python_only</tt><tt class="py-op">=</tt><tt class="py-name">True</tt><tt class="py-op">)</tt> </tt>
-<a name="L507"></a><tt class="py-lineno">507</tt>  <tt class="py-line">        <tt class="py-keyword">else</tt><tt class="py-op">:</tt> </tt>
-<a name="L508"></a><tt class="py-lineno">508</tt>  <tt class="py-line">            <tt class="py-name">xjsmin</tt> <tt class="py-op">=</tt> <tt id="link-7" class="py-name"><a title="rjsmin.jsmin" class="py-name" href="#" onclick="return doclink('link-7', 'jsmin', 'link-4');">jsmin</a></tt> </tt>
-<a name="L509"></a><tt class="py-lineno">509</tt>  <tt class="py-line"> </tt>
-<a name="L510"></a><tt class="py-lineno">510</tt>  <tt class="py-line">        <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdout</tt><tt class="py-op">.</tt><tt class="py-name">write</tt><tt class="py-op">(</tt><tt class="py-name">xjsmin</tt><tt class="py-op">(</tt> </tt>
-<a name="L511"></a><tt class="py-lineno">511</tt>  <tt class="py-line">            <tt class="py-name">_sys</tt><tt class="py-op">.</tt><tt class="py-name">stdin</tt><tt class="py-op">.</tt><tt class="py-name">read</tt><tt class="py-op">(</tt><tt class="py-op">)</tt><tt class="py-op">,</tt> <tt class="py-name">keep_bang_comments</tt><tt class="py-op">=</tt><tt class="py-name">keep_bang_comments</tt> </tt>
-<a name="L512"></a><tt class="py-lineno">512</tt>  <tt class="py-line">        <tt class="py-op">)</tt><tt class="py-op">)</tt> </tt>
-</div><a name="L513"></a><tt class="py-lineno">513</tt>  <tt class="py-line"> </tt>
-<a name="L514"></a><tt class="py-lineno">514</tt>  <tt class="py-line">    <tt class="py-name">main</tt><tt class="py-op">(</tt><tt class="py-op">)</tt> </tt>
-<a name="L515"></a><tt class="py-lineno">515</tt>  <tt class="py-line"> </tt><script type="text/javascript">
-<!--
-expandto(location.href);
-// -->
-</script>
-</pre>
-<br />
-<!-- ==================== NAVIGATION BAR ==================== -->
-<table class="navbar" border="0" width="100%" cellpadding="0"
-       bgcolor="#a0c0ff" cellspacing="0">
-  <tr valign="middle">
-  <!-- Home link -->
-      <th bgcolor="#70b0f0" class="navbar-select"
-          >&nbsp;&nbsp;&nbsp;Home&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Tree link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="module-tree.html">Trees</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Index link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="identifier-index.html">Indices</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Help link -->
-      <th>&nbsp;&nbsp;&nbsp;<a
-        href="help.html">Help</a>&nbsp;&nbsp;&nbsp;</th>
-
-  <!-- Project homepage -->
-      <th class="navbar" align="right" width="100%">
-        <table border="0" cellpadding="0" cellspacing="0">
-          <tr><th class="navbar" align="center"
-            ><a href="http://opensource.perlig.de/rjsmin/" target="_top">Visit rjsmin Online</a></th>
-          </tr></table></th>
-  </tr>
-</table>
-
-<script type="text/javascript">
-  <!--
-  // Private objects are initially displayed (because if
-  // javascript is turned off then we want them to be
-  // visible); but by default, we want to hide them.  So hide
-  // them unless we have a cookie that says to show them.
-  checkCookie();
-  // -->
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/package.cfg b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/package.cfg
deleted file mode 100644
index 6093e82..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/package.cfg
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright 2009 - 2015
-# André Malo or his licensors, as applicable
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-[package]
-name = rjsmin
-
-python.min = 2.4
-pypy.min = 1.9
-pypy3.min = 2.4
-jython.min = 2.5
-
-version.number = 1.0.12
-
-author.name = André Malo
-author.email = nd@perlig.de
-#maintainer.name =
-#maintainer.email = 
-url.homepage = http://opensource.perlig.de/rjsmin/
-url.download = http://storage.perlig.de/rjsmin/
-
-
-[docs]
-meta.classifiers = docs/CLASSIFIERS
-meta.description = docs/DESCRIPTION
-meta.summary = docs/SUMMARY
-meta.provides = docs/PROVIDES
-meta.license = LICENSE
-meta.keywords =
-    Javascript
-    Minimization
-
-apidoc.dir = docs/apidoc
-apidoc.strip = 1
-#apidoc.ignore =
-
-#userdoc.dir = docs/userdoc
-#userdoc.strip = 1
-#userdoc.ignore =
-#    .buildinfo
-
-#examples.dir = docs/examples
-#examples.strip = 1
-#examples.ignore =
-
-#man =
-
-extra =
-    README.rst
-    docs/CHANGES
-    docs/BENCHMARKS
-
-
-[manifest]
-#packages.lib = .
-#packages.collect =
-modules = rjsmin
-
-#scripts =
-
-dist =
-    bench
-    bench.sh
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c
deleted file mode 100644
index aa77a88..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * Copyright 2011 - 2015
- * Andr\xe9 Malo or his licensors, as applicable
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "cext.h"
-EXT_INIT_FUNC;
-
-#define RJSMIN_DULL_BIT           (1 << 0)
-#define RJSMIN_PRE_REGEX_BIT      (1 << 1)
-#define RJSMIN_REGEX_DULL_BIT     (1 << 2)
-#define RJSMIN_REGEX_CC_DULL_BIT  (1 << 3)
-#define RJSMIN_ID_LIT_BIT         (1 << 4)
-#define RJSMIN_ID_LIT_O_BIT       (1 << 5)
-#define RJSMIN_ID_LIT_C_BIT       (1 << 6)
-#define RJSMIN_STRING_DULL_BIT    (1 << 7)
-#define RJSMIN_SPACE_BIT          (1 << 8)
-#define RJSMIN_POST_REGEX_OFF_BIT (1 << 9)
-
-#ifdef EXT3
-typedef Py_UNICODE rchar;
-#else
-typedef unsigned char rchar;
-#endif
-#define U(c) ((rchar)(c))
-
-#define RJSMIN_IS_DULL(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_DULL_BIT))
-
-#define RJSMIN_IS_REGEX_DULL(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_REGEX_DULL_BIT))
-
-#define RJSMIN_IS_REGEX_CC_DULL(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_REGEX_CC_DULL_BIT))
-
-#define RJSMIN_IS_STRING_DULL(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_STRING_DULL_BIT))
-
-#define RJSMIN_IS_ID_LITERAL(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_ID_LIT_BIT))
-
-#define RJSMIN_IS_ID_LITERAL_OPEN(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_ID_LIT_O_BIT))
-
-#define RJSMIN_IS_ID_LITERAL_CLOSE(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_ID_LIT_C_BIT))
-
-#define RJSMIN_IS_POST_REGEX_OFF(c) ((U(c) > 127) || \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_POST_REGEX_OFF_BIT))
-
-#define RJSMIN_IS_SPACE(c) ((U(c) <= 127) && \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_SPACE_BIT))
-
-#define RJSMIN_IS_PRE_REGEX_1(c) ((U(c) <= 127) && \
-    (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_PRE_REGEX_BIT))
-
-
-static const unsigned short rjsmin_charmask[128] = {
-    396, 396, 396, 396, 396, 396, 396, 396,
-    396, 396,   2, 396, 396,   2, 396, 396,
-    396, 396, 396, 396, 396, 396, 396, 396,
-    396, 396, 396, 396, 396, 396, 396, 396,
-    396, 687, 588, 653, 765, 653, 143, 588,
-    687, 205, 653, 237, 143, 237, 141, 648,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 143, 143, 653, 143, 653, 143,
-    653, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 683, 513, 197, 653, 765,
-    653, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 765, 765, 765, 765, 765,
-    765, 765, 765, 687, 143, 207, 653, 765
-};
-
-static Py_ssize_t
-rjsmin(const rchar *source, rchar *target, Py_ssize_t length,
-       int keep_bang_comments)
-{
-    const rchar *reset, *pcreset = NULL, *pctoken = NULL, *xtarget,
-                *sentinel = source + length;
-    rchar *tstart = target;
-    int post_regex = 0;
-    rchar c, quote, spaced = U(' ');
-
-    while (source < sentinel) {
-        c = *source++;
-        if (RJSMIN_IS_DULL(c)) {
-            if (post_regex) post_regex = 0;
-            if (pctoken) pctoken = NULL;
-            if (spaced == U('\n')) spaced = U(' ');
-
-            *target++ = c;
-            continue;
-        }
-        switch (c) {
-
-        /* String */
-        case U('\''): case U('"'):
-            if (post_regex) post_regex = 0;
-            if (pctoken) pctoken = NULL;
-            if (spaced == U('\n')) spaced = U(' ');
-
-            reset = source;
-            *target++ = quote = c;
-            while (source < sentinel) {
-                c = *source++;
-                *target++ = c;
-                if (RJSMIN_IS_STRING_DULL(c))
-                    continue;
-                switch (c) {
-                case U('\''): case U('"'):
-                    if (c == quote)
-                        goto cont;
-                    continue;
-                case U('\\'):
-                    if (source < sentinel) {
-                        c = *source++;
-                        *target++ = c;
-                        if (c == U('\r') && source < sentinel
-                            && *source == U('\n'))
-                            *target++ = *source++;
-                    }
-                    continue;
-                }
-                break;
-            }
-            target -= source - reset;
-            source = reset;
-            continue;
-
-        /* Comment or Regex or something else entirely */
-        case U('/'):
-            if (!(source < sentinel)) {
-                if (post_regex) post_regex = 0;
-                if (pctoken) pctoken = NULL;
-                if (spaced == U('\n')) spaced = U(' ');
-
-                *target++ = c;
-            }
-            else {
-                switch (*source) {
-            /* Comment */
-                case U('*'): case U('/'):
-                    goto skip_or_copy_ws;
-
-                default:
-                    xtarget = NULL;
-                    if (   target == tstart
-                        || RJSMIN_IS_PRE_REGEX_1(*((pctoken ? pctoken : target)
-                                                   - 1))
-                        || (
-                            (xtarget = pctoken ? pctoken : target)
-                            && (xtarget - tstart >= 6)
-                            && *(xtarget - 1) == U('n')
-                            && *(xtarget - 2) == U('r')
-                            && *(xtarget - 3) == U('u')
-                            && *(xtarget - 4) == U('t')
-                            && *(xtarget - 5) == U('e')
-                            && *(xtarget - 6) == U('r')
-                            && (
-                                   xtarget - tstart == 6
-                                || !RJSMIN_IS_ID_LITERAL(*(xtarget - 7))
-                            )
-                        )) {
-
-            /* Regex */
-                        if (post_regex) post_regex = 0;
-                        if (pctoken) pctoken = NULL;
-
-                        reset = source;
-                        if (spaced == U('\n')) {
-                            spaced = U(' ');
-                            if (xtarget)
-                                *target++ = U('\n');
-                        }
-
-                        *target++ = U('/');
-                        while (source < sentinel) {
-                            c = *source++;
-                            *target++ = c;
-                            if (RJSMIN_IS_REGEX_DULL(c))
-                                continue;
-                            switch (c) {
-                            case U('/'):
-                                post_regex = 1;
-                                goto cont;
-                            case U('\\'):
-                                if (source < sentinel) {
-                                    c = *source++;
-                                    *target++ = c;
-                                    if (c == U('\r') || c == U('\n'))
-                                        break;
-                                }
-                                continue;
-                            case U('['):
-                                while (source < sentinel) {
-                                    c = *source++;
-                                    *target++ = c;
-                                    if (RJSMIN_IS_REGEX_CC_DULL(c))
-                                        continue;
-                                    switch (c) {
-                                    case U('\\'):
-                                        if (source < sentinel) {
-                                            c = *source++;
-                                            *target++ = c;
-                                            if (c == U('\r') || c == U('\n'))
-                                                break;
-                                        }
-                                        continue;
-                                    case U(']'):
-                                        goto cont_regex;
-                                    }
-                                }
-                                break;
-                            }
-                            break;
-                        cont_regex:
-                            continue;
-                        }
-                        target -= source - reset;
-                        source = reset;
-                    }
-                    else {
-            /* Just a slash */
-                        if (post_regex) post_regex = 0;
-                        if (pctoken) pctoken = NULL;
-                        if (spaced == U('\n')) spaced = U(' ');
-
-                        *target++ = c;
-                    }
-                    continue;
-                }
-            }
-            continue;
-
-        /* Whitespace */
-        default:
-        skip_or_copy_ws:
-            quote = U(' ');
-            --source;
-            while (source < sentinel) {
-                c = *source++;
-                if (RJSMIN_IS_SPACE(c))
-                    continue;
-                switch (c) {
-                case U('\r'): case U('\n'):
-                    quote = U('\n');
-                    continue;
-                case U('/'):
-                    if (source < sentinel) {
-                        switch (*source) {
-                        case U('*'):
-                            reset = source++;
-                            /* copy bang comment, if requested */
-                            if (   keep_bang_comments && source < sentinel
-                                && *source == U('!')) {
-                                if (!pctoken) {
-                                    pctoken = target;
-                                    pcreset = reset;
-                                }
-
-                                *target++ = U('/');
-                                *target++ = U('*');
-                                *target++ = *source++;
-                                while (source < sentinel) {
-                                    c = *source++;
-                                    *target++ = c;
-                                    if (c == U('*') && source < sentinel
-                                        && *source == U('/')) {
-                                        *target++ = *source++;
-                                        reset = NULL;
-                                        break;
-                                    }
-                                }
-                                if (!reset)
-                                    continue;
-
-                                target -= source - reset;
-                                source = reset;
-                                if (pcreset == reset) {
-                                    pctoken = NULL;
-                                    pcreset = NULL;
-                                }
-
-                            }
-                            /* strip regular comment */
-                            else {
-                                while (source < sentinel) {
-                                    c = *source++;
-                                    if (c == U('*') && source < sentinel
-                                        && *source == U('/')) {
-                                        ++source;
-                                        reset = NULL;
-                                        break;
-                                    }
-                                }
-                                if (!reset)
-                                    continue;
-                                source = reset;
-                                *target++ = U('/');
-                            }
-                            goto cont;
-                        case U('/'):
-                            ++source;
-                            while (source < sentinel) {
-                                c = *source++;
-                                switch (c) {
-                                case U('\n'):
-                                    break;
-                                case U('\r'):
-                                    if (source < sentinel
-                                        && *source == U('\n'))
-                                        ++source;
-                                    break;
-                                default:
-                                    continue;
-                                }
-                                break;
-                            }
-                            quote = U('\n');
-                            continue;
-                        }
-                    }
-                }
-                --source;
-                break;
-            }
-
-            if ((tstart < (pctoken ? pctoken : target) && source < sentinel)
-                && ((quote == U('\n')
-                     && ((RJSMIN_IS_ID_LITERAL_CLOSE(*((pctoken ?
-                                                        pctoken : target) - 1))
-                          && RJSMIN_IS_ID_LITERAL_OPEN(*source))
-                         || (post_regex
-                             && RJSMIN_IS_POST_REGEX_OFF(*source)
-                             && !(post_regex = 0))))
-                    ||
-                    (quote == U(' ') && !pctoken
-                     && ((RJSMIN_IS_ID_LITERAL(*(target - 1))
-                          && RJSMIN_IS_ID_LITERAL(*source))
-                         || (source < sentinel
-                             && ((*(target - 1) == U('+')
-                                  && *source == U('+'))
-                                 || (*(target - 1) == U('-')
-                                     && *source == U('-')))))))) {
-                *target++ = quote;
-            }
-
-            pcreset = NULL;
-            spaced = quote;
-        }
-    cont:
-        continue;
-    }
-    return (Py_ssize_t)(target - tstart);
-}
-
-
-PyDoc_STRVAR(rjsmin_jsmin__doc__,
-"jsmin(script, keep_bang_comments=False)\n\
-\n\
-Minify javascript based on `jsmin.c by Douglas Crockford`_\\.\n\
-\n\
-Instead of parsing the stream char by char, it uses a regular\n\
-expression approach which minifies the whole script with one big\n\
-substitution regex.\n\
-\n\
-.. _jsmin.c by Douglas Crockford:\n\
-   http://www.crockford.com/javascript/jsmin.c\n\
-\n\
-:Note: This is a hand crafted C implementation built on the regex\n\
-       semantics.\n\
-\n\
-:Parameters:\n\
-  `script` : ``str``\n\
-    Script to minify\n\
-\n\
-  `keep_bang_comments` : ``bool``\n\
-    Keep comments starting with an exclamation mark? (``/*!...*/``)\n\
-\n\
-:Return: Minified script\n\
-:Rtype: ``str``");
-
-static PyObject *
-rjsmin_jsmin(PyObject *self, PyObject *args, PyObject *kwds)
-{
-    PyObject *script, *keep_bang_comments_ = NULL, *result;
-    static char *kwlist[] = {"script", "keep_bang_comments", NULL};
-    Py_ssize_t slength, length;
-    int keep_bang_comments;
-#ifdef EXT2
-    int uni;
-#define UOBJ "O"
-#endif
-#ifdef EXT3
-#define UOBJ "U"
-#endif
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, UOBJ "|O", kwlist,
-                                     &script, &keep_bang_comments_))
-        return NULL;
-
-    if (!keep_bang_comments_)
-        keep_bang_comments = 0;
-    else {
-        keep_bang_comments = PyObject_IsTrue(keep_bang_comments_);
-        if (keep_bang_comments == -1)
-            return NULL;
-    }
-
-#ifdef EXT2
-    if (PyUnicode_Check(script)) {
-        if (!(script = PyUnicode_AsUTF8String(script)))
-            return NULL;
-        uni = 1;
-    }
-    else {
-        if (!(script = PyObject_Str(script)))
-            return NULL;
-        uni = 0;
-    }
-#endif
-
-#ifdef EXT3
-    Py_INCREF(script);
-#define PyString_GET_SIZE PyUnicode_GET_SIZE
-#define PyString_AS_STRING PyUnicode_AS_UNICODE
-#define _PyString_Resize PyUnicode_Resize
-#define PyString_FromStringAndSize PyUnicode_FromUnicode
-#endif
-
-    slength = PyString_GET_SIZE(script);
-    if (!(result = PyString_FromStringAndSize(NULL, slength))) {
-        Py_DECREF(script);
-        return NULL;
-    }
-    Py_BEGIN_ALLOW_THREADS
-    length = rjsmin((rchar *)PyString_AS_STRING(script),
-                    (rchar *)PyString_AS_STRING(result),
-                    slength, keep_bang_comments);
-    Py_END_ALLOW_THREADS
-
-    Py_DECREF(script);
-    if (length < 0) {
-        Py_DECREF(result);
-        return NULL;
-    }
-    if (length != slength && _PyString_Resize(&result, length) == -1)
-        return NULL;
-
-#ifdef EXT2
-    if (uni) {
-        script = PyUnicode_DecodeUTF8(PyString_AS_STRING(result),
-                                      PyString_GET_SIZE(result), "strict");
-        Py_DECREF(result);
-        if (!script)
-            return NULL;
-        result = script;
-    }
-#endif
-    return result;
-}
-
-/* ------------------------ BEGIN MODULE DEFINITION ------------------------ */
-
-EXT_METHODS = {
-    {"jsmin",
-        (PyCFunction)rjsmin_jsmin, METH_VARARGS | METH_KEYWORDS,
-        rjsmin_jsmin__doc__},
-
-    {NULL}  /* Sentinel */
-};
-
-PyDoc_STRVAR(EXT_DOCS_VAR,
-"C implementation of rjsmin\n\
-==========================\n\
-\n\
-C implementation of rjsmin.");
-
-
-EXT_DEFINE(EXT_MODULE_NAME, EXT_METHODS_VAR, EXT_DOCS_VAR);
-
-EXT_INIT_FUNC {
-    PyObject *m;
-
-    /* Create the module and populate stuff */
-    if (!(m = EXT_CREATE(&EXT_DEFINE_VAR)))
-        EXT_INIT_ERROR(NULL);
-
-    EXT_ADD_UNICODE(m, "__author__", "Andr\xe9 Malo", "latin-1");
-    EXT_ADD_STRING(m, "__docformat__", "restructuredtext en");
-
-    EXT_INIT_RETURN(m);
-}
-
-/* ------------------------- END MODULE DEFINITION ------------------------- */
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py
deleted file mode 100755
index 54e20ec..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py
+++ /dev/null
@@ -1,515 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-r"""
-=====================
- Javascript Minifier
-=====================
-
-rJSmin is a javascript minifier written in python.
-
-The minifier is based on the semantics of `jsmin.c by Douglas Crockford`_\\.
-
-:Copyright:
-
- Copyright 2011 - 2015
- Andr\xe9 Malo or his licensors, as applicable
-
-:License:
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-The module is a re-implementation aiming for speed, so it can be used at
-runtime (rather than during a preprocessing step). Usually it produces the
-same results as the original ``jsmin.c``. It differs in the following ways:
-
-- there is no error detection: unterminated string, regex and comment
-  literals are treated as regular javascript code and minified as such.
-- Control characters inside string and regex literals are left untouched; they
-  are not converted to spaces (nor to \\n)
-- Newline characters are not allowed inside string and regex literals, except
-  for line continuations in string literals (ECMA-5).
-- "return /regex/" is recognized correctly.
-- Line terminators after regex literals are handled more sensibly
-- "+ +" and "- -" sequences are not collapsed to '++' or '--'
-- Newlines before ! operators are removed more sensibly
-- Comments starting with an exclamation mark (``!``) can be kept optionally
-- rJSmin does not handle streams, but only complete strings. (However, the
-  module provides a "streamy" interface).
-
-Since most parts of the logic are handled by the regex engine it's way faster
-than the original python port of ``jsmin.c`` by Baruch Even. The speed factor
-varies between about 6 and 55 depending on input and python version (it gets
-faster the more compressed the input already is). Compared to the
-speed-refactored python port by Dave St.Germain the performance gain is less
-dramatic but still between 3 and 50 (for huge inputs). See the docs/BENCHMARKS
-file for details.
-
-rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.
-
-Both python 2 and python 3 are supported.
-
-.. _jsmin.c by Douglas Crockford:
-   http://www.crockford.com/javascript/jsmin.c
-"""
-if __doc__:
-    # pylint: disable = redefined-builtin
-    __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
-__license__ = "Apache License, Version 2.0"
-__version__ = '1.0.12'
-__all__ = ['jsmin']
-
-import re as _re
-
-
-def _make_jsmin(python_only=False):
-    """
-    Generate JS minifier based on `jsmin.c by Douglas Crockford`_
-
-    .. _jsmin.c by Douglas Crockford:
-       http://www.crockford.com/javascript/jsmin.c
-
-    :Parameters:
-      `python_only` : ``bool``
-        Use only the python variant. If true, the c extension is not even
-        tried to be loaded.
-
-    :Return: Minifier
-    :Rtype: ``callable``
-    """
-    # pylint: disable = unused-variable
-    # pylint: disable = too-many-locals
-
-    if not python_only:
-        try:
-            import _rjsmin
-        except ImportError:
-            pass
-        else:
-            return _rjsmin.jsmin
-    try:
-        xrange
-    except NameError:
-        xrange = range  # pylint: disable = redefined-builtin
-
-    space_chars = r'[\000-\011\013\014\016-\040]'
-
-    line_comment = r'(?://[^\r\n]*)'
-    space_comment = r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
-    space_comment_nobang = r'(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*\*+)*/)'
-    bang_comment = r'(?:/\*![^*]*\*+(?:[^/*][^*]*\*+)*/)'
-
-    string1 = \
-        r'(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)'
-    string2 = r'(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^"\\\r\n]*)*")'
-    string3 = r'(?:`(?:[^`\\]|\\.)*`)'
-    strings = r'(?:%s|%s|%s)' % (string1, string2, string3)
-
-    charclass = r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\])'
-    nospecial = r'[^/\\\[\r\n]'
-    regex = r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/)' % (
-        nospecial, charclass, nospecial
-    )
-    space = r'(?:%s|%s)' % (space_chars, space_comment)
-    newline = r'(?:%s?[\r\n])' % line_comment
-
-    def fix_charclass(result):
-        """ Fixup string of chars to fit into a regex char class """
-        pos = result.find('-')
-        if pos >= 0:
-            result = r'%s%s-' % (result[:pos], result[pos + 1:])
-
-        def sequentize(string):
-            """
-            Notate consecutive characters as sequence
-
-            (1-4 instead of 1234)
-            """
-            first, last, result = None, None, []
-            for char in map(ord, string):
-                if last is None:
-                    first = last = char
-                elif last + 1 == char:
-                    last = char
-                else:
-                    result.append((first, last))
-                    first = last = char
-            if last is not None:
-                result.append((first, last))
-            return ''.join(['%s%s%s' % (
-                chr(first),
-                last > first + 1 and '-' or '',
-                last != first and chr(last) or ''
-            ) for first, last in result])  # noqa
-
-        return _re.sub(
-            r'([\000-\040\047])',  # \047 for better portability
-            lambda m: '\\%03o' % ord(m.group(1)), (
-                sequentize(result)
-                .replace('\\', '\\\\')
-                .replace('[', '\\[')
-                .replace(']', '\\]')
-            )
-        )
-
-    def id_literal_(what):
-        """ Make id_literal like char class """
-        match = _re.compile(what).match
-        result = ''.join([
-            chr(c) for c in xrange(127) if not match(chr(c))
-        ])
-        return '[^%s]' % fix_charclass(result)
-
-    def not_id_literal_(keep):
-        """ Make negated id_literal like char class """
-        match = _re.compile(id_literal_(keep)).match
-        result = ''.join([
-            chr(c) for c in xrange(127) if not match(chr(c))
-        ])
-        return r'[%s]' % fix_charclass(result)
-
-    not_id_literal = not_id_literal_(r'[a-zA-Z0-9_$]')
-    preregex1 = r'[(,=:\[!&|?{};\r\n]'
-    preregex2 = r'%(not_id_literal)sreturn' % locals()
-
-    id_literal = id_literal_(r'[a-zA-Z0-9_$]')
-    id_literal_open = id_literal_(r'[a-zA-Z0-9_${\[(!+-]')
-    id_literal_close = id_literal_(r'[a-zA-Z0-9_$}\])"\047+-]')
-    post_regex_off = id_literal_(r'[^\000-\040}\])?:|,;.&=+-]')
-
-    dull = r'[^\047"`/\000-\040]'
-
-    space_sub_simple = _re.compile((
-        # noqa pylint: disable = bad-continuation
-
-        r'(%(dull)s+)'                                         # 0
-        r'|(%(strings)s%(dull)s*)'                             # 1
-        r'|(?<=%(preregex1)s)'
-            r'%(space)s*(?:%(newline)s%(space)s*)*'
-            r'(%(regex)s)'                                     # 2
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 3
-                r'(?=%(post_regex_off)s))?'
-        r'|(?<=%(preregex2)s)'
-            r'%(space)s*(?:(%(newline)s)%(space)s*)*'          # 4
-            r'(%(regex)s)'                                     # 5
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 6
-                r'(?=%(post_regex_off)s))?'
-        r'|(?<=%(id_literal_close)s)'
-            r'%(space)s*(?:(%(newline)s)%(space)s*)+'          # 7
-            r'(?=%(id_literal_open)s)'
-        r'|(?<=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)'  # 8
-        r'|(?<=\+)(%(space)s)+(?=\+)'                          # 9
-        r'|(?<=-)(%(space)s)+(?=-)'                            # 10
-        r'|%(space)s+'
-        r'|(?:%(newline)s%(space)s*)+'
-    ) % locals()).sub
-
-    # print space_sub_simple.__self__.pattern
-
-    def space_subber_simple(match):
-        """ Substitution callback """
-        # pylint: disable = too-many-return-statements
-
-        groups = match.groups()
-        if groups[0]:
-            return groups[0]
-        elif groups[1]:
-            return groups[1]
-        elif groups[2]:
-            if groups[3]:
-                return groups[2] + '\n'
-            return groups[2]
-        elif groups[5]:
-            return "%s%s%s" % (
-                groups[4] and '\n' or '',
-                groups[5],
-                groups[6] and '\n' or '',
-            )
-        elif groups[7]:
-            return '\n'
-        elif groups[8] or groups[9] or groups[10]:
-            return ' '
-        else:
-            return ''
-
-    space_sub_banged = _re.compile((
-        # noqa pylint: disable = bad-continuation
-
-        r'(%(dull)s+)'                                         # 0
-        r'|(%(strings)s%(dull)s*)'                             # 1
-        r'|(?<=%(preregex1)s)'
-            r'(%(space)s*(?:%(newline)s%(space)s*)*)'          # 2
-            r'(%(regex)s)'                                     # 3
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 4
-                r'(?=%(post_regex_off)s))?'
-        r'|(?<=%(preregex2)s)'
-            r'(%(space)s*(?:(%(newline)s)%(space)s*)*)'        # 5, 6
-            r'(%(regex)s)'                                     # 7
-            r'(%(space)s*(?:%(newline)s%(space)s*)+'           # 8
-                r'(?=%(post_regex_off)s))?'
-        r'|(?<=%(id_literal_close)s)'
-            r'(%(space)s*(?:%(newline)s%(space)s*)+)'          # 9
-            r'(?=%(id_literal_open)s)'
-        r'|(?<=%(id_literal)s)(%(space)s+)(?=%(id_literal)s)'  # 10
-        r'|(?<=\+)(%(space)s+)(?=\+)'                          # 11
-        r'|(?<=-)(%(space)s+)(?=-)'                            # 12
-        r'|(%(space)s+)'                                       # 13
-        r'|((?:%(newline)s%(space)s*)+)'                       # 14
-    ) % locals()).sub
-
-    # print space_sub_banged.__self__.pattern
-
-    keep = _re.compile((
-        r'%(space_chars)s+|%(space_comment_nobang)s+|%(newline)s+'
-        r'|(%(bang_comment)s+)'
-    ) % locals()).sub
-    keeper = lambda m: m.groups()[0] or ''
-
-    # print keep.__self__.pattern
-
-    def space_subber_banged(match):
-        """ Substitution callback """
-        # pylint: disable = too-many-return-statements
-
-        groups = match.groups()
-        if groups[0]:
-            return groups[0]
-        elif groups[1]:
-            return groups[1]
-        elif groups[3]:
-            return "%s%s%s%s" % (
-                keep(keeper, groups[2]),
-                groups[3],
-                keep(keeper, groups[4] or ''),
-                groups[4] and '\n' or '',
-            )
-        elif groups[7]:
-            return "%s%s%s%s%s" % (
-                keep(keeper, groups[5]),
-                groups[6] and '\n' or '',
-                groups[7],
-                keep(keeper, groups[8] or ''),
-                groups[8] and '\n' or '',
-            )
-        elif groups[9]:
-            return keep(keeper, groups[9]) + '\n'
-        elif groups[10] or groups[11] or groups[12]:
-            return keep(keeper, groups[10] or groups[11] or groups[12]) or ' '
-        else:
-            return keep(keeper, groups[13] or groups[14])
-
-    def jsmin(script, keep_bang_comments=False):
-        r"""
-        Minify javascript based on `jsmin.c by Douglas Crockford`_\.
-
-        Instead of parsing the stream char by char, it uses a regular
-        expression approach which minifies the whole script with one big
-        substitution regex.
-
-        .. _jsmin.c by Douglas Crockford:
-           http://www.crockford.com/javascript/jsmin.c
-
-        :Parameters:
-          `script` : ``str``
-            Script to minify
-
-          `keep_bang_comments` : ``bool``
-            Keep comments starting with an exclamation mark? (``/*!...*/``)
-
-        :Return: Minified script
-        :Rtype: ``str``
-        """
-        # pylint: disable = redefined-outer-name
-
-        if keep_bang_comments:
-            return space_sub_banged(
-                space_subber_banged, '\n%s\n' % script
-            ).strip()
-        else:
-            return space_sub_simple(
-                space_subber_simple, '\n%s\n' % script
-            ).strip()
-
-    return jsmin
-
-jsmin = _make_jsmin()
-
-
-def jsmin_for_posers(script, keep_bang_comments=False):
-    r"""
-    Minify javascript based on `jsmin.c by Douglas Crockford`_\.
-
-    Instead of parsing the stream char by char, it uses a regular
-    expression approach which minifies the whole script with one big
-    substitution regex.
-
-    .. _jsmin.c by Douglas Crockford:
-       http://www.crockford.com/javascript/jsmin.c
-
-    :Warning: This function is the digest of a _make_jsmin() call. It just
-              utilizes the resulting regexes. It's here for fun and may
-              vanish any time. Use the `jsmin` function instead.
-
-    :Parameters:
-      `script` : ``str``
-        Script to minify
-
-      `keep_bang_comments` : ``bool``
-        Keep comments starting with an exclamation mark? (``/*!...*/``)
-
-    :Return: Minified script
-    :Rtype: ``str``
-    """
-    if not keep_bang_comments:
-        rex = (
-            r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
-            r'{};\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*'
-            r'][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\0'
-            r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r'
-            r'\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r'
-            r'\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\014'
-            r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'
-            r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
-            r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=[\00'
-            r'0-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\016-\040]|(?'
-            r':/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]'
-            r'))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
-            r'\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\['
-            r'[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))(('
-            r'?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'
-            r'*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\04'
-            r'0]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;'
-            r'=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])(?:[\000-\011\01'
-            r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?:'
-            r'//[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'
-            r'*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^'
-            r'`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\014\0'
-            r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./'
-            r':-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*['
-            r'^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013'
-            r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:['
-            r'\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
-            r')+|(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]'
-            r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+'
-        )
-
-        def subber(match):
-            """ Substitution callback """
-            groups = match.groups()
-            return (
-                groups[0] or
-                groups[1] or
-                (groups[3] and (groups[2] + '\n')) or
-                groups[2] or
-                (groups[5] and "%s%s%s" % (
-                    groups[4] and '\n' or '',
-                    groups[5],
-                    groups[6] and '\n' or '',
-                )) or
-                (groups[7] and '\n') or
-                (groups[8] and ' ') or
-                (groups[9] and ' ') or
-                (groups[10] and ' ') or
-                ''
-            )
-    else:
-        rex = (
-            r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'
-            r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
-            r'{};\r\n])((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'
-            r'*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013'
-            r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?!'
-            r'[\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^'
-            r'\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\01'
-            r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^'
-            r'\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+('
-            r'?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=['
-            r'\000-#%-,./:-@\[-^`{-~-]return)((?:[\000-\011\013\014\016-\040'
-            r']|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?['
-            r'\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]['
-            r'^*]*\*+)*/))*)*)((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|'
-            r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*'
-            r'/))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]'
-            r'*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\01'
-            r'6-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)'
-            r'+,.:;=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])((?:[\000-'
-            r'\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:'
-            r'(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/'
-            r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)(?=[^\000-\040"#%-\047)*,./'
-            r':-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\01'
-            r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=[^\000'
-            r'-#%-,./:-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|'
-            r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=\+)|(?<=-)((?:[\000-\0'
-            r'11\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=-'
-            r')|((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
-            r'\*+)*/))+)|((?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014'
-            r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)'
-        )
-
-        keep = _re.compile((
-            r'[\000-\011\013\014\016-\040]+|(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*'
-            r'\*+)*/)+|(?:(?://[^\r\n]*)?[\r\n])+|((?:/\*![^*]*\*+(?:[^/*][^'
-            r'*]*\*+)*/)+)'
-        ) % locals()).sub
-        keeper = lambda m: m.groups()[0] or ''
-
-        def subber(match):
-            """ Substitution callback """
-            groups = match.groups()
-            return (
-                groups[0] or
-                groups[1] or
-                (groups[3] and "%s%s%s%s" % (
-                    keep(keeper, groups[2]),
-                    groups[3],
-                    keep(keeper, groups[4] or ''),
-                    groups[4] and '\n' or '',
-                )) or
-                (groups[7] and "%s%s%s%s%s" % (
-                    keep(keeper, groups[5]),
-                    groups[6] and '\n' or '',
-                    groups[7],
-                    keep(keeper, groups[8] or ''),
-                    groups[8] and '\n' or '',
-                )) or
-                (groups[9] and keep(keeper, groups[9] + '\n')) or
-                (groups[10] and keep(keeper, groups[10]) or ' ') or
-                (groups[11] and keep(keeper, groups[11]) or ' ') or
-                (groups[12] and keep(keeper, groups[12]) or ' ') or
-                keep(keeper, groups[13] or groups[14])
-            )
-
-    return _re.sub(rex, subber, '\n%s\n' % script).strip()
-
-
-if __name__ == '__main__':
-    def main():
-        """ Main """
-        import sys as _sys
-
-        argv = _sys.argv[1:]
-        keep_bang_comments = '-b' in argv or '-bp' in argv or '-pb' in argv
-        if '-p' in argv or '-bp' in argv or '-pb' in argv:
-            xjsmin = _make_jsmin(python_only=True)
-        else:
-            xjsmin = jsmin
-
-        _sys.stdout.write(xjsmin(
-            _sys.stdin.read(), keep_bang_comments=keep_bang_comments
-        ))
-
-    main()
diff --git a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/setup.py b/systrace/catapult/common/py_vulcanize/third_party/rjsmin/setup.py
deleted file mode 100644
index d281913..0000000
--- a/systrace/catapult/common/py_vulcanize/third_party/rjsmin/setup.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: ascii -*-
-#
-# Copyright 2006 - 2013
-# Andr\xe9 Malo or his licensors, as applicable
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import sys as _sys
-from _setup import run
-
-
-def setup(args=None, _manifest=0):
-    """ Main setup function """
-    from _setup.ext import Extension
-
-    if 'java' in _sys.platform.lower():
-        # no c extension for jython
-        ext = None
-    else:
-        ext=[Extension('_rjsmin', sources=['rjsmin.c'])]
-
-    return run(script_args=args, ext=ext, manifest_only=_manifest)
-
-
-def manifest():
-    """ Create List of packaged files """
-    return setup((), _manifest=1)
-
-
-if __name__ == '__main__':
-    setup()
diff --git a/systrace/catapult/dependency_manager/PRESUBMIT.py b/systrace/catapult/dependency_manager/PRESUBMIT.py
deleted file mode 100644
index 04039d5..0000000
--- a/systrace/catapult/dependency_manager/PRESUBMIT.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
-
-
-def _CommonChecks(input_api, output_api):
-  results = []
-  results += input_api.RunTests(input_api.canned_checks.GetPylint(
-      input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
-      pylintrc='pylintrc'))
-  return results
-
-
-def _GetPathsToPrepend(input_api):
-  project_dir = input_api.PresubmitLocalPath()
-  catapult_dir = input_api.os_path.join(project_dir, '..')
-  return [
-      project_dir,
-
-      input_api.os_path.join(catapult_dir, 'common', 'py_utils'),
-
-      input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
-      input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'),
-      input_api.os_path.join(catapult_dir, 'third_party', 'zipfile'),
-  ]
diff --git a/systrace/catapult/dependency_manager/bin/run_tests b/systrace/catapult/dependency_manager/bin/run_tests
deleted file mode 100755
index 9a87bd6..0000000
--- a/systrace/catapult/dependency_manager/bin/run_tests
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Runs all Python unit tests in dependency_manager/."""
-
-import os
-import sys
-
-_CATAPULT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-
-sys.path.append(os.path.join(_CATAPULT, 'third_party', 'mock'))
-
-
-def main():
-  sys.path.append(_CATAPULT)
-
-  from hooks import install
-  if '--no-install-hooks' in sys.argv:
-    sys.argv.remove('--no-install-hooks')
-  else:
-    install.InstallHooks()
-
-  from catapult_build import run_with_typ
-  return run_with_typ.Run(
-      os.path.join(_CATAPULT, 'dependency_manager'), path=[_CATAPULT])
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/dependency_manager/bin/update b/systrace/catapult/dependency_manager/bin/update
deleted file mode 100755
index c2ca1df..0000000
--- a/systrace/catapult/dependency_manager/bin/update
+++ /dev/null
@@ -1,37 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import os
-import sys
-
-sys.path.append(
-    os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-from dependency_manager import base_config
-
-
-def UpdateDependency(dependency, platform, path, config):
-  c = base_config.BaseConfig(config, writable=True)
-  c.AddCloudStorageDependencyUpdateJob(
-      dependency, platform, path, version=None, execute_job=True)
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--config', required=True, type=os.path.realpath,
-                      help='Path to the dependency configuration file.')
-  parser.add_argument('--dependency', required=True,
-                      help='Dependency name.')
-  parser.add_argument('--path', required=True, type=os.path.realpath,
-                      help='Path to the new dependency.')
-  parser.add_argument('--platform', required=True,
-                      help='Platform to update.')
-  args = parser.parse_args(raw_args)
-  UpdateDependency(args.dependency, args.platform, args.path, args.config)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/dependency_manager/dependency_manager/__init__.py b/systrace/catapult/dependency_manager/dependency_manager/__init__.py
deleted file mode 100644
index 4b595c5..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/__init__.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-
-CATAPULT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(
-    os.path.abspath(__file__))))
-CATAPULT_THIRD_PARTY_PATH = os.path.join(CATAPULT_PATH, 'third_party')
-DEPENDENCY_MANAGER_PATH = os.path.join(CATAPULT_PATH, 'dependency_manager')
-
-
-def _AddDirToPythonPath(*path_parts):
-  path = os.path.abspath(os.path.join(*path_parts))
-  if os.path.isdir(path) and path not in sys.path:
-    sys.path.insert(0, path)
-
-
-_AddDirToPythonPath(CATAPULT_PATH, 'common', 'py_utils')
-_AddDirToPythonPath(CATAPULT_THIRD_PARTY_PATH, 'mock')
-_AddDirToPythonPath(CATAPULT_THIRD_PARTY_PATH, 'six')
-_AddDirToPythonPath(CATAPULT_THIRD_PARTY_PATH, 'pyfakefs')
-_AddDirToPythonPath(DEPENDENCY_MANAGER_PATH)
-
-
-# pylint: disable=unused-import,wrong-import-position
-from .archive_info import ArchiveInfo
-from .base_config import BaseConfig
-from .cloud_storage_info import CloudStorageInfo
-from .dependency_info import DependencyInfo
-from .exceptions import CloudStorageError
-from .exceptions import CloudStorageUploadConflictError
-from .exceptions import EmptyConfigError
-from .exceptions import FileNotFoundError
-from .exceptions import NoPathFoundError
-from .exceptions import ReadWriteError
-from .exceptions import UnsupportedConfigFormatError
-from .local_path_info import LocalPathInfo
-from .manager import DependencyManager
-# pylint: enable=unused-import
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/archive_info.py b/systrace/catapult/dependency_manager/dependency_manager/archive_info.py
deleted file mode 100644
index f28028c..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/archive_info.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import glob
-import os
-import shutil
-
-from dependency_manager import exceptions
-from dependency_manager import dependency_manager_util
-
-
-class ArchiveInfo(object):
-
-  def __init__(self, archive_file, unzip_path, path_within_archive,
-               stale_unzip_path_glob=None):
-    """ Container for the information needed to unzip a downloaded archive.
-
-    Args:
-        archive_path: Path to the archive file.
-        unzip_path: Path to unzip the archive into. Assumes that this path
-            is unique for the archive.
-        path_within_archive: Specify if and how to handle zip archives
-            downloaded from cloud_storage. Expected values:
-                None: Do not unzip the file downloaded from cloud_storage.
-                '.': Unzip the file downloaded from cloud_storage. The
-                    unzipped file/folder is the expected dependency.
-                file_path: Unzip the file downloaded from cloud_storage.
-                    |file_path| is the path to the expected dependency,
-                    relative to the unzipped archive path.
-        stale_unzip_path_glob: Optional argument specifying a glob matching
-            string which matches directories that should be removed before this
-            archive is extracted (if it is extracted at all).
-    """
-    self._archive_file = archive_file
-    self._unzip_path = unzip_path
-    self._path_within_archive = path_within_archive
-    self._dependency_path = os.path.join(
-        self._unzip_path, self._path_within_archive)
-    self._stale_unzip_path_glob = stale_unzip_path_glob
-    if not self._has_minimum_data:
-      raise ValueError(
-          'Not enough information specified to initialize an archive info.'
-          ' %s' % self)
-
-  def GetUnzippedPath(self):
-    if self.ShouldUnzipArchive():
-      # Remove stale unzip results
-      if self._stale_unzip_path_glob:
-        for path in glob.glob(self._stale_unzip_path_glob):
-          shutil.rmtree(path, ignore_errors=True)
-      # TODO(aiolos): Replace UnzipFile with zipfile.extractall once python
-      # version 2.7.4 or later can safely be assumed.
-      dependency_manager_util.UnzipArchive(
-          self._archive_file, self._unzip_path)
-      if self.ShouldUnzipArchive():
-        raise exceptions.ArchiveError(
-            "Expected path '%s' was not extracted from archive '%s'." %
-            (self._dependency_path, self._archive_file))
-    return self._dependency_path
-
-  def ShouldUnzipArchive(self):
-    if not self._has_minimum_data:
-      raise exceptions.ArchiveError(
-          'Missing needed info to unzip archive. Know data: %s' % self)
-    return not os.path.exists(self._dependency_path)
-
-  @property
-  def _has_minimum_data(self):
-    return all([self._archive_file, self._unzip_path,
-                self._dependency_path])
-
-  def __repr__(self):
-    return (
-        'ArchiveInfo(archive_file=%s, unzip_path=%s, path_within_archive=%s, '
-        'dependency_path =%s)' % (
-            self._archive_file, self._unzip_path, self._path_within_archive,
-            self._dependency_path))
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/base_config.py b/systrace/catapult/dependency_manager/dependency_manager/base_config.py
deleted file mode 100644
index a23d00a..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/base_config.py
+++ /dev/null
@@ -1,416 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import logging
-import os
-
-from py_utils import cloud_storage
-from dependency_manager import archive_info
-from dependency_manager import cloud_storage_info
-from dependency_manager import dependency_info
-from dependency_manager import exceptions
-from dependency_manager import local_path_info
-from dependency_manager import uploader
-
-
-class BaseConfig(object):
-  """A basic config class for use with the DependencyManager.
-
-  Initiated with a json file in the following format:
-
-            {  "config_type": "BaseConfig",
-               "dependencies": {
-                 "dep_name1": {
-                   "cloud_storage_base_folder": "base_folder1",
-                   "cloud_storage_bucket": "bucket1",
-                   "file_info": {
-                     "platform1": {
-                        "cloud_storage_hash": "hash_for_platform1",
-                        "download_path": "download_path111",
-                        "version_in_cs": "1.11.1.11."
-                        "local_paths": ["local_path1110", "local_path1111"]
-                      },
-                      "platform2": {
-                        "cloud_storage_hash": "hash_for_platform2",
-                        "download_path": "download_path2",
-                        "local_paths": ["local_path20", "local_path21"]
-                      },
-                      ...
-                   }
-                 },
-                 "dependency_name_2": {
-                    ...
-                 },
-                  ...
-              }
-            }
-
-    Required fields: "dependencies" and "config_type".
-                     Note that config_type must be "BaseConfig"
-
-    Assumptions:
-        "cloud_storage_base_folder" is a top level folder in the given
-          "cloud_storage_bucket" where all of the dependency files are stored
-          at "dependency_name"_"cloud_storage_hash".
-
-        "download_path" and all paths in "local_paths" are relative to the
-          config file's location.
-
-        All or none of the following cloud storage related fields must be
-          included in each platform dictionary:
-          "cloud_storage_hash", "download_path", "cs_remote_path"
-
-        "version_in_cs" is an optional cloud storage field, but is dependent
-          on the above cloud storage related fields.
-
-
-    Also note that platform names are often of the form os_architechture.
-    Ex: "win_AMD64"
-
-    More information on the fields can be found in dependencies_info.py
-  """
-  def __init__(self, file_path, writable=False):
-    """ Initialize a BaseConfig for the DependencyManager.
-
-    Args:
-        writable: False: This config will be used to lookup information.
-                  True: This config will be used to update information.
-
-        file_path: Path to a file containing a json dictionary in the expected
-                   json format for this config class. Base format expected:
-
-                   { "config_type": config_type,
-                     "dependencies": dependencies_dict }
-
-                   config_type: must match the return value of GetConfigType.
-                   dependencies: A dictionary with the information needed to
-                       create dependency_info instances for the given
-                       dependencies.
-
-                   See dependency_info.py for more information.
-    """
-    self._config_path = file_path
-    self._writable = writable
-    self._pending_uploads = []
-    if not self._config_path:
-      raise ValueError('Must supply config file path.')
-    if not os.path.exists(self._config_path):
-      if not writable:
-        raise exceptions.EmptyConfigError(file_path)
-      self._config_data = {}
-      self._WriteConfigToFile(self._config_path, dependencies=self._config_data)
-    else:
-      with open(file_path, 'r') as f:
-        config_data = json.load(f)
-      if not config_data:
-        raise exceptions.EmptyConfigError(file_path)
-      config_type = config_data.pop('config_type', None)
-      if config_type != self.GetConfigType():
-        raise ValueError(
-            'Supplied config_type (%s) is not the expected type (%s) in file '
-            '%s' % (config_type, self.GetConfigType(), file_path))
-      self._config_data = config_data.get('dependencies', {})
-
-  def IterDependencyInfo(self):
-    """ Yields a DependencyInfo for each dependency/platform pair.
-
-    Raises:
-        ReadWriteError: If called when the config is writable.
-        ValueError: If any of the dependencies contain partial information for
-            downloading from cloud_storage. (See dependency_info.py)
-    """
-    if self._writable:
-      raise exceptions.ReadWriteError(
-          'Trying to read dependency info from a  writable config. File for '
-          'config: %s' % self._config_path)
-    base_path = os.path.dirname(self._config_path)
-    for dependency in self._config_data:
-      dependency_dict = self._config_data.get(dependency)
-      platforms_dict = dependency_dict.get('file_info', {})
-      for platform in platforms_dict:
-        platform_info = platforms_dict.get(platform)
-
-        local_info = None
-        local_paths = platform_info.get('local_paths', [])
-        if local_paths:
-          paths = []
-          for path in local_paths:
-            path = self._FormatPath(path)
-            paths.append(os.path.abspath(os.path.join(base_path, path)))
-          local_info = local_path_info.LocalPathInfo(paths)
-
-        cs_info = None
-        cs_bucket = dependency_dict.get('cloud_storage_bucket')
-        cs_base_folder = dependency_dict.get('cloud_storage_base_folder', '')
-        download_path = platform_info.get('download_path')
-        if download_path:
-          download_path = self._FormatPath(download_path)
-          download_path = os.path.abspath(
-              os.path.join(base_path, download_path))
-
-          cs_hash = platform_info.get('cloud_storage_hash')
-          if not cs_hash:
-            raise exceptions.ConfigError(
-                'Dependency %s has cloud storage info on platform %s, but is '
-                'missing a cloud storage hash.', dependency, platform)
-          cs_remote_path = self._CloudStorageRemotePath(
-              dependency, cs_hash, cs_base_folder)
-          version_in_cs = platform_info.get('version_in_cs')
-
-          zip_info = None
-          path_within_archive = platform_info.get('path_within_archive')
-          if path_within_archive:
-            unzip_path = os.path.abspath(
-                os.path.join(os.path.dirname(download_path),
-                             '%s_%s_%s' % (dependency, platform, cs_hash)))
-            stale_unzip_path_glob = os.path.abspath(
-                os.path.join(os.path.dirname(download_path),
-                             '%s_%s_%s' % (dependency, platform,
-                                           '[0-9a-f]' * 40)))
-            zip_info = archive_info.ArchiveInfo(
-                download_path, unzip_path, path_within_archive,
-                stale_unzip_path_glob)
-
-          cs_info = cloud_storage_info.CloudStorageInfo(
-              cs_bucket, cs_hash, download_path, cs_remote_path,
-              version_in_cs=version_in_cs, archive_info=zip_info)
-
-        dep_info = dependency_info.DependencyInfo(
-            dependency, platform, self._config_path,
-            local_path_info=local_info, cloud_storage_info=cs_info)
-        yield dep_info
-
-  @classmethod
-  def GetConfigType(cls):
-    return 'BaseConfig'
-
-  @property
-  def config_path(self):
-    return self._config_path
-
-  def AddNewDependency(
-      self, dependency, cloud_storage_base_folder, cloud_storage_bucket):
-    self._ValidateIsConfigWritable()
-    if dependency in self:
-      raise ValueError('Config already contains dependency %s' % dependency)
-    self._config_data[dependency] = {
-        'cloud_storage_base_folder': cloud_storage_base_folder,
-        'cloud_storage_bucket': cloud_storage_bucket,
-        'file_info': {},
-    }
-
-  def SetDownloadPath(self, dependency, platform, download_path):
-    self._ValidateIsConfigWritable()
-    if not dependency in self:
-      raise ValueError('Config does not contain dependency %s' % dependency)
-    platform_dicts = self._config_data[dependency]['file_info']
-    if platform not in platform_dicts:
-      platform_dicts[platform] = {}
-    platform_dicts[platform]['download_path'] = download_path
-
-  def AddCloudStorageDependencyUpdateJob(
-      self, dependency, platform, dependency_path, version=None,
-      execute_job=True):
-    """Update the file downloaded from cloud storage for a dependency/platform.
-
-    Upload a new file to cloud storage for the given dependency and platform
-    pair and update the cloud storage hash and the version for the given pair.
-
-    Example usage:
-      The following should update the default platform for 'dep_name':
-          UpdateCloudStorageDependency('dep_name', 'default', 'path/to/file')
-
-      The following should update both the mac and win platforms for 'dep_name',
-      or neither if either update fails:
-          UpdateCloudStorageDependency(
-              'dep_name', 'mac_x86_64', 'path/to/mac/file', execute_job=False)
-          UpdateCloudStorageDependency(
-              'dep_name', 'win_AMD64', 'path/to/win/file', execute_job=False)
-          ExecuteUpdateJobs()
-
-    Args:
-      dependency: The dependency to update.
-      platform: The platform to update the dependency info for.
-      dependency_path: Path to the new dependency to be used.
-      version: Version of the updated dependency, for checking future updates
-          against.
-      execute_job: True if the config should be written to disk and the file
-          should be uploaded to cloud storage after the update. False if
-          multiple updates should be performed atomically. Must call
-          ExecuteUpdateJobs after all non-executed jobs are added to complete
-          the update.
-
-    Raises:
-      ReadWriteError: If the config was not initialized as writable, or if
-          |execute_job| is True but the config has update jobs still pending
-          execution.
-      ValueError: If no information exists in the config for |dependency| on
-          |platform|.
-    """
-    self._ValidateIsConfigUpdatable(
-        execute_job=execute_job, dependency=dependency, platform=platform)
-    cs_hash = cloud_storage.CalculateHash(dependency_path)
-    if version:
-      self._SetPlatformData(dependency, platform, 'version_in_cs', version)
-    self._SetPlatformData(dependency, platform, 'cloud_storage_hash', cs_hash)
-
-    cs_base_folder = self._GetPlatformData(
-        dependency, platform, 'cloud_storage_base_folder')
-    cs_bucket = self._GetPlatformData(
-        dependency, platform, 'cloud_storage_bucket')
-    cs_remote_path = self._CloudStorageRemotePath(
-        dependency, cs_hash, cs_base_folder)
-    self._pending_uploads.append(uploader.CloudStorageUploader(
-        cs_bucket, cs_remote_path, dependency_path))
-    if execute_job:
-      self.ExecuteUpdateJobs()
-
-  def ExecuteUpdateJobs(self, force=False):
-    """Write all config changes to the config_path specified in __init__.
-
-    Upload all files pending upload and then write the updated config to
-    file. Attempt to remove all uploaded files on failure.
-
-    Args:
-      force: True if files should be uploaded to cloud storage even if a
-          file already exists in the upload location.
-
-    Returns:
-      True: if the config was dirty and the upload succeeded.
-      False: if the config was not dirty.
-
-    Raises:
-      CloudStorageUploadConflictError: If |force| is False and the potential
-          upload location of a file already exists.
-      CloudStorageError: If copying an existing file to the backup location
-          or uploading a new file fails.
-    """
-    self._ValidateIsConfigUpdatable()
-    if not self._IsDirty():
-      logging.info('ExecuteUpdateJobs called on clean config')
-      return False
-    if not self._pending_uploads:
-      logging.debug('No files needing upload.')
-    else:
-      try:
-        for item_pending_upload in self._pending_uploads:
-          item_pending_upload.Upload(force)
-        self._WriteConfigToFile(self._config_path, self._config_data)
-        self._pending_uploads = []
-      except:
-        # Attempt to rollback the update in any instance of failure, even user
-        # interrupt via Ctrl+C; but don't consume the exception.
-        logging.error('Update failed, attempting to roll it back.')
-        for upload_item in reversed(self._pending_uploads):
-          upload_item.Rollback()
-        raise
-    return True
-
-  def GetVersion(self, dependency, platform):
-    """Return the Version information for the given dependency."""
-    return self._GetPlatformData(
-        dependency, platform, data_type='version_in_cs')
-
-  def __contains__(self, dependency):
-    """ Returns whether this config contains |dependency|
-
-    Args:
-      dependency: the string name of dependency
-    """
-    return dependency in self._config_data
-
-  def _IsDirty(self):
-    with open(self._config_path, 'r') as fstream:
-      curr_config_data = json.load(fstream)
-    curr_config_data = curr_config_data.get('dependencies', {})
-    return self._config_data != curr_config_data
-
-  def _SetPlatformData(self, dependency, platform, data_type, data):
-    self._ValidateIsConfigWritable()
-    dependency_dict = self._config_data.get(dependency, {})
-    platform_dict = dependency_dict.get('file_info', {}).get(platform)
-    if not platform_dict:
-      raise ValueError('No platform data for platform %s on dependency %s' %
-                       (platform, dependency))
-    if (data_type == 'cloud_storage_bucket' or
-        data_type == 'cloud_storage_base_folder'):
-      self._config_data[dependency][data_type] = data
-    else:
-      self._config_data[dependency]['file_info'][platform][data_type] = data
-
-  def _GetPlatformData(self, dependency, platform, data_type=None):
-    dependency_dict = self._config_data.get(dependency, {})
-    if not dependency_dict:
-      raise ValueError('Dependency %s is not in config.' % dependency)
-    platform_dict = dependency_dict.get('file_info', {}).get(platform)
-    if not platform_dict:
-      raise ValueError('No platform data for platform %s on dependency %s' %
-                       (platform, dependency))
-    if data_type:
-      if (data_type == 'cloud_storage_bucket' or
-          data_type == 'cloud_storage_base_folder'):
-        return dependency_dict.get(data_type)
-      return platform_dict.get(data_type)
-    return platform_dict
-
-  def _ValidateIsConfigUpdatable(
-      self, execute_job=False, dependency=None, platform=None):
-    self._ValidateIsConfigWritable()
-    if self._IsDirty() and execute_job:
-      raise exceptions.ReadWriteError(
-          'A change has already been made to this config. Either call without'
-          'using the execute_job option or first call ExecuteUpdateJobs().')
-    if dependency and not self._config_data.get(dependency):
-      raise ValueError('Cannot update information because dependency %s does '
-                       'not exist.' % dependency)
-    if platform and not self._GetPlatformData(dependency, platform):
-      raise ValueError('No dependency info is available for the given '
-                       'dependency: %s' % dependency)
-
-  def _ValidateIsConfigWritable(self):
-    if not self._writable:
-      raise exceptions.ReadWriteError(
-          'Trying to update the information from a read-only config. '
-          'File for config: %s' % self._config_path)
-
-  @staticmethod
-  def _CloudStorageRemotePath(dependency, cs_hash, cs_base_folder):
-    cs_remote_file = '%s_%s' % (dependency, cs_hash)
-    cs_remote_path = cs_remote_file if not cs_base_folder else (
-        '%s/%s' % (cs_base_folder, cs_remote_file))
-    return cs_remote_path
-
-  @classmethod
-  def _FormatPath(cls, file_path):
-    """ Format |file_path| for the current file system.
-
-    We may be downloading files for another platform, so paths must be
-    downloadable on the current system.
-    """
-    if not file_path:
-      return file_path
-    if os.path.sep != '\\':
-      return file_path.replace('\\', os.path.sep)
-    elif os.path.sep != '/':
-      return file_path.replace('/', os.path.sep)
-    return file_path
-
-  @classmethod
-  def _WriteConfigToFile(cls, file_path, dependencies=None):
-    json_dict = cls._GetJsonDict(dependencies)
-    file_dir = os.path.dirname(file_path)
-    if not os.path.exists(file_dir):
-      os.makedirs(file_dir)
-    with open(file_path, 'w') as outfile:
-      json.dump(
-          json_dict, outfile, indent=2, sort_keys=True, separators=(',', ': '))
-    return json_dict
-
-  @classmethod
-  def _GetJsonDict(cls, dependencies=None):
-    dependencies = dependencies or {}
-    json_dict = {'config_type': cls.GetConfigType(),
-                 'dependencies': dependencies}
-    return json_dict
diff --git a/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py
deleted file mode 100755
index c10d2a7..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py
+++ /dev/null
@@ -1,1566 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=unused-argument
-
-import os
-import unittest
-
-from py_utils import cloud_storage
-import mock
-from pyfakefs import fake_filesystem_unittest
-from pyfakefs import fake_filesystem
-from pyfakefs import fake_filesystem_glob
-
-import dependency_manager
-from dependency_manager import uploader
-
-
-class BaseConfigCreationAndUpdateUnittests(fake_filesystem_unittest.TestCase):
-  def setUp(self):
-    self.addTypeEqualityFunc(uploader.CloudStorageUploader,
-                             uploader.CloudStorageUploader.__eq__)
-    self.setUpPyfakefs()
-    self.dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1'},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash12',
-                         'download_path': '../../relative/dep1/path2'}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1'},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-
-    self.expected_file_lines = [
-      # pylint: disable=bad-continuation
-      '{', '"config_type": "BaseConfig",', '"dependencies": {',
-        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
-          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash11",',
-              '"download_path": "../../relative/dep1/path1"', '},',
-            '"plat2": {', '"cloud_storage_hash": "hash12",',
-              '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
-        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash21",',
-              '"download_path": "../../relative/dep2/path1"', '},',
-            '"plat2": {', '"cloud_storage_hash": "hash22",',
-              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
-      '}', '}']
-
-    self.file_path = os.path.abspath(os.path.join(
-        'path', 'to', 'config', 'file'))
-
-    self.new_dep_path = 'path/to/new/dep'
-    self.fs.CreateFile(self.new_dep_path)
-    self.new_dep_hash = 'A23B56B7F23E798601F'
-    self.new_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1'},
-                     'plat2': {
-                         'cloud_storage_hash': self.new_dep_hash,
-                         'download_path': '../../relative/dep1/path2'}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1'},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    self.new_bucket = 'bucket1'
-    self.new_remote_path = 'dependencies_folder/dep1_%s' % self.new_dep_hash
-    self.new_pending_upload = uploader.CloudStorageUploader(
-        self.new_bucket, self.new_remote_path, self.new_dep_path)
-    self.expected_new_backup_path = '.'.join([self.new_remote_path, 'old'])
-    self.new_expected_file_lines = [
-      # pylint: disable=bad-continuation
-      '{', '"config_type": "BaseConfig",', '"dependencies": {',
-        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
-          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash11",',
-              '"download_path": "../../relative/dep1/path1"', '},',
-            '"plat2": {', '"cloud_storage_hash": "%s",' % self.new_dep_hash,
-              '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
-        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash21",',
-              '"download_path": "../../relative/dep2/path1"', '},',
-            '"plat2": {', '"cloud_storage_hash": "hash22",',
-              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
-      '}', '}']
-
-    self.final_dep_path = 'path/to/final/dep'
-    self.fs.CreateFile(self.final_dep_path)
-    self.final_dep_hash = 'B34662F23B56B7F98601F'
-    self.final_bucket = 'bucket2'
-    self.final_remote_path = 'dep1_%s' % self.final_dep_hash
-    self.final_pending_upload = uploader.CloudStorageUploader(
-        self.final_bucket, self.final_remote_path, self.final_dep_path)
-    self.expected_final_backup_path = '.'.join([self.final_remote_path,
-                                                'old'])
-    self.final_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1'},
-                     'plat2': {
-                         'cloud_storage_hash': self.new_dep_hash,
-                         'download_path': '../../relative/dep1/path2'}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': self.final_dep_hash,
-                         'download_path': '../../relative/dep2/path1'},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    self.final_expected_file_lines = [
-      # pylint: disable=bad-continuation
-      '{', '"config_type": "BaseConfig",', '"dependencies": {',
-        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
-          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash11",',
-              '"download_path": "../../relative/dep1/path1"', '},',
-            '"plat2": {', '"cloud_storage_hash": "%s",' % self.new_dep_hash,
-              '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
-        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "%s",' % self.final_dep_hash,
-              '"download_path": "../../relative/dep2/path1"', '},',
-            '"plat2": {', '"cloud_storage_hash": "hash22",',
-              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
-      '}', '}']
-
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  # Init is not meant to be overridden, so we should be mocking the
-  # base_config's json module, even in subclasses.
-  def testCreateEmptyConfig(self):
-    expected_file_lines = ['{',
-                           '"config_type": "BaseConfig",',
-                           '"dependencies": {}',
-                           '}']
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual({}, config._config_data)
-    self.assertEqual(self.file_path, config._config_path)
-
-  def testCreateEmptyConfigError(self):
-    self.assertRaises(dependency_manager.EmptyConfigError,
-                      dependency_manager.BaseConfig, self.file_path)
-
-  def testCloudStorageRemotePath(self):
-    dependency = 'dep_name'
-    cs_hash = self.new_dep_hash
-    cs_base_folder = 'dependency_remote_folder'
-    expected_remote_path = '%s/%s_%s' % (cs_base_folder, dependency, cs_hash)
-    remote_path = dependency_manager.BaseConfig._CloudStorageRemotePath(
-        dependency, cs_hash, cs_base_folder)
-    self.assertEqual(expected_remote_path, remote_path)
-
-    cs_base_folder = 'dependency_remote_folder'
-    expected_remote_path = '%s_%s' % (dependency, cs_hash)
-    remote_path = dependency_manager.BaseConfig._CloudStorageRemotePath(
-        dependency, cs_hash, cs_base_folder)
-
-  def testGetEmptyJsonDict(self):
-    expected_json_dict = {'config_type': 'BaseConfig',
-                          'dependencies': {}}
-    json_dict = dependency_manager.BaseConfig._GetJsonDict()
-    self.assertEqual(expected_json_dict, json_dict)
-
-  def testGetNonEmptyJsonDict(self):
-    expected_json_dict = {"config_type": "BaseConfig",
-                          "dependencies": self.dependencies}
-    json_dict = dependency_manager.BaseConfig._GetJsonDict(self.dependencies)
-    self.assertEqual(expected_json_dict, json_dict)
-
-  def testWriteEmptyConfigToFile(self):
-    expected_file_lines = ['{', '"config_type": "BaseConfig",',
-                           '"dependencies": {}', '}']
-    self.assertFalse(os.path.exists(self.file_path))
-    dependency_manager.BaseConfig._WriteConfigToFile(self.file_path)
-    self.assertTrue(os.path.exists(self.file_path))
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-  def testWriteNonEmptyConfigToFile(self):
-    self.assertFalse(os.path.exists(self.file_path))
-    dependency_manager.BaseConfig._WriteConfigToFile(self.file_path,
-                                                     self.dependencies)
-    self.assertTrue(os.path.exists(self.file_path))
-    expected_file_lines = list(self.expected_file_lines)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsNoOp(self, uploader_cs_mock):
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-
-    self.assertFalse(config.ExecuteUpdateJobs())
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(self.dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnInsertNoCSCollision(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = False
-    uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = []
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnInsertCSCollisionForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
-                                     self.new_remote_path,
-                                     self.expected_new_backup_path),
-                           mock.call(self.new_bucket, self.new_bucket,
-                                     self.expected_new_backup_path,
-                                     self.new_remote_path)]
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs, force=True)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnInsertCSCollisionNoForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = []
-    expected_copy_calls = []
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnCopy(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = []
-    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
-                                     self.new_remote_path,
-                                     self.expected_new_backup_path)]
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs, force=True)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnSecondInsertNoCSCollision(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = False
-    uploader_cs_mock.Insert.side_effect = [
-        True, cloud_storage.CloudStorageError]
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path,
-                                       self.final_dep_path)]
-    expected_copy_calls = []
-    expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnSecondInsertCSCollisionForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    uploader_cs_mock.Insert.side_effect = [
-        True, cloud_storage.CloudStorageError]
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path,
-                                       self.final_dep_path)]
-    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
-                                     self.new_remote_path,
-                                     self.expected_new_backup_path),
-                           mock.call(self.final_bucket, self.final_bucket,
-                                     self.final_remote_path,
-                                     self.expected_final_backup_path),
-                           mock.call(self.final_bucket, self.final_bucket,
-                                     self.expected_final_backup_path,
-                                     self.final_remote_path),
-                           mock.call(self.new_bucket, self.new_bucket,
-                                     self.expected_new_backup_path,
-                                     self.new_remote_path)]
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs, force=True)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnSecondInsertFirstCSCollisionForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.side_effect = [True, False, True]
-    uploader_cs_mock.Insert.side_effect = [
-        True, cloud_storage.CloudStorageError]
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path,
-                                       self.final_dep_path)]
-    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
-                                     self.new_remote_path,
-                                     self.expected_new_backup_path),
-                           mock.call(self.new_bucket, self.new_bucket,
-                                     self.expected_new_backup_path,
-                                     self.new_remote_path)]
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs, force=True)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnFirstCSCollisionNoForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.side_effect = [True, False, True]
-    uploader_cs_mock.Insert.side_effect = [
-        True, cloud_storage.CloudStorageError]
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = []
-    expected_copy_calls = []
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnSecondCopyCSCollision(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    uploader_cs_mock.Insert.return_value = True
-    uploader_cs_mock.Copy.side_effect = [
-        True, cloud_storage.CloudStorageError, True]
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
-                                     self.new_remote_path,
-                                     self.expected_new_backup_path),
-                           mock.call(self.final_bucket, self.final_bucket,
-                                     self.final_remote_path,
-                                     self.expected_final_backup_path),
-                           mock.call(self.new_bucket, self.new_bucket,
-                                     self.expected_new_backup_path,
-                                     self.new_remote_path)]
-    expected_delete_calls = []
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs, force=True)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnSecondCopyNoCSCollisionForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.side_effect = [False, True, False]
-    uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = [mock.call(self.final_bucket, self.final_bucket,
-                                     self.final_remote_path,
-                                     self.expected_final_backup_path)]
-    expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs, force=True)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsFailureOnSecondCopyNoCSCollisionNoForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.side_effect = [False, True, False]
-    uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = []
-    expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      config.ExecuteUpdateJobs)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsSuccessOnePendingDepNoCloudStorageCollision(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = False
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._IsDirty())
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = []
-    expected_delete_calls = []
-
-    self.assertTrue(config.ExecuteUpdateJobs())
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.new_expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-    self.assertEqual(expected_delete_calls,
-                     uploader_cs_mock.Delete.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsSuccessOnePendingDepCloudStorageCollision(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._IsDirty())
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path)]
-    expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
-                                     self.new_remote_path,
-                                     self.expected_new_backup_path)]
-
-    self.assertTrue(config.ExecuteUpdateJobs(force=True))
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(self.new_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.new_expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsErrorOnePendingDepCloudStorageCollisionNoForce(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.return_value = True
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.new_dependencies.copy()
-    config._is_dirty = True
-    config._pending_uploads = [self.new_pending_upload]
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertTrue(config._is_dirty)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
-    expected_insert_calls = []
-    expected_copy_calls = []
-
-    self.assertRaises(dependency_manager.CloudStorageUploadConflictError,
-                      config.ExecuteUpdateJobs)
-    self.assertTrue(config._is_dirty)
-    self.assertTrue(config._pending_uploads)
-    self.assertEqual(self.new_dependencies, config._config_data)
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testExecuteUpdateJobsSuccessMultiplePendingDepsOneCloudStorageCollision(
-      self, uploader_cs_mock):
-    uploader_cs_mock.Exists.side_effect = [False, True]
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config._config_data = self.final_dependencies.copy()
-    config._pending_uploads = [self.new_pending_upload,
-                               self.final_pending_upload]
-    self.assertEqual(self.final_dependencies, config._config_data)
-    self.assertTrue(config._IsDirty())
-    self.assertEqual(2, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
-
-    expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path)]
-    expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
-                                       self.new_dep_path),
-                             mock.call(self.final_bucket,
-                                       self.final_remote_path,
-                                       self.final_dep_path)]
-    expected_copy_calls = [mock.call(self.final_bucket, self.final_bucket,
-                                     self.final_remote_path,
-                                     self.expected_final_backup_path)]
-
-    self.assertTrue(config.ExecuteUpdateJobs(force=True))
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(self.final_dependencies, config._config_data)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.final_expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(expected_insert_calls,
-                     uploader_cs_mock.Insert.call_args_list)
-    self.assertEqual(expected_exists_calls,
-                     uploader_cs_mock.Exists.call_args_list)
-    self.assertEqual(expected_copy_calls,
-                     uploader_cs_mock.Copy.call_args_list)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testUpdateCloudStorageDependenciesReadOnlyConfig(
-      self, uploader_cs_mock):
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path)
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      config.AddCloudStorageDependencyUpdateJob(
-          'dep', 'plat', 'path')
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      config.AddCloudStorageDependencyUpdateJob(
-          'dep', 'plat', 'path', version='1.2.3')
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      config.AddCloudStorageDependencyUpdateJob(
-          'dep', 'plat', 'path', execute_job=False)
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      config.AddCloudStorageDependencyUpdateJob(
-          'dep', 'plat', 'path', version='1.2.3', execute_job=False)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  def testUpdateCloudStorageDependenciesMissingDependency(
-      self, uploader_cs_mock):
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
-                      'dep', 'plat', 'path')
-    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
-                      'dep', 'plat', 'path', version='1.2.3')
-    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
-                      'dep', 'plat', 'path', execute_job=False)
-    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
-                      'dep', 'plat', 'path', version='1.2.3', execute_job=False)
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  @mock.patch('dependency_manager.base_config.cloud_storage')
-  def testUpdateCloudStorageDependenciesWrite(
-      self, base_config_cs_mock, uploader_cs_mock):
-    expected_dependencies = self.dependencies
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertFalse(config._IsDirty())
-    self.assertEqual(expected_dependencies, config._config_data)
-
-    base_config_cs_mock.CalculateHash.return_value = self.new_dep_hash
-    uploader_cs_mock.Exists.return_value = False
-    expected_dependencies = self.new_dependencies
-    config.AddCloudStorageDependencyUpdateJob(
-        'dep1', 'plat2', self.new_dep_path, execute_job=True)
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(expected_dependencies, config._config_data)
-    # check that file contents has been updated
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    expected_file_lines = list(self.new_expected_file_lines)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-    expected_dependencies = self.final_dependencies
-    base_config_cs_mock.CalculateHash.return_value = self.final_dep_hash
-    config.AddCloudStorageDependencyUpdateJob(
-        'dep2', 'plat1', self.final_dep_path, execute_job=True)
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(expected_dependencies, config._config_data)
-    # check that file contents has been updated
-    expected_file_lines = list(self.final_expected_file_lines)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-  @mock.patch('dependency_manager.uploader.cloud_storage')
-  @mock.patch('dependency_manager.base_config.cloud_storage')
-  def testUpdateCloudStorageDependenciesNoWrite(
-      self, base_config_cs_mock, uploader_cs_mock):
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-
-    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
-                      'dep', 'plat', 'path')
-    self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
-                      'dep', 'plat', 'path', version='1.2.3')
-
-    expected_dependencies = self.dependencies
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertFalse(config._IsDirty())
-    self.assertFalse(config._pending_uploads)
-    self.assertEqual(expected_dependencies, config._config_data)
-
-    base_config_cs_mock.CalculateHash.return_value = self.new_dep_hash
-    uploader_cs_mock.Exists.return_value = False
-    expected_dependencies = self.new_dependencies
-    config.AddCloudStorageDependencyUpdateJob(
-        'dep1', 'plat2', self.new_dep_path, execute_job=False)
-    self.assertTrue(config._IsDirty())
-    self.assertEqual(1, len(config._pending_uploads))
-    self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
-    self.assertEqual(expected_dependencies, config._config_data)
-    # check that file contents have not been updated.
-    expected_file_lines = list(self.expected_file_lines)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-    expected_dependencies = self.final_dependencies
-    base_config_cs_mock.CalculateHash.return_value = self.final_dep_hash
-    config.AddCloudStorageDependencyUpdateJob(
-        'dep2', 'plat1', self.final_dep_path, execute_job=False)
-    self.assertTrue(config._IsDirty())
-    self.assertEqual(expected_dependencies, config._config_data)
-    # check that file contents have not been updated.
-    expected_file_lines = list(self.expected_file_lines)
-    file_module = fake_filesystem.FakeFileOpen(self.fs)
-    for line in file_module(self.file_path):
-      self.assertEqual(expected_file_lines.pop(0), line.strip())
-    self.fs.CloseOpenFile(file_module(self.file_path))
-
-
-class BaseConfigDataManipulationUnittests(fake_filesystem_unittest.TestCase):
-  def setUp(self):
-    self.addTypeEqualityFunc(uploader.CloudStorageUploader,
-                             uploader.CloudStorageUploader.__eq__)
-    self.setUpPyfakefs()
-
-    self.cs_bucket = 'bucket1'
-    self.cs_base_folder = 'dependencies_folder'
-    self.cs_hash = 'hash12'
-    self.download_path = '../../relative/dep1/path2'
-    self.local_paths = ['../../../relative/local/path21',
-                        '../../../relative/local/path22']
-    self.platform_dict = {'cloud_storage_hash': self.cs_hash,
-                          'download_path': self.download_path,
-                          'local_paths': self.local_paths}
-    self.dependencies = {
-        'dep1': {
-            'cloud_storage_bucket': self.cs_bucket,
-            'cloud_storage_base_folder': self.cs_base_folder,
-            'file_info': {
-                'plat1': {
-                    'cloud_storage_hash': 'hash11',
-                    'download_path': '../../relative/dep1/path1',
-                    'local_paths': ['../../../relative/local/path11',
-                                    '../../../relative/local/path12']},
-                'plat2': self.platform_dict
-            }
-        },
-        'dep2': {
-            'cloud_storage_bucket': 'bucket2',
-            'file_info': {
-                'plat1': {
-                    'cloud_storage_hash': 'hash21',
-                    'download_path': '../../relative/dep2/path1',
-                    'local_paths': ['../../../relative/local/path31',
-                                    '../../../relative/local/path32']},
-                'plat2': {
-                    'cloud_storage_hash': 'hash22',
-                    'download_path': '../../relative/dep2/path2'}}}}
-
-    self.file_path = os.path.abspath(os.path.join(
-        'path', 'to', 'config', 'file'))
-
-
-    self.expected_file_lines = [
-      # pylint: disable=bad-continuation
-      '{', '"config_type": "BaseConfig",', '"dependencies": {',
-        '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
-          '"cloud_storage_bucket": "bucket1",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash11",',
-              '"download_path": "../../relative/dep1/path1",',
-              '"local_paths": [', '"../../../relative/local/path11",',
-                              '"../../../relative/local/path12"', ']', '},',
-            '"plat2": {', '"cloud_storage_hash": "hash12",',
-              '"download_path": "../../relative/dep1/path2",',
-              '"local_paths": [', '"../../../relative/local/path21",',
-                              '"../../../relative/local/path22"', ']',
-              '}', '}', '},',
-        '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
-            '"plat1": {', '"cloud_storage_hash": "hash21",',
-              '"download_path": "../../relative/dep2/path1",',
-              '"local_paths": [', '"../../../relative/local/path31",',
-                              '"../../../relative/local/path32"', ']', '},',
-            '"plat2": {', '"cloud_storage_hash": "hash22",',
-              '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
-      '}', '}']
-    self.fs.CreateFile(self.file_path,
-                       contents='\n'.join(self.expected_file_lines))
-
-  def testContaining(self):
-    config = dependency_manager.BaseConfig(self.file_path)
-    self.assertTrue('dep1' in config)
-    self.assertTrue('dep2' in config)
-    self.assertFalse('dep3' in config)
-
-  def testAddNewDependencyNotWriteable(self):
-    config = dependency_manager.BaseConfig(self.file_path)
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      config.AddNewDependency('dep4', 'foo', 'bar')
-
-  def testAddNewDependencyWriteableButDependencyAlreadyExists(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    with self.assertRaises(ValueError):
-      config.AddNewDependency('dep2', 'foo', 'bar')
-
-  def testAddNewDependencySuccessfully(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    config.AddNewDependency('dep3', 'foo', 'bar')
-    self.assertTrue('dep3' in config)
-
-  def testSetDownloadPathNotWritable(self):
-    config = dependency_manager.BaseConfig(self.file_path)
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      config.SetDownloadPath('dep2', 'plat1', '../../relative/dep1/path1')
-
-  def testSetDownloadPathOnExistingPlatformSuccesfully(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    download_path = '../../relative/dep1/foo.bar'
-    config.SetDownloadPath('dep2', 'plat1', download_path)
-    self.assertEqual(
-        download_path,
-        config._GetPlatformData('dep2', 'plat1', 'download_path'))
-
-  def testSetDownloadPathOnNewPlatformSuccesfully(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    download_path = '../../relative/dep1/foo.bar'
-    config.SetDownloadPath('dep2', 'newplat', download_path)
-    self.assertEqual(
-        download_path,
-        config._GetPlatformData('dep2', 'newplat', 'download_path'))
-
-
-  def testSetPlatformDataFailureNotWritable(self):
-    config = dependency_manager.BaseConfig(self.file_path)
-    self.assertRaises(
-        dependency_manager.ReadWriteError, config._SetPlatformData,
-        'dep1', 'plat1', 'cloud_storage_bucket', 'new_bucket')
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testSetPlatformDataFailure(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertRaises(ValueError, config._SetPlatformData, 'missing_dep',
-                      'plat2', 'cloud_storage_bucket', 'new_bucket')
-    self.assertEqual(self.dependencies, config._config_data)
-    self.assertRaises(ValueError, config._SetPlatformData, 'dep1',
-                      'missing_plat', 'cloud_storage_bucket', 'new_bucket')
-    self.assertEqual(self.dependencies, config._config_data)
-
-
-  def testSetPlatformDataCloudStorageBucketSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    updated_cs_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'new_bucket',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1',
-                         'local_paths': ['../../../relative/local/path11',
-                                         '../../../relative/local/path12']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash12',
-                         'download_path': '../../relative/dep1/path2',
-                         'local_paths': ['../../../relative/local/path21',
-                                         '../../../relative/local/path22']}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1',
-                         'local_paths': ['../../../relative/local/path31',
-                                         '../../../relative/local/path32']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    config._SetPlatformData('dep1', 'plat2', 'cloud_storage_bucket',
-                            'new_bucket')
-    self.assertEqual(updated_cs_dependencies, config._config_data)
-
-  def testSetPlatformDataCloudStorageBaseFolderSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    updated_cs_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'new_dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1',
-                         'local_paths': ['../../../relative/local/path11',
-                                         '../../../relative/local/path12']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash12',
-                         'download_path': '../../relative/dep1/path2',
-                         'local_paths': ['../../../relative/local/path21',
-                                         '../../../relative/local/path22']}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1',
-                         'local_paths': ['../../../relative/local/path31',
-                                         '../../../relative/local/path32']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    config._SetPlatformData('dep1', 'plat2', 'cloud_storage_base_folder',
-                            'new_dependencies_folder')
-    self.assertEqual(updated_cs_dependencies, config._config_data)
-
-  def testSetPlatformDataHashSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    updated_cs_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1',
-                         'local_paths': ['../../../relative/local/path11',
-                                         '../../../relative/local/path12']},
-                     'plat2': {
-                         'cloud_storage_hash': 'new_hash',
-                         'download_path': '../../relative/dep1/path2',
-                         'local_paths': ['../../../relative/local/path21',
-                                         '../../../relative/local/path22']}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1',
-                         'local_paths': ['../../../relative/local/path31',
-                                         '../../../relative/local/path32']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    config._SetPlatformData('dep1', 'plat2', 'cloud_storage_hash',
-                            'new_hash')
-    self.assertEqual(updated_cs_dependencies, config._config_data)
-
-  def testSetPlatformDataDownloadPathSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    updated_cs_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1',
-                         'local_paths': ['../../../relative/local/path11',
-                                         '../../../relative/local/path12']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash12',
-                         'download_path': '../../new/dep1/path2',
-                         'local_paths': ['../../../relative/local/path21',
-                                         '../../../relative/local/path22']}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1',
-                         'local_paths': ['../../../relative/local/path31',
-                                         '../../../relative/local/path32']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    config._SetPlatformData('dep1', 'plat2', 'download_path',
-                            '../../new/dep1/path2')
-    self.assertEqual(updated_cs_dependencies, config._config_data)
-
-  def testSetPlatformDataLocalPathSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    updated_cs_dependencies = {
-        'dep1': {'cloud_storage_bucket': 'bucket1',
-                 'cloud_storage_base_folder': 'dependencies_folder',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash11',
-                         'download_path': '../../relative/dep1/path1',
-                         'local_paths': ['../../../relative/local/path11',
-                                         '../../../relative/local/path12']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash12',
-                         'download_path': '../../relative/dep1/path2',
-                         'local_paths': ['../../new/relative/local/path21',
-                                         '../../new/relative/local/path22']}}},
-        'dep2': {'cloud_storage_bucket': 'bucket2',
-                 'file_info': {
-                     'plat1': {
-                         'cloud_storage_hash': 'hash21',
-                         'download_path': '../../relative/dep2/path1',
-                         'local_paths': ['../../../relative/local/path31',
-                                         '../../../relative/local/path32']},
-                     'plat2': {
-                         'cloud_storage_hash': 'hash22',
-                         'download_path': '../../relative/dep2/path2'}}}}
-    config._SetPlatformData('dep1', 'plat2', 'local_paths',
-                            ['../../new/relative/local/path21',
-                             '../../new/relative/local/path22'])
-    self.assertEqual(updated_cs_dependencies, config._config_data)
-
-  def testGetPlatformDataFailure(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertRaises(ValueError, config._GetPlatformData, 'missing_dep',
-                      'plat2', 'cloud_storage_bucket')
-    self.assertEqual(self.dependencies, config._config_data)
-    self.assertRaises(ValueError, config._GetPlatformData, 'dep1',
-                      'missing_plat', 'cloud_storage_bucket')
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testGetPlatformDataDictSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertEqual(self.platform_dict,
-                     config._GetPlatformData('dep1', 'plat2'))
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testGetPlatformDataCloudStorageBucketSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertEqual(self.cs_bucket, config._GetPlatformData(
-        'dep1', 'plat2', 'cloud_storage_bucket'))
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testGetPlatformDataCloudStorageBaseFolderSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertEqual(self.cs_base_folder, config._GetPlatformData(
-        'dep1', 'plat2', 'cloud_storage_base_folder'))
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testGetPlatformDataHashSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertEqual(self.cs_hash, config._GetPlatformData(
-        'dep1', 'plat2', 'cloud_storage_hash'))
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testGetPlatformDataDownloadPathSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertEqual(self.download_path, config._GetPlatformData(
-        'dep1', 'plat2', 'download_path'))
-    self.assertEqual(self.dependencies, config._config_data)
-
-  def testGetPlatformDataLocalPathSuccess(self):
-    config = dependency_manager.BaseConfig(self.file_path, writable=True)
-    self.assertEqual(self.local_paths, config._GetPlatformData(
-        'dep1', 'plat2', 'local_paths'))
-    self.assertEqual(self.dependencies, config._config_data)
-
-class BaseConfigTest(unittest.TestCase):
-  """ Subclassable unittests for BaseConfig.
-  For subclasses: override setUp, GetConfigDataFromDict,
-    and EndToEndExpectedConfigData as needed.
-
-    setUp must set the following properties:
-      self.config_type: String returnedd from GetConfigType in config subclass.
-      self.config_class: the class for the config subclass.
-      self.config_module: importable module for the config subclass.
-      self.empty_dict: expected dictionary for an empty config, as it would be
-        stored in a json file.
-      self.one_dep_dict: example dictionary for a config with one dependency,
-        as it would be stored in a json file.
-  """
-  def setUp(self):
-    self.config_type = 'BaseConfig'
-    self.config_class = dependency_manager.BaseConfig
-    self.config_module = 'dependency_manager.base_config'
-
-    self.empty_dict = {'config_type': self.config_type,
-                       'dependencies': {}}
-
-    dependency_dict = {
-        'dep': {
-            'cloud_storage_base_folder': 'cs_base_folder1',
-            'cloud_storage_bucket': 'bucket1',
-            'file_info': {
-                'plat1_arch1': {
-                    'cloud_storage_hash': 'hash111',
-                    'download_path': 'download_path111',
-                    'cs_remote_path': 'cs_path111',
-                    'version_in_cs': 'version_111',
-                    'local_paths': ['local_path1110', 'local_path1111']
-                },
-                'plat1_arch2': {
-                    'cloud_storage_hash': 'hash112',
-                    'download_path': 'download_path112',
-                    'cs_remote_path': 'cs_path112',
-                    'local_paths': ['local_path1120', 'local_path1121']
-                },
-                'win_arch1': {
-                    'cloud_storage_hash': 'hash1w1',
-                    'download_path': 'download\\path\\1w1',
-                    'cs_remote_path': 'cs_path1w1',
-                    'local_paths': ['local\\path\\1w10', 'local\\path\\1w11']
-                },
-                'all_the_variables': {
-                    'cloud_storage_hash': 'hash111',
-                    'download_path': 'download_path111',
-                    'cs_remote_path': 'cs_path111',
-                    'version_in_cs': 'version_111',
-                    'path_within_archive': 'path/within/archive',
-                    'local_paths': ['local_path1110', 'local_path1111']
-                }
-            }
-        }
-    }
-    self.one_dep_dict = {'config_type': self.config_type,
-                         'dependencies': dependency_dict}
-
-  def GetConfigDataFromDict(self, config_dict):
-    return config_dict.get('dependencies', {})
-
-  @mock.patch('os.path')
-  @mock.patch('__builtin__.open')
-  def testInitBaseProperties(self, open_mock, path_mock):
-    # Init is not meant to be overridden, so we should be mocking the
-    # base_config's json module, even in subclasses.
-    json_module = 'dependency_manager.base_config.json'
-    with mock.patch(json_module) as json_mock:
-      json_mock.load.return_value = self.empty_dict.copy()
-      config = self.config_class('file_path')
-      self.assertEqual('file_path', config._config_path)
-      self.assertEqual(self.config_type, config.GetConfigType())
-      self.assertEqual(self.GetConfigDataFromDict(self.empty_dict),
-                       config._config_data)
-
-  @mock.patch('dependency_manager.dependency_info.DependencyInfo')
-  @mock.patch('os.path')
-  @mock.patch('__builtin__.open')
-  def testInitWithDependencies(self, open_mock, path_mock, dep_info_mock):
-    # Init is not meant to be overridden, so we should be mocking the
-    # base_config's json module, even in subclasses.
-    json_module = 'dependency_manager.base_config.json'
-    with mock.patch(json_module) as json_mock:
-      json_mock.load.return_value = self.one_dep_dict
-      config = self.config_class('file_path')
-      self.assertEqual('file_path', config._config_path)
-      self.assertEqual(self.config_type, config.GetConfigType())
-      self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
-                       config._config_data)
-
-  def testFormatPath(self):
-    self.assertEqual(None, self.config_class._FormatPath(None))
-    self.assertEqual('', self.config_class._FormatPath(''))
-    self.assertEqual('some_string',
-                     self.config_class._FormatPath('some_string'))
-
-    expected_path = os.path.join('some', 'file', 'path')
-    self.assertEqual(expected_path,
-                     self.config_class._FormatPath('some/file/path'))
-    self.assertEqual(expected_path,
-                     self.config_class._FormatPath('some\\file\\path'))
-
-  @mock.patch('dependency_manager.base_config.json')
-  @mock.patch('dependency_manager.dependency_info.DependencyInfo')
-  @mock.patch('os.path.exists')
-  @mock.patch('__builtin__.open')
-  def testIterDependenciesError(
-      self, open_mock, exists_mock, dep_info_mock, json_mock):
-    # Init is not meant to be overridden, so we should be mocking the
-    # base_config's json module, even in subclasses.
-    json_mock.load.return_value = self.one_dep_dict
-    config = self.config_class('file_path', writable=True)
-    self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
-                     config._config_data)
-    self.assertTrue(config._writable)
-    with self.assertRaises(dependency_manager.ReadWriteError):
-      for _ in config.IterDependencyInfo():
-        pass
-
-  @mock.patch('dependency_manager.base_config.json')
-  @mock.patch('dependency_manager.dependency_info.DependencyInfo')
-  @mock.patch('os.path.exists')
-  @mock.patch('__builtin__.open')
-  def testIterDependencies(
-      self, open_mock, exists_mock, dep_info_mock, json_mock):
-    json_mock.load.return_value = self.one_dep_dict
-    config = self.config_class('file_path')
-    self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
-                     config._config_data)
-    expected_dep_info = ['dep_info0', 'dep_info1', 'dep_info2']
-    dep_info_mock.side_effect = expected_dep_info
-    expected_calls = [
-        mock.call('dep', 'plat1_arch1', 'file_path', cs_bucket='bucket1',
-                  cs_hash='hash111', download_path='download_path111',
-                  cs_remote_path='cs_path111',
-                  local_paths=['local_path1110', 'local_path1111']),
-        mock.call('dep', 'plat1_arch1', 'file_path', cs_bucket='bucket1',
-                  cs_hash='hash112', download_path='download_path112',
-                  cs_remote_path='cs_path112',
-                  local_paths=['local_path1120', 'local_path1121']),
-        mock.call('dep', 'win_arch1', 'file_path', cs_bucket='bucket1',
-                  cs_hash='hash1w1',
-                  download_path=os.path.join('download', 'path', '1w1'),
-                  cs_remote_path='cs_path1w1',
-                  local_paths=[os.path.join('download', 'path', '1w10'),
-                               os.path.join('download', 'path', '1w11')])]
-    deps_seen = []
-    for dep_info in config.IterDependencyInfo():
-      deps_seen.append(dep_info)
-    dep_info_mock.assert_call_args(expected_calls)
-    self.assertItemsEqual(expected_dep_info, deps_seen)
-
-  @mock.patch('dependency_manager.base_config.json')
-  @mock.patch('os.path.exists')
-  @mock.patch('__builtin__.open')
-  def testIterDependenciesStaleGlob(self, open_mock, exists_mock, json_mock):
-    json_mock.load.return_value = self.one_dep_dict
-    config = self.config_class('file_path')
-
-    abspath = os.path.abspath
-    should_match = set(map(abspath, [
-        'dep_all_the_variables_0123456789abcdef0123456789abcdef01234567',
-        'dep_all_the_variables_123456789abcdef0123456789abcdef012345678']))
-    # Not testing case changes, because Windows is case-insensitive.
-    should_not_match = set(map(abspath, [
-        # A configuration that doesn't unzip shouldn't clear any stale unzips.
-        'dep_plat1_arch1_0123456789abcdef0123456789abcdef01234567',
-        # "Hash" component less than 40 characters (not a valid SHA1 hash).
-        'dep_all_the_variables_0123456789abcdef0123456789abcdef0123456',
-        # "Hash" component greater than 40 characters (not a valid SHA1 hash).
-        'dep_all_the_variables_0123456789abcdef0123456789abcdef012345678',
-        # "Hash" component not comprised of hex (not a valid SHA1 hash).
-        'dep_all_the_variables_0123456789gggggg0123456789gggggg01234567']))
-
-    # Create a fake filesystem just for glob to use
-    fake_fs = fake_filesystem.FakeFilesystem()
-    fake_glob = fake_filesystem_glob.FakeGlobModule(fake_fs)
-    for stale_dir in set.union(should_match, should_not_match):
-      fake_fs.CreateDirectory(stale_dir)
-      fake_fs.CreateFile(os.path.join(stale_dir, 'some_file'))
-
-    for dep_info in config.IterDependencyInfo():
-      if dep_info.platform == 'all_the_variables':
-        cs_info = dep_info.cloud_storage_info
-        actual_glob = cs_info._archive_info._stale_unzip_path_glob
-        actual_matches = set(fake_glob.glob(actual_glob))
-        self.assertItemsEqual(should_match, actual_matches)
diff --git a/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py b/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py
deleted file mode 100644
index 376c311..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import errno
-import os
-import stat
-
-from py_utils import cloud_storage
-
-from dependency_manager import exceptions
-
-class CloudStorageInfo(object):
-  def __init__(self, cs_bucket, cs_hash, download_path, cs_remote_path,
-               version_in_cs=None, archive_info=None):
-    """ Container for the information needed to download a dependency from
-        cloud storage.
-
-    Args:
-          cs_bucket: The cloud storage bucket the dependency is located in.
-          cs_hash: The hash of the file stored in cloud storage.
-          download_path: Where the file should be downloaded to.
-          cs_remote_path: Where the file is stored in the cloud storage bucket.
-          version_in_cs: The version of the file stored in cloud storage.
-          archive_info: An instance of ArchiveInfo if this dependency is an
-              archive. Else None.
-    """
-    self._download_path = download_path
-    self._cs_remote_path = cs_remote_path
-    self._cs_bucket = cs_bucket
-    self._cs_hash = cs_hash
-    self._version_in_cs = version_in_cs
-    self._archive_info = archive_info
-    if not self._has_minimum_data:
-      raise ValueError(
-          'Not enough information specified to initialize a cloud storage info.'
-          ' %s' % self)
-
-  def DependencyExistsInCloudStorage(self):
-    return cloud_storage.Exists(self._cs_bucket, self._cs_remote_path)
-
-  def GetRemotePath(self):
-    """Gets the path to a downloaded version of the dependency.
-
-    May not download the file if it has already been downloaded.
-    Will unzip the downloaded file if a non-empty archive_info was passed in at
-    init.
-
-    Returns: A path to an executable that was stored in cloud_storage, or None
-       if not found.
-
-    Raises:
-        CredentialsError: If cloud_storage credentials aren't configured.
-        PermissionError: If cloud_storage credentials are configured, but not
-            with an account that has permission to download the needed file.
-        NotFoundError: If the needed file does not exist where expected in
-            cloud_storage or the downloaded zip file.
-        ServerError: If an internal server error is hit while downloading the
-            needed file.
-        CloudStorageError: If another error occured while downloading the remote
-            path.
-        FileNotFoundError: If the download was otherwise unsuccessful.
-    """
-    if not self._has_minimum_data:
-      return None
-
-    download_dir = os.path.dirname(self._download_path)
-    if not os.path.exists(download_dir):
-      try:
-        os.makedirs(download_dir)
-      except OSError as e:
-        # The logic above is racy, and os.makedirs will raise an OSError if
-        # the directory exists.
-        if e.errno != errno.EEXIST:
-          raise
-
-    dependency_path = self._download_path
-    cloud_storage.GetIfHashChanged(
-        self._cs_remote_path, self._download_path, self._cs_bucket,
-        self._cs_hash)
-    if not os.path.exists(dependency_path):
-      raise exceptions.FileNotFoundError(dependency_path)
-
-    if self.has_archive_info:
-      dependency_path = self._archive_info.GetUnzippedPath()
-    else:
-      mode = os.stat(dependency_path).st_mode
-      os.chmod(dependency_path, mode | stat.S_IXUSR)
-    return os.path.abspath(dependency_path)
-
-  @property
-  def version_in_cs(self):
-    return self._version_in_cs
-
-  @property
-  def _has_minimum_data(self):
-    return all([self._cs_bucket, self._cs_remote_path, self._download_path,
-                self._cs_hash])
-
-
-  @property
-  def has_archive_info(self):
-    return bool(self._archive_info)
-
-  def __repr__(self):
-    return (
-        'CloudStorageInfo(download_path=%s, cs_remote_path=%s, cs_bucket=%s, '
-        'cs_hash=%s, version_in_cs=%s, archive_info=%s)' % (
-            self._download_path, self._cs_remote_path, self._cs_bucket,
-            self._cs_hash, self._version_in_cs, self._archive_info))
diff --git a/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py
deleted file mode 100644
index 844465d..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py
+++ /dev/null
@@ -1,233 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import stat
-import unittest
-
-import mock
-from pyfakefs import fake_filesystem_unittest
-from py_utils import cloud_storage
-
-from dependency_manager import archive_info
-from dependency_manager import cloud_storage_info
-from dependency_manager import exceptions
-
-class CloudStorageInfoTest(unittest.TestCase):
-  def testInitCloudStorageInfoErrors(self):
-    # Must specify cloud storage information atomically.
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      None, None, None, None)
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      'cs_bucket', None, None, None)
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      None, 'cs_hash', None, None)
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      None, None, 'download_path', None)
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      None, None, None, 'cs_remote_path')
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      None, 'cs_hash', 'download_path', 'cs_remote_path')
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      'cs_bucket', None, 'download_path', 'cs_remote_path')
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      'cs_bucket', 'cs_hash', None, 'cs_remote_path')
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      'cs_bucket', 'cs_hash', 'download_path', None)
-
-  def testInitWithVersion(self):
-    self.assertRaises(
-        ValueError, cloud_storage_info.CloudStorageInfo, None, None, None,
-        'cs_remote_path', version_in_cs='version_in_cs')
-    self.assertRaises(
-        ValueError, cloud_storage_info.CloudStorageInfo, None, 'cs_hash',
-        'download_path', 'cs_remote_path', version_in_cs='version_in_cs')
-
-    cs_info = cloud_storage_info.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', 'download_path', 'cs_remote_path',
-        version_in_cs='version_in_cs')
-    self.assertEqual('cs_hash', cs_info._cs_hash)
-    self.assertEqual('cs_bucket', cs_info._cs_bucket)
-    self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
-    self.assertEqual('download_path', cs_info._download_path)
-    self.assertEqual('version_in_cs', cs_info._version_in_cs)
-
-  def testInitWithArchiveInfoErrors(self):
-    zip_info = archive_info.ArchiveInfo(
-        'download_path', 'unzip_location', 'path_within_archive')
-    self.assertRaises(
-        ValueError, cloud_storage_info.CloudStorageInfo, None, None, None, None,
-        archive_info=zip_info)
-    self.assertRaises(
-        ValueError, cloud_storage_info.CloudStorageInfo, None, None, None,
-        'cs_remote_path', archive_info=zip_info)
-    self.assertRaises(
-        ValueError, cloud_storage_info.CloudStorageInfo, 'cs_bucket', 'cs_hash',
-        None, 'cs_remote_path', archive_info=zip_info)
-    self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
-                      'cs_bucket', 'cs_hash',
-                      'cs_remote_path', None, version_in_cs='version',
-                      archive_info=zip_info)
-
-
-  def testInitWithArchiveInfo(self):
-    zip_info = archive_info.ArchiveInfo(
-        'download_path', 'unzip_location', 'path_within_archive')
-    cs_info = cloud_storage_info.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', 'download_path', 'cs_remote_path',
-        archive_info=zip_info)
-    self.assertEqual('cs_hash', cs_info._cs_hash)
-    self.assertEqual('cs_bucket', cs_info._cs_bucket)
-    self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
-    self.assertEqual('download_path', cs_info._download_path)
-    self.assertEqual(zip_info, cs_info._archive_info)
-    self.assertFalse(cs_info._version_in_cs)
-
-  def testInitWithVersionAndArchiveInfo(self):
-    zip_info = archive_info.ArchiveInfo(
-        'download_path', 'unzip_location', 'path_within_archive')
-    cs_info = cloud_storage_info.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', 'download_path',
-        'cs_remote_path', version_in_cs='version_in_cs',
-        archive_info=zip_info)
-    self.assertEqual('cs_hash', cs_info._cs_hash)
-    self.assertEqual('cs_bucket', cs_info._cs_bucket)
-    self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
-    self.assertEqual('download_path', cs_info._download_path)
-    self.assertEqual(zip_info, cs_info._archive_info)
-    self.assertEqual('version_in_cs', cs_info._version_in_cs)
-
-  def testInitMinimumCloudStorageInfo(self):
-    cs_info = cloud_storage_info.CloudStorageInfo(
-        'cs_bucket',
-        'cs_hash', 'download_path',
-        'cs_remote_path')
-    self.assertEqual('cs_hash', cs_info._cs_hash)
-    self.assertEqual('cs_bucket', cs_info._cs_bucket)
-    self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
-    self.assertEqual('download_path', cs_info._download_path)
-    self.assertFalse(cs_info._version_in_cs)
-    self.assertFalse(cs_info._archive_info)
-
-
-class TestGetRemotePath(fake_filesystem_unittest.TestCase):
-  def setUp(self):
-    self.setUpPyfakefs()
-    self.config_path = '/test/dep_config.json'
-    self.fs.CreateFile(self.config_path, contents='{}')
-    self.download_path = '/foo/download_path'
-    self.fs.CreateFile(
-        self.download_path, contents='1010110', st_mode=stat.S_IWOTH)
-    self.cs_info = cloud_storage_info.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', self.download_path, 'cs_remote_path',
-        version_in_cs='1.2.3.4',)
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  @mock.patch(
-      'py_utils.cloud_storage.GetIfHashChanged')
-  def testGetRemotePathNoArchive(self, cs_get_mock):
-    def _GetIfHashChangedMock(cs_path, download_path, bucket, file_hash):
-      del cs_path, bucket, file_hash
-      if not os.path.exists(download_path):
-        self.fs.CreateFile(download_path, contents='1010001010101010110101')
-    cs_get_mock.side_effect = _GetIfHashChangedMock
-    # All of the needed information is given, and the downloaded path exists
-    # after calling cloud storage.
-    self.assertEqual(
-        os.path.abspath(self.download_path),
-        self.cs_info.GetRemotePath())
-    self.assertTrue(os.stat(self.download_path).st_mode & stat.S_IXUSR)
-
-    # All of the needed information is given, but the downloaded path doesn't
-    # exists after calling cloud storage.
-    self.fs.RemoveObject(self.download_path)
-    cs_get_mock.side_effect = [True]  # pylint: disable=redefined-variable-type
-    self.assertRaises(
-        exceptions.FileNotFoundError, self.cs_info.GetRemotePath)
-
-  @mock.patch(
-      'dependency_manager.dependency_manager_util.UnzipArchive')
-  @mock.patch(
-      'dependency_manager.cloud_storage_info.cloud_storage.GetIfHashChanged') # pylint: disable=line-too-long
-  def testGetRemotePathWithArchive(self, cs_get_mock, unzip_mock):
-    def _GetIfHashChangedMock(cs_path, download_path, bucket, file_hash):
-      del cs_path, bucket, file_hash
-      if not os.path.exists(download_path):
-        self.fs.CreateFile(download_path, contents='1010001010101010110101')
-    cs_get_mock.side_effect = _GetIfHashChangedMock
-
-    unzip_path = os.path.join(
-        os.path.dirname(self.download_path), 'unzip_dir')
-    path_within_archive = os.path.join('path', 'within', 'archive')
-    dep_path = os.path.join(unzip_path, path_within_archive)
-    def _UnzipFileMock(archive_file, unzip_location, tmp_location=None):
-      del archive_file, tmp_location
-      self.fs.CreateFile(dep_path)
-      self.fs.CreateFile(os.path.join(unzip_location, 'extra', 'path'))
-      self.fs.CreateFile(os.path.join(unzip_location, 'another_extra_path'))
-    unzip_mock.side_effect = _UnzipFileMock
-
-    # Create a stale directory that's expected to get deleted
-    stale_unzip_path_glob = os.path.join(
-        os.path.dirname(self.download_path), 'unzip_dir_*')
-    stale_path = os.path.join(
-        os.path.dirname(self.download_path), 'unzip_dir_stale')
-    self.fs.CreateDirectory(stale_path)
-    self.fs.CreateFile(os.path.join(stale_path, 'some_file'))
-
-    self.assertFalse(os.path.exists(dep_path))
-    zip_info = archive_info.ArchiveInfo(
-        self.download_path, unzip_path, path_within_archive,
-        stale_unzip_path_glob)
-    self.cs_info = cloud_storage_info.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', self.download_path, 'cs_remote_path',
-        version_in_cs='1.2.3.4', archive_info=zip_info)
-
-    self.assertFalse(unzip_mock.called)
-    self.assertEqual(
-        os.path.abspath(dep_path),
-        self.cs_info.GetRemotePath())
-    self.assertTrue(os.path.exists(dep_path))
-    self.assertTrue(stat.S_IMODE(os.stat(os.path.abspath(dep_path)).st_mode) &
-                    (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR))
-    unzip_mock.assert_called_once_with(self.download_path, unzip_path)
-
-    # Stale directory should have been deleted
-    self.assertFalse(os.path.exists(stale_path))
-
-    # Should not need to unzip a second time, but should return the same path.
-    unzip_mock.reset_mock()
-    self.assertTrue(os.path.exists(dep_path))
-    self.assertEqual(
-        os.path.abspath(dep_path),
-        self.cs_info.GetRemotePath())
-    self.assertTrue(stat.S_IMODE(os.stat(os.path.abspath(dep_path)).st_mode) &
-                    (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR))
-    self.assertFalse(unzip_mock.called)
-
-
-  @mock.patch(
-      'py_utils.cloud_storage.GetIfHashChanged')
-  def testGetRemotePathCloudStorageErrors(self, cs_get_mock):
-    cs_get_mock.side_effect = cloud_storage.CloudStorageError
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      self.cs_info.GetRemotePath)
-
-    cs_get_mock.side_effect = cloud_storage.ServerError
-    self.assertRaises(cloud_storage.ServerError,
-                      self.cs_info.GetRemotePath)
-
-    cs_get_mock.side_effect = cloud_storage.NotFoundError
-    self.assertRaises(cloud_storage.NotFoundError,
-                      self.cs_info.GetRemotePath)
-
-    cs_get_mock.side_effect = cloud_storage.PermissionError
-    self.assertRaises(cloud_storage.PermissionError,
-                      self.cs_info.GetRemotePath)
-
-    cs_get_mock.side_effect = cloud_storage.CredentialsError
-    self.assertRaises(cloud_storage.CredentialsError,
-                      self.cs_info.GetRemotePath)
diff --git a/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py b/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py
deleted file mode 100644
index 899657e..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-class DependencyInfo(object):
-  def __init__(self, dependency, platform, config_path, local_path_info=None,
-               cloud_storage_info=None):
-    """ Container for the information needed for each dependency/platform pair
-    in the dependency_manager.
-
-    Args:
-        Required:
-          dependency: Name of the dependency.
-          platform: Name of the platform to be run on.
-          config_path: Path to the config_path this information came from. Used
-                       for error messages to improve debugging.
-
-        Optional:
-          local_path_info: A LocalPathInfo instance.
-          cloud_storage_info: An instance of CloudStorageInfo.
-    """
-    # TODO(aiolos): update the above doc string for A) the usage of zip files
-    # and B) supporting lists of local_paths to be checked for most recently
-    # changed files.
-    if not dependency or not platform:
-      raise ValueError(
-          'Must supply both a dependency and platform to DependencyInfo')
-
-    self._dependency = dependency
-    self._platform = platform
-    self._config_paths = [config_path]
-    self._local_path_info = local_path_info
-    self._cloud_storage_info = cloud_storage_info
-
-  def Update(self, new_dep_info):
-    """Add the information from |new_dep_info| to this instance.
-    """
-    self._config_paths.extend(new_dep_info.config_paths)
-    if (self.dependency != new_dep_info.dependency or
-        self.platform != new_dep_info.platform):
-      raise ValueError(
-          'Cannot update DependencyInfo with different dependency or platform.'
-          'Existing dep: %s, existing platform: %s. New dep: %s, new platform:'
-          '%s. Config_paths conflicting: %s' % (
-              self.dependency, self.platform, new_dep_info.dependency,
-              new_dep_info.platform, self.config_paths))
-    if new_dep_info.has_cloud_storage_info:
-      if self.has_cloud_storage_info:
-        raise ValueError(
-            'Overriding cloud storage data is not allowed when updating a '
-            'DependencyInfo. Conflict in dependency %s on platform %s in '
-            'config_paths: %s.' % (self.dependency, self.platform,
-                                   self.config_paths))
-      else:
-        self._cloud_storage_info = new_dep_info._cloud_storage_info
-    if not self._local_path_info:
-      self._local_path_info = new_dep_info._local_path_info
-    else:
-      self._local_path_info.Update(new_dep_info._local_path_info)
-
-  def GetRemotePath(self):
-    """Gets the path to a downloaded version of the dependency.
-
-    May not download the file if it has already been downloaded.
-    Will unzip the downloaded file if specified in the config
-    via unzipped_hash.
-
-    Returns: A path to an executable that was stored in cloud_storage, or None
-       if not found.
-
-    Raises:
-        CredentialsError: If cloud_storage credentials aren't configured.
-        PermissionError: If cloud_storage credentials are configured, but not
-            with an account that has permission to download the needed file.
-        NotFoundError: If the needed file does not exist where expected in
-            cloud_storage or the downloaded zip file.
-        ServerError: If an internal server error is hit while downloading the
-            needed file.
-        CloudStorageError: If another error occured while downloading the remote
-            path.
-        FileNotFoundError: If the download was otherwise unsuccessful.
-    """
-    if self.has_cloud_storage_info:
-      return self._cloud_storage_info.GetRemotePath()
-    return None
-
-  def GetRemotePathVersion(self):
-    if self.has_cloud_storage_info:
-      return self._cloud_storage_info.version_in_cs
-    return None
-
-  def GetLocalPath(self):
-    """Gets the path to a local version of the dependency.
-
-    Returns: A path to a local dependency, or None if not found.
-
-    """
-    if self.has_local_path_info:
-      return self._local_path_info.GetLocalPath()
-    return None
-
-  @property
-  def dependency(self):
-    return self._dependency
-
-  @property
-  def platform(self):
-    return self._platform
-
-  @property
-  def config_paths(self):
-    return self._config_paths
-
-  @property
-  def local_path_info(self):
-    return self._local_path_info
-
-  @property
-  def has_cloud_storage_info(self):
-    return bool(self._cloud_storage_info)
-
-  @property
-  def has_local_path_info(self):
-    return bool(self._local_path_info)
-
-  @property
-  def cloud_storage_info(self):
-    return self._cloud_storage_info
diff --git a/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py
deleted file mode 100644
index 6117cd3..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py
+++ /dev/null
@@ -1,234 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-import dependency_manager
-
-class DependencyInfoTest(unittest.TestCase):
-  def testInitRequiredInfo(self):
-    # Must have a dependency, platform and file_path.
-    self.assertRaises(ValueError, dependency_manager.DependencyInfo,
-                      None, None, None)
-    self.assertRaises(ValueError, dependency_manager.DependencyInfo,
-                      'dep', None, None)
-    self.assertRaises(ValueError, dependency_manager.DependencyInfo,
-                      None, 'plat', None)
-    self.assertRaises(ValueError, dependency_manager.DependencyInfo,
-                      None, None, 'config_path')
-    # Empty DependencyInfo.
-    empty_di = dependency_manager.DependencyInfo('dep', 'plat', 'config_path')
-    self.assertEqual('dep', empty_di.dependency)
-    self.assertEqual('plat', empty_di.platform)
-    self.assertEqual(['config_path'], empty_di.config_paths)
-    self.assertFalse(empty_di.has_local_path_info)
-    self.assertFalse(empty_di.has_cloud_storage_info)
-
-  def testInitLocalPaths(self):
-    local_path_info = dependency_manager.LocalPathInfo(['path0', 'path1'])
-    dep_info = dependency_manager.DependencyInfo(
-        'dep', 'platform', 'config_path', local_path_info
-        )
-    self.assertEqual('dep', dep_info.dependency)
-    self.assertEqual('platform', dep_info.platform)
-    self.assertEqual(['config_path'], dep_info.config_paths)
-    self.assertEqual(local_path_info, dep_info._local_path_info)
-    self.assertFalse(dep_info.has_cloud_storage_info)
-
-  def testInitCloudStorageInfo(self):
-    cs_info = dependency_manager.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', 'dowload_path', 'cs_remote_path')
-    dep_info = dependency_manager.DependencyInfo(
-        'dep', 'platform', 'config_path', cloud_storage_info=cs_info)
-    self.assertEqual('dep', dep_info.dependency)
-    self.assertEqual('platform', dep_info.platform)
-    self.assertEqual(['config_path'], dep_info.config_paths)
-    self.assertFalse(dep_info.has_local_path_info)
-    self.assertTrue(dep_info.has_cloud_storage_info)
-    self.assertEqual(cs_info, dep_info._cloud_storage_info)
-
-  def testInitAllInfo(self):
-    cs_info = dependency_manager.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', 'dowload_path', 'cs_remote_path')
-    dep_info = dependency_manager.DependencyInfo(
-        'dep', 'platform', 'config_path', cloud_storage_info=cs_info)
-    self.assertEqual('dep', dep_info.dependency)
-    self.assertEqual('platform', dep_info.platform)
-    self.assertEqual(['config_path'], dep_info.config_paths)
-    self.assertFalse(dep_info.has_local_path_info)
-    self.assertTrue(dep_info.has_cloud_storage_info)
-
-
-  def testUpdateRequiredArgsConflicts(self):
-    lp_info = dependency_manager.LocalPathInfo(['path0', 'path2'])
-    dep_info1 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path1', local_path_info=lp_info)
-    dep_info2 = dependency_manager.DependencyInfo(
-        'dep1', 'platform2', 'config_path2', local_path_info=lp_info)
-    dep_info3 = dependency_manager.DependencyInfo(
-        'dep2', 'platform1', 'config_path3', local_path_info=lp_info)
-    self.assertRaises(ValueError, dep_info1.Update, dep_info2)
-    self.assertRaises(ValueError, dep_info1.Update, dep_info3)
-    self.assertRaises(ValueError, dep_info3.Update, dep_info2)
-
-  def testUpdateMinimumCloudStorageInfo(self):
-    dep_info1 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path1')
-
-    cs_info2 = dependency_manager.CloudStorageInfo(
-        cs_bucket='cs_bucket2', cs_hash='cs_hash2',
-        download_path='download_path2', cs_remote_path='cs_remote_path2')
-    dep_info2 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path2', cloud_storage_info=cs_info2)
-
-    dep_info3 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path3')
-
-    cs_info4 = dependency_manager.CloudStorageInfo(
-        cs_bucket='cs_bucket4', cs_hash='cs_hash4',
-        download_path='download_path4', cs_remote_path='cs_remote_path4')
-    dep_info4 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path4', cloud_storage_info=cs_info4)
-
-    self.assertEqual('dep1', dep_info1.dependency)
-    self.assertEqual('platform1', dep_info1.platform)
-    self.assertEqual(['config_path1'], dep_info1.config_paths)
-
-    dep_info1.Update(dep_info2)
-    self.assertFalse(dep_info1.has_local_path_info)
-    self.assertEqual('dep1', dep_info1.dependency)
-    self.assertEqual('platform1', dep_info1.platform)
-    self.assertEqual(['config_path1', 'config_path2'], dep_info1.config_paths)
-
-    cs_info = dep_info1._cloud_storage_info
-    self.assertEqual(cs_info, cs_info2)
-    self.assertEqual('cs_bucket2', cs_info._cs_bucket)
-    self.assertEqual('cs_hash2', cs_info._cs_hash)
-    self.assertEqual('download_path2', cs_info._download_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-
-    dep_info1.Update(dep_info3)
-    self.assertEqual('dep1', dep_info1.dependency)
-    self.assertEqual('platform1', dep_info1.platform)
-    self.assertEqual(['config_path1', 'config_path2', 'config_path3'],
-                     dep_info1.config_paths)
-    self.assertFalse(dep_info1.has_local_path_info)
-    cs_info = dep_info1._cloud_storage_info
-    self.assertEqual(cs_info, cs_info2)
-    self.assertEqual('cs_bucket2', cs_info._cs_bucket)
-    self.assertEqual('cs_hash2', cs_info._cs_hash)
-    self.assertEqual('download_path2', cs_info._download_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-
-    self.assertRaises(ValueError, dep_info1.Update, dep_info4)
-
-  def testUpdateMaxCloudStorageInfo(self):
-    dep_info1 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path1')
-
-    zip_info2 = dependency_manager.ArchiveInfo(
-        'archive_path2', 'unzip_path2', 'path_withing_archive2')
-    cs_info2 = dependency_manager.CloudStorageInfo(
-        'cs_bucket2', 'cs_hash2', 'download_path2', 'cs_remote_path2',
-        version_in_cs='2.1.1', archive_info=zip_info2)
-    dep_info2 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path2', cloud_storage_info=cs_info2)
-
-    dep_info3 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path3')
-
-    zip_info4 = dependency_manager.ArchiveInfo(
-        'archive_path4', 'unzip_path4', 'path_withing_archive4')
-    cs_info4 = dependency_manager.CloudStorageInfo(
-        'cs_bucket4', 'cs_hash4', 'download_path4', 'cs_remote_path4',
-        version_in_cs='4.2.1', archive_info=zip_info4)
-    dep_info4 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path4', cloud_storage_info=cs_info4)
-
-    self.assertEqual('dep1', dep_info1.dependency)
-    self.assertEqual('platform1', dep_info1.platform)
-    self.assertEqual(['config_path1'], dep_info1.config_paths)
-
-    dep_info1.Update(dep_info2)
-    self.assertFalse(dep_info1.has_local_path_info)
-    self.assertEqual('dep1', dep_info1.dependency)
-    self.assertEqual('platform1', dep_info1.platform)
-    self.assertEqual(['config_path1', 'config_path2'], dep_info1.config_paths)
-
-    cs_info = dep_info1._cloud_storage_info
-    self.assertEqual(cs_info, cs_info2)
-    self.assertEqual('cs_bucket2', cs_info._cs_bucket)
-    self.assertEqual('cs_hash2', cs_info._cs_hash)
-    self.assertEqual('download_path2', cs_info._download_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-
-    dep_info1.Update(dep_info3)
-    self.assertEqual('dep1', dep_info1.dependency)
-    self.assertEqual('platform1', dep_info1.platform)
-    self.assertEqual(['config_path1', 'config_path2', 'config_path3'],
-                     dep_info1.config_paths)
-    self.assertFalse(dep_info1.has_local_path_info)
-    cs_info = dep_info1._cloud_storage_info
-    self.assertEqual(cs_info, cs_info2)
-    self.assertEqual('cs_bucket2', cs_info._cs_bucket)
-    self.assertEqual('cs_hash2', cs_info._cs_hash)
-    self.assertEqual('download_path2', cs_info._download_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-
-    self.assertRaises(ValueError, dep_info1.Update, dep_info4)
-
-  def testUpdateAllInfo(self):
-    lp_info1 = dependency_manager.LocalPathInfo(['path1'])
-    dep_info1 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path1', local_path_info=lp_info1)
-    cs_info2 = dependency_manager.CloudStorageInfo(
-        cs_bucket='cs_bucket2', cs_hash='cs_hash2',
-        download_path='download_path2', cs_remote_path='cs_remote_path2')
-    lp_info2 = dependency_manager.LocalPathInfo(['path2'])
-    dep_info2 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path2', local_path_info=lp_info2,
-        cloud_storage_info=cs_info2)
-    lp_info3 = dependency_manager.LocalPathInfo(['path3'])
-    dep_info3 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path3', local_path_info=lp_info3)
-    lp_info4 = dependency_manager.LocalPathInfo(['path4'])
-    cs_info4 = dependency_manager.CloudStorageInfo(
-        cs_bucket='cs_bucket4', cs_hash='cs_hash4',
-        download_path='download_path4', cs_remote_path='cs_remote_path4')
-    dep_info4 = dependency_manager.DependencyInfo(
-        'dep1', 'platform1', 'config_path4', local_path_info=lp_info4,
-        cloud_storage_info=cs_info4)
-
-    self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path1'))
-    self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path2'))
-    self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path3'))
-    self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path4'))
-
-    dep_info1.Update(dep_info2)
-    cs_info = dep_info1._cloud_storage_info
-    self.assertEqual(cs_info, cs_info2)
-    self.assertEqual('cs_bucket2', cs_info._cs_bucket)
-    self.assertEqual('cs_hash2', cs_info._cs_hash)
-    self.assertEqual('download_path2', cs_info._download_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-    self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path1'))
-    self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path2'))
-    self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path3'))
-    self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path4'))
-
-    dep_info1.Update(dep_info3)
-    cs_info = dep_info1._cloud_storage_info
-    self.assertEqual(cs_info, cs_info2)
-    self.assertEqual('cs_bucket2', cs_info._cs_bucket)
-    self.assertEqual('cs_hash2', cs_info._cs_hash)
-    self.assertEqual('download_path2', cs_info._download_path)
-    self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
-    self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path1'))
-    self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path2'))
-    self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path3'))
-    self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path4'))
-
-    self.assertRaises(ValueError, dep_info1.Update, dep_info4)
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py
deleted file mode 100644
index 52a6d20..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py
+++ /dev/null
@@ -1,527 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=unused-argument
-
-import mock
-
-from pyfakefs import fake_filesystem_unittest
-from py_utils import cloud_storage
-
-import dependency_manager
-from dependency_manager import exceptions
-
-
-class DependencyManagerTest(fake_filesystem_unittest.TestCase):
-
-  def setUp(self):
-    self.lp_info012 = dependency_manager.LocalPathInfo(
-        ['path0', 'path1', 'path2'])
-    self.cloud_storage_info = dependency_manager.CloudStorageInfo(
-        'cs_bucket', 'cs_hash', 'download_path', 'cs_remote_path')
-
-    self.dep_info = dependency_manager.DependencyInfo(
-        'dep', 'platform', 'config_file', local_path_info=self.lp_info012,
-        cloud_storage_info=self.cloud_storage_info)
-    self.setUpPyfakefs()
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  # TODO(crbug.com/1111556): add a test that construct
-  # dependency_manager.DependencyManager from a list of DependencyInfo.
-  def testErrorInit(self):
-    with self.assertRaises(ValueError):
-      dependency_manager.DependencyManager(None)
-    with self.assertRaises(ValueError):
-      dependency_manager.DependencyManager('config_file?')
-
-  def testInitialUpdateDependencies(self):
-    dep_manager = dependency_manager.DependencyManager([])
-
-    # Empty BaseConfig.
-    dep_manager._lookup_dict = {}
-    base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
-    base_config_mock.IterDependencyInfo.return_value = iter([])
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertFalse(dep_manager._lookup_dict)
-
-    # One dependency/platform in a BaseConfig.
-    dep_manager._lookup_dict = {}
-    base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
-    dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep = 'dependency'
-    plat = 'platform'
-    dep_info.dependency = dep
-    dep_info.platform = plat
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
-    expected_lookup_dict = {dep: {plat: dep_info}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info.Update.called)
-
-    # One dependency multiple platforms in a BaseConfig.
-    dep_manager._lookup_dict = {}
-    base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
-    dep = 'dependency'
-    plat1 = 'platform1'
-    plat2 = 'platform2'
-    dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info1.dependency = dep
-    dep_info1.platform = plat1
-    dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info2.dependency = dep
-    dep_info2.platform = plat2
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info1,
-                                                             dep_info2])
-    expected_lookup_dict = {dep: {plat1: dep_info1,
-                                  plat2: dep_info2}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info1.Update.called)
-    self.assertFalse(dep_info2.Update.called)
-
-    # Multiple dependencies, multiple platforms in a BaseConfig.
-    dep_manager._lookup_dict = {}
-    base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
-    dep1 = 'dependency1'
-    dep2 = 'dependency2'
-    plat1 = 'platform1'
-    plat2 = 'platform2'
-    dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info1.dependency = dep1
-    dep_info1.platform = plat1
-    dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info2.dependency = dep1
-    dep_info2.platform = plat2
-    dep_info3 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info3.dependency = dep2
-    dep_info3.platform = plat2
-    base_config_mock.IterDependencyInfo.return_value = iter(
-        [dep_info1, dep_info2, dep_info3])
-    expected_lookup_dict = {dep1: {plat1: dep_info1,
-                                   plat2: dep_info2},
-                            dep2: {plat2: dep_info3}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info1.Update.called)
-    self.assertFalse(dep_info2.Update.called)
-    self.assertFalse(dep_info3.Update.called)
-
-  def testFollowupUpdateDependenciesNoOverlap(self):
-    dep_manager = dependency_manager.DependencyManager([])
-    dep = 'dependency'
-    dep1 = 'dependency1'
-    dep2 = 'dependency2'
-    dep3 = 'dependency3'
-    plat1 = 'platform1'
-    plat2 = 'platform2'
-    plat3 = 'platform3'
-    dep_info_a = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info_a.dependency = dep1
-    dep_info_a.platform = plat1
-    dep_info_b = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info_b.dependency = dep1
-    dep_info_b.platform = plat2
-    dep_info_c = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info_c.dependency = dep
-    dep_info_c.platform = plat1
-
-    start_lookup_dict = {dep: {plat1: dep_info_a,
-                               plat2: dep_info_b},
-                         dep1: {plat1: dep_info_c}}
-    base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
-
-    # Empty BaseConfig.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    base_config_mock.IterDependencyInfo.return_value = iter([])
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(start_lookup_dict, dep_manager._lookup_dict)
-
-    # One dependency/platform in a BaseConfig.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info.dependency = dep3
-    dep_info.platform = plat1
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
-    expected_lookup_dict = {dep: {plat1: dep_info_a,
-                                  plat2: dep_info_b},
-                            dep1: {plat1: dep_info_c},
-                            dep3: {plat3: dep_info}}
-
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertItemsEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info.Update.called)
-    self.assertFalse(dep_info_a.Update.called)
-    self.assertFalse(dep_info_b.Update.called)
-    self.assertFalse(dep_info_c.Update.called)
-
-    # One dependency multiple platforms in a BaseConfig.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info1.dependency = dep2
-    dep_info1.platform = plat1
-    dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info2.dependency = dep2
-    dep_info2.platform = plat2
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info1,
-                                                             dep_info2])
-    expected_lookup_dict = {dep: {plat1: dep_info_a,
-                                  plat2: dep_info_b},
-                            dep1: {plat1: dep_info_c},
-                            dep2: {plat1: dep_info1,
-                                   plat2: dep_info2}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info1.Update.called)
-    self.assertFalse(dep_info2.Update.called)
-    self.assertFalse(dep_info_a.Update.called)
-    self.assertFalse(dep_info_b.Update.called)
-    self.assertFalse(dep_info_c.Update.called)
-
-    # Multiple dependencies, multiple platforms in a BaseConfig.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep1 = 'dependency1'
-    plat1 = 'platform1'
-    plat2 = 'platform2'
-    dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info1.dependency = dep2
-    dep_info1.platform = plat1
-    dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info2.dependency = dep2
-    dep_info2.platform = plat2
-    dep_info3 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info3.dependency = dep3
-    dep_info3.platform = plat2
-    base_config_mock.IterDependencyInfo.return_value = iter(
-        [dep_info1, dep_info2, dep_info3])
-    expected_lookup_dict = {dep: {plat1: dep_info_a,
-                                  plat2: dep_info_b},
-                            dep1: {plat1: dep_info_c},
-                            dep2: {plat1: dep_info1,
-                                   plat2: dep_info2},
-                            dep3: {plat2: dep_info3}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info1.Update.called)
-    self.assertFalse(dep_info2.Update.called)
-    self.assertFalse(dep_info3.Update.called)
-    self.assertFalse(dep_info_a.Update.called)
-    self.assertFalse(dep_info_b.Update.called)
-    self.assertFalse(dep_info_c.Update.called)
-
-    # Ensure the testing data wasn't corrupted.
-    self.assertEqual(start_lookup_dict,
-                     {dep: {plat1: dep_info_a,
-                            plat2: dep_info_b},
-                      dep1: {plat1: dep_info_c}})
-
-  def testFollowupUpdateDependenciesWithCollisions(self):
-    dep_manager = dependency_manager.DependencyManager([])
-    dep = 'dependency'
-    dep1 = 'dependency1'
-    dep2 = 'dependency2'
-    plat1 = 'platform1'
-    plat2 = 'platform2'
-    dep_info_a = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info_a.dependency = dep1
-    dep_info_a.platform = plat1
-    dep_info_b = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info_b.dependency = dep1
-    dep_info_b.platform = plat2
-    dep_info_c = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info_c.dependency = dep
-    dep_info_c.platform = plat1
-
-    start_lookup_dict = {dep: {plat1: dep_info_a,
-                               plat2: dep_info_b},
-                         dep1: {plat1: dep_info_c}}
-    base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
-
-    # One dependency/platform.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info.dependency = dep
-    dep_info.platform = plat1
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
-    expected_lookup_dict = {dep: {plat1: dep_info_a,
-                                  plat2: dep_info_b},
-                            dep1: {plat1: dep_info_c}}
-
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertItemsEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    dep_info_a.Update.assert_called_once_with(dep_info)
-    self.assertFalse(dep_info.Update.called)
-    self.assertFalse(dep_info_b.Update.called)
-    self.assertFalse(dep_info_c.Update.called)
-    dep_info_a.reset_mock()
-    dep_info_b.reset_mock()
-    dep_info_c.reset_mock()
-
-    # One dependency multiple platforms in a BaseConfig.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info1.dependency = dep1
-    dep_info1.platform = plat1
-    dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info2.dependency = dep2
-    dep_info2.platform = plat2
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info1,
-                                                             dep_info2])
-    expected_lookup_dict = {dep: {plat1: dep_info_a,
-                                  plat2: dep_info_b},
-                            dep1: {plat1: dep_info_c},
-                            dep2: {plat2: dep_info2}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info1.Update.called)
-    self.assertFalse(dep_info2.Update.called)
-    self.assertFalse(dep_info_a.Update.called)
-    self.assertFalse(dep_info_b.Update.called)
-    dep_info_c.Update.assert_called_once_with(dep_info1)
-    dep_info_a.reset_mock()
-    dep_info_b.reset_mock()
-    dep_info_c.reset_mock()
-
-    # Multiple dependencies, multiple platforms in a BaseConfig.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep1 = 'dependency1'
-    plat1 = 'platform1'
-    plat2 = 'platform2'
-    dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info1.dependency = dep
-    dep_info1.platform = plat1
-    dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info2.dependency = dep1
-    dep_info2.platform = plat1
-    dep_info3 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info3.dependency = dep2
-    dep_info3.platform = plat2
-    base_config_mock.IterDependencyInfo.return_value = iter(
-        [dep_info1, dep_info2, dep_info3])
-    expected_lookup_dict = {dep: {plat1: dep_info_a,
-                                  plat2: dep_info_b},
-                            dep1: {plat1: dep_info_c},
-                            dep2: {plat2: dep_info3}}
-    dep_manager._UpdateDependencies(base_config_mock)
-    self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
-    self.assertFalse(dep_info1.Update.called)
-    self.assertFalse(dep_info2.Update.called)
-    self.assertFalse(dep_info3.Update.called)
-    self.assertFalse(dep_info_b.Update.called)
-    dep_info_a.Update.assert_called_once_with(dep_info1)
-    dep_info_c.Update.assert_called_once_with(dep_info2)
-
-    # Collision error.
-    dep_manager._lookup_dict = start_lookup_dict.copy()
-    dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
-    dep_info.dependency = dep
-    dep_info.platform = plat1
-    base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
-    dep_info_a.Update.side_effect = ValueError
-    self.assertRaises(ValueError,
-                      dep_manager._UpdateDependencies, base_config_mock)
-
-    # Ensure the testing data wasn't corrupted.
-    self.assertEqual(start_lookup_dict,
-                     {dep: {plat1: dep_info_a,
-                            plat2: dep_info_b},
-                      dep1: {plat1: dep_info_c}})
-
-  def testGetDependencyInfo(self):
-    dep_manager = dependency_manager.DependencyManager([])
-    self.assertFalse(dep_manager._lookup_dict)
-
-    # No dependencies in the dependency manager.
-    self.assertEqual(None, dep_manager._GetDependencyInfo('missing_dep',
-                                                          'missing_plat'))
-
-    dep_manager._lookup_dict = {'dep1': {'plat1': 'dep_info11',
-                                         'plat2': 'dep_info12',
-                                         'plat3': 'dep_info13'},
-                                'dep2': {'plat1': 'dep_info11',
-                                         'plat2': 'dep_info21',
-                                         'plat3': 'dep_info23',
-                                         'default': 'dep_info2d'},
-                                'dep3': {'plat1': 'dep_info31',
-                                         'plat2': 'dep_info32',
-                                         'default': 'dep_info3d'}}
-    # Dependency not in the dependency manager.
-    self.assertEqual(None, dep_manager._GetDependencyInfo(
-        'missing_dep', 'missing_plat'))
-    # Dependency in the dependency manager, but not the platform. No default.
-    self.assertEqual(None, dep_manager._GetDependencyInfo(
-        'dep1', 'missing_plat'))
-    # Dependency in the dependency manager, but not the platform, but a default
-    # exists.
-    self.assertEqual('dep_info2d', dep_manager._GetDependencyInfo(
-        'dep2', 'missing_plat'))
-    # Dependency and platform in the dependency manager. A default exists.
-    self.assertEqual('dep_info23', dep_manager._GetDependencyInfo(
-        'dep2', 'plat3'))
-    # Dependency and platform in the dependency manager. No default exists.
-    self.assertEqual('dep_info12', dep_manager._GetDependencyInfo(
-        'dep1', 'plat2'))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  @mock.patch(
-      'dependency_manager.dependency_info.DependencyInfo.GetRemotePath')  # pylint: disable=line-too-long
-  def testFetchPathUnititializedDependency(
-      self, cs_path_mock):
-    dep_manager = dependency_manager.DependencyManager([])
-    self.assertFalse(cs_path_mock.call_args)
-    cs_path = 'cs_path'
-    cs_path_mock.return_value = cs_path
-
-    # Empty lookup_dict
-    with self.assertRaises(exceptions.NoPathFoundError):
-      dep_manager.FetchPath('dep', 'plat_arch_x86')
-
-    # Non-empty lookup dict that doesn't contain the dependency we're looking
-    # for.
-    dep_manager._lookup_dict = {'dep1': mock.MagicMock(),
-                                'dep2': mock.MagicMock()}
-    with self.assertRaises(exceptions.NoPathFoundError):
-      dep_manager.FetchPath('dep', 'plat_arch_x86')
-
-  @mock.patch('os.path')
-  @mock.patch(
-      'dependency_manager.DependencyManager._GetDependencyInfo')
-  @mock.patch(
-      'dependency_manager.dependency_info.DependencyInfo.GetRemotePath')  # pylint: disable=line-too-long
-  def testFetchPathLocalFile(self, cs_path_mock, dep_info_mock, path_mock):
-    dep_manager = dependency_manager.DependencyManager([])
-    self.assertFalse(cs_path_mock.call_args)
-    cs_path = 'cs_path'
-    dep_info = self.dep_info
-    cs_path_mock.return_value = cs_path
-    # The DependencyInfo returned should be passed through to LocalPath.
-    dep_info_mock.return_value = dep_info
-
-    # Non-empty lookup dict that contains the dependency we're looking for.
-    # Local path exists.
-    dep_manager._lookup_dict = {'dep': {'platform' : self.dep_info},
-                                'dep2': mock.MagicMock()}
-    self.fs.CreateFile('path1')
-    found_path = dep_manager.FetchPath('dep', 'platform')
-
-    self.assertEqual('path1', found_path)
-    self.assertFalse(cs_path_mock.call_args)
-
-
-  @mock.patch(
-      'dependency_manager.dependency_info.DependencyInfo.GetRemotePath')  # pylint: disable=line-too-long
-  def testFetchPathRemoteFile(
-      self, cs_path_mock):
-    dep_manager = dependency_manager.DependencyManager([])
-    self.assertFalse(cs_path_mock.call_args)
-    cs_path = 'cs_path'
-    def FakeCSPath():
-      self.fs.CreateFile(cs_path)
-      return cs_path
-    cs_path_mock.side_effect = FakeCSPath
-
-    # Non-empty lookup dict that contains the dependency we're looking for.
-    # Local path doesn't exist, but cloud_storage_path is downloaded.
-    dep_manager._lookup_dict = {'dep': {'platform' : self.dep_info,
-                                        'plat1': mock.MagicMock()},
-                                'dep2': {'plat2': mock.MagicMock()}}
-    found_path = dep_manager.FetchPath('dep', 'platform')
-    self.assertEqual(cs_path, found_path)
-
-
-  @mock.patch(
-      'dependency_manager.dependency_info.DependencyInfo.GetRemotePath')  # pylint: disable=line-too-long
-  def testFetchPathError(
-      self, cs_path_mock):
-    dep_manager = dependency_manager.DependencyManager([])
-    self.assertFalse(cs_path_mock.call_args)
-    cs_path_mock.return_value = None
-    dep_manager._lookup_dict = {'dep': {'platform' : self.dep_info,
-                                        'plat1': mock.MagicMock()},
-                                'dep2': {'plat2': mock.MagicMock()}}
-    # Non-empty lookup dict that contains the dependency we're looking for.
-    # Local path doesn't exist, and cloud_storage path wasn't successfully
-    # found.
-    self.assertRaises(exceptions.NoPathFoundError,
-                      dep_manager.FetchPath, 'dep', 'platform')
-
-    cs_path_mock.side_effect = cloud_storage.CredentialsError
-    self.assertRaises(cloud_storage.CredentialsError,
-                      dep_manager.FetchPath, 'dep', 'platform')
-
-    cs_path_mock.side_effect = cloud_storage.CloudStorageError
-    self.assertRaises(cloud_storage.CloudStorageError,
-                      dep_manager.FetchPath, 'dep', 'platform')
-
-    cs_path_mock.side_effect = cloud_storage.PermissionError
-    self.assertRaises(cloud_storage.PermissionError,
-                      dep_manager.FetchPath, 'dep', 'platform')
-
-  def testLocalPath(self):
-    dep_manager = dependency_manager.DependencyManager([])
-    # Empty lookup_dict
-    with self.assertRaises(exceptions.NoPathFoundError):
-      dep_manager.LocalPath('dep', 'plat')
-
-  def testLocalPathNoDependency(self):
-    # Non-empty lookup dict that doesn't contain the dependency we're looking
-    # for.
-    dep_manager = dependency_manager.DependencyManager([])
-    dep_manager._lookup_dict = {'dep1': mock.MagicMock(),
-                                'dep2': mock.MagicMock()}
-    with self.assertRaises(exceptions.NoPathFoundError):
-      dep_manager.LocalPath('dep', 'plat')
-
-  def testLocalPathExists(self):
-    # Non-empty lookup dict that contains the dependency we're looking for.
-    # Local path exists.
-    dep_manager = dependency_manager.DependencyManager([])
-    dep_manager._lookup_dict = {'dependency' : {'platform': self.dep_info},
-                                'dep1': mock.MagicMock(),
-                                'dep2': mock.MagicMock()}
-    self.fs.CreateFile('path1')
-    found_path = dep_manager.LocalPath('dependency', 'platform')
-
-    self.assertEqual('path1', found_path)
-
-  def testLocalPathMissingPaths(self):
-    # Non-empty lookup dict that contains the dependency we're looking for.
-    # Local path is found but doesn't exist.
-    dep_manager = dependency_manager.DependencyManager([])
-    dep_manager._lookup_dict = {'dependency' : {'platform': self.dep_info},
-                                'dep1': mock.MagicMock(),
-                                'dep2': mock.MagicMock()}
-    self.assertRaises(exceptions.NoPathFoundError,
-                      dep_manager.LocalPath, 'dependency', 'platform')
-
-  def testLocalPathNoPaths(self):
-    # Non-empty lookup dict that contains the dependency we're looking for.
-    # Local path isn't found.
-    dep_manager = dependency_manager.DependencyManager([])
-    dep_info = dependency_manager.DependencyInfo(
-        'dep', 'platform', 'config_file',
-        cloud_storage_info=self.cloud_storage_info)
-    dep_manager._lookup_dict = {'dependency' : {'platform': dep_info},
-                                'dep1': mock.MagicMock(),
-                                'dep2': mock.MagicMock()}
-    self.assertRaises(exceptions.NoPathFoundError,
-                      dep_manager.LocalPath, 'dependency', 'platform')
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py b/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py
deleted file mode 100644
index a8e21b8..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import shutil
-import stat
-import subprocess
-import sys
-import zipfile
-
-import six
-
-from dependency_manager import exceptions
-
-
-def _WinReadOnlyHandler(func, path, execinfo):
-  if not os.access(path, os.W_OK):
-    os.chmod(path, stat.S_IWRITE)
-    func(path)
-  else:
-    six.reraise(*execinfo)
-
-
-def RemoveDir(dir_path):
-  assert os.path.isabs(dir_path)
-  if sys.platform.startswith('win'):
-    dir_path = u'\\\\?\\' + dir_path
-  if os.path.isdir(dir_path):
-    shutil.rmtree(dir_path, onerror=_WinReadOnlyHandler)
-
-
-def VerifySafeArchive(archive):
-  def ResolvePath(path_name):
-    return os.path.realpath(os.path.abspath(path_name))
-  # Must add pathsep to avoid false positives.
-  # Ex: /tmp/abc/bad_file.py starts with /tmp/a but not /tmp/a/
-  base_path = ResolvePath(os.getcwd()) + os.path.sep
-  for member in archive.namelist():
-    if not ResolvePath(os.path.join(base_path, member)).startswith(base_path):
-      raise exceptions.ArchiveError(
-          'Archive %s contains a bad member: %s.' % (archive.filename, member))
-
-
-def GetModeFromPath(file_path):
-  return stat.S_IMODE(os.stat(file_path).st_mode)
-
-
-def GetModeFromZipInfo(zip_info):
-  return zip_info.external_attr >> 16
-
-
-def SetUnzippedDirPermissions(archive, unzipped_dir):
-  """Set the file permissions in an unzipped archive.
-
-     Designed to be called right after extractall() was called on |archive|.
-     Noop on Win. Otherwise sets the executable bit on files where needed.
-
-     Args:
-         archive: A zipfile.ZipFile object opened for reading.
-         unzipped_dir: A path to a directory containing the unzipped contents
-             of |archive|.
-  """
-  if sys.platform.startswith('win'):
-    # Windows doesn't have an executable bit, so don't mess with the ACLs.
-    return
-  for zip_info in archive.infolist():
-    archive_acls = GetModeFromZipInfo(zip_info)
-    if archive_acls & stat.S_IXUSR:
-      # Only preserve owner execurable permissions.
-      unzipped_path = os.path.abspath(
-          os.path.join(unzipped_dir, zip_info.filename))
-      mode = GetModeFromPath(unzipped_path)
-      os.chmod(unzipped_path, mode | stat.S_IXUSR)
-
-
-def UnzipArchive(archive_path, unzip_path):
-  """Unzips a file if it is a zip file.
-
-  Args:
-      archive_path: The downloaded file to unzip.
-      unzip_path: The destination directory to unzip to.
-
-  Raises:
-      ValueError: If |archive_path| is not a zipfile.
-  """
-  # TODO(aiolos): Add tests once the refactor is completed. crbug.com/551158
-  if not (archive_path and zipfile.is_zipfile(archive_path)):
-    raise ValueError(
-        'Attempting to unzip a non-archive file at %s' % archive_path)
-  if not os.path.exists(unzip_path):
-    os.makedirs(unzip_path)
-  # The Python ZipFile does not support symbolic links, which makes it
-  # unsuitable for Mac builds. so use ditto instead. crbug.com/700097.
-  if sys.platform.startswith('darwin'):
-    assert os.path.isabs(unzip_path)
-    unzip_cmd = ['ditto', '-x', '-k', archive_path, unzip_path]
-    proc = subprocess.Popen(unzip_cmd, bufsize=0, stdout=subprocess.PIPE,
-                            stderr=subprocess.PIPE)
-    proc.communicate()
-    return
-  try:
-    with zipfile.ZipFile(archive_path, 'r') as archive:
-      VerifySafeArchive(archive)
-      assert os.path.isabs(unzip_path)
-      unzip_path_without_prefix = unzip_path
-      if sys.platform.startswith('win'):
-        unzip_path = u'\\\\?\\' + unzip_path
-      archive.extractall(path=unzip_path)
-      SetUnzippedDirPermissions(archive, unzip_path)
-  except:
-    # Hack necessary because isdir doesn't work with escaped paths on Windows.
-    if unzip_path_without_prefix and os.path.isdir(unzip_path_without_prefix):
-      RemoveDir(unzip_path_without_prefix)
-    raise
diff --git a/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py
deleted file mode 100644
index bd17025..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py
+++ /dev/null
@@ -1,196 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import shutil
-import stat
-import sys
-import tempfile
-import unittest
-import uuid
-import zipfile
-
-import mock
-
-from dependency_manager import dependency_manager_util
-from dependency_manager import exceptions
-
-
-class DependencyManagerUtilTest(unittest.TestCase):
-  # This class intentionally uses actual file I/O to test real system behavior.
-
-  def setUp(self):
-    self.tmp_dir = os.path.abspath(tempfile.mkdtemp(prefix='telemetry'))
-    self.sub_dir = os.path.join(self.tmp_dir, 'sub_dir')
-    os.mkdir(self.sub_dir)
-
-    self.read_only_path = (os.path.join(self.tmp_dir, 'read_only'))
-    with open(self.read_only_path, 'w+') as read_file:
-      read_file.write('Read-only file')
-    os.chmod(self.read_only_path, stat.S_IRUSR)
-
-    self.writable_path = (os.path.join(self.tmp_dir, 'writable'))
-    with open(self.writable_path, 'w+') as writable_file:
-      writable_file.write('Writable file')
-    os.chmod(self.writable_path, stat.S_IRUSR | stat.S_IWUSR)
-
-    self.executable_path = (os.path.join(self.tmp_dir, 'executable'))
-    with open(self.executable_path, 'w+') as executable_file:
-      executable_file.write('Executable file')
-    os.chmod(self.executable_path, stat.S_IRWXU)
-
-    self.sub_read_only_path = (os.path.join(self.sub_dir, 'read_only'))
-    with open(self.sub_read_only_path, 'w+') as read_file:
-      read_file.write('Read-only sub file')
-    os.chmod(self.sub_read_only_path, stat.S_IRUSR)
-
-    self.sub_writable_path = (os.path.join(self.sub_dir, 'writable'))
-    with open(self.sub_writable_path, 'w+') as writable_file:
-      writable_file.write('Writable sub file')
-    os.chmod(self.sub_writable_path, stat.S_IRUSR | stat.S_IWUSR)
-
-    self.sub_executable_path = (os.path.join(self.sub_dir, 'executable'))
-    with open(self.sub_executable_path, 'w+') as executable_file:
-      executable_file.write('Executable sub file')
-    os.chmod(self.sub_executable_path, stat.S_IRWXU)
-
-    self.AssertExpectedDirFiles(self.tmp_dir)
-    self.archive_path = self.CreateZipArchiveFromDir(self.tmp_dir)
-
-  def tearDown(self):
-    if os.path.isdir(self.tmp_dir):
-      dependency_manager_util.RemoveDir(self.tmp_dir)
-    if os.path.isfile(self.archive_path):
-      os.remove(self.archive_path)
-
-  def AssertExpectedDirFiles(self, top_dir):
-    sub_dir = os.path.join(top_dir, 'sub_dir')
-    read_only_path = (os.path.join(top_dir, 'read_only'))
-    writable_path = (os.path.join(top_dir, 'writable'))
-    executable_path = (os.path.join(top_dir, 'executable'))
-    sub_read_only_path = (os.path.join(sub_dir, 'read_only'))
-    sub_writable_path = (os.path.join(sub_dir, 'writable'))
-    sub_executable_path = (os.path.join(sub_dir, 'executable'))
-    # assert contents as expected
-    self.assertTrue(os.path.isdir(top_dir))
-    self.assertTrue(os.path.isdir(sub_dir))
-    self.assertTrue(os.path.isfile(read_only_path))
-    self.assertTrue(os.path.isfile(writable_path))
-    self.assertTrue(os.path.isfile(executable_path))
-    self.assertTrue(os.path.isfile(sub_read_only_path))
-    self.assertTrue(os.path.isfile(sub_writable_path))
-    self.assertTrue(os.path.isfile(sub_executable_path))
-
-    # assert permissions as expected
-    self.assertTrue(
-        stat.S_IRUSR & stat.S_IMODE(os.stat(read_only_path).st_mode))
-    self.assertTrue(
-        stat.S_IRUSR & stat.S_IMODE(os.stat(sub_read_only_path).st_mode))
-    self.assertTrue(
-        stat.S_IRUSR & stat.S_IMODE(os.stat(writable_path).st_mode))
-    self.assertTrue(
-        stat.S_IWUSR & stat.S_IMODE(os.stat(writable_path).st_mode))
-    self.assertTrue(
-        stat.S_IRUSR & stat.S_IMODE(os.stat(sub_writable_path).st_mode))
-    self.assertTrue(
-        stat.S_IWUSR & stat.S_IMODE(os.stat(sub_writable_path).st_mode))
-    if not sys.platform.startswith('win'):
-      self.assertEqual(
-          stat.S_IRWXU,
-          stat.S_IRWXU & stat.S_IMODE(os.stat(executable_path).st_mode))
-      self.assertEqual(
-          stat.S_IRWXU,
-          stat.S_IRWXU & stat.S_IMODE(os.stat(sub_executable_path).st_mode))
-
-  def CreateZipArchiveFromDir(self, dir_path):
-    try:
-      base_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
-      archive_path = shutil.make_archive(base_path, 'zip', dir_path)
-      self.assertTrue(os.path.exists(archive_path))
-      self.assertTrue(zipfile.is_zipfile(archive_path))
-    except:
-      if os.path.isfile(archive_path):
-        os.remove(archive_path)
-      raise
-    return archive_path
-
-  def testRemoveDirWithSubDir(self):
-    dependency_manager_util.RemoveDir(self.tmp_dir)
-
-    self.assertFalse(os.path.exists(self.tmp_dir))
-    self.assertFalse(os.path.exists(self.sub_dir))
-    self.assertFalse(os.path.exists(self.read_only_path))
-    self.assertFalse(os.path.exists(self.writable_path))
-    self.assertFalse(os.path.isfile(self.executable_path))
-    self.assertFalse(os.path.exists(self.sub_read_only_path))
-    self.assertFalse(os.path.exists(self.sub_writable_path))
-    self.assertFalse(os.path.isfile(self.sub_executable_path))
-
-  def testUnzipFile(self):
-    self.AssertExpectedDirFiles(self.tmp_dir)
-    unzip_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
-    dependency_manager_util.UnzipArchive(self.archive_path, unzip_path)
-    self.AssertExpectedDirFiles(unzip_path)
-    self.AssertExpectedDirFiles(self.tmp_dir)
-    dependency_manager_util.RemoveDir(unzip_path)
-
-  def testUnzipFileContainingLongPath(self):
-    try:
-      dir_path = self.tmp_dir
-      if sys.platform.startswith('win'):
-        dir_path = u'\\\\?\\' + dir_path
-
-      archive_suffix = ''
-      # 260 is the Windows API path length limit.
-      while len(archive_suffix) < 260:
-        archive_suffix = os.path.join(archive_suffix, 'really')
-      contents_dir_path = os.path.join(dir_path, archive_suffix)
-      os.makedirs(contents_dir_path)
-      filename = os.path.join(contents_dir_path, 'longpath.txt')
-      open(filename, 'a').close()
-
-      base_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
-      archive_path = shutil.make_archive(base_path, 'zip', dir_path)
-      self.assertTrue(os.path.exists(archive_path))
-      self.assertTrue(zipfile.is_zipfile(archive_path))
-    except:
-      if os.path.isfile(archive_path):
-        os.remove(archive_path)
-      raise
-
-    unzip_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
-    dependency_manager_util.UnzipArchive(archive_path, unzip_path)
-    dependency_manager_util.RemoveDir(unzip_path)
-
-  def testUnzipFileFailure(self):
-    # zipfile is not used on MacOS. See crbug.com/700097.
-    if sys.platform.startswith('darwin'):
-      return
-    unzip_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
-    self.assertFalse(os.path.exists(unzip_path))
-    with mock.patch(
-        'dependency_manager.dependency_manager_util.zipfile.ZipFile.extractall'  # pylint: disable=line-too-long
-        ) as zipfile_mock:
-      zipfile_mock.side_effect = IOError
-      self.assertRaises(
-          IOError, dependency_manager_util.UnzipArchive, self.archive_path,
-          unzip_path)
-    self.AssertExpectedDirFiles(self.tmp_dir)
-    self.assertFalse(os.path.exists(unzip_path))
-
-  def testVerifySafeArchivePasses(self):
-    with zipfile.ZipFile(self.archive_path) as archive:
-      dependency_manager_util.VerifySafeArchive(archive)
-
-  def testVerifySafeArchiveFailsOnRelativePathWithPardir(self):
-    tmp_file = tempfile.NamedTemporaryFile(delete=False)
-    tmp_file_name = tmp_file.name
-    tmp_file.write('Bad file!')
-    tmp_file.close()
-    with zipfile.ZipFile(self.archive_path, 'w') as archive:
-      archive.write(tmp_file_name, '../../foo')
-      self.assertRaises(
-          exceptions.ArchiveError, dependency_manager_util.VerifySafeArchive,
-          archive)
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/exceptions.py b/systrace/catapult/dependency_manager/dependency_manager/exceptions.py
deleted file mode 100644
index d7863db..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/exceptions.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from py_utils import cloud_storage
-
-
-CloudStorageError = cloud_storage.CloudStorageError
-
-
-class UnsupportedConfigFormatError(ValueError):
-  def __init__(self, config_type, config_file):
-    if not config_type:
-      message = ('The json file at %s is unsupported by the dependency_manager '
-                 'due to no specified config type' % config_file)
-    else:
-      message = ('The json file at %s has config type %s, which is unsupported '
-                 'by the dependency manager.' % (config_file, config_type))
-    super(UnsupportedConfigFormatError, self).__init__(message)
-
-
-class EmptyConfigError(ValueError):
-  def __init__(self, file_path):
-    super(EmptyConfigError, self).__init__('Empty config at %s.' % file_path)
-
-
-class FileNotFoundError(Exception):
-  def __init__(self, file_path):
-    super(FileNotFoundError, self).__init__('No file found at %s' % file_path)
-
-
-class NoPathFoundError(Exception):
-  def __init__(self, dependency, platform):
-    super(NoPathFoundError, self).__init__(
-        'No file could be found locally, and no file to download from cloud '
-        'storage for %s on platform %s' % (dependency, platform))
-
-
-class ReadWriteError(Exception):
-  pass
-
-
-class CloudStorageUploadConflictError(CloudStorageError):
-  def __init__(self, bucket, path):
-    super(CloudStorageUploadConflictError, self).__init__(
-        'File location %s already exists in bucket %s' % (path, bucket))
-
-
-class ArchiveError(Exception):
-  def __init__(self, msg):
-    super(ArchiveError, self).__init__(msg)
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py b/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py
deleted file mode 100644
index 5600966..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-import six
-
-class LocalPathInfo(object):
-
-  def __init__(self, path_priority_groups):
-    """Container for a set of local file paths where a given dependency
-    can be stored.
-
-    Organized as a list of groups, where each group is itself a file path list.
-    See GetLocalPath() to understand how they are used.
-
-    Args:
-      path_priority_groups: Can be either None, or a list of file path
-        strings (corresponding to a list of groups, where each group has
-        a single file path), or a list of a list of file path strings
-        (i.e. a list of groups).
-    """
-    self._path_priority_groups = self._ParseLocalPaths(path_priority_groups)
-
-  def GetLocalPath(self):
-    """Look for a local file, and return its path.
-
-    Looks for the first group which has at least one existing file path. Then
-    returns the most-recent of these files.
-
-    Returns:
-      Local file path, if found, or None otherwise.
-    """
-    for priority_group in self._path_priority_groups:
-      priority_group = [g for g in priority_group if os.path.exists(g)]
-      if not priority_group:
-        continue
-      return max(priority_group, key=lambda path: os.stat(path).st_mtime)
-    return None
-
-  def IsPathInLocalPaths(self, path):
-    """Returns true if |path| is in one of this instance's file path lists."""
-    return any(
-        path in priority_group for priority_group in self._path_priority_groups)
-
-  def Update(self, local_path_info):
-    """Update this object from the content of another LocalPathInfo instance.
-
-    Any file path from |local_path_info| that is not already contained in the
-    current instance will be added into new groups to it.
-
-    Args:
-      local_path_info: Another LocalPathInfo instance, or None.
-    """
-    if not local_path_info:
-      return
-    for priority_group in local_path_info._path_priority_groups:
-      group_list = []
-      for path in priority_group:
-        if not self.IsPathInLocalPaths(path):
-          group_list.append(path)
-      if group_list:
-        self._path_priority_groups.append(group_list)
-
-  @staticmethod
-  def _ParseLocalPaths(local_paths):
-    if not local_paths:
-      return []
-    return [[e] if isinstance(e, six.string_types) else e for e in local_paths]
diff --git a/systrace/catapult/dependency_manager/dependency_manager/local_path_info_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/local_path_info_unittest.py
deleted file mode 100644
index 83921fa..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/local_path_info_unittest.py
+++ /dev/null
@@ -1,136 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-from pyfakefs import fake_filesystem_unittest
-
-import dependency_manager
-
-def _CreateFile(path):
-  """Create file at specific |path|, with specific |content|."""
-  with open(path, 'wb') as f:
-    f.write('x')
-
-
-def _ChangeFileTime(path, time0, days):
-  new_time = time0 + (days * 24 * 60 * 60)
-  os.utime(path, (new_time, new_time))
-
-
-class LocalPathInfoTest(fake_filesystem_unittest.TestCase):
-
-  def setUp(self):
-    self.setUpPyfakefs()
-
-  def tearDown(self):
-    self.tearDownPyfakefs()
-
-  def testEmptyInstance(self):
-    path_info = dependency_manager.LocalPathInfo(None)
-    self.assertIsNone(path_info.GetLocalPath())
-    self.assertFalse(path_info.IsPathInLocalPaths('file.txt'))
-
-  def testSimpleGroupWithOnePath(self):
-    path_info = dependency_manager.LocalPathInfo(['file.txt'])
-    self.assertTrue(path_info.IsPathInLocalPaths('file.txt'))
-    self.assertFalse(path_info.IsPathInLocalPaths('other.txt'))
-
-    # GetLocalPath returns None if the file doesn't exist.
-    # Otherwise it will return the file path.
-    self.assertIsNone(path_info.GetLocalPath())
-    _CreateFile('file.txt')
-    self.assertEqual('file.txt', path_info.GetLocalPath())
-
-  def testSimpleGroupsWithMultiplePaths(self):
-    path_info = dependency_manager.LocalPathInfo(
-        [['file1', 'file2', 'file3']])
-    self.assertTrue(path_info.IsPathInLocalPaths('file1'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file2'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file3'))
-
-    _CreateFile('file1')
-    _CreateFile('file2')
-    _CreateFile('file3')
-    s = os.stat('file1')
-    time0 = s.st_mtime
-
-    _ChangeFileTime('file1', time0, 4)
-    _ChangeFileTime('file2', time0, 2)
-    _ChangeFileTime('file3', time0, 0)
-    self.assertEqual('file1', path_info.GetLocalPath())
-
-    _ChangeFileTime('file1', time0, 0)
-    _ChangeFileTime('file2', time0, 4)
-    _ChangeFileTime('file3', time0, 2)
-    self.assertEqual('file2', path_info.GetLocalPath())
-
-    _ChangeFileTime('file1', time0, 2)
-    _ChangeFileTime('file2', time0, 0)
-    _ChangeFileTime('file3', time0, 4)
-    self.assertEqual('file3', path_info.GetLocalPath())
-
-  def testMultipleGroupsWithSinglePaths(self):
-    path_info = dependency_manager.LocalPathInfo(
-        ['file1', 'file2', 'file3'])
-    self.assertTrue(path_info.IsPathInLocalPaths('file1'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file2'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file3'))
-
-    self.assertIsNone(path_info.GetLocalPath())
-    _CreateFile('file3')
-    self.assertEqual('file3', path_info.GetLocalPath())
-    _CreateFile('file2')
-    self.assertEqual('file2', path_info.GetLocalPath())
-    _CreateFile('file1')
-    self.assertEqual('file1', path_info.GetLocalPath())
-
-  def testMultipleGroupsWithMultiplePaths(self):
-    path_info = dependency_manager.LocalPathInfo([
-        ['file1', 'file2'],
-        ['file3', 'file4']])
-    self.assertTrue(path_info.IsPathInLocalPaths('file1'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file2'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file3'))
-    self.assertTrue(path_info.IsPathInLocalPaths('file4'))
-
-    _CreateFile('file1')
-    _CreateFile('file3')
-    s = os.stat('file1')
-    time0 = s.st_mtime
-
-    # Check that file1 is always returned, even if it is not the most recent
-    # file, because it is part of the first group and exists.
-    _ChangeFileTime('file1', time0, 2)
-    _ChangeFileTime('file3', time0, 0)
-    self.assertEqual('file1', path_info.GetLocalPath())
-
-    _ChangeFileTime('file1', time0, 0)
-    _ChangeFileTime('file3', time0, 2)
-    self.assertEqual('file1', path_info.GetLocalPath())
-
-  def testUpdate(self):
-    path_info1 = dependency_manager.LocalPathInfo(
-        [['file1', 'file2']])  # One group with two files.
-    path_info2 = dependency_manager.LocalPathInfo(
-        ['file1', 'file2', 'file3'])  # Three groups
-    self.assertTrue(path_info1.IsPathInLocalPaths('file1'))
-    self.assertTrue(path_info1.IsPathInLocalPaths('file2'))
-    self.assertFalse(path_info1.IsPathInLocalPaths('file3'))
-
-    _CreateFile('file3')
-    self.assertIsNone(path_info1.GetLocalPath())
-
-    path_info1.Update(path_info2)
-    self.assertTrue(path_info1.IsPathInLocalPaths('file1'))
-    self.assertTrue(path_info1.IsPathInLocalPaths('file2'))
-    self.assertTrue(path_info1.IsPathInLocalPaths('file3'))
-    self.assertEqual('file3', path_info1.GetLocalPath())
-
-    _CreateFile('file1')
-    time0 = os.stat('file1').st_mtime
-    _ChangeFileTime('file3', time0, 2)  # Make file3 more recent.
-
-    # Check that file3 is in a later group.
-    self.assertEqual('file1', path_info1.GetLocalPath())
diff --git a/systrace/catapult/dependency_manager/dependency_manager/manager.py b/systrace/catapult/dependency_manager/dependency_manager/manager.py
deleted file mode 100644
index 28fc532..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/manager.py
+++ /dev/null
@@ -1,246 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-
-from dependency_manager import base_config
-from dependency_manager import exceptions
-
-
-DEFAULT_TYPE = 'default'
-
-
-class DependencyManager(object):
-  def __init__(self, configs, supported_config_types=None):
-    """Manages file dependencies found locally or in cloud_storage.
-
-    Args:
-        configs: A list of instances of BaseConfig or it's subclasses, passed
-            in decreasing order of precedence.
-        supported_config_types: A list of whitelisted config_types.
-            No restrictions if None is specified.
-
-    Raises:
-        ValueError: If |configs| is not a list of instances of BaseConfig or
-            its subclasses.
-        UnsupportedConfigFormatError: If supported_config_types is specified and
-            configs contains a config not in the supported config_types.
-
-    Example: DependencyManager([config1, config2, config3])
-        No requirements on the type of Config, and any dependencies that have
-        local files for the same platform will first look in those from
-        config1, then those from config2, and finally those from config3.
-    """
-    if configs is None or not isinstance(configs, list):
-      raise ValueError(
-          'Must supply a list of config files to DependencyManager')
-    # self._lookup_dict is a dictionary with the following format:
-    # { dependency1: {platform1: dependency_info1,
-    #                 platform2: dependency_info2}
-    #   dependency2: {platform1: dependency_info3,
-    #                  ...}
-    #   ...}
-    #
-    # Where the dependencies and platforms are strings, and the
-    # dependency_info's are DependencyInfo instances.
-    self._lookup_dict = {}
-    self.supported_configs = supported_config_types or []
-    for config in configs:
-      self._UpdateDependencies(config)
-
-
-  def FetchPathWithVersion(self, dependency, platform):
-    """Get a path to an executable for |dependency|, downloading as needed.
-
-    A path to a default executable may be returned if a platform specific
-    version is not specified in the config(s).
-
-    Args:
-        dependency: Name of the desired dependency, as given in the config(s)
-            used in this DependencyManager.
-        platform: Name of the platform the dependency will run on. Often of the
-            form 'os_architecture'. Must match those specified in the config(s)
-            used in this DependencyManager.
-    Returns:
-        <path>, <version> where:
-            <path> is the path to an executable of |dependency| that will run
-            on |platform|, downloading from cloud storage if needed.
-            <version> is the version of the executable at <path> or None.
-
-    Raises:
-        NoPathFoundError: If a local copy of the executable cannot be found and
-            a remote path could not be downloaded from cloud_storage.
-        CredentialsError: If cloud_storage credentials aren't configured.
-        PermissionError: If cloud_storage credentials are configured, but not
-            with an account that has permission to download the remote file.
-        NotFoundError: If the remote file does not exist where expected in
-            cloud_storage.
-        ServerError: If an internal server error is hit while downloading the
-            remote file.
-        CloudStorageError: If another error occured while downloading the remote
-            path.
-        FileNotFoundError: If an attempted download was otherwise unsuccessful.
-
-    """
-    dependency_info = self._GetDependencyInfo(dependency, platform)
-    if not dependency_info:
-      raise exceptions.NoPathFoundError(dependency, platform)
-    path = dependency_info.GetLocalPath()
-    version = None
-    if not path or not os.path.exists(path):
-      path = dependency_info.GetRemotePath()
-      if not path or not os.path.exists(path):
-        raise exceptions.NoPathFoundError(dependency, platform)
-      version = dependency_info.GetRemotePathVersion()
-    return path, version
-
-  def FetchPath(self, dependency, platform):
-    """Get a path to an executable for |dependency|, downloading as needed.
-
-    A path to a default executable may be returned if a platform specific
-    version is not specified in the config(s).
-
-    Args:
-        dependency: Name of the desired dependency, as given in the config(s)
-            used in this DependencyManager.
-        platform: Name of the platform the dependency will run on. Often of the
-            form 'os_architecture'. Must match those specified in the config(s)
-            used in this DependencyManager.
-    Returns:
-        A path to an executable of |dependency| that will run on |platform|,
-        downloading from cloud storage if needed.
-
-    Raises:
-        NoPathFoundError: If a local copy of the executable cannot be found and
-            a remote path could not be downloaded from cloud_storage.
-        CredentialsError: If cloud_storage credentials aren't configured.
-        PermissionError: If cloud_storage credentials are configured, but not
-            with an account that has permission to download the remote file.
-        NotFoundError: If the remote file does not exist where expected in
-            cloud_storage.
-        ServerError: If an internal server error is hit while downloading the
-            remote file.
-        CloudStorageError: If another error occured while downloading the remote
-            path.
-        FileNotFoundError: If an attempted download was otherwise unsuccessful.
-
-    """
-    path, _ = self.FetchPathWithVersion(dependency, platform)
-    return path
-
-  def LocalPath(self, dependency, platform):
-    """Get a path to a locally stored executable for |dependency|.
-
-    A path to a default executable may be returned if a platform specific
-    version is not specified in the config(s).
-    Will not download the executable.
-
-    Args:
-        dependency: Name of the desired dependency, as given in the config(s)
-            used in this DependencyManager.
-        platform: Name of the platform the dependency will run on. Often of the
-            form 'os_architecture'. Must match those specified in the config(s)
-            used in this DependencyManager.
-    Returns:
-        A path to an executable for |dependency| that will run on |platform|.
-
-    Raises:
-        NoPathFoundError: If a local copy of the executable cannot be found.
-    """
-    dependency_info = self._GetDependencyInfo(dependency, platform)
-    if not dependency_info:
-      raise exceptions.NoPathFoundError(dependency, platform)
-    local_path = dependency_info.GetLocalPath()
-    if not local_path or not os.path.exists(local_path):
-      raise exceptions.NoPathFoundError(dependency, platform)
-    return local_path
-
-  def PrefetchPaths(self, platform, dependencies=None, cloud_storage_retries=3):
-    if not dependencies:
-      dependencies = self._lookup_dict.keys()
-
-    skipped_deps = []
-    found_deps = []
-    missing_deps = []
-    for dependency in dependencies:
-      dependency_info = self._GetDependencyInfo(dependency, platform)
-      if not dependency_info:
-        # The dependency is only configured for other platforms.
-        skipped_deps.append(dependency)
-        continue
-      local_path = dependency_info.GetLocalPath()
-      if local_path:
-        found_deps.append(dependency)
-        continue
-      fetched_path = None
-      cloud_storage_error = None
-      for _ in range(0, cloud_storage_retries + 1):
-        try:
-          fetched_path = dependency_info.GetRemotePath()
-        except exceptions.CloudStorageError as e:
-          cloud_storage_error = e
-        break
-      if fetched_path:
-        found_deps.append(dependency)
-      else:
-        missing_deps.append(dependency)
-        logging.error(
-            'Dependency %s could not be found or fetched from cloud storage for'
-            ' platform %s. Error: %s', dependency, platform,
-            cloud_storage_error)
-    if missing_deps:
-      raise exceptions.NoPathFoundError(', '.join(missing_deps), platform)
-    return (found_deps, skipped_deps)
-
-  def _UpdateDependencies(self, config):
-    """Add the dependency information stored in |config| to this instance.
-
-    Args:
-        config: An instances of BaseConfig or a subclasses.
-
-    Raises:
-        UnsupportedConfigFormatError: If supported_config_types was specified
-        and config is not in the supported config_types.
-    """
-    if not isinstance(config, base_config.BaseConfig):
-      raise ValueError('Must use a BaseConfig or subclass instance with the '
-                       'DependencyManager.')
-    if (self.supported_configs and
-        config.GetConfigType() not in self.supported_configs):
-      raise exceptions.UnsupportedConfigFormatError(config.GetConfigType(),
-                                                    config.config_path)
-    for dep_info in config.IterDependencyInfo():
-      dependency = dep_info.dependency
-      platform = dep_info.platform
-      if dependency not in self._lookup_dict:
-        self._lookup_dict[dependency] = {}
-      if platform not in self._lookup_dict[dependency]:
-        self._lookup_dict[dependency][platform] = dep_info
-      else:
-        self._lookup_dict[dependency][platform].Update(dep_info)
-
-
-  def _GetDependencyInfo(self, dependency, platform):
-    """Get information for |dependency| on |platform|, or a default if needed.
-
-    Args:
-        dependency: Name of the desired dependency, as given in the config(s)
-            used in this DependencyManager.
-        platform: Name of the platform the dependency will run on. Often of the
-            form 'os_architecture'. Must match those specified in the config(s)
-            used in this DependencyManager.
-
-    Returns: The dependency_info for |dependency| on |platform| if it exists.
-        Or the default version of |dependency| if it exists, or None if neither
-        exist.
-    """
-    if not self._lookup_dict or dependency not in self._lookup_dict:
-      return None
-    dependency_dict = self._lookup_dict[dependency]
-    device_type = platform
-    if not device_type in dependency_dict:
-      device_type = DEFAULT_TYPE
-    return dependency_dict.get(device_type)
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/uploader.py b/systrace/catapult/dependency_manager/dependency_manager/uploader.py
deleted file mode 100644
index d00d20c..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/uploader.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-
-from py_utils import cloud_storage
-
-from dependency_manager import exceptions
-
-
-BACKUP_PATH_EXTENSION = 'old'
-
-
-class CloudStorageUploader(object):
-  def __init__(self, bucket, remote_path, local_path, cs_backup_path=None):
-    if not bucket or not remote_path or not local_path:
-      raise ValueError(
-          'Attempted to partially initialize upload data with bucket %s, '
-          'remote_path %s, and local_path %s', bucket, remote_path, local_path)
-    if not os.path.exists(local_path):
-      raise ValueError('Attempting to initilize UploadInfo with missing '
-                       'local path %s', local_path)
-
-    self._cs_bucket = bucket
-    self._cs_remote_path = remote_path
-    self._local_path = local_path
-    self._cs_backup_path = (cs_backup_path or
-                            '%s.%s' % (self._cs_remote_path,
-                                       BACKUP_PATH_EXTENSION))
-    self._updated = False
-    self._backed_up = False
-
-  def Upload(self, force=False):
-    """Upload all pending files and then write the updated config to disk.
-
-    Will attempt to copy files existing in the upload location to a backup
-    location in the same bucket in cloud storage if |force| is True.
-
-    Args:
-      force: True if files should be uploaded to cloud storage even if a
-          file already exists in the upload location.
-
-    Raises:
-      CloudStorageUploadConflictError: If |force| is False and the potential
-          upload location of a file already exists.
-      CloudStorageError: If copying an existing file to the backup location
-          or uploading the new file fails.
-    """
-    if cloud_storage.Exists(self._cs_bucket, self._cs_remote_path):
-      if not force:
-        #pylint: disable=nonstandard-exception
-        raise exceptions.CloudStorageUploadConflictError(self._cs_bucket,
-                                                         self._cs_remote_path)
-        #pylint: enable=nonstandard-exception
-      logging.debug('A file already exists at upload path %s in self.cs_bucket'
-                    ' %s', self._cs_remote_path, self._cs_bucket)
-      try:
-        cloud_storage.Copy(self._cs_bucket, self._cs_bucket,
-                           self._cs_remote_path, self._cs_backup_path)
-        self._backed_up = True
-      except cloud_storage.CloudStorageError:
-        logging.error('Failed to copy existing file %s in cloud storage bucket '
-                      '%s to backup location %s', self._cs_remote_path,
-                      self._cs_bucket, self._cs_backup_path)
-        raise
-
-    try:
-      cloud_storage.Insert(
-          self._cs_bucket, self._cs_remote_path, self._local_path)
-    except cloud_storage.CloudStorageError:
-      logging.error('Failed to upload %s to %s in cloud_storage bucket %s',
-                    self._local_path, self._cs_remote_path, self._cs_bucket)
-      raise
-    self._updated = True
-
-  def Rollback(self):
-    """Attempt to undo the previous call to Upload.
-
-    Does nothing if no previous call to Upload was made, or if nothing was
-    successfully changed.
-
-    Returns:
-      True iff changes were successfully rolled back.
-    Raises:
-      CloudStorageError: If copying the backed up file to its original
-          location or removing the uploaded file fails.
-    """
-    cloud_storage_changed = False
-    if self._backed_up:
-      cloud_storage.Copy(self._cs_bucket, self._cs_bucket, self._cs_backup_path,
-                         self._cs_remote_path)
-      cloud_storage_changed = True
-      self._cs_backup_path = None
-    elif self._updated:
-      cloud_storage.Delete(self._cs_bucket, self._cs_remote_path)
-      cloud_storage_changed = True
-    self._updated = False
-    return cloud_storage_changed
-
-  def __eq__(self, other, msg=None):
-    if not isinstance(self, type(other)):
-      return False
-    return (self._local_path == other._local_path and
-            self._cs_remote_path == other._cs_remote_path and
-            self._cs_bucket == other._cs_bucket)
-
diff --git a/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py b/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py
deleted file mode 100644
index 5c8e2a0..0000000
--- a/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-from pyfakefs import fake_filesystem_unittest
-
-from dependency_manager import uploader
-
-
-class CloudStorageUploaderTest(fake_filesystem_unittest.TestCase):
-  def setUp(self):
-    self.setUpPyfakefs()
-    self.bucket = 'cloud_storage_bucket'
-    self.local_path = os.path.abspath(os.path.join('path', 'to', 'dependency'))
-    self.fs.CreateFile(self.local_path)
-    self.remote_path = 'config_folder/remote_path'
-
-  def testCloudStorageUploaderMissingData(self):
-    self.assertRaises(ValueError, uploader.CloudStorageUploader,
-                      None, self.remote_path, self.local_path)
-    self.assertRaises(ValueError, uploader.CloudStorageUploader,
-                      self.bucket, None, self.local_path)
-    self.assertRaises(ValueError, uploader.CloudStorageUploader,
-                      self.bucket, self.remote_path, None)
-
-  def testCloudStorageUploaderLocalFileMissing(self):
-    self.fs.RemoveObject(self.local_path)
-    self.assertRaises(ValueError, uploader.CloudStorageUploader,
-                      self.bucket, self.remote_path, self.local_path)
-
-  def testCloudStorageUploaderCreation(self):
-    upload_data = uploader.CloudStorageUploader(
-        self.bucket, self.remote_path, self.local_path)
-    expected_bucket = self.bucket
-    expected_remote_path = self.remote_path
-    expected_cs_backup_path = '%s.old' % expected_remote_path
-    expected_local_path = self.local_path
-    self.assertEqual(expected_bucket, upload_data._cs_bucket)
-    self.assertEqual(expected_remote_path, upload_data._cs_remote_path)
-    self.assertEqual(expected_local_path, upload_data._local_path)
-    self.assertEqual(expected_cs_backup_path, upload_data._cs_backup_path)
-
-  def testCloudStorageUploaderEquality(self):
-    upload_data = uploader.CloudStorageUploader(
-        self.bucket, self.remote_path, self.local_path)
-    upload_data_exact = uploader.CloudStorageUploader(
-        self.bucket, self.remote_path, self.local_path)
-    upload_data_equal = uploader.CloudStorageUploader(
-        'cloud_storage_bucket',
-        'config_folder/remote_path',
-        os.path.abspath(os.path.join('path', 'to', 'dependency')))
-    self.assertEqual(upload_data, upload_data)
-    self.assertEqual(upload_data, upload_data_exact)
-    self.assertEqual(upload_data_exact, upload_data)
-    self.assertEqual(upload_data, upload_data_equal)
-    self.assertEqual(upload_data_equal, upload_data)
-
-
-  def testCloudStorageUploaderInequality(self):
-    new_local_path = os.path.abspath(os.path.join('new', 'local', 'path'))
-    self.fs.CreateFile(new_local_path)
-    new_bucket = 'new_bucket'
-    new_remote_path = 'new_remote/path'
-
-    upload_data = uploader.CloudStorageUploader(
-        self.bucket, self.remote_path, self.local_path)
-    upload_data_all_different = uploader.CloudStorageUploader(
-        new_bucket, new_remote_path, new_local_path)
-    upload_data_different_bucket = uploader.CloudStorageUploader(
-        new_bucket, self.remote_path, self.local_path)
-    upload_data_different_remote_path = uploader.CloudStorageUploader(
-        self.bucket, new_remote_path, self.local_path)
-    upload_data_different_local_path = uploader.CloudStorageUploader(
-        self.bucket, self.remote_path, new_local_path)
-
-    self.assertNotEqual(upload_data, 'a string!')
-    self.assertNotEqual(upload_data, 0)
-    self.assertNotEqual(upload_data, 2354)
-    self.assertNotEqual(upload_data, None)
-    self.assertNotEqual(upload_data, upload_data_all_different)
-    self.assertNotEqual(upload_data_all_different, upload_data)
-    self.assertNotEqual(upload_data, upload_data_different_bucket)
-    self.assertNotEqual(upload_data_different_bucket, upload_data)
-    self.assertNotEqual(upload_data, upload_data_different_remote_path)
-    self.assertNotEqual(upload_data_different_remote_path, upload_data)
-    self.assertNotEqual(upload_data, upload_data_different_local_path)
-    self.assertNotEqual(upload_data_different_local_path, upload_data)
-
-  #TODO: write unittests for upload and rollback
diff --git a/systrace/catapult/dependency_manager/pylintrc b/systrace/catapult/dependency_manager/pylintrc
deleted file mode 100644
index 4541fb8..0000000
--- a/systrace/catapult/dependency_manager/pylintrc
+++ /dev/null
@@ -1,68 +0,0 @@
-[MESSAGES CONTROL]
-
-# Disable the message, report, category or checker with the given id(s).
-# TODO: Shrink this list to as small as possible.
-disable=
-  design,
-  similarities,
-
-  fixme,
-  locally-disabled,
-  locally-enabled,
-  missing-docstring,
-  no-member,
-  no-self-use,
-  protected-access,
-  star-args,
-
-
-[REPORTS]
-
-# Don't write out full reports, just messages.
-reports=no
-
-
-[BASIC]
-
-# Regular expression which should only match correct function names.
-function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
-
-# Regular expression which should only match correct method names.
-method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
-
-# Regular expression which should only match correct argument names.
-argument-rgx=^[a-z][a-z0-9_]*$
-
-# Regular expression which should only match correct variable names.
-variable-rgx=^[a-z][a-z0-9_]*$
-
-# Good variable names which should always be accepted, separated by a comma.
-good-names=main,_
-
-# List of builtins function names that should not be used, separated by a comma.
-bad-functions=apply,input,reduce
-
-
-[VARIABLES]
-
-# Tells wether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching names used for dummy variables (i.e. not used).
-dummy-variables-rgx=^\*{0,2}(_$|unused_)
-
-
-[TYPECHECK]
-
-# Tells wether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-
-[FORMAT]
-
-# Maximum number of lines in a module.
-max-module-lines=2000
-
-# We use two spaces for indents, instead of the usual four spaces or tab.
-indent-string='  '
diff --git a/systrace/catapult/devil/BUILD.gn b/systrace/catapult/devil/BUILD.gn
deleted file mode 100644
index cf1255d..0000000
--- a/systrace/catapult/devil/BUILD.gn
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-group("devil") {
-  testonly = true
-  deps = []
-  data_deps = [
-    "../third_party/gsutil",
-  ]
-  data = [
-    "devil/",
-  ]
-
-  if (is_android) {
-    deps += [
-      ":empty_system_webview_apk",
-      "//buildtools/third_party/libc++($host_toolchain)",
-      "//tools/android/forwarder2",
-      "//tools/android/md5sum",
-    ]
-  }
-}
-
-if (is_android) {
-  import("//testing/android/empty_apk/empty_apk.gni")
-
-  empty_apk("empty_system_webview_apk") {
-    package_name = "com.android.webview"
-    apk_name = "EmptySystemWebView"
-  }
-}
diff --git a/systrace/catapult/devil/DIR_METADATA b/systrace/catapult/devil/DIR_METADATA
deleted file mode 100644
index 7608b2f..0000000
--- a/systrace/catapult/devil/DIR_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail {
-  component: "Test>Devil"
-}
diff --git a/systrace/catapult/devil/PRESUBMIT.py b/systrace/catapult/devil/PRESUBMIT.py
deleted file mode 100644
index ec48ddd..0000000
--- a/systrace/catapult/devil/PRESUBMIT.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Presubmit script for devil.
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
-details on the presubmit API built into depot_tools.
-"""
-
-
-def _RunPylint(input_api, output_api):
-  return input_api.RunTests(
-      input_api.canned_checks.RunPylint(
-          input_api, output_api, pylintrc='pylintrc'))
-
-
-def _RunUnitTests(input_api, output_api):
-  def J(*dirs):
-    """Returns a path relative to presubmit directory."""
-    return input_api.os_path.join(input_api.PresubmitLocalPath(), 'devil',
-                                  *dirs)
-
-  test_env = dict(input_api.environ)
-  test_env.update({
-      'PYTHONDONTWRITEBYTECODE': '1',
-      'PYTHONPATH': ':'.join([J(), J('..')]),
-  })
-
-  message_type = (output_api.PresubmitError if input_api.is_committing else
-                  output_api.PresubmitPromptWarning)
-
-  return input_api.RunTests([
-      input_api.Command(name='devil/bin/run_py_tests',
-                        cmd=[
-                            input_api.os_path.join(
-                                input_api.PresubmitLocalPath(), 'bin',
-                                'run_py_tests')
-                        ],
-                        kwargs={'env': test_env},
-                        message=message_type),
-      input_api.Command(name='devil/bin/run_py3_tests',
-                        cmd=[
-                            input_api.os_path.join(
-                                input_api.PresubmitLocalPath(), 'bin',
-                                'run_py3_tests')
-                        ],
-                        kwargs={'env': test_env},
-                        message=message_type,
-                        python3=True),
-  ])
-
-
-def _EnsureNoPylibUse(input_api, output_api):
-  def other_python_files(f):
-    this_presubmit_file = input_api.os_path.join(input_api.PresubmitLocalPath(),
-                                                 'PRESUBMIT.py')
-    return (f.LocalPath().endswith('.py')
-            and not f.AbsoluteLocalPath() == this_presubmit_file)
-
-  changed_files = input_api.AffectedSourceFiles(other_python_files)
-  import_error_re = input_api.re.compile(
-      r'(from pylib.* import)|(import pylib)')
-
-  errors = []
-  for f in changed_files:
-    errors.extend('%s:%d' % (f.LocalPath(), line_number)
-                  for line_number, line_text in f.ChangedContents()
-                  if import_error_re.search(line_text))
-
-  if errors:
-    return [
-        output_api.PresubmitError(
-            'pylib modules should not be imported from devil modules.',
-            items=errors)
-    ]
-  return []
-
-
-def CommonChecks(input_api, output_api):
-  output = []
-  output += _RunPylint(input_api, output_api)
-  output += _RunUnitTests(input_api, output_api)
-  output += _EnsureNoPylibUse(input_api, output_api)
-  return output
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return CommonChecks(input_api, output_api)
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return CommonChecks(input_api, output_api)
diff --git a/systrace/catapult/devil/README.md b/systrace/catapult/devil/README.md
deleted file mode 100644
index 83f4ba0..0000000
--- a/systrace/catapult/devil/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Copyright 2015 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-## devil
-
-😈
-
-devil (device interaction layer) is a library used by the Chromium developers to
-interact with Android devices. It currently supports SDK level 16 and above.
-
-## Interfaces
-
-devil provides python APIs:
-  - [`devil.android.adb_wrapper`](docs/adb_wrapper.md) provides a thin wrapper
-    around the adb binary. Most functions and methods have direct analogues on
-    the adb command-line.
-  - [`devil.android.device_utils`](docs/device_utils.md) provides higher-level
-    functionality built on top of `adb_wrapper`. **This is the primary
-    mechanism through which chromium's scripts interact with devices.**
-
-## Utilities
-
-devil also provides command-line utilities:
- - [`devil/utils/markdown.py`](docs/markdown.md) generated markdown
-   documentation for python modules.
-
-## Constraints and Caveats
-
-devil supports python 2.7. Python 3 compatibility is currently a work in
-progress (see https://crbug.com/1007101).
-
-## Contributing
-
-Please see [our contributor's guide](/CONTRIBUTING.md)
diff --git a/systrace/catapult/devil/bin/generate_md_docs b/systrace/catapult/devil/bin/generate_md_docs
deleted file mode 100755
index 4c6f0f9..0000000
--- a/systrace/catapult/devil/bin/generate_md_docs
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env vpython
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-import sys
-
-_DEVIL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-_DEVIL_URL = ('https://chromium.googlesource.com/catapult.git/+/HEAD/devil/')
-
-sys.path.append(_DEVIL_PATH)
-from devil.utils import cmd_helper
-
-_FILES_TO_DOC = {
-    'devil/android/sdk/adb_wrapper.py': 'docs/adb_wrapper.md',
-    'devil/android/device_utils.py': 'docs/device_utils.md',
-    'devil/utils/markdown.py': 'docs/markdown.md',
-}
-
-_MARKDOWN_SCRIPT = os.path.join(_DEVIL_PATH, 'devil', 'utils', 'markdown.py')
-
-
-def main():
-  failed = False
-  for k, v in _FILES_TO_DOC.iteritems():
-    module_path = os.path.join(_DEVIL_PATH, k)
-    module_link = _DEVIL_URL + k
-    doc_path = os.path.join(_DEVIL_PATH, v)
-
-    status, stdout = cmd_helper.GetCmdStatusAndOutput([
-        sys.executable, _MARKDOWN_SCRIPT, module_path, '--module-link',
-        module_link
-    ])
-    if status:
-      logging.error('Failed to update doc for %s' % module_path)
-      failed = True
-    else:
-      with open(doc_path, 'w') as doc_file:
-        doc_file.write(stdout)
-
-  return 1 if failed else 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/bin/run_py3_tests b/systrace/catapult/devil/bin/run_py3_tests
deleted file mode 100755
index 3250ff1..0000000
--- a/systrace/catapult/devil/bin/run_py3_tests
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/env vpython3
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Runs all python3-compatible tests in devil."""
-
-import os
-import sys
-import unittest
-
-_DEVIL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-_SIX_PATH = os.path.join(_DEVIL_PATH, '..', 'third_party', 'six')
-
-sys.path.append(_DEVIL_PATH)
-sys.path.append(_SIX_PATH)
-# Import compatible tests here by full module path
-import devil.android.apk_helper_test
-import devil.android.app_ui_test
-import devil.android.battery_utils_test
-import devil.android.cpu_temperature_test
-import devil.android.decorators_test
-import devil.android.device_denylist_test
-import devil.android.device_errors_test
-import devil.android.device_utils_test
-import devil.android.fastboot_utils_test
-import devil.android.flag_changer_test
-import devil.android.logcat_monitor_test
-import devil.android.md5sum_test
-import devil.android.perf.perf_control_test
-import devil.android.perf.surface_stats_collector_test
-import devil.android.sdk.adb_wrapper_test
-import devil.android.sdk.shared_prefs_test
-import devil.android.tools.device_monitor_test
-import devil.android.tools.script_common_test
-import devil.android.tools.system_app_test
-import devil.devil_env_test
-import devil.utils.cmd_helper_test
-import devil.utils.decorators_test
-import devil.utils.find_usb_devices_test
-import devil.utils.geometry_test
-import devil.utils.lazy.weak_constant_test
-import devil.utils.lsusb_test
-import devil.utils.markdown_test
-import devil.utils.mock_calls_test
-import devil.utils.parallelizer_test
-import devil.utils.reraiser_thread_unittest
-import devil.utils.timeout_retry_unittest
-import devil.utils.zip_utils_test
-
-PY3_COMPATIBLE_TESTS = [
-    # Add full test module path here
-    devil.android.apk_helper_test,
-    devil.android.app_ui_test,
-    devil.android.battery_utils_test,
-    devil.android.cpu_temperature_test,
-    devil.android.decorators_test,
-    devil.android.device_denylist_test,
-    devil.android.device_errors_test,
-    devil.android.device_utils_test,
-    devil.android.fastboot_utils_test,
-    devil.android.flag_changer_test,
-    devil.android.logcat_monitor_test,
-    devil.android.md5sum_test,
-    devil.android.perf.perf_control_test,
-    devil.android.perf.surface_stats_collector_test,
-    devil.android.sdk.adb_wrapper_test,
-    devil.android.sdk.shared_prefs_test,
-    devil.android.tools.device_monitor_test,
-    devil.android.tools.script_common_test,
-    devil.android.tools.system_app_test,
-    devil.devil_env_test,
-    devil.utils.cmd_helper_test,
-    devil.utils.decorators_test,
-    devil.utils.find_usb_devices_test,
-    devil.utils.geometry_test,
-    devil.utils.lazy.weak_constant_test,
-    devil.utils.lsusb_test,
-    devil.utils.markdown_test,
-    devil.utils.mock_calls_test,
-    devil.utils.parallelizer_test,
-    devil.utils.reraiser_thread_unittest,
-    devil.utils.timeout_retry_unittest,
-    devil.utils.zip_utils_test,
-]
-
-
-def main():
-  # TODO(crbug.com/1007101): Use six.PY2 directly once we're using six via
-  # vpython.
-  if sys.version_info[0] == 2:
-    print('Somehow running under python2.')
-    return 1
-
-  # Tests mock out internal details of methods, and the ANDROID_SERIAL can
-  # change which internal methods are called. Since tests don't actually use
-  # devices, it should be fine to delete the variable.
-  if 'ANDROID_SERIAL' in os.environ:
-    del os.environ['ANDROID_SERIAL']
-
-  # This does not use typ for now, as typ has vpython dependencies that haven't
-  # yet been updated for python3.
-  result = unittest.TextTestRunner().run(unittest.TestSuite(
-      unittest.defaultTestLoader.loadTestsFromModule(test_module)
-      for test_module in PY3_COMPATIBLE_TESTS
-  ))
-
-  return 0 if result.wasSuccessful() else 1
-
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/bin/run_py_devicetests b/systrace/catapult/devil/bin/run_py_devicetests
deleted file mode 100755
index 9329f3a..0000000
--- a/systrace/catapult/devil/bin/run_py_devicetests
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env vpython
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..'))
-_DEVIL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-_TYP_PATH = os.path.abspath(os.path.join(_CATAPULT_PATH, 'third_party', 'typ'))
-
-sys.path.append(_TYP_PATH)
-import typ
-
-sys.path.append(_DEVIL_PATH)
-from devil.android import device_test_case
-
-
-def _SetUpLogging():
-  parsed_args = typ.arg_parser.ArgumentParser().parse_args(args=sys.argv[1:])
-  verbosity = parsed_args.verbose
-  level = None
-  if verbosity == 0:
-    level = logging.WARNING
-  elif verbosity == 1:
-    level = logging.INFO
-  elif verbosity >= 2:
-    level = logging.DEBUG
-  else:
-    raise RuntimeError(
-        'Logging verbosity of {} is not allowed.'.format(verbosity))
-  logging.basicConfig(level=level)
-
-
-def main():
-  _SetUpLogging()
-  runner = typ.Runner()
-  runner.setup_fn = device_test_case.PrepareDevices
-  return runner.main(
-      coverage_source=[_DEVIL_PATH],
-      jobs=1,
-      suffixes=['*_devicetest.py'],
-      top_level_dir=_DEVIL_PATH)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/bin/run_py_tests b/systrace/catapult/devil/bin/run_py_tests
deleted file mode 100755
index be245c6..0000000
--- a/systrace/catapult/devil/bin/run_py_tests
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env vpython
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..'))
-_DEVIL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-
-sys.path.append(_CATAPULT_PATH)
-from catapult_build import run_with_typ
-
-
-def main():
-  # Tests mock out internal details of methods, and the ANDROID_SERIAL can
-  # change which internal methods are called. Since tests don't actually use
-  # devices, it should be fine to delete the variable.
-  if 'ANDROID_SERIAL' in os.environ:
-    del os.environ['ANDROID_SERIAL']
-
-  return run_with_typ.Run(top_level_dir=_DEVIL_PATH)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/build/cipd.yaml b/systrace/catapult/devil/build/cipd.yaml
deleted file mode 100644
index 204400a..0000000
--- a/systrace/catapult/devil/build/cipd.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -ref latest
-package: chromium/third_party/catapult/devil/${platform}
-
-description: All of devil along with its dependencies in catapult.
-
-platforms:
-  - linux-amd64
-
-root: ../../
-
-data:
-  - dir: common/py_utils
-  - dir: dependency_manager
-  - dir: devil
-  - dir: third_party/gsutil
-  - dir: third_party/zipfile
diff --git a/systrace/catapult/devil/devil/__init__.py b/systrace/catapult/devil/devil/__init__.py
deleted file mode 100644
index 7de59c9..0000000
--- a/systrace/catapult/devil/devil/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-
-logging.getLogger('devil').addHandler(logging.NullHandler())
diff --git a/systrace/catapult/devil/devil/android/__init__.py b/systrace/catapult/devil/devil/android/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/systrace/catapult/devil/devil/android/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/systrace/catapult/devil/devil/android/apk_helper.py b/systrace/catapult/devil/devil/android/apk_helper.py
deleted file mode 100644
index 4d723a5..0000000
--- a/systrace/catapult/devil/devil/android/apk_helper.py
+++ /dev/null
@@ -1,609 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Module containing utilities for apk packages."""
-
-import contextlib
-import logging
-import os
-import re
-import shutil
-import tempfile
-import zipfile
-
-import six
-
-from devil import base_error
-from devil.android.ndk import abis
-from devil.android.sdk import aapt
-from devil.android.sdk import bundletool
-from devil.android.sdk import split_select
-from devil.utils import cmd_helper
-
-_logger = logging.getLogger(__name__)
-
-_MANIFEST_ATTRIBUTE_RE = re.compile(r'\s*A: ([^\(\)= ]*)(?:\([^\(\)= ]*\))?='
-                                    r'(?:"(.*)" \(Raw: .*\)|\(type.*?\)(.*))$')
-_MANIFEST_ELEMENT_RE = re.compile(r'\s*(?:E|N): (\S*) .*$')
-_BASE_APK_APKS_RE = re.compile(r'^splits/base-master.*\.apk$')
-
-
-class ApkHelperError(base_error.BaseError):
-  """Exception for APK helper failures."""
-
-  def __init__(self, message):
-    super(ApkHelperError, self).__init__(message)
-
-
-@contextlib.contextmanager
-def _DeleteHelper(files, to_delete):
-  """Context manager that returns |files| and deletes |to_delete| on exit."""
-  try:
-    yield files
-  finally:
-    paths = to_delete if isinstance(to_delete, list) else [to_delete]
-    for path in paths:
-      if os.path.isfile(path):
-        os.remove(path)
-      elif os.path.isdir(path):
-        shutil.rmtree(path)
-      else:
-        raise ApkHelperError('Cannot delete %s' % path)
-
-
-@contextlib.contextmanager
-def _NoopFileHelper(files):
-  """Context manager that returns |files|."""
-  yield files
-
-
-def GetPackageName(apk_path):
-  """Returns the package name of the apk."""
-  return ToHelper(apk_path).GetPackageName()
-
-
-# TODO(jbudorick): Deprecate and remove this function once callers have been
-# converted to ApkHelper.GetInstrumentationName
-def GetInstrumentationName(apk_path):
-  """Returns the name of the Instrumentation in the apk."""
-  return ToHelper(apk_path).GetInstrumentationName()
-
-
-def ToHelper(path_or_helper):
-  """Creates an ApkHelper unless one is already given."""
-  if not isinstance(path_or_helper, six.string_types):
-    return path_or_helper
-  elif path_or_helper.endswith('.apk'):
-    return ApkHelper(path_or_helper)
-  elif path_or_helper.endswith('.apks'):
-    return ApksHelper(path_or_helper)
-  elif path_or_helper.endswith('_bundle'):
-    return BundleScriptHelper(path_or_helper)
-
-  raise ApkHelperError('Unrecognized APK format %s' % path_or_helper)
-
-
-def ToSplitHelper(path_or_helper, split_apks):
-  if isinstance(path_or_helper, SplitApkHelper):
-    if sorted(path_or_helper.split_apk_paths) != sorted(split_apks):
-      raise ApkHelperError('Helper has different split APKs')
-    return path_or_helper
-  elif (isinstance(path_or_helper, six.string_types)
-        and path_or_helper.endswith('.apk')):
-    return SplitApkHelper(path_or_helper, split_apks)
-
-  raise ApkHelperError(
-      'Unrecognized APK format %s, %s' % (path_or_helper, split_apks))
-
-
-# To parse the manifest, the function uses a node stack where at each level of
-# the stack it keeps the currently in focus node at that level (of indentation
-# in the xmltree output, ie. depth in the tree). The height of the stack is
-# determinded by line indentation. When indentation is increased so is the stack
-# (by pushing a new empty node on to the stack). When indentation is decreased
-# the top of the stack is popped (sometimes multiple times, until indentation
-# matches the height of the stack). Each line parsed (either an attribute or an
-# element) is added to the node at the top of the stack (after the stack has
-# been popped/pushed due to indentation).
-def _ParseManifestFromApk(apk_path):
-  aapt_output = aapt.Dump('xmltree', apk_path, 'AndroidManifest.xml')
-  parsed_manifest = {}
-  node_stack = [parsed_manifest]
-  indent = '  '
-
-  if aapt_output[0].startswith('N'):
-    # if the first line is a namespace then the root manifest is indented, and
-    # we need to add a dummy namespace node, then skip the first line (we dont
-    # care about namespaces).
-    node_stack.insert(0, {})
-    output_to_parse = aapt_output[1:]
-  else:
-    output_to_parse = aapt_output
-
-  for line in output_to_parse:
-    if len(line) == 0:
-      continue
-
-    # If namespaces are stripped, aapt still outputs the full url to the
-    # namespace and appends it to the attribute names.
-    line = line.replace('http://schemas.android.com/apk/res/android:',
-                        'android:')
-
-    indent_depth = 0
-    while line[(len(indent) * indent_depth):].startswith(indent):
-      indent_depth += 1
-
-    # Pop the stack until the height of the stack is the same is the depth of
-    # the current line within the tree.
-    node_stack = node_stack[:indent_depth + 1]
-    node = node_stack[-1]
-
-    # Element nodes are a list of python dicts while attributes are just a dict.
-    # This is because multiple elements, at the same depth of tree and the same
-    # name, are all added to the same list keyed under the element name.
-    m = _MANIFEST_ELEMENT_RE.match(line[len(indent) * indent_depth:])
-    if m:
-      manifest_key = m.group(1)
-      if manifest_key in node:
-        node[manifest_key] += [{}]
-      else:
-        node[manifest_key] = [{}]
-      node_stack += [node[manifest_key][-1]]
-      continue
-
-    m = _MANIFEST_ATTRIBUTE_RE.match(line[len(indent) * indent_depth:])
-    if m:
-      manifest_key = m.group(1)
-      if manifest_key in node:
-        raise ApkHelperError(
-            "A single attribute should have one key and one value: {}".format(
-                line))
-      else:
-        node[manifest_key] = m.group(2) or m.group(3)
-      continue
-
-  return parsed_manifest
-
-
-def _ParseNumericKey(obj, key, default=0):
-  val = obj.get(key)
-  if val is None:
-    return default
-  return int(val, 0)
-
-
-def _SplitLocaleString(locale):
-  split_locale = locale.split('-')
-  if len(split_locale) != 2:
-    raise ApkHelperError('Locale has incorrect format: {}'.format(locale))
-  return tuple(split_locale)
-
-
-class _ExportedActivity(object):
-  def __init__(self, name):
-    self.name = name
-    self.actions = set()
-    self.categories = set()
-    self.schemes = set()
-
-
-def _IterateExportedActivities(manifest_info):
-  app_node = manifest_info['manifest'][0]['application'][0]
-  activities = app_node.get('activity', []) + app_node.get('activity-alias', [])
-  for activity_node in activities:
-    # Presence of intent filters make an activity exported by default.
-    has_intent_filter = 'intent-filter' in activity_node
-    if not _ParseNumericKey(
-        activity_node, 'android:exported', default=has_intent_filter):
-      continue
-
-    activity = _ExportedActivity(activity_node.get('android:name'))
-    # Merge all intent-filters into a single set because there is not
-    # currently a need to keep them separate.
-    for intent_filter in activity_node.get('intent-filter', []):
-      for action in intent_filter.get('action', []):
-        activity.actions.add(action.get('android:name'))
-      for category in intent_filter.get('category', []):
-        activity.categories.add(category.get('android:name'))
-      for data in intent_filter.get('data', []):
-        activity.schemes.add(data.get('android:scheme'))
-    yield activity
-
-
-class BaseApkHelper(object):
-  """Abstract base class representing an installable Android app."""
-
-  def __init__(self):
-    self._manifest = None
-
-  @property
-  def path(self):
-    raise NotImplementedError()
-
-  def __repr__(self):
-    return '%s(%s)' % (self.__class__.__name__, self.path)
-
-  def _GetBaseApkPath(self):
-    """Returns context manager providing path to this app's base APK.
-
-    Must be implemented by subclasses.
-    """
-    raise NotImplementedError()
-
-  def GetActivityName(self):
-    """Returns the name of the first launcher Activity in the apk."""
-    manifest_info = self._GetManifest()
-    for activity in _IterateExportedActivities(manifest_info):
-      if ('android.intent.action.MAIN' in activity.actions
-          and 'android.intent.category.LAUNCHER' in activity.categories):
-        return self._ResolveName(activity.name)
-    return None
-
-  def GetViewActivityName(self):
-    """Returns name of the first action=View Activity that can handle http."""
-    manifest_info = self._GetManifest()
-    for activity in _IterateExportedActivities(manifest_info):
-      if ('android.intent.action.VIEW' in activity.actions
-          and 'http' in activity.schemes):
-        return self._ResolveName(activity.name)
-    return None
-
-  def GetInstrumentationName(self,
-                             default='android.test.InstrumentationTestRunner'):
-    """Returns the name of the Instrumentation in the apk."""
-    all_instrumentations = self.GetAllInstrumentations(default=default)
-    if len(all_instrumentations) != 1:
-      raise ApkHelperError(
-          'There is more than one instrumentation. Expected one.')
-    else:
-      return self._ResolveName(all_instrumentations[0]['android:name'])
-
-  def GetAllInstrumentations(self,
-                             default='android.test.InstrumentationTestRunner'):
-    """Returns a list of all Instrumentations in the apk."""
-    try:
-      return self._GetManifest()['manifest'][0]['instrumentation']
-    except KeyError:
-      return [{'android:name': default}]
-
-  def GetPackageName(self):
-    """Returns the package name of the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      return manifest_info['manifest'][0]['package']
-    except KeyError:
-      raise ApkHelperError('Failed to determine package name of %s' % self.path)
-
-  def GetPermissions(self):
-    manifest_info = self._GetManifest()
-    try:
-      return [
-          p['android:name']
-          for p in manifest_info['manifest'][0]['uses-permission']
-      ]
-    except KeyError:
-      return []
-
-  def GetSplitName(self):
-    """Returns the name of the split of the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      return manifest_info['manifest'][0]['split']
-    except KeyError:
-      return None
-
-  def HasIsolatedProcesses(self):
-    """Returns whether any services exist that use isolatedProcess=true."""
-    manifest_info = self._GetManifest()
-    try:
-      application = manifest_info['manifest'][0]['application'][0]
-      services = application['service']
-      return any(
-          _ParseNumericKey(s, 'android:isolatedProcess') for s in services)
-    except KeyError:
-      return False
-
-  def GetAllMetadata(self):
-    """Returns a list meta-data tags as (name, value) tuples."""
-    manifest_info = self._GetManifest()
-    try:
-      application = manifest_info['manifest'][0]['application'][0]
-      metadata = application['meta-data']
-      return [(x.get('android:name'), x.get('android:value')) for x in metadata]
-    except KeyError:
-      return []
-
-  def GetVersionCode(self):
-    """Returns the versionCode as an integer, or None if not available."""
-    manifest_info = self._GetManifest()
-    try:
-      version_code = manifest_info['manifest'][0]['android:versionCode']
-      return int(version_code, 16)
-    except KeyError:
-      return None
-
-  def GetVersionName(self):
-    """Returns the versionName as a string."""
-    manifest_info = self._GetManifest()
-    try:
-      version_name = manifest_info['manifest'][0]['android:versionName']
-      return version_name
-    except KeyError:
-      return ''
-
-  def GetMinSdkVersion(self):
-    """Returns the minSdkVersion as a string, or None if not available.
-
-    Note: this cannot always be cast to an integer."""
-    manifest_info = self._GetManifest()
-    try:
-      uses_sdk = manifest_info['manifest'][0]['uses-sdk'][0]
-      min_sdk_version = uses_sdk['android:minSdkVersion']
-      try:
-        # The common case is for this to be an integer. Convert to decimal
-        # notation (rather than hexadecimal) for readability, but convert back
-        # to a string for type consistency with the general case.
-        return str(int(min_sdk_version, 16))
-      except ValueError:
-        # In general (ex. apps with minSdkVersion set to pre-release Android
-        # versions), minSdkVersion can be a string (usually, the OS codename
-        # letter). For simplicity, don't do any validation on the value.
-        return min_sdk_version
-    except KeyError:
-      return None
-
-  def GetTargetSdkVersion(self):
-    """Returns the targetSdkVersion as a string, or None if not available.
-
-    Note: this cannot always be cast to an integer. If this application targets
-    a pre-release SDK, this returns the SDK codename instead (ex. "R").
-    """
-    manifest_info = self._GetManifest()
-    try:
-      uses_sdk = manifest_info['manifest'][0]['uses-sdk'][0]
-      target_sdk_version = uses_sdk['android:targetSdkVersion']
-      try:
-        # The common case is for this to be an integer. Convert to decimal
-        # notation (rather than hexadecimal) for readability, but convert back
-        # to a string for type consistency with the general case.
-        return str(int(target_sdk_version, 16))
-      except ValueError:
-        # In general (ex. apps targeting pre-release Android versions),
-        # targetSdkVersion can be a string (usually, the OS codename letter).
-        # For simplicity, don't do any validation on the value.
-        return target_sdk_version
-    except KeyError:
-      return None
-
-  def _GetManifest(self):
-    if not self._manifest:
-      with self._GetBaseApkPath() as base_apk_path:
-        self._manifest = _ParseManifestFromApk(base_apk_path)
-    return self._manifest
-
-  def _ResolveName(self, name):
-    name = name.lstrip('.')
-    if '.' not in name:
-      return '%s.%s' % (self.GetPackageName(), name)
-    return name
-
-  def _ListApkPaths(self):
-    with self._GetBaseApkPath() as base_apk_path:
-      with zipfile.ZipFile(base_apk_path) as z:
-        return z.namelist()
-
-  def GetAbis(self):
-    """Returns a list of ABIs in the apk (empty list if no native code)."""
-    # Use lib/* to determine the compatible ABIs.
-    libs = set()
-    for path in self._ListApkPaths():
-      path_tokens = path.split('/')
-      if len(path_tokens) >= 2 and path_tokens[0] == 'lib':
-        libs.add(path_tokens[1])
-    lib_to_abi = {
-        abis.ARM: [abis.ARM, abis.ARM_64],
-        abis.ARM_64: [abis.ARM_64],
-        abis.X86: [abis.X86, abis.X86_64],
-        abis.X86_64: [abis.X86_64]
-    }
-    try:
-      output = set()
-      for lib in libs:
-        for abi in lib_to_abi[lib]:
-          output.add(abi)
-      return sorted(output)
-    except KeyError:
-      raise ApkHelperError('Unexpected ABI in lib/* folder.')
-
-  def GetApkPaths(self,
-                  device,
-                  modules=None,
-                  allow_cached_props=False,
-                  additional_locales=None):
-    """Returns context manager providing list of split APK paths for |device|.
-
-    The paths may be deleted when the context manager exits. Must be implemented
-    by subclasses.
-
-    args:
-      device: The device for which to return split APKs.
-      modules: Extra feature modules to install.
-      allow_cached_props: Allow using cache when querying propery values from
-        |device|.
-    """
-    # pylint: disable=unused-argument
-    raise NotImplementedError()
-
-  @staticmethod
-  def SupportsSplits():
-    return False
-
-
-class ApkHelper(BaseApkHelper):
-  """Represents a single APK Android app."""
-
-  def __init__(self, apk_path):
-    super(ApkHelper, self).__init__()
-    self._apk_path = apk_path
-
-  @property
-  def path(self):
-    return self._apk_path
-
-  def _GetBaseApkPath(self):
-    return _NoopFileHelper(self._apk_path)
-
-  def GetApkPaths(self,
-                  device,
-                  modules=None,
-                  allow_cached_props=False,
-                  additional_locales=None):
-    if modules:
-      raise ApkHelperError('Cannot install modules when installing single APK')
-    return _NoopFileHelper([self._apk_path])
-
-
-class SplitApkHelper(BaseApkHelper):
-  """Represents a multi APK Android app."""
-
-  def __init__(self, base_apk_path, split_apk_paths):
-    super(SplitApkHelper, self).__init__()
-    self._base_apk_path = base_apk_path
-    self._split_apk_paths = split_apk_paths
-
-  @property
-  def path(self):
-    return self._base_apk_path
-
-  @property
-  def split_apk_paths(self):
-    return self._split_apk_paths
-
-  def __repr__(self):
-    return '%s(%s, %s)' % (self.__class__.__name__, self.path,
-                           self.split_apk_paths)
-
-  def _GetBaseApkPath(self):
-    return _NoopFileHelper(self._base_apk_path)
-
-  def GetApkPaths(self,
-                  device,
-                  modules=None,
-                  allow_cached_props=False,
-                  additional_locales=None):
-    if modules:
-      raise ApkHelperError('Cannot install modules when installing single APK')
-    splits = split_select.SelectSplits(
-        device,
-        self.path,
-        self.split_apk_paths,
-        allow_cached_props=allow_cached_props)
-    if len(splits) == 1:
-      _logger.warning('split-select did not select any from %s', splits)
-    return _NoopFileHelper([self._base_apk_path] + splits)
-
-  #override
-  @staticmethod
-  def SupportsSplits():
-    return True
-
-
-class BaseBundleHelper(BaseApkHelper):
-  """Abstract base class representing an Android app bundle."""
-
-  def _GetApksPath(self):
-    """Returns context manager providing path to the bundle's APKS archive.
-
-    Must be implemented by subclasses.
-    """
-    raise NotImplementedError()
-
-  def _GetBaseApkPath(self):
-    try:
-      base_apk_path = tempfile.mkdtemp()
-      with self._GetApksPath() as apks_path:
-        with zipfile.ZipFile(apks_path) as z:
-          base_apks = [s for s in z.namelist() if _BASE_APK_APKS_RE.match(s)]
-          if len(base_apks) < 1:
-            raise ApkHelperError('Cannot find base APK in %s' % self.path)
-          z.extract(base_apks[0], base_apk_path)
-          return _DeleteHelper(
-              os.path.join(base_apk_path, base_apks[0]), base_apk_path)
-    except:
-      shutil.rmtree(base_apk_path)
-      raise
-
-  def GetApkPaths(self,
-                  device,
-                  modules=None,
-                  allow_cached_props=False,
-                  additional_locales=None):
-    locales = [device.GetLocale()]
-    if additional_locales:
-      locales.extend(_SplitLocaleString(l) for l in additional_locales)
-    with self._GetApksPath() as apks_path:
-      try:
-        split_dir = tempfile.mkdtemp()
-        # TODO(tiborg): Support all locales.
-        bundletool.ExtractApks(split_dir, apks_path,
-                               device.product_cpu_abis, locales,
-                               device.GetFeatures(), device.pixel_density,
-                               device.build_version_sdk, modules)
-        splits = [os.path.join(split_dir, p) for p in os.listdir(split_dir)]
-        return _DeleteHelper(splits, split_dir)
-      except:
-        shutil.rmtree(split_dir)
-        raise
-
-  #override
-  @staticmethod
-  def SupportsSplits():
-    return True
-
-
-class ApksHelper(BaseBundleHelper):
-  """Represents a bundle's APKS archive."""
-
-  def __init__(self, apks_path):
-    super(ApksHelper, self).__init__()
-    self._apks_path = apks_path
-
-  @property
-  def path(self):
-    return self._apks_path
-
-  def _GetApksPath(self):
-    return _NoopFileHelper(self._apks_path)
-
-
-class BundleScriptHelper(BaseBundleHelper):
-  """Represents a bundle install script."""
-
-  def __init__(self, bundle_script_path):
-    super(BundleScriptHelper, self).__init__()
-    self._bundle_script_path = bundle_script_path
-
-  @property
-  def path(self):
-    return self._bundle_script_path
-
-  def _GetApksPath(self):
-    apks_path = None
-    try:
-      fd, apks_path = tempfile.mkstemp(suffix='.apks')
-      os.close(fd)
-      cmd = [
-          self._bundle_script_path,
-          'build-bundle-apks',
-          '--output-apks',
-          apks_path,
-      ]
-      status, stdout, stderr = cmd_helper.GetCmdStatusOutputAndError(cmd)
-      if status != 0:
-        raise ApkHelperError('Failed running {} with output\n{}\n{}'.format(
-            ' '.join(cmd), stdout, stderr))
-      return _DeleteHelper(apks_path, apks_path)
-    except:
-      if apks_path:
-        os.remove(apks_path)
-      raise
diff --git a/systrace/catapult/devil/devil/android/apk_helper_test.py b/systrace/catapult/devil/devil/android/apk_helper_test.py
deleted file mode 100755
index 6ac7fde..0000000
--- a/systrace/catapult/devil/devil/android/apk_helper_test.py
+++ /dev/null
@@ -1,445 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import collections
-import os
-import unittest
-
-from devil import devil_env
-from devil.android import apk_helper
-from devil.android.ndk import abis
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-# pylint: disable=line-too-long
-_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: android:versionCode(0x0101021b)=(type 0x10)0x166de1ea
-    A: android:versionName(0x0101021c)="75.0.3763.0" (Raw: "75.0.3763.0")
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    A: split="random_split" (Raw: "random_split")
-    E: uses-sdk (line=2)
-      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x15
-      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x1c
-    E: uses-permission (line=2)
-      A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
-    E: uses-permission (line=3)
-      A: android:name(0x01010003)="android.permission.READ_EXTERNAL_STORAGE" (Raw: "android.permission.READ_EXTERNAL_STORAGE")
-    E: uses-permission (line=4)
-      A: android:name(0x01010003)="android.permission.ACCESS_FINE_LOCATION" (Raw: "android.permission.ACCESS_FINE_LOCATION")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-      E: service (line=7)
-        A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
-        A: android:isolatedProcess(0x01010888)=(type 0x12)0xffffffff
-      E: activity (line=173)
-        A: android:name(0x01010003)=".MainActivity" (Raw: ".MainActivity")
-        E: intent-filter (line=177)
-          E: action (line=178)
-            A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
-          E: category (line=180)
-            A: android:name(0x01010003)="android.intent.category.DEFAULT" (Raw: "android.intent.category.DEFAULT")
-          E: category (line=181)
-            A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")
-      E: activity-alias (line=173)
-        A: android:name(0x01010003)="org.chromium.ViewActivity" (Raw: "org.chromium.ViewActivity")
-        A: android:targetActivity(0x01010202)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        E: intent-filter (line=191)
-          E: action (line=192)
-            A: android:name(0x01010003)="android.intent.action.VIEW" (Raw: "android.intent.action.VIEW")
-          E: data (line=198)
-            A: android:scheme(0x01010027)="http" (Raw: "http")
-          E: data (line=199)
-            A: android:scheme(0x01010027)="https" (Raw: "https")
-      E: meta-data (line=43)
-        A: android:name(0x01010003)="name1" (Raw: "name1")
-        A: android:value(0x01010024)="value1" (Raw: "value1")
-      E: meta-data (line=43)
-        A: android:name(0x01010003)="name2" (Raw: "name2")
-        A: android:value(0x01010024)="value2" (Raw: "value2")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="abc" (Raw: "abc")
-      A: android:name(0x01010003)="org.chromium.RandomJUnit4TestRunner" (Raw: "org.chromium.RandomJUnit4TestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-      A: junit4=(type 0x12)0xffffffff (Raw: "true")
-    E: instrumentation (line=9)
-      A: android:label(0x01010001)="abc" (Raw: "abc")
-      A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-_NO_ISOLATED_SERVICES = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-      E: service (line=7)
-        A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
-"""
-
-_NO_SERVICES = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-"""
-
-_NO_APPLICATION = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-"""
-
-_SINGLE_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="xyz" (Raw: "xyz")
-      A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="xyz" (Raw: "xyz")
-      A: android:name(0x01010003)="org.chromium.RandomJ4TestRunner" (Raw: "org.chromium.RandomJ4TestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-      A: junit4=(type 0x12)0xffffffff (Raw: "true")
-"""
-
-_TARGETING_PRE_RELEASE_Q_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: uses-sdk (line=2)
-      A: android:minSdkVersion(0x0101020c)="Q" (Raw: "Q")
-      A: android:targetSdkVersion(0x01010270)="Q" (Raw: "Q")
-"""
-
-_NO_NAMESPACE_MANIFEST_DUMP = """E: manifest (line=1)
-  A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-  E: instrumentation (line=8)
-    A: http://schemas.android.com/apk/res/android:label(0x01010001)="xyz" (Raw: "xyz")
-    A: http://schemas.android.com/apk/res/android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-    A: http://schemas.android.com/apk/res/android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-# pylint: enable=line-too-long
-
-
-def _MockAaptDump(manifest_dump):
-  return mock.patch(
-      'devil.android.sdk.aapt.Dump',
-      mock.Mock(side_effect=None, return_value=manifest_dump.split('\n')))
-
-
-def _MockListApkPaths(files):
-  return mock.patch('devil.android.apk_helper.ApkHelper._ListApkPaths',
-                    mock.Mock(side_effect=None, return_value=files))
-
-
-class _MockDeviceUtils(object):
-  def __init__(self):
-    self.product_cpu_abi = abis.ARM_64
-    self.product_cpu_abis = [abis.ARM_64, abis.ARM]
-    self.pixel_density = 500
-    self.build_version_sdk = 28
-
-  def GetLocale(self):
-    # pylint: disable=no-self-use
-    return ('en', 'US')
-
-  def GetFeatures(self):
-    # pylint: disable=no-self-use
-    return [
-        'android.hardware.wifi',
-        'android.hardware.nfc',
-    ]
-
-
-class ApkHelperTest(mock_calls.TestCase):
-  def testToHelperApk(self):
-    apk = apk_helper.ToHelper('abc.apk')
-    self.assertTrue(isinstance(apk, apk_helper.ApkHelper))
-
-  def testToHelperApks(self):
-    apk = apk_helper.ToHelper('abc.apks')
-    self.assertTrue(isinstance(apk, apk_helper.ApksHelper))
-
-  def testToHelperBundleScript(self):
-    apk = apk_helper.ToHelper('abc_bundle')
-    self.assertTrue(isinstance(apk, apk_helper.BundleScriptHelper))
-
-  def testToHelperSplitApk(self):
-    apk = apk_helper.ToSplitHelper('abc.apk', ['a.apk', 'b.apk'])
-    self.assertTrue(isinstance(apk, apk_helper.SplitApkHelper))
-
-  def testToHelperSplitException(self):
-    with self.assertRaises(apk_helper.ApkHelperError):
-      apk_helper.ToSplitHelper(
-          apk_helper.ToHelper('abc.apk'), ['a.apk', 'b.apk'])
-
-  def testGetInstrumentationName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      with self.assertRaises(apk_helper.ApkHelperError):
-        helper.GetInstrumentationName()
-
-  def testGetActivityName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals(helper.GetActivityName(),
-                        'org.chromium.abc.MainActivity')
-
-  def testGetViewActivityName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals(helper.GetViewActivityName(),
-                        'org.chromium.ViewActivity')
-
-  def testGetAllInstrumentations(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      all_instrumentations = helper.GetAllInstrumentations()
-      self.assertEquals(len(all_instrumentations), 2)
-      self.assertEquals(all_instrumentations[0]['android:name'],
-                        'org.chromium.RandomJUnit4TestRunner')
-      self.assertEquals(all_instrumentations[1]['android:name'],
-                        'org.chromium.RandomTestRunner')
-
-  def testGetPackageName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals(helper.GetPackageName(), 'org.chromium.abc')
-
-  def testGetPermssions(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      all_permissions = helper.GetPermissions()
-      self.assertEquals(len(all_permissions), 3)
-      self.assertTrue('android.permission.INTERNET' in all_permissions)
-      self.assertTrue(
-          'android.permission.READ_EXTERNAL_STORAGE' in all_permissions)
-      self.assertTrue(
-          'android.permission.ACCESS_FINE_LOCATION' in all_permissions)
-
-  def testGetSplitName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals(helper.GetSplitName(), 'random_split')
-
-  def testHasIsolatedProcesses_noApplication(self):
-    with _MockAaptDump(_NO_APPLICATION):
-      helper = apk_helper.ApkHelper('')
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_noServices(self):
-    with _MockAaptDump(_NO_SERVICES):
-      helper = apk_helper.ApkHelper('')
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_oneNotIsolatedProcess(self):
-    with _MockAaptDump(_NO_ISOLATED_SERVICES):
-      helper = apk_helper.ApkHelper('')
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_oneIsolatedProcess(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertTrue(helper.HasIsolatedProcesses())
-
-  def testGetSingleInstrumentationName(self):
-    with _MockAaptDump(_SINGLE_INSTRUMENTATION_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('org.chromium.RandomTestRunner',
-                        helper.GetInstrumentationName())
-
-  def testGetSingleJUnit4InstrumentationName(self):
-    with _MockAaptDump(_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('org.chromium.RandomJ4TestRunner',
-                        helper.GetInstrumentationName())
-
-  def testGetAllMetadata(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals([('name1', 'value1'), ('name2', 'value2')],
-                        helper.GetAllMetadata())
-
-  def testGetVersionCode(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals(376300010, helper.GetVersionCode())
-
-  def testGetVersionName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('75.0.3763.0', helper.GetVersionName())
-
-  def testGetMinSdkVersion_integerValue(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('21', helper.GetMinSdkVersion())
-
-  def testGetMinSdkVersion_stringValue(self):
-    with _MockAaptDump(_TARGETING_PRE_RELEASE_Q_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('Q', helper.GetMinSdkVersion())
-
-  def testGetTargetSdkVersion_integerValue(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('28', helper.GetTargetSdkVersion())
-
-  def testGetTargetSdkVersion_stringValue(self):
-    with _MockAaptDump(_TARGETING_PRE_RELEASE_Q_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('Q', helper.GetTargetSdkVersion())
-
-  def testGetSingleInstrumentationName_strippedNamespaces(self):
-    with _MockAaptDump(_NO_NAMESPACE_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper('')
-      self.assertEquals('org.chromium.RandomTestRunner',
-                        helper.GetInstrumentationName())
-
-  def testGetArchitectures(self):
-    AbiPair = collections.namedtuple('AbiPair', ['abi32bit', 'abi64bit'])
-    for abi_pair in [
-        AbiPair('lib/' + abis.ARM, 'lib/' + abis.ARM_64),
-        AbiPair('lib/' + abis.X86, 'lib/' + abis.X86_64)
-    ]:
-      with _MockListApkPaths([abi_pair.abi32bit]):
-        helper = apk_helper.ApkHelper('')
-        self.assertEquals(
-            set([
-                os.path.basename(abi_pair.abi32bit),
-                os.path.basename(abi_pair.abi64bit)
-            ]), set(helper.GetAbis()))
-      with _MockListApkPaths([abi_pair.abi32bit, abi_pair.abi64bit]):
-        helper = apk_helper.ApkHelper('')
-        self.assertEquals(
-            set([
-                os.path.basename(abi_pair.abi32bit),
-                os.path.basename(abi_pair.abi64bit)
-            ]), set(helper.GetAbis()))
-      with _MockListApkPaths([abi_pair.abi64bit]):
-        helper = apk_helper.ApkHelper('')
-        self.assertEquals(
-            set([os.path.basename(abi_pair.abi64bit)]), set(helper.GetAbis()))
-
-  def testGetSplitsApk(self):
-    apk = apk_helper.ToHelper('abc.apk')
-    with apk.GetApkPaths(_MockDeviceUtils()) as apk_paths:
-      self.assertEquals(apk_paths, ['abc.apk'])
-
-  def testGetSplitsApkModulesException(self):
-    apk = apk_helper.ToHelper('abc.apk')
-    with self.assertRaises(apk_helper.ApkHelperError):
-      apk.GetApkPaths(None, modules=['a'])
-
-  def testGetSplitsApks(self):
-    apk = apk_helper.ToHelper('abc.apks')
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(),
-         '/tmp'),
-        (mock.call.devil.android.sdk.bundletool.ExtractApks(
-            '/tmp', 'abc.apks', ['arm64-v8a', 'armeabi-v7a'], [('en', 'US')],
-            ['android.hardware.wifi', 'android.hardware.nfc'], 500, 28, None)),
-        (mock.call.os.listdir('/tmp'), ['base-master.apk', 'foo-master.apk']),
-        (mock.call.shutil.rmtree('/tmp')),
-    ),\
-    apk.GetApkPaths(_MockDeviceUtils()) as apk_paths:
-      self.assertEquals(apk_paths,
-                        ['/tmp/base-master.apk', '/tmp/foo-master.apk'])
-
-  def testGetSplitsApksWithModules(self):
-    apk = apk_helper.ToHelper('abc.apks')
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(),
-         '/tmp'),
-        (mock.call.devil.android.sdk.bundletool.ExtractApks(
-            '/tmp', 'abc.apks', ['arm64-v8a', 'armeabi-v7a'], [('en', 'US')],
-            ['android.hardware.wifi', 'android.hardware.nfc'], 500, 28,
-            ['bar'])),
-        (mock.call.os.listdir('/tmp'),
-         ['base-master.apk', 'foo-master.apk', 'bar-master.apk']),
-        (mock.call.shutil.rmtree('/tmp')),
-    ),\
-    apk.GetApkPaths(_MockDeviceUtils(), ['bar']) as apk_paths:
-      self.assertEquals(apk_paths, [
-          '/tmp/base-master.apk', '/tmp/foo-master.apk', '/tmp/bar-master.apk'
-      ])
-
-  def testGetSplitsApksWithAdditionalLocales(self):
-    apk = apk_helper.ToHelper('abc.apks')
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(),
-         '/tmp'),
-        (mock.call.devil.android.sdk.bundletool.ExtractApks(
-            '/tmp', 'abc.apks', ['arm64-v8a', 'armeabi-v7a'],
-            [('en', 'US'), ('es', 'ES'), ('fr', 'CA')],
-            ['android.hardware.wifi', 'android.hardware.nfc'], 500, 28, None)),
-        (mock.call.os.listdir('/tmp'),
-         ['base-master.apk', 'base-es.apk', 'base-fr.apk']),
-        (mock.call.shutil.rmtree('/tmp')),
-    ),\
-        apk.GetApkPaths(_MockDeviceUtils(),
-                        additional_locales=['es-ES', 'fr-CA']) as apk_paths:
-      self.assertEquals(
-          apk_paths,
-          ['/tmp/base-master.apk', '/tmp/base-es.apk', '/tmp/base-fr.apk'])
-
-  def testGetSplitsApksWithAdditionalLocalesIncorrectFormat(self):
-    apk = apk_helper.ToHelper('abc.apks')
-    with self.assertRaises(apk_helper.ApkHelperError):
-      apk.GetApkPaths(_MockDeviceUtils(), additional_locales=['es'])
-
-  def testGetSplitsSplitApk(self):
-    apk = apk_helper.ToSplitHelper('base.apk',
-                                   ['split1.apk', 'split2.apk', 'split3.apk'])
-    device = _MockDeviceUtils()
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            device,
-            'base.apk', ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False), ['split2.apk'])),\
-      apk.GetApkPaths(device) as apk_paths:
-      self.assertEquals(apk_paths, ['base.apk', 'split2.apk'])
-
-  def testGetSplitsBundleScript(self):
-    apk = apk_helper.ToHelper('abc_bundle')
-    device = _MockDeviceUtils()
-    with self.assertCalls(
-        (mock.call.tempfile.mkstemp(suffix='.apks'), (0, '/tmp/abc.apks')),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusOutputAndError([
-            'abc_bundle', 'build-bundle-apks', '--output-apks', '/tmp/abc.apks'
-        ]), (0, '', '')),
-        (mock.call.tempfile.mkdtemp(), '/tmp2'),
-        (mock.call.devil.android.sdk.bundletool.ExtractApks(
-            '/tmp2', '/tmp/abc.apks', ['arm64-v8a', 'armeabi-v7a'],
-            [('en', 'US')], ['android.hardware.wifi', 'android.hardware.nfc'],
-            500, 28, ['bar'])),
-        (mock.call.os.listdir('/tmp2'), ['base-master.apk', 'bar-master.apk']),
-        (mock.call.os.path.isfile('/tmp/abc.apks'), True),
-        (mock.call.os.remove('/tmp/abc.apks')),
-        (mock.call.os.path.isfile('/tmp2'), False),
-        (mock.call.os.path.isdir('/tmp2'), True),
-        (mock.call.shutil.rmtree('/tmp2')),
-    ),\
-    apk.GetApkPaths(device, modules=['bar']) as apk_paths:
-      self.assertEquals(apk_paths,
-                        ['/tmp2/base-master.apk', '/tmp2/bar-master.apk'])
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/app_ui.py b/systrace/catapult/devil/devil/android/app_ui.py
deleted file mode 100644
index 4f7af1d..0000000
--- a/systrace/catapult/devil/devil/android/app_ui.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provides functionality to interact with UI elements of an Android app."""
-
-import collections
-import re
-from xml.etree import ElementTree as element_tree
-
-from devil.android import decorators
-from devil.android import device_temp_file
-from devil.utils import geometry
-from devil.utils import timeout_retry
-
-_DEFAULT_SHORT_TIMEOUT = 10
-_DEFAULT_SHORT_RETRIES = 3
-_DEFAULT_LONG_TIMEOUT = 30
-_DEFAULT_LONG_RETRIES = 0
-
-# Parse rectangle bounds given as: '[left,top][right,bottom]'.
-_RE_BOUNDS = re.compile(
-    r'\[(?P<left>\d+),(?P<top>\d+)\]\[(?P<right>\d+),(?P<bottom>\d+)\]')
-
-
-class _UiNode(object):
-  def __init__(self, device, xml_node, package=None):
-    """Object to interact with a UI node from an xml snapshot.
-
-    Note: there is usually no need to call this constructor directly. Instead,
-    use an AppUi object (below) to grab an xml screenshot from a device and
-    find nodes in it.
-
-    Args:
-      device: A device_utils.DeviceUtils instance.
-      xml_node: An ElementTree instance of the node to interact with.
-      package: An optional package name for the app owning this node.
-    """
-    self._device = device
-    self._xml_node = xml_node
-    self._package = package
-
-  def _GetAttribute(self, key):
-    """Get the value of an attribute of this node."""
-    return self._xml_node.attrib.get(key)
-
-  @property
-  def bounds(self):
-    """Get a rectangle with the bounds of this UI node.
-
-    Returns:
-      A geometry.Rectangle instance.
-    """
-    d = _RE_BOUNDS.match(self._GetAttribute('bounds')).groupdict()
-    return geometry.Rectangle.FromDict({k: int(v) for k, v in d.items()})
-
-  def Tap(self, point=None, dp_units=False):
-    """Send a tap event to the UI node.
-
-    Args:
-      point: An optional geometry.Point instance indicating the location to
-        tap, relative to the bounds of the UI node, i.e. (0, 0) taps the
-        top-left corner. If ommited, the center of the node is tapped.
-      dp_units: If True, indicates that the coordinates of the point are given
-        in device-independent pixels; otherwise they are assumed to be "real"
-        pixels. This option has no effect when the point is ommited.
-    """
-    if point is None:
-      point = self.bounds.center
-    else:
-      if dp_units:
-        point = (float(self._device.pixel_density) / 160) * point
-      point += self.bounds.top_left
-
-    x, y = (str(int(v)) for v in point)
-    self._device.RunShellCommand(['input', 'tap', x, y], check_return=True)
-
-  def Dump(self):
-    """Get a brief summary of the child nodes that can be found on this node.
-
-    Returns:
-      A list of lines that can be logged or otherwise printed.
-    """
-    summary = collections.defaultdict(set)
-    for node in self._xml_node.iter():
-      package = node.get('package') or '(no package)'
-      label = node.get('resource-id') or '(no id)'
-      text = node.get('text')
-      if text:
-        label = '%s[%r]' % (label, text)
-      summary[package].add(label)
-    lines = []
-    for package, labels in sorted(summary.iteritems()):
-      lines.append('- %s:' % package)
-      for label in sorted(labels):
-        lines.append('  - %s' % label)
-    return lines
-
-  def __getitem__(self, key):
-    """Retrieve a child of this node by its index.
-
-    Args:
-      key: An integer with the index of the child to retrieve.
-    Returns:
-      A UI node instance of the selected child.
-    Raises:
-      IndexError if the index is out of range.
-    """
-    return type(self)(self._device, self._xml_node[key], package=self._package)
-
-  def _Find(self, **kwargs):
-    """Find the first descendant node that matches a given criteria.
-
-    Note: clients would usually call AppUi.GetUiNode or AppUi.WaitForUiNode
-    instead.
-
-    For example:
-
-      app = app_ui.AppUi(device, package='org.my.app')
-      app.GetUiNode(resource_id='some_element', text='hello')
-
-    would retrieve the first matching node with both of the xml attributes:
-
-      resource-id='org.my.app:id/some_element'
-      text='hello'
-
-    As the example shows, if given and needed, the value of the resource_id key
-    is auto-completed with the package name specified in the AppUi constructor.
-
-    Args:
-      Arguments are specified as key-value pairs, where keys correnspond to
-      attribute names in xml nodes (replacing any '-' with '_' to make them
-      valid identifiers). At least one argument must be supplied, and arguments
-      with a None value are ignored.
-    Returns:
-      A UI node instance of the first descendant node that matches ALL the
-      given key-value criteria; or None if no such node is found.
-    Raises:
-      TypeError if no search arguments are provided.
-    """
-    matches_criteria = self._NodeMatcher(kwargs)
-    for node in self._xml_node.iter():
-      if matches_criteria(node):
-        return type(self)(self._device, node, package=self._package)
-    return None
-
-  def _NodeMatcher(self, kwargs):
-    # Auto-complete resource-id's using the package name if available.
-    resource_id = kwargs.get('resource_id')
-    if (resource_id is not None and self._package is not None
-        and ':id/' not in resource_id):
-      kwargs['resource_id'] = '%s:id/%s' % (self._package, resource_id)
-
-    criteria = [(k.replace('_', '-'), v) for k, v in kwargs.items()
-                if v is not None]
-    if not criteria:
-      raise TypeError('At least one search criteria should be specified')
-    return lambda node: all(node.get(k) == v for k, v in criteria)
-
-
-class AppUi(object):
-  # timeout and retry arguments appear unused, but are handled by decorator.
-  # pylint: disable=unused-argument
-
-  def __init__(self, device, package=None):
-    """Object to interact with the UI of an Android app.
-
-    Args:
-      device: A device_utils.DeviceUtils instance.
-      package: An optional package name for the app.
-    """
-    self._device = device
-    self._package = package
-
-  @property
-  def package(self):
-    return self._package
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_SHORT_TIMEOUT,
-                                            _DEFAULT_SHORT_RETRIES)
-  def _GetRootUiNode(self, timeout=None, retries=None):
-    """Get a node pointing to the root of the UI nodes on screen.
-
-    Note: This is currently implemented via adb calls to uiatomator and it
-    is *slow*, ~2 secs per call. Do not rely on low-level implementation
-    details that may change in the future.
-
-    TODO(crbug.com/567217): Swap to a more efficient implementation.
-
-    Args:
-      timeout: A number of seconds to wait for the uiautomator dump.
-      retries: Number of times to retry if the adb command fails.
-    Returns:
-      A UI node instance pointing to the root of the xml screenshot.
-    """
-    with device_temp_file.DeviceTempFile(self._device.adb) as dtemp:
-      output = self._device.RunShellCommand(
-          ['uiautomator', 'dump', dtemp.name], single_line=True,
-          check_return=True)
-      if output.startswith('ERROR:'):
-        raise RuntimeError(
-            'uiautomator dump command returned error: {}'.format(output))
-      xml_node = element_tree.fromstring(
-          self._device.ReadFile(dtemp.name, force_pull=True))
-    return _UiNode(self._device, xml_node, package=self._package)
-
-  def ScreenDump(self):
-    """Get a brief summary of the nodes that can be found on the screen.
-
-    Returns:
-      A list of lines that can be logged or otherwise printed.
-    """
-    return self._GetRootUiNode().Dump()
-
-  def GetUiNode(self, **kwargs):
-    """Get the first node found matching a specified criteria.
-
-    Args:
-      See _UiNode._Find.
-    Returns:
-      A UI node instance of the node if found, otherwise None.
-    """
-    # pylint: disable=protected-access
-    return self._GetRootUiNode()._Find(**kwargs)
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_LONG_TIMEOUT,
-                                            _DEFAULT_LONG_RETRIES)
-  def WaitForUiNode(self, timeout=None, retries=None, **kwargs):
-    """Wait for a node matching a given criteria to appear on the screen.
-
-    Args:
-      timeout: A number of seconds to wait for the matching node to appear.
-      retries: Number of times to retry in case of adb command errors.
-      For other args, to specify the search criteria, see _UiNode._Find.
-    Returns:
-      The UI node instance found.
-    Raises:
-      device_errors.CommandTimeoutError if the node is not found before the
-      timeout.
-    """
-
-    def node_found():
-      return self.GetUiNode(**kwargs)
-
-    return timeout_retry.WaitFor(node_found)
diff --git a/systrace/catapult/devil/devil/android/app_ui_test.py b/systrace/catapult/devil/devil/android/app_ui_test.py
deleted file mode 100644
index 50f00ca..0000000
--- a/systrace/catapult/devil/devil/android/app_ui_test.py
+++ /dev/null
@@ -1,191 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Unit tests for the app_ui module."""
-
-import unittest
-from xml.etree import ElementTree as element_tree
-
-from devil import devil_env
-from devil.android import app_ui
-from devil.android import device_errors
-from devil.utils import geometry
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-MOCK_XML_LOADING = '''
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<hierarchy rotation="0">
-  <node bounds="[0,50][1536,178]" content-desc="Loading"
-      resource-id="com.example.app:id/spinner"/>
-</hierarchy>
-'''.strip()
-
-MOCK_XML_LOADED = '''
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<hierarchy rotation="0">
-  <node bounds="[0,50][1536,178]" content-desc=""
-      resource-id="com.example.app:id/toolbar">
-    <node bounds="[0,58][112,170]" content-desc="Open navigation drawer"/>
-    <node bounds="[121,50][1536,178]"
-        resource-id="com.example.app:id/actionbar_custom_view">
-      <node bounds="[121,50][1424,178]"
-          resource-id="com.example.app:id/actionbar_title" text="Primary"/>
-      <node bounds="[1424,50][1536,178]" content-desc="Search"
-          resource-id="com.example.app:id/actionbar_search_button"/>
-    </node>
-  </node>
-  <node bounds="[0,178][576,1952]" resource-id="com.example.app:id/drawer">
-    <node bounds="[0,178][144,1952]"
-        resource-id="com.example.app:id/mini_drawer">
-      <node bounds="[40,254][104,318]" resource-id="com.example.app:id/avatar"/>
-      <node bounds="[16,354][128,466]" content-desc="Primary"
-          resource-id="com.example.app:id/image_view"/>
-      <node bounds="[16,466][128,578]" content-desc="Social"
-          resource-id="com.example.app:id/image_view"/>
-      <node bounds="[16,578][128,690]" content-desc="Promotions"
-          resource-id="com.example.app:id/image_view"/>
-    </node>
-  </node>
-</hierarchy>
-'''.strip()
-
-
-class UiAppTest(unittest.TestCase):
-  def setUp(self):
-    self.device = mock.Mock()
-    self.device.pixel_density = 320  # Each dp pixel is 2 real pixels.
-    self.app = app_ui.AppUi(self.device, package='com.example.app')
-    self._setMockXmlScreenshots([MOCK_XML_LOADED])
-
-  def _setMockXmlScreenshots(self, xml_docs):
-    """Mock self.app._GetRootUiNode to load nodes from some test xml_docs.
-
-    Each time the method is called it will return a UI node for each string
-    given in |xml_docs|, or rise a time out error when the list is exhausted.
-    """
-
-    # pylint: disable=protected-access
-    def get_mock_root_ui_node(value):
-      if isinstance(value, Exception):
-        raise value
-      return app_ui._UiNode(self.device, element_tree.fromstring(value),
-                            self.app.package)
-
-    xml_docs.append(device_errors.CommandTimeoutError('Timed out!'))
-
-    self.app._GetRootUiNode = mock.Mock(
-        side_effect=(get_mock_root_ui_node(doc) for doc in xml_docs))
-
-  def assertNodeHasAttribs(self, node, attr):
-    # pylint: disable=protected-access
-    for key, value in attr.items():
-      self.assertEquals(node._GetAttribute(key), value)
-
-  def assertTappedOnceAt(self, x, y):
-    self.device.RunShellCommand.assert_called_once_with(
-        ['input', 'tap', str(x), str(y)], check_return=True)
-
-  def testFind_byText(self):
-    node = self.app.GetUiNode(text='Primary')
-    self.assertNodeHasAttribs(
-        node, {
-            'text': 'Primary',
-            'content-desc': None,
-            'resource-id': 'com.example.app:id/actionbar_title',
-        })
-    self.assertEquals(node.bounds, geometry.Rectangle([121, 50], [1424, 178]))
-
-  def testFind_byContentDesc(self):
-    node = self.app.GetUiNode(content_desc='Social')
-    self.assertNodeHasAttribs(
-        node, {
-            'text': None,
-            'content-desc': 'Social',
-            'resource-id': 'com.example.app:id/image_view',
-        })
-    self.assertEquals(node.bounds, geometry.Rectangle([16, 466], [128, 578]))
-
-  def testFind_byResourceId_autocompleted(self):
-    node = self.app.GetUiNode(resource_id='image_view')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Primary',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-
-  def testFind_byResourceId_absolute(self):
-    node = self.app.GetUiNode(resource_id='com.example.app:id/image_view')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Primary',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-
-  def testFind_byMultiple(self):
-    node = self.app.GetUiNode(
-        resource_id='image_view', content_desc='Promotions')
-    self.assertNodeHasAttribs(
-        node, {
-            'content-desc': 'Promotions',
-            'resource-id': 'com.example.app:id/image_view',
-        })
-    self.assertEquals(node.bounds, geometry.Rectangle([16, 578], [128, 690]))
-
-  def testFind_notFound(self):
-    node = self.app.GetUiNode(resource_id='does_not_exist')
-    self.assertIsNone(node)
-
-  def testFind_noArgsGiven(self):
-    # Same exception given by Python for a function call with not enough args.
-    with self.assertRaises(TypeError):
-      self.app.GetUiNode()
-
-  def testGetChildren(self):
-    node = self.app.GetUiNode(resource_id='mini_drawer')
-    self.assertNodeHasAttribs(node[0],
-                              {'resource-id': 'com.example.app:id/avatar'})
-    self.assertNodeHasAttribs(node[1], {'content-desc': 'Primary'})
-    self.assertNodeHasAttribs(node[2], {'content-desc': 'Social'})
-    self.assertNodeHasAttribs(node[3], {'content-desc': 'Promotions'})
-    with self.assertRaises(IndexError):
-      # pylint: disable=pointless-statement
-      node[4]
-
-  def testTap_center(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap()
-    self.assertTappedOnceAt(56, 114)
-
-  def testTap_topleft(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(0, 0))
-    self.assertTappedOnceAt(0, 58)
-
-  def testTap_withOffset(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(10, 20))
-    self.assertTappedOnceAt(10, 78)
-
-  def testTap_withOffsetInDp(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(10, 20), dp_units=True)
-    self.assertTappedOnceAt(20, 98)
-
-  def testTap_dpUnitsIgnored(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(dp_units=True)
-    self.assertTappedOnceAt(56, 114)  # Still taps at center.
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForUiNode_found(self):
-    self._setMockXmlScreenshots(
-        [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADED])
-    node = self.app.WaitForUiNode(resource_id='actionbar_title')
-    self.assertNodeHasAttribs(node, {'text': 'Primary'})
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForUiNode_notFound(self):
-    self._setMockXmlScreenshots(
-        [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADING])
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      self.app.WaitForUiNode(resource_id='actionbar_title')
diff --git a/systrace/catapult/devil/devil/android/battery_utils.py b/systrace/catapult/devil/devil/android/battery_utils.py
deleted file mode 100644
index d680f03..0000000
--- a/systrace/catapult/devil/devil/android/battery_utils.py
+++ /dev/null
@@ -1,686 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provides a variety of device interactions with power.
-"""
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import csv
-import logging
-
-from devil.android import crash_handler
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.sdk import version_codes
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-_DEVICE_PROFILES = [
-    {
-    'name': ['Nexus 4'],
-    'enable_command': (
-        'echo 0 > /sys/module/pm8921_charger/parameters/disabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 1 > /sys/module/pm8921_charger/parameters/disabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-    },
-    {
-    'name': ['Nexus 5'],
-    # Nexus 5
-    # Setting the HIZ bit of the bq24192 causes the charger to actually ignore
-    # energy coming from USB. Setting the power_supply offline just updates the
-    # Android system to reflect that.
-    'enable_command': (
-        'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 1 > /sys/class/power_supply/usb/online && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 0 > /sys/class/power_supply/usb/online && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-    },
-    {
-    'name': ['Nexus 6'],
-    'enable_command': (
-        'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': (
-        '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
-    'current': '/sys/class/power_supply/max170xx_battery/current_now',
-    },
-    {
-    'name': ['Nexus 9'],
-    'enable_command': (
-        'echo Disconnected > '
-        '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo Connected > '
-        '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': '/sys/class/power_supply/battery/charge_counter_ext',
-    'voltage': '/sys/class/power_supply/battery/voltage_now',
-    'current': '/sys/class/power_supply/battery/current_now',
-    },
-    {
-    'name': ['Nexus 10'],
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
-
-    },
-    {
-    'name': ['Nexus 5X'],
-    'enable_command': (
-        'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-    },
-    { # Galaxy s5
-    'name': ['SM-G900H'],
-    'enable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
-        'echo 0 > /sys/class/power_supply/battery/test_mode && '
-        'echo 9999 > /sys/class/power_supply/sec-charger/current_now &&'
-        'dumpsys battery reset'),
-    'disable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
-        'echo 1 > /sys/class/power_supply/battery/test_mode && '
-        'echo 0 > /sys/class/power_supply/sec-charger/current_now && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/sec-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/sec-charger/current_now',
-    },
-    { # Galaxy s6, Galaxy s6, Galaxy s6 edge
-    'name': ['SM-G920F', 'SM-G920V', 'SM-G925V'],
-    'enable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
-        'echo 0 > /sys/class/power_supply/battery/test_mode && '
-        'echo 9999 > /sys/class/power_supply/max77843-charger/current_now &&'
-        'dumpsys battery reset'),
-    'disable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
-        'echo 1 > /sys/class/power_supply/battery/test_mode && '
-        'echo 0 > /sys/class/power_supply/max77843-charger/current_now && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/max77843-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/max77843-charger/current_now',
-    },
-    { # Cherry Mobile One
-    'name': ['W6210 (4560MMX_b fingerprint)'],
-    'enable_command': (
-        'echo "0 0" > /proc/mtk_battery_cmd/current_cmd && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo "0 1" > /proc/mtk_battery_cmd/current_cmd && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-    },
-]
-
-# The list of useful dumpsys columns.
-# Index of the column containing the format version.
-_DUMP_VERSION_INDEX = 0
-# Index of the column containing the type of the row.
-_ROW_TYPE_INDEX = 3
-# Index of the column containing the uid.
-_PACKAGE_UID_INDEX = 4
-# Index of the column containing the application package.
-_PACKAGE_NAME_INDEX = 5
-# The column containing the uid of the power data.
-_PWI_UID_INDEX = 1
-# The column containing the type of consumption. Only consumption since last
-# charge are of interest here.
-_PWI_AGGREGATION_INDEX = 2
-_PWS_AGGREGATION_INDEX = _PWI_AGGREGATION_INDEX
-# The column containing the amount of power used, in mah.
-_PWI_POWER_CONSUMPTION_INDEX = 5
-_PWS_POWER_CONSUMPTION_INDEX = _PWI_POWER_CONSUMPTION_INDEX
-
-_MAX_CHARGE_ERROR = 20
-
-
-class BatteryUtils(object):
-  def __init__(self,
-               device,
-               default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """BatteryUtils constructor.
-
-      Args:
-        device: A DeviceUtils instance.
-        default_timeout: An integer containing the default number of seconds to
-                         wait for an operation to complete if no explicit value
-                         is provided.
-        default_retries: An integer containing the default number or times an
-                         operation should be retried on failure if no explicit
-                         value is provided.
-      Raises:
-        TypeError: If it is not passed a DeviceUtils instance.
-    """
-    if not isinstance(device, device_utils.DeviceUtils):
-      raise TypeError('Must be initialized with DeviceUtils object.')
-    self._device = device
-    self._cache = device.GetClientCache(self.__class__.__name__)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SupportsFuelGauge(self, timeout=None, retries=None):
-    """Detect if fuel gauge chip is present.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if known fuel gauge files are present.
-      False otherwise.
-    """
-    self._DiscoverDeviceProfile()
-    return (self._cache['profile']['enable_command'] != None
-            and self._cache['profile']['charge_counter'] != None)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetFuelGaugeChargeCounter(self, timeout=None, retries=None):
-    """Get value of charge_counter on fuel gauge chip.
-
-    Device must have charging disabled for this, not just battery updates
-    disabled. The only device that this currently works with is the nexus 5.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      value of charge_counter for fuel gauge chip in units of nAh.
-
-    Raises:
-      device_errors.CommandFailedError: If fuel gauge chip not found.
-    """
-    if self.SupportsFuelGauge():
-      return int(
-          self._device.ReadFile(self._cache['profile']['charge_counter']))
-    raise device_errors.CommandFailedError('Unable to find fuel gauge.')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPowerData(self, timeout=None, retries=None):
-    """Get power data for device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Dict containing system power, and a per-package power dict keyed on
-      package names.
-      {
-        'system_total': 23.1,
-        'per_package' : {
-          package_name: {
-            'uid': uid,
-            'data': [1,2,3]
-          },
-        }
-      }
-    """
-    if 'uids' not in self._cache:
-      self._cache['uids'] = {}
-    dumpsys_output = self._device.RunShellCommand(
-        ['dumpsys', 'batterystats', '-c'], check_return=True, large_output=True)
-    csvreader = csv.reader(dumpsys_output)
-    pwi_entries = collections.defaultdict(list)
-    system_total = None
-    for entry in csvreader:
-      if entry[_DUMP_VERSION_INDEX] not in ['8', '9']:
-        # Wrong dumpsys version.
-        raise device_errors.DeviceVersionError(
-            'Dumpsys version must be 8 or 9. "%s" found.' %
-            entry[_DUMP_VERSION_INDEX])
-      if _ROW_TYPE_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'uid':
-        current_package = entry[_PACKAGE_NAME_INDEX]
-        if (self._cache['uids'].get(current_package)
-            and self._cache['uids'].get(current_package) !=
-            entry[_PACKAGE_UID_INDEX]):
-          raise device_errors.CommandFailedError(
-              'Package %s found multiple times with different UIDs %s and %s' %
-              (current_package, self._cache['uids'][current_package],
-               entry[_PACKAGE_UID_INDEX]))
-        self._cache['uids'][current_package] = entry[_PACKAGE_UID_INDEX]
-      elif (_PWI_POWER_CONSUMPTION_INDEX < len(entry)
-            and entry[_ROW_TYPE_INDEX] == 'pwi'
-            and entry[_PWI_AGGREGATION_INDEX] == 'l'):
-        pwi_entries[entry[_PWI_UID_INDEX]].append(
-            float(entry[_PWI_POWER_CONSUMPTION_INDEX]))
-      elif (_PWS_POWER_CONSUMPTION_INDEX < len(entry)
-            and entry[_ROW_TYPE_INDEX] == 'pws'
-            and entry[_PWS_AGGREGATION_INDEX] == 'l'):
-        # This entry should only appear once.
-        assert system_total is None
-        system_total = float(entry[_PWS_POWER_CONSUMPTION_INDEX])
-
-    per_package = {
-        p: {
-            'uid': uid,
-            'data': pwi_entries[uid]
-        }
-        for p, uid in self._cache['uids'].items()
-    }
-    return {'system_total': system_total, 'per_package': per_package}
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetBatteryInfo(self, timeout=None, retries=None):
-    """Gets battery info for the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    Returns:
-      A dict containing various battery information as reported by dumpsys
-      battery.
-    """
-    result = {}
-    # Skip the first line, which is just a header.
-    for line in self._device.RunShellCommand(['dumpsys', 'battery'],
-                                             check_return=True)[1:]:
-      # If usb charging has been disabled, an extra line of header exists.
-      if 'UPDATES STOPPED' in line:
-        logger.warning('Dumpsys battery not receiving updates. '
-                       'Run dumpsys battery reset if this is in error.')
-      elif ':' not in line:
-        logger.warning('Unknown line found in dumpsys battery: "%s"', line)
-      else:
-        k, v = line.split(':', 1)
-        result[k.strip()] = v.strip()
-    return result
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetCharging(self, timeout=None, retries=None):
-    """Gets the charging state of the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    Returns:
-      True if the device is charging, false otherwise.
-    """
-
-    # Wrapper function so that we can use `RetryOnSystemCrash`.
-    def GetBatteryInfoHelper(device):
-      return self.GetBatteryInfo()
-
-    battery_info = crash_handler.RetryOnSystemCrash(GetBatteryInfoHelper,
-                                                    self._device)
-    for k in ('AC powered', 'USB powered', 'Wireless powered'):
-      if (k in battery_info
-          and battery_info[k].lower() in ('true', '1', 'yes')):
-        return True
-    return False
-
-  # TODO(rnephew): Make private when all use cases can use the context manager.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DisableBatteryUpdates(self, timeout=None, retries=None):
-    """Resets battery data and makes device appear like it is not
-    charging so that it will collect power data since last charge.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.CommandFailedError: When resetting batterystats fails to
-        reset power values.
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-
-    def battery_updates_disabled():
-      return self.GetCharging() is False
-
-    self._ClearPowerData()
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'ac', '0'],
-                                 check_return=True)
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'usb', '0'],
-                                 check_return=True)
-    timeout_retry.WaitFor(battery_updates_disabled, wait_period=1)
-
-  # TODO(rnephew): Make private when all use cases can use the context manager.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def EnableBatteryUpdates(self, timeout=None, retries=None):
-    """Restarts device charging so that dumpsys no longer collects power data.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-
-    def battery_updates_enabled():
-      return (self.GetCharging()
-              or not bool('UPDATES STOPPED' in self._device.RunShellCommand(
-                  ['dumpsys', 'battery'], check_return=True)))
-
-    self._device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                 check_return=True)
-    timeout_retry.WaitFor(battery_updates_enabled, wait_period=1)
-
-  @contextlib.contextmanager
-  def BatteryMeasurement(self, timeout=None, retries=None):
-    """Context manager that enables battery data collection. It makes
-    the device appear to stop charging so that dumpsys will start collecting
-    power data since last charge. Once the with block is exited, charging is
-    resumed and power data since last charge is no longer collected.
-
-    Only for devices L and higher.
-
-    Example usage:
-      with BatteryMeasurement():
-        browser_actions()
-        get_power_data() # report usage within this block
-      after_measurements() # Anything that runs after power
-                           # measurements are collected
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    if self._device.build_version_sdk < version_codes.LOLLIPOP:
-      raise device_errors.DeviceVersionError('Device must be L or higher.')
-    try:
-      self.DisableBatteryUpdates(timeout=timeout, retries=retries)
-      yield
-    finally:
-      self.EnableBatteryUpdates(timeout=timeout, retries=retries)
-
-  def _DischargeDevice(self, percent, wait_period=120):
-    """Disables charging and waits for device to discharge given amount
-
-    Args:
-      percent: level of charge to discharge.
-
-    Raises:
-      ValueError: If percent is not between 1 and 99.
-    """
-    battery_level = int(self.GetBatteryInfo().get('level'))
-    if not 0 < percent < 100:
-      raise ValueError(
-          'Discharge amount(%s) must be between 1 and 99' % percent)
-    if battery_level is None:
-      logger.warning('Unable to find current battery level. Cannot discharge.')
-      return
-    # Do not discharge if it would make battery level too low.
-    if percent >= battery_level - 10:
-      logger.warning(
-          'Battery is too low or discharge amount requested is too '
-          'high. Cannot discharge phone %s percent.', percent)
-      return
-
-    self._HardwareSetCharging(False)
-
-    def device_discharged():
-      self._HardwareSetCharging(True)
-      current_level = int(self.GetBatteryInfo().get('level'))
-      logger.info('current battery level: %s', current_level)
-      if battery_level - current_level >= percent:
-        return True
-      self._HardwareSetCharging(False)
-      return False
-
-    timeout_retry.WaitFor(device_discharged, wait_period=wait_period)
-
-  def ChargeDeviceToLevel(self, level, wait_period=60):
-    """Enables charging and waits for device to be charged to given level.
-
-    Args:
-      level: level of charge to wait for.
-      wait_period: time in seconds to wait between checking.
-    Raises:
-      device_errors.DeviceChargingError: If error while charging is detected.
-    """
-    self.SetCharging(True)
-    charge_status = {'charge_failure_count': 0, 'last_charge_value': 0}
-
-    def device_charged():
-      battery_level = self.GetBatteryInfo().get('level')
-      if battery_level is None:
-        logger.warning('Unable to find current battery level.')
-        battery_level = 100
-      else:
-        logger.info('current battery level: %s', battery_level)
-        battery_level = int(battery_level)
-
-      # Use > so that it will not reset if charge is going down.
-      if battery_level > charge_status['last_charge_value']:
-        charge_status['last_charge_value'] = battery_level
-        charge_status['charge_failure_count'] = 0
-      else:
-        charge_status['charge_failure_count'] += 1
-
-      if (not battery_level >= level
-          and charge_status['charge_failure_count'] >= _MAX_CHARGE_ERROR):
-        raise device_errors.DeviceChargingError(
-            'Device not charging properly. Current level:%s Previous level:%s' %
-            (battery_level, charge_status['last_charge_value']))
-      return battery_level >= level
-
-    timeout_retry.WaitFor(device_charged, wait_period=wait_period)
-
-  def LetBatteryCoolToTemperature(self, target_temp, wait_period=180):
-    """Lets device sit to give battery time to cool down
-    Args:
-      temp: maximum temperature to allow in tenths of degrees c.
-      wait_period: time in seconds to wait between checking.
-    """
-
-    def cool_device():
-      temp = self.GetBatteryInfo().get('temperature')
-      if temp is None:
-        logger.warning('Unable to find current battery temperature.')
-        temp = 0
-      else:
-        logger.info('Current battery temperature: %s', temp)
-      if int(temp) <= target_temp:
-        return True
-      else:
-        if 'Nexus 5' in self._cache['profile']['name']:
-          self._DischargeDevice(1)
-        return False
-
-    self._DiscoverDeviceProfile()
-    self.EnableBatteryUpdates()
-    logger.info('Waiting for the device to cool down to %s (0.1 C)',
-                target_temp)
-    timeout_retry.WaitFor(cool_device, wait_period=wait_period)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetCharging(self, enabled, timeout=None, retries=None):
-    """Enables or disables charging on the device.
-
-    Args:
-      enabled: A boolean indicating whether charging should be enabled or
-        disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    if self.GetCharging() == enabled:
-      logger.warning('Device charging already in expected state: %s', enabled)
-      return
-
-    self._DiscoverDeviceProfile()
-    if enabled:
-      if self._cache['profile']['enable_command']:
-        self._HardwareSetCharging(enabled)
-      else:
-        logger.info('Unable to enable charging via hardware. '
-                    'Falling back to software enabling.')
-        self.EnableBatteryUpdates()
-    else:
-      if self._cache['profile']['enable_command']:
-        self._ClearPowerData()
-        self._HardwareSetCharging(enabled)
-      else:
-        logger.info('Unable to disable charging via hardware. '
-                    'Falling back to software disabling.')
-        self.DisableBatteryUpdates()
-
-  def _HardwareSetCharging(self, enabled, timeout=None, retries=None):
-    """Enables or disables charging on the device.
-
-    Args:
-      enabled: A boolean indicating whether charging should be enabled or
-        disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.CommandFailedError: If method of disabling charging cannot
-        be determined.
-    """
-    self._DiscoverDeviceProfile()
-    if not self._cache['profile']['enable_command']:
-      raise device_errors.CommandFailedError(
-          'Unable to find charging commands.')
-
-    command = (self._cache['profile']['enable_command']
-               if enabled else self._cache['profile']['disable_command'])
-
-    def verify_charging():
-      return self.GetCharging() == enabled
-
-    self._device.RunShellCommand(
-        command, shell=True, check_return=True, as_root=True, large_output=True)
-    timeout_retry.WaitFor(verify_charging, wait_period=1)
-
-  @contextlib.contextmanager
-  def PowerMeasurement(self, timeout=None, retries=None):
-    """Context manager that enables battery power collection.
-
-    Once the with block is exited, charging is resumed. Will attempt to disable
-    charging at the hardware level, and if that fails will fall back to software
-    disabling of battery updates.
-
-    Only for devices L and higher.
-
-    Example usage:
-      with PowerMeasurement():
-        browser_actions()
-        get_power_data() # report usage within this block
-      after_measurements() # Anything that runs after power
-                           # measurements are collected
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    try:
-      self.SetCharging(False, timeout=timeout, retries=retries)
-      yield
-    finally:
-      self.SetCharging(True, timeout=timeout, retries=retries)
-
-  def _ClearPowerData(self):
-    """Resets battery data and makes device appear like it is not
-    charging so that it will collect power data since last charge.
-
-    Returns:
-      True if power data cleared.
-      False if power data clearing is not supported (pre-L)
-
-    Raises:
-      device_errors.DeviceVersionError: If power clearing is supported,
-        but fails.
-    """
-    if self._device.build_version_sdk < version_codes.LOLLIPOP:
-      logger.warning('Dumpsys power data only available on 5.0 and above. '
-                     'Cannot clear power data.')
-      return False
-
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'usb', '1'],
-                                 check_return=True)
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'ac', '1'],
-                                 check_return=True)
-
-    def test_if_clear():
-      self._device.RunShellCommand(['dumpsys', 'batterystats', '--reset'],
-                                   check_return=True)
-      battery_data = self._device.RunShellCommand(
-          ['dumpsys', 'batterystats', '--charged', '-c'],
-          check_return=True,
-          large_output=True)
-      for line in battery_data:
-        l = line.split(',')
-        if (len(l) > _PWI_POWER_CONSUMPTION_INDEX
-            and l[_ROW_TYPE_INDEX] == 'pwi'
-            and float(l[_PWI_POWER_CONSUMPTION_INDEX]) != 0.0):
-          return False
-      return True
-
-    try:
-      timeout_retry.WaitFor(test_if_clear, wait_period=1)
-      return True
-    finally:
-      self._device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                   check_return=True)
-
-  def _DiscoverDeviceProfile(self):
-    """Checks and caches device information.
-
-    Returns:
-      True if profile is found, false otherwise.
-    """
-
-    if 'profile' in self._cache:
-      return True
-    for profile in _DEVICE_PROFILES:
-      if self._device.product_model in profile['name']:
-        self._cache['profile'] = profile
-        return True
-    self._cache['profile'] = {
-        'name': [],
-        'enable_command': None,
-        'disable_command': None,
-        'charge_counter': None,
-        'voltage': None,
-        'current': None,
-    }
-    return False
diff --git a/systrace/catapult/devil/devil/android/battery_utils_test.py b/systrace/catapult/devil/devil/android/battery_utils_test.py
deleted file mode 100755
index 7bfb955..0000000
--- a/systrace/catapult/devil/devil/android/battery_utils_test.py
+++ /dev/null
@@ -1,674 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of battery_utils.py
-"""
-
-# pylint: disable=protected-access,unused-argument
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import device_utils_test
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-_DUMPSYS_OUTPUT = [
-    '9,0,i,uid,1000,test_package1',
-    '9,0,i,uid,1001,test_package2',
-    '9,1000,l,pwi,uid,1',
-    '9,1001,l,pwi,uid,2',
-    '9,0,l,pws,1728,2000,190,207',
-]
-
-
-class BatteryUtilsTest(mock_calls.TestCase):
-
-  _NEXUS_5 = {
-      'name':
-          'Nexus 5',
-      'witness_file':
-          '/sys/kernel/debug/bq24192/INPUT_SRC_CONT',
-      'enable_command': (
-          'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-          'echo 1 > /sys/class/power_supply/usb/online'),
-      'disable_command': (
-          'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-          'chmod 644 /sys/class/power_supply/usb/online && '
-          'echo 0 > /sys/class/power_supply/usb/online'),
-      'charge_counter':
-          None,
-      'voltage':
-          None,
-      'current':
-          None,
-  }
-
-  _NEXUS_6 = {
-      'name':
-          'Nexus 6',
-      'witness_file':
-          None,
-      'enable_command':
-          None,
-      'disable_command':
-          None,
-      'charge_counter': (
-          '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
-      'voltage':
-          '/sys/class/power_supply/max170xx_battery/voltage_now',
-      'current':
-          '/sys/class/power_supply/max170xx_battery/current_now',
-  }
-
-  _NEXUS_10 = {
-      'name':
-          'Nexus 10',
-      'witness_file':
-          None,
-      'enable_command':
-          None,
-      'disable_command':
-          None,
-      'charge_counter': (
-          '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'),
-      'voltage':
-          '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
-      'current':
-          '/sys/class/power_supply/ds2784-fuelgauge/current_now',
-  }
-
-  def ShellError(self, output=None, status=1):
-    def action(cmd, *args, **kwargs):
-      raise device_errors.AdbShellCommandFailedError(cmd, output, status,
-                                                     str(self.device))
-
-    if output is None:
-      output = 'Permission denied\n'
-    return action
-
-  def setUp(self):
-    self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef')
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
-    self.battery = battery_utils.BatteryUtils(
-        self.device, default_timeout=10, default_retries=0)
-
-
-class BatteryUtilsInitTest(unittest.TestCase):
-  def testInitWithDeviceUtil(self):
-    serial = '0fedcba987654321'
-    d = device_utils.DeviceUtils(serial)
-    b = battery_utils.BatteryUtils(d)
-    self.assertEqual(d, b._device)
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(TypeError):
-      battery_utils.BatteryUtils(None)
-    with self.assertRaises(TypeError):
-      battery_utils.BatteryUtils('')
-
-
-class BatteryUtilsSetChargingTest(BatteryUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testHardwareSetCharging_enabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.device.RunShellCommand(
-        mock.ANY,
-        shell=True,
-        check_return=True,
-        as_root=True,
-        large_output=True), []), (self.call.battery.GetCharging(), False),
-                          (self.call.battery.GetCharging(), True)):
-      self.battery._HardwareSetCharging(True)
-
-  def testHardwareSetCharging_alreadyEnabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.device.RunShellCommand(
-        mock.ANY,
-        shell=True,
-        check_return=True,
-        as_root=True,
-        large_output=True), []), (self.call.battery.GetCharging(), True)):
-      self.battery._HardwareSetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testHardwareSetCharging_disabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.device.RunShellCommand(
-        mock.ANY,
-        shell=True,
-        check_return=True,
-        as_root=True,
-        large_output=True), []), (self.call.battery.GetCharging(), True),
-                          (self.call.battery.GetCharging(), False)):
-      self.battery._HardwareSetCharging(False)
-
-
-class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testBatteryMeasurementWifi(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=22):
-      with self.assertCalls(
-          (self.call.battery._ClearPowerData(), True),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
-           []), (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                            check_return=True), []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(['dumpsys', 'battery'],
-                                            check_return=True), [])):
-        with self.battery.BatteryMeasurement():
-          pass
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testBatteryMeasurementUsb(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=22):
-      with self.assertCalls(
-          (self.call.battery._ClearPowerData(), True),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
-           []), (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                            check_return=True), []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-          (self.call.battery.GetCharging(), True)):
-        with self.battery.BatteryMeasurement():
-          pass
-
-
-class BatteryUtilsGetPowerData(BatteryUtilsTest):
-  def testGetPowerData(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'batterystats', '-c'],
-                                          check_return=True,
-                                          large_output=True), _DUMPSYS_OUTPUT)):
-      data = self.battery.GetPowerData()
-      check = {
-          'system_total': 2000.0,
-          'per_package': {
-              'test_package1': {
-                  'uid': '1000',
-                  'data': [1.0]
-              },
-              'test_package2': {
-                  'uid': '1001',
-                  'data': [2.0]
-              }
-          }
-      }
-      self.assertEqual(data, check)
-
-  def testGetPowerData_packageCollisionSame(self):
-    self.battery._cache['uids'] = {'test_package1': '1000'}
-    with self.assertCall(
-        self.call.device.RunShellCommand(['dumpsys', 'batterystats', '-c'],
-                                         check_return=True,
-                                         large_output=True), _DUMPSYS_OUTPUT):
-      data = self.battery.GetPowerData()
-      check = {
-          'system_total': 2000.0,
-          'per_package': {
-              'test_package1': {
-                  'uid': '1000',
-                  'data': [1.0]
-              },
-              'test_package2': {
-                  'uid': '1001',
-                  'data': [2.0]
-              }
-          }
-      }
-      self.assertEqual(data, check)
-
-  def testGetPowerData_packageCollisionDifferent(self):
-    self.battery._cache['uids'] = {'test_package1': '1'}
-    with self.assertCall(
-        self.call.device.RunShellCommand(['dumpsys', 'batterystats', '-c'],
-                                         check_return=True,
-                                         large_output=True), _DUMPSYS_OUTPUT):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.battery.GetPowerData()
-
-  def testGetPowerData_cacheCleared(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'batterystats', '-c'],
-                                          check_return=True,
-                                          large_output=True), _DUMPSYS_OUTPUT)):
-      self.battery._cache.clear()
-      data = self.battery.GetPowerData()
-      check = {
-          'system_total': 2000.0,
-          'per_package': {
-              'test_package1': {
-                  'uid': '1000',
-                  'data': [1.0]
-              },
-              'test_package2': {
-                  'uid': '1001',
-                  'data': [2.0]
-              }
-          }
-      }
-      self.assertEqual(data, check)
-
-
-class BatteryUtilsChargeDevice(BatteryUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_pass(self):
-    with self.assertCalls((self.call.battery.SetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '50'
-                          }), (self.call.battery.GetBatteryInfo(), {
-                              'level': '100'
-                          })):
-      self.battery.ChargeDeviceToLevel(95)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_failureSame(self):
-    with self.assertCalls((self.call.battery.SetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '50'
-                          }), (self.call.battery.GetBatteryInfo(), {
-                              'level': '50'
-                          }), (self.call.battery.GetBatteryInfo(), {
-                              'level': '50'
-                          })):
-      with self.assertRaises(device_errors.DeviceChargingError):
-        old_max = battery_utils._MAX_CHARGE_ERROR
-        try:
-          battery_utils._MAX_CHARGE_ERROR = 2
-          self.battery.ChargeDeviceToLevel(95)
-        finally:
-          battery_utils._MAX_CHARGE_ERROR = old_max
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_failureDischarge(self):
-    with self.assertCalls((self.call.battery.SetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '50'
-                          }), (self.call.battery.GetBatteryInfo(), {
-                              'level': '49'
-                          }), (self.call.battery.GetBatteryInfo(), {
-                              'level': '48'
-                          })):
-      with self.assertRaises(device_errors.DeviceChargingError):
-        old_max = battery_utils._MAX_CHARGE_ERROR
-        try:
-          battery_utils._MAX_CHARGE_ERROR = 2
-          self.battery.ChargeDeviceToLevel(95)
-        finally:
-          battery_utils._MAX_CHARGE_ERROR = old_max
-
-
-class BatteryUtilsDischargeDevice(BatteryUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_exact(self):
-    with self.assertCalls((self.call.battery.GetBatteryInfo(), {
-        'level': '100'
-    }), (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery._HardwareSetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '99'
-                          })):
-      self.battery._DischargeDevice(1)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_over(self):
-    with self.assertCalls((self.call.battery.GetBatteryInfo(), {
-        'level': '100'
-    }), (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery._HardwareSetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '50'
-                          })):
-      self.battery._DischargeDevice(1)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_takeslong(self):
-    with self.assertCalls((self.call.battery.GetBatteryInfo(), {
-        'level': '100'
-    }), (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery._HardwareSetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '100'
-                          }), (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery._HardwareSetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '99'
-                          }), (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery._HardwareSetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '98'
-                          }), (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery._HardwareSetCharging(True)),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'level': '97'
-                          })):
-      self.battery._DischargeDevice(3)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_dischargeTooClose(self):
-    with self.assertCalls((self.call.battery.GetBatteryInfo(), {
-        'level': '100'
-    })):
-      self.battery._DischargeDevice(99)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_percentageOutOfBounds(self):
-    with self.assertCalls((self.call.battery.GetBatteryInfo(), {
-        'level': '100'
-    })):
-      with self.assertRaises(ValueError):
-        self.battery._DischargeDevice(100)
-    with self.assertCalls((self.call.battery.GetBatteryInfo(), {
-        'level': '100'
-    })):
-      with self.assertRaises(ValueError):
-        self.battery._DischargeDevice(0)
-
-
-class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest):
-  def testGetBatteryInfo_normal(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'battery'],
-                                          check_return=True), [
-                                              'Current Battery Service state:',
-                                              '  AC powered: false',
-                                              '  USB powered: true',
-                                              '  level: 100',
-                                              '  temperature: 321',
-                                          ])):
-      self.assertEquals({
-          'AC powered': 'false',
-          'USB powered': 'true',
-          'level': '100',
-          'temperature': '321',
-      }, self.battery.GetBatteryInfo())
-
-  def testGetBatteryInfo_nothing(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'battery'],
-                                          check_return=True), [])):
-      self.assertEquals({}, self.battery.GetBatteryInfo())
-
-
-class BatteryUtilsGetChargingTest(BatteryUtilsTest):
-  def testGetCharging_usb(self):
-    with self.assertCall(self.call.battery.GetBatteryInfo(),
-                         {'USB powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_usbFalse(self):
-    with self.assertCall(self.call.battery.GetBatteryInfo(),
-                         {'USB powered': 'false'}):
-      self.assertFalse(self.battery.GetCharging())
-
-  def testGetCharging_ac(self):
-    with self.assertCall(self.call.battery.GetBatteryInfo(),
-                         {'AC powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_wireless(self):
-    with self.assertCall(self.call.battery.GetBatteryInfo(),
-                         {'Wireless powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_unknown(self):
-    with self.assertCall(self.call.battery.GetBatteryInfo(), {'level': '42'}):
-      self.assertFalse(self.battery.GetCharging())
-
-
-class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_startUnder(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls((self.call.battery.EnableBatteryUpdates(), []),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'temperature': '500'
-                          })):
-      self.battery.LetBatteryCoolToTemperature(600)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_startOver(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls((self.call.battery.EnableBatteryUpdates(), []),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'temperature': '500'
-                          }), (self.call.battery.GetBatteryInfo(), {
-                              'temperature': '400'
-                          })):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_nexus5Hot(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.battery.EnableBatteryUpdates(), []),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'temperature': '500'
-                          }), (self.call.battery._DischargeDevice(1), []),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'temperature': '400'
-                          })):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_nexus5Cool(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.battery.EnableBatteryUpdates(), []),
-                          (self.call.battery.GetBatteryInfo(), {
-                              'temperature': '400'
-                          })):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-
-class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest):
-  def testSupportsFuelGauge_false(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-  def testSupportsFuelGauge_trueMax(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    # TODO(rnephew): Change this to assertTrue when we have support for
-    # disabling hardware charging on nexus 6.
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-  def testSupportsFuelGauge_trueDS(self):
-    self.battery._cache['profile'] = self._NEXUS_10
-    # TODO(rnephew): Change this to assertTrue when we have support for
-    # disabling hardware charging on nexus 10.
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-
-class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest):
-  def testGetFuelGaugeChargeCounter_noFuelGauge(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertRaises(device_errors.CommandFailedError):
-      self.battery.GetFuelGaugeChargeCounter()
-
-  def testGetFuelGaugeChargeCounter_fuelGaugePresent(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls((self.call.battery.SupportsFuelGauge(), True),
-                          (self.call.device.ReadFile(mock.ANY), '123')):
-      self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123)
-
-
-class BatteryUtilsSetCharging(BatteryUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_softwareSetTrue(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                          check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-        (self.call.battery.GetCharging(), True)):
-      self.battery.SetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_softwareSetFalse(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
-        (self.call.battery.GetCharging(), False)):
-      self.battery.SetCharging(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_hardwareSetTrue(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.battery.GetCharging(), False),
-                          (self.call.battery._HardwareSetCharging(True))):
-      self.battery.SetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_hardwareSetFalse(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.battery.GetCharging(), True),
-                          (self.call.battery._ClearPowerData(), True),
-                          (self.call.battery._HardwareSetCharging(False))):
-      self.battery.SetCharging(False)
-
-  def testSetCharging_expectedStateAlreadyTrue(self):
-    with self.assertCalls((self.call.battery.GetCharging(), True)):
-      self.battery.SetCharging(True)
-
-  def testSetCharging_expectedStateAlreadyFalse(self):
-    with self.assertCalls((self.call.battery.GetCharging(), False)):
-      self.battery.SetCharging(False)
-
-
-class BatteryUtilsPowerMeasurement(BatteryUtilsTest):
-  def testPowerMeasurement_hardware(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls((self.call.battery.GetCharging(), True),
-                          (self.call.battery._ClearPowerData(), True),
-                          (self.call.battery._HardwareSetCharging(False)),
-                          (self.call.battery.GetCharging(), False),
-                          (self.call.battery._HardwareSetCharging(True))):
-      with self.battery.PowerMeasurement():
-        pass
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testPowerMeasurement_software(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                          check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-        (self.call.battery.GetCharging(), True)):
-      with self.battery.PowerMeasurement():
-        pass
-
-
-class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest):
-  def testDiscoverDeviceProfile_known(self):
-    with self.patch_call(
-        self.call.device.product_model, return_value='Nexus 4'):
-      self.battery._DiscoverDeviceProfile()
-      self.assertListEqual(self.battery._cache['profile']['name'], ["Nexus 4"])
-
-  def testDiscoverDeviceProfile_unknown(self):
-    with self.patch_call(self.call.device.product_model, return_value='Other'):
-      self.battery._DiscoverDeviceProfile()
-      self.assertListEqual(self.battery._cache['profile']['name'], [])
-
-
-class BatteryUtilsClearPowerData(BatteryUtilsTest):
-  def testClearPowerData_preL(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=20):
-      self.assertFalse(self.battery._ClearPowerData())
-
-  def testClearPowerData_clearedL(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=22):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
-           []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True,
-              large_output=True), []), (self.call.device.RunShellCommand(
-                  ['dumpsys', 'battery', 'reset'], check_return=True), [])):
-        self.assertTrue(self.battery._ClearPowerData())
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testClearPowerData_notClearedL(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=22):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
-           []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True,
-              large_output=True), ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True,
-              large_output=True), ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True,
-              large_output=True), ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True,
-              large_output=True), ['9,1000,l,pwi,uid,0.0']),
-          (self.call.device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                            check_return=True), [])):
-        self.battery._ClearPowerData()
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/constants/__init__.py b/systrace/catapult/devil/devil/android/constants/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/systrace/catapult/devil/devil/android/constants/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/systrace/catapult/devil/devil/android/constants/chrome.py b/systrace/catapult/devil/devil/android/constants/chrome.py
deleted file mode 100644
index a02ce1d..0000000
--- a/systrace/catapult/devil/devil/android/constants/chrome.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import collections
-
-PackageInfo = collections.namedtuple(
-    'PackageInfo', ['package', 'activity', 'cmdline_file', 'devtools_socket'])
-
-PACKAGE_INFO = {
-    'chrome_document':
-        PackageInfo(
-            'com.google.android.apps.chrome.document',
-            'com.google.android.apps.chrome.document.ChromeLauncherActivity',
-            'chrome-command-line', 'chrome_devtools_remote'),
-    'chrome':
-        PackageInfo('com.google.android.apps.chrome',
-                    'com.google.android.apps.chrome.Main',
-                    'chrome-command-line', 'chrome_devtools_remote'),
-    'chrome_beta':
-        PackageInfo('com.chrome.beta', 'com.google.android.apps.chrome.Main',
-                    'chrome-command-line', 'chrome_devtools_remote'),
-    'chrome_stable':
-        PackageInfo('com.android.chrome', 'com.google.android.apps.chrome.Main',
-                    'chrome-command-line', 'chrome_devtools_remote'),
-    'chrome_dev':
-        PackageInfo('com.chrome.dev', 'com.google.android.apps.chrome.Main',
-                    'chrome-command-line', 'chrome_devtools_remote'),
-    'chrome_canary':
-        PackageInfo('com.chrome.canary', 'com.google.android.apps.chrome.Main',
-                    'chrome-command-line', 'chrome_devtools_remote'),
-    'chromium':
-        PackageInfo('org.chromium.chrome',
-                    'com.google.android.apps.chrome.Main',
-                    'chrome-command-line', 'chrome_devtools_remote'),
-    'content_shell':
-        PackageInfo('org.chromium.content_shell_apk', '.ContentShellActivity',
-                    'content-shell-command-line',
-                    'content_shell_devtools_remote'),
-}
diff --git a/systrace/catapult/devil/devil/android/constants/file_system.py b/systrace/catapult/devil/devil/android/constants/file_system.py
deleted file mode 100644
index bffec61..0000000
--- a/systrace/catapult/devil/devil/android/constants/file_system.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-TEST_EXECUTABLE_DIR = '/data/local/tmp'
diff --git a/systrace/catapult/devil/devil/android/constants/webapk.py b/systrace/catapult/devil/devil/android/constants/webapk.py
deleted file mode 100644
index 6424168..0000000
--- a/systrace/catapult/devil/devil/android/constants/webapk.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-WEBAPK_MAIN_ACTIVITY = 'org.chromium.webapk.shell_apk.MainActivity'
diff --git a/systrace/catapult/devil/devil/android/cpu_temperature.py b/systrace/catapult/devil/devil/android/cpu_temperature.py
deleted file mode 100644
index 7fa724c..0000000
--- a/systrace/catapult/devil/devil/android/cpu_temperature.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provides device interactions for CPU temperature monitoring."""
-# pylint: disable=unused-argument
-
-import logging
-
-from devil.android import device_utils
-from devil.android.perf import perf_control
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-# NB: when adding devices to this structure, be aware of the impact it may
-# have on the chromium.perf waterfall, as it may increase testing time.
-# Please contact a person responsible for the waterfall to see if the
-# device you're adding is currently being tested.
-_DEVICE_THERMAL_INFORMATION = {
-    # Pixel 3
-    'blueline': {
-        'cpu_temps': {
-            # See /sys/class/thermal/thermal_zone<number>/type for description
-            # Types:
-            # cpu0: cpu0-silver-step
-            # cpu1: cpu1-silver-step
-            # cpu2: cpu2-silver-step
-            # cpu3: cpu3-silver-step
-            # cpu4: cpu0-gold-step
-            # cpu5: cpu1-gold-step
-            # cpu6: cpu2-gold-step
-            # cpu7: cpu3-gold-step
-            'cpu0': '/sys/class/thermal/thermal_zone11/temp',
-            'cpu1': '/sys/class/thermal/thermal_zone12/temp',
-            'cpu2': '/sys/class/thermal/thermal_zone13/temp',
-            'cpu3': '/sys/class/thermal/thermal_zone14/temp',
-            'cpu4': '/sys/class/thermal/thermal_zone15/temp',
-            'cpu5': '/sys/class/thermal/thermal_zone16/temp',
-            'cpu6': '/sys/class/thermal/thermal_zone17/temp',
-            'cpu7': '/sys/class/thermal/thermal_zone18/temp'
-        },
-        # Different device sensors use different multipliers
-        # e.g. Pixel 3 35 degrees c is 35000
-        'temp_multiplier': 1000
-    },
-    # Pixel
-    'sailfish': {
-        'cpu_temps': {
-            # The following thermal zones tend to produce the most accurate
-            # readings
-            # Types:
-            # cpu0: tsens_tz_sensor0
-            # cpu1: tsens_tz_sensor1
-            # cpu2: tsens_tz_sensor2
-            # cpu3: tsens_tz_sensor3
-            'cpu0': '/sys/class/thermal/thermal_zone1/temp',
-            'cpu1': '/sys/class/thermal/thermal_zone2/temp',
-            'cpu2': '/sys/class/thermal/thermal_zone3/temp',
-            'cpu3': '/sys/class/thermal/thermal_zone4/temp'
-        },
-        'temp_multiplier': 10
-    }
-}
-
-
-class CpuTemperature(object):
-  def __init__(self, device):
-    """CpuTemperature constructor.
-
-      Args:
-        device: A DeviceUtils instance.
-      Raises:
-        TypeError: If it is not passed a DeviceUtils instance.
-    """
-    if not isinstance(device, device_utils.DeviceUtils):
-      raise TypeError('Must be initialized with DeviceUtils object.')
-    self._device = device
-    self._perf_control = perf_control.PerfControl(self._device)
-    self._device_info = None
-
-  def InitThermalDeviceInformation(self):
-    """Init the current devices thermal information.
-    """
-    self._device_info = _DEVICE_THERMAL_INFORMATION.get(
-        self._device.build_product)
-
-  def IsSupported(self):
-    """Check if the current device is supported.
-
-      Returns:
-        True if the device is in _DEVICE_THERMAL_INFORMATION and the temp
-        files exist. False otherwise.
-    """
-    # Init device info if it hasnt been manually initialised already
-    if self._device_info is None:
-      self.InitThermalDeviceInformation()
-
-    if self._device_info is not None:
-      return all(
-          self._device.FileExists(f)
-          for f in self._device_info['cpu_temps'].values())
-    return False
-
-  def LetCpuCoolToTemperature(self, target_temp, wait_period=30):
-    """Lets device sit to give CPU time to cool down.
-
-      Implements a similar mechanism to
-      battery_utils.LetBatteryCoolToTemperature
-
-      Args:
-        temp: A float containing the maximum temperature to allow
-          in degrees c.
-        wait_period: An integer indicating time in seconds to wait
-          between checking.
-    """
-    target_temp = int(target_temp * self._device_info['temp_multiplier'])
-
-    def cool_cpu():
-      # Get the temperatures
-      cpu_temp_paths = self._device_info['cpu_temps']
-      temps = []
-      for temp_path in cpu_temp_paths.values():
-        temp_return = self._device.ReadFile(temp_path)
-        # Output is an array of strings, only need the first line.
-        temps.append(int(temp_return))
-
-      if not temps:
-        logger.warning('Unable to read temperature files provided.')
-        return True
-
-      logger.info('Current CPU temperatures: %s', str(temps)[1:-1])
-
-      return all(t <= target_temp for t in temps)
-
-    logger.info('Waiting for the CPU to cool down to %s',
-                target_temp / self._device_info['temp_multiplier'])
-
-    # Set the governor to powersave to aid the cooling down of the CPU
-    self._perf_control.SetScalingGovernor('powersave')
-
-    # Retry 3 times, each time waiting 30 seconds.
-    # This negates most (if not all) of the noise in recorded results without
-    # taking too long
-    timeout_retry.WaitFor(cool_cpu, wait_period=wait_period, max_tries=3)
-
-    # Set the performance mode
-    self._perf_control.SetHighPerfMode()
-
-  def GetDeviceForTesting(self):
-    return self._device
-
-  def GetDeviceInfoForTesting(self):
-    return self._device_info
diff --git a/systrace/catapult/devil/devil/android/cpu_temperature_test.py b/systrace/catapult/devil/devil/android/cpu_temperature_test.py
deleted file mode 100644
index 47cc28a..0000000
--- a/systrace/catapult/devil/devil/android/cpu_temperature_test.py
+++ /dev/null
@@ -1,132 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of cpu_temperature.py
-"""
-
-# pylint: disable=unused-argument
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import cpu_temperature
-from devil.android import device_utils
-from devil.utils import mock_calls
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class CpuTemperatureTest(mock_calls.TestCase):
-  @mock.patch('devil.android.perf.perf_control.PerfControl', mock.Mock())
-  def setUp(self):
-    # Mock the device
-    self.mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    self.mock_device.build_product = 'blueline'
-    self.mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-    self.mock_device.FileExists.return_value = True
-
-    self.cpu_temp = cpu_temperature.CpuTemperature(self.mock_device)
-    self.cpu_temp.InitThermalDeviceInformation()
-
-
-class CpuTemperatureInitTest(unittest.TestCase):
-  @mock.patch('devil.android.perf.perf_control.PerfControl', mock.Mock())
-  def testInitWithDeviceUtil(self):
-    d = mock.Mock(spec=device_utils.DeviceUtils)
-    d.build_product = 'blueline'
-    c = cpu_temperature.CpuTemperature(d)
-    self.assertEqual(d, c.GetDeviceForTesting())
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(TypeError):
-      cpu_temperature.CpuTemperature(None)
-    with self.assertRaises(TypeError):
-      cpu_temperature.CpuTemperature('')
-
-
-class CpuTemperatureGetThermalDeviceInformationTest(CpuTemperatureTest):
-  @mock.patch('devil.android.perf.perf_control.PerfControl', mock.Mock())
-  def testGetThermalDeviceInformation_noneWhenIncorrectLabel(self):
-    invalid_device = mock.Mock(spec=device_utils.DeviceUtils)
-    invalid_device.build_product = 'invalid_name'
-    c = cpu_temperature.CpuTemperature(invalid_device)
-    c.InitThermalDeviceInformation()
-    self.assertEqual(c.GetDeviceInfoForTesting(), None)
-
-  def testGetThermalDeviceInformation_getsCorrectInformation(self):
-    correct_information = {
-        'cpu0': '/sys/class/thermal/thermal_zone11/temp',
-        'cpu1': '/sys/class/thermal/thermal_zone12/temp',
-        'cpu2': '/sys/class/thermal/thermal_zone13/temp',
-        'cpu3': '/sys/class/thermal/thermal_zone14/temp',
-        'cpu4': '/sys/class/thermal/thermal_zone15/temp',
-        'cpu5': '/sys/class/thermal/thermal_zone16/temp',
-        'cpu6': '/sys/class/thermal/thermal_zone17/temp',
-        'cpu7': '/sys/class/thermal/thermal_zone18/temp'
-    }
-
-    self.assertDictEqual(
-        correct_information,
-        self.cpu_temp.GetDeviceInfoForTesting().get('cpu_temps')
-    )
-
-
-class CpuTemperatureIsSupportedTest(CpuTemperatureTest):
-  @mock.patch('devil.android.perf.perf_control.PerfControl', mock.Mock())
-  def testIsSupported_returnsTrue(self):
-    d = mock.Mock(spec=device_utils.DeviceUtils)
-    d.build_product = 'blueline'
-    d.FileExists.return_value = True
-    c = cpu_temperature.CpuTemperature(d)
-    self.assertTrue(c.IsSupported())
-
-  @mock.patch('devil.android.perf.perf_control.PerfControl', mock.Mock())
-  def testIsSupported_returnsFalse(self):
-    d = mock.Mock(spec=device_utils.DeviceUtils)
-    d.build_product = 'blueline'
-    d.FileExists.return_value = False
-    c = cpu_temperature.CpuTemperature(d)
-    self.assertFalse(c.IsSupported())
-
-
-class CpuTemperatureLetCpuCoolToTemperatureTest(CpuTemperatureTest):
-  # Return values for the mock side effect
-  cooling_down0 = (
-      [45000
-       for _ in range(8)] + [43000
-                             for _ in range(8)] + [41000 for _ in range(8)])
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_coolWithin24Calls(self):
-    self.mock_device.ReadFile = mock.Mock(side_effect=self.cooling_down0)
-    self.cpu_temp.LetCpuCoolToTemperature(42)
-    self.mock_device.ReadFile.assert_called()
-    self.assertEquals(self.mock_device.ReadFile.call_count, 24)
-
-  cooling_down1 = [45000 for _ in range(8)] + [41000 for _ in range(16)]
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_coolWithin16Calls(self):
-    self.mock_device.ReadFile = mock.Mock(side_effect=self.cooling_down1)
-    self.cpu_temp.LetCpuCoolToTemperature(42)
-    self.mock_device.ReadFile.assert_called()
-    self.assertEquals(self.mock_device.ReadFile.call_count, 16)
-
-  constant_temp = [45000 for _ in range(40)]
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_timeoutAfterThree(self):
-    self.mock_device.ReadFile = mock.Mock(side_effect=self.constant_temp)
-    self.cpu_temp.LetCpuCoolToTemperature(42)
-    self.mock_device.ReadFile.assert_called()
-    self.assertEquals(self.mock_device.ReadFile.call_count, 24)
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/crash_handler.py b/systrace/catapult/devil/devil/android/crash_handler.py
deleted file mode 100644
index 9db5444..0000000
--- a/systrace/catapult/devil/devil/android/crash_handler.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-
-from devil import base_error
-from devil.android import device_errors
-
-logger = logging.getLogger(__name__)
-
-
-def RetryOnSystemCrash(f, device, retries=3):
-  """Retries the given function on a device crash.
-
-  If the provided function fails with a DeviceUnreachableError, this will wait
-  for the device to come back online, then retry the function.
-
-  Note that this uses the same retry scheme as timeout_retry.Run.
-
-  Args:
-    f: a unary callable that takes an instance of device_utils.DeviceUtils.
-    device: an instance of device_utils.DeviceUtils.
-    retries: the number of retries.
-  Returns:
-    Whatever f returns.
-  """
-  num_try = 1
-  while True:
-    try:
-      return f(device)
-    except device_errors.DeviceUnreachableError:
-      if num_try > retries:
-        logger.error('%d consecutive device crashes. No longer retrying.',
-                     num_try)
-        raise
-      try:
-        logger.warning('Device is unreachable. Waiting for recovery...')
-        # Treat the device being unreachable as an unexpected reboot and clear
-        # any cached state.
-        device.ClearCache()
-        device.WaitUntilFullyBooted()
-      except base_error.BaseError:
-        logger.exception('Device never recovered. X(')
-    num_try += 1
diff --git a/systrace/catapult/devil/devil/android/crash_handler_devicetest.py b/systrace/catapult/devil/devil/android/crash_handler_devicetest.py
deleted file mode 100755
index 68c0d3a..0000000
--- a/systrace/catapult/devil/devil/android/crash_handler_devicetest.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(
-          os.path.dirname(__file__),
-          '..',
-          '..',
-      )))
-
-from devil.android import crash_handler
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import device_temp_file
-from devil.android import device_test_case
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-
-class DeviceCrashTest(device_test_case.DeviceTestCase):
-  def setUp(self):
-    super(DeviceCrashTest, self).setUp()
-    self.device = device_utils.DeviceUtils(self.serial)
-
-  def testCrashDuringCommand(self):
-    self.device.EnableRoot()
-    with device_temp_file.DeviceTempFile(self.device.adb) as trigger_file:
-
-      trigger_text = 'hello world'
-
-      def victim():
-        trigger_cmd = 'echo -n %s > %s; sleep 20' % (cmd_helper.SingleQuote(
-            trigger_text), cmd_helper.SingleQuote(trigger_file.name))
-        crash_handler.RetryOnSystemCrash(
-            lambda d: d.RunShellCommand(
-                trigger_cmd,
-                shell=True,
-                check_return=True,
-                retries=1,
-                as_root=True,
-                timeout=180),
-            device=self.device)
-        self.assertEquals(
-            trigger_text,
-            self.device.ReadFile(trigger_file.name, retries=0).strip())
-        return True
-
-      def crasher():
-        def ready_to_crash():
-          try:
-            return trigger_text == self.device.ReadFile(
-                trigger_file.name, retries=0).strip()
-          except device_errors.CommandFailedError:
-            return False
-
-        timeout_retry.WaitFor(ready_to_crash, wait_period=2, max_tries=10)
-        if not ready_to_crash():
-          return False
-        self.device.adb.Shell(
-            'echo c > /proc/sysrq-trigger',
-            expect_status=None,
-            timeout=60,
-            retries=0)
-        return True
-
-    self.assertEquals([True, True], reraiser_thread.RunAsync([crasher, victim]))
-
-
-if __name__ == '__main__':
-  device_test_case.PrepareDevices()
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/decorators.py b/systrace/catapult/devil/devil/android/decorators.py
deleted file mode 100644
index 11d2494..0000000
--- a/systrace/catapult/devil/devil/android/decorators.py
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Function/method decorators that provide timeout and retry logic.
-"""
-
-import functools
-import itertools
-import sys
-
-import six
-
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-DEFAULT_TIMEOUT_ATTR = '_default_timeout'
-DEFAULT_RETRIES_ATTR = '_default_retries'
-
-
-def _TimeoutRetryWrapper(f,
-                         timeout_func,
-                         retries_func,
-                         retry_if_func=timeout_retry.AlwaysRetry,
-                         pass_values=False):
-  """ Wraps a funcion with timeout and retry handling logic.
-
-  Args:
-    f: The function to wrap.
-    timeout_func: A callable that returns the timeout value.
-    retries_func: A callable that returns the retries value.
-    pass_values: If True, passes the values returned by |timeout_func| and
-                 |retries_func| to the wrapped function as 'timeout' and
-                 'retries' kwargs, respectively.
-  Returns:
-    The wrapped function.
-  """
-
-  @functools.wraps(f)
-  def timeout_retry_wrapper(*args, **kwargs):
-    timeout = timeout_func(*args, **kwargs)
-    retries = retries_func(*args, **kwargs)
-    if pass_values:
-      kwargs['timeout'] = timeout
-      kwargs['retries'] = retries
-
-    @functools.wraps(f)
-    def impl():
-      return f(*args, **kwargs)
-
-    try:
-      if timeout_retry.CurrentTimeoutThreadGroup():
-        # Don't wrap if there's already an outer timeout thread.
-        return impl()
-      else:
-        desc = '%s(%s)' % (f.__name__, ', '.join(
-            itertools.chain(
-                (str(a) for a in args),
-                ('%s=%s' % (k, str(v)) for k, v in six.iteritems(kwargs)))))
-        return timeout_retry.Run(
-            impl, timeout, retries, desc=desc, retry_if_func=retry_if_func)
-    except reraiser_thread.TimeoutError as e:
-      six.reraise(
-          device_errors.CommandTimeoutError,
-          device_errors.CommandTimeoutError(str(e)),
-          sys.exc_info()[2])
-    except cmd_helper.TimeoutError as e:
-      six.reraise(
-          device_errors.CommandTimeoutError,
-          device_errors.CommandTimeoutError(str(e), output=e.output),
-          sys.exc_info()[2])
-
-  return timeout_retry_wrapper
-
-
-def WithTimeoutAndRetries(f):
-  """A decorator that handles timeouts and retries.
-
-  'timeout' and 'retries' kwargs must be passed to the function.
-
-  Args:
-    f: The function to decorate.
-  Returns:
-    The decorated function.
-  """
-  get_timeout = lambda *a, **kw: kw['timeout']
-  get_retries = lambda *a, **kw: kw['retries']
-  return _TimeoutRetryWrapper(f, get_timeout, get_retries)
-
-
-def WithTimeoutAndConditionalRetries(retry_if_func):
-  """Returns a decorator that handles timeouts and, in some cases, retries.
-
-  'timeout' and 'retries' kwargs must be passed to the function.
-
-  Args:
-    retry_if_func: A unary callable that takes an exception and returns
-      whether failures should be retried.
-  Returns:
-    The actual decorator.
-  """
-
-  def decorator(f):
-    get_timeout = lambda *a, **kw: kw['timeout']
-    get_retries = lambda *a, **kw: kw['retries']
-    return _TimeoutRetryWrapper(
-        f, get_timeout, get_retries, retry_if_func=retry_if_func)
-
-  return decorator
-
-
-def WithExplicitTimeoutAndRetries(timeout, retries):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |timeout| and |retries| values are always used.
-
-  Args:
-    timeout: The number of seconds to wait for the decorated function to
-             return. Always used.
-    retries: The number of times the decorated function should be retried on
-             failure. Always used.
-  Returns:
-    The actual decorator.
-  """
-
-  def decorator(f):
-    get_timeout = lambda *a, **kw: timeout
-    get_retries = lambda *a, **kw: retries
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries)
-
-  return decorator
-
-
-def WithTimeoutAndRetriesDefaults(default_timeout, default_retries):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |default_timeout| and |default_retries| values are used only
-  if timeout and retries values are not provided.
-
-  Args:
-    default_timeout: The number of seconds to wait for the decorated function
-                     to return. Only used if a 'timeout' kwarg is not passed
-                     to the decorated function.
-    default_retries: The number of times the decorated function should be
-                     retried on failure. Only used if a 'retries' kwarg is not
-                     passed to the decorated function.
-  Returns:
-    The actual decorator.
-  """
-
-  def decorator(f):
-    get_timeout = lambda *a, **kw: kw.get('timeout', default_timeout)
-    get_retries = lambda *a, **kw: kw.get('retries', default_retries)
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
-
-  return decorator
-
-
-def WithTimeoutAndRetriesFromInstance(default_timeout_name=DEFAULT_TIMEOUT_ATTR,
-                                      default_retries_name=DEFAULT_RETRIES_ATTR,
-                                      min_default_timeout=None):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |default_timeout_name| and |default_retries_name| are used to
-  get the default timeout value and the default retries value from the object
-  instance if timeout and retries values are not provided.
-
-  Note that this should only be used to decorate methods, not functions.
-
-  Args:
-    default_timeout_name: The name of the default timeout attribute of the
-                          instance.
-    default_retries_name: The name of the default retries attribute of the
-                          instance.
-    min_timeout: Miniumum timeout to be used when using instance timeout.
-  Returns:
-    The actual decorator.
-  """
-
-  def decorator(f):
-    def get_timeout(inst, *_args, **kwargs):
-      ret = getattr(inst, default_timeout_name)
-      if min_default_timeout is not None:
-        ret = max(min_default_timeout, ret)
-      return kwargs.get('timeout', ret)
-
-    def get_retries(inst, *_args, **kwargs):
-      return kwargs.get('retries', getattr(inst, default_retries_name))
-
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
-
-  return decorator
diff --git a/systrace/catapult/devil/devil/android/decorators_test.py b/systrace/catapult/devil/devil/android/decorators_test.py
deleted file mode 100644
index 994e35e..0000000
--- a/systrace/catapult/devil/devil/android/decorators_test.py
+++ /dev/null
@@ -1,338 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for decorators.py.
-"""
-
-# pylint: disable=W0613
-
-import time
-import traceback
-import unittest
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import reraiser_thread
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-class DecoratorsTest(unittest.TestCase):
-  _decorated_function_called_count = 0
-
-  def testFunctionDecoratorDoesTimeouts(self):
-    """Tests that the base decorator handles the timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysTimesOut(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut(timeout=1, retries=0)
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testFunctionDecoratorDoesRetries(self):
-    """Tests that the base decorator handles the retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(timeout=30, retries=10)
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-  def testFunctionDecoratorRequiresParams(self):
-    """Tests that the base decorator requires timeout and retries params."""
-
-    @decorators.WithTimeoutAndRetries
-    def requiresExplicitTimeoutAndRetries(timeout=None, retries=None):
-      return (timeout, retries)
-
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries()
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries(timeout=10)
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries(retries=0)
-    expected_timeout = 10
-    expected_retries = 1
-    (actual_timeout, actual_retries) = (requiresExplicitTimeoutAndRetries(
-        timeout=expected_timeout, retries=expected_retries))
-    self.assertEquals(expected_timeout, actual_timeout)
-    self.assertEquals(expected_retries, actual_retries)
-
-  def testFunctionDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc), timeout=10, retries=1)
-    self.assertEquals(exception_desc, str(e.exception))
-
-  def testConditionalRetriesDecoratorRetries(self):
-    def do_not_retry_no_adb_error(exc):
-      return not isinstance(exc, device_errors.NoAdbError)
-
-    actual_tries = [0]
-
-    @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      actual_tries[0] += 1
-      raise device_errors.CommandFailedError('Command failed :(')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(timeout=10, retries=10)
-    self.assertEquals(11, actual_tries[0])
-
-  def testConditionalRetriesDecoratorDoesntRetry(self):
-    def do_not_retry_no_adb_error(exc):
-      return not isinstance(exc, device_errors.NoAdbError)
-
-    actual_tries = [0]
-
-    @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
-    def alwaysRaisesNoAdbError(timeout=None, retries=None):
-      actual_tries[0] += 1
-      raise device_errors.NoAdbError()
-
-    with self.assertRaises(device_errors.NoAdbError):
-      alwaysRaisesNoAdbError(timeout=10, retries=10)
-    self.assertEquals(1, actual_tries[0])
-
-  def testDefaultsFunctionDecoratorDoesTimeouts(self):
-    """Tests that the defaults decorator handles timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetriesDefaults(1, 0)
-    def alwaysTimesOut(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut()
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-    DecoratorsTest._decorated_function_called_count = 0
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut(timeout=2)
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 2)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testDefaultsFunctionDecoratorDoesRetries(self):
-    """Tests that the defaults decorator handles retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError()
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-    DecoratorsTest._decorated_function_called_count = 0
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(retries=5)
-    self.assertEquals(6, DecoratorsTest._decorated_function_called_count)
-
-  def testDefaultsFunctionDecoratorPassesValues(self):
-    """Tests that the defaults decorator passes timeout and retries kwargs."""
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysReturnsTimeouts(timeout=None, retries=None):
-      return timeout
-
-    self.assertEquals(30, alwaysReturnsTimeouts())
-    self.assertEquals(120, alwaysReturnsTimeouts(timeout=120))
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysReturnsRetries(timeout=None, retries=None):
-      return retries
-
-    self.assertEquals(10, alwaysReturnsRetries())
-    self.assertEquals(1, alwaysReturnsRetries(retries=1))
-
-  def testDefaultsFunctionDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-  def testExplicitFunctionDecoratorDoesTimeouts(self):
-    """Tests that the explicit decorator handles timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithExplicitTimeoutAndRetries(1, 0)
-    def alwaysTimesOut():
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut()
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testExplicitFunctionDecoratorDoesRetries(self):
-    """Tests that the explicit decorator handles retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithExplicitTimeoutAndRetries(30, 10)
-    def alwaysRaisesCommandFailedError():
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError()
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-  def testExplicitDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-
-    @decorators.WithExplicitTimeoutAndRetries(30, 10)
-    def alwaysRaisesProvidedException(exception):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-  class _MethodDecoratorTestObject(object):
-    """An object suitable for testing the method decorator."""
-
-    def __init__(self,
-                 test_case,
-                 default_timeout=_DEFAULT_TIMEOUT,
-                 default_retries=_DEFAULT_RETRIES):
-      self._test_case = test_case
-      self.default_timeout = default_timeout
-      self.default_retries = default_retries
-      self.function_call_counters = {
-          'alwaysRaisesCommandFailedError': 0,
-          'alwaysTimesOut': 0,
-          'requiresExplicitTimeoutAndRetries': 0,
-      }
-
-    @decorators.WithTimeoutAndRetriesFromInstance('default_timeout',
-                                                  'default_retries')
-    def alwaysTimesOut(self, timeout=None, retries=None):
-      self.function_call_counters['alwaysTimesOut'] += 1
-      time.sleep(100)
-      self._test_case.assertFalse(True, msg='Failed to time out?')
-
-    @decorators.WithTimeoutAndRetriesFromInstance('default_timeout',
-                                                  'default_retries')
-    def alwaysRaisesCommandFailedError(self, timeout=None, retries=None):
-      self.function_call_counters['alwaysRaisesCommandFailedError'] += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    # pylint: disable=no-self-use
-
-    @decorators.WithTimeoutAndRetriesFromInstance('default_timeout',
-                                                  'default_retries')
-    def alwaysReturnsTimeout(self, timeout=None, retries=None):
-      return timeout
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries', min_default_timeout=100)
-    def alwaysReturnsTimeoutWithMin(self, timeout=None, retries=None):
-      return timeout
-
-    @decorators.WithTimeoutAndRetriesFromInstance('default_timeout',
-                                                  'default_retries')
-    def alwaysReturnsRetries(self, timeout=None, retries=None):
-      return retries
-
-    @decorators.WithTimeoutAndRetriesFromInstance('default_timeout',
-                                                  'default_retries')
-    def alwaysRaisesProvidedException(self,
-                                      exception,
-                                      timeout=None,
-                                      retries=None):
-      raise exception
-
-    # pylint: enable=no-self-use
-
-  def testMethodDecoratorDoesTimeout(self):
-    """Tests that the method decorator handles timeout logic."""
-    test_obj = self._MethodDecoratorTestObject(self)
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      try:
-        test_obj.alwaysTimesOut(timeout=1, retries=0)
-      except:
-        traceback.print_exc()
-        raise
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, test_obj.function_call_counters['alwaysTimesOut'])
-
-  def testMethodDecoratorDoesRetries(self):
-    """Tests that the method decorator handles retries logic."""
-    test_obj = self._MethodDecoratorTestObject(self)
-    with self.assertRaises(device_errors.CommandFailedError):
-      try:
-        test_obj.alwaysRaisesCommandFailedError(retries=10)
-      except:
-        traceback.print_exc()
-        raise
-    self.assertEquals(
-        11, test_obj.function_call_counters['alwaysRaisesCommandFailedError'])
-
-  def testMethodDecoratorPassesValues(self):
-    """Tests that the method decorator passes timeout and retries kwargs."""
-    test_obj = self._MethodDecoratorTestObject(
-        self, default_timeout=42, default_retries=31)
-    self.assertEquals(42, test_obj.alwaysReturnsTimeout())
-    self.assertEquals(41, test_obj.alwaysReturnsTimeout(timeout=41))
-    self.assertEquals(31, test_obj.alwaysReturnsRetries())
-    self.assertEquals(32, test_obj.alwaysReturnsRetries(retries=32))
-
-  def testMethodDecoratorUsesMiniumumTimeout(self):
-    test_obj = self._MethodDecoratorTestObject(
-        self, default_timeout=42, default_retries=31)
-    self.assertEquals(100, test_obj.alwaysReturnsTimeoutWithMin())
-    self.assertEquals(41, test_obj.alwaysReturnsTimeoutWithMin(timeout=41))
-
-  def testMethodDecoratorTranslatesReraiserExceptions(self):
-    test_obj = self._MethodDecoratorTestObject(self)
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      test_obj.alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/device_blacklist.py b/systrace/catapult/devil/devil/android/device_blacklist.py
deleted file mode 100644
index 010e996..0000000
--- a/systrace/catapult/devil/devil/android/device_blacklist.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import logging
-import os
-import threading
-import time
-
-logger = logging.getLogger(__name__)
-
-
-class Blacklist(object):
-
-  def __init__(self, path):
-    self._blacklist_lock = threading.RLock()
-    self._path = path
-
-  def Read(self):
-    """Reads the blacklist from the blacklist file.
-
-    Returns:
-      A dict containing bad devices.
-    """
-    with self._blacklist_lock:
-      blacklist = dict()
-      if not os.path.exists(self._path):
-        return blacklist
-
-      try:
-        with open(self._path, 'r') as f:
-          blacklist = json.load(f)
-      except (IOError, ValueError) as e:
-        logger.warning('Unable to read blacklist: %s', str(e))
-        os.remove(self._path)
-
-      if not isinstance(blacklist, dict):
-        logger.warning('Ignoring %s: %s (a dict was expected instead)',
-                        self._path, blacklist)
-        blacklist = dict()
-
-      return blacklist
-
-  def Write(self, blacklist):
-    """Writes the provided blacklist to the blacklist file.
-
-    Args:
-      blacklist: list of bad devices to write to the blacklist file.
-    """
-    with self._blacklist_lock:
-      with open(self._path, 'w') as f:
-        json.dump(blacklist, f)
-
-  def Extend(self, devices, reason='unknown'):
-    """Adds devices to blacklist file.
-
-    Args:
-      devices: list of bad devices to be added to the blacklist file.
-      reason: string specifying the reason for blacklist (eg: 'unauthorized')
-    """
-    timestamp = time.time()
-    event_info = {
-        'timestamp': timestamp,
-        'reason': reason,
-    }
-    device_dicts = {device: event_info for device in devices}
-    logger.info('Adding %s to blacklist %s for reason: %s',
-                 ','.join(devices), self._path, reason)
-    with self._blacklist_lock:
-      blacklist = self.Read()
-      blacklist.update(device_dicts)
-      self.Write(blacklist)
-
-  def Reset(self):
-    """Erases the blacklist file if it exists."""
-    logger.info('Resetting blacklist %s', self._path)
-    with self._blacklist_lock:
-      if os.path.exists(self._path):
-        os.remove(self._path)
diff --git a/systrace/catapult/devil/devil/android/device_blacklist_test.py b/systrace/catapult/devil/devil/android/device_blacklist_test.py
deleted file mode 100644
index bc44da5..0000000
--- a/systrace/catapult/devil/devil/android/device_blacklist_test.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import tempfile
-import unittest
-
-from devil.android import device_blacklist
-
-
-class DeviceBlacklistTest(unittest.TestCase):
-
-  def testBlacklistFileDoesNotExist(self):
-    with tempfile.NamedTemporaryFile() as blacklist_file:
-      # Allow the temporary file to be deleted.
-      pass
-
-    test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
-    self.assertEquals({}, test_blacklist.Read())
-
-  def testBlacklistFileIsEmpty(self):
-    try:
-      with tempfile.NamedTemporaryFile(delete=False) as blacklist_file:
-        # Allow the temporary file to be closed.
-        pass
-
-      test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
-      self.assertEquals({}, test_blacklist.Read())
-
-    finally:
-      if os.path.exists(blacklist_file.name):
-        os.remove(blacklist_file.name)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/device_denylist.py b/systrace/catapult/devil/devil/android/device_denylist.py
deleted file mode 100644
index 88b5969..0000000
--- a/systrace/catapult/devil/devil/android/device_denylist.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import logging
-import os
-import threading
-import time
-
-logger = logging.getLogger(__name__)
-
-
-class Denylist(object):
-  def __init__(self, path):
-    self._denylist_lock = threading.RLock()
-    self._path = path
-
-  def Read(self):
-    """Reads the denylist from the denylist file.
-
-    Returns:
-      A dict containing bad devices.
-    """
-    with self._denylist_lock:
-      denylist = dict()
-      if not os.path.exists(self._path):
-        return denylist
-
-      try:
-        with open(self._path, 'r') as f:
-          denylist = json.load(f)
-      except (IOError, ValueError) as e:
-        logger.warning('Unable to read denylist: %s', str(e))
-        os.remove(self._path)
-
-      if not isinstance(denylist, dict):
-        logger.warning('Ignoring %s: %s (a dict was expected instead)',
-                       self._path, denylist)
-        denylist = dict()
-
-      return denylist
-
-  def Write(self, denylist):
-    """Writes the provided denylist to the denylist file.
-
-    Args:
-      denylist: list of bad devices to write to the denylist file.
-    """
-    with self._denylist_lock:
-      with open(self._path, 'w') as f:
-        json.dump(denylist, f)
-
-  def Extend(self, devices, reason='unknown'):
-    """Adds devices to denylist file.
-
-    Args:
-      devices: list of bad devices to be added to the denylist file.
-      reason: string specifying the reason for denylist (eg: 'unauthorized')
-    """
-    timestamp = time.time()
-    event_info = {
-        'timestamp': timestamp,
-        'reason': reason,
-    }
-    device_dicts = {device: event_info for device in devices}
-    logger.info('Adding %s to denylist %s for reason: %s', ','.join(devices),
-                self._path, reason)
-    with self._denylist_lock:
-      denylist = self.Read()
-      denylist.update(device_dicts)
-      self.Write(denylist)
-
-  def Reset(self):
-    """Erases the denylist file if it exists."""
-    logger.info('Resetting denylist %s', self._path)
-    with self._denylist_lock:
-      if os.path.exists(self._path):
-        os.remove(self._path)
diff --git a/systrace/catapult/devil/devil/android/device_denylist_test.py b/systrace/catapult/devil/devil/android/device_denylist_test.py
deleted file mode 100644
index b5d79e8..0000000
--- a/systrace/catapult/devil/devil/android/device_denylist_test.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import tempfile
-import unittest
-
-from devil.android import device_denylist
-
-
-class DeviceDenylistTest(unittest.TestCase):
-  def testDenylistFileDoesNotExist(self):
-    with tempfile.NamedTemporaryFile() as denylist_file:
-      # Allow the temporary file to be deleted.
-      pass
-
-    test_denylist = device_denylist.Denylist(denylist_file.name)
-    self.assertEquals({}, test_denylist.Read())
-
-  def testDenylistFileIsEmpty(self):
-    try:
-      with tempfile.NamedTemporaryFile(delete=False) as denylist_file:
-        # Allow the temporary file to be closed.
-        pass
-
-      test_denylist = device_denylist.Denylist(denylist_file.name)
-      self.assertEquals({}, test_denylist.Read())
-
-    finally:
-      if os.path.exists(denylist_file.name):
-        os.remove(denylist_file.name)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/device_errors.py b/systrace/catapult/devil/devil/android/device_errors.py
deleted file mode 100644
index 75bf7e3..0000000
--- a/systrace/catapult/devil/devil/android/device_errors.py
+++ /dev/null
@@ -1,241 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Exception classes raised by AdbWrapper and DeviceUtils.
-
-The class hierarchy for device exceptions is:
-
-    base_error.BaseError
-     +-- CommandFailedError
-     |    +-- AdbCommandFailedError
-     |    |    +-- AdbShellCommandFailedError
-     |    +-- AdbVersionError
-     |    +-- FastbootCommandFailedError
-     |    +-- DeviceVersionError
-     |    +-- DeviceChargingError
-     |    +-- RootUserBuildError
-     +-- CommandTimeoutError
-     +-- DeviceUnreachableError
-     +-- NoDevicesError
-     +-- MultipleDevicesError
-     +-- NoAdbError
-
-"""
-
-import six
-
-from devil import base_error
-from devil.utils import cmd_helper
-from devil.utils import parallelizer
-
-
-class CommandFailedError(base_error.BaseError):
-  """Exception for command failures."""
-
-  def __init__(self, message, device_serial=None):
-    device_leader = '(device: %s)' % device_serial
-    if device_serial is not None and not message.startswith(device_leader):
-      message = '%s %s' % (device_leader, message)
-    self.device_serial = device_serial
-    super(CommandFailedError, self).__init__(message)
-
-  def __eq__(self, other):
-    return (super(CommandFailedError, self).__eq__(other)
-            and self.device_serial == other.device_serial)
-
-  def __ne__(self, other):
-    return not self == other
-
-
-class _BaseCommandFailedError(CommandFailedError):
-  """Base Exception for adb and fastboot command failures."""
-
-  def __init__(self,
-               args,
-               output,
-               status=None,
-               device_serial=None,
-               message=None):
-    self.args = args
-    self.output = output
-    self.status = status
-    if not message:
-      adb_cmd = ' '.join(cmd_helper.SingleQuote(arg) for arg in self.args)
-      segments = ['adb %s: failed ' % adb_cmd]
-      if status:
-        segments.append('with exit status %s ' % self.status)
-      if output:
-        segments.append('and output:\n')
-        segments.extend('- %s\n' % line for line in output.splitlines())
-      else:
-        segments.append('and no output.')
-      message = ''.join(segments)
-    super(_BaseCommandFailedError, self).__init__(message, device_serial)
-
-  def __eq__(self, other):
-    return (super(_BaseCommandFailedError, self).__eq__(other)
-            and self.args == other.args and self.output == other.output
-            and self.status == other.status)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __reduce__(self):
-    """Support pickling."""
-    result = [None, None, None, None, None]
-    super_result = super(_BaseCommandFailedError, self).__reduce__()
-    result[:len(super_result)] = super_result
-
-    # Update the args used to reconstruct this exception.
-    result[1] = (self.args, self.output, self.status, self.device_serial,
-                 self.message)
-    return tuple(result)
-
-
-class AdbCommandFailedError(_BaseCommandFailedError):
-  """Exception for adb command failures."""
-
-  def __init__(self,
-               args,
-               output,
-               status=None,
-               device_serial=None,
-               message=None):
-    super(AdbCommandFailedError, self).__init__(
-        args,
-        output,
-        status=status,
-        message=message,
-        device_serial=device_serial)
-
-
-class FastbootCommandFailedError(_BaseCommandFailedError):
-  """Exception for fastboot command failures."""
-
-  def __init__(self,
-               args,
-               output,
-               status=None,
-               device_serial=None,
-               message=None):
-    super(FastbootCommandFailedError, self).__init__(
-        args,
-        output,
-        status=status,
-        message=message,
-        device_serial=device_serial)
-
-
-class DeviceVersionError(CommandFailedError):
-  """Exception for device version failures."""
-
-  def __init__(self, message, device_serial=None):
-    super(DeviceVersionError, self).__init__(message, device_serial)
-
-
-class AdbVersionError(CommandFailedError):
-  """Exception for running a command on an incompatible version of adb."""
-
-  def __init__(self, args, desc=None, actual_version=None, min_version=None):
-    adb_cmd = ' '.join(cmd_helper.SingleQuote(arg) for arg in args)
-    desc = desc or 'not supported'
-    if min_version:
-      desc += ' prior to %s' % min_version
-    if actual_version:
-      desc += ' (actual: %s)' % actual_version
-    super(AdbVersionError,
-          self).__init__(message='adb %s: %s' % (adb_cmd, desc))
-
-
-class AdbShellCommandFailedError(AdbCommandFailedError):
-  """Exception for shell command failures run via adb."""
-
-  def __init__(self, command, output, status, device_serial=None):
-    self.command = command
-    segments = [
-        'shell command run via adb failed on the device:\n',
-        '  command: %s\n' % command
-    ]
-    segments.append('  exit status: %s\n' % status)
-    if output:
-      segments.append('  output:\n')
-      if isinstance(output, six.string_types):
-        output_lines = output.splitlines()
-      else:
-        output_lines = output
-      segments.extend('  - %s\n' % line for line in output_lines)
-    else:
-      segments.append("  output: ''\n")
-    message = ''.join(segments)
-    super(AdbShellCommandFailedError, self).__init__(
-        ['shell', command], output, status, device_serial, message)
-
-  def __reduce__(self):
-    """Support pickling."""
-    result = [None, None, None, None, None]
-    super_result = super(AdbShellCommandFailedError, self).__reduce__()
-    result[:len(super_result)] = super_result
-
-    # Update the args used to reconstruct this exception.
-    result[1] = (self.command, self.output, self.status, self.device_serial)
-    return tuple(result)
-
-
-class CommandTimeoutError(base_error.BaseError):
-  """Exception for command timeouts."""
-
-  def __init__(self, message, is_infra_error=False, output=None):
-    super(CommandTimeoutError, self).__init__(message, is_infra_error)
-    self.output = output
-
-
-class DeviceUnreachableError(base_error.BaseError):
-  """Exception for device unreachable failures."""
-  pass
-
-
-class NoDevicesError(base_error.BaseError):
-  """Exception for having no devices attached."""
-
-  def __init__(self, msg=None):
-    super(NoDevicesError, self).__init__(
-        msg or 'No devices attached.', is_infra_error=True)
-
-
-class MultipleDevicesError(base_error.BaseError):
-  """Exception for having multiple attached devices without selecting one."""
-
-  def __init__(self, devices):
-    parallel_devices = parallelizer.Parallelizer(devices)
-    descriptions = parallel_devices.pMap(lambda d: d.build_description).pGet(
-        None)
-    msg = ('More than one device available. Use -d/--device to select a device '
-           'by serial.\n\nAvailable devices:\n')
-    for d, desc in zip(devices, descriptions):
-      msg += '  %s (%s)\n' % (d, desc)
-
-    super(MultipleDevicesError, self).__init__(msg, is_infra_error=True)
-
-
-class NoAdbError(base_error.BaseError):
-  """Exception for being unable to find ADB."""
-
-  def __init__(self, msg=None):
-    super(NoAdbError, self).__init__(
-        msg or 'Unable to find adb.', is_infra_error=True)
-
-
-class DeviceChargingError(CommandFailedError):
-  """Exception for device charging errors."""
-
-  def __init__(self, message, device_serial=None):
-    super(DeviceChargingError, self).__init__(message, device_serial)
-
-
-class RootUserBuildError(CommandFailedError):
-  """Exception for being unable to root a device with "user" build."""
-
-  def __init__(self, message=None, device_serial=None):
-    super(RootUserBuildError, self).__init__(
-        message or 'Unable to root device with user build.', device_serial)
diff --git a/systrace/catapult/devil/devil/android/device_errors_test.py b/systrace/catapult/devil/devil/android/device_errors_test.py
deleted file mode 100755
index 5fc9e25..0000000
--- a/systrace/catapult/devil/devil/android/device_errors_test.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import pickle
-import sys
-import unittest
-
-from devil.android import device_errors
-
-
-class DeviceErrorsTest(unittest.TestCase):
-  def assertIsPicklable(self, original):
-    pickled = pickle.dumps(original)
-    reconstructed = pickle.loads(pickled)
-    self.assertEquals(original, reconstructed)
-
-  def testPicklable_AdbCommandFailedError(self):
-    original = device_errors.AdbCommandFailedError(
-        ['these', 'are', 'adb', 'args'],
-        'adb failure output',
-        status=':(',
-        device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_AdbShellCommandFailedError(self):
-    original = device_errors.AdbShellCommandFailedError(
-        'foo', 'erroneous foo output', '1', device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_CommandFailedError(self):
-    original = device_errors.CommandFailedError('sample command failed')
-    self.assertIsPicklable(original)
-
-  def testPicklable_CommandTimeoutError(self):
-    original = device_errors.CommandTimeoutError('My fake command timed out :(')
-    self.assertIsPicklable(original)
-
-  def testPicklable_DeviceChargingError(self):
-    original = device_errors.DeviceChargingError('Fake device failed to charge')
-    self.assertIsPicklable(original)
-
-  def testPicklable_DeviceUnreachableError(self):
-    original = device_errors.DeviceUnreachableError
-    self.assertIsPicklable(original)
-
-  def testPicklable_FastbootCommandFailedError(self):
-    original = device_errors.FastbootCommandFailedError(
-        ['these', 'are', 'fastboot', 'args'],
-        'fastboot failure output',
-        status=':(',
-        device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_MultipleDevicesError(self):
-    # TODO(jbudorick): Implement this after implementing a stable DeviceUtils
-    # fake. https://github.com/catapult-project/catapult/issues/3145
-    pass
-
-  def testPicklable_NoAdbError(self):
-    original = device_errors.NoAdbError()
-    self.assertIsPicklable(original)
-
-  def testPicklable_NoDevicesError(self):
-    original = device_errors.NoDevicesError()
-    self.assertIsPicklable(original)
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/systrace/catapult/devil/devil/android/device_list.py b/systrace/catapult/devil/devil/android/device_list.py
deleted file mode 100644
index 5fb586f..0000000
--- a/systrace/catapult/devil/devil/android/device_list.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A module to keep track of devices across builds."""
-
-import json
-import logging
-import os
-
-import six
-
-logger = logging.getLogger(__name__)
-
-
-def GetPersistentDeviceList(file_name):
-  """Returns a list of devices.
-
-  Args:
-    file_name: the file name containing a list of devices.
-
-  Returns: List of device serial numbers that were on the bot.
-  """
-  if not os.path.isfile(file_name):
-    logger.warning("Device file %s doesn't exist.", file_name)
-    return []
-
-  try:
-    with open(file_name) as f:
-      devices = json.load(f)
-    if not isinstance(devices, list) or not all(
-        isinstance(d, six.string_types) for d in devices):
-      logger.warning('Unrecognized device file format: %s', devices)
-      return []
-    return [d for d in devices if d != '(error)']
-  except ValueError:
-    logger.exception(
-        'Error reading device file %s. Falling back to old format.', file_name)
-
-  # TODO(bpastene) Remove support for old unstructured file format.
-  with open(file_name) as f:
-    return [d for d in f.read().splitlines() if d != '(error)']
-
-
-def WritePersistentDeviceList(file_name, device_list):
-  path = os.path.dirname(file_name)
-  assert isinstance(device_list, list)
-  # If there is a problem with ADB "(error)" can be added to the device list.
-  # These should be removed before saving.
-  device_list = [d for d in device_list if d != '(error)']
-  if not os.path.exists(path):
-    os.makedirs(path)
-  with open(file_name, 'w') as f:
-    json.dump(device_list, f)
diff --git a/systrace/catapult/devil/devil/android/device_signal.py b/systrace/catapult/devil/devil/android/device_signal.py
deleted file mode 100644
index a7149b3..0000000
--- a/systrace/catapult/devil/devil/android/device_signal.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Defines constants for signals that should be supported on devices.
-
-Note: Obtained by running `kill -l` on a user device.
-"""
-
-SIGHUP = 1  # Hangup
-SIGINT = 2  # Interrupt
-SIGQUIT = 3  # Quit
-SIGILL = 4  # Illegal instruction
-SIGTRAP = 5  # Trap
-SIGABRT = 6  # Aborted
-SIGBUS = 7  # Bus error
-SIGFPE = 8  # Floating point exception
-SIGKILL = 9  # Killed
-SIGUSR1 = 10  # User signal 1
-SIGSEGV = 11  # Segmentation fault
-SIGUSR2 = 12  # User signal 2
-SIGPIPE = 13  # Broken pipe
-SIGALRM = 14  # Alarm clock
-SIGTERM = 15  # Terminated
-SIGSTKFLT = 16  # Stack fault
-SIGCHLD = 17  # Child exited
-SIGCONT = 18  # Continue
-SIGSTOP = 19  # Stopped (signal)
-SIGTSTP = 20  # Stopped
-SIGTTIN = 21  # Stopped (tty input)
-SIGTTOU = 22  # Stopped (tty output)
-SIGURG = 23  # Urgent I/O condition
-SIGXCPU = 24  # CPU time limit exceeded
-SIGXFSZ = 25  # File size limit exceeded
-SIGVTALRM = 26  # Virtual timer expired
-SIGPROF = 27  # Profiling timer expired
-SIGWINCH = 28  # Window size changed
-SIGIO = 29  # I/O possible
-SIGPWR = 30  # Power failure
-SIGSYS = 31  # Bad system call
diff --git a/systrace/catapult/devil/devil/android/device_temp_file.py b/systrace/catapult/devil/devil/android/device_temp_file.py
deleted file mode 100644
index 84e51cb..0000000
--- a/systrace/catapult/devil/devil/android/device_temp_file.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A temp file that automatically gets pushed and deleted from a device."""
-
-# pylint: disable=W0622
-
-import logging
-import posixpath
-import random
-import threading
-
-from devil import base_error
-from devil.android import device_errors
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-
-def _GenerateName(prefix, suffix, dir):
-  random_hex = hex(random.randint(0, 2**52))[2:]
-  return posixpath.join(dir, '%s-%s%s' % (prefix, random_hex, suffix))
-
-
-class DeviceTempFile(object):
-  """A named temporary file on a device.
-
-  Behaves like tempfile.NamedTemporaryFile.
-  """
-
-  def __init__(self, adb, suffix='', prefix='temp_file', dir='/data/local/tmp'):
-    """Find an unused temporary file path on the device.
-
-    When this object is closed, the file will be deleted on the device.
-
-    Args:
-      adb: An instance of AdbWrapper
-      suffix: The suffix of the name of the temporary file.
-      prefix: The prefix of the name of the temporary file.
-      dir: The directory on the device in which the temporary file should be
-        placed.
-    Raises:
-      ValueError if any of suffix, prefix, or dir are None.
-    """
-    if None in (dir, prefix, suffix):
-      m = 'Provided None path component. (dir: %s, prefix: %s, suffix: %s)' % (
-          dir, prefix, suffix)
-      raise ValueError(m)
-
-    self._adb = adb
-    # Python's random module use 52-bit numbers according to its docs.
-    self.name = _GenerateName(prefix, suffix, dir)
-    self.name_quoted = cmd_helper.SingleQuote(self.name)
-
-  def close(self):
-    """Deletes the temporary file from the device."""
-
-    # ignore exception if the file is already gone.
-    def delete_temporary_file():
-      try:
-        self._adb.Shell(
-            'rm -f %s' % self.name_quoted, expect_status=None, retries=0)
-      except base_error.BaseError as e:
-        # We don't really care, and stack traces clog up the log.
-        # Log a warning and move on.
-        logger.warning('Failed to delete temporary file %s: %s', self.name,
-                       str(e))
-
-    # It shouldn't matter when the temp file gets deleted, so do so
-    # asynchronously.
-    threading.Thread(
-        target=delete_temporary_file,
-        name='delete_temporary_file(%s)' % self._adb.GetDeviceSerial()).start()
-
-  def __enter__(self):
-    return self
-
-  def __exit__(self, type, value, traceback):
-    self.close()
-
-
-class NamedDeviceTemporaryDirectory(object):
-  """A named temporary directory on a device."""
-
-  def __init__(self, adb, suffix='', prefix='tmp', dir='/data/local/tmp'):
-    """Find an unused temporary directory path on the device. The directory is
-    not created until it is used with a 'with' statement.
-
-    When this object is closed, the directory will be deleted on the device.
-
-    Args:
-      adb: An instance of AdbWrapper
-      suffix: The suffix of the name of the temporary directory.
-      prefix: The prefix of the name of the temporary directory.
-      dir: The directory on the device where to place the temporary directory.
-    Raises:
-      ValueError if any of suffix, prefix, or dir are None.
-    """
-    self._adb = adb
-    self.name = _GenerateName(prefix, suffix, dir)
-    self.name_quoted = cmd_helper.SingleQuote(self.name)
-
-  def close(self):
-    """Deletes the temporary directory from the device."""
-
-    def delete_temporary_dir():
-      try:
-        self._adb.Shell('rm -rf %s' % self.name, expect_status=None)
-      except device_errors.AdbCommandFailedError:
-        pass
-
-    threading.Thread(
-        target=delete_temporary_dir,
-        name='delete_temporary_dir(%s)' % self._adb.GetDeviceSerial()).start()
-
-  def __enter__(self):
-    self._adb.Shell('mkdir -p %s' % self.name)
-    return self
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    self.close()
diff --git a/systrace/catapult/devil/devil/android/device_test_case.py b/systrace/catapult/devil/devil/android/device_test_case.py
deleted file mode 100644
index 327d67a..0000000
--- a/systrace/catapult/devil/devil/android/device_test_case.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import threading
-import unittest
-
-from devil.android import device_errors
-from devil.android import device_utils
-
-_devices_lock = threading.Lock()
-_devices_condition = threading.Condition(_devices_lock)
-_devices = set()
-
-
-def PrepareDevices(*_args):
-
-  raw_devices = device_utils.DeviceUtils.HealthyDevices()
-  live_devices = []
-  for d in raw_devices:
-    try:
-      d.WaitUntilFullyBooted(timeout=5, retries=0)
-      live_devices.append(str(d))
-    except (device_errors.CommandFailedError, device_errors.CommandTimeoutError,
-            device_errors.DeviceUnreachableError):
-      pass
-  with _devices_lock:
-    _devices.update(set(live_devices))
-
-  if not _devices:
-    raise Exception('No live devices attached.')
-
-
-class DeviceTestCase(unittest.TestCase):
-  def __init__(self, *args, **kwargs):
-    super(DeviceTestCase, self).__init__(*args, **kwargs)
-    self.serial = None
-
-  #override
-  def setUp(self):
-    super(DeviceTestCase, self).setUp()
-    with _devices_lock:
-      while not _devices:
-        _devices_condition.wait(5)
-      self.serial = _devices.pop()
-
-  #override
-  def tearDown(self):
-    super(DeviceTestCase, self).tearDown()
-    with _devices_lock:
-      _devices.add(self.serial)
-      _devices_condition.notify()
diff --git a/systrace/catapult/devil/devil/android/device_utils.py b/systrace/catapult/devil/devil/android/device_utils.py
deleted file mode 100644
index 093bfc7..0000000
--- a/systrace/catapult/devil/devil/android/device_utils.py
+++ /dev/null
@@ -1,3888 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provides a variety of device interactions based on adb."""
-# pylint: disable=unused-argument
-
-import calendar
-import collections
-import contextlib
-import fnmatch
-import json
-import logging
-import math
-import os
-import posixpath
-import pprint
-import random
-import re
-import shutil
-import stat
-import sys
-import tempfile
-import time
-import threading
-import uuid
-
-import six
-
-from devil import base_error
-from devil import devil_env
-from devil.utils import cmd_helper
-from devil.android import apk_helper
-from devil.android import device_signal
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android import install_commands
-from devil.android import logcat_monitor
-from devil.android import md5sum
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import version_codes
-from devil.utils import host_utils
-from devil.utils import parallelizer
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-from devil.utils import zip_utils
-
-with devil_env.SysPath(devil_env.PY_UTILS_PATH):
-  from py_utils import tempfile_ext
-
-try:
-  from devil.utils import reset_usb
-except ImportError:
-  # Fail silently if we can't import reset_usb. We're likely on windows.
-  reset_usb = None
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-# A sentinel object for default values
-# TODO(jbudorick): revisit how default values are handled by
-# the timeout_retry decorators.
-DEFAULT = object()
-
-# A sentinel object to require that calls to RunShellCommand force running the
-# command with su even if the device has been rooted. To use, pass into the
-# as_root param.
-_FORCE_SU = object()
-
-# Lists all files for the specified directories.
-# In order to minimize data transfer, prints directories as absolute paths
-# followed by files within that directory without their path.
-_FILE_LIST_SCRIPT = """
-  function list_files() {
-    for f in "$1"/{.,}*
-    do
-      if [ "$f" == "." ] || [ "$f" == ".." ] || [ "$f" == "${1}/.*" ] \
-          || [ "$f" == "${1}/*" ]
-      then
-        continue
-      fi
-      base=${f##*/} # Get the basename for the file, dropping the path.
-      echo "$base"
-    done
-  }
-  for dir in %s
-  do
-    if [ -d "$dir" ]; then
-      echo "$dir"
-      list_files "$dir"
-    fi
-  done
-"""
-
-_RESTART_ADBD_SCRIPT = """
-  trap '' HUP
-  trap '' TERM
-  trap '' PIPE
-  function restart() {
-    stop adbd
-    start adbd
-  }
-  restart &
-"""
-
-_UNZIP_AND_CHMOD_SCRIPT = """
-  {bin_dir}/unzip {zip_file} && (for dir in {dirs}
-  do
-    chmod -R 777 "$dir" || exit 1
-  done)
-"""
-
-# Not all permissions can be set.
-_PERMISSIONS_DENYLIST_RE = re.compile('|'.join(
-    fnmatch.translate(p) for p in [
-        'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
-        'android.permission.ACCESS_MOCK_LOCATION',
-        'android.permission.ACCESS_NETWORK_STATE',
-        'android.permission.ACCESS_NOTIFICATION_POLICY',
-        'android.permission.ACCESS_VR_STATE',
-        'android.permission.ACCESS_WIFI_STATE',
-        'android.permission.AUTHENTICATE_ACCOUNTS',
-        'android.permission.BLUETOOTH',
-        'android.permission.BLUETOOTH_ADMIN',
-        'android.permission.BROADCAST_STICKY',
-        'android.permission.CHANGE_NETWORK_STATE',
-        'android.permission.CHANGE_WIFI_MULTICAST_STATE',
-        'android.permission.CHANGE_WIFI_STATE',
-        'android.permission.DISABLE_KEYGUARD',
-        'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION',
-        'android.permission.EXPAND_STATUS_BAR',
-        'android.permission.FOREGROUND_SERVICE',
-        'android.permission.GET_PACKAGE_SIZE',
-        'android.permission.INSTALL_SHORTCUT',
-        'android.permission.INJECT_EVENTS',
-        'android.permission.INTERNET',
-        'android.permission.KILL_BACKGROUND_PROCESSES',
-        'android.permission.MANAGE_ACCOUNTS',
-        'android.permission.MANAGE_EXTERNAL_STORAGE',
-        'android.permission.MODIFY_AUDIO_SETTINGS',
-        'android.permission.NFC',
-        'android.permission.QUERY_ALL_PACKAGES',
-        'android.permission.READ_SYNC_SETTINGS',
-        'android.permission.READ_SYNC_STATS',
-        'android.permission.RECEIVE_BOOT_COMPLETED',
-        'android.permission.RECORD_VIDEO',
-        'android.permission.REORDER_TASKS',
-        'android.permission.REQUEST_INSTALL_PACKAGES',
-        'android.permission.RESTRICTED_VR_ACCESS',
-        'android.permission.RUN_INSTRUMENTATION',
-        'android.permission.SET_ALARM',
-        'android.permission.SET_TIME_ZONE',
-        'android.permission.SET_WALLPAPER',
-        'android.permission.SET_WALLPAPER_HINTS',
-        'android.permission.TRANSMIT_IR',
-        'android.permission.USE_CREDENTIALS',
-        'android.permission.USE_FINGERPRINT',
-        'android.permission.VIBRATE',
-        'android.permission.WAKE_LOCK',
-        'android.permission.WRITE_SYNC_SETTINGS',
-        'com.android.browser.permission.READ_HISTORY_BOOKMARKS',
-        'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS',
-        'com.android.launcher.permission.INSTALL_SHORTCUT',
-        'com.chrome.permission.DEVICE_EXTRAS',
-        'com.google.android.apps.now.CURRENT_ACCOUNT_ACCESS',
-        'com.google.android.c2dm.permission.RECEIVE',
-        'com.google.android.providers.gsf.permission.READ_GSERVICES',
-        'com.google.vr.vrcore.permission.VRCORE_INTERNAL',
-        'com.sec.enterprise.knox.MDM_CONTENT_PROVIDER',
-        '*.permission.C2D_MESSAGE',
-        '*.permission.READ_WRITE_BOOKMARK_FOLDERS',
-        '*.TOS_ACKED',
-    ]))
-_SHELL_OUTPUT_SEPARATOR = '~X~'
-_PERMISSIONS_EXCEPTION_RE = re.compile(r'java\.lang\.\w+Exception: .*$',
-                                       re.MULTILINE)
-
-_CURRENT_FOCUS_CRASH_RE = re.compile(
-    r'\s*mCurrentFocus.*Application (Error|Not Responding): (\S+)}')
-
-_GETPROP_RE = re.compile(r'\[(.*?)\]: \[(.*?)\]')
-_VERSION_CODE_SDK_RE = re.compile(
-    r'\s*versionCode=(\d+).*minSdk=(\d+).*targetSdk=(.*)\s*')
-
-# Regex to parse the long (-l) output of 'ls' command, c.f.
-# https://github.com/landley/toybox/blob/master/toys/posix/ls.c#L446
-# yapf: disable
-_LONG_LS_OUTPUT_RE = re.compile(
-    r'(?P<st_mode>[\w-]{10})\s+'                  # File permissions
-    r'(?:(?P<st_nlink>\d+)\s+)?'                  # Number of links (optional)
-    r'(?P<st_owner>\w+)\s+'                       # Name of owner
-    r'(?P<st_group>\w+)\s+'                       # Group of owner
-    r'(?:'                                        # Either ...
-      r'(?P<st_rdev_major>\d+),\s+'                 # Device major, and
-      r'(?P<st_rdev_minor>\d+)\s+'                  # Device minor
-    r'|'                                          # .. or
-      r'(?P<st_size>\d+)\s+'                        # Size in bytes
-    r')?'                                         # .. or nothing
-    r'(?P<st_mtime>\d{4}-\d\d-\d\d \d\d:\d\d)\s+' # Modification date/time
-    r'(?P<filename>.+?)'                          # File name
-    r'(?: -> (?P<symbolic_link_to>.+))?'          # Symbolic link (optional)
-    r'$'                                          # End of string
-)
-# yapf: enable
-
-_LS_DATE_FORMAT = '%Y-%m-%d %H:%M'
-_FILE_MODE_RE = re.compile(r'[dbclps-](?:[r-][w-][xSs-]){2}[r-][w-][xTt-]$')
-_FILE_MODE_KIND = {
-    'd': stat.S_IFDIR,
-    'b': stat.S_IFBLK,
-    'c': stat.S_IFCHR,
-    'l': stat.S_IFLNK,
-    'p': stat.S_IFIFO,
-    's': stat.S_IFSOCK,
-    '-': stat.S_IFREG
-}
-_FILE_MODE_PERMS = [
-    stat.S_IRUSR,
-    stat.S_IWUSR,
-    stat.S_IXUSR,
-    stat.S_IRGRP,
-    stat.S_IWGRP,
-    stat.S_IXGRP,
-    stat.S_IROTH,
-    stat.S_IWOTH,
-    stat.S_IXOTH,
-]
-_FILE_MODE_SPECIAL = [
-    ('s', stat.S_ISUID),
-    ('s', stat.S_ISGID),
-    ('t', stat.S_ISVTX),
-]
-_PS_COLUMNS = {'pid': 1, 'ppid': 2, 'name': -1}
-_SELINUX_MODE = {'enforcing': True, 'permissive': False, 'disabled': None}
-# Some devices require different logic for checking if root is necessary
-_SPECIAL_ROOT_DEVICE_LIST = [
-    'marlin',  # Pixel XL
-    'sailfish',  # Pixel
-    'taimen',  # Pixel 2 XL
-    'vega',  # Lenovo Mirage Solo
-    'walleye',  # Pixel 2
-    'crosshatch',  # Pixel 3 XL
-    'blueline',  # Pixel 3
-    'sargo',  # Pixel 3a
-    'bonito',  # Pixel 3a XL
-    'sdk_goog3_x86',  # Crow emulator
-]
-_SPECIAL_ROOT_DEVICE_LIST += [
-    'aosp_%s' % _d for _d in _SPECIAL_ROOT_DEVICE_LIST
-]
-
-# Somce devices are slow/timeout when using default install.
-# Devices listed here will perform no_streaming app installation.
-_NO_STREAMING_DEVICE_LIST = [
-    'flounder',  # Nexus 9
-    'volantis',  # Another product name for Nexus 9
-]
-
-_IMEI_RE = re.compile(r'  Device ID = (.+)$')
-# The following regex is used to match result parcels like:
-"""
-Result: Parcel(
-  0x00000000: 00000000 0000000f 00350033 00360033 '........3.5.3.6.'
-  0x00000010: 00360032 00370030 00300032 00300039 '2.6.0.7.2.0.9.0.'
-  0x00000020: 00380033 00000039                   '3.8.9...        ')
-"""
-_PARCEL_RESULT_RE = re.compile(
-    r'0x[0-9a-f]{8}\: (?:[0-9a-f]{8}\s+){1,4}\'(.{16})\'')
-
-# http://bit.ly/2WLZhUF added a timeout to adb wait-for-device. We sometimes
-# want to wait longer than the implicit call within adb root allows.
-_WAIT_FOR_DEVICE_TIMEOUT_STR = 'timeout expired while waiting for device'
-
-_WEBVIEW_SYSUPDATE_CURRENT_PKG_RE = re.compile(
-    r'Current WebView package.*:.*\(([a-z.]*),')
-_WEBVIEW_SYSUPDATE_NULL_PKG_RE = re.compile(r'Current WebView package is null')
-_WEBVIEW_SYSUPDATE_FALLBACK_LOGIC_RE = re.compile(
-    r'Fallback logic enabled: (true|false)')
-_WEBVIEW_SYSUPDATE_PACKAGE_INSTALLED_RE = re.compile(
-    r'(?:Valid|Invalid) package\s+(\S+)\s+\(.*\),?\s+(.*)$')
-_WEBVIEW_SYSUPDATE_PACKAGE_NOT_INSTALLED_RE = re.compile(
-    r'(\S+)\s+(is NOT installed\.)')
-_WEBVIEW_SYSUPDATE_MIN_VERSION_CODE = re.compile(
-    r'Minimum WebView version code: (\d+)')
-
-_GOOGLE_FEATURES_RE = re.compile(r'^\s*com\.google\.')
-
-_EMULATOR_RE = re.compile(r'^generic_.*$')
-
-# Regular expressions for determining if a package is installed using the
-# output of `dumpsys package`.
-# Matches lines like "Package [com.google.android.youtube] (c491050):".
-# or "Package [org.chromium.trichromelibrary_425300033] (e476383):"
-_DUMPSYS_PACKAGE_RE_STR =\
-    r'^\s*Package\s*\[%s(_(?P<version_code>\d*))?\]\s*\(\w*\):$'
-
-PS_COLUMNS = ('name', 'pid', 'ppid')
-ProcessInfo = collections.namedtuple('ProcessInfo', PS_COLUMNS)
-
-
-@decorators.WithExplicitTimeoutAndRetries(_DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-def GetAVDs():
-  """Returns a list of Android Virtual Devices.
-
-  Returns:
-    A list containing the configured AVDs.
-  """
-  lines = cmd_helper.GetCmdOutput([
-      os.path.join(
-          devil_env.config.LocalPath('android_sdk'), 'tools', 'android'),
-      'list', 'avd'
-  ]).splitlines()
-  avds = []
-  for line in lines:
-    if 'Name:' not in line:
-      continue
-    key, value = (s.strip() for s in line.split(':', 1))
-    if key == 'Name':
-      avds.append(value)
-  return avds
-
-
-def _ParseModeString(mode_str):
-  """Parse a mode string, e.g. 'drwxrwxrwx', into a st_mode value.
-
-  Effectively the reverse of |mode_to_string| in, e.g.:
-  https://github.com/landley/toybox/blob/master/lib/lib.c#L896
-  """
-  if not _FILE_MODE_RE.match(mode_str):
-    raise ValueError('Unexpected file mode %r', mode_str)
-  mode = _FILE_MODE_KIND[mode_str[0]]
-  for c, flag in zip(mode_str[1:], _FILE_MODE_PERMS):
-    if c != '-' and c.islower():
-      mode |= flag
-  for c, (t, flag) in zip(mode_str[3::3], _FILE_MODE_SPECIAL):
-    if c.lower() == t:
-      mode |= flag
-  return mode
-
-
-def _GetTimeStamp():
-  """Return a basic ISO 8601 time stamp with the current local time."""
-  return time.strftime('%Y%m%dT%H%M%S', time.localtime())
-
-
-def _JoinLines(lines):
-  # makes sure that the last line is also terminated, and is more memory
-  # efficient than first appending an end-line to each line and then joining
-  # all of them together.
-  return ''.join(s for line in lines for s in (line, '\n'))
-
-
-def _CreateAdbWrapper(device):
-  if isinstance(device, adb_wrapper.AdbWrapper):
-    return device
-  else:
-    return adb_wrapper.AdbWrapper(device)
-
-
-def _FormatPartialOutputError(output):
-  lines = output.splitlines() if isinstance(output, six.string_types) else output
-  message = ['Partial output found:']
-  if len(lines) > 11:
-    message.extend('- %s' % line for line in lines[:5])
-    message.extend('<snip>')
-    message.extend('- %s' % line for line in lines[-5:])
-  else:
-    message.extend('- %s' % line for line in lines)
-  return '\n'.join(message)
-
-
-_PushableComponents = collections.namedtuple('_PushableComponents',
-                                             ('host', 'device', 'collapse'))
-
-
-def _IterPushableComponents(host_path, device_path):
-  """Yields a sequence of paths that can be pushed directly via adb push.
-
-  `adb push` doesn't currently handle pushing directories that contain
-  symlinks: https://bit.ly/2pMBlW5
-
-  To circumvent this issue, we get the smallest set of files and/or
-  directories that can be pushed without attempting to push a directory
-  that contains a symlink.
-
-  This function does so by recursing through |host_path|. Each call
-  yields 3-tuples that include the smallest set of (host, device) path pairs
-  that can be passed to adb push and a bool indicating whether the parent
-  directory can be pushed -- i.e., if True, the host path is neither a
-  symlink nor a directory that contains a symlink.
-
-  Args:
-    host_path: an absolute path of a file or directory on the host
-    device_path: an absolute path of a file or directory on the device
-  Yields:
-    3-tuples containing
-      host (str): the host path, with symlinks dereferenced
-      device (str): the device path
-      collapse (bool): whether this entity permits its parent to be pushed
-        in its entirety. (Parents need permission from all child entities
-        in order to be pushed in their entirety.)
-  """
-  if os.path.isfile(host_path):
-    yield _PushableComponents(
-        os.path.realpath(host_path), device_path, not os.path.islink(host_path))
-  else:
-    components = []
-    for child in os.listdir(host_path):
-      components.extend(
-          _IterPushableComponents(
-              os.path.join(host_path, child), posixpath.join(
-                  device_path, child)))
-
-    if all(c.collapse for c in components):
-      yield _PushableComponents(
-          os.path.realpath(host_path), device_path,
-          not os.path.islink(host_path))
-    else:
-      for c in components:
-        yield c
-
-
-class DeviceUtils(object):
-
-  _MAX_ADB_COMMAND_LENGTH = 512
-  _MAX_ADB_OUTPUT_LENGTH = 32768
-  _LAUNCHER_FOCUSED_RE = re.compile(r'\s*mCurrentFocus.*(Launcher|launcher).*')
-  _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$')
-
-  LOCAL_PROPERTIES_PATH = posixpath.join('/', 'data', 'local.prop')
-
-  # Property in /data/local.prop that controls Java assertions.
-  JAVA_ASSERT_PROPERTY = 'dalvik.vm.enableassertions'
-
-  def __init__(self,
-               device,
-               enable_device_files_cache=False,
-               default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """DeviceUtils constructor.
-
-    Args:
-      device: Either a device serial, an existing AdbWrapper instance, or an
-        an existing AndroidCommands instance.
-      enable_device_files_cache: For PushChangedFiles(), cache checksums of
-        pushed files rather than recomputing them on a subsequent call.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-    """
-    self.adb = None
-    if isinstance(device, six.string_types):
-      self.adb = _CreateAdbWrapper(device)
-    elif isinstance(device, adb_wrapper.AdbWrapper):
-      self.adb = device
-    else:
-      raise ValueError('Unsupported device value: %r' % device)
-    self._commands_installed = None
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-    self._enable_device_files_cache = enable_device_files_cache
-    self._cache = {}
-    self._client_caches = {}
-    self._cache_lock = threading.RLock()
-    assert hasattr(self, decorators.DEFAULT_TIMEOUT_ATTR)
-    assert hasattr(self, decorators.DEFAULT_RETRIES_ATTR)
-
-    self.ClearCache()
-
-  @property
-  def serial(self):
-    """Returns the device serial."""
-    return self.adb.GetDeviceSerial()
-
-  def __eq__(self, other):
-    """Checks whether |other| refers to the same device as |self|.
-
-    Args:
-      other: The object to compare to. This can be a basestring, an instance
-        of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
-    Returns:
-      Whether |other| refers to the same device as |self|.
-    """
-    return self.serial == str(other)
-
-  def __lt__(self, other):
-    """Compares two instances of DeviceUtils.
-
-    This merely compares their serial numbers.
-
-    Args:
-      other: The instance of DeviceUtils to compare to.
-    Returns:
-      Whether |self| is less than |other|.
-    """
-    return self.serial < other.serial
-
-  def __str__(self):
-    """Returns the device serial."""
-    return self.serial
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsOnline(self, timeout=None, retries=None):
-    """Checks whether the device is online.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is online, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    try:
-      return self.adb.GetState() == 'device'
-    except base_error.BaseError as exc:
-      logger.info('Failed to get state: %s', exc)
-      return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def HasRoot(self, timeout=None, retries=None):
-    """Checks whether or not adbd has root privileges.
-
-    A device is considered to have root if all commands are implicitly run
-    with elevated privileges, i.e. without having to use "su" to run them.
-
-    Note that some devices do not allow this implicit privilige elevation,
-    but _can_ run commands as root just fine when done explicitly with "su".
-    To check if your device can run commands with elevated privileges at all
-    use:
-
-      device.HasRoot() or device.NeedsSU()
-
-    Luckily, for the most part you don't need to worry about this and using
-    RunShellCommand(cmd, as_root=True) will figure out for you the right
-    command incantation to run with elevated privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if adbd has root privileges, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if self.build_type == 'eng':
-      # 'eng' builds have root enabled by default and the adb session cannot
-      # be unrooted.
-      return True
-    # Check if uid is 0. Such behavior has remained unchanged since
-    # android 2.2.3 (https://bit.ly/2QQzg67)
-    output = self.RunShellCommand(['id'], single_line=True)
-    return output.startswith('uid=0(root)')
-
-  def NeedsSU(self, timeout=DEFAULT, retries=DEFAULT):
-    """Checks whether 'su' is needed to access protected resources.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if 'su' is available on the device and is needed to to access
-        protected resources; False otherwise if either 'su' is not available
-        (e.g. because the device has a user build), or not needed (because adbd
-        already has root privileges).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if 'needs_su' not in self._cache:
-      cmd = '%s && ! ls /root' % self._Su('ls /root')
-      # Devices using the system-as-root partition layout appear to not have
-      # a /root directory. See http://bit.ly/37F34sx for more context.
-      if (self.build_system_root_image == 'true'
-          or self.build_version_sdk >= version_codes.Q
-          # This may be redundant with the checks above.
-          or self.product_name in _SPECIAL_ROOT_DEVICE_LIST):
-        if self.HasRoot():
-          self._cache['needs_su'] = False
-          return False
-        cmd = 'which which && which su'
-      try:
-        self.RunShellCommand(
-            cmd,
-            shell=True,
-            check_return=True,
-            timeout=self._default_timeout if timeout is DEFAULT else timeout,
-            retries=self._default_retries if retries is DEFAULT else retries)
-        self._cache['needs_su'] = True
-      except device_errors.AdbCommandFailedError:
-        self._cache['needs_su'] = False
-    return self._cache['needs_su']
-
-  def _Su(self, command):
-    if self.build_version_sdk >= version_codes.MARSHMALLOW:
-      return 'su 0 %s' % command
-    return 'su -c %s' % command
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def EnableRoot(self, timeout=None, retries=None):
-    """Restarts adbd with root privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if root could not be enabled.
-      CommandTimeoutError on timeout.
-    """
-    if 'needs_su' in self._cache:
-      del self._cache['needs_su']
-
-    try:
-      self.adb.Root()
-    except device_errors.AdbCommandFailedError as e:
-      if self.IsUserBuild():
-        raise device_errors.RootUserBuildError(device_serial=str(self))
-      elif e.output and _WAIT_FOR_DEVICE_TIMEOUT_STR in e.output:
-        # adb 1.0.41 added a call to wait-for-device *inside* root
-        # with a timeout that can be too short in some cases.
-        # If we hit that timeout, ignore it & do our own wait below.
-        pass
-      else:
-        raise  # Failed probably due to some other reason.
-
-    def device_online_with_root():
-      try:
-        self.adb.WaitForDevice()
-        return self.HasRoot()
-      except (device_errors.AdbCommandFailedError,
-              device_errors.DeviceUnreachableError):
-        return False
-
-    timeout_retry.WaitFor(device_online_with_root, wait_period=1)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsUserBuild(self, timeout=None, retries=None):
-    """Checks whether or not the device is running a user build.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is running a user build, False otherwise (i.e. if
-        it's running a userdebug build).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    return self.build_type == 'user'
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetExternalStoragePath(self, timeout=None, retries=None):
-    """Get the device's path to its SD card.
-
-    Note: this path is read-only by apps in R+. Use GetAppWritablePath() to
-    obtain a path writable by apps.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's path to its SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self._EnsureCacheInitialized()
-    if not self._cache['external_storage']:
-      raise device_errors.CommandFailedError('$EXTERNAL_STORAGE is not set',
-                                             str(self))
-    return self._cache['external_storage']
-
-  def GetAppWritablePath(self, timeout=None, retries=None):
-    """Get a path that on the device's SD card that apps can write.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A app-writeable path on the device's SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if self.build_version_sdk >= version_codes.Q:
-      # On Q+ apps don't require permissions to access well-defined media
-      # locations like /sdcard/Download. On R+ the WRITE_EXTERNAL_STORAGE
-      # permission no longer provides access to the external storage root. See
-      # https://developer.android.com/preview/privacy/storage#permissions-target-11
-      # So use /sdcard/Download for the app-writable path on those versions.
-      return posixpath.join(self.GetExternalStoragePath(), 'Download')
-    return self.GetExternalStoragePath()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetIMEI(self, timeout=None, retries=None):
-    """Get the device's IMEI.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's IMEI.
-
-    Raises:
-      AdbCommandFailedError on error
-    """
-    if self._cache.get('imei') is not None:
-      return self._cache.get('imei')
-
-    if self.build_version_sdk < 21:
-      out = self.RunShellCommand(['dumpsys', 'iphonesubinfo'],
-                                 raw_output=True,
-                                 check_return=True)
-      if out:
-        match = re.search(_IMEI_RE, out)
-        if match:
-          self._cache['imei'] = match.group(1)
-          return self._cache['imei']
-    else:
-      out = self.RunShellCommand(['service', 'call', 'iphonesubinfo', '1'],
-                                 check_return=True)
-      if out:
-        imei = ''
-        for line in out:
-          match = re.search(_PARCEL_RESULT_RE, line)
-          if match:
-            imei = imei + match.group(1)
-        imei = imei.replace('.', '').strip()
-        if imei:
-          self._cache['imei'] = imei
-          return self._cache['imei']
-
-    raise device_errors.CommandFailedError('Unable to fetch IMEI.')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsApplicationInstalled(
-      self, package, version_code=None, timeout=None, retries=None):
-    """Determines whether a particular package is installed on the device.
-
-    Args:
-      package: Name of the package.
-      version_code: The version of the package to check for as an int, if
-          applicable. Only used for static shared libraries, otherwise ignored.
-
-    Returns:
-      True if the application is installed, False otherwise.
-    """
-    # `pm list packages` doesn't include the version code, so if it was
-    # provided, skip this since we can't guarantee that the installed
-    # version is the requested version.
-    if version_code is None:
-      # `pm list packages` allows matching substrings, but we want exact matches
-      # only.
-      matching_packages = self.RunShellCommand(
-          ['pm', 'list', 'packages', package], check_return=True)
-      desired_line = 'package:' + package
-      found_package = desired_line in matching_packages
-      if found_package:
-        return True
-
-    # Some packages do not properly show up via `pm list packages`, so fall back
-    # to checking via `dumpsys package`.
-    matcher = re.compile(_DUMPSYS_PACKAGE_RE_STR % package)
-    dumpsys_output = self.RunShellCommand(
-        ['dumpsys', 'package'], check_return=True, large_output=True)
-    for line in dumpsys_output:
-      match = matcher.match(line)
-      # We should have one of these cases:
-      # 1. The package is a regular app, in which case it will show up without
-      #    its version code in the line we're filtering for.
-      # 2. The package is a static shared library, in which case one or more
-      #    entries with the version code can show up, but not one without the
-      #    version code.
-      if match:
-        installed_version_code = match.groupdict().get('version_code')
-        if (installed_version_code is None
-            or installed_version_code == str(version_code)):
-          return True
-    return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationPaths(self, package, timeout=None, retries=None):
-    """Get the paths of the installed apks on the device for the given package.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      List of paths to the apks on the device for the given package.
-    """
-    return self._GetApplicationPathsInternal(package)
-
-  def _GetApplicationPathsInternal(self, package, skip_cache=False):
-    cached_result = self._cache['package_apk_paths'].get(package)
-    if cached_result is not None and not skip_cache:
-      if package in self._cache['package_apk_paths_to_verify']:
-        self._cache['package_apk_paths_to_verify'].remove(package)
-        # Don't verify an app that is not thought to be installed. We are
-        # concerned only with apps we think are installed having been
-        # uninstalled manually.
-        if cached_result and not self.PathExists(cached_result):
-          cached_result = None
-          self._cache['package_apk_checksums'].pop(package, 0)
-      if cached_result is not None:
-        return list(cached_result)
-    # 'pm path' is liable to incorrectly exit with a nonzero number starting
-    # in Lollipop.
-    # TODO(jbudorick): Check if this is fixed as new Android versions are
-    # released to put an upper bound on this.
-    should_check_return = (self.build_version_sdk < version_codes.LOLLIPOP)
-    output = self.RunShellCommand(['pm', 'path', package],
-                                  check_return=should_check_return)
-    apks = []
-    bad_output = False
-    for line in output:
-      if line.startswith('package:'):
-        apks.append(line[len('package:'):])
-      elif line.startswith('WARNING:'):
-        continue
-      else:
-        bad_output = True  # Unexpected line in output.
-    if not apks and output:
-      if bad_output:
-        raise device_errors.CommandFailedError(
-            'Unexpected pm path output: %r' % '\n'.join(output), str(self))
-      else:
-        logger.warning('pm returned no paths but the following warnings:')
-        for line in output:
-          logger.warning('- %s', line)
-    self._cache['package_apk_paths'][package] = list(apks)
-    return apks
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationVersion(self, package, timeout=None, retries=None):
-    """Get the version name of a package installed on the device.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the version name or None if the package is not found
-      on the device.
-    """
-    output = self.RunShellCommand(['dumpsys', 'package', package],
-                                  check_return=True)
-    if not output:
-      return None
-    for line in output:
-      line = line.strip()
-      if line.startswith('versionName='):
-        return line[len('versionName='):]
-    raise device_errors.CommandFailedError(
-        'Version name for %s not found on dumpsys output' % package, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationTargetSdk(self, package, timeout=None, retries=None):
-    """Get the targetSdkVersion of a package installed on the device.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the targetSdkVersion or None if the package is not found on
-      the device. Note: this cannot always be cast to an integer. If this
-      application targets a pre-release SDK, this returns the version codename
-      instead (ex. "R").
-    """
-    if not self.IsApplicationInstalled(package):
-      return None
-    lines = self._GetDumpsysOutput(['package', package], 'targetSdk=')
-    for line in lines:
-      m = _VERSION_CODE_SDK_RE.match(line)
-      if m:
-        value = m.group(3)
-        # 10000 is the code used by Android for a pre-finalized SDK.
-        if value == '10000':
-          return self.GetProp('ro.build.version.codename', cache=True)
-        else:
-          return value
-    raise device_errors.CommandFailedError(
-        'targetSdkVersion for %s not found on dumpsys output' % package,
-        str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPackageArchitecture(self, package, timeout=None, retries=None):
-    """Get the architecture of a package installed on the device.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the architecture, or None if the package is missing.
-    """
-    lines = self._GetDumpsysOutput(['package', package], 'primaryCpuAbi')
-    if lines:
-      _, _, package_arch = lines[-1].partition('=')
-      return package_arch.strip()
-    return None
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationDataDirectory(self, package, timeout=None, retries=None):
-    """Get the data directory on the device for the given package.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      The package's data directory.
-    Raises:
-      CommandFailedError if the package's data directory can't be found,
-        whether because it's not installed or otherwise.
-    """
-    if not self.IsApplicationInstalled(package):
-      raise device_errors.CommandFailedError('%s is not installed' % package,
-                                             str(self))
-    output = self._RunPipedShellCommand(
-        'pm dump %s | grep dataDir=' % cmd_helper.SingleQuote(package))
-    for line in output:
-      _, _, dataDir = line.partition('dataDir=')
-      if dataDir:
-        return dataDir
-    raise device_errors.CommandFailedError(
-        'Could not find data directory for %s' % package, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetSecurityContextForPackage(self,
-                                   package,
-                                   encrypted=False,
-                                   timeout=None,
-                                   retries=None):
-    """Gets the SELinux security context for the given package.
-
-    Args:
-      package: Name of the package.
-      encrypted: Whether to check in the encrypted data directory
-          (/data/user_de/0/) or the unencrypted data directory (/data/data/).
-
-    Returns:
-      The package's security context as a string, or None if not found.
-    """
-    directory = '/data/user_de/0/' if encrypted else '/data/data/'
-    for line in self.RunShellCommand(['ls', '-Z', directory],
-                                     as_root=True,
-                                     check_return=True):
-      split_line = line.split()
-      # ls -Z output differs between Android versions, but the package is
-      # always last and the context always starts with "u:object"
-      if split_line[-1] == package:
-        for column in split_line:
-          if column.startswith('u:object'):
-            return column
-    return None
-
-  def TakeBugReport(self, path, timeout=60 * 5, retries=None):
-    """Takes a bug report and dumps it to the specified path.
-
-    This doesn't use adb's bugreport option since its behavior is dependent on
-    both adb version and device OS version. To make it simpler, this directly
-    runs the bugreport command on the device itself and dumps the stdout to a
-    file.
-
-    Args:
-      path: Path on the host to drop the bug report.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    with device_temp_file.DeviceTempFile(self.adb) as device_tmp_file:
-      cmd = '( bugreport )>%s 2>&1' % device_tmp_file.name
-      self.RunShellCommand(
-          cmd, check_return=True, shell=True, timeout=timeout, retries=retries)
-      self.PullFile(device_tmp_file.name, path)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WaitUntilFullyBooted(self,
-                           wifi=False,
-                           decrypt=False,
-                           timeout=None,
-                           retries=None):
-    """Wait for the device to fully boot.
-
-    This means waiting for the device to boot, the package manager to be
-    available, and the SD card to be ready.
-    It can optionally wait the following:
-     - Wait for wifi to come up.
-     - Wait for full-disk decryption to complete.
-
-    Args:
-      wifi: A boolean indicating if we should wait for wifi to come up or not.
-      decrypt: A boolean indicating if we should wait for full-disk decryption
-        to complete.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError if one of the component waits times out.
-      DeviceUnreachableError if the device becomes unresponsive.
-    """
-
-    def sd_card_ready():
-      try:
-        self.RunShellCommand(
-            ['test', '-d', self.GetExternalStoragePath()], check_return=True)
-        return True
-      except device_errors.AdbCommandFailedError:
-        return False
-
-    def pm_ready():
-      try:
-        return self._GetApplicationPathsInternal('android', skip_cache=True)
-      except device_errors.CommandFailedError:
-        return False
-
-    def boot_completed():
-      try:
-        return self.GetProp('sys.boot_completed', cache=False) == '1'
-      except device_errors.CommandFailedError:
-        return False
-
-    def wifi_enabled():
-      return 'Wi-Fi is enabled' in self.RunShellCommand(['dumpsys', 'wifi'],
-                                                        check_return=False)
-
-    def decryption_completed():
-      try:
-        decrypt = self.GetProp('vold.decrypt', cache=False)
-        # The prop "void.decrypt" will only be set when the device uses
-        # full-disk encryption (FDE).
-        # Return true when:
-        #  - The prop is empty, which means the device is unencrypted or uses
-        #    file-based encryption (FBE).
-        #  - or the prop has value "trigger_restart_framework", which means
-        #    the decription is finished.
-        return decrypt == '' or decrypt == 'trigger_restart_framework'
-      except device_errors.CommandFailedError:
-        return False
-
-    self.adb.WaitForDevice()
-    timeout_retry.WaitFor(sd_card_ready)
-    timeout_retry.WaitFor(pm_ready)
-    timeout_retry.WaitFor(boot_completed)
-    if wifi:
-      timeout_retry.WaitFor(wifi_enabled)
-    if decrypt:
-      timeout_retry.WaitFor(decryption_completed)
-
-  REBOOT_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=REBOOT_DEFAULT_TIMEOUT)
-  def Reboot(self,
-             block=True,
-             wifi=False,
-             decrypt=False,
-             timeout=None,
-             retries=None):
-    """Reboot the device.
-
-    Note if the device has the root privilege, it will likely lose it after the
-    reboot. When |block| is True, it will try to restore the root status if
-    applicable.
-
-    Args:
-      block: A boolean indicating if we should wait for the reboot to complete.
-      wifi: A boolean indicating if we should wait for wifi to be enabled after
-        the reboot.
-        The option has no effect unless |block| is also True.
-      decrypt: A boolean indicating if we should wait for full-disk decryption
-        to complete after the reboot.
-        The option has no effect unless |block| is also True.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    def device_offline():
-      return not self.IsOnline()
-
-    # Only check the root when block is True
-    should_restore_root = self.HasRoot() if block else False
-    self.adb.Reboot()
-    self.ClearCache()
-    timeout_retry.WaitFor(device_offline, wait_period=1)
-    if block:
-      self.WaitUntilFullyBooted(wifi=wifi, decrypt=decrypt)
-      if should_restore_root:
-        self.EnableRoot()
-
-  INSTALL_DEFAULT_TIMEOUT = 8 * _DEFAULT_TIMEOUT
-  MODULES_SRC_DIRECTORY_PATH = '/data/local/tmp/modules'
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
-  def Install(self,
-              apk,
-              allow_downgrade=False,
-              reinstall=False,
-              permissions=None,
-              timeout=None,
-              retries=None,
-              modules=None,
-              fake_modules=None,
-              additional_locales=None):
-    """Install an APK or app bundle.
-
-    Noop if an identical APK is already installed. If installing a bundle, the
-    bundletools helper script (bin/*_bundle) should be used rather than the .aab
-    file.
-
-    Args:
-      apk: An ApkHelper instance or string containing the path to the APK or
-        bundle.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-        Ignored if |apk| is a bundle.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-      modules: An iterable containing specific bundle modules to install.
-          Error if set and |apk| points to an APK instead of a bundle.
-      fake_modules: An iterable containing specific bundle modules that should
-          have their apks copied to |MODULES_SRC_DIRECTORY_PATH| subdirectory
-          rather than installed. Thus the app can emulate SplitCompat while
-          running. This should not have any overlap with |modules|.
-      additional_locales: An iterable with additional locales to install for a
-        bundle.
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-    """
-    apk = apk_helper.ToHelper(apk)
-    modules_set = set(modules or [])
-    fake_modules_set = set(fake_modules or [])
-    assert modules_set.isdisjoint(fake_modules_set), (
-        'These modules overlap: %s' % (modules_set & fake_modules_set))
-    all_modules = modules_set | fake_modules_set
-    package_name = apk.GetPackageName()
-
-    with apk.GetApkPaths(self,
-                         modules=all_modules,
-                         additional_locales=additional_locales) as apk_paths:
-      if apk.SupportsSplits():
-        fake_apk_paths = self._GetFakeInstallPaths(apk_paths, fake_modules)
-        self._FakeInstall(fake_apk_paths, fake_modules, package_name)
-        apk_paths_to_install = [p for p in apk_paths if p not in fake_apk_paths]
-      else:
-        apk_paths_to_install = apk_paths
-      self._InstallInternal(
-          apk,
-          apk_paths_to_install,
-          allow_downgrade=allow_downgrade,
-          reinstall=reinstall,
-          permissions=permissions)
-
-  @staticmethod
-  def _GetFakeInstallPaths(apk_paths, fake_modules):
-    def IsFakeModulePath(path):
-      filename = os.path.basename(path)
-      return any(filename.startswith(f + '-') for f in fake_modules)
-
-    if not fake_modules:
-      return set()
-    return set(p for p in apk_paths if IsFakeModulePath(p))
-
-  def _FakeInstall(self, fake_apk_paths, fake_modules, package_name):
-    with tempfile_ext.NamedTemporaryDirectory() as modules_dir:
-      device_dir = posixpath.join(self.MODULES_SRC_DIRECTORY_PATH, package_name)
-      if not fake_modules:
-        # Push empty module dir to clear device dir and update the cache.
-        self.PushChangedFiles([(modules_dir, device_dir)],
-                              delete_device_stale=True)
-        return
-
-      still_need_master = set(fake_modules)
-      for path in fake_apk_paths:
-        filename = os.path.basename(path)
-        # Example names: base-en.apk, test_dummy-master.apk.
-        module_name, suffix = filename.split('-', 1)
-        if 'master' in suffix:
-          assert module_name in still_need_master, (
-              'Duplicate master apk file for %s' % module_name)
-          still_need_master.remove(module_name)
-          new_filename = '%s.apk' % module_name
-        else:
-          # |suffix| includes .apk extension.
-          new_filename = '%s.config.%s' % (module_name, suffix)
-        new_path = os.path.join(modules_dir, new_filename)
-        os.rename(path, new_path)
-
-      assert not still_need_master, (
-          'Missing master apk file for %s' % still_need_master)
-      self.PushChangedFiles([(modules_dir, device_dir)],
-                            delete_device_stale=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
-  def InstallSplitApk(self,
-                      base_apk,
-                      split_apks,
-                      allow_downgrade=False,
-                      reinstall=False,
-                      allow_cached_props=False,
-                      permissions=None,
-                      timeout=None,
-                      retries=None):
-    """Install a split APK.
-
-    Noop if all of the APK splits are already installed.
-
-    Args:
-      base_apk: An ApkHelper instance or string containing the path to the base
-          APK.
-      split_apks: A list of strings of paths of all of the APK splits.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      allow_cached_props: Whether to use cached values for device properties.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-      DeviceVersionError if device SDK is less than Android L.
-    """
-    apk = apk_helper.ToSplitHelper(base_apk, split_apks)
-    with apk.GetApkPaths(
-        self, allow_cached_props=allow_cached_props) as apk_paths:
-      self._InstallInternal(
-          apk,
-          apk_paths,
-          reinstall=reinstall,
-          permissions=permissions,
-          allow_downgrade=allow_downgrade)
-
-  def _InstallInternal(self,
-                       apk,
-                       apk_paths,
-                       allow_downgrade=False,
-                       reinstall=False,
-                       permissions=None):
-    if not apk_paths:
-      raise device_errors.CommandFailedError('Did not get any APKs to install')
-
-    if len(apk_paths) > 1:
-      self._CheckSdkLevel(version_codes.LOLLIPOP)
-
-    missing_apks = [a for a in apk_paths if not os.path.exists(a)]
-    if missing_apks:
-      raise device_errors.CommandFailedError(
-          'Attempted to install non-existent apks: %s' %
-          pprint.pformat(missing_apks))
-
-    package_name = apk.GetPackageName()
-    device_apk_paths = self._GetApplicationPathsInternal(package_name)
-
-    host_checksums = None
-    if not device_apk_paths:
-      apks_to_install = apk_paths
-    elif len(device_apk_paths) > 1 and len(apk_paths) == 1:
-      logger.warning(
-          'Installing non-split APK when split APK was previously installed')
-      apks_to_install = apk_paths
-    elif len(device_apk_paths) == 1 and len(apk_paths) > 1:
-      logger.warning(
-          'Installing split APK when non-split APK was previously installed')
-      apks_to_install = apk_paths
-    else:
-      try:
-        apks_to_install, host_checksums = (self._ComputeStaleApks(
-            package_name, apk_paths))
-      except device_errors.CommandFailedError as e:
-        logger.warning('Error calculating md5: %s', e)
-        apks_to_install, host_checksums = apk_paths, None
-      if apks_to_install and not reinstall:
-        apks_to_install = apk_paths
-
-    if device_apk_paths and apks_to_install and not reinstall:
-      logger.info('Uninstalling package %s', package_name)
-      self.Uninstall(package_name)
-
-    if apks_to_install:
-      # Assume that we won't know the resulting device state.
-      self._cache['package_apk_paths'].pop(package_name, 0)
-      self._cache['package_apk_checksums'].pop(package_name, 0)
-      partial = package_name if len(apks_to_install) < len(apk_paths) else None
-      streaming = None
-      if self.product_name in _NO_STREAMING_DEVICE_LIST:
-        streaming = False
-      logger.info('Installing package %s using APKs %s',
-                  package_name, apks_to_install)
-      if len(apks_to_install) > 1 or partial:
-        self.adb.InstallMultiple(
-            apks_to_install,
-            partial=partial,
-            reinstall=reinstall,
-            streaming=streaming,
-            allow_downgrade=allow_downgrade)
-      else:
-        self.adb.Install(
-            apks_to_install[0],
-            reinstall=reinstall,
-            streaming=streaming,
-            allow_downgrade=allow_downgrade)
-    else:
-      logger.info('Skipping installation of package %s', package_name)
-      # Running adb install terminates running instances of the app, so to be
-      # consistent, we explicitly terminate it when skipping the install.
-      self.ForceStop(package_name)
-
-    # There have been cases of APKs not being detected after being explicitly
-    # installed, so perform a sanity check now and fail early if the
-    # installation somehow failed.
-    apk_version = apk.GetVersionCode()
-    if not self.IsApplicationInstalled(package_name, apk_version):
-      raise device_errors.CommandFailedError(
-          'Package %s with version %s not installed on device after explicit '
-          'install attempt.' % (package_name, apk_version))
-
-    if (permissions is None
-        and self.build_version_sdk >= version_codes.MARSHMALLOW):
-      permissions = apk.GetPermissions()
-    self.GrantPermissions(package_name, permissions)
-    # Upon success, we know the device checksums, but not their paths.
-    if host_checksums is not None:
-      self._cache['package_apk_checksums'][package_name] = host_checksums
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def Uninstall(self, package_name, keep_data=False, timeout=None,
-                retries=None):
-    """Remove the app |package_name| from the device.
-
-    This is a no-op if the app is not already installed.
-
-    Args:
-      package_name: The package to uninstall.
-      keep_data: (optional) Whether to keep the data and cache directories.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-
-    Raises:
-      CommandFailedError if the uninstallation fails.
-      CommandTimeoutError if the uninstallation times out.
-      DeviceUnreachableError on missing device.
-    """
-    installed = self._GetApplicationPathsInternal(package_name)
-    if not installed:
-      return
-    # cached package paths are indeterminate due to system apps taking over
-    # user apps after uninstall, so clear it
-    self._cache['package_apk_paths'].pop(package_name, 0)
-    self._cache['package_apk_checksums'].pop(package_name, 0)
-    self.adb.Uninstall(package_name, keep_data)
-
-  def _CheckSdkLevel(self, required_sdk_level):
-    """Raises an exception if the device does not have the required SDK level.
-    """
-    if self.build_version_sdk < required_sdk_level:
-      raise device_errors.DeviceVersionError(
-          ('Requires SDK level %s, device is SDK level %s' %
-           (required_sdk_level, self.build_version_sdk)),
-          device_serial=self.serial)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RunShellCommand(self,
-                      cmd,
-                      shell=False,
-                      check_return=False,
-                      cwd=None,
-                      env=None,
-                      run_as=None,
-                      as_root=False,
-                      single_line=False,
-                      large_output=False,
-                      raw_output=False,
-                      timeout=None,
-                      retries=None):
-    """Run an ADB shell command.
-
-    The command to run |cmd| should be a sequence of program arguments
-    (preferred) or a single string with a shell script to run.
-
-    When |cmd| is a sequence, it is assumed to contain the name of the command
-    to run followed by its arguments. In this case, arguments are passed to the
-    command exactly as given, preventing any further processing by the shell.
-    This allows callers to easily pass arguments with spaces or special
-    characters without having to worry about quoting rules. Whenever possible,
-    it is recomended to pass |cmd| as a sequence.
-
-    When |cmd| is passed as a single string, |shell| should be set to True.
-    The command will be interpreted and run by the shell on the device,
-    allowing the use of shell features such as pipes, wildcards, or variables.
-    Failing to set shell=True will issue a warning, but this will be changed
-    to a hard failure in the future (see: catapult:#3242).
-
-    This behaviour is consistent with that of command runners in cmd_helper as
-    well as Python's own subprocess.Popen.
-
-    TODO(crbug.com/1029769) Change the default of |check_return| to True when
-    callers have switched to the new behaviour.
-
-    Args:
-      cmd: A sequence containing the command to run and its arguments, or a
-        string with a shell script to run (should also set shell=True).
-      shell: A boolean indicating whether shell features may be used in |cmd|.
-      check_return: A boolean indicating whether or not the return code should
-        be checked.
-      cwd: The device directory in which the command should be run.
-      env: The environment variables with which the command should be run.
-      run_as: A string containing the package as which the command should be
-        run.
-      as_root: A boolean indicating whether the shell command should be run
-        with root privileges.
-      single_line: A boolean indicating if only a single line of output is
-        expected.
-      large_output: Uses a work-around for large shell command output. Without
-        this large output will be truncated.
-      raw_output: Whether to only return the raw output
-          (no splitting into lines).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      If single_line is False, the output of the command as a list of lines,
-      otherwise, a string with the unique line of output emmited by the command
-      (with the optional newline at the end stripped).
-
-    Raises:
-      AdbCommandFailedError if check_return is True and the exit code of
-        the command run on the device is non-zero.
-      CommandFailedError if single_line is True but the output contains two or
-        more lines.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    def env_quote(key, value):
-      if not DeviceUtils._VALID_SHELL_VARIABLE.match(key):
-        raise KeyError('Invalid shell variable name %r' % key)
-      # using double quotes here to allow interpolation of shell variables
-      return '%s=%s' % (key, cmd_helper.DoubleQuote(value))
-
-    def run(cmd):
-      return self.adb.Shell(cmd)
-
-    def handle_check_return(cmd):
-      try:
-        return run(cmd)
-      except device_errors.AdbCommandFailedError as exc:
-        if check_return:
-          raise
-        else:
-          return exc.output
-
-    def handle_large_command(cmd):
-      if len(cmd) < self._MAX_ADB_COMMAND_LENGTH:
-        return handle_check_return(cmd)
-      else:
-        with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-          self._WriteFileWithPush(script.name, cmd)
-          logger.debug('Large shell command will be run from file: %s ...',
-                       cmd[:self._MAX_ADB_COMMAND_LENGTH])
-          return handle_check_return('sh %s' % script.name_quoted)
-
-    def handle_large_output(cmd, large_output_mode):
-      if large_output_mode:
-        with device_temp_file.DeviceTempFile(self.adb) as large_output_file:
-          large_output_cmd = '( %s )>%s 2>&1' % (cmd, large_output_file.name)
-          logger.debug('Large output mode enabled. Will write output to '
-                       'device and read results from file.')
-          try:
-            handle_large_command(large_output_cmd)
-            return self.ReadFile(large_output_file.name, force_pull=True)
-          except device_errors.AdbShellCommandFailedError as exc:
-            output = self.ReadFile(large_output_file.name, force_pull=True)
-            raise device_errors.AdbShellCommandFailedError(
-                cmd, output, exc.status, exc.device_serial)
-      else:
-        try:
-          return handle_large_command(cmd)
-        except device_errors.AdbCommandFailedError as exc:
-          if exc.status is None:
-            logger.error(_FormatPartialOutputError(exc.output))
-            logger.warning('Attempting to run in large_output mode.')
-            logger.warning('Use RunShellCommand(..., large_output=True) for '
-                           'shell commands that expect a lot of output.')
-            return handle_large_output(cmd, True)
-          else:
-            raise
-
-    if isinstance(cmd, six.string_types):
-      if not shell:
-        # TODO(crbug.com/1029769): Make this an error instead.
-        logger.warning(
-            'The command to run should preferably be passed as a sequence of'
-            ' args. If shell features are needed (pipes, wildcards, variables)'
-            ' clients should explicitly set shell=True.')
-    else:
-      cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd)
-    if env:
-      env = ' '.join(env_quote(k, v) for k, v in env.items())
-      cmd = '%s %s' % (env, cmd)
-    if cwd:
-      cmd = 'cd %s && %s' % (cmd_helper.SingleQuote(cwd), cmd)
-    if run_as:
-      cmd = 'run-as %s sh -c %s' % (cmd_helper.SingleQuote(run_as),
-                                    cmd_helper.SingleQuote(cmd))
-    if (as_root is _FORCE_SU) or (as_root and self.NeedsSU()):
-      # "su -c sh -c" allows using shell features in |cmd|
-      cmd = self._Su('sh -c %s' % cmd_helper.SingleQuote(cmd))
-
-    output = handle_large_output(cmd, large_output)
-
-    if raw_output:
-      return output
-
-    output = output.splitlines()
-    if single_line:
-      if not output:
-        return ''
-      elif len(output) == 1:
-        return output[0]
-      else:
-        msg = 'one line of output was expected, but got: %s'
-        raise device_errors.CommandFailedError(msg % output, str(self))
-    else:
-      return output
-
-  def _RunPipedShellCommand(self, script, **kwargs):
-    PIPESTATUS_LEADER = 'PIPESTATUS: '
-
-    script += '; echo "%s${PIPESTATUS[@]}"' % PIPESTATUS_LEADER
-    kwargs.update(shell=True, check_return=True)
-    output = self.RunShellCommand(script, **kwargs)
-    pipestatus_line = output[-1]
-
-    if not pipestatus_line.startswith(PIPESTATUS_LEADER):
-      logger.error('Pipe exit statuses of shell script missing.')
-      raise device_errors.AdbShellCommandFailedError(
-          script, output, status=None, device_serial=self.serial)
-
-    output = output[:-1]
-    statuses = [
-        int(s) for s in pipestatus_line[len(PIPESTATUS_LEADER):].split()
-    ]
-    if any(statuses):
-      raise device_errors.AdbShellCommandFailedError(
-          script, output, status=statuses, device_serial=self.serial)
-    return output
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def KillAll(self,
-              process_name,
-              exact=False,
-              signum=device_signal.SIGKILL,
-              as_root=False,
-              blocking=False,
-              quiet=False,
-              timeout=None,
-              retries=None):
-    """Kill all processes with the given name on the device.
-
-    Args:
-      process_name: A string containing the name of the process to kill.
-      exact: A boolean indicating whether to kill all processes matching
-             the string |process_name| exactly, or all of those which contain
-             |process_name| as a substring. Defaults to False.
-      signum: An integer containing the signal number to send to kill. Defaults
-              to SIGKILL (9).
-      as_root: A boolean indicating whether the kill should be executed with
-               root privileges.
-      blocking: A boolean indicating whether we should wait until all processes
-                with the given |process_name| are dead.
-      quiet: A boolean indicating whether to ignore the fact that no processes
-             to kill were found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The number of processes attempted to kill.
-
-    Raises:
-      CommandFailedError if no process was killed and |quiet| is False.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    processes = self.ListProcesses(process_name)
-    if exact:
-      processes = [p for p in processes if p.name == process_name]
-    if not processes:
-      if quiet:
-        return 0
-      else:
-        raise device_errors.CommandFailedError(
-            'No processes matching %r (exact=%r)' % (process_name, exact),
-            str(self))
-
-    logger.info('KillAll(%r, ...) attempting to kill the following:',
-                process_name)
-    for p in processes:
-      logger.info('  %05d %s', p.pid, p.name)
-
-    pids = set(p.pid for p in processes)
-    cmd = ['kill', '-%d' % signum] + sorted(str(p) for p in pids)
-    self.RunShellCommand(cmd, as_root=as_root, check_return=True)
-
-    def all_pids_killed():
-      pids_left = (p.pid for p in self.ListProcesses(process_name))
-      return not pids.intersection(pids_left)
-
-    if blocking:
-      timeout_retry.WaitFor(all_pids_killed, wait_period=0.1)
-
-    return len(pids)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartActivity(self,
-                    intent_obj,
-                    blocking=False,
-                    trace_file_name=None,
-                    force_stop=False,
-                    timeout=None,
-                    retries=None):
-    """Start package's activity on the device.
-
-    Args:
-      intent_obj: An Intent object to send.
-      blocking: A boolean indicating whether we should wait for the activity to
-                finish launching.
-      trace_file_name: If present, a string that both indicates that we want to
-                       profile the activity and contains the path to which the
-                       trace should be saved.
-      force_stop: A boolean indicating whether we should stop the activity
-                  before starting it.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the activity could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = ['am', 'start']
-    if blocking:
-      cmd.append('-W')
-    if trace_file_name:
-      cmd.extend(['--start-profiler', trace_file_name])
-    if force_stop:
-      cmd.append('-S')
-    cmd.extend(intent_obj.am_args)
-    for line in self.RunShellCommand(cmd, check_return=True):
-      if line.startswith('Error:'):
-        raise device_errors.CommandFailedError(line, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartService(self, intent_obj, user_id=None, timeout=None, retries=None):
-    """Start a service on the device.
-
-    Args:
-      intent_obj: An Intent object to send describing the service to start.
-      user_id: A specific user to start the service as, defaults to current.
-      timeout: Timeout in seconds.
-      retries: Number of retries
-
-    Raises:
-      CommandFailedError if the service could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    # For whatever reason, startservice was changed to start-service on O and
-    # above.
-    cmd = ['am', 'startservice']
-    if self.build_version_sdk >= version_codes.OREO:
-      cmd[1] = 'start-service'
-    if user_id:
-      cmd.extend(['--user', str(user_id)])
-    cmd.extend(intent_obj.am_args)
-    for line in self.RunShellCommand(cmd, check_return=True):
-      if line.startswith('Error:'):
-        raise device_errors.CommandFailedError(line, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartInstrumentation(self,
-                           component,
-                           finish=True,
-                           raw=False,
-                           extras=None,
-                           timeout=None,
-                           retries=None):
-    if extras is None:
-      extras = {}
-
-    cmd = ['am', 'instrument']
-    if finish:
-      cmd.append('-w')
-    if raw:
-      cmd.append('-r')
-    for k, v in extras.items():
-      cmd.extend(['-e', str(k), str(v)])
-    cmd.append(component)
-
-    # Store the package name in a shell variable to help the command stay under
-    # the _MAX_ADB_COMMAND_LENGTH limit.
-    package = component.split('/')[0]
-    shell_snippet = 'p=%s;%s' % (package,
-                                 cmd_helper.ShrinkToSnippet(cmd, 'p', package))
-    return self.RunShellCommand(
-        shell_snippet, shell=True, check_return=True, large_output=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def BroadcastIntent(self, intent_obj, timeout=None, retries=None):
-    """Send a broadcast intent.
-
-    Args:
-      intent: An Intent to broadcast.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = ['am', 'broadcast'] + intent_obj.am_args
-    self.RunShellCommand(cmd, check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GoHome(self, timeout=None, retries=None):
-    """Return to the home screen and obtain launcher focus.
-
-    This command launches the home screen and attempts to obtain
-    launcher focus until the timeout is reached.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    def is_launcher_focused():
-      output = self.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                    check_return=True,
-                                    large_output=True)
-      return any(self._LAUNCHER_FOCUSED_RE.match(l) for l in output)
-
-    def dismiss_popups():
-      # There is a dialog present; attempt to get rid of it.
-      # Not all dialogs can be dismissed with back.
-      self.SendKeyEvent(keyevent.KEYCODE_ENTER)
-      self.SendKeyEvent(keyevent.KEYCODE_BACK)
-      return is_launcher_focused()
-
-    # If Home is already focused, return early to avoid unnecessary work.
-    if is_launcher_focused():
-      return
-
-    self.StartActivity(
-        intent.Intent(
-            action='android.intent.action.MAIN',
-            category='android.intent.category.HOME'),
-        blocking=True)
-
-    if not is_launcher_focused():
-      timeout_retry.WaitFor(dismiss_popups, wait_period=1)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ForceStop(self, package, timeout=None, retries=None):
-    """Close the application.
-
-    Args:
-      package: A string containing the name of the package to stop.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if self.GetApplicationPids(package):
-      self.RunShellCommand(['am', 'force-stop', package], check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ClearApplicationState(self,
-                            package,
-                            permissions=None,
-                            timeout=None,
-                            retries=None):
-    """Clear all state for the given package.
-
-    Args:
-      package: A string containing the name of the package to stop.
-      permissions: List of permissions to set after clearing data.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    # Check that the package exists before clearing it for android builds below
-    # JB MR2. Necessary because calling pm clear on a package that doesn't exist
-    # may never return.
-    if ((self.build_version_sdk >= version_codes.JELLY_BEAN_MR2)
-        or self._GetApplicationPathsInternal(package)):
-      self.RunShellCommand(['pm', 'clear', package], check_return=True)
-      self.GrantPermissions(package, permissions)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SendKeyEvent(self, keycode, timeout=None, retries=None):
-    """Sends a keycode to the device.
-
-    See the devil.android.sdk.keyevent module for suitable keycode values.
-
-    Args:
-      keycode: A integer keycode to send to the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self.RunShellCommand(
-        ['input', 'keyevent', format(keycode, 'd')], check_return=True)
-
-  PUSH_CHANGED_FILES_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=PUSH_CHANGED_FILES_DEFAULT_TIMEOUT)
-  def PushChangedFiles(self,
-                       host_device_tuples,
-                       delete_device_stale=False,
-                       timeout=None,
-                       retries=None):
-    """Push files to the device, skipping files that don't need updating.
-
-    When a directory is pushed, it is traversed recursively on the host and
-    all files in it are pushed to the device as needed.
-    Additionally, if delete_device_stale option is True,
-    files that exist on the device but don't exist on the host are deleted.
-
-    Args:
-      host_device_tuples: A list of (host_path, device_path) tuples, where
-        |host_path| is an absolute path of a file or directory on the host
-        that should be minimially pushed to the device, and |device_path| is
-        an absolute path of the destination on the device.
-      delete_device_stale: option to delete stale files on device
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    # TODO(crbug.com/1005504): Experiment with this on physical devices after
-    # upgrading devil's default adb beyond 1.0.39.
-    # TODO(crbug.com/1020716): disabled as can result in extra directory.
-    enable_push_sync = False
-
-    if enable_push_sync:
-      try:
-        self._PushChangedFilesSync(host_device_tuples)
-        return
-      except device_errors.AdbVersionError as e:
-        # If we don't meet the adb requirements, fall back to the previous
-        # sync-unaware implementation.
-        logging.warning(str(e))
-
-    changed_files, missing_dirs, cache_commit_func = (self._GetChangedFiles(
-        host_device_tuples, delete_device_stale))
-
-    if changed_files:
-      if missing_dirs:
-        self.RunShellCommand(['mkdir', '-p'] + list(missing_dirs),
-                             check_return=True)
-      self._PushFilesImpl(host_device_tuples, changed_files)
-    cache_commit_func()
-
-  def _PushChangedFilesSync(self, host_device_tuples):
-    """Push changed files via `adb sync`.
-
-    Args:
-      host_device_tuples: Same as PushChangedFiles.
-    """
-    for h, d in host_device_tuples:
-      for ph, pd, _ in _IterPushableComponents(h, d):
-        self.adb.Push(ph, pd, sync=True)
-
-
-  def _GetDeviceNodes(self, paths):
-    """Get the set of all files and directories on the device contained within
-    the provided list of paths, without recursively expanding directories.
-
-    Args:
-      paths: The list of paths for which to list files and directories.
-
-    Returns:
-      a set containing all files and directories contained within |paths| on the
-      device.
-    """
-    nodes = set()
-    paths = [p.replace(' ', r'\ ') for p in paths]
-    command = _FILE_LIST_SCRIPT % ' '.join(paths)
-    current_path = ""
-    # We use shell=True to evaluate the command as a script through the shell,
-    # otherwise RunShellCommand tries to interpret it as the name of a (non
-    # existent) command to run.
-    for line in self.RunShellCommand(command, shell=True, check_return=True):
-      # If the line is an absolute path it's a directory, otherwise it's a file
-      # within the most recent directory.
-      if posixpath.isabs(line):
-        current_path = line + '/'
-      else:
-        line = current_path + line
-      nodes.add(line)
-
-    return nodes
-
-  def _GetChangedFiles(self, host_device_tuples, delete_stale=False):
-    """Get files to push and delete.
-
-    Args:
-      host_device_tuples: a list of (host_files_path, device_files_path) tuples
-        to find changed files from
-      delete_stale: Whether to delete stale files
-
-    Returns:
-      a three-element tuple
-      1st element: a list of (host_files_path, device_files_path) tuples to push
-      2nd element: a list of missing device directories to mkdir
-      3rd element: a cache commit function
-    """
-    # The fully expanded list of host/device tuples of files to push.
-    file_tuples = []
-    # All directories we're pushing files to.
-    device_dirs_to_push_to = set()
-    # All files and directories we expect to have on the device after pushing
-    # files.
-    expected_device_nodes = set()
-
-    for h, d in host_device_tuples:
-      assert os.path.isabs(h) and posixpath.isabs(d)
-      h = os.path.realpath(h)
-      host_path = h.rstrip('/')
-      device_dir = d.rstrip('/')
-
-      expected_device_nodes.add(device_dir)
-
-      # Add all parent directories to the directories we expect to have so we
-      # don't delete empty nested directories.
-      parent = posixpath.dirname(device_dir)
-      while parent and parent != '/':
-        expected_device_nodes.add(parent)
-        parent = posixpath.dirname(parent)
-
-      if os.path.isdir(host_path):
-        device_dirs_to_push_to.add(device_dir)
-        for root, _, filenames in os.walk(host_path):
-          # ignore hidden directories
-          if os.path.sep + '.' in root:
-            continue
-          relative_dir = os.path.relpath(root, host_path).rstrip('.')
-          device_path = posixpath.join(device_dir, relative_dir).rstrip('/')
-          expected_device_nodes.add(device_path)
-          device_dirs_to_push_to.add(device_path)
-          files = (
-            [posixpath.join(device_dir, relative_dir, f) for f in filenames])
-          expected_device_nodes.update(files)
-          file_tuples.extend(zip(
-            (os.path.join(root, f) for f in filenames), files))
-      else:
-        device_dirs_to_push_to.add(posixpath.dirname(device_dir))
-        file_tuples.append((host_path, device_dir))
-
-    if file_tuples or delete_stale:
-      current_device_nodes = self._GetDeviceNodes(device_dirs_to_push_to)
-      nodes_to_delete = current_device_nodes - expected_device_nodes
-
-    missing_dirs = device_dirs_to_push_to - current_device_nodes
-
-    if not file_tuples:
-      if delete_stale and nodes_to_delete:
-        self.RemovePath(nodes_to_delete, force=True, recursive=True)
-      return (host_device_tuples, missing_dirs, lambda: 0)
-
-    possibly_stale_device_nodes = current_device_nodes - nodes_to_delete
-    possibly_stale_tuples = (
-      [t for t in file_tuples if t[1] in possibly_stale_device_nodes])
-
-    def calculate_host_checksums():
-      # Need to compute all checksums when caching.
-      if self._enable_device_files_cache:
-        return md5sum.CalculateHostMd5Sums([t[0] for t in file_tuples])
-      else:
-        return md5sum.CalculateHostMd5Sums(
-            [t[0] for t in possibly_stale_tuples])
-
-    def calculate_device_checksums():
-      paths = set([t[1] for t in possibly_stale_tuples])
-      if not paths:
-        return dict()
-      sums = dict()
-      if self._enable_device_files_cache:
-        paths_not_in_cache = set()
-        for path in paths:
-          cache_entry = self._cache['device_path_checksums'].get(path)
-          if cache_entry:
-            sums[path] = cache_entry
-          else:
-            paths_not_in_cache.add(path)
-        paths = paths_not_in_cache
-      sums.update(dict(md5sum.CalculateDeviceMd5Sums(paths, self)))
-      if self._enable_device_files_cache:
-        for path, checksum in sums.iteritems():
-          self._cache['device_path_checksums'][path] = checksum
-      return sums
-    try:
-      host_checksums, device_checksums = reraiser_thread.RunAsync(
-          (calculate_host_checksums, calculate_device_checksums))
-    except device_errors.CommandFailedError as e:
-      logger.warning('Error calculating md5: %s', e)
-      return (host_device_tuples, set(), lambda: 0)
-
-    up_to_date = set()
-
-    for host_path, device_path in possibly_stale_tuples:
-      device_checksum = device_checksums.get(device_path, None)
-      host_checksum = host_checksums.get(host_path, None)
-      if device_checksum == host_checksum and device_checksum is not None:
-        up_to_date.add(device_path)
-      else:
-        nodes_to_delete.add(device_path)
-
-    if delete_stale and nodes_to_delete:
-      self.RemovePath(nodes_to_delete, force=True, recursive=True)
-
-    to_push = (
-        [t for t in file_tuples if t[1] not in up_to_date])
-
-    def cache_commit_func():
-      if not self._enable_device_files_cache:
-        return
-      for host_path, device_path in file_tuples:
-        host_checksum = host_checksums.get(host_path, None)
-        self._cache['device_path_checksums'][device_path] = host_checksum
-
-    return (to_push, missing_dirs, cache_commit_func)
-
-  def _ComputeDeviceChecksumsForApks(self, package_name):
-    ret = self._cache['package_apk_checksums'].get(package_name)
-    if ret is None:
-      if self.PathExists('/data/data/' + package_name, as_root=True):
-        device_paths = self._GetApplicationPathsInternal(package_name)
-        file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self)
-        ret = set(file_to_checksums.values())
-      else:
-        logger.info('Cannot reuse package %s (data directory missing)',
-                    package_name)
-        ret = set()
-      self._cache['package_apk_checksums'][package_name] = ret
-    return ret
-
-  def _ComputeStaleApks(self, package_name, host_apk_paths):
-    def calculate_host_checksums():
-      return md5sum.CalculateHostMd5Sums(host_apk_paths)
-
-    def calculate_device_checksums():
-      return self._ComputeDeviceChecksumsForApks(package_name)
-
-    host_checksums, device_checksums = reraiser_thread.RunAsync(
-        (calculate_host_checksums, calculate_device_checksums))
-    stale_apks = [
-        k for (k, v) in host_checksums.iteritems() if v not in device_checksums
-    ]
-    return stale_apks, set(host_checksums.values())
-
-  def _PushFilesImpl(self, host_device_tuples, files):
-    if not files:
-      return
-
-    size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files)
-    file_count = len(files)
-    dir_size = sum(
-        host_utils.GetRecursiveDiskUsage(h) for h, _ in host_device_tuples)
-    dir_file_count = 0
-    for h, _ in host_device_tuples:
-      if os.path.isdir(h):
-        dir_file_count += sum(len(f) for _r, _d, f in os.walk(h))
-      else:
-        dir_file_count += 1
-
-    push_duration = self._ApproximateDuration(file_count, file_count, size,
-                                              False)
-    dir_push_duration = self._ApproximateDuration(
-        len(host_device_tuples), dir_file_count, dir_size, False)
-    zip_duration = self._ApproximateDuration(1, 1, size, True)
-
-    if (dir_push_duration < push_duration and dir_push_duration < zip_duration
-        # TODO(jbudorick): Resume directory pushing once clients have switched
-        # to 1.0.36-compatible syntax.
-        and False):
-      self._PushChangedFilesIndividually(host_device_tuples)
-    elif push_duration < zip_duration:
-      self._PushChangedFilesIndividually(files)
-    elif self._commands_installed is False:
-      # Already tried and failed to install unzip command.
-      self._PushChangedFilesIndividually(files)
-    elif not self._PushChangedFilesZipped(files,
-                                          [d for _, d in host_device_tuples]):
-      self._PushChangedFilesIndividually(files)
-
-  def _MaybeInstallCommands(self):
-    if self._commands_installed is None:
-      try:
-        if not install_commands.Installed(self):
-          install_commands.InstallCommands(self)
-        self._commands_installed = True
-      except device_errors.CommandFailedError as e:
-        logger.warning('unzip not available: %s', str(e))
-        self._commands_installed = False
-    return self._commands_installed
-
-  @staticmethod
-  def _ApproximateDuration(adb_calls, file_count, byte_count, is_zipping):
-    # We approximate the time to push a set of files to a device as:
-    #   t = c1 * a + c2 * f + c3 + b / c4 + b / (c5 * c6), where
-    #     t: total time (sec)
-    #     c1: adb call time delay (sec)
-    #     a: number of times adb is called (unitless)
-    #     c2: push time delay (sec)
-    #     f: number of files pushed via adb (unitless)
-    #     c3: zip time delay (sec)
-    #     c4: zip rate (bytes/sec)
-    #     b: total number of bytes (bytes)
-    #     c5: transfer rate (bytes/sec)
-    #     c6: compression ratio (unitless)
-
-    # All of these are approximations.
-    ADB_CALL_PENALTY = 0.1  # seconds
-    ADB_PUSH_PENALTY = 0.01  # seconds
-    ZIP_PENALTY = 2.0  # seconds
-    ZIP_RATE = 10000000.0  # bytes / second
-    TRANSFER_RATE = 2000000.0  # bytes / second
-    COMPRESSION_RATIO = 2.0  # unitless
-
-    adb_call_time = ADB_CALL_PENALTY * adb_calls
-    adb_push_setup_time = ADB_PUSH_PENALTY * file_count
-    if is_zipping:
-      zip_time = ZIP_PENALTY + byte_count / ZIP_RATE
-      transfer_time = byte_count / (TRANSFER_RATE * COMPRESSION_RATIO)
-    else:
-      zip_time = 0
-      transfer_time = byte_count / TRANSFER_RATE
-    return adb_call_time + adb_push_setup_time + zip_time + transfer_time
-
-  def _PushChangedFilesIndividually(self, files):
-    for h, d in files:
-      self.adb.Push(h, d)
-
-  def _PushChangedFilesZipped(self, files, dirs):
-    if not self._MaybeInstallCommands():
-      return False
-
-    with tempfile_ext.NamedTemporaryDirectory() as working_dir:
-      zip_path = os.path.join(working_dir, 'tmp.zip')
-      try:
-        zip_utils.WriteZipFile(zip_path, files)
-      except zip_utils.ZipFailedError:
-        return False
-
-      logger.info('Pushing %d files via .zip of size %d', len(files),
-                  os.path.getsize(zip_path))
-      self.NeedsSU()
-      with device_temp_file.DeviceTempFile(
-          self.adb, suffix='.zip') as device_temp:
-        self.adb.Push(zip_path, device_temp.name)
-
-        with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-          # Read dirs from temp file to avoid potential errors like
-          # "Argument list too long" (crbug.com/1174331) when the list
-          # is too long.
-          self.WriteFile(
-              script.name,
-              _UNZIP_AND_CHMOD_SCRIPT.format(bin_dir=install_commands.BIN_DIR,
-                                             zip_file=device_temp.name,
-                                             dirs=' '.join(dirs)))
-
-          self.RunShellCommand(['source', script.name],
-                               check_return=True,
-                               as_root=True)
-
-    return True
-
-  # TODO(crbug.com/1111556): remove this and migrate the callsite to
-  # PathExists().
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def FileExists(self, device_path, timeout=None, retries=None):
-    """Checks whether the given file exists on the device.
-
-    Arguments are the same as PathExists.
-    """
-    return self.PathExists(device_path, timeout=timeout, retries=retries)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def PathExists(self, device_paths, as_root=False, timeout=None, retries=None):
-    """Checks whether the given path(s) exists on the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      as_root: Whether root permissions should be use to check for the existence
-               of the given path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the all given paths exist on the device, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    paths = device_paths
-    if isinstance(paths, six.string_types):
-      paths = (paths, )
-    if not paths:
-      return True
-    cmd = ['test', '-e', paths[0]]
-    for p in paths[1:]:
-      cmd.extend(['-a', '-e', p])
-    try:
-      self.RunShellCommand(
-          cmd,
-          as_root=as_root,
-          check_return=True,
-          timeout=timeout,
-          retries=retries)
-      return True
-    except device_errors.CommandFailedError:
-      return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RemovePath(self,
-                 device_path,
-                 force=False,
-                 recursive=False,
-                 as_root=False,
-                 rename=False,
-                 timeout=None,
-                 retries=None):
-    """Removes the given path(s) from the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      force: Whether to remove the path(s) with force (-f).
-      recursive: Whether to remove any directories in the path(s) recursively.
-      as_root: Whether root permissions should be use to remove the given
-               path(s).
-      rename: Whether to rename the path(s) before removing to help avoid
-            filesystem errors. See https://stackoverflow.com/questions/11539657
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-
-    def _RenamePath(path):
-      random_suffix = hex(random.randint(2**12, 2**16 - 1))[2:]
-      dest = '%s-%s' % (path, random_suffix)
-      try:
-        self.RunShellCommand(['mv', path, dest],
-                             as_root=as_root,
-                             check_return=True)
-        return dest
-      except device_errors.AdbShellCommandFailedError:
-        # If it couldn't be moved, just try rm'ing the original path instead.
-        return path
-
-    args = ['rm']
-    if force:
-      args.append('-f')
-    if recursive:
-      args.append('-r')
-    if isinstance(device_path, six.string_types):
-      args.append(device_path if not rename else _RenamePath(device_path))
-    else:
-      args.extend(
-          device_path if not rename else [_RenamePath(p) for p in device_path])
-    self.RunShellCommand(args, as_root=as_root, check_return=True)
-
-  @contextlib.contextmanager
-  def _CopyToReadableLocation(self, device_path):
-    """Context manager to copy a file to a globally readable temp file.
-
-    This uses root permission to copy a file to a globally readable named
-    temporary file. The temp file is removed when this contextmanager is closed.
-
-    Args:
-      device_path: A string containing the absolute path of the file (on the
-        device) to copy.
-    Yields:
-      The globally readable file object.
-    """
-    with device_temp_file.DeviceTempFile(self.adb) as device_temp:
-      cmd = 'SRC=%s DEST=%s;cp "$SRC" "$DEST" && chmod 666 "$DEST"' % (
-          cmd_helper.SingleQuote(device_path),
-          cmd_helper.SingleQuote(device_temp.name))
-      self.RunShellCommand(cmd, shell=True, as_root=True, check_return=True)
-      yield device_temp
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def PullFile(self,
-               device_path,
-               host_path,
-               as_root=False,
-               timeout=None,
-               retries=None):
-    """Pull a file from the device.
-
-    Args:
-      device_path: A string containing the absolute path of the file to pull
-                   from the device.
-      host_path: A string containing the absolute path of the destination on
-                 the host.
-      as_root: Whether root permissions should be used to pull the file.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-    """
-    # Create the base dir if it doesn't exist already
-    dirname = os.path.dirname(host_path)
-    if dirname and not os.path.exists(dirname):
-      os.makedirs(dirname)
-    if as_root and self.NeedsSU():
-      if not self.PathExists(device_path, as_root=True):
-        raise device_errors.CommandFailedError(
-            '%r: No such file or directory' % device_path, str(self))
-      with self._CopyToReadableLocation(device_path) as readable_temp_file:
-        self.adb.Pull(readable_temp_file.name, host_path)
-    else:
-      self.adb.Pull(device_path, host_path)
-
-  def _ReadFileWithPull(self, device_path):
-    try:
-      d = tempfile.mkdtemp()
-      host_temp_path = os.path.join(d, 'tmp_ReadFileWithPull')
-      self.adb.Pull(device_path, host_temp_path)
-      with open(host_temp_path, 'r') as host_temp:
-        return host_temp.read()
-    finally:
-      if os.path.exists(d):
-        shutil.rmtree(d)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ReadFile(self,
-               device_path,
-               as_root=False,
-               force_pull=False,
-               timeout=None,
-               retries=None):
-    """Reads the contents of a file from the device.
-
-    Args:
-      device_path: A string containing the absolute path of the file to read
-                   from the device.
-      as_root: A boolean indicating whether the read should be executed with
-               root privileges.
-      force_pull: A boolean indicating whether to force the operation to be
-          performed by pulling a file from the device. The default is, when the
-          contents are short, to retrieve the contents using cat instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The contents of |device_path| as a string. Contents are intepreted using
-      universal newlines, so the caller will see them encoded as '\n'. Also,
-      all lines will be terminated.
-
-    Raises:
-      AdbCommandFailedError if the file can't be read.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    def get_size(path):
-      return self.FileSize(path, as_root=as_root)
-
-    # Reading by pulling is faster than first getting the file size and cat-ing,
-    # so only read by cat when we need root.
-    if as_root and self.NeedsSU():
-      if (not force_pull
-          and 0 < get_size(device_path) <= self._MAX_ADB_OUTPUT_LENGTH):
-        return _JoinLines(
-            self.RunShellCommand(['cat', device_path],
-                                 as_root=as_root,
-                                 check_return=True))
-      else:
-        with self._CopyToReadableLocation(device_path) as readable_temp_file:
-          return self._ReadFileWithPull(readable_temp_file.name)
-    else:
-      return self._ReadFileWithPull(device_path)
-
-  def _WriteFileWithPush(self, device_path, contents):
-    with tempfile.NamedTemporaryFile() as host_temp:
-      host_temp.write(contents)
-      host_temp.flush()
-      self.adb.Push(host_temp.name, device_path)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WriteFile(self,
-                device_path,
-                contents,
-                as_root=False,
-                force_push=False,
-                timeout=None,
-                retries=None):
-    """Writes |contents| to a file on the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file to write
-          on the device.
-      contents: A string containing the data to write to the device.
-      as_root: A boolean indicating whether the write should be executed with
-          root privileges (if available).
-      force_push: A boolean indicating whether to force the operation to be
-          performed by pushing a file to the device. The default is, when the
-          contents are short, to pass the contents using a shell script instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the file could not be written on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not force_push and len(contents) < self._MAX_ADB_COMMAND_LENGTH:
-      # If the contents are small, for efficieny we write the contents with
-      # a shell command rather than pushing a file.
-      cmd = 'echo -n %s > %s' % (cmd_helper.SingleQuote(contents),
-                                 cmd_helper.SingleQuote(device_path))
-      self.RunShellCommand(cmd, shell=True, as_root=as_root, check_return=True)
-    elif as_root and self.NeedsSU():
-      # Adb does not allow to "push with su", so we first push to a temp file
-      # on a safe location, and then copy it to the desired location with su.
-      with device_temp_file.DeviceTempFile(self.adb) as device_temp:
-        self._WriteFileWithPush(device_temp.name, contents)
-        # Here we need 'cp' rather than 'mv' because the temp and
-        # destination files might be on different file systems (e.g.
-        # on internal storage and an external sd card).
-        self.RunShellCommand(['cp', device_temp.name, device_path],
-                             as_root=True,
-                             check_return=True)
-    else:
-      # If root is not needed, we can push directly to the desired location.
-      self._WriteFileWithPush(device_path, contents)
-
-  def _ParseLongLsOutput(self, device_path, as_root=False, **kwargs):
-    """Run and scrape the output of 'ls -a -l' on a device directory."""
-    device_path = posixpath.join(device_path, '')  # Force trailing '/'.
-    output = self.RunShellCommand(['ls', '-a', '-l', device_path],
-                                  as_root=as_root,
-                                  check_return=True,
-                                  env={'TZ': 'utc'},
-                                  **kwargs)
-    if output and output[0].startswith('total '):
-      output.pop(0)  # pylint: disable=maybe-no-member
-
-    entries = []
-    for line in output:
-      m = _LONG_LS_OUTPUT_RE.match(line)
-      if m:
-        if m.group('filename') not in ['.', '..']:
-          item = m.groupdict()
-          # A change in toybox is causing recent Android versions to escape
-          # spaces in file names. Here we just unquote those spaces. If we
-          # later find more essoteric characters in file names, a more careful
-          # unquoting mechanism may be needed. But hopefully not.
-          # See: https://goo.gl/JAebZj
-          item['filename'] = item['filename'].replace('\\ ', ' ')
-          entries.append(item)
-      else:
-        logger.info('Skipping: %s', line)
-
-    return entries
-
-  def ListDirectory(self, device_path, as_root=False, **kwargs):
-    """List all files on a device directory.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of filenames for all entries contained in the directory.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
-    return [d['filename'] for d in entries]
-
-  def StatDirectory(self, device_path, as_root=False, **kwargs):
-    """List file and stat info for all entries on a device directory.
-
-    Implementation notes: this is currently implemented by parsing the output
-    of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
-    make parsing strict and return values mirroring those of the standard |os|
-    and |stat| Python modules.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of dictionaries, each containing the following keys:
-        filename: A string with the file name.
-        st_mode: File permissions, use the stat module to interpret these.
-        st_nlink: Number of hard links (may be missing).
-        st_owner: A string with the user name of the owner.
-        st_group: A string with the group name of the owner.
-        st_rdev_pair: Device type as (major, minior) (only if inode device).
-        st_size: Size of file, in bytes (may be missing for non-regular files).
-        st_mtime: Time of most recent modification, in seconds since epoch
-          (although resolution is in minutes).
-        symbolic_link_to: If entry is a symbolic link, path where it points to;
-          missing otherwise.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
-    for d in entries:
-      for key, value in list(d.items()):
-        if value is None:
-          del d[key]  # Remove missing fields.
-      d['st_mode'] = _ParseModeString(d['st_mode'])
-      d['st_mtime'] = calendar.timegm(
-          time.strptime(d['st_mtime'], _LS_DATE_FORMAT))
-      for key in ['st_nlink', 'st_size', 'st_rdev_major', 'st_rdev_minor']:
-        if key in d:
-          d[key] = int(d[key])
-      if 'st_rdev_major' in d and 'st_rdev_minor' in d:
-        d['st_rdev_pair'] = (d.pop('st_rdev_major'), d.pop('st_rdev_minor'))
-    return entries
-
-  def StatPath(self, device_path, as_root=False, **kwargs):
-    """Get the stat attributes of a file or directory on the device.
-
-    Args:
-      device_path: A string containing the path of a file or directory from
-                   which to get attributes.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dictionary with the stat info collected; see StatDirectory for details.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    dirname, filename = posixpath.split(posixpath.normpath(device_path))
-    for entry in self.StatDirectory(dirname, as_root=as_root, **kwargs):
-      if entry['filename'] == filename:
-        return entry
-    raise device_errors.CommandFailedError(
-        'Cannot find file or directory: %r' % device_path, str(self))
-
-  def FileSize(self, device_path, as_root=False, **kwargs):
-    """Get the size of a file on the device.
-
-    Note: This is implemented by parsing the output of the 'ls' command on
-    the device. On some Android versions, when passing a directory or special
-    file, the size is *not* reported and this function will throw an exception.
-
-    Args:
-      device_path: A string containing the path of a file on the device.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The size of the file in bytes.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device, or
-        its size cannot be determited for some reason.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entry = self.StatPath(device_path, as_root=as_root, **kwargs)
-    try:
-      return entry['st_size']
-    except KeyError:
-      raise device_errors.CommandFailedError(
-          'Could not determine the size of: %s' % device_path, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetJavaAsserts(self, enabled, timeout=None, retries=None):
-    """Enables or disables Java asserts.
-
-    Args:
-      enabled: A boolean indicating whether Java asserts should be enabled
-               or disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device-side property changed and a restart is required as a
-      result, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-
-    def find_property(lines, property_name):
-      for index, line in enumerate(lines):
-        if line.strip() == '':
-          continue
-        key_value = tuple(s.strip() for s in line.split('=', 1))
-        if len(key_value) != 2:
-          continue
-        key, value = key_value
-        if key == property_name:
-          return index, value
-      return None, ''
-
-    new_value = 'all' if enabled else ''
-
-    # First ensure the desired property is persisted.
-    try:
-      properties = self.ReadFile(self.LOCAL_PROPERTIES_PATH).splitlines()
-    except device_errors.CommandFailedError:
-      properties = []
-    index, value = find_property(properties, self.JAVA_ASSERT_PROPERTY)
-    if new_value != value:
-      if new_value:
-        new_line = '%s=%s' % (self.JAVA_ASSERT_PROPERTY, new_value)
-        if index is None:
-          properties.append(new_line)
-        else:
-          properties[index] = new_line
-      else:
-        assert index is not None  # since new_value == '' and new_value != value
-        properties.pop(index)
-      self.WriteFile(self.LOCAL_PROPERTIES_PATH, _JoinLines(properties))
-
-    # Next, check the current runtime value is what we need, and
-    # if not, set it and report that a reboot is required.
-    value = self.GetProp(self.JAVA_ASSERT_PROPERTY)
-    if new_value != value:
-      self.SetProp(self.JAVA_ASSERT_PROPERTY, new_value)
-      return True
-    else:
-      return False
-
-  def GetLocale(self, cache=False):
-    """Returns the locale setting on the device.
-
-    Args:
-      cache: Whether to use cached properties when available.
-    Returns:
-      A pair (language, country).
-    """
-    locale = self.GetProp('persist.sys.locale', cache=cache)
-    if locale:
-      if '-' not in locale:
-        logging.error('Unparsable locale: %s', locale)
-        return ('', '')  # Behave as if persist.sys.locale is undefined.
-      return tuple(locale.split('-', 1))
-    return (self.GetProp('persist.sys.language', cache=cache),
-            self.GetProp('persist.sys.country', cache=cache))
-
-  def GetLanguage(self, cache=False):
-    """Returns the language setting on the device.
-
-    DEPRECATED: Prefer GetLocale() instead.
-
-    Args:
-      cache: Whether to use cached properties when available.
-    """
-    return self.GetLocale(cache=cache)[0]
-
-  def GetCountry(self, cache=False):
-    """Returns the country setting on the device.
-
-    DEPRECATED: Prefer GetLocale() instead.
-
-    Args:
-      cache: Whether to use cached properties when available.
-    """
-    return self.GetLocale(cache=cache)[1]
-
-  @property
-  def screen_density(self):
-    """Returns the screen density of the device."""
-    DPI_TO_DENSITY = {
-        120: 'ldpi',
-        160: 'mdpi',
-        240: 'hdpi',
-        320: 'xhdpi',
-        480: 'xxhdpi',
-        640: 'xxxhdpi',
-    }
-    return DPI_TO_DENSITY.get(self.pixel_density, 'tvdpi')
-
-  @property
-  def pixel_density(self):
-    density = self.GetProp('ro.sf.lcd_density', cache=True)
-    if not density:
-      # It might be an emulator, try the qemu prop.
-      density = self.GetProp('qemu.sf.lcd_density', cache=True)
-    return int(density)
-
-  @property
-  def is_emulator(self):
-    return _EMULATOR_RE.match(self.GetProp('ro.product.device', cache=True))
-
-  @property
-  def build_description(self):
-    """Returns the build description of the system.
-
-    For example:
-      nakasi-user 4.4.4 KTU84P 1227136 release-keys
-    """
-    return self.GetProp('ro.build.description', cache=True)
-
-  @property
-  def build_fingerprint(self):
-    """Returns the build fingerprint of the system.
-
-    For example:
-      google/nakasi/grouper:4.4.4/KTU84P/1227136:user/release-keys
-    """
-    return self.GetProp('ro.build.fingerprint', cache=True)
-
-  @property
-  def build_id(self):
-    """Returns the build ID of the system (e.g. 'KTU84P')."""
-    return self.GetProp('ro.build.id', cache=True)
-
-  @property
-  def build_product(self):
-    """Returns the build product of the system (e.g. 'grouper')."""
-    return self.GetProp('ro.build.product', cache=True)
-
-  @property
-  def build_system_root_image(self):
-    """Returns the system_root_image property.
-
-    This seems to indicate whether the device is using a system-as-root
-    partition layout. See http://bit.ly/37F34sx for more info.
-    """
-    return self.GetProp('ro.build.system_root_image', cache=True)
-
-  @property
-  def build_type(self):
-    """Returns the build type of the system (e.g. 'user')."""
-    return self.GetProp('ro.build.type', cache=True)
-
-  @property
-  def build_version_sdk(self):
-    """Returns the build version sdk of the system as a number (e.g. 19).
-
-    For version code numbers see:
-    http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-
-    For named constants see devil.android.sdk.version_codes
-
-    Raises:
-      CommandFailedError if the build version sdk is not a number.
-    """
-    value = self.GetProp('ro.build.version.sdk', cache=True)
-    try:
-      return int(value)
-    except ValueError:
-      raise device_errors.CommandFailedError(
-          'Invalid build version sdk: %r' % value)
-
-  @property
-  def tracing_path(self):
-    """Returns the tracing path of the device for atrace."""
-    return self.GetTracingPath()
-
-  @property
-  def product_cpu_abi(self):
-    """Returns the product cpu abi of the device (e.g. 'armeabi-v7a').
-
-    For supported ABIs, the return value will be one of the values defined in
-    devil.android.ndk.abis.
-    """
-    return self.GetProp('ro.product.cpu.abi', cache=True)
-
-  @property
-  def product_cpu_abis(self):
-    """Returns all product cpu abi of the device."""
-    return self.GetProp('ro.product.cpu.abilist', cache=True).split(',')
-
-  @property
-  def product_model(self):
-    """Returns the name of the product model (e.g. 'Nexus 7')."""
-    return self.GetProp('ro.product.model', cache=True)
-
-  @property
-  def product_name(self):
-    """Returns the product name of the device (e.g. 'nakasi')."""
-    return self.GetProp('ro.product.name', cache=True)
-
-  @property
-  def product_board(self):
-    """Returns the product board name of the device (e.g. 'shamu')."""
-    return self.GetProp('ro.product.board', cache=True)
-
-  def _EnsureCacheInitialized(self):
-    """Populates cache token, runs getprop and fetches $EXTERNAL_STORAGE."""
-    if self._cache['token']:
-      return
-    with self._cache_lock:
-      if self._cache['token']:
-        return
-      # Change the token every time to ensure that it will match only the
-      # previously dumped cache.
-      token = str(uuid.uuid1())
-      cmd = ('c=/data/local/tmp/cache_token;'
-             'echo $EXTERNAL_STORAGE;'
-             'cat $c 2>/dev/null||echo;'
-             'echo "%s">$c &&' % token + 'getprop')
-      output = self.RunShellCommand(
-          cmd, shell=True, check_return=True, large_output=True)
-      # Error-checking for this existing is done in GetExternalStoragePath().
-      self._cache['external_storage'] = output[0]
-      self._cache['prev_token'] = output[1]
-      output = output[2:]
-
-      prop_cache = self._cache['getprop']
-      prop_cache.clear()
-      for key, value in _GETPROP_RE.findall(''.join(output)):
-        prop_cache[key] = value
-      self._cache['token'] = token
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetTracingPath(self, timeout=None, retries=None):
-    """Gets tracing path from the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      /sys/kernel/debug/tracing for device with debugfs mount support;
-      /sys/kernel/tracing for device with tracefs support;
-      /sys/kernel/debug/tracing if support can't be determined.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    tracing_path = self._cache['tracing_path']
-    if tracing_path:
-      return tracing_path
-    with self._cache_lock:
-      tracing_path = '/sys/kernel/debug/tracing'
-      try:
-        lines = self.RunShellCommand(['mount'],
-                                     check_return=True,
-                                     timeout=timeout,
-                                     retries=retries)
-        if not any('debugfs' in line for line in lines):
-          tracing_path = '/sys/kernel/tracing'
-      except device_errors.AdbCommandFailedError:
-        pass
-      self._cache['tracing_path'] = tracing_path
-    return tracing_path
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetProp(self, property_name, cache=False, timeout=None, retries=None):
-    """Gets a property from the device.
-
-    Args:
-      property_name: A string containing the name of the property to get from
-                     the device.
-      cache: Whether to use cached properties when available.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The value of the device's |property_name| property.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    assert isinstance(
-        property_name,
-        six.string_types), ("property_name is not a string: %r" % property_name)
-
-    if cache:
-      # It takes ~120ms to query a single property, and ~130ms to query all
-      # properties. So, when caching we always query all properties.
-      self._EnsureCacheInitialized()
-    else:
-      # timeout and retries are handled down at run shell, because we don't
-      # want to apply them in the other branch when reading from the cache
-      value = self.RunShellCommand(['getprop', property_name],
-                                   single_line=True,
-                                   check_return=True,
-                                   timeout=timeout,
-                                   retries=retries)
-      self._cache['getprop'][property_name] = value
-    # Non-existent properties are treated as empty strings by getprop.
-    return self._cache['getprop'].get(property_name, '')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetProp(self,
-              property_name,
-              value,
-              check=False,
-              timeout=None,
-              retries=None):
-    """Sets a property on the device.
-
-    Args:
-      property_name: A string containing the name of the property to set on
-                     the device.
-      value: A string containing the value to set to the property on the
-             device.
-      check: A boolean indicating whether to check that the property was
-             successfully set on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if check is true and the property was not correctly
-        set on the device (e.g. because it is not rooted).
-      CommandTimeoutError on timeout.
-    """
-    assert isinstance(
-        property_name,
-        six.string_types), ("property_name is not a string: %r" % property_name)
-    assert isinstance(value, six.string_types), "value is not a string: %r" % value
-
-    self.RunShellCommand(['setprop', property_name, value], check_return=True)
-    prop_cache = self._cache['getprop']
-    if property_name in prop_cache:
-      del prop_cache[property_name]
-    # TODO(crbug.com/1029772) remove the option and make the check mandatory,
-    # but using a single shell script to both set- and getprop.
-    if check and value != self.GetProp(property_name, cache=False):
-      raise device_errors.CommandFailedError(
-          'Unable to set property %r on the device to %r' % (property_name,
-                                                             value), str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetABI(self, timeout=None, retries=None):
-    """Gets the device main ABI.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's main ABI name. For supported ABIs, the return value will be
-      one of the values defined in devil.android.ndk.abis.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    return self.GetProp('ro.product.cpu.abi', cache=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetFeatures(self, timeout=None, retries=None):
-    """Returns the features supported on the device."""
-    lines = self.RunShellCommand(['pm', 'list', 'features'], check_return=True)
-    return [f[8:] for f in lines if f.startswith('feature:')]
-
-  def _GetPsOutput(self, pattern):
-    """Runs |ps| command on the device and returns its output,
-
-    This private method abstracts away differences between Android verions for
-    calling |ps|, and implements support for filtering the output by a given
-    |pattern|, but does not do any output parsing.
-    """
-    try:
-      ps_cmd = 'ps'
-      # ps behavior was changed in Android O and above, http://crbug.com/686716
-      if self.build_version_sdk >= version_codes.OREO:
-        ps_cmd = 'ps -e'
-      if pattern:
-        return self._RunPipedShellCommand(
-            '%s | grep -F %s' % (ps_cmd, cmd_helper.SingleQuote(pattern)))
-      else:
-        return self.RunShellCommand(
-            ps_cmd.split(), check_return=True, large_output=True)
-    except device_errors.AdbShellCommandFailedError as e:
-      if e.status and isinstance(e.status, list) and not e.status[0]:
-        # If ps succeeded but grep failed, there were no processes with the
-        # given name.
-        return []
-      else:
-        raise
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ListProcesses(self, process_name=None, timeout=None, retries=None):
-    """Returns a list of tuples with info about processes on the device.
-
-    This essentially parses the output of the |ps| command into convenient
-    ProcessInfo tuples.
-
-    Args:
-      process_name: A string used to filter the returned processes. If given,
-                    only processes whose name have this value as a substring
-                    will be returned.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of ProcessInfo tuples with |name|, |pid|, and |ppid| fields.
-    """
-    # pylint: disable=broad-except
-    process_name = process_name or ''
-    processes = []
-    for line in self._GetPsOutput(process_name):
-      row = line.split()
-      try:
-        row = {k: row[i] for k, i in _PS_COLUMNS.items()}
-        if row['pid'] == 'PID' or process_name not in row['name']:
-          # Skip over header and non-matching processes.
-          continue
-        row['pid'] = int(row['pid'])
-        row['ppid'] = int(row['ppid'])
-      except Exception:  # e.g. IndexError, TypeError, ValueError.
-        logging.warning('failed to parse ps line: %r', line)
-        continue
-      processes.append(ProcessInfo(**row))
-    return processes
-
-  def _GetDumpsysOutput(self, extra_args, pattern=None):
-    """Runs |dumpsys| command on the device and returns its output.
-
-    This private method implements support for filtering the output by a given
-    |pattern|, but does not do any output parsing.
-    """
-    try:
-      cmd = ['dumpsys'] + extra_args
-      if pattern:
-        cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd)
-        return self._RunPipedShellCommand(
-            '%s | grep -F %s' % (cmd, cmd_helper.SingleQuote(pattern)))
-      else:
-        cmd = ['dumpsys'] + extra_args
-        return self.RunShellCommand(cmd, check_return=True, large_output=True)
-    except device_errors.AdbShellCommandFailedError as e:
-      if e.status and isinstance(e.status, list) and not e.status[0]:
-        # If dumpsys succeeded but grep failed, there were no lines matching
-        # the given pattern.
-        return []
-      else:
-        raise
-
-  # TODO(#4103): Remove after migrating clients to ListProcesses.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPids(self, process_name=None, timeout=None, retries=None):
-    """Returns the PIDs of processes containing the given name as substring.
-
-    DEPRECATED
-
-    Note that the |process_name| is often the package name.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-                    If missing returns PIDs for all processes.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict mapping process name to a list of PIDs for each process that
-      contained the provided |process_name|.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    procs_pids = collections.defaultdict(list)
-    for p in self.ListProcesses(process_name):
-      procs_pids[p.name].append(str(p.pid))
-    return procs_pids
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationPids(self,
-                         process_name,
-                         at_most_one=False,
-                         timeout=None,
-                         retries=None):
-    """Returns the PID or PIDs of a given process name.
-
-    Note that the |process_name|, often the package name, must match exactly.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-      at_most_one: A boolean indicating that at most one PID is expected to
-                   be found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of the PIDs for the named process. If at_most_one=True returns
-      the single PID found or None otherwise.
-
-    Raises:
-      CommandFailedError if at_most_one=True and more than one PID is found
-          for the named process.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    pids = [
-        p.pid for p in self.ListProcesses(process_name)
-        if p.name == process_name
-    ]
-    if at_most_one:
-      if len(pids) > 1:
-        raise device_errors.CommandFailedError(
-            'Expected a single PID for %r but found: %r.' % (process_name,
-                                                             pids),
-            device_serial=str(self))
-      return pids[0] if pids else None
-    else:
-      return pids
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetEnforce(self, timeout=None, retries=None):
-    """Get the current mode of SELinux.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True (enforcing), False (permissive), or None (disabled).
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    output = self.RunShellCommand(['getenforce'],
-                                  check_return=True,
-                                  single_line=True).lower()
-    if output not in _SELINUX_MODE:
-      raise device_errors.CommandFailedError(
-          'Unexpected getenforce output: %s' % output)
-    return _SELINUX_MODE[output]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetEnforce(self, enabled, timeout=None, retries=None):
-    """Modify the mode SELinux is running in.
-
-    Args:
-      enabled: a boolean indicating whether to put SELinux in encorcing mode
-               (if True), or permissive mode (otherwise).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self.RunShellCommand(['setenforce', '1' if int(enabled) else '0'],
-                         as_root=True,
-                         check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetWebViewUpdateServiceDump(self, timeout=None, retries=None):
-    """Get the WebView update command sysdump on the device.
-
-    Returns:
-      A dictionary with these possible entries:
-        FallbackLogicEnabled: True|False
-        CurrentWebViewPackage: "package name" or None
-        MinimumWebViewVersionCode: int
-        WebViewPackages: Dict of installed WebView providers, mapping "package
-            name" to "reason it's valid/invalid."
-
-    The returned dictionary may not include all of the above keys: this depends
-    on the support of the platform's underlying WebViewUpdateService. This may
-    return an empty dictionary on OS versions which do not support querying the
-    WebViewUpdateService.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    result = {}
-
-    # Command was implemented starting in Oreo
-    if self.build_version_sdk < version_codes.OREO:
-      return result
-
-    output = self.RunShellCommand(['dumpsys', 'webviewupdate'],
-                                  check_return=True)
-    webview_packages = {}
-    for line in output:
-      match = re.search(_WEBVIEW_SYSUPDATE_CURRENT_PKG_RE, line)
-      if match:
-        result['CurrentWebViewPackage'] = match.group(1)
-      match = re.search(_WEBVIEW_SYSUPDATE_NULL_PKG_RE, line)
-      if match:
-        result['CurrentWebViewPackage'] = None
-      match = re.search(_WEBVIEW_SYSUPDATE_FALLBACK_LOGIC_RE, line)
-      if match:
-        result['FallbackLogicEnabled'] = \
-            True if match.group(1) == 'true' else False
-      match = re.search(_WEBVIEW_SYSUPDATE_PACKAGE_INSTALLED_RE, line)
-      if match:
-        package_name = match.group(1)
-        reason = match.group(2)
-        webview_packages[package_name] = reason
-      match = re.search(_WEBVIEW_SYSUPDATE_PACKAGE_NOT_INSTALLED_RE, line)
-      if match:
-        package_name = match.group(1)
-        reason = match.group(2)
-        webview_packages[package_name] = reason
-      match = re.search(_WEBVIEW_SYSUPDATE_MIN_VERSION_CODE, line)
-      if match:
-        result['MinimumWebViewVersionCode'] = int(match.group(1))
-    if webview_packages:
-      result['WebViewPackages'] = webview_packages
-    return result
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetWebViewImplementation(self, package_name, timeout=None, retries=None):
-    """Select the WebView implementation to the specified package.
-
-    Args:
-      package_name: The package name of a WebView implementation. The package
-        must be already installed on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not self.IsApplicationInstalled(package_name):
-      raise device_errors.CommandFailedError(
-          '%s is not installed' % package_name, str(self))
-    output = self.RunShellCommand(
-        ['cmd', 'webviewupdate', 'set-webview-implementation', package_name],
-        single_line=True,
-        check_return=False)
-    if output == 'Success':
-      logging.info('WebView provider set to: %s', package_name)
-    else:
-      dumpsys_output = self.GetWebViewUpdateServiceDump()
-      webview_packages = dumpsys_output.get('WebViewPackages')
-      if webview_packages:
-        reason = webview_packages.get(package_name)
-        if not reason:
-          all_provider_package_names = webview_packages.keys()
-          raise device_errors.CommandFailedError(
-              '%s is not in the system WebView provider list. Must choose one '
-              'of %r.' % (package_name, all_provider_package_names), str(self))
-        if re.search(r'is\s+NOT\s+installed/enabled for all users', reason):
-          raise device_errors.CommandFailedError(
-              '%s is disabled, make sure to disable WebView fallback logic' %
-              package_name, str(self))
-        if re.search(r'No WebView-library manifest flag', reason):
-          raise device_errors.CommandFailedError(
-              '%s does not declare a WebView native library, so it cannot '
-              'be a WebView provider' % package_name, str(self))
-        if re.search(r'SDK version too low', reason):
-          app_target_sdk_version = self.GetApplicationTargetSdk(package_name)
-          is_preview_sdk = self.GetProp('ro.build.version.preview_sdk') == '1'
-          if is_preview_sdk:
-            codename = self.GetProp('ro.build.version.codename')
-            raise device_errors.CommandFailedError(
-                '%s targets a finalized SDK (%r), but valid WebView providers '
-                'must target a pre-finalized SDK (%r) on this device' %
-                (package_name, app_target_sdk_version, codename), str(self))
-          else:
-            raise device_errors.CommandFailedError(
-                '%s has targetSdkVersion %r, but valid WebView providers must '
-                'target >= %r on this device' %
-                (package_name, app_target_sdk_version, self.build_version_sdk),
-                str(self))
-        if re.search(r'Version code too low', reason):
-          raise device_errors.CommandFailedError(
-              '%s needs a higher versionCode (must be >= %d)' %
-              (package_name, dumpsys_output.get('MinimumWebViewVersionCode')),
-              str(self))
-        if re.search(r'Incorrect signature', reason):
-          raise device_errors.CommandFailedError(
-              '%s is not signed with release keys (but user builds require '
-              'this for WebView providers)' % package_name, str(self))
-      raise device_errors.CommandFailedError(
-          'Error setting WebView provider: %s' % output, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetWebViewFallbackLogic(self, enabled, timeout=None, retries=None):
-    """Set whether WebViewUpdateService's "fallback logic" should be enabled.
-
-    WebViewUpdateService has nonintuitive "fallback logic" for devices where
-    Monochrome (Chrome Stable) is preinstalled as the WebView provider, with a
-    "stub" (little-to-no code) implementation of standalone WebView.
-
-    "Fallback logic" (enabled by default) is designed, in the case where the
-    user has disabled Chrome, to fall back to the stub standalone WebView by
-    enabling the package. The implementation plumbs through the Chrome APK until
-    Play Store installs an update with the full implementation.
-
-    A surprising side-effect of "fallback logic" is that, immediately after
-    sideloading WebView, WebViewUpdateService re-disables the package and
-    uninstalls the update. This can prevent successfully using standalone
-    WebView for development, although "fallback logic" can be disabled on
-    userdebug/eng devices.
-
-    Because this is only relevant for devices with the standalone WebView stub,
-    this command is only relevant on N-P (inclusive).
-
-    You can determine if "fallback logic" is currently enabled by checking
-    FallbackLogicEnabled in the dictionary returned by
-    GetWebViewUpdateServiceDump.
-
-    Args:
-      enabled: bool - True for enabled, False for disabled
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    # Command is only available on devices which preinstall stub WebView.
-    if not version_codes.NOUGAT <= self.build_version_sdk <= version_codes.PIE:
-      return
-
-    # redundant-packages is the opposite of fallback logic
-    enable_string = 'disable' if enabled else 'enable'
-    output = self.RunShellCommand(
-        ['cmd', 'webviewupdate',
-         '%s-redundant-packages' % enable_string],
-        single_line=True,
-        check_return=True)
-    if output == 'Success':
-      logging.info('WebView Fallback Logic is %s',
-                   'enabled' if enabled else 'disabled')
-    else:
-      raise device_errors.CommandFailedError(
-          'Error setting WebView Fallback Logic: %s' % output, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def TakeScreenshot(self, host_path=None, timeout=None, retries=None):
-    """Takes a screenshot of the device.
-
-    Args:
-      host_path: A string containing the path on the host to save the
-                 screenshot to. If None, a file name in the current
-                 directory will be generated.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The name of the file on the host to which the screenshot was saved.
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not host_path:
-      host_path = os.path.abspath(
-          'screenshot-%s-%s.png' % (self.serial, _GetTimeStamp()))
-    with device_temp_file.DeviceTempFile(self.adb, suffix='.png') as device_tmp:
-      self.RunShellCommand(['/system/bin/screencap', '-p', device_tmp.name],
-                           check_return=True)
-      self.PullFile(device_tmp.name, host_path)
-    return host_path
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DismissCrashDialogIfNeeded(self, timeout=None, retries=None):
-    """Dismiss the error/ANR dialog if present.
-
-    Returns: Name of the crashed package if a dialog is focused,
-             None otherwise.
-    """
-
-    def _FindFocusedWindow():
-      match = None
-      # TODO(jbudorick): Try to grep the output on the device instead of using
-      # large_output if/when DeviceUtils exposes a public interface for piped
-      # shell command handling.
-      for line in self.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                       check_return=True,
-                                       large_output=True):
-        match = re.match(_CURRENT_FOCUS_CRASH_RE, line)
-        if match:
-          break
-      return match
-
-    match = _FindFocusedWindow()
-    if not match:
-      return None
-    package = match.group(2)
-    logger.warning('Trying to dismiss %s dialog for %s', *match.groups())
-    self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
-    self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
-    self.SendKeyEvent(keyevent.KEYCODE_ENTER)
-    match = _FindFocusedWindow()
-    if match:
-      logger.error('Still showing a %s dialog for %s', *match.groups())
-    return package
-
-  def GetLogcatMonitor(self, *args, **kwargs):
-    """Returns a new LogcatMonitor associated with this device.
-
-    Parameters passed to this function are passed directly to
-    |logcat_monitor.LogcatMonitor| and are documented there.
-    """
-    return logcat_monitor.LogcatMonitor(self.adb, *args, **kwargs)
-
-  def GetClientCache(self, client_name):
-    """Returns client cache."""
-    if client_name not in self._client_caches:
-      self._client_caches[client_name] = {}
-    return self._client_caches[client_name]
-
-  def ClearCache(self):
-    """Clears all caches."""
-    for client in self._client_caches:
-      self._client_caches[client].clear()
-    self._cache = {
-        # Map of packageId -> list of on-device .apk paths
-        'package_apk_paths': {},
-        # Set of packageId that were loaded from LoadCacheData and not yet
-        # verified.
-        'package_apk_paths_to_verify': set(),
-        # Map of packageId -> set of on-device .apk checksums
-        'package_apk_checksums': {},
-        # Map of property_name -> value
-        'getprop': {},
-        # Map of device path -> checksum]
-        'device_path_checksums': {},
-        # Location of sdcard ($EXTERNAL_STORAGE).
-        'external_storage': None,
-        # Token used to detect when LoadCacheData is stale.
-        'token': None,
-        'prev_token': None,
-        # Path for tracing.
-        'tracing_path': None,
-    }
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def LoadCacheData(self, data, timeout=None, retries=None):
-    """Initializes the cache from data created using DumpCacheData.
-
-    The cache is used only if its token matches the one found on the device.
-    This prevents a stale cache from being used (which can happen when sharing
-    devices).
-
-    Args:
-      data: A previously serialized cache (string).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Whether the cache was loaded.
-    """
-    try:
-      obj = json.loads(data)
-    except ValueError:
-      logger.error('Unable to parse cache file. Not using it.')
-      return False
-    self._EnsureCacheInitialized()
-    given_token = obj.get('token')
-    if not given_token or self._cache['prev_token'] != given_token:
-      logger.warning('Stale cache detected. Not using it.')
-      return False
-
-    self._cache['package_apk_paths'] = obj.get('package_apk_paths', {})
-    # When using a cache across script invokations, verify that apps have
-    # not been uninstalled.
-    self._cache['package_apk_paths_to_verify'] = set(
-        self._cache['package_apk_paths'])
-
-    package_apk_checksums = obj.get('package_apk_checksums', {})
-    for k, v in package_apk_checksums.items():
-      package_apk_checksums[k] = set(v)
-    self._cache['package_apk_checksums'] = package_apk_checksums
-    device_path_checksums = obj.get('device_path_checksums', {})
-    self._cache['device_path_checksums'] = device_path_checksums
-    return True
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DumpCacheData(self, timeout=None, retries=None):
-    """Dumps the current cache state to a string.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A serialized cache as a string.
-    """
-    self._EnsureCacheInitialized()
-    obj = {}
-    obj['token'] = self._cache['token']
-    obj['package_apk_paths'] = self._cache['package_apk_paths']
-    obj['package_apk_checksums'] = self._cache['package_apk_checksums']
-    # JSON can't handle sets.
-    for k, v in obj['package_apk_checksums'].items():
-      obj['package_apk_checksums'][k] = list(v)
-    obj['device_path_checksums'] = self._cache['device_path_checksums']
-    return json.dumps(obj, separators=(',', ':'))
-
-  @classmethod
-  def parallel(cls, devices, asyn=False):
-    """Creates a Parallelizer to operate over the provided list of devices.
-
-    Args:
-      devices: A list of either DeviceUtils instances or objects from
-               from which DeviceUtils instances can be constructed. If None,
-               all attached devices will be used.
-      asyn: If true, returns a Parallelizer that runs operations
-             asynchronously.
-
-    Returns:
-      A Parallelizer operating over |devices|.
-    """
-    devices = [d if isinstance(d, cls) else cls(d) for d in devices]
-    if asyn:
-      return parallelizer.Parallelizer(devices)
-    else:
-      return parallelizer.SyncParallelizer(devices)
-
-  @classmethod
-  def HealthyDevices(cls,
-                     denylist=None,
-                     device_arg='default',
-                     retries=1,
-                     enable_usb_resets=False,
-                     abis=None,
-                     **kwargs):
-    """Returns a list of DeviceUtils instances.
-
-    Returns a list of DeviceUtils instances that are attached, not denylisted,
-    and optionally filtered by --device flags or ANDROID_SERIAL environment
-    variable.
-
-    Args:
-      denylist: A DeviceDenylist instance (optional). Device serials in this
-          denylist will never be returned, but a warning will be logged if they
-          otherwise would have been.
-      device_arg: The value of the --device flag. This can be:
-          'default' -> Same as [], but returns an empty list rather than raise a
-              NoDevicesError.
-          [] -> Returns all devices, unless $ANDROID_SERIAL is set.
-          None -> Use $ANDROID_SERIAL if set, otherwise looks for a single
-              attached device. Raises an exception if multiple devices are
-              attached.
-          'serial' -> Returns an instance for the given serial, if not
-              denylisted.
-          ['A', 'B', ...] -> Returns instances for the subset that is not
-              denylisted.
-      retries: Number of times to restart adb server and query it again if no
-          devices are found on the previous attempts, with exponential backoffs
-          up to 60s between each retry.
-      enable_usb_resets: If true, will attempt to trigger a USB reset prior to
-          the last attempt if there are no available devices. It will only reset
-          those that appear to be android devices.
-      abis: A list of ABIs for which the device needs to support at least one of
-          (optional). See devil.android.ndk.abis for valid values.
-      A device serial, or a list of device serials (optional).
-
-    Returns:
-      A list of DeviceUtils instances.
-
-    Raises:
-      NoDevicesError: Raised when no non-denylisted devices exist and
-          device_arg is passed.
-      MultipleDevicesError: Raise when multiple devices exist, but |device_arg|
-          is None.
-    """
-    allow_no_devices = False
-    if device_arg == 'default':
-      allow_no_devices = True
-      device_arg = ()
-
-    select_multiple = True
-    if not (isinstance(device_arg, tuple) or isinstance(device_arg, list)):
-      select_multiple = False
-      if device_arg:
-        device_arg = (device_arg, )
-
-    denylisted_devices = denylist.Read() if denylist else []
-
-    # adb looks for ANDROID_SERIAL, so support it as well.
-    android_serial = os.environ.get('ANDROID_SERIAL')
-    if not device_arg and android_serial:
-      device_arg = (android_serial, )
-
-    def denylisted(serial):
-      if serial in denylisted_devices:
-        logger.warning('Device %s is denylisted.', serial)
-        return True
-      return False
-
-    def supports_abi(abi, serial):
-      if abis and abi not in abis:
-        logger.warning("Device %s doesn't support required ABIs.", serial)
-        return False
-      return True
-
-    def _get_devices():
-      if device_arg:
-        devices = [cls(x, **kwargs) for x in device_arg if not denylisted(x)]
-      else:
-        devices = []
-        for adb in adb_wrapper.AdbWrapper.Devices():
-          serial = adb.GetDeviceSerial()
-          if not denylisted(serial):
-            device = cls(_CreateAdbWrapper(adb), **kwargs)
-            if supports_abi(device.GetABI(), serial):
-              devices.append(device)
-
-      if len(devices) == 0 and not allow_no_devices:
-        raise device_errors.NoDevicesError()
-      if len(devices) > 1 and not select_multiple:
-        raise device_errors.MultipleDevicesError(devices)
-      return sorted(devices)
-
-    def _reset_devices():
-      if not reset_usb:
-        logging.error(
-            'reset_usb.py not supported on this platform (%s). Skipping usb '
-            'resets.', sys.platform)
-        return
-      if device_arg:
-        for serial in device_arg:
-          reset_usb.reset_android_usb(serial)
-      else:
-        reset_usb.reset_all_android_devices()
-
-    for attempt in range(retries + 1):
-      try:
-        return _get_devices()
-      except device_errors.NoDevicesError:
-        if attempt == retries:
-          logging.error('No devices found after exhausting all retries.')
-          raise
-        elif attempt == retries - 1 and enable_usb_resets:
-          logging.warning(
-              'Attempting to reset relevant USB devices prior to the last '
-              'attempt.')
-          _reset_devices()
-        # math.pow returns floats, so cast to int for easier testing
-        sleep_s = min(int(math.pow(2, attempt + 1)), 60)
-        logger.warning(
-            'No devices found. Will try again after restarting adb server '
-            'and a short nap of %d s.', sleep_s)
-        time.sleep(sleep_s)
-        adb_wrapper.RestartServer()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RestartAdbd(self, timeout=None, retries=None):
-    logger.info('Restarting adbd on device.')
-    with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-      self.WriteFile(script.name, _RESTART_ADBD_SCRIPT)
-      self.RunShellCommand(['source', script.name],
-                           check_return=True,
-                           as_root=True)
-      self.adb.WaitForDevice()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GrantPermissions(self, package, permissions, timeout=None, retries=None):
-    if not permissions:
-      return
-
-    # For Andorid-11(R), enable MANAGE_EXTERNAL_STORAGE for testing.
-    # See https://bit.ly/2MBjBIM for details.
-    if ('android.permission.MANAGE_EXTERNAL_STORAGE' in permissions
-        and self.build_version_sdk >= version_codes.R):
-      script_manage_ext_storage = [
-          'appops set {package} MANAGE_EXTERNAL_STORAGE allow',
-          'echo "{sep}MANAGE_EXTERNAL_STORAGE{sep}$?{sep}"',
-      ]
-    else:
-      script_manage_ext_storage = []
-
-    permissions = set(p for p in permissions
-                      if not _PERMISSIONS_DENYLIST_RE.match(p))
-
-    if ('android.permission.WRITE_EXTERNAL_STORAGE' in permissions
-        and 'android.permission.READ_EXTERNAL_STORAGE' not in permissions):
-      permissions.add('android.permission.READ_EXTERNAL_STORAGE')
-
-    script_raw = [
-        'p={package}',
-        'for q in {permissions}',
-        'do pm grant "$p" "$q"',
-        'echo "{sep}$q{sep}$?{sep}"',
-        'done',
-    ] + script_manage_ext_storage
-
-    script = ';'.join(script_raw).format(
-        package=cmd_helper.SingleQuote(package),
-        permissions=' '.join(
-            cmd_helper.SingleQuote(p) for p in sorted(permissions)),
-        sep=_SHELL_OUTPUT_SEPARATOR)
-
-    logger.info('Setting permissions for %s.', package)
-    res = self.RunShellCommand(
-        script,
-        shell=True,
-        raw_output=True,
-        large_output=True,
-        check_return=True)
-    res = res.split(_SHELL_OUTPUT_SEPARATOR)
-    failures = [
-        (permission, output.strip())
-        for permission, status, output in zip(res[1::3], res[2::3], res[0::3])
-        if int(status)
-    ]
-
-    if failures:
-      logger.warning(
-          'Failed to grant some permissions. Denylist may need to be updated?')
-      for permission, output in failures:
-        # Try to grab the relevant error message from the output.
-        m = _PERMISSIONS_EXCEPTION_RE.search(output)
-        if m:
-          error_msg = m.group(0)
-        elif len(output) > 200:
-          error_msg = repr(output[:200]) + ' (truncated)'
-        else:
-          error_msg = repr(output)
-        logger.warning('- %s: %s', permission, error_msg)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsScreenOn(self, timeout=None, retries=None):
-    """Determines if screen is on.
-
-    Dumpsys input_method exposes screen on/off state. Below is an explination of
-    the states.
-
-    Pre-L:
-      On: mScreenOn=true
-      Off: mScreenOn=false
-    L+:
-      On: mInteractive=true
-      Off: mInteractive=false
-
-    Returns:
-      True if screen is on, false if it is off.
-
-    Raises:
-      device_errors.CommandFailedError: If screen state cannot be found.
-    """
-    if self.build_version_sdk < version_codes.LOLLIPOP:
-      input_check = 'mScreenOn'
-      check_value = 'mScreenOn=true'
-    else:
-      input_check = 'mInteractive'
-      check_value = 'mInteractive=true'
-    dumpsys_out = self._RunPipedShellCommand(
-        'dumpsys input_method | grep %s' % input_check)
-    if not dumpsys_out:
-      raise device_errors.CommandFailedError('Unable to detect screen state',
-                                             str(self))
-    return check_value in dumpsys_out[0]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetScreen(self, on, timeout=None, retries=None):
-    """Turns screen on and off.
-
-    Args:
-      on: bool to decide state to switch to. True = on False = off.
-    """
-
-    def screen_test():
-      return self.IsScreenOn() == on
-
-    if screen_test():
-      logger.info('Screen already in expected state.')
-      return
-    self.SendKeyEvent(keyevent.KEYCODE_POWER)
-    timeout_retry.WaitFor(screen_test, wait_period=1)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ChangeOwner(self, owner_group, paths, timeout=None, retries=None):
-    """Changes file system ownership for permissions.
-
-    Args:
-      owner_group: New owner and group to assign. Note that this should be a
-        string in the form user[.group] where the group is option.
-      paths: Paths to change ownership of.
-
-      Note that the -R recursive option is not supported by all Android
-      versions.
-    """
-    if not paths:
-      return
-    self.RunShellCommand(['chown', owner_group] + paths, check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ChangeSecurityContext(self,
-                            security_context,
-                            paths,
-                            timeout=None,
-                            retries=None):
-    """Changes the SELinux security context for files.
-
-    Args:
-      security_context: The new security context as a string
-      paths: Paths to change the security context of.
-
-      Note that the -R recursive option is not supported by all Android
-      versions.
-    """
-    if not paths:
-      return
-    command = ['chcon', security_context] + paths
-
-    # Note, need to force su because chcon can fail with permission errors even
-    # if the device is rooted.
-    self.RunShellCommand(command, as_root=_FORCE_SU, check_return=True)
diff --git a/systrace/catapult/devil/devil/android/device_utils_devicetest.py b/systrace/catapult/devil/devil/android/device_utils_devicetest.py
deleted file mode 100755
index a0734c2..0000000
--- a/systrace/catapult/devil/devil/android/device_utils_devicetest.py
+++ /dev/null
@@ -1,307 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of device_utils.py (mostly DeviceUtils).
-The test will invoke real devices
-"""
-
-import os
-import posixpath
-import sys
-import tempfile
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(
-          os.path.dirname(__file__),
-          '..',
-          '..',
-      )))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-
-_OLD_CONTENTS = "foo"
-_NEW_CONTENTS = "bar"
-_DEVICE_DIR = "/data/local/tmp/device_utils_test"
-_SUB_DIR = "sub"
-_SUB_DIR1 = "sub1"
-_SUB_DIR2 = "sub2"
-
-
-class DeviceUtilsPushDeleteFilesTest(device_test_case.DeviceTestCase):
-  def setUp(self):
-    super(DeviceUtilsPushDeleteFilesTest, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-
-  @staticmethod
-  def _MakeTempFile(contents):
-    """Make a temporary file with the given contents.
-
-    Args:
-      contents: string to write to the temporary file.
-
-    Returns:
-      the tuple contains the absolute path to the file and the file name
-    """
-    fi, path = tempfile.mkstemp(text=True)
-    with os.fdopen(fi, 'w') as f:
-      f.write(contents)
-    file_name = os.path.basename(path)
-    return (path, file_name)
-
-  @staticmethod
-  def _MakeTempFileGivenDir(directory, contents):
-    """Make a temporary file under the given directory
-    with the given contents
-
-    Args:
-      directory: the temp directory to create the file
-      contents: string to write to the temp file
-
-    Returns:
-      the list contains the absolute path to the file and the file name
-    """
-    fi, path = tempfile.mkstemp(dir=directory, text=True)
-    with os.fdopen(fi, 'w') as f:
-      f.write(contents)
-    file_name = os.path.basename(path)
-    return (path, file_name)
-
-  @staticmethod
-  def _ChangeTempFile(path, contents):
-    with os.open(path, 'w') as f:
-      f.write(contents)
-
-  @staticmethod
-  def _DeleteTempFile(path):
-    os.remove(path)
-
-  def testPushChangedFiles_noFileChange(self):
-    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-    self.device.PushChangedFiles([(host_file_path, device_file_path)])
-    result = self.device.RunShellCommand(['cat', device_file_path],
-                                         check_return=True,
-                                         single_line=True)
-    self.assertEqual(_OLD_CONTENTS, result)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushChangedFiles_singleFileChange(self):
-    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-
-    with open(host_file_path, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    self.device.PushChangedFiles([(host_file_path, device_file_path)])
-    result = self.device.RunShellCommand(['cat', device_file_path],
-                                         check_return=True,
-                                         single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testDeleteFiles(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    (host_file_path, file_name) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertEqual([], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushAndDeleteFiles_noSubDir(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-
-    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
-    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
-    self.adb.Push(host_file_path1, device_file_path1)
-    self.adb.Push(host_file_path2, device_file_path2)
-
-    with open(host_file_path1, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    cmd_helper.RunCmd(['rm', host_file_path2])
-
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-    result = self.device.RunShellCommand(['cat', device_file_path1],
-                                         check_return=True,
-                                         single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertEqual([file_name1], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushAndDeleteFiles_SubDir(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    host_sub_dir1 = "%s/%s" % (host_tmp_dir, _SUB_DIR1)
-    host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2)
-    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir1])
-    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir2])
-
-    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path3, file_name3) = self._MakeTempFileGivenDir(
-        host_sub_dir1, _OLD_CONTENTS)
-    (host_file_path4, file_name4) = self._MakeTempFileGivenDir(
-        host_sub_dir2, _OLD_CONTENTS)
-
-    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
-    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
-    device_file_path3 = "%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR1, file_name3)
-    device_file_path4 = "%s/%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR, _SUB_DIR2,
-                                         file_name4)
-
-    self.adb.Push(host_file_path1, device_file_path1)
-    self.adb.Push(host_file_path2, device_file_path2)
-    self.adb.Push(host_file_path3, device_file_path3)
-    self.adb.Push(host_file_path4, device_file_path4)
-
-    with open(host_file_path1, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    cmd_helper.RunCmd(['rm', host_file_path2])
-    cmd_helper.RunCmd(['rm', host_file_path4])
-
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-    result = self.device.RunShellCommand(['cat', device_file_path1],
-                                         check_return=True,
-                                         single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertIn(file_name1, filenames)
-    self.assertIn(_SUB_DIR1, filenames)
-    self.assertIn(_SUB_DIR, filenames)
-    self.assertEqual(3, len(filenames))
-
-    result = self.device.RunShellCommand(['cat', device_file_path3],
-                                         check_return=True,
-                                         single_line=True)
-    self.assertEqual(_OLD_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(
-        posixpath.join(_DEVICE_DIR, _SUB_DIR, _SUB_DIR2))
-    self.assertEqual([], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushWithStaleDirectories(self):
-    # Make a few files and directories to push.
-    host_tmp_dir = tempfile.mkdtemp()
-    host_sub_dir1 = '%s/%s' % (host_tmp_dir, _SUB_DIR1)
-    host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2)
-    os.makedirs(host_sub_dir1)
-    os.makedirs(host_sub_dir2)
-
-    self._MakeTempFileGivenDir(host_sub_dir1, _OLD_CONTENTS)
-    self._MakeTempFileGivenDir(host_sub_dir2, _OLD_CONTENTS)
-
-    # Push all our created files/directories and verify they're on the device.
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-    top_level_dirs = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertIn(_SUB_DIR1, top_level_dirs)
-    self.assertIn(_SUB_DIR, top_level_dirs)
-    sub_dir = self.device.ListDirectory('%s/%s' % (_DEVICE_DIR, _SUB_DIR))
-    self.assertIn(_SUB_DIR2, sub_dir)
-
-    # Remove one of the directories on the host and push again.
-    cmd_helper.RunCmd(['rm', '-rf', host_sub_dir2])
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-
-    # Verify that the directory we removed is no longer on the device, but the
-    # other directories still are.
-    top_level_dirs = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertIn(_SUB_DIR1, top_level_dirs)
-    self.assertIn(_SUB_DIR, top_level_dirs)
-    sub_dir = self.device.ListDirectory('%s/%s' % (_DEVICE_DIR, _SUB_DIR))
-    self.assertEqual([], sub_dir)
-
-  def testRestartAdbd(self):
-    def get_adbd_pid():
-      try:
-        return next(p.pid for p in self.device.ListProcesses('adbd'))
-      except StopIteration:
-        self.fail('Unable to find adbd')
-
-    old_adbd_pid = get_adbd_pid()
-    self.device.RestartAdbd()
-    new_adbd_pid = get_adbd_pid()
-    self.assertNotEqual(old_adbd_pid, new_adbd_pid)
-
-  def testEnableRoot(self):
-    self.device.SetProp('service.adb.root', '0')
-    self.device.RestartAdbd()
-    self.assertFalse(self.device.HasRoot())
-    self.assertIn(self.device.GetProp('service.adb.root'), ('', '0'))
-    self.device.EnableRoot()
-    self.assertTrue(self.device.HasRoot())
-    self.assertEquals(self.device.GetProp('service.adb.root'), '1')
-
-
-class PsOutputCompatibilityTests(device_test_case.DeviceTestCase):
-  def setUp(self):
-    super(PsOutputCompatibilityTests, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(self.adb, default_retries=0)
-
-  def testPsOutoutCompatibility(self):
-    # pylint: disable=protected-access
-    lines = self.device._GetPsOutput(None)
-
-    # Check column names at each index match expected values.
-    header = lines[0].split()
-    for column, idx in device_utils._PS_COLUMNS.iteritems():
-      column = column.upper()
-      self.assertEqual(
-          header[idx], column,
-          'Expected column %s at index %d but found %s\nsource: %r' %
-          (column, idx, header[idx], lines[0]))
-
-    # Check pid and ppid are numeric values.
-    for line in lines[1:]:
-      row = line.split()
-      row = {k: row[i] for k, i in device_utils._PS_COLUMNS.iteritems()}
-      for key in ('pid', 'ppid'):
-        self.assertTrue(
-            row[key].isdigit(),
-            'Expected numeric %s value but found %r\nsource: %r' %
-            (key, row[key], line))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/device_utils_test.py b/systrace/catapult/devil/devil/android/device_utils_test.py
deleted file mode 100755
index 8e583f0..0000000
--- a/systrace/catapult/devil/devil/android/device_utils_test.py
+++ /dev/null
@@ -1,4013 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of device_utils.py (mostly DeviceUtils).
-"""
-
-# pylint: disable=protected-access
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import io
-import json
-import logging
-import os
-import posixpath
-import stat
-import sys
-import unittest
-
-import six
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_signal
-from devil.android import device_utils
-from devil.android.ndk import abis
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import version_codes
-from devil.utils import cmd_helper
-from devil.utils import mock_calls
-
-with devil_env.SysPath(os.path.join(devil_env.PY_UTILS_PATH)):
-  from py_utils import tempfile_ext
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-TEST_APK_PATH = '/fake/test/app.apk'
-TEST_PACKAGE = 'test.package'
-
-
-def Process(name, pid, ppid='1'):
-  return device_utils.ProcessInfo(name=name, pid=pid, ppid=ppid)
-
-
-def Processes(*args):
-  return [Process(*arg) for arg in args]
-
-
-class AnyStringWith(object):
-  def __init__(self, value):
-    self._value = value
-
-  def __eq__(self, other):
-    return self._value in other
-
-  def __repr__(self):
-    return '<AnyStringWith: %s>' % self._value
-
-
-class _FakeContextManager(object):
-  def __init__(self, obj):
-    self._obj = obj
-
-  def __enter__(self):
-    return self._obj
-
-  def __exit__(self, type_, value, traceback):
-    pass
-
-
-class _MockApkHelper(object):
-  def __init__(self, path, package_name, perms=None, splits=None):
-    self.path = path
-    self.is_bundle = path.endswith('_bundle')
-    self.package_name = package_name
-    self.perms = perms
-    self.splits = splits if splits else []
-    self.abis = [abis.ARM]
-    self.version_code = None
-
-  def GetPackageName(self):
-    return self.package_name
-
-  def GetPermissions(self):
-    return self.perms
-
-  def GetVersionCode(self):
-    return self.version_code
-
-  def GetAbis(self):
-    return self.abis
-
-  def GetApkPaths(self,
-                  device,
-                  modules=None,
-                  allow_cached_props=False,
-                  additional_locales=None):
-    return _FakeContextManager([self.path] + self.splits)
-
-  #override
-  @staticmethod
-  def SupportsSplits():
-    return True
-
-
-class _MockMultipleDevicesError(Exception):
-  pass
-
-
-class DeviceUtilsInitTest(unittest.TestCase):
-  def testInitWithStr(self):
-    serial_as_str = str('0123456789abcdef')
-    d = device_utils.DeviceUtils('0123456789abcdef')
-    self.assertEqual(serial_as_str, d.adb.GetDeviceSerial())
-
-  def testInitWithUnicode(self):
-    if six.PY2:
-      serial_as_unicode = unicode('fedcba9876543210')
-      d = device_utils.DeviceUtils(serial_as_unicode)
-      self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial())
-
-  def testInitWithAdbWrapper(self):
-    serial = '123456789abcdef0'
-    a = adb_wrapper.AdbWrapper(serial)
-    d = device_utils.DeviceUtils(a)
-    self.assertEqual(serial, d.adb.GetDeviceSerial())
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(ValueError):
-      device_utils.DeviceUtils(None)
-    with self.assertRaises(ValueError):
-      device_utils.DeviceUtils('')
-
-
-class DeviceUtilsGetAVDsTest(mock_calls.TestCase):
-  def testGetAVDs(self):
-    mocked_attrs = {'android_sdk': '/my/sdk/path'}
-    with mock.patch('devil.devil_env._Environment.LocalPath',
-                    mock.Mock(side_effect=lambda a: mocked_attrs[a])):
-      with self.assertCall(
-          mock.call.devil.utils.cmd_helper.GetCmdOutput(
-              [mock.ANY, 'list', 'avd']), 'Available Android Virtual Devices:\n'
-          '    Name: my_android5.0\n'
-          '    Path: /some/path/to/.android/avd/my_android5.0.avd\n'
-          '  Target: Android 5.0 (API level 21)\n'
-          ' Tag/ABI: default/x86\n'
-          '    Skin: WVGA800\n'):
-        self.assertEquals(['my_android5.0'], device_utils.GetAVDs())
-
-
-class DeviceUtilsRestartServerTest(mock_calls.TestCase):
-  @mock.patch('time.sleep', mock.Mock())
-  def testRestartServer_succeeds(self):
-    with self.assertCalls(
-        mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.KillServer(),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']), (1, '')),
-        mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.StartServer(),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (1, '')), (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-             ['pgrep', 'adb']), (0, '123\n'))):
-      adb_wrapper.RestartServer()
-
-
-class MockTempFile(object):
-  def __init__(self, name='/tmp/some/file'):
-    self.file = mock.MagicMock(spec=io.BufferedIOBase)
-    self.file.name = name
-    self.file.name_quoted = cmd_helper.SingleQuote(name)
-
-  def __enter__(self):
-    return self.file
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    pass
-
-  @property
-  def name(self):
-    return self.file.name
-
-
-class MockLogger(mock.Mock):
-  def __init__(self, *args, **kwargs):
-    super(MockLogger, self).__init__(*args, **kwargs)
-    self.warnings = []
-
-  def warning(self, message, *args):
-    self.warnings.append(message % args)
-
-
-def PatchLogger():
-  return mock.patch(
-      'devil.android.device_utils.logger', new_callable=MockLogger)
-
-
-class _PatchedFunction(object):
-  def __init__(self, patched=None, mocked=None):
-    self.patched = patched
-    self.mocked = mocked
-
-
-def _AdbWrapperMock(test_serial, is_ready=True):
-  adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-  adb.__str__ = mock.Mock(return_value=test_serial)
-  adb.GetDeviceSerial.return_value = test_serial
-  adb.is_ready = is_ready
-  return adb
-
-
-class DeviceUtilsTest(mock_calls.TestCase):
-  def setUp(self):
-    self.adb = _AdbWrapperMock('0123456789abcdef')
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
-
-  def safeAssertItemsEqual(self, expected, actual):
-    if six.PY2:
-      self.assertItemsEqual(expected, actual)
-    else:
-      self.assertCountEqual(expected, actual) # pylint: disable=no-member
-
-  def AdbCommandError(self, args=None, output=None, status=None, msg=None):
-    if args is None:
-      args = ['[unspecified]']
-    return mock.Mock(
-        side_effect=device_errors.AdbCommandFailedError(args, output, status,
-                                                        msg, str(self.device)))
-
-  def CommandError(self, msg=None):
-    if msg is None:
-      msg = 'Command failed'
-    return mock.Mock(
-        side_effect=device_errors.CommandFailedError(msg, str(self.device)))
-
-  def ShellError(self, output=None, status=1):
-    def action(cmd, *args, **kwargs):
-      raise device_errors.AdbShellCommandFailedError(cmd, output, status,
-                                                     str(self.device))
-
-    if output is None:
-      output = 'Permission denied\n'
-    return action
-
-  def TimeoutError(self, msg=None):
-    if msg is None:
-      msg = 'Operation timed out'
-    return mock.Mock(
-        side_effect=device_errors.CommandTimeoutError(msg, str(self.device)))
-
-  def EnsureCacheInitialized(self, props=None, sdcard='/sdcard'):
-    props = props or []
-    ret = [sdcard, 'TOKEN'] + props
-    return (self.call.device.RunShellCommand(
-        AnyStringWith('getprop'),
-        shell=True,
-        check_return=True,
-        large_output=True), ret)
-
-
-class DeviceUtilsEqTest(DeviceUtilsTest):
-  def testEq_equal_deviceUtils(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_equal_adbWrapper(self):
-    other = adb_wrapper.AdbWrapper('0123456789abcdef')
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_equal_string(self):
-    other = '0123456789abcdef'
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_devicesNotEqual(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdee'))
-    self.assertFalse(self.device == other)
-    self.assertFalse(other == self.device)
-
-  def testEq_identity(self):
-    self.assertTrue(self.device == self.device)
-
-  def testEq_serialInList(self):
-    devices = [self.device]
-    self.assertTrue('0123456789abcdef' in devices)
-
-
-class DeviceUtilsLtTest(DeviceUtilsTest):
-  def testLt_lessThan(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff'))
-    self.assertTrue(self.device < other)
-    self.assertTrue(other > self.device)
-
-  def testLt_greaterThan_lhs(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000'))
-    self.assertFalse(self.device < other)
-    self.assertFalse(other > self.device)
-
-  def testLt_equal(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
-    self.assertFalse(self.device < other)
-    self.assertFalse(other > self.device)
-
-  def testLt_sorted(self):
-    devices = [
-        device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')),
-        device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')),
-    ]
-    sorted_devices = sorted(devices)
-    self.assertEquals('0000000000000000',
-                      sorted_devices[0].adb.GetDeviceSerial())
-    self.assertEquals('ffffffffffffffff',
-                      sorted_devices[1].adb.GetDeviceSerial())
-
-
-class DeviceUtilsStrTest(DeviceUtilsTest):
-  def testStr_returnsSerial(self):
-    with self.assertCalls((self.call.adb.GetDeviceSerial(),
-                           '0123456789abcdef')):
-      self.assertEqual('0123456789abcdef', str(self.device))
-
-
-class DeviceUtilsIsOnlineTest(DeviceUtilsTest):
-  def testIsOnline_true(self):
-    with self.assertCall(self.call.adb.GetState(), 'device'):
-      self.assertTrue(self.device.IsOnline())
-
-  def testIsOnline_false(self):
-    with self.assertCall(self.call.adb.GetState(), 'offline'):
-      self.assertFalse(self.device.IsOnline())
-
-  def testIsOnline_error(self):
-    with self.assertCall(self.call.adb.GetState(), self.CommandError()):
-      self.assertFalse(self.device.IsOnline())
-
-
-class DeviceUtilsHasRootTest(DeviceUtilsTest):
-  def testHasRoot_true(self):
-    with self.patch_call(self.call.device.build_type,
-                         return_value='userdebug'), (self.assertCall(
-                             self.call.adb.Shell('id'), 'uid=0(root)\n')):
-      self.assertTrue(self.device.HasRoot())
-
-  def testHasRootEngBuild_true(self):
-    with self.patch_call(self.call.device.build_type, return_value='eng'):
-      self.assertTrue(self.device.HasRoot())
-
-  def testHasRoot_false(self):
-    with self.patch_call(self.call.device.build_type,
-                         return_value='userdebug'), (self.assertCall(
-                             self.call.adb.Shell('id'), 'uid=2000(shell)\n')):
-      self.assertFalse(self.device.HasRoot())
-
-
-class DeviceUtilsEnableRootTest(DeviceUtilsTest):
-  def testEnableRoot_succeeds(self):
-    with self.assertCalls(self.call.adb.Root(), self.call.adb.WaitForDevice(),
-                          (self.call.device.HasRoot(), True)):
-      self.device.EnableRoot()
-
-  def testEnableRoot_userBuild(self):
-    with self.assertCalls((self.call.adb.Root(), self.AdbCommandError()),
-                          (self.call.device.IsUserBuild(), True)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.EnableRoot()
-
-  def testEnableRoot_rootFails(self):
-    with self.assertCalls((self.call.adb.Root(), self.AdbCommandError()),
-                          (self.call.device.IsUserBuild(), False)):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.EnableRoot()
-
-  def testEnableRoot_timeoutInWaitForDevice(self):
-    with self.assertCalls(
-        (self.call.adb.Root(),
-         self.AdbCommandError(
-             output='timeout expired while waiting for device')),
-        (self.call.device.IsUserBuild(), False), self.call.adb.WaitForDevice(),
-        (self.call.device.HasRoot(), True)):
-      self.device.EnableRoot()
-
-
-class DeviceUtilsIsUserBuildTest(DeviceUtilsTest):
-  def testIsUserBuild_yes(self):
-    with self.assertCall(
-        self.call.device.GetProp('ro.build.type', cache=True), 'user'):
-      self.assertTrue(self.device.IsUserBuild())
-
-  def testIsUserBuild_no(self):
-    with self.assertCall(
-        self.call.device.GetProp('ro.build.type', cache=True), 'userdebug'):
-      self.assertFalse(self.device.IsUserBuild())
-
-
-class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsTest):
-  def testGetExternalStoragePath_succeeds(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(sdcard='/fake/storage/path')):
-      self.assertEquals('/fake/storage/path',
-                        self.device.GetExternalStoragePath())
-
-  def testGetExternalStoragePath_fails(self):
-    with self.assertCalls(self.EnsureCacheInitialized(sdcard='')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetExternalStoragePath()
-
-
-class DeviceUtilsGetAppWritablePathTest(DeviceUtilsTest):
-  def testGetAppWritablePath_succeeds_sdk_pre_q(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '28'),
-        self.EnsureCacheInitialized(sdcard='/fake/storage/path')):
-      self.assertEquals('/fake/storage/path',
-                        self.device.GetAppWritablePath())
-
-  def testGetAppWritablePath_succeeds_sdk_q(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '29'),
-        self.EnsureCacheInitialized(sdcard='/fake/storage/path')):
-      self.assertEquals('/fake/storage/path/Download',
-                        self.device.GetAppWritablePath())
-
-  def testGetAppWritablePath_fails(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '29'),
-        self.EnsureCacheInitialized(sdcard='')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetAppWritablePath()
-
-
-class DeviceUtilsIsApplicationInstalledTest(DeviceUtilsTest):
-  def testIsApplicationInstalled_installed(self):
-    with self.assertCalls((self.call.device.RunShellCommand(
-        ['pm', 'list', 'packages', 'some.installed.app'], check_return=True),
-                           ['package:some.installed.app'])):
-      self.assertTrue(self.device.IsApplicationInstalled('some.installed.app'))
-
-  def testIsApplicationInstalled_notInstalled(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['pm', 'list', 'packages', 'not.installed.app'], check_return=True),
-         ''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'package'], check_return=True, large_output=True), [])):
-      self.assertFalse(self.device.IsApplicationInstalled('not.installed.app'))
-
-  def testIsApplicationInstalled_substringMatch(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['pm', 'list', 'packages', 'substring.of.package'],
-            check_return=True),
-         [
-             'package:first.substring.of.package',
-             'package:second.substring.of.package',
-         ]),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'package'], check_return=True, large_output=True), [])):
-      self.assertFalse(
-          self.device.IsApplicationInstalled('substring.of.package'))
-
-  def testIsApplicationInstalled_dumpsysFallback(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['pm', 'list', 'packages', 'some.installed.app'],
-            check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'package'], check_return=True, large_output=True),
-         ['Package [some.installed.app] (a12345):'])):
-      self.assertTrue(self.device.IsApplicationInstalled('some.installed.app'))
-
-  def testIsApplicationInstalled_dumpsysFallbackVersioned(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'package'], check_return=True, large_output=True),
-         ['Package [some.installed.app_1234] (a12345):'])):
-      self.assertTrue(
-          self.device.IsApplicationInstalled('some.installed.app', 1234))
-
-  def testIsApplicationInstalled_dumpsysFallbackVersionNotNeeded(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'package'], check_return=True, large_output=True),
-         ['Package [some.installed.app] (a12345):'])):
-      self.assertTrue(
-          self.device.IsApplicationInstalled('some.installed.app', 1234))
-
-
-class DeviceUtilsGetApplicationPathsInternalTest(DeviceUtilsTest):
-  def testGetApplicationPathsInternal_exists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(['pm', 'path', 'android'],
-                                          check_return=True),
-         ['package:/path/to/android.apk'])):
-      self.assertEquals(['/path/to/android.apk'],
-                        self.device._GetApplicationPathsInternal('android'))
-
-  def testGetApplicationPathsInternal_notExists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(['pm', 'path', 'not.installed.app'],
-                                          check_return=True), '')):
-      self.assertEquals(
-          [], self.device._GetApplicationPathsInternal('not.installed.app'))
-
-  def testGetApplicationPathsInternal_garbageOutputRaises(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(['pm', 'path', 'android'],
-                                          check_return=True),
-         ['garbage first line'])):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._GetApplicationPathsInternal('android')
-
-  def testGetApplicationPathsInternal_outputWarningsIgnored(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(['pm', 'path', 'not.installed.app'],
-                                          check_return=True),
-         ['WARNING: some warning message from pm'])):
-      self.assertEquals(
-          [], self.device._GetApplicationPathsInternal('not.installed.app'))
-
-  def testGetApplicationPathsInternal_fails(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(['pm', 'path', 'android'],
-                                          check_return=True),
-         self.CommandError('ERROR. Is package manager running?\n'))):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._GetApplicationPathsInternal('android')
-
-
-class DeviceUtils_GetApplicationVersionTest(DeviceUtilsTest):
-  def test_GetApplicationVersion_exists(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'),
-         'Packages:\n'
-         '  Package [com.android.chrome] (3901ecfb):\n'
-         '    userId=1234 gids=[123, 456, 789]\n'
-         '    pkg=Package{1fecf634 com.android.chrome}\n'
-         '    versionName=45.0.1234.7\n')):
-      self.assertEquals('45.0.1234.7',
-                        self.device.GetApplicationVersion('com.android.chrome'))
-
-  def test_GetApplicationVersion_notExists(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'), '')):
-      self.assertEquals(None,
-                        self.device.GetApplicationVersion('com.android.chrome'))
-
-  def test_GetApplicationVersion_fails(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'),
-         'Packages:\n'
-         '  Package [com.android.chrome] (3901ecfb):\n'
-         '    userId=1234 gids=[123, 456, 789]\n'
-         '    pkg=Package{1fecf634 com.android.chrome}\n')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationVersion('com.android.chrome')
-
-
-class DeviceUtils_GetApplicationTargetSdkTest(DeviceUtilsTest):
-  def test_GetApplicationTargetSdk_exists(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('com.android.chrome'), True),
-        (self.call.device._GetDumpsysOutput(['package', 'com.android.chrome'],
-                                            'targetSdk='),
-         ['    versionCode=413200001 minSdk=21 targetSdk=29'])):
-      self.assertEquals(
-          '29', self.device.GetApplicationTargetSdk('com.android.chrome'))
-
-  def test_GetApplicationTargetSdk_notExists(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('com.android.chrome'), False)):
-      self.assertIsNone(
-          self.device.GetApplicationTargetSdk('com.android.chrome'))
-
-  def test_GetApplicationTargetSdk_fails(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('com.android.chrome'), True),
-        (self.call.device._GetDumpsysOutput(['package', 'com.android.chrome'],
-                                            'targetSdk='), [])):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationTargetSdk('com.android.chrome')
-
-  def test_GetApplicationTargetSdk_prefinalizedSdk(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('com.android.chrome'), True),
-        (self.call.device._GetDumpsysOutput(['package', 'com.android.chrome'],
-                                            'targetSdk='),
-         ['    versionCode=410301483 minSdk=10000 targetSdk=10000']),
-        (self.call.device.GetProp('ro.build.version.codename',
-                                  cache=True), 'R')):
-      self.assertEquals(
-          'R', self.device.GetApplicationTargetSdk('com.android.chrome'))
-
-
-class DeviceUtils_GetPackageArchitectureTest(DeviceUtilsTest):
-  def test_GetPackageArchitecture_exists(self):
-    with self.assertCall(
-        self.call.device._RunPipedShellCommand(
-            'dumpsys package com.android.chrome | grep -F primaryCpuAbi'),
-        ['  primaryCpuAbi=armeabi-v7a']):
-      self.assertEquals(
-          abis.ARM, self.device.GetPackageArchitecture('com.android.chrome'))
-
-  def test_GetPackageArchitecture_notExists(self):
-    with self.assertCall(
-        self.call.device._RunPipedShellCommand(
-            'dumpsys package com.android.chrome | grep -F primaryCpuAbi'), []):
-      self.assertEquals(
-          None, self.device.GetPackageArchitecture('com.android.chrome'))
-
-
-class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest):
-  def testGetApplicationDataDirectory_exists(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('foo.bar.baz'), True),
-        (self.call.device._RunPipedShellCommand(
-            'pm dump foo.bar.baz | grep dataDir='),
-         ['dataDir=/data/data/foo.bar.baz'])):
-      self.assertEquals('/data/data/foo.bar.baz',
-                        self.device.GetApplicationDataDirectory('foo.bar.baz'))
-
-  def testGetApplicationDataDirectory_notInstalled(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('foo.bar.baz'), False)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationDataDirectory('foo.bar.baz')
-
-  def testGetApplicationDataDirectory_notExists(self):
-    with self.assertCalls(
-        (self.call.device.IsApplicationInstalled('foo.bar.baz'), True),
-        (self.call.device._RunPipedShellCommand(
-            'pm dump foo.bar.baz | grep dataDir='), self.ShellError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationDataDirectory('foo.bar.baz')
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest):
-  def testWaitUntilFullyBooted_succeedsWithDefaults(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_succeedsWithWifi(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'),
-         'stuff\nWi-Fi is enabled\nmore stuff\n')):
-      self.device.WaitUntilFullyBooted(wifi=True, decrypt=False)
-
-  def testWaitUntilFullyBooted_succeedsWithDecryptFDE(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # decryption_completed
-        (self.call.device.GetProp('vold.decrypt', cache=False),
-         'trigger_restart_framework')):
-      self.device.WaitUntilFullyBooted(wifi=False, decrypt=True)
-
-  def testWaitUntilFullyBooted_succeedsWithDecryptNotFDE(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # decryption_completed
-        (self.call.device.GetProp('vold.decrypt', cache=False), '')):
-      self.device.WaitUntilFullyBooted(wifi=False, decrypt=True)
-
-  def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_deviceBrieflyOffline(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False),
-         self.AdbCommandError()),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_sdCardReadyFails_notExists(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_devicePmFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), self.CommandError()),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), self.CommandError()),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_bootFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False, decrypt=False)
-
-  def testWaitUntilFullyBooted_wifiFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=True, decrypt=False)
-
-  def testWaitUntilFullyBooted_decryptFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal(
-            'android', skip_cache=True), ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # decryption_completed
-        (self.call.device.GetProp('vold.decrypt', cache=False),
-         'trigger_restart_min_framework'),
-        # decryption_completed
-        (self.call.device.GetProp('vold.decrypt', cache=False),
-         'trigger_restart_min_framework'),
-        # decryption_completed
-        (self.call.device.GetProp('vold.decrypt', cache=False),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False, decrypt=True)
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsRebootTest(DeviceUtilsTest):
-  def testReboot_nonBlocking(self):
-    with self.assertCalls(self.call.adb.Reboot(),
-                          (self.call.device.IsOnline(), True),
-                          (self.call.device.IsOnline(), False)):
-      self.device.Reboot(block=False)
-
-  def testReboot_blocking(self):
-    with self.assertCalls(
-        (self.call.device.HasRoot(), False),
-        self.call.adb.Reboot(), (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=False, decrypt=False)):
-      self.device.Reboot(block=True)
-
-  def testReboot_blockingWithRoot(self):
-    with self.assertCalls(
-        (self.call.device.HasRoot(), True),
-        self.call.adb.Reboot(), (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=False, decrypt=False),
-        self.call.device.EnableRoot()):
-      self.device.Reboot(block=True)
-
-  def testReboot_blockUntilWifi(self):
-    with self.assertCalls(
-        (self.call.device.HasRoot(), False),
-        self.call.adb.Reboot(), (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=True, decrypt=False)):
-      self.device.Reboot(block=True, wifi=True, decrypt=False)
-
-  def testReboot_blockUntilDecrypt(self):
-    with self.assertCalls(
-        (self.call.device.HasRoot(), False),
-        self.call.adb.Reboot(), (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=False, decrypt=True)):
-      self.device.Reboot(block=True, wifi=False, decrypt=True)
-
-
-class DeviceUtilsInstallTest(DeviceUtilsTest):
-
-  mock_apk = _MockApkHelper(TEST_APK_PATH, TEST_PACKAGE, ['p1'])
-
-  def testInstall_noPriorInstall(self):
-    with self.patch_call(
-        self.call.device.product_name,
-        return_value='notflounder'), (self.patch_call(
-            self.call.device.build_version_sdk, return_value=23)):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=False,
-                                streaming=None,
-                                allow_downgrade=False),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True),
-          (self.call.device.GrantPermissions(TEST_PACKAGE, ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_noStreaming(self):
-    with self.patch_call(
-        self.call.device.product_name,
-        return_value='flounder'), (self.patch_call(
-            self.call.device.build_version_sdk, return_value=23)):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=False,
-                                streaming=False,
-                                allow_downgrade=False),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True),
-          (self.call.device.GrantPermissions(TEST_PACKAGE, ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_permissionsPreM(self):
-    with self.patch_call(
-        self.call.device.product_name,
-        return_value='notflounder'), (self.patch_call(
-            self.call.device.build_version_sdk, return_value=20)):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          (self.call.adb.Install(TEST_APK_PATH,
-                                 reinstall=False,
-                                 streaming=None,
-                                 allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_findPermissions(self):
-    with self.patch_call(
-        self.call.device.product_name,
-        return_value='notflounder'), (self.patch_call(
-            self.call.device.build_version_sdk, return_value=23)):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          (self.call.adb.Install(TEST_APK_PATH,
-                                 reinstall=False,
-                                 streaming=None,
-                                 allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True),
-          (self.call.device.GrantPermissions(TEST_PACKAGE, ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_passPermissions(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          (self.call.adb.Install(TEST_APK_PATH,
-                                 reinstall=False,
-                                 streaming=None,
-                                 allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True),
-          (self.call.device.GrantPermissions(TEST_PACKAGE, ['p1', 'p2']), [])):
-        self.device.Install(
-            DeviceUtilsInstallTest.mock_apk,
-            retries=0,
-            permissions=['p1', 'p2'])
-
-  def testInstall_identicalPriorInstall(self):
-    with self.assertCalls(
-        (self.call.device._FakeInstall(set(), None, 'test.package')),
-        (mock.call.os.path.exists(TEST_APK_PATH), True),
-        (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks(TEST_PACKAGE, [TEST_APK_PATH]),
-         ([], None)), (self.call.device.ForceStop(TEST_PACKAGE)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-      self.device.Install(
-          DeviceUtilsInstallTest.mock_apk, retries=0, permissions=[])
-
-  def testInstall_differentPriorInstall(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-           ['/fake/data/app/test.package.apk']),
-          (self.call.device._ComputeStaleApks(TEST_PACKAGE, [TEST_APK_PATH]),
-           ([TEST_APK_PATH], None)), self.call.device.Uninstall(TEST_PACKAGE),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=False,
-                                streaming=None,
-                                allow_downgrade=False),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.Install(
-            DeviceUtilsInstallTest.mock_apk, retries=0, permissions=[])
-
-  def testInstall_differentPriorInstallSplitApk(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), [
-              '/fake/data/app/test.package.apk',
-              '/fake/data/app/test.package2.apk'
-          ]), self.call.device.Uninstall(TEST_PACKAGE),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=False,
-                                streaming=None,
-                                allow_downgrade=False),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.Install(
-            DeviceUtilsInstallTest.mock_apk, retries=0, permissions=[])
-
-  def testInstall_differentPriorInstall_reinstall(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-           ['/fake/data/app/test.package.apk']),
-          (self.call.device._ComputeStaleApks(TEST_PACKAGE, [TEST_APK_PATH]),
-           ([TEST_APK_PATH], None)),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=True,
-                                streaming=None,
-                                allow_downgrade=False),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.Install(
-            DeviceUtilsInstallTest.mock_apk,
-            reinstall=True,
-            retries=0,
-            permissions=[])
-
-  def testInstall_identicalPriorInstall_reinstall(self):
-    with self.assertCalls(
-        (self.call.device._FakeInstall(set(), None, 'test.package')),
-        (mock.call.os.path.exists(TEST_APK_PATH), True),
-        (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks(TEST_PACKAGE, [TEST_APK_PATH]),
-         ([], None)), (self.call.device.ForceStop(TEST_PACKAGE)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-      self.device.Install(
-          DeviceUtilsInstallTest.mock_apk,
-          reinstall=True,
-          retries=0,
-          permissions=[])
-
-  def testInstall_missingApk(self):
-    with self.assertCalls(
-        (self.call.device._FakeInstall(set(), None, 'test.package')),
-        (mock.call.os.path.exists(TEST_APK_PATH), False)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_fails(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          (self.call.adb.Install(
-              TEST_APK_PATH,
-              reinstall=False,
-              streaming=None,
-              allow_downgrade=False), self.CommandError('Failure\r\n'))):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_downgrade(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-           ['/fake/data/app/test.package.apk']),
-          (self.call.device._ComputeStaleApks(TEST_PACKAGE, [TEST_APK_PATH]),
-           ([TEST_APK_PATH], None)),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=True,
-                                streaming=None,
-                                allow_downgrade=True),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.Install(
-            DeviceUtilsInstallTest.mock_apk,
-            reinstall=True,
-            retries=0,
-            permissions=[],
-            allow_downgrade=True)
-
-  def testInstall_pushesFakeModulesToDevice(self):
-    @contextlib.contextmanager
-    def mock_zip_temp_dir():
-      yield '/test/tmp/dir'
-
-    mock_apk_with_fake = _MockApkHelper(
-        TEST_APK_PATH, TEST_PACKAGE, splits=['fake1-master.apk'])
-    fake_modules = ['fake1']
-    with self.patch_call(
-        self.call.device.product_name,
-        return_value='notflounder'), (self.patch_call(
-            self.call.device.build_version_sdk, return_value=23)):
-      with self.assertCalls(
-          (mock.call.py_utils.tempfile_ext.NamedTemporaryDirectory(),
-           mock_zip_temp_dir),
-          (mock.call.os.rename('fake1-master.apk', '/test/tmp/dir/fake1.apk')),
-          (self.call.device.PushChangedFiles(
-              [('/test/tmp/dir', '/data/local/tmp/modules/test.package')],
-              delete_device_stale=True)),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=False,
-                                streaming=None,
-                                allow_downgrade=False),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True),
-          (self.call.device.GrantPermissions(TEST_PACKAGE, None), [])):
-        self.device.Install(
-            mock_apk_with_fake, fake_modules=fake_modules, retries=0)
-
-  def testInstall_packageNotAvailableAfterInstall(self):
-    with self.patch_call(
-        self.call.device.product_name,
-        return_value='notflounder'), (self.patch_call(
-            self.call.device.build_version_sdk, return_value=23)), (
-                self.patch_call(self.call.device.IsApplicationInstalled,
-                                return_value=False)):
-      with self.assertCalls(
-          (self.call.device._FakeInstall(set(), None, 'test.package')),
-          (mock.call.os.path.exists(TEST_APK_PATH), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          self.call.adb.Install(TEST_APK_PATH,
-                                reinstall=False,
-                                streaming=None,
-                                allow_downgrade=False)):
-        with self.assertRaisesRegexp(
-            device_errors.CommandFailedError,
-            'not installed on device after explicit install attempt'):
-          self.device.Install(
-              DeviceUtilsInstallTest.mock_apk, retries=0)
-
-
-class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest):
-
-  mock_apk = _MockApkHelper('base.apk', TEST_PACKAGE, ['p1'],
-                            ['split1.apk', 'split2.apk'])
-
-  def testInstallSplitApk_noPriorInstall(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (mock.call.devil.android.apk_helper.ToSplitHelper(
-              'base.apk', ['split1.apk', 'split2.apk']),
-           DeviceUtilsInstallSplitApkTest.mock_apk),
-          (self.call.device._CheckSdkLevel(21)),
-          (mock.call.os.path.exists('base.apk'), True),
-          (mock.call.os.path.exists('split1.apk'), True),
-          (mock.call.os.path.exists('split2.apk'), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          (self.call.adb.InstallMultiple(
-              ['base.apk', 'split1.apk', 'split2.apk'],
-              partial=None,
-              reinstall=False,
-              streaming=None,
-              allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.InstallSplitApk(
-            'base.apk', ['split1.apk', 'split2.apk'], permissions=[], retries=0)
-
-  def testInstallSplitApk_noStreaming(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='flounder'):
-      with self.assertCalls(
-          (mock.call.devil.android.apk_helper.ToSplitHelper(
-              'base.apk', ['split1.apk', 'split2.apk']),
-           DeviceUtilsInstallSplitApkTest.mock_apk),
-          (self.call.device._CheckSdkLevel(21)),
-          (mock.call.os.path.exists('base.apk'), True),
-          (mock.call.os.path.exists('split1.apk'), True),
-          (mock.call.os.path.exists('split2.apk'), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), []),
-          (self.call.adb.InstallMultiple(
-              ['base.apk', 'split1.apk', 'split2.apk'],
-              partial=None,
-              reinstall=False,
-              streaming=False,
-              allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.InstallSplitApk(
-            'base.apk', ['split1.apk', 'split2.apk'], permissions=[], retries=0)
-
-  def testInstallSplitApk_partialInstall(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (mock.call.devil.android.apk_helper.ToSplitHelper(
-              DeviceUtilsInstallSplitApkTest.mock_apk,
-              ['split1.apk', 'split2.apk']),
-           DeviceUtilsInstallSplitApkTest.mock_apk),
-          (self.call.device._CheckSdkLevel(21)),
-          (mock.call.os.path.exists('base.apk'), True),
-          (mock.call.os.path.exists('split1.apk'), True),
-          (mock.call.os.path.exists('split2.apk'), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-           ['base-on-device.apk', 'split2-on-device.apk']),
-          (self.call.device._ComputeStaleApks(
-              TEST_PACKAGE, ['base.apk', 'split1.apk', 'split2.apk']),
-           (['split2.apk'], None)),
-          (self.call.adb.InstallMultiple(['split2.apk'],
-                                         partial=TEST_PACKAGE,
-                                         reinstall=True,
-                                         streaming=None,
-                                         allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.InstallSplitApk(
-            DeviceUtilsInstallSplitApkTest.mock_apk,
-            ['split1.apk', 'split2.apk'],
-            reinstall=True,
-            permissions=[],
-            retries=0)
-
-  def testInstallSplitApk_downgrade(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (mock.call.devil.android.apk_helper.ToSplitHelper(
-              DeviceUtilsInstallSplitApkTest.mock_apk,
-              ['split1.apk', 'split2.apk']),
-           DeviceUtilsInstallSplitApkTest.mock_apk),
-          (self.call.device._CheckSdkLevel(21)),
-          (mock.call.os.path.exists('base.apk'), True),
-          (mock.call.os.path.exists('split1.apk'), True),
-          (mock.call.os.path.exists('split2.apk'), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-           ['base-on-device.apk', 'split2-on-device.apk']),
-          (self.call.device._ComputeStaleApks(
-              TEST_PACKAGE, ['base.apk', 'split1.apk', 'split2.apk']),
-           (['split2.apk'], None)),
-          (self.call.adb.InstallMultiple(['split2.apk'],
-                                         partial=TEST_PACKAGE,
-                                         reinstall=True,
-                                         streaming=None,
-                                         allow_downgrade=True)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.InstallSplitApk(
-            DeviceUtilsInstallSplitApkTest.mock_apk,
-            ['split1.apk', 'split2.apk'],
-            reinstall=True,
-            permissions=[],
-            retries=0,
-            allow_downgrade=True)
-
-  def testInstallSplitApk_missingSplit(self):
-    with self.assertCalls(
-        (mock.call.devil.android.apk_helper.ToSplitHelper(
-            DeviceUtilsInstallSplitApkTest.mock_apk,
-            ['split1.apk', 'split2.apk']),
-          DeviceUtilsInstallSplitApkTest.mock_apk),
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split1.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), False)),\
-        self.assertRaises(device_errors.CommandFailedError):
-      self.device.InstallSplitApk(
-          DeviceUtilsInstallSplitApkTest.mock_apk, ['split1.apk', 'split2.apk'],
-          permissions=[],
-          retries=0)
-
-  def testInstallSplitApk_previouslyNonSplit(self):
-    with self.patch_call(
-        self.call.device.product_name, return_value='notflounder'):
-      with self.assertCalls(
-          (mock.call.devil.android.apk_helper.ToSplitHelper(
-              DeviceUtilsInstallSplitApkTest.mock_apk,
-              ['split1.apk', 'split2.apk']),
-           DeviceUtilsInstallSplitApkTest.mock_apk),
-          (self.call.device._CheckSdkLevel(21)),
-          (mock.call.os.path.exists('base.apk'), True),
-          (mock.call.os.path.exists('split1.apk'), True),
-          (mock.call.os.path.exists('split2.apk'), True),
-          (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-           ['/fake/data/app/test.package.apk']),
-          self.call.device.Uninstall(TEST_PACKAGE),
-          (self.call.adb.InstallMultiple(
-              ['base.apk', 'split1.apk', 'split2.apk'],
-              partial=None,
-              reinstall=False,
-              streaming=None,
-              allow_downgrade=False)),
-          (self.call.device.IsApplicationInstalled(TEST_PACKAGE, None), True)):
-        self.device.InstallSplitApk(
-            DeviceUtilsInstallSplitApkTest.mock_apk,
-            ['split1.apk', 'split2.apk'],
-            permissions=[],
-            retries=0)
-
-
-class DeviceUtilsUninstallTest(DeviceUtilsTest):
-  def testUninstall_callsThrough(self):
-    with self.assertCalls(
-        (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE),
-         ['/path.apk']), self.call.adb.Uninstall(TEST_PACKAGE, True)):
-      self.device.Uninstall(TEST_PACKAGE, True)
-
-  def testUninstall_noop(self):
-    with self.assertCalls(
-        (self.call.device._GetApplicationPathsInternal(TEST_PACKAGE), [])):
-      self.device.Uninstall(TEST_PACKAGE, True)
-
-
-class DeviceUtilsSuTest(DeviceUtilsTest):
-  def testSu_preM(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP_MR1):
-      self.assertEquals('su -c foo', self.device._Su('foo'))
-
-  def testSu_mAndAbove(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.MARSHMALLOW):
-      self.assertEquals('su 0 foo', self.device._Su('foo'))
-
-
-class DeviceUtilsRunShellCommandTest(DeviceUtilsTest):
-  def setUp(self):
-    super(DeviceUtilsRunShellCommandTest, self).setUp()
-    self.device.NeedsSU = mock.Mock(return_value=False)
-
-  def testRunShellCommand_commandAsList(self):
-    with self.assertCall(self.call.adb.Shell('pm list packages'), ''):
-      self.device.RunShellCommand(['pm', 'list', 'packages'], check_return=True)
-
-  def testRunShellCommand_commandAsListQuoted(self):
-    with self.assertCall(self.call.adb.Shell("echo 'hello world' '$10'"), ''):
-      self.device.RunShellCommand(['echo', 'hello world', '$10'],
-                                  check_return=True)
-
-  def testRunShellCommand_commandAsString(self):
-    with self.assertCall(self.call.adb.Shell('echo "$VAR"'), ''):
-      self.device.RunShellCommand('echo "$VAR"', shell=True, check_return=True)
-
-  def testNewRunShellImpl_withEnv(self):
-    with self.assertCall(
-        self.call.adb.Shell('VAR=some_string echo "$VAR"'), ''):
-      self.device.RunShellCommand(
-          'echo "$VAR"',
-          shell=True,
-          check_return=True,
-          env={'VAR': 'some_string'})
-
-  def testNewRunShellImpl_withEnvQuoted(self):
-    with self.assertCall(
-        self.call.adb.Shell('PATH="$PATH:/other/path" run_this'), ''):
-      self.device.RunShellCommand(['run_this'],
-                                  check_return=True,
-                                  env={'PATH': '$PATH:/other/path'})
-
-  def testNewRunShellImpl_withEnv_failure(self):
-    with self.assertRaises(KeyError):
-      self.device.RunShellCommand(['some_cmd'],
-                                  check_return=True,
-                                  env={'INVALID NAME': 'value'})
-
-  def testNewRunShellImpl_withCwd(self):
-    with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''):
-      self.device.RunShellCommand(['ls'],
-                                  check_return=True,
-                                  cwd='/some/test/path')
-
-  def testNewRunShellImpl_withCwdQuoted(self):
-    with self.assertCall(
-        self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''):
-      self.device.RunShellCommand(['ls'],
-                                  check_return=True,
-                                  cwd='/some test/path with/spaces')
-
-  def testRunShellCommand_withHugeCmd(self):
-    payload = 'hi! ' * 1024
-    expected_cmd = "echo '%s'" % payload
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-        self.call.device._WriteFileWithPush('/sdcard/temp-123.sh',
-                                            expected_cmd),
-        (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
-      self.assertEquals([payload],
-                        self.device.RunShellCommand(['echo', payload],
-                                                    check_return=True))
-
-  def testRunShellCommand_withHugeCmdAndSu(self):
-    payload = 'hi! ' * 1024
-    expected_cmd_without_su = """sh -c 'echo '"'"'%s'"'"''""" % payload
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-        self.call.device._WriteFileWithPush('/sdcard/temp-123.sh',
-                                            expected_cmd),
-        (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
-      self.assertEquals([payload],
-                        self.device.RunShellCommand(['echo', payload],
-                                                    check_return=True,
-                                                    as_root=True))
-
-  def testRunShellCommand_withSu(self):
-    expected_cmd_without_su = "sh -c 'setprop service.adb.root 0'"
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.RunShellCommand(['setprop', 'service.adb.root', '0'],
-                                  check_return=True,
-                                  as_root=True)
-
-  def testRunShellCommand_withRunAs(self):
-    expected_cmd_without_run_as = "sh -c 'mkdir -p files'"
-    expected_cmd = (
-        'run-as org.devil.test_package %s' % expected_cmd_without_run_as)
-    with self.assertCall(self.call.adb.Shell(expected_cmd), ''):
-      self.device.RunShellCommand(['mkdir', '-p', 'files'],
-                                  check_return=True,
-                                  run_as='org.devil.test_package')
-
-  def testRunShellCommand_withRunAsAndSu(self):
-    expected_cmd_with_nothing = "sh -c 'mkdir -p files'"
-    expected_cmd_with_run_as = (
-        'run-as org.devil.test_package %s' % expected_cmd_with_nothing)
-    expected_cmd_without_su = (
-        'sh -c %s' % cmd_helper.SingleQuote(expected_cmd_with_run_as))
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.RunShellCommand(['mkdir', '-p', 'files'],
-                                  check_return=True,
-                                  run_as='org.devil.test_package',
-                                  as_root=True)
-
-  def testRunShellCommand_manyLines(self):
-    cmd = 'ls /some/path'
-    with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'):
-      self.assertEquals(['file1', 'file2', 'file3'],
-                        self.device.RunShellCommand(
-                            cmd.split(), check_return=True))
-
-  def testRunShellCommand_manyLinesRawOutput(self):
-    cmd = 'ls /some/path'
-    with self.assertCall(self.call.adb.Shell(cmd), '\rfile1\nfile2\r\nfile3\n'):
-      self.assertEquals(
-          '\rfile1\nfile2\r\nfile3\n',
-          self.device.RunShellCommand(
-              cmd.split(), check_return=True, raw_output=True))
-
-  def testRunShellCommand_singleLine_success(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), 'some value\n'):
-      self.assertEquals(
-          'some value',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successEmptyLine(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), '\n'):
-      self.assertEquals(
-          '',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successWithoutEndLine(self):
-    cmd = 'echo -n $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), 'some value'):
-      self.assertEquals(
-          'some value',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successNoOutput(self):
-    cmd = 'echo -n $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), ''):
-      self.assertEquals(
-          '',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_failTooManyLines(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(
-        self.call.adb.Shell(cmd), 'some value\nanother value\n'):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.RunShellCommand(
-            cmd, shell=True, check_return=True, single_line=True)
-
-  def testRunShellCommand_checkReturn_success(self):
-    cmd = 'echo $ANDROID_DATA'
-    output = '/data\n'
-    with self.assertCall(self.call.adb.Shell(cmd), output):
-      self.assertEquals([output.rstrip()],
-                        self.device.RunShellCommand(
-                            cmd, shell=True, check_return=True))
-
-  def testRunShellCommand_checkReturn_failure(self):
-    cmd = 'ls /root'
-    output = 'opendir failed, Permission denied\n'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.RunShellCommand(cmd.split(), check_return=True)
-
-  def testRunShellCommand_checkReturn_disabled(self):
-    cmd = 'ls /root'
-    output = 'opendir failed, Permission denied\n'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
-      self.assertEquals([output.rstrip()],
-                        self.device.RunShellCommand(
-                            cmd.split(), check_return=False))
-
-  def testRunShellCommand_largeOutput_enabled(self):
-    cmd = 'echo $VALUE'
-    temp_file = MockTempFile('/sdcard/temp-123')
-    cmd_redirect = '( %s )>%s 2>&1' % (cmd, temp_file.name)
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         temp_file),
-        (self.call.adb.Shell(cmd_redirect)), (self.call.device.ReadFile(
-            temp_file.name, force_pull=True), 'something')):
-      self.assertEquals(['something'],
-                        self.device.RunShellCommand(
-                            cmd,
-                            shell=True,
-                            large_output=True,
-                            check_return=True))
-
-  def testRunShellCommand_largeOutput_disabledNoTrigger(self):
-    cmd = 'something'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError('')):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.RunShellCommand([cmd], check_return=True)
-
-  def testRunShellCommand_largeOutput_disabledTrigger(self):
-    cmd = 'echo $VALUE'
-    temp_file = MockTempFile('/sdcard/temp-123')
-    cmd_redirect = '( %s )>%s 2>&1' % (cmd, temp_file.name)
-    with self.assertCalls(
-        (self.call.adb.Shell(cmd), self.ShellError('', None)),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         temp_file), (self.call.adb.Shell(cmd_redirect)),
-        (self.call.device.ReadFile(mock.ANY, force_pull=True), 'something')):
-      self.assertEquals(['something'],
-                        self.device.RunShellCommand(
-                            cmd, shell=True, check_return=True))
-
-
-class DeviceUtilsRunPipedShellCommandTest(DeviceUtilsTest):
-  def testRunPipedShellCommand_success(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True,
-            check_return=True), ['This line contains foo', 'PIPESTATUS: 0 0']):
-      self.assertEquals(['This line contains foo'],
-                        self.device._RunPipedShellCommand('ps | grep foo'))
-
-  def testRunPipedShellCommand_firstCommandFails(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True,
-            check_return=True), ['PIPESTATUS: 1 0']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertEquals([1, 0], ec.exception.status)
-
-  def testRunPipedShellCommand_secondCommandFails(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True,
-            check_return=True), ['PIPESTATUS: 0 1']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertEquals([0, 1], ec.exception.status)
-
-  def testRunPipedShellCommand_outputCutOff(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True,
-            check_return=True), ['foo.bar'] * 256 + ['foo.ba']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertIs(None, ec.exception.status)
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsKillAllTest(DeviceUtilsTest):
-  def testKillAll_noMatchingProcessesFailure(self):
-    with self.assertCall(self.call.device.ListProcesses('test_process'), []):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.KillAll('test_process')
-
-  def testKillAll_noMatchingProcessesQuiet(self):
-    with self.assertCall(self.call.device.ListProcesses('test_process'), []):
-      self.assertEqual(0, self.device.KillAll('test_process', quiet=True))
-
-  def testKillAll_nonblocking(self):
-    with self.assertCalls((self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process', 1234),
-                                     ('some.process.thing', 5678))),
-                          (self.call.adb.Shell('kill -9 1234 5678'), '')):
-      self.assertEquals(2, self.device.KillAll('some.process', blocking=False))
-
-  def testKillAll_blocking(self):
-    with self.assertCalls(
-        (self.call.device.ListProcesses('some.process'),
-         Processes(('some.process', 1234), ('some.process.thing', 5678))),
-        (self.call.adb.Shell('kill -9 1234 5678'), ''),
-        (self.call.device.ListProcesses('some.process'),
-         Processes(('some.process.thing', 5678))),
-        (
-            self.call.device.ListProcesses('some.process'),
-            # Other instance with different pid.
-            Processes(('some.process', 111)))):
-      self.assertEquals(2, self.device.KillAll('some.process', blocking=True))
-
-  def testKillAll_exactNonblocking(self):
-    with self.assertCalls((self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process', 1234),
-                                     ('some.process.thing', 5678))),
-                          (self.call.adb.Shell('kill -9 1234'), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', exact=True, blocking=False))
-
-  def testKillAll_exactBlocking(self):
-    with self.assertCalls((self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process', 1234),
-                                     ('some.process.thing', 5678))),
-                          (self.call.adb.Shell('kill -9 1234'), ''),
-                          (self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process', 1234),
-                                     ('some.process.thing', 5678))),
-                          (self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process.thing', 5678)))):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', exact=True, blocking=True))
-
-  def testKillAll_root(self):
-    with self.assertCalls(
-        (self.call.device.ListProcesses('some.process'),
-         Processes(('some.process', 1234))), (self.call.device.NeedsSU(), True),
-        (self.call.device._Su("sh -c 'kill -9 1234'"),
-         "su -c sh -c 'kill -9 1234'"),
-        (self.call.adb.Shell("su -c sh -c 'kill -9 1234'"), '')):
-      self.assertEquals(1, self.device.KillAll('some.process', as_root=True))
-
-  def testKillAll_sigterm(self):
-    with self.assertCalls((self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process', 1234))),
-                          (self.call.adb.Shell('kill -15 1234'), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
-
-  def testKillAll_multipleInstances(self):
-    with self.assertCalls((self.call.device.ListProcesses('some.process'),
-                           Processes(('some.process', 1234),
-                                     ('some.process', 4567))),
-                          (self.call.adb.Shell('kill -15 1234 4567'), '')):
-      self.assertEquals(
-          2, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
-
-
-class DeviceUtilsStartActivityTest(DeviceUtilsTest):
-  def testStartActivity_actionOnly(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_success(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_failure(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Error: Failed to start test activity'):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.StartActivity(test_intent)
-
-  def testStartActivity_blocking(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-W '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent, blocking=True)
-
-  def testStartActivity_withCategory(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        category='android.intent.category.HOME')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-c android.intent.category.HOME '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withMultipleCategories(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        category=[
-            'android.intent.category.HOME', 'android.intent.category.BROWSABLE'
-        ])
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-c android.intent.category.HOME '
-                            '-c android.intent.category.BROWSABLE '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withData(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        data='http://www.google.com/')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-d http://www.google.com/ '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withStringExtra(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        extras={'foo': 'test'})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--es foo test'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withBoolExtra(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        extras={'foo': True})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--ez foo True'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withIntExtra(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        extras={'foo': 123})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--ei foo 123'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withTraceFile(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '--start-profiler test_trace_file.out '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(
-          test_intent, trace_file_name='test_trace_file.out')
-
-  def testStartActivity_withForceStop(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-S '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent, force_stop=True)
-
-  def testStartActivity_withFlags(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.VIEW',
-        package=TEST_PACKAGE,
-        activity='.Main',
-        flags=[
-            intent.FLAG_ACTIVITY_NEW_TASK,
-            intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
-        ])
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '-f 0x10200000'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-
-class DeviceUtilsStartServiceTest(DeviceUtilsTest):
-  def testStartService_success(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.START',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.NOUGAT):
-      with self.assertCall(
-          self.call.adb.Shell('am startservice '
-                              '-a android.intent.action.START '
-                              '-n test.package/.Main'),
-          'Starting service: Intent { act=android.intent.action.START }'):
-        self.device.StartService(test_intent)
-
-  def testStartService_failure(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.START',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.NOUGAT):
-      with self.assertCall(
-          self.call.adb.Shell('am startservice '
-                              '-a android.intent.action.START '
-                              '-n test.package/.Main'),
-          'Error: Failed to start test service'):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.StartService(test_intent)
-
-  def testStartService_withUser(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.START',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.NOUGAT):
-      with self.assertCall(
-          self.call.adb.Shell('am startservice '
-                              '--user TestUser '
-                              '-a android.intent.action.START '
-                              '-n test.package/.Main'),
-          'Starting service: Intent { act=android.intent.action.START }'):
-        self.device.StartService(test_intent, user_id='TestUser')
-
-  def testStartService_onOreo(self):
-    test_intent = intent.Intent(
-        action='android.intent.action.START',
-        package=TEST_PACKAGE,
-        activity='.Main')
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.OREO):
-      with self.assertCall(
-          self.call.adb.Shell('am start-service '
-                              '-a android.intent.action.START '
-                              '-n test.package/.Main'),
-          'Starting service: Intent { act=android.intent.action.START }'):
-        self.device.StartService(test_intent)
-
-
-class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest):
-  def testStartInstrumentation_nothing(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument "$p"/.TestInstrumentation',
-            shell=True,
-            check_return=True,
-            large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False,
-          raw=False,
-          extras=None)
-
-  def testStartInstrumentation_finish(self):
-    with self.assertCalls((self.call.device.RunShellCommand(
-        'p=test.package;am instrument -w "$p"/.TestInstrumentation',
-        shell=True,
-        check_return=True,
-        large_output=True), ['OK (1 test)'])):
-      output = self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=True,
-          raw=False,
-          extras=None)
-      self.assertEquals(['OK (1 test)'], output)
-
-  def testStartInstrumentation_raw(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument -r "$p"/.TestInstrumentation',
-            shell=True,
-            check_return=True,
-            large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False,
-          raw=True,
-          extras=None)
-
-  def testStartInstrumentation_extras(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument -e "$p".foo Foo -e bar \'Val \'"$p" '
-            '"$p"/.TestInstrumentation',
-            shell=True,
-            check_return=True,
-            large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False,
-          raw=False,
-          extras={
-              'test.package.foo': 'Foo',
-              'bar': 'Val test.package'
-          })
-
-
-class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest):
-  def testBroadcastIntent_noExtras(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT')
-    with self.assertCall(
-        self.call.adb.Shell('am broadcast -a test.package.with.an.INTENT'),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-  def testBroadcastIntent_withExtra(self):
-    test_intent = intent.Intent(
-        action='test.package.with.an.INTENT', extras={'foo': 'bar value'})
-    with self.assertCall(
-        self.call.adb.Shell(
-            "am broadcast -a test.package.with.an.INTENT --es foo 'bar value'"),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-  def testBroadcastIntent_withExtra_noValue(self):
-    test_intent = intent.Intent(
-        action='test.package.with.an.INTENT', extras={'foo': None})
-    with self.assertCall(
-        self.call.adb.Shell(
-            'am broadcast -a test.package.with.an.INTENT --esn foo'),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-
-class DeviceUtilsGoHomeTest(DeviceUtilsTest):
-  def testGoHome_popupsExist(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), []),
-        (self.call.device.RunShellCommand([
-            'am', 'start', '-W', '-a', 'android.intent.action.MAIN', '-c',
-            'android.intent.category.HOME'
-        ],
-                                          check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'
-         ''),
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), []),
-        (self.call.device.RunShellCommand(['input', 'keyevent', '66'],
-                                          check_return=True)),
-        (self.call.device.RunShellCommand(['input', 'keyevent', '4'],
-                                          check_return=True)),
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True),
-         ['mCurrentFocus Launcher'])):
-      self.device.GoHome()
-
-  def testGoHome_willRetry(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), []),
-        (self.call.device.RunShellCommand([
-            'am', 'start', '-W', '-a', 'android.intent.action.MAIN', '-c',
-            'android.intent.category.HOME'
-        ],
-                                          check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'
-         ''),
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'],
-            check_return=True,
-        )), (self.call.device.RunShellCommand(['input', 'keyevent', '4'],
-                                              check_return=True)),
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), []),
-        (self.call.device.RunShellCommand(['input', 'keyevent', '66'],
-                                          check_return=True)),
-        (self.call.device.RunShellCommand(['input', 'keyevent', '4'],
-                                          check_return=True)),
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.GoHome()
-
-  def testGoHome_alreadyFocused(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                         check_return=True,
-                                         large_output=True),
-        ['mCurrentFocus Launcher']):
-      self.device.GoHome()
-
-  def testGoHome_alreadyFocusedAlternateCase(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                         check_return=True,
-                                         large_output=True),
-        [' mCurrentFocus .launcher/.']):
-      self.device.GoHome()
-
-  def testGoHome_obtainsFocusAfterGoingHome(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), []),
-        (self.call.device.RunShellCommand([
-            'am', 'start', '-W', '-a', 'android.intent.action.MAIN', '-c',
-            'android.intent.category.HOME'
-        ],
-                                          check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'
-         ''), (self.call.device.RunShellCommand(
-             ['dumpsys', 'window', 'windows'],
-             check_return=True,
-             large_output=True), ['mCurrentFocus Launcher'])):
-      self.device.GoHome()
-
-
-class DeviceUtilsForceStopTest(DeviceUtilsTest):
-  def testForceStop(self):
-    with self.assertCalls(
-        (self.call.device.GetApplicationPids(TEST_PACKAGE), [1111]),
-        (self.call.device.RunShellCommand(['am', 'force-stop', TEST_PACKAGE],
-                                          check_return=True), ['Success'])):
-      self.device.ForceStop(TEST_PACKAGE)
-
-  def testForceStop_NoProcessFound(self):
-    with self.assertCall(self.call.device.GetApplicationPids(TEST_PACKAGE), []):
-      self.device.ForceStop(TEST_PACKAGE)
-
-
-class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest):
-  def testClearApplicationState_setPermissions(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
-        (self.call.device._GetApplicationPathsInternal('this.package.exists'),
-         ['/data/app/this.package.exists.apk']),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'], check_return=True),
-         ['Success']),
-        (self.call.device.GrantPermissions('this.package.exists', ['p1']), [])):
-      self.device.ClearApplicationState(
-          'this.package.exists', permissions=['p1'])
-
-  def testClearApplicationState_packageDoesntExist(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '11'),
-        (self.call.device._GetApplicationPathsInternal('does.not.exist'), [])):
-      self.device.ClearApplicationState('does.not.exist')
-
-  def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.does.not.exist'], check_return=True),
-         ['Failed'])):
-      self.device.ClearApplicationState('this.package.does.not.exist')
-
-  def testClearApplicationState_packageExists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
-        (self.call.device._GetApplicationPathsInternal('this.package.exists'),
-         ['/data/app/this.package.exists.apk']),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'], check_return=True),
-         ['Success'])):
-      self.device.ClearApplicationState('this.package.exists')
-
-  def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'], check_return=True),
-         ['Success'])):
-      self.device.ClearApplicationState('this.package.exists')
-
-
-class DeviceUtilsSendKeyEventTest(DeviceUtilsTest):
-  def testSendKeyEvent(self):
-    with self.assertCall(self.call.adb.Shell('input keyevent 66'), ''):
-      self.device.SendKeyEvent(66)
-
-
-class DeviceUtilsPushChangedFilesIndividuallyTest(DeviceUtilsTest):
-  def testPushChangedFilesIndividually_empty(self):
-    test_files = []
-    with self.assertCalls():
-      self.device._PushChangedFilesIndividually(test_files)
-
-  def testPushChangedFilesIndividually_single(self):
-    test_files = [('/test/host/path', '/test/device/path')]
-    with self.assertCalls(self.call.adb.Push(*test_files[0])):
-      self.device._PushChangedFilesIndividually(test_files)
-
-  def testPushChangedFilesIndividually_multiple(self):
-    test_files = [('/test/host/path/file1', '/test/device/path/file1'),
-                  ('/test/host/path/file2', '/test/device/path/file2')]
-    with self.assertCalls(
-        self.call.adb.Push(*test_files[0]), self.call.adb.Push(*test_files[1])):
-      self.device._PushChangedFilesIndividually(test_files)
-
-
-class DeviceUtilsPushChangedFilesZippedTest(DeviceUtilsTest):
-  def testPushChangedFilesZipped_noUnzipCommand(self):
-    test_files = [('/test/host/path/file1', '/test/device/path/file1')]
-    with self.assertCalls((self.call.device._MaybeInstallCommands(), False)):
-      self.assertFalse(
-          self.device._PushChangedFilesZipped(test_files, ['/test/dir']))
-
-  def _testPushChangedFilesZipped_spec(self, test_files, test_dirs):
-    @contextlib.contextmanager
-    def mock_zip_temp_dir():
-      yield '/test/temp/dir'
-
-    expected_cmd = ''.join([
-        '\n  /data/local/tmp/bin/unzip %s &&',
-        ' (for dir in %s\n  do\n    chmod -R 777 "$dir" || exit 1\n',
-        '  done)\n'
-    ]) % ('/sdcard/foo123.zip', ' '.join(test_dirs))
-    with self.assertCalls(
-        (self.call.device._MaybeInstallCommands(), True),
-        (mock.call.py_utils.tempfile_ext.NamedTemporaryDirectory(),
-         mock_zip_temp_dir), (mock.call.devil.utils.zip_utils.WriteZipFile(
-             '/test/temp/dir/tmp.zip', test_files)),
-        (mock.call.os.path.getsize('/test/temp/dir/tmp.zip'), 123),
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.zip'), MockTempFile('/sdcard/foo123.zip')),
-        self.call.adb.Push('/test/temp/dir/tmp.zip', '/sdcard/foo123.zip'),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-        self.call.device.WriteFile('/sdcard/temp-123.sh', expected_cmd),
-        (self.call.device.RunShellCommand(['source', '/sdcard/temp-123.sh'],
-                                          check_return=True,
-                                          as_root=True))):
-      self.assertTrue(
-          self.device._PushChangedFilesZipped(test_files, test_dirs))
-
-  def testPushChangedFilesZipped_single(self):
-    self._testPushChangedFilesZipped_spec(
-        [('/test/host/path/file1', '/test/device/path/file1')],
-        ['/test/dir1'])
-
-  def testPushChangedFilesZipped_multiple(self):
-    self._testPushChangedFilesZipped_spec(
-        [('/test/host/path/file1', '/test/device/path/file1'),
-         ('/test/host/path/file2', '/test/device/path/file2')],
-        ['/test/dir1', '/test/dir2'])
-
-
-class DeviceUtilsPathExistsTest(DeviceUtilsTest):
-  def testPathExists_pathExists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['test', '-e', '/path/file exists'],
-                                         as_root=False,
-                                         check_return=True,
-                                         timeout=10,
-                                         retries=0), []):
-      self.assertTrue(self.device.PathExists('/path/file exists'))
-
-  def testPathExists_multiplePathExists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path 1', '-a', '-e', '/path2'],
-            as_root=False,
-            check_return=True,
-            timeout=10,
-            retries=0), []):
-      self.assertTrue(self.device.PathExists(('/path 1', '/path2')))
-
-  def testPathExists_pathDoesntExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file.not.exists'],
-            as_root=False,
-            check_return=True,
-            timeout=10,
-            retries=0), self.ShellError()):
-      self.assertFalse(self.device.PathExists('/path/file.not.exists'))
-
-  def testPathExists_asRoot(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['test', '-e', '/root/path/exists'],
-                                         as_root=True,
-                                         check_return=True,
-                                         timeout=10,
-                                         retries=0), self.ShellError()):
-      self.assertFalse(
-          self.device.PathExists('/root/path/exists', as_root=True))
-
-  def testFileExists_pathDoesntExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file.not.exists'],
-            as_root=False,
-            check_return=True,
-            timeout=10,
-            retries=0), self.ShellError()):
-      self.assertFalse(self.device.FileExists('/path/file.not.exists'))
-
-
-class DeviceUtilsRemovePathTest(DeviceUtilsTest):
-  def testRemovePath_regular(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['rm', 'some file'],
-                                         as_root=False,
-                                         check_return=True), []):
-      self.device.RemovePath('some file')
-
-  def testRemovePath_withForce(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['rm', '-f', 'some file'],
-                                         as_root=False,
-                                         check_return=True), []):
-      self.device.RemovePath('some file', force=True)
-
-  def testRemovePath_recursively(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['rm', '-r', '/remove/this/dir'],
-                                         as_root=False,
-                                         check_return=True), []):
-      self.device.RemovePath('/remove/this/dir', recursive=True)
-
-  def testRemovePath_withRoot(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['rm', 'some file'],
-                                         as_root=True,
-                                         check_return=True), []):
-      self.device.RemovePath('some file', as_root=True)
-
-  def testRemovePath_manyPaths(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['rm', 'eeny', 'meeny', 'miny', 'moe'],
-                                         as_root=False,
-                                         check_return=True), []):
-      self.device.RemovePath(['eeny', 'meeny', 'miny', 'moe'])
-
-
-class DeviceUtilsPullFileTest(DeviceUtilsTest):
-  def testPullFile_existsOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCall(
-          self.call.adb.Pull('/data/app/test.file.exists',
-                             '/test/file/host/path')):
-        self.device.PullFile('/data/app/test.file.exists',
-                             '/test/file/host/path')
-
-  def testPullFile_doesntExistOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCall(
-          self.call.adb.Pull('/data/app/test.file.does.not.exist',
-                             '/test/file/host/path'),
-          self.CommandError('remote object does not exist')):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.PullFile('/data/app/test.file.does.not.exist',
-                               '/test/file/host/path')
-
-  def testPullFile_asRoot(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCalls(
-          (self.call.device.NeedsSU(), True), (self.call.device.PathExists(
-              '/this/file/can.be.read.with.su', as_root=True), True),
-          (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-           MockTempFile('/sdcard/tmp/on.device')),
-          self.call.device.RunShellCommand(
-              'SRC=/this/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;'
-              'cp "$SRC" "$DEST" && chmod 666 "$DEST"',
-              shell=True,
-              as_root=True,
-              check_return=True), (self.call.adb.Pull('/sdcard/tmp/on.device',
-                                                      '/test/file/host/path'))):
-        self.device.PullFile(
-            '/this/file/can.be.read.with.su',
-            '/test/file/host/path',
-            as_root=True)
-
-  def testPullFile_asRootDoesntExistOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCalls(
-          (self.call.device.NeedsSU(), True), (self.call.device.PathExists(
-              '/data/app/test.file.does.not.exist', as_root=True), False)):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.PullFile(
-              '/data/app/test.file.does.not.exist',
-              '/test/file/host/path',
-              as_root=True)
-
-
-class DeviceUtilsReadFileTest(DeviceUtilsTest):
-  def testReadFileWithPull_success(self):
-    tmp_host_dir = '/tmp/dir/on.host/'
-    tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull')
-    tmp_host.file.read.return_value = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
-        (self.call.adb.Pull('/path/to/device/file', mock.ANY)),
-        (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host) if six.PY2 else \
-            (mock.call.builtins.open(mock.ANY, 'r'), tmp_host),
-        (mock.call.os.path.exists(tmp_host_dir), True),
-        (mock.call.shutil.rmtree(tmp_host_dir), None)):
-      self.assertEquals('some interesting contents',
-                        self.device._ReadFileWithPull('/path/to/device/file'))
-    tmp_host.file.read.assert_called_once_with()
-
-  def testReadFileWithPull_rejected(self):
-    tmp_host_dir = '/tmp/dir/on.host/'
-    with self.assertCalls((mock.call.tempfile.mkdtemp(), tmp_host_dir),
-                          (self.call.adb.Pull('/path/to/device/file', mock.ANY),
-                           self.CommandError()),
-                          (mock.call.os.path.exists(tmp_host_dir), True),
-                          (mock.call.shutil.rmtree(tmp_host_dir), None)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._ReadFileWithPull('/path/to/device/file')
-
-  def testReadFile_withSU_zeroSize(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device.FileSize(
-            '/this/file/has/zero/size', as_root=True), 0),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device.RunShellCommand(
-            'SRC=/this/file/has/zero/size DEST=/sdcard/tmp/on.device;'
-            'cp "$SRC" "$DEST" && chmod 666 "$DEST"',
-            shell=True,
-            as_root=True,
-            check_return=True),
-        (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'),
-         'but it has contents\n')):
-      self.assertEqual('but it has contents\n',
-                       self.device.ReadFile('/this/file/has/zero/size',
-                       as_root=True))
-
-  def testReadFile_withSU(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device.FileSize(
-            '/this/file/can.be.read.with.su', as_root=True), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/this/file/can.be.read.with.su'],
-            as_root=True,
-            check_return=True), ['this is a test file', 'read with su'])):
-      self.assertEqual(
-          'this is a test file\nread with su\n',
-          self.device.ReadFile('/this/file/can.be.read.with.su', as_root=True))
-
-  def testReadFile_withSU_doesNotExist(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device.FileSize('/this/file/does.not.exist', as_root=True),
-         self.CommandError('File does not exist'))):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.ReadFile('/this/file/does.not.exist', as_root=True)
-
-  def testReadFile_withPull(self):
-    contents = 'a' * 123456
-    with self.assertCalls(
-        (self.call.device._ReadFileWithPull('/read/this/big/test/file'),
-         contents)):
-      self.assertEqual(contents,
-                       self.device.ReadFile('/read/this/big/test/file'))
-
-  def testReadFile_withPullAndSU(self):
-    contents = 'b' * 123456
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device.FileSize(
-            '/this/big/file/can.be.read.with.su', as_root=True), 123456),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device.RunShellCommand(
-            'SRC=/this/big/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;'
-            'cp "$SRC" "$DEST" && chmod 666 "$DEST"',
-            shell=True,
-            as_root=True,
-            check_return=True),
-        (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'),
-         contents)):
-      self.assertEqual(
-          contents,
-          self.device.ReadFile(
-              '/this/big/file/can.be.read.with.su', as_root=True))
-
-  def testReadFile_forcePull(self):
-    contents = 'a' * 123456
-    with self.assertCall(
-        self.call.device._ReadFileWithPull('/read/this/big/test/file'),
-        contents):
-      self.assertEqual(
-          contents,
-          self.device.ReadFile('/read/this/big/test/file', force_pull=True))
-
-
-class DeviceUtilsWriteFileTest(DeviceUtilsTest):
-  def testWriteFileWithPush_success(self):
-    tmp_host = MockTempFile('/tmp/file/on.host')
-    contents = 'some interesting contents'
-    with self.assertCalls((mock.call.tempfile.NamedTemporaryFile(), tmp_host),
-                          self.call.adb.Push('/tmp/file/on.host',
-                                             '/path/to/device/file')):
-      self.device._WriteFileWithPush('/path/to/device/file', contents)
-    tmp_host.file.write.assert_called_once_with(contents)
-
-  def testWriteFileWithPush_rejected(self):
-    tmp_host = MockTempFile('/tmp/file/on.host')
-    contents = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
-        (self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file'),
-         self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._WriteFileWithPush('/path/to/device/file', contents)
-
-  def testWriteFile_withPush(self):
-    contents = 'some large contents ' * 26  # 20 * 26 = 520 chars
-    with self.assertCalls(
-        self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
-      self.device.WriteFile('/path/to/device/file', contents)
-
-  def testWriteFile_withPushForced(self):
-    contents = 'tiny contents'
-    with self.assertCalls(
-        self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
-      self.device.WriteFile('/path/to/device/file', contents, force_push=True)
-
-  def testWriteFile_withPushAndSU(self):
-    contents = 'some large contents ' * 26  # 20 * 26 = 520 chars
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device._WriteFileWithPush('/sdcard/tmp/on.device', contents),
-        self.call.device.RunShellCommand(
-            ['cp', '/sdcard/tmp/on.device', '/path/to/device/file'],
-            as_root=True,
-            check_return=True)):
-      self.device.WriteFile('/path/to/device/file', contents, as_root=True)
-
-  def testWriteFile_withEcho(self):
-    with self.assertCall(
-        self.call.adb.Shell("echo -n the.contents > /test/file/to.write"), ''):
-      self.device.WriteFile('/test/file/to.write', 'the.contents')
-
-  def testWriteFile_withEchoAndQuotes(self):
-    with self.assertCall(
-        self.call.adb.Shell("echo -n 'the contents' > '/test/file/to write'"),
-        ''):
-      self.device.WriteFile('/test/file/to write', 'the contents')
-
-  def testWriteFile_withEchoAndSU(self):
-    expected_cmd_without_su = "sh -c 'echo -n contents > /test/file'"
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.WriteFile('/test/file', 'contents', as_root=True)
-
-
-class DeviceUtilsStatDirectoryTest(DeviceUtilsTest):
-  # Note: Also tests ListDirectory in testStatDirectory_fileList.
-
-  EXAMPLE_LS_OUTPUT = [
-      'total 12345',
-      'drwxr-xr-x  19 root   root          0 1970-04-06 18:03 .',
-      'drwxr-xr-x  19 root   root          0 1970-04-06 18:03 ..',
-      'drwxr-xr-x   6 root   root            1970-01-01 00:00 some_dir',
-      '-rw-r--r--   1 root   root        723 1971-01-01 07:04 some_file',
-      '-rw-r-----   1 root   root        327 2009-02-13 23:30 My Music File',
-      # Some Android versions escape spaces in file names
-      '-rw-rw-rw-   1 root   root          0 2018-01-11 13:35 Local\\ State',
-      # Older Android versions do not print st_nlink
-      'lrwxrwxrwx root     root              1970-01-01 00:00 lnk -> /a/path',
-      'srwxrwx--- system   system            2016-05-31 17:25 a_socket1',
-      'drwxrwxrwt system   misc              1970-11-23 02:25 tmp',
-      'drwxr-s--- system   shell             1970-11-23 02:24 my_cmd',
-      'cr--r----- root     system    10, 183 1971-01-01 07:04 random',
-      'brw------- root     root       7,   0 1971-01-01 07:04 block_dev',
-      '-rwS------ root     shell      157404 2015-04-13 15:44 silly',
-  ]
-
-  FILENAMES = [
-      'some_dir', 'some_file', 'My Music File', 'Local State', 'lnk',
-      'a_socket1', 'tmp', 'my_cmd', 'random', 'block_dev', 'silly'
-  ]
-
-  def getStatEntries(self, path_given='/', path_listed='/'):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['ls', '-a', '-l', path_listed],
-                                         check_return=True,
-                                         as_root=False,
-                                         env={'TZ': 'utc'}),
-        self.EXAMPLE_LS_OUTPUT):
-      entries = self.device.StatDirectory(path_given)
-    return {f['filename']: f for f in entries}
-
-  def getListEntries(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['ls', '-a', '-l', '/'],
-                                         check_return=True,
-                                         as_root=False,
-                                         env={'TZ': 'utc'}),
-        self.EXAMPLE_LS_OUTPUT):
-      return self.device.ListDirectory('/')
-
-  def testStatDirectory_forceTrailingSlash(self):
-    self.getStatEntries(path_given='/foo/bar/', path_listed='/foo/bar/')
-    self.getStatEntries(path_given='/foo/bar', path_listed='/foo/bar/')
-
-  def testStatDirectory_fileList(self):
-    self.safeAssertItemsEqual(self.getStatEntries().keys(), self.FILENAMES)
-    self.safeAssertItemsEqual(self.getListEntries(), self.FILENAMES)
-
-  def testStatDirectory_fileModes(self):
-    expected_modes = (
-        ('some_dir', stat.S_ISDIR),
-        ('some_file', stat.S_ISREG),
-        ('lnk', stat.S_ISLNK),
-        ('a_socket1', stat.S_ISSOCK),
-        ('block_dev', stat.S_ISBLK),
-        ('random', stat.S_ISCHR),
-    )
-    entries = self.getStatEntries()
-    for filename, check in expected_modes:
-      self.assertTrue(check(entries[filename]['st_mode']))
-
-  def testStatDirectory_filePermissions(self):
-    should_have = (
-        ('some_file', stat.S_IWUSR),  # Owner can write.
-        ('tmp', stat.S_IXOTH),  # Others can execute.
-        ('tmp', stat.S_ISVTX),  # Has sticky bit.
-        ('my_cmd', stat.S_ISGID),  # Has set-group-ID bit.
-        ('silly', stat.S_ISUID),  # Has set UID bit.
-    )
-    should_not_have = (
-        ('some_file', stat.S_IWOTH),  # Others can't write.
-        ('block_dev', stat.S_IRGRP),  # Group can't read.
-        ('silly', stat.S_IXUSR),  # Owner can't execute.
-    )
-    entries = self.getStatEntries()
-    for filename, bit in should_have:
-      self.assertTrue(entries[filename]['st_mode'] & bit)
-    for filename, bit in should_not_have:
-      self.assertFalse(entries[filename]['st_mode'] & bit)
-
-  def testStatDirectory_numHardLinks(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_nlink'], 6)
-    self.assertEqual(entries['some_file']['st_nlink'], 1)
-    self.assertFalse('st_nlink' in entries['tmp'])
-
-  def testStatDirectory_fileOwners(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_owner'], 'root')
-    self.assertEqual(entries['my_cmd']['st_owner'], 'system')
-    self.assertEqual(entries['my_cmd']['st_group'], 'shell')
-    self.assertEqual(entries['tmp']['st_group'], 'misc')
-
-  def testStatDirectory_fileSize(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_file']['st_size'], 723)
-    self.assertEqual(entries['My Music File']['st_size'], 327)
-    # Sizes are sometimes not reported for non-regular files, don't try to
-    # guess the size in those cases.
-    self.assertFalse('st_size' in entries['some_dir'])
-
-  def testStatDirectory_fileDateTime(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_mtime'], 0)  # Epoch!
-    self.assertEqual(entries['My Music File']['st_mtime'], 1234567800)
-
-  def testStatDirectory_deviceType(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['random']['st_rdev_pair'], (10, 183))
-    self.assertEqual(entries['block_dev']['st_rdev_pair'], (7, 0))
-
-  def testStatDirectory_symbolicLinks(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['lnk']['symbolic_link_to'], '/a/path')
-    for d in entries.values():
-      self.assertEqual('symbolic_link_to' in d, stat.S_ISLNK(d['st_mode']))
-
-
-class DeviceUtilsStatPathTest(DeviceUtilsTest):
-
-  EXAMPLE_DIRECTORY = [{
-      'filename': 'foo.txt',
-      'st_size': 123,
-      'st_time': 456
-  }, {
-      'filename': 'some_dir',
-      'st_time': 0
-  }]
-  INDEX = {e['filename']: e for e in EXAMPLE_DIRECTORY}
-
-  def testStatPath_file(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['foo.txt'],
-                        self.device.StatPath('/data/local/tmp/foo.txt'))
-
-  def testStatPath_directory(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['some_dir'],
-                        self.device.StatPath('/data/local/tmp/some_dir'))
-
-  def testStatPath_directoryWithTrailingSlash(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['some_dir'],
-                        self.device.StatPath('/data/local/tmp/some_dir/'))
-
-  def testStatPath_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.StatPath('/data/local/tmp/does.not.exist.txt')
-
-
-class DeviceUtilsFileSizeTest(DeviceUtilsTest):
-
-  EXAMPLE_DIRECTORY = [{
-      'filename': 'foo.txt',
-      'st_size': 123,
-      'st_mtime': 456
-  }, {
-      'filename': 'some_dir',
-      'st_mtime': 0
-  }]
-
-  def testFileSize_file(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(123, self.device.FileSize('/data/local/tmp/foo.txt'))
-
-  def testFileSize_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.FileSize('/data/local/tmp/does.not.exist.txt')
-
-  def testFileSize_directoryWithNoSize(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.FileSize('/data/local/tmp/some_dir')
-
-
-class DeviceUtilsSetJavaAssertsTest(DeviceUtilsTest):
-  def testSetJavaAsserts_enable(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'some.other.prop=value_ok\n'),
-        self.call.device.WriteFile(
-            self.device.LOCAL_PROPERTIES_PATH,
-            'some.example.prop=with an example value\n'
-            'some.other.prop=value_ok\n'
-            'dalvik.vm.enableassertions=all\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), ''),
-        self.call.device.SetProp('dalvik.vm.enableassertions', 'all')):
-      self.assertTrue(self.device.SetJavaAsserts(True))
-
-  def testSetJavaAsserts_disable(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        self.call.device.WriteFile(
-            self.device.LOCAL_PROPERTIES_PATH,
-            'some.example.prop=with an example value\n'
-            'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all'),
-        self.call.device.SetProp('dalvik.vm.enableassertions', '')):
-      self.assertTrue(self.device.SetJavaAsserts(False))
-
-  def testSetJavaAsserts_alreadyEnabled(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
-      self.assertFalse(self.device.SetJavaAsserts(True))
-
-  def testSetJavaAsserts_malformedLocalProp(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'malformed_property\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
-      self.assertFalse(self.device.SetJavaAsserts(True))
-
-
-class DeviceUtilsEnsureCacheInitializedTest(DeviceUtilsTest):
-  def testEnsureCacheInitialized_noCache_success(self):
-    self.assertIsNone(self.device._cache['token'])
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            AnyStringWith('getprop'),
-            shell=True,
-            check_return=True,
-            large_output=True), ['/sdcard', 'TOKEN']):
-      self.device._EnsureCacheInitialized()
-    self.assertIsNotNone(self.device._cache['token'])
-
-  def testEnsureCacheInitialized_noCache_failure(self):
-    self.assertIsNone(self.device._cache['token'])
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            AnyStringWith('getprop'),
-            shell=True,
-            check_return=True,
-            large_output=True), self.TimeoutError()):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device._EnsureCacheInitialized()
-    self.assertIsNone(self.device._cache['token'])
-
-  def testEnsureCacheInitialized_cache(self):
-    self.device._cache['token'] = 'TOKEN'
-    with self.assertCalls():
-      self.device._EnsureCacheInitialized()
-    self.assertIsNotNone(self.device._cache['token'])
-
-
-class DeviceUtilsGetPropTest(DeviceUtilsTest):
-  def testGetProp_exists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['getprop', 'test.property'],
-                                         check_return=True,
-                                         single_line=True,
-                                         timeout=self.device._default_timeout,
-                                         retries=self.device._default_retries),
-        'property_value'):
-      self.assertEqual('property_value', self.device.GetProp('test.property'))
-
-  def testGetProp_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(['getprop', 'property.does.not.exist'],
-                                         check_return=True,
-                                         single_line=True,
-                                         timeout=self.device._default_timeout,
-                                         retries=self.device._default_retries),
-        ''):
-      self.assertEqual('', self.device.GetProp('property.does.not.exist'))
-
-  def testGetProp_cachedRoProp(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(props=['[ro.build.type]: [userdebug]'])):
-      self.assertEqual('userdebug',
-                       self.device.GetProp('ro.build.type', cache=True))
-      self.assertEqual('userdebug',
-                       self.device.GetProp('ro.build.type', cache=True))
-
-
-class DeviceUtilsSetPropTest(DeviceUtilsTest):
-  def testSetProp(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'test value'], check_return=True)):
-      self.device.SetProp('test.property', 'test value')
-
-  def testSetProp_check_succeeds(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'new_value'], check_return=True)),
-        (self.call.device.GetProp('test.property', cache=False), 'new_value')):
-      self.device.SetProp('test.property', 'new_value', check=True)
-
-  def testSetProp_check_fails(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'new_value'], check_return=True)),
-        (self.call.device.GetProp('test.property', cache=False), 'old_value')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.SetProp('test.property', 'new_value', check=True)
-
-
-class DeviceUtilsListProcessesTest(DeviceUtilsTest):
-  def setUp(self):
-    super(DeviceUtilsListProcessesTest, self).setUp()
-    self.sample_output = [
-        'USER  PID     PPID  VSIZE RSS   WCHAN          PC  NAME',
-        'user  1001    100   1024  1024  ffffffff 00000000 one.match',
-        'user  1002    100   1024  1024  ffffffff 00000000 two.match',
-        'user  1003    101   1024  1024  ffffffff 00000000 three.match',
-        'user  1234    101   1024  1024  ffffffff 00000000 my$process',
-        'user  1236    100   1024  1024  ffffffff 00000000 foo',
-        'user  1578    1236  1024  1024  ffffffff 00000000 foo',
-    ]
-
-  def _grepOutput(self, substring):
-    return [line for line in self.sample_output if substring in line]
-
-  def testListProcesses_sdkGreaterThanNougatMR1(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=(version_codes.NOUGAT_MR1 + 1)):
-      with self.patch_call(self.call.device.build_id, return_value='ZZZ99Z'):
-        with self.assertCall(
-            self.call.device._RunPipedShellCommand(
-                'ps -e | grep -F example.process'), []):
-          self.device.ListProcesses('example.process')
-
-  def testListProcesses_noMatches(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F does.not.match'),
-          self._grepOutput('does.not.match')):
-        self.assertEqual([], self.device.ListProcesses('does.not.match'))
-
-  def testListProcesses_oneMatch(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(
-            Processes(('one.match', 1001, 100)),
-            self.device.ListProcesses('one.match'))
-
-  def testListProcesses_multipleMatches(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        self.assertEqual(
-            Processes(('one.match', 1001, 100), ('two.match', 1002, 100),
-                      ('three.match', 1003, 101)),
-            self.device.ListProcesses('match'))
-
-  def testListProcesses_quotable(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand("ps | grep -F 'my$process'"),
-          self._grepOutput('my$process')):
-        self.assertEqual(
-            Processes(('my$process', 1234, 101)),
-            self.device.ListProcesses('my$process'))
-
-  # Tests for the GetPids wrapper interface.
-  def testGetPids_multipleInstances(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-          self._grepOutput('foo')):
-        self.assertEqual({'foo': ['1236', '1578']}, self.device.GetPids('foo'))
-
-  def testGetPids_allProcesses(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device.RunShellCommand(['ps'],
-                                           check_return=True,
-                                           large_output=True),
-          self.sample_output):
-        self.assertEqual({
-            'one.match': ['1001'],
-            'two.match': ['1002'],
-            'three.match': ['1003'],
-            'my$process': ['1234'],
-            'foo': ['1236', '1578']
-        }, self.device.GetPids())
-
-  # Tests for the GetApplicationPids wrapper interface.
-  def testGetApplicationPids_notFound(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        # No PIDs found, process name should be exact match.
-        self.assertEqual([], self.device.GetApplicationPids('match'))
-
-  def testGetApplicationPids_foundOne(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual([1001], self.device.GetApplicationPids('one.match'))
-
-  def testGetApplicationPids_foundMany(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-          self._grepOutput('foo')):
-        self.assertEqual([1236, 1578], self.device.GetApplicationPids('foo'))
-
-  def testGetApplicationPids_atMostOneNotFound(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        # No PIDs found, process name should be exact match.
-        self.assertEqual(
-            None, self.device.GetApplicationPids('match', at_most_one=True))
-
-  def testGetApplicationPids_atMostOneFound(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(
-            1001, self.device.GetApplicationPids('one.match', at_most_one=True))
-
-  def testGetApplicationPids_atMostOneFoundTooMany(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertRaises(device_errors.CommandFailedError):
-        with self.assertCall(
-            self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-            self._grepOutput('foo')):
-          self.device.GetApplicationPids('foo', at_most_one=True)
-
-
-class DeviceUtilsGetSetEnforce(DeviceUtilsTest):
-  def testGetEnforce_Enforcing(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Enforcing'):
-      self.assertEqual(True, self.device.GetEnforce())
-
-  def testGetEnforce_Permissive(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Permissive'):
-      self.assertEqual(False, self.device.GetEnforce())
-
-  def testGetEnforce_Disabled(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Disabled'):
-      self.assertEqual(None, self.device.GetEnforce())
-
-  def testSetEnforce_Enforcing(self):
-    with self.assertCalls((self.call.device.NeedsSU(), False),
-                          (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled=True)
-
-  def testSetEnforce_Permissive(self):
-    with self.assertCalls((self.call.device.NeedsSU(), False),
-                          (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled=False)
-
-  def testSetEnforce_EnforcingWithInt(self):
-    with self.assertCalls((self.call.device.NeedsSU(), False),
-                          (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled=1)
-
-  def testSetEnforce_PermissiveWithInt(self):
-    with self.assertCalls((self.call.device.NeedsSU(), False),
-                          (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled=0)
-
-  def testSetEnforce_EnforcingWithStr(self):
-    with self.assertCalls((self.call.device.NeedsSU(), False),
-                          (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled='1')
-
-  def testSetEnforce_PermissiveWithStr(self):
-    with self.assertCalls((self.call.device.NeedsSU(), False),
-                          (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled='0')  # Not recommended but it works!
-
-
-class DeviceUtilsGetWebViewUpdateServiceDumpTest(DeviceUtilsTest):
-  def testGetWebViewUpdateServiceDump_success(self):
-    # Some of the lines of adb shell dumpsys webviewupdate:
-    dumpsys_lines = [
-        'Fallback logic enabled: true',
-        ('Current WebView package (name, version): '
-         '(com.android.chrome, 61.0.3163.98)'),
-        'Minimum WebView version code: 12345',
-        'WebView packages:',
-        ('Valid package com.android.chrome (versionName: '
-         '61.0.3163.98, versionCode: 1, targetSdkVersion: 26) is  '
-         'installed/enabled for all users'),
-        ('Valid package com.google.android.webview (versionName: '
-         '58.0.3029.125, versionCode: 1, targetSdkVersion: 26) is NOT '
-         'installed/enabled for all users'),
-        ('Invalid package com.google.android.apps.chrome (versionName: '
-         '56.0.2924.122, versionCode: 2, targetSdkVersion: 25), reason: SDK '
-         'version too low'),
-        ('com.chrome.canary is NOT installed.'),
-    ]
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.OREO):
-      with self.assertCall(
-          self.call.adb.Shell('dumpsys webviewupdate'),
-          '\n'.join(dumpsys_lines)):
-        update = self.device.GetWebViewUpdateServiceDump()
-        self.assertTrue(update['FallbackLogicEnabled'])
-        self.assertEqual('com.android.chrome', update['CurrentWebViewPackage'])
-        self.assertEqual(12345, update['MinimumWebViewVersionCode'])
-        # Order isn't really important, and we shouldn't have duplicates, so we
-        # convert to sets.
-        expected = {
-            'com.android.chrome', 'com.google.android.webview',
-            'com.google.android.apps.chrome', 'com.chrome.canary'
-        }
-        self.assertSetEqual(expected, set(update['WebViewPackages'].keys()))
-        self.assertEquals('is  installed/enabled for all users',
-                          update['WebViewPackages']['com.android.chrome'])
-        self.assertEquals(
-            'is NOT installed/enabled for all users',
-            update['WebViewPackages']['com.google.android.webview'])
-        self.assertEquals(
-            'reason: SDK version too low',
-            update['WebViewPackages']['com.google.android.apps.chrome'])
-        self.assertEquals('is NOT installed.',
-                          update['WebViewPackages']['com.chrome.canary'])
-
-  def testGetWebViewUpdateServiceDump_missingkey(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.OREO):
-      with self.assertCall(
-          self.call.adb.Shell('dumpsys webviewupdate'),
-          'Fallback logic enabled: true'):
-        update = self.device.GetWebViewUpdateServiceDump()
-        self.assertEqual(True, update['FallbackLogicEnabled'])
-
-  def testGetWebViewUpdateServiceDump_noop(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.NOUGAT_MR1):
-      with self.assertCalls():
-        self.device.GetWebViewUpdateServiceDump()
-
-  def testGetWebViewUpdateServiceDump_noPackage(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.OREO):
-      with self.assertCall(
-          self.call.adb.Shell('dumpsys webviewupdate'),
-          'Fallback logic enabled: true\n'
-          'Current WebView package is null'):
-        update = self.device.GetWebViewUpdateServiceDump()
-        self.assertEqual(True, update['FallbackLogicEnabled'])
-        self.assertEqual(None, update['CurrentWebViewPackage'])
-
-
-class DeviceUtilsSetWebViewImplementationTest(DeviceUtilsTest):
-  def testSetWebViewImplementation_success(self):
-    with self.patch_call(
-        self.call.device.IsApplicationInstalled, return_value=True):
-      with self.assertCall(
-          self.call.adb.Shell(
-              'cmd webviewupdate set-webview-implementation foo.org'),
-          'Success'):
-        self.device.SetWebViewImplementation('foo.org')
-
-  def testSetWebViewImplementation_uninstalled(self):
-    with self.patch_call(
-        self.call.device.IsApplicationInstalled, return_value=False):
-      with self.assertRaises(device_errors.CommandFailedError) as cfe:
-        self.device.SetWebViewImplementation('foo.org')
-      self.assertIn('is not installed', cfe.exception.message)
-
-  def _testSetWebViewImplementationHelper(self, mock_dump_sys,
-                                          exception_message_substr):
-    with self.patch_call(
-        self.call.device.IsApplicationInstalled, return_value=True):
-      with self.assertCall(
-          self.call.adb.Shell(
-              'cmd webviewupdate set-webview-implementation foo.org'), 'Oops!'):
-        with self.patch_call(
-            self.call.device.GetWebViewUpdateServiceDump,
-            return_value=mock_dump_sys):
-          with self.assertRaises(device_errors.CommandFailedError) as cfe:
-            self.device.SetWebViewImplementation('foo.org')
-          self.assertIn(exception_message_substr, cfe.exception.message)
-
-  def testSetWebViewImplementation_notInProviderList(self):
-    mock_dump_sys = {
-        'WebViewPackages': {
-            'some.package': 'any reason',
-            'other.package': 'any reason',
-        }
-    }
-    self._testSetWebViewImplementationHelper(mock_dump_sys, 'provider list')
-
-  def testSetWebViewImplementation_notEnabled(self):
-    mock_dump_sys = {
-        'WebViewPackages': {
-            'foo.org': 'is NOT installed/enabled for all users',
-        }
-    }
-    self._testSetWebViewImplementationHelper(mock_dump_sys, 'is disabled')
-
-  def testSetWebViewImplementation_missingManifestTag(self):
-    mock_dump_sys = {
-        'WebViewPackages': {
-            'foo.org': 'No WebView-library manifest flag',
-        }
-    }
-    self._testSetWebViewImplementationHelper(mock_dump_sys,
-                                             'WebView native library')
-
-  def testSetWebViewImplementation_lowTargetSdkVersion_finalizedSdk(self):
-    mock_dump_sys = {'WebViewPackages': {'foo.org': 'SDK version too low', }}
-    with self.assertCalls(
-        (self.call.device.GetApplicationTargetSdk('foo.org'), '29'),
-        (self.call.device.GetProp('ro.build.version.preview_sdk'), '0')):
-      with self.patch_call(self.call.device.build_version_sdk, return_value=30):
-        self._testSetWebViewImplementationHelper(
-            mock_dump_sys,
-            "has targetSdkVersion '29', but valid WebView providers must "
-            "target >= 30 on this device")
-
-  def testSetWebViewImplementation_lowTargetSdkVersion_prefinalizedSdk(self):
-    mock_dump_sys = {'WebViewPackages': {'foo.org': 'SDK version too low', }}
-    with self.assertCalls(
-        (self.call.device.GetApplicationTargetSdk('foo.org'), '29'),
-        (self.call.device.GetProp('ro.build.version.preview_sdk'), '1'),
-        (self.call.device.GetProp('ro.build.version.codename'), 'R')):
-      with self.patch_call(self.call.device.build_version_sdk, return_value=29):
-        self._testSetWebViewImplementationHelper(
-            mock_dump_sys,
-            "targets a finalized SDK ('29'), but valid WebView providers must "
-            "target a pre-finalized SDK ('R') on this device")
-
-  def testSetWebViewImplementation_lowVersionCode(self):
-    mock_dump_sys = {
-        'MinimumWebViewVersionCode': 12345,
-        'WebViewPackages': {
-            'foo.org': 'Version code too low',
-        }
-    }
-    self._testSetWebViewImplementationHelper(mock_dump_sys,
-                                             'higher versionCode')
-
-  def testSetWebViewImplementation_invalidSignature(self):
-    mock_dump_sys = {'WebViewPackages': {'foo.org': 'Incorrect signature'}}
-    self._testSetWebViewImplementationHelper(mock_dump_sys,
-                                             'signed with release keys')
-
-
-class DeviceUtilsSetWebViewFallbackLogicTest(DeviceUtilsTest):
-  def testSetWebViewFallbackLogic_False_success(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.NOUGAT):
-      with self.assertCall(
-          self.call.adb.Shell('cmd webviewupdate enable-redundant-packages'),
-          'Success'):
-        self.device.SetWebViewFallbackLogic(False)
-
-  def testSetWebViewFallbackLogic_True_success(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.NOUGAT):
-      with self.assertCall(
-          self.call.adb.Shell('cmd webviewupdate disable-redundant-packages'),
-          'Success'):
-        self.device.SetWebViewFallbackLogic(True)
-
-  def testSetWebViewFallbackLogic_failure(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.NOUGAT):
-      with self.assertCall(
-          self.call.adb.Shell('cmd webviewupdate enable-redundant-packages'),
-          'Oops!'):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.SetWebViewFallbackLogic(False)
-
-  def testSetWebViewFallbackLogic_beforeNougat(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls():
-        self.device.SetWebViewFallbackLogic(False)
-
-  def testSetWebViewFallbackLogic_afterPie(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.Q):
-      with self.assertCalls():
-        self.device.SetWebViewFallbackLogic(False)
-
-
-class DeviceUtilsTakeScreenshotTest(DeviceUtilsTest):
-  def testTakeScreenshot_fileNameProvided(self):
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.png'), MockTempFile('/tmp/path/temp-123.png')),
-        (self.call.adb.Shell('/system/bin/screencap -p /tmp/path/temp-123.png'),
-         ''),
-        self.call.device.PullFile('/tmp/path/temp-123.png',
-                                  '/test/host/screenshot.png')):
-      self.device.TakeScreenshot('/test/host/screenshot.png')
-
-
-class DeviceUtilsDismissCrashDialogIfNeededTest(DeviceUtilsTest):
-  def testDismissCrashDialogIfNeeded_crashedPageckageNotFound(self):
-    sample_dumpsys_output = '''
-WINDOW MANAGER WINDOWS (dumpsys window windows)
-  Window #11 Window{f8b647a u0 SearchPanel}:
-    mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
-    mOwnerUid=100 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
-    mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
-    Requested w=1080 h=1920 mLayoutSeq=426
-    mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
-'''
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True),
-         sample_dumpsys_output.split('\n'))):
-      package_name = self.device.DismissCrashDialogIfNeeded()
-      self.assertIsNone(package_name)
-
-  def testDismissCrashDialogIfNeeded_crashedPageckageFound(self):
-    sample_dumpsys_output = '''
-WINDOW MANAGER WINDOWS (dumpsys window windows)
-  Window #11 Window{f8b647a u0 SearchPanel}:
-    mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
-    mOwnerUid=102 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
-    mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
-    Requested w=1080 h=1920 mLayoutSeq=426
-    mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
-  mHasPermanentDpad=false
-  mCurrentFocus=Window{3a27740f u0 Application Error: com.android.chrome}
-  mFocusedApp=AppWindowToken{470af6f token=Token{272ec24e ActivityRecord{t894}}}
-'''
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True),
-         sample_dumpsys_output.split('\n')), (self.call.device.RunShellCommand(
-             ['input', 'keyevent', '22'], check_return=True)),
-        (self.call.device.RunShellCommand(['input', 'keyevent', '22'],
-                                          check_return=True)),
-        (self.call.device.RunShellCommand(['input', 'keyevent', '66'],
-                                          check_return=True)),
-        (self.call.device.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                          check_return=True,
-                                          large_output=True), [])):
-      package_name = self.device.DismissCrashDialogIfNeeded()
-      self.assertEqual(package_name, 'com.android.chrome')
-
-
-class DeviceUtilsClientCache(DeviceUtilsTest):
-  def testClientCache_twoCaches(self):
-    self.device._cache['test'] = 0
-    client_cache_one = self.device.GetClientCache('ClientOne')
-    client_cache_one['test'] = 1
-    client_cache_two = self.device.GetClientCache('ClientTwo')
-    client_cache_two['test'] = 2
-    self.assertEqual(self.device._cache['test'], 0)
-    self.assertEqual(client_cache_one, {'test': 1})
-    self.assertEqual(client_cache_two, {'test': 2})
-    self.device.ClearCache()
-    self.assertTrue('test' not in self.device._cache)
-    self.assertEqual(client_cache_one, {})
-    self.assertEqual(client_cache_two, {})
-
-  def testClientCache_multipleInstances(self):
-    client_cache_one = self.device.GetClientCache('ClientOne')
-    client_cache_one['test'] = 1
-    client_cache_two = self.device.GetClientCache('ClientOne')
-    self.assertEqual(client_cache_one, {'test': 1})
-    self.assertEqual(client_cache_two, {'test': 1})
-    self.device.ClearCache()
-    self.assertEqual(client_cache_one, {})
-    self.assertEqual(client_cache_two, {})
-
-
-class DeviceUtilsHealthyDevicesTest(mock_calls.TestCase):
-  def testHealthyDevices_emptyDenylist_defaultDeviceArg(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM)):
-      denylist = mock.NonCallableMock(**{'Read.return_value': []})
-      devices = device_utils.DeviceUtils.HealthyDevices(denylist)
-    for serial, device in zip(test_serials, devices):
-      self.assertTrue(isinstance(device, device_utils.DeviceUtils))
-      self.assertEquals(serial, device.adb.GetDeviceSerial())
-
-  def testHealthyDevices_denylist_defaultDeviceArg(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM)):
-      denylist = mock.NonCallableMock(
-          **{'Read.return_value': ['fedcba9876543210']})
-      devices = device_utils.DeviceUtils.HealthyDevices(denylist)
-    self.assertEquals(1, len(devices))
-    self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils))
-    self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial())
-
-  def testHealthyDevices_noneDeviceArg_multiple_attached(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM),
-        (mock.call.devil.android.device_errors.MultipleDevicesError(mock.ANY),
-         _MockMultipleDevicesError())):
-      with self.assertRaises(_MockMultipleDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-
-  def testHealthyDevices_noneDeviceArg_one_attached(self):
-    test_serials = ['0123456789abcdef']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM)):
-      devices = device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_noneDeviceArg_no_attached(self):
-    test_serials = []
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None, retries=0)
-
-  def testHealthyDevices_noneDeviceArg_multiple_attached_ANDROID_SERIAL(self):
-    try:
-      os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-    finally:
-      del os.environ['ANDROID_SERIAL']
-
-  def testHealthyDevices_stringDeviceArg(self):
-    with self.assertCalls():  # Should skip adb devices when device is known.
-      devices = device_utils.DeviceUtils.HealthyDevices(
-          device_arg='0123456789abcdef')
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_multiple_attached(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM)):
-      devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
-    self.assertEquals(2, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_ANDROID_SERIAL(self):
-    try:
-      os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
-    finally:
-      del os.environ['ANDROID_SERIAL']
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_no_attached(self):
-    test_serials = []
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=[], retries=0)
-
-  @mock.patch('time.sleep')
-  @mock.patch('devil.android.sdk.adb_wrapper.RestartServer')
-  def testHealthyDevices_EmptyListDeviceArg_no_attached_with_retry(
-      self, mock_restart, mock_sleep):
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), [])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=[], retries=4)
-    self.assertEquals(mock_restart.call_count, 4)
-    self.assertEquals(
-        mock_sleep.call_args_list,
-        [mock.call(2), mock.call(4),
-         mock.call(8), mock.call(16)])
-
-  @mock.patch('time.sleep')
-  @mock.patch('devil.android.sdk.adb_wrapper.RestartServer')
-  def testHealthyDevices_EmptyListDeviceArg_no_attached_with_resets(
-      self, mock_restart, mock_sleep):
-    # The reset_usb import fails on windows. Mock the full import here so it can
-    # succeed like it would on linux.
-    mock_reset_import = mock.MagicMock()
-    sys.modules['devil.utils.reset_usb'] = mock_reset_import
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), []),
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(), [])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        with mock.patch.object(mock_reset_import,
-                               'reset_all_android_devices') as mock_reset:
-          device_utils.DeviceUtils.HealthyDevices(
-              device_arg=[], retries=4, enable_usb_resets=True)
-          self.assertEquals(mock_reset.call_count, 1)
-    self.assertEquals(mock_restart.call_count, 4)
-    self.assertEquals(
-        mock_sleep.call_args_list,
-        [mock.call(2), mock.call(4),
-         mock.call(8), mock.call(16)])
-
-  def testHealthyDevices_ListDeviceArg(self):
-    device_arg = ['0123456789abcdef', 'fedcba9876543210']
-    try:
-      os.environ['ANDROID_SERIAL'] = 'should-not-apply'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        devices = device_utils.DeviceUtils.HealthyDevices(device_arg=device_arg)
-    finally:
-      del os.environ['ANDROID_SERIAL']
-    self.assertEquals(2, len(devices))
-
-  def testHealthyDevices_abisArg_no_matching_abi(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM)):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(
-            device_arg=[], retries=0, abis=[abis.ARM_64])
-
-  def testHealthyDevices_abisArg_filter_on_abi(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(),
-         abis.ARM_64),
-        (mock.call.devil.android.device_utils.DeviceUtils.GetABI(), abis.ARM)):
-      devices = device_utils.DeviceUtils.HealthyDevices(
-          device_arg=[], retries=0, abis=[abis.ARM_64])
-    self.assertEquals(1, len(devices))
-
-
-class DeviceUtilsRestartAdbdTest(DeviceUtilsTest):
-  def testAdbdRestart(self):
-    mock_temp_file = '/sdcard/temp-123.sh'
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.sh'), MockTempFile(mock_temp_file)),
-        self.call.device.WriteFile(mock.ANY, mock.ANY),
-        (self.call.device.RunShellCommand(
-            ['source', mock_temp_file], check_return=True, as_root=True)),
-        self.call.adb.WaitForDevice()):
-      self.device.RestartAdbd()
-
-
-class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
-  def _PmGrantShellCall(self, package, permissions):
-    fragment = 'p=%s;for q in %s;' % (package, ' '.join(sorted(permissions)))
-    results = []
-    for permission, result in sorted(permissions.items()):
-      if result:
-        output, status = result + '\n', 1
-      else:
-        output, status = '', 0
-      results.append('{output}{sep}{permission}{sep}{status}{sep}\n'.format(
-          output=output,
-          permission=permission,
-          status=status,
-          sep=device_utils._SHELL_OUTPUT_SEPARATOR))
-    return (self.call.device.RunShellCommand(
-        AnyStringWith(fragment),
-        shell=True,
-        raw_output=True,
-        large_output=True,
-        check_return=True), ''.join(results))
-
-  def testGrantPermissions_none(self):
-    self.device.GrantPermissions('package', [])
-
-  def testGrantPermissions_one(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(self._PmGrantShellCall('package', {'p1': 0})):
-        self.device.GrantPermissions('package', ['p1'])
-
-  def testGrantPermissions_multiple(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          self._PmGrantShellCall('package', {
-              'p1': 0,
-              'p2': 0
-          })):
-        self.device.GrantPermissions('package', ['p1', 'p2'])
-
-  def testGrantPermissions_WriteExtrnalStorage(self):
-    WRITE = 'android.permission.WRITE_EXTERNAL_STORAGE'
-    READ = 'android.permission.READ_EXTERNAL_STORAGE'
-    with PatchLogger() as logger:
-      with self.patch_call(
-          self.call.device.build_version_sdk,
-          return_value=version_codes.MARSHMALLOW):
-        with self.assertCalls(
-            self._PmGrantShellCall('package', {
-                READ: 0,
-                WRITE: 0
-            })):
-          self.device.GrantPermissions('package', [WRITE])
-      self.assertEqual(logger.warnings, [])
-
-  def testGrantPermissions_ManageExtrnalStorage(self):
-    with PatchLogger() as logger:
-      with self.patch_call(self.call.device.build_version_sdk,
-                           return_value=version_codes.R):
-        with self.assertCalls(
-            (self.call.device.RunShellCommand(
-                AnyStringWith('appops set pkg MANAGE_EXTERNAL_STORAGE allow'),
-                shell=True,
-                raw_output=True,
-                large_output=True,
-                check_return=True),
-             '{sep}MANAGE_EXTERNAL_STORAGE{sep}0{sep}\n'.format(
-                 sep=device_utils._SHELL_OUTPUT_SEPARATOR))):
-          self.device.GrantPermissions(
-              'pkg', ['android.permission.MANAGE_EXTERNAL_STORAGE'])
-      self.assertEqual(logger.warnings, [])
-
-  def testGrantPermissions_DenyList(self):
-    with PatchLogger() as logger:
-      with self.patch_call(
-          self.call.device.build_version_sdk,
-          return_value=version_codes.MARSHMALLOW):
-        with self.assertCalls(self._PmGrantShellCall('package', {'p1': 0})):
-          self.device.GrantPermissions('package',
-                                       ['p1', 'foo.permission.C2D_MESSAGE'])
-      self.assertEqual(logger.warnings, [])
-
-  def testGrantPermissions_unchangeablePermision(self):
-    error_message = (
-        'Operation not allowed: java.lang.SecurityException: '
-        'Permission UNCHANGEABLE is not a changeable permission type')
-    with PatchLogger() as logger:
-      with self.patch_call(
-          self.call.device.build_version_sdk,
-          return_value=version_codes.MARSHMALLOW):
-        with self.assertCalls(
-            self._PmGrantShellCall('package', {'UNCHANGEABLE': error_message})):
-          self.device.GrantPermissions('package', ['UNCHANGEABLE'])
-      self.assertEqual(logger.warnings,
-                       [mock.ANY, AnyStringWith('UNCHANGEABLE')])
-
-
-class DeviecUtilsIsScreenOn(DeviceUtilsTest):
-
-  _L_SCREEN_ON = ['test=test mInteractive=true']
-  _K_SCREEN_ON = ['test=test mScreenOn=true']
-  _L_SCREEN_OFF = ['mInteractive=false']
-  _K_SCREEN_OFF = ['mScreenOn=false']
-
-  def testIsScreenOn_onPreL(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.KITKAT):
-      with self.assertCalls((self.call.device._RunPipedShellCommand(
-          'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_ON)):
-        self.assertTrue(self.device.IsScreenOn())
-
-  def testIsScreenOn_onL(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCalls((self.call.device._RunPipedShellCommand(
-          'dumpsys input_method | grep mInteractive'), self._L_SCREEN_ON)):
-        self.assertTrue(self.device.IsScreenOn())
-
-  def testIsScreenOn_offPreL(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk, return_value=version_codes.KITKAT):
-      with self.assertCalls((self.call.device._RunPipedShellCommand(
-          'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_OFF)):
-        self.assertFalse(self.device.IsScreenOn())
-
-  def testIsScreenOn_offL(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCalls((self.call.device._RunPipedShellCommand(
-          'dumpsys input_method | grep mInteractive'), self._L_SCREEN_OFF)):
-        self.assertFalse(self.device.IsScreenOn())
-
-  def testIsScreenOn_noOutput(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP):
-      with self.assertCalls((self.call.device._RunPipedShellCommand(
-          'dumpsys input_method | grep mInteractive'), [])):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.IsScreenOn()
-
-
-class DeviecUtilsSetScreen(DeviceUtilsTest):
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScren_alreadySet(self):
-    with self.assertCalls((self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_on(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), False),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), True)):
-      self.device.SetScreen(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_off(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_slow(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-
-class DeviecUtilsLoadCacheData(DeviceUtilsTest):
-  def testInvalidJson(self):
-    self.assertFalse(self.device.LoadCacheData(''))
-
-  def testTokenMissing(self):
-    with self.assertCalls(self.EnsureCacheInitialized()):
-      self.assertFalse(self.device.LoadCacheData('{}'))
-
-  def testTokenStale(self):
-    with self.assertCalls(self.EnsureCacheInitialized()):
-      self.assertFalse(self.device.LoadCacheData('{"token":"foo"}'))
-
-  def testTokenMatches(self):
-    with self.assertCalls(self.EnsureCacheInitialized()):
-      self.assertTrue(self.device.LoadCacheData('{"token":"TOKEN"}'))
-
-  def testDumpThenLoad(self):
-    with self.assertCalls(self.EnsureCacheInitialized()):
-      data = json.loads(self.device.DumpCacheData())
-      data['token'] = 'TOKEN'
-      self.assertTrue(self.device.LoadCacheData(json.dumps(data)))
-
-
-class DeviceUtilsGetIMEITest(DeviceUtilsTest):
-  def testSuccessfulDumpsys(self):
-    dumpsys_output = ('Phone Subscriber Info:'
-                      '  Phone Type = GSM'
-                      '  Device ID = 123454321')
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.adb.Shell('dumpsys iphonesubinfo'), dumpsys_output)):
-      self.assertEquals(self.device.GetIMEI(), '123454321')
-
-  def testSuccessfulServiceCall(self):
-    service_output = """
-        Result: Parcel(\n'
-          0x00000000: 00000000 0000000f 00350033 00360033 '........7.6.5.4.'
-          0x00000010: 00360032 00370030 00300032 00300039 '3.2.1.0.1.2.3.4.'
-          0x00000020: 00380033 00000039                   '5.6.7...        ')
-    """
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '24'),
-        (self.call.adb.Shell('service call iphonesubinfo 1'), service_output)):
-      self.assertEquals(self.device.GetIMEI(), '765432101234567')
-
-  def testNoIMEI(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.adb.Shell('dumpsys iphonesubinfo'), 'no device id')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetIMEI()
-
-  def testAdbError(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '24'),
-        (self.call.adb.Shell('service call iphonesubinfo 1'),
-         self.ShellError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetIMEI()
-
-
-class DeviceUtilsChangeOwner(DeviceUtilsTest):
-  def testChangeOwner(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['chown', 'user.group', '/path/to/file1', 'file2'],
-            check_return=True))):
-      self.device.ChangeOwner('user.group', ['/path/to/file1', 'file2'])
-
-
-class DeviceUtilsChangeSecurityContext(DeviceUtilsTest):
-  def testChangeSecurityContext(self):
-    with self.assertCalls((self.call.device.RunShellCommand(
-        ['chcon', 'u:object_r:system_data_file:s0', '/path', '/path2'],
-        as_root=device_utils._FORCE_SU,
-        check_return=True))):
-      self.device.ChangeSecurityContext('u:object_r:system_data_file:s0',
-                                        ['/path', '/path2'])
-
-
-class DeviceUtilsLocale(DeviceUtilsTest):
-  def testLocaleLegacy(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('persist.sys.locale', cache=False), ''),
-        (self.call.device.GetProp('persist.sys.language', cache=False), 'en'),
-        (self.call.device.GetProp('persist.sys.country', cache=False), 'US')):
-      self.assertEquals(self.device.GetLocale(), ('en', 'US'))
-
-  def testLocale(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('persist.sys.locale', cache=False), 'en-US'),
-        (self.call.device.GetProp('persist.sys.locale', cache=False),
-         'en-US-sw')):
-      self.assertEquals(self.device.GetLocale(), ('en', 'US'))
-      self.assertEquals(self.device.GetLocale(), ('en', 'US-sw'))
-
-  def testBadLocale(self):
-    with self.assertCalls((self.call.device.GetProp(
-        'persist.sys.locale', cache=False), 'en')):
-      self.assertEquals(self.device.GetLocale(), ('', ''))
-
-  def testLanguageAndCountryLegacy(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('persist.sys.locale', cache=False), ''),
-        (self.call.device.GetProp('persist.sys.language', cache=False), 'en'),
-        (self.call.device.GetProp('persist.sys.country', cache=False), 'US'),
-        (self.call.device.GetProp('persist.sys.locale', cache=False), ''),
-        (self.call.device.GetProp('persist.sys.language', cache=False), 'en'),
-        (self.call.device.GetProp('persist.sys.country', cache=False), 'US')):
-      self.assertEquals(self.device.GetLanguage(), 'en')
-      self.assertEquals(self.device.GetCountry(), 'US')
-
-  def testLanguageAndCountry(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('persist.sys.locale', cache=False), 'en-US'),
-        (self.call.device.GetProp('persist.sys.locale', cache=False), 'en-US')):
-      self.assertEquals(self.device.GetLanguage(), 'en')
-      self.assertEquals(self.device.GetCountry(), 'US')
-
-
-class IterPushableComponentsTest(unittest.TestCase):
-  @classmethod
-  @contextlib.contextmanager
-  def sampleLayout(cls):
-    Layout = collections.namedtuple('Layout', [
-        'root', 'basic_file', 'symlink_file', 'symlink_dir',
-        'dir_with_symlinks', 'dir_without_symlinks'
-    ])
-
-    with tempfile_ext.NamedTemporaryDirectory() as layout_root:
-      dir1 = os.path.join(layout_root, 'dir1')
-      os.makedirs(dir1)
-
-      basic_file = os.path.join(dir1, 'file1.txt')
-      with open(basic_file, 'w') as f:
-        f.write('hello world')
-
-      symlink = os.path.join(dir1, 'symlink.txt')
-      os.symlink(basic_file, symlink)
-
-      dir2 = os.path.join(layout_root, 'dir2')
-      os.makedirs(dir2)
-
-      with open(os.path.join(dir2, 'file2.txt'), 'w') as f:
-        f.write('goodnight moon')
-
-      symlink_dir = os.path.join(layout_root, 'dir3')
-      os.symlink(dir2, symlink_dir)
-
-      yield Layout(layout_root, basic_file, symlink, symlink_dir, dir1, dir2)
-
-  def safeAssertItemsEqual(self, expected, actual):
-    if six.PY2:
-      self.assertItemsEqual(expected, actual)
-    else:
-      self.assertCountEqual(expected, actual) # pylint: disable=no-member
-
-  def testFile(self):
-    with self.sampleLayout() as layout:
-      device_path = '/sdcard/basic_file'
-
-      expected = [(layout.basic_file, device_path, True)]
-      actual = list(
-          device_utils._IterPushableComponents(layout.basic_file, device_path))
-      self.safeAssertItemsEqual(expected, actual)
-
-  def testSymlinkFile(self):
-    with self.sampleLayout() as layout:
-      device_path = '/sdcard/basic_symlink'
-
-      expected = [(os.path.realpath(layout.symlink_file), device_path, False)]
-      actual = list(
-          device_utils._IterPushableComponents(layout.symlink_file,
-                                               device_path))
-      self.safeAssertItemsEqual(expected, actual)
-
-  def testDirectoryWithNoSymlink(self):
-    with self.sampleLayout() as layout:
-      device_path = '/sdcard/basic_directory'
-
-      expected = [(layout.dir_without_symlinks, device_path, True)]
-      actual = list(
-          device_utils._IterPushableComponents(layout.dir_without_symlinks,
-                                               device_path))
-      self.safeAssertItemsEqual(expected, actual)
-
-  def testDirectoryWithSymlink(self):
-    with self.sampleLayout() as layout:
-      device_path = '/sdcard/directory'
-
-      expected = [
-          (layout.basic_file,
-           posixpath.join(device_path, os.path.basename(layout.basic_file)),
-           True),
-          (os.path.realpath(layout.symlink_file),
-           posixpath.join(device_path, os.path.basename(layout.symlink_file)),
-           False),
-      ]
-      actual = list(
-          device_utils._IterPushableComponents(layout.dir_with_symlinks,
-                                               device_path))
-      self.safeAssertItemsEqual(expected, actual)
-
-  def testSymlinkDirectory(self):
-    with self.sampleLayout() as layout:
-      device_path = '/sdcard/directory'
-
-      expected = [(os.path.realpath(layout.symlink_dir), device_path, False)]
-      actual = list(
-          device_utils._IterPushableComponents(layout.symlink_dir, device_path))
-      self.safeAssertItemsEqual(expected, actual)
-
-  def testDirectoryWithNestedSymlink(self):
-    with self.sampleLayout() as layout:
-      device_path = '/sdcard/directory'
-
-      expected = [
-          (layout.dir_without_symlinks,
-           posixpath.join(device_path,
-                          os.path.basename(layout.dir_without_symlinks)), True),
-          (layout.basic_file,
-           posixpath.join(
-               device_path,
-               *os.path.split(os.path.relpath(layout.basic_file, layout.root))),
-           True),
-          (os.path.realpath(layout.symlink_file),
-           posixpath.join(
-               device_path,
-               *os.path.split(
-                   os.path.relpath(layout.symlink_file, layout.root))), False),
-          (os.path.realpath(layout.symlink_dir),
-           posixpath.join(
-               device_path,
-               *os.path.split(os.path.relpath(layout.symlink_dir,
-                                              layout.root))), False),
-      ]
-      actual = list(
-          device_utils._IterPushableComponents(layout.root, device_path))
-      self.safeAssertItemsEqual(expected, actual)
-
-
-class DeviceUtilsGetTracingPathTest(DeviceUtilsTest):
-  def testGetTracingPath_hasDebugfs(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['mount'], retries=0,
-                                          timeout=10, check_return=True),
-        ['debugfs on /sys/kernel/debug', 'proc on /proc'])):
-      self.assertEquals('/sys/kernel/debug/tracing',
-                        self.device.GetTracingPath())
-
-  def testGetTracingPath_noDebugfs(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(['mount'], retries=0,
-                                          timeout=10, check_return=True),
-        ['proc on /proc'])):
-      self.assertEquals('/sys/kernel/tracing', self.device.GetTracingPath())
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/fastboot_utils.py b/systrace/catapult/devil/devil/android/fastboot_utils.py
deleted file mode 100644
index d8ca7d2..0000000
--- a/systrace/catapult/devil/devil/android/fastboot_utils.py
+++ /dev/null
@@ -1,374 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provides a variety of device interactions based on fastboot."""
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import fnmatch
-import logging
-import os
-import re
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.sdk import fastboot
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-_KNOWN_PARTITIONS = collections.OrderedDict([
-    ('bootloader', {
-        'image': 'bootloader*.img',
-        'restart': True
-    }),
-    ('radio', {
-        'image': 'radio*.img',
-        'restart': True
-    }),
-    ('boot', {
-        'image': 'boot.img'
-    }),
-    # recovery.img moved into boot.img for A/B devices. See:
-    # https://source.android.com/devices/tech/ota/ab/ab_implement#recovery
-    ('recovery', {
-        'image': 'recovery.img',
-        'optional': lambda fu: fu.supports_ab
-    }),
-    ('system', {
-        'image': 'system.img'
-    }),
-    ('userdata', {
-        'image': 'userdata.img',
-        'wipe_only': True
-    }),
-    # cache.img deprecated for A/B devices. See:
-    # https://source.android.com/devices/tech/ota/ab/ab_implement#cache
-    ('cache', {
-        'image': 'cache.img',
-        'wipe_only': True,
-        'optional': lambda fu: fu.supports_ab
-    }),
-    ('vendor', {
-        'image': 'vendor*.img',
-        'optional': lambda _: True
-    }),
-    ('dtbo', {
-        'image': 'dtbo.img',
-        'optional': lambda fu: not fu.requires_dtbo
-    }),
-    ('vbmeta', {
-        'image': 'vbmeta.img',
-        'optional': lambda fu: not fu.requires_vbmeta
-    }),
-])
-ALL_PARTITIONS = _KNOWN_PARTITIONS.keys()
-
-
-class FastbootUtils(object):
-
-  _FASTBOOT_WAIT_TIME = 1
-  _BOARD_VERIFICATION_FILE = 'android-info.txt'
-
-  def __init__(self,
-               device=None,
-               fastbooter=None,
-               default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """FastbootUtils constructor.
-
-    Example Usage to flash a device:
-      fastboot = fastboot_utils.FastbootUtils(device)
-      fastboot.FlashDevice('/path/to/build/directory')
-
-    Args:
-      device: A DeviceUtils instance. Optional if a Fastboot instance was
-        passed.
-      fastbooter: A fastboot.Fastboot instance. Optional if a DeviceUtils
-        instance was passed.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-    """
-    if not device and not fastbooter:
-      raise ValueError("One of 'device' or 'fastbooter' must be passed.")
-
-    if device:
-      self._device = device
-      self._serial = str(device)
-      self._board = device.product_board
-      if not fastbooter:
-        self.fastboot = fastboot.Fastboot(self._serial)
-
-    if fastbooter:
-      self._serial = str(fastbooter)
-      self.fastboot = fastbooter
-      self._board = fastbooter.GetVar('product')
-      if not device:
-        self._device = device_utils.DeviceUtils(self._serial)
-
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-    self._supports_ab = None
-    self._requires_dtbo = None
-    self._requires_vbmeta = None
-
-  @property
-  def supports_ab(self):
-    """returns boolean to indicate if a device supports A/B updates.
-
-    It appears that boards which support A/B updates have different partition
-    requirements when flashing.
-    """
-    if self._supports_ab is None:
-      if self.IsFastbootMode():
-        try:
-          # According to https://bit.ly/2XIuICQ, slot-count is used to
-          # determine if a device supports A/B updates.
-          slot_count = self.fastboot.GetVar('slot-count') or '0'
-          self._supports_ab = int(slot_count) >= 2
-        except device_errors.FastbootCommandFailedError:
-          self._supports_ab = False
-      else:
-        # According to https://bit.ly/2UlJkGa and https://bit.ly/2MG8CL0,
-        # the property 'ro.build.ab_update' will be defined if the device
-        # supports A/B system updates.
-        self._supports_ab = self._device.GetProp('ro.build.ab_update') == 'true'
-
-    return self._supports_ab
-
-  @property
-  def requires_dtbo(self):
-    if self._requires_dtbo is None:
-      if self.IsFastbootMode():
-        try:
-          self._requires_dtbo = self.fastboot.GetVar('has-slot:dtbo') == 'yes'
-        except device_errors.FastbootCommandFailedError:
-          self._requires_dtbo = False
-      else:
-        # This prop will be set when a device supports dtbo.
-        # See https://bit.ly/2VUjBp0.
-        # Checking if this prop has a non-empty value should be good enough.
-        self._requires_dtbo = len(self._device.GetProp('ro.boot.dtbo_idx')) > 0
-
-    return self._requires_dtbo
-
-  @property
-  def requires_vbmeta(self):
-    if self._requires_vbmeta is None:
-      if self.IsFastbootMode():
-        try:
-          self._requires_vbmeta = self.fastboot.GetVar(
-              'has-slot:vbmeta') == 'yes'
-        except device_errors.FastbootCommandFailedError:
-          self._requires_vbmeta = False
-      else:
-        # This prop will be set when a device uses Android Verified Boot (avb).
-        # See https://bit.ly/2CbsO5z.
-        # Checking if this prop has a non-empty value should be good enough.
-        self._requires_vbmeta = len(
-            self._device.GetProp('ro.boot.vbmeta.digest')) > 0
-
-    return self._requires_vbmeta
-
-  def IsFastbootMode(self):
-    return self._serial in (str(d) for d in self.fastboot.Devices())
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WaitForFastbootMode(self, timeout=None, retries=None):
-    """Wait for device to boot into fastboot mode.
-
-    This waits for the device serial to show up in fastboot devices output.
-    """
-    timeout_retry.WaitFor(self.IsFastbootMode,
-                          wait_period=self._FASTBOOT_WAIT_TIME)
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
-  def EnableFastbootMode(self, timeout=None, retries=None):
-    """Reboots phone into fastboot mode.
-
-    Roots phone if needed, then reboots phone into fastboot mode and waits.
-    """
-    if self.IsFastbootMode():
-      return
-    self._device.EnableRoot()
-    self._device.adb.Reboot(to_bootloader=True)
-    self.WaitForFastbootMode()
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
-  def Reboot(self,
-             bootloader=False,
-             wait_for_reboot=True,
-             timeout=None,
-             retries=None):
-    """Reboots out of fastboot mode.
-
-    It reboots the phone either back into fastboot, or to a regular boot. It
-    then blocks until the device is ready.
-
-    Args:
-      bootloader: If set to True, reboots back into bootloader.
-    """
-    if bootloader:
-      self.fastboot.RebootBootloader()
-      self.WaitForFastbootMode()
-    else:
-      self.fastboot.Reboot()
-      if wait_for_reboot:
-        self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT)
-
-  def _VerifyBoard(self, directory):
-    """Validate as best as possible that the android build matches the device.
-
-    Goes through build files and checks if the board name is mentioned in the
-    |self._BOARD_VERIFICATION_FILE| or in the build archive.
-
-    Args:
-      directory: directory where build files are located.
-    """
-    files = os.listdir(directory)
-    board_regex = re.compile(r'require board=([\w|]+)')
-    if self._BOARD_VERIFICATION_FILE in files:
-      with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f:
-        for line in f:
-          m = board_regex.match(line)
-          if m and m.group(1):
-            return self._board in m.group(1).split('|')
-          else:
-            logger.warning('No board type found in %s.',
-                           self._BOARD_VERIFICATION_FILE)
-    else:
-      logger.warning('%s not found. Unable to use it to verify device.',
-                     self._BOARD_VERIFICATION_FILE)
-
-    zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board))
-    for f in files:
-      if zip_regex.match(f):
-        return True
-
-    return False
-
-  def _FlashPartitions(self, partitions, directory, wipe=False, force=False):
-    """Flashes all given partiitons with all given images.
-
-    Args:
-      partitions: List of partitions to flash.
-      directory: Directory where all partitions can be found.
-      wipe: If set to true, will automatically detect if cache and userdata
-          partitions are sent, and if so ignore them.
-      force: boolean to decide to ignore board name safety checks.
-
-    Raises:
-      device_errors.CommandFailedError(): If image cannot be found or if bad
-          partition name is give.
-    """
-    if not self._VerifyBoard(directory):
-      if force:
-        logger.warning('Could not verify build is meant to be installed on '
-                       'the current device type, but force flag is set. '
-                       'Flashing device. Possibly dangerous operation.')
-      else:
-        raise device_errors.CommandFailedError(
-            'Could not verify build is meant to be installed on the current '
-            'device type. Run again with force=True to force flashing with an '
-            'unverified board.')
-
-    flash_image_files = self._FindAndVerifyPartitionsAndImages(
-        partitions, directory)
-    partitions = flash_image_files.keys()
-    for partition in partitions:
-      if _KNOWN_PARTITIONS[partition].get('wipe_only') and not wipe:
-        logger.info('Not flashing in wipe mode. Skipping partition %s.',
-                    partition)
-      else:
-        logger.info('Flashing %s with %s', partition,
-                    flash_image_files[partition])
-        self.fastboot.Flash(partition, flash_image_files[partition])
-        if _KNOWN_PARTITIONS[partition].get('restart', False):
-          self.Reboot(bootloader=True)
-
-  def _FindAndVerifyPartitionsAndImages(self, partitions, directory):
-    """Validate partitions and images.
-
-    Validate all partition names and partition directories. Cannot stop mid
-    flash so its important to validate everything first.
-
-    Args:
-      Partitions: partitions to be tested.
-      directory: directory containing the images.
-
-    Returns:
-      Dictionary with exact partition, image name mapping.
-    """
-
-    files = os.listdir(directory)
-    return_dict = collections.OrderedDict()
-
-    def find_file(pattern):
-      for filename in files:
-        if fnmatch.fnmatch(filename, pattern):
-          return os.path.join(directory, filename)
-      return None
-
-    for partition in partitions:
-      partition_info = _KNOWN_PARTITIONS[partition]
-      image_file = find_file(partition_info['image'])
-      if image_file:
-        return_dict[partition] = image_file
-      elif (not 'optional' in partition_info
-            or not partition_info['optional'](self)):
-        raise device_errors.FastbootCommandFailedError(
-            [],
-            '',
-            message='Failed to flash device%s. Could not find image for %s.' %
-            (' which supports A/B updates' if self.supports_ab else '',
-             partition_info['image']))
-    return return_dict
-
-  @contextlib.contextmanager
-  def FastbootMode(self, wait_for_reboot=True, timeout=None, retries=None):
-    """Context manager that enables fastboot mode, and reboots after.
-
-    Example usage:
-      with FastbootMode():
-        Flash Device
-      # Anything that runs after flashing.
-    """
-    self.EnableFastbootMode()
-    self.fastboot.SetOemOffModeCharge(False)
-    yield self
-    # If something went wrong while it was in fastboot mode (eg: a failed
-    # flash) rebooting may be harmful or cause boot loops. So only reboot if
-    # no exception was thrown.
-    self.fastboot.SetOemOffModeCharge(True)
-    self.Reboot(wait_for_reboot=wait_for_reboot)
-
-  def FlashDevice(self, directory, partitions=None, wipe=False):
-    """Flash device with build in |directory|.
-
-    Directory must contain bootloader, radio, boot, recovery, system, userdata,
-    and cache .img files from an android build. This is a dangerous operation so
-    use with care.
-
-    Args:
-      directory: Directory with build files.
-      wipe: Wipes cache and userdata if set to true.
-      partitions: List of partitions to flash. Defaults to all.
-    """
-    if partitions is None:
-      partitions = ALL_PARTITIONS
-    # If a device is wiped, then it will no longer have adb keys so it cannot be
-    # communicated with to verify that it is rebooted. It is up to the user of
-    # this script to ensure that the adb keys are set on the device after using
-    # this to wipe a device.
-    with self.FastbootMode(wait_for_reboot=not wipe):
-      self._FlashPartitions(partitions, directory, wipe=wipe)
diff --git a/systrace/catapult/devil/devil/android/fastboot_utils_test.py b/systrace/catapult/devil/devil/android/fastboot_utils_test.py
deleted file mode 100755
index ed89139..0000000
--- a/systrace/catapult/devil/devil/android/fastboot_utils_test.py
+++ /dev/null
@@ -1,541 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of fastboot_utils.py
-"""
-
-# pylint: disable=protected-access,unused-argument
-
-import collections
-import io
-import logging
-import unittest
-
-import six
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import fastboot_utils
-from devil.android.sdk import fastboot
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-_BOARD = 'board_type'
-_SERIAL = '0123456789abcdef'
-_PARTITIONS = [
-    'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata', 'cache'
-]
-_IMAGES = collections.OrderedDict([
-    ('bootloader', 'bootloader.img'),
-    ('radio', 'radio.img'),
-    ('boot', 'boot.img'),
-    ('recovery', 'recovery.img'),
-    ('system', 'system.img'),
-    ('userdata', 'userdata.img'),
-    ('cache', 'cache.img'),
-])
-_VALID_FILES = [_BOARD + '.zip', 'android-info.txt']
-_INVALID_FILES = ['test.zip', 'android-info.txt']
-
-
-class MockFile(object):
-  def __init__(self, name='/tmp/some/file'):
-    self.file = mock.MagicMock(spec=file)
-    self.file.name = name
-
-  def __enter__(self):
-    return self.file
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    pass
-
-  @property
-  def name(self):
-    return self.file.name
-
-
-def _FastbootWrapperMock(test_serial):
-  fastbooter = mock.Mock(spec=fastboot.Fastboot)
-  fastbooter.__str__ = mock.Mock(return_value=test_serial)
-  fastbooter.Devices.return_value = [test_serial]
-  return fastbooter
-
-
-def _DeviceUtilsMock(test_serial):
-  device = mock.Mock(spec=device_utils.DeviceUtils)
-  device.__str__ = mock.Mock(return_value=test_serial)
-  device.product_board = mock.Mock(return_value=_BOARD)
-  device.adb = mock.Mock()
-  return device
-
-
-class FastbootUtilsTest(mock_calls.TestCase):
-  def setUp(self):
-    self.device_utils_mock = _DeviceUtilsMock(_SERIAL)
-    self.fastboot_wrapper = _FastbootWrapperMock(_SERIAL)
-    self.fastboot = fastboot_utils.FastbootUtils(
-        device=self.device_utils_mock,
-        fastbooter=self.fastboot_wrapper,
-        default_timeout=2,
-        default_retries=0)
-    self.fastboot._board = _BOARD
-
-  def FastbootCommandFailedError(self,
-                                 args=None,
-                                 output=None,
-                                 status=None,
-                                 msg=None):
-    return mock.Mock(side_effect=device_errors.FastbootCommandFailedError(
-        args, output, status, msg, str(self.device_utils_mock)))
-
-
-class FastbootUtilsInitTest(FastbootUtilsTest):
-  def testInitWithDeviceUtil(self):
-    f = fastboot_utils.FastbootUtils(self.device_utils_mock)
-    self.assertEqual(str(self.device_utils_mock), str(f._device))
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(ValueError):
-      fastboot_utils.FastbootUtils(device=None, fastbooter=None)
-    with self.assertRaises(AttributeError):
-      fastboot_utils.FastbootUtils('abc')
-
-
-class FastbootUtilsWaitForFastbootMode(FastbootUtilsTest):
-
-  # If this test fails by timing out after 1 second.
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForFastbootMode(self):
-    self.fastboot.WaitForFastbootMode()
-
-
-class FastbootUtilsIsFastbootMode(FastbootUtilsTest):
-  def testIsFastbootMode_True(self):
-    self.assertEqual(True, self.fastboot.IsFastbootMode())
-
-  def testIsFastbootMode_False(self):
-    self.fastboot._serial = 'not' + _SERIAL
-    self.assertEqual(False, self.fastboot.IsFastbootMode())
-
-
-class FastbootUtils_supports_ab(FastbootUtilsTest):
-  def test_supports_ab_fastboot_True(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('slot-count'), '2')):
-      self.assertEqual(True, self.fastboot.supports_ab)
-
-  def test_supports_ab_fastboot_False(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('slot-count'), '1')):
-      self.assertEqual(False, self.fastboot.supports_ab)
-
-  def test_supports_ab_fastboot_FalseWithEmpty(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('slot-count'), '')):
-      self.assertEqual(False, self.fastboot.supports_ab)
-
-  def test_supports_ab_fastboot_FalseWithError(self):
-    with self.assertCalls((self.call.fastboot.IsFastbootMode(), True),
-                          (self.call.fastboot.fastboot.GetVar('slot-count'),
-                           self.FastbootCommandFailedError([], ''))):
-      self.assertEqual(False, self.fastboot.supports_ab)
-
-  def test_supports_ab_device_True(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        (self.call.fastboot._device.GetProp('ro.build.ab_update'), 'true')):
-      self.assertEqual(True, self.fastboot.supports_ab)
-
-  def test_supports_ab_device_False(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        (self.call.fastboot._device.GetProp('ro.build.ab_update'), '')):
-      self.assertEqual(False, self.fastboot.supports_ab)
-
-
-class FastbootUtils_requires_dtbo(FastbootUtilsTest):
-  def test_requires_dtbo_fastboot_True(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('has-slot:dtbo'), 'yes')):
-      self.assertEqual(True, self.fastboot.requires_dtbo)
-
-  def test_requires_dtbo_fastboot_FalseWithEmpty(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('has-slot:dtbo'), '')):
-      self.assertEqual(False, self.fastboot.requires_dtbo)
-
-  def test_requires_dtbo_fastboot_FalseWithError(self):
-    with self.assertCalls((self.call.fastboot.IsFastbootMode(), True),
-                          (self.call.fastboot.fastboot.GetVar('has-slot:dtbo'),
-                           self.FastbootCommandFailedError([], ''))):
-      self.assertEqual(False, self.fastboot.requires_dtbo)
-
-  def test_requires_dtbo_device_True(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        (self.call.fastboot._device.GetProp('ro.boot.dtbo_idx'), '1')):
-      self.assertEqual(True, self.fastboot.requires_dtbo)
-
-  def test_requires_dtbo_device_False(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        (self.call.fastboot._device.GetProp('ro.boot.dtbo_idx'), '')):
-      self.assertEqual(False, self.fastboot.requires_dtbo)
-
-
-class FastbootUtils_requires_vbmeta(FastbootUtilsTest):
-  def test_requires_vbmeta_fastboot_True(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('has-slot:vbmeta'), 'yes')):
-      self.assertEqual(True, self.fastboot.requires_vbmeta)
-
-  def test_requires_vbmeta_fastboot_FalseWithEmpty(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('has-slot:vbmeta'), '')):
-      self.assertEqual(False, self.fastboot.requires_vbmeta)
-
-  def test_requires_vbmeta_fastboot_FalseWithError(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), True),
-        (self.call.fastboot.fastboot.GetVar('has-slot:vbmeta'),
-         self.FastbootCommandFailedError([], ''))):
-      self.assertEqual(False, self.fastboot.requires_vbmeta)
-
-  def test_requires_vbmeta_device_True(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        (self.call.fastboot._device.GetProp('ro.boot.vbmeta.digest'),
-         '1')):
-      self.assertEqual(True, self.fastboot.requires_vbmeta)
-
-  def test_requires_vbmeta_device_False(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        (self.call.fastboot._device.GetProp('ro.boot.vbmeta.digest'), '')):
-      self.assertEqual(False, self.fastboot.requires_vbmeta)
-
-
-class FastbootUtilsEnableFastbootMode(FastbootUtilsTest):
-  def testEnableFastbootMode(self):
-    with self.assertCalls(
-        (self.call.fastboot.IsFastbootMode(), False),
-        self.call.fastboot._device.EnableRoot(),
-        self.call.fastboot._device.adb.Reboot(to_bootloader=True),
-        self.call.fastboot.WaitForFastbootMode()):
-      self.fastboot.EnableFastbootMode()
-
-
-class FastbootUtilsReboot(FastbootUtilsTest):
-  def testReboot_bootloader(self):
-    with self.assertCalls(self.call.fastboot.fastboot.RebootBootloader(),
-                          self.call.fastboot.WaitForFastbootMode()):
-      self.fastboot.Reboot(bootloader=True)
-
-  def testReboot_normal(self):
-    with self.assertCalls(
-        self.call.fastboot.fastboot.Reboot(),
-        self.call.fastboot._device.WaitUntilFullyBooted(timeout=mock.ANY)):
-      self.fastboot.Reboot()
-
-
-class FastbootUtilsFlashPartitions(FastbootUtilsTest):
-  def testFlashPartitions_wipe(self):
-    with self.patch_call(self.call.fastboot.supports_ab, return_value=False):
-      with self.assertCalls(
-          (self.call.fastboot._VerifyBoard('test'), True),
-          (self.call.fastboot._FindAndVerifyPartitionsAndImages(
-              _PARTITIONS, 'test'), _IMAGES),
-          (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
-          (self.call.fastboot.Reboot(bootloader=True)),
-          (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-          (self.call.fastboot.Reboot(bootloader=True)),
-          (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-          (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-          (self.call.fastboot.fastboot.Flash('system', 'system.img')),
-          (self.call.fastboot.fastboot.Flash('userdata', 'userdata.img')),
-          (self.call.fastboot.fastboot.Flash('cache', 'cache.img'))):
-        self.fastboot._FlashPartitions(_PARTITIONS, 'test', wipe=True)
-
-  def testFlashPartitions_noWipe(self):
-    with self.patch_call(self.call.fastboot.supports_ab, return_value=False):
-      with self.assertCalls(
-          (self.call.fastboot._VerifyBoard('test'), True),
-          (self.call.fastboot._FindAndVerifyPartitionsAndImages(
-              _PARTITIONS, 'test'), _IMAGES),
-          (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
-          (self.call.fastboot.Reboot(bootloader=True)),
-          (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-          (self.call.fastboot.Reboot(bootloader=True)),
-          (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-          (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-          (self.call.fastboot.fastboot.Flash('system', 'system.img'))):
-        self.fastboot._FlashPartitions(_PARTITIONS, 'test')
-
-  def testFlashPartitions_AB_device(self):
-    ab_images = _IMAGES.copy()
-    ab_images['dtbo'] = 'dtbo.img'
-    ab_images['vbmeta'] = 'vbmeta.img'
-    ab_partitions = _PARTITIONS[:]
-    ab_partitions.append('dtbo')
-    ab_partitions.append('vbmeta')
-    with self.patch_call(self.call.fastboot.supports_ab, return_value=True):
-      with self.patch_call(self.call.fastboot.requires_dtbo, return_value=True):
-        with self.patch_call(self.call.fastboot.requires_vbmeta,
-                             return_value=True):
-          with self.assertCalls(
-              (self.call.fastboot._VerifyBoard('test'), True),
-              (self.call.fastboot._FindAndVerifyPartitionsAndImages(
-                  ab_partitions, 'test'), ab_images),
-              (self.call.fastboot.fastboot.Flash('bootloader',
-                                                 'bootloader.img')),
-              (self.call.fastboot.Reboot(bootloader=True)),
-              (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-              (self.call.fastboot.Reboot(bootloader=True)),
-              (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-              (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-              (self.call.fastboot.fastboot.Flash('system', 'system.img')),
-              (self.call.fastboot.fastboot.Flash('userdata', 'userdata.img')),
-              (self.call.fastboot.fastboot.Flash('cache', 'cache.img')),
-              (self.call.fastboot.fastboot.Flash('dtbo', 'dtbo.img')),
-              (self.call.fastboot.fastboot.Flash('vbmeta', 'vbmeta.img'))):
-            self.fastboot._FlashPartitions(ab_partitions, 'test', wipe=True)
-
-
-class FastbootUtilsFastbootMode(FastbootUtilsTest):
-  def testFastbootMode_goodWait(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      with self.fastboot.FastbootMode() as fbm:
-        self.assertEqual(self.fastboot, fbm)
-
-  def testFastbootMode_goodNoWait(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=False)):
-      with self.fastboot.FastbootMode(wait_for_reboot=False) as fbm:
-        self.assertEqual(self.fastboot, fbm)
-
-  def testFastbootMode_exception(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False)):
-      with self.assertRaises(NotImplementedError):
-        with self.fastboot.FastbootMode() as fbm:
-          self.assertEqual(self.fastboot, fbm)
-          raise NotImplementedError
-
-  def testFastbootMode_exceptionInEnableFastboot(self):
-    self.fastboot.EnableFastbootMode = mock.Mock()
-    self.fastboot.EnableFastbootMode.side_effect = NotImplementedError
-    with self.assertRaises(NotImplementedError):
-      with self.fastboot.FastbootMode():
-        pass
-
-
-if six.PY2:
-  _BUILTIN_OPEN = '__builtin__.open'
-else:
-  _BUILTIN_OPEN = 'builtins.open'
-
-
-class FastbootUtilsVerifyBoard(FastbootUtilsTest):
-  def testVerifyBoard_bothValid(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_BothNotValid(self):
-    mock_file = io.StringIO(u'abc')
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertFalse(self.assertFalse(self.fastboot._VerifyBoard('test')))
-
-  def testVerifyBoard_FileNotFoundZipValid(self):
-    with mock.patch('os.listdir', return_value=[_BOARD + '.zip']):
-      self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_ZipNotFoundFileValid(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=['android-info.txt']):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_zipNotValidFileIs(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_fileNotValidZipIs(self):
-    mock_file = io.StringIO(u'require board=WrongBoard')
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertFalse(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_noBoardInFileValidZip(self):
-    mock_file = io.StringIO(u'Regex wont match')
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_noBoardInFileInvalidZip(self):
-    mock_file = io.StringIO(u'Regex wont match')
-    with mock.patch(_BUILTIN_OPEN, return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertFalse(self.fastboot._VerifyBoard('test'))
-
-
-class FastbootUtilsFindAndVerifyPartitionsAndImages(FastbootUtilsTest):
-  def testFindAndVerifyPartitionsAndImages_validNoVendor(self):
-    PARTITIONS = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-    files = [
-        'bootloader-test-.img', 'radio123.img', 'boot.img', 'recovery.img',
-        'system.img', 'userdata.img', 'cache.img'
-    ]
-    img_check = collections.OrderedDict([
-        ('bootloader', 'test/bootloader-test-.img'),
-        ('radio', 'test/radio123.img'),
-        ('boot', 'test/boot.img'),
-        ('recovery', 'test/recovery.img'),
-        ('system', 'test/system.img'),
-        ('userdata', 'test/userdata.img'),
-        ('cache', 'test/cache.img'),
-    ])
-    parts_check = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata', 'cache'
-    ]
-    with mock.patch('os.listdir', return_value=files):
-      imgs = self.fastboot._FindAndVerifyPartitionsAndImages(PARTITIONS, 'test')
-      parts = list(imgs.keys())
-      self.assertDictEqual(imgs, img_check)
-      self.assertListEqual(parts, parts_check)
-
-  def testFindAndVerifyPartitionsAndImages_validVendor(self):
-    PARTITIONS = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-    files = [
-        'bootloader-test-.img', 'radio123.img', 'boot.img', 'recovery.img',
-        'system.img', 'userdata.img', 'cache.img', 'vendor.img'
-    ]
-    img_check = {
-        'bootloader': 'test/bootloader-test-.img',
-        'radio': 'test/radio123.img',
-        'boot': 'test/boot.img',
-        'recovery': 'test/recovery.img',
-        'system': 'test/system.img',
-        'userdata': 'test/userdata.img',
-        'cache': 'test/cache.img',
-        'vendor': 'test/vendor.img',
-    }
-    parts_check = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-
-    with mock.patch('os.listdir', return_value=files):
-      with self.patch_call(self.call.fastboot.supports_ab, return_value=False):
-        imgs = self.fastboot._FindAndVerifyPartitionsAndImages(
-            PARTITIONS, 'test')
-        parts = list(imgs.keys())
-        self.assertDictEqual(imgs, img_check)
-        self.assertListEqual(parts, parts_check)
-
-  def testFindAndVerifyPartitionsAndImages_badPartition(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.patch_call(self.call.fastboot.supports_ab, return_value=False):
-        with self.assertRaises(KeyError):
-          self.fastboot._FindAndVerifyPartitionsAndImages(['test'], 'test')
-
-  def testFindAndVerifyPartitionsAndImages_noFile_RequiredImage(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.patch_call(self.call.fastboot.supports_ab, return_value=False):
-        with self.assertRaises(device_errors.FastbootCommandFailedError):
-          self.fastboot._FindAndVerifyPartitionsAndImages(['boot'], 'test')
-
-  def testFindAndVerifyPartitionsAndImages_noFile_RequiredImageAB(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.patch_call(self.call.fastboot.supports_ab, return_value=True):
-        with self.assertRaises(device_errors.FastbootCommandFailedError):
-          self.fastboot._FindAndVerifyPartitionsAndImages(['boot'], 'test')
-
-  def testFindAndVerifyPartitionsAndImages_noFile_NotRequiredImage(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.patch_call(self.call.fastboot.supports_ab, return_value=False):
-        with self.patch_call(self.call.fastboot.requires_dtbo,
-                             return_value=False):
-          self.assertFalse(
-              self.fastboot._FindAndVerifyPartitionsAndImages(['vendor'],
-                                                              'test'))
-          self.assertFalse(
-              self.fastboot._FindAndVerifyPartitionsAndImages(['dtbo'], 'test'))
-
-  def testFindAndVerifyPartitionsAndImages_noFile_NotRequiredImageAB(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.patch_call(self.call.fastboot.supports_ab, return_value=True):
-        with self.patch_call(self.call.fastboot.requires_dtbo,
-                             return_value=False):
-          self.assertFalse(
-              self.fastboot._FindAndVerifyPartitionsAndImages(['vendor'],
-                                                              'test'))
-          self.assertFalse(
-              self.fastboot._FindAndVerifyPartitionsAndImages(['cache'],
-                                                              'test'))
-          self.assertFalse(
-              self.fastboot._FindAndVerifyPartitionsAndImages(['dtbo'], 'test'))
-
-
-class FastbootUtilsFlashDevice(FastbootUtilsTest):
-  def testFlashDevice_wipe(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=True),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=False)):
-      self.fastboot.FlashDevice('test', wipe=True)
-
-  def testFlashDevice_noWipe(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      self.fastboot.FlashDevice('test', wipe=False)
-
-  def testFlashDevice_partitions(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(['boot'], 'test', wipe=False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      self.fastboot.FlashDevice('test', partitions=['boot'], wipe=False)
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/flag_changer.py b/systrace/catapult/devil/devil/android/flag_changer.py
deleted file mode 100644
index 5dabc4c..0000000
--- a/systrace/catapult/devil/devil/android/flag_changer.py
+++ /dev/null
@@ -1,326 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import logging
-import posixpath
-import re
-
-from devil.android.sdk import version_codes
-
-logger = logging.getLogger(__name__)
-
-_CMDLINE_DIR = '/data/local/tmp'
-_CMDLINE_DIR_LEGACY = '/data/local'
-_RE_NEEDS_QUOTING = re.compile(r'[^\w-]')  # Not in: alphanumeric or hyphens.
-_QUOTES = '"\''  # Either a single or a double quote.
-_ESCAPE = '\\'  # A backslash.
-
-
-@contextlib.contextmanager
-def CustomCommandLineFlags(device, cmdline_name, flags):
-  """Context manager to change Chrome's command line temporarily.
-
-  Example:
-
-      with flag_changer.TemporaryCommandLineFlags(device, name, flags):
-        # Launching Chrome will use the provided flags.
-
-      # Previous set of flags on the device is now restored.
-
-  Args:
-    device: A DeviceUtils instance.
-    cmdline_name: Name of the command line file where to store flags.
-    flags: A sequence of command line flags to set.
-  """
-  changer = FlagChanger(device, cmdline_name)
-  try:
-    changer.ReplaceFlags(flags)
-    yield
-  finally:
-    changer.Restore()
-
-
-class FlagChanger(object):
-  """Changes the flags Chrome runs with.
-
-    Flags can be temporarily set for a particular set of unit tests.  These
-    tests should call Restore() to revert the flags to their original state
-    once the tests have completed.
-  """
-
-  def __init__(self, device, cmdline_file, use_legacy_path=False):
-    """Initializes the FlagChanger and records the original arguments.
-
-    Args:
-      device: A DeviceUtils instance.
-      cmdline_file: Name of the command line file where to store flags.
-      use_legacy_path: Whether to use the legacy commandline path (needed for
-        M54 and earlier)
-    """
-    self._device = device
-    self._should_reset_enforce = False
-
-    if posixpath.sep in cmdline_file:
-      raise ValueError(
-          'cmdline_file should be a file name only, do not include path'
-          ' separators in: %s' % cmdline_file)
-    cmdline_path = posixpath.join(_CMDLINE_DIR, cmdline_file)
-    alternate_cmdline_path = posixpath.join(_CMDLINE_DIR_LEGACY, cmdline_file)
-
-    if use_legacy_path:
-      cmdline_path, alternate_cmdline_path = (alternate_cmdline_path,
-                                              cmdline_path)
-      if not self._device.HasRoot():
-        raise ValueError('use_legacy_path requires a rooted device')
-    self._cmdline_path = cmdline_path
-
-    if self._device.PathExists(alternate_cmdline_path):
-      logger.warning('Removing alternate command line file %r.',
-                     alternate_cmdline_path)
-      self._device.RemovePath(alternate_cmdline_path, as_root=True)
-
-    self._state_stack = [None]  # Actual state is set by GetCurrentFlags().
-    self.GetCurrentFlags()
-
-  def GetCurrentFlags(self):
-    """Read the current flags currently stored in the device.
-
-    Also updates the internal state of the flag_changer.
-
-    Returns:
-      A list of flags.
-    """
-    if self._device.PathExists(self._cmdline_path):
-      command_line = self._device.ReadFile(
-          self._cmdline_path, as_root=True).strip()
-    else:
-      command_line = ''
-    flags = _ParseFlags(command_line)
-
-    # Store the flags as a set to facilitate adding and removing flags.
-    self._state_stack[-1] = set(flags)
-    return flags
-
-  def ReplaceFlags(self, flags, log_flags=True):
-    """Replaces the flags in the command line with the ones provided.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to ReplaceFlags.
-
-    Args:
-      flags: A sequence of command line flags to set, eg. ['--single-process'].
-             Note: this should include flags only, not the name of a command
-             to run (ie. there is no need to start the sequence with 'chrome').
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    new_flags = set(flags)
-    self._state_stack.append(new_flags)
-    self._SetPermissive()
-    return self._UpdateCommandLineFile(log_flags=log_flags)
-
-  def AddFlags(self, flags):
-    """Appends flags to the command line if they aren't already there.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to AddFlags.
-
-    Args:
-      flags: A sequence of flags to add on, eg. ['--single-process'].
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    return self.PushFlags(add=flags)
-
-  def RemoveFlags(self, flags):
-    """Removes flags from the command line, if they exist.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to RemoveFlags.
-
-       Note that calling RemoveFlags after AddFlags will result in having
-       two nested states.
-
-    Args:
-      flags: A sequence of flags to remove, eg. ['--single-process'].  Note
-             that we expect a complete match when removing flags; if you want
-             to remove a switch with a value, you must use the exact string
-             used to add it in the first place.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    return self.PushFlags(remove=flags)
-
-  def PushFlags(self, add=None, remove=None):
-    """Appends and removes flags to/from the command line if they aren't already
-       there. Saves the current flags state on the stack, so a call to Restore
-       will change the state back to the one preceeding the call to PushFlags.
-
-    Args:
-      add: A list of flags to add on, eg. ['--single-process'].
-      remove: A list of flags to remove, eg. ['--single-process'].  Note that we
-              expect a complete match when removing flags; if you want to remove
-              a switch with a value, you must use the exact string used to add
-              it in the first place.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    new_flags = self._state_stack[-1].copy()
-    if add:
-      new_flags.update(add)
-    if remove:
-      new_flags.difference_update(remove)
-    return self.ReplaceFlags(new_flags)
-
-  def _SetPermissive(self):
-    """Set SELinux to permissive, if needed.
-
-    On Android N and above this is needed in order to allow Chrome to read the
-    legacy command line file.
-
-    TODO(crbug.com/699082): Remove when a better solution exists.
-    """
-    # TODO(crbug.com/948578): figure out the exact scenarios where the lowered
-    # permissions are needed, and document them in the code.
-    if not self._device.HasRoot():
-      return
-    if (self._device.build_version_sdk >= version_codes.NOUGAT
-        and self._device.GetEnforce()):
-      self._device.SetEnforce(enabled=False)
-      self._should_reset_enforce = True
-
-  def _ResetEnforce(self):
-    """Restore SELinux policy if it had been previously made permissive."""
-    if self._should_reset_enforce:
-      self._device.SetEnforce(enabled=True)
-      self._should_reset_enforce = False
-
-  def Restore(self):
-    """Restores the flags to their state prior to the last AddFlags or
-       RemoveFlags call.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    # The initial state must always remain on the stack.
-    assert len(self._state_stack) > 1, (
-        'Mismatch between calls to Add/RemoveFlags and Restore')
-    self._state_stack.pop()
-    if len(self._state_stack) == 1:
-      self._ResetEnforce()
-    return self._UpdateCommandLineFile()
-
-  def _UpdateCommandLineFile(self, log_flags=True):
-    """Writes out the command line to the file, or removes it if empty.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    command_line = _SerializeFlags(self._state_stack[-1])
-    if command_line is not None:
-      self._device.WriteFile(self._cmdline_path, command_line, as_root=True)
-    else:
-      self._device.RemovePath(self._cmdline_path, force=True, as_root=True)
-
-    flags = self.GetCurrentFlags()
-    logging.info('Flags now written on the device to %s', self._cmdline_path)
-    if log_flags:
-      logging.info('Flags: %s', flags)
-    return flags
-
-
-def _ParseFlags(line):
-  """Parse the string containing the command line into a list of flags.
-
-  It's a direct port of CommandLine.java::tokenizeQuotedArguments.
-
-  The first token is assumed to be the (unused) program name and stripped off
-  from the list of flags.
-
-  Args:
-    line: A string containing the entire command line.  The first token is
-          assumed to be the program name.
-
-  Returns:
-     A list of flags, with quoting removed.
-  """
-  flags = []
-  current_quote = None
-  current_flag = None
-
-  # pylint: disable=unsubscriptable-object
-  for c in line:
-    # Detect start or end of quote block.
-    if (current_quote is None and c in _QUOTES) or c == current_quote:
-      if current_flag is not None and current_flag[-1] == _ESCAPE:
-        # Last char was a backslash; pop it, and treat c as a literal.
-        current_flag = current_flag[:-1] + c
-      else:
-        current_quote = c if current_quote is None else None
-    elif current_quote is None and c.isspace():
-      if current_flag is not None:
-        flags.append(current_flag)
-        current_flag = None
-    else:
-      if current_flag is None:
-        current_flag = ''
-      current_flag += c
-
-  if current_flag is not None:
-    if current_quote is not None:
-      logger.warning('Unterminated quoted argument: ' + current_flag)
-    flags.append(current_flag)
-
-  # Return everything but the program name.
-  return flags[1:]
-
-
-def _SerializeFlags(flags):
-  """Serialize a sequence of flags into a command line string.
-
-  Args:
-    flags: A sequence of strings with individual flags.
-
-  Returns:
-    A line with the command line contents to save; or None if the sequence of
-    flags is empty.
-  """
-  if flags:
-    # The first command line argument doesn't matter as we are not actually
-    # launching the chrome executable using this command line.
-    args = ['_']
-    args.extend(_QuoteFlag(f) for f in flags)
-    return ' '.join(args)
-  else:
-    return None
-
-
-def _QuoteFlag(flag):
-  """Validate and quote a single flag.
-
-  Args:
-    A string with the flag to quote.
-
-  Returns:
-    A string with the flag quoted so that it can be parsed by the algorithm
-    in _ParseFlags; or None if the flag does not appear to be valid.
-  """
-  if '=' in flag:
-    key, value = flag.split('=', 1)
-  else:
-    key, value = flag, None
-
-  if not flag or _RE_NEEDS_QUOTING.search(key):
-    # Probably not a valid flag, but quote the whole thing so it can be
-    # parsed back correctly.
-    return '"%s"' % flag.replace('"', r'\"')
-
-  if value is None:
-    return key
-
-  if _RE_NEEDS_QUOTING.search(value):
-    value = '"%s"' % value.replace('"', r'\"')
-  return '='.join([key, value])
diff --git a/systrace/catapult/devil/devil/android/flag_changer_devicetest.py b/systrace/catapult/devil/devil/android/flag_changer_devicetest.py
deleted file mode 100644
index 4926ae3..0000000
--- a/systrace/catapult/devil/devil/android/flag_changer_devicetest.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of flag_changer.py.
-The test will invoke real devices
-"""
-
-import os
-import posixpath
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(
-          os.path.dirname(__file__),
-          '..',
-          '..',
-      )))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android import flag_changer
-from devil.android.sdk import adb_wrapper
-
-_CMDLINE_FILE = 'dummy-command-line'
-
-
-class FlagChangerTest(device_test_case.DeviceTestCase):
-  def setUp(self):
-    super(FlagChangerTest, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    # pylint: disable=protected-access
-    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
-    self.cmdline_path_legacy = posixpath.join(flag_changer._CMDLINE_DIR_LEGACY,
-                                              _CMDLINE_FILE)
-
-  def tearDown(self):
-    super(FlagChangerTest, self).tearDown()
-    self.device.RemovePath([self.cmdline_path, self.cmdline_path_legacy],
-                           force=True,
-                           as_root=True)
-
-  def testFlagChanger_restoreFlags(self):
-    if not self.device.HasRoot():
-      self.skipTest('Test needs a rooted device')
-
-    # Write some custom chrome command line flags.
-    self.device.WriteFile(self.cmdline_path, 'chrome --some --old --flags')
-
-    # Write some more flags on a command line file in the legacy location.
-    self.device.WriteFile(
-        self.cmdline_path_legacy, 'some --stray --flags', as_root=True)
-    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
-
-    changer = flag_changer.FlagChanger(self.device, _CMDLINE_FILE)
-
-    # Legacy command line file is removed, ensuring Chrome picks up the
-    # right file.
-    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
-
-    # Write some new files, and check they are set.
-    new_flags = ['--my', '--new', '--flags=with special value']
-    self.assertItemsEqual(changer.ReplaceFlags(new_flags), new_flags)
-
-    # Restore and go back to the old flags.
-    self.assertItemsEqual(changer.Restore(), ['--some', '--old', '--flags'])
-
-  def testFlagChanger_removeFlags(self):
-    self.device.RemovePath(self.cmdline_path, force=True)
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-    with flag_changer.CustomCommandLineFlags(self.device, _CMDLINE_FILE,
-                                             ['--some', '--flags']):
-      self.assertTrue(self.device.PathExists(self.cmdline_path))
-
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/flag_changer_test.py b/systrace/catapult/devil/devil/android/flag_changer_test.py
deleted file mode 100755
index 9c155f1..0000000
--- a/systrace/catapult/devil/devil/android/flag_changer_test.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import posixpath
-import unittest
-
-import six
-
-from devil.android import flag_changer
-
-_CMDLINE_FILE = 'chrome-command-line'
-
-
-class _FakeDevice(object):
-  def __init__(self):
-    self.build_type = 'user'
-    self.has_root = True
-    self.file_system = {}
-
-  def HasRoot(self):
-    return self.has_root
-
-  def PathExists(self, filepath):
-    return filepath in self.file_system
-
-  def RemovePath(self, path, **_kwargs):
-    self.file_system.pop(path)
-
-  def WriteFile(self, path, contents, **_kwargs):
-    self.file_system[path] = contents
-
-  def ReadFile(self, path, **_kwargs):
-    return self.file_system[path]
-
-
-class FlagChangerTest(unittest.TestCase):
-  def setUp(self):
-    self.device = _FakeDevice()
-    # pylint: disable=protected-access
-    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
-    self.cmdline_path_legacy = posixpath.join(flag_changer._CMDLINE_DIR_LEGACY,
-                                              _CMDLINE_FILE)
-
-  def testFlagChanger_removeAlternateCmdLine(self):
-    self.device.WriteFile(self.cmdline_path_legacy, 'chrome --old --stuff')
-    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
-
-    changer = flag_changer.FlagChanger(self.device, 'chrome-command-line')
-    self.assertEquals(
-        changer._cmdline_path,  # pylint: disable=protected-access
-        self.cmdline_path)
-    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
-
-  def testFlagChanger_removeAlternateCmdLineLegacyPath(self):
-    self.device.WriteFile(self.cmdline_path, 'chrome --old --stuff')
-    self.assertTrue(self.device.PathExists(self.cmdline_path))
-
-    changer = flag_changer.FlagChanger(
-        self.device, 'chrome-command-line', use_legacy_path=True)
-    self.assertEquals(
-        changer._cmdline_path,  # pylint: disable=protected-access
-        self.cmdline_path_legacy)
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-  def testFlagChanger_mustBeFileName(self):
-    with self.assertRaises(ValueError):
-      flag_changer.FlagChanger(self.device, '/data/local/chrome-command-line')
-
-
-class ParseSerializeFlagsTest(unittest.TestCase):
-  def _testQuoteFlag(self, flag, expected_quoted_flag):
-    # Start with an unquoted flag, check that it's quoted as expected.
-    # pylint: disable=protected-access
-    quoted_flag = flag_changer._QuoteFlag(flag)
-    self.assertEqual(quoted_flag, expected_quoted_flag)
-    # Check that it survives a round-trip.
-    parsed_flags = flag_changer._ParseFlags('_ %s' % quoted_flag)
-    self.assertEqual(len(parsed_flags), 1)
-    self.assertEqual(flag, parsed_flags[0])
-
-  def testQuoteFlag_simple(self):
-    self._testQuoteFlag('--simple-flag', '--simple-flag')
-
-  def testQuoteFlag_withSimpleValue(self):
-    self._testQuoteFlag('--key=value', '--key=value')
-
-  def testQuoteFlag_withQuotedValue1(self):
-    self._testQuoteFlag('--key=valueA valueB', '--key="valueA valueB"')
-
-  def testQuoteFlag_withQuotedValue2(self):
-    self._testQuoteFlag('--key=this "should" work',
-                        r'--key="this \"should\" work"')
-
-  def testQuoteFlag_withQuotedValue3(self):
-    self._testQuoteFlag("--key=this is 'fine' too",
-                        '''--key="this is 'fine' too"''')
-
-  def testQuoteFlag_withQuotedValue4(self):
-    self._testQuoteFlag("--key='I really want to keep these quotes'",
-                        '''--key="'I really want to keep these quotes'"''')
-
-  def testQuoteFlag_withQuotedValue5(self):
-    self._testQuoteFlag("--this is a strange=flag",
-                        '"--this is a strange=flag"')
-
-  def testQuoteFlag_withEmptyValue(self):
-    self._testQuoteFlag('--some-flag=', '--some-flag=')
-
-  def _testParseCmdLine(self, command_line, expected_flags):
-    # Start with a command line, check that flags are parsed as expected.
-    # pylint: disable=protected-access
-    # pylint: disable=no-member
-    flags = flag_changer._ParseFlags(command_line)
-    if six.PY2:
-      self.assertItemsEqual(flags, expected_flags)
-    else:
-      self.assertCountEqual(flags, expected_flags)
-
-    # Check that flags survive a round-trip.
-    # Note: Although new_command_line and command_line may not match, they
-    # should describe the same set of flags.
-    new_command_line = flag_changer._SerializeFlags(flags)
-    new_flags = flag_changer._ParseFlags(new_command_line)
-    if six.PY2:
-      self.assertItemsEqual(new_flags, expected_flags)
-    else:
-      self.assertCountEqual(new_flags, expected_flags)
-
-  def testParseCmdLine_simple(self):
-    self._testParseCmdLine('chrome --foo --bar="a b" --baz=true --fine="ok"',
-                           ['--foo', '--bar=a b', '--baz=true', '--fine=ok'])
-
-  def testParseCmdLine_withFancyQuotes(self):
-    self._testParseCmdLine(
-        r'''_ --foo="this 'is' ok"
-              --bar='this \'is\' too'
-              --baz="this \'is\' tricky"
-        ''', [
-            "--foo=this 'is' ok", "--bar=this 'is' too",
-            r"--baz=this \'is\' tricky"
-        ])
-
-  def testParseCmdLine_withUnterminatedQuote(self):
-    self._testParseCmdLine('_ --foo --bar="I forgot something',
-                           ['--foo', '--bar=I forgot something'])
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/forwarder.py b/systrace/catapult/devil/devil/android/forwarder.py
deleted file mode 100644
index 9b1f82e..0000000
--- a/systrace/catapult/devil/devil/android/forwarder.py
+++ /dev/null
@@ -1,508 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=W0212
-
-import fcntl
-import inspect
-import logging
-import os
-import psutil
-import re
-import textwrap
-
-from devil import base_error
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.constants import file_system
-from devil.android.sdk import adb_wrapper
-from devil.android.valgrind_tools import base_tool
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-# If passed as the device port, this will tell the forwarder to allocate
-# a dynamic port on the device. The actual port can then be retrieved with
-# Forwarder.DevicePortForHostPort.
-DYNAMIC_DEVICE_PORT = 0
-
-PORT_REGEX = re.compile(r'(?P<device_port>\d+):(?P<host_port>\d+)')
-
-
-def _GetProcessStartTime(pid):
-  p = psutil.Process(pid)
-  if inspect.ismethod(p.create_time):
-    return p.create_time()
-  else:  # Process.create_time is a property in old versions of psutil.
-    return p.create_time
-
-
-def _DumpHostLog():
-  # The host forwarder daemon logs to /tmp/host_forwarder_log, so print the end
-  # of that.
-  try:
-    with open('/tmp/host_forwarder_log') as host_forwarder_log:
-      logger.info('Last 50 lines of the host forwarder daemon log:')
-      for line in host_forwarder_log.read().splitlines()[-50:]:
-        logger.info('    %s', line)
-  except Exception:  # pylint: disable=broad-except
-    # Grabbing the host forwarder log is best-effort. Ignore all errors.
-    logger.warning('Failed to get the contents of host_forwarder_log.')
-
-
-def _LogMapFailureDiagnostics(device):
-  _DumpHostLog()
-
-  # The device forwarder daemon logs to the logcat, so print the end of that.
-  try:
-    logger.info('Last 50 lines of logcat:')
-    for logcat_line in device.adb.Logcat(dump=True)[-50:]:
-      logger.info('    %s', logcat_line)
-  except (device_errors.CommandFailedError,
-          device_errors.DeviceUnreachableError):
-    # Grabbing the device forwarder log is also best-effort. Ignore all errors.
-    logger.warning('Failed to get the contents of the logcat.')
-
-  # Log alive device forwarders.
-  try:
-    ps_out = device.RunShellCommand(['ps'], check_return=True)
-    logger.info('Currently running device_forwarders:')
-    for line in ps_out:
-      if 'device_forwarder' in line:
-        logger.info('    %s', line)
-  except (device_errors.CommandFailedError,
-          device_errors.DeviceUnreachableError):
-    logger.warning('Failed to list currently running device_forwarder '
-                   'instances.')
-
-
-class _FileLock(object):
-  """With statement-aware implementation of a file lock.
-
-  File locks are needed for cross-process synchronization when the
-  multiprocessing Python module is used.
-  """
-
-  def __init__(self, path):
-    self._fd = -1
-    self._path = path
-
-  def __enter__(self):
-    self._fd = os.open(self._path, os.O_RDONLY | os.O_CREAT)
-    if self._fd < 0:
-      raise Exception('Could not open file %s for reading' % self._path)
-    fcntl.flock(self._fd, fcntl.LOCK_EX)
-
-  def __exit__(self, _exception_type, _exception_value, traceback):
-    fcntl.flock(self._fd, fcntl.LOCK_UN)
-    os.close(self._fd)
-
-
-class HostForwarderError(base_error.BaseError):
-  """Exception for failures involving host_forwarder."""
-
-  def __init__(self, message):
-    super(HostForwarderError, self).__init__(message)
-
-
-class Forwarder(object):
-  """Thread-safe class to manage port forwards from the device to the host."""
-
-  _DEVICE_FORWARDER_FOLDER = (file_system.TEST_EXECUTABLE_DIR + '/forwarder/')
-  _DEVICE_FORWARDER_PATH = (
-      file_system.TEST_EXECUTABLE_DIR + '/forwarder/device_forwarder')
-  _LOCK_PATH = '/tmp/chrome.forwarder.lock'
-  # Defined in host_forwarder_main.cc
-  _HOST_FORWARDER_LOG = '/tmp/host_forwarder_log'
-
-  _TIMEOUT = 60  # seconds
-
-  _instance = None
-
-  @staticmethod
-  def Map(port_pairs, device, tool=None):
-    """Runs the forwarder.
-
-    Args:
-      port_pairs: A list of tuples (device_port, host_port) to forward. Note
-                 that you can specify 0 as a device_port, in which case a
-                 port will by dynamically assigned on the device. You can
-                 get the number of the assigned port using the
-                 DevicePortForHostPort method.
-      device: A DeviceUtils instance.
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-
-    Raises:
-      Exception on failure to forward the port.
-    """
-    if not tool:
-      tool = base_tool.BaseTool()
-    with _FileLock(Forwarder._LOCK_PATH):
-      instance = Forwarder._GetInstanceLocked(tool)
-      instance._InitDeviceLocked(device, tool)
-
-      device_serial = str(device)
-      map_arg_lists = [[
-          '--adb=' + adb_wrapper.AdbWrapper.GetAdbPath(),
-          '--serial-id=' + device_serial, '--map',
-          str(device_port),
-          str(host_port)
-      ] for device_port, host_port in port_pairs]
-      logger.info('Forwarding using commands: %s', map_arg_lists)
-
-      for map_arg_list in map_arg_lists:
-        try:
-          map_cmd = [instance._host_forwarder_path] + map_arg_list
-          (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-              map_cmd, Forwarder._TIMEOUT)
-        except cmd_helper.TimeoutError as e:
-          raise HostForwarderError(
-              '`%s` timed out:\n%s' % (' '.join(map_cmd), e.output))
-        except OSError as e:
-          if e.errno == 2:
-            raise HostForwarderError('Unable to start host forwarder. '
-                                     'Make sure you have built host_forwarder.')
-          else:
-            raise
-        if exit_code != 0:
-          try:
-            instance._KillDeviceLocked(device, tool)
-          except (device_errors.CommandFailedError,
-                  device_errors.DeviceUnreachableError):
-            # We don't want the failure to kill the device forwarder to
-            # supersede the original failure to map.
-            logger.warning(
-                'Failed to kill the device forwarder after map failure: %s',
-                str(e))
-          _LogMapFailureDiagnostics(device)
-          formatted_output = ('\n'.join(output)
-                              if isinstance(output, list) else output)
-          raise HostForwarderError(
-              '`%s` exited with %d:\n%s' % (' '.join(map_cmd), exit_code,
-                                            formatted_output))
-        for line in output.splitlines():
-          match = PORT_REGEX.match(line)
-          if match:
-            break
-        if not match:
-          raise HostForwarderError('Unable to find device_port:host_port in '
-                                   'host forwarder output: %s' % output)
-        device_port = int(match.groupdict()['device_port'])
-        host_port = int(match.groupdict()['host_port'])
-        serial_with_port = (device_serial, device_port)
-        instance._device_to_host_port_map[serial_with_port] = host_port
-        instance._host_to_device_port_map[host_port] = serial_with_port
-        logger.info('Forwarding device port: %d to host port: %d.', device_port,
-                    host_port)
-
-  @staticmethod
-  def UnmapDevicePort(device_port, device):
-    """Unmaps a previously forwarded device port.
-
-    Args:
-      device: A DeviceUtils instance.
-      device_port: A previously forwarded port (through Map()).
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._UnmapDevicePortLocked(device_port, device)
-
-  @staticmethod
-  def UnmapAllDevicePorts(device):
-    """Unmaps all the previously forwarded ports for the provided device.
-
-    Args:
-      device: A DeviceUtils instance.
-      port_pairs: A list of tuples (device_port, host_port) to unmap.
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      instance = Forwarder._GetInstanceLocked(None)
-      unmap_all_cmd = [
-          instance._host_forwarder_path,
-          '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
-          '--serial-id=%s' % device.serial, '--unmap-all'
-      ]
-      try:
-        exit_code, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            unmap_all_cmd, Forwarder._TIMEOUT)
-      except cmd_helper.TimeoutError as e:
-        raise HostForwarderError(
-            '`%s` timed out:\n%s' % (' '.join(unmap_all_cmd), e.output))
-      if exit_code != 0:
-        error_msg = [
-            '`%s` exited with %d' % (' '.join(unmap_all_cmd), exit_code)
-        ]
-        if isinstance(output, list):
-          error_msg += output
-        else:
-          error_msg += [output]
-        raise HostForwarderError('\n'.join(error_msg))
-
-      # Clean out any entries from the device & host map.
-      device_map = instance._device_to_host_port_map
-      host_map = instance._host_to_device_port_map
-      for device_serial_and_port, host_port in device_map.items():
-        device_serial = device_serial_and_port[0]
-        if device_serial == device.serial:
-          del device_map[device_serial_and_port]
-          del host_map[host_port]
-
-      # Kill the device forwarder.
-      tool = base_tool.BaseTool()
-      instance._KillDeviceLocked(device, tool)
-
-  @staticmethod
-  def DevicePortForHostPort(host_port):
-    """Returns the device port that corresponds to a given host port."""
-    with _FileLock(Forwarder._LOCK_PATH):
-      serial_and_port = Forwarder._GetInstanceLocked(
-          None)._host_to_device_port_map.get(host_port)
-      return serial_and_port[1] if serial_and_port else None
-
-  @staticmethod
-  def RemoveHostLog():
-    if os.path.exists(Forwarder._HOST_FORWARDER_LOG):
-      os.unlink(Forwarder._HOST_FORWARDER_LOG)
-
-  @staticmethod
-  def GetHostLog():
-    if not os.path.exists(Forwarder._HOST_FORWARDER_LOG):
-      return ''
-    with file(Forwarder._HOST_FORWARDER_LOG, 'r') as f:
-      return f.read()
-
-  @staticmethod
-  def _GetInstanceLocked(tool):
-    """Returns the singleton instance.
-
-    Note that the global lock must be acquired before calling this method.
-
-    Args:
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    if not Forwarder._instance:
-      Forwarder._instance = Forwarder(tool)
-    return Forwarder._instance
-
-  def __init__(self, tool):
-    """Constructs a new instance of Forwarder.
-
-    Note that Forwarder is a singleton therefore this constructor should be
-    called only once.
-
-    Args:
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    assert not Forwarder._instance
-    self._tool = tool
-    self._initialized_devices = set()
-    self._device_to_host_port_map = dict()
-    self._host_to_device_port_map = dict()
-    self._host_forwarder_path = devil_env.config.FetchPath('forwarder_host')
-    assert os.path.exists(self._host_forwarder_path), 'Please build forwarder2'
-    self._InitHostLocked()
-
-  @staticmethod
-  def _UnmapDevicePortLocked(device_port, device):
-    """Internal method used by UnmapDevicePort().
-
-    Note that the global lock must be acquired before calling this method.
-    """
-    instance = Forwarder._GetInstanceLocked(None)
-    serial = str(device)
-    serial_with_port = (serial, device_port)
-    if serial_with_port not in instance._device_to_host_port_map:
-      logger.error('Trying to unmap non-forwarded port %d', device_port)
-      return
-
-    host_port = instance._device_to_host_port_map[serial_with_port]
-    del instance._device_to_host_port_map[serial_with_port]
-    del instance._host_to_device_port_map[host_port]
-
-    unmap_cmd = [
-        instance._host_forwarder_path,
-        '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
-        '--serial-id=%s' % serial, '--unmap',
-        str(device_port)
-    ]
-    try:
-      (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          unmap_cmd, Forwarder._TIMEOUT)
-    except cmd_helper.TimeoutError as e:
-      raise HostForwarderError(
-          '`%s` timed out:\n%s' % (' '.join(unmap_cmd), e.output))
-    if exit_code != 0:
-      logger.error('`%s` exited with %d:\n%s', ' '.join(unmap_cmd), exit_code,
-                   '\n'.join(output) if isinstance(output, list) else output)
-
-  @staticmethod
-  def _GetPidForLock():
-    """Returns the PID used for host_forwarder initialization.
-
-    The PID of the "sharder" is used to handle multiprocessing. The "sharder"
-    is the initial process that forks that is the parent process.
-    """
-    return os.getpgrp()
-
-  def _InitHostLocked(self):
-    """Initializes the host forwarder daemon.
-
-    Note that the global lock must be acquired before calling this method. This
-    method kills any existing host_forwarder process that could be stale.
-    """
-    # See if the host_forwarder daemon was already initialized by a concurrent
-    # process or thread (in case multi-process sharding is not used).
-    # TODO(crbug.com/762005): Consider using a different implemention; relying
-    # on matching the string represantion of the process start time seems
-    # fragile.
-    pid_for_lock = Forwarder._GetPidForLock()
-    fd = os.open(Forwarder._LOCK_PATH, os.O_RDWR | os.O_CREAT)
-    with os.fdopen(fd, 'r+') as pid_file:
-      pid_with_start_time = pid_file.readline()
-      if pid_with_start_time:
-        (pid, process_start_time) = pid_with_start_time.split(':')
-        if pid == str(pid_for_lock):
-          if process_start_time == str(_GetProcessStartTime(pid_for_lock)):
-            return
-      self._KillHostLocked()
-      pid_file.seek(0)
-      pid_file.write(
-          '%s:%s' % (pid_for_lock, str(_GetProcessStartTime(pid_for_lock))))
-      pid_file.truncate()
-
-  def _InitDeviceLocked(self, device, tool):
-    """Initializes the device_forwarder daemon for a specific device (once).
-
-    Note that the global lock must be acquired before calling this method. This
-    method kills any existing device_forwarder daemon on the device that could
-    be stale, pushes the latest version of the daemon (to the device) and starts
-    it.
-
-    Args:
-      device: A DeviceUtils instance.
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    device_serial = str(device)
-    if device_serial in self._initialized_devices:
-      return
-    try:
-      self._KillDeviceLocked(device, tool)
-    except device_errors.CommandFailedError:
-      logger.warning('Failed to kill device forwarder. Rebooting.')
-      device.Reboot()
-    forwarder_device_path_on_host = devil_env.config.FetchPath(
-        'forwarder_device', device=device)
-    forwarder_device_path_on_device = (
-        Forwarder._DEVICE_FORWARDER_FOLDER
-        if os.path.isdir(forwarder_device_path_on_host) else
-        Forwarder._DEVICE_FORWARDER_PATH)
-    device.PushChangedFiles([(forwarder_device_path_on_host,
-                              forwarder_device_path_on_device)])
-
-    cmd = [Forwarder._DEVICE_FORWARDER_PATH]
-    wrapper = tool.GetUtilWrapper()
-    if wrapper:
-      cmd.insert(0, wrapper)
-    device.RunShellCommand(
-        cmd,
-        env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
-        check_return=True)
-    self._initialized_devices.add(device_serial)
-
-  @staticmethod
-  def KillHost():
-    """Kills the forwarder process running on the host."""
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._GetInstanceLocked(None)._KillHostLocked()
-
-  def _KillHostLocked(self):
-    """Kills the forwarder process running on the host.
-
-    Note that the global lock must be acquired before calling this method.
-    """
-    logger.info('Killing host_forwarder.')
-    try:
-      kill_cmd = [self._host_forwarder_path, '--kill-server']
-      (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          kill_cmd, Forwarder._TIMEOUT)
-      if exit_code != 0:
-        logger.warning('Forwarder unable to shut down:\n%s', output)
-        kill_cmd = ['pkill', '-9', 'host_forwarder']
-        (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            kill_cmd, Forwarder._TIMEOUT)
-        if exit_code == -9:
-          # pkill can exit with -9, which indicates that it was killed. It's
-          # possible that the forwarder was still killed, though, which will
-          # be checked later.
-          logging.warning('pkilling host forwarder returned -9.')
-        if exit_code in (0, 1):
-          # pkill exits with a 0 if it was able to signal at least one process.
-          # pkill exits with a 1 if it wasn't able to signal a process because
-          # no matching process existed. We're ok with either.
-          return
-
-        _, ps_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['ps', 'aux'], Forwarder._TIMEOUT)
-        host_forwarder_lines = [line for line in ps_output.splitlines()
-                                if 'host_forwarder' in line]
-        if host_forwarder_lines:
-          logger.error('Remaining host_forwarder processes:\n  %s',
-                       '\n  '.join(host_forwarder_lines))
-        else:
-          logger.error('No remaining host_forwarder processes?')
-          return
-        _DumpHostLog()
-        error_msg = textwrap.dedent("""\
-            `{kill_cmd}` failed to kill host_forwarder.
-              exit_code: {exit_code}
-              output:
-            {output}
-            """)
-        raise HostForwarderError(
-            error_msg.format(
-                kill_cmd=' '.join(kill_cmd), exit_code=str(exit_code),
-                output='\n'.join('    %s' % l for l in output.splitlines())))
-    except cmd_helper.TimeoutError as e:
-      raise HostForwarderError(
-          '`%s` timed out:\n%s' % (' '.join(kill_cmd), e.output))
-
-  @staticmethod
-  def KillDevice(device, tool=None):
-    """Kills the forwarder process running on the device.
-
-    Args:
-      device: Instance of DeviceUtils for talking to the device.
-      tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
-            forwarder (see valgrind_tools.py).
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._GetInstanceLocked(None)._KillDeviceLocked(
-          device, tool or base_tool.BaseTool())
-
-  def _KillDeviceLocked(self, device, tool):
-    """Kills the forwarder process running on the device.
-
-    Note that the global lock must be acquired before calling this method.
-
-    Args:
-      device: Instance of DeviceUtils for talking to the device.
-      tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
-            forwarder (see valgrind_tools.py).
-    """
-    logger.info('Killing device_forwarder.')
-    self._initialized_devices.discard(device.serial)
-    if not device.FileExists(Forwarder._DEVICE_FORWARDER_PATH):
-      return
-
-    cmd = [Forwarder._DEVICE_FORWARDER_PATH, '--kill-server']
-    wrapper = tool.GetUtilWrapper()
-    if wrapper:
-      cmd.insert(0, wrapper)
-    device.RunShellCommand(
-        cmd,
-        env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
-        check_return=True)
diff --git a/systrace/catapult/devil/devil/android/install_commands.py b/systrace/catapult/devil/devil/android/install_commands.py
deleted file mode 100644
index c87fc9b..0000000
--- a/systrace/catapult/devil/devil/android/install_commands.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import posixpath
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.constants import file_system
-
-BIN_DIR = '%s/bin' % file_system.TEST_EXECUTABLE_DIR
-_FRAMEWORK_DIR = '%s/framework' % file_system.TEST_EXECUTABLE_DIR
-
-_COMMANDS = {
-    'unzip': 'org.chromium.android.commands.unzip.Unzip',
-}
-
-_SHELL_COMMAND_FORMAT = ("""#!/system/bin/sh
-base=%s
-export CLASSPATH=$base/framework/chromium_commands.jar
-exec app_process $base/bin %s $@
-""")
-
-
-def Installed(device):
-  paths = [posixpath.join(BIN_DIR, c) for c in _COMMANDS]
-  paths.append(posixpath.join(_FRAMEWORK_DIR, 'chromium_commands.jar'))
-  return device.PathExists(paths)
-
-
-def InstallCommands(device):
-  if device.IsUserBuild():
-    raise device_errors.CommandFailedError(
-        'chromium_commands currently requires a userdebug build.',
-        device_serial=device.adb.GetDeviceSerial())
-
-  chromium_commands_jar_path = devil_env.config.FetchPath('chromium_commands')
-  if not os.path.exists(chromium_commands_jar_path):
-    raise device_errors.CommandFailedError(
-        '%s not found. Please build chromium_commands.' %
-        chromium_commands_jar_path)
-
-  device.RunShellCommand(['mkdir', '-p', BIN_DIR, _FRAMEWORK_DIR],
-                         check_return=True)
-  for command, main_class in _COMMANDS.iteritems():
-    shell_command = _SHELL_COMMAND_FORMAT % (file_system.TEST_EXECUTABLE_DIR,
-                                             main_class)
-    shell_file = '%s/%s' % (BIN_DIR, command)
-    device.WriteFile(shell_file, shell_command)
-    device.RunShellCommand(['chmod', '755', shell_file], check_return=True)
-
-  device.adb.Push(chromium_commands_jar_path,
-                  '%s/chromium_commands.jar' % _FRAMEWORK_DIR)
diff --git a/systrace/catapult/devil/devil/android/logcat_monitor.py b/systrace/catapult/devil/devil/android/logcat_monitor.py
deleted file mode 100644
index df306b0..0000000
--- a/systrace/catapult/devil/devil/android/logcat_monitor.py
+++ /dev/null
@@ -1,291 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=unused-argument
-
-import errno
-import logging
-import os
-import re
-import shutil
-import tempfile
-import threading
-import time
-
-import six
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.utils import reraiser_thread
-
-logger = logging.getLogger(__name__)
-
-
-class LogcatMonitor(object):
-
-  _RECORD_ITER_TIMEOUT = 0.01
-  _RECORD_THREAD_JOIN_WAIT = 5.0
-  _WAIT_TIME = 0.2
-  THREADTIME_RE_FORMAT = (
-      r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +'
-      r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$')
-
-  def __init__(self,
-               adb,
-               clear=True,
-               filter_specs=None,
-               output_file=None,
-               transform_func=None,
-               check_error=True):
-    """Create a LogcatMonitor instance.
-
-    Args:
-      adb: An instance of adb_wrapper.AdbWrapper.
-      clear: If True, clear the logcat when monitoring starts.
-      filter_specs: An optional list of '<tag>[:priority]' strings.
-      output_file: File path to save recorded logcat.
-      transform_func: An optional unary callable that takes and returns
-        a list of lines, possibly transforming them in the process.
-      check_error: Check for and raise an exception on nonzero exit codes
-        from the underlying logcat command.
-    """
-    if isinstance(adb, adb_wrapper.AdbWrapper):
-      self._adb = adb
-    else:
-      raise ValueError('Unsupported type passed for argument "device"')
-    self._check_error = check_error
-    self._clear = clear
-    self._filter_specs = filter_specs
-    self._output_file = output_file
-    self._record_file = None
-    self._record_file_lock = threading.Lock()
-    self._record_thread = None
-    self._stop_recording_event = threading.Event()
-    self._transform_func = transform_func
-
-  @property
-  def output_file(self):
-    return self._output_file
-
-  @decorators.WithTimeoutAndRetriesDefaults(10, 0)
-  def WaitFor(self,
-              success_regex,
-              failure_regex=None,
-              timeout=None,
-              retries=None):
-    """Wait for a matching logcat line or until a timeout occurs.
-
-    This will attempt to match lines in the logcat against both |success_regex|
-    and |failure_regex| (if provided). Note that this calls re.search on each
-    logcat line, not re.match, so the provided regular expressions don't have
-    to match an entire line.
-
-    Args:
-      success_regex: The regular expression to search for.
-      failure_regex: An optional regular expression that, if hit, causes this
-        to stop looking for a match. Can be None.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A match object if |success_regex| matches a part of a logcat line, or
-      None if |failure_regex| matches a part of a logcat line.
-    Raises:
-      CommandFailedError on logcat failure (NOT on a |failure_regex| match).
-      CommandTimeoutError if no logcat line matching either |success_regex| or
-        |failure_regex| is found in |timeout| seconds.
-      DeviceUnreachableError if the device becomes unreachable.
-      LogcatMonitorCommandError when calling |WaitFor| while not recording
-        logcat.
-    """
-    if self._record_thread is None:
-      raise LogcatMonitorCommandError(
-          'Must be recording logcat when calling |WaitFor|',
-          device_serial=str(self._adb))
-    if isinstance(success_regex, six.string_types):
-      success_regex = re.compile(success_regex)
-    if isinstance(failure_regex, six.string_types):
-      failure_regex = re.compile(failure_regex)
-
-    logger.debug('Waiting %d seconds for "%s"', timeout, success_regex.pattern)
-
-    # NOTE This will continue looping until:
-    #  - success_regex matches a line, in which case the match object is
-    #    returned.
-    #  - failure_regex matches a line, in which case None is returned
-    #  - the timeout is hit, in which case a CommandTimeoutError is raised.
-    with open(self._record_file.name, 'r') as f:
-      while True:
-        line = f.readline()
-        if line:
-          m = success_regex.search(line)
-          if m:
-            return m
-          if failure_regex and failure_regex.search(line):
-            return None
-        else:
-          time.sleep(self._WAIT_TIME)
-
-  def FindAll(self,
-              message_regex,
-              proc_id=None,
-              thread_id=None,
-              log_level=None,
-              component=None):
-    """Finds all lines in the logcat that match the provided constraints.
-
-    Args:
-      message_regex: The regular expression that the <message> section must
-        match.
-      proc_id: The process ID to match. If None, matches any process ID.
-      thread_id: The thread ID to match. If None, matches any thread ID.
-      log_level: The log level to match. If None, matches any log level.
-      component: The component to match. If None, matches any component.
-
-    Raises:
-      LogcatMonitorCommandError when calling |FindAll| before recording logcat.
-
-    Yields:
-      A match object for each matching line in the logcat. The match object
-      will always contain, in addition to groups defined in |message_regex|,
-      the following named groups: 'date', 'time', 'proc_id', 'thread_id',
-      'log_level', 'component', and 'message'.
-    """
-    if self._record_file is None:
-      raise LogcatMonitorCommandError(
-          'Must have recorded or be recording a logcat to call |FindAll|',
-          device_serial=str(self._adb))
-    if proc_id is None:
-      proc_id = r'\d+'
-    if thread_id is None:
-      thread_id = r'\d+'
-    if log_level is None:
-      log_level = r'[VDIWEF]'
-    if component is None:
-      component = r'[^\s:]+'
-    # pylint: disable=protected-access
-    threadtime_re = re.compile(
-        type(self).THREADTIME_RE_FORMAT % (proc_id, thread_id, log_level,
-                                           component, message_regex))
-
-    with open(self._record_file.name, 'r') as f:
-      for line in f:
-        m = re.match(threadtime_re, line)
-        if m:
-          yield m
-
-  def _StartRecording(self):
-    """Starts recording logcat to file.
-
-    Function spawns a thread that records logcat to file and will not die
-    until |StopRecording| is called.
-    """
-
-    def record_to_file():
-      # Write the log with line buffering so the consumer sees each individual
-      # line.
-      for data in self._adb.Logcat(
-          filter_specs=self._filter_specs,
-          logcat_format='threadtime',
-          iter_timeout=self._RECORD_ITER_TIMEOUT,
-          check_error=self._check_error):
-        if self._stop_recording_event.isSet():
-          return
-
-        if data is None:
-          # Logcat can yield None if the iter_timeout is hit.
-          continue
-
-        with self._record_file_lock:
-          if self._record_file and not self._record_file.closed:
-            if self._transform_func:
-              data = '\n'.join(self._transform_func([data]))
-            self._record_file.write(data + '\n')
-
-    self._stop_recording_event.clear()
-    if not self._record_thread:
-      self._record_thread = reraiser_thread.ReraiserThread(record_to_file)
-      self._record_thread.start()
-
-  def _StopRecording(self):
-    """Finish recording logcat."""
-    if self._record_thread:
-      self._stop_recording_event.set()
-      self._record_thread.join(timeout=self._RECORD_THREAD_JOIN_WAIT)
-      self._record_thread.ReraiseIfException()
-      self._record_thread = None
-
-  def Start(self):
-    """Starts the logcat monitor.
-
-    Clears the logcat if |clear| was set in |__init__|.
-    """
-    # pylint: disable=unexpected-keyword-arg
-    if self._clear:
-      self._adb.Logcat(clear=True)
-    if not self._record_file:
-      if six.PY2:
-        self._record_file = tempfile.NamedTemporaryFile(mode='a', bufsize=1)
-      else:
-        self._record_file = tempfile.NamedTemporaryFile(mode='a', buffering=1)
-    self._StartRecording()
-
-  def Stop(self):
-    """Stops the logcat monitor.
-
-    Stops recording the logcat. Copies currently recorded logcat to
-    |self._output_file|.
-    """
-    self._StopRecording()
-    with self._record_file_lock:
-      if self._record_file and self._output_file:
-        try:
-          os.makedirs(os.path.dirname(self._output_file))
-        except OSError as e:
-          if e.errno != errno.EEXIST:
-            raise
-        shutil.copy(self._record_file.name, self._output_file)
-
-  def Close(self):
-    """Closes logcat recording file.
-
-    Should be called when finished using the logcat monitor.
-    """
-    with self._record_file_lock:
-      if self._record_file:
-        self._record_file.close()
-        self._record_file = None
-
-  def close(self):
-    """An alias for Close.
-
-    Allows LogcatMonitors to be used with contextlib.closing.
-    """
-    self.Close()
-
-  def __enter__(self):
-    """Starts the logcat monitor."""
-    self.Start()
-    return self
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    """Stops the logcat monitor."""
-    self.Stop()
-
-  def __del__(self):
-    """Closes logcat recording file in case |Close| was never called."""
-    with self._record_file_lock:
-      if self._record_file:
-        logger.warning('Need to call |Close| on the logcat monitor when done!')
-        self._record_file.close()
-
-  @property
-  def adb(self):
-    return self._adb
-
-
-class LogcatMonitorCommandError(device_errors.CommandFailedError):
-  """Exception for errors with logcat monitor commands."""
-  pass
diff --git a/systrace/catapult/devil/devil/android/logcat_monitor_test.py b/systrace/catapult/devil/devil/android/logcat_monitor_test.py
deleted file mode 100755
index 356fe04..0000000
--- a/systrace/catapult/devil/devil/android/logcat_monitor_test.py
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=protected-access
-
-import itertools
-import threading
-import unittest
-
-import six
-
-from devil import devil_env
-from devil.android import logcat_monitor
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-def _CreateTestLog(raw_logcat=None):
-  test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
-  test_adb.Logcat = mock.Mock(return_value=(l for l in raw_logcat))
-  test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
-  return test_log
-
-
-def zip_longest(expected, actual):
-  # pylint: disable=no-member
-  if six.PY2:
-    return itertools.izip_longest(expected, actual)
-  else:
-    return itertools.zip_longest(expected, actual)
-
-class LogcatMonitorTest(unittest.TestCase):
-
-  _TEST_THREADTIME_LOGCAT_DATA = [
-      '01-01 01:02:03.456  7890  0987 V LogcatMonitorTest: '
-      'verbose logcat monitor test message 1',
-      '01-01 01:02:03.457  8901  1098 D LogcatMonitorTest: '
-      'debug logcat monitor test message 2',
-      '01-01 01:02:03.458  9012  2109 I LogcatMonitorTest: '
-      'info logcat monitor test message 3',
-      '01-01 01:02:03.459  0123  3210 W LogcatMonitorTest: '
-      'warning logcat monitor test message 4',
-      '01-01 01:02:03.460  1234  4321 E LogcatMonitorTest: '
-      'error logcat monitor test message 5',
-      '01-01 01:02:03.461  2345  5432 F LogcatMonitorTest: '
-      'fatal logcat monitor test message 6',
-      '01-01 01:02:03.462  3456  6543 D LogcatMonitorTest: '
-      'last line'
-  ]
-
-  def assertIterEqual(self, expected_iter, actual_iter):
-    for expected, actual in zip_longest(expected_iter, actual_iter):
-      self.assertIsNotNone(
-          expected,
-          msg='actual has unexpected elements starting with %s' % str(actual))
-      self.assertIsNotNone(
-          actual,
-          msg='actual is missing elements starting with %s' % str(expected))
-      self.assertEqual(actual.group('proc_id'), expected[0])
-      self.assertEqual(actual.group('thread_id'), expected[1])
-      self.assertEqual(actual.group('log_level'), expected[2])
-      self.assertEqual(actual.group('component'), expected[3])
-      self.assertEqual(actual.group('message'), expected[4])
-
-    with self.assertRaises(StopIteration):
-      next(actual_iter)
-    with self.assertRaises(StopIteration):
-      next(expected_iter)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_success(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None)
-    self.assertTrue(actual_match)
-    self.assertEqual(
-        '01-01 01:02:03.460  1234  4321 E LogcatMonitorTest: '
-        'error logcat monitor test message 5', actual_match.group(0))
-    self.assertEqual('error', actual_match.group(1))
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_failure(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    actual_match = test_log.WaitFor(r'.*My Success Regex.*',
-                                    r'.*(fatal|error) logcat monitor.*')
-    self.assertIsNone(actual_match)
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_buffering(self):
-    # Simulate an adb log stream which does not complete until the test tells it
-    # to. This checks that the log matcher can receive individual lines from the
-    # log reader thread even if adb is not producing enough output to fill an
-    # entire file io buffer.
-    finished_lock = threading.Lock()
-    finished_lock.acquire()
-
-    def LogGenerator():
-      for line in type(self)._TEST_THREADTIME_LOGCAT_DATA:
-        yield line
-      finished_lock.acquire()
-
-    test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
-    test_adb.Logcat = mock.Mock(return_value=LogGenerator())
-    test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
-    test_log.Start()
-
-    actual_match = test_log.WaitFor(r'.*last line.*', None)
-    finished_lock.release()
-    self.assertTrue(actual_match)
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_defaults(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    expected_results = [('7890', '0987', 'V', 'LogcatMonitorTest',
-                         'verbose logcat monitor test message 1'),
-                        ('8901', '1098', 'D', 'LogcatMonitorTest',
-                         'debug logcat monitor test message 2'),
-                        ('9012', '2109', 'I', 'LogcatMonitorTest',
-                         'info logcat monitor test message 3'),
-                        ('0123', '3210', 'W', 'LogcatMonitorTest',
-                         'warning logcat monitor test message 4'),
-                        ('1234', '4321', 'E', 'LogcatMonitorTest',
-                         'error logcat monitor test message 5'),
-                        ('2345', '5432', 'F', 'LogcatMonitorTest',
-                         'fatal logcat monitor test message 6')]
-    actual_results = test_log.FindAll(r'\S* logcat monitor test message \d')
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_defaults_miss(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    expected_results = []
-    actual_results = test_log.FindAll(r'\S* nothing should match this \d')
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterProcId(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', proc_id=1234)
-    expected_results = [('1234', '4321', 'E', 'LogcatMonitorTest',
-                         'error logcat monitor test message 5')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterThreadId(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', thread_id=2109)
-    expected_results = [('9012', '2109', 'I', 'LogcatMonitorTest',
-                         'info logcat monitor test message 3')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterLogLevel(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', log_level=r'[DW]')
-    expected_results = [('8901', '1098', 'D', 'LogcatMonitorTest',
-                         'debug logcat monitor test message 2'),
-                        ('0123', '3210', 'W', 'LogcatMonitorTest',
-                         'warning logcat monitor test message 4')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterComponent(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest')
-    expected_results = [('7890', '0987', 'V', 'LogcatMonitorTest',
-                         'verbose logcat monitor test message 1'),
-                        ('8901', '1098', 'D', 'LogcatMonitorTest',
-                         'debug logcat monitor test message 2'),
-                        ('9012', '2109', 'I', 'LogcatMonitorTest',
-                         'info logcat monitor test message 3'),
-                        ('0123', '3210', 'W', 'LogcatMonitorTest',
-                         'warning logcat monitor test message 4'),
-                        ('1234', '4321', 'E', 'LogcatMonitorTest',
-                         'error logcat monitor test message 5'),
-                        ('2345', '5432', 'F', 'LogcatMonitorTest',
-                         'fatal logcat monitor test message 6'),
-                        ('3456', '6543', 'D', 'LogcatMonitorTest', 'last line')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/md5sum.py b/systrace/catapult/devil/devil/android/md5sum.py
deleted file mode 100644
index e67f3f6..0000000
--- a/systrace/catapult/devil/devil/android/md5sum.py
+++ /dev/null
@@ -1,140 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import base64
-import io
-import gzip
-import os
-import re
-
-import six
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.utils import cmd_helper
-
-MD5SUM_DEVICE_LIB_PATH = '/data/local/tmp/md5sum'
-MD5SUM_DEVICE_BIN_PATH = MD5SUM_DEVICE_LIB_PATH + '/md5sum_bin'
-
-_STARTS_WITH_CHECKSUM_RE = re.compile(r'^[0-9a-fA-F]{16}$')
-
-# We need to cap how many paths we send to the md5_sum binaries at once because
-# the ARG_MAX on Android devices is relatively small, typically 131072 bytes.
-# However, the more paths we use per invocation, the lower the overhead of
-# starting processes, so we want to maximize this number, but we can't compute
-# it exactly as we don't know how well our paths will compress.
-# 5000 is experimentally determined to be reasonable. 10000 fails, and 7500
-# works with existing usage, so 5000 seems like a pretty safe compromise.
-_MAX_PATHS_PER_INVOCATION = 5000
-
-
-def CalculateHostMd5Sums(paths):
-  """Calculates the MD5 sum value for all items in |paths|.
-
-  Directories are traversed recursively and the MD5 sum of each file found is
-  reported in the result.
-
-  Args:
-    paths: A list of host paths to md5sum.
-  Returns:
-    A dict mapping file paths to their respective md5sum checksums.
-  """
-  if isinstance(paths, six.string_types):
-    paths = [paths]
-  paths = list(paths)
-
-  md5sum_bin_host_path = devil_env.config.FetchPath('md5sum_host')
-  if not os.path.exists(md5sum_bin_host_path):
-    raise IOError('File not built: %s' % md5sum_bin_host_path)
-  out = ""
-  for i in range(0, len(paths), _MAX_PATHS_PER_INVOCATION):
-    mem_file = io.BytesIO()
-    compressed = gzip.GzipFile(fileobj=mem_file, mode="wb")
-    data = ";".join(
-          [os.path.realpath(p) for p in paths[i:i+_MAX_PATHS_PER_INVOCATION]])
-    if six.PY3:
-      data = data.encode('utf-8')
-    compressed.write(data)
-    compressed.close()
-    compressed_paths = base64.b64encode(mem_file.getvalue())
-    out += cmd_helper.GetCmdOutput(
-        [md5sum_bin_host_path, "-gz", compressed_paths])
-
-  return dict(zip(paths, out.splitlines()))
-
-
-def CalculateDeviceMd5Sums(paths, device):
-  """Calculates the MD5 sum value for all items in |paths|.
-
-  Directories are traversed recursively and the MD5 sum of each file found is
-  reported in the result.
-
-  Args:
-    paths: A list of device paths to md5sum.
-  Returns:
-    A dict mapping file paths to their respective md5sum checksums.
-  """
-  if not paths:
-    return {}
-
-  if isinstance(paths, six.string_types):
-    paths = [paths]
-  paths = list(paths)
-
-  md5sum_dist_path = devil_env.config.FetchPath('md5sum_device', device=device)
-
-  if os.path.isdir(md5sum_dist_path):
-    md5sum_dist_bin_path = os.path.join(md5sum_dist_path, 'md5sum_bin')
-  else:
-    md5sum_dist_bin_path = md5sum_dist_path
-
-  if not os.path.exists(md5sum_dist_path):
-    raise IOError('File not built: %s' % md5sum_dist_path)
-  md5sum_file_size = os.path.getsize(md5sum_dist_bin_path)
-
-  # For better performance, make the script as small as possible to try and
-  # avoid needing to write to an intermediary file (which RunShellCommand will
-  # do if necessary).
-  md5sum_script = 'a=%s;' % MD5SUM_DEVICE_BIN_PATH
-  # Check if the binary is missing or has changed (using its file size as an
-  # indicator), and trigger a (re-)push via the exit code.
-  md5sum_script += '! [[ $(ls -l $a) = *%d* ]]&&exit 2;' % md5sum_file_size
-  # Make sure it can find libbase.so
-  md5sum_script += 'export LD_LIBRARY_PATH=%s;' % MD5SUM_DEVICE_LIB_PATH
-  for i in range(0, len(paths), _MAX_PATHS_PER_INVOCATION):
-    mem_file = io.BytesIO()
-    compressed = gzip.GzipFile(fileobj=mem_file, mode="wb")
-    data = ";".join(paths[i:i+_MAX_PATHS_PER_INVOCATION])
-    if six.PY3:
-      data = data.encode('utf-8')
-    compressed.write(data)
-    compressed.close()
-    compressed_paths = base64.b64encode(mem_file.getvalue())
-    md5sum_script += '$a -gz %s;' % compressed_paths
-  try:
-    out = device.RunShellCommand(
-        md5sum_script, shell=True, check_return=True, large_output=True)
-  except device_errors.AdbShellCommandFailedError as e:
-    # Push the binary only if it is found to not exist
-    # (faster than checking up-front).
-    if e.status == 2:
-      # If files were previously pushed as root (adbd running as root), trying
-      # to re-push as non-root causes the push command to report success, but
-      # actually fail. So, wipe the directory first.
-      device.RunShellCommand(['rm', '-rf', MD5SUM_DEVICE_LIB_PATH],
-                             as_root=True,
-                             check_return=True)
-      if os.path.isdir(md5sum_dist_path):
-        device.adb.Push(md5sum_dist_path, MD5SUM_DEVICE_LIB_PATH)
-      else:
-        mkdir_cmd = 'a=%s;[[ -e $a ]] || mkdir $a' % MD5SUM_DEVICE_LIB_PATH
-        device.RunShellCommand(mkdir_cmd, shell=True, check_return=True)
-        device.adb.Push(md5sum_dist_bin_path, MD5SUM_DEVICE_BIN_PATH)
-
-      out = device.RunShellCommand(
-          md5sum_script, shell=True, check_return=True, large_output=True)
-    else:
-      raise
-
-  return dict(zip(paths, [l for l in out if _STARTS_WITH_CHECKSUM_RE.match(l)]))
diff --git a/systrace/catapult/devil/devil/android/md5sum_test.py b/systrace/catapult/devil/devil/android/md5sum_test.py
deleted file mode 100755
index 9a51313..0000000
--- a/systrace/catapult/devil/devil/android/md5sum_test.py
+++ /dev/null
@@ -1,207 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import md5sum
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-TEST_OUT_DIR = os.path.join('test', 'out', 'directory')
-HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host')
-MD5_DIST = os.path.join(TEST_OUT_DIR, 'md5sum_dist')
-
-
-class Md5SumTest(unittest.TestCase):
-  def setUp(self):
-    mocked_attrs = {
-        'md5sum_host': HOST_MD5_EXECUTABLE,
-        'md5sum_device': MD5_DIST,
-    }
-    self._patchers = [
-        mock.patch(
-            'devil.devil_env._Environment.FetchPath',
-            mock.Mock(side_effect=lambda a, device=None: mocked_attrs[a])),
-        mock.patch('os.path.exists', new=mock.Mock(return_value=True)),
-    ]
-    for p in self._patchers:
-      p.start()
-
-  def tearDown(self):
-    for p in self._patchers:
-      p.stop()
-
-  def testCalculateHostMd5Sums_singlePath(self):
-    test_path = '/test/host/file.dat'
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdef')
-    with mock.patch(
-        'devil.utils.cmd_helper.GetCmdOutput', new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_path)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/test/host/file.dat' in out)
-      self.assertEquals('0123456789abcdef', out['/test/host/file.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, "-gz", mock.ANY])
-
-  def testCalculateHostMd5Sums_list(self):
-    test_paths = ['/test/host/file0.dat', '/test/host/file1.dat']
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdef\n123456789abcdef0\n')
-    with mock.patch(
-        'devil.utils.cmd_helper.GetCmdOutput', new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_paths)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/test/host/file0.dat' in out)
-      self.assertEquals('0123456789abcdef', out['/test/host/file0.dat'])
-      self.assertTrue('/test/host/file1.dat' in out)
-      self.assertEquals('123456789abcdef0', out['/test/host/file1.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, "-gz", mock.ANY])
-
-  def testCalculateDeviceMd5Sums_noPaths(self):
-    device = mock.NonCallableMock()
-    device.RunShellCommand = mock.Mock(side_effect=Exception())
-
-    out = md5sum.CalculateDeviceMd5Sums([], device)
-    self.assertEquals(0, len(out))
-
-  def testCalculateDeviceMd5Sums_singlePath(self):
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = ['0123456789abcdef',]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdef',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_list(self):
-    test_path = [
-        '/storage/emulated/legacy/test/file0.dat',
-        '/storage/emulated/legacy/test/file1.dat'
-    ]
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdef',
-        '123456789abcdef0',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdef',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
-      self.assertEquals('123456789abcdef0',
-                        out['/storage/emulated/legacy/test/file1.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_generator(self):
-    test_path = ('/storage/emulated/legacy/test/file%d.dat' % n
-                 for n in range(0, 2))
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdef',
-        '123456789abcdef0',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdef',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
-      self.assertEquals('123456789abcdef0',
-                        out['/storage/emulated/legacy/test/file1.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self):
-    # See crbug/479966
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
-        'unused DT entry: type 0x1d arg 0x15db',
-        'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
-        '0123456789abcdef',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdef',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_list_fileMissing(self):
-    test_path = [
-        '/storage/emulated/legacy/test/file0.dat',
-        '/storage/emulated/legacy/test/file1.dat'
-    ]
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdef',
-        '[0819/203513:ERROR:md5sum.cc(25)] Could not open file asdf',
-        '',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdef',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_requiresBinary(self):
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device.adb = mock.NonCallableMock()
-    device.adb.Push = mock.Mock()
-    device_md5sum_output = [
-        'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
-        'unused DT entry: type 0x1d arg 0x15db',
-        'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
-        '0123456789abcdef',
-    ]
-    error = device_errors.AdbShellCommandFailedError('cmd', 'out', 2)
-    device.RunShellCommand = mock.Mock(
-        side_effect=(error, '', device_md5sum_output))
-
-    with mock.patch(
-        'os.path.isdir', return_value=True), (mock.patch(
-            'os.path.getsize', return_value=1337)):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdef',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(3, len(device.RunShellCommand.call_args_list))
-      device.adb.Push.assert_called_once_with('test/out/directory/md5sum_dist',
-                                              '/data/local/tmp/md5sum')
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/ndk/__init__.py b/systrace/catapult/devil/devil/android/ndk/__init__.py
deleted file mode 100644
index edd8dbc..0000000
--- a/systrace/catapult/devil/devil/android/ndk/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This package is intended for modules that are very tightly coupled to
-# tools or APIs from the Android NDK.
diff --git a/systrace/catapult/devil/devil/android/ndk/abis.py b/systrace/catapult/devil/devil/android/ndk/abis.py
deleted file mode 100644
index e92ef2d..0000000
--- a/systrace/catapult/devil/devil/android/ndk/abis.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Android NDK ABIs.
-
-https://developer.android.com/ndk/guides/abis
-
-These constants can be compared against the value of
-devil.android.DeviceUtils.product_cpu_abi.
-"""
-
-ARM = 'armeabi-v7a'
-ARM_64 = 'arm64-v8a'
-X86 = 'x86'
-X86_64 = 'x86_64'
diff --git a/systrace/catapult/devil/devil/android/perf/__init__.py b/systrace/catapult/devil/devil/android/perf/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/systrace/catapult/devil/devil/android/perf/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/systrace/catapult/devil/devil/android/perf/cache_control.py b/systrace/catapult/devil/devil/android/perf/cache_control.py
deleted file mode 100644
index 27782b5..0000000
--- a/systrace/catapult/devil/devil/android/perf/cache_control.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-class CacheControl(object):
-  _DROP_CACHES = '/proc/sys/vm/drop_caches'
-
-  def __init__(self, device):
-    self._device = device
-
-  def DropRamCaches(self):
-    """Drops the filesystem ram caches for performance testing."""
-    self._device.RunShellCommand(['sync'], check_return=True, as_root=True)
-    self._device.WriteFile(CacheControl._DROP_CACHES, '3', as_root=True)
diff --git a/systrace/catapult/devil/devil/android/perf/perf_control.py b/systrace/catapult/devil/devil/android/perf/perf_control.py
deleted file mode 100644
index 398b27f..0000000
--- a/systrace/catapult/devil/devil/android/perf/perf_control.py
+++ /dev/null
@@ -1,421 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import atexit
-import logging
-import re
-
-from devil.android import device_errors
-
-logger = logging.getLogger(__name__)
-_atexit_messages = set()
-
-# Defines how to switch between the default performance configuration
-# ('default_mode') and the mode for use when benchmarking ('high_perf_mode').
-# For devices not in the list the defaults are to set up the scaling governor to
-# 'performance' and reset it back to 'ondemand' when benchmarking is finished.
-#
-# The 'default_mode_governor' is mandatory to define, while
-# 'high_perf_mode_governor' is not taken into account. The latter is because the
-# governor 'performance' is currently used for all benchmarking on all devices.
-#
-# TODO(crbug.com/383566): Add definitions for all devices used in the perf
-# waterfall.
-_PERFORMANCE_MODE_DEFINITIONS = {
-    # Fire TV Edition - 4K
-    'AFTKMST12': {
-        'default_mode_governor': 'interactive',
-    },
-    # Pixel 3
-    'blueline': {
-        'high_perf_mode': {
-            'bring_cpu_cores_online': True,
-            # The SoC is Arm big.LITTLE. The cores 0..3 are LITTLE,
-            # the 4..7 are big.
-            'cpu_max_freq': {
-                '0..3': 1228800,
-                '4..7': 1536000
-            },
-            'gpu_max_freq': 520000000,
-        },
-        'default_mode': {
-            'cpu_max_freq': {
-                '0..3': 1766400,
-                '4..7': 2649600
-            },
-            'gpu_max_freq': 710000000,
-        },
-        'big_cores': ['4', '5', '6', '7'],
-        'default_mode_governor': 'schedutil',
-    },
-    'Pixel 2': {
-        'high_perf_mode': {
-            'bring_cpu_cores_online': True,
-            # These are set to roughly 7/8 of the max frequency. The purpose of
-            # this is to ensure that thermal throttling doesn't kick in midway
-            # through a test and cause flaky results. It should also improve the
-            # longevity of the devices by keeping them cooler.
-            'cpu_max_freq': {
-                '0..3': 1670400,
-                '4..7': 2208000,
-            },
-            'gpu_max_freq': 670000000,
-        },
-        'default_mode': {
-            # These are the maximum frequencies available for these CPUs and
-            # GPUs.
-            'cpu_max_freq': {
-                '0..3': 1900800,
-                '4..7': 2457600,
-            },
-            'gpu_max_freq': 710000000,
-        },
-        'big_cores': ['4', '5', '6', '7'],
-        'default_mode_governor': 'schedutil',
-    },
-    'GT-I9300': {
-        'default_mode_governor': 'pegasusq',
-    },
-    'Galaxy Nexus': {
-        'default_mode_governor': 'interactive',
-    },
-    # Pixel
-    'msm8996': {
-        'high_perf_mode': {
-            'bring_cpu_cores_online': True,
-            'cpu_max_freq': 1209600,
-            'gpu_max_freq': 315000000,
-        },
-        'default_mode': {
-            # The SoC is Arm big.LITTLE. The cores 0..1 are LITTLE,
-            # the 2..3 are big.
-            'cpu_max_freq': {
-                '0..1': 1593600,
-                '2..3': 2150400
-            },
-            'gpu_max_freq': 624000000,
-        },
-        'big_cores': ['2', '3'],
-        'default_mode_governor': 'sched',
-    },
-    'Nexus 7': {
-        'default_mode_governor': 'interactive',
-    },
-    'Nexus 10': {
-        'default_mode_governor': 'interactive',
-    },
-    'Nexus 4': {
-        'high_perf_mode': {
-            'bring_cpu_cores_online': True,
-        },
-        'default_mode_governor': 'ondemand',
-    },
-    'Nexus 5': {
-        # The list of possible GPU frequency values can be found in:
-        #     /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies.
-        # For CPU cores the possible frequency values are at:
-        #     /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
-        'high_perf_mode': {
-            'bring_cpu_cores_online': True,
-            'cpu_max_freq': 1190400,
-            'gpu_max_freq': 200000000,
-        },
-        'default_mode': {
-            'cpu_max_freq': 2265600,
-            'gpu_max_freq': 450000000,
-        },
-        'default_mode_governor': 'ondemand',
-    },
-    'Nexus 5X': {
-        'high_perf_mode': {
-            'bring_cpu_cores_online': True,
-            'cpu_max_freq': 1248000,
-            'gpu_max_freq': 300000000,
-        },
-        'default_mode': {
-            'governor': 'ondemand',
-            # The SoC is ARM big.LITTLE. The cores 4..5 are big,
-            # the 0..3 are LITTLE.
-            'cpu_max_freq': {
-                '0..3': 1440000,
-                '4..5': 1824000
-            },
-            'gpu_max_freq': 600000000,
-        },
-        'big_cores': ['4', '5'],
-        'default_mode_governor': 'ondemand',
-    },
-}
-
-
-def _GetPerfModeDefinitions(product_model):
-  if product_model.startswith('AOSP on '):
-    product_model = product_model.replace('AOSP on ', '')
-  return _PERFORMANCE_MODE_DEFINITIONS.get(product_model)
-
-
-def _NoisyWarning(message):
-  message += ' Results may be NOISY!!'
-  logger.warning(message)
-  # Add an additional warning at exit, such that it's clear that any results
-  # may be different/noisy (due to the lack of intended performance mode).
-  if message not in _atexit_messages:
-    _atexit_messages.add(message)
-    atexit.register(logger.warning, message)
-
-
-class PerfControl(object):
-  """Provides methods for setting the performance mode of a device."""
-
-  _AVAILABLE_GOVERNORS_REL_PATH = 'cpufreq/scaling_available_governors'
-  _CPU_FILE_PATTERN = re.compile(r'^cpu\d+$')
-  _CPU_PATH = '/sys/devices/system/cpu'
-  _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max'
-
-  def __init__(self, device):
-    self._device = device
-    self._cpu_files = []
-    for file_name in self._device.ListDirectory(self._CPU_PATH, as_root=True):
-      if self._CPU_FILE_PATTERN.match(file_name):
-        self._cpu_files.append(file_name)
-    assert self._cpu_files, 'Failed to detect CPUs.'
-    self._cpu_file_list = ' '.join(self._cpu_files)
-    logger.info('CPUs found: %s', self._cpu_file_list)
-
-    self._have_mpdecision = self._device.FileExists('/system/bin/mpdecision')
-
-    raw = self._ReadEachCpuFile(self._AVAILABLE_GOVERNORS_REL_PATH)
-    self._available_governors = [
-        (cpu, raw_governors.strip().split() if not exit_code else None)
-        for cpu, raw_governors, exit_code in raw
-    ]
-
-  def _SetMaxFrequenciesFromMode(self, mode):
-    """Set maximum frequencies for GPU and CPU cores.
-
-    Args:
-      mode: A dictionary mapping optional keys 'cpu_max_freq' and 'gpu_max_freq'
-            to integer values of frequency supported by the device.
-    """
-    cpu_max_freq = mode.get('cpu_max_freq')
-    if cpu_max_freq:
-      if not isinstance(cpu_max_freq, dict):
-        self._SetScalingMaxFreqForCpus(cpu_max_freq, self._cpu_file_list)
-      else:
-        for key, max_frequency in cpu_max_freq.items():
-          # Convert 'X' to 'cpuX' and 'X..Y' to 'cpuX cpu<X+1> .. cpuY'.
-          if '..' in key:
-            range_min, range_max = key.split('..')
-            range_min, range_max = int(range_min), int(range_max)
-          else:
-            range_min = range_max = int(key)
-          cpu_files = [
-              'cpu%d' % number for number in range(range_min, range_max + 1)
-          ]
-          # Set the |max_frequency| on requested subset of the cores.
-          self._SetScalingMaxFreqForCpus(max_frequency, ' '.join(cpu_files))
-    gpu_max_freq = mode.get('gpu_max_freq')
-    if gpu_max_freq:
-      self._SetMaxGpuClock(gpu_max_freq)
-
-  def SetHighPerfMode(self):
-    """Sets the highest stable performance mode for the device."""
-    try:
-      self._device.EnableRoot()
-    except device_errors.CommandFailedError:
-      _NoisyWarning('Need root for performance mode.')
-      return
-    mode_definitions = _GetPerfModeDefinitions(self._device.product_model)
-    if not mode_definitions:
-      self.SetScalingGovernor('performance')
-      return
-    high_perf_mode = mode_definitions.get('high_perf_mode')
-    if not high_perf_mode:
-      self.SetScalingGovernor('performance')
-      return
-    if high_perf_mode.get('bring_cpu_cores_online', False):
-      self._ForceAllCpusOnline(True)
-      if not self._AllCpusAreOnline():
-        _NoisyWarning('Failed to force CPUs online.')
-    # Scaling governor must be set _after_ bringing all CPU cores online,
-    # otherwise it would not affect the cores that are currently offline.
-    self.SetScalingGovernor('performance')
-    self._SetMaxFrequenciesFromMode(high_perf_mode)
-
-  def SetLittleOnlyMode(self):
-    """Turns off big CPU cores on the device."""
-    try:
-      self._device.EnableRoot()
-    except device_errors.CommandFailedError:
-      _NoisyWarning('Need root to turn off cores.')
-      return
-    mode_definitions = _GetPerfModeDefinitions(self._device.product_model)
-    if not mode_definitions:
-      _NoisyWarning('Unknown device: %s. Can\'t turn off cores.'
-                    % self._device.product_model)
-      return
-    big_cores = mode_definitions.get('big_cores', [])
-    if not big_cores:
-      _NoisyWarning('No mode definition for device: %s.' %
-                    self._device.product_model)
-      return
-    self._ForceCpusOffline(cpu_list=big_cores)
-
-  def SetDefaultPerfMode(self):
-    """Sets the performance mode for the device to its default mode."""
-    if not self._device.HasRoot():
-      return
-    mode_definitions = _GetPerfModeDefinitions(self._device.product_model)
-    if not mode_definitions:
-      self.SetScalingGovernor('ondemand')
-    else:
-      default_mode_governor = mode_definitions.get('default_mode_governor')
-      assert default_mode_governor, ('Default mode governor must be provided '
-                                     'for all perf mode definitions.')
-      self.SetScalingGovernor(default_mode_governor)
-      default_mode = mode_definitions.get('default_mode')
-      if default_mode:
-        self._SetMaxFrequenciesFromMode(default_mode)
-    self._ForceAllCpusOnline(False)
-
-  def SetPerfProfilingMode(self):
-    """Enables all cores for reliable perf profiling."""
-    self._ForceAllCpusOnline(True)
-    self.SetScalingGovernor('performance')
-    if not self._AllCpusAreOnline():
-      if not self._device.HasRoot():
-        raise RuntimeError('Need root to force CPUs online.')
-      raise RuntimeError('Failed to force CPUs online.')
-
-  def GetCpuInfo(self):
-    online = (output.rstrip() == '1' and status == 0
-              for (_, output, status) in self._ForEachCpu('cat "$CPU/online"'))
-    governor = (
-        output.rstrip() if status == 0 else None
-        for (_, output,
-             status) in self._ForEachCpu('cat "$CPU/cpufreq/scaling_governor"'))
-    return zip(self._cpu_files, online, governor)
-
-  def _ForEachCpu(self, cmd, cpu_list=None):
-    """Runs a command on the device for each of the CPUs.
-
-    Args:
-      cmd: A string with a shell command, may may use shell expansion: "$CPU" to
-           refer to the current CPU in the string form (e.g. "cpu0", "cpu1",
-           and so on).
-      cpu_list: A space-separated string of CPU core names, like in the example
-           above
-    Returns:
-      A list of tuples in the form (cpu_string, command_output, exit_code), one
-      tuple per each command invocation. As usual, all lines of the output
-      command are joined into one line with spaces.
-    """
-    if cpu_list is None:
-      cpu_list = self._cpu_file_list
-    script = '; '.join([
-        'for CPU in %s' % cpu_list,
-        'do %s' % cmd, 'echo -n "%~%$?%~%"', 'done'
-    ])
-    output = self._device.RunShellCommand(
-        script, cwd=self._CPU_PATH, check_return=True, as_root=True, shell=True)
-    output = '\n'.join(output).split('%~%')
-    return zip(self._cpu_files, output[0::2], (int(c) for c in output[1::2]))
-
-  def _ConditionallyWriteCpuFiles(self, path, value, cpu_files, condition):
-    template = (
-        '{condition} && test -e "$CPU/{path}" && echo {value} > "$CPU/{path}"')
-    results = self._ForEachCpu(
-        template.format(path=path, value=value, condition=condition), cpu_files)
-    cpus = ' '.join(cpu for (cpu, _, status) in results if status == 0)
-    if cpus:
-      logger.info('Successfully set %s to %r on: %s', path, value, cpus)
-    else:
-      logger.warning('Failed to set %s to %r on any cpus', path, value)
-
-  def _WriteCpuFiles(self, path, value, cpu_files):
-    self._ConditionallyWriteCpuFiles(path, value, cpu_files, condition='true')
-
-  def _ReadEachCpuFile(self, path):
-    return self._ForEachCpu('cat "$CPU/{path}"'.format(path=path))
-
-  def SetScalingGovernor(self, value):
-    """Sets the scaling governor to the given value on all possible CPUs.
-
-    This does not attempt to set a governor to a value not reported as available
-    on the corresponding CPU.
-
-    Args:
-      value: [string] The new governor value.
-    """
-    condition = 'test -e "{path}" && grep -q {value} {path}'.format(
-        path=('${CPU}/%s' % self._AVAILABLE_GOVERNORS_REL_PATH), value=value)
-    self._ConditionallyWriteCpuFiles('cpufreq/scaling_governor', value,
-                                     self._cpu_file_list, condition)
-
-  def GetScalingGovernor(self):
-    """Gets the currently set governor for each CPU.
-
-    Returns:
-      An iterable of 2-tuples, each containing the cpu and the current
-      governor.
-    """
-    raw = self._ReadEachCpuFile('cpufreq/scaling_governor')
-    return [(cpu, raw_governor.strip() if not exit_code else None)
-            for cpu, raw_governor, exit_code in raw]
-
-  def ListAvailableGovernors(self):
-    """Returns the list of available governors for each CPU.
-
-    Returns:
-      An iterable of 2-tuples, each containing the cpu and a list of available
-      governors for that cpu.
-    """
-    return self._available_governors
-
-  def _SetScalingMaxFreqForCpus(self, value, cpu_files):
-    self._WriteCpuFiles('cpufreq/scaling_max_freq', '%d' % value, cpu_files)
-
-  def _SetMaxGpuClock(self, value):
-    self._device.WriteFile(
-        '/sys/class/kgsl/kgsl-3d0/max_gpuclk', str(value), as_root=True)
-
-  def _AllCpusAreOnline(self):
-    results = self._ForEachCpu('cat "$CPU/online"')
-    # The file 'cpu0/online' is missing on some devices (example: Nexus 9). This
-    # is likely because on these devices it is impossible to bring the cpu0
-    # offline. Assuming the same for all devices until proven otherwise.
-    return all(output.rstrip() == '1' and status == 0
-               for (cpu, output, status) in results if cpu != 'cpu0')
-
-  def _ForceAllCpusOnline(self, force_online):
-    """Enable all CPUs on a device.
-
-    Some vendors (or only Qualcomm?) hot-plug their CPUs, which can add noise
-    to measurements:
-    - In perf, samples are only taken for the CPUs that are online when the
-      measurement is started.
-    - The scaling governor can't be set for an offline CPU and frequency scaling
-      on newly enabled CPUs adds noise to both perf and tracing measurements.
-
-    It appears Qualcomm is the only vendor that hot-plugs CPUs, and on Qualcomm
-    this is done by "mpdecision".
-
-    """
-    if self._have_mpdecision:
-      cmd = ['stop', 'mpdecision'] if force_online else ['start', 'mpdecision']
-      self._device.RunShellCommand(cmd, check_return=True, as_root=True)
-
-    if not self._have_mpdecision and not self._AllCpusAreOnline():
-      logger.warning('Unexpected cpu hot plugging detected.')
-
-    if force_online:
-      self._ForEachCpu('echo 1 > "$CPU/online"')
-
-  def _ForceCpusOffline(self, cpu_list):
-    """Disable selected CPUs on a device."""
-    if self._have_mpdecision:
-      cmd = ['stop', 'mpdecision']
-      self._device.RunShellCommand(cmd, check_return=True, as_root=True)
-
-    self._ForEachCpu('echo 0 > "$CPU/online"', cpu_list=cpu_list)
diff --git a/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py b/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py
deleted file mode 100644
index f73601a..0000000
--- a/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-# pylint: disable=W0212
-
-import os
-import sys
-import unittest
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.perf import perf_control
-
-
-class TestPerfControl(device_test_case.DeviceTestCase):
-  def setUp(self):
-    super(TestPerfControl, self).setUp()
-    if not os.getenv('BUILDTYPE'):
-      os.environ['BUILDTYPE'] = 'Debug'
-    self._device = device_utils.DeviceUtils(self.serial)
-
-  def testHighPerfMode(self):
-    perf = perf_control.PerfControl(self._device)
-    try:
-      perf.SetPerfProfilingMode()
-      cpu_info = perf.GetCpuInfo()
-      self.assertEquals(len(perf._cpu_files), len(cpu_info))
-      for _, online, governor in cpu_info:
-        self.assertTrue(online)
-        self.assertEquals('performance', governor)
-    finally:
-      perf.SetDefaultPerfMode()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/perf/perf_control_test.py b/systrace/catapult/devil/devil/android/perf/perf_control_test.py
deleted file mode 100644
index a841a0e..0000000
--- a/systrace/catapult/devil/devil/android/perf/perf_control_test.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.perf import perf_control
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock
-
-
-# pylint: disable=unused-argument
-def _ShellCommandHandler(cmd,
-                         shell=False,
-                         check_return=False,
-                         cwd=None,
-                         env=None,
-                         run_as=None,
-                         as_root=False,
-                         single_line=False,
-                         large_output=False,
-                         raw_output=False,
-                         timeout=None,
-                         retries=None):
-  if cmd.startswith('for CPU in '):
-    if 'scaling_available_governors' in cmd:
-      contents = 'interactive ondemand userspace powersave performance'
-      return [contents + '\n%~%0%~%'] * 4
-    if 'cat "$CPU/online"' in cmd:
-      return ['1\n%~%0%~%'] * 4
-  assert False, 'Should not be called with cmd: {}'.format(cmd)
-
-
-class PerfControlTest(unittest.TestCase):
-  @staticmethod
-  def _MockOutLowLevelPerfControlMethods(perf_control_object):
-    # pylint: disable=protected-access
-    perf_control_object.SetScalingGovernor = mock.Mock()
-    perf_control_object._ForceAllCpusOnline = mock.Mock()
-    perf_control_object._SetScalingMaxFreqForCpus = mock.Mock()
-    perf_control_object._SetMaxGpuClock = mock.Mock()
-
-  # pylint: disable=no-self-use
-  def testNexus5HighPerfMode(self):
-    # Mock out the device state for PerfControl.
-    cpu_list = ['cpu%d' % cpu for cpu in range(4)]
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.product_model = 'Nexus 5'
-    mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-    mock_device.ListDirectory.return_value = cpu_list + ['cpufreq']
-    mock_device.FileExists.return_value = True
-    mock_device.RunShellCommand = mock.Mock(side_effect=_ShellCommandHandler)
-    pc = perf_control.PerfControl(mock_device)
-    self._MockOutLowLevelPerfControlMethods(pc)
-
-    # Verify.
-    # pylint: disable=protected-access
-    # pylint: disable=no-member
-    pc.SetHighPerfMode()
-    mock_device.EnableRoot.assert_called_once_with()
-    pc._ForceAllCpusOnline.assert_called_once_with(True)
-    pc.SetScalingGovernor.assert_called_once_with('performance')
-    pc._SetScalingMaxFreqForCpus.assert_called_once_with(
-        1190400, ' '.join(cpu_list))
-    pc._SetMaxGpuClock.assert_called_once_with(200000000)
-
-  def testNexus5XHighPerfMode(self):
-    # Mock out the device state for PerfControl.
-    cpu_list = ['cpu%d' % cpu for cpu in range(6)]
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.product_model = 'Nexus 5X'
-    mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-    mock_device.ListDirectory.return_value = cpu_list + ['cpufreq']
-    mock_device.FileExists.return_value = True
-    mock_device.RunShellCommand = mock.Mock(side_effect=_ShellCommandHandler)
-    pc = perf_control.PerfControl(mock_device)
-    self._MockOutLowLevelPerfControlMethods(pc)
-
-    # Verify.
-    # pylint: disable=protected-access
-    # pylint: disable=no-member
-    pc.SetHighPerfMode()
-    mock_device.EnableRoot.assert_called_once_with()
-    pc._ForceAllCpusOnline.assert_called_once_with(True)
-    pc.SetScalingGovernor.assert_called_once_with('performance')
-    pc._SetScalingMaxFreqForCpus.assert_called_once_with(
-        1248000, ' '.join(cpu_list))
-    pc._SetMaxGpuClock.assert_called_once_with(300000000)
-
-  def testNexus5XDefaultPerfMode(self):
-    # Mock out the device state for PerfControl.
-    cpu_list = ['cpu%d' % cpu for cpu in range(6)]
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.product_model = 'Nexus 5X'
-    mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-    mock_device.ListDirectory.return_value = cpu_list + ['cpufreq']
-    mock_device.FileExists.return_value = True
-    mock_device.RunShellCommand = mock.Mock(side_effect=_ShellCommandHandler)
-    pc = perf_control.PerfControl(mock_device)
-    self._MockOutLowLevelPerfControlMethods(pc)
-
-    # Verify.
-    # pylint: disable=protected-access
-    # pylint: disable=no-member
-    pc.SetDefaultPerfMode()
-    pc.SetScalingGovernor.assert_called_once_with('ondemand')
-    pc._SetScalingMaxFreqForCpus.assert_any_call(1440000, 'cpu0 cpu1 cpu2 cpu3')
-    pc._SetScalingMaxFreqForCpus.assert_any_call(1824000, 'cpu4 cpu5')
-    pc._SetMaxGpuClock.assert_called_once_with(600000000)
-    pc._ForceAllCpusOnline.assert_called_once_with(False)
diff --git a/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py b/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py
deleted file mode 100644
index 4ddc6f5..0000000
--- a/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py
+++ /dev/null
@@ -1,223 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import re
-import threading
-
-import six
-
-if six.PY3:
-  import queue # pylint: disable=wrong-import-order
-else:
-  import Queue as queue # pylint: disable=wrong-import-order
-
-# Log marker containing SurfaceTexture timestamps.
-_SURFACE_TEXTURE_TIMESTAMPS_MESSAGE = 'SurfaceTexture update timestamps'
-_SURFACE_TEXTURE_TIMESTAMP_RE = r'\d+'
-
-
-class SurfaceStatsCollector(object):
-  """Collects surface stats for a SurfaceView from the output of SurfaceFlinger.
-
-  Args:
-    device: A DeviceUtils instance.
-  """
-
-  def __init__(self, device):
-    self._device = device
-    self._collector_thread = None
-    self._surface_before = None
-    self._get_data_event = None
-    self._data_queue = None
-    self._stop_event = None
-    self._warn_about_empty_data = True
-
-  def DisableWarningAboutEmptyData(self):
-    self._warn_about_empty_data = False
-
-  def Start(self):
-    assert not self._collector_thread
-
-    if self._ClearSurfaceFlingerLatencyData():
-      self._get_data_event = threading.Event()
-      self._stop_event = threading.Event()
-      self._data_queue = queue.Queue()
-      self._collector_thread = threading.Thread(target=self._CollectorThread)
-      self._collector_thread.start()
-    else:
-      raise Exception('SurfaceFlinger not supported on this device.')
-
-  def Stop(self):
-    assert self._collector_thread
-    (refresh_period, timestamps) = self._GetDataFromThread()
-    if self._collector_thread:
-      self._stop_event.set()
-      self._collector_thread.join()
-      self._collector_thread = None
-    return (refresh_period, timestamps)
-
-  def _CollectorThread(self):
-    last_timestamp = 0
-    timestamps = []
-    retries = 0
-
-    while not self._stop_event.is_set():
-      self._get_data_event.wait(1)
-      try:
-        refresh_period, new_timestamps = self._GetSurfaceFlingerFrameData()
-        if refresh_period is None or timestamps is None:
-          retries += 1
-          if retries < 3:
-            continue
-          if last_timestamp:
-            # Some data has already been collected, but either the app
-            # was closed or there's no new data. Signal the main thread and
-            # wait.
-            self._data_queue.put((None, None))
-            self._stop_event.wait()
-            break
-          raise Exception('Unable to get surface flinger latency data')
-
-        timestamps += [
-            timestamp for timestamp in new_timestamps
-            if timestamp > last_timestamp
-        ]
-        if len(timestamps):
-          last_timestamp = timestamps[-1]
-
-        if self._get_data_event.is_set():
-          self._get_data_event.clear()
-          self._data_queue.put((refresh_period, timestamps))
-          timestamps = []
-      except Exception as e:
-        # On any error, before aborting, put the exception into _data_queue to
-        # prevent the main thread from waiting at _data_queue.get() infinitely.
-        self._data_queue.put(e)
-        raise
-
-  def _GetDataFromThread(self):
-    self._get_data_event.set()
-    ret = self._data_queue.get()
-    if isinstance(ret, Exception):
-      raise ret
-    return ret
-
-  def _ClearSurfaceFlingerLatencyData(self):
-    """Clears the SurfaceFlinger latency data.
-
-    Returns:
-      True if SurfaceFlinger latency is supported by the device, otherwise
-      False.
-    """
-    # The command returns nothing if it is supported, otherwise returns many
-    # lines of result just like 'dumpsys SurfaceFlinger'.
-    results = self._device.RunShellCommand(
-        ['dumpsys', 'SurfaceFlinger', '--latency-clear', 'SurfaceView'],
-        check_return=True)
-    return not len(results)
-
-  def GetSurfaceFlingerPid(self):
-    try:
-      # Returns the first matching PID found.
-      return next(p.pid for p in self._device.ListProcesses('surfaceflinger'))
-    except StopIteration:
-      raise Exception('Unable to get surface flinger process id')
-
-  def _GetSurfaceViewWindowName(self):
-    results = self._device.RunShellCommand(
-        ['dumpsys', 'SurfaceFlinger', '--list'], check_return=True)
-    for window_name in results:
-      if window_name.startswith('SurfaceView'):
-        return window_name
-    return None
-
-  def _GetSurfaceFlingerFrameData(self):
-    """Returns collected SurfaceFlinger frame timing data.
-
-    Returns:
-      A tuple containing:
-      - The display's nominal refresh period in milliseconds.
-      - A list of timestamps signifying frame presentation times in
-        milliseconds.
-      The return value may be (None, None) if there was no data collected (for
-      example, if the app was closed before the collector thread has finished).
-    """
-    window_name = self._GetSurfaceViewWindowName()
-    command = ['dumpsys', 'SurfaceFlinger', '--latency']
-    # Even if we don't find the window name, run the command to get the refresh
-    # period.
-    if window_name:
-      command.append(window_name)
-    output = self._device.RunShellCommand(command, check_return=True)
-    return ParseFrameData(output, parse_timestamps=bool(window_name))
-
-
-def to_long_int(val):
-  """Cast val to a long int type."""
-  return long(val) if six.PY2 else int(val)
-
-def ParseFrameData(lines, parse_timestamps):
-  # adb shell dumpsys SurfaceFlinger --latency <window name>
-  # prints some information about the last 128 frames displayed in
-  # that window.
-  # The data returned looks like this:
-  # 16954612
-  # 7657467895508   7657482691352   7657493499756
-  # 7657484466553   7657499645964   7657511077881
-  # 7657500793457   7657516600576   7657527404785
-  # (...)
-  #
-  # The first line is the refresh period (here 16.95 ms), it is followed
-  # by 128 lines w/ 3 timestamps in nanosecond each:
-  # A) when the app started to draw
-  # B) the vsync immediately preceding SF submitting the frame to the h/w
-  # C) timestamp immediately after SF submitted that frame to the h/w
-  #
-  # The difference between the 1st and 3rd timestamp is the frame-latency.
-  # An interesting data is when the frame latency crosses a refresh period
-  # boundary, this can be calculated this way:
-  #
-  # ceil((C - A) / refresh-period)
-  #
-  # (each time the number above changes, we have a "jank").
-  # If this happens a lot during an animation, the animation appears
-  # janky, even if it runs at 60 fps in average.
-  # pylint: disable=redefined-variable-type
-  results = []
-  for line in lines:
-    # Skip over lines with anything other than digits and whitespace.
-    if re.search(r'[^\d\s]', line):
-      logging.warning('unexpected output: %s', line)
-    else:
-      results.append(line)
-  if not results:
-    return None, None
-
-  timestamps = []
-  nanoseconds_per_millisecond = 1e6
-  refresh_period = to_long_int(results[0]) / nanoseconds_per_millisecond
-
-  if not parse_timestamps:
-    return refresh_period, timestamps
-
-  # If a fence associated with a frame is still pending when we query the
-  # latency data, SurfaceFlinger gives the frame a timestamp of INT64_MAX.
-  # Since we only care about completed frames, we will ignore any timestamps
-  # with this value.
-  pending_fence_timestamp = (1 << 63) - 1
-
-  for line in results[1:]:
-    fields = line.split()
-    if len(fields) != 3:
-      logging.warning('Unexpected line: %s', line)
-      continue
-    timestamp = to_long_int(fields[1])
-
-    if timestamp == pending_fence_timestamp:
-      continue
-    timestamp /= nanoseconds_per_millisecond
-    timestamps.append(timestamp)
-
-  return refresh_period, timestamps
diff --git a/systrace/catapult/devil/devil/android/perf/surface_stats_collector_test.py b/systrace/catapult/devil/devil/android/perf/surface_stats_collector_test.py
deleted file mode 100644
index dda88ae..0000000
--- a/systrace/catapult/devil/devil/android/perf/surface_stats_collector_test.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from devil.android.perf import surface_stats_collector
-
-
-class SurfaceStatsCollectorTests(unittest.TestCase):
-  def testParseFrameData_simple(self):
-    actual = surface_stats_collector.ParseFrameData([
-        '16954612',
-        '7657467895508   7657482691352   7657493499756',
-        '7657484466553   7657499645964   7657511077881',
-        '7657500793457   7657516600576   7657527404785',
-    ],
-                                                    parse_timestamps=True)
-    self.assertEqual(
-        actual, (16.954612, [7657482.691352, 7657499.645964, 7657516.600576]))
-
-  def testParseFrameData_withoutTimestamps(self):
-    actual = surface_stats_collector.ParseFrameData([
-        '16954612',
-        '7657467895508   7657482691352   7657493499756',
-        '7657484466553   7657499645964   7657511077881',
-        '7657500793457   7657516600576   7657527404785',
-    ],
-                                                    parse_timestamps=False)
-    self.assertEqual(actual, (16.954612, []))
-
-  def testParseFrameData_withWarning(self):
-    actual = surface_stats_collector.ParseFrameData([
-        'SurfaceFlinger appears to be unresponsive, dumping anyways',
-        '16954612',
-        '7657467895508   7657482691352   7657493499756',
-        '7657484466553   7657499645964   7657511077881',
-        '7657500793457   7657516600576   7657527404785',
-    ],
-                                                    parse_timestamps=True)
-    self.assertEqual(
-        actual, (16.954612, [7657482.691352, 7657499.645964, 7657516.600576]))
diff --git a/systrace/catapult/devil/devil/android/perf/thermal_throttle.py b/systrace/catapult/devil/devil/android/perf/thermal_throttle.py
deleted file mode 100644
index 9b8dc07..0000000
--- a/systrace/catapult/devil/devil/android/perf/thermal_throttle.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-class OmapThrottlingDetector(object):
-  """Class to detect and track thermal throttling on an OMAP 4."""
-  OMAP_TEMP_FILE = ('/sys/devices/platform/omap/omap_temp_sensor.0/'
-                    'temperature')
-
-  @staticmethod
-  def IsSupported(device):
-    return device.FileExists(OmapThrottlingDetector.OMAP_TEMP_FILE)
-
-  def __init__(self, device):
-    self._device = device
-
-  @staticmethod
-  def BecameThrottled(log_line):
-    return 'omap_thermal_throttle' in log_line
-
-  @staticmethod
-  def BecameUnthrottled(log_line):
-    return 'omap_thermal_unthrottle' in log_line
-
-  @staticmethod
-  def GetThrottlingTemperature(log_line):
-    if 'throttle_delayed_work_fn' in log_line:
-      return float([s for s in log_line.split() if s.isdigit()][0]) / 1000.0
-
-  def GetCurrentTemperature(self):
-    tempdata = self._device.ReadFile(OmapThrottlingDetector.OMAP_TEMP_FILE)
-    return float(tempdata) / 1000.0
-
-
-class ExynosThrottlingDetector(object):
-  """Class to detect and track thermal throttling on an Exynos 5."""
-
-  @staticmethod
-  def IsSupported(device):
-    return device.FileExists('/sys/bus/exynos5-core')
-
-  def __init__(self, device):
-    pass
-
-  @staticmethod
-  def BecameThrottled(log_line):
-    return 'exynos_tmu: Throttling interrupt' in log_line
-
-  @staticmethod
-  def BecameUnthrottled(log_line):
-    return 'exynos_thermal_unthrottle: not throttling' in log_line
-
-  @staticmethod
-  def GetThrottlingTemperature(_log_line):
-    return None
-
-  @staticmethod
-  def GetCurrentTemperature():
-    return None
-
-
-class ThermalThrottle(object):
-  """Class to detect and track thermal throttling.
-
-  Usage:
-    Wait for IsThrottled() to be False before running test
-    After running test call HasBeenThrottled() to find out if the
-    test run was affected by thermal throttling.
-  """
-
-  def __init__(self, device):
-    self._device = device
-    self._throttled = False
-    self._detector = None
-    # pylint: disable=redefined-variable-type
-    if OmapThrottlingDetector.IsSupported(device):
-      self._detector = OmapThrottlingDetector(device)
-    elif ExynosThrottlingDetector.IsSupported(device):
-      self._detector = ExynosThrottlingDetector(device)
-
-  def HasBeenThrottled(self):
-    """True if there has been any throttling since the last call to
-       HasBeenThrottled or IsThrottled.
-    """
-    return self._ReadLog()
-
-  def IsThrottled(self):
-    """True if currently throttled."""
-    self._ReadLog()
-    return self._throttled
-
-  def _ReadLog(self):
-    if not self._detector:
-      return False
-    has_been_throttled = False
-    serial_number = str(self._device)
-    log = self._device.RunShellCommand(['dmesg', '-c'],
-                                       large_output=True,
-                                       check_return=True)
-    degree_symbol = unichr(0x00B0)
-    for line in log:
-      if self._detector.BecameThrottled(line):
-        if not self._throttled:
-          logger.warning('>>> Device %s thermally throttled', serial_number)
-        self._throttled = True
-        has_been_throttled = True
-      elif self._detector.BecameUnthrottled(line):
-        if self._throttled:
-          logger.warning('>>> Device %s thermally unthrottled', serial_number)
-        self._throttled = False
-        has_been_throttled = True
-      temperature = self._detector.GetThrottlingTemperature(line)
-      if temperature is not None:
-        logger.info(u'Device %s thermally throttled at %3.1f%sC', serial_number,
-                    temperature, degree_symbol)
-
-    if logger.isEnabledFor(logging.DEBUG):
-      # Print current temperature of CPU SoC.
-      temperature = self._detector.GetCurrentTemperature()
-      if temperature is not None:
-        logger.debug(u'Current SoC temperature of %s = %3.1f%sC', serial_number,
-                     temperature, degree_symbol)
-
-      # Print temperature of battery, to give a system temperature
-      dumpsys_log = self._device.RunShellCommand(['dumpsys', 'battery'],
-                                                 check_return=True)
-      for line in dumpsys_log:
-        if 'temperature' in line:
-          btemp = float([s for s in line.split() if s.isdigit()][0]) / 10.0
-          logger.debug(u'Current battery temperature of %s = %3.1f%sC',
-                       serial_number, btemp, degree_symbol)
-
-    return has_been_throttled
diff --git a/systrace/catapult/devil/devil/android/ports.py b/systrace/catapult/devil/devil/android/ports.py
deleted file mode 100644
index 4a7c294..0000000
--- a/systrace/catapult/devil/devil/android/ports.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Functions that deal with local and device ports."""
-
-import contextlib
-import fcntl
-import httplib
-import logging
-import os
-import socket
-import traceback
-
-logger = logging.getLogger(__name__)
-
-# The net test server is started from port 10201.
-_TEST_SERVER_PORT_FIRST = 10201
-_TEST_SERVER_PORT_LAST = 30000
-# A file to record next valid port of test server.
-_TEST_SERVER_PORT_FILE = '/tmp/test_server_port'
-_TEST_SERVER_PORT_LOCKFILE = '/tmp/test_server_port.lock'
-
-
-# The following two methods are used to allocate the port source for various
-# types of test servers. Because some net-related tests can be run on shards at
-# same time, it's important to have a mechanism to allocate the port
-# process-safe. In here, we implement the safe port allocation by leveraging
-# flock.
-def ResetTestServerPortAllocation():
-  """Resets the port allocation to start from TEST_SERVER_PORT_FIRST.
-
-  Returns:
-    Returns True if reset successes. Otherwise returns False.
-  """
-  try:
-    with open(_TEST_SERVER_PORT_FILE, 'w') as fp:
-      fp.write('%d' % _TEST_SERVER_PORT_FIRST)
-    return True
-  except Exception:  # pylint: disable=broad-except
-    logger.exception('Error while resetting port allocation')
-  return False
-
-
-def AllocateTestServerPort():
-  """Allocates a port incrementally.
-
-  Returns:
-    Returns a valid port which should be in between TEST_SERVER_PORT_FIRST and
-    TEST_SERVER_PORT_LAST. Returning 0 means no more valid port can be used.
-  """
-  port = 0
-  ports_tried = []
-  try:
-    fp_lock = open(_TEST_SERVER_PORT_LOCKFILE, 'w')
-    fcntl.flock(fp_lock, fcntl.LOCK_EX)
-    # Get current valid port and calculate next valid port.
-    if not os.path.exists(_TEST_SERVER_PORT_FILE):
-      ResetTestServerPortAllocation()
-    with open(_TEST_SERVER_PORT_FILE, 'r+') as fp:
-      port = int(fp.read())
-      ports_tried.append(port)
-      while not IsHostPortAvailable(port):
-        port += 1
-        ports_tried.append(port)
-      if port > _TEST_SERVER_PORT_LAST or port < _TEST_SERVER_PORT_FIRST:
-        port = 0
-      else:
-        fp.seek(0, os.SEEK_SET)
-        fp.write('%d' % (port + 1))
-  except Exception:  # pylint: disable=broad-except
-    logger.exception('Error while allocating port')
-  finally:
-    if fp_lock:
-      fcntl.flock(fp_lock, fcntl.LOCK_UN)
-      fp_lock.close()
-  if port:
-    logger.info('Allocate port %d for test server.', port)
-  else:
-    logger.error(
-        'Could not allocate port for test server. '
-        'List of ports tried: %s', str(ports_tried))
-  return port
-
-
-def IsHostPortAvailable(host_port):
-  """Checks whether the specified host port is available.
-
-  Args:
-    host_port: Port on host to check.
-
-  Returns:
-    True if the port on host is available, otherwise returns False.
-  """
-  s = socket.socket()
-  try:
-    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    s.bind(('', host_port))
-    s.close()
-    return True
-  except socket.error:
-    return False
-
-
-def IsDevicePortUsed(device, device_port, state=''):
-  """Checks whether the specified device port is used or not.
-
-  Args:
-    device: A DeviceUtils instance.
-    device_port: Port on device we want to check.
-    state: String of the specified state. Default is empty string, which
-           means any state.
-
-  Returns:
-    True if the port on device is already used, otherwise returns False.
-  """
-  base_urls = ('127.0.0.1:%d' % device_port, 'localhost:%d' % device_port)
-  netstat_results = device.RunShellCommand(['netstat', '-an'],
-                                           check_return=True,
-                                           large_output=True)
-  for single_connect in netstat_results:
-    # Column 3 is the local address which we want to check with.
-    connect_results = single_connect.split()
-    if connect_results[0] != 'tcp':
-      continue
-    if len(connect_results) < 6:
-      raise Exception('Unexpected format while parsing netstat line: ' +
-                      single_connect)
-    is_state_match = connect_results[5] == state if state else True
-    if connect_results[3] in base_urls and is_state_match:
-      return True
-  return False
-
-
-def IsHttpServerConnectable(host,
-                            port,
-                            tries=3,
-                            command='GET',
-                            path='/',
-                            expected_read='',
-                            timeout=2):
-  """Checks whether the specified http server is ready to serve request or not.
-
-  Args:
-    host: Host name of the HTTP server.
-    port: Port number of the HTTP server.
-    tries: How many times we want to test the connection. The default value is
-           3.
-    command: The http command we use to connect to HTTP server. The default
-             command is 'GET'.
-    path: The path we use when connecting to HTTP server. The default path is
-          '/'.
-    expected_read: The content we expect to read from the response. The default
-                   value is ''.
-    timeout: Timeout (in seconds) for each http connection. The default is 2s.
-
-  Returns:
-    Tuple of (connect status, client error). connect status is a boolean value
-    to indicate whether the server is connectable. client_error is the error
-    message the server returns when connect status is false.
-  """
-  assert tries >= 1
-  for i in range(0, tries):
-    client_error = None
-    try:
-      with contextlib.closing(
-          httplib.HTTPConnection(host, port, timeout=timeout)) as http:
-        # Output some debug information when we have tried more than 2 times.
-        http.set_debuglevel(i >= 2)
-        http.request(command, path)
-        r = http.getresponse()
-        content = r.read()
-        if r.status == 200 and r.reason == 'OK' and content == expected_read:
-          return (True, '')
-        client_error = ('Bad response: %s %s version %s\n  ' %
-                        (r.status, r.reason, r.version) + '\n  '.join(
-                            [': '.join(h) for h in r.getheaders()]))
-    except (httplib.HTTPException, socket.error) as e:
-      # Probably too quick connecting: try again.
-      exception_error_msgs = traceback.format_exception_only(type(e), e)
-      if exception_error_msgs:
-        client_error = ''.join(exception_error_msgs)
-  # Only returns last client_error.
-  return (False, client_error or 'Timeout')
diff --git a/systrace/catapult/devil/devil/android/sdk/__init__.py b/systrace/catapult/devil/devil/android/sdk/__init__.py
deleted file mode 100644
index f95d3b2..0000000
--- a/systrace/catapult/devil/devil/android/sdk/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This package is intended for modules that are very tightly coupled to
-# tools or APIs from the Android SDK.
diff --git a/systrace/catapult/devil/devil/android/sdk/aapt.py b/systrace/catapult/devil/devil/android/sdk/aapt.py
deleted file mode 100644
index fd35407..0000000
--- a/systrace/catapult/devil/devil/android/sdk/aapt.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""This module wraps the Android Asset Packaging Tool."""
-
-import six
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-_aapt_path = lazy.WeakConstant(lambda: build_tools.GetPath('aapt'))
-
-
-def _RunAaptCmd(args):
-  """Runs an aapt command.
-
-  Args:
-    args: A list of arguments for aapt.
-
-  Returns:
-    The output of the command.
-  """
-  cmd = [_aapt_path.read()] + args
-  status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-  if status != 0:
-    raise Exception('Failed running aapt command: "%s" with output "%s".' %
-                    (' '.join(cmd), output))
-  return output
-
-
-def Dump(what, apk, assets=None):
-  """Returns the output of the aapt dump command.
-
-  Args:
-    what: What you want to dump.
-    apk: Path to apk you want to dump information for.
-    assets: List of assets in apk you want to dump information for.
-  """
-  assets = assets or []
-  if isinstance(assets, six.string_types):
-    assets = [assets]
-  return _RunAaptCmd(['dump', what, apk] + assets).splitlines()
diff --git a/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py b/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
deleted file mode 100644
index d2c2d4f..0000000
--- a/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
+++ /dev/null
@@ -1,226 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import posixpath
-import random
-import signal
-import sys
-import unittest
-
-_CATAPULT_BASE_DIR = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
-
-sys.path.append(os.path.join(_CATAPULT_BASE_DIR, 'devil'))
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_test_case
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-from devil.utils import timeout_retry
-
-_TEST_DATA_DIR = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), 'test', 'data'))
-
-
-def _hostAdbPids():
-  ps_status, ps_output = cmd_helper.GetCmdStatusAndOutput(
-      ['pgrep', '-l', 'adb'])
-  if ps_status != 0:
-    return []
-
-  pids_and_names = (line.split() for line in ps_output.splitlines())
-  return [int(pid) for pid, name in pids_and_names if name == 'adb']
-
-
-class AdbCompatibilityTest(device_test_case.DeviceTestCase):
-  @classmethod
-  def setUpClass(cls):
-    custom_adb_path = os.environ.get('ADB_PATH')
-    custom_deps = {
-        'config_type': 'BaseConfig',
-        'dependencies': {},
-    }
-    if custom_adb_path:
-      custom_deps['dependencies']['adb'] = {
-          'file_info': {
-              devil_env.GetPlatform(): {
-                  'local_paths': [custom_adb_path],
-              },
-          },
-      }
-    devil_env.config.Initialize(configs=[custom_deps])
-
-  def testStartServer(self):
-    # Manually kill off any instances of adb.
-    adb_pids = _hostAdbPids()
-    for p in adb_pids:
-      os.kill(p, signal.SIGKILL)
-
-    self.assertIsNotNone(
-        timeout_retry.WaitFor(
-            lambda: not _hostAdbPids(), wait_period=0.1, max_tries=10))
-
-    # start the adb server
-    start_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
-        [adb_wrapper.AdbWrapper.GetAdbPath(), 'start-server'])
-
-    # verify that the server is now online
-    self.assertEquals(0, start_server_status)
-    self.assertIsNotNone(
-        timeout_retry.WaitFor(
-            lambda: bool(_hostAdbPids()), wait_period=0.1, max_tries=10))
-
-  def testKillServer(self):
-    adb_pids = _hostAdbPids()
-    if not adb_pids:
-      adb_wrapper.AdbWrapper.StartServer()
-
-    adb_pids = _hostAdbPids()
-    self.assertGreaterEqual(len(adb_pids), 1)
-
-    kill_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
-        [adb_wrapper.AdbWrapper.GetAdbPath(), 'kill-server'])
-    self.assertEqual(0, kill_server_status)
-
-    adb_pids = _hostAdbPids()
-    self.assertEqual(0, len(adb_pids))
-
-  def testDevices(self):
-    devices = adb_wrapper.AdbWrapper.Devices()
-    self.assertNotEqual(0, len(devices), 'No devices found.')
-
-  def getTestInstance(self):
-    """Creates a real AdbWrapper instance for testing."""
-    return adb_wrapper.AdbWrapper(self.serial)
-
-  def testShell(self):
-    under_test = self.getTestInstance()
-    shell_ls_result = under_test.Shell('ls')
-    self.assertIsInstance(shell_ls_result, str)
-    self.assertTrue(bool(shell_ls_result))
-
-  def testShell_failed(self):
-    under_test = self.getTestInstance()
-    with self.assertRaises(device_errors.AdbShellCommandFailedError):
-      under_test.Shell('ls /foo/bar/baz')
-
-  def testShell_externalStorageDefined(self):
-    under_test = self.getTestInstance()
-    external_storage = under_test.Shell('echo $EXTERNAL_STORAGE')
-    self.assertIsInstance(external_storage, str)
-    self.assertTrue(posixpath.isabs(external_storage))
-
-  @contextlib.contextmanager
-  def getTestPushDestination(self, under_test):
-    """Creates a temporary directory suitable for pushing to."""
-    external_storage = under_test.Shell('echo $EXTERNAL_STORAGE').strip()
-    if not external_storage:
-      self.skipTest('External storage not available.')
-    while True:
-      random_hex = hex(random.randint(0, 2**52))[2:]
-      name = 'tmp_push_test%s' % random_hex
-      path = posixpath.join(external_storage, name)
-      try:
-        under_test.Shell('ls %s' % path)
-      except device_errors.AdbShellCommandFailedError:
-        break
-    under_test.Shell('mkdir %s' % path)
-    try:
-      yield path
-    finally:
-      under_test.Shell('rm -rf %s' % path)
-
-  def testPush_fileToFile(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
-      dest = posixpath.join(push_target_directory, 'push_file.txt')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % dest)
-      under_test.Push(src, dest)
-      self.assertEquals(dest, under_test.Shell('ls %s' % dest).strip())
-
-  def testPush_fileToDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
-      dest = push_target_directory
-      resulting_file = posixpath.join(dest, 'push_file.txt')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % resulting_file)
-      under_test.Push(src, dest)
-      self.assertEquals(resulting_file,
-                        under_test.Shell('ls %s' % resulting_file).strip())
-
-  def testPush_directoryToDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_directory')
-      dest = posixpath.join(push_target_directory, 'push_directory')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % dest)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          sorted(os.listdir(src)),
-          sorted(under_test.Shell('ls %s' % dest).strip().split()))
-
-  def testPush_directoryToExistingDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_directory')
-      dest = push_target_directory
-      resulting_directory = posixpath.join(dest, 'push_directory')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % resulting_directory)
-      under_test.Shell('mkdir %s' % resulting_directory)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          sorted(os.listdir(src)),
-          sorted(under_test.Shell('ls %s' % resulting_directory).split()))
-
-  # TODO(jbudorick): Implement tests for the following:
-  # taskset -c
-  # devices [-l]
-  # pull
-  # shell
-  # ls
-  # logcat [-c] [-d] [-v] [-b]
-  # forward [--remove] [--list]
-  # jdwp
-  # install [-l] [-r] [-s] [-d]
-  # install-multiple [-l] [-r] [-s] [-d] [-p]
-  # uninstall [-k]
-  # backup -f [-apk] [-shared] [-nosystem] [-all]
-  # restore
-  # wait-for-device
-  # get-state (BROKEN IN THE M SDK)
-  # get-devpath
-  # remount
-  # reboot
-  # reboot-bootloader
-  # root
-  # emu
-
-  @classmethod
-  def tearDownClass(cls):
-    print
-    print
-    print 'tested %s' % adb_wrapper.AdbWrapper.GetAdbPath()
-    print '  %s' % adb_wrapper.AdbWrapper.Version()
-    print 'connected devices:'
-    try:
-      for d in adb_wrapper.AdbWrapper.Devices():
-        print '  %s' % d
-    except device_errors.AdbCommandFailedError:
-      print '  <failed to list devices>'
-      raise
-    finally:
-      print
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py b/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py
deleted file mode 100644
index d899224..0000000
--- a/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py
+++ /dev/null
@@ -1,1172 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""This module wraps Android's adb tool.
-
-This is a thin wrapper around the adb interface. Any additional complexity
-should be delegated to a higher level (ex. DeviceUtils).
-"""
-
-import collections
-# pylint: disable=import-error
-# pylint: disable=no-name-in-module
-import distutils.version as du_version
-import errno
-import logging
-import os
-import posixpath
-import re
-import subprocess
-
-import six
-
-from devil import base_error
-from devil import devil_env
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import lazy
-from devil.utils import timeout_retry
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-logger = logging.getLogger(__name__)
-
-ADB_KEYS_FILE = '/data/misc/adb/adb_keys'
-ADB_HOST_KEYS_DIR = os.path.join(os.path.expanduser('~'), '.android')
-
-DEFAULT_TIMEOUT = 30
-DEFAULT_LONG_TIMEOUT = DEFAULT_TIMEOUT * 10
-DEFAULT_SUPER_LONG_TIMEOUT = DEFAULT_LONG_TIMEOUT * 2
-DEFAULT_RETRIES = 2
-
-_ADB_VERSION_RE = re.compile(r'Android Debug Bridge version (\d+\.\d+\.\d+)')
-_EMULATOR_RE = re.compile(r'^emulator-[0-9]+$')
-_DEVICE_NOT_FOUND_RE = re.compile(r"device '(?P<serial>.+)' not found")
-_READY_STATE = 'device'
-_VERITY_DISABLE_RE = re.compile(r'(V|v)erity (is )?(already )?disabled'
-                                r'|Successfully disabled verity')
-_VERITY_ENABLE_RE = re.compile(r'(V|v)erity (is )?(already )?enabled'
-                               r'|Successfully enabled verity')
-_WAITING_FOR_DEVICE_RE = re.compile(r'- waiting for device -')
-
-
-def VerifyLocalFileExists(path):
-  """Verifies a local file exists.
-
-  Args:
-    path: Path to the local file.
-
-  Raises:
-    IOError: If the file doesn't exist.
-  """
-  if not os.path.exists(path):
-    raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path)
-
-
-def _CreateAdbEnvironment():
-  adb_env = dict(os.environ)
-  adb_env['ADB_LIBUSB'] = '0'
-  return adb_env
-
-
-def _FindAdb():
-  try:
-    return devil_env.config.LocalPath('adb')
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return os.path.join(
-        devil_env.config.LocalPath('android_sdk'), 'platform-tools', 'adb')
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return devil_env.config.FetchPath('adb')
-  except dependency_manager.NoPathFoundError:
-    raise device_errors.NoAdbError()
-
-
-def _GetVersion():
-  # pylint: disable=protected-access
-  raw_version = AdbWrapper._RunAdbCmd(['version'], timeout=2, retries=0)
-  for l in raw_version.splitlines():
-    m = _ADB_VERSION_RE.search(l)
-    if m:
-      return m.group(1)
-  return None
-
-
-def _ShouldRetryAdbCmd(exc):
-  # Errors are potentially transient and should be retried, with the exception
-  # of NoAdbError. Exceptions [e.g. generated from SIGTERM handler] should be
-  # raised.
-  return (isinstance(exc, base_error.BaseError)
-          and not isinstance(exc, device_errors.NoAdbError))
-
-
-DeviceStat = collections.namedtuple('DeviceStat',
-                                    ['st_mode', 'st_size', 'st_time'])
-
-
-def _IsExtraneousLine(line, send_cmd):
-  """Determine if a line read from stdout in persistent shell is extraneous.
-
-  The results output to stdout by the persistent shell process
-  (in PersistentShell below) often include "extraneous" lines that are
-  not part of the output of the shell command. These "extraneous" lines
-  do not always appear and are of two forms: shell prompt lines and lines
-  that just duplicate what the input command was. This function
-  detects these extraneous lines. Since all these lines have the
-  original command in them, that is what it detects ror.
-
-  Args:
-      line: Output line to check.
-      send_cmd: Command that was sent to adb persistent shell.
-  """
-  return send_cmd.rstrip() in line
-
-
-@decorators.WithExplicitTimeoutAndRetries(timeout=60, retries=3)
-def RestartServer():
-  """Restarts the adb server.
-
-  Raises:
-    CommandFailedError if we fail to kill or restart the server.
-  """
-
-  def adb_killed():
-    return not AdbWrapper.IsServerOnline()
-
-  def adb_started():
-    return AdbWrapper.IsServerOnline()
-
-  AdbWrapper.KillServer()
-  if not timeout_retry.WaitFor(adb_killed, wait_period=1, max_tries=5):
-    # TODO(crbug.com/442319): Switch this to raise an exception if we
-    # figure out why sometimes not all adb servers on bots get killed.
-    logger.warning('Failed to kill adb server')
-  AdbWrapper.StartServer()
-  if not timeout_retry.WaitFor(adb_started, wait_period=1, max_tries=5):
-    raise device_errors.CommandFailedError('Failed to start adb server')
-
-
-class AdbWrapper(object):
-  """A wrapper around a local Android Debug Bridge executable."""
-
-  _ADB_ENV = _CreateAdbEnvironment()
-
-  _adb_path = lazy.WeakConstant(_FindAdb)
-  _adb_version = lazy.WeakConstant(_GetVersion)
-
-  def __init__(self, device_serial):
-    """Initializes the AdbWrapper.
-
-    Args:
-      device_serial: The device serial number as a string.
-    """
-    if not device_serial:
-      raise ValueError('A device serial must be specified')
-    self._device_serial = str(device_serial)
-
-  class PersistentShell(object):
-    '''Class to use persistent shell for ADB.
-
-    This class allows a persistent ADB shell to be created, where multiple
-    commands can be passed into it. This avoids the overhead of starting
-    up a new ADB shell for each command.
-
-    Example of use:
-    with PersistentShell('123456789') as pshell:
-        pshell.RunCommand('which ls')
-        pshell.RunCommand('echo TEST', close=True)
-    '''
-
-    def __init__(self, serial):
-      """Initialization function:
-
-      Args:
-        serial: Serial number of device.
-      """
-      self._cmd = [AdbWrapper.GetAdbPath(), '-s', serial, 'shell']
-      self._process = None
-
-    def __enter__(self):
-      self.Start()
-      self.WaitForReady()
-      return self
-
-    def __exit__(self, exc_type, exc_value, tb):
-      self.Stop()
-
-    def Start(self):
-      """Start the shell."""
-      if self._process is not None:
-        raise RuntimeError('Persistent shell already running.')
-      # pylint: disable=protected-access
-      self._process = subprocess.Popen(
-          self._cmd,
-          stdin=subprocess.PIPE,
-          stdout=subprocess.PIPE,
-          shell=False,
-          env=AdbWrapper._ADB_ENV)
-
-    def WaitForReady(self):
-      """Wait for the shell to be ready after starting.
-
-      Sends an echo command, then waits until it gets a response.
-      """
-      self._process.stdin.write('echo\n')
-      output_line = self._process.stdout.readline()
-      while output_line.rstrip() != '':
-        output_line = self._process.stdout.readline()
-
-    def RunCommand(self, command, close=False):
-      """Runs an ADB command and returns the output.
-
-      Note that there can be approximately 40 ms of additional latency
-      between sending the command and receiving the results if close=False
-      due to the use of Nagle's algorithm in the TCP socket between the
-      adb server and client. To avoid this extra latency, set close=True.
-
-      Args:
-        command: Command to send.
-      Returns:
-        The command output, given as a list of lines, and the exit code
-      """
-
-      if close:
-
-        def run_cmd(cmd):
-          send_cmd = '( %s ); echo $?; exit;\n' % cmd.rstrip()
-          (output, _) = self._process.communicate(send_cmd)
-          self._process = None
-          for x in output.rstrip().splitlines():
-            yield x
-
-      else:
-
-        def run_cmd(cmd):
-          send_cmd = '( %s ); echo DONE:$?;\n' % cmd.rstrip()
-          self._process.stdin.write(send_cmd)
-          while True:
-            output_line = self._process.stdout.readline().rstrip()
-            if output_line[:5] == 'DONE:':
-              yield output_line[5:]
-              break
-            yield output_line
-
-      result = [
-          line for line in run_cmd(command)
-          if not _IsExtraneousLine(line, command)
-      ]
-
-      return (result[:-1], int(result[-1]))
-
-    def Stop(self):
-      """Stops the ADB process if it is still running."""
-      if self._process is not None:
-        self._process.stdin.write('exit\n')
-        self._process = None
-
-  @classmethod
-  def GetAdbPath(cls):
-    return cls._adb_path.read()
-
-  @classmethod
-  def Version(cls):
-    return cls._adb_version.read()
-
-  @classmethod
-  def _BuildAdbCmd(cls, args, device_serial, cpu_affinity=None):
-    if cpu_affinity is not None:
-      cmd = ['taskset', '-c', str(cpu_affinity)]
-    else:
-      cmd = []
-    cmd.append(cls.GetAdbPath())
-    if device_serial is not None:
-      cmd.extend(['-s', device_serial])
-    cmd.extend(args)
-    return cmd
-
-  # pylint: disable=unused-argument
-  @classmethod
-  @decorators.WithTimeoutAndConditionalRetries(_ShouldRetryAdbCmd)
-  def _RunAdbCmd(cls,
-                 args,
-                 timeout=None,
-                 retries=None,
-                 device_serial=None,
-                 check_error=True,
-                 cpu_affinity=None,
-                 additional_env=None):
-    if timeout:
-      remaining = timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime()
-      if remaining:
-        # Use a slightly smaller timeout than remaining time to ensure that we
-        # have time to collect output from the command.
-        timeout = 0.95 * remaining
-      else:
-        timeout = None
-    env = cls._ADB_ENV.copy()
-    if additional_env:
-      env.update(additional_env)
-    try:
-      adb_cmd = cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity)
-      status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(adb_cmd,
-                                                                   timeout,
-                                                                   env=env)
-    except OSError as e:
-      if e.errno in (errno.ENOENT, errno.ENOEXEC):
-        raise device_errors.NoAdbError(msg=str(e))
-      else:
-        raise
-    except cmd_helper.TimeoutError:
-      logger.error('Timeout on adb command: %r', adb_cmd)
-      raise
-
-    # Best effort to catch errors from adb; unfortunately adb is very
-    # inconsistent with error reporting so many command failures present
-    # differently.
-    if status != 0 or (check_error and output.startswith('error:')):
-      not_found_m = _DEVICE_NOT_FOUND_RE.search(output)
-      device_waiting_m = _WAITING_FOR_DEVICE_RE.match(output)
-      if (device_waiting_m is not None
-          or (not_found_m is not None
-              and not_found_m.group('serial') == device_serial)):
-        raise device_errors.DeviceUnreachableError(device_serial)
-      else:
-        raise device_errors.AdbCommandFailedError(args, output, status,
-                                                  device_serial)
-
-    return output
-
-  # pylint: enable=unused-argument
-
-  def _RunDeviceAdbCmd(self, args, timeout, retries, check_error=True):
-    """Runs an adb command on the device associated with this object.
-
-    Args:
-      args: A list of arguments to adb.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-      check_error: Check that the command doesn't return an error message. This
-        does check the error status of adb but DOES NOT check the exit status
-        of shell commands.
-
-    Returns:
-      The output of the command.
-    """
-    return self._RunAdbCmd(
-        args,
-        timeout=timeout,
-        retries=retries,
-        device_serial=self._device_serial,
-        check_error=check_error)
-
-  def _IterRunDeviceAdbCmd(self, args, iter_timeout, timeout, check_error=True):
-    """Runs an adb command and returns an iterator over its output lines.
-
-    Args:
-      args: A list of arguments to adb.
-      iter_timeout: Timeout for each iteration in seconds.
-      timeout: Timeout for the entire command in seconds.
-      check_error: Check that the command succeeded. This does check the
-        error status of the adb command but DOES NOT check the exit status
-        of shell commands.
-
-    Yields:
-      The output of the command line by line.
-    """
-    return cmd_helper.IterCmdOutputLines(
-        self._BuildAdbCmd(args, self._device_serial),
-        iter_timeout=iter_timeout,
-        timeout=timeout,
-        env=self._ADB_ENV,
-        check_status=check_error)
-
-  def __eq__(self, other):
-    """Consider instances equal if they refer to the same device.
-
-    Args:
-      other: The instance to compare equality with.
-
-    Returns:
-      True if the instances are considered equal, false otherwise.
-    """
-    return self._device_serial == str(other)
-
-  def __str__(self):
-    """The string representation of an instance.
-
-    Returns:
-      The device serial number as a string.
-    """
-    return self._device_serial
-
-  def __repr__(self):
-    return '%s(\'%s\')' % (self.__class__.__name__, self)
-
-  # pylint: disable=unused-argument
-  @classmethod
-  def IsServerOnline(cls):
-    status, output = cmd_helper.GetCmdStatusAndOutput(['pgrep', 'adb'])
-    output = [int(x) for x in output.split()]
-    logger.info('PIDs for adb found: %r', output)
-    return status == 0
-
-  # pylint: enable=unused-argument
-
-  @classmethod
-  def KillServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries)
-
-  @classmethod
-  def StartServer(cls,
-                  keys=None,
-                  timeout=DEFAULT_TIMEOUT,
-                  retries=DEFAULT_RETRIES):
-    """Starts the ADB server.
-
-    Args:
-      keys: (optional) List of local ADB keys to use to auth with devices.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    additional_env = {}
-    if keys:
-      additional_env['ADB_VENDOR_KEYS'] = ':'.join(keys)
-    # CPU affinity is used to reduce adb instability http://crbug.com/268450
-    cls._RunAdbCmd(['start-server'],
-                   timeout=timeout,
-                   retries=retries,
-                   cpu_affinity=0,
-                   additional_env=additional_env)
-
-  @classmethod
-  def GetDevices(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """DEPRECATED. Refer to Devices(...) below."""
-    # TODO(jbudorick): Remove this function once no more clients are using it.
-    return cls.Devices(timeout=timeout, retries=retries)
-
-  @classmethod
-  def Devices(cls,
-              desired_state=_READY_STATE,
-              long_list=False,
-              timeout=DEFAULT_TIMEOUT,
-              retries=DEFAULT_RETRIES):
-    """Get the list of active attached devices.
-
-    Args:
-      desired_state: If not None, limit the devices returned to only those
-        in the given state.
-      long_list: Whether to use the long listing format.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Yields:
-      AdbWrapper instances.
-    """
-    lines = cls._RawDevices(
-        long_list=long_list, timeout=timeout, retries=retries)
-    if long_list:
-      return [[AdbWrapper(line[0])] + line[1:] for line in lines if (
-          len(line) >= 2 and (not desired_state or line[1] == desired_state))]
-    else:
-      return [
-          AdbWrapper(line[0]) for line in lines
-          if (len(line) == 2 and (not desired_state or line[1] == desired_state)
-              )
-      ]
-
-  @classmethod
-  def _RawDevices(cls,
-                  long_list=False,
-                  timeout=DEFAULT_TIMEOUT,
-                  retries=DEFAULT_RETRIES):
-    cmd = ['devices']
-    if long_list:
-      cmd.append('-l')
-    output = cls._RunAdbCmd(cmd, timeout=timeout, retries=retries)
-    return [line.split() for line in output.splitlines()[1:]]
-
-  def GetDeviceSerial(self):
-    """Gets the device serial number associated with this object.
-
-    Returns:
-      Device serial number as a string.
-    """
-    return self._device_serial
-
-  def Push(self,
-           local,
-           remote,
-           sync=False,
-           timeout=DEFAULT_SUPER_LONG_TIMEOUT,
-           retries=DEFAULT_RETRIES):
-    """Pushes a file from the host to the device.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the device filesystem.
-      sync: (optional) Whether to only push files that are newer on the host.
-        Not supported when using adb prior to 1.0.39.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Raises:
-      AdbVersionError if sync=True with versions of adb prior to 1.0.39.
-    """
-    VerifyLocalFileExists(local)
-
-    if (du_version.LooseVersion(self.Version()) <
-        du_version.LooseVersion('1.0.36')):
-
-      # Different versions of adb handle pushing a directory to an existing
-      # directory differently.
-
-      # In the version packaged with the M SDK, 1.0.32, the following push:
-      #   foo/bar -> /sdcard/foo/bar
-      # where bar is an existing directory both on the host and the device
-      # results in the contents of bar/ on the host being pushed to bar/ on
-      # the device, i.e.
-      #   foo/bar/A -> /sdcard/foo/bar/A
-      #   foo/bar/B -> /sdcard/foo/bar/B
-      #   ... etc.
-
-      # In the version packaged with the N SDK, 1.0.36, the same push under
-      # the same conditions results in a second bar/ directory being created
-      # underneath the first bar/ directory on the device, i.e.
-      #   foo/bar/A -> /sdcard/foo/bar/bar/A
-      #   foo/bar/B -> /sdcard/foo/bar/bar/B
-      #   ... etc.
-
-      # In order to provide a consistent interface to clients, we check whether
-      # the target is an existing directory on the device and, if so, modifies
-      # the target passed to adb to emulate the behavior on 1.0.36 and above.
-
-      # Note that this behavior may have started before 1.0.36; that's simply
-      # the earliest version we've confirmed thus far.
-
-      try:
-        self.Shell('test -d %s' % remote, timeout=timeout, retries=retries)
-        remote = posixpath.join(remote, posixpath.basename(local))
-      except device_errors.AdbShellCommandFailedError:
-        # The target directory doesn't exist on the device, so we can use it
-        # without modification.
-        pass
-
-    push_cmd = ['push']
-
-    if sync:
-      push_cmd += ['--sync']
-      if (du_version.LooseVersion(self.Version()) <
-          du_version.LooseVersion('1.0.39')):
-        # The --sync flag for `adb push` is a relatively recent addition.
-        # We're not sure exactly which release first contained it, but it
-        # exists at least as far back as 1.0.39.
-        raise device_errors.AdbVersionError(
-            push_cmd,
-            desc='--sync not supported',
-            actual_version=self.Version(),
-            min_version='1.0.39')
-
-    push_cmd += [local, remote]
-
-    self._RunDeviceAdbCmd(push_cmd, timeout, retries)
-
-  def Pull(self,
-           remote,
-           local,
-           timeout=DEFAULT_LONG_TIMEOUT,
-           retries=DEFAULT_RETRIES):
-    """Pulls a file from the device to the host.
-
-    Args:
-      remote: Path on the device filesystem.
-      local: Path on the host filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['pull', remote, local]
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-    try:
-      VerifyLocalFileExists(local)
-    except IOError:
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'File pulled from the device did not arrive on the host: %s' % local,
-          device_serial=str(self))
-
-  def StartShell(self, cmd):
-    """Starts a subprocess on the device and returns a handle to the process.
-
-    Args:
-      args: A sequence of program arguments. The executable to run is the first
-        item in the sequence.
-
-    Returns:
-      An instance of subprocess.Popen associated with the live process.
-    """
-    return cmd_helper.StartCmd(
-        self._BuildAdbCmd(['shell'] + cmd, self._device_serial))
-
-  def Shell(self,
-            command,
-            expect_status=0,
-            timeout=DEFAULT_TIMEOUT,
-            retries=DEFAULT_RETRIES):
-    """Runs a shell command on the device.
-
-    Args:
-      command: A string with the shell command to run.
-      expect_status: (optional) Check that the command's exit status matches
-        this value. Default is 0. If set to None the test is skipped.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the shell command as a string.
-
-    Raises:
-      device_errors.AdbCommandFailedError: If the exit status doesn't match
-        |expect_status|.
-    """
-    if expect_status is None:
-      args = ['shell', command]
-    else:
-      args = ['shell', '( %s );echo %%$?' % command.rstrip()]
-    output = self._RunDeviceAdbCmd(args, timeout, retries, check_error=False)
-    if expect_status is not None:
-      output_end = output.rfind('%')
-      if output_end < 0:
-        # causes the status string to become empty and raise a ValueError
-        output_end = len(output)
-
-      try:
-        status = int(output[output_end + 1:])
-      except ValueError:
-        logger.warning('exit status of shell command %r missing.', command)
-        raise device_errors.AdbShellCommandFailedError(
-            command, output, status=None, device_serial=self._device_serial)
-      output = output[:output_end]
-      if status != expect_status:
-        raise device_errors.AdbShellCommandFailedError(
-            command, output, status=status, device_serial=self._device_serial)
-    return output
-
-  def IterShell(self, command, timeout):
-    """Runs a shell command and returns an iterator over its output lines.
-
-    Args:
-      command: A string with the shell command to run.
-      timeout: Timeout in seconds.
-
-    Yields:
-      The output of the command line by line.
-    """
-    args = ['shell', command]
-    return cmd_helper.IterCmdOutputLines(
-        self._BuildAdbCmd(args, self._device_serial),
-        timeout=timeout,
-        env=self._ADB_ENV)
-
-  def Ls(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List the contents of a directory on the device.
-
-    Args:
-      path: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of pairs (filename, stat) for each file found in the directory,
-      where the stat object has the properties: st_mode, st_size, and st_time.
-
-    Raises:
-      AdbCommandFailedError if |path| does not specify a valid and accessible
-          directory in the device, or the output of "adb ls" command is less
-          than four columns
-    """
-
-    def ParseLine(line, cmd):
-      cols = line.split(None, 3)
-      if len(cols) < 4:
-        raise device_errors.AdbCommandFailedError(
-            cmd,
-            line,
-            "the output should be 4 columns, but is only %d columns" %
-            len(cols),
-            device_serial=self._device_serial)
-      filename = cols.pop()
-      stat = DeviceStat(*[int(num, base=16) for num in cols])
-      return (filename, stat)
-
-    cmd = ['ls', path]
-    lines = self._RunDeviceAdbCmd(
-        cmd, timeout=timeout, retries=retries).splitlines()
-    if lines:
-      return [ParseLine(line, cmd) for line in lines]
-    else:
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'path does not specify an accessible directory in the device',
-          device_serial=self._device_serial)
-
-  def Logcat(self,
-             clear=False,
-             dump=False,
-             filter_specs=None,
-             logcat_format=None,
-             ring_buffer=None,
-             iter_timeout=None,
-             check_error=True,
-             timeout=None,
-             retries=DEFAULT_RETRIES):
-    """Get an iterable over the logcat output.
-
-    Args:
-      clear: If true, clear the logcat.
-      dump: If true, dump the current logcat contents.
-      filter_specs: If set, a list of specs to filter the logcat.
-      logcat_format: If set, the format in which the logcat should be output.
-        Options include "brief", "process", "tag", "thread", "raw", "time",
-        "threadtime", and "long"
-      ring_buffer: If set, a list of alternate ring buffers to request.
-        Options include "main", "system", "radio", "events", "crash" or "all".
-        The default is equivalent to ["main", "system", "crash"].
-      iter_timeout: If set and neither clear nor dump is set, the number of
-        seconds to wait between iterations. If no line is found before the
-        given number of seconds elapses, the iterable will yield None.
-      check_error: Whether to check the exit status of the logcat command.
-      timeout: (optional) If set, timeout per try in seconds. If clear or dump
-        is set, defaults to DEFAULT_TIMEOUT.
-      retries: (optional) If clear or dump is set, the number of retries to
-        attempt. Otherwise, does nothing.
-
-    Yields:
-      logcat output line by line.
-    """
-    cmd = ['logcat']
-    use_iter = True
-    if clear:
-      cmd.append('-c')
-      use_iter = False
-    if dump:
-      cmd.append('-d')
-      use_iter = False
-    if logcat_format:
-      cmd.extend(['-v', logcat_format])
-    if ring_buffer:
-      for buffer_name in ring_buffer:
-        cmd.extend(['-b', buffer_name])
-    if filter_specs:
-      cmd.extend(filter_specs)
-
-    if use_iter:
-      return self._IterRunDeviceAdbCmd(
-          cmd, iter_timeout, timeout, check_error=check_error)
-    else:
-      timeout = timeout if timeout is not None else DEFAULT_TIMEOUT
-      output = self._RunDeviceAdbCmd(
-          cmd, timeout, retries, check_error=check_error)
-      return output.splitlines()
-
-  def Forward(self,
-              local,
-              remote,
-              allow_rebind=False,
-              timeout=DEFAULT_TIMEOUT,
-              retries=DEFAULT_RETRIES):
-    """Forward socket connections from the local socket to the remote socket.
-
-    Sockets are specified by one of:
-      tcp:<port>
-      localabstract:<unix domain socket name>
-      localreserved:<unix domain socket name>
-      localfilesystem:<unix domain socket name>
-      dev:<character device name>
-      jdwp:<process pid> (remote only)
-
-    Args:
-      local: The host socket.
-      remote: The device socket.
-      allow_rebind: A boolean indicating whether adb may rebind a local socket;
-        otherwise, the default, an exception is raised if the local socket is
-        already being forwarded.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['forward']
-    if not allow_rebind:
-      cmd.append('--no-rebind')
-    cmd.extend([str(local), str(remote)])
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries).strip()
-    if output:
-      logger.warning('Unexpected output from "adb forward": %s', output)
-
-  def ForwardRemove(self,
-                    local,
-                    timeout=DEFAULT_TIMEOUT,
-                    retries=DEFAULT_RETRIES):
-    """Remove a forward socket connection.
-
-    Args:
-      local: The host socket.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    self._RunDeviceAdbCmd(['forward', '--remove', str(local)], timeout, retries)
-
-  def ForwardList(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List all currently forwarded socket connections.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    Returns:
-      The output of adb forward --list as a string.
-    """
-    if (du_version.LooseVersion(self.Version()) >=
-        du_version.LooseVersion('1.0.36')):
-      # Starting in 1.0.36, this can occasionally fail with a protocol fault.
-      # As this interrupts all connections with all devices, we instead just
-      # return an empty list. This may give clients an inaccurate result, but
-      # that's usually better than crashing the adb server.
-
-      # TODO(jbudorick): Determine an appropriate upper version bound for this
-      # once b/31811775 is fixed.
-      return ''
-
-    return self._RunDeviceAdbCmd(['forward', '--list'], timeout, retries)
-
-  def JDWP(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List of PIDs of processes hosting a JDWP transport.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of PIDs as strings.
-    """
-    return [
-        a.strip()
-        for a in self._RunDeviceAdbCmd(['jdwp'], timeout, retries).split('\n')
-    ]
-
-  def Install(self,
-              apk_path,
-              forward_lock=False,
-              allow_downgrade=False,
-              reinstall=False,
-              sd_card=False,
-              streaming=None,
-              timeout=DEFAULT_LONG_TIMEOUT,
-              retries=DEFAULT_RETRIES):
-    """Install an apk on the device.
-
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      allow_downgrade: (optional) If set, allows for downgrades.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      streaming: (optional) If not set, use default way to install.
-        If True, performs streaming install.
-        If False, app is pushed to device and be installed from there.
-        Note this option is not supported prior to adb version 1.0.40
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(apk_path)
-    cmd = ['install']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    if allow_downgrade:
-      cmd.append('-d')
-    if streaming in (True, False):
-      if (du_version.LooseVersion(self.Version()) <
-        du_version.LooseVersion('1.0.40')):
-        logging.warning(
-            'adb: streaming options not supported prior to version 1.0.40 '
-            '(current: %s)', self.Version())
-      elif streaming:
-        cmd.append('--streaming')
-      else:
-        cmd.append('--no-streaming')
-    cmd.append(apk_path)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def InstallMultiple(self,
-                      apk_paths,
-                      forward_lock=False,
-                      reinstall=False,
-                      sd_card=False,
-                      allow_downgrade=False,
-                      partial=False,
-                      streaming=None,
-                      timeout=DEFAULT_LONG_TIMEOUT,
-                      retries=DEFAULT_RETRIES):
-    """Install an apk with splits on the device.
-
-    Args:
-      apk_paths: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      allow_downgrade: (optional) Allow versionCode downgrade.
-      partial: (optional) Package ID if apk_paths doesn't include all .apks.
-      streaming: (optional) If not set, use default way to install.
-        If True, performs streaming install.
-        If False, app is pushed to device and be installed from there.
-        Note this option is not supported prior to adb version 1.0.40
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    for path in apk_paths:
-      VerifyLocalFileExists(path)
-    cmd = ['install-multiple']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    if allow_downgrade:
-      cmd.append('-d')
-    if streaming in (True, False):
-      if (du_version.LooseVersion(self.Version()) <
-        du_version.LooseVersion('1.0.40')):
-        logging.warning(
-            'adb: streaming options not supported prior to version 1.0.40 '
-            '(current: %s)', self.Version())
-      elif streaming:
-        cmd.append('--streaming')
-      else:
-        cmd.append('--no-streaming')
-    if partial:
-      cmd.extend(('-p', partial))
-    cmd.extend(apk_paths)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def Uninstall(self,
-                package,
-                keep_data=False,
-                timeout=DEFAULT_TIMEOUT,
-                retries=DEFAULT_RETRIES):
-    """Remove the app |package| from the device.
-
-    Args:
-      package: The package to uninstall.
-      keep_data: (optional) If set keep the data and cache directories.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['uninstall']
-    if keep_data:
-      cmd.append('-k')
-    cmd.append(package)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Failure' in output or 'Exception' in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def Backup(self,
-             path,
-             packages=None,
-             apk=False,
-             shared=False,
-             nosystem=True,
-             include_all=False,
-             timeout=DEFAULT_TIMEOUT,
-             retries=DEFAULT_RETRIES):
-    """Write an archive of the device's data to |path|.
-
-    Args:
-      path: Local path to store the backup file.
-      packages: List of to packages to be backed up.
-      apk: (optional) If set include the .apk files in the archive.
-      shared: (optional) If set buckup the device's SD card.
-      nosystem: (optional) If set exclude system applications.
-      include_all: (optional) If set back up all installed applications and
-        |packages| is optional.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['backup', '-f', path]
-    if apk:
-      cmd.append('-apk')
-    if shared:
-      cmd.append('-shared')
-    if nosystem:
-      cmd.append('-nosystem')
-    if include_all:
-      cmd.append('-all')
-    if packages:
-      cmd.extend(packages)
-    assert bool(packages) ^ bool(include_all), (
-        'Provide \'packages\' or set \'include_all\' but not both.')
-    ret = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    VerifyLocalFileExists(path)
-    return ret
-
-  def Restore(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Restore device contents from the backup archive.
-
-    Args:
-      path: Host path to the backup archive.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(path)
-    self._RunDeviceAdbCmd(['restore'] + [path], timeout, retries)
-
-  def WaitForDevice(self, timeout=DEFAULT_LONG_TIMEOUT,
-                    retries=DEFAULT_RETRIES):
-    """Block until the device is online.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    self._RunDeviceAdbCmd(['wait-for-device'], timeout, retries)
-
-  def GetState(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Get device state.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      One of 'offline', 'bootloader', or 'device'.
-    """
-    # TODO(jbudorick): Revert to using get-state once it doesn't cause a
-    # a protocol fault.
-    # return self._RunDeviceAdbCmd(['get-state'], timeout, retries).strip()
-
-    lines = self._RawDevices(timeout=timeout, retries=retries)
-    for line in lines:
-      if len(line) >= 2 and line[0] == self._device_serial:
-        return line[1]
-    return 'offline'
-
-  def GetDevPath(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Gets the device path.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The device path (e.g. usb:3-4)
-    """
-    return self._RunDeviceAdbCmd(['get-devpath'], timeout, retries)
-
-  def Remount(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Remounts the /system partition on the device read-write."""
-    self._RunDeviceAdbCmd(['remount'], timeout, retries)
-
-  def Reboot(self,
-             to_bootloader=False,
-             timeout=DEFAULT_LONG_TIMEOUT,
-             retries=DEFAULT_RETRIES):
-    """Reboots the device.
-
-    Args:
-      to_bootloader: (optional) If set reboots to the bootloader.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    if to_bootloader:
-      cmd = ['reboot-bootloader']
-    else:
-      cmd = ['reboot']
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-
-  def Root(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Restarts the adbd daemon with root permissions, if possible.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    try:
-      output = self._RunDeviceAdbCmd(['root'], timeout, retries)
-    except device_errors.AdbCommandFailedError as e:
-      # For some devices, root can occasionally fail with this error and kick
-      # the device into adb 'offline' mode. Assuming this is transient, try
-      # waiting for the device to come back up before re-raising the exception
-      # and proceeding with any retries.
-      if 'unable to connect for root: closed' in e.output:
-        self.WaitForDevice()
-      raise
-    if 'cannot' in output:
-      raise device_errors.AdbCommandFailedError(
-          ['root'], output, device_serial=self._device_serial)
-
-  def Emu(self, cmd, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Runs an emulator console command.
-
-    See http://developer.android.com/tools/devices/emulator.html#console
-
-    Args:
-      cmd: The command to run on the emulator console.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the emulator console command.
-    """
-    if isinstance(cmd, six.string_types):
-      cmd = [cmd]
-    return self._RunDeviceAdbCmd(['emu'] + cmd, timeout, retries)
-
-  def DisableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Disable Marshmallow's Verity security feature.
-
-    Returns:
-      The output of the disable-verity command as a string.
-    """
-    output = self._RunDeviceAdbCmd(['disable-verity'], timeout, retries)
-    if output and not _VERITY_DISABLE_RE.search(output):
-      raise device_errors.AdbCommandFailedError(
-          ['disable-verity'], output, device_serial=self._device_serial)
-    return output
-
-  def EnableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Enable Marshmallow's Verity security feature.
-
-    Returns:
-      The output of the enable-verity command as a string.
-    """
-    output = self._RunDeviceAdbCmd(['enable-verity'], timeout, retries)
-    if output and not _VERITY_ENABLE_RE.search(output):
-      raise device_errors.AdbCommandFailedError(
-          ['enable-verity'], output, device_serial=self._device_serial)
-    return output
-
-  # Deprecated use device_utils#is_emulator instead.
-  @property
-  def is_emulator(self):
-    return _EMULATOR_RE.match(self._device_serial)
-
-  @property
-  def is_ready(self):
-    try:
-      return self.GetState() == _READY_STATE
-    except device_errors.CommandFailedError:
-      return False
diff --git a/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py b/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
deleted file mode 100755
index f8b010b..0000000
--- a/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Tests for the AdbWrapper class."""
-
-import os
-import tempfile
-import time
-import unittest
-
-from devil.android import device_test_case
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-
-
-class TestAdbWrapper(device_test_case.DeviceTestCase):
-  def setUp(self):
-    super(TestAdbWrapper, self).setUp()
-    self._adb = adb_wrapper.AdbWrapper(self.serial)
-    self._adb.WaitForDevice()
-
-  @staticmethod
-  def _MakeTempFile(contents):
-    """Make a temporary file with the given contents.
-
-    Args:
-      contents: string to write to the temporary file.
-
-    Returns:
-      The absolute path to the file.
-    """
-    fi, path = tempfile.mkstemp()
-    with os.fdopen(fi, 'wb') as f:
-      f.write(contents)
-    return path
-
-  def testDeviceUnreachable(self):
-    with self.assertRaises(device_errors.DeviceUnreachableError):
-      bad_adb = adb_wrapper.AdbWrapper('device_gone')
-      bad_adb.Shell('echo test')
-
-  def testShell(self):
-    output = self._adb.Shell('echo test', expect_status=0)
-    self.assertEqual(output.strip(), 'test')
-    output = self._adb.Shell('echo test')
-    self.assertEqual(output.strip(), 'test')
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Shell('echo test', expect_status=1)
-
-  def testPersistentShell(self):
-    # We need to access the device serial number here in order
-    # to create the persistent shell.
-    serial = self._adb.GetDeviceSerial()  # pylint: disable=protected-access
-    with self._adb.PersistentShell(serial) as pshell:
-      (res1, code1) = pshell.RunCommand('echo TEST')
-      (res2, code2) = pshell.RunCommand('echo TEST2')
-      self.assertEqual(len(res1), 1)
-      self.assertEqual(res1[0], 'TEST')
-      self.assertEqual(res2[-1], 'TEST2')
-      self.assertEqual(code1, 0)
-      self.assertEqual(code2, 0)
-
-  def testPushLsPull(self):
-    path = self._MakeTempFile('foo')
-    device_path = '/data/local/tmp/testfile.txt'
-    local_tmpdir = os.path.dirname(path)
-    self._adb.Push(path, device_path)
-    files = dict(self._adb.Ls('/data/local/tmp'))
-    self.assertTrue('testfile.txt' in files)
-    self.assertEquals(3, files['testfile.txt'].st_size)
-    self.assertEqual(self._adb.Shell('cat %s' % device_path), 'foo')
-    self._adb.Pull(device_path, local_tmpdir)
-    with open(os.path.join(local_tmpdir, 'testfile.txt'), 'r') as f:
-      self.assertEqual(f.read(), 'foo')
-
-  def testInstall(self):
-    path = self._MakeTempFile('foo')
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Install(path)
-
-  def testForward(self):
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Forward(0, 0)
-
-  def testUninstall(self):
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Uninstall('some.nonexistant.package')
-
-  def testRebootWaitForDevice(self):
-    self._adb.Reboot()
-    print 'waiting for device to reboot...'
-    while self._adb.GetState() == 'device':
-      time.sleep(1)
-    self._adb.WaitForDevice()
-    self.assertEqual(self._adb.GetState(), 'device')
-    print 'waiting for package manager...'
-    while True:
-      try:
-        android_path = self._adb.Shell('pm path android')
-      except device_errors.AdbShellCommandFailedError:
-        android_path = None
-      if android_path and 'package:' in android_path:
-        break
-      time.sleep(1)
-
-  def testRootRemount(self):
-    self._adb.Root()
-    while True:
-      try:
-        self._adb.Shell('start')
-        break
-      except device_errors.DeviceUnreachableError:
-        time.sleep(1)
-    self._adb.Remount()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py b/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py
deleted file mode 100755
index 1b3d584..0000000
--- a/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for some APIs with conditional logic in adb_wrapper.py
-"""
-
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class AdbWrapperTest(unittest.TestCase):
-  def setUp(self):
-    self.device_serial = 'ABC12345678'
-    self.adb = adb_wrapper.AdbWrapper(self.device_serial)
-
-  def _MockRunDeviceAdbCmd(self, return_value):
-    return mock.patch.object(
-        self.adb, '_RunDeviceAdbCmd',
-        mock.Mock(side_effect=None, return_value=return_value))
-
-  def testDisableVerityWhenDisabled(self):
-    with self._MockRunDeviceAdbCmd('Verity already disabled on /system'):
-      self.adb.DisableVerity()
-
-  def testDisableVerityWhenEnabled(self):
-    with self._MockRunDeviceAdbCmd(
-        'Verity disabled on /system\nNow reboot your device for settings to '
-        'take effect'):
-      self.adb.DisableVerity()
-
-  def testEnableVerityWhenEnabled(self):
-    with self._MockRunDeviceAdbCmd('Verity already enabled on /system'):
-      self.adb.EnableVerity()
-
-  def testEnableVerityWhenDisabled(self):
-    with self._MockRunDeviceAdbCmd(
-        'Verity enabled on /system\nNow reboot your device for settings to '
-        'take effect'):
-      self.adb.EnableVerity()
-
-  def testFailEnableVerity(self):
-    with self._MockRunDeviceAdbCmd('error: closed'):
-      self.assertRaises(device_errors.AdbCommandFailedError,
-                        self.adb.EnableVerity)
-
-  def testFailDisableVerity(self):
-    with self._MockRunDeviceAdbCmd('error: closed'):
-      self.assertRaises(device_errors.AdbCommandFailedError,
-                        self.adb.DisableVerity)
-
-  @mock.patch('devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout')
-  def testDeviceUnreachable(self, get_cmd_mock):
-    get_cmd_mock.return_value = (
-        1, "error: device '%s' not found" % self.device_serial)
-    self.assertRaises(device_errors.DeviceUnreachableError, self.adb.Shell,
-                      '/bin/true')
-
-  @mock.patch('devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout')
-  def testWaitingForDevice(self, get_cmd_mock):
-    get_cmd_mock.return_value = (1, '- waiting for device - ')
-    self.assertRaises(device_errors.DeviceUnreachableError, self.adb.Shell,
-                      '/bin/true')
-
-  @mock.patch('devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout')
-  def testRootConnectionClosedFailure(self, get_cmd_mock):
-    get_cmd_mock.side_effect = [
-        (1, 'unable to connect for root: closed'),
-        (0, ''),
-    ]
-    self.assertRaises(device_errors.AdbCommandFailedError, self.adb.Root,
-                      retries=0)
diff --git a/systrace/catapult/devil/devil/android/sdk/build_tools.py b/systrace/catapult/devil/devil/android/sdk/build_tools.py
deleted file mode 100644
index 64cc96d..0000000
--- a/systrace/catapult/devil/devil/android/sdk/build_tools.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-from devil import devil_env
-from devil.utils import lazy
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-
-def GetPath(build_tool):
-  try:
-    return devil_env.config.LocalPath(build_tool)
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return _PathInLocalSdk(build_tool)
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  return devil_env.config.FetchPath(build_tool)
-
-
-def _PathInLocalSdk(build_tool):
-  build_tools_path = _build_tools_path.read()
-  if not build_tools_path:
-    raise dependency_manager.NoPathFoundError(build_tool,
-                                              devil_env.GetPlatform())
-
-  candidate_path = os.path.join(build_tools_path, build_tool)
-  if not os.path.exists(candidate_path):
-    raise dependency_manager.NoPathFoundError(build_tool,
-                                              devil_env.GetPlatform())
-
-  return candidate_path
-
-
-def _FindBuildTools():
-  android_sdk_path = devil_env.config.LocalPath('android_sdk')
-  if not android_sdk_path:
-    return None
-
-  build_tools_contents = os.listdir(
-      os.path.join(android_sdk_path, 'build-tools'))
-
-  if not build_tools_contents:
-    return None
-  else:
-    if len(build_tools_contents) > 1:
-      build_tools_contents.sort()
-    return os.path.join(android_sdk_path, 'build-tools',
-                        build_tools_contents[-1])
-
-
-_build_tools_path = lazy.WeakConstant(_FindBuildTools)
diff --git a/systrace/catapult/devil/devil/android/sdk/bundletool.py b/systrace/catapult/devil/devil/android/sdk/bundletool.py
deleted file mode 100644
index f210db1..0000000
--- a/systrace/catapult/devil/devil/android/sdk/bundletool.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""This module wraps bundletool."""
-
-import json
-
-from devil import base_error
-from devil import devil_env
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-with devil_env.SysPath(devil_env.PY_UTILS_PATH):
-  from py_utils import tempfile_ext
-
-_bundletool_path = lazy.WeakConstant(lambda: devil_env.config.FetchPath(
-    'bundletool'))
-
-
-def ExtractApks(output_dir,
-                apks_path,
-                abis,
-                locales,
-                features,
-                pixel_density,
-                sdk_version,
-                modules=None):
-  """Extracts splits from APKS archive.
-
-  Args:
-    output_dir: Directory to extract splits into.
-    apks_path: Path to APKS archive.
-    abis: ABIs to support.
-    locales: Locales to support.
-    features: Device features to support.
-    pixel_density: Pixel density to support.
-    sdk_version: Target SDK version.
-    modules: Extra modules to install.
-  """
-  device_spec = {
-      'supportedAbis': abis,
-      'supportedLocales': ['%s-%s' % l for l in locales],
-      'deviceFeatures': features,
-      'screenDensity': pixel_density,
-      'sdkVersion': sdk_version,
-  }
-  with tempfile_ext.TemporaryFileName(suffix='.json') as device_spec_path:
-    with open(device_spec_path, 'w') as f:
-      json.dump(device_spec, f)
-    cmd = [
-        'java',
-        '-jar',
-        _bundletool_path.read(),
-        'extract-apks',
-        '--apks=%s' % apks_path,
-        '--device-spec=%s' % device_spec_path,
-        '--output-dir=%s' % output_dir,
-    ]
-    if modules:
-      cmd += ['--modules=%s' % ','.join(modules)]
-    status, stdout, stderr = cmd_helper.GetCmdStatusOutputAndError(cmd)
-    if status != 0:
-      raise base_error.BaseError('Failed running {} with output\n{}\n{}'.format(
-          ' '.join(cmd), stdout, stderr))
diff --git a/systrace/catapult/devil/devil/android/sdk/dexdump.py b/systrace/catapult/devil/devil/android/sdk/dexdump.py
deleted file mode 100644
index c71442c..0000000
--- a/systrace/catapult/devil/devil/android/sdk/dexdump.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import six
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-_dexdump_path = lazy.WeakConstant(lambda: build_tools.GetPath('dexdump'))
-
-
-def DexDump(dexfiles, file_summary=False):
-  """A wrapper around the Android SDK's dexdump tool.
-
-  Args:
-    dexfiles: The dexfile or list of dex files to dump.
-    file_summary: Display summary information from the file header. (-f)
-
-  Returns:
-    An iterable over the output lines.
-  """
-  # TODO(jbudorick): Add support for more options as necessary.
-  if isinstance(dexfiles, six.string_types):
-    dexfiles = [dexfiles]
-  args = [_dexdump_path.read()] + dexfiles
-  if file_summary:
-    args.append('-f')
-
-  return cmd_helper.IterCmdOutputLines(args)
diff --git a/systrace/catapult/devil/devil/android/sdk/fastboot.py b/systrace/catapult/devil/devil/android/sdk/fastboot.py
deleted file mode 100644
index d0f8566..0000000
--- a/systrace/catapult/devil/devil/android/sdk/fastboot.py
+++ /dev/null
@@ -1,136 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""This module wraps Android's fastboot tool.
-
-This is a thin wrapper around the fastboot interface. Any additional complexity
-should be delegated to a higher level (ex. FastbootUtils).
-"""
-# pylint: disable=unused-argument
-
-from devil import devil_env
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-_FLASH_TIMEOUT = _DEFAULT_TIMEOUT * 10
-
-
-class Fastboot(object):
-
-  _fastboot_path = lazy.WeakConstant(lambda: devil_env.config.FetchPath(
-      'fastboot'))
-
-  def __init__(self,
-               device_serial,
-               default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """Initializes the FastbootWrapper.
-
-    Args:
-      device_serial: The device serial number as a string.
-    """
-    if not device_serial:
-      raise ValueError('A device serial must be specified')
-    self._device_serial = str(device_serial)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-  def __str__(self):
-    return self._device_serial
-
-  @classmethod
-  def _RunFastbootCommand(cls, cmd):
-    """Run a generic fastboot command.
-
-    Args:
-      cmd: Command to run. Must be list of args, the first one being the command
-
-    Returns:
-      output of command.
-
-    Raises:
-      TypeError: If cmd is not of type list.
-    """
-    if isinstance(cmd, list):
-      cmd = [cls._fastboot_path.read()] + cmd
-    else:
-      raise TypeError('Command for _RunDeviceFastbootCommand must be a list.')
-    # fastboot can't be trusted to keep non-error output out of stderr, so
-    # capture stderr as part of stdout.
-    status, output = cmd_helper.GetCmdStatusAndOutput(cmd, merge_stderr=True)
-    if int(status) != 0:
-      raise device_errors.FastbootCommandFailedError(cmd, output, status)
-    return output
-
-  def _RunDeviceFastbootCommand(self, cmd):
-    """Run a fastboot command on the device associated with this object.
-
-    Args:
-      cmd: Command to run. Must be list of args, the first one being the command
-
-    Returns:
-      output of command.
-
-    Raises:
-      TypeError: If cmd is not of type list.
-    """
-    if isinstance(cmd, list):
-      cmd = ['-s', self._device_serial] + cmd
-    return self._RunFastbootCommand(cmd)
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-  def GetVar(self, variable, timeout=None, retries=None):
-    args = ['getvar', variable]
-    output = self._RunDeviceFastbootCommand(args)
-    # getvar returns timing information on the last line of output, so only
-    # parse the first line.
-    output = output.splitlines()[0]
-    # And the first line should match the format '$(var): $(value)'.
-    if variable + ': ' not in output:
-      raise device_errors.FastbootCommandFailedError(
-          args, output, message="Unknown 'getvar' output format.")
-    return output.split('%s: ' % variable)[1].strip()
-
-  @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
-  def Flash(self, partition, image, timeout=None, retries=None):
-    """Flash partition with img.
-
-    Args:
-      partition: Partition to be flashed.
-      image: location of image to flash with.
-    """
-    self._RunDeviceFastbootCommand(['flash', partition, image])
-
-  @classmethod
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-  def Devices(cls, timeout=None, retries=None):
-    """Outputs list of devices in fastboot mode.
-
-    Returns:
-      List of Fastboot objects, one for each device in fastboot.
-    """
-    output = cls._RunFastbootCommand(['devices'])
-    return [Fastboot(line.split()[0]) for line in output.splitlines()]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RebootBootloader(self, timeout=None, retries=None):
-    """Reboot from fastboot, into fastboot."""
-    self._RunDeviceFastbootCommand(['reboot-bootloader'])
-
-  @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
-  def Reboot(self, timeout=None, retries=None):
-    """Reboot from fastboot to normal usage"""
-    self._RunDeviceFastbootCommand(['reboot'])
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetOemOffModeCharge(self, value, timeout=None, retries=None):
-    """Sets off mode charging
-
-    Args:
-      value: boolean value to set off-mode-charging on or off.
-    """
-    self._RunDeviceFastbootCommand(['oem', 'off-mode-charge', str(int(value))])
diff --git a/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py b/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
deleted file mode 100644
index c606197..0000000
--- a/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provides a work around for various adb commands on android gce instances.
-
-Some adb commands don't work well when the device is a cloud vm, namely
-'push' and 'pull'. With gce instances, moving files through adb can be
-painfully slow and hit timeouts, so the methods here just use scp instead.
-"""
-# pylint: disable=unused-argument
-
-import logging
-import os
-import subprocess
-
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-
-class GceAdbWrapper(adb_wrapper.AdbWrapper):
-  def __init__(self, device_serial):
-    super(GceAdbWrapper, self).__init__(device_serial)
-    self._Connect()
-    self.Root()
-    self._instance_ip = self.Shell('getprop net.gce.ip').strip()
-
-  def _Connect(self,
-               timeout=adb_wrapper.DEFAULT_TIMEOUT,
-               retries=adb_wrapper.DEFAULT_RETRIES):
-    """Connects ADB to the android gce instance."""
-    cmd = ['connect', self._device_serial]
-    output = self._RunAdbCmd(cmd, timeout=timeout, retries=retries)
-    if 'unable to connect' in output:
-      raise device_errors.AdbCommandFailedError(cmd, output)
-    self.WaitForDevice()
-
-  # override
-  def Root(self, **kwargs):
-    super(GceAdbWrapper, self).Root()
-    self._Connect()
-
-  # override
-  def Push(self, local, remote, **kwargs):
-    """Pushes an object from the host to the gce instance.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the instance filesystem.
-    """
-    adb_wrapper.VerifyLocalFileExists(local)
-    if os.path.isdir(local):
-      self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(remote))
-
-      # When the object to be pushed is a directory, adb merges the source dir
-      # with the destination dir. So if local is a dir, just scp its contents.
-      for f in os.listdir(local):
-        self._PushObject(os.path.join(local, f), os.path.join(remote, f))
-        self.Shell(
-            'chmod 777 %s' % cmd_helper.SingleQuote(os.path.join(remote, f)))
-    else:
-      parent_dir = remote[0:remote.rfind('/')]
-      if parent_dir:
-        self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(parent_dir))
-      self._PushObject(local, remote)
-      self.Shell('chmod 777 %s' % cmd_helper.SingleQuote(remote))
-
-  def _PushObject(self, local, remote):
-    """Copies an object from the host to the gce instance using scp.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the instance filesystem.
-    """
-    cmd = [
-        'scp', '-r', '-o', 'UserKnownHostsFile=/dev/null', '-o',
-        'StrictHostKeyChecking=no', local,
-        'root@%s:%s' % (self._instance_ip, remote)
-    ]
-    status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if status:
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-  # override
-  def Pull(self, remote, local, **kwargs):
-    """Pulls a file from the gce instance to the host.
-
-    Args:
-      remote: Path on the instance filesystem.
-      local: Path on the host filesystem.
-    """
-    cmd = [
-        'scp',
-        '-p',
-        '-r',
-        '-o',
-        'UserKnownHostsFile=/dev/null',
-        '-o',
-        'StrictHostKeyChecking=no',
-        'root@%s:%s' % (self._instance_ip, remote),
-        local,
-    ]
-    status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if status:
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-    try:
-      adb_wrapper.VerifyLocalFileExists(local)
-    except (subprocess.CalledProcessError, IOError):
-      logger.exception('Error when pulling files from android instance.')
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-  # override
-  def Install(self,
-              apk_path,
-              forward_lock=False,
-              reinstall=False,
-              sd_card=False,
-              **kwargs):
-    """Installs an apk on the gce instance
-
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-    """
-    adb_wrapper.VerifyLocalFileExists(apk_path)
-    cmd = ['install']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    self.Push(apk_path, '/data/local/tmp/tmp.apk')
-    cmd = ['pm'] + cmd
-    cmd.append('/data/local/tmp/tmp.apk')
-    output = self.Shell(' '.join(cmd))
-    self.Shell('rm /data/local/tmp/tmp.apk')
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  # override
-  @property
-  def is_emulator(self):
-    return True
diff --git a/systrace/catapult/devil/devil/android/sdk/intent.py b/systrace/catapult/devil/devil/android/sdk/intent.py
deleted file mode 100644
index 2ea38c3..0000000
--- a/systrace/catapult/devil/devil/android/sdk/intent.py
+++ /dev/null
@@ -1,133 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Manages intents and associated information.
-
-This is generally intended to be used with functions that calls Android's
-Am command.
-"""
-
-# Some common flag constants that can be used to construct intents.
-# Full list: http://developer.android.com/reference/android/content/Intent.html
-FLAG_ACTIVITY_CLEAR_TASK = 0x00008000
-FLAG_ACTIVITY_CLEAR_TOP = 0x04000000
-FLAG_ACTIVITY_NEW_TASK = 0x10000000
-FLAG_ACTIVITY_REORDER_TO_FRONT = 0x00020000
-FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000
-
-
-def _bitwise_or(flags):
-  result = 0
-  for flag in flags:
-    result |= flag
-  return result
-
-
-class Intent(object):
-  def __init__(self,
-               action='android.intent.action.VIEW',
-               activity=None,
-               category=None,
-               component=None,
-               data=None,
-               extras=None,
-               flags=None,
-               package=None):
-    """Creates an Intent.
-
-    Args:
-      action: A string containing the action.
-      activity: A string that, with |package|, can be used to specify the
-                component.
-      category: A string or list containing any categories.
-      component: A string that specifies the component to send the intent to.
-      data: A string containing a data URI.
-      extras: A dict containing extra parameters to be passed along with the
-              intent.
-      flags: A sequence of flag constants to be passed with the intent.
-      package: A string that, with activity, can be used to specify the
-               component.
-    """
-    self._action = action
-    self._activity = activity
-    if isinstance(category, list) or category is None:
-      self._category = category
-    else:
-      self._category = [category]
-    self._component = component
-    self._data = data
-    self._extras = extras
-    self._flags = '0x%0.8x' % _bitwise_or(flags) if flags else None
-    self._package = package
-
-    if self._component and '/' in component:
-      self._package, self._activity = component.split('/', 1)
-    elif self._package and self._activity:
-      self._component = '%s/%s' % (package, activity)
-
-  @property
-  def action(self):
-    return self._action
-
-  @property
-  def activity(self):
-    return self._activity
-
-  @property
-  def category(self):
-    return self._category
-
-  @property
-  def component(self):
-    return self._component
-
-  @property
-  def data(self):
-    return self._data
-
-  @property
-  def extras(self):
-    return self._extras
-
-  @property
-  def flags(self):
-    return self._flags
-
-  @property
-  def package(self):
-    return self._package
-
-  @property
-  def am_args(self):
-    """Returns the intent as a list of arguments for the activity manager.
-
-    For details refer to the specification at:
-    - http://developer.android.com/tools/help/adb.html#IntentSpec
-    """
-    args = []
-    if self.action:
-      args.extend(['-a', self.action])
-    if self.data:
-      args.extend(['-d', self.data])
-    if self.category:
-      args.extend(arg for cat in self.category for arg in ('-c', cat))
-    if self.component:
-      args.extend(['-n', self.component])
-    if self.flags:
-      args.extend(['-f', self.flags])
-    if self.extras:
-      for key, value in self.extras.items():
-        if value is None:
-          args.extend(['--esn', key])
-        elif isinstance(value, str):
-          args.extend(['--es', key, value])
-        elif isinstance(value, bool):
-          args.extend(['--ez', key, str(value)])
-        elif isinstance(value, int):
-          args.extend(['--ei', key, str(value)])
-        elif isinstance(value, float):
-          args.extend(['--ef', key, str(value)])
-        else:
-          raise NotImplementedError(
-              'Intent does not know how to pass %s extras' % type(value))
-    return args
diff --git a/systrace/catapult/devil/devil/android/sdk/keyevent.py b/systrace/catapult/devil/devil/android/sdk/keyevent.py
deleted file mode 100644
index 61d61c8..0000000
--- a/systrace/catapult/devil/devil/android/sdk/keyevent.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Android KeyEvent constants.
-
-http://developer.android.com/reference/android/view/KeyEvent.html
-"""
-
-KEYCODE_BACK = 4
-
-KEYCODE_0 = 7
-KEYCODE_1 = 8
-KEYCODE_2 = 9
-KEYCODE_3 = 10
-KEYCODE_4 = 11
-KEYCODE_5 = 12
-KEYCODE_6 = 13
-KEYCODE_7 = 14
-KEYCODE_8 = 15
-KEYCODE_9 = 16
-
-KEYCODE_DPAD_RIGHT = 22
-
-KEYCODE_POWER = 26
-
-KEYCODE_A = 29
-KEYCODE_B = 30
-KEYCODE_C = 31
-KEYCODE_D = 32
-KEYCODE_E = 33
-KEYCODE_F = 34
-KEYCODE_G = 35
-KEYCODE_H = 36
-KEYCODE_I = 37
-KEYCODE_J = 38
-KEYCODE_K = 39
-KEYCODE_L = 40
-KEYCODE_M = 41
-KEYCODE_N = 42
-KEYCODE_O = 43
-KEYCODE_P = 44
-KEYCODE_Q = 45
-KEYCODE_R = 46
-KEYCODE_S = 47
-KEYCODE_T = 48
-KEYCODE_U = 49
-KEYCODE_V = 50
-KEYCODE_W = 51
-KEYCODE_X = 52
-KEYCODE_Y = 53
-KEYCODE_Z = 54
-
-KEYCODE_PERIOD = 56
-
-KEYCODE_SPACE = 62
-
-KEYCODE_ENTER = 66
-KEYCODE_DEL = 67
-
-KEYCODE_MENU = 82
-
-KEYCODE_APP_SWITCH = 187
diff --git a/systrace/catapult/devil/devil/android/sdk/shared_prefs.py b/systrace/catapult/devil/devil/android/sdk/shared_prefs.py
deleted file mode 100644
index 32b5bc4..0000000
--- a/systrace/catapult/devil/devil/android/sdk/shared_prefs.py
+++ /dev/null
@@ -1,452 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Helper object to read and modify Shared Preferences from Android apps.
-
-See e.g.:
-  http://developer.android.com/reference/android/content/SharedPreferences.html
-"""
-
-import logging
-import posixpath
-from xml.etree import ElementTree
-
-import six
-
-from devil.android import device_errors
-from devil.android.sdk import version_codes
-
-logger = logging.getLogger(__name__)
-
-_XML_DECLARATION = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-
-
-class BasePref(object):
-  """Base class for getting/setting the value of a specific preference type.
-
-  Should not be instantiated directly. The SharedPrefs collection will
-  instantiate the appropriate subclasses, which directly manipulate the
-  underlying xml document, to parse and serialize values according to their
-  type.
-
-  Args:
-    elem: An xml ElementTree object holding the preference data.
-
-  Properties:
-    tag_name: A string with the tag that must be used for this preference type.
-  """
-  tag_name = None
-
-  def __init__(self, elem):
-    if elem.tag != type(self).tag_name:
-      raise TypeError('Property %r has type %r, but trying to access as %r' %
-                      (elem.get('name'), elem.tag, type(self).tag_name))
-    self._elem = elem
-
-  def __str__(self):
-    """Get the underlying xml element as a string."""
-    if six.PY2:
-      return ElementTree.tostring(self._elem)
-    else:
-      return ElementTree.tostring(self._elem, encoding="unicode")
-
-  def get(self):
-    """Get the value of this preference."""
-    return self._elem.get('value')
-
-  def set(self, value):
-    """Set from a value casted as a string."""
-    self._elem.set('value', str(value))
-
-  @property
-  def has_value(self):
-    """Check whether the element has a value."""
-    return self._elem.get('value') is not None
-
-
-class BooleanPref(BasePref):
-  """Class for getting/setting a preference with a boolean value.
-
-  The underlying xml element has the form, e.g.:
-      <boolean name="featureEnabled" value="false" />
-  """
-  tag_name = 'boolean'
-  VALUES = {'true': True, 'false': False}
-
-  def get(self):
-    """Get the value as a Python bool."""
-    return type(self).VALUES[super(BooleanPref, self).get()]
-
-  def set(self, value):
-    """Set from a value casted as a bool."""
-    super(BooleanPref, self).set('true' if value else 'false')
-
-
-class FloatPref(BasePref):
-  """Class for getting/setting a preference with a float value.
-
-  The underlying xml element has the form, e.g.:
-      <float name="someMetric" value="4.7" />
-  """
-  tag_name = 'float'
-
-  def get(self):
-    """Get the value as a Python float."""
-    return float(super(FloatPref, self).get())
-
-
-class IntPref(BasePref):
-  """Class for getting/setting a preference with an int value.
-
-  The underlying xml element has the form, e.g.:
-      <int name="aCounter" value="1234" />
-  """
-  tag_name = 'int'
-
-  def get(self):
-    """Get the value as a Python int."""
-    return int(super(IntPref, self).get())
-
-
-class LongPref(IntPref):
-  """Class for getting/setting a preference with a long value.
-
-  The underlying xml element has the form, e.g.:
-      <long name="aLongCounter" value="1234" />
-
-  We use the same implementation from IntPref.
-  """
-  tag_name = 'long'
-
-
-class StringPref(BasePref):
-  """Class for getting/setting a preference with a string value.
-
-  The underlying xml element has the form, e.g.:
-      <string name="someHashValue">249b3e5af13d4db2</string>
-  """
-  tag_name = 'string'
-
-  def get(self):
-    """Get the value as a Python string."""
-    return self._elem.text
-
-  def set(self, value):
-    """Set from a value casted as a string."""
-    self._elem.text = str(value)
-
-
-class StringSetPref(StringPref):
-  """Class for getting/setting a preference with a set of string values.
-
-  The underlying xml element has the form, e.g.:
-      <set name="managed_apps">
-          <string>com.mine.app1</string>
-          <string>com.mine.app2</string>
-          <string>com.mine.app3</string>
-      </set>
-  """
-  tag_name = 'set'
-
-  def get(self):
-    """Get a list with the string values contained."""
-    value = []
-    for child in self._elem:
-      assert child.tag == 'string'
-      value.append(child.text)
-    return value
-
-  def set(self, value):
-    """Set from a sequence of values, each casted as a string."""
-    for child in list(self._elem):
-      self._elem.remove(child)
-    for item in value:
-      ElementTree.SubElement(self._elem, 'string').text = str(item)
-
-
-_PREF_TYPES = {
-    c.tag_name: c
-    for c in
-    [BooleanPref, FloatPref, IntPref, LongPref, StringPref, StringSetPref]
-}
-
-
-class SharedPrefs(object):
-  def __init__(self, device, package, filename, use_encrypted_path=False):
-    """Helper object to read and update "Shared Prefs" of Android apps.
-
-    Such files typically look like, e.g.:
-
-        <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
-        <map>
-          <int name="databaseVersion" value="107" />
-          <boolean name="featureEnabled" value="false" />
-          <string name="someHashValue">249b3e5af13d4db2</string>
-        </map>
-
-    Example usage:
-
-        prefs = shared_prefs.SharedPrefs(device, 'com.my.app', 'my_prefs.xml')
-        prefs.Load()
-        prefs.GetString('someHashValue') # => '249b3e5af13d4db2'
-        prefs.SetInt('databaseVersion', 42)
-        prefs.Remove('featureEnabled')
-        prefs.Commit()
-
-    The object may also be used as a context manager to automatically load and
-    commit, respectively, upon entering and leaving the context.
-
-    Args:
-      device: A DeviceUtils object.
-      package: A string with the package name of the app that owns the shared
-        preferences file.
-      filename: A string with the name of the preferences file to read/write.
-      use_encrypted_path: Whether to read and write to the shared prefs location
-        in the device-encrypted path (/data/user_de) instead of the older,
-        unencrypted path (/data/data). Only supported on N+, but falls back to
-        the unencrypted path if the encrypted path is not supported on the given
-        device.
-    """
-    self._device = device
-    self._xml = None
-    self._package = package
-    self._filename = filename
-    self._unencrypted_path = '/data/data/%s/shared_prefs/%s' % (package,
-                                                                filename)
-    self._encrypted_path = '/data/user_de/0/%s/shared_prefs/%s' % (package,
-                                                                   filename)
-    self._path = self._unencrypted_path
-    self._encrypted = use_encrypted_path
-    if use_encrypted_path:
-      if self._device.build_version_sdk < version_codes.NOUGAT:
-        logging.info('SharedPrefs set to use encrypted path, but given device '
-                     'is not running N+. Falling back to unencrypted path')
-        self._encrypted = False
-      else:
-        self._path = self._encrypted_path
-    self._changed = False
-
-  def __repr__(self):
-    """Get a useful printable representation of the object."""
-    return '<{cls} file {filename} for {package} on {device}>'.format(
-        cls=type(self).__name__,
-        filename=self.filename,
-        package=self.package,
-        device=str(self._device))
-
-  def __str__(self):
-    """Get the underlying xml document as a string."""
-    if six.PY2:
-      return _XML_DECLARATION + ElementTree.tostring(self.xml)
-    else:
-      return _XML_DECLARATION + \
-          ElementTree.tostring(self.xml, encoding="unicode")
-
-  @property
-  def package(self):
-    """Get the package name of the app that owns the shared preferences."""
-    return self._package
-
-  @property
-  def filename(self):
-    """Get the filename of the shared preferences file."""
-    return self._filename
-
-  @property
-  def path(self):
-    """Get the full path to the shared preferences file on the device."""
-    return self._path
-
-  @property
-  def changed(self):
-    """True if properties have changed and a commit would be needed."""
-    return self._changed
-
-  @property
-  def xml(self):
-    """Get the underlying xml document as an ElementTree object."""
-    if self._xml is None:
-      self._xml = ElementTree.Element('map')
-    return self._xml
-
-  def Load(self):
-    """Load the shared preferences file from the device.
-
-    A empty xml document, which may be modified and saved on |commit|, is
-    created if the file does not already exist.
-    """
-    if self._device.FileExists(self.path):
-      self._xml = ElementTree.fromstring(
-          self._device.ReadFile(self.path, as_root=True))
-      assert self._xml.tag == 'map'
-    else:
-      self._xml = None
-    self._changed = False
-
-  def Clear(self):
-    """Clear all of the preferences contained in this object."""
-    if self._xml is not None and len(self):  # only clear if not already empty
-      self._xml = None
-      self._changed = True
-
-  def Commit(self, force_commit=False):
-    """Save the current set of preferences to the device.
-
-    Only actually saves if some preferences have been modified or force_commit
-    is set to True.
-
-    Args:
-      force_commit: Commit even if no changes have been made to the SharedPrefs
-        instance.
-    """
-    if not (self.changed or force_commit):
-      return
-    self._device.RunShellCommand(
-        ['mkdir', '-p', posixpath.dirname(self.path)],
-        as_root=True,
-        check_return=True)
-    self._device.WriteFile(self.path, str(self), as_root=True)
-    # Creating the directory/file can cause issues with SELinux if they did
-    # not already exist. As a workaround, apply the package's security context
-    # to the shared_prefs directory, which mimics the behavior of a file
-    # created by the app itself
-    if self._device.build_version_sdk >= version_codes.MARSHMALLOW:
-      security_context = self._device.GetSecurityContextForPackage(
-          self.package, encrypted=self._encrypted)
-      if security_context is None:
-        raise device_errors.CommandFailedError(
-            'Failed to get security context for %s' % self.package)
-      paths = [posixpath.dirname(self.path), self.path]
-      self._device.ChangeSecurityContext(security_context, paths)
-
-    # Ensure that there isn't both an encrypted and unencrypted version of the
-    # file on the device at the same time.
-    if self._device.build_version_sdk >= version_codes.NOUGAT:
-      remove_path = (self._unencrypted_path
-                     if self._encrypted else self._encrypted_path)
-      if self._device.PathExists(remove_path, as_root=True):
-        logging.warning('Found an equivalent shared prefs file at %s, removing',
-                        remove_path)
-        self._device.RemovePath(remove_path, as_root=True)
-
-    self._device.KillAll(self.package, exact=True, as_root=True, quiet=True)
-    self._changed = False
-
-  def __len__(self):
-    """Get the number of preferences in this collection."""
-    return len(self.xml)
-
-  def PropertyType(self, key):
-    """Get the type (i.e. tag name) of a property in the collection."""
-    return self._GetChild(key).tag
-
-  def HasProperty(self, key):
-    try:
-      self._GetChild(key)
-      return True
-    except KeyError:
-      return False
-
-  def GetBoolean(self, key):
-    """Get a boolean property."""
-    return BooleanPref(self._GetChild(key)).get()
-
-  def SetBoolean(self, key, value):
-    """Set a boolean property."""
-    self._SetPrefValue(key, value, BooleanPref)
-
-  def GetFloat(self, key):
-    """Get a float property."""
-    return FloatPref(self._GetChild(key)).get()
-
-  def SetFloat(self, key, value):
-    """Set a float property."""
-    self._SetPrefValue(key, value, FloatPref)
-
-  def GetInt(self, key):
-    """Get an int property."""
-    return IntPref(self._GetChild(key)).get()
-
-  def SetInt(self, key, value):
-    """Set an int property."""
-    self._SetPrefValue(key, value, IntPref)
-
-  def GetLong(self, key):
-    """Get a long property."""
-    return LongPref(self._GetChild(key)).get()
-
-  def SetLong(self, key, value):
-    """Set a long property."""
-    self._SetPrefValue(key, value, LongPref)
-
-  def GetString(self, key):
-    """Get a string property."""
-    return StringPref(self._GetChild(key)).get()
-
-  def SetString(self, key, value):
-    """Set a string property."""
-    self._SetPrefValue(key, value, StringPref)
-
-  def GetStringSet(self, key):
-    """Get a string set property."""
-    return StringSetPref(self._GetChild(key)).get()
-
-  def SetStringSet(self, key, value):
-    """Set a string set property."""
-    self._SetPrefValue(key, value, StringSetPref)
-
-  def Remove(self, key):
-    """Remove a preference from the collection."""
-    self.xml.remove(self._GetChild(key))
-
-  def AsDict(self):
-    """Return the properties and their values as a dictionary."""
-    d = {}
-    for child in self.xml:
-      pref = _PREF_TYPES[child.tag](child)
-      d[child.get('name')] = pref.get()
-    return d
-
-  def __enter__(self):
-    """Load preferences file from the device when entering a context."""
-    self.Load()
-    return self
-
-  def __exit__(self, exc_type, _exc_value, _traceback):
-    """Save preferences file to the device when leaving a context."""
-    if not exc_type:
-      self.Commit()
-
-  def _GetChild(self, key):
-    """Get the underlying xml node that holds the property of a given key.
-
-    Raises:
-      KeyError when the key is not found in the collection.
-    """
-    for child in self.xml:
-      if child.get('name') == key:
-        return child
-    raise KeyError(key)
-
-  def _SetPrefValue(self, key, value, pref_cls):
-    """Set the value of a property.
-
-    Args:
-      key: The key of the property to set.
-      value: The new value of the property.
-      pref_cls: A subclass of BasePref used to access the property.
-
-    Raises:
-      TypeError when the key already exists but with a different type.
-    """
-    try:
-      pref = pref_cls(self._GetChild(key))
-      old_value = pref.get()
-    except KeyError:
-      pref = pref_cls(
-          ElementTree.SubElement(self.xml, pref_cls.tag_name, {'name': key}))
-      old_value = None
-    if old_value != value:
-      pref.set(value)
-      self._changed = True
-      logger.info('Setting property: %s', pref)
diff --git a/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py b/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py
deleted file mode 100755
index b50d9e0..0000000
--- a/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py
+++ /dev/null
@@ -1,211 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of shared_prefs.py (mostly SharedPrefs).
-"""
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.sdk import shared_prefs
-from devil.android.sdk import version_codes
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-INITIAL_XML = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-               '<map>\n'
-               '  <int name="databaseVersion" value="107" />\n'
-               '  <boolean name="featureEnabled" value="false" />\n'
-               '  <string name="someHashValue">249b3e5af13d4db2</string>\n'
-               '</map>')
-
-
-def MockDeviceWithFiles(files=None):
-  if files is None:
-    files = {}
-
-  def file_exists(path):
-    return path in files
-
-  def write_file(path, contents, **_kwargs):
-    files[path] = contents
-
-  def read_file(path, **_kwargs):
-    return files[path]
-
-  device = mock.MagicMock(spec=device_utils.DeviceUtils)
-  device.FileExists = mock.Mock(side_effect=file_exists)
-  device.WriteFile = mock.Mock(side_effect=write_file)
-  device.ReadFile = mock.Mock(side_effect=read_file)
-  return device
-
-
-class SharedPrefsTest(unittest.TestCase):
-  def setUp(self):
-    self.device = MockDeviceWithFiles({
-        '/data/data/com.some.package/shared_prefs/prefs.xml': INITIAL_XML
-    })
-    self.expected_data = {
-        'databaseVersion': 107,
-        'featureEnabled': False,
-        'someHashValue': '249b3e5af13d4db2'
-    }
-
-  def testPropertyLifetime(self):
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.SetInt('myValue', 444)
-    self.assertEquals(len(prefs), 1)
-    self.assertEquals(prefs.GetInt('myValue'), 444)
-    self.assertTrue(prefs.HasProperty('myValue'))
-    prefs.Remove('myValue')
-    self.assertEquals(len(prefs), 0)
-    self.assertFalse(prefs.HasProperty('myValue'))
-    with self.assertRaises(KeyError):
-      prefs.GetInt('myValue')
-
-  def testPropertyType(self):
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'prefs.xml')
-    prefs.SetInt('myValue', 444)
-    self.assertEquals(prefs.PropertyType('myValue'), 'int')
-    with self.assertRaises(TypeError):
-      prefs.GetString('myValue')
-    with self.assertRaises(TypeError):
-      prefs.SetString('myValue', 'hello')
-
-  def testLoad(self):
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.Load()
-    self.assertEquals(len(prefs), len(self.expected_data))
-    self.assertEquals(prefs.AsDict(), self.expected_data)
-    self.assertFalse(prefs.changed)
-
-  def testClear(self):
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'prefs.xml')
-    prefs.Load()
-    self.assertEquals(prefs.AsDict(), self.expected_data)
-    self.assertFalse(prefs.changed)
-    prefs.Clear()
-    self.assertEquals(len(prefs), 0)  # collection is empty now
-    self.assertTrue(prefs.changed)
-
-  def testCommit(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'other_prefs.xml')
-    self.assertFalse(self.device.FileExists(prefs.path))  # file does not exist
-    prefs.Load()
-    self.assertEquals(len(prefs), 0)  # file did not exist, collection is empty
-    prefs.SetInt('magicNumber', 42)
-    prefs.SetFloat('myMetric', 3.14)
-    prefs.SetLong('bigNumner', 6000000000)
-    prefs.SetStringSet('apps', ['gmail', 'chrome', 'music'])
-    self.assertFalse(self.device.FileExists(prefs.path))  # still does not exist
-    self.assertTrue(prefs.changed)
-    prefs.Commit()
-    self.assertTrue(self.device.FileExists(prefs.path))  # should exist now
-    self.device.KillAll.assert_called_once_with(
-        prefs.package, exact=True, as_root=True, quiet=True)
-    self.assertFalse(prefs.changed)
-
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'other_prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.Load()
-    self.assertEquals(
-        prefs.AsDict(), {
-            'magicNumber': 42,
-            'myMetric': 3.14,
-            'bigNumner': 6000000000,
-            'apps': ['gmail', 'chrome', 'music']
-        })  # data survived roundtrip
-
-  def testForceCommit(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    prefs = shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                     'prefs.xml')
-    prefs.Load()
-    new_xml = 'Not valid XML'
-    self.device.WriteFile('/data/data/com.some.package/shared_prefs/prefs.xml',
-                          new_xml)
-    prefs.Commit()
-    # Since we didn't change anything, Commit() should be a no-op.
-    self.assertEquals(
-        self.device.ReadFile(
-            '/data/data/com.some.package/shared_prefs/prefs.xml'), new_xml)
-    prefs.Commit(force_commit=True)
-    # Forcing the commit should restore the originally read XML.
-    self.assertEquals(
-        self.device.ReadFile(
-            '/data/data/com.some.package/shared_prefs/prefs.xml'), INITIAL_XML)
-
-  def testAsContextManager_onlyReads(self):
-    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                  'prefs.xml') as prefs:
-      self.assertEquals(prefs.AsDict(), self.expected_data)  # loaded and ready
-    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
-
-  def testAsContextManager_readAndWrite(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                  'prefs.xml') as prefs:
-      prefs.SetBoolean('featureEnabled', True)
-      prefs.Remove('someHashValue')
-      prefs.SetString('newString', 'hello')
-
-    self.assertTrue(self.device.WriteFile.called)  # did write
-    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                  'prefs.xml') as prefs:
-      # changes persisted
-      self.assertTrue(prefs.GetBoolean('featureEnabled'))
-      self.assertFalse(prefs.HasProperty('someHashValue'))
-      self.assertEquals(prefs.GetString('newString'), 'hello')
-      self.assertTrue(prefs.HasProperty('databaseVersion'))  # still there
-
-  def testAsContextManager_commitAborted(self):
-    with self.assertRaises(TypeError):
-      with shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                    'prefs.xml') as prefs:
-        prefs.SetBoolean('featureEnabled', True)
-        prefs.Remove('someHashValue')
-        prefs.SetString('newString', 'hello')
-        prefs.SetInt('newString', 123)  # oops!
-
-    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
-    with shared_prefs.SharedPrefs(self.device, 'com.some.package',
-                                  'prefs.xml') as prefs:
-      # contents were not modified
-      self.assertEquals(prefs.AsDict(), self.expected_data)
-
-  def testEncryptedPath(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.MARSHMALLOW)
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml',
-        use_encrypted_path=True) as prefs:
-      self.assertTrue(prefs.path.startswith('/data/data'))
-
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.NOUGAT)
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml',
-        use_encrypted_path=True) as prefs:
-      self.assertTrue(prefs.path.startswith('/data/user_de/0'))
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/android/sdk/split_select.py b/systrace/catapult/devil/devil/android/sdk/split_select.py
deleted file mode 100644
index 6b46e57..0000000
--- a/systrace/catapult/devil/devil/android/sdk/split_select.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""This module wraps Android's split-select tool."""
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-_split_select_path = lazy.WeakConstant(lambda: build_tools.GetPath(
-    'split-select'))
-
-
-def _RunSplitSelectCmd(args):
-  """Runs a split-select command.
-
-  Args:
-    args: A list of arguments for split-select.
-
-  Returns:
-    The output of the command.
-  """
-  cmd = [_split_select_path.read()] + args
-  status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-  if status != 0:
-    raise Exception('Failed running command "%s" with output "%s".' %
-                    (' '.join(cmd), output))
-  return output
-
-
-def _SplitConfig(device, allow_cached_props=False):
-  """Returns a config specifying which APK splits are required by the device.
-
-  Args:
-    device: A DeviceUtils object.
-    allow_cached_props: Whether to use cached values for device properties.
-  """
-  return ('%s-r%s-%s:%s' % (device.GetLanguage(cache=allow_cached_props),
-                            device.GetCountry(cache=allow_cached_props),
-                            device.screen_density, device.product_cpu_abi))
-
-
-def SelectSplits(device, base_apk, split_apks, allow_cached_props=False):
-  """Determines which APK splits the device requires.
-
-  Args:
-    device: A DeviceUtils object.
-    base_apk: The path of the base APK.
-    split_apks: A list of paths of APK splits.
-    allow_cached_props: Whether to use cached values for device properties.
-
-  Returns:
-    The list of APK splits that the device requires.
-  """
-  config = _SplitConfig(device, allow_cached_props=allow_cached_props)
-  args = ['--target', config, '--base', base_apk]
-  for split in split_apks:
-    args.extend(['--split', split])
-  return _RunSplitSelectCmd(args).splitlines()
diff --git a/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt b/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
deleted file mode 100644
index 573df2e..0000000
--- a/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
+++ /dev/null
@@ -1 +0,0 @@
-Goodnight, moon.
diff --git a/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt b/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt
deleted file mode 100644
index af5626b..0000000
--- a/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello, world!
diff --git a/systrace/catapult/devil/devil/android/sdk/version_codes.py b/systrace/catapult/devil/devil/android/sdk/version_codes.py
deleted file mode 100644
index 564f30d..0000000
--- a/systrace/catapult/devil/devil/android/sdk/version_codes.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Android SDK version codes.
-
-http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-"""
-
-JELLY_BEAN = 16
-JELLY_BEAN_MR1 = 17
-JELLY_BEAN_MR2 = 18
-KITKAT = 19
-KITKAT_WATCH = 20
-LOLLIPOP = 21
-LOLLIPOP_MR1 = 22
-MARSHMALLOW = 23
-NOUGAT = 24
-NOUGAT_MR1 = 25
-OREO = 26
-OREO_MR1 = 27
-PIE = 28
-Q = 29
-R = 30
diff --git a/systrace/catapult/devil/devil/android/settings.py b/systrace/catapult/devil/devil/android/settings.py
deleted file mode 100644
index 3cb1002..0000000
--- a/systrace/catapult/devil/devil/android/settings.py
+++ /dev/null
@@ -1,302 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-_LOCK_SCREEN_SETTINGS_PATH = '/data/system/locksettings.db'
-_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH = (
-    '/data/data/com.android.providers.settings/databases/settings.db')
-PASSWORD_QUALITY_UNSPECIFIED = '0'
-_COMPATIBLE_BUILD_TYPES = ['userdebug', 'eng']
-
-ENABLE_LOCATION_SETTINGS = [
-    # Note that setting these in this order is required in order for all of
-    # them to take and stick through a reboot.
-    ('com.google.settings/partner', [
-        ('use_location_for_services', 1),
-    ]),
-    (
-        'settings/secure',
-        [
-            # Ensure Geolocation is enabled and allowed for tests.
-            ('location_providers_allowed', 'gps,network'),
-        ]),
-    ('com.google.settings/partner', [
-        ('network_location_opt_in', 1),
-    ])
-]
-
-DISABLE_LOCATION_SETTINGS = [
-    ('com.google.settings/partner', [
-        ('use_location_for_services', 0),
-    ]),
-    (
-        'settings/secure',
-        [
-            # Ensure Geolocation is disabled.
-            ('location_providers_allowed', ''),
-        ]),
-]
-
-ENABLE_MOCK_LOCATION_SETTINGS = [
-    ('settings/secure', [
-        ('mock_location', 1),
-    ]),
-]
-
-DISABLE_MOCK_LOCATION_SETTINGS = [
-    ('settings/secure', [
-        ('mock_location', 0),
-    ]),
-]
-
-DETERMINISTIC_DEVICE_SETTINGS = [
-    (
-        'settings/global',
-        [
-            ('assisted_gps_enabled', 0),
-
-            # Disable "auto time" and "auto time zone" to avoid network-provided
-            # time to overwrite the device's datetime and timezone synchronized
-            # from host when running tests later. See b/6569849.
-            ('auto_time', 0),
-            ('auto_time_zone', 0),
-            ('development_settings_enabled', 1),
-
-            # Flag for allowing ActivityManagerService to send ACTION_APP_ERROR
-            # intens on application crashes and ANRs. If this is disabled, the
-            # crash/ANR dialog will never display the "Report" button.
-            # Type: int ( 0 = disallow, 1 = allow )
-            ('send_action_app_error', 0),
-            ('stay_on_while_plugged_in', 3),
-            ('verifier_verify_adb_installs', 0),
-            ('window_animation_scale', 0),
-        ]),
-    (
-        'settings/secure',
-        [
-            ('allowed_geolocation_origins',
-             'http://www.google.co.uk http://www.google.com'),
-
-            # Ensure that we never get random dialogs like "Unfortunately the
-            # process android.process.acore has stopped", which steal the focus,
-            # and make our automation fail (because the dialog steals the focus
-            # then mistakenly receives the injected user input events).
-            ('anr_show_background', 0),
-            ('lockscreen.disabled', 1),
-            ('screensaver_enabled', 0),
-            ('skip_first_use_hints', 1),
-        ]),
-    (
-        'settings/system',
-        [
-            # Don't want devices to accidentally rotate the screen as that could
-            # affect performance measurements.
-            ('accelerometer_rotation', 0),
-            ('lockscreen.disabled', 1),
-
-            # Turn down brightness and disable auto-adjust so that devices run
-            # cooler.
-            ('screen_brightness', 5),
-            ('screen_brightness_mode', 0),
-            ('user_rotation', 0),
-            ('window_animation_scale', 0),
-        ]),
-]
-
-NETWORK_DISABLED_SETTINGS = [
-    ('settings/global', [
-        ('airplane_mode_on', 1),
-        ('wifi_on', 0),
-    ]),
-]
-
-
-class ContentSettings(dict):
-  """A dict interface to interact with device content settings.
-
-  System properties are key/value pairs as exposed by adb shell content.
-  """
-
-  def __init__(self, table, device):
-    super(ContentSettings, self).__init__()
-    self._table = table
-    self._device = device
-
-  @staticmethod
-  def _GetTypeBinding(value):
-    if isinstance(value, bool):
-      return 'b'
-    if isinstance(value, float):
-      return 'f'
-    if isinstance(value, int):
-      return 'i'
-    if isinstance(value, long):
-      return 'l'
-    if isinstance(value, str):
-      return 's'
-    raise ValueError('Unsupported type %s' % type(value))
-
-  def iteritems(self):
-    for row in self._device.RunShellCommand(
-        ['content', 'query', '--uri',
-         'content://%s' % self._table],
-        check_return=True,
-        as_root=True):
-      key, value = _ParseContentRow(row)
-      if not key:
-        continue
-      yield key, value
-
-  def __getitem__(self, key):
-    query_row = self._device.RunShellCommand([
-        'content', 'query', '--uri',
-        'content://%s' % self._table, '--where',
-        "name='%s'" % key
-    ],
-                                             check_return=True,
-                                             as_root=True,
-                                             single_line=True)
-    parsed_key, parsed_value = _ParseContentRow(query_row)
-    if parsed_key is None:
-      raise KeyError('key=%s not found' % key)
-    if parsed_key != key:
-      raise KeyError('Expected key=%s, but got key=%s' % (key, parsed_key))
-    return parsed_value
-
-  def __setitem__(self, key, value):
-    if key in self:
-      self._device.RunShellCommand([
-          'content', 'update', '--uri',
-          'content://%s' % self._table, '--bind',
-          'value:%s:%s' % (self._GetTypeBinding(value), value), '--where',
-          "name='%s'" % key
-      ],
-                                   check_return=True,
-                                   as_root=True)
-    else:
-      self._device.RunShellCommand([
-          'content', 'insert', '--uri',
-          'content://%s' % self._table, '--bind',
-          'name:%s:%s' % (self._GetTypeBinding(key), key), '--bind',
-          'value:%s:%s' % (self._GetTypeBinding(value), value)
-      ],
-                                   check_return=True,
-                                   as_root=True)
-
-  def __delitem__(self, key):
-    self._device.RunShellCommand([
-        'content', 'delete', '--uri',
-        'content://%s' % self._table, '--bind',
-        'name:%s:%s' % (self._GetTypeBinding(key), key)
-    ],
-                                 check_return=True,
-                                 as_root=True)
-
-
-def ConfigureContentSettings(device, desired_settings):
-  """Configures device content setings from a list.
-
-  Many settings are documented at:
-    http://developer.android.com/reference/android/provider/Settings.Global.html
-    http://developer.android.com/reference/android/provider/Settings.Secure.html
-    http://developer.android.com/reference/android/provider/Settings.System.html
-
-  Many others are undocumented.
-
-  Args:
-    device: A DeviceUtils instance for the device to configure.
-    desired_settings: A list of (table, [(key: value), ...]) for all
-        settings to configure.
-  """
-  for table, key_value in desired_settings:
-    settings = ContentSettings(table, device)
-    for key, value in key_value:
-      settings[key] = value
-    logger.info('\n%s %s', table, (80 - len(table)) * '-')
-    for key, value in sorted(settings.iteritems()):
-      logger.info('\t%s: %s', key, value)
-
-
-def SetLockScreenSettings(device):
-  """Sets lock screen settings on the device.
-
-  On certain device/Android configurations we need to disable the lock screen in
-  a different database. Additionally, the password type must be set to
-  DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED.
-  Lock screen settings are stored in sqlite on the device in:
-      /data/system/locksettings.db
-
-  IMPORTANT: The first column is used as a primary key so that all rows with the
-  same value for that column are removed from the table prior to inserting the
-  new values.
-
-  Args:
-    device: A DeviceUtils instance for the device to configure.
-
-  Raises:
-    Exception if the setting was not properly set.
-  """
-  if device.build_type not in _COMPATIBLE_BUILD_TYPES:
-    logger.warning('Unable to disable lockscreen on %s builds.',
-                   device.build_type)
-    return
-
-  def get_lock_settings(table):
-    return [(table, 'lockscreen.disabled', '1'),
-            (table, 'lockscreen.password_type', PASSWORD_QUALITY_UNSPECIFIED),
-            (table, 'lockscreen.password_type_alternate',
-             PASSWORD_QUALITY_UNSPECIFIED)]
-
-  if device.FileExists(_LOCK_SCREEN_SETTINGS_PATH):
-    db = _LOCK_SCREEN_SETTINGS_PATH
-    locksettings = get_lock_settings('locksettings')
-    columns = ['name', 'user', 'value']
-    generate_values = lambda k, v: [k, '0', v]
-  elif device.FileExists(_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH):
-    db = _ALTERNATE_LOCK_SCREEN_SETTINGS_PATH
-    locksettings = get_lock_settings('secure') + get_lock_settings('system')
-    columns = ['name', 'value']
-    generate_values = lambda k, v: [k, v]
-  else:
-    logger.warning('Unable to find database file to set lock screen settings.')
-    return
-
-  for table, key, value in locksettings:
-    # Set the lockscreen setting for default user '0'
-    values = generate_values(key, value)
-
-    cmd = """begin transaction;
-delete from '%(table)s' where %(primary_key)s='%(primary_value)s';
-insert into '%(table)s' (%(columns)s) values (%(values)s);
-commit transaction;""" % {
-        'table': table,
-        'primary_key': columns[0],
-        'primary_value': values[0],
-        'columns': ', '.join(columns),
-        'values': ', '.join(["'%s'" % value for value in values])
-    }
-    output_msg = device.RunShellCommand(['sqlite3', db, cmd],
-                                        check_return=True,
-                                        as_root=True)
-    if output_msg:
-      logger.info(' '.join(output_msg))
-
-
-def _ParseContentRow(row):
-  """Parse key, value entries from a row string."""
-  # Example row:
-  # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
-  fields = row.split(', ')
-  key = None
-  value = ''
-  for field in fields:
-    k, _, v = field.partition('=')
-    if k == 'name':
-      key = v
-    elif k == 'value':
-      value = v
-  return key, value
diff --git a/systrace/catapult/devil/devil/android/tools/__init__.py b/systrace/catapult/devil/devil/android/tools/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/systrace/catapult/devil/devil/android/tools/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py b/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
deleted file mode 100755
index e6b05aa..0000000
--- a/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import json
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil.android import device_utils
-from devil.android.tools import script_common
-from devil.utils import logging_common
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      'Run an adb shell command on selected devices')
-  parser.add_argument('cmd', help='Adb shell command to run.', nargs="+")
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddDeviceArguments(parser)
-  script_common.AddEnvironmentArguments(parser)
-  parser.add_argument('--as-root', action='store_true', help='Run as root.')
-  parser.add_argument('--json-output', help='File to dump json output to.')
-  args = parser.parse_args()
-
-  logging_common.InitializeLogging(args)
-  script_common.InitializeEnvironment(args)
-
-  devices = script_common.GetDevices(args.devices, args.denylist_file)
-  p_out = (device_utils.DeviceUtils.parallel(devices).RunShellCommand(
-      args.cmd, large_output=True, as_root=args.as_root,
-      check_return=True).pGet(None))
-
-  data = {}
-  for device, output in zip(devices, p_out):
-    for line in output:
-      print '%s: %s' % (device, line)
-    data[str(device)] = output
-
-  if args.json_output:
-    with open(args.json_output, 'w') as f:
-      json.dump(data, f)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/cpufreq.py b/systrace/catapult/devil/devil/android/tools/cpufreq.py
deleted file mode 100755
index f33542b..0000000
--- a/systrace/catapult/devil/devil/android/tools/cpufreq.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A script to manipulate device CPU frequency."""
-
-import argparse
-import os
-import pprint
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil.android import device_utils
-from devil.android.perf import perf_control
-from devil.android.tools import script_common
-from devil.utils import logging_common
-
-
-def SetScalingGovernor(device, args):
-  p = perf_control.PerfControl(device)
-  p.SetScalingGovernor(args.governor)
-
-
-def GetScalingGovernor(device, _args):
-  p = perf_control.PerfControl(device)
-  for cpu, governor in p.GetScalingGovernor():
-    print '%s %s: %s' % (str(device), cpu, governor)
-
-
-def ListAvailableGovernors(device, _args):
-  p = perf_control.PerfControl(device)
-  for cpu, governors in p.ListAvailableGovernors():
-    print '%s %s: %s' % (str(device), cpu, pprint.pformat(governors))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddEnvironmentArguments(parser)
-  parser.add_argument(
-      '--device',
-      dest='devices',
-      action='append',
-      default=[],
-      help='Devices for which the governor should be set. Defaults to all.')
-
-  subparsers = parser.add_subparsers()
-
-  set_governor = subparsers.add_parser('set-governor')
-  set_governor.add_argument('governor', help='Desired CPU governor.')
-  set_governor.set_defaults(func=SetScalingGovernor)
-
-  get_governor = subparsers.add_parser('get-governor')
-  get_governor.set_defaults(func=GetScalingGovernor)
-
-  list_governors = subparsers.add_parser('list-governors')
-  list_governors.set_defaults(func=ListAvailableGovernors)
-
-  args = parser.parse_args(raw_args)
-
-  logging_common.InitializeLogging(args)
-  script_common.InitializeEnvironment(args)
-
-  devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices)
-
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  parallel_devices.pMap(args.func, args)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/tools/device_monitor.py b/systrace/catapult/devil/devil/android/tools/device_monitor.py
deleted file mode 100755
index 730df14..0000000
--- a/systrace/catapult/devil/devil/android/tools/device_monitor.py
+++ /dev/null
@@ -1,233 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Launches a daemon to monitor android device temperatures & status.
-
-This script will repeatedly poll the given devices for their temperatures and
-status every 60 seconds and dump the stats to file on the host.
-"""
-
-import argparse
-import collections
-import json
-import logging
-import logging.handlers
-import os
-import re
-import socket
-import sys
-import time
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil.android import battery_utils
-from devil.android import device_denylist
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import script_common
-
-# Various names of sensors used to measure cpu temp
-CPU_TEMP_SENSORS = [
-    # most nexus devices
-    'tsens_tz_sensor0',
-    # android one
-    'mtktscpu',
-    # nexus 9
-    'CPU-therm',
-]
-
-DEVICE_FILE_VERSION = 1
-DEVICE_FILE = os.path.join(
-    os.path.expanduser('~'), '.android',
-    '%s__android_device_status.json' % socket.gethostname().split('.')[0])
-
-MEM_INFO_REGEX = re.compile(
-    r'.*?\:\s*(\d+)\s*kB')  # ex: 'MemTotal:   185735 kB'
-
-
-def get_device_status_unsafe(device):
-  """Polls the given device for various info.
-
-    Returns: A dict of the following format:
-    {
-      'battery': {
-        'level': 100,
-        'temperature': 123
-      },
-      'build': {
-        'build.id': 'ABC12D',
-        'product.device': 'chickenofthesea'
-      },
-      'imei': 123456789,
-      'mem': {
-        'avail': 1000000,
-        'total': 1234567,
-      },
-      'processes': 123,
-      'state': 'good',
-      'temp': {
-        'some_sensor': 30
-      },
-      'uptime': 1234.56,
-    }
-  """
-  status = collections.defaultdict(dict)
-
-  # Battery
-  battery = battery_utils.BatteryUtils(device)
-  battery_info = battery.GetBatteryInfo()
-  try:
-    level = int(battery_info.get('level'))
-  except (KeyError, TypeError, ValueError):
-    level = None
-  if level and level >= 0 and level <= 100:
-    status['battery']['level'] = level
-  try:
-    temperature = int(battery_info.get('temperature'))
-  except (KeyError, TypeError, ValueError):
-    temperature = None
-  if temperature:
-    status['battery']['temperature'] = temperature
-
-  # Build
-  status['build']['build.id'] = device.build_id
-  status['build']['product.device'] = device.build_product
-
-  # Memory
-  mem_info = ''
-  try:
-    mem_info = device.ReadFile('/proc/meminfo')
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to read /proc/meminfo')
-  for line in mem_info.splitlines():
-    match = MEM_INFO_REGEX.match(line)
-    if match:
-      try:
-        value = int(match.group(1))
-      except ValueError:
-        continue
-      key = line.split(':')[0].strip()
-      if key == 'MemTotal':
-        status['mem']['total'] = value
-      elif key == 'MemFree':
-        status['mem']['free'] = value
-
-  # Process
-  try:
-    status['processes'] = len(device.ListProcesses())
-  except device_errors.AdbCommandFailedError:
-    logging.exception('Unable to count process list.')
-
-  # CPU Temps
-  # Find a thermal sensor that matches one in CPU_TEMP_SENSORS and read its
-  # temperature.
-  files = []
-  try:
-    files = device.RunShellCommand(
-        'grep -lE "%s" /sys/class/thermal/thermal_zone*/type' %
-        '|'.join(CPU_TEMP_SENSORS),
-        shell=True,
-        check_return=True)
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to list thermal sensors.')
-  for f in files:
-    try:
-      sensor_name = device.ReadFile(f).strip()
-      temp = float(device.ReadFile(f[:-4] + 'temp').strip())  # s/type^/temp
-      status['temp'][sensor_name] = temp
-    except (device_errors.AdbShellCommandFailedError, ValueError):
-      logging.exception('Unable to read thermal sensor %s', f)
-
-  # Uptime
-  try:
-    uptimes = device.ReadFile('/proc/uptime').split()
-    status['uptime'] = float(uptimes[0])  # Take the first field (actual uptime)
-  except (device_errors.AdbShellCommandFailedError, ValueError):
-    logging.exception('Unable to read /proc/uptime')
-
-  try:
-    status['imei'] = device.GetIMEI()
-  except device_errors.CommandFailedError:
-    logging.exception('Unable to read IMEI')
-    status['imei'] = 'unknown'
-
-  status['state'] = 'available'
-  return status
-
-
-def get_device_status(device):
-  try:
-    status = get_device_status_unsafe(device)
-  except device_errors.DeviceUnreachableError:
-    status = collections.defaultdict(dict)
-    status['state'] = 'offline'
-  return status
-
-
-def get_all_status(denylist):
-  status_dict = {
-      'version': DEVICE_FILE_VERSION,
-      'devices': {},
-  }
-
-  healthy_devices = device_utils.DeviceUtils.HealthyDevices(denylist)
-  parallel_devices = device_utils.DeviceUtils.parallel(healthy_devices)
-  results = parallel_devices.pMap(get_device_status).pGet(None)
-
-  status_dict['devices'] = {
-      device.serial: result
-      for device, result in zip(healthy_devices, results)
-  }
-
-  if denylist:
-    for device, reason in denylist.Read().items():
-      status_dict['devices'][device] = {
-          'state': reason.get('reason', 'denylisted')
-      }
-
-  status_dict['timestamp'] = time.time()
-  return status_dict
-
-
-def main(argv):
-  """Launches the device monitor.
-
-  Polls the devices for their battery and cpu temperatures and scans the
-  denylist file every 60 seconds and dumps the data to DEVICE_FILE.
-  """
-
-  parser = argparse.ArgumentParser(description='Launches the device monitor.')
-  script_common.AddEnvironmentArguments(parser)
-  parser.add_argument('--denylist-file', help='Path to device denylist file.')
-  args = parser.parse_args(argv)
-
-  logger = logging.getLogger()
-  logger.setLevel(logging.DEBUG)
-  handler = logging.handlers.RotatingFileHandler(
-      '/tmp/device_monitor.log', maxBytes=10 * 1024 * 1024, backupCount=5)
-  fmt = logging.Formatter(
-      '%(asctime)s %(levelname)s %(message)s', datefmt='%y%m%d %H:%M:%S')
-  handler.setFormatter(fmt)
-  logger.addHandler(handler)
-  script_common.InitializeEnvironment(args)
-
-  denylist = (device_denylist.Denylist(args.denylist_file)
-              if args.denylist_file else None)
-
-  logging.info('Device monitor running with pid %d, adb: %s, denylist: %s',
-               os.getpid(), args.adb_path, args.denylist_file)
-  while True:
-    start = time.time()
-    status_dict = get_all_status(denylist)
-    with open(DEVICE_FILE, 'wb') as f:
-      json.dump(status_dict, f, indent=2, sort_keys=True)
-    logging.info('Got status of all devices in %.2fs.', time.time() - start)
-    time.sleep(60)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/tools/device_monitor_test.py b/systrace/catapult/devil/devil/android/tools/device_monitor_test.py
deleted file mode 100755
index 1bb5680..0000000
--- a/systrace/catapult/devil/devil/android/tools/device_monitor_test.py
+++ /dev/null
@@ -1,187 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import unittest
-
-import six
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import device_monitor
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class DeviceMonitorTest(unittest.TestCase):
-  def setUp(self):
-    self.device = mock.Mock(
-        spec=device_utils.DeviceUtils,
-        serial='device_cereal',
-        build_id='abc123',
-        build_product='clownfish',
-        GetIMEI=lambda: '123456789')
-    self.file_contents = {
-        '/proc/meminfo':
-            """
-                         MemTotal:        1234567 kB
-                         MemFree:         1000000 kB
-                         MemUsed:          234567 kB
-                         """,
-        '/sys/class/thermal/thermal_zone0/type':
-            'CPU-therm',
-        '/sys/class/thermal/thermal_zone0/temp':
-            '30',
-        '/proc/uptime':
-            '12345 99999',
-    }
-    self.device.ReadFile = mock.MagicMock(
-        side_effect=lambda file_name: self.file_contents[file_name])
-
-    self.device.ListProcesses.return_value = ['p1', 'p2', 'p3', 'p4', 'p5']
-
-    self.cmd_outputs = {
-        'grep': ['/sys/class/thermal/thermal_zone0/type'],
-    }
-
-    def mock_run_shell(cmd, **_kwargs):
-      args = cmd.split() if isinstance(cmd, six.string_types) else cmd
-      try:
-        return self.cmd_outputs[args[0]]
-      except KeyError:
-        raise device_errors.AdbShellCommandFailedError(cmd, None, None)
-
-    self.device.RunShellCommand = mock.MagicMock(side_effect=mock_run_shell)
-
-    self.battery = mock.Mock()
-    self.battery.GetBatteryInfo = mock.MagicMock(return_value={
-        'level': '80',
-        'temperature': '123'
-    })
-
-    self.expected_status = {
-        'device_cereal': {
-            'processes': 5,
-            'temp': {
-                'CPU-therm': 30.0
-            },
-            'battery': {
-                'temperature': 123,
-                'level': 80
-            },
-            'uptime': 12345.0,
-            'mem': {
-                'total': 1234567,
-                'free': 1000000
-            },
-            'build': {
-                'build.id': 'abc123',
-                'product.device': 'clownfish',
-            },
-            'imei': '123456789',
-            'state': 'available',
-        }
-    }
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStats(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(self.expected_status, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoBattery(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    broken_battery_info = mock.Mock()
-    broken_battery_info.GetBatteryInfo = mock.MagicMock(return_value={
-        'level': '-1',
-        'temperature': 'not_a_number'
-    })
-    get_battery.return_value = broken_battery_info
-
-    # Should be same status dict but without battery stats.
-    expected_status_no_battery = self.expected_status.copy()
-    expected_status_no_battery['device_cereal'].pop('battery')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_battery, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoPs(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    # Throw exception when listing processes.
-    self.device.ListProcesses.side_effect = device_errors.AdbCommandFailedError(
-        ['ps'], 'something failed', 1)
-
-    # Should be same status dict but without process stats.
-    expected_status_no_ps = self.expected_status.copy()
-    expected_status_no_ps['device_cereal'].pop('processes')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_ps, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoSensors(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    del self.cmd_outputs['grep']  # Throw exception on run shell grep command.
-
-    # Should be same status dict but without temp stats.
-    expected_status_no_temp = self.expected_status.copy()
-    expected_status_no_temp['device_cereal'].pop('temp')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_temp, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsWithDenylist(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    denylist = mock.Mock()
-    denylist.Read = mock.MagicMock(
-        return_value={'bad_device': {
-            'reason': 'offline'
-        }})
-
-    # Should be same status dict but with extra denylisted device.
-    expected_status = self.expected_status.copy()
-    expected_status['bad_device'] = {'state': 'offline'}
-
-    status = device_monitor.get_all_status(denylist)
-    self.assertEquals(expected_status, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_brokenTempValue(self, get_devices, get_battery):
-    self.file_contents['/sys/class/thermal/thermal_zone0/temp'] = 'n0t a numb3r'
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-
-    expected_status_no_temp = self.expected_status.copy()
-    expected_status_no_temp['device_cereal'].pop('temp')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(self.expected_status, status['devices'])
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/systrace/catapult/devil/devil/android/tools/device_recovery.py b/systrace/catapult/devil/devil/android/tools/device_recovery.py
deleted file mode 100755
index 10c5fe5..0000000
--- a/systrace/catapult/devil/devil/android/tools/device_recovery.py
+++ /dev/null
@@ -1,263 +0,0 @@
-#!/usr/bin/env vpython
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A script to recover devices in a known bad state."""
-
-import argparse
-import glob
-import logging
-import os
-import signal
-import sys
-
-import psutil
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_denylist
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.android.tools import device_status
-from devil.android.tools import script_common
-from devil.utils import logging_common
-from devil.utils import lsusb
-# TODO(jbudorick): Resolve this after experimenting w/ disabling the USB reset.
-from devil.utils import reset_usb  # pylint: disable=unused-import
-
-logger = logging.getLogger(__name__)
-
-from py_utils import modules_util
-
-# Script depends on features from psutil version 2.0 or higher.
-modules_util.RequireVersion(psutil, '2.0')
-
-
-def KillAllAdb():
-  def get_all_adb():
-    for p in psutil.process_iter():
-      try:
-        # Retrieve all required process infos at once.
-        pinfo = p.as_dict(attrs=['pid', 'name', 'cmdline'])
-        if pinfo['name'] == 'adb':
-          pinfo['cmdline'] = ' '.join(pinfo['cmdline'])
-          yield p, pinfo
-      except (psutil.NoSuchProcess, psutil.AccessDenied):
-        pass
-
-  for sig in [signal.SIGTERM, signal.SIGQUIT, signal.SIGKILL]:
-    for p, pinfo in get_all_adb():
-      try:
-        pinfo['signal'] = sig
-        logger.info('kill %(signal)s %(pid)s (%(name)s [%(cmdline)s])', pinfo)
-        p.send_signal(sig)
-      except (psutil.NoSuchProcess, psutil.AccessDenied):
-        pass
-  for _, pinfo in get_all_adb():
-    try:
-      logger.error('Unable to kill %(pid)s (%(name)s [%(cmdline)s])', pinfo)
-    except (psutil.NoSuchProcess, psutil.AccessDenied):
-      pass
-
-
-def TryAuth(device):
-  """Uses anything in ~/.android/ that looks like a key to auth with the device.
-
-  Args:
-    device: The DeviceUtils device to attempt to auth.
-
-  Returns:
-    True if device successfully authed.
-  """
-  possible_keys = glob.glob(os.path.join(adb_wrapper.ADB_HOST_KEYS_DIR, '*key'))
-  if len(possible_keys) <= 1:
-    logger.warning('Only %d ADB keys available. Not forcing auth.',
-                   len(possible_keys))
-    return False
-
-  KillAllAdb()
-  adb_wrapper.AdbWrapper.StartServer(keys=possible_keys)
-  new_state = device.adb.GetState()
-  if new_state != 'device':
-    logger.error('Auth failed. Device %s still stuck in %s.', str(device),
-                 new_state)
-    return False
-
-  # It worked! Now register the host's default ADB key on the device so we don't
-  # have to do all that again.
-  pub_key = os.path.join(adb_wrapper.ADB_HOST_KEYS_DIR, 'adbkey.pub')
-  if not os.path.exists(pub_key):  # This really shouldn't happen.
-    logger.error('Default ADB key not available at %s.', pub_key)
-    return False
-
-  with open(pub_key) as f:
-    pub_key_contents = f.read()
-  try:
-    device.WriteFile(adb_wrapper.ADB_KEYS_FILE, pub_key_contents, as_root=True)
-  except (device_errors.CommandTimeoutError, device_errors.CommandFailedError,
-          device_errors.DeviceUnreachableError):
-    logger.exception('Unable to write default ADB key to %s.', str(device))
-    return False
-  return True
-
-
-def RecoverDevice(device, denylist, should_reboot=lambda device: True):
-  if device_status.IsDenylisted(device.adb.GetDeviceSerial(), denylist):
-    logger.debug('%s is denylisted, skipping recovery.', str(device))
-    return
-
-  if device.adb.GetState() == 'unauthorized' and TryAuth(device):
-    logger.info('Successfully authed device %s!', str(device))
-    return
-
-  if should_reboot(device):
-    should_restore_root = device.HasRoot()
-    try:
-      device.WaitUntilFullyBooted(retries=0)
-    except (device_errors.CommandTimeoutError, device_errors.CommandFailedError,
-            device_errors.DeviceUnreachableError):
-      logger.exception(
-          'Failure while waiting for %s. '
-          'Attempting to recover.', str(device))
-    try:
-      try:
-        device.Reboot(block=False, timeout=5, retries=0)
-      except device_errors.CommandTimeoutError:
-        logger.warning(
-            'Timed out while attempting to reboot %s normally.'
-            'Attempting alternative reboot.', str(device))
-        # The device drops offline before we can grab the exit code, so
-        # we don't check for status.
-        try:
-          device.adb.Root()
-        finally:
-          # We are already in a failure mode, attempt to reboot regardless of
-          # what device.adb.Root() returns. If the sysrq reboot fails an
-          # exception willbe thrown at that level.
-          device.adb.Shell(
-              'echo b > /proc/sysrq-trigger',
-              expect_status=None,
-              timeout=5,
-              retries=0)
-    except (device_errors.CommandFailedError,
-            device_errors.DeviceUnreachableError):
-      logger.exception('Failed to reboot %s.', str(device))
-      if denylist:
-        denylist.Extend([device.adb.GetDeviceSerial()], reason='reboot_failure')
-    except device_errors.CommandTimeoutError:
-      logger.exception('Timed out while rebooting %s.', str(device))
-      if denylist:
-        denylist.Extend([device.adb.GetDeviceSerial()], reason='reboot_timeout')
-
-    try:
-      device.WaitUntilFullyBooted(
-          retries=0, timeout=device.REBOOT_DEFAULT_TIMEOUT)
-      if should_restore_root:
-        device.EnableRoot()
-    except (device_errors.CommandFailedError,
-            device_errors.DeviceUnreachableError):
-      logger.exception('Failure while waiting for %s.', str(device))
-      if denylist:
-        denylist.Extend([device.adb.GetDeviceSerial()], reason='reboot_failure')
-    except device_errors.CommandTimeoutError:
-      logger.exception('Timed out while waiting for %s.', str(device))
-      if denylist:
-        denylist.Extend([device.adb.GetDeviceSerial()], reason='reboot_timeout')
-
-
-def RecoverDevices(devices, denylist, enable_usb_reset=False):
-  """Attempts to recover any inoperable devices in the provided list.
-
-  Args:
-    devices: The list of devices to attempt to recover.
-    denylist: The current device denylist, which will be used then
-      reset.
-  """
-
-  statuses = device_status.DeviceStatus(devices, denylist)
-
-  should_restart_usb = set(
-      status['serial'] for status in statuses
-      if (not status['usb_status'] or status['adb_status'] in ('offline',
-                                                               'missing')))
-  should_restart_adb = should_restart_usb.union(
-      set(status['serial'] for status in statuses
-          if status['adb_status'] == 'unauthorized'))
-  should_reboot_device = should_restart_usb.union(
-      set(status['serial'] for status in statuses if status['denylisted']))
-
-  logger.debug('Should restart USB for:')
-  for d in should_restart_usb:
-    logger.debug('  %s', d)
-  logger.debug('Should restart ADB for:')
-  for d in should_restart_adb:
-    logger.debug('  %s', d)
-  logger.debug('Should reboot:')
-  for d in should_reboot_device:
-    logger.debug('  %s', d)
-
-  if denylist:
-    denylist.Reset()
-
-  if should_restart_adb:
-    KillAllAdb()
-    adb_wrapper.AdbWrapper.StartServer()
-
-  for serial in should_restart_usb:
-    try:
-      # TODO(crbug.com/642194): Resetting may be causing more harm
-      # (specifically, kernel panics) than it does good.
-      if enable_usb_reset:
-        reset_usb.reset_android_usb(serial)
-      else:
-        logger.warning('USB reset disabled for %s (crbug.com/642914)', serial)
-    except IOError:
-      logger.exception('Unable to reset USB for %s.', serial)
-      if denylist:
-        denylist.Extend([serial], reason='USB failure')
-    except device_errors.DeviceUnreachableError:
-      logger.exception('Unable to reset USB for %s.', serial)
-      if denylist:
-        denylist.Extend([serial], reason='offline')
-
-  device_utils.DeviceUtils.parallel(devices).pMap(
-      RecoverDevice,
-      denylist,
-      should_reboot=lambda device: device.serial in should_reboot_device)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddEnvironmentArguments(parser)
-  parser.add_argument('--denylist-file', help='Device denylist JSON file.')
-  parser.add_argument(
-      '--known-devices-file',
-      action='append',
-      default=[],
-      dest='known_devices_files',
-      help='Path to known device lists.')
-  parser.add_argument(
-      '--enable-usb-reset', action='store_true', help='Reset USB if necessary.')
-
-  args = parser.parse_args()
-  logging_common.InitializeLogging(args)
-  script_common.InitializeEnvironment(args)
-
-  denylist = (device_denylist.Denylist(args.denylist_file)
-              if args.denylist_file else None)
-
-  expected_devices = device_status.GetExpectedDevices(args.known_devices_files)
-  usb_devices = set(lsusb.get_android_devices())
-  devices = [
-      device_utils.DeviceUtils(s) for s in expected_devices.union(usb_devices)
-  ]
-
-  RecoverDevices(devices, denylist, enable_usb_reset=args.enable_usb_reset)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/device_status.py b/systrace/catapult/devil/devil/android/tools/device_status.py
deleted file mode 100755
index 40f714a..0000000
--- a/systrace/catapult/devil/devil/android/tools/device_status.py
+++ /dev/null
@@ -1,301 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A script to keep track of devices across builds and report state."""
-
-import argparse
-import json
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import battery_utils
-from devil.android import device_denylist
-from devil.android import device_errors
-from devil.android import device_list
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import logging_common
-from devil.utils import lsusb
-
-logger = logging.getLogger(__name__)
-
-_RE_DEVICE_ID = re.compile(r'Device ID = (\d+)')
-
-
-def IsDenylisted(serial, denylist):
-  return denylist and serial in denylist.Read()
-
-
-def _BatteryStatus(device, denylist):
-  battery_info = {}
-  try:
-    battery = battery_utils.BatteryUtils(device)
-    battery_info = battery.GetBatteryInfo(timeout=5)
-    battery_level = int(battery_info.get('level', 100))
-
-    if battery_level < 15:
-      logger.error('Critically low battery level (%d)', battery_level)
-      battery = battery_utils.BatteryUtils(device)
-      if not battery.GetCharging():
-        battery.SetCharging(True)
-      if denylist:
-        denylist.Extend([device.adb.GetDeviceSerial()], reason='low_battery')
-
-  except (device_errors.CommandFailedError,
-          device_errors.DeviceUnreachableError):
-    logger.exception('Failed to get battery information for %s', str(device))
-
-  return battery_info
-
-
-def DeviceStatus(devices, denylist):
-  """Generates status information for the given devices.
-
-  Args:
-    devices: The devices to generate status for.
-    denylist: The current device denylist.
-  Returns:
-    A dict of the following form:
-    {
-      '<serial>': {
-        'serial': '<serial>',
-        'adb_status': str,
-        'usb_status': bool,
-        'denylisted': bool,
-        # only if the device is connected and not denylisted
-        'type': ro.build.product,
-        'build': ro.build.id,
-        'build_detail': ro.build.fingerprint,
-        'battery': {
-          ...
-        },
-        'imei_slice': str,
-        'wifi_ip': str,
-      },
-      ...
-    }
-  """
-  adb_devices = {
-      a[0].GetDeviceSerial(): a
-      for a in adb_wrapper.AdbWrapper.Devices(
-          desired_state=None, long_list=True)
-  }
-  usb_devices = set(lsusb.get_android_devices())
-
-  def denylisting_device_status(device):
-    serial = device.adb.GetDeviceSerial()
-    adb_status = (adb_devices[serial][1]
-                  if serial in adb_devices else 'missing')
-    usb_status = bool(serial in usb_devices)
-
-    device_status = {
-        'serial': serial,
-        'adb_status': adb_status,
-        'usb_status': usb_status,
-    }
-
-    if not IsDenylisted(serial, denylist):
-      if adb_status == 'device':
-        try:
-          build_product = device.build_product
-          build_id = device.build_id
-          build_fingerprint = device.build_fingerprint
-          build_description = device.build_description
-          wifi_ip = device.GetProp('dhcp.wlan0.ipaddress')
-          battery_info = _BatteryStatus(device, denylist)
-          try:
-            imei_slice = device.GetIMEI()
-          except device_errors.CommandFailedError:
-            logging.exception('Unable to fetch IMEI for %s.', str(device))
-            imei_slice = 'unknown'
-
-          if (device.product_name == 'mantaray'
-              and battery_info.get('AC powered', None) != 'true'):
-            logger.error('Mantaray device not connected to AC power.')
-
-          device_status.update({
-              'ro.build.product': build_product,
-              'ro.build.id': build_id,
-              'ro.build.fingerprint': build_fingerprint,
-              'ro.build.description': build_description,
-              'battery': battery_info,
-              'imei_slice': imei_slice,
-              'wifi_ip': wifi_ip,
-          })
-
-        except (device_errors.CommandFailedError,
-                device_errors.DeviceUnreachableError):
-          logger.exception('Failure while getting device status for %s.',
-                           str(device))
-          if denylist:
-            denylist.Extend([serial], reason='status_check_failure')
-
-        except device_errors.CommandTimeoutError:
-          logger.exception('Timeout while getting device status for %s.',
-                           str(device))
-          if denylist:
-            denylist.Extend([serial], reason='status_check_timeout')
-
-      elif denylist:
-        denylist.Extend([serial],
-                        reason=adb_status if usb_status else 'offline')
-
-    device_status['denylisted'] = IsDenylisted(serial, denylist)
-
-    return device_status
-
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  statuses = parallel_devices.pMap(denylisting_device_status).pGet(None)
-  return statuses
-
-
-def _LogStatuses(statuses):
-  # Log the state of all devices.
-  for status in statuses:
-    logger.info(status['serial'])
-    adb_status = status.get('adb_status')
-    denylisted = status.get('denylisted')
-    logger.info('  USB status: %s',
-                'online' if status.get('usb_status') else 'offline')
-    logger.info('  ADB status: %s', adb_status)
-    logger.info('  Denylisted: %s', str(denylisted))
-    if adb_status == 'device' and not denylisted:
-      logger.info('  Device type: %s', status.get('ro.build.product'))
-      logger.info('  OS build: %s', status.get('ro.build.id'))
-      logger.info('  OS build fingerprint: %s',
-                  status.get('ro.build.fingerprint'))
-      logger.info('  Battery state:')
-      for k, v in status.get('battery', {}).iteritems():
-        logger.info('    %s: %s', k, v)
-      logger.info('  IMEI slice: %s', status.get('imei_slice'))
-      logger.info('  WiFi IP: %s', status.get('wifi_ip'))
-
-
-def _WriteBuildbotFile(file_path, statuses):
-  buildbot_path, _ = os.path.split(file_path)
-  if os.path.exists(buildbot_path):
-    with open(file_path, 'w') as f:
-      for status in statuses:
-        try:
-          if status['adb_status'] == 'device':
-            f.write(
-                '{serial} {adb_status} {build_product} {build_id} '
-                '{temperature:.1f}C {level}%\n'.format(
-                    serial=status['serial'],
-                    adb_status=status['adb_status'],
-                    build_product=status['type'],
-                    build_id=status['build'],
-                    temperature=float(status['battery']['temperature']) / 10,
-                    level=status['battery']['level']))
-          elif status.get('usb_status', False):
-            f.write('{serial} {adb_status}\n'.format(
-                serial=status['serial'], adb_status=status['adb_status']))
-          else:
-            f.write('{serial} offline\n'.format(serial=status['serial']))
-        except Exception:  # pylint: disable=broad-except
-          pass
-
-
-def GetExpectedDevices(known_devices_files):
-  expected_devices = set()
-  try:
-    for path in known_devices_files:
-      if os.path.exists(path):
-        expected_devices.update(device_list.GetPersistentDeviceList(path))
-      else:
-        logger.warning('Could not find known devices file: %s', path)
-  except IOError:
-    logger.warning('Problem reading %s, skipping.', path)
-
-  logger.info('Expected devices:')
-  for device in expected_devices:
-    logger.info('  %s', device)
-  return expected_devices
-
-
-def AddArguments(parser):
-  parser.add_argument(
-      '--json-output', help='Output JSON information into a specified file.')
-  parser.add_argument('--denylist-file', help='Device denylist JSON file.')
-  parser.add_argument(
-      '--known-devices-file',
-      action='append',
-      default=[],
-      dest='known_devices_files',
-      help='Path to known device lists.')
-  parser.add_argument(
-      '--buildbot-path',
-      '-b',
-      default='/home/chrome-bot/.adb_device_info',
-      help='Absolute path to buildbot file location')
-  parser.add_argument(
-      '-w',
-      '--overwrite-known-devices-files',
-      action='store_true',
-      help='If set, overwrites known devices files wiht new '
-      'values.')
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddEnvironmentArguments(parser)
-  AddArguments(parser)
-  args = parser.parse_args()
-
-  logging_common.InitializeLogging(args)
-  script_common.InitializeEnvironment(args)
-
-  denylist = (device_denylist.Denylist(args.denylist_file)
-              if args.denylist_file else None)
-
-  expected_devices = GetExpectedDevices(args.known_devices_files)
-  usb_devices = set(lsusb.get_android_devices())
-  devices = [
-      device_utils.DeviceUtils(s) for s in expected_devices.union(usb_devices)
-  ]
-
-  statuses = DeviceStatus(devices, denylist)
-
-  # Log the state of all devices.
-  _LogStatuses(statuses)
-
-  # Update the last devices file(s).
-  if args.overwrite_known_devices_files:
-    for path in args.known_devices_files:
-      device_list.WritePersistentDeviceList(
-          path, [status['serial'] for status in statuses])
-
-  # Write device info to file for buildbot info display.
-  _WriteBuildbotFile(args.buildbot_path, statuses)
-
-  # Dump the device statuses to JSON.
-  if args.json_output:
-    with open(args.json_output, 'wb') as f:
-      f.write(
-          json.dumps(
-              statuses, indent=4, sort_keys=True, separators=(',', ': ')))
-
-  live_devices = [
-      status['serial'] for status in statuses
-      if (status['adb_status'] == 'device'
-          and not IsDenylisted(status['serial'], denylist))
-  ]
-
-  # If all devices failed, or if there are no devices, it's an infra error.
-  if not live_devices:
-    logger.error('No available devices.')
-  return 0 if live_devices else exit_codes.INFRA
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/flash_device.py b/systrace/catapult/devil/devil/android/tools/flash_device.py
deleted file mode 100755
index cb06a12..0000000
--- a/systrace/catapult/devil/devil/android/tools/flash_device.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import logging
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_denylist
-from devil.android import device_errors
-from devil.android import fastboot_utils
-from devil.android.sdk import fastboot
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import logging_common
-from devil.utils import parallelizer
-
-logger = logging.getLogger(__name__)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('build_path', help='Path to android build.')
-  parser.add_argument(
-      '-w', '--wipe', action='store_true', help='If set, wipes user data')
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddDeviceArguments(parser)
-  args = parser.parse_args()
-  logging_common.InitializeLogging(args)
-
-  if args.denylist_file:
-    denylist = device_denylist.Denylist(args.denylist_file).Read()
-    if denylist:
-      logger.critical('Device(s) in denylist, not flashing devices:')
-      for key in denylist:
-        logger.critical('  %s', key)
-      return exit_codes.INFRA
-
-  flashed_devices = []
-  failed_devices = []
-
-  def flash(device):
-    try:
-      device.FlashDevice(args.build_path, wipe=args.wipe)
-      flashed_devices.append(device)
-    except Exception:  # pylint: disable=broad-except
-      logger.exception('Device %s failed to flash.', str(device))
-      failed_devices.append(device)
-
-  devices = []
-  try:
-    adb_devices = script_common.GetDevices(args.devices, args.denylist_file)
-    devices += [fastboot_utils.FastbootUtils(device=d) for d in adb_devices]
-  except device_errors.NoDevicesError:
-    # Don't bail out if we're not looking for any particular device and there's
-    # at least one sitting in fastboot mode. Note that if we ARE looking for a
-    # particular device, and it's in fastboot mode, this will still fail.
-    fastboot_devices = fastboot.Fastboot.Devices()
-    if args.devices or not fastboot_devices:
-      raise
-    devices += [
-        fastboot_utils.FastbootUtils(fastbooter=d) for d in fastboot_devices
-    ]
-
-  parallel_devices = parallelizer.SyncParallelizer(devices)
-  parallel_devices.pMap(flash)
-
-  if flashed_devices:
-    logger.info('The following devices were flashed:')
-    logger.info('  %s', ' '.join(str(d) for d in flashed_devices))
-  if failed_devices:
-    logger.critical('The following devices failed to flash:')
-    logger.critical('  %s', ' '.join(str(d) for d in failed_devices))
-    return exit_codes.INFRA
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/keyboard.py b/systrace/catapult/devil/devil/android/tools/keyboard.py
deleted file mode 100755
index e400bca..0000000
--- a/systrace/catapult/devil/devil/android/tools/keyboard.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Use your keyboard as your phone's keyboard. Experimental."""
-
-import argparse
-import copy
-import os
-import sys
-import termios
-import tty
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-from devil import base_error
-from devil.android.sdk import keyevent
-from devil.android.tools import script_common
-from devil.utils import logging_common
-
-_KEY_MAPPING = {
-    '\x08': keyevent.KEYCODE_DEL,
-    '\x0a': keyevent.KEYCODE_ENTER,
-    ' ': keyevent.KEYCODE_SPACE,
-    '.': keyevent.KEYCODE_PERIOD,
-    '0': keyevent.KEYCODE_0,
-    '1': keyevent.KEYCODE_1,
-    '2': keyevent.KEYCODE_2,
-    '3': keyevent.KEYCODE_3,
-    '4': keyevent.KEYCODE_4,
-    '5': keyevent.KEYCODE_5,
-    '6': keyevent.KEYCODE_6,
-    '7': keyevent.KEYCODE_7,
-    '8': keyevent.KEYCODE_8,
-    '9': keyevent.KEYCODE_9,
-    'a': keyevent.KEYCODE_A,
-    'b': keyevent.KEYCODE_B,
-    'c': keyevent.KEYCODE_C,
-    'd': keyevent.KEYCODE_D,
-    'e': keyevent.KEYCODE_E,
-    'f': keyevent.KEYCODE_F,
-    'g': keyevent.KEYCODE_G,
-    'h': keyevent.KEYCODE_H,
-    'i': keyevent.KEYCODE_I,
-    'j': keyevent.KEYCODE_J,
-    'k': keyevent.KEYCODE_K,
-    'l': keyevent.KEYCODE_L,
-    'm': keyevent.KEYCODE_M,
-    'n': keyevent.KEYCODE_N,
-    'o': keyevent.KEYCODE_O,
-    'p': keyevent.KEYCODE_P,
-    'q': keyevent.KEYCODE_Q,
-    'r': keyevent.KEYCODE_R,
-    's': keyevent.KEYCODE_S,
-    't': keyevent.KEYCODE_T,
-    'u': keyevent.KEYCODE_U,
-    'v': keyevent.KEYCODE_V,
-    'w': keyevent.KEYCODE_W,
-    'x': keyevent.KEYCODE_X,
-    'y': keyevent.KEYCODE_Y,
-    'z': keyevent.KEYCODE_Z,
-    '\x7f': keyevent.KEYCODE_DEL,
-}
-
-
-def Keyboard(device, stream_itr):
-  try:
-    for c in stream_itr:
-      k = _KEY_MAPPING.get(c)
-      if k:
-        device.SendKeyEvent(k)
-      else:
-        print
-        print '(No mapping for character 0x%x)' % ord(c)
-  except KeyboardInterrupt:
-    pass
-
-
-class MultipleDevicesError(base_error.BaseError):
-  def __init__(self, devices):
-    super(MultipleDevicesError, self).__init__(
-        'More than one device found: %s' % ', '.join(str(d) for d in devices))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser(
-      description="Use your keyboard as your phone's keyboard.")
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddDeviceArguments(parser)
-  args = parser.parse_args(raw_args)
-
-  logging_common.InitializeLogging(args)
-
-  devices = script_common.GetDevices(args.devices, None)
-  if len(devices) > 1:
-    raise MultipleDevicesError(devices)
-
-  def next_char():
-    while True:
-      yield sys.stdin.read(1)
-
-  try:
-    fd = sys.stdin.fileno()
-
-    # See man 3 termios for more info on what this is doing.
-    old_attrs = termios.tcgetattr(fd)
-    new_attrs = copy.deepcopy(old_attrs)
-    new_attrs[tty.LFLAG] = new_attrs[tty.LFLAG] & ~(termios.ICANON)
-    new_attrs[tty.CC][tty.VMIN] = 1
-    new_attrs[tty.CC][tty.VTIME] = 0
-    termios.tcsetattr(fd, termios.TCSAFLUSH, new_attrs)
-
-    Keyboard(devices[0], next_char())
-  finally:
-    termios.tcsetattr(fd, termios.TCSAFLUSH, old_attrs)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/tools/provision_devices.py b/systrace/catapult/devil/devil/android/tools/provision_devices.py
deleted file mode 100755
index 9a324c4..0000000
--- a/systrace/catapult/devil/devil/android/tools/provision_devices.py
+++ /dev/null
@@ -1,699 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Provisions Android devices with settings required for bots.
-
-Usage:
-  ./provision_devices.py [-d <device serial number>]
-"""
-
-import argparse
-import datetime
-import json
-import logging
-import os
-import posixpath
-import re
-import sys
-import time
-
-# Import _strptime before threaded code. datetime.datetime.strptime is
-# threadsafe except for the initial import of the _strptime module.
-# See crbug.com/584730 and https://bugs.python.org/issue7980.
-import _strptime  # pylint: disable=unused-import
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil.android import battery_utils
-from devil.android import device_denylist
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android import device_utils
-from devil.android import settings
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import shared_prefs
-from devil.android.sdk import version_codes
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import logging_common
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_SYSTEM_APP_DIRECTORIES = ['/system/app/', '/system/priv-app/']
-_SYSTEM_WEBVIEW_NAMES = ['webview', 'WebViewGoogle']
-_CHROME_PACKAGE_REGEX = re.compile('.*chrom.*')
-_TOMBSTONE_REGEX = re.compile('tombstone.*')
-_STANDALONE_VR_DEVICES = [
-    'vega',  # Lenovo Mirage Solo
-]
-
-
-class _DEFAULT_TIMEOUTS(object):
-  # L can take a while to reboot after a wipe.
-  LOLLIPOP = 600
-  PRE_LOLLIPOP = 180
-
-  HELP_TEXT = '{}s on L, {}s on pre-L'.format(LOLLIPOP, PRE_LOLLIPOP)
-
-
-class ProvisionStep(object):
-  def __init__(self, cmd, reboot=False):
-    self.cmd = cmd
-    self.reboot = reboot
-
-
-def ProvisionDevices(devices,
-                     denylist_file,
-                     adb_key_files=None,
-                     disable_location=False,
-                     disable_mock_location=False,
-                     disable_network=False,
-                     disable_system_chrome=False,
-                     emulators=False,
-                     enable_java_debug=False,
-                     max_battery_temp=None,
-                     min_battery_level=None,
-                     output_device_denylist=None,
-                     reboot_timeout=None,
-                     remove_system_webview=False,
-                     system_app_remove_list=None,
-                     system_package_remove_list=None,
-                     wipe=True):
-  denylist = (device_denylist.Denylist(denylist_file)
-              if denylist_file else None)
-  system_app_remove_list = system_app_remove_list or []
-  system_package_remove_list = system_package_remove_list or []
-  try:
-    devices = script_common.GetDevices(devices, denylist)
-  except device_errors.NoDevicesError:
-    logging.error('No available devices to provision.')
-    if denylist:
-      logging.error('Local device denylist: %s', denylist.Read())
-    raise
-  devices = [d for d in devices if not emulators or d.adb.is_emulator]
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-
-  steps = []
-  if wipe:
-    steps += [ProvisionStep(lambda d: Wipe(d, adb_key_files), reboot=True)]
-  steps += [
-      ProvisionStep(
-          lambda d: SetProperties(d, enable_java_debug, disable_location,
-                                  disable_mock_location),
-          reboot=not emulators)
-  ]
-
-  if disable_network:
-    steps.append(ProvisionStep(DisableNetwork))
-
-  if disable_system_chrome:
-    steps.append(ProvisionStep(DisableSystemChrome))
-
-  if max_battery_temp:
-    steps.append(
-        ProvisionStep(lambda d: WaitForBatteryTemperature(d, max_battery_temp)))
-
-  if min_battery_level:
-    steps.append(ProvisionStep(lambda d: WaitForCharge(d, min_battery_level)))
-
-  if remove_system_webview:
-    system_app_remove_list.extend(_SYSTEM_WEBVIEW_NAMES)
-
-  if system_app_remove_list or system_package_remove_list:
-    steps.append(
-        ProvisionStep(lambda d: RemoveSystemApps(d, system_app_remove_list,
-                                                 system_package_remove_list)))
-
-  steps.append(ProvisionStep(SetDate))
-  steps.append(ProvisionStep(CheckExternalStorage))
-  steps.append(ProvisionStep(StandaloneVrDeviceSetup))
-
-  parallel_devices.pMap(ProvisionDevice, steps, denylist, reboot_timeout)
-
-  denylisted_devices = denylist.Read() if denylist else []
-  if output_device_denylist:
-    with open(output_device_denylist, 'w') as f:
-      json.dump(denylisted_devices, f)
-  if all(d in denylisted_devices for d in devices):
-    raise device_errors.NoDevicesError
-  return 0
-
-
-def ProvisionDevice(device, steps, denylist, reboot_timeout=None):
-  try:
-    if not reboot_timeout:
-      if device.build_version_sdk >= version_codes.LOLLIPOP:
-        reboot_timeout = _DEFAULT_TIMEOUTS.LOLLIPOP
-      else:
-        reboot_timeout = _DEFAULT_TIMEOUTS.PRE_LOLLIPOP
-
-    for step in steps:
-      try:
-        device.WaitUntilFullyBooted(timeout=reboot_timeout, retries=0)
-      except device_errors.CommandTimeoutError:
-        logger.error('Device did not finish booting. Will try to reboot.')
-        device.Reboot(timeout=reboot_timeout)
-      step.cmd(device)
-      if step.reboot:
-        device.Reboot(False, retries=0)
-        device.adb.WaitForDevice()
-
-  except device_errors.CommandTimeoutError:
-    logger.exception('Timed out waiting for device %s. Adding to denylist.',
-                     str(device))
-    if denylist:
-      denylist.Extend([str(device)], reason='provision_timeout')
-
-  except (device_errors.CommandFailedError,
-          device_errors.DeviceUnreachableError):
-    logger.exception('Failed to provision device %s. Adding to denylist.',
-                     str(device))
-    if denylist:
-      denylist.Extend([str(device)], reason='provision_failure')
-
-
-def Wipe(device, adb_key_files=None):
-  if (device.IsUserBuild()
-      or device.build_version_sdk >= version_codes.MARSHMALLOW):
-    WipeChromeData(device)
-
-    package = 'com.google.android.gms'
-    version_name = device.GetApplicationVersion(package)
-    if version_name:
-      logger.info('Version name for %s is %s', package, version_name)
-    else:
-      logger.info('Package %s is not installed', package)
-  else:
-    WipeDevice(device, adb_key_files)
-
-
-def WipeChromeData(device):
-  """Wipes chrome specific data from device
-
-  (1) uninstall any app whose name matches *chrom*, except
-      com.android.chrome, which is the chrome stable package. Doing so also
-      removes the corresponding dirs under /data/data/ and /data/app/
-  (2) remove any dir under /data/app-lib/ whose name matches *chrom*
-  (3) remove any files under /data/tombstones/ whose name matches "tombstone*"
-  (4) remove /data/local.prop if there is any
-  (5) remove /data/local/chrome-command-line if there is any
-  (6) remove anything under /data/local/.config/ if the dir exists
-      (this is telemetry related)
-  (7) remove anything under /data/local/tmp/
-
-  Arguments:
-    device: the device to wipe
-  """
-  try:
-    if device.IsUserBuild():
-      _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX)
-      device.RunShellCommand(
-          'rm -rf %s/*' % device.GetExternalStoragePath(),
-          shell=True,
-          check_return=True)
-      device.RunShellCommand(
-          'rm -rf /data/local/tmp/*', shell=True, check_return=True)
-    else:
-      device.EnableRoot()
-      _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX)
-      _WipeUnderDirIfMatch(device, '/data/app-lib/', _CHROME_PACKAGE_REGEX)
-      _WipeUnderDirIfMatch(device, '/data/tombstones/', _TOMBSTONE_REGEX)
-
-      _WipeFileOrDir(device, '/data/local.prop')
-      _WipeFileOrDir(device, '/data/local/chrome-command-line')
-      _WipeFileOrDir(device, '/data/local/.config/')
-      _WipeFileOrDir(device, '/data/local/tmp/')
-      device.RunShellCommand(
-          'rm -rf %s/*' % device.GetExternalStoragePath(),
-          shell=True,
-          check_return=True)
-  except device_errors.CommandFailedError:
-    logger.exception('Possible failure while wiping the device. '
-                     'Attempting to continue.')
-
-
-def _UninstallIfMatch(device, pattern):
-  installed_packages = device.RunShellCommand(['pm', 'list', 'packages'],
-                                              check_return=True)
-  installed_system_packages = [
-      pkg.split(':')[1]
-      for pkg in device.RunShellCommand(['pm', 'list', 'packages', '-s'],
-                                        check_return=True)
-  ]
-  for package_output in installed_packages:
-    package = package_output.split(":")[1]
-    if pattern.match(package) and package not in installed_system_packages:
-      device.Uninstall(package)
-
-
-def _WipeUnderDirIfMatch(device, path, pattern):
-  for filename in device.ListDirectory(path):
-    if pattern.match(filename):
-      _WipeFileOrDir(device, posixpath.join(path, filename))
-
-
-def _WipeFileOrDir(device, path):
-  if device.PathExists(path):
-    device.RunShellCommand(['rm', '-rf', path], check_return=True)
-
-
-def WipeDevice(device, adb_key_files):
-  """Wipes data from device, keeping only the adb_keys for authorization.
-
-  After wiping data on a device that has been authorized, adb can still
-  communicate with the device, but after reboot the device will need to be
-  re-authorized because the adb keys file is stored in /data/misc/adb/.
-  Thus, adb_keys file is rewritten so the device does not need to be
-  re-authorized.
-
-  Arguments:
-    device: the device to wipe
-  """
-  try:
-    device.EnableRoot()
-    device_authorized = device.FileExists(adb_wrapper.ADB_KEYS_FILE)
-    if device_authorized:
-      adb_keys = device.ReadFile(
-          adb_wrapper.ADB_KEYS_FILE, as_root=True).splitlines()
-    device.RunShellCommand(['wipe', 'data'], as_root=True, check_return=True)
-    device.adb.WaitForDevice()
-
-    if device_authorized:
-      adb_keys_set = set(adb_keys)
-      for adb_key_file in adb_key_files or []:
-        try:
-          with open(adb_key_file, 'r') as f:
-            adb_public_keys = f.readlines()
-          adb_keys_set.update(adb_public_keys)
-        except IOError:
-          logger.warning('Unable to find adb keys file %s.', adb_key_file)
-      _WriteAdbKeysFile(device, '\n'.join(adb_keys_set))
-  except device_errors.CommandFailedError:
-    logger.exception('Possible failure while wiping the device. '
-                     'Attempting to continue.')
-
-
-def _WriteAdbKeysFile(device, adb_keys_string):
-  dir_path = posixpath.dirname(adb_wrapper.ADB_KEYS_FILE)
-  device.RunShellCommand(['mkdir', '-p', dir_path],
-                         as_root=True,
-                         check_return=True)
-  device.RunShellCommand(['restorecon', dir_path],
-                         as_root=True,
-                         check_return=True)
-  device.WriteFile(adb_wrapper.ADB_KEYS_FILE, adb_keys_string, as_root=True)
-  device.RunShellCommand(['restorecon', adb_wrapper.ADB_KEYS_FILE],
-                         as_root=True,
-                         check_return=True)
-
-
-def SetProperties(device, enable_java_debug, disable_location,
-                  disable_mock_location):
-  try:
-    device.EnableRoot()
-  except device_errors.CommandFailedError as e:
-    logger.warning(str(e))
-
-  if not device.IsUserBuild():
-    _ConfigureLocalProperties(device, enable_java_debug)
-  else:
-    logger.warning('Cannot configure properties in user builds.')
-  settings.ConfigureContentSettings(device,
-                                    settings.DETERMINISTIC_DEVICE_SETTINGS)
-  if disable_location:
-    settings.ConfigureContentSettings(device,
-                                      settings.DISABLE_LOCATION_SETTINGS)
-  else:
-    settings.ConfigureContentSettings(device, settings.ENABLE_LOCATION_SETTINGS)
-
-  if disable_mock_location:
-    settings.ConfigureContentSettings(device,
-                                      settings.DISABLE_MOCK_LOCATION_SETTINGS)
-  else:
-    settings.ConfigureContentSettings(device,
-                                      settings.ENABLE_MOCK_LOCATION_SETTINGS)
-
-  settings.SetLockScreenSettings(device)
-
-  # Some device types can momentarily disappear after setting properties.
-  device.adb.WaitForDevice()
-
-
-def DisableNetwork(device):
-  settings.ConfigureContentSettings(device, settings.NETWORK_DISABLED_SETTINGS)
-  if device.build_version_sdk >= version_codes.MARSHMALLOW:
-    # Ensure that NFC is also switched off.
-    device.RunShellCommand(['svc', 'nfc', 'disable'],
-                           as_root=True,
-                           check_return=True)
-
-
-def DisableSystemChrome(device):
-  # The system chrome version on the device interferes with some tests.
-  device.RunShellCommand(['pm', 'disable', 'com.android.chrome'],
-                         as_root=True,
-                         check_return=True)
-
-
-def _FindSystemPackagePaths(device, system_package_list):
-  found_paths = []
-  for system_package in system_package_list:
-    found_paths.extend(device.GetApplicationPaths(system_package))
-  return [p for p in found_paths if p.startswith('/system/')]
-
-
-def _FindSystemAppPaths(device, system_app_list):
-  found_paths = []
-  for system_app in system_app_list:
-    for directory in _SYSTEM_APP_DIRECTORIES:
-      path = os.path.join(directory, system_app)
-      if device.PathExists(path):
-        found_paths.append(path)
-  return found_paths
-
-
-def RemoveSystemApps(device, system_app_remove_list,
-                     system_package_remove_list):
-  """Attempts to remove the provided system apps from the given device.
-
-  Arguments:
-    device: The device to remove the system apps from.
-    system_app_remove_list: A list of app names to remove, e.g.
-        ['WebViewGoogle', 'GoogleVrCore']
-    system_package_remove_list: A list of app packages to remove, e.g.
-        ['com.google.android.webview']
-  """
-  device.EnableRoot()
-  if device.HasRoot():
-    system_app_paths = (
-        _FindSystemAppPaths(device, system_app_remove_list) +
-        _FindSystemPackagePaths(device, system_package_remove_list))
-    if system_app_paths:
-      # Disable Marshmallow's Verity security feature
-      if device.build_version_sdk >= version_codes.MARSHMALLOW:
-        logger.info('Disabling Verity on %s', device.serial)
-        device.adb.DisableVerity()
-        device.Reboot()
-        device.WaitUntilFullyBooted()
-        device.EnableRoot()
-
-      device.adb.Remount()
-      device.RunShellCommand(['stop'], check_return=True)
-      device.RemovePath(system_app_paths, force=True, recursive=True)
-      device.RunShellCommand(['start'], check_return=True)
-  else:
-    raise device_errors.CommandFailedError(
-        'Failed to remove system apps from non-rooted device', str(device))
-
-
-def _ConfigureLocalProperties(device, java_debug=True):
-  """Set standard readonly testing device properties prior to reboot."""
-  local_props = [
-      'persist.sys.usb.config=adb',
-      'ro.monkey=1',
-      'ro.test_harness=1',
-      'ro.audio.silent=1',
-      'ro.setupwizard.mode=DISABLED',
-  ]
-  if java_debug:
-    local_props.append('%s=all' % device_utils.DeviceUtils.JAVA_ASSERT_PROPERTY)
-    local_props.append('debug.checkjni=1')
-  try:
-    device.WriteFile(
-        device.LOCAL_PROPERTIES_PATH, '\n'.join(local_props), as_root=True)
-    # Android will not respect the local props file if it is world writable.
-    device.RunShellCommand(['chmod', '644', device.LOCAL_PROPERTIES_PATH],
-                           as_root=True,
-                           check_return=True)
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to configure local properties.')
-
-
-def FinishProvisioning(device):
-  # The lockscreen can't be disabled on user builds, so send a keyevent
-  # to unlock it.
-  if device.IsUserBuild():
-    device.SendKeyEvent(keyevent.KEYCODE_MENU)
-
-
-def WaitForCharge(device, min_battery_level):
-  battery = battery_utils.BatteryUtils(device)
-  try:
-    battery.ChargeDeviceToLevel(min_battery_level)
-  except device_errors.DeviceChargingError:
-    device.Reboot()
-    battery.ChargeDeviceToLevel(min_battery_level)
-
-
-def WaitForBatteryTemperature(device, max_battery_temp):
-  try:
-    battery = battery_utils.BatteryUtils(device)
-    battery.LetBatteryCoolToTemperature(max_battery_temp)
-  except device_errors.CommandFailedError:
-    logger.exception('Unable to let battery cool to specified temperature.')
-
-
-def SetDate(device):
-  def _set_and_verify_date():
-    if device.build_version_sdk >= version_codes.MARSHMALLOW:
-      date_format = '%m%d%H%M%Y.%S'
-      set_date_command = ['date', '-u']
-      get_date_command = ['date', '-u']
-    else:
-      date_format = '%Y%m%d.%H%M%S'
-      set_date_command = ['date', '-s']
-      get_date_command = ['date']
-
-    # TODO(jbudorick): This is wrong on pre-M devices -- get/set are
-    # dealing in local time, but we're setting based on GMT.
-    strgmtime = time.strftime(date_format, time.gmtime())
-    set_date_command.append(strgmtime)
-    device.RunShellCommand(set_date_command, as_root=True, check_return=True)
-
-    get_date_command.append('+"%Y%m%d.%H%M%S"')
-    device_time = device.RunShellCommand(
-        get_date_command, check_return=True, as_root=True,
-        single_line=True).replace('"', '')
-    device_time = datetime.datetime.strptime(device_time, "%Y%m%d.%H%M%S")
-    correct_time = datetime.datetime.strptime(strgmtime, date_format)
-    tdelta = (correct_time - device_time).seconds
-    if tdelta <= 1:
-      logger.info('Date/time successfully set on %s', device)
-      return True
-    else:
-      logger.error('Date mismatch. Device: %s Correct: %s',
-                   device_time.isoformat(), correct_time.isoformat())
-      return False
-
-  # Sometimes the date is not set correctly on the devices. Retry on failure.
-  if device.IsUserBuild():
-    # TODO(bpastene): Figure out how to set the date & time on user builds.
-    pass
-  else:
-    if not timeout_retry.WaitFor(
-        _set_and_verify_date, wait_period=1, max_tries=2):
-      raise device_errors.CommandFailedError(
-          'Failed to set date & time.', device_serial=str(device))
-    device.EnableRoot()
-    # The following intent can take a bit to complete when ran shortly after
-    # device boot-up.
-    device.BroadcastIntent(
-        intent.Intent(action='android.intent.action.TIME_SET'), timeout=180)
-
-
-def LogDeviceProperties(device):
-  props = device.RunShellCommand(['getprop'], check_return=True)
-  for prop in props:
-    logger.info('  %s', prop)
-
-
-# TODO(jbudorick): Relocate this either to device_utils or a separate
-# and more intentionally reusable layer on top of device_utils.
-def CheckExternalStorage(device):
-  """Checks that storage is writable and if not makes it writable.
-
-  Arguments:
-    device: The device to check.
-  """
-  try:
-    with device_temp_file.DeviceTempFile(
-        device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
-      device.WriteFile(f.name, 'test')
-  except device_errors.CommandFailedError:
-    logger.info('External storage not writable. Remounting / as RW')
-    device.RunShellCommand(['mount', '-o', 'remount,rw', '/'],
-                           check_return=True,
-                           as_root=True)
-    device.EnableRoot()
-    with device_temp_file.DeviceTempFile(
-        device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
-      device.WriteFile(f.name, 'test')
-
-
-def StandaloneVrDeviceSetup(device):
-  """Performs any additional setup necessary for standalone Android VR devices.
-
-  Arguments:
-    device: The device to check.
-  """
-  if device.product_name not in _STANDALONE_VR_DEVICES:
-    return
-
-  # Modify VrCore's settings so that any first time setup, etc. is skipped.
-  shared_pref = shared_prefs.SharedPrefs(
-      device,
-      'com.google.vr.vrcore',
-      'VrCoreSettings.xml',
-      use_encrypted_path=True)
-  shared_pref.Load()
-  # Skip first time setup.
-  shared_pref.SetBoolean('DaydreamSetupComplete', True)
-  # Disable the automatic prompt that shows anytime the device detects that a
-  # controller isn't connected.
-  shared_pref.SetBoolean('gConfigFlags:controller_recovery_enabled', False)
-  # Use an automated controller instead of a real one so we get past the
-  # controller pairing screen that's shown on startup.
-  shared_pref.SetBoolean('UseAutomatedController', True)
-  shared_pref.Commit()
-
-
-def main(raw_args):
-  # Recommended options on perf bots:
-  # --disable-network
-  #     TODO(tonyg): We eventually want network on. However, currently radios
-  #     can cause perfbots to drain faster than they charge.
-  # --min-battery-level 95
-  #     Some perf bots run benchmarks with USB charging disabled which leads
-  #     to gradual draining of the battery. We must wait for a full charge
-  #     before starting a run in order to keep the devices online.
-
-  parser = argparse.ArgumentParser(
-      description='Provision Android devices with settings required for bots.')
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddDeviceArguments(parser)
-  script_common.AddEnvironmentArguments(parser)
-  parser.add_argument(
-      '--adb-key-files',
-      type=str,
-      nargs='+',
-      help='list of adb keys to push to device')
-  parser.add_argument(
-      '--disable-location',
-      action='store_true',
-      help='disable Google location services on devices')
-  parser.add_argument(
-      '--disable-mock-location',
-      action='store_true',
-      default=False,
-      help='Set ALLOW_MOCK_LOCATION to false')
-  parser.add_argument(
-      '--disable-network',
-      action='store_true',
-      help='disable network access on devices')
-  parser.add_argument(
-      '--disable-java-debug',
-      action='store_false',
-      dest='enable_java_debug',
-      default=True,
-      help='disable Java property asserts and JNI checking')
-  parser.add_argument(
-      '--disable-system-chrome',
-      action='store_true',
-      help='DEPRECATED: use --remove-system-packages com.android.google '
-      'Disable the system chrome from devices.')
-  parser.add_argument(
-      '--emulators',
-      action='store_true',
-      help='provision only emulators and ignore usb devices '
-      '(this will not wipe emulators)')
-  parser.add_argument(
-      '--max-battery-temp',
-      type=int,
-      metavar='NUM',
-      help='Wait for the battery to have this temp or lower.')
-  parser.add_argument(
-      '--min-battery-level',
-      type=int,
-      metavar='NUM',
-      help='wait for the device to reach this minimum battery'
-      ' level before trying to continue')
-  parser.add_argument('--output-device-denylist',
-                      help='Json file to output the device denylist.')
-  parser.add_argument(
-      '--reboot-timeout',
-      metavar='SECS',
-      type=int,
-      help='when wiping the device, max number of seconds to'
-      ' wait after each reboot '
-      '(default: %s)' % _DEFAULT_TIMEOUTS.HELP_TEXT)
-  parser.add_argument(
-      '--remove-system-apps',
-      nargs='*',
-      dest='system_app_remove_list',
-      help='DEPRECATED: use --remove-system-packages instead. '
-      'The names of system apps to remove. ')
-  parser.add_argument(
-      '--remove-system-packages',
-      nargs='*',
-      dest='system_package_remove_list',
-      help='The names of system packages to remove.')
-  parser.add_argument(
-      '--remove-system-webview',
-      action='store_true',
-      help='DEPRECATED: use --remove-system-packages '
-      'com.google.android.webview com.android.webview '
-      'Remove the system webview from devices.')
-  parser.add_argument(
-      '--skip-wipe',
-      action='store_true',
-      default=False,
-      help='do not wipe device data during provisioning')
-
-  # No-op arguments for compatibility with build/android/provision_devices.py.
-  # TODO(jbudorick): Remove these once all callers have stopped using them.
-  parser.add_argument(
-      '--chrome-specific-wipe', action='store_true', help=argparse.SUPPRESS)
-  parser.add_argument('--phase', action='append', help=argparse.SUPPRESS)
-  parser.add_argument(
-      '-r', '--auto-reconnect', action='store_true', help=argparse.SUPPRESS)
-  parser.add_argument('-t', '--target', help=argparse.SUPPRESS)
-
-  args = parser.parse_args(raw_args)
-
-  logging_common.InitializeLogging(args)
-  script_common.InitializeEnvironment(args)
-
-  try:
-    return ProvisionDevices(
-        args.devices,
-        args.denylist_file,
-        adb_key_files=args.adb_key_files,
-        disable_location=args.disable_location,
-        disable_mock_location=args.disable_mock_location,
-        disable_network=args.disable_network,
-        disable_system_chrome=args.disable_system_chrome,
-        emulators=args.emulators,
-        enable_java_debug=args.enable_java_debug,
-        max_battery_temp=args.max_battery_temp,
-        min_battery_level=args.min_battery_level,
-        output_device_denylist=args.output_device_denylist,
-        reboot_timeout=args.reboot_timeout,
-        remove_system_webview=args.remove_system_webview,
-        system_app_remove_list=args.system_app_remove_list,
-        system_package_remove_list=args.system_package_remove_list,
-        wipe=not args.skip_wipe and not args.emulators)
-  except (device_errors.DeviceUnreachableError, device_errors.NoDevicesError):
-    logging.exception('Unable to provision local devices.')
-    return exit_codes.INFRA
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/tools/screenshot.py b/systrace/catapult/devil/devil/android/tools/screenshot.py
deleted file mode 100755
index fe6be04..0000000
--- a/systrace/catapult/devil/devil/android/tools/screenshot.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Takes a screenshot from an Android device."""
-
-import argparse
-import logging
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_utils
-from devil.android.tools import script_common
-from devil.utils import logging_common
-
-logger = logging.getLogger(__name__)
-
-
-def main():
-  # Parse options.
-  parser = argparse.ArgumentParser(description=__doc__)
-  logging_common.AddLoggingArguments(parser)
-  script_common.AddDeviceArguments(parser)
-  parser.add_argument(
-      '-f',
-      '--file',
-      metavar='FILE',
-      help='Save result to file instead of generating a '
-      'timestamped file name.')
-  parser.add_argument(
-      'host_file',
-      nargs='?',
-      help='File to which the screenshot will be saved.')
-
-  args = parser.parse_args()
-  host_file = args.host_file or args.file
-  logging_common.InitializeLogging(args)
-
-  devices = script_common.GetDevices(args.devices, args.denylist_file)
-
-  def screenshot(device):
-    f = None
-    if host_file:
-      root, ext = os.path.splitext(host_file)
-      f = '%s_%s%s' % (root, str(device), ext)
-    f = device.TakeScreenshot(f)
-    print 'Screenshot for device %s written to %s' % (str(device),
-                                                      os.path.abspath(f))
-
-  device_utils.DeviceUtils.parallel(devices).pMap(screenshot)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/script_common.py b/systrace/catapult/devil/devil/android/tools/script_common.py
deleted file mode 100644
index de82366..0000000
--- a/systrace/catapult/devil/devil/android/tools/script_common.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-from devil import devil_env
-from devil.android import device_denylist
-from devil.android import device_errors
-from devil.android import device_utils
-
-
-def AddEnvironmentArguments(parser):
-  """Adds environment-specific arguments to the provided parser.
-
-  After adding these arguments, you must pass the user-specified values when
-  initializing devil. See the InitializeEnvironment() to determine how to do so.
-
-  Args:
-    parser: an instance of argparse.ArgumentParser
-  """
-  parser.add_argument(
-      '--adb-path', type=os.path.realpath, help='Path to the adb binary')
-
-
-def InitializeEnvironment(args):
-  """Initializes devil based on the args added by AddEnvironmentArguments().
-
-  This initializes devil, and configures it to use the adb binary specified by
-  the '--adb-path' flag (if provided by the user, otherwise this defaults to
-  devil's copy of adb). Although this is one possible way to initialize devil,
-  you should check if your project has prefered ways to initialize devil (ex.
-  the chromium project uses devil_chromium.Initialize() to have different
-  defaults for dependencies).
-
-  This method requires having previously called AddEnvironmentArguments() on the
-  relevant argparse.ArgumentParser.
-
-  Note: you should only initialize devil once, and subsequent calls to any
-  method wrapping devil_env.config.Initialize() will have no effect.
-
-  Args:
-    args: the parsed args returned by an argparse.ArgumentParser
-  """
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem('adb', devil_env.GetPlatform(),
-                                  args.adb_path))
-
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-
-def AddDeviceArguments(parser):
-  """Adds device and denylist arguments to the provided parser.
-
-  Args:
-    parser: an instance of argparse.ArgumentParser
-  """
-  parser.add_argument(
-      '-d',
-      '--device',
-      dest='devices',
-      action='append',
-      default=[],
-      help='Serial number of the Android device to use. (default: use all)')
-
-  parser.add_argument('--denylist-file',
-                      help='Device denylist JSON file.')
-
-
-def GetDevices(requested_devices, denylist_file):
-  """Gets a list of healthy devices matching the given parameters."""
-  if not isinstance(denylist_file, device_denylist.Denylist):
-    denylist_file = (device_denylist.Denylist(denylist_file)
-                     if denylist_file else None)
-
-  devices = device_utils.DeviceUtils.HealthyDevices(denylist_file)
-  if not devices:
-    raise device_errors.NoDevicesError()
-  elif requested_devices:
-    requested = set(requested_devices)
-    available = set(str(d) for d in devices)
-    missing = requested.difference(available)
-    if missing:
-      raise device_errors.DeviceUnreachableError(next(iter(missing)))
-    return sorted(
-        device_utils.DeviceUtils(d) for d in available.intersection(requested))
-  else:
-    return devices
diff --git a/systrace/catapult/devil/devil/android/tools/script_common_test.py b/systrace/catapult/devil/devil/android/tools/script_common_test.py
deleted file mode 100755
index f8269cc..0000000
--- a/systrace/catapult/devil/devil/android/tools/script_common_test.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import sys
-import tempfile
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import script_common
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  # pylint: disable=wrong-import-order
-  from dependency_manager import exceptions
-
-
-class GetDevicesTest(unittest.TestCase):
-  def testNoSpecs(self):
-    devices = [
-        device_utils.DeviceUtils('123'),
-        device_utils.DeviceUtils('456'),
-    ]
-    with mock.patch(
-        'devil.android.device_utils.DeviceUtils.HealthyDevices',
-        return_value=devices):
-      self.assertEquals(devices, script_common.GetDevices(None, None))
-
-  def testWithDevices(self):
-    devices = [
-        device_utils.DeviceUtils('123'),
-        device_utils.DeviceUtils('456'),
-    ]
-    with mock.patch(
-        'devil.android.device_utils.DeviceUtils.HealthyDevices',
-        return_value=devices):
-      self.assertEquals([device_utils.DeviceUtils('456')],
-                        script_common.GetDevices(['456'], None))
-
-  def testMissingDevice(self):
-    with mock.patch(
-        'devil.android.device_utils.DeviceUtils.HealthyDevices',
-        return_value=[device_utils.DeviceUtils('123')]):
-      with self.assertRaises(device_errors.DeviceUnreachableError):
-        script_common.GetDevices(['456'], None)
-
-  def testNoDevices(self):
-    with mock.patch(
-        'devil.android.device_utils.DeviceUtils.HealthyDevices',
-        return_value=[]):
-      with self.assertRaises(device_errors.NoDevicesError):
-        script_common.GetDevices(None, None)
-
-
-class InitializeEnvironmentTest(unittest.TestCase):
-  def setUp(self):
-    # pylint: disable=protected-access
-    self.parser = argparse.ArgumentParser()
-    script_common.AddEnvironmentArguments(self.parser)
-    devil_env.config = devil_env._Environment()
-
-  def testNoAdb(self):
-    args = self.parser.parse_args([])
-    script_common.InitializeEnvironment(args)
-    with self.assertRaises(exceptions.NoPathFoundError):
-      devil_env.config.LocalPath('adb')
-
-  def testAdb(self):
-    with tempfile.NamedTemporaryFile() as f:
-      args = self.parser.parse_args(['--adb-path=%s' % f.name])
-      script_common.InitializeEnvironment(args)
-      self.assertEquals(f.name, devil_env.config.LocalPath('adb'))
-
-  def testNonExistentAdb(self):
-    with tempfile.NamedTemporaryFile() as f:
-      args = self.parser.parse_args(['--adb-path=%s' % f.name])
-    script_common.InitializeEnvironment(args)
-    with self.assertRaises(exceptions.NoPathFoundError):
-      devil_env.config.LocalPath('adb')
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/systrace/catapult/devil/devil/android/tools/system_app.py b/systrace/catapult/devil/devil/android/tools/system_app.py
deleted file mode 100755
index 50d8559..0000000
--- a/systrace/catapult/devil/devil/android/tools/system_app.py
+++ /dev/null
@@ -1,364 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A script to replace a system app while running a command."""
-
-import argparse
-import contextlib
-import logging
-import os
-import posixpath
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil.android import apk_helper
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android.sdk import version_codes
-from devil.android.sdk import adb_wrapper
-from devil.android.tools import script_common
-from devil.utils import cmd_helper
-from devil.utils import parallelizer
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-# Some system apps aren't actually installed in the /system/ directory, so
-# special case them here with the correct install location.
-SPECIAL_SYSTEM_APP_LOCATIONS = {
-    # Older versions of ArCore were installed in /data/app/ regardless of
-    # whether they were system apps or not. Newer versions install in /system/
-    # if they are system apps, and in /data/app/ if they aren't. Some newer
-    # devices/OSes install in /product/app/ for system apps, as well.
-    'com.google.ar.core': ['/data/app/', '/system/', '/product/app/'],
-    # On older versions of VrCore, the system app version is installed in
-    # /system/ like normal. However, at some point, this moved to /data/.
-    # So, we have to handle both cases. Like ArCore, this means we'll end up
-    # removing even non-system versions due to this, but it doesn't cause any
-    # issues.
-    'com.google.vr.core': ['/data/app/', '/system/'],
-}
-
-# Gets app path and package name pm list packages -f output.
-_PM_LIST_PACKAGE_PATH_RE = re.compile(r'^\s*package:(\S+)=(\S+)\s*$')
-
-
-def RemoveSystemApps(device, package_names):
-  """Removes the given system apps.
-
-  Args:
-    device: (device_utils.DeviceUtils) the device for which the given
-      system app should be removed.
-    package_name: (iterable of strs) the names of the packages to remove.
-  """
-  system_package_paths = _FindSystemPackagePaths(device, package_names)
-  if system_package_paths:
-    with EnableSystemAppModification(device):
-      device.RemovePath(system_package_paths, force=True, recursive=True)
-
-
-@contextlib.contextmanager
-def ReplaceSystemApp(device,
-                     package_name,
-                     replacement_apk,
-                     install_timeout=None):
-  """A context manager that replaces the given system app while in scope.
-
-  Args:
-    device: (device_utils.DeviceUtils) the device for which the given
-      system app should be replaced.
-    package_name: (str) the name of the package to replace.
-    replacement_apk: (str) the path to the APK to use as a replacement.
-  """
-  storage_dir = device_temp_file.NamedDeviceTemporaryDirectory(device.adb)
-  relocate_app = _RelocateApp(device, package_name, storage_dir.name)
-  install_app = _TemporarilyInstallApp(device, replacement_apk, install_timeout)
-  with storage_dir, relocate_app, install_app:
-    yield
-
-
-def _FindSystemPackagePaths(device, system_package_list):
-  """Finds all system paths for the given packages."""
-  found_paths = []
-  for system_package in system_package_list:
-    paths = _GetApplicationPaths(device, system_package)
-    p = _GetSystemPath(system_package, paths)
-    if p:
-      found_paths.append(p)
-  return found_paths
-
-
-# Find all application paths, even those flagged as uninstalled, as these
-# would still block another package with the same name from installation
-# if they differ in signing keys.
-# TODO(aluo): Move this into device_utils.py
-def _GetApplicationPaths(device, package):
-  paths = []
-  lines = device.RunShellCommand(
-      ['pm', 'list', 'packages', '-f', '-u', package], check_return=True)
-  for line in lines:
-    match = re.match(_PM_LIST_PACKAGE_PATH_RE, line)
-    if match:
-      path = match.group(1)
-      package_name = match.group(2)
-      if package_name == package:
-        paths.append(path)
-  return paths
-
-
-def _GetSystemPath(package, paths):
-  for p in paths:
-    app_locations = SPECIAL_SYSTEM_APP_LOCATIONS.get(package,
-                                                     ['/system/', '/product/'])
-    for location in app_locations:
-      if p.startswith(location):
-        return p
-  return None
-
-
-_MODIFICATION_TIMEOUT = 300
-_MODIFICATION_RETRIES = 2
-_ENABLE_MODIFICATION_PROP = 'devil.modify_sys_apps'
-
-
-def _ShouldRetryModification(exc):
-  try:
-    if isinstance(exc, device_errors.CommandTimeoutError):
-      logger.info('Restarting the adb server')
-      adb_wrapper.RestartServer()
-    return True
-  except Exception: # pylint: disable=broad-except
-    logger.exception(('Caught an exception when deciding'
-                      ' to retry system modification'))
-    return False
-
-
-# timeout and retries are both required by the decorator, but neither
-# are used within the body of the function.
-# pylint: disable=unused-argument
-
-
-@decorators.WithTimeoutAndConditionalRetries(_ShouldRetryModification)
-def _SetUpSystemAppModification(device, timeout=None, retries=None):
-  # Ensure that the device is online & available before proceeding to
-  # handle the case where something fails in the middle of set up and
-  # triggers a retry.
-  device.WaitUntilFullyBooted()
-
-  # All calls that could potentially need root should run with as_root=True, but
-  # it looks like some parts of Telemetry work as-is by implicitly assuming that
-  # root is already granted if it's necessary. The reboot can mess with this, so
-  # as a workaround, check whether we're starting with root already, and if so,
-  # restore the device to that state at the end.
-  should_restore_root = device.HasRoot()
-  device.EnableRoot()
-  if not device.HasRoot():
-    raise device_errors.CommandFailedError(
-        'Failed to enable modification of system apps on non-rooted device',
-        str(device))
-
-  try:
-    # Disable Marshmallow's Verity security feature
-    if device.build_version_sdk >= version_codes.MARSHMALLOW:
-      logger.info('Disabling Verity on %s', device.serial)
-      device.adb.DisableVerity()
-      device.Reboot()
-      device.WaitUntilFullyBooted()
-      device.EnableRoot()
-
-    device.adb.Remount()
-    device.RunShellCommand(['stop'], check_return=True)
-    device.SetProp(_ENABLE_MODIFICATION_PROP, '1')
-  except device_errors.CommandFailedError:
-    if device.adb.is_emulator:
-      # Point the user to documentation, since there's a good chance they can
-      # workaround this on an emulator.
-      docs_url = ('https://chromium.googlesource.com/chromium/src/+/'
-                  'HEAD/docs/android_emulator.md#writable-system-partition')
-      logger.error(
-          'Did you start the emulator with "-writable-system?"\n'
-          'See %s\n', docs_url)
-    raise
-
-  return should_restore_root
-
-
-@decorators.WithTimeoutAndConditionalRetries(_ShouldRetryModification)
-def _TearDownSystemAppModification(device,
-                                   should_restore_root,
-                                   timeout=None,
-                                   retries=None):
-  try:
-    # The function may be re-entered after the the device loses root
-    # privilege. For instance if the adb server is restarted before
-    # re-entering the function then the device may lose root privilege.
-    # Therefore we need to do a sanity check for root privilege
-    # on the device and then re-enable root privilege if the device
-    # does not have it.
-    if not device.HasRoot():
-      logger.warning('Need to re-enable root.')
-      device.EnableRoot()
-
-      if not device.HasRoot():
-        raise device_errors.CommandFailedError(
-          ('Failed to tear down modification of '
-           'system apps on non-rooted device.'),
-          str(device))
-
-    device.SetProp(_ENABLE_MODIFICATION_PROP, '0')
-    device.Reboot()
-    device.WaitUntilFullyBooted()
-    if should_restore_root:
-      device.EnableRoot()
-  except device_errors.CommandTimeoutError:
-    logger.error('Timed out while tearing down system app modification.')
-    logger.error('  device state: %s', device.adb.GetState())
-    raise
-
-
-# pylint: enable=unused-argument
-
-
-@contextlib.contextmanager
-def EnableSystemAppModification(device):
-  """A context manager that allows system apps to be modified while in scope.
-
-  Args:
-    device: (device_utils.DeviceUtils) the device
-  """
-  if device.GetProp(_ENABLE_MODIFICATION_PROP) == '1':
-    yield
-    return
-
-  should_restore_root = _SetUpSystemAppModification(
-      device, timeout=_MODIFICATION_TIMEOUT, retries=_MODIFICATION_RETRIES)
-  try:
-    yield
-  finally:
-    _TearDownSystemAppModification(
-        device,
-        should_restore_root,
-        timeout=_MODIFICATION_TIMEOUT,
-        retries=_MODIFICATION_RETRIES)
-
-
-@contextlib.contextmanager
-def _RelocateApp(device, package_name, relocate_to):
-  """A context manager that relocates an app while in scope."""
-  relocation_map = {}
-  system_package_paths = _FindSystemPackagePaths(device, [package_name])
-  if system_package_paths:
-    relocation_map = {
-        p: posixpath.join(relocate_to, posixpath.relpath(p, '/'))
-        for p in system_package_paths
-    }
-    relocation_dirs = [
-        posixpath.dirname(d) for _, d in relocation_map.iteritems()
-    ]
-    device.RunShellCommand(['mkdir', '-p'] + relocation_dirs, check_return=True)
-    _MoveApp(device, relocation_map)
-  else:
-    logger.info('No system package "%s"', package_name)
-
-  try:
-    yield
-  finally:
-    _MoveApp(device, {v: k for k, v in relocation_map.iteritems()})
-
-
-@contextlib.contextmanager
-def _TemporarilyInstallApp(device, apk, install_timeout=None):
-  """A context manager that installs an app while in scope."""
-  if install_timeout is None:
-    device.Install(apk, reinstall=True)
-  else:
-    device.Install(apk, reinstall=True, timeout=install_timeout)
-
-  try:
-    yield
-  finally:
-    device.Uninstall(apk_helper.GetPackageName(apk))
-
-
-def _MoveApp(device, relocation_map):
-  """Moves an app according to the provided relocation map.
-
-  Args:
-    device: (device_utils.DeviceUtils)
-    relocation_map: (dict) A dict that maps src to dest
-  """
-  movements = ['mv %s %s' % (k, v) for k, v in relocation_map.iteritems()]
-  cmd = ' && '.join(movements)
-  with EnableSystemAppModification(device):
-    device.RunShellCommand(cmd, as_root=True, check_return=True, shell=True)
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  subparsers = parser.add_subparsers()
-
-  def add_common_arguments(p):
-    script_common.AddDeviceArguments(p)
-    script_common.AddEnvironmentArguments(p)
-    p.add_argument(
-        '-v',
-        '--verbose',
-        action='count',
-        default=0,
-        help='Print more information.')
-    p.add_argument('command', nargs='*')
-
-  @contextlib.contextmanager
-  def remove_system_app(device, args):
-    RemoveSystemApps(device, args.packages)
-    yield
-
-  remove_parser = subparsers.add_parser('remove')
-  remove_parser.add_argument(
-      '--package',
-      dest='packages',
-      nargs='*',
-      required=True,
-      help='The system package(s) to remove.')
-  add_common_arguments(remove_parser)
-  remove_parser.set_defaults(func=remove_system_app)
-
-  @contextlib.contextmanager
-  def replace_system_app(device, args):
-    with ReplaceSystemApp(device, args.package, args.replace_with):
-      yield
-
-  replace_parser = subparsers.add_parser('replace')
-  replace_parser.add_argument(
-      '--package', required=True, help='The system package to replace.')
-  replace_parser.add_argument(
-      '--replace-with',
-      metavar='APK',
-      required=True,
-      help='The APK with which the existing system app should be replaced.')
-  add_common_arguments(replace_parser)
-  replace_parser.set_defaults(func=replace_system_app)
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-  script_common.InitializeEnvironment(args)
-
-  devices = script_common.GetDevices(args.devices, args.denylist_file)
-  parallel_devices = parallelizer.SyncParallelizer(
-      [args.func(d, args) for d in devices])
-  with parallel_devices:
-    if args.command:
-      return cmd_helper.Call(args.command)
-    return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py b/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py
deleted file mode 100755
index 65faeea..0000000
--- a/systrace/catapult/devil/devil/android/tools/system_app_devicetest.py
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-import posixpath
-import shutil
-import sys
-import tempfile
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil import base_error
-from devil import devil_env
-from devil.android import device_temp_file
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.tools import system_app
-
-logger = logging.getLogger(__name__)
-
-
-class SystemAppDeviceTest(device_test_case.DeviceTestCase):
-
-  PACKAGE = 'com.google.android.webview'
-
-  def setUp(self):
-    super(SystemAppDeviceTest, self).setUp()
-    self._device = device_utils.DeviceUtils(self.serial)
-    self._original_paths = self._device.GetApplicationPaths(self.PACKAGE)
-    self._apk_cache_dir = tempfile.mkdtemp()
-    # Host location -> device location
-    self._cached_apks = {}
-    for o in self._original_paths:
-      h = os.path.join(self._apk_cache_dir, posixpath.basename(o))
-      self._device.PullFile(o, h, timeout=60)
-      self._cached_apks[h] = o
-
-  def tearDown(self):
-    final_paths = self._device.GetApplicationPaths(self.PACKAGE)
-    if self._original_paths != final_paths:
-      try:
-        self._device.Uninstall(self.PACKAGE)
-      except Exception:  # pylint: disable=broad-except
-        pass
-
-      with system_app.EnableSystemAppModification(self._device):
-        for cached_apk, install_path in self._cached_apks.iteritems():
-          try:
-            with device_temp_file.DeviceTempFile(self._device.adb) as tmp:
-              self._device.adb.Push(cached_apk, tmp.name)
-              self._device.RunShellCommand(['mv', tmp.name, install_path],
-                                           as_root=True,
-                                           check_return=True)
-          except base_error.BaseError:
-            logger.warning('Failed to reinstall %s',
-                           os.path.basename(cached_apk))
-
-    try:
-      shutil.rmtree(self._apk_cache_dir)
-    except IOError:
-      logger.error('Unable to remove app cache directory.')
-
-    super(SystemAppDeviceTest, self).tearDown()
-
-  def _check_preconditions(self):
-    if not self._original_paths:
-      self.skipTest(
-          '%s is not installed on %s' % (self.PACKAGE, str(self._device)))
-    if not any(p.startswith('/system/') for p in self._original_paths):
-      self.skipTest('%s is not installed in a system location on %s' %
-                    (self.PACKAGE, str(self._device)))
-
-  def testReplace(self):
-    self._check_preconditions()
-    replacement = devil_env.config.FetchPath(
-        'empty_system_webview', device=self._device)
-    with system_app.ReplaceSystemApp(self._device, self.PACKAGE, replacement):
-      replaced_paths = self._device.GetApplicationPaths(self.PACKAGE)
-      self.assertNotEqual(self._original_paths, replaced_paths)
-    restored_paths = self._device.GetApplicationPaths(self.PACKAGE)
-    self.assertEqual(self._original_paths, restored_paths)
-
-  def testRemove(self):
-    self._check_preconditions()
-    system_app.RemoveSystemApps(self._device, [self.PACKAGE])
-    removed_paths = self._device.GetApplicationPaths(self.PACKAGE)
-    self.assertEqual([], removed_paths)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/tools/system_app_test.py b/systrace/catapult/devil/devil/android/tools/system_app_test.py
deleted file mode 100644
index 1f1cb36..0000000
--- a/systrace/catapult/devil/devil/android/tools/system_app_test.py
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import version_codes
-from devil.android.tools import system_app
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock
-
-_PACKAGE_NAME = 'com.android'
-_PACKAGE_PATH = '/path/to/com.android.apk'
-_PM_LIST_PACKAGES_COMMAND = [
-    'pm', 'list', 'packages', '-f', '-u', _PACKAGE_NAME
-]
-_PM_LIST_PACKAGES_OUTPUT_WITH_PATH = [
-    'package:/path/to/other=' + _PACKAGE_NAME + '.other',
-    'package:' + _PACKAGE_PATH + '=' + _PACKAGE_NAME
-]
-_PM_LIST_PACKAGES_OUTPUT_WITHOUT_PATH = [
-    'package:/path/to/other=' + _PACKAGE_NAME + '.other'
-]
-
-
-class SystemAppTest(unittest.TestCase):
-  def testDoubleEnableModification(self):
-    """Ensures that system app modification logic isn't repeated.
-
-    If EnableSystemAppModification uses are nested, inner calls should
-    not need to perform any of the expensive modification logic.
-    """
-    # pylint: disable=no-self-use,protected-access
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-    type(mock_device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP)
-
-    system_props = {}
-
-    def dict_setprop(prop_name, value):
-      system_props[prop_name] = value
-
-    def dict_getprop(prop_name):
-      return system_props.get(prop_name, '')
-
-    mock_device.SetProp.side_effect = dict_setprop
-    mock_device.GetProp.side_effect = dict_getprop
-
-    with system_app.EnableSystemAppModification(mock_device):
-      mock_device.EnableRoot.assert_called_once_with()
-      mock_device.GetProp.assert_called_once_with(
-          system_app._ENABLE_MODIFICATION_PROP)
-      mock_device.SetProp.assert_called_once_with(
-          system_app._ENABLE_MODIFICATION_PROP, '1')
-      mock_device.reset_mock()
-
-      with system_app.EnableSystemAppModification(mock_device):
-        self.assertFalse(mock_device.EnableRoot.mock_calls)  # assert not called
-        mock_device.GetProp.assert_called_once_with(
-            system_app._ENABLE_MODIFICATION_PROP)
-        self.assertFalse(mock_device.SetProp.mock_calls)  # assert not called
-        mock_device.reset_mock()
-
-    mock_device.SetProp.assert_called_once_with(
-        system_app._ENABLE_MODIFICATION_PROP, '0')
-
-  def test_GetApplicationPaths_found(self):
-    """Path found in output along with another package having similar name."""
-    # pylint: disable=protected-access
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.RunShellCommand.configure_mock(
-        return_value=_PM_LIST_PACKAGES_OUTPUT_WITH_PATH)
-
-    paths = system_app._GetApplicationPaths(mock_device, _PACKAGE_NAME)
-
-    self.assertEquals([_PACKAGE_PATH], paths)
-    mock_device.RunShellCommand.assert_called_once_with(
-        _PM_LIST_PACKAGES_COMMAND, check_return=True)
-
-  def test_GetApplicationPaths_notFound(self):
-    """Path not found in output, only another package with similar name."""
-    # pylint: disable=protected-access
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.RunShellCommand.configure_mock(
-        return_value=_PM_LIST_PACKAGES_OUTPUT_WITHOUT_PATH)
-
-    paths = system_app._GetApplicationPaths(mock_device, _PACKAGE_NAME)
-
-    self.assertEquals([], paths)
-    mock_device.RunShellCommand.assert_called_once_with(
-        _PM_LIST_PACKAGES_COMMAND, check_return=True)
-
-  def test_GetApplicationPaths_noPaths(self):
-    """Nothing containing text of package name found in output."""
-    # pylint: disable=protected-access
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.RunShellCommand.configure_mock(return_value=[])
-
-    paths = system_app._GetApplicationPaths(mock_device, _PACKAGE_NAME)
-
-    self.assertEquals([], paths)
-    mock_device.RunShellCommand.assert_called_once_with(
-        _PM_LIST_PACKAGES_COMMAND, check_return=True)
-
-  def test_GetApplicationPaths_emptyName(self):
-    """Called with empty name, should not return any packages."""
-    # pylint: disable=protected-access
-    mock_device = mock.Mock(spec=device_utils.DeviceUtils)
-    mock_device.RunShellCommand.configure_mock(
-        return_value=_PM_LIST_PACKAGES_OUTPUT_WITH_PATH)
-
-    paths = system_app._GetApplicationPaths(mock_device, '')
-
-    self.assertEquals([], paths)
-    mock_device.RunShellCommand.assert_called_once_with(
-        _PM_LIST_PACKAGES_COMMAND[:-1] + [''], check_return=True)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/android/tools/unlock_bootloader.py b/systrace/catapult/devil/devil/android/tools/unlock_bootloader.py
deleted file mode 100644
index 9687058..0000000
--- a/systrace/catapult/devil/devil/android/tools/unlock_bootloader.py
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A script to open the unlock bootloader on-screen prompt on all devices."""
-
-import argparse
-import logging
-import os
-import subprocess
-import sys
-import time
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import fastboot
-from devil.android.tools import script_common
-from devil.utils import parallelizer
-
-
-def reboot_into_bootloader(filter_devices):
-  # Reboot all devices into bootloader if they aren't there already.
-  rebooted_devices = set()
-  for d in adb_wrapper.AdbWrapper.Devices(desired_state=None):
-    if filter_devices and str(d) not in filter_devices:
-      continue
-    state = d.GetState()
-    if state == 'device':
-      logging.info('Booting %s to bootloader.', d)
-      try:
-        d.Reboot(to_bootloader=True)
-        rebooted_devices.add(str(d))
-      except (device_errors.AdbCommandFailedError,
-              device_errors.DeviceUnreachableError):
-        logging.exception('Unable to reboot device %s', d)
-    else:
-      logging.error('Unable to reboot device %s: %s', d, state)
-
-  # Wait for the rebooted devices to show up in fastboot.
-  if rebooted_devices:
-    logging.info('Waiting for devices to reboot...')
-    timeout = 60
-    start = time.time()
-    while True:
-      time.sleep(5)
-      fastbooted_devices = set([str(d) for d in fastboot.Fastboot.Devices()])
-      if rebooted_devices <= set(fastbooted_devices):
-        logging.info('All devices in fastboot.')
-        break
-      if time.time() - start > timeout:
-        logging.error('Timed out waiting for %s to reboot.',
-                      rebooted_devices - set(fastbooted_devices))
-        break
-
-
-def unlock_bootloader(d):
-  # Unlock the phones.
-  unlocking_processes = []
-  logging.info('Unlocking %s...', d)
-  # The command to unlock the bootloader could be either of the following
-  # depending on the android version and/or oem. Can't really tell which is
-  # needed, so just try both.
-  # pylint: disable=protected-access
-  cmd_old = [d._fastboot_path.read(), '-s', str(d), 'oem', 'unlock']
-  cmd_new = [d._fastboot_path.read(), '-s', str(d), 'flashing', 'unlock']
-  unlocking_processes.append(
-      subprocess.Popen(cmd_old, stdout=subprocess.PIPE, stderr=subprocess.PIPE))
-  unlocking_processes.append(
-      subprocess.Popen(cmd_new, stdout=subprocess.PIPE, stderr=subprocess.PIPE))
-
-  # Give the unlocking command time to finish and/or open the on-screen prompt.
-  logging.info('Sleeping for 5 seconds...')
-  time.sleep(5)
-
-  leftover_pids = []
-  for p in unlocking_processes:
-    p.poll()
-    rc = p.returncode
-    # If the command succesfully opened the unlock prompt on the screen, the
-    # fastboot command process will hang and wait for a response. We still
-    # need to read its stdout/stderr, so use os.read so that we don't
-    # have to wait for EOF to be written.
-    out = os.read(p.stderr.fileno(), 1024).strip().lower()
-    if not rc:
-      if out == '...' or out == '< waiting for device >':
-        logging.info('Device %s is waiting for confirmation.', d)
-      else:
-        logging.error(
-            'Device %s is hanging, but not waiting for confirmation: %s', d,
-            out)
-      leftover_pids.append(p.pid)
-    else:
-      if 'unknown command' in out:
-        # Of the two unlocking commands, this was likely the wrong one.
-        continue
-      elif 'already unlocked' in out:
-        logging.info('Device %s already unlocked.', d)
-      elif 'unlock is not allowed' in out:
-        logging.error("Device %s is oem locked. Can't unlock bootloader.", d)
-        return 1
-      else:
-        logging.error('Device %s in unknown state: "%s"', d, out)
-        return 1
-    break
-
-  if leftover_pids:
-    logging.warning('Processes %s left over after unlocking.', leftover_pids)
-
-  return 0
-
-
-def main():
-  logging.getLogger().setLevel(logging.INFO)
-
-  parser = argparse.ArgumentParser()
-  script_common.AddDeviceArguments(parser)
-  parser.add_argument(
-      '--adb-path', help='Absolute path to the adb binary to use.')
-  args = parser.parse_args()
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem('adb', devil_env.GetPlatform(),
-                                  args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  reboot_into_bootloader(args.devices)
-  devices = [
-      d for d in fastboot.Fastboot.Devices()
-      if not args.devices or str(d) in args.devices
-  ]
-  parallel_devices = parallelizer.Parallelizer(devices)
-  parallel_devices.pMap(unlock_bootloader).pGet(None)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/video_recorder.py b/systrace/catapult/devil/devil/android/tools/video_recorder.py
deleted file mode 100755
index 4004c46..0000000
--- a/systrace/catapult/devil/devil/android/tools/video_recorder.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Captures a video from an Android device."""
-
-import argparse
-import logging
-import os
-import threading
-import time
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_signal
-from devil.android import device_utils
-from devil.android.tools import script_common
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-
-class VideoRecorder(object):
-  """Records a screen capture video from an Android Device (KitKat or newer)."""
-
-  def __init__(self, device, megabits_per_second=4, size=None, rotate=False):
-    """Creates a VideoRecorder instance.
-
-    Args:
-      device: DeviceUtils instance.
-      host_file: Path to the video file to store on the host.
-      megabits_per_second: Video bitrate in megabits per second. Allowed range
-                           from 0.1 to 100 mbps.
-      size: Video frame size tuple (width, height) or None to use the device
-            default.
-      rotate: If True, the video will be rotated 90 degrees.
-    """
-    self._bit_rate = megabits_per_second * 1000 * 1000
-    self._device = device
-    self._device_file = (
-        '%s/screen-recording.mp4' % device.GetAppWritablePath())
-    self._recorder_thread = None
-    self._rotate = rotate
-    self._size = size
-    self._started = threading.Event()
-
-  def __enter__(self):
-    self.Start()
-
-  def Start(self, timeout=None):
-    """Start recording video."""
-
-    def screenrecord_started():
-      return bool(self._device.GetPids('screenrecord'))
-
-    if screenrecord_started():
-      raise Exception("Can't run multiple concurrent video captures.")
-
-    self._started.clear()
-    self._recorder_thread = reraiser_thread.ReraiserThread(self._Record)
-    self._recorder_thread.start()
-    timeout_retry.WaitFor(
-        screenrecord_started, wait_period=1, max_tries=timeout)
-    self._started.wait(timeout)
-
-  def _Record(self):
-    cmd = ['screenrecord', '--verbose', '--bit-rate', str(self._bit_rate)]
-    if self._rotate:
-      cmd += ['--rotate']
-    if self._size:
-      cmd += ['--size', '%dx%d' % self._size]
-    cmd += [self._device_file]
-    for line in self._device.adb.IterShell(
-        ' '.join(cmd_helper.SingleQuote(i) for i in cmd), None):
-      if line.startswith('Content area is '):
-        self._started.set()
-
-  def __exit__(self, _exc_type, _exc_value, _traceback):
-    self.Stop()
-
-  def Stop(self):
-    """Stop recording video."""
-    if not self._device.KillAll(
-        'screenrecord', signum=device_signal.SIGINT, quiet=True):
-      logger.warning('Nothing to kill: screenrecord was not running')
-    self._recorder_thread.join()
-
-  def Pull(self, host_file=None):
-    """Pull resulting video file from the device.
-
-    Args:
-      host_file: Path to the video file to store on the host.
-    Returns:
-      Output video file name on the host.
-    """
-    # TODO(jbudorick): Merge filename generation with the logic for doing so in
-    # DeviceUtils.
-    host_file_name = (host_file or 'screen-recording-%s-%s.mp4' % (str(
-        self._device), time.strftime('%Y%m%dT%H%M%S', time.localtime())))
-    host_file_name = os.path.abspath(host_file_name)
-    self._device.PullFile(self._device_file, host_file_name)
-    self._device.RemovePath(self._device_file, force=True)
-    return host_file_name
-
-
-def main():
-  # Parse options.
-  parser = argparse.ArgumentParser(description=__doc__)
-  script_common.AddDeviceArguments(parser)
-  parser.add_argument(
-      '-f',
-      '--file',
-      metavar='FILE',
-      help='Save result to file instead of generating a '
-      'timestamped file name.')
-  parser.add_argument(
-      '-v', '--verbose', action='store_true', help='Verbose logging.')
-  parser.add_argument(
-      '-b',
-      '--bitrate',
-      default=4,
-      type=float,
-      help='Bitrate in megabits/s, from 0.1 to 100 mbps, '
-      '%(default)d mbps by default.')
-  parser.add_argument(
-      '-r', '--rotate', action='store_true', help='Rotate video by 90 degrees.')
-  parser.add_argument(
-      '-s',
-      '--size',
-      metavar='WIDTHxHEIGHT',
-      help='Frame size to use instead of the device '
-      'screen size.')
-  parser.add_argument(
-      'host_file',
-      nargs='?',
-      help='File to which the video capture will be written.')
-
-  args = parser.parse_args()
-
-  host_file = args.host_file or args.file
-
-  if args.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  size = (tuple(int(i) for i in args.size.split('x')) if args.size else None)
-
-  def record_video(device, stop_recording):
-    recorder = VideoRecorder(
-        device, megabits_per_second=args.bitrate, size=size, rotate=args.rotate)
-    with recorder:
-      stop_recording.wait()
-
-    f = None
-    if host_file:
-      root, ext = os.path.splitext(host_file)
-      f = '%s_%s%s' % (root, str(device), ext)
-    f = recorder.Pull(f)
-    print 'Video written to %s' % os.path.abspath(f)
-
-  parallel_devices = device_utils.DeviceUtils.parallel(script_common.GetDevices(
-      args.devices, args.denylist_file),
-                                                       asyn=True)
-  stop_recording = threading.Event()
-  running_recording = parallel_devices.pMap(record_video, stop_recording)
-  print 'Recording. Press Enter to stop.',
-  sys.stdout.flush()
-  raw_input()
-  stop_recording.set()
-
-  running_recording.pGet(None)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/android/tools/wait_for_devices.py b/systrace/catapult/devil/devil/android/tools/wait_for_devices.py
deleted file mode 100755
index 062f788..0000000
--- a/systrace/catapult/devil/devil/android/tools/wait_for_devices.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Waits for the given devices to be available."""
-
-import argparse
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(
-          os.path.join(os.path.dirname(__file__), '..', '..', '..')))
-
-from devil.android import device_utils
-from devil.android.tools import script_common
-from devil.utils import run_tests_helper
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument('-v', '--verbose', action='count', help='Log more.')
-  parser.add_argument(
-      '-t',
-      '--timeout',
-      default=30,
-      type=int,
-      help='Seconds to wait for the devices.')
-  parser.add_argument('--adb-path', help='ADB binary to use.')
-  parser.add_argument(
-      'device_serials',
-      nargs='*',
-      metavar='SERIAL',
-      help='Serials of the devices to wait for.')
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-  script_common.InitializeEnvironment(args)
-
-  devices = device_utils.DeviceUtils.HealthyDevices(
-      device_arg=args.device_serials)
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  parallel_devices.WaitUntilFullyBooted(timeout=args.timeout)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/tools/webview_app.py b/systrace/catapult/devil/devil/android/tools/webview_app.py
deleted file mode 100755
index 5866a66..0000000
--- a/systrace/catapult/devil/devil/android/tools/webview_app.py
+++ /dev/null
@@ -1,206 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A script to use a package as the WebView provider while running a command."""
-
-import argparse
-import contextlib
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  _DEVIL_ROOT_DIR = os.path.abspath(
-      os.path.join(os.path.dirname(__file__), '..', '..', '..'))
-  sys.path.append(_DEVIL_ROOT_DIR)
-
-from devil import devil_env
-from devil.android import apk_helper
-from devil.android import device_errors
-from devil.android.sdk import version_codes
-from devil.android.tools import script_common
-from devil.android.tools import system_app
-from devil.utils import cmd_helper
-from devil.utils import parallelizer
-from devil.utils import run_tests_helper
-
-with devil_env.SysPath(devil_env.PY_UTILS_PATH):
-  from py_utils import tempfile_ext
-
-logger = logging.getLogger(__name__)
-
-_SYSTEM_PATH_RE = re.compile(r'^\s*\/(system|product)\/')
-_WEBVIEW_INSTALL_TIMEOUT = 300
-
-
-@contextlib.contextmanager
-def UseWebViewProvider(device, apk, expected_package=''):
-  """A context manager that uses the apk as the webview provider while in scope.
-
-  Args:
-    device: (device_utils.DeviceUtils) The device for which the webview apk
-      should be used as the provider.
-    apk: (str) The path to the webview APK to use.
-    expected_package: (str) If non-empty, verify apk's package name matches
-                      this value.
-  """
-  package_name = apk_helper.GetPackageName(apk)
-
-  if expected_package:
-    if package_name != expected_package:
-      raise device_errors.CommandFailedError(
-          'WebView Provider package %s does not match expected %s' %
-          (package_name, expected_package), str(device))
-
-  if (device.build_version_sdk in [
-      version_codes.NOUGAT, version_codes.NOUGAT_MR1
-  ]):
-    logger.warning('Due to webviewupdate bug in Nougat, WebView Fallback Logic '
-                   'will be disabled and WebView provider may be changed after '
-                   'exit of UseWebViewProvider context manager scope.')
-
-  webview_update = device.GetWebViewUpdateServiceDump()
-  original_fallback_logic = webview_update.get('FallbackLogicEnabled', None)
-  original_provider = webview_update.get('CurrentWebViewPackage', None)
-
-  # This is only necessary if the provider is a fallback provider, but we can't
-  # generally determine this, so we set this just in case.
-  device.SetWebViewFallbackLogic(False)
-
-  try:
-    # If user installed versions of the package is present, they must be
-    # uninstalled first, so that the system version of the package,
-    # if any, can be found by the ReplaceSystemApp context manager
-    with _UninstallNonSystemApp(device, package_name):
-      all_paths = device.GetApplicationPaths(package_name)
-      system_paths = _FilterPaths(all_paths, True)
-      non_system_paths = _FilterPaths(all_paths, False)
-      if non_system_paths:
-        raise device_errors.CommandFailedError(
-            'Non-System application paths found after uninstallation: ',
-            str(non_system_paths))
-      elif system_paths:
-        # app is system app, use ReplaceSystemApp to install
-        with system_app.ReplaceSystemApp(
-            device, package_name, apk,
-            install_timeout=_WEBVIEW_INSTALL_TIMEOUT):
-          _SetWebViewProvider(device, package_name)
-          yield
-      else:
-        # app is not present on device, can directly install
-        with _InstallApp(device, apk):
-          _SetWebViewProvider(device, package_name)
-          yield
-  finally:
-    # restore the original provider only if it was known and not the current
-    # provider
-    if original_provider is not None:
-      webview_update = device.GetWebViewUpdateServiceDump()
-      new_provider = webview_update.get('CurrentWebViewPackage', None)
-      if new_provider != original_provider:
-        device.SetWebViewImplementation(original_provider)
-
-    # enable the fallback logic only if it was known to be enabled
-    if original_fallback_logic is True:
-      device.SetWebViewFallbackLogic(True)
-
-
-def _SetWebViewProvider(device, package_name):
-  """ Set the WebView provider to the package_name if supported. """
-  if device.build_version_sdk >= version_codes.NOUGAT:
-    device.SetWebViewImplementation(package_name)
-
-
-def _FilterPaths(path_list, is_system):
-  """ Return paths in the path_list that are/aren't system paths. """
-  return [
-      p for p in path_list if is_system == bool(re.match(_SYSTEM_PATH_RE, p))
-  ]
-
-
-def _RebasePath(new_root, old_root):
-  """ Graft old_root onto new_root and return the result. """
-  return os.path.join(new_root, os.path.relpath(old_root, '/'))
-
-
-@contextlib.contextmanager
-def _UninstallNonSystemApp(device, package_name):
-  """ Make package un-installed while in scope. """
-  all_paths = device.GetApplicationPaths(package_name)
-  user_paths = _FilterPaths(all_paths, False)
-  host_paths = []
-  if user_paths:
-    with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
-      for user_path in user_paths:
-        host_path = _RebasePath(temp_dir, user_path)
-        # PullFile takes care of host_path creation if needed.
-        device.PullFile(user_path, host_path, timeout=_WEBVIEW_INSTALL_TIMEOUT)
-        host_paths.append(host_path)
-      device.Uninstall(package_name)
-      try:
-        yield
-      finally:
-        for host_path in reversed(host_paths):
-          device.Install(
-              host_path, reinstall=True, timeout=_WEBVIEW_INSTALL_TIMEOUT)
-  else:
-    yield
-
-
-@contextlib.contextmanager
-def _InstallApp(device, apk):
-  """ Make apk installed while in scope. """
-  package_name = apk_helper.GetPackageName(apk)
-  device.Install(apk, reinstall=True, timeout=_WEBVIEW_INSTALL_TIMEOUT)
-  try:
-    yield
-  finally:
-    device.Uninstall(package_name)
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-
-  def add_common_arguments(p):
-    script_common.AddDeviceArguments(p)
-    script_common.AddEnvironmentArguments(p)
-    p.add_argument(
-        '-v',
-        '--verbose',
-        action='count',
-        default=0,
-        help='Print more information.')
-    p.add_argument('command', nargs='*')
-
-  @contextlib.contextmanager
-  def use_webview_provider(device, args):
-    with UseWebViewProvider(device, args.apk, args.expected_package):
-      yield
-
-  parser.add_argument(
-      '--apk', required=True, help='The apk to use as the provider.')
-  parser.add_argument(
-      '--expected-package',
-      default='',
-      help="Verify apk's package name matches value, disabled by default.")
-  add_common_arguments(parser)
-  parser.set_defaults(func=use_webview_provider)
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-  script_common.InitializeEnvironment(args)
-
-  devices = script_common.GetDevices(args.devices, args.denylist_file)
-  parallel_devices = parallelizer.SyncParallelizer(
-      [args.func(d, args) for d in devices])
-  with parallel_devices:
-    if args.command:
-      return cmd_helper.Call(args.command)
-    return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py b/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py
deleted file mode 100644
index 0182d4c..0000000
--- a/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Classes in this package define additional actions that need to be taken to run a
-test under some kind of runtime error detection tool.
-
-The interface is intended to be used as follows.
-
-1. For tests that simply run a native process (i.e. no activity is spawned):
-
-Call tool.CopyFiles(device).
-Prepend test command line with tool.GetTestWrapper().
-
-2. For tests that spawn an activity:
-
-Call tool.CopyFiles(device).
-Call tool.SetupEnvironment().
-Run the test as usual.
-Call tool.CleanUpEnvironment().
-"""
diff --git a/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py b/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py
deleted file mode 100644
index b8445fc..0000000
--- a/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-class BaseTool(object):
-  """A tool that does nothing."""
-
-  # pylint: disable=R0201
-
-  def __init__(self):
-    """Does nothing."""
-    pass
-
-  def GetTestWrapper(self):
-    """Returns a string that is to be prepended to the test command line."""
-    return ''
-
-  def GetUtilWrapper(self):
-    """Returns the wrapper name for the utilities.
-
-    Returns:
-       A string that is to be prepended to the command line of utility
-    processes (forwarder, etc.).
-    """
-    return ''
-
-  @classmethod
-  def CopyFiles(cls, device):
-    """Copies tool-specific files to the device, create directories, etc."""
-    pass
-
-  def SetupEnvironment(self):
-    """Sets up the system environment for a test.
-
-    This is a good place to set system properties.
-    """
-    pass
-
-  def CleanUpEnvironment(self):
-    """Cleans up environment."""
-    pass
-
-  def GetTimeoutScale(self):
-    """Returns a multiplier that should be applied to timeout values."""
-    return 1.0
-
-  def NeedsDebugInfo(self):
-    """Whether this tool requires debug info.
-
-    Returns:
-      True if this tool can not work with stripped binaries.
-    """
-    return False
diff --git a/systrace/catapult/devil/devil/base_error.py b/systrace/catapult/devil/devil/base_error.py
deleted file mode 100644
index dd9ed49..0000000
--- a/systrace/catapult/devil/devil/base_error.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-class BaseError(Exception):
-  """Base error for all test runner errors."""
-
-  def __init__(self, message, is_infra_error=False):
-    super(BaseError, self).__init__(message)
-    self._is_infra_error = is_infra_error
-    self.message = message
-
-  def __eq__(self, other):
-    return (self.message == other.message
-            and self.is_infra_error == other.is_infra_error)
-
-  def __ne__(self, other):
-    return not self == other
-
-  @property
-  def is_infra_error(self):
-    """Property to indicate if error was caused by an infrastructure issue."""
-    return self._is_infra_error
diff --git a/systrace/catapult/devil/devil/constants/__init__.py b/systrace/catapult/devil/devil/constants/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/systrace/catapult/devil/devil/constants/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/systrace/catapult/devil/devil/constants/exit_codes.py b/systrace/catapult/devil/devil/constants/exit_codes.py
deleted file mode 100644
index a2deac6..0000000
--- a/systrace/catapult/devil/devil/constants/exit_codes.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Common exit codes used by devil."""
-
-ERROR = 1
-INFRA = 87
-WARNING = 88
diff --git a/systrace/catapult/devil/devil/devil_dependencies.json b/systrace/catapult/devil/devil/devil_dependencies.json
deleted file mode 100644
index 03e8d98..0000000
--- a/systrace/catapult/devil/devil/devil_dependencies.json
+++ /dev/null
@@ -1,163 +0,0 @@
-{
-  "config_type": "BaseConfig",
-  "dependencies": {
-    "aapt": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "87bd288daab30624e41faa62aa2c1d5bac3e60aa",
-          "download_path": "../bin/deps/linux2/x86_64/bin/aapt"
-        }
-      }
-    },
-    "adb": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "528d0e88a0d876b0549840f0797beffca4a6a796",
-          "download_path": "../bin/deps/linux2/x86_64/bin/adb"
-        }
-      }
-    },
-    "android_build_tools_libc++": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "9b986774ad27288a6777ebfa9a08fd8a52003008",
-          "download_path": "../bin/deps/linux2/x86_64/lib64/libc++.so"
-        }
-      }
-    },
-    "bundletool": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "default": {
-          "cloud_storage_hash": "721525531f3c3ec66b39afd74c2a05e6d3973eef",
-          "download_path": "../bin/deps/default/lib.java/bundletool-all-0.10.3.jar"
-        }
-      }
-    },
-    "chromium_commands": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "6efb1501c7c49e6ae84cc467648930eaf9f6a9e5",
-          "download_path": "../bin/deps/linux2/x86_64/lib.java/chromium_commands.dex.jar"
-        }
-      }
-    },
-    "dexdump": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "c3fdf75afe8eb4062d66703cb556ee1e2064b8ae",
-          "download_path": "../bin/deps/linux2/x86_64/bin/dexdump"
-        }
-      }
-    },
-    "empty_system_webview": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "34e583c631a495afbba82ce8a1d4f9b5118a4411",
-          "download_path": "../bin/deps/android/arm64-v8a/apks/EmptySystemWebView.apk"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "220ff3ba1a6c3c81877997e32784ffd008f293a5",
-          "download_path": "../bin/deps/android/armeabi-v7a/apks/EmptySystemWebView.apk"
-        }
-      }
-    },
-    "fastboot": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "fe84a6714192f6596bf09215caeea34ed937a42b",
-          "download_path": "../bin/deps/linux2/x86_64/bin/fastboot"
-        }
-      }
-    },
-    "forwarder_device": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "b30e8bfb234d02899b05a7957c6a84dc6e16ec4b",
-          "download_path": "../bin/deps/android/arm64-v8a/bin/forwarder_device"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "efc7f092f5394a7b88d77a2544adfe33c5c4fd3c",
-          "download_path": "../bin/deps/android/armeabi-v7a/bin/forwarder_device"
-        },
-        "android_x86": {
-          "cloud_storage_hash": "ec841e99335f8c9bbcf2e3da40dd8a7ebefe2b6e",
-          "download_path": "../bin/deps/android/x86/bin/forwarder_device"
-        },
-        "android_x86_64": {
-          "cloud_storage_hash": "b9921146385bb7c3fc7246084c37a175e7bb97bd",
-          "download_path": "../bin/deps/android/x86_64/bin/forwarder_device"
-        }
-      }
-    },
-    "forwarder_host": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "334c172dd90bae568cbff9465130f1245a35cade",
-          "download_path": "../bin/deps/linux2/x86_64/forwarder_host"
-        }
-      }
-    },
-    "md5sum_device": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "e9e1a4e2f1c24180a5cac496c3c50213384b51eb",
-          "download_path": "../bin/deps/android/arm64-v8a/bin/md5sum_device"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "f0cf40aec71df24d50a2644bed199ffd7588082d",
-          "download_path": "../bin/deps/android/armeabi-v7a/bin/md5sum_device"
-        },
-        "android_x86": {
-          "cloud_storage_hash": "7530812af4b3cd2f20d9ce27e3615828cb4e4fc2",
-          "download_path": "../bin/deps/android/x86/bin/md5sum_device"
-        },
-        "android_x86_64": {
-          "cloud_storage_hash": "4cd36953c44119578568a723854d43b8ed124d7e",
-          "download_path": "../bin/deps/android/x86_64/bin/md5sum_device"
-        }
-      }
-    },
-    "md5sum_host": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "f2428a52730c6593267678c75f95cdc7dffb58df",
-          "download_path": "../bin/deps/linux2/x86_64/bin/md5sum_host"
-        }
-      }
-    },
-    "split-select": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "c116fd0d7ff089561971c078317b75b90f053207",
-          "download_path": "../bin/deps/linux2/x86_64/bin/split-select"
-        }
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/devil/devil/devil_env.py b/systrace/catapult/devil/devil/devil_env.py
deleted file mode 100644
index 2d57688..0000000
--- a/systrace/catapult/devil/devil/devil_env.py
+++ /dev/null
@@ -1,196 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import json
-import logging
-import os
-import platform
-import sys
-import tempfile
-import threading
-
-CATAPULT_ROOT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..'))
-DEPENDENCY_MANAGER_PATH = os.path.join(CATAPULT_ROOT_PATH, 'dependency_manager')
-PYMOCK_PATH = os.path.join(CATAPULT_ROOT_PATH, 'third_party', 'mock')
-PY_UTILS_PATH = os.path.join(CATAPULT_ROOT_PATH, 'common', 'py_utils')
-SIX_PATH = os.path.join(CATAPULT_ROOT_PATH, 'third_party', 'six')
-
-
-@contextlib.contextmanager
-def SysPath(path):
-  sys.path.append(path)
-  yield
-  if sys.path[-1] != path:
-    sys.path.remove(path)
-  else:
-    sys.path.pop()
-
-
-with SysPath(DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-with SysPath(SIX_PATH):
-  import six
-
-_ANDROID_BUILD_TOOLS = {'aapt', 'dexdump', 'split-select'}
-
-_DEVIL_DEFAULT_CONFIG = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), 'devil_dependencies.json'))
-
-_LEGACY_ENVIRONMENT_VARIABLES = {
-    'ADB_PATH': {
-        'dependency_name': 'adb',
-        'platform': 'linux2_x86_64',
-    },
-    'ANDROID_SDK_ROOT': {
-        'dependency_name': 'android_sdk',
-        'platform': 'linux2_x86_64',
-    },
-}
-
-
-def EmptyConfig():
-  return {'config_type': 'BaseConfig', 'dependencies': {}}
-
-
-def LocalConfigItem(dependency_name, dependency_platform, dependency_path):
-  if isinstance(dependency_path, six.string_types):
-    dependency_path = [dependency_path]
-  return {
-      dependency_name: {
-          'file_info': {
-              dependency_platform: {
-                  'local_paths': dependency_path
-              },
-          },
-      },
-  }
-
-
-def _GetEnvironmentVariableConfig():
-  env_config = EmptyConfig()
-  path_config = ((os.environ.get(k), v)
-                 for k, v in six.iteritems(_LEGACY_ENVIRONMENT_VARIABLES))
-  path_config = ((p, c) for p, c in path_config if p)
-  for p, c in path_config:
-    env_config['dependencies'].update(
-        LocalConfigItem(c['dependency_name'], c['platform'], p))
-  return env_config
-
-
-class _Environment(object):
-  def __init__(self):
-    self._dm_init_lock = threading.Lock()
-    self._dm = None
-    self._logging_init_lock = threading.Lock()
-    self._logging_initialized = False
-
-  def Initialize(self, configs=None, config_files=None):
-    """Initialize devil's environment from configuration files.
-
-    This uses all configurations provided via |configs| and |config_files|
-    to determine the locations of devil's dependencies. Configurations should
-    all take the form described by py_utils.dependency_manager.BaseConfig.
-    If no configurations are provided, a default one will be used if available.
-
-    Args:
-      configs: An optional list of dict configurations.
-      config_files: An optional list of files to load
-    """
-
-    # Make sure we only initialize self._dm once.
-    with self._dm_init_lock:
-      if self._dm is None:
-        if configs is None:
-          configs = []
-
-        env_config = _GetEnvironmentVariableConfig()
-        if env_config:
-          configs.insert(0, env_config)
-        self._InitializeRecursive(configs=configs, config_files=config_files)
-        assert self._dm is not None, 'Failed to create dependency manager.'
-
-  def _InitializeRecursive(self, configs=None, config_files=None):
-    # This recurses through configs to create temporary files for each and
-    # take advantage of context managers to appropriately close those files.
-    # TODO(jbudorick): Remove this recursion if/when dependency_manager
-    # supports loading configurations directly from a dict.
-    if configs:
-      with tempfile.NamedTemporaryFile(mode='w',
-                                       delete=False) as next_config_file:
-        try:
-          next_config_file.write(json.dumps(configs[0]))
-          next_config_file.close()
-          self._InitializeRecursive(
-              configs=configs[1:],
-              config_files=[next_config_file.name] + (config_files or []))
-        finally:
-          if os.path.exists(next_config_file.name):
-            os.remove(next_config_file.name)
-    else:
-      config_files = config_files or []
-      if 'DEVIL_ENV_CONFIG' in os.environ:
-        config_files.append(os.environ.get('DEVIL_ENV_CONFIG'))
-      config_files.append(_DEVIL_DEFAULT_CONFIG)
-
-      self._dm = dependency_manager.DependencyManager(
-          [dependency_manager.BaseConfig(c) for c in config_files])
-
-  def InitializeLogging(self, log_level, formatter=None, handler=None):
-    if self._logging_initialized:
-      return
-
-    with self._logging_init_lock:
-      if self._logging_initialized:
-        return
-
-      formatter = formatter or logging.Formatter(
-          '%(threadName)-4s  %(message)s')
-      handler = handler or logging.StreamHandler(sys.stdout)
-      handler.setFormatter(formatter)
-
-      devil_logger = logging.getLogger('devil')
-      devil_logger.setLevel(log_level)
-      devil_logger.propagate = False
-      devil_logger.addHandler(handler)
-
-      with SysPath(PY_UTILS_PATH):
-        import py_utils.cloud_storage
-
-      lock_logger = py_utils.cloud_storage.logger
-      lock_logger.setLevel(log_level)
-      lock_logger.propagate = False
-      lock_logger.addHandler(handler)
-
-      self._logging_initialized = True
-
-  def FetchPath(self, dependency, arch=None, device=None):
-    if self._dm is None:
-      self.Initialize()
-    if dependency in _ANDROID_BUILD_TOOLS:
-      self.FetchPath('android_build_tools_libc++', arch=arch, device=device)
-    return self._dm.FetchPath(dependency, GetPlatform(arch, device))
-
-  def LocalPath(self, dependency, arch=None, device=None):
-    if self._dm is None:
-      self.Initialize()
-    return self._dm.LocalPath(dependency, GetPlatform(arch, device))
-
-  def PrefetchPaths(self, dependencies=None, arch=None, device=None):
-    return self._dm.PrefetchPaths(
-        GetPlatform(arch, device), dependencies=dependencies)
-
-
-def GetPlatform(arch=None, device=None):
-  if arch or device:
-    return 'android_%s' % (arch or device.product_cpu_abi)
-  # use 'linux2' for linux as this is already used in json file
-  return '%s_%s' % (
-      sys.platform if not sys.platform.startswith('linux') else 'linux2',
-      platform.machine())
-
-
-config = _Environment()
diff --git a/systrace/catapult/devil/devil/devil_env_test.py b/systrace/catapult/devil/devil/devil_env_test.py
deleted file mode 100755
index 65fd704..0000000
--- a/systrace/catapult/devil/devil/devil_env_test.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=protected-access
-
-import logging
-import sys
-import unittest
-
-from devil import devil_env
-from devil.android.ndk import abis
-
-_sys_path_before = list(sys.path)
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  _sys_path_with_pymock = list(sys.path)
-  import mock  # pylint: disable=import-error
-_sys_path_after = list(sys.path)
-
-
-class _MockDeviceUtils(object):
-  def __init__(self):
-    self.product_cpu_abi = abis.ARM_64
-
-
-class DevilEnvTest(unittest.TestCase):
-  def testSysPath(self):
-    self.assertEquals(_sys_path_before, _sys_path_after)
-    self.assertEquals(_sys_path_before + [devil_env.PYMOCK_PATH],
-                      _sys_path_with_pymock)
-
-  def testGetEnvironmentVariableConfig_configType(self):
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=lambda _env_var: None)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals('BaseConfig', env_config.get('config_type'))
-
-  def testGetEnvironmentVariableConfig_noEnv(self):
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=lambda _env_var: None)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals({}, env_config.get('dependencies'))
-
-  def testGetEnvironmentVariableConfig_adbPath(self):
-    def mock_environment(env_var):
-      return '/my/fake/adb/path' if env_var == 'ADB_PATH' else None
-
-    with mock.patch('os.environ.get', mock.Mock(side_effect=mock_environment)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals({
-        'adb': {
-            'file_info': {
-                'linux2_x86_64': {
-                    'local_paths': ['/my/fake/adb/path'],
-                },
-            },
-        },
-    }, env_config.get('dependencies'))
-
-  def testGetPlatform(self):
-    with mock.patch('platform.machine', mock.Mock(return_value='x86_64')):
-      with mock.patch('sys.platform', mock.Mock(return_value='linux2')):
-        platform = devil_env.GetPlatform()
-        self.assertEquals(platform, 'linux2_x86_64')
-      with mock.patch('sys.platform', mock.Mock(return_value='linux')):
-        platform = devil_env.GetPlatform()
-        self.assertEquals(platform, 'linux2_x86_64')
-
-    platform = devil_env.GetPlatform(arch='arm64-v8a')
-    self.assertEquals(platform, 'android_arm64-v8a')
-
-    device = _MockDeviceUtils()
-    platform = devil_env.GetPlatform(device=device)
-    self.assertEquals(platform, 'android_arm64-v8a')
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/utils/__init__.py b/systrace/catapult/devil/devil/utils/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/systrace/catapult/devil/devil/utils/__init__.py
+++ /dev/null
diff --git a/systrace/catapult/devil/devil/utils/cmd_helper.py b/systrace/catapult/devil/devil/utils/cmd_helper.py
deleted file mode 100644
index 3a95945..0000000
--- a/systrace/catapult/devil/devil/utils/cmd_helper.py
+++ /dev/null
@@ -1,600 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A wrapper for subprocess to make calling shell commands easier."""
-
-import codecs
-import logging
-import os
-import pipes
-import select
-import signal
-import string
-import subprocess
-import sys
-import time
-
-CATAPULT_ROOT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..', '..'))
-SIX_PATH = os.path.join(CATAPULT_ROOT_PATH, 'third_party', 'six')
-
-if SIX_PATH not in sys.path:
-  sys.path.append(SIX_PATH)
-
-import six
-
-from devil import base_error
-
-logger = logging.getLogger(__name__)
-
-_SafeShellChars = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./')
-
-# Cache the string-escape codec to ensure subprocess can find it
-# later. Return value doesn't matter.
-if six.PY2:
-  codecs.lookup('string-escape')
-
-
-def SingleQuote(s):
-  """Return an shell-escaped version of the string using single quotes.
-
-  Reliably quote a string which may contain unsafe characters (e.g. space,
-  quote, or other special characters such as '$').
-
-  The returned value can be used in a shell command line as one token that gets
-  to be interpreted literally.
-
-  Args:
-    s: The string to quote.
-
-  Return:
-    The string quoted using single quotes.
-  """
-  return pipes.quote(s)
-
-
-def DoubleQuote(s):
-  """Return an shell-escaped version of the string using double quotes.
-
-  Reliably quote a string which may contain unsafe characters (e.g. space
-  or quote characters), while retaining some shell features such as variable
-  interpolation.
-
-  The returned value can be used in a shell command line as one token that gets
-  to be further interpreted by the shell.
-
-  The set of characters that retain their special meaning may depend on the
-  shell implementation. This set usually includes: '$', '`', '\', '!', '*',
-  and '@'.
-
-  Args:
-    s: The string to quote.
-
-  Return:
-    The string quoted using double quotes.
-  """
-  if not s:
-    return '""'
-  elif all(c in _SafeShellChars for c in s):
-    return s
-  else:
-    return '"' + s.replace('"', '\\"') + '"'
-
-
-def ShrinkToSnippet(cmd_parts, var_name, var_value):
-  """Constructs a shell snippet for a command using a variable to shrink it.
-
-  Takes into account all quoting that needs to happen.
-
-  Args:
-    cmd_parts: A list of command arguments.
-    var_name: The variable that holds var_value.
-    var_value: The string to replace in cmd_parts with $var_name
-
-  Returns:
-    A shell snippet that does not include setting the variable.
-  """
-
-  def shrink(value):
-    parts = (x and SingleQuote(x) for x in value.split(var_value))
-    with_substitutions = ('"$%s"' % var_name).join(parts)
-    return with_substitutions or "''"
-
-  return ' '.join(shrink(part) for part in cmd_parts)
-
-
-def Popen(args,
-          stdin=None,
-          stdout=None,
-          stderr=None,
-          shell=None,
-          cwd=None,
-          env=None):
-  # preexec_fn isn't supported on windows.
-  # pylint: disable=unexpected-keyword-arg
-  if sys.platform == 'win32':
-    close_fds = (stdin is None and stdout is None and stderr is None)
-    preexec_fn = None
-  else:
-    close_fds = True
-    preexec_fn = lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)
-
-  if six.PY2:
-    return subprocess.Popen(
-      args=args,
-      cwd=cwd,
-      stdin=stdin,
-      stdout=stdout,
-      stderr=stderr,
-      shell=shell,
-      close_fds=close_fds,
-      env=env,
-      preexec_fn=preexec_fn
-    )
-  else:
-    # opens stdout in text mode, so that caller side always get 'str',
-    # and there will be no type mismatch error.
-    # Ignore any decoding error, so that caller will not crash due to
-    # uncaught exception. Decoding errors are unavoidable, as we
-    # do not know the encoding of the output, and in some output there
-    # will be multiple encodings (e.g. adb logcat)
-    return subprocess.Popen(
-      args=args,
-      cwd=cwd,
-      stdin=stdin,
-      stdout=stdout,
-      stderr=stderr,
-      shell=shell,
-      close_fds=close_fds,
-      env=env,
-      preexec_fn=preexec_fn,
-      universal_newlines=True,
-      encoding='utf-8',
-      errors='ignore'
-    )
-
-def Call(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
-  pipe = Popen(
-      args, stdout=stdout, stderr=stderr, shell=shell, cwd=cwd, env=env)
-  pipe.communicate()
-  return pipe.wait()
-
-
-def RunCmd(args, cwd=None):
-  """Opens a subprocess to execute a program and returns its return value.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-
-  Returns:
-    Return code from the command execution.
-  """
-  logger.debug(str(args) + ' ' + (cwd or ''))
-  return Call(args, cwd=cwd)
-
-
-def GetCmdOutput(args, cwd=None, shell=False, env=None):
-  """Open a subprocess to execute a program and returns its output.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command.
-    env: If not None, a mapping that defines environment variables for the
-      subprocess.
-
-  Returns:
-    Captures and returns the command's stdout.
-    Prints the command's stderr to logger (which defaults to stdout).
-  """
-  (_, output) = GetCmdStatusAndOutput(args, cwd, shell, env)
-  return output
-
-
-def _ValidateAndLogCommand(args, cwd, shell):
-  if isinstance(args, six.string_types):
-    if not shell:
-      raise Exception('string args must be run with shell=True')
-  else:
-    if shell:
-      raise Exception('array args must be run with shell=False')
-    args = ' '.join(SingleQuote(str(c)) for c in args)
-  if cwd is None:
-    cwd = ''
-  else:
-    cwd = ':' + cwd
-  logger.debug('[host]%s> %s', cwd, args)
-  return args
-
-
-def GetCmdStatusAndOutput(args,
-                          cwd=None,
-                          shell=False,
-                          env=None,
-                          merge_stderr=False):
-  """Executes a subprocess and returns its exit code and output.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    env: If not None, a mapping that defines environment variables for the
-      subprocess.
-    merge_stderr: If True, captures stderr as part of stdout.
-
-  Returns:
-    The 2-tuple (exit code, stdout).
-  """
-  status, stdout, stderr = GetCmdStatusOutputAndError(
-      args, cwd=cwd, shell=shell, env=env, merge_stderr=merge_stderr)
-
-  if stderr:
-    logger.critical('STDERR: %s', stderr)
-  logger.debug('STDOUT: %s%s', stdout[:4096].rstrip(),
-               '<truncated>' if len(stdout) > 4096 else '')
-  return (status, stdout)
-
-
-def StartCmd(args, cwd=None, shell=False, env=None):
-  """Starts a subprocess and returns a handle to the process.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    env: If not None, a mapping that defines environment variables for the
-      subprocess.
-
-  Returns:
-    A process handle from subprocess.Popen.
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  return Popen(
-      args,
-      stdout=subprocess.PIPE,
-      stderr=subprocess.PIPE,
-      shell=shell,
-      cwd=cwd,
-      env=env)
-
-
-def GetCmdStatusOutputAndError(args,
-                               cwd=None,
-                               shell=False,
-                               env=None,
-                               merge_stderr=False):
-  """Executes a subprocess and returns its exit code, output, and errors.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    env: If not None, a mapping that defines environment variables for the
-      subprocess.
-    merge_stderr: If True, captures stderr as part of stdout.
-
-  Returns:
-    The 3-tuple (exit code, stdout, stderr).
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  stderr = subprocess.STDOUT if merge_stderr else subprocess.PIPE
-  pipe = Popen(
-      args,
-      stdout=subprocess.PIPE,
-      stderr=stderr,
-      shell=shell,
-      cwd=cwd,
-      env=env)
-  stdout, stderr = pipe.communicate()
-  return (pipe.returncode, stdout, stderr)
-
-
-class TimeoutError(base_error.BaseError):
-  """Module-specific timeout exception."""
-
-  def __init__(self, output=None):
-    super(TimeoutError, self).__init__('Timeout')
-    self._output = output
-
-  @property
-  def output(self):
-    return self._output
-
-
-def _read_and_decode(fd, buffer_size):
-  data = os.read(fd, buffer_size)
-  if data and six.PY3:
-    data = data.decode('utf-8', errors='ignore')
-  return data
-
-def _IterProcessStdoutFcntl(process,
-                            iter_timeout=None,
-                            timeout=None,
-                            buffer_size=4096,
-                            poll_interval=1):
-  """An fcntl-based implementation of _IterProcessStdout."""
-  # pylint: disable=too-many-nested-blocks
-  import fcntl
-  try:
-    # Enable non-blocking reads from the child's stdout.
-    child_fd = process.stdout.fileno()
-    fl = fcntl.fcntl(child_fd, fcntl.F_GETFL)
-    fcntl.fcntl(child_fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
-
-    end_time = (time.time() + timeout) if timeout else None
-    iter_end_time = (time.time() + iter_timeout) if iter_timeout else None
-
-    while True:
-      if end_time and time.time() > end_time:
-        raise TimeoutError()
-      if iter_end_time and time.time() > iter_end_time:
-        yield None
-        iter_end_time = time.time() + iter_timeout
-
-      if iter_end_time:
-        iter_aware_poll_interval = min(poll_interval,
-                                       max(0, iter_end_time - time.time()))
-      else:
-        iter_aware_poll_interval = poll_interval
-
-      read_fds, _, _ = select.select([child_fd], [], [],
-                                     iter_aware_poll_interval)
-      if child_fd in read_fds:
-        data = _read_and_decode(child_fd, buffer_size)
-        if not data:
-          break
-        yield data
-
-      if process.poll() is not None:
-        # If process is closed, keep checking for output data (because of timing
-        # issues).
-        while True:
-          read_fds, _, _ = select.select([child_fd], [], [],
-                                         iter_aware_poll_interval)
-          if child_fd in read_fds:
-            data = _read_and_decode(child_fd, buffer_size)
-            if data:
-              yield data
-              continue
-          break
-        break
-  finally:
-    try:
-      if process.returncode is None:
-        # Make sure the process doesn't stick around if we fail with an
-        # exception.
-        process.kill()
-    except OSError:
-      pass
-    process.wait()
-
-
-def _IterProcessStdoutQueue(process,
-                            iter_timeout=None,
-                            timeout=None,
-                            buffer_size=4096,
-                            poll_interval=1):
-  """A Queue.Queue-based implementation of _IterProcessStdout.
-
-  TODO(jbudorick): Evaluate whether this is a suitable replacement for
-  _IterProcessStdoutFcntl on all platforms.
-  """
-  # pylint: disable=unused-argument
-  import Queue
-  import threading
-
-  stdout_queue = Queue.Queue()
-
-  def read_process_stdout():
-    # TODO(jbudorick): Pick an appropriate read size here.
-    while True:
-      try:
-        output_chunk = _read_and_decode(process.stdout.fileno(), buffer_size)
-      except IOError:
-        break
-      stdout_queue.put(output_chunk, True)
-      if not output_chunk and process.poll() is not None:
-        break
-
-  reader_thread = threading.Thread(target=read_process_stdout)
-  reader_thread.start()
-
-  end_time = (time.time() + timeout) if timeout else None
-
-  try:
-    while True:
-      if end_time and time.time() > end_time:
-        raise TimeoutError()
-      try:
-        s = stdout_queue.get(True, iter_timeout)
-        if not s:
-          break
-        yield s
-      except Queue.Empty:
-        yield None
-  finally:
-    try:
-      if process.returncode is None:
-        # Make sure the process doesn't stick around if we fail with an
-        # exception.
-        process.kill()
-    except OSError:
-      pass
-    process.wait()
-    reader_thread.join()
-
-
-_IterProcessStdout = (_IterProcessStdoutQueue
-                      if sys.platform == 'win32' else _IterProcessStdoutFcntl)
-"""Iterate over a process's stdout.
-
-This is intentionally not public.
-
-Args:
-  process: The process in question.
-  iter_timeout: An optional length of time, in seconds, to wait in
-    between each iteration. If no output is received in the given
-    time, this generator will yield None.
-  timeout: An optional length of time, in seconds, during which
-    the process must finish. If it fails to do so, a TimeoutError
-    will be raised.
-  buffer_size: The maximum number of bytes to read (and thus yield) at once.
-  poll_interval: The length of time to wait in calls to `select.select`.
-    If iter_timeout is set, the remaining length of time in the iteration
-    may take precedence.
-Raises:
-  TimeoutError: if timeout is set and the process does not complete.
-Yields:
-  basestrings of data or None.
-"""
-
-
-def GetCmdStatusAndOutputWithTimeout(args,
-                                     timeout,
-                                     cwd=None,
-                                     shell=False,
-                                     logfile=None,
-                                     env=None):
-  """Executes a subprocess with a timeout.
-
-  Args:
-    args: List of arguments to the program, the program to execute is the first
-      element.
-    timeout: the timeout in seconds or None to wait forever.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    logfile: Optional file-like object that will receive output from the
-      command as it is running.
-    env: If not None, a mapping that defines environment variables for the
-      subprocess.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  Raises:
-    TimeoutError on timeout.
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  output = six.StringIO()
-  process = Popen(
-      args,
-      cwd=cwd,
-      shell=shell,
-      stdout=subprocess.PIPE,
-      stderr=subprocess.STDOUT,
-      env=env)
-  try:
-    for data in _IterProcessStdout(process, timeout=timeout):
-      if logfile:
-        logfile.write(data)
-      output.write(data)
-  except TimeoutError:
-    raise TimeoutError(output.getvalue())
-
-  str_output = output.getvalue()
-  logger.debug('STDOUT+STDERR: %s%s', str_output[:4096].rstrip(),
-               '<truncated>' if len(str_output) > 4096 else '')
-  return process.returncode, str_output
-
-
-def IterCmdOutputLines(args,
-                       iter_timeout=None,
-                       timeout=None,
-                       cwd=None,
-                       shell=False,
-                       env=None,
-                       check_status=True):
-  """Executes a subprocess and continuously yields lines from its output.
-
-  Args:
-    args: List of arguments to the program, the program to execute is the first
-      element.
-    iter_timeout: Timeout for each iteration, in seconds.
-    timeout: Timeout for the entire command, in seconds.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    env: If not None, a mapping that defines environment variables for the
-      subprocess.
-    check_status: A boolean indicating whether to check the exit status of the
-      process after all output has been read.
-  Yields:
-    The output of the subprocess, line by line.
-
-  Raises:
-    CalledProcessError if check_status is True and the process exited with a
-      non-zero exit status.
-  """
-  cmd = _ValidateAndLogCommand(args, cwd, shell)
-  process = Popen(
-      args,
-      cwd=cwd,
-      shell=shell,
-      env=env,
-      stdout=subprocess.PIPE,
-      stderr=subprocess.STDOUT)
-  return _IterCmdOutputLines(
-      process,
-      cmd,
-      iter_timeout=iter_timeout,
-      timeout=timeout,
-      check_status=check_status)
-
-
-def _IterCmdOutputLines(process,
-                        cmd,
-                        iter_timeout=None,
-                        timeout=None,
-                        check_status=True):
-  buffer_output = ''
-
-  iter_end = None
-  cur_iter_timeout = None
-  if iter_timeout:
-    iter_end = time.time() + iter_timeout
-    cur_iter_timeout = iter_timeout
-
-  for data in _IterProcessStdout(
-      process, iter_timeout=cur_iter_timeout, timeout=timeout):
-    if iter_timeout:
-      # Check whether the current iteration has timed out.
-      cur_iter_timeout = iter_end - time.time()
-      if data is None or cur_iter_timeout < 0:
-        yield None
-        iter_end = time.time() + iter_timeout
-        continue
-    else:
-      assert data is not None, (
-          'Iteration received no data despite no iter_timeout being set. '
-          'cmd: %s' % cmd)
-
-    # Construct lines to yield from raw data.
-    buffer_output += data
-    has_incomplete_line = buffer_output[-1] not in '\r\n'
-    lines = buffer_output.splitlines()
-    buffer_output = lines.pop() if has_incomplete_line else ''
-    for line in lines:
-      yield line
-      if iter_timeout:
-        iter_end = time.time() + iter_timeout
-
-  if buffer_output:
-    yield buffer_output
-  if check_status and process.returncode:
-    raise subprocess.CalledProcessError(process.returncode, cmd)
diff --git a/systrace/catapult/devil/devil/utils/cmd_helper_test.py b/systrace/catapult/devil/devil/utils/cmd_helper_test.py
deleted file mode 100755
index 0eeefe1..0000000
--- a/systrace/catapult/devil/devil/utils/cmd_helper_test.py
+++ /dev/null
@@ -1,279 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Tests for the cmd_helper module."""
-
-import unittest
-import subprocess
-import sys
-import time
-
-from devil import devil_env
-from devil.utils import cmd_helper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class CmdHelperSingleQuoteTest(unittest.TestCase):
-  def testSingleQuote_basic(self):
-    self.assertEquals('hello', cmd_helper.SingleQuote('hello'))
-
-  def testSingleQuote_withSpaces(self):
-    self.assertEquals("'hello world'", cmd_helper.SingleQuote('hello world'))
-
-  def testSingleQuote_withUnsafeChars(self):
-    self.assertEquals("""'hello'"'"'; rm -rf /'""",
-                      cmd_helper.SingleQuote("hello'; rm -rf /"))
-
-  def testSingleQuote_dontExpand(self):
-    test_string = 'hello $TEST_VAR'
-    cmd = 'TEST_VAR=world; echo %s' % cmd_helper.SingleQuote(test_string)
-    self.assertEquals(test_string,
-                      cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
-
-class CmdHelperGetCmdStatusAndOutputTest(unittest.TestCase):
-  def testGetCmdStatusAndOutput_success(self):
-    cmd = 'echo "Hello World"'
-    status, output = cmd_helper.GetCmdStatusAndOutput(cmd, shell=True)
-    self.assertEqual(status, 0)
-    self.assertEqual(output.rstrip(), "Hello World")
-
-  def testGetCmdStatusAndOutput_unicode(self):
-    # pylint: disable=no-self-use
-    cmd = 'echo "\x80\x31Hello World\n"'
-    cmd_helper.GetCmdStatusAndOutput(cmd, shell=True)
-
-class CmdHelperDoubleQuoteTest(unittest.TestCase):
-  def testDoubleQuote_basic(self):
-    self.assertEquals('hello', cmd_helper.DoubleQuote('hello'))
-
-  def testDoubleQuote_withSpaces(self):
-    self.assertEquals('"hello world"', cmd_helper.DoubleQuote('hello world'))
-
-  def testDoubleQuote_withUnsafeChars(self):
-    self.assertEquals('''"hello\\"; rm -rf /"''',
-                      cmd_helper.DoubleQuote('hello"; rm -rf /'))
-
-  def testSingleQuote_doExpand(self):
-    test_string = 'hello $TEST_VAR'
-    cmd = 'TEST_VAR=world; echo %s' % cmd_helper.DoubleQuote(test_string)
-    self.assertEquals('hello world',
-                      cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
-
-
-class CmdHelperShinkToSnippetTest(unittest.TestCase):
-  def testShrinkToSnippet_noArgs(self):
-    self.assertEquals('foo', cmd_helper.ShrinkToSnippet(['foo'], 'a', 'bar'))
-    self.assertEquals("'foo foo'",
-                      cmd_helper.ShrinkToSnippet(['foo foo'], 'a', 'bar'))
-    self.assertEquals('"$a"\' bar\'',
-                      cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'foo'))
-    self.assertEquals('\'foo \'"$a"',
-                      cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'bar'))
-    self.assertEquals('foo"$a"',
-                      cmd_helper.ShrinkToSnippet(['foobar'], 'a', 'bar'))
-
-  def testShrinkToSnippet_singleArg(self):
-    self.assertEquals("foo ''",
-                      cmd_helper.ShrinkToSnippet(['foo', ''], 'a', 'bar'))
-    self.assertEquals("foo foo",
-                      cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'bar'))
-    self.assertEquals('"$a" "$a"',
-                      cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'foo'))
-    self.assertEquals('foo "$a""$a"',
-                      cmd_helper.ShrinkToSnippet(['foo', 'barbar'], 'a', 'bar'))
-    self.assertEquals(
-        'foo "$a"\' \'"$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'bar bar'], 'a', 'bar'))
-    self.assertEquals(
-        'foo "$a""$a"\' \'',
-        cmd_helper.ShrinkToSnippet(['foo', 'barbar '], 'a', 'bar'))
-    self.assertEquals(
-        'foo \' \'"$a""$a"\' \'',
-        cmd_helper.ShrinkToSnippet(['foo', ' barbar '], 'a', 'bar'))
-
-
-_DEFAULT = 'DEFAULT'
-
-
-class _ProcessOutputEvent(object):
-  def __init__(self, select_fds=_DEFAULT, read_contents=None, ts=_DEFAULT):
-    self.select_fds = select_fds
-    self.read_contents = read_contents
-    self.ts = ts
-
-
-class _MockProcess(object):
-  def __init__(self, output_sequence=None, return_value=0):
-
-    # Arbitrary.
-    fake_stdout_fileno = 25
-
-    self.mock_proc = mock.MagicMock(spec=subprocess.Popen)
-    self.mock_proc.stdout = mock.MagicMock()
-    self.mock_proc.stdout.fileno = mock.MagicMock(
-        return_value=fake_stdout_fileno)
-    self.mock_proc.returncode = None
-
-    self._return_value = return_value
-
-    # This links the behavior of os.read, select.select, time.time, and
-    # <process>.poll. The output sequence can be thought of as a list of
-    # return values for select.select with corresponding return values for
-    # the other calls at any time between that select call and the following
-    # one. We iterate through the sequence only on calls to select.select.
-    #
-    # os.read is a special case, though, where we only return a given chunk
-    # of data *once* after a given call to select.
-
-    if not output_sequence:
-      output_sequence = []
-
-    # Use an leading element to make the iteration logic work.
-    initial_seq_element = _ProcessOutputEvent(
-        _DEFAULT, '', output_sequence[0].ts if output_sequence else _DEFAULT)
-    output_sequence.insert(0, initial_seq_element)
-
-    for o in output_sequence:
-      if o.select_fds == _DEFAULT:
-        if o.read_contents is None:
-          o.select_fds = []
-        else:
-          o.select_fds = [fake_stdout_fileno]
-      if o.ts == _DEFAULT:
-        o.ts = time.time()
-    self._output_sequence = output_sequence
-
-    self._output_seq_index = 0
-    self._read_flags = [False] * len(output_sequence)
-
-    def read_side_effect(*_args, **_kwargs):
-      if self._read_flags[self._output_seq_index]:
-        return None
-      self._read_flags[self._output_seq_index] = True
-      return self._output_sequence[self._output_seq_index].read_contents
-
-    def select_side_effect(*_args, **_kwargs):
-      if self._output_seq_index is None:
-        self._output_seq_index = 0
-      else:
-        self._output_seq_index += 1
-      if self._output_seq_index < len(self._output_sequence):
-        return (self._output_sequence[self._output_seq_index].select_fds, None,
-                None)
-      else:
-        return ([], None, None)
-
-    def time_side_effect(*_args, **_kwargs):
-      return self._output_sequence[self._output_seq_index].ts
-
-    def poll_side_effect(*_args, **_kwargs):
-      if self._output_seq_index >= len(self._output_sequence) - 1:
-        self.mock_proc.returncode = self._return_value
-      return self.mock_proc.returncode
-
-    mock_read = mock.MagicMock(side_effect=read_side_effect)
-    mock_select = mock.MagicMock(side_effect=select_side_effect)
-    mock_time = mock.MagicMock(side_effect=time_side_effect)
-    self.mock_proc.poll = mock.MagicMock(side_effect=poll_side_effect)
-
-    # Set up but *do not start* the mocks.
-    self._mocks = [
-        mock.patch('os.read', new=mock_read),
-        mock.patch('select.select', new=mock_select),
-        mock.patch('time.time', new=mock_time),
-    ]
-    if sys.platform != 'win32':
-      self._mocks.append(mock.patch('fcntl.fcntl'))
-
-  def __enter__(self):
-    for m in self._mocks:
-      m.__enter__()
-    return self.mock_proc
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    for m in reversed(self._mocks):
-      m.__exit__(exc_type, exc_val, exc_tb)
-
-
-class CmdHelperIterCmdOutputLinesTest(unittest.TestCase):
-  """Test IterCmdOutputLines with some calls to the unix 'seq' command."""
-
-  # This calls _IterCmdOutputLines rather than IterCmdOutputLines s.t. it
-  # can mock the process.
-  # pylint: disable=protected-access
-
-  _SIMPLE_OUTPUT_SEQUENCE = [
-      _ProcessOutputEvent(read_contents=b'1\n2\n'),
-  ]
-
-  def testIterCmdOutputLines_success(self):
-    with _MockProcess(
-        output_sequence=self._SIMPLE_OUTPUT_SEQUENCE) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-        self.assertEquals(num, int(line))
-
-  def testIterCmdOutputLines_unicode(self):
-    output_sequence = [
-        _ProcessOutputEvent(read_contents=b'\x80\x31\nHello\n\xE2\x98\xA0')
-    ]
-    with _MockProcess(output_sequence=output_sequence) as mock_proc:
-      lines = list(cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'))
-      self.assertEquals(lines[1], "Hello")
-
-  def testIterCmdOutputLines_exitStatusFail(self):
-    with self.assertRaises(subprocess.CalledProcessError):
-      with _MockProcess(
-          output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-          return_value=1) as mock_proc:
-        for num, line in enumerate(
-            cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-          self.assertEquals(num, int(line))
-        # after reading all the output we get an exit status of 1
-
-  def testIterCmdOutputLines_exitStatusIgnored(self):
-    with _MockProcess(
-        output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-        return_value=1) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(
-              mock_proc, 'mock_proc', check_status=False), 1):
-        self.assertEquals(num, int(line))
-
-  def testIterCmdOutputLines_exitStatusSkipped(self):
-    with _MockProcess(
-        output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-        return_value=1) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-        self.assertEquals(num, int(line))
-        # no exception will be raised because we don't attempt to read past
-        # the end of the output and, thus, the status never gets checked
-        if num == 2:
-          break
-
-  def testIterCmdOutputLines_delay(self):
-    output_sequence = [
-        _ProcessOutputEvent(read_contents=b'1\n2\n', ts=1),
-        _ProcessOutputEvent(read_contents=None, ts=2),
-        _ProcessOutputEvent(read_contents=b'Awake', ts=10),
-    ]
-    with _MockProcess(output_sequence=output_sequence) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(
-              mock_proc, 'mock_proc', iter_timeout=5), 1):
-        if num <= 2:
-          self.assertEquals(num, int(line))
-        elif num == 3:
-          self.assertEquals(None, line)
-        elif num == 4:
-          self.assertEquals('Awake', line)
-        else:
-          self.fail()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/utils/decorators.py b/systrace/catapult/devil/devil/utils/decorators.py
deleted file mode 100644
index 5d28610..0000000
--- a/systrace/catapult/devil/devil/utils/decorators.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2021 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import functools
-
-
-def Memoize(f):
-  """Decorator to cache return values of function."""
-  memoize_dict = {}
-  @functools.wraps(f)
-  def wrapper(*args, **kwargs):
-    key = repr((args, kwargs))
-    if key not in memoize_dict:
-      memoize_dict[key] = f(*args, **kwargs)
-    return memoize_dict[key]
-  return wrapper
diff --git a/systrace/catapult/devil/devil/utils/decorators_test.py b/systrace/catapult/devil/devil/utils/decorators_test.py
deleted file mode 100755
index f81974a..0000000
--- a/systrace/catapult/devil/devil/utils/decorators_test.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2021 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Unit tests for decorators.py."""
-
-import unittest
-
-from devil.utils import decorators
-
-
-class MemoizeDecoratorTest(unittest.TestCase):
-
-  def testFunctionExceptionNotMemoized(self):
-    """Tests that |Memoize| decorator does not cache exception results."""
-
-    class ExceptionType1(Exception):
-      pass
-
-    class ExceptionType2(Exception):
-      pass
-
-    @decorators.Memoize
-    def raiseExceptions():
-      if raiseExceptions.count == 0:
-        raiseExceptions.count += 1
-        raise ExceptionType1()
-
-      if raiseExceptions.count == 1:
-        raise ExceptionType2()
-    raiseExceptions.count = 0
-
-    with self.assertRaises(ExceptionType1):
-      raiseExceptions()
-    with self.assertRaises(ExceptionType2):
-      raiseExceptions()
-
-  def testFunctionResultMemoized(self):
-    """Tests that |Memoize| decorator caches results."""
-
-    @decorators.Memoize
-    def memoized():
-      memoized.count += 1
-      return memoized.count
-    memoized.count = 0
-
-    def notMemoized():
-      notMemoized.count += 1
-      return notMemoized.count
-    notMemoized.count = 0
-
-    self.assertEquals(memoized(), 1)
-    self.assertEquals(memoized(), 1)
-    self.assertEquals(memoized(), 1)
-
-    self.assertEquals(notMemoized(), 1)
-    self.assertEquals(notMemoized(), 2)
-    self.assertEquals(notMemoized(), 3)
-
-  def testFunctionMemoizedBasedOnArgs(self):
-    """Tests that |Memoize| caches results based on args and kwargs."""
-
-    @decorators.Memoize
-    def returnValueBasedOnArgsKwargs(a, k=0):
-      return a + k
-
-    self.assertEquals(returnValueBasedOnArgsKwargs(1, 1), 2)
-    self.assertEquals(returnValueBasedOnArgsKwargs(1, 2), 3)
-    self.assertEquals(returnValueBasedOnArgsKwargs(2, 1), 3)
-    self.assertEquals(returnValueBasedOnArgsKwargs(3, 3), 6)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/utils/file_utils.py b/systrace/catapult/devil/devil/utils/file_utils.py
deleted file mode 100644
index 6bc9e95..0000000
--- a/systrace/catapult/devil/devil/utils/file_utils.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-
-def MergeFiles(dest_file, source_files):
-  """Merge list of files into single destination file.
-
-  Args:
-    dest_file: File to be written to.
-    source_files: List of files to be merged. Will be merged in the order they
-        appear in the list.
-  """
-  if not os.path.exists(os.path.dirname(dest_file)):
-    os.makedirs(os.path.dirname(dest_file))
-  try:
-    with open(dest_file, 'w') as dest_f:
-      for source_file in source_files:
-        with open(source_file, 'r') as source_f:
-          dest_f.write(source_f.read())
-  except Exception as e:  # pylint: disable=broad-except
-    # Something went wrong when creating dest_file. Cleaning up.
-    try:
-      os.remove(dest_file)
-    except OSError:
-      pass
-    raise e
diff --git a/systrace/catapult/devil/devil/utils/find_usb_devices.py b/systrace/catapult/devil/devil/utils/find_usb_devices.py
deleted file mode 100755
index eb45a6c..0000000
--- a/systrace/catapult/devil/devil/utils/find_usb_devices.py
+++ /dev/null
@@ -1,552 +0,0 @@
-#!/usr/bin/python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
-
-from devil.utils import cmd_helper
-from devil.utils import usb_hubs
-from devil.utils import lsusb
-
-logger = logging.getLogger(__name__)
-
-# Note: In the documentation below, "virtual port" refers to the port number
-# as observed by the system (e.g. by usb-devices) and "physical port" refers
-# to the physical numerical label on the physical port e.g. on a USB hub.
-# The mapping between virtual and physical ports is not always the identity
-# (e.g. the port labeled "1" on a USB hub does not always show up as "port 1"
-# when you plug something into it) but, as far as we are aware, the mapping
-# between virtual and physical ports is always the same for a given
-# model of USB hub. When "port number" is referenced without specifying, it
-# means the virtual port number.
-
-
-# Wrapper functions for system commands to get output. These are in wrapper
-# functions so that they can be more easily mocked-out for tests.
-def _GetParsedLSUSBOutput():
-  return lsusb.lsusb()
-
-
-def _GetUSBDevicesOutput():
-  return cmd_helper.GetCmdOutput(['usb-devices'])
-
-
-def _GetTtyUSBInfo(tty_string):
-  cmd = ['udevadm', 'info', '--name=/dev/' + tty_string, '--attribute-walk']
-  return cmd_helper.GetCmdOutput(cmd)
-
-
-def _GetCommList():
-  return cmd_helper.GetCmdOutput('ls /dev', shell=True)
-
-
-def GetTTYList():
-  return [x for x in _GetCommList().splitlines() if 'ttyUSB' in x]
-
-
-# Class to identify nodes in the USB topology. USB topology is organized as
-# a tree.
-class USBNode(object):
-  def __init__(self):
-    self._port_to_node = {}
-
-  @property
-  def desc(self):
-    raise NotImplementedError
-
-  @property
-  def info(self):
-    raise NotImplementedError
-
-  @property
-  def device_num(self):
-    raise NotImplementedError
-
-  @property
-  def bus_num(self):
-    raise NotImplementedError
-
-  def HasPort(self, port):
-    """Determines if this device has a device connected to the given port."""
-    return port in self._port_to_node
-
-  def PortToDevice(self, port):
-    """Gets the device connected to the given port on this device."""
-    return self._port_to_node[port]
-
-  def Display(self, port_chain='', info=False):
-    """Displays information about this node and its descendants.
-
-    Output format is, e.g. 1:3:3:Device 42 (ID 1234:5678 Some Device)
-    meaning that from the bus, if you look at the device connected
-    to port 1, then the device connected to port 3 of that,
-    then the device connected to port 3 of that, you get the device
-    assigned device number 42, which is Some Device. Note that device
-    numbers will be reassigned whenever a connected device is powercycled
-    or reinserted, but port numbers stay the same as long as the device
-    is reinserted back into the same physical port.
-
-    Args:
-      port_chain: [string] Chain of ports from bus to this node (e.g. '2:4:')
-      info: [bool] Whether to display detailed info as well.
-    """
-    raise NotImplementedError
-
-  def AddChild(self, port, device):
-    """Adds child to the device tree.
-
-    Args:
-      port: [int] Port number of the device.
-      device: [USBDeviceNode] Device to add.
-
-    Raises:
-      ValueError: If device already has a child at the given port.
-    """
-    if self.HasPort(port):
-      raise ValueError('Duplicate port number')
-    else:
-      self._port_to_node[port] = device
-
-  def AllNodes(self):
-    """Generator that yields this node and all of its descendants.
-
-    Yields:
-      [USBNode] First this node, then each of its descendants (recursively)
-    """
-    yield self
-    for child_node in self._port_to_node.values():
-      for descendant_node in child_node.AllNodes():
-        yield descendant_node
-
-  def FindDeviceNumber(self, findnum):
-    """Find device with given number in tree
-
-    Searches the portion of the device tree rooted at this node for
-    a device with the given device number.
-
-    Args:
-      findnum: [int] Device number to search for.
-
-    Returns:
-      [USBDeviceNode] Node that is found.
-    """
-    for node in self.AllNodes():
-      if node.device_num == findnum:
-        return node
-    return None
-
-
-class USBDeviceNode(USBNode):
-  def __init__(self, bus_num=0, device_num=0, serial=None, info=None):
-    """Class that represents a device in USB tree.
-
-    Args:
-      bus_num: [int] Bus number that this node is attached to.
-      device_num: [int] Device number of this device (or 0, if this is a bus)
-      serial: [string] Serial number.
-      info: [dict] Map giving detailed device info.
-    """
-    super(USBDeviceNode, self).__init__()
-    self._bus_num = bus_num
-    self._device_num = device_num
-    self._serial = serial
-    self._info = {} if info is None else info
-
-  #override
-  @property
-  def desc(self):
-    return self._info.get('desc')
-
-  #override
-  @property
-  def info(self):
-    return self._info
-
-  #override
-  @property
-  def device_num(self):
-    return self._device_num
-
-  #override
-  @property
-  def bus_num(self):
-    return self._bus_num
-
-  @property
-  def serial(self):
-    return self._serial
-
-  @serial.setter
-  def serial(self, serial):
-    self._serial = serial
-
-  #override
-  def Display(self, port_chain='', info=False):
-    logger.info('%s Device %d (%s)', port_chain, self.device_num, self.desc)
-    if info:
-      logger.info('%s', self.info)
-    for (port, device) in self._port_to_node.iteritems():
-      device.Display('%s%d:' % (port_chain, port), info=info)
-
-
-class USBBusNode(USBNode):
-  def __init__(self, bus_num=0):
-    """Class that represents a node (either a bus or device) in USB tree.
-
-    Args:
-      is_bus: [bool] If true, node is bus; if not, node is device.
-      bus_num: [int] Bus number that this node is attached to.
-      device_num: [int] Device number of this device (or 0, if this is a bus)
-      desc: [string] Short description of device.
-      serial: [string] Serial number.
-      info: [dict] Map giving detailed device info.
-      port_to_dev: [dict(int:USBDeviceNode)]
-          Maps port # to device connected to port.
-    """
-    super(USBBusNode, self).__init__()
-    self._bus_num = bus_num
-
-  #override
-  @property
-  def desc(self):
-    return 'BUS %d' % self._bus_num
-
-  #override
-  @property
-  def info(self):
-    return {}
-
-  #override
-  @property
-  def device_num(self):
-    return -1
-
-  #override
-  @property
-  def bus_num(self):
-    return self._bus_num
-
-  #override
-  def Display(self, port_chain='', info=False):
-    logger.info('=== %s ===', self.desc)
-    for (port, device) in self._port_to_node.iteritems():
-      device.Display('%s%d:' % (port_chain, port), info=info)
-
-
-_T_LINE_REGEX = re.compile(r'T:  Bus=(?P<bus>\d{2}) Lev=(?P<lev>\d{2}) '
-                           r'Prnt=(?P<prnt>\d{2,3}) Port=(?P<port>\d{2}) '
-                           r'Cnt=(?P<cnt>\d{2}) Dev#=(?P<dev>.{3}) .*')
-
-_S_LINE_REGEX = re.compile(r'S:  SerialNumber=(?P<serial>.*)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
-
-
-def GetBusNumberToDeviceTreeMap(fast=True):
-  """Gets devices currently attached.
-
-  Args:
-    fast [bool]: whether to do it fast (only get description, not
-    the whole dictionary, from lsusb)
-
-  Returns:
-    map of {bus number: bus object}
-    where the bus object has all the devices attached to it in a tree.
-  """
-  if fast:
-    info_map = {}
-    for line in lsusb.raw_lsusb().splitlines():
-      match = _LSUSB_BUS_DEVICE_RE.match(line)
-      if match:
-        info_map[(int(match.group(1)), int(match.group(2)))] = ({
-            'desc': match.group(3)
-        })
-  else:
-    info_map = {((int(line['bus']), int(line['device']))): line
-                for line in _GetParsedLSUSBOutput()}
-
-  tree = {}
-  bus_num = -1
-  for line in _GetUSBDevicesOutput().splitlines():
-    match = _T_LINE_REGEX.match(line)
-    if match:
-      bus_num = int(match.group('bus'))
-      parent_num = int(match.group('prnt'))
-      # usb-devices starts counting ports from 0, so add 1
-      port_num = int(match.group('port')) + 1
-      device_num = int(match.group('dev'))
-
-      # create new bus if necessary
-      if bus_num not in tree:
-        tree[bus_num] = USBBusNode(bus_num=bus_num)
-
-      # create the new device
-      new_device = USBDeviceNode(
-          bus_num=bus_num,
-          device_num=device_num,
-          info=info_map.get((bus_num, device_num), {'desc': 'NOT AVAILABLE'}))
-
-      # add device to bus
-      if parent_num != 0:
-        tree[bus_num].FindDeviceNumber(parent_num).AddChild(
-            port_num, new_device)
-      else:
-        tree[bus_num].AddChild(port_num, new_device)
-
-    match = _S_LINE_REGEX.match(line)
-    if match:
-      if bus_num == -1:
-        raise ValueError('S line appears before T line in input file')
-      # put the serial number in the device
-      tree[bus_num].FindDeviceNumber(device_num).serial = match.group('serial')
-
-  return tree
-
-
-def GetHubsOnBus(bus, hub_types):
-  """Scans for all hubs on a bus of given hub types.
-
-  Args:
-    bus: [USBNode] Bus object.
-    hub_types: [iterable(usb_hubs.HubType)] Possible types of hubs.
-
-  Yields:
-    Sequence of tuples representing (hub, type of hub)
-  """
-  for device in bus.AllNodes():
-    for hub_type in hub_types:
-      if hub_type.IsType(device):
-        yield (device, hub_type)
-
-
-def GetPhysicalPortToNodeMap(hub, hub_type):
-  """Gets physical-port:node mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: node}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: device for (port, device) in port_device}
-
-
-def GetPhysicalPortToBusDeviceMap(hub, hub_type):
-  """Gets physical-port:(bus#, device#) mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: (bus number, device number)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {
-      port: (device.bus_num, device.device_num)
-      for (port, device) in port_device
-  }
-
-
-def GetPhysicalPortToSerialMap(hub, hub_type):
-  """Gets physical-port:serial# mapping for a given hub.
-
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: serial number)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {
-      port: device.serial
-      for (port, device) in port_device if device.serial
-  }
-
-
-def GetPhysicalPortToTTYMap(device, hub_type):
-  """Gets physical-port:tty-string mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: tty-string)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(device)
-  bus_device_to_tty = GetBusDeviceToTTYMap()
-  return {
-      port: bus_device_to_tty[(device.bus_num, device.device_num)]
-      for (port, device) in port_device
-      if (device.bus_num, device.device_num) in bus_device_to_tty
-  }
-
-
-def CollectHubMaps(hub_types, map_func, device_tree_map=None, fast=False):
-  """Runs a function on all hubs in the system and collects their output.
-
-  Args:
-    hub_types: [usb_hubs.HubType] List of possible hub types.
-    map_func: [string] Function to run on each hub.
-    device_tree: Previously constructed device tree map, if any.
-    fast: Whether to construct device tree fast, if not already provided
-
-  Yields:
-    Sequence of dicts of {physical port: device} where the type of
-    device depends on the ident keyword. Each dict is a separate hub.
-  """
-  if device_tree_map is None:
-    device_tree_map = GetBusNumberToDeviceTreeMap(fast=fast)
-  for bus in device_tree_map.values():
-    for (hub, hub_type) in GetHubsOnBus(bus, hub_types):
-      yield map_func(hub, hub_type)
-
-
-def GetAllPhysicalPortToNodeMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToNodeMap, **kwargs)
-
-
-def GetAllPhysicalPortToBusDeviceMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToBusDeviceMap, **kwargs)
-
-
-def GetAllPhysicalPortToSerialMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToSerialMap, **kwargs)
-
-
-def GetAllPhysicalPortToTTYMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToTTYMap, **kwargs)
-
-
-_BUS_NUM_REGEX = re.compile(r'.*ATTRS{busnum}=="(\d*)".*')
-_DEVICE_NUM_REGEX = re.compile(r'.*ATTRS{devnum}=="(\d*)".*')
-
-
-def GetBusDeviceFromTTY(tty_string):
-  """Gets bus and device number connected to a ttyUSB port.
-
-  Args:
-    tty_string: [String] Identifier for ttyUSB (e.g. 'ttyUSB0')
-
-  Returns:
-    Tuple (bus, device) giving device connected to that ttyUSB.
-
-  Raises:
-    ValueError: If bus and device information could not be found.
-  """
-  bus_num = None
-  device_num = None
-  # Expected output of GetCmdOutput should be something like:
-  # looking at device /devices/something/.../.../...
-  # KERNELS="ttyUSB0"
-  # SUBSYSTEMS=...
-  # DRIVERS=...
-  # ATTRS{foo}=...
-  # ATTRS{bar}=...
-  # ...
-  for line in _GetTtyUSBInfo(tty_string).splitlines():
-    bus_match = _BUS_NUM_REGEX.match(line)
-    device_match = _DEVICE_NUM_REGEX.match(line)
-    if bus_match and bus_num is None:
-      bus_num = int(bus_match.group(1))
-    if device_match and device_num is None:
-      device_num = int(device_match.group(1))
-  if bus_num is None or device_num is None:
-    raise ValueError('Info not found')
-  return (bus_num, device_num)
-
-
-def GetBusDeviceToTTYMap():
-  """Gets all mappings from (bus, device) to ttyUSB string.
-
-  Gets mapping from (bus, device) to ttyUSB string (e.g. 'ttyUSB0'),
-  for all ttyUSB strings currently active.
-
-  Returns:
-    [dict] Dict that maps (bus, device) to ttyUSB string
-  """
-  result = {}
-  for tty in GetTTYList():
-    result[GetBusDeviceFromTTY(tty)] = tty
-  return result
-
-
-# This dictionary described the mapping between physical and
-# virtual ports on a Plugable 7-Port Hub (model USB2-HUB7BC).
-# Keys are the virtual ports, values are the physical port.
-# The entry 4:{1:4, 2:3, 3:2, 4:1} indicates that virtual port
-# 4 connects to another 'virtual' hub that itself has the
-# virtual-to-physical port mapping {1:4, 2:3, 3:2, 4:1}.
-
-
-def TestUSBTopologyScript():
-  """Test display and hub identification."""
-  # The following makes logger.info behave pretty much like print
-  # during this test script.
-  logging.basicConfig(format='%(message)s', stream=sys.stdout)
-  logger.setLevel(logging.INFO)
-
-  # Identification criteria for Plugable 7-Port Hub
-  logger.info('==== USB TOPOLOGY SCRIPT TEST ====')
-  logger.info('')
-
-  # Display devices
-  logger.info('==== DEVICE DISPLAY ====')
-  device_trees = GetBusNumberToDeviceTreeMap()
-  for device_tree in device_trees.values():
-    device_tree.Display()
-  logger.info('')
-
-  # Display TTY information about devices plugged into hubs.
-  logger.info('==== TTY INFORMATION ====')
-  for port_map in GetAllPhysicalPortToTTYMaps(
-      usb_hubs.ALL_HUBS, device_tree_map=device_trees):
-    logger.info('%s', port_map)
-  logger.info('')
-
-  # Display serial number information about devices plugged into hubs.
-  logger.info('==== SERIAL NUMBER INFORMATION ====')
-  for port_map in GetAllPhysicalPortToSerialMaps(
-      usb_hubs.ALL_HUBS, device_tree_map=device_trees):
-    logger.info('%s', port_map)
-
-  return 0
-
-
-def parse_options(argv):
-  """Parses and checks the command-line options.
-
-  Returns:
-    A tuple containing the options structure and a list of categories to
-    be traced.
-  """
-  USAGE = '''./find_usb_devices [--help]
-    This script shows the mapping between USB devices and port numbers.
-    Clients are not intended to call this script from the command line.
-    Clients are intended to call the functions in this script directly.
-    For instance, GetAllPhysicalPortToSerialMaps(...)
-    Running this script with --help will display this message.
-    Running this script without --help will display information about
-    devices attached, TTY mapping, and serial number mapping,
-    for testing purposes. See design document for API documentation.
-  '''
-  parser = argparse.ArgumentParser(usage=USAGE)
-  return parser.parse_args(argv[1:])
-
-
-def main():
-  parse_options(sys.argv)
-  TestUSBTopologyScript()
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/utils/find_usb_devices_test.py b/systrace/catapult/devil/devil/utils/find_usb_devices_test.py
deleted file mode 100755
index a8620b6..0000000
--- a/systrace/catapult/devil/devil/utils/find_usb_devices_test.py
+++ /dev/null
@@ -1,294 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=protected-access
-"""
-Unit tests for the contents of find_usb_devices.py.
-
-Device tree for these tests is as follows:
-Bus 001:
-1: Device 011 "foo"
-2: Device 012 "bar"
-3: Device 013 "baz"
-
-Bus 002:
-1: Device 011 "quux"
-2: Device 020 "My Test HUB" #hub 1
-2:1: Device 021 "usb_device_p7_h1_t0" #physical port 7 on hub 1, on ttyUSB0
-2:3: Device 022 "usb_device_p5_h1_t1" #physical port 5 on hub 1, on ttyUSB1
-2:4: Device 023 "My Test Internal HUB" #internal section of hub 1
-2:4:2: Device 024 "usb_device_p3_h1_t2" #physical port 3 on hub 1, on ttyUSB2
-2:4:3: Device 026 "Not a Battery Monitor" #physical port 1 on hub 1, on ttyUSB3
-2:4:4: Device 025 "usb_device_p1_h1_t3" #physical port 1 on hub 1, on ttyUSB3
-3: Device 100 "My Test HUB" #hub 2
-3:4: Device 101 "My Test Internal HUB" #internal section of hub 2
-3:4:4: Device 102 "usb_device_p1_h2_t4" #physical port 1 on hub 2, on ttyusb4
-"""
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.utils import find_usb_devices
-from devil.utils import lsusb
-from devil.utils import usb_hubs
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-# Output of lsusb.lsusb().
-# We just test that the dictionary is working by creating an
-# "ID number" equal to (bus_num*1000)+device_num and seeing if
-# it is picked up correctly. Also we test the description
-
-DEVLIST = [(1, 11, 'foo'), (1, 12, 'bar'), (1, 13, 'baz'), (2, 11, 'quux'),
-           (2, 20, 'My Test HUB'), (2, 21, 'ID 0403:6001 usb_device_p7_h1_t0'),
-           (2, 22, 'ID 0403:6001 usb_device_p5_h1_t1'),
-           (2, 23, 'My Test Internal HUB'),
-           (2, 24, 'ID 0403:6001 usb_device_p3_h1_t2'),
-           (2, 25, 'ID 0403:6001 usb_device_p1_h1_t3'),
-           (2, 26, 'Not a Battery Monitor'), (2, 100, 'My Test HUB'),
-           (2, 101, 'My Test Internal HUB'),
-           (2, 102, 'ID 0403:6001 usb_device_p1_h1_t4')]
-
-LSUSB_OUTPUT = [{
-    'bus': b,
-    'device': d,
-    'desc': t,
-    'id': (1000 * b) + d
-} for (b, d, t) in DEVLIST]
-
-# Note: "Lev", "Cnt", "Spd", and "MxCh" are not used by parser,
-# so we just leave them as zeros here. Also note that the port
-# numbers reported here start at 0, so they're 1 less than the
-# port numbers reported elsewhere.
-USB_DEVICES_OUTPUT = '''
-T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
-S:  SerialNumber=FooSerial
-T:  Bus=01 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 12 Spd=000 MxCh=00
-S:  SerialNumber=BarSerial
-T:  Bus=01 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#= 13 Spd=000 MxCh=00
-S:  SerialNumber=BazSerial
-
-T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
-
-T:  Bus=02 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 20 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=20 Port=00 Cnt=00 Dev#= 21 Spd=000 MxCh=00
-S:  SerialNumber=UsbDevice0
-T:  Bus=02 Lev=00 Prnt=20 Port=02 Cnt=00 Dev#= 22 Spd=000 MxCh=00
-S:  SerialNumber=UsbDevice1
-T:  Bus=02 Lev=00 Prnt=20 Port=03 Cnt=00 Dev#= 23 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=23 Port=01 Cnt=00 Dev#= 24 Spd=000 MxCh=00
-S:  SerialNumber=UsbDevice2
-T:  Bus=02 Lev=00 Prnt=23 Port=03 Cnt=00 Dev#= 25 Spd=000 MxCh=00
-S:  SerialNumber=UsbDevice3
-T:  Bus=02 Lev=00 Prnt=23 Port=02 Cnt=00 Dev#= 26 Spd=000 MxCh=00
-
-T:  Bus=02 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#=100 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=100 Port=03 Cnt=00 Dev#=101 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=101 Port=03 Cnt=00 Dev#=102 Spd=000 MxCh=00
-'''
-
-RAW_LSUSB_OUTPUT = '''
-Bus 001 Device 011: FAST foo
-Bus 001 Device 012: FAST bar
-Bus 001 Device 013: baz
-Bus 002 Device 011: quux
-Bus 002 Device 020: My Test HUB
-Bus 002 Device 021: ID 0403:6001 usb_device_p7_h1_t0
-Bus 002 Device 022: ID 0403:6001 usb_device_p5_h1_t1
-Bus 002 Device 023: My Test Internal HUB
-Bus 002 Device 024: ID 0403:6001 usb_device_p3_h1_t2
-Bus 002 Device 025: ID 0403:6001 usb_device_p1_h1_t3
-Bus 002 Device 026: Not a Battery Monitor
-Bus 002 Device 100: My Test HUB
-Bus 002 Device 101: My Test Internal HUB
-Bus 002 Device 102: ID 0403:6001 usb_device_p1_h1_t4
-'''
-
-LIST_TTY_OUTPUT = '''
-ttyUSB0
-Something-else-0
-ttyUSB1
-ttyUSB2
-Something-else-1
-ttyUSB3
-ttyUSB4
-Something-else-2
-ttyUSB5
-'''
-
-# Note: The real output will have multiple lines with
-# ATTRS{busnum} and ATTRS{devnum}, but only the first
-# one counts. Thus the test output duplicates this.
-UDEVADM_USBTTY0_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="21"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY1_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="22"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY2_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="24"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY3_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="25"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY4_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="102"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY5_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="26"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_OUTPUT_DICT = {
-    'ttyUSB0': UDEVADM_USBTTY0_OUTPUT,
-    'ttyUSB1': UDEVADM_USBTTY1_OUTPUT,
-    'ttyUSB2': UDEVADM_USBTTY2_OUTPUT,
-    'ttyUSB3': UDEVADM_USBTTY3_OUTPUT,
-    'ttyUSB4': UDEVADM_USBTTY4_OUTPUT,
-    'ttyUSB5': UDEVADM_USBTTY5_OUTPUT
-}
-
-
-# Identification criteria for Plugable 7-Port Hub
-def isTestHub(node):
-  """Check if a node is a Plugable 7-Port Hub
-  (Model USB2-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if not isinstance(node, find_usb_devices.USBDeviceNode):
-    return False
-  if 'Test HUB' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return 'Test Internal HUB' in node.PortToDevice(4).desc
-
-
-TEST_HUB = usb_hubs.HubType(isTestHub, {
-    1: 7,
-    2: 6,
-    3: 5,
-    4: {
-        1: 4,
-        2: 3,
-        3: 2,
-        4: 1
-    }
-})
-
-
-class USBScriptTest(unittest.TestCase):
-  def setUp(self):
-    find_usb_devices._GetTtyUSBInfo = mock.Mock(
-        side_effect=lambda x: UDEVADM_OUTPUT_DICT[x])
-    find_usb_devices._GetParsedLSUSBOutput = mock.Mock(
-        return_value=LSUSB_OUTPUT)
-    find_usb_devices._GetUSBDevicesOutput = mock.Mock(
-        return_value=USB_DEVICES_OUTPUT)
-    find_usb_devices._GetCommList = mock.Mock(return_value=LIST_TTY_OUTPUT)
-    lsusb.raw_lsusb = mock.Mock(return_value=RAW_LSUSB_OUTPUT)
-
-  def testGetTTYDevices(self):
-    pp = find_usb_devices.GetAllPhysicalPortToTTYMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {
-        7: 'ttyUSB0',
-        5: 'ttyUSB1',
-        3: 'ttyUSB2',
-        2: 'ttyUSB5',
-        1: 'ttyUSB3'
-    })
-    self.assertEquals(result[1], {1: 'ttyUSB4'})
-
-  def testGetPortDeviceMapping(self):
-    pp = find_usb_devices.GetAllPhysicalPortToBusDeviceMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {
-        7: (2, 21),
-        5: (2, 22),
-        3: (2, 24),
-        2: (2, 26),
-        1: (2, 25)
-    })
-    self.assertEquals(result[1], {1: (2, 102)})
-
-  def testGetSerialMapping(self):
-    pp = find_usb_devices.GetAllPhysicalPortToSerialMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {
-        7: 'UsbDevice0',
-        5: 'UsbDevice1',
-        3: 'UsbDevice2',
-        1: 'UsbDevice3'
-    })
-    self.assertEquals(result[1], {})
-
-  def testFastDeviceDescriptions(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_usb_device_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.desc, 'FAST foo')
-    self.assertEquals(dev_bar.desc, 'FAST bar')
-    self.assertEquals(dev_usb_device_p7_h1_t0.desc,
-                      'ID 0403:6001 usb_device_p7_h1_t0')
-
-  def testDeviceDescriptions(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_usb_device_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.desc, 'foo')
-    self.assertEquals(dev_bar.desc, 'bar')
-    self.assertEquals(dev_usb_device_p7_h1_t0.desc,
-                      'ID 0403:6001 usb_device_p7_h1_t0')
-
-  def testDeviceInformation(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_usb_device_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.info['id'], 1011)
-    self.assertEquals(dev_bar.info['id'], 1012)
-    self.assertEquals(dev_usb_device_p7_h1_t0.info['id'], 2021)
-
-  def testSerialNumber(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_usb_device_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.serial, 'FooSerial')
-    self.assertEquals(dev_bar.serial, 'BarSerial')
-    self.assertEquals(dev_usb_device_p7_h1_t0.serial, 'UsbDevice0')
-
-
-if __name__ == "__main__":
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/utils/geometry.py b/systrace/catapult/devil/devil/utils/geometry.py
deleted file mode 100644
index 6da6d03..0000000
--- a/systrace/catapult/devil/devil/utils/geometry.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Objects for convenient manipulation of points and other surface areas."""
-
-import collections
-
-
-class Point(collections.namedtuple('Point', ['x', 'y'])):
-  """Object to represent an (x, y) point on a surface.
-
-  Args:
-    x, y: Two numeric coordinates that define the point.
-  """
-  __slots__ = ()
-
-  def __str__(self):
-    """Get a useful string representation of the object."""
-    return '(%s, %s)' % (self.x, self.y)
-
-  def __add__(self, other):
-    """Sum of two points, e.g. p + q."""
-    if isinstance(other, Point):
-      return Point(self.x + other.x, self.y + other.y)
-    else:
-      return NotImplemented
-
-  def __mul__(self, factor):
-    """Multiplication on the right is not implemented."""
-    # This overrides the default behaviour of a tuple multiplied by a constant
-    # on the right, which does not make sense for a Point.
-    return NotImplemented
-
-  def __rmul__(self, factor):
-    """Multiply a point by a scalar factor on the left, e.g. 2 * p."""
-    return Point(factor * self.x, factor * self.y)
-
-
-class Rectangle(
-    collections.namedtuple('Rectangle', ['top_left', 'bottom_right'])):
-  """Object to represent a rectangle on a surface.
-
-  Args:
-    top_left: A pair of (left, top) coordinates. Might be given as a Point
-      or as a two-element sequence (list, tuple, etc.).
-    bottom_right: A pair (right, bottom) coordinates.
-  """
-  __slots__ = ()
-
-  def __new__(cls, top_left, bottom_right):
-    if not isinstance(top_left, Point):
-      top_left = Point(*top_left)
-    if not isinstance(bottom_right, Point):
-      bottom_right = Point(*bottom_right)
-    return super(Rectangle, cls).__new__(cls, top_left, bottom_right)
-
-  def __str__(self):
-    """Get a useful string representation of the object."""
-    return '[%s, %s]' % (self.top_left, self.bottom_right)
-
-  @property
-  def center(self):
-    """Get the point at the center of the rectangle."""
-    return 0.5 * (self.top_left + self.bottom_right)
-
-  @classmethod
-  def FromDict(cls, d):
-    """Create a rectangle object from a dictionary.
-
-    Args:
-      d: A dictionary (or mapping) of the form, e.g., {'top': 0, 'left': 0,
-         'bottom': 1, 'right': 1}.
-    """
-    return cls(Point(d['left'], d['top']), Point(d['right'], d['bottom']))
diff --git a/systrace/catapult/devil/devil/utils/geometry_test.py b/systrace/catapult/devil/devil/utils/geometry_test.py
deleted file mode 100644
index e202482..0000000
--- a/systrace/catapult/devil/devil/utils/geometry_test.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Tests for the geometry module."""
-
-import unittest
-
-from devil.utils import geometry as g
-
-
-class PointTest(unittest.TestCase):
-  def testStr(self):
-    p = g.Point(1, 2)
-    self.assertEquals(str(p), '(1, 2)')
-
-  def testAdd(self):
-    p = g.Point(1, 2)
-    q = g.Point(3, 4)
-    r = g.Point(4, 6)
-    self.assertEquals(p + q, r)
-
-  def testAdd_TypeErrorWithInvalidOperands(self):
-    # pylint: disable=pointless-statement
-    p = g.Point(1, 2)
-    with self.assertRaises(TypeError):
-      p + 4  # Can't add point and scalar.
-    with self.assertRaises(TypeError):
-      4 + p  # Can't add scalar and point.
-
-  def testMult(self):
-    p = g.Point(1, 2)
-    r = g.Point(2, 4)
-    self.assertEquals(2 * p, r)  # Multiply by scalar on the left.
-
-  def testMult_TypeErrorWithInvalidOperands(self):
-    # pylint: disable=pointless-statement
-    p = g.Point(1, 2)
-    q = g.Point(2, 4)
-    with self.assertRaises(TypeError):
-      p * q  # Can't multiply points.
-    with self.assertRaises(TypeError):
-      p * 4  # Can't multiply by a scalar on the right.
-
-
-class RectangleTest(unittest.TestCase):
-  def testStr(self):
-    r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    self.assertEquals(str(r), '[(0, 1), (2, 3)]')
-
-  def testCenter(self):
-    r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    c = g.Point(1, 2)
-    self.assertEquals(r.center, c)
-
-  def testFromJson(self):
-    r1 = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    r2 = g.Rectangle.FromDict({'top': 1, 'left': 0, 'bottom': 3, 'right': 2})
-    self.assertEquals(r1, r2)
diff --git a/systrace/catapult/devil/devil/utils/host_utils.py b/systrace/catapult/devil/devil/utils/host_utils.py
deleted file mode 100644
index 2918e06..0000000
--- a/systrace/catapult/devil/devil/utils/host_utils.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import os
-
-
-def GetRecursiveDiskUsage(path):
-  """Returns the disk usage in bytes of |path|. Similar to `du -sb |path|`."""
-
-  def get_size(filepath):
-    try:
-      return os.path.getsize(filepath)
-    except OSError:
-      logging.warning('File or directory no longer found: %s', filepath)
-      return 0
-
-  running_size = get_size(path)
-  if os.path.isdir(path):
-    for root, dirs, files in os.walk(path):
-      running_size += sum(
-          [get_size(os.path.join(root, f)) for f in files + dirs])
-  return running_size
diff --git a/systrace/catapult/devil/devil/utils/lazy/__init__.py b/systrace/catapult/devil/devil/utils/lazy/__init__.py
deleted file mode 100644
index 3cc56c0..0000000
--- a/systrace/catapult/devil/devil/utils/lazy/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from devil.utils.lazy.weak_constant import WeakConstant
diff --git a/systrace/catapult/devil/devil/utils/lazy/weak_constant.py b/systrace/catapult/devil/devil/utils/lazy/weak_constant.py
deleted file mode 100644
index 4110193..0000000
--- a/systrace/catapult/devil/devil/utils/lazy/weak_constant.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import threading
-
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-
-class WeakConstant(object):
-  """A thread-safe, lazily initialized object.
-
-  This does not support modification after initialization. The intended
-  constant nature of the object is not enforced, though, hence the "weak".
-  """
-
-  def __init__(self, initializer):
-    self._initialized = threading.Event()
-    self._initializer = initializer
-    self._lock = threading.Lock()
-    self._val = None
-
-  def read(self):
-    """Get the object, creating it if necessary."""
-    if self._initialized.is_set():
-      return self._val
-    with self._lock:
-      if not self._initialized.is_set():
-        # We initialize the value on a separate thread to protect
-        # from holding self._lock indefinitely in the event that
-        # self._initializer hangs.
-        initializer_thread = reraiser_thread.ReraiserThread(self._initializer)
-        initializer_thread.start()
-        timeout_retry.WaitFor(
-            lambda: initializer_thread.join(1) or not initializer_thread.
-            isAlive(),
-            wait_period=0)
-        self._val = initializer_thread.GetReturnValue()
-        self._initialized.set()
-
-    return self._val
diff --git a/systrace/catapult/devil/devil/utils/lazy/weak_constant_test.py b/systrace/catapult/devil/devil/utils/lazy/weak_constant_test.py
deleted file mode 100644
index 583fd07..0000000
--- a/systrace/catapult/devil/devil/utils/lazy/weak_constant_test.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=protected-access
-
-import time
-import unittest
-
-from devil import devil_env
-from devil.utils import lazy
-from devil.utils import timeout_retry
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock
-
-
-class DynamicSideEffect(object):
-  """A helper object for handling a sequence of single-use side effects."""
-
-  def __init__(self, side_effects):
-    self._side_effects = iter(side_effects or [])
-
-  def __call__(self):
-    val = next(self._side_effects)()
-    if isinstance(val, Exception):
-      raise val
-    return val
-
-
-class WeakConstantTest(unittest.TestCase):
-  def testUninitialized(self):
-    """Ensure that the first read calls the initializer."""
-    initializer = mock.Mock(return_value='initializer called')
-    test_constant = lazy.WeakConstant(initializer)
-    self.assertEquals('initializer called', test_constant.read())
-    initializer.assert_called_once_with()
-
-  def testInitialized(self):
-    """Ensure that reading doesn't reinitialize the value."""
-    initializer = mock.Mock(return_value='initializer called')
-    test_constant = lazy.WeakConstant(initializer)
-    test_constant._initialized.set()
-    test_constant._val = 'initializer not called'
-    self.assertEquals('initializer not called', test_constant.read())
-    self.assertFalse(initializer.mock_calls)  # assert not called
-
-  def testFirstCallHangs(self):
-    """Ensure that reading works even if the first initializer call hangs."""
-    dyn = DynamicSideEffect(
-        [lambda: time.sleep(10), lambda: 'second try worked!'])
-
-    initializer = mock.Mock(side_effect=dyn)
-    test_constant = lazy.WeakConstant(initializer)
-    self.assertEquals('second try worked!',
-                      timeout_retry.Run(test_constant.read, 1, 1))
-    initializer.assert_has_calls([mock.call(), mock.call()])
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/utils/logging_common.py b/systrace/catapult/devil/devil/utils/logging_common.py
deleted file mode 100644
index 3df7aab..0000000
--- a/systrace/catapult/devil/devil/utils/logging_common.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import sys
-import time
-
-
-def AddLoggingArguments(parser):
-  """Adds standard logging flags to the parser.
-
-  After parsing args, remember to invoke InitializeLogging() with the parsed
-  args, to configure the log level.
-  """
-  group = parser.add_mutually_exclusive_group()
-  group.add_argument(
-      '-v',
-      '--verbose',
-      action='count',
-      default=0,
-      help='Log more. Use multiple times for even more logging.')
-  group.add_argument(
-      '-q',
-      '--quiet',
-      action='count',
-      default=0,
-      help=('Log less (suppress output). Use multiple times for even less '
-            'output.'))
-
-
-def InitializeLogging(args, handler=None):
-  """Initialized the log level based on commandline flags.
-
-  This expects to be given an "args" object with the options defined by
-  AddLoggingArguments().
-  """
-  if args.quiet >= 2:
-    log_level = logging.CRITICAL
-  elif args.quiet == 1:
-    log_level = logging.ERROR
-  elif args.verbose == 0:
-    log_level = logging.WARNING
-  elif args.verbose == 1:
-    log_level = logging.INFO
-  else:
-    log_level = logging.DEBUG
-  logger = logging.getLogger()
-  logger.setLevel(log_level)
-  if not handler:
-    handler = logging.StreamHandler(sys.stdout)
-    handler.setFormatter(CustomFormatter())
-  logger.addHandler(handler)
-
-
-class CustomFormatter(logging.Formatter):
-  """Custom log formatter."""
-
-  # override
-  def __init__(self, fmt='%(threadName)-4s  %(message)s'):
-    # Can't use super() because in older Python versions logging.Formatter does
-    # not inherit from object.
-    logging.Formatter.__init__(self, fmt=fmt)
-    self._creation_time = time.time()
-
-  # override
-  def format(self, record):
-    # Can't use super() because in older Python versions logging.Formatter does
-    # not inherit from object.
-    msg = logging.Formatter.format(self, record)
-    if 'MainThread' in msg[:19]:
-      msg = msg.replace('MainThread', 'Main', 1)
-    timediff = time.time() - self._creation_time
-    return '%s %8.3fs %s' % (record.levelname[0], timediff, msg)
diff --git a/systrace/catapult/devil/devil/utils/lsusb.py b/systrace/catapult/devil/devil/utils/lsusb.py
deleted file mode 100644
index dd5d471..0000000
--- a/systrace/catapult/devil/devil/utils/lsusb.py
+++ /dev/null
@@ -1,176 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import re
-
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-_COULDNT_OPEN_ERROR_RE = re.compile(r'Couldn\'t open device.*')
-_INDENTATION_RE = re.compile(r'^( *)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
-_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
-_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
-
-
-def _lsusbv_on_device(bus_id, dev_id):
-  """Calls lsusb -v on device."""
-  _, raw_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-      ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=10)
-
-  device = {'bus': bus_id, 'device': dev_id}
-  depth_stack = [device]
-
-  # This builds a nested dict -- a tree, basically -- that corresponds
-  # to the lsusb output. It looks first for a line containing
-  #
-  #   "Bus <bus number> Device <device number>: ..."
-  #
-  # and uses that to create the root node. It then parses all remaining
-  # lines as a tree, with the indentation level determining the
-  # depth of the new node.
-  #
-  # This expects two kinds of lines:
-  #   - "groups", which take the form
-  #       "<Group name>:"
-  #     and typically have children, and
-  #   - "entries", which take the form
-  #       "<entry name>   <entry value>  <possible entry description>"
-  #     and typically do not have children (but can).
-  #
-  # This maintains a stack containing all current ancestor nodes in
-  # order to add new nodes to the proper place in the tree.
-  # The stack is added to when a new node is parsed. Nodes are removed
-  # from the stack when they are either at the same indentation level as
-  # or a deeper indentation level than the current line.
-  #
-  # e.g. the following lsusb output:
-  #
-  # Bus 123 Device 456: School bus
-  # Device Descriptor:
-  #   bDeviceClass 5 Actual School Bus
-  #   Configuration Descriptor:
-  #     bLength 20 Rows
-  #
-  # would produce the following dict:
-  #
-  # {
-  #   'bus': 123,
-  #   'device': 456,
-  #   'desc': 'School bus',
-  #   'Device Descriptor': {
-  #     'bDeviceClass': {
-  #       '_value': '5',
-  #       '_desc': 'Actual School Bus',
-  #     },
-  #     'Configuration Descriptor': {
-  #       'bLength': {
-  #         '_value': '20',
-  #         '_desc': 'Rows',
-  #       },
-  #     },
-  #   }
-  # }
-  for line in raw_output.splitlines():
-    # Ignore blank lines.
-    if not line:
-      continue
-    # Filter out error mesage about opening device.
-    if _COULDNT_OPEN_ERROR_RE.match(line):
-      continue
-    # Find start of device information.
-    m = _LSUSB_BUS_DEVICE_RE.match(line)
-    if m:
-      if m.group(1) != bus_id:
-        logger.warning('Expected bus_id value: %r, seen %r', bus_id, m.group(1))
-      if m.group(2) != dev_id:
-        logger.warning('Expected dev_id value: %r, seen %r', dev_id, m.group(2))
-      device['desc'] = m.group(3)
-      continue
-
-    # Skip any lines that aren't indented, as they're not part of the
-    # device descriptor.
-    indent_match = _INDENTATION_RE.match(line)
-    if not indent_match:
-      continue
-
-    # Determine the indentation depth.
-    depth = 1 + len(indent_match.group(1)) / 2
-    if depth > len(depth_stack):
-      logger.error('lsusb parsing error: unexpected indentation: "%s"', line)
-      continue
-
-    # Pop everything off the depth stack that isn't a parent of
-    # this element.
-    while depth < len(depth_stack):
-      depth_stack.pop()
-
-    cur = depth_stack[-1]
-
-    m = _LSUSB_GROUP_RE.match(line)
-    if m:
-      new_group = {}
-      cur[m.group(1)] = new_group
-      depth_stack.append(new_group)
-      continue
-
-    m = _LSUSB_ENTRY_RE.match(line)
-    if m:
-      new_entry = {
-          '_value': m.group(2),
-          '_desc': m.group(3),
-      }
-      cur[m.group(1)] = new_entry
-      depth_stack.append(new_entry)
-      continue
-
-    logger.error('lsusb parsing error: unrecognized line: "%s"', line)
-
-  return device
-
-
-def lsusb():
-  """Call lsusb and return the parsed output."""
-  _, lsusb_list_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(['lsusb'],
-                                                                     timeout=10)
-  devices = []
-  for line in lsusb_list_output.splitlines():
-    m = _LSUSB_BUS_DEVICE_RE.match(line)
-    if m:
-      bus_num = m.group(1)
-      dev_num = m.group(2)
-      try:
-        devices.append(_lsusbv_on_device(bus_num, dev_num))
-      except cmd_helper.TimeoutError:
-        # Will be denylisted if it is in expected device file, but times out.
-        logger.info('lsusb -v %s:%s timed out.', bus_num, dev_num)
-  return devices
-
-
-def raw_lsusb():
-  return cmd_helper.GetCmdOutput(['lsusb'])
-
-
-def get_lsusb_serial(device):
-  try:
-    return device['Device Descriptor']['iSerial']['_desc']
-  except KeyError:
-    return None
-
-
-def _is_android_device(device):
-  try:
-    # Hubs are not android devices.
-    if device['Device Descriptor']['bDeviceClass']['_value'] == '9':
-      return False
-  except KeyError:
-    pass
-  return get_lsusb_serial(device) is not None
-
-
-def get_android_devices():
-  android_devices = (d for d in lsusb() if _is_android_device(d))
-  return [get_lsusb_serial(d) for d in android_devices]
diff --git a/systrace/catapult/devil/devil/utils/lsusb_test.py b/systrace/catapult/devil/devil/utils/lsusb_test.py
deleted file mode 100755
index 6a870d1..0000000
--- a/systrace/catapult/devil/devil/utils/lsusb_test.py
+++ /dev/null
@@ -1,378 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Tests for the cmd_helper module."""
-
-import unittest
-
-from devil import devil_env
-from devil.utils import lsusb
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-RAW_OUTPUT = """
-Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
-Device Descriptor:
-  bLength                18
-  bDescriptorType         1
-  bcdUSB               2.00
-  bDeviceClass            0 (Defined at Interface level)
-  bDeviceSubClass         0
-  bDeviceProtocol         0
-  bMaxPacketSize0        64
-  idVendor           0x18d1 Google Inc.
-  idProduct          0x4ee2 Nexus 4 (debug)
-  bcdDevice            2.28
-  iManufacturer           1 LGE
-  iProduct                2 Nexus 4
-  iSerial                 3 01d2450ea194a93b
-  bNumConfigurations      1
-  Configuration Descriptor:
-    bLength                 9
-    bDescriptorType         2
-    wTotalLength           62
-    bNumInterfaces          2
-    bConfigurationValue     1
-    iConfiguration          0
-    bmAttributes         0x80
-      (Bus Powered)
-    MaxPower              500mA
-    Interface Descriptor:
-      bLength                 9
-      bDescriptorType         4
-      bInterfaceNumber        0
-      bAlternateSetting       0
-      bNumEndpoints           3
-      bInterfaceClass       255 Vendor Specific Class
-      bInterfaceSubClass    255 Vendor Specific Subclass
-      bInterfaceProtocol      0
-      iInterface              4 MTP
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x81  EP 1 IN
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x01  EP 1 OUT
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x82  EP 2 IN
-        bmAttributes            3
-          Transfer Type            Interrupt
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x001c  1x 28 bytes
-        bInterval               6
-    Interface Descriptor:
-      bLength                 9
-      bDescriptorType         4
-      bInterfaceNumber        1
-      bAlternateSetting       0
-      bNumEndpoints           2
-      bInterfaceClass       255 Vendor Specific Class
-      bInterfaceSubClass     66
-      bInterfaceProtocol      1
-      iInterface              0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x83  EP 3 IN
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x02  EP 2 OUT
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-Device Qualifier (for other device speed):
-  bLength                10
-  bDescriptorType         6
-  bcdUSB               2.00
-  bDeviceClass            0 (Defined at Interface level)
-  bDeviceSubClass         0
-  bDeviceProtocol         0
-  bMaxPacketSize0        64
-  bNumConfigurations      1
-Device Status:     0x0000
-  (Bus Powered)
-"""
-DEVICE_LIST = 'Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)'
-
-EXPECTED_RESULT = {
-    'device': '007',
-    'bus': '003',
-    'desc': 'ID 18d1:4ee2 Google Inc. Nexus 4 (debug)',
-    'Device': {
-        '_value': 'Status:',
-        '_desc': '0x0000',
-        '(Bus': {
-            '_value': 'Powered)',
-            '_desc': None
-        }
-    },
-    'Device Descriptor': {
-        'bLength': {
-            '_value': '18',
-            '_desc': None
-        },
-        'bcdDevice': {
-            '_value': '2.28',
-            '_desc': None
-        },
-        'bDeviceSubClass': {
-            '_value': '0',
-            '_desc': None
-        },
-        'idVendor': {
-            '_value': '0x18d1',
-            '_desc': 'Google Inc.'
-        },
-        'bcdUSB': {
-            '_value': '2.00',
-            '_desc': None
-        },
-        'bDeviceProtocol': {
-            '_value': '0',
-            '_desc': None
-        },
-        'bDescriptorType': {
-            '_value': '1',
-            '_desc': None
-        },
-        'Configuration Descriptor': {
-            'bLength': {
-                '_value': '9',
-                '_desc': None
-            },
-            'wTotalLength': {
-                '_value': '62',
-                '_desc': None
-            },
-            'bConfigurationValue': {
-                '_value': '1',
-                '_desc': None
-            },
-            'Interface Descriptor': {
-                'bLength': {
-                    '_value': '9',
-                    '_desc': None
-                },
-                'bAlternateSetting': {
-                    '_value': '0',
-                    '_desc': None
-                },
-                'bInterfaceNumber': {
-                    '_value': '1',
-                    '_desc': None
-                },
-                'bNumEndpoints': {
-                    '_value': '2',
-                    '_desc': None
-                },
-                'bDescriptorType': {
-                    '_value': '4',
-                    '_desc': None
-                },
-                'bInterfaceSubClass': {
-                    '_value': '66',
-                    '_desc': None
-                },
-                'bInterfaceClass': {
-                    '_value': '255',
-                    '_desc': 'Vendor Specific Class'
-                },
-                'bInterfaceProtocol': {
-                    '_value': '1',
-                    '_desc': None
-                },
-                'Endpoint Descriptor': {
-                    'bLength': {
-                        '_value': '7',
-                        '_desc': None
-                    },
-                    'bEndpointAddress': {
-                        '_value': '0x02',
-                        '_desc': 'EP 2 OUT'
-                    },
-                    'bInterval': {
-                        '_value': '0',
-                        '_desc': None
-                    },
-                    'bDescriptorType': {
-                        '_value': '5',
-                        '_desc': None
-                    },
-                    'bmAttributes': {
-                        '_value': '2',
-                        'Transfer': {
-                            '_value': 'Type',
-                            '_desc': 'Bulk'
-                        },
-                        'Usage': {
-                            '_value': 'Type',
-                            '_desc': 'Data'
-                        },
-                        '_desc': None,
-                        'Synch': {
-                            '_value': 'Type',
-                            '_desc': 'None'
-                        }
-                    },
-                    'wMaxPacketSize': {
-                        '_value': '0x0040',
-                        '_desc': '1x 64 bytes'
-                    }
-                },
-                'iInterface': {
-                    '_value': '0',
-                    '_desc': None
-                }
-            },
-            'bDescriptorType': {
-                '_value': '2',
-                '_desc': None
-            },
-            'iConfiguration': {
-                '_value': '0',
-                '_desc': None
-            },
-            'bmAttributes': {
-                '_value': '0x80',
-                '_desc': None,
-                '(Bus': {
-                    '_value': 'Powered)',
-                    '_desc': None
-                }
-            },
-            'bNumInterfaces': {
-                '_value': '2',
-                '_desc': None
-            },
-            'MaxPower': {
-                '_value': '500mA',
-                '_desc': None
-            }
-        },
-        'iSerial': {
-            '_value': '3',
-            '_desc': '01d2450ea194a93b'
-        },
-        'idProduct': {
-            '_value': '0x4ee2',
-            '_desc': 'Nexus 4 (debug)'
-        },
-        'iManufacturer': {
-            '_value': '1',
-            '_desc': 'LGE'
-        },
-        'bDeviceClass': {
-            '_value': '0',
-            '_desc': '(Defined at Interface level)'
-        },
-        'iProduct': {
-            '_value': '2',
-            '_desc': 'Nexus 4'
-        },
-        'bMaxPacketSize0': {
-            '_value': '64',
-            '_desc': None
-        },
-        'bNumConfigurations': {
-            '_value': '1',
-            '_desc': None
-        }
-    },
-    'Device Qualifier (for other device speed)': {
-        'bLength': {
-            '_value': '10',
-            '_desc': None
-        },
-        'bNumConfigurations': {
-            '_value': '1',
-            '_desc': None
-        },
-        'bDeviceSubClass': {
-            '_value': '0',
-            '_desc': None
-        },
-        'bcdUSB': {
-            '_value': '2.00',
-            '_desc': None
-        },
-        'bDeviceProtocol': {
-            '_value': '0',
-            '_desc': None
-        },
-        'bDescriptorType': {
-            '_value': '6',
-            '_desc': None
-        },
-        'bDeviceClass': {
-            '_value': '0',
-            '_desc': '(Defined at Interface level)'
-        },
-        'bMaxPacketSize0': {
-            '_value': '64',
-            '_desc': None
-        }
-    }
-}
-
-
-class LsusbTest(mock_calls.TestCase):
-  """Test Lsusb parsing."""
-
-  def testLsusb(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      self.assertDictEqual(lsusb.lsusb().pop(), EXPECTED_RESULT)
-
-  def testGetSerial(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      self.assertEqual(lsusb.get_android_devices(), ['01d2450ea194a93b'])
-
-  def testGetLsusbSerial(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      out = lsusb.lsusb().pop()
-      self.assertEqual(lsusb.get_lsusb_serial(out), '01d2450ea194a93b')
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/utils/markdown.py b/systrace/catapult/devil/devil/utils/markdown.py
deleted file mode 100755
index 12d2eb3..0000000
--- a/systrace/catapult/devil/devil/utils/markdown.py
+++ /dev/null
@@ -1,320 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import print_function
-
-import argparse
-import imp
-import os
-import re
-import sys
-import textwrap
-import types
-
-# A markdown code block template: https://goo.gl/9EsyRi
-_CODE_BLOCK_FORMAT = '''```{language}
-{code}
-```
-'''
-
-_DEVIL_ROOT = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..'))
-
-
-def md_bold(raw_text):
-  """Returns markdown-formatted bold text."""
-  return '**%s**' % md_escape(raw_text, characters='*')
-
-
-def md_code(raw_text, language):
-  """Returns a markdown-formatted code block in the given language."""
-  return _CODE_BLOCK_FORMAT.format(
-      language=language or '', code=md_escape(raw_text, characters='`'))
-
-
-def md_escape(raw_text, characters='*_'):
-  """Escapes * and _."""
-
-  def escape_char(m):
-    return '\\%s' % m.group(0)
-
-  pattern = '[%s]' % re.escape(characters)
-  return re.sub(pattern, escape_char, raw_text)
-
-
-def md_heading(raw_text, level):
-  """Returns markdown-formatted heading."""
-  adjusted_level = min(max(level, 0), 6)
-  return '%s%s%s' % ('#' * adjusted_level, ' ' if adjusted_level > 0 else '',
-                     raw_text)
-
-
-def md_inline_code(raw_text):
-  """Returns markdown-formatted inline code."""
-  return '`%s`' % md_escape(raw_text, characters='`')
-
-
-def md_italic(raw_text):
-  """Returns markdown-formatted italic text."""
-  return '*%s*' % md_escape(raw_text, characters='*')
-
-
-def md_link(link_text, link_target):
-  """returns a markdown-formatted link."""
-  return '[%s](%s)' % (md_escape(link_text, characters=']'),
-                       md_escape(link_target, characters=')'))
-
-
-class MarkdownHelpFormatter(argparse.HelpFormatter):
-  """A really bare-bones argparse help formatter that generates valid markdown.
-
-  This will generate something like:
-
-  usage
-
-  # **section heading**:
-
-  ## **--argument-one**
-
-  ```
-  argument-one help text
-  ```
-
-  """
-
-  #override
-  def _format_usage(self, usage, actions, groups, prefix):
-    usage_text = super(MarkdownHelpFormatter, self)._format_usage(
-        usage, actions, groups, prefix)
-    return md_code(usage_text, language=None)
-
-  #override
-  def format_help(self):
-    self._root_section.heading = md_heading(self._prog, level=1)
-    return super(MarkdownHelpFormatter, self).format_help()
-
-  #override
-  def start_section(self, heading):
-    super(MarkdownHelpFormatter, self).start_section(
-        md_heading(heading, level=2))
-
-  #override
-  def _format_action(self, action):
-    lines = []
-    action_header = self._format_action_invocation(action)
-    lines.append(md_heading(action_header, level=3))
-    if action.help:
-      lines.append(md_code(self._expand_help(action), language=None))
-    lines.extend(['', ''])
-    return '\n'.join(lines)
-
-
-class MarkdownHelpAction(argparse.Action):
-  def __init__(self,
-               option_strings,
-               dest=argparse.SUPPRESS,
-               default=argparse.SUPPRESS,
-               **kwargs):
-    super(MarkdownHelpAction, self).__init__(
-        option_strings=option_strings,
-        dest=dest,
-        default=default,
-        nargs=0,
-        **kwargs)
-
-  def __call__(self, parser, namespace, values, option_string=None):
-    parser.formatter_class = MarkdownHelpFormatter
-    parser.print_help()
-    parser.exit()
-
-
-def add_md_help_argument(parser):
-  """Adds --md-help to the given argparse.ArgumentParser.
-
-  Running a script with --md-help will print the help text for that script
-  as valid markdown.
-
-  Args:
-    parser: The ArgumentParser to which --md-help should be added.
-  """
-  parser.add_argument(
-      '--md-help',
-      action=MarkdownHelpAction,
-      help='print Markdown-formatted help text and exit.')
-
-
-def load_module_from_path(module_path):
-  """Load a module given only the path name.
-
-  Also loads package modules as necessary.
-
-  Args:
-    module_path: An absolute path to a python module.
-  Returns:
-    The module object for the given path.
-  """
-  module_names = [os.path.splitext(os.path.basename(module_path))[0]]
-  d = os.path.dirname(module_path)
-
-  while os.path.exists(os.path.join(d, '__init__.py')):
-    module_names.append(os.path.basename(d))
-    d = os.path.dirname(d)
-
-  d = [d]
-
-  module = None
-  full_module_name = ''
-  for package_name in reversed(module_names):
-    if module:
-      d = module.__path__
-      full_module_name += '.'
-    r = imp.find_module(package_name, d)
-    full_module_name += package_name
-    module = imp.load_module(full_module_name, *r)
-  return module
-
-
-def md_module(module_obj, module_link=None):
-  """Write markdown documentation for a module.
-
-  Documents public classes and functions.
-
-  Args:
-    module_obj: a module object that should be documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-
-  def should_doc(name):
-    return (not isinstance(module_obj.__dict__[name], types.ModuleType)
-            and not name.startswith('_'))
-
-  stuff_to_doc = [
-      obj for name, obj in sorted(module_obj.__dict__.iteritems())
-      if should_doc(name)
-  ]
-
-  classes_to_doc = []
-  functions_to_doc = []
-
-  for s in stuff_to_doc:
-    if isinstance(s, types.TypeType):
-      classes_to_doc.append(s)
-    elif isinstance(s, types.FunctionType):
-      functions_to_doc.append(s)
-
-  heading_text = module_obj.__name__
-  if module_link:
-    heading_text = md_link(heading_text, module_link)
-
-  content = [
-      md_heading(heading_text, level=1),
-      '',
-      md_italic('This page was autogenerated. '
-                'Run `devil/bin/generate_md_docs` to update'),
-      '',
-  ]
-
-  for c in classes_to_doc:
-    content += md_class(c)
-  for f in functions_to_doc:
-    content += md_function(f)
-
-  print('\n'.join(content))
-
-  return 0
-
-
-def md_class(class_obj):
-  """Write markdown documentation for a class.
-
-  Documents public methods. Does not currently document subclasses.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  content = [md_heading(md_escape(class_obj.__name__), level=2)]
-  content.append('')
-  if class_obj.__doc__:
-    content.extend(md_docstring(class_obj.__doc__))
-
-  def should_doc(name, obj):
-    return (isinstance(obj, types.FunctionType)
-            and (name.startswith('__') or not name.startswith('_')))
-
-  methods_to_doc = [
-      obj for name, obj in sorted(class_obj.__dict__.iteritems())
-      if should_doc(name, obj)
-  ]
-
-  for m in methods_to_doc:
-    content.extend(md_function(m, class_obj=class_obj))
-
-  return content
-
-
-def md_docstring(docstring):
-  """Write a markdown-formatted docstring.
-
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  content = []
-  lines = textwrap.dedent(docstring).splitlines()
-  content.append(md_escape(lines[0]))
-  lines = lines[1:]
-  while lines and (not lines[0] or lines[0].isspace()):
-    lines = lines[1:]
-
-  if not all(l.isspace() for l in lines):
-    content.append(md_code('\n'.join(lines), language=None))
-    content.append('')
-  return content
-
-
-def md_function(func_obj, class_obj=None):
-  """Write markdown documentation for a function.
-
-  Args:
-    func_obj: a types.FunctionType object for the function that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  if class_obj:
-    heading_text = '%s.%s' % (class_obj.__name__, func_obj.__name__)
-  else:
-    heading_text = func_obj.__name__
-  content = [md_heading(md_escape(heading_text), level=3)]
-  content.append('')
-
-  if func_obj.__doc__:
-    content.extend(md_docstring(func_obj.__doc__))
-
-  return content
-
-
-def main(raw_args):
-  """Write markdown documentation for the module at the provided path.
-
-  Args:
-    raw_args: the raw command-line args. Usually sys.argv[1:].
-  Returns:
-    An integer exit code. 0 for success, non-zero for failure.
-  """
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--module-link')
-  parser.add_argument('module_path', type=os.path.realpath)
-  args = parser.parse_args(raw_args)
-
-  return md_module(
-      load_module_from_path(args.module_path), module_link=args.module_link)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/utils/markdown_test.py b/systrace/catapult/devil/devil/utils/markdown_test.py
deleted file mode 100755
index 11cd46e..0000000
--- a/systrace/catapult/devil/devil/utils/markdown_test.py
+++ /dev/null
@@ -1,119 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import textwrap
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
-
-from devil.utils import markdown
-
-
-class MarkdownTest(unittest.TestCase):
-  def testBold(self):
-    raw = 'foo'
-    self.assertEquals('**foo**', markdown.md_bold(raw))
-
-  def testBoldContainsStars(self):
-    raw = '*foo*'
-    self.assertEquals('**\\*foo\\***', markdown.md_bold(raw))
-
-  def testCode(self):
-    raw = textwrap.dedent("""\
-        class MarkdownTest(unittest.TestCase):
-          def testCode(self):
-            pass""")
-
-    expected = textwrap.dedent("""\
-        ```python
-        class MarkdownTest(unittest.TestCase):
-          def testCode(self):
-            pass
-        ```
-        """)
-    actual = markdown.md_code(raw, language='python')
-    self.assertEquals(expected, actual)
-
-  def testCodeContainsTicks(self):
-    raw = textwrap.dedent("""\
-        This is sample markdown.
-        ```c
-        // This is a sample code block.
-        int main(int argc, char** argv) {
-          return 0;
-        }
-        ```""")
-
-    expected = textwrap.dedent("""\
-        ```
-        This is sample markdown.
-        \\`\\`\\`c
-        // This is a sample code block.
-        int main(int argc, char** argv) {
-          return 0;
-        }
-        \\`\\`\\`
-        ```
-        """)
-    actual = markdown.md_code(raw, language=None)
-    self.assertEquals(expected, actual)
-
-  def testEscape(self):
-    raw = 'text_with_underscores *and stars*'
-    expected = 'text\\_with\\_underscores \\*and stars\\*'
-    actual = markdown.md_escape(raw)
-    self.assertEquals(expected, actual)
-
-  def testHeading1(self):
-    raw = 'Heading 1'
-    self.assertEquals('# Heading 1', markdown.md_heading(raw, level=1))
-
-  def testHeading5(self):
-    raw = 'Heading 5'
-    self.assertEquals('##### Heading 5', markdown.md_heading(raw, level=5))
-
-  def testHeading10(self):
-    raw = 'Heading 10'
-    self.assertEquals('###### Heading 10', markdown.md_heading(raw, level=10))
-
-  def testInlineCode(self):
-    raw = 'devil.utils.markdown_test'
-    self.assertEquals('`devil.utils.markdown_test`',
-                      markdown.md_inline_code(raw))
-
-  def testInlineCodeContainsTicks(self):
-    raw = 'this contains `backticks`'
-    self.assertEquals('`this contains \\`backticks\\``',
-                      markdown.md_inline_code(raw))
-
-  def testItalic(self):
-    raw = 'bar'
-    self.assertEquals('*bar*', markdown.md_italic(raw))
-
-  def testItalicContainsStars(self):
-    raw = '*bar*'
-    self.assertEquals('*\\*bar\\**', markdown.md_italic(raw))
-
-  def testLink(self):
-    link_text = 'Devil home'
-    link_target = (
-        'https://chromium.googlesource.com/catapult.git/+/HEAD/devil')
-    expected = ('[Devil home]'
-                '(https://chromium.googlesource.com/catapult.git/+/HEAD/devil)')
-    self.assertEquals(expected, markdown.md_link(link_text, link_target))
-
-  def testLinkTextContainsBracket(self):
-    link_text = 'foo [] bar'
-    link_target = 'https://www.google.com'
-    expected = '[foo [\\] bar](https://www.google.com)'
-    self.assertEquals(expected, markdown.md_link(link_text, link_target))
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/utils/mock_calls.py b/systrace/catapult/devil/devil/utils/mock_calls.py
deleted file mode 100644
index ba96658..0000000
--- a/systrace/catapult/devil/devil/utils/mock_calls.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-A test facility to assert call sequences while mocking their behavior.
-"""
-
-import unittest
-
-from devil import devil_env
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class TestCase(unittest.TestCase):
-  """Adds assertCalls to TestCase objects."""
-
-  class _AssertCalls(object):
-    def __init__(self, test_case, expected_calls, watched):
-      def call_action(pair):
-        if isinstance(pair, type(mock.call)):
-          return (pair, None)
-        else:
-          return pair
-
-      def do_check(call):
-        def side_effect(*args, **kwargs):
-          received_call = call(*args, **kwargs)
-          self._test_case.assertTrue(
-              self._expected_calls,
-              msg=('Unexpected call: %s' % str(received_call)))
-          expected_call, action = self._expected_calls.pop(0)
-          self._test_case.assertTrue(
-              received_call == expected_call,
-              msg=('Expected call mismatch:\n'
-                   '  expected: %s\n'
-                   '  received: %s\n' % (str(expected_call),
-                                         str(received_call))))
-          if callable(action):
-            return action(*args, **kwargs)
-          else:
-            return action
-
-        return side_effect
-
-      self._test_case = test_case
-      self._expected_calls = [call_action(pair) for pair in expected_calls]
-      watched = watched.copy()  # do not pollute the caller's dict
-      watched.update(
-          (call.parent.name, call.parent) for call, _ in self._expected_calls)
-      self._patched = [
-          test_case.patch_call(call, side_effect=do_check(call))
-          for call in watched.values()
-      ]
-
-    def __enter__(self):
-      for patch in self._patched:
-        patch.__enter__()
-      return self
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-      for patch in self._patched:
-        patch.__exit__(exc_type, exc_val, exc_tb)
-      if exc_type is None:
-        missing = ''.join(
-            '  expected: %s\n' % str(call) for call, _ in self._expected_calls)
-        self._test_case.assertFalse(
-            missing, msg='Expected calls not found:\n' + missing)
-
-  def __init__(self, *args, **kwargs):
-    super(TestCase, self).__init__(*args, **kwargs)
-    self.call = mock.call.self
-    self._watched = {}
-
-  def call_target(self, call):
-    """Resolve a self.call instance to the target it represents.
-
-    Args:
-      call: a self.call instance, e.g. self.call.adb.Shell
-
-    Returns:
-      The target object represented by the call, e.g. self.adb.Shell
-
-    Raises:
-      ValueError if the path of the call does not start with "self", i.e. the
-          target of the call is external to the self object.
-      AttributeError if the path of the call does not specify a valid
-          chain of attributes (without any calls) starting from "self".
-    """
-    path = call.name.split('.')
-    if path.pop(0) != 'self':
-      raise ValueError("Target %r outside of 'self' object" % call.name)
-    target = self
-    for attr in path:
-      target = getattr(target, attr)
-    return target
-
-  def patch_call(self, call, **kwargs):
-    """Patch the target of a mock.call instance.
-
-    Args:
-      call: a mock.call instance identifying a target to patch
-      Extra keyword arguments are processed by mock.patch
-
-    Returns:
-      A context manager to mock/unmock the target of the call
-    """
-    if call.name.startswith('self.'):
-      target = self.call_target(call.parent)
-      _, attribute = call.name.rsplit('.', 1)
-      if (hasattr(type(target), attribute)
-          and isinstance(getattr(type(target), attribute), property)):
-        return mock.patch.object(
-            type(target), attribute, new_callable=mock.PropertyMock, **kwargs)
-      else:
-        return mock.patch.object(target, attribute, **kwargs)
-    else:
-      return mock.patch(call.name, **kwargs)
-
-  def watchCalls(self, calls):
-    """Add calls to the set of watched calls.
-
-    Args:
-      calls: a sequence of mock.call instances identifying targets to watch
-    """
-    self._watched.update((call.name, call) for call in calls)
-
-  def watchMethodCalls(self, call, ignore=None):
-    """Watch all public methods of the target identified by a self.call.
-
-    Args:
-      call: a self.call instance indetifying an object
-      ignore: a list of public methods to ignore when watching for calls
-    """
-    target = self.call_target(call)
-    if ignore is None:
-      ignore = []
-    self.watchCalls(
-        getattr(call, method) for method in dir(target.__class__)
-        if not method.startswith('_') and not method in ignore)
-
-  def clearWatched(self):
-    """Clear the set of watched calls."""
-    self._watched = {}
-
-  def assertCalls(self, *calls):
-    """A context manager to assert that a sequence of calls is made.
-
-    During the assertion, a number of functions and methods will be "watched",
-    and any calls made to them is expected to appear---in the exact same order,
-    and with the exact same arguments---as specified by the argument |calls|.
-
-    By default, the targets of all expected calls are watched. Further targets
-    to watch may be added using watchCalls and watchMethodCalls.
-
-    Optionaly, each call may be accompanied by an action. If the action is a
-    (non-callable) value, this value will be used as the return value given to
-    the caller when the matching call is found. Alternatively, if the action is
-    a callable, the action will be then called with the same arguments as the
-    intercepted call, so that it can provide a return value or perform other
-    side effects. If the action is missing, a return value of None is assumed.
-
-    Note that mock.Mock objects are often convenient to use as a callable
-    action, e.g. to raise exceptions or return other objects which are
-    themselves callable.
-
-    Args:
-      calls: each argument is either a pair (expected_call, action) or just an
-          expected_call, where expected_call is a mock.call instance.
-
-    Raises:
-      AssertionError if the watched targets do not receive the exact sequence
-          of calls specified. Missing calls, extra calls, and calls with
-          mismatching arguments, all cause the assertion to fail.
-    """
-    return self._AssertCalls(self, calls, self._watched)
-
-  def assertCall(self, call, action=None):
-    return self.assertCalls((call, action))
diff --git a/systrace/catapult/devil/devil/utils/mock_calls_test.py b/systrace/catapult/devil/devil/utils/mock_calls_test.py
deleted file mode 100755
index f1e7178..0000000
--- a/systrace/catapult/devil/devil/utils/mock_calls_test.py
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of mock_calls.py.
-"""
-
-import logging
-import os
-import unittest
-
-from devil import devil_env
-from devil.android.sdk import version_codes
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class _DummyAdb(object):
-  def __str__(self):
-    return '0123456789abcdef'
-
-  def Push(self, host_path, device_path):
-    logging.debug('(device %s) pushing %r to %r', self, host_path, device_path)
-
-  def IsOnline(self):
-    logging.debug('(device %s) checking device online', self)
-    return True
-
-  def Shell(self, cmd):
-    logging.debug('(device %s) running command %r', self, cmd)
-    return "nice output\n"
-
-  def Reboot(self):
-    logging.debug('(device %s) rebooted!', self)
-
-  @property
-  def build_version_sdk(self):
-    logging.debug('(device %s) getting build_version_sdk', self)
-    return version_codes.LOLLIPOP
-
-
-class TestCaseWithAssertCallsTest(mock_calls.TestCase):
-  def setUp(self):
-    self.adb = _DummyAdb()
-
-  def ShellError(self):
-    def action(cmd):
-      raise ValueError('(device %s) command %r is not nice' % (self.adb, cmd))
-
-    return action
-
-  def get_answer(self):
-    logging.debug("called 'get_answer' of %r object", self)
-    return 42
-
-  def echo(self, thing):
-    logging.debug("called 'echo' of %r object", self)
-    return thing
-
-  def testCallTarget_succeds(self):
-    self.assertEquals(self.adb.Shell, self.call_target(self.call.adb.Shell))
-
-  def testCallTarget_failsExternal(self):
-    with self.assertRaises(ValueError):
-      self.call_target(mock.call.sys.getcwd)
-
-  def testCallTarget_failsUnknownAttribute(self):
-    with self.assertRaises(AttributeError):
-      self.call_target(self.call.adb.Run)
-
-  def testCallTarget_failsIntermediateCalls(self):
-    with self.assertRaises(AttributeError):
-      self.call_target(self.call.adb.RunShell('cmd').append)
-
-  def testPatchCall_method(self):
-    self.assertEquals(42, self.get_answer())
-    with self.patch_call(self.call.get_answer, return_value=123):
-      self.assertEquals(123, self.get_answer())
-    self.assertEquals(42, self.get_answer())
-
-  def testPatchCall_attribute_method(self):
-    with self.patch_call(self.call.adb.Shell, return_value='hello'):
-      self.assertEquals('hello', self.adb.Shell('echo hello'))
-
-  def testPatchCall_global(self):
-    with self.patch_call(mock.call.os.getcwd, return_value='/some/path'):
-      self.assertEquals('/some/path', os.getcwd())
-
-  def testPatchCall_withSideEffect(self):
-    with self.patch_call(self.call.adb.Shell, side_effect=ValueError):
-      with self.assertRaises(ValueError):
-        self.adb.Shell('echo hello')
-
-  def testPatchCall_property(self):
-    self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
-    with self.patch_call(
-        self.call.adb.build_version_sdk, return_value=version_codes.KITKAT):
-      self.assertEquals(version_codes.KITKAT, self.adb.build_version_sdk)
-    self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
-
-  def testAssertCalls_succeeds_simple(self):
-    self.assertEquals(42, self.get_answer())
-    with self.assertCall(self.call.get_answer(), 123):
-      self.assertEquals(123, self.get_answer())
-    self.assertEquals(42, self.get_answer())
-
-  def testAssertCalls_succeeds_multiple(self):
-    with self.assertCalls(
-        (mock.call.os.getcwd(), '/some/path'),
-        (self.call.echo('hello'), 'hello'), (self.call.get_answer(), 11),
-        self.call.adb.Push('this_file',
-                           'that_file'), (self.call.get_answer(), 12)):
-      self.assertEquals(os.getcwd(), '/some/path')
-      self.assertEquals('hello', self.echo('hello'))
-      self.assertEquals(11, self.get_answer())
-      self.adb.Push('this_file', 'that_file')
-      self.assertEquals(12, self.get_answer())
-
-  def testAsserCalls_succeeds_withAction(self):
-    with self.assertCall(self.call.adb.Shell('echo hello'), self.ShellError()):
-      with self.assertRaises(ValueError):
-        self.adb.Shell('echo hello')
-
-  def testAssertCalls_fails_tooManyCalls(self):
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        self.adb.IsOnline()
-        self.adb.IsOnline()
-
-  def testAssertCalls_fails_tooFewCalls(self):
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        pass
-
-  def testAssertCalls_succeeds_extraCalls(self):
-    # we are not watching Reboot, so the assertion succeeds
-    with self.assertCalls(self.call.adb.IsOnline()):
-      self.adb.IsOnline()
-      self.adb.Reboot()
-
-  def testAssertCalls_fails_extraCalls(self):
-    self.watchCalls([self.call.adb.Reboot])
-    # this time we are also watching Reboot, so the assertion fails
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        self.adb.IsOnline()
-        self.adb.Reboot()
-
-  def testAssertCalls_succeeds_NoCalls(self):
-    self.watchMethodCalls(self.call.adb)  # we are watching all adb methods
-    with self.assertCalls():
-      pass
-
-  def testAssertCalls_fails_NoCalls(self):
-    self.watchMethodCalls(self.call.adb)
-    with self.assertRaises(AssertionError):
-      with self.assertCalls():
-        self.adb.IsOnline()
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/utils/parallelizer.py b/systrace/catapult/devil/devil/utils/parallelizer.py
deleted file mode 100644
index 930d01f..0000000
--- a/systrace/catapult/devil/devil/utils/parallelizer.py
+++ /dev/null
@@ -1,266 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-""" Wrapper that allows method execution in parallel.
-
-This class wraps a list of objects of the same type, emulates their
-interface, and executes any functions called on the objects in parallel
-in ReraiserThreads.
-
-This means that, given a list of objects:
-
-  class Foo:
-    def __init__(self):
-      self.baz = Baz()
-
-    def bar(self, my_param):
-      // do something
-
-  list_of_foos = [Foo(1), Foo(2), Foo(3)]
-
-we can take a sequential operation on that list of objects:
-
-  for f in list_of_foos:
-    f.bar('Hello')
-
-and run it in parallel across all of the objects:
-
-  Parallelizer(list_of_foos).bar('Hello')
-
-It can also handle (non-method) attributes of objects, so that this:
-
-  for f in list_of_foos:
-    f.baz.myBazMethod()
-
-can be run in parallel with:
-
-  Parallelizer(list_of_foos).baz.myBazMethod()
-
-Because it emulates the interface of the wrapped objects, a Parallelizer
-can be passed to a method or function that takes objects of that type:
-
-  def DoesSomethingWithFoo(the_foo):
-    the_foo.bar('Hello')
-    the_foo.bar('world')
-    the_foo.baz.myBazMethod
-
-  DoesSomethingWithFoo(Parallelizer(list_of_foos))
-
-Note that this class spins up a thread for each object. Using this class
-to parallelize operations that are already fast will incur a net performance
-penalty.
-
-"""
-# pylint: disable=protected-access
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-class Parallelizer(object):
-  """Allows parallel execution of method calls across a group of objects."""
-
-  def __init__(self, objs):
-    self._orig_objs = objs
-    self._objs = objs
-
-  def __getattr__(self, name):
-    """Emulate getting the |name| attribute of |self|.
-
-    Args:
-      name: The name of the attribute to retrieve.
-    Returns:
-      A Parallelizer emulating the |name| attribute of |self|.
-    """
-    self.pGet(None)
-
-    r = type(self)(self._orig_objs)
-    r._objs = [getattr(o, name) for o in self._objs]
-    return r
-
-  def __getitem__(self, index):
-    """Emulate getting the value of |self| at |index|.
-
-    Returns:
-      A Parallelizer emulating the value of |self| at |index|.
-    """
-    self.pGet(None)
-
-    r = type(self)(self._orig_objs)
-    r._objs = [o[index] for o in self._objs]
-    return r
-
-  def __call__(self, *args, **kwargs):
-    """Emulate calling |self| with |args| and |kwargs|.
-
-    Note that this call is asynchronous. Call pFinish on the return value to
-    block until the call finishes.
-
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the call in
-      parallel.
-    Raises:
-      AttributeError if the wrapped objects aren't callable.
-    """
-    self.pGet(None)
-
-    for o in self._objs:
-      if not callable(o):
-        raise AttributeError("'%s' is not callable" % o.__name__)
-
-    r = type(self)(self._orig_objs)
-    r._objs = reraiser_thread.ReraiserThreadGroup([
-        reraiser_thread.ReraiserThread(
-            o, args=args, kwargs=kwargs, name='%s.%s' % (str(d), o.__name__))
-        for d, o in zip(self._orig_objs, self._objs)
-    ])
-    r._objs.StartAll()
-    return r
-
-  def pFinish(self, timeout):
-    """Finish any outstanding asynchronous operations.
-
-    Args:
-      timeout: The maximum number of seconds to wait for an individual
-               result to return, or None to wait forever.
-    Returns:
-      self, now emulating the return values.
-    """
-    self._assertNoShadow('pFinish')
-    if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
-      self._objs.JoinAll()
-      self._objs = self._objs.GetAllReturnValues(
-          watchdog_timer.WatchdogTimer(timeout))
-    return self
-
-  def pGet(self, timeout):
-    """Get the current wrapped objects.
-
-    Args:
-      timeout: Same as |pFinish|.
-    Returns:
-      A list of the results, in order of the provided devices.
-    Raises:
-      Any exception raised by any of the called functions.
-    """
-    self._assertNoShadow('pGet')
-    self.pFinish(timeout)
-    return self._objs
-
-  def pMap(self, f, *args, **kwargs):
-    """Map a function across the current wrapped objects in parallel.
-
-    This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
-
-    Note that this call is asynchronous. Call pFinish on the return value to
-    block until the call finishes.
-
-    Args:
-      f: The function to call.
-      args: The positional args to pass to f.
-      kwargs: The keyword args to pass to f.
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the map in
-      parallel.
-    """
-    self._assertNoShadow('pMap')
-    r = type(self)(self._orig_objs)
-    r._objs = reraiser_thread.ReraiserThreadGroup([
-        reraiser_thread.ReraiserThread(
-            f,
-            args=tuple([o] + list(args)),
-            kwargs=kwargs,
-            name='%s(%s)' % (f.__name__, d))
-        for d, o in zip(self._orig_objs, self._objs)
-    ])
-    r._objs.StartAll()
-    return r
-
-  def _assertNoShadow(self, attr_name):
-    """Ensures that |attr_name| isn't shadowing part of the wrapped obejcts.
-
-    If the wrapped objects _do_ have an |attr_name| attribute, it will be
-    inaccessible to clients.
-
-    Args:
-      attr_name: The attribute to check.
-    Raises:
-      AssertionError if the wrapped objects have an attribute named 'attr_name'
-      or '_assertNoShadow'.
-    """
-    if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
-      assert not hasattr(self._objs, '_assertNoShadow')
-      assert not hasattr(self._objs, attr_name)
-    else:
-      assert not any(hasattr(o, '_assertNoShadow') for o in self._objs)
-      assert not any(hasattr(o, attr_name) for o in self._objs)
-
-
-class SyncParallelizer(Parallelizer):
-  """A Parallelizer that blocks on function calls."""
-
-  def __enter__(self):
-    """Emulate entering the context of |self|.
-
-    Note that this call is synchronous.
-
-    Returns:
-      A Parallelizer emulating the value returned from entering into the
-      context of |self|.
-    """
-    r = type(self)(self._orig_objs)
-    r._objs = [o.__enter__ for o in r._objs]
-    return r.__call__()
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    """Emulate exiting the context of |self|.
-
-    Note that this call is synchronous.
-
-    Args:
-      exc_type: the exception type.
-      exc_val: the exception value.
-      exc_tb: the exception traceback.
-    """
-    r = type(self)(self._orig_objs)
-    r._objs = [o.__exit__ for o in r._objs]
-    r.__call__(exc_type, exc_val, exc_tb)
-
-  # override
-  def __call__(self, *args, **kwargs):
-    """Emulate calling |self| with |args| and |kwargs|.
-
-    Note that this call is synchronous.
-
-    Returns:
-      A Parallelizer emulating the value returned from calling |self| with
-      |args| and |kwargs|.
-    Raises:
-      AttributeError if the wrapped objects aren't callable.
-    """
-    r = super(SyncParallelizer, self).__call__(*args, **kwargs)
-    r.pFinish(None)
-    return r
-
-  # override
-  def pMap(self, f, *args, **kwargs):
-    """Map a function across the current wrapped objects in parallel.
-
-    This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
-
-    Note that this call is synchronous.
-
-    Args:
-      f: The function to call.
-      args: The positional args to pass to f.
-      kwargs: The keyword args to pass to f.
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the map in
-      parallel.
-    """
-    r = super(SyncParallelizer, self).pMap(f, *args, **kwargs)
-    r.pFinish(None)
-    return r
diff --git a/systrace/catapult/devil/devil/utils/parallelizer_test.py b/systrace/catapult/devil/devil/utils/parallelizer_test.py
deleted file mode 100644
index 2d8f72a..0000000
--- a/systrace/catapult/devil/devil/utils/parallelizer_test.py
+++ /dev/null
@@ -1,191 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Unit tests for the contents of parallelizer.py."""
-
-# pylint: disable=protected-access
-# pylint: disable=unused-argument
-
-import contextlib
-import os
-import tempfile
-import time
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
-
-from devil.utils import parallelizer
-from devil.base_error import BaseError
-
-
-class ParallelizerTestObject(object):
-  """Class used to test parallelizer.Parallelizer."""
-
-  parallel = parallelizer.Parallelizer
-
-  def __init__(self, thing, completion_file_name=None):
-    self._thing = thing
-    self._completion_file_name = completion_file_name
-    self.helper = ParallelizerTestObjectHelper(thing)
-
-  @staticmethod
-  def doReturn(what):
-    return what
-
-  @classmethod
-  def doRaise(cls, what):
-    raise what
-
-  def doSetTheThing(self, new_thing):
-    self._thing = new_thing
-
-  def doReturnTheThing(self):
-    return self._thing
-
-  def doRaiseTheThing(self):
-    raise self._thing
-
-  def doRaiseIfExceptionElseSleepFor(self, sleep_duration):
-    if isinstance(self._thing, Exception):
-      raise self._thing
-    time.sleep(sleep_duration)
-    self._write_completion_file()
-    return self._thing
-
-  def _write_completion_file(self):
-    if self._completion_file_name and len(self._completion_file_name):
-      with open(self._completion_file_name, 'w+b') as completion_file:
-        completion_file.write(b'complete')
-
-  def __getitem__(self, index):
-    return self._thing[index]
-
-  def __str__(self):
-    return type(self).__name__
-
-
-class ParallelizerTestObjectHelper(object):
-  def __init__(self, thing):
-    self._thing = thing
-
-  def doReturnStringThing(self):
-    return str(self._thing)
-
-
-class ParallelizerTest(unittest.TestCase):
-  def testInitEmptyList(self):
-    r = parallelizer.Parallelizer([]).replace('a', 'b').pGet(0.1)
-    self.assertEquals([], r)
-
-  def testMethodCall(self):
-    test_data = ['abc_foo', 'def_foo', 'ghi_foo']
-    expected = ['abc_bar', 'def_bar', 'ghi_bar']
-    r = parallelizer.Parallelizer(test_data).replace('_foo', '_bar').pGet(0.1)
-    self.assertEquals(expected, r)
-
-  def testMutate(self):
-    devices = [ParallelizerTestObject(True) for _ in range(0, 10)]
-    self.assertTrue(all(d.doReturnTheThing() for d in devices))
-    ParallelizerTestObject.parallel(devices).doSetTheThing(False).pFinish(1)
-    self.assertTrue(not any(d.doReturnTheThing() for d in devices))
-
-  def testAllReturn(self):
-    devices = [ParallelizerTestObject(True) for _ in range(0, 10)]
-    results = ParallelizerTestObject.parallel(devices).doReturnTheThing().pGet(
-        1)
-    self.assertTrue(isinstance(results, list))
-    self.assertEquals(10, len(results))
-    self.assertTrue(all(results))
-
-  def testAllRaise(self):
-    devices = [
-        ParallelizerTestObject(Exception('thing %d' % i))
-        for i in range(0, 10)
-    ]
-    p = ParallelizerTestObject.parallel(devices).doRaiseTheThing()
-    with self.assertRaises(Exception):
-      p.pGet(1)
-
-  def testOneFailOthersComplete(self):
-    parallel_device_count = 10
-    exception_index = 7
-    exception_msg = 'thing %d' % exception_index
-
-    try:
-      completion_files = [
-          tempfile.NamedTemporaryFile(delete=False)
-          for _ in range(0, parallel_device_count)
-      ]
-      devices = [
-          ParallelizerTestObject(
-              i if i != exception_index else BaseError(exception_msg),
-              completion_files[i].name)
-          for i in range(0, parallel_device_count)
-      ]
-      for f in completion_files:
-        f.close()
-      p = ParallelizerTestObject.parallel(devices)
-      with self.assertRaises(BaseError) as e:
-        p.doRaiseIfExceptionElseSleepFor(2).pGet(3)
-      self.assertTrue(exception_msg in str(e.exception))
-      for i in range(0, parallel_device_count):
-        with open(completion_files[i].name) as f:
-          if i == exception_index:
-            self.assertEquals('', f.read())
-          else:
-            self.assertEquals('complete', f.read())
-    finally:
-      for f in completion_files:
-        os.remove(f.name)
-
-  def testReusable(self):
-    devices = [ParallelizerTestObject(True) for _ in range(0, 10)]
-    p = ParallelizerTestObject.parallel(devices)
-    results = p.doReturn(True).pGet(1)
-    self.assertTrue(all(results))
-    results = p.doReturn(True).pGet(1)
-    self.assertTrue(all(results))
-    with self.assertRaises(Exception):
-      results = p.doRaise(Exception('reusableTest')).pGet(1)
-
-  def testContained(self):
-    devices = [ParallelizerTestObject(i) for i in range(0, 10)]
-    results = (ParallelizerTestObject.parallel(devices).helper.
-               doReturnStringThing().pGet(1))
-    self.assertTrue(isinstance(results, list))
-    self.assertEquals(10, len(results))
-    for i in range(0, 10):
-      self.assertEquals(str(i), results[i])
-
-  def testGetItem(self):
-    devices = [ParallelizerTestObject(range(i, i + 10)) for i in range(0, 10)]
-    results = ParallelizerTestObject.parallel(devices)[9].pGet(1)
-    self.assertEquals(list(range(9, 19)), results)
-
-
-class SyncParallelizerTest(unittest.TestCase):
-  def testContextManager(self):
-    in_context = [False for i in range(10)]
-
-    @contextlib.contextmanager
-    def enter_into_context(i):
-      in_context[i] = True
-      try:
-        yield
-      finally:
-        in_context[i] = False
-
-    parallelized_context = parallelizer.SyncParallelizer(
-        [enter_into_context(i) for i in range(10)])
-
-    with parallelized_context:
-      self.assertTrue(all(in_context))
-    self.assertFalse(any(in_context))
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/devil/devil/utils/reraiser_thread.py b/systrace/catapult/devil/devil/utils/reraiser_thread.py
deleted file mode 100644
index e48dda9..0000000
--- a/systrace/catapult/devil/devil/utils/reraiser_thread.py
+++ /dev/null
@@ -1,241 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Thread and ThreadGroup that reraise exceptions on the main thread."""
-# pylint: disable=W0212
-
-import logging
-import sys
-import threading
-import time
-import traceback
-
-from devil import base_error
-from devil.utils import watchdog_timer
-
-
-class TimeoutError(base_error.BaseError):
-  """Module-specific timeout exception."""
-
-  def __init__(self, message):
-    super(TimeoutError, self).__init__(message)
-
-
-def LogThreadStack(thread, error_log_func=logging.critical):
-  """Log the stack for the given thread.
-
-  Args:
-    thread: a threading.Thread instance.
-    error_log_func: Logging function when logging errors.
-  """
-  stack = sys._current_frames()[thread.ident]
-  error_log_func('*' * 80)
-  error_log_func('Stack dump for thread %r', thread.name)
-  error_log_func('*' * 80)
-  for filename, lineno, name, line in traceback.extract_stack(stack):
-    error_log_func('File: "%s", line %d, in %s', filename, lineno, name)
-    if line:
-      error_log_func('  %s', line.strip())
-  error_log_func('*' * 80)
-
-
-class ReraiserThread(threading.Thread):
-  """Thread class that can reraise exceptions."""
-
-  def __init__(self, func, args=None, kwargs=None, name=None):
-    """Initialize thread.
-
-    Args:
-      func: callable to call on a new thread.
-      args: list of positional arguments for callable, defaults to empty.
-      kwargs: dictionary of keyword arguments for callable, defaults to empty.
-      name: thread name, defaults to the function name.
-    """
-    if not name:
-      if hasattr(func, '__name__') and func.__name__ != '<lambda>':
-        name = func.__name__
-      else:
-        name = 'anonymous'
-    super(ReraiserThread, self).__init__(name=name)
-    if not args:
-      args = []
-    if not kwargs:
-      kwargs = {}
-    self.daemon = True
-    self._func = func
-    self._args = args
-    self._kwargs = kwargs
-    self._ret = None
-    self._exc_info = None
-    self._thread_group = None
-
-  if sys.version_info < (3, ):
-    # pylint: disable=exec-used
-    exec ('''def ReraiseIfException(self):
-  """Reraise exception if an exception was raised in the thread."""
-  if self._exc_info:
-    raise self._exc_info[0], self._exc_info[1], self._exc_info[2]''')
-  else:
-
-    def ReraiseIfException(self):
-      """Reraise exception if an exception was raised in the thread."""
-      if self._exc_info:
-        raise self._exc_info[1]
-
-  def GetReturnValue(self):
-    """Reraise exception if present, otherwise get the return value."""
-    self.ReraiseIfException()
-    return self._ret
-
-  # override
-  def run(self):
-    """Overrides Thread.run() to add support for reraising exceptions."""
-    try:
-      self._ret = self._func(*self._args, **self._kwargs)
-    except:  # pylint: disable=W0702
-      self._exc_info = sys.exc_info()
-
-
-class ReraiserThreadGroup(object):
-  """A group of ReraiserThread objects."""
-
-  def __init__(self, threads=None):
-    """Initialize thread group.
-
-    Args:
-      threads: a list of ReraiserThread objects; defaults to empty.
-    """
-    self._threads = []
-    # Set when a thread from one group has called JoinAll on another. It is used
-    # to detect when a there is a TimeoutRetryThread active that links to the
-    # current thread.
-    self.blocked_parent_thread_group = None
-    if threads:
-      for thread in threads:
-        self.Add(thread)
-
-  def Add(self, thread):
-    """Add a thread to the group.
-
-    Args:
-      thread: a ReraiserThread object.
-    """
-    assert thread._thread_group is None
-    thread._thread_group = self
-    self._threads.append(thread)
-
-  def StartAll(self, will_block=False):
-    """Start all threads.
-
-    Args:
-      will_block: Whether the calling thread will subsequently block on this
-        thread group. Causes the active ReraiserThreadGroup (if there is one)
-        to be marked as blocking on this thread group.
-    """
-    if will_block:
-      # Multiple threads blocking on the same outer thread should not happen in
-      # practice.
-      assert not self.blocked_parent_thread_group
-      self.blocked_parent_thread_group = CurrentThreadGroup()
-    for thread in self._threads:
-      thread.start()
-
-  def _JoinAll(self, watcher=None, timeout=None):
-    """Join all threads without stack dumps.
-
-    Reraises exceptions raised by the child threads and supports breaking
-    immediately on exceptions raised on the main thread.
-
-    Args:
-      watcher: Watchdog object providing the thread timeout. If none is
-          provided, the thread will never be timed out.
-      timeout: An optional number of seconds to wait before timing out the join
-          operation. This will not time out the threads.
-    """
-    if watcher is None:
-      watcher = watchdog_timer.WatchdogTimer(None)
-    alive_threads = self._threads[:]
-    end_time = (time.time() + timeout) if timeout else None
-    try:
-      while alive_threads and (end_time is None or end_time > time.time()):
-        for thread in alive_threads[:]:
-          if watcher.IsTimedOut():
-            raise TimeoutError('Timed out waiting for %d of %d threads.' %
-                               (len(alive_threads), len(self._threads)))
-          # Allow the main thread to periodically check for interrupts.
-          thread.join(0.1)
-          if not thread.isAlive():
-            alive_threads.remove(thread)
-      # All threads are allowed to complete before reraising exceptions.
-      for thread in self._threads:
-        thread.ReraiseIfException()
-    finally:
-      self.blocked_parent_thread_group = None
-
-  def IsAlive(self):
-    """Check whether any of the threads are still alive.
-
-    Returns:
-      Whether any of the threads are still alive.
-    """
-    return any(t.isAlive() for t in self._threads)
-
-  def JoinAll(self, watcher=None, timeout=None,
-              error_log_func=logging.critical):
-    """Join all threads.
-
-    Reraises exceptions raised by the child threads and supports breaking
-    immediately on exceptions raised on the main thread. Unfinished threads'
-    stacks will be logged on watchdog timeout.
-
-    Args:
-      watcher: Watchdog object providing the thread timeout. If none is
-          provided, the thread will never be timed out.
-      timeout: An optional number of seconds to wait before timing out the join
-          operation. This will not time out the threads.
-      error_log_func: Logging function when logging errors.
-    """
-    try:
-      self._JoinAll(watcher, timeout)
-    except TimeoutError:
-      error_log_func('Timed out. Dumping threads.')
-      for thread in (t for t in self._threads if t.isAlive()):
-        LogThreadStack(thread, error_log_func=error_log_func)
-      raise
-
-  def GetAllReturnValues(self, watcher=None):
-    """Get all return values, joining all threads if necessary.
-
-    Args:
-      watcher: same as in |JoinAll|. Only used if threads are alive.
-    """
-    if any([t.isAlive() for t in self._threads]):
-      self.JoinAll(watcher)
-    return [t.GetReturnValue() for t in self._threads]
-
-
-def CurrentThreadGroup():
-  """Returns the ReraiserThreadGroup that owns the running thread.
-
-  Returns:
-    The current thread group, otherwise None.
-  """
-  current_thread = threading.current_thread()
-  if isinstance(current_thread, ReraiserThread):
-    return current_thread._thread_group  # pylint: disable=no-member
-  return None
-
-
-def RunAsync(funcs, watcher=None):
-  """Executes the given functions in parallel and returns their results.
-
-  Args:
-    funcs: List of functions to perform on their own threads.
-    watcher: Watchdog object providing timeout, by default waits forever.
-
-  Returns:
-    A list of return values in the order of the given functions.
-  """
-  thread_group = ReraiserThreadGroup(ReraiserThread(f) for f in funcs)
-  thread_group.StartAll(will_block=True)
-  return thread_group.GetAllReturnValues(watcher=watcher)
diff --git a/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py b/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py
deleted file mode 100644
index f1fabd0..0000000
--- a/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Unittests for reraiser_thread.py."""
-
-import threading
-import unittest
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-
-class TestException(Exception):
-  pass
-
-
-class TestReraiserThread(unittest.TestCase):
-  """Tests for reraiser_thread.ReraiserThread."""
-
-  def testNominal(self):
-    result = [None, None]
-
-    def f(a, b=None):
-      result[0] = a
-      result[1] = b
-
-    thread = reraiser_thread.ReraiserThread(f, [1], {'b': 2})
-    thread.start()
-    thread.join()
-    self.assertEqual(result[0], 1)
-    self.assertEqual(result[1], 2)
-
-  def testRaise(self):
-    def f():
-      raise TestException
-
-    thread = reraiser_thread.ReraiserThread(f)
-    thread.start()
-    thread.join()
-    with self.assertRaises(TestException):
-      thread.ReraiseIfException()
-
-
-class TestReraiserThreadGroup(unittest.TestCase):
-  """Tests for reraiser_thread.ReraiserThreadGroup."""
-
-  def testInit(self):
-    ran = [False] * 5
-
-    def f(i):
-      ran[i] = True
-
-    group = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(f, args=[i]) for i in range(5)])
-    group.StartAll()
-    group.JoinAll()
-    for v in ran:
-      self.assertTrue(v)
-
-  def testAdd(self):
-    ran = [False] * 5
-
-    def f(i):
-      ran[i] = True
-
-    group = reraiser_thread.ReraiserThreadGroup()
-    for i in range(5):
-      group.Add(reraiser_thread.ReraiserThread(f, args=[i]))
-    group.StartAll()
-    group.JoinAll()
-    for v in ran:
-      self.assertTrue(v)
-
-  def testJoinRaise(self):
-    def f():
-      raise TestException
-
-    group = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(f) for _ in range(5)])
-    group.StartAll()
-    with self.assertRaises(TestException):
-      group.JoinAll()
-
-  def testJoinTimeout(self):
-    def f():
-      pass
-
-    event = threading.Event()
-
-    def g():
-      event.wait()
-
-    group = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(g),
-         reraiser_thread.ReraiserThread(f)])
-    group.StartAll()
-    with self.assertRaises(reraiser_thread.TimeoutError):
-      group.JoinAll(watchdog_timer.WatchdogTimer(0.01))
-    event.set()
-
-
-class TestRunAsync(unittest.TestCase):
-  """Tests for reraiser_thread.RunAsync."""
-
-  def testNoArgs(self):
-    results = reraiser_thread.RunAsync([])
-    self.assertEqual([], results)
-
-  def testOneArg(self):
-    results = reraiser_thread.RunAsync([lambda: 1])
-    self.assertEqual([1], results)
-
-  def testTwoArgs(self):
-    a, b = reraiser_thread.RunAsync((lambda: 1, lambda: 2))
-    self.assertEqual(1, a)
-    self.assertEqual(2, b)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/utils/reset_usb.py b/systrace/catapult/devil/devil/utils/reset_usb.py
deleted file mode 100755
index d2f80b0..0000000
--- a/systrace/catapult/devil/devil/utils/reset_usb.py
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-if sys.platform == 'win32':
-  raise ImportError('devil.utils.reset_usb only supported on unix systems.')
-
-import argparse
-import fcntl
-import logging
-import os
-import re
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
-
-from devil.android import device_errors
-from devil.utils import lsusb
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-_INDENTATION_RE = re.compile(r'^( *)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):')
-_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
-_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
-
-_USBDEVFS_RESET = ord('U') << 8 | 20
-
-
-def reset_usb(bus, device):
-  """Reset the USB device with the given bus and device."""
-  usb_file_path = '/dev/bus/usb/%03d/%03d' % (bus, device)
-  with open(usb_file_path, 'w') as usb_file:
-    logger.debug('fcntl.ioctl(%s, %d)', usb_file_path, _USBDEVFS_RESET)
-    fcntl.ioctl(usb_file, _USBDEVFS_RESET)
-
-
-def reset_android_usb(serial):
-  """Reset the USB device for the given Android device."""
-  lsusb_info = lsusb.lsusb()
-
-  bus = None
-  device = None
-  for device_info in lsusb_info:
-    device_serial = lsusb.get_lsusb_serial(device_info)
-    if device_serial == serial:
-      bus = int(device_info.get('bus'))
-      device = int(device_info.get('device'))
-
-  if bus and device:
-    reset_usb(bus, device)
-  else:
-    raise device_errors.DeviceUnreachableError(
-        'Unable to determine bus(%s) or device(%s) for device %s' %
-        (bus, device, serial))
-
-
-def reset_all_android_devices():
-  """Reset all USB devices that look like an Android device."""
-  _reset_all_matching(lambda i: bool(lsusb.get_lsusb_serial(i)))
-
-
-def _reset_all_matching(condition):
-  lsusb_info = lsusb.lsusb()
-  for device_info in lsusb_info:
-    if int(device_info.get('device')) != 1 and condition(device_info):
-      bus = int(device_info.get('bus'))
-      device = int(device_info.get('device'))
-      try:
-        reset_usb(bus, device)
-        serial = lsusb.get_lsusb_serial(device_info)
-        if serial:
-          logger.info('Reset USB device (bus: %03d, device: %03d, serial: %s)',
-                      bus, device, serial)
-        else:
-          logger.info('Reset USB device (bus: %03d, device: %03d)', bus, device)
-      except IOError:
-        logger.error('Failed to reset USB device (bus: %03d, device: %03d)',
-                     bus, device)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('-v', '--verbose', action='count')
-  parser.add_argument('-s', '--serial')
-  parser.add_argument('--bus', type=int)
-  parser.add_argument('--device', type=int)
-  args = parser.parse_args()
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  if args.serial:
-    reset_android_usb(args.serial)
-  elif args.bus and args.device:
-    reset_usb(args.bus, args.device)
-  else:
-    parser.error('Unable to determine target. '
-                 'Specify --serial or BOTH --bus and --device.')
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/devil/devil/utils/run_tests_helper.py b/systrace/catapult/devil/devil/utils/run_tests_helper.py
deleted file mode 100644
index b161fd7..0000000
--- a/systrace/catapult/devil/devil/utils/run_tests_helper.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Helper functions common to native, java and host-driven test runners."""
-
-import collections
-import logging
-
-from devil.utils import logging_common
-
-CustomFormatter = logging_common.CustomFormatter
-
-_WrappedLoggingArgs = collections.namedtuple('_WrappedLoggingArgs',
-                                             ['verbose', 'quiet'])
-
-
-def SetLogLevel(verbose_count, add_handler=True):
-  """Sets log level as |verbose_count|.
-
-  Args:
-    verbose_count: Verbosity level.
-    add_handler: If true, adds a handler with |CustomFormatter|.
-  """
-  logging_common.InitializeLogging(
-      _WrappedLoggingArgs(verbose_count, 0),
-      handler=None if add_handler else logging.NullHandler())
diff --git a/systrace/catapult/devil/devil/utils/signal_handler.py b/systrace/catapult/devil/devil/utils/signal_handler.py
deleted file mode 100644
index 1230f8d..0000000
--- a/systrace/catapult/devil/devil/utils/signal_handler.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import signal
-
-
-@contextlib.contextmanager
-def SignalHandler(signalnum, handler):
-  """Sets the signal handler for the given signal in the wrapped context.
-
-  Args:
-    signum: The signal for which a handler should be added.
-    additional_handler: The handler to add.
-  """
-  existing_handler = signal.getsignal(signalnum)
-
-  try:
-    signal.signal(signalnum, handler)
-    yield
-  finally:
-    signal.signal(signalnum, existing_handler)
-
-
-@contextlib.contextmanager
-def AddSignalHandler(signalnum, additional_handler):
-  """Adds a signal handler for the given signal in the wrapped context.
-
-  This runs the new handler after any existing handler rather than
-  replacing the existing handler.
-
-  Args:
-    signum: The signal for which a handler should be added.
-    additional_handler: The handler to add.
-  """
-  existing_handler = signal.getsignal(signalnum)
-
-  def handler(signum, frame):
-    if callable(existing_handler):
-      existing_handler(signum, frame)
-    additional_handler(signum, frame)
-
-  try:
-    signal.signal(signalnum, handler)
-    yield
-  finally:
-    signal.signal(signalnum, existing_handler)
diff --git a/systrace/catapult/devil/devil/utils/timeout_retry.py b/systrace/catapult/devil/devil/utils/timeout_retry.py
deleted file mode 100644
index 8b26ac7..0000000
--- a/systrace/catapult/devil/devil/utils/timeout_retry.py
+++ /dev/null
@@ -1,179 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A utility to run functions with timeouts and retries."""
-# pylint: disable=W0702
-
-import logging
-import threading
-import time
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-logger = logging.getLogger(__name__)
-
-
-class TimeoutRetryThreadGroup(reraiser_thread.ReraiserThreadGroup):
-  def __init__(self, timeout, threads=None):
-    super(TimeoutRetryThreadGroup, self).__init__(threads)
-    self._watcher = watchdog_timer.WatchdogTimer(timeout)
-
-  def GetWatcher(self):
-    """Returns the watchdog keeping track of this thread's time."""
-    return self._watcher
-
-  def GetElapsedTime(self):
-    return self._watcher.GetElapsed()
-
-  def GetRemainingTime(self, required=0, suffix=None):
-    """Get the remaining time before the thread times out.
-
-    Useful to send as the |timeout| parameter of async IO operations.
-
-    Args:
-      required: minimum amount of time that will be required to complete, e.g.,
-        some sleep or IO operation.
-      msg: error message to show if timing out.
-
-    Returns:
-      The number of seconds remaining before the thread times out, or None
-      if the thread never times out.
-
-    Raises:
-      reraiser_thread.TimeoutError if the remaining time is less than the
-        required time.
-    """
-    remaining = self._watcher.GetRemaining()
-    if remaining is not None and remaining < required:
-      msg = 'Timeout of %.1f secs expired' % self._watcher.GetTimeout()
-      if suffix:
-        msg += suffix
-      raise reraiser_thread.TimeoutError(msg)
-    return remaining
-
-
-def CurrentTimeoutThreadGroup():
-  """Returns the thread group that owns or is blocked on the active thread.
-
-  Returns:
-    Returns None if no TimeoutRetryThreadGroup is tracking the current thread.
-  """
-  thread_group = reraiser_thread.CurrentThreadGroup()
-  while thread_group:
-    if isinstance(thread_group, TimeoutRetryThreadGroup):
-      return thread_group
-    thread_group = thread_group.blocked_parent_thread_group
-  return None
-
-
-def WaitFor(condition, wait_period=5, max_tries=None):
-  """Wait for a condition to become true.
-
-  Repeatedly call the function condition(), with no arguments, until it returns
-  a true value.
-
-  If called within a TimeoutRetryThreadGroup, it cooperates nicely with it.
-
-  Args:
-    condition: function with the condition to check
-    wait_period: number of seconds to wait before retrying to check the
-      condition
-    max_tries: maximum number of checks to make, the default tries forever
-      or until the TimeoutRetryThreadGroup expires.
-
-  Returns:
-    The true value returned by the condition, or None if the condition was
-    not met after max_tries.
-
-  Raises:
-    reraiser_thread.TimeoutError: if the current thread is a
-      TimeoutRetryThreadGroup and the timeout expires.
-  """
-  condition_name = condition.__name__
-  timeout_thread_group = CurrentTimeoutThreadGroup()
-  while max_tries is None or max_tries > 0:
-    result = condition()
-    if max_tries is not None:
-      max_tries -= 1
-    msg = ['condition', repr(condition_name), 'met' if result else 'not met']
-    if timeout_thread_group:
-      # pylint: disable=no-member
-      msg.append('(%.1fs)' % timeout_thread_group.GetElapsedTime())
-    logger.info(' '.join(msg))
-    if result:
-      return result
-    if timeout_thread_group:
-      # pylint: disable=no-member
-      timeout_thread_group.GetRemainingTime(
-          wait_period, suffix=' waiting for condition %r' % condition_name)
-    if wait_period:
-      time.sleep(wait_period)
-  return None
-
-
-def AlwaysRetry(_exception):
-  return True
-
-
-def Run(func,
-        timeout,
-        retries,
-        args=None,
-        kwargs=None,
-        desc=None,
-        error_log_func=logging.critical,
-        retry_if_func=AlwaysRetry):
-  """Runs the passed function in a separate thread with timeouts and retries.
-
-  Args:
-    func: the function to be wrapped.
-    timeout: the timeout in seconds for each try.
-    retries: the number of retries.
-    args: list of positional args to pass to |func|.
-    kwargs: dictionary of keyword args to pass to |func|.
-    desc: An optional description of |func| used in logging. If omitted,
-      |func.__name__| will be used.
-    error_log_func: Logging function when logging errors.
-    retry_if_func: Unary callable that takes an exception and returns
-      whether |func| should be retried. Defaults to always retrying.
-
-  Returns:
-    The return value of func(*args, **kwargs).
-  """
-  if not args:
-    args = []
-  if not kwargs:
-    kwargs = {}
-  if not desc:
-    desc = func.__name__
-
-  num_try = 1
-  while True:
-    thread_name = 'TimeoutThread-%d-for-%s' % (num_try,
-                                               threading.current_thread().name)
-    child_thread = reraiser_thread.ReraiserThread(
-        lambda: func(*args, **kwargs), name=thread_name)
-    try:
-      thread_group = TimeoutRetryThreadGroup(timeout, threads=[child_thread])
-      thread_group.StartAll(will_block=True)
-      while True:
-        thread_group.JoinAll(
-            watcher=thread_group.GetWatcher(),
-            timeout=60,
-            error_log_func=error_log_func)
-        if thread_group.IsAlive():
-          logger.info('Still working on %s', desc)
-        else:
-          return thread_group.GetAllReturnValues()[0]
-    except reraiser_thread.TimeoutError as e:
-      # Timeouts already get their stacks logged.
-      if num_try > retries or not retry_if_func(e):
-        raise
-      # Do not catch KeyboardInterrupt.
-    except Exception as e:  # pylint: disable=broad-except
-      if num_try > retries or not retry_if_func(e):
-        raise
-      error_log_func('(%s) Exception on %s, attempt %d of %d: %r', thread_name,
-                     desc, num_try, retries + 1, e)
-    num_try += 1
diff --git a/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py b/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py
deleted file mode 100755
index cf97bb9..0000000
--- a/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Unittests for timeout_and_retry.py."""
-
-import logging
-import time
-import unittest
-
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-_DEFAULT_TIMEOUT = .1
-
-
-class TestException(Exception):
-  pass
-
-
-def _CountTries(tries):
-  tries[0] += 1
-  raise TestException
-
-
-class TestRun(unittest.TestCase):
-  """Tests for timeout_retry.Run."""
-
-  def testRun(self):
-    self.assertTrue(timeout_retry.Run(lambda x: x, 30, 3, [True], {}))
-
-  def testTimeout(self):
-    tries = [0]
-
-    def _sleep():
-      tries[0] += 1
-      time.sleep(1)
-
-    self.assertRaises(
-        reraiser_thread.TimeoutError,
-        timeout_retry.Run,
-        _sleep,
-        .01,
-        1,
-        error_log_func=logging.debug)
-    self.assertEqual(tries[0], 2)
-
-  def testRetries(self):
-    tries = [0]
-    self.assertRaises(
-        TestException,
-        timeout_retry.Run,
-        lambda: _CountTries(tries),
-        _DEFAULT_TIMEOUT,
-        3,
-        error_log_func=logging.debug)
-    self.assertEqual(tries[0], 4)
-
-  def testNoRetries(self):
-    tries = [0]
-    self.assertRaises(
-        TestException,
-        timeout_retry.Run,
-        lambda: _CountTries(tries),
-        _DEFAULT_TIMEOUT,
-        0,
-        error_log_func=logging.debug)
-    self.assertEqual(tries[0], 1)
-
-  def testReturnValue(self):
-    self.assertTrue(timeout_retry.Run(lambda: True, _DEFAULT_TIMEOUT, 3))
-
-  def testCurrentTimeoutThreadGroup(self):
-    def InnerFunc():
-      current_thread_group = timeout_retry.CurrentTimeoutThreadGroup()
-      self.assertIsNotNone(current_thread_group)
-
-      def InnerInnerFunc():
-        self.assertEqual(current_thread_group,
-                         timeout_retry.CurrentTimeoutThreadGroup())
-        return True
-
-      return reraiser_thread.RunAsync((InnerInnerFunc, ))[0]
-
-    self.assertTrue(timeout_retry.Run(InnerFunc, _DEFAULT_TIMEOUT, 3))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/systrace/catapult/devil/devil/utils/update_dependencies.py b/systrace/catapult/devil/devil/utils/update_dependencies.py
deleted file mode 100755
index 513c638..0000000
--- a/systrace/catapult/devil/devil/utils/update_dependencies.py
+++ /dev/null
@@ -1,218 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Updates the chromium binaries used by devil.
-
-This currently must be called from the top-level chromium src directory.
-"""
-
-import argparse
-import collections
-import json
-import logging
-import os
-import sys
-
-_DEVIL_ROOT_DIR = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), '..', '..'))
-
-sys.path.append(_DEVIL_ROOT_DIR)
-from devil import base_error
-from devil import devil_env
-from devil.utils import cmd_helper
-
-_DEVICE_ARCHS = [
-    {
-        'cpu': 'arm',
-        'platform': 'android_armeabi-v7a',
-    },
-    {
-        'cpu': 'arm64',
-        'platform': 'android_arm64-v8a',
-    },
-    {
-        'cpu': 'x86',
-        'platform': 'android_x86',
-    },
-    {
-        'cpu': 'x64',
-        'platform': 'android_x86_64',
-    },
-]
-_HOST_ARCH = [{
-    # Host binaries use x86_64, not arm, but they build with the
-    # host toolchain within a target_cpu="arm" build.
-    'cpu': 'arm',
-    'platform': 'linux2_x86_64',
-}]
-
-_CHROMIUM_DEPS = {
-    'chromium_commands': {
-        'archs': _HOST_ARCH,
-        'build_path': 'lib.java/chromium_commands.dex.jar',
-        'target_name': 'chromium_commands_java',
-    },
-    'forwarder_device': {
-        'archs': _DEVICE_ARCHS,
-        'build_path': 'device_forwarder',
-        'target_name': 'forwarder2',
-    },
-    'forwarder_host': {
-        'archs': _HOST_ARCH,
-        'build_path': 'clang_x64/host_forwarder',
-        'target_name': 'forwarder2',
-    },
-    'md5sum_device': {
-        'archs': _DEVICE_ARCHS,
-        'build_path': 'md5sum_bin',
-        'target_name': 'md5sum',
-    },
-    'md5sum_host': {
-        'archs': _HOST_ARCH,
-        'build_path': 'clang_x64/md5sum_bin',
-        'target_name': 'md5sum',
-    },
-}
-
-
-def BuildTargetsForCpu(targets, cpu, output_dir):
-  logging.info('Building %s', cpu)
-
-  gn_args = [
-      'ffmpeg_branding="Chrome"',
-      'is_component_build=false',
-      'is_debug=false',
-      'proprietary_codecs=true',
-      'symbol_level=1',
-      'target_cpu="%s"' % cpu,
-      'target_os="android"',
-      'use_goma=true',
-  ]
-
-  cmd = ['gn', 'gen', '--args=%s' % (' '.join(gn_args)), output_dir]
-  ec = cmd_helper.RunCmd(cmd)
-  if ec:
-    raise base_error.BaseError('%s failed with %d' % (cmd, ec))
-
-  ec = cmd_helper.RunCmd(['autoninja', '-C', output_dir] + targets)
-  if ec:
-    raise base_error.BaseError('building %s failed with %d' % (cpu, ec))
-
-
-def UpdateDependency(dependency_name, dependency_info, local_path, platform):
-  bucket = dependency_info['cloud_storage_bucket']
-  folder = dependency_info['cloud_storage_base_folder']
-
-  # determine the hash
-  ec, sha1sum_output = cmd_helper.GetCmdStatusAndOutput(['sha1sum', local_path])
-  if ec:
-    raise base_error.BaseError(
-        'Failed to determine SHA1 for %s: %s' % (local_path, sha1sum_output))
-
-  dependency_sha1 = sha1sum_output.split()[0]
-
-  # upload
-  remote_path = '%s_%s' % (dependency_name, dependency_sha1)
-  gs_dest = 'gs://%s/%s/%s' % (bucket, folder, remote_path)
-  ec, gsutil_output = cmd_helper.GetCmdStatusAndOutput(
-      ['gsutil.py', 'cp', local_path, gs_dest])
-  if ec:
-    raise base_error.BaseError(
-        'Failed to upload %s to %s: %s' % (remote_path, gs_dest, gsutil_output))
-
-  # update entry in json
-  file_info = dependency_info['file_info']
-  if platform not in file_info:
-    file_info[platform] = {
-        'cloud_storage_hash': '',
-        # the user will need to manually update the download path after
-        # uploading a previously unknown dependency.
-        'download_path': 'FIXME',
-    }
-  file_info[platform]['cloud_storage_hash'] = dependency_sha1
-
-
-def UpdateChromiumDependencies(dependencies, args):
-  deps_by_platform = collections.defaultdict(list)
-  for dep_name, dep_info in _CHROMIUM_DEPS.iteritems():
-    archs = dep_info.get('archs', [])
-    for a in archs:
-      deps_by_platform[(a.get('cpu'), a.get('platform'))].append(
-          (dep_name, dep_info.get('build_path'), dep_info.get('target_name')))
-
-  for arch, arch_deps in deps_by_platform.iteritems():
-    targets = [target_name for _n, _b, target_name in arch_deps]
-    cpu, platform = arch
-    output_dir = os.path.join(args.chromium_src_dir, 'out-devil-deps', platform)
-    BuildTargetsForCpu(targets, cpu, output_dir)
-
-    for dep_name, build_path, _ in arch_deps:
-      local_path = os.path.abspath(os.path.join(output_dir, build_path))
-      UpdateDependency(dep_name,
-                       dependencies.get('dependencies', {}).get(dep_name, {}),
-                       local_path, platform)
-
-  return dependencies
-
-
-def UpdateGivenDependency(dependencies, args):
-  dep_name = args.name or os.path.basename(args.path)
-  if not dep_name in dependencies.get('dependencies', {}):
-    raise base_error.BaseError('Could not find dependency "%s" in %s' %
-                               (dep_name, args.dependencies_json))
-
-  UpdateDependency(dep_name,
-                   dependencies.get('dependencies', {}).get(dep_name, {}),
-                   args.path, args.platform)
-
-  return dependencies
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser(description=__doc__)
-
-  # pylint: disable=protected-access
-  parser.add_argument(
-      '--dependencies-json',
-      type=os.path.abspath,
-      default=devil_env._DEVIL_DEFAULT_CONFIG,
-      help='Binary dependency configuration file to update.')
-  # pylint: enable=protected-access
-
-  subparsers = parser.add_subparsers()
-  chromium_parser = subparsers.add_parser('chromium')
-  chromium_parser.add_argument(
-      '--chromium-src-dir',
-      type=os.path.realpath,
-      default=os.getcwd(),
-      help='Path to chromium/src checkout root.')
-  chromium_parser.set_defaults(update_dependencies=UpdateChromiumDependencies)
-
-  dependency_parser = subparsers.add_parser('dependency')
-  dependency_parser.add_argument('--name', help='Name of dependency to update.')
-  dependency_parser.add_argument(
-      '--path',
-      type=os.path.abspath,
-      help='Path to file to upload as new version of dependency.')
-  dependency_parser.add_argument(
-      '--platform', help='Platform of dependency to update.')
-  dependency_parser.set_defaults(update_dependencies=UpdateGivenDependency)
-
-  args = parser.parse_args(raw_args)
-
-  logging.getLogger().setLevel(logging.INFO)
-
-  with open(args.dependencies_json) as f:
-    dependencies = json.load(f)
-
-  dependencies = args.update_dependencies(dependencies, args)
-
-  with open(args.dependencies_json, 'w') as f:
-    json.dump(dependencies, f, indent=2, separators=(',', ': '), sort_keys=True)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/utils/usb_hubs.py b/systrace/catapult/devil/devil/utils/usb_hubs.py
deleted file mode 100644
index b83fb61..0000000
--- a/systrace/catapult/devil/devil/utils/usb_hubs.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-PLUGABLE_7PORT_LAYOUT = {1: 7, 2: 6, 3: 5, 4: {1: 4, 2: 3, 3: 2, 4: 1}}
-
-PLUGABLE_7PORT_USB3_LAYOUT = {1: {1: 1, 2: 2, 3: 3, 4: 4}, 2: 5, 3: 6, 4: 7}
-
-KEEDOX_LAYOUT = {1: 1, 2: 2, 3: 3, 4: {1: 4, 2: 5, 3: 6, 4: 7}}
-
-VIA_LAYOUT = {1: 1, 2: 2, 3: 3, 4: {1: 4, 2: 5, 3: 6, 4: 7}}
-
-
-class HubType(object):
-  def __init__(self, id_func, port_mapping):
-    """Defines a type of hub.
-
-    Args:
-      id_func: [USBNode -> bool] is a function that can be run on a node
-        to determine if the node represents this type of hub.
-      port_mapping: [dict(int:(int|dict))] maps virtual to physical port
-        numbers. For instance, {3:1, 1:2, 2:3} means that virtual port 3
-        corresponds to physical port 1, virtual port 1 corresponds to physical
-        port 2, and virtual port 2 corresponds to physical port 3. In the
-        case of hubs with "internal" topology, this is represented by nested
-        maps. For instance, {1:{1:1,2:2},2:{1:3,2:4}} means, e.g. that the
-        device plugged into physical port 3 will show up as being connected
-        to port 1, on a device which is connected to port 2 on the hub.
-    """
-    self._id_func = id_func
-    # v2p = "virtual to physical" ports
-    self._v2p_port = port_mapping
-
-  def IsType(self, node):
-    """Determines if the given Node is a hub of this type.
-
-    Args:
-      node: [USBNode] Node to check.
-    """
-    return self._id_func(node)
-
-  def GetPhysicalPortToNodeTuples(self, node):
-    """Gets devices connected to the physical ports on a hub of this type.
-
-    Args:
-      node: [USBNode] Node representing a hub of this type.
-
-    Yields:
-      A series of (int, USBNode) tuples giving a physical port
-      and the USBNode connected to it.
-
-    Raises:
-      ValueError: If the given node isn't a hub of this type.
-    """
-    if self.IsType(node):
-      for res in self._GppHelper(node, self._v2p_port):
-        yield res
-    else:
-      raise ValueError('Node must be a hub of this type')
-
-  def _GppHelper(self, node, mapping):
-    """Helper function for GetPhysicalPortToNodeMap.
-
-    Gets devices connected to physical ports, based on device tree
-    rooted at the given node and the mapping between virtual and physical
-    ports.
-
-    Args:
-      node: [USBNode] Root of tree to search for devices.
-      mapping: [dict] Mapping between virtual and physical ports.
-
-    Yields:
-      A series of (int, USBNode) tuples giving a physical port
-      and the Node connected to it.
-    """
-    for (virtual, physical) in mapping.items():
-      if node.HasPort(virtual):
-        if isinstance(physical, dict):
-          for res in self._GppHelper(node.PortToDevice(virtual), physical):
-            yield res
-        else:
-          yield (physical, node.PortToDevice(virtual))
-
-
-def _is_plugable_7port_hub(node):
-  """Check if a node is a Plugable 7-Port Hub
-  (Model USB2-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '1a40:0101' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return '1a40:0101' in node.PortToDevice(4).desc
-
-
-# Plugable 7-Port USB-3 Hubs show up twice in the USB devices list; they have
-# two different "branches", one which has USB2 devices and one which has
-# USB3 devices. The "part2" is the "USB-2" branch of the hub, the
-# "part3" is the "USB-3" branch of the hub.
-
-
-def _is_plugable_7port_usb3_part2_hub(node):
-  """Check if a node is the "USB2 branch" of
-  a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 1.
-  """
-  if '2109:2811' not in node.desc:
-    return False
-  if not node.HasPort(1):
-    return False
-  return '2109:2811' in node.PortToDevice(1).desc
-
-
-def _is_plugable_7port_usb3_part3_hub(node):
-  """Check if a node is the "USB3 branch" of
-  a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 1.
-  """
-  if '2109:8110' not in node.desc:
-    return False
-  if not node.HasPort(1):
-    return False
-  return '2109:8110' in node.PortToDevice(1).desc
-
-
-def _is_keedox_hub(node):
-  """Check if a node is a Keedox hub.
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '0bda:5411' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return '0bda:5411' in node.PortToDevice(4).desc
-
-
-def _is_via_hub(node):
-  """Check if a node is a Via Labs hub.
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '2109:2812' not in node.desc and '2109:0812' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return ('2109:2812' in node.PortToDevice(4).desc
-          or '2109:0812' in node.PortToDevice(4).desc)
-
-
-PLUGABLE_7PORT = HubType(_is_plugable_7port_hub, PLUGABLE_7PORT_LAYOUT)
-PLUGABLE_7PORT_USB3_PART2 = HubType(_is_plugable_7port_usb3_part2_hub,
-                                    PLUGABLE_7PORT_USB3_LAYOUT)
-PLUGABLE_7PORT_USB3_PART3 = HubType(_is_plugable_7port_usb3_part3_hub,
-                                    PLUGABLE_7PORT_USB3_LAYOUT)
-KEEDOX = HubType(_is_keedox_hub, KEEDOX_LAYOUT)
-VIA = HubType(_is_via_hub, VIA_LAYOUT)
-
-ALL_HUBS = [
-    PLUGABLE_7PORT, PLUGABLE_7PORT_USB3_PART2, PLUGABLE_7PORT_USB3_PART3,
-    KEEDOX, VIA
-]
-
-
-def GetHubType(type_name):
-  if type_name == 'plugable_7port':
-    return PLUGABLE_7PORT
-  elif type_name == 'plugable_7port_usb3_part2':
-    return PLUGABLE_7PORT_USB3_PART2
-  elif type_name == 'plugable_7port_usb3_part3':
-    return PLUGABLE_7PORT_USB3_PART3
-  elif type_name == 'keedox':
-    return KEEDOX
-  elif type_name == 'via':
-    return VIA
-  raise ValueError('Invalid hub type')
diff --git a/systrace/catapult/devil/devil/utils/watchdog_timer.py b/systrace/catapult/devil/devil/utils/watchdog_timer.py
deleted file mode 100644
index 2c8a225..0000000
--- a/systrace/catapult/devil/devil/utils/watchdog_timer.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""WatchdogTimer timeout objects."""
-
-import time
-
-
-class WatchdogTimer(object):
-  """A resetable timeout-based watchdog.
-
-  This object is threadsafe.
-  """
-
-  def __init__(self, timeout):
-    """Initializes the watchdog.
-
-    Args:
-      timeout: The timeout in seconds. If timeout is None it will never timeout.
-    """
-    self._start_time = time.time()
-    self._timeout = timeout
-
-  def Reset(self):
-    """Resets the timeout countdown."""
-    self._start_time = time.time()
-
-  def GetElapsed(self):
-    """Returns the elapsed time of the watchdog."""
-    return time.time() - self._start_time
-
-  def GetRemaining(self):
-    """Returns the remaining time of the watchdog."""
-    if self._timeout:
-      return self._timeout - self.GetElapsed()
-    else:
-      return None
-
-  def GetTimeout(self):
-    """Returns the timout of the watchdog."""
-    return self._timeout
-
-  def IsTimedOut(self):
-    """Whether the watchdog has timed out.
-
-    Returns:
-      True if the watchdog has timed out, False otherwise.
-    """
-    remaining = self.GetRemaining()
-    return remaining is not None and remaining < 0
diff --git a/systrace/catapult/devil/devil/utils/zip_utils.py b/systrace/catapult/devil/devil/utils/zip_utils.py
deleted file mode 100644
index aac9641..0000000
--- a/systrace/catapult/devil/devil/utils/zip_utils.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import json
-import logging
-import os
-import sys
-import zipfile
-
-if __name__ == '__main__':
-  _DEVIL_ROOT_DIR = os.path.abspath(
-      os.path.join(os.path.dirname(__file__), '..', '..'))
-  sys.path.append(_DEVIL_ROOT_DIR)
-
-from devil import devil_env
-from devil import base_error
-from devil.utils import cmd_helper
-
-with devil_env.SysPath(devil_env.PY_UTILS_PATH):
-  from py_utils import tempfile_ext
-
-logger = logging.getLogger(__name__)
-
-
-class ZipFailedError(base_error.BaseError):
-  """Raised on a failure to perform a zip operation."""
-  pass
-
-
-def _WriteToZipFile(zip_file, path, arc_path):
-  """Recursively write |path| to |zip_file| as |arc_path|.
-
-  zip_file: An open instance of zipfile.ZipFile.
-  path: An absolute path to the file or directory to be zipped.
-  arc_path: A relative path within the zip file to which the file or directory
-    located at |path| should be written.
-  """
-  if os.path.isdir(path):
-    for dir_path, _, file_names in os.walk(path):
-      dir_arc_path = os.path.join(arc_path, os.path.relpath(dir_path, path))
-      logger.debug('dir:  %s -> %s', dir_path, dir_arc_path)
-      zip_file.write(dir_path, dir_arc_path, zipfile.ZIP_STORED)
-      for f in file_names:
-        file_path = os.path.join(dir_path, f)
-        file_arc_path = os.path.join(dir_arc_path, f)
-        logger.debug('file: %s -> %s', file_path, file_arc_path)
-        zip_file.write(file_path, file_arc_path, zipfile.ZIP_DEFLATED)
-  else:
-    logger.debug('file: %s -> %s', path, arc_path)
-    zip_file.write(path, arc_path, zipfile.ZIP_DEFLATED)
-
-
-def _WriteZipFile(zip_path, zip_contents):
-  with zipfile.ZipFile(zip_path, 'w') as zip_file:
-    for path, arc_path in zip_contents:
-      _WriteToZipFile(zip_file, path, arc_path)
-
-
-def WriteZipFile(zip_path, zip_contents):
-  """Writes the provided contents to the given zip file.
-
-  Note that this uses python's zipfile module and is done in a separate
-  process to avoid hogging the GIL.
-
-  Args:
-    zip_path: String path to the zip file to write.
-    zip_contents: A list of (host path, archive path) tuples.
-
-  Raises:
-    ZipFailedError on failure.
-  """
-  zip_spec = {
-      'zip_path': zip_path,
-      'zip_contents': zip_contents,
-  }
-  with tempfile_ext.NamedTemporaryDirectory() as tmpdir:
-    json_path = os.path.join(tmpdir, 'zip_spec.json')
-    with open(json_path, 'w') as json_file:
-      json.dump(zip_spec, json_file)
-    ret, output, error = cmd_helper.GetCmdStatusOutputAndError(
-        [sys.executable,
-         os.path.abspath(__file__), '--zip-spec', json_path])
-
-  if ret != 0:
-    exc_msg = ['Failed to create %s' % zip_path]
-    exc_msg.extend('stdout:  %s' % l for l in output.splitlines())
-    exc_msg.extend('stderr:  %s' % l for l in error.splitlines())
-    raise ZipFailedError('\n'.join(exc_msg))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--zip-spec', required=True)
-
-  args = parser.parse_args(raw_args)
-
-  with open(args.zip_spec) as zip_spec_file:
-    zip_spec = json.load(zip_spec_file)
-
-  return _WriteZipFile(**zip_spec)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/systrace/catapult/devil/devil/utils/zip_utils_test.py b/systrace/catapult/devil/devil/utils/zip_utils_test.py
deleted file mode 100644
index 1afc3f4..0000000
--- a/systrace/catapult/devil/devil/utils/zip_utils_test.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-import zipfile
-
-from devil import devil_env
-from devil.utils import zip_utils
-
-with devil_env.SysPath(devil_env.PY_UTILS_PATH):
-  from py_utils import tempfile_ext
-
-
-class WriteZipFileTest(unittest.TestCase):
-  def testSimple(self):
-    with tempfile_ext.NamedTemporaryDirectory() as working_dir:
-      file1 = os.path.join(working_dir, 'file1.txt')
-      file2 = os.path.join(working_dir, 'file2.txt')
-
-      with open(file1, 'w') as f1:
-        f1.write('file1')
-      with open(file2, 'w') as f2:
-        f2.write('file2')
-
-      zip_tuples = [
-          (file1, 'foo/file1.txt'),
-          (file2, 'bar/file2.txt'),
-      ]
-
-      zip_path = os.path.join(working_dir, 'out.zip')
-      zip_utils.WriteZipFile(zip_path, zip_tuples)
-
-      self.assertTrue(zipfile.is_zipfile(zip_path))
-
-      actual = zipfile.ZipFile(zip_path)
-      expected_files = [
-          'foo/file1.txt',
-          'bar/file2.txt',
-      ]
-
-      self.assertEquals(sorted(expected_files), sorted(actual.namelist()))
diff --git a/systrace/catapult/devil/docs/adb_wrapper.md b/systrace/catapult/devil/docs/adb_wrapper.md
deleted file mode 100644
index 16a666f..0000000
--- a/systrace/catapult/devil/docs/adb_wrapper.md
+++ /dev/null
@@ -1,427 +0,0 @@
-# [devil.android.sdk.adb_wrapper](https://chromium.googlesource.com/catapult.git/+/HEAD/devil/devil/android/sdk/adb_wrapper.py)
-
-*This page was autogenerated. Run `devil/bin/generate_md_docs` to update*
-
-## AdbWrapper
-
-A wrapper around a local Android Debug Bridge executable.
-### AdbWrapper.Backup
-
-Write an archive of the device's data to |path|.
-```
-    Args:
-      path: Local path to store the backup file.
-      packages: List of to packages to be backed up.
-      apk: (optional) If set include the .apk files in the archive.
-      shared: (optional) If set buckup the device's SD card.
-      nosystem: (optional) If set exclude system applications.
-      include_all: (optional) If set back up all installed applications and
-        |packages| is optional.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.DisableVerity
-
-Disable Marshmallow's Verity security feature.
-```
-    Returns:
-      The output of the disable-verity command as a string.
-```
-
-
-### AdbWrapper.Emu
-
-Runs an emulator console command.
-```
-    See http://developer.android.com/tools/devices/emulator.html#console
-
-    Args:
-      cmd: The command to run on the emulator console.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the emulator console command.
-```
-
-
-### AdbWrapper.EnableVerity
-
-Enable Marshmallow's Verity security feature.
-```
-    Returns:
-      The output of the enable-verity command as a string.
-```
-
-
-### AdbWrapper.Forward
-
-Forward socket connections from the local socket to the remote socket.
-```
-    Sockets are specified by one of:
-      tcp:<port>
-      localabstract:<unix domain socket name>
-      localreserved:<unix domain socket name>
-      localfilesystem:<unix domain socket name>
-      dev:<character device name>
-      jdwp:<process pid> (remote only)
-
-    Args:
-      local: The host socket.
-      remote: The device socket.
-      allow_rebind: A boolean indicating whether adb may rebind a local socket;
-        otherwise, the default, an exception is raised if the local socket is
-        already being forwarded.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.ForwardList
-
-List all currently forwarded socket connections.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    Returns:
-      The output of adb forward --list as a string.
-```
-
-
-### AdbWrapper.ForwardRemove
-
-Remove a forward socket connection.
-```
-    Args:
-      local: The host socket.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.GetDevPath
-
-Gets the device path.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The device path (e.g. usb:3-4)
-```
-
-
-### AdbWrapper.GetDeviceSerial
-
-Gets the device serial number associated with this object.
-```
-    Returns:
-      Device serial number as a string.
-```
-
-
-### AdbWrapper.GetState
-
-Get device state.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      One of 'offline', 'bootloader', or 'device'.
-```
-
-
-### AdbWrapper.Install
-
-Install an apk on the device.
-```
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      allow_downgrade: (optional) If set, allows for downgrades.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      streaming: (optional) If not set, use default way to install.
-        If True, performs streaming install.
-        If False, app is pushed to device and be installed from there.
-        Note this option is not supported prior to adb version 1.0.40
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.InstallMultiple
-
-Install an apk with splits on the device.
-```
-    Args:
-      apk_paths: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      allow_downgrade: (optional) Allow versionCode downgrade.
-      partial: (optional) Package ID if apk_paths doesn't include all .apks.
-      streaming: (optional) If not set, use default way to install.
-        If True, performs streaming install.
-        If False, app is pushed to device and be installed from there.
-        Note this option is not supported prior to adb version 1.0.40
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.IterShell
-
-Runs a shell command and returns an iterator over its output lines.
-```
-    Args:
-      command: A string with the shell command to run.
-      timeout: Timeout in seconds.
-
-    Yields:
-      The output of the command line by line.
-```
-
-
-### AdbWrapper.JDWP
-
-List of PIDs of processes hosting a JDWP transport.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of PIDs as strings.
-```
-
-
-### AdbWrapper.Logcat
-
-Get an iterable over the logcat output.
-```
-    Args:
-      clear: If true, clear the logcat.
-      dump: If true, dump the current logcat contents.
-      filter_specs: If set, a list of specs to filter the logcat.
-      logcat_format: If set, the format in which the logcat should be output.
-        Options include "brief", "process", "tag", "thread", "raw", "time",
-        "threadtime", and "long"
-      ring_buffer: If set, a list of alternate ring buffers to request.
-        Options include "main", "system", "radio", "events", "crash" or "all".
-        The default is equivalent to ["main", "system", "crash"].
-      iter_timeout: If set and neither clear nor dump is set, the number of
-        seconds to wait between iterations. If no line is found before the
-        given number of seconds elapses, the iterable will yield None.
-      check_error: Whether to check the exit status of the logcat command.
-      timeout: (optional) If set, timeout per try in seconds. If clear or dump
-        is set, defaults to DEFAULT_TIMEOUT.
-      retries: (optional) If clear or dump is set, the number of retries to
-        attempt. Otherwise, does nothing.
-
-    Yields:
-      logcat output line by line.
-```
-
-
-### AdbWrapper.Ls
-
-List the contents of a directory on the device.
-```
-    Args:
-      path: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of pairs (filename, stat) for each file found in the directory,
-      where the stat object has the properties: st_mode, st_size, and st_time.
-
-    Raises:
-      AdbCommandFailedError if |path| does not specify a valid and accessible
-          directory in the device, or the output of "adb ls" command is less
-          than four columns
-```
-
-
-### AdbWrapper.Pull
-
-Pulls a file from the device to the host.
-```
-    Args:
-      remote: Path on the device filesystem.
-      local: Path on the host filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Push
-
-Pushes a file from the host to the device.
-```
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the device filesystem.
-      sync: (optional) Whether to only push files that are newer on the host.
-        Not supported when using adb prior to 1.0.39.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Raises:
-      AdbVersionError if sync=True with versions of adb prior to 1.0.39.
-```
-
-
-### AdbWrapper.Reboot
-
-Reboots the device.
-```
-    Args:
-      to_bootloader: (optional) If set reboots to the bootloader.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Remount
-
-Remounts the /system partition on the device read-write.
-### AdbWrapper.Restore
-
-Restore device contents from the backup archive.
-```
-    Args:
-      path: Host path to the backup archive.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Root
-
-Restarts the adbd daemon with root permissions, if possible.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Shell
-
-Runs a shell command on the device.
-```
-    Args:
-      command: A string with the shell command to run.
-      expect_status: (optional) Check that the command's exit status matches
-        this value. Default is 0. If set to None the test is skipped.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the shell command as a string.
-
-    Raises:
-      device_errors.AdbCommandFailedError: If the exit status doesn't match
-        |expect_status|.
-```
-
-
-### AdbWrapper.StartShell
-
-Starts a subprocess on the device and returns a handle to the process.
-```
-    Args:
-      args: A sequence of program arguments. The executable to run is the first
-        item in the sequence.
-
-    Returns:
-      An instance of subprocess.Popen associated with the live process.
-```
-
-
-### AdbWrapper.Uninstall
-
-Remove the app |package| from the device.
-```
-    Args:
-      package: The package to uninstall.
-      keep_data: (optional) If set keep the data and cache directories.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.WaitForDevice
-
-Block until the device is online.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.\_\_eq\_\_
-
-Consider instances equal if they refer to the same device.
-```
-    Args:
-      other: The instance to compare equality with.
-
-    Returns:
-      True if the instances are considered equal, false otherwise.
-```
-
-
-### AdbWrapper.\_\_init\_\_
-
-Initializes the AdbWrapper.
-```
-    Args:
-      device_serial: The device serial number as a string.
-```
-
-
-### AdbWrapper.\_\_repr\_\_
-
-### AdbWrapper.\_\_str\_\_
-
-The string representation of an instance.
-```
-    Returns:
-      The device serial number as a string.
-```
-
-
-## DeviceStat
-
-DeviceStat(st\_mode, st\_size, st\_time)
-### DeviceStat.\_\_getnewargs\_\_
-
-Return self as a plain tuple.  Used by copy and pickle.
-### DeviceStat.\_\_getstate\_\_
-
-Exclude the OrderedDict from pickling
-### DeviceStat.\_\_repr\_\_
-
-Return a nicely formatted representation string
-### VerifyLocalFileExists
-
-Verifies a local file exists.
-```
-  Args:
-    path: Path to the local file.
-
-  Raises:
-    IOError: If the file doesn't exist.
-```
-
-
diff --git a/systrace/catapult/devil/docs/device_blacklist.md b/systrace/catapult/devil/docs/device_blacklist.md
deleted file mode 100644
index c6eed51..0000000
--- a/systrace/catapult/devil/docs/device_blacklist.md
+++ /dev/null
@@ -1,59 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Device Blacklist
-
-## What is it?
-
-The device blacklist is a per-run list of devices detected to be in a known bad
-state along with the reason they are suspected of being in a bad state (offline,
-not responding, etc). It is stored as a json file. This gets reset every run
-during the device recovery step (currently part of `bb_device_status_check`).
-
-## Bots
-
-On bots, this is normally found at `//out/bad_devices.json`. If you are having
-problems with blacklisted devices locally even though a device is in a good
-state, you can safely delete this file.
-
-# Tools for interacting with device black list.
-
-You can interact with the device blacklist via [devil.android.device\_blacklist](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/device_blacklist.py).
-This allows for any interaction you would need with a device blacklist:
-
-  - Reading
-  - Writing
-  - Extending
-  - Resetting
-
-An example usecase of this is:
-```python
-from devil.android import device_blacklist
-
-blacklist = device_blacklist.Blacklist(blacklist_path)
-blacklisted_devices = blacklist.Read()
-for device in blacklisted_devices:
-  print 'Device %s is blacklisted' % device
-blacklist.Reset()
-new_blacklist = {'device_id1': {'timestamp': ts, 'reason': reason}}
-blacklist.Write(new_blacklist)
-blacklist.Extend([device_2, device_3], reason='Reason for blacklisting')
-```
-
-
-## Where it is used.
-
-The blacklist file path is passed directly to the following scripts in chromium:
-
-  - [test\_runner.py](https://cs.chromium.org/chromium/src/build/android/test_runner.py)
-  - [provision\_devices.py](https://cs.chromium.org/chromium/src/build/android/provision_devices.py)
-  - [bb\_device\_status\_check.py](https://cs.chromium.org/chromium/src/build/android/buildbot/bb_device_status_check.py)
-
-The blacklist is also used in the following scripts:
-
-  - [device\_status.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_status.py)
-  - [device\_recovery.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_recovery.py)
-
-
diff --git a/systrace/catapult/devil/docs/device_denylist.md b/systrace/catapult/devil/docs/device_denylist.md
deleted file mode 100644
index 0d654cd..0000000
--- a/systrace/catapult/devil/docs/device_denylist.md
+++ /dev/null
@@ -1,59 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Device Denylist
-
-## What is it?
-
-The device denylist is a per-run list of devices detected to be in a known bad
-state along with the reason they are suspected of being in a bad state (offline,
-not responding, etc). It is stored as a json file. This gets reset every run
-during the device recovery step (currently part of `bb_device_status_check`).
-
-## Bots
-
-On bots, this is normally found at `//out/bad_devices.json`. If you are having
-problems with denylisted devices locally even though a device is in a good
-state, you can safely delete this file.
-
-# Tools for interacting with device deny list.
-
-You can interact with the device denylist via [devil.android.device\_denylist](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/device_denylist.py).
-This allows for any interaction you would need with a device denylist:
-
-  - Reading
-  - Writing
-  - Extending
-  - Resetting
-
-An example usecase of this is:
-```python
-from devil.android import device_denylist
-
-denylist = device_denylist.Denylist(denylist_path)
-denylisted_devices = denylist.Read()
-for device in denylisted_devices:
-  print 'Device %s is denylisted' % device
-denylist.Reset()
-new_denylist = {'device_id1': {'timestamp': ts, 'reason': reason}}
-denylist.Write(new_denylist)
-denylist.Extend([device_2, device_3], reason='Reason for denylisting')
-```
-
-
-## Where it is used.
-
-The denylist file path is passed directly to the following scripts in chromium:
-
-  - [test\_runner.py](https://cs.chromium.org/chromium/src/build/android/test_runner.py)
-  - [provision\_devices.py](https://cs.chromium.org/chromium/src/build/android/provision_devices.py)
-  - [bb\_device\_status\_check.py](https://cs.chromium.org/chromium/src/build/android/buildbot/bb_device_status_check.py)
-
-The denylist is also used in the following scripts:
-
-  - [device\_status.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_status.py)
-  - [device\_recovery.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_recovery.py)
-
-
diff --git a/systrace/catapult/devil/docs/device_utils.md b/systrace/catapult/devil/docs/device_utils.md
deleted file mode 100644
index ad37d8e..0000000
--- a/systrace/catapult/devil/docs/device_utils.md
+++ /dev/null
@@ -1,1396 +0,0 @@
-# [devil.android.device_utils](https://chromium.googlesource.com/catapult.git/+/HEAD/devil/devil/android/device_utils.py)
-
-*This page was autogenerated. Run `devil/bin/generate_md_docs` to update*
-
-## DeviceUtils
-
-### DeviceUtils.BroadcastIntent
-
-Send a broadcast intent.
-```
-    Args:
-      intent: An Intent to broadcast.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ChangeOwner
-
-Changes file system ownership for permissions.
-```
-    Args:
-      owner_group: New owner and group to assign. Note that this should be a
-        string in the form user[.group] where the group is option.
-      paths: Paths to change ownership of.
-
-      Note that the -R recursive option is not supported by all Android
-      versions.
-```
-
-
-### DeviceUtils.ChangeSecurityContext
-
-Changes the SELinux security context for files.
-```
-    Args:
-      security_context: The new security context as a string
-      paths: Paths to change the security context of.
-
-      Note that the -R recursive option is not supported by all Android
-      versions.
-```
-
-
-### DeviceUtils.ClearApplicationState
-
-Clear all state for the given package.
-```
-    Args:
-      package: A string containing the name of the package to stop.
-      permissions: List of permissions to set after clearing data.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ClearCache
-
-Clears all caches.
-### DeviceUtils.DismissCrashDialogIfNeeded
-
-Dismiss the error/ANR dialog if present.
-```
-    Returns: Name of the crashed package if a dialog is focused,
-             None otherwise.
-```
-
-
-### DeviceUtils.DumpCacheData
-
-Dumps the current cache state to a string.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A serialized cache as a string.
-```
-
-
-### DeviceUtils.EnableRoot
-
-Restarts adbd with root privileges.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if root could not be enabled.
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.FileExists
-
-Checks whether the given file exists on the device.
-```
-    Arguments are the same as PathExists.
-```
-
-
-### DeviceUtils.FileSize
-
-Get the size of a file on the device.
-```
-    Note: This is implemented by parsing the output of the 'ls' command on
-    the device. On some Android versions, when passing a directory or special
-    file, the size is *not* reported and this function will throw an exception.
-
-    Args:
-      device_path: A string containing the path of a file on the device.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The size of the file in bytes.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device, or
-        its size cannot be determited for some reason.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ForceStop
-
-Close the application.
-```
-    Args:
-      package: A string containing the name of the package to stop.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetABI
-
-Gets the device main ABI.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's main ABI name. For supported ABIs, the return value will be
-      one of the values defined in devil.android.ndk.abis.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetAppWritablePath
-
-Get a path that on the device's SD card that apps can write.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A app-writeable path on the device's SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetApplicationDataDirectory
-
-Get the data directory on the device for the given package.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      The package's data directory.
-    Raises:
-      CommandFailedError if the package's data directory can't be found,
-        whether because it's not installed or otherwise.
-```
-
-
-### DeviceUtils.GetApplicationPaths
-
-Get the paths of the installed apks on the device for the given package.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      List of paths to the apks on the device for the given package.
-```
-
-
-### DeviceUtils.GetApplicationPids
-
-Returns the PID or PIDs of a given process name.
-```
-    Note that the |process_name|, often the package name, must match exactly.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-      at_most_one: A boolean indicating that at most one PID is expected to
-                   be found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of the PIDs for the named process. If at_most_one=True returns
-      the single PID found or None otherwise.
-
-    Raises:
-      CommandFailedError if at_most_one=True and more than one PID is found
-          for the named process.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetApplicationTargetSdk
-
-Get the targetSdkVersion of a package installed on the device.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the targetSdkVersion or None if the package is not found on
-      the device. Note: this cannot always be cast to an integer. If this
-      application targets a pre-release SDK, this returns the version codename
-      instead (ex. "R").
-```
-
-
-### DeviceUtils.GetApplicationVersion
-
-Get the version name of a package installed on the device.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the version name or None if the package is not found
-      on the device.
-```
-
-
-### DeviceUtils.GetClientCache
-
-Returns client cache.
-### DeviceUtils.GetCountry
-
-Returns the country setting on the device.
-```
-    DEPRECATED: Prefer GetLocale() instead.
-
-    Args:
-      cache: Whether to use cached properties when available.
-```
-
-
-### DeviceUtils.GetEnforce
-
-Get the current mode of SELinux.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True (enforcing), False (permissive), or None (disabled).
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetExternalStoragePath
-
-Get the device's path to its SD card.
-```
-    Note: this path is read-only by apps in R+. Use GetAppWritablePath() to
-    obtain a path writable by apps.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's path to its SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetFeatures
-
-Returns the features supported on the device.
-### DeviceUtils.GetIMEI
-
-Get the device's IMEI.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's IMEI.
-
-    Raises:
-      AdbCommandFailedError on error
-```
-
-
-### DeviceUtils.GetLanguage
-
-Returns the language setting on the device.
-```
-    DEPRECATED: Prefer GetLocale() instead.
-
-    Args:
-      cache: Whether to use cached properties when available.
-```
-
-
-### DeviceUtils.GetLocale
-
-Returns the locale setting on the device.
-```
-    Args:
-      cache: Whether to use cached properties when available.
-    Returns:
-      A pair (language, country).
-```
-
-
-### DeviceUtils.GetLogcatMonitor
-
-Returns a new LogcatMonitor associated with this device.
-```
-    Parameters passed to this function are passed directly to
-    |logcat_monitor.LogcatMonitor| and are documented there.
-```
-
-
-### DeviceUtils.GetPackageArchitecture
-
-Get the architecture of a package installed on the device.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the architecture, or None if the package is missing.
-```
-
-
-### DeviceUtils.GetPids
-
-Returns the PIDs of processes containing the given name as substring.
-```
-    DEPRECATED
-
-    Note that the |process_name| is often the package name.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-                    If missing returns PIDs for all processes.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict mapping process name to a list of PIDs for each process that
-      contained the provided |process_name|.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetProp
-
-Gets a property from the device.
-```
-    Args:
-      property_name: A string containing the name of the property to get from
-                     the device.
-      cache: Whether to use cached properties when available.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The value of the device's |property_name| property.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetSecurityContextForPackage
-
-Gets the SELinux security context for the given package.
-```
-    Args:
-      package: Name of the package.
-      encrypted: Whether to check in the encrypted data directory
-          (/data/user_de/0/) or the unencrypted data directory (/data/data/).
-
-    Returns:
-      The package's security context as a string, or None if not found.
-```
-
-
-### DeviceUtils.GetTracingPath
-
-Gets tracing path from the device.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      /sys/kernel/debug/tracing for device with debugfs mount support;
-      /sys/kernel/tracing for device with tracefs support;
-      /sys/kernel/debug/tracing if support can't be determined.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetWebViewUpdateServiceDump
-
-Get the WebView update command sysdump on the device.
-```
-    Returns:
-      A dictionary with these possible entries:
-        FallbackLogicEnabled: True|False
-        CurrentWebViewPackage: "package name" or None
-        MinimumWebViewVersionCode: int
-        WebViewPackages: Dict of installed WebView providers, mapping "package
-            name" to "reason it's valid/invalid."
-
-    The returned dictionary may not include all of the above keys: this depends
-    on the support of the platform's underlying WebViewUpdateService. This may
-    return an empty dictionary on OS versions which do not support querying the
-    WebViewUpdateService.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GoHome
-
-Return to the home screen and obtain launcher focus.
-```
-    This command launches the home screen and attempts to obtain
-    launcher focus until the timeout is reached.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GrantPermissions
-
-### DeviceUtils.HasRoot
-
-Checks whether or not adbd has root privileges.
-```
-    A device is considered to have root if all commands are implicitly run
-    with elevated privileges, i.e. without having to use "su" to run them.
-
-    Note that some devices do not allow this implicit privilige elevation,
-    but _can_ run commands as root just fine when done explicitly with "su".
-    To check if your device can run commands with elevated privileges at all
-    use:
-
-      device.HasRoot() or device.NeedsSU()
-
-    Luckily, for the most part you don't need to worry about this and using
-    RunShellCommand(cmd, as_root=True) will figure out for you the right
-    command incantation to run with elevated privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if adbd has root privileges, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.Install
-
-Install an APK or app bundle.
-```
-    Noop if an identical APK is already installed. If installing a bundle, the
-    bundletools helper script (bin/*_bundle) should be used rather than the .aab
-    file.
-
-    Args:
-      apk: An ApkHelper instance or string containing the path to the APK or
-        bundle.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-        Ignored if |apk| is a bundle.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-      modules: An iterable containing specific bundle modules to install.
-          Error if set and |apk| points to an APK instead of a bundle.
-      fake_modules: An iterable containing specific bundle modules that should
-          have their apks copied to |MODULES_SRC_DIRECTORY_PATH| subdirectory
-          rather than installed. Thus the app can emulate SplitCompat while
-          running. This should not have any overlap with |modules|.
-      additional_locales: An iterable with additional locales to install for a
-        bundle.
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.InstallSplitApk
-
-Install a split APK.
-```
-    Noop if all of the APK splits are already installed.
-
-    Args:
-      base_apk: An ApkHelper instance or string containing the path to the base
-          APK.
-      split_apks: A list of strings of paths of all of the APK splits.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      allow_cached_props: Whether to use cached values for device properties.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-      DeviceVersionError if device SDK is less than Android L.
-```
-
-
-### DeviceUtils.IsApplicationInstalled
-
-Determines whether a particular package is installed on the device.
-```
-    Args:
-      package: Name of the package.
-      version_code: The version of the package to check for as an int, if
-          applicable. Only used for static shared libraries, otherwise ignored.
-
-    Returns:
-      True if the application is installed, False otherwise.
-```
-
-
-### DeviceUtils.IsOnline
-
-Checks whether the device is online.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is online, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.IsScreenOn
-
-Determines if screen is on.
-```
-    Dumpsys input_method exposes screen on/off state. Below is an explination of
-    the states.
-
-    Pre-L:
-      On: mScreenOn=true
-      Off: mScreenOn=false
-    L+:
-      On: mInteractive=true
-      Off: mInteractive=false
-
-    Returns:
-      True if screen is on, false if it is off.
-
-    Raises:
-      device_errors.CommandFailedError: If screen state cannot be found.
-```
-
-
-### DeviceUtils.IsUserBuild
-
-Checks whether or not the device is running a user build.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is running a user build, False otherwise (i.e. if
-        it's running a userdebug build).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.KillAll
-
-Kill all processes with the given name on the device.
-```
-    Args:
-      process_name: A string containing the name of the process to kill.
-      exact: A boolean indicating whether to kill all processes matching
-             the string |process_name| exactly, or all of those which contain
-             |process_name| as a substring. Defaults to False.
-      signum: An integer containing the signal number to send to kill. Defaults
-              to SIGKILL (9).
-      as_root: A boolean indicating whether the kill should be executed with
-               root privileges.
-      blocking: A boolean indicating whether we should wait until all processes
-                with the given |process_name| are dead.
-      quiet: A boolean indicating whether to ignore the fact that no processes
-             to kill were found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The number of processes attempted to kill.
-
-    Raises:
-      CommandFailedError if no process was killed and |quiet| is False.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ListDirectory
-
-List all files on a device directory.
-```
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of filenames for all entries contained in the directory.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ListProcesses
-
-Returns a list of tuples with info about processes on the device.
-```
-    This essentially parses the output of the |ps| command into convenient
-    ProcessInfo tuples.
-
-    Args:
-      process_name: A string used to filter the returned processes. If given,
-                    only processes whose name have this value as a substring
-                    will be returned.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of ProcessInfo tuples with |name|, |pid|, and |ppid| fields.
-```
-
-
-### DeviceUtils.LoadCacheData
-
-Initializes the cache from data created using DumpCacheData.
-```
-    The cache is used only if its token matches the one found on the device.
-    This prevents a stale cache from being used (which can happen when sharing
-    devices).
-
-    Args:
-      data: A previously serialized cache (string).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Whether the cache was loaded.
-```
-
-
-### DeviceUtils.NeedsSU
-
-Checks whether 'su' is needed to access protected resources.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if 'su' is available on the device and is needed to to access
-        protected resources; False otherwise if either 'su' is not available
-        (e.g. because the device has a user build), or not needed (because adbd
-        already has root privileges).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.PathExists
-
-Checks whether the given path(s) exists on the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      as_root: Whether root permissions should be use to check for the existence
-               of the given path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the all given paths exist on the device, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.PullFile
-
-Pull a file from the device.
-```
-    Args:
-      device_path: A string containing the absolute path of the file to pull
-                   from the device.
-      host_path: A string containing the absolute path of the destination on
-                 the host.
-      as_root: Whether root permissions should be used to pull the file.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.PushChangedFiles
-
-Push files to the device, skipping files that don't need updating.
-```
-    When a directory is pushed, it is traversed recursively on the host and
-    all files in it are pushed to the device as needed.
-    Additionally, if delete_device_stale option is True,
-    files that exist on the device but don't exist on the host are deleted.
-
-    Args:
-      host_device_tuples: A list of (host_path, device_path) tuples, where
-        |host_path| is an absolute path of a file or directory on the host
-        that should be minimially pushed to the device, and |device_path| is
-        an absolute path of the destination on the device.
-      delete_device_stale: option to delete stale files on device
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ReadFile
-
-Reads the contents of a file from the device.
-```
-    Args:
-      device_path: A string containing the absolute path of the file to read
-                   from the device.
-      as_root: A boolean indicating whether the read should be executed with
-               root privileges.
-      force_pull: A boolean indicating whether to force the operation to be
-          performed by pulling a file from the device. The default is, when the
-          contents are short, to retrieve the contents using cat instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The contents of |device_path| as a string. Contents are intepreted using
-      universal newlines, so the caller will see them encoded as '
-'. Also,
-      all lines will be terminated.
-
-    Raises:
-      AdbCommandFailedError if the file can't be read.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.Reboot
-
-Reboot the device.
-```
-    Note if the device has the root privilege, it will likely lose it after the
-    reboot. When |block| is True, it will try to restore the root status if
-    applicable.
-
-    Args:
-      block: A boolean indicating if we should wait for the reboot to complete.
-      wifi: A boolean indicating if we should wait for wifi to be enabled after
-        the reboot.
-        The option has no effect unless |block| is also True.
-      decrypt: A boolean indicating if we should wait for full-disk decryption
-        to complete after the reboot.
-        The option has no effect unless |block| is also True.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.RemovePath
-
-Removes the given path(s) from the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      force: Whether to remove the path(s) with force (-f).
-      recursive: Whether to remove any directories in the path(s) recursively.
-      as_root: Whether root permissions should be use to remove the given
-               path(s).
-      rename: Whether to rename the path(s) before removing to help avoid
-            filesystem errors. See https://stackoverflow.com/questions/11539657
-      timeout: timeout in seconds
-      retries: number of retries
-```
-
-
-### DeviceUtils.RestartAdbd
-
-### DeviceUtils.RunShellCommand
-
-Run an ADB shell command.
-```
-    The command to run |cmd| should be a sequence of program arguments
-    (preferred) or a single string with a shell script to run.
-
-    When |cmd| is a sequence, it is assumed to contain the name of the command
-    to run followed by its arguments. In this case, arguments are passed to the
-    command exactly as given, preventing any further processing by the shell.
-    This allows callers to easily pass arguments with spaces or special
-    characters without having to worry about quoting rules. Whenever possible,
-    it is recomended to pass |cmd| as a sequence.
-
-    When |cmd| is passed as a single string, |shell| should be set to True.
-    The command will be interpreted and run by the shell on the device,
-    allowing the use of shell features such as pipes, wildcards, or variables.
-    Failing to set shell=True will issue a warning, but this will be changed
-    to a hard failure in the future (see: catapult:#3242).
-
-    This behaviour is consistent with that of command runners in cmd_helper as
-    well as Python's own subprocess.Popen.
-
-    TODO(crbug.com/1029769) Change the default of |check_return| to True when
-    callers have switched to the new behaviour.
-
-    Args:
-      cmd: A sequence containing the command to run and its arguments, or a
-        string with a shell script to run (should also set shell=True).
-      shell: A boolean indicating whether shell features may be used in |cmd|.
-      check_return: A boolean indicating whether or not the return code should
-        be checked.
-      cwd: The device directory in which the command should be run.
-      env: The environment variables with which the command should be run.
-      run_as: A string containing the package as which the command should be
-        run.
-      as_root: A boolean indicating whether the shell command should be run
-        with root privileges.
-      single_line: A boolean indicating if only a single line of output is
-        expected.
-      large_output: Uses a work-around for large shell command output. Without
-        this large output will be truncated.
-      raw_output: Whether to only return the raw output
-          (no splitting into lines).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      If single_line is False, the output of the command as a list of lines,
-      otherwise, a string with the unique line of output emmited by the command
-      (with the optional newline at the end stripped).
-
-    Raises:
-      AdbCommandFailedError if check_return is True and the exit code of
-        the command run on the device is non-zero.
-      CommandFailedError if single_line is True but the output contains two or
-        more lines.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SendKeyEvent
-
-Sends a keycode to the device.
-```
-    See the devil.android.sdk.keyevent module for suitable keycode values.
-
-    Args:
-      keycode: A integer keycode to send to the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SetEnforce
-
-Modify the mode SELinux is running in.
-```
-    Args:
-      enabled: a boolean indicating whether to put SELinux in encorcing mode
-               (if True), or permissive mode (otherwise).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SetJavaAsserts
-
-Enables or disables Java asserts.
-```
-    Args:
-      enabled: A boolean indicating whether Java asserts should be enabled
-               or disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device-side property changed and a restart is required as a
-      result, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.SetProp
-
-Sets a property on the device.
-```
-    Args:
-      property_name: A string containing the name of the property to set on
-                     the device.
-      value: A string containing the value to set to the property on the
-             device.
-      check: A boolean indicating whether to check that the property was
-             successfully set on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if check is true and the property was not correctly
-        set on the device (e.g. because it is not rooted).
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.SetScreen
-
-Turns screen on and off.
-```
-    Args:
-      on: bool to decide state to switch to. True = on False = off.
-```
-
-
-### DeviceUtils.SetWebViewFallbackLogic
-
-Set whether WebViewUpdateService's "fallback logic" should be enabled.
-```
-    WebViewUpdateService has nonintuitive "fallback logic" for devices where
-    Monochrome (Chrome Stable) is preinstalled as the WebView provider, with a
-    "stub" (little-to-no code) implementation of standalone WebView.
-
-    "Fallback logic" (enabled by default) is designed, in the case where the
-    user has disabled Chrome, to fall back to the stub standalone WebView by
-    enabling the package. The implementation plumbs through the Chrome APK until
-    Play Store installs an update with the full implementation.
-
-    A surprising side-effect of "fallback logic" is that, immediately after
-    sideloading WebView, WebViewUpdateService re-disables the package and
-    uninstalls the update. This can prevent successfully using standalone
-    WebView for development, although "fallback logic" can be disabled on
-    userdebug/eng devices.
-
-    Because this is only relevant for devices with the standalone WebView stub,
-    this command is only relevant on N-P (inclusive).
-
-    You can determine if "fallback logic" is currently enabled by checking
-    FallbackLogicEnabled in the dictionary returned by
-    GetWebViewUpdateServiceDump.
-
-    Args:
-      enabled: bool - True for enabled, False for disabled
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SetWebViewImplementation
-
-Select the WebView implementation to the specified package.
-```
-    Args:
-      package_name: The package name of a WebView implementation. The package
-        must be already installed on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StartActivity
-
-Start package's activity on the device.
-```
-    Args:
-      intent_obj: An Intent object to send.
-      blocking: A boolean indicating whether we should wait for the activity to
-                finish launching.
-      trace_file_name: If present, a string that both indicates that we want to
-                       profile the activity and contains the path to which the
-                       trace should be saved.
-      force_stop: A boolean indicating whether we should stop the activity
-                  before starting it.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the activity could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StartInstrumentation
-
-### DeviceUtils.StartService
-
-Start a service on the device.
-```
-    Args:
-      intent_obj: An Intent object to send describing the service to start.
-      user_id: A specific user to start the service as, defaults to current.
-      timeout: Timeout in seconds.
-      retries: Number of retries
-
-    Raises:
-      CommandFailedError if the service could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StatDirectory
-
-List file and stat info for all entries on a device directory.
-```
-    Implementation notes: this is currently implemented by parsing the output
-    of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
-    make parsing strict and return values mirroring those of the standard |os|
-    and |stat| Python modules.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of dictionaries, each containing the following keys:
-        filename: A string with the file name.
-        st_mode: File permissions, use the stat module to interpret these.
-        st_nlink: Number of hard links (may be missing).
-        st_owner: A string with the user name of the owner.
-        st_group: A string with the group name of the owner.
-        st_rdev_pair: Device type as (major, minior) (only if inode device).
-        st_size: Size of file, in bytes (may be missing for non-regular files).
-        st_mtime: Time of most recent modification, in seconds since epoch
-          (although resolution is in minutes).
-        symbolic_link_to: If entry is a symbolic link, path where it points to;
-          missing otherwise.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StatPath
-
-Get the stat attributes of a file or directory on the device.
-```
-    Args:
-      device_path: A string containing the path of a file or directory from
-                   which to get attributes.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dictionary with the stat info collected; see StatDirectory for details.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.TakeBugReport
-
-Takes a bug report and dumps it to the specified path.
-```
-    This doesn't use adb's bugreport option since its behavior is dependent on
-    both adb version and device OS version. To make it simpler, this directly
-    runs the bugreport command on the device itself and dumps the stdout to a
-    file.
-
-    Args:
-      path: Path on the host to drop the bug report.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### DeviceUtils.TakeScreenshot
-
-Takes a screenshot of the device.
-```
-    Args:
-      host_path: A string containing the path on the host to save the
-                 screenshot to. If None, a file name in the current
-                 directory will be generated.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The name of the file on the host to which the screenshot was saved.
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.Uninstall
-
-Remove the app |package\_name| from the device.
-```
-    This is a no-op if the app is not already installed.
-
-    Args:
-      package_name: The package to uninstall.
-      keep_data: (optional) Whether to keep the data and cache directories.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-
-    Raises:
-      CommandFailedError if the uninstallation fails.
-      CommandTimeoutError if the uninstallation times out.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.WaitUntilFullyBooted
-
-Wait for the device to fully boot.
-```
-    This means waiting for the device to boot, the package manager to be
-    available, and the SD card to be ready.
-    It can optionally wait the following:
-     - Wait for wifi to come up.
-     - Wait for full-disk decryption to complete.
-
-    Args:
-      wifi: A boolean indicating if we should wait for wifi to come up or not.
-      decrypt: A boolean indicating if we should wait for full-disk decryption
-        to complete.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError if one of the component waits times out.
-      DeviceUnreachableError if the device becomes unresponsive.
-```
-
-
-### DeviceUtils.WriteFile
-
-Writes |contents| to a file on the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file to write
-          on the device.
-      contents: A string containing the data to write to the device.
-      as_root: A boolean indicating whether the write should be executed with
-          root privileges (if available).
-      force_push: A boolean indicating whether to force the operation to be
-          performed by pushing a file to the device. The default is, when the
-          contents are short, to pass the contents using a shell script instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the file could not be written on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.\_\_eq\_\_
-
-Checks whether |other| refers to the same device as |self|.
-```
-    Args:
-      other: The object to compare to. This can be a basestring, an instance
-        of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
-    Returns:
-      Whether |other| refers to the same device as |self|.
-```
-
-
-### DeviceUtils.\_\_init\_\_
-
-DeviceUtils constructor.
-```
-    Args:
-      device: Either a device serial, an existing AdbWrapper instance, or an
-        an existing AndroidCommands instance.
-      enable_device_files_cache: For PushChangedFiles(), cache checksums of
-        pushed files rather than recomputing them on a subsequent call.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-```
-
-
-### DeviceUtils.\_\_lt\_\_
-
-Compares two instances of DeviceUtils.
-```
-    This merely compares their serial numbers.
-
-    Args:
-      other: The instance of DeviceUtils to compare to.
-    Returns:
-      Whether |self| is less than |other|.
-```
-
-
-### DeviceUtils.\_\_str\_\_
-
-Returns the device serial.
-## ProcessInfo
-
-ProcessInfo(name, pid, ppid)
-### ProcessInfo.\_\_getnewargs\_\_
-
-Return self as a plain tuple.  Used by copy and pickle.
-### ProcessInfo.\_\_getstate\_\_
-
-Exclude the OrderedDict from pickling
-### ProcessInfo.\_\_repr\_\_
-
-Return a nicely formatted representation string
-### GetAVDs
-
-Returns a list of Android Virtual Devices.
-```
-  Returns:
-    A list containing the configured AVDs.
-```
-
-
-### RestartServer
-
-Restarts the adb server.
-```
-  Raises:
-    CommandFailedError if we fail to kill or restart the server.
-```
-
-
diff --git a/systrace/catapult/devil/docs/markdown.md b/systrace/catapult/devil/docs/markdown.md
deleted file mode 100644
index 605d4a9..0000000
--- a/systrace/catapult/devil/docs/markdown.md
+++ /dev/null
@@ -1,138 +0,0 @@
-# [devil.utils.markdown](https://chromium.googlesource.com/catapult.git/+/HEAD/devil/devil/utils/markdown.py)
-
-*This page was autogenerated. Run `devil/bin/generate_md_docs` to update*
-
-## MarkdownHelpAction
-
-### MarkdownHelpAction.\_\_call\_\_
-
-### MarkdownHelpAction.\_\_init\_\_
-
-## MarkdownHelpFormatter
-
-A really bare-bones argparse help formatter that generates valid markdown.
-```
-  This will generate something like:
-
-  usage
-
-  # **section heading**:
-
-  ## **--argument-one**
-
-  \`\`\`
-  argument-one help text
-  \`\`\`
-
-```
-
-
-### MarkdownHelpFormatter.format\_help
-
-### MarkdownHelpFormatter.start\_section
-
-### add\_md\_help\_argument
-
-Adds --md-help to the given argparse.ArgumentParser.
-```
-  Running a script with --md-help will print the help text for that script
-  as valid markdown.
-
-  Args:
-    parser: The ArgumentParser to which --md-help should be added.
-```
-
-
-### load\_module\_from\_path
-
-Load a module given only the path name.
-```
-  Also loads package modules as necessary.
-
-  Args:
-    module_path: An absolute path to a python module.
-  Returns:
-    The module object for the given path.
-```
-
-
-### main
-
-Write markdown documentation for the module at the provided path.
-```
-  Args:
-    raw_args: the raw command-line args. Usually sys.argv[1:].
-  Returns:
-    An integer exit code. 0 for success, non-zero for failure.
-```
-
-
-### md\_bold
-
-Returns markdown-formatted bold text.
-### md\_class
-
-Write markdown documentation for a class.
-```
-  Documents public methods. Does not currently document subclasses.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_code
-
-Returns a markdown-formatted code block in the given language.
-### md\_docstring
-
-Write a markdown-formatted docstring.
-```
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_escape
-
-Escapes \* and \_.
-### md\_function
-
-Write markdown documentation for a function.
-```
-  Args:
-    func_obj: a types.FunctionType object for the function that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_heading
-
-Returns markdown-formatted heading.
-### md\_inline\_code
-
-Returns markdown-formatted inline code.
-### md\_italic
-
-Returns markdown-formatted italic text.
-### md\_link
-
-returns a markdown-formatted link.
-### md\_module
-
-Write markdown documentation for a module.
-```
-  Documents public classes and functions.
-
-  Args:
-    module_obj: a module object that should be documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
diff --git a/systrace/catapult/devil/docs/persistent_device_list.md b/systrace/catapult/devil/docs/persistent_device_list.md
deleted file mode 100644
index 513f640..0000000
--- a/systrace/catapult/devil/docs/persistent_device_list.md
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Persistent Device List
-
-## What is it?
-
-A persistent device list that stores all expected devices between builds. It
-is used by non-swarmed bots to detect any missing/extra devices attached to
-them.
-
-This will be no longer needed when all bots are switched over to swarming.
-
-## Bots
-
-The list is usually located at:
-
-  - `~/.android/known_devices.json`.
-
-Look at recipes listed below in order to find more up to date location.
-
-## Local Runs
-
-The persistent device list is unnecessary for local runs. It is only used on the
-bots that upload data to the perf dashboard.
-
-## Where it is used
-
-The persistent device list is used in the
-[chromium_android](https://source.chromium.org/chromium/chromium/tools/build/+/HEAD:recipes/recipe_modules/chromium_android/api.py;l=50;drc=fd928820620dff8989e853accc54b1d61657f236)
-recipe module, and consumed by the
-[device_status.py](https://source.chromium.org/chromium/chromium/src/+/HEAD:third_party/catapult/devil/devil/android/tools/device_status.py;l=230;drc=1e5bef4469199e4daba5d8fd885966112f8a45d5)
-script among others.
diff --git a/systrace/catapult/devil/pylintrc b/systrace/catapult/devil/pylintrc
deleted file mode 100644
index 1a059cf..0000000
--- a/systrace/catapult/devil/pylintrc
+++ /dev/null
@@ -1,69 +0,0 @@
-[MESSAGES CONTROL]
-
-# Disable the message, report, category or checker with the given id(s).
-# TODO: Shrink this list to as small as possible.
-disable=
-  design,
-  similarities,
-
-  bad-continuation,
-  fixme,
-  import-error,
-  invalid-name,
-  locally-disabled,
-  locally-enabled,
-  missing-docstring,
-  star-args,
-  wrong-import-position,
-
-
-[REPORTS]
-
-# Don't write out full reports, just messages.
-reports=no
-
-
-[BASIC]
-
-# Regular expression which should only match correct function names.
-function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
-
-# Regular expression which should only match correct method names.
-method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
-
-# Regular expression which should only match correct argument names.
-argument-rgx=^[a-z][a-z0-9_]*$
-
-# Regular expression which should only match correct variable names.
-variable-rgx=^[a-z][a-z0-9_]*$
-
-# Good variable names which should always be accepted, separated by a comma.
-good-names=main,_
-
-# List of builtins function names that should not be used, separated by a comma.
-bad-functions=apply,input,reduce
-
-
-[VARIABLES]
-
-# Tells wether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching names used for dummy variables (i.e. not used).
-dummy-variables-rgx=^_.*$|dummy
-
-
-[TYPECHECK]
-
-# Tells wether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-
-[FORMAT]
-
-# Maximum number of lines in a module.
-max-module-lines=10000
-
-# We use two spaces for indents, instead of the usual four spaces or tab.
-indent-string='  '
diff --git a/systrace/catapult/systrace/PRESUBMIT.py b/systrace/catapult/systrace/PRESUBMIT.py
deleted file mode 100644
index 275dfdb..0000000
--- a/systrace/catapult/systrace/PRESUBMIT.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
-
-
-def _CommonChecks(input_api, output_api):
-  results = []
-  results += input_api.RunTests(input_api.canned_checks.GetPylint(
-      input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
-      pylintrc='pylintrc'))
-  return results
-
-
-def _GetPathsToPrepend(input_api):
-  project_dir = input_api.PresubmitLocalPath()
-  catapult_dir = input_api.os_path.join(project_dir, '..')
-  return [
-      project_dir,
-
-      input_api.os_path.join(catapult_dir, 'common', 'py_trace_event'),
-      input_api.os_path.join(catapult_dir, 'common', 'py_utils'),
-      input_api.os_path.join(catapult_dir, 'devil'),
-      input_api.os_path.join(catapult_dir, 'telemetry'),
-      input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
-      input_api.os_path.join(catapult_dir, 'tracing'),
-
-  ]
diff --git a/systrace/catapult/systrace/README.md b/systrace/catapult/systrace/README.md
deleted file mode 100644
index 3ca9249..0000000
--- a/systrace/catapult/systrace/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-<!-- Copyright 2015 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-Systrace
-========
-
-Systrace provides command-line tools to analyze the performance of your
-application. It currently includes
-[Android Systrace](http://developer.android.com/tools/help/systrace.html).
diff --git a/systrace/catapult/systrace/atrace_helper/README.md b/systrace/catapult/systrace/atrace_helper/README.md
deleted file mode 100644
index b5fd651..0000000
--- a/systrace/catapult/systrace/atrace_helper/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Copyright 2017 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-atrace_helper is an optional binary which can be pushed onto the device running
-systrace in order to enrich the traces with further details (memory, I/O, etc).
-
-Which problem is it solving?
----------------------------
-Some nice-to-have details are not present in the systrace, specifically:
- - Memory snapshots of running processes (PSS/RSS).
- - Periodic snapshotting of processes and thread names.
- - File paths for filesystem events (today they report only inode numbers).
-
-How is it solving it?
----------------------
-atrace_helper is a small userspace binary which is meant to be pushed on the
-device and run together with atrace by a dedicated tracing agent. When stopped,
-the helper produces a JSON file which contains all the relevant details
-(see --help). The JSON file is consumed by the TraceViewer importers and the
-extra details are merged into the final model.
-
-Build instructions
-------------------
-Building the binary requires the Android NDK to be installed. See
-[Android NDK page](https://developer.android.com/ndk).
-Once installed the binary can be just built as follows:
-`$(NDK_HOME)/ndk-build`
-The binary will be built in `libs/armeabi-v7a/`
diff --git a/systrace/catapult/systrace/atrace_helper/jni/Application.mk b/systrace/catapult/systrace/atrace_helper/jni/Application.mk
deleted file mode 100644
index cc2eb67..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/Application.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-APP_ABI := armeabi-v7a
-APP_PLATFORM := android-21
-APP_STL := c++_static
diff --git a/systrace/catapult/systrace/atrace_helper/jni/atrace_process_dump.cc b/systrace/catapult/systrace/atrace_helper/jni/atrace_process_dump.cc
deleted file mode 100644
index d4dada0..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/atrace_process_dump.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "atrace_process_dump.h"
-
-#include <inttypes.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "file_utils.h"
-#include "logging.h"
-#include "procfs_utils.h"
-
-namespace {
-
-const int kMemInfoIntervalMs = 100;  // 100ms-ish.
-
-}  // namespace
-
-AtraceProcessDump::AtraceProcessDump() {
-  self_pid_ = static_cast<int>(getpid());
-}
-
-AtraceProcessDump::~AtraceProcessDump() {
-}
-
-void AtraceProcessDump::SetDumpInterval(int interval_ms) {
-  CHECK(interval_ms >= kMemInfoIntervalMs);
-  dump_interval_in_timer_ticks_ = interval_ms / kMemInfoIntervalMs;
-  // Approximately equals to kMemInfoIntervalMs.
-  int tick_interval_ms = interval_ms / dump_interval_in_timer_ticks_;
-  snapshot_timer_ = std::unique_ptr<time_utils::PeriodicTimer>(
-      new time_utils::PeriodicTimer(tick_interval_ms));
-}
-
-void AtraceProcessDump::RunAndPrintJson(FILE* stream) {
-  out_ = stream;
-
-  fprintf(out_, "{\"start_ts\": \"%" PRIu64 "\", \"snapshots\":[\n",
-      time_utils::GetTimestamp());
-
-  CHECK(snapshot_timer_);
-  snapshot_timer_->Start();
-
-  int tick_count = std::numeric_limits<int>::max();
-  if (dump_count_ > 0)
-    tick_count = dump_count_ * dump_interval_in_timer_ticks_;
-
-  for (int tick = 0; tick < tick_count; tick++) {
-    if (tick > 0) {
-      if (!snapshot_timer_->Wait())
-        break;  // Interrupted by signal.
-      fprintf(out_, ",\n");
-    }
-    TakeAndSerializeMemInfo();
-    if (!(tick % dump_interval_in_timer_ticks_)) {
-      fprintf(out_, ",\n");
-      TakeGlobalSnapshot();
-      SerializeSnapshot();
-    }
-    fflush(out_);
-  }
-
-  fprintf(out_, "],\n");
-  SerializePersistentProcessInfo();
-  fprintf(out_, "}\n");
-  fflush(out_);
-  Cleanup();
-}
-
-void AtraceProcessDump::Stop() {
-  CHECK(snapshot_timer_);
-  snapshot_timer_->Stop();
-}
-
-void AtraceProcessDump::TakeGlobalSnapshot() {
-  snapshot_.clear();
-  snapshot_timestamp_ = time_utils::GetTimestamp();
-
-  file_utils::ForEachPidInProcPath("/proc", [this](int pid) {
-    // Skip if not regognized as a process.
-    if (!UpdatePersistentProcessInfo(pid))
-      return;
-    const ProcessInfo* process = processes_[pid].get();
-    // Snapshot can't be obtained for kernel workers.
-    if (process->in_kernel)
-      return;
-
-    ProcessSnapshot* process_snapshot = new ProcessSnapshot();
-    snapshot_[pid] = std::unique_ptr<ProcessSnapshot>(process_snapshot);
-
-    process_snapshot->pid = pid;
-    procfs_utils::ReadOomStats(process_snapshot);
-    procfs_utils::ReadPageFaultsAndCpuTimeStats(process_snapshot);
-
-    if (ShouldTakeFullDump(process)) {
-      process_snapshot->memory.ReadFullStats(pid);
-    } else {
-      process_snapshot->memory.ReadLightStats(pid);
-    }
-    if (graphics_stats_ && process->is_app) {
-      process_snapshot->memory.ReadGpuStats(pid);
-    }
-  });
-}
-
-bool AtraceProcessDump::UpdatePersistentProcessInfo(int pid) {
-  if (!processes_.count(pid)) {
-    if (procfs_utils::ReadTgid(pid) != pid)
-      return false;
-    processes_[pid] = procfs_utils::ReadProcessInfo(pid);
-  }
-  ProcessInfo* process = processes_[pid].get();
-  procfs_utils::ReadProcessThreads(process);
-
-  if (full_dump_mode_ == FullDumpMode::kOnlyWhitelisted &&
-      full_dump_whitelist_.count(process->name)) {
-    full_dump_whitelisted_pids_.insert(pid);
-  }
-  return true;
-}
-
-bool AtraceProcessDump::ShouldTakeFullDump(const ProcessInfo* process) {
-  if (full_dump_mode_ == FullDumpMode::kAllProcesses)
-    return !process->in_kernel && (process->pid != self_pid_);
-  if (full_dump_mode_ == FullDumpMode::kAllJavaApps)
-    return process->is_app;
-  if (full_dump_mode_ == FullDumpMode::kDisabled)
-    return false;
-  return full_dump_whitelisted_pids_.count(process->pid) > 0;
-}
-
-void AtraceProcessDump::SerializeSnapshot() {
-  fprintf(out_, "{\"ts\":\"%" PRIu64 "\",\"memdump\":{\n",
-          snapshot_timestamp_);
-  for (auto it = snapshot_.begin(); it != snapshot_.end();) {
-    const ProcessSnapshot* process = it->second.get();
-    const ProcessMemoryStats* mem = &process->memory;
-    fprintf(out_, "\"%d\":{", process->pid);
-
-    fprintf(out_, "\"vm\":%" PRIu64 ",\"rss\":%" PRIu64,
-            mem->virt_kb(), mem->rss_kb());
-
-    fprintf(out_, ",\"oom_sc\":%d,\"oom_sc_adj\":%d"
-                  ",\"min_flt\":%lu,\"maj_flt\":%lu"
-                  ",\"utime\":%lu,\"stime\":%lu",
-            process->oom_score, process->oom_score_adj,
-            process->minor_faults, process->major_faults,
-            process->utime, process->stime);
-
-    if (mem->full_stats_available()) {
-      fprintf(out_, ",\"pss\":%" PRIu64 ",\"swp\":%" PRIu64
-                    ",\"pc\":%" PRIu64 ",\"pd\":%" PRIu64
-                    ",\"sc\":%" PRIu64 ",\"sd\":%" PRIu64,
-              mem->pss_kb(), mem->swapped_kb(),
-              mem->private_clean_kb(), mem->private_dirty_kb(),
-              mem->shared_clean_kb(), mem->shared_dirty_kb());
-    }
-
-    if (mem->gpu_stats_available()) {
-      fprintf(out_, ",\"gpu_egl\":%" PRIu64 ",\"gpu_egl_pss\":%" PRIu64
-                    ",\"gpu_gl\":%" PRIu64 ",\"gpu_gl_pss\":%" PRIu64
-                    ",\"gpu_etc\":%" PRIu64 ",\"gpu_etc_pss\":%" PRIu64,
-              mem->gpu_graphics_kb(), mem->gpu_graphics_pss_kb(),
-              mem->gpu_gl_kb(), mem->gpu_gl_pss_kb(),
-              mem->gpu_other_kb(), mem->gpu_other_pss_kb());
-    }
-
-    // Memory maps are too heavy to serialize. Enable only in whitelisting mode.
-    if (print_smaps_ &&
-        full_dump_mode_ == FullDumpMode::kOnlyWhitelisted &&
-        mem->full_stats_available() &&
-        full_dump_whitelisted_pids_.count(process->pid)) {
-
-      fprintf(out_, ", \"mmaps\":[");
-      size_t n_mmaps = mem->mmaps_count();
-      for (size_t k = 0; k < n_mmaps; ++k) {
-        const ProcessMemoryStats::MmapInfo* mm = mem->mmap(k);
-        fprintf(out_,
-                "{\"vm\":\"%" PRIx64 "-%" PRIx64 "\","
-                "\"file\":\"%s\",\"flags\":\"%s\","
-                "\"pss\":%" PRIu64 ",\"rss\":%" PRIu64 ",\"swp\":%" PRIu64 ","
-                "\"pc\":%" PRIu64 ",\"pd\":%" PRIu64 ","
-                "\"sc\":%" PRIu64 ",\"sd\":%" PRIu64 "}",
-                mm->start_addr, mm->end_addr,
-                mm->mapped_file, mm->prot_flags,
-                mm->pss_kb, mm->rss_kb, mm->swapped_kb,
-                mm->private_clean_kb, mm->private_dirty_kb,
-                mm->shared_clean_kb, mm->shared_dirty_kb);
-        if (k < n_mmaps - 1)
-          fprintf(out_, ", ");
-      }
-      fprintf(out_, "]");
-    }
-
-    if (++it != snapshot_.end())
-      fprintf(out_, "},\n");
-    else
-      fprintf(out_, "}}\n");
-  }
-  fprintf(out_, "}");
-}
-
-void AtraceProcessDump::SerializePersistentProcessInfo() {
-  fprintf(out_, "\"processes\":{");
-  for (auto it = processes_.begin(); it != processes_.end();) {
-    const ProcessInfo* process = it->second.get();
-    fprintf(out_, "\"%d\":{", process->pid);
-    fprintf(out_, "\"name\":\"%s\"", process->name);
-
-    if (!process->in_kernel) {
-      fprintf(out_, ",\"exe\":\"%s\",", process->exe);
-      fprintf(out_, "\"threads\":{\n");
-      const auto threads = &process->threads;
-      for (auto thread_it = threads->begin(); thread_it != threads->end();) {
-        const ThreadInfo* thread = &(thread_it->second);
-        fprintf(out_, "\"%d\":{", thread->tid);
-        fprintf(out_, "\"name\":\"%s\"", thread->name);
-
-        if (++thread_it != threads->end())
-          fprintf(out_, "},\n");
-        else
-          fprintf(out_, "}\n");
-      }
-      fprintf(out_, "}");
-    }
-
-    if (++it != processes_.end())
-      fprintf(out_, "},\n");
-    else
-      fprintf(out_, "}\n");
-  }
-  fprintf(out_, "}");
-}
-
-void AtraceProcessDump::TakeAndSerializeMemInfo() {
-  std::map<std::string, uint64_t> mem_info;
-  CHECK(procfs_utils::ReadMemInfoStats(&mem_info));
-  fprintf(out_, "{\"ts\":\"%" PRIu64 "\",\"meminfo\":{\n",
-          time_utils::GetTimestamp());
-  for (auto it = mem_info.begin(); it != mem_info.end(); ++it) {
-    if (it != mem_info.begin())
-      fprintf(out_, ",");
-    fprintf(out_, "\"%s\":%" PRIu64, it->first.c_str(), it->second);
-  }
-  fprintf(out_, "}}");
-}
-
-void AtraceProcessDump::Cleanup() {
-  processes_.clear();
-  snapshot_.clear();
-  full_dump_whitelisted_pids_.clear();
-  snapshot_timer_ = nullptr;
-}
diff --git a/systrace/catapult/systrace/atrace_helper/jni/atrace_process_dump.h b/systrace/catapult/systrace/atrace_helper/jni/atrace_process_dump.h
deleted file mode 100644
index b71184a..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/atrace_process_dump.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ATRACE_PROCESS_DUMP_H_
-#define ATRACE_PROCESS_DUMP_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include "logging.h"
-#include "process_info.h"
-#include "time_utils.h"
-
-// Program that collects processes, thread names, per-process memory stats and
-// other minor metrics from /proc filesystem. It's aimed to extend systrace
-// with more actionable number to hit performance issues.
-class AtraceProcessDump {
- public:
-  enum FullDumpMode {
-    kDisabled,
-    kAllProcesses,
-    kAllJavaApps,
-    kOnlyWhitelisted,
-  };
-
-  AtraceProcessDump();
-  ~AtraceProcessDump();
-
-  void RunAndPrintJson(FILE* stream);
-  void Stop();
-
-  void SetDumpInterval(int interval_ms);
-
-  // Negative number or zero means unlimited number of dumps.
-  void set_dump_count(int count) { dump_count_ = count; }
-
-  void set_full_dump_mode(FullDumpMode mode) { full_dump_mode_ = mode; }
-  void set_full_dump_whitelist(const std::set<std::string> &whitelist) {
-    CHECK(full_dump_mode_ == FullDumpMode::kOnlyWhitelisted);
-    full_dump_whitelist_ = whitelist;
-  }
-  void enable_graphics_stats() { graphics_stats_ = true; }
-  void enable_print_smaps() { print_smaps_ = true; }
-
- private:
-  AtraceProcessDump(const AtraceProcessDump&) = delete;
-  void operator=(const AtraceProcessDump&) = delete;
-
-  using ProcessMap = std::map<int, std::unique_ptr<ProcessInfo>>;
-  using ProcessSnapshotMap = std::map<int, std::unique_ptr<ProcessSnapshot>>;
-
-  void TakeGlobalSnapshot();
-  void TakeAndSerializeMemInfo();
-  bool UpdatePersistentProcessInfo(int pid);
-  bool ShouldTakeFullDump(const ProcessInfo* process);
-  void SerializeSnapshot();
-  void SerializePersistentProcessInfo();
-  void Cleanup();
-
-  int self_pid_;
-  int dump_count_;
-  bool graphics_stats_ = false;
-  bool print_smaps_ = false;
-  FullDumpMode full_dump_mode_ = FullDumpMode::kDisabled;
-  std::set<std::string> full_dump_whitelist_;
-
-  FILE* out_;
-  ProcessMap processes_;
-  ProcessSnapshotMap snapshot_;
-  uint64_t snapshot_timestamp_;
-  std::set<int> full_dump_whitelisted_pids_;
-  std::unique_ptr<time_utils::PeriodicTimer> snapshot_timer_;
-  int dump_interval_in_timer_ticks_;
-};
-
-#endif  // ATRACE_PROCESS_DUMP_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc b/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc
deleted file mode 100644
index 7d122d6..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "file_utils.h"
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-namespace {
-
-bool IsNumeric(const char* str) {
-  if (!str[0])
-    return false;
-  for (const char* c = str; *c; c++) {
-    if (!isdigit(*c))
-      return false;
-  }
-  return true;
-}
-
-}  // namespace
-
-namespace file_utils {
-
-void ForEachPidInProcPath(const char* proc_path,
-                          std::function<void(int)> predicate) {
-  DIR* root_dir = opendir(proc_path);
-  ScopedDir autoclose(root_dir);
-  struct dirent* child_dir;
-  while ((child_dir = readdir(root_dir))) {
-    if (child_dir->d_type != DT_DIR || !IsNumeric(child_dir->d_name))
-      continue;
-    predicate(atoi(child_dir->d_name));
-  }
-}
-
-ssize_t ReadFile(const char* path, char* buf, size_t length) {
-  buf[0] = '\0';
-  int fd = open(path, O_RDONLY);
-  if (fd < 0 && errno == ENOENT)
-    return -1;
-  ScopedFD autoclose(fd);
-  size_t tot_read = 0;
-  do {
-    ssize_t rsize = read(fd, buf + tot_read, length - tot_read);
-    if (rsize == 0)
-      break;
-    if (rsize == -1 && errno == EINTR)
-      continue;
-    else if (rsize < 0)
-      return -1;
-    tot_read += static_cast<size_t>(rsize);
-  } while (tot_read < length);
-  buf[tot_read < length ? tot_read : length - 1] = '\0';
-  return tot_read;
-}
-
-bool ReadFileTrimmed(const char* path, char* buf, size_t length) {
-  ssize_t rsize = ReadFile(path, buf, length);
-  if (rsize < 0)
-    return false;
-  for (ssize_t i = 0; i < rsize; i++) {
-    const char c = buf[i];
-    if (c == '\0' || c == '\r' || c == '\n') {
-      buf[i] = '\0';
-      break;
-    }
-    buf[i] = isprint(c) ? c : '?';
-  }
-  return true;
-}
-
-ssize_t ReadProcFile(int pid, const char* proc_file, char* buf, size_t length) {
-  char proc_path[128];
-  snprintf(proc_path, sizeof(proc_path), "/proc/%d/%s", pid, proc_file);
-  return ReadFile(proc_path, buf, length);
-}
-
-// Reads a single-line proc file, stripping out any \0, \r, \n and replacing
-// non-printable charcters with '?'.
-bool ReadProcFileTrimmed(int pid,
-                         const char* proc_file,
-                         char* buf,
-                         size_t length) {
-  char proc_path[128];
-  snprintf(proc_path, sizeof(proc_path), "/proc/%d/%s", pid, proc_file);
-  return ReadFileTrimmed(proc_path, buf, length);
-}
-
-LineReader::LineReader(char* buf, size_t size)
-    : ptr_(buf), end_(buf + size) {
-}
-
-LineReader::~LineReader() {
-}
-
-const char* LineReader::NextLine() {
-  if (ptr_ >= end_)
-    return nullptr;
-  const char* cur = ptr_;
-  char* next = strchr(ptr_, '\n');
-  if (next) {
-    *next = '\0';
-    ptr_ = next + 1;
-  } else {
-    ptr_ = end_;
-  }
-  return cur;
-}
-
-}  // namespace file_utils
diff --git a/systrace/catapult/systrace/atrace_helper/jni/file_utils.h b/systrace/catapult/systrace/atrace_helper/jni/file_utils.h
deleted file mode 100644
index 2b2556b..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/file_utils.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FILE_UTILS_H_
-#define FILE_UTILS_H_
-
-#include <dirent.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <functional>
-#include <map>
-#include <memory>
-
-#include "logging.h"
-
-namespace file_utils {
-
-// RAII classes for auto-releasing fd/dirs.
-template <typename RESOURCE_TYPE, int (*CLOSE_FN)(RESOURCE_TYPE)>
-struct ScopedResource {
-  explicit ScopedResource(RESOURCE_TYPE r) : r_(r) { CHECK(r); }
-  ~ScopedResource() { CLOSE_FN(r_); }
-  RESOURCE_TYPE r_;
-};
-
-using ScopedFD = ScopedResource<int, close>;
-using ScopedDir = ScopedResource<DIR*, closedir>;
-
-// Invokes predicate(pid) for each folder in |proc_path|/[0-9]+ which has
-// a numeric name (typically pids and tids).
-void ForEachPidInProcPath(const char* proc_path,
-                          std::function<void(int)> predicate);
-
-// Reads the contents of |path| fully into |buf| up to |length| chars.
-// |buf| is guaranteed to be null terminated.
-ssize_t ReadFile(const char* path, char* buf, size_t length);
-
-// Reads a single-line file, stripping out any \0, \r, \n and replacing
-// non-printable charcters with '?'. |buf| is guaranteed to be null terminated.
-bool ReadFileTrimmed(const char* path, char* buf, size_t length);
-
-// Convenience wrappers for /proc/|pid|/|proc_file| paths.
-ssize_t ReadProcFile(int pid, const char* proc_file, char* buf, size_t length);
-bool ReadProcFileTrimmed(int pid,
-                         const char* proc_file,
-                         char* buf,
-                         size_t length);
-
-// Takes a C string buffer and chunks it into lines without creating any
-// copies. It modifies the original buffer, by replacing \n with \0.
-class LineReader {
- public:
-  LineReader(char* buf, size_t size);
-  ~LineReader();
-
-  const char* NextLine();
-
- private:
-  char* ptr_;
-  char* end_;
-};
-
-}  // namespace file_utils
-
-#endif  // FILE_UTILS_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/libmemtrack_wrapper.cc b/systrace/catapult/systrace/atrace_helper/jni/libmemtrack_wrapper.cc
deleted file mode 100644
index b6f0a57..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/libmemtrack_wrapper.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "libmemtrack_wrapper.h"
-
-#include <dlfcn.h>
-
-#include "logging.h"
-
-namespace {
-
-// Init memtrack service. Removed in the latest version.
-int (*memtrack_init)(void);
-
-// Allocate and dispose memory stats.
-libmemtrack_proc* (*memtrack_proc_new)(void);
-void (*memtrack_proc_destroy)(libmemtrack_proc* p);
-
-// Query memory stats for given process.
-int (*memtrack_proc_get)(libmemtrack_proc* p, pid_t pid);
-
-// Since memory stats is opaque structure, there are helpers to parse it.
-ssize_t (*memtrack_proc_graphics_total)(libmemtrack_proc* p);
-ssize_t (*memtrack_proc_graphics_pss)(libmemtrack_proc* p);
-ssize_t (*memtrack_proc_gl_total)(libmemtrack_proc* p);
-ssize_t (*memtrack_proc_gl_pss)(libmemtrack_proc* p);
-ssize_t (*memtrack_proc_other_total)(libmemtrack_proc* p);
-ssize_t (*memtrack_proc_other_pss)(libmemtrack_proc* p);
-
-typedef ssize_t (*libmemtrack_getter_t)(libmemtrack_proc*);
-
-bool g_initialized = false;
-bool g_broken = false;
-
-template <typename T>
-void Import(T** func, void* lib, const char* name) {
-  *(reinterpret_cast<void**>(func)) = dlsym(lib, name);
-}
-
-bool ImportLibmemtrackSymbols(void* handle) {
-  Import(&memtrack_init, handle, "memtrack_init");
-  Import(&memtrack_proc_new, handle, "memtrack_proc_new");
-  Import(&memtrack_proc_destroy, handle, "memtrack_proc_destroy");
-  Import(&memtrack_proc_get, handle, "memtrack_proc_get");
-  Import(&memtrack_proc_graphics_total, handle, "memtrack_proc_graphics_total");
-  Import(&memtrack_proc_graphics_pss, handle, "memtrack_proc_graphics_pss");
-  Import(&memtrack_proc_gl_total, handle, "memtrack_proc_gl_total");
-  Import(&memtrack_proc_gl_pss, handle, "memtrack_proc_gl_pss");
-  Import(&memtrack_proc_other_total, handle, "memtrack_proc_other_total");
-  Import(&memtrack_proc_other_pss, handle, "memtrack_proc_other_pss");
-
-  if (!memtrack_proc_new || !memtrack_proc_destroy || !memtrack_proc_get) {
-    LogError("Couldn't use libmemtrack. Probably it's API has been changed.");
-    return false;
-  }
-  // Initialization is required on pre-O Android.
-  if (memtrack_init && memtrack_init() != 0) {
-    LogError("Failed to initialize libmemtrack. "
-             "Probably implementation is missing in the ROM.");
-    return false;
-  }
-  return true;
-}
-
-bool LazyOpenLibmemtrack() {
-  if (g_initialized)
-    return true;
-  if (g_broken)
-    return false;
-
-  void *handle = dlopen("libmemtrack.so", RTLD_GLOBAL | RTLD_NOW);
-  if (handle == nullptr) {
-    LogError("Failed to open libmemtrack library.");
-    g_broken = true;
-    return false;
-  }
-
-  if (!ImportLibmemtrackSymbols(handle)) {
-    dlclose(handle);
-    g_broken = true;
-    return false;
-  }
-
-  g_initialized = true;
-  return true;
-}
-
-uint64_t GetOrZero(libmemtrack_getter_t getter, libmemtrack_proc* proc) {
-  if (!getter || !proc)
-    return 0;
-  return static_cast<uint64_t>(getter(proc));
-}
-
-}  // namespace
-
-MemtrackProc::MemtrackProc(int pid) {
-  if (!LazyOpenLibmemtrack())
-    return;
-
-  proc_ = memtrack_proc_new();
-  if (!proc_) {
-    LogError("Failed to create libmemtrack proc. "
-             "Probably it's API has been changed.");
-    return;
-  }
-
-  if (memtrack_proc_get(proc_, pid) != 0) {
-    // Don't log an error since not every process has memtrack stats.
-    memtrack_proc_destroy(proc_);
-    proc_ = nullptr;
-  }
-}
-
-MemtrackProc::~MemtrackProc() {
-  if (proc_)
-    memtrack_proc_destroy(proc_);
-}
-
-uint64_t MemtrackProc::graphics_total() const {
-  return GetOrZero(memtrack_proc_graphics_total, proc_);
-}
-
-uint64_t MemtrackProc::graphics_pss() const {
-  return GetOrZero(memtrack_proc_graphics_pss, proc_);
-}
-
-uint64_t MemtrackProc::gl_total() const {
-  return GetOrZero(memtrack_proc_gl_total, proc_);
-}
-
-uint64_t MemtrackProc::gl_pss() const {
-  return GetOrZero(memtrack_proc_gl_pss, proc_);
-}
-
-uint64_t MemtrackProc::other_total() const {
-  return GetOrZero(memtrack_proc_other_total, proc_);
-}
-
-uint64_t MemtrackProc::other_pss() const {
-  return GetOrZero(memtrack_proc_other_pss, proc_);
-}
diff --git a/systrace/catapult/systrace/atrace_helper/jni/libmemtrack_wrapper.h b/systrace/catapult/systrace/atrace_helper/jni/libmemtrack_wrapper.h
deleted file mode 100644
index cec5cec..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/libmemtrack_wrapper.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIBMEMTRACK_WRAPPER_H_
-#define LIBMEMTRACK_WRAPPER_H_
-
-#include <stdint.h>
-
-// Wrapper on top of libmemtrack API.
-
-// Opaque structure with memory stats.
-// See $ANDROID/system/core/libmemtrack/include/memtrack/memtrack.h for details.
-struct libmemtrack_proc;
-
-// These numbers are vendor-specific and can't be trusted as a stable metric
-// across different hardware or driver versions.
-class MemtrackProc {
- public:
-  explicit MemtrackProc(int pid);
-  ~MemtrackProc();
-
-  uint64_t graphics_total() const;
-  uint64_t graphics_pss() const;
-  uint64_t gl_total() const;
-  uint64_t gl_pss() const;
-  uint64_t other_total() const;
-  uint64_t other_pss() const;
-
-  bool has_errors() const { return proc_ == nullptr; };
-
- private:
-  MemtrackProc(const MemtrackProc&) = delete;
-  void operator=(const MemtrackProc&) = delete;
-
-  libmemtrack_proc* proc_ = nullptr;
-};
-
-#endif  // LIBMEMTRACK_WRAPPER_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/logging.h b/systrace/catapult/systrace/atrace_helper/jni/logging.h
deleted file mode 100644
index 824fddd..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/logging.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LOGGING_H_
-#define LOGGING_H_
-
-#include <android/log.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define CHECK_ARGS(COND, ERR)                                          \
-  "FAILED CHECK(%s) @ %s:%d (errno: %s)\n", #COND, __FILE__, __LINE__, \
-      strerror(ERR)
-
-#define CHECK(x)                                              \
-  do {                                                        \
-    if (!(x)) {                                               \
-      const int e = errno;                                    \
-      __android_log_print(ANDROID_LOG_FATAL, "atrace_helper", \
-                          CHECK_ARGS(x, e));                  \
-      fprintf(stderr, "\n" CHECK_ARGS(x, e));                 \
-      fflush(stderr);                                         \
-      abort();                                                \
-    }                                                         \
-  } while (0)
-
-inline void LogError(const char* message) {
-  __android_log_write(ANDROID_LOG_ERROR, "atrace_helper", message);
-  fprintf(stderr, "\n%s\n", message);
-  fflush(stderr);
-}
-
-#endif  // LOGGING_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/main.cc b/systrace/catapult/systrace/atrace_helper/jni/main.cc
deleted file mode 100644
index 68593b4..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/main.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <inttypes.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <memory>
-#include <set>
-#include <string>
-#include <sstream>
-
-#include "atrace_process_dump.h"
-#include "logging.h"
-
-namespace {
-
-std::unique_ptr<AtraceProcessDump> g_prog;
-
-void ParseFullDumpConfig(const std::string& config, AtraceProcessDump* prog) {
-  using FullDumpMode = AtraceProcessDump::FullDumpMode;
-  if (config == "all") {
-    prog->set_full_dump_mode(FullDumpMode::kAllProcesses);
-  } else if (config == "apps") {
-    prog->set_full_dump_mode(FullDumpMode::kAllJavaApps);
-  } else {
-    std::set<std::string> whitelist;
-    std::istringstream ss(config);
-    std::string entry;
-    while (std::getline(ss, entry, ',')) {
-      whitelist.insert(entry);
-    }
-    if (whitelist.empty())
-      return;
-    prog->set_full_dump_mode(FullDumpMode::kOnlyWhitelisted);
-    prog->set_full_dump_whitelist(whitelist);
-  }
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  if (argc == 2 && !strcmp(argv[1], "--echo-ts")) {
-    // Used by clock sync marker to correct the difference between
-    // Linux monotonic clocks on the device and host.
-    printf("%" PRIu64 "\n", time_utils::GetTimestamp());
-    return 0;
-  }
-
-  bool background = false;
-  int dump_interval_ms = 5000;
-  char out_file[PATH_MAX] = {};
-  bool dump_to_file = false;
-  int count = -1;
-
-  AtraceProcessDump* prog = new AtraceProcessDump();
-  g_prog = std::unique_ptr<AtraceProcessDump>(prog);
-
-  if (geteuid()) {
-    fprintf(stderr, "Must run as root\n");
-    exit(EXIT_FAILURE);
-  }
-
-  int opt;
-  while ((opt = getopt(argc, argv, "bm:gst:o:c:")) != -1) {
-    switch (opt) {
-      case 'b':
-        background = true;
-        break;
-      case 'm':
-        ParseFullDumpConfig(optarg, prog);
-        break;
-      case 'g':
-        prog->enable_graphics_stats();
-        break;
-      case 's':
-        prog->enable_print_smaps();
-        break;
-      case 't':
-        dump_interval_ms = atoi(optarg);
-        CHECK(dump_interval_ms > 0);
-        break;
-      case 'c':
-        count = atoi(optarg);
-        CHECK(count > 0);
-        break;
-      case 'o':
-        strncpy(out_file, optarg, sizeof(out_file));
-        dump_to_file = true;
-        break;
-      default:
-        fprintf(stderr,
-                "Usage: %s [-b] [-m full_dump_filter] [-g] [-s] "
-                "[-t dump_interval_ms] "
-                "[-c dumps_count] [-o out.json]\n",
-                argv[0]);
-        exit(EXIT_FAILURE);
-    }
-  }
-
-  prog->set_dump_count(count);
-  prog->SetDumpInterval(dump_interval_ms);
-
-  FILE* out_stream = stdout;
-  char tmp_file[PATH_MAX];
-  if (dump_to_file) {
-    unlink(out_file);
-    sprintf(tmp_file, "%s.tmp", out_file);
-    out_stream = fopen(tmp_file, "w");
-    CHECK(out_stream);
-  }
-
-  if (background) {
-    if (!dump_to_file) {
-      fprintf(stderr, "-b requires -o for output dump path.\n");
-      exit(EXIT_FAILURE);
-    }
-    printf("Continuing in background. kill -TERM to terminate the daemon.\n");
-    CHECK(daemon(0 /* nochdir */, 0 /* noclose */) == 0);
-  }
-
-  auto on_exit = [](int) { g_prog->Stop(); };
-  signal(SIGINT, on_exit);
-  signal(SIGTERM, on_exit);
-
-  prog->RunAndPrintJson(out_stream);
-  fclose(out_stream);
-
-  if (dump_to_file)
-    rename(tmp_file, out_file);
-}
diff --git a/systrace/catapult/systrace/atrace_helper/jni/process_info.h b/systrace/catapult/systrace/atrace_helper/jni/process_info.h
deleted file mode 100644
index 089e77e..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/process_info.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PROCESS_INFO_H_
-#define PROCESS_INFO_H_
-
-#include <map>
-
-#include "process_memory_stats.h"
-
-struct ThreadInfo {
-  int tid;
-  char name[16];
-};
-
-struct ProcessInfo {
-  int pid;
-  bool in_kernel;
-  bool is_app;
-  char name[256];
-  char exe[256];
-  std::map<int, ThreadInfo> threads;
-};
-
-struct ProcessSnapshot {
-  int pid;
-  ProcessMemoryStats memory;
-  // OOM badness and tolerance (oom_adj is deprecated).
-  int oom_score;
-  int oom_score_adj;
-  // Page faults.
-  unsigned long minor_faults;
-  unsigned long major_faults;
-  // Time spent in userspace and in the kernel.
-  unsigned long utime;
-  unsigned long stime;
-};
-
-#endif  // PROCESS_INFO_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc b/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc
deleted file mode 100644
index fbad23b..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "process_memory_stats.h"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <memory>
-
-#include "file_utils.h"
-#include "libmemtrack_wrapper.h"
-#include "logging.h"
-
-namespace {
-
-const int kKbPerPage = 4;
-
-const char kRss[] = "Rss";
-const char kPss[] = "Pss";
-const char kSwap[] = "Swap";
-const char kSharedClean[] = "Shared_Clean";
-const char kSharedDirty[] = "Shared_Dirty";
-const char kPrivateClean[] = "Private_Clean";
-const char kPrivateDirty[] = "Private_Dirty";
-
-bool ReadSmapsMetric(
-    const char* line, const char* metric, int metric_size, uint64_t* res) {
-  if (strncmp(line, metric, metric_size - 1))
-    return false;
-  if (line[metric_size - 1] != ':')
-    return false;
-  *res = strtoull(line + metric_size, nullptr, 10);
-  return true;
-}
-
-}  // namespace
-
-bool ProcessMemoryStats::ReadLightStats(int pid) {
-  char buf[64];
-  if (file_utils::ReadProcFile(pid, "statm", buf, sizeof(buf)) <= 0)
-    return false;
-  uint32_t vm_size_pages;
-  uint32_t rss_pages;
-  int res = sscanf(buf, "%u %u", &vm_size_pages, &rss_pages);
-  CHECK(res == 2);
-  rss_kb_ = rss_pages * kKbPerPage;
-  virt_kb_ = vm_size_pages * kKbPerPage;
-  return true;
-}
-
-bool ProcessMemoryStats::ReadFullStats(int pid) {
-  const size_t kBufSize = 8u * 1024 * 1024;
-  std::unique_ptr<char[]> buf(new char[kBufSize]);
-  ssize_t rsize = file_utils::ReadProcFile(pid, "smaps", &buf[0], kBufSize);
-  if (rsize <= 0)
-    return false;
-  MmapInfo* last_mmap_entry = nullptr;
-  std::unique_ptr<MmapInfo> new_mmap(new MmapInfo());
-  CHECK(mmaps_.empty());
-  CHECK(rss_kb_ == 0);
-
-  // Iterate over all lines in /proc/PID/smaps.
-  file_utils::LineReader rd(&buf[0], rsize);
-  for (const char* line = rd.NextLine(); line; line = rd.NextLine()) {
-    if (!line[0])
-      continue;
-    // Performance optimization (hack).
-    // Any header line starts with lowercase hex digit but subsequent lines
-    // start with uppercase letter.
-    if (line[0] < 'A' || line[0] > 'Z') {
-      // Note that the mapped file name ([stack]) is optional and won't be
-      // present on anonymous memory maps (hence res >= 3 below).
-      int res = sscanf(line,
-          "%" PRIx64 "-%" PRIx64 " %4s %*" PRIx64 " %*[:0-9a-f] "
-          "%*[0-9a-f]%*[ \t]%127[^\n]",
-          &new_mmap->start_addr, &new_mmap->end_addr, new_mmap->prot_flags,
-          new_mmap->mapped_file);
-      last_mmap_entry = new_mmap.get();
-      CHECK(new_mmap->end_addr >= new_mmap->start_addr);
-      new_mmap->virt_kb =
-          (new_mmap->end_addr - new_mmap->start_addr) / 1024;
-      if (res == 3)
-        new_mmap->mapped_file[0] = '\0';
-      virt_kb_ += new_mmap->virt_kb;
-      mmaps_.push_back(std::move(new_mmap));
-      new_mmap.reset(new MmapInfo());
-    } else {
-      // The current line is a metrics line within a mmap entry, e.g.:
-      // Size:   4 kB
-      uint64_t size = 0;
-      CHECK(last_mmap_entry);
-      if (ReadSmapsMetric(line, kRss, sizeof(kRss), &size)) {
-        last_mmap_entry->rss_kb = size;
-        rss_kb_ += size;
-      } else if (ReadSmapsMetric(line, kPss, sizeof(kPss), &size)) {
-        last_mmap_entry->pss_kb = size;
-        pss_kb_ += size;
-      } else if (ReadSmapsMetric(line, kSwap, sizeof(kSwap), &size)) {
-        last_mmap_entry->swapped_kb = size;
-        swapped_kb_ += size;
-      } else if (ReadSmapsMetric(
-                     line, kSharedClean, sizeof(kSharedClean), &size)) {
-        last_mmap_entry->shared_clean_kb = size;
-        shared_clean_kb_ += size;
-      } else if (ReadSmapsMetric(
-                     line, kSharedDirty, sizeof(kSharedDirty), &size)) {
-        last_mmap_entry->shared_dirty_kb = size;
-        shared_dirty_kb_ += size;
-      } else if (ReadSmapsMetric(
-                     line, kPrivateClean, sizeof(kPrivateClean), &size)) {
-        last_mmap_entry->private_clean_kb = size;
-        private_clean_kb_ += size;
-      } else if (ReadSmapsMetric(
-                     line, kPrivateDirty, sizeof(kPrivateDirty), &size)) {
-        last_mmap_entry->private_dirty_kb = size;
-        private_dirty_kb_ += size;
-      }
-    }
-  }
-  full_stats_ = true;
-  return true;
-}
-
-bool ProcessMemoryStats::ReadGpuStats(int pid) {
-  MemtrackProc mt(pid);
-  gpu_graphics_kb_ = mt.graphics_total() / 1024;
-  gpu_graphics_pss_kb_ = mt.graphics_pss() / 1024;
-  gpu_gl_kb_ = mt.gl_total() / 1024;
-  gpu_gl_pss_kb_ = mt.gl_pss() / 1024;
-  gpu_other_kb_ = mt.other_total() / 1024;
-  gpu_other_pss_kb_ = mt.other_pss() / 1024;
-
-  gpu_stats_ = !mt.has_errors() &&
-      (gpu_graphics_kb_ != 0 || gpu_gl_kb_ != 0 || gpu_other_kb_ != 0);
-  return gpu_stats_;
-}
diff --git a/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h b/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h
deleted file mode 100644
index 84584aa..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PROCESS_MEMORY_STATS_H_
-#define PROCESS_MEMORY_STATS_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-// Reads process memory stats from /proc/pid/{statm,smaps}.
-class ProcessMemoryStats {
- public:
-  struct MmapInfo {
-    char mapped_file[128] = {};
-    char prot_flags[5] = {};
-    uint64_t start_addr = 0;
-    uint64_t end_addr = 0;
-    uint64_t virt_kb = 0;
-    uint64_t pss_kb = 0;  // Proportional Set Size.
-    uint64_t rss_kb = 0;  // Resident Set Size.
-    uint64_t private_clean_kb = 0;
-    uint64_t private_dirty_kb = 0;
-    uint64_t shared_clean_kb = 0;
-    uint64_t shared_dirty_kb = 0;
-    uint64_t swapped_kb = 0;
-  };
-
-  ProcessMemoryStats() {}
-
-  bool ReadLightStats(int pid);
-  bool ReadFullStats(int pid);
-  bool ReadGpuStats(int pid);
-
-  // Available after ReadLightStats().
-  uint64_t virt_kb() const { return virt_kb_; }
-  uint64_t rss_kb() const { return rss_kb_; }
-
-  // Available after ReadFullStats().
-  bool full_stats_available() const { return full_stats_; }
-  uint64_t pss_kb() const { return pss_kb_; }
-  uint64_t private_clean_kb() const { return private_clean_kb_; }
-  uint64_t private_dirty_kb() const { return private_dirty_kb_; }
-  uint64_t shared_clean_kb() const { return shared_clean_kb_; }
-  uint64_t shared_dirty_kb() const { return shared_dirty_kb_; }
-  uint64_t swapped_kb() const { return swapped_kb_; }
-
-  // Available after ReadMemtrackStats().
-  bool gpu_stats_available() const { return gpu_stats_; }
-  uint64_t gpu_graphics_kb() const { return gpu_graphics_kb_; }
-  uint64_t gpu_graphics_pss_kb() const { return gpu_graphics_pss_kb_; }
-  uint64_t gpu_gl_kb() const { return gpu_gl_kb_; }
-  uint64_t gpu_gl_pss_kb() const { return gpu_gl_pss_kb_; }
-  uint64_t gpu_other_kb() const { return gpu_other_kb_; }
-  uint64_t gpu_other_pss_kb() const { return gpu_other_pss_kb_; }
-
-  size_t mmaps_count() const { return mmaps_.size(); }
-  const MmapInfo* mmap(size_t index) const { return mmaps_[index].get(); }
-
- private:
-  ProcessMemoryStats(const ProcessMemoryStats&) = delete;
-  void operator=(const ProcessMemoryStats&) = delete;
-
-  // Light stats.
-  uint64_t virt_kb_ = 0;
-  uint64_t rss_kb_ = 0;
-
-  // Full stats.
-  bool full_stats_ = false;
-  uint64_t pss_kb_ = 0;
-  uint64_t private_clean_kb_ = 0;
-  uint64_t private_dirty_kb_ = 0;
-  uint64_t shared_clean_kb_ = 0;
-  uint64_t shared_dirty_kb_ = 0;
-  uint64_t swapped_kb_ = 0;
-
-  // Graphics stats.
-  bool gpu_stats_ = false;
-  uint64_t gpu_graphics_kb_ = 0;
-  uint64_t gpu_graphics_pss_kb_ = 0;
-  uint64_t gpu_gl_kb_ = 0;
-  uint64_t gpu_gl_pss_kb_ = 0;
-  uint64_t gpu_other_kb_ = 0;
-  uint64_t gpu_other_pss_kb_ = 0;
-
-  std::vector<std::unique_ptr<const MmapInfo>> mmaps_;
-};
-
-#endif  // PROCESS_MEMORY_STATS_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/procfs_utils.cc b/systrace/catapult/systrace/atrace_helper/jni/procfs_utils.cc
deleted file mode 100644
index 7edea29..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/procfs_utils.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "procfs_utils.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include "file_utils.h"
-#include "logging.h"
-
-using file_utils::ForEachPidInProcPath;
-using file_utils::ReadProcFile;
-using file_utils::ReadProcFileTrimmed;
-
-namespace procfs_utils {
-
-namespace {
-
-const char kJavaAppPrefix[] = "/system/bin/app_process";
-const char kZygotePrefix[] = "zygote";
-
-inline void ReadProcString(int pid, const char* path, char* buf, size_t size) {
-  if (!file_utils::ReadProcFileTrimmed(pid, path, buf, size))
-    buf[0] = '\0';
-}
-
-inline void ReadExePath(int pid, char* buf, size_t size) {
-  char exe_path[64];
-  sprintf(exe_path, "/proc/%d/exe", pid);
-  ssize_t res = readlink(exe_path, buf, size - 1);
-  if (res >= 0)
-    buf[res] = '\0';
-  else
-    buf[0] = '\0';
-}
-
-inline bool IsApp(const char* name, const char* exe) {
-  return strncmp(exe, kJavaAppPrefix, sizeof(kJavaAppPrefix) - 1) == 0 &&
-         strncmp(name, kZygotePrefix, sizeof(kZygotePrefix) - 1) != 0;
-}
-
-}  // namespace
-
-int ReadTgid(int pid) {
-  static const char kTgid[] = "\nTgid:";
-  char buf[512];
-  ssize_t rsize = ReadProcFile(pid, "status", buf, sizeof(buf));
-  if (rsize <= 0)
-    return -1;
-  const char* tgid_line = strstr(buf, kTgid);
-  CHECK(tgid_line);
-  return atoi(tgid_line + sizeof(kTgid) - 1);
-}
-
-std::unique_ptr<ProcessInfo> ReadProcessInfo(int pid) {
-  ProcessInfo* process = new ProcessInfo();
-  process->pid = pid;
-  ReadProcString(pid, "cmdline", process->name, sizeof(process->name));
-  if (process->name[0] != 0) {
-    ReadExePath(pid, process->exe, sizeof(process->exe));
-    process->is_app = IsApp(process->name, process->exe);
-  } else {
-    ReadProcString(pid, "comm", process->name, sizeof(process->name));
-    CHECK(process->name[0]);
-    process->in_kernel = true;
-  }
-  return std::unique_ptr<ProcessInfo>(process);
-}
-
-void ReadProcessThreads(ProcessInfo* process) {
-  if (process->in_kernel)
-    return;
-
-  char tasks_path[64];
-  sprintf(tasks_path, "/proc/%d/task", process->pid);
-  ForEachPidInProcPath(tasks_path, [process](int tid) {
-    if (process->threads.count(tid))
-      return;
-    ThreadInfo thread = { tid, "" };
-    char task_comm[64];
-    sprintf(task_comm, "task/%d/comm", tid);
-    ReadProcString(process->pid, task_comm, thread.name, sizeof(thread.name));
-    if (thread.name[0] == '\0' && process->is_app)
-      strcpy(thread.name, "UI Thread");
-    process->threads[tid] = thread;
-  });
-}
-
-bool ReadOomStats(ProcessSnapshot* snapshot) {
-  char buf[64];
-  if (ReadProcFileTrimmed(snapshot->pid, "oom_score", buf, sizeof(buf)))
-    snapshot->oom_score = atoi(buf);
-  else
-    return false;
-  if (ReadProcFileTrimmed(snapshot->pid, "oom_score_adj", buf, sizeof(buf)))
-    snapshot->oom_score_adj = atoi(buf);
-  else
-    return false;
-  return true;
-}
-
-bool ReadPageFaultsAndCpuTimeStats(ProcessSnapshot* snapshot) {
-  char buf[512];
-  if (!ReadProcFileTrimmed(snapshot->pid, "stat", buf, sizeof(buf)))
-    return false;
-  int ret = sscanf(buf,
-      "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*u %lu %*lu %lu %*lu %lu %lu",
-      &snapshot->minor_faults, &snapshot->major_faults,
-      &snapshot->utime, &snapshot->stime);
-  CHECK(ret == 4);
-  return true;
-}
-
-bool ReadMemInfoStats(std::map<std::string, uint64_t>* mem_info) {
-  char buf[1024];
-  ssize_t rsize = file_utils::ReadFile("/proc/meminfo", buf, sizeof(buf));
-  if (rsize <= 0)
-    return false;
-
-  file_utils::LineReader reader(buf, rsize);
-  for (const char* line = reader.NextLine();
-       line && line[0];
-       line = reader.NextLine()) {
-
-    const char* pos_colon = strstr(line, ":");
-    if (pos_colon == nullptr)
-      continue;  // Should not happen.
-    std::string name(line, pos_colon - line);
-    (*mem_info)[name] = strtoull(&pos_colon[1], nullptr, 10);
-  }
-  return true;
-}
-
-}  // namespace procfs_utils
diff --git a/systrace/catapult/systrace/atrace_helper/jni/procfs_utils.h b/systrace/catapult/systrace/atrace_helper/jni/procfs_utils.h
deleted file mode 100644
index e5ce704..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/procfs_utils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PROCFS_UTILS_H_
-#define PROCFS_UTILS_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "process_info.h"
-
-namespace procfs_utils {
-
-// ProcFS doesn't necessarly distinguish PID vs. TID, but all threads of a
-// process have the same Thread Group ID which is equal to Process ID.
-int ReadTgid(int pid);
-
-std::unique_ptr<ProcessInfo> ReadProcessInfo(int pid);
-void ReadProcessThreads(ProcessInfo* process);
-
-bool ReadOomStats(ProcessSnapshot* snapshot);
-bool ReadPageFaultsAndCpuTimeStats(ProcessSnapshot* snapshot);
-
-bool ReadMemInfoStats(std::map<std::string, uint64_t>* mem_info);
-
-}  // namespace procfs_utils
-
-#endif  // PROCFS_UTILS_H_
diff --git a/systrace/catapult/systrace/atrace_helper/jni/time_utils.cc b/systrace/catapult/systrace/atrace_helper/jni/time_utils.cc
deleted file mode 100644
index 3c8aa16..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/time_utils.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "time_utils.h"
-
-#include <sys/time.h>
-#include <sys/timerfd.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "logging.h"
-
-namespace time_utils {
-
-uint64_t GetTimestamp() {
-  struct timespec ts = {};
-  CHECK(clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) == 0);
-  return ts.tv_sec * 1000 + ts.tv_nsec / 1000000ul;
-}
-
-PeriodicTimer::PeriodicTimer(int interval_ms) : interval_ms_(interval_ms) {
-  timer_fd_ = -1;
-}
-
-PeriodicTimer::~PeriodicTimer() {
-  Stop();
-}
-
-void PeriodicTimer::Start() {
-  Stop();
-  timer_fd_ = timerfd_create(CLOCK_MONOTONIC, 0);
-  CHECK(timer_fd_ >= 0);
-  int sec = interval_ms_ / 1000;
-  int nsec = (interval_ms_ % 1000) * 1000000;
-  struct itimerspec ts = {};
-  ts.it_value.tv_nsec = nsec;
-  ts.it_value.tv_sec = sec;
-  ts.it_interval.tv_nsec = nsec;
-  ts.it_interval.tv_sec = sec;
-  CHECK(timerfd_settime(timer_fd_, 0, &ts, nullptr) == 0);
-}
-
-void PeriodicTimer::Stop() {
-  if (timer_fd_ < 0)
-    return;
-  close(timer_fd_);
-  timer_fd_ = -1;
-}
-
-bool PeriodicTimer::Wait() {
-  if (timer_fd_ < 0)
-    return false;  // Not started yet.
-  uint64_t stub = 0;
-  int res = read(timer_fd_, &stub, sizeof(stub));
-  if (res < 0 && errno == EBADF)
-    return false;  // Interrupted by Stop().
-  CHECK(res > 0);
-  return true;
-}
-
-}  // namespace time_utils
diff --git a/systrace/catapult/systrace/atrace_helper/jni/time_utils.h b/systrace/catapult/systrace/atrace_helper/jni/time_utils.h
deleted file mode 100644
index 2319601..0000000
--- a/systrace/catapult/systrace/atrace_helper/jni/time_utils.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef TIME_UTILS_H_
-#define TIME_UTILS_H_
-
-#include <stdint.h>
-
-namespace time_utils {
-
-uint64_t GetTimestamp();
-
-class PeriodicTimer {
- public:
-  PeriodicTimer(int interval_ms);
-  ~PeriodicTimer();
-
-  void Start();
-  void Stop();
-  // Wait for next tick. Returns false if interrupted by Stop() or not started.
-  bool Wait();
-
- private:
-  PeriodicTimer(const PeriodicTimer&) = delete;
-  void operator=(const PeriodicTimer&) = delete;
-
-  const int interval_ms_;
-  int timer_fd_;
-};
-
-}  // namespace time_utils
-
-#endif  // TIME_UTILS_
diff --git a/systrace/catapult/systrace/bin/adb_profile_chrome b/systrace/catapult/systrace/bin/adb_profile_chrome
deleted file mode 100755
index 5231c8f..0000000
--- a/systrace/catapult/systrace/bin/adb_profile_chrome
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-if __name__ == '__main__':
-  systrace_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-  sys.path.append(systrace_path)
-  from profile_chrome import main
-  sys.exit(main.main())
diff --git a/systrace/catapult/systrace/bin/adb_profile_chrome_startup b/systrace/catapult/systrace/bin/adb_profile_chrome_startup
deleted file mode 100755
index 42b37df..0000000
--- a/systrace/catapult/systrace/bin/adb_profile_chrome_startup
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import optparse
-import os
-import sys
-import webbrowser
-
-_SYSTRACE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
-sys.path.append(_SYSTRACE_DIR)
-
-from profile_chrome import chrome_startup_tracing_agent
-from profile_chrome import flags
-from profile_chrome import profiler
-from profile_chrome import ui
-from systrace import util
-from systrace.tracing_agents import atrace_agent
-
-_CATAPULT_DIR = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), '..', '..')
-sys.path.append(os.path.join(_CATAPULT_DIR, 'devil'))
-
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-
-
-_CHROME_STARTUP_MODULES = [atrace_agent, chrome_startup_tracing_agent]
-_DEFAULT_CHROME_CATEGORIES = '_DEFAULT_CHROME_CATEGORIES'
-
-
-def _CreateOptionParser():
-  parser = optparse.OptionParser(description='Record about://tracing profiles '
-                                 'from Android browsers startup, combined with '
-                                 'Android systrace. See http://dev.chromium.org'
-                                 '/developers/how-tos/trace-event-profiling-'
-                                 'tool for detailed instructions for '
-                                 'profiling.', conflict_handler='resolve')
-  parser = util.get_main_options(parser)
-
-  browsers = sorted(util.get_supported_browsers().keys())
-  parser.add_option('-b', '--browser', help='Select among installed browsers. '
-                    'One of ' + ', '.join(browsers) + ', "stable" is used by '
-                    'default.', type='choice', choices=browsers,
-                    default='stable')
-  parser.add_option('-v', '--verbose', help='Verbose logging.',
-                    action='store_true')
-  parser.add_option('-z', '--compress', help='Compress the resulting trace '
-                    'with gzip. ', action='store_true')
-  parser.add_option('-t', '--time', help='Stops tracing after N seconds, 0 to '
-                    'manually stop (startup trace ends after at most 5s).',
-                    default=5, metavar='N', type='int', dest='trace_time')
-  parser.add_option('-c', '--chrome_categories', help='Chrome tracing '
-                    'categories to record.', default=_DEFAULT_CHROME_CATEGORIES,
-                    type='string')
-  parser.add_option('-u', '--atrace-buffer-size', help='Number of bytes to'
-                    ' be used for capturing atrace data', type='int',
-                    default=None, dest='trace_buf_size')
-
-  parser.add_option_group(chrome_startup_tracing_agent.add_options(parser))
-  parser.add_option_group(atrace_agent.add_options(parser))
-  parser.add_option_group(flags.OutputOptions(parser))
-
-  return parser
-
-
-def main():
-  parser = _CreateOptionParser()
-  options, _ = parser.parse_args()
-
-  if not options.device_serial_number:
-    devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()]
-    if len(devices) == 0:
-      raise RuntimeError('No ADB devices connected.')
-    elif len(devices) >= 2:
-      raise RuntimeError('Multiple devices connected, serial number required')
-    options.device_serial_number = devices[0]
-
-  if options.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  devices = device_utils.DeviceUtils.HealthyDevices()
-  if len(devices) != 1:
-    logging.error('Exactly 1 device must be attached.')
-    return 1
-  device = devices[0]
-  package_info = util.get_supported_browsers()[options.browser]
-
-  options.device = device
-  options.package_info = package_info
-
-  # TODO(washingtonp): Once Systrace uses all of the profile_chrome agents,
-  # manually setting these options will no longer be necessary and should be
-  # removed.
-  options.ring_buffer = False
-  options.trace_memory = False
-
-  if options.atrace_categories in ['list', 'help']:
-    atrace_agent.list_categories(atrace_agent.get_config(options))
-    print '\n'
-    return 0
-  result = profiler.CaptureProfile(options,
-                                   options.trace_time,
-                                   _CHROME_STARTUP_MODULES,
-                                   output=options.output_file,
-                                   compress=options.compress,
-                                   write_json=options.write_json)
-  if options.view:
-    if sys.platform == 'darwin':
-      os.system('/usr/bin/open %s' % os.path.abspath(result))
-    else:
-      webbrowser.open(result)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/systrace/catapult/systrace/bin/run_tests b/systrace/catapult/systrace/bin/run_tests
deleted file mode 100755
index 4944c36..0000000
--- a/systrace/catapult/systrace/bin/run_tests
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python2.7
-
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Runs the unit test suite for systrace."""
-
-import optparse
-import os
-import sys
-import unittest
-
-_SYSTRACE_DIR = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.path.pardir))
-sys.path.insert(0, _SYSTRACE_DIR)
-from systrace import decorators
-
-
-def main():
-  parser = optparse.OptionParser()
-  parser.add_option("-d", "--device", dest="device",
-                    help="device the test runs on", metavar="DEVICE")
-  options, _args = parser.parse_args()  # pylint: disable=unused-variable
-  unfiltered_suite = unittest.TestLoader().discover(
-      _SYSTRACE_DIR,
-      pattern = '*_unittest.py',
-      top_level_dir=_SYSTRACE_DIR)
-  suite = unittest.TestSuite()
-
-  for test_group in unfiltered_suite._tests:
-    for inner_group in test_group:
-      for test in inner_group:
-        method = getattr(
-          test, test._testMethodName)  # pylint: disable=protected-access
-        if not decorators.ShouldSkip(method, options.device):
-          suite.addTest(test)
-
-  result = unittest.TextTestRunner(verbosity=2).run(suite)
-  if result.wasSuccessful():
-    sys.exit(0)
-  else:
-    sys.exit(1)
-
-if __name__ == '__main__':
-  main()
diff --git a/systrace/catapult/systrace/bin/systrace b/systrace/catapult/systrace/bin/systrace
deleted file mode 100755
index bce86a7..0000000
--- a/systrace/catapult/systrace/bin/systrace
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_SYSTRACE_DIR = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.path.pardir))
-sys.path.insert(0, _SYSTRACE_DIR)
-from systrace import run_systrace
-
-if __name__ == '__main__':
-  sys.exit(run_systrace.main())
diff --git a/systrace/catapult/systrace/profile_chrome/__init__.py b/systrace/catapult/systrace/profile_chrome/__init__.py
deleted file mode 100644
index 8257681..0000000
--- a/systrace/catapult/systrace/profile_chrome/__init__.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-
-_CATAPULT_DIR = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), '..', '..')
-sys.path.append(os.path.join(_CATAPULT_DIR, 'devil'))
-sys.path.append(os.path.join(_CATAPULT_DIR, 'systrace'))
-sys.path.append(os.path.join(_CATAPULT_DIR, 'common', 'py_utils'))
diff --git a/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py b/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py
deleted file mode 100644
index 53be30c..0000000
--- a/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py
+++ /dev/null
@@ -1,154 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import optparse
-import os
-import re
-
-import py_utils
-
-from devil.android import flag_changer
-from devil.android.constants import webapk
-from devil.android.perf import cache_control
-from devil.android.sdk import intent
-
-from systrace import trace_result
-from systrace import tracing_agents
-
-
-class ChromeStartupTracingAgent(tracing_agents.TracingAgent):
-  def __init__(self, device, package_info, webapk_package, cold, url,
-               trace_time=None):
-    tracing_agents.TracingAgent.__init__(self)
-    self._device = device
-    self._package_info = package_info
-    self._webapk_package = webapk_package
-    self._cold = cold
-    self._logcat_monitor = self._device.GetLogcatMonitor()
-    self._url = url
-    self._trace_time = trace_time
-    self._trace_file = None
-    self._trace_finish_re = re.compile(r' Completed startup tracing to (.*)')
-    self._flag_changer = flag_changer.FlagChanger(
-      self._device, self._package_info.cmdline_file)
-
-  def __repr__(self):
-    return 'Browser Startup Trace'
-
-  def _SetupTracing(self):
-    # TODO(lizeb): Figure out how to clean up the command-line file when
-    # _TearDownTracing() is not executed in StopTracing().
-    flags = ['--trace-startup', '--enable-perfetto']
-    if self._trace_time is not None:
-      flags.append('--trace-startup-duration={}'.format(self._trace_time))
-    self._flag_changer.AddFlags(flags)
-    self._device.ForceStop(self._package_info.package)
-    if self._webapk_package:
-      self._device.ForceStop(self._webapk_package)
-      logging.warning('Forces to stop the WebAPK and the browser provided by '
-                      '--browser: %s. Please make sure that this browser '
-                      'matches the host browser of the WebAPK %s. ',
-                      self._package_info.package,
-                      self._webapk_package)
-    if self._cold:
-      self._device.EnableRoot()
-      cache_control.CacheControl(self._device).DropRamCaches()
-    launch_intent = None
-    if self._webapk_package:
-      launch_intent = intent.Intent(
-          package=self._webapk_package,
-          activity=webapk.WEBAPK_MAIN_ACTIVITY,
-          data=self._url)
-    elif self._url == '':
-      launch_intent = intent.Intent(
-          action='android.intent.action.MAIN',
-          package=self._package_info.package,
-          activity=self._package_info.activity)
-    else:
-      launch_intent = intent.Intent(
-          package=self._package_info.package,
-          activity=self._package_info.activity,
-          data=self._url,
-          extras={'create_new_tab': True})
-    self._logcat_monitor.Start()
-    self._device.StartActivity(launch_intent, blocking=True)
-
-  def _TearDownTracing(self):
-    self._flag_changer.Restore()
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._SetupTracing()
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    try:
-      self._trace_file = self._logcat_monitor.WaitFor(
-          self._trace_finish_re).group(1)
-    finally:
-      self._TearDownTracing()
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    with open(self._PullTrace(), 'r') as f:
-      trace_data = f.read()
-    return trace_result.TraceResult('traceEvents', trace_data)
-
-  def _PullTrace(self):
-    trace_file = self._trace_file.replace('/storage/emulated/0/', '/sdcard/')
-    host_file = os.path.join(os.path.curdir, os.path.basename(trace_file))
-    self._device.PullFile(trace_file, host_file)
-    return host_file
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    # pylint: disable=unused-argument
-    assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
-        'recorded since explicit clock sync is not supported.')
-
-
-class ChromeStartupConfig(tracing_agents.TracingConfig):
-  def __init__(self, device, package_info, webapk_package, cold, url,
-               chrome_categories, trace_time):
-    tracing_agents.TracingConfig.__init__(self)
-    self.device = device
-    self.package_info = package_info
-    self.webapk_package = webapk_package
-    self.cold = cold
-    self.url = url
-    self.chrome_categories = chrome_categories
-    self.trace_time = trace_time
-
-
-def try_create_agent(config):
-  return ChromeStartupTracingAgent(config.device, config.package_info,
-                                   config.webapk_package,
-                                   config.cold, config.url, config.trace_time)
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Chrome startup tracing')
-  options.add_option('--url', help='URL to visit on startup. Default: '
-                     'https://www.google.com. An empty URL launches Chrome '
-                     'with a MAIN action instead of VIEW.',
-                     default='https://www.google.com', metavar='URL')
-  options.add_option('--cold', help='Flush the OS page cache before starting '
-                     'the browser. Note that this require a device with root '
-                     'access.', default=False, action='store_true')
-  options.add_option('--webapk-package', help='Specify the package name '
-                     'of the WebAPK to launch the given URL. An empty URL '
-                     'laucnhes the host browser of the WebAPK with an new '
-                     'tab.', default=None)
-
-  return options
-
-def get_config(options):
-  return ChromeStartupConfig(options.device, options.package_info,
-                             options.webapk_package, options.cold,
-                             options.url, options.chrome_categories,
-                             options.trace_time)
diff --git a/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py b/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py
deleted file mode 100644
index 6123c3c..0000000
--- a/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-
-from profile_chrome import chrome_startup_tracing_agent
-from systrace import decorators
-from systrace.tracing_agents import agents_unittest
-
-
-class ChromeAgentTest(agents_unittest.BaseAgentTest):
-  # TODO(washingtonp): This test seems to fail on the version of Android
-  # currently on the Trybot servers (KTU84P), although it works on Android M.
-  # Either upgrade the version of Android on the Trybot servers or determine
-  # if there is a way to run this agent on Android KTU84P.
-  @decorators.Disabled
-  def testTracing(self):
-    agent = chrome_startup_tracing_agent.ChromeStartupTracingAgent(
-        self.device, self.package_info,
-        '', # webapk_package
-        False, # cold
-        'https://www.google.com' # url
-    )
-
-    try:
-      agent.StartAgentTracing(None)
-    finally:
-      agent.StopAgentTracing()
-
-    result = agent.GetResults()
-    json.loads(result.raw_data)
diff --git a/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py b/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py
deleted file mode 100644
index adcbb21..0000000
--- a/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py
+++ /dev/null
@@ -1,220 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import optparse
-import os
-import re
-
-import py_utils
-
-from devil.android import device_errors
-from devil.android.sdk import intent
-from systrace import trace_result
-from systrace import tracing_agents
-
-
-DEFAULT_CHROME_CATEGORIES = '_DEFAULT_CHROME_CATEGORIES'
-_HEAP_PROFILE_MMAP_PROPERTY = 'heapprof.mmap'
-
-
-class ChromeTracingAgent(tracing_agents.TracingAgent):
-  def __init__(self, device, package_info, ring_buffer, trace_memory=False):
-    tracing_agents.TracingAgent.__init__(self)
-    self._device = device
-    self._package_info = package_info
-    self._ring_buffer = ring_buffer
-    self._logcat_monitor = self._device.GetLogcatMonitor()
-    self._trace_file = None
-    self._trace_memory = trace_memory
-    self._is_tracing = False
-    self._trace_start_re = \
-       re.compile(r'Logging performance trace to file')
-    self._trace_finish_re = \
-       re.compile(r'Profiler finished[.] Results are in (.*)[.]')
-    self._categories = None
-
-  def __repr__(self):
-    return 'chrome trace'
-
-  @staticmethod
-  def GetCategories(device, package_info):
-    with device.GetLogcatMonitor() as logmon:
-      device.BroadcastIntent(intent.Intent(
-          action='%s.GPU_PROFILER_LIST_CATEGORIES' % package_info.package))
-      try:
-        json_category_list = logmon.WaitFor(
-            re.compile(r'{"traceCategoriesList(.*)'), timeout=5).group(0)
-      except device_errors.CommandTimeoutError:
-        raise RuntimeError('Performance trace category list marker not found. '
-                           'Is the correct version of the browser running?')
-
-    record_categories = set()
-    disabled_by_default_categories = set()
-    json_data = json.loads(json_category_list)['traceCategoriesList']
-    for item in json_data:
-      for category in item.split(','):
-        if category.startswith('disabled-by-default'):
-          disabled_by_default_categories.add(category)
-        else:
-          record_categories.add(category)
-
-    return list(record_categories), list(disabled_by_default_categories)
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._categories = _ComputeChromeCategories(config)
-    self._logcat_monitor.Start()
-    start_extras = {'categories': ','.join(self._categories)}
-    if self._ring_buffer:
-      start_extras['continuous'] = None
-    self._device.BroadcastIntent(intent.Intent(
-        action='%s.GPU_PROFILER_START' % self._package_info.package,
-        extras=start_extras))
-
-    if self._trace_memory:
-      self._device.EnableRoot()
-      self._device.SetProp(_HEAP_PROFILE_MMAP_PROPERTY, 1)
-
-    # Chrome logs two different messages related to tracing:
-    #
-    # 1. "Logging performance trace to file"
-    # 2. "Profiler finished. Results are in [...]"
-    #
-    # The first one is printed when tracing starts and the second one indicates
-    # that the trace file is ready to be pulled.
-    try:
-      self._logcat_monitor.WaitFor(self._trace_start_re, timeout=5)
-      self._is_tracing = True
-    except device_errors.CommandTimeoutError:
-      raise RuntimeError(
-          'Trace start marker not found. Possible causes: 1) Is the correct '
-          'version of the browser running? 2) Is the browser already launched?')
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    if self._is_tracing:
-      self._device.BroadcastIntent(intent.Intent(
-          action='%s.GPU_PROFILER_STOP' % self._package_info.package))
-      self._trace_file = self._logcat_monitor.WaitFor(
-          self._trace_finish_re, timeout=120).group(1)
-      self._is_tracing = False
-    if self._trace_memory:
-      self._device.SetProp(_HEAP_PROFILE_MMAP_PROPERTY, 0)
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    with open(self._PullTrace(), 'r') as f:
-      trace_data = f.read()
-    return trace_result.TraceResult('traceEvents', trace_data)
-
-  def _PullTrace(self):
-    trace_file = self._trace_file.replace('/storage/emulated/0/', '/sdcard/')
-    host_file = os.path.join(os.path.curdir, os.path.basename(trace_file))
-    try:
-      self._device.PullFile(trace_file, host_file)
-    except device_errors.AdbCommandFailedError:
-      raise RuntimeError(
-          'Cannot pull the trace file. Have you granted Storage permission to '
-          'the browser? (Android Settings -> Apps -> [the browser app] -> '
-          'Permissions -> Storage)')
-    return host_file
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    # pylint: disable=unused-argument
-    assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
-        'recorded since explicit clock sync is not supported.')
-
-
-class ChromeConfig(tracing_agents.TracingConfig):
-  def __init__(self, chrome_categories, trace_cc, trace_frame_viewer,
-               trace_ubercompositor, trace_gpu, trace_flow, trace_memory,
-               trace_scheduler, ring_buffer, device, package_info):
-    tracing_agents.TracingConfig.__init__(self)
-    self.chrome_categories = chrome_categories
-    self.trace_cc = trace_cc
-    self.trace_frame_viewer = trace_frame_viewer
-    self.trace_ubercompositor = trace_ubercompositor
-    self.trace_gpu = trace_gpu
-    self.trace_flow = trace_flow
-    self.trace_memory = trace_memory
-    self.trace_scheduler = trace_scheduler
-    self.ring_buffer = ring_buffer
-    self.device = device
-    self.package_info = package_info
-
-
-def try_create_agent(config):
-  if config.chrome_categories:
-    return ChromeTracingAgent(config.device, config.package_info,
-                              config.ring_buffer, config.trace_memory)
-  return None
-
-def add_options(parser):
-  chrome_opts = optparse.OptionGroup(parser, 'Chrome tracing options')
-  chrome_opts.add_option('-c', '--categories', help='Select Chrome tracing '
-                         'categories with comma-delimited wildcards, '
-                         'e.g., "*", "cat1*,-cat1a". Omit this option to trace '
-                         'Chrome\'s default categories. Chrome tracing can be '
-                         'disabled with "--categories=\'\'". Use "list" to '
-                         'see the available categories.',
-                         metavar='CHROME_CATEGORIES', dest='chrome_categories')
-  chrome_opts.add_option('--trace-cc',
-                         help='Deprecated, use --trace-frame-viewer.',
-                         action='store_true')
-  chrome_opts.add_option('--trace-frame-viewer',
-                         help='Enable enough trace categories for '
-                         'compositor frame viewing.', action='store_true')
-  chrome_opts.add_option('--trace-ubercompositor',
-                         help='Enable enough trace categories for '
-                         'ubercompositor frame data.', action='store_true')
-  chrome_opts.add_option('--trace-gpu', help='Enable extra trace categories '
-                         'for GPU data.', action='store_true')
-  chrome_opts.add_option('--trace-flow', help='Enable extra trace categories '
-                         'for IPC message flows.', action='store_true')
-  chrome_opts.add_option('--trace-memory', help='Enable extra trace categories '
-                         'for memory profile. (tcmalloc required)',
-                         action='store_true')
-  chrome_opts.add_option('--trace-scheduler', help='Enable extra trace '
-                         'categories for scheduler state',
-                         action='store_true')
-  return chrome_opts
-
-def get_config(options):
-  return ChromeConfig(options.chrome_categories, options.trace_cc,
-                      options.trace_frame_viewer, options.trace_ubercompositor,
-                      options.trace_gpu, options.trace_flow,
-                      options.trace_memory, options.trace_scheduler,
-                      options.ring_buffer, options.device,
-                      options.package_info)
-
-def _ComputeChromeCategories(config):
-  categories = []
-  if config.trace_frame_viewer:
-    categories.append('disabled-by-default-cc.debug')
-  if config.trace_ubercompositor:
-    categories.append('disabled-by-default-cc.debug*')
-  if config.trace_gpu:
-    categories.append('disabled-by-default-gpu.debug*')
-  if config.trace_flow:
-    categories.append('toplevel.flow')
-    # toplevel.flow was moved out of disabled-by-default, leaving here for
-    # compatibility with older versions of Chrome.
-    categories.append('disabled-by-default-toplevel.flow')
-  if config.trace_memory:
-    categories.append('disabled-by-default-memory')
-  if config.trace_scheduler:
-    categories.append('disabled-by-default-blink.scheduler')
-    categories.append('disabled-by-default-cc.debug.scheduler')
-    categories.append('disabled-by-default-renderer.scheduler')
-    categories.append('disabled-by-default-sequence_manager')
-    categories.append('sequence_manager')
-  if config.chrome_categories:
-    categories += config.chrome_categories.split(',')
-  return categories
diff --git a/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py b/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py
deleted file mode 100644
index 1556762..0000000
--- a/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-
-from profile_chrome import chrome_tracing_agent
-from systrace import decorators
-from systrace.tracing_agents import agents_unittest
-
-
-class ChromeAgentTest(agents_unittest.BaseAgentTest):
-  # TODO(washingtonp): This test seems to fail on the version of Android
-  # currently on the Trybot servers (KTU84P), although it works on Android M.
-  # Either upgrade the version of Android on the Trybot servers or determine
-  # if there is a way to run this agent on Android KTU84P.
-  @decorators.Disabled
-  def testGetCategories(self):
-    curr_browser = self.GetChromeProcessID()
-    if curr_browser is None:
-      self.StartBrowser()
-
-    categories = \
-        chrome_tracing_agent.ChromeTracingAgent.GetCategories(
-            self.device, self.package_info)
-
-    self.assertEquals(len(categories), 2)
-    self.assertTrue(categories[0])
-    self.assertTrue(categories[1])
-
-  # TODO(washingtonp): This test is pretty flaky on the version of Android
-  # currently on the Trybot servers (KTU84P), although it works on Android M.
-  # Either upgrade the version of Android on the Trybot servers or determine
-  # if there is a way to run this agent on Android KTU84P.
-  @decorators.Disabled
-  def testTracing(self):
-    curr_browser = self.GetChromeProcessID()
-    if curr_browser is None:
-      self.StartBrowser()
-
-    categories = '*'
-    ring_buffer = False
-    agent = chrome_tracing_agent.ChromeTracingAgent(self.device,
-                                                    self.package_info,
-                                                    ring_buffer)
-    agent.StartAgentTracing(chrome_tracing_agent.ChromeConfig(categories, None,
-        None, None, None, None, None, None, ring_buffer, self.device,
-        self.package_info))
-    agent.StopAgentTracing()
-    result = agent.GetResults()
-    json.loads(result.raw_data)
diff --git a/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py b/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py
deleted file mode 100644
index d978939..0000000
--- a/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import os
-import re
-
-import py_utils
-
-from profile_chrome import util
-from systrace import trace_result
-from systrace import tracing_agents
-
-
-_DDMS_SAMPLING_FREQUENCY_US = 100
-
-
-class DdmsAgent(tracing_agents.TracingAgent):
-  def __init__(self, device, package_info):
-    tracing_agents.TracingAgent.__init__(self)
-    self._device = device
-    self._package = package_info.package
-    self._output_file = None
-    self._supports_sampling = self._SupportsSampling()
-
-  def __repr__(self):
-    return 'ddms profile'
-
-  def _SupportsSampling(self):
-    for line in self._device.RunShellCommand(
-        ['am', '--help'], check_return=True):
-      if re.match(r'.*am profile start.*--sampling', line):
-        return True
-    return False
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._output_file = (
-        '/data/local/tmp/ddms-profile-%s' % util.GetTraceTimestamp())
-    cmd = ['am', 'profile', 'start']
-    if self._supports_sampling:
-      cmd.extend(['--sampling', str(_DDMS_SAMPLING_FREQUENCY_US)])
-    cmd.extend([self._package, self._output_file])
-    self._device.RunShellCommand(cmd, check_return=True)
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    self._device.RunShellCommand(
-        ['am', 'profile', 'stop', self._package], check_return=True)
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    with open(self._PullTrace(), 'r') as f:
-      trace_data = f.read()
-    return trace_result.TraceResult('ddms', trace_data)
-
-  def _PullTrace(self):
-    if not self._output_file:
-      return None
-
-    host_file = os.path.join(
-        os.path.curdir, os.path.basename(self._output_file))
-    self._device.PullFile(self._output_file, host_file)
-    return host_file
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    # pylint: disable=unused-argument
-    assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
-        'recorded since explicit clock sync is not supported.')
-
-
-class DdmsConfig(tracing_agents.TracingConfig):
-  def __init__(self, device, package_info, ddms):
-    tracing_agents.TracingConfig.__init__(self)
-    self.device = device
-    self.package_info = package_info
-    self.ddms = ddms
-
-
-def try_create_agent(config):
-  if config.ddms:
-    return DdmsAgent(config.device, config.package_info)
-  return None
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Java tracing')
-  options.add_option('--ddms', help='Trace Java execution using DDMS '
-                     'sampling.', action='store_true')
-  return options
-
-def get_config(options):
-  return DdmsConfig(options.device, options.package_info, options.ddms)
diff --git a/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py b/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py
deleted file mode 100644
index c7269bb..0000000
--- a/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from profile_chrome import ddms_tracing_agent
-from systrace import decorators
-from systrace.tracing_agents import agents_unittest
-
-
-class DdmsAgentTest(agents_unittest.BaseAgentTest):
-  # TODO(washingtonp): The DDMS test is flaky on the Tryserver, but it
-  # consistently passes on Android M. Need to figure out why the result data
-  # does not start with '*version' and why the test is flaky.
-  @decorators.Disabled
-  def testTracing(self):
-    agent = ddms_tracing_agent.DdmsAgent(self.device, self.package_info)
-
-    try:
-      agent.StartAgentTracing(None)
-    finally:
-      agent.StopAgentTracing()
-
-    result = agent.GetResults()
-    self.assertTrue(result.raw_data.startswith('*version'))
diff --git a/systrace/catapult/systrace/profile_chrome/fake_agent_1.py b/systrace/catapult/systrace/profile_chrome/fake_agent_1.py
deleted file mode 100644
index 62889f4..0000000
--- a/systrace/catapult/systrace/profile_chrome/fake_agent_1.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import tempfile
-
-from systrace import trace_result
-from systrace import tracing_agents
-
-
-class FakeAgent(object):
-  def __init__(self, contents='fake-contents'):
-    self.contents = contents
-    self.stopped = False
-    self.filename = None
-    self.config = None
-    self.timeout = None
-
-  def StartAgentTracing(self, config, timeout=None):
-    self.config = config
-    self.timeout = timeout
-    return True
-
-  # pylint: disable=unused-argument
-  def StopAgentTracing(self, timeout=None):
-    self.stopped = True
-    return True
-
-  # pylint: disable=unused-argument
-  def GetResults(self, timeout=None):
-    trace_data = open(self._PullTrace()).read()
-    return trace_result.TraceResult('fakeData', trace_data)
-
-  def _PullTrace(self):
-    with tempfile.NamedTemporaryFile(delete=False) as f:
-      self.filename = f.name
-      f.write(self.contents)
-      return f.name
-
-  # pylint: disable=no-self-use
-  def SupportsExplicitClockSync(self):
-    return False
-
-  # pylint: disable=unused-argument, no-self-use
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    print ('Clock sync marker cannot be recorded since explicit clock sync '
-           'is not supported.')
-
-  def __repr__(self):
-    return 'faketrace'
-
-
-class FakeConfig(tracing_agents.TracingConfig):
-  def __init__(self):
-    tracing_agents.TracingConfig.__init__(self)
-
-
-# pylint: disable=unused-argument
-def try_create_agent(config):
-  return FakeAgent()
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Fake options.')
-  return options
-
-# pylint: disable=unused-argument
-def get_config(options):
-  return FakeConfig()
diff --git a/systrace/catapult/systrace/profile_chrome/fake_agent_2.py b/systrace/catapult/systrace/profile_chrome/fake_agent_2.py
deleted file mode 100644
index 477b6c7..0000000
--- a/systrace/catapult/systrace/profile_chrome/fake_agent_2.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import tempfile
-
-from systrace import trace_result
-from systrace import tracing_agents
-
-
-class FakeAgent2(object):
-  def __init__(self, contents='fake-contents'):
-    self.contents = contents
-    self.stopped = False
-    self.config = None
-    self.filename = None
-
-  # pylint: disable=unused-argument
-  def StartAgentTracing(self, config, timeout=None):
-    self.config = config
-    return True
-
-  # pylint: disable=unused-argument
-  def StopAgentTracing(self, timeout=None):
-    self.stopped = True
-    return True
-
-  # pylint: disable=unused-argument
-  def GetResults(self, timeout=None):
-    trace_data = open(self._PullTrace()).read()
-    return trace_result.TraceResult('fakeDataTwo', trace_data)
-
-  def _PullTrace(self):
-    with tempfile.NamedTemporaryFile(delete=False) as f:
-      self.filename = f.name
-      f.write(self.contents)
-      return f.name
-
-  # pylint: disable=no-self-use
-  def SupportsExplicitClockSync(self):
-    return False
-
-  # pylint: disable=unused-argument, no-self-use
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    print ('Clock sync marker cannot be recorded since explicit clock sync '
-           'is not supported.')
-
-  def __repr__(self):
-    return 'faketracetwo'
-
-
-class FakeConfig(tracing_agents.TracingConfig):
-  def __init__(self):
-    tracing_agents.TracingConfig.__init__(self)
-
-
-# pylint: disable=unused-argument
-def try_create_agent(config):
-  return FakeAgent2()
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Fake options.')
-  return options
-
-# pylint: disable=unused-argument
-def get_config(options):
-  return FakeConfig()
diff --git a/systrace/catapult/systrace/profile_chrome/flags.py b/systrace/catapult/systrace/profile_chrome/flags.py
deleted file mode 100644
index c951123..0000000
--- a/systrace/catapult/systrace/profile_chrome/flags.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-
-
-def OutputOptions(parser):
-  output_options = optparse.OptionGroup(parser, 'Output options')
-  output_options.add_option('-o', '--output', dest='output_file',
-                            help='Save trace output to file.')
-  output_options.add_option('--json', help='Save trace as raw JSON instead of '
-                            'HTML.', dest='write_json')
-  output_options.add_option('--view', help='Open resulting trace file in a '
-                            'browser.', action='store_true')
-  return output_options
diff --git a/systrace/catapult/systrace/profile_chrome/main.py b/systrace/catapult/systrace/profile_chrome/main.py
deleted file mode 100755
index 6cd815c..0000000
--- a/systrace/catapult/systrace/profile_chrome/main.py
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import optparse
-import os
-import sys
-import webbrowser
-
-from profile_chrome import chrome_tracing_agent
-from profile_chrome import ddms_tracing_agent
-from profile_chrome import flags
-from profile_chrome import perf_tracing_agent
-from profile_chrome import profiler
-from profile_chrome import ui
-from systrace import util
-from systrace.tracing_agents import atrace_agent
-
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-
-
-_PROFILE_CHROME_AGENT_MODULES = [chrome_tracing_agent, ddms_tracing_agent,
-                                 perf_tracing_agent, atrace_agent]
-
-
-def _CreateOptionParser():
-  parser = optparse.OptionParser(description='Record about://tracing profiles '
-                                 'from Android browsers. See http://dev.'
-                                 'chromium.org/developers/how-tos/trace-event-'
-                                 'profiling-tool for detailed instructions for '
-                                 'profiling.', conflict_handler='resolve')
-
-  parser = util.get_main_options(parser)
-
-  timed_options = optparse.OptionGroup(parser, 'Timed tracing')
-  timed_options.add_option('-t', '--time', help='Profile for N seconds and '
-                          'download the resulting trace.', metavar='N',
-                           type='float', dest='trace_time')
-  parser.add_option_group(timed_options)
-
-  cont_options = optparse.OptionGroup(parser, 'Continuous tracing')
-  cont_options.add_option('--continuous', help='Profile continuously until '
-                          'stopped.', action='store_true')
-  cont_options.add_option('--ring-buffer', help='Use the trace buffer as a '
-                          'ring buffer and save its contents when stopping '
-                          'instead of appending events into one long trace.',
-                          action='store_true')
-  parser.add_option_group(cont_options)
-
-  parser.add_option_group(flags.OutputOptions(parser))
-
-  browsers = sorted(util.get_supported_browsers().keys())
-  parser.add_option('-b', '--browser', help='Select among installed browsers. '
-                    'One of ' + ', '.join(browsers) + ', "stable" is used by '
-                    'default.', type='choice', choices=browsers,
-                    default='stable')
-  parser.add_option('-v', '--verbose', help='Verbose logging.',
-                    action='store_true')
-  parser.add_option('-z', '--compress', help='Compress the resulting trace '
-                    'with gzip. ', action='store_true')
-
-  # Add options from profile_chrome agents.
-  for module in _PROFILE_CHROME_AGENT_MODULES:
-    parser.add_option_group(module.add_options(parser))
-
-  return parser
-
-
-def main():
-  parser = _CreateOptionParser()
-  options, _args = parser.parse_args()  # pylint: disable=unused-variable
-  if options.trace_cc:
-    parser.error("""--trace-cc is deprecated.
-
-For basic jank busting uses, use  --trace-frame-viewer
-For detailed study of ubercompositor, pass --trace-ubercompositor.
-
-When in doubt, just try out --trace-frame-viewer.
-""")
-
-  logging.basicConfig()
-
-  if options.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  if not options.device_serial_number:
-    devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()]
-    if len(devices) == 0:
-      raise RuntimeError('No ADB devices connected.')
-    elif len(devices) >= 2:
-      raise RuntimeError('Multiple devices connected, serial number required')
-    options.device_serial_number = devices[0]
-  device = device_utils.DeviceUtils.HealthyDevices(device_arg=
-      options.device_serial_number)[0]
-  package_info = util.get_supported_browsers()[options.browser]
-
-  options.device = device
-  options.package_info = package_info
-
-  # Include Chrome categories by default in profile_chrome.
-  if not options.chrome_categories:
-    options.chrome_categories = chrome_tracing_agent.DEFAULT_CHROME_CATEGORIES
-
-  if options.chrome_categories in ['list', 'help']:
-    ui.PrintMessage('Collecting record categories list...', eol='')
-    record_categories = []
-    disabled_by_default_categories = []
-    record_categories, disabled_by_default_categories = \
-        chrome_tracing_agent.ChromeTracingAgent.GetCategories(
-            device, package_info)
-
-    ui.PrintMessage('done')
-    ui.PrintMessage('Record Categories:')
-    ui.PrintMessage('\n'.join('\t%s' % item \
-        for item in sorted(record_categories)))
-
-    ui.PrintMessage('\nDisabled by Default Categories:')
-    ui.PrintMessage('\n'.join('\t%s' % item \
-        for item in sorted(disabled_by_default_categories)))
-
-    return 0
-
-  if options.atrace_categories in ['list', 'help']:
-    atrace_agent.list_categories(atrace_agent.get_config(options))
-    print '\n'
-    return 0
-
-  if (perf_tracing_agent.PerfProfilerAgent.IsSupported() and
-      options.perf_categories in ['list', 'help']):
-    ui.PrintMessage('\n'.join(
-        perf_tracing_agent.PerfProfilerAgent.GetCategories(device)))
-    return 0
-
-  if not options.trace_time and not options.continuous:
-    ui.PrintMessage('Time interval or continuous tracing should be specified.')
-    return 1
-
-  if (options.chrome_categories and options.atrace_categories and
-      'webview' in options.atrace_categories):
-    logging.warning('Using the "webview" category in atrace together with '
-                    'Chrome tracing results in duplicate trace events.')
-
-  if options.output_file:
-    options.output_file = os.path.expanduser(options.output_file)
-  result = profiler.CaptureProfile(
-      options,
-      options.trace_time if not options.continuous else 0,
-      _PROFILE_CHROME_AGENT_MODULES,
-      output=options.output_file,
-      compress=options.compress,
-      write_json=options.write_json)
-  if options.view:
-    if sys.platform == 'darwin':
-      os.system('/usr/bin/open %s' % os.path.abspath(result))
-    else:
-      webbrowser.open(result)
diff --git a/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py b/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py
deleted file mode 100644
index 8565c88..0000000
--- a/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py
+++ /dev/null
@@ -1,254 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import optparse
-import os
-import signal
-import subprocess
-import sys
-import tempfile
-
-import py_utils
-
-from devil.android import device_temp_file
-from devil.android.perf import perf_control
-
-from profile_chrome import ui
-from systrace import trace_result
-from systrace import tracing_agents
-
-_CATAPULT_DIR = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), '..', '..')
-sys.path.append(os.path.join(_CATAPULT_DIR, 'telemetry'))
-try:
-  # pylint: disable=F0401,no-name-in-module,wrong-import-position
-  from telemetry.internal.platform.profiler import android_profiling_helper
-  from telemetry.internal.util import binary_manager
-except ImportError:
-  android_profiling_helper = None
-  binary_manager = None
-
-
-_PERF_OPTIONS = [
-    # Sample across all processes and CPUs to so that the current CPU gets
-    # recorded to each sample.
-    '--all-cpus',
-    # In perf 3.13 --call-graph requires an argument, so use the -g short-hand
-    # which does not.
-    '-g',
-    # Increase priority to avoid dropping samples. Requires root.
-    '--realtime', '80',
-    # Record raw samples to get CPU information.
-    '--raw-samples',
-    # Increase sampling frequency for better coverage.
-    '--freq', '2000',
-]
-
-
-class _PerfProfiler(object):
-  def __init__(self, device, perf_binary, categories):
-    self._device = device
-    self._output_file = device_temp_file.DeviceTempFile(
-        self._device.adb, prefix='perf_output')
-    self._log_file = tempfile.TemporaryFile()
-
-    # TODO(jbudorick) Look at providing a way to unhandroll this once the
-    #                 adb rewrite has fully landed.
-    device_param = (['-s', str(self._device)] if str(self._device) else [])
-    cmd = ['adb'] + device_param + \
-          ['shell', perf_binary, 'record',
-           '--output', self._output_file.name] + _PERF_OPTIONS
-    if categories:
-      cmd += ['--event', ','.join(categories)]
-    self._perf_control = perf_control.PerfControl(self._device)
-    self._perf_control.SetPerfProfilingMode()
-    self._perf_process = subprocess.Popen(cmd,
-                                          stdout=self._log_file,
-                                          stderr=subprocess.STDOUT)
-
-  def SignalAndWait(self):
-    self._device.KillAll('perf', signum=signal.SIGINT)
-    self._perf_process.wait()
-    self._perf_control.SetDefaultPerfMode()
-
-  def _FailWithLog(self, msg):
-    self._log_file.seek(0)
-    log = self._log_file.read()
-    raise RuntimeError('%s. Log output:\n%s' % (msg, log))
-
-  def PullResult(self, output_path):
-    if not self._device.FileExists(self._output_file.name):
-      self._FailWithLog('Perf recorded no data')
-
-    perf_profile = os.path.join(output_path,
-                                os.path.basename(self._output_file.name))
-    self._device.PullFile(self._output_file.name, perf_profile)
-    if not os.stat(perf_profile).st_size:
-      os.remove(perf_profile)
-      self._FailWithLog('Perf recorded a zero-sized file')
-
-    self._log_file.close()
-    self._output_file.close()
-    return perf_profile
-
-
-class PerfProfilerAgent(tracing_agents.TracingAgent):
-  def __init__(self, device):
-    tracing_agents.TracingAgent.__init__(self)
-    self._device = device
-    self._perf_binary = self._PrepareDevice(device)
-    self._perf_instance = None
-    self._categories = None
-
-  def __repr__(self):
-    return 'perf profile'
-
-  @staticmethod
-  def IsSupported():
-    return bool(android_profiling_helper)
-
-  @staticmethod
-  def _PrepareDevice(device):
-    if not 'BUILDTYPE' in os.environ:
-      os.environ['BUILDTYPE'] = 'Release'
-    if binary_manager.NeedsInit():
-      binary_manager.InitDependencyManager(None)
-    return android_profiling_helper.PrepareDeviceForPerf(device)
-
-  @classmethod
-  def GetCategories(cls, device):
-    perf_binary = cls._PrepareDevice(device)
-    # Perf binary returns non-zero exit status on "list" command.
-    return device.RunShellCommand([perf_binary, 'list'], check_return=False)
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._categories = _ComputePerfCategories(config)
-    self._perf_instance = _PerfProfiler(self._device,
-                                        self._perf_binary,
-                                        self._categories)
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    if not self._perf_instance:
-      return
-    self._perf_instance.SignalAndWait()
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    with open(self._PullTrace(), 'r') as f:
-      trace_data = f.read()
-    return trace_result.TraceResult('perf', trace_data)
-
-  @staticmethod
-  def _GetInteractivePerfCommand(perfhost_path, perf_profile, symfs_dir,
-                                 required_libs, kallsyms):
-    cmd = '%s report -n -i %s --symfs %s --kallsyms %s' % (
-        os.path.relpath(perfhost_path, '.'), perf_profile, symfs_dir, kallsyms)
-    for lib in required_libs:
-      lib = os.path.join(symfs_dir, lib[1:])
-      if not os.path.exists(lib):
-        continue
-      objdump_path = android_profiling_helper.GetToolchainBinaryPath(
-          lib, 'objdump')
-      if objdump_path:
-        cmd += ' --objdump %s' % os.path.relpath(objdump_path, '.')
-        break
-    return cmd
-
-  def _PullTrace(self):
-    symfs_dir = os.path.join(tempfile.gettempdir(),
-                             os.path.expandvars('$USER-perf-symfs'))
-    if not os.path.exists(symfs_dir):
-      os.makedirs(symfs_dir)
-    required_libs = set()
-
-    # Download the recorded perf profile.
-    perf_profile = self._perf_instance.PullResult(symfs_dir)
-    required_libs = \
-        android_profiling_helper.GetRequiredLibrariesForPerfProfile(
-            perf_profile)
-    if not required_libs:
-      logging.warning('No libraries required by perf trace. Most likely there '
-                      'are no samples in the trace.')
-
-    # Build a symfs with all the necessary libraries.
-    kallsyms = android_profiling_helper.CreateSymFs(self._device,
-                                                    symfs_dir,
-                                                    required_libs,
-                                                    use_symlinks=False)
-    perfhost_path = binary_manager.FetchPath(
-        android_profiling_helper.GetPerfhostName(), 'linux', 'x86_64')
-
-    ui.PrintMessage('\nNote: to view the profile in perf, run:')
-    ui.PrintMessage('  ' + self._GetInteractivePerfCommand(perfhost_path,
-        perf_profile, symfs_dir, required_libs, kallsyms))
-
-    # Convert the perf profile into JSON.
-    perf_script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                    'third_party', 'perf_to_tracing.py')
-    json_file_name = os.path.basename(perf_profile)
-    with open(os.devnull, 'w') as dev_null, \
-        open(json_file_name, 'w') as json_file:
-      cmd = [perfhost_path, 'script', '-s', perf_script_path, '-i',
-             perf_profile, '--symfs', symfs_dir, '--kallsyms', kallsyms]
-      if subprocess.call(cmd, stdout=json_file, stderr=dev_null):
-        logging.warning('Perf data to JSON conversion failed. The result will '
-                        'not contain any perf samples. You can still view the '
-                        'perf data manually as shown above.')
-        return None
-
-    return json_file_name
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    # pylint: disable=unused-argument
-    assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
-        'recorded since explicit clock sync is not supported.')
-
-def _OptionalValueCallback(default_value):
-  def callback(option, _, __, parser):  # pylint: disable=unused-argument
-    value = default_value
-    if parser.rargs and not parser.rargs[0].startswith('-'):
-      value = parser.rargs.pop(0)
-    setattr(parser.values, option.dest, value)
-  return callback
-
-
-class PerfConfig(tracing_agents.TracingConfig):
-  def __init__(self, perf_categories, device):
-    tracing_agents.TracingConfig.__init__(self)
-    self.perf_categories = perf_categories
-    self.device = device
-
-
-def try_create_agent(config):
-  if config.perf_categories:
-    return PerfProfilerAgent(config.device)
-  return None
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Perf profiling options')
-  options.add_option('-p', '--perf', help='Capture a perf profile with '
-                     'the chosen comma-delimited event categories. '
-                     'Samples CPU cycles by default. Use "list" to see '
-                     'the available sample types.', action='callback',
-                     default='', callback=_OptionalValueCallback('cycles'),
-                     metavar='PERF_CATEGORIES', dest='perf_categories')
-  return options
-
-def get_config(options):
-  return PerfConfig(options.perf_categories, options.device)
-
-def _ComputePerfCategories(config):
-  if not PerfProfilerAgent.IsSupported():
-    return []
-  if not config.perf_categories:
-    return []
-  return config.perf_categories.split(',')
diff --git a/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py b/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py
deleted file mode 100644
index d8ebe3a..0000000
--- a/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-
-from profile_chrome import perf_tracing_agent
-from profile_chrome import ui
-from systrace import decorators
-from systrace.tracing_agents import agents_unittest
-
-
-class PerfProfilerAgentTest(agents_unittest.BaseAgentTest):
-  @decorators.ClientOnlyTest
-  def testGetCategories(self):
-    if not perf_tracing_agent.PerfProfilerAgent.IsSupported():
-      return
-    categories = \
-        perf_tracing_agent.PerfProfilerAgent.GetCategories(self.device)
-    assert 'cycles' in ' '.join(categories)
-
-  # TODO(washingtonp): Try enabling this test for the SimpleperfProfilerAgent,
-  # which will be added later.
-  @decorators.Disabled
-  def testTracing(self):
-    if not perf_tracing_agent.PerfProfilerAgent.IsSupported():
-      return
-    ui.EnableTestMode()
-    categories = 'cycles'
-    agent = perf_tracing_agent.PerfProfilerAgent(self.device)
-
-    try:
-      agent.StartAgentTracing(perf_tracing_agent.PerfConfig(categories,
-                                                            self.device))
-    finally:
-      agent.StopAgentTracing()
-
-    result = agent.GetResults()
-    json.loads(result.raw_data)
diff --git a/systrace/catapult/systrace/profile_chrome/profiler.py b/systrace/catapult/systrace/profile_chrome/profiler.py
deleted file mode 100644
index 148aabb..0000000
--- a/systrace/catapult/systrace/profile_chrome/profiler.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import time
-
-from profile_chrome import chrome_startup_tracing_agent
-from profile_chrome import chrome_tracing_agent
-from profile_chrome import ui
-from profile_chrome import util
-from systrace import output_generator
-from systrace import tracing_controller
-
-
-def _GetResults(trace_results, controller, output, compress, write_json,
-                interval):
-  ui.PrintMessage('Downloading...')
-
-  # Wait for the trace file to get written.
-  time.sleep(1)
-
-  for agent in controller.get_child_agents:
-    if isinstance(agent, chrome_tracing_agent.ChromeTracingAgent):
-      time.sleep(interval / 4)
-
-  # Ignore the systraceController because it will not contain any results,
-  # instead being in charge of collecting results.
-  trace_results = [x for x in controller.all_results if not (x.source_name ==
-      'systraceController')]
-
-  if not trace_results:
-    ui.PrintMessage('No results')
-    return ''
-
-  result = None
-  trace_results = output_generator.MergeTraceResultsIfNeeded(trace_results)
-  if not write_json:
-    ui.PrintMessage('Writing trace HTML...')
-    html_file = output or trace_results[0].source_name + '.html'
-    result = output_generator.GenerateHTMLOutput(trace_results, html_file)
-    ui.PrintMessage('\nWrote file://%s' % result)
-  elif compress and len(trace_results) == 1:
-    result = output or trace_results[0].source_name + '.gz'
-    util.WriteDataToCompressedFile(trace_results[0].raw_data, result)
-  elif len(trace_results) > 1:
-    result = (output or 'chrome-combined-trace-%s.zip' %
-              util.GetTraceTimestamp())
-    util.ArchiveData(trace_results, result)
-  elif output:
-    result = output
-    with open(result, 'wb') as f:
-      f.write(trace_results[0].raw_data)
-  else:
-    result = trace_results[0].source_name
-    with open(result, 'wb') as f:
-      f.write(trace_results[0].raw_data)
-
-  return result
-
-
-def CaptureProfile(options, interval, modules, output=None,
-                   compress=False, write_json=False):
-  """Records a profiling trace saves the result to a file.
-
-  Args:
-    options: Command line options.
-    interval: Time interval to capture in seconds. An interval of None (or 0)
-        continues tracing until stopped by the user.
-    modules: The list of modules to initialize the tracing controller with.
-    output: Output file name or None to use an automatically generated name.
-    compress: If True, the result will be compressed either with gzip or zip
-        depending on the number of captured subtraces.
-    write_json: If True, prefer JSON output over HTML.
-
-  Returns:
-    Path to saved profile.
-  """
-  agents_with_config = tracing_controller.CreateAgentsWithConfig(options,
-                                                                 modules)
-  if chrome_startup_tracing_agent in modules:
-    controller_config = tracing_controller.GetChromeStartupControllerConfig(
-        options)
-  else:
-    controller_config = tracing_controller.GetControllerConfig(options)
-  controller = tracing_controller.TracingController(agents_with_config,
-                                                    controller_config)
-  try:
-    result = controller.StartTracing()
-    trace_type = controller.GetTraceType()
-    if not result:
-      ui.PrintMessage('Trace starting failed.')
-    if interval:
-      ui.PrintMessage(('Capturing %d-second %s. Press Enter to stop early...' %
-                     (interval, trace_type)), eol='')
-      ui.WaitForEnter(interval)
-    else:
-      ui.PrintMessage('Capturing %s. Press Enter to stop...' % trace_type,
-                      eol='')
-      raw_input()
-
-    ui.PrintMessage('Stopping...')
-    all_results = controller.StopTracing()
-  finally:
-    if interval:
-      ui.PrintMessage('done')
-
-  return _GetResults(all_results, controller, output, compress, write_json,
-                     interval)
diff --git a/systrace/catapult/systrace/profile_chrome/profiler_unittest.py b/systrace/catapult/systrace/profile_chrome/profiler_unittest.py
deleted file mode 100644
index cd7af95..0000000
--- a/systrace/catapult/systrace/profile_chrome/profiler_unittest.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-import zipfile
-
-from profile_chrome import profiler
-from profile_chrome import ui
-from profile_chrome import fake_agent_1
-from profile_chrome import fake_agent_2
-from systrace import decorators
-from systrace import tracing_controller
-
-
-class ProfilerTest(unittest.TestCase):
-  def setUp(self):
-    ui.EnableTestMode()
-    self._tracing_options = tracing_controller.TracingControllerConfig(None,
-        None, None, None, None, None, None, None, None, None)
-
-  @decorators.ClientOnlyTest
-  def testCaptureBasicProfile(self):
-    result = profiler.CaptureProfile(self._tracing_options, 1, [fake_agent_1])
-
-    try:
-      self.assertTrue(os.path.exists(result))
-      self.assertTrue(result.endswith('.html'))
-    finally:
-      if os.path.exists(result):
-        os.remove(result)
-
-  @decorators.ClientOnlyTest
-  def testCaptureJsonProfile(self):
-    result = profiler.CaptureProfile(self._tracing_options, 1,
-                                     [fake_agent_2], write_json=True)
-
-    try:
-      self.assertFalse(result.endswith('.html'))
-      with open(result) as f:
-        self.assertEquals(f.read(), 'fake-contents')
-    finally:
-      if os.path.exists(result):
-        os.remove(result)
-
-  @decorators.ClientOnlyTest
-  def testCaptureMultipleProfiles(self):
-    result = profiler.CaptureProfile(self._tracing_options, 1,
-                                     [fake_agent_1, fake_agent_2],
-                                     write_json=True)
-
-    try:
-      self.assertTrue(result.endswith('.zip'))
-      self.assertTrue(zipfile.is_zipfile(result))
-    finally:
-      if os.path.exists(result):
-        os.remove(result)
diff --git a/systrace/catapult/systrace/profile_chrome/run_tests b/systrace/catapult/systrace/profile_chrome/run_tests
deleted file mode 100755
index 6ae1854..0000000
--- a/systrace/catapult/systrace/profile_chrome/run_tests
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-cd $(dirname $0)/../
-exec python -m unittest discover profile_chrome '*_unittest.py' $@
diff --git a/systrace/catapult/systrace/profile_chrome/third_party/COPYING b/systrace/catapult/systrace/profile_chrome/third_party/COPYING
deleted file mode 100644
index d159169..0000000
--- a/systrace/catapult/systrace/profile_chrome/third_party/COPYING
+++ /dev/null
@@ -1,339 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/systrace/catapult/systrace/profile_chrome/third_party/README.chromium b/systrace/catapult/systrace/profile_chrome/third_party/README.chromium
deleted file mode 100644
index 5f58a65..0000000
--- a/systrace/catapult/systrace/profile_chrome/third_party/README.chromium
+++ /dev/null
@@ -1,15 +0,0 @@
-Name: Perf to JSON conversion script
-Short Name: perf_to_json
-URL: http://www.chromium.org
-Version: 0
-Date: 21.7.2014
-Revision: 0
-License: GPL
-License File: NOT_SHIPPED
-Security Critical: No
-
-Description:
-Script for converting perf script events into tracing JSON.
-
-Local Modifications:
-None.
diff --git a/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py b/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py
deleted file mode 100644
index 280937a..0000000
--- a/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py
+++ /dev/null
@@ -1,248 +0,0 @@
-# Script for converting perf script events into tracing JSON.
-#
-# Generated by perf script -g python
-# Licensed under the terms of the GNU GPL License version 2
-
-import json
-import os
-import sys
-
-from collections import deque
-
-
-# Categorize DSOs by component.
-dso_to_comp = {
-    'libdvm.so': 'Java',
-    'libart.so': 'Java',
-    'libjavacore.so': 'Java',
-    'libandroid_runtime.so': 'Android',
-    'libgui.so': 'Android',
-    'libui.so': 'Android',
-    'libbinder.so': 'Android',
-    'libmemalloc.so': 'Android',
-    'libcrypto.so': 'Android',
-    'libcutils.so':'Android',
-    'libutils.so': 'Android',
-    '[kernel.kallsyms]': 'Kernel',
-    'libc.so': 'Standard Lib',
-    'libstdc++.so': 'Standard Lib',
-    'libm.so':'Standard Lib',
-    'libGLESv2_adreno.so': 'GPU Driver',
-    'libGLESv2_adreno200.so': 'GPU Driver',
-    'libq3dtools_adreno200.so': 'GPU Driver',
-    'libEGL_adreno.so': 'GPU Driver',
-    'libEGL_adreno200.so': 'GPU Driver',
-    'libEGL.so': 'GPU Driver',
-    'libgsl.so': 'GPU Driver',
-    'libGLESv2.so': 'GPU Driver',
-    'libsc-a3xx.so': 'GPU Driver',
-    'libadreno_utils.so': 'GPU Driver',
-    'eglsubAndroid.so': 'GPU Driver',
-    'gralloc.msm8960.so': 'GPU Driver',
-    'libadreno_utils': 'GPU Driver',
-    'libGLES_mali.so': 'GPU Driver',
-    'libchromeview.so': 'Chrome',
-    '[unknown]': '<unknown>',
-    '[UNKNOWN]': '<unknown>',
-}
-
-
-def FilterSymbolModule(module):
-  m = dso_to_comp.get(module, None)
-  if m:
-    return m
-  if module.find('libchrome.') == 0:
-    return 'Chrome'
-  if module.find('dalvik') >= 0 or module.find('@') >= 0:
-    return 'Java'
-  return module
-
-
-def FilterSymbolName(module, orign_module, name):
-  if module == 'Java':
-    return name
-  elif module == 'GPU Driver':
-    return name
-  if name == '':
-    return orign_module + ':unknown'
-  if name[0].isdigit() or name == '(nil)':
-    return orign_module + ':unknown'
-  return name
-
-
-class StackFrameNode:
-  def __init__(self, stack_id, name, category):
-    self.stack_id = stack_id
-    self.parent_id = 0
-    self.children = {}
-    self.category = category
-    self.name = name
-    self.samples = []
-    self.total_weight = 0.0
-    self.have_total_weight = False
-    self.parent = None
-
-  def ToDict(self, out_dict):
-    if self.stack_id:
-      node_dict = {}
-      node_dict['name'] = self.name
-      node_dict['category'] = self.category
-      if self.parent_id:
-        node_dict['parent'] = self.parent_id
-
-      out_dict[self.stack_id] = node_dict
-
-    for child in self.children.values():
-      child.ToDict(out_dict)
-    return out_dict
-
-  def GetTotalWeight(self):
-    if self.have_total_weight:
-      return self.total_weight
-    else:
-      # Sum up self samples weight, and children's total weights.
-      for s in self.samples:
-        self.total_weight += s.weight
-      for c in self.children.values():
-        self.total_weight += c.GetTotalWeight()
-      self.have_total_weight = True
-      return self.total_weight
-
-
-class PerfSample:
-  def __init__(self, stack_id, ts, cpu, tid, weight, samp_type, comm):
-    self.stack_id = stack_id
-    self.ts = ts
-    self.cpu = cpu
-    self.tid = tid
-    self.weight = weight
-    self.type = samp_type
-    self.comm = comm
-
-  def ToDict(self):
-    ret = {}
-    ret['ts'] = self.ts / 1000.0  # Timestamp in microseconds
-    ret['tid'] = self.tid  # Thread id
-    ret['cpu'] = self.cpu  # Sampled CPU
-    ret['weight'] = self.weight  # Sample weight
-    ret['name'] = self.type  # Sample type
-    ret['comm'] = self.comm  # Sample type
-    assert self.stack_id != 0
-    if self.stack_id:
-      ret['sf'] = self.stack_id  # Stack frame id
-    return ret
-
-
-samples = []
-root_chain = StackFrameNode(0, 'root', '[unknown]')
-next_stack_id = 1
-tot_period = 0
-saved_period = 0
-
-
-def process_event(param_dict):
-  global next_stack_id
-  global saved_period
-  global tot_period
-
-  samp_comm = param_dict['comm']
-  samp_tid = param_dict['tid']
-  samp_cpu = param_dict['cpu']
-  samp_ts = param_dict['time']
-  samp_period = param_dict['period']
-  samp_type = param_dict['ev_name']
-  tot_period += samp_period
-
-  # Parse call chain.
-  seen_syms = set()
-  chain = deque()
-  for cs in param_dict['cs']:
-    cs_name = cs[0]
-    cs_dso = os.path.basename(cs[1])
-    cs_category = FilterSymbolModule(cs_dso)
-    cs_name = FilterSymbolName(cs_category, cs_dso, cs_name)
-
-    if cs_category != '<unknown>' or len(chain) == 0:
-      sym = (cs_name, cs_category)
-      if sym in seen_syms:
-        while chain[0] != sym:
-          seen_syms.remove(chain[0])
-          chain.popleft()
-      else:
-        seen_syms.add(sym)
-        chain.appendleft(sym)
-
-      # Discard garbage stacktrace before __pthread_start()
-      if cs_name == '__pthread_start(void*)':
-        break
-
-  # Done reading call chain.  Add to stack frame tree.
-  stack_frame = root_chain
-  for call in chain:
-    if call in stack_frame.children:
-      stack_frame = stack_frame.children[call]
-    else:
-      new_node = StackFrameNode(next_stack_id, call[0], call[1])
-      next_stack_id += 1
-      new_node.parent_id = stack_frame.stack_id
-      stack_frame.children[call] = new_node
-      stack_frame = new_node
-
-  # Save sample.
-  sample = PerfSample(stack_frame.stack_id,
-                  samp_ts,
-                  samp_cpu,
-                  samp_tid,
-                  samp_period,
-                  samp_type,
-                  samp_comm)
-  samples.append(sample)
-  stack_frame.samples.append(sample)
-  saved_period += samp_period
-
-
-def trace_begin():
-  pass
-
-
-def trace_end():
-  # Return siblings of a call tree node.
-  def GetNodeSiblings(node):
-    if not node:
-      return []
-    if not node.parent:
-      return []
-    return node.parent.children.values()
-
-  # Try to reduce misplaced stack leaves by moving them up into sibling nodes.
-  def FixCallTree(node, parent):
-    # Get siblings of node's parent.
-    node.parent = parent
-    parent_siblings = GetNodeSiblings(parent)
-
-    # If parent's sibling has same node name, has no children and small weight,
-    # transplant sibling's samples into the current node.
-    for sibling in parent_siblings:
-      if sibling.name == node.name and \
-          len(sibling.children) == 0 and \
-          sibling.GetTotalWeight() <= node.GetTotalWeight() * 0.15:
-
-        # Transplant samples from sibling to current node.
-        for samp in sibling.samples:
-          samp.stack_id = node.stack_id
-          node.samples.append(samp)
-        sibling.samples = []
-        break
-
-    # Recurse child nodes.
-    for c in node.children.values():
-      FixCallTree(c, node)
-
-  FixCallTree(root_chain, None)
-
-  trace_dict = {}
-  trace_dict['samples'] = [s.ToDict() for s in samples]
-  trace_dict['stackFrames'] = root_chain.ToDict({})
-  trace_dict['traceEvents'] = []
-
-  json.dump(trace_dict, sys.stdout, indent=1)
diff --git a/systrace/catapult/systrace/profile_chrome/ui.py b/systrace/catapult/systrace/profile_chrome/ui.py
deleted file mode 100644
index 30ebd9b..0000000
--- a/systrace/catapult/systrace/profile_chrome/ui.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import select
-import sys
-
-
-def PrintMessage(heading, eol='\n'):
-  sys.stdout.write('%s%s' % (heading, eol))
-  sys.stdout.flush()
-
-
-def WaitForEnter(timeout):
-  select.select([sys.stdin], [], [], timeout)
-
-
-def EnableTestMode():
-  def NoOp(*_, **__):  # pylint: disable=unused-argument
-    pass
-  # pylint: disable=W0601
-  global PrintMessage
-  global WaitForEnter
-  PrintMessage = NoOp
-  WaitForEnter = NoOp
-  logging.getLogger().disabled = True
diff --git a/systrace/catapult/systrace/profile_chrome/util.py b/systrace/catapult/systrace/profile_chrome/util.py
deleted file mode 100644
index f5cb5bf..0000000
--- a/systrace/catapult/systrace/profile_chrome/util.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import gzip
-import os
-import time
-import zipfile
-
-
-def ArchiveFiles(host_files, output):
-  with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as z:
-    for host_file in host_files:
-      z.write(host_file)
-      os.unlink(host_file)
-
-def CompressFile(host_file, output):
-  with gzip.open(output, 'wb') as out, open(host_file, 'rb') as input_file:
-    out.write(input_file.read())
-  os.unlink(host_file)
-
-def ArchiveData(trace_results, output):
-  with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as z:
-    for result in trace_results:
-      trace_file = result.source_name + GetTraceTimestamp()
-      WriteDataToCompressedFile(result.raw_data, trace_file)
-      z.write(trace_file)
-      os.unlink(trace_file)
-
-def WriteDataToCompressedFile(data, output):
-  with gzip.open(output, 'wb') as out:
-    out.write(data)
-
-def GetTraceTimestamp():
-  return time.strftime('%Y-%m-%d-%H%M%S', time.localtime())
diff --git a/systrace/catapult/systrace/pylintrc b/systrace/catapult/systrace/pylintrc
deleted file mode 100644
index eb051e6..0000000
--- a/systrace/catapult/systrace/pylintrc
+++ /dev/null
@@ -1,67 +0,0 @@
-[MESSAGES CONTROL]
-
-# Disable the message, report, category or checker with the given id(s).
-# TODO: Shrink this list to as small as possible.
-disable=
-  design,
-  similarities,
-
-  abstract-class-not-used,
-  bad-builtin,
-  bad-continuation,
-  eval-used,
-  fixme,
-  invalid-name,
-  locally-disabled,
-  missing-docstring,
-  protected-access,
-  star-args,
-
-
-[REPORTS]
-
-# Don't write out full reports, just messages.
-reports=no
-
-
-[BASIC]
-
-# Regular expression which should only match correct function names.
-function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
-
-# Regular expression which should only match correct method names.
-method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
-
-# Regular expression which should only match correct argument names.
-argument-rgx=^[a-z][a-z0-9_]*$
-
-# Regular expression which should only match correct variable names.
-variable-rgx=^[a-z][a-z0-9_]*$
-
-# Good variable names which should always be accepted, separated by a comma.
-good-names=main,_
-
-# List of builtins function names that should not be used, separated by a comma.
-bad-functions=apply,input,reduce
-
-
-[VARIABLES]
-
-# Tells wether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching names used for dummy variables (i.e. not used).
-dummy-variables-rgx=^\*{0,2}(_$|unused_)
-
-
-[TYPECHECK]
-
-# Tells wether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-
-[FORMAT]
-
-# We use two spaces for indents, instead of the usual four spaces or tab.
-indent-string='  '
diff --git a/systrace/catapult/systrace/systrace/AUTHORS b/systrace/catapult/systrace/systrace/AUTHORS
deleted file mode 100644
index 5a7ed82..0000000
--- a/systrace/catapult/systrace/systrace/AUTHORS
+++ /dev/null
@@ -1,12 +0,0 @@
-# Names should be added to this file with this pattern:
-#
-# For individuals:
-#   Name <email address>
-#
-# For organizations:
-#   Organization <fnmatch pattern>
-#
-# See python fnmatch module documentation for more information.
-
-The Chromium Authors <*@chromium.org>
-Google Inc. <*@google.com>
diff --git a/systrace/catapult/systrace/systrace/LICENSE b/systrace/catapult/systrace/systrace/LICENSE
deleted file mode 100644
index 8dc3504..0000000
--- a/systrace/catapult/systrace/systrace/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/systrace/catapult/systrace/systrace/README.md b/systrace/catapult/systrace/systrace/README.md
deleted file mode 100644
index 0e103a5..0000000
--- a/systrace/catapult/systrace/systrace/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- Copyright 2015 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-Systrace
-========
-
-Systrace relies on
-[Trace-Viewer](https://github.com/catapult-project/catapult/blob/master/tracing/README.md)
-to visualize the traces. The development of Trace-Viewer and Systrace is
-decoupled by the systrace_trace_viewer.html file.
-* The update_systrace_trace_viewer.py script generates
-systrace_trace_viewer.html based on the Trace-Viewer code.
-* Systrace visualizes the trace result based on systrace_trace_viewer.html.
-* Systrace will auto update systrace_trace_viewer.html if
-update_systrace_trace_viewer.py exists.
diff --git a/systrace/catapult/systrace/systrace/__init__.py b/systrace/catapult/systrace/systrace/__init__.py
deleted file mode 100644
index 730c164..0000000
--- a/systrace/catapult/systrace/systrace/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import os
-import sys
-
-def _JoinPath(*path_parts):
-  return os.path.abspath(os.path.join(*path_parts))
-
-
-def _AddDirToPythonPath(*path_parts):
-  path = _JoinPath(*path_parts)
-  if os.path.isdir(path) and path not in sys.path:
-    # Some call sites that use Telemetry assume that sys.path[0] is the
-    # directory containing the script, so we add these extra paths to right
-    # after sys.path[0].
-    sys.path.insert(1, path)
-
-_CATAPULT_DIR = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), os.path.pardir, os.path.pardir)
-
-_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_utils')
-_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_trace_event')
-_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_trace_event', 'py_trace_event')
-_AddDirToPythonPath(_CATAPULT_DIR, 'devil')
-_AddDirToPythonPath(_CATAPULT_DIR, 'systrace')
-_AddDirToPythonPath(_CATAPULT_DIR, 'tracing')
diff --git a/systrace/catapult/systrace/systrace/decorators.py b/systrace/catapult/systrace/systrace/decorators.py
deleted file mode 100644
index 8545eaa..0000000
--- a/systrace/catapult/systrace/systrace/decorators.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-def HostOnlyTest(func):
-  """Decorator for running unit tests only on the host device.
-
-  This will disable unit tests from running on Android devices.
-  """
-  return _SkipTestDecoratorHelper(func, ['android'])
-
-
-def ClientOnlyTest(func):
-  """Decorator for running unit tests only on client devices (Android).
-  """
-  return _SkipTestDecoratorHelper(func, ['win', 'linux', 'mac'])
-
-
-def Disabled(func):
-  """Decorator for not running a unit test on any Trybot platform.
-  """
-  return _SkipTestDecoratorHelper(func, ['win', 'linux', 'mac', 'android'])
-
-
-def LinuxMacTest(func):
-  return _SkipTestDecoratorHelper(func, ['win', 'android'])
-
-
-def _SkipTestDecoratorHelper(func, disabled_strings):
-  if not hasattr(func, '_disabled_strings'):
-    setattr(func, '_disabled_strings', set(disabled_strings))
-  return func
-
-
-def ShouldSkip(test, device):
-  """Returns whether the test should be skipped and the reason for it."""
-  if hasattr(test, '_disabled_strings'):
-    disabled_devices = getattr(test, '_disabled_strings')
-    return device in disabled_devices
-  return False
diff --git a/systrace/catapult/systrace/systrace/monitor_unittest.py b/systrace/catapult/systrace/systrace/monitor_unittest.py
deleted file mode 100644
index aaeef3e..0000000
--- a/systrace/catapult/systrace/systrace/monitor_unittest.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import unittest
-
-from systrace import decorators
-from systrace import update_systrace_trace_viewer
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-STABLE_VIEWER_PATH = os.path.join(SCRIPT_DIR, 'systrace_trace_viewer.html')
-
-# Tests presence and content of static HTML files used not only for Python
-# systrace capture, but also Java-based capture in the android SDK tools.
-#
-# NOTE: changes to this file should typically be accompanied by changes to the
-# Android SDK's method of systrace capture.
-class MonitorTest(unittest.TestCase):
-
-  @decorators.HostOnlyTest
-  def test_systrace_trace_viewer(self):
-    self.assertEqual(STABLE_VIEWER_PATH,
-      update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
-
-    update_systrace_trace_viewer.update(force_update=True)
-
-    with open(STABLE_VIEWER_PATH) as f:
-      content = f.read().strip()
-
-      # expect big html file
-      self.assertGreater(5 * 1024 * 1024, len(content))
-      self.assertEqual('<', content[0])
-    os.remove(f.name)
-
-
-  @decorators.HostOnlyTest
-  def test_prefix(self):
-    with open(os.path.join(SCRIPT_DIR, 'prefix.html.template')) as f:
-      content = f.read().strip()
-
-      self.assertTrue("<html>" in content)
-      self.assertTrue("<title>Android System Trace</title>" in content)
-      self.assertTrue("{{SYSTRACE_TRACE_VIEWER_HTML}}" in content)
-
-
-  @decorators.HostOnlyTest
-  def test_suffix(self):
-    with open(os.path.join(SCRIPT_DIR, 'suffix.html')) as f:
-      content = f.read().strip()
-
-      self.assertTrue("</html>" in content)
diff --git a/systrace/catapult/systrace/systrace/output_generator.py b/systrace/catapult/systrace/systrace/output_generator.py
deleted file mode 100644
index 40bfe20..0000000
--- a/systrace/catapult/systrace/systrace/output_generator.py
+++ /dev/null
@@ -1,202 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import base64
-import gzip
-import json
-import os
-import StringIO
-
-from systrace import tracing_controller
-from systrace import trace_result
-from tracing.trace_data import trace_data
-
-
-# TODO(alexandermont): Current version of trace viewer does not support
-# the controller tracing agent output. Thus we use this variable to
-# suppress this tracing agent's output. This should be removed once
-# trace viewer is working again.
-OUTPUT_CONTROLLER_TRACE_ = False
-CONTROLLER_TRACE_DATA_KEY = 'controllerTraceDataKey'
-_SYSTRACE_TO_TRACE_DATA_NAME_MAPPING = {
-    'androidProcessDump': trace_data.ANDROID_PROCESS_DATA_PART,
-    'atraceProcessDump': trace_data.ATRACE_PROCESS_DUMP_PART,
-    'systemTraceEvents': trace_data.ATRACE_PART,
-    'systraceController': trace_data.TELEMETRY_PART,
-    'traceEvents': trace_data.CHROME_TRACE_PART,
-    'waltTrace': trace_data.WALT_TRACE_PART,
-    'cgroupDump': trace_data.CGROUP_TRACE_PART,
-}
-_SYSTRACE_HEADER = 'Systrace'
-
-
-def NewGenerateHTMLOutput(trace_results, output_file_name):
-  with trace_data.TraceDataBuilder() as builder:
-    for trace in trace_results:
-      trace_data_part = _SYSTRACE_TO_TRACE_DATA_NAME_MAPPING.get(
-          trace.source_name)
-      builder.AddTraceFor(
-          trace_data_part, trace.raw_data, allow_unstructured=True)
-    builder.Serialize(output_file_name, _SYSTRACE_HEADER)
-
-
-def GenerateHTMLOutput(trace_results, output_file_name):
-  """Write the results of systrace to an HTML file.
-
-  Args:
-      trace_results: A list of TraceResults.
-      output_file_name: The name of the HTML file that the trace viewer
-          results should be written to.
-  """
-  def _ReadAsset(src_dir, filename):
-    return open(os.path.join(src_dir, filename)).read()
-
-  # TODO(rnephew): The tracing output formatter is able to handle a single
-  # systrace trace just as well as it handles multiple traces. The obvious thing
-  # to do here would be to use it all for all systrace output: however, we want
-  # to continue using the legacy way of formatting systrace output when a single
-  # systrace and the tracing controller trace are present in order to match the
-  # Java verison of systrace. Java systrace is expected to be deleted at a later
-  # date. We should consolidate this logic when that happens.
-
-  if len(trace_results) > 4:
-    NewGenerateHTMLOutput(trace_results, output_file_name)
-    return os.path.abspath(output_file_name)
-
-  systrace_dir = os.path.abspath(os.path.dirname(__file__))
-
-  try:
-    from systrace import update_systrace_trace_viewer
-  except ImportError:
-    pass
-  else:
-    update_systrace_trace_viewer.update()
-
-  trace_viewer_html = _ReadAsset(systrace_dir, 'systrace_trace_viewer.html')
-
-  # Open the file in binary mode to prevent python from changing the
-  # line endings, then write the prefix.
-  systrace_dir = os.path.abspath(os.path.dirname(__file__))
-  html_prefix = _ReadAsset(systrace_dir, 'prefix.html.template')
-  html_suffix = _ReadAsset(systrace_dir, 'suffix.html')
-  trace_viewer_html = _ReadAsset(systrace_dir,
-                                  'systrace_trace_viewer.html')
-  catapult_root = os.path.abspath(os.path.dirname(os.path.dirname(
-                                  os.path.dirname(__file__))))
-  polymer_dir = os.path.join(catapult_root, 'third_party', 'polymer',
-                             'components', 'webcomponentsjs')
-  webcomponent_v0_polyfill = _ReadAsset(polymer_dir, 'webcomponents.min.js')
-
-  # Add the polyfill
-  html_output = html_prefix.replace('{{WEBCOMPONENTS_V0_POLYFILL_JS}}',
-                                    webcomponent_v0_polyfill)
-
-  # Open the file in binary mode to prevent python from changing the
-  # line endings, then write the prefix.
-  html_file = open(output_file_name, 'wb')
-  html_file.write(html_output.replace('{{SYSTRACE_TRACE_VIEWER_HTML}}',
-                                      trace_viewer_html))
-
-
-
-  # Write the trace data itself. There is a separate section of the form
-  # <script class="trace-data" type="application/text"> ... </script>
-  # for each tracing agent (including the controller tracing agent).
-  html_file.write('<!-- BEGIN TRACE -->\n')
-  for result in trace_results:
-    html_file.write('  <script class="trace-data" type="application/text">\n')
-    html_file.write(_ConvertToHtmlString(result.raw_data))
-    html_file.write('  </script>\n')
-  html_file.write('<!-- END TRACE -->\n')
-
-  # Write the suffix and finish.
-  html_file.write(html_suffix)
-  html_file.close()
-
-  final_path = os.path.abspath(output_file_name)
-  return final_path
-
-def _ConvertToHtmlString(result):
-  """Convert a trace result to the format to be output into HTML.
-
-  If the trace result is a dictionary or list, JSON-encode it.
-  If the trace result is a string, leave it unchanged.
-  """
-  if isinstance(result, dict) or isinstance(result, list):
-    return json.dumps(result)
-  elif isinstance(result, str):
-    return result
-  else:
-    raise ValueError('Invalid trace result format for HTML output')
-
-def GenerateJSONOutput(trace_results, output_file_name):
-  """Write the results of systrace to a JSON file.
-
-  Args:
-      trace_results: A list of TraceResults.
-      output_file_name: The name of the JSON file that the trace viewer
-          results should be written to.
-  """
-  results = _ConvertTraceListToDictionary(trace_results)
-  results[CONTROLLER_TRACE_DATA_KEY] = (
-      tracing_controller.TRACE_DATA_CONTROLLER_NAME)
-  with open(output_file_name, 'w') as json_file:
-    json.dump(results, json_file)
-  final_path = os.path.abspath(output_file_name)
-  return final_path
-
-def MergeTraceResultsIfNeeded(trace_results):
-  """Merge a list of trace data, if possible. This function can take any list
-     of trace data, but it will only merge the JSON data (since that's all
-     we can merge).
-
-     Args:
-        trace_results: A list of TraceResults containing trace data.
-  """
-  if len(trace_results) <= 1:
-    return trace_results
-  merge_candidates = []
-  for result in trace_results:
-    # Try to detect a JSON file cheaply since that's all we can merge.
-    if result.raw_data[0] != '{':
-      continue
-    try:
-      json_data = json.loads(result.raw_data)
-    except ValueError:
-      continue
-    merge_candidates.append(trace_result.TraceResult(result.source_name,
-                                                     json_data))
-
-  if len(merge_candidates) <= 1:
-    return trace_results
-
-  other_results = [r for r in trace_results
-                   if not r.source_name in
-                   [c.source_name for c in merge_candidates]]
-
-  merged_data = merge_candidates[0].raw_data
-
-  for candidate in merge_candidates[1:]:
-    json_data = candidate.raw_data
-    for key, value in json_data.items():
-      if not str(key) in merged_data or not merged_data[str(key)]:
-        merged_data[str(key)] = value
-
-  return ([trace_result.TraceResult('merged-data', json.dumps(merged_data))]
-              + other_results)
-
-def _EncodeTraceData(trace_string):
-  compressed_trace = StringIO.StringIO()
-  with gzip.GzipFile(fileobj=compressed_trace, mode='w') as f:
-    f.write(trace_string)
-  b64_content = base64.b64encode(compressed_trace.getvalue())
-  return b64_content
-
-def _ConvertTraceListToDictionary(trace_list):
-  trace_dict = {}
-  for trace in trace_list:
-    trace_dict[trace.source_name] = trace.raw_data
-  return trace_dict
diff --git a/systrace/catapult/systrace/systrace/output_generator_unittest.py b/systrace/catapult/systrace/systrace/output_generator_unittest.py
deleted file mode 100644
index 87ca332..0000000
--- a/systrace/catapult/systrace/systrace/output_generator_unittest.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import hashlib
-import json
-import os
-import unittest
-
-from py_utils import tempfile_ext
-from systrace import decorators
-from systrace import output_generator
-from systrace import trace_result
-from systrace import update_systrace_trace_viewer
-from tracing.trace_data import trace_data as trace_data_module
-
-
-TEST_DIR = os.path.join(os.path.dirname(__file__), 'test_data')
-ATRACE_DATA = os.path.join(TEST_DIR, 'atrace_data')
-ATRACE_PROCESS_DUMP_DATA = os.path.join(TEST_DIR, 'atrace_procfs_dump')
-COMBINED_PROFILE_CHROME_DATA = os.path.join(
-    TEST_DIR, 'profile-chrome_systrace_perf_chrome_data')
-CGROUP_DUMP_DATA = os.path.join(TEST_DIR, 'cgroup_dump')
-
-
-class OutputGeneratorTest(unittest.TestCase):
-
-  @decorators.HostOnlyTest
-  def testJsonTraceMerging(self):
-    update_systrace_trace_viewer.update(force_update=True)
-    self.assertTrue(os.path.exists(
-        update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
-    t1 = "{'traceEvents': [{'ts': 123, 'ph': 'b'}]}"
-    t2 = "{'traceEvents': [], 'stackFrames': ['blah']}"
-    results = [trace_result.TraceResult('a', t1),
-               trace_result.TraceResult('b', t2)]
-
-    merged_results = output_generator.MergeTraceResultsIfNeeded(results)
-    for r in merged_results:
-      if r.source_name == 'a':
-        self.assertEquals(r.raw_data, t1)
-      elif r.source_name == 'b':
-        self.assertEquals(r.raw_data, t2)
-    self.assertEquals(len(merged_results), len(results))
-    os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
-
-  @decorators.HostOnlyTest
-  def testHtmlOutputGenerationFormatsSingleTrace(self):
-    update_systrace_trace_viewer.update(force_update=True)
-    self.assertTrue(os.path.exists(
-        update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
-    with open(ATRACE_DATA) as f:
-      atrace_data = f.read().replace(" ", "").strip()
-    trace_results = [trace_result.TraceResult('systemTraceEvents', atrace_data)]
-    with tempfile_ext.TemporaryFileName() as output_file_name:
-      output_generator.GenerateHTMLOutput(trace_results, output_file_name)
-      with open(output_file_name, 'r') as f:
-        html_output = f.read()
-      trace_data = (html_output.split(
-        '<script class="trace-data" type="application/text">')[1].split(
-        '</script>'))[0].replace(" ", "").strip()
-
-    # Ensure the trace data written in HTML is located within the
-    # correct place in the HTML document and that the data is not
-    # malformed.
-    self.assertEquals(trace_data, atrace_data)
-    os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
-
-  @decorators.HostOnlyTest
-  def testHtmlOutputGenerationFormatsMultipleTraces(self):
-    trace_results = []
-    with trace_data_module.TraceDataBuilder() as trace_data_builder:
-      with open(ATRACE_DATA) as fp:
-        atrace_data = fp.read()
-      trace_results.append(
-          trace_result.TraceResult('systemTraceEvents', atrace_data))
-      trace_data_builder.AddTraceFor(trace_data_module.ATRACE_PART, atrace_data,
-                                     allow_unstructured=True)
-
-      with open(ATRACE_PROCESS_DUMP_DATA) as fp:
-        atrace_process_dump_data = fp.read()
-      trace_results.append(trace_result.TraceResult(
-          'atraceProcessDump', atrace_process_dump_data))
-      trace_data_builder.AddTraceFor(trace_data_module.ATRACE_PROCESS_DUMP_PART,
-                                     atrace_process_dump_data,
-                                     allow_unstructured=True)
-
-      with open(CGROUP_DUMP_DATA) as fp:
-        cgroup_dump_data = fp.read()
-      trace_results.append(trace_result.TraceResult(
-          'cgroupDump', cgroup_dump_data))
-      trace_data_builder.AddTraceFor(trace_data_module.CGROUP_TRACE_PART,
-                                     cgroup_dump_data,
-                                     allow_unstructured=True)
-
-      with open(COMBINED_PROFILE_CHROME_DATA) as fp:
-        chrome_data = json.load(fp)
-      trace_results.append(
-          trace_result.TraceResult('traceEvents', chrome_data))
-      trace_data_builder.AddTraceFor(
-          trace_data_module.CHROME_TRACE_PART, chrome_data)
-
-      trace_results.append(
-          trace_result.TraceResult('systraceController', str({})))
-      trace_data_builder.AddTraceFor(trace_data_module.TELEMETRY_PART, {})
-
-      with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
-        data_builder_out = os.path.join(temp_dir, 'data_builder.html')
-        output_generator_out = os.path.join(temp_dir, 'output_generator.html')
-        output_generator.GenerateHTMLOutput(trace_results, output_generator_out)
-        trace_data_builder.Serialize(data_builder_out, 'Systrace')
-
-        output_generator_md5sum = hashlib.md5(
-            open(output_generator_out, 'rb').read()).hexdigest()
-        data_builder_md5sum = hashlib.md5(
-            open(data_builder_out, 'rb').read()).hexdigest()
-
-        self.assertEqual(output_generator_md5sum, data_builder_md5sum)
diff --git a/systrace/catapult/systrace/systrace/prefix.html b/systrace/catapult/systrace/systrace/prefix.html
deleted file mode 100644
index 828eef0..0000000
--- a/systrace/catapult/systrace/systrace/prefix.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head i18n-values="dir:textdirection;">
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<meta charset="utf-8"/>
-<title>Android System Trace</title>
-<style>
-  html,
-  body {
-    height: 100%;
-  }
-
-  body {
-    -webkit-flex-direction: column;
-    display: -webkit-flex;
-    margin: 0;
-    padding: 0;
-  }
-
-  body > tr-ui-timeline-view {
-    -webkit-flex: 1 1 auto;
-    min-height: 0;
-  }
-  body > tr-ui-timeline-view:focus {
-    outline: none;
-  }
-</style>
-{{SYSTRACE_TRACE_VIEWER_HTML}}
-</head>
-<body>
-  <tr-ui-timeline-view>
-    <track-view-container id='track_view_container'></track-view-container>
-  </tr-ui-timeline-view>
-
-  <script>
-  'use strict';
-  var timelineViewEl;
-
-  function onLoad() {
-    timelineViewEl = document.querySelector('tr-ui-timeline-view');
-    timelineViewEl.globalMode = true;
-
-    var traceDataEls = document.body.querySelectorAll('.trace-data');
-    var traces = [];
-    for (var i = 0; i < traceDataEls.length; i++) {
-      var traceText = traceDataEls[i].textContent;
-      // Remove the leading newline.
-      traceText = traceText.substring(1);
-      traces.push(traceText);
-    }
-
-    var m = new tr.Model();
-    var i = new tr.importer.Import(m);
-    var p = i.importTracesWithProgressDialog(traces);
-    p.then(
-      function() {
-        timelineViewEl.model = m;
-        timelineViewEl.updateDocumentFavicon();
-        timelineViewEl.globalMode = true;
-        timelineViewEl.viewTitle = 'Android System Trace';
-      },
-      function(err) {
-        var overlay = new tr.ui.b.Overlay();
-        overlay.textContent = tr.b.normalizeException(err).message;
-        overlay.title = 'Import error';
-        overlay.visible = true;
-      });
-  }
-  window.addEventListener('load', onLoad);
-  </script>
diff --git a/systrace/catapult/systrace/systrace/prefix.html.template b/systrace/catapult/systrace/systrace/prefix.html.template
deleted file mode 100644
index 767a300..0000000
--- a/systrace/catapult/systrace/systrace/prefix.html.template
+++ /dev/null
@@ -1,76 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head i18n-values="dir:textdirection;">
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<meta charset="utf-8"/>
-<title>Android System Trace</title>
-<style>
-  html,
-  body {
-    height: 100%;
-  }
-
-  body {
-    -webkit-flex-direction: column;
-    display: -webkit-flex;
-    margin: 0;
-    padding: 0;
-  }
-
-  body > tr-ui-timeline-view {
-    -webkit-flex: 1 1 auto;
-    min-height: 0;
-  }
-  body > tr-ui-timeline-view:focus {
-    outline: none;
-  }
-</style>
-
-<!-- WebComponent V0 polyfill. See https://crbug.com/1036492 -->
-<script>
-'use strict';
-{{WEBCOMPONENTS_V0_POLYFILL_JS}}
-</script>
-{{SYSTRACE_TRACE_VIEWER_HTML}}
-</head>
-<body>
-  <tr-ui-timeline-view>
-    <track-view-container id='track_view_container'></track-view-container>
-  </tr-ui-timeline-view>
-
-  <script>
-  'use strict';
-  var timelineViewEl;
-
-  function onLoad() {
-    timelineViewEl = document.querySelector('tr-ui-timeline-view');
-    timelineViewEl.globalMode = true;
-
-    var traceDataEls = document.body.querySelectorAll('.trace-data');
-    var traces = [];
-    for (var i = 0; i < traceDataEls.length; i++) {
-      var traceText = traceDataEls[i].textContent;
-      // Remove the leading newline.
-      traceText = traceText.substring(1);
-      traces.push(traceText);
-    }
-
-    var m = new tr.Model();
-    var i = new tr.importer.Import(m);
-    var p = i.importTracesWithProgressDialog(traces);
-    p.then(
-      function() {
-        timelineViewEl.model = m;
-        timelineViewEl.updateDocumentFavicon();
-        timelineViewEl.globalMode = true;
-        timelineViewEl.viewTitle = 'Android System Trace';
-      },
-      function(err) {
-        var overlay = new tr.ui.b.Overlay();
-        overlay.textContent = tr.b.normalizeException(err).message;
-        overlay.title = 'Import error';
-        overlay.visible = true;
-      });
-  }
-  window.addEventListener('load', onLoad);
-  </script>
diff --git a/systrace/catapult/systrace/systrace/run_systrace.py b/systrace/catapult/systrace/systrace/run_systrace.py
deleted file mode 100755
index c886dde..0000000
--- a/systrace/catapult/systrace/systrace/run_systrace.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Android system-wide tracing utility.
-
-This is a tool for capturing a trace that includes data from both userland and
-the kernel.  It creates an HTML file for visualizing the trace.
-"""
-
-# Make sure we're using a new enough version of Python.
-# The flags= parameter of re.sub() is new in Python 2.7. And Systrace does not
-# support Python 3 yet.
-
-# pylint: disable=wrong-import-position
-import sys
-
-version = sys.version_info[:2]
-if version != (2, 7):
-  sys.stderr.write('This script does not support Python %d.%d. '
-                   'Please use Python 2.7.\n' % version)
-  sys.exit(1)
-
-
-import optparse
-import os
-import time
-
-_SYSTRACE_DIR = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.path.pardir))
-_CATAPULT_DIR = os.path.join(
-    os.path.dirname(os.path.abspath(__file__)), os.path.pardir, os.path.pardir)
-_DEVIL_DIR = os.path.join(_CATAPULT_DIR, 'devil')
-if _DEVIL_DIR not in sys.path:
-  sys.path.insert(0, _DEVIL_DIR)
-if _SYSTRACE_DIR not in sys.path:
-  sys.path.insert(0, _SYSTRACE_DIR)
-
-from devil import devil_env
-from devil.android.sdk import adb_wrapper
-from systrace import systrace_runner
-from systrace import util
-from systrace.tracing_agents import atrace_agent
-from systrace.tracing_agents import atrace_from_file_agent
-from systrace.tracing_agents import atrace_process_dump
-from systrace.tracing_agents import ftrace_agent
-from systrace.tracing_agents import walt_agent
-from systrace.tracing_agents import android_cgroup_agent
-
-
-ALL_MODULES = [atrace_agent, atrace_from_file_agent, atrace_process_dump,
-               ftrace_agent, walt_agent, android_cgroup_agent]
-
-
-def parse_options(argv):
-  """Parses and checks the command-line options.
-
-  Returns:
-    A tuple containing the options structure and a list of categories to
-    be traced.
-  """
-  usage = 'Usage: %prog [options] [category1 [category2 ...]]'
-  desc = 'Example: %prog -b 32768 -t 15 gfx input view sched freq'
-  parser = optparse.OptionParser(usage=usage, description=desc,
-                                 conflict_handler='resolve')
-  parser = util.get_main_options(parser)
-
-  parser.add_option('-l', '--list-categories', dest='list_categories',
-                    default=False, action='store_true',
-                    help='list the available categories and exit')
-
-  # Add the other agent parsing options to the parser. For Systrace on the
-  # command line, all agents are added. For Android, only the compatible agents
-  # will be added.
-  for module in ALL_MODULES:
-    option_group = module.add_options(parser)
-    if option_group:
-      parser.add_option_group(option_group)
-
-  options, categories = parser.parse_args(argv[1:])
-
-  if options.output_file is None:
-    base = 'trace'
-    if options.from_file is not None:
-      base = os.path.splitext(options.from_file)[0]
-    suffix = '.json' if options.write_json else '.html'
-    options.output_file = base + suffix
-
-  if options.link_assets or options.asset_dir != 'trace-viewer':
-    parser.error('--link-assets and --asset-dir are deprecated.')
-
-  if options.trace_time and options.trace_time < 0:
-    parser.error('the trace time must be a non-negative number')
-
-  if (options.trace_buf_size is not None) and (options.trace_buf_size <= 0):
-    parser.error('the trace buffer size must be a positive number')
-
-  return (options, categories)
-
-def find_adb():
-  """Finds adb on the path.
-
-  This method is provided to avoid the issue of diskutils.spawn's
-  find_executable which first searches the current directory before
-  searching $PATH. That behavior results in issues where systrace.py
-  uses a different adb than the one in the path.
-  """
-  paths = os.environ['PATH'].split(os.pathsep)
-  executable = 'adb'
-  if sys.platform == 'win32':
-    executable = executable + '.exe'
-  for p in paths:
-    f = os.path.join(p, executable)
-    if os.path.isfile(f):
-      return f
-  return None
-
-def initialize_devil():
-  """Initialize devil to use adb from $PATH"""
-  adb_path = find_adb()
-  if adb_path is None:
-    print >> sys.stderr, "Unable to find adb, is it in your path?"
-    sys.exit(1)
-  devil_dynamic_config = {
-    'config_type': 'BaseConfig',
-    'dependencies': {
-      'adb': {
-        'file_info': {
-          devil_env.GetPlatform(): {
-            'local_paths': [os.path.abspath(adb_path)]
-          }
-        }
-      }
-    }
-  }
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-
-def main_impl(arguments):
-  # Parse the command line options.
-  options, categories = parse_options(arguments)
-
-  # Override --atrace-categories and --ftrace-categories flags if command-line
-  # categories are provided.
-  if categories:
-    if options.target == 'android':
-      options.atrace_categories = categories
-    elif options.target == 'linux':
-      options.ftrace_categories = categories
-    else:
-      raise RuntimeError('Categories are only valid for atrace/ftrace. Target '
-                         'platform must be either Android or Linux.')
-
-  # Include atrace categories by default in Systrace.
-  if options.target == 'android' and not options.atrace_categories:
-    options.atrace_categories = atrace_agent.DEFAULT_CATEGORIES
-
-  if options.target == 'android' and not options.from_file:
-    initialize_devil()
-    devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()]
-    if not options.device_serial_number:
-      if len(devices) == 0:
-        raise RuntimeError('No ADB devices connected.')
-      elif len(devices) >= 2:
-        raise RuntimeError('Multiple devices connected, serial number required')
-      options.device_serial_number = devices[0]
-    elif options.device_serial_number not in devices:
-      raise RuntimeError('Device with the serial number "%s" is not connected.'
-                         % options.device_serial_number)
-
-  # If list_categories is selected, just print the list of categories.
-  # In this case, use of the tracing controller is not necessary.
-  if options.list_categories:
-    if options.target == 'android':
-      atrace_agent.list_categories(options)
-    elif options.target == 'linux':
-      ftrace_agent.list_categories(options)
-    return
-
-  # Set up the systrace runner and start tracing.
-  controller = systrace_runner.SystraceRunner(
-      os.path.dirname(os.path.abspath(__file__)), options)
-  controller.StartTracing()
-
-  # Wait for the given number of seconds or until the user presses enter.
-  # pylint: disable=superfluous-parens
-  # (need the parens so no syntax error if trying to load with Python 3)
-  if options.from_file is not None:
-    print('Reading results from file.')
-  elif options.trace_time:
-    print('Starting tracing (%d seconds)' % options.trace_time)
-    time.sleep(options.trace_time)
-  else:
-    raw_input('Starting tracing (stop with enter)')
-
-  # Stop tracing and collect the output.
-  print('Tracing completed. Collecting output...')
-  controller.StopTracing()
-  print('Outputting Systrace results...')
-  controller.OutputSystraceResults(write_json=options.write_json)
-
-def main():
-  main_impl(sys.argv)
-
-if __name__ == '__main__' and __package__ is None:
-  main()
diff --git a/systrace/catapult/systrace/systrace/suffix.html b/systrace/catapult/systrace/systrace/suffix.html
deleted file mode 100644
index 308b1d0..0000000
--- a/systrace/catapult/systrace/systrace/suffix.html
+++ /dev/null
@@ -1,2 +0,0 @@
-</body>
-</html>
diff --git a/systrace/catapult/systrace/systrace/systrace_runner.py b/systrace/catapult/systrace/systrace/systrace_runner.py
deleted file mode 100644
index 695c0ee..0000000
--- a/systrace/catapult/systrace/systrace/systrace_runner.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-'''Implementation of tracing controller for systrace. This class creates the
-necessary tracing agents for systrace, runs them, and outputs the results
-as an HTML or JSON file.'''
-
-from systrace import output_generator
-from systrace import tracing_controller
-from systrace.tracing_agents import android_process_data_agent
-from systrace.tracing_agents import android_cgroup_agent
-from systrace.tracing_agents import atrace_agent
-from systrace.tracing_agents import atrace_from_file_agent
-from systrace.tracing_agents import atrace_process_dump
-from systrace.tracing_agents import ftrace_agent
-from systrace.tracing_agents import walt_agent
-
-AGENT_MODULES = [android_process_data_agent, android_cgroup_agent,
-                 atrace_agent, atrace_from_file_agent, atrace_process_dump,
-                 ftrace_agent, walt_agent]
-
-class SystraceRunner(object):
-  def __init__(self, script_dir, options):
-    """Constructor.
-
-    Args:
-        script_dir: Directory containing the trace viewer script
-                    (systrace_trace_viewer.html)
-        options: Object containing command line options.
-    """
-    # Parse command line arguments and create agents.
-    self._script_dir = script_dir
-    self._out_filename = options.output_file
-    agents_with_config = tracing_controller.CreateAgentsWithConfig(
-        options, AGENT_MODULES)
-    controller_config = tracing_controller.GetControllerConfig(options)
-
-    # Set up tracing controller.
-    self._tracing_controller = tracing_controller.TracingController(
-        agents_with_config, controller_config)
-
-  def StartTracing(self):
-    self._tracing_controller.StartTracing()
-
-  def StopTracing(self):
-    self._tracing_controller.StopTracing()
-
-  def OutputSystraceResults(self, write_json=False):
-    """Output the results of systrace to a file.
-
-    If output is necessary, then write the results of systrace to either (a)
-    a standalone HTML file, or (b) a json file which can be read by the
-    trace viewer.
-
-    Args:
-       write_json: Whether to output to a json file (if false, use HTML file)
-    """
-    print 'Tracing complete, writing results'
-    if write_json:
-      result = output_generator.GenerateJSONOutput(
-                  self._tracing_controller.all_results,
-                  self._out_filename)
-    else:
-      result = output_generator.GenerateHTMLOutput(
-                  self._tracing_controller.all_results,
-                  self._out_filename)
-    print '\nWrote trace %s file: file://%s\n' % (('JSON' if write_json
-                                                   else 'HTML'), result)
diff --git a/systrace/catapult/systrace/systrace/systrace_trace_viewer.html b/systrace/catapult/systrace/systrace/systrace_trace_viewer.html
deleted file mode 100644
index 11efa17..0000000
--- a/systrace/catapult/systrace/systrace/systrace_trace_viewer.html
+++ /dev/null
@@ -1,10258 +0,0 @@
-<template id="overlay-template">
-  <style>
-    overlay-mask {
-      left: 0;
-      padding: 8px;
-      position: absolute;
-      top: 0;
-      z-index: 1000;
-      font-family: sans-serif;
-      -webkit-justify-content: center;
-      background: rgba(0, 0, 0, 0.8);
-      display: flex;
-      height: 100%;
-      left: 0;
-      position: fixed;
-      top: 0;
-      width: 100%;
-    }
-    overlay-mask:focus {
-      outline: none;
-    }
-    overlay-vertical-centering-container {
-      -webkit-justify-content: center;
-      flex-direction: column;
-      display: flex;
-    }
-    overlay-frame {
-      z-index: 1100;
-      background: rgb(255, 255, 255);
-      border: 1px solid #ccc;
-      margin: 75px;
-      display: flex;
-      flex-direction: column;
-      min-height: 0;
-    }
-    title-bar {
-      -webkit-align-items: center;
-      flex-direction: row;
-      border-bottom: 1px solid #ccc;
-      background-color: #ddd;
-      display: flex;
-      padding: 5px;
-      flex: 0 0 auto;
-    }
-    title {
-      display: inline;
-      font-weight: bold;
-      flex: 1 1 auto;
-    }
-    close-button {
-      -webkit-align-self: flex-end;
-      border: 1px solid #eee;
-      background-color: #999;
-      font-size: 10pt;
-      font-weight: bold;
-      padding: 2px;
-      text-align: center;
-      width: 16px;
-    }
-    close-button:hover {
-      background-color: #ddd;
-      border-color: black;
-      cursor: pointer;
-    }
-    overlay-content {
-      display: flex;
-      flex: 1 1 auto;
-      flex-direction: column;
-      overflow-y: auto;
-      padding: 10px;
-      min-width: 300px;
-      min-height: 0;
-    }
-    button-bar {
-      -webkit-align-items: baseline;
-      border-top: 1px solid #ccc;
-      display: flex;
-      flex: 0 0 auto;
-      flex-direction: row-reverse;
-      padding: 4px;
-    }
-  </style>
-
-  <overlay-mask>
-    <overlay-vertical-centering-container>
-      <overlay-frame>
-        <title-bar>
-          <title></title>
-          <close-button>✕</close-button>
-        </title-bar>
-        <overlay-content>
-          <content></content>
-        </overlay-content>
-        <button-bar></button-bar>
-      </overlay-frame>
-    </overlay-vertical-centering-container>
-  </overlay-mask>
-</template><dom-module id="tr-ui-a-analysis-link">
-  <template>
-    <style>
-    :host {
-      display: inline;
-      cursor: pointer;
-      cursor: pointer;
-      white-space: nowrap;
-    }
-    a {
-      text-decoration: underline;
-    }
-    </style>
-    <a href="{{href}}" on-click="onClicked_" on-mouseenter="onMouseEnter_" on-mouseleave="onMouseLeave_"><slot></slot></a>
-
-  </template>
-</dom-module><dom-module id="tr-ui-b-table">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-
-      table {
-        flex: 1 1 auto;
-        align-self: stretch;
-        border-collapse: separate;
-        border-spacing: 0;
-        border-width: 0;
-        -webkit-user-select: initial;
-      }
-
-      tr > td {
-        padding: 2px 4px 2px 4px;
-        vertical-align: top;
-      }
-
-      table > tbody:focus {
-        outline: none;
-      }
-      table > tbody:focus[selection-mode="row"] > tr[selected],
-      table > tbody:focus[selection-mode="cell"] > tr > td[selected],
-      table > tbody:focus > tr.empty-row > td {
-        outline: 1px dotted #666666;
-        outline-offset: -1px;
-      }
-
-      button.toggle-button {
-        height: 15px;
-        line-height: 60%;
-        vertical-align: middle;
-        width: 100%;
-      }
-
-      button > * {
-        height: 15px;
-        vertical-align: middle;
-      }
-
-      td.button-column {
-        width: 30px;
-      }
-
-      table > thead > tr > td.sensitive:hover {
-        background-color: #fcfcfc;
-      }
-
-      table > thead > tr > td {
-        font-weight: bold;
-        text-align: left;
-
-        background-color: #eee;
-        white-space: nowrap;
-        overflow: hidden;
-        text-overflow: ellipsis;
-
-        border-top: 1px solid #ffffff;
-        border-bottom: 1px solid #aaa;
-      }
-
-      table > tfoot {
-        background-color: #eee;
-        font-weight: bold;
-      }
-
-      /* Light row and cell highlight. */
-      table > tbody[row-highlight-style="light"] > tr[selected],
-      table > tbody[cell-highlight-style="light"] > tr > td[selected] {
-        background-color: rgb(213, 236, 229);  /* light turquoise */
-      }
-      table > tbody[row-highlight-style="light"] >
-          tr:not(.empty-row):not([selected]):hover,
-      table > tbody[cell-highlight-style="light"] >
-          tr:not(.empty-row):not([selected]) > td:hover {
-        background-color: #f6f6f6;  /* light grey */
-      }
-
-      /* Dark row and cell highlight. */
-      table > tbody[row-highlight-style="dark"] > tr[selected],
-      table > tbody[cell-highlight-style="dark"] > tr > td[selected] {
-        background-color: rgb(103, 199, 165);  /* turquoise */
-      }
-      table > tbody[row-highlight-style="dark"] >
-          tr:not(.empty-row):not([selected]):hover,
-      table > tbody[cell-highlight-style="dark"] >
-          tr:not(.empty-row):not([selected]) > td:hover {
-        background-color: #e6e6e6;  /* grey */
-      }
-      table > tbody[row-highlight-style="dark"] > tr:hover[selected],
-      table > tbody[cell-highlight-style="dark"] > tr[selected] > td:hover {
-        background-color: rgb(171, 217, 202);  /* semi-light turquoise */
-      }
-
-      table > colgroup > col[selected] {
-        background-color: #e6e6e6;  /* grey */
-      }
-
-      table > tbody > tr.empty-row > td {
-        color: #666;
-        font-style: italic;
-        text-align: center;
-      }
-
-      table > tbody.has-footer > tr:last-child > td {
-        border-bottom: 1px solid #aaa;
-      }
-
-      table > tfoot > tr:first-child > td {
-        border-top: 1px solid #ffffff;
-      }
-
-      :host([zebra]) table tbody tr:nth-child(even) {
-        background-color: #f4f4f4;
-      }
-
-      expand-button {
-        -webkit-user-select: none;
-        cursor: pointer;
-        margin-right: 3px;
-        font-size: smaller;
-        height: 1rem;
-      }
-
-      expand-button.button-expanded {
-        transform: rotate(90deg);
-      }
-    </style>
-    <table>
-      <colgroup id="cols">
-      </colgroup>
-      <thead id="head">
-      </thead>
-      <tbody id="body">
-      </tbody>
-      <tfoot id="foot">
-      </tfoot>
-    </table>
-  </template>
-</dom-module><dom-module id="tr-ui-b-table-header-cell">
-  <template>
-  <style>
-    :host {
-      -webkit-user-select: none;
-      display: flex;
-    }
-
-    span {
-      flex: 0 1 auto;
-    }
-
-    #side {
-      -webkit-user-select: none;
-      flex: 0 0 auto;
-      padding-left: 2px;
-      padding-right: 2px;
-      vertical-align: top;
-      font-size: 15px;
-      font-family: sans-serif;
-      line-height: 85%;
-      margin-left: 5px;
-    }
-
-    #side.disabled {
-      color: rgb(140, 140, 140);
-    }
-
-    #title:empty, #side:empty {
-      display: none;
-    }
-  </style>
-
-    <span id="title"></span>
-    <span id="side"></span>
-  </template>
-</dom-module><dom-module id="tr-v-ui-scalar-context-controller">
-  <template></template>
-</dom-module><dom-module id="tr-v-ui-scalar-span">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: row;
-      justify-content: flex-end;
-      position: relative;
-      /* Limit the sparkline's negative z-index to the span only. */
-      isolation: isolate;
-    }
-
-    :host(.left-align) {
-      justify-content: flex-start;
-    }
-
-    :host(.inline) {
-      display: inline-flex;
-    }
-
-    #sparkline {
-      width: 0%;
-      position: absolute;
-      bottom: 0;
-      display: none;
-      height: 100%;
-      background-color: hsla(216, 100%, 94.5%, .75);
-      border-color: hsl(216, 100%, 89%);
-      box-sizing: border-box;
-      z-index: -1;
-    }
-    #sparkline.positive {
-      border-right-style: solid;
-      /* The border width must be kept in sync with buildSparklineStyle_(). */
-      border-right-width: 1px;
-    }
-    #sparkline:not(.positive) {
-      border-left-style: solid;
-      /* The border width must be kept in sync with buildSparklineStyle_(). */
-      border-left-width: 1px;
-    }
-    #sparkline.better {
-      background-color: hsla(115, 100%, 93%, .75);
-      border-color: hsl(118, 60%, 80%);
-    }
-    #sparkline.worse {
-      background-color: hsla(0, 100%, 88%, .75);
-      border-color: hsl(0, 100%, 80%);
-    }
-
-    #content {
-      white-space: nowrap;
-    }
-    #content, #significance, #warning {
-      flex-grow: 0;
-    }
-    #content.better {
-      color: green;
-    }
-    #content.worse {
-      color: red;
-    }
-
-    #significance svg {
-      margin-left: 4px;
-      display: none;
-      height: 1em;
-      vertical-align: text-top;
-      stroke-width: 4;
-      fill: rgba(0, 0, 0, 0);
-    }
-    #significance #insignificant {
-      stroke: black;
-    }
-    #significance #significantly_better {
-      stroke: green;
-    }
-    #significance #significantly_worse {
-      stroke: red;
-    }
-
-    #warning {
-      display: none;
-      margin-left: 4px;
-      height: 1em;
-      vertical-align: text-top;
-      stroke-width: 0;
-    }
-    #warning path {
-      fill: rgb(255, 185, 185);
-    }
-    #warning rect {
-      fill: red;
-    }
-    </style>
-
-    <span id="sparkline"></span>
-
-    <span id="content"></span>
-
-    <span id="significance">
-      
-      <svg id="insignificant" viewBox="0 0 128 128">
-        <circle cx="64" cy="64" r="60"></circle>
-        <circle cx="44" cy="44" r="4"></circle>
-        <circle cx="84" cy="44" r="4"></circle>
-        <line x1="36" x2="92" y1="80" y2="80"></line>
-      </svg>
-
-      
-      <svg id="significantly_better" viewBox="0 0 128 128">
-        <circle cx="64" cy="64" r="60"></circle>
-        <circle cx="44" cy="44" r="4"></circle>
-        <circle cx="84" cy="44" r="4"></circle>
-        <path d="M 28 64 Q 64 128 100 64"></path>
-      </svg>
-
-      
-      <svg id="significantly_worse" viewBox="0 0 128 128">
-        <circle cx="64" cy="64" r="60"></circle>
-        <circle cx="44" cy="44" r="4"></circle>
-        <circle cx="84" cy="44" r="4"></circle>
-        <path d="M 36 96 Q 64 48 92 96"></path>
-      </svg>
-    </span>
-
-    <svg id="warning" viewBox="0 0 128 128">
-      <path d="M 64 0 L 128 128 L 0 128 L 64 0"></path>
-      <rect height="84" width="8" x="60" y="0"></rect>
-      <rect height="24" width="8" x="60" y="100"></rect>
-    </svg>
-  </template>
-</dom-module><dom-module id="tr-ui-a-generic-object-view">
-  <template>
-    <style>
-    :host {
-      display: block;
-      font-family: monospace;
-    }
-    </style>
-    <div id="content">
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-generic-object-view-with-label">
-  <template>
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-  </template>
-</dom-module><dom-module id="tr-ui-b-drag-handle">
-  <template>
-    <style>
-    :host {
-      -webkit-user-select: none;
-      box-sizing: border-box;
-      display: block;
-    }
-
-    :host(.horizontal-drag-handle) {
-      background-image: -webkit-gradient(linear,
-                                         0 0, 0 100%,
-                                         from(#E5E5E5),
-                                         to(#D1D1D1));
-      border-bottom: 1px solid #8e8e8e;
-      border-top: 1px solid white;
-      cursor: ns-resize;
-      flex: 0 0 auto;
-      height: 7px;
-      position: relative;
-    }
-
-    :host(.vertical-drag-handle) {
-      background-image: -webkit-gradient(linear,
-                                         0 0, 100% 0,
-                                         from(#E5E5E5),
-                                         to(#D1D1D1));
-      border-left: 1px solid white;
-      border-right: 1px solid #8e8e8e;
-      cursor: ew-resize;
-      flex: 0 0 auto;
-      position: relative;
-      width: 7px;
-    }
-    </style>
-    <div></div>
-  </template>
-</dom-module><dom-module id="tv-ui-b-hotkey-controller">
-  <template>
-    <div></div>
-  </template>
-</dom-module><dom-module id="tr-ui-b-info-bar">
-  <template>
-    <style>
-    :host {
-      align-items: center;
-      flex: 0 0 auto;
-      background-color: rgb(252, 235, 162);
-      border-bottom: 1px solid #A3A3A3;
-      border-left: 1px solid white;
-      border-right: 1px solid #A3A3A3;
-      border-top: 1px solid white;
-      display: flex;
-      min-height: 26px;
-      padding: 0 3px 0 3px;
-    }
-
-    :host([hidden]) {
-      display: none !important;
-    }
-
-    #message { flex: 1 1 auto; }
-    </style>
-
-    <span id="message"></span>
-    <span id="buttons"></span>
-  </template>
-</dom-module><dom-module id="tr-ui-b-mouse-mode-icon">
-  <template>
-    <style>
-    :host {
-      display: block;
-      background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAChCAYAAACbBNzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAA9aSURBVHic7V1rTFvl//+UrgUmZWMpbLa6cLErwpYxkqLGkjAG88WSbmumGUllvlmAJctMRtybvlHrLXiJUekMIZuYSCL5gS+EuLIXGEGjqCsllCEW6xQECgzWG7S05/+C/zkp9LTn0gsL6ych9JzznOdzPj19Luf5PN/nCN59913ixRdfRFdXFxLx/2GDgCAIYmpqCoWFhUjE/4cNae+99x4AIFH/Hzak7nDqDu+wOyyw2WzEdl9EMpG23ReQbKQE73Q8coJ3bfcFWK1W/Pbbb/D7/UhLi/37DwaDEIvFKC8vR0lJSdjxbRVstVoxPDyMxx9/HAUFBcjMzIRAIOCdXzAYhNvtht1ux/DwMACEid5WwSMjI3jyySdRXFwMsVgMoVAYk2CCIJCZmYns7GyMjo5iZGQkPoKXl5exd+9e3hdGIhgMIj8/H5mZmRCJRIyCyQ5NJBAEgUAgAKFQiIKCAiwsLISl4VxoHA4H+vv74Xa7uZ4aBqFQiOzsbIhEIojFYojFYohEItq/8fFxXLlyBUtLSxHThOaxZ88eCIXC2AWPj48DAH799deYBaelpUEoFLL6++qrrwAAH3zwAav0YrGYthLkJHh6ehpzc3MAgPn5eUxPT8csWiAQMJbboaEhmM1mAIDFYsHQ0BDvPDkJtlgsYdt+v59LFrxw/fr1sG2Xy8UrL06C6+vrw7bFYjEvYi747rvvwrYlEgmvvDjV0g6HI+p2ohBP3qh32OFwoLe3l1VGvb29sNvtvC8kFCMjI9DpdKzS6nQ6mEwm1nnTPg/7/X6MjY1hcnKS/VX+P/bu3YuysjLk5uYypv36669x8uRJZGRkQCQSwev1oqOjAz09PZx5CwsLcenSJRw+fBh+vx+rq6swmUx46aWXNqWjvcMDAwO8xAIbnZKBgQFeNXhzczMvscBGp6S5uRk//vhj1HS0grVaLYqLi3kRy+Vy1NXVRe0RRcKNGzeg0Wh48apUKnR1daG6ujpqOtpKy+VyQa1Wo6SkBLdv38aFCxeoY5988gn1+fLly9TnL774ApWVlXjiiSfgdDqxtrbG+aJ9Ph/0ej3OnDkDvV6PW7duUceOHDlCfR4dHaU+v/DCC7h27RrUajWcTidWV1ejctAKJggCKysryMzMhE6nw+zsLO3Joft1Oh0ePHiApaUlduqi8BYVFaGvr48Vb19fHyfeqM2Sz+dj3QTEs4lKJC+njsfWJoptkxUrtjZRbJssOnASXFtbG3U7UXjrrbeibnMBJ8FZWVkoKysDABQUFCArK4s3MRcoFArqrlZXV0OhUPDOi5Ngn8+Hw4cPQyqV4tlnn4XP5+NNTIIgmH0An8+HV155BUqlEq+++ior3kAgQLuf84jH2toajh8/jvX1da6n0sLj8SAjI4MxHUEQ+PTTT1nlSRAEHjx4QHtsW8e0RCIR7HY79uzZE/GOcEUgEEAgEMDff/8NkUgUdnxbBR85cgRmsxkCgQD5+fkRh2XYIhAI4P79+5iamoLD4cCxY8fC0myr4KeeegoCgQBWqxVzc3NIS0uLedQyGAxi165dKC8vR1FRUVialHu405ESvNPxyAlOuYfJRMo9fFjdw3iBq3vIBDbu4bYK3uoextKtJEH2yWNyD8nyEG8wuYcffvgha3cxru6h3W5Hf39/QoyzaE6fyWRCQ0MDZ+MsLu7h8vIyent7sby8zIk8VkxNTUGn08Fms8UlP04Nn9/vR39/f9w8JLZwu91obGzk5CFFAq+Wfnh4mDKok4mWlha0trbGlAfvrs3k5CQGBgaSYoiHoqenB1evXk2OIb4VDocDJpMp6eXaYrGgsbGRV7mOufPq8XgwMDCQ9HI9NzeHq1evci7XvDseUqkUWq0W6enpCAaDcDqd8Hq9fLNjDaVSiRs3bkAikfDi5XSHxWIxampqAAALCwsYGhrC7Ows5ufnEypWIpHAYDAAACYmJnD9+nXevJwEnzp1CjKZDBUVFQCAsbGxpJTfjz76CFVVVWhqagIAdHR08G6XWQuuqanB7t274fV6UVpaiuzsbAAbTzyJhMFggEKhgNfrRX19PWQyGQDAaDTyyo+V4JqaGshkMsricLlcOH78OICNCWp8p0cwwWAwoKqqahPvG2+8AWDji+7u7uacJyvBMpksrKxkZWVR0yLGxsY4E7NBVVVVGK9CoaCmRXR0dHDOk5VguorB5/OhoqICYrE4YZ2PSLxXrlyBRCLhNcE1pufh1dVVXLx4EWlpaRGnJzCBjXtId87g4GBU3ri5h1uJ5+fnY8mCtXvIhTflHoYg5R4mEyn3MAl45KyWlOCdjkdOcMo9TCZS7mHKPeSGhLmH5LBOrAGXXN1DcliHrgdFgsk95CzYbrfDbDbD7/ejrKwstpmtNO5hJJhMJrS2tsLtdqOpqQlarTZi2mjuIWvBfr8fZrN50/iz2WzG9PQ0nn/+edonEzZgij10uVwwGo2bxp+NRiOGhobw+uuv005hjtk9JENz6AbbyWCuRESp2Ww2NDc30w62WywW6HQ6zoOIrO5wbm4uzp8/j5WVFXR2dm46VldXh3379mF5eTku86dDUVxcjK6uLthstrClqrq6unDo0CHOvKwE+/1+LC4uUqG0oZiYmIhaicQCkvfu3bthxwYGBnhVmpy6NnSD7kxxQvEA3Zo+fIsQJ8F040j379/nRcwFdF4037FwToLphkUXFxd5EXMB3chkUgQ7nc6wfT6fL+Gm+H///Re2z+Vy8TLFGSut/v5+RsPsm2++AbDR84pXLFNDQwPjelxnz54FsBFK+/nnn7PKl/EOa7VaVmHvYrE4au+HK27evMkq7F0ikeDmzZus82UU7HK5qG8yGs6ePct73gUdfD4f2tvbGdO1t7dzaocZBRMEAaFQSBnhdKipqYFQKORlm0TjzcvLo4xwOhgMBuTl5XHiZVVp+f1+yGQy2iDq4uJiyGSyhFRcfr8fVVVVtEHUGo0GVVVVnHlZ19JerxdqtRpSqZTaJ5VKoVarEzrdwev1Qq/XQ6lUUvuUSiX0ej0vXk7N0srKCjQaDbXmjUajwcrKCmfSULD5Oa6srKCtrQ0SiQQSiQRtbW2MvHFzD0MrsXhUUmzdw9BKjKmSiqt7SBBE3Conru4hOa8kWqBnyj3cgl0EQcQ0cMYWW3kIgkiKe7iVV2C1Won09PSYxLCB1+tFZmYmtb22tobt4E1LBimATaQAkiKWjveR85ZSgnc6Uu5hMpFyD1PuITekYg/ZxB52dXXFTMo2n1D38NSpU7zjDEP/yHzisnJpIsBm5dJ45rntgpONuITTJirctqWlJabjdGAUvNUEp0NouxcvtLa2MgZhmUwmzqKjCrbb7aw9HC5pmWAymVivb2kymTgFe0RslrbeNTa1rtlshkgkQn5+PusL2Iqtd42NdWM0GpGVlYWTJ08ypo14h/nGI8Uax8Q3XJbteREFV1ZW8iLmex6Ja9euJfS8iD9puVyOmpoa3L59G8DmVUq3glzNlAzoimVgvrq6GmlpadDr9QA2r1K6FeRqpmRAFxveiIK9Xi8VZ/jLL78whulUVFTELJbkJeMMjUYjI29TUxNrsQBDX5qMM4w0qE2iuLgYpaWlcXMPyThDphWMNRoN6uvrOfGyskvVanXUNGq1Oq5WKclL/qwjQa/Xc+Zl1dNi8nFi9ZeSyZvqS0erjbmAbT6kT7X1lQp8QeYTyasKE8w3aJJvPh6PBwRBYGZmJi68MzMzqdjDUDx67mEsFxwrUrGHSUCqWdrpSAne6dix7uFzzz1HW0s/FO7h/v37UVBQgMceeyxm99DlcsFut2NwcBACgSDsnTHb7h4ePHgQxcXFcTPTMjIyIJFIcOfOHfz+++8Pl2DSPSTftxQv93DXrl0oKirCnTt3wtIwFhq62aputxtms5maCR8pHROEQiEkEgntew/X1tbC3mu4tLSE9vZ2nD9/njZd6Pn79u3jHoo3OTmJsbExnDlzBsDGWLXdbqcNoent7YVCocChQ4dYh+VFij3s7u5GR0cH9YWaTCbcunVr0yMkmfbChQvQarXQarVUWF4wGER6ejp7wdPT0zCbzfB4PJv2R7NT/H4/rFYrJicnUVZWxnowPtTpGxoagtFoDAsIi2anuN1ufPnll+ju7salS5dw4sQJKk+64hH2FTgcDgwPD4eJZQu/3w+bzcZ5JSSLxYL333+fNvqNDdxuN3p6ehjPDxMsl8tjjkw5ceIENfOVLVQqFd58882YeA0GA7WiWiSECfb5fPjpp58AbKyBx/bCpVIp6urqAADff/895wf6tbU1fPbZZwCAjz/+mPHCSSiVSsr3eueddxh5aWtpMrwuJyeH9cuczp07R5UZvktO/fnnnwCAY8eOoa+vj9U5nZ2d1CsH2fhaUZulwcFB1kGNi4uLjK/gYwuDwcCJ9+2332add9RmyW63w+12Q6FQIC8vD5cvX8bCwgI19VcqlcJms8HhcGBycjJuSz6aTCbMzs5Cq9Xi6NGjGB0dxcTEBJxOJyQSCZRKJUZGRjAyMoL//e9/jBFsoaAVLJfLKZvD4XBQ37ZEItlUph0OB238gVwu5ySQhEqlopo+i8VCtbsymWxTmb579y6t46BSqRg5aAXX1tbi22+/DZvY5XQ6aQMuQyGVSlFbW8trgb6WlhY0NDRgYmJi0/6ZmRnGYVylUomWlhbGeGbaMuzxeKDRaKhVDdkgOzsblZWVOHfuHO82fH19HW1tbWhqamL9ul2ZTIbXXnsNnZ2drN7yFfFFjy6XC6WlpVCpVFhaWsK///5LVfnz8/PIy8sDAOzevRu5ubnIycmBx+OJKZ6YIAj4fD7U19ejsbERf/zxB4aHhykrdHx8HE8//TQAYP/+/VAqlVAoFJx4I1ZapGiyrBw4cAD37t2DXC7HgQMHAGx0QXNycrC+vh63VR5Cecnw3J6eHqhUKpSXlwPY6OI+88wzALiHxnN6PPz555/D9h08eJATIR/Qzd9gE/FKh9SYFlvI5XKqPMUCrlFuKpUKp0+fZkwXDAZp93MSLBaLUVJSgqNHjyIjIwNerzfmOR0ul4sx9lAikeD06dN4+eWXIZVKGXnj5h5evHgRXq8XHo+Hd9MTCpFIhHv37iEnJydqp/+HH36A1+uFy+VirKTi6h7Gug7tVpDuIUEQKCwsjOge/vPPP6zyCwQCWF5exl9//YX5+Xla93DbzTSbzQar1Yr19fW4uoclJSUp9xB4BJullOCdjkdO8P8BGCQ0hnF1DxUAAAAASUVORK5CYII=);
-      width: 27px;
-      height: 30px;
-    }
-    :host.active {
-      cursor: auto;
-    }
-    </style>
-  </template>
-</dom-module><dom-module id="tr-ui-b-mouse-mode-selector">
-  <template>
-    <style>
-    :host {
-
-      -webkit-user-drag: element;
-      -webkit-user-select: none;
-
-      background: #DDD;
-      border: 1px solid #BBB;
-      border-radius: 4px;
-      box-shadow: 0 1px 2px rgba(0,0,0,0.2);
-      left: calc(100% - 120px);
-      position: absolute;
-      top: 100px;
-      user-select: none;
-      width: 29px;
-      z-index: 20;
-    }
-
-    .drag-handle {
-      background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAChCAYAAACbBNzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAA9aSURBVHic7V1rTFvl//+UrgUmZWMpbLa6cLErwpYxkqLGkjAG88WSbmumGUllvlmAJctMRtybvlHrLXiJUekMIZuYSCL5gS+EuLIXGEGjqCsllCEW6xQECgzWG7S05/+C/zkp9LTn0gsL6ych9JzznOdzPj19Luf5PN/nCN59913ixRdfRFdXFxLx/2GDgCAIYmpqCoWFhUjE/4cNae+99x4AIFH/Hzak7nDqDu+wOyyw2WzEdl9EMpG23ReQbKQE73Q8coJ3bfcFWK1W/Pbbb/D7/UhLi/37DwaDEIvFKC8vR0lJSdjxbRVstVoxPDyMxx9/HAUFBcjMzIRAIOCdXzAYhNvtht1ux/DwMACEid5WwSMjI3jyySdRXFwMsVgMoVAYk2CCIJCZmYns7GyMjo5iZGQkPoKXl5exd+9e3hdGIhgMIj8/H5mZmRCJRIyCyQ5NJBAEgUAgAKFQiIKCAiwsLISl4VxoHA4H+vv74Xa7uZ4aBqFQiOzsbIhEIojFYojFYohEItq/8fFxXLlyBUtLSxHThOaxZ88eCIXC2AWPj48DAH799deYBaelpUEoFLL6++qrrwAAH3zwAav0YrGYthLkJHh6ehpzc3MAgPn5eUxPT8csWiAQMJbboaEhmM1mAIDFYsHQ0BDvPDkJtlgsYdt+v59LFrxw/fr1sG2Xy8UrL06C6+vrw7bFYjEvYi747rvvwrYlEgmvvDjV0g6HI+p2ohBP3qh32OFwoLe3l1VGvb29sNvtvC8kFCMjI9DpdKzS6nQ6mEwm1nnTPg/7/X6MjY1hcnKS/VX+P/bu3YuysjLk5uYypv36669x8uRJZGRkQCQSwev1oqOjAz09PZx5CwsLcenSJRw+fBh+vx+rq6swmUx46aWXNqWjvcMDAwO8xAIbnZKBgQFeNXhzczMvscBGp6S5uRk//vhj1HS0grVaLYqLi3kRy+Vy1NXVRe0RRcKNGzeg0Wh48apUKnR1daG6ujpqOtpKy+VyQa1Wo6SkBLdv38aFCxeoY5988gn1+fLly9TnL774ApWVlXjiiSfgdDqxtrbG+aJ9Ph/0ej3OnDkDvV6PW7duUceOHDlCfR4dHaU+v/DCC7h27RrUajWcTidWV1ejctAKJggCKysryMzMhE6nw+zsLO3Joft1Oh0ePHiApaUlduqi8BYVFaGvr48Vb19fHyfeqM2Sz+dj3QTEs4lKJC+njsfWJoptkxUrtjZRbJssOnASXFtbG3U7UXjrrbeibnMBJ8FZWVkoKysDABQUFCArK4s3MRcoFArqrlZXV0OhUPDOi5Ngn8+Hw4cPQyqV4tlnn4XP5+NNTIIgmH0An8+HV155BUqlEq+++ior3kAgQLuf84jH2toajh8/jvX1da6n0sLj8SAjI4MxHUEQ+PTTT1nlSRAEHjx4QHtsW8e0RCIR7HY79uzZE/GOcEUgEEAgEMDff/8NkUgUdnxbBR85cgRmsxkCgQD5+fkRh2XYIhAI4P79+5iamoLD4cCxY8fC0myr4KeeegoCgQBWqxVzc3NIS0uLedQyGAxi165dKC8vR1FRUVialHu405ESvNPxyAlOuYfJRMo9fFjdw3iBq3vIBDbu4bYK3uoextKtJEH2yWNyD8nyEG8wuYcffvgha3cxru6h3W5Hf39/QoyzaE6fyWRCQ0MDZ+MsLu7h8vIyent7sby8zIk8VkxNTUGn08Fms8UlP04Nn9/vR39/f9w8JLZwu91obGzk5CFFAq+Wfnh4mDKok4mWlha0trbGlAfvrs3k5CQGBgaSYoiHoqenB1evXk2OIb4VDocDJpMp6eXaYrGgsbGRV7mOufPq8XgwMDCQ9HI9NzeHq1evci7XvDseUqkUWq0W6enpCAaDcDqd8Hq9fLNjDaVSiRs3bkAikfDi5XSHxWIxampqAAALCwsYGhrC7Ows5ufnEypWIpHAYDAAACYmJnD9+nXevJwEnzp1CjKZDBUVFQCAsbGxpJTfjz76CFVVVWhqagIAdHR08G6XWQuuqanB7t274fV6UVpaiuzsbAAbTzyJhMFggEKhgNfrRX19PWQyGQDAaDTyyo+V4JqaGshkMsricLlcOH78OICNCWp8p0cwwWAwoKqqahPvG2+8AWDji+7u7uacJyvBMpksrKxkZWVR0yLGxsY4E7NBVVVVGK9CoaCmRXR0dHDOk5VguorB5/OhoqICYrE4YZ2PSLxXrlyBRCLhNcE1pufh1dVVXLx4EWlpaRGnJzCBjXtId87g4GBU3ri5h1uJ5+fnY8mCtXvIhTflHoYg5R4mEyn3MAl45KyWlOCdjkdOcMo9TCZS7mHKPeSGhLmH5LBOrAGXXN1DcliHrgdFgsk95CzYbrfDbDbD7/ejrKwstpmtNO5hJJhMJrS2tsLtdqOpqQlarTZi2mjuIWvBfr8fZrN50/iz2WzG9PQ0nn/+edonEzZgij10uVwwGo2bxp+NRiOGhobw+uuv005hjtk9JENz6AbbyWCuRESp2Ww2NDc30w62WywW6HQ6zoOIrO5wbm4uzp8/j5WVFXR2dm46VldXh3379mF5eTku86dDUVxcjK6uLthstrClqrq6unDo0CHOvKwE+/1+LC4uUqG0oZiYmIhaicQCkvfu3bthxwYGBnhVmpy6NnSD7kxxQvEA3Zo+fIsQJ8F040j379/nRcwFdF4037FwToLphkUXFxd5EXMB3chkUgQ7nc6wfT6fL+Gm+H///Re2z+Vy8TLFGSut/v5+RsPsm2++AbDR84pXLFNDQwPjelxnz54FsBFK+/nnn7PKl/EOa7VaVmHvYrE4au+HK27evMkq7F0ikeDmzZus82UU7HK5qG8yGs6ePct73gUdfD4f2tvbGdO1t7dzaocZBRMEAaFQSBnhdKipqYFQKORlm0TjzcvLo4xwOhgMBuTl5XHiZVVp+f1+yGQy2iDq4uJiyGSyhFRcfr8fVVVVtEHUGo0GVVVVnHlZ19JerxdqtRpSqZTaJ5VKoVarEzrdwev1Qq/XQ6lUUvuUSiX0ej0vXk7N0srKCjQaDbXmjUajwcrKCmfSULD5Oa6srKCtrQ0SiQQSiQRtbW2MvHFzD0MrsXhUUmzdw9BKjKmSiqt7SBBE3Conru4hOa8kWqBnyj3cgl0EQcQ0cMYWW3kIgkiKe7iVV2C1Won09PSYxLCB1+tFZmYmtb22tobt4E1LBimATaQAkiKWjveR85ZSgnc6Uu5hMpFyD1PuITekYg/ZxB52dXXFTMo2n1D38NSpU7zjDEP/yHzisnJpIsBm5dJ45rntgpONuITTJirctqWlJabjdGAUvNUEp0NouxcvtLa2MgZhmUwmzqKjCrbb7aw9HC5pmWAymVivb2kymTgFe0RslrbeNTa1rtlshkgkQn5+PusL2Iqtd42NdWM0GpGVlYWTJ08ypo14h/nGI8Uax8Q3XJbteREFV1ZW8iLmex6Ja9euJfS8iD9puVyOmpoa3L59G8DmVUq3glzNlAzoimVgvrq6GmlpadDr9QA2r1K6FeRqpmRAFxveiIK9Xi8VZ/jLL78whulUVFTELJbkJeMMjUYjI29TUxNrsQBDX5qMM4w0qE2iuLgYpaWlcXMPyThDphWMNRoN6uvrOfGyskvVanXUNGq1Oq5WKclL/qwjQa/Xc+Zl1dNi8nFi9ZeSyZvqS0erjbmAbT6kT7X1lQp8QeYTyasKE8w3aJJvPh6PBwRBYGZmJi68MzMzqdjDUDx67mEsFxwrUrGHSUCqWdrpSAne6dix7uFzzz1HW0s/FO7h/v37UVBQgMceeyxm99DlcsFut2NwcBACgSDsnTHb7h4ePHgQxcXFcTPTMjIyIJFIcOfOHfz+++8Pl2DSPSTftxQv93DXrl0oKirCnTt3wtIwFhq62aputxtms5maCR8pHROEQiEkEgntew/X1tbC3mu4tLSE9vZ2nD9/njZd6Pn79u3jHoo3OTmJsbExnDlzBsDGWLXdbqcNoent7YVCocChQ4dYh+VFij3s7u5GR0cH9YWaTCbcunVr0yMkmfbChQvQarXQarVUWF4wGER6ejp7wdPT0zCbzfB4PJv2R7NT/H4/rFYrJicnUVZWxnowPtTpGxoagtFoDAsIi2anuN1ufPnll+ju7salS5dw4sQJKk+64hH2FTgcDgwPD4eJZQu/3w+bzcZ5JSSLxYL333+fNvqNDdxuN3p6ehjPDxMsl8tjjkw5ceIENfOVLVQqFd58882YeA0GA7WiWiSECfb5fPjpp58AbKyBx/bCpVIp6urqAADff/895wf6tbU1fPbZZwCAjz/+mPHCSSiVSsr3eueddxh5aWtpMrwuJyeH9cuczp07R5UZvktO/fnnnwCAY8eOoa+vj9U5nZ2d1CsH2fhaUZulwcFB1kGNi4uLjK/gYwuDwcCJ9+2332add9RmyW63w+12Q6FQIC8vD5cvX8bCwgI19VcqlcJms8HhcGBycjJuSz6aTCbMzs5Cq9Xi6NGjGB0dxcTEBJxOJyQSCZRKJUZGRjAyMoL//e9/jBFsoaAVLJfLKZvD4XBQ37ZEItlUph0OB238gVwu5ySQhEqlopo+i8VCtbsymWxTmb579y6t46BSqRg5aAXX1tbi22+/DZvY5XQ6aQMuQyGVSlFbW8trgb6WlhY0NDRgYmJi0/6ZmRnGYVylUomWlhbGeGbaMuzxeKDRaKhVDdkgOzsblZWVOHfuHO82fH19HW1tbWhqamL9ul2ZTIbXXnsNnZ2drN7yFfFFjy6XC6WlpVCpVFhaWsK///5LVfnz8/PIy8sDAOzevRu5ubnIycmBx+OJKZ6YIAj4fD7U19ejsbERf/zxB4aHhykrdHx8HE8//TQAYP/+/VAqlVAoFJx4I1ZapGiyrBw4cAD37t2DXC7HgQMHAGx0QXNycrC+vh63VR5Cecnw3J6eHqhUKpSXlwPY6OI+88wzALiHxnN6PPz555/D9h08eJATIR/Qzd9gE/FKh9SYFlvI5XKqPMUCrlFuKpUKp0+fZkwXDAZp93MSLBaLUVJSgqNHjyIjIwNerzfmOR0ul4sx9lAikeD06dN4+eWXIZVKGXnj5h5evHgRXq8XHo+Hd9MTCpFIhHv37iEnJydqp/+HH36A1+uFy+VirKTi6h7Gug7tVpDuIUEQKCwsjOge/vPPP6zyCwQCWF5exl9//YX5+Xla93DbzTSbzQar1Yr19fW4uoclJSUp9xB4BJullOCdjkdO8P8BGCQ0hnF1DxUAAAAASUVORK5CYII=) 2px 3px no-repeat;
-      background-repeat: no-repeat;
-      border-bottom: 1px solid #BCBCBC;
-      cursor: move;
-      display: block;
-      height: 13px;
-      width: 27px;
-    }
-
-    .tool-button {
-      background-position: center center;
-      background-repeat: no-repeat;
-      border-bottom: 1px solid #BCBCBC;
-      border-top: 1px solid #F1F1F1;
-      cursor: pointer;
-    }
-
-    .buttons > .tool-button:last-child {
-      border-bottom: none;
-    }
-
-    </style>
-    <div class="drag-handle"></div>
-    <div class="buttons">
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-e-chrome-cc-display-item-list-item">
-  <template>
-    <style>
-      :host {
-        border-bottom: 1px solid #555;
-        display: block;
-        font-size: 12px;
-        padding: 3px 5px;
-      }
-
-      :host(:hover) {
-        background-color: #f0f0f0;
-        cursor: pointer;
-      }
-
-      .header {
-        font-weight: bold;
-        margin: 2px 0;
-      }
-
-      .header > .extra {
-        background-color: #777;
-        border-radius: 4px;
-        color: white;
-        margin: 0 6px;
-        text-decoration: none;
-        padding: 2px 4px;
-      }
-
-      .raw-details {
-        white-space: pre-wrap;
-      }
-
-      .details > dl {
-        margin: 0;
-      }
-
-      :host(:not([selected])) .details {
-        display: none;
-      }
-    </style>
-    <div class="header">
-      {{name}}
-      <template if="{{_computeIfSKP(richDetails)}}" is="dom-if">
-        <a class="extra" download="drawing.skp" href$="{{_computeHref(richDetails)}}" on-click="{{stopPropagation}}">SKP</a>
-      </template>
-    </div>
-    <div class="details">
-      <template if="{{rawDetails}}" is="dom-if">
-        <div class="raw-details">{{rawDetails}}</div>
-      </template>
-      <template if="{{richDetails}}" is="dom-if">
-        <dl>
-          <template if="{{richDetails.visualRect}}" is="dom-if">
-            <dt>Visual rect</dt>
-            <dd>{{richDetails.visualRect.x}},{{richDetails.visualRect.y}}
-                {{richDetails.visualRect.width}}×{{richDetails.visualRect.height}}
-            </dd>
-          </template>
-        </dl>
-      </template>
-    </div>
-  </template>
-
-</dom-module><template id="tr-ui-e-chrome-cc-display-item-debugger-template">
-  <left-panel>
-    <display-item-info>
-      <header>
-        <span class="title">Display Item List</span>
-        <span class="size"></span>
-        <div class="export">
-          <input class="dlfilename" type="text" value="displayitemlist.json"/>
-          <button class="dlexport">Export display item list</button>
-        </div>
-        <div class="export">
-          <input class="skpfilename" type="text" value="skpicture.skp"/>
-          <button class="skpexport">Export list as SkPicture</button>
-        </div>
-      </header>
-    </display-item-info>
-  </left-panel>
-  <right-panel>
-    <raster-area>
-      <canvas-scroller>
-        <canvas></canvas>
-      </canvas-scroller>
-    </raster-area>
-  </right-panel>
-</template><template id="quad-stack-view-template">
-  <style>
-  #chrome-left {
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABICAYAAABC4+HLAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH3QcNFyMmV/Pm9QAAIABJREFUeNrtvXmwXdd13vlbe9/7BgzEQAIcQAIEQYKjSAokLVlOW5Fk2nLKmqx0J2Wp0k652h13uiy5XYqdwU7sSnckpZ1yV3U75apU4kos27Elu9NlyRXZjiiRomSTIiWZs0hwHsABJIY33rPX6j/W2ueed3DvAyDKKoGFW0UCeO/ec/fZZ+29v7XWt74lAIuLi7tXV1f/raq+zcy2AogIZsbpvrqfMzNE5IS/1/fVn5sZKaUTrtX9/v7nT+fn9e/1e052X/3r1THWa3R/37+miKCq7c+mjW/a+F/P57vj6/45bayn+wzXs4n+794Q9nP8+PHdS0tL31LVmfpGVQU4YSInGUb/YfZvpn+zp/LQu4Y27X31d933nurkq+qaa08yotO55npG0v2O+r1/XZ9fb2FMWoD9Oe5+pju//e+fdP3u83+j2I+89NJLn11dXf1bdSCTJnnSSpz2+/VWZ/8m+w+g/zD616yT2P9733BOZ5f4dhbCevPQHet63zVtV3y9n1/v/k9nZ562SNY7Gd5o9iPPP//8qxVKrQdL+hOy3qqdNEnTjv1JA+vuRpMGvd7kn8oCqded9B2THuJ6u/Kk7+vuiNOgQH8OX+/np813/376O/CkU2EavDwVWPiGsp9nn33WJt3ItF2ne2xOe2jTHuTJMOS0He1UcG33791JmWQYkzB6dyfp7tynsktPG8/Jdv2TGcLpfH7Sc5m0EKZBsPV+tp4PMe39bwj7efrpp229G5u2O3WPplN1cE/XQZsENybtnNN2pv4x3N1Fpu2S/SO6j6fXgz6n4gRPGmMfR7/ez/cXd/1798Tsfr4PMU52Oq4Hp95I9jPor7ZJ+G7STlEnvN7gesfXpB2tH5lZzynrO07Txtb92aQTY9rv+3i1v4jqv5umOSEq0r9O3/iqEUx6MPXnqjpxrk73812oMQmP968zyUj68zPp+U1bxG80+5GnnnrKpkVxTiWUuN4q7+96/YFXp6pvANN8hD7MmRbF6O7200KR9ed9CDbpSF4v6jIJtnQjQdPGOylK9p34/HowaFL0Z73IUNex7Z5Gk3bkN6L9yBNPPGHdY3fayu3uSP0dqH62uyP0w4XrDWo957gPEfqf78e4p4U8+0Y86R6711pvAUyL3vTvd9ou238Q/Xn4dj4/Cd6d7BlMC532534S9OnO8xvVfuTxxx+39RJlk/DtpAGc6k6hquScp+7EkyIn0+LV60Ufpu2q05zN/sOYFIfvP8CT5VEmGWN/h5w0zm/38+sl7/r3drLntt58rzdXbyT7kccee8z6O2b3JnLO6zpjk47nkyVg1pu07muas9b3CaZh4f5uPMn4Sikn7Jj9RTEJMnQfVHdck4x3Wt5i0qL6dj8/6WQ5GcSYBiEn+STrhT/fqPYzmJYxrRcopax5eH18Oi38WI2ulLImYTPNMavv716z/93rRXUmOZXVgZ5kePX7+hPeN5xJTmx3MdXf9zHyM888w8LCwgn30IUQ0xzWSYvhVD4/LarTzpWBpOl+zqRQ9lqjE2DCtbH2x9MW3XA45JxzzmHnzp0njYp9r9jPoH75Gkekc8SZ2ZpjrH/Ez8wMSSmHMY4YjZp2MDnniVGT/sPvRhxmZ2fJOWHmxj0ajU7AtvV6k4727gSklMg5M4jdq6iyuro69bv799fNptYF0X3vJKjz8MMPMz+/gWuvuYatW7eScgIEwTADEwEUAZDkBgtuYONlCCJgAuZ/N5QkCcP8avFzUH8fsZgNEoJJLAakc+2TjENi90RQjGSCJm1/hwlmgmRFFIwEYoiNxyPxvYZ07gVKUzh8+DD333cfRZXLLrvsBLxfjbl76pyO/ZRS1thq325O137k4YcftvUSOf1Ufdco/uwLX+LOv7ibZ194EYBdF+zkB956C+98+99ARE64ue6XqyqDwaDdGZqm4Qtf/DK3f+UveO7QS2uu944f/IH2WpNwdp2U/oT8+W23c8dX7+K5GN9FF+zkb7zlZt71jh9cswNPw8uTsPU0h19VeeSRR7j55lvYumUzK6MCpqTs9p2AAiRLmChWBBIIiqZEMkVUMAQTJZtQSCCKkDE0/h+7twkKpCSYxrhVMTGyCYogohRLCGvHoYD0xyGKScIUpC5AVSQl/0ACaxeCkJJhakDCTJEEiKAmDMx8XSdAY6lZQjHmZoa89NLL3Pv1r3PVVVeesDH3T+FTtZ/uguhu8v3o36naj4ggjzzyiPXhwtRjOf6+tLjEP//4r3HOuRfw5psPsOeSXQA8+dQz3Pu1ezl2+BC//I9+jvn5uXWjDfW1uLjIr37y19m8/fzJ13vlBf75L/48c3Oza3aWadSP5eUVfuUT/2bd6/3yL/xvbNgwv2Y3qbtOF0J2MfN6ka7nnnuOvZfuZcfO8xitKnloFBXEBHGLc4MTQwVEDeIkyAqa/Pdh9z5vaqgkUuz8akYGVATEHOYYiCSUQtJqkCDJsJJIvXFYNRIzLGWQQqqLEiOhqKS6gnzhqJ9cJplsiiXBSnfBJF957TEoJBKYYskwFUSgWCKnBkmZp59+mpdfepmdO3eu2USn+V/r2c/JWAX9CN/J7KdNiD744IO2nqM0Cff+01/9P7js6gP8d29/C5detJNtmzYC8OrxBZ547kVu/+JfcPDBe/iXv/xPkCnkvHalm/HPTvV6v/SP25vs3mB3fKurI37pX36cfdesf73HHriH//2X/3Fr/NOSTZMyzn0n0sx47LHH+JEf+REWFhd8pzcliRtyBVbFYlcTN0bfpoWEYiaxENTtjOQwByOZ7+r+b/zacY5YICvH/iDmBurjmzQOKMlIWkPThpohkuN0iwWI+YrNGkdeQswwcbhlWEAzw8wXazZDJfsYMP84ghXzxSHip5rB/IY5/sv/+0dc96Y3rdmA2uz0YDA1EHIqDNv1KDAVvk2yn64vOujHlqdlJ+vv/+wLX2JuywVcfOkeXj2ywGtHn0C1Hov+uUsu3cNzzz/Hf7vtdm5959snRknq6wtfvOOUr/fnX7yDH37n29fccBdG5Zy57fYvs2HrqV7vdm59x9vXJeqtx6WqD+T555/nyiv3s7y8TMLhSgLMElkURx+KENi+7uzi0EgtIUCi+OmSwIpjmYTSAIN6uiSDkkAKQgp/IgON+yaGnxIBz/rjcPckj30LU5I5rCsJsiYsafgjCbXEUIwiiqq4e1J9FjVfNCioYMlPC/eJIFuisTiN0oBkhllBcmJlaYnL9+/n0KFD7Nixg5xza6hPP/00S0tLzM7Mho/lfpGicW/hyyCQAv75Nuw+UOwi/o7WmXLfClhYOMaWLVvZtWtXG7TpRibrMx/0V1j34XcdT4DBYMA933yQnRdeymhUOHZsCZFEqrurORRZHRV2XrCLr33jft596zsZjUbtiuzGqQeDAXd//T52Xrj3lK53zzce4G/d+k6WlpfXOF5jSAhf+8YD7DjF8d3zjQf50VvfRdM0LYzqv/pHcH9napqGF154gb/59rdz7PhxTPCdNSliisYuK5rjIRsWPyeJQyGhWhyNCEn9sbrPIGRJmBRfeCb+kEXQwDZG49AFIYmh4kvmhHGYISTEGl9YBimPoZypvx8VJA3R5IurMcdrSTrjLuGjGJCNpJnGlCwWp6CRMLIoMCBhFJPYIAxNxjVXX83v//7vs337dnLONE1DzpmXX36Zt73tB1g8fhwzh3OIObyrp60IWp9XNlBfRtkCPqWIM9T5x+GhDIQN8/O88srLfPWrX+WWW245IeLVPvvubt49biZRMTDj6MISGzdt9i81YTjIzM/OMjc7w3AwANwp27hpM0cWln0iOt9RowruSAlHFpZP43pLJxAB68lnZuSUOXJa41tCIuQ7jYBWf9fnP5kZo9GIlZUVLrzwQpaXVzxihGHJEE1ucdlIkgOwKMncj5Ds0SjfZd2R9re7AeWkGOFUhuOrrd+jFDPMEkJ1XGPhxdY+cRzZARPJfR9Jiqm/P2wONKHJwJRs6jt0Su5nWHJfQj2IYBQIp14xBkI47OE/BVyUFI6/KCk5zJOSGY1W2bFjB03TrOGtzQyHNKNRnTGQghWjWInxGI0phvtyNOZg0GAU86hmlMYw9c9qMYyCjgpHjx9ndmYD3//Wt3LPPfdM9FtUlYGqUko5IbzVdUi7WHw4M8vc3CxzczNsmnejq6HSphSWVlYBWF2ZY2Z2tt2tuwuw/ruUwszs6V2vuxi6TlYd48zM6V+vC8/qYqgnZT861Y+dP/bYo/zoj/4Yo3o8u1PgoVRJiPqJBRkRo6C+oxchSaGIxC5uJHEfwDdqN3xTg+wRKXd2EyRIBppjy/fLY02CWCzTxuHX91MAEfdPNJESqBopFcwyJurAqg3jWpx6DqkExVIiNwIDQa1BAWRAQiE5XExJ/URCyQgFIZlB9rk8cOAAt912G/v3728jiMOZGVQDEShoSUhuEM2U5CecFHWIGbAzlwZJghRDs0AJ2FVdu2wUMxI+XyqFpjF27drF0aNH2bRpU7txt455fcjVuCrE6Ds6DkdW2bF9C1lg49wsG+ZmOWfjHNu3bGL7lk1s2TjPpvlZNszOkMTYsW0LWvSEHbhraDu2nfr1ztu6haa3uLqn0qhpOO+0rncOTWcy+vmMesLVxVgXdimFpmligWbmZgZtLN8vFmFZbbBGHfdSwo9whxot8ZAdMydzTG9aUDGKGlZ8QaiGU6wGVtDSUChIY6j6gqOBTHPScZj5qVHUoAg0DaYlIIWhlj2qFUhBDUwLNH4tMCgKZqRSGMwO+PM//VOGgznPe2jDYGbIvfd8g5mZAapCMcEEv6cK8RpFLLFp06Z2Lqvt7dmzh4cfeRBTQ1E04GXBEG187pLSqNKYbyBm0IQda6MoDUbB1DwQUvyE1tJgKFqM1dJw6Z5Lefzxx1vb7B4EqbtSJjmmXYjVNIXrr7mCI68dZmaQmJ8dsu2cTezYtpkd2zaz9ZyNzM8OmRlkjr52mBuu2c/qaHRCZGcMSxpuuGb/qV/v2isYxfW6GdFqtE3TcMNpjq8mGbs+xyRSX520GhMvpfDC889z7XXXsdKsYMV8t7fA3ChYJmWgGKkIlh3SWeQEwJDkp0UJKKIioGNXW9R3PnKKEK+E32BYDlxvUMTQzEnHIREQSCQaMSRn9+dlvKOmMUr3aFRKcco43JIUicWU+G+3fYHf/c+/x6c+9R+ZGQ6ZmZ3jtz/1Kf7PX/vX3HPvvTHaQsYgKUnFo9C5oBirKytcdeVVvPjii+1zEBGOHTvGxk0bfXGabyxGQ1GHmaYB4YqRLDYIIXyw4vDQ/HoJQ61BTHyPKeZ3aMbxhQXm5+dPSDCaGamPt7pQZRJL8qYbrmP56KscPnwYEZgZJAbZ/5sZZMA4fPgVlo++yoEbrqXCtq4Bdv2bm9/8JpaPvXZq17v+2hNgTXcxN03DzQeuP+Xx3XLg+hNoGN1Togsxu4umnijPv/AC+6/YTxlZZIo1YJIf5yLmBpeFMhCwEg67J8QkVacyRe66eLg1aRtcUVFSgmzFsx3uWSKSkWIUibiSpcD1648DMU/ggTvP6r5PskhrmEMfRFEJKBcZfJPkjq4nQTA13vk338mHfuJDfOXOr/J7v/t7/M7v/A53fvlOfuqnfoqbbjhA8di1/2nZr5kU0YQlhz7XvukannrqqTW2snXrVpYXFrBmBH5+OBnA/CRxP0NJVjySZoo2DrLcbhu0eDTORONnxde3FUQLqoVmtMreS/fwzDPPnOBe5J/+6Z/+F/1dvZ9V7BqHiHDDtVdy51f/ktVRw9ZzNpMkMRo1HD16jAce/hbPPv0k/+N//941Wcr1CoNuvO4q7vjKetd7gr/3t98zkXJ8QpTJjBuuu5IvTxnf/Q9/i+effpIPf/DHJiqO9EPX/Yhd9UuWl5fZMD/ProsupJhDBEniOzaCWMakuNMsjp0znhzTSv0wRbL4yYCQyWgliJhTMzKZRty3cNhDJNgMY0ACz66H333ScRSHVSnCrZbdfzFpc4okFLHsvkEkBE0E6YSPfXxQrHDF/suZnZ3jttu+wHPPPcv73vdefuiHfpiVZrlNbLYJy4Hfm9uSn4jaFF47coScUuvnbd26lccOPsa27eehxXd/JO7LQAZgJRZ84+epZM8JeYwtIaKIRZpGxXNFLTvMIuye2LRxE48++ig7d+5c48/KPffcY5O4+11nvOsj1N/Pz2/ggYe/xaNPPUcTGHc4GLBvz0Vcc8U+VlZXpkrgTCrPrNf71pPPnnC9a6+8gqWlxTUOUx1T/VmfGbphw0buf+gRHn3yudavaMe3/3JWVpZPYOXW+6vX7CYcu9GUpmm47777+OAHP+h4NxYlSdr8gOGOY45TwCpIsRQwxkjqxi7iECCJY3MBj91L8viXKSlFrN7iG6SyrOp1OaVxEAlB1EPFyTzSVCkjmgSp2XGNPALBO2kMy0JW8YhW8VNpODvLp//g03zjG/diCDfeeAN/+8c/yOrqClgOLpZgA8NGKU6vOI0QhMzK8iL/9fOf58orr2QwGJBz5v777+etb/l+jh096rAzCNApbhMqRItTRVKHGBmcF6CYkSUjWlr+pNNrIodiwlNPP8WuXbvWJKoHXew+GAwYjUYnxPS78d9q3EtLi+zfdym3HLiBuVlP1qyurPLakSMsryxPrNfuhnL7hLKFhePs33cpN9/4Jubm58BgeWWFI0eOsLBwfM3i7BrytLrlhYXjXL1/H993043MzsyAwMrKKseOHWNxcWEq6a3PzO0nSFWV0WjE7OwsMzOzLC8teagTQ5w8FVljZ8B6bD/Ig2YkUaz4I1Tx06Sh+E4cxuIZcHdAU8Ak0+T2ihtWzYSj1NThScfhYM4dbne6fVcV8bCx5zpicanvvO2qix+bepSrFMgizM7O8h8/9Z/46p1f4f0f+HEA/ugP/5CVpRU+/KEPsTxa8XAxhpRUM6C+IFViDgqbNp3Tnso153HhhRfyyuGXyGmGOjtJxfliqYbFPX+hpiQKWIoNB1CFQYrTsqGIRLTKT+xk0ChA4Yr9+3ng/vvZu3dvaw+D7mmxsrLCYDBY44TWf3eNsJsPeeWVV9aVdekvvm7Uql88tLq6yksvvzy1sH+aSkh9NU3T+k0iwuLiIouLi+0J2K8zmERP7+Z2qvPdz3EcOnSI6667jtXVZTQZ0pgf81KZrNWgAuNWrlJSSolEWPL9WqWGOt2eJSlaguJhvusnEc/yV0ygRkkpiH+QRSnCScfhnCl1smM44BVIdVnBnnFOEfpMiBVUnMxYeWFZ3FP6/z77x9x5x528//0f4F3vfAdigpbCZ/7wM1yyezdveetbnL8lCbNC5cAUJ7d4SFoSS6Nlrrnmap555ll27tzJcDjk3HPP5eDBg1x2+RU0qytgQol5dNaDopactoLFCVyQLKhCSua+hQTzWD33YwKpcUaA/8ztbBRRs/bk6OPsLkTRoHj3C/Yn1Rv0/ZJJBSarq6troEr3c/XPmvnuQ7FJmfu+sMAkI+/WpPQTndMURGqCr8/6rD8/dOgQ73nPezh27HhEYzzk6Md6pX8bFbAIhonDJKhoxWLXTwFp1NdPY8EgFzT8Dv+AOwbOrjWPgKXKbfLo1CmNo15HPHFmUhgTVQh+lOOWLM641aCFWEtbj+cgyo/+yLvZtnUb3//Wt7G6OkIwfviHb2Xnzgu48c3Xs7K86idNzTGUoLlLxUdOiMwI1159NX/5l3exbdu29jkuLi4yPzvL8dUVSoNDtDjJLKBRI0YmkqXOcEQSFI2cShKkLowSSUlLkU+CZMbi4iLnbt/O8vIyMzMzbkt33nmnTaqK6lZx1aOuX7vcx+yTanq7MKpbfNR1quvu3F8wfQp5d7ev4+v6Al3o0/eX1hMHm1aLPEl8YWFhgZWVZd7+gz/IatOEPzDwya8bdXLoQwnqglR6OBFNcqhDOLbq22dEIiM513iUR8woyZ32XJ3sFDukuPtSKhnxFMbRJgZjx0ymIIM2CWkBO6xS4FNk7cVQC1jia6UNh1rOfgKotgnLFGOWDkFRTZyuUmodSaX1BNoYCF+548vMDGeYn59nZmYGVeXwK4fZef4FqFkEH2owISElnil+X77Ak/PQLBYzYNKQbNDys2rEziJQkFDO2bKVu+6+i71797q9dxNp/d247yfUnMC00Gw3kdNNltXPTitb7VZ91YRQn6zY/96+L1TDq30nvY6l+2fNldSxdU/Mfji3C+1WVlZ45JFHeOtb3sZodTWIbL4raTAKa8UFxTlOTlfxZJRU34DkcXuLRG6p4VdAszu+QZZTBSkOY6zu/MUJWaYRTTuNcfhxlaIOQ+Ik8ARhqZBNPOyMJFLkFDTGX0wpJUCYiI+ztaHY7ASsGRuemS+iZCCqEbiKMKv6ovRxKbccuIWDBw+2lBIR4YVDLzAzHJLQCF1bhzZSPKnZEjiDvqLmi5sCyfMeJpU640466uPT5Pe4PFohDTLD4dARQ3e3rYbdzRB3F0mfqj0pD9CFL12sXiM+1ZDrd9WfdSejv+C6pMWukXezmv3/uhCpe63uoqvjrYuq6WHOetp1v3N+fp65+TnMMpTShjOt3QE9ROvYPI5/83oKlRL1FIrzNSRyAJXFamBNLexzjJ78mqq+YFJxACZ4dvB0xqFBFycpUMhmlBw0k6CxWnJDdlqKnwR+gezcrmD+WkR+tN1/jUJARRM/tSg+1mSU8K80KCGkgiEeoFAfkqkyt2kD8/PzLVlVVbn22mu57YtfYLUUNm7cgBYfmgUb2BduHJfFKBRnAqRIXBZnKIuCNMWTirFo0eKUEwEdGcuLy2MbuP32260LfU6m0zRNm3Q9XdZazDIajRgOh+2C6Auk9X2e9dQpJtU+96HSYDA4IYk5TVh4Te1w+Br9U+PFF1/kyquuYu/eS50KkiQoHtLmCHJEhGosnRrPD6IgOaIl5rAJ8YSYJoWSUSnk5Bwqq5gjJUyLR4tybhm8vkA4rXFIMmiEkqSlswseyclSTxL3XzyRCGLF5QaiZLZSw2t+JuHObaJuAuo8KLF6i/V/Dgu1pk+C1hEOcRLP8D/1zFM89NBDnH/++QyHQy91Hgx44IEHKKUwPz9PaZq4txpVq5WINZIXLoJGwZa4RyZtrNzvQVGSed3LzOwsKQm7du0aEw+7jmyfaDiJRtENuU2Td+z/vMvd6i6++u8uhOpHlyoEqousr3LXvYd+sq7eU9c3miSjWRdJ9WO6i7DuYIcOHeLHP/B+ji0skSWyA6kWKKU2x13LUn3HcuydUoSjgk6NJqwUkNziYMtK1hTwSONKvggk+WJJgbFNGswyScopj6MN+yZjkEAbQwYNlMwwfKKSPN8S9u9JNcmIRj1HkByliEfGRoKm5KzxONMkxpCjTEDw7L1FWUESpWgIX2SLkoKoGMzC/iuu4Mtf/jI7duxobWJ5eZnLLrusjXh2Swb69tO3iYpQuqWw1fftRkyHw+GaIM2gL0ZQv7juntN0nLoZ9a5D3GXdttTfyHr2F0QdcH8xdk+P6kt0F0w3RNyv0OtH37rXn8TA7YsorK6unlBPXEphYWGByy+7jMWlZa+YK8kd5sDqKejfRkNmgBaPubvwgNKUQYxRIZnvxil2VC3+WREnFOILysSDrKoCNAgShU/J687l9MeRygCNYqriTA7PyquzcX0z953fiIRMtnEJbQ7elnrQQHMhaaIBp8cHLPOKkUqV0VYvQsy8ZiVqQ8Tpu2OonmBlZYX9+/dz5MgRtmzZsqaMtm8bw+FwzabaZ23X1+zs7Bok008kT5JYSl0j74ZtR6PRGojV3fFreLOLxfs+S5f+XXfe6mtMKputi6DrVPfpIX1fon5n15/o+g2T9GHrOJaXl9fkbUoprTJJHWddwE3T8MQTT/COH3oXpSmRqnP6tyexvKRUUMQG7luY1GgqiSF5UDynkSzwdZSamkQxj4dXsyWyQE7uvFrUwWrKEIVPOqgV36c/Do3TS6VGsiLWr2PlkAxYKo5zaiYcozHncGlAGEsgJUUdObhn4ZAmp2Acx2JHpBO50tZvMrE2ny1RHKXA277/bRw8eHCNXX237Sd1C4e6cKceMd2sdI3ydJ31SYXsdYDd1djdyfuwqgt3BoPBCSJjNRFZrzccDtes+vWUUvqJwvr+4XC4Jsxcd4+6+6SUGI1GHD16lAcffJD/4e/8HZaPL3nVWXCSPLTpLB1LbqopZGsQT4aliB5pyaTAtwWQQfAhtJCDqaqRlCtBabBhwnKJIiOLTDfQSOQrTn8czsNIHhUL6J0HOGwzJxUWEZJKsDIEy4ZJ9ipDrUojGg67JwuCKxwejuc1LIfJB8YXEY9WRZGXImQN1i+GpuSnWTGWV5b48Ic/zNfvvZejR4+uQTffLfuR27/0pdhCiAL6MUmM4J7Uyq5WmiU0kmqEo2oj1Z9JyLVU3GqRFfU5Cp+ge52uDx+7UJ3kVgFJWPO++pska+Vqqq+FdcbT+S4i4tJqRdXQUCSU3JeTljM1HA64+qorWS4N2VJ8jQYBLpMoQUWHAUKDix9U+ptj/cBI4nymAEvxQBwe+XXjHlJBtdIQ05hwh6JZSPo6xtFm68f3i4IFnZycQhBhnJF3H1yD4hIlsCpjxq6M6+NpqTIhAySKFKfiD5K11A93xI0qFlRTqV42HLkhEyQJDz74wASxD9pn1SGutQteqM+acRBhLBI2wZ7Hw2+t6/lDh2woQhG8drkaazUUBI00ewpqDClR1EXGqiZRq2IR0jE5HM+avZWITzsTMqInEb2oC0BDoCxJ8IoiopCCy+OsS6c1iPiR7xFFI6dQvqhiCjHlLfwQN6Lx/Xssp5iQrBpK5JJbdqrXSYiF1kegDM8ZBDkvplIl5igHLSMoH9XZFIOSa2WdeXVbZGpdWMfxuVRHH39fLFvPVai87nH4JsDaZ6WG5SBFVl6X1PmHsV5QhEQcCZcsAAAWiUlEQVTN/3S+VfIipBosE0FLzWRnf1Z4Vtp9J/WAXcpRvBVUrprIi/vGxpG2yOWf5FkJRdx+Bh6DeN32nCRKFyV2No1Yd12ViguMpZRiB/AEVor4u0VM2+LYN/Hj2LO6cXhGFVjoVDjetnqsBMUnDuVURS1IpOw7TqP12K8Lw5Nm7vA5dUDVs8MSnl8hwpKhzKfqIgWu3RScHgtjSw4l6s6SgtWKuhqHU9OkzbYWMyx1ggPm7FZJyZ1UBIsyToschguG+HcXxZN+kdmuQVdNJRJw1jlVtS2W+k6MQ8W8bDcMMhWjSfgmY8Vza6o+P8Hd0wjFWlQG1mNc8OfqGWev2WgipKzqBuf+T4kyFB9f0TzOktdEqLoWlpl4HQaN86LsVJ+VeaTvO2jPg6B6erRDIIdR13oD/02s+uQTSJvrdfwpUTBjA2sTR9IINlCkyWiuzM/sD0DMSS0mTkqzhKbiANpo2aClEXLc2LhYP7Kfgb/rSSvWtMk2y7G7hbSHVUigtcjIKMUX60iEQQOWa/DU0BIs2ahRdqLOd2aOihZee+UwRYsbQ3a2qmbIxb1hC1U3oQ1ZjRm7GnkFEXKLIYmEn4zRRYp6kXofFYIEydHLB4OK0RmHf5eChOYVY2q81edWhdrCc3B4GBC3as3Fs0rFoaDXllQYowEVfcMiiJh10Yt2TqzkTGE/GeS7OkeDFD5CSfFnOFxSAjRKwKIUxklGvC4TGRSk8aIXk8bLO1NyxuQgao6roYaRWlSEWZhiIlFaAw+tpMANKeHx8Ip5Ww5NPDj1YnpPPDmFuoqMWRz1VfAMgvgnhpVwxIrn5Er2IqEkvjMnySjFT6SUnX/0HZij44tHWVkdccnu3Zx9fe+/Btr4DuvUBW1hjiTfL1IpNAKDyNiqFefN+Kbv8Wp1LaVKoSdi89Iq7/lRlc0jKJqsfW9JNi7cJ3mMPRwlrUzTtoYldokorjZxcKniO4e6DIWvfMVLSXODufU7wcE8yVZq2FDHO3xj1SeSVr0jWUE1ofL65shILC6tsG/fZW3M/ezre/uVkBJVZo5HCacxyDruuJkTzqzSHrK4WFqFKWLkyOWk6kTWLHllZhYP3UXZekRliFj4uHorBSFMzOPdFllaB8w4F0Y8sqJVXdzEaxnCaTXxMkpxBVn/uqSh9FcimuEOutQQRUrOdkU8vBo+kNcCvP45SiI0zejswjiTFodLODaUCJ21YbzgpKSICnn9rbSliCYRprOE5OTOoLg2kJHIUQYq2aMKOVVpRtpoeKoymVLpy0FbSA66UjinxRLJ7RfLGUWcyyMOzCLC6pg4uUaTmKDZa4fropFU2miNk3BaXgdSwqlLige1amVdcvr2654j9zfOvs4gWEVxVW2rNc2iHg7P7qiJiDujppTqtBSw1CDmcXRWidqA8LOtuAYTTlOQKOUZkwIrv8ZFugbqWqzSOulxZBQNOU+HLSkcNi3GAEHzyIPDGkxRF0cKCqpiKaT7i7rwWBX6ipNINbtoQHJGJjmFbEsVFNOWkWq8zjkadRzDs68zBVa5wQ2DgpAkObOsRFSiCsdJxdgZyKHm4OFbBhG4SZW373FzHUR7lKBGWIT2UieLOtTIaUQtmvsblT7txDUlkzRXIqUnk5LnHyQWBknIqDvFklxVQ2sCLBYdCcmGWnJJTvFQoRYhDYKBKhGxyQRPKLVhz29njlxMwDVaObs2zjBYFUmdxqzF3yI1l5DaTKSiaEkgrhhHEmaGmc2bNjM7mHF4o5HOi2qvXEJu3/DC/uAQEU53FokkWxDGUtVX9TLHpDkUx+tWPBYTm8kDl6jJngjy/GotAfUQclRTen11VMah47BdUUgpBJ6DFaCUEAwzJGVmN8yxYdM8m+Y3QM7Vg4kkkTE7nJ06R5VHZHEAnV0bZxysiqysefioiDCIWmQstbyYZMllKkMndX5mA//3b/w//MnnPsett97K//qz/wuriwbZd+IaXUo11m8pdFIjc12MJJGbiOIUzFzvtR1P01bOEUS9lDOPPPQQr7z6Kju2n8cVV1zuSStxaUxyiCfXa5iHgEuQ5VxCMORhUE/IVapQUGFTSqwsL/E7v/uf+eY3v86RI0eYGQ65/PLLee973su1N1xPWVnh2OICn/+jz/P+D3wgAgedOTJXRS8mDCIjXSkjZ19nCqyKrKMUT+J5mt4CK9MamAZRKhnMzczyG//2N3jowQe56aab+PrX7yUxJCWLCJLDnMoZwlwNIqc4naQySR1Mlcp5CQl8SSn8F2lT+W5YnpRqSmHvnktJOfHoY4+ShkFYyzkSSNYqjbcyXuKEEq1Z+6iuz4RAcpw6szNz/Pmf/lf+3k/+JN969GG2bd/Gvn37uPiSSzh+fIGPf/IT/Itf+iWOHDvGRz/yc+Q8OHGOYuJUPNTbWGkTY2dfZ9DiKADFG5aIppYe4KJi2qrsIQ2iwuzcLP/+t/4D9993H9u2bUO1cPPNN6Ml5F5qWNZLgl260Wruo6qMp7arllrxgFHtHyFgxeVUUggwN5W8KL7INm3eiKJs2LQRBQ5+63FyErSx4PxUiFfpGR4CdqFwRTUFT6j4Yo6SycEg8cd//F/49Gf+kBuuvx5B2LZ1G9deey2X7N5N0YZ9+/axuLTEz/7sz7Jnz+4WgnbnyKNmrhiokS23s7DqzINViaalbZQcNGXR0AbKThxIgllhbm6WT/32b3P3XXezY8cOzIwtW7byD3/mH7K4shzdiYxG8IRfKzwfLMiiYeAaxfnFI0ollMilbY4HRaNqLXnmXDJWCkVgzyWX8sSTjzOcmWPzhs0cOX6EJ558kt2790TysJCCJtBUVTypQoBGyRp98ELmrHgTl8OHD/MHf/Bp9u3bx2g04qMf/Qh7du9meWWZLENKafh3/+Hf8/xzz3HFFVcE6zeoJDFHLvDhVBlVF1FGcoSlzxrcmeVz2ABSoYTSRAlYoCl7D4eggc8Mh3zmM3/A7bffwfnnnw/Azp07+djHPkajDefMDUNhI1rwBllNVVlcWvRdNFid3quCwP7aGo5ZioYr3gekcnA8cqWklMMHSly+7woee+IgOQ3YumULh189zLPPPsPFF+9qWxRr66iH6oc60SxriBCrO82ShJQGfPozf8TevXs5duwYv/iLv8imTedw7PhxhEQjixxfXOa+b/4V5+04b1xGGwVHqXK7teZSSnTZqnUTejaSe+YtDu82mkU6HYEyYh5gFVNSHvC5P/kTPv/5P+Oiiy5sDeOhhx7i3e9+d0igyLgntYybtm/cuJFf/79+nXM2nxPKEwnJ2tJKUu0BIerZZIWmKdx11x1ITuOWXLjgGSHfLyS2bN3Cls3nUFTZunUbrx0+zPPPvsCFF1zoY8rR6kqcqGgaogiR6fYwrUfWBnOzPPLwg2zffi6X7buM7du2szJaDSq28OLLr/LRj3yEiy++mKNHj3p8S4RmtQkWLeHZV3GxqvAXGFNbZvnZ15myOEwsIq+1j0EmpdKqSKDG7Pw8n/7MZ9izZ8+a6r9zzz2X8847b90vKKXhi1/8Eu99z4+5+28lEhgS7EpXscgpuzyKKK+8dIiLd+9hkMQ1YtMIs2FIygS1pOo6hR9hZLZu386hFw6x6+JdjJrGe3lHEZEnxx37ayTzarPHJmU2JGNpyWVZLrrgQlaa1SBOehRr1wUX8NnPfg60RPbeN4Dl0QrLxxfbXuKo530oNm4qGYIHdhZXnWGLwxVhnJEq4lDDosREjZShrK5y1VVXsbS0dNpfsLo6YveuXWhxDySJdy8ySSRV1LIr1WlpT565jZs5fuwIaWbW9Y0sk5JGHsPFYES974KKMDDH+0X9NGmaEs0nvejHlFbqsu19h4euNdiBRYW5uVnX2F1aIqsXz2jxSpOl0SrLr7ziaRJlXAVnRm6VA6tgW/FkYuuE51pOefZ1Ri0OCrkMKGmsnySB2ZNAo0JZXuEjH/kon/zkJ9bUY59//vlcffVV3tpM2sLTtrZPzNiydQs33ngTy6tLkSj0uolkng/IOHFPa2mjGlu3biJnf2+tx0gdSYFg/XPs+AJZ1DsUkVhZXuDSSy9DKYg5M9ijYt4FqaiQcnFNpWxYyd5ZVYSiDeeffz5NU7j77rv50E98iIWlBVqhm5JdtsYysxtmKKPG+wCKK3VX9JSTM38tNFqrOksKn+fs68x5ydPPPF116sPochSF+C5emyFIRGQ+8YmPt7W8zz77HH//7/8kb37zAe+akw1TbwxZBbUV7yCkVW81HOycDG0kmh5KW8stVVM1VUHxCO9aFMvgnKnXXn2Nlw4dYtu554IVFldX2Lt7D6Vx/ydngvIuURIqQYyM8leSJzsju52ScMcdt/OlL93O4uIiBw68mb/7d3+C5ZXlqGly3+uVl17iV37lV7nxxhv4n/7B/8xoZTWKZizyi937SO6UR4vjFw49z00HbjprdWdKnsOakFUxjQ6exYnehdDmHtdooIWPfexjlJDc2bXrIn7zN3+Tv/rmN5zuPYrrFHXcrRaG6Ht+MYNSEFXKyHMSpp4LMNShkXmyT83afm+VKFi1/I6+eoRnn3uGrdu3oRiLSyvsufgSmlGlo9decNCkWn9hjKJGo4QAcqNOFUmmFFPe8a53ISJs3ryZ2277Iv/q4/+Kl156iY0bNoHC5z77x/yjX/gFzr/gfP7irr9kNg+pnQHaA7VoKwEKhjVB3bez2fEz7uR48qknLJNbdQ9LtaC4qkDUckZvmSXJM9Sf/OQnWxmUgwcP8lu/9VssLi4g5CASWtCVkq+TWmgURfFAiHpVXaZg9YpHtCza9bbyjeIwaSYP+NrXv8auCy6ClFg8vsieS/d4F9bIp2RxkWLNtLXX0Zpi3M8uKPBaO8DEybi0uMSv/ZtfY252luXlZR5//HEWFhYYDAZccsklbN++nYWFBd73vvdx0803U7Q5YY6INsaVGZ+Sy8+8+PwhDhw4cNbqzqSTo2BRqFOiFtuL8FMIFFA0+jQ03p8tZX7+536e5RWP7uw4b4d/Pqjpg2gmoqqIGk2IhlkqFINGjSZOBFXvEJpKQa2BQqhIBPtcFGu8GaIUb86+aX4TBeP48aPs3rMbbUY0USCF+omgRKticzHjohpL1JeHJqUpTl+36HmtpmyY38A/+6f/hAsvuojRaMT+/fu5+aabuf6GG5ifn2eQB/zMz/wDvu+W76OUZuIcWaijazFUCqWRXlHX2dcZcXI88eTjZpJoJYTa5iJjwYFKwo7MhwscZKGMCnd/7S7edMONbJyb94hTkii2DwVwAaxBZNCWt0rkARSviZBilARZw1hTLcgfh4UsKvEkpPEXFo6zcdNm12K1VjmrrfKr2lOefmg1WECdS+b6JjZuqFgpLHhgYn7DPMeOH+eRRx7m6NGjzM7NcsnFl7D3sr0cO7rg2XCxqXOU1JuqJFwsLQ0yh154nptuOutznDmL44knDPHqORt4Ew/VHPUXIeyg4pSLUK3TkHMPcaiqTeFwJVH14d2g1ZyqHmL1Xq0aelUaurBZooVCrdgLmJNrfTmtTlGKL9boA6HiDUwkh8SPiod9XUCD1EQ31VSbqsQCiSYsYhJtvdplBGY0SRhaFc2JTqbqQoGCYqc4RzUhmtOAF188C6vOLFhFzYr7jq5BIdeooZBUQg3PXD+1lOiyGBhe3dFurGqQatvpE6JKLjXeQ6HVEKoOdpwQxXMY3qXHG40UDGk80lTEe+URkvtaqScWPSrCnyBgVJXsMUtobtqGj973O8iUNCGr0zj3KciNqr7gBhqkkLZ3hYXBW0uzP5U5MhOn47SaT2dfZ8zi0Ej21cahRLzes9niESh1yEEJdZCIHCW1tr2UiF+H6Nmg0RWxrbQTV6zTKmxEkPQ6X1xlHNUKAwnZzuR1TqUEEz3V0m9DdeCD01Atz3jVYTSalOLYvwRd3YoLOlSVESxakdnIGzhqRJWiM5IFrUXR1z1HVb3x7OsMSgIGEhmTG6L/AsGXkoznMGosn+QVdC01PYWyRwqZ+mjxS9u1xHddBMvFdYdLaRuyCDky8jXWFO1QrLiUTklRo+Rqikkt1MktZEejM1UIK9RbkFQV1r1iRC17UZVEaxcpURUYcEqhiPsz0nj0rKr6IfK650gH5ezaONNODqnE1xAIIKIsVVXDosmIR1b94edsnUIoGxtRLm1OoVXwVWtVDnNTF03VeM1eUpqsbdjYRKKvsg0zDmUkKSKlI1Zcuw+NW+VWX8ePIRdSbheLjFwNBD8NBiWa1BOOe/gG5rMShUoBM78Dc+Slv+msxZ1RPkfoQbmYQY3qgI4E1QYzx+Zq3uAU9SyzVawfjd2LetMUxXtEW/SK8B50OT4T6iMaHY5QShVIEPH6h+TizVWlRIMoWFTRIjTi/kkJyCYWbFtTirijXlXNVUucHrX/t2vrWiNOlykuueNhZ1opTO/zEi20NNqhvc450qawYX4Df3XffWsoOGdf38PRqscOPmYpFG1ShlSyc5kyUQvurXSlNBGFicBU1F20WlPquk2VLlLFvzUUsVPrRIdvUCKqU6nudY83acNg1tK9MySvIHRIpeTk6iWErGfkMaM/orcPQ1rdbvdtShrXkVeyjCilqrkXVzqR6NtXhcorn+t1z1HxnNIrr77KyspS9LUIXtkayFUZPbV1g7WdWaPXfCsKYViwVySawXTeYIzJjq3av7Tq7bWPNxEKr+OQWrIs2p6I1umjN+011oSvrSfCyOrvpBaGhSp7R4e3+px0tXbbga+9le/WHMljjx70pHg4qSqCyMhLSU1c87XqzVpoCIbUjSuXgKYQcDbI4vKZskauvmrcgmhGJSRzglflSt/RtsBcMsc0t4TDksbibN4ZKSrwxJCiHnatRVFt96DIrkdttySX1K+ZE4v0dTXmFCdUFonmMcEOiJyMiLbq79+xOZJOo4ToAe6+j7WLX6r5mDe7SUGt8QaQHgk0Fd94skb9irR+XKp6KTIOr0t0lR1InKhrxkGba5LiRNRstZeGz1OTooePpjVtjMfPKuar6kNXKqq6ovugfVZEi4BoU2AaWsUhB0vQ1uJ5EJWX3605annVIkKREp1Ds3cBjRZZIeCHiIuU1V3FzBscinn72kQJ/K2RSIwFIJVHFUVNRNutCN820SvDdbAij5E1yIdGrhQMIWTjSyvCTU7MRqjUhZ4tdi6NZF9oZsVNSLZxf47sLYNTZMyl+hrRMyKpRueMyHN8p+coKqBU1GnuGCWVttNq7R8jql6LbnGaRu9AojamCm1HcUtUZDZutBqSQeoVj2hBtbgGcJETx4GXAljxZ+bs6WjtXIxRSLYq6gvDAqKGwkpSIoEM0gQnwSo1SZgp3tO8RBsJgnemMVduG+NnpbUeJ/Fdn6OBVme0hmKJTp9tljlk4iWq8qLfRirxuTJuQqPRJqgemVrPqugYlELbqf62WHSASuIdf1o2cNDMq9+SQqbexp2anKBo0fsiGMSR3EvW0ERfDRkYTSPef1oEHakLrJVEoYE09Aw+CVd/tKCwZ3IqSBn4Qygh+fnXNEeSBt8T4zj7rMZzNPjKV75KbbLT9idogVhIeNZjrdvaqsrsmESuo9Mjq6NCMq61DvwvXdzr35GihUBtKmNRm60hNh05OMfHMZQkqdN2rYtvg9LRJiSqhm0kO10BoZUBSiYtDBtLhNSuFFVwOnlo+K9xjhLfG+M4+6zGc/T/A8/G/snZpSWJAAAAAElFTkSuQmCC);
-    display: none;
-  }
-  #chrome-mid {
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAABICAYAAADRa1RpAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH3QcNFycE5v9iFQAAAQtJREFUOMvtkjGSWzEMQx/0eYrM3v8k3vgqycalSwlI8Ufyl3OBFMtGIgUCIEd6PB6RBEASqvfONSrJXrDNbNkQ8ywA2y/SmayW+ZIESTsiyQsxo40xmMS2aUmYbheHpCVd0+UqJGGMsey3mUyldoUvlY3D9rIN0K7Wbe/WbZ+y1yWtaVtrp3VJzAEX6ZVjc2p7b2mtnYhNdl6m05rwtfV/ltx7XypJTpXeO7Y5juOlchzHaWxyrJmuhLapqgIJONv05+srThBgiQpBTSRwGOr3rwccgWHUhJ7P5/YNlbd/2XiL78L/WajP240AQUihfnx84EDJjCHKHjTAbkimQDgBjAJ1/3kHAgEk/gL71AHEWVXPGQAAAABJRU5ErkJggg==);
-    display: none;
-  }
-  #chrome-right {
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAABICAYAAACaw4eEAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH3QcNFyghKmOqnQAADE1JREFUaN6dmsuyZsdRhb/M2uf07bREYDykPeIleAMibNx92i9BgEPBgyB5xlvgtgI8VDNBI41xhGkpQowERgqw3H0ue1cuBlm1T/3Vu4XNiWj9l12XrMyVK1fWL/v6668lCXdHEt/1Z2YnnyUhCTPbX8dn45pmRkR81z7/XUr59Pz8/K8ePnz47/bVV19pnDhu0t+Pmx0Z+Pv8zWv1/eZnZ2dntw8ePPizZXw4bj5/P3vq6G/eePZiX9fd9/Xng6/reg78/dInzxPG9+/auH83GjEbPUahj6m1Hoa6v1/X9c+XPrlP7INqrfuru7+10WzUkUHvOtTojPF1mPdHSzdqPPXo5vm046bdq0fhGr+bvXZk6OgAM2OZBx7hZD7hnCzbtp149Wid0YOjx+eE6t8tMzb659Ebkg5PPY8ZvXpEQWNCzck2M4H3BWeM1Fr31/6+GziPmTefM3tcYzQoIt4a3+cso2EzhsYTzAAdw9M9M3rviPv683dl/Oi9pdZKKeVk4piVRyDu1NI3mCtARFBKeWeGbtt2yHV9HXdnGUMyGjSfZq4K42ajYbPXx836XjO+jsj3rawcFx5dPgK8bzJ6eGbzI8yO3j4yaMToiWF98fl0c4bNSXBEJ/Ozd1HSEY8BLGOIxlONeCqlnHyWtGNoxteRMX38uP44fkyyPnfpp58zqy/s7jsGj0rOEcvPVaMD/sj4I/zWWllmMB/VviOwHumv+dkRGc9EOtOUu6fHZteOGBtDN/+NeJwPNRsxl54RU3PIO4x827a3wNwfdr45kib92WhAf9+fHem1I7FZa31rr+WIr45kzrjZsixvZWHHYcfqXFHGctM9ta7ridcigmVZWNf1DvyllN2wkatmHIxCby7kYzbPOD2qFCN39efrut55rE8YM3I+8VENHPFVa2VZlkOSdXe2bTuhmHdl+W5ox8T8YCbD/l2t9YQqRiNGjx8l1JEamVXKri56doyTuzfGhWd+OyLJjsNRlo+eHaX63Iy8ldnjQn3hbmA/yagGusfG7JwrxZytcxMyjpnH77VyPEEP65iVs5tntp4ldp8zlrG+x8z2Y9L1f91Jy+zeccGZn0Zv9nFHTH500BGbM6HOojMiWEZQf1cN7Aut68qyLCdeGFN+xuRYJ7tXu5fetU9EZCiPOp8xm8bTzLqpe2jkoDnzxjCOa8/VZByzzG7t8gQ4eT+GdO4Be0kZDTgq5kea/0g0RgS+rushNkbg93o6aqeejUeNR/fcUWmaqWLbtn39MdGWGcRHUrcb17E1jhszq3tvxNCsJuaE6VGZMbeMKTrL6LGelVL2k41jx6zuRbknSS9BI7WMdDRTxLi3z+VkDl3/7vb29oS3xhoZESdZOm4whrW/7/NHT83UtNze3u6c1I06Ozs7wdjc7PaQzsV8JNSOp7k97IDvtDPDYTdsvts6Pz8/MXCsm2PD2g/Tm+Vx0bHZHTNvjMyRyh2pajk/P0cIZEAHLLgXQLg5ckDCAFsKCwtIeHHAQGAmSnEkMAyZMBkin4lc3jBEM4a7MZgo7mBGhLD/+M1/qiCqDJflIjICYbknjlEtQEl81cBDYIaUi3aDwoEQ7mABuFMjcHOMQHLMRLSDhhlFQk4+k9IhLggZBREeVLN+NNwNCAhRwjGMimGyPJlA3owyIwiKEltWjTBHNchIGpLleIS5ITNKQHVDYRiBGUQI/83X/0XUyorhm2EKAsvT1IqFgwusgglCWARV3SuGmdNchwgiRHWQagcHIqCNJ7whJ6AI20AeUJ3A0ilP/vQJ33zzDdvNDbWkO91oAwphrah7wVGG1cHMqSHkggiwDJthmAcgjIIVg5rfWc1h2AZ7AgBLpMElMpQCUyOSX/3rr/j+9/+EGoEQTgKxKnDADRROmCiWySJBeILbMCxENVhwBISCnldm4EBEeiQRk1AJs/Y5ER2q7BX03v17SQnumDeXRqXgDaSA1cSdIExQDM+UgtoArTyMIjABJUPt4S2hRHEIgbdstV5LI4OusDvDMgMNqw3sHqi0HPcMotyRNqp5ArnmRrkLuBm4kHmjDAeEDMICk2PFMwomqjI2xYSHsJIUUnxoeBO7rdQUJ2qeJk8SLfdLGtgWCouEVzFUG7NXMAXVG1YqyDdMhSDgFuTpabUEiUguUw3AiAafbhoR4EtmpJknKArgytMaBHBmIozEIQ41M1dK7ySGEvxQ8NoI1w2WFh0XlsUaFYilJ5zhpuGKwBxXeygIqxlrE6Ih1wKPgi8L799/QGcJo4M5o9oYDfcKUZJmEFdX12zrikh2xwwrQA2KOeqETRlCGaKaUFXLpjQwy5Elu4dzflb4uw8/5MXP/wEsE6ORVX8hbVRzTVcN4ic/ec4HH3zA7XaTC1sQtZUXAm98Z7I7uvjii8+5ePw4pUiwu7TXuogM3cX7j/jhX/yIJz948gf/NPjll1/yy1/+E//z299RCGrL+AxI8krQfhk5Ab+6LmrGyDA1dvfkqOvXNzy7fMonn7w8umjafabmsDuowPPnz3nz5joLiN9VCwIqJDGHweixV59/weNHF4itZSMJbGq61kg3h3N2fs7D9x7jIdTwIzw3tCxrZo560U5U8frNFdu6URWJS8RmRukto3smv07uxwJrMa9uLDJCG1ZKI87AWJBvhEOsG9WEhSVcWBtu1A615da2kboiPaRW4hSRcBGEClhg0cTDycWdJR1XgUdkrN2hRqslGapydo+fffgRL37+Ir1opzrrJHZDAiB49vySv/3gp9zcRiqLCpsrjSLrnpQ27KH8/ItXPHz4PtRbRMoTajrBw6Hk4o8vLvjhj/6SH/w/wf/xx//I629/u9fPjkxLIZfVwmLwWBhQqUqgU1NZlCrkQVRwGW9urrl89pRPXr78gw27vHzO9dVVI2cIOYVIGHkrYXVDUQaPvXrFo4tHbFV7dnkjzGT+5BjXwnK/cPHovcRLI9hME3ZeM2+HtRwQAVdXb1ivr6ldzfYC3sSnPFAUZHW+HE7WtqamZL07avrcnYgKKtR6m/VKQTR9n0JQjZj7KqD2LCLY2h4quqsKNUWA5BQPatjAY1hTpuAO2iqlGLV1EQJ8C87vnfOzjz7ixS8+5vf93y+sFeZnl5f89K//htttw1bAW5d05rAK90awjOD//BUPHtynblmInXStyUHJR3jw3sV7/PjpU548eXJArvZ/gv/Fx7/g9bfftug4NfVKa7byd8pN9ZT5I9rFSM/wSPFXrOn5Tby5vubp0x/z8uU/t1Jx5/H9v3b3/q4YGJfPLrl+c0Pde8lgEWxN0znG1jG6e+zfXnHvwQNETdmMINqlSEeZJ1Dvn93j4uJiL+6jv8TQO9L6lya9f/fta26228wodVwZboFU2gLbqbqglZLarzTbdpvBEhWxNJI1bq5uuV6/SRCHt35AyAwPo5aKZzlIHRb5SqTR1nRSnitQtC4phNlyqvlTppRUlmZEQJizhCErbYSa57J8SNkLRm3s7RV54AHymjK9cYjUyg+wqV8XRCtfdzea+IZiFIoSsFKBEm1SE26SpXZCeDh7g9P64R4SrU2ZkC1btea5TMDsqCJ5UfUuZwO1BlnZ6tkgrWWWqjOgqhJmsLWa2dowsKZK0nuKlMWokWWBoBIeiJpZF6CqhtnMdHSHW6PdZLfijjISu2HX11dEjURrTza3BtymzaLV5NZwEGQYW4ekaLdCkXSDRCkidr2n/XKGUlOKjxc6oXZN0H4ZefXrVxQ3atTsjD1lkJpIDNEwlSCRZ53rp4zViNiQtqwEStHT1YoUOaclSY1MmmjXCelNz2Q1T5L/7LPPYDEePXqYNa0ENHnd7xeKKUFiAO2HBM97DZMoS1prMmQLrqCE8uZHIgVDNAFpFEW7BnGKWQtnYJ6GOmL54+99D0JEzfT1alRzikHtda+1/4nsxk/VqQZmlXXzJMUiqFu7nrJMe8v2LhteteuAvEcrVqk1m+Owdn9h7ZYSE6WAIrkjPCVIFua8s0jhWHfhZ5YZZ6rZNxoplZp3clg2uUSKAcmwYpgqUs1iFI5Z4rr3mliq3IVqVDbwM9CGkao1rN1IR6F4xepCEFht1wAhIKjRNH0Dv6ym5lHrEQw8JSlUtapghHJ+qiK13OyZ6yyf/sunSYqyVuPavVVq3bvSgrKxcKVGU7/s1U5ovXz1W5v9ftPVet68cbSehRo65ZNfUuB/AWHLchVUWJtFAAAAAElFTkSuQmCC);
-    display: none;
-  }
-  </style>
-
-  <div id="header"></div>
-  <input id="stacking-distance-slider" max="400" min="1" step="1" type="range"/>
-  
-  <div id="canvas-scroller">
-    <canvas id="canvas"></canvas>
-  </div>
-  <img id="chrome-left"/>
-  <img id="chrome-mid"/>
-  <img id="chrome-right"/>
-</template><template id="tr-ui-e-chrome-cc-layer-tree-quad-stack-view-template">
-  <style>
-  #input-event {
-    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMnwAADJ8BPja39wAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAyNSURBVHic7Z1PTCPXHcc/4wWWVbJN2cJSLVqiQJuGpoIGEVWReoBNIlIF5RCRSysOK9EbksUeOHLIIQcULbLEEYk7oqduD6gSRoqUEyK7dCOabOHghCiAE/JntQtesHt4fuM3z2+MZzy2x8ZfaTTjN+Px4/fh9/7Pb6xMJkND4VGk2hloyKkGkJCpASRkagAJmRpAQqYGkJCpASRkaqp2BvzKsizf3w1z38sKc+ZUaQCuAFeB57P7q4AF/Kxsj4GnLrfL+6PDYofQAskCaAJ6gJeB6+QAFOvZpwgwPwOHwCNgN5uu/+H252raJHRALMu6ggDwCtALNAf8E88QUL5AAHqSTVcNUTU4oQBiWVYzMIiA0E3lGhtp4CsEnPtACgFDGqXiYKoKxLKsCPAaMIwojlzV1tZGV1cXHR0ddHR00N7ebh93dHQAcHh4aG/JZNI+3tvb4+jo6LzsPAY+QYA5Ix9KBsoPpmpALMt6BXgTaHe7pre3l5GREUZGRujv7/fdsspkMmxtbRGPx4nH4+zs7BS6/HtgHfgvOW9xeE05bVZxIJZldQNvATf1c5FIhMHBQYaHh7l16xbd3d1lyUMikWBtbY319XU2NzdJp9Omy74B1oAEAoa8yIZTDttVDIhlWZeB94Dfm86Pjo4SjUbLBsFNiUSCWCzG6uqq2yVfAv9CNKHTlNlbKgLEsqxrwF+BX+nnhoaGuHPnDv39/WXPRyFtbW1x9+5dNjY2TKePgBXgOwQUFUyg3lJ2IJZl9QAfAK1qek9PD9PT04yMjJT1970qHo8zPz/P7u6ufuoE+CewQw6Kw2OCsGVZgViW9SdgFNGLBqC1tZWZmRnGx8eJRMI5lJZOp1lZWWFubo7j42P1VAZR4W8gWmJn5KBAAEVYWYBkm7PvIvoWtjo7O1lYWKCvry/w3yyHtre3mZqaYn9/Xz/1EPg3ot+iQslQIpTAgWRh/A0x5GFrYGCAWCxGe7trKzeUSiaTRKNRHjx4oJ/6CvgHoigLDEo5yox30WCMjY2xtLRUczAA2tvbWVpaYmxsTD91E3gbMbTTBFxCFM0WYPntMwXqIdk64x3lM9FolMnJycB+o5paXFwkFovplfcniDrlNLvJXr4vTwnMQ7KtqVE1rZ5gAExOThKNRvXkPyMGQaWXlOQpgQDJ9jM+QGlNjY2N1RUMqcnJSb34shClwnVE8aVCAY9QSi6ysj3wv6N0+gYGBlhaWqKlpaWke4dVqVSK27dv6xX9j8AyYpDyGaL4svsqxdo5CA95DwVGZ2cnsVisbmEAtLS0EIvF6OzsVJNfQIzRlVTJlwQkO1Boj021traysLBQk60pr2pvb2dhYYHWVscAxEuI1pcKJYIHKKV6yFvqh5mZmZrp9AWhvr4+ZmZm9OQ3MAMpSr6BZOcz7CH0np4exsfH/d6uZjU+Pk5Pj6PbdR34LT69xBeQbG/8TTVteno6tGNT5VQkEmF6elpPfh24TK7VFaFIKH4t+BrKTN/Q0FDoRm0rqZGREYaGhtSkXyDqVs9Fl2cg2QUJw2ranTt3vN6m7mSwwR8R68dULzm31eXHQwZRFiSMjo5WfXIpDOrv72d01DFQcQXoQ3hI0V7iB8gr9pcjEdNQwoVVNBrV69EXcanccfEST0Cyi9jsSe/BwcGKz4GHWd3d3QwOOqaAOoDnMFfuRnn1kJfV7wwPD3v8ev1Ls4mF+Ac2FVsW5C8aLxpI9ou/U9Nu3brlOcP1LoNNbuJej+R5ihcPaQJ+Iz/09vY2iiuDuru76e3tVZN+jeiTyFHggsWWFyA9KAufL3K/4zxptrkE3MClYkcDUxQQU3HVAOIug226yHlIXvNXrUe8eEiHPGhra2v0PQqov7+ftrY2NekFzEVWSXWI3Rns6uoq6ZGyepdlWXR1dalJrRTwEFVegFyVB3L5f0Pu0mzUirC1CsPoJcUCuYLyGFkDyPnSbBQhB8VUZNm99nOBZC+8qqZdhBnBUmWw0RXMQHx5iOPpprB5yMbGBp999lm1s+GQwUZXKFBUSRULxOEhYQNy//59Hj58WO1sOOQCpGAfBOoESBhVwENMm61in/cOXRt3f3+f09NTAH766SdaWlrY29sDoLm5mevXr1cze25y9QypYoH8rH44PDwsIU/B6KOPPrLzcXBwQCQS4dNPPwXgxo0bfPzxx9XMnslGJ7h7hkX2GZOaBRKLxezjxcVFLl++zMTERBVz5JTBRseGy3zXIaEDEna5eAgENIX7WP2QTCaL/NrFlcFG0kMKLvIttsh6ilg83ATh85D3338/dGNrmo3SiAXYuvLgeImX9Rj4peHHqq5r165VOwt50mx0gjkqhJT92cvgol2P7O3thSa+VBiVyWTsJnhWsv4wBrZR5QWIjfzo6IitrS0vebxQ2tra0oPdPCbfQ4ze4gXII/VDPB73k9cLIYNtDnACUJ9td8gLkF2UiqkBxF2abc6AJOboD3lQzgWi1BWnCCgA7OzskEgk/Oa5bpVIJPTwT9+RCymoe4jvIkt+8Qs1cW1tzVem61kGm8jiKk1+gIE8eV25+Ihc3CjW19c9fr3+pdkkgwCiwsiL+oDyUKhXIE8QISUA2NzcbBRbihKJBJubm2rSD4h4KLLuOMMQRUiVn9XvdrGVTqcdg3wXXbFYTI9Op3qHuqlQHCoKSNadJNH7KGNbq6urjT4Jou+hRaVLIUoTE4zA6hD5Q5+oCXfv3vVxm/qSwQY7iG6C9BAZByWv6auOevgBIr3ke5mwsbFxofsl8XhcDw34BPgaYXg1KI0p6JlDRQPRiq0zRGQ1W/Pz827RPeta6XSa+fl5Pfl/5LxC3QrCAP9P4WYQcW2/kQm7u7usrKz4vF3tamVlRY/P+CPwLTlvcANiDN/kCYjiJXLv6AXNzc2xvb3t5ZY1re3tbebm5vRk2Vc7JReExgTDqFI8JIMIMvylTDw+PmZqaupCzCgmk0mmpqb0IJkHiLpV9Ypn5MA4oJimMDwD0eqSDCLIsD3WvL+/TzQaJZVKeb11zSiVShGNRvXgmE+Az8kVU8+UrSjvgNKCz8jxmaeIIMNyEoYHDx4wOztbwq3DrdnZWT1W1imi5XmCE0YKlyLLbYLPFxDlZhLKd4ggw/aJe/fusbi46Of2odbi4iL37t1TkzLAfxAzqmc4PcPkIQVVqofIfRrREVpXL4jFYnUFRQbB1PQIMZsqYaSUraiWlaqSQvxlV3rIFd2XEIsm/gL8Qb1ubGyMDz/8sGajzKVSKWZnZ3XPANHs/xxh+BSiyDrObifkirCiiisIDogK5TIwjvY6ijoMpHwEbCJAPCMHQIWhxl4sKmxsEEEwwQmlCQHlbeBV9do6CjX+DbBNDobqHSYYRQfCLDnimKEZfJbN0CpiENLOxf7+PhMTEywvL4d6mCWdTrO8vMzExIQOI4Pod31OPowTzHWHpz80kMjWyqpB6SXSU5oRQYbfARwVSA2+ruIU0ZrSK/ATnEBky8oxqlusnQMLNa4VXRa5Sr4JEYdwDPG8tkM18kKXJ+TmgWQ/Q3qDDsNTJa4r6NjvkA/lEsJTnkdEMX3J9N0Qv/LoAFFEyRaTbFFJGPK4ZBhQntdVgDuUZkTr6w2E1zgUspeC/YjoY3yPczgkZdhk568kGFC+F7qAE4qsU2S90owIpfo6ImCkUVV6bd4TxHzGtzgnmNThEN0rHK0pSngFUtleeeQCRa1XmhHN41eBAcRDka6qwIslU4jRhq/Jn8tQh0HUitttWtb3YvRyv4MKck8MyUeCZRGmeosMGPkiIshNpR72yCCW6hwgFiTI1pE0tDS6abDQ87BIMarEW9rAGUFNNot1MHL/HCIs3k1E8K9LAWfpDDEYepDd5Lopdc5b9Qx9r14nx/EgABhQASCQ109RizAdjApH9vhvIOJNvYCIFyJjhhSjNLlm6WMEgCS5tbbqAjbTlKsKwwTCHmCtmfcY2j/khCL3auwPNXyRGqOwifzQRq2IYk7dwDl8cYwwpjoqrRrSDYYKpdCaqpLrC5Oq8S5c+xCzx+hwTJtbEBdT3aMbUBpVXWvrtsnz+op1CNArVFXlbdEu3mICowJS9+cBsR/Exx2IaQG0af1tHggI1itUVft96vahsi/kOabPxQCRe93IaW3TAVQMhFRVgdiZMIORexOgQiDkXv3DdAObPMYIgAqBkAoFECmtJ+4Gp9Ax2rEORe51w+sQ7OOK17FhAqLKBY567AbBTSY4rsfVsktogagqACfvUpd0tz/SkR4GW9QEEFVBhtAI499ec0DqXf8H8f4X10jf2YAAAAAASUVORK5CYII=);
-    display: none;
-  }
-  </style>
-  <img id="input-event"/>
-</template><template id="tr-ui-e-chrome-cc-picture-debugger-template">
-  <left-panel>
-    <picture-info>
-      <div>
-        <span class="title">Skia Picture</span>
-        <span class="size"></span>
-      </div>
-      <div>
-        <input class="filename" type="text" value="skpicture.skp"/>
-        <button class="export">Export</button>
-      </div>
-    </picture-info>
-  </left-panel>
-  <right-panel>
-    <tr-ui-e-chrome-cc-picture-ops-chart-view>
-    </tr-ui-e-chrome-cc-picture-ops-chart-view>
-    <raster-area><canvas></canvas></raster-area>
-  </right-panel>
-</template><dom-module id="tr-ui-a-stack-frame">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: row;
-      align-items: center;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-event-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex: 0 1;
-      flex-direction: column;
-    }
-    #table {
-      flex: 0 1 auto;
-      align-self: stretch;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table">
-    </tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-chrome-cc-raster-task-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    #heading {
-      flex: 0 0 auto;
-    }
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-
-    <div id="heading">
-      Rasterization costs in
-      <tr-ui-a-analysis-link id="link"></tr-ui-a-analysis-link>
-    </div>
-    <tr-ui-b-table id="content"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-chrome-codesearch">
-  <template>
-    <style>
-      :host {
-        white-space: nowrap;
-      }
-      #codesearchLink {
-        font-size: x-small;
-        margin-left: 20px;
-        text-decoration: none;
-      }
-    </style>
-    <a id="codesearchLink" on-click="onClick" target="_blank">🔍</a>
-  </template>
-</dom-module><style>
-.tr-ui-e-chrome-gpu-state-snapshot-view{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAEwATABMYqp3KAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90JCQsBMCH7ZqYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAUElEQVRYw+3WwQkAIAiF4Vc0hTO5/wiuURvYIcQOv1cRPhDlDXffSsrMsrYiQi/zU80FAACAVX3nt3lWAABA/x+ovnPyAAAA5AHyAAAA3wMOd34Xd+lsglgAAAAASUVORK5CYII=);display:flex;overflow:auto}.tr-ui-e-chrome-gpu-state-snapshot-view img{display:block;margin:16px auto 16px auto}
-</style><dom-module id="tr-ui-a-layout-tree-sub-view">
-  <template>
-    <style>
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-    <div id="content"></div>
-  </template>
-</dom-module><template id="tr-ui-e-img-image-snapshot-view-template">
-  <style>
-    .image-info {
-      margin-bottom: 5px;
-    }
-
-    .image-info .title {
-      font-weight: bold;
-      margin-left: 5px;
-      margin-right: 5px;
-    }
-
-    .image-info .size {
-      margin-right: 5px;
-    }
-
-    .image-container {
-      min-height: 100px;
-      min-width: 200px;
-      overflow: auto;
-    }
-  </style>
-
-  <div class="image-info">
-    <span class="title">Image</span>
-    <span class="size">(unknown)</span>
-    <span class="instructions">
-      [ Drag with mouse to zoom in and out ]
-    </span>
-  </div>
-  <div class="image-container">
-    <img alt="Image snapshot"/>
-  </div>
-</template><dom-module id="tr-ui-e-s-frame-data-side-panel">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      width: 600px;
-      flex-direction: column;
-    }
-    table-container {
-      display: flex;
-      overflow: auto;
-      font-size: 12px;
-    }
-    </style>
-    <div>
-      Organize by:
-      <select id="select">
-        <option value="none">None</option>
-        <option value="tree">Frame Tree</option>
-      </select>
-    </div>
-    <table-container>
-      <tr-ui-b-table id="table"></tr-ui-b-table>
-    </table-container>
-  </template>
-</dom-module><dom-module id="tr-ui-b-chart-legend-key">
-  <template>
-    <style>
-      #checkbox {
-        margin: 0;
-        visibility: hidden;
-        vertical-align: text-top;
-      }
-      #label, #link {
-        white-space: nowrap;
-        text-overflow: ellipsis;
-        overflow: hidden;
-        display: inline-block;
-      }
-    </style>
-
-    <input checked="" id="checkbox" type="checkbox"/>
-    <tr-ui-a-analysis-link id="link"></tr-ui-a-analysis-link>
-    <label id="label"></label>
-  </template>
-</dom-module><template id="chart-base-template">
-  <svg> 
-    <g id="chart-area" xmlns="http://www.w3.org/2000/svg">
-      <g class="x axis"></g>
-      <g class="y axis"></g>
-      <text id="title"></text>
-    </g>
-  </svg>
-</template><dom-module id="tr-ui-e-s-input-latency-side-panel">
-  <template>
-    <style>
-    :host {
-      flex-direction: column;
-      display: flex;
-    }
-    toolbar {
-      flex: 0 0 auto;
-      border-bottom: 1px solid black;
-      display: flex;
-    }
-    result-area {
-      flex: 1 1 auto;
-      display: block;
-      min-height: 0;
-      overflow-y: auto;
-    }
-    </style>
-
-    <toolbar id="toolbar"></toolbar>
-    <result-area id="result_area"></result-area>
-  </template>
-</dom-module><dom-module id="tr-ui-b-heading">
-  <template>
-    <style>
-    :host {
-      background-color: rgb(243, 245, 247);
-      border-right: 1px solid #8e8e8e;
-      display: block;
-      height: 100%;
-      margin: 0;
-      padding: 0 5px 0 0;
-    }
-
-    heading {
-      display: block;
-      overflow-x: hidden;
-      text-align: left;
-      white-space: nowrap;
-    }
-
-    #arrow {
-      flex: 0 0 auto;
-      font-family: sans-serif;
-      margin-left: 5px;
-      margin-right: 5px;
-      width: 8px;
-    }
-
-    #link, #heading_content {
-      display: none;
-    }
-    </style>
-    <heading id="heading" on-click="onHeadingDivClicked_">
-      <span id="arrow"></span>
-      <span id="heading_content"></span>
-      <tr-ui-a-analysis-link id="link"></tr-ui-a-analysis-link>
-    </heading>
-  </template>
-</dom-module><style>
-.track-button{background-color:rgba(255,255,255,0.5);border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.2);font-size:10px;height:12px;text-align:center;width:12px}.track-button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.5);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.track-close-button{left:2px;position:absolute;top:2px}.track-collapse-button{left:3px;position:absolute;top:2px}
-</style><style>
-.object-instance-track{height:18px}
-</style><style>
-.tr-ui-e-system-stats-instance-track{height:500px}.tr-ui-e-system-stats-instance-track ul{list-style:none;list-style-position:outside;margin:0;overflow:hidden}
-</style><style>
-.tr-ui-e-system-stats-snapshot-view .subhead{font-size:small;padding-bottom:10px}.tr-ui-e-system-stats-snapshot-view ul{background-position:0 5px;background-repeat:no-repeat;cursor:pointer;font-family:monospace;list-style:none;margin:0;padding-left:15px}.tr-ui-e-system-stats-snapshot-view li{background-position:0 5px;background-repeat:no-repeat;cursor:pointer;list-style:none;margin:0;padding-left:15px}
-</style><dom-module id="tr-ui-e-v8-gc-objects-stats-table">
-  <template>
-    <style>
-    tr-ui-b-table {
-      flex: 0 0 auto;
-      align-self: stretch;
-      margin-top: 1em;
-      font-size: 12px;
-    }
-    .diff {
-      display: inline-block;
-      margin-top: 1em;
-      margin-left: 0.8em;
-    }
-    </style>
-    <div class="diff" id="diffOption">
-      Diff
-    </div>
-    <tr-ui-b-table id="diffTable"></tr-ui-b-table>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-multi-v8-gc-stats-thread-slice-sub-view">
-  <template>
-    <style>
-    </style>
-    <tr-ui-e-v8-gc-objects-stats-table id="gcObjectsStats">
-    </tr-ui-e-v8-gc-objects-stats-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-v8-ic-stats-table">
-  <template>
-    <style>
-    tr-ui-b-table {
-      flex: 0 0 auto;
-      align-self: stretch;
-      margin-top: 1em;
-      font-size: 12px;
-    }
-    #total {
-      margin-top: 1em;
-      margin-left: 0.8em;
-    }
-    #groupOption {
-      display: inline-block;
-      margin-top: 1em;
-      margin-left: 0.8em;
-    }
-    </style>
-    <div style="padding-right: 200px">
-      <div style="float:right;  border-style: solid; border-width: 1px; padding:20px">
-        X no feedback<br/>
-        0 uninitialized<br/>
-        . premonomorphic<br/>
-        1 monomorphic<br/>
-        ^ recompute handler<br/>
-        P polymorphic<br/>
-        N megamorphic<br/>
-        G generic
-      </div>
-    </div>
-    <div id="total">
-    </div>
-    <div id="groupOption">
-      Group Key
-    </div>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-multi-v8-ic-stats-thread-slice-sub-view">
-  <template>
-    <tr-ui-e-v8-ic-stats-table id="table">
-    </tr-ui-e-v8-ic-stats-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-v8-runtime-call-stats-table">
-  <template>
-    <style>
-    #table, #blink_rcs_table {
-      flex: 0 0 auto;
-      align-self: stretch;
-      margin-top: 1em;
-      font-size: 12px;
-    }
-
-    #v8_rcs_heading, #blink_rcs_heading {
-        padding-top: 1em;
-        font-size: 18px;
-    }
-    </style>
-    <h1 id="v8_rcs_heading"></h1>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-    <h1 id="blink_rcs_heading"></h1>
-    <tr-ui-b-table id="blink_rcs_table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-multi-v8-thread-slice-sub-view">
-  <template>
-    <tr-ui-a-multi-thread-slice-sub-view id="content"></tr-ui-a-multi-thread-slice-sub-view>
-    <tr-ui-e-v8-runtime-call-stats-table id="runtimeCallStats"></tr-ui-e-v8-runtime-call-stats-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-single-v8-gc-stats-thread-slice-sub-view">
-  <template>
-    <tr-ui-a-single-event-sub-view id="content"></tr-ui-a-single-event-sub-view>
-    <tr-ui-e-v8-gc-objects-stats-table id="gcObjectsStats"></tr-ui-e-v8-gc-objects-stats-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-single-v8-ic-stats-thread-slice-sub-view">
-  <template>
-    <tr-ui-e-v8-ic-stats-table id="table">
-    </tr-ui-e-v8-ic-stats-table>
-  </template>
-</dom-module><dom-module id="tr-ui-e-single-v8-thread-slice-sub-view">
-  <template>
-    <tr-ui-a-single-thread-slice-sub-view id="content"></tr-ui-a-single-thread-slice-sub-view>
-    <tr-ui-e-v8-runtime-call-stats-table id="runtimeCallStats"></tr-ui-e-v8-runtime-call-stats-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-alert-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    #table {
-      flex: 1 1 auto;
-      align-self: stretch;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table">
-    </tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-b-tab-view">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-
-      #selection_description, #tabs {
-        font-size: 12px;
-      }
-
-      #selection_description {
-        display: inline-block;
-        font-weight: bold;
-        margin: 9px 0px 4px 20px;
-      }
-
-      #tabs {
-        flex: 0 0 auto;
-        border-top: 1px solid #8e8e8e;
-        border-bottom: 1px solid #8e8e8e;
-        background-color: #ececec;
-        overflow: hidden;
-        margin: 0;
-      }
-
-      #tabs input[type=radio] {
-        display: none;
-      }
-
-      #tabs tab label {
-        cursor: pointer;
-        display: inline-block;
-        border: 1px solid #ececec;
-        margin: 5px 0px 0px 15px;
-        padding: 3px 10px 3px 10px;
-      }
-
-      #tabs tab label span {
-        font-weight: bold;
-      }
-
-      #tabs:focus input[type=radio]:checked ~ label {
-        outline: dotted 1px #8e8e8e;
-        outline-offset: -2px;
-      }
-
-      #tabs input[type=radio]:checked ~ label {
-        background-color: white;
-        border: 1px solid #8e8e8e;
-        border-bottom: 1px solid white;
-      }
-
-      #subView {
-        flex: 1 1 auto;
-        min-width: 0;
-        display: flex;
-      }
-
-      #subView > * {
-        flex: 1 1 auto;
-        min-width: 0;
-      }
-    </style>
-    <div hidden="[[tabsHidden]]" id="tabs">
-      <label id="selection_description">[[label_]]</label>
-      <template is="dom-repeat" items="[[subViews_]]">
-        <tab>
-          <input checked="[[isChecked_(item)]]" id$="[[computeRadioId_(item)]]" name="tabs" on-change="onTabChanged_" type="radio"/>
-          <label for$="[[computeRadioId_(item)]]">
-            <template if="[[item.tabIcon]]" is="dom-if">
-              <span style$="[[item.tabIcon.style]]">[[item.tabIcon.text]]</span>
-            </template>
-            [[item.tabLabel]]
-          </label>
-        </tab>
-      </template>
-    </div>
-    <div id="subView"></div>
-    <slot>
-    </slot>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-breakdown-view">
-  <template>
-    <tr-ui-b-tab-view id="tabs"></tr-ui-b-tab-view>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-breakdown-view-tab">
-  <template>
-    <tr-v-ui-scalar-context-controller></tr-v-ui-scalar-context-controller>
-    <tr-ui-b-info-bar hidden="" id="info"></tr-ui-b-info-bar>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-path-view">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-    </style>
-    <tr-v-ui-scalar-context-controller></tr-v-ui-scalar-context-controller>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-pane">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-
-      #header {
-        flex: 0 0 auto;
-        display: flex;
-        flex-direction: row;
-        align-items: center;
-
-        background-color: #eee;
-        border-bottom: 1px solid #8e8e8e;
-        border-top: 1px solid white;
-      }
-
-      #label {
-        flex: 1 1 auto;
-        padding: 8px;
-        font-size: 15px;
-        font-weight: bold;
-      }
-
-      #view_mode_container {
-        display: none;
-        flex: 0 0 auto;
-        padding: 5px;
-        font-size: 15px;
-      }
-
-      #contents {
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-      }
-
-      #info_text {
-        padding: 8px;
-        color: #666;
-        font-style: italic;
-        text-align: center;
-      }
-
-      #split_view {
-        display: none;  /* Hide until memory allocator dumps are set. */
-        flex: 1 0 auto;
-        align-self: stretch;
-        flex-direction: row;
-      }
-
-      #path_view {
-        width: 50%;
-      }
-
-      #breakdown_view {
-        flex: 1 1 auto;
-        width: 0;
-      }
-
-      #path_view, #breakdown_view {
-        overflow-x: auto;  /* Show scrollbar if necessary. */
-      }
-    </style>
-    <div id="header">
-      <div id="label">Heap details</div>
-      <div id="view_mode_container">
-        <span>View mode:</span>
-        
-      </div>
-    </div>
-    <div id="contents">
-      <tr-ui-b-info-bar hidden="" id="info_bar">
-      </tr-ui-b-info-bar>
-
-      <div id="info_text">No heap dump selected</div>
-
-      <div id="split_view">
-        <tr-ui-a-memory-dump-heap-details-path-view id="path_view">
-        </tr-ui-a-memory-dump-heap-details-path-view>
-        <tr-ui-b-drag-handle id="drag_handle"></tr-ui-b-drag-handle>
-        <tr-ui-a-memory-dump-heap-details-breakdown-view id="breakdown_view">
-        </tr-ui-a-memory-dump-heap-details-breakdown-view>
-      </div>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-allocator-details-pane">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-
-      #label {
-        flex: 0 0 auto;
-        padding: 8px;
-
-        background-color: #eee;
-        border-bottom: 1px solid #8e8e8e;
-        border-top: 1px solid white;
-
-        font-size:  15px;
-        font-weight: bold;
-      }
-
-      #contents {
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-      }
-
-      #info_text {
-        padding: 8px;
-        color: #666;
-        font-style: italic;
-        text-align: center;
-      }
-
-      #table {
-        display: none;  /* Hide until memory allocator dumps are set. */
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-      }
-    </style>
-    <div id="label">Component details</div>
-    <div id="contents">
-      <div id="info_text">No memory allocator dump selected</div>
-      <tr-ui-b-table id="table"></tr-ui-b-table>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-vm-regions-details-pane">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-
-      #label {
-        flex: 0 0 auto;
-        padding: 8px;
-
-        background-color: #eee;
-        border-bottom: 1px solid #8e8e8e;
-        border-top: 1px solid white;
-
-        font-size:  15px;
-        font-weight: bold;
-      }
-
-      #contents {
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-      }
-
-      #info_text {
-        padding: 8px;
-        color: #666;
-        font-style: italic;
-        text-align: center;
-      }
-
-      #table {
-        display: none;  /* Hide until memory dumps are set. */
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-      }
-    </style>
-    <div id="label">Memory maps</div>
-    <div id="contents">
-      <div id="info_text">No memory maps selected</div>
-      <tr-ui-b-table id="table"></tr-ui-b-table>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-b-color-legend">
-  <template>
-    <style>
-    :host {
-      display: inline-block;
-    }
-
-    #square {
-      font-size: 150%;  /* Make the square bigger. */
-      line-height: 0%;  /* Prevent the square from increasing legend height. */
-    }
-    </style>
-    <span id="square"></span>
-    <span id="label"></span>
-  </template>
-</dom-module><dom-module id="tr-ui-b-view-specific-brushing-state">
-  <template></template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-overview-pane">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: column;
-      }
-
-      #label {
-        flex: 0 0 auto;
-        padding: 8px;
-
-        background-color: #eee;
-        border-bottom: 1px solid #8e8e8e;
-        border-top: 1px solid white;
-
-        font-size:  15px;
-        font-weight: bold;
-      }
-
-      #label a {
-        font-weight: normal;
-        float: right;
-      }
-
-      #contents {
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-        overflow: auto;
-      }
-
-      #info_text {
-        padding: 8px;
-        color: #666;
-        font-style: italic;
-        text-align: center;
-      }
-
-      #table {
-        display: none;  /* Hide until memory dumps are set. */
-        flex: 1 0 auto;
-        align-self: stretch;
-        font-size: 12px;
-      }
-    </style>
-    <tr-ui-b-view-specific-brushing-state id="state" view-id="analysis.memory_dump_overview_pane">
-    </tr-ui-b-view-specific-brushing-state>
-    <div id="label">Overview <a href="https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra">Help</a></div>
-    <div id="contents">
-      <div id="info_text">No memory memory dumps selected</div>
-      <tr-ui-b-table id="table"></tr-ui-b-table>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-memory-dump-header-pane">
-  <template>
-    <style>
-      :host {
-        display: flex;
-        flex-direction: row;
-        align-items: center;
-
-        background-color: #d0d0d0;
-        border-bottom: 1px solid #8e8e8e;
-        border-top: 1px solid white;
-      }
-
-      #label {
-        flex: 1 1 auto;
-        padding: 6px;
-        font-size: 15px;
-      }
-
-      #aggregation_mode_container {
-        display: none;
-        flex: 0 0 auto;
-        padding: 5px;
-        font-size: 15px;
-      }
-    </style>
-    
-    <div id="label"></div>
-    <div id="aggregation_mode_container">
-      <span>Metric aggregation:</span>
-      
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-stacked-pane-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-
-    #pane_container > * {
-      flex: 0 0 auto;
-    }
-    </style>
-    <div id="pane_container">
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-container-memory-dump-sub-view">
-  <template>
-    <style>
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-    <div id="content"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-counter-sample-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-event-summary-table">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #table {
-      flex: 1 1 auto;
-      align-self: stretch;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table">
-    </tr-ui-b-table>
-    
-  </template>
-</dom-module><dom-module id="tr-ui-a-selection-summary-table">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #table {
-      flex: 1 1 auto;
-      align-self: stretch;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table">
-    </tr-ui-b-table>
-    
-  </template>
-</dom-module><dom-module id="tr-ui-b-radio-picker">
-  <template>
-    <style>
-    :host([vertical]) #container {
-      flex-direction: column;
-    }
-    :host(:not[vertical]) #container {
-      flex-direction: row;
-    }
-    #container {
-      display: flex;
-    }
-    #container > div {
-      padding-left: 1em;
-      padding-bottom: 0.5em;
-    }
-    </style>
-    <div id="container"></div>
-  </template>
-</dom-module><dom-module id="tr-v-ui-breakdown-span">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    #table_container {
-      display: flex;
-      flex: 0 0 auto;
-    }
-    #table {
-      max-height: 150px;
-      overflow-y: auto;
-    }
-    </style>
-
-    <div id="empty">(empty)</div>
-    <div id="table_container">
-      <div id="container"></div>
-      <span>
-        <tr-ui-b-table id="table"></tr-ui-b-table>
-      </span>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-v-ui-collected-related-event-set-span">
-</dom-module><dom-module id="tr-v-ui-date-range-span">
-  <template>
-    <content></content>
-  </template>
-</dom-module><dom-module id="tr-v-ui-generic-set-span">
-  <template>
-    <style>
-      a {
-        display: block;
-      }
-    </style>
-
-    <tr-ui-a-generic-object-view id="generic"></tr-ui-a-generic-object-view>
-
-    <div id="links"></div>
-  </template>
-</dom-module><dom-module id="tr-v-ui-related-event-set-span">
-</dom-module><dom-module id="tr-v-ui-scalar-diagnostic-span">
-  <template>
-    <tr-v-ui-scalar-span id="scalar"></tr-v-ui-scalar-span>
-  </template>
-</dom-module><dom-module id="tr-v-ui-unmergeable-diagnostic-set-span">
-</dom-module><dom-module id="tr-v-ui-diagnostic-map-table">
-  <template>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-v-ui-scalar-map-table">
-  <template>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-v-ui-histogram-span">
-  <template>
-    <style>
-    #container {
-      display: flex;
-      flex-direction: row;
-      justify-content: space-between;
-    }
-    #chart {
-      flex-grow: 1;
-      display: none;
-    }
-    #drag_handle, #diagnostics_tab_templates {
-      display: none;
-    }
-    #chart svg {
-      display: block;
-    }
-    #stats_container {
-      overflow-y: auto;
-    }
-    </style>
-
-    <div id="container">
-      <div id="chart"></div>
-      <div id="stats_container">
-        <tr-v-ui-scalar-map-table id="stats"></tr-v-ui-scalar-map-table>
-      </div>
-    </div>
-    <tr-ui-b-drag-handle id="drag_handle"></tr-ui-b-drag-handle>
-
-    <tr-ui-b-tab-view id="diagnostics"></tr-ui-b-tab-view>
-
-    <div id="diagnostics_tab_templates">
-      <tr-v-ui-diagnostic-map-table id="metric_diagnostics"></tr-v-ui-diagnostic-map-table>
-
-      <tr-v-ui-diagnostic-map-table id="metadata_diagnostics"></tr-v-ui-diagnostic-map-table>
-
-      <div id="sample_diagnostics_container">
-        <div id="merge_sample_diagnostics_container">
-          <input checked="" id="merge_sample_diagnostics" on-change="updateDiagnostics_" type="checkbox"/>
-          <label for="merge_sample_diagnostics">Merge Sample Diagnostics</label>
-        </div>
-        <tr-v-ui-diagnostic-map-table id="sample_diagnostics"></tr-v-ui-diagnostic-map-table>
-      </div>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-event-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      overflow: auto;
-    }
-    #content {
-      display: flex;
-      flex-direction: column;
-      flex: 0 1 auto;
-      align-self: stretch;
-    }
-    #content > * {
-      flex: 0 0 auto;
-      align-self: stretch;
-    }
-    #histogramContainer {
-      display: flex;
-    }
-
-    tr-ui-a-multi-event-summary-table {
-      border-bottom: 1px solid #aaa;
-    }
-
-    tr-ui-a-selection-summary-table  {
-      margin-top: 1.25em;
-      border-top: 1px solid #aaa;
-      background-color: #eee;
-      font-weight: bold;
-      margin-bottom: 1.25em;
-      border-bottom: 1px solid #aaa;
-    }
-    </style>
-    <div id="content">
-      <tr-ui-a-multi-event-summary-table id="eventSummaryTable">
-      </tr-ui-a-multi-event-summary-table>
-      <tr-ui-a-selection-summary-table id="selectionSummaryTable">
-      </tr-ui-a-selection-summary-table>
-      <tr-ui-b-radio-picker id="radioPicker">
-      </tr-ui-b-radio-picker>
-      <div id="histogramContainer">
-        <tr-v-ui-histogram-span id="histogramSpan">
-        </tr-v-ui-histogram-span>
-      </div>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-related-events">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    #table {
-      flex: 1 1 auto;
-      align-self: stretch;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-async-slice-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #container {
-      display: flex;
-      flex: 1 1 auto;
-    }
-    #events {
-      margin-left: 8px;
-      flex: 0 1 200px;
-    }
-    </style>
-    <div id="container">
-      <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
-      <div id="events">
-        <tr-ui-a-related-events id="relatedEvents"></tr-ui-a-related-events>
-      </div>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-cpu-slice-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #content {
-      flex: 1 1 auto;
-    }
-    </style>
-    <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-flow-event-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    </style>
-    <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-instant-event-sub-view">
-  <template>
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-    <div id="content"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-object-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="content"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-frame-power-usage-chart">
-  <template>
-    <div id="content"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-power-sample-summary-table">
-  <template>
-    <style>
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-power-sample-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: row;
-    }
-    #tables {
-      display: flex;
-      flex-direction: column;
-      width: 50%;
-    }
-    #chart {
-      width: 50%;
-    }
-    </style>
-    <div id="tables">
-      <tr-ui-a-power-sample-summary-table id="summaryTable">
-      </tr-ui-a-power-sample-summary-table>
-    </div>
-    <tr-ui-a-frame-power-usage-chart id="chart">
-    </tr-ui-a-frame-power-usage-chart>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-sample-sub-view">
-  <template>
-    <style>
-    :host { display: block; }
-    #control {
-      background-color: #e6e6e6;
-      background-image: -webkit-gradient(linear, 0 0, 0 100%,
-                                         from(#E5E5E5), to(#D1D1D1));
-      flex: 0 0 auto;
-      overflow-x: auto;
-    }
-    #control::-webkit-scrollbar { height: 0px; }
-    #control {
-      font-size: 12px;
-      display: flex;
-      flex-direction: row;
-      align-items: stretch;
-      margin: 1px;
-      margin-right: 2px;
-    }
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-    <div id="control">
-      Sample View Option
-    </div>
-    <tr-ui-b-table id="table">
-    </tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-thread-slice-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #content {
-      display: flex;
-      flex: 1 1 auto;
-      min-width: 0;
-    }
-    #content > tr-ui-a-related-events {
-      margin-left: 8px;
-      flex: 0 1 200px;
-    }
-    </style>
-    <div id="content"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-thread-time-slice-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #content {
-      flex: 1 1 auto;
-      min-width: 0;
-    }
-    </style>
-    <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
-  </template>
-</dom-module><dom-module id="tr-ui-a-user-expectation-related-samples-table">
-  <template>
-    <style>
-    #table {
-      flex: 1 1 auto;
-      align-self: stretch;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-multi-user-expectation-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex: 1 1 auto;
-    }
-    #events {
-      margin-left: 8px;
-      flex: 0 1 200px;
-    }
-    </style>
-    <tr-ui-a-multi-event-sub-view id="realView"></tr-ui-a-multi-event-sub-view>
-    <div id="events">
-      <tr-ui-a-user-expectation-related-samples-table id="relatedSamples"></tr-ui-a-user-expectation-related-samples-table>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-async-slice-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: row;
-    }
-    #events {
-      display:flex;
-      flex-direction: column;
-    }
-    </style>
-    <tr-ui-a-single-event-sub-view id="content"></tr-ui-a-single-event-sub-view>
-    <div id="events">
-      <tr-ui-a-related-events id="relatedEvents"></tr-ui-a-related-events>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-cpu-slice-sub-view">
-  <template>
-    <style>
-    table {
-      border-collapse: collapse;
-      border-width: 0;
-      margin-bottom: 25px;
-      width: 100%;
-    }
-
-    table tr > td:first-child {
-      padding-left: 2px;
-    }
-
-    table tr > td {
-      padding: 2px 4px 2px 4px;
-      vertical-align: text-top;
-      width: 150px;
-    }
-
-    table td td {
-      padding: 0 0 0 0;
-      width: auto;
-    }
-    tr {
-      vertical-align: top;
-    }
-
-    tr:nth-child(2n+0) {
-      background-color: #e2e2e2;
-    }
-    </style>
-    <table>
-      <tbody><tr>
-        <td>Running process:</td><td id="process-name"></td>
-      </tr>
-      <tr>
-        <td>Running thread:</td><td id="thread-name"></td>
-      </tr>
-      <tr>
-        <td>Start:</td>
-        <td>
-          <tr-v-ui-scalar-span id="start">
-          </tr-v-ui-scalar-span>
-        </td>
-      </tr>
-      <tr>
-        <td>Duration:</td>
-        <td>
-          <tr-v-ui-scalar-span id="duration">
-          </tr-v-ui-scalar-span>
-        </td>
-      </tr>
-      <tr>
-        <td>Active slices:</td><td id="running-thread"></td>
-      </tr>
-      <tr>
-        <td>Args:</td>
-        <td>
-          <tr-ui-a-generic-object-view id="args">
-          </tr-ui-a-generic-object-view>
-        </td>
-      </tr>
-    </tbody></table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-flow-event-sub-view">
-  <template>
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-    <tr-ui-a-single-event-sub-view id="singleEventSubView">
-    </tr-ui-a-single-event-sub-view>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-frame-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    #asv {
-      flex: 0 0 auto;
-      align-self: stretch;
-    }
-    </style>
-    <tr-ui-a-alert-sub-view id="asv">
-    </tr-ui-a-alert-sub-view>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-instant-event-sub-view">
-  <template>
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-    <div id="content"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-object-instance-sub-view">
-  <template>
-    <style>
-    :host {
-      display: block;
-    }
-
-    #snapshots > * {
-      display: block;
-    }
-
-    :host {
-      overflow: auto;
-      display: block;
-    }
-
-    * {
-      -webkit-user-select: text;
-    }
-
-    .title {
-      border-bottom: 1px solid rgb(128, 128, 128);
-      font-size: 110%;
-      font-weight: bold;
-    }
-
-    td, th {
-      font-family: monospace;
-      vertical-align: top;
-    }
-    </style>
-    <div id="content"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-object-snapshot-sub-view">
-  <template>
-    <style>
-    #args {
-      white-space: pre;
-    }
-
-    :host {
-      overflow: auto;
-      display: flex;
-    }
-
-    ::content * {
-      -webkit-user-select: text;
-    }
-
-    ::content .title {
-      border-bottom: 1px solid rgb(128, 128, 128);
-      font-size: 110%;
-      font-weight: bold;
-    }
-
-    ::content td, th {
-      font-family: monospace;
-      vertical-align: top;
-    }
-    </style>
-    <slot></slot>
-  </template>
-</dom-module><dom-module id="tr-ui-a-power-sample-table">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-power-sample-sub-view">
-  <template>
-    <style>
-    :host { display: block; }
-    </style>
-    <tr-ui-a-power-sample-table id="samplesTable">
-    </tr-ui-a-power-sample-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-sample-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="content"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-thread-slice-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: row;
-    }
-    #events {
-      display: flex;
-      flex-direction: column;
-    }
-
-    </style>
-    <tr-ui-a-single-event-sub-view id="content"></tr-ui-a-single-event-sub-view>
-    <div id="events">
-      <tr-ui-a-related-events id="relatedEvents">
-      </tr-ui-a-related-events>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-thread-time-slice-sub-view">
-  <template>
-    <style>
-    table {
-      border-collapse: collapse;
-      border-width: 0;
-      margin-bottom: 25px;
-      width: 100%;
-    }
-
-    table tr > td:first-child {
-      padding-left: 2px;
-    }
-
-    table tr > td {
-      padding: 2px 4px 2px 4px;
-      vertical-align: text-top;
-      width: 150px;
-    }
-
-    table td td {
-      padding: 0 0 0 0;
-      width: auto;
-    }
-    tr {
-      vertical-align: top;
-    }
-
-    tr:nth-child(2n+0) {
-      background-color: #e2e2e2;
-    }
-    </style>
-    <table>
-      <tbody><tr>
-        <td>Running process:</td><td id="process-name"></td>
-      </tr>
-      <tr>
-        <td>Running thread:</td><td id="thread-name"></td>
-      </tr>
-      <tr>
-        <td>State:</td>
-        <td><b><span id="state"></span></b></td>
-      </tr>
-      <tr>
-        <td>Start:</td>
-        <td>
-          <tr-v-ui-scalar-span id="start">
-          </tr-v-ui-scalar-span>
-        </td>
-      </tr>
-      <tr>
-        <td>Duration:</td>
-        <td>
-          <tr-v-ui-scalar-span id="duration">
-          </tr-v-ui-scalar-span>
-        </td>
-      </tr>
-
-      <tr>
-        <td>On CPU:</td><td id="on-cpu"></td>
-      </tr>
-
-      <tr>
-        <td>Running instead:</td><td id="running-instead"></td>
-      </tr>
-
-      <tr>
-        <td>Args:</td><td id="args"></td>
-      </tr>
-    </tbody></table>
-  </template>
-</dom-module><dom-module id="tr-ui-a-single-user-expectation-sub-view">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: row;
-    }
-    #events {
-      display: flex;
-      flex-direction: column;
-    }
-    </style>
-    <tr-ui-a-single-event-sub-view id="realView"></tr-ui-a-single-event-sub-view>
-    <div id="events">
-      <tr-ui-a-user-expectation-related-samples-table id="relatedSamples"></tr-ui-a-user-expectation-related-samples-table>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-a-analysis-view">
-  <template>
-    <style>
-      :host {
-        background-color: white;
-        display: flex;
-        flex-direction: column;
-        height: 275px;
-        overflow: auto;
-      }
-
-      :host(.tall-mode) {
-        height: 525px;
-      }
-    </style>
-    <slot></slot>
-  </template>
-</dom-module><dom-module id="tr-ui-b-dropdown">
-  <template>
-    <style>
-    button {
-      @apply --dropdown-button;
-    }
-    button.open {
-      @apply --dropdown-button-open;
-    }
-    dialog {
-      position: absolute;
-      margin: 0;
-      padding: 1em;
-      border: 1px solid darkgrey;
-      @apply --dropdown-dialog;
-    }
-    </style>
-
-    <button id="button" on-tap="open">[[label]]</button>
-
-    <dialog id="dialog" on-cancel="close" on-tap="onDialogTap_">
-      <slot></slot>
-    </dialog>
-  </template>
-</dom-module><dom-module id="tr-ui-b-info-bar-group">
-  <template>
-    <style>
-    :host {
-      flex: 0 0 auto;
-      flex-direction: column;
-      display: flex;
-    }
-    </style>
-    <div id="messages"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-b-toolbar-button">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      background-color: #f8f8f8;
-      border: 1px solid rgba(0, 0, 0, 0.5);
-      color: rgba(0,0,0,0.8);
-      justify-content: center;
-      align-self: stretch;
-      min-width: 23px;
-    }
-
-    :host(:hover) {
-      background-color: rgba(255, 255, 255, 1.0);
-      border-color: rgba(0, 0, 0, 0.8);
-      box-shadow: 0 0 .05em rgba(0, 0, 0, 0.4);
-      color: rgba(0, 0, 0, 1);
-    }
-
-    #aligner {
-      display: flex;
-      flex: 0 0 auto;
-      align-self: center;
-    }
-    </style>
-    <div id="aligner">
-      <slot></slot>
-    </div>
-  </template>
-</dom-module><style>
-.drawing-container{display:inline;overflow:auto;overflow-x:hidden;position:relative}.drawing-container-canvas{display:block;pointer-events:none;position:absolute;top:0}
-</style><style>
-.letter-dot-track {
-  height: 18px;
-}
-</style><style>
-.chart-track {
-  height: 30px;
-  position: relative;
-}
-</style><style>
-.cpu-usage-track {
-  height: 90px;
-}
-</style><style>
-.power-series-track {
-  height: 90px;
-}
-</style><style>
-.spacing-track{height:4px}
-</style><style>
-.rect-track{height:18px}
-</style><style>
-.thread-track{flex-direction:column;display:flex;position:relative}
-</style><style>
-.process-track-header{display:flex;flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#E5E5E5),to(#D1D1D1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;font-size:75%}.process-track-name{flex-grow:1}.process-track-name:before{content:'\25B8';padding:0 5px}.process-track-base.expanded .process-track-name:before{content:'\25BE'}.process-track-close{color:black;border:1px solid transparent;padding:0px 2px}.process-track-close:hover{border:1px solid grey}
-</style><style>
-.model-track {
-  flex-grow: 1;
-}
-</style><style>
-.x-axis-track {
-  height: 12px;
-}
-
-.x-axis-track.tall-mode {
-  height: 30px;
-}
-</style><dom-module id="tr-ui-timeline-track-view">
-  <template>
-    <style>
-    :host {
-      flex-direction: column;
-      display: flex;
-      position: relative;
-    }
-
-    :host ::content * {
-      -webkit-user-select: none;
-      cursor: default;
-    }
-
-    #drag_box {
-      background-color: rgba(0, 0, 255, 0.25);
-      border: 1px solid rgb(0, 0, 96);
-      font-size: 75%;
-      position: fixed;
-    }
-
-    #hint_text {
-      position: absolute;
-      bottom: 6px;
-      right: 6px;
-      font-size: 8pt;
-    }
-    </style>
-    <slot></slot>
-
-    <div id="drag_box"></div>
-    <div id="hint_text"></div>
-
-    <tv-ui-b-hotkey-controller id="hotkey_controller">
-    </tv-ui-b-hotkey-controller>
-  </template>
-</dom-module><dom-module id="tr-ui-find-control">
-  <template>
-    <style>
-      :host {
-        -webkit-user-select: none;
-        display: flex;
-        position: relative;
-      }
-      input {
-        -webkit-user-select: auto;
-        background-color: #f8f8f8;
-        border: 1px solid rgba(0, 0, 0, 0.5);
-        box-sizing: border-box;
-        margin: 0;
-        padding: 0;
-        width: 170px;
-      }
-      input:focus {
-        background-color: white;
-      }
-      tr-ui-b-toolbar-button {
-        border-left: none;
-        margin: 0;
-      }
-      #hitCount {
-        left: 0;
-        opacity: 0.25;
-        pointer-events: none;
-        position: absolute;
-        text-align: right;
-        top: 2px;
-        width: 167px;
-        z-index: 1;
-      }
-      #spinner {
-        visibility: hidden;
-        width: 8px;
-        height: 8px;
-        left: 154px;
-        pointer-events: none;
-        position: absolute;
-        top: 4px;
-        z-index: 1;
-
-        border: 2px solid transparent;
-        border-bottom: 2px solid rgba(0, 0, 0, 0.5);
-        border-right: 2px solid rgba(0, 0, 0, 0.5);
-        border-radius: 50%;
-      }
-      @keyframes spin { 100% { transform: rotate(360deg); } }
-    </style>
-
-    <input id="filter" on-blur="filterBlur" on-focus="filterFocus" on-input="filterTextChanged" on-keydown="filterKeyDown" on-mouseup="filterMouseUp" type="text"/>
-    <div id="spinner"></div>
-    <tr-ui-b-toolbar-button on-click="findPrevious">
-      ←
-    </tr-ui-b-toolbar-button>
-    <tr-ui-b-toolbar-button on-click="findNext">
-      →
-    </tr-ui-b-toolbar-button>
-    <div id="hitCount">0 of 0</div>
-  </template>
-</dom-module><dom-module id="tr-ui-scripting-control">
-  <template>
-    <style>
-      :host {
-        flex: 1 1 auto;
-      }
-      .root {
-        font-family: monospace;
-        cursor: text;
-
-        padding: 2px;
-        margin: 2px;
-        border: 1px solid rgba(0, 0, 0, 0.5);
-        background: white;
-
-        height: 100px;
-        overflow-y: auto;
-
-        transition-property: opacity, height, padding, margin;
-        transition-duration: .2s;
-        transition-timing-function: ease-out;
-      }
-      .hidden {
-        margin-top: 0px;
-        margin-bottom: 0px;
-        padding-top: 0px;
-        padding-bottom: 0px;
-        height: 0px;
-        opacity: 0;
-      }
-      .focused {
-        outline: auto 5px -webkit-focus-ring-color;
-      }
-      #history {
-        -webkit-user-select: text;
-        color: #777;
-      }
-      #promptContainer {
-        display: flex;
-      }
-      #promptMark {
-        width: 1em;
-        color: #468;
-      }
-      #prompt {
-        flex: 1;
-        width: 100%;
-        border: none !important;
-        background-color: inherit !important;
-        font: inherit !important;
-        text-overflow: clip !important;
-        text-decoration: none !important;
-      }
-      #prompt:focus {
-        outline: none;
-      }
-    </style>
-
-    <div class="root hidden" id="root" on-focus="onConsoleFocus" tabindex="0">
-      <div id="history"></div>
-      <div id="promptContainer">
-        <span id="promptMark">&gt;</span>
-        <input id="prompt" on-blur="onConsoleBlur" on-keydown="promptKeyDown" on-keypress="promptKeyPress" type="text"/>
-       </div>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-side-panel-container">
-  <template>
-    <style>
-    :host {
-      align-items: stretch;
-      display: flex;
-      background-color: white;
-    }
-
-    :host([expanded]) > #side_panel_drag_handle,
-    :host([expanded]) > active-panel-container {
-      flex: 1 1 auto;
-      border-left: 1px solid black;
-      display: flex;
-    }
-
-    :host(:not([expanded])) > #side_panel_drag_handle,
-    :host(:not([expanded])) > active-panel-container {
-      display: none;
-    }
-
-    active-panel-container {
-      display: flex;
-    }
-
-    tab-strip {
-      flex: 0 0 auto;
-      flex-direction: column;
-      -webkit-user-select: none;
-      background-color: rgb(236, 236, 236);
-      border-left: 1px solid black;
-      cursor: default;
-      display: flex;
-      min-width: 18px; /* workaround for flexbox and writing-mode mixing bug */
-      padding: 10px 0 10px 0;
-      font-size: 12px;
-    }
-
-    tab-strip > tab-strip-label {
-      flex-shrink: 0;
-      -webkit-writing-mode: vertical-rl;
-      white-space: nowrap;
-      display: inline;
-      margin-right: 1px;
-      min-height: 20px;
-      padding: 15px 3px 15px 1px;
-    }
-
-    tab-strip >
-        tab-strip-label:not([enabled]) {
-      color: rgb(128, 128, 128);
-    }
-
-    tab-strip > tab-strip-label[selected] {
-      background-color: white;
-      border: 1px solid rgb(163, 163, 163);
-      border-left: none;
-      padding: 14px 2px 14px 1px;
-    }
-
-    #active_panel_container {
-      overflow: auto;
-    }
-    </style>
-
-    <tr-ui-b-drag-handle id="side_panel_drag_handle"></tr-ui-b-drag-handle>
-    <active-panel-container id="active_panel_container">
-    </active-panel-container>
-    <tab-strip id="tab_strip"></tab-strip>
-  </template>
-</dom-module><dom-module id="tr-ui-timeline-view-help-overlay">
-  <template>
-    <style>
-    :host {
-      flex: 1 1 auto;
-      flex-direction: row;
-      display: flex;
-      width: 700px;
-    }
-    .column {
-      width: 50%;
-    }
-    h2 {
-      font-size: 1.2em;
-      margin: 0;
-      margin-top: 5px;
-      text-align: center;
-    }
-    h3 {
-      margin: 0;
-      margin-left: 126px;
-      margin-top: 10px;
-    }
-    .pair {
-      flex: 1 1 auto;
-      flex-direction: row;
-      display: flex;
-    }
-    .command {
-      font-family: monospace;
-      margin-right: 5px;
-      text-align: right;
-      width: 150px;
-    }
-    .action {
-      font-size: 0.9em;
-      text-align: left;
-      width: 200px;
-    }
-    tr-ui-b-mouse-mode-icon {
-      border: 1px solid #888;
-      border-radius: 3px;
-      box-shadow: inset 0 0 2px rgba(0,0,0,0.3);
-      display: inline-block;
-      margin-right: 1px;
-      position: relative;
-      top: 4px;
-    }
-    .mouse-mode-icon.pan-mode {
-      background-position: -1px -11px;
-    }
-    .mouse-mode-icon.select-mode {
-      background-position: -1px -41px;
-    }
-    .mouse-mode-icon.zoom-mode {
-      background-position: -1px -71px;
-    }
-    .mouse-mode-icon.timing-mode {
-      background-position: -1px -101px;
-    }
-    </style>
-    <div class="column left">
-      <h2>Navigation</h2>
-      <div class="pair">
-        <div class="command">w/s</div>
-        <div class="action">Zoom in/out (+shift: faster)</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">a/d</div>
-        <div class="action">Pan left/right (+shift: faster)</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">→/shift-TAB</div>
-        <div class="action">Select previous event</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">←/TAB</div>
-        <div class="action">Select next event</div>
-      </div>
-
-      <h2>Mouse Controls</h2>
-      <div class="pair">
-        <div class="command">click</div>
-        <div class="action">Select event</div>
-      </div>
-      <div class="pair">
-        <div class="command">alt-mousewheel</div>
-        <div class="action">Zoom in/out</div>
-      </div>
-
-      <h3>
-        <tr-ui-b-mouse-mode-icon mode-name="SELECTION"></tr-ui-b-mouse-mode-icon>
-        Select mode
-      </h3>
-      <div class="pair">
-        <div class="command">drag</div>
-        <div class="action">Box select</div>
-      </div>
-
-      <div class="pair">
-        <div class="command"><span class="mod"></span>-click/drag</div>
-        <div class="action">Add events to the current selection</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">double click</div>
-        <div class="action">Select all events with same title</div>
-      </div>
-
-      <h3>
-        <tr-ui-b-mouse-mode-icon mode-name="PANSCAN"></tr-ui-b-mouse-mode-icon>
-        Pan mode
-      </h3>
-      <div class="pair">
-        <div class="command">drag</div>
-        <div class="action">Pan the view</div>
-      </div>
-
-      <h3>
-        <tr-ui-b-mouse-mode-icon mode-name="ZOOM"></tr-ui-b-mouse-mode-icon>
-        Zoom mode
-      </h3>
-      <div class="pair">
-        <div class="command">drag</div>
-        <div class="action">Zoom in/out by dragging up/down</div>
-      </div>
-
-      <h3>
-        <tr-ui-b-mouse-mode-icon mode-name="TIMING"></tr-ui-b-mouse-mode-icon>
-        Timing mode
-      </h3>
-      <div class="pair">
-        <div class="command">drag</div>
-        <div class="action">Create or move markers</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">double click</div>
-        <div class="action">Set marker range to slice</div>
-      </div>
-    </div>
-
-    <div class="column right">
-      <h2>General</h2>
-      <div class="pair">
-        <div class="command">1-4</div>
-        <div class="action">Switch mouse mode</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">shift</div>
-        <div class="action">Hold for temporary select</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">space</div>
-        <div class="action">Hold for temporary pan</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">/</div>
-        <div class="action">Search</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">enter</div>
-        <div class="action">Step through search results</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">f</div>
-        <div class="action">Zoom into selection</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">z/0</div>
-        <div class="action">Reset zoom and pan</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">g/G</div>
-        <div class="action">Toggle 60hz grid</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">v</div>
-        <div class="action">Highlight VSync</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">h</div>
-        <div class="action">Toggle low/high details</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">m</div>
-        <div class="action">Mark current selection</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">p</div>
-        <div class="action">Select power samples over current selection interval</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">`</div>
-        <div class="action">Show or hide the scripting console</div>
-      </div>
-
-      <div class="pair">
-        <div class="command">?</div>
-        <div class="action">Show help</div>
-      </div>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-timeline-view-metadata-overlay">
-  <template>
-    <style>
-    :host {
-      width: 700px;
-
-      overflow: auto;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-timeline-view">
-  <template>
-    <style>
-    :host {
-      flex-direction: column;
-      cursor: default;
-      display: flex;
-      font-family: sans-serif;
-      padding: 0;
-    }
-
-    #control {
-      background-color: #e6e6e6;
-      background-image: -webkit-gradient(linear, 0 0, 0 100%,
-          from(#E5E5E5), to(#D1D1D1));
-      flex: 0 0 auto;
-      overflow-x: auto;
-    }
-
-    #control::-webkit-scrollbar { height: 0px; }
-
-    #control > #bar {
-      font-size: 12px;
-      display: flex;
-      flex-direction: row;
-      margin: 1px;
-    }
-
-    #control > #bar > #title {
-      display: flex;
-      align-items: center;
-      padding-left: 8px;
-      padding-right: 8px;
-      flex: 1 1 auto;
-      overflow: hidden;
-      white-space: nowrap;
-    }
-
-    #control > #bar > #left_controls,
-    #control > #bar > #right_controls {
-      display: flex;
-      flex-direction: row;
-      align-items: stretch;
-      flex-shrink: 0;
-    }
-
-    #control > #bar > #left_controls > * { margin-right: 2px; }
-    #control > #bar > #right_controls > * { margin-left: 2px; }
-    #control > #collapsing_controls { display: flex; }
-
-    middle-container {
-      flex: 1 1 auto;
-      flex-direction: row;
-      border-bottom: 1px solid #8e8e8e;
-      display: flex;
-      min-height: 0;
-    }
-
-    middle-container ::content track-view-container {
-      flex: 1 1 auto;
-      display: flex;
-      min-height: 0;
-      min-width: 0;
-      overflow-x: hidden;
-    }
-
-    middle-container ::content track-view-container > * { flex: 1 1 auto; }
-    middle-container > x-timeline-view-side-panel-container { flex: 0 0 auto; }
-    tr-ui-b-drag-handle { flex: 0 0 auto; }
-    tr-ui-a-analysis-view { flex: 0 0 auto; }
-
-    tr-ui-b-dropdown {
-      --dropdown-button: {
-        -webkit-appearance: none;
-        align-items: normal;
-        background-color: rgb(248, 248, 248);
-        border: 1px solid rgba(0, 0, 0, 0.5);
-        box-sizing: content-box;
-        color: rgba(0, 0, 0, 0.8);
-        font-family: sans-serif;
-        font-size: 12px;
-        padding: 2px 5px;
-      }
-    }
-    </style>
-
-    <tv-ui-b-hotkey-controller id="hkc"></tv-ui-b-hotkey-controller>
-    <div id="control">
-      <div id="bar">
-        <div id="left_controls"></div>
-        <div id="title">^_^</div>
-        <div id="right_controls">
-          <tr-ui-b-dropdown id="flow_event_filter_dropdown" label="Flow events"></tr-ui-b-dropdown>
-          <tr-ui-b-dropdown id="process_filter_dropdown" label="Processes"></tr-ui-b-dropdown>
-          <tr-ui-b-toolbar-button id="view_metadata_button">
-            M
-          </tr-ui-b-toolbar-button>
-          <tr-ui-b-dropdown id="view_options_dropdown" label="View Options"></tr-ui-b-dropdown>
-          <tr-ui-find-control id="view_find_control"></tr-ui-find-control>
-          <tr-ui-b-toolbar-button id="view_console_button">
-            »
-          </tr-ui-b-toolbar-button>
-          <tr-ui-b-toolbar-button id="view_help_button">
-            ?
-          </tr-ui-b-toolbar-button>
-        </div>
-      </div>
-      <div id="collapsing_controls"></div>
-      <tr-ui-b-info-bar-group id="import-warnings">
-      </tr-ui-b-info-bar-group>
-    </div>
-    <middle-container>
-      <slot></slot>
-
-      <tr-ui-side-panel-container id="side_panel_container">
-      </tr-ui-side-panel-container>
-    </middle-container>
-    <tr-ui-b-drag-handle id="drag_handle"></tr-ui-b-drag-handle>
-    <tr-ui-a-analysis-view id="analysis"></tr-ui-a-analysis-view>
-
-    <tr-v-ui-preferred-display-unit id="display_unit">
-    </tr-v-ui-preferred-display-unit>
-  </template>
-</dom-module><dom-module id="tr-ui-b-grouping-table">
-  <template>
-    <style>
-    :host {
-      display: flex;
-    }
-    #table {
-      flex: 1 1 auto;
-      font-size: 12px;
-    }
-    </style>
-    <tr-ui-b-table id="table"></tr-ui-b-table>
-  </template>
-</dom-module><dom-module id="tr-ui-b-grouping-table-groupby-picker">
-  <template>
-    <style>
-    #container {
-      display: flex;
-    }
-    #container *:not(:first-child) {
-      padding-left: 3px;
-      border-left: 1px solid black;
-      margin-left: 3px;
-    }
-    </style>
-
-    <div id="container"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-b-grouping-table-groupby-picker-group">
-  <template>
-    <style>
-    :host {
-      white-space: nowrap;
-    }
-    #left, #right {
-      user-select: none;
-      cursor: pointer;
-    }
-    </style>
-
-    <span id="left" on-click="moveLeft_">◀</span>
-    <input id="enabled" on-change="onEnableChanged_" type="checkbox"/>
-    <label for="enabled" id="label"></label>
-    <span id="right" on-click="moveRight_">▶</span>
-  </template>
-</dom-module><dom-module id="tr-ui-sp-file-size-stats-side-panel">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    toolbar {
-      align-items: center;
-      background-color: rgb(236, 236, 236);
-      border-bottom: 1px solid #8e8e8e;
-      display: flex;
-      flex-direction: row;
-      flex-direction: row;
-      flex: 0 0 auto;
-      font-size: 12px;
-      padding: 0 10px 0 10px;
-    }
-    table-container {
-      display: flex;
-      min-height: 0px;
-      overflow-y: auto;
-    }
-    </style>
-
-    <toolbar>
-      <span><b>Group by:</b></span>
-      <tr-ui-b-grouping-table-groupby-picker id="picker">
-      </tr-ui-b-grouping-table-groupby-picker>
-    </toolbar>
-    <table-container>
-      <tr-ui-b-grouping-table id="table"></tr-ui-b-grouping-table>
-    </table-container>
-  </template>
-</dom-module><dom-module id="tr-v-ui-histogram-set-controls-export">
-  <template>
-    <style>
-    :host {
-      display: grid;
-      grid-gap: 1em;
-      grid-template-rows: auto auto;
-      grid-template-columns: auto auto;
-    }
-    button {
-      -webkit-appearance: none;
-      border: 0;
-      font-size: initial;
-      padding: 5px;
-    }
-    </style>
-
-    <button on-tap="exportRawCsv_">raw CSV</button>
-    <button on-tap="exportRawJson_">raw JSON</button>
-    <button on-tap="exportMergedCsv_">merged CSV</button>
-    <button on-tap="exportMergedJson_">merged JSON</button>
-  </template>
-</dom-module><dom-module id="tr-v-ui-histogram-set-controls">
-  <template>
-    <style>
-    :host {
-      display: block;
-    }
-
-    #help, #feedback {
-      display: none;
-      margin-left: 20px;
-    }
-
-    #search_container {
-      display: inline-flex;
-      margin-right: 20px;
-      padding-bottom: 1px;
-      border-bottom: 1px solid darkgrey;
-    }
-
-    #search {
-      border: 0;
-      max-width: 20em;
-      outline: none;
-    }
-
-    #clear_search {
-      visibility: hidden;
-      height: 1em;
-      stroke: black;
-      stroke-width: 16;
-    }
-
-    #controls {
-      white-space: nowrap;
-    }
-
-    #show_overview, #hide_overview {
-      height: 1em;
-      margin-right: 20px;
-    }
-
-    #show_overview {
-      stroke: blue;
-      stroke-width: 16;
-    }
-
-    #show_overview:hover {
-      background: blue;
-      stroke: white;
-    }
-
-    #hide_overview {
-      display: none;
-      stroke-width: 18;
-      stroke: black;
-    }
-
-    #hide_overview:hover {
-      background: black;
-      stroke: white;
-    }
-
-    #reference_display_label {
-      display: none;
-      margin-right: 20px;
-    }
-
-    #alpha, #alpha_slider_container {
-      display: none;
-    }
-
-    #alpha {
-      margin-right: 20px;
-    }
-
-    #alpha_slider_container {
-      background: white;
-      border: 1px solid black;
-      flex-direction: column;
-      padding: 0.5em;
-      position: absolute;
-      z-index: 10; /* scalar-span uses z-index :-( */
-    }
-
-    #alpha_slider {
-      -webkit-appearance: slider-vertical;
-      align-self: center;
-      height: 200px;
-      width: 30px;
-    }
-
-    #statistic {
-      display: none;
-      margin-right: 20px;
-    }
-
-    #export {
-      margin-right: 20px;
-    }
-    </style>
-
-    <div id="controls">
-      <span id="search_container">
-        <input id="search" placeholder="Find Histogram name" value="{{searchQuery::keyup}}"/>
-        <svg id="clear_search" on-tap="clearSearch_" viewBox="0 0 128 128">
-          <g>
-          <title>Clear search</title>
-          <line x1="28" x2="100" y1="28" y2="100"></line>
-          <line x1="28" x2="100" y1="100" y2="28"></line>
-          </g>
-        </svg>
-      </span>
-
-      <svg id="show_overview" on-tap="toggleOverviewLineCharts_" viewBox="0 0 128 128">
-        <g>
-        <title>Show overview charts</title>
-        <line x1="19" x2="49" y1="109" y2="49"></line>
-        <line x1="49" x2="79" y1="49" y2="79"></line>
-        <line x1="79" x2="109" y1="79" y2="19"></line>
-        </g>
-      </svg>
-      <svg id="hide_overview" on-tap="toggleOverviewLineCharts_" viewBox="0 0 128 128">
-        <g>
-        <title>Hide overview charts</title>
-        <line x1="28" x2="100" y1="28" y2="100"></line>
-        <line x1="28" x2="100" y1="100" y2="28"></line>
-        </g>
-      </svg>
-
-      <select id="reference_display_label" value="{{referenceDisplayLabel::change}}">
-        <option value="">Select a reference column</option>
-      </select>
-
-      <button id="alpha" on-tap="openAlphaSlider_">α=[[alphaString]]</button>
-      <div id="alpha_slider_container">
-        <input id="alpha_slider" max="18" min="0" on-blur="closeAlphaSlider_" on-input="updateAlpha_" type="range" value="{{alphaIndex::change}}"/>
-      </div>
-
-      <select id="statistic" value="{{displayStatisticName::change}}">
-      </select>
-
-      <tr-ui-b-dropdown label="Export">
-        <tr-v-ui-histogram-set-controls-export>
-        </tr-v-ui-histogram-set-controls-export>
-      </tr-ui-b-dropdown>
-
-      <input checked="{{showAll::change}}" id="show_all" title="When unchecked, less important histograms are hidden." type="checkbox"/>
-      <label for="show_all" title="When unchecked, less important histograms are hidden.">Show all</label>
-
-      <a id="help">Help</a>
-      <a id="feedback">Feedback</a>
-    </div>
-
-    <tr-ui-b-grouping-table-groupby-picker id="picker">
-    </tr-ui-b-grouping-table-groupby-picker>
-  </template>
-</dom-module><dom-module id="tr-v-ui-histogram-set-table-cell">
-  <template>
-    <style>
-    #histogram_container {
-      display: flex;
-      flex-direction: row;
-    }
-
-    #missing, #empty, #unmergeable, #scalar {
-      flex-grow: 1;
-    }
-
-    #open_histogram, #close_histogram, #open_histogram svg, #close_histogram svg {
-      height: 1em;
-    }
-
-    #open_histogram svg {
-      margin-left: 4px;
-      stroke-width: 0;
-      stroke: blue;
-      fill: blue;
-    }
-    :host(:hover) #open_histogram svg {
-      background: blue;
-      stroke: white;
-      fill: white;
-    }
-
-    #scalar {
-      flex-grow: 1;
-      white-space: nowrap;
-    }
-
-    #histogram {
-      flex-grow: 1;
-    }
-
-    #close_histogram svg line {
-      stroke-width: 18;
-      stroke: black;
-    }
-    #close_histogram:hover svg {
-      background: black;
-    }
-    #close_histogram:hover svg line {
-      stroke: white;
-    }
-
-    #overview_container {
-      display: none;
-    }
-    </style>
-
-    <div id="histogram_container">
-      <span id="missing">(missing)</span>
-      <span id="empty">(empty)</span>
-      <span id="unmergeable">(unmergeable)</span>
-
-      <tr-v-ui-scalar-span id="scalar" on-click="openHistogram_"></tr-v-ui-scalar-span>
-
-      <span id="open_histogram" on-click="openHistogram_">
-        <svg viewBox="0 0 128 128">
-          <rect height="16" width="32" x="16" y="24"></rect>
-          <rect height="16" width="96" x="16" y="56"></rect>
-          <rect height="16" width="64" x="16" y="88"></rect>
-        </svg>
-      </span>
-
-      <span id="histogram"></span>
-
-      <span id="close_histogram" on-click="closeHistogram_">
-        <svg viewBox="0 0 128 128">
-          <line x1="28" x2="100" y1="28" y2="100"></line>
-          <line x1="28" x2="100" y1="100" y2="28"></line>
-        </svg>
-      </span>
-    </div>
-
-    <div id="overview_container">
-    </div>
-  </template>
-</dom-module><dom-module id="tr-v-ui-histogram-set-table-name-cell">
-  <template>
-    <style>
-    #name_container {
-      display: flex;
-    }
-
-    #name {
-      overflow: hidden;
-      white-space: nowrap;
-      text-overflow: ellipsis;
-    }
-
-    #show_overview, #hide_overview, #show_overview svg, #hide_overview svg {
-      height: 1em;
-      margin-left: 5px;
-    }
-
-    #show_overview svg {
-      stroke: blue;
-      stroke-width: 16;
-    }
-
-    #show_overview:hover svg {
-      background: blue;
-      stroke: white;
-    }
-
-    #hide_overview {
-      display: none;
-    }
-
-    #hide_overview svg {
-      stroke-width: 18;
-      stroke: black;
-    }
-
-    #hide_overview:hover svg {
-      background: black;
-      stroke: white;
-    }
-
-    #open_histograms, #close_histograms, #open_histograms svg, #close_histograms svg {
-      height: 1em;
-    }
-
-    #close_histograms {
-      display: none;
-    }
-
-    #open_histograms svg {
-      margin-left: 4px;
-      stroke-width: 0;
-      stroke: blue;
-      fill: blue;
-    }
-    #open_histograms:hover svg {
-      background: blue;
-      stroke: white;
-      fill: white;
-    }
-
-    #close_histograms line {
-      stroke-width: 18;
-      stroke: black;
-    }
-    #close_histograms:hover {
-      background: black;
-    }
-    #close_histograms:hover line {
-      stroke: white;
-    }
-
-    #overview_container {
-      display: none;
-    }
-    </style>
-
-    <div id="name_container">
-      <span id="name"></span>
-
-      <span id="show_overview" on-click="showOverview_">
-        <svg viewBox="0 0 128 128">
-          <line x1="19" x2="49" y1="109" y2="49"></line>
-          <line x1="49" x2="79" y1="49" y2="79"></line>
-          <line x1="79" x2="109" y1="79" y2="19"></line>
-        </svg>
-      </span>
-
-      <span id="hide_overview" on-click="hideOverview_">
-        <svg viewBox="0 0 128 128">
-          <line x1="28" x2="100" y1="28" y2="100"></line>
-          <line x1="28" x2="100" y1="100" y2="28"></line>
-        </svg>
-      </span>
-
-      <span id="open_histograms" on-click="openHistograms_">
-        <svg viewBox="0 0 128 128">
-          <rect height="16" width="32" x="16" y="24"></rect>
-          <rect height="16" width="96" x="16" y="56"></rect>
-          <rect height="16" width="64" x="16" y="88"></rect>
-        </svg>
-      </span>
-
-      <span id="close_histograms" on-click="closeHistograms_">
-        <svg viewBox="0 0 128 128">
-          <line x1="28" x2="100" y1="28" y2="100"></line>
-          <line x1="28" x2="100" y1="100" y2="28"></line>
-        </svg>
-      </span>
-    </div>
-
-    <div id="overview_container">
-    </div>
-  </template>
-</dom-module><dom-module id="tr-v-ui-histogram-set-table">
-  <template>
-    <style>
-    :host {
-      min-height: 0px;
-      overflow: auto;
-    }
-    #table {
-      margin-top: 5px;
-    }
-    </style>
-
-    <tr-ui-b-table id="table">
-  </tr-ui-b-table></template>
-</dom-module><dom-module id="tr-v-ui-histogram-set-view">
-  <template>
-    <style>
-    :host {
-      font-family: sans-serif;
-    }
-
-    #zero {
-      color: red;
-      /* histogram-set-table is used by both metrics-side-panel and results.html.
-       * This font-size rule has no effect in results.html, but improves
-       * legibility in the metrics-side-panel, which sets font-size in order to
-       * make this table denser.
-       */
-      font-size: initial;
-    }
-
-    #container {
-      display: none;
-    }
-
-    </style>
-
-    <div id="zero">zero Histograms</div>
-
-    <div id="container">
-      <tr-v-ui-histogram-set-controls id="controls">
-      </tr-v-ui-histogram-set-controls>
-
-      <tr-v-ui-histogram-set-table id="table"></tr-v-ui-histogram-set-table>
-    </div>
-  </template>
-</dom-module><dom-module id="tr-ui-sp-metrics-side-panel">
-  <template>
-    <style>
-    :host {
-      display: flex;
-      flex-direction: column;
-    }
-    div#error {
-      color: red;
-    }
-    #results {
-      font-size: 12px;
-    }
-    </style>
-
-    <top-left-controls id="top_left_controls"></top-left-controls>
-
-    <tr-v-ui-histogram-set-view id="results"></tr-v-ui-histogram-set-view>
-
-    <div id="error"></div>
-  </template>
-</dom-module><dom-module id="tr-ui-e-s-alerts-side-panel">
-  <template>
-    <style>
-    :host {
-      display: block;
-      width: 250px;
-    }
-    #content {
-      flex-direction: column;
-      display: flex;
-    }
-    tr-ui-b-table {
-      font-size: 12px;
-    }
-    </style>
-
-    <div id="content">
-      <toolbar id="toolbar"></toolbar>
-      <result-area id="result_area"></result-area>
-    </div>
-  </template>
-</dom-module><script>
-
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/* WARNING: This file is auto generated.
- *
- * Do not edit directly.
- */
-
-'use strict';const global=this.window||this.global;this.tr=(function(){if(global.tr)return global.tr;function exportPath(name){const parts=name.split('.');let cur=global;for(let part;parts.length&&(part=parts.shift());){if(part in cur){cur=cur[part];}else{cur=cur[part]={};}}
-return cur;}
-function isExported(name){const parts=name.split('.');let cur=global;for(let part;parts.length&&(part=parts.shift());){if(part in cur){cur=cur[part];}else{return false;}}
-return true;}
-function isDefined(name){const parts=name.split('.');let curObject=global;for(let i=0;i<parts.length;i++){const partName=parts[i];const nextObject=curObject[partName];if(nextObject===undefined)return false;curObject=nextObject;}
-return true;}
-let panicElement=undefined;const rawPanicMessages=[];function showPanicElementIfNeeded(){if(panicElement)return;const panicOverlay=document.createElement('div');panicOverlay.style.backgroundColor='white';panicOverlay.style.border='3px solid red';panicOverlay.style.boxSizing='border-box';panicOverlay.style.color='black';panicOverlay.style.display='flex';panicOverlay.style.height='100%';panicOverlay.style.left=0;panicOverlay.style.padding='8px';panicOverlay.style.position='fixed';panicOverlay.style.top=0;panicOverlay.style.webkitFlexDirection='column';panicOverlay.style.width='100%';panicElement=document.createElement('div');panicElement.style.webkitFlex='1 1 auto';panicElement.style.overflow='auto';panicOverlay.appendChild(panicElement);if(!document.body){setTimeout(function(){document.body.appendChild(panicOverlay);},150);}else{document.body.appendChild(panicOverlay);}}
-function showPanic(panicTitle,panicDetails){if(tr.isHeadless){if(panicDetails instanceof Error)throw panicDetails;throw new Error('Panic: '+panicTitle+':\n'+panicDetails);}
-if(panicDetails instanceof Error){panicDetails=panicDetails.stack;}
-showPanicElementIfNeeded();const panicMessageEl=document.createElement('div');panicMessageEl.innerHTML='<h2 id="message"></h2>'+'<pre id="details"></pre>';panicMessageEl.querySelector('#message').textContent=panicTitle;panicMessageEl.querySelector('#details').textContent=panicDetails;panicElement.appendChild(panicMessageEl);rawPanicMessages.push({title:panicTitle,details:panicDetails});}
-function hasPanic(){return rawPanicMessages.length!==0;}
-function getPanicText(){return rawPanicMessages.map(function(msg){return msg.title;}).join(', ');}
-function exportTo(namespace,fn){const obj=exportPath(namespace);const exports=fn();for(const propertyName in exports){const propertyDescriptor=Object.getOwnPropertyDescriptor(exports,propertyName);if(propertyDescriptor){Object.defineProperty(obj,propertyName,propertyDescriptor);}}}
-function initialize(){if(global.isVinn){tr.isVinn=true;}else if(global.process&&global.process.versions.node){tr.isNode=true;}else{tr.isVinn=false;tr.isNode=false;tr.doc=document;tr.isMac=/Mac/.test(navigator.platform);tr.isWindows=/Win/.test(navigator.platform);tr.isChromeOS=/CrOS/.test(navigator.userAgent);tr.isLinux=/Linux/.test(navigator.userAgent);}
-tr.isHeadless=tr.isVinn||tr.isNode;}
-return{initialize,exportTo,isExported,isDefined,showPanic,hasPanic,getPanicText,};})();tr.initialize();'use strict';if(!window.CustomElements||window.CustomElements.hasNative){if(window.Polymer){throw new Error('Cannot proceed. Polymer already present.');}
-window.Polymer={};window.Polymer.dom='shadow';}
-(function(){function resolve(){document.body.removeAttribute('unresolved');}
-if(window.WebComponents){addEventListener('WebComponentsReady',resolve);}else{if(document.readyState==='interactive'||document.readyState==='complete'){resolve();}else{addEventListener('DOMContentLoaded',resolve);}}}());window.Polymer={Settings:function(){var settings=window.Polymer||{};if(!settings.noUrlSettings){var parts=location.search.slice(1).split('&');for(var i=0,o;i<parts.length&&(o=parts[i]);i++){o=o.split('=');o[0]&&(settings[o[0]]=o[1]||true);}}
-settings.wantShadow=settings.dom==='shadow';settings.hasShadow=Boolean(Element.prototype.createShadowRoot);settings.nativeShadow=settings.hasShadow&&!window.ShadowDOMPolyfill;settings.useShadow=settings.wantShadow&&settings.hasShadow;settings.hasNativeImports=Boolean('import'in document.createElement('link'));settings.useNativeImports=settings.hasNativeImports;settings.useNativeCustomElements=!window.CustomElements||window.CustomElements.useNative;settings.useNativeShadow=settings.useShadow&&settings.nativeShadow;settings.usePolyfillProto=!settings.useNativeCustomElements&&!Object.__proto__;settings.hasNativeCSSProperties=!navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)&&window.CSS&&CSS.supports&&CSS.supports('box-shadow','0 0 0 var(--foo)');settings.useNativeCSSProperties=settings.hasNativeCSSProperties&&settings.lazyRegister&&settings.useNativeCSSProperties;settings.isIE=navigator.userAgent.match('Trident');settings.passiveTouchGestures=settings.passiveTouchGestures||false;return settings;}()};(function(){var userPolymer=window.Polymer;window.Polymer=function(prototype){if(typeof prototype==='function'){prototype=prototype.prototype;}
-if(!prototype){prototype={};}
-prototype=desugar(prototype);var customCtor=prototype===prototype.constructor.prototype?prototype.constructor:null;var options={prototype:prototype};if(prototype.extends){options.extends=prototype.extends;}
-Polymer.telemetry._registrate(prototype);var ctor=document.registerElement(prototype.is,options);return customCtor||ctor;};var desugar=function(prototype){var base=Polymer.Base;if(prototype.extends){base=Polymer.Base._getExtendedPrototype(prototype.extends);}
-prototype=Polymer.Base.chainObject(prototype,base);prototype.registerCallback();return prototype;};if(userPolymer){for(var i in userPolymer){Polymer[i]=userPolymer[i];}}
-Polymer.Class=function(prototype){if(!prototype.factoryImpl){prototype.factoryImpl=function(){};}
-return desugar(prototype).constructor;};}());Polymer.telemetry={registrations:[],_regLog:function(prototype){console.log('['+prototype.is+']: registered');},_registrate:function(prototype){this.registrations.push(prototype);Polymer.log&&this._regLog(prototype);},dumpRegistrations:function(){this.registrations.forEach(this._regLog);}};Object.defineProperty(window,'currentImport',{enumerable:true,configurable:true,get:function(){return(document._currentScript||document.currentScript||{}).ownerDocument;}});Polymer.RenderStatus={_ready:false,_callbacks:[],whenReady:function(cb){if(this._ready){cb();}else{this._callbacks.push(cb);}},_makeReady:function(){this._ready=true;for(var i=0;i<this._callbacks.length;i++){this._callbacks[i]();}
-this._callbacks=[];},_catchFirstRender:function(){requestAnimationFrame(function(){Polymer.RenderStatus._makeReady();});},_afterNextRenderQueue:[],_waitingNextRender:false,afterNextRender:function(element,fn,args){this._watchNextRender();this._afterNextRenderQueue.push([element,fn,args]);},hasRendered:function(){return this._ready;},_watchNextRender:function(){if(!this._waitingNextRender){this._waitingNextRender=true;var fn=function(){Polymer.RenderStatus._flushNextRender();};if(!this._ready){this.whenReady(fn);}else{requestAnimationFrame(fn);}}},_flushNextRender:function(){var self=this;setTimeout(function(){self._flushRenderCallbacks(self._afterNextRenderQueue);self._afterNextRenderQueue=[];self._waitingNextRender=false;});},_flushRenderCallbacks:function(callbacks){for(var i=0,h;i<callbacks.length;i++){h=callbacks[i];h[1].apply(h[0],h[2]||Polymer.nar);}}};if(window.HTMLImports){HTMLImports.whenReady(function(){Polymer.RenderStatus._catchFirstRender();});}else{Polymer.RenderStatus._catchFirstRender();}
-Polymer.ImportStatus=Polymer.RenderStatus;Polymer.ImportStatus.whenLoaded=Polymer.ImportStatus.whenReady;(function(){'use strict';var settings=Polymer.Settings;Polymer.Base={__isPolymerInstance__:true,_addFeature:function(feature){this.mixin(this,feature);},registerCallback:function(){if(settings.lazyRegister==='max'){if(this.beforeRegister){this.beforeRegister();}}else{this._desugarBehaviors();for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.beforeRegister){b.beforeRegister.call(this);}}
-if(this.beforeRegister){this.beforeRegister();}}
-this._registerFeatures();if(!settings.lazyRegister){this.ensureRegisterFinished();}},createdCallback:function(){if(settings.disableUpgradeEnabled){if(this.hasAttribute('disable-upgrade')){this._propertySetter=disableUpgradePropertySetter;this._configValue=null;this.__data__={};return;}else{this.__hasInitialized=true;}}
-this.__initialize();},__initialize:function(){if(!this.__hasRegisterFinished){this._ensureRegisterFinished(this.__proto__);}
-Polymer.telemetry.instanceCount++;this.root=this;for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.created){b.created.call(this);}}
-if(this.created){this.created();}
-this._initFeatures();},ensureRegisterFinished:function(){this._ensureRegisterFinished(this);},_ensureRegisterFinished:function(proto){if(proto.__hasRegisterFinished!==proto.is||!proto.is){if(settings.lazyRegister==='max'){proto._desugarBehaviors();for(var i=0,b;i<proto.behaviors.length;i++){b=proto.behaviors[i];if(b.beforeRegister){b.beforeRegister.call(proto);}}}
-proto.__hasRegisterFinished=proto.is;if(proto._finishRegisterFeatures){proto._finishRegisterFeatures();}
-for(var j=0,pb;j<proto.behaviors.length;j++){pb=proto.behaviors[j];if(pb.registered){pb.registered.call(proto);}}
-if(proto.registered){proto.registered();}
-if(settings.usePolyfillProto&&proto!==this){proto.extend(this,proto);}}},attachedCallback:function(){var self=this;Polymer.RenderStatus.whenReady(function(){self.isAttached=true;for(var i=0,b;i<self.behaviors.length;i++){b=self.behaviors[i];if(b.attached){b.attached.call(self);}}
-if(self.attached){self.attached();}});},detachedCallback:function(){var self=this;Polymer.RenderStatus.whenReady(function(){self.isAttached=false;for(var i=0,b;i<self.behaviors.length;i++){b=self.behaviors[i];if(b.detached){b.detached.call(self);}}
-if(self.detached){self.detached();}});},attributeChangedCallback:function(name,oldValue,newValue){this._attributeChangedImpl(name);for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.attributeChanged){b.attributeChanged.call(this,name,oldValue,newValue);}}
-if(this.attributeChanged){this.attributeChanged(name,oldValue,newValue);}},_attributeChangedImpl:function(name){this._setAttributeToProperty(this,name);},extend:function(target,source){if(target&&source){var n$=Object.getOwnPropertyNames(source);for(var i=0,n;i<n$.length&&(n=n$[i]);i++){this.copyOwnProperty(n,source,target);}}
-return target||source;},mixin:function(target,source){for(var i in source){target[i]=source[i];}
-return target;},copyOwnProperty:function(name,source,target){var pd=Object.getOwnPropertyDescriptor(source,name);if(pd){Object.defineProperty(target,name,pd);}},_logger:function(level,args){if(args.length===1&&Array.isArray(args[0])){args=args[0];}
-switch(level){case'log':case'warn':case'error':console[level].apply(console,args);break;}},_log:function(){var args=Array.prototype.slice.call(arguments,0);this._logger('log',args);},_warn:function(){var args=Array.prototype.slice.call(arguments,0);this._logger('warn',args);},_error:function(){var args=Array.prototype.slice.call(arguments,0);this._logger('error',args);},_logf:function(){return this._logPrefix.concat(this.is).concat(Array.prototype.slice.call(arguments,0));}};Polymer.Base._logPrefix=function(){var color=window.chrome&&!/edge/i.test(navigator.userAgent)||/firefox/i.test(navigator.userAgent);return color?['%c[%s::%s]:','font-weight: bold; background-color:#EEEE00;']:['[%s::%s]:'];}();Polymer.Base.chainObject=function(object,inherited){if(object&&inherited&&object!==inherited){if(!Object.__proto__){object=Polymer.Base.extend(Object.create(inherited),object);}
-object.__proto__=inherited;}
-return object;};Polymer.Base=Polymer.Base.chainObject(Polymer.Base,HTMLElement.prototype);Polymer.BaseDescriptors={};var disableUpgradePropertySetter;if(settings.disableUpgradeEnabled){disableUpgradePropertySetter=function(property,value){this.__data__[property]=value;};var origAttributeChangedCallback=Polymer.Base.attributeChangedCallback;Polymer.Base.attributeChangedCallback=function(name,oldValue,newValue){if(!this.__hasInitialized&&name==='disable-upgrade'){this.__hasInitialized=true;this._propertySetter=Polymer.Bind._modelApi._propertySetter;this._configValue=Polymer.Base._configValue;this.__initialize();}
-origAttributeChangedCallback.call(this,name,oldValue,newValue);};}
-if(window.CustomElements){Polymer.instanceof=CustomElements.instanceof;}else{Polymer.instanceof=function(obj,ctor){return obj instanceof ctor;};}
-Polymer.isInstance=function(obj){return Boolean(obj&&obj.__isPolymerInstance__);};Polymer.telemetry.instanceCount=0;}());(function(){var modules={};var lcModules={};var findModule=function(id){return modules[id]||lcModules[id.toLowerCase()];};var DomModule=function(){return document.createElement('dom-module');};DomModule.prototype=Object.create(HTMLElement.prototype);Polymer.Base.mixin(DomModule.prototype,{createdCallback:function(){this.register();},register:function(id){id=id||this.id||this.getAttribute('name')||this.getAttribute('is');if(id){this.id=id;modules[id]=this;lcModules[id.toLowerCase()]=this;}},import:function(id,selector){if(id){var m=findModule(id);if(!m){forceDomModulesUpgrade();m=findModule(id);}
-if(m&&selector){m=m.querySelector(selector);}
-return m;}}});Object.defineProperty(DomModule.prototype,'constructor',{value:DomModule,configurable:true,writable:true});var cePolyfill=window.CustomElements&&!CustomElements.useNative;document.registerElement('dom-module',DomModule);function forceDomModulesUpgrade(){if(cePolyfill){var script=document._currentScript||document.currentScript;var doc=script&&script.ownerDocument||document;var modules=doc.querySelectorAll('dom-module');for(var i=modules.length-1,m;i>=0&&(m=modules[i]);i--){if(m.__upgraded__){return;}else{CustomElements.upgrade(m);}}}}}());Polymer.Base._addFeature({_prepIs:function(){if(!this.is){var module=(document._currentScript||document.currentScript).parentNode;if(module.localName==='dom-module'){var id=module.id||module.getAttribute('name')||module.getAttribute('is');this.is=id;}}
-if(this.is){this.is=this.is.toLowerCase();}}});Polymer.Base._addFeature({behaviors:[],_desugarBehaviors:function(){if(this.behaviors.length){this.behaviors=this._desugarSomeBehaviors(this.behaviors);}},_desugarSomeBehaviors:function(behaviors){var behaviorSet=[];behaviors=this._flattenBehaviorsList(behaviors);for(var i=behaviors.length-1;i>=0;i--){var b=behaviors[i];if(behaviorSet.indexOf(b)===-1){this._mixinBehavior(b);behaviorSet.unshift(b);}}
-return behaviorSet;},_flattenBehaviorsList:function(behaviors){var flat=[];for(var i=0;i<behaviors.length;i++){var b=behaviors[i];if(b instanceof Array){flat=flat.concat(this._flattenBehaviorsList(b));}else if(b){flat.push(b);}else{this._warn(this._logf('_flattenBehaviorsList','behavior is null, check for missing or 404 import'));}}
-return flat;},_mixinBehavior:function(b){var n$=Object.getOwnPropertyNames(b);var useAssignment=b._noAccessors;for(var i=0,n;i<n$.length&&(n=n$[i]);i++){if(!Polymer.Base._behaviorProperties[n]&&!this.hasOwnProperty(n)){if(useAssignment){this[n]=b[n];}else{this.copyOwnProperty(n,b,this);}}}},_prepBehaviors:function(){this._prepFlattenedBehaviors(this.behaviors);},_prepFlattenedBehaviors:function(behaviors){for(var i=0,l=behaviors.length;i<l;i++){this._prepBehavior(behaviors[i]);}
-this._prepBehavior(this);},_marshalBehaviors:function(){for(var i=0;i<this.behaviors.length;i++){this._marshalBehavior(this.behaviors[i]);}
-this._marshalBehavior(this);}});Polymer.Base._behaviorProperties={hostAttributes:true,beforeRegister:true,registered:true,properties:true,observers:true,listeners:true,created:true,attached:true,detached:true,attributeChanged:true,ready:true,_noAccessors:true};Polymer.Base._addFeature({_getExtendedPrototype:function(tag){return this._getExtendedNativePrototype(tag);},_nativePrototypes:{},_getExtendedNativePrototype:function(tag){var p=this._nativePrototypes[tag];if(!p){p=Object.create(this.getNativePrototype(tag));var p$=Object.getOwnPropertyNames(Polymer.Base);for(var i=0,n;i<p$.length&&(n=p$[i]);i++){if(!Polymer.BaseDescriptors[n]){p[n]=Polymer.Base[n];}}
-Object.defineProperties(p,Polymer.BaseDescriptors);this._nativePrototypes[tag]=p;}
-return p;},getNativePrototype:function(tag){return Object.getPrototypeOf(document.createElement(tag));}});Polymer.Base._addFeature({_prepConstructor:function(){this._factoryArgs=this.extends?[this.extends,this.is]:[this.is];var ctor=function(){return this._factory(arguments);};if(this.hasOwnProperty('extends')){ctor.extends=this.extends;}
-Object.defineProperty(this,'constructor',{value:ctor,writable:true,configurable:true});ctor.prototype=this;},_factory:function(args){var elt=document.createElement.apply(document,this._factoryArgs);if(this.factoryImpl){this.factoryImpl.apply(elt,args);}
-return elt;}});Polymer.nob=Object.create(null);Polymer.Base._addFeature({getPropertyInfo:function(property){var info=this._getPropertyInfo(property,this.properties);if(!info){for(var i=0;i<this.behaviors.length;i++){info=this._getPropertyInfo(property,this.behaviors[i].properties);if(info){return info;}}}
-return info||Polymer.nob;},_getPropertyInfo:function(property,properties){var p=properties&&properties[property];if(typeof p==='function'){p=properties[property]={type:p};}
-if(p){p.defined=true;}
-return p;},_prepPropertyInfo:function(){this._propertyInfo={};for(var i=0;i<this.behaviors.length;i++){this._addPropertyInfo(this._propertyInfo,this.behaviors[i].properties);}
-this._addPropertyInfo(this._propertyInfo,this.properties);this._addPropertyInfo(this._propertyInfo,this._propertyEffects);},_addPropertyInfo:function(target,source){if(source){var t,s;for(var i in source){t=target[i];s=source[i];if(i[0]==='_'&&!s.readOnly){continue;}
-if(!target[i]){target[i]={type:typeof s==='function'?s:s.type,readOnly:s.readOnly,attribute:Polymer.CaseMap.camelToDashCase(i)};}else{if(!t.type){t.type=s.type;}
-if(!t.readOnly){t.readOnly=s.readOnly;}}}}}});(function(){var propertiesDesc={configurable:true,writable:true,enumerable:true,value:{}};Polymer.BaseDescriptors.properties=propertiesDesc;Object.defineProperty(Polymer.Base,'properties',propertiesDesc);}());Polymer.CaseMap={_caseMap:{},_rx:{dashToCamel:/-[a-z]/g,camelToDash:/([A-Z])/g},dashToCamelCase:function(dash){return this._caseMap[dash]||(this._caseMap[dash]=dash.indexOf('-')<0?dash:dash.replace(this._rx.dashToCamel,function(m){return m[1].toUpperCase();}));},camelToDashCase:function(camel){return this._caseMap[camel]||(this._caseMap[camel]=camel.replace(this._rx.camelToDash,'-$1').toLowerCase());}};Polymer.Base._addFeature({_addHostAttributes:function(attributes){if(!this._aggregatedAttributes){this._aggregatedAttributes={};}
-if(attributes){this.mixin(this._aggregatedAttributes,attributes);}},_marshalHostAttributes:function(){if(this._aggregatedAttributes){this._applyAttributes(this,this._aggregatedAttributes);}},_applyAttributes:function(node,attr$){for(var n in attr$){if(!this.hasAttribute(n)&&n!=='class'){var v=attr$[n];this.serializeValueToAttribute(v,n,this);}}},_marshalAttributes:function(){this._takeAttributesToModel(this);},_takeAttributesToModel:function(model){if(this.hasAttributes()){for(var i in this._propertyInfo){var info=this._propertyInfo[i];if(this.hasAttribute(info.attribute)){this._setAttributeToProperty(model,info.attribute,i,info);}}}},_setAttributeToProperty:function(model,attribute,property,info){if(!this._serializing){property=property||Polymer.CaseMap.dashToCamelCase(attribute);info=info||this._propertyInfo&&this._propertyInfo[property];if(info&&!info.readOnly){var v=this.getAttribute(attribute);model[property]=this.deserialize(v,info.type);}}},_serializing:false,reflectPropertyToAttribute:function(property,attribute,value){this._serializing=true;value=value===undefined?this[property]:value;this.serializeValueToAttribute(value,attribute||Polymer.CaseMap.camelToDashCase(property));this._serializing=false;},serializeValueToAttribute:function(value,attribute,node){var str=this.serialize(value);node=node||this;if(str===undefined){node.removeAttribute(attribute);}else{node.setAttribute(attribute,str);}},deserialize:function(value,type){switch(type){case Number:value=Number(value);break;case Boolean:value=value!=null;break;case Object:try{value=JSON.parse(value);}catch(x){}
-break;case Array:try{value=JSON.parse(value);}catch(x){value=null;console.warn('Polymer::Attributes: couldn`t decode Array as JSON');}
-break;case Date:value=new Date(value);break;case String:default:break;}
-return value;},serialize:function(value){switch(typeof value){case'boolean':return value?'':undefined;case'object':if(value instanceof Date){return value.toString();}else if(value){try{return JSON.stringify(value);}catch(x){return'';}}
-default:return value!=null?value:undefined;}}});Polymer.version="1.11.3";Polymer.Base._addFeature({_registerFeatures:function(){this._prepIs();this._prepBehaviors();this._prepConstructor();this._prepPropertyInfo();},_prepBehavior:function(b){this._addHostAttributes(b.hostAttributes);},_marshalBehavior:function(b){},_initFeatures:function(){this._marshalHostAttributes();this._marshalBehaviors();}});(function(){function resolveCss(cssText,ownerDocument){return cssText.replace(CSS_URL_RX,function(m,pre,url,post){return pre+'\''+resolve(url.replace(/["']/g,''),ownerDocument)+'\''+post;});}
-function resolveAttrs(element,ownerDocument){for(var name in URL_ATTRS){var a$=URL_ATTRS[name];for(var i=0,l=a$.length,a,at,v;i<l&&(a=a$[i]);i++){if(name==='*'||element.localName===name){at=element.attributes[a];v=at&&at.value;if(v&&v.search(BINDING_RX)<0){at.value=a==='style'?resolveCss(v,ownerDocument):resolve(v,ownerDocument);}}}}}
-function resolve(url,ownerDocument){if(url&&ABS_URL.test(url)){return url;}
-var resolver=getUrlResolver(ownerDocument);resolver.href=url;return resolver.href||url;}
-var tempDoc;var tempDocBase;function resolveUrl(url,baseUri){if(!tempDoc){tempDoc=document.implementation.createHTMLDocument('temp');tempDocBase=tempDoc.createElement('base');tempDoc.head.appendChild(tempDocBase);}
-tempDocBase.href=baseUri;return resolve(url,tempDoc);}
-function getUrlResolver(ownerDocument){return ownerDocument.body.__urlResolver||(ownerDocument.body.__urlResolver=ownerDocument.createElement('a'));}
-function pathFromUrl(url){return url.substring(0,url.lastIndexOf('/')+1);}
-var CSS_URL_RX=/(url\()([^)]*)(\))/g;var URL_ATTRS={'*':['href','src','style','url'],form:['action']};var ABS_URL=/(^\/)|(^#)|(^[\w-\d]*:)/;var BINDING_RX=/\{\{|\[\[/;Polymer.ResolveUrl={resolveCss:resolveCss,resolveAttrs:resolveAttrs,resolveUrl:resolveUrl,pathFromUrl:pathFromUrl};Polymer.rootPath=Polymer.Settings.rootPath||pathFromUrl(document.baseURI||window.location.href);}());Polymer.Base._addFeature({_prepTemplate:function(){var module;if(this._template===undefined){module=Polymer.DomModule.import(this.is);this._template=module&&module.querySelector('template');}
-if(module){var assetPath=module.getAttribute('assetpath')||'';var importURL=Polymer.ResolveUrl.resolveUrl(assetPath,module.ownerDocument.baseURI);this._importPath=Polymer.ResolveUrl.pathFromUrl(importURL);}else{this._importPath='';}
-if(this._template&&this._template.hasAttribute('is')){this._warn(this._logf('_prepTemplate','top-level Polymer template '+'must not be a type-extension, found',this._template,'Move inside simple <template>.'));}
-if(this._template&&!this._template.content&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate){HTMLTemplateElement.decorate(this._template);}},_stampTemplate:function(){if(this._template){this.root=this.instanceTemplate(this._template);}},instanceTemplate:function(template){var dom=document.importNode(template._content||template.content,true);return dom;}});(function(){var baseAttachedCallback=Polymer.Base.attachedCallback;var baseDetachedCallback=Polymer.Base.detachedCallback;Polymer.Base._addFeature({_hostStack:[],ready:function(){},_registerHost:function(host){this.dataHost=host=host||Polymer.Base._hostStack[Polymer.Base._hostStack.length-1];if(host&&host._clients){host._clients.push(this);}
-this._clients=null;this._clientsReadied=false;},_beginHosting:function(){Polymer.Base._hostStack.push(this);if(!this._clients){this._clients=[];}},_endHosting:function(){Polymer.Base._hostStack.pop();},_tryReady:function(){this._readied=false;if(this._canReady()){this._ready();}},_canReady:function(){return!this.dataHost||this.dataHost._clientsReadied;},_ready:function(){this._beforeClientsReady();if(this._template){this._setupRoot();this._readyClients();}
-this._clientsReadied=true;this._clients=null;this._afterClientsReady();this._readySelf();},_readyClients:function(){this._beginDistribute();var c$=this._clients;if(c$){for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){c._ready();}}
-this._finishDistribute();},_readySelf:function(){for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.ready){b.ready.call(this);}}
-if(this.ready){this.ready();}
-this._readied=true;if(this._attachedPending){this._attachedPending=false;this.attachedCallback();}},_beforeClientsReady:function(){},_afterClientsReady:function(){},_beforeAttached:function(){},attachedCallback:function(){if(this._readied){this._beforeAttached();baseAttachedCallback.call(this);}else{this._attachedPending=true;}},detachedCallback:function(){if(this._readied){baseDetachedCallback.call(this);}else{this._attachedPending=false;}}});}());Polymer.ArraySplice=function(){function newSplice(index,removed,addedCount){return{index:index,removed:removed,addedCount:addedCount};}
-var EDIT_LEAVE=0;var EDIT_UPDATE=1;var EDIT_ADD=2;var EDIT_DELETE=3;function ArraySplice(){}
-ArraySplice.prototype={calcEditDistances:function(current,currentStart,currentEnd,old,oldStart,oldEnd){var rowCount=oldEnd-oldStart+1;var columnCount=currentEnd-currentStart+1;var distances=new Array(rowCount);for(var i=0;i<rowCount;i++){distances[i]=new Array(columnCount);distances[i][0]=i;}
-for(var j=0;j<columnCount;j++)
-distances[0][j]=j;for(i=1;i<rowCount;i++){for(j=1;j<columnCount;j++){if(this.equals(current[currentStart+j-1],old[oldStart+i-1]))
-distances[i][j]=distances[i-1][j-1];else{var north=distances[i-1][j]+1;var west=distances[i][j-1]+1;distances[i][j]=north<west?north:west;}}}
-return distances;},spliceOperationsFromEditDistances:function(distances){var i=distances.length-1;var j=distances[0].length-1;var current=distances[i][j];var edits=[];while(i>0||j>0){if(i==0){edits.push(EDIT_ADD);j--;continue;}
-if(j==0){edits.push(EDIT_DELETE);i--;continue;}
-var northWest=distances[i-1][j-1];var west=distances[i-1][j];var north=distances[i][j-1];var min;if(west<north)
-min=west<northWest?west:northWest;else
-min=north<northWest?north:northWest;if(min==northWest){if(northWest==current){edits.push(EDIT_LEAVE);}else{edits.push(EDIT_UPDATE);current=northWest;}
-i--;j--;}else if(min==west){edits.push(EDIT_DELETE);i--;current=west;}else{edits.push(EDIT_ADD);j--;current=north;}}
-edits.reverse();return edits;},calcSplices:function(current,currentStart,currentEnd,old,oldStart,oldEnd){var prefixCount=0;var suffixCount=0;var minLength=Math.min(currentEnd-currentStart,oldEnd-oldStart);if(currentStart==0&&oldStart==0)
-prefixCount=this.sharedPrefix(current,old,minLength);if(currentEnd==current.length&&oldEnd==old.length)
-suffixCount=this.sharedSuffix(current,old,minLength-prefixCount);currentStart+=prefixCount;oldStart+=prefixCount;currentEnd-=suffixCount;oldEnd-=suffixCount;if(currentEnd-currentStart==0&&oldEnd-oldStart==0)
-return[];if(currentStart==currentEnd){var splice=newSplice(currentStart,[],0);while(oldStart<oldEnd)
-splice.removed.push(old[oldStart++]);return[splice];}else if(oldStart==oldEnd)
-return[newSplice(currentStart,[],currentEnd-currentStart)];var ops=this.spliceOperationsFromEditDistances(this.calcEditDistances(current,currentStart,currentEnd,old,oldStart,oldEnd));splice=undefined;var splices=[];var index=currentStart;var oldIndex=oldStart;for(var i=0;i<ops.length;i++){switch(ops[i]){case EDIT_LEAVE:if(splice){splices.push(splice);splice=undefined;}
-index++;oldIndex++;break;case EDIT_UPDATE:if(!splice)
-splice=newSplice(index,[],0);splice.addedCount++;index++;splice.removed.push(old[oldIndex]);oldIndex++;break;case EDIT_ADD:if(!splice)
-splice=newSplice(index,[],0);splice.addedCount++;index++;break;case EDIT_DELETE:if(!splice)
-splice=newSplice(index,[],0);splice.removed.push(old[oldIndex]);oldIndex++;break;}}
-if(splice){splices.push(splice);}
-return splices;},sharedPrefix:function(current,old,searchLength){for(var i=0;i<searchLength;i++)
-if(!this.equals(current[i],old[i]))
-return i;return searchLength;},sharedSuffix:function(current,old,searchLength){var index1=current.length;var index2=old.length;var count=0;while(count<searchLength&&this.equals(current[--index1],old[--index2]))
-count++;return count;},calculateSplices:function(current,previous){return this.calcSplices(current,0,current.length,previous,0,previous.length);},equals:function(currentValue,previousValue){return currentValue===previousValue;}};return new ArraySplice();}();Polymer.domInnerHTML=function(){var escapeAttrRegExp=/[&\u00A0"]/g;var escapeDataRegExp=/[&\u00A0<>]/g;function escapeReplace(c){switch(c){case'&':return'&amp;';case'<':return'&lt;';case'>':return'&gt;';case'"':return'&quot;';case'\xA0':return'&nbsp;';}}
-function escapeAttr(s){return s.replace(escapeAttrRegExp,escapeReplace);}
-function escapeData(s){return s.replace(escapeDataRegExp,escapeReplace);}
-function makeSet(arr){var set={};for(var i=0;i<arr.length;i++){set[arr[i]]=true;}
-return set;}
-var voidElements=makeSet(['area','base','br','col','command','embed','hr','img','input','keygen','link','meta','param','source','track','wbr']);var plaintextParents=makeSet(['style','script','xmp','iframe','noembed','noframes','plaintext','noscript']);function getOuterHTML(node,parentNode,composed){switch(node.nodeType){case Node.ELEMENT_NODE:var tagName=node.localName;var s='<'+tagName;var attrs=node.attributes;for(var i=0,attr;attr=attrs[i];i++){s+=' '+attr.name+'="'+escapeAttr(attr.value)+'"';}
-s+='>';if(voidElements[tagName]){return s;}
-return s+getInnerHTML(node,composed)+'</'+tagName+'>';case Node.TEXT_NODE:var data=node.data;if(parentNode&&plaintextParents[parentNode.localName]){return data;}
-return escapeData(data);case Node.COMMENT_NODE:return'<!--'+node.data+'-->';default:console.error(node);throw new Error('not implemented');}}
-function getInnerHTML(node,composed){if(node instanceof HTMLTemplateElement)
-node=node.content;var s='';var c$=Polymer.dom(node).childNodes;for(var i=0,l=c$.length,child;i<l&&(child=c$[i]);i++){s+=getOuterHTML(child,node,composed);}
-return s;}
-return{getInnerHTML:getInnerHTML};}();(function(){'use strict';var nativeInsertBefore=Element.prototype.insertBefore;var nativeAppendChild=Element.prototype.appendChild;var nativeRemoveChild=Element.prototype.removeChild;Polymer.TreeApi={arrayCopyChildNodes:function(parent){var copy=[],i=0;for(var n=parent.firstChild;n;n=n.nextSibling){copy[i++]=n;}
-return copy;},arrayCopyChildren:function(parent){var copy=[],i=0;for(var n=parent.firstElementChild;n;n=n.nextElementSibling){copy[i++]=n;}
-return copy;},arrayCopy:function(a$){var l=a$.length;var copy=new Array(l);for(var i=0;i<l;i++){copy[i]=a$[i];}
-return copy;}};Polymer.TreeApi.Logical={hasParentNode:function(node){return Boolean(node.__dom&&node.__dom.parentNode);},hasChildNodes:function(node){return Boolean(node.__dom&&node.__dom.childNodes!==undefined);},getChildNodes:function(node){return this.hasChildNodes(node)?this._getChildNodes(node):node.childNodes;},_getChildNodes:function(node){if(!node.__dom.childNodes){node.__dom.childNodes=[];for(var n=node.__dom.firstChild;n;n=n.__dom.nextSibling){node.__dom.childNodes.push(n);}}
-return node.__dom.childNodes;},getParentNode:function(node){return node.__dom&&node.__dom.parentNode!==undefined?node.__dom.parentNode:node.parentNode;},getFirstChild:function(node){return node.__dom&&node.__dom.firstChild!==undefined?node.__dom.firstChild:node.firstChild;},getLastChild:function(node){return node.__dom&&node.__dom.lastChild!==undefined?node.__dom.lastChild:node.lastChild;},getNextSibling:function(node){return node.__dom&&node.__dom.nextSibling!==undefined?node.__dom.nextSibling:node.nextSibling;},getPreviousSibling:function(node){return node.__dom&&node.__dom.previousSibling!==undefined?node.__dom.previousSibling:node.previousSibling;},getFirstElementChild:function(node){return node.__dom&&node.__dom.firstChild!==undefined?this._getFirstElementChild(node):node.firstElementChild;},_getFirstElementChild:function(node){var n=node.__dom.firstChild;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.nextSibling;}
-return n;},getLastElementChild:function(node){return node.__dom&&node.__dom.lastChild!==undefined?this._getLastElementChild(node):node.lastElementChild;},_getLastElementChild:function(node){var n=node.__dom.lastChild;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.previousSibling;}
-return n;},getNextElementSibling:function(node){return node.__dom&&node.__dom.nextSibling!==undefined?this._getNextElementSibling(node):node.nextElementSibling;},_getNextElementSibling:function(node){var n=node.__dom.nextSibling;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.nextSibling;}
-return n;},getPreviousElementSibling:function(node){return node.__dom&&node.__dom.previousSibling!==undefined?this._getPreviousElementSibling(node):node.previousElementSibling;},_getPreviousElementSibling:function(node){var n=node.__dom.previousSibling;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.previousSibling;}
-return n;},saveChildNodes:function(node){if(!this.hasChildNodes(node)){node.__dom=node.__dom||{};node.__dom.firstChild=node.firstChild;node.__dom.lastChild=node.lastChild;node.__dom.childNodes=[];for(var n=node.firstChild;n;n=n.nextSibling){n.__dom=n.__dom||{};n.__dom.parentNode=node;node.__dom.childNodes.push(n);n.__dom.nextSibling=n.nextSibling;n.__dom.previousSibling=n.previousSibling;}}},recordInsertBefore:function(node,container,ref_node){container.__dom.childNodes=null;if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){for(var n=node.firstChild;n;n=n.nextSibling){this._linkNode(n,container,ref_node);}}else{this._linkNode(node,container,ref_node);}},_linkNode:function(node,container,ref_node){node.__dom=node.__dom||{};container.__dom=container.__dom||{};if(ref_node){ref_node.__dom=ref_node.__dom||{};}
-node.__dom.previousSibling=ref_node?ref_node.__dom.previousSibling:container.__dom.lastChild;if(node.__dom.previousSibling){node.__dom.previousSibling.__dom.nextSibling=node;}
-node.__dom.nextSibling=ref_node||null;if(node.__dom.nextSibling){node.__dom.nextSibling.__dom.previousSibling=node;}
-node.__dom.parentNode=container;if(ref_node){if(ref_node===container.__dom.firstChild){container.__dom.firstChild=node;}}else{container.__dom.lastChild=node;if(!container.__dom.firstChild){container.__dom.firstChild=node;}}
-container.__dom.childNodes=null;},recordRemoveChild:function(node,container){node.__dom=node.__dom||{};container.__dom=container.__dom||{};if(node===container.__dom.firstChild){container.__dom.firstChild=node.__dom.nextSibling;}
-if(node===container.__dom.lastChild){container.__dom.lastChild=node.__dom.previousSibling;}
-var p=node.__dom.previousSibling;var n=node.__dom.nextSibling;if(p){p.__dom.nextSibling=n;}
-if(n){n.__dom.previousSibling=p;}
-node.__dom.parentNode=node.__dom.previousSibling=node.__dom.nextSibling=undefined;container.__dom.childNodes=null;}};Polymer.TreeApi.Composed={getChildNodes:function(node){return Polymer.TreeApi.arrayCopyChildNodes(node);},getParentNode:function(node){return node.parentNode;},clearChildNodes:function(node){node.textContent='';},insertBefore:function(parentNode,newChild,refChild){return nativeInsertBefore.call(parentNode,newChild,refChild||null);},appendChild:function(parentNode,newChild){return nativeAppendChild.call(parentNode,newChild);},removeChild:function(parentNode,node){return nativeRemoveChild.call(parentNode,node);}};}());Polymer.DomApi=function(){'use strict';var Settings=Polymer.Settings;var TreeApi=Polymer.TreeApi;var DomApi=function(node){this.node=needsToWrap?DomApi.wrap(node):node;};var needsToWrap=Settings.hasShadow&&!Settings.nativeShadow;DomApi.wrap=window.wrap?window.wrap:function(node){return node;};DomApi.prototype={flush:function(){Polymer.dom.flush();},deepContains:function(node){if(this.node.contains(node)){return true;}
-var n=node;var doc=node.ownerDocument;while(n&&n!==doc&&n!==this.node){n=Polymer.dom(n).parentNode||n.host;}
-return n===this.node;},queryDistributedElements:function(selector){var c$=this.getEffectiveChildNodes();var list=[];for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){if(c.nodeType===Node.ELEMENT_NODE&&DomApi.matchesSelector.call(c,selector)){list.push(c);}}
-return list;},getEffectiveChildNodes:function(){var list=[];var c$=this.childNodes;for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){if(c.localName===CONTENT){var d$=dom(c).getDistributedNodes();for(var j=0;j<d$.length;j++){list.push(d$[j]);}}else{list.push(c);}}
-return list;},observeNodes:function(callback){if(callback){if(!this.observer){this.observer=this.node.localName===CONTENT?new DomApi.DistributedNodesObserver(this):new DomApi.EffectiveNodesObserver(this);}
-return this.observer.addListener(callback);}},unobserveNodes:function(handle){if(this.observer){this.observer.removeListener(handle);}},notifyObserver:function(){if(this.observer){this.observer.notify();}},_query:function(matcher,node,halter){node=node||this.node;var list=[];this._queryElements(TreeApi.Logical.getChildNodes(node),matcher,halter,list);return list;},_queryElements:function(elements,matcher,halter,list){for(var i=0,l=elements.length,c;i<l&&(c=elements[i]);i++){if(c.nodeType===Node.ELEMENT_NODE){if(this._queryElement(c,matcher,halter,list)){return true;}}}},_queryElement:function(node,matcher,halter,list){var result=matcher(node);if(result){list.push(node);}
-if(halter&&halter(result)){return result;}
-this._queryElements(TreeApi.Logical.getChildNodes(node),matcher,halter,list);}};var CONTENT=DomApi.CONTENT='content';var dom=DomApi.factory=function(node){node=node||document;if(!node.__domApi){node.__domApi=new DomApi.ctor(node);}
-return node.__domApi;};DomApi.hasApi=function(node){return Boolean(node.__domApi);};DomApi.ctor=DomApi;Polymer.dom=function(obj,patch){if(obj instanceof Event){return Polymer.EventApi.factory(obj);}else{return DomApi.factory(obj,patch);}};var p=Element.prototype;DomApi.matchesSelector=p.matches||p.matchesSelector||p.mozMatchesSelector||p.msMatchesSelector||p.oMatchesSelector||p.webkitMatchesSelector;return DomApi;}();(function(){'use strict';var Settings=Polymer.Settings;var DomApi=Polymer.DomApi;var dom=DomApi.factory;var TreeApi=Polymer.TreeApi;var getInnerHTML=Polymer.domInnerHTML.getInnerHTML;var CONTENT=DomApi.CONTENT;if(Settings.useShadow){return;}
-var nativeCloneNode=Element.prototype.cloneNode;var nativeImportNode=Document.prototype.importNode;Polymer.Base.mixin(DomApi.prototype,{_lazyDistribute:function(host){if(host.shadyRoot&&host.shadyRoot._distributionClean){host.shadyRoot._distributionClean=false;Polymer.dom.addDebouncer(host.debounce('_distribute',host._distributeContent));}},appendChild:function(node){return this.insertBefore(node);},insertBefore:function(node,ref_node){if(ref_node&&TreeApi.Logical.getParentNode(ref_node)!==this.node){throw Error('The ref_node to be inserted before is not a child '+'of this node');}
-if(node.nodeType!==Node.DOCUMENT_FRAGMENT_NODE){var parent=TreeApi.Logical.getParentNode(node);if(parent){if(DomApi.hasApi(parent)){dom(parent).notifyObserver();}
-this._removeNode(node);}else{this._removeOwnerShadyRoot(node);}}
-if(!this._addNode(node,ref_node)){if(ref_node){ref_node=ref_node.localName===CONTENT?this._firstComposedNode(ref_node):ref_node;}
-var container=this.node._isShadyRoot?this.node.host:this.node;if(ref_node){TreeApi.Composed.insertBefore(container,node,ref_node);}else{TreeApi.Composed.appendChild(container,node);}}
-this.notifyObserver();return node;},_addNode:function(node,ref_node){var root=this.getOwnerRoot();if(root){var ipAdded=this._maybeAddInsertionPoint(node,this.node);if(!root._invalidInsertionPoints){root._invalidInsertionPoints=ipAdded;}
-this._addNodeToHost(root.host,node);}
-if(TreeApi.Logical.hasChildNodes(this.node)){TreeApi.Logical.recordInsertBefore(node,this.node,ref_node);}
-var handled=this._maybeDistribute(node)||this.node.shadyRoot;if(handled){if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){while(node.firstChild){TreeApi.Composed.removeChild(node,node.firstChild);}}else{var parent=TreeApi.Composed.getParentNode(node);if(parent){TreeApi.Composed.removeChild(parent,node);}}}
-return handled;},removeChild:function(node){if(TreeApi.Logical.getParentNode(node)!==this.node){throw Error('The node to be removed is not a child of this node: '+node);}
-if(!this._removeNode(node)){var container=this.node._isShadyRoot?this.node.host:this.node;var parent=TreeApi.Composed.getParentNode(node);if(container===parent){TreeApi.Composed.removeChild(container,node);}}
-this.notifyObserver();return node;},_removeNode:function(node){var logicalParent=TreeApi.Logical.hasParentNode(node)&&TreeApi.Logical.getParentNode(node);var distributed;var root=this._ownerShadyRootForNode(node);if(logicalParent){distributed=dom(node)._maybeDistributeParent();TreeApi.Logical.recordRemoveChild(node,logicalParent);if(root&&this._removeDistributedChildren(root,node)){root._invalidInsertionPoints=true;this._lazyDistribute(root.host);}}
-this._removeOwnerShadyRoot(node);if(root){this._removeNodeFromHost(root.host,node);}
-return distributed;},replaceChild:function(node,ref_node){this.insertBefore(node,ref_node);this.removeChild(ref_node);return node;},_hasCachedOwnerRoot:function(node){return Boolean(node._ownerShadyRoot!==undefined);},getOwnerRoot:function(){return this._ownerShadyRootForNode(this.node);},_ownerShadyRootForNode:function(node){if(!node){return;}
-var root=node._ownerShadyRoot;if(root===undefined){if(node._isShadyRoot){root=node;}else{var parent=TreeApi.Logical.getParentNode(node);if(parent){root=parent._isShadyRoot?parent:this._ownerShadyRootForNode(parent);}else{root=null;}}
-if(root||document.documentElement.contains(node)){node._ownerShadyRoot=root;}}
-return root;},_maybeDistribute:function(node){var fragContent=node.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&!node.__noContent&&dom(node).querySelector(CONTENT);var wrappedContent=fragContent&&TreeApi.Logical.getParentNode(fragContent).nodeType!==Node.DOCUMENT_FRAGMENT_NODE;var hasContent=fragContent||node.localName===CONTENT;if(hasContent){var root=this.getOwnerRoot();if(root){this._lazyDistribute(root.host);}}
-var needsDist=this._nodeNeedsDistribution(this.node);if(needsDist){this._lazyDistribute(this.node);}
-return needsDist||hasContent&&!wrappedContent;},_maybeAddInsertionPoint:function(node,parent){var added;if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&!node.__noContent){var c$=dom(node).querySelectorAll(CONTENT);for(var i=0,n,np,na;i<c$.length&&(n=c$[i]);i++){np=TreeApi.Logical.getParentNode(n);if(np===node){np=parent;}
-na=this._maybeAddInsertionPoint(n,np);added=added||na;}}else if(node.localName===CONTENT){TreeApi.Logical.saveChildNodes(parent);TreeApi.Logical.saveChildNodes(node);added=true;}
-return added;},_updateInsertionPoints:function(host){var i$=host.shadyRoot._insertionPoints=dom(host.shadyRoot).querySelectorAll(CONTENT);for(var i=0,c;i<i$.length;i++){c=i$[i];TreeApi.Logical.saveChildNodes(c);TreeApi.Logical.saveChildNodes(TreeApi.Logical.getParentNode(c));}},_nodeNeedsDistribution:function(node){return node&&node.shadyRoot&&DomApi.hasInsertionPoint(node.shadyRoot);},_addNodeToHost:function(host,node){if(host._elementAdd){host._elementAdd(node);}},_removeNodeFromHost:function(host,node){if(host._elementRemove){host._elementRemove(node);}},_removeDistributedChildren:function(root,container){var hostNeedsDist;var ip$=root._insertionPoints;for(var i=0;i<ip$.length;i++){var content=ip$[i];if(this._contains(container,content)){var dc$=dom(content).getDistributedNodes();for(var j=0;j<dc$.length;j++){hostNeedsDist=true;var node=dc$[j];var parent=TreeApi.Composed.getParentNode(node);if(parent){TreeApi.Composed.removeChild(parent,node);}}}}
-return hostNeedsDist;},_contains:function(container,node){while(node){if(node==container){return true;}
-node=TreeApi.Logical.getParentNode(node);}},_removeOwnerShadyRoot:function(node){if(this._hasCachedOwnerRoot(node)){var c$=TreeApi.Logical.getChildNodes(node);for(var i=0,l=c$.length,n;i<l&&(n=c$[i]);i++){this._removeOwnerShadyRoot(n);}}
-node._ownerShadyRoot=undefined;},_firstComposedNode:function(content){var n$=dom(content).getDistributedNodes();for(var i=0,l=n$.length,n,p$;i<l&&(n=n$[i]);i++){p$=dom(n).getDestinationInsertionPoints();if(p$[p$.length-1]===content){return n;}}},querySelector:function(selector){var result=this._query(function(n){return DomApi.matchesSelector.call(n,selector);},this.node,function(n){return Boolean(n);})[0];return result||null;},querySelectorAll:function(selector){return this._query(function(n){return DomApi.matchesSelector.call(n,selector);},this.node);},getDestinationInsertionPoints:function(){return this.node._destinationInsertionPoints||[];},getDistributedNodes:function(){return this.node._distributedNodes||[];},_clear:function(){while(this.childNodes.length){this.removeChild(this.childNodes[0]);}},setAttribute:function(name,value){this.node.setAttribute(name,value);this._maybeDistributeParent();},removeAttribute:function(name){this.node.removeAttribute(name);this._maybeDistributeParent();},_maybeDistributeParent:function(){if(this._nodeNeedsDistribution(this.parentNode)){this._lazyDistribute(this.parentNode);return true;}},cloneNode:function(deep){var n=nativeCloneNode.call(this.node,false);if(deep){var c$=this.childNodes;var d=dom(n);for(var i=0,nc;i<c$.length;i++){nc=dom(c$[i]).cloneNode(true);d.appendChild(nc);}}
-return n;},importNode:function(externalNode,deep){var doc=this.node instanceof Document?this.node:this.node.ownerDocument;var n=nativeImportNode.call(doc,externalNode,false);if(deep){var c$=TreeApi.Logical.getChildNodes(externalNode);var d=dom(n);for(var i=0,nc;i<c$.length;i++){nc=dom(doc).importNode(c$[i],true);d.appendChild(nc);}}
-return n;},_getComposedInnerHTML:function(){return getInnerHTML(this.node,true);}});Object.defineProperties(DomApi.prototype,{activeElement:{get:function(){var active=document.activeElement;if(!active){return null;}
-var isShadyRoot=!!this.node._isShadyRoot;if(this.node!==document){if(!isShadyRoot){return null;}
-if(this.node.host===active||!this.node.host.contains(active)){return null;}}
-var activeRoot=dom(active).getOwnerRoot();while(activeRoot&&activeRoot!==this.node){active=activeRoot.host;activeRoot=dom(active).getOwnerRoot();}
-if(this.node===document){return activeRoot?null:active;}else{return activeRoot===this.node?active:null;}},configurable:true},childNodes:{get:function(){var c$=TreeApi.Logical.getChildNodes(this.node);return Array.isArray(c$)?c$:TreeApi.arrayCopyChildNodes(this.node);},configurable:true},children:{get:function(){if(TreeApi.Logical.hasChildNodes(this.node)){return Array.prototype.filter.call(this.childNodes,function(n){return n.nodeType===Node.ELEMENT_NODE;});}else{return TreeApi.arrayCopyChildren(this.node);}},configurable:true},parentNode:{get:function(){return TreeApi.Logical.getParentNode(this.node);},configurable:true},firstChild:{get:function(){return TreeApi.Logical.getFirstChild(this.node);},configurable:true},lastChild:{get:function(){return TreeApi.Logical.getLastChild(this.node);},configurable:true},nextSibling:{get:function(){return TreeApi.Logical.getNextSibling(this.node);},configurable:true},previousSibling:{get:function(){return TreeApi.Logical.getPreviousSibling(this.node);},configurable:true},firstElementChild:{get:function(){return TreeApi.Logical.getFirstElementChild(this.node);},configurable:true},lastElementChild:{get:function(){return TreeApi.Logical.getLastElementChild(this.node);},configurable:true},nextElementSibling:{get:function(){return TreeApi.Logical.getNextElementSibling(this.node);},configurable:true},previousElementSibling:{get:function(){return TreeApi.Logical.getPreviousElementSibling(this.node);},configurable:true},textContent:{get:function(){var nt=this.node.nodeType;if(nt===Node.TEXT_NODE||nt===Node.COMMENT_NODE){return this.node.textContent;}else{var tc=[];for(var i=0,cn=this.childNodes,c;c=cn[i];i++){if(c.nodeType!==Node.COMMENT_NODE){tc.push(c.textContent);}}
-return tc.join('');}},set:function(text){var nt=this.node.nodeType;if(nt===Node.TEXT_NODE||nt===Node.COMMENT_NODE){this.node.textContent=text;}else{this._clear();if(text){this.appendChild(document.createTextNode(text));}}},configurable:true},innerHTML:{get:function(){var nt=this.node.nodeType;if(nt===Node.TEXT_NODE||nt===Node.COMMENT_NODE){return null;}else{return getInnerHTML(this.node);}},set:function(text){var nt=this.node.nodeType;if(nt!==Node.TEXT_NODE||nt!==Node.COMMENT_NODE){this._clear();var d=document.createElement('div');d.innerHTML=text;var c$=TreeApi.arrayCopyChildNodes(d);for(var i=0;i<c$.length;i++){this.appendChild(c$[i]);}}},configurable:true}});DomApi.hasInsertionPoint=function(root){return Boolean(root&&root._insertionPoints.length);};}());(function(){'use strict';var Settings=Polymer.Settings;var TreeApi=Polymer.TreeApi;var DomApi=Polymer.DomApi;if(!Settings.useShadow){return;}
-Polymer.Base.mixin(DomApi.prototype,{querySelectorAll:function(selector){return TreeApi.arrayCopy(this.node.querySelectorAll(selector));},getOwnerRoot:function(){var n=this.node;while(n){if(n.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&n.host){return n;}
-n=n.parentNode;}},importNode:function(externalNode,deep){var doc=this.node instanceof Document?this.node:this.node.ownerDocument;return doc.importNode(externalNode,deep);},getDestinationInsertionPoints:function(){var n$=this.node.getDestinationInsertionPoints&&this.node.getDestinationInsertionPoints();return n$?TreeApi.arrayCopy(n$):[];},getDistributedNodes:function(){var n$=this.node.getDistributedNodes&&this.node.getDistributedNodes();return n$?TreeApi.arrayCopy(n$):[];}});Object.defineProperties(DomApi.prototype,{activeElement:{get:function(){var node=DomApi.wrap(this.node);var activeElement=node.activeElement;return node.contains(activeElement)?activeElement:null;},configurable:true},childNodes:{get:function(){return TreeApi.arrayCopyChildNodes(this.node);},configurable:true},children:{get:function(){return TreeApi.arrayCopyChildren(this.node);},configurable:true},textContent:{get:function(){return this.node.textContent;},set:function(value){return this.node.textContent=value;},configurable:true},innerHTML:{get:function(){return this.node.innerHTML;},set:function(value){return this.node.innerHTML=value;},configurable:true}});var forwardMethods=function(m$){for(var i=0;i<m$.length;i++){forwardMethod(m$[i]);}};var forwardMethod=function(method){DomApi.prototype[method]=function(){return this.node[method].apply(this.node,arguments);};};forwardMethods(['cloneNode','appendChild','insertBefore','removeChild','replaceChild','setAttribute','removeAttribute','querySelector']);var forwardProperties=function(f$){for(var i=0;i<f$.length;i++){forwardProperty(f$[i]);}};var forwardProperty=function(name){Object.defineProperty(DomApi.prototype,name,{get:function(){return this.node[name];},configurable:true});};forwardProperties(['parentNode','firstChild','lastChild','nextSibling','previousSibling','firstElementChild','lastElementChild','nextElementSibling','previousElementSibling']);}());Polymer.Base.mixin(Polymer.dom,{_flushGuard:0,_FLUSH_MAX:100,_needsTakeRecords:!Polymer.Settings.useNativeCustomElements,_debouncers:[],_staticFlushList:[],_finishDebouncer:null,flush:function(){this._flushGuard=0;this._prepareFlush();while(this._debouncers.length&&this._flushGuard<this._FLUSH_MAX){while(this._debouncers.length){this._debouncers.shift().complete();}
-if(this._finishDebouncer){this._finishDebouncer.complete();}
-this._prepareFlush();this._flushGuard++;}
-if(this._flushGuard>=this._FLUSH_MAX){console.warn('Polymer.dom.flush aborted. Flush may not be complete.');}},_prepareFlush:function(){if(this._needsTakeRecords){CustomElements.takeRecords();}
-for(var i=0;i<this._staticFlushList.length;i++){this._staticFlushList[i]();}},addStaticFlush:function(fn){this._staticFlushList.push(fn);},removeStaticFlush:function(fn){var i=this._staticFlushList.indexOf(fn);if(i>=0){this._staticFlushList.splice(i,1);}},addDebouncer:function(debouncer){this._debouncers.push(debouncer);this._finishDebouncer=Polymer.Debounce(this._finishDebouncer,this._finishFlush);},_finishFlush:function(){Polymer.dom._debouncers=[];}});Polymer.EventApi=function(){'use strict';var DomApi=Polymer.DomApi.ctor;var Settings=Polymer.Settings;DomApi.Event=function(event){this.event=event;};if(Settings.useShadow){DomApi.Event.prototype={get rootTarget(){return this.event.path[0];},get localTarget(){return this.event.target;},get path(){var path=this.event.path;if(!Array.isArray(path)){path=Array.prototype.slice.call(path);}
-return path;}};}else{DomApi.Event.prototype={get rootTarget(){return this.event.target;},get localTarget(){var current=this.event.currentTarget;var currentRoot=current&&Polymer.dom(current).getOwnerRoot();var p$=this.path;for(var i=0;i<p$.length;i++){if(Polymer.dom(p$[i]).getOwnerRoot()===currentRoot){return p$[i];}}},get path(){if(!this.event._path){var path=[];var current=this.rootTarget;while(current){path.push(current);var insertionPoints=Polymer.dom(current).getDestinationInsertionPoints();if(insertionPoints.length){for(var i=0;i<insertionPoints.length-1;i++){path.push(insertionPoints[i]);}
-current=insertionPoints[insertionPoints.length-1];}else{current=Polymer.dom(current).parentNode||current.host;}}
-path.push(window);this.event._path=path;}
-return this.event._path;}};}
-var factory=function(event){if(!event.__eventApi){event.__eventApi=new DomApi.Event(event);}
-return event.__eventApi;};return{factory:factory};}();(function(){'use strict';var DomApi=Polymer.DomApi.ctor;var useShadow=Polymer.Settings.useShadow;Object.defineProperty(DomApi.prototype,'classList',{get:function(){if(!this._classList){this._classList=new DomApi.ClassList(this);}
-return this._classList;},configurable:true});DomApi.ClassList=function(host){this.domApi=host;this.node=host.node;};DomApi.ClassList.prototype={add:function(){this.node.classList.add.apply(this.node.classList,arguments);this._distributeParent();},remove:function(){this.node.classList.remove.apply(this.node.classList,arguments);this._distributeParent();},toggle:function(){this.node.classList.toggle.apply(this.node.classList,arguments);this._distributeParent();},_distributeParent:function(){if(!useShadow){this.domApi._maybeDistributeParent();}},contains:function(){return this.node.classList.contains.apply(this.node.classList,arguments);}};}());(function(){'use strict';var DomApi=Polymer.DomApi.ctor;var Settings=Polymer.Settings;DomApi.EffectiveNodesObserver=function(domApi){this.domApi=domApi;this.node=this.domApi.node;this._listeners=[];};DomApi.EffectiveNodesObserver.prototype={addListener:function(callback){if(!this._isSetup){this._setup();this._isSetup=true;}
-var listener={fn:callback,_nodes:[]};this._listeners.push(listener);this._scheduleNotify();return listener;},removeListener:function(handle){var i=this._listeners.indexOf(handle);if(i>=0){this._listeners.splice(i,1);handle._nodes=[];}
-if(!this._hasListeners()){this._cleanup();this._isSetup=false;}},_setup:function(){this._observeContentElements(this.domApi.childNodes);},_cleanup:function(){this._unobserveContentElements(this.domApi.childNodes);},_hasListeners:function(){return Boolean(this._listeners.length);},_scheduleNotify:function(){if(this._debouncer){this._debouncer.stop();}
-this._debouncer=Polymer.Debounce(this._debouncer,this._notify);this._debouncer.context=this;Polymer.dom.addDebouncer(this._debouncer);},notify:function(){if(this._hasListeners()){this._scheduleNotify();}},_notify:function(){this._beforeCallListeners();this._callListeners();},_beforeCallListeners:function(){this._updateContentElements();},_updateContentElements:function(){this._observeContentElements(this.domApi.childNodes);},_observeContentElements:function(elements){for(var i=0,n;i<elements.length&&(n=elements[i]);i++){if(this._isContent(n)){n.__observeNodesMap=n.__observeNodesMap||new WeakMap();if(!n.__observeNodesMap.has(this)){n.__observeNodesMap.set(this,this._observeContent(n));}}}},_observeContent:function(content){var self=this;var h=Polymer.dom(content).observeNodes(function(){self._scheduleNotify();});h._avoidChangeCalculation=true;return h;},_unobserveContentElements:function(elements){for(var i=0,n,h;i<elements.length&&(n=elements[i]);i++){if(this._isContent(n)){h=n.__observeNodesMap.get(this);if(h){Polymer.dom(n).unobserveNodes(h);n.__observeNodesMap.delete(this);}}}},_isContent:function(node){return node.localName==='content';},_callListeners:function(){var o$=this._listeners;var nodes=this._getEffectiveNodes();for(var i=0,o;i<o$.length&&(o=o$[i]);i++){var info=this._generateListenerInfo(o,nodes);if(info||o._alwaysNotify){this._callListener(o,info);}}},_getEffectiveNodes:function(){return this.domApi.getEffectiveChildNodes();},_generateListenerInfo:function(listener,newNodes){if(listener._avoidChangeCalculation){return true;}
-var oldNodes=listener._nodes;var info={target:this.node,addedNodes:[],removedNodes:[]};var splices=Polymer.ArraySplice.calculateSplices(newNodes,oldNodes);for(var i=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0,n;j<s.removed.length&&(n=s.removed[j]);j++){info.removedNodes.push(n);}}
-for(i=0,s;i<splices.length&&(s=splices[i]);i++){for(j=s.index;j<s.index+s.addedCount;j++){info.addedNodes.push(newNodes[j]);}}
-listener._nodes=newNodes;if(info.addedNodes.length||info.removedNodes.length){return info;}},_callListener:function(listener,info){return listener.fn.call(this.node,info);},enableShadowAttributeTracking:function(){}};if(Settings.useShadow){var baseSetup=DomApi.EffectiveNodesObserver.prototype._setup;var baseCleanup=DomApi.EffectiveNodesObserver.prototype._cleanup;Polymer.Base.mixin(DomApi.EffectiveNodesObserver.prototype,{_setup:function(){if(!this._observer){var self=this;this._mutationHandler=function(mxns){if(mxns&&mxns.length){self._scheduleNotify();}};this._observer=new MutationObserver(this._mutationHandler);this._boundFlush=function(){self._flush();};Polymer.dom.addStaticFlush(this._boundFlush);this._observer.observe(this.node,{childList:true});}
-baseSetup.call(this);},_cleanup:function(){this._observer.disconnect();this._observer=null;this._mutationHandler=null;Polymer.dom.removeStaticFlush(this._boundFlush);baseCleanup.call(this);},_flush:function(){if(this._observer){this._mutationHandler(this._observer.takeRecords());}},enableShadowAttributeTracking:function(){if(this._observer){this._makeContentListenersAlwaysNotify();this._observer.disconnect();this._observer.observe(this.node,{childList:true,attributes:true,subtree:true});var root=this.domApi.getOwnerRoot();var host=root&&root.host;if(host&&Polymer.dom(host).observer){Polymer.dom(host).observer.enableShadowAttributeTracking();}}},_makeContentListenersAlwaysNotify:function(){for(var i=0,h;i<this._listeners.length;i++){h=this._listeners[i];h._alwaysNotify=h._isContentListener;}}});}}());(function(){'use strict';var DomApi=Polymer.DomApi.ctor;var Settings=Polymer.Settings;DomApi.DistributedNodesObserver=function(domApi){DomApi.EffectiveNodesObserver.call(this,domApi);};DomApi.DistributedNodesObserver.prototype=Object.create(DomApi.EffectiveNodesObserver.prototype);Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype,{_setup:function(){},_cleanup:function(){},_beforeCallListeners:function(){},_getEffectiveNodes:function(){return this.domApi.getDistributedNodes();}});if(Settings.useShadow){Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype,{_setup:function(){if(!this._observer){var root=this.domApi.getOwnerRoot();var host=root&&root.host;if(host){var self=this;this._observer=Polymer.dom(host).observeNodes(function(){self._scheduleNotify();});this._observer._isContentListener=true;if(this._hasAttrSelect()){Polymer.dom(host).observer.enableShadowAttributeTracking();}}}},_hasAttrSelect:function(){var select=this.node.getAttribute('select');return select&&select.match(/[[.]+/);},_cleanup:function(){var root=this.domApi.getOwnerRoot();var host=root&&root.host;if(host){Polymer.dom(host).unobserveNodes(this._observer);}
-this._observer=null;}});}}());(function(){var DomApi=Polymer.DomApi;var TreeApi=Polymer.TreeApi;Polymer.Base._addFeature({_prepShady:function(){this._useContent=this._useContent||Boolean(this._template);},_setupShady:function(){this.shadyRoot=null;if(!this.__domApi){this.__domApi=null;}
-if(!this.__dom){this.__dom=null;}
-if(!this._ownerShadyRoot){this._ownerShadyRoot=undefined;}},_poolContent:function(){if(this._useContent){TreeApi.Logical.saveChildNodes(this);}},_setupRoot:function(){if(this._useContent){this._createLocalRoot();if(!this.dataHost){upgradeLogicalChildren(TreeApi.Logical.getChildNodes(this));}}},_createLocalRoot:function(){this.shadyRoot=this.root;this.shadyRoot._distributionClean=false;this.shadyRoot._hasDistributed=false;this.shadyRoot._isShadyRoot=true;this.shadyRoot._dirtyRoots=[];var i$=this.shadyRoot._insertionPoints=!this._notes||this._notes._hasContent?this.shadyRoot.querySelectorAll('content'):[];TreeApi.Logical.saveChildNodes(this.shadyRoot);for(var i=0,c;i<i$.length;i++){c=i$[i];TreeApi.Logical.saveChildNodes(c);TreeApi.Logical.saveChildNodes(c.parentNode);}
-this.shadyRoot.host=this;},distributeContent:function(updateInsertionPoints){if(this.shadyRoot){this.shadyRoot._invalidInsertionPoints=this.shadyRoot._invalidInsertionPoints||updateInsertionPoints;var host=getTopDistributingHost(this);Polymer.dom(this)._lazyDistribute(host);}},_distributeContent:function(){if(this._useContent&&!this.shadyRoot._distributionClean){if(this.shadyRoot._invalidInsertionPoints){Polymer.dom(this)._updateInsertionPoints(this);this.shadyRoot._invalidInsertionPoints=false;}
-this._beginDistribute();this._distributeDirtyRoots();this._finishDistribute();}},_beginDistribute:function(){if(this._useContent&&DomApi.hasInsertionPoint(this.shadyRoot)){this._resetDistribution();this._distributePool(this.shadyRoot,this._collectPool());}},_distributeDirtyRoots:function(){var c$=this.shadyRoot._dirtyRoots;for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){c._distributeContent();}
-this.shadyRoot._dirtyRoots=[];},_finishDistribute:function(){if(this._useContent){this.shadyRoot._distributionClean=true;if(DomApi.hasInsertionPoint(this.shadyRoot)){this._composeTree();notifyContentObservers(this.shadyRoot);}else{if(!this.shadyRoot._hasDistributed){TreeApi.Composed.clearChildNodes(this);this.appendChild(this.shadyRoot);}else{var children=this._composeNode(this);this._updateChildNodes(this,children);}}
-if(!this.shadyRoot._hasDistributed){notifyInitialDistribution(this);}
-this.shadyRoot._hasDistributed=true;}},elementMatches:function(selector,node){node=node||this;return DomApi.matchesSelector.call(node,selector);},_resetDistribution:function(){var children=TreeApi.Logical.getChildNodes(this);for(var i=0;i<children.length;i++){var child=children[i];if(child._destinationInsertionPoints){child._destinationInsertionPoints=undefined;}
-if(isInsertionPoint(child)){clearDistributedDestinationInsertionPoints(child);}}
-var root=this.shadyRoot;var p$=root._insertionPoints;for(var j=0;j<p$.length;j++){p$[j]._distributedNodes=[];}},_collectPool:function(){var pool=[];var children=TreeApi.Logical.getChildNodes(this);for(var i=0;i<children.length;i++){var child=children[i];if(isInsertionPoint(child)){pool.push.apply(pool,child._distributedNodes);}else{pool.push(child);}}
-return pool;},_distributePool:function(node,pool){var p$=node._insertionPoints;for(var i=0,l=p$.length,p;i<l&&(p=p$[i]);i++){this._distributeInsertionPoint(p,pool);maybeRedistributeParent(p,this);}},_distributeInsertionPoint:function(content,pool){var anyDistributed=false;for(var i=0,l=pool.length,node;i<l;i++){node=pool[i];if(!node){continue;}
-if(this._matchesContentSelect(node,content)){distributeNodeInto(node,content);pool[i]=undefined;anyDistributed=true;}}
-if(!anyDistributed){var children=TreeApi.Logical.getChildNodes(content);for(var j=0;j<children.length;j++){distributeNodeInto(children[j],content);}}},_composeTree:function(){this._updateChildNodes(this,this._composeNode(this));var p$=this.shadyRoot._insertionPoints;for(var i=0,l=p$.length,p,parent;i<l&&(p=p$[i]);i++){parent=TreeApi.Logical.getParentNode(p);if(!parent._useContent&&parent!==this&&parent!==this.shadyRoot){this._updateChildNodes(parent,this._composeNode(parent));}}},_composeNode:function(node){var children=[];var c$=TreeApi.Logical.getChildNodes(node.shadyRoot||node);for(var i=0;i<c$.length;i++){var child=c$[i];if(isInsertionPoint(child)){var distributedNodes=child._distributedNodes;for(var j=0;j<distributedNodes.length;j++){var distributedNode=distributedNodes[j];if(isFinalDestination(child,distributedNode)){children.push(distributedNode);}}}else{children.push(child);}}
-return children;},_updateChildNodes:function(container,children){var composed=TreeApi.Composed.getChildNodes(container);var splices=Polymer.ArraySplice.calculateSplices(children,composed);for(var i=0,d=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0,n;j<s.removed.length&&(n=s.removed[j]);j++){if(TreeApi.Composed.getParentNode(n)===container){TreeApi.Composed.removeChild(container,n);}
-composed.splice(s.index+d,1);}
-d-=s.addedCount;}
-for(var i=0,s,next;i<splices.length&&(s=splices[i]);i++){next=composed[s.index];for(j=s.index,n;j<s.index+s.addedCount;j++){n=children[j];TreeApi.Composed.insertBefore(container,n,next);composed.splice(j,0,n);}}},_matchesContentSelect:function(node,contentElement){var select=contentElement.getAttribute('select');if(!select){return true;}
-select=select.trim();if(!select){return true;}
-if(!(node instanceof Element)){return false;}
-var validSelectors=/^(:not\()?[*.#[a-zA-Z_|]/;if(!validSelectors.test(select)){return false;}
-return this.elementMatches(select,node);},_elementAdd:function(){},_elementRemove:function(){}});var domHostDesc={get:function(){var root=Polymer.dom(this).getOwnerRoot();return root&&root.host;},configurable:true};Object.defineProperty(Polymer.Base,'domHost',domHostDesc);Polymer.BaseDescriptors.domHost=domHostDesc;function distributeNodeInto(child,insertionPoint){insertionPoint._distributedNodes.push(child);var points=child._destinationInsertionPoints;if(!points){child._destinationInsertionPoints=[insertionPoint];}else{points.push(insertionPoint);}}
-function clearDistributedDestinationInsertionPoints(content){var e$=content._distributedNodes;if(e$){for(var i=0;i<e$.length;i++){var d=e$[i]._destinationInsertionPoints;if(d){d.splice(d.indexOf(content)+1,d.length);}}}}
-function maybeRedistributeParent(content,host){var parent=TreeApi.Logical.getParentNode(content);if(parent&&parent.shadyRoot&&DomApi.hasInsertionPoint(parent.shadyRoot)&&parent.shadyRoot._distributionClean){parent.shadyRoot._distributionClean=false;host.shadyRoot._dirtyRoots.push(parent);}}
-function isFinalDestination(insertionPoint,node){var points=node._destinationInsertionPoints;return points&&points[points.length-1]===insertionPoint;}
-function isInsertionPoint(node){return node.localName=='content';}
-function getTopDistributingHost(host){while(host&&hostNeedsRedistribution(host)){host=host.domHost;}
-return host;}
-function hostNeedsRedistribution(host){var c$=TreeApi.Logical.getChildNodes(host);for(var i=0,c;i<c$.length;i++){c=c$[i];if(c.localName&&c.localName==='content'){return host.domHost;}}}
-function notifyContentObservers(root){for(var i=0,c;i<root._insertionPoints.length;i++){c=root._insertionPoints[i];if(DomApi.hasApi(c)){Polymer.dom(c).notifyObserver();}}}
-function notifyInitialDistribution(host){if(DomApi.hasApi(host)){Polymer.dom(host).notifyObserver();}}
-var needsUpgrade=window.CustomElements&&!CustomElements.useNative;function upgradeLogicalChildren(children){if(needsUpgrade&&children){for(var i=0;i<children.length;i++){CustomElements.upgrade(children[i]);}}}}());if(Polymer.Settings.useShadow){Polymer.Base._addFeature({_poolContent:function(){},_beginDistribute:function(){},distributeContent:function(){},_distributeContent:function(){},_finishDistribute:function(){},_createLocalRoot:function(){this.createShadowRoot();this.shadowRoot.appendChild(this.root);this.root=this.shadowRoot;}});}Polymer.Async={_currVal:0,_lastVal:0,_callbacks:[],_twiddleContent:0,_twiddle:document.createTextNode(''),run:function(callback,waitTime){if(waitTime>0){return~setTimeout(callback,waitTime);}else{this._twiddle.textContent=this._twiddleContent++;this._callbacks.push(callback);return this._currVal++;}},cancel:function(handle){if(handle<0){clearTimeout(~handle);}else{var idx=handle-this._lastVal;if(idx>=0){if(!this._callbacks[idx]){throw'invalid async handle: '+handle;}
-this._callbacks[idx]=null;}}},_atEndOfMicrotask:function(){var len=this._callbacks.length;for(var i=0;i<len;i++){var cb=this._callbacks[i];if(cb){try{cb();}catch(e){i++;this._callbacks.splice(0,i);this._lastVal+=i;this._twiddle.textContent=this._twiddleContent++;throw e;}}}
-this._callbacks.splice(0,len);this._lastVal+=len;}};new window.MutationObserver(function(){Polymer.Async._atEndOfMicrotask();}).observe(Polymer.Async._twiddle,{characterData:true});Polymer.Debounce=function(){var Async=Polymer.Async;var Debouncer=function(context){this.context=context;var self=this;this.boundComplete=function(){self.complete();};};Debouncer.prototype={go:function(callback,wait){var h;this.finish=function(){Async.cancel(h);};h=Async.run(this.boundComplete,wait);this.callback=callback;},stop:function(){if(this.finish){this.finish();this.finish=null;this.callback=null;}},complete:function(){if(this.finish){var callback=this.callback;this.stop();callback.call(this.context);}}};function debounce(debouncer,callback,wait){if(debouncer){debouncer.stop();}else{debouncer=new Debouncer(this);}
-debouncer.go(callback,wait);return debouncer;}
-return debounce;}();Polymer.Base._addFeature({_setupDebouncers:function(){this._debouncers={};},debounce:function(jobName,callback,wait){return this._debouncers[jobName]=Polymer.Debounce.call(this,this._debouncers[jobName],callback,wait);},isDebouncerActive:function(jobName){var debouncer=this._debouncers[jobName];return!!(debouncer&&debouncer.finish);},flushDebouncer:function(jobName){var debouncer=this._debouncers[jobName];if(debouncer){debouncer.complete();}},cancelDebouncer:function(jobName){var debouncer=this._debouncers[jobName];if(debouncer){debouncer.stop();}}});Polymer.DomModule=document.createElement('dom-module');Polymer.Base._addFeature({_registerFeatures:function(){this._prepIs();this._prepBehaviors();this._prepConstructor();this._prepTemplate();this._prepShady();this._prepPropertyInfo();},_prepBehavior:function(b){this._addHostAttributes(b.hostAttributes);},_initFeatures:function(){this._registerHost();if(this._template){this._poolContent();this._beginHosting();this._stampTemplate();this._endHosting();}
-this._marshalHostAttributes();this._setupDebouncers();this._marshalBehaviors();this._tryReady();},_marshalBehavior:function(b){}});(function(){Polymer.nar=[];var disableUpgradeEnabled=Polymer.Settings.disableUpgradeEnabled;Polymer.Annotations={parseAnnotations:function(template,stripWhiteSpace){var list=[];var content=template._content||template.content;this._parseNodeAnnotations(content,list,stripWhiteSpace||template.hasAttribute('strip-whitespace'));return list;},_parseNodeAnnotations:function(node,list,stripWhiteSpace){return node.nodeType===Node.TEXT_NODE?this._parseTextNodeAnnotation(node,list):this._parseElementAnnotations(node,list,stripWhiteSpace);},_bindingRegex:function(){var IDENT='(?:'+'[a-zA-Z_$][\\w.:$\\-*]*'+')';var NUMBER='(?:'+'[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?'+')';var SQUOTE_STRING='(?:'+'\'(?:[^\'\\\\]|\\\\.)*\''+')';var DQUOTE_STRING='(?:'+'"(?:[^"\\\\]|\\\\.)*"'+')';var STRING='(?:'+SQUOTE_STRING+'|'+DQUOTE_STRING+')';var ARGUMENT='(?:'+IDENT+'|'+NUMBER+'|'+STRING+'\\s*'+')';var ARGUMENTS='(?:'+ARGUMENT+'(?:,\\s*'+ARGUMENT+')*'+')';var ARGUMENT_LIST='(?:'+'\\(\\s*'+'(?:'+ARGUMENTS+'?'+')'+'\\)\\s*'+')';var BINDING='('+IDENT+'\\s*'+ARGUMENT_LIST+'?'+')';var OPEN_BRACKET='(\\[\\[|{{)'+'\\s*';var CLOSE_BRACKET='(?:]]|}})';var NEGATE='(?:(!)\\s*)?';var EXPRESSION=OPEN_BRACKET+NEGATE+BINDING+CLOSE_BRACKET;return new RegExp(EXPRESSION,'g');}(),_parseBindings:function(text){var re=this._bindingRegex;var parts=[];var lastIndex=0;var m;while((m=re.exec(text))!==null){if(m.index>lastIndex){parts.push({literal:text.slice(lastIndex,m.index)});}
-var mode=m[1][0];var negate=Boolean(m[2]);var value=m[3].trim();var customEvent,notifyEvent,colon;if(mode=='{'&&(colon=value.indexOf('::'))>0){notifyEvent=value.substring(colon+2);value=value.substring(0,colon);customEvent=true;}
-parts.push({compoundIndex:parts.length,value:value,mode:mode,negate:negate,event:notifyEvent,customEvent:customEvent});lastIndex=re.lastIndex;}
-if(lastIndex&&lastIndex<text.length){var literal=text.substring(lastIndex);if(literal){parts.push({literal:literal});}}
-if(parts.length){return parts;}},_literalFromParts:function(parts){var s='';for(var i=0;i<parts.length;i++){var literal=parts[i].literal;s+=literal||'';}
-return s;},_parseTextNodeAnnotation:function(node,list){var parts=this._parseBindings(node.textContent);if(parts){node.textContent=this._literalFromParts(parts)||' ';var annote={bindings:[{kind:'text',name:'textContent',parts:parts,isCompound:parts.length!==1}]};list.push(annote);return annote;}},_parseElementAnnotations:function(element,list,stripWhiteSpace){var annote={bindings:[],events:[]};if(element.localName==='content'){list._hasContent=true;}
-this._parseChildNodesAnnotations(element,annote,list,stripWhiteSpace);if(element.attributes){this._parseNodeAttributeAnnotations(element,annote,list);if(this.prepElement){this.prepElement(element);}}
-if(annote.bindings.length||annote.events.length||annote.id){list.push(annote);}
-return annote;},_parseChildNodesAnnotations:function(root,annote,list,stripWhiteSpace){if(root.firstChild){var node=root.firstChild;var i=0;while(node){var next=node.nextSibling;if(node.localName==='template'&&!node.hasAttribute('preserve-content')){this._parseTemplate(node,i,list,annote,stripWhiteSpace);}
-if(node.localName=='slot'){node=this._replaceSlotWithContent(node);}
-if(node.nodeType===Node.TEXT_NODE){var n=next;while(n&&n.nodeType===Node.TEXT_NODE){node.textContent+=n.textContent;next=n.nextSibling;root.removeChild(n);n=next;}
-if(stripWhiteSpace&&!node.textContent.trim()){root.removeChild(node);i--;}}
-if(node.parentNode){var childAnnotation=this._parseNodeAnnotations(node,list,stripWhiteSpace);if(childAnnotation){childAnnotation.parent=annote;childAnnotation.index=i;}}
-node=next;i++;}}},_replaceSlotWithContent:function(slot){var content=slot.ownerDocument.createElement('content');while(slot.firstChild){content.appendChild(slot.firstChild);}
-var attrs=slot.attributes;for(var i=0;i<attrs.length;i++){var attr=attrs[i];content.setAttribute(attr.name,attr.value);}
-var name=slot.getAttribute('name');if(name){content.setAttribute('select','[slot=\''+name+'\']');}
-slot.parentNode.replaceChild(content,slot);return content;},_parseTemplate:function(node,index,list,parent,stripWhiteSpace){var content=document.createDocumentFragment();content._notes=this.parseAnnotations(node,stripWhiteSpace);content.appendChild(node.content);list.push({bindings:Polymer.nar,events:Polymer.nar,templateContent:content,parent:parent,index:index});},_parseNodeAttributeAnnotations:function(node,annotation){var attrs=Array.prototype.slice.call(node.attributes);for(var i=attrs.length-1,a;a=attrs[i];i--){var n=a.name;var v=a.value;var b;if(n.slice(0,3)==='on-'){node.removeAttribute(n);annotation.events.push({name:n.slice(3),value:v});}else if(b=this._parseNodeAttributeAnnotation(node,n,v)){annotation.bindings.push(b);}else if(n==='id'){annotation.id=v;}}},_parseNodeAttributeAnnotation:function(node,name,value){var parts=this._parseBindings(value);if(parts){var origName=name;var kind='property';if(name[name.length-1]=='$'){name=name.slice(0,-1);kind='attribute';}
-var literal=this._literalFromParts(parts);if(literal&&kind=='attribute'){node.setAttribute(name,literal);}
-if(node.localName==='input'&&origName==='value'){node.setAttribute(origName,'');}
-if(disableUpgradeEnabled&&origName==='disable-upgrade$'){node.setAttribute(name,'');}
-node.removeAttribute(origName);var propertyName=Polymer.CaseMap.dashToCamelCase(name);if(kind==='property'){name=propertyName;}
-return{kind:kind,name:name,propertyName:propertyName,parts:parts,literal:literal,isCompound:parts.length!==1};}},findAnnotatedNode:function(root,annote){var parent=annote.parent&&Polymer.Annotations.findAnnotatedNode(root,annote.parent);if(parent){for(var n=parent.firstChild,i=0;n;n=n.nextSibling){if(annote.index===i++){return n;}}}else{return root;}}};}());Polymer.Path={root:function(path){var dotIndex=path.indexOf('.');if(dotIndex===-1){return path;}
-return path.slice(0,dotIndex);},isDeep:function(path){return path.indexOf('.')!==-1;},isAncestor:function(base,path){return base.indexOf(path+'.')===0;},isDescendant:function(base,path){return path.indexOf(base+'.')===0;},translate:function(base,newBase,path){return newBase+path.slice(base.length);},matches:function(base,wildcard,path){return base===path||this.isAncestor(base,path)||Boolean(wildcard)&&this.isDescendant(base,path);}};Polymer.Base._addFeature({_prepAnnotations:function(){if(!this._template){this._notes=[];}else{var self=this;Polymer.Annotations.prepElement=function(element){self._prepElement(element);};if(this._template._content&&this._template._content._notes){this._notes=this._template._content._notes;}else{this._notes=Polymer.Annotations.parseAnnotations(this._template);this._processAnnotations(this._notes);}
-Polymer.Annotations.prepElement=null;}},_processAnnotations:function(notes){for(var i=0;i<notes.length;i++){var note=notes[i];for(var j=0;j<note.bindings.length;j++){var b=note.bindings[j];for(var k=0;k<b.parts.length;k++){var p=b.parts[k];if(!p.literal){var signature=this._parseMethod(p.value);if(signature){p.signature=signature;}else{p.model=Polymer.Path.root(p.value);}}}}
-if(note.templateContent){this._processAnnotations(note.templateContent._notes);var pp=note.templateContent._parentProps=this._discoverTemplateParentProps(note.templateContent._notes);var bindings=[];for(var prop in pp){var name='_parent_'+prop;bindings.push({index:note.index,kind:'property',name:name,propertyName:name,parts:[{mode:'{',model:prop,value:prop}]});}
-note.bindings=note.bindings.concat(bindings);}}},_discoverTemplateParentProps:function(notes){var pp={};for(var i=0,n;i<notes.length&&(n=notes[i]);i++){for(var j=0,b$=n.bindings,b;j<b$.length&&(b=b$[j]);j++){for(var k=0,p$=b.parts,p;k<p$.length&&(p=p$[k]);k++){if(p.signature){var args=p.signature.args;for(var kk=0;kk<args.length;kk++){var model=args[kk].model;if(model){pp[model]=true;}}
-if(p.signature.dynamicFn){pp[p.signature.method]=true;}}else{if(p.model){pp[p.model]=true;}}}}
-if(n.templateContent){var tpp=n.templateContent._parentProps;Polymer.Base.mixin(pp,tpp);}}
-return pp;},_prepElement:function(element){Polymer.ResolveUrl.resolveAttrs(element,this._template.ownerDocument);},_findAnnotatedNode:Polymer.Annotations.findAnnotatedNode,_marshalAnnotationReferences:function(){if(this._template){this._marshalIdNodes();this._marshalAnnotatedNodes();this._marshalAnnotatedListeners();}},_configureAnnotationReferences:function(){var notes=this._notes;var nodes=this._nodes;for(var i=0;i<notes.length;i++){var note=notes[i];var node=nodes[i];this._configureTemplateContent(note,node);this._configureCompoundBindings(note,node);}},_configureTemplateContent:function(note,node){if(note.templateContent){node._content=note.templateContent;}},_configureCompoundBindings:function(note,node){var bindings=note.bindings;for(var i=0;i<bindings.length;i++){var binding=bindings[i];if(binding.isCompound){var storage=node.__compoundStorage__||(node.__compoundStorage__={});var parts=binding.parts;var literals=new Array(parts.length);for(var j=0;j<parts.length;j++){literals[j]=parts[j].literal;}
-var name=binding.name;storage[name]=literals;if(binding.literal&&binding.kind=='property'){if(node._configValue){node._configValue(name,binding.literal);}else{node[name]=binding.literal;}}}}},_marshalIdNodes:function(){this.$={};for(var i=0,l=this._notes.length,a;i<l&&(a=this._notes[i]);i++){if(a.id){this.$[a.id]=this._findAnnotatedNode(this.root,a);}}},_marshalAnnotatedNodes:function(){if(this._notes&&this._notes.length){var r=new Array(this._notes.length);for(var i=0;i<this._notes.length;i++){r[i]=this._findAnnotatedNode(this.root,this._notes[i]);}
-this._nodes=r;}},_marshalAnnotatedListeners:function(){for(var i=0,l=this._notes.length,a;i<l&&(a=this._notes[i]);i++){if(a.events&&a.events.length){var node=this._findAnnotatedNode(this.root,a);for(var j=0,e$=a.events,e;j<e$.length&&(e=e$[j]);j++){this.listen(node,e.name,e.value);}}}}});Polymer.Base._addFeature({listeners:{},_listenListeners:function(listeners){var node,name,eventName;for(eventName in listeners){if(eventName.indexOf('.')<0){node=this;name=eventName;}else{name=eventName.split('.');node=this.$[name[0]];name=name[1];}
-this.listen(node,name,listeners[eventName]);}},listen:function(node,eventName,methodName){var handler=this._recallEventHandler(this,eventName,node,methodName);if(!handler){handler=this._createEventHandler(node,eventName,methodName);}
-if(handler._listening){return;}
-this._listen(node,eventName,handler);handler._listening=true;},_boundListenerKey:function(eventName,methodName){return eventName+':'+methodName;},_recordEventHandler:function(host,eventName,target,methodName,handler){var hbl=host.__boundListeners;if(!hbl){hbl=host.__boundListeners=new WeakMap();}
-var bl=hbl.get(target);if(!bl){bl={};if(!Polymer.Settings.isIE||target!=window){hbl.set(target,bl);}}
-var key=this._boundListenerKey(eventName,methodName);bl[key]=handler;},_recallEventHandler:function(host,eventName,target,methodName){var hbl=host.__boundListeners;if(!hbl){return;}
-var bl=hbl.get(target);if(!bl){return;}
-var key=this._boundListenerKey(eventName,methodName);return bl[key];},_createEventHandler:function(node,eventName,methodName){var host=this;var handler=function(e){if(host[methodName]){host[methodName](e,e.detail);}else{host._warn(host._logf('_createEventHandler','listener method `'+methodName+'` not defined'));}};handler._listening=false;this._recordEventHandler(host,eventName,node,methodName,handler);return handler;},unlisten:function(node,eventName,methodName){var handler=this._recallEventHandler(this,eventName,node,methodName);if(handler){this._unlisten(node,eventName,handler);handler._listening=false;}},_listen:function(node,eventName,handler){node.addEventListener(eventName,handler);},_unlisten:function(node,eventName,handler){node.removeEventListener(eventName,handler);}});(function(){'use strict';var wrap=Polymer.DomApi.wrap;var HAS_NATIVE_TA=typeof document.head.style.touchAction==='string';var GESTURE_KEY='__polymerGestures';var HANDLED_OBJ='__polymerGesturesHandled';var TOUCH_ACTION='__polymerGesturesTouchAction';var TAP_DISTANCE=25;var TRACK_DISTANCE=5;var TRACK_LENGTH=2;var MOUSE_TIMEOUT=2500;var MOUSE_EVENTS=['mousedown','mousemove','mouseup','click'];var MOUSE_WHICH_TO_BUTTONS=[0,1,4,2];var MOUSE_HAS_BUTTONS=function(){try{return new MouseEvent('test',{buttons:1}).buttons===1;}catch(e){return false;}}();function isMouseEvent(name){return MOUSE_EVENTS.indexOf(name)>-1;}
-var SUPPORTS_PASSIVE=false;(function(){try{var opts=Object.defineProperty({},'passive',{get:function(){SUPPORTS_PASSIVE=true;}});window.addEventListener('test',null,opts);window.removeEventListener('test',null,opts);}catch(e){}}());function PASSIVE_TOUCH(eventName){if(isMouseEvent(eventName)||eventName==='touchend'){return;}
-if(HAS_NATIVE_TA&&SUPPORTS_PASSIVE&&Polymer.Settings.passiveTouchGestures){return{passive:true};}}
-var IS_TOUCH_ONLY=navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);var mouseCanceller=function(mouseEvent){var sc=mouseEvent.sourceCapabilities;if(sc&&!sc.firesTouchEvents){return;}
-mouseEvent[HANDLED_OBJ]={skip:true};if(mouseEvent.type==='click'){var path=Polymer.dom(mouseEvent).path;if(path){for(var i=0;i<path.length;i++){if(path[i]===POINTERSTATE.mouse.target){return;}}}
-mouseEvent.preventDefault();mouseEvent.stopPropagation();}};function setupTeardownMouseCanceller(setup){var events=IS_TOUCH_ONLY?['click']:MOUSE_EVENTS;for(var i=0,en;i<events.length;i++){en=events[i];if(setup){document.addEventListener(en,mouseCanceller,true);}else{document.removeEventListener(en,mouseCanceller,true);}}}
-function ignoreMouse(ev){if(!POINTERSTATE.mouse.mouseIgnoreJob){setupTeardownMouseCanceller(true);}
-var unset=function(){setupTeardownMouseCanceller();POINTERSTATE.mouse.target=null;POINTERSTATE.mouse.mouseIgnoreJob=null;};POINTERSTATE.mouse.target=Polymer.dom(ev).rootTarget;POINTERSTATE.mouse.mouseIgnoreJob=Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob,unset,MOUSE_TIMEOUT);}
-function hasLeftMouseButton(ev){var type=ev.type;if(!isMouseEvent(type)){return false;}
-if(type==='mousemove'){var buttons=ev.buttons===undefined?1:ev.buttons;if(ev instanceof window.MouseEvent&&!MOUSE_HAS_BUTTONS){buttons=MOUSE_WHICH_TO_BUTTONS[ev.which]||0;}
-return Boolean(buttons&1);}else{var button=ev.button===undefined?0:ev.button;return button===0;}}
-function isSyntheticClick(ev){if(ev.type==='click'){if(ev.detail===0){return true;}
-var t=Gestures.findOriginalTarget(ev);var bcr=t.getBoundingClientRect();var x=ev.pageX,y=ev.pageY;return!(x>=bcr.left&&x<=bcr.right&&(y>=bcr.top&&y<=bcr.bottom));}
-return false;}
-var POINTERSTATE={mouse:{target:null,mouseIgnoreJob:null},touch:{x:0,y:0,id:-1,scrollDecided:false}};function firstTouchAction(ev){var path=Polymer.dom(ev).path;var ta='auto';for(var i=0,n;i<path.length;i++){n=path[i];if(n[TOUCH_ACTION]){ta=n[TOUCH_ACTION];break;}}
-return ta;}
-function trackDocument(stateObj,movefn,upfn){stateObj.movefn=movefn;stateObj.upfn=upfn;document.addEventListener('mousemove',movefn);document.addEventListener('mouseup',upfn);}
-function untrackDocument(stateObj){document.removeEventListener('mousemove',stateObj.movefn);document.removeEventListener('mouseup',stateObj.upfn);stateObj.movefn=null;stateObj.upfn=null;}
-document.addEventListener('touchend',ignoreMouse,SUPPORTS_PASSIVE?{passive:true}:false);var Gestures={gestures:{},recognizers:[],deepTargetFind:function(x,y){var node=document.elementFromPoint(x,y);var next=node;while(next&&next.shadowRoot){next=next.shadowRoot.elementFromPoint(x,y);if(next){node=next;}}
-return node;},findOriginalTarget:function(ev){if(ev.path){return ev.path[0];}
-return ev.target;},handleNative:function(ev){var handled;var type=ev.type;var node=wrap(ev.currentTarget);var gobj=node[GESTURE_KEY];if(!gobj){return;}
-var gs=gobj[type];if(!gs){return;}
-if(!ev[HANDLED_OBJ]){ev[HANDLED_OBJ]={};if(type.slice(0,5)==='touch'){var t=ev.changedTouches[0];if(type==='touchstart'){if(ev.touches.length===1){POINTERSTATE.touch.id=t.identifier;}}
-if(POINTERSTATE.touch.id!==t.identifier){return;}
-if(!HAS_NATIVE_TA){if(type==='touchstart'||type==='touchmove'){Gestures.handleTouchAction(ev);}}}}
-handled=ev[HANDLED_OBJ];if(handled.skip){return;}
-var recognizers=Gestures.recognizers;for(var i=0,r;i<recognizers.length;i++){r=recognizers[i];if(gs[r.name]&&!handled[r.name]){if(r.flow&&r.flow.start.indexOf(ev.type)>-1&&r.reset){r.reset();}}}
-for(i=0,r;i<recognizers.length;i++){r=recognizers[i];if(gs[r.name]&&!handled[r.name]){handled[r.name]=true;r[type](ev);}}},handleTouchAction:function(ev){var t=ev.changedTouches[0];var type=ev.type;if(type==='touchstart'){POINTERSTATE.touch.x=t.clientX;POINTERSTATE.touch.y=t.clientY;POINTERSTATE.touch.scrollDecided=false;}else if(type==='touchmove'){if(POINTERSTATE.touch.scrollDecided){return;}
-POINTERSTATE.touch.scrollDecided=true;var ta=firstTouchAction(ev);var prevent=false;var dx=Math.abs(POINTERSTATE.touch.x-t.clientX);var dy=Math.abs(POINTERSTATE.touch.y-t.clientY);if(!ev.cancelable){}else if(ta==='none'){prevent=true;}else if(ta==='pan-x'){prevent=dy>dx;}else if(ta==='pan-y'){prevent=dx>dy;}
-if(prevent){ev.preventDefault();}else{Gestures.prevent('track');}}},add:function(node,evType,handler){node=wrap(node);var recognizer=this.gestures[evType];var deps=recognizer.deps;var name=recognizer.name;var gobj=node[GESTURE_KEY];if(!gobj){node[GESTURE_KEY]=gobj={};}
-for(var i=0,dep,gd;i<deps.length;i++){dep=deps[i];if(IS_TOUCH_ONLY&&isMouseEvent(dep)&&dep!=='click'){continue;}
-gd=gobj[dep];if(!gd){gobj[dep]=gd={_count:0};}
-if(gd._count===0){node.addEventListener(dep,this.handleNative,PASSIVE_TOUCH(dep));}
-gd[name]=(gd[name]||0)+1;gd._count=(gd._count||0)+1;}
-node.addEventListener(evType,handler);if(recognizer.touchAction){this.setTouchAction(node,recognizer.touchAction);}},remove:function(node,evType,handler){node=wrap(node);var recognizer=this.gestures[evType];var deps=recognizer.deps;var name=recognizer.name;var gobj=node[GESTURE_KEY];if(gobj){for(var i=0,dep,gd;i<deps.length;i++){dep=deps[i];gd=gobj[dep];if(gd&&gd[name]){gd[name]=(gd[name]||1)-1;gd._count=(gd._count||1)-1;if(gd._count===0){node.removeEventListener(dep,this.handleNative,PASSIVE_TOUCH(dep));}}}}
-node.removeEventListener(evType,handler);},register:function(recog){this.recognizers.push(recog);for(var i=0;i<recog.emits.length;i++){this.gestures[recog.emits[i]]=recog;}},findRecognizerByEvent:function(evName){for(var i=0,r;i<this.recognizers.length;i++){r=this.recognizers[i];for(var j=0,n;j<r.emits.length;j++){n=r.emits[j];if(n===evName){return r;}}}
-return null;},setTouchAction:function(node,value){if(HAS_NATIVE_TA){node.style.touchAction=value;}
-node[TOUCH_ACTION]=value;},fire:function(target,type,detail){var ev=Polymer.Base.fire(type,detail,{node:target,bubbles:true,cancelable:true});if(ev.defaultPrevented){var preventer=detail.preventer||detail.sourceEvent;if(preventer&&preventer.preventDefault){preventer.preventDefault();}}},prevent:function(evName){var recognizer=this.findRecognizerByEvent(evName);if(recognizer.info){recognizer.info.prevent=true;}},resetMouseCanceller:function(){if(POINTERSTATE.mouse.mouseIgnoreJob){POINTERSTATE.mouse.mouseIgnoreJob.complete();}}};Gestures.register({name:'downup',deps:['mousedown','touchstart','touchend'],flow:{start:['mousedown','touchstart'],end:['mouseup','touchend']},emits:['down','up'],info:{movefn:null,upfn:null},reset:function(){untrackDocument(this.info);},mousedown:function(e){if(!hasLeftMouseButton(e)){return;}
-var t=Gestures.findOriginalTarget(e);var self=this;var movefn=function movefn(e){if(!hasLeftMouseButton(e)){self.fire('up',t,e);untrackDocument(self.info);}};var upfn=function upfn(e){if(hasLeftMouseButton(e)){self.fire('up',t,e);}
-untrackDocument(self.info);};trackDocument(this.info,movefn,upfn);this.fire('down',t,e);},touchstart:function(e){this.fire('down',Gestures.findOriginalTarget(e),e.changedTouches[0],e);},touchend:function(e){this.fire('up',Gestures.findOriginalTarget(e),e.changedTouches[0],e);},fire:function(type,target,event,preventer){Gestures.fire(target,type,{x:event.clientX,y:event.clientY,sourceEvent:event,preventer:preventer,prevent:function(e){return Gestures.prevent(e);}});}});Gestures.register({name:'track',touchAction:'none',deps:['mousedown','touchstart','touchmove','touchend'],flow:{start:['mousedown','touchstart'],end:['mouseup','touchend']},emits:['track'],info:{x:0,y:0,state:'start',started:false,moves:[],addMove:function(move){if(this.moves.length>TRACK_LENGTH){this.moves.shift();}
-this.moves.push(move);},movefn:null,upfn:null,prevent:false},reset:function(){this.info.state='start';this.info.started=false;this.info.moves=[];this.info.x=0;this.info.y=0;this.info.prevent=false;untrackDocument(this.info);},hasMovedEnough:function(x,y){if(this.info.prevent){return false;}
-if(this.info.started){return true;}
-var dx=Math.abs(this.info.x-x);var dy=Math.abs(this.info.y-y);return dx>=TRACK_DISTANCE||dy>=TRACK_DISTANCE;},mousedown:function(e){if(!hasLeftMouseButton(e)){return;}
-var t=Gestures.findOriginalTarget(e);var self=this;var movefn=function movefn(e){var x=e.clientX,y=e.clientY;if(self.hasMovedEnough(x,y)){self.info.state=self.info.started?e.type==='mouseup'?'end':'track':'start';if(self.info.state==='start'){Gestures.prevent('tap');}
-self.info.addMove({x:x,y:y});if(!hasLeftMouseButton(e)){self.info.state='end';untrackDocument(self.info);}
-self.fire(t,e);self.info.started=true;}};var upfn=function upfn(e){if(self.info.started){movefn(e);}
-untrackDocument(self.info);};trackDocument(this.info,movefn,upfn);this.info.x=e.clientX;this.info.y=e.clientY;},touchstart:function(e){var ct=e.changedTouches[0];this.info.x=ct.clientX;this.info.y=ct.clientY;},touchmove:function(e){var t=Gestures.findOriginalTarget(e);var ct=e.changedTouches[0];var x=ct.clientX,y=ct.clientY;if(this.hasMovedEnough(x,y)){if(this.info.state==='start'){Gestures.prevent('tap');}
-this.info.addMove({x:x,y:y});this.fire(t,ct);this.info.state='track';this.info.started=true;}},touchend:function(e){var t=Gestures.findOriginalTarget(e);var ct=e.changedTouches[0];if(this.info.started){this.info.state='end';this.info.addMove({x:ct.clientX,y:ct.clientY});this.fire(t,ct,e);}},fire:function(target,touch,preventer){var secondlast=this.info.moves[this.info.moves.length-2];var lastmove=this.info.moves[this.info.moves.length-1];var dx=lastmove.x-this.info.x;var dy=lastmove.y-this.info.y;var ddx,ddy=0;if(secondlast){ddx=lastmove.x-secondlast.x;ddy=lastmove.y-secondlast.y;}
-return Gestures.fire(target,'track',{state:this.info.state,x:touch.clientX,y:touch.clientY,dx:dx,dy:dy,ddx:ddx,ddy:ddy,sourceEvent:touch,preventer:preventer,hover:function(){return Gestures.deepTargetFind(touch.clientX,touch.clientY);}});}});Gestures.register({name:'tap',deps:['mousedown','click','touchstart','touchend'],flow:{start:['mousedown','touchstart'],end:['click','touchend']},emits:['tap'],info:{x:NaN,y:NaN,prevent:false},reset:function(){this.info.x=NaN;this.info.y=NaN;this.info.prevent=false;},save:function(e){this.info.x=e.clientX;this.info.y=e.clientY;},mousedown:function(e){if(hasLeftMouseButton(e)){this.save(e);}},click:function(e){if(hasLeftMouseButton(e)){this.forward(e);}},touchstart:function(e){this.save(e.changedTouches[0],e);},touchend:function(e){this.forward(e.changedTouches[0],e);},forward:function(e,preventer){var dx=Math.abs(e.clientX-this.info.x);var dy=Math.abs(e.clientY-this.info.y);var t=Gestures.findOriginalTarget(e);if(isNaN(dx)||isNaN(dy)||dx<=TAP_DISTANCE&&dy<=TAP_DISTANCE||isSyntheticClick(e)){if(!this.info.prevent){Gestures.fire(t,'tap',{x:e.clientX,y:e.clientY,sourceEvent:e,preventer:preventer});}}}});var DIRECTION_MAP={x:'pan-x',y:'pan-y',none:'none',all:'auto'};Polymer.Base._addFeature({_setupGestures:function(){this.__polymerGestures=null;},_listen:function(node,eventName,handler){if(Gestures.gestures[eventName]){Gestures.add(node,eventName,handler);}else{node.addEventListener(eventName,handler);}},_unlisten:function(node,eventName,handler){if(Gestures.gestures[eventName]){Gestures.remove(node,eventName,handler);}else{node.removeEventListener(eventName,handler);}},setScrollDirection:function(direction,node){node=node||this;Gestures.setTouchAction(node,DIRECTION_MAP[direction]||'auto');}});Polymer.Gestures=Gestures;}());(function(){'use strict';Polymer.Base._addFeature({$$:function(slctr){return Polymer.dom(this.root).querySelector(slctr);},toggleClass:function(name,bool,node){node=node||this;if(arguments.length==1){bool=!node.classList.contains(name);}
-if(bool){Polymer.dom(node).classList.add(name);}else{Polymer.dom(node).classList.remove(name);}},toggleAttribute:function(name,bool,node){node=node||this;if(arguments.length==1){bool=!node.hasAttribute(name);}
-if(bool){Polymer.dom(node).setAttribute(name,'');}else{Polymer.dom(node).removeAttribute(name);}},classFollows:function(name,toElement,fromElement){if(fromElement){Polymer.dom(fromElement).classList.remove(name);}
-if(toElement){Polymer.dom(toElement).classList.add(name);}},attributeFollows:function(name,toElement,fromElement){if(fromElement){Polymer.dom(fromElement).removeAttribute(name);}
-if(toElement){Polymer.dom(toElement).setAttribute(name,'');}},getEffectiveChildNodes:function(){return Polymer.dom(this).getEffectiveChildNodes();},getEffectiveChildren:function(){var list=Polymer.dom(this).getEffectiveChildNodes();return list.filter(function(n){return n.nodeType===Node.ELEMENT_NODE;});},getEffectiveTextContent:function(){var cn=this.getEffectiveChildNodes();var tc=[];for(var i=0,c;c=cn[i];i++){if(c.nodeType!==Node.COMMENT_NODE){tc.push(Polymer.dom(c).textContent);}}
-return tc.join('');},queryEffectiveChildren:function(slctr){var e$=Polymer.dom(this).queryDistributedElements(slctr);return e$&&e$[0];},queryAllEffectiveChildren:function(slctr){return Polymer.dom(this).queryDistributedElements(slctr);},getContentChildNodes:function(slctr){var content=Polymer.dom(this.root).querySelector(slctr||'content');return content?Polymer.dom(content).getDistributedNodes():[];},getContentChildren:function(slctr){return this.getContentChildNodes(slctr).filter(function(n){return n.nodeType===Node.ELEMENT_NODE;});},fire:function(type,detail,options){options=options||Polymer.nob;var node=options.node||this;detail=detail===null||detail===undefined?{}:detail;var bubbles=options.bubbles===undefined?true:options.bubbles;var cancelable=Boolean(options.cancelable);var useCache=options._useCache;var event=this._getEvent(type,bubbles,cancelable,useCache);event.detail=detail;if(useCache){this.__eventCache[type]=null;}
-node.dispatchEvent(event);if(useCache){this.__eventCache[type]=event;}
-return event;},__eventCache:{},_getEvent:function(type,bubbles,cancelable,useCache){var event=useCache&&this.__eventCache[type];if(!event||(event.bubbles!=bubbles||event.cancelable!=cancelable)){event=new Event(type,{bubbles:Boolean(bubbles),cancelable:cancelable});}
-return event;},async:function(callback,waitTime){var self=this;return Polymer.Async.run(function(){callback.call(self);},waitTime);},cancelAsync:function(handle){Polymer.Async.cancel(handle);},arrayDelete:function(path,item){var index;if(Array.isArray(path)){index=path.indexOf(item);if(index>=0){return path.splice(index,1);}}else{var arr=this._get(path);index=arr.indexOf(item);if(index>=0){return this.splice(path,index,1);}}},transform:function(transform,node){node=node||this;node.style.webkitTransform=transform;node.style.transform=transform;},translate3d:function(x,y,z,node){node=node||this;this.transform('translate3d('+x+','+y+','+z+')',node);},importHref:function(href,onload,onerror,optAsync){var link=document.createElement('link');link.rel='import';link.href=href;var list=Polymer.Base.importHref.imported=Polymer.Base.importHref.imported||{};var cached=list[link.href];var imprt=cached||link;var self=this;var loadListener=function(e){e.target.__firedLoad=true;e.target.removeEventListener('load',loadListener);e.target.removeEventListener('error',errorListener);return onload.call(self,e);};var errorListener=function(e){e.target.__firedError=true;e.target.removeEventListener('load',loadListener);e.target.removeEventListener('error',errorListener);return onerror.call(self,e);};if(onload){imprt.addEventListener('load',loadListener);}
-if(onerror){imprt.addEventListener('error',errorListener);}
-if(cached){if(cached.__firedLoad){cached.dispatchEvent(new Event('load'));}
-if(cached.__firedError){cached.dispatchEvent(new Event('error'));}}else{list[link.href]=link;optAsync=Boolean(optAsync);if(optAsync){link.setAttribute('async','');}
-document.head.appendChild(link);}
-return imprt;},create:function(tag,props){var elt=document.createElement(tag);if(props){for(var n in props){elt[n]=props[n];}}
-return elt;},isLightDescendant:function(node){return this!==node&&this.contains(node)&&Polymer.dom(this).getOwnerRoot()===Polymer.dom(node).getOwnerRoot();},isLocalDescendant:function(node){return this.root===Polymer.dom(node).getOwnerRoot();}});if(!Polymer.Settings.useNativeCustomElements){var importHref=Polymer.Base.importHref;Polymer.Base.importHref=function(href,onload,onerror,optAsync){CustomElements.ready=false;var loadFn=function(e){CustomElements.upgradeDocumentTree(document);CustomElements.ready=true;if(onload){return onload.call(this,e);}};return importHref.call(this,href,loadFn,onerror,optAsync);};}}());Polymer.Bind={prepareModel:function(model){Polymer.Base.mixin(model,this._modelApi);},_modelApi:{_notifyChange:function(source,event,value){value=value===undefined?this[source]:value;event=event||Polymer.CaseMap.camelToDashCase(source)+'-changed';this.fire(event,{value:value},{bubbles:false,cancelable:false,_useCache:Polymer.Settings.eventDataCache||!Polymer.Settings.isIE});},_propertySetter:function(property,value,effects,fromAbove){var old=this.__data__[property];if(old!==value&&(old===old||value===value)){this.__data__[property]=value;if(typeof value=='object'){this._clearPath(property);}
-if(this._propertyChanged){this._propertyChanged(property,value,old);}
-if(effects){this._effectEffects(property,value,effects,old,fromAbove);}}
-return old;},__setProperty:function(property,value,quiet,node){node=node||this;var effects=node._propertyEffects&&node._propertyEffects[property];if(effects){node._propertySetter(property,value,effects,quiet);}else if(node[property]!==value){node[property]=value;}},_effectEffects:function(property,value,effects,old,fromAbove){for(var i=0,l=effects.length,fx;i<l&&(fx=effects[i]);i++){fx.fn.call(this,property,this[property],fx.effect,old,fromAbove);}},_clearPath:function(path){for(var prop in this.__data__){if(Polymer.Path.isDescendant(path,prop)){this.__data__[prop]=undefined;}}}},ensurePropertyEffects:function(model,property){if(!model._propertyEffects){model._propertyEffects={};}
-var fx=model._propertyEffects[property];if(!fx){fx=model._propertyEffects[property]=[];}
-return fx;},addPropertyEffect:function(model,property,kind,effect){var fx=this.ensurePropertyEffects(model,property);var propEffect={kind:kind,effect:effect,fn:Polymer.Bind['_'+kind+'Effect']};fx.push(propEffect);return propEffect;},createBindings:function(model){var fx$=model._propertyEffects;if(fx$){for(var n in fx$){var fx=fx$[n];fx.sort(this._sortPropertyEffects);this._createAccessors(model,n,fx);}}},_sortPropertyEffects:function(){var EFFECT_ORDER={'compute':0,'annotation':1,'annotatedComputation':2,'reflect':3,'notify':4,'observer':5,'complexObserver':6,'function':7};return function(a,b){return EFFECT_ORDER[a.kind]-EFFECT_ORDER[b.kind];};}(),_createAccessors:function(model,property,effects){var defun={get:function(){return this.__data__[property];}};var setter=function(value){this._propertySetter(property,value,effects);};var info=model.getPropertyInfo&&model.getPropertyInfo(property);if(info&&info.readOnly){if(!info.computed){model['_set'+this.upper(property)]=setter;}}else{defun.set=setter;}
-Object.defineProperty(model,property,defun);},upper:function(name){return name[0].toUpperCase()+name.substring(1);},_addAnnotatedListener:function(model,index,property,path,event,negated){if(!model._bindListeners){model._bindListeners=[];}
-var fn=this._notedListenerFactory(property,path,Polymer.Path.isDeep(path),negated);var eventName=event||Polymer.CaseMap.camelToDashCase(property)+'-changed';model._bindListeners.push({index:index,property:property,path:path,changedFn:fn,event:eventName});},_isEventBogus:function(e,target){return e.path&&e.path[0]!==target;},_notedListenerFactory:function(property,path,isStructured,negated){return function(target,value,targetPath){if(targetPath){var newPath=Polymer.Path.translate(property,path,targetPath);this._notifyPath(newPath,value);}else{value=target[property];if(negated){value=!value;}
-if(!isStructured){this[path]=value;}else{if(this.__data__[path]!=value){this.set(path,value);}}}};},prepareInstance:function(inst){inst.__data__=Object.create(null);},setupBindListeners:function(inst){var b$=inst._bindListeners;for(var i=0,l=b$.length,info;i<l&&(info=b$[i]);i++){var node=inst._nodes[info.index];this._addNotifyListener(node,inst,info.event,info.changedFn);}},_addNotifyListener:function(element,context,event,changedFn){element.addEventListener(event,function(e){return context._notifyListener(changedFn,e);});}};Polymer.Base.mixin(Polymer.Bind,{_shouldAddListener:function(effect){return effect.name&&effect.kind!='attribute'&&effect.kind!='text'&&!effect.isCompound&&effect.parts[0].mode==='{';},_annotationEffect:function(source,value,effect){if(source!=effect.value){value=this._get(effect.value);this.__data__[effect.value]=value;}
-this._applyEffectValue(effect,value);},_reflectEffect:function(source,value,effect){this.reflectPropertyToAttribute(source,effect.attribute,value);},_notifyEffect:function(source,value,effect,old,fromAbove){if(!fromAbove){this._notifyChange(source,effect.event,value);}},_functionEffect:function(source,value,fn,old,fromAbove){fn.call(this,source,value,old,fromAbove);},_observerEffect:function(source,value,effect,old){var fn=this[effect.method];if(fn){fn.call(this,value,old);}else{this._warn(this._logf('_observerEffect','observer method `'+effect.method+'` not defined'));}},_complexObserverEffect:function(source,value,effect){var fn=this[effect.method];if(fn){var args=Polymer.Bind._marshalArgs(this.__data__,effect,source,value);if(args){fn.apply(this,args);}}else if(effect.dynamicFn){}else{this._warn(this._logf('_complexObserverEffect','observer method `'+effect.method+'` not defined'));}},_computeEffect:function(source,value,effect){var fn=this[effect.method];if(fn){var args=Polymer.Bind._marshalArgs(this.__data__,effect,source,value);if(args){var computedvalue=fn.apply(this,args);this.__setProperty(effect.name,computedvalue);}}else if(effect.dynamicFn){}else{this._warn(this._logf('_computeEffect','compute method `'+effect.method+'` not defined'));}},_annotatedComputationEffect:function(source,value,effect){var computedHost=this._rootDataHost||this;var fn=computedHost[effect.method];if(fn){var args=Polymer.Bind._marshalArgs(this.__data__,effect,source,value);if(args){var computedvalue=fn.apply(computedHost,args);this._applyEffectValue(effect,computedvalue);}}else if(effect.dynamicFn){}else{computedHost._warn(computedHost._logf('_annotatedComputationEffect','compute method `'+effect.method+'` not defined'));}},_marshalArgs:function(model,effect,path,value){var values=[];var args=effect.args;var bailoutEarly=args.length>1||effect.dynamicFn;for(var i=0,l=args.length;i<l;i++){var arg=args[i];var name=arg.name;var v;if(arg.literal){v=arg.value;}else if(path===name){v=value;}else{v=model[name];if(v===undefined&&arg.structured){v=Polymer.Base._get(name,model);}}
-if(bailoutEarly&&v===undefined){return;}
-if(arg.wildcard){var matches=Polymer.Path.isAncestor(path,name);values[i]={path:matches?path:name,value:matches?value:v,base:v};}else{values[i]=v;}}
-return values;}});Polymer.Base._addFeature({_addPropertyEffect:function(property,kind,effect){var prop=Polymer.Bind.addPropertyEffect(this,property,kind,effect);prop.pathFn=this['_'+prop.kind+'PathEffect'];},_prepEffects:function(){Polymer.Bind.prepareModel(this);this._addAnnotationEffects(this._notes);},_prepBindings:function(){Polymer.Bind.createBindings(this);},_addPropertyEffects:function(properties){if(properties){for(var p in properties){var prop=properties[p];if(prop.observer){this._addObserverEffect(p,prop.observer);}
-if(prop.computed){prop.readOnly=true;this._addComputedEffect(p,prop.computed);}
-if(prop.notify){this._addPropertyEffect(p,'notify',{event:Polymer.CaseMap.camelToDashCase(p)+'-changed'});}
-if(prop.reflectToAttribute){var attr=Polymer.CaseMap.camelToDashCase(p);if(attr[0]==='-'){this._warn(this._logf('_addPropertyEffects','Property '+p+' cannot be reflected to attribute '+attr+' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.'));}else{this._addPropertyEffect(p,'reflect',{attribute:attr});}}
-if(prop.readOnly){Polymer.Bind.ensurePropertyEffects(this,p);}}}},_addComputedEffect:function(name,expression){var sig=this._parseMethod(expression);var dynamicFn=sig.dynamicFn;for(var i=0,arg;i<sig.args.length&&(arg=sig.args[i]);i++){this._addPropertyEffect(arg.model,'compute',{method:sig.method,args:sig.args,trigger:arg,name:name,dynamicFn:dynamicFn});}
-if(dynamicFn){this._addPropertyEffect(sig.method,'compute',{method:sig.method,args:sig.args,trigger:null,name:name,dynamicFn:dynamicFn});}},_addObserverEffect:function(property,observer){this._addPropertyEffect(property,'observer',{method:observer,property:property});},_addComplexObserverEffects:function(observers){if(observers){for(var i=0,o;i<observers.length&&(o=observers[i]);i++){this._addComplexObserverEffect(o);}}},_addComplexObserverEffect:function(observer){var sig=this._parseMethod(observer);if(!sig){throw new Error('Malformed observer expression \''+observer+'\'');}
-var dynamicFn=sig.dynamicFn;for(var i=0,arg;i<sig.args.length&&(arg=sig.args[i]);i++){this._addPropertyEffect(arg.model,'complexObserver',{method:sig.method,args:sig.args,trigger:arg,dynamicFn:dynamicFn});}
-if(dynamicFn){this._addPropertyEffect(sig.method,'complexObserver',{method:sig.method,args:sig.args,trigger:null,dynamicFn:dynamicFn});}},_addAnnotationEffects:function(notes){for(var i=0,note;i<notes.length&&(note=notes[i]);i++){var b$=note.bindings;for(var j=0,binding;j<b$.length&&(binding=b$[j]);j++){this._addAnnotationEffect(binding,i);}}},_addAnnotationEffect:function(note,index){if(Polymer.Bind._shouldAddListener(note)){Polymer.Bind._addAnnotatedListener(this,index,note.name,note.parts[0].value,note.parts[0].event,note.parts[0].negate);}
-for(var i=0;i<note.parts.length;i++){var part=note.parts[i];if(part.signature){this._addAnnotatedComputationEffect(note,part,index);}else if(!part.literal){if(note.kind==='attribute'&&note.name[0]==='-'){this._warn(this._logf('_addAnnotationEffect','Cannot set attribute '+note.name+' because "-" is not a valid attribute starting character'));}else{this._addPropertyEffect(part.model,'annotation',{kind:note.kind,index:index,name:note.name,propertyName:note.propertyName,value:part.value,isCompound:note.isCompound,compoundIndex:part.compoundIndex,event:part.event,customEvent:part.customEvent,negate:part.negate});}}}},_addAnnotatedComputationEffect:function(note,part,index){var sig=part.signature;if(sig.static){this.__addAnnotatedComputationEffect('__static__',index,note,part,null);}else{for(var i=0,arg;i<sig.args.length&&(arg=sig.args[i]);i++){if(!arg.literal){this.__addAnnotatedComputationEffect(arg.model,index,note,part,arg);}}
-if(sig.dynamicFn){this.__addAnnotatedComputationEffect(sig.method,index,note,part,null);}}},__addAnnotatedComputationEffect:function(property,index,note,part,trigger){this._addPropertyEffect(property,'annotatedComputation',{index:index,isCompound:note.isCompound,compoundIndex:part.compoundIndex,kind:note.kind,name:note.name,negate:part.negate,method:part.signature.method,args:part.signature.args,trigger:trigger,dynamicFn:part.signature.dynamicFn});},_parseMethod:function(expression){var m=expression.match(/([^\s]+?)\(([\s\S]*)\)/);if(m){var sig={method:m[1],static:true};if(this.getPropertyInfo(sig.method)!==Polymer.nob){sig.static=false;sig.dynamicFn=true;}
-if(m[2].trim()){var args=m[2].replace(/\\,/g,'&comma;').split(',');return this._parseArgs(args,sig);}else{sig.args=Polymer.nar;return sig;}}},_parseArgs:function(argList,sig){sig.args=argList.map(function(rawArg){var arg=this._parseArg(rawArg);if(!arg.literal){sig.static=false;}
-return arg;},this);return sig;},_parseArg:function(rawArg){var arg=rawArg.trim().replace(/&comma;/g,',').replace(/\\(.)/g,'$1');var a={name:arg};var fc=arg[0];if(fc==='-'){fc=arg[1];}
-if(fc>='0'&&fc<='9'){fc='#';}
-switch(fc){case'\'':case'"':a.value=arg.slice(1,-1);a.literal=true;break;case'#':a.value=Number(arg);a.literal=true;break;}
-if(!a.literal){a.model=Polymer.Path.root(arg);a.structured=Polymer.Path.isDeep(arg);if(a.structured){a.wildcard=arg.slice(-2)=='.*';if(a.wildcard){a.name=arg.slice(0,-2);}}}
-return a;},_marshalInstanceEffects:function(){Polymer.Bind.prepareInstance(this);if(this._bindListeners){Polymer.Bind.setupBindListeners(this);}},_applyEffectValue:function(info,value){var node=this._nodes[info.index];var property=info.name;value=this._computeFinalAnnotationValue(node,property,value,info);if(info.kind=='attribute'){this.serializeValueToAttribute(value,property,node);}else{var pinfo=node._propertyInfo&&node._propertyInfo[property];if(pinfo&&pinfo.readOnly){return;}
-this.__setProperty(property,value,Polymer.Settings.suppressBindingNotifications,node);}},_computeFinalAnnotationValue:function(node,property,value,info){if(info.negate){value=!value;}
-if(info.isCompound){var storage=node.__compoundStorage__[property];storage[info.compoundIndex]=value;value=storage.join('');}
-if(info.kind!=='attribute'){if(property==='className'){value=this._scopeElementClass(node,value);}
-if(property==='textContent'||node.localName=='input'&&property=='value'){value=value==undefined?'':value;}}
-return value;},_executeStaticEffects:function(){if(this._propertyEffects&&this._propertyEffects.__static__){this._effectEffects('__static__',null,this._propertyEffects.__static__);}}});(function(){var usePolyfillProto=Polymer.Settings.usePolyfillProto;var avoidInstanceProperties=Boolean(Object.getOwnPropertyDescriptor(document.documentElement,'properties'));Polymer.Base._addFeature({_setupConfigure:function(initialConfig){this._config={};this._handlers=[];this._aboveConfig=null;if(initialConfig){for(var i in initialConfig){if(initialConfig[i]!==undefined){this._config[i]=initialConfig[i];}}}},_marshalAttributes:function(){this._takeAttributesToModel(this._config);},_attributeChangedImpl:function(name){var model=this._clientsReadied?this:this._config;this._setAttributeToProperty(model,name);},_configValue:function(name,value){var info=this._propertyInfo[name];if(!info||!info.readOnly){this._config[name]=value;}},_beforeClientsReady:function(){this._configure();},_configure:function(){this._configureAnnotationReferences();this._configureInstanceProperties();this._aboveConfig=this.mixin({},this._config);var config={};for(var i=0;i<this.behaviors.length;i++){this._configureProperties(this.behaviors[i].properties,config);}
-this._configureProperties(avoidInstanceProperties?this.__proto__.properties:this.properties,config);this.mixin(config,this._aboveConfig);this._config=config;if(this._clients&&this._clients.length){this._distributeConfig(this._config);}},_configureInstanceProperties:function(){for(var i in this._propertyEffects){if(!usePolyfillProto&&this.hasOwnProperty(i)){this._configValue(i,this[i]);delete this[i];}}},_configureProperties:function(properties,config){for(var i in properties){var c=properties[i];if(c.value!==undefined){var value=c.value;if(typeof value=='function'){value=value.call(this,this._config);}
-config[i]=value;}}},_distributeConfig:function(config){var fx$=this._propertyEffects;if(fx$){for(var p in config){var fx=fx$[p];if(fx){for(var i=0,l=fx.length,x;i<l&&(x=fx[i]);i++){if(x.kind==='annotation'){var node=this._nodes[x.effect.index];var name=x.effect.propertyName;var isAttr=x.effect.kind=='attribute';var hasEffect=node._propertyEffects&&node._propertyEffects[name];if(node._configValue&&(hasEffect||!isAttr)){var value=p===x.effect.value?config[p]:this._get(x.effect.value,config);value=this._computeFinalAnnotationValue(node,name,value,x.effect);if(isAttr){value=node.deserialize(this.serialize(value),node._propertyInfo[name].type);}
-node._configValue(name,value);}}}}}}},_afterClientsReady:function(){this.importPath=this._importPath;this.rootPath=Polymer.rootPath;this._executeStaticEffects();this._applyConfig(this._config,this._aboveConfig);this._flushHandlers();},_applyConfig:function(config,aboveConfig){for(var n in config){if(this[n]===undefined){this.__setProperty(n,config[n],n in aboveConfig);}}},_notifyListener:function(fn,e){if(!Polymer.Bind._isEventBogus(e,e.target)){var value,path;if(e.detail){value=e.detail.value;path=e.detail.path;}
-if(!this._clientsReadied){this._queueHandler([fn,e.target,value,path]);}else{return fn.call(this,e.target,value,path);}}},_queueHandler:function(args){this._handlers.push(args);},_flushHandlers:function(){var h$=this._handlers;for(var i=0,l=h$.length,h;i<l&&(h=h$[i]);i++){h[0].call(this,h[1],h[2],h[3]);}
-this._handlers=[];}});}());(function(){'use strict';var Path=Polymer.Path;Polymer.Base._addFeature({notifyPath:function(path,value,fromAbove){var info={};var v=this._get(path,this,info);if(arguments.length===1){value=v;}
-if(info.path){this._notifyPath(info.path,value,fromAbove);}},_notifyPath:function(path,value,fromAbove){var old=this._propertySetter(path,value);if(old!==value&&(old===old||value===value)){this._pathEffector(path,value);if(!fromAbove){this._notifyPathUp(path,value);}
-return true;}},_getPathParts:function(path){if(Array.isArray(path)){var parts=[];for(var i=0;i<path.length;i++){var args=path[i].toString().split('.');for(var j=0;j<args.length;j++){parts.push(args[j]);}}
-return parts;}else{return path.toString().split('.');}},set:function(path,value,root){var prop=root||this;var parts=this._getPathParts(path);var array;var last=parts[parts.length-1];if(parts.length>1){for(var i=0;i<parts.length-1;i++){var part=parts[i];if(array&&part[0]=='#'){prop=Polymer.Collection.get(array).getItem(part);}else{prop=prop[part];if(array&&parseInt(part,10)==part){parts[i]=Polymer.Collection.get(array).getKey(prop);}}
-if(!prop){return;}
-array=Array.isArray(prop)?prop:null;}
-if(array){var coll=Polymer.Collection.get(array);var old,key;if(last[0]=='#'){key=last;old=coll.getItem(key);last=array.indexOf(old);coll.setItem(key,value);}else if(parseInt(last,10)==last){old=prop[last];key=coll.getKey(old);parts[i]=key;coll.setItem(key,value);}}
-prop[last]=value;if(!root){this._notifyPath(parts.join('.'),value);}}else{prop[path]=value;}},get:function(path,root){return this._get(path,root);},_get:function(path,root,info){var prop=root||this;var parts=this._getPathParts(path);var array;for(var i=0;i<parts.length;i++){if(!prop){return;}
-var part=parts[i];if(array&&part[0]=='#'){prop=Polymer.Collection.get(array).getItem(part);}else{prop=prop[part];if(info&&array&&parseInt(part,10)==part){parts[i]=Polymer.Collection.get(array).getKey(prop);}}
-array=Array.isArray(prop)?prop:null;}
-if(info){info.path=parts.join('.');}
-return prop;},_pathEffector:function(path,value){var model=Path.root(path);var fx$=this._propertyEffects&&this._propertyEffects[model];if(fx$){for(var i=0,fx;i<fx$.length&&(fx=fx$[i]);i++){var fxFn=fx.pathFn;if(fxFn){fxFn.call(this,path,value,fx.effect);}}}
-if(this._boundPaths){this._notifyBoundPaths(path,value);}},_annotationPathEffect:function(path,value,effect){if(Path.matches(effect.value,false,path)){Polymer.Bind._annotationEffect.call(this,path,value,effect);}else if(!effect.negate&&Path.isDescendant(effect.value,path)){var node=this._nodes[effect.index];if(node&&node._notifyPath){var newPath=Path.translate(effect.value,effect.name,path);node._notifyPath(newPath,value,true);}}},_complexObserverPathEffect:function(path,value,effect){if(Path.matches(effect.trigger.name,effect.trigger.wildcard,path)){Polymer.Bind._complexObserverEffect.call(this,path,value,effect);}},_computePathEffect:function(path,value,effect){if(Path.matches(effect.trigger.name,effect.trigger.wildcard,path)){Polymer.Bind._computeEffect.call(this,path,value,effect);}},_annotatedComputationPathEffect:function(path,value,effect){if(Path.matches(effect.trigger.name,effect.trigger.wildcard,path)){Polymer.Bind._annotatedComputationEffect.call(this,path,value,effect);}},linkPaths:function(to,from){this._boundPaths=this._boundPaths||{};if(from){this._boundPaths[to]=from;}else{this.unlinkPaths(to);}},unlinkPaths:function(path){if(this._boundPaths){delete this._boundPaths[path];}},_notifyBoundPaths:function(path,value){for(var a in this._boundPaths){var b=this._boundPaths[a];if(Path.isDescendant(a,path)){this._notifyPath(Path.translate(a,b,path),value);}else if(Path.isDescendant(b,path)){this._notifyPath(Path.translate(b,a,path),value);}}},_notifyPathUp:function(path,value){var rootName=Path.root(path);var dashCaseName=Polymer.CaseMap.camelToDashCase(rootName);var eventName=dashCaseName+this._EVENT_CHANGED;this.fire(eventName,{path:path,value:value},{bubbles:false,_useCache:Polymer.Settings.eventDataCache||!Polymer.Settings.isIE});},_EVENT_CHANGED:'-changed',notifySplices:function(path,splices){var info={};var array=this._get(path,this,info);this._notifySplices(array,info.path,splices);},_notifySplices:function(array,path,splices){var change={keySplices:Polymer.Collection.applySplices(array,splices),indexSplices:splices};var splicesPath=path+'.splices';this._notifyPath(splicesPath,change);this._notifyPath(path+'.length',array.length);this.__data__[splicesPath]={keySplices:null,indexSplices:null};},_notifySplice:function(array,path,index,added,removed){this._notifySplices(array,path,[{index:index,addedCount:added,removed:removed,object:array,type:'splice'}]);},push:function(path){var info={};var array=this._get(path,this,info);var args=Array.prototype.slice.call(arguments,1);var len=array.length;var ret=array.push.apply(array,args);if(args.length){this._notifySplice(array,info.path,len,args.length,[]);}
-return ret;},pop:function(path){var info={};var array=this._get(path,this,info);var hadLength=Boolean(array.length);var args=Array.prototype.slice.call(arguments,1);var ret=array.pop.apply(array,args);if(hadLength){this._notifySplice(array,info.path,array.length,0,[ret]);}
-return ret;},splice:function(path,start){var info={};var array=this._get(path,this,info);if(start<0){start=array.length-Math.floor(-start);}else{start=Math.floor(start);}
-if(!start){start=0;}
-var args=Array.prototype.slice.call(arguments,1);var ret=array.splice.apply(array,args);var addedCount=Math.max(args.length-2,0);if(addedCount||ret.length){this._notifySplice(array,info.path,start,addedCount,ret);}
-return ret;},shift:function(path){var info={};var array=this._get(path,this,info);var hadLength=Boolean(array.length);var args=Array.prototype.slice.call(arguments,1);var ret=array.shift.apply(array,args);if(hadLength){this._notifySplice(array,info.path,0,0,[ret]);}
-return ret;},unshift:function(path){var info={};var array=this._get(path,this,info);var args=Array.prototype.slice.call(arguments,1);var ret=array.unshift.apply(array,args);if(args.length){this._notifySplice(array,info.path,0,args.length,[]);}
-return ret;},prepareModelNotifyPath:function(model){this.mixin(model,{fire:Polymer.Base.fire,_getEvent:Polymer.Base._getEvent,__eventCache:Polymer.Base.__eventCache,notifyPath:Polymer.Base.notifyPath,_get:Polymer.Base._get,_EVENT_CHANGED:Polymer.Base._EVENT_CHANGED,_notifyPath:Polymer.Base._notifyPath,_notifyPathUp:Polymer.Base._notifyPathUp,_pathEffector:Polymer.Base._pathEffector,_annotationPathEffect:Polymer.Base._annotationPathEffect,_complexObserverPathEffect:Polymer.Base._complexObserverPathEffect,_annotatedComputationPathEffect:Polymer.Base._annotatedComputationPathEffect,_computePathEffect:Polymer.Base._computePathEffect,_notifyBoundPaths:Polymer.Base._notifyBoundPaths,_getPathParts:Polymer.Base._getPathParts});}});}());Polymer.Base._addFeature({resolveUrl:function(url){return Polymer.ResolveUrl.resolveUrl(url,this._importPath);}});Polymer.CssParse=function(){return{parse:function(text){text=this._clean(text);return this._parseCss(this._lex(text),text);},_clean:function(cssText){return cssText.replace(this._rx.comments,'').replace(this._rx.port,'');},_lex:function(text){var root={start:0,end:text.length};var n=root;for(var i=0,l=text.length;i<l;i++){switch(text[i]){case this.OPEN_BRACE:if(!n.rules){n.rules=[];}
-var p=n;var previous=p.rules[p.rules.length-1];n={start:i+1,parent:p,previous:previous};p.rules.push(n);break;case this.CLOSE_BRACE:n.end=i+1;n=n.parent||root;break;}}
-return root;},_parseCss:function(node,text){var t=text.substring(node.start,node.end-1);node.parsedCssText=node.cssText=t.trim();if(node.parent){var ss=node.previous?node.previous.end:node.parent.start;t=text.substring(ss,node.start-1);t=this._expandUnicodeEscapes(t);t=t.replace(this._rx.multipleSpaces,' ');t=t.substring(t.lastIndexOf(';')+1);var s=node.parsedSelector=node.selector=t.trim();node.atRule=s.indexOf(this.AT_START)===0;if(node.atRule){if(s.indexOf(this.MEDIA_START)===0){node.type=this.types.MEDIA_RULE;}else if(s.match(this._rx.keyframesRule)){node.type=this.types.KEYFRAMES_RULE;node.keyframesName=node.selector.split(this._rx.multipleSpaces).pop();}}else{if(s.indexOf(this.VAR_START)===0){node.type=this.types.MIXIN_RULE;}else{node.type=this.types.STYLE_RULE;}}}
-var r$=node.rules;if(r$){for(var i=0,l=r$.length,r;i<l&&(r=r$[i]);i++){this._parseCss(r,text);}}
-return node;},_expandUnicodeEscapes:function(s){return s.replace(/\\([0-9a-f]{1,6})\s/gi,function(){var code=arguments[1],repeat=6-code.length;while(repeat--){code='0'+code;}
-return'\\'+code;});},stringify:function(node,preserveProperties,text){text=text||'';var cssText='';if(node.cssText||node.rules){var r$=node.rules;if(r$&&!this._hasMixinRules(r$)){for(var i=0,l=r$.length,r;i<l&&(r=r$[i]);i++){cssText=this.stringify(r,preserveProperties,cssText);}}else{cssText=preserveProperties?node.cssText:this.removeCustomProps(node.cssText);cssText=cssText.trim();if(cssText){cssText='  '+cssText+'\n';}}}
-if(cssText){if(node.selector){text+=node.selector+' '+this.OPEN_BRACE+'\n';}
-text+=cssText;if(node.selector){text+=this.CLOSE_BRACE+'\n\n';}}
-return text;},_hasMixinRules:function(rules){return rules[0].selector.indexOf(this.VAR_START)===0;},removeCustomProps:function(cssText){cssText=this.removeCustomPropAssignment(cssText);return this.removeCustomPropApply(cssText);},removeCustomPropAssignment:function(cssText){return cssText.replace(this._rx.customProp,'').replace(this._rx.mixinProp,'');},removeCustomPropApply:function(cssText){return cssText.replace(this._rx.mixinApply,'').replace(this._rx.varApply,'');},types:{STYLE_RULE:1,KEYFRAMES_RULE:7,MEDIA_RULE:4,MIXIN_RULE:1000},OPEN_BRACE:'{',CLOSE_BRACE:'}',_rx:{comments:/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,port:/@import[^;]*;/gim,customProp:/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,mixinProp:/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,mixinApply:/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,varApply:/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,keyframesRule:/^@[^\s]*keyframes/,multipleSpaces:/\s+/g},VAR_START:'--',MEDIA_START:'@media',AT_START:'@'};}();Polymer.StyleUtil=function(){var settings=Polymer.Settings;return{unscopedStyleImports:new WeakMap(),SHADY_UNSCOPED_ATTR:'shady-unscoped',NATIVE_VARIABLES:Polymer.Settings.useNativeCSSProperties,MODULE_STYLES_SELECTOR:'style, link[rel=import][type~=css], template',INCLUDE_ATTR:'include',toCssText:function(rules,callback){if(typeof rules==='string'){rules=this.parser.parse(rules);}
-if(callback){this.forEachRule(rules,callback);}
-return this.parser.stringify(rules,this.NATIVE_VARIABLES);},forRulesInStyles:function(styles,styleRuleCallback,keyframesRuleCallback){if(styles){for(var i=0,l=styles.length,s;i<l&&(s=styles[i]);i++){this.forEachRuleInStyle(s,styleRuleCallback,keyframesRuleCallback);}}},forActiveRulesInStyles:function(styles,styleRuleCallback,keyframesRuleCallback){if(styles){for(var i=0,l=styles.length,s;i<l&&(s=styles[i]);i++){this.forEachRuleInStyle(s,styleRuleCallback,keyframesRuleCallback,true);}}},rulesForStyle:function(style){if(!style.__cssRules&&style.textContent){style.__cssRules=this.parser.parse(style.textContent);}
-return style.__cssRules;},isKeyframesSelector:function(rule){return rule.parent&&rule.parent.type===this.ruleTypes.KEYFRAMES_RULE;},forEachRuleInStyle:function(style,styleRuleCallback,keyframesRuleCallback,onlyActiveRules){var rules=this.rulesForStyle(style);var styleCallback,keyframeCallback;if(styleRuleCallback){styleCallback=function(rule){styleRuleCallback(rule,style);};}
-if(keyframesRuleCallback){keyframeCallback=function(rule){keyframesRuleCallback(rule,style);};}
-this.forEachRule(rules,styleCallback,keyframeCallback,onlyActiveRules);},forEachRule:function(node,styleRuleCallback,keyframesRuleCallback,onlyActiveRules){if(!node){return;}
-var skipRules=false;if(onlyActiveRules){if(node.type===this.ruleTypes.MEDIA_RULE){var matchMedia=node.selector.match(this.rx.MEDIA_MATCH);if(matchMedia){if(!window.matchMedia(matchMedia[1]).matches){skipRules=true;}}}}
-if(node.type===this.ruleTypes.STYLE_RULE){styleRuleCallback(node);}else if(keyframesRuleCallback&&node.type===this.ruleTypes.KEYFRAMES_RULE){keyframesRuleCallback(node);}else if(node.type===this.ruleTypes.MIXIN_RULE){skipRules=true;}
-var r$=node.rules;if(r$&&!skipRules){for(var i=0,l=r$.length,r;i<l&&(r=r$[i]);i++){this.forEachRule(r,styleRuleCallback,keyframesRuleCallback,onlyActiveRules);}}},applyCss:function(cssText,moniker,target,contextNode){var style=this.createScopeStyle(cssText,moniker);return this.applyStyle(style,target,contextNode);},applyStyle:function(style,target,contextNode){target=target||document.head;var after=contextNode&&contextNode.nextSibling||target.firstChild;this.__lastHeadApplyNode=style;return target.insertBefore(style,after);},createScopeStyle:function(cssText,moniker){var style=document.createElement('style');if(moniker){style.setAttribute('scope',moniker);}
-style.textContent=cssText;return style;},__lastHeadApplyNode:null,applyStylePlaceHolder:function(moniker){var placeHolder=document.createComment(' Shady DOM styles for '+moniker+' ');var after=this.__lastHeadApplyNode?this.__lastHeadApplyNode.nextSibling:null;var scope=document.head;scope.insertBefore(placeHolder,after||scope.firstChild);this.__lastHeadApplyNode=placeHolder;return placeHolder;},cssFromModules:function(moduleIds,warnIfNotFound){var modules=moduleIds.trim().split(/\s+/);var cssText='';for(var i=0;i<modules.length;i++){cssText+=this.cssFromModule(modules[i],warnIfNotFound);}
-return cssText;},cssFromModule:function(moduleId,warnIfNotFound){var m=Polymer.DomModule.import(moduleId);if(m&&!m._cssText){m._cssText=this.cssFromElement(m);}
-if(!m&&warnIfNotFound){console.warn('Could not find style data in module named',moduleId);}
-return m&&m._cssText||'';},cssFromElement:function(element){var cssText='';var content=element.content||element;var e$=Polymer.TreeApi.arrayCopy(content.querySelectorAll(this.MODULE_STYLES_SELECTOR));for(var i=0,e;i<e$.length;i++){e=e$[i];if(e.localName==='template'){if(!e.hasAttribute('preserve-content')){cssText+=this.cssFromElement(e);}}else{if(e.localName==='style'){var include=e.getAttribute(this.INCLUDE_ATTR);if(include){cssText+=this.cssFromModules(include,true);}
-e=e.__appliedElement||e;e.parentNode.removeChild(e);var css=this.resolveCss(e.textContent,element.ownerDocument);if(!settings.useNativeShadow&&e.hasAttribute(this.SHADY_UNSCOPED_ATTR)){e.textContent=css;document.head.insertBefore(e,document.head.firstChild);}else{cssText+=css;}}else if(e.import&&e.import.body){var importCss=this.resolveCss(e.import.body.textContent,e.import);if(!settings.useNativeShadow&&e.hasAttribute(this.SHADY_UNSCOPED_ATTR)){if(!this.unscopedStyleImports.has(e.import)){this.unscopedStyleImports.set(e.import,true);var importStyle=document.createElement('style');importStyle.setAttribute(this.SHADY_UNSCOPED_ATTR,'');importStyle.textContent=importCss;document.head.insertBefore(importStyle,document.head.firstChild);}}else{cssText+=importCss;}}}}
-return cssText;},styleIncludesToTemplate:function(targetTemplate){var styles=targetTemplate.content.querySelectorAll('style[include]');for(var i=0,s;i<styles.length;i++){s=styles[i];s.parentNode.insertBefore(this._includesToFragment(s.getAttribute('include')),s);}},_includesToFragment:function(styleIncludes){var includeArray=styleIncludes.trim().split(' ');var frag=document.createDocumentFragment();for(var i=0;i<includeArray.length;i++){var t=Polymer.DomModule.import(includeArray[i],'template');if(t){this._addStylesToFragment(frag,t.content);}}
-return frag;},_addStylesToFragment:function(frag,source){var s$=source.querySelectorAll('style');for(var i=0,s;i<s$.length;i++){s=s$[i];var include=s.getAttribute('include');if(include){frag.appendChild(this._includesToFragment(include));}
-if(s.textContent){frag.appendChild(s.cloneNode(true));}}},isTargetedBuild:function(buildType){return settings.useNativeShadow?buildType==='shadow':buildType==='shady';},cssBuildTypeForModule:function(module){var dm=Polymer.DomModule.import(module);if(dm){return this.getCssBuildType(dm);}},getCssBuildType:function(element){return element.getAttribute('css-build');},_findMatchingParen:function(text,start){var level=0;for(var i=start,l=text.length;i<l;i++){switch(text[i]){case'(':level++;break;case')':if(--level===0){return i;}
-break;}}
-return-1;},processVariableAndFallback:function(str,callback){var start=str.indexOf('var(');if(start===-1){return callback(str,'','','');}
-var end=this._findMatchingParen(str,start+3);var inner=str.substring(start+4,end);var prefix=str.substring(0,start);var suffix=this.processVariableAndFallback(str.substring(end+1),callback);var comma=inner.indexOf(',');if(comma===-1){return callback(prefix,inner.trim(),'',suffix);}
-var value=inner.substring(0,comma).trim();var fallback=inner.substring(comma+1).trim();return callback(prefix,value,fallback,suffix);},rx:{VAR_ASSIGN:/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:([^;{]*)|{([^}]*)})(?:(?=[;\s}])|$)/gi,MIXIN_MATCH:/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,VAR_CONSUMED:/(--[\w-]+)\s*([:,;)]|$)/gi,ANIMATION_MATCH:/(animation\s*:)|(animation-name\s*:)/,MEDIA_MATCH:/@media[^(]*(\([^)]*\))/,IS_VAR:/^--/,BRACKETED:/\{[^}]*\}/g,HOST_PREFIX:'(?:^|[^.#[:])',HOST_SUFFIX:'($|[.:[\\s>+~])'},resolveCss:Polymer.ResolveUrl.resolveCss,parser:Polymer.CssParse,ruleTypes:Polymer.CssParse.types};}();Polymer.StyleTransformer=function(){var styleUtil=Polymer.StyleUtil;var settings=Polymer.Settings;var api={dom:function(node,scope,useAttr,shouldRemoveScope){this._transformDom(node,scope||'',useAttr,shouldRemoveScope);},_transformDom:function(node,selector,useAttr,shouldRemoveScope){if(node.setAttribute){this.element(node,selector,useAttr,shouldRemoveScope);}
-var c$=Polymer.dom(node).childNodes;for(var i=0;i<c$.length;i++){this._transformDom(c$[i],selector,useAttr,shouldRemoveScope);}},element:function(element,scope,useAttr,shouldRemoveScope){if(useAttr){if(shouldRemoveScope){element.removeAttribute(SCOPE_NAME);}else{element.setAttribute(SCOPE_NAME,scope);}}else{if(scope){if(element.classList){if(shouldRemoveScope){element.classList.remove(SCOPE_NAME);element.classList.remove(scope);}else{element.classList.add(SCOPE_NAME);element.classList.add(scope);}}else if(element.getAttribute){var c=element.getAttribute(CLASS);if(shouldRemoveScope){if(c){element.setAttribute(CLASS,c.replace(SCOPE_NAME,'').replace(scope,''));}}else{element.setAttribute(CLASS,(c?c+' ':'')+SCOPE_NAME+' '+scope);}}}}},elementStyles:function(element,callback){var styles=element._styles;var cssText='';var cssBuildType=element.__cssBuild;var passthrough=settings.useNativeShadow||cssBuildType==='shady';var cb;if(passthrough){var self=this;cb=function(rule){rule.selector=self._slottedToContent(rule.selector);rule.selector=rule.selector.replace(ROOT,':host > *');rule.selector=self._dirShadowTransform(rule.selector);if(callback){callback(rule);}};}
-for(var i=0,l=styles.length,s;i<l&&(s=styles[i]);i++){var rules=styleUtil.rulesForStyle(s);cssText+=passthrough?styleUtil.toCssText(rules,cb):this.css(rules,element.is,element.extends,callback,element._scopeCssViaAttr)+'\n\n';}
-return cssText.trim();},css:function(rules,scope,ext,callback,useAttr){var hostScope=this._calcHostScope(scope,ext);scope=this._calcElementScope(scope,useAttr);var self=this;return styleUtil.toCssText(rules,function(rule){if(!rule.isScoped){self.rule(rule,scope,hostScope);rule.isScoped=true;}
-if(callback){callback(rule,scope,hostScope);}});},_calcElementScope:function(scope,useAttr){if(scope){return useAttr?CSS_ATTR_PREFIX+scope+CSS_ATTR_SUFFIX:CSS_CLASS_PREFIX+scope;}else{return'';}},_calcHostScope:function(scope,ext){return ext?'[is='+scope+']':scope;},rule:function(rule,scope,hostScope){this._transformRule(rule,this._transformComplexSelector,scope,hostScope);},_transformRule:function(rule,transformer,scope,hostScope){rule.selector=rule.transformedSelector=this._transformRuleCss(rule,transformer,scope,hostScope);},_splitSelectorList:function(selector){var parts=[];var part='';for(var i=0;i>=0&&i<selector.length;i++){if(selector[i]==='('){var end=styleUtil._findMatchingParen(selector,i);part+=selector.slice(i,end+1);i=end;}else if(selector[i]===COMPLEX_SELECTOR_SEP){parts.push(part);part='';}else{part+=selector[i];}}
-if(part){parts.push(part);}
-if(parts.length===0){parts.push(selector);}
-return parts;},_transformRuleCss:function(rule,transformer,scope,hostScope){var p$=this._splitSelectorList(rule.selector);if(!styleUtil.isKeyframesSelector(rule)){for(var i=0,l=p$.length,p;i<l&&(p=p$[i]);i++){p$[i]=transformer.call(this,p,scope,hostScope);}}
-return p$.join(COMPLEX_SELECTOR_SEP);},_ensureScopedDir:function(s){var m=s.match(DIR_PAREN);if(m&&m[1]===''&&m[0].length===s.length){s='*'+s;}
-return s;},_additionalDirSelectors:function(dir,after,prefix){if(!dir||!after){return'';}
-prefix=prefix||'';return COMPLEX_SELECTOR_SEP+prefix+' '+dir+' '+after;},_transformComplexSelector:function(selector,scope,hostScope){var stop=false;var hostContext=false;var dir=false;var self=this;selector=selector.trim();selector=this._slottedToContent(selector);selector=selector.replace(ROOT,':host > *');selector=selector.replace(CONTENT_START,HOST+' $1');selector=this._ensureScopedDir(selector);selector=selector.replace(SIMPLE_SELECTOR_SEP,function(m,c,s){if(!stop){var info=self._transformCompoundSelector(s,c,scope,hostScope);stop=stop||info.stop;hostContext=hostContext||info.hostContext;dir=dir||info.dir;c=info.combinator;s=info.value;}else{s=s.replace(SCOPE_JUMP,' ');}
-return c+s;});if(hostContext){selector=selector.replace(HOST_CONTEXT_PAREN,function(m,pre,paren,post){var replacement=pre+paren+' '+hostScope+post+COMPLEX_SELECTOR_SEP+' '+pre+hostScope+paren+post;if(dir){replacement+=self._additionalDirSelectors(paren,post,hostScope);}
-return replacement;});}
-return selector;},_transformDir:function(s){s=s.replace(HOST_DIR,HOST_DIR_REPLACE);s=s.replace(DIR_PAREN,DIR_REPLACE);return s;},_transformCompoundSelector:function(selector,combinator,scope,hostScope){var jumpIndex=selector.search(SCOPE_JUMP);var hostContext=false;var dir=false;if(selector.match(DIR_PAREN)){selector=this._transformDir(selector);dir=true;}
-if(selector.indexOf(HOST_CONTEXT)>=0){hostContext=true;}else if(selector.indexOf(HOST)>=0){selector=this._transformHostSelector(selector,hostScope);}else if(jumpIndex!==0){selector=scope?this._transformSimpleSelector(selector,scope):selector;}
-if(selector.indexOf(CONTENT)>=0){combinator='';}
-var stop;if(jumpIndex>=0){selector=selector.replace(SCOPE_JUMP,' ');stop=true;}
-return{value:selector,combinator:combinator,stop:stop,hostContext:hostContext,dir:dir};},_transformSimpleSelector:function(selector,scope){var p$=selector.split(PSEUDO_PREFIX);p$[0]+=scope;return p$.join(PSEUDO_PREFIX);},_transformHostSelector:function(selector,hostScope){var m=selector.match(HOST_PAREN);var paren=m&&m[2].trim()||'';if(paren){if(!paren[0].match(SIMPLE_SELECTOR_PREFIX)){var typeSelector=paren.split(SIMPLE_SELECTOR_PREFIX)[0];if(typeSelector===hostScope){return paren;}else{return SELECTOR_NO_MATCH;}}else{return selector.replace(HOST_PAREN,function(m,host,paren){return hostScope+paren;});}}else{return selector.replace(HOST,hostScope);}},documentRule:function(rule){rule.selector=rule.parsedSelector;this.normalizeRootSelector(rule);if(!settings.useNativeShadow){this._transformRule(rule,this._transformDocumentSelector);}},normalizeRootSelector:function(rule){rule.selector=rule.selector.replace(ROOT,'html');var parts=this._splitSelectorList(rule.selector);parts=parts.filter(function(part){return!part.match(HOST_OR_HOST_GT_STAR);});rule.selector=parts.join(COMPLEX_SELECTOR_SEP);},_transformDocumentSelector:function(selector){return this._transformComplexSelector(selector,SCOPE_DOC_SELECTOR);},_slottedToContent:function(cssText){return cssText.replace(SLOTTED_PAREN,CONTENT+'> $1');},_dirShadowTransform:function(selector){if(!selector.match(/:dir\(/)){return selector;}
-return this._splitSelectorList(selector).map(function(s){s=this._ensureScopedDir(s);s=this._transformDir(s);var m=HOST_CONTEXT_PAREN.exec(s);if(m){s+=this._additionalDirSelectors(m[2],m[3],'');}
-return s;},this).join(COMPLEX_SELECTOR_SEP);},SCOPE_NAME:'style-scope'};var SCOPE_NAME=api.SCOPE_NAME;var SCOPE_DOC_SELECTOR=':not(['+SCOPE_NAME+'])'+':not(.'+SCOPE_NAME+')';var COMPLEX_SELECTOR_SEP=',';var SIMPLE_SELECTOR_SEP=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=\[])+)/g;var SIMPLE_SELECTOR_PREFIX=/[[.:#*]/;var HOST=':host';var ROOT=':root';var HOST_PAREN=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;var HOST_CONTEXT=':host-context';var HOST_CONTEXT_PAREN=/(.*)(?::host-context)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))(.*)/;var CONTENT='::content';var SCOPE_JUMP=/::content|::shadow|\/deep\//;var CSS_CLASS_PREFIX='.';var CSS_ATTR_PREFIX='['+SCOPE_NAME+'~=';var CSS_ATTR_SUFFIX=']';var PSEUDO_PREFIX=':';var CLASS='class';var CONTENT_START=new RegExp('^('+CONTENT+')');var SELECTOR_NO_MATCH='should_not_match';var SLOTTED_PAREN=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g;var HOST_OR_HOST_GT_STAR=/:host(?:\s*>\s*\*)?/;var DIR_PAREN=/(.*):dir\((ltr|rtl)\)/;var DIR_REPLACE=':host-context([dir="$2"]) $1';var HOST_DIR=/:host\(:dir\((rtl|ltr)\)\)/g;var HOST_DIR_REPLACE=':host-context([dir="$1"])';return api;}();Polymer.StyleExtends=function(){var styleUtil=Polymer.StyleUtil;return{hasExtends:function(cssText){return Boolean(cssText.match(this.rx.EXTEND));},transform:function(style){var rules=styleUtil.rulesForStyle(style);var self=this;styleUtil.forEachRule(rules,function(rule){self._mapRuleOntoParent(rule);if(rule.parent){var m;while(m=self.rx.EXTEND.exec(rule.cssText)){var extend=m[1];var extendor=self._findExtendor(extend,rule);if(extendor){self._extendRule(rule,extendor);}}}
-rule.cssText=rule.cssText.replace(self.rx.EXTEND,'');});return styleUtil.toCssText(rules,function(rule){if(rule.selector.match(self.rx.STRIP)){rule.cssText='';}},true);},_mapRuleOntoParent:function(rule){if(rule.parent){var map=rule.parent.map||(rule.parent.map={});var parts=rule.selector.split(',');for(var i=0,p;i<parts.length;i++){p=parts[i];map[p.trim()]=rule;}
-return map;}},_findExtendor:function(extend,rule){return rule.parent&&rule.parent.map&&rule.parent.map[extend]||this._findExtendor(extend,rule.parent);},_extendRule:function(target,source){if(target.parent!==source.parent){this._cloneAndAddRuleToParent(source,target.parent);}
-target.extends=target.extends||[];target.extends.push(source);source.selector=source.selector.replace(this.rx.STRIP,'');source.selector=(source.selector&&source.selector+',\n')+target.selector;if(source.extends){source.extends.forEach(function(e){this._extendRule(target,e);},this);}},_cloneAndAddRuleToParent:function(rule,parent){rule=Object.create(rule);rule.parent=parent;if(rule.extends){rule.extends=rule.extends.slice();}
-parent.rules.push(rule);},rx:{EXTEND:/@extends\(([^)]*)\)\s*?;/gim,STRIP:/%[^,]*$/}};}();Polymer.ApplyShim=function(){'use strict';var styleUtil=Polymer.StyleUtil;var MIXIN_MATCH=styleUtil.rx.MIXIN_MATCH;var VAR_ASSIGN=styleUtil.rx.VAR_ASSIGN;var BAD_VAR=/var\(\s*(--[^,]*),\s*(--[^)]*)\)/g;var APPLY_NAME_CLEAN=/;\s*/m;var INITIAL_INHERIT=/^\s*(initial)|(inherit)\s*$/;var MIXIN_VAR_SEP='_-_';var mixinMap={};function mapSet(name,props){name=name.trim();mixinMap[name]={properties:props,dependants:{}};}
-function mapGet(name){name=name.trim();return mixinMap[name];}
-function replaceInitialOrInherit(property,value){var match=INITIAL_INHERIT.exec(value);if(match){if(match[1]){value=ApplyShim._getInitialValueForProperty(property);}else{value='apply-shim-inherit';}}
-return value;}
-function cssTextToMap(text){var props=text.split(';');var property,value;var out={};for(var i=0,p,sp;i<props.length;i++){p=props[i];if(p){sp=p.split(':');if(sp.length>1){property=sp[0].trim();value=replaceInitialOrInherit(property,sp.slice(1).join(':'));out[property]=value;}}}
-return out;}
-function invalidateMixinEntry(mixinEntry){var currentProto=ApplyShim.__currentElementProto;var currentElementName=currentProto&&currentProto.is;for(var elementName in mixinEntry.dependants){if(elementName!==currentElementName){mixinEntry.dependants[elementName].__applyShimInvalid=true;}}}
-function produceCssProperties(matchText,propertyName,valueProperty,valueMixin){if(valueProperty){styleUtil.processVariableAndFallback(valueProperty,function(prefix,value){if(value&&mapGet(value)){valueMixin='@apply '+value+';';}});}
-if(!valueMixin){return matchText;}
-var mixinAsProperties=consumeCssProperties(valueMixin);var prefix=matchText.slice(0,matchText.indexOf('--'));var mixinValues=cssTextToMap(mixinAsProperties);var combinedProps=mixinValues;var mixinEntry=mapGet(propertyName);var oldProps=mixinEntry&&mixinEntry.properties;if(oldProps){combinedProps=Object.create(oldProps);combinedProps=Polymer.Base.mixin(combinedProps,mixinValues);}else{mapSet(propertyName,combinedProps);}
-var out=[];var p,v;var needToInvalidate=false;for(p in combinedProps){v=mixinValues[p];if(v===undefined){v='initial';}
-if(oldProps&&!(p in oldProps)){needToInvalidate=true;}
-out.push(propertyName+MIXIN_VAR_SEP+p+': '+v);}
-if(needToInvalidate){invalidateMixinEntry(mixinEntry);}
-if(mixinEntry){mixinEntry.properties=combinedProps;}
-if(valueProperty){prefix=matchText+';'+prefix;}
-return prefix+out.join('; ')+';';}
-function fixVars(matchText,varA,varB){return'var('+varA+','+'var('+varB+'))';}
-function atApplyToCssProperties(mixinName,fallbacks){mixinName=mixinName.replace(APPLY_NAME_CLEAN,'');var vars=[];var mixinEntry=mapGet(mixinName);if(!mixinEntry){mapSet(mixinName,{});mixinEntry=mapGet(mixinName);}
-if(mixinEntry){var currentProto=ApplyShim.__currentElementProto;if(currentProto){mixinEntry.dependants[currentProto.is]=currentProto;}
-var p,parts,f;for(p in mixinEntry.properties){f=fallbacks&&fallbacks[p];parts=[p,': var(',mixinName,MIXIN_VAR_SEP,p];if(f){parts.push(',',f);}
-parts.push(')');vars.push(parts.join(''));}}
-return vars.join('; ');}
-function consumeCssProperties(text){var m;while(m=MIXIN_MATCH.exec(text)){var matchText=m[0];var mixinName=m[1];var idx=m.index;var applyPos=idx+matchText.indexOf('@apply');var afterApplyPos=idx+matchText.length;var textBeforeApply=text.slice(0,applyPos);var textAfterApply=text.slice(afterApplyPos);var defaults=cssTextToMap(textBeforeApply);var replacement=atApplyToCssProperties(mixinName,defaults);text=[textBeforeApply,replacement,textAfterApply].join('');MIXIN_MATCH.lastIndex=idx+replacement.length;}
-return text;}
-var ApplyShim={_measureElement:null,_map:mixinMap,_separator:MIXIN_VAR_SEP,transform:function(styles,elementProto){this.__currentElementProto=elementProto;styleUtil.forRulesInStyles(styles,this._boundFindDefinitions);styleUtil.forRulesInStyles(styles,this._boundFindApplications);if(elementProto){elementProto.__applyShimInvalid=false;}
-this.__currentElementProto=null;},_findDefinitions:function(rule){var cssText=rule.parsedCssText;cssText=cssText.replace(BAD_VAR,fixVars);cssText=cssText.replace(VAR_ASSIGN,produceCssProperties);rule.cssText=cssText;if(rule.selector===':root'){rule.selector=':host > *';}},_findApplications:function(rule){rule.cssText=consumeCssProperties(rule.cssText);},transformRule:function(rule){this._findDefinitions(rule);this._findApplications(rule);},_getInitialValueForProperty:function(property){if(!this._measureElement){this._measureElement=document.createElement('meta');this._measureElement.style.all='initial';document.head.appendChild(this._measureElement);}
-return window.getComputedStyle(this._measureElement).getPropertyValue(property);}};ApplyShim._boundTransformRule=ApplyShim.transformRule.bind(ApplyShim);ApplyShim._boundFindDefinitions=ApplyShim._findDefinitions.bind(ApplyShim);ApplyShim._boundFindApplications=ApplyShim._findApplications.bind(ApplyShim);return ApplyShim;}();(function(){var prepElement=Polymer.Base._prepElement;var nativeShadow=Polymer.Settings.useNativeShadow;var styleUtil=Polymer.StyleUtil;var styleTransformer=Polymer.StyleTransformer;var styleExtends=Polymer.StyleExtends;var applyShim=Polymer.ApplyShim;var settings=Polymer.Settings;Polymer.Base._addFeature({_prepElement:function(element){if(this._encapsulateStyle&&this.__cssBuild!=='shady'){styleTransformer.element(element,this.is,this._scopeCssViaAttr);}
-prepElement.call(this,element);},_prepStyles:function(){if(this._encapsulateStyle===undefined){this._encapsulateStyle=!nativeShadow;}
-if(!nativeShadow){this._scopeStyle=styleUtil.applyStylePlaceHolder(this.is);}
-this.__cssBuild=styleUtil.cssBuildTypeForModule(this.is);},_prepShimStyles:function(){if(this._template){var hasTargetedCssBuild=styleUtil.isTargetedBuild(this.__cssBuild);if(settings.useNativeCSSProperties&&this.__cssBuild==='shadow'&&hasTargetedCssBuild){if(settings.preserveStyleIncludes){styleUtil.styleIncludesToTemplate(this._template);}
-return;}
-this._styles=this._styles||this._collectStyles();if(settings.useNativeCSSProperties&&!this.__cssBuild){applyShim.transform(this._styles,this);}
-var cssText=settings.useNativeCSSProperties&&hasTargetedCssBuild?this._styles.length&&this._styles[0].textContent.trim():styleTransformer.elementStyles(this);this._prepStyleProperties();if(!this._needsStyleProperties()&&cssText){styleUtil.applyCss(cssText,this.is,nativeShadow?this._template.content:null,this._scopeStyle);}}else{this._styles=[];}},_collectStyles:function(){var styles=[];var cssText='',m$=this.styleModules;if(m$){for(var i=0,l=m$.length,m;i<l&&(m=m$[i]);i++){cssText+=styleUtil.cssFromModule(m);}}
-cssText+=styleUtil.cssFromModule(this.is);var p=this._template&&this._template.parentNode;if(this._template&&(!p||p.id.toLowerCase()!==this.is)){cssText+=styleUtil.cssFromElement(this._template);}
-if(cssText){var style=document.createElement('style');style.textContent=cssText;if(styleExtends.hasExtends(style.textContent)){cssText=styleExtends.transform(style);}
-styles.push(style);}
-return styles;},_elementAdd:function(node){if(this._encapsulateStyle){if(node.__styleScoped){node.__styleScoped=false;}else{styleTransformer.dom(node,this.is,this._scopeCssViaAttr);}}},_elementRemove:function(node){if(this._encapsulateStyle){styleTransformer.dom(node,this.is,this._scopeCssViaAttr,true);}},scopeSubtree:function(container,shouldObserve){if(nativeShadow){return;}
-var self=this;var scopify=function(node){if(node.nodeType===Node.ELEMENT_NODE){var className=node.getAttribute('class');node.setAttribute('class',self._scopeElementClass(node,className));var n$=node.querySelectorAll('*');for(var i=0,n;i<n$.length&&(n=n$[i]);i++){className=n.getAttribute('class');n.setAttribute('class',self._scopeElementClass(n,className));}}};scopify(container);if(shouldObserve){var mo=new MutationObserver(function(mxns){for(var i=0,m;i<mxns.length&&(m=mxns[i]);i++){if(m.addedNodes){for(var j=0;j<m.addedNodes.length;j++){scopify(m.addedNodes[j]);}}}});mo.observe(container,{childList:true,subtree:true});return mo;}}});}());Polymer.StyleProperties=function(){'use strict';var matchesSelector=Polymer.DomApi.matchesSelector;var styleUtil=Polymer.StyleUtil;var styleTransformer=Polymer.StyleTransformer;var IS_IE=navigator.userAgent.match('Trident');var settings=Polymer.Settings;return{decorateStyles:function(styles,scope){var self=this,props={},keyframes=[],ruleIndex=0;var scopeSelector=styleTransformer._calcHostScope(scope.is,scope.extends);styleUtil.forRulesInStyles(styles,function(rule,style){self.decorateRule(rule);rule.index=ruleIndex++;self.whenHostOrRootRule(scope,rule,style,function(info){if(rule.parent.type===styleUtil.ruleTypes.MEDIA_RULE){scope.__notStyleScopeCacheable=true;}
-if(info.isHost){var hostContextOrFunction=info.selector.split(' ').some(function(s){return s.indexOf(scopeSelector)===0&&s.length!==scopeSelector.length;});scope.__notStyleScopeCacheable=scope.__notStyleScopeCacheable||hostContextOrFunction;}});self.collectPropertiesInCssText(rule.propertyInfo.cssText,props);},function onKeyframesRule(rule){keyframes.push(rule);});styles._keyframes=keyframes;var names=[];for(var i in props){names.push(i);}
-return names;},decorateRule:function(rule){if(rule.propertyInfo){return rule.propertyInfo;}
-var info={},properties={};var hasProperties=this.collectProperties(rule,properties);if(hasProperties){info.properties=properties;rule.rules=null;}
-info.cssText=this.collectCssText(rule);rule.propertyInfo=info;return info;},collectProperties:function(rule,properties){var info=rule.propertyInfo;if(info){if(info.properties){Polymer.Base.mixin(properties,info.properties);return true;}}else{var m,rx=this.rx.VAR_ASSIGN;var cssText=rule.parsedCssText;var value;var any;while(m=rx.exec(cssText)){value=(m[2]||m[3]).trim();if(value!=='inherit'){properties[m[1].trim()]=value;}
-any=true;}
-return any;}},collectCssText:function(rule){return this.collectConsumingCssText(rule.parsedCssText);},collectConsumingCssText:function(cssText){return cssText.replace(this.rx.BRACKETED,'').replace(this.rx.VAR_ASSIGN,'');},collectPropertiesInCssText:function(cssText,props){var m;while(m=this.rx.VAR_CONSUMED.exec(cssText)){var name=m[1];if(m[2]!==':'){props[name]=true;}}},reify:function(props){var names=Object.getOwnPropertyNames(props);for(var i=0,n;i<names.length;i++){n=names[i];props[n]=this.valueForProperty(props[n],props);}},valueForProperty:function(property,props){if(property){if(property.indexOf(';')>=0){property=this.valueForProperties(property,props);}else{var self=this;var fn=function(prefix,value,fallback,suffix){var propertyValue=self.valueForProperty(props[value],props);if(!propertyValue||propertyValue==='initial'){propertyValue=self.valueForProperty(props[fallback]||fallback,props)||fallback;}else if(propertyValue==='apply-shim-inherit'){propertyValue='inherit';}
-return prefix+(propertyValue||'')+suffix;};property=styleUtil.processVariableAndFallback(property,fn);}}
-return property&&property.trim()||'';},valueForProperties:function(property,props){var parts=property.split(';');for(var i=0,p,m;i<parts.length;i++){if(p=parts[i]){this.rx.MIXIN_MATCH.lastIndex=0;m=this.rx.MIXIN_MATCH.exec(p);if(m){p=this.valueForProperty(props[m[1]],props);}else{var colon=p.indexOf(':');if(colon!==-1){var pp=p.substring(colon);pp=pp.trim();pp=this.valueForProperty(pp,props)||pp;p=p.substring(0,colon)+pp;}}
-parts[i]=p&&p.lastIndexOf(';')===p.length-1?p.slice(0,-1):p||'';}}
-return parts.join(';');},applyProperties:function(rule,props){var output='';if(!rule.propertyInfo){this.decorateRule(rule);}
-if(rule.propertyInfo.cssText){output=this.valueForProperties(rule.propertyInfo.cssText,props);}
-rule.cssText=output;},applyKeyframeTransforms:function(rule,keyframeTransforms){var input=rule.cssText;var output=rule.cssText;if(rule.hasAnimations==null){rule.hasAnimations=this.rx.ANIMATION_MATCH.test(input);}
-if(rule.hasAnimations){var transform;if(rule.keyframeNamesToTransform==null){rule.keyframeNamesToTransform=[];for(var keyframe in keyframeTransforms){transform=keyframeTransforms[keyframe];output=transform(input);if(input!==output){input=output;rule.keyframeNamesToTransform.push(keyframe);}}}else{for(var i=0;i<rule.keyframeNamesToTransform.length;++i){transform=keyframeTransforms[rule.keyframeNamesToTransform[i]];input=transform(input);}
-output=input;}}
-rule.cssText=output;},propertyDataFromStyles:function(styles,element){var props={},self=this;var o=[];styleUtil.forActiveRulesInStyles(styles,function(rule){if(!rule.propertyInfo){self.decorateRule(rule);}
-var selectorToMatch=rule.transformedSelector||rule.parsedSelector;if(element&&rule.propertyInfo.properties&&selectorToMatch){if(matchesSelector.call(element,selectorToMatch)){self.collectProperties(rule,props);addToBitMask(rule.index,o);}}});return{properties:props,key:o};},_rootSelector:/:root|:host\s*>\s*\*/,_checkRoot:function(hostScope,selector){return Boolean(selector.match(this._rootSelector))||hostScope==='html'&&selector.indexOf('html')>-1;},whenHostOrRootRule:function(scope,rule,style,callback){if(!rule.propertyInfo){self.decorateRule(rule);}
-if(!rule.propertyInfo.properties){return;}
-var hostScope=scope.is?styleTransformer._calcHostScope(scope.is,scope.extends):'html';var parsedSelector=rule.parsedSelector;var isRoot=this._checkRoot(hostScope,parsedSelector);var isHost=!isRoot&&parsedSelector.indexOf(':host')===0;var cssBuild=scope.__cssBuild||style.__cssBuild;if(cssBuild==='shady'){isRoot=parsedSelector===hostScope+' > *.'+hostScope||parsedSelector.indexOf('html')>-1;isHost=!isRoot&&parsedSelector.indexOf(hostScope)===0;}
-if(!isRoot&&!isHost){return;}
-var selectorToMatch=hostScope;if(isHost){if(settings.useNativeShadow&&!rule.transformedSelector){rule.transformedSelector=styleTransformer._transformRuleCss(rule,styleTransformer._transformComplexSelector,scope.is,hostScope);}
-selectorToMatch=rule.transformedSelector||rule.parsedSelector;}
-if(isRoot&&hostScope==='html'){selectorToMatch=rule.transformedSelector||rule.parsedSelector;}
-callback({selector:selectorToMatch,isHost:isHost,isRoot:isRoot});},hostAndRootPropertiesForScope:function(scope){var hostProps={},rootProps={},self=this;styleUtil.forActiveRulesInStyles(scope._styles,function(rule,style){self.whenHostOrRootRule(scope,rule,style,function(info){var element=scope._element||scope;if(matchesSelector.call(element,info.selector)){if(info.isHost){self.collectProperties(rule,hostProps);}else{self.collectProperties(rule,rootProps);}}});});return{rootProps:rootProps,hostProps:hostProps};},transformStyles:function(element,properties,scopeSelector){var self=this;var hostSelector=styleTransformer._calcHostScope(element.is,element.extends);var rxHostSelector=element.extends?'\\'+hostSelector.slice(0,-1)+'\\]':hostSelector;var hostRx=new RegExp(this.rx.HOST_PREFIX+rxHostSelector+this.rx.HOST_SUFFIX);var keyframeTransforms=this._elementKeyframeTransforms(element,scopeSelector);return styleTransformer.elementStyles(element,function(rule){self.applyProperties(rule,properties);if(!settings.useNativeShadow&&!Polymer.StyleUtil.isKeyframesSelector(rule)&&rule.cssText){self.applyKeyframeTransforms(rule,keyframeTransforms);self._scopeSelector(rule,hostRx,hostSelector,element._scopeCssViaAttr,scopeSelector);}});},_elementKeyframeTransforms:function(element,scopeSelector){var keyframesRules=element._styles._keyframes;var keyframeTransforms={};if(!settings.useNativeShadow&&keyframesRules){for(var i=0,keyframesRule=keyframesRules[i];i<keyframesRules.length;keyframesRule=keyframesRules[++i]){this._scopeKeyframes(keyframesRule,scopeSelector);keyframeTransforms[keyframesRule.keyframesName]=this._keyframesRuleTransformer(keyframesRule);}}
-return keyframeTransforms;},_keyframesRuleTransformer:function(keyframesRule){return function(cssText){return cssText.replace(keyframesRule.keyframesNameRx,keyframesRule.transformedKeyframesName);};},_scopeKeyframes:function(rule,scopeId){rule.keyframesNameRx=new RegExp('\\b'+rule.keyframesName+'(?!\\B|-)','g');rule.transformedKeyframesName=rule.keyframesName+'-'+scopeId;rule.transformedSelector=rule.transformedSelector||rule.selector;rule.selector=rule.transformedSelector.replace(rule.keyframesName,rule.transformedKeyframesName);},_hasDirOrHostContext:function(parsedSelector){return/:host-context|:dir/.test(parsedSelector);},_scopeSelector:function(rule,hostRx,hostSelector,viaAttr,scopeId){rule.transformedSelector=rule.transformedSelector||rule.selector;var selector=rule.transformedSelector;var scope=styleTransformer._calcElementScope(scopeId,viaAttr);var hostScope=styleTransformer._calcElementScope(hostSelector,viaAttr);var parts=selector.split(',');var isDirOrHostContextSelector=this._hasDirOrHostContext(rule.parsedSelector);for(var i=0,l=parts.length,p;i<l&&(p=parts[i]);i++){parts[i]=p.match(hostRx)?p.replace(hostSelector,scope):isDirOrHostContextSelector?p.replace(hostScope,scope+' '+hostScope):scope+' '+p;}
-rule.selector=parts.join(',');},applyElementScopeSelector:function(element,selector,old,viaAttr){var c=viaAttr?element.getAttribute(styleTransformer.SCOPE_NAME):element.getAttribute('class')||'';var v=old?c.replace(old,selector):(c?c+' ':'')+this.XSCOPE_NAME+' '+selector;if(c!==v){if(viaAttr){element.setAttribute(styleTransformer.SCOPE_NAME,v);}else{element.setAttribute('class',v);}}},applyElementStyle:function(element,properties,selector,style){var cssText=style?style.textContent||'':this.transformStyles(element,properties,selector);var s=element._customStyle;if(s&&!settings.useNativeShadow&&s!==style){s._useCount--;if(s._useCount<=0&&s.parentNode){s.parentNode.removeChild(s);}}
-if(settings.useNativeShadow){if(element._customStyle){element._customStyle.textContent=cssText;style=element._customStyle;}else if(cssText){style=styleUtil.applyCss(cssText,selector,element.root,element._scopeStyle);}}else{if(!style){if(cssText){style=styleUtil.applyCss(cssText,selector,null,element._scopeStyle);}}else if(!style.parentNode){if(IS_IE&&cssText.indexOf('@media')>-1){style.textContent=cssText;}
-styleUtil.applyStyle(style,null,element._scopeStyle);}}
-if(style){style._useCount=style._useCount||0;if(element._customStyle!=style){style._useCount++;}
-element._customStyle=style;}
-return style;},mixinCustomStyle:function(props,customStyle){var v;for(var i in customStyle){v=customStyle[i];if(v||v===0){props[i]=v;}}},updateNativeStyleProperties:function(element,properties){var oldPropertyNames=element.__customStyleProperties;if(oldPropertyNames){for(var i=0;i<oldPropertyNames.length;i++){element.style.removeProperty(oldPropertyNames[i]);}}
-var propertyNames=[];for(var p in properties){if(properties[p]!==null){element.style.setProperty(p,properties[p]);propertyNames.push(p);}}
-element.__customStyleProperties=propertyNames;},rx:styleUtil.rx,XSCOPE_NAME:'x-scope'};function addToBitMask(n,bits){var o=parseInt(n/32);var v=1<<n%32;bits[o]=(bits[o]||0)|v;}}();(function(){Polymer.StyleCache=function(){this.cache={};};Polymer.StyleCache.prototype={MAX:100,store:function(is,data,keyValues,keyStyles){data.keyValues=keyValues;data.styles=keyStyles;var s$=this.cache[is]=this.cache[is]||[];s$.push(data);if(s$.length>this.MAX){s$.shift();}},retrieve:function(is,keyValues,keyStyles){var cache=this.cache[is];if(cache){for(var i=cache.length-1,data;i>=0;i--){data=cache[i];if(keyStyles===data.styles&&this._objectsEqual(keyValues,data.keyValues)){return data;}}}},clear:function(){this.cache={};},_objectsEqual:function(target,source){var t,s;for(var i in target){t=target[i],s=source[i];if(!(typeof t==='object'&&t?this._objectsStrictlyEqual(t,s):t===s)){return false;}}
-if(Array.isArray(target)){return target.length===source.length;}
-return true;},_objectsStrictlyEqual:function(target,source){return this._objectsEqual(target,source)&&this._objectsEqual(source,target);}};}());Polymer.StyleDefaults=function(){var styleProperties=Polymer.StyleProperties;var StyleCache=Polymer.StyleCache;var nativeVariables=Polymer.Settings.useNativeCSSProperties;var api={_styles:[],_properties:null,customStyle:{},_styleCache:new StyleCache(),_element:Polymer.DomApi.wrap(document.documentElement),addStyle:function(style){this._styles.push(style);this._properties=null;},get _styleProperties(){if(!this._properties){styleProperties.decorateStyles(this._styles,this);this._styles._scopeStyleProperties=null;this._properties=styleProperties.hostAndRootPropertiesForScope(this).rootProps;styleProperties.mixinCustomStyle(this._properties,this.customStyle);styleProperties.reify(this._properties);}
-return this._properties;},hasStyleProperties:function(){return Boolean(this._properties);},_needsStyleProperties:function(){},_computeStyleProperties:function(){return this._styleProperties;},updateStyles:function(properties){this._properties=null;if(properties){Polymer.Base.mixin(this.customStyle,properties);}
-this._styleCache.clear();for(var i=0,s;i<this._styles.length;i++){s=this._styles[i];s=s.__importElement||s;s._apply();}
-if(nativeVariables){styleProperties.updateNativeStyleProperties(document.documentElement,this.customStyle);}}};return api;}();(function(){'use strict';var serializeValueToAttribute=Polymer.Base.serializeValueToAttribute;var propertyUtils=Polymer.StyleProperties;var styleTransformer=Polymer.StyleTransformer;var styleDefaults=Polymer.StyleDefaults;var nativeShadow=Polymer.Settings.useNativeShadow;var nativeVariables=Polymer.Settings.useNativeCSSProperties;Polymer.Base._addFeature({_prepStyleProperties:function(){if(!nativeVariables){this._ownStylePropertyNames=this._styles&&this._styles.length?propertyUtils.decorateStyles(this._styles,this):null;}},customStyle:null,getComputedStyleValue:function(property){if(!nativeVariables&&!this._styleProperties){this._computeStyleProperties();}
-return!nativeVariables&&this._styleProperties&&this._styleProperties[property]||getComputedStyle(this).getPropertyValue(property);},_setupStyleProperties:function(){this.customStyle={};this._styleCache=null;this._styleProperties=null;this._scopeSelector=null;this._ownStyleProperties=null;this._customStyle=null;},_needsStyleProperties:function(){return Boolean(!nativeVariables&&this._ownStylePropertyNames&&this._ownStylePropertyNames.length);},_validateApplyShim:function(){if(this.__applyShimInvalid){Polymer.ApplyShim.transform(this._styles,this.__proto__);var cssText=styleTransformer.elementStyles(this);if(nativeShadow){var templateStyle=this._template.content.querySelector('style');if(templateStyle){templateStyle.textContent=cssText;}}else{var shadyStyle=this._scopeStyle&&this._scopeStyle.nextSibling;if(shadyStyle){shadyStyle.textContent=cssText;}}}},_beforeAttached:function(){if((!this._scopeSelector||this.__stylePropertiesInvalid)&&this._needsStyleProperties()){this.__stylePropertiesInvalid=false;this._updateStyleProperties();}},_findStyleHost:function(){var e=this,root;while(root=Polymer.dom(e).getOwnerRoot()){if(Polymer.isInstance(root.host)){return root.host;}
-e=root.host;}
-return styleDefaults;},_updateStyleProperties:function(){var info,scope=this._findStyleHost();if(!scope._styleProperties){scope._computeStyleProperties();}
-if(!scope._styleCache){scope._styleCache=new Polymer.StyleCache();}
-var scopeData=propertyUtils.propertyDataFromStyles(scope._styles,this);var scopeCacheable=!this.__notStyleScopeCacheable;if(scopeCacheable){scopeData.key.customStyle=this.customStyle;info=scope._styleCache.retrieve(this.is,scopeData.key,this._styles);}
-var scopeCached=Boolean(info);if(scopeCached){this._styleProperties=info._styleProperties;}else{this._computeStyleProperties(scopeData.properties);}
-this._computeOwnStyleProperties();if(!scopeCached){info=styleCache.retrieve(this.is,this._ownStyleProperties,this._styles);}
-var globalCached=Boolean(info)&&!scopeCached;var style=this._applyStyleProperties(info);if(!scopeCached){style=style&&nativeShadow?style.cloneNode(true):style;info={style:style,_scopeSelector:this._scopeSelector,_styleProperties:this._styleProperties};if(scopeCacheable){scopeData.key.customStyle={};this.mixin(scopeData.key.customStyle,this.customStyle);scope._styleCache.store(this.is,info,scopeData.key,this._styles);}
-if(!globalCached){styleCache.store(this.is,Object.create(info),this._ownStyleProperties,this._styles);}}},_computeStyleProperties:function(scopeProps){var scope=this._findStyleHost();if(!scope._styleProperties){scope._computeStyleProperties();}
-var props=Object.create(scope._styleProperties);var hostAndRootProps=propertyUtils.hostAndRootPropertiesForScope(this);this.mixin(props,hostAndRootProps.hostProps);scopeProps=scopeProps||propertyUtils.propertyDataFromStyles(scope._styles,this).properties;this.mixin(props,scopeProps);this.mixin(props,hostAndRootProps.rootProps);propertyUtils.mixinCustomStyle(props,this.customStyle);propertyUtils.reify(props);this._styleProperties=props;},_computeOwnStyleProperties:function(){var props={};for(var i=0,n;i<this._ownStylePropertyNames.length;i++){n=this._ownStylePropertyNames[i];props[n]=this._styleProperties[n];}
-this._ownStyleProperties=props;},_scopeCount:0,_applyStyleProperties:function(info){var oldScopeSelector=this._scopeSelector;this._scopeSelector=info?info._scopeSelector:this.is+'-'+this.__proto__._scopeCount++;var style=propertyUtils.applyElementStyle(this,this._styleProperties,this._scopeSelector,info&&info.style);if(!nativeShadow){propertyUtils.applyElementScopeSelector(this,this._scopeSelector,oldScopeSelector,this._scopeCssViaAttr);}
-return style;},serializeValueToAttribute:function(value,attribute,node){node=node||this;if(attribute==='class'&&!nativeShadow){var host=node===this?this.domHost||this.dataHost:this;if(host){value=host._scopeElementClass(node,value);}}
-node=this.shadyRoot&&this.shadyRoot._hasDistributed?Polymer.dom(node):node;serializeValueToAttribute.call(this,value,attribute,node);},_scopeElementClass:function(element,selector){if(!nativeShadow&&!this._scopeCssViaAttr){selector=(selector?selector+' ':'')+SCOPE_NAME+' '+this.is+(element._scopeSelector?' '+XSCOPE_NAME+' '+element._scopeSelector:'');}
-return selector;},updateStyles:function(properties){if(properties){this.mixin(this.customStyle,properties);}
-if(nativeVariables){propertyUtils.updateNativeStyleProperties(this,this.customStyle);}else{if(this.isAttached){if(this._needsStyleProperties()){this._updateStyleProperties();}else{this._styleProperties=null;}}else{this.__stylePropertiesInvalid=true;}
-if(this._styleCache){this._styleCache.clear();}
-this._updateRootStyles();}},_updateRootStyles:function(root){root=root||this.root;var c$=Polymer.dom(root)._query(function(e){return e.shadyRoot||e.shadowRoot;});for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){if(c.updateStyles){c.updateStyles();}}}});Polymer.updateStyles=function(properties){styleDefaults.updateStyles(properties);Polymer.Base._updateRootStyles(document);};var styleCache=new Polymer.StyleCache();Polymer.customStyleCache=styleCache;var SCOPE_NAME=styleTransformer.SCOPE_NAME;var XSCOPE_NAME=propertyUtils.XSCOPE_NAME;}());Polymer.Base._addFeature({_registerFeatures:function(){this._prepIs();if(this.factoryImpl){this._prepConstructor();}
-this._prepStyles();},_finishRegisterFeatures:function(){this._prepTemplate();this._prepShimStyles();this._prepAnnotations();this._prepEffects();this._prepBehaviors();this._prepPropertyInfo();this._prepBindings();this._prepShady();},_prepBehavior:function(b){this._addPropertyEffects(b.properties);this._addComplexObserverEffects(b.observers);this._addHostAttributes(b.hostAttributes);},_initFeatures:function(){this._setupGestures();this._setupConfigure(this.__data__);this._setupStyleProperties();this._setupDebouncers();this._setupShady();this._registerHost();if(this._template){this._validateApplyShim();this._poolContent();this._beginHosting();this._stampTemplate();this._endHosting();this._marshalAnnotationReferences();}
-this._marshalInstanceEffects();this._marshalBehaviors();this._marshalHostAttributes();this._marshalAttributes();this._tryReady();},_marshalBehavior:function(b){if(b.listeners){this._listenListeners(b.listeners);}}});(function(){var propertyUtils=Polymer.StyleProperties;var styleUtil=Polymer.StyleUtil;var cssParse=Polymer.CssParse;var styleDefaults=Polymer.StyleDefaults;var styleTransformer=Polymer.StyleTransformer;var applyShim=Polymer.ApplyShim;var debounce=Polymer.Debounce;var settings=Polymer.Settings;var updateDebouncer;Polymer({is:'custom-style',extends:'style',_template:null,properties:{include:String},ready:function(){this.__appliedElement=this.__appliedElement||this;this.__cssBuild=styleUtil.getCssBuildType(this);if(this.__appliedElement!==this){this.__appliedElement.__cssBuild=this.__cssBuild;}
-if(this.ownerDocument!==window.document&&this.__appliedElement===this){document.head.appendChild(this);}
-this._tryApply();},attached:function(){this._tryApply();},_tryApply:function(){if(!this._appliesToDocument){if(this.parentNode&&this.parentNode.localName!=='dom-module'){this._appliesToDocument=true;var e=this.__appliedElement;if(!settings.useNativeCSSProperties){this.__needsUpdateStyles=styleDefaults.hasStyleProperties();styleDefaults.addStyle(e);}
-if(e.textContent||this.include){this._apply(true);}else{var self=this;var observer=new MutationObserver(function(){observer.disconnect();self._apply(true);});observer.observe(e,{childList:true});}}}},_updateStyles:function(){Polymer.updateStyles();},_apply:function(initialApply){var e=this.__appliedElement;if(this.include){e.textContent=styleUtil.cssFromModules(this.include,true)+e.textContent;}
-if(!e.textContent){return;}
-var buildType=this.__cssBuild;var targetedBuild=styleUtil.isTargetedBuild(buildType);if(settings.useNativeCSSProperties&&targetedBuild){return;}
-var styleRules=styleUtil.rulesForStyle(e);if(!targetedBuild){styleUtil.forEachRule(styleRules,function(rule){styleTransformer.documentRule(rule);});if(settings.useNativeCSSProperties&&!buildType){applyShim.transform([e]);}}
-if(settings.useNativeCSSProperties){e.textContent=styleUtil.toCssText(styleRules);}else{var self=this;var fn=function fn(){self._flushCustomProperties();};if(initialApply){Polymer.RenderStatus.whenReady(fn);}else{fn();}}},_flushCustomProperties:function(){if(this.__needsUpdateStyles){this.__needsUpdateStyles=false;updateDebouncer=debounce(updateDebouncer,this._updateStyles);}else{this._applyCustomProperties();}},_applyCustomProperties:function(){var element=this.__appliedElement;this._computeStyleProperties();var props=this._styleProperties;var rules=styleUtil.rulesForStyle(element);if(!rules){return;}
-element.textContent=styleUtil.toCssText(rules,function(rule){var css=rule.cssText=rule.parsedCssText;if(rule.propertyInfo&&rule.propertyInfo.cssText){css=cssParse.removeCustomPropAssignment(css);rule.cssText=propertyUtils.valueForProperties(css,props);}});}});}());Polymer.Templatizer={properties:{__hideTemplateChildren__:{observer:'_showHideChildren'}},_instanceProps:Polymer.nob,_parentPropPrefix:'_parent_',templatize:function(template){this._templatized=template;if(!template._content){template._content=template.content;}
-if(template._content._ctor){this.ctor=template._content._ctor;this._prepParentProperties(this.ctor.prototype,template);return;}
-var archetype=Object.create(Polymer.Base);this._customPrepAnnotations(archetype,template);this._prepParentProperties(archetype,template);archetype._prepEffects();this._customPrepEffects(archetype);archetype._prepBehaviors();archetype._prepPropertyInfo();archetype._prepBindings();archetype._notifyPathUp=this._notifyPathUpImpl;archetype._scopeElementClass=this._scopeElementClassImpl;archetype.listen=this._listenImpl;archetype._showHideChildren=this._showHideChildrenImpl;archetype.__setPropertyOrig=this.__setProperty;archetype.__setProperty=this.__setPropertyImpl;var _constructor=this._constructorImpl;var ctor=function TemplateInstance(model,host){_constructor.call(this,model,host);};ctor.prototype=archetype;archetype.constructor=ctor;template._content._ctor=ctor;this.ctor=ctor;},_getRootDataHost:function(){return this.dataHost&&this.dataHost._rootDataHost||this.dataHost;},_showHideChildrenImpl:function(hide){var c=this._children;for(var i=0;i<c.length;i++){var n=c[i];if(Boolean(hide)!=Boolean(n.__hideTemplateChildren__)){if(n.nodeType===Node.TEXT_NODE){if(hide){n.__polymerTextContent__=n.textContent;n.textContent='';}else{n.textContent=n.__polymerTextContent__;}}else if(n.style){if(hide){n.__polymerDisplay__=n.style.display;n.style.display='none';}else{n.style.display=n.__polymerDisplay__;}}}
-n.__hideTemplateChildren__=hide;}},__setPropertyImpl:function(property,value,fromAbove,node){if(node&&node.__hideTemplateChildren__&&property=='textContent'){property='__polymerTextContent__';}
-this.__setPropertyOrig(property,value,fromAbove,node);},_debounceTemplate:function(fn){Polymer.dom.addDebouncer(this.debounce('_debounceTemplate',fn));},_flushTemplates:function(){Polymer.dom.flush();},_customPrepEffects:function(archetype){var parentProps=archetype._parentProps;for(var prop in parentProps){archetype._addPropertyEffect(prop,'function',this._createHostPropEffector(prop));}
-for(prop in this._instanceProps){archetype._addPropertyEffect(prop,'function',this._createInstancePropEffector(prop));}},_customPrepAnnotations:function(archetype,template){var t=archetype._template=document.createElement('template');var c=t._content=template._content;if(!c._notes){var rootDataHost=archetype._rootDataHost;if(rootDataHost){Polymer.Annotations.prepElement=function(){rootDataHost._prepElement();};}
-c._notes=Polymer.Annotations.parseAnnotations(template);Polymer.Annotations.prepElement=null;this._processAnnotations(c._notes);}
-archetype._notes=c._notes;archetype._parentProps=c._parentProps;},_prepParentProperties:function(archetype,template){var parentProps=this._parentProps=archetype._parentProps;if(this._forwardParentProp&&parentProps){var proto=archetype._parentPropProto;var prop;if(!proto){for(prop in this._instanceProps){delete parentProps[prop];}
-proto=archetype._parentPropProto=Object.create(null);if(template!=this){Polymer.Bind.prepareModel(proto);Polymer.Base.prepareModelNotifyPath(proto);}
-for(prop in parentProps){var parentProp=this._parentPropPrefix+prop;var effects=[{kind:'function',effect:this._createForwardPropEffector(prop),fn:Polymer.Bind._functionEffect},{kind:'notify',fn:Polymer.Bind._notifyEffect,effect:{event:Polymer.CaseMap.camelToDashCase(parentProp)+'-changed'}}];proto._propertyEffects=proto._propertyEffects||{};proto._propertyEffects[parentProp]=effects;Polymer.Bind._createAccessors(proto,parentProp,effects);}}
-var self=this;if(template!=this){Polymer.Bind.prepareInstance(template);template._forwardParentProp=function(source,value){self._forwardParentProp(source,value);};}
-this._extendTemplate(template,proto);template._pathEffector=function(path,value,fromAbove){return self._pathEffectorImpl(path,value,fromAbove);};}},_createForwardPropEffector:function(prop){return function(source,value){this._forwardParentProp(prop,value);};},_createHostPropEffector:function(prop){var prefix=this._parentPropPrefix;return function(source,value){this.dataHost._templatized[prefix+prop]=value;};},_createInstancePropEffector:function(prop){return function(source,value,old,fromAbove){if(!fromAbove){this.dataHost._forwardInstanceProp(this,prop,value);}};},_extendTemplate:function(template,proto){var n$=Object.getOwnPropertyNames(proto);if(proto._propertySetter){template._propertySetter=proto._propertySetter;}
-for(var i=0,n;i<n$.length&&(n=n$[i]);i++){var val=template[n];if(val&&n=='_propertyEffects'){var pe=Polymer.Base.mixin({},val);template._propertyEffects=Polymer.Base.mixin(pe,proto._propertyEffects);}else{var pd=Object.getOwnPropertyDescriptor(proto,n);Object.defineProperty(template,n,pd);if(val!==undefined){template._propertySetter(n,val);}}}},_showHideChildren:function(hidden){},_forwardInstancePath:function(inst,path,value){},_forwardInstanceProp:function(inst,prop,value){},_notifyPathUpImpl:function(path,value){var dataHost=this.dataHost;var root=Polymer.Path.root(path);dataHost._forwardInstancePath.call(dataHost,this,path,value);if(root in dataHost._parentProps){dataHost._templatized._notifyPath(dataHost._parentPropPrefix+path,value);}},_pathEffectorImpl:function(path,value,fromAbove){if(this._forwardParentPath){if(path.indexOf(this._parentPropPrefix)===0){var subPath=path.substring(this._parentPropPrefix.length);var model=Polymer.Path.root(subPath);if(model in this._parentProps){this._forwardParentPath(subPath,value);}}}
-Polymer.Base._pathEffector.call(this._templatized,path,value,fromAbove);},_constructorImpl:function(model,host){this._rootDataHost=host._getRootDataHost();this._setupConfigure(model);this._registerHost(host);this._beginHosting();this.root=this.instanceTemplate(this._template);this.root.__noContent=!this._notes._hasContent;this.root.__styleScoped=true;this._endHosting();this._marshalAnnotatedNodes();this._marshalInstanceEffects();this._marshalAnnotatedListeners();var children=[];for(var n=this.root.firstChild;n;n=n.nextSibling){children.push(n);n._templateInstance=this;}
-this._children=children;if(host.__hideTemplateChildren__){this._showHideChildren(true);}
-this._tryReady();},_listenImpl:function(node,eventName,methodName){var model=this;var host=this._rootDataHost;var handler=host._createEventHandler(node,eventName,methodName);var decorated=function(e){e.model=model;handler(e);};host._listen(node,eventName,decorated);},_scopeElementClassImpl:function(node,value){var host=this._rootDataHost;if(host){return host._scopeElementClass(node,value);}
-return value;},stamp:function(model){model=model||{};if(this._parentProps){var templatized=this._templatized;for(var prop in this._parentProps){if(model[prop]===undefined){model[prop]=templatized[this._parentPropPrefix+prop];}}}
-return new this.ctor(model,this);},modelForElement:function(el){var model;while(el){if(model=el._templateInstance){if(model.dataHost!=this){el=model.dataHost;}else{return model;}}else{el=el.parentNode;}}}};Polymer({is:'dom-template',extends:'template',_template:null,behaviors:[Polymer.Templatizer],ready:function(){this.templatize(this);}});Polymer._collections=new WeakMap();Polymer.Collection=function(userArray){Polymer._collections.set(userArray,this);this.userArray=userArray;this.store=userArray.slice();this.initMap();};Polymer.Collection.prototype={constructor:Polymer.Collection,initMap:function(){var omap=this.omap=new WeakMap();var pmap=this.pmap={};var s=this.store;for(var i=0;i<s.length;i++){var item=s[i];if(item&&typeof item=='object'){omap.set(item,i);}else{pmap[item]=i;}}},add:function(item){var key=this.store.push(item)-1;if(item&&typeof item=='object'){this.omap.set(item,key);}else{this.pmap[item]=key;}
-return'#'+key;},removeKey:function(key){if(key=this._parseKey(key)){this._removeFromMap(this.store[key]);delete this.store[key];}},_removeFromMap:function(item){if(item&&typeof item=='object'){this.omap.delete(item);}else{delete this.pmap[item];}},remove:function(item){var key=this.getKey(item);this.removeKey(key);return key;},getKey:function(item){var key;if(item&&typeof item=='object'){key=this.omap.get(item);}else{key=this.pmap[item];}
-if(key!=undefined){return'#'+key;}},getKeys:function(){return Object.keys(this.store).map(function(key){return'#'+key;});},_parseKey:function(key){if(key&&key[0]=='#'){return key.slice(1);}},setItem:function(key,item){if(key=this._parseKey(key)){var old=this.store[key];if(old){this._removeFromMap(old);}
-if(item&&typeof item=='object'){this.omap.set(item,key);}else{this.pmap[item]=key;}
-this.store[key]=item;}},getItem:function(key){if(key=this._parseKey(key)){return this.store[key];}},getItems:function(){var items=[],store=this.store;for(var key in store){items.push(store[key]);}
-return items;},_applySplices:function(splices){var keyMap={},key;for(var i=0,s;i<splices.length&&(s=splices[i]);i++){s.addedKeys=[];for(var j=0;j<s.removed.length;j++){key=this.getKey(s.removed[j]);keyMap[key]=keyMap[key]?null:-1;}
-for(j=0;j<s.addedCount;j++){var item=this.userArray[s.index+j];key=this.getKey(item);key=key===undefined?this.add(item):key;keyMap[key]=keyMap[key]?null:1;s.addedKeys.push(key);}}
-var removed=[];var added=[];for(key in keyMap){if(keyMap[key]<0){this.removeKey(key);removed.push(key);}
-if(keyMap[key]>0){added.push(key);}}
-return[{removed:removed,added:added}];}};Polymer.Collection.get=function(userArray){return Polymer._collections.get(userArray)||new Polymer.Collection(userArray);};Polymer.Collection.applySplices=function(userArray,splices){var coll=Polymer._collections.get(userArray);return coll?coll._applySplices(splices):null;};Polymer({is:'dom-repeat',extends:'template',_template:null,properties:{items:{type:Array},as:{type:String,value:'item'},indexAs:{type:String,value:'index'},sort:{type:Function,observer:'_sortChanged'},filter:{type:Function,observer:'_filterChanged'},observe:{type:String,observer:'_observeChanged'},delay:Number,renderedItemCount:{type:Number,notify:!Polymer.Settings.suppressTemplateNotifications,readOnly:true},initialCount:{type:Number,observer:'_initializeChunking'},targetFramerate:{type:Number,value:20},notifyDomChange:{type:Boolean},_targetFrameTime:{type:Number,computed:'_computeFrameTime(targetFramerate)'}},behaviors:[Polymer.Templatizer],observers:['_itemsChanged(items.*)'],created:function(){this._instances=[];this._pool=[];this._limit=Infinity;var self=this;this._boundRenderChunk=function(){self._renderChunk();};},detached:function(){this.__isDetached=true;for(var i=0;i<this._instances.length;i++){this._detachInstance(i);}},attached:function(){if(this.__isDetached){this.__isDetached=false;var refNode;var parentNode=Polymer.dom(this).parentNode;if(parentNode.localName==this.is){refNode=parentNode;parentNode=Polymer.dom(parentNode).parentNode;}else{refNode=this;}
-var parent=Polymer.dom(parentNode);for(var i=0;i<this._instances.length;i++){this._attachInstance(i,parent,refNode);}}},ready:function(){this._instanceProps={__key__:true};this._instanceProps[this.as]=true;this._instanceProps[this.indexAs]=true;if(!this.ctor){this.templatize(this);}},_sortChanged:function(sort){var dataHost=this._getRootDataHost();this._sortFn=sort&&(typeof sort=='function'?sort:function(){return dataHost[sort].apply(dataHost,arguments);});this._needFullRefresh=true;if(this.items){this._debounceTemplate(this._render);}},_filterChanged:function(filter){var dataHost=this._getRootDataHost();this._filterFn=filter&&(typeof filter=='function'?filter:function(){return dataHost[filter].apply(dataHost,arguments);});this._needFullRefresh=true;if(this.items){this._debounceTemplate(this._render);}},_computeFrameTime:function(rate){return Math.ceil(1000/rate);},_initializeChunking:function(){if(this.initialCount){this._limit=this.initialCount;this._chunkCount=this.initialCount;this._lastChunkTime=performance.now();}},_tryRenderChunk:function(){if(this.items&&this._limit<this.items.length){this.debounce('renderChunk',this._requestRenderChunk);}},_requestRenderChunk:function(){requestAnimationFrame(this._boundRenderChunk);},_renderChunk:function(){var currChunkTime=performance.now();var ratio=this._targetFrameTime/(currChunkTime-this._lastChunkTime);this._chunkCount=Math.round(this._chunkCount*ratio)||1;this._limit+=this._chunkCount;this._lastChunkTime=currChunkTime;this._debounceTemplate(this._render);},_observeChanged:function(){this._observePaths=this.observe&&this.observe.replace('.*','.').split(' ');},_itemsChanged:function(change){if(change.path=='items'){if(Array.isArray(this.items)){this.collection=Polymer.Collection.get(this.items);}else if(!this.items){this.collection=null;}else{this._error(this._logf('dom-repeat','expected array for `items`,'+' found',this.items));}
-this._keySplices=[];this._indexSplices=[];this._needFullRefresh=true;this._initializeChunking();this._debounceTemplate(this._render);}else if(change.path=='items.splices'){this._keySplices=this._keySplices.concat(change.value.keySplices);this._indexSplices=this._indexSplices.concat(change.value.indexSplices);this._debounceTemplate(this._render);}else{var subpath=change.path.slice(6);this._forwardItemPath(subpath,change.value);this._checkObservedPaths(subpath);}},_checkObservedPaths:function(path){if(this._observePaths){path=path.substring(path.indexOf('.')+1);var paths=this._observePaths;for(var i=0;i<paths.length;i++){if(path.indexOf(paths[i])===0){this._needFullRefresh=true;if(this.delay){this.debounce('render',this._render,this.delay);}else{this._debounceTemplate(this._render);}
-return;}}}},render:function(){this._needFullRefresh=true;this._debounceTemplate(this._render);this._flushTemplates();},_render:function(){if(this._needFullRefresh){this._applyFullRefresh();this._needFullRefresh=false;}else if(this._keySplices.length){if(this._sortFn){this._applySplicesUserSort(this._keySplices);}else{if(this._filterFn){this._applyFullRefresh();}else{this._applySplicesArrayOrder(this._indexSplices);}}}else{}
-this._keySplices=[];this._indexSplices=[];var keyToIdx=this._keyToInstIdx={};for(var i=this._instances.length-1;i>=0;i--){var inst=this._instances[i];if(inst.isPlaceholder&&i<this._limit){inst=this._insertInstance(i,inst.__key__);}else if(!inst.isPlaceholder&&i>=this._limit){inst=this._downgradeInstance(i,inst.__key__);}
-keyToIdx[inst.__key__]=i;if(!inst.isPlaceholder){inst.__setProperty(this.indexAs,i,true);}}
-this._pool.length=0;this._setRenderedItemCount(this._instances.length);if(!Polymer.Settings.suppressTemplateNotifications||this.notifyDomChange){this.fire('dom-change');}
-this._tryRenderChunk();},_applyFullRefresh:function(){var c=this.collection;var keys;if(this._sortFn){keys=c?c.getKeys():[];}else{keys=[];var items=this.items;if(items){for(var i=0;i<items.length;i++){keys.push(c.getKey(items[i]));}}}
-var self=this;if(this._filterFn){keys=keys.filter(function(a){return self._filterFn(c.getItem(a));});}
-if(this._sortFn){keys.sort(function(a,b){return self._sortFn(c.getItem(a),c.getItem(b));});}
-for(i=0;i<keys.length;i++){var key=keys[i];var inst=this._instances[i];if(inst){inst.__key__=key;if(!inst.isPlaceholder&&i<this._limit){inst.__setProperty(this.as,c.getItem(key),true);}}else if(i<this._limit){this._insertInstance(i,key);}else{this._insertPlaceholder(i,key);}}
-for(var j=this._instances.length-1;j>=i;j--){this._detachAndRemoveInstance(j);}},_numericSort:function(a,b){return a-b;},_applySplicesUserSort:function(splices){var c=this.collection;var keyMap={};var key;for(var i=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0;j<s.removed.length;j++){key=s.removed[j];keyMap[key]=keyMap[key]?null:-1;}
-for(j=0;j<s.added.length;j++){key=s.added[j];keyMap[key]=keyMap[key]?null:1;}}
-var removedIdxs=[];var addedKeys=[];for(key in keyMap){if(keyMap[key]===-1){removedIdxs.push(this._keyToInstIdx[key]);}
-if(keyMap[key]===1){addedKeys.push(key);}}
-if(removedIdxs.length){removedIdxs.sort(this._numericSort);for(i=removedIdxs.length-1;i>=0;i--){var idx=removedIdxs[i];if(idx!==undefined){this._detachAndRemoveInstance(idx);}}}
-var self=this;if(addedKeys.length){if(this._filterFn){addedKeys=addedKeys.filter(function(a){return self._filterFn(c.getItem(a));});}
-addedKeys.sort(function(a,b){return self._sortFn(c.getItem(a),c.getItem(b));});var start=0;for(i=0;i<addedKeys.length;i++){start=this._insertRowUserSort(start,addedKeys[i]);}}},_insertRowUserSort:function(start,key){var c=this.collection;var item=c.getItem(key);var end=this._instances.length-1;var idx=-1;while(start<=end){var mid=start+end>>1;var midKey=this._instances[mid].__key__;var cmp=this._sortFn(c.getItem(midKey),item);if(cmp<0){start=mid+1;}else if(cmp>0){end=mid-1;}else{idx=mid;break;}}
-if(idx<0){idx=end+1;}
-this._insertPlaceholder(idx,key);return idx;},_applySplicesArrayOrder:function(splices){for(var i=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0;j<s.removed.length;j++){this._detachAndRemoveInstance(s.index);}
-for(j=0;j<s.addedKeys.length;j++){this._insertPlaceholder(s.index+j,s.addedKeys[j]);}}},_detachInstance:function(idx){var inst=this._instances[idx];if(!inst.isPlaceholder){for(var i=0;i<inst._children.length;i++){var el=inst._children[i];Polymer.dom(inst.root).appendChild(el);}
-return inst;}},_attachInstance:function(idx,parent,refNode){var inst=this._instances[idx];if(!inst.isPlaceholder){parent.insertBefore(inst.root,refNode);}},_detachAndRemoveInstance:function(idx){var inst=this._detachInstance(idx);if(inst){this._pool.push(inst);}
-this._instances.splice(idx,1);},_insertPlaceholder:function(idx,key){this._instances.splice(idx,0,{isPlaceholder:true,__key__:key});},_stampInstance:function(idx,key){var model={__key__:key};model[this.as]=this.collection.getItem(key);model[this.indexAs]=idx;return this.stamp(model);},_insertInstance:function(idx,key){var inst=this._pool.pop();if(inst){inst.__setProperty(this.as,this.collection.getItem(key),true);inst.__setProperty('__key__',key,true);}else{inst=this._stampInstance(idx,key);}
-var beforeRow=this._instances[idx+1];var beforeNode=beforeRow&&!beforeRow.isPlaceholder?beforeRow._children[0]:this;var parentNode=Polymer.dom(this).parentNode;if(parentNode.localName==this.is){if(beforeNode==this){beforeNode=parentNode;}
-parentNode=Polymer.dom(parentNode).parentNode;}
-Polymer.dom(parentNode).insertBefore(inst.root,beforeNode);this._instances[idx]=inst;return inst;},_downgradeInstance:function(idx,key){var inst=this._detachInstance(idx);if(inst){this._pool.push(inst);}
-inst={isPlaceholder:true,__key__:key};this._instances[idx]=inst;return inst;},_showHideChildren:function(hidden){for(var i=0;i<this._instances.length;i++){if(!this._instances[i].isPlaceholder)
-this._instances[i]._showHideChildren(hidden);}},_forwardInstanceProp:function(inst,prop,value){if(prop==this.as){var idx;if(this._sortFn||this._filterFn){idx=this.items.indexOf(this.collection.getItem(inst.__key__));}else{idx=inst[this.indexAs];}
-this.set('items.'+idx,value);}},_forwardInstancePath:function(inst,path,value){if(path.indexOf(this.as+'.')===0){this._notifyPath('items.'+inst.__key__+'.'+path.slice(this.as.length+1),value);}},_forwardParentProp:function(prop,value){var i$=this._instances;for(var i=0,inst;i<i$.length&&(inst=i$[i]);i++){if(!inst.isPlaceholder){inst.__setProperty(prop,value,true);}}},_forwardParentPath:function(path,value){var i$=this._instances;for(var i=0,inst;i<i$.length&&(inst=i$[i]);i++){if(!inst.isPlaceholder){inst._notifyPath(path,value,true);}}},_forwardItemPath:function(path,value){if(this._keyToInstIdx){var dot=path.indexOf('.');var key=path.substring(0,dot<0?path.length:dot);var idx=this._keyToInstIdx[key];var inst=this._instances[idx];if(inst&&!inst.isPlaceholder){if(dot>=0){path=this.as+'.'+path.substring(dot+1);inst._notifyPath(path,value,true);}else{inst.__setProperty(this.as,value,true);}}}},itemForElement:function(el){var instance=this.modelForElement(el);return instance&&instance[this.as];},keyForElement:function(el){var instance=this.modelForElement(el);return instance&&instance.__key__;},indexForElement:function(el){var instance=this.modelForElement(el);return instance&&instance[this.indexAs];}});Polymer({is:'array-selector',_template:null,properties:{items:{type:Array,observer:'clearSelection'},multi:{type:Boolean,value:false,observer:'clearSelection'},selected:{type:Object,notify:true},selectedItem:{type:Object,notify:true},toggle:{type:Boolean,value:false}},clearSelection:function(){if(Array.isArray(this.selected)){for(var i=0;i<this.selected.length;i++){this.unlinkPaths('selected.'+i);}}else{this.unlinkPaths('selected');this.unlinkPaths('selectedItem');}
-if(this.multi){if(!this.selected||this.selected.length){this.selected=[];this._selectedColl=Polymer.Collection.get(this.selected);}}else{this.selected=null;this._selectedColl=null;}
-this.selectedItem=null;},isSelected:function(item){if(this.multi){return this._selectedColl.getKey(item)!==undefined;}else{return this.selected==item;}},deselect:function(item){if(this.multi){if(this.isSelected(item)){var skey=this._selectedColl.getKey(item);this.arrayDelete('selected',item);this.unlinkPaths('selected.'+skey);}}else{this.selected=null;this.selectedItem=null;this.unlinkPaths('selected');this.unlinkPaths('selectedItem');}},select:function(item){var icol=Polymer.Collection.get(this.items);var key=icol.getKey(item);if(this.multi){if(this.isSelected(item)){if(this.toggle){this.deselect(item);}}else{this.push('selected',item);var skey=this._selectedColl.getKey(item);this.linkPaths('selected.'+skey,'items.'+key);}}else{if(this.toggle&&item==this.selected){this.deselect();}else{this.selected=item;this.selectedItem=item;this.linkPaths('selected','items.'+key);this.linkPaths('selectedItem','items.'+key);}}}});Polymer({is:'dom-if',extends:'template',_template:null,properties:{'if':{type:Boolean,value:false,observer:'_queueRender'},restamp:{type:Boolean,value:false,observer:'_queueRender'},notifyDomChange:{type:Boolean}},behaviors:[Polymer.Templatizer],_queueRender:function(){this._debounceTemplate(this._render);},detached:function(){var parentNode=this.parentNode;if(parentNode&&parentNode.localName==this.is){parentNode=Polymer.dom(parentNode).parentNode;}
-if(!parentNode||parentNode.nodeType==Node.DOCUMENT_FRAGMENT_NODE&&(!Polymer.Settings.hasShadow||!(parentNode instanceof ShadowRoot))){this._teardownInstance();}},attached:function(){if(this.if&&this.ctor){this.async(this._ensureInstance);}},render:function(){this._flushTemplates();},_render:function(){if(this.if){if(!this.ctor){this.templatize(this);}
-this._ensureInstance();this._showHideChildren();}else if(this.restamp){this._teardownInstance();}
-if(!this.restamp&&this._instance){this._showHideChildren();}
-if(this.if!=this._lastIf){if(!Polymer.Settings.suppressTemplateNotifications||this.notifyDomChange){this.fire('dom-change');}
-this._lastIf=this.if;}},_ensureInstance:function(){var refNode;var parentNode=Polymer.dom(this).parentNode;if(parentNode&&parentNode.localName==this.is){refNode=parentNode;parentNode=Polymer.dom(parentNode).parentNode;}else{refNode=this;}
-if(parentNode){if(!this._instance){this._instance=this.stamp();var root=this._instance.root;Polymer.dom(parentNode).insertBefore(root,refNode);}else{var c$=this._instance._children;if(c$&&c$.length){var lastChild=Polymer.dom(refNode).previousSibling;if(lastChild!==c$[c$.length-1]){for(var i=0,n;i<c$.length&&(n=c$[i]);i++){Polymer.dom(parentNode).insertBefore(n,refNode);}}}}}},_teardownInstance:function(){if(this._instance){var c$=this._instance._children;if(c$&&c$.length){var parent=Polymer.dom(Polymer.dom(c$[0]).parentNode);for(var i=0,n;i<c$.length&&(n=c$[i]);i++){parent.removeChild(n);}}
-this._instance=null;}},_showHideChildren:function(){var hidden=this.__hideTemplateChildren__||!this.if;if(this._instance){this._instance._showHideChildren(hidden);}},_forwardParentProp:function(prop,value){if(this._instance){this._instance.__setProperty(prop,value,true);}},_forwardParentPath:function(path,value){if(this._instance){this._instance._notifyPath(path,value,true);}}});Polymer({is:'dom-bind',properties:{notifyDomChange:{type:Boolean}},extends:'template',_template:null,created:function(){var self=this;Polymer.RenderStatus.whenReady(function(){if(document.readyState=='loading'){document.addEventListener('DOMContentLoaded',function(){self._markImportsReady();});}else{self._markImportsReady();}});},_ensureReady:function(){if(!this._readied){this._readySelf();}},_markImportsReady:function(){this._importsReady=true;this._ensureReady();},_registerFeatures:function(){this._prepConstructor();},_insertChildren:function(){var refNode;var parentNode=Polymer.dom(this).parentNode;if(parentNode.localName==this.is){refNode=parentNode;parentNode=Polymer.dom(parentNode).parentNode;}else{refNode=this;}
-Polymer.dom(parentNode).insertBefore(this.root,refNode);},_removeChildren:function(){if(this._children){for(var i=0;i<this._children.length;i++){this.root.appendChild(this._children[i]);}}},_initFeatures:function(){},_scopeElementClass:function(element,selector){if(this.dataHost){return this.dataHost._scopeElementClass(element,selector);}else{return selector;}},_configureInstanceProperties:function(){},_prepConfigure:function(){var config={};for(var prop in this._propertyEffects){config[prop]=this[prop];}
-var setupConfigure=this._setupConfigure;this._setupConfigure=function(){setupConfigure.call(this,config);};},attached:function(){if(this._importsReady){this.render();}},detached:function(){this._removeChildren();},render:function(){this._ensureReady();if(!this._children){this._template=this;this._prepAnnotations();this._prepEffects();this._prepBehaviors();this._prepConfigure();this._prepBindings();this._prepPropertyInfo();Polymer.Base._initFeatures.call(this);this._children=Polymer.TreeApi.arrayCopyChildNodes(this.root);}
-this._insertChildren();if(!Polymer.Settings.suppressTemplateNotifications||this.notifyDomChange){this.fire('dom-change');}}});'use strict';if(!window.CustomElements||window.CustomElements.hasNative){if(!Polymer.Settings.useNativeShadow){tr.showPanic('Polymer error','base should use native shadow when possible.');}}'use strict';tr.exportTo('tr.b',function(){function EventTarget(){}
-EventTarget.decorate=function(target){for(const k in EventTarget.prototype){if(k==='decorate')continue;const v=EventTarget.prototype[k];if(typeof v!=='function')continue;target[k]=v;}};EventTarget.prototype={addEventListener(type,handler){if(!this.listeners_){this.listeners_=Object.create(null);}
-if(!(type in this.listeners_)){this.listeners_[type]=[handler];}else{const handlers=this.listeners_[type];if(handlers.indexOf(handler)<0){handlers.push(handler);}}},removeEventListener(type,handler){if(!this.listeners_)return;if(type in this.listeners_){const handlers=this.listeners_[type];const index=handlers.indexOf(handler);if(index>=0){if(handlers.length===1){delete this.listeners_[type];}else{handlers.splice(index,1);}}}},dispatchEvent(event){if(!this.listeners_)return true;event.__defineGetter__('target',()=>this);const realPreventDefault=event.preventDefault;event.preventDefault=function(){realPreventDefault.call(this);this.rawReturnValue=false;};const type=event.type;let prevented=0;if(type in this.listeners_){const handlers=this.listeners_[type].concat();for(let i=0,handler;handler=handlers[i];i++){if(handler.handleEvent){prevented|=handler.handleEvent.call(handler,event)===false;}else{prevented|=handler.call(this,event)===false;}}}
-return!prevented&&event.rawReturnValue;},async dispatchAsync(event){if(!this.listeners_)return true;const listeners=this.listeners_[event.type];if(listeners===undefined)return;await Promise.all(listeners.slice().map(listener=>{if(listener.handleEvent){return listener.handleEvent.call(listener,event);}
-return listener.call(this,event);}));},hasEventListener(type){return(this.listeners_!==undefined&&this.listeners_[type]!==undefined);}};return{EventTarget,};});'use strict';tr.exportTo('tr.b',function(){function RegisteredTypeInfo(constructor,metadata){this.constructor=constructor;this.metadata=metadata;}
-const BASIC_REGISTRY_MODE='BASIC_REGISTRY_MODE';const TYPE_BASED_REGISTRY_MODE='TYPE_BASED_REGISTRY_MODE';const ALL_MODES={BASIC_REGISTRY_MODE:true,TYPE_BASED_REGISTRY_MODE:true};function ExtensionRegistryOptions(mode){if(mode===undefined){throw new Error('Mode is required');}
-if(!ALL_MODES[mode]){throw new Error('Not a mode.');}
-this.mode_=mode;this.defaultMetadata_={};this.defaultConstructor_=undefined;this.defaultTypeInfo_=undefined;this.frozen_=false;}
-ExtensionRegistryOptions.prototype={freeze(){if(this.frozen_){throw new Error('Frozen');}
-this.frozen_=true;},get mode(){return this.mode_;},get defaultMetadata(){return this.defaultMetadata_;},set defaultMetadata(defaultMetadata){if(this.frozen_){throw new Error('Frozen');}
-this.defaultMetadata_=defaultMetadata;this.defaultTypeInfo_=undefined;},get defaultConstructor(){return this.defaultConstructor_;},set defaultConstructor(defaultConstructor){if(this.frozen_){throw new Error('Frozen');}
-this.defaultConstructor_=defaultConstructor;this.defaultTypeInfo_=undefined;},get defaultTypeInfo(){if(this.defaultTypeInfo_===undefined&&this.defaultConstructor_){this.defaultTypeInfo_=new RegisteredTypeInfo(this.defaultConstructor,this.defaultMetadata);}
-return this.defaultTypeInfo_;},validateConstructor(constructor){if(!this.mandatoryBaseClass)return;let curProto=constructor.prototype.__proto__;let ok=false;while(curProto){if(curProto===this.mandatoryBaseClass.prototype){ok=true;break;}
-curProto=curProto.__proto__;}
-if(!ok){throw new Error(constructor+'must be subclass of '+registry);}}};return{BASIC_REGISTRY_MODE,TYPE_BASED_REGISTRY_MODE,ExtensionRegistryOptions,RegisteredTypeInfo,};});'use strict';tr.exportTo('tr.b',function(){let Event;if(tr.isHeadless){function HeadlessEvent(type,opt_bubbles,opt_preventable){this.type=type;this.bubbles=(opt_bubbles!==undefined?!!opt_bubbles:false);this.cancelable=(opt_preventable!==undefined?!!opt_preventable:false);this.defaultPrevented=false;this.cancelBubble=false;}
-HeadlessEvent.prototype={preventDefault(){this.defaultPrevented=true;},stopPropagation(){this.cancelBubble=true;}};Event=HeadlessEvent;}else{function TrEvent(type,opt_bubbles,opt_preventable){const e=tr.doc.createEvent('Event');e.initEvent(type,!!opt_bubbles,!!opt_preventable);e.__proto__=global.Event.prototype;return e;}
-TrEvent.prototype={__proto__:global.Event.prototype};Event=TrEvent;}
-function dispatchSimpleEvent(target,type,opt_bubbles,opt_cancelable,opt_fields){const e=new tr.b.Event(type,opt_bubbles,opt_cancelable);Object.assign(e,opt_fields);return target.dispatchEvent(e);}
-async function dispatchSimpleEventAsync(target,type,opt_fields){const e=new tr.b.Event(type,false,false);Object.assign(e,opt_fields);return await target.dispatchAsync(e);}
-return{Event,dispatchSimpleEvent,dispatchSimpleEventAsync,};});'use strict';tr.exportTo('tr.b',function(){const RegisteredTypeInfo=tr.b.RegisteredTypeInfo;const ExtensionRegistryOptions=tr.b.ExtensionRegistryOptions;function decorateBasicExtensionRegistry(registry,extensionRegistryOptions){const savedStateStack=[];registry.registeredTypeInfos_=[];registry.register=function(constructor,opt_metadata){if(registry.findIndexOfRegisteredConstructor(constructor)!==undefined){throw new Error('Handler already registered for '+constructor);}
-extensionRegistryOptions.validateConstructor(constructor);const metadata={};for(const k in extensionRegistryOptions.defaultMetadata){metadata[k]=extensionRegistryOptions.defaultMetadata[k];}
-if(opt_metadata){for(const k in opt_metadata){metadata[k]=opt_metadata[k];}}
-const typeInfo=new RegisteredTypeInfo(constructor,metadata);let e=new tr.b.Event('will-register');e.typeInfo=typeInfo;registry.dispatchEvent(e);registry.registeredTypeInfos_.push(typeInfo);e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.pushCleanStateBeforeTest=function(){savedStateStack.push(registry.registeredTypeInfos_);registry.registeredTypeInfos_=[];const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.popCleanStateAfterTest=function(){registry.registeredTypeInfos_=savedStateStack[0];savedStateStack.splice(0,1);const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.findIndexOfRegisteredConstructor=function(constructor){for(let i=0;i<registry.registeredTypeInfos_.length;i++){if(registry.registeredTypeInfos_[i].constructor===constructor){return i;}}
-return undefined;};registry.unregister=function(constructor){const foundIndex=registry.findIndexOfRegisteredConstructor(constructor);if(foundIndex===undefined){throw new Error(constructor+' not registered');}
-registry.registeredTypeInfos_.splice(foundIndex,1);const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.getAllRegisteredTypeInfos=function(){return registry.registeredTypeInfos_;};registry.findTypeInfo=function(constructor){const foundIndex=this.findIndexOfRegisteredConstructor(constructor);if(foundIndex!==undefined){return this.registeredTypeInfos_[foundIndex];}
-return undefined;};registry.findTypeInfoMatching=function(predicate,opt_this){opt_this=opt_this?opt_this:undefined;for(let i=0;i<registry.registeredTypeInfos_.length;++i){const typeInfo=registry.registeredTypeInfos_[i];if(predicate.call(opt_this,typeInfo)){return typeInfo;}}
-return extensionRegistryOptions.defaultTypeInfo;};registry.findTypeInfoWithName=function(name){if(typeof(name)!=='string'){throw new Error('Name is not a string.');}
-const typeInfo=registry.findTypeInfoMatching(function(ti){return ti.constructor.name===name;});if(typeInfo)return typeInfo;return undefined;};}
-return{_decorateBasicExtensionRegistry:decorateBasicExtensionRegistry};});'use strict';tr.exportTo('tr.b',function(){const categoryPartsFor={};function getCategoryParts(category){let parts=categoryPartsFor[category];if(parts!==undefined)return parts;parts=category.split(',');categoryPartsFor[category]=parts;return parts;}
-return{getCategoryParts,};});'use strict';tr.exportTo('tr.b',function(){const getCategoryParts=tr.b.getCategoryParts;const RegisteredTypeInfo=tr.b.RegisteredTypeInfo;const ExtensionRegistryOptions=tr.b.ExtensionRegistryOptions;function decorateTypeBasedExtensionRegistry(registry,extensionRegistryOptions){const savedStateStack=[];registry.registeredTypeInfos_=[];registry.categoryPartToTypeInfoMap_=new Map();registry.typeNameToTypeInfoMap_=new Map();registry.register=function(constructor,metadata){extensionRegistryOptions.validateConstructor(constructor);const typeInfo=new RegisteredTypeInfo(constructor,metadata||extensionRegistryOptions.defaultMetadata);typeInfo.typeNames=[];typeInfo.categoryParts=[];if(metadata&&metadata.typeName){typeInfo.typeNames.push(metadata.typeName);}
-if(metadata&&metadata.typeNames){typeInfo.typeNames.push.apply(typeInfo.typeNames,metadata.typeNames);}
-if(metadata&&metadata.categoryParts){typeInfo.categoryParts.push.apply(typeInfo.categoryParts,metadata.categoryParts);}
-if(typeInfo.typeNames.length===0&&typeInfo.categoryParts.length===0){throw new Error('typeName or typeNames must be provided');}
-typeInfo.typeNames.forEach(function(typeName){if(registry.typeNameToTypeInfoMap_.has(typeName)){throw new Error('typeName '+typeName+' already registered');}});typeInfo.categoryParts.forEach(function(categoryPart){if(registry.categoryPartToTypeInfoMap_.has(categoryPart)){throw new Error('categoryPart '+categoryPart+' already registered');}});let e=new tr.b.Event('will-register');e.typeInfo=typeInfo;registry.dispatchEvent(e);typeInfo.typeNames.forEach(function(typeName){registry.typeNameToTypeInfoMap_.set(typeName,typeInfo);});typeInfo.categoryParts.forEach(function(categoryPart){registry.categoryPartToTypeInfoMap_.set(categoryPart,typeInfo);});registry.registeredTypeInfos_.push(typeInfo);e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.pushCleanStateBeforeTest=function(){savedStateStack.push({registeredTypeInfos:registry.registeredTypeInfos_,typeNameToTypeInfoMap:registry.typeNameToTypeInfoMap_,categoryPartToTypeInfoMap:registry.categoryPartToTypeInfoMap_});registry.registeredTypeInfos_=[];registry.typeNameToTypeInfoMap_=new Map();registry.categoryPartToTypeInfoMap_=new Map();const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.popCleanStateAfterTest=function(){const state=savedStateStack[0];savedStateStack.splice(0,1);registry.registeredTypeInfos_=state.registeredTypeInfos;registry.typeNameToTypeInfoMap_=state.typeNameToTypeInfoMap;registry.categoryPartToTypeInfoMap_=state.categoryPartToTypeInfoMap;const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.unregister=function(constructor){let typeInfoIndex=-1;for(let i=0;i<registry.registeredTypeInfos_.length;i++){if(registry.registeredTypeInfos_[i].constructor===constructor){typeInfoIndex=i;break;}}
-if(typeInfoIndex===-1){throw new Error(constructor+' not registered');}
-const typeInfo=registry.registeredTypeInfos_[typeInfoIndex];registry.registeredTypeInfos_.splice(typeInfoIndex,1);typeInfo.typeNames.forEach(function(typeName){registry.typeNameToTypeInfoMap_.delete(typeName);});typeInfo.categoryParts.forEach(function(categoryPart){registry.categoryPartToTypeInfoMap_.delete(categoryPart);});const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.getTypeInfo=function(category,typeName){if(category){const categoryParts=getCategoryParts(category);for(let i=0;i<categoryParts.length;i++){const categoryPart=categoryParts[i];const typeInfo=registry.categoryPartToTypeInfoMap_.get(categoryPart);if(typeInfo!==undefined)return typeInfo;}}
-const typeInfo=registry.typeNameToTypeInfoMap_.get(typeName);if(typeInfo!==undefined)return typeInfo;return extensionRegistryOptions.defaultTypeInfo;};registry.getConstructor=function(category,typeName){const typeInfo=registry.getTypeInfo(category,typeName);if(typeInfo)return typeInfo.constructor;return undefined;};}
-return{_decorateTypeBasedExtensionRegistry:decorateTypeBasedExtensionRegistry};});'use strict';tr.exportTo('tr.b',function(){const URL_REGEX=/^(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b|file:\/\/)([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/;function deepCopy(value){if(!(value instanceof Object)){if(value===undefined||value===null)return value;if(typeof value==='string')return value.substring();if(typeof value==='boolean')return value;if(typeof value==='number')return value;throw new Error('Unrecognized: '+typeof value);}
-const object=value;if(object instanceof Array){const res=new Array(object.length);for(let i=0;i<object.length;i++){res[i]=deepCopy(object[i]);}
-return res;}
-if(object.__proto__!==Object.prototype){throw new Error('Can only clone simple types');}
-const res={};for(const key in object){res[key]=deepCopy(object[key]);}
-return res;}
-function normalizeException(e){if(e===undefined||e===null){return{typeName:'UndefinedError',message:'Unknown: null or undefined exception',stack:'Unknown'};}
-if(typeof(e)==='string'){return{typeName:'StringError',message:e,stack:[e]};}
-let typeName;if(e.name){typeName=e.name;}else if(e.constructor){if(e.constructor.name){typeName=e.constructor.name;}else{typeName='AnonymousError';}}else{typeName='ErrorWithNoConstructor';}
-const msg=e.message?e.message:'Unknown';return{typeName,message:msg,stack:e.stack?e.stack:[msg]};}
-function stackTraceAsString(){return new Error().stack+'';}
-function stackTrace(){let stack=stackTraceAsString();stack=stack.split('\n');return stack.slice(2);}
-function getUsingPath(path,fromDict){const parts=path.split('.');let cur=fromDict;for(let part;parts.length&&(part=parts.shift());){if(!parts.length){return cur[part];}else if(part in cur){cur=cur[part];}else{return undefined;}}
-return undefined;}
-function formatDate(date){return date.toISOString().replace('T',' ').slice(0,19);}
-function numberToJson(n){if(isNaN(n))return'NaN';if(n===Infinity)return'Infinity';if(n===-Infinity)return'-Infinity';return n;}
-function numberFromJson(n){if(n==='NaN'||n===null)return NaN;if(n==='Infinity')return Infinity;if(n==='-Infinity')return-Infinity;return n;}
-function runLengthEncoding(ary){const encodedArray=[];for(const element of ary){if(encodedArray.length===0||encodedArray[encodedArray.length-1].value!==element){encodedArray.push({value:element,count:1,});}else{encodedArray[encodedArray.length-1].count+=1;}}
-return encodedArray;}
-function isUrl(s){return typeof(s)==='string'&&s.match(URL_REGEX)!==null;}
-function getOnlyElement(iterable){const iterator=iterable[Symbol.iterator]();const firstIteration=iterator.next();if(firstIteration.done){throw new Error('getOnlyElement was passed an empty iterable.');}
-const secondIteration=iterator.next();if(!secondIteration.done){throw new Error('getOnlyElement was passed an iterable with multiple elements.');}
-return firstIteration.value;}
-function getFirstElement(iterable){const iterator=iterable[Symbol.iterator]();const result=iterator.next();if(result.done){throw new Error('getFirstElement was passed an empty iterable.');}
-return result.value;}
-function compareArrays(x,y,elementCmp){const minLength=Math.min(x.length,y.length);let i;for(i=0;i<minLength;i++){const tmp=elementCmp(x[i],y[i]);if(tmp)return tmp;}
-if(x.length===y.length)return 0;if(x[i]===undefined)return-1;return 1;}
-function groupIntoMap(ary,callback,opt_this,opt_arrayConstructor){const arrayConstructor=opt_arrayConstructor||Array;const results=new Map();for(const element of ary){const key=callback.call(opt_this,element);let items=results.get(key);if(items===undefined){items=new arrayConstructor();results.set(key,items);}
-items.push(element);}
-return results;}
-function inPlaceFilter(array,predicate,opt_this){opt_this=opt_this||this;let nextPosition=0;for(let i=0;i<array.length;i++){if(!predicate.call(opt_this,array[i],i))continue;if(nextPosition<i){array[nextPosition]=array[i];}
-nextPosition++;}
-if(nextPosition<array.length){array.length=nextPosition;}}
-function invertArrayOfDicts(array,opt_dictGetter,opt_this){opt_this=opt_this||this;const result={};for(let i=0;i<array.length;i++){const item=array[i];if(item===undefined)continue;const dict=opt_dictGetter?opt_dictGetter.call(opt_this,item):item;if(dict===undefined)continue;for(const key in dict){let valueList=result[key];if(valueList===undefined){result[key]=valueList=new Array(array.length);}
-valueList[i]=dict[key];}}
-return result;}
-function setsEqual(a,b){if(!(a instanceof Set)||!(b instanceof Set))return false;if(a.size!==b.size)return false;for(const x of a){if(!b.has(x))return false;}
-return true;}
-function findLowIndexInSortedArray(ary,mapFn,loVal){if(ary.length===0)return 1;let low=0;let high=ary.length-1;let i;let comparison;let hitPos=-1;while(low<=high){i=Math.floor((low+high)/2);comparison=mapFn(ary[i])-loVal;if(comparison<0){low=i+1;continue;}else if(comparison>0){high=i-1;continue;}else{hitPos=i;high=i-1;}}
-return hitPos!==-1?hitPos:low;}
-function findIndexInSortedIntervals(ary,mapLoFn,mapWidthFn,loVal){const first=findLowIndexInSortedArray(ary,mapLoFn,loVal);if(first===0){if(loVal>=mapLoFn(ary[0])&&loVal<mapLoFn(ary[0])+mapWidthFn(ary[0],0)){return 0;}
-return-1;}
-if(first<ary.length){if(loVal>=mapLoFn(ary[first])&&loVal<mapLoFn(ary[first])+mapWidthFn(ary[first],first)){return first;}
-if(loVal>=mapLoFn(ary[first-1])&&loVal<mapLoFn(ary[first-1])+
-mapWidthFn(ary[first-1],first-1)){return first-1;}
-return ary.length;}
-if(first===ary.length){if(loVal>=mapLoFn(ary[first-1])&&loVal<mapLoFn(ary[first-1])+
-mapWidthFn(ary[first-1],first-1)){return first-1;}
-return ary.length;}
-return ary.length;}
-function findIndexInSortedClosedIntervals(ary,mapLoFn,mapHiFn,val){const i=findLowIndexInSortedArray(ary,mapLoFn,val);if(i===0){if(val>=mapLoFn(ary[0],0)&&val<=mapHiFn(ary[0],0)){return 0;}
-return-1;}
-if(i<ary.length){if(val>=mapLoFn(ary[i-1],i-1)&&val<=mapHiFn(ary[i-1],i-1)){return i-1;}
-if(val>=mapLoFn(ary[i],i)&&val<=mapHiFn(ary[i],i)){return i;}
-return ary.length;}
-if(i===ary.length){if(val>=mapLoFn(ary[i-1],i-1)&&val<=mapHiFn(ary[i-1],i-1)){return i-1;}
-return ary.length;}
-return ary.length;}
-function iterateOverIntersectingIntervals(ary,mapLoFn,mapWidthFn,loVal,hiVal,cb){if(ary.length===0)return;if(loVal>hiVal)return;let i=findLowIndexInSortedArray(ary,mapLoFn,loVal);if(i===-1){return;}
-if(i>0){const hi=mapLoFn(ary[i-1])+mapWidthFn(ary[i-1],i-1);if(hi>=loVal){cb(ary[i-1],i-1);}}
-if(i===ary.length){return;}
-for(let n=ary.length;i<n;i++){const lo=mapLoFn(ary[i]);if(lo>=hiVal)break;cb(ary[i],i);}}
-function findClosestElementInSortedArray(ary,mapFn,val,maxDiff){if(ary.length===0)return null;let aftIdx=findLowIndexInSortedArray(ary,mapFn,val);const befIdx=aftIdx>0?aftIdx-1:0;if(aftIdx===ary.length)aftIdx-=1;const befDiff=Math.abs(val-mapFn(ary[befIdx]));const aftDiff=Math.abs(val-mapFn(ary[aftIdx]));if(befDiff>maxDiff&&aftDiff>maxDiff)return null;const idx=befDiff<aftDiff?befIdx:aftIdx;return ary[idx];}
-function findClosestIntervalInSortedIntervals(ary,mapLoFn,mapHiFn,val,maxDiff){if(ary.length===0)return null;let idx=findLowIndexInSortedArray(ary,mapLoFn,val);if(idx>0)idx-=1;const hiInt=ary[idx];let loInt=hiInt;if(val>mapHiFn(hiInt)&&idx+1<ary.length){loInt=ary[idx+1];}
-const loDiff=Math.abs(val-mapLoFn(loInt));const hiDiff=Math.abs(val-mapHiFn(hiInt));if(loDiff>maxDiff&&hiDiff>maxDiff)return null;if(loDiff<hiDiff)return loInt;return hiInt;}
-function findFirstTrueIndexInSortedArray(array,test){let i0=0;let i1=array.length;while(i0<i1){const i=Math.trunc((i0+i1)/2);if(test(array[i])){i1=i;}else{i0=i+1;}}
-return i1;}
-return{compareArrays,deepCopy,findClosestElementInSortedArray,findClosestIntervalInSortedIntervals,findFirstTrueIndexInSortedArray,findIndexInSortedClosedIntervals,findIndexInSortedIntervals,findLowIndexInSortedArray,formatDate,getFirstElement,getOnlyElement,getUsingPath,groupIntoMap,inPlaceFilter,invertArrayOfDicts,isUrl,iterateOverIntersectingIntervals,normalizeException,numberFromJson,numberToJson,runLengthEncoding,setsEqual,stackTrace,stackTraceAsString,};});'use strict';tr.exportTo('tr.b',function(){function decorateExtensionRegistry(registry,registryOptions){if(registry.register){throw new Error('Already has registry');}
-registryOptions.freeze();if(registryOptions.mode===tr.b.BASIC_REGISTRY_MODE){tr.b._decorateBasicExtensionRegistry(registry,registryOptions);}else if(registryOptions.mode===tr.b.TYPE_BASED_REGISTRY_MODE){tr.b._decorateTypeBasedExtensionRegistry(registry,registryOptions);}else{throw new Error('Unrecognized mode');}
-if(registry.addEventListener===undefined){tr.b.EventTarget.decorate(registry);}}
-return{decorateExtensionRegistry,};});'use strict';tr.exportTo('tr.importer',function(){function Importer(){}
-Importer.prototype={__proto__:Object.prototype,get importerName(){return'Importer';},isTraceDataContainer(){return false;},extractSubtraces(){return[];},importClockSyncMarkers(){},importEvents(){},importSampleData(){},finalizeImport(){}};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Importer;tr.b.decorateExtensionRegistry(Importer,options);Importer.findImporterFor=function(eventData){const typeInfo=Importer.findTypeInfoMatching(function(ti){return ti.constructor.canImport(eventData);});if(typeInfo){return typeInfo.constructor;}
-return undefined;};return{Importer,};});'use strict';tr.exportTo('tr.e.importer.gcloud_trace',function(){function GcloudTraceImporter(model,eventData){this.importPriority=2;this.eventData_=eventData;}
-GcloudTraceImporter.canImport=function(eventData){if(typeof(eventData)!=='string'&&!(eventData instanceof String)){return false;}
-const normalizedEventData=eventData.slice(0,20).replace(/\s/g,'');if(normalizedEventData.length<14)return false;return normalizedEventData.slice(0,14)==='{"projectId":"';};GcloudTraceImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'GcloudTraceImporter';},extractSubtraces(){const traceEvents=this.createEventsForTrace();return traceEvents?[traceEvents]:[];},createEventsForTrace(){const events=[];const trace=JSON.parse(this.eventData_);const spanLength=trace.spans.length;for(let i=0;i<spanLength;i++){events.push(this.createEventForSpan(trace.traceId,trace.spans[i]));}
-return{'traceEvents':events};},createEventForSpan(traceId,span){let newArgs={};if(span.labels){newArgs=JSON.parse(JSON.stringify(span.labels));}
-newArgs['Span ID']=span.spanId;newArgs['Start Time']=span.startTime;newArgs['End Time']=span.endTime;if(span.parentSpanId){newArgs['Parent Span ID']=span.parentSpanId;}
-return{name:span.name,args:newArgs,pid:traceId,ts:Date.parse(span.startTime)*1000,dur:(Date.parse(span.endTime)-Date.parse(span.startTime))*1000,cat:'tracespan',tid:traceId,ph:'X'};}};tr.importer.Importer.register(GcloudTraceImporter);return{GcloudTraceImporter,};});'use strict';tr.exportTo('tr.b.math',function(){function convertEventsToRanges(events){return events.map(function(event){return tr.b.math.Range.fromExplicitRange(event.start,event.end);});}
-function mergeRanges(inRanges,mergeThreshold,mergeFunction){const remainingEvents=inRanges.slice();remainingEvents.sort(function(x,y){return x.min-y.min;});if(remainingEvents.length<=1){const merged=[];if(remainingEvents.length===1){merged.push(mergeFunction(remainingEvents));}
-return merged;}
-const mergedEvents=[];let currentMergeBuffer=[];let rightEdge;function beginMerging(){currentMergeBuffer.push(remainingEvents[0]);remainingEvents.splice(0,1);rightEdge=currentMergeBuffer[0].max;}
-function flushCurrentMergeBuffer(){if(currentMergeBuffer.length===0)return;mergedEvents.push(mergeFunction(currentMergeBuffer));currentMergeBuffer=[];if(remainingEvents.length!==0)beginMerging();}
-beginMerging();while(remainingEvents.length){const currentEvent=remainingEvents[0];const distanceFromRightEdge=currentEvent.min-rightEdge;if(distanceFromRightEdge<mergeThreshold){rightEdge=Math.max(rightEdge,currentEvent.max);remainingEvents.splice(0,1);currentMergeBuffer.push(currentEvent);continue;}
-flushCurrentMergeBuffer();}
-flushCurrentMergeBuffer();return mergedEvents;}
-function findEmptyRangesBetweenRanges(inRanges,opt_totalRange){if(opt_totalRange&&opt_totalRange.isEmpty)opt_totalRange=undefined;const emptyRanges=[];if(!inRanges.length){if(opt_totalRange)emptyRanges.push(opt_totalRange);return emptyRanges;}
-inRanges=inRanges.slice();inRanges.sort(function(x,y){return x.min-y.min;});if(opt_totalRange&&(opt_totalRange.min<inRanges[0].min)){emptyRanges.push(tr.b.math.Range.fromExplicitRange(opt_totalRange.min,inRanges[0].min));}
-inRanges.forEach(function(range,index){for(let otherIndex=0;otherIndex<inRanges.length;++otherIndex){if(index===otherIndex)continue;const other=inRanges[otherIndex];if(other.min>range.max){emptyRanges.push(tr.b.math.Range.fromExplicitRange(range.max,other.min));return;}
-if(other.max>range.max){return;}}
-if(opt_totalRange&&(range.max<opt_totalRange.max)){emptyRanges.push(tr.b.math.Range.fromExplicitRange(range.max,opt_totalRange.max));}});return emptyRanges;}
-return{convertEventsToRanges,findEmptyRangesBetweenRanges,mergeRanges,};});!function(t,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define(n);else{var r=n();for(var a in r)("object"==typeof exports?exports:t)[a]=r[a]}}(this,function(){return function(t){function n(a){if(r[a])return r[a].exports;var e=r[a]={exports:{},id:a,loaded:!1};return t[a].call(e.exports,e,e.exports,n),e.loaded=!0,e.exports}var r={};return n.m=t,n.c=r,n.p="",n(0)}([function(t,n,r){n.glMatrix=r(1),n.mat2=r(2),n.mat2d=r(3),n.mat3=r(4),n.mat4=r(5),n.quat=r(6),n.vec2=r(9),n.vec3=r(7),n.vec4=r(8)},function(t,n,r){var a={};a.EPSILON=1e-6,a.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,a.RANDOM=Math.random,a.setMatrixArrayType=function(t){GLMAT_ARRAY_TYPE=t};var e=Math.PI/180;a.toRadian=function(t){return t*e},t.exports=a},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},e.clone=function(t){var n=new a.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},e.transpose=function(t,n){if(t===n){var r=n[1];t[1]=n[2],t[2]=r}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*u-e*a;return o?(o=1/o,t[0]=u*o,t[1]=-a*o,t[2]=-e*o,t[3]=r*o,t):null},e.adjoint=function(t,n){var r=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=r,t},e.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],c=r[1],f=r[2],s=r[3];return t[0]=a*i+u*c,t[1]=e*i+o*c,t[2]=a*f+u*s,t[3]=e*f+o*s,t},e.mul=e.multiply,e.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c+u*i,t[1]=e*c+o*i,t[2]=a*-i+u*c,t[3]=e*-i+o*c,t},e.scale=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],c=r[1];return t[0]=a*i,t[1]=e*i,t[2]=u*c,t[3]=o*c,t},e.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},e.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},e.LDU=function(t,n,r,a){return t[2]=a[2]/a[0],r[0]=a[0],r[1]=a[1],r[3]=a[3]-t[2]*r[1],[t,n,r]},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(6);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=r*u-a*e;return c?(c=1/c,t[0]=u*c,t[1]=-a*c,t[2]=-e*c,t[3]=r*c,t[4]=(e*i-u*o)*c,t[5]=(a*o-r*i)*c,t):null},e.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=r[0],s=r[1],h=r[2],M=r[3],l=r[4],v=r[5];return t[0]=a*f+u*s,t[1]=e*f+o*s,t[2]=a*h+u*M,t[3]=e*h+o*M,t[4]=a*l+u*v+i,t[5]=e*l+o*v+c,t},e.mul=e.multiply,e.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=Math.sin(r),s=Math.cos(r);return t[0]=a*s+u*f,t[1]=e*s+o*f,t[2]=a*-f+u*s,t[3]=e*-f+o*s,t[4]=i,t[5]=c,t},e.scale=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=r[0],s=r[1];return t[0]=a*f,t[1]=e*f,t[2]=u*s,t[3]=o*s,t[4]=i,t[5]=c,t},e.translate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=r[0],s=r[1];return t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=a*f+u*s+i,t[5]=e*f+o*s+c,t},e.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t[4]=0,t[5]=0,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},e.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},e.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat4=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},e.clone=function(t){var n=new a.ARRAY_TYPE(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],e=n[5];t[1]=n[3],t[2]=n[6],t[3]=r,t[5]=n[7],t[6]=a,t[7]=e}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=s*o-i*f,M=-s*u+i*c,l=f*u-o*c,v=r*h+a*M+e*l;return v?(v=1/v,t[0]=h*v,t[1]=(-s*a+e*f)*v,t[2]=(i*a-e*o)*v,t[3]=M*v,t[4]=(s*r-e*c)*v,t[5]=(-i*r+e*u)*v,t[6]=l*v,t[7]=(-f*r+a*c)*v,t[8]=(o*r-a*u)*v,t):null},e.adjoint=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8];return t[0]=o*s-i*f,t[1]=e*f-a*s,t[2]=a*i-e*o,t[3]=i*c-u*s,t[4]=r*s-e*c,t[5]=e*u-r*i,t[6]=u*f-o*c,t[7]=a*c-r*f,t[8]=r*o-a*u,t},e.determinant=function(t){var n=t[0],r=t[1],a=t[2],e=t[3],u=t[4],o=t[5],i=t[6],c=t[7],f=t[8];return n*(f*u-o*c)+r*(-f*e+o*i)+a*(c*e-u*i)},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=r[0],l=r[1],v=r[2],m=r[3],p=r[4],d=r[5],A=r[6],R=r[7],w=r[8];return t[0]=M*a+l*o+v*f,t[1]=M*e+l*i+v*s,t[2]=M*u+l*c+v*h,t[3]=m*a+p*o+d*f,t[4]=m*e+p*i+d*s,t[5]=m*u+p*c+d*h,t[6]=A*a+R*o+w*f,t[7]=A*e+R*i+w*s,t[8]=A*u+R*c+w*h,t},e.mul=e.multiply,e.translate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=r[0],l=r[1];return t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=i,t[5]=c,t[6]=M*a+l*o+f,t[7]=M*e+l*i+s,t[8]=M*u+l*c+h,t},e.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=Math.sin(r),l=Math.cos(r);return t[0]=l*a+M*o,t[1]=l*e+M*i,t[2]=l*u+M*c,t[3]=l*o-M*a,t[4]=l*i-M*e,t[5]=l*c-M*u,t[6]=f,t[7]=s,t[8]=h,t},e.scale=function(t,n,r){var a=r[0],e=r[1];return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=e*n[3],t[4]=e*n[4],t[5]=e*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},e.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},e.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=-r,t[4]=a,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat2d=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},e.fromQuat=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r+r,i=a+a,c=e+e,f=r*o,s=a*o,h=a*i,M=e*o,l=e*i,v=e*c,m=u*o,p=u*i,d=u*c;return t[0]=1-h-v,t[3]=s-d,t[6]=M+p,t[1]=s+d,t[4]=1-f-v,t[7]=l-m,t[2]=M-p,t[5]=l+m,t[8]=1-f-h,t},e.normalFromMat4=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],M=n[10],l=n[11],v=n[12],m=n[13],p=n[14],d=n[15],A=r*i-a*o,R=r*c-e*o,w=r*f-u*o,q=a*c-e*i,Y=a*f-u*i,g=e*f-u*c,y=s*m-h*v,x=s*p-M*v,P=s*d-l*v,E=h*p-M*m,T=h*d-l*m,b=M*d-l*p,D=A*b-R*T+w*E+q*P-Y*x+g*y;return D?(D=1/D,t[0]=(i*b-c*T+f*E)*D,t[1]=(c*P-o*b-f*x)*D,t[2]=(o*T-i*P+f*y)*D,t[3]=(e*T-a*b-u*E)*D,t[4]=(r*b-e*P+u*x)*D,t[5]=(a*P-r*T-u*y)*D,t[6]=(m*g-p*Y+d*q)*D,t[7]=(p*w-v*g-d*R)*D,t[8]=(v*Y-m*w+d*A)*D,t):null},e.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.clone=function(t){var n=new a.ARRAY_TYPE(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],e=n[3],u=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=r,t[6]=n[9],t[7]=n[13],t[8]=a,t[9]=u,t[11]=n[14],t[12]=e,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],M=n[10],l=n[11],v=n[12],m=n[13],p=n[14],d=n[15],A=r*i-a*o,R=r*c-e*o,w=r*f-u*o,q=a*c-e*i,Y=a*f-u*i,g=e*f-u*c,y=s*m-h*v,x=s*p-M*v,P=s*d-l*v,E=h*p-M*m,T=h*d-l*m,b=M*d-l*p,D=A*b-R*T+w*E+q*P-Y*x+g*y;return D?(D=1/D,t[0]=(i*b-c*T+f*E)*D,t[1]=(e*T-a*b-u*E)*D,t[2]=(m*g-p*Y+d*q)*D,t[3]=(M*Y-h*g-l*q)*D,t[4]=(c*P-o*b-f*x)*D,t[5]=(r*b-e*P+u*x)*D,t[6]=(p*w-v*g-d*R)*D,t[7]=(s*g-M*w+l*R)*D,t[8]=(o*T-i*P+f*y)*D,t[9]=(a*P-r*T-u*y)*D,t[10]=(v*Y-m*w+d*A)*D,t[11]=(h*w-s*Y-l*A)*D,t[12]=(i*x-o*E-c*y)*D,t[13]=(r*E-a*x+e*y)*D,t[14]=(m*R-v*q-p*A)*D,t[15]=(s*q-h*R+M*A)*D,t):null},e.adjoint=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],M=n[10],l=n[11],v=n[12],m=n[13],p=n[14],d=n[15];return t[0]=i*(M*d-l*p)-h*(c*d-f*p)+m*(c*l-f*M),t[1]=-(a*(M*d-l*p)-h*(e*d-u*p)+m*(e*l-u*M)),t[2]=a*(c*d-f*p)-i*(e*d-u*p)+m*(e*f-u*c),t[3]=-(a*(c*l-f*M)-i*(e*l-u*M)+h*(e*f-u*c)),t[4]=-(o*(M*d-l*p)-s*(c*d-f*p)+v*(c*l-f*M)),t[5]=r*(M*d-l*p)-s*(e*d-u*p)+v*(e*l-u*M),t[6]=-(r*(c*d-f*p)-o*(e*d-u*p)+v*(e*f-u*c)),t[7]=r*(c*l-f*M)-o*(e*l-u*M)+s*(e*f-u*c),t[8]=o*(h*d-l*m)-s*(i*d-f*m)+v*(i*l-f*h),t[9]=-(r*(h*d-l*m)-s*(a*d-u*m)+v*(a*l-u*h)),t[10]=r*(i*d-f*m)-o*(a*d-u*m)+v*(a*f-u*i),t[11]=-(r*(i*l-f*h)-o*(a*l-u*h)+s*(a*f-u*i)),t[12]=-(o*(h*p-M*m)-s*(i*p-c*m)+v*(i*M-c*h)),t[13]=r*(h*p-M*m)-s*(a*p-e*m)+v*(a*M-e*h),t[14]=-(r*(i*p-c*m)-o*(a*p-e*m)+v*(a*c-e*i)),t[15]=r*(i*M-c*h)-o*(a*M-e*h)+s*(a*c-e*i),t},e.determinant=function(t){var n=t[0],r=t[1],a=t[2],e=t[3],u=t[4],o=t[5],i=t[6],c=t[7],f=t[8],s=t[9],h=t[10],M=t[11],l=t[12],v=t[13],m=t[14],p=t[15],d=n*o-r*u,A=n*i-a*u,R=n*c-e*u,w=r*i-a*o,q=r*c-e*o,Y=a*c-e*i,g=f*v-s*l,y=f*m-h*l,x=f*p-M*l,P=s*m-h*v,E=s*p-M*v,T=h*p-M*m;return d*T-A*E+R*P+w*x-q*y+Y*g},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=n[9],l=n[10],v=n[11],m=n[12],p=n[13],d=n[14],A=n[15],R=r[0],w=r[1],q=r[2],Y=r[3];return t[0]=R*a+w*i+q*h+Y*m,t[1]=R*e+w*c+q*M+Y*p,t[2]=R*u+w*f+q*l+Y*d,t[3]=R*o+w*s+q*v+Y*A,R=r[4],w=r[5],q=r[6],Y=r[7],t[4]=R*a+w*i+q*h+Y*m,t[5]=R*e+w*c+q*M+Y*p,t[6]=R*u+w*f+q*l+Y*d,t[7]=R*o+w*s+q*v+Y*A,R=r[8],w=r[9],q=r[10],Y=r[11],t[8]=R*a+w*i+q*h+Y*m,t[9]=R*e+w*c+q*M+Y*p,t[10]=R*u+w*f+q*l+Y*d,t[11]=R*o+w*s+q*v+Y*A,R=r[12],w=r[13],q=r[14],Y=r[15],t[12]=R*a+w*i+q*h+Y*m,t[13]=R*e+w*c+q*M+Y*p,t[14]=R*u+w*f+q*l+Y*d,t[15]=R*o+w*s+q*v+Y*A,t},e.mul=e.multiply,e.translate=function(t,n,r){var a,e,u,o,i,c,f,s,h,M,l,v,m=r[0],p=r[1],d=r[2];return n===t?(t[12]=n[0]*m+n[4]*p+n[8]*d+n[12],t[13]=n[1]*m+n[5]*p+n[9]*d+n[13],t[14]=n[2]*m+n[6]*p+n[10]*d+n[14],t[15]=n[3]*m+n[7]*p+n[11]*d+n[15]):(a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=n[9],l=n[10],v=n[11],t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=i,t[5]=c,t[6]=f,t[7]=s,t[8]=h,t[9]=M,t[10]=l,t[11]=v,t[12]=a*m+i*p+h*d+n[12],t[13]=e*m+c*p+M*d+n[13],t[14]=u*m+f*p+l*d+n[14],t[15]=o*m+s*p+v*d+n[15]),t},e.scale=function(t,n,r){var a=r[0],e=r[1],u=r[2];return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*e,t[5]=n[5]*e,t[6]=n[6]*e,t[7]=n[7]*e,t[8]=n[8]*u,t[9]=n[9]*u,t[10]=n[10]*u,t[11]=n[11]*u,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},e.rotate=function(t,n,r,e){var u,o,i,c,f,s,h,M,l,v,m,p,d,A,R,w,q,Y,g,y,x,P,E,T,b=e[0],D=e[1],L=e[2],_=Math.sqrt(b*b+D*D+L*L);return Math.abs(_)<a.EPSILON?null:(_=1/_,b*=_,D*=_,L*=_,u=Math.sin(r),o=Math.cos(r),i=1-o,c=n[0],f=n[1],s=n[2],h=n[3],M=n[4],l=n[5],v=n[6],m=n[7],p=n[8],d=n[9],A=n[10],R=n[11],w=b*b*i+o,q=D*b*i+L*u,Y=L*b*i-D*u,g=b*D*i-L*u,y=D*D*i+o,x=L*D*i+b*u,P=b*L*i+D*u,E=D*L*i-b*u,T=L*L*i+o,t[0]=c*w+M*q+p*Y,t[1]=f*w+l*q+d*Y,t[2]=s*w+v*q+A*Y,t[3]=h*w+m*q+R*Y,t[4]=c*g+M*y+p*x,t[5]=f*g+l*y+d*x,t[6]=s*g+v*y+A*x,t[7]=h*g+m*y+R*x,t[8]=c*P+M*E+p*T,t[9]=f*P+l*E+d*T,t[10]=s*P+v*E+A*T,t[11]=h*P+m*E+R*T,n!==t&&(t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t)},e.rotateX=function(t,n,r){var a=Math.sin(r),e=Math.cos(r),u=n[4],o=n[5],i=n[6],c=n[7],f=n[8],s=n[9],h=n[10],M=n[11];return n!==t&&(t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[4]=u*e+f*a,t[5]=o*e+s*a,t[6]=i*e+h*a,t[7]=c*e+M*a,t[8]=f*e-u*a,t[9]=s*e-o*a,t[10]=h*e-i*a,t[11]=M*e-c*a,t},e.rotateY=function(t,n,r){var a=Math.sin(r),e=Math.cos(r),u=n[0],o=n[1],i=n[2],c=n[3],f=n[8],s=n[9],h=n[10],M=n[11];return n!==t&&(t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=u*e-f*a,t[1]=o*e-s*a,t[2]=i*e-h*a,t[3]=c*e-M*a,t[8]=u*a+f*e,t[9]=o*a+s*e,t[10]=i*a+h*e,t[11]=c*a+M*e,t},e.rotateZ=function(t,n,r){var a=Math.sin(r),e=Math.cos(r),u=n[0],o=n[1],i=n[2],c=n[3],f=n[4],s=n[5],h=n[6],M=n[7];return n!==t&&(t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=u*e+f*a,t[1]=o*e+s*a,t[2]=i*e+h*a,t[3]=c*e+M*a,t[4]=f*e-u*a,t[5]=s*e-o*a,t[6]=h*e-i*a,t[7]=M*e-c*a,t},e.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=n[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromRotation=function(t,n,r){var e,u,o,i=r[0],c=r[1],f=r[2],s=Math.sqrt(i*i+c*c+f*f);return Math.abs(s)<a.EPSILON?null:(s=1/s,i*=s,c*=s,f*=s,e=Math.sin(n),u=Math.cos(n),o=1-u,t[0]=i*i*o+u,t[1]=c*i*o+f*e,t[2]=f*i*o-c*e,t[3]=0,t[4]=i*c*o-f*e,t[5]=c*c*o+u,t[6]=f*c*o+i*e,t[7]=0,t[8]=i*f*o+c*e,t[9]=c*f*o-i*e,t[10]=f*f*o+u,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},e.fromXRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromYRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromZRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromRotationTranslation=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=a+a,c=e+e,f=u+u,s=a*i,h=a*c,M=a*f,l=e*c,v=e*f,m=u*f,p=o*i,d=o*c,A=o*f;return t[0]=1-(l+m),t[1]=h+A,t[2]=M-d,t[3]=0,t[4]=h-A,t[5]=1-(s+m),t[6]=v+p,t[7]=0,t[8]=M+d,t[9]=v-p,t[10]=1-(s+l),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},e.fromRotationTranslationScale=function(t,n,r,a){var e=n[0],u=n[1],o=n[2],i=n[3],c=e+e,f=u+u,s=o+o,h=e*c,M=e*f,l=e*s,v=u*f,m=u*s,p=o*s,d=i*c,A=i*f,R=i*s,w=a[0],q=a[1],Y=a[2];return t[0]=(1-(v+p))*w,t[1]=(M+R)*w,t[2]=(l-A)*w,t[3]=0,t[4]=(M-R)*q,t[5]=(1-(h+p))*q,t[6]=(m+d)*q,t[7]=0,t[8]=(l+A)*Y,t[9]=(m-d)*Y,t[10]=(1-(h+v))*Y,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},e.fromRotationTranslationScaleOrigin=function(t,n,r,a,e){var u=n[0],o=n[1],i=n[2],c=n[3],f=u+u,s=o+o,h=i+i,M=u*f,l=u*s,v=u*h,m=o*s,p=o*h,d=i*h,A=c*f,R=c*s,w=c*h,q=a[0],Y=a[1],g=a[2],y=e[0],x=e[1],P=e[2];return t[0]=(1-(m+d))*q,t[1]=(l+w)*q,t[2]=(v-R)*q,t[3]=0,t[4]=(l-w)*Y,t[5]=(1-(M+d))*Y,t[6]=(p+A)*Y,t[7]=0,t[8]=(v+R)*g,t[9]=(p-A)*g,t[10]=(1-(M+m))*g,t[11]=0,t[12]=r[0]+y-(t[0]*y+t[4]*x+t[8]*P),t[13]=r[1]+x-(t[1]*y+t[5]*x+t[9]*P),t[14]=r[2]+P-(t[2]*y+t[6]*x+t[10]*P),t[15]=1,t},e.fromQuat=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r+r,i=a+a,c=e+e,f=r*o,s=a*o,h=a*i,M=e*o,l=e*i,v=e*c,m=u*o,p=u*i,d=u*c;return t[0]=1-h-v,t[1]=s+d,t[2]=M-p,t[3]=0,t[4]=s-d,t[5]=1-f-v,t[6]=l+m,t[7]=0,t[8]=M+p,t[9]=l-m,t[10]=1-f-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.frustum=function(t,n,r,a,e,u,o){var i=1/(r-n),c=1/(e-a),f=1/(u-o);return t[0]=2*u*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*u*c,t[6]=0,t[7]=0,t[8]=(r+n)*i,t[9]=(e+a)*c,t[10]=(o+u)*f,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*u*2*f,t[15]=0,t},e.perspective=function(t,n,r,a,e){var u=1/Math.tan(n/2),o=1/(a-e);return t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(e+a)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*e*a*o,t[15]=0,t},e.perspectiveFromFieldOfView=function(t,n,r,a){var e=Math.tan(n.upDegrees*Math.PI/180),u=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),c=2/(o+i),f=2/(e+u);return t[0]=c,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=f,t[6]=0,t[7]=0,t[8]=-((o-i)*c*.5),t[9]=(e-u)*f*.5,t[10]=a/(r-a),t[11]=-1,t[12]=0,t[13]=0,t[14]=a*r/(r-a),t[15]=0,t},e.ortho=function(t,n,r,a,e,u,o){var i=1/(n-r),c=1/(a-e),f=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*f,t[11]=0,t[12]=(n+r)*i,t[13]=(e+a)*c,t[14]=(o+u)*f,t[15]=1,t},e.lookAt=function(t,n,r,u){var o,i,c,f,s,h,M,l,v,m,p=n[0],d=n[1],A=n[2],R=u[0],w=u[1],q=u[2],Y=r[0],g=r[1],y=r[2];return Math.abs(p-Y)<a.EPSILON&&Math.abs(d-g)<a.EPSILON&&Math.abs(A-y)<a.EPSILON?e.identity(t):(M=p-Y,l=d-g,v=A-y,m=1/Math.sqrt(M*M+l*l+v*v),M*=m,l*=m,v*=m,o=w*v-q*l,i=q*M-R*v,c=R*l-w*M,m=Math.sqrt(o*o+i*i+c*c),m?(m=1/m,o*=m,i*=m,c*=m):(o=0,i=0,c=0),f=l*c-v*i,s=v*o-M*c,h=M*i-l*o,m=Math.sqrt(f*f+s*s+h*h),m?(m=1/m,f*=m,s*=m,h*=m):(f=0,s=0,h=0),t[0]=o,t[1]=f,t[2]=M,t[3]=0,t[4]=i,t[5]=s,t[6]=l,t[7]=0,t[8]=c,t[9]=h,t[10]=v,t[11]=0,t[12]=-(o*p+i*d+c*A),t[13]=-(f*p+s*d+h*A),t[14]=-(M*p+l*d+v*A),t[15]=1,t)},e.str=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},t.exports=e},function(t,n,r){var a=r(1),e=r(4),u=r(7),o=r(8),i={};i.create=function(){var t=new a.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},i.rotationTo=function(){var t=u.create(),n=u.fromValues(1,0,0),r=u.fromValues(0,1,0);return function(a,e,o){var c=u.dot(e,o);return-.999999>c?(u.cross(t,n,e),u.length(t)<1e-6&&u.cross(t,r,e),u.normalize(t,t),i.setAxisAngle(a,t,Math.PI),a):c>.999999?(a[0]=0,a[1]=0,a[2]=0,a[3]=1,a):(u.cross(t,e,o),a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=1+c,i.normalize(a,a))}}(),i.setAxes=function(){var t=e.create();return function(n,r,a,e){return t[0]=a[0],t[3]=a[1],t[6]=a[2],t[1]=e[0],t[4]=e[1],t[7]=e[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],i.normalize(n,i.fromMat3(n,t))}}(),i.clone=o.clone,i.fromValues=o.fromValues,i.copy=o.copy,i.set=o.set,i.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},i.setAxisAngle=function(t,n,r){r=.5*r;var a=Math.sin(r);return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=Math.cos(r),t},i.add=o.add,i.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],c=r[1],f=r[2],s=r[3];return t[0]=a*s+o*i+e*f-u*c,t[1]=e*s+o*c+u*i-a*f,t[2]=u*s+o*f+a*c-e*i,t[3]=o*s-a*i-e*c-u*f,t},i.mul=i.multiply,i.scale=o.scale,i.rotateX=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c+o*i,t[1]=e*c+u*i,t[2]=u*c-e*i,t[3]=o*c-a*i,t},i.rotateY=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c-u*i,t[1]=e*c+o*i,t[2]=u*c+a*i,t[3]=o*c-e*i,t},i.rotateZ=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c+e*i,t[1]=e*c-a*i,t[2]=u*c+o*i,t[3]=o*c-u*i,t},i.calculateW=function(t,n){var r=n[0],a=n[1],e=n[2];return t[0]=r,t[1]=a,t[2]=e,t[3]=Math.sqrt(Math.abs(1-r*r-a*a-e*e)),t},i.dot=o.dot,i.lerp=o.lerp,i.slerp=function(t,n,r,a){var e,u,o,i,c,f=n[0],s=n[1],h=n[2],M=n[3],l=r[0],v=r[1],m=r[2],p=r[3];return u=f*l+s*v+h*m+M*p,0>u&&(u=-u,l=-l,v=-v,m=-m,p=-p),1-u>1e-6?(e=Math.acos(u),o=Math.sin(e),i=Math.sin((1-a)*e)/o,c=Math.sin(a*e)/o):(i=1-a,c=a),t[0]=i*f+c*l,t[1]=i*s+c*v,t[2]=i*h+c*m,t[3]=i*M+c*p,t},i.sqlerp=function(){var t=i.create(),n=i.create();return function(r,a,e,u,o,c){return i.slerp(t,a,o,c),i.slerp(n,e,u,c),i.slerp(r,t,n,2*c*(1-c)),r}}(),i.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*r+a*a+e*e+u*u,i=o?1/o:0;return t[0]=-r*i,t[1]=-a*i,t[2]=-e*i,t[3]=u*i,t},i.conjugate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},i.length=o.length,i.len=i.length,i.squaredLength=o.squaredLength,i.sqrLen=i.squaredLength,i.normalize=o.normalize,i.fromMat3=function(t,n){var r,a=n[0]+n[4]+n[8];if(a>0)r=Math.sqrt(a+1),t[3]=.5*r,r=.5/r,t[0]=(n[5]-n[7])*r,t[1]=(n[6]-n[2])*r,t[2]=(n[1]-n[3])*r;else{var e=0;n[4]>n[0]&&(e=1),n[8]>n[3*e+e]&&(e=2);var u=(e+1)%3,o=(e+2)%3;r=Math.sqrt(n[3*e+e]-n[3*u+u]-n[3*o+o]+1),t[e]=.5*r,r=.5/r,t[3]=(n[3*u+o]-n[3*o+u])*r,t[u]=(n[3*u+e]+n[3*e+u])*r,t[o]=(n[3*o+e]+n[3*e+o])*r}return t},i.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},t.exports=i},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(3);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},e.fromValues=function(t,n,r){var e=new a.ARRAY_TYPE(3);return e[0]=t,e[1]=n,e[2]=r,e},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},e.set=function(t,n,r,a){return t[0]=n,t[1]=r,t[2]=a,t},e.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t},e.subtract=function(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t},e.sub=e.subtract,e.multiply=function(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t},e.mul=e.multiply,e.divide=function(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t},e.div=e.divide,e.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t[2]=Math.min(n[2],r[2]),t},e.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t[2]=Math.max(n[2],r[2]),t},e.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t},e.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t},e.distance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2];return Math.sqrt(r*r+a*a+e*e)},e.dist=e.distance,e.squaredDistance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2];return r*r+a*a+e*e},e.sqrDist=e.squaredDistance,e.length=function(t){var n=t[0],r=t[1],a=t[2];return Math.sqrt(n*n+r*r+a*a)},e.len=e.length,e.squaredLength=function(t){var n=t[0],r=t[1],a=t[2];return n*n+r*r+a*a},e.sqrLen=e.squaredLength,e.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t},e.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t},e.normalize=function(t,n){var r=n[0],a=n[1],e=n[2],u=r*r+a*a+e*e;return u>0&&(u=1/Math.sqrt(u),t[0]=n[0]*u,t[1]=n[1]*u,t[2]=n[2]*u),t},e.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]},e.cross=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],c=r[2];return t[0]=e*c-u*i,t[1]=u*o-a*c,t[2]=a*i-e*o,t},e.lerp=function(t,n,r,a){var e=n[0],u=n[1],o=n[2];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t[2]=o+a*(r[2]-o),t},e.hermite=function(t,n,r,a,e,u){var o=u*u,i=o*(2*u-3)+1,c=o*(u-2)+u,f=o*(u-1),s=o*(3-2*u);return t[0]=n[0]*i+r[0]*c+a[0]*f+e[0]*s,t[1]=n[1]*i+r[1]*c+a[1]*f+e[1]*s,t[2]=n[2]*i+r[2]*c+a[2]*f+e[2]*s,t},e.bezier=function(t,n,r,a,e,u){var o=1-u,i=o*o,c=u*u,f=i*o,s=3*u*i,h=3*c*o,M=c*u;return t[0]=n[0]*f+r[0]*s+a[0]*h+e[0]*M,t[1]=n[1]*f+r[1]*s+a[1]*h+e[1]*M,t[2]=n[2]*f+r[2]*s+a[2]*h+e[2]*M,t},e.random=function(t,n){n=n||1;var r=2*a.RANDOM()*Math.PI,e=2*a.RANDOM()-1,u=Math.sqrt(1-e*e)*n;return t[0]=Math.cos(r)*u,t[1]=Math.sin(r)*u,t[2]=e*n,t},e.transformMat4=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[3]*a+r[7]*e+r[11]*u+r[15];return o=o||1,t[0]=(r[0]*a+r[4]*e+r[8]*u+r[12])/o,t[1]=(r[1]*a+r[5]*e+r[9]*u+r[13])/o,t[2]=(r[2]*a+r[6]*e+r[10]*u+r[14])/o,t},e.transformMat3=function(t,n,r){var a=n[0],e=n[1],u=n[2];return t[0]=a*r[0]+e*r[3]+u*r[6],t[1]=a*r[1]+e*r[4]+u*r[7],t[2]=a*r[2]+e*r[5]+u*r[8],t},e.transformQuat=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],c=r[2],f=r[3],s=f*a+i*u-c*e,h=f*e+c*a-o*u,M=f*u+o*e-i*a,l=-o*a-i*e-c*u;return t[0]=s*f+l*-o+h*-c-M*-i,t[1]=h*f+l*-i+M*-o-s*-c,t[2]=M*f+l*-c+s*-i-h*-o,t},e.rotateX=function(t,n,r,a){var e=[],u=[];return e[0]=n[0]-r[0],e[1]=n[1]-r[1],e[2]=n[2]-r[2],u[0]=e[0],u[1]=e[1]*Math.cos(a)-e[2]*Math.sin(a),u[2]=e[1]*Math.sin(a)+e[2]*Math.cos(a),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},e.rotateY=function(t,n,r,a){var e=[],u=[];return e[0]=n[0]-r[0],e[1]=n[1]-r[1],e[2]=n[2]-r[2],u[0]=e[2]*Math.sin(a)+e[0]*Math.cos(a),u[1]=e[1],u[2]=e[2]*Math.cos(a)-e[0]*Math.sin(a),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},e.rotateZ=function(t,n,r,a){var e=[],u=[];return e[0]=n[0]-r[0],e[1]=n[1]-r[1],e[2]=n[2]-r[2],u[0]=e[0]*Math.cos(a)-e[1]*Math.sin(a),u[1]=e[0]*Math.sin(a)+e[1]*Math.cos(a),u[2]=e[2],t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},e.forEach=function(){var t=e.create();return function(n,r,a,e,u,o){var i,c;for(r||(r=3),a||(a=0),c=e?Math.min(e*r+a,n.length):n.length,i=a;c>i;i+=r)t[0]=n[i],t[1]=n[i+1],t[2]=n[i+2],u(t,t,o),n[i]=t[0],n[i+1]=t[1],n[i+2]=t[2];return n}}(),e.angle=function(t,n){var r=e.fromValues(t[0],t[1],t[2]),a=e.fromValues(n[0],n[1],n[2]);e.normalize(r,r),e.normalize(a,a);var u=e.dot(r,a);return u>1?0:Math.acos(u)},e.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},e.fromValues=function(t,n,r,e){var u=new a.ARRAY_TYPE(4);return u[0]=t,u[1]=n,u[2]=r,u[3]=e,u},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},e.set=function(t,n,r,a,e){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t},e.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t},e.subtract=function(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t},e.sub=e.subtract,e.multiply=function(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t[3]=n[3]*r[3],t},e.mul=e.multiply,e.divide=function(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t[3]=n[3]/r[3],t},e.div=e.divide,e.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t[2]=Math.min(n[2],r[2]),t[3]=Math.min(n[3],r[3]),t},e.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t[2]=Math.max(n[2],r[2]),t[3]=Math.max(n[3],r[3]),t},e.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t},e.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t},e.distance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2],u=n[3]-t[3];return Math.sqrt(r*r+a*a+e*e+u*u)},e.dist=e.distance,e.squaredDistance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2],u=n[3]-t[3];return r*r+a*a+e*e+u*u},e.sqrDist=e.squaredDistance,e.length=function(t){var n=t[0],r=t[1],a=t[2],e=t[3];return Math.sqrt(n*n+r*r+a*a+e*e)},e.len=e.length,e.squaredLength=function(t){var n=t[0],r=t[1],a=t[2],e=t[3];return n*n+r*r+a*a+e*e},e.sqrLen=e.squaredLength,e.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=-n[3],t},e.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t[3]=1/n[3],t},e.normalize=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*r+a*a+e*e+u*u;return o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=a*o,t[2]=e*o,t[3]=u*o),t},e.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]},e.lerp=function(t,n,r,a){var e=n[0],u=n[1],o=n[2],i=n[3];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t[2]=o+a*(r[2]-o),t[3]=i+a*(r[3]-i),t},e.random=function(t,n){return n=n||1,t[0]=a.RANDOM(),t[1]=a.RANDOM(),t[2]=a.RANDOM(),t[3]=a.RANDOM(),e.normalize(t,t),e.scale(t,t,n),t},e.transformMat4=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3];return t[0]=r[0]*a+r[4]*e+r[8]*u+r[12]*o,t[1]=r[1]*a+r[5]*e+r[9]*u+r[13]*o,t[2]=r[2]*a+r[6]*e+r[10]*u+r[14]*o,t[3]=r[3]*a+r[7]*e+r[11]*u+r[15]*o,t},e.transformQuat=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],c=r[2],f=r[3],s=f*a+i*u-c*e,h=f*e+c*a-o*u,M=f*u+o*e-i*a,l=-o*a-i*e-c*u;return t[0]=s*f+l*-o+h*-c-M*-i,t[1]=h*f+l*-i+M*-o-s*-c,t[2]=M*f+l*-c+s*-i-h*-o,t[3]=n[3],t},e.forEach=function(){var t=e.create();return function(n,r,a,e,u,o){var i,c;for(r||(r=4),a||(a=0),c=e?Math.min(e*r+a,n.length):n.length,i=a;c>i;i+=r)t[0]=n[i],t[1]=n[i+1],t[2]=n[i+2],t[3]=n[i+3],u(t,t,o),n[i]=t[0],n[i+1]=t[1],n[i+2]=t[2],n[i+3]=t[3];return n}}(),e.str=function(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(2);return n[0]=t[0],n[1]=t[1],n},e.fromValues=function(t,n){var r=new a.ARRAY_TYPE(2);return r[0]=t,r[1]=n,r},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t},e.set=function(t,n,r){return t[0]=n,t[1]=r,t},e.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t},e.subtract=function(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t},e.sub=e.subtract,e.multiply=function(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t},e.mul=e.multiply,e.divide=function(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t},e.div=e.divide,e.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t},e.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t},e.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t},e.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t},e.distance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1];return Math.sqrt(r*r+a*a)},e.dist=e.distance,e.squaredDistance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1];return r*r+a*a},e.sqrDist=e.squaredDistance,e.length=function(t){var n=t[0],r=t[1];return Math.sqrt(n*n+r*r)},e.len=e.length,e.squaredLength=function(t){var n=t[0],r=t[1];return n*n+r*r},e.sqrLen=e.squaredLength,e.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t},e.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t},e.normalize=function(t,n){var r=n[0],a=n[1],e=r*r+a*a;return e>0&&(e=1/Math.sqrt(e),t[0]=n[0]*e,t[1]=n[1]*e),t},e.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]},e.cross=function(t,n,r){var a=n[0]*r[1]-n[1]*r[0];return t[0]=t[1]=0,t[2]=a,t},e.lerp=function(t,n,r,a){var e=n[0],u=n[1];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t},e.random=function(t,n){n=n||1;var r=2*a.RANDOM()*Math.PI;return t[0]=Math.cos(r)*n,t[1]=Math.sin(r)*n,t},e.transformMat2=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[2]*e,t[1]=r[1]*a+r[3]*e,t},e.transformMat2d=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[2]*e+r[4],t[1]=r[1]*a+r[3]*e+r[5],t},e.transformMat3=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[3]*e+r[6],t[1]=r[1]*a+r[4]*e+r[7],t},e.transformMat4=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[4]*e+r[12],t[1]=r[1]*a+r[5]*e+r[13],t},e.forEach=function(){var t=e.create();return function(n,r,a,e,u,o){var i,c;for(r||(r=2),a||(a=0),c=e?Math.min(e*r+a,n.length):n.length,i=a;c>i;i+=r)t[0]=n[i],t[1]=n[i+1],u(t,t,o),n[i]=t[0],n[i+1]=t[1];return n}}(),e.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},t.exports=e}])});'use strict';(function(global){if(tr.isNode){const glMatrixAbsPath=HTMLImportsLoader.hrefToAbsolutePath('/gl-matrix-min.js');const glMatrixModule=require(glMatrixAbsPath);for(const exportName in glMatrixModule){global[exportName]=glMatrixModule[exportName];}}})(this);'use strict';tr.exportTo('tr.b.math',function(){const PREFERRED_NUMBER_SERIES_MULTIPLIERS=[1,2,5,10];function approximately(x,y,delta){if(delta===undefined)delta=1e-9;return Math.abs(x-y)<delta;}
-function clamp(x,lo,hi){return Math.min(Math.max(x,lo),hi);}
-function lerp(percentage,lo,hi){const range=hi-lo;return lo+percentage*range;}
-function normalize(value,lo,hi){return(value-lo)/(hi-lo);}
-function deg2rad(deg){return(Math.PI*deg)/180.0;}
-function erf(x){const sign=(x>=0)?1:-1;x=Math.abs(x);const a1=0.254829592;const a2=-0.284496736;const a3=1.421413741;const a4=-1.453152027;const a5=1.061405429;const p=0.3275911;const t=1.0/(1.0+p*x);const y=1.0-(((((a5*t+a4)*t)+a3)*t+a2)*t+a1)*t*Math.exp(-x*x);return sign*y;}
-const tmpVec2=vec2.create();const tmpVec2b=vec2.create();const tmpVec4=vec4.create();const tmpMat2d=mat2d.create();vec2.createFromArray=function(arr){if(arr.length!==2)throw new Error('Should be length 2');const v=vec2.create();vec2.set(v,arr[0],arr[1]);return v;};vec2.createXY=function(x,y){const v=vec2.create();vec2.set(v,x,y);return v;};vec2.toString=function(a){return'['+a[0]+', '+a[1]+']';};vec2.addTwoScaledUnitVectors=function(out,u1,scale1,u2,scale2){vec2.scale(tmpVec2,u1,scale1);vec2.scale(tmpVec2b,u2,scale2);vec2.add(out,tmpVec2,tmpVec2b);};vec2.interpolatePiecewiseFunction=function(points,x){if(x<points[0][0])return points[0][1];for(let i=1;i<points.length;++i){if(x<points[i][0]){const percent=normalize(x,points[i-1][0],points[i][0]);return lerp(percent,points[i-1][1],points[i][1]);}}
-return points[points.length-1][1];};vec3.createXYZ=function(x,y,z){const v=vec3.create();vec3.set(v,x,y,z);return v;};vec3.toString=function(a){return'vec3('+a[0]+', '+a[1]+', '+a[2]+')';};mat2d.translateXY=function(out,x,y){vec2.set(tmpVec2,x,y);mat2d.translate(out,out,tmpVec2);};mat2d.scaleXY=function(out,x,y){vec2.set(tmpVec2,x,y);mat2d.scale(out,out,tmpVec2);};vec4.unitize=function(out,a){out[0]=a[0]/a[3];out[1]=a[1]/a[3];out[2]=a[2]/a[3];out[3]=1;return out;};vec2.copyFromVec4=function(out,a){vec4.unitize(tmpVec4,a);vec2.copy(out,tmpVec4);};function logOrLog10(x,base){if(base===10)return Math.log10(x);return Math.log(x)/Math.log(base);}
-function lesserPower(x,opt_base){const base=opt_base||10;return Math.pow(base,Math.floor(logOrLog10(x,base)));}
-function greaterPower(x,opt_base){const base=opt_base||10;return Math.pow(base,Math.ceil(logOrLog10(x,base)));}
-function lesserWholeNumber(x){if(x===0)return 0;const pow10=(x<0)?-lesserPower(-x):lesserPower(x);return pow10*Math.floor(x/pow10);}
-function greaterWholeNumber(x){if(x===0)return 0;const pow10=(x<0)?-lesserPower(-x):lesserPower(x);return pow10*Math.ceil(x/pow10);}
-function truncate(value,digits){const pow10=Math.pow(10,digits);return Math.round(value*pow10)/pow10;}
-function preferredNumberLargerThanMin(min){const absMin=Math.abs(min);const conservativeGuess=tr.b.math.lesserPower(absMin);let minPreferedNumber=undefined;for(const multiplier of PREFERRED_NUMBER_SERIES_MULTIPLIERS){const tightenedGuess=conservativeGuess*multiplier;if(tightenedGuess>=absMin){minPreferedNumber=tightenedGuess;break;}}
-if(minPreferedNumber===undefined){throw new Error('Could not compute preferred number for '+min);}
-if(min<0)minPreferedNumber*=-1;return minPreferedNumber;}
-return{approximately,clamp,lerp,normalize,deg2rad,erf,lesserPower,greaterPower,lesserWholeNumber,greaterWholeNumber,preferredNumberLargerThanMin,truncate,};});'use strict';tr.exportTo('tr.b.math',function(){function Range(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;}
-Range.prototype={__proto__:Object.prototype,clone(){if(this.isEmpty)return new Range();return Range.fromExplicitRange(this.min_,this.max_);},reset(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;},get isEmpty(){return this.isEmpty_;},addRange(range){if(range.isEmpty)return;this.addValue(range.min);this.addValue(range.max);},addValue(value){if(this.isEmpty_){this.max_=value;this.min_=value;this.isEmpty_=false;return;}
-this.max_=Math.max(this.max_,value);this.min_=Math.min(this.min_,value);},set min(min){this.isEmpty_=false;this.min_=min;},get min(){if(this.isEmpty_)return undefined;return this.min_;},get max(){if(this.isEmpty_)return undefined;return this.max_;},set max(max){this.isEmpty_=false;this.max_=max;},get range(){if(this.isEmpty_)return undefined;return this.max_-this.min_;},get center(){return(this.min_+this.max_)*0.5;},get duration(){if(this.isEmpty_)return 0;return this.max_-this.min_;},enclosingPowers(opt_base){if(this.isEmpty)return new Range();return Range.fromExplicitRange(tr.b.math.lesserPower(this.min_,opt_base),tr.b.math.greaterPower(this.max_,opt_base));},normalize(x){return tr.b.math.normalize(x,this.min,this.max);},lerp(x){return tr.b.math.lerp(x,this.min,this.max);},clamp(x){return tr.b.math.clamp(x,this.min,this.max);},equals(that){if(this.isEmpty&&that.isEmpty)return true;if(this.isEmpty!==that.isEmpty)return false;return(tr.b.math.approximately(this.min,that.min)&&tr.b.math.approximately(this.max,that.max));},containsExplicitRangeInclusive(min,max){if(this.isEmpty)return false;return this.min_<=min&&max<=this.max_;},containsExplicitRangeExclusive(min,max){if(this.isEmpty)return false;return this.min_<min&&max<this.max_;},intersectsExplicitRangeInclusive(min,max){if(this.isEmpty)return false;return this.min_<=max&&min<=this.max_;},intersectsExplicitRangeExclusive(min,max){if(this.isEmpty)return false;return this.min_<max&&min<this.max_;},containsRangeInclusive(range){if(range.isEmpty)return false;return this.containsExplicitRangeInclusive(range.min_,range.max_);},containsRangeExclusive(range){if(range.isEmpty)return false;return this.containsExplicitRangeExclusive(range.min_,range.max_);},intersectsRangeInclusive(range){if(range.isEmpty)return false;return this.intersectsExplicitRangeInclusive(range.min_,range.max_);},intersectsRangeExclusive(range){if(range.isEmpty)return false;return this.intersectsExplicitRangeExclusive(range.min_,range.max_);},findExplicitIntersectionDuration(min,max){min=Math.max(this.min,min);max=Math.min(this.max,max);if(max<min)return 0;return max-min;},findIntersection(range){if(this.isEmpty||range.isEmpty)return new Range();const min=Math.max(this.min,range.min);const max=Math.min(this.max,range.max);if(max<min)return new Range();return Range.fromExplicitRange(min,max);},toJSON(){if(this.isEmpty_)return{isEmpty:true};return{isEmpty:false,max:this.max,min:this.min};},filterArray(sortedArray,opt_keyFunc,opt_this){if(this.isEmpty_)return[];const keyFunc=opt_keyFunc||(x=>x);function getValue(obj){return keyFunc.call(opt_this,obj);}
-const first=tr.b.findFirstTrueIndexInSortedArray(sortedArray,obj=>this.min_===undefined||this.min_<=getValue(obj));const last=tr.b.findFirstTrueIndexInSortedArray(sortedArray,obj=>this.max_!==undefined&&this.max_<getValue(obj));return sortedArray.slice(first,last);}};Range.fromDict=function(d){if(d.isEmpty===true)return new Range();if(d.isEmpty===false){const range=new Range();range.min=d.min;range.max=d.max;return range;}
-throw new Error('Not a range');};Range.fromExplicitRange=function(min,max){const range=new Range();range.min=min;range.max=max;return range;};Range.compareByMinTimes=function(a,b){if(!a.isEmpty&&!b.isEmpty)return a.min_-b.min_;if(a.isEmpty&&!b.isEmpty)return-1;if(!a.isEmpty&&b.isEmpty)return 1;return 0;};Range.findDifference=function(rangeA,rangeB){if(!rangeA||rangeA.duration<0||!rangeB||rangeB.duration<0){throw new Error(`Couldn't subtract ranges`);}
-const resultRanges=[];if(rangeA.isEmpty)return resultRanges;if(rangeB.isEmpty)return[rangeA.clone()];const intersection=rangeA.findIntersection(rangeB);if(intersection.isEmpty){return[rangeA.clone()];}
-if(rangeA.duration===0&&rangeB.duration===0){if(intersection.empty)return[rangeA.clone()];else if(intersection.duration===0)return resultRanges;throw new Error(`Two points' intersection can only be a point or empty`);}
-const leftRange=tr.b.math.Range.fromExplicitRange(rangeA.min,intersection.min);if(leftRange.duration>0){resultRanges.push(leftRange);}
-const rightRange=tr.b.math.Range.fromExplicitRange(intersection.max,rangeA.max);if(rightRange.duration>0){resultRanges.push(rightRange);}
-return resultRanges;};Range.PERCENT_RANGE=Range.fromExplicitRange(0,1);Object.freeze(Range.PERCENT_RANGE);return{Range,};});'use strict';(function(exports){var rank={standard:function(array,key){array=array.sort(function(a,b){var x=a[key];var y=b[key];return((x<y)?-1:((x>y)?1:0));});for(var i=1;i<array.length+1;i++){array[i-1]['rank']=i;}
-return array;},fractional:function(array,key){array=this.standard(array,key);var pos=0;while(pos<array.length){var sum=0;var i=0;for(i=0;array[pos+i+1]&&(array[pos+i][key]===array[pos+i+1][key]);i++){sum+=array[pos+i]['rank'];}
-sum+=array[pos+i]['rank'];var endPos=pos+i+1;for(pos;pos<endPos;pos++){array[pos]['rank']=sum/(i+1);}
-pos=endPos;}
-return array;},rank:function(x,y){var nx=x.length,ny=y.length,combined=[],ranked;while(nx--){combined.push({set:'x',val:x[nx]});}
-while(ny--){combined.push({set:'y',val:y[ny]});}
-ranked=this.fractional(combined,'val');return ranked}};var erf=function erf(x){var cof=[-1.3026537197817094,6.4196979235649026e-1,1.9476473204185836e-2,-9.561514786808631e-3,-9.46595344482036e-4,3.66839497852761e-4,4.2523324806907e-5,-2.0278578112534e-5,-1.624290004647e-6,1.303655835580e-6,1.5626441722e-8,-8.5238095915e-8,6.529054439e-9,5.059343495e-9,-9.91364156e-10,-2.27365122e-10,9.6467911e-11,2.394038e-12,-6.886027e-12,8.94487e-13,3.13092e-13,-1.12708e-13,3.81e-16,7.106e-15,-1.523e-15,-9.4e-17,1.21e-16,-2.8e-17];var j=cof.length-1;var isneg=false;var d=0;var dd=0;var t,ty,tmp,res;if(x<0){x=-x;isneg=true;}
-t=2/(2+x);ty=4*t-2;for(;j>0;j--){tmp=d;d=ty*d-dd+cof[j];dd=tmp;}
-res=t*Math.exp(-x*x+0.5*(cof[0]+ty*d)-dd);return isneg?res-1:1-res;};var dnorm=function(x,mean,std){return 0.5*(1+erf((x-mean)/Math.sqrt(2*std*std)));}
-var statistic=function(x,y){var ranked=rank.rank(x,y),nr=ranked.length,nx=x.length,ny=y.length,ranksums={x:0,y:0},i=0,t=0,nt=1,tcf,ux,uy;while(i<nr){if(i>0){if(ranked[i].val==ranked[i-1].val){nt++;}else{if(nt>1){t+=Math.pow(nt,3)-nt
-nt=1;}}}
-ranksums[ranked[i].set]+=ranked[i].rank
-i++;}
-tcf=1-(t/(Math.pow(nr,3)-nr))
-ux=nx*ny+(nx*(nx+1)/2)-ranksums.x;uy=nx*ny-ux;return{tcf:tcf,ux:ux,uy:uy,big:Math.max(ux,uy),small:Math.min(ux,uy)}}
-exports.test=function(x,y,alt,corr){alt=typeof alt!=='undefined'?alt:'two-sided';corr=typeof corr!=='undefined'?corr:true;var nx=x.length,ny=y.length,f=1,u,mu,std,z,p;u=statistic(x,y);if(corr){mu=(nx*ny/2)+0.5;}else{mu=nx*ny/2;}
-std=Math.sqrt(u.tcf*nx*ny*(nx+ny+1)/12);if(alt=='less'){z=(u.ux-mu)/std;}else if(alt=='greater'){z=(u.uy-mu)/std;}else if(alt=='two-sided'){z=Math.abs((u.big-mu)/std);}else{console.log('Unknown alternative argument');}
-if(alt=='two-sided'){f=2;}
-p=dnorm(-z,0,1)*f;return{U:u.small,p:p};}})(typeof exports==='undefined'?this['mannwhitneyu']={}:exports);'use strict';(function(global){if(tr.isNode){const mwuAbsPath=HTMLImportsLoader.hrefToAbsolutePath('/mannwhitneyu.js');const mwuModule=require(mwuAbsPath);for(const exportName in mwuModule){global[exportName]=mwuModule[exportName];}}})(this);'use strict';tr.exportTo('tr.b.math',function(){const Statistics={};Statistics.divideIfPossibleOrZero=function(numerator,denominator){if(denominator===0)return 0;return numerator/denominator;};Statistics.sum=function(ary,opt_func,opt_this){const func=opt_func||(x=>x);let ret=0;let i=0;for(const elt of ary){ret+=func.call(opt_this,elt,i++);}
-return ret;};Statistics.mean=function(ary,opt_func,opt_this){const func=opt_func||(x=>x);let sum=0;let i=0;for(const elt of ary){sum+=func.call(opt_this,elt,i++);}
-if(i===0)return undefined;return sum/i;};Statistics.geometricMean=function(ary,opt_func,opt_this){const func=opt_func||(x=>x);let i=0;let logsum=0;for(const elt of ary){const x=func.call(opt_this,elt,i++);if(x<=0)return 0;logsum+=Math.log(Math.abs(x));}
-if(i===0)return 1;return Math.exp(logsum/i);};Statistics.weightedMean=function(ary,weightCallback,opt_valueCallback,opt_this){const valueCallback=opt_valueCallback||(x=>x);let numerator=0;let denominator=0;let i=-1;for(const elt of ary){i++;const value=valueCallback.call(opt_this,elt,i);if(value===undefined)continue;const weight=weightCallback.call(opt_this,elt,i,value);numerator+=weight*value;denominator+=weight;}
-if(denominator===0)return undefined;return numerator/denominator;};Statistics.variance=function(ary,opt_func,opt_this){if(ary.length===0)return undefined;if(ary.length===1)return 0;const func=opt_func||(x=>x);const mean=Statistics.mean(ary,func,opt_this);const sumOfSquaredDistances=Statistics.sum(ary,function(d,i){const v=func.call(this,d,i)-mean;return v*v;},opt_this);return sumOfSquaredDistances/(ary.length-1);};Statistics.stddev=function(ary,opt_func,opt_this){if(ary.length===0)return undefined;return Math.sqrt(Statistics.variance(ary,opt_func,opt_this));};Statistics.max=function(ary,opt_func,opt_this){const func=opt_func||(x=>x);let ret=-Infinity;let i=0;for(const elt of ary){ret=Math.max(ret,func.call(opt_this,elt,i++));}
-return ret;};Statistics.min=function(ary,opt_func,opt_this){const func=opt_func||(x=>x);let ret=Infinity;let i=0;for(const elt of ary){ret=Math.min(ret,func.call(opt_this,elt,i++));}
-return ret;};Statistics.range=function(ary,opt_func,opt_this){const func=opt_func||(x=>x);const ret=new tr.b.math.Range();let i=0;for(const elt of ary){ret.addValue(func.call(opt_this,elt,i++));}
-return ret;};Statistics.percentile=function(ary,percent,opt_func,opt_this){if(!(percent>=0&&percent<=1)){throw new Error('percent must be [0,1]');}
-const func=opt_func||(x=>x);const tmp=new Array(ary.length);let i=0;for(const elt of ary){tmp[i]=func.call(opt_this,elt,i++);}
-tmp.sort((a,b)=>a-b);const idx=Math.floor((ary.length-1)*percent);return tmp[idx];};Statistics.normalizeSamples=function(samples){if(samples.length===0){return{normalized_samples:samples,scale:1.0};}
-samples=samples.slice().sort(function(a,b){return a-b;});const low=Math.min.apply(null,samples);const high=Math.max.apply(null,samples);const newLow=0.5/samples.length;const newHigh=(samples.length-0.5)/samples.length;if(high-low===0.0){samples=Array.apply(null,new Array(samples.length)).map(function(){return 0.5;});return{normalized_samples:samples,scale:1.0};}
-const scale=(newHigh-newLow)/(high-low);for(let i=0;i<samples.length;i++){samples[i]=(samples[i]-low)*scale+newLow;}
-return{normalized_samples:samples,scale};};Statistics.discrepancy=function(samples,opt_locationCount){if(samples.length===0)return 0.0;let maxLocalDiscrepancy=0;const invSampleCount=1.0/samples.length;const locations=[];const countLess=[];const countLessEqual=[];if(opt_locationCount!==undefined){let sampleIndex=0;for(let i=0;i<opt_locationCount;i++){const location=i/(opt_locationCount-1);locations.push(location);while(sampleIndex<samples.length&&samples[sampleIndex]<location){sampleIndex+=1;}
-countLess.push(sampleIndex);while(sampleIndex<samples.length&&samples[sampleIndex]<=location){sampleIndex+=1;}
-countLessEqual.push(sampleIndex);}}else{if(samples[0]>0.0){locations.push(0.0);countLess.push(0);countLessEqual.push(0);}
-for(let i=0;i<samples.length;i++){locations.push(samples[i]);countLess.push(i);countLessEqual.push(i+1);}
-if(samples[-1]<1.0){locations.push(1.0);countLess.push(samples.length);countLessEqual.push(samples.length);}}
-let maxDiff=0;let minDiff=0;for(let i=1;i<locations.length;i++){const length=locations[i]-locations[i-1];const countClosed=countLessEqual[i]-countLess[i-1];const countOpen=countLess[i]-countLessEqual[i-1];const countClosedIncrement=countLessEqual[i]-countLessEqual[i-1];const countOpenIncrement=countLess[i]-countLess[i-1];maxDiff=Math.max(countClosedIncrement*invSampleCount-length+maxDiff,countClosed*invSampleCount-length);minDiff=Math.min(countOpenIncrement*invSampleCount-length+minDiff,countOpen*invSampleCount-length);maxLocalDiscrepancy=Math.max(maxDiff,-minDiff,maxLocalDiscrepancy);}
-return maxLocalDiscrepancy;};Statistics.timestampsDiscrepancy=function(timestamps,opt_absolute,opt_locationCount){if(timestamps.length===0)return 0.0;if(opt_absolute===undefined)opt_absolute=true;if(Array.isArray(timestamps[0])){const rangeDiscrepancies=timestamps.map(function(r){return Statistics.timestampsDiscrepancy(r);});return Math.max.apply(null,rangeDiscrepancies);}
-const s=Statistics.normalizeSamples(timestamps);const samples=s.normalized_samples;const sampleScale=s.scale;let discrepancy=Statistics.discrepancy(samples,opt_locationCount);const invSampleCount=1.0/samples.length;if(opt_absolute===true){discrepancy/=sampleScale;}else{discrepancy=tr.b.math.clamp((discrepancy-invSampleCount)/(1.0-invSampleCount),0.0,1.0);}
-return discrepancy;};Statistics.uniformlySampleArray=function(samples,count){if(samples.length<=count){return samples;}
-while(samples.length>count){const i=parseInt(Math.random()*samples.length);samples.splice(i,1);}
-return samples;};Statistics.uniformlySampleStream=function(samples,streamLength,newElement,numSamples){if(streamLength<=numSamples){if(samples.length>=streamLength){samples[streamLength-1]=newElement;}else{samples.push(newElement);}
-return;}
-const probToKeep=numSamples/streamLength;if(Math.random()>probToKeep)return;const index=Math.floor(Math.random()*numSamples);samples[index]=newElement;};Statistics.mergeSampledStreams=function(samplesA,streamLengthA,samplesB,streamLengthB,numSamples){if(streamLengthB<numSamples){const nbElements=Math.min(streamLengthB,samplesB.length);for(let i=0;i<nbElements;++i){Statistics.uniformlySampleStream(samplesA,streamLengthA+i+1,samplesB[i],numSamples);}
-return;}
-if(streamLengthA<numSamples){const nbElements=Math.min(streamLengthA,samplesA.length);const tempSamples=samplesB.slice();for(let i=0;i<nbElements;++i){Statistics.uniformlySampleStream(tempSamples,streamLengthB+i+1,samplesA[i],numSamples);}
-for(let i=0;i<tempSamples.length;++i){samplesA[i]=tempSamples[i];}
-return;}
-const nbElements=Math.min(numSamples,samplesB.length);const probOfSwapping=streamLengthB/(streamLengthA+streamLengthB);for(let i=0;i<nbElements;++i){if(Math.random()<probOfSwapping){samplesA[i]=samplesB[i];}}};function Distribution(){}
-Distribution.prototype={computeDensity(x){throw Error('Not implemented');},computePercentile(x){throw Error('Not implemented');},computeComplementaryPercentile(x){return 1-this.computePercentile(x);},get mean(){throw Error('Not implemented');},get mode(){throw Error('Not implemented');},get median(){throw Error('Not implemented');},get standardDeviation(){throw Error('Not implemented');},get variance(){throw Error('Not implemented');}};Statistics.UniformDistribution=function(opt_range){if(!opt_range)opt_range=tr.b.math.Range.fromExplicitRange(0,1);this.range=opt_range;};Statistics.UniformDistribution.prototype={__proto__:Distribution.prototype,computeDensity(x){return 1/this.range.range;},computePercentile(x){return tr.b.math.normalize(x,this.range.min,this.range.max);},get mean(){return this.range.center;},get mode(){return undefined;},get median(){return this.mean;},get standardDeviation(){return Math.sqrt(this.variance);},get variance(){return Math.pow(this.range.range,2)/12;}};Statistics.NormalDistribution=function(opt_mean,opt_variance){this.mean_=opt_mean||0;this.variance_=opt_variance||1;this.standardDeviation_=Math.sqrt(this.variance_);};Statistics.NormalDistribution.prototype={__proto__:Distribution.prototype,computeDensity(x){const scale=(1.0/(this.standardDeviation*Math.sqrt(2.0*Math.PI)));const exponent=-Math.pow(x-this.mean,2)/(2.0*this.variance);return scale*Math.exp(exponent);},computePercentile(x){const standardizedX=((x-this.mean)/Math.sqrt(2.0*this.variance));return(1.0+tr.b.math.erf(standardizedX))/2.0;},get mean(){return this.mean_;},get median(){return this.mean;},get mode(){return this.mean;},get standardDeviation(){return this.standardDeviation_;},get variance(){return this.variance_;}};Statistics.LogNormalDistribution=function(opt_location,opt_shape){this.normalDistribution_=new Statistics.NormalDistribution(opt_location,Math.pow(opt_shape||1,2));};Statistics.LogNormalDistribution.prototype={__proto__:Statistics.NormalDistribution.prototype,computeDensity(x){return this.normalDistribution_.computeDensity(Math.log(x))/x;},computePercentile(x){return this.normalDistribution_.computePercentile(Math.log(x));},get mean(){return Math.exp(this.normalDistribution_.mean+
-(this.normalDistribution_.variance/2));},get variance(){const nm=this.normalDistribution_.mean;const nv=this.normalDistribution_.variance;return(Math.exp(2*(nm+nv))-
-Math.exp(2*nm+nv));},get standardDeviation(){return Math.sqrt(this.variance);},get median(){return Math.exp(this.normalDistribution_.mean);},get mode(){return Math.exp(this.normalDistribution_.mean-
-this.normalDistribution_.variance);}};Statistics.LogNormalDistribution.fromMedianAndDiminishingReturns=function(median,diminishingReturns){diminishingReturns=Math.log(diminishingReturns/median);const shape=Math.sqrt(1-3*diminishingReturns-
-Math.sqrt(Math.pow(diminishingReturns-3,2)-8))/2;const location=Math.log(median);return new Statistics.LogNormalDistribution(location,shape);};Statistics.DEFAULT_ALPHA=0.01;Statistics.MAX_SUGGESTED_SAMPLE_SIZE=20;Statistics.Significance={SIGNIFICANT:'REJECT',INSIGNIFICANT:'FAIL_TO_REJECT',NEED_MORE_DATA:'NEED_MORE_DATA',DONT_CARE:'DONT_CARE',};class HypothesisTestResult{constructor(p,u,needMoreData,opt_alpha){this.p_=p;this.u_=u;this.needMoreData_=needMoreData;this.compare(opt_alpha);}
-get p(){return this.p_;}
-get U(){return this.u_;}
-get significance(){return this.significance_;}
-compare(opt_alpha){const alpha=opt_alpha||Statistics.DEFAULT_ALPHA;if(this.p<alpha){this.significance_=Statistics.Significance.SIGNIFICANT;}else if(this.needMoreData_){this.significance_=Statistics.Significance.NEED_MORE_DATA;}else{this.significance_=Statistics.Significance.INSIGNIFICANT;}
-return this.significance_;}
-asDict(){return{p:this.p,U:this.U,significance:this.significance,};}}
-Statistics.mwu=function(a,b,opt_alpha,opt_reqSampleSize){const result=mannwhitneyu.test(a,b);const needMoreData=opt_reqSampleSize&&Math.min(a.length,b.length)<opt_reqSampleSize;return new HypothesisTestResult(result.p,result.U,needMoreData,opt_alpha);};return{Statistics,};});'use strict';tr.exportTo('tr.b',function(){const GREEK_SMALL_LETTER_MU=String.fromCharCode(956);const SECONDS_IN_A_MINUTE=60;const SECONDS_IN_AN_HOUR=SECONDS_IN_A_MINUTE*60;const SECONDS_IN_A_DAY=SECONDS_IN_AN_HOUR*24;const SECONDS_IN_A_WEEK=SECONDS_IN_A_DAY*7;const SECONDS_IN_A_YEAR=SECONDS_IN_A_DAY*365.2422;const SECONDS_IN_A_MONTH=SECONDS_IN_A_YEAR/12;const UnitPrefixScale={};const UnitScale={};function defineUnitPrefixScale(name,prefixes){if(UnitPrefixScale[name]!==undefined){throw new Error('Unit prefix scale \''+name+'\' already exists');}
-if(prefixes.AUTO!==undefined){throw new Error('The \'AUTO\' unit prefix is not supported for unit'+'prefix scales and cannot be added to scale \''+name+'\'');}
-UnitPrefixScale[name]=prefixes;}
-UnitScale.defineUnitScale=function(name,unitScale){if(UnitScale[name]!==undefined){throw new Error('Unit scale \''+name+'\' already exists');}
-if(unitScale.AUTO!==undefined){throw new Error('\'AUTO\' unit scale will be added automatically '+'for unit scale \''+name+'\'');}
-unitScale.AUTO=Object.values(unitScale);unitScale.AUTO.sort((a,b)=>a.value-b.value);if(name)UnitScale[name]=unitScale;return unitScale;};function definePrefixScaleFromUnitScale(prefixName,unitScale){if(!unitScale){throw new Error('Cannot create PrefixScale without a unit scale.');}
-const prefixScale={};for(const[curPrefix,curScale]of Object.entries(unitScale)){if(curPrefix==='AUTO'){continue;}
-if(curScale.symbol===undefined||!curScale.value){throw new Error(`Cannot create PrefixScale from malformed unit ${curScale}.`);}
-prefixScale[curPrefix]={value:curScale.value,symbol:curScale.symbol};}
-return defineUnitPrefixScale(prefixName,prefixScale);}
-UnitScale.defineUnitScaleFromPrefixScale=function(baseSymbol,baseName,prefixScale,opt_scaleName){if(baseSymbol===undefined){throw new Error('Cannot create UnitScale with undefined baseSymbol.');}
-if(!baseName){throw new Error('Cannot create UnitScale without a baseName.');}
-if(!prefixScale){throw new Error('Cannot create UnitScale without a prefix scale.');}
-const unitScale={};for(const curPrefix of Object.keys(prefixScale)){const curScale=prefixScale[curPrefix];if(curScale.symbol===undefined||!curScale.value){throw new Error(`Cannot convert PrefixScale with malformed prefix ${curScale}.`);}
-const name=curPrefix==='NONE'?baseName:`${curPrefix}_${baseName}`;unitScale[name]={value:curScale.value,symbol:curScale.symbol+baseSymbol,baseSymbol};}
-return UnitScale.defineUnitScale(opt_scaleName,unitScale);};function convertUnit(value,fromScale,toScale){if(value===undefined)return undefined;const fromScaleBase=fromScale.baseSymbol;const toScaleBase=toScale.baseSymbol;if(fromScaleBase!==undefined&&toScaleBase!==undefined&&fromScaleBase!==toScaleBase){throw new Error('Cannot convert between units with different base symbols.');}
-return value*(fromScale.value/toScale.value);}
-defineUnitPrefixScale('BINARY',{NONE:{value:Math.pow(1024,0),symbol:''},KIBI:{value:Math.pow(1024,1),symbol:'Ki'},MEBI:{value:Math.pow(1024,2),symbol:'Mi'},GIBI:{value:Math.pow(1024,3),symbol:'Gi'},TEBI:{value:Math.pow(1024,4),symbol:'Ti'}});defineUnitPrefixScale('METRIC',{NANO:{value:1e-9,symbol:'n'},MICRO:{value:1e-6,symbol:GREEK_SMALL_LETTER_MU},MILLI:{value:1e-3,symbol:'m'},NONE:{value:1,symbol:''},KILO:{value:1e3,symbol:'k'},MEGA:{value:1e6,symbol:'M'},GIGA:{value:1e9,symbol:'G'}});UnitScale.defineUnitScale('TIME',{NANO_SEC:{value:1e-9,symbol:'ns',baseSymbol:'s'},MICRO_SEC:{value:1e-6,symbol:GREEK_SMALL_LETTER_MU+'s',baseSymbol:'s'},MILLI_SEC:{value:1e-3,symbol:'ms',baseSymbol:'s'},SEC:{value:1,symbol:'s',baseSymbol:'s'},MINUTE:{value:SECONDS_IN_A_MINUTE,symbol:'min',baseSymbol:'s'},HOUR:{value:SECONDS_IN_AN_HOUR,symbol:'hr',baseSymbol:'s'},DAY:{value:SECONDS_IN_A_DAY,symbol:'days',baseSymbol:'s'},WEEK:{value:SECONDS_IN_A_WEEK,symbol:'weeks',baseSymbol:'s'},MONTH:{value:SECONDS_IN_A_MONTH,symbol:'months',baseSymbol:'s'},YEAR:{value:SECONDS_IN_A_YEAR,symbol:'years',baseSymbol:'s'}});UnitScale.defineUnitScaleFromPrefixScale('B','BYTE',UnitPrefixScale.BINARY,'MEMORY');definePrefixScaleFromUnitScale('DATA_SIZE',UnitScale.MEMORY);UnitScale.defineUnitScaleFromPrefixScale('/s','SECONDS',UnitPrefixScale.DATA_SIZE,'BANDWIDTH_BYTES');return{UnitPrefixScale,UnitScale,convertUnit,GREEK_SMALL_LETTER_MU,};});'use strict';tr.exportTo('tr.b',function(){const msDisplayMode={scale:1e-3,suffix:'ms',roundedLess(a,b){return Math.round(a*1000)<Math.round(b*1000);},formatSpec:{unitScale:[tr.b.UnitScale.TIME.MILLI_SEC],minimumFractionDigits:3,}};const nsDisplayMode={scale:1e-9,suffix:'ns',roundedLess(a,b){return Math.round(a*1000000)<Math.round(b*1000000);},formatSpec:{unitScale:[tr.b.UnitScale.TIME.NANO_SEC],maximumFractionDigits:0}};const TimeDisplayModes={ns:nsDisplayMode,ms:msDisplayMode};return{TimeDisplayModes,};});'use strict';tr.exportTo('tr.ui.b',function(){function iterateElementDeeplyImpl(element,cb,thisArg,includeElement){if(includeElement&&cb.call(thisArg,element))return true;if(element.root&&element.root!==element&&iterateElementDeeplyImpl(element.root,cb,thisArg,false)){return true;}
-const children=Polymer.dom(element).children;for(let i=0;i<children.length;i++){if(iterateElementDeeplyImpl(children[i],cb,thisArg,true)){return true;}}
-return false;}
-function iterateElementDeeply(element,cb,thisArg){iterateElementDeeplyImpl(element,cb,thisArg,false);}
-function findDeepElementMatchingPredicate(element,predicate){let foundElement=undefined;function matches(element){const match=predicate(element);if(!match){return false;}
-foundElement=element;return true;}
-iterateElementDeeply(element,matches);return foundElement;}
-function findDeepElementsMatchingPredicate(element,predicate){const foundElements=[];function matches(element){const match=predicate(element);if(match){foundElements.push(element);}
-return false;}
-iterateElementDeeply(element,matches);return foundElements;}
-function findDeepElementMatching(element,selector){return findDeepElementMatchingPredicate(element,function(element){return element.matches(selector);});}
-function findDeepElementsMatching(element,selector){return findDeepElementsMatchingPredicate(element,function(element){return element.matches(selector);});}
-function findDeepElementWithTextContent(element,re){return findDeepElementMatchingPredicate(element,function(element){if(element.children.length!==0)return false;return re.test(Polymer.dom(element).textContent);});}
-return{findDeepElementMatching,findDeepElementsMatching,findDeepElementMatchingPredicate,findDeepElementsMatchingPredicate,findDeepElementWithTextContent,};});'use strict';tr.exportTo('tr.b',function(){const TimeDisplayModes=tr.b.TimeDisplayModes;const PLUS_MINUS_SIGN=String.fromCharCode(177);const CACHED_FORMATTERS={};function getNumberFormatter(minSpec,maxSpec,minCtx,maxCtx){const key=minSpec+'-'+maxSpec+'-'+minCtx+'-'+maxCtx;let formatter=CACHED_FORMATTERS[key];if(formatter===undefined){let minimumFractionDigits=minCtx!==undefined?minCtx:minSpec;let maximumFractionDigits=maxCtx!==undefined?maxCtx:maxSpec;if(minimumFractionDigits>maximumFractionDigits){if(minCtx!==undefined&&maxCtx===undefined){maximumFractionDigits=minimumFractionDigits;}else if(minCtx===undefined&&maxCtx!==undefined){minimumFractionDigits=maximumFractionDigits;}}
-formatter=new Intl.NumberFormat(undefined,{minimumFractionDigits,maximumFractionDigits,});CACHED_FORMATTERS[key]=formatter;}
-return formatter;}
-function max(a,b){if(a===undefined)return b;if(b===undefined)return a;return a.scale>b.scale?a:b;}
-const ImprovementDirection={DONT_CARE:0,BIGGER_IS_BETTER:1,SMALLER_IS_BETTER:2};function Unit(unitName,jsonName,scaleBaseUnit,isDelta,improvementDirection,formatSpec){this.unitName=unitName;this.jsonName=jsonName;this.scaleBaseUnit=scaleBaseUnit;this.isDelta=isDelta;this.improvementDirection=improvementDirection;this.formatSpec_=formatSpec;this.baseUnit=undefined;this.correspondingDeltaUnit=undefined;}
-Unit.prototype={asJSON(){return this.jsonName;},asJSON2(){return this.asJSON().replace('_smallerIsBetter','-').replace('_biggerIsBetter','+');},truncate(value){if(typeof value!=='number')return value;if(0===(value%1))return value;if(typeof this.formatSpec_!=='function'&&(!this.formatSpec_.unitScale||((this.formatSpec_.unitScale.length===1)&&(this.formatSpec_.unitScale[0].value===1)))){const digits=this.formatSpec_.maximumFractionDigits||this.formatSpec_.minimumFractionDigits;return tr.b.math.truncate(value,digits+1);}
-const formatted=this.format(value);let test=Math.round(value);if(formatted===this.format(test))return test;let lo=1;let hi=16;while(lo<hi-1){const digits=parseInt((lo+hi)/2);test=tr.b.math.truncate(value,digits);if(formatted===this.format(test)){hi=digits;}else{lo=digits;}}
-test=tr.b.math.truncate(value,lo);if(formatted===this.format(test))return test;return tr.b.math.truncate(value,hi);},getUnitScale_(opt_context){let formatSpec=this.formatSpec_;let formatSpecWasFunction=false;if(typeof formatSpec==='function'){formatSpecWasFunction=true;formatSpec=formatSpec();}
-const context=opt_context||{};let scale=undefined;if(context.unitScale){scale=context.unitScale;}else if(context.unitPrefix){const symbol=formatSpec.baseSymbol?formatSpec.baseSymbol:this.scaleBaseUnit.baseSymbol;scale=tr.b.UnitScale.defineUnitScaleFromPrefixScale(symbol,symbol,[context.unitPrefix]).AUTO;}else{scale=formatSpec.unitScale;if(!scale){scale=[{value:1,symbol:formatSpec.baseSymbol||'',baseSymbol:formatSpec.baseSymbol||''}];if(!formatSpecWasFunction)formatSpec.unitScale=scale;}}
-if(!(scale instanceof Array)){throw new Error('Unit has a malformed unit scale.');}
-return scale;},get unitString(){const scale=this.getUnitScale_();if(!scale){throw new Error('A UnitScale could not be found for Unit '+this.unitName);}
-return scale[0].symbol;},format(value,opt_context){let signString='';if(value<0){signString='-';value=-value;}else if(this.isDelta){signString=value===0?PLUS_MINUS_SIGN:'+';}
-const context=opt_context||{};const scale=this.getUnitScale_(context);let deltaValue=context.deltaValue===undefined?value:context.deltaValue;deltaValue=Math.abs(deltaValue)*this.scaleBaseUnit.value;if(deltaValue===0){deltaValue=1;}
-let i=0;while(i<scale.length-1&&deltaValue/scale[i+1].value>=1){i++;}
-const selectedSubUnit=scale[i];let formatSpec=this.formatSpec_;if(typeof formatSpec==='function')formatSpec=formatSpec();let unitString='';if(selectedSubUnit.symbol){if(!formatSpec.avoidSpacePrecedingUnit)unitString=' ';unitString+=selectedSubUnit.symbol;}
-value=tr.b.convertUnit(value,this.scaleBaseUnit,selectedSubUnit);const numberString=getNumberFormatter(formatSpec.minimumFractionDigits,formatSpec.maximumFractionDigits,context.minimumFractionDigits,context.maximumFractionDigits).format(value);return signString+numberString+unitString;}};Unit.reset=function(){Unit.currentTimeDisplayMode=TimeDisplayModes.ms;};Unit.timestampFromUs=function(us){return tr.b.convertUnit(us,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);};Object.defineProperty(Unit,'currentTimeDisplayMode',{get(){return Unit.currentTimeDisplayMode_;},set(value){if(Unit.currentTimeDisplayMode_===value)return;Unit.currentTimeDisplayMode_=value;Unit.dispatchEvent(new tr.b.Event('display-mode-changed'));}});Unit.didPreferredTimeDisplayUnitChange=function(){let largest=undefined;const els=tr.ui.b.findDeepElementsMatching(document.body,'tr-v-ui-preferred-display-unit');els.forEach(function(el){largest=max(largest,el.preferredTimeDisplayMode);});Unit.currentTimeDisplayMode=largest===undefined?TimeDisplayModes.ms:largest;};Unit.byName={};Unit.byJSONName={};Unit.fromJSON=function(object){if(typeof(object)==='string'){if(object.endsWith('+')){object=object.slice(0,object.length-1)+'_biggerIsBetter';}else if(object.endsWith('-')){object=object.slice(0,object.length-1)+'_smallerIsBetter';}
-const u=Unit.byJSONName[object];if(u)return u;}
-throw new Error(`Unrecognized unit "${object}"`);};Unit.define=function(params){const definedUnits=[];for(const improvementDirection of Object.values(ImprovementDirection)){const regularUnit=Unit.defineUnitVariant_(params,false,improvementDirection);const deltaUnit=Unit.defineUnitVariant_(params,true,improvementDirection);regularUnit.correspondingDeltaUnit=deltaUnit;deltaUnit.correspondingDeltaUnit=deltaUnit;definedUnits.push(regularUnit,deltaUnit);}
-const baseUnit=Unit.byName[params.baseUnitName];definedUnits.forEach(u=>u.baseUnit=baseUnit);};Unit.nameSuffixForImprovementDirection=function(improvementDirection){switch(improvementDirection){case ImprovementDirection.DONT_CARE:return'';case ImprovementDirection.BIGGER_IS_BETTER:return'_biggerIsBetter';case ImprovementDirection.SMALLER_IS_BETTER:return'_smallerIsBetter';default:throw new Error('Unknown improvement direction: '+improvementDirection);}};Unit.defineUnitVariant_=function(params,isDelta,improvementDirection){let nameSuffix=isDelta?'Delta':'';nameSuffix+=Unit.nameSuffixForImprovementDirection(improvementDirection);const unitName=params.baseUnitName+nameSuffix;const jsonName=params.baseJsonName+nameSuffix;if(Unit.byName[unitName]!==undefined){throw new Error('Unit \''+unitName+'\' already exists');}
-if(Unit.byJSONName[jsonName]!==undefined){throw new Error('JSON unit \''+jsonName+'\' alread exists');}
-let scaleBaseUnit=params.scaleBaseUnit;if(!scaleBaseUnit){let formatSpec=params.formatSpec;if(typeof formatSpec==='function')formatSpec=formatSpec();const baseSymbol=formatSpec.unitScale?formatSpec.unitScale[0].baseSymbol:(formatSpec.baseSymbol||'');scaleBaseUnit={value:1,symbol:baseSymbol,baseSymbol};}
-const unit=new Unit(unitName,jsonName,scaleBaseUnit,isDelta,improvementDirection,params.formatSpec);Unit.byName[unitName]=unit;Unit.byJSONName[jsonName]=unit;return unit;};tr.b.EventTarget.decorate(Unit);Unit.reset();Unit.define({baseUnitName:'timeInMsAutoFormat',baseJsonName:'msBestFitFormat',scaleBaseUnit:tr.b.UnitScale.TIME.MILLI_SEC,formatSpec:{unitScale:tr.b.UnitScale.TIME.AUTO,minimumFractionDigits:0,maximumFractionDigits:3}});Unit.define({baseUnitName:'timeDurationInMs',baseJsonName:'ms',scaleBaseUnit:tr.b.UnitScale.TIME.MILLI_SEC,formatSpec(){return Unit.currentTimeDisplayMode_.formatSpec;}});Unit.define({baseUnitName:'timeStampInMs',baseJsonName:'tsMs',scaleBaseUnit:tr.b.UnitScale.TIME.MILLI_SEC,formatSpec(){return Unit.currentTimeDisplayMode_.formatSpec;}});Unit.define({baseUnitName:'normalizedPercentage',baseJsonName:'n%',formatSpec:{unitScale:[{value:0.01,symbol:'%'}],avoidSpacePrecedingUnit:true,minimumFractionDigits:1,maximumFractionDigits:1}});Unit.define({baseUnitName:'sizeInBytes',baseJsonName:'sizeInBytes',formatSpec:{unitScale:tr.b.UnitScale.MEMORY.AUTO,minimumFractionDigits:1,maximumFractionDigits:1}});Unit.define({baseUnitName:'bandwidthInBytesPerSecond',baseJsonName:'bytesPerSecond',formatSpec:{unitScale:tr.b.UnitScale.BANDWIDTH_BYTES.AUTO,minimumFractionDigits:1,maximumFractionDigits:1}});Unit.define({baseUnitName:'energyInJoules',baseJsonName:'J',formatSpec:{unitScale:tr.b.UnitScale.defineUnitScaleFromPrefixScale('J','JOULE',tr.b.UnitPrefixScale.METRIC,'JOULE').AUTO,minimumFractionDigits:3}});Unit.define({baseUnitName:'powerInWatts',baseJsonName:'W',formatSpec:{unitScale:tr.b.UnitScale.defineUnitScaleFromPrefixScale('W','WATT',tr.b.UnitPrefixScale.METRIC,'WATT').AUTO,minimumFractionDigits:3}});Unit.define({baseUnitName:'electricCurrentInAmperes',baseJsonName:'A',formatSpec:{baseSymbol:'A',unitScale:tr.b.UnitScale.defineUnitScaleFromPrefixScale('A','AMPERE',tr.b.UnitPrefixScale.METRIC,'AMPERE').AUTO,minimumFractionDigits:3}});Unit.define({baseUnitName:'batteryChargeInAmpereHours',baseJsonName:'Ah',formatSpec:{baseSymbol:'Ah',unitScale:tr.b.UnitScale.defineUnitScaleFromPrefixScale('Ah','AMPEREHOUR',tr.b.UnitPrefixScale.METRIC,'AMPEREHOUR').AUTO,minimumFractionDigits:3}});Unit.define({baseUnitName:'electricPotentialInVolts',baseJsonName:'V',formatSpec:{baseSymbol:'V',unitScale:tr.b.UnitScale.defineUnitScaleFromPrefixScale('V','VOLT',tr.b.UnitPrefixScale.METRIC,'VOLT').AUTO,minimumFractionDigits:3}});Unit.define({baseUnitName:'frequencyInHertz',baseJsonName:'Hz',formatSpec:{baseSymbol:'Hz',unitScale:tr.b.UnitScale.defineUnitScaleFromPrefixScale('Hz','HERTZ',tr.b.UnitPrefixScale.METRIC,'HERTZ').AUTO,minimumFractionDigits:3}});Unit.define({baseUnitName:'unitlessNumber',baseJsonName:'unitless',formatSpec:{minimumFractionDigits:3,maximumFractionDigits:3}});Unit.define({baseUnitName:'count',baseJsonName:'count',formatSpec:{minimumFractionDigits:0,maximumFractionDigits:0}});Unit.define({baseUnitName:'sigma',baseJsonName:'sigma',formatSpec:{baseSymbol:String.fromCharCode(963),minimumFractionDigits:1,maximumFractionDigits:1}});return{ImprovementDirection,Unit,};});'use strict';tr.exportTo('tr.b',function(){class Scalar{constructor(unit,value){if(!(unit instanceof tr.b.Unit)){throw new Error('Expected Unit');}
-if(!(typeof(value)==='number')){throw new Error('Expected value to be number');}
-this.unit=unit;this.value=value;}
-asDict(){return{unit:this.unit.asJSON(),value:tr.b.numberToJson(this.value),};}
-toString(){return this.unit.format(this.value);}
-static fromDict(d){return new Scalar(tr.b.Unit.fromJSON(d.unit),tr.b.numberFromJson(d.value));}}
-return{Scalar,};});'use strict';tr.exportTo('tr.c',function(){function Auditor(model){this.model_=model;}
-Auditor.prototype={__proto__:Object.prototype,get model(){return this.model_;},runAnnotate(){},installUserFriendlyCategoryDriverIfNeeded(){},runAudit(){}};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Auditor;tr.b.decorateExtensionRegistry(Auditor,options);return{Auditor,};});'use strict';tr.exportTo('tr.b',function(){function clamp01(value){return Math.max(0,Math.min(1,value));}
-function Color(opt_r,opt_g,opt_b,opt_a){this.r=Math.floor(opt_r)||0;this.g=Math.floor(opt_g)||0;this.b=Math.floor(opt_b)||0;this.a=opt_a;}
-Color.fromString=function(str){let tmp;let values;if(str.substr(0,4)==='rgb('){tmp=str.substr(4,str.length-5);values=tmp.split(',').map(function(v){return v.replace(/^\s+/,'','g');});if(values.length!==3){throw new Error('Malformatted rgb-expression');}
-return new Color(parseInt(values[0]),parseInt(values[1]),parseInt(values[2]));}
-if(str.substr(0,5)==='rgba('){tmp=str.substr(5,str.length-6);values=tmp.split(',').map(function(v){return v.replace(/^\s+/,'','g');});if(values.length!==4){throw new Error('Malformatted rgb-expression');}
-return new Color(parseInt(values[0]),parseInt(values[1]),parseInt(values[2]),parseFloat(values[3]));}
-if(str[0]==='#'&&str.length===7){return new Color(parseInt(str.substr(1,2),16),parseInt(str.substr(3,2),16),parseInt(str.substr(5,2),16));}
-throw new Error('Unrecognized string format.');};Color.lerp=function(a,b,percent){if(a.a!==undefined&&b.a!==undefined){return Color.lerpRGBA(a,b,percent);}
-return Color.lerpRGB(a,b,percent);};Color.lerpRGB=function(a,b,percent){return new Color(((b.r-a.r)*percent)+a.r,((b.g-a.g)*percent)+a.g,((b.b-a.b)*percent)+a.b);};Color.lerpRGBA=function(a,b,percent){return new Color(((b.r-a.r)*percent)+a.r,((b.g-a.g)*percent)+a.g,((b.b-a.b)*percent)+a.b,((b.a-a.a)*percent)+a.a);};Color.fromDict=function(dict){return new Color(dict.r,dict.g,dict.b,dict.a);};Color.fromHSLExplicit=function(h,s,l,a){let r;let g;let b;function hue2rgb(p,q,t){if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*(2/3-t)*6;return p;}
-if(s===0){r=g=b=l;}else{const q=l<0.5?l*(1+s):l+s-l*s;const p=2*l-q;r=hue2rgb(p,q,h+1/3);g=hue2rgb(p,q,h);b=hue2rgb(p,q,h-1/3);}
-return new Color(Math.floor(r*255),Math.floor(g*255),Math.floor(b*255),a);};Color.fromHSL=function(hsl){return Color.fromHSLExplicit(hsl.h,hsl.s,hsl.l,hsl.a);};Color.prototype={clone(){const c=new Color();c.r=this.r;c.g=this.g;c.b=this.b;c.a=this.a;return c;},blendOver(bgColor){const oneMinusThisAlpha=1-this.a;const outA=this.a+bgColor.a*oneMinusThisAlpha;const bgBlend=(bgColor.a*oneMinusThisAlpha)/bgColor.a;return new Color(this.r*this.a+bgColor.r*bgBlend,this.g*this.a+bgColor.g*bgBlend,this.b*this.a+bgColor.b*bgBlend,outA);},brighten(opt_k){const k=opt_k||0.45;return new Color(Math.min(255,this.r+Math.floor(this.r*k)),Math.min(255,this.g+Math.floor(this.g*k)),Math.min(255,this.b+Math.floor(this.b*k)),this.a);},lighten(k,opt_maxL){const maxL=opt_maxL!==undefined?opt_maxL:1.0;const hsl=this.toHSL();hsl.l=Math.min(hsl.l+k,maxL);return Color.fromHSL(hsl);},darken(opt_k){let k;if(opt_k!==undefined){k=opt_k;}else{k=0.45;}
-return new Color(Math.min(255,this.r-Math.floor(this.r*k)),Math.min(255,this.g-Math.floor(this.g*k)),Math.min(255,this.b-Math.floor(this.b*k)),this.a);},desaturate(opt_desaturateFactor){let desaturateFactor;if(opt_desaturateFactor!==undefined){desaturateFactor=opt_desaturateFactor;}else{desaturateFactor=1;}
-const hsl=this.toHSL();hsl.s=clamp01(hsl.s*(1-desaturateFactor));return Color.fromHSL(hsl);},withAlpha(a){return new Color(this.r,this.g,this.b,a);},toString(){if(this.a!==undefined){return'rgba('+
-this.r+','+this.g+','+
-this.b+','+this.a+')';}
-return'rgb('+this.r+','+this.g+','+this.b+')';},toHSL(){const r=this.r/255;const g=this.g/255;const b=this.b/255;const max=Math.max(r,g,b);const min=Math.min(r,g,b);let h;let s;const l=(max+min)/2;if(min===max){h=0;s=0;}else{const delta=max-min;if(l>0.5){s=delta/(2-max-min);}else{s=delta/(max+min);}
-if(r===max){h=(g-b)/delta;if(g<b)h+=6;}else if(g===max){h=2+((b-r)/delta);}else{h=4+((r-g)/delta);}
-h/=6;}
-return{h,s,l,a:this.a};},toStringWithAlphaOverride(alpha){return'rgba('+
-this.r+','+this.g+','+
-this.b+','+alpha+')';}};return{Color,};});'use strict';tr.exportTo('tr.b',function(){function SinebowColorGenerator(opt_a,opt_brightness){this.a_=(opt_a===undefined)?1:opt_a;this.brightness_=(opt_brightness===undefined)?1:opt_brightness;this.colorIndex_=0;this.keyToColor={};}
-SinebowColorGenerator.prototype={colorForKey(key){if(!this.keyToColor[key]){this.keyToColor[key]=this.nextColor();}
-return this.keyToColor[key];},nextColor(){const components=SinebowColorGenerator.nthColor(this.colorIndex_++);return tr.b.Color.fromString(SinebowColorGenerator.calculateColor(components[0],components[1],components[2],this.a_,this.brightness_));}};SinebowColorGenerator.PHI=(1+Math.sqrt(5))/2;SinebowColorGenerator.sinebow=function(h){h+=0.5;h=-h;let r=Math.sin(Math.PI*h);let g=Math.sin(Math.PI*(h+1/3));let b=Math.sin(Math.PI*(h+2/3));r*=r;g*=g;b*=b;const y=2*(0.2989*r+0.5870*g+0.1140*b);r/=y;g/=y;b/=y;return[256*r,256*g,256*b];};SinebowColorGenerator.nthColor=function(n){return SinebowColorGenerator.sinebow(n*this.PHI);};SinebowColorGenerator.calculateColor=function(r,g,b,a,brightness){if(brightness<=1){r*=brightness;g*=brightness;b*=brightness;}else{r=tr.b.math.lerp(tr.b.math.normalize(brightness,1,2),r,255);g=tr.b.math.lerp(tr.b.math.normalize(brightness,1,2),g,255);b=tr.b.math.lerp(tr.b.math.normalize(brightness,1,2),b,255);}
-r=Math.round(r);g=Math.round(g);b=Math.round(b);return'rgba('+r+','+g+','+b+', '+a+')';};return{SinebowColorGenerator,};});'use strict';tr.exportTo('tr.b',function(){const numGeneralPurposeColorIds=23;const generalPurposeColors=new Array(numGeneralPurposeColorIds);const sinebowAlpha=1.0;const sinebowBrightness=1.5;const sinebowColorGenerator=new tr.b.SinebowColorGenerator(sinebowAlpha,sinebowBrightness);for(let i=0;i<numGeneralPurposeColorIds;i++){generalPurposeColors[i]=sinebowColorGenerator.nextColor();}
-const reservedColorsByName={thread_state_uninterruptible:new tr.b.Color(182,125,143),thread_state_iowait:new tr.b.Color(255,140,0),thread_state_running:new tr.b.Color(126,200,148),thread_state_runnable:new tr.b.Color(133,160,210),thread_state_sleeping:new tr.b.Color(240,240,240),thread_state_unknown:new tr.b.Color(199,155,125),background_memory_dump:new tr.b.Color(0,180,180),light_memory_dump:new tr.b.Color(0,0,180),detailed_memory_dump:new tr.b.Color(180,0,180),vsync_highlight_color:new tr.b.Color(0,0,255),generic_work:new tr.b.Color(125,125,125),good:new tr.b.Color(0,125,0),bad:new tr.b.Color(180,125,0),terrible:new tr.b.Color(180,0,0),black:new tr.b.Color(0,0,0),grey:new tr.b.Color(221,221,221),white:new tr.b.Color(255,255,255),yellow:new tr.b.Color(255,255,0),olive:new tr.b.Color(100,100,0),rail_response:new tr.b.Color(67,135,253),rail_animation:new tr.b.Color(244,74,63),rail_idle:new tr.b.Color(238,142,0),rail_load:new tr.b.Color(13,168,97),startup:new tr.b.Color(230,230,0),heap_dump_stack_frame:new tr.b.Color(128,128,128),heap_dump_object_type:new tr.b.Color(0,0,255),heap_dump_child_node_arrow:new tr.b.Color(204,102,0),cq_build_running:new tr.b.Color(255,255,119),cq_build_passed:new tr.b.Color(153,238,102),cq_build_failed:new tr.b.Color(238,136,136),cq_build_abandoned:new tr.b.Color(187,187,187),cq_build_attempt_runnig:new tr.b.Color(222,222,75),cq_build_attempt_passed:new tr.b.Color(103,218,35),cq_build_attempt_failed:new tr.b.Color(197,81,81)};const numReservedColorIds=Object.keys(reservedColorsByName).length;const numColorsPerVariant=numGeneralPurposeColorIds+numReservedColorIds;function ColorScheme(){}
-const paletteBase=[];paletteBase.push.apply(paletteBase,generalPurposeColors);paletteBase.push.apply(paletteBase,Object.values(reservedColorsByName));ColorScheme.colors=[];ColorScheme.properties={};ColorScheme.properties={numColorsPerVariant,};function pushVariant(func){const variantColors=paletteBase.map(func);ColorScheme.colors.push.apply(ColorScheme.colors,variantColors);}
-pushVariant(function(c){return c;});ColorScheme.properties.brightenedOffsets=[];ColorScheme.properties.brightenedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.lighten(0.3,0.8);});ColorScheme.properties.brightenedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.lighten(0.48,0.85);});ColorScheme.properties.brightenedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.lighten(0.65,0.9);});ColorScheme.properties.dimmedOffsets=[];ColorScheme.properties.dimmedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.desaturate();});ColorScheme.properties.dimmedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.desaturate(0.5);});ColorScheme.properties.dimmedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.desaturate(0.3);});ColorScheme.colorsAsStrings=ColorScheme.colors.map(function(c){return c.toString();});const reservedColorNameToIdMap=(function(){const m=new Map();let i=generalPurposeColors.length;for(const key of Object.keys(reservedColorsByName)){m.set(key,i++);}
-return m;})();ColorScheme.getColorIdForReservedName=function(name){const id=reservedColorNameToIdMap.get(name);if(id===undefined){throw new Error('Unrecognized color '+name);}
-return id;};ColorScheme.getColorForReservedNameAsString=function(reservedName){const id=ColorScheme.getColorIdForReservedName(reservedName);return ColorScheme.colorsAsStrings[id];};ColorScheme.getStringHash=function(name){let hash=0;for(let i=0;i<name.length;++i){hash=(hash+37*hash+11*name.charCodeAt(i))%0xFFFFFFFF;}
-return hash;};const stringColorIdCache=new Map();ColorScheme.getColorIdForGeneralPurposeString=function(string){if(stringColorIdCache.get(string)===undefined){const hash=ColorScheme.getStringHash(string);stringColorIdCache.set(string,hash%numGeneralPurposeColorIds);}
-return stringColorIdCache.get(string);};ColorScheme.getAnotherColorId=function(colorId,n){return(colorId+n)%numColorsPerVariant;};ColorScheme.getVariantColorId=function(colorId,offset){return colorId+offset;};return{ColorScheme,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;function EventInfo(title,description,docLinks){this.title=title;this.description=description;this.docLinks=docLinks;this.colorId=ColorScheme.getColorIdForGeneralPurposeString(title);}
-return{EventInfo,};});'use strict';tr.exportTo('tr.b',function(){let nextGUID=1;const UUID4_PATTERN='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';const GUID={allocateSimple(){return nextGUID++;},getLastSimpleGuid(){return nextGUID-1;},allocateUUID4(){return UUID4_PATTERN.replace(/[xy]/g,function(c){let r=parseInt(Math.random()*16);if(c==='y')r=(r&3)+8;return r.toString(16);});}};return{GUID,};});'use strict';tr.exportTo('tr.model',function(){function EventRegistry(){}
-const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(EventRegistry,options);EventRegistry.addEventListener('will-register',function(e){const metadata=e.typeInfo.metadata;if(metadata.name===undefined){throw new Error('Registered events must provide name metadata');}
-if(metadata.pluralName===undefined){throw new Error('Registered events must provide pluralName metadata');}
-if(metadata.subTypes===undefined){metadata.subTypes={};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);options.mandatoryBaseClass=e.typeInfo.constructor;options.defaultConstructor=e.typeInfo.constructor;tr.b.decorateExtensionRegistry(metadata.subTypes,options);}else{if(!metadata.subTypes.register){throw new Error('metadata.subTypes must be an extension registry.');}}
-e.typeInfo.constructor.subTypes=metadata.subTypes;});let eventsByTypeName=undefined;EventRegistry.getEventTypeInfoByTypeName=function(typeName){if(eventsByTypeName===undefined){eventsByTypeName={};EventRegistry.getAllRegisteredTypeInfos().forEach(function(typeInfo){eventsByTypeName[typeInfo.metadata.name]=typeInfo;});}
-return eventsByTypeName[typeName];};EventRegistry.addEventListener('registry-changed',function(){eventsByTypeName=undefined;});function convertCamelCaseToTitleCase(name){let result=name.replace(/[A-Z]/g,' $&');result=result.charAt(0).toUpperCase()+result.slice(1);return result;}
-EventRegistry.getUserFriendlySingularName=function(typeName){const typeInfo=EventRegistry.getEventTypeInfoByTypeName(typeName);const str=typeInfo.metadata.name;return convertCamelCaseToTitleCase(str);};EventRegistry.getUserFriendlyPluralName=function(typeName){const typeInfo=EventRegistry.getEventTypeInfoByTypeName(typeName);const str=typeInfo.metadata.pluralName;return convertCamelCaseToTitleCase(str);};return{EventRegistry,};});'use strict';tr.exportTo('tr.model',function(){const EventRegistry=tr.model.EventRegistry;const RequestSelectionChangeEvent=tr.b.Event.bind(undefined,'requestSelectionChange',true,false);function EventSet(opt_events){this.bounds_=new tr.b.math.Range();this.events_=new Set();this.guid_=tr.b.GUID.allocateSimple();if(opt_events){if(opt_events instanceof Array){for(const event of opt_events){this.push(event);}}else if(opt_events instanceof EventSet){this.addEventSet(opt_events);}else{this.push(opt_events);}}}
-EventSet.prototype={__proto__:Object.prototype,get bounds(){return this.bounds_;},get duration(){if(this.bounds_.isEmpty)return 0;return this.bounds_.max-this.bounds_.min;},get length(){return this.events_.size;},get guid(){return this.guid_;},*[Symbol.iterator](){for(const event of this.events_){yield event;}},clear(){this.bounds_=new tr.b.math.Range();this.events_.clear();},push(...events){let numPushed;for(const event of events){if(event.guid===undefined){throw new Error('Event must have a GUID');}
-if(!this.events_.has(event)){this.events_.add(event);if(event.addBoundsToRange){if(this.bounds_!==undefined){event.addBoundsToRange(this.bounds_);}}}
-numPushed++;}
-return numPushed;},contains(event){if(this.events_.has(event))return event;return undefined;},addEventSet(eventSet){for(const event of eventSet){this.push(event);}},intersectionIsEmpty(otherEventSet){return!this.some(event=>otherEventSet.contains(event));},equals(that){if(this.length!==that.length)return false;return this.every(event=>that.contains(event));},sortEvents(compare){const ary=this.toArray();ary.sort(compare);this.clear();for(const event of ary){this.push(event);}},getEventsOrganizedByBaseType(opt_pruneEmpty){const allTypeInfos=EventRegistry.getAllRegisteredTypeInfos();const events=this.getEventsOrganizedByCallback(function(event){let maxEventIndex=-1;let maxEventTypeInfo=undefined;allTypeInfos.forEach(function(eventTypeInfo,eventIndex){if(!(event instanceof eventTypeInfo.constructor))return;if(eventIndex>maxEventIndex){maxEventIndex=eventIndex;maxEventTypeInfo=eventTypeInfo;}});if(maxEventIndex===-1){throw new Error(`Unrecognized event type: ${event.constructor.name}`);}
-return maxEventTypeInfo.metadata.name;});if(!opt_pruneEmpty){allTypeInfos.forEach(function(eventTypeInfo){if(events[eventTypeInfo.metadata.name]===undefined){events[eventTypeInfo.metadata.name]=new EventSet();}});}
-return events;},getEventsOrganizedByTitle(){return this.getEventsOrganizedByCallback(function(event){if(event.title===undefined){throw new Error('An event didn\'t have a title!');}
-return event.title;});},getEventsOrganizedByCallback(cb,opt_this){const groupedEvents=tr.b.groupIntoMap(this,cb,opt_this||this);const groupedEventsDict={};for(const[k,events]of groupedEvents){groupedEventsDict[k]=new EventSet(events);}
-return groupedEventsDict;},enumEventsOfType(type,func){for(const event of this){if(event instanceof type){func(event);}}},get userFriendlyName(){if(this.length===0){throw new Error('Empty event set');}
-const eventsByBaseType=this.getEventsOrganizedByBaseType(true);const eventTypeName=Object.keys(eventsByBaseType)[0];if(this.length===1){const tmp=EventRegistry.getUserFriendlySingularName(eventTypeName);return tr.b.getOnlyElement(this.events_).userFriendlyName;}
-const numEventTypes=Object.keys(eventsByBaseType).length;if(numEventTypes!==1){return this.length+' events of various types';}
-const tmp=EventRegistry.getUserFriendlyPluralName(eventTypeName);return this.length+' '+tmp;},filter(fn,opt_this){const res=new EventSet();for(const event of this){if(fn.call(opt_this,event)){res.push(event);}}
-return res;},toArray(){const ary=[];for(const event of this){ary.push(event);}
-return ary;},forEach(fn,opt_this){for(const event of this){fn.call(opt_this,event);}},map(fn,opt_this){const res=[];for(const event of this){res.push(fn.call(opt_this,event));}
-return res;},every(fn,opt_this){for(const event of this){if(!fn.call(opt_this,event)){return false;}}
-return true;},some(fn,opt_this){for(const event of this){if(fn.call(opt_this,event)){return true;}}
-return false;},asDict(){const stableIds=[];for(const event of this){stableIds.push(event.stableId);}
-return{'events':stableIds};},asSet(){return this.events_;}};EventSet.IMMUTABLE_EMPTY_SET=(function(){const s=new EventSet();s.push=function(){throw new Error('Cannot push to an immutable event set');};s.addEventSet=function(){throw new Error('Cannot add to an immutable event set');};Object.freeze(s);return s;})();return{EventSet,RequestSelectionChangeEvent,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const SelectionState={NONE:0,SELECTED:ColorScheme.properties.brightenedOffsets[0],HIGHLIGHTED:ColorScheme.properties.brightenedOffsets[1],DIMMED:ColorScheme.properties.dimmedOffsets[0],BRIGHTENED0:ColorScheme.properties.brightenedOffsets[0],BRIGHTENED1:ColorScheme.properties.brightenedOffsets[1],BRIGHTENED2:ColorScheme.properties.brightenedOffsets[2],DIMMED0:ColorScheme.properties.dimmedOffsets[0],DIMMED1:ColorScheme.properties.dimmedOffsets[1],DIMMED2:ColorScheme.properties.dimmedOffsets[2]};const brighteningLevels=[SelectionState.NONE,SelectionState.BRIGHTENED0,SelectionState.BRIGHTENED1,SelectionState.BRIGHTENED2];SelectionState.getFromBrighteningLevel=function(level){return brighteningLevels[level];};const dimmingLevels=[SelectionState.DIMMED0,SelectionState.DIMMED1,SelectionState.DIMMED2];SelectionState.getFromDimmingLevel=function(level){return dimmingLevels[level];};return{SelectionState,};});'use strict';tr.exportTo('tr.model',function(){const SelectionState=tr.model.SelectionState;function SelectableItem(modelItem){this.modelItem_=modelItem;}
-SelectableItem.prototype={get modelItem(){return this.modelItem_;},get selected(){return this.selectionState===SelectionState.SELECTED;},addToSelection(selection){const modelItem=this.modelItem_;if(!modelItem)return;selection.push(modelItem);},addToTrackMap(eventToTrackMap,track){const modelItem=this.modelItem_;if(!modelItem)return;eventToTrackMap.addEvent(modelItem,track);}};return{SelectableItem,};});'use strict';tr.exportTo('tr.model',function(){const SelectableItem=tr.model.SelectableItem;const SelectionState=tr.model.SelectionState;const IMMUTABLE_EMPTY_SET=tr.model.EventSet.IMMUTABLE_EMPTY_SET;function Event(){SelectableItem.call(this,this);this.guid_=tr.b.GUID.allocateSimple();this.selectionState=SelectionState.NONE;this.info=undefined;}
-Event.prototype={__proto__:SelectableItem.prototype,get guid(){return this.guid_;},get stableId(){return undefined;},get range(){const range=new tr.b.math.Range();this.addBoundsToRange(range);return range;},associatedAlerts:IMMUTABLE_EMPTY_SET,addAssociatedAlert(alert){if(this.associatedAlerts===IMMUTABLE_EMPTY_SET){this.associatedAlerts=new tr.model.EventSet();}
-this.associatedAlerts.push(alert);},addBoundsToRange(range){}};return{Event,};});'use strict';tr.exportTo('tr.model',function(){function TimedEvent(start){tr.model.Event.call(this);this.start=start;this.duration=0;this.cpuStart=undefined;this.cpuDuration=undefined;this.contexts=Object.freeze([]);}
-TimedEvent.prototype={__proto__:tr.model.Event.prototype,get end(){return this.start+this.duration;},get boundsRange(){return tr.b.math.Range.fromExplicitRange(this.start,this.end);},addBoundsToRange(range){range.addValue(this.start);range.addValue(this.end);},bounds(that,opt_precisionUnit){if(opt_precisionUnit===undefined){opt_precisionUnit=tr.b.TimeDisplayModes.ms;}
-const startsBefore=opt_precisionUnit.roundedLess(that.start,this.start);const endsAfter=opt_precisionUnit.roundedLess(this.end,that.end);return!startsBefore&&!endsAfter;}};return{TimedEvent,};});'use strict';tr.exportTo('tr.model',function(){function Alert(info,start,opt_associatedEvents,opt_args){tr.model.TimedEvent.call(this,start);this.info=info;this.args=opt_args||{};this.associatedEvents=new tr.model.EventSet(opt_associatedEvents);this.associatedEvents.forEach(function(event){event.addAssociatedAlert(this);},this);}
-Alert.prototype={__proto__:tr.model.TimedEvent.prototype,get title(){return this.info.title;},get colorId(){return this.info.colorId;},get userFriendlyName(){return'Alert '+this.title+' at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);}};tr.model.EventRegistry.register(Alert,{name:'alert',pluralName:'alerts'});return{Alert,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const Statistics=tr.b.math.Statistics;const FRAME_PERF_CLASS={GOOD:'good',BAD:'bad',TERRIBLE:'terrible',NEUTRAL:'generic_work'};function Frame(associatedEvents,threadTimeRanges,opt_args){tr.model.Event.call(this);this.threadTimeRanges=threadTimeRanges;this.associatedEvents=new tr.model.EventSet(associatedEvents);this.args=opt_args||{};this.title='Frame';this.start=Statistics.min(threadTimeRanges,function(x){return x.start;});this.end=Statistics.max(threadTimeRanges,function(x){return x.end;});this.totalDuration=Statistics.sum(threadTimeRanges,function(x){return x.end-x.start;});this.perfClass=FRAME_PERF_CLASS.NEUTRAL;}
-Frame.prototype={__proto__:tr.model.Event.prototype,set perfClass(perfClass){this.colorId=ColorScheme.getColorIdForReservedName(perfClass);this.perfClass_=perfClass;},get perfClass(){return this.perfClass_;},shiftTimestampsForward(amount){this.start+=amount;this.end+=amount;for(let i=0;i<this.threadTimeRanges.length;i++){this.threadTimeRanges[i].start+=amount;this.threadTimeRanges[i].end+=amount;}},addBoundsToRange(range){range.addValue(this.start);range.addValue(this.end);}};tr.model.EventRegistry.register(Frame,{name:'frame',pluralName:'frames'});return{Frame,FRAME_PERF_CLASS,};});'use strict';tr.exportTo('tr.model.helpers',function(){const Frame=tr.model.Frame;const Statistics=tr.b.math.Statistics;const UI_DRAW_TYPE={NONE:'none',LEGACY:'legacy',MARSHMALLOW:'marshmallow'};const UI_THREAD_DRAW_NAMES={'performTraversals':UI_DRAW_TYPE.LEGACY,'Choreographer#doFrame':UI_DRAW_TYPE.MARSHMALLOW};const RENDER_THREAD_DRAW_NAME='DrawFrame';const RENDER_THREAD_INDEP_DRAW_NAME='doFrame';const RENDER_THREAD_QUEUE_NAME='queueBuffer';const RENDER_THREAD_SWAP_NAME='eglSwapBuffers';const THREAD_SYNC_NAME='syncFrameState';function getSlicesForThreadTimeRanges(threadTimeRanges){const ret=[];threadTimeRanges.forEach(function(threadTimeRange){const slices=[];threadTimeRange.thread.sliceGroup.iterSlicesInTimeRange(function(slice){slices.push(slice);},threadTimeRange.start,threadTimeRange.end);ret.push.apply(ret,slices);});return ret;}
-function makeFrame(threadTimeRanges,surfaceFlinger){const args={};if(surfaceFlinger&&surfaceFlinger.hasVsyncs){const start=Statistics.min(threadTimeRanges,function(threadTimeRanges){return threadTimeRanges.start;});args.deadline=surfaceFlinger.getFrameDeadline(start);args.frameKickoff=surfaceFlinger.getFrameKickoff(start);}
-const events=getSlicesForThreadTimeRanges(threadTimeRanges);return new Frame(events,threadTimeRanges,args);}
-function findOverlappingDrawFrame(renderThread,uiDrawSlice){if(!renderThread)return undefined;let overlappingDrawFrame;const slices=tr.b.iterateOverIntersectingIntervals(renderThread.sliceGroup.slices,function(range){return range.start;},function(range){return range.end;},uiDrawSlice.start,uiDrawSlice.end,function(rtDrawSlice){if(rtDrawSlice.title===RENDER_THREAD_DRAW_NAME){const rtSyncSlice=rtDrawSlice.findDescendentSlice(THREAD_SYNC_NAME);if(rtSyncSlice&&rtSyncSlice.start>=uiDrawSlice.start&&rtSyncSlice.end<=uiDrawSlice.end){overlappingDrawFrame=rtDrawSlice;}}});return overlappingDrawFrame;}
-function getPreTraversalWorkRanges(uiThread){if(!uiThread)return[];const preFrameEvents=[];uiThread.sliceGroup.slices.forEach(function(slice){if(slice.title==='obtainView'||slice.title==='setupListItem'||slice.title==='deliverInputEvent'||slice.title==='RV Scroll'){preFrameEvents.push(slice);}});uiThread.asyncSliceGroup.slices.forEach(function(slice){if(slice.title==='deliverInputEvent'){preFrameEvents.push(slice);}});return tr.b.math.mergeRanges(tr.b.math.convertEventsToRanges(preFrameEvents),3,function(events){return{start:events[0].min,end:events[events.length-1].max};});}
-function getFrameStartTime(traversalStart,preTraversalWorkRanges){const preTraversalWorkRange=tr.b.findClosestIntervalInSortedIntervals(preTraversalWorkRanges,function(range){return range.start;},function(range){return range.end;},traversalStart,3);if(preTraversalWorkRange){return preTraversalWorkRange.start;}
-return traversalStart;}
-function getRtFrameEndTime(rtDrawSlice){const rtQueueSlice=rtDrawSlice.findDescendentSlice(RENDER_THREAD_QUEUE_NAME);if(rtQueueSlice){return rtQueueSlice.end;}
-const rtSwapSlice=rtDrawSlice.findDescendentSlice(RENDER_THREAD_SWAP_NAME);if(rtSwapSlice){return rtSwapSlice.end;}
-return rtDrawSlice.end;}
-function getUiThreadDrivenFrames(app){if(!app.uiThread)return[];let preTraversalWorkRanges=[];if(app.uiDrawType===UI_DRAW_TYPE.LEGACY){preTraversalWorkRanges=getPreTraversalWorkRanges(app.uiThread);}
-const frames=[];app.uiThread.sliceGroup.slices.forEach(function(slice){if(!(slice.title in UI_THREAD_DRAW_NAMES)){return;}
-const threadTimeRanges=[];const uiThreadTimeRange={thread:app.uiThread,start:getFrameStartTime(slice.start,preTraversalWorkRanges),end:slice.end};threadTimeRanges.push(uiThreadTimeRange);const rtDrawSlice=findOverlappingDrawFrame(app.renderThread,slice);if(rtDrawSlice){const rtSyncSlice=rtDrawSlice.findDescendentSlice(THREAD_SYNC_NAME);if(rtSyncSlice){uiThreadTimeRange.end=Math.min(uiThreadTimeRange.end,rtSyncSlice.start);}
-threadTimeRanges.push({thread:app.renderThread,start:rtDrawSlice.start,end:getRtFrameEndTime(rtDrawSlice)});}
-frames.push(makeFrame(threadTimeRanges,app.surfaceFlinger));});return frames;}
-function getRenderThreadDrivenFrames(app){if(!app.renderThread)return[];const frames=[];app.renderThread.sliceGroup.getSlicesOfName(RENDER_THREAD_INDEP_DRAW_NAME).forEach(function(slice){const threadTimeRanges=[{thread:app.renderThread,start:slice.start,end:slice.end}];frames.push(makeFrame(threadTimeRanges,app.surfaceFlinger));});return frames;}
-function getUiDrawType(uiThread){if(!uiThread){return UI_DRAW_TYPE.NONE;}
-const slices=uiThread.sliceGroup.slices;for(let i=0;i<slices.length;i++){if(slices[i].title in UI_THREAD_DRAW_NAMES){return UI_THREAD_DRAW_NAMES[slices[i].title];}}
-return UI_DRAW_TYPE.NONE;}
-function getInputSamples(process){let samples=undefined;for(const counterName in process.counters){if(/^android\.aq\:pending/.test(counterName)&&process.counters[counterName].numSeries===1){samples=process.counters[counterName].series[0].samples;break;}}
-if(!samples)return[];const inputSamples=[];let lastValue=0;samples.forEach(function(sample){if(sample.value>lastValue){inputSamples.push(sample);}
-lastValue=sample.value;});return inputSamples;}
-function getAnimationAsyncSlices(uiThread){if(!uiThread)return[];const slices=[];for(const slice of uiThread.asyncSliceGroup.getDescendantEvents()){if(/^animator\:/.test(slice.title)){slices.push(slice);}}
-return slices;}
-function AndroidApp(process,uiThread,renderThread,surfaceFlinger,uiDrawType){this.process=process;this.uiThread=uiThread;this.renderThread=renderThread;this.surfaceFlinger=surfaceFlinger;this.uiDrawType=uiDrawType;this.frames_=undefined;this.inputs_=undefined;}
-AndroidApp.createForProcessIfPossible=function(process,surfaceFlinger){let uiThread=process.getThread(process.pid);const uiDrawType=getUiDrawType(uiThread);if(uiDrawType===UI_DRAW_TYPE.NONE){uiThread=undefined;}
-const renderThreads=process.findAllThreadsNamed('RenderThread');const renderThread=(renderThreads.length===1?renderThreads[0]:undefined);if(uiThread||renderThread){return new AndroidApp(process,uiThread,renderThread,surfaceFlinger,uiDrawType);}};AndroidApp.prototype={getFrames(){if(!this.frames_){const uiFrames=getUiThreadDrivenFrames(this);const rtFrames=getRenderThreadDrivenFrames(this);this.frames_=uiFrames.concat(rtFrames);this.frames_.sort(function(a,b){a.end-b.end;});}
-return this.frames_;},getInputSamples(){if(!this.inputs_){this.inputs_=getInputSamples(this.process);}
-return this.inputs_;},getAnimationAsyncSlices(){if(!this.animations_){this.animations_=getAnimationAsyncSlices(this.uiThread);}
-return this.animations_;}};return{AndroidApp,};});'use strict';tr.exportTo('tr.model.helpers',function(){const findLowIndexInSortedArray=tr.b.findLowIndexInSortedArray;const VSYNC_SF_NAME='android.VSYNC-sf';const VSYNC_APP_NAME='android.VSYNC-app';const VSYNC_FALLBACK_NAME='android.VSYNC';const TIMESTAMP_FUDGE_MS=0.01;function getVsyncTimestamps(process,counterName){let vsync=process.counters[counterName];if(!vsync){vsync=process.counters[VSYNC_FALLBACK_NAME];}
-if(vsync&&vsync.numSeries===1&&vsync.numSamples>1){return vsync.series[0].timestamps;}
-return undefined;}
-function AndroidSurfaceFlinger(process,thread){this.process=process;this.thread=thread;this.appVsync_=undefined;this.sfVsync_=undefined;this.appVsyncTimestamps_=getVsyncTimestamps(process,VSYNC_APP_NAME);this.sfVsyncTimestamps_=getVsyncTimestamps(process,VSYNC_SF_NAME);this.deadlineDelayMs_=this.appVsyncTimestamps_!==this.sfVsyncTimestamps_?5:TIMESTAMP_FUDGE_MS;}
-AndroidSurfaceFlinger.createForProcessIfPossible=function(process){const mainThread=process.getThread(process.pid);if(mainThread&&mainThread.name&&/surfaceflinger/.test(mainThread.name)){return new AndroidSurfaceFlinger(process,mainThread);}
-const primaryThreads=process.findAllThreadsNamed('SurfaceFlinger');if(primaryThreads.length===1){return new AndroidSurfaceFlinger(process,primaryThreads[0]);}
-return undefined;};AndroidSurfaceFlinger.prototype={get hasVsyncs(){return!!this.appVsyncTimestamps_&&!!this.sfVsyncTimestamps_;},getFrameKickoff(timestamp){if(!this.hasVsyncs){throw new Error('cannot query vsync info without vsyncs');}
-const firstGreaterIndex=findLowIndexInSortedArray(this.appVsyncTimestamps_,function(x){return x;},timestamp+TIMESTAMP_FUDGE_MS);if(firstGreaterIndex<1)return undefined;return this.appVsyncTimestamps_[firstGreaterIndex-1];},getFrameDeadline(timestamp){if(!this.hasVsyncs){throw new Error('cannot query vsync info without vsyncs');}
-const firstGreaterIndex=findLowIndexInSortedArray(this.sfVsyncTimestamps_,function(x){return x;},timestamp+this.deadlineDelayMs_);if(firstGreaterIndex>=this.sfVsyncTimestamps_.length){return undefined;}
-return this.sfVsyncTimestamps_[firstGreaterIndex];}};return{AndroidSurfaceFlinger,};});'use strict';tr.exportTo('tr.model.helpers',function(){const AndroidApp=tr.model.helpers.AndroidApp;const AndroidSurfaceFlinger=tr.model.helpers.AndroidSurfaceFlinger;const IMPORTANT_SURFACE_FLINGER_SLICES={'doComposition':true,'updateTexImage':true,'postFramebuffer':true};const IMPORTANT_UI_THREAD_SLICES={'Choreographer#doFrame':true,'performTraversals':true,'deliverInputEvent':true};const IMPORTANT_RENDER_THREAD_SLICES={'doFrame':true};function iterateImportantThreadSlices(thread,important,callback){if(!thread)return;thread.sliceGroup.slices.forEach(function(slice){if(slice.title in important){callback(slice);}});}
-function AndroidModelHelper(model){this.model=model;this.apps=[];this.surfaceFlinger=undefined;const processes=model.getAllProcesses();for(let i=0;i<processes.length&&!this.surfaceFlinger;i++){this.surfaceFlinger=AndroidSurfaceFlinger.createForProcessIfPossible(processes[i]);}
-model.getAllProcesses().forEach(function(process){const app=AndroidApp.createForProcessIfPossible(process,this.surfaceFlinger);if(app){this.apps.push(app);}},this);}
-AndroidModelHelper.guid=tr.b.GUID.allocateSimple();AndroidModelHelper.supportsModel=function(model){return true;};AndroidModelHelper.prototype={iterateImportantSlices(callback){if(this.surfaceFlinger){iterateImportantThreadSlices(this.surfaceFlinger.thread,IMPORTANT_SURFACE_FLINGER_SLICES,callback);}
-this.apps.forEach(function(app){iterateImportantThreadSlices(app.uiThread,IMPORTANT_UI_THREAD_SLICES,callback);iterateImportantThreadSlices(app.renderThread,IMPORTANT_RENDER_THREAD_SLICES,callback);});}};return{AndroidModelHelper,};});'use strict';tr.exportTo('tr.model',function(){function Slice(category,title,colorId,start,args,opt_duration,opt_cpuStart,opt_cpuDuration,opt_argsStripped,opt_bindId){if(new.target){throw new Error('Can\'t instantiate pure virtual class Slice');}
-tr.model.TimedEvent.call(this,start);this.category=category||'';this.title=title;this.colorId=colorId;this.args=args;this.startStackFrame=undefined;this.endStackFrame=undefined;this.didNotFinish=false;this.inFlowEvents=[];this.outFlowEvents=[];this.subSlices=[];this.selfTime=undefined;this.cpuSelfTime=undefined;this.important=false;this.parentContainer=undefined;this.argsStripped=false;this.bind_id_=opt_bindId;this.parentSlice=undefined;this.isTopLevel=false;if(opt_duration!==undefined){this.duration=opt_duration;}
-if(opt_cpuStart!==undefined){this.cpuStart=opt_cpuStart;}
-if(opt_cpuDuration!==undefined){this.cpuDuration=opt_cpuDuration;}
-if(opt_argsStripped!==undefined){this.argsStripped=true;}}
-Slice.prototype={__proto__:tr.model.TimedEvent.prototype,get analysisTypeName(){return this.title;},get userFriendlyName(){return'Slice '+this.title+' at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);},get stableId(){const parentSliceGroup=this.parentContainer.sliceGroup;return parentSliceGroup.stableId+'.'+
-parentSliceGroup.slices.indexOf(this);},get bindId(){return this.bind_id_;},findDescendentSlice(targetTitle){if(!this.subSlices){return undefined;}
-for(let i=0;i<this.subSlices.length;i++){if(this.subSlices[i].title===targetTitle){return this.subSlices[i];}
-const slice=this.subSlices[i].findDescendentSlice(targetTitle);if(slice)return slice;}
-return undefined;},get mostTopLevelSlice(){if(!this.parentSlice)return this;return this.parentSlice.mostTopLevelSlice;},getProcess(){const thread=this.parentContainer;if(thread&&thread.getProcess){return thread.getProcess();}
-return undefined;},get model(){const process=this.getProcess();if(process!==undefined){return this.getProcess().model;}
-return undefined;},*findTopmostSlicesRelativeToThisSlice(eventPredicate){if(eventPredicate(this)){yield this;return;}
-for(const s of this.subSlices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate);}},iterateAllSubsequentSlices(callback,opt_this){const parentStack=[];let started=false;const topmostSlice=this.mostTopLevelSlice;parentStack.push(topmostSlice);while(parentStack.length!==0){const curSlice=parentStack.pop();if(started){callback.call(opt_this,curSlice);}else{started=(curSlice.guid===this.guid);}
-for(let i=curSlice.subSlices.length-1;i>=0;i--){parentStack.push(curSlice.subSlices[i]);}}},get subsequentSlices(){const res=[];this.iterateAllSubsequentSlices(function(subseqSlice){res.push(subseqSlice);});return res;},*enumerateAllAncestors(){let curSlice=this.parentSlice;while(curSlice){yield curSlice;curSlice=curSlice.parentSlice;}},get ancestorSlices(){return Array.from(this.enumerateAllAncestors());},iterateEntireHierarchy(callback,opt_this){const mostTopLevelSlice=this.mostTopLevelSlice;callback.call(opt_this,mostTopLevelSlice);mostTopLevelSlice.iterateAllSubsequentSlices(callback,opt_this);},get entireHierarchy(){const res=[];this.iterateEntireHierarchy(function(slice){res.push(slice);});return res;},get ancestorAndSubsequentSlices(){const res=[];res.push(this);for(const aSlice of this.enumerateAllAncestors()){res.push(aSlice);}
-this.iterateAllSubsequentSlices(function(sSlice){res.push(sSlice);});return res;},*enumerateAllDescendents(){for(const slice of this.subSlices){yield slice;}
-for(const slice of this.subSlices){yield*slice.enumerateAllDescendents();}},get descendentSlices(){const res=[];for(const slice of this.enumerateAllDescendents()){res.push(slice);}
-return res;}};return{Slice,};});'use strict';tr.exportTo('tr.model',function(){const Slice=tr.model.Slice;const SCHEDULING_STATE={DEBUG:'Debug',EXIT_DEAD:'Exit Dead',RUNNABLE:'Runnable',RUNNING:'Running',SLEEPING:'Sleeping',STOPPED:'Stopped',TASK_DEAD:'Task Dead',UNINTR_SLEEP:'Uninterruptible Sleep',UNINTR_SLEEP_WAKE_KILL:'Uninterruptible Sleep | WakeKill',UNINTR_SLEEP_WAKING:'Uninterruptible Sleep | Waking',UNINTR_SLEEP_IO:'Uninterruptible Sleep - Block I/O',UNINTR_SLEEP_WAKE_KILL_IO:'Uninterruptible Sleep | WakeKill - Block I/O',UNINTR_SLEEP_WAKING_IO:'Uninterruptible Sleep | Waking - Block I/O',UNKNOWN:'UNKNOWN',WAKE_KILL:'Wakekill',WAKING:'Waking',ZOMBIE:'Zombie'};function ThreadTimeSlice(thread,schedulingState,cat,start,args,opt_duration){Slice.call(this,cat,schedulingState,this.getColorForState_(schedulingState),start,args,opt_duration);this.thread=thread;this.schedulingState=schedulingState;this.cpuOnWhichThreadWasRunning=undefined;}
-ThreadTimeSlice.prototype={__proto__:Slice.prototype,getColorForState_(state){const getColorIdForReservedName=tr.b.ColorScheme.getColorIdForReservedName;switch(state){case SCHEDULING_STATE.RUNNABLE:return getColorIdForReservedName('thread_state_runnable');case SCHEDULING_STATE.RUNNING:return getColorIdForReservedName('thread_state_running');case SCHEDULING_STATE.SLEEPING:return getColorIdForReservedName('thread_state_sleeping');case SCHEDULING_STATE.DEBUG:case SCHEDULING_STATE.EXIT_DEAD:case SCHEDULING_STATE.STOPPED:case SCHEDULING_STATE.TASK_DEAD:case SCHEDULING_STATE.UNINTR_SLEEP:case SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL:case SCHEDULING_STATE.UNINTR_SLEEP_WAKING:case SCHEDULING_STATE.UNKNOWN:case SCHEDULING_STATE.WAKE_KILL:case SCHEDULING_STATE.WAKING:case SCHEDULING_STATE.ZOMBIE:return getColorIdForReservedName('thread_state_uninterruptible');case SCHEDULING_STATE.UNINTR_SLEEP_IO:case SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL_IO:case SCHEDULING_STATE.UNINTR_SLEEP_WAKING_IO:return getColorIdForReservedName('thread_state_iowait');default:return getColorIdForReservedName('thread_state_unknown');}},get analysisTypeName(){return'tr.ui.analysis.ThreadTimeSlice';},getAssociatedCpuSlice(){if(!this.cpuOnWhichThreadWasRunning)return undefined;const cpuSlices=this.cpuOnWhichThreadWasRunning.slices;for(let i=0;i<cpuSlices.length;i++){const cpuSlice=cpuSlices[i];if(cpuSlice.start!==this.start)continue;if(cpuSlice.duration!==this.duration)continue;return cpuSlice;}
-return undefined;},getCpuSliceThatTookCpu(){if(this.cpuOnWhichThreadWasRunning)return undefined;let curIndex=this.thread.indexOfTimeSlice(this);let cpuSliceWhenLastRunning;while(curIndex>=0){const curSlice=this.thread.timeSlices[curIndex];if(!curSlice.cpuOnWhichThreadWasRunning){curIndex--;continue;}
-cpuSliceWhenLastRunning=curSlice.getAssociatedCpuSlice();break;}
-if(!cpuSliceWhenLastRunning)return undefined;const cpu=cpuSliceWhenLastRunning.cpu;const indexOfSliceOnCpuWhenLastRunning=cpu.indexOf(cpuSliceWhenLastRunning);const nextRunningSlice=cpu.slices[indexOfSliceOnCpuWhenLastRunning+1];if(!nextRunningSlice)return undefined;if(Math.abs(nextRunningSlice.start-cpuSliceWhenLastRunning.end)<0.00001){return nextRunningSlice;}
-return undefined;}};tr.model.EventRegistry.register(ThreadTimeSlice,{name:'threadTimeSlice',pluralName:'threadTimeSlices'});return{ThreadTimeSlice,SCHEDULING_STATE,};});'use strict';tr.exportTo('tr.model',function(){const CompoundEventSelectionState={NOT_SELECTED:0,EVENT_SELECTED:0x1,SOME_ASSOCIATED_EVENTS_SELECTED:0x2,ALL_ASSOCIATED_EVENTS_SELECTED:0x4,EVENT_AND_SOME_ASSOCIATED_SELECTED:0x1|0x2,EVENT_AND_ALL_ASSOCIATED_SELECTED:0x1|0x4};return{CompoundEventSelectionState,};});'use strict';tr.exportTo('tr.model.um',function(){const CompoundEventSelectionState=tr.model.CompoundEventSelectionState;function UserExpectation(parentModel,initiatorType,start,duration){tr.model.TimedEvent.call(this,start);this.associatedEvents=new tr.model.EventSet();this.duration=duration;this.initiatorType_=initiatorType;this.parentModel=parentModel;this.typeInfo_=undefined;this.sourceEvents=new tr.model.EventSet();}
-const INITIATOR_TYPE={KEYBOARD:'Keyboard',MOUSE:'Mouse',MOUSE_WHEEL:'MouseWheel',TAP:'Tap',PINCH:'Pinch',FLING:'Fling',TOUCH:'Touch',SCROLL:'Scroll',CSS:'CSS',WEBGL:'WebGL',VIDEO:'Video',VR:'VR',};UserExpectation.prototype={__proto__:tr.model.TimedEvent.prototype,computeCompoundEvenSelectionState(selection){let cess=CompoundEventSelectionState.NOT_SELECTED;if(selection.contains(this)){cess|=CompoundEventSelectionState.EVENT_SELECTED;}
-if(this.associatedEvents.intersectionIsEmpty(selection)){return cess;}
-const allContained=this.associatedEvents.every(function(event){return selection.contains(event);});if(allContained){cess|=CompoundEventSelectionState.ALL_ASSOCIATED_EVENTS_SELECTED;}else{cess|=CompoundEventSelectionState.SOME_ASSOCIATED_EVENTS_SELECTED;}
-return cess;},get associatedSamples(){const samples=new tr.model.EventSet();this.associatedEvents.forEach(function(event){if(event instanceof tr.model.ThreadSlice){samples.addEventSet(event.overlappingSamples);}});return samples;},get userFriendlyName(){return this.title+' User Expectation at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);},get stableId(){return('UserExpectation.'+this.guid);},get typeInfo(){if(!this.typeInfo_){this.typeInfo_=UserExpectation.subTypes.findTypeInfo(this.constructor);}
-if(!this.typeInfo_){throw new Error('Unregistered UserExpectation');}
-return this.typeInfo_;},get colorId(){return this.typeInfo.metadata.colorId;},get stageTitle(){return this.typeInfo.metadata.stageTitle;},get initiatorType(){return this.initiatorType_;},get title(){if(!this.initiatorType){return this.stageTitle;}
-return this.initiatorType+' '+this.stageTitle;},get totalCpuMs(){let cpuMs=0;this.associatedEvents.forEach(function(event){if(event.cpuSelfTime){cpuMs+=event.cpuSelfTime;}});return cpuMs;}};const subTypes={};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(subTypes,options);subTypes.addEventListener('will-register',function(e){const metadata=e.typeInfo.metadata;if(metadata.stageTitle===undefined){throw new Error('Registered UserExpectations must provide '+'stageTitle');}
-if(metadata.colorId===undefined){throw new Error('Registered UserExpectations must provide '+'colorId');}});tr.model.EventRegistry.register(UserExpectation,{name:'userExpectation',pluralName:'userExpectations',subTypes});return{UserExpectation,INITIATOR_TYPE,};});'use strict';tr.exportTo('tr.model.um',function(){function ResponseExpectation(parentModel,initiatorTitle,start,duration,opt_isAnimationBegin){tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);this.isAnimationBegin=opt_isAnimationBegin||false;}
-ResponseExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:ResponseExpectation};tr.model.um.UserExpectation.subTypes.register(ResponseExpectation,{stageTitle:'Response',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_response')});return{ResponseExpectation,};});'use strict';tr.exportTo('tr.e.audits',function(){const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;const Auditor=tr.c.Auditor;const AndroidModelHelper=tr.model.helpers.AndroidModelHelper;const ColorScheme=tr.b.ColorScheme;const Statistics=tr.b.math.Statistics;const FRAME_PERF_CLASS=tr.model.FRAME_PERF_CLASS;const Alert=tr.model.Alert;const EventInfo=tr.model.EventInfo;const Scalar=tr.b.Scalar;const timeDurationInMs=tr.b.Unit.byName.timeDurationInMs;const EXPECTED_FRAME_TIME_MS=16.67;function getStart(e){return e.start;}
-function getDuration(e){return e.duration;}
-function getCpuDuration(e){return(e.cpuDuration!==undefined)?e.cpuDuration:e.duration;}
-function frameIsActivityStart(frame){return frame.associatedEvents.any(x=>x.title==='activityStart');}
-function frameMissedDeadline(frame){return frame.args.deadline&&frame.args.deadline<frame.end;}
-function DocLinkBuilder(){this.docLinks=[];}
-DocLinkBuilder.prototype={addAppVideo(name,videoId){this.docLinks.push({label:'Video Link',textContent:('Android Performance Patterns: '+name),href:'https://www.youtube.com/watch?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&v='+videoId});return this;},addDacRef(name,link){this.docLinks.push({label:'Doc Link',textContent:(name+' documentation'),href:'https://developer.android.com/reference/'+link});return this;},build(){return this.docLinks;}};function AndroidAuditor(model){Auditor.call(this,model);const helper=model.getOrCreateHelper(AndroidModelHelper);if(helper.apps.length||helper.surfaceFlinger){this.helper=helper;}}
-AndroidAuditor.viewAlphaAlertInfo_=new EventInfo('Inefficient View alpha usage','Setting an alpha between 0 and 1 has significant performance costs, if one of the fast alpha paths is not used.',new DocLinkBuilder().addAppVideo('Hidden Cost of Transparency','wIy8g8yNhNk').addDacRef('View#setAlpha()','android/view/View.html#setAlpha(float)').build());AndroidAuditor.saveLayerAlertInfo_=new EventInfo('Expensive rendering with Canvas#saveLayer()','Canvas#saveLayer() incurs extremely high rendering cost. They disrupt the rendering pipeline when drawn, forcing a flush of drawing content. Instead use View hardware layers, or static Bitmaps. This enables the offscreen buffers to be reused in between frames, and avoids the disruptive render target switch.',new DocLinkBuilder().addAppVideo('Hidden Cost of Transparency','wIy8g8yNhNk').addDacRef('Canvas#saveLayerAlpha()','android/graphics/Canvas.html#saveLayerAlpha(android.graphics.RectF, int, int)').build());AndroidAuditor.getSaveLayerAlerts_=function(frame){const badAlphaRegEx=/^(.+) alpha caused (unclipped )?saveLayer (\d+)x(\d+)$/;const saveLayerRegEx=/^(unclipped )?saveLayer (\d+)x(\d+)$/;const ret=[];const events=[];frame.associatedEvents.forEach(function(slice){const match=badAlphaRegEx.exec(slice.title);if(match){const args={'view name':match[1],'width':parseInt(match[3]),'height':parseInt(match[4])};ret.push(new Alert(AndroidAuditor.viewAlphaAlertInfo_,slice.start,[slice],args));}else if(saveLayerRegEx.test(slice.title)){events.push(slice);}},this);if(events.length>ret.length){const unclippedSeen=Statistics.sum(events,function(slice){return saveLayerRegEx.exec(slice.title)[1]?1:0;});const clippedSeen=events.length-unclippedSeen;const earliestStart=Statistics.min(events,function(slice){return slice.start;});const args={'Unclipped saveLayer count (especially bad!)':unclippedSeen,'Clipped saveLayer count':clippedSeen};events.push(frame);ret.push(new Alert(AndroidAuditor.saveLayerAlertInfo_,earliestStart,events,args));}
-return ret;};AndroidAuditor.pathAlertInfo_=new EventInfo('Path texture churn','Paths are drawn with a mask texture, so when a path is modified / newly drawn, that texture must be generated and uploaded to the GPU. Ensure that you cache paths between frames and do not unnecessarily call Path#reset(). You can cut down on this cost by sharing Path object instances between drawables/views.');AndroidAuditor.getPathAlert_=function(frame){const uploadRegEx=/^Generate Path Texture$/;const events=frame.associatedEvents.filter(function(event){return event.title==='Generate Path Texture';});const start=Statistics.min(events,getStart);const duration=Statistics.sum(events,getDuration);if(duration<3)return undefined;events.push(frame);return new Alert(AndroidAuditor.pathAlertInfo_,start,events,{'Time spent':new Scalar(timeDurationInMs,duration)});};AndroidAuditor.uploadAlertInfo_=new EventInfo('Expensive Bitmap uploads','Bitmaps that have been modified / newly drawn must be uploaded to the GPU. Since this is expensive if the total number of pixels uploaded is large, reduce the amount of Bitmap churn in this animation/context, per frame.');AndroidAuditor.getUploadAlert_=function(frame){const uploadRegEx=/^Upload (\d+)x(\d+) Texture$/;const events=[];let start=Number.POSITIVE_INFINITY;let duration=0;let pixelsUploaded=0;frame.associatedEvents.forEach(function(event){const match=uploadRegEx.exec(event.title);if(match){events.push(event);start=Math.min(start,event.start);duration+=event.duration;pixelsUploaded+=parseInt(match[1])*parseInt(match[2]);}});if(events.length===0||duration<3)return undefined;const mPixels=(pixelsUploaded/1000000).toFixed(2)+' million';const args={'Pixels uploaded':mPixels,'Time spent':new Scalar(timeDurationInMs,duration)};events.push(frame);return new Alert(AndroidAuditor.uploadAlertInfo_,start,events,args);};AndroidAuditor.ListViewInflateAlertInfo_=new EventInfo('Inflation during ListView recycling','ListView item recycling involved inflating views. Ensure your Adapter#getView() recycles the incoming View, instead of constructing a new one.');AndroidAuditor.ListViewBindAlertInfo_=new EventInfo('Inefficient ListView recycling/rebinding','ListView recycling taking too much time per frame. Ensure your Adapter#getView() binds data efficiently.');AndroidAuditor.getListViewAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return event.title==='obtainView'||event.title==='setupListItem';});const duration=Statistics.sum(events,getCpuDuration);if(events.length===0||duration<3)return undefined;let hasInflation=false;for(const event of events){if(event.findDescendentSlice('inflate')){hasInflation=true;}}
-const start=Statistics.min(events,getStart);const args={'Time spent':new Scalar(timeDurationInMs,duration)};args['ListView items '+(hasInflation?'inflated':'rebound')]=events.length/2;const eventInfo=hasInflation?AndroidAuditor.ListViewInflateAlertInfo_:AndroidAuditor.ListViewBindAlertInfo_;events.push(frame);return new Alert(eventInfo,start,events,args);};AndroidAuditor.measureLayoutAlertInfo_=new EventInfo('Expensive measure/layout pass','Measure/Layout took a significant time, contributing to jank. Avoid triggering layout during animations.',new DocLinkBuilder().addAppVideo('Invalidations, Layouts, and Performance','we6poP0kw6E').build());AndroidAuditor.getMeasureLayoutAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return event.title==='measure'||event.title==='layout';});const duration=Statistics.sum(events,getCpuDuration);if(events.length===0||duration<3)return undefined;const start=Statistics.min(events,getStart);events.push(frame);return new Alert(AndroidAuditor.measureLayoutAlertInfo_,start,events,{'Time spent':new Scalar(timeDurationInMs,duration)});};AndroidAuditor.viewDrawAlertInfo_=new EventInfo('Long View#draw()','Recording the drawing commands of invalidated Views took a long time. Avoid significant work in View or Drawable custom drawing, especially allocations or drawing to Bitmaps.',new DocLinkBuilder().addAppVideo('Invalidations, Layouts, and Performance','we6poP0kw6E').addAppVideo('Avoiding Allocations in onDraw()','HAK5acHQ53E').build());AndroidAuditor.getViewDrawAlert_=function(frame){let slice=undefined;for(const event of frame.associatedEvents){if(event.title==='getDisplayList'||event.title==='Record View#draw()'){slice=event;break;}}
-if(!slice||getCpuDuration(slice)<3)return undefined;return new Alert(AndroidAuditor.viewDrawAlertInfo_,slice.start,[slice,frame],{'Time spent':new Scalar(timeDurationInMs,getCpuDuration(slice))});};AndroidAuditor.blockingGcAlertInfo_=new EventInfo('Blocking Garbage Collection','Blocking GCs are caused by object churn, and made worse by having large numbers of objects in the heap. Avoid allocating objects during animations/scrolling, and recycle Bitmaps to avoid triggering garbage collection.',new DocLinkBuilder().addAppVideo('Garbage Collection in Android','pzfzz50W5Uo').addAppVideo('Avoiding Allocations in onDraw()','HAK5acHQ53E').build());AndroidAuditor.getBlockingGcAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return event.title==='DVM Suspend'||event.title==='GC: Wait For Concurrent';});const blockedDuration=Statistics.sum(events,getDuration);if(blockedDuration<3)return undefined;const start=Statistics.min(events,getStart);events.push(frame);return new Alert(AndroidAuditor.blockingGcAlertInfo_,start,events,{'Blocked duration':new Scalar(timeDurationInMs,blockedDuration)});};AndroidAuditor.lockContentionAlertInfo_=new EventInfo('Lock contention','UI thread lock contention is caused when another thread holds a lock that the UI thread is trying to use. UI thread progress is blocked until the lock is released. Inspect locking done within the UI thread, and ensure critical sections are short.');AndroidAuditor.getLockContentionAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return/^Lock Contention on /.test(event.title);});const blockedDuration=Statistics.sum(events,getDuration);if(blockedDuration<1)return undefined;const start=Statistics.min(events,getStart);events.push(frame);return new Alert(AndroidAuditor.lockContentionAlertInfo_,start,events,{'Blocked duration':new Scalar(timeDurationInMs,blockedDuration)});};AndroidAuditor.schedulingAlertInfo_=new EventInfo('Scheduling delay','Work to produce this frame was descheduled for several milliseconds, contributing to jank. Ensure that code on the UI thread doesn\'t block on work being done on other threads, and that background threads (doing e.g. network or bitmap loading) are running at android.os.Process#THREAD_PRIORITY_BACKGROUND or lower so they are less likely to interrupt the UI thread. These background threads should show up with a priority number of 130 or higher in the scheduling section under the Kernel process.');AndroidAuditor.getSchedulingAlert_=function(frame){let totalDuration=0;const totalStats={};for(const ttr of frame.threadTimeRanges){const stats=ttr.thread.getSchedulingStatsForRange(ttr.start,ttr.end);for(const[key,value]of Object.entries(stats)){if(!(key in totalStats)){totalStats[key]=0;}
-totalStats[key]+=value;totalDuration+=value;}}
-if(!(SCHEDULING_STATE.RUNNING in totalStats)||totalDuration===0||totalDuration-totalStats[SCHEDULING_STATE.RUNNING]<3){return;}
-const args={};for(const[key,value]of Object.entries(totalStats)){let newKey=key;if(key===SCHEDULING_STATE.RUNNABLE){newKey='Not scheduled, but runnable';}else if(key===SCHEDULING_STATE.UNINTR_SLEEP){newKey='Blocking I/O delay';}
-args[newKey]=new Scalar(timeDurationInMs,value);}
-return new Alert(AndroidAuditor.schedulingAlertInfo_,frame.start,[frame],args);};AndroidAuditor.prototype={__proto__:Auditor.prototype,renameAndSort_(){this.model.kernel.important=false;this.model.getAllProcesses().forEach(function(process){if(this.helper.surfaceFlinger&&process===this.helper.surfaceFlinger.process){if(!process.name){process.name='SurfaceFlinger';}
-process.sortIndex=Number.NEGATIVE_INFINITY;process.important=false;return;}
-const uiThread=process.getThread(process.pid);if(!process.name&&uiThread&&uiThread.name){if(/^ndroid\./.test(uiThread.name)){uiThread.name='a'+uiThread.name;}
-process.name=uiThread.name;uiThread.name='UI Thread';}
-process.sortIndex=0;for(const tid in process.threads){process.sortIndex-=process.threads[tid].sliceGroup.slices.length;}},this);this.model.getAllThreads().forEach(function(thread){if(thread.tid===thread.parent.pid){thread.sortIndex=-3;}
-if(thread.name==='RenderThread'){thread.sortIndex=-2;}
-if(/^hwuiTask/.test(thread.name)){thread.sortIndex=-1;}});},pushFramesAndJudgeJank_(){let badFramesObserved=0;let framesObserved=0;const surfaceFlinger=this.helper.surfaceFlinger;this.helper.apps.forEach(function(app){app.process.frames=app.getFrames();app.process.frames.forEach(function(frame){if(frame.totalDuration>EXPECTED_FRAME_TIME_MS*2){badFramesObserved+=2;frame.perfClass=FRAME_PERF_CLASS.TERRIBLE;}else if(frame.totalDuration>EXPECTED_FRAME_TIME_MS||frameMissedDeadline(frame)){badFramesObserved++;frame.perfClass=FRAME_PERF_CLASS.BAD;}else{frame.perfClass=FRAME_PERF_CLASS.GOOD;}});framesObserved+=app.process.frames.length;});if(framesObserved){const portionBad=badFramesObserved/framesObserved;if(portionBad>0.3){this.model.faviconHue='red';}else if(portionBad>0.05){this.model.faviconHue='yellow';}else{this.model.faviconHue='green';}}},pushEventInfo_(){const appAnnotator=new AppAnnotator();this.helper.apps.forEach(function(app){if(app.uiThread){appAnnotator.applyEventInfos(app.uiThread.sliceGroup);}
-if(app.renderThread){appAnnotator.applyEventInfos(app.renderThread.sliceGroup);}});},runAnnotate(){if(!this.helper)return;this.renameAndSort_();this.pushFramesAndJudgeJank_();this.pushEventInfo_();this.helper.iterateImportantSlices(function(slice){slice.important=true;});},runAudit(){if(!this.helper)return;const alerts=this.model.alerts;this.helper.apps.forEach(function(app){app.getFrames().forEach(function(frame){alerts.push.apply(alerts,AndroidAuditor.getSaveLayerAlerts_(frame));if(frame.perfClass===FRAME_PERF_CLASS.NEUTRAL||frame.perfClass===FRAME_PERF_CLASS.GOOD){return;}
-let alert=AndroidAuditor.getPathAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getUploadAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getListViewAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getMeasureLayoutAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getViewDrawAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getBlockingGcAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getLockContentionAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getSchedulingAlert_(frame);if(alert)alerts.push(alert);});},this);this.addRenderingInteractionRecords();this.addInputInteractionRecords();},addRenderingInteractionRecords(){const events=[];this.helper.apps.forEach(function(app){events.push.apply(events,app.getAnimationAsyncSlices());events.push.apply(events,app.getFrames());});const mergerFunction=function(events){const ir=new tr.model.um.ResponseExpectation(this.model,'Rendering',events[0].min,events[events.length-1].max-events[0].min);this.model.userModel.expectations.push(ir);}.bind(this);tr.b.math.mergeRanges(tr.b.math.convertEventsToRanges(events),30,mergerFunction);},addInputInteractionRecords(){const inputSamples=[];this.helper.apps.forEach(function(app){inputSamples.push.apply(inputSamples,app.getInputSamples());});const mergerFunction=function(events){const ir=new tr.model.um.ResponseExpectation(this.model,'Input',events[0].min,events[events.length-1].max-events[0].min);this.model.userModel.expectations.push(ir);}.bind(this);const inputRanges=inputSamples.map(function(sample){return tr.b.math.Range.fromExplicitRange(sample.timestamp,sample.timestamp);});tr.b.math.mergeRanges(inputRanges,30,mergerFunction);}};Auditor.register(AndroidAuditor);function AppAnnotator(){this.titleInfoLookup=new Map();this.titleParentLookup=new Map();this.build_();}
-AppAnnotator.prototype={build_(){const registerEventInfo=function(dict){this.titleInfoLookup.set(dict.title,new EventInfo(dict.title,dict.description,dict.docLinks));if(dict.parents){this.titleParentLookup.set(dict.title,dict.parents);}}.bind(this);registerEventInfo({title:'inflate',description:'Constructing a View hierarchy from pre-processed XML via LayoutInflater#layout. This includes constructing all of the View objects in the hierarchy, and applying styled attributes.'});registerEventInfo({title:'obtainView',description:'Adapter#getView() called to bind content to a recycled View that is being presented.'});registerEventInfo({title:'setupListItem',description:'Attached a newly-bound, recycled View to its parent ListView.'});registerEventInfo({title:'setupGridItem',description:'Attached a newly-bound, recycled View to its parent GridView.'});const choreographerLinks=new DocLinkBuilder().addDacRef('Choreographer','android/view/Choreographer.html').build();registerEventInfo({title:'Choreographer#doFrame',docLinks:choreographerLinks,description:'Choreographer executes frame callbacks for inputs, animations, and rendering traversals. When this work is done, a frame will be presented to the user.'});registerEventInfo({title:'input',parents:['Choreographer#doFrame'],docLinks:choreographerLinks,description:'Input callbacks are processed. This generally encompasses dispatching input to Views, as well as any work the Views do to process this input/gesture.'});registerEventInfo({title:'animation',parents:['Choreographer#doFrame'],docLinks:choreographerLinks,description:'Animation callbacks are processed. This is generally minimal work, as animations determine progress for the frame, and push new state to animated objects (such as setting View properties).'});registerEventInfo({title:'traversals',parents:['Choreographer#doFrame'],docLinks:choreographerLinks,description:'Primary draw traversals. This is the primary traversal of the View hierarchy, including layout and draw passes.'});const traversalParents=['Choreographer#doFrame','performTraversals'];const layoutLinks=new DocLinkBuilder().addDacRef('View#Layout','android/view/View.html#Layout').build();registerEventInfo({title:'performTraversals',description:'A drawing traversal of the View hierarchy, comprised of all layout and drawing needed to produce the frame.'});registerEventInfo({title:'measure',parents:traversalParents,docLinks:layoutLinks,description:'First of two phases in view hierarchy layout. Views are asked to size themselves according to constraints supplied by their parent. Some ViewGroups may measure a child more than once to help satisfy their own constraints. Nesting ViewGroups that measure children more than once can lead to excessive and repeated work.'});registerEventInfo({title:'layout',parents:traversalParents,docLinks:layoutLinks,description:'Second of two phases in view hierarchy layout, repositioning content and child Views into their new locations.'});const drawString='Draw pass over the View hierarchy. Every invalidated View will have its drawing commands recorded. On Android versions prior to Lollipop, this would also include the issuing of draw commands to the GPU. Starting with Lollipop, it only includes the recording of commands, and syncing that information to the RenderThread.';registerEventInfo({title:'draw',parents:traversalParents,description:drawString});const recordString='Every invalidated View\'s drawing commands are recorded. Each will have View#draw() called, and is passed a Canvas that will record and store its drawing commands until it is next invalidated/rerecorded.';registerEventInfo({title:'getDisplayList',parents:['draw'],description:recordString});registerEventInfo({title:'Record View#draw()',parents:['draw'],description:recordString});registerEventInfo({title:'drawDisplayList',parents:['draw'],description:'Execution of recorded draw commands to generate a frame. This represents the actual formation and issuing of drawing commands to the GPU. On Android L and higher devices, this work is done on a dedicated RenderThread, instead of on the UI Thread.'});registerEventInfo({title:'DrawFrame',description:'RenderThread portion of the standard UI/RenderThread split frame. This represents the actual formation and issuing of drawing commands to the GPU.'});registerEventInfo({title:'doFrame',description:'RenderThread animation frame. Represents drawing work done by the RenderThread on a frame where the UI thread did not produce new drawing content.'});registerEventInfo({title:'syncFrameState',description:'Sync stage between the UI thread and the RenderThread, where the UI thread hands off a frame (including information about modified Views). Time in this method primarily consists of uploading modified Bitmaps to the GPU. After this sync is completed, the UI thread is unblocked, and the RenderThread starts to render the frame.'});registerEventInfo({title:'flush drawing commands',description:'Issuing the now complete drawing commands to the GPU.'});registerEventInfo({title:'eglSwapBuffers',description:'Complete GPU rendering of the frame.'});registerEventInfo({title:'RV Scroll',description:'RecyclerView is calculating a scroll. If there are too many of these in Systrace, some Views inside RecyclerView might be causing it. Try to avoid using EditText, focusable views or handle them with care.'});registerEventInfo({title:'RV OnLayout',description:'OnLayout has been called by the View system. If this shows up too many times in Systrace, make sure the children of RecyclerView do not update themselves directly. This will cause a full re-layout but when it happens via the Adapter notifyItemChanged, RecyclerView can avoid full layout calculation.'});registerEventInfo({title:'RV FullInvalidate',description:'NotifyDataSetChanged or equal has been called. If this is taking a long time, try sending granular notify adapter changes instead of just calling notifyDataSetChanged or setAdapter / swapAdapter. Adding stable ids to your adapter might help.'});registerEventInfo({title:'RV PartialInvalidate',description:'RecyclerView is rebinding a View. If this is taking a lot of time, consider optimizing your layout or make sure you are not doing extra operations in onBindViewHolder call.'});registerEventInfo({title:'RV OnBindView',description:'RecyclerView is rebinding a View. If this is taking a lot of time, consider optimizing your layout or make sure you are not doing extra operations in onBindViewHolder call.'});registerEventInfo({title:'RV CreateView',description:'RecyclerView is creating a new View. If too many of these are present: 1) There might be a problem in Recycling (e.g. custom Animations that set transient state and prevent recycling or ItemAnimator not implementing the contract properly. See Adapter#onFailedToRecycleView(ViewHolder). 2) There may be too many item view types. Try merging them. 3) There might be too many itemChange animations and not enough space in RecyclerPool. Try increasing your pool size and item cache size.'});registerEventInfo({title:'eglSwapBuffers',description:'The CPU has finished producing drawing commands, and is flushing drawing work to the GPU, and posting that buffer to the consumer (which is often SurfaceFlinger window composition). Once this is completed, the GPU can produce the frame content without any involvement from the CPU.'});},applyEventInfosRecursive_(parentNames,slice){const checkExpectedParentNames=function(expectedParentNames){if(!expectedParentNames)return true;return expectedParentNames.some(function(name){return parentNames.has(name);});};if(this.titleInfoLookup.has(slice.title)){if(checkExpectedParentNames(this.titleParentLookup.get(slice.title))){slice.info=this.titleInfoLookup.get(slice.title);}}
-if(slice.subSlices.length>0){if(!parentNames.has(slice.title)){parentNames.set(slice.title,0);}
-parentNames.set(slice.title,parentNames.get(slice.title)+1);slice.subSlices.forEach(function(subSlice){this.applyEventInfosRecursive_(parentNames,subSlice);},this);parentNames.set(slice.title,parentNames.get(slice.title)-1);if(parentNames.get(slice.title)===0){delete parentNames[slice.title];}}},applyEventInfos(sliceGroup){sliceGroup.topLevelSlices.forEach(function(slice){this.applyEventInfosRecursive_(new Map(),slice);},this);}};return{AndroidAuditor,};});'use strict';tr.exportTo('tr.model',function(){function ObjectSnapshot(objectInstance,ts,args){tr.model.Event.call(this);this.objectInstance=objectInstance;this.ts=ts;this.args=args;}
-ObjectSnapshot.prototype={__proto__:tr.model.Event.prototype,preInitialize(){},initialize(){},referencedAt(item,object,field){},addBoundsToRange(range){range.addValue(this.ts);},get userFriendlyName(){return'Snapshot of '+this.objectInstance.userFriendlyName+' @ '+
-tr.b.Unit.byName.timeStampInMs.format(this.ts);}};tr.model.EventRegistry.register(ObjectSnapshot,{name:'objectSnapshot',pluralName:'objectSnapshots'});return{ObjectSnapshot,};});'use strict';tr.exportTo('tr.model',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function ObjectInstance(parent,scopedId,category,name,creationTs,opt_baseTypeName){tr.model.Event.call(this);this.parent=parent;this.scopedId=scopedId;this.category=category;this.baseTypeName=opt_baseTypeName?opt_baseTypeName:name;this.name=name;this.creationTs=creationTs;this.creationTsWasExplicit=false;this.deletionTs=Number.MAX_VALUE;this.deletionTsWasExplicit=false;this.colorId=0;this.bounds=new tr.b.math.Range();this.snapshots=[];this.hasImplicitSnapshots=false;}
-ObjectInstance.prototype={__proto__:tr.model.Event.prototype,get typeName(){return this.name;},addBoundsToRange(range){range.addRange(this.bounds);},addSnapshot(ts,args,opt_name,opt_baseTypeName){if(ts<this.creationTs){throw new Error('Snapshots must be >= instance.creationTs');}
-if(ts>=this.deletionTs){throw new Error('Snapshots cannot be added after '+'an objects deletion timestamp.');}
-let lastSnapshot;if(this.snapshots.length>0){lastSnapshot=this.snapshots[this.snapshots.length-1];if(lastSnapshot.ts===ts){throw new Error('Snapshots already exists at this time!');}
-if(ts<lastSnapshot.ts){throw new Error('Snapshots must be added in increasing timestamp order');}}
-if(opt_name&&(this.name!==opt_name)){if(!opt_baseTypeName){throw new Error('Must provide base type name for name update');}
-if(this.baseTypeName!==opt_baseTypeName){throw new Error('Cannot update type name: base types dont match');}
-this.name=opt_name;}
-const snapshotConstructor=tr.model.ObjectSnapshot.subTypes.getConstructor(this.category,this.name);const snapshot=new snapshotConstructor(this,ts,args);this.snapshots.push(snapshot);return snapshot;},wasDeleted(ts){let lastSnapshot;if(this.snapshots.length>0){lastSnapshot=this.snapshots[this.snapshots.length-1];if(lastSnapshot.ts>ts){throw new Error('Instance cannot be deleted at ts='+
-ts+'. A snapshot exists that is older.');}}
-this.deletionTs=ts;this.deletionTsWasExplicit=true;},preInitialize(){for(let i=0;i<this.snapshots.length;i++){this.snapshots[i].preInitialize();}},initialize(){for(let i=0;i<this.snapshots.length;i++){this.snapshots[i].initialize();}},isAliveAt(ts){if(ts<this.creationTs&&this.creationTsWasExplicit){return false;}
-if(ts>this.deletionTs){return false;}
-return true;},getSnapshotAt(ts){if(ts<this.creationTs){if(this.creationTsWasExplicit){throw new Error('ts must be within lifetime of this instance');}
-return this.snapshots[0];}
-if(ts>this.deletionTs){throw new Error('ts must be within lifetime of this instance');}
-const snapshots=this.snapshots;const i=tr.b.findIndexInSortedIntervals(snapshots,function(snapshot){return snapshot.ts;},function(snapshot,i){if(i===snapshots.length-1){return snapshots[i].objectInstance.deletionTs;}
-return snapshots[i+1].ts-snapshots[i].ts;},ts);if(i<0){return this.snapshots[0];}
-if(i>=this.snapshots.length){return this.snapshots[this.snapshots.length-1];}
-return this.snapshots[i];},updateBounds(){this.bounds.reset();this.bounds.addValue(this.creationTs);if(this.deletionTs!==Number.MAX_VALUE){this.bounds.addValue(this.deletionTs);}else if(this.snapshots.length>0){this.bounds.addValue(this.snapshots[this.snapshots.length-1].ts);}},shiftTimestampsForward(amount){this.creationTs+=amount;if(this.deletionTs!==Number.MAX_VALUE){this.deletionTs+=amount;}
-this.snapshots.forEach(function(snapshot){snapshot.ts+=amount;});},get userFriendlyName(){return this.typeName+' object '+this.scopedId;}};tr.model.EventRegistry.register(ObjectInstance,{name:'objectInstance',pluralName:'objectInstances'});return{ObjectInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;const ObjectInstance=tr.model.ObjectInstance;function BlameContextSnapshot(){ObjectSnapshot.apply(this,arguments);}
-BlameContextSnapshot.prototype={__proto__:ObjectSnapshot.prototype,get parentContext(){if(this.args.parent instanceof BlameContextSnapshot){return this.args.parent;}
-return undefined;},get userFriendlyName(){return'BlameContext';}};function BlameContextInstance(){ObjectInstance.apply(this,arguments);}
-BlameContextInstance.prototype={__proto__:ObjectInstance.prototype,get blameContextType(){throw new Error('Not implemented');}};return{BlameContextSnapshot,BlameContextInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;function FrameTreeNodeSnapshot(){BlameContextSnapshot.apply(this,arguments);}
-FrameTreeNodeSnapshot.prototype={__proto__:BlameContextSnapshot.prototype,get renderFrame(){if(this.args.renderFrame instanceof tr.e.chrome.RenderFrameSnapshot){return this.args.renderFrame;}
-return undefined;},get url(){return this.args.url;},get userFriendlyName(){return'FrameTreeNode';}};tr.model.ObjectSnapshot.subTypes.register(FrameTreeNodeSnapshot,{typeName:'FrameTreeNode'});function FrameTreeNodeInstance(){BlameContextInstance.apply(this,arguments);}
-FrameTreeNodeInstance.prototype={__proto__:BlameContextInstance.prototype,get blameContextType(){return'Frame';}};tr.model.ObjectInstance.subTypes.register(FrameTreeNodeInstance,{typeName:'FrameTreeNode'});return{FrameTreeNodeSnapshot,FrameTreeNodeInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;function RenderFrameSnapshot(){BlameContextSnapshot.apply(this,arguments);}
-RenderFrameSnapshot.prototype={__proto__:BlameContextSnapshot.prototype,referencedAt(item,object,field){if(item instanceof tr.e.chrome.FrameTreeNodeSnapshot&&object===item.args&&field==='renderFrame'){this.args.frameTreeNode=item;}},get frameTreeNode(){if(this.args.frameTreeNode instanceof
-tr.e.chrome.FrameTreeNodeSnapshot){return this.args.frameTreeNode;}
-return undefined;},get url(){if(this.frameTreeNode){return this.frameTreeNode.url;}
-return undefined;},get userFriendlyName(){return'RenderFrame';}};tr.model.ObjectSnapshot.subTypes.register(RenderFrameSnapshot,{typeName:'RenderFrame'});function RenderFrameInstance(){BlameContextInstance.apply(this,arguments);}
-RenderFrameInstance.prototype={__proto__:BlameContextInstance.prototype,get blameContextType(){return'Frame';}};tr.model.ObjectInstance.subTypes.register(RenderFrameInstance,{typeName:'RenderFrame'});return{RenderFrameSnapshot,RenderFrameInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;function TopLevelSnapshot(){BlameContextSnapshot.apply(this,arguments);}
-TopLevelSnapshot.prototype={__proto__:BlameContextSnapshot.prototype,get userFriendlyName(){return'TopLevel';}};tr.model.ObjectSnapshot.subTypes.register(TopLevelSnapshot,{typeName:'TopLevel'});function TopLevelInstance(){BlameContextInstance.apply(this,arguments);}
-TopLevelInstance.prototype={__proto__:BlameContextInstance.prototype,get blameContextType(){return'TopLevel';}};tr.model.ObjectInstance.subTypes.register(TopLevelInstance,{typeName:'TopLevel'});return{TopLevelSnapshot,TopLevelInstance,};});'use strict';tr.exportTo('tr.model',function(){function AsyncSlice(category,title,colorId,start,args,duration,opt_isTopLevel,opt_cpuStart,opt_cpuDuration,opt_argsStripped){tr.model.TimedEvent.call(this,start);this.category=category||'';this.originalTitle=title;this.title=title;this.colorId=colorId;this.args=args;this.startStackFrame=undefined;this.endStackFrame=undefined;this.didNotFinish=false;this.important=false;this.subSlices=[];this.parentContainer_=undefined;this.id=undefined;this.startThread=undefined;this.endThread=undefined;this.cpuStart=undefined;this.cpuDuration=undefined;this.argsStripped=false;this.startStackFrame=undefined;this.endStackFrame=undefined;this.duration=duration;this.isTopLevel=(opt_isTopLevel===true);if(opt_cpuStart!==undefined){this.cpuStart=opt_cpuStart;}
-if(opt_cpuDuration!==undefined){this.cpuDuration=opt_cpuDuration;}
-if(opt_argsStripped!==undefined){this.argsStripped=opt_argsStripped;}}
-AsyncSlice.prototype={__proto__:tr.model.TimedEvent.prototype,get analysisTypeName(){return this.title;},get parentContainer(){return this.parentContainer_;},set parentContainer(parentContainer){this.parentContainer_=parentContainer;for(let i=0;i<this.subSlices.length;i++){const subSlice=this.subSlices[i];if(subSlice.parentContainer===undefined){subSlice.parentContainer=parentContainer;}}},get viewSubGroupTitle(){return this.title;},get viewSubGroupGroupingKey(){return undefined;},get userFriendlyName(){return'Async slice '+this.title+' at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);},get stableId(){const parentAsyncSliceGroup=this.parentContainer.asyncSliceGroup;return parentAsyncSliceGroup.stableId+'.'+
-parentAsyncSliceGroup.slices.indexOf(this);},*findTopmostSlicesRelativeToThisSlice(eventPredicate,opt_this){if(eventPredicate(this)){yield this;return;}
-for(const s of this.subSlices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate);}},findDescendentSlice(targetTitle){if(!this.subSlices)return undefined;for(let i=0;i<this.subSlices.length;i++){if(this.subSlices[i].title===targetTitle){return this.subSlices[i];}
-const slice=this.subSlices[i].findDescendentSlice(targetTitle);if(slice)return slice;}
-return undefined;},*enumerateAllDescendents(){for(const slice of this.subSlices){yield slice;}
-for(const slice of this.subSlices){if(slice.enumerateAllDescendents!==undefined){yield*slice.enumerateAllDescendents();}}},compareTo(that){return this.title.localeCompare(that.title);}};tr.model.EventRegistry.register(AsyncSlice,{name:'asyncSlice',pluralName:'asyncSlices'});return{AsyncSlice,};});'use strict';tr.exportTo('tr.e.blink',function(){class BlinkSchedulerAsyncSlice extends tr.model.AsyncSlice{get viewSubGroupGroupingKey(){if(this.title.startsWith('FrameScheduler.')){return'Frame'+this.id;}
-if(this.title.startsWith('Scheduler.')){return'Renderer Scheduler';}
-return undefined;}
-get viewSubGroupTitle(){if(this.title.startsWith('FrameScheduler.')){return this.title.substring(15);}
-if(this.title.startsWith('Scheduler.')){return this.title.substring(10);}
-return this.title;}}
-tr.model.AsyncSlice.subTypes.register(BlinkSchedulerAsyncSlice,{categoryParts:['renderer.scheduler','disabled-by-default-renderer.scheduler','disabled-by-default-renderer.scheduler.debug',]});return{BlinkSchedulerAsyncSlice,};});'use strict';tr.exportTo('tr.model.helpers',function(){const MAIN_FRAMETIME_TYPE='main_frametime_type';const IMPL_FRAMETIME_TYPE='impl_frametime_type';const MAIN_RENDERING_STATS='BenchmarkInstrumentation::MainThreadRenderingStats';const IMPL_RENDERING_STATS='BenchmarkInstrumentation::ImplThreadRenderingStats';function getSlicesIntersectingRange(rangeOfInterest,slices){const slicesInFilterRange=[];for(let i=0;i<slices.length;i++){const slice=slices[i];if(rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end)){slicesInFilterRange.push(slice);}}
-return slicesInFilterRange;}
-function ChromeProcessHelper(modelHelper,process){this.modelHelper=modelHelper;this.process=process;this.telemetryInternalRanges_=undefined;}
-ChromeProcessHelper.prototype={get pid(){return this.process.pid;},isTelemetryInternalEvent(slice){if(this.telemetryInternalRanges_===undefined){this.findTelemetryInternalRanges_();}
-for(const range of this.telemetryInternalRanges_){if(range.containsExplicitRangeInclusive(slice.start,slice.end)){return true;}}
-return false;},findTelemetryInternalRanges_(){this.telemetryInternalRanges_=[];let start=0;for(const thread of Object.values(this.process.threads)){for(const slice of thread.asyncSliceGroup.getDescendantEvents()){if(/^telemetry\.internal\..*\.start$/.test(slice.title)){start=slice.start;}else if(/^telemetry\.internal\..*\.end$/.test(slice.title)&&start!==undefined){this.telemetryInternalRanges_.push(tr.b.math.Range.fromExplicitRange(start,slice.end));start=undefined;}}}},getFrameEventsInRange(frametimeType,range){const titleToGet=(frametimeType===MAIN_FRAMETIME_TYPE?MAIN_RENDERING_STATS:IMPL_RENDERING_STATS);const frameEvents=[];for(const event of this.process.getDescendantEvents()){if(event.title===titleToGet){if(range.intersectsExplicitRangeInclusive(event.start,event.end)){frameEvents.push(event);}}}
-frameEvents.sort(function(a,b){return a.start-b.start;});return frameEvents;}};function getFrametimeDataFromEvents(frameEvents){const frametimeData=[];for(let i=1;i<frameEvents.length;i++){const diff=frameEvents[i].start-frameEvents[i-1].start;frametimeData.push({'x':frameEvents[i].start,'frametime':diff});}
-return frametimeData;}
-return{ChromeProcessHelper,MAIN_FRAMETIME_TYPE,IMPL_FRAMETIME_TYPE,MAIN_RENDERING_STATS,IMPL_RENDERING_STATS,getSlicesIntersectingRange,getFrametimeDataFromEvents,};});'use strict';tr.exportTo('tr.model.helpers',function(){function ChromeBrowserHelper(modelHelper,process){tr.model.helpers.ChromeProcessHelper.call(this,modelHelper,process);this.mainThread_=process.findAtMostOneThreadNamed('CrBrowserMain');if(!process.name){process.name=ChromeBrowserHelper.PROCESS_NAME;}}
-ChromeBrowserHelper.PROCESS_NAME='Browser';ChromeBrowserHelper.isBrowserProcess=function(process){return!!process.findAtMostOneThreadNamed('CrBrowserMain');};ChromeBrowserHelper.prototype={__proto__:tr.model.helpers.ChromeProcessHelper.prototype,get browserName(){const hasInProcessRendererThread=this.process.findAllThreadsNamed('Chrome_InProcRendererThread').length>0;return hasInProcessRendererThread?'webview':'chrome';},get mainThread(){return this.mainThread_;},get rendererHelpers(){return this.modelHelper.rendererHelpers;},getLoadingEventsInRange(rangeOfInterest){return this.getAllAsyncSlicesMatching(function(slice){return slice.title.indexOf('WebContentsImpl Loading')===0&&rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end);});},getCommitProvisionalLoadEventsInRange(rangeOfInterest){return this.getAllAsyncSlicesMatching(function(slice){return slice.title==='RenderFrameImpl::didCommitProvisionalLoad'&&rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end);});},get hasLatencyEvents(){let hasLatency=false;for(const thread of this.modelHelper.model.getAllThreads()){for(const event of thread.getDescendantEvents()){if(!event.isTopLevel)continue;if(!(event instanceof tr.e.cc.InputLatencyAsyncSlice)){continue;}
-hasLatency=true;}}
-return hasLatency;},getLatencyEventsInRange(rangeOfInterest){return this.getAllAsyncSlicesMatching(function(slice){return(slice.title.indexOf('InputLatency')===0)&&rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end);});},getAllAsyncSlicesMatching(pred,opt_this){const events=[];this.iterAllThreads(function(thread){for(const slice of thread.getDescendantEvents()){if(pred.call(opt_this,slice)){events.push(slice);}}});return events;},iterAllThreads(func,opt_this){for(const thread of Object.values(this.process.threads)){func.call(opt_this,thread);}
-for(const rendererHelper of Object.values(this.rendererHelpers)){const rendererProcess=rendererHelper.process;for(const thread of Object.values(rendererProcess.threads)){func.call(opt_this,thread);}}}};return{ChromeBrowserHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){function ChromeGpuHelper(modelHelper,process){tr.model.helpers.ChromeProcessHelper.call(this,modelHelper,process);if(!process.name){process.name=ChromeGpuHelper.PROCESS_NAME;}}
-ChromeGpuHelper.PROCESS_NAME='GPU Process';ChromeGpuHelper.isGpuProcess=function(process){if(process.findAtMostOneThreadNamed('CrBrowserMain')||process.findAtMostOneThreadNamed('CrRendererMain')){return false;}
-return process.findAllThreadsNamed('CrGpuMain').length>0;};ChromeGpuHelper.prototype={__proto__:tr.model.helpers.ChromeProcessHelper.prototype};return{ChromeGpuHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){const NET_CATEGORIES=new Set(['net','netlog','disabled-by-default-netlog','disabled-by-default-network']);class ChromeThreadHelper{constructor(thread){this.thread=thread;}
-getNetworkEvents(){const networkEvents=[];for(const slice of this.thread.asyncSliceGroup.slices){const categories=tr.b.getCategoryParts(slice.category);const isNetEvent=category=>NET_CATEGORIES.has(category);if(categories.filter(isNetEvent).length===0)continue;networkEvents.push(slice);}
-return networkEvents;}}
-return{ChromeThreadHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){const ChromeThreadHelper=tr.model.helpers.ChromeThreadHelper;function ChromeRendererHelper(modelHelper,process){tr.model.helpers.ChromeProcessHelper.call(this,modelHelper,process);this.mainThread_=process.findAtMostOneThreadNamed('CrRendererMain')||process.findAtMostOneThreadNamed('Chrome_InProcRendererThread');this.compositorThread_=process.findAtMostOneThreadNamed('Compositor');this.rasterWorkerThreads_=process.findAllThreadsMatching(function(t){if(t.name===undefined)return false;if(t.name.startsWith('CompositorTileWorker'))return true;if(t.name.startsWith('CompositorRasterWorker'))return true;return false;});this.dedicatedWorkerThreads_=process.findAllThreadsMatching(function(t){return t.name&&t.name.startsWith('DedicatedWorker');});this.serviceWorkerThreads_=process.findAllThreadsMatching(function(t){return t.name&&t.name.startsWith('ServiceWorker');});this.foregroundWorkerThreads_=process.findAllThreadsMatching(function(t){return t.name&&t.name.startsWith('ThreadPoolForegroundWorker');});if(!process.name){process.name=ChromeRendererHelper.PROCESS_NAME;}}
-ChromeRendererHelper.PROCESS_NAME='Renderer';ChromeRendererHelper.isRenderProcess=function(process){if(process.findAtMostOneThreadNamed('CrRendererMain'))return true;if(process.findAtMostOneThreadNamed('Compositor'))return true;return false;};ChromeRendererHelper.isTracingProcess=function(process){return process.labels!==undefined&&process.labels.length===1&&process.labels[0]==='chrome://tracing';};ChromeRendererHelper.prototype={__proto__:tr.model.helpers.ChromeProcessHelper.prototype,get mainThread(){return this.mainThread_;},get compositorThread(){return this.compositorThread_;},get rasterWorkerThreads(){return this.rasterWorkerThreads_;},get dedicatedWorkerThreads(){return this.dedicatedWorkerThreads_;},get serviceWorkerThreads(){return this.serviceWorkerThreads_;},get foregroundWorkerThreads(){return this.foregroundWorkerThreads_;},get isChromeTracingUI(){return ChromeRendererHelper.isTracingProcess(this.process);},};return{ChromeRendererHelper,};});'use strict';tr.exportTo('tr.model.um',function(){class Segment extends tr.model.TimedEvent{constructor(start,duration){super(start);this.duration=duration;this.expectations_=[];}
-get expectations(){return this.expectations_;}
-clone(){const clone=new Segment(this.start,this.duration);clone.expectations.push(...this.expectations);return clone;}
-addSegment(other){this.duration+=other.duration;this.expectations.push(...other.expectations);}}
-return{Segment,};});'use strict';tr.exportTo('tr.model.helpers',function(){const GESTURE_EVENT='SyntheticGestureController::running';const IR_REG_EXP=/Interaction\.([^/]+)(\/[^/]*)?$/;const ChromeRendererHelper=tr.model.helpers.ChromeRendererHelper;class TelemetryHelper{constructor(modelHelper){this.modelHelper=modelHelper;this.renderersWithIR_=undefined;this.irSegments_=undefined;this.uiSegments_=undefined;this.animationSegments_=undefined;}
-get renderersWithIR(){this.findIRs_();return this.renderersWithIR_;}
-get irSegments(){this.findIRs_();return this.irSegments_;}
-get uiSegments(){this.findIRs_();return this.uiSegments_;}
-get animationSegments(){if(this.animationSegments_===undefined){const model=this.modelHelper.model;this.animationSegments_=model.userModel.segments.filter(segment=>segment.expectations.find(ue=>ue instanceof tr.model.um.AnimationExpectation));this.animationSegments_.sort((x,y)=>x.start-y.start);}
-return this.animationSegments_;}
-findIRs_(){if(this.irSegments_!==undefined)return;this.renderersWithIR_=[];const gestureEvents=[];const interactionRecords=[];const processes=Object.values(this.modelHelper.rendererHelpers).concat(this.modelHelper.browserHelpers).map(processHelper=>processHelper.process);for(const process of processes){let foundIR=false;for(const thread of Object.values(process.threads)){for(const slice of thread.asyncSliceGroup.slices){if(slice.title===GESTURE_EVENT){gestureEvents.push(slice);}else if(IR_REG_EXP.test(slice.title)){interactionRecords.push(slice);foundIR=true;}}}
-if(foundIR&&ChromeRendererHelper.isRenderProcess(process)&&!ChromeRendererHelper.isTracingProcess(process)){this.renderersWithIR_.push(new ChromeRendererHelper(this.modelHelper,process));}}
-this.irSegments_=[];this.uiSegments_=[];for(const ir of interactionRecords){const parts=IR_REG_EXP.exec(ir.title);let gestureEventFound=false;if(parts[1].startsWith('Gesture_')){for(const gestureEvent of gestureEvents){if(ir.boundsRange.intersectsRangeInclusive(gestureEvent.boundsRange)){this.irSegments_.push(new tr.model.um.Segment(gestureEvent.start,gestureEvent.duration));gestureEventFound=true;break;}}}else if(parts[1].startsWith('ui_')){this.uiSegments_.push(new tr.model.um.Segment(ir.start,ir.duration));}
-if(!gestureEventFound){this.irSegments_.push(new tr.model.um.Segment(ir.start,ir.duration));}}
-this.irSegments_.sort((x,y)=>x.start-y.start);this.uiSegments_.sort((x,y)=>x.start-y.start);}}
-return{TelemetryHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){function findChromeBrowserProcesses(model){return model.getAllProcesses(tr.model.helpers.ChromeBrowserHelper.isBrowserProcess);}
-function findChromeRenderProcesses(model){return model.getAllProcesses(tr.model.helpers.ChromeRendererHelper.isRenderProcess);}
-function findChromeGpuProcess(model){const gpuProcesses=model.getAllProcesses(tr.model.helpers.ChromeGpuHelper.isGpuProcess);if(gpuProcesses.length!==1)return undefined;return gpuProcesses[0];}
-function findTelemetrySurfaceFlingerProcess(model){const surfaceFlingerProcesses=model.getAllProcesses(process=>(process.name==='SurfaceFlinger'));if(surfaceFlingerProcesses.length!==1)return undefined;return surfaceFlingerProcesses[0];}
-function ChromeModelHelper(model){this.model_=model;const browserProcesses=findChromeBrowserProcesses(model);this.browserHelpers_=browserProcesses.map(p=>new tr.model.helpers.ChromeBrowserHelper(this,p));const gpuProcess=findChromeGpuProcess(model);if(gpuProcess){this.gpuHelper_=new tr.model.helpers.ChromeGpuHelper(this,gpuProcess);}else{this.gpuHelper_=undefined;}
-const rendererProcesses_=findChromeRenderProcesses(model);this.rendererHelpers_={};rendererProcesses_.forEach(function(renderProcess){const rendererHelper=new tr.model.helpers.ChromeRendererHelper(this,renderProcess);this.rendererHelpers_[rendererHelper.pid]=rendererHelper;},this);this.surfaceFlingerProcess_=findTelemetrySurfaceFlingerProcess(model);this.chromeBounds_=undefined;this.telemetryHelper_=new tr.model.helpers.TelemetryHelper(this);}
-ChromeModelHelper.guid=tr.b.GUID.allocateSimple();ChromeModelHelper.supportsModel=function(model){if(findChromeBrowserProcesses(model).length)return true;if(findChromeRenderProcesses(model).length)return true;return false;};ChromeModelHelper.prototype={get pid(){throw new Error('woah');},get process(){throw new Error('woah');},get model(){return this.model_;},get browserProcess(){if(this.browserHelper===undefined)return undefined;return this.browserHelper.process;},get browserHelper(){return this.browserHelpers_[0];},get browserHelpers(){return this.browserHelpers_;},get gpuHelper(){return this.gpuHelper_;},get rendererHelpers(){return this.rendererHelpers_;},get surfaceFlingerProcess(){return this.surfaceFlingerProcess_;},get chromeBounds(){if(!this.chromeBounds_){this.chromeBounds_=new tr.b.math.Range();for(const browserHelper of Object.values(this.browserHelpers)){this.chromeBounds_.addRange(browserHelper.process.bounds);}
-for(const rendererHelper of Object.values(this.rendererHelpers)){this.chromeBounds_.addRange(rendererHelper.process.bounds);}
-if(this.gpuHelper){this.chromeBounds_.addRange(this.gpuHelper.process.bounds);}}
-if(this.chromeBounds_.isEmpty){return undefined;}
-return this.chromeBounds_;},get telemetryHelper(){return this.telemetryHelper_;}};return{ChromeModelHelper,};});'use strict';tr.exportTo('tr.e.cc',function(){const AsyncSlice=tr.model.AsyncSlice;const EventSet=tr.model.EventSet;const UI_COMP_NAME='INPUT_EVENT_LATENCY_UI_COMPONENT';const ORIGINAL_COMP_NAME='INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT';const BEGIN_COMP_NAME='INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT';const END_COMP_NAME='INPUT_EVENT_GPU_SWAP_BUFFER_COMPONENT';const LEGACY_END_COMP_NAME='INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT';const MAIN_RENDERER_THREAD_NAME='CrRendererMain';const COMPOSITOR_THREAD_NAME='Compositor';const OLD_IPC_FLOW_EVENT='disabled-by-default-ipc.flow';const OLD_POSTTASK_FLOW_EVENT='disabled-by-default-toplevel.flow';const NEW_POSTTASK_FLOW_EVENT='toplevel.flow';const INPUT_EVENT_TYPE_NAMES={CHAR:'Char',CLICK:'GestureClick',CONTEXT_MENU:'ContextMenu',FLING_CANCEL:'GestureFlingCancel',FLING_START:'GestureFlingStart',KEY_DOWN:'KeyDown',KEY_DOWN_RAW:'RawKeyDown',KEY_UP:'KeyUp',LATENCY_SCROLL_UPDATE:'ScrollUpdate',MOUSE_DOWN:'MouseDown',MOUSE_ENTER:'MouseEnter',MOUSE_LEAVE:'MouseLeave',MOUSE_MOVE:'MouseMove',MOUSE_UP:'MouseUp',MOUSE_WHEEL:'MouseWheel',PINCH_BEGIN:'GesturePinchBegin',PINCH_END:'GesturePinchEnd',PINCH_UPDATE:'GesturePinchUpdate',SCROLL_BEGIN:'GestureScrollBegin',SCROLL_END:'GestureScrollEnd',SCROLL_UPDATE:'GestureScrollUpdate',SCROLL_UPDATE_RENDERER:'ScrollUpdate',SHOW_PRESS:'GestureShowPress',TAP:'GestureTap',TAP_CANCEL:'GestureTapCancel',TAP_DOWN:'GestureTapDown',TOUCH_CANCEL:'TouchCancel',TOUCH_END:'TouchEnd',TOUCH_MOVE:'TouchMove',TOUCH_START:'TouchStart',UNKNOWN:'UNKNOWN'};function InputLatencyAsyncSlice(){AsyncSlice.apply(this,arguments);this.associatedEvents_=new EventSet();this.typeName_=undefined;if(!this.isLegacyEvent){this.determineModernTypeName_();}}
-InputLatencyAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get isLegacyEvent(){return this.title==='InputLatency';},get typeName(){if(!this.typeName_){this.determineLegacyTypeName_();}
-return this.typeName_;},checkTypeName_(){if(!this.typeName_){throw new Error('Unable to determine typeName');}
-let found=false;for(const typeName in INPUT_EVENT_TYPE_NAMES){if(this.typeName===INPUT_EVENT_TYPE_NAMES[typeName]){found=true;break;}}
-if(!found){this.typeName_=INPUT_EVENT_TYPE_NAMES.UNKNOWN;}},determineModernTypeName_(){const lastColonIndex=this.title.lastIndexOf(':');if(lastColonIndex<0)return;const characterAfterLastColonIndex=lastColonIndex+1;this.typeName_=this.title.slice(characterAfterLastColonIndex);this.checkTypeName_();},determineLegacyTypeName_(){for(const subSlice of this.enumerateAllDescendents()){const subSliceIsAInputLatencyAsyncSlice=(subSlice instanceof InputLatencyAsyncSlice);if(!subSliceIsAInputLatencyAsyncSlice)continue;if(!subSlice.typeName)continue;if(this.typeName_&&subSlice.typeName_){const subSliceHasDifferentTypeName=(this.typeName_!==subSlice.typeName_);if(subSliceHasDifferentTypeName){throw new Error('InputLatencyAsyncSlice.determineLegacyTypeName_() '+' found multiple typeNames');}}
-this.typeName_=subSlice.typeName_;}
-if(!this.typeName_){throw new Error('InputLatencyAsyncSlice.determineLegacyTypeName_() failed');}
-this.checkTypeName_();},getRendererHelper(sourceSlices){const traceModel=this.startThread.parent.model;const modelHelper=traceModel.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!modelHelper)return undefined;let mainThread=undefined;let compositorThread=undefined;for(const i in sourceSlices){if(sourceSlices[i].parentContainer.name===MAIN_RENDERER_THREAD_NAME){mainThread=sourceSlices[i].parentContainer;}else if(sourceSlices[i].parentContainer.name===COMPOSITOR_THREAD_NAME){compositorThread=sourceSlices[i].parentContainer;}
-if(mainThread&&compositorThread)break;}
-const rendererHelpers=modelHelper.rendererHelpers;const pids=Object.keys(rendererHelpers);for(let i=0;i<pids.length;i++){const pid=pids[i];const rendererHelper=rendererHelpers[pid];if(rendererHelper.mainThread===mainThread||rendererHelper.compositorThread===compositorThread){return rendererHelper;}}
-return undefined;},addEntireSliceHierarchy(slice){this.associatedEvents_.push(slice);slice.iterateAllSubsequentSlices(function(subsequentSlice){this.associatedEvents_.push(subsequentSlice);},this);},addDirectlyAssociatedEvents(flowEvents){const slices=[];flowEvents.forEach(function(flowEvent){this.associatedEvents_.push(flowEvent);const newSource=flowEvent.startSlice.mostTopLevelSlice;if(slices.indexOf(newSource)===-1){slices.push(newSource);}},this);const lastFlowEvent=flowEvents[flowEvents.length-1];const lastSource=lastFlowEvent.endSlice.mostTopLevelSlice;if(slices.indexOf(lastSource)===-1){slices.push(lastSource);}
-return slices;},belongToOtherInputs(slice,flowEvents){let fromOtherInputs=false;slice.iterateEntireHierarchy(function(subsequentSlice){if(fromOtherInputs)return;subsequentSlice.inFlowEvents.forEach(function(inflow){if(fromOtherInputs)return;if(inflow.category.indexOf('input')>-1){if(flowEvents.indexOf(inflow)===-1){fromOtherInputs=true;}}},this);},this);return fromOtherInputs;},triggerOtherInputs(event,flowEvents){if(event.outFlowEvents===undefined||event.outFlowEvents.length===0){return false;}
-const flow=event.outFlowEvents[0];const isPostTask=flow.category===NEW_POSTTASK_FLOW_EVENT||flow.category===OLD_POSTTASK_FLOW_EVENT;if(!isPostTask||!flow.endSlice){return false;}
-const endSlice=flow.endSlice;if(this.belongToOtherInputs(endSlice.mostTopLevelSlice,flowEvents)){return true;}
-return false;},followSubsequentSlices(event,queue,visited,flowEvents){let stopFollowing=false;let inputAck=false;event.iterateAllSubsequentSlices(function(slice){if(stopFollowing)return;if(slice.title==='TaskQueueManager::RunTask')return;if(slice.title==='ThreadProxy::ScheduledActionSendBeginMainFrame'){return;}
-if(slice.title==='Scheduler::ScheduleBeginImplFrameDeadline'){if(this.triggerOtherInputs(slice,flowEvents))return;}
-if(slice.title==='CompositorImpl::PostComposite'){if(this.triggerOtherInputs(slice,flowEvents))return;}
-if(slice.title==='InputRouterImpl::ProcessInputEventAck'){inputAck=true;}
-if(inputAck&&slice.title==='InputRouterImpl::FilterAndSendWebInputEvent'){stopFollowing=true;}
-this.followCurrentSlice(slice,queue,visited);},this);},followCurrentSlice(event,queue,visited){event.outFlowEvents.forEach(function(outflow){if((outflow.category===NEW_POSTTASK_FLOW_EVENT||outflow.category===OLD_POSTTASK_FLOW_EVENT||outflow.category===OLD_IPC_FLOW_EVENT)&&outflow.endSlice){this.associatedEvents_.push(outflow);const nextEvent=outflow.endSlice.mostTopLevelSlice;if(!visited.contains(nextEvent)){visited.push(nextEvent);queue.push(nextEvent);}}},this);},backtraceFromDraw(beginImplFrame,visited){const pendingEventQueue=[];pendingEventQueue.push(beginImplFrame.mostTopLevelSlice);while(pendingEventQueue.length!==0){const event=pendingEventQueue.pop();this.addEntireSliceHierarchy(event);event.inFlowEvents.forEach(function(inflow){if(inflow.category===POSTTASK_FLOW_EVENT&&inflow.startSlice){const nextEvent=inflow.startSlice.mostTopLevelSlice;if(!visited.contains(nextEvent)){visited.push(nextEvent);pendingEventQueue.push(nextEvent);}}},this);}},sortRasterizerSlices(rasterWorkerThreads,sortedRasterizerSlices){rasterWorkerThreads.forEach(function(rasterizer){Array.prototype.push.apply(sortedRasterizerSlices,rasterizer.sliceGroup.slices);},this);sortedRasterizerSlices.sort(function(a,b){if(a.start!==b.start){return a.start-b.start;}
-return a.guid-b.guid;});},addRasterizationEvents(prepareTiles,rendererHelper,visited,flowEvents,sortedRasterizerSlices){if(!prepareTiles.args.prepare_tiles_id)return;if(!rendererHelper||!rendererHelper.rasterWorkerThreads){return;}
-const rasterWorkerThreads=rendererHelper.rasterWorkerThreads;const prepareTileId=prepareTiles.args.prepare_tiles_id;const pendingEventQueue=[];if(sortedRasterizerSlices.length===0){this.sortRasterizerSlices(rasterWorkerThreads,sortedRasterizerSlices);}
-let numFinishedTasks=0;const RASTER_TASK_TITLE='RasterizerTaskImpl::RunOnWorkerThread';const IMAGEDECODE_TASK_TITLE='ImageDecodeTaskImpl::RunOnWorkerThread';const FINISHED_TASK_TITLE='TaskSetFinishedTaskImpl::RunOnWorkerThread';for(let i=0;i<sortedRasterizerSlices.length;i++){const task=sortedRasterizerSlices[i];if(task.title===RASTER_TASK_TITLE||task.title===IMAGEDECODE_TASK_TITLE){if(task.args.source_prepare_tiles_id===prepareTileId){this.addEntireSliceHierarchy(task.mostTopLevelSlice);}}else if(task.title===FINISHED_TASK_TITLE){if(task.start>prepareTiles.start){pendingEventQueue.push(task.mostTopLevelSlice);if(++numFinishedTasks===3)break;}}}
-while(pendingEventQueue.length!==0){const event=pendingEventQueue.pop();this.addEntireSliceHierarchy(event);this.followSubsequentSlices(event,pendingEventQueue,visited,flowEvents);}},addOtherCausallyRelatedEvents(rendererHelper,sourceSlices,flowEvents,sortedRasterizerSlices){const pendingEventQueue=[];const visitedEvents=new EventSet();let beginImplFrame=undefined;let prepareTiles=undefined;sortedRasterizerSlices=[];sourceSlices.forEach(function(sourceSlice){if(!visitedEvents.contains(sourceSlice)){visitedEvents.push(sourceSlice);pendingEventQueue.push(sourceSlice);}},this);while(pendingEventQueue.length!==0){const event=pendingEventQueue.pop();this.addEntireSliceHierarchy(event);this.followCurrentSlice(event,pendingEventQueue,visitedEvents);this.followSubsequentSlices(event,pendingEventQueue,visitedEvents,flowEvents);const COMPOSITOR_PREPARE_TILES='TileManager::PrepareTiles';prepareTiles=event.findDescendentSlice(COMPOSITOR_PREPARE_TILES);if(prepareTiles){this.addRasterizationEvents(prepareTiles,rendererHelper,visitedEvents,flowEvents,sortedRasterizerSlices);}
-const COMPOSITOR_ON_BIFD='Scheduler::OnBeginImplFrameDeadline';beginImplFrame=event.findDescendentSlice(COMPOSITOR_ON_BIFD);if(beginImplFrame){this.backtraceFromDraw(beginImplFrame,visitedEvents);}}},get associatedEvents(){if(this.associatedEvents_.length!==0){return this.associatedEvents_;}
-const modelIndices=this.startThread.parent.model.modelIndices;const flowEvents=modelIndices.getFlowEventsWithId(this.id);if(flowEvents.length===0){return this.associatedEvents_;}
-const sourceSlices=this.addDirectlyAssociatedEvents(flowEvents);const rendererHelper=this.getRendererHelper(sourceSlices);this.addOtherCausallyRelatedEvents(rendererHelper,sourceSlices,flowEvents);return this.associatedEvents_;},get inputLatency(){if(!('data'in this.args))return undefined;const data=this.args.data;const endTimeComp=data[END_COMP_NAME]||data[LEGACY_END_COMP_NAME];if(endTimeComp===undefined)return undefined;let latency=0;const endTime=endTimeComp.time;if(ORIGINAL_COMP_NAME in data){latency=endTime-data[ORIGINAL_COMP_NAME].time;}else if(UI_COMP_NAME in data){latency=endTime-data[UI_COMP_NAME].time;}else if(BEGIN_COMP_NAME in data){latency=endTime-data[BEGIN_COMP_NAME].time;}else{throw new Error('No valid begin latency component');}
-return latency;}};const eventTypeNames=['Char','ContextMenu','GestureClick','GestureFlingCancel','GestureFlingStart','GestureScrollBegin','GestureScrollEnd','GestureScrollUpdate','GestureShowPress','GestureTap','GestureTapCancel','GestureTapDown','GesturePinchBegin','GesturePinchEnd','GesturePinchUpdate','KeyDown','KeyUp','MouseDown','MouseEnter','MouseLeave','MouseMove','MouseUp','MouseWheel','RawKeyDown','ScrollUpdate','TouchCancel','TouchEnd','TouchMove','TouchStart'];const allTypeNames=['InputLatency'];eventTypeNames.forEach(function(eventTypeName){allTypeNames.push('InputLatency:'+eventTypeName);allTypeNames.push('InputLatency::'+eventTypeName);});AsyncSlice.subTypes.register(InputLatencyAsyncSlice,{typeNames:allTypeNames,categoryParts:['latencyInfo']});return{InputLatencyAsyncSlice,INPUT_EVENT_TYPE_NAMES,};});'use strict';tr.exportTo('tr.e.chrome',function(){const SAME_AS_PARENT='same-as-parent';const TITLES_FOR_USER_FRIENDLY_CATEGORY={composite:['CompositingInputsUpdater::update','ThreadProxy::SetNeedsUpdateLayers','LayerTreeHost::DoUpdateLayers','LayerTreeHost::UpdateLayers::BuildPropertyTrees','LocalFrameView::pushPaintArtifactToCompositor','LocalFrameView::updateCompositedSelectionIfNeeded','LocalFrameView::RunCompositingLifecyclePhase','UpdateLayerTree',],gc:['minorGC','majorGC','MajorGC','MinorGC','V8.GCScavenger','V8.GCIncrementalMarking','V8.GCIdleNotification','V8.GCContext','V8.GCCompactor','V8GCController::traceDOMWrappers',],iframe_creation:['WebLocalFrameImpl::createChildframe',],imageDecode:['Decode Image','ImageFrameGenerator::decode','ImageFrameGenerator::decodeAndScale','ImageFrameGenerator::decodeToYUV','ImageResourceContent::updateImage',],input:['HitTest','ScrollableArea::scrollPositionChanged','EventHandler::handleMouseMoveEvent',],layout:['IntersectionObserverController::computeTrackedIntersectionObservations','LocalFrameView::invalidateTree','LocalFrameView::layout','LocalFrameView::performLayout','LocalFrameView::performPostLayoutTasks','LocalFrameView::performPreLayoutTasks','LocalFrameView::RunStyleAndLayoutCompositingPhases','Layout','PaintLayer::updateLayerPositionsAfterLayout','ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities','WebViewImpl::updateAllLifecyclePhases','WebViewImpl::beginFrame',],parseHTML:['BackgroundHTMLParser::pumpTokenizer','BackgroundHTMLParser::sendTokensToMainThread','HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser','HTMLDocumentParser::documentElementAvailable','HTMLDocumentParser::notifyPendingTokenizedChunks','HTMLDocumentParser::processParsedChunkFromBackgroundParser','HTMLDocumentParser::processTokenizedChunkFromBackgroundParser','ParseHTML',],raster:['DisplayListRasterSource::PerformSolidColorAnalysis','Picture::Raster','RasterBufferImpl::Playback','RasterTask','RasterizerTaskImpl::RunOnWorkerThread','SkCanvas::drawImageRect()','SkCanvas::drawPicture()','SkCanvas::drawTextBlob()','TileTaskWorkerPool::PlaybackToMemory',],record:['Canvas2DLayerBridge::flushRecordingOnly','CompositingInputsUpdater::update','CompositingRequirementsUpdater::updateRecursive','ContentLayerDelegate::paintContents','DisplayItemList::Finalize','LocalFrameView::RunPaintLifecyclePhase','LocalFrameView::RunPrePaintLifecyclePhase','Paint','PaintController::commitNewDisplayItems','PaintLayerCompositor::updateIfNeededRecursive','Picture::Record','PictureLayer::Update',],style:['CSSParserImpl::parseStyleSheet.parse','CSSParserImpl::parseStyleSheet.tokenize','Document::rebuildLayoutTree','Document::recalcStyle','Document::updateActiveStyle','Document::updateStyle','Document::updateStyleInvalidationIfNeeded','LocalFrameView::updateStyleAndLayoutIfNeededRecursive','ParseAuthorStyleSheet','RuleSet::addRulesFromSheet','StyleElement::processStyleSheet','StyleEngine::createResolver','StyleEngine::updateActiveStyleSheets','StyleSheetContents::parseAuthorStyleSheet','UpdateLayoutTree',],script_parse_and_compile:['V8.CompileFullCode','V8.NewContext','V8.Parse','V8.ParseLazy','V8.RecompileSynchronous','V8.ScriptCompiler','v8.compile','v8.parseOnBackground',],script_execute:['EvaluateScript','FunctionCall','HTMLParserScriptRunner ExecuteScript','V8.Execute','V8.RunMicrotasks','V8.Task','WindowProxy::initialize','v8.callFunction','v8.run',],resource_loading:['RenderFrameImpl::didFinishDocumentLoad','RenderFrameImpl::didFinishLoad','Resource::appendData','ResourceDispatcher::OnReceivedData','ResourceDispatcher::OnReceivedResponse','ResourceDispatcher::OnRequestComplete','ResourceFetcher::requestResource','WebURLLoaderImpl::Context::Cancel','WebURLLoaderImpl::Context::OnCompletedRequest','WebURLLoaderImpl::Context::OnReceivedData','WebURLLoaderImpl::Context::OnReceivedRedirect','WebURLLoaderImpl::Context::OnReceivedResponse','WebURLLoaderImpl::Context::Start','WebURLLoaderImpl::loadAsynchronously','WebURLLoaderImpl::loadSynchronously','content::mojom::URLLoaderClient',],renderer_misc:['DecodeFont','ThreadState::completeSweep',],v8_runtime:[],[SAME_AS_PARENT]:['SyncChannel::Send',]};const COLOR_FOR_USER_FRIENDLY_CATEGORY=new tr.b.SinebowColorGenerator();const USER_FRIENDLY_CATEGORY_FOR_TITLE=new Map();for(const category in TITLES_FOR_USER_FRIENDLY_CATEGORY){TITLES_FOR_USER_FRIENDLY_CATEGORY[category].forEach(function(title){USER_FRIENDLY_CATEGORY_FOR_TITLE.set(title,category);});}
-const USER_FRIENDLY_CATEGORY_FOR_EVENT_CATEGORY={netlog:'net',overhead:'overhead',startup:'startup',gpu:'gpu',};function ChromeUserFriendlyCategoryDriver(){}
-ChromeUserFriendlyCategoryDriver.fromEvent=function(event){let userFriendlyCategory=USER_FRIENDLY_CATEGORY_FOR_TITLE.get(event.title);if(userFriendlyCategory){if(userFriendlyCategory===SAME_AS_PARENT){if(event.parentSlice){return ChromeUserFriendlyCategoryDriver.fromEvent(event.parentSlice);}}else{return userFriendlyCategory;}}
-const eventCategoryParts=tr.b.getCategoryParts(event.category);for(let i=0;i<eventCategoryParts.length;++i){const eventCategory=eventCategoryParts[i];userFriendlyCategory=USER_FRIENDLY_CATEGORY_FOR_EVENT_CATEGORY[eventCategory];if(userFriendlyCategory){return userFriendlyCategory;}}
-return'other';};ChromeUserFriendlyCategoryDriver.getColor=function(ufc){return COLOR_FOR_USER_FRIENDLY_CATEGORY.colorForKey(ufc);};ChromeUserFriendlyCategoryDriver.ALL_TITLES=['other'];for(const category in TITLES_FOR_USER_FRIENDLY_CATEGORY){if(category===SAME_AS_PARENT)continue;ChromeUserFriendlyCategoryDriver.ALL_TITLES.push(category);}
-for(const category of Object.values(USER_FRIENDLY_CATEGORY_FOR_EVENT_CATEGORY)){ChromeUserFriendlyCategoryDriver.ALL_TITLES.push(category);}
-ChromeUserFriendlyCategoryDriver.ALL_TITLES.sort();for(const category of ChromeUserFriendlyCategoryDriver.ALL_TITLES){ChromeUserFriendlyCategoryDriver.getColor(category);}
-return{ChromeUserFriendlyCategoryDriver,};});'use strict';tr.exportTo('tr.model',function(){return{BROWSER_PROCESS_PID_REF:-1,OBJECT_DEFAULT_SCOPE:'ptr',LOCAL_ID_PHASES:new Set(['N','D','O','(',')'])};});'use strict';tr.exportTo('tr.e.audits',function(){const Auditor=tr.c.Auditor;const Alert=tr.model.Alert;const EventInfo=tr.model.EventInfo;function ChromeAuditor(model){Auditor.call(this,model);const modelHelper=this.model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper&&modelHelper.browserHelper){this.modelHelper=modelHelper;}else{this.modelHelper=undefined;}}
-function getMissedFrameAlerts(rendererHelpers){const alerts=[];for(const rendererHelper of rendererHelpers){if(!rendererHelper.compositorThread)continue;const thread=rendererHelper.compositorThread;const asyncSlices=Object.values(thread.asyncSliceGroup.slices);for(const slice of asyncSlices){if(slice.title==='PipelineReporter'&&slice.args.chrome_frame_reporter&&slice.args.chrome_frame_reporter.state==='STATE_DROPPED'){const alertSlices=[slice].concat(slice.subSlices);alerts.push(new Alert(new EventInfo('Dropped Frame','Frame was dropped (i.e. not produced/presented).'),slice.start,alertSlices));}}}
-return alerts;}
-ChromeAuditor.prototype={__proto__:Auditor.prototype,runAnnotate(){if(!this.modelHelper)return;for(const pid in this.modelHelper.rendererHelpers){const rendererHelper=this.modelHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI){rendererHelper.process.important=false;}}},installUserFriendlyCategoryDriverIfNeeded(){this.model.addUserFriendlyCategoryDriver(tr.e.chrome.ChromeUserFriendlyCategoryDriver);},runAudit(){if(!this.modelHelper)return;this.model.replacePIDRefsInPatchups(tr.model.BROWSER_PROCESS_PID_REF,this.modelHelper.browserProcess.pid);this.model.applyObjectRefPatchups();const alerts=getMissedFrameAlerts(Object.values(this.modelHelper.rendererHelpers));this.model.alerts=this.model.alerts.concat(alerts);}};Auditor.register(ChromeAuditor);return{ChromeAuditor,};});'use strict';tr.exportTo('tr.e.chrome',function(){const KNOWN_PROPERTIES={absX:1,absY:1,address:1,anonymous:1,childNeeds:1,children:1,classNames:1,col:1,colSpan:1,float:1,height:1,htmlId:1,name:1,posChildNeeds:1,positioned:1,positionedMovement:1,relX:1,relY:1,relativePositioned:1,row:1,rowSpan:1,selfNeeds:1,stickyPositioned:1,tag:1,width:1};function LayoutObject(snapshot,args){this.snapshot_=snapshot;this.id_=args.address;this.name_=args.name;this.childLayoutObjects_=[];this.otherProperties_={};this.tag_=args.tag;this.relativeRect_=tr.b.math.Rect.fromXYWH(args.relX,args.relY,args.width,args.height);this.absoluteRect_=tr.b.math.Rect.fromXYWH(args.absX,args.absY,args.width,args.height);this.isFloat_=args.float;this.isStickyPositioned_=args.stickyPositioned;this.isPositioned_=args.positioned;this.isRelativePositioned_=args.relativePositioned;this.isAnonymous_=args.anonymous;this.htmlId_=args.htmlId;this.classNames_=args.classNames;this.needsLayoutReasons_=[];if(args.selfNeeds){this.needsLayoutReasons_.push('self');}
-if(args.childNeeds){this.needsLayoutReasons_.push('child');}
-if(args.posChildNeeds){this.needsLayoutReasons_.push('positionedChild');}
-if(args.positionedMovement){this.needsLayoutReasons_.push('positionedMovement');}
-this.tableRow_=args.row;this.tableCol_=args.col;this.tableRowSpan_=args.rowSpan;this.tableColSpan_=args.colSpan;if(args.children){args.children.forEach(function(child){this.childLayoutObjects_.push(new LayoutObject(snapshot,child));}.bind(this));}
-for(const property in args){if(!KNOWN_PROPERTIES[property]){this.otherProperties_[property]=args[property];}}}
-LayoutObject.prototype={get snapshot(){return this.snapshot_;},get id(){return this.id_;},get name(){return this.name_;},get tag(){return this.tag_;},get relativeRect(){return this.relativeRect_;},get absoluteRect(){return this.absoluteRect_;},get isPositioned(){return this.isPositioned_;},get isFloat(){return this.isFloat_;},get isStickyPositioned(){return this.isStickyPositioned_;},get isRelativePositioned(){return this.isRelativePositioned_;},get isAnonymous(){return this.isAnonymous_;},get tableRow(){return this.tableRow_;},get tableCol(){return this.tableCol_;},get tableRowSpan(){return this.tableRowSpan_;},get tableColSpan(){return this.tableColSpan_;},get htmlId(){return this.htmlId_;},get classNames(){return this.classNames_;},get needsLayoutReasons(){return this.needsLayoutReasons_;},get hasChildLayoutObjects(){return this.childLayoutObjects_.length>0;},get childLayoutObjects(){return this.childLayoutObjects_;},traverseTree(cb,opt_this){cb.call(opt_this,this);if(!this.hasChildLayoutObjects)return;this.childLayoutObjects.forEach(function(child){child.traverseTree(cb,opt_this);});},get otherPropertyNames(){const names=[];for(const name in this.otherProperties_){names.push(name);}
-return names;},getProperty(name){return this.otherProperties_[name];},get previousSnapshotLayoutObject(){if(!this.snapshot.previousSnapshot)return undefined;return this.snapshot.previousSnapshot.getLayoutObjectById(this.id);},get nextSnapshotLayoutObject(){if(!this.snapshot.nextSnapshot)return undefined;return this.snapshot.nextSnapshot.getLayoutObjectById(this.id);}};return{LayoutObject,};});'use strict';tr.exportTo('tr.e.chrome',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;const ObjectInstance=tr.model.ObjectInstance;function LayoutTreeInstance(){ObjectInstance.apply(this,arguments);}
-LayoutTreeInstance.prototype={__proto__:ObjectInstance.prototype,};ObjectInstance.subTypes.register(LayoutTreeInstance,{typeName:'LayoutTree'});function LayoutTreeSnapshot(){ObjectSnapshot.apply(this,arguments);this.rootLayoutObject=new tr.e.chrome.LayoutObject(this,this.args);}
-LayoutTreeSnapshot.prototype={__proto__:ObjectSnapshot.prototype,};ObjectSnapshot.subTypes.register(LayoutTreeSnapshot,{typeName:'LayoutTree'});return{LayoutTreeInstance,LayoutTreeSnapshot,};});'use strict';tr.exportTo('tr.model',function(){function EventContainer(){this.guid_=tr.b.GUID.allocateSimple();this.important=true;this.bounds_=new tr.b.math.Range();}
-EventContainer.prototype={get guid(){return this.guid_;},get stableId(){throw new Error('Not implemented');},get bounds(){return this.bounds_;},updateBounds(){throw new Error('Not implemented');},shiftTimestampsForward(amount){throw new Error('Not implemented');},*childEvents(){},*getDescendantEvents(){yield*this.childEvents();for(const container of this.childEventContainers()){yield*container.getDescendantEvents();}},*childEventContainers(){},*getDescendantEventContainers(){yield this;for(const container of this.childEventContainers()){yield*container.getDescendantEventContainers();}},*getDescendantEventsInSortedRanges(ranges,opt_containerPredicate){if(opt_containerPredicate===undefined||opt_containerPredicate(this)){for(const event of this.childEvents()){const i=tr.b.findFirstTrueIndexInSortedArray(ranges,range=>event.start<=range.max);if(i<ranges.length&&event.end>=ranges[i].min)yield event;}}
-for(const container of this.childEventContainers()){yield*container.getDescendantEventsInSortedRanges(ranges,opt_containerPredicate);}},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){},*findTopmostSlices(eventPredicate){for(const ec of this.getDescendantEventContainers()){yield*ec.findTopmostSlicesInThisContainer(eventPredicate);}},*findTopmostSlicesNamed(name){yield*this.findTopmostSlices(e=>e.title===name);}};return{EventContainer,};});'use strict';tr.exportTo('tr.model',function(){const Event=tr.model.Event;const EventRegistry=tr.model.EventRegistry;class ResourceUsageSample extends Event{constructor(series,start,usage){super();this.series_=series;this.start_=start;this.usage_=usage;}
-get series(){return this.series_;}
-get start(){return this.start_;}
-set start(value){this.start_=value;}
-get usage(){return this.usage_;}
-set usage(value){this.usage_=value;}
-addBoundsToRange(range){range.addValue(this.start);}}
-EventRegistry.register(ResourceUsageSample,{name:'resourceUsageSample',pluralName:'resourceUsageSamples'});return{ResourceUsageSample,};});'use strict';tr.exportTo('tr.model',function(){const ResourceUsageSample=tr.model.ResourceUsageSample;class ResourceUsageSeries extends tr.model.EventContainer{constructor(device){super();this.device_=device;this.samples_=[];}
-get device(){return this.device_;}
-get samples(){return this.samples_;}
-get stableId(){return this.device_.stableId+'.ResourceUsageSeries';}
-addUsageSample(ts,val){const sample=new ResourceUsageSample(this,ts,val);this.samples_.push(sample);return sample;}
-computeResourceTimeConsumedInMs(start,end){const measurementRange=tr.b.math.Range.fromExplicitRange(start,end);let resourceTimeInMs=0;let startIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,start)-1;const endIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,end);if(startIndex<0)startIndex=0;for(let i=startIndex;i<endIndex;i++){const sample=this.samples[i];const nextSample=this.samples[i+1];const sampleRange=new tr.b.math.Range();sampleRange.addValue(sample.start);sampleRange.addValue(nextSample?nextSample.start:sample.start);const intersectionRangeInMs=measurementRange.findIntersection(sampleRange);resourceTimeInMs+=intersectionRangeInMs.duration*sample.usage;}
-return resourceTimeInMs;}
-getSamplesWithinRange(start,end){const startIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,start);const endIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,end);return this.samples.slice(startIndex,endIndex);}
-shiftTimestampsForward(amount){for(let i=0;i<this.samples_.length;++i){this.samples_[i].start+=amount;}}
-updateBounds(){this.bounds.reset();if(this.samples_.length===0)return;this.bounds.addValue(this.samples_[0].start);this.bounds.addValue(this.samples_[this.samples_.length-1].start);}*childEvents(){yield*this.samples_;}}
-return{ResourceUsageSeries,};});'use strict';tr.exportTo('tr.e.audits',function(){class CpuUsageAuditor extends tr.c.Auditor{constructor(model){super();this.model_=model;}
-runAnnotate(){this.model_.device.cpuUsageSeries=this.computeCpuUsageSeries_(this.model_.bounds.min,this.model_.bounds.max,this.computeCpuUsage_());}
-computeBinSize_(start,end){const MIN_BIN_SIZE_MS=1.0;const MAX_NUM_BINS=100000;const interval=end-start;let binSize=MIN_BIN_SIZE_MS;while(binSize*MAX_NUM_BINS<interval)binSize*=2;return binSize;}
-computeCpuUsageSeries_(start,end,usageRecords){const series=new tr.model.ResourceUsageSeries();if(start===undefined||usageRecords.length===0)return series;const binSize=this.computeBinSize_(start,end);const numBins=Math.ceil((end-start)/binSize);const arr=new Array(numBins).fill(0);for(const record of usageRecords){const firstIndex=Math.ceil((record.start-start)/binSize);const lastIndex=Math.floor((record.end-start)/binSize);for(let i=firstIndex;i<=lastIndex;i++)arr[i]+=record.usage;}
-for(let i=0;i<numBins;i++){series.addUsageSample(start+(i*binSize),arr[i]);}
-return series;}
-computeCpuUsage_(){const model=this.model_;const result=[];for(const pid in model.processes){for(const e of model.processes[pid].getDescendantEvents()){if(!(e instanceof tr.model.ThreadSlice)||e.duration===0||e.cpuDuration===undefined){continue;}
-if(e.selfTime===0||e.selfTime===undefined||e.cpuSelfTime===undefined){continue;}
-const usage=tr.b.math.clamp(e.cpuSelfTime/e.selfTime,0,1);let lastTime=e.start;for(const subslice of e.subSlices){result.push({usage,start:lastTime,end:subslice.start});lastTime=subslice.end;}
-result.push({usage,start:lastTime,end:e.end});}}
-return result;}}
-tr.c.Auditor.register(CpuUsageAuditor);return{CpuUsageAuditor};});'use strict';tr.exportTo('tr.e.img',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function ImageSnapshot(){ObjectSnapshot.apply(this,arguments);}
-ImageSnapshot.prototype={__proto__:ObjectSnapshot.prototype,initialize(){this.data_=this.args.data;this.type_=this.args.params.type;},get data(){return this.data_;},get type(){return this.type_;},};ObjectSnapshot.subTypes.register(ImageSnapshot,{typeNames:['gfx::Image']});return{ImageSnapshot,};});'use strict';tr.exportTo('tr.b',function(){function Base64(){}
-function b64ToUint6(nChr){if(nChr>64&&nChr<91)return nChr-65;if(nChr>96&&nChr<123)return nChr-71;if(nChr>47&&nChr<58)return nChr+4;if(nChr===43)return 62;if(nChr===47)return 63;return 0;}
-Base64.getDecodedBufferLength=function(input){let pad=0;if(input.substr(-2)==='=='){pad=2;}else if(input.substr(-1)==='='){pad=1;}
-return((input.length*3+1)>>2)-pad;};Base64.EncodeArrayBufferToString=function(input){let binary='';const bytes=new Uint8Array(input);const len=bytes.byteLength;for(let i=0;i<len;i++){binary+=String.fromCharCode(bytes[i]);}
-return btoa(binary);};Base64.DecodeToTypedArray=function(input,output){const nInLen=input.length;const nOutLen=Base64.getDecodedBufferLength(input);let nMod3=0;let nMod4=0;let nUint24=0;let nOutIdx=0;if(nOutLen>output.byteLength){throw new Error('Output buffer too small to decode.');}
-for(let nInIdx=0;nInIdx<nInLen;nInIdx++){nMod4=nInIdx&3;nUint24|=b64ToUint6(input.charCodeAt(nInIdx))<<18-6*nMod4;if(nMod4===3||nInLen-nInIdx===1){for(nMod3=0;nMod3<3&&nOutIdx<nOutLen;nMod3++,nOutIdx++){output.setUint8(nOutIdx,nUint24>>>(16>>>nMod3&24)&255);}
-nUint24=0;}}
-return nOutLen;};Base64.btoa=function(input){return btoa(input);};Base64.atob=function(input){return atob(input);};return{Base64,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){function Parser(importer){this.importer=importer;this.model=importer.model;}
-Parser.prototype={__proto__:Object.prototype};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.mandatoryBaseClass=Parser;tr.b.decorateExtensionRegistry(Parser,options);return{Parser,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const Parser=tr.e.importer.etw.Parser;const guid='68FDD900-4A3E-11D1-84F4-0000F80464E3';const kEventTraceHeaderOpcode=0;function EventTraceParser(importer){Parser.call(this,importer);importer.registerEventHandler(guid,kEventTraceHeaderOpcode,EventTraceParser.prototype.decodeHeader.bind(this));}
-EventTraceParser.prototype={__proto__:Parser.prototype,decodeFields(header,decoder){if(header.version!==2){throw new Error('Incompatible EventTrace event version.');}
-const bufferSize=decoder.decodeUInt32();const version=decoder.decodeUInt32();const providerVersion=decoder.decodeUInt32();const numberOfProcessors=decoder.decodeUInt32();const endTime=decoder.decodeUInt64ToString();const timerResolution=decoder.decodeUInt32();const maxFileSize=decoder.decodeUInt32();const logFileMode=decoder.decodeUInt32();const buffersWritten=decoder.decodeUInt32();const startBuffers=decoder.decodeUInt32();const pointerSize=decoder.decodeUInt32();const eventsLost=decoder.decodeUInt32();const cpuSpeed=decoder.decodeUInt32();const loggerName=decoder.decodeUInteger(header.is64);const logFileName=decoder.decodeUInteger(header.is64);const timeZoneInformation=decoder.decodeTimeZoneInformation();const padding=decoder.decodeUInt32();const bootTime=decoder.decodeUInt64ToString();const perfFreq=decoder.decodeUInt64ToString();const startTime=decoder.decodeUInt64ToString();const reservedFlags=decoder.decodeUInt32();const buffersLost=decoder.decodeUInt32();const sessionNameString=decoder.decodeW16String();const logFileNameString=decoder.decodeW16String();return{bufferSize,version,providerVersion,numberOfProcessors,endTime,timerResolution,maxFileSize,logFileMode,buffersWritten,startBuffers,pointerSize,eventsLost,cpuSpeed,loggerName,logFileName,timeZoneInformation,bootTime,perfFreq,startTime,reservedFlags,buffersLost,sessionNameString,logFileNameString};},decodeHeader(header,decoder){const fields=this.decodeFields(header,decoder);return true;}};Parser.register(EventTraceParser);return{EventTraceParser,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const Parser=tr.e.importer.etw.Parser;const guid='3D6FA8D0-FE05-11D0-9DDA-00C04FD7BA7C';const kProcessStartOpcode=1;const kProcessEndOpcode=2;const kProcessDCStartOpcode=3;const kProcessDCEndOpcode=4;const kProcessDefunctOpcode=39;function ProcessParser(importer){Parser.call(this,importer);importer.registerEventHandler(guid,kProcessStartOpcode,ProcessParser.prototype.decodeStart.bind(this));importer.registerEventHandler(guid,kProcessEndOpcode,ProcessParser.prototype.decodeEnd.bind(this));importer.registerEventHandler(guid,kProcessDCStartOpcode,ProcessParser.prototype.decodeDCStart.bind(this));importer.registerEventHandler(guid,kProcessDCEndOpcode,ProcessParser.prototype.decodeDCEnd.bind(this));importer.registerEventHandler(guid,kProcessDefunctOpcode,ProcessParser.prototype.decodeDefunct.bind(this));}
-ProcessParser.prototype={__proto__:Parser.prototype,decodeFields(header,decoder){if(header.version>5){throw new Error('Incompatible Process event version.');}
-let pageDirectoryBase;if(header.version===1){pageDirectoryBase=decoder.decodeUInteger(header.is64);}
-let uniqueProcessKey;if(header.version>=2){uniqueProcessKey=decoder.decodeUInteger(header.is64);}
-const processId=decoder.decodeUInt32();const parentId=decoder.decodeUInt32();let sessionId;let exitStatus;if(header.version>=1){sessionId=decoder.decodeUInt32();exitStatus=decoder.decodeInt32();}
-let directoryTableBase;if(header.version>=3){directoryTableBase=decoder.decodeUInteger(header.is64);}
-let flags;if(header.version>=4){flags=decoder.decodeUInt32();}
-const userSID=decoder.decodeSID(header.is64);let imageFileName;if(header.version>=1){imageFileName=decoder.decodeString();}
-let commandLine;if(header.version>=2){commandLine=decoder.decodeW16String();}
-let packageFullName;let applicationId;if(header.version>=4){packageFullName=decoder.decodeW16String();applicationId=decoder.decodeW16String();}
-let exitTime;if(header.version===5&&header.opcode===kProcessDefunctOpcode){exitTime=decoder.decodeUInt64ToString();}
-return{pageDirectoryBase,uniqueProcessKey,processId,parentId,sessionId,exitStatus,directoryTableBase,flags,userSID,imageFileName,commandLine,packageFullName,applicationId,exitTime};},decodeStart(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);if(process.hasOwnProperty('has_ended')){throw new Error('Process clash detected.');}
-process.name=fields.imageFileName;return true;},decodeEnd(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);process.has_ended=true;return true;},decodeDCStart(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);if(process.hasOwnProperty('has_ended')){throw new Error('Process clash detected.');}
-process.name=fields.imageFileName;return true;},decodeDCEnd(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);process.has_ended=true;return true;},decodeDefunct(header,decoder){const fields=this.decodeFields(header,decoder);return true;}};Parser.register(ProcessParser);return{ProcessParser,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const Parser=tr.e.importer.etw.Parser;const guid='3D6FA8D1-FE05-11D0-9DDA-00C04FD7BA7C';const kThreadStartOpcode=1;const kThreadEndOpcode=2;const kThreadDCStartOpcode=3;const kThreadDCEndOpcode=4;const kThreadCSwitchOpcode=36;function ThreadParser(importer){Parser.call(this,importer);importer.registerEventHandler(guid,kThreadStartOpcode,ThreadParser.prototype.decodeStart.bind(this));importer.registerEventHandler(guid,kThreadEndOpcode,ThreadParser.prototype.decodeEnd.bind(this));importer.registerEventHandler(guid,kThreadDCStartOpcode,ThreadParser.prototype.decodeDCStart.bind(this));importer.registerEventHandler(guid,kThreadDCEndOpcode,ThreadParser.prototype.decodeDCEnd.bind(this));importer.registerEventHandler(guid,kThreadCSwitchOpcode,ThreadParser.prototype.decodeCSwitch.bind(this));}
-ThreadParser.prototype={__proto__:Parser.prototype,decodeFields(header,decoder){if(header.version>3){throw new Error('Incompatible Thread event version '+
-header.version+'.');}
-const processId=decoder.decodeUInt32();const threadId=decoder.decodeUInt32();let stackBase;let stackLimit;let userStackBase;let userStackLimit;let affinity;let startAddr;let win32StartAddr;let tebBase;let subProcessTag;let basePriority;let pagePriority;let ioPriority;let threadFlags;let waitMode;if(header.version===1){if(header.opcode===kThreadStartOpcode||header.opcode===kThreadDCStartOpcode){stackBase=decoder.decodeUInteger(header.is64);stackLimit=decoder.decodeUInteger(header.is64);userStackBase=decoder.decodeUInteger(header.is64);userStackLimit=decoder.decodeUInteger(header.is64);startAddr=decoder.decodeUInteger(header.is64);win32StartAddr=decoder.decodeUInteger(header.is64);waitMode=decoder.decodeInt8();decoder.skip(3);}}else{stackBase=decoder.decodeUInteger(header.is64);stackLimit=decoder.decodeUInteger(header.is64);userStackBase=decoder.decodeUInteger(header.is64);userStackLimit=decoder.decodeUInteger(header.is64);if(header.version===2){startAddr=decoder.decodeUInteger(header.is64);}else{affinity=decoder.decodeUInteger(header.is64);}
-win32StartAddr=decoder.decodeUInteger(header.is64);tebBase=decoder.decodeUInteger(header.is64);subProcessTag=decoder.decodeUInt32();if(header.version===3){basePriority=decoder.decodeUInt8();pagePriority=decoder.decodeUInt8();ioPriority=decoder.decodeUInt8();threadFlags=decoder.decodeUInt8();}}
-return{processId,threadId,stackBase,stackLimit,userStackBase,userStackLimit,affinity,startAddr,win32StartAddr,tebBase,subProcessTag,waitMode,basePriority,pagePriority,ioPriority,threadFlags};},decodeCSwitchFields(header,decoder){if(header.version<2||header.version>4){throw new Error('Incompatible cswitch event version '+
-header.version+'.');}
-const newThreadId=decoder.decodeUInt32();const oldThreadId=decoder.decodeUInt32();const newThreadPriority=decoder.decodeInt8();const oldThreadPriority=decoder.decodeInt8();const previousCState=decoder.decodeUInt8();const spareByte=decoder.decodeInt8();const oldThreadWaitReason=decoder.decodeInt8();const oldThreadWaitMode=decoder.decodeInt8();const oldThreadState=decoder.decodeInt8();const oldThreadWaitIdealProcessor=decoder.decodeInt8();const newThreadWaitTime=decoder.decodeUInt32();const reserved=decoder.decodeUInt32();return{newThreadId,oldThreadId,newThreadPriority,oldThreadPriority,previousCState,spareByte,oldThreadWaitReason,oldThreadWaitMode,oldThreadState,oldThreadWaitIdealProcessor,newThreadWaitTime,reserved};},decodeStart(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.createThreadIfNeeded(fields.processId,fields.threadId);return true;},decodeEnd(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.removeThreadIfPresent(fields.threadId);return true;},decodeDCStart(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.createThreadIfNeeded(fields.processId,fields.threadId);return true;},decodeDCEnd(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.removeThreadIfPresent(fields.threadId);return true;},decodeCSwitch(header,decoder){const fields=this.decodeCSwitchFields(header,decoder);const cpu=this.importer.getOrCreateCpu(header.cpu);const newThread=this.importer.getThreadFromWindowsTid(fields.newThreadId);let newThreadName;if(newThread&&newThread.userFriendlyName){newThreadName=newThread.userFriendlyName;}else{const newProcessId=this.importer.getPidFromWindowsTid(fields.newThreadId);const newProcess=this.model.getProcess(newProcessId);let newProcessName;if(newProcess){newProcessName=newProcess.name;}else{newProcessName='Unknown process';}
-newThreadName=newProcessName+' (tid '+fields.newThreadId+')';}
-cpu.switchActiveThread(header.timestamp,{},fields.newThreadId,newThreadName,fields);return true;}};Parser.register(ThreadParser);return{ThreadParser,};});'use strict';tr.exportTo('tr.b',function(){function max(a,b){if(a===undefined)return b;if(b===undefined)return a;return Math.max(a,b);}
-function IntervalTree(beginPositionCb,endPositionCb){this.beginPositionCb_=beginPositionCb;this.endPositionCb_=endPositionCb;this.root_=undefined;this.size_=0;}
-IntervalTree.prototype={insert(datum){const startPosition=this.beginPositionCb_(datum);const endPosition=this.endPositionCb_(datum);const node=new IntervalTreeNode(datum,startPosition,endPosition);this.size_++;this.root_=this.insertNode_(this.root_,node);this.root_.colour=Colour.BLACK;return datum;},insertNode_(root,node){if(root===undefined)return node;if(root.leftNode&&root.leftNode.isRed&&root.rightNode&&root.rightNode.isRed){this.flipNodeColour_(root);}
-if(node.key<root.key){root.leftNode=this.insertNode_(root.leftNode,node);}else if(node.key===root.key){root.merge(node);}else{root.rightNode=this.insertNode_(root.rightNode,node);}
-if(root.rightNode&&root.rightNode.isRed&&(root.leftNode===undefined||!root.leftNode.isRed)){root=this.rotateLeft_(root);}
-if(root.leftNode&&root.leftNode.isRed&&root.leftNode.leftNode&&root.leftNode.leftNode.isRed){root=this.rotateRight_(root);}
-return root;},rotateRight_(node){const sibling=node.leftNode;node.leftNode=sibling.rightNode;sibling.rightNode=node;sibling.colour=node.colour;node.colour=Colour.RED;return sibling;},rotateLeft_(node){const sibling=node.rightNode;node.rightNode=sibling.leftNode;sibling.leftNode=node;sibling.colour=node.colour;node.colour=Colour.RED;return sibling;},flipNodeColour_(node){node.colour=this.flipColour_(node.colour);node.leftNode.colour=this.flipColour_(node.leftNode.colour);node.rightNode.colour=this.flipColour_(node.rightNode.colour);},flipColour_(colour){return colour===Colour.RED?Colour.BLACK:Colour.RED;},updateHighValues(){this.updateHighValues_(this.root_);},updateHighValues_(node){if(node===undefined)return undefined;node.maxHighLeft=this.updateHighValues_(node.leftNode);node.maxHighRight=this.updateHighValues_(node.rightNode);return max(max(node.maxHighLeft,node.highValue),node.maxHighRight);},validateFindArguments_(queryLow,queryHigh){if(queryLow===undefined||queryHigh===undefined){throw new Error('queryLow and queryHigh must be defined');}
-if((typeof queryLow!=='number')||(typeof queryHigh!=='number')){throw new Error('queryLow and queryHigh must be numbers');}},findIntersection(queryLow,queryHigh){this.validateFindArguments_(queryLow,queryHigh);if(this.root_===undefined)return[];const ret=[];this.root_.appendIntersectionsInto_(ret,queryLow,queryHigh);return ret;},get size(){return this.size_;},get root(){return this.root_;},dump_(){if(this.root_===undefined)return[];return this.root_.dump();}};const Colour={RED:'red',BLACK:'black'};function IntervalTreeNode(datum,lowValue,highValue){this.lowValue_=lowValue;this.data_=[{datum,high:highValue,low:lowValue}];this.colour_=Colour.RED;this.parentNode_=undefined;this.leftNode_=undefined;this.rightNode_=undefined;this.maxHighLeft_=undefined;this.maxHighRight_=undefined;}
-IntervalTreeNode.prototype={appendIntersectionsInto_(ret,queryLow,queryHigh){if(this.lowValue_>=queryHigh){if(!this.leftNode_)return;return this.leftNode_.appendIntersectionsInto_(ret,queryLow,queryHigh);}
-if(this.maxHighLeft_>queryLow){this.leftNode_.appendIntersectionsInto_(ret,queryLow,queryHigh);}
-if(this.highValue>queryLow){for(let i=(this.data.length-1);i>=0;--i){if(this.data[i].high<queryLow)break;ret.push(this.data[i].datum);}}
-if(this.rightNode_){this.rightNode_.appendIntersectionsInto_(ret,queryLow,queryHigh);}},get colour(){return this.colour_;},set colour(colour){this.colour_=colour;},get key(){return this.lowValue_;},get lowValue(){return this.lowValue_;},get highValue(){return this.data_[this.data_.length-1].high;},set leftNode(left){this.leftNode_=left;},get leftNode(){return this.leftNode_;},get hasLeftNode(){return this.leftNode_!==undefined;},set rightNode(right){this.rightNode_=right;},get rightNode(){return this.rightNode_;},get hasRightNode(){return this.rightNode_!==undefined;},set parentNode(parent){this.parentNode_=parent;},get parentNode(){return this.parentNode_;},get isRootNode(){return this.parentNode_===undefined;},set maxHighLeft(high){this.maxHighLeft_=high;},get maxHighLeft(){return this.maxHighLeft_;},set maxHighRight(high){this.maxHighRight_=high;},get maxHighRight(){return this.maxHighRight_;},get data(){return this.data_;},get isRed(){return this.colour_===Colour.RED;},merge(node){for(let i=0;i<node.data.length;i++){this.data_.push(node.data[i]);}
-this.data_.sort(function(a,b){return a.high-b.high;});},dump(){const ret={};if(this.leftNode_){ret.left=this.leftNode_.dump();}
-ret.data=this.data_.map(function(d){return[d.low,d.high];});if(this.rightNode_){ret.right=this.rightNode_.dump();}
-return ret;}};return{IntervalTree,};});'use strict';tr.exportTo('tr.b.math',function(){const tmpVec2s=[];for(let i=0;i<8;i++){tmpVec2s[i]=vec2.create();}
-const tmpVec2a=vec4.create();const tmpVec4a=vec4.create();const tmpVec4b=vec4.create();const tmpMat4=mat4.create();const tmpMat4b=mat4.create();const p00=vec2.createXY(0,0);const p10=vec2.createXY(1,0);const p01=vec2.createXY(0,1);const p11=vec2.createXY(1,1);const lerpingVecA=vec2.create();const lerpingVecB=vec2.create();function lerpVec2(out,a,b,amt){vec2.scale(lerpingVecA,a,amt);vec2.scale(lerpingVecB,b,1-amt);vec2.add(out,lerpingVecA,lerpingVecB);vec2.normalize(out,out);return out;}
-function Quad(){this.p1=vec2.create();this.p2=vec2.create();this.p3=vec2.create();this.p4=vec2.create();}
-Quad.fromXYWH=function(x,y,w,h){const q=new Quad();vec2.set(q.p1,x,y);vec2.set(q.p2,x+w,y);vec2.set(q.p3,x+w,y+h);vec2.set(q.p4,x,y+h);return q;};Quad.fromRect=function(r){return new Quad.fromXYWH(r.x,r.y,r.width,r.height);};Quad.from4Vecs=function(p1,p2,p3,p4){const q=new Quad();vec2.set(q.p1,p1[0],p1[1]);vec2.set(q.p2,p2[0],p2[1]);vec2.set(q.p3,p3[0],p3[1]);vec2.set(q.p4,p4[0],p4[1]);return q;};Quad.from8Array=function(arr){if(arr.length!==8){throw new Error('Array must be 8 long');}
-const q=new Quad();q.p1[0]=arr[0];q.p1[1]=arr[1];q.p2[0]=arr[2];q.p2[1]=arr[3];q.p3[0]=arr[4];q.p3[1]=arr[5];q.p4[0]=arr[6];q.p4[1]=arr[7];return q;};Quad.prototype={pointInside(point){return pointInImplicitQuad(point,this.p1,this.p2,this.p3,this.p4);},boundingRect(){const x0=Math.min(this.p1[0],this.p2[0],this.p3[0],this.p4[0]);const y0=Math.min(this.p1[1],this.p2[1],this.p3[1],this.p4[1]);const x1=Math.max(this.p1[0],this.p2[0],this.p3[0],this.p4[0]);const y1=Math.max(this.p1[1],this.p2[1],this.p3[1],this.p4[1]);return new tr.b.math.Rect.fromXYWH(x0,y0,x1-x0,y1-y0);},clone(){const q=new Quad();vec2.copy(q.p1,this.p1);vec2.copy(q.p2,this.p2);vec2.copy(q.p3,this.p3);vec2.copy(q.p4,this.p4);return q;},scale(s){const q=new Quad();this.scaleFast(q,s);return q;},scaleFast(dstQuad,s){vec2.copy(dstQuad.p1,this.p1,s);vec2.copy(dstQuad.p2,this.p2,s);vec2.copy(dstQuad.p3,this.p3,s);vec2.copy(dstQuad.p3,this.p3,s);},isRectangle(){const bounds=this.boundingRect();return(bounds.x===this.p1[0]&&bounds.y===this.p1[1]&&bounds.width===this.p2[0]-this.p1[0]&&bounds.y===this.p2[1]&&bounds.width===this.p3[0]-this.p1[0]&&bounds.height===this.p3[1]-this.p2[1]&&bounds.x===this.p4[0]&&bounds.height===this.p4[1]-this.p2[1]);},projectUnitRect(rect){const q=new Quad();this.projectUnitRectFast(q,rect);return q;},projectUnitRectFast(dstQuad,rect){const v12=tmpVec2s[0];const v14=tmpVec2s[1];const v23=tmpVec2s[2];const v43=tmpVec2s[3];vec2.sub(v12,this.p2,this.p1);const l12=vec2.length(v12);vec2.scale(v12,v12,1/l12);vec2.sub(v14,this.p4,this.p1);const l14=vec2.length(v14);vec2.scale(v14,v14,1/l14);vec2.sub(v23,this.p3,this.p2);const l23=vec2.length(v23);vec2.scale(v23,v23,1/l23);vec2.sub(v43,this.p3,this.p4);const l43=vec2.length(v43);vec2.scale(v43,v43,1/l43);const b12=tmpVec2s[0];const b14=tmpVec2s[1];const b23=tmpVec2s[2];const b43=tmpVec2s[3];lerpVec2(b12,v12,v43,rect.y);lerpVec2(b43,v12,v43,1-rect.bottom);lerpVec2(b14,v14,v23,rect.x);lerpVec2(b23,v14,v23,1-rect.right);vec2.addTwoScaledUnitVectors(tmpVec2a,b12,l12*rect.x,b14,l14*rect.y);vec2.add(dstQuad.p1,this.p1,tmpVec2a);vec2.addTwoScaledUnitVectors(tmpVec2a,b12,l12*-(1.0-rect.right),b23,l23*rect.y);vec2.add(dstQuad.p2,this.p2,tmpVec2a);vec2.addTwoScaledUnitVectors(tmpVec2a,b43,l43*-(1.0-rect.right),b23,l23*-(1.0-rect.bottom));vec2.add(dstQuad.p3,this.p3,tmpVec2a);vec2.addTwoScaledUnitVectors(tmpVec2a,b43,l43*rect.left,b14,l14*-(1.0-rect.bottom));vec2.add(dstQuad.p4,this.p4,tmpVec2a);},toString(){return'Quad('+
-vec2.toString(this.p1)+', '+
-vec2.toString(this.p2)+', '+
-vec2.toString(this.p3)+', '+
-vec2.toString(this.p4)+')';}};function sign(p1,p2,p3){return(p1[0]-p3[0])*(p2[1]-p3[1])-
-(p2[0]-p3[0])*(p1[1]-p3[1]);}
-function pointInTriangle2(pt,p1,p2,p3){const b1=sign(pt,p1,p2)<0.0;const b2=sign(pt,p2,p3)<0.0;const b3=sign(pt,p3,p1)<0.0;return((b1===b2)&&(b2===b3));}
-function pointInImplicitQuad(point,p1,p2,p3,p4){return pointInTriangle2(point,p1,p2,p3)||pointInTriangle2(point,p1,p3,p4);}
-return{pointInTriangle2,pointInImplicitQuad,Quad,};});'use strict';tr.exportTo('tr.b',function(){const ESTIMATED_IDLE_PERIOD_LENGTH_MILLISECONDS=10;const REQUEST_IDLE_CALLBACK_TIMEOUT_MILLISECONDS=100;const recordRAFStacks=false;let pendingPreAFs=[];let pendingRAFs=[];const pendingIdleCallbacks=[];let currentRAFDispatchList=undefined;let rafScheduled=false;let idleWorkScheduled=false;function scheduleRAF(){if(rafScheduled)return;rafScheduled=true;if(tr.isHeadless){Promise.resolve().then(function(){processRequests(false,0);},function(e){throw e;});}else{if(window.requestAnimationFrame){window.requestAnimationFrame(processRequests.bind(this,false));}else{const delta=Date.now()-window.performance.now();window.webkitRequestAnimationFrame(function(domTimeStamp){processRequests(false,domTimeStamp-delta);});}}}
-function nativeRequestIdleCallbackSupported(){return!tr.isHeadless&&window.requestIdleCallback;}
-function scheduleIdleWork(){if(idleWorkScheduled)return;if(!nativeRequestIdleCallbackSupported()){scheduleRAF();return;}
-idleWorkScheduled=true;window.requestIdleCallback(function(deadline,didTimeout){processIdleWork(false,deadline);},{timeout:REQUEST_IDLE_CALLBACK_TIMEOUT_MILLISECONDS});}
-function onAnimationFrameError(e,opt_stack){console.log(e.stack);if(tr.isHeadless)throw e;if(opt_stack)console.log(opt_stack);if(e.message){console.error(e.message,e.stack);}else{console.error(e);}}
-function runTask(task,frameBeginTime){try{task.callback.call(task.context,frameBeginTime);}catch(e){tr.b.onAnimationFrameError(e,task.stack);}}
-function processRequests(forceAllTasksToRun,frameBeginTime){rafScheduled=false;const currentPreAFs=pendingPreAFs;currentRAFDispatchList=pendingRAFs;pendingPreAFs=[];pendingRAFs=[];const hasRAFTasks=currentPreAFs.length||currentRAFDispatchList.length;for(let i=0;i<currentPreAFs.length;i++){runTask(currentPreAFs[i],frameBeginTime);}
-while(currentRAFDispatchList.length>0){runTask(currentRAFDispatchList.shift(),frameBeginTime);}
-currentRAFDispatchList=undefined;if((!hasRAFTasks&&!nativeRequestIdleCallbackSupported())||forceAllTasksToRun){const rafCompletionDeadline=frameBeginTime+ESTIMATED_IDLE_PERIOD_LENGTH_MILLISECONDS;processIdleWork(forceAllTasksToRun,{timeRemaining(){return rafCompletionDeadline-window.performance.now();}});}
-if(pendingIdleCallbacks.length>0)scheduleIdleWork();}
-function processIdleWork(forceAllTasksToRun,deadline){idleWorkScheduled=false;while(pendingIdleCallbacks.length>0){runTask(pendingIdleCallbacks.shift());if(!forceAllTasksToRun&&(tr.isHeadless||deadline.timeRemaining()<=0)){break;}}
-if(pendingIdleCallbacks.length>0)scheduleIdleWork();}
-function getStack_(){if(!recordRAFStacks)return'';const stackLines=tr.b.stackTrace();stackLines.shift();return stackLines.join('\n');}
-function requestPreAnimationFrame(callback,opt_this){pendingPreAFs.push({callback,context:opt_this||global,stack:getStack_()});scheduleRAF();}
-function requestAnimationFrameInThisFrameIfPossible(callback,opt_this){if(!currentRAFDispatchList){requestAnimationFrame(callback,opt_this);return;}
-currentRAFDispatchList.push({callback,context:opt_this||global,stack:getStack_()});return;}
-function requestAnimationFrame(callback,opt_this){pendingRAFs.push({callback,context:opt_this||global,stack:getStack_()});scheduleRAF();}
-function animationFrame(){return new Promise(resolve=>requestAnimationFrame(resolve));}
-function requestIdleCallback(callback,opt_this){pendingIdleCallbacks.push({callback,context:opt_this||global,stack:getStack_()});scheduleIdleWork();}
-function forcePendingRAFTasksToRun(frameBeginTime){if(!rafScheduled)return;processRequests(false,frameBeginTime);}
-function forceAllPendingTasksToRunForTest(){if(!rafScheduled&&!idleWorkScheduled)return;processRequests(true,0);}
-function timeout(ms){return new Promise(resolve=>window.setTimeout(resolve,ms));}
-function idle(){return new Promise(resolve=>requestIdleCallback(resolve));}
-return{animationFrame,forceAllPendingTasksToRunForTest,forcePendingRAFTasksToRun,idle,onAnimationFrameError,requestAnimationFrame,requestAnimationFrameInThisFrameIfPossible,requestIdleCallback,requestPreAnimationFrame,timeout,};});'use strict';tr.exportTo('tr.b',function(){class Mark{constructor(groupName,functionName,opt_timestamp){if(tr.isHeadless)return;this.groupName_=groupName;this.functionName_=functionName;const guid=tr.b.GUID.allocateSimple();this.measureName_=`${groupName} ${functionName}`;if(opt_timestamp){this.startMark_={startTime:opt_timestamp};}else{this.startMarkName_=`${this.measureName} ${guid} start`;}
-this.endMark_=undefined;this.endMarkName_=`${this.measureName} ${guid} end`;window.performance.mark(this.startMarkName_);}
-get groupName(){return this.groupName_;}
-get functionName(){return this.functionName_;}
-get measureName(){return this.measureName_;}
-get startMark(){return this.startMark_||tr.b.getOnlyElement(window.performance.getEntriesByName(this.startMarkName_));}
-get endMark(){return this.endMark_||tr.b.getOnlyElement(window.performance.getEntriesByName(this.endMarkName_));}
-get durationMs(){return this.endMark.startTime-this.startMark.startTime;}
-end(opt_timestamp){if(tr.isHeadless)return;if(opt_timestamp){this.endMark_={startTime:opt_timestamp};}else{window.performance.mark(this.endMarkName_);}
-if(!this.startMark_&&!this.endMark_){window.performance.measure(this.measureName_,this.startMarkName_,this.endMarkName_);}else if(Timing.logVoidMarks&&!(window.ga instanceof Function)){console.log('void mark',this.groupName,this.functionName,this.durationMs);}
-if(!(window.ga instanceof Function))return;ga('send',{hitType:'event',eventCategory:this.groupName,eventAction:this.functionName,eventValue:this.durationMs,});}}
-class Timing{static mark(groupName,functionName,opt_timestamp){return new Mark(groupName,functionName,opt_timestamp);}
-static instant(groupName,functionName,opt_value){const valueString=opt_value===undefined?'':' '+opt_value;if(console&&console.timeStamp){console.timeStamp(`${groupName} ${functionName}${valueString}`);}
-if(window&&window.ga instanceof Function){ga('send',{hitType:'event',eventCategory:groupName,eventAction:functionName,eventValue:opt_value,});}}
-static getCurrentTimeMs(){try{return performance.now();}catch(error){}
-return 0;}}
-Timing.logVoidMarks=false;return{Timing,};});'use strict';tr.exportTo('tr.b',function(){const Timing=tr.b.Timing;function Task(runCb,thisArg){if(runCb!==undefined&&thisArg===undefined&&runCb.prototype!==undefined){throw new Error('Almost certainly you meant to pass a bound callback '+'or thisArg.');}
-this.runCb_=runCb;this.thisArg_=thisArg;this.afterTask_=undefined;this.subTasks_=[];this.updatesUi_=false;}
-Task.prototype={get name(){return this.runCb_.name;},set updatesUi(value){this.updatesUi_=value;},subTask(cb,thisArg){if(cb instanceof Task){this.subTasks_.push(cb);}else{this.subTasks_.push(new Task(cb,thisArg));}
-return this.subTasks_[this.subTasks_.length-1];},run(){if(this.runCb_!==undefined)this.runCb_.call(this.thisArg_,this);const subTasks=this.subTasks_;this.subTasks_=undefined;if(!subTasks.length)return this.afterTask_;for(let i=1;i<subTasks.length;i++){subTasks[i-1].afterTask_=subTasks[i];}
-subTasks[subTasks.length-1].afterTask_=this.afterTask_;return subTasks[0];},after(cb,thisArg){if(this.afterTask_){throw new Error('Has an after task already');}
-if(cb instanceof Task){this.afterTask_=cb;}else{this.afterTask_=new Task(cb,thisArg);}
-return this.afterTask_;},enqueue(cb,thisArg){if(!this.afterTask_)return this.after(cb,thisArg);return this.afterTask_.enqueue(cb,thisArg);}};Task.RunSynchronously=function(task){let curTask=task;while(curTask){curTask=curTask.run();}};Task.RunWhenIdle=function(task){return new Promise(function(resolve,reject){let curTask=task;function runAnother(){try{curTask=curTask.run();}catch(e){reject(e);return;}
-if(curTask){if(curTask.updatesUi_){tr.b.requestAnimationFrameInThisFrameIfPossible(runAnother);}else{tr.b.requestIdleCallback(runAnother);}
-return;}
-resolve();}
-tr.b.requestIdleCallback(runAnother);});};return{Task,};});'use strict';tr.exportTo('tr.c',function(){function makeCaseInsensitiveRegex(pattern){pattern=pattern.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');return new RegExp(pattern,'i');}
-function Filter(){}
-Filter.prototype={__proto__:Object.prototype,matchCounter(counter){return true;},matchCpu(cpu){return true;},matchProcess(process){return true;},matchSlice(slice){return true;},matchThread(thread){return true;}};function TitleOrCategoryFilter(text){Filter.call(this);this.regex_=makeCaseInsensitiveRegex(text);if(!text.length){throw new Error('Filter text is empty.');}}
-TitleOrCategoryFilter.prototype={__proto__:Filter.prototype,matchSlice(slice){if(slice.title===undefined&&slice.category===undefined){return false;}
-return this.regex_.test(slice.title)||(!!slice.category&&this.regex_.test(slice.category));}};function ExactTitleFilter(text){Filter.call(this);this.text_=text;if(!text.length){throw new Error('Filter text is empty.');}}
-ExactTitleFilter.prototype={__proto__:Filter.prototype,matchSlice(slice){return slice.title===this.text_;}};function FullTextFilter(text){Filter.call(this);this.regex_=makeCaseInsensitiveRegex(text);this.titleOrCategoryFilter_=new TitleOrCategoryFilter(text);}
-FullTextFilter.prototype={__proto__:Filter.prototype,matchObject_(obj){for(const key in obj){if(!obj.hasOwnProperty(key))continue;if(this.regex_.test(key))return true;if(this.regex_.test(obj[key]))return true;}
-return false;},matchSlice(slice){if(this.titleOrCategoryFilter_.matchSlice(slice))return true;return this.matchObject_(slice.args);}};return{Filter,TitleOrCategoryFilter,ExactTitleFilter,FullTextFilter,};});'use strict';tr.exportTo('tr.model',function(){const ClockDomainId={BATTOR:'BATTOR',UNKNOWN_CHROME_LEGACY:'UNKNOWN_CHROME_LEGACY',LINUX_CLOCK_MONOTONIC:'LINUX_CLOCK_MONOTONIC',LINUX_FTRACE_GLOBAL:'LINUX_FTRACE_GLOBAL',MAC_MACH_ABSOLUTE_TIME:'MAC_MACH_ABSOLUTE_TIME',WIN_ROLLOVER_PROTECTED_TIME_GET_TIME:'WIN_ROLLOVER_PROTECTED_TIME_GET_TIME',WIN_QPC:'WIN_QPC',SYSTRACE:'SYSTRACE',TELEMETRY:'TELEMETRY'};const POSSIBLE_CHROME_CLOCK_DOMAINS=new Set([ClockDomainId.UNKNOWN_CHROME_LEGACY,ClockDomainId.LINUX_CLOCK_MONOTONIC,ClockDomainId.MAC_MACH_ABSOLUTE_TIME,ClockDomainId.WIN_ROLLOVER_PROTECTED_TIME_GET_TIME,ClockDomainId.WIN_QPC]);const BATTOR_FAST_SYNC_THRESHOLD_MS=3;function ClockSyncManager(){this.domainsSeen_=new Set();this.markersBySyncId_=new Map();this.transformerMapByDomainId_={};}
-ClockSyncManager.prototype={addClockSyncMarker(domainId,syncId,startTs,opt_endTs){this.onDomainSeen_(domainId);if(Object.values(ClockDomainId).indexOf(domainId)<0){throw new Error('"'+domainId+'" is not in the list of known '+'clock domain IDs.');}
-if(this.modelDomainId_){throw new Error('Cannot add new clock sync markers after getting '+'a model time transformer.');}
-const marker=new ClockSyncMarker(domainId,startTs,opt_endTs);if(!this.markersBySyncId_.has(syncId)){this.markersBySyncId_.set(syncId,[marker]);return;}
-const markers=this.markersBySyncId_.get(syncId);if(markers.length===2){throw new Error('Clock sync with ID "'+syncId+'" is already '+'complete - cannot add a third clock sync marker to it.');}
-if(markers[0].domainId===domainId){throw new Error('A clock domain cannot sync with itself.');}
-markers.push(marker);this.onSyncCompleted_(markers[0],marker);},get completeSyncIds(){const completeSyncIds=[];for(const[syncId,markers]of this.markersBySyncId){if(markers.length===2)completeSyncIds.push(syncId);}
-return completeSyncIds;},get markersBySyncId(){return this.markersBySyncId_;},get domainsSeen(){return this.domainsSeen_;},getModelTimeTransformer(domainId){this.onDomainSeen_(domainId);if(!this.modelDomainId_){this.selectModelDomainId_();}
-return this.getTimeTransformerRaw_(domainId,this.modelDomainId_).fn;},getModelTimeTransformerInverse(domainId){this.onDomainSeen_(domainId);if(!this.modelDomainId_){this.selectModelDomainId_();}
-return this.getTimeTransformerRaw_(this.modelDomainId_,domainId).fn;},getTimeTransformerError(fromDomainId,toDomainId){this.onDomainSeen_(fromDomainId);this.onDomainSeen_(toDomainId);return this.getTimeTransformerRaw_(fromDomainId,toDomainId).error;},getTimeTransformerRaw_(fromDomainId,toDomainId){const transformer=this.getTransformerBetween_(fromDomainId,toDomainId);if(!transformer){throw new Error('No clock sync markers exist pairing clock domain "'+
-fromDomainId+'" '+'with target clock domain "'+
-toDomainId+'".');}
-return transformer;},getTransformerBetween_(fromDomainId,toDomainId){const visitedDomainIds=new Set();const queue=[{domainId:fromDomainId,transformer:Transformer.IDENTITY}];while(queue.length>0){queue.sort((domain1,domain2)=>domain1.transformer.error-domain2.transformer.error);const current=queue.shift();if(current.domainId===toDomainId){return current.transformer;}
-if(visitedDomainIds.has(current.domainId)){continue;}
-visitedDomainIds.add(current.domainId);const outgoingTransformers=this.transformerMapByDomainId_[current.domainId];if(!outgoingTransformers)continue;for(const outgoingDomainId in outgoingTransformers){const toNextDomainTransformer=outgoingTransformers[outgoingDomainId];const toCurrentDomainTransformer=current.transformer;queue.push({domainId:outgoingDomainId,transformer:Transformer.compose(toNextDomainTransformer,toCurrentDomainTransformer)});}}
-return undefined;},selectModelDomainId_(){this.ensureAllDomainsAreConnected_();for(const chromeDomainId of POSSIBLE_CHROME_CLOCK_DOMAINS){if(this.domainsSeen_.has(chromeDomainId)){this.modelDomainId_=chromeDomainId;return;}}
-const domainsSeenArray=Array.from(this.domainsSeen_);domainsSeenArray.sort();this.modelDomainId_=domainsSeenArray[0];},ensureAllDomainsAreConnected_(){let firstDomainId=undefined;for(const domainId of this.domainsSeen_){if(!firstDomainId){firstDomainId=domainId;continue;}
-if(!this.getTransformerBetween_(firstDomainId,domainId)){throw new Error('Unable to select a master clock domain because no '+'path can be found from "'+firstDomainId+'" to "'+domainId+'".');}}
-return true;},onDomainSeen_(domainId){if(domainId===ClockDomainId.UNKNOWN_CHROME_LEGACY&&!this.domainsSeen_.has(ClockDomainId.UNKNOWN_CHROME_LEGACY)){for(const chromeDomainId of POSSIBLE_CHROME_CLOCK_DOMAINS){if(chromeDomainId===ClockDomainId.UNKNOWN_CHROME_LEGACY){continue;}
-this.collapseDomains_(ClockDomainId.UNKNOWN_CHROME_LEGACY,chromeDomainId);}}
-this.domainsSeen_.add(domainId);},onSyncCompleted_(marker1,marker2){const forwardTransformer=Transformer.fromMarkers(marker1,marker2);const backwardTransformer=Transformer.fromMarkers(marker2,marker1);const existingTransformer=this.getOrCreateTransformerMap_(marker1.domainId)[marker2.domainId];if(!existingTransformer||forwardTransformer.error<existingTransformer.error){this.getOrCreateTransformerMap_(marker1.domainId)[marker2.domainId]=forwardTransformer;this.getOrCreateTransformerMap_(marker2.domainId)[marker1.domainId]=backwardTransformer;}},collapseDomains_(domain1Id,domain2Id){this.getOrCreateTransformerMap_(domain1Id)[domain2Id]=this.getOrCreateTransformerMap_(domain2Id)[domain1Id]=Transformer.IDENTITY;},getOrCreateTransformerMap_(domainId){if(!this.transformerMapByDomainId_[domainId]){this.transformerMapByDomainId_[domainId]={};}
-return this.transformerMapByDomainId_[domainId];},computeDotGraph(){let dotString='graph {\n';const domainsSeen=[...this.domainsSeen_].sort();for(const domainId of domainsSeen){dotString+=`  ${domainId}[shape=box]\n`;}
-const markersBySyncIdEntries=[...this.markersBySyncId_.entries()].sort(([syncId1,markers1],[syncId2,markers2])=>syncId1.localeCompare(syncId2));for(const[syncId,markers]of markersBySyncIdEntries){const sortedMarkers=markers.sort((a,b)=>a.domainId.localeCompare(b.domainId));for(const m of markers){dotString+=`  "${syncId}" -- ${m.domainId} `;dotString+=`[label="[${m.startTs}, ${m.endTs}]"]\n`;}}
-dotString+='}';return dotString;}};function ClockSyncMarker(domainId,startTs,opt_endTs){this.domainId=domainId;this.startTs=startTs;this.endTs=opt_endTs===undefined?startTs:opt_endTs;}
-ClockSyncMarker.prototype={get duration(){return this.endTs-this.startTs;},get ts(){return this.startTs+this.duration/2;}};function Transformer(fn,error){this.fn=fn;this.error=error;}
-Transformer.IDENTITY=new Transformer((x=>x),0);Transformer.compose=function(aToB,bToC){return new Transformer((ts)=>bToC.fn(aToB.fn(ts)),aToB.error+bToC.error);};Transformer.fromMarkers=function(fromMarker,toMarker){let fromTs=fromMarker.ts;let toTs=toMarker.ts;if(fromMarker.domainId===ClockDomainId.BATTOR&&toMarker.duration>BATTOR_FAST_SYNC_THRESHOLD_MS){toTs=toMarker.startTs;}else if(toMarker.domainId===ClockDomainId.BATTOR&&fromMarker.duration>BATTOR_FAST_SYNC_THRESHOLD_MS){fromTs=fromMarker.startTs;}
-const tsShift=toTs-fromTs;return new Transformer((ts)=>ts+tsShift,fromMarker.duration+toMarker.duration);};return{ClockDomainId,ClockSyncManager,};});'use strict';tr.exportTo('tr.model',function(){function CounterSample(series,timestamp,value){tr.model.Event.call(this);this.series_=series;this.timestamp_=timestamp;this.value_=value;}
-CounterSample.groupByTimestamp=function(samples){const samplesByTimestamp=tr.b.groupIntoMap(samples,s=>s.timestamp);const timestamps=Array.from(samplesByTimestamp.keys());timestamps.sort();const groups=[];for(const ts of timestamps){const group=samplesByTimestamp.get(ts);group.sort((x,y)=>x.series.seriesIndex-y.series.seriesIndex);groups.push(group);}
-return groups;};CounterSample.prototype={__proto__:tr.model.Event.prototype,get series(){return this.series_;},get timestamp(){return this.timestamp_;},get value(){return this.value_;},set timestamp(timestamp){this.timestamp_=timestamp;},addBoundsToRange(range){range.addValue(this.timestamp);},getSampleIndex(){return tr.b.findLowIndexInSortedArray(this.series.timestamps,function(x){return x;},this.timestamp_);},get userFriendlyName(){return'Counter sample from '+this.series_.title+' at '+
-tr.b.Unit.byName.timeStampInMs.format(this.timestamp);}};tr.model.EventRegistry.register(CounterSample,{name:'counterSample',pluralName:'counterSamples'});return{CounterSample,};});'use strict';tr.exportTo('tr.model',function(){const CounterSample=tr.model.CounterSample;function CounterSeries(name,color){tr.model.EventContainer.call(this);this.name_=name;this.color_=color;this.timestamps_=[];this.samples_=[];this.counter=undefined;this.seriesIndex=undefined;}
-CounterSeries.prototype={__proto__:tr.model.EventContainer.prototype,get length(){return this.timestamps_.length;},get name(){return this.name_;},get color(){return this.color_;},get samples(){return this.samples_;},get timestamps(){return this.timestamps_;},getSample(idx){return this.samples_[idx];},getTimestamp(idx){return this.timestamps_[idx];},addCounterSample(ts,val){const sample=new CounterSample(this,ts,val);this.addSample(sample);return sample;},addSample(sample){this.timestamps_.push(sample.timestamp);this.samples_.push(sample);},getStatistics(sampleIndices){let sum=0;let min=Number.MAX_VALUE;let max=-Number.MAX_VALUE;for(let i=0;i<sampleIndices.length;++i){const sample=this.getSample(sampleIndices[i]).value;sum+=sample;min=Math.min(sample,min);max=Math.max(sample,max);}
-return{min,max,avg:(sum/sampleIndices.length),start:this.getSample(sampleIndices[0]).value,end:this.getSample(sampleIndices.length-1).value};},shiftTimestampsForward(amount){for(let i=0;i<this.timestamps_.length;++i){this.timestamps_[i]+=amount;this.samples_[i].timestamp=this.timestamps_[i];}},*childEvents(){yield*this.samples_;},*childEventContainers(){}};return{CounterSeries,};});'use strict';tr.exportTo('tr.model',function(){function Counter(parent,id,category,name){tr.model.EventContainer.call(this);this.parent_=parent;this.id_=id;this.category_=category||'';this.name_=name;this.series_=[];this.totals=[];}
-Counter.prototype={__proto__:tr.model.EventContainer.prototype,get parent(){return this.parent_;},get id(){return this.id_;},get category(){return this.category_;},get name(){return this.name_;},*childEvents(){},*childEventContainers(){yield*this.series;},set timestamps(arg){throw new Error('Bad counter API. No cookie.');},set seriesNames(arg){throw new Error('Bad counter API. No cookie.');},set seriesColors(arg){throw new Error('Bad counter API. No cookie.');},set samples(arg){throw new Error('Bad counter API. No cookie.');},addSeries(series){series.counter=this;series.seriesIndex=this.series_.length;this.series_.push(series);return series;},getSeries(idx){return this.series_[idx];},get series(){return this.series_;},get numSeries(){return this.series_.length;},get numSamples(){if(this.series_.length===0)return 0;return this.series_[0].length;},get timestamps(){if(this.series_.length===0)return[];return this.series_[0].timestamps;},getSampleStatistics(sampleIndices){sampleIndices.sort();const ret=[];this.series_.forEach(function(series){ret.push(series.getStatistics(sampleIndices));});return ret;},shiftTimestampsForward(amount){for(let i=0;i<this.series_.length;++i){this.series_[i].shiftTimestampsForward(amount);}},updateBounds(){this.totals=[];this.maxTotal=0;this.bounds.reset();if(this.series_.length===0)return;const firstSeries=this.series_[0];const lastSeries=this.series_[this.series_.length-1];this.bounds.addValue(firstSeries.getTimestamp(0));this.bounds.addValue(lastSeries.getTimestamp(lastSeries.length-1));const numSeries=this.numSeries;this.maxTotal=-Infinity;for(let i=0;i<firstSeries.length;++i){let total=0;this.series_.forEach(function(series){total+=series.getSample(i).value;this.totals.push(total);}.bind(this));this.maxTotal=Math.max(total,this.maxTotal);}}};Counter.compare=function(x,y){let tmp=x.parent.compareTo(y.parent);if(tmp!==0)return tmp;tmp=x.name.localeCompare(y.name);if(tmp===0)return x.tid-y.tid;return tmp;};return{Counter,};});'use strict';tr.exportTo('tr.model',function(){const Slice=tr.model.Slice;function CpuSlice(cat,title,colorId,start,args,opt_duration){Slice.apply(this,arguments);this.threadThatWasRunning=undefined;this.cpu=undefined;}
-CpuSlice.prototype={__proto__:Slice.prototype,get analysisTypeName(){return'tr.ui.analysis.CpuSlice';},getAssociatedTimeslice(){if(!this.threadThatWasRunning){return undefined;}
-const timeSlices=this.threadThatWasRunning.timeSlices;for(let i=0;i<timeSlices.length;i++){const timeSlice=timeSlices[i];if(timeSlice.start!==this.start){continue;}
-if(timeSlice.duration!==this.duration){continue;}
-return timeSlice;}
-return undefined;}};tr.model.EventRegistry.register(CpuSlice,{name:'cpuSlice',pluralName:'cpuSlices'});return{CpuSlice,};});'use strict';tr.exportTo('tr.model',function(){function TimeToObjectInstanceMap(createObjectInstanceFunction,parent,scopedId){this.createObjectInstanceFunction_=createObjectInstanceFunction;this.parent=parent;this.scopedId=scopedId;this.instances=[];}
-TimeToObjectInstanceMap.prototype={idWasCreated(category,name,ts){if(this.instances.length===0){this.instances.push(this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts));this.instances[0].creationTsWasExplicit=true;return this.instances[0];}
-let lastInstance=this.instances[this.instances.length-1];if(ts<lastInstance.deletionTs){throw new Error('Mutation of the TimeToObjectInstanceMap must be '+'done in ascending timestamp order.');}
-lastInstance=this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts);lastInstance.creationTsWasExplicit=true;this.instances.push(lastInstance);return lastInstance;},addSnapshot(category,name,ts,args,opt_baseTypeName){if(this.instances.length===0){this.instances.push(this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts,opt_baseTypeName));}
-const i=tr.b.findIndexInSortedIntervals(this.instances,function(inst){return inst.creationTs;},function(inst){return inst.deletionTs-inst.creationTs;},ts);let instance;if(i<0){instance=this.instances[0];if(ts>instance.deletionTs||instance.creationTsWasExplicit){throw new Error('At the provided timestamp, no instance was still alive');}
-if(instance.snapshots.length!==0){throw new Error('Cannot shift creationTs forward, '+'snapshots have been added. First snap was at ts='+
-instance.snapshots[0].ts+' and creationTs was '+
-instance.creationTs);}
-instance.creationTs=ts;}else if(i>=this.instances.length){instance=this.instances[this.instances.length-1];if(ts>=instance.deletionTs){instance=this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts,opt_baseTypeName);this.instances.push(instance);}else{let lastValidIndex;for(let i=this.instances.length-1;i>=0;i--){const tmp=this.instances[i];if(ts>=tmp.deletionTs)break;if(tmp.creationTsWasExplicit===false&&tmp.snapshots.length===0){lastValidIndex=i;}}
-if(lastValidIndex===undefined){throw new Error('Cannot add snapshot. No instance was alive that was mutable.');}
-instance=this.instances[lastValidIndex];instance.creationTs=ts;}}else{instance=this.instances[i];}
-return instance.addSnapshot(ts,args,name,opt_baseTypeName);},get lastInstance(){if(this.instances.length===0)return undefined;return this.instances[this.instances.length-1];},idWasDeleted(category,name,ts){if(this.instances.length===0){this.instances.push(this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts));}
-let lastInstance=this.instances[this.instances.length-1];if(ts<lastInstance.creationTs){throw new Error('Cannot delete an id before it was created');}
-if(lastInstance.deletionTs===Number.MAX_VALUE){lastInstance.wasDeleted(ts);return lastInstance;}
-if(ts<lastInstance.deletionTs){throw new Error('id was already deleted earlier.');}
-lastInstance=this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts);this.instances.push(lastInstance);lastInstance.wasDeleted(ts);return lastInstance;},getInstanceAt(ts){const i=tr.b.findIndexInSortedIntervals(this.instances,function(inst){return inst.creationTs;},function(inst){return inst.deletionTs-inst.creationTs;},ts);if(i<0){if(this.instances[0].creationTsWasExplicit){return undefined;}
-return this.instances[0];}else if(i>=this.instances.length){return undefined;}
-return this.instances[i];}};return{TimeToObjectInstanceMap,};});'use strict';tr.exportTo('tr.model',function(){const ObjectInstance=tr.model.ObjectInstance;const ObjectSnapshot=tr.model.ObjectSnapshot;function ObjectCollection(parent){tr.model.EventContainer.call(this);this.parent=parent;this.instanceMapsByScopedId_={};this.instancesByTypeName_={};this.createObjectInstance_=this.createObjectInstance_.bind(this);}
-ObjectCollection.prototype={__proto__:tr.model.EventContainer.prototype,*childEvents(){for(const instance of this.getAllObjectInstances()){yield instance;yield*instance.snapshots;}},createObjectInstance_(parent,scopedId,category,name,creationTs,opt_baseTypeName){const constructor=tr.model.ObjectInstance.subTypes.getConstructor(category,name);const instance=new constructor(parent,scopedId,category,name,creationTs,opt_baseTypeName);const typeName=instance.typeName;let instancesOfTypeName=this.instancesByTypeName_[typeName];if(!instancesOfTypeName){instancesOfTypeName=[];this.instancesByTypeName_[typeName]=instancesOfTypeName;}
-instancesOfTypeName.push(instance);return instance;},getOrCreateInstanceMap_(scopedId){let dict;if(scopedId.scope in this.instanceMapsByScopedId_){dict=this.instanceMapsByScopedId_[scopedId.scope];}else{dict={};this.instanceMapsByScopedId_[scopedId.scope]=dict;}
-let instanceMap=dict[scopedId.id];if(instanceMap)return instanceMap;instanceMap=new tr.model.TimeToObjectInstanceMap(this.createObjectInstance_,this.parent,scopedId);dict[scopedId.id]=instanceMap;return instanceMap;},idWasCreated(scopedId,category,name,ts){const instanceMap=this.getOrCreateInstanceMap_(scopedId);return instanceMap.idWasCreated(category,name,ts);},addSnapshot(scopedId,category,name,ts,args,opt_baseTypeName){const instanceMap=this.getOrCreateInstanceMap_(scopedId);const snapshot=instanceMap.addSnapshot(category,name,ts,args,opt_baseTypeName);if(snapshot.objectInstance.category!==category){const msg='Added snapshot name='+name+' with cat='+category+' impossible. It instance was created/snapshotted with cat='+
-snapshot.objectInstance.category+' name='+
-snapshot.objectInstance.name;throw new Error(msg);}
-if(opt_baseTypeName&&snapshot.objectInstance.baseTypeName!==opt_baseTypeName){throw new Error('Could not add snapshot with baseTypeName='+
-opt_baseTypeName+'. It '+'was previously created with name='+
-snapshot.objectInstance.baseTypeName);}
-if(snapshot.objectInstance.name!==name){throw new Error('Could not add snapshot with name='+name+'. It '+'was previously created with name='+
-snapshot.objectInstance.name);}
-return snapshot;},idWasDeleted(scopedId,category,name,ts){const instanceMap=this.getOrCreateInstanceMap_(scopedId);const deletedInstance=instanceMap.idWasDeleted(category,name,ts);if(!deletedInstance)return;if(deletedInstance.category!==category){const msg='Deleting object '+deletedInstance.name+' with a different category '+'than when it was created. It previous had cat='+
-deletedInstance.category+' but the delete command '+'had cat='+category;throw new Error(msg);}
-if(deletedInstance.baseTypeName!==name){throw new Error('Deletion requested for name='+
-name+' could not proceed: '+'An existing object with baseTypeName='+
-deletedInstance.baseTypeName+' existed.');}},autoDeleteObjects(maxTimestamp){for(const imapById of Object.values(this.instanceMapsByScopedId_)){for(const i2imap of Object.values(imapById)){const lastInstance=i2imap.lastInstance;if(lastInstance.deletionTs!==Number.MAX_VALUE)continue;i2imap.idWasDeleted(lastInstance.category,lastInstance.name,maxTimestamp);lastInstance.deletionTsWasExplicit=false;}}},getObjectInstanceAt(scopedId,ts){let instanceMap;if(scopedId.scope in this.instanceMapsByScopedId_){instanceMap=this.instanceMapsByScopedId_[scopedId.scope][scopedId.id];}
-if(!instanceMap)return undefined;return instanceMap.getInstanceAt(ts);},getSnapshotAt(scopedId,ts){const instance=this.getObjectInstanceAt(scopedId,ts);if(!instance)return undefined;return instance.getSnapshotAt(ts);},iterObjectInstances(iter,opt_this){opt_this=opt_this||this;for(const imapById of Object.values(this.instanceMapsByScopedId_)){for(const i2imap of Object.values(imapById)){i2imap.instances.forEach(iter,opt_this);}}},getAllObjectInstances(){const instances=[];this.iterObjectInstances(function(i){instances.push(i);});return instances;},getAllInstancesNamed(name){return this.instancesByTypeName_[name];},getAllInstancesByTypeName(){return this.instancesByTypeName_;},preInitializeAllObjects(){this.iterObjectInstances(function(instance){instance.preInitialize();});},initializeAllObjects(){this.iterObjectInstances(function(instance){instance.initialize();});},initializeInstances(){this.iterObjectInstances(function(instance){instance.initialize();});},updateBounds(){this.bounds.reset();this.iterObjectInstances(function(instance){instance.updateBounds();this.bounds.addRange(instance.bounds);},this);},shiftTimestampsForward(amount){this.iterObjectInstances(function(instance){instance.shiftTimestampsForward(amount);});},addCategoriesToDict(categoriesDict){this.iterObjectInstances(function(instance){categoriesDict[instance.category]=true;});}};return{ObjectCollection,};});'use strict';tr.exportTo('tr.model',function(){class AsyncSliceGroup extends tr.model.EventContainer{constructor(parentContainer,opt_name){super();this.parentContainer_=parentContainer;this.name_=opt_name;this.slices=[];this.viewSubGroups_=undefined;this.nestedLevel_=0;this.hasNestedSubGroups_=true;this.title_=undefined;}
-get parentContainer(){return this.parentContainer_;}
-get model(){return this.parentContainer_.parent.model;}
-get stableId(){return this.parentContainer_.stableId+'.AsyncSliceGroup';}
-get title(){if(this.nested_level_===0){return'<root>';}
-return this.title_;}
-getSettingsKey(){if(this.name_===undefined){return undefined;}
-const parentKey=this.parentContainer_.getSettingsKey();if(parentKey===undefined){return undefined;}
-return parentKey+'.'+this.name_;}
-push(slice){if(this.viewSubGroups_!==undefined){throw new Error('No new slices are allowed when view sub-groups already formed.');}
-slice.parentContainer=this.parentContainer;this.slices.push(slice);return slice;}
-get length(){return this.slices.length;}
-shiftTimestampsForward(amount){for(const slice of this.childEvents()){slice.start+=amount;}}
-updateBounds(){this.bounds.reset();for(let i=0;i<this.slices.length;i++){this.bounds.addValue(this.slices[i].start);this.bounds.addValue(this.slices[i].end);}}
-autoCloseOpenSlices(){const maxTimestamp=this.parentContainer_.parent.model.bounds.max;for(const slice of this.childEvents()){if(slice.didNotFinish){slice.duration=maxTimestamp-slice.start;}}}
-get viewSubGroups(){if(!this.hasNestedSubGroups_||this.nestedLevel_===2){return[];}
-if(this.viewSubGroups_!==undefined){return this.viewSubGroups_;}
-const subGroupsByTitle=new Map();for(const slice of this.slices){let subGroupTitle=slice.viewSubGroupTitle;let hasNestedSubGroups=false;if(this.nestedLevel_===0&&slice.viewSubGroupGroupingKey!==undefined){subGroupTitle=slice.viewSubGroupGroupingKey;hasNestedSubGroups=true;}
-let subGroup=subGroupsByTitle.get(subGroupTitle);if(subGroup===undefined){let name;if(this.name_!==undefined){name=this.name_+'.'+subGroupTitle;}else{name=subGroupTitle;}
-subGroup=new AsyncSliceGroup(this.parentContainer_,name);subGroup.title_=subGroupTitle;subGroup.hasNestedSubGroups_=hasNestedSubGroups;subGroup.nestedLevel_=this.nestedLevel_+1;subGroupsByTitle.set(subGroupTitle,subGroup);}
-subGroup.push(slice);}
-this.viewSubGroups_=Array.from(subGroupsByTitle.values());this.viewSubGroups_.sort((a,b)=>a.title.localeCompare(b.title));return this.viewSubGroups_;}*findTopmostSlicesInThisContainer(eventPredicate,opt_this){for(const slice of this.slices){if(slice.isTopLevel){yield*slice.findTopmostSlicesRelativeToThisSlice(eventPredicate,opt_this);}}}*childEvents(){for(const slice of this.slices){yield slice;yield*slice.enumerateAllDescendents();}}*childEventContainers(){}}
-return{AsyncSliceGroup,};});'use strict';tr.exportTo('tr.model',function(){const Slice=tr.model.Slice;function ThreadSlice(cat,title,colorId,start,args,opt_duration,opt_cpuStart,opt_cpuDuration,opt_argsStripped,opt_bindId){Slice.call(this,cat,title,colorId,start,args,opt_duration,opt_cpuStart,opt_cpuDuration,opt_argsStripped,opt_bindId);this.subSlices=[];}
-ThreadSlice.prototype={__proto__:Slice.prototype,get overlappingSamples(){const samples=new tr.model.EventSet();if(!this.parentContainer||!this.parentContainer.samples){return samples;}
-this.parentContainer.samples.forEach(function(sample){if(this.start<=sample.start&&sample.start<=this.end){samples.push(sample);}},this);return samples;}};tr.model.EventRegistry.register(ThreadSlice,{name:'slice',pluralName:'slices'});return{ThreadSlice,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const ThreadSlice=tr.model.ThreadSlice;function getSliceLo(s){return s.start;}
-function getSliceHi(s){return s.end;}
-function SliceGroup(parentContainer,opt_sliceConstructor,opt_name){tr.model.EventContainer.call(this);this.parentContainer_=parentContainer;const sliceConstructor=opt_sliceConstructor||ThreadSlice;this.sliceConstructor=sliceConstructor;this.sliceConstructorSubTypes=this.sliceConstructor.subTypes;if(!this.sliceConstructorSubTypes){throw new Error('opt_sliceConstructor must have a subtype registry.');}
-this.openPartialSlices_=[];this.slices=[];this.topLevelSlices=[];this.haveTopLevelSlicesBeenBuilt=false;this.name_=opt_name;if(this.model===undefined){throw new Error('SliceGroup must have model defined.');}}
-SliceGroup.prototype={__proto__:tr.model.EventContainer.prototype,get parentContainer(){return this.parentContainer_;},get model(){return this.parentContainer_.model;},get stableId(){return this.parentContainer_.stableId+'.SliceGroup';},getSettingsKey(){if(!this.name_)return undefined;const parentKey=this.parentContainer_.getSettingsKey();if(!parentKey)return undefined;return parentKey+'.'+this.name;},get length(){return this.slices.length;},pushSlice(slice){this.haveTopLevelSlicesBeenBuilt=false;slice.parentContainer=this.parentContainer_;this.slices.push(slice);return slice;},pushSlices(slices){this.haveTopLevelSlicesBeenBuilt=false;slices.forEach(function(slice){slice.parentContainer=this.parentContainer_;this.slices.push(slice);},this);},beginSlice(category,title,ts,opt_args,opt_tts,opt_argsStripped,opt_colorId,opt_bindId){const colorId=opt_colorId||ColorScheme.getColorIdForGeneralPurposeString(title);const sliceConstructorSubTypes=this.sliceConstructorSubTypes;const sliceType=sliceConstructorSubTypes.getConstructor(category,title);const slice=new sliceType(category,title,colorId,ts,opt_args?opt_args:{},null,opt_tts,undefined,opt_argsStripped,opt_bindId);this.openPartialSlices_.push(slice);slice.didNotFinish=true;this.pushSlice(slice);return slice;},isTimestampValidForBeginOrEnd(ts){if(!this.openPartialSlices_.length)return true;const top=this.openPartialSlices_[this.openPartialSlices_.length-1];return ts>=top.start;},get openSliceCount(){return this.openPartialSlices_.length;},get mostRecentlyOpenedPartialSlice(){if(!this.openPartialSlices_.length)return undefined;return this.openPartialSlices_[this.openPartialSlices_.length-1];},endSlice(ts,opt_tts,opt_colorId){if(!this.openSliceCount){throw new Error('endSlice called without an open slice');}
-const slice=this.openPartialSlices_[this.openSliceCount-1];this.openPartialSlices_.splice(this.openSliceCount-1,1);if(ts<slice.start){throw new Error('Slice '+slice.title+' end time is before its start.');}
-slice.duration=ts-slice.start;slice.didNotFinish=false;slice.colorId=opt_colorId||slice.colorId;if(opt_tts&&slice.cpuStart!==undefined){slice.cpuDuration=opt_tts-slice.cpuStart;}
-return slice;},pushCompleteSlice(category,title,ts,duration,tts,cpuDuration,opt_args,opt_argsStripped,opt_colorId,opt_bindId){const colorId=opt_colorId||ColorScheme.getColorIdForGeneralPurposeString(title);const sliceConstructorSubTypes=this.sliceConstructorSubTypes;const sliceType=sliceConstructorSubTypes.getConstructor(category,title);const slice=new sliceType(category,title,colorId,ts,opt_args?opt_args:{},duration,tts,cpuDuration,opt_argsStripped,opt_bindId);if(duration===undefined){slice.didNotFinish=true;}
-this.pushSlice(slice);return slice;},autoCloseOpenSlices(){this.updateBounds();const maxTimestamp=this.bounds.max;for(let sI=0;sI<this.slices.length;sI++){const slice=this.slices[sI];if(slice.didNotFinish){slice.duration=maxTimestamp-slice.start;}}
-this.openPartialSlices_=[];},shiftTimestampsForward(amount){for(let sI=0;sI<this.slices.length;sI++){const slice=this.slices[sI];slice.start=(slice.start+amount);}},updateBounds(){this.bounds.reset();for(let i=0;i<this.slices.length;i++){this.bounds.addValue(this.slices[i].start);this.bounds.addValue(this.slices[i].end);}},copySlice(slice){const sliceConstructorSubTypes=this.sliceConstructorSubTypes;const sliceType=sliceConstructorSubTypes.getConstructor(slice.category,slice.title);const newSlice=new sliceType(slice.category,slice.title,slice.colorId,slice.start,slice.args,slice.duration,slice.cpuStart,slice.cpuDuration);newSlice.didNotFinish=slice.didNotFinish;return newSlice;},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){if(!this.haveTopLevelSlicesBeenBuilt){throw new Error('Nope');}
-for(const s of this.topLevelSlices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate);}},*childEvents(){yield*this.slices;},*childEventContainers(){},*getDescendantEventsInSortedRanges(ranges,opt_containerPredicate){if(ranges.length===0||(opt_containerPredicate!==undefined&&!opt_containerPredicate(this))){return;}
-let rangeIndex=0;let range=ranges[rangeIndex];for(const event of this.childEvents()){while(event.start>range.max){rangeIndex++;if(rangeIndex>=ranges.length)return;range=ranges[rangeIndex];}
-if(event.end>=range.min)yield event;}},getSlicesOfName(title){const slices=[];for(let i=0;i<this.slices.length;i++){if(this.slices[i].title===title){slices.push(this.slices[i]);}}
-return slices;},iterSlicesInTimeRange(callback,start,end){const ret=[];tr.b.iterateOverIntersectingIntervals(this.topLevelSlices,function(s){return s.start;},function(s){return s.duration;},start,end,function(topLevelSlice){callback(topLevelSlice);for(const slice of topLevelSlice.enumerateAllDescendents()){callback(slice);}});return ret;},findFirstSlice(){if(!this.haveTopLevelSlicesBeenBuilt){throw new Error('Nope');}
-if(0===this.slices.length)return undefined;return this.slices[0];},findSliceAtTs(ts){if(!this.haveTopLevelSlicesBeenBuilt)throw new Error('Nope');let i=tr.b.findIndexInSortedClosedIntervals(this.topLevelSlices,getSliceLo,getSliceHi,ts);if(i===-1||i===this.topLevelSlices.length){return undefined;}
-let curSlice=this.topLevelSlices[i];while(true){i=tr.b.findIndexInSortedClosedIntervals(curSlice.subSlices,getSliceLo,getSliceHi,ts);if(i===-1||i===curSlice.subSlices.length){return curSlice;}
-curSlice=curSlice.subSlices[i];}},findNextSliceAfter(ts,refGuid){let i=tr.b.findLowIndexInSortedArray(this.slices,getSliceLo,ts);if(i===this.slices.length){return undefined;}
-for(;i<this.slices.length;i++){const slice=this.slices[i];if(slice.start>ts)return slice;if(slice.guid<=refGuid)continue;return slice;}
-return undefined;},hasCpuDuration_(){if(this.slices.some(function(slice){return slice.cpuDuration!==undefined;}))return true;return false;},createSubSlices(){this.haveTopLevelSlicesBeenBuilt=true;this.createSubSlicesImpl_();if(!this.hasCpuDuration_()&&this.parentContainer.timeSlices){this.addCpuTimeToSubslices_(this.parentContainer.timeSlices);}
-this.slices.forEach(function(slice){let selfTime=slice.duration;for(let i=0;i<slice.subSlices.length;i++){selfTime-=slice.subSlices[i].duration;}
-slice.selfTime=selfTime;if(slice.cpuDuration===undefined)return;let cpuSelfTime=slice.cpuDuration;for(let i=0;i<slice.subSlices.length;i++){if(slice.subSlices[i].cpuDuration!==undefined){cpuSelfTime-=slice.subSlices[i].cpuDuration;}}
-slice.cpuSelfTime=cpuSelfTime;});},createSubSlicesImpl_(){const precisionUnit=this.model.intrinsicTimeUnit;function addSliceIfBounds(parent,child){if(parent.bounds(child,precisionUnit)){child.parentSlice=parent;if(parent.subSlices===undefined){parent.subSlices=[];}
-parent.subSlices.push(child);return true;}
-return false;}
-if(!this.slices.length)return;const ops=[];for(let i=0;i<this.slices.length;i++){if(this.slices[i].subSlices){this.slices[i].subSlices.splice(0,this.slices[i].subSlices.length);}
-ops.push(i);}
-const originalSlices=this.slices;ops.sort(function(ix,iy){const x=originalSlices[ix];const y=originalSlices[iy];if(x.start!==y.start){return x.start-y.start;}
-return ix-iy;});const slices=new Array(this.slices.length);for(let i=0;i<ops.length;i++){slices[i]=originalSlices[ops[i]];}
-let rootSlice=slices[0];this.topLevelSlices=[];this.topLevelSlices.push(rootSlice);rootSlice.isTopLevel=true;for(let i=1;i<slices.length;i++){const slice=slices[i];while(rootSlice!==undefined&&(!addSliceIfBounds(rootSlice,slice))){rootSlice=rootSlice.parentSlice;}
-if(rootSlice===undefined){this.topLevelSlices.push(slice);slice.isTopLevel=true;}
-rootSlice=slice;}
-this.slices=slices;},addCpuTimeToSubslices_(timeSlices){const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;let sliceIdx=0;timeSlices.forEach(function(timeSlice){if(timeSlice.schedulingState===SCHEDULING_STATE.RUNNING){while(sliceIdx<this.topLevelSlices.length){if(this.addCpuTimeToSubslice_(this.topLevelSlices[sliceIdx],timeSlice)){sliceIdx++;}else{break;}}}},this);},addCpuTimeToSubslice_(slice,timeSlice){if(slice.start>timeSlice.end||slice.end<timeSlice.start){return slice.end<=timeSlice.end;}
-let duration=timeSlice.duration;if(slice.start>timeSlice.start){duration-=slice.start-timeSlice.start;}
-if(timeSlice.end>slice.end){duration-=timeSlice.end-slice.end;}
-if(slice.cpuDuration){slice.cpuDuration+=duration;}else{slice.cpuDuration=duration;}
-for(let i=0;i<slice.subSlices.length;i++){this.addCpuTimeToSubslice_(slice.subSlices[i],timeSlice);}
-return slice.end<=timeSlice.end;}};SliceGroup.merge=function(groupA,groupB){if(groupA.openPartialSlices_.length>0){throw new Error('groupA has open partial slices');}
-if(groupB.openPartialSlices_.length>0){throw new Error('groupB has open partial slices');}
-if(groupA.parentContainer!==groupB.parentContainer){throw new Error('Different parent threads. Cannot merge');}
-if(groupA.sliceConstructor!==groupB.sliceConstructor){throw new Error('Different slice constructors. Cannot merge');}
-const result=new SliceGroup(groupA.parentContainer,groupA.sliceConstructor,groupA.name_);const slicesA=groupA.slices;const slicesB=groupB.slices;let idxA=0;let idxB=0;const openA=[];const openB=[];const splitOpenSlices=function(when){for(let i=0;i<openB.length;i++){const oldSlice=openB[i];const oldEnd=oldSlice.end;if(when<oldSlice.start||oldEnd<when){throw new Error('slice should not be split');}
-const newSlice=result.copySlice(oldSlice);newSlice.start=when;newSlice.duration=oldEnd-when;if(newSlice.title.indexOf(' (cont.)')===-1){newSlice.title+=' (cont.)';}
-oldSlice.duration=when-oldSlice.start;openB[i]=newSlice;result.pushSlice(newSlice);}};const closeOpenSlices=function(upTo){while(openA.length>0||openB.length>0){const nextA=openA[openA.length-1];const nextB=openB[openB.length-1];const endA=nextA&&nextA.end;const endB=nextB&&nextB.end;if((endA===undefined||endA>upTo)&&(endB===undefined||endB>upTo)){return;}
-if(endB===undefined||endA<endB){splitOpenSlices(endA);openA.pop();}else{openB.pop();}}};while(idxA<slicesA.length||idxB<slicesB.length){const sA=slicesA[idxA];const sB=slicesB[idxB];let nextSlice;let isFromB;if(sA===undefined||(sB!==undefined&&sA.start>sB.start)){nextSlice=result.copySlice(sB);isFromB=true;idxB++;}else{nextSlice=result.copySlice(sA);isFromB=false;idxA++;}
-closeOpenSlices(nextSlice.start);result.pushSlice(nextSlice);if(isFromB){openB.push(nextSlice);}else{splitOpenSlices(nextSlice.start);openA.push(nextSlice);}}
-closeOpenSlices();return result;};return{SliceGroup,};});'use strict';tr.exportTo('tr.model',function(){const AsyncSlice=tr.model.AsyncSlice;const AsyncSliceGroup=tr.model.AsyncSliceGroup;const SliceGroup=tr.model.SliceGroup;const ThreadSlice=tr.model.ThreadSlice;const ThreadTimeSlice=tr.model.ThreadTimeSlice;function Thread(parent,tid){if(!parent){throw new Error('Parent must be provided.');}
-tr.model.EventContainer.call(this);this.parent=parent;this.sortIndex=0;this.tid=tid;this.name=undefined;this.samples_=undefined;this.sliceGroup=new SliceGroup(this,ThreadSlice,'slices');this.timeSlices=undefined;this.kernelSliceGroup=new SliceGroup(this,ThreadSlice,'kernel-slices');this.asyncSliceGroup=new AsyncSliceGroup(this,'async-slices');}
-Thread.prototype={__proto__:tr.model.EventContainer.prototype,get model(){return this.parent.model;},get stableId(){return this.parent.stableId+'.'+this.tid;},compareTo(that){return Thread.compare(this,that);},*childEventContainers(){if(this.sliceGroup.length){yield this.sliceGroup;}
-if(this.kernelSliceGroup.length){yield this.kernelSliceGroup;}
-if(this.asyncSliceGroup.length){yield this.asyncSliceGroup;}},*childEvents(){if(this.timeSlices){yield*this.timeSlices;}},iterateAllPersistableObjects(cb){cb(this);if(this.sliceGroup.length){cb(this.sliceGroup);}
-this.asyncSliceGroup.viewSubGroups.forEach(cb);},shiftTimestampsForward(amount){this.sliceGroup.shiftTimestampsForward(amount);if(this.timeSlices){for(let i=0;i<this.timeSlices.length;i++){const slice=this.timeSlices[i];slice.start+=amount;}}
-this.kernelSliceGroup.shiftTimestampsForward(amount);this.asyncSliceGroup.shiftTimestampsForward(amount);},get isEmpty(){if(this.sliceGroup.length)return false;if(this.sliceGroup.openSliceCount)return false;if(this.timeSlices&&this.timeSlices.length)return false;if(this.kernelSliceGroup.length)return false;if(this.asyncSliceGroup.length)return false;if(this.samples_.length)return false;return true;},updateBounds(){this.bounds.reset();this.sliceGroup.updateBounds();this.bounds.addRange(this.sliceGroup.bounds);this.kernelSliceGroup.updateBounds();this.bounds.addRange(this.kernelSliceGroup.bounds);this.asyncSliceGroup.updateBounds();this.bounds.addRange(this.asyncSliceGroup.bounds);if(this.timeSlices&&this.timeSlices.length){this.bounds.addValue(this.timeSlices[0].start);this.bounds.addValue(this.timeSlices[this.timeSlices.length-1].end);}
-if(this.samples_&&this.samples_.length){this.bounds.addValue(this.samples_[0].start);this.bounds.addValue(this.samples_[this.samples_.length-1].end);}},addCategoriesToDict(categoriesDict){for(let i=0;i<this.sliceGroup.length;i++){categoriesDict[this.sliceGroup.slices[i].category]=true;}
-for(let i=0;i<this.kernelSliceGroup.length;i++){categoriesDict[this.kernelSliceGroup.slices[i].category]=true;}
-for(let i=0;i<this.asyncSliceGroup.length;i++){categoriesDict[this.asyncSliceGroup.slices[i].category]=true;}
-if(this.samples_){for(let i=0;i<this.samples_.length;i++){categoriesDict[this.samples_[i].category]=true;}}},autoCloseOpenSlices(){this.sliceGroup.autoCloseOpenSlices();this.asyncSliceGroup.autoCloseOpenSlices();this.kernelSliceGroup.autoCloseOpenSlices();},mergeKernelWithUserland(){if(this.kernelSliceGroup.length>0){const newSlices=SliceGroup.merge(this.sliceGroup,this.kernelSliceGroup);this.sliceGroup.slices=newSlices.slices;this.kernelSliceGroup=new SliceGroup(this);this.updateBounds();}},createSubSlices(){this.sliceGroup.createSubSlices();this.samples_=this.parent.model.samples.filter(sample=>sample.thread===this);},get userFriendlyName(){return this.name||this.tid;},get userFriendlyDetails(){return'tid: '+this.tid+
-(this.name?', name: '+this.name:'');},getSettingsKey(){if(!this.name)return undefined;const parentKey=this.parent.getSettingsKey();if(!parentKey)return undefined;return parentKey+'.'+this.name;},getProcess(){return this.parent;},indexOfTimeSlice(timeSlice){const i=tr.b.findLowIndexInSortedArray(this.timeSlices,function(slice){return slice.start;},timeSlice.start);if(this.timeSlices[i]!==timeSlice)return undefined;return i;},sumOverToplevelSlicesInRange(range,func){let sum=0;tr.b.iterateOverIntersectingIntervals(this.sliceGroup.topLevelSlices,slice=>slice.start,slice=>slice.end,range.min,range.max,slice=>{let fractionOfSliceInsideRangeOfInterest=1;if(slice.duration>0){const intersection=range.findIntersection(slice.range);fractionOfSliceInsideRangeOfInterest=intersection.duration/slice.duration;}
-sum+=func(slice)*fractionOfSliceInsideRangeOfInterest;});return sum;},getCpuTimeForRange(range){return this.sumOverToplevelSlicesInRange(range,slice=>slice.cpuDuration||0);},getNumToplevelSlicesForRange(range){return this.sumOverToplevelSlicesInRange(range,slice=>1);},getWallTimeForRange(range){return this.sumOverToplevelSlicesInRange(range,slice=>slice.duration||0);},getSchedulingStatsForRange(start,end){const stats={};if(!this.timeSlices)return stats;function addStatsForSlice(threadTimeSlice){const overlapStart=Math.max(threadTimeSlice.start,start);const overlapEnd=Math.min(threadTimeSlice.end,end);const schedulingState=threadTimeSlice.schedulingState;if(!(schedulingState in stats))stats[schedulingState]=0;stats[schedulingState]+=overlapEnd-overlapStart;}
-tr.b.iterateOverIntersectingIntervals(this.timeSlices,function(x){return x.start;},function(x){return x.end;},start,end,addStatsForSlice);return stats;},get samples(){return this.samples_;},get type(){const re=/^[^0-9|\/]+/;const matches=re.exec(this.name);if(matches&&matches[0])return matches[0];throw new Error('Could not determine thread type for thread name '+
-this.name);}};Thread.compare=function(x,y){let tmp=x.parent.compareTo(y.parent);if(tmp)return tmp;tmp=x.sortIndex-y.sortIndex;if(tmp)return tmp;if(x.name!==undefined){if(y.name!==undefined){tmp=x.name.localeCompare(y.name);}else{tmp=-1;}}else if(y.name!==undefined){tmp=1;}
-if(tmp)return tmp;return x.tid-y.tid;};return{Thread,};});'use strict';tr.exportTo('tr.model',function(){const Thread=tr.model.Thread;const Counter=tr.model.Counter;function ProcessBase(model){if(!model){throw new Error('Must provide a model');}
-tr.model.EventContainer.call(this);this.model=model;this.threads={};this.counters={};this.objects=new tr.model.ObjectCollection(this);this.sortIndex=0;}
-ProcessBase.compare=function(x,y){return x.sortIndex-y.sortIndex;};ProcessBase.prototype={__proto__:tr.model.EventContainer.prototype,get stableId(){throw new Error('Not implemented');},*childEventContainers(){yield*Object.values(this.threads);yield*Object.values(this.counters);yield this.objects;},iterateAllPersistableObjects(cb){cb(this);for(const tid in this.threads){this.threads[tid].iterateAllPersistableObjects(cb);}},get numThreads(){let n=0;for(const p in this.threads){n++;}
-return n;},shiftTimestampsForward(amount){for(const child of this.childEventContainers()){child.shiftTimestampsForward(amount);}},autoCloseOpenSlices(){for(const tid in this.threads){const thread=this.threads[tid];thread.autoCloseOpenSlices();}},autoDeleteObjects(maxTimestamp){this.objects.autoDeleteObjects(maxTimestamp);},preInitializeObjects(){this.objects.preInitializeAllObjects();},initializeObjects(){this.objects.initializeAllObjects();},mergeKernelWithUserland(){for(const tid in this.threads){const thread=this.threads[tid];thread.mergeKernelWithUserland();}},updateBounds(){this.bounds.reset();for(const tid in this.threads){this.threads[tid].updateBounds();this.bounds.addRange(this.threads[tid].bounds);}
-for(const id in this.counters){this.counters[id].updateBounds();this.bounds.addRange(this.counters[id].bounds);}
-this.objects.updateBounds();this.bounds.addRange(this.objects.bounds);},addCategoriesToDict(categoriesDict){for(const tid in this.threads){this.threads[tid].addCategoriesToDict(categoriesDict);}
-for(const id in this.counters){categoriesDict[this.counters[id].category]=true;}
-this.objects.addCategoriesToDict(categoriesDict);},findAllThreadsMatching(predicate,opt_this){const threads=[];for(const tid in this.threads){const thread=this.threads[tid];if(predicate.call(opt_this,thread)){threads.push(thread);}}
-return threads;},findAllThreadsNamed(name){const threads=this.findAllThreadsMatching(function(thread){if(!thread.name)return false;return thread.name===name;});return threads;},findAtMostOneThreadNamed(name){const threads=this.findAllThreadsNamed(name);if(threads.length===0)return undefined;if(threads.length>1){throw new Error('Expected no more than one '+name);}
-return threads[0];},pruneEmptyContainers(){const threadsToKeep={};for(const tid in this.threads){const thread=this.threads[tid];if(!thread.isEmpty){threadsToKeep[tid]=thread;}}
-this.threads=threadsToKeep;},getThread(tid){return this.threads[tid];},getOrCreateThread(tid){if(!this.threads[tid]){this.threads[tid]=new Thread(this,tid);}
-return this.threads[tid];},getOrCreateCounter(cat,name){const id=cat+'.'+name;if(!this.counters[id]){this.counters[id]=new Counter(this,id,cat,name);}
-return this.counters[id];},getSettingsKey(){throw new Error('Not implemented');},createSubSlices(){for(const tid in this.threads){this.threads[tid].createSubSlices();}}};return{ProcessBase,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const Counter=tr.model.Counter;const CpuSlice=tr.model.CpuSlice;function Cpu(kernel,number){if(kernel===undefined||number===undefined){throw new Error('Missing arguments');}
-this.kernel=kernel;this.cpuNumber=number;this.slices=[];this.counters={};this.bounds_=new tr.b.math.Range();this.samples_=undefined;this.lastActiveTimestamp_=undefined;this.lastActiveThread_=undefined;this.lastActiveName_=undefined;this.lastActiveArgs_=undefined;}
-Cpu.prototype={__proto__:tr.model.EventContainer.prototype,get samples(){return this.samples_;},get userFriendlyName(){return'CPU '+this.cpuNumber;},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){for(const s of this.slices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate,opt_this);}},*childEvents(){yield*this.slices;if(this.samples_){yield*this.samples_;}},*childEventContainers(){yield*Object.values(this.counters);},getOrCreateCounter(cat,name){const id=cat+'.'+name;if(!this.counters[id]){this.counters[id]=new Counter(this,id,cat,name);}
-return this.counters[id];},getCounter(cat,name){const id=cat+'.'+name;if(!this.counters[id]){return undefined;}
-return this.counters[id];},shiftTimestampsForward(amount){for(let sI=0;sI<this.slices.length;sI++){this.slices[sI].start=(this.slices[sI].start+amount);}
-for(const id in this.counters){this.counters[id].shiftTimestampsForward(amount);}},updateBounds(){this.bounds_.reset();if(this.slices.length){this.bounds_.addValue(this.slices[0].start);this.bounds_.addValue(this.slices[this.slices.length-1].end);}
-for(const id in this.counters){this.counters[id].updateBounds();this.bounds_.addRange(this.counters[id].bounds);}
-if(this.samples_&&this.samples_.length){this.bounds_.addValue(this.samples_[0].start);this.bounds_.addValue(this.samples_[this.samples_.length-1].end);}},createSubSlices(){this.samples_=this.kernel.model.samples.filter(function(sample){return sample.cpu===this;},this);},addCategoriesToDict(categoriesDict){for(let i=0;i<this.slices.length;i++){categoriesDict[this.slices[i].category]=true;}
-for(const id in this.counters){categoriesDict[this.counters[id].category]=true;}
-for(let i=0;i<this.samples_.length;i++){categoriesDict[this.samples_[i].category]=true;}},indexOf(cpuSlice){const i=tr.b.findLowIndexInSortedArray(this.slices,function(slice){return slice.start;},cpuSlice.start);if(this.slices[i]!==cpuSlice)return undefined;return i;},closeActiveThread(endTimestamp,args){if(this.lastActiveThread_===undefined||this.lastActiveThread_===0){return;}
-if(endTimestamp<this.lastActiveTimestamp_){throw new Error('The end timestamp of a thread running on CPU '+
-this.cpuNumber+' is before its start timestamp.');}
-for(const key in args){this.lastActiveArgs_[key]=args[key];}
-const duration=endTimestamp-this.lastActiveTimestamp_;const slice=new tr.model.CpuSlice('',this.lastActiveName_,ColorScheme.getColorIdForGeneralPurposeString(this.lastActiveName_),this.lastActiveTimestamp_,this.lastActiveArgs_,duration);slice.cpu=this;this.slices.push(slice);this.lastActiveTimestamp_=undefined;this.lastActiveThread_=undefined;this.lastActiveName_=undefined;this.lastActiveArgs_=undefined;},switchActiveThread(timestamp,oldThreadArgs,newThreadId,newThreadName,newThreadArgs){this.closeActiveThread(timestamp,oldThreadArgs);this.lastActiveTimestamp_=timestamp;this.lastActiveThread_=newThreadId;this.lastActiveName_=newThreadName;this.lastActiveArgs_=newThreadArgs;},getFreqStatsForRange(range){const stats={};function addStatsForFreq(freqSample,index){const freqEnd=(index<freqSample.series_.length-1)?freqSample.series_.samples_[index+1].timestamp:range.max;const freqRange=tr.b.math.Range.fromExplicitRange(freqSample.timestamp,freqEnd);const intersection=freqRange.findIntersection(range);if(!(freqSample.value in stats)){stats[freqSample.value]=0;}
-stats[freqSample.value]+=intersection.duration;}
-const freqCounter=this.getCounter('','Clock Frequency');if(freqCounter!==undefined){const freqSeries=freqCounter.getSeries(0);if(!freqSeries)return;tr.b.iterateOverIntersectingIntervals(freqSeries.samples_,function(x){return x.timestamp;},function(x,index){if(index<freqSeries.length-1){return freqSeries.samples_[index+1].timestamp;}
-return range.max;},range.min,range.max,addStatsForFreq);}
-return stats;}};Cpu.compare=function(x,y){return x.cpuNumber-y.cpuNumber;};return{Cpu,};});'use strict';tr.exportTo('tr.model',function(){const Event=tr.model.Event;const EventRegistry=tr.model.EventRegistry;function PowerSample(series,start,powerInW){Event.call(this);this.series_=series;this.start_=parseFloat(start);this.powerInW_=parseFloat(powerInW);}
-PowerSample.prototype={__proto__:Event.prototype,get series(){return this.series_;},get start(){return this.start_;},set start(value){this.start_=value;},get powerInW(){return this.powerInW_;},set powerInW(value){this.powerInW_=value;},addBoundsToRange(range){range.addValue(this.start);}};EventRegistry.register(PowerSample,{name:'powerSample',pluralName:'powerSamples'});return{PowerSample,};});'use strict';tr.exportTo('tr.model',function(){const PowerSample=tr.model.PowerSample;function PowerSeries(device){tr.model.EventContainer.call(this);this.device_=device;this.samples_=[];}
-PowerSeries.prototype={__proto__:tr.model.EventContainer.prototype,get device(){return this.device_;},get samples(){return this.samples_;},get stableId(){return this.device_.stableId+'.PowerSeries';},addPowerSample(ts,val){const sample=new PowerSample(this,ts,val);this.samples_.push(sample);return sample;},getEnergyConsumedInJ(start,end){const measurementRange=tr.b.math.Range.fromExplicitRange(start,end);let energyConsumedInJ=0;let startIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,start)-1;const endIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,end);if(startIndex<0){startIndex=0;}
-for(let i=startIndex;i<endIndex;i++){const sample=this.samples[i];const nextSample=this.samples[i+1];const sampleRange=new tr.b.math.Range();sampleRange.addValue(sample.start);sampleRange.addValue(nextSample?nextSample.start:sample.start);const intersectionRangeInMs=measurementRange.findIntersection(sampleRange);const durationInS=tr.b.convertUnit(intersectionRangeInMs.duration,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);energyConsumedInJ+=durationInS*sample.powerInW;}
-return energyConsumedInJ;},getSamplesWithinRange(start,end){const startIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,start);const endIndex=tr.b.findLowIndexInSortedArray(this.samples,x=>x.start,end);return this.samples.slice(startIndex,endIndex);},shiftTimestampsForward(amount){for(let i=0;i<this.samples_.length;++i){this.samples_[i].start+=amount;}},updateBounds(){this.bounds.reset();if(this.samples_.length===0)return;this.bounds.addValue(this.samples_[0].start);this.bounds.addValue(this.samples_[this.samples_.length-1].start);},*childEvents(){yield*this.samples_;},};return{PowerSeries,};});'use strict';tr.exportTo('tr.model',function(){function Device(model){if(!model){throw new Error('Must provide a model.');}
-tr.model.EventContainer.call(this);this.powerSeries_=undefined;this.cpuUsageSeries_=undefined;this.vSyncTimestamps_=[];}
-Device.compare=function(x,y){return x.guid-y.guid;};Device.prototype={__proto__:tr.model.EventContainer.prototype,compareTo(that){return Device.compare(this,that);},get userFriendlyName(){return'Device';},get userFriendlyDetails(){return'Device';},get stableId(){return'Device';},getSettingsKey(){return'device';},get powerSeries(){return this.powerSeries_;},set powerSeries(powerSeries){this.powerSeries_=powerSeries;},get cpuUsageSeries(){return this.cpuUsageSeries_;},set cpuUsageSeries(cpuUsageSeries){this.cpuUsageSeries_=cpuUsageSeries;},get vSyncTimestamps(){return this.vSyncTimestamps_;},set vSyncTimestamps(value){this.vSyncTimestamps_=value;},updateBounds(){this.bounds.reset();for(const child of this.childEventContainers()){child.updateBounds();this.bounds.addRange(child.bounds);}},shiftTimestampsForward(amount){for(const child of this.childEventContainers()){child.shiftTimestampsForward(amount);}
-for(let i=0;i<this.vSyncTimestamps_.length;i++){this.vSyncTimestamps_[i]+=amount;}},addCategoriesToDict(categoriesDict){},*childEventContainers(){if(this.powerSeries_){yield this.powerSeries_;}
-if(this.cpuUsageSeries_){yield this.cpuUsageSeries_;}}};return{Device,};});'use strict';tr.exportTo('tr.model',function(){function FlowEvent(category,id,title,colorId,start,args,opt_duration){tr.model.TimedEvent.call(this,start);this.category=category||'';this.title=title;this.colorId=colorId;this.start=start;this.args=args;this.id=id;this.startSlice=undefined;this.endSlice=undefined;this.startStackFrame=undefined;this.endStackFrame=undefined;if(opt_duration!==undefined){this.duration=opt_duration;}}
-FlowEvent.prototype={__proto__:tr.model.TimedEvent.prototype,get userFriendlyName(){return'Flow event named '+this.title+' at '+
-tr.b.Unit.byName.timeStampInMs.format(this.timestamp);}};tr.model.EventRegistry.register(FlowEvent,{name:'flowEvent',pluralName:'flowEvents'});return{FlowEvent,};});'use strict';tr.exportTo('tr.model',function(){function ContainerMemoryDump(start){tr.model.TimedEvent.call(this,start);this.levelOfDetail=undefined;this.memoryAllocatorDumps_=undefined;this.memoryAllocatorDumpsByFullName_=undefined;}
-ContainerMemoryDump.LevelOfDetail={BACKGROUND:0,LIGHT:1,DETAILED:2};ContainerMemoryDump.prototype={__proto__:tr.model.TimedEvent.prototype,shiftTimestampsForward(amount){this.start+=amount;},get memoryAllocatorDumps(){return this.memoryAllocatorDumps_;},set memoryAllocatorDumps(memoryAllocatorDumps){this.memoryAllocatorDumps_=memoryAllocatorDumps;this.forceRebuildingMemoryAllocatorDumpByFullNameIndex();},getMemoryAllocatorDumpByFullName(fullName){if(this.memoryAllocatorDumps_===undefined)return undefined;if(this.memoryAllocatorDumpsByFullName_===undefined){const index={};function addDumpsToIndex(dumps){dumps.forEach(function(dump){index[dump.fullName]=dump;addDumpsToIndex(dump.children);});}
-addDumpsToIndex(this.memoryAllocatorDumps_);this.memoryAllocatorDumpsByFullName_=index;}
-return this.memoryAllocatorDumpsByFullName_[fullName];},forceRebuildingMemoryAllocatorDumpByFullNameIndex(){this.memoryAllocatorDumpsByFullName_=undefined;},iterateRootAllocatorDumps(fn,opt_this){if(this.memoryAllocatorDumps===undefined)return;this.memoryAllocatorDumps.forEach(fn,opt_this||this);}};return{ContainerMemoryDump,};});'use strict';tr.exportTo('tr.model',function(){function MemoryAllocatorDump(containerMemoryDump,fullName,opt_guid){this.fullName=fullName;this.parent=undefined;this.children=[];this.numerics={};this.diagnostics={};this.containerMemoryDump=containerMemoryDump;this.owns=undefined;this.ownedBy=[];this.ownedBySiblingSizes=new Map();this.retains=[];this.retainedBy=[];this.weak=false;this.infos=[];this.guid=opt_guid;}
-MemoryAllocatorDump.SIZE_NUMERIC_NAME='size';MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME='effective_size';MemoryAllocatorDump.RESIDENT_SIZE_NUMERIC_NAME='resident_size';MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME=MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME;MemoryAllocatorDump.prototype={get name(){return this.fullName.substring(this.fullName.lastIndexOf('/')+1);},get quantifiedName(){return'\''+this.fullName+'\' in '+
-this.containerMemoryDump.containerName;},getDescendantDumpByFullName(fullName){return this.containerMemoryDump.getMemoryAllocatorDumpByFullName(this.fullName+'/'+fullName);},isDescendantOf(otherDump){if(this===otherDump)return true;if(this.parent===undefined)return false;return this.parent.isDescendantOf(otherDump);},addNumeric(name,numeric){if(!(numeric instanceof tr.b.Scalar)){throw new Error('Numeric value must be an instance of Scalar.');}
-if(name in this.numerics){throw new Error('Duplicate numeric name: '+name+'.');}
-this.numerics[name]=numeric;},addDiagnostic(name,text){if(typeof text!=='string'){throw new Error('Diagnostic text must be a string.');}
-if(name in this.diagnostics){throw new Error('Duplicate diagnostic name: '+name+'.');}
-this.diagnostics[name]=text;},aggregateNumericsRecursively(opt_model){const numericNames=new Set();this.children.forEach(function(child){child.aggregateNumericsRecursively(opt_model);for(const[item,value]of Object.entries(child.numerics)){numericNames.add(item,value);}},this);numericNames.forEach(function(numericName){if(numericName===MemoryAllocatorDump.SIZE_NUMERIC_NAME||numericName===MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME||this.numerics[numericName]!==undefined){return;}
-this.numerics[numericName]=MemoryAllocatorDump.aggregateNumerics(this.children.map(function(child){return child.numerics[numericName];}),opt_model);},this);}};MemoryAllocatorDump.aggregateNumerics=function(numerics,opt_model){let shouldLogWarning=!!opt_model;let aggregatedUnit=undefined;let aggregatedValue=0;numerics.forEach(function(numeric){if(numeric===undefined)return;const unit=numeric.unit;if(aggregatedUnit===undefined){aggregatedUnit=unit;}else if(aggregatedUnit!==unit){if(shouldLogWarning){opt_model.importWarning({type:'numeric_parse_error',message:'Multiple units provided for numeric: \''+
-aggregatedUnit.unitName+'\' and \''+unit.unitName+'\'.'});shouldLogWarning=false;}
-aggregatedUnit=tr.b.Unit.byName.unitlessNumber_smallerIsBetter;}
-aggregatedValue+=numeric.value;},this);if(aggregatedUnit===undefined)return undefined;return new tr.b.Scalar(aggregatedUnit,aggregatedValue);};function MemoryAllocatorDumpLink(source,target,opt_importance){this.source=source;this.target=target;this.importance=opt_importance;this.size=undefined;}
-const MemoryAllocatorDumpInfoType={PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN:0,PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER:1};return{MemoryAllocatorDump,MemoryAllocatorDumpLink,MemoryAllocatorDumpInfoType,};});'use strict';tr.exportTo('tr.model',function(){function GlobalMemoryDump(model,start){tr.model.ContainerMemoryDump.call(this,start);this.model=model;this.processMemoryDumps={};}
-const SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.SIZE_NUMERIC_NAME;const EFFECTIVE_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME;const MemoryAllocatorDumpInfoType=tr.model.MemoryAllocatorDumpInfoType;const PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN;const PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER;function getSize(dump){const numeric=dump.numerics[SIZE_NUMERIC_NAME];if(numeric===undefined)return 0;return numeric.value;}
-function hasSize(dump){return dump.numerics[SIZE_NUMERIC_NAME]!==undefined;}
-function optional(value,defaultValue){if(value===undefined)return defaultValue;return value;}
-GlobalMemoryDump.prototype={__proto__:tr.model.ContainerMemoryDump.prototype,get stableId(){return'memory.'+this.model.globalMemoryDumps.indexOf(this);},get userFriendlyName(){return'Global memory dump at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);},get containerName(){return'global space';},finalizeGraph(){this.removeWeakDumps();this.setUpTracingOverheadOwnership();this.aggregateNumerics();this.calculateSizes();this.calculateEffectiveSizes();this.discountTracingOverheadFromVmRegions();this.forceRebuildingMemoryAllocatorDumpByFullNameIndices();},removeWeakDumps(){this.traverseAllocatorDumpsInDepthFirstPreOrder(function(dump){if(dump.weak)return;if((dump.owns!==undefined&&dump.owns.target.weak)||(dump.parent!==undefined&&dump.parent.weak)){dump.weak=true;}});function removeWeakDumpsFromListRecursively(dumps){tr.b.inPlaceFilter(dumps,function(dump){if(dump.weak){return false;}
-removeWeakDumpsFromListRecursively(dump.children);tr.b.inPlaceFilter(dump.ownedBy,function(ownershipLink){return!ownershipLink.source.weak;});return true;});}
-this.iterateContainerDumps(function(containerDump){const memoryAllocatorDumps=containerDump.memoryAllocatorDumps;if(memoryAllocatorDumps!==undefined){removeWeakDumpsFromListRecursively(memoryAllocatorDumps);}});},calculateSizes(){this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateMemoryAllocatorDumpSize_.bind(this));},calculateMemoryAllocatorDumpSize_(dump){let shouldDefineSize=false;function getDependencySize(dependencyDump){const numeric=dependencyDump.numerics[SIZE_NUMERIC_NAME];if(numeric===undefined)return 0;shouldDefineSize=true;return numeric.value;}
-const sizeNumeric=dump.numerics[SIZE_NUMERIC_NAME];let size=0;let checkDependencySizeIsConsistent=function(){};if(sizeNumeric!==undefined){size=sizeNumeric.value;shouldDefineSize=true;if(sizeNumeric.unit!==tr.b.Unit.byName.sizeInBytes_smallerIsBetter){this.model.importWarning({type:'memory_dump_parse_error',message:'Invalid unit of \'size\' numeric of memory allocator '+'dump '+dump.quantifiedName+': '+
-sizeNumeric.unit.unitName+'.'});}
-checkDependencySizeIsConsistent=function(dependencySize,dependencyInfoType,dependencyName){if(size>=dependencySize)return;this.model.importWarning({type:'memory_dump_parse_error',message:'Size provided by memory allocator dump \''+
-dump.fullName+'\''+
-tr.b.Unit.byName.sizeInBytes.format(size)+') is less than '+dependencyName+' ('+
-tr.b.Unit.byName.sizeInBytes.format(dependencySize)+').'});dump.infos.push({type:dependencyInfoType,providedSize:size,dependencySize});}.bind(this);}
-let aggregatedChildrenSize=0;const allOverlaps={};dump.children.forEach(function(childDump){function aggregateDescendantDump(descendantDump){const ownedDumpLink=descendantDump.owns;if(ownedDumpLink!==undefined&&ownedDumpLink.target.isDescendantOf(dump)){let ownedChildDump=ownedDumpLink.target;while(ownedChildDump.parent!==dump){ownedChildDump=ownedChildDump.parent;}
-if(childDump!==ownedChildDump){const ownedBySiblingSize=getDependencySize(descendantDump);if(ownedBySiblingSize>0){const previousTotalOwnedBySiblingSize=ownedChildDump.ownedBySiblingSizes.get(childDump)||0;const updatedTotalOwnedBySiblingSize=previousTotalOwnedBySiblingSize+ownedBySiblingSize;ownedChildDump.ownedBySiblingSizes.set(childDump,updatedTotalOwnedBySiblingSize);}}
-return;}
-if(descendantDump.children.length===0){aggregatedChildrenSize+=getDependencySize(descendantDump);return;}
-descendantDump.children.forEach(aggregateDescendantDump);}
-aggregateDescendantDump(childDump);});checkDependencySizeIsConsistent(aggregatedChildrenSize,PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN,'the aggregated size of its children');let largestOwnerSize=0;dump.ownedBy.forEach(function(ownershipLink){const owner=ownershipLink.source;const ownerSize=getDependencySize(owner);largestOwnerSize=Math.max(largestOwnerSize,ownerSize);});checkDependencySizeIsConsistent(largestOwnerSize,PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER,'the size of its largest owner');if(!shouldDefineSize){delete dump.numerics[SIZE_NUMERIC_NAME];return;}
-size=Math.max(size,aggregatedChildrenSize,largestOwnerSize);dump.numerics[SIZE_NUMERIC_NAME]=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes_smallerIsBetter,size);if(aggregatedChildrenSize<size&&dump.children!==undefined&&dump.children.length>0){const virtualChild=new tr.model.MemoryAllocatorDump(dump.containerMemoryDump,dump.fullName+'/<unspecified>');virtualChild.parent=dump;dump.children.unshift(virtualChild);virtualChild.numerics[SIZE_NUMERIC_NAME]=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes_smallerIsBetter,size-aggregatedChildrenSize);}},calculateEffectiveSizes(){this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateDumpSubSizes_.bind(this));this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateDumpOwnershipCoefficient_.bind(this));this.traverseAllocatorDumpsInDepthFirstPreOrder(this.calculateDumpCumulativeOwnershipCoefficient_.bind(this));this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateDumpEffectiveSize_.bind(this));},calculateDumpSubSizes_(dump){if(!hasSize(dump))return;if(dump.children===undefined||dump.children.length===0){const size=getSize(dump);dump.notOwningSubSize_=size;dump.notOwnedSubSize_=size;return;}
-let notOwningSubSize=0;dump.children.forEach(function(childDump){if(childDump.owns!==undefined)return;notOwningSubSize+=optional(childDump.notOwningSubSize_,0);});dump.notOwningSubSize_=notOwningSubSize;let notOwnedSubSize=0;dump.children.forEach(function(childDump){if(childDump.ownedBy.length===0){notOwnedSubSize+=optional(childDump.notOwnedSubSize_,0);return;}
-let largestChildOwnerSize=0;childDump.ownedBy.forEach(function(ownershipLink){largestChildOwnerSize=Math.max(largestChildOwnerSize,getSize(ownershipLink.source));});notOwnedSubSize+=getSize(childDump)-largestChildOwnerSize;});dump.notOwnedSubSize_=notOwnedSubSize;},calculateDumpOwnershipCoefficient_(dump){if(!hasSize(dump))return;if(dump.ownedBy.length===0)return;const owners=dump.ownedBy.map(function(ownershipLink){return{dump:ownershipLink.source,importance:optional(ownershipLink.importance,0),notOwningSubSize:optional(ownershipLink.source.notOwningSubSize_,0)};});owners.sort(function(a,b){if(a.importance===b.importance){return a.notOwningSubSize-b.notOwningSubSize;}
-return b.importance-a.importance;});let currentImportanceStartPos=0;let alreadyAttributedSubSize=0;while(currentImportanceStartPos<owners.length){const currentImportance=owners[currentImportanceStartPos].importance;let nextImportanceStartPos=currentImportanceStartPos+1;while(nextImportanceStartPos<owners.length&&owners[nextImportanceStartPos].importance===currentImportance){nextImportanceStartPos++;}
-let attributedNotOwningSubSize=0;for(let pos=currentImportanceStartPos;pos<nextImportanceStartPos;pos++){const owner=owners[pos];const notOwningSubSize=owner.notOwningSubSize;if(notOwningSubSize>alreadyAttributedSubSize){attributedNotOwningSubSize+=(notOwningSubSize-alreadyAttributedSubSize)/(nextImportanceStartPos-pos);alreadyAttributedSubSize=notOwningSubSize;}
-let owningCoefficient=0;if(notOwningSubSize!==0){owningCoefficient=attributedNotOwningSubSize/notOwningSubSize;}
-owner.dump.owningCoefficient_=owningCoefficient;}
-currentImportanceStartPos=nextImportanceStartPos;}
-const notOwnedSubSize=optional(dump.notOwnedSubSize_,0);const remainderSubSize=notOwnedSubSize-alreadyAttributedSubSize;let ownedCoefficient=0;if(notOwnedSubSize!==0){ownedCoefficient=remainderSubSize/notOwnedSubSize;}
-dump.ownedCoefficient_=ownedCoefficient;},calculateDumpCumulativeOwnershipCoefficient_(dump){if(!hasSize(dump))return;let cumulativeOwnedCoefficient=optional(dump.ownedCoefficient_,1);const parent=dump.parent;if(dump.parent!==undefined){cumulativeOwnedCoefficient*=dump.parent.cumulativeOwnedCoefficient_;}
-dump.cumulativeOwnedCoefficient_=cumulativeOwnedCoefficient;let cumulativeOwningCoefficient;if(dump.owns!==undefined){cumulativeOwningCoefficient=dump.owningCoefficient_*dump.owns.target.cumulativeOwningCoefficient_;}else if(dump.parent!==undefined){cumulativeOwningCoefficient=dump.parent.cumulativeOwningCoefficient_;}else{cumulativeOwningCoefficient=1;}
-dump.cumulativeOwningCoefficient_=cumulativeOwningCoefficient;},calculateDumpEffectiveSize_(dump){if(!hasSize(dump)){delete dump.numerics[EFFECTIVE_SIZE_NUMERIC_NAME];return;}
-let effectiveSize;if(dump.children===undefined||dump.children.length===0){effectiveSize=getSize(dump)*dump.cumulativeOwningCoefficient_*dump.cumulativeOwnedCoefficient_;}else{effectiveSize=0;dump.children.forEach(function(childDump){if(!hasSize(childDump))return;effectiveSize+=childDump.numerics[EFFECTIVE_SIZE_NUMERIC_NAME].value;});}
-dump.numerics[EFFECTIVE_SIZE_NUMERIC_NAME]=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes_smallerIsBetter,effectiveSize);},aggregateNumerics(){this.iterateRootAllocatorDumps(function(dump){dump.aggregateNumericsRecursively(this.model);});this.iterateRootAllocatorDumps(this.propagateNumericsAndDiagnosticsRecursively);for(const processMemoryDump of Object.values(this.processMemoryDumps)){processMemoryDump.iterateRootAllocatorDumps(function(dump){dump.aggregateNumericsRecursively(this.model);},this);}},propagateNumericsAndDiagnosticsRecursively(globalAllocatorDump){['numerics','diagnostics'].forEach(function(field){for(const[name,value]of
-Object.entries(globalAllocatorDump[field])){globalAllocatorDump.ownedBy.forEach(function(ownershipLink){const processAllocatorDump=ownershipLink.source;if(processAllocatorDump[field][name]!==undefined){return;}
-processAllocatorDump[field][name]=value;});}});globalAllocatorDump.children.forEach(this.propagateNumericsAndDiagnosticsRecursively,this);},setUpTracingOverheadOwnership(){for(const dump of Object.values(this.processMemoryDumps)){dump.setUpTracingOverheadOwnership(this.model);}},discountTracingOverheadFromVmRegions(){for(const dump of Object.values(this.processMemoryDumps)){dump.discountTracingOverheadFromVmRegions(this.model);}},forceRebuildingMemoryAllocatorDumpByFullNameIndices(){this.iterateContainerDumps(function(containerDump){containerDump.forceRebuildingMemoryAllocatorDumpByFullNameIndex();});},iterateContainerDumps(fn){fn.call(this,this);for(const processDump of Object.values(this.processMemoryDumps)){fn.call(this,processDump);}},iterateAllRootAllocatorDumps(fn){this.iterateContainerDumps(function(containerDump){containerDump.iterateRootAllocatorDumps(fn,this);});},traverseAllocatorDumpsInDepthFirstPostOrder(fn){const visitedDumps=new WeakSet();const openDumps=new WeakSet();function visit(dump){if(visitedDumps.has(dump))return;if(openDumps.has(dump)){throw new Error(dump.userFriendlyName+' contains a cycle');}
-openDumps.add(dump);dump.ownedBy.forEach(function(ownershipLink){visit.call(this,ownershipLink.source);},this);dump.children.forEach(visit,this);fn.call(this,dump);visitedDumps.add(dump);openDumps.delete(dump);}
-this.iterateAllRootAllocatorDumps(visit);},traverseAllocatorDumpsInDepthFirstPreOrder(fn){const visitedDumps=new WeakSet();function visit(dump){if(visitedDumps.has(dump))return;if(dump.owns!==undefined&&!visitedDumps.has(dump.owns.target)){return;}
-if(dump.parent!==undefined&&!visitedDumps.has(dump.parent)){return;}
-fn.call(this,dump);visitedDumps.add(dump);dump.ownedBy.forEach(function(ownershipLink){visit.call(this,ownershipLink.source);},this);dump.children.forEach(visit,this);}
-this.iterateAllRootAllocatorDumps(visit);}};tr.model.EventRegistry.register(GlobalMemoryDump,{name:'globalMemoryDump',pluralName:'globalMemoryDumps'});return{GlobalMemoryDump,};});'use strict';tr.exportTo('tr.model',function(){const InstantEventType={GLOBAL:1,PROCESS:2};function InstantEvent(category,title,colorId,start,args,parent){tr.model.TimedEvent.call(this,start);this.category=category||'';this.title=title;this.colorId=colorId;this.args=args;this.parent_=parent;this.type=undefined;}
-InstantEvent.prototype={__proto__:tr.model.TimedEvent.prototype,};function GlobalInstantEvent(category,title,colorId,start,args,parent){InstantEvent.apply(this,arguments);this.type=InstantEventType.GLOBAL;}
-GlobalInstantEvent.prototype={__proto__:InstantEvent.prototype,get userFriendlyName(){return'Global instant event '+this.title+' @ '+
-tr.b.Unit.byName.timeStampInMs.format(start);},get stableId(){return'instant.'+this.parent_.instantEvents.indexOf(this);},};function ProcessInstantEvent(category,title,colorId,start,args,parent){InstantEvent.apply(this,arguments);this.type=InstantEventType.PROCESS;}
-ProcessInstantEvent.prototype={__proto__:InstantEvent.prototype,get userFriendlyName(){return'Process-level instant event '+this.title+' @ '+
-tr.b.Unit.byName.timeStampInMs.format(start);},get stableId(){return this.parent_.stableId+'.instant.'+
-this.parent_.instantEvents.indexOf(this);},};tr.model.EventRegistry.register(InstantEvent,{name:'instantEvent',pluralName:'instantEvents'});return{GlobalInstantEvent,ProcessInstantEvent,InstantEventType,InstantEvent,};});'use strict';tr.exportTo('tr.model',function(){const Cpu=tr.model.Cpu;const ProcessBase=tr.model.ProcessBase;function Kernel(model){ProcessBase.call(this,model);this.cpus={};this.softwareMeasuredCpuCount_=undefined;}
-Kernel.compare=function(x,y){return 0;};Kernel.prototype={__proto__:ProcessBase.prototype,compareTo(that){return Kernel.compare(this,that);},get userFriendlyName(){return'Kernel';},get userFriendlyDetails(){return'Kernel';},get stableId(){return'Kernel';},getOrCreateCpu(cpuNumber){if(!this.cpus[cpuNumber]){this.cpus[cpuNumber]=new Cpu(this,cpuNumber);}
-return this.cpus[cpuNumber];},get softwareMeasuredCpuCount(){return this.softwareMeasuredCpuCount_;},set softwareMeasuredCpuCount(softwareMeasuredCpuCount){if(this.softwareMeasuredCpuCount_!==undefined&&this.softwareMeasuredCpuCount_!==softwareMeasuredCpuCount){throw new Error('Cannot change the softwareMeasuredCpuCount once it is set');}
-this.softwareMeasuredCpuCount_=softwareMeasuredCpuCount;},get bestGuessAtCpuCount(){const realCpuCount=Object.keys(this.cpus).length;if(realCpuCount!==0){return realCpuCount;}
-return this.softwareMeasuredCpuCount;},updateBounds(){ProcessBase.prototype.updateBounds.call(this);for(const cpuNumber in this.cpus){const cpu=this.cpus[cpuNumber];cpu.updateBounds();this.bounds.addRange(cpu.bounds);}},createSubSlices(){ProcessBase.prototype.createSubSlices.call(this);for(const cpuNumber in this.cpus){const cpu=this.cpus[cpuNumber];cpu.createSubSlices();}},addCategoriesToDict(categoriesDict){ProcessBase.prototype.addCategoriesToDict.call(this,categoriesDict);for(const cpuNumber in this.cpus){this.cpus[cpuNumber].addCategoriesToDict(categoriesDict);}},getSettingsKey(){return'kernel';},*childEventContainers(){yield*ProcessBase.prototype.childEventContainers.call(this);yield*Object.values(this.cpus);},};return{Kernel,};});'use strict';tr.exportTo('tr.model',function(){function ModelIndices(model){this.flowEventsById_={};model.flowEvents.forEach(function(fe){if(fe.id!==undefined){if(!this.flowEventsById_.hasOwnProperty(fe.id)){this.flowEventsById_[fe.id]=[];}
-this.flowEventsById_[fe.id].push(fe);}},this);}
-ModelIndices.prototype={addEventWithId(id,event){if(!this.flowEventsById_.hasOwnProperty(id)){this.flowEventsById_[id]=[];}
-this.flowEventsById_[id].push(event);},getFlowEventsWithId(id){if(!this.flowEventsById_.hasOwnProperty(id)){return[];}
-return this.flowEventsById_[id];}};return{ModelIndices,};});'use strict';tr.exportTo('tr.model',function(){function ModelStats(){this.traceEventCountsByKey_=new Map();this.allTraceEventStats_=[];this.traceEventStatsInTimeIntervals_=new Map();this.allTraceEventStatsInTimeIntervals_=[];this.hasEventSizesinBytes_=false;this.traceImportDurationMs_=undefined;}
-ModelStats.prototype={TIME_INTERVAL_SIZE_IN_MS:100,willProcessBasicTraceEvent(phase,category,title,ts,opt_eventSizeinBytes){const key=phase+'/'+category+'/'+title;let eventStats=this.traceEventCountsByKey_.get(key);if(eventStats===undefined){eventStats={phase,category,title,numEvents:0,totalEventSizeinBytes:0};this.traceEventCountsByKey_.set(key,eventStats);this.allTraceEventStats_.push(eventStats);}
-eventStats.numEvents++;const timeIntervalKey=Math.floor(tr.b.Unit.timestampFromUs(ts)/this.TIME_INTERVAL_SIZE_IN_MS);let eventStatsByTimeInverval=this.traceEventStatsInTimeIntervals_.get(timeIntervalKey);if(eventStatsByTimeInverval===undefined){eventStatsByTimeInverval={timeInterval:timeIntervalKey,numEvents:0,totalEventSizeinBytes:0};this.traceEventStatsInTimeIntervals_.set(timeIntervalKey,eventStatsByTimeInverval);this.allTraceEventStatsInTimeIntervals_.push(eventStatsByTimeInverval);}
-eventStatsByTimeInverval.numEvents++;if(opt_eventSizeinBytes!==undefined){this.hasEventSizesinBytes_=true;eventStats.totalEventSizeinBytes+=opt_eventSizeinBytes;eventStatsByTimeInverval.totalEventSizeinBytes+=opt_eventSizeinBytes;}},get allTraceEventStats(){return this.allTraceEventStats_;},get allTraceEventStatsInTimeIntervals(){return this.allTraceEventStatsInTimeIntervals_;},get hasEventSizesinBytes(){return this.hasEventSizesinBytes_;},get traceImportDurationMs(){return this.traceImportDurationMs_;},set traceImportDurationMs(traceImportDurationMs){this.traceImportDurationMs_=traceImportDurationMs;}};return{ModelStats,};});'use strict';tr.exportTo('tr.model',function(){function VMRegion(startAddress,sizeInBytes,protectionFlags,mappedFile,byteStats){this.startAddress=startAddress;this.sizeInBytes=sizeInBytes;this.protectionFlags=protectionFlags;this.mappedFile=mappedFile||'';this.byteStats=byteStats||{};}
-VMRegion.PROTECTION_FLAG_READ=4;VMRegion.PROTECTION_FLAG_WRITE=2;VMRegion.PROTECTION_FLAG_EXECUTE=1;VMRegion.PROTECTION_FLAG_MAYSHARE=128;VMRegion.prototype={get uniqueIdWithinProcess(){return this.mappedFile+'#'+this.startAddress;},get protectionFlagsToString(){if(this.protectionFlags===undefined)return undefined;return((this.protectionFlags&VMRegion.PROTECTION_FLAG_READ?'r':'-')+
-(this.protectionFlags&VMRegion.PROTECTION_FLAG_WRITE?'w':'-')+
-(this.protectionFlags&VMRegion.PROTECTION_FLAG_EXECUTE?'x':'-')+
-(this.protectionFlags&VMRegion.PROTECTION_FLAG_MAYSHARE?'s':'p'));}};VMRegion.fromDict=function(dict){return new VMRegion(dict.startAddress,dict.sizeInBytes,dict.protectionFlags,dict.mappedFile,dict.byteStats);};function VMRegionClassificationNode(opt_rule){this.rule_=opt_rule||VMRegionClassificationNode.CLASSIFICATION_RULES;this.hasRegions=false;this.sizeInBytes=undefined;this.byteStats={};this.children_=undefined;this.regions_=[];}
-VMRegionClassificationNode.CLASSIFICATION_RULES={name:'Total',children:[{name:'Android',file:/^\/dev\/ashmem(?!\/libc malloc)/,children:[{name:'Java runtime',file:/^\/dev\/ashmem\/dalvik-/,children:[{name:'Spaces',file:/\/dalvik-(alloc|main|large object|non moving|zygote) space/,children:[{name:'Normal',file:/\/dalvik-(alloc|main)/},{name:'Large',file:/\/dalvik-large object/},{name:'Zygote',file:/\/dalvik-zygote/},{name:'Non-moving',file:/\/dalvik-non moving/}]},{name:'Linear Alloc',file:/\/dalvik-LinearAlloc/},{name:'Indirect Reference Table',file:/\/dalvik-indirect.ref/},{name:'Cache',file:/\/dalvik-jit-code-cache/},{name:'Accounting'}]},{name:'Cursor',file:/\/CursorWindow/},{name:'Ashmem'}]},{name:'Native heap',file:/^((\[heap\])|(\[anon:)|(\/dev\/ashmem\/libc malloc)|(\[discounted tracing overhead\])|$)/},{name:'Stack',file:/^\[stack/},{name:'Files',file:/\.((((jar)|(apk)|(ttf)|(odex)|(oat)|(art))$)|(dex)|(so))/,children:[{name:'so',file:/\.so/},{name:'jar',file:/\.jar$/},{name:'apk',file:/\.apk$/},{name:'ttf',file:/\.ttf$/},{name:'dex',file:/\.((dex)|(odex$))/},{name:'oat',file:/\.oat$/},{name:'art',file:/\.art$/}]},{name:'Devices',file:/(^\/dev\/)|(anon_inode:dmabuf)/,children:[{name:'GPU',file:/\/((nv)|(mali)|(kgsl))/},{name:'DMA',file:/anon_inode:dmabuf/}]}]};VMRegionClassificationNode.OTHER_RULE={name:'Other'};VMRegionClassificationNode.fromRegions=function(regions,opt_rules){const tree=new VMRegionClassificationNode(opt_rules);tree.regions_=regions;for(let i=0;i<regions.length;i++){tree.addStatsFromRegion_(regions[i]);}
-return tree;};VMRegionClassificationNode.prototype={get title(){return this.rule_.name;},get children(){if(this.isLeafNode){return undefined;}
-if(this.children_===undefined){this.buildTree_();}
-return this.children_;},get regions(){if(!this.isLeafNode){return undefined;}
-return this.regions_;},get allRegionsForTesting(){if(this.regions_!==undefined){if(this.children_!==undefined){throw new Error('Internal error: a VM region classification node '+'cannot have both regions and children');}
-return this.regions_;}
-let regions=[];this.children_.forEach(function(childNode){regions=regions.concat(childNode.allRegionsForTesting);});return regions;},get isLeafNode(){const children=this.rule_.children;return children===undefined||children.length===0;},addRegion(region){this.addRegionRecursively_(region,true);},someRegion(fn,opt_this){if(this.regions_!==undefined){return this.regions_.some(fn,opt_this);}
-return this.children_.some(function(childNode){return childNode.someRegion(fn,opt_this);});},addRegionRecursively_(region,addStatsToThisNode){if(addStatsToThisNode){this.addStatsFromRegion_(region);}
-if(this.regions_!==undefined){if(this.children_!==undefined){throw new Error('Internal error: a VM region classification node '+'cannot have both regions and children');}
-this.regions_.push(region);return;}
-function regionRowMatchesChildNide(child){const fileRegExp=child.rule_.file;if(fileRegExp===undefined)return true;return fileRegExp.test(region.mappedFile);}
-let matchedChild=this.children_.find(regionRowMatchesChildNide);if(matchedChild===undefined){if(this.children_.length!==this.rule_.children.length){throw new Error('Internal error');}
-matchedChild=new VMRegionClassificationNode(VMRegionClassificationNode.OTHER_RULE);this.children_.push(matchedChild);}
-matchedChild.addRegionRecursively_(region,true);},buildTree_(){const cachedRegions=this.regions_;this.regions_=undefined;this.buildChildNodesRecursively_();for(let i=0;i<cachedRegions.length;i++){this.addRegionRecursively_(cachedRegions[i],false);}},buildChildNodesRecursively_(){if(this.children_!==undefined){throw new Error('Internal error: Classification node already has children');}
-if(this.regions_!==undefined&&this.regions_.length!==0){throw new Error('Internal error: Classification node should have no regions');}
-if(this.isLeafNode){return;}
-this.regions_=undefined;this.children_=this.rule_.children.map(function(childRule){const child=new VMRegionClassificationNode(childRule);child.buildChildNodesRecursively_();return child;});},addStatsFromRegion_(region){this.hasRegions=true;const regionSizeInBytes=region.sizeInBytes;if(regionSizeInBytes!==undefined){this.sizeInBytes=(this.sizeInBytes||0)+regionSizeInBytes;}
-const thisByteStats=this.byteStats;const regionByteStats=region.byteStats;for(const byteStatName in regionByteStats){const regionByteStatValue=regionByteStats[byteStatName];if(regionByteStatValue===undefined)continue;thisByteStats[byteStatName]=(thisByteStats[byteStatName]||0)+regionByteStatValue;}
-if(region.mappedFile.includes('/base.odex')||region.mappedFile.includes('/base.vdex')){if(region.byteStats.proportionalResident!==undefined){thisByteStats.javaBasePss=(thisByteStats.javaBasePss||0)+
-region.byteStats.proportionalResident;}
-if(region.byteStats.privateCleanResident!==undefined){thisByteStats.javaBaseCleanResident=(thisByteStats.javaBaseCleanResident||0)+
-region.byteStats.privateCleanResident;}
-if(region.byteStats.sharedCleanResident!==undefined){thisByteStats.javaBaseCleanResident=(thisByteStats.javaBaseCleanResident||0)+
-region.byteStats.sharedCleanResident;}}
-const textProtectionFlags=(VMRegion.PROTECTION_FLAG_READ|VMRegion.PROTECTION_FLAG_EXECUTE);if((region.protectionFlags===textProtectionFlags)&&(region.mappedFile.includes('/base.apk')||region.mappedFile.includes('/libchrome.so'))){if(regionSizeInBytes!==undefined){this.nativeLibrarySizeInBytes=(this.nativeLibrarySizeInBytes||0)+regionSizeInBytes;}
-if(region.byteStats.privateCleanResident!==undefined){thisByteStats.nativeLibraryPrivateCleanResident=(thisByteStats.nativeLibraryPrivateCleanResident||0)+
-region.byteStats.privateCleanResident;}
-if(region.byteStats.sharedCleanResident!==undefined){thisByteStats.nativeLibrarySharedCleanResident=(thisByteStats.nativeLibrarySharedCleanResident||0)+
-region.byteStats.sharedCleanResident;}
-if(region.byteStats.proportionalResident!==undefined){thisByteStats.nativeLibraryProportionalResident=(thisByteStats.nativeLibraryProportionalResident||0)+
-region.byteStats.proportionalResident;}}}};return{VMRegion,VMRegionClassificationNode,};});'use strict';tr.exportTo('tr.model',function(){const DISCOUNTED_ALLOCATOR_NAMES=['winheap','malloc'];const TRACING_OVERHEAD_PATH=['allocated_objects','tracing_overhead'];const SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.SIZE_NUMERIC_NAME;const RESIDENT_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.RESIDENT_SIZE_NUMERIC_NAME;function getSizeNumericValue(dump,sizeNumericName){const sizeNumeric=dump.numerics[sizeNumericName];if(sizeNumeric===undefined)return 0;return sizeNumeric.value;}
-function ProcessMemoryDump(globalMemoryDump,process,start){tr.model.ContainerMemoryDump.call(this,start);this.process=process;this.globalMemoryDump=globalMemoryDump;this.totals=undefined;this.vmRegions=undefined;this.heapDumps=undefined;this.tracingOverheadOwnershipSetUp_=false;this.tracingOverheadDiscountedFromVmRegions_=false;}
-ProcessMemoryDump.prototype={__proto__:tr.model.ContainerMemoryDump.prototype,get stableId(){return this.process.stableId+'.memory.'+
-this.process.memoryDumps.indexOf(this);},get userFriendlyName(){return'Process memory dump at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);},get containerName(){return this.process.userFriendlyName;},get processMemoryDumps(){const dumps={};dumps[this.process.pid]=this;return dumps;},get hasOwnVmRegions(){return this.vmRegions!==undefined;},setUpTracingOverheadOwnership(opt_model){if(this.tracingOverheadOwnershipSetUp_)return;this.tracingOverheadOwnershipSetUp_=true;const tracingDump=this.getMemoryAllocatorDumpByFullName('tracing');if(tracingDump===undefined||tracingDump.owns!==undefined){return;}
-if(tracingDump.owns!==undefined)return;const hasDiscountedFromAllocatorDumps=DISCOUNTED_ALLOCATOR_NAMES.some(function(allocatorName){const allocatorDump=this.getMemoryAllocatorDumpByFullName(allocatorName);if(allocatorDump===undefined){return false;}
-let nextPathIndex=0;let currentDump=allocatorDump;let currentFullName=allocatorName;for(;nextPathIndex<TRACING_OVERHEAD_PATH.length;nextPathIndex++){const childFullName=currentFullName+'/'+
-TRACING_OVERHEAD_PATH[nextPathIndex];const childDump=this.getMemoryAllocatorDumpByFullName(childFullName);if(childDump===undefined)break;currentDump=childDump;currentFullName=childFullName;}
-for(;nextPathIndex<TRACING_OVERHEAD_PATH.length;nextPathIndex++){const childFullName=currentFullName+'/'+
-TRACING_OVERHEAD_PATH[nextPathIndex];const childDump=new tr.model.MemoryAllocatorDump(currentDump.containerMemoryDump,childFullName);childDump.parent=currentDump;currentDump.children.push(childDump);currentFullName=childFullName;currentDump=childDump;}
-const ownershipLink=new tr.model.MemoryAllocatorDumpLink(tracingDump,currentDump);tracingDump.owns=ownershipLink;currentDump.ownedBy.push(ownershipLink);return true;},this);if(hasDiscountedFromAllocatorDumps){this.forceRebuildingMemoryAllocatorDumpByFullNameIndex();}},discountTracingOverheadFromVmRegions(opt_model){if(this.tracingOverheadDiscountedFromVmRegions_)return;this.tracingOverheadDiscountedFromVmRegions_=true;const tracingDump=this.getMemoryAllocatorDumpByFullName('tracing');if(tracingDump===undefined)return;const discountedSize=getSizeNumericValue(tracingDump,SIZE_NUMERIC_NAME);const discountedResidentSize=getSizeNumericValue(tracingDump,RESIDENT_SIZE_NUMERIC_NAME);if(discountedSize<=0&&discountedResidentSize<=0)return;if(this.totals!==undefined){if(this.totals.residentBytes!==undefined){this.totals.residentBytes-=discountedResidentSize;}
-if(this.totals.peakResidentBytes!==undefined){this.totals.peakResidentBytes-=discountedResidentSize;}}
-if(this.vmRegions!==undefined){const hasSizeInBytes=this.vmRegions.sizeInBytes!==undefined;const hasPrivateDirtyResident=this.vmRegions.byteStats.privateDirtyResident!==undefined;const hasProportionalResident=this.vmRegions.byteStats.proportionalResident!==undefined;if((hasSizeInBytes&&discountedSize>0)||((hasPrivateDirtyResident||hasProportionalResident)&&discountedResidentSize>0)){const byteStats={};if(hasPrivateDirtyResident){byteStats.privateDirtyResident=-discountedResidentSize;}
-if(hasProportionalResident){byteStats.proportionalResident=-discountedResidentSize;}
-this.vmRegions.addRegion(tr.model.VMRegion.fromDict({mappedFile:'[discounted tracing overhead]',sizeInBytes:hasSizeInBytes?-discountedSize:undefined,byteStats}));}}}};ProcessMemoryDump.hookUpMostRecentVmRegionsLinks=function(processDumps){let mostRecentVmRegions=undefined;processDumps.forEach(function(processDump){if(processDump.vmRegions!==undefined){mostRecentVmRegions=processDump.vmRegions;}
-processDump.mostRecentVmRegions=mostRecentVmRegions;});};tr.model.EventRegistry.register(ProcessMemoryDump,{name:'processMemoryDump',pluralName:'processMemoryDumps'});return{ProcessMemoryDump,};});'use strict';tr.exportTo('tr.model',function(){const ProcessBase=tr.model.ProcessBase;const ProcessInstantEvent=tr.model.ProcessInstantEvent;const Frame=tr.model.Frame;const ProcessMemoryDump=tr.model.ProcessMemoryDump;function Process(model,pid){if(model===undefined){throw new Error('model must be provided');}
-if(pid===undefined){throw new Error('pid must be provided');}
-tr.model.ProcessBase.call(this,model);this.pid=pid;this.name=undefined;this.labels=[];this.uptime_seconds=0;this.instantEvents=[];this.memoryDumps=[];this.frames=[];this.activities=[];}
-Process.compare=function(x,y){let tmp=tr.model.ProcessBase.compare(x,y);if(tmp)return tmp;if(x.name!==undefined){if(y.name!==undefined){tmp=x.name.localeCompare(y.name);}else{tmp=-1;}}else if(y.name!==undefined){tmp=1;}
-if(tmp)return tmp;tmp=tr.b.compareArrays(x.labels,y.labels,function(x,y){return x.localeCompare(y);});if(tmp)return tmp;return x.pid-y.pid;};Process.prototype={__proto__:tr.model.ProcessBase.prototype,get stableId(){return this.pid;},compareTo(that){return Process.compare(this,that);},*childEvents(){yield*ProcessBase.prototype.childEvents.call(this);yield*this.instantEvents;yield*this.frames;yield*this.memoryDumps;},addLabelIfNeeded(labelName){for(let i=0;i<this.labels.length;i++){if(this.labels[i]===labelName)return;}
-this.labels.push(labelName);},get userFriendlyName(){let res;if(this.name){res=this.name+' (pid '+this.pid+')';}else{res='Process '+this.pid;}
-if(this.labels.length){res+=': '+this.labels.join(', ');}
-if(this.uptime_seconds){res+=', uptime:'+this.uptime_seconds+'s';}
-return res;},get userFriendlyDetails(){if(this.name){return this.name+' (pid '+this.pid+')';}
-return'pid: '+this.pid;},getSettingsKey(){if(!this.name)return undefined;if(!this.labels.length)return'processes.'+this.name;return'processes.'+this.name+'.'+this.labels.join('.');},shiftTimestampsForward(amount){for(let i=0;i<this.instantEvents.length;i++){this.instantEvents[i].start+=amount;}
-for(let i=0;i<this.frames.length;i++){this.frames[i].shiftTimestampsForward(amount);}
-for(let i=0;i<this.memoryDumps.length;i++){this.memoryDumps[i].shiftTimestampsForward(amount);}
-for(let i=0;i<this.activities.length;i++){this.activities[i].shiftTimestampsForward(amount);}
-tr.model.ProcessBase.prototype.shiftTimestampsForward.apply(this,arguments);},updateBounds(){tr.model.ProcessBase.prototype.updateBounds.apply(this);for(let i=0;i<this.frames.length;i++){this.frames[i].addBoundsToRange(this.bounds);}
-for(let i=0;i<this.memoryDumps.length;i++){this.memoryDumps[i].addBoundsToRange(this.bounds);}
-for(let i=0;i<this.activities.length;i++){this.activities[i].addBoundsToRange(this.bounds);}},sortMemoryDumps(){this.memoryDumps.sort(function(x,y){return x.start-y.start;});tr.model.ProcessMemoryDump.hookUpMostRecentVmRegionsLinks(this.memoryDumps);}};return{Process,};});'use strict';tr.exportTo('tr.model',function(){function Sample(start,title,leafNode,thread,opt_cpu,opt_weight,opt_args){tr.model.TimedEvent.call(this,start);this.start_=start;this.title_=title;this.leafNode_=leafNode;this.thread_=thread;this.colorId_=leafNode.colorId;this.cpu_=opt_cpu;this.weight_=opt_weight;this.args=opt_args||{};}
-Sample.prototype={__proto__:tr.model.TimedEvent.prototype,get title(){return this.title_;},get colorId(){return this.colorId_;},get thread(){return this.thread_;},get leafNode(){return this.leafNode_;},get userFriendlyName(){return'Sample at '+
-tr.b.Unit.byName.timeStampInMs.format(this.start);},get userFriendlyStack(){return this.leafNode_.userFriendlyStack;},getNodesAsArray(){const nodes=[];let node=this.leafNode_;while(node!==undefined){nodes.push(node);node=node.parentNode;}
-return nodes;},get cpu(){return this.cpu_;},get weight(){return this.weight_;},};tr.model.EventRegistry.register(Sample,{name:'Sample',pluralName:'Samples'});return{Sample,};});'use strict';tr.exportTo('tr.model',function(){function StackFrame(parentFrame,id,title,colorId,opt_sourceInfo){if(id===undefined){throw new Error('id must be given');}
-this.parentFrame_=parentFrame;this.id=id;this.title_=title;this.colorId=colorId;this.children=[];this.sourceInfo_=opt_sourceInfo;if(this.parentFrame_){this.parentFrame_.addChild(this);}}
-StackFrame.prototype={get parentFrame(){return this.parentFrame_;},get title(){if(this.sourceInfo_){const src=this.sourceInfo_.toString();return this.title_+(src===''?'':' '+src);}
-return this.title_;},get domain(){let result='unknown';if(this.sourceInfo_&&this.sourceInfo_.domain){result=this.sourceInfo_.domain;}
-if(result==='unknown'&&this.parentFrame){result=this.parentFrame.domain;}
-return result;},get sourceInfo(){return this.sourceInfo_;},set parentFrame(parentFrame){if(this.parentFrame_){Polymer.dom(this.parentFrame_).removeChild(this);}
-this.parentFrame_=parentFrame;if(this.parentFrame_){this.parentFrame_.addChild(this);}},addChild(child){this.children.push(child);},removeChild(child){const i=this.children.indexOf(child.id);if(i===-1){throw new Error('omg');}
-this.children.splice(i,1);},removeAllChildren(){for(let i=0;i<this.children.length;i++){this.children[i].parentFrame_=undefined;}
-this.children.splice(0,this.children.length);},get stackTrace(){const stack=[this];let cur=this.parentFrame;while(cur){stack.push(cur);cur=cur.parentFrame;}
-return stack;},getUserFriendlyStackTrace(){return this.stackTrace.map(function(x){return x.title;});}};return{StackFrame,};});'use strict';tr.exportTo('tr.model.um',function(){class UserModel extends tr.model.EventContainer{constructor(parentModel){super();this.parentModel_=parentModel;this.expectations_=new tr.model.EventSet();this.segments_=[];}
-get stableId(){return'UserModel';}
-get parentModel(){return this.parentModel_;}
-sortExpectations(){this.expectations_.sortEvents((x,y)=>(x.start-y.start));}
-get expectations(){return this.expectations_;}
-shiftTimestampsForward(amount){}
-addCategoriesToDict(categoriesDict){}
-get segments(){return this.segments_;}*childEvents(){yield*this.expectations;}*childEventContainers(){}
-updateBounds(){this.bounds.reset();for(const expectation of this.expectations){expectation.addBoundsToRange(this.bounds);}}
-resegment(getKeyForSegment){const newSegments=[];let prevKey=undefined;let prevSegment=undefined;for(let i=0;i<this.segments.length;++i){const segment=this.segments[i];const key=getKeyForSegment(segment,i);if(prevSegment!==undefined&&key===prevKey){prevSegment.addSegment(segment);}else{prevSegment=segment.clone();newSegments.push(prevSegment);}
-prevKey=key;}
-return newSegments;}}
-return{UserModel,};});'use strict';tr.exportTo('tr',function(){const Process=tr.model.Process;const Device=tr.model.Device;const Kernel=tr.model.Kernel;const GlobalMemoryDump=tr.model.GlobalMemoryDump;const GlobalInstantEvent=tr.model.GlobalInstantEvent;const FlowEvent=tr.model.FlowEvent;const Alert=tr.model.Alert;const Sample=tr.model.Sample;function Model(){tr.model.EventContainer.call(this);tr.b.EventTarget.decorate(this);this.timestampShiftToZeroAmount_=0;this.faviconHue='blue';this.device=new Device(this);this.kernel=new Kernel(this);this.processes={};this.metadata=[];this.categories=[];this.instantEvents=[];this.flowEvents=[];this.clockSyncManager=new tr.model.ClockSyncManager();this.intrinsicTimeUnit_=undefined;this.stackFrames={};this.samples=[];this.alerts=[];this.userModel=new tr.model.um.UserModel(this);this.flowIntervalTree=new tr.b.IntervalTree((f)=>f.start,(f)=>f.end);this.globalMemoryDumps=[];this.userFriendlyCategoryDrivers_=[];this.annotationsByGuid_={};this.modelIndices=undefined;this.stats=new tr.model.ModelStats();this.importWarnings_=[];this.reportedImportWarnings_={};this.isTimeHighResolution_=true;this.patchupsToApply_=[];this.doesHelperGUIDSupportThisModel_={};this.helpersByConstructorGUID_={};this.eventsByStableId_=undefined;}
-Model.prototype={__proto__:tr.model.EventContainer.prototype,getEventByStableId(stableId){if(this.eventsByStableId_===undefined){this.eventsByStableId_={};for(const event of this.getDescendantEvents()){this.eventsByStableId_[event.stableId]=event;}}
-return this.eventsByStableId_[stableId];},getOrCreateHelper(constructor){if(!constructor.guid){throw new Error('Helper constructors must have GUIDs');}
-if(this.helpersByConstructorGUID_[constructor.guid]===undefined){if(this.doesHelperGUIDSupportThisModel_[constructor.guid]===undefined){this.doesHelperGUIDSupportThisModel_[constructor.guid]=constructor.supportsModel(this);}
-if(!this.doesHelperGUIDSupportThisModel_[constructor.guid]){return undefined;}
-this.helpersByConstructorGUID_[constructor.guid]=new constructor(this);}
-return this.helpersByConstructorGUID_[constructor.guid];},*childEvents(){yield*this.globalMemoryDumps;yield*this.instantEvents;yield*this.flowEvents;yield*this.alerts;yield*this.samples;},*childEventContainers(){yield this.userModel;yield this.device;yield this.kernel;yield*Object.values(this.processes);},iterateAllPersistableObjects(callback){this.kernel.iterateAllPersistableObjects(callback);for(const pid in this.processes){this.processes[pid].iterateAllPersistableObjects(callback);}},updateBounds(){this.bounds.reset();const bounds=this.bounds;for(const ec of this.childEventContainers()){ec.updateBounds();bounds.addRange(ec.bounds);}
-for(const event of this.childEvents()){event.addBoundsToRange(bounds);}},shiftWorldToZero(){const shiftAmount=-this.bounds.min;this.timestampShiftToZeroAmount_=shiftAmount;for(const ec of this.childEventContainers()){ec.shiftTimestampsForward(shiftAmount);}
-for(const event of this.childEvents()){event.start+=shiftAmount;}
-this.updateBounds();},convertTimestampToModelTime(sourceClockDomainName,ts){if(sourceClockDomainName!=='traceEventClock'){throw new Error('Only traceEventClock is supported.');}
-return tr.b.Unit.timestampFromUs(ts)+
-this.timestampShiftToZeroAmount_;},convertTimestampFromModelTime(targetClockDomainName,ts){if(targetClockDomainName!=='traceEventClock'){throw new Error('Only traceEventClock is supported.');}
-const convertFn=this.clockSyncManager.getModelTimeTransformerInverse(tr.model.ClockDomainId.LINUX_FTRACE_GLOBAL);return convertFn(ts)-this.timestampShiftToZeroAmount_;},get numProcesses(){let n=0;for(const p in this.processes){n++;}
-return n;},getProcess(pid){return this.processes[pid];},getOrCreateProcess(pid){if(!this.processes[pid]){this.processes[pid]=new Process(this,pid);}
-return this.processes[pid];},addStackFrame(stackFrame){if(this.stackFrames[stackFrame.id]){throw new Error('Stack frame already exists');}
-this.stackFrames[stackFrame.id]=stackFrame;return stackFrame;},updateCategories_(){const categoriesDict={};this.userModel.addCategoriesToDict(categoriesDict);this.device.addCategoriesToDict(categoriesDict);this.kernel.addCategoriesToDict(categoriesDict);for(const pid in this.processes){this.processes[pid].addCategoriesToDict(categoriesDict);}
-this.categories=[];for(const category in categoriesDict){if(category!==''){this.categories.push(category);}}},getAllThreads(){const threads=[];for(const tid in this.kernel.threads){threads.push(process.threads[tid]);}
-for(const pid in this.processes){const process=this.processes[pid];for(const tid in process.threads){threads.push(process.threads[tid]);}}
-return threads;},getAllProcesses(opt_predicate){const processes=[];for(const pid in this.processes){const process=this.processes[pid];if(opt_predicate===undefined||opt_predicate(process)){processes.push(process);}}
-return processes;},getAllCounters(){const counters=[];counters.push.apply(counters,Object.values(this.device.counters||{}));counters.push.apply(counters,Object.values(this.kernel.counters||{}));for(const pid in this.processes){const process=this.processes[pid];for(const tid in process.counters){counters.push(process.counters[tid]);}}
-return counters;},getAnnotationByGUID(guid){return this.annotationsByGuid_[guid];},addAnnotation(annotation){if(!annotation.guid){throw new Error('Annotation with undefined guid given');}
-this.annotationsByGuid_[annotation.guid]=annotation;tr.b.dispatchSimpleEvent(this,'annotationChange');},removeAnnotation(annotation){this.annotationsByGuid_[annotation.guid].onRemove();delete this.annotationsByGuid_[annotation.guid];tr.b.dispatchSimpleEvent(this,'annotationChange');},getAllAnnotations(){return Object.values(this.annotationsByGuid_);},addUserFriendlyCategoryDriver(ufcd){this.userFriendlyCategoryDrivers_.push(ufcd);},getUserFriendlyCategoryFromEvent(event){for(let i=0;i<this.userFriendlyCategoryDrivers_.length;i++){const ufc=this.userFriendlyCategoryDrivers_[i].fromEvent(event);if(ufc!==undefined)return ufc;}
-return undefined;},findAllThreadsNamed(name){const namedThreads=[];namedThreads.push.apply(namedThreads,this.kernel.findAllThreadsNamed(name));for(const pid in this.processes){namedThreads.push.apply(namedThreads,this.processes[pid].findAllThreadsNamed(name));}
-return namedThreads;},get importOptions(){return this.importOptions_;},set importOptions(options){this.importOptions_=options;},get intrinsicTimeUnit(){if(this.intrinsicTimeUnit_===undefined){return tr.b.TimeDisplayModes.ms;}
-return this.intrinsicTimeUnit_;},set intrinsicTimeUnit(value){if(this.intrinsicTimeUnit_===value)return;if(this.intrinsicTimeUnit_!==undefined){throw new Error('Intrinsic time unit already set');}
-this.intrinsicTimeUnit_=value;},get isTimeHighResolution(){return this.isTimeHighResolution_;},set isTimeHighResolution(value){this.isTimeHighResolution_=value;},get canonicalUrl(){return this.canonicalUrl_;},set canonicalUrl(value){if(this.canonicalUrl_===value)return;if(this.canonicalUrl_!==undefined){throw new Error('canonicalUrl already set');}
-this.canonicalUrl_=value;},importWarning(data){data.showToUser=!!data.showToUser;this.importWarnings_.push(data);if(this.reportedImportWarnings_[data.type]===true)return;this.reportedImportWarnings_[data.type]=true;},get hasImportWarnings(){return(this.importWarnings_.length>0);},get importWarnings(){return this.importWarnings_;},get importWarningsThatShouldBeShownToUser(){return this.importWarnings_.filter(function(warning){return warning.showToUser;});},autoCloseOpenSlices(){this.samples.sort(function(x,y){return x.start-y.start;});this.updateBounds();this.kernel.autoCloseOpenSlices();for(const pid in this.processes){this.processes[pid].autoCloseOpenSlices();}},createSubSlices(){this.kernel.createSubSlices();for(const pid in this.processes){this.processes[pid].createSubSlices();}},preInitializeObjects(){for(const pid in this.processes){this.processes[pid].preInitializeObjects();}},initializeObjects(){for(const pid in this.processes){this.processes[pid].initializeObjects();}},pruneEmptyContainers(){this.kernel.pruneEmptyContainers();for(const pid in this.processes){this.processes[pid].pruneEmptyContainers();}},mergeKernelWithUserland(){for(const pid in this.processes){this.processes[pid].mergeKernelWithUserland();}},computeWorldBounds(shiftWorldToZero){this.updateBounds();this.updateCategories_();if(shiftWorldToZero){this.shiftWorldToZero();}},buildFlowEventIntervalTree(){for(let i=0;i<this.flowEvents.length;++i){const flowEvent=this.flowEvents[i];this.flowIntervalTree.insert(flowEvent);}
-this.flowIntervalTree.updateHighValues();},cleanupUndeletedObjects(){for(const pid in this.processes){this.processes[pid].autoDeleteObjects(this.bounds.max);}},sortMemoryDumps(){this.globalMemoryDumps.sort(function(x,y){return x.start-y.start;});for(const pid in this.processes){this.processes[pid].sortMemoryDumps();}},finalizeMemoryGraphs(){this.globalMemoryDumps.forEach(function(dump){dump.finalizeGraph();});},buildEventIndices(){this.modelIndices=new tr.model.ModelIndices(this);},sortAlerts(){this.alerts.sort(function(x,y){return x.start-y.start;});},applyObjectRefPatchups(){const unresolved=[];this.patchupsToApply_.forEach(function(patchup){if(patchup.pidRef in this.processes){const snapshot=this.processes[patchup.pidRef].objects.getSnapshotAt(patchup.scopedId,patchup.ts);if(snapshot){patchup.object[patchup.field]=snapshot;snapshot.referencedAt(patchup.item,patchup.object,patchup.field);return;}}
-unresolved.push(patchup);},this);this.patchupsToApply_=unresolved;},replacePIDRefsInPatchups(oldPidRef,newPidRef){this.patchupsToApply_.forEach(function(patchup){if(patchup.pidRef===oldPidRef){patchup.pidRef=newPidRef;}});},joinRefs(){this.joinObjectRefs_();this.applyObjectRefPatchups();},joinObjectRefs_(){for(const[pid,process]of Object.entries(this.processes)){this.joinObjectRefsForProcess_(pid,process);}},joinObjectRefsForProcess_(pid,process){for(const thread of Object.values(process.threads)){thread.asyncSliceGroup.slices.forEach(function(item){this.searchItemForIDRefs_(pid,'start',item);},this);thread.sliceGroup.slices.forEach(function(item){this.searchItemForIDRefs_(pid,'start',item);},this);}
-process.objects.iterObjectInstances(function(instance){instance.snapshots.forEach(function(item){this.searchItemForIDRefs_(pid,'ts',item);},this);},this);},searchItemForIDRefs_(pid,itemTimestampField,item){if(!item.args&&!item.contexts)return;const patchupsToApply=this.patchupsToApply_;function handleField(object,fieldName,fieldValue){if(!fieldValue||(!fieldValue.id_ref&&!fieldValue.idRef)){return;}
-const scope=fieldValue.scope||tr.model.OBJECT_DEFAULT_SCOPE;const idRef=fieldValue.id_ref||fieldValue.idRef;const scopedId=new tr.model.ScopedId(scope,idRef);const pidRef=fieldValue.pid_ref||fieldValue.pidRef||pid;const ts=item[itemTimestampField];patchupsToApply.push({item,object,field:fieldName,pidRef,scopedId,ts});}
-function iterObjectFieldsRecursively(object){if(!(object instanceof Object))return;if((object instanceof tr.model.ObjectSnapshot)||(object instanceof Float32Array)||(object instanceof tr.b.math.Quad)){return;}
-if(object instanceof Array){for(let i=0;i<object.length;i++){handleField(object,i,object[i]);iterObjectFieldsRecursively(object[i]);}
-return;}
-for(const key in object){const value=object[key];handleField(object,key,value);iterObjectFieldsRecursively(value);}}
-iterObjectFieldsRecursively(item.args);iterObjectFieldsRecursively(item.contexts);}};return{Model,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const kThreadGuid='3D6FA8D1-FE05-11D0-9DDA-00C04FD7BA7C';const kThreadDCStartOpcode=3;function Decoder(){this.payload_=new DataView(new ArrayBuffer(256));}
-Decoder.prototype={__proto__:Object.prototype,reset(base64Payload){const decodedSize=tr.b.Base64.getDecodedBufferLength(base64Payload);if(decodedSize>this.payload_.byteLength){this.payload_=new DataView(new ArrayBuffer(decodedSize));}
-tr.b.Base64.DecodeToTypedArray(base64Payload,this.payload_);this.position_=0;},skip(length){this.position_+=length;},decodeUInt8(){const result=this.payload_.getUint8(this.position_,true);this.position_+=1;return result;},decodeUInt16(){const result=this.payload_.getUint16(this.position_,true);this.position_+=2;return result;},decodeUInt32(){const result=this.payload_.getUint32(this.position_,true);this.position_+=4;return result;},decodeUInt64ToString(){const low=this.decodeUInt32();const high=this.decodeUInt32();const lowStr=('0000000'+low.toString(16)).substr(-8);const highStr=('0000000'+high.toString(16)).substr(-8);const result=highStr+lowStr;return result;},decodeInt8(){const result=this.payload_.getInt8(this.position_,true);this.position_+=1;return result;},decodeInt16(){const result=this.payload_.getInt16(this.position_,true);this.position_+=2;return result;},decodeInt32(){const result=this.payload_.getInt32(this.position_,true);this.position_+=4;return result;},decodeInt64ToString(){return this.decodeUInt64ToString();},decodeUInteger(is64){if(is64){return this.decodeUInt64ToString();}
-return this.decodeUInt32();},decodeString(){let str='';while(true){const c=this.decodeUInt8();if(!c)return str;str=str+String.fromCharCode(c);}},decodeW16String(){let str='';while(true){const c=this.decodeUInt16();if(!c)return str;str=str+String.fromCharCode(c);}},decodeFixedW16String(length){const oldPosition=this.position_;let str='';for(let i=0;i<length;i++){const c=this.decodeUInt16();if(!c)break;str=str+String.fromCharCode(c);}
-this.position_=oldPosition+2*length;return str;},decodeBytes(length){const bytes=[];for(let i=0;i<length;++i){const c=this.decodeUInt8();bytes.push(c);}
-return bytes;},decodeSID(is64){const pSid=this.decodeUInteger(is64);const attributes=this.decodeUInt32();if(is64){this.decodeUInt32();}
-const revision=this.decodeUInt8();const subAuthorityCount=this.decodeUInt8();this.decodeUInt16();this.decodeUInt32();if(revision!==1){throw new Error('Invalid SID revision: could not decode the SID structure.');}
-const sid=this.decodeBytes(4*subAuthorityCount);return{pSid,attributes,sid};},decodeSystemTime(){const wYear=this.decodeInt16();const wMonth=this.decodeInt16();const wDayOfWeek=this.decodeInt16();const wDay=this.decodeInt16();const wHour=this.decodeInt16();const wMinute=this.decodeInt16();const wSecond=this.decodeInt16();const wMilliseconds=this.decodeInt16();return{wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds};},decodeTimeZoneInformation(){const bias=this.decodeUInt32();const standardName=this.decodeFixedW16String(32);const standardDate=this.decodeSystemTime();const standardBias=this.decodeUInt32();const daylightName=this.decodeFixedW16String(32);const daylightDate=this.decodeSystemTime();const daylightBias=this.decodeUInt32();return{bias,standardName,standardDate,standardBias,daylightName,daylightDate,daylightBias};}};function EtwImporter(model,events){this.importPriority=3;this.model_=model;this.events_=events;this.handlers_={};this.decoder_=new Decoder();this.walltime_=undefined;this.ticks_=undefined;this.is64bit_=undefined;this.tidsToPid_={};const allTypeInfos=tr.e.importer.etw.Parser.getAllRegisteredTypeInfos();this.parsers_=allTypeInfos.map(function(typeInfo){return new typeInfo.constructor(this);},this);}
-EtwImporter.canImport=function(events){if(!events.hasOwnProperty('name')||!events.hasOwnProperty('content')||events.name!=='ETW'){return false;}
-return true;};EtwImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'EtwImporter';},get model(){return this.model_;},createThreadIfNeeded(pid,tid){this.tidsToPid_[tid]=pid;},removeThreadIfPresent(tid){this.tidsToPid_[tid]=undefined;},getPidFromWindowsTid(tid){if(tid===0)return 0;const pid=this.tidsToPid_[tid];if(pid===undefined){return 0;}
-return pid;},getThreadFromWindowsTid(tid){const pid=this.getPidFromWindowsTid(tid);const process=this.model_.getProcess(pid);if(!process)return undefined;return process.getThread(tid);},getOrCreateCpu(cpuNumber){const cpu=this.model_.kernel.getOrCreateCpu(cpuNumber);return cpu;},importEvents(){this.events_.content.forEach(this.parseInfo.bind(this));if(this.walltime_===undefined||this.ticks_===undefined){throw Error('Cannot find clock sync information in the system trace.');}
-if(this.is64bit_===undefined){throw Error('Cannot determine pointer size of the system trace.'+'Consider deselecting "System tracing" or disabling the "Paging '+'Executive" feature of Windows');}
-this.events_.content.forEach(this.parseEvent.bind(this));},importTimestamp(timestamp){const ts=parseInt(timestamp,16);return(ts-this.walltime_+this.ticks_)/1000.;},parseInfo(event){if(event.hasOwnProperty('guid')&&event.hasOwnProperty('walltime')&&event.hasOwnProperty('tick')&&event.guid==='ClockSync'){this.walltime_=parseInt(event.walltime,16);this.ticks_=parseInt(event.tick,16);}
-if(this.is64bit_===undefined&&event.hasOwnProperty('guid')&&event.hasOwnProperty('op')&&event.hasOwnProperty('ver')&&event.hasOwnProperty('payload')&&event.guid===kThreadGuid&&event.op===kThreadDCStartOpcode){const decodedSize=tr.b.Base64.getDecodedBufferLength(event.payload);if(event.ver===1){if(decodedSize>=52){this.is64bit_=true;}else{this.is64bit_=false;}}else if(event.ver===2){if(decodedSize>=64){this.is64bit_=true;}else{this.is64bit_=false;}}else if(event.ver===3){if(decodedSize>=60){this.is64bit_=true;}else{this.is64bit_=false;}}}
-return true;},parseEvent(event){if(!event.hasOwnProperty('guid')||!event.hasOwnProperty('op')||!event.hasOwnProperty('ver')||!event.hasOwnProperty('cpu')||!event.hasOwnProperty('ts')||!event.hasOwnProperty('payload')){return false;}
-const timestamp=this.importTimestamp(event.ts);const header={guid:event.guid,opcode:event.op,version:event.ver,cpu:event.cpu,timestamp,is64:this.is64bit_};const decoder=this.decoder_;decoder.reset(event.payload);const handler=this.getEventHandler(header.guid,header.opcode);if(!handler)return false;if(!handler(header,decoder)){this.model_.importWarning({type:'parse_error',message:'Malformed '+header.guid+' event ('+event.payload+')'});return false;}
-return true;},registerEventHandler(guid,opcode,handler){if(this.handlers_[guid]===undefined){this.handlers_[guid]=[];}
-this.handlers_[guid][opcode]=handler;},getEventHandler(guid,opcode){if(this.handlers_[guid]===undefined){return undefined;}
-return this.handlers_[guid][opcode];}};tr.importer.Importer.register(EtwImporter);return{EtwImporter,};});'use strict';tr.exportTo('tr.b',function(){class TraceStream{static get HEADER_SIZE(){return Math.pow(2,10);}
-static get CHUNK_SIZE(){return Math.pow(2,20);}
-get isBinary(){throw new Error('Not implemented');}
-get hasData(){throw new Error('Not implemented');}
-get header(){throw new Error('Not implemented');}
-readUntilDelimiter(delim){throw new Error('Not implemented');}
-readNumBytes(opt_size){throw new Error('Not implemented');}
-rewind(){throw new Error('Not implemented');}
-substream(offset,opt_length,opt_headerSize){throw new Error('Not implemented');}}
-return{TraceStream,};});'use strict';tr.exportTo('tr.e.importer.fuchsia',function(){const IMPORT_PRIORITY=0;const IDLE_THREAD_THRESHOLD=6444000000;const ZX_THREAD_STATE_NEW=0;const ZX_THREAD_STATE_RUNNING=1;const ZX_THREAD_STATE_SUSPENDED=2;const ZX_THREAD_STATE_BLOCKED=3;const ZX_THREAD_STATE_DYING=4;const ZX_THREAD_STATE_DEAD=5;class FuchsiaImporter extends tr.importer.Importer{constructor(model,eventData){super(model,eventData);this.importPriority=IMPORT_PRIORITY;this.model_=model;this.events_=eventData.events;this.parsers_=[];this.threadInfo_=new Map();this.processNames_=new Map();this.threadStates_=new Map();}
-static canImport(eventData){if(eventData instanceof tr.b.TraceStream){if(eventData.isBinary)return false;eventData=eventData.header;}
-if(eventData instanceof Object&&eventData.type==='fuchsia'){return true;}
-return false;}
-get importerName(){return'FuchsiaImporter';}
-get model(){return this.model_;}
-importClockSyncMarkers(){}
-finalizeImport(){}
-isIdleThread(prio,tid){if(prio===undefined){return tid>IDLE_THREAD_THRESHOLD;}
-return prio===0;}
-recordThreadState_(tid,timestamp,state,prio){if(this.isIdleThread(prio,tid)){return;}
-const states=this.threadStates_.has(tid)?this.threadStates_.get(tid):[];states.push({'ts':timestamp,state});this.threadStates_.set(tid,states);}
-processContextSwitchEvent_(event){let tid=event.in.tid;let threadName=tid.toString();let procName='';const prio=event.in.prio;if(this.threadInfo_.has(tid)){const threadInfo=this.threadInfo_.get(tid);threadName=threadInfo.name;const pid=threadInfo.pid;if(this.processNames_.has(pid)){procName=this.processNames_.get(pid)+':';}}
-const name=procName+threadName;if(this.isIdleThread(prio,tid)){tid=undefined;}
-const cpu=this.model_.kernel.getOrCreateCpu(event.cpu);const timestamp=tr.b.Unit.timestampFromUs(event.ts);cpu.switchActiveThread(timestamp,{},tid,name,tid);const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;this.recordThreadState_(tid,timestamp,SCHEDULING_STATE.RUNNING,prio);let outState=SCHEDULING_STATE.UNKNOWN;switch(event.out.state){case ZX_THREAD_STATE_NEW:outState=SCHEDULING_STATE.RUNNABLE;break;case ZX_THREAD_STATE_RUNNING:outState=SCHEDULING_STATE.RUNNABLE;break;case ZX_THREAD_STATE_BLOCKED:outState=SCHEDULING_STATE.SLEEPING;break;case ZX_THREAD_STATE_SUSPENDED:outState=SCHEDULING_STATE.STOPPED;break;case ZX_THREAD_STATE_DEAD:outState=SCHEDULING_STATE.TASK_DEAD;break;}
-this.recordThreadState_(event.out.tid,timestamp,outState,event.out.prio);}
-processProcessInfoEvent_(event){const process=this.model_.getOrCreateProcess(event.pid);process.name=event.name;this.processNames_.set(event.pid,event.name);if('sort_index'in event){process.sortIndex=event.sort_index;}}
-processThreadInfoEvent_(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);thread.name=event.name;this.threadInfo_.set(event.tid,{'name':event.name,'pid':event.pid});if('sort_index'in event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);thread.sortIndex=event.sort_index;}}
-processEvent_(event){switch(event.ph){case'k':this.processContextSwitchEvent_(event);break;case'p':this.processProcessInfoEvent_(event);break;case't':this.processThreadInfoEvent_(event);break;}}
-postProcessStates_(){for(const[tid,states]of this.threadStates_){if(!this.threadInfo_.has(tid)){continue;}
-const pid=this.threadInfo_.get(tid).pid;const thread=this.model_.getOrCreateProcess(pid).getOrCreateThread(tid);const slices=[];for(let i=0;i<states.length-1;i++){slices.push(new tr.model.ThreadTimeSlice(thread,states[i].state,'',states[i].ts,{},states[i+1].ts-states[i].ts));}
-thread.timeSlices=slices;}}
-importEvents(){for(const event of this.events_){this.processEvent_(event);}
-this.postProcessStates_();}}
-tr.importer.Importer.register(FuchsiaImporter);return{FuchsiaImporter,IMPORT_PRIORITY,};});'use strict';tr.exportTo('tr.b',function(){const MAX_FUNCTION_ARGS_COUNT=Math.pow(2,15)-1;class InMemoryTraceStream extends tr.b.TraceStream{constructor(buffer,isBinary,opt_headerSize){super();if(!buffer instanceof Uint8Array){throw new Error('buffer should be a Uint8Array');}
-const headerSize=opt_headerSize||tr.b.TraceStream.HEADER_SIZE;this.data_=buffer;this.isBinary_=isBinary;this.header_=InMemoryTraceStream.uint8ArrayToString_(this.data_.subarray(0,headerSize));this.cursor_=0;}
-get isBinary(){return this.isBinary_;}
-get hasData(){return this.cursor_<this.data_.length;}
-get header(){return this.header_;}
-get data(){return this.data_;}
-toString(){this.rewind();return this.readNumBytes(Number.MAX_VALUE);}
-readUntilDelimiter(delim){if(delim.length!==1){throw new Error('delim must be exactly one character');}
-const offset=this.data_.indexOf(delim.charCodeAt(0),this.cursor_)+1;return this.readToOffset_(offset>0?Math.min(offset,this.data_.length):this.data_.length);}
-readNumBytes(opt_size){if(opt_size!==undefined&&opt_size<=0){throw new Error(`readNumBytes expects a positive size (${opt_size} given)`);}
-const size=opt_size||tr.b.TraceStream.CHUNK_SIZE;const offset=Math.min(this.cursor_+size,this.data_.length);return this.readToOffset_(offset);}
-rewind(){this.cursor_=0;}
-substream(startOffset,opt_endOffset,opt_headerSize){return new InMemoryTraceStream(this.data_.subarray(startOffset,opt_endOffset),this.isBinary_,opt_headerSize);}
-readToOffset_(offset){const out=InMemoryTraceStream.uint8ArrayToString_(this.data_.subarray(this.cursor_,offset));this.cursor_=offset;return out;}
-static uint8ArrayToString_(arr){if(typeof TextDecoder!=='undefined'){const decoder=new TextDecoder('utf-8');return decoder.decode(arr);}
-const c=[];for(let i=0;i<arr.length;i+=MAX_FUNCTION_ARGS_COUNT){c.push(String.fromCharCode(...arr.subarray(i,i+MAX_FUNCTION_ARGS_COUNT)));}
-return c.join('');}}
-return{InMemoryTraceStream,};});!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).pako=t()}}(function(){return function t(e,a,i){function n(s,o){if(!a[s]){if(!e[s]){var l="function"==typeof require&&require;if(!o&&l)return l(s,!0);if(r)return r(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var d=a[s]={exports:{}};e[s][0].call(d.exports,function(t){var a=e[s][1][t];return n(a||t)},d,d.exports,t,e,a,i)}return a[s].exports}for(var r="function"==typeof require&&require,s=0;s<i.length;s++)n(i[s]);return n}({1:[function(t,e,a){"use strict";function i(t){if(!(this instanceof i))return new i(t);this.options=s.assign({level:_,method:c,chunkSize:16384,windowBits:15,memLevel:8,strategy:u,to:""},t||{});var e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new h,this.strm.avail_out=0;var a=r.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==f)throw new Error(l[a]);if(e.header&&r.deflateSetHeader(this.strm,e.header),e.dictionary){var n;if(n="string"==typeof e.dictionary?o.string2buf(e.dictionary):"[object ArrayBuffer]"===d.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,(a=r.deflateSetDictionary(this.strm,n))!==f)throw new Error(l[a]);this._dict_set=!0}}function n(t,e){var a=new i(e);if(a.push(t,!0),a.err)throw a.msg||l[a.err];return a.result}var r=t("./zlib/deflate"),s=t("./utils/common"),o=t("./utils/strings"),l=t("./zlib/messages"),h=t("./zlib/zstream"),d=Object.prototype.toString,f=0,_=-1,u=0,c=8;i.prototype.push=function(t,e){var a,i,n=this.strm,l=this.options.chunkSize;if(this.ended)return!1;i=e===~~e?e:!0===e?4:0,"string"==typeof t?n.input=o.string2buf(t):"[object ArrayBuffer]"===d.call(t)?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;do{if(0===n.avail_out&&(n.output=new s.Buf8(l),n.next_out=0,n.avail_out=l),1!==(a=r.deflate(n,i))&&a!==f)return this.onEnd(a),this.ended=!0,!1;0!==n.avail_out&&(0!==n.avail_in||4!==i&&2!==i)||("string"===this.options.to?this.onData(o.buf2binstring(s.shrinkBuf(n.output,n.next_out))):this.onData(s.shrinkBuf(n.output,n.next_out)))}while((n.avail_in>0||0===n.avail_out)&&1!==a);return 4===i?(a=r.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===f):2!==i||(this.onEnd(f),n.avail_out=0,!0)},i.prototype.onData=function(t){this.chunks.push(t)},i.prototype.onEnd=function(t){t===f&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=s.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},a.Deflate=i,a.deflate=n,a.deflateRaw=function(t,e){return e=e||{},e.raw=!0,n(t,e)},a.gzip=function(t,e){return e=e||{},e.gzip=!0,n(t,e)}},{"./utils/common":3,"./utils/strings":4,"./zlib/deflate":8,"./zlib/messages":13,"./zlib/zstream":15}],2:[function(t,e,a){"use strict";function i(t){if(!(this instanceof i))return new i(t);this.options=s.assign({chunkSize:16384,windowBits:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new d,this.strm.avail_out=0;var a=r.inflateInit2(this.strm,e.windowBits);if(a!==l.Z_OK)throw new Error(h[a]);this.header=new f,r.inflateGetHeader(this.strm,this.header)}function n(t,e){var a=new i(e);if(a.push(t,!0),a.err)throw a.msg||h[a.err];return a.result}var r=t("./zlib/inflate"),s=t("./utils/common"),o=t("./utils/strings"),l=t("./zlib/constants"),h=t("./zlib/messages"),d=t("./zlib/zstream"),f=t("./zlib/gzheader"),_=Object.prototype.toString;i.prototype.push=function(t,e){var a,i,n,h,d,f,u=this.strm,c=this.options.chunkSize,b=this.options.dictionary,g=!1;if(this.ended)return!1;i=e===~~e?e:!0===e?l.Z_FINISH:l.Z_NO_FLUSH,"string"==typeof t?u.input=o.binstring2buf(t):"[object ArrayBuffer]"===_.call(t)?u.input=new Uint8Array(t):u.input=t,u.next_in=0,u.avail_in=u.input.length;do{if(0===u.avail_out&&(u.output=new s.Buf8(c),u.next_out=0,u.avail_out=c),(a=r.inflate(u,l.Z_NO_FLUSH))===l.Z_NEED_DICT&&b&&(f="string"==typeof b?o.string2buf(b):"[object ArrayBuffer]"===_.call(b)?new Uint8Array(b):b,a=r.inflateSetDictionary(this.strm,f)),a===l.Z_BUF_ERROR&&!0===g&&(a=l.Z_OK,g=!1),a!==l.Z_STREAM_END&&a!==l.Z_OK)return this.onEnd(a),this.ended=!0,!1;u.next_out&&(0!==u.avail_out&&a!==l.Z_STREAM_END&&(0!==u.avail_in||i!==l.Z_FINISH&&i!==l.Z_SYNC_FLUSH)||("string"===this.options.to?(n=o.utf8border(u.output,u.next_out),h=u.next_out-n,d=o.buf2string(u.output,n),u.next_out=h,u.avail_out=c-h,h&&s.arraySet(u.output,u.output,n,h,0),this.onData(d)):this.onData(s.shrinkBuf(u.output,u.next_out)))),0===u.avail_in&&0===u.avail_out&&(g=!0)}while((u.avail_in>0||0===u.avail_out)&&a!==l.Z_STREAM_END);return a===l.Z_STREAM_END&&(i=l.Z_FINISH),i===l.Z_FINISH?(a=r.inflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===l.Z_OK):i!==l.Z_SYNC_FLUSH||(this.onEnd(l.Z_OK),u.avail_out=0,!0)},i.prototype.onData=function(t){this.chunks.push(t)},i.prototype.onEnd=function(t){t===l.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=s.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},a.Inflate=i,a.inflate=n,a.inflateRaw=function(t,e){return e=e||{},e.raw=!0,n(t,e)},a.ungzip=n},{"./utils/common":3,"./utils/strings":4,"./zlib/constants":6,"./zlib/gzheader":9,"./zlib/inflate":11,"./zlib/messages":13,"./zlib/zstream":15}],3:[function(t,e,a){"use strict";function i(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;a.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(var n in a)i(a,n)&&(t[n]=a[n])}}return t},a.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var r={arraySet:function(t,e,a,i,n){if(e.subarray&&t.subarray)t.set(e.subarray(a,a+i),n);else for(var r=0;r<i;r++)t[n+r]=e[a+r]},flattenChunks:function(t){var e,a,i,n,r,s;for(i=0,e=0,a=t.length;e<a;e++)i+=t[e].length;for(s=new Uint8Array(i),n=0,e=0,a=t.length;e<a;e++)r=t[e],s.set(r,n),n+=r.length;return s}},s={arraySet:function(t,e,a,i,n){for(var r=0;r<i;r++)t[n+r]=e[a+r]},flattenChunks:function(t){return[].concat.apply([],t)}};a.setTyped=function(t){t?(a.Buf8=Uint8Array,a.Buf16=Uint16Array,a.Buf32=Int32Array,a.assign(a,r)):(a.Buf8=Array,a.Buf16=Array,a.Buf32=Array,a.assign(a,s))},a.setTyped(n)},{}],4:[function(t,e,a){"use strict";function i(t,e){if(e<65537&&(t.subarray&&s||!t.subarray&&r))return String.fromCharCode.apply(null,n.shrinkBuf(t,e));for(var a="",i=0;i<e;i++)a+=String.fromCharCode(t[i]);return a}var n=t("./common"),r=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(t){r=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){s=!1}for(var o=new n.Buf8(256),l=0;l<256;l++)o[l]=l>=252?6:l>=248?5:l>=240?4:l>=224?3:l>=192?2:1;o[254]=o[254]=1,a.string2buf=function(t){var e,a,i,r,s,o=t.length,l=0;for(r=0;r<o;r++)55296==(64512&(a=t.charCodeAt(r)))&&r+1<o&&56320==(64512&(i=t.charCodeAt(r+1)))&&(a=65536+(a-55296<<10)+(i-56320),r++),l+=a<128?1:a<2048?2:a<65536?3:4;for(e=new n.Buf8(l),s=0,r=0;s<l;r++)55296==(64512&(a=t.charCodeAt(r)))&&r+1<o&&56320==(64512&(i=t.charCodeAt(r+1)))&&(a=65536+(a-55296<<10)+(i-56320),r++),a<128?e[s++]=a:a<2048?(e[s++]=192|a>>>6,e[s++]=128|63&a):a<65536?(e[s++]=224|a>>>12,e[s++]=128|a>>>6&63,e[s++]=128|63&a):(e[s++]=240|a>>>18,e[s++]=128|a>>>12&63,e[s++]=128|a>>>6&63,e[s++]=128|63&a);return e},a.buf2binstring=function(t){return i(t,t.length)},a.binstring2buf=function(t){for(var e=new n.Buf8(t.length),a=0,i=e.length;a<i;a++)e[a]=t.charCodeAt(a);return e},a.buf2string=function(t,e){var a,n,r,s,l=e||t.length,h=new Array(2*l);for(n=0,a=0;a<l;)if((r=t[a++])<128)h[n++]=r;else if((s=o[r])>4)h[n++]=65533,a+=s-1;else{for(r&=2===s?31:3===s?15:7;s>1&&a<l;)r=r<<6|63&t[a++],s--;s>1?h[n++]=65533:r<65536?h[n++]=r:(r-=65536,h[n++]=55296|r>>10&1023,h[n++]=56320|1023&r)}return i(h,n)},a.utf8border=function(t,e){var a;for((e=e||t.length)>t.length&&(e=t.length),a=e-1;a>=0&&128==(192&t[a]);)a--;return a<0?e:0===a?e:a+o[t[a]]>e?a:e}},{"./common":3}],5:[function(t,e,a){"use strict";e.exports=function(t,e,a,i){for(var n=65535&t|0,r=t>>>16&65535|0,s=0;0!==a;){a-=s=a>2e3?2e3:a;do{r=r+(n=n+e[i++]|0)|0}while(--s);n%=65521,r%=65521}return n|r<<16|0}},{}],6:[function(t,e,a){"use strict";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],7:[function(t,e,a){"use strict";var i=function(){for(var t,e=[],a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e}();e.exports=function(t,e,a,n){var r=i,s=n+a;t^=-1;for(var o=n;o<s;o++)t=t>>>8^r[255&(t^e[o])];return-1^t}},{}],8:[function(t,e,a){"use strict";function i(t,e){return t.msg=A[e],e}function n(t){return(t<<1)-(t>4?9:0)}function r(t){for(var e=t.length;--e>=0;)t[e]=0}function s(t){var e=t.state,a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(z.arraySet(t.output,e.pending_buf,e.pending_out,a,t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))}function o(t,e){B._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,s(t.strm)}function l(t,e){t.pending_buf[t.pending++]=e}function h(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function d(t,e,a,i){var n=t.avail_in;return n>i&&(n=i),0===n?0:(t.avail_in-=n,z.arraySet(e,t.input,t.next_in,n,a),1===t.state.wrap?t.adler=S(t.adler,e,n,a):2===t.state.wrap&&(t.adler=E(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)}function f(t,e){var a,i,n=t.max_chain_length,r=t.strstart,s=t.prev_length,o=t.nice_match,l=t.strstart>t.w_size-it?t.strstart-(t.w_size-it):0,h=t.window,d=t.w_mask,f=t.prev,_=t.strstart+at,u=h[r+s-1],c=h[r+s];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,h[a+s]===c&&h[a+s-1]===u&&h[a]===h[r]&&h[++a]===h[r+1]){r+=2,a++;do{}while(h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&h[++r]===h[++a]&&r<_);if(i=at-(_-r),r=_-at,i>s){if(t.match_start=e,s=i,i>=o)break;u=h[r+s-1],c=h[r+s]}}}while((e=f[e&d])>l&&0!=--n);return s<=t.lookahead?s:t.lookahead}function _(t){var e,a,i,n,r,s=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=s+(s-it)){z.arraySet(t.window,t.window,s,s,0),t.match_start-=s,t.strstart-=s,t.block_start-=s,e=a=t.hash_size;do{i=t.head[--e],t.head[e]=i>=s?i-s:0}while(--a);e=a=s;do{i=t.prev[--e],t.prev[e]=i>=s?i-s:0}while(--a);n+=s}if(0===t.strm.avail_in)break;if(a=d(t.strm,t.window,t.strstart+t.lookahead,n),t.lookahead+=a,t.lookahead+t.insert>=et)for(r=t.strstart-t.insert,t.ins_h=t.window[r],t.ins_h=(t.ins_h<<t.hash_shift^t.window[r+1])&t.hash_mask;t.insert&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[r+et-1])&t.hash_mask,t.prev[r&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=r,r++,t.insert--,!(t.lookahead+t.insert<et)););}while(t.lookahead<it&&0!==t.strm.avail_in)}function u(t,e){for(var a,i;;){if(t.lookahead<it){if(_(t),t.lookahead<it&&e===Z)return _t;if(0===t.lookahead)break}if(a=0,t.lookahead>=et&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+et-1])&t.hash_mask,a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-it&&(t.match_length=f(t,a)),t.match_length>=et)if(i=B._tr_tally(t,t.strstart-t.match_start,t.match_length-et),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=et){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+et-1])&t.hash_mask,a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+1])&t.hash_mask;else i=B._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(o(t,!1),0===t.strm.avail_out))return _t}return t.insert=t.strstart<et-1?t.strstart:et-1,e===N?(o(t,!0),0===t.strm.avail_out?ct:bt):t.last_lit&&(o(t,!1),0===t.strm.avail_out)?_t:ut}function c(t,e){for(var a,i,n;;){if(t.lookahead<it){if(_(t),t.lookahead<it&&e===Z)return _t;if(0===t.lookahead)break}if(a=0,t.lookahead>=et&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+et-1])&t.hash_mask,a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=et-1,0!==a&&t.prev_length<t.max_lazy_match&&t.strstart-a<=t.w_size-it&&(t.match_length=f(t,a),t.match_length<=5&&(t.strategy===H||t.match_length===et&&t.strstart-t.match_start>4096)&&(t.match_length=et-1)),t.prev_length>=et&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-et,i=B._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-et),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+et-1])&t.hash_mask,a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=et-1,t.strstart++,i&&(o(t,!1),0===t.strm.avail_out))return _t}else if(t.match_available){if((i=B._tr_tally(t,0,t.window[t.strstart-1]))&&o(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return _t}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=B._tr_tally(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<et-1?t.strstart:et-1,e===N?(o(t,!0),0===t.strm.avail_out?ct:bt):t.last_lit&&(o(t,!1),0===t.strm.avail_out)?_t:ut}function b(t,e){for(var a,i,n,r,s=t.window;;){if(t.lookahead<=at){if(_(t),t.lookahead<=at&&e===Z)return _t;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=et&&t.strstart>0&&(n=t.strstart-1,(i=s[n])===s[++n]&&i===s[++n]&&i===s[++n])){r=t.strstart+at;do{}while(i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&i===s[++n]&&n<r);t.match_length=at-(r-n),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=et?(a=B._tr_tally(t,1,t.match_length-et),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=B._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(o(t,!1),0===t.strm.avail_out))return _t}return t.insert=0,e===N?(o(t,!0),0===t.strm.avail_out?ct:bt):t.last_lit&&(o(t,!1),0===t.strm.avail_out)?_t:ut}function g(t,e){for(var a;;){if(0===t.lookahead&&(_(t),0===t.lookahead)){if(e===Z)return _t;break}if(t.match_length=0,a=B._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(o(t,!1),0===t.strm.avail_out))return _t}return t.insert=0,e===N?(o(t,!0),0===t.strm.avail_out?ct:bt):t.last_lit&&(o(t,!1),0===t.strm.avail_out)?_t:ut}function m(t,e,a,i,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=i,this.func=n}function w(t){t.window_size=2*t.w_size,r(t.head),t.max_lazy_match=x[t.level].max_lazy,t.good_match=x[t.level].good_length,t.nice_match=x[t.level].nice_length,t.max_chain_length=x[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=et-1,t.match_available=0,t.ins_h=0}function p(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=q,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new z.Buf16(2*$),this.dyn_dtree=new z.Buf16(2*(2*Q+1)),this.bl_tree=new z.Buf16(2*(2*V+1)),r(this.dyn_ltree),r(this.dyn_dtree),r(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new z.Buf16(tt+1),this.heap=new z.Buf16(2*J+1),r(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new z.Buf16(2*J+1),r(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(t){var e;return t&&t.state?(t.total_in=t.total_out=0,t.data_type=Y,e=t.state,e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?rt:dt,t.adler=2===e.wrap?0:1,e.last_flush=Z,B._tr_init(e),D):i(t,U)}function k(t){var e=v(t);return e===D&&w(t.state),e}function y(t,e,a,n,r,s){if(!t)return U;var o=1;if(e===L&&(e=6),n<0?(o=0,n=-n):n>15&&(o=2,n-=16),r<1||r>G||a!==q||n<8||n>15||e<0||e>9||s<0||s>M)return i(t,U);8===n&&(n=9);var l=new p;return t.state=l,l.strm=t,l.wrap=o,l.gzhead=null,l.w_bits=n,l.w_size=1<<l.w_bits,l.w_mask=l.w_size-1,l.hash_bits=r+7,l.hash_size=1<<l.hash_bits,l.hash_mask=l.hash_size-1,l.hash_shift=~~((l.hash_bits+et-1)/et),l.window=new z.Buf8(2*l.w_size),l.head=new z.Buf16(l.hash_size),l.prev=new z.Buf16(l.w_size),l.lit_bufsize=1<<r+6,l.pending_buf_size=4*l.lit_bufsize,l.pending_buf=new z.Buf8(l.pending_buf_size),l.d_buf=1*l.lit_bufsize,l.l_buf=3*l.lit_bufsize,l.level=e,l.strategy=s,l.method=a,k(t)}var x,z=t("../utils/common"),B=t("./trees"),S=t("./adler32"),E=t("./crc32"),A=t("./messages"),Z=0,R=1,C=3,N=4,O=5,D=0,I=1,U=-2,T=-3,F=-5,L=-1,H=1,j=2,K=3,M=4,P=0,Y=2,q=8,G=9,X=15,W=8,J=286,Q=30,V=19,$=2*J+1,tt=15,et=3,at=258,it=at+et+1,nt=32,rt=42,st=69,ot=73,lt=91,ht=103,dt=113,ft=666,_t=1,ut=2,ct=3,bt=4,gt=3;x=[new m(0,0,0,0,function(t,e){var a=65535;for(a>t.pending_buf_size-5&&(a=t.pending_buf_size-5);;){if(t.lookahead<=1){if(_(t),0===t.lookahead&&e===Z)return _t;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+a;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,o(t,!1),0===t.strm.avail_out))return _t;if(t.strstart-t.block_start>=t.w_size-it&&(o(t,!1),0===t.strm.avail_out))return _t}return t.insert=0,e===N?(o(t,!0),0===t.strm.avail_out?ct:bt):(t.strstart>t.block_start&&(o(t,!1),t.strm.avail_out),_t)}),new m(4,4,8,4,u),new m(4,5,16,8,u),new m(4,6,32,32,u),new m(4,4,16,16,c),new m(8,16,32,32,c),new m(8,16,128,128,c),new m(8,32,128,256,c),new m(32,128,258,1024,c),new m(32,258,258,4096,c)],a.deflateInit=function(t,e){return y(t,e,q,X,W,P)},a.deflateInit2=y,a.deflateReset=k,a.deflateResetKeep=v,a.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?U:(t.state.gzhead=e,D):U},a.deflate=function(t,e){var a,o,d,f;if(!t||!t.state||e>O||e<0)return t?i(t,U):U;if(o=t.state,!t.output||!t.input&&0!==t.avail_in||o.status===ft&&e!==N)return i(t,0===t.avail_out?F:U);if(o.strm=t,a=o.last_flush,o.last_flush=e,o.status===rt)if(2===o.wrap)t.adler=0,l(o,31),l(o,139),l(o,8),o.gzhead?(l(o,(o.gzhead.text?1:0)+(o.gzhead.hcrc?2:0)+(o.gzhead.extra?4:0)+(o.gzhead.name?8:0)+(o.gzhead.comment?16:0)),l(o,255&o.gzhead.time),l(o,o.gzhead.time>>8&255),l(o,o.gzhead.time>>16&255),l(o,o.gzhead.time>>24&255),l(o,9===o.level?2:o.strategy>=j||o.level<2?4:0),l(o,255&o.gzhead.os),o.gzhead.extra&&o.gzhead.extra.length&&(l(o,255&o.gzhead.extra.length),l(o,o.gzhead.extra.length>>8&255)),o.gzhead.hcrc&&(t.adler=E(t.adler,o.pending_buf,o.pending,0)),o.gzindex=0,o.status=st):(l(o,0),l(o,0),l(o,0),l(o,0),l(o,0),l(o,9===o.level?2:o.strategy>=j||o.level<2?4:0),l(o,gt),o.status=dt);else{var _=q+(o.w_bits-8<<4)<<8;_|=(o.strategy>=j||o.level<2?0:o.level<6?1:6===o.level?2:3)<<6,0!==o.strstart&&(_|=nt),_+=31-_%31,o.status=dt,h(o,_),0!==o.strstart&&(h(o,t.adler>>>16),h(o,65535&t.adler)),t.adler=1}if(o.status===st)if(o.gzhead.extra){for(d=o.pending;o.gzindex<(65535&o.gzhead.extra.length)&&(o.pending!==o.pending_buf_size||(o.gzhead.hcrc&&o.pending>d&&(t.adler=E(t.adler,o.pending_buf,o.pending-d,d)),s(t),d=o.pending,o.pending!==o.pending_buf_size));)l(o,255&o.gzhead.extra[o.gzindex]),o.gzindex++;o.gzhead.hcrc&&o.pending>d&&(t.adler=E(t.adler,o.pending_buf,o.pending-d,d)),o.gzindex===o.gzhead.extra.length&&(o.gzindex=0,o.status=ot)}else o.status=ot;if(o.status===ot)if(o.gzhead.name){d=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>d&&(t.adler=E(t.adler,o.pending_buf,o.pending-d,d)),s(t),d=o.pending,o.pending===o.pending_buf_size)){f=1;break}f=o.gzindex<o.gzhead.name.length?255&o.gzhead.name.charCodeAt(o.gzindex++):0,l(o,f)}while(0!==f);o.gzhead.hcrc&&o.pending>d&&(t.adler=E(t.adler,o.pending_buf,o.pending-d,d)),0===f&&(o.gzindex=0,o.status=lt)}else o.status=lt;if(o.status===lt)if(o.gzhead.comment){d=o.pending;do{if(o.pending===o.pending_buf_size&&(o.gzhead.hcrc&&o.pending>d&&(t.adler=E(t.adler,o.pending_buf,o.pending-d,d)),s(t),d=o.pending,o.pending===o.pending_buf_size)){f=1;break}f=o.gzindex<o.gzhead.comment.length?255&o.gzhead.comment.charCodeAt(o.gzindex++):0,l(o,f)}while(0!==f);o.gzhead.hcrc&&o.pending>d&&(t.adler=E(t.adler,o.pending_buf,o.pending-d,d)),0===f&&(o.status=ht)}else o.status=ht;if(o.status===ht&&(o.gzhead.hcrc?(o.pending+2>o.pending_buf_size&&s(t),o.pending+2<=o.pending_buf_size&&(l(o,255&t.adler),l(o,t.adler>>8&255),t.adler=0,o.status=dt)):o.status=dt),0!==o.pending){if(s(t),0===t.avail_out)return o.last_flush=-1,D}else if(0===t.avail_in&&n(e)<=n(a)&&e!==N)return i(t,F);if(o.status===ft&&0!==t.avail_in)return i(t,F);if(0!==t.avail_in||0!==o.lookahead||e!==Z&&o.status!==ft){var u=o.strategy===j?g(o,e):o.strategy===K?b(o,e):x[o.level].func(o,e);if(u!==ct&&u!==bt||(o.status=ft),u===_t||u===ct)return 0===t.avail_out&&(o.last_flush=-1),D;if(u===ut&&(e===R?B._tr_align(o):e!==O&&(B._tr_stored_block(o,0,0,!1),e===C&&(r(o.head),0===o.lookahead&&(o.strstart=0,o.block_start=0,o.insert=0))),s(t),0===t.avail_out))return o.last_flush=-1,D}return e!==N?D:o.wrap<=0?I:(2===o.wrap?(l(o,255&t.adler),l(o,t.adler>>8&255),l(o,t.adler>>16&255),l(o,t.adler>>24&255),l(o,255&t.total_in),l(o,t.total_in>>8&255),l(o,t.total_in>>16&255),l(o,t.total_in>>24&255)):(h(o,t.adler>>>16),h(o,65535&t.adler)),s(t),o.wrap>0&&(o.wrap=-o.wrap),0!==o.pending?D:I)},a.deflateEnd=function(t){var e;return t&&t.state?(e=t.state.status)!==rt&&e!==st&&e!==ot&&e!==lt&&e!==ht&&e!==dt&&e!==ft?i(t,U):(t.state=null,e===dt?i(t,T):D):U},a.deflateSetDictionary=function(t,e){var a,i,n,s,o,l,h,d,f=e.length;if(!t||!t.state)return U;if(a=t.state,2===(s=a.wrap)||1===s&&a.status!==rt||a.lookahead)return U;for(1===s&&(t.adler=S(t.adler,e,f,0)),a.wrap=0,f>=a.w_size&&(0===s&&(r(a.head),a.strstart=0,a.block_start=0,a.insert=0),d=new z.Buf8(a.w_size),z.arraySet(d,e,f-a.w_size,a.w_size,0),e=d,f=a.w_size),o=t.avail_in,l=t.next_in,h=t.input,t.avail_in=f,t.next_in=0,t.input=e,_(a);a.lookahead>=et;){i=a.strstart,n=a.lookahead-(et-1);do{a.ins_h=(a.ins_h<<a.hash_shift^a.window[i+et-1])&a.hash_mask,a.prev[i&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=i,i++}while(--n);a.strstart=i,a.lookahead=et-1,_(a)}return a.strstart+=a.lookahead,a.block_start=a.strstart,a.insert=a.lookahead,a.lookahead=0,a.match_length=a.prev_length=et-1,a.match_available=0,t.next_in=l,t.input=h,t.avail_in=o,a.wrap=s,D},a.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":3,"./adler32":5,"./crc32":7,"./messages":13,"./trees":14}],9:[function(t,e,a){"use strict";e.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],10:[function(t,e,a){"use strict";e.exports=function(t,e){var a,i,n,r,s,o,l,h,d,f,_,u,c,b,g,m,w,p,v,k,y,x,z,B,S;a=t.state,i=t.next_in,B=t.input,n=i+(t.avail_in-5),r=t.next_out,S=t.output,s=r-(e-t.avail_out),o=r+(t.avail_out-257),l=a.dmax,h=a.wsize,d=a.whave,f=a.wnext,_=a.window,u=a.hold,c=a.bits,b=a.lencode,g=a.distcode,m=(1<<a.lenbits)-1,w=(1<<a.distbits)-1;t:do{c<15&&(u+=B[i++]<<c,c+=8,u+=B[i++]<<c,c+=8),p=b[u&m];e:for(;;){if(v=p>>>24,u>>>=v,c-=v,0===(v=p>>>16&255))S[r++]=65535&p;else{if(!(16&v)){if(0==(64&v)){p=b[(65535&p)+(u&(1<<v)-1)];continue e}if(32&v){a.mode=12;break t}t.msg="invalid literal/length code",a.mode=30;break t}k=65535&p,(v&=15)&&(c<v&&(u+=B[i++]<<c,c+=8),k+=u&(1<<v)-1,u>>>=v,c-=v),c<15&&(u+=B[i++]<<c,c+=8,u+=B[i++]<<c,c+=8),p=g[u&w];a:for(;;){if(v=p>>>24,u>>>=v,c-=v,!(16&(v=p>>>16&255))){if(0==(64&v)){p=g[(65535&p)+(u&(1<<v)-1)];continue a}t.msg="invalid distance code",a.mode=30;break t}if(y=65535&p,v&=15,c<v&&(u+=B[i++]<<c,(c+=8)<v&&(u+=B[i++]<<c,c+=8)),(y+=u&(1<<v)-1)>l){t.msg="invalid distance too far back",a.mode=30;break t}if(u>>>=v,c-=v,v=r-s,y>v){if((v=y-v)>d&&a.sane){t.msg="invalid distance too far back",a.mode=30;break t}if(x=0,z=_,0===f){if(x+=h-v,v<k){k-=v;do{S[r++]=_[x++]}while(--v);x=r-y,z=S}}else if(f<v){if(x+=h+f-v,(v-=f)<k){k-=v;do{S[r++]=_[x++]}while(--v);if(x=0,f<k){k-=v=f;do{S[r++]=_[x++]}while(--v);x=r-y,z=S}}}else if(x+=f-v,v<k){k-=v;do{S[r++]=_[x++]}while(--v);x=r-y,z=S}for(;k>2;)S[r++]=z[x++],S[r++]=z[x++],S[r++]=z[x++],k-=3;k&&(S[r++]=z[x++],k>1&&(S[r++]=z[x++]))}else{x=r-y;do{S[r++]=S[x++],S[r++]=S[x++],S[r++]=S[x++],k-=3}while(k>2);k&&(S[r++]=S[x++],k>1&&(S[r++]=S[x++]))}break}}break}}while(i<n&&r<o);i-=k=c>>3,u&=(1<<(c-=k<<3))-1,t.next_in=i,t.next_out=r,t.avail_in=i<n?n-i+5:5-(i-n),t.avail_out=r<o?o-r+257:257-(r-o),a.hold=u,a.bits=c}},{}],11:[function(t,e,a){"use strict";function i(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function n(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new u.Buf16(320),this.work=new u.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function r(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=N,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new u.Buf32(dt),e.distcode=e.distdyn=new u.Buf32(ft),e.sane=1,e.back=-1,z):E}function s(t){var e;return t&&t.state?(e=t.state,e.wsize=0,e.whave=0,e.wnext=0,r(t)):E}function o(t,e){var a,i;return t&&t.state?(i=t.state,e<0?(a=0,e=-e):(a=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?E:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,s(t))):E}function l(t,e){var a,i;return t?(i=new n,t.state=i,i.window=null,(a=o(t,e))!==z&&(t.state=null),a):E}function h(t){if(ut){var e;for(f=new u.Buf32(512),_=new u.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(m(p,t.lens,0,288,f,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;m(v,t.lens,0,32,_,0,t.work,{bits:5}),ut=!1}t.lencode=f,t.lenbits=9,t.distcode=_,t.distbits=5}function d(t,e,a,i){var n,r=t.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new u.Buf8(r.wsize)),i>=r.wsize?(u.arraySet(r.window,e,a-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):((n=r.wsize-r.wnext)>i&&(n=i),u.arraySet(r.window,e,a-i,n,r.wnext),(i-=n)?(u.arraySet(r.window,e,a-i,i,0),r.wnext=i,r.whave=r.wsize):(r.wnext+=n,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=n))),0}var f,_,u=t("../utils/common"),c=t("./adler32"),b=t("./crc32"),g=t("./inffast"),m=t("./inftrees"),w=0,p=1,v=2,k=4,y=5,x=6,z=0,B=1,S=2,E=-2,A=-3,Z=-4,R=-5,C=8,N=1,O=2,D=3,I=4,U=5,T=6,F=7,L=8,H=9,j=10,K=11,M=12,P=13,Y=14,q=15,G=16,X=17,W=18,J=19,Q=20,V=21,$=22,tt=23,et=24,at=25,it=26,nt=27,rt=28,st=29,ot=30,lt=31,ht=32,dt=852,ft=592,_t=15,ut=!0;a.inflateReset=s,a.inflateReset2=o,a.inflateResetKeep=r,a.inflateInit=function(t){return l(t,_t)},a.inflateInit2=l,a.inflate=function(t,e){var a,n,r,s,o,l,f,_,dt,ft,_t,ut,ct,bt,gt,mt,wt,pt,vt,kt,yt,xt,zt,Bt,St=0,Et=new u.Buf8(4),At=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return E;(a=t.state).mode===M&&(a.mode=P),o=t.next_out,r=t.output,f=t.avail_out,s=t.next_in,n=t.input,l=t.avail_in,_=a.hold,dt=a.bits,ft=l,_t=f,xt=z;t:for(;;)switch(a.mode){case N:if(0===a.wrap){a.mode=P;break}for(;dt<16;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(2&a.wrap&&35615===_){a.check=0,Et[0]=255&_,Et[1]=_>>>8&255,a.check=b(a.check,Et,2,0),_=0,dt=0,a.mode=O;break}if(a.flags=0,a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&_)<<8)+(_>>8))%31){t.msg="incorrect header check",a.mode=ot;break}if((15&_)!==C){t.msg="unknown compression method",a.mode=ot;break}if(_>>>=4,dt-=4,yt=8+(15&_),0===a.wbits)a.wbits=yt;else if(yt>a.wbits){t.msg="invalid window size",a.mode=ot;break}a.dmax=1<<yt,t.adler=a.check=1,a.mode=512&_?j:M,_=0,dt=0;break;case O:for(;dt<16;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(a.flags=_,(255&a.flags)!==C){t.msg="unknown compression method",a.mode=ot;break}if(57344&a.flags){t.msg="unknown header flags set",a.mode=ot;break}a.head&&(a.head.text=_>>8&1),512&a.flags&&(Et[0]=255&_,Et[1]=_>>>8&255,a.check=b(a.check,Et,2,0)),_=0,dt=0,a.mode=D;case D:for(;dt<32;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}a.head&&(a.head.time=_),512&a.flags&&(Et[0]=255&_,Et[1]=_>>>8&255,Et[2]=_>>>16&255,Et[3]=_>>>24&255,a.check=b(a.check,Et,4,0)),_=0,dt=0,a.mode=I;case I:for(;dt<16;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}a.head&&(a.head.xflags=255&_,a.head.os=_>>8),512&a.flags&&(Et[0]=255&_,Et[1]=_>>>8&255,a.check=b(a.check,Et,2,0)),_=0,dt=0,a.mode=U;case U:if(1024&a.flags){for(;dt<16;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}a.length=_,a.head&&(a.head.extra_len=_),512&a.flags&&(Et[0]=255&_,Et[1]=_>>>8&255,a.check=b(a.check,Et,2,0)),_=0,dt=0}else a.head&&(a.head.extra=null);a.mode=T;case T:if(1024&a.flags&&((ut=a.length)>l&&(ut=l),ut&&(a.head&&(yt=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Array(a.head.extra_len)),u.arraySet(a.head.extra,n,s,ut,yt)),512&a.flags&&(a.check=b(a.check,n,ut,s)),l-=ut,s+=ut,a.length-=ut),a.length))break t;a.length=0,a.mode=F;case F:if(2048&a.flags){if(0===l)break t;ut=0;do{yt=n[s+ut++],a.head&&yt&&a.length<65536&&(a.head.name+=String.fromCharCode(yt))}while(yt&&ut<l);if(512&a.flags&&(a.check=b(a.check,n,ut,s)),l-=ut,s+=ut,yt)break t}else a.head&&(a.head.name=null);a.length=0,a.mode=L;case L:if(4096&a.flags){if(0===l)break t;ut=0;do{yt=n[s+ut++],a.head&&yt&&a.length<65536&&(a.head.comment+=String.fromCharCode(yt))}while(yt&&ut<l);if(512&a.flags&&(a.check=b(a.check,n,ut,s)),l-=ut,s+=ut,yt)break t}else a.head&&(a.head.comment=null);a.mode=H;case H:if(512&a.flags){for(;dt<16;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(_!==(65535&a.check)){t.msg="header crc mismatch",a.mode=ot;break}_=0,dt=0}a.head&&(a.head.hcrc=a.flags>>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=M;break;case j:for(;dt<32;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}t.adler=a.check=i(_),_=0,dt=0,a.mode=K;case K:if(0===a.havedict)return t.next_out=o,t.avail_out=f,t.next_in=s,t.avail_in=l,a.hold=_,a.bits=dt,S;t.adler=a.check=1,a.mode=M;case M:if(e===y||e===x)break t;case P:if(a.last){_>>>=7&dt,dt-=7&dt,a.mode=nt;break}for(;dt<3;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}switch(a.last=1&_,_>>>=1,dt-=1,3&_){case 0:a.mode=Y;break;case 1:if(h(a),a.mode=Q,e===x){_>>>=2,dt-=2;break t}break;case 2:a.mode=X;break;case 3:t.msg="invalid block type",a.mode=ot}_>>>=2,dt-=2;break;case Y:for(_>>>=7&dt,dt-=7&dt;dt<32;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if((65535&_)!=(_>>>16^65535)){t.msg="invalid stored block lengths",a.mode=ot;break}if(a.length=65535&_,_=0,dt=0,a.mode=q,e===x)break t;case q:a.mode=G;case G:if(ut=a.length){if(ut>l&&(ut=l),ut>f&&(ut=f),0===ut)break t;u.arraySet(r,n,s,ut,o),l-=ut,s+=ut,f-=ut,o+=ut,a.length-=ut;break}a.mode=M;break;case X:for(;dt<14;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(a.nlen=257+(31&_),_>>>=5,dt-=5,a.ndist=1+(31&_),_>>>=5,dt-=5,a.ncode=4+(15&_),_>>>=4,dt-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=ot;break}a.have=0,a.mode=W;case W:for(;a.have<a.ncode;){for(;dt<3;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}a.lens[At[a.have++]]=7&_,_>>>=3,dt-=3}for(;a.have<19;)a.lens[At[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,zt={bits:a.lenbits},xt=m(w,a.lens,0,19,a.lencode,0,a.work,zt),a.lenbits=zt.bits,xt){t.msg="invalid code lengths set",a.mode=ot;break}a.have=0,a.mode=J;case J:for(;a.have<a.nlen+a.ndist;){for(;St=a.lencode[_&(1<<a.lenbits)-1],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(gt<=dt);){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(wt<16)_>>>=gt,dt-=gt,a.lens[a.have++]=wt;else{if(16===wt){for(Bt=gt+2;dt<Bt;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(_>>>=gt,dt-=gt,0===a.have){t.msg="invalid bit length repeat",a.mode=ot;break}yt=a.lens[a.have-1],ut=3+(3&_),_>>>=2,dt-=2}else if(17===wt){for(Bt=gt+3;dt<Bt;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}dt-=gt,yt=0,ut=3+(7&(_>>>=gt)),_>>>=3,dt-=3}else{for(Bt=gt+7;dt<Bt;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}dt-=gt,yt=0,ut=11+(127&(_>>>=gt)),_>>>=7,dt-=7}if(a.have+ut>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=ot;break}for(;ut--;)a.lens[a.have++]=yt}}if(a.mode===ot)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=ot;break}if(a.lenbits=9,zt={bits:a.lenbits},xt=m(p,a.lens,0,a.nlen,a.lencode,0,a.work,zt),a.lenbits=zt.bits,xt){t.msg="invalid literal/lengths set",a.mode=ot;break}if(a.distbits=6,a.distcode=a.distdyn,zt={bits:a.distbits},xt=m(v,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,zt),a.distbits=zt.bits,xt){t.msg="invalid distances set",a.mode=ot;break}if(a.mode=Q,e===x)break t;case Q:a.mode=V;case V:if(l>=6&&f>=258){t.next_out=o,t.avail_out=f,t.next_in=s,t.avail_in=l,a.hold=_,a.bits=dt,g(t,_t),o=t.next_out,r=t.output,f=t.avail_out,s=t.next_in,n=t.input,l=t.avail_in,_=a.hold,dt=a.bits,a.mode===M&&(a.back=-1);break}for(a.back=0;St=a.lencode[_&(1<<a.lenbits)-1],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(gt<=dt);){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(mt&&0==(240&mt)){for(pt=gt,vt=mt,kt=wt;St=a.lencode[kt+((_&(1<<pt+vt)-1)>>pt)],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(pt+gt<=dt);){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}_>>>=pt,dt-=pt,a.back+=pt}if(_>>>=gt,dt-=gt,a.back+=gt,a.length=wt,0===mt){a.mode=it;break}if(32&mt){a.back=-1,a.mode=M;break}if(64&mt){t.msg="invalid literal/length code",a.mode=ot;break}a.extra=15&mt,a.mode=$;case $:if(a.extra){for(Bt=a.extra;dt<Bt;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}a.length+=_&(1<<a.extra)-1,_>>>=a.extra,dt-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=tt;case tt:for(;St=a.distcode[_&(1<<a.distbits)-1],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(gt<=dt);){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(0==(240&mt)){for(pt=gt,vt=mt,kt=wt;St=a.distcode[kt+((_&(1<<pt+vt)-1)>>pt)],gt=St>>>24,mt=St>>>16&255,wt=65535&St,!(pt+gt<=dt);){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}_>>>=pt,dt-=pt,a.back+=pt}if(_>>>=gt,dt-=gt,a.back+=gt,64&mt){t.msg="invalid distance code",a.mode=ot;break}a.offset=wt,a.extra=15&mt,a.mode=et;case et:if(a.extra){for(Bt=a.extra;dt<Bt;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}a.offset+=_&(1<<a.extra)-1,_>>>=a.extra,dt-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=ot;break}a.mode=at;case at:if(0===f)break t;if(ut=_t-f,a.offset>ut){if((ut=a.offset-ut)>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=ot;break}ut>a.wnext?(ut-=a.wnext,ct=a.wsize-ut):ct=a.wnext-ut,ut>a.length&&(ut=a.length),bt=a.window}else bt=r,ct=o-a.offset,ut=a.length;ut>f&&(ut=f),f-=ut,a.length-=ut;do{r[o++]=bt[ct++]}while(--ut);0===a.length&&(a.mode=V);break;case it:if(0===f)break t;r[o++]=a.length,f--,a.mode=V;break;case nt:if(a.wrap){for(;dt<32;){if(0===l)break t;l--,_|=n[s++]<<dt,dt+=8}if(_t-=f,t.total_out+=_t,a.total+=_t,_t&&(t.adler=a.check=a.flags?b(a.check,r,_t,o-_t):c(a.check,r,_t,o-_t)),_t=f,(a.flags?_:i(_))!==a.check){t.msg="incorrect data check",a.mode=ot;break}_=0,dt=0}a.mode=rt;case rt:if(a.wrap&&a.flags){for(;dt<32;){if(0===l)break t;l--,_+=n[s++]<<dt,dt+=8}if(_!==(4294967295&a.total)){t.msg="incorrect length check",a.mode=ot;break}_=0,dt=0}a.mode=st;case st:xt=B;break t;case ot:xt=A;break t;case lt:return Z;case ht:default:return E}return t.next_out=o,t.avail_out=f,t.next_in=s,t.avail_in=l,a.hold=_,a.bits=dt,(a.wsize||_t!==t.avail_out&&a.mode<ot&&(a.mode<nt||e!==k))&&d(t,t.output,t.next_out,_t-t.avail_out)?(a.mode=lt,Z):(ft-=t.avail_in,_t-=t.avail_out,t.total_in+=ft,t.total_out+=_t,a.total+=_t,a.wrap&&_t&&(t.adler=a.check=a.flags?b(a.check,r,_t,t.next_out-_t):c(a.check,r,_t,t.next_out-_t)),t.data_type=a.bits+(a.last?64:0)+(a.mode===M?128:0)+(a.mode===Q||a.mode===q?256:0),(0===ft&&0===_t||e===k)&&xt===z&&(xt=R),xt)},a.inflateEnd=function(t){if(!t||!t.state)return E;var e=t.state;return e.window&&(e.window=null),t.state=null,z},a.inflateGetHeader=function(t,e){var a;return t&&t.state?0==(2&(a=t.state).wrap)?E:(a.head=e,e.done=!1,z):E},a.inflateSetDictionary=function(t,e){var a,i,n=e.length;return t&&t.state?0!==(a=t.state).wrap&&a.mode!==K?E:a.mode===K&&(i=1,(i=c(i,e,n,0))!==a.check)?A:d(t,e,n,n)?(a.mode=lt,Z):(a.havedict=1,z):E},a.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":3,"./adler32":5,"./crc32":7,"./inffast":10,"./inftrees":12}],12:[function(t,e,a){"use strict";var i=t("../utils/common"),n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],r=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],o=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];e.exports=function(t,e,a,l,h,d,f,_){var u,c,b,g,m,w,p,v,k,y=_.bits,x=0,z=0,B=0,S=0,E=0,A=0,Z=0,R=0,C=0,N=0,O=null,D=0,I=new i.Buf16(16),U=new i.Buf16(16),T=null,F=0;for(x=0;x<=15;x++)I[x]=0;for(z=0;z<l;z++)I[e[a+z]]++;for(E=y,S=15;S>=1&&0===I[S];S--);if(E>S&&(E=S),0===S)return h[d++]=20971520,h[d++]=20971520,_.bits=1,0;for(B=1;B<S&&0===I[B];B++);for(E<B&&(E=B),R=1,x=1;x<=15;x++)if(R<<=1,(R-=I[x])<0)return-1;if(R>0&&(0===t||1!==S))return-1;for(U[1]=0,x=1;x<15;x++)U[x+1]=U[x]+I[x];for(z=0;z<l;z++)0!==e[a+z]&&(f[U[e[a+z]]++]=z);if(0===t?(O=T=f,w=19):1===t?(O=n,D-=257,T=r,F-=257,w=256):(O=s,T=o,w=-1),N=0,z=0,x=B,m=d,A=E,Z=0,b=-1,C=1<<E,g=C-1,1===t&&C>852||2===t&&C>592)return 1;for(;;){p=x-Z,f[z]<w?(v=0,k=f[z]):f[z]>w?(v=T[F+f[z]],k=O[D+f[z]]):(v=96,k=0),u=1<<x-Z,B=c=1<<A;do{h[m+(N>>Z)+(c-=u)]=p<<24|v<<16|k|0}while(0!==c);for(u=1<<x-1;N&u;)u>>=1;if(0!==u?(N&=u-1,N+=u):N=0,z++,0==--I[x]){if(x===S)break;x=e[a+f[z]]}if(x>E&&(N&g)!==b){for(0===Z&&(Z=E),m+=B,R=1<<(A=x-Z);A+Z<S&&!((R-=I[A+Z])<=0);)A++,R<<=1;if(C+=1<<A,1===t&&C>852||2===t&&C>592)return 1;h[b=N&g]=E<<24|A<<16|m-d|0}}return 0!==N&&(h[m+N]=x-Z<<24|64<<16|0),_.bits=E,0}},{"../utils/common":3}],13:[function(t,e,a){"use strict";e.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],14:[function(t,e,a){"use strict";function i(t){for(var e=t.length;--e>=0;)t[e]=0}function n(t,e,a,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}function r(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function s(t){return t<256?et[t]:et[256+(t>>>7)]}function o(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function l(t,e,a){t.bi_valid>M-a?(t.bi_buf|=e<<t.bi_valid&65535,o(t,t.bi_buf),t.bi_buf=e>>M-t.bi_valid,t.bi_valid+=a-M):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=a)}function h(t,e,a){l(t,a[2*e],a[2*e+1])}function d(t,e){var a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1}function f(t){16===t.bi_valid?(o(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}function _(t,e){var a,i,n,r,s,o,l=e.dyn_tree,h=e.max_code,d=e.stat_desc.static_tree,f=e.stat_desc.has_stree,_=e.stat_desc.extra_bits,u=e.stat_desc.extra_base,c=e.stat_desc.max_length,b=0;for(r=0;r<=K;r++)t.bl_count[r]=0;for(l[2*t.heap[t.heap_max]+1]=0,a=t.heap_max+1;a<j;a++)(r=l[2*l[2*(i=t.heap[a])+1]+1]+1)>c&&(r=c,b++),l[2*i+1]=r,i>h||(t.bl_count[r]++,s=0,i>=u&&(s=_[i-u]),o=l[2*i],t.opt_len+=o*(r+s),f&&(t.static_len+=o*(d[2*i+1]+s)));if(0!==b){do{for(r=c-1;0===t.bl_count[r];)r--;t.bl_count[r]--,t.bl_count[r+1]+=2,t.bl_count[c]--,b-=2}while(b>0);for(r=c;0!==r;r--)for(i=t.bl_count[r];0!==i;)(n=t.heap[--a])>h||(l[2*n+1]!==r&&(t.opt_len+=(r-l[2*n+1])*l[2*n],l[2*n+1]=r),i--)}}function u(t,e,a){var i,n,r=new Array(K+1),s=0;for(i=1;i<=K;i++)r[i]=s=s+a[i-1]<<1;for(n=0;n<=e;n++){var o=t[2*n+1];0!==o&&(t[2*n]=d(r[o]++,o))}}function c(){var t,e,a,i,r,s=new Array(K+1);for(a=0,i=0;i<U-1;i++)for(it[i]=a,t=0;t<1<<W[i];t++)at[a++]=i;for(at[a-1]=i,r=0,i=0;i<16;i++)for(nt[i]=r,t=0;t<1<<J[i];t++)et[r++]=i;for(r>>=7;i<L;i++)for(nt[i]=r<<7,t=0;t<1<<J[i]-7;t++)et[256+r++]=i;for(e=0;e<=K;e++)s[e]=0;for(t=0;t<=143;)$[2*t+1]=8,t++,s[8]++;for(;t<=255;)$[2*t+1]=9,t++,s[9]++;for(;t<=279;)$[2*t+1]=7,t++,s[7]++;for(;t<=287;)$[2*t+1]=8,t++,s[8]++;for(u($,F+1,s),t=0;t<L;t++)tt[2*t+1]=5,tt[2*t]=d(t,5);rt=new n($,W,T+1,F,K),st=new n(tt,J,0,L,K),ot=new n(new Array(0),Q,0,H,P)}function b(t){var e;for(e=0;e<F;e++)t.dyn_ltree[2*e]=0;for(e=0;e<L;e++)t.dyn_dtree[2*e]=0;for(e=0;e<H;e++)t.bl_tree[2*e]=0;t.dyn_ltree[2*Y]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function g(t){t.bi_valid>8?o(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function m(t,e,a,i){g(t),i&&(o(t,a),o(t,~a)),A.arraySet(t.pending_buf,t.window,e,a,t.pending),t.pending+=a}function w(t,e,a,i){var n=2*e,r=2*a;return t[n]<t[r]||t[n]===t[r]&&i[e]<=i[a]}function p(t,e,a){for(var i=t.heap[a],n=a<<1;n<=t.heap_len&&(n<t.heap_len&&w(e,t.heap[n+1],t.heap[n],t.depth)&&n++,!w(e,i,t.heap[n],t.depth));)t.heap[a]=t.heap[n],a=n,n<<=1;t.heap[a]=i}function v(t,e,a){var i,n,r,o,d=0;if(0!==t.last_lit)do{i=t.pending_buf[t.d_buf+2*d]<<8|t.pending_buf[t.d_buf+2*d+1],n=t.pending_buf[t.l_buf+d],d++,0===i?h(t,n,e):(h(t,(r=at[n])+T+1,e),0!==(o=W[r])&&l(t,n-=it[r],o),h(t,r=s(--i),a),0!==(o=J[r])&&l(t,i-=nt[r],o))}while(d<t.last_lit);h(t,Y,e)}function k(t,e){var a,i,n,r=e.dyn_tree,s=e.stat_desc.static_tree,o=e.stat_desc.has_stree,l=e.stat_desc.elems,h=-1;for(t.heap_len=0,t.heap_max=j,a=0;a<l;a++)0!==r[2*a]?(t.heap[++t.heap_len]=h=a,t.depth[a]=0):r[2*a+1]=0;for(;t.heap_len<2;)r[2*(n=t.heap[++t.heap_len]=h<2?++h:0)]=1,t.depth[n]=0,t.opt_len--,o&&(t.static_len-=s[2*n+1]);for(e.max_code=h,a=t.heap_len>>1;a>=1;a--)p(t,r,a);n=l;do{a=t.heap[1],t.heap[1]=t.heap[t.heap_len--],p(t,r,1),i=t.heap[1],t.heap[--t.heap_max]=a,t.heap[--t.heap_max]=i,r[2*n]=r[2*a]+r[2*i],t.depth[n]=(t.depth[a]>=t.depth[i]?t.depth[a]:t.depth[i])+1,r[2*a+1]=r[2*i+1]=n,t.heap[1]=n++,p(t,r,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],_(t,e),u(r,h,t.bl_count)}function y(t,e,a){var i,n,r=-1,s=e[1],o=0,l=7,h=4;for(0===s&&(l=138,h=3),e[2*(a+1)+1]=65535,i=0;i<=a;i++)n=s,s=e[2*(i+1)+1],++o<l&&n===s||(o<h?t.bl_tree[2*n]+=o:0!==n?(n!==r&&t.bl_tree[2*n]++,t.bl_tree[2*q]++):o<=10?t.bl_tree[2*G]++:t.bl_tree[2*X]++,o=0,r=n,0===s?(l=138,h=3):n===s?(l=6,h=3):(l=7,h=4))}function x(t,e,a){var i,n,r=-1,s=e[1],o=0,d=7,f=4;for(0===s&&(d=138,f=3),i=0;i<=a;i++)if(n=s,s=e[2*(i+1)+1],!(++o<d&&n===s)){if(o<f)do{h(t,n,t.bl_tree)}while(0!=--o);else 0!==n?(n!==r&&(h(t,n,t.bl_tree),o--),h(t,q,t.bl_tree),l(t,o-3,2)):o<=10?(h(t,G,t.bl_tree),l(t,o-3,3)):(h(t,X,t.bl_tree),l(t,o-11,7));o=0,r=n,0===s?(d=138,f=3):n===s?(d=6,f=3):(d=7,f=4)}}function z(t){var e;for(y(t,t.dyn_ltree,t.l_desc.max_code),y(t,t.dyn_dtree,t.d_desc.max_code),k(t,t.bl_desc),e=H-1;e>=3&&0===t.bl_tree[2*V[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}function B(t,e,a,i){var n;for(l(t,e-257,5),l(t,a-1,5),l(t,i-4,4),n=0;n<i;n++)l(t,t.bl_tree[2*V[n]+1],3);x(t,t.dyn_ltree,e-1),x(t,t.dyn_dtree,a-1)}function S(t){var e,a=4093624447;for(e=0;e<=31;e++,a>>>=1)if(1&a&&0!==t.dyn_ltree[2*e])return R;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return C;for(e=32;e<T;e++)if(0!==t.dyn_ltree[2*e])return C;return R}function E(t,e,a,i){l(t,(O<<1)+(i?1:0),3),m(t,e,a,!0)}var A=t("../utils/common"),Z=4,R=0,C=1,N=2,O=0,D=1,I=2,U=29,T=256,F=T+1+U,L=30,H=19,j=2*F+1,K=15,M=16,P=7,Y=256,q=16,G=17,X=18,W=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],J=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Q=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],V=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],$=new Array(2*(F+2));i($);var tt=new Array(2*L);i(tt);var et=new Array(512);i(et);var at=new Array(256);i(at);var it=new Array(U);i(it);var nt=new Array(L);i(nt);var rt,st,ot,lt=!1;a._tr_init=function(t){lt||(c(),lt=!0),t.l_desc=new r(t.dyn_ltree,rt),t.d_desc=new r(t.dyn_dtree,st),t.bl_desc=new r(t.bl_tree,ot),t.bi_buf=0,t.bi_valid=0,b(t)},a._tr_stored_block=E,a._tr_flush_block=function(t,e,a,i){var n,r,s=0;t.level>0?(t.strm.data_type===N&&(t.strm.data_type=S(t)),k(t,t.l_desc),k(t,t.d_desc),s=z(t),n=t.opt_len+3+7>>>3,(r=t.static_len+3+7>>>3)<=n&&(n=r)):n=r=a+5,a+4<=n&&-1!==e?E(t,e,a,i):t.strategy===Z||r===n?(l(t,(D<<1)+(i?1:0),3),v(t,$,tt)):(l(t,(I<<1)+(i?1:0),3),B(t,t.l_desc.max_code+1,t.d_desc.max_code+1,s+1),v(t,t.dyn_ltree,t.dyn_dtree)),b(t),i&&g(t)},a._tr_tally=function(t,e,a){return t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&a,t.last_lit++,0===e?t.dyn_ltree[2*a]++:(t.matches++,e--,t.dyn_ltree[2*(at[a]+T+1)]++,t.dyn_dtree[2*s(e)]++),t.last_lit===t.lit_bufsize-1},a._tr_align=function(t){l(t,D<<1,3),h(t,Y,$),f(t)}},{"../utils/common":3}],15:[function(t,e,a){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],"/":[function(t,e,a){"use strict";var i={};(0,t("./lib/utils/common").assign)(i,t("./lib/deflate"),t("./lib/inflate"),t("./lib/zlib/constants")),e.exports=i},{"./lib/deflate":1,"./lib/inflate":2,"./lib/utils/common":3,"./lib/zlib/constants":6}]},{},[])("/")});'use strict';tr.exportTo('tr.e.importer',function(){const GZIP_MEMBER_HEADER_ID_SIZE=3;const GZIP_HEADER_ID1=0x1f;const GZIP_HEADER_ID2=0x8b;const GZIP_DEFLATE_COMPRESSION=8;function _stringToUInt8Array(str){const array=new Uint8Array(str.length);for(let i=0;i<str.length;++i){array[i]=str.charCodeAt(i);}
-return array;}
-function GzipImporter(model,eventData){this.inflateAsTraceStream=false;if(typeof(eventData)==='string'||eventData instanceof String){eventData=_stringToUInt8Array(eventData);}else if(eventData instanceof ArrayBuffer){eventData=new Uint8Array(eventData);}else if(eventData instanceof tr.b.InMemoryTraceStream){eventData=eventData.data;this.inflateAsTraceStream_=true;}else{throw new Error('Unknown gzip data format');}
-this.model_=model;this.gzipData_=eventData;}
-GzipImporter.canImport=function(eventData){if(eventData instanceof tr.b.InMemoryTraceStream){eventData=eventData.header;}
-let header;if(eventData instanceof ArrayBuffer){header=new Uint8Array(eventData.slice(0,GZIP_MEMBER_HEADER_ID_SIZE));}else if(typeof(eventData)==='string'||eventData instanceof String){header=eventData.substring(0,GZIP_MEMBER_HEADER_ID_SIZE);header=_stringToUInt8Array(header);}else{return false;}
-return header[0]===GZIP_HEADER_ID1&&header[1]===GZIP_HEADER_ID2&&header[2]===GZIP_DEFLATE_COMPRESSION;};GzipImporter.inflateGzipData_=function(data){let position=0;function getByte(){if(position>=data.length){throw new Error('Unexpected end of gzip data');}
-return data[position++];}
-function getWord(){const low=getByte();const high=getByte();return(high<<8)+low;}
-function skipBytes(amount){position+=amount;}
-function skipZeroTerminatedString(){while(getByte()!==0){}}
-const id1=getByte();const id2=getByte();if(id1!==GZIP_HEADER_ID1||id2!==GZIP_HEADER_ID2){throw new Error('Not gzip data');}
-const compressionMethod=getByte();if(compressionMethod!==GZIP_DEFLATE_COMPRESSION){throw new Error('Unsupported compression method: '+compressionMethod);}
-const flags=getByte();const haveHeaderCrc=flags&(1<<1);const haveExtraFields=flags&(1<<2);const haveFileName=flags&(1<<3);const haveComment=flags&(1<<4);skipBytes(4+1+1);if(haveExtraFields){const bytesToSkip=getWord();skipBytes(bytesToSkip);}
-if(haveFileName)skipZeroTerminatedString();if(haveComment)skipZeroTerminatedString();if(haveHeaderCrc)getWord();const inflatedData=pako.inflateRaw(data.subarray(position));if(this.inflateAsTraceStream_){return GzipImporter.transformToStream(inflatedData);}
-let string;try{string=GzipImporter.transformToString(inflatedData);}catch(err){return GzipImporter.transformToStream(inflatedData);}
-if(inflatedData.length>0&&string.length===0){return GzipImporter.transformToStream(inflatedData);}
-return string;};GzipImporter.transformToStream=function(data){if(data instanceof Uint8Array){return new tr.b.InMemoryTraceStream(data,false);}
-throw new Error(`Cannot transform ${type} to TraceStream.`);};GzipImporter.transformToString=function(data){if(typeof(data)==='string')return data;if(typeof TextDecoder==='undefined'){if(data instanceof ArrayBuffer){data=new Uint8Array(data);}
-const result=[];let chunk=65536;let k=0;const len=data.length;while(k<len&&chunk>1){try{const chunklen=Math.min(k+chunk,len);let dataslice;if(data instanceof Array){dataslice=data.slice(k,chunklen);}else{dataslice=data.subarray(k,chunklen);}
-result.push(String.fromCharCode.apply(null,dataslice));k+=chunk;}catch(e){chunk=Math.floor(chunk/2);}}
-return result.join('');}
-if(data instanceof Array){data=new Uint8Array(data);}
-return new TextDecoder('utf-8').decode(data);};GzipImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'GzipImporter';},isTraceDataContainer(){return true;},extractSubtraces(){const eventData=GzipImporter.inflateGzipData_(this.gzipData_);return eventData?[eventData]:[];}};tr.importer.Importer.register(GzipImporter);return{GzipImporter,};});'use strict';tr.exportTo('tr.importer',function(){class SimpleLineReader{constructor(text){this.data_=text instanceof tr.b.TraceStream?text:text.split(new RegExp('\r?\n'));this.curLine_=0;this.readLastLine_=false;this.savedLines_=undefined;}*[Symbol.iterator](){let lastLine=undefined;while(this.hasData_){if(this.readLastLine_){this.curLine_++;this.readLastLine_=false;}else if(this.data_ instanceof tr.b.TraceStream){this.curLine_++;const line=this.data_.readUntilDelimiter('\n');if(line.endsWith('\r\n')){lastLine=line.slice(0,-2);}else if(line.endsWith('\n')){lastLine=line.slice(0,-1);}else{lastLine=line;}}else{this.curLine_++;lastLine=this.data_[this.curLine_-1];}
-yield lastLine;}}
-get curLineNumber(){return this.curLine_;}
-get hasData_(){if(this.data_ instanceof tr.b.TraceStream)return this.data_.hasData;return this.curLine_<this.data_.length;}
-advanceToLineMatching(regex){for(const line of this){if(this.savedLines_!==undefined)this.savedLines_.push(line);if(regex.test(line)){this.goBack_();return true;}}
-return false;}
-goBack_(){if(this.readLastLine_){throw new Error('There should be at least one nextLine call between '+'any two goBack calls.');}
-if(this.curLine_===0){throw new Error('There should be at least one nextLine call before '+'the first goBack call.');}
-this.readLastLine_=true;this.curLine_--;}
-beginSavingLines(){this.savedLines_=[];}
-endSavingLinesAndGetResult(){const tmp=this.savedLines_;this.savedLines_=undefined;return tmp;}}
-return{SimpleLineReader,};});'use strict';tr.exportTo('tr.e.importer',function(){function Trace2HTMLImporter(model,events){this.importPriority=0;}
-Trace2HTMLImporter.subtraces_=[];function _extractEventsFromHTML(text){Trace2HTMLImporter.subtraces_=[];const r=new tr.importer.SimpleLineReader(text);while(true){if(!r.advanceToLineMatching(new RegExp('^<\s*script id="viewer-data" '+'type="(application\/json|text\/plain)">\r?$'))){break;}
-r.beginSavingLines();if(!r.advanceToLineMatching(/^<\/\s*script>\r?$/))return;let rawEvents=r.endSavingLinesAndGetResult();rawEvents=rawEvents.slice(1,rawEvents.length-1);const data64=rawEvents.join('\n');const buffer=new ArrayBuffer(tr.b.Base64.getDecodedBufferLength(data64));const len=tr.b.Base64.DecodeToTypedArray(data64,new DataView(buffer));Trace2HTMLImporter.subtraces_.push(buffer.slice(0,len));}}
-function _canImportFromHTML(text){if(!/^<!DOCTYPE html>/.test(text))return false;_extractEventsFromHTML(text);if(Trace2HTMLImporter.subtraces_.length===0)return false;return true;}
-Trace2HTMLImporter.canImport=function(events){if(events instanceof tr.b.TraceStream)return false;return _canImportFromHTML(events);};Trace2HTMLImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'Trace2HTMLImporter';},isTraceDataContainer(){return true;},extractSubtraces(){return Trace2HTMLImporter.subtraces_;},importEvents(){}};tr.importer.Importer.register(Trace2HTMLImporter);return{Trace2HTMLImporter,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){function SplayTree(){}
-SplayTree.prototype.root_=null;SplayTree.prototype.isEmpty=function(){return!this.root_;};SplayTree.prototype.insert=function(key,value){if(this.isEmpty()){this.root_=new SplayTree.Node(key,value);return;}
-this.splay_(key);if(this.root_.key===key){return;}
-const node=new SplayTree.Node(key,value);if(key>this.root_.key){node.left=this.root_;node.right=this.root_.right;this.root_.right=null;}else{node.right=this.root_;node.left=this.root_.left;this.root_.left=null;}
-this.root_=node;};SplayTree.prototype.remove=function(key){if(this.isEmpty()){throw Error('Key not found: '+key);}
-this.splay_(key);if(this.root_.key!==key){throw Error('Key not found: '+key);}
-const removed=this.root_;if(!this.root_.left){this.root_=this.root_.right;}else{const right=this.root_.right;this.root_=this.root_.left;this.splay_(key);this.root_.right=right;}
-return removed;};SplayTree.prototype.find=function(key){if(this.isEmpty())return null;this.splay_(key);return this.root_.key===key?this.root_:null;};SplayTree.prototype.findMin=function(){if(this.isEmpty())return null;let current=this.root_;while(current.left){current=current.left;}
-return current;};SplayTree.prototype.findMax=function(opt_startNode){if(this.isEmpty())return null;let current=opt_startNode||this.root_;while(current.right){current=current.right;}
-return current;};SplayTree.prototype.findGreatestLessThan=function(key){if(this.isEmpty())return null;this.splay_(key);if(this.root_.key<=key){return this.root_;}
-if(this.root_.left){return this.findMax(this.root_.left);}
-return null;};SplayTree.prototype.exportKeysAndValues=function(){const result=[];this.traverse_(function(node){result.push([node.key,node.value]);});return result;};SplayTree.prototype.exportValues=function(){const result=[];this.traverse_(function(node){result.push(node.value);});return result;};SplayTree.prototype.splay_=function(key){if(this.isEmpty())return;const dummy=new SplayTree.Node(null,null);let left=dummy;let right=dummy;let current=this.root_;while(true){if(key<current.key){if(!current.left){break;}
-if(key<current.left.key){const tmp=current.left;current.left=tmp.right;tmp.right=current;current=tmp;if(!current.left){break;}}
-right.left=current;right=current;current=current.left;}else if(key>current.key){if(!current.right){break;}
-if(key>current.right.key){const tmp=current.right;current.right=tmp.left;tmp.left=current;current=tmp;if(!current.right){break;}}
-left.right=current;left=current;current=current.right;}else{break;}}
-left.right=current.left;right.left=current.right;current.left=dummy.right;current.right=dummy.left;this.root_=current;};SplayTree.prototype.traverse_=function(f){const nodesToVisit=[this.root_];while(nodesToVisit.length>0){const node=nodesToVisit.shift();if(node===null)continue;f(node);nodesToVisit.push(node.left);nodesToVisit.push(node.right);}};SplayTree.Node=function(key,value){this.key=key;this.value=value;};SplayTree.Node.prototype.left=null;SplayTree.Node.prototype.right=null;return{SplayTree,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){function CodeMap(){this.dynamics_=new tr.e.importer.v8.SplayTree();this.dynamicsNameGen_=new tr.e.importer.v8.CodeMap.NameGenerator();this.statics_=new tr.e.importer.v8.SplayTree();this.libraries_=new tr.e.importer.v8.SplayTree();this.pages_=[];}
-CodeMap.PAGE_ALIGNMENT=12;CodeMap.PAGE_SIZE=1<<CodeMap.PAGE_ALIGNMENT;CodeMap.prototype.addCode=function(start,codeEntry){this.deleteAllCoveredNodes_(this.dynamics_,start,start+codeEntry.size);this.dynamics_.insert(start,codeEntry);};CodeMap.prototype.moveCode=function(from,to){const removedNode=this.dynamics_.remove(from);this.deleteAllCoveredNodes_(this.dynamics_,to,to+removedNode.value.size);this.dynamics_.insert(to,removedNode.value);};CodeMap.prototype.deleteCode=function(start){const removedNode=this.dynamics_.remove(start);};CodeMap.prototype.addLibrary=function(start,codeEntry){this.markPages_(start,start+codeEntry.size);this.libraries_.insert(start,codeEntry);};CodeMap.prototype.addStaticCode=function(start,codeEntry){this.statics_.insert(start,codeEntry);};CodeMap.prototype.markPages_=function(start,end){for(let addr=start;addr<=end;addr+=CodeMap.PAGE_SIZE){this.pages_[addr>>>CodeMap.PAGE_ALIGNMENT]=1;}};CodeMap.prototype.deleteAllCoveredNodes_=function(tree,start,end){const toDelete=[];let addr=end-1;while(addr>=start){const node=tree.findGreatestLessThan(addr);if(!node)break;const start2=node.key;const end2=start2+node.value.size;if(start2<end&&start<end2)toDelete.push(start2);addr=start2-1;}
-for(let i=0,l=toDelete.length;i<l;++i)tree.remove(toDelete[i]);};CodeMap.prototype.isAddressBelongsTo_=function(addr,node){return addr>=node.key&&addr<(node.key+node.value.size);};CodeMap.prototype.findInTree_=function(tree,addr){const node=tree.findGreatestLessThan(addr);return node&&this.isAddressBelongsTo_(addr,node)?node.value:null;};CodeMap.prototype.findEntryInLibraries=function(addr){const pageAddr=addr>>>CodeMap.PAGE_ALIGNMENT;if(pageAddr in this.pages_){return this.findInTree_(this.libraries_,addr);}
-return undefined;};CodeMap.prototype.findEntry=function(addr){const pageAddr=addr>>>CodeMap.PAGE_ALIGNMENT;if(pageAddr in this.pages_){return this.findInTree_(this.statics_,addr)||this.findInTree_(this.libraries_,addr);}
-const min=this.dynamics_.findMin();const max=this.dynamics_.findMax();if(max!==null&&addr<(max.key+max.value.size)&&addr>=min.key){const dynaEntry=this.findInTree_(this.dynamics_,addr);if(dynaEntry===null)return null;if(!dynaEntry.nameUpdated_){dynaEntry.name=this.dynamicsNameGen_.getName(dynaEntry.name);dynaEntry.nameUpdated_=true;}
-return dynaEntry;}
-return null;};CodeMap.prototype.findDynamicEntryByStartAddress=function(addr){const node=this.dynamics_.find(addr);return node?node.value:null;};CodeMap.prototype.getAllDynamicEntries=function(){return this.dynamics_.exportValues();};CodeMap.prototype.getAllDynamicEntriesWithAddresses=function(){return this.dynamics_.exportKeysAndValues();};CodeMap.prototype.getAllStaticEntries=function(){return this.statics_.exportValues();};CodeMap.prototype.getAllLibrariesEntries=function(){return this.libraries_.exportValues();};CodeMap.CodeState={COMPILED:0,OPTIMIZABLE:1,OPTIMIZED:2};CodeMap.CodeEntry=function(size,opt_name,opt_type){this.id=tr.b.GUID.allocateSimple();this.size=size;this.name_=opt_name||'';this.type=opt_type||'';this.nameUpdated_=false;};CodeMap.CodeEntry.prototype={__proto__:Object.prototype,get name(){return this.name_;},set name(value){this.name_=value;},toString(){this.name_+': '+this.size.toString(16);}};CodeMap.CodeEntry.TYPE={SHARED_LIB:'SHARED_LIB',CPP:'CPP'};CodeMap.DynamicFuncCodeEntry=function(size,type,func,state){CodeMap.CodeEntry.call(this,size,'',type);this.func=func;this.state=state;};CodeMap.DynamicFuncCodeEntry.STATE_PREFIX=['','~','*'];CodeMap.DynamicFuncCodeEntry.prototype={__proto__:CodeMap.CodeEntry.prototype,get name(){return CodeMap.DynamicFuncCodeEntry.STATE_PREFIX[this.state]+
-this.func.name;},set name(value){this.name_=value;},getRawName(){return this.func.getName();},isJSFunction(){return true;},toString(){return this.type+': '+this.name+': '+this.size.toString(16);}};CodeMap.FunctionEntry=function(name){CodeMap.CodeEntry.call(this,0,name);};CodeMap.FunctionEntry.prototype={__proto__:CodeMap.CodeEntry.prototype,get name(){let name=this.name_;if(name.length===0){name='<anonymous>';}else if(name.charAt(0)===' '){name='<anonymous>'+name;}
-return name;},set name(value){this.name_=value;}};CodeMap.NameGenerator=function(){this.knownNames_={};};CodeMap.NameGenerator.prototype.getName=function(name){if(!(name in this.knownNames_)){this.knownNames_[name]=0;return name;}
-const count=++this.knownNames_[name];return name+' {'+count+'}';};return{CodeMap,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){function CsvParser(){}
-CsvParser.CSV_FIELD_RE_=/^"((?:[^"]|"")*)"|([^,]*)/;CsvParser.DOUBLE_QUOTE_RE_=/""/g;CsvParser.prototype.parseLine=function(line){const fieldRe=CsvParser.CSV_FIELD_RE_;const doubleQuoteRe=CsvParser.DOUBLE_QUOTE_RE_;let pos=0;const endPos=line.length;const fields=[];if(endPos>0){do{const fieldMatch=fieldRe.exec(line.substr(pos));if(typeof fieldMatch[1]==='string'){const field=fieldMatch[1];pos+=field.length+3;fields.push(field.replace(doubleQuoteRe,'"'));}else{const field=fieldMatch[2];pos+=field.length+1;fields.push(field);}}while(pos<=endPos);}
-return fields;};function LogReader(dispatchTable){this.dispatchTable_=dispatchTable;this.lineNum_=0;this.csvParser_=new CsvParser();}
-LogReader.prototype.printError=function(str){};LogReader.prototype.processLogChunk=function(chunk){this.processLog_(chunk.split('\n'));};LogReader.prototype.processLogLine=function(line){this.processLog_([line]);};LogReader.prototype.processStack=function(pc,func,stack){const fullStack=func?[pc,func]:[pc];let prevFrame=pc;for(let i=0,n=stack.length;i<n;++i){const frame=stack[i];const firstChar=frame.charAt(0);if(firstChar==='+'||firstChar==='-'){prevFrame+=parseInt(frame,16);fullStack.push(prevFrame);}else if(firstChar!=='o'){fullStack.push(parseInt(frame,16));}}
-return fullStack;};LogReader.prototype.skipDispatch=function(dispatch){return false;};LogReader.prototype.dispatchLogRow_=function(fields){const command=fields[0];if(!(command in this.dispatchTable_))return;const dispatch=this.dispatchTable_[command];if(dispatch===null||this.skipDispatch(dispatch)){return;}
-const parsedFields=[];for(let i=0;i<dispatch.parsers.length;++i){const parser=dispatch.parsers[i];if(parser===null){parsedFields.push(fields[1+i]);}else if(typeof parser==='function'){parsedFields.push(parser(fields[1+i]));}else{parsedFields.push(fields.slice(1+i));break;}}
-dispatch.processor.apply(this,parsedFields);};LogReader.prototype.processLog_=function(lines){for(let i=0,n=lines.length;i<n;++i,++this.lineNum_){const line=lines[i];if(!line){continue;}
-try{const fields=this.csvParser_.parseLine(line);this.dispatchLogRow_(fields);}catch(e){this.printError('line '+(this.lineNum_+1)+': '+
-(e.message||e));}}};return{LogReader,};});'use strict';tr.exportTo('tr.model',function(){function ProfileNode(id,title,parentNode){this.id_=id;this.title_=title;this.parentNode_=parentNode;this.colorId_=-1;this.userFriendlyStack_=[];}
-ProfileNode.prototype={__proto__:Object.prototype,get title(){return this.title_;},get parentNode(){return this.parentNode_;},set parentNode(value){this.parentNode_=value;},get id(){return this.id_;},get colorId(){return this.colorId_;},set colorId(value){this.colorId_=value;},get userFriendlyName(){return this.title_;},get userFriendlyStack(){if(this.userFriendlyStack_.length===0){this.userFriendlyStack_=[this.userFriendlyName];if(this.parentNode_!==undefined){this.userFriendlyStack_=this.userFriendlyStack_.concat(this.parentNode_.userFriendlyStack);}}
-return this.userFriendlyStack_;},get sampleTitle(){throw new Error('Not implemented.');}};tr.model.EventRegistry.register(ProfileNode,{name:'Node',pluralName:'Nodes'});return{ProfileNode,};});'use strict';tr.exportTo('tr.e.v8',function(){const ProfileNode=tr.model.ProfileNode;function V8CpuProfileNode(id,callFrame,parentNode){ProfileNode.call(this,id,callFrame.functionName,parentNode);this.callFrame_=tr.b.deepCopy(callFrame);this.deoptReason_='';this.colorId_=tr.b.ColorScheme.getColorIdForGeneralPurposeString(callFrame.functionName);}
-V8CpuProfileNode.prototype={__proto__:ProfileNode.prototype,get functionName(){return this.callFrame_.functionName;},get scriptId(){return this.callFrame_.scriptId;},get url(){if(!this.callFrame_.url){return'unknown';}
-let url=this.callFrame_.url;if(this.callFrame_.lineNumber===undefined){return url;}
-url=url+':'+this.callFrame_.lineNumber;if(this.callFrame_.columnNumber===undefined){return url;}
-url=url+':'+this.callFrame_.columnNumber;return url;},get deoptReason(){return this.deoptReason_;},set deoptReason(value){this.deoptReason_=value;},get userFriendlyName(){const name=this.functionName+' url: '+this.url;return!this.deoptReason_?name:name+' Deoptimized reason: '+this.deoptReason_;},get sampleTitle(){return'V8 Sample';}};V8CpuProfileNode.constructFromObject=function(profileTree,node){const nodeId=node.id;if(nodeId===1){return undefined;}
-const parentNode=profileTree.getNode(node.parent);const profileNode=new V8CpuProfileNode(nodeId,node.callFrame,parentNode);if(node.deoptReason!==undefined){profileNode.deoptReason=node.deoptReason;}
-return profileNode;};ProfileNode.subTypes.register(V8CpuProfileNode,{typeName:'cpuProfile',name:'v8 cpu profile node',pluralName:'v8 cpu profile nodes'});ProfileNode.subTypes.register(V8CpuProfileNode,{typeName:'legacySample',name:'v8 cpu profile node',pluralName:'v8 cpu profile nodes'});return{ProfileNode,};});'use strict';tr.exportTo('tr.model',function(){function ProfileTree(){this.startTime_=undefined;this.endTime_=undefined;this.tree_=new Map();this.pid_=-1;this.tid_=-1;}
-ProfileTree.prototype={__proto__:Object.prototype,get pid(){return this.pid_;},set pid(value){this.pid_=value;},get tid(){return this.tid_;},set tid(value){this.tid_=value;},get tree(){return this.tree_;},get startTime(){return this.startTime_;},set startTime(value){this.startTime_=value;this.endTime_=value;},get endTime(){return this.endTime_;},set endTime(value){this.endTime_=value;},add(node){if(this.tree_.has(node.id)){throw new Error('Conflict id in the profile tree.');}
-this.tree_.set(node.id,node);return node;},getNode(nodeId){return this.tree_.get(nodeId);}};return{ProfileTree,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){const CodeEntry=tr.e.importer.v8.CodeMap.CodeEntry;const CodeMap=tr.e.importer.v8.CodeMap;const ColorScheme=tr.b.ColorScheme;const DynamicFuncCodeEntry=tr.e.importer.v8.CodeMap.DynamicFuncCodeEntry;const FunctionEntry=tr.e.importer.v8.CodeMap.FunctionEntry;const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,'legacySample');function V8LogImporter(model,eventData){this.importPriority=3;this.model_=model;this.logData_=eventData;this.code_map_=new CodeMap();this.v8_timer_thread_=undefined;this.v8_thread_=undefined;this.profileTree_=new tr.model.ProfileTree();this.profileTree_.add(new ProfileNodeType(-1,{url:'',functionName:'unknown'}));this.v8_stack_timeline_=[];}
-const kV8BinarySuffixes=['/d8','/libv8.so'];const TimerEventDefaultArgs={'V8.Execute':{pause:false,no_execution:false},'V8.External':{pause:false,no_execution:true},'V8.CompileFullCode':{pause:true,no_execution:true},'V8.RecompileSynchronous':{pause:true,no_execution:true},'V8.RecompileParallel':{pause:false,no_execution:false},'V8.CompileEval':{pause:true,no_execution:true},'V8.Parse':{pause:true,no_execution:true},'V8.PreParse':{pause:true,no_execution:true},'V8.ParseLazy':{pause:true,no_execution:true},'V8.GCScavenger':{pause:true,no_execution:true},'V8.GCCompactor':{pause:true,no_execution:true},'V8.GCContext':{pause:true,no_execution:true}};V8LogImporter.canImport=function(eventData){if(typeof(eventData)!=='string'&&!(eventData instanceof String)){return false;}
-return eventData.substring(0,11)==='v8-version,'||eventData.substring(0,12)==='timer-event,'||eventData.substring(0,5)==='tick,'||eventData.substring(0,15)==='shared-library,'||eventData.substring(0,9)==='profiler,'||eventData.substring(0,14)==='code-creation,';};V8LogImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'V8LogImporter';},processTimerEvent_(name,startInUs,lengthInUs){const args=TimerEventDefaultArgs[name];if(args===undefined)return;const startInMs=tr.b.convertUnit(startInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);const lengthInMs=tr.b.convertUnit(lengthInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);const colorId=ColorScheme.getColorIdForGeneralPurposeString(name);const slice=new tr.model.ThreadSlice('v8',name,colorId,startInMs,args,lengthInMs);this.v8_timer_thread_.sliceGroup.pushSlice(slice);},processTimerEventStart_(name,startInUs){const args=TimerEventDefaultArgs[name];if(args===undefined)return;const startInMs=tr.b.convertUnit(startInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);this.v8_timer_thread_.sliceGroup.beginSlice('v8',name,startInMs,args);},processTimerEventEnd_(name,endInUs){const endInMs=tr.b.convertUnit(endInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);this.v8_timer_thread_.sliceGroup.endSlice(endInMs);},processCodeCreateEvent_(type,kind,address,size,name,maybeFunc){function parseState(s){switch(s){case'':return CodeMap.CodeState.COMPILED;case'~':return CodeMap.CodeState.OPTIMIZABLE;case'*':return CodeMap.CodeState.OPTIMIZED;}
-throw new Error('unknown code state: '+s);}
-if(maybeFunc.length){const funcAddr=parseInt(maybeFunc[0]);const state=parseState(maybeFunc[1]);let func=this.code_map_.findDynamicEntryByStartAddress(funcAddr);if(!func){func=new FunctionEntry(name);func.kind=kind;this.code_map_.addCode(funcAddr,func);}else if(func.name!==name){func.name=name;}
-let entry=this.code_map_.findDynamicEntryByStartAddress(address);if(entry){if(entry.size===size&&entry.func===func){entry.state=state;}}else{entry=new DynamicFuncCodeEntry(size,type,func,state);entry.kind=kind;this.code_map_.addCode(address,entry);}}else{const codeEntry=new CodeEntry(size,name);codeEntry.kind=kind;this.code_map_.addCode(address,codeEntry);}},processCodeMoveEvent_(from,to){this.code_map_.moveCode(from,to);},processCodeDeleteEvent_(address){this.code_map_.deleteCode(address);},processSharedLibrary_(name,start,end){const codeEntry=new CodeEntry(end-start,name,CodeEntry.TYPE.SHARED_LIB);codeEntry.kind=-3;for(let i=0;i<kV8BinarySuffixes.length;i++){const suffix=kV8BinarySuffixes[i];if(name.indexOf(suffix,name.length-suffix.length)>=0){codeEntry.kind=-1;break;}}
-this.code_map_.addLibrary(start,codeEntry);},processCppSymbol_(address,size,name){const codeEntry=new CodeEntry(size,name,CodeEntry.TYPE.CPP);codeEntry.kind=-1;this.code_map_.addStaticCode(address,codeEntry);},processTickEvent_(pc,startInUs,isExternalCallback,tosOrExternalCallback,vmstate,stack){const startInMs=tr.b.convertUnit(startInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);function findChildWithEntryID(stackFrame,entryID){for(let i=0;i<stackFrame.children.length;i++){if(stackFrame.children[i].entryID===entryID){return stackFrame.children[i];}}
-return undefined;}
-function processStack(pc,func,stack){const fullStack=func?[pc,func]:[pc];let prevFrame=pc;for(let i=0,n=stack.length;i<n;++i){const frame=stack[i];const firstChar=frame.charAt(0);if(firstChar==='+'||firstChar==='-'){prevFrame+=parseInt(frame,16);fullStack.push(prevFrame);}else if(firstChar!=='o'){fullStack.push(parseInt(frame,16));}}
-return fullStack;}
-if(isExternalCallback){pc=tosOrExternalCallback;tosOrExternalCallback=0;}else if(tosOrExternalCallback){const funcEntry=this.code_map_.findEntry(tosOrExternalCallback);if(!funcEntry||!funcEntry.isJSFunction||!funcEntry.isJSFunction()){tosOrExternalCallback=0;}}
-let processedStack=processStack(pc,tosOrExternalCallback,stack);let node=undefined;let lastNode=undefined;processedStack=processedStack.reverse();for(let i=0,n=processedStack.length;i<n;i++){const frame=processedStack[i];if(!frame)break;const entry=this.code_map_.findEntry(frame);if(!entry&&i!==0){continue;}
-let sourceInfo=undefined;if(entry&&entry.type===CodeEntry.TYPE.CPP){const libEntry=this.code_map_.findEntryInLibraries(frame);if(libEntry){sourceInfo={file:libEntry.name};}}
-const entryId=entry?entry.id:-1;node=this.profileTree_.getNode(entryId);if(node===undefined){node=this.profileTree_.add(new ProfileNodeType(entryId,{functionName:entry.name,url:sourceInfo?sourceInfo.file:'',lineNumber:sourceInfo?sourceInfo.line:undefined,columnNumber:sourceInfo?sourceInfo.column:undefined,scriptId:sourceInfo?sourceInfo.scriptId:undefined},lastNode));}
-lastNode=node;}
-this.model_.samples.push(new tr.model.Sample(startInMs,'V8 PC',node,this.v8_thread_,undefined,1));},processDistortion_(distortionInPicoseconds){},processPlotRange_(start,end){},processV8Version_(major,minor,build,patch,candidate){},importEvents(){const logreader=new tr.e.importer.v8.LogReader({'timer-event':{parsers:[null,parseInt,parseInt],processor:this.processTimerEvent_.bind(this)},'shared-library':{parsers:[null,parseInt,parseInt],processor:this.processSharedLibrary_.bind(this)},'timer-event-start':{parsers:[null,parseInt],processor:this.processTimerEventStart_.bind(this)},'timer-event-end':{parsers:[null,parseInt],processor:this.processTimerEventEnd_.bind(this)},'code-creation':{parsers:[null,parseInt,parseInt,parseInt,null,'var-args'],processor:this.processCodeCreateEvent_.bind(this)},'code-move':{parsers:[parseInt,parseInt],processor:this.processCodeMoveEvent_.bind(this)},'code-delete':{parsers:[parseInt],processor:this.processCodeDeleteEvent_.bind(this)},'cpp':{parsers:[parseInt,parseInt,null],processor:this.processCppSymbol_.bind(this)},'tick':{parsers:[parseInt,parseInt,parseInt,parseInt,parseInt,'var-args'],processor:this.processTickEvent_.bind(this)},'distortion':{parsers:[parseInt],processor:this.processDistortion_.bind(this)},'plot-range':{parsers:[parseInt,parseInt],processor:this.processPlotRange_.bind(this)},'v8-version':{parsers:[parseInt,parseInt,parseInt,parseInt,parseInt],processor:this.processV8Version_.bind(this)}});this.v8_timer_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(1);this.v8_timer_thread_.name='V8 Timers';this.v8_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(2);this.v8_thread_.name='V8';const lines=this.logData_.split('\n');for(let i=0;i<lines.length;i++){logreader.processLogLine(lines[i]);}
-function addSlices(slices,thread){for(let i=0;i<slices.length;i++){const duration=slices[i].end-slices[i].start;const slice=new tr.model.ThreadSlice('v8',slices[i].name,ColorScheme.getColorIdForGeneralPurposeString(slices[i].name),slices[i].start,{},duration);thread.sliceGroup.pushSlice(slice);addSlices(slices[i].children,thread);}}
-addSlices(this.v8_stack_timeline_,this.v8_thread_);}};tr.importer.Importer.register(V8LogImporter);return{V8LogImporter,};});'use strict';if(tr.isVinn){global.window={};}
-!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";c.encode=function(a){for(var b,c,e,f,g,h,i,j="",k=0;k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),e=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=d.indexOf(a.charAt(k++)),g=d.indexOf(a.charAt(k++)),h=d.indexOf(a.charAt(k++)),i=d.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<a||0>a)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;g<e.length;g++)h=e[g],this.file(h.fileName,h.decompressed,{binary:!0,optimizedBinaryString:!0,date:h.date,dir:h.dir,comment:h.fileComment.length?h.fileComment:null,createFolders:b.createFolders});return f.zipComment.length&&(this.comment=f.zipComment),this}},{"./base64":1,"./zipEntries":22}],11:[function(a,b){(function(a){"use strict";b.exports=function(b,c){return new a(b,c)},b.exports.test=function(b){return a.isBuffer(b)}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],12:[function(a,b){"use strict";function c(a){this.data=a,this.length=this.data.length,this.index=0}var d=a("./uint8ArrayReader");c.prototype=new d,c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./uint8ArrayReader":18}],13:[function(a,b){"use strict";var c=a("./support"),d=a("./utils"),e=a("./crc32"),f=a("./signature"),g=a("./defaults"),h=a("./base64"),i=a("./compressions"),j=a("./compressedObject"),k=a("./nodeBuffer"),l=a("./utf8"),m=a("./stringWriter"),n=a("./uint8ArrayWriter"),o=function(a){if(a._data instanceof j&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,"uint8array"===d.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length),0!==b.length&&a._data.set(b,0)}return a._data},p=function(a){var b=o(a),e=d.getTypeOf(b);return"string"===e?!a.options.binary&&c.nodebuffer?k(b,"utf-8"):a.asBinary():b},q=function(a){var b=o(this);return null===b||"undefined"==typeof b?"":(this.options.base64&&(b=h.decode(b)),b=a&&this.options.binary?A.utf8decode(b):d.transformTo("string",b),a||this.options.binary||(b=d.transformTo("string",A.utf8encode(b))),b)},r=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this._data=b,this.options=c,this._initialMetadata={dir:c.dir,date:c.date}};r.prototype={asText:function(){return q.call(this,!0)},asBinary:function(){return q.call(this,!1)},asNodeBuffer:function(){var a=p(this);return d.transformTo("nodebuffer",a)},asUint8Array:function(){var a=p(this);return d.transformTo("uint8array",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var s=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&"undefined"==typeof c[b]&&(c[b]=arguments[a][b]);return c},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=t(a,g),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var e,f=d.getTypeOf(b);if(c=u(c),c.createFolders&&(e=w(a))&&x.call(this,e,!0),c.dir||null===b||"undefined"==typeof b)c.base64=!1,c.binary=!1,b=null;else if("string"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=d.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof j))throw new Error("The data of '"+a+"' is in an unsupported format !");"arraybuffer"===f&&(b=d.transformTo("uint8array",b))}var g=new r(a,b,c);return this.files[a]=g,g},w=function(a){"/"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf("/");return b>0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";w+="\n\x00",w+=p||q?"\x00\b":"\x00\x00",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2);var x=f.LOCAL_FILE_HEADER+w+m+t,y=f.CENTRAL_FILE_HEADER+"\x00"+w+s(o.length,2)+"\x00\x00\x00\x00"+(j===!0?"\x00\x00\x00":"\x00\x00\x00\x00")+s(g,4)+m+t+o;return{fileRecord:x,dirRecord:y,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d<c.length;d++)delete this.files[c[d].name];return this},generate:function(a){a=t(a||{},{base64:!0,compression:"STORE",type:"base64",comment:null}),d.checkSupport(a.type);var b,c,e=[],g=0,j=0,k=d.transformTo("string",this.utf8encode(a.comment||this.comment||""));for(var l in this.files)if(this.files.hasOwnProperty(l)){var o=this.files[l],p=o.options.compression||a.compression.toUpperCase(),q=i[p];if(!q)throw new Error(p+" is not a valid compression method !");var r=y.call(this,o,q),u=z.call(this,l,o,r,g);g+=u.fileRecord.length+r.compressedSize,j+=u.dirRecord.length,e.push(u)}var v="";v=f.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+s(e.length,2)+s(e.length,2)+s(j,4)+s(g,4)+s(k.length,2)+k;var w=a.type.toLowerCase();for(b="uint8array"===w||"arraybuffer"===w||"blob"===w||"nodebuffer"===w?new n(g+j+v.length):new m(g+j+v.length),c=0;c<e.length;c++)b.append(e[c].fileRecord),b.append(e[c].compressedObject.compressedContent);for(c=0;c<e.length;c++)b.append(e[c].dirRecord);b.append(v);var x=b.finalize();switch(a.type.toLowerCase()){case"uint8array":case"arraybuffer":case"nodebuffer":return d.transformTo(a.type.toLowerCase(),x);case"blob":return d.arrayBuffer2Blob(d.transformTo("arraybuffer",x));case"base64":return a.base64?h.encode(x):x;default:return x}},crc32:function(a,b){return e(a,b)},utf8encode:function(a){return d.transformTo("string",l.utf8encode(a))},utf8decode:function(a){return l.utf8decode(a)}};b.exports=A},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],15:[function(a,b){"use strict";function c(a,b){this.data=a,b||(this.data=e.string2binary(this.data)),this.length=this.data.length,this.index=0}var d=a("./dataReader"),e=a("./utils");c.prototype=new d,c.prototype.byteAt=function(a){return this.data.charCodeAt(a)},c.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)},c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5,"./utils":21}],16:[function(a,b){"use strict";var c=a("./utils"),d=function(){this.data=[]};d.prototype={append:function(a){a=c.transformTo("string",a),this.data.push(a)},finalize:function(){return this.data.join("")}},b.exports=d},{"./utils":21}],17:[function(a,b,c){(function(a){"use strict";if(c.base64=!0,c.array=!0,c.string=!0,c.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,c.nodebuffer="undefined"!=typeof a,c.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)c.blob=!1;else{var b=new ArrayBuffer(0);try{c.blob=0===new Blob([b],{type:"application/zip"}).size}catch(d){try{var e=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,f=new e;f.append(b),c.blob=0===f.getBlob("application/zip").size}catch(d){c.blob=!1}}}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],18:[function(a,b){"use strict";function c(a){a&&(this.data=a,this.length=this.data.length,this.index=0)}var d=a("./dataReader");c.prototype=new d,c.prototype.byteAt=function(a){return this.data[a]},c.prototype.lastIndexOfSignature=function(a){for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.length-4;f>=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function f(a){var b=65536,d=[],e=a.length,f=c.getTypeOf(a),g=0,h=!0;try{switch(f){case"uint8array":String.fromCharCode.apply(null,new Uint8Array(0));break;case"nodebuffer":String.fromCharCode.apply(null,j(0))}}catch(i){h=!1}if(!h){for(var k="",l=0;l<a.length;l++)k+=String.fromCharCode(a[l]);return k}for(;e>g&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var h=a("./support"),i=a("./compressions"),j=a("./nodeBuffer");c.string2binary=function(a){for(var b="",c=0;c<a.length;c++)b+=String.fromCharCode(255&a.charCodeAt(c));return b},c.arrayBuffer2Blob=function(a){c.checkSupport("blob");try{return new Blob([a],{type:"application/zip"})}catch(b){try{var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,e=new d;return e.append(a),e.getBlob("application/zip")}catch(b){throw new Error("Bug : can't construct the Blob.")}}},c.applyFromCharCode=f;var k={};k.string={string:d,array:function(a){return e(a,new Array(a.length))},arraybuffer:function(a){return k.string.uint8array(a).buffer},uint8array:function(a){return e(a,new Uint8Array(a.length))},nodebuffer:function(a){return e(a,j(a.length))}},k.array={string:f,array:d,arraybuffer:function(a){return new Uint8Array(a).buffer},uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(a)}},k.arraybuffer={string:function(a){return f(new Uint8Array(a))},array:function(a){return g(new Uint8Array(a),new Array(a.byteLength))},arraybuffer:d,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(new Uint8Array(a))}},k.uint8array={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:d,nodebuffer:function(a){return j(a)}},k.nodebuffer={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return k.nodebuffer.uint8array(a).buffer},uint8array:function(a){return g(a,new Uint8Array(a.length))},nodebuffer:d},c.transformTo=function(a,b){if(b||(b=""),!a)return b;c.checkSupport(a);var d=c.getTypeOf(b),e=k[d][a](b);return e},c.getTypeOf=function(a){return"string"==typeof a?"string":"[object Array]"===Object.prototype.toString.call(a)?"array":h.nodebuffer&&j.test(a)?"nodebuffer":h.uint8array&&a instanceof Uint8Array?"uint8array":h.arraybuffer&&a instanceof ArrayBuffer?"arraybuffer":void 0},c.checkSupport=function(a){var b=h[a.toLowerCase()];if(!b)throw new Error(a+" is not supported by this browser")},c.MAX_VALUE_16BITS=65535,c.MAX_VALUE_32BITS=-1,c.pretty=function(a){var b,c,d="";for(c=0;c<(a||"").length;c++)b=a.charCodeAt(c),d+="\\x"+(16>b?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(h.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===h.CENTRAL_FILE_HEADER;)a=new i({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(h.CENTRAL_DIRECTORY_END);if(-1===a)throw new Error("Corrupted zip : can't find end of central directory");if(this.reader.setIndex(a),this.checkSignature(h.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===g.MAX_VALUE_16BITS||this.diskWithCentralDirStart===g.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===g.MAX_VALUE_16BITS||this.centralDirRecords===g.MAX_VALUE_16BITS||this.centralDirSize===g.MAX_VALUE_32BITS||this.centralDirOffset===g.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),-1===a)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");this.reader.setIndex(a),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}},prepareReader:function(a){var b=g.getTypeOf(a);this.reader="string"!==b||j.uint8array?"nodebuffer"===b?new e(a):new f(g.transformTo("uint8array",a)):new d(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=c},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(a,b){"use strict";function c(a,b){this.options=a,this.loadOptions=b}var d=a("./stringReader"),e=a("./utils"),f=a("./compressedObject"),g=a("./object");c.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,f){return function(){var a=e.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==f)throw new Error("Bug : uncompressed data size mismatch");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readString(this.fileNameLength),a.skip(c),-1==this.compressedSize||-1==this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");if(b=e.findCompression(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+e.pretty(this.compressionMethod)+" unknown (inner file : "+this.fileName+")");if(this.decompressed=new f,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=e.transformTo("string",this.decompressed.getContent()),g.crc32(this.decompressed)!==this.crc32))throw new Error("Corrupted zip : CRC32 mismatch")},readCentralPart:function(a){if(this.versionMadeBy=a.readString(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");this.fileName=a.readString(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readString(this.fileCommentLength),this.dir=16&this.externalFileAttributes?!0:!1},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new d(this.extraFields[1].value);this.uncompressedSize===e.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===e.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===e.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===e.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index<e+this.extraFieldsLength;)b=a.readInt(2),c=a.readInt(2),d=a.readString(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){if(this.useUTF8())this.fileName=g.utf8decode(this.fileName),this.fileComment=g.utf8decode(this.fileComment);else{var a=this.findExtraFieldUnicodePath();null!==a&&(this.fileName=a);var b=this.findExtraFieldUnicodeComment();null!==b&&(this.fileComment=b)}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileName)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}},b.exports=c},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(a,b){"use strict";var c=a("./lib/utils/common").assign,d=a("./lib/deflate"),e=a("./lib/inflate"),f=a("./lib/zlib/constants"),g={};c(g,d,e,f),b.exports=g},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(a,b,c){"use strict";function d(a,b){var c=new s(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}function f(a,b){return b=b||{},b.gzip=!0,d(a,b)}var g=a("./zlib/deflate.js"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=0,m=4,n=0,o=1,p=-1,q=0,r=8,s=function(a){this.options=h.assign({level:p,method:r,chunkSize:16384,windowBits:15,memLevel:8,strategy:q,to:""},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header)};s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+hb-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<hb)););}while(a.lookahead<jb&&0!==a.strm.avail_in)}function n(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c)),a.match_length>=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function p(a,b){for(var c,d,e;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=hb-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c),a.match_length<=5&&(a.strategy===S||a.match_length===hb&&a.strstart-a.match_start>4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=hb-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return sb}else if(a.match_available){if(d=D._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return sb}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=D._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ib){if(m(a),a.lookahead<=ib&&b===H)return sb;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<<i.w_bits,i.w_mask=i.w_size-1,i.hash_bits=f+7,i.hash_size=1<<i.hash_bits,i.hash_mask=i.hash_size-1,i.hash_shift=~~((i.hash_bits+hb-1)/hb),i.window=new C.Buf8(2*i.w_size),i.head=new C.Buf16(i.hash_size),i.prev=new C.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new C.Buf8(i.pending_buf_size),i.d_buf=i.lit_bufsize>>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.name.length?255&h.gzhead.name.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.comment.length?255&h.gzhead.comment.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<<e.lenbits)-1,u=(1<<e.distbits)-1;a:do{15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=r[p&t];b:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<<w)-1)];continue b}if(32&w){e.mode=d;break a}a.msg="invalid literal/length code",e.mode=c;break a}x=65535&v,w&=15,w&&(w>q&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=s[p&u];c:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<<w)-1)];continue c}a.msg="invalid distance code",e.mode=c;break a}if(y=65535&v,w&=15,w>q&&(p+=B[f++]<<q,q+=8,w>q&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=g>f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<<f.wbits,f.wnext=0,f.whave=0,f.window=new r.Buf8(f.wsize)),d>=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave<f.wsize&&(f.whave+=e))),0}function m(a,b){var c,e,f,g,h,i,j,m,n,o,p,q,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab=0,Bb=new r.Buf8(4),Cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return F;c=a.state,c.mode===V&&(c.mode=W),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,o=i,p=j,xb=C;a:for(;;)switch(c.mode){case K:if(0===c.wrap){c.mode=W;break}for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<<wb,a.adler=c.check=1,c.mode=512&m?T:V,m=0,n=0;break;case L:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==J){a.msg="unknown compression method",c.mode=lb;break}if(57344&c.flags){a.msg="unknown header flags set",c.mode=lb;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length=m,c.head&&(c.head.extra_len=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg="header crc mismatch",c.mode=lb;break}m=0,n=0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=U;case U:if(0===c.havedict)return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,E;a.adler=c.check=1,c.mode=V;case V:if(b===A||b===B)break a;case W:if(c.last){m>>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}switch(c.last=1&m,m>>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if((65535&m)!==(m>>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.nlen=(31&m)+257,m>>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.have<c.ncode;){for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Cb[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have<c.nlen+c.ndist;){for(;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(16>sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(rb&&0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.lencode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<<c.distbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.distcode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.offset+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<<n,n+=8}if(p-=j,a.total_out+=p,c.total+=p,p&&(a.adler=c.check=c.flags?t(c.check,f,p,h-p):s(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg="incorrect data check",c.mode=lb;break}m=0,n=0}c.mode=jb;case jb:if(c.wrap&&c.flags){for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg="incorrect length check",c.mode=lb;break}m=0,n=0}c.mode=kb;case kb:xb=D;break a;case lb:xb=G;break a;case mb:return H;case nb:default:return F}return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,(c.wsize||p!==a.avail_out&&c.mode<lb&&(c.mode<ib||b!==z))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=mb,H):(o-=a.avail_in,p-=a.avail_out,a.total_in+=o,a.total_out+=p,c.total+=p,c.wrap&&p&&(a.adler=c.check=c.flags?t(c.check,f,p,a.next_out-p):s(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===V?128:0)+(c.mode===bb||c.mode===Y?256:0),(0===o&&0===p||b===z)&&xb===C&&(xb=I),xb)}function n(a){if(!a||!a.state)return F;var b=a.state;return b.window&&(b.window=null),a.state=null,C}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?F:(c.head=b,b.done=!1,C)):F}var p,q,r=a("../utils/common"),s=a("./adler32"),t=a("./crc32"),u=a("./inffast"),v=a("./inftrees"),w=0,x=1,y=2,z=4,A=5,B=6,C=0,D=1,E=2,F=-2,G=-3,H=-4,I=-5,J=8,K=1,L=2,M=3,N=4,O=5,P=6,Q=7,R=8,S=9,T=10,U=11,V=12,W=13,X=14,Y=15,Z=16,$=17,_=18,ab=19,bb=20,cb=21,db=22,eb=23,fb=24,gb=25,hb=26,ib=27,jb=28,kb=29,lb=30,mb=31,nb=32,ob=852,pb=592,qb=15,rb=qb,sb=!0;c.inflateReset=g,c.inflateReset2=h,c.inflateResetKeep=f,c.inflateInit=j,c.inflateInit2=i,c.inflate=m,c.inflateEnd=n,c.inflateGetHeader=o,c.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(a,b){"use strict";var c=a("../utils/common"),d=15,e=852,f=592,g=0,h=1,i=2,j=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],k=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],l=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],m=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(a,b,n,o,p,q,r,s){var t,u,v,w,x,y,z,A,B,C=s.bits,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=null,O=0,P=new c.Buf16(d+1),Q=new c.Buf16(d+1),R=null,S=0;for(D=0;d>=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===h&&L>e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]<y?(A=0,B=r[E]):r[E]>y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<<D-J,u=1<<I,F=u;do u-=t,p[x+(M>>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<<D-1;M&t;)t>>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;G>I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<<I,a===h&&L>e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<<a.bi_valid&65535,f(a,a.bi_buf),a.bi_buf=b>>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function h(a,b,c){g(a,c[2*b],c[2*b+1])}function i(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<<ab[d];a++)gb[e++]=d;for(e>>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<<ab[d]-7;a++)gb[256+e++]=d;for(b=0;U>=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]<a[f]||a[e]===a[f]&&d[b]<=d[c]}function r(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&q(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!q(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function s(a,b,c){var d,f,i,j,k=0;if(0!==a.last_lit)do d=a.pending_buf[a.d_buf+2*k]<<8|a.pending_buf[a.d_buf+2*k+1],f=a.pending_buf[a.l_buf+k],k++,0===d?h(a,f,b):(i=hb[f],h(a,i+P+1,b),j=_[i],0!==j&&(f-=ib[i],g(a,f,j)),d--,i=e(d),h(a,i,c),j=ab[i],0!==j&&(d-=jb[i],g(a,d,j)));while(k<a.last_lit);h(a,X,b)}function t(a,b){var c,d,e,f=b.dyn_tree,g=b.stat_desc.static_tree,h=b.stat_desc.has_stree,i=b.stat_desc.elems,j=-1;for(a.heap_len=0,a.heap_max=T,c=0;i>c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(j>h?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++j<k&&e===i)){if(l>j){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ab=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)});'use strict';if(tr.isVinn){global.JSZip=global.window.JSZip;global.window=undefined;}else if(tr.isNode){const jsZipAbsPath=HTMLImportsLoader.hrefToAbsolutePath('/jszip.min.js');const jsZipModule=require(jsZipAbsPath);global.JSZip=jsZipModule;}'use strict';tr.exportTo('tr.e.importer',function(){function ZipImporter(model,eventData){if(eventData instanceof ArrayBuffer){eventData=new Uint8Array(eventData);}
-this.model_=model;this.eventData_=eventData;}
-ZipImporter.canImport=function(eventData){let header;if(eventData instanceof ArrayBuffer){header=new Uint8Array(eventData.slice(0,2));}else if(typeof(eventData)==='string'||eventData instanceof String){header=[eventData.charCodeAt(0),eventData.charCodeAt(1)];}else{return false;}
-return header[0]==='P'.charCodeAt(0)&&header[1]==='K'.charCodeAt(0);};ZipImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'ZipImporter';},isTraceDataContainer(){return true;},extractSubtraces(){const zip=new JSZip(this.eventData_);const subtraces=[];for(const idx in zip.files){subtraces.push(zip.files[idx].asBinary());}
-return subtraces;}};tr.importer.Importer.register(ZipImporter);return{ZipImporter,};});'use strict';tr.exportTo('tr.model',function(){function HeapEntry(heapDump,leafStackFrame,objectTypeName,size,count,valuesAreTotals){this.heapDump=heapDump;this.leafStackFrame=leafStackFrame;this.objectTypeName=objectTypeName;this.size=size;this.count=count;this.valuesAreTotals=valuesAreTotals;}
-function HeapDump(processMemoryDump,allocatorName,isComplete){this.processMemoryDump=processMemoryDump;this.allocatorName=allocatorName;this.isComplete=isComplete;this.entries=[];}
-HeapDump.prototype={addEntry(leafStackFrame,objectTypeName,size,count,opt_valuesAreTotals){if(opt_valuesAreTotals===undefined)opt_valuesAreTotals=true;const valuesAreTotals=opt_valuesAreTotals;const entry=new HeapEntry(this,leafStackFrame,objectTypeName,size,count,valuesAreTotals);this.entries.push(entry);return entry;}};return{HeapEntry,HeapDump,};});'use strict';tr.exportTo('tr.e.importer',function(){function HeapDumpTraceEventImporter(heapProfileExpander,stackFrames,processMemoryDump,idPrefix,model){this.expander=heapProfileExpander;this.stackFrames=stackFrames;this.processMemoryDump=processMemoryDump;this.idPrefix=idPrefix;this.model=model;}
-HeapDumpTraceEventImporter.prototype={getLeafStackFrame(stackFrameId){if(stackFrameId==='')return undefined;const parentId=this.idPrefix+stackFrameId;const id=parentId+':self';if(!this.stackFrames[id]){const parentStackFrame=this.stackFrames[parentId];const stackFrame=new tr.model.StackFrame(parentStackFrame,id,'<self>',undefined);this.model.addStackFrame(stackFrame);}
-return this.stackFrames[id];},parseEntry(entry,heapDump){const size=entry.size;const count=entry.count;const leafStackFrame=this.getLeafStackFrame(entry.node.id);const objectTypeName=entry.type.name;const valuesAreTotals=false;if(objectTypeName===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing object type name (ID '+typeId+')',});}
-heapDump.addEntry(leafStackFrame,objectTypeName,size,count,valuesAreTotals);},parse(){const heapDumps={};const inflated=this.expander.inflated;for(const[allocatorName,entries]of Object.entries(inflated)){const heapDump=new tr.model.HeapDump(this.processMemoryDump,allocatorName);for(const entry of entries){this.parseEntry(entry,heapDump);}
-heapDump.isComplete=true;heapDumps[allocatorName]=heapDump;}
-return heapDumps;},};return{HeapDumpTraceEventImporter,};});'use strict';tr.exportTo('tr.e.importer',function(){function LegacyHeapDumpTraceEventImporter(model,processMemoryDump,processObjectTypeNameMap,idPrefix,dumpId,rawHeapDumps){this.model_=model;this.processObjectTypeNameMap_=processObjectTypeNameMap;this.idPrefix_=idPrefix;this.processMemoryDump_=processMemoryDump;this.pid_=this.processMemoryDump_.process.pid;this.dumpId_=dumpId;this.rawHeapDumps_=rawHeapDumps;}
-LegacyHeapDumpTraceEventImporter.prototype={parseRawHeapDump(rawHeapDump,allocatorName){const model=this.model_;const processMemoryDump=this.processMemoryDump_;const heapDump=new tr.model.HeapDump(processMemoryDump,allocatorName);const entries=rawHeapDump.entries;if(entries===undefined||entries.length===0){this.model_.importWarning({type:'memory_dump_parse_error',message:'No heap entries in a '+allocatorName+' heap dump for PID='+this.pid_+' and dump ID='+this.dumpId_+'.'});return undefined;}
-const isOldFormat=entries[0].bt===undefined;if(!isOldFormat&&this.processObjectTypeNameMap_===undefined){return undefined;}
-for(let i=0;i<entries.length;i++){const entry=entries[i];const size=parseInt(entry.size,16);const leafStackFrameIndex=entry.bt;let leafStackFrame;if(isOldFormat){if(leafStackFrameIndex===undefined){leafStackFrame=undefined;}else{let leafStackFrameId=this.idPrefix_+leafStackFrameIndex;if(leafStackFrameIndex===''){leafStackFrame=undefined;}else{leafStackFrame=model.stackFrames[leafStackFrameId];if(leafStackFrame===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing leaf stack frame (ID '+
-leafStackFrameId+') of heap entry '+i+' (size '+
-size+') in a '+allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}}
-leafStackFrameId+=':self';if(model.stackFrames[leafStackFrameId]!==undefined){leafStackFrame=model.stackFrames[leafStackFrameId];}else{leafStackFrame=new tr.model.StackFrame(leafStackFrame,leafStackFrameId,'<self>',undefined);model.addStackFrame(leafStackFrame);}}}else{if(leafStackFrameIndex===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing stack frame ID of heap entry '+i+' (size '+size+') in a '+allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}
-const leafStackFrameId=this.idPrefix_+leafStackFrameIndex;if(leafStackFrameIndex===''){leafStackFrame=undefined;}else{leafStackFrame=model.stackFrames[leafStackFrameId];if(leafStackFrame===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing leaf stack frame (ID '+leafStackFrameId+') of heap entry '+i+' (size '+size+') in a '+
-allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}}}
-const objectTypeId=entry.type;let objectTypeName;if(objectTypeId===undefined){objectTypeName=undefined;}else if(this.processObjectTypeNameMap_===undefined){continue;}else{objectTypeName=this.processObjectTypeNameMap_[objectTypeId];if(objectTypeName===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing object type name (ID '+objectTypeId+') of heap entry '+i+' (size '+size+') in a '+
-allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}}
-const count=entry.count===undefined?undefined:parseInt(entry.count,16);heapDump.addEntry(leafStackFrame,objectTypeName,size,count);}
-return heapDump;},parse(){const heapDumps={};for(const allocatorName in this.rawHeapDumps_){const rawHeapDump=this.rawHeapDumps_[allocatorName];const heapDump=this.parseRawHeapDump(rawHeapDump,allocatorName);if(heapDump!==undefined&&heapDump.entries.length>0){heapDumps[allocatorName]=heapDump;}}
-return heapDumps;},};return{LegacyHeapDumpTraceEventImporter,};});'use strict';if(tr.isHeadless){global.window={};}
-(function(window,Object,Array,Error,JSON,undefined){var partialComplete=varArgs(function(fn,args){var numBoundArgs=args.length;return varArgs(function(callArgs){for(var i=0;i<callArgs.length;i++){args[numBoundArgs+i]=callArgs[i];}
-args.length=numBoundArgs+callArgs.length;return fn.apply(this,args);});}),compose=varArgs(function(fns){var fnsList=arrayAsList(fns);function next(params,curFn){return[apply(params,curFn)];}
-return varArgs(function(startParams){return foldR(next,startParams,fnsList)[0];});});function compose2(f1,f2){return function(){return f1.call(this,f2.apply(this,arguments));}}
-function attr(key){return function(o){return o[key];};}
-var lazyUnion=varArgs(function(fns){return varArgs(function(params){var maybeValue;for(var i=0;i<len(fns);i++){maybeValue=apply(params,fns[i]);if(maybeValue){return maybeValue;}}});});function apply(args,fn){return fn.apply(undefined,args);}
-function varArgs(fn){var numberOfFixedArguments=fn.length-1,slice=Array.prototype.slice;if(numberOfFixedArguments==0){return function(){return fn.call(this,slice.call(arguments));}}else if(numberOfFixedArguments==1){return function(){return fn.call(this,arguments[0],slice.call(arguments,1));}}
-var argsHolder=Array(fn.length);return function(){for(var i=0;i<numberOfFixedArguments;i++){argsHolder[i]=arguments[i];}
-argsHolder[numberOfFixedArguments]=slice.call(arguments,numberOfFixedArguments);return fn.apply(this,argsHolder);}}
-function flip(fn){return function(a,b){return fn(b,a);}}
-function lazyIntersection(fn1,fn2){return function(param){return fn1(param)&&fn2(param);};}
-function noop(){}
-function always(){return true}
-function functor(val){return function(){return val;}}
-function isOfType(T,maybeSomething){return maybeSomething&&maybeSomething.constructor===T;}
-var len=attr('length'),isString=partialComplete(isOfType,String);function defined(value){return value!==undefined;}
-function hasAllProperties(fieldList,o){return(o instanceof Object)&&all(function(field){return(field in o);},fieldList);}
-function cons(x,xs){return[x,xs];}
-var emptyList=null,head=attr(0),tail=attr(1);function arrayAsList(inputArray){return reverseList(inputArray.reduce(flip(cons),emptyList));}
-var list=varArgs(arrayAsList);function listAsArray(list){return foldR(function(arraySoFar,listItem){arraySoFar.unshift(listItem);return arraySoFar;},[],list);}
-function map(fn,list){return list?cons(fn(head(list)),map(fn,tail(list))):emptyList;}
-function foldR(fn,startValue,list){return list?fn(foldR(fn,startValue,tail(list)),head(list)):startValue;}
-function foldR1(fn,list){return tail(list)?fn(foldR1(fn,tail(list)),head(list)):head(list);}
-function without(list,test,removedFn){return withoutInner(list,removedFn||noop);function withoutInner(subList,removedFn){return subList?(test(head(subList))?(removedFn(head(subList)),tail(subList)):cons(head(subList),withoutInner(tail(subList),removedFn))):emptyList;}}
-function all(fn,list){return!list||(fn(head(list))&&all(fn,tail(list)));}
-function applyEach(fnList,args){if(fnList){head(fnList).apply(null,args);applyEach(tail(fnList),args);}}
-function reverseList(list){function reverseInner(list,reversedAlready){if(!list){return reversedAlready;}
-return reverseInner(tail(list),cons(head(list),reversedAlready))}
-return reverseInner(list,emptyList);}
-function first(test,list){return list&&(test(head(list))?head(list):first(test,tail(list)));}
-function clarinet(eventBus){"use strict";var
-emitSaxKey=eventBus(SAX_KEY).emit,emitValueOpen=eventBus(SAX_VALUE_OPEN).emit,emitValueClose=eventBus(SAX_VALUE_CLOSE).emit,emitFail=eventBus(FAIL_EVENT).emit,MAX_BUFFER_LENGTH=64*1024,stringTokenPattern=/[\\"\n]/g,_n=0,BEGIN=_n++,VALUE=_n++,OPEN_OBJECT=_n++,CLOSE_OBJECT=_n++,OPEN_ARRAY=_n++,CLOSE_ARRAY=_n++,STRING=_n++,OPEN_KEY=_n++,CLOSE_KEY=_n++,TRUE=_n++,TRUE2=_n++,TRUE3=_n++,FALSE=_n++,FALSE2=_n++,FALSE3=_n++,FALSE4=_n++,NULL=_n++,NULL2=_n++,NULL3=_n++,NUMBER_DECIMAL_POINT=_n++,NUMBER_DIGIT=_n,bufferCheckPosition=MAX_BUFFER_LENGTH,latestError,c,p,textNode=undefined,numberNode="",slashed=false,closed=false,state=BEGIN,stack=[],unicodeS=null,unicodeI=0,depth=0,position=0,column=0,line=1;function checkBufferLength(){var maxActual=0;if(textNode!==undefined&&textNode.length>MAX_BUFFER_LENGTH){emitError("Max buffer length exceeded: textNode");maxActual=Math.max(maxActual,textNode.length);}
-if(numberNode.length>MAX_BUFFER_LENGTH){emitError("Max buffer length exceeded: numberNode");maxActual=Math.max(maxActual,numberNode.length);}
-bufferCheckPosition=(MAX_BUFFER_LENGTH-maxActual)
-+position;}
-eventBus(STREAM_DATA).on(handleData);eventBus(STREAM_END).on(handleStreamEnd);function emitError(errorString){if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
-latestError=Error(errorString+"\nLn: "+line+"\nCol: "+column+"\nChr: "+c);emitFail(errorReport(undefined,undefined,latestError));}
-function handleStreamEnd(){if(state==BEGIN){emitValueOpen({});emitValueClose();closed=true;return;}
-if(state!==VALUE||depth!==0)
-emitError("Unexpected end");if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
-closed=true;}
-function whitespace(c){return c=='\r'||c=='\n'||c==' '||c=='\t';}
-function handleData(chunk){if(latestError)
-return;if(closed){return emitError("Cannot write after close");}
-var i=0;c=chunk[0];while(c){p=c;c=chunk[i++];if(!c)break;position++;if(c=="\n"){line++;column=0;}else column++;switch(state){case BEGIN:if(c==="{")state=OPEN_OBJECT;else if(c==="[")state=OPEN_ARRAY;else if(!whitespace(c))
-return emitError("Non-whitespace before {[.");continue;case OPEN_KEY:case OPEN_OBJECT:if(whitespace(c))continue;if(state===OPEN_KEY)stack.push(CLOSE_KEY);else{if(c==='}'){emitValueOpen({});emitValueClose();state=stack.pop()||VALUE;continue;}else stack.push(CLOSE_OBJECT);}
-if(c==='"')
-state=STRING;else
-return emitError("Malformed object key should start with \" ");continue;case CLOSE_KEY:case CLOSE_OBJECT:if(whitespace(c))continue;if(c===':'){if(state===CLOSE_OBJECT){stack.push(CLOSE_OBJECT);if(textNode!==undefined){emitValueOpen({});emitSaxKey(textNode);textNode=undefined;}
-depth++;}else{if(textNode!==undefined){emitSaxKey(textNode);textNode=undefined;}}
-state=VALUE;}else if(c==='}'){if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
-emitValueClose();depth--;state=stack.pop()||VALUE;}else if(c===','){if(state===CLOSE_OBJECT)
-stack.push(CLOSE_OBJECT);if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
-state=OPEN_KEY;}else
-return emitError('Bad object');continue;case OPEN_ARRAY:case VALUE:if(whitespace(c))continue;if(state===OPEN_ARRAY){emitValueOpen([]);depth++;state=VALUE;if(c===']'){emitValueClose();depth--;state=stack.pop()||VALUE;continue;}else{stack.push(CLOSE_ARRAY);}}
-if(c==='"')state=STRING;else if(c==='{')state=OPEN_OBJECT;else if(c==='[')state=OPEN_ARRAY;else if(c==='t')state=TRUE;else if(c==='f')state=FALSE;else if(c==='n')state=NULL;else if(c==='-'){numberNode+=c;}else if(c==='0'){numberNode+=c;state=NUMBER_DIGIT;}else if('123456789'.indexOf(c)!==-1){numberNode+=c;state=NUMBER_DIGIT;}else
-return emitError("Bad value");continue;case CLOSE_ARRAY:if(c===','){stack.push(CLOSE_ARRAY);if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
-state=VALUE;}else if(c===']'){if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
-emitValueClose();depth--;state=stack.pop()||VALUE;}else if(whitespace(c))
-continue;else
-return emitError('Bad array');continue;case STRING:if(textNode===undefined){textNode="";}
-var starti=i-1;STRING_BIGLOOP:while(true){while(unicodeI>0){unicodeS+=c;c=chunk.charAt(i++);if(unicodeI===4){textNode+=String.fromCharCode(parseInt(unicodeS,16));unicodeI=0;starti=i-1;}else{unicodeI++;}
-if(!c)break STRING_BIGLOOP;}
-if(c==='"'&&!slashed){state=stack.pop()||VALUE;textNode+=chunk.substring(starti,i-1);break;}
-if(c==='\\'&&!slashed){slashed=true;textNode+=chunk.substring(starti,i-1);c=chunk.charAt(i++);if(!c)break;}
-if(slashed){slashed=false;if(c==='n'){textNode+='\n';}
-else if(c==='r'){textNode+='\r';}
-else if(c==='t'){textNode+='\t';}
-else if(c==='f'){textNode+='\f';}
-else if(c==='b'){textNode+='\b';}
-else if(c==='u'){unicodeI=1;unicodeS='';}else{textNode+=c;}
-c=chunk.charAt(i++);starti=i-1;if(!c)break;else continue;}
-stringTokenPattern.lastIndex=i;var reResult=stringTokenPattern.exec(chunk);if(!reResult){i=chunk.length+1;textNode+=chunk.substring(starti,i-1);break;}
-i=reResult.index+1;c=chunk.charAt(reResult.index);if(!c){textNode+=chunk.substring(starti,i-1);break;}}
-continue;case TRUE:if(!c)continue;if(c==='r')state=TRUE2;else
-return emitError('Invalid true started with t'+c);continue;case TRUE2:if(!c)continue;if(c==='u')state=TRUE3;else
-return emitError('Invalid true started with tr'+c);continue;case TRUE3:if(!c)continue;if(c==='e'){emitValueOpen(true);emitValueClose();state=stack.pop()||VALUE;}else
-return emitError('Invalid true started with tru'+c);continue;case FALSE:if(!c)continue;if(c==='a')state=FALSE2;else
-return emitError('Invalid false started with f'+c);continue;case FALSE2:if(!c)continue;if(c==='l')state=FALSE3;else
-return emitError('Invalid false started with fa'+c);continue;case FALSE3:if(!c)continue;if(c==='s')state=FALSE4;else
-return emitError('Invalid false started with fal'+c);continue;case FALSE4:if(!c)continue;if(c==='e'){emitValueOpen(false);emitValueClose();state=stack.pop()||VALUE;}else
-return emitError('Invalid false started with fals'+c);continue;case NULL:if(!c)continue;if(c==='u')state=NULL2;else
-return emitError('Invalid null started with n'+c);continue;case NULL2:if(!c)continue;if(c==='l')state=NULL3;else
-return emitError('Invalid null started with nu'+c);continue;case NULL3:if(!c)continue;if(c==='l'){emitValueOpen(null);emitValueClose();state=stack.pop()||VALUE;}else
-return emitError('Invalid null started with nul'+c);continue;case NUMBER_DECIMAL_POINT:if(c==='.'){numberNode+=c;state=NUMBER_DIGIT;}else
-return emitError('Leading zero not followed by .');continue;case NUMBER_DIGIT:if('0123456789'.indexOf(c)!==-1)numberNode+=c;else if(c==='.'){if(numberNode.indexOf('.')!==-1)
-return emitError('Invalid number has two dots');numberNode+=c;}else if(c==='e'||c==='E'){if(numberNode.indexOf('e')!==-1||numberNode.indexOf('E')!==-1)
-return emitError('Invalid number has two exponential');numberNode+=c;}else if(c==="+"||c==="-"){if(!(p==='e'||p==='E'))
-return emitError('Invalid symbol in number');numberNode+=c;}else{if(numberNode){emitValueOpen(parseFloat(numberNode));emitValueClose();numberNode="";}
-i--;state=stack.pop()||VALUE;}
-continue;default:return emitError("Unknown state: "+state);}}
-if(position>=bufferCheckPosition)
-checkBufferLength();}}
-function ascentManager(oboeBus,handlers){"use strict";var listenerId={},ascent;function stateAfter(handler){return function(param){ascent=handler(ascent,param);}}
-for(var eventName in handlers){oboeBus(eventName).on(stateAfter(handlers[eventName]),listenerId);}
-oboeBus(NODE_SWAP).on(function(newNode){var oldHead=head(ascent),key=keyOf(oldHead),ancestors=tail(ascent),parentNode;if(ancestors){parentNode=nodeOf(head(ancestors));parentNode[key]=newNode;}});oboeBus(NODE_DROP).on(function(){var oldHead=head(ascent),key=keyOf(oldHead),ancestors=tail(ascent),parentNode;if(ancestors){parentNode=nodeOf(head(ancestors));delete parentNode[key];}});oboeBus(ABORTING).on(function(){for(var eventName in handlers){oboeBus(eventName).un(listenerId);}});}
-function parseResponseHeaders(headerStr){var headers={};headerStr&&headerStr.split('\u000d\u000a').forEach(function(headerPair){var index=headerPair.indexOf('\u003a\u0020');headers[headerPair.substring(0,index)]=headerPair.substring(index+2);});return headers;}
-function isCrossOrigin(pageLocation,ajaxHost){function defaultPort(protocol){return{'http:':80,'https:':443}[protocol];}
-function portOf(location){return location.port||defaultPort(location.protocol||pageLocation.protocol);}
-return!!((ajaxHost.protocol&&(ajaxHost.protocol!=pageLocation.protocol))||(ajaxHost.host&&(ajaxHost.host!=pageLocation.host))||(ajaxHost.host&&(portOf(ajaxHost)!=portOf(pageLocation))));}
-function parseUrlOrigin(url){var URL_HOST_PATTERN=/(\w+:)?(?:\/\/)([\w.-]+)?(?::(\d+))?\/?/,urlHostMatch=URL_HOST_PATTERN.exec(url)||[];return{protocol:urlHostMatch[1]||'',host:urlHostMatch[2]||'',port:urlHostMatch[3]||''};}
-function httpTransport(){return new XMLHttpRequest();}
-function streamingHttp(oboeBus,xhr,method,url,data,headers,withCredentials){"use strict";var emitStreamData=oboeBus(STREAM_DATA).emit,emitFail=oboeBus(FAIL_EVENT).emit,numberOfCharsAlreadyGivenToCallback=0,stillToSendStartEvent=true;oboeBus(ABORTING).on(function(){xhr.onreadystatechange=null;xhr.abort();});function handleProgress(){var textSoFar=xhr.responseText,newText=textSoFar.substr(numberOfCharsAlreadyGivenToCallback);if(newText){emitStreamData(newText);}
-numberOfCharsAlreadyGivenToCallback=len(textSoFar);}
-if('onprogress'in xhr){xhr.onprogress=handleProgress;}
-xhr.onreadystatechange=function(){function sendStartIfNotAlready(){try{stillToSendStartEvent&&oboeBus(HTTP_START).emit(xhr.status,parseResponseHeaders(xhr.getAllResponseHeaders()));stillToSendStartEvent=false;}catch(e){}}
-switch(xhr.readyState){case 2:case 3:return sendStartIfNotAlready();case 4:sendStartIfNotAlready();var successful=String(xhr.status)[0]==2;if(successful){handleProgress();oboeBus(STREAM_END).emit();}else{emitFail(errorReport(xhr.status,xhr.responseText));}}};try{xhr.open(method,url,true);for(var headerName in headers){xhr.setRequestHeader(headerName,headers[headerName]);}
-if(!isCrossOrigin(window.location,parseUrlOrigin(url))){xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');}
-xhr.withCredentials=withCredentials;xhr.send(data);}catch(e){window.setTimeout(partialComplete(emitFail,errorReport(undefined,undefined,e)),0);}}
-var jsonPathSyntax=(function(){var
-regexDescriptor=function regexDescriptor(regex){return regex.exec.bind(regex);},jsonPathClause=varArgs(function(componentRegexes){componentRegexes.unshift(/^/);return regexDescriptor(RegExp(componentRegexes.map(attr('source')).join('')));}),possiblyCapturing=/(\$?)/,namedNode=/([\w-_]+|\*)/,namePlaceholder=/()/,nodeInArrayNotation=/\["([^"]+)"\]/,numberedNodeInArrayNotation=/\[(\d+|\*)\]/,fieldList=/{([\w ]*?)}/,optionalFieldList=/(?:{([\w ]*?)})?/
-,jsonPathNamedNodeInObjectNotation=jsonPathClause(possiblyCapturing,namedNode,optionalFieldList),jsonPathNamedNodeInArrayNotation=jsonPathClause(possiblyCapturing,nodeInArrayNotation,optionalFieldList),jsonPathNumberedNodeInArrayNotation=jsonPathClause(possiblyCapturing,numberedNodeInArrayNotation,optionalFieldList),jsonPathPureDuckTyping=jsonPathClause(possiblyCapturing,namePlaceholder,fieldList),jsonPathDoubleDot=jsonPathClause(/\.\./),jsonPathDot=jsonPathClause(/\./),jsonPathBang=jsonPathClause(possiblyCapturing,/!/),emptyString=jsonPathClause(/$/);return function(fn){return fn(lazyUnion(jsonPathNamedNodeInObjectNotation,jsonPathNamedNodeInArrayNotation,jsonPathNumberedNodeInArrayNotation,jsonPathPureDuckTyping),jsonPathDoubleDot,jsonPathDot,jsonPathBang,emptyString);};}());function namedNode(key,node){return{key:key,node:node};}
-var keyOf=attr('key');var nodeOf=attr('node');var ROOT_PATH={};function incrementalContentBuilder(oboeBus){var emitNodeOpened=oboeBus(NODE_OPENED).emit,emitNodeClosed=oboeBus(NODE_CLOSED).emit,emitRootOpened=oboeBus(ROOT_PATH_FOUND).emit,emitRootClosed=oboeBus(ROOT_NODE_FOUND).emit;function arrayIndicesAreKeys(possiblyInconsistentAscent,newDeepestNode){var parentNode=nodeOf(head(possiblyInconsistentAscent));return isOfType(Array,parentNode)?keyFound(possiblyInconsistentAscent,len(parentNode),newDeepestNode):possiblyInconsistentAscent;}
-function nodeOpened(ascent,newDeepestNode){if(!ascent){emitRootOpened(newDeepestNode);return keyFound(ascent,ROOT_PATH,newDeepestNode);}
-var arrayConsistentAscent=arrayIndicesAreKeys(ascent,newDeepestNode),ancestorBranches=tail(arrayConsistentAscent),previouslyUnmappedName=keyOf(head(arrayConsistentAscent));appendBuiltContent(ancestorBranches,previouslyUnmappedName,newDeepestNode);return cons(namedNode(previouslyUnmappedName,newDeepestNode),ancestorBranches);}
-function appendBuiltContent(ancestorBranches,key,node){nodeOf(head(ancestorBranches))[key]=node;}
-function keyFound(ascent,newDeepestName,maybeNewDeepestNode){if(ascent){appendBuiltContent(ascent,newDeepestName,maybeNewDeepestNode);}
-var ascentWithNewPath=cons(namedNode(newDeepestName,maybeNewDeepestNode),ascent);emitNodeOpened(ascentWithNewPath);return ascentWithNewPath;}
-function nodeClosed(ascent){emitNodeClosed(ascent);return tail(ascent)||emitRootClosed(nodeOf(head(ascent)));}
-var contentBuilderHandlers={};contentBuilderHandlers[SAX_VALUE_OPEN]=nodeOpened;contentBuilderHandlers[SAX_VALUE_CLOSE]=nodeClosed;contentBuilderHandlers[SAX_KEY]=keyFound;return contentBuilderHandlers;}
-var jsonPathCompiler=jsonPathSyntax(function(pathNodeSyntax,doubleDotSyntax,dotSyntax,bangSyntax,emptySyntax){var CAPTURING_INDEX=1;var NAME_INDEX=2;var FIELD_LIST_INDEX=3;var headKey=compose2(keyOf,head),headNode=compose2(nodeOf,head);function nameClause(previousExpr,detection){var name=detection[NAME_INDEX],matchesName=(!name||name=='*')?always:function(ascent){return headKey(ascent)==name};return lazyIntersection(matchesName,previousExpr);}
-function duckTypeClause(previousExpr,detection){var fieldListStr=detection[FIELD_LIST_INDEX];if(!fieldListStr)
-return previousExpr;var hasAllrequiredFields=partialComplete(hasAllProperties,arrayAsList(fieldListStr.split(/\W+/))),isMatch=compose2(hasAllrequiredFields,headNode);return lazyIntersection(isMatch,previousExpr);}
-function capture(previousExpr,detection){var capturing=!!detection[CAPTURING_INDEX];if(!capturing)
-return previousExpr;return lazyIntersection(previousExpr,head);}
-function skip1(previousExpr){if(previousExpr==always){return always;}
-function notAtRoot(ascent){return headKey(ascent)!=ROOT_PATH;}
-return lazyIntersection(notAtRoot,compose2(previousExpr,tail));}
-function skipMany(previousExpr){if(previousExpr==always){return always;}
-var
-terminalCaseWhenArrivingAtRoot=rootExpr(),terminalCaseWhenPreviousExpressionIsSatisfied=previousExpr,recursiveCase=skip1(function(ascent){return cases(ascent);}),cases=lazyUnion(terminalCaseWhenArrivingAtRoot,terminalCaseWhenPreviousExpressionIsSatisfied,recursiveCase);return cases;}
-function rootExpr(){return function(ascent){return headKey(ascent)==ROOT_PATH;};}
-function statementExpr(lastClause){return function(ascent){var exprMatch=lastClause(ascent);return exprMatch===true?head(ascent):exprMatch;};}
-function expressionsReader(exprs,parserGeneratedSoFar,detection){return foldR(function(parserGeneratedSoFar,expr){return expr(parserGeneratedSoFar,detection);},parserGeneratedSoFar,exprs);}
-function generateClauseReaderIfTokenFound(tokenDetector,clauseEvaluatorGenerators,jsonPath,parserGeneratedSoFar,onSuccess){var detected=tokenDetector(jsonPath);if(detected){var compiledParser=expressionsReader(clauseEvaluatorGenerators,parserGeneratedSoFar,detected),remainingUnparsedJsonPath=jsonPath.substr(len(detected[0]));return onSuccess(remainingUnparsedJsonPath,compiledParser);}}
-function clauseMatcher(tokenDetector,exprs){return partialComplete(generateClauseReaderIfTokenFound,tokenDetector,exprs);}
-var clauseForJsonPath=lazyUnion(clauseMatcher(pathNodeSyntax,list(capture,duckTypeClause,nameClause,skip1)),clauseMatcher(doubleDotSyntax,list(skipMany)),clauseMatcher(dotSyntax,list()),clauseMatcher(bangSyntax,list(capture,rootExpr)),clauseMatcher(emptySyntax,list(statementExpr)),function(jsonPath){throw Error('"'+jsonPath+'" could not be tokenised')});function returnFoundParser(_remainingJsonPath,compiledParser){return compiledParser}
-function compileJsonPathToFunction(uncompiledJsonPath,parserGeneratedSoFar){var onFind=uncompiledJsonPath?compileJsonPathToFunction:returnFoundParser;return clauseForJsonPath(uncompiledJsonPath,parserGeneratedSoFar,onFind);}
-return function(jsonPath){try{return compileJsonPathToFunction(jsonPath,always);}catch(e){throw Error('Could not compile "'+jsonPath+'" because '+e.message);}}});function singleEventPubSub(eventType,newListener,removeListener){var listenerTupleList,listenerList;function hasId(id){return function(tuple){return tuple.id==id;};}
-return{on:function(listener,listenerId){var tuple={listener:listener,id:listenerId||listener};if(newListener){newListener.emit(eventType,listener,tuple.id);}
-listenerTupleList=cons(tuple,listenerTupleList);listenerList=cons(listener,listenerList);return this;},emit:function(){applyEach(listenerList,arguments);},un:function(listenerId){var removed;listenerTupleList=without(listenerTupleList,hasId(listenerId),function(tuple){removed=tuple;});if(removed){listenerList=without(listenerList,function(listener){return listener==removed.listener;});if(removeListener){removeListener.emit(eventType,removed.listener,removed.id);}}},listeners:function(){return listenerList;},hasListener:function(listenerId){var test=listenerId?hasId(listenerId):always;return defined(first(test,listenerTupleList));}};}
-function pubSub(){var singles={},newListener=newSingle('newListener'),removeListener=newSingle('removeListener');function newSingle(eventName){return singles[eventName]=singleEventPubSub(eventName,newListener,removeListener);}
-function pubSubInstance(eventName){return singles[eventName]||newSingle(eventName);}
-['emit','on','un'].forEach(function(methodName){pubSubInstance[methodName]=varArgs(function(eventName,parameters){apply(parameters,pubSubInstance(eventName)[methodName]);});});return pubSubInstance;}
-var
-_S=1,NODE_OPENED=_S++,NODE_CLOSED=_S++,NODE_SWAP=_S++,NODE_DROP=_S++,FAIL_EVENT='fail',ROOT_NODE_FOUND=_S++,ROOT_PATH_FOUND=_S++,HTTP_START='start',STREAM_DATA='data',STREAM_END='end',ABORTING=_S++,SAX_KEY=_S++,SAX_VALUE_OPEN=_S++,SAX_VALUE_CLOSE=_S++;function errorReport(statusCode,body,error){try{var jsonBody=JSON.parse(body);}catch(e){}
-return{statusCode:statusCode,body:body,jsonBody:jsonBody,thrown:error};}
-function patternAdapter(oboeBus,jsonPathCompiler){var predicateEventMap={node:oboeBus(NODE_CLOSED),path:oboeBus(NODE_OPENED)};function emitMatchingNode(emitMatch,node,ascent){var descent=reverseList(ascent);emitMatch(node,listAsArray(tail(map(keyOf,descent))),listAsArray(map(nodeOf,descent)));}
-function addUnderlyingListener(fullEventName,predicateEvent,compiledJsonPath){var emitMatch=oboeBus(fullEventName).emit;predicateEvent.on(function(ascent){var maybeMatchingMapping=compiledJsonPath(ascent);if(maybeMatchingMapping!==false){emitMatchingNode(emitMatch,nodeOf(maybeMatchingMapping),ascent);}},fullEventName);oboeBus('removeListener').on(function(removedEventName){if(removedEventName==fullEventName){if(!oboeBus(removedEventName).listeners()){predicateEvent.un(fullEventName);}}});}
-oboeBus('newListener').on(function(fullEventName){var match=/(node|path):(.*)/.exec(fullEventName);if(match){var predicateEvent=predicateEventMap[match[1]];if(!predicateEvent.hasListener(fullEventName)){addUnderlyingListener(fullEventName,predicateEvent,jsonPathCompiler(match[2]));}}})}
-function instanceApi(oboeBus,contentSource){var oboeApi,fullyQualifiedNamePattern=/^(node|path):./,rootNodeFinishedEvent=oboeBus(ROOT_NODE_FOUND),emitNodeDrop=oboeBus(NODE_DROP).emit,emitNodeSwap=oboeBus(NODE_SWAP).emit,addListener=varArgs(function(eventId,parameters){if(oboeApi[eventId]){apply(parameters,oboeApi[eventId]);}else{var event=oboeBus(eventId),listener=parameters[0];if(fullyQualifiedNamePattern.test(eventId)){addForgettableCallback(event,listener);}else{event.on(listener);}}
-return oboeApi;}),removeListener=function(eventId,p2,p3){if(eventId=='done'){rootNodeFinishedEvent.un(p2);}else if(eventId=='node'||eventId=='path'){oboeBus.un(eventId+':'+p2,p3);}else{var listener=p2;oboeBus(eventId).un(listener);}
-return oboeApi;};function addProtectedCallback(eventName,callback){oboeBus(eventName).on(protectedCallback(callback),callback);return oboeApi;}
-function addForgettableCallback(event,callback,listenerId){listenerId=listenerId||callback;var safeCallback=protectedCallback(callback);event.on(function(){var discard=false;oboeApi.forget=function(){discard=true;};apply(arguments,safeCallback);delete oboeApi.forget;if(discard){event.un(listenerId);}},listenerId);return oboeApi;}
-function protectedCallback(callback){return function(){try{return callback.apply(oboeApi,arguments);}catch(e){setTimeout(function(){throw new Error(e.message);});}}}
-function fullyQualifiedPatternMatchEvent(type,pattern){return oboeBus(type+':'+pattern);}
-function wrapCallbackToSwapNodeIfSomethingReturned(callback){return function(){var returnValueFromCallback=callback.apply(this,arguments);if(defined(returnValueFromCallback)){if(returnValueFromCallback==oboe.drop){emitNodeDrop();}else{emitNodeSwap(returnValueFromCallback);}}}}
-function addSingleNodeOrPathListener(eventId,pattern,callback){var effectiveCallback;if(eventId=='node'){effectiveCallback=wrapCallbackToSwapNodeIfSomethingReturned(callback);}else{effectiveCallback=callback;}
-addForgettableCallback(fullyQualifiedPatternMatchEvent(eventId,pattern),effectiveCallback,callback);}
-function addMultipleNodeOrPathListeners(eventId,listenerMap){for(var pattern in listenerMap){addSingleNodeOrPathListener(eventId,pattern,listenerMap[pattern]);}}
-function addNodeOrPathListenerApi(eventId,jsonPathOrListenerMap,callback){if(isString(jsonPathOrListenerMap)){addSingleNodeOrPathListener(eventId,jsonPathOrListenerMap,callback);}else{addMultipleNodeOrPathListeners(eventId,jsonPathOrListenerMap);}
-return oboeApi;}
-oboeBus(ROOT_PATH_FOUND).on(function(rootNode){oboeApi.root=functor(rootNode);});oboeBus(HTTP_START).on(function(_statusCode,headers){oboeApi.header=function(name){return name?headers[name]:headers;}});return oboeApi={on:addListener,addListener:addListener,removeListener:removeListener,emit:oboeBus.emit,node:partialComplete(addNodeOrPathListenerApi,'node'),path:partialComplete(addNodeOrPathListenerApi,'path'),done:partialComplete(addForgettableCallback,rootNodeFinishedEvent),start:partialComplete(addProtectedCallback,HTTP_START),fail:oboeBus(FAIL_EVENT).on,abort:oboeBus(ABORTING).emit,write:oboeBus(STREAM_DATA).emit,finish:oboeBus(STREAM_END).emit,header:noop,root:noop,source:contentSource};}
-function wire(httpMethodName,contentSource,body,headers,withCredentials){var oboeBus=pubSub();if(contentSource){streamingHttp(oboeBus,httpTransport(),httpMethodName,contentSource,body,headers,withCredentials);}
-clarinet(oboeBus);ascentManager(oboeBus,incrementalContentBuilder(oboeBus));patternAdapter(oboeBus,jsonPathCompiler);return instanceApi(oboeBus,contentSource);}
-function applyDefaults(passthrough,url,httpMethodName,body,headers,withCredentials,cached){headers=headers?JSON.parse(JSON.stringify(headers)):{};if(body){if(!isString(body)){body=JSON.stringify(body);headers['Content-Type']=headers['Content-Type']||'application/json';}}else{body=null;}
-function modifiedUrl(baseUrl,cached){if(cached===false){if(baseUrl.indexOf('?')==-1){baseUrl+='?';}else{baseUrl+='&';}
-baseUrl+='_='+new Date().getTime();}
-return baseUrl;}
-return passthrough(httpMethodName||'GET',modifiedUrl(url,cached),body,headers,withCredentials||false);}
-function oboe(arg1){var nodeStreamMethodNames=list('resume','pause','pipe'),isStream=partialComplete(hasAllProperties,nodeStreamMethodNames);if(arg1){if(isStream(arg1)||isString(arg1)){return applyDefaults(wire,arg1);}else{return applyDefaults(wire,arg1.url,arg1.method,arg1.body,arg1.headers,arg1.withCredentials,arg1.cached);}}else{return wire();}}
-oboe.drop=function(){return oboe.drop;};if(typeof define==="function"&&define.amd){define("oboe",[],function(){return oboe;});}else if(typeof exports==='object'){module.exports=oboe;}else{window.oboe=oboe;}})((function(){try{return window;}catch(e){return self;}}()),Object,Array,Error,JSON);'use strict';if(tr.isVinn){global.oboe=global.window.oboe;global.window=undefined;}else if(tr.isNode){global.window=undefined;const path=HTMLImportsLoader.hrefToAbsolutePath('/oboe/dist/oboe-node.js');global.oboe=require(path);}'use strict';tr.exportTo('tr.e.importer',function(){const STRING_ID_SUFFIX='_sid';const PLURAL_STRING_ID_SUFFIX='_sids';function isStringReference(s){return s.endsWith(STRING_ID_SUFFIX)||s.endsWith(PLURAL_STRING_ID_SUFFIX);}
-function getStringReferenceName(name){if(name.endsWith(PLURAL_STRING_ID_SUFFIX)){return name.slice(0,-PLURAL_STRING_ID_SUFFIX.length);}
-return name.slice(0,-STRING_ID_SUFFIX.length);}
-function deferenceStrings(idToString,o){const clone=Object.assign({},o);for(const[key,value]of Object.entries(clone)){if(isStringReference(key)){const name=getStringReferenceName(key);clone[name]=idToString(value);}}
-return clone;}
-function singularize(word){if(word.endsWith('s')){return word.slice(0,-1);}
-return word;}
-function getMetadataPairs(dataJson){const isMetadata=v=>typeof v!=='object'||Array.isArray(v);const pairs=Object.entries(dataJson);const metadataPairs=pairs.filter(([_,v])=>isMetadata(v));return metadataPairs;}
-function getGroupPairs(dataJson){const pairs=Object.entries(dataJson);const nonMapPairs=pairs.filter(([k,_])=>k!=='maps');const groupPairs=nonMapPairs.filter(([_,v])=>typeof v==='object');return groupPairs;}
-function createMap(mapJson){const map=new Map();for(const entry of mapJson){if(entry.id===undefined){throw new Error('Missing required key "id" in streaming event.');}
-map.set(entry.id,entry);}
-return map;}
-function createMaps(mapsJson){const maps=new Map();for(const[name,mapJson]of Object.entries(mapsJson)){maps.set(name,createMap(mapJson));}
-return maps;}
-function createGroup(groupJson,opt_startTime){const entries=[];const n=Object.values(groupJson)[0].length;for(let i=0;i<n;i++){const entry={};for(const name in groupJson){entry[name]=groupJson[name][i];}
-entries.push(entry);}
-const timeDelta=groupJson.timeDelta;if(opt_startTime===undefined&&timeDelta!==undefined){throw new Error('Missing required key "startTime" in streaming event.');}
-if(opt_startTime){let delta=0;for(const entry of entries){delta+=entry.timeDelta?entry.timeDelta:0;entry.time=opt_startTime+delta;}}
-return entries;}
-function createGroups(groupsJson,opt_startTime){const groups=new Map();for(const[name,groupJson]of Object.entries(groupsJson)){groups.set(name,createGroup(groupJson,opt_startTime));}
-return groups;}
-function createMetadata(metadataPairs){const metadata=new Map();for(const[name,value]of metadataPairs){metadata.set(name,value);}
-if(metadata.get('version')===undefined){throw new Error('Missing required key "version" in streaming event.');}
-return metadata;}
-class ProfilingDictionaryReader{constructor(opt_metadata,opt_maps,opt_groups,opt_parent){this.metadata=opt_metadata||new Map();this.maps=opt_maps||new Map();this.groups=opt_groups||new Map();this.parent_=opt_parent||undefined;this.inflated_=undefined;this.raw_=undefined;this.boundGetString_=this.getString.bind(this);this.deferenceStrings_=o=>deferenceStrings(this.boundGetString_,o);}
-static empty(){return new ProfilingDictionaryReader();}
-get parent(){return this.parent_;}
-get raw(){if(this.raw_)return this.raw_;this.raw_={};for(const[name,group]of this.groups.entries()){this.raw_[name]=group;}
-return this.raw_;}
-get inflated(){if(this.inflated_)return this.inflated_;this.inflated_={};for(const[name,group]of this.groups.entries()){this.inflated_[name]=this.inflateGroup(group);}
-return this.inflated_;}
-getNewMap(name){return this.maps.get(name)||new Map();}
-getMapValue(mapName,id){let value=this.getNewMap(mapName).get(id);if(value===undefined&&this.parent){value=this.parent.getMapValue(mapName,id);}
-return value;}
-getString(id){const value=this.getMapValue('strings',id);if(value===undefined)return undefined;return value.string;}
-hasMap(name){if(this.maps.has(name))return true;if(this.parent===undefined)return false;return this.parent.hasMap(name);}
-inflateGroup(group){return group.map(this.inflateEntry.bind(this));}
-inflateEntry(entry){const inflatedEntry={};for(const[name,value]of Object.entries(entry)){let inflatedValue;if(this.hasMap(name)){const id=value;inflatedValue=this.deferenceStrings_(this.getMapValue(name,id));}else{inflatedValue=value;}
-inflatedEntry[singularize(name)]=inflatedValue;}
-return this.deferenceStrings_(inflatedEntry);}
-expandData(data){const mapsJson=data.maps||{};const groupsJson=data.allocators||{};const metadataPairs=getMetadataPairs(data);const metadata=createMetadata(metadataPairs);const opt_startTime=metadata.get('startTime');const maps=createMaps(mapsJson);const groups=createGroups(groupsJson,opt_startTime);return new ProfilingDictionaryReader(metadata,maps,groups,this);}
-expandEvent(event){return this.expandData(event.args.data);}}
-return{ProfilingDictionaryReader,singularize,deferenceStringsForTest:deferenceStrings,};});'use strict';tr.exportTo('tr.model.source_info',function(){function SourceInfo(file,opt_line,opt_column){this.file_=file;this.line_=opt_line||-1;this.column_=opt_column||-1;}
-SourceInfo.prototype={get file(){return this.file_;},get line(){return this.line_;},get column(){return this.column_;},get domain(){if(!this.file_)return undefined;const domain=this.file_.match(/(.*:\/\/[^:\/]*)/i);return domain?domain[1]:undefined;},toString(){let str='';if(this.file_){str+=this.file_;}
-if(this.line_>0){str+=':'+this.line_;}
-if(this.column_>0){str+=':'+this.column_;}
-return str;}};return{SourceInfo,};});'use strict';tr.exportTo('tr.model.source_info',function(){function JSSourceInfo(file,line,column,isNative,scriptId,state){tr.model.source_info.SourceInfo.call(this,file,line,column);this.isNative_=isNative;this.scriptId_=scriptId;this.state_=state;}
-JSSourceInfo.prototype={__proto__:tr.model.source_info.SourceInfo.prototype,get state(){return this.state_;},get isNative(){return this.isNative_;},get scriptId(){return this.scriptId_;},toString(){const str=this.isNative_?'[native v8] ':'';return str+
-tr.model.source_info.SourceInfo.prototype.toString.call(this);}};const JSSourceState={COMPILED:'compiled',OPTIMIZABLE:'optimizable',OPTIMIZED:'optimized',UNKNOWN:'unknown',};return{JSSourceInfo,JSSourceState,};});'use strict';tr.exportTo('tr.e.importer',function(){function TraceCodeEntry(address,size,name,scriptId){this.id_=tr.b.GUID.allocateSimple();this.address_=address;this.size_=size;const rePrefix=/^(\w*:)?([*~]?)(.*)$/m;const tokens=rePrefix.exec(name);const prefix=tokens[1];let state=tokens[2];const body=tokens[3];if(state==='*'){state=tr.model.source_info.JSSourceState.OPTIMIZED;}else if(state==='~'){state=tr.model.source_info.JSSourceState.OPTIMIZABLE;}else if(state===''){state=tr.model.source_info.JSSourceState.COMPILED;}else{state=tr.model.source_info.JSSourceState.UNKNOWN;}
-let rawName;let rawUrl;if(prefix==='Script:'){rawName='';rawUrl=body;}else{const spacePos=body.lastIndexOf(' ');rawName=spacePos!==-1?body.substr(0,spacePos):body;rawUrl=spacePos!==-1?body.substr(spacePos+1):'';}
-function splitLineAndColumn(url){const lineColumnRegEx=/(?::(\d+))?(?::(\d+))?$/;const lineColumnMatch=lineColumnRegEx.exec(url);let lineNumber;let columnNumber;if(typeof(lineColumnMatch[1])==='string'){lineNumber=parseInt(lineColumnMatch[1],10);lineNumber=isNaN(lineNumber)?undefined:lineNumber-1;}
-if(typeof(lineColumnMatch[2])==='string'){columnNumber=parseInt(lineColumnMatch[2],10);columnNumber=isNaN(columnNumber)?undefined:columnNumber-1;}
-return{url:url.substring(0,url.length-lineColumnMatch[0].length),lineNumber,columnNumber};}
-const nativeSuffix=' native';const isNative=rawName.endsWith(nativeSuffix);this.name_=isNative?rawName.slice(0,-nativeSuffix.length):rawName;const urlData=splitLineAndColumn(rawUrl);const url=urlData.url||'';const line=urlData.lineNumber||0;const column=urlData.columnNumber||0;this.sourceInfo_=new tr.model.source_info.JSSourceInfo(url,line,column,isNative,scriptId,state);}
-TraceCodeEntry.prototype={get id(){return this.id_;},get sourceInfo(){return this.sourceInfo_;},get name(){return this.name_;},set address(address){this.address_=address;},get address(){return this.address_;},set size(size){this.size_=size;},get size(){return this.size_;}};return{TraceCodeEntry,};});'use strict';tr.exportTo('tr.e.importer',function(){function TraceCodeMap(){this.banks_=new Map();}
-TraceCodeMap.prototype={addEntry(addressHex,size,name,scriptId){const entry=new tr.e.importer.TraceCodeEntry(this.getAddress_(addressHex),size,name,scriptId);this.addEntry_(addressHex,entry);},moveEntry(oldAddressHex,newAddressHex,size){const entry=this.getBank_(oldAddressHex).removeEntry(this.getAddress_(oldAddressHex));if(!entry)return;entry.address=this.getAddress_(newAddressHex);entry.size=size;this.addEntry_(newAddressHex,entry);},lookupEntry(addressHex){return this.getBank_(addressHex).lookupEntry(this.getAddress_(addressHex));},addEntry_(addressHex,entry){this.getBank_(addressHex).addEntry(entry);},getAddress_(addressHex){const bankSizeHexDigits=13;addressHex=addressHex.slice(2);return parseInt(addressHex.slice(-bankSizeHexDigits),16);},getBank_(addressHex){addressHex=addressHex.slice(2);const bankSizeHexDigits=13;const maxHexDigits=16;const bankName=addressHex.slice(-maxHexDigits,-bankSizeHexDigits);let bank=this.banks_.get(bankName);if(!bank){bank=new TraceCodeBank();this.banks_.set(bankName,bank);}
-return bank;}};function TraceCodeBank(){this.entries_=[];}
-TraceCodeBank.prototype={removeEntry(address){if(this.entries_.length===0)return undefined;const index=tr.b.findLowIndexInSortedArray(this.entries_,function(entry){return entry.address;},address);const entry=this.entries_[index];if(!entry||entry.address!==address)return undefined;this.entries_.splice(index,1);return entry;},lookupEntry(address){const index=tr.b.findFirstTrueIndexInSortedArray(this.entries_,e=>(address<e.address))-1;const entry=this.entries_[index];return entry&&address<entry.address+entry.size?entry:undefined;},addEntry(newEntry){if(this.entries_.length===0){this.entries_.push(newEntry);}
-const endAddress=newEntry.address+newEntry.size;const lastIndex=tr.b.findLowIndexInSortedArray(this.entries_,function(entry){return entry.address;},endAddress);let index;for(index=lastIndex-1;index>=0;--index){const entry=this.entries_[index];const entryEndAddress=entry.address+entry.size;if(entryEndAddress<=newEntry.address)break;}
-++index;this.entries_.splice(index,lastIndex-index,newEntry);}};return{TraceCodeMap,};});'use strict';tr.exportTo('tr.e.measure',function(){const AsyncSlice=tr.model.AsyncSlice;const MEASURE_NAME_REGEX=/([^\/:]+):(.*?)(?:\/([A-Za-z0-9+/]+=?=?))?$/;function MeasureAsyncSlice(){this.groupTitle_='Ungrouped Measure';const matched=MEASURE_NAME_REGEX.exec(arguments[1]);if(matched!==null){arguments[1]=matched[2];this.groupTitle_=matched[1];}
-AsyncSlice.apply(this,arguments);}
-MeasureAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get viewSubGroupTitle(){return this.groupTitle_;},get title(){return this.title_;},set title(title){this.title_=title;}};AsyncSlice.subTypes.register(MeasureAsyncSlice,{categoryParts:['blink.user_timing']});return{MEASURE_NAME_REGEX,MeasureAsyncSlice,};});'use strict';tr.exportTo('tr.importer',function(){function ContextProcessor(model){this.model_=model;this.activeContexts_=[];this.stackPerType_={};this.contextCache_={};this.contextSetCache_={};this.cachedEntryForActiveContexts_=undefined;this.seenSnapshots_={};}
-ContextProcessor.prototype={enterContext(contextType,scopedId){const newActiveContexts=[this.getOrCreateContext_(contextType,scopedId),];for(const oldContext of this.activeContexts_){if(oldContext.type===contextType){this.pushContext_(oldContext);}else{newActiveContexts.push(oldContext);}}
-this.activeContexts_=newActiveContexts;this.cachedEntryForActiveContexts_=undefined;},leaveContext(contextType,scopedId){this.leaveContextImpl_(context=>context.type===contextType&&context.snapshot.scope===scopedId.scope&&context.snapshot.idRef===scopedId.id);},destroyContext(scopedId){for(const stack of Object.values(this.stackPerType_)){let newLength=0;for(let i=0;i<stack.length;++i){if(stack[i].snapshot.scope!==scopedId.scope||stack[i].snapshot.idRef!==scopedId.id){stack[newLength++]=stack[i];}}
-stack.length=newLength;}
-this.leaveContextImpl_(context=>context.snapshot.scope===scopedId.scope&&context.snapshot.idRef===scopedId.id);},leaveContextImpl_(predicate){const newActiveContexts=[];for(const oldContext of this.activeContexts_){if(predicate(oldContext)){const previousContext=this.popContext_(oldContext.type);if(previousContext){newActiveContexts.push(previousContext);}}else{newActiveContexts.push(oldContext);}}
-this.activeContexts_=newActiveContexts;this.cachedEntryForActiveContexts_=undefined;},getOrCreateContext_(contextType,scopedId){const context={type:contextType,snapshot:{scope:scopedId.scope,idRef:scopedId.id}};const key=this.getContextKey_(context);if(key in this.contextCache_){return this.contextCache_[key];}
-this.contextCache_[key]=context;const snapshotKey=this.getSnapshotKey_(scopedId);this.seenSnapshots_[snapshotKey]=true;return context;},pushContext_(context){if(!(context.type in this.stackPerType_)){this.stackPerType_[context.type]=[];}
-this.stackPerType_[context.type].push(context);},popContext_(contextType){if(!(contextType in this.stackPerType_)){return undefined;}
-return this.stackPerType_[contextType].pop();},getContextKey_(context){return[context.type,context.snapshot.scope,context.snapshot.idRef].join('\x00');},getSnapshotKey_(scopedId){return[scopedId.scope,scopedId.idRef].join('\x00');},get activeContexts(){if(this.cachedEntryForActiveContexts_===undefined){let key=[];for(const context of this.activeContexts_){key.push(this.getContextKey_(context));}
-key.sort();key=key.join('\x00');if(key in this.contextSetCache_){this.cachedEntryForActiveContexts_=this.contextSetCache_[key];}else{this.activeContexts_.sort(function(a,b){const keyA=this.getContextKey_(a);const keyB=this.getContextKey_(b);if(keyA<keyB){return-1;}
-if(keyA>keyB){return 1;}
-return 0;}.bind(this));this.contextSetCache_[key]=Object.freeze(this.activeContexts_);this.cachedEntryForActiveContexts_=this.contextSetCache_[key];}}
-return this.cachedEntryForActiveContexts_;},invalidateContextCacheForSnapshot(scopedId){const snapshotKey=this.getSnapshotKey_(scopedId);if(!(snapshotKey in this.seenSnapshots_))return;this.contextCache_={};this.contextSetCache_={};this.cachedEntryForActiveContexts_=undefined;this.activeContexts_=this.activeContexts_.map(function(context){if(context.snapshot.scope!==scopedId.scope||context.snapshot.idRef!==scopedId.id){return context;}
-return{type:context.type,snapshot:{scope:context.snapshot.scope,idRef:context.snapshot.idRef}};});this.seenSnapshots_={};},};return{ContextProcessor,};});'use strict';tr.exportTo('tr.model',function(){function Annotation(){this.guid_=tr.b.GUID.allocateSimple();this.view_=undefined;}
-Annotation.fromDictIfPossible=function(args){if(args.typeName===undefined){throw new Error('Missing typeName argument');}
-const typeInfo=Annotation.findTypeInfoMatching(function(typeInfo){return typeInfo.metadata.typeName===args.typeName;});if(typeInfo===undefined)return undefined;return typeInfo.constructor.fromDict(args);};Annotation.fromDict=function(){throw new Error('Not implemented');};Annotation.prototype={get guid(){return this.guid_;},onRemove(){},toDict(){throw new Error('Not implemented');},getOrCreateView(viewport){if(!this.view_){this.view_=this.createView_(viewport);}
-return this.view_;},createView_(){throw new Error('Not implemented');}};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(Annotation,options);Annotation.addEventListener('will-register',function(e){if(!e.typeInfo.constructor.hasOwnProperty('fromDict')){throw new Error('Must have fromDict method');}
-if(!e.typeInfo.metadata.typeName){throw new Error('Registered Annotations must provide typeName');}});return{Annotation,};});'use strict';tr.exportTo('tr.model',function(){function YComponent(stableId,yPercentOffset){this.stableId=stableId;this.yPercentOffset=yPercentOffset;}
-YComponent.prototype={toDict(){return{stableId:this.stableId,yPercentOffset:this.yPercentOffset};}};function Location(xWorld,yComponents){this.xWorld_=xWorld;this.yComponents_=yComponents;}
-Location.fromViewCoordinates=function(viewport,viewX,viewY){const dt=viewport.currentDisplayTransform;const xWorld=dt.xViewToWorld(viewX);const yComponents=[];let elem=document.elementFromPoint(viewX+viewport.modelTrackContainer.canvas.offsetLeft,viewY+viewport.modelTrackContainer.canvas.offsetTop);while(elem instanceof tr.ui.tracks.Track){if(elem.eventContainer){const boundRect=elem.getBoundingClientRect();const yPercentOffset=(viewY-boundRect.top)/boundRect.height;yComponents.push(new YComponent(elem.eventContainer.stableId,yPercentOffset));}
-elem=elem.parentElement;}
-if(yComponents.length===0)return;return new Location(xWorld,yComponents);};Location.fromStableIdAndTimestamp=function(viewport,stableId,ts){const xWorld=ts;const yComponents=[];const containerToTrack=viewport.containerToTrackMap;let elem=containerToTrack.getTrackByStableId(stableId);if(!elem)return;const firstY=elem.getBoundingClientRect().top;while(elem instanceof tr.ui.tracks.Track){if(elem.eventContainer){const boundRect=elem.getBoundingClientRect();const yPercentOffset=(firstY-boundRect.top)/boundRect.height;yComponents.push(new YComponent(elem.eventContainer.stableId,yPercentOffset));}
-elem=elem.parentElement;}
-if(yComponents.length===0)return;return new Location(xWorld,yComponents);};Location.prototype={get xWorld(){return this.xWorld_;},getContainingTrack(viewport){const containerToTrack=viewport.containerToTrackMap;for(const i in this.yComponents_){const yComponent=this.yComponents_[i];const track=containerToTrack.getTrackByStableId(yComponent.stableId);if(track!==undefined)return track;}},toViewCoordinates(viewport){const dt=viewport.currentDisplayTransform;const containerToTrack=viewport.containerToTrackMap;const viewX=dt.xWorldToView(this.xWorld_);let viewY=-1;for(const index in this.yComponents_){const yComponent=this.yComponents_[index];const track=containerToTrack.getTrackByStableId(yComponent.stableId);if(track!==undefined){const boundRect=track.getBoundingClientRect();viewY=yComponent.yPercentOffset*boundRect.height+boundRect.top;break;}}
-return{viewX,viewY};},toDict(){return{xWorld:this.xWorld_,yComponents:this.yComponents_};}};return{Location,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function AnnotationView(viewport,annotation){}
-AnnotationView.prototype={draw(ctx){throw new Error('Not implemented');}};return{AnnotationView,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function RectAnnotationView(viewport,annotation){this.viewport_=viewport;this.annotation_=annotation;}
-RectAnnotationView.prototype={__proto__:tr.ui.annotations.AnnotationView.prototype,draw(ctx){const dt=this.viewport_.currentDisplayTransform;const startCoords=this.annotation_.startLocation.toViewCoordinates(this.viewport_);const endCoords=this.annotation_.endLocation.toViewCoordinates(this.viewport_);let startY=startCoords.viewY-ctx.canvas.getBoundingClientRect().top;const sizeY=endCoords.viewY-startCoords.viewY;if(startY+sizeY<0){startY=sizeY;}else if(startY<0){startY=0;}
-ctx.fillStyle=this.annotation_.fillStyle;ctx.fillRect(startCoords.viewX,startY,endCoords.viewX-startCoords.viewX,sizeY);}};return{RectAnnotationView,};});'use strict';tr.exportTo('tr.model',function(){function RectAnnotation(start,end){tr.model.Annotation.apply(this,arguments);this.startLocation_=start;this.endLocation_=end;this.fillStyle='rgba(255, 180, 0, 0.3)';}
-RectAnnotation.fromDict=function(dict){const args=dict.args;const startLoc=new tr.model.Location(args.start.xWorld,args.start.yComponents);const endLoc=new tr.model.Location(args.end.xWorld,args.end.yComponents);return new tr.model.RectAnnotation(startLoc,endLoc);};RectAnnotation.prototype={__proto__:tr.model.Annotation.prototype,get startLocation(){return this.startLocation_;},get endLocation(){return this.endLocation_;},toDict(){return{typeName:'rect',args:{start:this.startLocation.toDict(),end:this.endLocation.toDict()}};},createView_(viewport){return new tr.ui.annotations.RectAnnotationView(viewport,this);}};tr.model.Annotation.register(RectAnnotation,{typeName:'rect'});return{RectAnnotation,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function CommentBoxAnnotationView(viewport,annotation){this.viewport_=viewport;this.annotation_=annotation;this.textArea_=undefined;this.styleWidth=250;this.styleHeight=50;this.fontSize=10;this.rightOffset=50;this.topOffset=25;}
-CommentBoxAnnotationView.prototype={__proto__:tr.ui.annotations.AnnotationView.prototype,removeTextArea(){Polymer.dom(Polymer.dom(this.textArea_).parentNode).removeChild(this.textArea_);},draw(ctx){const coords=this.annotation_.location.toViewCoordinates(this.viewport_);if(coords.viewX<0){if(this.textArea_){this.textArea_.style.visibility='hidden';}
-return;}
-if(!this.textArea_){this.textArea_=document.createElement('textarea');this.textArea_.style.position='absolute';this.textArea_.readOnly=true;this.textArea_.value=this.annotation_.text;this.textArea_.style.zIndex=1;Polymer.dom(Polymer.dom(ctx.canvas).parentNode).appendChild(this.textArea_);}
-this.textArea_.style.width=this.styleWidth+'px';this.textArea_.style.height=this.styleHeight+'px';this.textArea_.style.fontSize=this.fontSize+'px';this.textArea_.style.visibility='visible';this.textArea_.style.left=coords.viewX+ctx.canvas.getBoundingClientRect().left+
-this.rightOffset+'px';this.textArea_.style.top=coords.viewY-ctx.canvas.getBoundingClientRect().top-
-this.topOffset+'px';ctx.strokeStyle='rgb(0, 0, 0)';ctx.lineWidth=2;ctx.beginPath();tr.ui.b.drawLine(ctx,coords.viewX,coords.viewY-ctx.canvas.getBoundingClientRect().top,coords.viewX+this.rightOffset,coords.viewY-this.topOffset-
-ctx.canvas.getBoundingClientRect().top);ctx.stroke();}};return{CommentBoxAnnotationView,};});'use strict';tr.exportTo('tr.model',function(){function CommentBoxAnnotation(location,text){tr.model.Annotation.apply(this,arguments);this.location=location;this.text=text;}
-CommentBoxAnnotation.fromDict=function(dict){const args=dict.args;const location=new tr.model.Location(args.location.xWorld,args.location.yComponents);return new tr.model.CommentBoxAnnotation(location,args.text);};CommentBoxAnnotation.prototype={__proto__:tr.model.Annotation.prototype,onRemove(){this.view_.removeTextArea();},toDict(){return{typeName:'comment_box',args:{text:this.text,location:this.location.toDict()}};},createView_(viewport){return new tr.ui.annotations.CommentBoxAnnotationView(viewport,this);}};tr.model.Annotation.register(CommentBoxAnnotation,{typeName:'comment_box'});return{CommentBoxAnnotation,};});'use strict';tr.exportTo('tr.model',function(){function ScopedId(scope,id,pid){if(scope===undefined){throw new Error('Scope should be defined. Use \''+
-tr.model.OBJECT_DEFAULT_SCOPE+'\' as the default scope.');}
-this.scope=scope;this.id=id;this.pid=pid;}
-ScopedId.prototype={toString(){const pidStr=this.pid===undefined?'':'pid: '+this.pid+', ';return'{'+pidStr+'scope: '+this.scope+', id: '+this.id+'}';},toStringWithDelimiter(delim){return(this.pid===undefined?'':this.pid)+delim+
-this.scope+delim+this.id;}};return{ScopedId,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function XMarkerAnnotationView(viewport,annotation){this.viewport_=viewport;this.annotation_=annotation;}
-XMarkerAnnotationView.prototype={__proto__:tr.ui.annotations.AnnotationView.prototype,draw(ctx){const dt=this.viewport_.currentDisplayTransform;const viewX=dt.xWorldToView(this.annotation_.timestamp);ctx.beginPath();tr.ui.b.drawLine(ctx,viewX,0,viewX,ctx.canvas.height);ctx.strokeStyle=this.annotation_.strokeStyle;ctx.stroke();}};return{XMarkerAnnotationView,};});'use strict';tr.exportTo('tr.model',function(){function XMarkerAnnotation(timestamp){tr.model.Annotation.apply(this,arguments);this.timestamp=timestamp;this.strokeStyle='rgba(0, 0, 255, 0.5)';}
-XMarkerAnnotation.fromDict=function(dict){return new XMarkerAnnotation(dict.args.timestamp);};XMarkerAnnotation.prototype={__proto__:tr.model.Annotation.prototype,toDict(){return{typeName:'xmarker',args:{timestamp:this.timestamp}};},createView_(viewport){return new tr.ui.annotations.XMarkerAnnotationView(viewport,this);}};tr.model.Annotation.register(XMarkerAnnotation,{typeName:'xmarker'});return{XMarkerAnnotation,};});'use strict';tr.exportTo('tr.e.importer',function(){const Base64=tr.b.Base64;const deepCopy=tr.b.deepCopy;const ColorScheme=tr.b.ColorScheme;const HeapDumpTraceEventImporter=tr.e.importer.HeapDumpTraceEventImporter;const LegacyHeapDumpTraceEventImporter=tr.e.importer.LegacyHeapDumpTraceEventImporter;const StreamingEventExpander=tr.e.importer.StreamingEventExpander;const ProfilingDictionaryReader=tr.e.importer.ProfilingDictionaryReader;const MEASURE_NAME_REGEX=tr.e.measure.MEASURE_NAME_REGEX;function getEventColor(event,opt_customName){if(event.cname){return ColorScheme.getColorIdForReservedName(event.cname);}else if(opt_customName||event.name){return ColorScheme.getColorIdForGeneralPurposeString(opt_customName||event.name);}}
-function isLegacyChromeClockSyncEvent(event){return event.name!==undefined&&event.name.startsWith(LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX)&&((event.ph==='S')||(event.ph==='F'));}
-const PRODUCER='producer';const CONSUMER='consumer';const STEP='step';const BACKGROUND=tr.model.ContainerMemoryDump.LevelOfDetail.BACKGROUND;const LIGHT=tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT;const DETAILED=tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED;const MEMORY_DUMP_LEVEL_OF_DETAIL_ORDER=[undefined,BACKGROUND,LIGHT,DETAILED];const GLOBAL_MEMORY_ALLOCATOR_DUMP_PREFIX='global/';const LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX='ClockSyncEvent.';const BYTE_STAT_NAME_MAP={'pc':'privateCleanResident','pd':'privateDirtyResident','sc':'sharedCleanResident','sd':'sharedDirtyResident','pss':'proportionalResident','sw':'swapped'};const WEAK_MEMORY_ALLOCATOR_DUMP_FLAG=1<<0;const OBJECT_TYPE_NAME_PATTERNS=[{prefix:'const char *WTF::getStringWithTypeName() [T = ',suffix:']'},{prefix:'const char* WTF::getStringWithTypeName() [with T = ',suffix:']'},{prefix:'const char *__cdecl WTF::getStringWithTypeName<',suffix:'>(void)'}];const SUBTRACE_FIELDS=new Set(['powerTraceAsString','systemTraceEvents','androidProcessDump','cgroupDump',]);const NON_METADATA_FIELDS=new Set(['displayTimeUnit','samples','stackFrames','traceAnnotations','traceEvents',...SUBTRACE_FIELDS]);function TraceEventImporter(model,eventData){this.hasEvents_=undefined;this.importPriority=1;this.model_=model;this.events_=undefined;this.sampleEvents_=undefined;this.stackFrameEvents_=undefined;this.stackFrameTree_=new tr.model.ProfileTree();this.subtraces_=[];this.eventsWereFromString_=false;this.softwareMeasuredCpuCount_=undefined;this.allAsyncEvents_=[];this.allFlowEvents_=[];this.allObjectEvents_=[];this.contextProcessorPerThread={};this.traceEventSampleStackFramesByName_={};this.v8ProcessCodeMaps_={};this.v8ProcessRootStackFrame_={};this.v8SamplingData_=[];this.profileTrees_=new Map();this.profileInfo_=new Map();this.legacyChromeClockSyncStartEvent_=undefined;this.legacyChromeClockSyncFinishEvent_=undefined;this.allMemoryDumpEvents_={};this.heapProfileExpander=new ProfilingDictionaryReader();this.objectTypeNameMap_={};this.clockDomainId_=tr.model.ClockDomainId.UNKNOWN_CHROME_LEGACY;this.toModelTime_=undefined;if(typeof(eventData)==='string'||eventData instanceof String){eventData=eventData.trim();if(eventData[0]==='['){eventData=eventData.replace(/\s*,\s*$/,'');if(eventData[eventData.length-1]!==']'){eventData=eventData+']';}}
-this.events_=JSON.parse(eventData);this.eventsWereFromString_=true;}else{this.events_=eventData;}
-if(this.events_.traceEvents){const container=this.events_;this.events_=this.events_.traceEvents;for(const subtraceField of SUBTRACE_FIELDS){if(container[subtraceField]){this.storeSubtrace_(container[subtraceField]);}}
-this.storeSamples_(container.samples);this.storeStackFrames_(container.stackFrames);this.storeDisplayTimeUnit_(container.displayTimeUnit);this.storeTraceAnnotations_(container.traceAnnotations);this.storeMetadata_(container);}else if(this.events_ instanceof tr.b.TraceStream){const parser=oboe().node('{cat ph}',function(e){return oboe.drop;}).node('!.powerTraceAsString',this.storeSubtrace_.bind(this)).node('!.systemTraceEvents',this.storeSubtrace_.bind(this)).node('!.samples',this.storeSamples_.bind(this)).node('!.stackFrames',this.storeStackFrames_.bind(this)).node('!.displayTimeUnit',this.storeDisplayTimeUnit_.bind(this)).node('!.traceAnnotations',this.storeTraceAnnotations_.bind(this)).done(this.storeMetadata_.bind(this));this.events_.rewind();while(this.events_.hasData){parser.write(this.events_.readNumBytes());}
-parser.finish();}}
-TraceEventImporter.canImport=function(eventData){if(eventData instanceof tr.b.TraceStream){if(eventData.isBinary)return false;eventData=eventData.header;}
-if(typeof(eventData)==='string'||eventData instanceof String){eventData=eventData.trim();return eventData[0]==='{'||eventData[0]==='[';}
-if(eventData instanceof Array&&eventData.length&&eventData[0].ph){return true;}
-if(eventData.traceEvents){if(eventData.traceEvents instanceof Array){if(eventData.traceEvents.length&&eventData.traceEvents[0].ph){return true;}
-if(eventData.samples&&eventData.samples.length&&eventData.stackFrames!==undefined){return true;}}}
-return false;};TraceEventImporter.scopedIdForEvent_=function(event){const scope=event.scope||tr.model.OBJECT_DEFAULT_SCOPE;let pid=undefined;if(event.id!==undefined){if(event.id2!==undefined){throw new Error('Event has both id and id2');}
-pid=tr.model.LOCAL_ID_PHASES.has(event.ph)?event.pid:undefined;return new tr.model.ScopedId(scope,event.id,pid);}else if(event.id2!==undefined){if(event.id2.global!==undefined){return new tr.model.ScopedId(scope,event.id2.global);}else if(event.id2.local!==undefined){return new tr.model.ScopedId(scope,event.id2.local,event.pid);}
-throw new Error('Event that uses id2 must have either a global or local ID');}
-return undefined;};TraceEventImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'TraceEventImporter';},extractSubtraces(){const subtraces=this.subtraces_;this.subtraces_=[];return subtraces;},deepCopyIfNeeded_(obj){if(obj===undefined)obj={};if(this.eventsWereFromString_)return obj;return deepCopy(obj);},deepCopyAlways_(obj){if(obj===undefined)obj={};return deepCopy(obj);},processAsyncEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.allAsyncEvents_.push({sequenceNumber:this.allAsyncEvents_.length,event,thread});},processFlowEvent(event,opt_slice){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.allFlowEvents_.push({refGuid:tr.b.GUID.getLastSimpleGuid(),sequenceNumber:this.allFlowEvents_.length,event,slice:opt_slice,thread});},processCounterEvent(event){let ctrName;if(event.id!==undefined){ctrName=event.name+'['+event.id+']';}else{ctrName=event.name;}
-const ctr=this.model_.getOrCreateProcess(event.pid).getOrCreateCounter(event.cat,ctrName);const reservedColorId=event.cname?getEventColor(event):undefined;if(ctr.numSeries===0){for(const seriesName in event.args){const colorId=reservedColorId||getEventColor(event,ctr.name+'.'+seriesName);ctr.addSeries(new tr.model.CounterSeries(seriesName,colorId));}
-if(ctr.numSeries===0){this.model_.importWarning({type:'counter_parse_error',message:'Expected counter '+event.name+' to have at least one argument to use as a value.'});delete ctr.parent.counters[ctr.name];return;}}
-const ts=this.toModelTimeFromUs_(event.ts);ctr.series.forEach(function(series){const val=event.args[series.name]?event.args[series.name]:0;series.addCounterSample(ts,val);});},processObjectEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.allObjectEvents_.push({sequenceNumber:this.allObjectEvents_.length,event,thread});if(thread.guid in this.contextProcessorPerThread){const processor=this.contextProcessorPerThread[thread.guid];const scopedId=TraceEventImporter.scopedIdForEvent_(event);if(event.ph==='D'){processor.destroyContext(scopedId);}
-processor.invalidateContextCacheForSnapshot(scopedId);}},processContextEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);if(!(thread.guid in this.contextProcessorPerThread)){this.contextProcessorPerThread[thread.guid]=new tr.importer.ContextProcessor(this.model_);}
-const scopedId=TraceEventImporter.scopedIdForEvent_(event);const contextType=event.name;const processor=this.contextProcessorPerThread[thread.guid];if(event.ph==='('){processor.enterContext(contextType,scopedId);}else if(event.ph===')'){processor.leaveContext(contextType,scopedId);}else{this.model_.importWarning({type:'unknown_context_phase',message:'Unknown context event phase: '+event.ph+'.'});}},setContextsFromThread_(thread,slice){if(thread.guid in this.contextProcessorPerThread){slice.contexts=this.contextProcessorPerThread[thread.guid].activeContexts;}},processDurationEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);const ts=this.toModelTimeFromUs_(event.ts);if(event.dur===0&&!thread.sliceGroup.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'duration_parse_error',message:'Timestamps are moving backward.'});return;}
-if(event.ph==='B'){const slice=thread.sliceGroup.beginSlice(event.cat,event.name,this.toModelTimeFromUs_(event.ts),this.deepCopyIfNeeded_(event.args),this.toModelTimeFromUs_(event.tts),event.argsStripped,getEventColor(event),event.bind_id);slice.startStackFrame=this.getStackFrameForEvent_(event);this.setContextsFromThread_(thread,slice);}else if(event.ph==='I'||event.ph==='i'||event.ph==='R'){if(event.s!==undefined&&event.s!=='t'){throw new Error('This should never happen');}
-thread.sliceGroup.beginSlice(event.cat,event.name,this.toModelTimeFromUs_(event.ts),this.deepCopyIfNeeded_(event.args),this.toModelTimeFromUs_(event.tts),event.argsStripped,getEventColor(event),event.bind_id);const slice=thread.sliceGroup.endSlice(this.toModelTimeFromUs_(event.ts),this.toModelTimeFromUs_(event.tts));slice.startStackFrame=this.getStackFrameForEvent_(event);slice.endStackFrame=undefined;}else{if(!thread.sliceGroup.openSliceCount){this.model_.importWarning({type:'duration_parse_error',message:'E phase event without a matching B phase event.'});return;}
-const slice=thread.sliceGroup.endSlice(this.toModelTimeFromUs_(event.ts),this.toModelTimeFromUs_(event.tts),getEventColor(event));if(event.name&&slice.title!==event.name){this.model_.importWarning({type:'title_match_error',message:'Titles do not match. Title is '+
-slice.title+' in openSlice, and is '+
-event.name+' in endSlice'});}
-slice.endStackFrame=this.getStackFrameForEvent_(event);this.mergeArgsInto_(slice.args,event.args,slice.title);}},mergeArgsInto_(dstArgs,srcArgs,eventName){for(const arg in srcArgs){if(dstArgs[arg]!==undefined){this.model_.importWarning({type:'arg_merge_error',message:'Different phases of '+eventName+' provided values for argument '+arg+'.'+' The last provided value will be used.'});}
-dstArgs[arg]=this.deepCopyIfNeeded_(srcArgs[arg]);}},processCompleteEvent(event){if(event.cat!==undefined&&event.cat.indexOf('trace_event_overhead')>-1){return undefined;}
-const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);if(event.flow_out){if(event.flow_in){event.flowPhase=STEP;}else{event.flowPhase=PRODUCER;}}else if(event.flow_in){event.flowPhase=CONSUMER;}
-const slice=thread.sliceGroup.pushCompleteSlice(event.cat,event.name,this.toModelTimeFromUs_(event.ts),this.durationFromUs_(event.dur),this.maybeToModelTimeFromUs_(event.tts),this.durationFromUs_(event.tdur),this.deepCopyIfNeeded_(event.args),event.argsStripped,getEventColor(event),event.bind_id);slice.startStackFrame=this.getStackFrameForEvent_(event);slice.endStackFrame=this.getStackFrameForEvent_(event,true);this.setContextsFromThread_(thread,slice);return slice;},processJitCodeEvent(event){if(this.v8ProcessCodeMaps_[event.pid]===undefined){this.v8ProcessCodeMaps_[event.pid]=new tr.e.importer.TraceCodeMap();}
-const map=this.v8ProcessCodeMaps_[event.pid];const data=event.args.data;if(event.name==='JitCodeMoved'){map.moveEntry(data.code_start,data.new_code_start,data.code_len);}else{map.addEntry(data.code_start,data.code_len,data.name,data.script_id);}},processMetadataEvent(event){if(event.name==='JitCodeAdded'||event.name==='JitCodeMoved'){this.v8SamplingData_.push(event);return;}
-if(event.argsStripped)return;if(event.name==='process_name'){const process=this.model_.getOrCreateProcess(event.pid);process.name=event.args.name;}else if(event.name==='process_labels'){const process=this.model_.getOrCreateProcess(event.pid);const stackFrames=event.args.stackFrames;if(event.args.labels===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'No labels found in a \''+event.name+'\' metadata event'});}else{const labels=event.args.labels.split(',');for(let i=0;i<labels.length;i++){process.addLabelIfNeeded(labels[i]);}}}else if(event.name==='process_uptime_seconds'){const process=this.model_.getOrCreateProcess(event.pid);process.uptime_seconds=event.args.uptime;}else if(event.name==='process_sort_index'){const process=this.model_.getOrCreateProcess(event.pid);process.sortIndex=event.args.sort_index;}else if(event.name==='thread_name'){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);thread.name=event.args.name;}else if(event.name==='thread_sort_index'){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);thread.sortIndex=event.args.sort_index;}else if(event.name==='num_cpus'){let n=event.args.number;if(this.softwareMeasuredCpuCount_!==undefined){n=Math.max(n,this.softwareMeasuredCpuCount_);}
-this.softwareMeasuredCpuCount_=n;}else if(event.name==='stackFrames'){const stackFrames=event.args.stackFrames;if(stackFrames===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'No stack frames found in a \''+event.name+'\' metadata event'});}else{this.importStackFrames_(stackFrames,'p'+event.pid+':');}}else if(event.name==='typeNames'){const objectTypeNameMap=event.args.typeNames;if(objectTypeNameMap===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'No mapping from object type IDs to names found in a \''+
-event.name+'\' metadata event'});}else{this.importObjectTypeNameMap_(objectTypeNameMap,event.pid);}}else if(event.name==='TraceConfig'){this.model_.metadata.push({name:'TraceConfig',value:event.args.value});}else{this.model_.importWarning({type:'metadata_parse_error',message:'Unrecognized metadata name: '+event.name});}},processInstantEvent(event){if(event.name==='JitCodeAdded'||event.name==='JitCodeMoved'){this.v8SamplingData_.push(event);return;}
-if(event.s==='t'||event.s===undefined){this.processDurationEvent(event);return;}
-let constructor;let parent;switch(event.s){case'g':constructor=tr.model.GlobalInstantEvent;parent=this.model_;break;case'p':constructor=tr.model.ProcessInstantEvent;parent=this.model_.getOrCreateProcess(event.pid);break;default:this.model_.importWarning({type:'instant_parse_error',message:'I phase event with unknown "s" field value.'});return;}
-const instantEvent=new constructor(event.cat,event.name,getEventColor(event),this.toModelTimeFromUs_(event.ts),this.deepCopyIfNeeded_(event.args),parent);parent.instantEvents.push(instantEvent);},getOrCreateProfileTree_(sampleType,id){if(!this.profileTrees_.has(sampleType)){this.profileTrees_.set(sampleType,new Map());}
-const profileTreeMap=this.profileTrees_.get(sampleType);if(profileTreeMap.has(id)){return profileTreeMap.get(id);}
-const profileTree=new tr.model.ProfileTree();profileTreeMap.set(id,profileTree);const info=this.profileInfo_.get(id);if(info!==undefined){profileTree.startTime=info.startTime;profileTree.pid=info.pid;profileTree.tid=info.tid;}
-return profileTree;},processSample(event){if(event.args===undefined||event.args.data===undefined){return;}
-if(event.id===undefined){throw new Error('No event ID in sample');}
-const data=event.args.data;if(data.startTime!==undefined){this.profileInfo_.set(`${event.pid} ${event.id}`,{startTime:data.startTime,pid:event.pid,tid:event.tid});}
-const timeDeltas=data.timeDeltas;for(const sampleType in data){if(sampleType==='timeDeltas'||sampleType==='startTime'){continue;}
-if(data[sampleType].samples&&timeDeltas&&data[sampleType].samples.length!==timeDeltas.length){throw new Error('samples and timeDeltas array should have same length');}
-const profileTree=this.getOrCreateProfileTree_(sampleType,`${event.pid} ${event.id}`);const nodes=data[sampleType].nodes;const samples=data[sampleType].samples;if(nodes!==undefined){for(const node of nodes){const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,sampleType);const profileNode=ProfileNodeType.constructFromObject(profileTree,node);if(profileNode===undefined){continue;}
-profileTree.add(profileNode);}}
-if(samples!==undefined){const thread=this.model_.getOrCreateProcess(profileTree.pid).getOrCreateThread(profileTree.tid);for(let i=0,len=samples.length;i<len;++i){const node=profileTree.getNode(samples[i]);profileTree.endTime+=timeDeltas[i];if(node===undefined)continue;const start=this.toModelTimeFromUs_(profileTree.endTime);this.model_.samples.push(new tr.model.Sample(start,node.sampleTitle,node,thread));}}}},processLegacyV8Sample(event){const data=event.args.data;const sampleType='legacySample';const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,sampleType);if(data.vm_state==='js'&&!data.stack.length)return;const profileTree=this.getOrCreateProfileTree_(sampleType,event.pid);if(profileTree.getNode(-1)===undefined){profileTree.add(new ProfileNodeType(-1,{url:'',scriptId:-1,functionName:'unknown'},undefined));}
-let node=undefined;if(data.stack.length>0&&this.v8ProcessCodeMaps_[event.pid]){const map=this.v8ProcessCodeMaps_[event.pid];data.stack.reverse();let parentNode=undefined;for(let i=0;i<data.stack.length;i++){const entry=map.lookupEntry(data.stack[i]);if(entry===undefined){node=profileTree.getNode(-1);}else{node=profileTree.getNode(entry.id);if(node===undefined){const sourceInfo=entry.sourceInfo;node=new ProfileNodeType(entry.id,{functionName:entry.name,url:entry.sourceInfo.file,lineNumber:sourceInfo.line!==-1?sourceInfo.line:undefined,columnNumber:sourceInfo.column!==-1?sourceInfo.column:undefined,scriptid:entry.sourceInfo.scriptId},parentNode);profileTree.add(node);}}
-parentNode=node;}}else{node=profileTree.getNode(data.vm_state);if(node===undefined){node=new ProfileNodeType(data.vm_state,{url:'',functionName:data.vm_state},undefined);profileTree.add(node);}}
-const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.model_.samples.push(new tr.model.Sample(this.toModelTimeFromUs_(event.ts),node.sampleTitle,node,thread));},processTraceSampleEvent(event){if(event.name==='V8Sample'||event.name.startsWith('Profile')){this.v8SamplingData_.push(event);return;}
-let node=this.stackFrameTree_.getNode(event.name);if(node===undefined&&event.sf!==undefined){node=this.stackFrameTree_.getNode('g'+event.sf);}
-if(node===undefined){let id=event.name;if(event.sf){id='g'+event.sf;}
-const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,'legacySample');node=this.stackFrameTree_.add(new ProfileNodeType(id,{functionName:event.name},undefined));}
-const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);const sample=new tr.model.Sample(this.toModelTimeFromUs_(event.ts),'Trace Event Sample',node,thread,undefined,1,this.deepCopyIfNeeded_(event.args));this.setContextsFromThread_(thread,sample);this.model_.samples.push(sample);},processMemoryDumpEvent(event){if(event.ph!=='v'){throw new Error('Invalid memory dump event phase "'+event.ph+'".');}
-const dumpId=event.id;if(dumpId===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory dump event (phase \''+event.ph+'\') without a dump ID.'});return;}
-const pid=event.pid;if(pid===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory dump event (phase\''+event.ph+'\', dump ID \''+
-dumpId+'\') without a PID.'});return;}
-const allEvents=this.allMemoryDumpEvents_;let dumpIdEvents=allEvents[dumpId];if(dumpIdEvents===undefined){allEvents[dumpId]=dumpIdEvents={};}
-let processEvents=dumpIdEvents[pid];if(processEvents===undefined){dumpIdEvents[pid]=processEvents=[];}
-processEvents.push(event);},processClockSyncEvent(event){if(event.ph!=='c'){throw new Error('Invalid clock sync event phase "'+event.ph+'".');}
-const syncId=event.args.sync_id;if(syncId===undefined){this.model_.importWarning({type:'clock_sync_parse_error',message:'Clock sync at time '+event.ts+' without an ID.'});return;}
-if(event.args&&event.args.issue_ts!==undefined){this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,syncId,tr.b.Unit.timestampFromUs(event.args.issue_ts),tr.b.Unit.timestampFromUs(event.ts));}else{this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,syncId,tr.b.Unit.timestampFromUs(event.ts));}},processLegacyChromeClockSyncEvent(event){if(event.ph==='S'){this.legacyChromeClockSyncStartEvent_=event;}else if(event.ph==='F'){this.legacyChromeClockSyncFinishEvent_=event;}
-if(this.legacyChromeClockSyncStartEvent_===undefined||this.legacyChromeClockSyncFinishEvent_===undefined){return;}
-const startSyncId=this.legacyChromeClockSyncStartEvent_.name.substring(LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX.length);const finishSyncId=this.legacyChromeClockSyncFinishEvent_.name.substring(LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX.length);if(startSyncId!==finishSyncId){throw new Error('Inconsistent clock sync ID of legacy Chrome clock sync events');}
-this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,startSyncId,tr.b.Unit.timestampFromUs(this.legacyChromeClockSyncStartEvent_.ts),tr.b.Unit.timestampFromUs(this.legacyChromeClockSyncFinishEvent_.ts));},processV8Events(){this.v8SamplingData_.sort(function(a,b){if(a.ts!==b.ts)return a.ts-b.ts;if(a.ph==='M'||a.ph==='I'){return-1;}else if(b.ph==='M'||b.ph==='I'){return 1;}
-return 0;});const length=this.v8SamplingData_.length;for(let i=0;i<length;++i){const event=this.v8SamplingData_[i];if(event.ph==='M'||event.ph==='I'){this.processJitCodeEvent(event);}else if(event.ph==='P'){if(event.name.startsWith('Profile')){this.processSample(event);}else{this.processLegacyV8Sample(event);}}}},importClockSyncMarkers(){if(this.events_ instanceof tr.b.TraceStream){const parser=oboe().node('{cat ph}',this.importClockSyncMarker_.bind(this));this.events_.rewind();while(this.events_.hasData){parser.write(this.events_.readNumBytes());}
-parser.finish();}else{for(let i=0;i<this.events_.length;i++){this.importClockSyncMarker_(this.events_[i]);}}},importClockSyncMarker_(event){const isLegacyChromeClockSync=isLegacyChromeClockSyncEvent(event);if(event.ph!=='c'&&!isLegacyChromeClockSync)return;const eventSizeInBytes=this.model_.importOptions.trackDetailedModelStats?JSON.stringify(event).length:undefined;this.model_.stats.willProcessBasicTraceEvent('clock_sync',event.cat,event.name,event.ts,eventSizeInBytes);if(isLegacyChromeClockSync){this.processLegacyChromeClockSyncEvent(event);}else{this.processClockSyncEvent(event);}},importEvents(){this.hasEvents_=false;if(this.stackFrameEvents_){this.importStackFrames_(this.stackFrameEvents_,'g');}
-if(this.traceAnnotations_)this.importAnnotations_();if(this.events_ instanceof tr.b.TraceStream){const parser=oboe().node('{cat ph}',this.processEvent_.bind(this));this.events_.rewind();while(this.events_.hasData){parser.write(this.events_.readNumBytes());}
-parser.finish();}else{for(let eI=0;eI<this.events_.length;eI++){this.processEvent_(this.events_[eI]);}}
-this.createAsyncSlices_();this.processV8Events();for(const frame of Object.values(this.v8ProcessRootStackFrame_)){frame.removeAllChildren();}},storeSubtrace_(subtrace){this.subtraces_.push(subtrace);return oboe.drop;},storeSamples_(samples){this.sampleEvents_=samples;return oboe.drop;},storeStackFrames_(stackFrames){this.stackFrameEvents_=stackFrames;return oboe.drop;},storeDisplayTimeUnit_(unitName){if(!unitName)return;const unit=tr.b.TimeDisplayModes[unitName];if(unit===undefined){throw new Error('Unit '+unitName+' is not supported.');}
-this.model_.intrinsicTimeUnit=unit;return oboe.drop;},storeTraceAnnotations_(traceAnnotations){this.traceAnnotations_=traceAnnotations;return oboe.drop;},storeMetadata_(container){for(const fieldName of Object.keys(container)){if(NON_METADATA_FIELDS.has(fieldName))continue;this.model_.metadata.push({name:fieldName,value:container[fieldName]});if(fieldName!=='metadata')continue;const metadata=container[fieldName];if(metadata['highres-ticks']){this.model_.isTimeHighResolution=metadata['highres-ticks'];}
-if(metadata['clock-domain']){this.clockDomainId_=metadata['clock-domain'];}}
-return oboe.drop;},processEvent_(event){this.hasEvents_=true;const importOptions=this.model_.importOptions;const trackDetailedModelStats=importOptions.trackDetailedModelStats;const modelStats=this.model_.stats;if(event.args==='__stripped__'){event.argsStripped=true;event.args=undefined;}
-let eventSizeInBytes=undefined;if(trackDetailedModelStats){eventSizeInBytes=JSON.stringify(event).length;}
-switch(event.ph){case'B':case'E':modelStats.willProcessBasicTraceEvent('begin_end (non-compact)',event.cat,event.name,event.ts,eventSizeInBytes);this.processDurationEvent(event);break;case'X':{modelStats.willProcessBasicTraceEvent('begin_end (compact)',event.cat,event.name,event.ts,eventSizeInBytes);const slice=this.processCompleteEvent(event);if(slice!==undefined&&event.bind_id!==undefined){this.processFlowEvent(event,slice);}
-break;}
-case'b':case'e':case'n':case'S':case'F':case'T':case'p':modelStats.willProcessBasicTraceEvent('async',event.cat,event.name,event.ts,eventSizeInBytes);this.processAsyncEvent(event);break;case'I':case'i':case'R':modelStats.willProcessBasicTraceEvent('instant',event.cat,event.name,event.ts,eventSizeInBytes);this.processInstantEvent(event);break;case'P':modelStats.willProcessBasicTraceEvent('samples',event.cat,event.name,event.ts,eventSizeInBytes);this.processTraceSampleEvent(event);break;case'C':modelStats.willProcessBasicTraceEvent('counters',event.cat,event.name,event.ts,eventSizeInBytes);this.processCounterEvent(event);break;case'M':modelStats.willProcessBasicTraceEvent('metadata',event.cat,event.name,event.ts,eventSizeInBytes);this.processMetadataEvent(event);break;case'N':case'D':case'O':modelStats.willProcessBasicTraceEvent('objects',event.cat,event.name,event.ts,eventSizeInBytes);this.processObjectEvent(event);break;case's':case't':case'f':modelStats.willProcessBasicTraceEvent('flows',event.cat,event.name,event.ts,eventSizeInBytes);this.processFlowEvent(event);break;case'v':modelStats.willProcessBasicTraceEvent('memory_dumps',event.cat,event.name,event.ts,eventSizeInBytes);this.processMemoryDumpEvent(event);break;case'(':case')':this.processContextEvent(event);break;case'c':break;default:modelStats.willProcessBasicTraceEvent('unknown',event.cat,event.name,event.ts,eventSizeInBytes);this.model_.importWarning({type:'parse_error',message:'Unrecognized event phase: '+
-event.ph+' ('+event.name+')'});}
-return oboe.drop;},importStackFrames_(rawStackFrames,idPrefix){const model=this.model_;for(const id in rawStackFrames){const rawStackFrame=rawStackFrames[id];const fullId=idPrefix+id;const textForColor=rawStackFrame.category?rawStackFrame.category:rawStackFrame.name;const stackFrame=new tr.model.StackFrame(undefined,fullId,rawStackFrame.name,ColorScheme.getColorIdForGeneralPurposeString(textForColor));model.addStackFrame(stackFrame);}
-for(const id in rawStackFrames){const fullId=idPrefix+id;const stackFrame=model.stackFrames[fullId];if(stackFrame===undefined){throw new Error('Internal error');}
-const rawStackFrame=rawStackFrames[id];const parentId=rawStackFrame.parent;let parentStackFrame;if(parentId===undefined){parentStackFrame=undefined;}else{const parentFullId=idPrefix+parentId;parentStackFrame=model.stackFrames[parentFullId];if(parentStackFrame===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'Missing parent frame with ID '+parentFullId+' for stack frame \''+stackFrame.name+'\' (ID '+fullId+').'});}}
-stackFrame.parentFrame=parentStackFrame;}
-const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,'legacySample');if(idPrefix==='g'){for(const id in rawStackFrames){const rawStackFrame=rawStackFrames[id];const textForColor=rawStackFrame.category?rawStackFrame.category:rawStackFrame.name;const node=this.stackFrameTree_.add(new ProfileNodeType('g'+id,{functionName:rawStackFrame.name},undefined));node.colorId=ColorScheme.getColorIdForGeneralPurposeString(textForColor);node.parentId=rawStackFrame.parent;}
-for(const id in rawStackFrames){const node=this.stackFrameTree_.getNode('g'+id);const parentId=node.parentId;let parentNode=undefined;if(parentId!==undefined){parentNode=this.stackFrameTree_.getNode('g'+parentId);if(parentNode===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'Missing parent frame with ID '+parentId+' for stack frame \''+node.name+'\' (ID '+node.id+').'});}
-node.parentNode=parentNode;}}}},importObjectTypeNameMap_(rawObjectTypeNameMap,pid){if(pid in this.objectTypeNameMap_){this.model_.importWarning({type:'metadata_parse_error',message:'Mapping from object type IDs to names provided for pid='+
-pid+' multiple times.'});return;}
-let objectTypeNamePrefix=undefined;let objectTypeNameSuffix=undefined;const objectTypeNameMap={};for(const objectTypeId in rawObjectTypeNameMap){const rawObjectTypeName=rawObjectTypeNameMap[objectTypeId];if(objectTypeNamePrefix===undefined){for(let i=0;i<OBJECT_TYPE_NAME_PATTERNS.length;i++){const pattern=OBJECT_TYPE_NAME_PATTERNS[i];if(rawObjectTypeName.startsWith(pattern.prefix)&&rawObjectTypeName.endsWith(pattern.suffix)){objectTypeNamePrefix=pattern.prefix;objectTypeNameSuffix=pattern.suffix;break;}}}
-if(objectTypeNamePrefix!==undefined&&rawObjectTypeName.startsWith(objectTypeNamePrefix)&&rawObjectTypeName.endsWith(objectTypeNameSuffix)){objectTypeNameMap[objectTypeId]=rawObjectTypeName.substring(objectTypeNamePrefix.length,rawObjectTypeName.length-objectTypeNameSuffix.length);}else{objectTypeNameMap[objectTypeId]=rawObjectTypeName;}}
-this.objectTypeNameMap_[pid]=objectTypeNameMap;},importAnnotations_(){for(const id in this.traceAnnotations_){const annotation=tr.model.Annotation.fromDictIfPossible(this.traceAnnotations_[id]);if(!annotation){this.model_.importWarning({type:'annotation_warning',message:'Unrecognized traceAnnotation typeName \"'+
-this.traceAnnotations_[id].typeName+'\"'});continue;}
-this.model_.addAnnotation(annotation);}},finalizeImport(){if(this.softwareMeasuredCpuCount_!==undefined){this.model_.kernel.softwareMeasuredCpuCount=this.softwareMeasuredCpuCount_;}
-this.createFlowSlices_();this.createExplicitObjects_();this.createImplicitObjects_();this.createMemoryDumps_();},getStackFrameForEvent_(event,opt_lookForEndEvent){let sf;let stack;if(opt_lookForEndEvent){sf=event.esf;stack=event.estack;}else{sf=event.sf;stack=event.stack;}
-if(stack!==undefined&&sf!==undefined){this.model_.importWarning({type:'stack_frame_and_stack_error',message:'Event at '+event.ts+' cannot have both a stack and a stackframe.'});return undefined;}
-if(stack!==undefined){return this.model_.resolveStackToStackFrame_(event.pid,stack);}
-if(sf===undefined)return undefined;const stackFrame=this.model_.stackFrames['g'+sf];if(stackFrame===undefined){this.model_.importWarning({type:'sample_import_error',message:'No frame for '+sf});return;}
-return stackFrame;},resolveStackToStackFrame_(pid,stack){return undefined;},importSampleData(){if(!this.sampleEvents_)return;const m=this.model_;const events=this.sampleEvents_;if(this.hasEvents_===undefined){throw new Error('importEvents is not run before importSampleData');}else if(!this.hasEvents_){for(let i=0;i<events.length;i++){const event=events[i];m.getOrCreateProcess(event.tid).getOrCreateThread(event.tid);}}
-const threadsByTid={};m.getAllThreads().forEach(function(t){threadsByTid[t.tid]=t;});for(let i=0;i<events.length;i++){const event=events[i];const thread=threadsByTid[event.tid];if(thread===undefined){m.importWarning({type:'sample_import_error',message:'Thread '+events.tid+'not found'});continue;}
-let cpu;if(event.cpu!==undefined){cpu=m.kernel.getOrCreateCpu(event.cpu);}
-const leafNode=this.stackFrameTree_.getNode('g'+event.sf);const sample=new tr.model.Sample(this.toModelTimeFromUs_(event.ts),event.name,leafNode,thread,cpu,event.weight);m.samples.push(sample);}},createAsyncSlices_(){if(this.allAsyncEvents_.length===0)return;this.allAsyncEvents_.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const legacyEvents=[];const nestableAsyncEventsByKey={};const nestableMeasureAsyncEventsByKey={};for(let i=0;i<this.allAsyncEvents_.length;i++){const asyncEventState=this.allAsyncEvents_[i];const event=asyncEventState.event;if(event.ph==='S'||event.ph==='F'||event.ph==='T'||event.ph==='p'){legacyEvents.push(asyncEventState);continue;}
-if(event.cat===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async events (ph: b, e, or n) require a '+'cat parameter.'});continue;}
-if(event.name===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async events (ph: b, e, or n) require a '+'name parameter.'});continue;}
-const id=TraceEventImporter.scopedIdForEvent_(event);if(id===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async events (ph: b, e, or n) require an '+'id parameter.'});continue;}
-if(event.cat==='blink.user_timing'){const matched=MEASURE_NAME_REGEX.exec(event.name);if(matched!==null){const key=matched[1]+':'+event.cat;try{event.args=JSON.parse(Base64.atob(matched[3])||'{}');}catch(e){}
-if(nestableMeasureAsyncEventsByKey[key]===undefined){nestableMeasureAsyncEventsByKey[key]=[];}
-nestableMeasureAsyncEventsByKey[key].push(asyncEventState);continue;}}
-const key=event.cat+':'+id.toStringWithDelimiter(':');if(nestableAsyncEventsByKey[key]===undefined){nestableAsyncEventsByKey[key]=[];}
-nestableAsyncEventsByKey[key].push(asyncEventState);}
-this.createLegacyAsyncSlices_(legacyEvents);this.createNestableAsyncSlices_(nestableMeasureAsyncEventsByKey);this.createNestableAsyncSlices_(nestableAsyncEventsByKey);},createLegacyAsyncSlice_(events){const asyncEventState=events[events.length-1];const event=asyncEventState.event;const name=event.name;const id=TraceEventImporter.scopedIdForEvent_(event);const key=id.toStringWithDelimiter(':');const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(events[0].event.cat,name);let duration;if(event.ts!==undefined){duration=this.toModelTimeFromUs_(event.ts-events[0].event.ts);}
-const slice=new asyncSliceConstructor(events[0].event.cat,name,getEventColor(events[0].event),this.toModelTimeFromUs_(events[0].event.ts),Object.assign({},events[0].event.args,event.args),duration||0,true,undefined,undefined,events[0].event.argsStripped);if(duration===undefined){slice.didNotFinish=true;slice.error='Slice has no matching END. End time has been adjusted.';this.model_.importWarning({type:'async_slice_parse_error',message:'Legacy async BEGIN event at '+
-events[0].event.ts+' with name="'+
-name+'" and id='+key+' was unmatched.'});}
-slice.startThread=events[0].thread;slice.endThread=asyncEventState.thread;slice.id=key;const stepType=events[1].event.ph;let isValid=true;for(let j=1;j<events.length-1;++j){if(events[j].event.ph==='T'||events[j].event.ph==='p'){isValid=this.assertStepTypeMatches_(stepType,events[j]);if(!isValid)break;}
-if(events[j].event.ph==='S'){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+events[j].event.ts+', a slice named "'+
-name+'" with id='+id+' had a step before the start event.'});continue;}
-if(events[j].event.ph==='F'){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+events[j].event.ts+', a slice named '+
-name+' with id='+id+' had a step after the finish event.'});continue;}
-const startIndex=j+(stepType==='T'?0:-1);const endIndex=startIndex+1;let subName=name;if(!events[j].event.argsStripped&&(events[j].event.ph==='T'||events[j].event.ph==='p')){subName=events[j].event.args.step;}
-const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(events[0].event.cat,subName);let duration;if(events[endIndex].event.ts!==undefined){duration=this.toModelTimeFromUs_(events[endIndex].event.ts-events[startIndex].event.ts);}
-const subSlice=new asyncSliceConstructor(events[0].event.cat,subName,getEventColor(events[0].event,subName+j),this.toModelTimeFromUs_(events[startIndex].event.ts),this.deepCopyIfNeeded_(events[j].event.args),duration||0,undefined,undefined,events[startIndex].event.argsStripped);if(duration===undefined){subSlice.didNotFinish=true;subSlice.error='Slice has no matching END. End time has been adjusted.';}
-subSlice.startThread=events[startIndex].thread;subSlice.endThread=events[endIndex].thread;subSlice.id=key;slice.subSlices.push(subSlice);}
-if(isValid){slice.startThread.asyncSliceGroup.push(slice);}},createLegacyAsyncSlices_(legacyEvents){if(legacyEvents.length===0)return;legacyEvents.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const asyncEventStatesByNameThenID={};for(let i=0;i<legacyEvents.length;i++){const asyncEventState=legacyEvents[i];const event=asyncEventState.event;const name=event.name;if(name===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Async events (ph: S, T, p, or F) require a name '+' parameter.'});continue;}
-const id=TraceEventImporter.scopedIdForEvent_(event);if(id===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Async events (ph: S, T, p, or F) require an id parameter.'});continue;}
-const key=id.toStringWithDelimiter(':');if(event.ph==='S'){if(asyncEventStatesByNameThenID[name]===undefined){asyncEventStatesByNameThenID[name]={};}
-if(asyncEventStatesByNameThenID[name][key]){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+event.ts+', a slice of the same id '+id+' was alrady open.'});continue;}
-asyncEventStatesByNameThenID[name][key]=[];asyncEventStatesByNameThenID[name][key].push(asyncEventState);}else{if(asyncEventStatesByNameThenID[name]===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:`At ${event.ts}, no slice named "${name}" was open.`,});continue;}
-if(asyncEventStatesByNameThenID[name][key]===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:`At ${event.ts}, no slice named "${name}" with id=${id} was `+'open.',});continue;}
-const events=asyncEventStatesByNameThenID[name][key];events.push(asyncEventState);if(event.ph==='F'){this.createLegacyAsyncSlice_(events);delete asyncEventStatesByNameThenID[name][key];}}}
-for(const[name,statesByID]of
-Object.entries(asyncEventStatesByNameThenID)){for(const[id,states]of Object.entries(statesByID)){const startEvent=states[0].event;states.push({sequenceNumber:1+states[states.length-1].sequenceNumber,event:{ph:'F',name,id:startEvent.id,id2:startEvent.id2,scope:startEvent.scope,pid:startEvent.pid,tid:startEvent.tid,cat:startEvent.cat,args:{},},thread:this.model_.getOrCreateProcess(startEvent.pid).getOrCreateThread(startEvent.tid),});this.createLegacyAsyncSlice_(states);}}},createNestableAsyncSlices_(nestableEventsByKey){for(const key in nestableEventsByKey){const eventStateEntries=nestableEventsByKey[key];const parentStack=[];for(let i=0;i<eventStateEntries.length;++i){const eventStateEntry=eventStateEntries[i];if(eventStateEntry.event.ph==='e'){let parentIndex=-1;for(let k=parentStack.length-1;k>=0;--k){if(parentStack[k].event.name===eventStateEntry.event.name){parentIndex=k;break;}}
-if(parentIndex===-1){eventStateEntry.finished=false;}else{parentStack[parentIndex].end=eventStateEntry;while(parentIndex<parentStack.length){parentStack.pop();}}}
-if(parentStack.length>0){eventStateEntry.parentEntry=parentStack[parentStack.length-1];}
-if(eventStateEntry.event.ph==='b'){parentStack.push(eventStateEntry);}}
-const topLevelSlices=[];for(let i=0;i<eventStateEntries.length;++i){const eventStateEntry=eventStateEntries[i];if(eventStateEntry.event.ph==='e'&&eventStateEntry.finished===undefined){continue;}
-let startState=undefined;let endState=undefined;let sliceArgs=eventStateEntry.event.args||{};let sliceError=undefined;const id=TraceEventImporter.scopedIdForEvent_(eventStateEntry.event);if(eventStateEntry.event.ph==='n'){startState=eventStateEntry;endState=eventStateEntry;}else if(eventStateEntry.event.ph==='b'){if(eventStateEntry.end===undefined){eventStateEntry.end=eventStateEntries[eventStateEntries.length-1];sliceError='Slice has no matching END. End time has been adjusted.';this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async BEGIN event at '+
-eventStateEntry.event.ts+' with name="'+
-eventStateEntry.event.name+'" and id='+id+' was unmatched.'});}else{function concatenateArguments(args1,args2){if(args1.params===undefined||args2.params===undefined){return Object.assign({},args1,args2);}
-const args3={};args3.params=Object.assign({},args1.params,args2.params);return Object.assign({},args1,args2,args3);}
-const endArgs=eventStateEntry.end.event.args||{};sliceArgs=concatenateArguments(sliceArgs,endArgs);}
-startState=eventStateEntry;endState=eventStateEntry.end;}else{sliceError='Slice has no matching BEGIN. Start time has been adjusted.';this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async END event at '+
-eventStateEntry.event.ts+' with name='+
-eventStateEntry.event.name+' and id='+id+' was unmatched.'});startState=eventStateEntries[0];endState=eventStateEntry;}
-const isTopLevel=(eventStateEntry.parentEntry===undefined);const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(eventStateEntry.event.cat,eventStateEntry.event.name);let threadStart=undefined;let threadDuration=undefined;if(startState.event.tts&&startState.event.use_async_tts){threadStart=this.toModelTimeFromUs_(startState.event.tts);if(endState.event.tts){const threadEnd=this.toModelTimeFromUs_(endState.event.tts);threadDuration=threadEnd-threadStart;}}
-const slice=new asyncSliceConstructor(eventStateEntry.event.cat,eventStateEntry.event.name,getEventColor(endState.event),this.toModelTimeFromUs_(startState.event.ts),sliceArgs,this.toModelTimeFromUs_(endState.event.ts-startState.event.ts),isTopLevel,threadStart,threadDuration,startState.event.argsStripped);slice.startThread=startState.thread;slice.endThread=endState.thread;slice.startStackFrame=this.getStackFrameForEvent_(startState.event);slice.endStackFrame=this.getStackFrameForEvent_(endState.event);slice.id=key;if(sliceError!==undefined){slice.error=sliceError;}
-eventStateEntry.slice=slice;if(isTopLevel){topLevelSlices.push(slice);}else if(eventStateEntry.parentEntry.slice!==undefined){eventStateEntry.parentEntry.slice.subSlices.push(slice);}}
-for(let si=0;si<topLevelSlices.length;si++){topLevelSlices[si].startThread.asyncSliceGroup.push(topLevelSlices[si]);}}},assertStepTypeMatches_(stepType,event){if(stepType!==event.event.ph){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+event.event.ts+', a slice named '+
-event.event.name+' with id='+
-TraceEventImporter.scopedIdForEvent_(event.event)+' had both begin and end steps, which is not allowed.'});return false;}
-return true;},validateFlowEvent_(event){if(event.name===undefined){this.model_.importWarning({type:'flow_slice_parse_error',message:'Flow events (ph: s, t or f) require a name parameter.'});return false;}
-if(event.ph==='s'||event.ph==='f'||event.ph==='t'){if(event.id===undefined){this.model_.importWarning({type:'flow_slice_parse_error',message:'Flow events (ph: s, t or f) require an id parameter.'});return false;}
-return true;}
-if(event.bind_id){if(event.flow_in===undefined&&event.flow_out===undefined){this.model_.importWarning({type:'flow_slice_parse_error',message:'Flow producer or consumer require flow_in or flow_out.'});return false;}
-return true;}
-return false;},createFlowSlices_(){if(this.allFlowEvents_.length===0)return;const createFlowEvent=function(thread,event,opt_slice){let startSlice;let flowId;let flowStartTs;if(event.bind_id){startSlice=opt_slice;flowId=event.bind_id;flowStartTs=this.toModelTimeFromUs_(event.ts+event.dur);}else{const ts=this.toModelTimeFromUs_(event.ts);startSlice=thread.sliceGroup.findSliceAtTs(ts);if(startSlice===undefined)return undefined;flowId=event.id;flowStartTs=ts;}
-const flowEvent=new tr.model.FlowEvent(event.cat,flowId,event.name,getEventColor(event),flowStartTs,this.deepCopyAlways_(event.args));flowEvent.startSlice=startSlice;flowEvent.startStackFrame=this.getStackFrameForEvent_(event);flowEvent.endStackFrame=undefined;startSlice.outFlowEvents.push(flowEvent);return flowEvent;}.bind(this);const finishFlowEventWith=function(flowEvent,thread,event,refGuid,bindToParent,opt_slice){let endSlice;if(event.bind_id){endSlice=opt_slice;}else{const ts=this.toModelTimeFromUs_(event.ts);if(bindToParent){endSlice=thread.sliceGroup.findSliceAtTs(ts);}else{endSlice=thread.sliceGroup.findNextSliceAfter(ts,refGuid);}
-if(endSlice===undefined)return false;}
-endSlice.inFlowEvents.push(flowEvent);flowEvent.endSlice=endSlice;flowEvent.duration=this.toModelTimeFromUs_(event.ts)-flowEvent.start;flowEvent.endStackFrame=this.getStackFrameForEvent_(event);this.mergeArgsInto_(flowEvent.args,event.args,flowEvent.title);return true;}.bind(this);const processFlowConsumer=function(flowIdToEvent,sliceGuidToEvent,event,slice){let flowEvent=flowIdToEvent[event.bind_id];if(flowEvent===undefined){this.model_.importWarning({type:'flow_slice_ordering_error',message:'Flow consumer '+event.bind_id+' does not have '+'a flow producer'});return false;}else if(flowEvent.endSlice){const flowProducer=flowEvent.startSlice;flowEvent=createFlowEvent(undefined,sliceGuidToEvent[flowProducer.guid],flowProducer);}
-const refGuid=undefined;const ok=finishFlowEventWith(flowEvent,undefined,event,refGuid,undefined,slice);if(ok){this.model_.flowEvents.push(flowEvent);}else{this.model_.importWarning({type:'flow_slice_end_error',message:'Flow consumer '+event.bind_id+' does not end '+'at an actual slice, so cannot be created.'});return false;}
-return true;}.bind(this);const processFlowProducer=function(flowIdToEvent,flowStatus,event,slice){if(flowIdToEvent[event.bind_id]&&flowStatus[event.bind_id]){this.model_.importWarning({type:'flow_slice_start_error',message:'Flow producer '+event.bind_id+' already seen'});return false;}
-const flowEvent=createFlowEvent(undefined,event,slice);if(!flowEvent){this.model_.importWarning({type:'flow_slice_start_error',message:'Flow producer '+event.bind_id+' does not start'+'a flow'});return false;}
-flowIdToEvent[event.bind_id]=flowEvent;}.bind(this);this.allFlowEvents_.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const flowIdToEvent={};const sliceGuidToEvent={};const flowStatus={};for(let i=0;i<this.allFlowEvents_.length;++i){const data=this.allFlowEvents_[i];const refGuid=data.refGuid;const event=data.event;const thread=data.thread;if(!this.validateFlowEvent_(event))continue;if(event.bind_id){const slice=data.slice;sliceGuidToEvent[slice.guid]=event;if(event.flowPhase===PRODUCER){if(!processFlowProducer(flowIdToEvent,flowStatus,event,slice)){continue;}
-flowStatus[event.bind_id]=true;}else{if(!processFlowConsumer(flowIdToEvent,sliceGuidToEvent,event,slice)){continue;}
-flowStatus[event.bind_id]=false;if(event.flowPhase===STEP){if(!processFlowProducer(flowIdToEvent,flowStatus,event,slice)){continue;}
-flowStatus[event.bind_id]=true;}}
-continue;}
-const fullFlowId=JSON.stringify({id:event.id,cat:event.cat,name:event.name});let flowEvent;if(event.ph==='s'){if(flowIdToEvent[fullFlowId]){this.model_.importWarning({type:'flow_slice_start_error',message:'event id '+event.id+' already seen when '+'encountering start of flow event.'});continue;}
-flowEvent=createFlowEvent(thread,event);if(!flowEvent){this.model_.importWarning({type:'flow_slice_start_error',message:'event id '+event.id+' does not start '+'at an actual slice, so cannot be created.'});continue;}
-flowIdToEvent[fullFlowId]=flowEvent;}else if(event.ph==='t'||event.ph==='f'){flowEvent=flowIdToEvent[fullFlowId];if(flowEvent===undefined){this.model_.importWarning({type:'flow_slice_ordering_error',message:'Found flow phase '+event.ph+' for id: '+event.id+' but no flow start found.'});continue;}
-let bindToParent=event.ph==='t';if(event.ph==='f'){if(event.bp===undefined){if(event.cat.indexOf('input')>-1){bindToParent=true;}else if(event.cat.indexOf('ipc.flow')>-1){bindToParent=true;}}else{if(event.bp!=='e'){this.model_.importWarning({type:'flow_slice_bind_point_error',message:'Flow event with invalid binding point (event.bp).'});continue;}
-bindToParent=true;}}
-const ok=finishFlowEventWith(flowEvent,thread,event,refGuid,bindToParent);if(ok){this.model_.flowEvents.push(flowEvent);}else{this.model_.importWarning({type:'flow_slice_end_error',message:'event id '+event.id+' does not end '+'at an actual slice, so cannot be created.'});}
-flowIdToEvent[fullFlowId]=undefined;if(ok&&event.ph==='t'){flowEvent=createFlowEvent(thread,event);flowIdToEvent[fullFlowId]=flowEvent;}}}},createExplicitObjects_(){if(this.allObjectEvents_.length===0)return;const processEvent=function(objectEventState){const event=objectEventState.event;const scopedId=TraceEventImporter.scopedIdForEvent_(event);const thread=objectEventState.thread;if(event.name===undefined){this.model_.importWarning({type:'object_parse_error',message:'While processing '+JSON.stringify(event)+': '+'Object events require an name parameter.'});}
-if(scopedId===undefined||scopedId.id===undefined){this.model_.importWarning({type:'object_parse_error',message:'While processing '+JSON.stringify(event)+': '+'Object events require an id parameter.'});}
-const process=thread.parent;const ts=this.toModelTimeFromUs_(event.ts);let instance;if(event.ph==='N'){try{instance=process.objects.idWasCreated(scopedId,event.cat,event.name,ts);}catch(e){this.model_.importWarning({type:'object_parse_error',message:'While processing create of '+
-scopedId+' at ts='+ts+': '+e});return;}}else if(event.ph==='O'){if(event.args.snapshot===undefined){this.model_.importWarning({type:'object_parse_error',message:'While processing '+scopedId+' at ts='+ts+': '+'Snapshots must have args: {snapshot: ...}'});return;}
-let snapshot;try{const args=this.deepCopyIfNeeded_(event.args.snapshot);let cat;if(args.cat){cat=args.cat;delete args.cat;}else{cat=event.cat;}
-let baseTypename;if(args.base_type){baseTypename=args.base_type;delete args.base_type;}else{baseTypename=undefined;}
-snapshot=process.objects.addSnapshot(scopedId,cat,event.name,ts,args,baseTypename);snapshot.snapshottedOnThread=thread;}catch(e){this.model_.importWarning({type:'object_parse_error',message:'While processing snapshot of '+
-scopedId+' at ts='+ts+': '+e});return;}
-instance=snapshot.objectInstance;}else if(event.ph==='D'){try{process.objects.idWasDeleted(scopedId,event.cat,event.name,ts);const instanceMap=process.objects.getOrCreateInstanceMap_(scopedId);instance=instanceMap.lastInstance;}catch(e){this.model_.importWarning({type:'object_parse_error',message:'While processing delete of '+
-scopedId+' at ts='+ts+': '+e});return;}}
-if(instance){instance.colorId=getEventColor(event,instance.typeName);}}.bind(this);this.allObjectEvents_.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const allObjectEvents=this.allObjectEvents_;for(let i=0;i<allObjectEvents.length;i++){const objectEventState=allObjectEvents[i];try{processEvent.call(this,objectEventState);}catch(e){this.model_.importWarning({type:'object_parse_error',message:e.message});}}},createImplicitObjects_(){for(const proc of Object.values(this.model_.processes)){this.createImplicitObjectsForProcess_(proc);}},createImplicitObjectsForProcess_(process){function processField(referencingObject,referencingObjectFieldName,referencingObjectFieldValue,containingSnapshot){if(!referencingObjectFieldValue)return;if(referencingObjectFieldValue instanceof
-tr.model.ObjectSnapshot){return null;}
-if(referencingObjectFieldValue.id===undefined)return;const implicitSnapshot=referencingObjectFieldValue;const rawId=implicitSnapshot.id;const m=/(.+)\/(.+)/.exec(rawId);if(!m){throw new Error('Implicit snapshots must have names.');}
-delete implicitSnapshot.id;const name=m[1];const id=m[2];let res;let cat;if(implicitSnapshot.cat!==undefined){cat=implicitSnapshot.cat;}else{cat=containingSnapshot.objectInstance.category;}
-let baseTypename;if(implicitSnapshot.base_type){baseTypename=implicitSnapshot.base_type;}else{baseTypename=undefined;}
-const scope=containingSnapshot.objectInstance.scopedId.scope;try{res=process.objects.addSnapshot(new tr.model.ScopedId(scope,id),cat,name,containingSnapshot.ts,implicitSnapshot,baseTypename);}catch(e){this.model_.importWarning({type:'object_snapshot_parse_error',message:'While processing implicit snapshot of '+
-rawId+' at ts='+containingSnapshot.ts+': '+e});return;}
-res.objectInstance.hasImplicitSnapshots=true;res.containingSnapshot=containingSnapshot;res.snapshottedOnThread=containingSnapshot.snapshottedOnThread;referencingObject[referencingObjectFieldName]=res;if(!(res instanceof tr.model.ObjectSnapshot)){throw new Error('Created object must be instanceof snapshot');}
-return res.args;}
-function iterObject(object,func,containingSnapshot,thisArg){if(!(object instanceof Object))return;if(object instanceof Array){for(let i=0;i<object.length;i++){const res=func.call(thisArg,object,i,object[i],containingSnapshot);if(res===null)continue;if(res){iterObject(res,func,containingSnapshot,thisArg);}else{iterObject(object[i],func,containingSnapshot,thisArg);}}
-return;}
-for(const key in object){const res=func.call(thisArg,object,key,object[key],containingSnapshot);if(res===null)continue;if(res){iterObject(res,func,containingSnapshot,thisArg);}else{iterObject(object[key],func,containingSnapshot,thisArg);}}}
-process.objects.iterObjectInstances(function(instance){instance.snapshots.forEach(function(snapshot){if(snapshot.args.id!==undefined){throw new Error('args cannot have an id field inside it');}
-iterObject(snapshot.args,processField,snapshot,this);},this);},this);},minimalTimestampInPidToEvents_(pidToEvents){let smallestTs=Infinity;for(const events of Object.values(pidToEvents)){for(const event of events){if(event.ts<smallestTs){smallestTs=event.ts;}}}
-return smallestTs;},createMemoryDumps_(){const pairs=Object.entries(this.allMemoryDumpEvents_);const key=x=>this.minimalTimestampInPidToEvents_(x);pairs.sort((x,y)=>key(x[1])-key(y[1]));for(const[dumpId,pidToEvents]of pairs){this.createGlobalMemoryDump_(pidToEvents,dumpId);}},createGlobalMemoryDump_(dumpIdEvents,dumpId){const globalRange=new tr.b.math.Range();for(const pid in dumpIdEvents){const processEvents=dumpIdEvents[pid];for(let i=0;i<processEvents.length;i++){globalRange.addValue(this.toModelTimeFromUs_(processEvents[i].ts));}}
-if(globalRange.isEmpty){throw new Error('Internal error: Global memory dump without events');}
-const globalMemoryDump=new tr.model.GlobalMemoryDump(this.model_,globalRange.min);globalMemoryDump.duration=globalRange.range;this.model_.globalMemoryDumps.push(globalMemoryDump);const globalMemoryAllocatorDumpsByFullName={};const levelsOfDetail={};const allMemoryAllocatorDumpsByGuid={};for(const pid in dumpIdEvents){this.createProcessMemoryDump_(globalMemoryDump,globalMemoryAllocatorDumpsByFullName,levelsOfDetail,allMemoryAllocatorDumpsByGuid,dumpIdEvents[pid],pid,dumpId);}
-globalMemoryDump.levelOfDetail=levelsOfDetail.global;globalMemoryDump.memoryAllocatorDumps=this.inferMemoryAllocatorDumpTree_(globalMemoryAllocatorDumpsByFullName);this.parseMemoryDumpAllocatorEdges_(allMemoryAllocatorDumpsByGuid,dumpIdEvents,dumpId);},createProcessMemoryDump_(globalMemoryDump,globalMemoryAllocatorDumpsByFullName,levelsOfDetail,allMemoryAllocatorDumpsByGuid,processEvents,pid,dumpId){const processRange=new tr.b.math.Range();for(let i=0;i<processEvents.length;i++){processRange.addValue(this.toModelTimeFromUs_(processEvents[i].ts));}
-if(processRange.isEmpty){throw new Error('Internal error: Process memory dump without events');}
-const process=this.model_.getOrCreateProcess(pid);const processMemoryDump=new tr.model.ProcessMemoryDump(globalMemoryDump,process,processRange.min);processMemoryDump.duration=processRange.range;process.memoryDumps.push(processMemoryDump);globalMemoryDump.processMemoryDumps[pid]=processMemoryDump;const processMemoryAllocatorDumpsByFullName={};for(let i=0;i<processEvents.length;i++){const processEvent=processEvents[i];const dumps=processEvent.args.dumps;if(dumps===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'\'dumps\' field not found in a process memory dump'+' event for PID='+pid+' and dump ID='+dumpId+'.'});continue;}
-this.parseMemoryDumpTotals_(processMemoryDump,dumps,pid,dumpId);this.parseMemoryDumpVmRegions_(processMemoryDump,dumps,pid,dumpId);this.parseMemoryDumpHeapDumps_(processMemoryDump,dumps,pid,dumpId);this.parseMemoryDumpLevelOfDetail_(levelsOfDetail,dumps,pid,dumpId);this.parseMemoryDumpAllocatorDumps_(processMemoryDump,globalMemoryDump,processMemoryAllocatorDumpsByFullName,globalMemoryAllocatorDumpsByFullName,allMemoryAllocatorDumpsByGuid,dumps,pid,dumpId);}
-if(levelsOfDetail.process===undefined){levelsOfDetail.process=processMemoryDump.vmRegions?DETAILED:LIGHT;}
-if(!this.updateMemoryDumpLevelOfDetail_(levelsOfDetail,'global',levelsOfDetail.process)){this.model_.importWarning({type:'memory_dump_parse_error',message:'diffent levels of detail provided for global memory'+' dump (dump ID='+dumpId+').'});}
-processMemoryDump.levelOfDetail=levelsOfDetail.process;delete levelsOfDetail.process;processMemoryDump.memoryAllocatorDumps=this.inferMemoryAllocatorDumpTree_(processMemoryAllocatorDumpsByFullName);},parseMemoryDumpTotals_(processMemoryDump,dumps,pid,dumpId){const rawTotals=dumps.process_totals;if(rawTotals===undefined)return;if(processMemoryDump.totals!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Process totals provided multiple times for'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
-const totals={};let platformSpecificTotals=undefined;for(const rawTotalName in rawTotals){const rawTotalValue=rawTotals[rawTotalName];if(rawTotalValue===undefined)continue;if(rawTotalName==='resident_set_bytes'){totals.residentBytes=parseInt(rawTotalValue,16);continue;}
-if(rawTotalName==='peak_resident_set_bytes'){totals.peakResidentBytes=parseInt(rawTotalValue,16);continue;}
-if(rawTotalName==='is_peak_rss_resetable'){totals.arePeakResidentBytesResettable=!!rawTotalValue;continue;}
-if(rawTotalName==='private_footprint_bytes'){totals.privateFootprintBytes=parseInt(rawTotalValue,16);continue;}
-if(platformSpecificTotals===undefined){platformSpecificTotals={};totals.platformSpecific=platformSpecificTotals;}
-platformSpecificTotals[rawTotalName]=parseInt(rawTotalValue,16);}
-if(totals.peakResidentBytes===undefined&&totals.arePeakResidentBytesResettable!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Optional field peak_resident_set_bytes found'+' but is_peak_rss_resetable not found in'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});}
-if(totals.arePeakResidentBytesResettable!==undefined&&totals.peakResidentBytes===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Optional field is_peak_rss_resetable found'+' but peak_resident_set_bytes not found in'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});}
-processMemoryDump.totals=totals;},parseMemoryDumpVmRegions_(processMemoryDump,dumps,pid,dumpId){const rawProcessMmaps=dumps.process_mmaps;if(rawProcessMmaps===undefined)return;const rawVmRegions=rawProcessMmaps.vm_regions;if(rawVmRegions===undefined)return;if(processMemoryDump.vmRegions!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'VM regions provided multiple times for'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
-if(rawVmRegions===null)return;const vmRegions=new Array(rawVmRegions.length);for(let i=0;i<rawVmRegions.length;i++){const rawVmRegion=rawVmRegions[i];const byteStats={};const rawByteStats=rawVmRegion.bs;for(const rawByteStatName in rawByteStats){const rawByteStatValue=rawByteStats[rawByteStatName];if(rawByteStatValue===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Byte stat \''+rawByteStatName+'\' of VM region '+
-i+' ('+rawVmRegion.mf+') in process memory dump for '+'PID='+pid+' and dump ID='+dumpId+' does not have a value.'});continue;}
-const byteStatName=BYTE_STAT_NAME_MAP[rawByteStatName];if(byteStatName===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Unknown byte stat name \''+rawByteStatName+'\' ('+
-rawByteStatValue+') of VM region '+i+' ('+
-rawVmRegion.mf+') in process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});continue;}
-byteStats[byteStatName]=parseInt(rawByteStatValue,16);if(byteStatName==='proportionalResident'&&byteStats[byteStatName]===0){byteStats[byteStatName]=undefined;}}
-vmRegions[i]=new tr.model.VMRegion(parseInt(rawVmRegion.sa,16),parseInt(rawVmRegion.sz,16),rawVmRegion.pf,rawVmRegion.mf,byteStats);}
-processMemoryDump.vmRegions=tr.model.VMRegionClassificationNode.fromRegions(vmRegions);},parseMemoryDumpHeapDumps_(processMemoryDump,dumps,pid,dumpId){const idPrefix='p'+pid+':';let importer;if(dumps.heaps){const processTypeMap=this.objectTypeNameMap_[pid];if(processTypeMap===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing mapping from object type IDs to names.'});}
-importer=new LegacyHeapDumpTraceEventImporter(this.model_,processMemoryDump,processTypeMap,idPrefix,dumpId,dumps.heaps);}else if(dumps.heaps_v2){const data=dumps.heaps_v2;this.heapProfileExpander=this.heapProfileExpander.expandData(data);this.addNewStackFramesFromExpander_(this.heapProfileExpander,idPrefix);importer=new HeapDumpTraceEventImporter(this.heapProfileExpander,this.model_.stackFrames,processMemoryDump,idPrefix,this.model_);}
-if(!importer)return;const heapDumps=importer.parse();if(!heapDumps)return;if(processMemoryDump.heapDumps!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Heap dumps provided multiple times for'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
-if(Object.keys(heapDumps).length>0){processMemoryDump.heapDumps=heapDumps;}},addNewStackFramesFromExpander_(expander,idPrefix){const nodeMap=expander.getNewMap('nodes');const newStackFrames={};for(const[id,stackFrame]of nodeMap.entries()){if(!this.model_.stackFrames[idPrefix+id]){newStackFrames[id]={id,name:expander.getString(stackFrame.name_sid),};if(stackFrame.parent)newStackFrames[id].parent=stackFrame.parent;}}
-this.importStackFrames_(newStackFrames,idPrefix);},parseMemoryDumpLevelOfDetail_(levelsOfDetail,dumps,pid,dumpId){const rawLevelOfDetail=dumps.level_of_detail;let level;switch(rawLevelOfDetail){case'background':level=BACKGROUND;break;case'light':level=LIGHT;break;case'detailed':level=DETAILED;break;case undefined:level=undefined;break;default:this.model_.importWarning({type:'memory_dump_parse_error',message:'unknown raw level of detail \''+rawLevelOfDetail+'\' of process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
-if(!this.updateMemoryDumpLevelOfDetail_(levelsOfDetail,'process',level)){this.model_.importWarning({type:'memory_dump_parse_error',message:'diffent levels of detail provided for process memory'+' dump for PID='+pid+' (dump ID='+dumpId+').'});}},updateMemoryDumpLevelOfDetail_(levelsOfDetail,scope,level){if(!(scope in levelsOfDetail)||level===levelsOfDetail[scope]){levelsOfDetail[scope]=level;return true;}
-if(MEMORY_DUMP_LEVEL_OF_DETAIL_ORDER.indexOf(level)>MEMORY_DUMP_LEVEL_OF_DETAIL_ORDER.indexOf(levelsOfDetail[scope])){levelsOfDetail[scope]=level;}
-return false;},parseMemoryDumpAllocatorDumps_(processMemoryDump,globalMemoryDump,processMemoryAllocatorDumpsByFullName,globalMemoryAllocatorDumpsByFullName,allMemoryAllocatorDumpsByGuid,dumps,pid,dumpId){const rawAllocatorDumps=dumps.allocators;if(rawAllocatorDumps===undefined)return;for(let fullName in rawAllocatorDumps){const rawAllocatorDump=rawAllocatorDumps[fullName];const guid=rawAllocatorDump.guid;if(guid===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+fullName+' for PID='+pid+' and dump ID='+dumpId+' does not have a GUID.'});}
-const flags=rawAllocatorDump.flags||0;const isWeakDump=!!(flags&WEAK_MEMORY_ALLOCATOR_DUMP_FLAG);let containerMemoryDump;let dstIndex;if(fullName.startsWith(GLOBAL_MEMORY_ALLOCATOR_DUMP_PREFIX)){fullName=fullName.substring(GLOBAL_MEMORY_ALLOCATOR_DUMP_PREFIX.length);containerMemoryDump=globalMemoryDump;dstIndex=globalMemoryAllocatorDumpsByFullName;}else{containerMemoryDump=processMemoryDump;dstIndex=processMemoryAllocatorDumpsByFullName;}
-let allocatorDump=allMemoryAllocatorDumpsByGuid[guid];if(allocatorDump===undefined){if(fullName in dstIndex){this.model_.importWarning({type:'memory_dump_parse_error',message:'Multiple GUIDs provided for'+' memory allocator dump '+fullName+': '+
-dstIndex[fullName].guid+', '+guid+' (ignored) for'+' PID='+pid+' and dump ID='+dumpId+'.'});continue;}
-allocatorDump=new tr.model.MemoryAllocatorDump(containerMemoryDump,fullName,guid);allocatorDump.weak=isWeakDump;dstIndex[fullName]=allocatorDump;if(guid!==undefined){allMemoryAllocatorDumpsByGuid[guid]=allocatorDump;}}else{if(allocatorDump.containerMemoryDump!==containerMemoryDump){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+
-dumpId+' dumped in different contexts.'});continue;}
-if(allocatorDump.fullName!==fullName){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump with GUID='+guid+' for PID='+
-pid+' and dump ID='+dumpId+' has multiple names: '+
-allocatorDump.fullName+', '+fullName+' (ignored).'});continue;}
-if(!isWeakDump){allocatorDump.weak=false;}}
-let attributes=rawAllocatorDump.attrs;if(attributes===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+dumpId+' does not have attributes.'});attributes={};}
-for(const attrName in attributes){const attrArgs=attributes[attrName];const attrType=attrArgs.type;const attrValue=attrArgs.value;switch(attrType){case'scalar':{if(attrName in allocatorDump.numerics){this.model_.importWarning({type:'memory_dump_parse_error',message:'Multiple values provided for scalar attribute '+
-attrName+' of memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+
-dumpId+'.'});break;}
-const unit=attrArgs.units==='bytes'?tr.b.Unit.byName.sizeInBytes_smallerIsBetter:tr.b.Unit.byName.unitlessNumber_smallerIsBetter;const value=parseInt(attrValue,16);allocatorDump.addNumeric(attrName,new tr.b.Scalar(unit,value));break;}
-case'string':if(attrName in allocatorDump.diagnostics){this.model_.importWarning({type:'memory_dump_parse_error',message:'Multiple values provided for string attribute '+
-attrName+' of memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+
-dumpId+'.'});break;}
-allocatorDump.addDiagnostic(attrName,attrValue);break;default:this.model_.importWarning({type:'memory_dump_parse_error',message:'Unknown type provided for attribute '+attrName+' of memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+dumpId+': '+
-attrType});break;}}}},inferMemoryAllocatorDumpTree_(memoryAllocatorDumpsByFullName){const rootAllocatorDumps=[];const fullNames=Object.keys(memoryAllocatorDumpsByFullName);fullNames.sort();for(let i=0;i<fullNames.length;i++){let fullName=fullNames[i];let allocatorDump=memoryAllocatorDumpsByFullName[fullName];while(true){const lastSlashIndex=fullName.lastIndexOf('/');if(lastSlashIndex===-1){rootAllocatorDumps.push(allocatorDump);break;}
-const parentFullName=fullName.substring(0,lastSlashIndex);let parentAllocatorDump=memoryAllocatorDumpsByFullName[parentFullName];let parentAlreadyExisted=true;if(parentAllocatorDump===undefined){parentAlreadyExisted=false;parentAllocatorDump=new tr.model.MemoryAllocatorDump(allocatorDump.containerMemoryDump,parentFullName);if(allocatorDump.weak!==false){parentAllocatorDump.weak=undefined;}
-memoryAllocatorDumpsByFullName[parentFullName]=parentAllocatorDump;}
-allocatorDump.parent=parentAllocatorDump;parentAllocatorDump.children.push(allocatorDump);if(parentAlreadyExisted){if(!allocatorDump.weak){while(parentAllocatorDump!==undefined&&parentAllocatorDump.weak===undefined){parentAllocatorDump.weak=false;parentAllocatorDump=parentAllocatorDump.parent;}}
-break;}
-fullName=parentFullName;allocatorDump=parentAllocatorDump;}}
-for(const fullName in memoryAllocatorDumpsByFullName){const allocatorDump=memoryAllocatorDumpsByFullName[fullName];if(allocatorDump.weak===undefined){allocatorDump.weak=true;}}
-return rootAllocatorDumps;},parseMemoryDumpAllocatorEdges_(allMemoryAllocatorDumpsByGuid,dumpIdEvents,dumpId){for(const pid in dumpIdEvents){const processEvents=dumpIdEvents[pid];for(let i=0;i<processEvents.length;i++){const processEvent=processEvents[i];const dumps=processEvent.args.dumps;if(dumps===undefined)continue;const rawEdges=dumps.allocators_graph;if(rawEdges===undefined)continue;for(let j=0;j<rawEdges.length;j++){const rawEdge=rawEdges[j];const sourceGuid=rawEdge.source;const sourceDump=allMemoryAllocatorDumpsByGuid[sourceGuid];if(sourceDump===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Edge for PID='+pid+' and dump ID='+dumpId+' is missing source memory allocator dump (GUID='+
-sourceGuid+').'});continue;}
-const targetGuid=rawEdge.target;const targetDump=allMemoryAllocatorDumpsByGuid[targetGuid];if(targetDump===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Edge for PID='+pid+' and dump ID='+dumpId+' is missing target memory allocator dump (GUID='+
-targetGuid+').'});continue;}
-const importance=rawEdge.importance;const edge=new tr.model.MemoryAllocatorDumpLink(sourceDump,targetDump,importance);switch(rawEdge.type){case'ownership':if(sourceDump.owns!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+sourceDump.fullName+' (GUID='+sourceGuid+') already owns a memory'+' allocator dump ('+
-sourceDump.owns.target.fullName+').'});}else{sourceDump.owns=edge;targetDump.ownedBy.push(edge);}
-break;case'retention':sourceDump.retains.push(edge);targetDump.retainedBy.push(edge);break;default:this.model_.importWarning({type:'memory_dump_parse_error',message:'Invalid edge type: '+rawEdge.type+' (PID='+pid+', dump ID='+dumpId+', source='+sourceGuid+', target='+targetGuid+', importance='+importance+').'});}}}}},toModelTimeFromUs_(ts){if(!this.toModelTime_){this.toModelTime_=this.model_.clockSyncManager.getModelTimeTransformer(this.clockDomainId_);}
-return this.toModelTime_(tr.b.Unit.timestampFromUs(ts));},maybeToModelTimeFromUs_(ts){if(ts===undefined){return undefined;}
-return this.toModelTimeFromUs_(ts);},durationFromUs_(dur){if(dur===undefined){return undefined;}
-return tr.b.Unit.timestampFromUs(dur);}};tr.importer.Importer.register(TraceEventImporter);return{TraceEventImporter,};});'use strict';tr.exportTo('tr.e.net',function(){const AsyncSlice=tr.model.AsyncSlice;function NetAsyncSlice(){AsyncSlice.apply(this,arguments);this.url_=undefined;this.byteCount_=undefined;this.isTitleComputed_=false;this.isUrlComputed_=false;}
-NetAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get viewSubGroupTitle(){return'NetLog';},get title(){if(this.isTitleComputed_||!this.isTopLevel){return this.title_;}
-if(this.url!==undefined&&this.url.length>0){this.title_=this.url;}else if(this.args!==undefined&&this.args.source_type!==undefined){this.title_=this.args.source_type;}
-this.isTitleComputed_=true;return this.title_;},set title(title){this.title_=title;},get url(){if(this.isUrlComputed_){return this.url_;}
-if(this.args!==undefined&&this.args.params!==undefined&&this.args.params.url!==undefined){this.url_=this.args.params.url;}else if(this.subSlices!==undefined&&this.subSlices.length>0){for(let i=0;i<this.subSlices.length&&!this.url_;i++){if(this.subSlices[i].url!==undefined){this.url_=this.subSlices[i].url;}}}
-this.isUrlComputed_=true;return this.url_;},get byteCount(){if(this.byteCount_!==undefined){return this.byteCount_;}
-this.byteCount_=0;if((this.originalTitle==='URL_REQUEST_JOB_FILTERED_BYTES_READ'||this.originalTitle==='URL_REQUEST_JOB_BYTES_READ')&&this.args!==undefined&&this.args.params!==undefined&&this.args.params.byte_count!==undefined){this.byteCount_=this.args.params.byte_count;}
-for(let i=0;i<this.subSlices.length;i++){this.byteCount_+=this.subSlices[i].byteCount;}
-return this.byteCount_;}};AsyncSlice.subTypes.register(NetAsyncSlice,{categoryParts:['netlog','disabled-by-default-netlog']});return{NetAsyncSlice,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){function Parser(importer){this.importer=importer;this.model=importer.model;}
-Parser.prototype={__proto__:Object.prototype};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.mandatoryBaseClass=Parser;tr.b.decorateExtensionRegistry(Parser,options);return{Parser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function AndroidParser(importer){Parser.call(this,importer);importer.registerEventHandler('tracing_mark_write:android',AndroidParser.prototype.traceMarkWriteAndroidEvent.bind(this));importer.registerEventHandler('0:android',AndroidParser.prototype.traceMarkWriteAndroidEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
-function parseArgs(argsString){const args={};if(argsString){const argsArray=argsString.split(';');for(let i=0;i<argsArray.length;++i){const parts=argsArray[i].split('=');if(parts[0]){args[parts.shift()]=parts.join('=');}}}
-return args;}
-AndroidParser.prototype={__proto__:Parser.prototype,openAsyncSlice(thread,category,name,cookie,ts,args){const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(category,name);const slice=new asyncSliceConstructor(category,name,ColorScheme.getColorIdForGeneralPurposeString(name),ts,args);const key=category+':'+name+':'+cookie;slice.id=cookie;slice.startThread=thread;if(!this.openAsyncSlices){this.openAsyncSlices={};}
-this.openAsyncSlices[key]=slice;},closeAsyncSlice(thread,category,name,cookie,ts,args){if(!this.openAsyncSlices){return;}
-const key=category+':'+name+':'+cookie;const slice=this.openAsyncSlices[key];if(!slice){return;}
-for(const arg in args){if(slice.args[arg]!==undefined){this.model_.importWarning({type:'parse_error',message:'Both the S and F events of '+slice.title+' provided values for argument '+arg+'.'+' The value of the F event will be used.'});}
-slice.args[arg]=args[arg];}
-slice.endThread=thread;slice.duration=ts-slice.start;slice.startThread.asyncSliceGroup.push(slice);delete this.openAsyncSlices[key];},traceMarkWriteAndroidEvent(eventName,cpuNumber,pid,ts,eventBase){const eventData=eventBase.details.split('|');switch(eventData[0]){case'B':{const ppid=parseInt(eventData[1]);const title=eventData[2];const args=parseArgs(eventData[3]);let category=eventData[4];if(category===undefined)category='android';const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);thread.name=eventBase.threadName;if(!thread.sliceGroup.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
-this.ppids_[pid]=ppid;thread.sliceGroup.beginSlice(category,title,ts,args);break;}
-case'E':{const ppid=this.ppids_[pid];if(ppid===undefined){break;}
-const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);if(!thread.sliceGroup.openSliceCount){break;}
-const slice=thread.sliceGroup.endSlice(ts);const args=parseArgs(eventData[3]);for(const arg in args){if(slice.args[arg]!==undefined){this.model_.importWarning({type:'parse_error',message:'Both the B and E events of '+slice.title+' provided values for argument '+arg+'.'+' The value of the E event will be used.'});}
-slice.args[arg]=args[arg];}
-break;}
-case'C':{const ppid=parseInt(eventData[1]);const name=eventData[2];const value=parseInt(eventData[3]);let category=eventData[4];if(category===undefined)category='android';const ctr=this.model_.getOrCreateProcess(ppid).getOrCreateCounter(category,name);if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries(value,ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,value);});break;}
-case'S':{const ppid=parseInt(eventData[1]);const name=eventData[2];const cookie=parseInt(eventData[3]);const args=parseArgs(eventData[4]);let category=eventData[5];if(category===undefined)category='android';const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);thread.name=eventBase.threadName;this.ppids_[pid]=ppid;this.openAsyncSlice(thread,category,name,cookie,ts,args);break;}
-case'F':{const ppid=parseInt(eventData[1]);const name=eventData[2];const cookie=parseInt(eventData[3]);const args=parseArgs(eventData[4]);let category=eventData[5];if(category===undefined)category='android';const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);thread.name=eventBase.threadName;this.ppids_[pid]=ppid;this.closeAsyncSlice(thread,category,name,cookie,ts,args);break;}
-default:return false;}
-return true;}};Parser.register(AndroidParser);return{AndroidParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;const binderTransRE=new RegExp('transaction=(\\d+) dest_node=(\\d+) '+'dest_proc=(\\d+) dest_thread=(\\d+) '+'reply=(\\d+) flags=(0x[0-9a-fA-F]+) '+'code=(0x[0-9a-fA-F]+)');const binderAllocRE=new RegExp('transaction=(\\d+) data_size=(\\d+) '+'offsets_size=(\\d+)');const binderTransReceivedRE=/transaction=(\d+)/;function isBinderThread(name){return(name.indexOf('Binder')>-1);}
-const TF_ONE_WAY=0x01;const TF_ROOT_OBJECT=0x04;const TF_STATUS_CODE=0x08;const TF_ACCEPT_FDS=0x10;const NO_FLAGS=0;function binderFlagsToHuman(num){const flag=parseInt(num,16);let str='';if(flag&TF_ONE_WAY){str+='this is a one-way call: async, no return; ';}
-if(flag&TF_ROOT_OBJECT){str+='contents are the components root object; ';}
-if(flag&TF_STATUS_CODE){str+='contents are a 32-bit status code; ';}
-if(flag&TF_ACCEPT_FDS){str+='allow replies with file descriptors; ';}
-if(flag===NO_FLAGS){str+='No Flags Set';}
-return str;}
-function isReplyToOrigin(calling,called){return(called.dest_proc===calling.calling_pid||called.dest_thread===calling.calling_pid);}
-function binderCodeToHuman(code){return'Java Layer Dependent';}
-function doInternalSlice(trans,slice,ts){if(slice.subSlices.length!==0){slice.subSlices[0].start=ts;return slice.subSlices[0];}
-const kthread=trans.calling_kthread.thread;const internalSlice=kthread.sliceGroup.pushCompleteSlice('binder',slice.title,ts,.001,0,0,slice.args);internalSlice.title=slice.title;internalSlice.id=slice.id;internalSlice.colorId=slice.colorId;slice.subSlices.push(internalSlice);return internalSlice;}
-function generateBinderArgsForSlice(trans,cThreadName){return{'Transaction Id':trans.transaction_key,'Destination Node':trans.dest_node,'Destination Process':trans.dest_proc,'Destination Thread':trans.dest_thread,'Destination Name':cThreadName,'Reply transaction?':trans.is_reply_transaction,'Flags':trans.flags+' '+
-binderFlagsToHuman(trans.flags),'Code':trans.code+' '+
-binderCodeToHuman(trans.code),'Calling PID':trans.calling_pid,'Calling tgid':trans.calling_kthread.thread.parent.pid};}
-function BinderTransaction(events,callingPid,callingTs,callingKthread){this.transaction_key=parseInt(events[1]);this.dest_node=parseInt(events[2]);this.dest_proc=parseInt(events[3]);this.dest_thread=parseInt(events[4]);this.is_reply_transaction=parseInt(events[5])===1?true:false;this.expect_reply=((this.is_reply_transaction===false)&&(parseInt(events[6],16)&TF_ONE_WAY)===0);this.flags=events[6];this.code=events[7];this.calling_pid=callingPid;this.calling_ts=callingTs;this.calling_kthread=callingKthread;}
-function BinderParser(importer){Parser.call(this,importer);importer.registerEventHandler('binder_locked',BinderParser.prototype.binderLocked.bind(this));importer.registerEventHandler('binder_unlock',BinderParser.prototype.binderUnlock.bind(this));importer.registerEventHandler('binder_lock',BinderParser.prototype.binderLock.bind(this));importer.registerEventHandler('binder_transaction',BinderParser.prototype.binderTransaction.bind(this));importer.registerEventHandler('binder_transaction_received',BinderParser.prototype.binderTransactionReceived.bind(this));importer.registerEventHandler('binder_transaction_alloc_buf',BinderParser.prototype.binderTransactionAllocBuf.bind(this));this.model_=importer.model;this.kthreadlookup={};this.importer_=importer;this.transWaitingRecv={};this.syncTransWaitingCompletion={};this.recursiveSyncTransWaitingCompletion_ByPID={};this.receivedTransWaitingConversion={};}
-BinderParser.prototype={__proto__:Parser.prototype,binderLock(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;this.doNameMappings(pid,tgid,eventName.threadName);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);kthread.binderAttemptLockTS=ts;kthread.binderOpenTsA=ts;return true;},binderLocked(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const binderThread=isBinderThread(eventBase.threadName);const name=eventBase.threadName;const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);this.doNameMappings(pid,tgid,name);const rthread=kthread.thread;kthread.binderLockAquiredTS=ts;if(kthread.binderAttemptLockTS===undefined)return false;const args=this.generateArgsForSlice(tgid,pid,name,kthread);rthread.sliceGroup.pushCompleteSlice('binder','binder lock waiting',kthread.binderAttemptLockTS,ts-kthread.binderAttemptLockTS,0,0,args);kthread.binderAttemptLockTS=undefined;return true;},binderUnlock(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);if(kthread.binderLockAquiredTS===undefined)return false;const args=this.generateArgsForSlice(tgid,pid,eventBase.threadName,kthread);kthread.thread.sliceGroup.pushCompleteSlice('binder','binder lock held',kthread.binderLockAquiredTS,ts-kthread.binderLockAquiredTS,0,0,args);kthread.binderLockAquiredTS=undefined;return true;},binderTransaction(eventName,cpuNumber,pid,ts,eventBase){const event=binderTransRE.exec(eventBase.details);if(event===undefined)return false;const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;this.doNameMappings(pid,tgid,eventBase.threadName);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);const trans=new BinderTransaction(event,pid,ts,kthread);const args=generateBinderArgsForSlice(trans,eventBase.threadName);const priorReceive=this.getPriorReceiveOnPID(pid);if(priorReceive!==false){return this.modelPriorReceive(priorReceive,ts,pid,tgid,kthread,trans,args,event);}
-const recursiveTrans=this.getRecursiveTransactionNeedingCompletion(pid);if(recursiveTrans!==false){return this.modelRecursiveTransactions(recursiveTrans,ts,pid,kthread,trans,args);}
-const slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','',ts,.03,0,0,args);slice.colorId=ColorScheme.getColorIdForGeneralPurposeString(ts.toString());trans.slice=slice;if(trans.expect_reply){slice.title='binder transaction';}else{slice.title='binder transaction async';}
-this.addTransactionWaitingForRecv(trans.transaction_key,trans);return true;},binderTransactionReceived(eventName,cpuNumber,pid,ts,eventBase){const event=binderTransReceivedRE.exec(eventBase.details);if(event===undefined)return false;const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const transactionkey=parseInt(event[1]);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);const syncComplete=this.getSyncTransNeedsCompletion(transactionkey);if(syncComplete!==false){const syncTrans=syncComplete[0];const syncSlice=syncTrans.slice;const responseTrans=syncComplete[1];const responseSlice=responseTrans.slice;syncSlice.duration=ts-syncSlice.start;const syncInternal=doInternalSlice(syncTrans,syncSlice,ts);const responseTs=responseSlice.start+responseSlice.duration;const responseInternal=doInternalSlice(responseTrans,responseSlice,responseTs);if(responseSlice.outFlowEvents.length===0||syncSlice.inFlowEvents.length===0){const flow=this.generateFlow(responseInternal,syncInternal,responseTrans,syncTrans);syncSlice.inFlowEvents.push(flow);responseSlice.outFlowEvents.push(flow);this.model_.flowEvents.push(flow);}
-for(let i=1;i<syncSlice.inFlowEvents.length;i++){syncSlice.inFlowEvents[i].duration=ts-syncSlice.inFlowEvents[i].start;}
-return true;}
-const trForRecv=this.getTransactionWaitingForRecv(transactionkey);if(trForRecv!==false){if(!trForRecv.expect_reply){const args=generateBinderArgsForSlice(trForRecv,eventBase.threadName);const slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','binder Async recv',ts,.03,0,0,args);const fakeEvent=[0,0,0,0,0,0,0];const fakeTrans=new BinderTransaction(fakeEvent,pid,ts,kthread);const flow=this.generateFlow(trForRecv.slice,slice,trForRecv,fakeTrans);this.model_.flowEvents.push(flow);trForRecv.slice.title='binder transaction async';trForRecv.slice.duration=.03;return true;}
-trForRecv.slice.title='binder transaction';this.setCurrentReceiveOnPID(pid,[ts,trForRecv]);return true;}
-return false;},binderTransactionAllocBuf(eventName,cpuNumber,pid,ts,eventBase){const event=binderAllocRE.exec(eventBase.details);if(event===null)return false;const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const transactionkey=parseInt(event[1]);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);const trans=this.peekTransactionWaitingForRecv(transactionkey);if(trans&&trans.slice){trans.slice.args['Data Size']=parseInt(event[2]);trans.slice.args['Offsets Size']=parseInt(event[3]);return true;}
-return false;},modelRecursiveTransactions(recursiveTrans,ts,pid,kthread,trans,args){const recursiveSlice=recursiveTrans[1].slice;const origSlice=recursiveTrans[0].slice;recursiveSlice.duration=ts-recursiveSlice.start;recursiveSlice.args=args;trans.slice=recursiveSlice;if(trans.is_reply_transaction){origSlice.duration=ts-origSlice.start;this.addSyncTransNeedingCompletion(trans.transaction_key,recursiveTrans);if(isReplyToOrigin(recursiveTrans[0],trans)){this.removeRecursiveTransaction(pid);}}else{const slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','',ts,.03,0,0,args);trans.slice=slice;this.addTransactionWaitingForRecv(trans.transaction_key,trans);}
-return true;},modelPriorReceive(priorReceive,ts,pid,tgid,kthread,trans,args,event){const calleeSlice=priorReceive[1].slice;const calleeTrans=priorReceive[1];const recvTs=priorReceive[0];let slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','',recvTs,ts-recvTs,0,0);const flow=this.generateFlow(calleeSlice,slice,calleeTrans,trans);this.model_.flowEvents.push(flow);trans.slice=slice;if(trans.is_reply_transaction){slice.title='binder reply';slice.args=args;this.addSyncTransNeedingCompletion(trans.transaction_key,[calleeTrans,trans]);}else{slice.title='binder reply';const trans1=new BinderTransaction(event,pid,ts,kthread);slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','binder transaction',recvTs,(ts-recvTs),0,0,args);if(!trans.expect_reply){slice.title='binder transaction async';slice.duration=.03;}else{}
-trans1.slice=slice;this.addRecursiveSyncTransNeedingCompletion(pid,[calleeTrans,trans]);this.addTransactionWaitingForRecv(trans.transaction_key,trans1);}
-return true;},getRecursiveTransactionNeedingCompletion(pid){if(this.recursiveSyncTransWaitingCompletion_ByPID[pid]===undefined){return false;}
-const len=this.recursiveSyncTransWaitingCompletion_ByPID[pid].length;if(len===0)return false;return this.recursiveSyncTransWaitingCompletion_ByPID[pid][len-1];},addRecursiveSyncTransNeedingCompletion(pid,tuple){if(this.recursiveSyncTransWaitingCompletion_ByPID[pid]===undefined){this.recursiveSyncTransWaitingCompletion_ByPID[pid]=[];}
-this.recursiveSyncTransWaitingCompletion_ByPID[pid].push(tuple);},removeRecursiveTransaction(pid){const len=this.recursiveSyncTransWaitingCompletion_ByPID[pid].length;if(len===0){delete this.recursiveSyncTransWaitingCompletion_ByPID[pid];return;}
-this.recursiveSyncTransWaitingCompletion_ByPID[pid].splice(len-1,1);},setCurrentReceiveOnPID(pid,tuple){if(this.receivedTransWaitingConversion[pid]===undefined){this.receivedTransWaitingConversion[pid]=[];}
-this.receivedTransWaitingConversion[pid].push(tuple);},getPriorReceiveOnPID(pid){if(this.receivedTransWaitingConversion[pid]===undefined){return false;}
-const len=this.receivedTransWaitingConversion[pid].length;if(len===0)return false;return this.receivedTransWaitingConversion[pid].splice(len-1,1)[0];},addSyncTransNeedingCompletion(transactionkey,tuple){const dict=this.syncTransWaitingCompletion;dict[transactionkey]=tuple;},getSyncTransNeedsCompletion(transactionkey){const ret=this.syncTransWaitingCompletion[transactionkey];if(ret===undefined)return false;delete this.syncTransWaitingCompletion[transactionkey];return ret;},getTransactionWaitingForRecv(transactionkey){const ret=this.transWaitingRecv[transactionkey];if(ret===undefined)return false;delete this.transWaitingRecv[transactionkey];return ret;},peekTransactionWaitingForRecv(transactionkey){const ret=this.transWaitingRecv[transactionkey];if(ret===undefined)return false;return ret;},addTransactionWaitingForRecv(transactionkey,transaction){this.transWaitingRecv[transactionkey]=transaction;},generateFlow(from,to,fromTrans,toTrans){const title='Transaction from : '+
-this.pid2name(fromTrans.calling_pid)+' From PID: '+fromTrans.calling_pid+' to pid: '+
-toTrans.calling_pid+' Thread Name: '+this.pid2name(toTrans.calling_pid);const ts=from.start;const flow=new tr.model.FlowEvent('binder','binder',title,1,ts,[]);flow.startSlice=from;flow.endSlice=to;flow.start=from.start;flow.duration=to.start-ts;from.outFlowEvents.push(flow);to.inFlowEvents.push(flow);return flow;},generateArgsForSlice(tgid,pid,name,kthread){return{'Thread Name':name,pid,'gid':tgid};},pid2name(pid){return this.kthreadlookup[pid];},doNameMappings(pid,tgid,name){this.registerPidName(pid,name);this.registerPidName(tgid,name);},registerPidName(pid,name){if(this.pid2name(pid)===undefined){this.kthreadlookup[pid]=name;}}};Parser.register(BinderParser);return{BinderParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function BusParser(importer){Parser.call(this,importer);importer.registerEventHandler('memory_bus_usage',BusParser.prototype.traceMarkWriteBusEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
-BusParser.prototype={__proto__:Parser.prototype,traceMarkWriteBusEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const re=new RegExp('bus=(\\S+) rw_bytes=(\\d+) r_bytes=(\\d+) '+'w_bytes=(\\d+) cycles=(\\d+) ns=(\\d+)');const event=re.exec(eventBase.details);const name=event[1];const rwBytes=parseInt(event[2]);const rBytes=parseInt(event[3]);const wBytes=parseInt(event[4]);const cycles=parseInt(event[5]);const ns=parseInt(event[6]);const sec=tr.b.convertUnit(ns,tr.b.UnitPrefixScale.METRIC.NANO,tr.b.UnitPrefixScale.METRIC.NONE);const readBandwidthInBps=rBytes/sec;const readBandwidthInMiBps=tr.b.convertUnit(readBandwidthInBps,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI);const writeBandwidthInBps=wBytes/sec;const writeBandwidthInMiBps=tr.b.convertUnit(writeBandwidthInBps,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI);let ctr=this.model_.kernel.getOrCreateCounter(null,'bus '+name+' read');if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,readBandwidthInMiBps);});ctr=this.model_.kernel.getOrCreateCounter(null,'bus '+name+' write');if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,writeBandwidthInMiBps);});return true;}};Parser.register(BusParser);return{BusParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function ClockParser(importer){Parser.call(this,importer);importer.registerEventHandler('clock_set_rate',ClockParser.prototype.traceMarkWriteClockEvent.bind(this));importer.registerEventHandler('clk_set_rate',ClockParser.prototype.traceMarkWriteClkEvent.bind(this));importer.registerEventHandler('clock_enable',ClockParser.prototype.traceMarkWriteClockOnOffEvent.bind(this));importer.registerEventHandler('clock_disable',ClockParser.prototype.traceMarkWriteClockOnOffEvent.bind(this));importer.registerEventHandler('clk_enable',ClockParser.prototype.traceMarkWriteClkOnEvent.bind(this));importer.registerEventHandler('clk_disable',ClockParser.prototype.traceMarkWriteClkOffEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
-ClockParser.prototype={__proto__:Parser.prototype,clockMark(name,subName,value,ts){const ctr=this.model_.kernel.getOrCreateCounter(null,name+' '+subName);if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,value);});},traceMarkWriteClockEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/(\S+) state=(\d+)/.exec(eventBase.details);const name=event[1];const rate=parseInt(event[2]);this.clockMark(name,'Frequency',rate,ts);return true;},traceMarkWriteClkEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/(\S+) (\d+)/.exec(eventBase.details);const name=event[1];const rate=parseInt(event[2]);this.clockMark(name,'Frequency',rate,ts);return true;},traceMarkWriteClockOnOffEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/(\S+) state=(\d+)/.exec(eventBase.details);const name=event[1];const state=parseInt(event[2]);this.clockMark(name,'State',state,ts);return true;},traceMarkWriteClkOnEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/\S+/.exec(eventBase.details);const name=event[0];this.clockMark(name,'State',1,ts);return true;},traceMarkWriteClkOffEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/\S+/.exec(eventBase.details);const name=event[0];this.clockMark(name,'State',0,ts);return true;}};Parser.register(ClockParser);return{ClockParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function CpufreqParser(importer){Parser.call(this,importer);importer.registerEventHandler('cpufreq_interactive_up',CpufreqParser.prototype.cpufreqUpDownEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_down',CpufreqParser.prototype.cpufreqUpDownEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_already',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_notyet',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_setspeed',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_target',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_boost',CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_unboost',CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this));}
-function splitData(input){const data={};const args=input.split(/\s+/);const len=args.length;for(let i=0;i<len;i++){const item=args[i].split('=');data[item[0]]=parseInt(item[1]);}
-return data;}
-CpufreqParser.prototype={__proto__:Parser.prototype,cpufreqSlice(ts,eventName,cpu,args){const kthread=this.importer.getOrCreatePseudoThread('cpufreq');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},cpufreqBoostSlice(ts,eventName,args){const kthread=this.importer.getOrCreatePseudoThread('cpufreq_boost');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},cpufreqUpDownEvent(eventName,cpuNumber,pid,ts,eventBase){const data=splitData(eventBase.details);this.cpufreqSlice(ts,eventName,data.cpu,data);return true;},cpufreqTargetEvent(eventName,cpuNumber,pid,ts,eventBase){const data=splitData(eventBase.details);this.cpufreqSlice(ts,eventName,data.cpu,data);return true;},cpufreqBoostUnboostEvent(eventName,cpuNumber,pid,ts,eventBase){this.cpufreqBoostSlice(ts,eventName,{type:eventBase.details});return true;}};Parser.register(CpufreqParser);return{CpufreqParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function DiskParser(importer){Parser.call(this,importer);importer.registerEventHandler('f2fs_write_begin',DiskParser.prototype.f2fsWriteBeginEvent.bind(this));importer.registerEventHandler('f2fs_write_end',DiskParser.prototype.f2fsWriteEndEvent.bind(this));importer.registerEventHandler('f2fs_sync_file_enter',DiskParser.prototype.f2fsSyncFileEnterEvent.bind(this));importer.registerEventHandler('f2fs_sync_file_exit',DiskParser.prototype.f2fsSyncFileExitEvent.bind(this));importer.registerEventHandler('ext4_sync_file_enter',DiskParser.prototype.ext4SyncFileEnterEvent.bind(this));importer.registerEventHandler('ext4_sync_file_exit',DiskParser.prototype.ext4SyncFileExitEvent.bind(this));importer.registerEventHandler('ext4_da_write_begin',DiskParser.prototype.ext4WriteBeginEvent.bind(this));importer.registerEventHandler('ext4_da_write_end',DiskParser.prototype.ext4WriteEndEvent.bind(this));importer.registerEventHandler('block_rq_issue',DiskParser.prototype.blockRqIssueEvent.bind(this));importer.registerEventHandler('block_rq_complete',DiskParser.prototype.blockRqCompleteEvent.bind(this));}
-DiskParser.prototype={__proto__:Parser.prototype,openAsyncSlice(ts,category,threadName,pid,key,name){const kthread=this.importer.getOrCreateKernelThread(category+':'+threadName,pid);const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(category,name);const slice=new asyncSliceConstructor(category,name,ColorScheme.getColorIdForGeneralPurposeString(name),ts);slice.startThread=kthread.thread;if(!kthread.openAsyncSlices){kthread.openAsyncSlices={};}
-kthread.openAsyncSlices[key]=slice;},closeAsyncSlice(ts,category,threadName,pid,key,args){const kthread=this.importer.getOrCreateKernelThread(category+':'+threadName,pid);if(kthread.openAsyncSlices){const slice=kthread.openAsyncSlices[key];if(slice){slice.duration=ts-slice.start;slice.args=args;slice.endThread=kthread.thread;slice.subSlices=[new tr.model.AsyncSlice(category,slice.title,slice.colorId,slice.start,slice.args,slice.duration)];kthread.thread.asyncSliceGroup.push(slice);delete kthread.openAsyncSlices[key];}}},f2fsWriteBeginEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), flags = (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const key=device+'-'+inode+'-'+pos+'-'+len;this.openAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,'f2fs_write');return true;},f2fsWriteEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), copied = (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const error=parseInt(event[5])!==len;const key=device+'-'+inode+'-'+pos+'-'+len;this.closeAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},ext4WriteBeginEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) flags (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const key=device+'-'+inode+'-'+pos+'-'+len;this.openAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,'ext4_write');return true;},ext4WriteEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) copied (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const error=parseInt(event[5])!==len;const key=device+'-'+inode+'-'+pos+'-'+len;this.closeAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},f2fsSyncFileEnterEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('dev = \\((\\d+,\\d+)\\), ino = (\\d+), pino = (\\d+), i_mode = (\\S+), '+'i_size = (\\d+), i_nlink = (\\d+), i_blocks = (\\d+), i_advise = (\\d+)').exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const key=device+'-'+inode;this.openAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,'fsync');return true;},f2fsSyncFileExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('dev = \\((\\d+,\\d+)\\), ino = (\\d+), checkpoint is (\\S+), '+'datasync = (\\d+), ret = (\\d+)').exec(eventBase.details.replace('not needed','not_needed'));if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const error=parseInt(event[5]);const key=device+'-'+inode;this.closeAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},ext4SyncFileEnterEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const datasync=(event[4]==='1')||(event[4]===1);const key=device+'-'+inode;const action=datasync?'fdatasync':'fsync';this.openAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,action);return true;},ext4SyncFileExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const error=parseInt(event[3]);const key=device+'-'+inode;this.closeAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},blockRqIssueEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('(\\d+,\\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? '+'\\d+ \\(.*\\) (\\d+) \\+ (\\d+) \\[.*\\]').exec(eventBase.details);if(!event)return false;let action;switch(event[3]){case'D':action='discard';break;case'W':action='write';break;case'R':action='read';break;case'N':action='none';break;default:action='unknown';break;}
-if(event[2]){action+=' flush';}
-if(event[4]==='F'){action+=' fua';}
-if(event[5]==='A'){action+=' ahead';}
-if(event[6]==='S'){action+=' sync';}
-if(event[7]==='M'){action+=' meta';}
-const device=event[1];const sector=parseInt(event[8]);const numSectors=parseInt(event[9]);const key=device+'-'+sector+'-'+numSectors;this.openAsyncSlice(ts,'block',eventBase.threadName,eventBase.pid,key,action);return true;},blockRqCompleteEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('(\\d+,\\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? '+'\\(.*\\) (\\d+) \\+ (\\d+) \\[(.*)\\]').exec(eventBase.details);if(!event)return false;const device=event[1];const sector=parseInt(event[8]);const numSectors=parseInt(event[9]);const error=parseInt(event[10]);const key=device+'-'+sector+'-'+numSectors;this.closeAsyncSlice(ts,'block',eventBase.threadName,eventBase.pid,key,{device,sector,numSectors,error});return true;}};Parser.register(DiskParser);return{DiskParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function DmaFenceParser(importer){Parser.call(this,importer);this.model_=importer.model_;importer.registerEventHandler('dma_fence_init',DmaFenceParser.prototype.initEvent.bind(this));importer.registerEventHandler('dma_fence_emit',DmaFenceParser.prototype.initEvent.bind(this));importer.registerEventHandler('dma_fence_destroy',DmaFenceParser.prototype.fenceDestroyEvent.bind(this));importer.registerEventHandler('dma_fence_enable_signal',DmaFenceParser.prototype.fenceEnableSignalEvent.bind(this));importer.registerEventHandler('dma_fence_signaled',DmaFenceParser.prototype.fenceSignaledEvent.bind(this));importer.registerEventHandler('dma_fence_wait_start',DmaFenceParser.prototype.fenceWaitEvent.bind(this));importer.registerEventHandler('dma_fence_wait_end',DmaFenceParser.prototype.fenceWaitEvent.bind(this));importer.registerEventHandler('fence_init',DmaFenceParser.prototype.initEvent.bind(this));importer.registerEventHandler('fence_emit',DmaFenceParser.prototype.initEvent.bind(this));importer.registerEventHandler('fence_destroy',DmaFenceParser.prototype.fenceDestroyEvent.bind(this));importer.registerEventHandler('fence_enable_signal',DmaFenceParser.prototype.fenceEnableSignalEvent.bind(this));importer.registerEventHandler('fence_signaled',DmaFenceParser.prototype.fenceSignaledEvent.bind(this));importer.registerEventHandler('fence_wait_start',DmaFenceParser.prototype.fenceWaitEvent.bind(this));importer.registerEventHandler('fence_wait_end',DmaFenceParser.prototype.fenceWaitEvent.bind(this));this.model_=importer.model_;}
-const fenceRE=/driver=(\S+) timeline=(\S+) context=(\d+) seqno=(\d+)/;DmaFenceParser.prototype={__proto__:Parser.prototype,initEvent(eventName,cpuNumber,pid,ts,eventBase){const event=fenceRE.exec(eventBase.details);if(!event)return false;if(eventBase.tgid===undefined){return false;}
-const thread=this.importer.getOrCreatePseudoThread(event[2]);thread.lastActiveTs=ts;return true;},fenceDestroyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=fenceRE.exec(eventBase.details);if(!event)return false;if(eventBase.tgid===undefined){return false;}
-const thread=this.importer.getOrCreatePseudoThread(event[2]);const name='fence_destroy('+event[4]+')';const colorName='fence('+event[4]+')';if(thread.lastActiveTs!==undefined){const duration=ts-thread.lastActiveTs;const slice=new tr.model.ThreadSlice('',name,ColorScheme.getColorIdForGeneralPurposeString(colorName),thread.lastActiveTs,{driver:event[1],context:event[3]},duration);thread.thread.sliceGroup.pushSlice(slice);}
-if(thread.thread.sliceGroup.openSliceCount>0){thread.thread.sliceGroup.endSlice(ts);}
-thread.lastActiveTs=ts;},fenceEnableSignalEvent(eventName,cpuNumber,pid,ts,eventBase){const event=fenceRE.exec(eventBase.details);if(!event)return false;if(eventBase.tgid===undefined){return false;}
-const thread=this.importer.getOrCreatePseudoThread(event[2]);const name='fence_enable('+event[4]+')';const colorName='fence('+event[4]+')';if(thread.lastActiveTs!==undefined){const duration=ts-thread.lastActiveTs;const slice=new tr.model.ThreadSlice('',name,ColorScheme.getColorIdForGeneralPurposeString(colorName),thread.lastActiveTs,{driver:event[1],context:event[3]},duration);thread.thread.sliceGroup.pushSlice(slice);}
-if(thread.thread.sliceGroup.openSliceCount>0){thread.thread.sliceGroup.endSlice(ts);}
-thread.lastActiveTs=ts;},fenceSignaledEvent(eventName,cpuNumber,pid,ts,eventBase){const event=fenceRE.exec(eventBase.details);if(!event)return false;if(eventBase.tgid===undefined){return false;}
-const thread=this.importer.getOrCreatePseudoThread(event[2]);const name='fence_signal('+event[4]+')';const colorName='fence('+event[4]+')';if(thread.lastActiveTs!==undefined){const duration=ts-thread.lastActiveTs;const slice=new tr.model.ThreadSlice('',name,ColorScheme.getColorIdForGeneralPurposeString(colorName),thread.lastActiveTs,{driver:event[1],context:event[3]},duration);thread.thread.sliceGroup.pushSlice(slice);}
-if(thread.thread.sliceGroup.openSliceCount>0){thread.thread.sliceGroup.endSlice(ts);}
-thread.lastActiveTs=ts;return true;},fenceWaitEvent(eventName,cpuNumber,pid,ts,eventBase){if(eventBase.tgid===undefined)return false;const event=fenceRE.exec(eventBase.details);if(!event)return false;const tgid=parseInt(eventBase.tgid);const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
-const name='dma_fence_wait("'+event[2]+'")';if(eventName.endsWith('start')){const slice=slices.beginSlice(null,name,ts,{driver:event[1],context:event[3],seqno:event[4],});}else{if(slices.openSliceCount>0){slices.endSlice(ts);}}
-return true;},};Parser.register(DmaFenceParser);return{DmaFenceParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function DrmParser(importer){Parser.call(this,importer);importer.registerEventHandler('drm_vblank_event',DrmParser.prototype.vblankEvent.bind(this));}
-DrmParser.prototype={__proto__:Parser.prototype,drmVblankSlice(ts,eventName,args){const kthread=this.importer.getOrCreatePseudoThread('drm_vblank');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},vblankEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/crtc=(\d+), seq=(\d+)/.exec(eventBase.details);if(!event)return false;const crtc=parseInt(event[1]);const seq=parseInt(event[2]);this.drmVblankSlice(ts,'vblank:'+crtc,{crtc,seq});return true;}};Parser.register(DrmParser);return{DrmParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function ExynosParser(importer){Parser.call(this,importer);importer.registerEventHandler('exynos_busfreq_target_int',ExynosParser.prototype.busfreqTargetIntEvent.bind(this));importer.registerEventHandler('exynos_busfreq_target_mif',ExynosParser.prototype.busfreqTargetMifEvent.bind(this));importer.registerEventHandler('exynos_page_flip_state',ExynosParser.prototype.pageFlipStateEvent.bind(this));}
-ExynosParser.prototype={__proto__:Parser.prototype,exynosBusfreqSample(name,ts,frequency){const targetCpu=this.importer.getOrCreateCpu(0);const counter=targetCpu.getOrCreateCounter('',name);if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries('frequency',ColorScheme.getColorIdForGeneralPurposeString(counter.name+'.'+'frequency')));}
-counter.series.forEach(function(series){series.addCounterSample(ts,frequency);});},busfreqTargetIntEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/frequency=(\d+)/.exec(eventBase.details);if(!event)return false;this.exynosBusfreqSample('INT Frequency',ts,parseInt(event[1]));return true;},busfreqTargetMifEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/frequency=(\d+)/.exec(eventBase.details);if(!event)return false;this.exynosBusfreqSample('MIF Frequency',ts,parseInt(event[1]));return true;},exynosPageFlipStateOpenSlice(ts,pipe,fb,state){const kthread=this.importer.getOrCreatePseudoThread('exynos_flip_state (pipe:'+pipe+', fb:'+fb+')');kthread.openSliceTS=ts;kthread.openSlice=state;},exynosPageFlipStateCloseSlice(ts,pipe,fb,args){const kthread=this.importer.getOrCreatePseudoThread('exynos_flip_state (pipe:'+pipe+', fb:'+fb+')');if(kthread.openSlice){const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),kthread.openSliceTS,args,ts-kthread.openSliceTS);kthread.thread.sliceGroup.pushSlice(slice);}
-kthread.openSlice=undefined;},pageFlipStateEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/pipe=(\d+), fb=(\d+), state=(.*)/.exec(eventBase.details);if(!event)return false;const pipe=parseInt(event[1]);const fb=parseInt(event[2]);const state=event[3];this.exynosPageFlipStateCloseSlice(ts,pipe,fb,{pipe,fb});if(state!=='flipped'){this.exynosPageFlipStateOpenSlice(ts,pipe,fb,state);}
-return true;}};Parser.register(ExynosParser);return{ExynosParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function GestureParser(importer){Parser.call(this,importer);importer.registerEventHandler('tracing_mark_write:log',GestureParser.prototype.logEvent.bind(this));importer.registerEventHandler('tracing_mark_write:SyncInterpret',GestureParser.prototype.syncEvent.bind(this));importer.registerEventHandler('tracing_mark_write:HandleTimer',GestureParser.prototype.timerEvent.bind(this));}
-GestureParser.prototype={__proto__:Parser.prototype,gestureOpenSlice(title,ts,opt_args){const thread=this.importer.getOrCreatePseudoThread('gesture').thread;thread.sliceGroup.beginSlice('touchpad_gesture',title,ts,opt_args);},gestureCloseSlice(title,ts){const thread=this.importer.getOrCreatePseudoThread('gesture').thread;if(thread.sliceGroup.openSliceCount){const slice=thread.sliceGroup.mostRecentlyOpenedPartialSlice;if(slice.title!==title){this.importer.model.importWarning({type:'title_match_error',message:'Titles do not match. Title is '+
-slice.title+' in openSlice, and is '+
-title+' in endSlice'});}else{thread.sliceGroup.endSlice(ts);}}},logEvent(eventName,cpuNumber,pid,ts,eventBase){const innerEvent=/^\s*(\w+):\s*(\w+)$/.exec(eventBase.details);switch(innerEvent[1]){case'start':this.gestureOpenSlice('GestureLog',ts,{name:innerEvent[2]});break;case'end':this.gestureCloseSlice('GestureLog',ts);}
-return true;},syncEvent(eventName,cpuNumber,pid,ts,eventBase){const innerEvent=/^\s*(\w+):\s*(\w+)$/.exec(eventBase.details);switch(innerEvent[1]){case'start':this.gestureOpenSlice('SyncInterpret',ts,{interpreter:innerEvent[2]});break;case'end':this.gestureCloseSlice('SyncInterpret',ts);}
-return true;},timerEvent(eventName,cpuNumber,pid,ts,eventBase){const innerEvent=/^\s*(\w+):\s*(\w+)$/.exec(eventBase.details);switch(innerEvent[1]){case'start':this.gestureOpenSlice('HandleTimer',ts,{interpreter:innerEvent[2]});break;case'end':this.gestureCloseSlice('HandleTimer',ts);}
-return true;}};Parser.register(GestureParser);return{GestureParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function I2cParser(importer){Parser.call(this,importer);importer.registerEventHandler('i2c_write',I2cParser.prototype.i2cWriteEvent.bind(this));importer.registerEventHandler('i2c_read',I2cParser.prototype.i2cReadEvent.bind(this));importer.registerEventHandler('i2c_reply',I2cParser.prototype.i2cReplyEvent.bind(this));importer.registerEventHandler('i2c_result',I2cParser.prototype.i2cResultEvent.bind(this));}
-const i2cWriteReplyRE=new RegExp('i2c-(\\d+) #(\\d+) a=([\\da-fA-F]+) f=([\\da-fA-F]+) l=(\\d+) '+'(\\[[\\da-fA-F\\-]+\\])');const i2cReadRE=/i2c-(\d+) #(\d+) a=([\da-fA-F]+) f=([\da-fA-F]+) l=(\d+)/;const i2cResultRE=/i2c-(\d+) n=(\d+) ret=(\d+)/;I2cParser.prototype={__proto__:Parser.prototype,i2cWriteEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cWriteReplyRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const messageNumber=event[2];const address=event[3];const flags=event[4];const dataLength=event[5];const data=event[6];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle='i2c write';thread.lastEntryTs=ts;thread.lastEntryArgs={'Message number':messageNumber,'Address':address,'Flags':flags,'Data Length':dataLength,'Data':data};return true;},i2cReadEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cReadRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const messageNumber=event[2];const address=event[3];const flags=event[4];const dataLength=event[5];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle='i2c read';thread.lastEntryTs=ts;thread.lastEntryArgs={'Message number':messageNumber,'Address':address,'Flags':flags,'Data Length':dataLength};return true;},i2cReplyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cWriteReplyRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const messageNumber=event[2];const address=event[3];const flags=event[4];const dataLength=event[5];const data=event[6];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle='i2c reply';thread.lastEntryTs=ts;thread.lastEntryArgs={'Message number':messageNumber,'Address':address,'Flags':flags,'Data Length':dataLength,'Data':data};return true;},i2cResultEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cResultRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const numMessages=event[2];const ret=event[3];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);const args=thread.lastEntryArgs;if(args!==undefined){args['Number of messages']=numMessages;args.Return=ret;}
-pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle=undefined;thread.lastEntryTs=undefined;thread.lastEntryArgs=undefined;return true;},};function pushLastSliceIfNeeded(thread,id,currentTs){if(thread.lastEntryTs!==undefined){const duration=currentTs-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('',thread.lastEntryTitle,ColorScheme.getColorIdForGeneralPurposeString(id),thread.lastEntryTs,thread.lastEntryArgs,duration);thread.thread.sliceGroup.pushSlice(slice);}}
-Parser.register(I2cParser);return{I2cParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function I915Parser(importer){Parser.call(this,importer);importer.registerEventHandler('i915_gem_object_create',I915Parser.prototype.gemObjectCreateEvent.bind(this));importer.registerEventHandler('i915_gem_object_bind',I915Parser.prototype.gemObjectBindEvent.bind(this));importer.registerEventHandler('i915_gem_object_unbind',I915Parser.prototype.gemObjectBindEvent.bind(this));importer.registerEventHandler('i915_gem_object_change_domain',I915Parser.prototype.gemObjectChangeDomainEvent.bind(this));importer.registerEventHandler('i915_gem_object_pread',I915Parser.prototype.gemObjectPreadWriteEvent.bind(this));importer.registerEventHandler('i915_gem_object_pwrite',I915Parser.prototype.gemObjectPreadWriteEvent.bind(this));importer.registerEventHandler('i915_gem_object_fault',I915Parser.prototype.gemObjectFaultEvent.bind(this));importer.registerEventHandler('i915_gem_object_clflush',I915Parser.prototype.gemObjectDestroyEvent.bind(this));importer.registerEventHandler('i915_gem_object_destroy',I915Parser.prototype.gemObjectDestroyEvent.bind(this));importer.registerEventHandler('i915_gem_ring_dispatch',I915Parser.prototype.gemRingDispatchEvent.bind(this));importer.registerEventHandler('i915_gem_ring_flush',I915Parser.prototype.gemRingFlushEvent.bind(this));importer.registerEventHandler('i915_gem_request',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_add',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_complete',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_retire',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_wait_begin',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_wait_end',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_ring_wait_begin',I915Parser.prototype.gemRingWaitEvent.bind(this));importer.registerEventHandler('i915_gem_ring_wait_end',I915Parser.prototype.gemRingWaitEvent.bind(this));importer.registerEventHandler('i915_reg_rw',I915Parser.prototype.regRWEvent.bind(this));importer.registerEventHandler('i915_flip_request',I915Parser.prototype.flipEvent.bind(this));importer.registerEventHandler('i915_flip_complete',I915Parser.prototype.flipEvent.bind(this));importer.registerEventHandler('intel_gpu_freq_change',I915Parser.prototype.gpuFrequency.bind(this));}
-I915Parser.prototype={__proto__:Parser.prototype,i915FlipOpenSlice(ts,obj,plane){const kthread=this.importer.getOrCreatePseudoThread('i915_flip');kthread.openSliceTS=ts;kthread.openSlice='flip:'+obj+'/'+plane;},i915FlipCloseSlice(ts,args){const kthread=this.importer.getOrCreatePseudoThread('i915_flip');if(kthread.openSlice){const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),kthread.openSliceTS,args,ts-kthread.openSliceTS);kthread.thread.sliceGroup.pushSlice(slice);}
-kthread.openSlice=undefined;},i915GemObjectSlice(ts,eventName,obj,args){const kthread=this.importer.getOrCreatePseudoThread('i915_gem');kthread.openSlice=eventName+':'+obj;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},i915GemRingSlice(ts,eventName,dev,ring,args){const kthread=this.importer.getOrCreatePseudoThread('i915_gem_ring');kthread.openSlice=eventName+':'+dev+'.'+ring;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},i915RegSlice(ts,eventName,reg,args){const kthread=this.importer.getOrCreatePseudoThread('i915_reg');kthread.openSlice=eventName+':'+reg;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},i915FreqChangeSlice(ts,eventName,args){const kthread=this.importer.getOrCreatePseudoThread('i915_gpu_freq');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},gemObjectCreateEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), size=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const size=parseInt(event[2]);this.i915GemObjectSlice(ts,eventName,obj,{obj,size});return true;},gemObjectBindEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), offset=(\w+), size=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const offset=event[2];const size=parseInt(event[3]);this.i915ObjectGemSlice(ts,eventName+':'+obj,{obj,offset,size});return true;},gemObjectChangeDomainEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), read=(\w+=>\w+), write=(\w+=>\w+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const read=event[2];const write=event[3];this.i915GemObjectSlice(ts,eventName,obj,{obj,read,write});return true;},gemObjectPreadWriteEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), offset=(\d+), len=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const offset=parseInt(event[2]);const len=parseInt(event[3]);this.i915GemObjectSlice(ts,eventName,obj,{obj,offset,len});return true;},gemObjectFaultEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), (\w+) index=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const type=event[2];const index=parseInt(event[3]);this.i915GemObjectSlice(ts,eventName,obj,{obj,type,index});return true;},gemObjectDestroyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];this.i915GemObjectSlice(ts,eventName,obj,{obj});return true;},gemRingDispatchEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);const seqno=parseInt(event[3]);this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring,seqno});return true;},gemRingFlushEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\w+), invalidate=(\w+), flush=(\w+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);const invalidate=event[3];const flush=event[4];this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring,invalidate,flush});return true;},gemRequestEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);const seqno=parseInt(event[3]);this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring,seqno});return true;},gemRingWaitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\d+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring});return true;},regRWEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/(\w+) reg=(\w+), len=(\d+), val=(\(\w+, \w+\))/.exec(eventBase.details);if(!event)return false;const rw=event[1];const reg=event[2];const len=event[3];const data=event[3];this.i915RegSlice(ts,rw,reg,{rw,reg,len,data});return true;},flipEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/plane=(\d+), obj=(\w+)/.exec(eventBase.details);if(!event)return false;const plane=parseInt(event[1]);const obj=event[2];if(eventName==='i915_flip_request'){this.i915FlipOpenSlice(ts,obj,plane);}else{this.i915FlipCloseSlice(ts,{obj,plane});}
-return true;},gpuFrequency(eventName,cpuNumver,pid,ts,eventBase){const event=/new_freq=(\d+)/.exec(eventBase.details);if(!event)return false;const freq=parseInt(event[1]);this.i915FreqChangeSlice(ts,eventName,{freq});return true;}};Parser.register(I915Parser);return{I915Parser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function IonHeapParser(importer){Parser.call(this,importer);importer.registerEventHandler('ion_heap_shrink',IonHeapParser.prototype.traceIonHeapShrink.bind(this));importer.registerEventHandler('ion_heap_grow',IonHeapParser.prototype.traceIonHeapGrow.bind(this));this.model_=importer.model_;}
-const TestExports={};const ionHeapRE=new RegExp('heap_name=(\\S+), len=(\\d+), total_allocated=(\\d+)');TestExports.ionHeapRE=ionHeapRE;IonHeapParser.prototype={__proto__:Parser.prototype,traceIonHeapShrink(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=ionHeapRE.exec(eventBase.details);if(!event)return false;const name=event[1];const len=parseInt(event[2]);const totalAllocated=parseInt(event[3]);const ionHeap=totalAllocated+len;const ctr=this.model_.kernel.getOrCreateCounter(null,name+' ion heap');if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,ionHeap);});return true;},traceIonHeapGrow(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=ionHeapRE.exec(eventBase.details);if(!event)return false;const name=event[1];const len=parseInt(event[2]);const totalAllocated=parseInt(event[3]);const ionHeap=totalAllocated+len;const ctr=this.model_.kernel.getOrCreateCounter(null,name+' ion heap');if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,ionHeap);});return true;}};Parser.register(IonHeapParser);return{IonHeapParser,_IonHeapParserTestExports:TestExports};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function IrqParser(importer){Parser.call(this,importer);importer.registerEventHandler('irq_handler_entry',IrqParser.prototype.irqHandlerEntryEvent.bind(this));importer.registerEventHandler('irq_handler_exit',IrqParser.prototype.irqHandlerExitEvent.bind(this));importer.registerEventHandler('softirq_raise',IrqParser.prototype.softirqRaiseEvent.bind(this));importer.registerEventHandler('softirq_entry',IrqParser.prototype.softirqEntryEvent.bind(this));importer.registerEventHandler('softirq_exit',IrqParser.prototype.softirqExitEvent.bind(this));importer.registerEventHandler('ipi_entry',IrqParser.prototype.ipiEntryEvent.bind(this));importer.registerEventHandler('ipi_exit',IrqParser.prototype.ipiExitEvent.bind(this));importer.registerEventHandler('preempt_disable',IrqParser.prototype.preemptStartEvent.bind(this));importer.registerEventHandler('preempt_enable',IrqParser.prototype.preemptEndEvent.bind(this));importer.registerEventHandler('irq_disable',IrqParser.prototype.irqoffStartEvent.bind(this));importer.registerEventHandler('irq_enable',IrqParser.prototype.irqoffEndEvent.bind(this));}
-const irqHandlerEntryRE=/irq=(\d+) name=(.+)/;const irqHandlerExitRE=/irq=(\d+) ret=(.+)/;const softirqRE=/vec=(\d+) \[action=(.+)\]/;const ipiHandlerExitRE=/\((.+)\)/;const preemptirqRE=/caller=(.+) parent=(.+)/;IrqParser.prototype={__proto__:Parser.prototype,irqHandlerEntryEvent(eventName,cpuNumber,pid,ts,eventBase){const event=irqHandlerEntryRE.exec(eventBase.details);if(!event)return false;const irq=parseInt(event[1]);const name=event[2];const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);thread.lastEntryTs=ts;thread.irqName=name;return true;},irqHandlerExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=irqHandlerExitRE.exec(eventBase.details);if(!event)return false;const irq=parseInt(event[1]);const ret=event[2];const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('','IRQ ('+thread.irqName+')',ColorScheme.getColorIdForGeneralPurposeString(event[1]),thread.lastEntryTs,{ret},duration);thread.thread.sliceGroup.pushSlice(slice);}
-thread.lastEntryTs=undefined;thread.irqName=undefined;return true;},softirqRaiseEvent(eventName,cpuNumber,pid,ts,eventBase){return true;},softirqEntryEvent(eventName,cpuNumber,pid,ts,eventBase){const event=softirqRE.exec(eventBase.details);if(!event)return false;const action=event[2];const thread=this.importer.getOrCreatePseudoThread('softirq cpu '+cpuNumber);thread.lastEntryTs=ts;return true;},softirqExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=softirqRE.exec(eventBase.details);if(!event)return false;const vec=parseInt(event[1]);const action=event[2];const thread=this.importer.getOrCreatePseudoThread('softirq cpu '+cpuNumber);if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('',action,ColorScheme.getColorIdForGeneralPurposeString(event[1]),thread.lastEntryTs,{vec},duration);thread.thread.sliceGroup.pushSlice(slice);}
-thread.lastEntryTs=undefined;return true;},ipiEntryEvent(eventName,cpuNumber,pid,ts,eventBase){const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);thread.lastEntryTs=ts;return true;},ipiExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=ipiHandlerExitRE.exec(eventBase.details);if(!event)return false;const ipiName=event[1];const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('','IPI ('+ipiName+')',ColorScheme.getColorIdForGeneralPurposeString(ipiName),thread.lastEntryTs,{},duration);thread.thread.sliceGroup.pushSlice(slice);}
-thread.lastEntryTs=undefined;return true;},preemptStartEvent(eventName,cpuNumber,pid,ts,eventBase){const event=preemptirqRE.exec(eventBase.details);if(!event)return false;const thread=this.importer.getOrCreatePseudoThread('preempt cpu '+cpuNumber);thread.lastEntryTs=ts;thread.preemptStartCaller=event[1];thread.preemptStartParent=event[2];return true;},preemptEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=preemptirqRE.exec(eventBase.details);if(!event)return false;const thread=this.importer.getOrCreatePseudoThread('preempt cpu '+cpuNumber);thread.preemptEndCaller=event[1];thread.preemptEndParent=event[2];if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('',thread.preemptStartParent+': '+thread.preemptStartCaller,ColorScheme.getColorIdForGeneralPurposeString(thread.preemptEndCaller),thread.lastEntryTs,{},duration);thread.thread.sliceGroup.pushSlice(slice);}
-thread.lastEntryTs=undefined;return true;},irqoffStartEvent(eventName,cpuNumber,pid,ts,eventBase){const event=preemptirqRE.exec(eventBase.details);if(!event)return false;const thread=this.importer.getOrCreatePseudoThread('irqoff cpu '+cpuNumber);thread.lastEntryTs=ts;thread.irqoffStartCaller=event[1];thread.irqoffStartParent=event[2];return true;},irqoffEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=preemptirqRE.exec(eventBase.details);if(!event)return false;const thread=this.importer.getOrCreatePseudoThread('irqoff cpu '+cpuNumber);thread.irqoffEndCaller=event[1];thread.irqoffEndParent=event[2];if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('',thread.irqoffStartParent+': '+thread.irqoffStartCaller,ColorScheme.getColorIdForGeneralPurposeString(thread.irqoffEndCaller),thread.lastEntryTs,{},duration);thread.thread.sliceGroup.pushSlice(slice);}
-thread.lastEntryTs=undefined;return true;}};Parser.register(IrqParser);return{IrqParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const LinuxPerfParser=tr.e.importer.linux_perf.Parser;function KernelFuncParser(importer){LinuxPerfParser.call(this,importer);importer.registerEventHandler('graph_ent',KernelFuncParser.prototype.traceKernelFuncEnterEvent.bind(this));importer.registerEventHandler('graph_ret',KernelFuncParser.prototype.traceKernelFuncReturnEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
-const TestExports={};const funcEnterRE=new RegExp('func=(.+)');TestExports.funcEnterRE=funcEnterRE;KernelFuncParser.prototype={__proto__:LinuxPerfParser.prototype,traceKernelFuncEnterEvent(eventName,cpuNumber,pid,ts,eventBase){const eventData=funcEnterRE.exec(eventBase.details);if(!eventData)return false;if(eventBase.tgid===undefined){return false;}
-const tgid=parseInt(eventBase.tgid);const name=eventData[1];const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
-const slice=slices.beginSlice(null,name,ts,{});return true;},traceKernelFuncReturnEvent(eventName,cpuNumber,pid,ts,eventBase){if(eventBase.tgid===undefined){return false;}
-const tgid=parseInt(eventBase.tgid);const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
-if(slices.openSliceCount>0){slices.endSlice(ts);}
-return true;}};LinuxPerfParser.register(KernelFuncParser);return{KernelFuncParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function MaliParser(importer){Parser.call(this,importer);importer.registerEventHandler('mali_dvfs_event',MaliParser.prototype.dvfsEventEvent.bind(this));importer.registerEventHandler('mali_dvfs_set_clock',MaliParser.prototype.dvfsSetClockEvent.bind(this));importer.registerEventHandler('mali_dvfs_set_voltage',MaliParser.prototype.dvfsSetVoltageEvent.bind(this));this.addJMCounter('mali_hwc_MESSAGES_SENT','Messages Sent');this.addJMCounter('mali_hwc_MESSAGES_RECEIVED','Messages Received');this.addJMCycles('mali_hwc_GPU_ACTIVE','GPU Active');this.addJMCycles('mali_hwc_IRQ_ACTIVE','IRQ Active');for(let i=0;i<7;i++){const jobStr='JS'+i;const jobHWCStr='mali_hwc_'+jobStr;this.addJMCounter(jobHWCStr+'_JOBS',jobStr+' Jobs');this.addJMCounter(jobHWCStr+'_TASKS',jobStr+' Tasks');this.addJMCycles(jobHWCStr+'_ACTIVE',jobStr+' Active');this.addJMCycles(jobHWCStr+'_WAIT_READ',jobStr+' Wait Read');this.addJMCycles(jobHWCStr+'_WAIT_ISSUE',jobStr+' Wait Issue');this.addJMCycles(jobHWCStr+'_WAIT_DEPEND',jobStr+' Wait Depend');this.addJMCycles(jobHWCStr+'_WAIT_FINISH',jobStr+' Wait Finish');}
-this.addTilerCounter('mali_hwc_TRIANGLES','Triangles');this.addTilerCounter('mali_hwc_QUADS','Quads');this.addTilerCounter('mali_hwc_POLYGONS','Polygons');this.addTilerCounter('mali_hwc_POINTS','Points');this.addTilerCounter('mali_hwc_LINES','Lines');this.addTilerCounter('mali_hwc_VCACHE_HIT','VCache Hit');this.addTilerCounter('mali_hwc_VCACHE_MISS','VCache Miss');this.addTilerCounter('mali_hwc_FRONT_FACING','Front Facing');this.addTilerCounter('mali_hwc_BACK_FACING','Back Facing');this.addTilerCounter('mali_hwc_PRIM_VISIBLE','Prim Visible');this.addTilerCounter('mali_hwc_PRIM_CULLED','Prim Culled');this.addTilerCounter('mali_hwc_PRIM_CLIPPED','Prim Clipped');this.addTilerCounter('mali_hwc_WRBUF_HIT','Wrbuf Hit');this.addTilerCounter('mali_hwc_WRBUF_MISS','Wrbuf Miss');this.addTilerCounter('mali_hwc_WRBUF_LINE','Wrbuf Line');this.addTilerCounter('mali_hwc_WRBUF_PARTIAL','Wrbuf Partial');this.addTilerCounter('mali_hwc_WRBUF_STALL','Wrbuf Stall');this.addTilerCycles('mali_hwc_ACTIVE','Tiler Active');this.addTilerCycles('mali_hwc_INDEX_WAIT','Index Wait');this.addTilerCycles('mali_hwc_INDEX_RANGE_WAIT','Index Range Wait');this.addTilerCycles('mali_hwc_VERTEX_WAIT','Vertex Wait');this.addTilerCycles('mali_hwc_PCACHE_WAIT','Pcache Wait');this.addTilerCycles('mali_hwc_WRBUF_WAIT','Wrbuf Wait');this.addTilerCycles('mali_hwc_BUS_READ','Bus Read');this.addTilerCycles('mali_hwc_BUS_WRITE','Bus Write');this.addTilerCycles('mali_hwc_TILER_UTLB_STALL','Tiler UTLB Stall');this.addTilerCycles('mali_hwc_TILER_UTLB_HIT','Tiler UTLB Hit');this.addFragCycles('mali_hwc_FRAG_ACTIVE','Active');this.addFragCounter('mali_hwc_FRAG_PRIMATIVES','Primitives');this.addFragCounter('mali_hwc_FRAG_PRIMATIVES_DROPPED','Primitives Dropped');this.addFragCycles('mali_hwc_FRAG_CYCLE_DESC','Descriptor Processing');this.addFragCycles('mali_hwc_FRAG_CYCLES_PLR','PLR Processing??');this.addFragCycles('mali_hwc_FRAG_CYCLES_VERT','Vertex Processing');this.addFragCycles('mali_hwc_FRAG_CYCLES_TRISETUP','Triangle Setup');this.addFragCycles('mali_hwc_FRAG_CYCLES_RAST','Rasterization???');this.addFragCounter('mali_hwc_FRAG_THREADS','Threads');this.addFragCounter('mali_hwc_FRAG_DUMMY_THREADS','Dummy Threads');this.addFragCounter('mali_hwc_FRAG_QUADS_RAST','Quads Rast');this.addFragCounter('mali_hwc_FRAG_QUADS_EZS_TEST','Quads EZS Test');this.addFragCounter('mali_hwc_FRAG_QUADS_EZS_KILLED','Quads EZS Killed');this.addFragCounter('mali_hwc_FRAG_QUADS_LZS_TEST','Quads LZS Test');this.addFragCounter('mali_hwc_FRAG_QUADS_LZS_KILLED','Quads LZS Killed');this.addFragCycles('mali_hwc_FRAG_CYCLE_NO_TILE','No Tiles');this.addFragCounter('mali_hwc_FRAG_NUM_TILES','Tiles');this.addFragCounter('mali_hwc_FRAG_TRANS_ELIM','Transactions Eliminated');this.addComputeCycles('mali_hwc_COMPUTE_ACTIVE','Active');this.addComputeCounter('mali_hwc_COMPUTE_TASKS','Tasks');this.addComputeCounter('mali_hwc_COMPUTE_THREADS','Threads Started');this.addComputeCycles('mali_hwc_COMPUTE_CYCLES_DESC','Waiting for Descriptors');this.addTripipeCycles('mali_hwc_TRIPIPE_ACTIVE','Active');this.addArithCounter('mali_hwc_ARITH_WORDS','Instructions (/Pipes)');this.addArithCycles('mali_hwc_ARITH_CYCLES_REG','Reg scheduling stalls (/Pipes)');this.addArithCycles('mali_hwc_ARITH_CYCLES_L0','L0 cache miss stalls (/Pipes)');this.addArithCounter('mali_hwc_ARITH_FRAG_DEPEND','Frag dep check failures (/Pipes)');this.addLSCounter('mali_hwc_LS_WORDS','Instruction Words Completed');this.addLSCounter('mali_hwc_LS_ISSUES','Full Pipeline Issues');this.addLSCounter('mali_hwc_LS_RESTARTS','Restarts (unpairable insts)');this.addLSCounter('mali_hwc_LS_REISSUES_MISS','Pipeline reissue (cache miss/uTLB)');this.addLSCounter('mali_hwc_LS_REISSUES_VD','Pipeline reissue (varying data)');this.addLSCounter('mali_hwc_LS_REISSUE_ATTRIB_MISS','Pipeline reissue (attribute cache miss)');this.addLSCounter('mali_hwc_LS_REISSUE_NO_WB','Writeback not used');this.addTexCounter('mali_hwc_TEX_WORDS','Words');this.addTexCounter('mali_hwc_TEX_BUBBLES','Bubbles');this.addTexCounter('mali_hwc_TEX_WORDS_L0','Words L0');this.addTexCounter('mali_hwc_TEX_WORDS_DESC','Words Desc');this.addTexCounter('mali_hwc_TEX_THREADS','Threads');this.addTexCounter('mali_hwc_TEX_RECIRC_FMISS','Recirc due to Full Miss');this.addTexCounter('mali_hwc_TEX_RECIRC_DESC','Recirc due to Desc Miss');this.addTexCounter('mali_hwc_TEX_RECIRC_MULTI','Recirc due to Multipass');this.addTexCounter('mali_hwc_TEX_RECIRC_PMISS','Recirc due to Partial Cache Miss');this.addTexCounter('mali_hwc_TEX_RECIRC_CONF','Recirc due to Cache Conflict');this.addLSCCounter('mali_hwc_LSC_READ_HITS','Read Hits');this.addLSCCounter('mali_hwc_LSC_READ_MISSES','Read Misses');this.addLSCCounter('mali_hwc_LSC_WRITE_HITS','Write Hits');this.addLSCCounter('mali_hwc_LSC_WRITE_MISSES','Write Misses');this.addLSCCounter('mali_hwc_LSC_ATOMIC_HITS','Atomic Hits');this.addLSCCounter('mali_hwc_LSC_ATOMIC_MISSES','Atomic Misses');this.addLSCCounter('mali_hwc_LSC_LINE_FETCHES','Line Fetches');this.addLSCCounter('mali_hwc_LSC_DIRTY_LINE','Dirty Lines');this.addLSCCounter('mali_hwc_LSC_SNOOPS','Snoops');this.addAXICounter('mali_hwc_AXI_TLB_STALL','Address channel stall');this.addAXICounter('mali_hwc_AXI_TLB_MISS','Cache Miss');this.addAXICounter('mali_hwc_AXI_TLB_TRANSACTION','Transactions');this.addAXICounter('mali_hwc_LS_TLB_MISS','LS Cache Miss');this.addAXICounter('mali_hwc_LS_TLB_HIT','LS Cache Hit');this.addAXICounter('mali_hwc_AXI_BEATS_READ','Read Beats');this.addAXICounter('mali_hwc_AXI_BEATS_WRITE','Write Beats');this.addMMUCounter('mali_hwc_MMU_TABLE_WALK','Page Table Walks');this.addMMUCounter('mali_hwc_MMU_REPLAY_MISS','Cache Miss from Replay Buffer');this.addMMUCounter('mali_hwc_MMU_REPLAY_FULL','Replay Buffer Full');this.addMMUCounter('mali_hwc_MMU_NEW_MISS','Cache Miss on New Request');this.addMMUCounter('mali_hwc_MMU_HIT','Cache Hit');this.addMMUCycles('mali_hwc_UTLB_STALL','UTLB Stalled');this.addMMUCycles('mali_hwc_UTLB_REPLAY_MISS','UTLB Replay Miss');this.addMMUCycles('mali_hwc_UTLB_REPLAY_FULL','UTLB Replay Full');this.addMMUCycles('mali_hwc_UTLB_NEW_MISS','UTLB New Miss');this.addMMUCycles('mali_hwc_UTLB_HIT','UTLB Hit');this.addL2Counter('mali_hwc_L2_READ_BEATS','Read Beats');this.addL2Counter('mali_hwc_L2_WRITE_BEATS','Write Beats');this.addL2Counter('mali_hwc_L2_ANY_LOOKUP','Any Lookup');this.addL2Counter('mali_hwc_L2_READ_LOOKUP','Read Lookup');this.addL2Counter('mali_hwc_L2_SREAD_LOOKUP','Shareable Read Lookup');this.addL2Counter('mali_hwc_L2_READ_REPLAY','Read Replayed');this.addL2Counter('mali_hwc_L2_READ_SNOOP','Read Snoop');this.addL2Counter('mali_hwc_L2_READ_HIT','Read Cache Hit');this.addL2Counter('mali_hwc_L2_CLEAN_MISS','CleanUnique Miss');this.addL2Counter('mali_hwc_L2_WRITE_LOOKUP','Write Lookup');this.addL2Counter('mali_hwc_L2_SWRITE_LOOKUP','Shareable Write Lookup');this.addL2Counter('mali_hwc_L2_WRITE_REPLAY','Write Replayed');this.addL2Counter('mali_hwc_L2_WRITE_SNOOP','Write Snoop');this.addL2Counter('mali_hwc_L2_WRITE_HIT','Write Cache Hit');this.addL2Counter('mali_hwc_L2_EXT_READ_FULL','ExtRD with BIU Full');this.addL2Counter('mali_hwc_L2_EXT_READ_HALF','ExtRD with BIU >1/2 Full');this.addL2Counter('mali_hwc_L2_EXT_WRITE_FULL','ExtWR with BIU Full');this.addL2Counter('mali_hwc_L2_EXT_WRITE_HALF','ExtWR with BIU >1/2 Full');this.addL2Counter('mali_hwc_L2_EXT_READ','External Read (ExtRD)');this.addL2Counter('mali_hwc_L2_EXT_READ_LINE','ExtRD (linefill)');this.addL2Counter('mali_hwc_L2_EXT_WRITE','External Write (ExtWR)');this.addL2Counter('mali_hwc_L2_EXT_WRITE_LINE','ExtWR (linefill)');this.addL2Counter('mali_hwc_L2_EXT_WRITE_SMALL','ExtWR (burst size <64B)');this.addL2Counter('mali_hwc_L2_EXT_BARRIER','External Barrier');this.addL2Counter('mali_hwc_L2_EXT_AR_STALL','Address Read stalls');this.addL2Counter('mali_hwc_L2_EXT_R_BUF_FULL','Response Buffer full stalls');this.addL2Counter('mali_hwc_L2_EXT_RD_BUF_FULL','Read Data Buffer full stalls');this.addL2Counter('mali_hwc_L2_EXT_R_RAW','RAW hazard stalls');this.addL2Counter('mali_hwc_L2_EXT_W_STALL','Write Data stalls');this.addL2Counter('mali_hwc_L2_EXT_W_BUF_FULL','Write Data Buffer full');this.addL2Counter('mali_hwc_L2_EXT_R_W_HAZARD','WAW or WAR hazard stalls');this.addL2Counter('mali_hwc_L2_TAG_HAZARD','Tag hazard replays');this.addL2Cycles('mali_hwc_L2_SNOOP_FULL','Snoop buffer full');this.addL2Cycles('mali_hwc_L2_REPLAY_FULL','Replay buffer full');importer.registerEventHandler('tracing_mark_write:mali_driver',MaliParser.prototype.maliDDKEvent.bind(this));importer.registerEventHandler('mali_job_systrace_event_start',MaliParser.prototype.maliJobEvent.bind(this));importer.registerEventHandler('mali_job_systrace_event_stop',MaliParser.prototype.maliJobEvent.bind(this));this.model_=importer.model_;this.deferredJobs_={};}
-MaliParser.prototype={__proto__:Parser.prototype,maliDDKOpenSlice(pid,tid,ts,func,blockinfo){const thread=this.importer.model_.getOrCreateProcess(pid).getOrCreateThread(tid);const funcArgs=/^([\w\d_]*)(?:\(\))?:?\s*(.*)$/.exec(func);thread.sliceGroup.beginSlice('gpu-driver',funcArgs[1],ts,{'args':funcArgs[2],blockinfo});},maliDDKCloseSlice(pid,tid,ts,args,blockinfo){const thread=this.importer.model_.getOrCreateProcess(pid).getOrCreateThread(tid);if(!thread.sliceGroup.openSliceCount){return;}
-thread.sliceGroup.endSlice(ts);},autoDetectLineRE(line){const lineREWithThread=/^\s*\(([\w\-]*)\)\s*(\w+):\s*([\w\\\/\.\-]*@\d*):?\s*(.*)$/;if(lineREWithThread.test(line)){return lineREWithThread;}
-const lineRENoThread=/^s*()(\w+):\s*([\w\\\/.\-]*):?\s*(.*)$/;if(lineRENoThread.test(line)){return lineRENoThread;}
-return null;},lineRE:null,maliDDKEvent(eventName,cpuNumber,pid,ts,eventBase){if(this.lineRE===null){this.lineRE=this.autoDetectLineRE(eventBase.details);if(this.lineRE===null)return false;}
-const maliEvent=this.lineRE.exec(eventBase.details);const tid=(maliEvent[1]===''?'mali':maliEvent[1]);switch(maliEvent[2]){case'cros_trace_print_enter':this.maliDDKOpenSlice(pid,tid,ts,maliEvent[4],maliEvent[3]);break;case'cros_trace_print_exit':this.maliDDKCloseSlice(pid,tid,ts,[],maliEvent[3]);}
-return true;},maliJobEvent(eventName,cpuNumber,pid,ts,eventBase){const jobEventRE=/^.*tracing_mark_write: (S|F)\|(\d+)\|(\w+)-job\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|([a-z0-9]+)\|(\d+)$/;const jobEvent=jobEventRE.exec(eventBase.details);if(!jobEvent){this.model_.importWarning({type:'parse_error',args:'unexpected mali_job_systrace_event_* event syntax'});return;}
-const jobType=jobEvent[3];const jobId=jobEvent[4];const thread=this.importer.model_.getOrCreateProcess(0).getOrCreateThread('mali:'+jobType);switch(jobEvent[1]){case'S':{const args={ctx:jobEvent[9],pid:parseInt(jobEvent[2],10),dep0:parseInt(jobEvent[5],10),dep1:parseInt(jobEvent[7],10)};if(thread.sliceGroup.openSliceCount){if(!(jobType in this.deferredJobs_)){this.deferredJobs_[jobType]=[];}
-this.deferredJobs_[jobType].push({id:jobId,args});}else{thread.sliceGroup.beginSlice(null,jobId,ts,args);}}break;case'F':{if(!thread.sliceGroup.openSliceCount){return;}
-if(thread.sliceGroup.mostRecentlyOpenedPartialSlice.title!==jobId){this.model_.importWarning({type:'invalid event nesting',message:'non-sequential jobs in same mali job slot'});}
-thread.sliceGroup.endSlice(ts);const deferredJobs=this.deferredJobs_[jobType];if(deferredJobs&&deferredJobs.length){const job=deferredJobs.shift();thread.sliceGroup.beginSlice(null,job.id,ts,job.args);}}break;}
-return true;},dvfsSample(counterName,seriesName,ts,s){const value=parseInt(s);const counter=this.model_.kernel.getOrCreateCounter('DVFS',counterName);if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries(seriesName,ColorScheme.getColorIdForGeneralPurposeString(counter.name)));}
-counter.series.forEach(function(series){series.addCounterSample(ts,value);});},dvfsEventEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/utilization=(\d+)/.exec(eventBase.details);if(!event)return false;this.dvfsSample('DVFS Utilization','utilization',ts,event[1]);return true;},dvfsSetClockEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/frequency=(\d+)/.exec(eventBase.details);if(!event)return false;this.dvfsSample('DVFS Frequency','frequency',ts,event[1]);return true;},dvfsSetVoltageEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/voltage=(\d+)/.exec(eventBase.details);if(!event)return false;this.dvfsSample('DVFS Voltage','voltage',ts,event[1]);return true;},hwcSample(cat,counterName,seriesName,ts,eventBase){const event=/val=(\d+)/.exec(eventBase.details);if(!event)return false;const value=parseInt(event[1]);const counter=this.model_.kernel.getOrCreateCounter(cat,counterName);if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries(seriesName,ColorScheme.getColorIdForGeneralPurposeString(counter.name)));}
-counter.series.forEach(function(series){series.addCounterSample(ts,value);});return true;},jmSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:jm','JM: '+ctrName,seriesName,ts,eventBase);},addJMCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.jmSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addJMCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.jmSample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},tilerSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:tiler','Tiler: '+ctrName,seriesName,ts,eventBase);},addTilerCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.tilerSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addTilerCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.tilerSample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},fragSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:fragment','Fragment: '+ctrName,seriesName,ts,eventBase);},addFragCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.fragSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addFragCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.fragSample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},computeSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:compute','Compute: '+ctrName,seriesName,ts,eventBase);},addComputeCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.computeSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addComputeCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.computeSample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addTripipeCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:shader','Tripipe: '+hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},arithSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:arith','Arith: '+ctrName,seriesName,ts,eventBase);},addArithCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.arithSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addArithCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.arithSample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addLSCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:ls','LS: '+hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},textureSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:texture','Texture: '+ctrName,seriesName,ts,eventBase);},addTexCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.textureSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addLSCCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:lsc','LSC: '+hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addAXICounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:axi','AXI: '+hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},mmuSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:mmu','MMU: '+ctrName,seriesName,ts,eventBase);},addMMUCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.mmuSample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addMMUCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.mmuSample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},l2Sample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:l2','L2: '+ctrName,seriesName,ts,eventBase);},addL2Counter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.l2Sample(hwcTitle,'count',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addL2Cycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.l2Sample(hwcTitle,'cycles',ts,eventBase);}
-this.importer.registerEventHandler(hwcEventName,handler.bind(this));}};Parser.register(MaliParser);return{MaliParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function MemReclaimParser(importer){Parser.call(this,importer);importer.registerEventHandler('mm_vmscan_kswapd_wake',MemReclaimParser.prototype.kswapdWake.bind(this));importer.registerEventHandler('mm_vmscan_kswapd_sleep',MemReclaimParser.prototype.kswapdSleep.bind(this));importer.registerEventHandler('mm_vmscan_direct_reclaim_begin',MemReclaimParser.prototype.reclaimBegin.bind(this));importer.registerEventHandler('mm_vmscan_direct_reclaim_end',MemReclaimParser.prototype.reclaimEnd.bind(this));importer.registerEventHandler('lowmemory_kill',MemReclaimParser.prototype.lowmemoryKill.bind(this));}
-const kswapdWakeRE=/nid=(\d+) order=(\d+)/;const kswapdSleepRE=/nid=(\d+)/;const reclaimBeginRE=/order=(\d+) may_writepage=\d+ gfp_flags=(.+)/;const reclaimEndRE=/nr_reclaimed=(\d+)/;const lowmemoryRE=/([^ ]+) \((\d+)\), page cache (\d+)kB \(limit (\d+)kB\), free (-?\d+)Kb/;MemReclaimParser.prototype={__proto__:Parser.prototype,kswapdWake(eventName,cpuNumber,pid,ts,eventBase){const event=kswapdWakeRE.exec(eventBase.details);if(!event)return false;const tgid=parseInt(eventBase.tgid);const nid=parseInt(event[1]);const order=parseInt(event[2]);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);if(kthread.openSliceTS){if(order>kthread.order){kthread.order=order;}}else{kthread.openSliceTS=ts;kthread.order=order;}
-kthread.waitingFor='kswapSleep';return true;},kswapdSleep(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);if(kthread.waitingFor!=='kswapSleep')return false;kthread.waitingFor=undefined;if(kthread.openSliceTS){kthread.thread.sliceGroup.pushCompleteSlice('memreclaim',eventBase.threadName,kthread.openSliceTS,ts-kthread.openSliceTS,0,0,{order:kthread.order});}
-kthread.openSliceTS=undefined;kthread.order=undefined;return true;},reclaimBegin(eventName,cpuNumber,pid,ts,eventBase){const event=reclaimBeginRE.exec(eventBase.details);if(!event)return false;const order=parseInt(event[1]);const gfp=event[2];const tgid=parseInt(eventBase.tgid);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);kthread.openMemReclaimSliceTS=ts;kthread.order=order;kthread.gfp=gfp;kthread.waitingFor='reclaimEnd';return true;},reclaimEnd(eventName,cpuNumber,pid,ts,eventBase){const event=reclaimEndRE.exec(eventBase.details);if(!event)return false;const nrReclaimed=parseInt(event[1]);const tgid=parseInt(eventBase.tgid);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);if(kthread.waitingFor!=='reclaimEnd')return false;kthread.waitingFor=undefined;if(kthread.openMemReclaimSliceTS!==undefined){kthread.thread.sliceGroup.pushCompleteSlice('memreclaim','direct reclaim',kthread.openMemReclaimSliceTS,ts-kthread.openMemReclaimSliceTS,0,0,{order:kthread.order,gfp:kthread.gfp,nr_reclaimed:nrReclaimed});kthread.openMemReclaimSliceTS=undefined;kthread.order=undefined;kthread.gfp=undefined;return true;}
-return false;},lowmemoryKill(eventName,cpuNumber,pid,ts,eventBase){const event=lowmemoryRE.exec(eventBase.details);if(!event)return false;const tgid=parseInt(eventBase.tgid);const killedName=event[1];const killedPid=parseInt(event[2]);const cache=parseInt(event[3]);const free=parseInt(event[5]);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);kthread.thread.sliceGroup.pushCompleteSlice('lowmemory','low memory kill',ts,0,0,0,{killed_name:killedName,killed_pid:killedPid,cache,free});return true;}};Parser.register(MemReclaimParser);return{MemReclaimParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function MSMParser(importer){Parser.call(this,importer);importer.registerEventHandler('msm_gpu_freq_change',MSMParser.prototype.gpuFrequency.bind(this));importer.registerEventHandler('msm_gpu_submit_flush',MSMParser.prototype.gpuSubmitFlush.bind(this));importer.registerEventHandler('msm_gpu_submit_retired',MSMParser.prototype.gpuSubmitRetired.bind(this));this.model_=importer.model_;this.submits={};this.num_submits=0;}
-MSMParser.prototype={__proto__:Parser.prototype,gpuFrequency(eventName,cpuNumber,pid,ts,eventBase){const event=/new_freq=(\d+)/.exec(eventBase.details);if(!event)return false;const freq=parseInt(event[1]);const counter=this.model_.kernel.getOrCreateCounter('GPU','GPU Frequency');if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries('frequency',ColorScheme.getColorIdForGeneralPurposeString(counter.name)));}
-counter.series.forEach(function(series){series.addCounterSample(ts,freq);});return true;},gpuSubmitFlush(eventName,cpuNumber,pid,ts,eventBase){const event=/id=(\d+) pid=(\d+) ring=(\d+):(\d+) ticks=(\d+)/.exec(eventBase.details);if(!event)return false;const id=parseInt(event[1]);const submit={};submit.flushTS=ts;submit.flushTicks=parseInt(event[5]);submit.pid=parseInt(event[2]);this.submits[id]=submit;this.num_submits++;return true;},gpuSubmitRetired(eventName,cpuNumber,pid,ts,eventBase){const event=/id=(\d+) pid=(\d+) ring=(\d+):(\d+) elapsed=(\d+) ns mhz=(\d+) start=(\d+) end=(\d+)/.exec(eventBase.details);if(!event)return false;const id=parseInt(event[1]);if(!(id in this.submits))return true;const submit=this.submits[id];delete this.submits[id];this.num_submits--;const gpuThread=this.importer.getOrCreatePseudoThread('GPU');submit.elapsedNs=parseInt(event[5]);submit.mhz=parseInt(event[6]);submit.startTicks=parseInt(event[7]);submit.endTicks=parseInt(event[8]);function ticks2ms(ticks){return ticks/19200;}
-const queuedDuration=ticks2ms(submit.startTicks-submit.flushTicks);const runningDuration=ticks2ms(submit.endTicks-submit.startTicks);submit.queuedDuration=queuedDuration;submit.runningDuration=runningDuration;const queued=new tr.model.AsyncSlice('',event[1]+' queued',tr.b.ColorScheme.getColorIdForReservedName('thread_state_runnable'),submit.flushTS,submit,queuedDuration);const running=new tr.model.AsyncSlice('',event[1]+' running',tr.b.ColorScheme.getColorIdForReservedName('thread_state_running'),submit.flushTS+queuedDuration,submit,runningDuration);const async=new tr.model.AsyncSlice('','pipeline',ColorScheme.getColorIdForGeneralPurposeString('ongpu:'+submit.pid),submit.flushTS,submit,queuedDuration+runningDuration);async.hidden=true;async.subSlices.push(queued);async.subSlices.push(running);gpuThread.thread.asyncSliceGroup.push(async);const onGpu=new tr.model.ThreadSlice('',event[1],ColorScheme.getColorIdForGeneralPurposeString('ongpu:'+submit.pid),submit.flushTS+queuedDuration,submit,runningDuration);gpuThread.thread.sliceGroup.pushSlice(onGpu);return true;}};Parser.register(MSMParser);return{MSMParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function PowerParser(importer){Parser.call(this,importer);importer.registerEventHandler('power_start',PowerParser.prototype.powerStartEvent.bind(this));importer.registerEventHandler('power_frequency',PowerParser.prototype.powerFrequencyEvent.bind(this));importer.registerEventHandler('cpu_frequency',PowerParser.prototype.cpuFrequencyEvent.bind(this));importer.registerEventHandler('cpu_frequency_limits',PowerParser.prototype.cpuFrequencyLimitsEvent.bind(this));importer.registerEventHandler('cpu_idle',PowerParser.prototype.cpuIdleEvent.bind(this));}
-PowerParser.prototype={__proto__:Parser.prototype,cpuStateSlice(ts,targetCpuNumber,eventType,cpuState){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);if(eventType!=='1'){this.importer.model.importWarning({type:'parse_error',message:'Don\'t understand power_start events of '+'type '+eventType});return;}
-const powerCounter=targetCpu.getOrCreateCounter('','C-State');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('state',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'state')));}
-powerCounter.series.forEach(function(series){series.addCounterSample(ts,cpuState);});},cpuIdleSlice(ts,targetCpuNumber,cpuState){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','C-State');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('state',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name)));}
-const val=(cpuState!==4294967295?cpuState+1:0);powerCounter.series.forEach(function(series){series.addCounterSample(ts,val);});},cpuFrequencySlice(ts,targetCpuNumber,powerState){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','Clock Frequency');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('state',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'state')));}
-powerCounter.series.forEach(function(series){series.addCounterSample(ts,powerState);});},cpuFrequencyLimitsSlice(ts,targetCpuNumber,minFreq,maxFreq){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','Clock Frequency Limits');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('Min Frequency',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'Min Frequency')));powerCounter.addSeries(new tr.model.CounterSeries('Max Frequency',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'Max Frequency')));}
-powerCounter.series.forEach(function(series){if(series.name==='Min Frequency'){series.addCounterSample(ts,minFreq);}
-if(series.name==='Max Frequency'){series.addCounterSample(ts,maxFreq);}});},powerStartEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/type=(\d+) state=(\d) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[3]);const cpuState=parseInt(event[2]);this.cpuStateSlice(ts,targetCpuNumber,event[1],cpuState);return true;},powerFrequencyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/type=(\d+) state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[3]);const powerState=parseInt(event[2]);this.cpuFrequencySlice(ts,targetCpuNumber,powerState);return true;},cpuFrequencyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[2]);const powerState=parseInt(event[1]);this.cpuFrequencySlice(ts,targetCpuNumber,powerState);return true;},cpuFrequencyLimitsEvent(eventName,cpu,pid,ts,eventBase){const event=/min=(\d+) max=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[3]);const minFreq=parseInt(event[1]);const maxFreq=parseInt(event[2]);this.cpuFrequencyLimitsSlice(ts,targetCpuNumber,minFreq,maxFreq);return true;},cpuIdleEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[2]);const cpuState=parseInt(event[1]);this.cpuIdleSlice(ts,targetCpuNumber,cpuState);return true;}};Parser.register(PowerParser);return{PowerParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function RegulatorParser(importer){Parser.call(this,importer);importer.registerEventHandler('regulator_enable',RegulatorParser.prototype.regulatorEnableEvent.bind(this));importer.registerEventHandler('regulator_enable_delay',RegulatorParser.prototype.regulatorEnableDelayEvent.bind(this));importer.registerEventHandler('regulator_enable_complete',RegulatorParser.prototype.regulatorEnableCompleteEvent.bind(this));importer.registerEventHandler('regulator_disable',RegulatorParser.prototype.regulatorDisableEvent.bind(this));importer.registerEventHandler('regulator_disable_complete',RegulatorParser.prototype.regulatorDisableCompleteEvent.bind(this));importer.registerEventHandler('regulator_set_voltage',RegulatorParser.prototype.regulatorSetVoltageEvent.bind(this));importer.registerEventHandler('regulator_set_voltage_complete',RegulatorParser.prototype.regulatorSetVoltageCompleteEvent.bind(this));this.model_=importer.model_;}
-const regulatorEnableRE=/name=(.+)/;const regulatorDisableRE=/name=(.+)/;const regulatorSetVoltageCompleteRE=/name=(\S+), val=(\d+)/;RegulatorParser.prototype={__proto__:Parser.prototype,getCtr_(ctrName,valueName){const ctr=this.model_.kernel.getOrCreateCounter(null,'vreg '+ctrName+' '+valueName);if(ctr.series[0]===undefined){ctr.addSeries(new tr.model.CounterSeries(valueName,ColorScheme.getColorIdForGeneralPurposeString(ctrName+'.'+valueName)));}
-return ctr;},regulatorEnableEvent(eventName,cpuNum,pid,ts,eventBase){const event=regulatorEnableRE.exec(eventBase.details);if(!event)return false;const name=event[1];const ctr=this.getCtr_(name,'enabled');ctr.series[0].addCounterSample(ts,1);return true;},regulatorEnableDelayEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorEnableCompleteEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorDisableEvent(eventName,cpuNum,pid,ts,eventBase){const event=regulatorDisableRE.exec(eventBase.details);if(!event)return false;const name=event[1];const ctr=this.getCtr_(name,'enabled');ctr.series[0].addCounterSample(ts,0);return true;},regulatorDisableCompleteEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorSetVoltageEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorSetVoltageCompleteEvent(eventName,cpuNum,pid,ts,eventBase){const event=regulatorSetVoltageCompleteRE.exec(eventBase.details);if(!event)return false;const name=event[1];const voltage=parseInt(event[2]);const ctr=this.getCtr_(name,'voltage');ctr.series[0].addCounterSample(ts,voltage);return true;}};Parser.register(RegulatorParser);return{RegulatorParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function RssParser(importer){Parser.call(this,importer);importer.registerEventHandler('rss_stat',RssParser.prototype.rssStat.bind(this));}
-const TestExports={};const rssStatRE=new RegExp('member=(\\d+) size=(\\d+)');TestExports.rssStatRE=rssStatRE;const unknownThreadName='<...>';RssParser.prototype={__proto__:Parser.prototype,rssStat(eventName,cpuNumber,pid,ts,eventBase){const event=rssStatRE.exec(eventBase.details);if(!event)return false;const member=parseInt(event[1]);const size=parseInt(event[2]);if(eventBase.tgid===undefined){return false;}
-const tgid=parseInt(eventBase.tgid);const process=this.importer.model_.getOrCreateProcess(tgid);let subTitle='';if(member===0){subTitle=' (file pages)';}else if(member===1){subTitle=' (anon)';}
-const rssCounter=process.getOrCreateCounter('RSS','RSS '+member+subTitle);if(rssCounter.numSeries===0){rssCounter.addSeries(new tr.model.CounterSeries('RSS',tr.b.ColorScheme.getColorIdForGeneralPurposeString(rssCounter.name)));}
-rssCounter.series.forEach(function(series){series.addCounterSample(ts,size);});return true;},};Parser.register(RssParser);return{RssParser,_RssParserTestExports:TestExports};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function SchedParser(importer){Parser.call(this,importer);importer.registerEventHandler('sched_switch',SchedParser.prototype.schedSwitchEvent.bind(this));importer.registerEventHandler('sched_wakeup',SchedParser.prototype.schedWakeupEvent.bind(this));importer.registerEventHandler('sched_blocked_reason',SchedParser.prototype.schedBlockedEvent.bind(this));importer.registerEventHandler('sched_cpu_hotplug',SchedParser.prototype.schedCpuHotplugEvent.bind(this));}
-const TestExports={};const schedSwitchRE=new RegExp('prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) '+'prev_state=(\\S\\+?|\\S\\|\\S) ==> '+'next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)');const schedBlockedRE=new RegExp('pid=(\\d+) iowait=(\\d) caller=(.+)');TestExports.schedSwitchRE=schedSwitchRE;const schedWakeupRE=/comm=(.+) pid=(\d+) prio=(\d+)(?: success=\d+)? target_cpu=(\d+)/;TestExports.schedWakeupRE=schedWakeupRE;const unknownThreadName='<...>';SchedParser.prototype={__proto__:Parser.prototype,schedSwitchEvent(eventName,cpuNumber,pid,ts,eventBase){const event=schedSwitchRE.exec(eventBase.details);if(!event)return false;const prevState=event[4];const nextComm=event[5];const nextPid=parseInt(event[6]);const nextPrio=parseInt(event[7]);if(eventBase.tgid!==undefined){const tgid=parseInt(eventBase.tgid);const process=this.importer.model_.getOrCreateProcess(tgid);const storedThread=process.getThread(pid);if(!storedThread){const thread=process.getOrCreateThread(pid);thread.name=eventBase.threadName;}else if(storedThread.name===unknownThreadName){storedThread.name=eventBase.threadName;}}
-const nextThread=this.importer.threadsByLinuxPid[nextPid];let nextName;if(nextThread){nextName=nextThread.userFriendlyName;}else{nextName=nextComm;}
-const cpu=this.importer.getOrCreateCpu(cpuNumber);cpu.switchActiveThread(ts,{stateWhenDescheduled:prevState},nextPid,nextName,{comm:nextComm,tid:nextPid,prio:nextPrio});return true;},schedWakeupEvent(eventName,cpuNumber,pid,ts,eventBase){const event=schedWakeupRE.exec(eventBase.details);if(!event)return false;const fromPid=pid;const comm=event[1];pid=parseInt(event[2]);const prio=parseInt(event[3]);this.importer.markPidRunnable(ts,pid,comm,prio,fromPid);return true;},schedCpuHotplugEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/cpu (\d+) (.+) error=(\d+)/.exec(eventBase.details);if(!event)return false;cpuNumber=event[1];const state=event[2];const targetCpu=this.importer.getOrCreateCpu(cpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','Cpu Hotplug');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('State',tr.b.ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'State')));}
-powerCounter.series.forEach(function(series){if(series.name==='State'){series.addCounterSample(ts,state.localeCompare('offline')?0:1);}});return true;},schedBlockedEvent(eventName,cpuNumber,pid,ts,eventBase){const event=schedBlockedRE.exec(eventBase.details);if(!event)return false;pid=parseInt(event[1]);const iowait=parseInt(event[2]);const caller=event[3];this.importer.addPidBlockedReason(ts,pid,iowait,caller);return true;}};Parser.register(SchedParser);return{SchedParser,_SchedParserTestExports:TestExports};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function SyncParser(importer){Parser.call(this,importer);importer.registerEventHandler('sync_timeline',SyncParser.prototype.timelineEvent.bind(this));importer.registerEventHandler('sync_wait',SyncParser.prototype.syncWaitEvent.bind(this));importer.registerEventHandler('sync_pt',SyncParser.prototype.syncPtEvent.bind(this));this.model_=importer.model_;}
-const syncTimelineRE=/name=(\S+) value=(\S*)/;const syncWaitRE=/(\S+) name=(\S+) state=(\d+)/;const syncPtRE=/name=(\S+) value=(\S*)/;SyncParser.prototype={__proto__:Parser.prototype,timelineEvent(eventName,cpuNumber,pid,ts,eventBase){const event=syncTimelineRE.exec(eventBase.details);if(!event)return false;const thread=this.importer.getOrCreatePseudoThread(event[1]);if(thread.lastActiveTs!==undefined){const duration=ts-thread.lastActiveTs;let value=thread.lastActiveValue;if(value===undefined)value=' ';const slice=new tr.model.ThreadSlice('',value,ColorScheme.getColorIdForGeneralPurposeString(value),thread.lastActiveTs,{},duration);thread.thread.sliceGroup.pushSlice(slice);}
-thread.lastActiveTs=ts;thread.lastActiveValue=event[2];return true;},syncWaitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=syncWaitRE.exec(eventBase.details);if(!event)return false;if(eventBase.tgid===undefined){return false;}
-const tgid=parseInt(eventBase.tgid);const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
-const name='fence_wait("'+event[2]+'")';if(event[1]==='begin'){const slice=slices.beginSlice(null,name,ts,{'Start state':event[3]});}else if(event[1]==='end'){if(slices.openSliceCount>0){slices.endSlice(ts);}}else{return false;}
-return true;},syncPtEvent(eventName,cpuNumber,pid,ts,eventBase){return!!syncPtRE.exec(eventBase.details);}};Parser.register(SyncParser);return{SyncParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function ThermalParser(importer){Parser.call(this,importer);importer.registerEventHandler('thermal_temperature',ThermalParser.prototype.traceMarkWriteTemperatureEvent.bind(this));importer.registerEventHandler('cdev_update',ThermalParser.prototype.traceMarkWriteCdevEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
-ThermalParser.prototype={__proto__:Parser.prototype,thermalMark(name,subName,value,ts){const ctr=this.model_.kernel.getOrCreateCounter(null,name+' '+subName);if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
-ctr.series.forEach(function(series){series.addCounterSample(ts,value);});},traceMarkWriteTemperatureEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/thermal_zone=(\S+) id=(\d+) temp_prev=(\d+) temp=(\d+)/.exec(eventBase.details);const name=event[1];const temp=parseInt(event[4]);this.thermalMark(name,'Temperature',temp,ts);return true;},traceMarkWriteCdevEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/type=(\S+) target=(\d+)/.exec(eventBase.details);const name=event[1];const rate=parseInt(event[2]);this.thermalMark(name,'CoolingDevice',rate,ts);return true;}};Parser.register(ThermalParser);return{ThermalParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function WorkqueueParser(importer){Parser.call(this,importer);importer.registerEventHandler('workqueue_execute_start',WorkqueueParser.prototype.executeStartEvent.bind(this));importer.registerEventHandler('workqueue_execute_end',WorkqueueParser.prototype.executeEndEvent.bind(this));importer.registerEventHandler('workqueue_queue_work',WorkqueueParser.prototype.executeQueueWork.bind(this));importer.registerEventHandler('workqueue_activate_work',WorkqueueParser.prototype.executeActivateWork.bind(this));}
-const workqueueExecuteStartRE=/work struct (.+): function (\S+)/;const workqueueExecuteEndRE=/work struct (.+)/;WorkqueueParser.prototype={__proto__:Parser.prototype,executeStartEvent(eventName,cpuNumber,pid,ts,eventBase){const event=workqueueExecuteStartRE.exec(eventBase.details);if(!event)return false;const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,pid,pid);kthread.openSliceTS=ts;kthread.openSlice=event[2];return true;},executeEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=workqueueExecuteEndRE.exec(eventBase.details);if(!event)return false;const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,pid,pid);if(kthread.openSlice){const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),kthread.openSliceTS,{},ts-kthread.openSliceTS);kthread.thread.sliceGroup.pushSlice(slice);}
-kthread.openSlice=undefined;return true;},executeQueueWork(eventName,cpuNumber,pid,ts,eventBase){return true;},executeActivateWork(eventName,cpuNumber,pid,ts,eventBase){return true;}};Parser.register(WorkqueueParser);return{WorkqueueParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const MONOTONIC_TO_FTRACE_GLOBAL_SYNC_ID='linux_clock_monotonic_to_ftrace_global';const IMPORT_PRIORITY=2;function FTraceImporter(model,events){this.importPriority=IMPORT_PRIORITY;this.model_=model;this.events_=events;this.wakeups_=[];this.blockedReasons_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads_();this.lines_=[];this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={};this.haveClockSyncedMonotonicToGlobal_=false;this.clockDomainId_=tr.model.ClockDomainId.LINUX_FTRACE_GLOBAL;}
-const TestExports={};const lineREWithTGID=new RegExp('^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]'+'\\s+[dX.][Nnp.][Hhs.][0-9a-f.]'+'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');const lineParserWithTGID=function(line){const groups=lineREWithTGID.exec(line);if(!groups)return groups;let tgid=groups[3];if(tgid[0]==='-')tgid=undefined;return{threadName:groups[1],pid:groups[2],tgid,cpuNumber:groups[4],timestamp:groups[5],eventName:groups[6],details:groups[7]};};TestExports.lineParserWithTGID=lineParserWithTGID;const lineREWithIRQInfo=new RegExp('^\\s*(.+)-(\\d+)\\s+\\[(\\d+)\\]'+'\\s+[dX.][Nnp.][Hhs.][0-9a-f.]'+'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');const lineParserWithIRQInfo=function(line){const groups=lineREWithIRQInfo.exec(line);if(!groups)return groups;return{threadName:groups[1],pid:groups[2],cpuNumber:groups[3],timestamp:groups[4],eventName:groups[5],details:groups[6]};};TestExports.lineParserWithIRQInfo=lineParserWithIRQInfo;const lineREWithLegacyFmt=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/;const lineParserWithLegacyFmt=function(line){const groups=lineREWithLegacyFmt.exec(line);if(!groups){return groups;}
-return{threadName:groups[1],pid:groups[2],cpuNumber:groups[3],timestamp:groups[4],eventName:groups[5],details:groups[6]};};TestExports.lineParserWithLegacyFmt=lineParserWithLegacyFmt;const traceEventClockSyncRE=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;TestExports.traceEventClockSyncRE=traceEventClockSyncRE;const realTimeClockSyncRE=/trace_event_clock_sync: realtime_ts=(\d+)/;const genericClockSyncRE=/trace_event_clock_sync: name=([\w\-]+)/;const pseudoKernelPID=0;function autoDetectLineParser(line){if(line[0]==='{')return false;if(lineREWithTGID.test(line))return lineParserWithTGID;if(lineREWithIRQInfo.test(line))return lineParserWithIRQInfo;if(lineREWithLegacyFmt.test(line))return lineParserWithLegacyFmt;return undefined;}
-TestExports.autoDetectLineParser=autoDetectLineParser;FTraceImporter.canImport=function(events){if(events instanceof tr.b.TraceStream)events=events.header;if(!(typeof(events)==='string'||events instanceof String)){return false;}
-if(FTraceImporter._extractEventsFromSystraceHTML(events,false).ok){return true;}
-if(FTraceImporter._extractEventsFromSystraceMultiHTML(events,false).ok){return true;}
-if(/^# tracer:/.test(events))return true;const lineBreakIndex=events.indexOf('\n');if(lineBreakIndex>-1)events=events.substring(0,lineBreakIndex);if(autoDetectLineParser(events))return true;return false;};FTraceImporter._extractEventsFromSystraceHTML=function(incomingEvents,produceResult){const failure={ok:false};if(produceResult===undefined)produceResult=true;const header=incomingEvents instanceof tr.b.TraceStream?incomingEvents.header:incomingEvents;if(!/^<!DOCTYPE html>/.test(header))return failure;const r=new tr.importer.SimpleLineReader(incomingEvents);if(!r.advanceToLineMatching(/^  <script>$/))return failure;if(!r.advanceToLineMatching(/^  var linuxPerfData = "\\$/))return failure;const eventsBeginAtLine=r.curLineNumber+1;r.beginSavingLines();if(!r.advanceToLineMatching(/^  <\/script>$/))return failure;let rawEvents=r.endSavingLinesAndGetResult();rawEvents=rawEvents.slice(1,rawEvents.length-1);if(!r.advanceToLineMatching(/^<\/body>$/))return failure;if(!r.advanceToLineMatching(/^<\/html>$/))return failure;function endsWith(str,suffix){return str.indexOf(suffix,str.length-suffix.length)!==-1;}
-function stripSuffix(str,suffix){if(!endsWith(str,suffix))return str;return str.substring(str,str.length-suffix.length);}
-let events=[];if(produceResult){for(let i=0;i<rawEvents.length;i++){let event=rawEvents[i];event=stripSuffix(event,'\\n\\');events.push(event);}}else{events=[rawEvents[rawEvents.length-1]];}
-const oldLastEvent=events[events.length-1];const newLastEvent=stripSuffix(oldLastEvent,'\\n";');if(newLastEvent===oldLastEvent)return failure;events[events.length-1]=newLastEvent;return{ok:true,lines:produceResult?events:undefined,eventsBeginAtLine};};FTraceImporter._extractEventsFromSystraceMultiHTML=function(incomingEvents,produceResult){const failure={ok:false};if(produceResult===undefined)produceResult=true;const header=incomingEvents instanceof tr.b.TraceStream?incomingEvents.header:incomingEvents;if(!(new RegExp('^<!DOCTYPE HTML>','i').test(header)))return failure;const r=new tr.importer.SimpleLineReader(incomingEvents);let events=[];let eventsBeginAtLine;while(!/^# tracer:/.test(events)){if(!r.advanceToLineMatching(/^  <script class="trace-data" type="application\/text">$/)){return failure;}
-eventsBeginAtLine=r.curLineNumber+1;r.beginSavingLines();if(!r.advanceToLineMatching(/^  <\/script>$/))return failure;events=r.endSavingLinesAndGetResult();events=events.slice(1,events.length-1);}
-if(!r.advanceToLineMatching(/^<\/body>$/))return failure;if(!r.advanceToLineMatching(/^<\/html>$/))return failure;return{ok:true,lines:produceResult?events:undefined,eventsBeginAtLine,};};FTraceImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'FTraceImporter';},get model(){return this.model_;},importClockSyncMarkers(){this.lazyInit_();this.forEachLine_(function(text,eventBase,cpuNumber,pid,ts){const eventName=eventBase.eventName;if(eventName!=='tracing_mark_write'&&eventName!=='0')return;if(traceEventClockSyncRE.exec(eventBase.details)||genericClockSyncRE.exec(eventBase.details)){this.traceClockSyncEvent_(eventName,cpuNumber,pid,ts,eventBase);}else if(realTimeClockSyncRE.exec(eventBase.details)){const match=realTimeClockSyncRE.exec(eventBase.details);this.model_.realtime_to_monotonic_offset_ms=ts-match[1];}}.bind(this));},importEvents(){if(this.lines_.length===0)return;const modelTimeTransformer=this.model_.clockSyncManager.getModelTimeTransformer(this.clockDomainId_);this.importCpuData_(modelTimeTransformer);this.buildMapFromLinuxPidsToThreads_();this.buildPerThreadCpuSlicesFromCpuState_();},registerEventHandler(eventName,handler){this.eventHandlers_[eventName]=handler;},getOrCreateCpu(cpuNumber){return this.model_.kernel.getOrCreateCpu(cpuNumber);},getOrCreateKernelThread(kernelThreadName,pid,tid){if(!this.kernelThreadStates_[kernelThreadName]){const thread=this.model_.getOrCreateProcess(pid).getOrCreateThread(tid);thread.name=kernelThreadName;this.kernelThreadStates_[kernelThreadName]={pid,thread,openSlice:undefined,openSliceTS:undefined};this.threadsByLinuxPid[tid]=thread;}
-return this.kernelThreadStates_[kernelThreadName];},getOrCreateBinderKernelThread(kernelThreadName,pid,tid){const key=kernelThreadName+pid+tid;if(!this.kernelThreadStates_[key]){const thread=this.model_.getOrCreateProcess(pid).getOrCreateThread(tid);thread.name=kernelThreadName;this.kernelThreadStates_[key]={pid,thread,openSlice:undefined,openSliceTS:undefined};this.threadsByLinuxPid[tid]=thread;}
-return this.kernelThreadStates_[key];},getOrCreatePseudoThread(threadName){let thread=this.kernelThreadStates_[threadName];if(!thread){thread=this.getOrCreateKernelThread(threadName,pseudoKernelPID,this.pseudoThreadCounter);this.pseudoThreadCounter++;}
-return thread;},markPidRunnable(ts,pid,comm,prio,fromPid){this.wakeups_.push({ts,tid:pid,fromTid:fromPid});},addPidBlockedReason(ts,pid,iowait,caller){this.blockedReasons_.push({ts,tid:pid,iowait,caller});},buildMapFromLinuxPidsToThreads_(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(thread){this.threadsByLinuxPid[thread.tid]=thread;}.bind(this));},buildPerThreadCpuSlicesFromCpuState_(){const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;for(const cpuNumber in this.model_.kernel.cpus){const cpu=this.model_.kernel.cpus[cpuNumber];for(let i=0;i<cpu.slices.length;i++){const cpuSlice=cpu.slices[i];const thread=this.threadsByLinuxPid[cpuSlice.args.tid];if(!thread)continue;cpuSlice.threadThatWasRunning=thread;if(!thread.tempCpuSlices){thread.tempCpuSlices=[];}
-thread.tempCpuSlices.push(cpuSlice);}}
-for(const i in this.wakeups_){const wakeup=this.wakeups_[i];const thread=this.threadsByLinuxPid[wakeup.tid];if(!thread)continue;thread.tempWakeups=thread.tempWakeups||[];thread.tempWakeups.push(wakeup);}
-for(const i in this.blockedReasons_){const reason=this.blockedReasons_[i];const thread=this.threadsByLinuxPid[reason.tid];if(!thread)continue;thread.tempBlockedReasons=thread.tempBlockedReasons||[];thread.tempBlockedReasons.push(reason);}
-this.model_.getAllThreads().forEach(function(thread){if(thread.tempCpuSlices===undefined)return;const origSlices=thread.tempCpuSlices;delete thread.tempCpuSlices;origSlices.sort(function(x,y){return x.start-y.start;});const wakeups=thread.tempWakeups||[];delete thread.tempWakeups;wakeups.sort(function(x,y){return x.ts-y.ts;});const reasons=thread.tempBlockedReasons||[];delete thread.tempBlockedReasons;reasons.sort(function(x,y){return x.ts-y.ts;});const slices=[];if(origSlices.length){const slice=origSlices[0];if(wakeups.length&&wakeups[0].ts<slice.start){const wakeup=wakeups.shift();const wakeupDuration=slice.start-wakeup.ts;const args={'wakeup from tid':wakeup.fromTid};slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNABLE,'',wakeup.ts,args,wakeupDuration));}
-const runningSlice=new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNING,'',slice.start,{},slice.duration);runningSlice.cpuOnWhichThreadWasRunning=slice.cpu;slices.push(runningSlice);}
-for(let i=1;i<origSlices.length;i++){let wakeup=undefined;const prevSlice=origSlices[i-1];const nextSlice=origSlices[i];let midDuration=nextSlice.start-prevSlice.end;while(wakeups.length&&wakeups[0].ts<nextSlice.start){const w=wakeups.shift();if(wakeup===undefined&&w.ts>prevSlice.end){wakeup=w;}}
-let blockedReason=undefined;while(reasons.length&&reasons[0].ts<prevSlice.end){const r=reasons.shift();}
-if(wakeup!==undefined&&reasons.length&&reasons[0].ts<wakeup.ts){blockedReason=reasons.shift();}
-const pushSleep=function(state){if(wakeup!==undefined){midDuration=wakeup.ts-prevSlice.end;}
-if(blockedReason!==undefined){const args={'kernel callsite when blocked:':blockedReason.caller};if(blockedReason.iowait){switch(state){case SCHEDULING_STATE.UNINTR_SLEEP:state=SCHEDULING_STATE.UNINTR_SLEEP_IO;break;case SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL:state=SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL_IO;break;case SCHEDULING_STATE.UNINTR_SLEEP_WAKING:state=SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL_IO;break;default:}}
-slices.push(new tr.model.ThreadTimeSlice(thread,state,'',prevSlice.end,args,midDuration));}else{slices.push(new tr.model.ThreadTimeSlice(thread,state,'',prevSlice.end,{},midDuration));}
-if(wakeup!==undefined){const wakeupDuration=nextSlice.start-wakeup.ts;const args={'wakeup from tid':wakeup.fromTid};slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNABLE,'',wakeup.ts,args,wakeupDuration));wakeup=undefined;}};if(prevSlice.args.stateWhenDescheduled==='S'){pushSleep(SCHEDULING_STATE.SLEEPING);}else if(prevSlice.args.stateWhenDescheduled==='R'||prevSlice.args.stateWhenDescheduled==='R+'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNABLE,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='D'){pushSleep(SCHEDULING_STATE.UNINTR_SLEEP);}else if(prevSlice.args.stateWhenDescheduled==='T'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.STOPPED,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='t'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.DEBUG,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='Z'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.ZOMBIE,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='X'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.EXIT_DEAD,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='x'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.TASK_DEAD,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='K'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.WAKE_KILL,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='W'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.WAKING,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='D|K'){pushSleep(SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL);}else if(prevSlice.args.stateWhenDescheduled==='D|W'){pushSleep(SCHEDULING_STATE.UNINTR_SLEEP_WAKING);}else{slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.UNKNOWN,'',prevSlice.end,{},midDuration));this.model_.importWarning({type:'parse_error',message:'Unrecognized sleep state: '+
-prevSlice.args.stateWhenDescheduled});}
-const runningSlice=new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNING,'',nextSlice.start,{},nextSlice.duration);runningSlice.cpuOnWhichThreadWasRunning=prevSlice.cpu;slices.push(runningSlice);}
-thread.timeSlices=slices;},this);},createParsers_(){const allTypeInfos=tr.e.importer.linux_perf.Parser.getAllRegisteredTypeInfos();const parsers=allTypeInfos.map(function(typeInfo){return new typeInfo.constructor(this);},this);return parsers;},registerDefaultHandlers_(){this.registerEventHandler('tracing_mark_write',FTraceImporter.prototype.traceMarkingWriteEvent_.bind(this));this.registerEventHandler('0',FTraceImporter.prototype.traceMarkingWriteEvent_.bind(this));this.registerEventHandler('tracing_mark_write:trace_event_clock_sync',function(){return true;});this.registerEventHandler('0:trace_event_clock_sync',function(){return true;});},traceClockSyncEvent_(eventName,cpuNumber,pid,ts,eventBase){let event=/name=(\w+?)\s(.+)/.exec(eventBase.details);if(event){const name=event[1];const pieces=event[2].split(' ');const args={perfTs:ts};for(let i=0;i<pieces.length;i++){const parts=pieces[i].split('=');if(parts.length!==2){throw new Error('omgbbq');}
-args[parts[0]]=parts[1];}
-this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,name,ts);return true;}
-event=/name=([\w\-]+)/.exec(eventBase.details);if(event){this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,event[1],ts);return true;}
-event=/parent_ts=(\d+\.?\d*)/.exec(eventBase.details);if(!event)return false;let monotonicTs=event[1]*1000;if(monotonicTs===0)monotonicTs=ts;if(this.haveClockSyncedMonotonicToGlobal_){return true;}
-this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,MONOTONIC_TO_FTRACE_GLOBAL_SYNC_ID,ts);this.model_.clockSyncManager.addClockSyncMarker(tr.model.ClockDomainId.LINUX_CLOCK_MONOTONIC,MONOTONIC_TO_FTRACE_GLOBAL_SYNC_ID,monotonicTs);this.haveClockSyncedMonotonicToGlobal_=true;return true;},traceMarkingWriteEvent_(eventName,cpuNumber,pid,ts,eventBase,threadName){eventBase.details=eventBase.details.replace(/\\n.*$/,'');const event=/^\s*(\w+):\s*(.*)$/.exec(eventBase.details);if(!event){const tag=eventBase.details.substring(0,2);if(tag==='B|'||tag==='E'||tag==='E|'||tag==='X|'||tag==='C|'||tag==='S|'||tag==='F|'){eventBase.subEventName='android';}else{return false;}}else{eventBase.subEventName=event[1];eventBase.details=event[2];}
-const writeEventName=eventName+':'+eventBase.subEventName;const handler=this.eventHandlers_[writeEventName];if(!handler){this.model_.importWarning({type:'parse_error',message:'Unknown trace_marking_write event '+writeEventName});return true;}
-return handler(writeEventName,cpuNumber,pid,ts,eventBase,threadName);},importCpuData_(modelTimeTransformer){this.forEachLine_(function(text,eventBase,cpuNumber,pid,ts){const eventName=eventBase.eventName;const handler=this.eventHandlers_[eventName];if(!handler){this.model_.importWarning({type:'parse_error',message:'Unknown event '+eventName+' ('+text+')'});return;}
-ts=modelTimeTransformer(ts);if(!handler(eventName,cpuNumber,pid,ts,eventBase)){this.model_.importWarning({type:'parse_error',message:'Malformed '+eventName+' event ('+text+')'});}}.bind(this));},parseLines_(){let extractResult=FTraceImporter._extractEventsFromSystraceHTML(this.events_,true);if(!extractResult.ok){extractResult=FTraceImporter._extractEventsFromSystraceMultiHTML(this.events_,true);}
-let lineParser=undefined;if(extractResult.ok){for(const line of extractResult.lines){lineParser=this.parseLine_(line,lineParser);}}else{const r=new tr.importer.SimpleLineReader(this.events_);for(const line of r){lineParser=this.parseLine_(line,lineParser);}}},parseLine_(line,lineParser){line=line.trim();if(line.length===0)return lineParser;if(/^#/.test(line)){const clockType=/^# clock_type=([A-Z_]+)$/.exec(line);if(clockType){this.clockDomainId_=clockType[1];}
-return lineParser;}
-if(!lineParser){lineParser=autoDetectLineParser(line);if(!lineParser){this.model_.importWarning({type:'parse_error',message:'Cannot parse line: '+line});return lineParser;}}
-const eventBase=lineParser(line);if(!eventBase){this.model_.importWarning({type:'parse_error',message:'Unrecognized line: '+line});return lineParser;}
-this.lines_.push([line,eventBase,parseInt(eventBase.cpuNumber),parseInt(eventBase.pid),parseFloat(eventBase.timestamp)*1000]);return lineParser;},forEachLine_(handler){for(let i=0;i<this.lines_.length;++i){const line=this.lines_[i];handler.apply(this,line);}},lazyInit_(){this.parsers_=this.createParsers_();this.registerDefaultHandlers_();this.parseLines_();}};tr.importer.Importer.register(FTraceImporter);return{FTraceImporter,_FTraceImporterTestExports:TestExports,IMPORT_PRIORITY,};});'use strict';tr.exportTo('tr.e.importer.android.atrace_process_dump',function(){const IMPORT_PRIORITY=tr.e.importer.linux_perf.IMPORT_PRIORITY+1;const HEADER='ATRACE_PROCESS_DUMP';const PROTECTION_FLAG_LETTERS={'-':0,'r':tr.model.VMRegion.PROTECTION_FLAG_READ,'w':tr.model.VMRegion.PROTECTION_FLAG_WRITE,'x':tr.model.VMRegion.PROTECTION_FLAG_EXECUTE,'s':tr.model.VMRegion.PROTECTION_FLAG_MAYSHARE,};class AtraceProcessDumpImporter extends tr.importer.Importer{constructor(model,data){super(model,data);this.importPriority=IMPORT_PRIORITY;this.model_=model;this.raw_data_=data;this.clock_sync_markers_={};this.snapshots_=[];this.processes_={};}
-static canImport(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
-return events.startsWith(HEADER);}
-get importerName(){return'AtraceProcessDumpImporter';}
-get model(){return this.model_;}
-lazyParseData(){if(this.raw_data_===undefined){return;}
-const dump=JSON.parse(this.raw_data_.slice(HEADER.length+1));this.clock_sync_markers_=dump.clock_sync_markers;this.snapshots_=dump.dump.snapshots;this.processes_=dump.dump.processes;this.raw_data_=undefined;}
-importClockSyncMarkers(){this.lazyParseData();for(const syncId in this.clock_sync_markers_){const ts=parseInt(this.clock_sync_markers_[syncId]);this.model_.clockSyncManager.addClockSyncMarker(tr.model.ClockDomainId.LINUX_CLOCK_MONOTONIC,syncId,ts);}}
-setProcessMemoryDumpTotals_(pmd,processInfo){pmd.totals={'residentBytes':processInfo.rss*1024,'platformSpecific':{'vm':processInfo.vm*1024}};const totals=pmd.totals.platformSpecific;function importGpuMetric(name){if(processInfo[name]!==undefined&&processInfo[name]>0){totals[name]=processInfo[name]*1024;totals[name+'_pss']=processInfo[name+'_pss']*1024;}}
-importGpuMetric('gpu_egl');importGpuMetric('gpu_gl');importGpuMetric('gpu_etc');if(processInfo.pss!==undefined){totals.pss=processInfo.pss*1024;totals.swp=processInfo.swp*1024;totals.pc=processInfo.pc*1024;totals.pd=processInfo.pd*1024;totals.sc=processInfo.sc*1024;totals.sd=processInfo.sd*1024;}}
-setProcessMemoryDumpVmRegions_(pmd,processInfo){if(processInfo.mmaps===undefined){return;}
-const vmRegions=[];for(const memoryMap of processInfo.mmaps){const addr=memoryMap.vm.split('-').map(x=>parseInt(x,16));let flags=0;for(const letter of memoryMap.flags){flags|=PROTECTION_FLAG_LETTERS[letter];}
-const totals={'proportionalResident':memoryMap.pss*1024,'privateCleanResident':memoryMap.pc*1024,'privateDirtyResident':memoryMap.pd*1024,'sharedCleanResident':memoryMap.sc*1024,'sharedDirtyResident':memoryMap.sd*1024,'swapped':memoryMap.swp*1024,};vmRegions.push(new tr.model.VMRegion(addr[0],addr[1]-addr[0],flags,memoryMap.file,totals));}
-pmd.vmRegions=tr.model.VMRegionClassificationNode.fromRegions(vmRegions);}
-importEvents(){this.lazyParseData();for(const[pid,process]of Object.entries(this.processes_)){const modelProcess=this.model_.getProcess(pid);if(modelProcess===undefined){continue;}
-modelProcess.name=process.name;const threads=process.threads;if(threads===undefined){continue;}
-for(const[tid,thread]of Object.entries(threads)){const modelThread=modelProcess.threads[tid];if(modelThread===undefined){continue;}
-modelThread.name=thread.name;}}
-const memCounter=this.model_.kernel.getOrCreateCounter('global','SystemMemory');const memUsedSeries=new tr.model.CounterSeries('Used (KB)',0);const memSwappedSeries=new tr.model.CounterSeries('Swapped (KB)',0);memCounter.addSeries(memUsedSeries);memCounter.addSeries(memSwappedSeries);for(const snapshot of this.snapshots_){const ts=parseInt(snapshot.ts);const memoryDump=snapshot.memdump;if(memoryDump===undefined){const memInfo=snapshot.meminfo;if(memInfo===undefined){continue;}
-const memCaches=memInfo.Buffers+memInfo.Cached-memInfo.Mapped;const memUsed=memInfo.MemTotal-memInfo.MemFree-memCaches;const memSwapped=memInfo.SwapTotal-memInfo.SwapFree;memUsedSeries.addCounterSample(ts,memUsed);memSwappedSeries.addCounterSample(ts,memSwapped);continue;}
-const gmd=new tr.model.GlobalMemoryDump(this.model_,ts);this.model_.globalMemoryDumps.push(gmd);for(const[pid,processInfo]of Object.entries(memoryDump)){if(processInfo.rss===undefined){continue;}
-const modelProcess=this.model_.getProcess(pid);if(modelProcess===undefined){continue;}
-const pmd=new tr.model.ProcessMemoryDump(gmd,modelProcess,ts);gmd.processMemoryDumps[pid]=pmd;modelProcess.memoryDumps.push(pmd);this.setProcessMemoryDumpTotals_(pmd,processInfo);this.setProcessMemoryDumpVmRegions_(pmd,processInfo);}}}}
-tr.importer.Importer.register(AtraceProcessDumpImporter);return{AtraceProcessDumpImporter,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;function Activity(name,category,range,args){tr.model.TimedEvent.call(this,range.min);this.title=name;this.category=category;this.colorId=ColorScheme.getColorIdForGeneralPurposeString(name);this.duration=range.duration;this.args=args;this.name=name;}
-Activity.prototype={__proto__:tr.model.TimedEvent.prototype,shiftTimestampsForward(amount){this.start+=amount;},addBoundsToRange(range){range.addValue(this.start);range.addValue(this.end);}};return{Activity,};});'use strict';tr.exportTo('tr.e.importer.android',function(){const Importer=tr.importer.Importer;const ACTIVITY_STATE={NONE:'none',CREATED:'created',STARTED:'started',RESUMED:'resumed',PAUSED:'paused',STOPPED:'stopped',DESTROYED:'destroyed'};const activityMap={};function EventLogImporter(model,events){this.model_=model;this.events_=events;this.importPriority=3;}
-const eventLogActivityRE=new RegExp('(\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d+)'+'\\s+(\\d+)\\s+(\\d+)\\s+([A-Z])\\s*'+'(am_\\w+)\\s*:(.*)');const amCreateRE=new RegExp('\s*\\[.*,.*,.*,(.*),.*,.*,.*,.*\\]');const amFocusedRE=new RegExp('\s*\\[\\d+,(.*)\\]');const amProcStartRE=new RegExp('\s*\\[\\d+,\\d+,\\d+,.*,activity,(.*)\\]');const amOnResumeRE=new RegExp('\s*\\[\\d+,(.*)\\]');const amOnPauseRE=new RegExp('\s*\\[\\d+,(.*)\\]');const amLaunchTimeRE=new RegExp('\s*\\[\\d+,\\d+,(.*),(\\d+),(\\d+)');const amDestroyRE=new RegExp('\s*\\[\\d+,\\d+,\\d+,(.*)\\]');EventLogImporter.canImport=function(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
-if(/^<!DOCTYPE html>/.test(events))return false;return eventLogActivityRE.test(events);};EventLogImporter.prototype={__proto__:Importer.prototype,get importerName(){return'EventLogImporter';},get model(){return this.model_;},getFullActivityName(component){const componentSplit=component.split('/');if(componentSplit[1].startsWith('.')){return componentSplit[0]+componentSplit[1];}
-return componentSplit[1];},getProcName(component){const componentSplit=component.split('/');return componentSplit[0];},findOrCreateActivity(activityName){if(activityName in activityMap){return activityMap[activityName];}
-const activity={state:ACTIVITY_STATE.NONE,name:activityName};activityMap[activityName]=activity;return activity;},deleteActivity(activityName){delete activityMap[activityName];},handleCreateActivity(ts,activityName){const activity=this.findOrCreateActivity(activityName);activity.state=ACTIVITY_STATE.CREATED;activity.createdTs=ts;},handleFocusActivity(ts,procName,activityName){const activity=this.findOrCreateActivity(activityName);activity.lastFocusedTs=ts;},handleProcStartForActivity(ts,activityName){const activity=this.findOrCreateActivity(activityName);activity.procStartTs=ts;},handleOnResumeCalled(ts,pid,activityName){const activity=this.findOrCreateActivity(activityName);activity.state=ACTIVITY_STATE.RESUMED;activity.lastResumeTs=ts;activity.pid=pid;},handleOnPauseCalled(ts,activityName){const activity=this.findOrCreateActivity(activityName);activity.state=ACTIVITY_STATE.PAUSED;activity.lastPauseTs=ts;if(ts>this.model_.bounds.min&&ts<this.model_.bounds.max){this.addActivityToProcess(activity);}},handleLaunchTime(ts,activityName,launchTime){const activity=this.findOrCreateActivity(activityName);activity.launchTime=launchTime;},handleDestroyActivity(ts,activityName){this.deleteActivity(activityName);},addActivityToProcess(activity){if(activity.pid===undefined)return;const process=this.model_.getOrCreateProcess(activity.pid);const range=tr.b.math.Range.fromExplicitRange(Math.max(this.model_.bounds.min,activity.lastResumeTs),activity.lastPauseTs);const newActivity=new tr.model.Activity(activity.name,'Android Activity',range,{created:activity.createdTs,procstart:activity.procStartTs,lastfocus:activity.lastFocusedTs});process.activities.push(newActivity);},parseAmLine_(line){let match=eventLogActivityRE.exec(line);if(!match)return;const firstRealtimeTs=this.model_.bounds.min-
-this.model_.realtime_to_monotonic_offset_ms;const year=new Date(firstRealtimeTs).getFullYear();const ts=match[1].substring(0,5)+'-'+year+' '+
-match[1].substring(5,match[1].length);const monotonicTs=Date.parse(ts)+
-this.model_.realtime_to_monotonic_offset_ms;const pid=match[2];const action=match[5];const data=match[6];if(action==='am_create_activity'){match=amCreateRE.exec(data);if(match&&match.length>=2){this.handleCreateActivity(monotonicTs,this.getFullActivityName(match[1]));}}else if(action==='am_focused_activity'){match=amFocusedRE.exec(data);if(match&&match.length>=2){this.handleFocusActivity(monotonicTs,this.getProcName(match[1]),this.getFullActivityName(match[1]));}}else if(action==='am_proc_start'){match=amProcStartRE.exec(data);if(match&&match.length>=2){this.handleProcStartForActivity(monotonicTs,this.getFullActivityName(match[1]));}}else if(action==='am_on_resume_called'){match=amOnResumeRE.exec(data);if(match&&match.length>=2){this.handleOnResumeCalled(monotonicTs,pid,match[1]);}}else if(action==='am_on_paused_called'){match=amOnPauseRE.exec(data);if(match&&match.length>=2){this.handleOnPauseCalled(monotonicTs,match[1]);}}else if(action==='am_activity_launch_time'){match=amLaunchTimeRE.exec(data);this.handleLaunchTime(monotonicTs,this.getFullActivityName(match[1]),match[2]);}else if(action==='am_destroy_activity'){match=amDestroyRE.exec(data);if(match&&match.length===2){this.handleDestroyActivity(monotonicTs,this.getFullActivityName(match[1]));}}},importEvents(){if(isNaN(this.model_.realtime_to_monotonic_offset_ms)){this.model_.importWarning({type:'eveng_log_clock_sync',message:'Need a trace_event_clock_sync to map realtime to import.'});return;}
-this.model_.updateBounds();const lines=this.events_.split('\n');lines.forEach(this.parseAmLine_,this);for(const activityName in activityMap){const activity=activityMap[activityName];if(activity.state===ACTIVITY_STATE.RESUMED){activity.lastPauseTs=this.model_.bounds.max;this.addActivityToProcess(activity);}}}};Importer.register(EventLogImporter);return{EventLogImporter,};});'use strict';tr.exportTo('tr.e.importer.android.process_data',function(){const Importer=tr.importer.Importer;const PROCESS_DUMP_HEADER='PROCESS DUMP';function ProcessDataImporter(model,processData){this.model_=model;this.processDataLines=processData.split('\n');this.importPriority=3;}
-ProcessDataImporter.canImport=function(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
-if(events.split('\n')[0]===PROCESS_DUMP_HEADER){return true;}
-return false;};ProcessDataImporter.prototype={__proto__:Importer.prototype,get importerName(){return'ProcessDataImporter';},get model(){return this.model_;},parseEventData(data){const allDumpedProcesses={};let parseProcesses=false;let parseThreads=false;let legacy=false;for(let i=1;i<data.length;i++){const cols=data[i].split(/\s+/);if(cols[0].startsWith('USER')){if(parseProcesses){parseProcesses=false;parseThreads=true;}else{parseThreads=false;parseProcesses=true;}
-const colCount=cols.length;if(parseProcesses&&colCount===9){legacy=false;}else if(parseProcesses&&colCount===8){legacy=true;}
-continue;}
-if(parseProcesses){const pid=Number(cols[1]);if(allDumpedProcesses[pid]===undefined){allDumpedProcesses[pid]={};}
-allDumpedProcesses[pid]={'name':cols[8],pid,'comm':cols[9]};continue;}
-if(parseThreads){let pid;let tid;let name;if(legacy){pid=Number(cols[1]);if(allDumpedProcesses[pid]!==undefined){tid=pid;}else{tid=pid;pid=Number(cols[2]);}
-name=cols.slice(8).join(' ');}else{pid=Number(cols[1]);tid=Number(cols[2]);name=cols.slice(3).join(' ');}
-if(allDumpedProcesses[pid]===undefined)continue;if(allDumpedProcesses[pid].threads===undefined){allDumpedProcesses[pid].threads={};}
-allDumpedProcesses[pid].threads[tid]={tid,name};continue;}}
-return allDumpedProcesses;},importEvents(){const allDumpedProcesses=this.parseEventData(this.processDataLines);const modelProcesses=this.model_.getAllProcesses();for(let i=0;i<modelProcesses.length;i++){const modelProcess=modelProcesses[i];const pid=modelProcess.pid;const dumpedProcess=allDumpedProcesses[pid];if(dumpedProcess===undefined){continue;}
-modelProcess.name=dumpedProcess.name;const processDumpThreads=dumpedProcess.threads;if(processDumpThreads!==undefined){for(const tid in modelProcess.threads){const modelThread=modelProcess.threads[tid];if(Number(pid)===Number(tid)){modelThread.name='UI thread';}else if(modelThread.name==='<...>'){if(processDumpThreads[tid]!==undefined){modelThread.name=processDumpThreads[tid].name;}}}}}}};Importer.register(ProcessDataImporter);return{ProcessDataImporter,};});'use strict';tr.exportTo('tr.e.importer.battor',function(){function BattorImporter(model,events){this.importPriority=3;this.model_=model;this.samples_=[];this.syncTimestampsById_=new Map();this.parseTrace_(events);}
-const battorDataLineRE=new RegExp('^(-?\\d+\\.\\d+)\\s+(-?\\d+\\.\\d+)\\s+(-?\\d+\\.\\d+)'+'(?:\\s+<(\\S+)>)?$');const battorHeaderLineRE=/^# BattOr/;BattorImporter.canImport=function(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
-return battorHeaderLineRE.test(events);};BattorImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'BattorImporter';},get model(){return this.model_;},importClockSyncMarkers(){for(const[syncId,ts]of this.syncTimestampsById_){this.model_.clockSyncManager.addClockSyncMarker(tr.model.ClockDomainId.BATTOR,syncId,ts);}},importEvents(){if(this.model_.device.powerSeries){this.model_.importWarning({type:'import_error',message:'Power counter exists, can not import BattOr power trace.'});return;}
-const modelTimeTransformer=this.model_.clockSyncManager.getModelTimeTransformer(tr.model.ClockDomainId.BATTOR);const powerSeries=this.model_.device.powerSeries=new tr.model.PowerSeries(this.model_.device);for(let i=0;i<this.samples_.length;i++){const sample=this.samples_[i];powerSeries.addPowerSample(modelTimeTransformer(sample.ts),sample.powerInW);}},parseTrace_(trace){const lines=trace.split('\n');for(let line of lines){line=line.trim();if(line.length===0)continue;if(line.startsWith('#'))continue;const groups=battorDataLineRE.exec(line);if(!groups){this.model_.importWarning({type:'parse_error',message:'Unrecognized line in BattOr trace: '+line});continue;}
-const ts=parseFloat(groups[1]);const voltageInV=tr.b.convertUnit(parseFloat(groups[2]),tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);const currentInA=tr.b.convertUnit(parseFloat(groups[3]),tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);const syncId=groups[4];if(syncId){this.syncTimestampsById_.set(syncId,ts);}
-if(voltageInV<0||currentInA<0){this.model_.importWarning({type:'parse_error',message:'The following line in the BattOr trace has a negative '+'voltage or current, neither of which are allowed: '+line+'. A common cause of this is that the device is charging '+'while the trace is being recorded.'});continue;}
-this.samples_.push(new Sample(ts,voltageInV,currentInA));}}};function Sample(ts,voltageInV,currentInA){this.ts=ts;this.voltageInV=voltageInV;this.currentInA=currentInA;}
-Sample.prototype={get powerInW(){return this.voltageInV*this.currentInA;}};tr.importer.Importer.register(BattorImporter);return{BattorImporter,};});'use strict';tr.exportTo('tr.e.importer.ddms',function(){const kPid=0;const kCategory='java';const kMethodLutEndMarker='\n*end\n';const kThreadsStart='\n*threads\n';const kMethodsStart='\n*methods\n';const kTraceMethodEnter=0x00;const kTraceMethodExit=0x01;const kTraceUnroll=0x02;const kTraceMethodActionMask=0x03;const kTraceHeaderLength=32;const kTraceMagicValue=0x574f4c53;const kTraceVersionSingleClock=2;const kTraceVersionDualClock=3;const kTraceRecordSizeSingleClock=10;const kTraceRecordSizeDualClock=14;function Reader(stringPayload){this.position_=0;this.data_=new Uint8Array(stringPayload.length);for(let i=0;i<stringPayload.length;++i){this.data_[i]=stringPayload.charCodeAt(i);}}
-Reader.prototype={__proto__:Object.prototype,uint8(){const result=this.data_[this.position_];this.position_+=1;return result;},uint16(){let result=0;result+=this.uint8();result+=this.uint8()<<8;return result;},uint32(){let result=0;result+=this.uint8();result+=this.uint8()<<8;result+=this.uint8()<<16;result+=this.uint8()<<24;return result;},uint64(){const low=this.uint32();const high=this.uint32();const lowStr=('0000000'+low.toString(16)).substr(-8);const highStr=('0000000'+high.toString(16)).substr(-8);const result=highStr+lowStr;return result;},seekTo(position){this.position_=position;},hasMore(){return this.position_<this.data_.length;}};function DdmsImporter(model,data){this.importPriority=3;this.model_=model;this.data_=data;}
-DdmsImporter.canImport=function(data){if(typeof(data)==='string'||data instanceof String){const header=data.slice(0,1000);return header.startsWith('*version\n')&&header.indexOf('\nvm=')>=0&&header.indexOf(kThreadsStart)>=0;}
-return false;};DdmsImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'DdmsImporter';},get model(){return this.model_;},importEvents(){const divider=this.data_.indexOf(kMethodLutEndMarker)+
-kMethodLutEndMarker.length;this.metadata_=this.data_.slice(0,divider);this.methods_={};this.parseThreads();this.parseMethods();const traceReader=new Reader(this.data_.slice(divider));const magic=traceReader.uint32();if(magic!==kTraceMagicValue){throw Error('Failed to match magic value');}
-this.version_=traceReader.uint16();if(this.version_!==kTraceVersionDualClock){throw Error('Unknown version');}
-const dataOffest=traceReader.uint16();const startDateTime=traceReader.uint64();const recordSize=traceReader.uint16();traceReader.seekTo(dataOffest);while(traceReader.hasMore()){this.parseTraceEntry(traceReader);}},parseTraceEntry(reader){const tid=reader.uint16();const methodPacked=reader.uint32();const cpuSinceStart=reader.uint32();const wallClockSinceStart=reader.uint32();let method=methodPacked&~kTraceMethodActionMask;const action=methodPacked&kTraceMethodActionMask;const thread=this.getTid(tid);method=this.getMethodName(method);if(action===kTraceMethodEnter){thread.sliceGroup.beginSlice(kCategory,method,wallClockSinceStart,undefined,cpuSinceStart);}else if(thread.sliceGroup.openSliceCount){thread.sliceGroup.endSlice(wallClockSinceStart,cpuSinceStart);}},parseThreads(){let threads=this.metadata_.slice(this.metadata_.indexOf(kThreadsStart)+
-kThreadsStart.length);threads=threads.slice(0,threads.indexOf('\n*'));threads=threads.split('\n');threads.forEach(this.parseThread.bind(this));},parseThread(threadLine){const tid=threadLine.slice(0,threadLine.indexOf('\t'));const thread=this.getTid(parseInt(tid));thread.name=threadLine.slice(threadLine.indexOf('\t')+1);},getTid(tid){return this.model_.getOrCreateProcess(kPid).getOrCreateThread(tid);},parseMethods(){let methods=this.metadata_.slice(this.metadata_.indexOf(kMethodsStart)+
-kMethodsStart.length);methods=methods.slice(0,methods.indexOf('\n*'));methods=methods.split('\n');methods.forEach(this.parseMethod.bind(this));},parseMethod(methodLine){const data=methodLine.split('\t');const methodId=parseInt(data[0]);const methodName=data[1]+'.'+data[2]+data[3];this.addMethod(methodId,methodName);},addMethod(methodId,methodName){this.methods_[methodId]=methodName;},getMethodName(methodId){return this.methods_[methodId];}};tr.importer.Importer.register(DdmsImporter);return{DdmsImporter,};});'use strict';tr.exportTo('tr.e.audits',function(){class LowMemoryAuditor extends tr.c.Auditor{constructor(model){super();this.model_=model;}
-runAnnotate(){this.model_.device.lowMemoryEvents=this.getLowMemoryEvents_();}
-getLowMemoryEvents_(){const model=this.model_;const result=[];for(const process of model.getAllProcesses()){for(const e of process.getDescendantEvents()){if(!(e instanceof tr.model.ThreadSlice)||e.duration!==0){continue;}
-if(e.category!=='lowmemory'){continue;}
-result.push(e);}}
-return result;}}
-tr.c.Auditor.register(LowMemoryAuditor);return{LowMemoryAuditor};});'use strict';function filterDuplicateTimestamps(timestamps){const dedupedTimestamps=[];let lastTs=0;for(const ts of timestamps){if(ts-lastTs>=1){dedupedTimestamps.push(ts);lastTs=ts;}}
-return dedupedTimestamps;}
-tr.exportTo('tr.e.audits',function(){const VSYNC_COUNTER_PRECISIONS={'android.VSYNC-app':15,'android.VSYNC':15};const VSYNC_SLICE_PRECISIONS={'RenderWidgetHostViewAndroid::OnVSync':5,'VSYNC':10,'vblank':10,'DisplayLinkMac::GetVSyncParameters':5};const BEGIN_FRAME_SLICE_PRECISION={'DisplayScheduler::BeginFrame':10};function VSyncAuditor(model){tr.c.Auditor.call(this,model);}
-VSyncAuditor.prototype={__proto__:tr.c.Auditor.prototype,runAnnotate(){this.model.device.vSyncTimestamps=this.findVSyncTimestamps(this.model);},findVSyncTimestamps(model){let times=[];let maxPrecision=Number.NEGATIVE_INFINITY;let maxTitle=undefined;function useInstead(title,precisions){const precision=precisions[title];if(precision===undefined)return false;if(title===maxTitle)return true;if(precision<=maxPrecision){if(precision===maxPrecision){model.importWarning({type:'VSyncAuditor',message:'Encountered two different VSync events ('+
-maxTitle+', '+title+') with the same precision, '+'ignoring the newer one ('+title+')',showToUser:false,});}
-return false;}
-maxPrecision=precision;maxTitle=title;times=[];return true;}
-for(const pid in model.processes){const process=model.processes[pid];for(const cid in process.counters){if(useInstead(cid,VSYNC_COUNTER_PRECISIONS)){const counter=process.counters[cid];for(let i=0;i<counter.series.length;i++){const series=counter.series[i];Array.prototype.push.apply(times,series.timestamps);}}}
-for(const tid in process.threads){const thread=process.threads[tid];for(let i=0;i<thread.sliceGroup.slices.length;i++){const slice=thread.sliceGroup.slices[i];if(useInstead(slice.title,VSYNC_SLICE_PRECISIONS)){times.push(slice.start);}else if(useInstead(slice.title,BEGIN_FRAME_SLICE_PRECISION)&&slice.args.args&&slice.args.args.frame_time_us){times.push(slice.args.args.frame_time_us/1000.0);}}}}
-times.sort(function(x,y){return x-y;});return filterDuplicateTimestamps(times);}};tr.c.Auditor.register(VSyncAuditor);return{VSyncAuditor,};});'use strict';tr.exportTo('tr.importer',function(){function EmptyImporter(events){this.importPriority=0;}
-EmptyImporter.canImport=function(eventData){if(eventData instanceof Array&&eventData.length===0){return true;}
-if(typeof(eventData)==='string'||eventData instanceof String){return eventData.length===0;}
-return false;};EmptyImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'EmptyImporter';}};tr.importer.Importer.register(EmptyImporter);return{EmptyImporter,};});'use strict';tr.exportTo('tr.model.um',function(){function AnimationExpectation(parentModel,initiatorTitle,start,duration){tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);this.frameEvents_=undefined;}
-AnimationExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:AnimationExpectation,get frameEvents(){if(this.frameEvents_){return this.frameEvents_;}
-this.frameEvents_=new tr.model.EventSet();this.associatedEvents.forEach(function(event){if(event.title===tr.model.helpers.IMPL_RENDERING_STATS){this.frameEvents_.push(event);}},this);return this.frameEvents_;}};tr.model.um.UserExpectation.subTypes.register(AnimationExpectation,{stageTitle:'Animation',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_animation')});return{AnimationExpectation,};});'use strict';tr.exportTo('tr.importer',function(){function ProtoExpectation(type,initiatorType){this.type=type;this.initiatorType=initiatorType;this.start=Infinity;this.end=-Infinity;this.associatedEvents=new tr.model.EventSet();this.isAnimationBegin=false;}
-ProtoExpectation.RESPONSE_TYPE='r';ProtoExpectation.ANIMATION_TYPE='a';ProtoExpectation.IGNORED_TYPE='ignored';const INITIATOR_HIERARCHY=[tr.model.um.INITIATOR_TYPE.PINCH,tr.model.um.INITIATOR_TYPE.FLING,tr.model.um.INITIATOR_TYPE.MOUSE_WHEEL,tr.model.um.INITIATOR_TYPE.SCROLL,tr.model.um.INITIATOR_TYPE.VR,tr.model.um.INITIATOR_TYPE.VIDEO,tr.model.um.INITIATOR_TYPE.WEBGL,tr.model.um.INITIATOR_TYPE.CSS,tr.model.um.INITIATOR_TYPE.MOUSE,tr.model.um.INITIATOR_TYPE.KEYBOARD,tr.model.um.INITIATOR_TYPE.TAP,tr.model.um.INITIATOR_TYPE.TOUCH];function combineInitiatorTypes(title1,title2){for(const item of INITIATOR_HIERARCHY){if(title1===item||title2===item)return item;}
-throw new Error('Invalid titles in combineInitiatorTypes');}
-ProtoExpectation.prototype={get isValid(){return this.end>this.start;},containsTypeNames(typeNames){return this.associatedEvents.some(x=>typeNames.indexOf(x.typeName)>=0);},containsSliceTitle(title){return this.associatedEvents.some(x=>title===x.title);},createInteractionRecord(model){if(this.type!==ProtoExpectation.IGNORED_TYPE&&!this.isValid){model.importWarning({type:'ProtoExpectation',message:'Please file a bug with this trace. '+this.debug(),showToUser:true});return undefined;}
-const duration=this.end-this.start;let ir=undefined;switch(this.type){case ProtoExpectation.RESPONSE_TYPE:ir=new tr.model.um.ResponseExpectation(model,this.initiatorType,this.start,duration,this.isAnimationBegin);break;case ProtoExpectation.ANIMATION_TYPE:ir=new tr.model.um.AnimationExpectation(model,this.initiatorType,this.start,duration);break;}
-if(!ir)return undefined;ir.sourceEvents.addEventSet(this.associatedEvents);function pushAssociatedEvents(event){ir.associatedEvents.push(event);if(event.associatedEvents){ir.associatedEvents.addEventSet(event.associatedEvents);}}
-this.associatedEvents.forEach(function(event){pushAssociatedEvents(event);if(event.subSlices){event.subSlices.forEach(pushAssociatedEvents);}});return ir;},merge(other){this.initiatorType=combineInitiatorTypes(this.initiatorType,other.initiatorType);this.associatedEvents.addEventSet(other.associatedEvents);this.start=Math.min(this.start,other.start);this.end=Math.max(this.end,other.end);if(other.isAnimationBegin){this.isAnimationBegin=true;}},pushEvent(event){this.start=Math.min(this.start,event.start);this.end=Math.max(this.end,event.end);this.associatedEvents.push(event);},pushSample(sample){this.start=Math.min(this.start,sample.timestamp);this.end=Math.max(this.end,sample.timestamp);this.associatedEvents.push(sample);},containsTimestampInclusive(timestamp){return(this.start<=timestamp)&&(timestamp<=this.end);},intersects(other){return(other.start<this.end)&&(other.end>this.start);},isNear(event,threshold){return(this.end+threshold)>event.start;},debug(){let debugString=this.type+'(';debugString+=parseInt(this.start)+' ';debugString+=parseInt(this.end);this.associatedEvents.forEach(function(event){debugString+=' '+event.typeName;});return debugString+')';}};return{ProtoExpectation,};});'use strict';tr.exportTo('tr.importer',function(){const ProtoExpectation=tr.importer.ProtoExpectation;const INITIATOR_TYPE=tr.model.um.INITIATOR_TYPE;const INPUT_TYPE=tr.e.cc.INPUT_EVENT_TYPE_NAMES;const KEYBOARD_TYPE_NAMES=[INPUT_TYPE.CHAR,INPUT_TYPE.KEY_DOWN_RAW,INPUT_TYPE.KEY_DOWN,INPUT_TYPE.KEY_UP];const MOUSE_RESPONSE_TYPE_NAMES=[INPUT_TYPE.CLICK,INPUT_TYPE.CONTEXT_MENU];const MOUSE_WHEEL_TYPE_NAMES=[INPUT_TYPE.MOUSE_WHEEL];const MOUSE_DRAG_TYPE_NAMES=[INPUT_TYPE.MOUSE_DOWN,INPUT_TYPE.MOUSE_MOVE,INPUT_TYPE.MOUSE_UP];const TAP_TYPE_NAMES=[INPUT_TYPE.TAP,INPUT_TYPE.TAP_CANCEL,INPUT_TYPE.TAP_DOWN];const PINCH_TYPE_NAMES=[INPUT_TYPE.PINCH_BEGIN,INPUT_TYPE.PINCH_END,INPUT_TYPE.PINCH_UPDATE];const FLING_TYPE_NAMES=[INPUT_TYPE.FLING_CANCEL,INPUT_TYPE.FLING_START];const TOUCH_TYPE_NAMES=[INPUT_TYPE.TOUCH_END,INPUT_TYPE.TOUCH_MOVE,INPUT_TYPE.TOUCH_START];const SCROLL_TYPE_NAMES=[INPUT_TYPE.SCROLL_BEGIN,INPUT_TYPE.SCROLL_END,INPUT_TYPE.SCROLL_UPDATE];const ALL_HANDLED_TYPE_NAMES=[].concat(KEYBOARD_TYPE_NAMES,MOUSE_RESPONSE_TYPE_NAMES,MOUSE_WHEEL_TYPE_NAMES,MOUSE_DRAG_TYPE_NAMES,PINCH_TYPE_NAMES,TAP_TYPE_NAMES,FLING_TYPE_NAMES,TOUCH_TYPE_NAMES,SCROLL_TYPE_NAMES);const RENDERER_FLING_TITLE='InputHandlerProxy::HandleGestureFling::started';const PLAYBACK_EVENT_TITLE='VideoPlayback';const CSS_ANIMATION_TITLE='Animation';const VR_COUNTER_NAMES=['gpu.WebVR FPS','gpu.WebVR frame time (ms)','gpu.WebVR pose prediction (ms)','gpu.WebXR FPS',];const VR_EXPECTATION_EVENTS={'Vr.AcquireGvrFrame':{'histogramName':'acquire_frame','description':'Duration acquire a frame from GVR','hasCpuTime':true,},'Vr.DrawFrame':{'histogramName':'draw_frame','description':'Duration to render one frame','hasCpuTime':true,},'Vr.PostSubmitDrawOnGpu':{'histogramName':'post_submit_draw_on_gpu','description':'Duration to draw a frame on GPU post submit to '+'GVR. Note this duration may include time spent on '+'reprojection','hasCpuTime':false,},'Vr.ProcessControllerInput':{'histogramName':'update_controller','description':'Duration to query input from the controller','hasCpuTime':true,},'Vr.ProcessControllerInputForWebXr':{'histogramName':'update_controller_webxr','description':'Duration to query input from the controller for WebXR','hasCpuTime':true,},'Vr.SubmitFrameNow':{'histogramName':'submit_frame','description':'Duration to submit a frame to GVR','hasCpuTime':true,}};const WEBXR_INSTANT_EVENTS={'WebXR frame time (ms)':{'javascript':{'histogramName':'webxr_frame_time_javascript','description':'WebXR frame time spent on JavaScript',},'rendering':{'histogramName':'webxr_frame_time_rendering','description':'WebXR frame time spent on rendering'}},'WebXR pose prediction':{'milliseconds':{'histogramName':'webxr_pose_prediction','description':'WebXR pose prediction in ms',},},};const XR_DEVICE_SERVICE_PROCESS='Service: xr_device_service';function isXrDeviceServiceProcess(process){if(process.name===XR_DEVICE_SERVICE_PROCESS)return true;return false;}
-const VR_RESPONSE_MS=1000;const INPUT_MERGE_THRESHOLD_MS=200;const ANIMATION_MERGE_THRESHOLD_MS=32;const MOUSE_WHEEL_THRESHOLD_MS=40;const MOUSE_MOVE_THRESHOLD_MS=40;function compareEvents(x,y){if(x.start!==y.start){return x.start-y.start;}
-if(x.end!==y.end){return x.end-y.end;}
-if(x.guid&&y.guid){return x.guid-y.guid;}
-return 0;}
-function forEventTypesIn(events,typeNames,cb,opt_this){events.forEach(function(event){if(typeNames.indexOf(event.typeName)>=0){cb.call(opt_this,event);}});}
-function causedFrame(event){return event.associatedEvents.some(isImplFrameEvent);}
-function getSortedFrameEventsByProcess(modelHelper){const frameEventsByPid={};for(const[pid,rendererHelper]of
-Object.entries(modelHelper.rendererHelpers)){frameEventsByPid[pid]=rendererHelper.getFrameEventsInRange(tr.model.helpers.IMPL_FRAMETIME_TYPE,modelHelper.model.bounds);}
-return frameEventsByPid;}
-function getSortedInputEvents(modelHelper){const inputEvents=[];const browserProcess=modelHelper.browserHelper.process;const mainThread=browserProcess.findAtMostOneThreadNamed('CrBrowserMain');for(const slice of mainThread.asyncSliceGroup.getDescendantEvents()){if(!slice.isTopLevel)continue;if(!(slice instanceof tr.e.cc.InputLatencyAsyncSlice))continue;if(isNaN(slice.start)||isNaN(slice.duration)||isNaN(slice.end)){continue;}
-inputEvents.push(slice);}
-return inputEvents.sort(compareEvents);}
-function findProtoExpectations(modelHelper,sortedInputEvents,warn){const protoExpectations=[];const handlers=[handleKeyboardEvents,handleMouseResponseEvents,handleMouseWheelEvents,handleMouseDragEvents,handleTapResponseEvents,handlePinchEvents,handleFlingEvents,handleTouchEvents,handleScrollEvents,handleCSSAnimations,handleWebGLAnimations,handleVideoAnimations,handleVrAnimations,];handlers.forEach(function(handler){protoExpectations.push.apply(protoExpectations,handler(modelHelper,sortedInputEvents,warn));});protoExpectations.sort(compareEvents);return protoExpectations;}
-function handleKeyboardEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];forEventTypesIn(sortedInputEvents,KEYBOARD_TYPE_NAMES,function(event){const pe=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.KEYBOARD);pe.pushEvent(event);protoExpectations.push(pe);});return protoExpectations;}
-function handleMouseResponseEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];forEventTypesIn(sortedInputEvents,MOUSE_RESPONSE_TYPE_NAMES,function(event){const pe=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);pe.pushEvent(event);protoExpectations.push(pe);});return protoExpectations;}
-function handleMouseWheelEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;let prevEvent_=undefined;forEventTypesIn(sortedInputEvents,MOUSE_WHEEL_TYPE_NAMES,function(event){const prevEvent=prevEvent_;prevEvent_=event;if(currentPE&&(prevEvent.start+MOUSE_WHEEL_THRESHOLD_MS)>=event.start){if(currentPE.type===ProtoExpectation.ANIMATION_TYPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.MOUSE_WHEEL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-return;}
-currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE_WHEEL);currentPE.pushEvent(event);protoExpectations.push(currentPE);});return protoExpectations;}
-function handleMouseDragEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;let mouseDownEvent=undefined;forEventTypesIn(sortedInputEvents,MOUSE_DRAG_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.MOUSE_DOWN:if(causedFrame(event)){const pe=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);pe.pushEvent(event);protoExpectations.push(pe);}else{mouseDownEvent=event;}
-break;case INPUT_TYPE.MOUSE_MOVE:if(!causedFrame(event)){const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}else if(!currentPE||!currentPE.isNear(event,MOUSE_MOVE_THRESHOLD_MS)){currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);currentPE.pushEvent(event);if(mouseDownEvent){currentPE.associatedEvents.push(mouseDownEvent);mouseDownEvent=undefined;}
-protoExpectations.push(currentPE);}else{if(currentPE.type===ProtoExpectation.ANIMATION_TYPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.MOUSE);currentPE.pushEvent(event);protoExpectations.push(currentPE);}}
-break;case INPUT_TYPE.MOUSE_UP:if(!mouseDownEvent){const pe=new ProtoExpectation(causedFrame(event)?ProtoExpectation.RESPONSE_TYPE:ProtoExpectation.IGNORED_TYPE,INITIATOR_TYPE.MOUSE);pe.pushEvent(event);protoExpectations.push(pe);break;}
-if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);if(mouseDownEvent){currentPE.associatedEvents.push(mouseDownEvent);}
-currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-mouseDownEvent=undefined;currentPE=undefined;break;}});if(mouseDownEvent){currentPE=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);currentPE.pushEvent(mouseDownEvent);protoExpectations.push(currentPE);}
-return protoExpectations;}
-function handleTapResponseEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;forEventTypesIn(sortedInputEvents,TAP_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.TAP_DOWN:currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TAP);currentPE.pushEvent(event);protoExpectations.push(currentPE);break;case INPUT_TYPE.TAP:if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TAP);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-currentPE=undefined;break;case INPUT_TYPE.TAP_CANCEL:if(!currentPE){const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);break;}
-if(currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TAP);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-currentPE=undefined;break;}});return protoExpectations;}
-function handlePinchEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;let sawFirstUpdate=false;const modelBounds=modelHelper.model.bounds;forEventTypesIn(sortedInputEvents,PINCH_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.PINCH_BEGIN:if(currentPE&&currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE.pushEvent(event);break;}
-currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.PINCH);currentPE.pushEvent(event);currentPE.isAnimationBegin=true;protoExpectations.push(currentPE);sawFirstUpdate=false;break;case INPUT_TYPE.PINCH_UPDATE:if(!currentPE||((currentPE.type===ProtoExpectation.RESPONSE_TYPE)&&sawFirstUpdate)||!currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.PINCH);currentPE.pushEvent(event);protoExpectations.push(currentPE);}else{currentPE.pushEvent(event);sawFirstUpdate=true;}
-break;case INPUT_TYPE.PINCH_END:if(currentPE){currentPE.pushEvent(event);}else{const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}
-currentPE=undefined;break;}});return protoExpectations;}
-function handleFlingEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;function isRendererFling(event){return event.title===RENDERER_FLING_TITLE;}
-const browserHelper=modelHelper.browserHelper;const flingEvents=browserHelper.getAllAsyncSlicesMatching(isRendererFling);forEventTypesIn(sortedInputEvents,FLING_TYPE_NAMES,function(event){flingEvents.push(event);});flingEvents.sort(compareEvents);flingEvents.forEach(function(event){if(event.title===RENDERER_FLING_TITLE){if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.FLING);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-return;}
-switch(event.typeName){case INPUT_TYPE.FLING_START:if(currentPE){warn({type:'UserModelBuilder',message:'Unexpected FlingStart',showToUser:false,});currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.FLING);currentPE.pushEvent(event);currentPE.end=0;protoExpectations.push(currentPE);}
-break;case INPUT_TYPE.FLING_CANCEL:if(currentPE){currentPE.pushEvent(event);currentPE.end=event.start;currentPE=undefined;}else{const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}
-break;}});if(currentPE&&!currentPE.end){currentPE.end=modelHelper.model.bounds.max;}
-return protoExpectations;}
-function handleTouchEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;let sawFirstMove=false;forEventTypesIn(sortedInputEvents,TOUCH_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.TOUCH_START:if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TOUCH);currentPE.pushEvent(event);currentPE.isAnimationBegin=true;protoExpectations.push(currentPE);sawFirstMove=false;}
-break;case INPUT_TYPE.TOUCH_MOVE:if(!currentPE){currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.TOUCH);currentPE.pushEvent(event);protoExpectations.push(currentPE);break;}
-if((sawFirstMove&&(currentPE.type===ProtoExpectation.RESPONSE_TYPE))||!currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){const prevEnd=currentPE.end;currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.TOUCH);currentPE.pushEvent(event);currentPE.start=prevEnd;protoExpectations.push(currentPE);}else{currentPE.pushEvent(event);sawFirstMove=true;}
-break;case INPUT_TYPE.TOUCH_END:if(!currentPE){const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);break;}
-if(currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE.pushEvent(event);}else{const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}
-currentPE=undefined;break;}});return protoExpectations;}
-function handleScrollEvents(modelHelper,sortedInputEvents,warn){const protoExpectations=[];let currentPE=undefined;let sawFirstUpdate=false;forEventTypesIn(sortedInputEvents,SCROLL_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.SCROLL_BEGIN:currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.SCROLL);currentPE.pushEvent(event);currentPE.isAnimationBegin=true;protoExpectations.push(currentPE);sawFirstUpdate=false;break;case INPUT_TYPE.SCROLL_UPDATE:if(currentPE){if(currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)&&((currentPE.type===ProtoExpectation.ANIMATION_TYPE)||!sawFirstUpdate)){currentPE.pushEvent(event);sawFirstUpdate=true;}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.SCROLL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.SCROLL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-break;case INPUT_TYPE.SCROLL_END:if(!currentPE){warn({type:'UserModelBuilder',message:'Unexpected ScrollEnd',showToUser:false,});const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);break;}
-currentPE.pushEvent(event);break;}});return protoExpectations;}
-function handleVideoAnimations(modelHelper,sortedInputEvents,warn){const events=[];for(const pid in modelHelper.rendererHelpers){for(const tid in modelHelper.rendererHelpers[pid].process.threads){for(const asyncSlice of
-modelHelper.rendererHelpers[pid].process.threads[tid].asyncSliceGroup.slices){if(asyncSlice.title===PLAYBACK_EVENT_TITLE){events.push(asyncSlice);}}}}
-events.sort(tr.importer.compareEvents);const protoExpectations=[];for(const event of events){const currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.VIDEO);currentPE.start=event.start;currentPE.end=event.end;currentPE.pushEvent(event);protoExpectations.push(currentPE);}
-return protoExpectations;}
-function handleVrAnimations(modelHelper,sortedInputEvents,warn){const events=[];const processes=[];if(typeof modelHelper.gpuHelper!=='undefined'){processes.push(modelHelper.gpuHelper.process);}
-for(const helper of Object.values(modelHelper.rendererHelpers)){processes.push(helper.process);}
-for(const helper of Object.values(modelHelper.browserHelpers)){processes.push(helper.process);}
-for(const service of modelHelper.model.getAllProcesses(isXrDeviceServiceProcess)){processes.push(service);}
-let vrCounterStart=Number.MAX_SAFE_INTEGER;let vrEventStart=Number.MAX_SAFE_INTEGER;for(const proc of processes){for(const[counterName,counterSeries]of
-Object.entries(proc.counters)){if(VR_COUNTER_NAMES.includes(counterName)){for(const series of counterSeries.series){for(const sample of series.samples){events.push(sample);vrCounterStart=Math.min(vrCounterStart,sample.timestamp);}}}}
-for(const thread of Object.values(proc.threads)){for(const container of thread.childEventContainers()){for(const slice of container.slices){if(slice.title in VR_EXPECTATION_EVENTS||slice.title in WEBXR_INSTANT_EVENTS){events.push(slice);vrEventStart=Math.min(vrEventStart,slice.start);}}}}}
-if(events.length===0){return[];}
-events.sort(function(x,y){if(x.range.min!==y.range.min){return x.range.min-y.range.min;}
-return x.guid-y.guid;});vrCounterStart=(vrCounterStart===Number.MAX_SAFE_INTEGER)?0:vrCounterStart;vrEventStart=(vrEventStart===Number.MAX_SAFE_INTEGER)?0:vrEventStart;const vrAnimationStart=Math.max(vrCounterStart,vrEventStart)+
-VR_RESPONSE_MS;const responsePE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.VR);const animationPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.VR);let lastResponseEvent;for(const event of events){if(event.range.min<vrAnimationStart){if(event instanceof tr.model.CounterSample){responsePE.pushSample(event);}else{responsePE.pushEvent(event);}
-lastResponseEvent=event;}else{if(event instanceof tr.model.CounterSample){animationPE.pushSample(event);}else{animationPE.pushEvent(event);}}}
-if(lastResponseEvent instanceof tr.model.CounterSample){animationPE.pushSample(lastResponseEvent);}else{animationPE.pushEvent(lastResponseEvent);}
-return[responsePE,animationPE];}
-function handleCSSAnimations(modelHelper,sortedInputEvents,warn){const animationEvents=modelHelper.browserHelper.getAllAsyncSlicesMatching(function(event){return((event.title===CSS_ANIMATION_TITLE)&&event.isTopLevel&&(event.duration>0));});const animationRanges=[];function pushAnimationRange(start,end,animation){const range=tr.b.math.Range.fromExplicitRange(start,end);range.animation=animation;animationRanges.push(range);}
-animationEvents.forEach(function(animation){if(animation.subSlices.length===0){pushAnimationRange(animation.start,animation.end,animation);}else{let start=undefined;animation.subSlices.forEach(function(sub){if((sub.args.data.state==='running')&&(start===undefined)){start=sub.start;}else if((sub.args.data.state==='paused')||(sub.args.data.state==='idle')||(sub.args.data.state==='finished')){if(start===undefined){start=modelHelper.model.bounds.min;}
-pushAnimationRange(start,sub.start,animation);start=undefined;}});if(start!==undefined){pushAnimationRange(start,animation.end,animation);}}});return animationRanges.map(function(range){const protoExpectation=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.CSS);protoExpectation.start=range.min;protoExpectation.end=range.max;protoExpectation.associatedEvents.push(range.animation);return protoExpectation;});}
-function findWebGLEvents(modelHelper,mailboxEvents,animationEvents){for(const event of modelHelper.model.getDescendantEvents()){if(event.title==='DrawingBuffer::prepareMailbox'){mailboxEvents.push(event);}else if(event.title==='PageAnimator::serviceScriptedAnimations'){animationEvents.push(event);}}}
-function findMailboxEventsNearAnimationEvents(mailboxEvents,animationEvents){if(animationEvents.length===0)return[];mailboxEvents.sort(compareEvents);animationEvents.sort(compareEvents);const animationIterator=animationEvents[Symbol.iterator]();let animationEvent=animationIterator.next().value;const filteredEvents=[];for(const event of mailboxEvents){while(animationEvent&&(animationEvent.start<(event.start-ANIMATION_MERGE_THRESHOLD_MS))){animationEvent=animationIterator.next().value;}
-if(!animationEvent)break;if(animationEvent.start<(event.start+ANIMATION_MERGE_THRESHOLD_MS)){filteredEvents.push(event);}}
-return filteredEvents;}
-function createProtoExpectationsFromMailboxEvents(mailboxEvents){const protoExpectations=[];let currentPE=undefined;for(const event of mailboxEvents){if(currentPE===undefined||!currentPE.isNear(event,ANIMATION_MERGE_THRESHOLD_MS)){currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.WEBGL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}else{currentPE.pushEvent(event);}}
-return protoExpectations;}
-function handleWebGLAnimations(modelHelper,sortedInputEvents,warn){const prepareMailboxEvents=[];const scriptedAnimationEvents=[];findWebGLEvents(modelHelper,prepareMailboxEvents,scriptedAnimationEvents);const webGLMailboxEvents=findMailboxEventsNearAnimationEvents(prepareMailboxEvents,scriptedAnimationEvents);return createProtoExpectationsFromMailboxEvents(webGLMailboxEvents);}
-function postProcessProtoExpectations(modelHelper,protoExpectations){protoExpectations=findFrameEventsForAnimations(modelHelper,protoExpectations);protoExpectations=mergeIntersectingResponses(protoExpectations);protoExpectations=mergeIntersectingAnimations(protoExpectations);protoExpectations=fixResponseAnimationStarts(protoExpectations);protoExpectations=fixTapResponseTouchAnimations(protoExpectations);return protoExpectations;}
-function mergeIntersectingResponses(protoExpectations){const newPEs=[];while(protoExpectations.length){const pe=protoExpectations.shift();newPEs.push(pe);if(pe.type!==ProtoExpectation.RESPONSE_TYPE)continue;for(let i=0;i<protoExpectations.length;++i){const otherPE=protoExpectations[i];if(otherPE.type!==pe.type)continue;if(!otherPE.intersects(pe))continue;const typeNames=pe.associatedEvents.map(function(event){return event.typeName;});if(otherPE.containsTypeNames(typeNames))continue;pe.merge(otherPE);protoExpectations.splice(i,1);--i;}}
-return newPEs;}
-function mergeIntersectingAnimations(protoExpectations){const newPEs=[];while(protoExpectations.length){const pe=protoExpectations.shift();newPEs.push(pe);if(pe.type!==ProtoExpectation.ANIMATION_TYPE)continue;const isCSS=pe.initiatorType===INITIATOR_TYPE.CSS;const isFling=pe.containsTypeNames([INPUT_TYPE.FLING_START]);const isVideo=pe.initiatorType===INITIATOR_TYPE.VIDEO;for(let i=0;i<protoExpectations.length;++i){const otherPE=protoExpectations[i];if(otherPE.type!==pe.type)continue;if((isCSS&&otherPE.initiatorType!==INITIATOR_TYPE.CSS)||isFling!==otherPE.containsTypeNames([INPUT_TYPE.FLING_START])||isVideo&&otherPE.initiatorType!==INITIATOR_TYPE.VIDEO||otherPE.initiatorType===INITIATOR_TYPE.VR){continue;}
-if(isCSS){if(!pe.isNear(otherPE,ANIMATION_MERGE_THRESHOLD_MS)){continue;}}else if(!otherPE.intersects(pe)){continue;}
-pe.merge(otherPE);protoExpectations.splice(i,1);--i;}}
-return newPEs;}
-function fixResponseAnimationStarts(protoExpectations){protoExpectations.forEach(function(ape){if(ape.type!==ProtoExpectation.ANIMATION_TYPE){return;}
-protoExpectations.forEach(function(rpe){if(rpe.type!==ProtoExpectation.RESPONSE_TYPE){return;}
-if(!ape.containsTimestampInclusive(rpe.end)){return;}
-if(ape.containsTimestampInclusive(rpe.start)){return;}
-ape.start=rpe.end;if(ape.associatedEvents!==undefined){ape.associatedEvents=ape.associatedEvents.filter(e=>(!isImplFrameEvent(e)||e.start>=ape.start));}});});return protoExpectations;}
-function isImplFrameEvent(event){return event.title===tr.model.helpers.IMPL_RENDERING_STATS;}
-function fixTapResponseTouchAnimations(protoExpectations){function isTapResponse(pe){return(pe.type===ProtoExpectation.RESPONSE_TYPE)&&pe.containsTypeNames([INPUT_TYPE.TAP]);}
-function isTouchAnimation(pe){return(pe.type===ProtoExpectation.ANIMATION_TYPE)&&pe.containsTypeNames([INPUT_TYPE.TOUCH_MOVE])&&!pe.containsTypeNames([INPUT_TYPE.SCROLL_UPDATE,INPUT_TYPE.PINCH_UPDATE]);}
-const newPEs=[];while(protoExpectations.length){const pe=protoExpectations.shift();newPEs.push(pe);const peIsTapResponse=isTapResponse(pe);const peIsTouchAnimation=isTouchAnimation(pe);if(!peIsTapResponse&&!peIsTouchAnimation){continue;}
-for(let i=0;i<protoExpectations.length;++i){const otherPE=protoExpectations[i];if(!otherPE.intersects(pe))continue;if(peIsTapResponse&&!isTouchAnimation(otherPE))continue;if(peIsTouchAnimation&&!isTapResponse(otherPE))continue;pe.type=ProtoExpectation.RESPONSE_TYPE;pe.merge(otherPE);protoExpectations.splice(i,1);--i;}}
-return newPEs;}
-function findFrameEventsForAnimations(modelHelper,protoExpectations){const newPEs=[];const frameEventsByPid=getSortedFrameEventsByProcess(modelHelper);for(const pe of protoExpectations){if(pe.type!==ProtoExpectation.ANIMATION_TYPE){newPEs.push(pe);continue;}
-const frameEvents=[];for(const pid of Object.keys(modelHelper.rendererHelpers)){const range=tr.b.math.Range.fromExplicitRange(pe.start,pe.end);frameEvents.push.apply(frameEvents,range.filterArray(frameEventsByPid[pid],e=>e.start));}
-if(frameEvents.length===0&&!(pe.initiatorType===INITIATOR_TYPE.WEBGL||pe.initiatorType===INITIATOR_TYPE.VR)){pe.type=ProtoExpectation.IGNORED_TYPE;newPEs.push(pe);continue;}
-pe.associatedEvents.addEventSet(frameEvents);newPEs.push(pe);}
-return newPEs;}
-function checkAllInputEventsHandled(modelHelper,sortedInputEvents,protoExpectations,warn){const handledEvents=[];protoExpectations.forEach(function(protoExpectation){protoExpectation.associatedEvents.forEach(function(event){if((event.title===CSS_ANIMATION_TITLE)&&(event.subSlices.length>0)){return;}
-if((handledEvents.indexOf(event)>=0)&&(!isImplFrameEvent(event))){warn({type:'UserModelBuilder',message:`double-handled event: ${event.typeName} @ ${event.start}`,showToUser:false,});return;}
-handledEvents.push(event);});});sortedInputEvents.forEach(function(event){if(handledEvents.indexOf(event)<0){warn({type:'UserModelBuilder',message:`double-handled event: ${event.typeName} @ ${event.start}`,showToUser:false,});}});}
-function findInputExpectations(modelHelper){let warning;function warn(w){if(warning)return;warning=w;}
-const sortedInputEvents=getSortedInputEvents(modelHelper);let protoExpectations=findProtoExpectations(modelHelper,sortedInputEvents,warn);protoExpectations=postProcessProtoExpectations(modelHelper,protoExpectations);checkAllInputEventsHandled(modelHelper,sortedInputEvents,protoExpectations,warn);if(warning)modelHelper.model.importWarning(warning);const expectations=[];protoExpectations.forEach(function(protoExpectation){const ir=protoExpectation.createInteractionRecord(modelHelper.model);if(ir){expectations.push(ir);}});return expectations;}
-return{findInputExpectations,compareEvents,CSS_ANIMATION_TITLE,VR_EXPECTATION_EVENTS,WEBXR_INSTANT_EVENTS,};});'use strict';tr.exportTo('tr.b',function(){class FixedColorScheme{constructor(namesToColors){this.namesToColors_=namesToColors;}
-static fromNames(names){const namesToColors=new Map();const generator=new tr.b.SinebowColorGenerator();for(const name of names){namesToColors.set(name,generator.colorForKey(name));}
-return new FixedColorScheme(namesToColors);}
-getColor(name){const color=this.namesToColors_.get(name);if(color===undefined)throw new Error('Unknown color: '+name);return color;}}
-const MemoryColumnColorScheme=new FixedColorScheme(new Map([['used_memory_column',new tr.b.Color(0,0,255)],['older_used_memory_column',new tr.b.Color(153,204,255)],['tracing_memory_column',new tr.b.Color(153,153,153)]]));function FixedColorSchemeRegistry(){}
-FixedColorSchemeRegistry.lookUp=function(name){const info=this.findTypeInfoMatching(info=>info.metadata.name===name);if(!info)return undefined;return info.constructor();};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(FixedColorSchemeRegistry,options);return{MemoryColumnColorScheme,FixedColorScheme,FixedColorSchemeRegistry,};});'use strict';tr.exportTo('tr.e.chrome.chrome_processes',function(){const CHROME_PROCESS_NAMES={BROWSER:'browser_process',RENDERER:'renderer_processes',ALL:'all_processes',GPU:'gpu_process',PPAPI:'ppapi_process',UNKNOWN:'unknown_processes',};const PROCESS_COLOR_SCHEME_NAME='ChromeProcessNames';const PROCESS_COLOR_SCHEME=tr.b.FixedColorScheme.fromNames(Object.values(CHROME_PROCESS_NAMES));tr.b.FixedColorSchemeRegistry.register(()=>PROCESS_COLOR_SCHEME,{name:PROCESS_COLOR_SCHEME_NAME,});function canonicalizeName(name){return name.toLowerCase().replace(' ','_');}
-function canonicalizeProcessName(rawProcessName){if(!rawProcessName)return CHROME_PROCESS_NAMES.UNKNOWN;const baseCanonicalName=canonicalizeName(rawProcessName);switch(baseCanonicalName){case'renderer':return CHROME_PROCESS_NAMES.RENDERER;case'browser':return CHROME_PROCESS_NAMES.BROWSER;}
-if(Object.values(CHROME_PROCESS_NAMES).includes(baseCanonicalName)){return baseCanonicalName;}
-return CHROME_PROCESS_NAMES.UNKNOWN;}
-return{CHROME_PROCESS_NAMES,PROCESS_COLOR_SCHEME,PROCESS_COLOR_SCHEME_NAME,canonicalizeName,canonicalizeProcessName,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function perceptualBlend(ir,index,score){return Math.exp(1-score);}
-function filterExpectationsByRange(irs,opt_range){const filteredExpectations=[];irs.forEach(function(ir){if(!(ir instanceof tr.model.um.UserExpectation))return;if(!opt_range||opt_range.intersectsExplicitRangeInclusive(ir.start,ir.end)){filteredExpectations.push(ir);}});return filteredExpectations;}
-function splitGlobalDumpsByBrowserName(model,opt_rangeOfInterest){const chromeModelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const browserNameToGlobalDumps=new Map();const globalDumpToBrowserHelper=new WeakMap();if(chromeModelHelper){chromeModelHelper.browserHelpers.forEach(function(helper){const globalDumps=skipDumpsThatDoNotIntersectRange(helper.process.memoryDumps.map(d=>d.globalMemoryDump),opt_rangeOfInterest);globalDumps.forEach(function(globalDump){const existingHelper=globalDumpToBrowserHelper.get(globalDump);if(existingHelper!==undefined){throw new Error('Memory dump ID clash across multiple browsers '+'with PIDs: '+existingHelper.pid+' and '+helper.pid);}
-globalDumpToBrowserHelper.set(globalDump,helper);});makeKeyUniqueAndSet(browserNameToGlobalDumps,tr.e.chrome.chrome_processes.canonicalizeName(helper.browserName),globalDumps);});}
-const unclassifiedGlobalDumps=skipDumpsThatDoNotIntersectRange(model.globalMemoryDumps.filter(g=>!globalDumpToBrowserHelper.has(g)),opt_rangeOfInterest);if(unclassifiedGlobalDumps.length>0){makeKeyUniqueAndSet(browserNameToGlobalDumps,'unknown_browser',unclassifiedGlobalDumps);}
-return browserNameToGlobalDumps;}
-function makeKeyUniqueAndSet(map,key,value){let uniqueKey=key;let nextIndex=2;while(map.has(uniqueKey)){uniqueKey=key+nextIndex;nextIndex++;}
-map.set(uniqueKey,value);}
-function skipDumpsThatDoNotIntersectRange(dumps,opt_range){if(!opt_range)return dumps;return dumps.filter(d=>opt_range.intersectsExplicitRangeInclusive(d.start,d.end));}
-function hasCategoryAndName(event,category,title){return event.title===title&&event.category&&tr.b.getCategoryParts(event.category).includes(category);}
-return{hasCategoryAndName,filterExpectationsByRange,perceptualBlend,splitGlobalDumpsByBrowserName};});'use strict';tr.exportTo('tr.e.chrome',function(){const CHROME_INTERNAL_URLS=['','about:blank','data:text/html,pluginplaceholderdata','chrome-error://chromewebdata/'];const SCHEDULER_TOP_LEVEL_TASK_TITLE='ThreadControllerImpl::RunTask';const SCHEDULER_TOP_LEVEL_TASKS=new Set([SCHEDULER_TOP_LEVEL_TASK_TITLE,'ThreadControllerImpl::DoWork','TaskQueueManager::ProcessTaskFromWorkQueue']);class EventFinderUtils{static hasCategoryAndName(event,category,title){return event.title===title&&event.category&&tr.b.getCategoryParts(event.category).includes(category);}
-static*getMainThreadEvents(rendererHelper,eventTitle,eventCategory){if(!rendererHelper.mainThread)return;for(const ev of rendererHelper.mainThread.sliceGroup.childEvents()){if(rendererHelper.isTelemetryInternalEvent(ev))continue;if(!this.hasCategoryAndName(ev,eventCategory,eventTitle)){continue;}
-yield ev;}}
-static getNetworkEventsInRange(process,range){const networkEvents=[];for(const thread of Object.values(process.threads)){const threadHelper=new tr.model.helpers.ChromeThreadHelper(thread);const events=threadHelper.getNetworkEvents();for(const event of events){if(range.intersectsExplicitRangeInclusive(event.start,event.end)){networkEvents.push(event);}}}
-return networkEvents;}
-static getSortedMainThreadEventsByFrame(rendererHelper,eventTitle,eventCategory){const eventsByFrame=new Map();const events=this.getMainThreadEvents(rendererHelper,eventTitle,eventCategory);for(const ev of events){const frameIdRef=ev.args.frame;if(frameIdRef===undefined)continue;if(!eventsByFrame.has(frameIdRef)){eventsByFrame.set(frameIdRef,[]);}
-eventsByFrame.get(frameIdRef).push(ev);}
-return eventsByFrame;}
-static getSortedMainThreadEventsByNavId(rendererHelper,eventTitle,eventCategory){const eventsByNavId=new Map();const events=this.getMainThreadEvents(rendererHelper,eventTitle,eventCategory);for(const ev of events){if(ev.args.data===undefined)continue;const navIdRef=ev.args.data.navigationId;if(navIdRef===undefined)continue;eventsByNavId.set(navIdRef,ev);}
-return eventsByNavId;}
-static findLastEventStartingOnOrBeforeTimestamp(sortedEvents,timestamp){const firstIndexAfterTimestamp=tr.b.findFirstTrueIndexInSortedArray(sortedEvents,e=>e.start>timestamp);if(firstIndexAfterTimestamp===0)return undefined;return sortedEvents[firstIndexAfterTimestamp-1];}
-static findLastEventStartingBeforeTimestamp(sortedEvents,timestamp){const firstIndexAfterTimestamp=tr.b.findFirstTrueIndexInSortedArray(sortedEvents,e=>e.start>=timestamp);if(firstIndexAfterTimestamp===0)return undefined;return sortedEvents[firstIndexAfterTimestamp-1];}
-static findNextEventStartingOnOrAfterTimestamp(sortedEvents,timestamp){const firstIndexOnOrAfterTimestamp=tr.b.findFirstTrueIndexInSortedArray(sortedEvents,e=>e.start>=timestamp);if(firstIndexOnOrAfterTimestamp===sortedEvents.length){return undefined;}
-return sortedEvents[firstIndexOnOrAfterTimestamp];}
-static findNextEventStartingAfterTimestamp(sortedEvents,timestamp){const firstIndexOnOrAfterTimestamp=tr.b.findFirstTrueIndexInSortedArray(sortedEvents,e=>e.start>timestamp);if(firstIndexOnOrAfterTimestamp===sortedEvents.length){return undefined;}
-return sortedEvents[firstIndexOnOrAfterTimestamp];}
-static findToplevelSchedulerTasks(mainThread){const tasks=[];for(const task of mainThread.findTopmostSlices(slice=>slice.category==='toplevel'&&SCHEDULER_TOP_LEVEL_TASKS.has(slice.title))){tasks.push(task);}
-return tasks;}}
-return{EventFinderUtils,CHROME_INTERNAL_URLS,SCHEDULER_TOP_LEVEL_TASK_TITLE,};});'use strict';tr.exportTo('tr.e.chrome',function(){const TIME_TO_INTERACTIVE_WINDOW_SIZE_MS=5000;const ACTIVE_REQUEST_TOLERANCE=2;const FCI_MIN_CLUSTER_SEPARATION_MS=1000;const TASK_CLUSTER_HEAVINESS_THRESHOLD_MS=250;const ENDPOINT_TYPES={LONG_TASK_START:'LONG_TASK_START',LONG_TASK_END:'LONG_TASK_END',REQUEST_START:'REQUEST_START',REQUEST_END:'REQUEST_END'};function getEndpoints_(events,startType,endType){const endpoints=[];for(const event of events){endpoints.push({time:event.start,type:startType});endpoints.push({time:event.end,type:endType});}
-return endpoints;}
-function reachedTTIQuiscence_(timestamp,networkQuietWindowStart,mainThreadQuietWindowStart){if(networkQuietWindowStart===undefined||mainThreadQuietWindowStart===undefined){return false;}
-const mainThreadQuietForLongEnough=timestamp-mainThreadQuietWindowStart>=TIME_TO_INTERACTIVE_WINDOW_SIZE_MS;const networkQuietForLongEnough=timestamp-networkQuietWindowStart>=TIME_TO_INTERACTIVE_WINDOW_SIZE_MS;return mainThreadQuietForLongEnough&&networkQuietForLongEnough;}
-function findInteractiveTime(searchBegin,searchEnd,domContentLoadedEnd,longTasksInWindow,networkRequests){const longTaskEndpoints=getEndpoints_(longTasksInWindow,ENDPOINT_TYPES.LONG_TASK_START,ENDPOINT_TYPES.LONG_TASK_END);const networkRequestEndpoints=getEndpoints_(networkRequests,ENDPOINT_TYPES.REQUEST_START,ENDPOINT_TYPES.REQUEST_END);const endpoints=longTaskEndpoints.concat(networkRequestEndpoints);endpoints.sort((a,b)=>a.time-b.time);let networkQuietWindowStart=searchBegin;let mainThreadQuietWindowStart=searchBegin;let interactiveCandidate=undefined;let activeRequests=0;for(const endpoint of endpoints){if(reachedTTIQuiscence_(endpoint.time,networkQuietWindowStart,mainThreadQuietWindowStart)){interactiveCandidate=mainThreadQuietWindowStart;break;}
-switch(endpoint.type){case ENDPOINT_TYPES.LONG_TASK_START:mainThreadQuietWindowStart=undefined;break;case ENDPOINT_TYPES.LONG_TASK_END:mainThreadQuietWindowStart=endpoint.time;break;case ENDPOINT_TYPES.REQUEST_START:activeRequests++;if(activeRequests>ACTIVE_REQUEST_TOLERANCE){networkQuietWindowStart=undefined;}
-break;case ENDPOINT_TYPES.REQUEST_END:activeRequests--;if(activeRequests===ACTIVE_REQUEST_TOLERANCE){networkQuietWindowStart=endpoint.time;}
-break;default:throw new Error('Internal Error: Unhandled endpoint type.');}}
-if(interactiveCandidate===undefined&&reachedTTIQuiscence_(searchEnd,networkQuietWindowStart,mainThreadQuietWindowStart)){interactiveCandidate=mainThreadQuietWindowStart;}
-if(interactiveCandidate===undefined)return undefined;return Math.max(interactiveCandidate,domContentLoadedEnd);}
-function requiredFCIWindowSizeMs(timeSinceSearchBeginMs){const timeCoefficient=1/15*Math.log(2);const timeSinceSearchBeginSeconds=tr.b.convertUnit(timeSinceSearchBeginMs,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);const windowSizeSeconds=4*Math.exp(-timeCoefficient*timeSinceSearchBeginSeconds)+1;return tr.b.convertUnit(windowSizeSeconds,tr.b.UnitPrefixScale.METRIC.NONE,tr.b.UnitPrefixScale.METRIC.MILLI);}
-class TaskCluster{constructor(tasksInClusterSorted){if(tasksInClusterSorted.length===0){throw new Error('Internal Error: TaskCluster must have non zero tasks');}
-for(let i=0;i<tasksInClusterSorted.length-1;i++){const durationBetweenTasks=tasksInClusterSorted[i+1].start-
-tasksInClusterSorted[i].end;if(durationBetweenTasks>=FCI_MIN_CLUSTER_SEPARATION_MS){throw new Error('Internal Error: Tasks in a TaskCluster cannot be '+'more than '+FCI_MIN_CLUSTER_SEPARATION_MS+' miliseconds apart');}
-if(durationBetweenTasks<-1e7){throw new Error('Internal Error: List of tasks used to construct '+'TaskCluster must be sorted.');}}
-this._clusterTasks=tasksInClusterSorted;}
-get start(){return this._clusterTasks[0].start;}
-get end(){return this._clusterTasks[this._clusterTasks.length-1].end;}
-isHeavy(){return this.end-this.start>TASK_CLUSTER_HEAVINESS_THRESHOLD_MS;}}
-function findFCITaskClusters(sortedLongTasks){const clusters=[];if(sortedLongTasks.length===0)return clusters;const firstTask=sortedLongTasks[0];const restOfTasks=sortedLongTasks.slice(1);let currentClusterTasks=[firstTask];for(const currTask of restOfTasks){const prevTask=currentClusterTasks[currentClusterTasks.length-1];if(currTask.start-prevTask.end<FCI_MIN_CLUSTER_SEPARATION_MS){currentClusterTasks.push(currTask);}else{clusters.push(new TaskCluster(currentClusterTasks));currentClusterTasks=[currTask];}}
-clusters.push(new TaskCluster(currentClusterTasks));return clusters;}
-function reachedFCIQuiescence_(timestamp,mainThreadQuietWindowStart,searchBegin){const quietWindowSize=timestamp-mainThreadQuietWindowStart;const timeSinceSearchBegin=mainThreadQuietWindowStart-searchBegin;const requiredWindowSize=requiredFCIWindowSizeMs(timeSinceSearchBegin);return quietWindowSize>requiredWindowSize;}
-function findFirstCpuIdleTime(searchBegin,searchEnd,domContentLoadedEnd,longTasksInWindow){const sortedLongTasks=longTasksInWindow.sort((a,b)=>a.start-b.start);const taskClusters=findFCITaskClusters(sortedLongTasks);const heavyTaskClusters=taskClusters.filter(cluster=>cluster.isHeavy());let quietWindowBegin=searchBegin;let fiCandidate=undefined;for(const cluster of heavyTaskClusters){if(reachedFCIQuiescence_(cluster.start,quietWindowBegin,searchBegin)){fiCandidate=quietWindowBegin;break;}
-quietWindowBegin=cluster.end;}
-if(fiCandidate===undefined){if(reachedFCIQuiescence_(searchEnd,quietWindowBegin,searchBegin)){fiCandidate=quietWindowBegin;}else{return undefined;}}
-return Math.max(fiCandidate,domContentLoadedEnd);}
-return{findInteractiveTime,findFirstCpuIdleTime,requiredFCIWindowSizeMs,findFCITaskClusters,};});'use strict';tr.exportTo('tr.model.um',function(){const LOAD_SUBTYPE_NAMES={SUCCESSFUL:'Successful',FAILED:'Failed',};const DOES_LOAD_SUBTYPE_NAME_EXIST={};for(const key in LOAD_SUBTYPE_NAMES){DOES_LOAD_SUBTYPE_NAME_EXIST[LOAD_SUBTYPE_NAMES[key]]=true;}
-function LoadExpectation(parentModel,initiatorTitle,start,duration,renderer,navigationStart,fmpEvent,fcpEvent,dclEndEvent,cpuIdleTime,timeToInteractive,totalBlockingTime,url,frameId){if(!DOES_LOAD_SUBTYPE_NAME_EXIST[initiatorTitle]){throw new Error(initiatorTitle+' is not in LOAD_SUBTYPE_NAMES');}
-tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);this.renderProcess=renderer;this.renderMainThread=undefined;this.routingId=undefined;this.parentRoutingId=undefined;this.loadFinishedEvent=undefined;this.navigationStart=navigationStart;this.fmpEvent=fmpEvent;this.fcpEvent=fcpEvent;this.domContentLoadedEndEvent=dclEndEvent;this.firstCpuIdleTime=cpuIdleTime;this.timeToInteractive=timeToInteractive;this.totalBlockingTime=totalBlockingTime;this.url=url;this.frameId=frameId;}
-LoadExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:LoadExpectation};tr.model.um.UserExpectation.subTypes.register(LoadExpectation,{stageTitle:'Load',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_load')});return{LOAD_SUBTYPE_NAMES,LoadExpectation,};});'use strict';tr.exportTo('tr.importer',function(){const LONG_TASK_THRESHOLD_MS=50;const IGNORE_URLS=['','about:blank',];function findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,ts){const objects=rendererHelper.process.objects;const frameLoaderInstances=objects.instancesByTypeName_.FrameLoader;if(frameLoaderInstances===undefined)return undefined;let snapshot;for(const instance of frameLoaderInstances){if(!instance.isAliveAt(ts))continue;const maybeSnapshot=instance.getSnapshotAt(ts);if(frameIdRef!==maybeSnapshot.args.frame.id_ref)continue;snapshot=maybeSnapshot;}
-return snapshot;}
-function findFirstMeaningfulPaintCandidates(rendererHelper){const candidatesForFrameId={};for(const ev of rendererHelper.process.getDescendantEvents()){if(!tr.e.chrome.EventFinderUtils.hasCategoryAndName(ev,'loading','firstMeaningfulPaintCandidate')){continue;}
-if(rendererHelper.isTelemetryInternalEvent(ev))continue;const frameIdRef=ev.args.frame;if(frameIdRef===undefined)continue;let list=candidatesForFrameId[frameIdRef];if(list===undefined){candidatesForFrameId[frameIdRef]=list=[];}
-list.push(ev);}
-return candidatesForFrameId;}
-function computeTotalBlockingTime_(fcpTime,interactiveTime,topLevelTasks){let sumBlockingTime=0;for(const event of topLevelTasks){if(event.duration<LONG_TASK_THRESHOLD_MS)continue;if(event.end<fcpTime)continue;if(event.start>interactiveTime)continue;const clippedStart=Math.max(event.start,fcpTime);const clippedEnd=Math.min(event.end,interactiveTime);const clippedDuration=clippedEnd-clippedStart;if(clippedDuration<LONG_TASK_THRESHOLD_MS)continue;sumBlockingTime+=(clippedDuration-LONG_TASK_THRESHOLD_MS);}
-return sumBlockingTime;}
-function computeInteractivityMetricSample_(rendererHelper,navigationStart,fcpEvent,domContentLoadedEndEvent,searchWindowEnd){if(domContentLoadedEndEvent===undefined||fcpEvent===undefined){return{interactiveTime:undefined,firstCpuIdleTime:undefined,totalBlockingTime:undefined};}
-const firstContentfulPaintTime=fcpEvent.start;const mainThreadTasks=tr.e.chrome.EventFinderUtils.findToplevelSchedulerTasks(rendererHelper.mainThread);const longTasks=mainThreadTasks.filter(task=>task.duration>=LONG_TASK_THRESHOLD_MS);const longTasksInWindow=longTasks.filter(task=>task.range.intersectsExplicitRangeInclusive(firstContentfulPaintTime,searchWindowEnd));const resourceLoadEvents=tr.e.chrome.EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,tr.b.math.Range.fromExplicitRange(navigationStart.start,searchWindowEnd));const firstCpuIdleTime=tr.e.chrome.findFirstCpuIdleTime(firstContentfulPaintTime,searchWindowEnd,domContentLoadedEndEvent.start,longTasksInWindow);const interactiveTime=resourceLoadEvents.length>0?tr.e.chrome.findInteractiveTime(firstContentfulPaintTime,searchWindowEnd,domContentLoadedEndEvent.start,longTasksInWindow,resourceLoadEvents):undefined;const totalBlockingTime=interactiveTime?computeTotalBlockingTime_(fcpEvent.start,interactiveTime,longTasks):undefined;return{interactiveTime,firstCpuIdleTime,totalBlockingTime};}
-function constructLoadingExpectation_(rendererHelper,frameToDomContentLoadedEndEvents,frameToFcpEvents,navigationStart,fmpEvent,searchWindowEnd,url,frameId){const searchRange=tr.b.math.Range.fromExplicitRange(navigationStart.start,searchWindowEnd);const dclTimesForFrame=frameToDomContentLoadedEndEvents.get(frameId)||[];const dclTimesInWindow=searchRange.filterArray(dclTimesForFrame,event=>event.start);let domContentLoadedEndEvent=undefined;if(dclTimesInWindow.length!==0){domContentLoadedEndEvent=dclTimesInWindow[dclTimesInWindow.length-1];}
-const fcpForFrame=frameToFcpEvents.get(frameId)||[];const fcpInWindow=searchRange.filterArray(fcpForFrame,event=>event.start);const fcpEvent=fcpInWindow[0];const{interactiveTime,firstCpuIdleTime,totalBlockingTime}=computeInteractivityMetricSample_(rendererHelper,navigationStart,fcpEvent,domContentLoadedEndEvent,searchWindowEnd);const duration=(interactiveTime===undefined)?searchWindowEnd-navigationStart.start:interactiveTime-navigationStart.start;return new tr.model.um.LoadExpectation(rendererHelper.modelHelper.model,tr.model.um.LOAD_SUBTYPE_NAMES.SUCCESSFUL,navigationStart.start,duration,rendererHelper.process,navigationStart,fmpEvent,fcpEvent,domContentLoadedEndEvent,firstCpuIdleTime,interactiveTime,totalBlockingTime,url,frameId);}
-function collectLoadExpectationsForRenderer(rendererHelper){const samples=[];const frameToNavStartEvents=tr.e.chrome.EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,'navigationStart','blink.user_timing');const frameToDomContentLoadedEndEvents=tr.e.chrome.EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,'domContentLoadedEventEnd','blink.user_timing');const frameToFcpEvents=tr.e.chrome.EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,'firstContentfulPaint','loading');function addSamples(frameIdRef,navigationStart,fmpCandidateEvents,searchWindowEnd,url){let fmpMarkerEvent=tr.e.chrome.EventFinderUtils.findLastEventStartingOnOrBeforeTimestamp(fmpCandidateEvents,searchWindowEnd);if(fmpMarkerEvent!==undefined&&navigationStart.start>fmpMarkerEvent.start){fmpMarkerEvent=undefined;}
-samples.push(constructLoadingExpectation_(rendererHelper,frameToDomContentLoadedEndEvents,frameToFcpEvents,navigationStart,fmpMarkerEvent,searchWindowEnd,url,frameIdRef));}
-const candidatesForFrameId=findFirstMeaningfulPaintCandidates(rendererHelper);for(const[frameIdRef,navStartEvents]of frameToNavStartEvents){const fmpCandidateEvents=candidatesForFrameId[frameIdRef]||[];let prevNavigation={navigationEvent:undefined,url:undefined};for(let index=0;index<navStartEvents.length;index++){const currNavigation=navStartEvents[index];let url;let isLoadingMainFrame=false;if(currNavigation.args.data){url=currNavigation.args.data.documentLoaderURL;isLoadingMainFrame=currNavigation.args.data.isLoadingMainFrame;}else{const snapshot=findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,currNavigation.start);if(snapshot){url=snapshot.args.documentLoaderURL;isLoadingMainFrame=snapshot.args.isLoadingMainFrame;}}
-if(!isLoadingMainFrame)continue;if(url===undefined||IGNORE_URLS.includes(url))continue;if(prevNavigation.navigationEvent!==undefined){addSamples(frameIdRef,prevNavigation.navigationEvent,fmpCandidateEvents,currNavigation.start,prevNavigation.url);}
-prevNavigation={navigationEvent:currNavigation,url};}
-if(prevNavigation.navigationEvent!==undefined){addSamples(frameIdRef,prevNavigation.navigationEvent,fmpCandidateEvents,rendererHelper.modelHelper.chromeBounds.max,prevNavigation.url);}}
-return samples;}
-function findLoadExpectations(modelHelper){const loads=[];const chromeHelper=modelHelper.model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const pid in chromeHelper.rendererHelpers){const rendererHelper=chromeHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI)continue;loads.push.apply(loads,collectLoadExpectationsForRenderer(rendererHelper));}
-return loads;}
-return{findLoadExpectations,};});'use strict';tr.exportTo('tr.model.um',function(){function StartupExpectation(parentModel,start,duration){tr.model.um.UserExpectation.call(this,parentModel,'',start,duration);}
-StartupExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:StartupExpectation};tr.model.um.UserExpectation.subTypes.register(StartupExpectation,{stageTitle:'Startup',colorId:tr.b.ColorScheme.getColorIdForReservedName('startup')});return{StartupExpectation,};});'use strict';tr.exportTo('tr.importer',function(){function getAllFrameEvents(modelHelper){const frameEvents=[];frameEvents.push.apply(frameEvents,modelHelper.browserHelper.getFrameEventsInRange(tr.model.helpers.IMPL_FRAMETIME_TYPE,modelHelper.model.bounds));for(const renderer of Object.values(modelHelper.rendererHelpers)){frameEvents.push.apply(frameEvents,renderer.getFrameEventsInRange(tr.model.helpers.IMPL_FRAMETIME_TYPE,modelHelper.model.bounds));}
-return frameEvents.sort(tr.importer.compareEvents);}
-function getStartupEvents(modelHelper){function isStartupSlice(slice){return slice.title==='BrowserMainLoop::CreateThreads';}
-const events=modelHelper.browserHelper.getAllAsyncSlicesMatching(isStartupSlice);const deduper=new tr.model.EventSet();events.forEach(function(event){const sliceGroup=event.parentContainer.sliceGroup;const slice=sliceGroup&&sliceGroup.findFirstSlice();if(slice){deduper.push(slice);}});return deduper.toArray();}
-function findStartupExpectations(modelHelper){const openingEvents=getStartupEvents(modelHelper);const closingEvents=getAllFrameEvents(modelHelper);const startups=[];openingEvents.forEach(function(openingEvent){closingEvents.forEach(function(closingEvent){if(openingEvent.closingEvent)return;if(closingEvent.openingEvent)return;if(closingEvent.start<=openingEvent.start)return;if(openingEvent.parentContainer.parent.pid!==closingEvent.parentContainer.parent.pid){return;}
-openingEvent.closingEvent=closingEvent;closingEvent.openingEvent=openingEvent;const se=new tr.model.um.StartupExpectation(modelHelper.model,openingEvent.start,closingEvent.end-openingEvent.start);se.associatedEvents.push(openingEvent);se.associatedEvents.push(closingEvent);startups.push(se);});});return startups;}
-return{findStartupExpectations,};});'use strict';tr.exportTo('tr.model',function(){function getAssociatedEvents(irs){const allAssociatedEvents=new tr.model.EventSet();irs.forEach(function(ir){ir.associatedEvents.forEach(function(event){if(event instanceof tr.model.FlowEvent)return;allAssociatedEvents.push(event);});});return allAssociatedEvents;}
-function getUnassociatedEvents(model,associatedEvents){const unassociatedEvents=new tr.model.EventSet();for(const proc of model.getAllProcesses()){for(const thread of Object.values(proc.threads)){for(const event of thread.sliceGroup.getDescendantEvents()){if(!associatedEvents.contains(event)){unassociatedEvents.push(event);}}}}
-return unassociatedEvents;}
-function getTotalCpuDuration(events){let cpuMs=0;events.forEach(function(event){if(event.cpuSelfTime){cpuMs+=event.cpuSelfTime;}});return cpuMs;}
-function getIRCoverageFromModel(model){const associatedEvents=getAssociatedEvents(model.userModel.expectations);if(!associatedEvents.length)return undefined;const unassociatedEvents=getUnassociatedEvents(model,associatedEvents);const associatedCpuMs=getTotalCpuDuration(associatedEvents);const unassociatedCpuMs=getTotalCpuDuration(unassociatedEvents);const totalEventCount=associatedEvents.length+unassociatedEvents.length;const totalCpuMs=associatedCpuMs+unassociatedCpuMs;let coveredEventsCpuTimeRatio=undefined;if(totalCpuMs!==0){coveredEventsCpuTimeRatio=associatedCpuMs/totalCpuMs;}
-return{associatedEventsCount:associatedEvents.length,unassociatedEventsCount:unassociatedEvents.length,associatedEventsCpuTimeMs:associatedCpuMs,unassociatedEventsCpuTimeMs:unassociatedCpuMs,coveredEventsCountRatio:associatedEvents.length/totalEventCount,coveredEventsCpuTimeRatio};}
-return{getIRCoverageFromModel,getAssociatedEvents,getUnassociatedEvents,};});'use strict';tr.exportTo('tr.model.um',function(){function IdleExpectation(parentModel,start,duration){const initiatorTitle='';tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);}
-IdleExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:IdleExpectation};tr.model.um.UserExpectation.subTypes.register(IdleExpectation,{stageTitle:'Idle',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_idle')});return{IdleExpectation,};});'use strict';tr.exportTo('tr.importer',function(){const INSIGNIFICANT_MS=1;class UserModelBuilder{constructor(model){this.model=model;this.modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);}
-static supportsModelHelper(modelHelper){return modelHelper.browserHelper!==undefined;}
-buildUserModel(){if(!this.modelHelper||!this.modelHelper.browserHelper)return;try{for(const ue of this.findUserExpectations()){this.model.userModel.expectations.push(ue);}
-this.model.userModel.segments.push(...this.findSegments());}catch(error){this.model.importWarning({type:'UserModelBuilder',message:error,showToUser:true});}}
-findSegments(){let timestamps=new Set();for(const expectation of this.model.userModel.expectations){timestamps.add(expectation.start);timestamps.add(expectation.end);}
-timestamps=[...timestamps];timestamps.sort((x,y)=>x-y);const segments=[];for(let i=0;i<timestamps.length-1;++i){const segment=new tr.model.um.Segment(timestamps[i],timestamps[i+1]-timestamps[i]);segments.push(segment);const segmentRange=tr.b.math.Range.fromExplicitRange(segment.start,segment.end);for(const expectation of this.model.userModel.expectations){const expectationRange=tr.b.math.Range.fromExplicitRange(expectation.start,expectation.end);if(segmentRange.intersectsRangeExclusive(expectationRange)){segment.expectations.push(expectation);}}}
-return segments;}
-findUserExpectations(){const expectations=[];expectations.push.apply(expectations,tr.importer.findStartupExpectations(this.modelHelper));expectations.push.apply(expectations,tr.importer.findLoadExpectations(this.modelHelper));expectations.push.apply(expectations,tr.importer.findInputExpectations(this.modelHelper));expectations.push.apply(expectations,this.findIdleExpectations(expectations));this.collectUnassociatedEvents_(expectations);return expectations;}
-collectUnassociatedEvents_(expectations){const vacuumUEs=[];for(const expectation of expectations){if(expectation instanceof tr.model.um.IdleExpectation||expectation instanceof tr.model.um.LoadExpectation||expectation instanceof tr.model.um.StartupExpectation){vacuumUEs.push(expectation);}}
-if(vacuumUEs.length===0)return;const allAssociatedEvents=tr.model.getAssociatedEvents(expectations);const unassociatedEvents=tr.model.getUnassociatedEvents(this.model,allAssociatedEvents);for(const event of unassociatedEvents){if(!(event instanceof tr.model.ThreadSlice))continue;if(!event.isTopLevel)continue;for(let index=0;index<vacuumUEs.length;++index){const expectation=vacuumUEs[index];if((event.start>=expectation.start)&&(event.start<expectation.end)){expectation.associatedEvents.addEventSet(event.entireHierarchy);break;}}}}
-findIdleExpectations(otherUEs){if(this.model.bounds.isEmpty)return;const emptyRanges=tr.b.math.findEmptyRangesBetweenRanges(tr.b.math.convertEventsToRanges(otherUEs),this.model.bounds);const expectations=[];const model=this.model;for(const range of emptyRanges){if(range.max<(range.min+INSIGNIFICANT_MS))continue;expectations.push(new tr.model.um.IdleExpectation(model,range.min,range.max-range.min));}
-return expectations;}}
-function createCustomizeModelLinesFromModel(model){const modelLines=[];modelLines.push('      audits.addEvent(model.browserMain,');modelLines.push('          {title: \'model start\', start: 0, end: 1});');const typeNames={};for(const typeName in tr.e.cc.INPUT_EVENT_TYPE_NAMES){typeNames[tr.e.cc.INPUT_EVENT_TYPE_NAMES[typeName]]=typeName;}
-let modelEvents=new tr.model.EventSet();for(const ue of model.userModel.expectations){modelEvents.addEventSet(ue.sourceEvents);}
-modelEvents=modelEvents.toArray();modelEvents.sort(tr.importer.compareEvents);for(const event of modelEvents){const startAndEnd='start: '+parseInt(event.start)+', '+'end: '+parseInt(event.end)+'});';if(event instanceof tr.e.cc.InputLatencyAsyncSlice){modelLines.push('      audits.addInputEvent(model, INPUT_TYPE.'+
-typeNames[event.typeName]+',');}else if(event.title==='RenderFrameImpl::didCommitProvisionalLoad'){modelLines.push('      audits.addCommitLoadEvent(model,');}else if(event.title==='InputHandlerProxy::HandleGestureFling::started'){modelLines.push('      audits.addFlingAnimationEvent(model,');}else if(event.title===tr.model.helpers.IMPL_RENDERING_STATS){modelLines.push('      audits.addFrameEvent(model,');}else if(event.title===tr.importer.CSS_ANIMATION_TITLE){modelLines.push('      audits.addEvent(model.rendererMain, {');modelLines.push('        title: \'Animation\', '+startAndEnd);return;}else{throw new Error('You must extend createCustomizeModelLinesFromModel()'+'to support this event:\n'+event.title+'\n');}
-modelLines.push('          {'+startAndEnd);}
-modelLines.push('      audits.addEvent(model.browserMain,');modelLines.push('          {'+'title: \'model end\', '+'start: '+(parseInt(model.bounds.max)-1)+', '+'end: '+parseInt(model.bounds.max)+'});');return modelLines;}
-function createExpectedUELinesFromModel(model){const expectedLines=[];const ueCount=model.userModel.expectations.length;for(let index=0;index<ueCount;++index){const expectation=model.userModel.expectations[index];let ueString='      {';ueString+='title: \''+expectation.title+'\', ';ueString+='start: '+parseInt(expectation.start)+', ';ueString+='end: '+parseInt(expectation.end)+', ';ueString+='eventCount: '+expectation.sourceEvents.length;ueString+='}';if(index<(ueCount-1))ueString+=',';expectedLines.push(ueString);}
-return expectedLines;}
-function createUEFinderTestCaseStringFromModel(model){const filename=window.location.hash.substr(1);let testName=filename.substr(filename.lastIndexOf('/')+1);testName=testName.substr(0,testName.indexOf('.'));try{const testLines=[];testLines.push('  /*');testLines.push('    This test was generated from');testLines.push('    '+filename+'');testLines.push('   */');testLines.push('  test(\''+testName+'\', function() {');testLines.push('    const verifier = new UserExpectationVerifier();');testLines.push('    verifier.customizeModelCallback = function(model) {');testLines.push.apply(testLines,createCustomizeModelLinesFromModel(model));testLines.push('    };');testLines.push('    verifier.expectedUEs = [');testLines.push.apply(testLines,createExpectedUELinesFromModel(model));testLines.push('    ];');testLines.push('    verifier.verify();');testLines.push('  });');return testLines.join('\n');}catch(error){return error;}}
-return{UserModelBuilder,createUEFinderTestCaseStringFromModel,};});'use strict';tr.exportTo('tr.ui.b',function(){function decorate(source,constr){let elements;if(typeof source==='string'){elements=Polymer.dom(tr.doc).querySelectorAll(source);}else{elements=[source];}
-for(let i=0,el;el=elements[i];i++){if(!(el instanceof constr)){constr.decorate(el);}}}
-function define(className,opt_parentConstructor,opt_tagNS){if(typeof className==='function'){throw new Error('Passing functions as className is deprecated. Please '+'use (className, opt_parentConstructor) to subclass');}
-className=className.toLowerCase();if(opt_parentConstructor&&!opt_parentConstructor.tagName){throw new Error('opt_parentConstructor was not '+'created by tr.ui.b.define');}
-let tagName=className;let tagNS=undefined;if(opt_parentConstructor){if(opt_tagNS){throw new Error('Must not specify tagNS if parentConstructor is given');}
-let parent=opt_parentConstructor;while(parent&&parent.tagName){tagName=parent.tagName;tagNS=parent.tagNS;parent=parent.parentConstructor;}}else{tagNS=opt_tagNS;}
-function f(){if(opt_parentConstructor&&f.prototype.__proto__!==opt_parentConstructor.prototype){throw new Error(className+' prototye\'s __proto__ field is messed up. '+'It MUST be the prototype of '+opt_parentConstructor.tagName);}
-let el;if(tagNS===undefined){el=tr.doc.createElement(tagName);}else{el=tr.doc.createElementNS(tagNS,tagName);}
-f.decorate.call(this,el,arguments);return el;}
-f.decorate=function(el){el.__proto__=f.prototype;el.decorate.apply(el,arguments[1]);el.constructor=f;};f.className=className;f.tagName=tagName;f.tagNS=tagNS;f.parentConstructor=(opt_parentConstructor?opt_parentConstructor:undefined);f.toString=function(){if(!f.parentConstructor){return f.tagName;}
-return f.parentConstructor.toString()+'::'+f.className;};return f;}
-function elementIsChildOf(el,potentialParent){if(el===potentialParent)return false;let cur=el;while(Polymer.dom(cur).parentNode){if(cur===potentialParent)return true;cur=Polymer.dom(cur).parentNode;}
-return false;}
-return{decorate,define,elementIsChildOf,};});'use strict';tr.exportTo('tr.b.math',function(){function Rect(){this.x=0;this.y=0;this.width=0;this.height=0;}
-Rect.fromXYWH=function(x,y,w,h){const rect=new Rect();rect.x=x;rect.y=y;rect.width=w;rect.height=h;return rect;};Rect.fromArray=function(ary){if(ary.length!==4){throw new Error('ary.length must be 4');}
-const rect=new Rect();rect.x=ary[0];rect.y=ary[1];rect.width=ary[2];rect.height=ary[3];return rect;};Rect.prototype={__proto__:Object.prototype,get left(){return this.x;},get top(){return this.y;},get right(){return this.x+this.width;},get bottom(){return this.y+this.height;},toString(){return'Rect('+this.x+', '+this.y+', '+
-this.width+', '+this.height+')';},toArray(){return[this.x,this.y,this.width,this.height];},clone(){const rect=new Rect();rect.x=this.x;rect.y=this.y;rect.width=this.width;rect.height=this.height;return rect;},enlarge(pad){const rect=new Rect();this.enlargeFast(rect,pad);return rect;},enlargeFast(out,pad){out.x=this.x-pad;out.y=this.y-pad;out.width=this.width+2*pad;out.height=this.height+2*pad;return out;},size(){return{width:this.width,height:this.height};},scale(s){const rect=new Rect();this.scaleFast(rect,s);return rect;},scaleSize(s){return Rect.fromXYWH(this.x,this.y,this.width*s,this.height*s);},scaleFast(out,s){out.x=this.x*s;out.y=this.y*s;out.width=this.width*s;out.height=this.height*s;return out;},translate(v){const rect=new Rect();this.translateFast(rect,v);return rect;},translateFast(out,v){out.x=this.x+v[0];out.y=this.x+v[1];out.width=this.width;out.height=this.height;return out;},asUVRectInside(containingRect){const rect=new Rect();rect.x=(this.x-containingRect.x)/containingRect.width;rect.y=(this.y-containingRect.y)/containingRect.height;rect.width=this.width/containingRect.width;rect.height=this.height/containingRect.height;return rect;},intersects(that){let ok=true;ok&=this.x<that.right;ok&=this.right>that.x;ok&=this.y<that.bottom;ok&=this.bottom>that.y;return ok;},equalTo(rect){return rect&&(this.x===rect.x)&&(this.y===rect.y)&&(this.width===rect.width)&&(this.height===rect.height);}};return{Rect,};});'use strict';tr.exportTo('tr.ui.b',function(){function instantiateTemplate(selector,doc){doc=doc||document;const el=Polymer.dom(doc).querySelector(selector);if(!el){throw new Error('Element not found: '+selector);}
-return doc.importNode(el.content,true);}
-function windowRectForElement(element){const position=[element.offsetLeft,element.offsetTop];const size=[element.offsetWidth,element.offsetHeight];let node=element.offsetParent;while(node){position[0]+=node.offsetLeft;position[1]+=node.offsetTop;node=node.offsetParent;}
-return tr.b.math.Rect.fromXYWH(position[0],position[1],size[0],size[1]);}
-function scrollIntoViewIfNeeded(el){const pr=el.parentElement.getBoundingClientRect();const cr=el.getBoundingClientRect();if(cr.top<pr.top){el.scrollIntoView(true);}else if(cr.bottom>pr.bottom){el.scrollIntoView(false);}}
-function extractUrlString(url){let extracted=url.replace(/url\((.*)\)/,'$1');extracted=extracted.replace(/\"(.*)\"/,'$1');return extracted;}
-function toThreeDigitLocaleString(value){return value.toLocaleString(undefined,{minimumFractionDigits:3,maximumFractionDigits:3});}
-return{toThreeDigitLocaleString,instantiateTemplate,windowRectForElement,scrollIntoViewIfNeeded,extractUrlString,};});'use strict';tr.exportTo('tr.ui.b',function(){if(tr.isHeadless)return{};const THIS_DOC=document._currentScript.ownerDocument;const Overlay=tr.ui.b.define('overlay');Overlay.prototype={__proto__:HTMLDivElement.prototype,decorate(){Polymer.dom(this).classList.add('overlay');this.parentEl_=this.ownerDocument.body;this.visible_=false;this.userCanClose_=true;this.onKeyDown_=this.onKeyDown_.bind(this);this.onClick_=this.onClick_.bind(this);this.onFocusIn_=this.onFocusIn_.bind(this);this.onDocumentClick_=this.onDocumentClick_.bind(this);this.onClose_=this.onClose_.bind(this);this.addEventListener('visible-change',tr.ui.b.Overlay.prototype.onVisibleChange_.bind(this),true);const createShadowRoot=this.createShadowRoot||this.webkitCreateShadowRoot;this.shadow_=createShadowRoot.call(this);Polymer.dom(this.shadow_).appendChild(tr.ui.b.instantiateTemplate('#overlay-template',THIS_DOC));this.closeBtn_=Polymer.dom(this.shadow_).querySelector('close-button');this.closeBtn_.addEventListener('click',this.onClose_);Polymer.dom(this.shadow_).querySelector('overlay-frame').addEventListener('click',this.onClick_);this.observer_=new MutationObserver(this.didButtonBarMutate_.bind(this));this.observer_.observe(Polymer.dom(this.shadow_).querySelector('button-bar'),{childList:true});Object.defineProperty(this,'title',{get(){return Polymer.dom(Polymer.dom(this.shadow_).querySelector('title')).textContent;},set(title){Polymer.dom(Polymer.dom(this.shadow_).querySelector('title')).textContent=title;}});},set userCanClose(userCanClose){this.userCanClose_=userCanClose;this.closeBtn_.style.display=userCanClose?'block':'none';},get buttons(){return Polymer.dom(this.shadow_).querySelector('button-bar');},get visible(){return this.visible_;},set visible(newValue){if(this.visible_===newValue)return;this.visible_=newValue;const e=new tr.b.Event('visible-change');this.dispatchEvent(e);},onVisibleChange_(){this.visible_?this.show_():this.hide_();},show_(){Polymer.dom(this.parentEl_).appendChild(this);if(this.userCanClose_){this.addEventListener('keydown',this.onKeyDown_.bind(this));this.addEventListener('click',this.onDocumentClick_.bind(this));this.closeBtn_.addEventListener('click',this.onClose_);}
-this.parentEl_.addEventListener('focusin',this.onFocusIn_);this.tabIndex=0;const elList=Polymer.dom(this).querySelectorAll('button, input, list, select, a');if(elList.length>0){if(elList[0]===this.closeBtn_){if(elList.length>1)return elList[1].focus();}else{return elList[0].focus();}}
-this.focus();},hide_(){Polymer.dom(this.parentEl_).removeChild(this);this.parentEl_.removeEventListener('focusin',this.onFocusIn_);if(this.closeBtn_){this.closeBtn_.removeEventListener('click',this.onClose_);}
-document.removeEventListener('keydown',this.onKeyDown_);document.removeEventListener('click',this.onDocumentClick_);},onClose_(e){this.visible=false;if((e.type!=='keydown')||(e.type==='keydown'&&e.keyCode===27)){e.stopPropagation();}
-e.preventDefault();tr.b.dispatchSimpleEvent(this,'closeclick');},onFocusIn_(e){let node=e.target;while(node){if(node===this){return;}
-node=node.parentNode;}
-tr.b.timeout(0).then(()=>this.focus());e.preventDefault();e.stopPropagation();},didButtonBarMutate_(e){const hasButtons=this.buttons.children.length>0;if(hasButtons){Polymer.dom(this.shadow_).querySelector('button-bar').style.display=undefined;}else{Polymer.dom(this.shadow_).querySelector('button-bar').style.display='none';}},onKeyDown_(e){if(e.keyCode===9&&e.shiftKey&&e.target===this){e.preventDefault();return;}
-if(e.keyCode!==27)return;this.onClose_(e);},onClick_(e){e.stopPropagation();},onDocumentClick_(e){if(!this.userCanClose_)return;this.onClose_(e);}};Overlay.showError=function(msg,opt_err){const o=new Overlay();o.title='Error';Polymer.dom(o).textContent=msg;if(opt_err){const e=tr.b.normalizeException(opt_err);const stackDiv=document.createElement('pre');Polymer.dom(stackDiv).textContent=e.stack;stackDiv.style.paddingLeft='8px';stackDiv.style.margin=0;Polymer.dom(o).appendChild(stackDiv);}
-const b=document.createElement('button');Polymer.dom(b).textContent='OK';b.addEventListener('click',function(){o.visible=false;});Polymer.dom(o.buttons).appendChild(b);o.visible=true;return o;};return{Overlay,};});'use strict';tr.exportTo('tr.importer',function(){const Timing=tr.b.Timing;function ImportOptions(){this.shiftWorldToZero=true;this.pruneEmptyContainers=true;this.showImportWarnings=true;this.trackDetailedModelStats=false;this.customizeModelCallback=undefined;const auditorTypes=tr.c.Auditor.getAllRegisteredTypeInfos();this.auditorConstructors=auditorTypes.map(function(typeInfo){return typeInfo.constructor;});}
-function Import(model,opt_options){if(model===undefined){throw new Error('Must provide model to import into.');}
-this.importing_=false;this.importOptions_=opt_options||new ImportOptions();this.model_=model;this.model_.importOptions=this.importOptions_;}
-Import.prototype={__proto__:Object.prototype,importTraces(traces){const progressMeter={update(msg){}};tr.b.Task.RunSynchronously(this.createImportTracesTask(progressMeter,traces));},importTracesWithProgressDialog(traces){if(tr.isHeadless){throw new Error('Cannot use this method in headless mode.');}
-const overlay=tr.ui.b.Overlay();overlay.title='Importing...';overlay.userCanClose=false;overlay.msgEl=document.createElement('div');Polymer.dom(overlay).appendChild(overlay.msgEl);overlay.msgEl.style.margin='20px';overlay.update=function(msg){Polymer.dom(this.msgEl).textContent=msg;};overlay.visible=true;const promise=tr.b.Task.RunWhenIdle(this.createImportTracesTask(overlay,traces));promise.then(function(){overlay.visible=false;},function(err){overlay.visible=false;});return promise;},createImportTracesTask(progressMeter,traces){const importStartTimeMs=tr.b.Timing.getCurrentTimeMs();if(this.importing_){throw new Error('Already importing.');}
-this.importing_=true;const importTask=new tr.b.Task(function prepareImport(){progressMeter.update('I will now import your traces for you...');},this);let lastTask=importTask;const importers=[];function addImportStage(title,callback){lastTask=lastTask.after(()=>progressMeter.update(title));lastTask.updatesUi=true;lastTask=lastTask.after(callback);}
-function addStageForEachImporter(title,callback){lastTask=lastTask.after((task)=>{importers.forEach((importer,index)=>{const uiSubTask=task.subTask(()=>{progressMeter.update(`${title} ${index + 1} of ${importers.length}`);});uiSubTask.updatesUi=true;task.subTask(()=>callback(importer));});});}
-addImportStage('Creating importers...',()=>{traces=traces.slice(0);progressMeter.update('Creating importers...');for(let i=0;i<traces.length;++i){importers.push(this.createImporter_(traces[i]));}
-for(let i=0;i<importers.length;i++){const subtraces=importers[i].extractSubtraces();for(let j=0;j<subtraces.length;j++){try{traces.push(subtraces[j]);importers.push(this.createImporter_(subtraces[j]));}catch(error){this.model_.importWarning({type:error.name,message:error.message,showToUser:true,});continue;}}}
-if(traces.length&&!this.hasEventDataDecoder_(importers)){throw new Error('Could not find an importer for the provided eventData.');}
-importers.sort(function(x,y){return x.importPriority-y.importPriority;});});addStageForEachImporter('Importing clock sync markers',importer=>importer.importClockSyncMarkers());addStageForEachImporter('Importing',importer=>importer.importEvents());if(this.importOptions_.customizeModelCallback){addImportStage('Customizing',()=>{this.importOptions_.customizeModelCallback(this.model_);});}
-addStageForEachImporter('Importing sample data',importer=>importer.importSampleData());addImportStage('Autoclosing open slices...',()=>{this.model_.autoCloseOpenSlices();this.model_.createSubSlices();});addStageForEachImporter('Finalizing import',importer=>importer.finalizeImport());addImportStage('Initializing objects (step 1/2)...',()=>this.model_.preInitializeObjects());if(this.importOptions_.pruneEmptyContainers){addImportStage('Pruning empty containers...',()=>this.model_.pruneEmptyContainers());}
-addImportStage('Merging kernel with userland...',()=>this.model_.mergeKernelWithUserland());let auditors=[];addImportStage('Adding arbitrary data to model...',()=>{for(const auditorConstructor of
-this.importOptions_.auditorConstructors){try{auditors.push(new auditorConstructor(this.model_));}catch(e){console.error('Failed to construct an auditor:');console.error(e);}}
-auditors.forEach((auditor)=>{try{auditor.runAnnotate();auditor.installUserFriendlyCategoryDriverIfNeeded();}catch(e){console.error('Failed to run an auditor:');console.error(e);}});});addImportStage('Computing final world bounds...',()=>{this.model_.computeWorldBounds(this.importOptions_.shiftWorldToZero);});addImportStage('Building flow event map...',()=>this.model_.buildFlowEventIntervalTree());addImportStage('Joining object refs...',()=>this.model_.joinRefs());addImportStage('Cleaning up undeleted objects...',()=>this.model_.cleanupUndeletedObjects());addImportStage('Sorting memory dumps...',()=>this.model_.sortMemoryDumps());addImportStage('Finalizing memory dump graphs...',()=>this.model_.finalizeMemoryGraphs());addImportStage('Initializing objects (step 2/2)...',()=>this.model_.initializeObjects());addImportStage('Building event indices...',()=>this.model_.buildEventIndices());addImportStage('Building UserModel...',()=>{try{const userModelBuilder=new tr.importer.UserModelBuilder(this.model_);userModelBuilder.buildUserModel();}catch(e){console.error('Failed to build user model');console.error(e);}});addImportStage('Sorting user expectations...',()=>this.model_.userModel.sortExpectations());addImportStage('Running auditors...',()=>{auditors.forEach(auditor=>auditor.runAudit());});addImportStage('Updating alerts...',()=>this.model_.sortAlerts());addImportStage('Update bounds...',()=>this.model_.updateBounds());addImportStage('Looking for warnings...',()=>{if(!this.model_.isTimeHighResolution){this.model_.importWarning({type:'low_resolution_timer',message:'Trace time is low resolution, trace may be unusable.',showToUser:true});}});lastTask.after(()=>{this.importing_=false;this.model_.stats.traceImportDurationMs=tr.b.Timing.getCurrentTimeMs()-importStartTimeMs;});return importTask;},createImporter_(eventData){const importerConstructor=tr.importer.Importer.findImporterFor(eventData);if(!importerConstructor){throw new Error('Couldn\'t create an importer for the provided '+'eventData.');}
-return new importerConstructor(this.model_,eventData);},hasEventDataDecoder_(importers){for(let i=0;i<importers.length;++i){if(!importers[i].isTraceDataContainer())return true;}
-return false;}};return{ImportOptions,Import,};});'use strict';tr.exportTo('tr.e.v8',function(){const ThreadSlice=tr.model.ThreadSlice;function V8GCStatsThreadSlice(){ThreadSlice.apply(this,arguments);this.liveObjects_=JSON.parse(this.args.live);delete this.args.live;this.deadObjects_=JSON.parse(this.args.dead);delete this.args.dead;}
-V8GCStatsThreadSlice.prototype={__proto__:ThreadSlice.prototype,get liveObjects(){return this.liveObjects_;},get deadObjects(){return this.deadObjects_;}};ThreadSlice.subTypes.register(V8GCStatsThreadSlice,{categoryParts:['disabled-by-default-v8.gc_stats'],name:'v8 gc stats slice',pluralName:'v8 gc stats slices'});return{V8GCStatsThreadSlice,};});'use strict';tr.exportTo('tr.e.v8',function(){const ThreadSlice=tr.model.ThreadSlice;function V8ICStatsThreadSlice(){ThreadSlice.apply(this,arguments);this.icStats_=undefined;if(this.args['ic-stats']){this.icStats_=this.args['ic-stats'].data;delete this.args['ic-stats'];}}
-V8ICStatsThreadSlice.prototype={__proto__:ThreadSlice.prototype,get icStats(){return this.icStats_;}};ThreadSlice.subTypes.register(V8ICStatsThreadSlice,{categoryParts:['disabled-by-default-v8.ic_stats'],name:'v8 ic stats slice',pluralName:'v8 ic stats slices'});return{V8ICStatsThreadSlice,};});'use strict';tr.exportTo('tr.e.v8',function(){const ThreadSlice=tr.model.ThreadSlice;function V8ThreadSlice(){ThreadSlice.apply(this,arguments);this.runtimeCallStats_=undefined;}
-V8ThreadSlice.prototype={__proto__:ThreadSlice.prototype,get runtimeCallStats(){if('runtime-call-stats'in this.args){this.runtimeCallStats_=this.args['runtime-call-stats'];delete this.args['runtime-call-stats'];}
-return this.runtimeCallStats_;}};ThreadSlice.subTypes.register(V8ThreadSlice,{categoryParts:['v8','disabled-by-default-v8.runtime_stats'],name:'v8 slice',pluralName:'v8 slices'});return{V8ThreadSlice,};});'use strict';tr.exportTo('tr.e.cc',function(){function PictureAsImageData(picture,errorOrImageData){this.picture_=picture;if(errorOrImageData instanceof ImageData){this.error_=undefined;this.imageData_=errorOrImageData;}else{this.error_=errorOrImageData;this.imageData_=undefined;}}
-PictureAsImageData.Pending=function(picture){return new PictureAsImageData(picture,undefined);};PictureAsImageData.prototype={get picture(){return this.picture_;},get error(){return this.error_;},get imageData(){return this.imageData_;},isPending(){return this.error_===undefined&&this.imageData_===undefined;},asCanvas(){if(!this.imageData_)return;const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=this.imageData_.width;canvas.height=this.imageData_.height;ctx.putImageData(this.imageData_,0,0);return canvas;}};return{PictureAsImageData,};});'use strict';tr.exportTo('tr.e.cc',function(){const convertedNameCache={};function convertNameToJSConvention(name){if(name in convertedNameCache){return convertedNameCache[name];}
-if(name[0]==='_'||name[name.length-1]==='_'){convertedNameCache[name]=name;return name;}
-const words=name.split('_');if(words.length===1){convertedNameCache[name]=words[0];return words[0];}
-for(let i=1;i<words.length;i++){words[i]=words[i][0].toUpperCase()+words[i].substring(1);}
-convertedNameCache[name]=words.join('');return convertedNameCache[name];}
-function moveRequiredFieldsFromArgsToToplevel(object,fields){for(let i=0;i<fields.length;i++){const key=fields[i];if(object.args[key]===undefined){throw Error('Expected field '+key+' not found in args');}
-if(object[key]!==undefined){throw Error('Field '+key+' already in object');}
-object[key]=object.args[key];delete object.args[key];}}
-function moveOptionalFieldsFromArgsToToplevel(object,fields){for(let i=0;i<fields.length;i++){const key=fields[i];if(object.args[key]===undefined)continue;if(object[key]!==undefined){throw Error('Field '+key+' already in object');}
-object[key]=object.args[key];delete object.args[key];}}
-function preInitializeObject(object){preInitializeObjectInner(object.args,false);}
-function preInitializeObjectInner(object,hasRecursed){if(!(object instanceof Object))return;if(object instanceof Array){for(let i=0;i<object.length;i++){preInitializeObjectInner(object[i],true);}
-return;}
-if(hasRecursed&&(object instanceof tr.model.ObjectSnapshot||object instanceof tr.model.ObjectInstance)){return;}
-for(let key in object){const newKey=convertNameToJSConvention(key);if(newKey!==key){const value=object[key];delete object[key];object[newKey]=value;key=newKey;}
-if(/Quad$/.test(key)&&!(object[key]instanceof tr.b.math.Quad)){let q;try{q=tr.b.math.Quad.from8Array(object[key]);}catch(e){}
-object[key]=q;continue;}
-if(/Rect$/.test(key)&&!(object[key]instanceof tr.b.math.Rect)){let r;try{r=tr.b.math.Rect.fromArray(object[key]);}catch(e){}
-object[key]=r;}
-preInitializeObjectInner(object[key],true);}}
-return{preInitializeObject,convertNameToJSConvention,moveRequiredFieldsFromArgsToToplevel,moveOptionalFieldsFromArgsToToplevel,};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;const PictureCount=0;const OPS_TIMING_ITERATIONS=3;function Picture(skp64,layerRect){this.skp64_=skp64;this.layerRect_=layerRect;this.guid_=tr.b.GUID.allocateSimple();}
-Picture.prototype={get canSave(){return true;},get layerRect(){return this.layerRect_;},get guid(){return this.guid_;},getBase64SkpData(){return this.skp64_;},getOps(){if(!PictureSnapshot.CanGetOps()){console.error(PictureSnapshot.HowToEnablePictureDebugging());return undefined;}
-const ops=window.chrome.skiaBenchmarking.getOps({skp64:this.skp64_,params:{layer_rect:this.layerRect_.toArray()}});if(!ops){console.error('Failed to get picture ops.');}
-return ops;},getOpTimings(){if(!PictureSnapshot.CanGetOpTimings()){console.error(PictureSnapshot.HowToEnablePictureDebugging());return undefined;}
-const opTimings=window.chrome.skiaBenchmarking.getOpTimings({skp64:this.skp64_,params:{layer_rect:this.layerRect_.toArray()}});if(!opTimings){console.error('Failed to get picture op timings.');}
-return opTimings;},tagOpsWithTimings(ops){const opTimings=[];for(let iteration=0;iteration<OPS_TIMING_ITERATIONS;iteration++){opTimings[iteration]=this.getOpTimings();if(!opTimings[iteration]||!opTimings[iteration].cmd_times){return ops;}
-if(opTimings[iteration].cmd_times.length!==ops.length){return ops;}}
-for(let opIndex=0;opIndex<ops.length;opIndex++){let min=Number.MAX_VALUE;for(let i=0;i<OPS_TIMING_ITERATIONS;i++){min=Math.min(min,opTimings[i].cmd_times[opIndex]);}
-ops[opIndex].cmd_time=min;}
-return ops;},rasterize(params,rasterCompleteCallback){if(!PictureSnapshot.CanRasterize()||!PictureSnapshot.CanGetOps()){rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,tr.e.cc.PictureSnapshot.HowToEnablePictureDebugging()));return;}
-if(!this.layerRect_.width||!this.layerRect_.height){rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,null));return;}
-const raster=window.chrome.skiaBenchmarking.rasterize({skp64:this.skp64_,params:{layer_rect:this.layerRect_.toArray()}},{stop:params.stopIndex===undefined?-1:params.stopIndex,overdraw:!!params.showOverdraw,params:{}});if(raster){const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=raster.width;canvas.height=raster.height;const imageData=ctx.createImageData(raster.width,raster.height);imageData.data.set(new Uint8ClampedArray(raster.data));rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,imageData));}else{const error='Failed to rasterize picture. '+'Your recording may be from an old Chrome version. '+'The SkPicture format is not backward compatible.';rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,error));}}};function LayeredPicture(pictures){this.guid_=tr.b.GUID.allocateSimple();this.pictures_=pictures;this.layerRect_=undefined;}
-LayeredPicture.prototype={__proto__:Picture.prototype,get canSave(){return false;},get typeName(){return'cc::LayeredPicture';},get layerRect(){if(this.layerRect_!==undefined){return this.layerRect_;}
-this.layerRect_={x:0,y:0,width:0,height:0};for(let i=0;i<this.pictures_.length;++i){const rect=this.pictures_[i].layerRect;this.layerRect_.x=Math.min(this.layerRect_.x,rect.x);this.layerRect_.y=Math.min(this.layerRect_.y,rect.y);this.layerRect_.width=Math.max(this.layerRect_.width,rect.x+rect.width);this.layerRect_.height=Math.max(this.layerRect_.height,rect.y+rect.height);}
-return this.layerRect_;},get guid(){return this.guid_;},getBase64SkpData(){throw new Error('Not available with a LayeredPicture.');},getOps(){let ops=[];for(let i=0;i<this.pictures_.length;++i){ops=ops.concat(this.pictures_[i].getOps());}
-return ops;},getOpTimings(){const opTimings=this.pictures_[0].getOpTimings();for(let i=1;i<this.pictures_.length;++i){const timings=this.pictures_[i].getOpTimings();opTimings.cmd_times=opTimings.cmd_times.concat(timings.cmd_times);opTimings.total_time+=timings.total_time;}
-return opTimings;},tagOpsWithTimings(ops){const opTimings=[];for(let iteration=0;iteration<OPS_TIMING_ITERATIONS;iteration++){opTimings[iteration]=this.getOpTimings();if(!opTimings[iteration]||!opTimings[iteration].cmd_times){return ops;}}
-for(let opIndex=0;opIndex<ops.length;opIndex++){let min=Number.MAX_VALUE;for(let i=0;i<OPS_TIMING_ITERATIONS;i++){min=Math.min(min,opTimings[i].cmd_times[opIndex]);}
-ops[opIndex].cmd_time=min;}
-return ops;},rasterize(params,rasterCompleteCallback){this.picturesAsImageData_=[];const rasterCallback=function(pictureAsImageData){this.picturesAsImageData_.push(pictureAsImageData);if(this.picturesAsImageData_.length!==this.pictures_.length){return;}
-const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=this.layerRect.width;canvas.height=this.layerRect.height;for(let i=0;i<this.picturesAsImageData_.length;++i){ctx.putImageData(this.picturesAsImageData_[i].imageData,this.pictures_[i].layerRect.x,this.pictures_[i].layerRect.y);}
-this.picturesAsImageData_=[];rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,ctx.getImageData(this.layerRect.x,this.layerRect.y,this.layerRect.width,this.layerRect.height)));}.bind(this);for(let i=0;i<this.pictures_.length;++i){this.pictures_[i].rasterize(params,rasterCallback);}}};function PictureSnapshot(){ObjectSnapshot.apply(this,arguments);}
-PictureSnapshot.HasSkiaBenchmarking=function(){return tr.isExported('chrome.skiaBenchmarking');};PictureSnapshot.CanRasterize=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
-if(!window.chrome.skiaBenchmarking.rasterize){return false;}
-return true;};PictureSnapshot.CanGetOps=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
-if(!window.chrome.skiaBenchmarking.getOps){return false;}
-return true;};PictureSnapshot.CanGetOpTimings=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
-if(!window.chrome.skiaBenchmarking.getOpTimings){return false;}
-return true;};PictureSnapshot.CanGetInfo=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
-if(!window.chrome.skiaBenchmarking.getInfo){return false;}
-return true;};PictureSnapshot.HowToEnablePictureDebugging=function(){if(tr.isHeadless){return'Pictures only work in chrome';}
-const usualReason=['For pictures to show up, the Chrome browser displaying the trace ','needs to be running with --enable-skia-benchmarking. Please restart ','chrome with this flag and try loading the trace again.'].join('');if(!PictureSnapshot.HasSkiaBenchmarking()){return usualReason;}
-if(!PictureSnapshot.CanRasterize()){return'Your chrome is old: chrome.skipBenchmarking.rasterize not found';}
-if(!PictureSnapshot.CanGetOps()){return'Your chrome is old: chrome.skiaBenchmarking.getOps not found';}
-if(!PictureSnapshot.CanGetOpTimings()){return'Your chrome is old: '+'chrome.skiaBenchmarking.getOpTimings not found';}
-if(!PictureSnapshot.CanGetInfo()){return'Your chrome is old: chrome.skiaBenchmarking.getInfo not found';}
-return undefined;};PictureSnapshot.CanDebugPicture=function(){return PictureSnapshot.HowToEnablePictureDebugging()===undefined;};PictureSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);this.rasterResult_=undefined;},initialize(){if(this.args.alias){this.args=this.args.alias.args;}
-if(!this.args.params.layerRect){throw new Error('Missing layer rect');}
-this.layerRect_=this.args.params.layerRect;this.picture_=new Picture(this.args.skp64,this.args.params.layerRect);},set picture(picture){this.picture_=picture;},get canSave(){return this.picture_.canSave;},get layerRect(){return this.layerRect_?this.layerRect_:this.picture_.layerRect;},get guid(){return this.picture_.guid;},getBase64SkpData(){return this.picture_.getBase64SkpData();},getOps(){return this.picture_.getOps();},getOpTimings(){return this.picture_.getOpTimings();},tagOpsWithTimings(ops){return this.picture_.tagOpsWithTimings(ops);},rasterize(params,rasterCompleteCallback){this.picture_.rasterize(params,rasterCompleteCallback);}};ObjectSnapshot.subTypes.register(PictureSnapshot,{typeNames:['cc::Picture']});return{PictureSnapshot,Picture,LayeredPicture,};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function DisplayItemList(skp64,layerRect){tr.e.cc.Picture.apply(this,arguments);}
-DisplayItemList.prototype={__proto__:tr.e.cc.Picture.prototype};function DisplayItemListSnapshot(){tr.e.cc.PictureSnapshot.apply(this,arguments);}
-DisplayItemListSnapshot.prototype={__proto__:tr.e.cc.PictureSnapshot.prototype,initialize(){tr.e.cc.PictureSnapshot.prototype.initialize.call(this);this.displayItems_=this.args.params.items;},get items(){return this.displayItems_;}};ObjectSnapshot.subTypes.register(DisplayItemListSnapshot,{typeNames:['cc::DisplayItemList']});return{DisplayItemListSnapshot,DisplayItemList,};});'use strict';tr.exportTo('tr.b.math',function(){function BBox2(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;}
-BBox2.prototype={__proto__:Object.prototype,reset(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;},get isEmpty(){return this.isEmpty_;},addBBox2(bbox2){if(bbox2.isEmpty)return;this.addVec2(bbox2.min_);this.addVec2(bbox2.max_);},clone(){const bbox=new BBox2();bbox.addBBox2(this);return bbox;},addXY(x,y){if(this.isEmpty_){this.max_=vec2.create();this.min_=vec2.create();vec2.set(this.max_,x,y);vec2.set(this.min_,x,y);this.isEmpty_=false;return;}
-this.max_[0]=Math.max(this.max_[0],x);this.max_[1]=Math.max(this.max_[1],y);this.min_[0]=Math.min(this.min_[0],x);this.min_[1]=Math.min(this.min_[1],y);},addVec2(value){if(this.isEmpty_){this.max_=vec2.create();this.min_=vec2.create();vec2.set(this.max_,value[0],value[1]);vec2.set(this.min_,value[0],value[1]);this.isEmpty_=false;return;}
-this.max_[0]=Math.max(this.max_[0],value[0]);this.max_[1]=Math.max(this.max_[1],value[1]);this.min_[0]=Math.min(this.min_[0],value[0]);this.min_[1]=Math.min(this.min_[1],value[1]);},addQuad(quad){this.addVec2(quad.p1);this.addVec2(quad.p2);this.addVec2(quad.p3);this.addVec2(quad.p4);},get minVec2(){if(this.isEmpty_)return undefined;return this.min_;},get maxVec2(){if(this.isEmpty_)return undefined;return this.max_;},get sizeAsVec2(){if(this.isEmpty_){throw new Error('Empty BBox2 has no size');}
-const size=vec2.create();vec2.subtract(size,this.max_,this.min_);return size;},get size(){if(this.isEmpty_){throw new Error('Empty BBox2 has no size');}
-return{width:this.max_[0]-this.min_[0],height:this.max_[1]-this.min_[1]};},get width(){if(this.isEmpty_){throw new Error('Empty BBox2 has no width');}
-return this.max_[0]-this.min_[0];},get height(){if(this.isEmpty_){throw new Error('Empty BBox2 has no width');}
-return this.max_[1]-this.min_[1];},toString(){if(this.isEmpty_)return'empty';return'min=('+this.min_[0]+','+this.min_[1]+') '+'max=('+this.max_[0]+','+this.max_[1]+')';},asRect(){return tr.b.math.Rect.fromXYWH(this.min_[0],this.min_[1],this.max_[0]-this.min_[0],this.max_[1]-this.min_[1]);}};return{BBox2,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants={};constants.ACTIVE_TREE=0;constants.PENDING_TREE=1;constants.HIGH_PRIORITY_BIN=0;constants.LOW_PRIORITY_BIN=1;constants.SEND_BEGIN_FRAME_EVENT='ThreadProxy::ScheduledActionSendBeginMainFrame';constants.BEGIN_MAIN_FRAME_EVENT='ThreadProxy::BeginMainFrame';return{constants};});'use strict';tr.exportTo('tr.e.cc',function(){function Region(){this.rects=[];}
-Region.fromArray=function(array){if(array.length%4!==0){throw new Error('Array must consist be a multiple of 4 in length');}
-const r=new Region();for(let i=0;i<array.length;i+=4){r.rects.push(tr.b.math.Rect.fromXYWH(array[i],array[i+1],array[i+2],array[i+3]));}
-return r;};Region.fromArrayOrUndefined=function(array){if(array===undefined)return new Region();return Region.fromArray(array);};Region.prototype={__proto__:Region.prototype,rectIntersects(r){for(let i=0;i<this.rects.length;i++){if(this.rects[i].intersects(r))return true;}
-return false;},addRect(r){this.rects.push(r);}};return{Region,};});'use strict';tr.exportTo('tr.e.cc',function(){function TileCoverageRect(rect,tile){this.geometryRect=rect;this.tile=tile;}
-return{TileCoverageRect,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants=tr.e.cc.constants;const ObjectSnapshot=tr.model.ObjectSnapshot;function LayerImplSnapshot(){ObjectSnapshot.apply(this,arguments);}
-LayerImplSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);this.layerTreeImpl_=undefined;this.parentLayer=undefined;},initialize(){this.invalidation=new tr.e.cc.Region();this.unrecordedRegion=new tr.e.cc.Region();this.pictures=[];tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['layerId','layerQuad']);tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['children','maskLayer','replicaLayer','idealContentsScale','geometryContentsScale','layoutRects','usingGpuRasterization']);this.gpuMemoryUsageInBytes=this.args.gpuMemoryUsage;this.bounds=tr.b.math.Rect.fromXYWH(0,0,this.args.bounds.width,this.args.bounds.height);if(this.args.animationBounds){this.animationBoundsRect=tr.b.math.Rect.fromXYWH(this.args.animationBounds[0],this.args.animationBounds[1],this.args.animationBounds[3],this.args.animationBounds[4]);}
-if(this.children){for(let i=0;i<this.children.length;i++){this.children[i].parentLayer=this;}}
-if(this.maskLayer){this.maskLayer.parentLayer=this;}
-if(this.replicaLayer){this.replicaLayer.parentLayer=this;}
-if(!this.geometryContentsScale){this.geometryContentsScale=1.0;}
-if(!this.idealContentsScale){this.idealContentsScale=1.0;}
-this.touchEventHandlerRegion=tr.e.cc.Region.fromArrayOrUndefined(this.args.touchEventHandlerRegion);this.wheelEventHandlerRegion=tr.e.cc.Region.fromArrayOrUndefined(this.args.wheelEventHandlerRegion);this.nonFastScrollableRegion=tr.e.cc.Region.fromArrayOrUndefined(this.args.nonFastScrollableRegion);},get layerTreeImpl(){if(this.layerTreeImpl_){return this.layerTreeImpl_;}
-if(this.parentLayer){return this.parentLayer.layerTreeImpl;}
-return undefined;},set layerTreeImpl(layerTreeImpl){this.layerTreeImpl_=layerTreeImpl;},get activeLayer(){if(this.layerTreeImpl.whichTree===constants.ACTIVE_TREE){return this;}
-const activeTree=this.layerTreeImpl.layerTreeHostImpl.activeTree;return activeTree.findLayerWithId(this.layerId);},get pendingLayer(){if(this.layerTreeImpl.whichTree===constants.PENDING_TREE){return this;}
-const pendingTree=this.layerTreeImpl.layerTreeHostImpl.pendingTree;return pendingTree.findLayerWithId(this.layerId);}};function PictureLayerImplSnapshot(){LayerImplSnapshot.apply(this,arguments);}
-PictureLayerImplSnapshot.prototype={__proto__:LayerImplSnapshot.prototype,initialize(){LayerImplSnapshot.prototype.initialize.call(this);if(this.args.debugInfo){for(const i in this.args.debugInfo){this.args[i]=this.args.debugInfo[i];}
-delete this.args.debugInfo;}
-if(this.args.annotatedInvalidationRects){this.invalidation=new tr.e.cc.Region();for(const annotatedRect of this.args.annotatedInvalidationRects){const rect=annotatedRect.geometryRect;rect.reason=annotatedRect.reason;rect.client=annotatedRect.client;this.invalidation.addRect(rect);}
-delete this.args.annotatedInvalidationRects;}else if(this.args.invalidation){this.invalidation=tr.e.cc.Region.fromArray(this.args.invalidation);}
-delete this.args.invalidation;if(this.args.unrecordedRegion){this.unrecordedRegion=tr.e.cc.Region.fromArray(this.args.unrecordedRegion);delete this.args.unrecordedRegion;}
-if(this.args.pictures){this.pictures=this.args.pictures;this.pictures.sort(function(a,b){return a.ts-b.ts;});}
-this.tileCoverageRects=[];if(this.args.coverageTiles){for(let i=0;i<this.args.coverageTiles.length;++i){const rect=this.args.coverageTiles[i].geometryRect.scale(this.idealContentsScale);const tile=this.args.coverageTiles[i].tile;this.tileCoverageRects.push(new tr.e.cc.TileCoverageRect(rect,tile));}
-delete this.args.coverageTiles;}}};ObjectSnapshot.subTypes.register(PictureLayerImplSnapshot,{typeName:'cc::PictureLayerImpl'});ObjectSnapshot.subTypes.register(LayerImplSnapshot,{typeNames:['cc::LayerImpl','cc::DelegatedRendererLayerImpl','cc::HeadsUpDisplayLayerImpl','cc::IOSurfaceLayerImpl','cc::NinePatchLayerImpl','cc::PictureImageLayerImpl','cc::ScrollbarLayerImpl','cc::SolidColorLayerImpl','cc::SolidColorScrollbarLayerImpl','cc::SurfaceLayerImpl','cc::TextureLayerImpl','cc::TiledLayerImpl','cc::VideoLayerImpl','cc::PaintedScrollbarLayerImpl','ClankPatchLayer','TabBorderLayer','CounterLayer']});return{LayerImplSnapshot,PictureLayerImplSnapshot,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants=tr.e.cc.constants;const ObjectSnapshot=tr.model.ObjectSnapshot;function LayerTreeImplSnapshot(){ObjectSnapshot.apply(this,arguments);}
-LayerTreeImplSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);this.layerTreeHostImpl=undefined;this.whichTree=undefined;this.sourceFrameNumber=undefined;},initialize(){tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['renderSurfaceLayerList']);tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['rootLayer','layers']);if(this.args.sourceFrameNumber){this.sourceFrameNumber=this.args.sourceFrameNumber;}
-if(this.rootLayer){this.rootLayer.layerTreeImpl=this;}else{for(let i=0;i<this.layers.length;i++){this.layers[i].layerTreeImpl=this;}}
-if(this.args.swapPromiseTraceIds&&this.args.swapPromiseTraceIds.length){this.tracedInputLatencies=[];const ownProcess=this.objectInstance.parent;const modelHelper=ownProcess.model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper){this._initializeTracedInputLatencies(modelHelper);}}},_initializeTracedInputLatencies(modelHelper){const latencyEvents=modelHelper.browserHelper.getLatencyEventsInRange(modelHelper.model.bounds);latencyEvents.forEach(function(event){for(let i=0;i<this.args.swapPromiseTraceIds.length;i++){if(!event.args.data||!event.args.data.trace_id){continue;}
-if(parseInt(event.args.data.trace_id)===this.args.swapPromiseTraceIds[i]){this.tracedInputLatencies.push(event);}}},this);},get hasSourceFrameBeenDrawnBefore(){if(this.whichTree===tr.e.cc.constants.PENDING_TREE){return false;}
-if(this.sourceFrameNumber===undefined)return;const thisLTHI=this.layerTreeHostImpl;const thisLTHIIndex=thisLTHI.objectInstance.snapshots.indexOf(thisLTHI);const prevLTHIIndex=thisLTHIIndex-1;if(prevLTHIIndex<0||prevLTHIIndex>=thisLTHI.objectInstance.snapshots.length){return false;}
-const prevLTHI=thisLTHI.objectInstance.snapshots[prevLTHIIndex];if(!prevLTHI.activeTree)return false;if(prevLTHI.activeTree.sourceFrameNumber===undefined)return;return prevLTHI.activeTree.sourceFrameNumber===this.sourceFrameNumber;},get otherTree(){const other=this.whichTree===constants.ACTIVE_TREE?constants.PENDING_TREE:constants.ACTIVE_TREE;return this.layerTreeHostImpl.getTree(other);},get gpuMemoryUsageInBytes(){let totalBytes=0;this.iterLayers(function(layer){if(layer.gpuMemoryUsageInBytes!==undefined){totalBytes+=layer.gpuMemoryUsageInBytes;}});return totalBytes;},iterLayers(func,thisArg){const visitedLayers={};function visitLayer(layer,depth,isMask,isReplica){if(visitedLayers[layer.layerId])return;visitedLayers[layer.layerId]=true;func.call(thisArg,layer,depth,isMask,isReplica);if(layer.children){for(let i=0;i<layer.children.length;i++){visitLayer(layer.children[i],depth+1);}}
-if(layer.maskLayer){visitLayer(layer.maskLayer,depth+1,true,false);}
-if(layer.replicaLayer){visitLayer(layer.replicaLayer,depth+1,false,true);}}
-if(this.rootLayer){visitLayer(this.rootLayer,0,false,false);}else{for(let i=0;i<this.layers.length;i++){visitLayer(this.layers[i],0,false,false);}}},findLayerWithId(id){let foundLayer=undefined;function visitLayer(layer){if(layer.layerId===id){foundLayer=layer;}}
-this.iterLayers(visitLayer);return foundLayer;}};ObjectSnapshot.subTypes.register(LayerTreeImplSnapshot,{typeName:'cc::LayerTreeImpl'});return{LayerTreeImplSnapshot,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants=tr.e.cc.constants;const ObjectSnapshot=tr.model.ObjectSnapshot;const ObjectInstance=tr.model.ObjectInstance;function LayerTreeHostImplSnapshot(){ObjectSnapshot.apply(this,arguments);}
-LayerTreeHostImplSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);},initialize(){tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['deviceViewportSize','activeTree']);tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['pendingTree']);if(this.args.activeTiles!==undefined){this.activeTiles=this.args.activeTiles;delete this.args.activeTiles;}else if(this.args.tiles!==undefined){this.activeTiles=this.args.tiles;delete this.args.tiles;}
-if(!this.activeTiles){this.activeTiles=[];}
-this.activeTree.layerTreeHostImpl=this;this.activeTree.whichTree=constants.ACTIVE_TREE;if(this.pendingTree){this.pendingTree.layerTreeHostImpl=this;this.pendingTree.whichTree=constants.PENDING_TREE;}},getContentsScaleNames(){const scales={};for(let i=0;i<this.activeTiles.length;++i){const tile=this.activeTiles[i];scales[tile.contentsScale]=tile.resolution;}
-return scales;},getTree(whichTree){if(whichTree===constants.ACTIVE_TREE){return this.activeTree;}
-if(whichTree===constants.PENDING_TREE){return this.pendingTree;}
-throw new Exception('Unknown tree type + '+whichTree);},get tilesHaveGpuMemoryUsageInfo(){if(this.tilesHaveGpuMemoryUsageInfo_!==undefined){return this.tilesHaveGpuMemoryUsageInfo_;}
-for(let i=0;i<this.activeTiles.length;i++){if(this.activeTiles[i].gpuMemoryUsageInBytes===undefined){continue;}
-this.tilesHaveGpuMemoryUsageInfo_=true;return true;}
-this.tilesHaveGpuMemoryUsageInfo_=false;return false;},get gpuMemoryUsageInBytes(){if(!this.tilesHaveGpuMemoryUsageInfo)return;let usage=0;for(let i=0;i<this.activeTiles.length;i++){const u=this.activeTiles[i].gpuMemoryUsageInBytes;if(u!==undefined)usage+=u;}
-return usage;},get userFriendlyName(){let frameNumber;if(!this.activeTree){frameNumber=this.objectInstance.snapshots.indexOf(this);}else{if(this.activeTree.sourceFrameNumber===undefined){frameNumber=this.objectInstance.snapshots.indexOf(this);}else{frameNumber=this.activeTree.sourceFrameNumber;}}
-return'cc::LayerTreeHostImpl frame '+frameNumber;}};ObjectSnapshot.subTypes.register(LayerTreeHostImplSnapshot,{typeName:'cc::LayerTreeHostImpl'});function LayerTreeHostImplInstance(){ObjectInstance.apply(this,arguments);this.allLayersBBox_=undefined;}
-LayerTreeHostImplInstance.prototype={__proto__:ObjectInstance.prototype,get allContentsScales(){if(this.allContentsScales_){return this.allContentsScales_;}
-const scales={};for(const tileID in this.allTileHistories_){const tileHistory=this.allTileHistories_[tileID];scales[tileHistory.contentsScale]=true;}
-this.allContentsScales_=Object.keys(scales);return this.allContentsScales_;},get allLayersBBox(){if(this.allLayersBBox_){return this.allLayersBBox_;}
-const bbox=new tr.b.math.BBox2();function handleTree(tree){tree.renderSurfaceLayerList.forEach(function(layer){bbox.addQuad(layer.layerQuad);});}
-this.snapshots.forEach(function(lthi){handleTree(lthi.activeTree);if(lthi.pendingTree){handleTree(lthi.pendingTree);}});this.allLayersBBox_=bbox;return this.allLayersBBox_;}};ObjectInstance.subTypes.register(LayerTreeHostImplInstance,{typeName:'cc::LayerTreeHostImpl'});return{LayerTreeHostImplSnapshot,LayerTreeHostImplInstance,};});'use strict';tr.exportTo('tr.e.cc',function(){const tileTypes={highRes:'highRes',lowRes:'lowRes',extraHighRes:'extraHighRes',extraLowRes:'extraLowRes',missing:'missing',culled:'culled',solidColor:'solidColor',picture:'picture',directPicture:'directPicture',unknown:'unknown'};const tileBorder={highRes:{color:'rgba(80, 200, 200, 0.7)',width:1},lowRes:{color:'rgba(212, 83, 192, 0.7)',width:2},extraHighRes:{color:'rgba(239, 231, 20, 0.7)',width:2},extraLowRes:{color:'rgba(93, 186, 18, 0.7)',width:2},missing:{color:'rgba(255, 0, 0, 0.7)',width:1},culled:{color:'rgba(160, 100, 0, 0.8)',width:1},solidColor:{color:'rgba(128, 128, 128, 0.7)',width:1},picture:{color:'rgba(64, 64, 64, 0.7)',width:1},directPicture:{color:'rgba(127, 255, 0, 1.0)',width:1},unknown:{color:'rgba(0, 0, 0, 1.0)',width:2}};return{tileTypes,tileBorder};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function TileSnapshot(){ObjectSnapshot.apply(this,arguments);}
-TileSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);},initialize(){tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['layerId','contentsScale','contentRect']);if(this.args.managedState){this.resolution=this.args.managedState.resolution;this.isSolidColor=this.args.managedState.isSolidColor;this.isUsingGpuMemory=this.args.managedState.isUsingGpuMemory;this.hasResource=this.args.managedState.hasResource;this.scheduledPriority=this.args.scheduledPriority;this.gpuMemoryUsageInBytes=this.args.gpuMemoryUsage;}else{this.resolution=this.args.resolution;this.isSolidColor=this.args.drawInfo.isSolidColor;this.isUsingGpuMemory=this.args.isUsingGpuMemory;this.hasResource=this.args.hasResource;this.scheduledPriority=this.args.scheduledPriority;this.gpuMemoryUsageInBytes=this.args.gpuMemoryUsage;}
-if(this.contentRect){this.layerRect=this.contentRect.scale(1.0/this.contentsScale);}
-if(this.isSolidColor){this.type_=tr.e.cc.tileTypes.solidColor;}else if(!this.hasResource){this.type_=tr.e.cc.tileTypes.missing;}else if(this.resolution==='HIGH_RESOLUTION'){this.type_=tr.e.cc.tileTypes.highRes;}else if(this.resolution==='LOW_RESOLUTION'){this.type_=tr.e.cc.tileTypes.lowRes;}else{this.type_=tr.e.cc.tileTypes.unknown;}},getTypeForLayer(layer){let type=this.type_;if(type===tr.e.cc.tileTypes.unknown){if(this.contentsScale<layer.idealContentsScale){type=tr.e.cc.tileTypes.extraLowRes;}else if(this.contentsScale>layer.idealContentsScale){type=tr.e.cc.tileTypes.extraHighRes;}}
-return type;}};ObjectSnapshot.subTypes.register(TileSnapshot,{typeName:'cc::Tile'});return{TileSnapshot,};});'use strict';tr.exportTo('tr.ui.b',function(){const Location=tr.model.Location;function UIState(location,scaleX){this.location_=location;this.scaleX_=scaleX;}
-UIState.fromUserFriendlyString=function(model,viewport,stateString){const navByFinderPattern=/^(-?\d+(\.\d+)?)@(.+)x(\d+(\.\d+)?)$/g;const match=navByFinderPattern.exec(stateString);if(!match)return;const timestamp=parseFloat(match[1]);const stableId=match[3];const scaleX=parseFloat(match[4]);if(scaleX<=0){throw new Error('Invalid ScaleX value in UI State string.');}
-if(!viewport.containerToTrackMap.getTrackByStableId(stableId)){throw new Error('Invalid StableID given in UI State String.');}
-const loc=tr.model.Location.fromStableIdAndTimestamp(viewport,stableId,timestamp);return new UIState(loc,scaleX);};UIState.prototype={get location(){return this.location_;},get scaleX(){return this.scaleX_;},toUserFriendlyString(viewport){const timestamp=this.location_.xWorld;const stableId=this.location_.getContainingTrack(viewport).eventContainer.stableId;const scaleX=this.scaleX_;return timestamp.toFixed(5)+'@'+stableId+'x'+scaleX.toFixed(5);},toDict(){return{location:this.location_.toDict(),scaleX:this.scaleX_};}};return{UIState,};});'use strict';tr.exportTo('tr.ui.b',function(){const EventSet=tr.model.EventSet;const SelectionState=tr.model.SelectionState;function BrushingState(){this.guid_=tr.b.GUID.allocateSimple();this.selection_=new EventSet();this.findMatches_=new EventSet();this.analysisViewRelatedEvents_=new EventSet();this.analysisLinkHoveredEvents_=new EventSet();this.appliedToModel_=undefined;this.viewSpecificBrushingStates_={};}
-BrushingState.prototype={get guid(){return this.guid_;},clone(){const that=new BrushingState();that.selection_=this.selection_;that.findMatches_=this.findMatches_;that.analysisViewRelatedEvents_=this.analysisViewRelatedEvents_;that.analysisLinkHoveredEvents_=this.analysisLinkHoveredEvents_;that.viewSpecificBrushingStates_=this.viewSpecificBrushingStates_;return that;},equals(that){if(!this.selection_.equals(that.selection_)){return false;}
-if(!this.findMatches_.equals(that.findMatches_)){return false;}
-if(!this.analysisViewRelatedEvents_.equals(that.analysisViewRelatedEvents_)){return false;}
-if(!this.analysisLinkHoveredEvents_.equals(that.analysisLinkHoveredEvents_)){return false;}
-return true;},get selectionOfInterest(){if(this.selection_.length){return this.selection_;}
-if(this.highlight_.length){return this.highlight_;}
-if(this.analysisViewRelatedEvents_.length){return this.analysisViewRelatedEvents_;}
-if(this.analysisLinkHoveredEvents_.length){return this.analysisLinkHoveredEvents_;}
-return this.selection_;},get selection(){return this.selection_;},set selection(selection){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
-if(selection===undefined){selection=new EventSet();}
-this.selection_=selection;},get findMatches(){return this.findMatches_;},set findMatches(findMatches){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
-if(findMatches===undefined){findMatches=new EventSet();}
-this.findMatches_=findMatches;},get analysisViewRelatedEvents(){return this.analysisViewRelatedEvents_;},set analysisViewRelatedEvents(analysisViewRelatedEvents){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
-if(!(analysisViewRelatedEvents instanceof EventSet)){analysisViewRelatedEvents=new EventSet();}
-this.analysisViewRelatedEvents_=analysisViewRelatedEvents;},get analysisLinkHoveredEvents(){return this.analysisLinkHoveredEvents_;},set analysisLinkHoveredEvents(analysisLinkHoveredEvents){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
-if(!(analysisLinkHoveredEvents instanceof EventSet)){analysisLinkHoveredEvents=new EventSet();}
-this.analysisLinkHoveredEvents_=analysisLinkHoveredEvents;},get isAppliedToModel(){return this.appliedToModel_!==undefined;},get viewSpecificBrushingStates(){return this.viewSpecificBrushingStates_;},set viewSpecificBrushingStates(viewSpecificBrushingStates){this.viewSpecificBrushingStates_=viewSpecificBrushingStates;},get defaultState_(){const standoutEventExists=(this.analysisLinkHoveredEvents_.length>0||this.analysisViewRelatedEvents_.length>0||this.findMatches_.length>0);return(standoutEventExists?SelectionState.DIMMED0:SelectionState.NONE);},get brightenedEvents_(){const brightenedEvents=new EventSet();brightenedEvents.addEventSet(this.findMatches);brightenedEvents.addEventSet(this.analysisViewRelatedEvents_);brightenedEvents.addEventSet(this.selection_);brightenedEvents.addEventSet(this.analysisLinkHoveredEvents_);return brightenedEvents;},applyToEventSelectionStates(model){this.appliedToModel_=model;if(model){const newDefaultState=this.defaultState_;const currentDefaultState=tr.b.getFirstElement(model.getDescendantEvents()).selectionState;if(currentDefaultState!==newDefaultState){for(const e of model.getDescendantEvents()){e.selectionState=newDefaultState;}}}
-let level;for(const e of this.brightenedEvents_){level=0;if(this.analysisViewRelatedEvents_.contains(e)||this.findMatches_.contains(e)){level++;}
-if(this.analysisLinkHoveredEvents_.contains(e)){level++;}
-if(this.selection_.contains(e)){level++;}
-e.selectionState=SelectionState.getFromBrighteningLevel(level);}},transferModelOwnershipToClone(that){if(!this.appliedToModel_){throw new Error('Not applied');}
-that.appliedToModel_=this.appliedToModel_;this.appliedToModel_=undefined;},unapplyFromEventSelectionStates(){if(!this.appliedToModel_){throw new Error('Not applied');}
-const model=this.appliedToModel_;this.appliedToModel_=undefined;const defaultState=this.defaultState_;for(const e of this.brightenedEvents_){e.selectionState=defaultState;}
-return defaultState;}};return{BrushingState,};});'use strict';tr.exportTo('tr.ui.b',function(){function Animation(){}
-Animation.prototype={canTakeOverFor(existingAnimation){throw new Error('Not implemented');},takeOverFor(existingAnimation,newStartTimestamp,target){throw new Error('Not implemented');},start(timestamp,target){throw new Error('Not implemented');},didStopEarly(timestamp,target,willBeTakenOverByAnotherAnimation){},tick(timestamp,target){throw new Error('Not implemented');}};return{Animation,};});'use strict';tr.exportTo('tr.ui.b',function(){function AnimationController(){tr.b.EventTarget.call(this);this.target_=undefined;this.activeAnimation_=undefined;this.tickScheduled_=false;}
-AnimationController.prototype={__proto__:tr.b.EventTarget.prototype,get target(){return this.target_;},set target(target){if(this.activeAnimation_){throw new Error('Cannot change target while animation is running.');}
-if(target.cloneAnimationState===undefined||typeof target.cloneAnimationState!=='function'){throw new Error('target must have a cloneAnimationState function');}
-this.target_=target;},get activeAnimation(){return this.activeAnimation_;},get hasActiveAnimation(){return!!this.activeAnimation_;},queueAnimation(animation,opt_now){if(this.target_===undefined){throw new Error('Cannot queue animations without a target');}
-let now;if(opt_now!==undefined){now=opt_now;}else{now=window.performance.now();}
-if(this.activeAnimation_){const done=this.activeAnimation_.tick(now,this.target_);if(done){this.activeAnimation_=undefined;}}
-if(this.activeAnimation_){if(animation.canTakeOverFor(this.activeAnimation_)){this.activeAnimation_.didStopEarly(now,this.target_,true);animation.takeOverFor(this.activeAnimation_,now,this.target_);}else{this.activeAnimation_.didStopEarly(now,this.target_,false);}}
-this.activeAnimation_=animation;this.activeAnimation_.start(now,this.target_);if(this.tickScheduled_)return;this.tickScheduled_=true;tr.b.requestAnimationFrame(this.tickActiveAnimation_,this);},cancelActiveAnimation(opt_now){if(!this.activeAnimation_)return;let now;if(opt_now!==undefined){now=opt_now;}else{now=window.performance.now();}
-this.activeAnimation_.didStopEarly(now,this.target_,false);this.activeAnimation_=undefined;},tickActiveAnimation_(frameBeginTime){this.tickScheduled_=false;if(!this.activeAnimation_)return;if(this.target_===undefined){this.activeAnimation_.didStopEarly(frameBeginTime,this.target_,false);return;}
-const oldTargetState=this.target_.cloneAnimationState();const done=this.activeAnimation_.tick(frameBeginTime,this.target_);if(done){this.activeAnimation_=undefined;}
-if(this.activeAnimation_){this.tickScheduled_=true;tr.b.requestAnimationFrame(this.tickActiveAnimation_,this);}
-if(oldTargetState){const e=new tr.b.Event('didtick');e.oldTargetState=oldTargetState;this.dispatchEvent(e,false,false);}}};return{AnimationController,};});'use strict';tr.exportTo('tr.b',function(){function Settings(){return Settings;}
-if(tr.b.unittest&&tr.b.unittest.TestRunner){tr.b.unittest.TestRunner.addEventListener('tr-unittest-will-run',function(){if(tr.isHeadless){Settings.setAlternativeStorageInstance(new HeadlessStorage());}else{Settings.setAlternativeStorageInstance(global.sessionStorage);global.sessionStorage.clear();}});}
-function SessionSettings(){return SessionSettings;}
-function AddStaticStorageFunctionsToClass_(inputClass,storage){inputClass.storage_=storage;inputClass.get=function(key,opt_default,opt_namespace){key=inputClass.namespace_(key,opt_namespace);const rawVal=inputClass.storage_.getItem(key);if(rawVal===null||rawVal===undefined){return opt_default;}
-try{return JSON.parse(rawVal).value;}catch(e){inputClass.storage_.removeItem(key);return opt_default;}};inputClass.set=function(key,value,opt_namespace){if(value===undefined){throw new Error('Settings.set: value must not be undefined');}
-const v=JSON.stringify({value});inputClass.storage_.setItem(inputClass.namespace_(key,opt_namespace),v);};inputClass.keys=function(opt_namespace){const result=[];opt_namespace=opt_namespace||'';for(let i=0;i<inputClass.storage_.length;i++){const key=inputClass.storage_.key(i);if(inputClass.isnamespaced_(key,opt_namespace)){result.push(inputClass.unnamespace_(key,opt_namespace));}}
-return result;};inputClass.isnamespaced_=function(key,opt_namespace){return key.indexOf(inputClass.normalize_(opt_namespace))===0;};inputClass.namespace_=function(key,opt_namespace){return inputClass.normalize_(opt_namespace)+key;};inputClass.unnamespace_=function(key,opt_namespace){return key.replace(inputClass.normalize_(opt_namespace),'');};inputClass.normalize_=function(opt_namespace){return inputClass.NAMESPACE+(opt_namespace?opt_namespace+'.':'');};inputClass.setAlternativeStorageInstance=function(instance){inputClass.storage_=instance;};inputClass.getAlternativeStorageInstance=function(){if(!tr.isHeadless&&inputClass.storage_===localStorage){return undefined;}
-return inputClass.storage_;};inputClass.NAMESPACE='trace-viewer';}
-function HeadlessStorage(){this.length=0;this.hasItem_={};this.items_={};this.itemsAsArray_=undefined;}
-HeadlessStorage.prototype={key(index){return this.itemsAsArray[index];},get itemsAsArray(){if(this.itemsAsArray_!==undefined){return this.itemsAsArray_;}
-const itemsAsArray=[];for(const k in this.items_){itemsAsArray.push(k);}
-this.itemsAsArray_=itemsAsArray;return this.itemsAsArray_;},getItem(key){if(!this.hasItem_[key]){return null;}
-return this.items_[key];},removeItem(key){if(!this.hasItem_[key]){return;}
-const value=this.items_[key];delete this.hasItem_[key];delete this.items_[key];this.length--;this.itemsAsArray_=undefined;return value;},setItem(key,value){if(this.hasItem_[key]){this.items_[key]=value;return;}
-this.items_[key]=value;this.hasItem_[key]=true;this.length++;this.itemsAsArray_=undefined;return value;}};if(tr.isHeadless){AddStaticStorageFunctionsToClass_(Settings,new HeadlessStorage());AddStaticStorageFunctionsToClass_(SessionSettings,new HeadlessStorage());}else{AddStaticStorageFunctionsToClass_(Settings,localStorage);AddStaticStorageFunctionsToClass_(SessionSettings,sessionStorage);}
-return{Settings,SessionSettings,};});'use strict';tr.exportTo('tr.ui.b',function(){function createSpan(opt_dictionary){let ownerDocument=document;if(opt_dictionary&&opt_dictionary.ownerDocument){ownerDocument=opt_dictionary.ownerDocument;}
-const spanEl=ownerDocument.createElement('span');if(opt_dictionary){if(opt_dictionary.className){spanEl.className=opt_dictionary.className;}
-if(opt_dictionary.textContent){Polymer.dom(spanEl).textContent=opt_dictionary.textContent;}
-if(opt_dictionary.tooltip){spanEl.title=opt_dictionary.tooltip;}
-if(opt_dictionary.parent){Polymer.dom(opt_dictionary.parent).appendChild(spanEl);}
-if(opt_dictionary.bold){spanEl.style.fontWeight='bold';}
-if(opt_dictionary.italic){spanEl.style.fontStyle='italic';}
-if(opt_dictionary.marginLeft){spanEl.style.marginLeft=opt_dictionary.marginLeft;}
-if(opt_dictionary.marginRight){spanEl.style.marginRight=opt_dictionary.marginRight;}
-if(opt_dictionary.backgroundColor){spanEl.style.backgroundColor=opt_dictionary.backgroundColor;}
-if(opt_dictionary.color){spanEl.style.color=opt_dictionary.color;}}
-return spanEl;}
-function createLink(opt_args){let ownerDocument=document;if(opt_args&&opt_args.ownerDocument){ownerDocument=opt_args.ownerDocument;}
-const linkEl=ownerDocument.createElement('a');if(opt_args){if(opt_args.href){linkEl.href=opt_args.href;linkEl.target='_blank';}
-if(opt_args.tooltip)linkEl.title=opt_args.tooltip;if(opt_args.color)linkEl.style.color=opt_args.color;if(opt_args.bold)linkEl.style.fontWeight='bold';if(opt_args.italic)linkEl.style.fontStyle='italic';if(opt_args.className)linkEl.className=opt_args.className;if(opt_args.parent)Polymer.dom(opt_args.parent).appendChild(linkEl);if(opt_args.marginLeft)linkEl.style.marginLeft=opt_args.marginLeft;if(opt_args.marginRight)linkEl.style.marginRight=opt_args.marginRight;if(opt_args.backgroundColor){linkEl.style.backgroundColor=opt_args.backgroundColor;}
-if(opt_args.textContent){Polymer.dom(linkEl).textContent=opt_args.textContent;}}
-return linkEl;}
-function createDiv(opt_dictionary){const divEl=document.createElement('div');if(opt_dictionary){if(opt_dictionary.className){divEl.className=opt_dictionary.className;}
-if(opt_dictionary.parent){Polymer.dom(opt_dictionary.parent).appendChild(divEl);}
-if(opt_dictionary.textContent){Polymer.dom(divEl).textContent=opt_dictionary.textContent;}
-if(opt_dictionary.maxWidth){divEl.style.maxWidth=opt_dictionary.maxWidth;}}
-return divEl;}
-function createScopedStyle(styleContent){const styleEl=document.createElement('style');styleEl.scoped=true;Polymer.dom(styleEl).innerHTML=styleContent;return styleEl;}
-function valuesEqual(a,b){if(a instanceof Array&&b instanceof Array){return a.length===b.length&&JSON.stringify(a)===JSON.stringify(b);}
-return a===b;}
-function createSelector(targetEl,targetElProperty,settingsKey,defaultValue,items,opt_namespace){let defaultValueIndex;for(let i=0;i<items.length;i++){const item=items[i];if(valuesEqual(item.value,defaultValue)){defaultValueIndex=i;break;}}
-if(defaultValueIndex===undefined){throw new Error('defaultValue must be in the items list');}
-const selectorEl=document.createElement('select');selectorEl.addEventListener('change',onChange);for(let i=0;i<items.length;i++){const item=items[i];const optionEl=document.createElement('option');Polymer.dom(optionEl).textContent=item.label;optionEl.targetPropertyValue=item.value;optionEl.item=item;Polymer.dom(selectorEl).appendChild(optionEl);}
-function onChange(e){const value=selectorEl.selectedValue;tr.b.Settings.set(settingsKey,value,opt_namespace);targetEl[targetElProperty]=value;}
-const oldSetter=targetEl.__lookupSetter__('selectedIndex');selectorEl.__defineGetter__('selectedValue',function(v){return selectorEl.children[selectorEl.selectedIndex].targetPropertyValue;});selectorEl.__defineGetter__('selectedItem',function(v){return selectorEl.children[selectorEl.selectedIndex].item;});selectorEl.__defineSetter__('selectedValue',function(v){for(let i=0;i<selectorEl.children.length;i++){const value=selectorEl.children[i].targetPropertyValue;if(valuesEqual(value,v)){const changed=selectorEl.selectedIndex!==i;if(changed){selectorEl.selectedIndex=i;onChange();}
-return;}}
-throw new Error('Not a valid value');});const initialValue=tr.b.Settings.get(settingsKey,defaultValue,opt_namespace);let didSet=false;for(let i=0;i<selectorEl.children.length;i++){if(valuesEqual(selectorEl.children[i].targetPropertyValue,initialValue)){didSet=true;targetEl[targetElProperty]=initialValue;selectorEl.selectedIndex=i;break;}}
-if(!didSet){selectorEl.selectedIndex=defaultValueIndex;targetEl[targetElProperty]=defaultValue;}
-return selectorEl;}
-function createEditCategorySpan(optionGroupEl,targetEl){const spanEl=createSpan({className:'edit-categories'});Polymer.dom(spanEl).textContent='Edit categories';Polymer.dom(spanEl).classList.add('labeled-option');spanEl.addEventListener('click',function(){targetEl.onClickEditCategories();});return spanEl;}
-function createOptionGroup(targetEl,targetElProperty,settingsKey,defaultValue,items){function onChange(){let value=[];if(this.value.length){value=this.value.split(',');}
-tr.b.Settings.set(settingsKey,value);targetEl[targetElProperty]=value;}
-const optionGroupEl=createSpan({className:'labeled-option-group'});const initialValue=tr.b.Settings.get(settingsKey,defaultValue);for(let i=0;i<items.length;++i){const item=items[i];const id='category-preset-'+item.label.replace(/ /g,'-');const radioEl=document.createElement('input');radioEl.type='radio';Polymer.dom(radioEl).setAttribute('id',id);Polymer.dom(radioEl).setAttribute('name','category-presets-group');Polymer.dom(radioEl).setAttribute('value',item.value);radioEl.addEventListener('change',onChange.bind(radioEl,targetEl,targetElProperty,settingsKey));if(valuesEqual(initialValue,item.value)){radioEl.checked=true;}
-const labelEl=document.createElement('label');Polymer.dom(labelEl).textContent=item.label;Polymer.dom(labelEl).setAttribute('for',id);const spanEl=createSpan({className:'labeled-option'});Polymer.dom(spanEl).appendChild(radioEl);Polymer.dom(spanEl).appendChild(labelEl);spanEl.__defineSetter__('checked',function(opt_bool){const changed=radioEl.checked!==(!!opt_bool);if(!changed)return;radioEl.checked=!!opt_bool;onChange();});spanEl.__defineGetter__('checked',function(){return radioEl.checked;});Polymer.dom(optionGroupEl).appendChild(spanEl);}
-Polymer.dom(optionGroupEl).appendChild(createEditCategorySpan(optionGroupEl,targetEl));if(!initialValue.length){Polymer.dom(optionGroupEl).classList.add('categories-expanded');}
-targetEl[targetElProperty]=initialValue;return optionGroupEl;}
-let nextCheckboxId=1;function createCheckBox(targetEl,targetElProperty,settingsKey,defaultValue,label,opt_changeCb){const buttonEl=document.createElement('input');buttonEl.type='checkbox';let initialValue=defaultValue;if(settingsKey!==undefined){initialValue=tr.b.Settings.get(settingsKey,defaultValue);buttonEl.checked=!!initialValue;}
-if(targetEl){targetEl[targetElProperty]=initialValue;}
-function onChange(){if(settingsKey!==undefined){tr.b.Settings.set(settingsKey,buttonEl.checked);}
-if(targetEl){targetEl[targetElProperty]=buttonEl.checked;}
-if(opt_changeCb){opt_changeCb.call();}}
-buttonEl.addEventListener('change',onChange);const id='#checkbox-'+nextCheckboxId++;const spanEl=createSpan();spanEl.style.display='flex';spanEl.style.whiteSpace='nowrap';Polymer.dom(buttonEl).setAttribute('id',id);const labelEl=document.createElement('label');Polymer.dom(labelEl).textContent=label;Polymer.dom(labelEl).setAttribute('for',id);Polymer.dom(spanEl).appendChild(buttonEl);Polymer.dom(spanEl).appendChild(labelEl);spanEl.__defineSetter__('checked',function(opt_bool){const changed=buttonEl.checked!==(!!opt_bool);if(!changed)return;buttonEl.checked=!!opt_bool;onChange();});spanEl.__defineGetter__('checked',function(){return buttonEl.checked;});return spanEl;}
-function createButton(label,opt_callback,opt_this){const buttonEl=document.createElement('input');buttonEl.type='button';buttonEl.value=label;function onClick(){opt_callback.call(opt_this||buttonEl);}
-if(opt_callback){buttonEl.addEventListener('click',onClick);}
-return buttonEl;}
-function createTextInput(targetEl,targetElProperty,settingsKey,defaultValue){const initialValue=tr.b.Settings.get(settingsKey,defaultValue);const el=document.createElement('input');el.type='text';function onChange(e){tr.b.Settings.set(settingsKey,el.value);targetEl[targetElProperty]=el.value;}
-el.addEventListener('input',onChange);el.value=initialValue;targetEl[targetElProperty]=initialValue;return el;}
-function isElementAttachedToDocument(el){let cur=el;while(Polymer.dom(cur).parentNode){cur=Polymer.dom(cur).parentNode;}
-return(cur===el.ownerDocument||cur.nodeName==='#document-fragment');}
-function asHTMLOrTextNode(value,opt_ownerDocument){if(value instanceof Node){return value;}
-const ownerDocument=opt_ownerDocument||document;return ownerDocument.createTextNode(value);}
-return{createSpan,createLink,createDiv,createScopedStyle,createSelector,createOptionGroup,createCheckBox,createButton,createTextInput,isElementAttachedToDocument,asHTMLOrTextNode,};});'use strict';tr.exportTo('tr.ui.b',function(){const elidedTitleCacheDict=new Map();const elidedTitleCache=new ElidedTitleCache();function ElidedTitleCache(){this.textWidthMap=new Map();}
-ElidedTitleCache.prototype={get(ctx,pixWidth,title,width,sliceDuration){let elidedDict=elidedTitleCacheDict.get(title);if(!elidedDict){elidedDict=new Map();elidedTitleCacheDict.set(title,elidedDict);}
-let elidedDictForPixWidth=elidedDict.get(pixWidth);if(!elidedDictForPixWidth){elidedDict.set(pixWidth,new Map());elidedDictForPixWidth=elidedDict.get(pixWidth);}
-let stringWidthPair=elidedDictForPixWidth.get(sliceDuration);if(stringWidthPair===undefined){let newtitle=title;let elided=false;while(this.labelWidthWorld(ctx,newtitle,pixWidth)>sliceDuration){if(newtitle.length*0.75<1)break;newtitle=newtitle.substring(0,newtitle.length*0.75);elided=true;}
-if(elided&&newtitle.length>3){newtitle=newtitle.substring(0,newtitle.length-3)+'...';}
-stringWidthPair=new ElidedStringWidthPair(newtitle,this.labelWidth(ctx,newtitle));elidedDictForPixWidth.set(sliceDuration,stringWidthPair);}
-return stringWidthPair;},quickMeasureText_(ctx,text){let w=this.textWidthMap.get(text);if(!w){w=ctx.measureText(text).width;this.textWidthMap.set(text,w);}
-return w;},labelWidth(ctx,title){return this.quickMeasureText_(ctx,title)+2;},labelWidthWorld(ctx,title,pixWidth){return this.labelWidth(ctx,title)*pixWidth;}};function ElidedStringWidthPair(string,width){this.string=string;this.width=width;}
-return{ElidedTitleCache,};});'use strict';tr.exportTo('tr.ui.b',function(){const ColorScheme=tr.b.ColorScheme;const colors=ColorScheme.colors;const colorsAsStrings=ColorScheme.colorsAsStrings;const SelectionState=tr.model.SelectionState;const EventPresenter={getSelectableItemColorAsString(item){const offset=this.getColorIdOffset_(item);const colorId=ColorScheme.getVariantColorId(item.colorId,offset);return colorsAsStrings[colorId];},getColorIdOffset_(event){return event.selectionState;},getTextColor(event){if(event.selectionState===SelectionState.DIMMED){return'rgb(60,60,60)';}
-return'rgb(0,0,0)';},getSliceColorId(slice){const offset=this.getColorIdOffset_(slice);return ColorScheme.getVariantColorId(slice.colorId,offset);},getSliceAlpha(slice,async){let alpha=1;if(async){alpha*=0.3;}
-return alpha;},getInstantSliceColor(instant){const offset=this.getColorIdOffset_(instant);const colorId=ColorScheme.getVariantColorId(instant.colorId,offset);return colors[colorId].toStringWithAlphaOverride(1.0);},getObjectInstanceColor(instance){const offset=this.getColorIdOffset_(instance);const colorId=ColorScheme.getVariantColorId(instance.colorId,offset);return colors[colorId].toStringWithAlphaOverride(0.25);},getObjectSnapshotColor(snapshot){const offset=this.getColorIdOffset_(snapshot);let colorId=snapshot.objectInstance.colorId;colorId=ColorScheme.getVariantColorId(colorId,offset);return colors[colorId];},getCounterSeriesColor(colorId,selectionState,opt_alphaMultiplier){const event={selectionState};const offset=this.getColorIdOffset_(event);const c=colors[ColorScheme.getVariantColorId(colorId,offset)];return c.toStringWithAlphaOverride(opt_alphaMultiplier!==undefined?opt_alphaMultiplier:1.0);},getBarSnapshotColor(snapshot,offset){const snapshotOffset=this.getColorIdOffset_(snapshot);let colorId=snapshot.objectInstance.colorId;colorId=ColorScheme.getAnotherColorId(colorId,offset);colorId=ColorScheme.getVariantColorId(colorId,snapshotOffset);return colors[colorId].toStringWithAlphaOverride(1.0);}};return{EventPresenter,};});'use strict';tr.exportTo('tr.ui.b',function(){const elidedTitleCache=new tr.ui.b.ElidedTitleCache();const ColorScheme=tr.b.ColorScheme;const colorsAsStrings=ColorScheme.colorsAsStrings;const EventPresenter=tr.ui.b.EventPresenter;const blackColorId=ColorScheme.getColorIdForReservedName('black');const THIN_SLICE_HEIGHT=4;const SLICE_WAITING_WIDTH_DRAW_THRESHOLD=3;const SLICE_ACTIVE_WIDTH_DRAW_THRESHOLD=1;const SHOULD_ELIDE_TEXT=true;function drawLine(ctx,x1,y1,x2,y2){ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);}
-function drawTriangle(ctx,x1,y1,x2,y2,x3,y3){ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.lineTo(x3,y3);ctx.closePath();}
-function drawArrow(ctx,x1,y1,x2,y2,arrowLength,arrowWidth){const dx=x2-x1;const dy=y2-y1;const len=Math.sqrt(dx*dx+dy*dy);const perc=(len-arrowLength)/len;const bx=x1+perc*dx;const by=y1+perc*dy;const ux=dx/len;const uy=dy/len;const ax=uy*arrowWidth;const ay=-ux*arrowWidth;ctx.beginPath();drawLine(ctx,x1,y1,x2,y2);ctx.stroke();drawTriangle(ctx,bx+ax,by+ay,x2,y2,bx-ax,by-ay);ctx.fill();}
-function drawSlices(ctx,dt,viewLWorld,viewRWorld,viewHeight,slices,async){const pixelRatio=window.devicePixelRatio||1;const height=viewHeight*pixelRatio;const viewL=dt.xWorldToView(viewLWorld);const viewR=dt.xWorldToView(viewRWorld);let darkRectHeight=THIN_SLICE_HEIGHT*pixelRatio;if(height<darkRectHeight){darkRectHeight=0;}
-const lightRectHeight=height-darkRectHeight;ctx.save();const rect=new tr.ui.b.FastRectRenderer(ctx,viewL,viewR,2,2,colorsAsStrings);rect.setYandH(0,height);const lowSlice=tr.b.findLowIndexInSortedArray(slices,function(slice){return slice.start+slice.duration;},viewLWorld);let hadTopLevel=false;for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];const x=slice.start;if(x>viewRWorld)break;const xView=dt.xWorldToView(x);let wView=1;if(slice.duration>0){const w=Math.max(slice.duration,0.000001);wView=Math.max(dt.xWorldVectorToView(w),1);}
-const colorId=EventPresenter.getSliceColorId(slice);const alpha=EventPresenter.getSliceAlpha(slice,async);const lightAlpha=alpha*0.70;if(async&&slice.isTopLevel){rect.setYandH(3,height-3);hadTopLevel=true;}else{rect.setYandH(0,height);}
-if(!slice.cpuDuration){rect.fillRect(xView,wView,colorId,alpha);continue;}
-let activeWidth=wView*(slice.cpuDuration/slice.duration);let waitingWidth=wView-activeWidth;if(activeWidth<SLICE_ACTIVE_WIDTH_DRAW_THRESHOLD){activeWidth=0;waitingWidth=wView;}
-if(waitingWidth<SLICE_WAITING_WIDTH_DRAW_THRESHOLD){activeWidth=wView;waitingWidth=0;}
-if(activeWidth>0){rect.fillRect(xView,activeWidth,colorId,alpha);}
-if(waitingWidth>0){rect.setYandH(0,lightRectHeight);rect.fillRect(xView+activeWidth-1,waitingWidth+1,colorId,lightAlpha);rect.setYandH(lightRectHeight,darkRectHeight);rect.fillRect(xView+activeWidth-1,waitingWidth+1,colorId,alpha);rect.setYandH(0,height);}}
-rect.flush();if(async&&hadTopLevel){rect.setYandH(2,1);for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];const x=slice.start;if(x>viewRWorld)break;if(!slice.isTopLevel)continue;const xView=dt.xWorldToView(x);let wView=1;if(slice.duration>0){const w=Math.max(slice.duration,0.000001);wView=Math.max(dt.xWorldVectorToView(w),1);}
-rect.fillRect(xView,wView,blackColorId,0.7);}
-rect.flush();}
-ctx.restore();}
-function drawInstantSlicesAsLines(ctx,dt,viewLWorld,viewRWorld,viewHeight,slices,lineWidthInPixels){const pixelRatio=window.devicePixelRatio||1;const height=viewHeight*pixelRatio;ctx.save();ctx.lineWidth=lineWidthInPixels*pixelRatio;const lowSlice=tr.b.findLowIndexInSortedArray(slices,function(slice){return slice.start;},viewLWorld);for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];const x=slice.start;if(x>viewRWorld)break;ctx.strokeStyle=EventPresenter.getInstantSliceColor(slice);const xView=dt.xWorldToView(x);ctx.beginPath();ctx.moveTo(xView,0);ctx.lineTo(xView,height);ctx.stroke();}
-ctx.restore();}
-function drawLabels(ctx,dt,viewLWorld,viewRWorld,slices,async,fontSize,yOffset){const pixelRatio=window.devicePixelRatio||1;const pixWidth=dt.xViewVectorToWorld(1);ctx.save();ctx.textAlign='center';ctx.textBaseline='top';ctx.font=(fontSize*pixelRatio)+'px sans-serif';if(async){ctx.font='italic '+ctx.font;}
-const cY=yOffset*pixelRatio;const lowSlice=tr.b.findLowIndexInSortedArray(slices,function(slice){return slice.start+slice.duration;},viewLWorld);const quickDiscardThreshold=pixWidth*20;for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];if(slice.start>viewRWorld)break;if(slice.duration<=quickDiscardThreshold)continue;const xLeftClipped=Math.max(slice.start,viewLWorld);const xRightClipped=Math.min(slice.start+slice.duration,viewRWorld);const visibleWidth=xRightClipped-xLeftClipped;const title=slice.title+
-(slice.didNotFinish?' (Did Not Finish)':'');let drawnTitle=title;let drawnWidth=elidedTitleCache.labelWidth(ctx,drawnTitle);const fullLabelWidth=elidedTitleCache.labelWidthWorld(ctx,drawnTitle,pixWidth);if(SHOULD_ELIDE_TEXT&&fullLabelWidth>visibleWidth){const elidedValues=elidedTitleCache.get(ctx,pixWidth,drawnTitle,drawnWidth,visibleWidth);drawnTitle=elidedValues.string;drawnWidth=elidedValues.width;}
-if(drawnWidth*pixWidth<visibleWidth){ctx.fillStyle=EventPresenter.getTextColor(slice);const cX=dt.xWorldToView((xLeftClipped+xRightClipped)/2);ctx.fillText(drawnTitle,cX,cY,drawnWidth);}}
-ctx.restore();}
-return{drawSlices,drawInstantSlicesAsLines,drawLabels,drawLine,drawTriangle,drawArrow,elidedTitleCache_:elidedTitleCache,THIN_SLICE_HEIGHT,};});'use strict';tr.exportTo('tr.ui',function(){function TimelineDisplayTransform(opt_that){if(opt_that){this.set(opt_that);return;}
-this.scaleX=1;this.panX=0;this.panY=0;}
-TimelineDisplayTransform.prototype={set(that){this.scaleX=that.scaleX;this.panX=that.panX;this.panY=that.panY;},clone(){return new TimelineDisplayTransform(this);},equals(that){let eq=true;if(that===undefined||that===null){return false;}
-eq&=this.panX===that.panX;eq&=this.panY===that.panY;eq&=this.scaleX===that.scaleX;return!!eq;},almostEquals(that){let eq=true;if(that===undefined||that===null){return false;}
-eq&=Math.abs(this.panX-that.panX)<0.001;eq&=Math.abs(this.panY-that.panY)<0.001;eq&=Math.abs(this.scaleX-that.scaleX)<0.001;return!!eq;},incrementPanXInViewUnits(xDeltaView){this.panX+=this.xViewVectorToWorld(xDeltaView);},xPanWorldPosToViewPos(worldX,viewX,viewWidth){if(typeof viewX==='string'){if(viewX==='left'){viewX=0;}else if(viewX==='center'){viewX=viewWidth/2;}else if(viewX==='right'){viewX=viewWidth-1;}else{throw new Error('viewX must be left|center|right or number.');}}
-this.panX=(viewX/this.scaleX)-worldX;},xPanWorldBoundsIntoView(worldMin,worldMax,viewWidth){if(this.xWorldToView(worldMin)<0){this.xPanWorldPosToViewPos(worldMin,'left',viewWidth);}else if(this.xWorldToView(worldMax)>viewWidth){this.xPanWorldPosToViewPos(worldMax,'right',viewWidth);}},xSetWorldBounds(worldMin,worldMax,viewWidth){const worldWidth=worldMax-worldMin;const scaleX=viewWidth/worldWidth;const panX=-worldMin;this.setPanAndScale(panX,scaleX);},setPanAndScale(p,s){this.scaleX=s;this.panX=p;},xWorldToView(x){return(x+this.panX)*this.scaleX;},xWorldVectorToView(x){return x*this.scaleX;},xViewToWorld(x){return(x/this.scaleX)-this.panX;},xViewVectorToWorld(x){return x/this.scaleX;}};return{TimelineDisplayTransform,};});'use strict';tr.exportTo('tr.ui',function(){function SnapIndicator(y,height){this.y=y;this.height=height;}
-function TimelineInterestRange(vp){this.viewport_=vp;this.range_=new tr.b.math.Range();this.leftSelected_=false;this.rightSelected_=false;this.leftSnapIndicator_=undefined;this.rightSnapIndicator_=undefined;}
-TimelineInterestRange.prototype={get isEmpty(){return this.range_.isEmpty;},reset(){this.range_.reset();this.leftSelected_=false;this.rightSelected_=false;this.leftSnapIndicator_=undefined;this.rightSnapIndicator_=undefined;this.viewport_.dispatchChangeEvent();},get min(){return this.range_.min;},set min(min){this.range_.min=min;this.viewport_.dispatchChangeEvent();},get max(){return this.range_.max;},set max(max){this.range_.max=max;this.viewport_.dispatchChangeEvent();},set(range){this.range_.reset();this.range_.addRange(range);this.viewport_.dispatchChangeEvent();},setMinAndMax(min,max){this.range_.min=min;this.range_.max=max;this.viewport_.dispatchChangeEvent();},get range(){return this.range_.range;},asRangeObject(){const range=new tr.b.math.Range();range.addRange(this.range_);return range;},get leftSelected(){return this.leftSelected_;},set leftSelected(leftSelected){if(this.leftSelected_===leftSelected)return;this.leftSelected_=leftSelected;this.viewport_.dispatchChangeEvent();},get rightSelected(){return this.rightSelected_;},set rightSelected(rightSelected){if(this.rightSelected_===rightSelected)return;this.rightSelected_=rightSelected;this.viewport_.dispatchChangeEvent();},get leftSnapIndicator(){return this.leftSnapIndicator_;},set leftSnapIndicator(leftSnapIndicator){this.leftSnapIndicator_=leftSnapIndicator;this.viewport_.dispatchChangeEvent();},get rightSnapIndicator(){return this.rightSnapIndicator_;},set rightSnapIndicator(rightSnapIndicator){this.rightSnapIndicator_=rightSnapIndicator;this.viewport_.dispatchChangeEvent();},draw(ctx,viewLWorld,viewRWorld,viewHeight){if(this.range_.isEmpty)return;const dt=this.viewport_.currentDisplayTransform;const markerLWorld=this.min;const markerRWorld=this.max;const markerLView=Math.round(dt.xWorldToView(markerLWorld));const markerRView=Math.round(dt.xWorldToView(markerRWorld));ctx.fillStyle='rgba(0, 0, 0, 0.2)';if(markerLWorld>viewLWorld){ctx.fillRect(dt.xWorldToView(viewLWorld),0,markerLView,viewHeight);}
-if(markerRWorld<viewRWorld){ctx.fillRect(markerRView,0,dt.xWorldToView(viewRWorld),viewHeight);}
-const pixelRatio=window.devicePixelRatio||1;ctx.lineWidth=Math.round(pixelRatio);if(this.range_.range>0){this.drawLine_(ctx,viewLWorld,viewRWorld,viewHeight,this.min,this.leftSelected_);this.drawLine_(ctx,viewLWorld,viewRWorld,viewHeight,this.max,this.rightSelected_);}else{this.drawLine_(ctx,viewLWorld,viewRWorld,viewHeight,this.min,this.leftSelected_||this.rightSelected_);}
-ctx.lineWidth=1;},drawLine_(ctx,viewLWorld,viewRWorld,height,ts,selected){if(ts<viewLWorld||ts>=viewRWorld)return;const dt=this.viewport_.currentDisplayTransform;const viewX=Math.round(dt.xWorldToView(ts));ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);ctx.beginPath();tr.ui.b.drawLine(ctx,viewX,0,viewX,height);if(selected){ctx.strokeStyle='rgb(255, 0, 0)';}else{ctx.strokeStyle='rgb(0, 0, 0)';}
-ctx.stroke();ctx.restore();},drawIndicators(ctx,viewLWorld,viewRWorld){if(this.leftSnapIndicator_){this.drawIndicator_(ctx,viewLWorld,viewRWorld,this.range_.min,this.leftSnapIndicator_,this.leftSelected_);}
-if(this.rightSnapIndicator_){this.drawIndicator_(ctx,viewLWorld,viewRWorld,this.range_.max,this.rightSnapIndicator_,this.rightSelected_);}},drawIndicator_(ctx,viewLWorld,viewRWorld,xWorld,si,selected){const dt=this.viewport_.currentDisplayTransform;const viewX=Math.round(dt.xWorldToView(xWorld));ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);const pixelRatio=window.devicePixelRatio||1;const viewY=si.y*devicePixelRatio;const viewHeight=si.height*devicePixelRatio;const arrowSize=4*pixelRatio;if(selected){ctx.fillStyle='rgb(255, 0, 0)';}else{ctx.fillStyle='rgb(0, 0, 0)';}
-tr.ui.b.drawTriangle(ctx,viewX-arrowSize*0.75,viewY,viewX+arrowSize*0.75,viewY,viewX,viewY+arrowSize);ctx.fill();tr.ui.b.drawTriangle(ctx,viewX-arrowSize*0.75,viewY+viewHeight,viewX+arrowSize*0.75,viewY+viewHeight,viewX,viewY+viewHeight-arrowSize);ctx.fill();ctx.restore();}};return{SnapIndicator,TimelineInterestRange,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function ContainerToTrackMap(){this.stableIdToTrackMap_={};}
-ContainerToTrackMap.prototype={addContainer(container,track){if(!track){throw new Error('Must provide a track.');}
-this.stableIdToTrackMap_[container.stableId]=track;},clear(){this.stableIdToTrackMap_={};},getTrackByStableId(stableId){return this.stableIdToTrackMap_[stableId];}};return{ContainerToTrackMap,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function EventToTrackMap(){}
-EventToTrackMap.prototype={addEvent(event,track){if(!track){throw new Error('Must provide a track.');}
-this[event.guid]=track;}};return{EventToTrackMap,};});'use strict';tr.exportTo('tr.ui',function(){const TimelineDisplayTransform=tr.ui.TimelineDisplayTransform;const TimelineInterestRange=tr.ui.TimelineInterestRange;const IDEAL_MAJOR_MARK_DISTANCE_PX=150;const MAJOR_MARK_ROUNDING_FACTOR=100000;class AnimationControllerProxy{constructor(target){this.target_=target;}
-get panX(){return this.target_.currentDisplayTransform_.panX;}
-set panX(panX){this.target_.currentDisplayTransform_.panX=panX;}
-get panY(){return this.target_.currentDisplayTransform_.panY;}
-set panY(panY){this.target_.currentDisplayTransform_.panY=panY;}
-get scaleX(){return this.target_.currentDisplayTransform_.scaleX;}
-set scaleX(scaleX){this.target_.currentDisplayTransform_.scaleX=scaleX;}
-cloneAnimationState(){return this.target_.currentDisplayTransform_.clone();}
-xPanWorldPosToViewPos(xWorld,xView){this.target_.currentDisplayTransform_.xPanWorldPosToViewPos(xWorld,xView,this.target_.modelTrackContainer_.canvas.clientWidth);}}
-function TimelineViewport(parentEl){this.parentEl_=parentEl;this.modelTrackContainer_=undefined;this.currentDisplayTransform_=new TimelineDisplayTransform();this.initAnimationController_();this.selectedFlowEvents_=new Set();this.highlightVSync_=false;this.highDetails_=false;this.gridTimebase_=0;this.gridStep_=1000/60;this.gridEnabled_=false;this.hasCalledSetupFunction_=false;this.onResize_=this.onResize_.bind(this);this.onModelTrackControllerScroll_=this.onModelTrackControllerScroll_.bind(this);this.timeMode_=TimelineViewport.TimeMode.TIME_IN_MS;this.majorMarkWorldPositions_=[];this.majorMarkUnit_=undefined;this.interestRange_=new TimelineInterestRange(this);this.eventToTrackMap_=new tr.ui.tracks.EventToTrackMap();this.containerToTrackMap=new tr.ui.tracks.ContainerToTrackMap();this.dispatchChangeEvent=this.dispatchChangeEvent.bind(this);}
-TimelineViewport.TimeMode={TIME_IN_MS:0,REVISIONS:1};TimelineViewport.prototype={__proto__:tr.b.EventTarget.prototype,get isAttachedToDocumentOrInTestMode(){if(this.parentEl_===undefined)return;return tr.ui.b.isElementAttachedToDocument(this.parentEl_);},onResize_(){this.dispatchChangeEvent();},dispatchChangeEvent(){tr.b.dispatchSimpleEvent(this,'change');},detach(){window.removeEventListener('resize',this.dispatchChangeEvent);},initAnimationController_(){this.dtAnimationController_=new tr.ui.b.AnimationController();this.dtAnimationController_.addEventListener('didtick',function(e){this.onCurentDisplayTransformChange_(e.oldTargetState);}.bind(this));this.dtAnimationController_.target=new AnimationControllerProxy(this);},get currentDisplayTransform(){return this.currentDisplayTransform_;},setDisplayTransformImmediately(displayTransform){this.dtAnimationController_.cancelActiveAnimation();const oldDisplayTransform=this.dtAnimationController_.target.cloneAnimationState();this.currentDisplayTransform_.set(displayTransform);this.onCurentDisplayTransformChange_(oldDisplayTransform);},queueDisplayTransformAnimation(animation){if(!(animation instanceof tr.ui.b.Animation)){throw new Error('animation must be instanceof tr.ui.b.Animation');}
-this.dtAnimationController_.queueAnimation(animation);},onCurentDisplayTransformChange_(oldDisplayTransform){if(this.modelTrackContainer_){this.currentDisplayTransform.panY=tr.b.math.clamp(this.currentDisplayTransform.panY,0,this.modelTrackContainer_.scrollHeight-
-this.modelTrackContainer_.clientHeight);}
-const changed=!this.currentDisplayTransform.equals(oldDisplayTransform);const yChanged=this.currentDisplayTransform.panY!==oldDisplayTransform.panY;if(yChanged){this.modelTrackContainer_.scrollTop=this.currentDisplayTransform.panY;}
-if(changed){this.dispatchChangeEvent();}},onModelTrackControllerScroll_(e){if(this.dtAnimationController_.activeAnimation&&this.dtAnimationController_.activeAnimation.affectsPanY){this.dtAnimationController_.cancelActiveAnimation();}
-const panY=this.modelTrackContainer_.scrollTop;this.currentDisplayTransform_.panY=panY;},get modelTrackContainer(){return this.modelTrackContainer_;},set modelTrackContainer(m){if(this.modelTrackContainer_){this.modelTrackContainer_.removeEventListener('scroll',this.onModelTrackControllerScroll_);}
-this.modelTrackContainer_=m;this.modelTrackContainer_.addEventListener('scroll',this.onModelTrackControllerScroll_);},get selectedFlowEvents(){return this.selectedFlowEvents_;},set selectedFlowEvents(selectedFlowEvents){this.selectedFlowEvents_=selectedFlowEvents;this.dispatchChangeEvent();},get highlightVSync(){return this.highlightVSync_;},set highlightVSync(highlightVSync){this.highlightVSync_=highlightVSync;this.dispatchChangeEvent();},get highDetails(){return this.highDetails_;},set highDetails(highDetails){this.highDetails_=highDetails;this.dispatchChangeEvent();},get gridEnabled(){return this.gridEnabled_;},set gridEnabled(enabled){if(this.gridEnabled_===enabled)return;this.gridEnabled_=enabled&&true;this.dispatchChangeEvent();},get gridTimebase(){return this.gridTimebase_;},set gridTimebase(timebase){if(this.gridTimebase_===timebase)return;this.gridTimebase_=timebase;this.dispatchChangeEvent();},get gridStep(){return this.gridStep_;},get interestRange(){return this.interestRange_;},get majorMarkWorldPositions(){return this.majorMarkWorldPositions_;},get majorMarkUnit(){switch(this.timeMode_){case TimelineViewport.TimeMode.TIME_IN_MS:return tr.b.Unit.byName.timeInMsAutoFormat;case TimelineViewport.TimeMode.REVISIONS:return tr.b.Unit.byName.count;default:throw new Error('Cannot get Unit for unsupported time mode '+this.timeMode_);}},get timeMode(){return this.timeMode_;},set timeMode(mode){this.timeMode_=mode;this.dispatchChangeEvent();},updateMajorMarkData(viewLWorld,viewRWorld){const pixelRatio=window.devicePixelRatio||1;const dt=this.currentDisplayTransform;const idealMajorMarkDistancePix=IDEAL_MAJOR_MARK_DISTANCE_PX*pixelRatio;const idealMajorMarkDistanceWorld=dt.xViewVectorToWorld(idealMajorMarkDistancePix);const majorMarkDistanceWorld=tr.b.math.preferredNumberLargerThanMin(idealMajorMarkDistanceWorld);const firstMajorMark=Math.floor(viewLWorld/majorMarkDistanceWorld)*majorMarkDistanceWorld;this.majorMarkWorldPositions_=[];if(firstMajorMark/majorMarkDistanceWorld>1e15)return;for(let curX=firstMajorMark;curX<viewRWorld;curX+=majorMarkDistanceWorld){this.majorMarkWorldPositions_.push(Math.floor(MAJOR_MARK_ROUNDING_FACTOR*curX)/MAJOR_MARK_ROUNDING_FACTOR);}},drawMajorMarkLines(ctx,viewHeight){ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);ctx.beginPath();for(const majorMark of this.majorMarkWorldPositions_){const x=this.currentDisplayTransform.xWorldToView(majorMark);tr.ui.b.drawLine(ctx,x,0,x,viewHeight);}
-ctx.strokeStyle='#ddd';ctx.stroke();ctx.restore();},drawGridLines(ctx,viewLWorld,viewRWorld,viewHeight){if(!this.gridEnabled)return;const dt=this.currentDisplayTransform;let x=this.gridTimebase;ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);ctx.beginPath();while(x<viewRWorld){if(x>=viewLWorld){const vx=Math.floor(dt.xWorldToView(x));tr.ui.b.drawLine(ctx,vx,0,vx,viewHeight);}
-x+=this.gridStep;}
-ctx.strokeStyle='rgba(255, 0, 0, 0.25)';ctx.stroke();ctx.restore();},getShiftedSelection(selection,offset){const newSelection=new tr.model.EventSet();for(const event of selection){if(event instanceof tr.model.FlowEvent){if(offset>0){newSelection.push(event.endSlice);}else if(offset<0){newSelection.push(event.startSlice);}else{}
-continue;}
-const track=this.trackForEvent(event);track.addEventNearToProvidedEventToSelection(event,offset,newSelection);}
-if(newSelection.length===0)return undefined;return newSelection;},rebuildEventToTrackMap(){this.eventToTrackMap_=new tr.ui.tracks.EventToTrackMap();this.modelTrackContainer_.addEventsToTrackMap(this.eventToTrackMap_);},rebuildContainerToTrackMap(){this.containerToTrackMap.clear();this.modelTrackContainer_.addContainersToTrackMap(this.containerToTrackMap);},trackForEvent(event){return this.eventToTrackMap_[event.guid];}};return{TimelineViewport,};});'use strict';tr.exportTo('tr.c',function(){const BrushingState=tr.ui.b.BrushingState;const EventSet=tr.model.EventSet;const SelectionState=tr.model.SelectionState;const Viewport=tr.ui.TimelineViewport;function BrushingStateController(timelineView){tr.b.EventTarget.call(this);this.timelineView_=timelineView;this.currentBrushingState_=new BrushingState();this.onPopState_=this.onPopState_.bind(this);this.historyEnabled_=false;this.selections_={};}
-BrushingStateController.prototype={__proto__:tr.b.EventTarget.prototype,dispatchChangeEvent_(){const e=new tr.b.Event('change',false,false);this.dispatchEvent(e);},get model(){if(!this.timelineView_){return undefined;}
-return this.timelineView_.model;},get trackView(){if(!this.timelineView_){return undefined;}
-return this.timelineView_.trackView;},get viewport(){if(!this.timelineView_){return undefined;}
-if(!this.timelineView_.trackView){return undefined;}
-return this.timelineView_.trackView.viewport;},get historyEnabled(){return this.historyEnabled_;},set historyEnabled(historyEnabled){this.historyEnabled_=!!historyEnabled;if(historyEnabled){window.addEventListener('popstate',this.onPopState_);}else{window.removeEventListener('popstate',this.onPopState_);}},modelWillChange(){if(this.currentBrushingState_.isAppliedToModel){this.currentBrushingState_.unapplyFromEventSelectionStates();}},modelDidChange(){this.selections_={};this.currentBrushingState_=new BrushingState();this.currentBrushingState_.applyToEventSelectionStates(this.model);const e=new tr.b.Event('model-changed',false,false);this.dispatchEvent(e);this.dispatchChangeEvent_();},onUserInitiatedSelectionChange_(){const selection=this.selection;if(this.historyEnabled){this.selections_[selection.guid]=selection;const state={selection_guid:selection.guid};window.history.pushState(state,document.title);}},onPopState_(e){if(e.state===null)return;const selection=this.selections_[e.state.selection_guid];if(selection){const newState=this.currentBrushingState_.clone();newState.selection=selection;this.currentBrushingState=newState;}
-e.stopPropagation();},get selection(){return this.currentBrushingState_.selection;},get findMatches(){return this.currentBrushingState_.findMatches;},get selectionOfInterest(){return this.currentBrushingState_.selectionOfInterest;},get currentBrushingState(){return this.currentBrushingState_;},set currentBrushingState(newBrushingState){if(newBrushingState.isAppliedToModel){throw new Error('Cannot apply this state, it is applied');}
-const hasValueChanged=!this.currentBrushingState_.equals(newBrushingState);if(newBrushingState!==this.currentBrushingState_&&!hasValueChanged){if(this.currentBrushingState_.isAppliedToModel){this.currentBrushingState_.transferModelOwnershipToClone(newBrushingState);}
-this.currentBrushingState_=newBrushingState;return;}
-if(this.currentBrushingState_.isAppliedToModel){this.currentBrushingState_.unapplyFromEventSelectionStates();}
-this.currentBrushingState_=newBrushingState;this.currentBrushingState_.applyToEventSelectionStates(this.model);this.dispatchChangeEvent_();},addAllEventsMatchingFilterToSelectionAsTask(filter,selection){const timelineView=this.timelineView_.trackView;if(!timelineView){return new tr.b.Task();}
-return timelineView.addAllEventsMatchingFilterToSelectionAsTask(filter,selection);},findTextChangedTo(allPossibleMatches){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.findMatches=allPossibleMatches;this.currentBrushingState=newBrushingState;},findFocusChangedTo(currentFocus){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=currentFocus;this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},findTextCleared(){if(this.xNavStringMarker_!==undefined){this.model.removeAnnotation(this.xNavStringMarker_);this.xNavStringMarker_=undefined;}
-if(this.guideLineAnnotation_!==undefined){this.model.removeAnnotation(this.guideLineAnnotation_);this.guideLineAnnotation_=undefined;}
-const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=new EventSet();newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},uiStateFromString(string){return tr.ui.b.UIState.fromUserFriendlyString(this.model,this.viewport,string);},navToPosition(uiState,showNavLine){this.trackView.navToPosition(uiState,showNavLine);},changeSelectionFromTimeline(selection){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=selection;newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},showScriptControlSelection(selection){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=selection;newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;},changeSelectionFromRequestSelectionChangeEvent(selection){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=selection;newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},changeAnalysisViewRelatedEvents(eventSet){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.analysisViewRelatedEvents=eventSet;this.currentBrushingState=newBrushingState;},changeAnalysisLinkHoveredEvents(eventSet){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.analysisLinkHoveredEvents=eventSet;this.currentBrushingState=newBrushingState;},getViewSpecificBrushingState(viewId){return this.currentBrushingState.viewSpecificBrushingStates[viewId];},changeViewSpecificBrushingState(viewId,newState){const oldStates=this.currentBrushingState_.viewSpecificBrushingStates;const newStates={};for(const id in oldStates){newStates[id]=oldStates[id];}
-if(newState===undefined){delete newStates[viewId];}else{newStates[viewId]=newState;}
-const newBrushingState=this.currentBrushingState_.clone();newBrushingState.viewSpecificBrushingStates=newStates;this.currentBrushingState=newBrushingState;}};BrushingStateController.getControllerForElement=function(element){if(tr.isHeadless){throw new Error('Unsupported');}
-let currentElement=element;while(currentElement){if(currentElement.brushingStateController){return currentElement.brushingStateController;}
-if(currentElement.parentElement){currentElement=currentElement.parentElement;continue;}
-let currentNode=currentElement;while(Polymer.dom(currentNode).parentNode){currentNode=Polymer.dom(currentNode).parentNode;}
-currentElement=currentNode.host;}
-return undefined;};return{BrushingStateController,};});'use strict';Polymer({is:'tr-ui-a-analysis-link',properties:{href:{type:String}},listeners:{'click':'onClicked_','mouseenter':'onMouseEnter_','mouseleave':'onMouseLeave_'},ready(){this.selection_=undefined;},attached(){this.controller_=tr.c.BrushingStateController.getControllerForElement(this);},detached(){this.clearHighlight_();this.controller_=undefined;},set color(c){this.style.color=c;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;Polymer.dom(this).textContent=selection.userFriendlyName;},setSelectionAndContent(selection,opt_textContent){this.selection_=selection;if(opt_textContent){Polymer.dom(this).textContent=opt_textContent;}},getCurrentSelection_(){if(typeof this.selection_==='function'){return this.selection_();}
-return this.selection_;},setHighlight_(opt_eventSet){if(this.controller_){this.controller_.changeAnalysisLinkHoveredEvents(opt_eventSet);}},clearHighlight_(opt_eventSet){this.setHighlight_();},onClicked_(clickEvent){if(!this.selection_)return;clickEvent.stopPropagation();const event=new tr.model.RequestSelectionChangeEvent();event.selection=this.getCurrentSelection_();this.dispatchEvent(event);},onMouseEnter_(){this.setHighlight_(this.getCurrentSelection_());},onMouseLeave_(){this.clearHighlight_();}});'use strict';tr.exportTo('tr.ui.b',function(){const TableFormat={};TableFormat.SelectionMode={NONE:0,ROW:1,CELL:2};TableFormat.HighlightStyle={DEFAULT:0,NONE:1,LIGHT:2,DARK:3};TableFormat.ColumnAlignment={LEFT:0,RIGHT:1};return{TableFormat,};});'use strict';(function(){const RIGHT_ARROW=String.fromCharCode(0x25b6);const UNSORTED_ARROW=String.fromCharCode(0x25BF);const ASCENDING_ARROW=String.fromCharCode(0x25B4);const DESCENDING_ARROW=String.fromCharCode(0x25BE);const SelectionMode=tr.ui.b.TableFormat.SelectionMode;const SelectionModeValues=new Set(Object.values(SelectionMode));const HighlightStyle=tr.ui.b.TableFormat.HighlightStyle;const HighlightStyleValues=new Set(Object.values(HighlightStyle));const ColumnAlignment=tr.ui.b.TableFormat.ColumnAlignment;const ColumnAlignmentValues=new Set(Object.values(ColumnAlignment));Polymer({is:'tr-ui-b-table',created(){this.selectionMode_=SelectionMode.NONE;this.rowHighlightStyle_=HighlightStyle.DEFAULT;this.cellHighlightStyle_=HighlightStyle.DEFAULT;this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;this.tableColumns_=[];this.tableRows_=[];this.tableRowsInfo_=new WeakMap();this.tableFooterRows_=[];this.tableFooterRowsInfo_=new WeakMap();this.sortColumnIndex_=undefined;this.sortDescending_=false;this.columnsWithExpandButtons_=[];this.headerCells_=[];this.showHeader_=true;this.emptyValue_=undefined;this.subRowsPropertyName_='subRows';this.customizeTableRowCallback_=undefined;this.defaultExpansionStateCallback_=undefined;this.userCanModifySortOrder_=true;this.computedFontSizePx_=undefined;},ready(){this.$.body.addEventListener('keydown',this.onKeyDown_.bind(this),true);this.$.body.addEventListener('focus',this.onFocus_.bind(this),true);},clear(){this.selectionMode_=SelectionMode.NONE;this.rowHighlightStyle_=HighlightStyle.DEFAULT;this.cellHighlightStyle_=HighlightStyle.DEFAULT;this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;Polymer.dom(this).textContent='';this.tableColumns_=[];this.tableRows_=[];this.tableRowsInfo_=new WeakMap();this.tableFooterRows_=[];this.tableFooterRowsInfo_=new WeakMap();this.sortColumnIndex_=undefined;this.sortDescending_=false;this.columnsWithExpandButtons_=[];this.headerCells_=[];this.showHeader_=true;this.emptyValue_=undefined;this.subRowsPropertyName_='subRows';this.defaultExpansionStateCallback_=undefined;this.userCanModifySortOrder_=true;},set zebra(zebra){if(zebra){this.setAttribute('zebra',true);}else{this.removeAttribute('zebra');}},get zebra(){return this.getAttribute('zebra');},get showHeader(){return this.showHeader_;},set showHeader(showHeader){this.showHeader_=showHeader;this.scheduleRebuildHeaders_();},set subRowsPropertyName(name){this.subRowsPropertyName_=name;},set defaultExpansionStateCallback(cb){this.defaultExpansionStateCallback_=cb;this.scheduleRebuildBody_();},set customizeTableRowCallback(cb){this.customizeTableRowCallback_=cb;this.scheduleRebuildBody_();},get emptyValue(){return this.emptyValue_;},set emptyValue(emptyValue){const previousEmptyValue=this.emptyValue_;this.emptyValue_=emptyValue;if(this.tableRows_.length===0&&emptyValue!==previousEmptyValue){this.scheduleRebuildBody_();}},set tableColumns(columns){let columnsWithExpandButtons=[];for(let i=0;i<columns.length;i++){if(columns[i].showExpandButtons){columnsWithExpandButtons.push(i);}}
-if(columnsWithExpandButtons.length===0){columnsWithExpandButtons=[0];}
-for(let i=0;i<columns.length;i++){const colInfo=columns[i];if(colInfo.width===undefined)continue;const hasExpandButton=columnsWithExpandButtons.includes(i);const w=colInfo.width;if(w){if(/\d+px/.test(w)){continue;}else if(/\d+%/.test(w)){if(hasExpandButton){throw new Error('Columns cannot be %-sized and host '+' an expand button');}}else{throw new Error('Unrecognized width string');}}}
-let sortIndex=undefined;const currentSortColumn=this.tableColumns[this.sortColumnIndex_];if(currentSortColumn){for(const[i,column]of columns.entries()){if(currentSortColumn.title===column.title){sortIndex=i;break;}}}
-this.tableColumns_=columns;this.headerCells_=[];this.columnsWithExpandButtons_=columnsWithExpandButtons;this.scheduleRebuildHeaders_();this.sortColumnIndex=sortIndex;this.tableRows=this.tableRows_;},get tableColumns(){return this.tableColumns_;},set tableRows(rows){this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;this.tableRows_=rows;this.tableRowsInfo_=new WeakMap();this.scheduleRebuildBody_();},get tableRows(){return this.tableRows_;},set footerRows(rows){this.tableFooterRows_=rows;this.tableFooterRowsInfo_=new WeakMap();this.scheduleRebuildFooter_();},get footerRows(){return this.tableFooterRows_;},get userCanModifySortOrder(){return this.userCanModifySortOrder_;},set userCanModifySortOrder(userCanModifySortOrder){const newUserCanModifySortOrder=!!userCanModifySortOrder;if(newUserCanModifySortOrder===this.userCanModifySortOrder_){return;}
-this.userCanModifySortOrder_=newUserCanModifySortOrder;this.scheduleRebuildHeaders_();},set sortColumnIndex(number){if(number===this.sortColumnIndex_)return;if(number!==undefined){if(this.tableColumns_.length<=number){throw new Error('Column number '+number+' is out of bounds.');}
-if(!this.tableColumns_[number].cmp){throw new Error('Column '+number+' does not have a comparator.');}}
-this.sortColumnIndex_=number;this.updateHeaderArrows_();this.scheduleRebuildBody_();this.dispatchSortingChangedEvent_();},get sortColumnIndex(){return this.sortColumnIndex_;},set sortDescending(value){const newValue=!!value;if(newValue!==this.sortDescending_){this.sortDescending_=newValue;this.updateHeaderArrows_();this.scheduleRebuildBody_();this.dispatchSortingChangedEvent_();}},get sortDescending(){return this.sortDescending_;},updateHeaderArrows_(){for(let i=0;i<this.headerCells_.length;i++){const headerCell=this.headerCells_[i];const isColumnCurrentlySorted=i===this.sortColumnIndex_;if(!this.tableColumns_[i].cmp||(!this.userCanModifySortOrder_&&!isColumnCurrentlySorted)){headerCell.sideContent='';continue;}
-if(!isColumnCurrentlySorted){headerCell.sideContent=UNSORTED_ARROW;headerCell.sideContentDisabled=false;continue;}
-headerCell.sideContent=this.sortDescending_?DESCENDING_ARROW:ASCENDING_ARROW;headerCell.sideContentDisabled=!this.userCanModifySortOrder_;}},generateHeaderColumns_(){const selectedTableColumnIndex=this.selectedTableColumnIndex;Polymer.dom(this.$.cols).textContent='';for(let i=0;i<this.tableColumns_.length;++i){const colElement=document.createElement('col');if(i===selectedTableColumnIndex){colElement.setAttribute('selected',true);}
-Polymer.dom(this.$.cols).appendChild(colElement);}
-this.headerCells_=[];Polymer.dom(this.$.head).textContent='';if(!this.showHeader_)return;const tr=this.appendNewElement_(this.$.head,'tr');for(let i=0;i<this.tableColumns_.length;i++){const td=this.appendNewElement_(tr,'td');const headerCell=document.createElement('tr-ui-b-table-header-cell');headerCell.column=this.tableColumns_[i];if(this.tableColumns_[i].cmp){const isColumnCurrentlySorted=i===this.sortColumnIndex_;if(isColumnCurrentlySorted){headerCell.sideContent=this.sortDescending_?DESCENDING_ARROW:ASCENDING_ARROW;if(!this.userCanModifySortOrder_){headerCell.sideContentDisabled=true;}}
-if(this.userCanModifySortOrder_){Polymer.dom(td).classList.add('sensitive');if(!isColumnCurrentlySorted){headerCell.sideContent=UNSORTED_ARROW;}
-headerCell.tapCallback=this.createSortCallback_(i);}}
-Polymer.dom(td).appendChild(headerCell);this.headerCells_.push(headerCell);}},applySizes_(){if(this.tableRows_.length===0&&!this.showHeader)return;let rowToRemoveSizing;let rowToSize;if(this.showHeader){rowToSize=Polymer.dom(this.$.head).children[0];rowToRemoveSizing=Polymer.dom(this.$.body).children[0];}else{rowToSize=Polymer.dom(this.$.body).children[0];rowToRemoveSizing=Polymer.dom(this.$.head).children[0];}
-for(let i=0;i<this.tableColumns_.length;i++){if(rowToRemoveSizing&&Polymer.dom(rowToRemoveSizing).children[i]){const tdToRemoveSizing=Polymer.dom(rowToRemoveSizing).children[i];tdToRemoveSizing.style.minWidth='';tdToRemoveSizing.style.width='';}
-const td=Polymer.dom(rowToSize).children[i];let delta;if(this.columnsWithExpandButtons_.includes(i)){td.style.paddingLeft=this.basicIndentation_+'px';delta=this.basicIndentation_+'px';}else{delta=undefined;}
-function calc(base,delta){if(delta){return'calc('+base+' - '+delta+')';}
-return base;}
-const w=this.tableColumns_[i].width;if(w){if(/\d+px/.test(w)){td.style.minWidth=calc(w,delta);}else if(/\d+%/.test(w)){td.style.width=w;}else{throw new Error('Unrecognized width string: '+w);}}}},createSortCallback_(columnNumber){return function(){if(!this.userCanModifySortOrder_)return;const previousIndex=this.sortColumnIndex;this.sortColumnIndex=columnNumber;if(previousIndex!==columnNumber){this.sortDescending=false;}else{this.sortDescending=!this.sortDescending;}}.bind(this);},generateTableRowNodes_(tableSection,userRows,rowInfoMap,indentation,lastAddedRow,parentRowInfo){if(this.sortColumnIndex_!==undefined&&tableSection===this.$.body){userRows=userRows.slice();userRows.sort(function(rowA,rowB){let c=this.tableColumns_[this.sortColumnIndex_].cmp(rowA,rowB);if(this.sortDescending_){c=-c;}
-return c;}.bind(this));}
-for(let i=0;i<userRows.length;i++){const userRow=userRows[i];const rowInfo=this.getOrCreateRowInfoFor_(rowInfoMap,userRow,parentRowInfo);const htmlNode=this.getHTMLNodeForRowInfo_(tableSection,rowInfo,rowInfoMap,indentation);if(lastAddedRow===undefined){Polymer.dom(tableSection).insertBefore(htmlNode,Polymer.dom(tableSection).firstChild);}else{const nextSiblingOfLastAdded=Polymer.dom(lastAddedRow).nextSibling;Polymer.dom(tableSection).insertBefore(htmlNode,nextSiblingOfLastAdded);}
-lastAddedRow=htmlNode;if(!rowInfo.isExpanded)continue;lastAddedRow=this.generateTableRowNodes_(tableSection,userRow[this.subRowsPropertyName_],rowInfoMap,indentation+1,lastAddedRow,rowInfo);}
-return lastAddedRow;},getOrCreateRowInfoFor_(rowInfoMap,userRow,parentRowInfo){let rowInfo=undefined;if(rowInfoMap.has(userRow)){rowInfo=rowInfoMap.get(userRow);}else{rowInfo={userRow,htmlNode:undefined,parentRowInfo};rowInfoMap.set(userRow,rowInfo);}
-rowInfo.isExpanded=this.getExpandedForUserRow_(userRow);return rowInfo;},customizeTableRow_(userRow,trElement){if(!this.customizeTableRowCallback_)return;this.customizeTableRowCallback_(userRow,trElement);},get basicIndentation_(){if(this.computedFontSizePx_===undefined){this.computedFontSizePx_=parseInt(getComputedStyle(this).fontSize)||16;}
-return this.computedFontSizePx_-2;},getHTMLNodeForRowInfo_(tableSection,rowInfo,rowInfoMap,indentation){if(rowInfo.htmlNode){this.customizeTableRow_(rowInfo.userRow,rowInfo.htmlNode);return rowInfo.htmlNode;}
-const INDENT_SPACE=indentation*16;const INDENT_SPACE_NO_BUTTON=indentation*16+this.basicIndentation_;const trElement=this.ownerDocument.createElement('tr');rowInfo.htmlNode=trElement;rowInfo.indentation=indentation;trElement.rowInfo=rowInfo;this.customizeTableRow_(rowInfo.userRow,trElement);const isBodyRow=tableSection===this.$.body;const isExpandableRow=rowInfo.userRow[this.subRowsPropertyName_]&&rowInfo.userRow[this.subRowsPropertyName_].length;for(let i=0;i<this.tableColumns_.length;){const td=this.appendNewElement_(trElement,'td');td.columnIndex=i;const column=this.tableColumns_[i];const value=column.value(rowInfo.userRow);const colSpan=column.colSpan?column.colSpan:1;td.style.colSpan=colSpan;switch(column.align){case undefined:case ColumnAlignment.LEFT:break;case ColumnAlignment.RIGHT:td.style.textAlign='right';break;default:throw new Error('Invalid alignment of column at index='+i+': '+column.align);}
-if(this.doesColumnIndexSupportSelection(i)){Polymer.dom(td).classList.add('supports-selection');}
-if(this.columnsWithExpandButtons_.includes(i)){if(rowInfo.userRow[this.subRowsPropertyName_]&&rowInfo.userRow[this.subRowsPropertyName_].length>0){td.style.paddingLeft=INDENT_SPACE+'px';td.style.display='flex';const expandButton=this.appendNewElement_(td,'expand-button');Polymer.dom(expandButton).textContent=RIGHT_ARROW;if(rowInfo.isExpanded){Polymer.dom(expandButton).classList.add('button-expanded');}}else{td.style.paddingLeft=INDENT_SPACE_NO_BUTTON+'px';}}
-if(value!==undefined){Polymer.dom(td).appendChild(tr.ui.b.asHTMLOrTextNode(value,this.ownerDocument));}
-td.addEventListener('click',function(i,clickEvent){clickEvent.preventDefault();if(!isBodyRow&&!isExpandableRow)return;clickEvent.stopPropagation();if(clickEvent.target.tagName==='EXPAND-BUTTON'){this.setExpandedForUserRow_(tableSection,rowInfoMap,rowInfo.userRow,!rowInfo.isExpanded);return;}
-if(isBodyRow&&this.selectionMode_!==SelectionMode.NONE){let shouldSelect=false;let shouldFocus=false;switch(this.selectionMode_){case SelectionMode.ROW:shouldSelect=this.selectedTableRowInfo_!==rowInfo;shouldFocus=true;break;case SelectionMode.CELL:if(this.doesColumnIndexSupportSelection(i)){shouldSelect=this.selectedTableRowInfo_!==rowInfo||this.selectedColumnIndex_!==i;shouldFocus=true;}
-break;default:throw new Error('Invalid selection mode '+
-this.selectionMode_);}
-if(shouldFocus){this.focus();}
-if(shouldSelect){this.didTableRowInfoGetClicked_(rowInfo,i);return;}}
-if(isExpandableRow){this.setExpandedForUserRow_(tableSection,rowInfoMap,rowInfo.userRow,!rowInfo.isExpanded);}}.bind(this,i));if(isBodyRow){td.addEventListener('dblclick',function(i,e){e.stopPropagation();this.dispatchStepIntoEvent_(rowInfo,i);}.bind(this,i));}
-i+=colSpan;}
-return rowInfo.htmlNode;},removeSubNodes_(tableSection,rowInfo,rowInfoMap){if(rowInfo.userRow[this.subRowsPropertyName_]===undefined)return;for(let i=0;i<rowInfo.userRow[this.subRowsPropertyName_].length;i++){const subRow=rowInfo.userRow[this.subRowsPropertyName_][i];const subRowInfo=rowInfoMap.get(subRow);if(!subRowInfo)continue;const subNode=subRowInfo.htmlNode;if(subNode&&Polymer.dom(subNode).parentNode===tableSection){Polymer.dom(tableSection).removeChild(subNode);this.removeSubNodes_(tableSection,subRowInfo,rowInfoMap);}}},scheduleRebuildHeaders_(){this.headerDirty_=true;this.scheduleRebuild_();},scheduleRebuildBody_(){this.bodyDirty_=true;this.scheduleRebuild_();},scheduleRebuildFooter_(){this.footerDirty_=true;this.scheduleRebuild_();},scheduleRebuild_(){if(this.rebuildPending_)return;this.rebuildPending_=true;setTimeout(function(){this.rebuildPending_=false;this.rebuild();}.bind(this),0);},rebuildIfNeeded_(){this.rebuild();},rebuild(){const wasBodyOrHeaderDirty=this.headerDirty_||this.bodyDirty_;if(this.headerDirty_){this.generateHeaderColumns_();this.headerDirty_=false;}
-if(this.bodyDirty_){Polymer.dom(this.$.body).textContent='';this.generateTableRowNodes_(this.$.body,this.tableRows_,this.tableRowsInfo_,0,undefined,undefined);if(this.tableRows_.length===0&&this.emptyValue_!==undefined){const trElement=this.ownerDocument.createElement('tr');Polymer.dom(this.$.body).appendChild(trElement);Polymer.dom(trElement).classList.add('empty-row');const td=this.ownerDocument.createElement('td');Polymer.dom(trElement).appendChild(td);td.colSpan=this.tableColumns_.length;const emptyValue=this.emptyValue_;Polymer.dom(td).appendChild(tr.ui.b.asHTMLOrTextNode(emptyValue,this.ownerDocument));}
-this.bodyDirty_=false;}
-if(wasBodyOrHeaderDirty)this.applySizes_();if(this.footerDirty_){Polymer.dom(this.$.foot).textContent='';this.generateTableRowNodes_(this.$.foot,this.tableFooterRows_,this.tableFooterRowsInfo_,0,undefined,undefined);if(this.tableFooterRowsInfo_.length){Polymer.dom(this.$.body).classList.add('has-footer');}else{Polymer.dom(this.$.body).classList.remove('has-footer');}
-this.footerDirty_=false;}},appendNewElement_(parent,tagName){const element=parent.ownerDocument.createElement(tagName);Polymer.dom(parent).appendChild(element);return element;},getExpandedForTableRow(userRow){this.rebuildIfNeeded_();const rowInfo=this.tableRowsInfo_.get(userRow);if(rowInfo===undefined){throw new Error('Row has not been seen, must expand its parents');}
-return rowInfo.isExpanded;},getExpandedForUserRow_(userRow){if(userRow[this.subRowsPropertyName_]===undefined){return false;}
-if(userRow[this.subRowsPropertyName_].length===0){return false;}
-if(userRow.isExpanded){return true;}
-if((userRow.isExpanded!==undefined)&&(userRow.isExpanded===false)){return false;}
-const rowInfo=this.tableRowsInfo_.get(userRow);if(rowInfo&&rowInfo.isExpanded){return true;}
-if(this.defaultExpansionStateCallback_===undefined){return false;}
-let parentUserRow=undefined;if(rowInfo&&rowInfo.parentRowInfo){parentUserRow=rowInfo.parentRowInfo.userRow;}
-return this.defaultExpansionStateCallback_(userRow,parentUserRow);},setExpandedForTableRow(userRow,expanded){this.rebuildIfNeeded_();const rowInfo=this.tableRowsInfo_.get(userRow);if(rowInfo===undefined){throw new Error('Row has not been seen, must expand its parents');}
-return this.setExpandedForUserRow_(this.$.body,this.tableRowsInfo_,userRow,expanded);},setExpandedForUserRow_(tableSection,rowInfoMap,userRow,expanded){this.rebuildIfNeeded_();const rowInfo=rowInfoMap.get(userRow);if(rowInfo===undefined){throw new Error('Row has not been seen, must expand its parents');}
-const wasExpanded=rowInfo.isExpanded;rowInfo.isExpanded=!!expanded;if(rowInfo.htmlNode===undefined)return;if(rowInfo.htmlNode.parentElement!==tableSection){return;}
-const expandButton=Polymer.dom(rowInfo.htmlNode).querySelector('expand-button');if(rowInfo.isExpanded){Polymer.dom(expandButton).classList.add('button-expanded');const lastAddedRow=rowInfo.htmlNode;if(rowInfo.userRow[this.subRowsPropertyName_]){this.generateTableRowNodes_(tableSection,rowInfo.userRow[this.subRowsPropertyName_],rowInfoMap,rowInfo.indentation+1,lastAddedRow,rowInfo);}}else{Polymer.dom(expandButton).classList.remove('button-expanded');this.removeSubNodes_(tableSection,rowInfo,rowInfoMap);}
-if(wasExpanded!==rowInfo.isExpanded){const e=new tr.b.Event('row-expanded-changed');e.row=rowInfo.userRow;this.dispatchEvent(e);}
-this.maybeUpdateSelectedRow_();},get selectionMode(){return this.selectionMode_;},set selectionMode(selectionMode){if(!SelectionModeValues.has(selectionMode)){throw new Error('Invalid selection mode '+selectionMode);}
-this.rebuildIfNeeded_();this.selectionMode_=selectionMode;this.didSelectionStateChange_();},get rowHighlightStyle(){return this.rowHighlightStyle_;},set rowHighlightStyle(rowHighlightStyle){if(!HighlightStyleValues.has(rowHighlightStyle)){throw new Error('Invalid row highlight style '+rowHighlightStyle);}
-this.rebuildIfNeeded_();this.rowHighlightStyle_=rowHighlightStyle;this.didSelectionStateChange_();},get resolvedRowHighlightStyle(){if(this.rowHighlightStyle_!==HighlightStyle.DEFAULT){return this.rowHighlightStyle_;}
-switch(this.selectionMode_){case SelectionMode.NONE:return HighlightStyle.NONE;case SelectionMode.ROW:return HighlightStyle.DARK;case SelectionMode.CELL:return HighlightStyle.LIGHT;default:throw new Error('Invalid selection mode '+selectionMode);}},get cellHighlightStyle(){return this.cellHighlightStyle_;},set cellHighlightStyle(cellHighlightStyle){if(!HighlightStyleValues.has(cellHighlightStyle)){throw new Error('Invalid cell highlight style '+cellHighlightStyle);}
-this.rebuildIfNeeded_();this.cellHighlightStyle_=cellHighlightStyle;this.didSelectionStateChange_();},get resolvedCellHighlightStyle(){if(this.cellHighlightStyle_!==HighlightStyle.DEFAULT){return this.cellHighlightStyle_;}
-switch(this.selectionMode_){case SelectionMode.NONE:case SelectionMode.ROW:return HighlightStyle.NONE;case SelectionMode.CELL:return HighlightStyle.DARK;default:throw new Error('Invalid selection mode '+selectionMode);}},setHighlightStyle_(highlightAttribute,resolvedHighlightStyle){switch(resolvedHighlightStyle){case HighlightStyle.NONE:Polymer.dom(this.$.body).removeAttribute(highlightAttribute);break;case HighlightStyle.LIGHT:Polymer.dom(this.$.body).setAttribute(highlightAttribute,'light');break;case HighlightStyle.DARK:Polymer.dom(this.$.body).setAttribute(highlightAttribute,'dark');break;default:throw new Error('Invalid resolved highlight style '+
-resolvedHighlightStyle);}},didSelectionStateChange_(){this.setHighlightStyle_('row-highlight-style',this.resolvedRowHighlightStyle);this.setHighlightStyle_('cell-highlight-style',this.resolvedCellHighlightStyle);this.removeSelectedState_();switch(this.selectionMode_){case SelectionMode.ROW:Polymer.dom(this.$.body).setAttribute('selection-mode','row');Polymer.dom(this.$.body).setAttribute('tabindex',0);this.selectedColumnIndex_=undefined;break;case SelectionMode.CELL:Polymer.dom(this.$.body).setAttribute('selection-mode','cell');Polymer.dom(this.$.body).setAttribute('tabindex',0);if(this.selectedTableRowInfo_&&this.selectedColumnIndex_===undefined){const i=this.getFirstSelectableColumnIndex_();if(i===-1){this.selectedTableRowInfo_=undefined;}else{this.selectedColumnIndex_=i;}}
-break;case SelectionMode.NONE:Polymer.dom(this.$.body).removeAttribute('selection-mode');Polymer.dom(this.$.body).removeAttribute('tabindex');this.$.body.blur();this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;break;default:throw new Error('Invalid selection mode '+this.selectionMode_);}
-this.maybeUpdateSelectedRow_();},maybeUpdateSelectedRow_(){if(this.selectedTableRowInfo_===undefined)return;function isVisible(rowInfo){if(!rowInfo.htmlNode)return false;return!!rowInfo.htmlNode.parentElement;}
-if(isVisible(this.selectedTableRowInfo_)){this.updateSelectedState_();return;}
-this.removeSelectedState_();let curRowInfo=this.selectedTableRowInfo_;while(curRowInfo&&!isVisible(curRowInfo)){curRowInfo=curRowInfo.parentRowInfo;}
-this.selectedTableRowInfo_=curRowInfo;if(this.selectedTableRowInfo_){this.updateSelectedState_();}else{this.selectedColumnIndex_=undefined;}},didTableRowInfoGetClicked_(rowInfo,columnIndex){switch(this.selectionMode_){case SelectionMode.NONE:return;case SelectionMode.CELL:if(!this.doesColumnIndexSupportSelection(columnIndex)){return;}
-if(this.selectedColumnIndex!==columnIndex){this.selectedColumnIndex=columnIndex;}
-case SelectionMode.ROW:if(this.selectedTableRowInfo_!==rowInfo){this.selectedTableRow=rowInfo.userRow;}}},dispatchStepIntoEvent_(rowInfo,columnIndex){const e=new tr.b.Event('step-into');e.tableRow=rowInfo.userRow;e.tableColumn=this.tableColumns_[columnIndex];e.columnIndex=columnIndex;this.dispatchEvent(e);},get selectedCell(){const row=this.selectedTableRow;const columnIndex=this.selectedColumnIndex;if(row===undefined||columnIndex===undefined||this.tableColumns_.length<=columnIndex){return undefined;}
-const column=this.tableColumns_[columnIndex];return{row,column,value:column.value(row)};},get selectedTableColumnIndex(){const cols=Polymer.dom(this.$.cols).children;for(let i=0;i<cols.length;++i){if(cols[i].getAttribute('selected')){return i;}}
-return undefined;},set selectedTableColumnIndex(selectedIndex){const cols=Polymer.dom(this.$.cols).children;for(let i=0;i<cols.length;++i){if(i===selectedIndex){cols[i].setAttribute('selected',true);}else{cols[i].removeAttribute('selected');}}},get selectedTableRow(){if(!this.selectedTableRowInfo_)return undefined;return this.selectedTableRowInfo_.userRow;},set selectedTableRow(userRow){this.rebuildIfNeeded_();if(this.selectionMode_===SelectionMode.NONE){throw new Error('Selection is off.');}
-let rowInfo;if(userRow===undefined){rowInfo=undefined;}else{rowInfo=this.tableRowsInfo_.get(userRow);if(!rowInfo){throw new Error('Row has not been seen, must expand its parents.');}}
-const e=this.prepareToChangeSelection_();if(!rowInfo){this.selectedColumnIndex_=undefined;}else{switch(this.selectionMode_){case SelectionMode.ROW:this.selectedColumnIndex_=undefined;break;case SelectionMode.CELL:if(this.selectedColumnIndex_===undefined){const i=this.getFirstSelectableColumnIndex_();if(i===-1){throw new Error('Cannot find a selectable column.');}
-this.selectedColumnIndex_=i;}
-break;default:throw new Error('Invalid selection mode '+this.selectionMode_);}}
-this.selectedTableRowInfo_=rowInfo;this.updateSelectedState_();this.dispatchEvent(e);},prepareToChangeSelection_(){const e=new tr.b.Event('selection-changed');const previousSelectedRowInfo=this.selectedTableRowInfo_;if(previousSelectedRowInfo){e.previousSelectedTableRow=previousSelectedRowInfo.userRow;}else{e.previousSelectedTableRow=undefined;}
-this.removeSelectedState_();return e;},removeSelectedState_(){this.setSelectedState_(false);},updateSelectedState_(){this.setSelectedState_(true);},setSelectedState_(select){if(this.selectedTableRowInfo_===undefined)return;const rowNode=this.selectedTableRowInfo_.htmlNode;if(select){Polymer.dom(rowNode).setAttribute('selected',true);}else{Polymer.dom(rowNode).removeAttribute('selected');}
-const cellNode=Polymer.dom(rowNode).children[this.selectedColumnIndex_];if(!cellNode)return;if(select){Polymer.dom(cellNode).setAttribute('selected',true);}else{Polymer.dom(cellNode).removeAttribute('selected');}},doesColumnIndexSupportSelection(columnIndex){const columnInfo=this.tableColumns_[columnIndex];const scs=columnInfo.supportsCellSelection;if(scs===false)return false;return true;},getFirstSelectableColumnIndex_(){for(let i=0;i<this.tableColumns_.length;i++){if(this.doesColumnIndexSupportSelection(i)){return i;}}
-return-1;},getSelectableNodeGivenTableRowNode_(htmlNode){switch(this.selectionMode_){case SelectionMode.ROW:return htmlNode;case SelectionMode.CELL:return Polymer.dom(htmlNode).children[this.selectedColumnIndex_];default:throw new Error('Invalid selection mode '+this.selectionMode_);}},get selectedColumnIndex(){if(this.selectionMode_!==SelectionMode.CELL){return undefined;}
-return this.selectedColumnIndex_;},set selectedColumnIndex(selectedColumnIndex){this.rebuildIfNeeded_();if(this.selectionMode_===SelectionMode.NONE){throw new Error('Selection is off.');}
-if(selectedColumnIndex<0||selectedColumnIndex>=this.tableColumns_.length){throw new Error('Invalid index');}
-if(!this.doesColumnIndexSupportSelection(selectedColumnIndex)){throw new Error('Selection is not supported on this column');}
-const e=this.prepareToChangeSelection_();if(this.selectedColumnIndex_===undefined){this.selectedTableRowInfo_=undefined;}else if(!this.selectedTableRowInfo_){if(this.tableRows_.length===0){throw new Error('No available row to be selected');}
-this.selectedTableRowInfo_=this.tableRowsInfo_.get(this.tableRows_[0]);}
-this.selectedColumnIndex_=selectedColumnIndex;this.updateSelectedState_();this.dispatchEvent(e);},onKeyDown_(e){if(this.selectionMode_===SelectionMode.NONE)return;const CODE_TO_COMMAND_NAMES={13:'ENTER',32:'SPACE',37:'ARROW_LEFT',38:'ARROW_UP',39:'ARROW_RIGHT',40:'ARROW_DOWN'};const cmdName=CODE_TO_COMMAND_NAMES[e.keyCode];if(cmdName===undefined)return;e.stopPropagation();e.preventDefault();this.performKeyCommand_(cmdName);},onFocus_(e){if(this.selectionMode_===SelectionMode.NONE||this.selectedTableRow||this.tableRows_.length===0){return;}
-if(this.selectionMode_===SelectionMode.CELL&&this.getFirstSelectableColumnIndex_()===-1){return;}
-this.selectedTableRow=this.tableRows_[0];},focus(){this.$.body.focus();this.onFocus_();},blur(){this.$.body.blur();},get isFocused(){return this.root.activeElement===this.$.body;},performKeyCommand_(cmdName){this.rebuildIfNeeded_();switch(cmdName){case'ARROW_UP':this.selectPreviousOrFirstRowIfPossible_();return;case'ARROW_DOWN':this.selectNextOrFirstRowIfPossible_();return;case'ARROW_RIGHT':switch(this.selectionMode_){case SelectionMode.NONE:return;case SelectionMode.ROW:this.expandRowAndSelectChildRowIfPossible_();return;case SelectionMode.CELL:this.selectNextSelectableCellToTheRightIfPossible_();return;default:throw new Error('Invalid selection mode '+this.selectionMode_);}
-case'ARROW_LEFT':switch(this.selectionMode_){case SelectionMode.NONE:return;case SelectionMode.ROW:this.collapseRowOrSelectParentRowIfPossible_();return;case SelectionMode.CELL:this.selectNextSelectableCellToTheLeftIfPossible_();return;default:throw new Error('Invalid selection mode '+this.selectionMode_);}
-case'SPACE':this.toggleRowExpansionStateIfPossible_();return;case'ENTER':this.stepIntoSelectionIfPossible_();return;default:throw new Error('Unrecognized command '+cmdName);}},selectPreviousOrFirstRowIfPossible_(){const prev=this.selectedTableRowInfo_?this.selectedTableRowInfo_.htmlNode.previousElementSibling:this.$.body.firstChild;if(!prev)return;if(this.selectionMode_===SelectionMode.CELL&&this.getFirstSelectableColumnIndex_()===-1){return;}
-tr.ui.b.scrollIntoViewIfNeeded(prev);this.selectedTableRow=prev.rowInfo.userRow;},selectNextOrFirstRowIfPossible_(){this.getFirstSelectableColumnIndex_;const next=this.selectedTableRowInfo_?this.selectedTableRowInfo_.htmlNode.nextElementSibling:this.$.body.firstChild;if(!next)return;if(this.selectionMode_===SelectionMode.CELL&&this.getFirstSelectableColumnIndex_()===-1){return;}
-tr.ui.b.scrollIntoViewIfNeeded(next);this.selectedTableRow=next.rowInfo.userRow;},expandRowAndSelectChildRowIfPossible_(){const selectedRowInfo=this.selectedTableRowInfo_;if(!selectedRowInfo||selectedRowInfo.userRow[this.subRowsPropertyName_]===undefined||selectedRowInfo.userRow[this.subRowsPropertyName_].length===0){return;}
-if(!selectedRowInfo.isExpanded){this.setExpandedForTableRow(selectedRowInfo.userRow,true);}
-this.selectedTableRow=selectedRowInfo.htmlNode.nextElementSibling.rowInfo.userRow;},collapseRowOrSelectParentRowIfPossible_(){const selectedRowInfo=this.selectedTableRowInfo_;if(!selectedRowInfo)return;if(selectedRowInfo.isExpanded){this.setExpandedForTableRow(selectedRowInfo.userRow,false);}else{const parentRowInfo=selectedRowInfo.parentRowInfo;if(parentRowInfo){this.selectedTableRow=parentRowInfo.userRow;}}},selectNextSelectableCellToTheRightIfPossible_(){if(!this.selectedTableRowInfo_||this.selectedColumnIndex_===undefined){return;}
-for(let i=this.selectedColumnIndex_+1;i<this.tableColumns_.length;i++){if(this.doesColumnIndexSupportSelection(i)){this.selectedColumnIndex=i;return;}}},selectNextSelectableCellToTheLeftIfPossible_(){if(!this.selectedTableRowInfo_||this.selectedColumnIndex_===undefined){return;}
-for(let i=this.selectedColumnIndex_-1;i>=0;i--){if(this.doesColumnIndexSupportSelection(i)){this.selectedColumnIndex=i;return;}}},toggleRowExpansionStateIfPossible_(){const selectedRowInfo=this.selectedTableRowInfo_;if(!selectedRowInfo||selectedRowInfo.userRow[this.subRowsPropertyName_]===undefined||selectedRowInfo.userRow[this.subRowsPropertyName_].length===0){return;}
-this.setExpandedForTableRow(selectedRowInfo.userRow,!selectedRowInfo.isExpanded);},stepIntoSelectionIfPossible_(){if(!this.selectedTableRowInfo_)return;this.dispatchStepIntoEvent_(this.selectedTableRowInfo_,this.selectedColumnIndex_);},dispatchSortingChangedEvent_(){const e=new tr.b.Event('sort-column-changed');e.sortColumnIndex=this.sortColumnIndex_;e.sortDescending=this.sortDescending_;this.dispatchEvent(e);}});})();'use strict';const ColumnAlignment=tr.ui.b.TableFormat.ColumnAlignment;Polymer({is:'tr-ui-b-table-header-cell',created(){this.tapCallback_=undefined;this.cellTitle_='';this.align_=undefined;this.selectable_=false;this.column_=undefined;},ready(){this.addEventListener('click',this.onTap_.bind(this));},set column(column){this.column_=column;this.align=column.align;this.cellTitle=column.title;},get column(){return this.column_;},set cellTitle(value){this.cellTitle_=value;const titleNode=tr.ui.b.asHTMLOrTextNode(this.cellTitle_,this.ownerDocument);this.$.title.innerText='';Polymer.dom(this.$.title).appendChild(titleNode);},get cellTitle(){return this.cellTitle_;},set align(align){switch(align){case undefined:case ColumnAlignment.LEFT:this.style.justifyContent='';break;case ColumnAlignment.RIGHT:this.style.justifyContent='flex-end';break;default:throw new Error('Invalid alignment of column (title=\''+
-this.cellTitle_+'\'): '+align);}
-this.align_=align;},get align(){return this.align_;},clearSideContent(){Polymer.dom(this.$.side).textContent='';},set sideContent(content){Polymer.dom(this.$.side).textContent=content;this.$.side.style.display=content?'inline':'none';},get sideContent(){return Polymer.dom(this.$.side).textContent;},set sideContentDisabled(sideContentDisabled){this.$.side.classList.toggle('disabled',sideContentDisabled);},get sideContentDisabled(){return this.$.side.classList.contains('disabled');},set tapCallback(callback){this.style.cursor='pointer';this.tapCallback_=callback;},get tapCallback(){return this.tapCallback_;},onTap_(){if(this.tapCallback_){this.tapCallback_();}}});'use strict';tr.exportTo('tr.b.math',function(){class RunningStatistics{constructor(){this.mean_=0;this.count_=0;this.max_=-Infinity;this.min_=Infinity;this.sum_=0;this.variance_=0;this.meanlogs_=0;}
-get count(){return this.count_;}
-get geometricMean(){if(this.meanlogs_===undefined)return 0;return Math.exp(this.meanlogs_);}
-get mean(){if(this.count_===0)return undefined;return this.mean_;}
-get max(){return this.max_;}
-get min(){return this.min_;}
-get sum(){return this.sum_;}
-get variance(){if(this.count_===0)return undefined;if(this.count_===1)return 0;return this.variance_/(this.count_-1);}
-get stddev(){if(this.count_===0)return undefined;return Math.sqrt(this.variance);}
-add(x){this.count_++;this.max_=Math.max(this.max_,x);this.min_=Math.min(this.min_,x);this.sum_+=x;if(x<=0){this.meanlogs_=undefined;}else if(this.meanlogs_!==undefined){this.meanlogs_+=(Math.log(Math.abs(x))-this.meanlogs_)/this.count;}
-if(this.count_===1){this.mean_=x;this.variance_=0;}else{const oldMean=this.mean_;const oldVariance=this.variance_;if(oldMean===Infinity||oldMean===-Infinity){this.mean_=this.sum_/this.count_;}else{this.mean_=oldMean+(x-oldMean)/this.count_;}
-this.variance_=oldVariance+(x-oldMean)*(x-this.mean_);}}
-merge(other){const result=new RunningStatistics();result.count_=this.count_+other.count_;result.sum_=this.sum_+other.sum_;result.min_=Math.min(this.min_,other.min_);result.max_=Math.max(this.max_,other.max_);if(result.count===0){result.mean_=0;result.variance_=0;result.meanlogs_=0;}else{result.mean_=result.sum/result.count;const deltaMean=(this.mean||0)-(other.mean||0);result.variance_=this.variance_+other.variance_+
-(this.count*other.count*deltaMean*deltaMean/result.count);if(this.meanlogs_===undefined||other.meanlogs_===undefined){result.meanlogs_=undefined;}else{result.meanlogs_=(this.count*this.meanlogs_+
-other.count*other.meanlogs_)/result.count;}}
-return result;}
-truncate(unit){this.max_=unit.truncate(this.max_);if(this.meanlogs_!==undefined){const formatted=unit.format(this.geometricMean);let lo=1;let hi=16;while(lo<hi-1){const digits=parseInt((lo+hi)/2);const test=tr.b.math.truncate(this.meanlogs_,digits);if(formatted===unit.format(Math.exp(test))){hi=digits;}else{lo=digits;}}
-const test=tr.b.math.truncate(this.meanlogs_,lo);if(formatted===unit.format(Math.exp(test))){this.meanlogs_=test;}else{this.meanlogs_=tr.b.math.truncate(this.meanlogs_,hi);}}
-this.mean_=unit.truncate(this.mean_);this.min_=unit.truncate(this.min_);this.sum_=unit.truncate(this.sum_);this.variance_=unit.truncate(this.variance_);}
-asDict(){if(!this.count){return[];}
-return[this.count_,this.max_,this.meanlogs_,this.mean_,this.min_,this.sum_,this.variance_,];}
-static fromDict(dict){const result=new RunningStatistics();if(dict.length!==7){return result;}
-[result.count_,result.max_,result.meanlogs_,result.mean_,result.min_,result.sum_,result.variance_,]=dict;return result;}}
-return{RunningStatistics,};});'use strict';tr.exportTo('tr.v.d',function(){class Diagnostic{constructor(){this.guid_=undefined;}
-clone(){return new this.constructor();}
-canAddDiagnostic(otherDiagnostic){return false;}
-addDiagnostic(otherDiagnostic){throw new Error('Abstract virtual method: subclasses must override '+'this method if they override canAddDiagnostic');}
-get guid(){if(this.guid_===undefined){this.guid_=tr.b.GUID.allocateUUID4();}
-return this.guid_;}
-set guid(guid){if(this.guid_!==undefined){throw new Error('Cannot reset guid');}
-this.guid_=guid;}
-get hasGuid(){return this.guid_!==undefined;}
-asDictOrReference(){if(this.guid_!==undefined){return this.guid_;}
-return this.asDict();}
-asDict(){const result={type:this.constructor.name};if(this.guid_!==undefined){result.guid=this.guid_;}
-this.asDictInto_(result);return result;}
-asDictInto_(d){throw new Error('Abstract virtual method: subclasses must override '+'this method if they override canAddDiagnostic');}
-static fromDict(d){const typeInfo=Diagnostic.findTypeInfoWithName(d.type);if(!typeInfo){throw new Error('Unrecognized diagnostic type: '+d.type);}
-const diagnostic=typeInfo.constructor.fromDict(d);if(d.guid!==undefined)diagnostic.guid=d.guid;return diagnostic;}
-static deserialize(type,d,deserializer){const typeInfo=Diagnostic.findTypeInfoWithName(type);if(!typeInfo){throw new Error('Unrecognized diagnostic type: '+type);}
-return typeInfo.constructor.deserialize(d,deserializer);}}
-const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Diagnostic;tr.b.decorateExtensionRegistry(Diagnostic,options);Diagnostic.addEventListener('will-register',function(e){const constructor=e.typeInfo.constructor;if(!(constructor.deserialize instanceof Function)||(constructor.deserialize===Diagnostic.deserialize)||(constructor.deserialize.length!==2)){throw new Error(`Please define ${constructor.name}.deserialize(data, deserializer)`);}
-if(!(constructor.fromDict instanceof Function)||(constructor.fromDict===Diagnostic.fromDict)||(constructor.fromDict.length!==1)){throw new Error(`Please define ${constructor.name}.fromDict(d)`);}
-if(!(constructor.prototype.serialize instanceof Function)||(constructor.prototype.serialize===Diagnostic.prototype.serialize)||(constructor.prototype.serialize.length!==1)){throw new Error(`Please define ${constructor.name}.serialize(serializer)`);}});return{Diagnostic,};});'use strict';tr.exportTo('tr.v.d',function(){class Breakdown extends tr.v.d.Diagnostic{constructor(){super();this.values_=new Map();this.colorScheme='';}
-truncate(unit){for(const[name,value]of this){this.values_.set(name,unit.truncate(value));}}
-clone(){const clone=new Breakdown();clone.colorScheme=this.colorScheme;clone.addDiagnostic(this);return clone;}
-equals(other){if(this.colorScheme!==other.colorScheme)return false;if(this.values_.size!==other.values_.size)return false;for(const[k,v]of this){if(v!==other.get(k))return false;}
-return true;}
-canAddDiagnostic(otherDiagnostic){return((otherDiagnostic instanceof Breakdown)&&(otherDiagnostic.colorScheme===this.colorScheme));}
-addDiagnostic(otherDiagnostic){for(const[name,value]of otherDiagnostic){this.set(name,this.get(name)+value);}
-return this;}
-set(name,value){if(typeof name!=='string'||typeof value!=='number'){throw new Error('Breakdown maps from strings to numbers');}
-this.values_.set(name,value);}
-get(name){return this.values_.get(name)||0;}*[Symbol.iterator](){for(const pair of this.values_){yield pair;}}
-get size(){return this.values_.size;}
-serialize(serializer){const keys=[...this.values_.keys()];keys.sort();return[serializer.getOrAllocateId(this.colorScheme),serializer.getOrAllocateId(keys.map(k=>serializer.getOrAllocateId(k))),...keys.map(k=>this.get(k)),];}
-asDictInto_(d){d.values={};for(const[name,value]of this){d.values[name]=tr.b.numberToJson(value);}
-if(this.colorScheme){d.colorScheme=this.colorScheme;}}
-static fromEntries(entries){const breakdown=new Breakdown();for(const[name,value]of entries){breakdown.set(name,value);}
-return breakdown;}
-static deserialize(data,deserializer){const breakdown=new Breakdown();breakdown.colorScheme=deserializer.getObject(data[0]);const keys=deserializer.getObject(data[1]);for(let i=0;i<keys.length;++i){breakdown.set(deserializer.getObject(keys[i]),tr.b.numberFromJson(data[i+2]));}
-return breakdown;}
-static fromDict(d){const breakdown=new Breakdown();for(const[name,value]of Object.entries(d.values)){breakdown.set(name,tr.b.numberFromJson(value));}
-if(d.colorScheme){breakdown.colorScheme=d.colorScheme;}
-return breakdown;}}
-tr.v.d.Diagnostic.register(Breakdown,{elementName:'tr-v-ui-breakdown-span'});return{Breakdown,};});'use strict';tr.exportTo('tr.v.d',function(){class CollectedRelatedEventSet extends tr.v.d.Diagnostic{constructor(){super();this.eventSetsByCanonicalUrl_=new Map();}
-asDictInto_(d){d.events={};for(const[canonicalUrl,eventSet]of this){d.events[canonicalUrl]=[];for(const event of eventSet){d.events[canonicalUrl].push({stableId:event.stableId,title:event.title,start:event.start,duration:event.duration});}}}
-static deserialize(events,deserializer){return CollectedRelatedEventSet.fromDict({events});}
-serialize(serializer){const d={};this.asDictInto(d);return d.events;}
-static fromDict(d){const result=new CollectedRelatedEventSet();for(const[canonicalUrl,events]of Object.entries(d.events)){result.eventSetsByCanonicalUrl_.set(canonicalUrl,events.map(e=>new tr.v.d.EventRef(e)));}
-return result;}
-get size(){return this.eventSetsByCanonicalUrl_.size;}
-get(canonicalUrl){return this.eventSetsByCanonicalUrl_.get(canonicalUrl);}*[Symbol.iterator](){for(const[canonicalUrl,eventSet]of this.eventSetsByCanonicalUrl_){yield[canonicalUrl,eventSet];}}
-canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof tr.v.d.RelatedEventSet||otherDiagnostic instanceof tr.v.d.CollectedRelatedEventSet;}
-addEventSetForCanonicalUrl(canonicalUrl,events){let myEventSet=this.eventSetsByCanonicalUrl_.get(canonicalUrl);if(myEventSet===undefined){myEventSet=new Set();this.eventSetsByCanonicalUrl_.set(canonicalUrl,myEventSet);}
-for(const event of events){myEventSet.add(event);}}
-addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof tr.v.d.CollectedRelatedEventSet){for(const[canonicalUrl,otherEventSet]of otherDiagnostic){this.addEventSetForCanonicalUrl(canonicalUrl,otherEventSet);}
-return;}
-if(!otherDiagnostic.canonicalUrl)return;this.addEventSetForCanonicalUrl(otherDiagnostic.canonicalUrl,otherDiagnostic);}}
-tr.v.d.Diagnostic.register(CollectedRelatedEventSet,{elementName:'tr-v-ui-collected-related-event-set-span'});return{CollectedRelatedEventSet,};});'use strict';tr.exportTo('tr.v.d',function(){class DateRange extends tr.v.d.Diagnostic{constructor(ms){super();this.range_=new tr.b.math.Range();this.range_.addValue(ms);}
-get minTimestamp(){return this.range_.min;}
-get maxTimestamp(){return this.range_.max;}
-get minDate(){return new Date(this.range_.min);}
-get maxDate(){return new Date(this.range_.max);}
-get durationMs(){return this.range_.duration;}
-clone(){const clone=new tr.v.d.DateRange(this.range_.min);clone.addDiagnostic(this);return clone;}
-equals(other){if(!(other instanceof DateRange))return false;return this.range_.equals(other.range_);}
-canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof DateRange;}
-addDiagnostic(other){this.range_.addRange(other.range_);}
-toString(){const minDate=tr.b.formatDate(this.minDate);if(this.durationMs===0)return minDate;const maxDate=tr.b.formatDate(this.maxDate);return`${minDate} - ${maxDate}`;}
-serialize(serializer){if(this.durationMs===0)return this.range_.min;return[this.range_.min,this.range_.max];}
-asDictInto_(d){d.min=this.range_.min;if(this.durationMs===0)return;d.max=this.range_.max;}
-static deserialize(data,deserializer){if(data instanceof Array){const dr=new DateRange(data[0]);dr.range_.addValue(data[1]);return dr;}
-return new DateRange(data);}
-static fromDict(d){const dateRange=new DateRange(d.min);if(d.max!==undefined)dateRange.range_.addValue(d.max);return dateRange;}}
-tr.v.d.Diagnostic.register(DateRange,{elementName:'tr-v-ui-date-range-span'});return{DateRange,};});'use strict';tr.exportTo('tr.v.d',function(){class DiagnosticRef{constructor(guid){this.guid=guid;}
-asDict(){return this.guid;}
-asDictOrReference(){return this.asDict();}}
-return{DiagnosticRef,};});'use strict';tr.exportTo('tr.v.d',function(){function stableStringify(obj){let replacer;if(!(obj instanceof Array)&&obj!==null){replacer=Object.keys(obj).sort();}
-return JSON.stringify(obj,replacer);}
-class GenericSet extends tr.v.d.Diagnostic{constructor(values){super();if(typeof values[Symbol.iterator]!=='function'){throw new Error('GenericSet must be constructed from an interable.');}
-this.values_=new Set(values);this.has_objects_=false;for(const value of values){if(typeof value==='object'){this.has_objects_=true;}}}
-get size(){return this.values_.size;}
-get length(){return this.values_.size;}*[Symbol.iterator](){for(const value of this.values_){yield value;}}
-has(value){if(typeof value!=='object')return this.values_.has(value);const json=JSON.stringify(value);for(const x of this){if(typeof x!=='object')continue;if(json===JSON.stringify(x))return true;}
-return false;}
-equals(other){if(!(other instanceof GenericSet))return false;if(this.size!==other.size)return false;for(const value of this){if(!other.has(value))return false;}
-return true;}
-get hashKey(){if(this.has_objects_)return undefined;if(this.hash_key_!==undefined){return this.hash_key_;}
-let key='';for(const value of Array.from(this.values_.values()).sort()){key+=value;}
-this.hash_key_=key;return key;}
-serialize(serializer){const i=[...this].map(x=>serializer.getOrAllocateId(x));return(i.length===1)?i[0]:i;}
-asDictInto_(d){d.values=Array.from(this);}
-static deserialize(data,deserializer){if(!(data instanceof Array)){data=[data];}
-return new GenericSet(data.map(datum=>deserializer.getObject(datum)));}
-static fromDict(d){return new GenericSet(d.values);}
-clone(){return new GenericSet(this.values_);}
-canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof GenericSet;}
-addDiagnostic(otherDiagnostic){const jsons=new Set();for(const value of this){if(typeof value!=='object')continue;jsons.add(stableStringify(value));}
-for(const value of otherDiagnostic){if(typeof value==='object'){if(jsons.has(stableStringify(value))){continue;}
-this.has_objects_=true;}
-this.values_.add(value);}}}
-tr.v.d.Diagnostic.register(GenericSet,{elementName:'tr-v-ui-generic-set-span'});return{GenericSet,};});'use strict';tr.exportTo('tr.v.d',function(){class EventRef{constructor(event){this.stableId=event.stableId;this.title=event.title;this.start=event.start;this.duration=event.duration;this.end=this.start+this.duration;this.guid=tr.b.GUID.allocateSimple();}}
-return{EventRef,};});'use strict';tr.exportTo('tr.v.d',function(){class RelatedEventSet extends tr.v.d.Diagnostic{constructor(opt_events){super();this.eventsByStableId_=new Map();this.canonicalUrl_=undefined;if(opt_events){if(opt_events instanceof tr.model.EventSet||opt_events instanceof Array){for(const event of opt_events){this.add(event);}}else{this.add(opt_events);}}}
-clone(){const clone=new tr.v.d.CollectedRelatedEventSet();clone.addDiagnostic(this);return clone;}
-equals(other){if(this.length!==other.length)return false;for(const event of this){if(!other.has(event))return false;}
-return true;}
-add(event){this.eventsByStableId_.set(event.stableId,event);}
-has(event){return this.eventsByStableId_.has(event.stableId);}
-get length(){return this.eventsByStableId_.size;}*[Symbol.iterator](){for(const event of this.eventsByStableId_.values()){yield event;}}
-get canonicalUrl(){return this.canonicalUrl_;}
-resolve(model,opt_required){for(const[stableId,value]of this.eventsByStableId_){if(!(value instanceof tr.v.d.EventRef))continue;const event=model.getEventByStableId(stableId);if(event instanceof tr.model.Event){this.eventsByStableId_.set(stableId,event);}else if(opt_required){throw new Error('Unable to find Event '+stableId);}}}
-serialize(serializer){return[...this].map(event=>[event.stableId,serializer.getOrAllocateId(event.title),event.start,event.duration,]);}
-asDictInto_(d){d.events=[];for(const event of this){d.events.push({stableId:event.stableId,title:event.title,start:tr.b.Unit.byName.timeStampInMs.truncate(event.start),duration:tr.b.Unit.byName.timeDurationInMs.truncate(event.duration),});}}
-static deserialize(data,deserializer){return new RelatedEventSet(data.map(event=>new tr.v.d.EventRef({stableId:event[0],title:deserializer.getObject(event[1]),start:event[2],duration:event[3],})));}
-static fromDict(d){return new RelatedEventSet(d.events.map(event=>new tr.v.d.EventRef(event)));}}
-tr.v.d.Diagnostic.register(RelatedEventSet,{elementName:'tr-v-ui-related-event-set-span'});return{RelatedEventSet,};});'use strict';tr.exportTo('tr.v.d',function(){class RelatedNameMap extends tr.v.d.Diagnostic{constructor(opt_info){super();this.map_=new Map();if(opt_info){for(const[key,name]of Object.entries(opt_info)){this.set(key,name);}}}
-clone(){const clone=new RelatedNameMap();clone.addDiagnostic(this);return clone;}
-equals(other){if(!(other instanceof RelatedNameMap))return false;const keys1=new Set(this.map_.keys());const keys2=new Set(other.map_.keys());if(!tr.b.setsEqual(keys1,keys2))return false;for(const[key,name]of this){if(name!==other.get(key))return false;}
-return true;}
-canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof RelatedNameMap;}
-addDiagnostic(otherDiagnostic){for(const[key,name]of otherDiagnostic){const existing=this.get(key);if(existing===undefined){this.set(key,name);}else if(existing!==name){throw new Error('Histogram names differ: '+`"${existing}" != "${name}"`);}}}
-serialize(serializer){const keys=[...this.map_.keys()];keys.sort();const names=keys.map(k=>serializer.getOrAllocateId(this.get(k)));const keysId=serializer.getOrAllocateId(keys.map(k=>serializer.getOrAllocateId(k)));return[keysId,...names];}
-asDictInto_(d){d.names={};for(const[key,name]of this)d.names[key]=name;}
-set(key,name){this.map_.set(key,name);}
-get(key){return this.map_.get(key);}*[Symbol.iterator](){for(const pair of this.map_)yield pair;}*values(){for(const value of this.map_.values())yield value;}
-static fromEntries(entries){const names=new RelatedNameMap();for(const[key,name]of entries){names.set(key,name);}
-return names;}
-static deserialize(data,deserializer){const names=new RelatedNameMap();const keys=deserializer.getObject(data[0]);for(let i=0;i<keys.length;++i){names.set(deserializer.getObject(keys[i]),deserializer.getObject(data[i+1]));}
-return names;}
-static fromDict(d){return RelatedNameMap.fromEntries(Object.entries(d.names||{}));}}
-tr.v.d.Diagnostic.register(RelatedNameMap,{elementName:'tr-v-ui-related-name-map-span',});return{RelatedNameMap,};});'use strict';tr.exportTo('tr.v.d',function(){class Scalar extends tr.v.d.Diagnostic{constructor(value){super();if(!(value instanceof tr.b.Scalar)){throw new Error('expected Scalar');}
-this.value=value;}
-clone(){return new Scalar(this.value);}
-serialize(serializer){return this.value.asDict();}
-asDictInto_(d){d.value=this.value.asDict();}
-static deserialize(value,deserializer){return Scalar.fromDict({value});}
-static fromDict(d){return new Scalar(tr.b.Scalar.fromDict(d.value));}}
-tr.v.d.Diagnostic.register(Scalar,{elementName:'tr-v-ui-scalar-diagnostic-span'});return{Scalar,};});'use strict';tr.exportTo('tr.v.d',function(){class UnmergeableDiagnosticSet extends tr.v.d.Diagnostic{constructor(diagnostics){super();this._diagnostics=diagnostics;}
-clone(){const clone=new tr.v.d.UnmergeableDiagnosticSet();clone.addDiagnostic(this);return clone;}
-canAddDiagnostic(otherDiagnostic){return true;}
-addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof UnmergeableDiagnosticSet){for(const subOtherDiagnostic of otherDiagnostic){const clone=subOtherDiagnostic.clone();this.addDiagnostic(clone);}
-return;}
-for(let i=0;i<this._diagnostics.length;++i){if(this._diagnostics[i].canAddDiagnostic(otherDiagnostic)){this._diagnostics[i].addDiagnostic(otherDiagnostic);return;}}
-const clone=otherDiagnostic.clone();this._diagnostics.push(clone);}
-get length(){return this._diagnostics.length;}*[Symbol.iterator](){for(const diagnostic of this._diagnostics)yield diagnostic;}
-asDictInto_(d){d.diagnostics=this._diagnostics.map(d=>d.asDictOrReference());}
-static deserialize(data,deserializer){return new UnmergeableDiagnosticSet(d.map(i=>deserializer.getDiagnostic(i).diagnostic));}
-serialize(serializer){return this._diagnostics.map(d=>serializer.getOrAllocateDiagnosticId('',d));}
-static fromDict(d){return new UnmergeableDiagnosticSet(d.diagnostics.map(d=>((typeof d==='string')?new tr.v.d.DiagnosticRef(d):tr.v.d.Diagnostic.fromDict(d))));}}
-tr.v.d.Diagnostic.register(UnmergeableDiagnosticSet,{elementName:'tr-v-ui-unmergeable-diagnostic-set-span'});return{UnmergeableDiagnosticSet,};});'use strict';tr.exportTo('tr.v.d',function(){const RESERVED_INFOS={ALERT_GROUPING:{name:'alertGrouping',type:tr.v.d.GenericSet},ANGLE_REVISIONS:{name:'angleRevisions',type:tr.v.d.GenericSet},ARCHITECTURES:{name:'architectures',type:tr.v.d.GenericSet},BENCHMARKS:{name:'benchmarks',type:tr.v.d.GenericSet},BENCHMARK_START:{name:'benchmarkStart',type:tr.v.d.DateRange},BENCHMARK_DESCRIPTIONS:{name:'benchmarkDescriptions',type:tr.v.d.GenericSet},BOTS:{name:'bots',type:tr.v.d.GenericSet},BUG_COMPONENTS:{name:'bugComponents',type:tr.v.d.GenericSet},BUILDS:{name:'builds',type:tr.v.d.GenericSet},CATAPULT_REVISIONS:{name:'catapultRevisions',type:tr.v.d.GenericSet},CHROMIUM_COMMIT_POSITIONS:{name:'chromiumCommitPositions',type:tr.v.d.GenericSet},CHROMIUM_REVISIONS:{name:'chromiumRevisions',type:tr.v.d.GenericSet},DESCRIPTION:{name:'description',type:tr.v.d.GenericSet},DEVICE_IDS:{name:'deviceIds',type:tr.v.d.GenericSet},DOCUMENTATION_URLS:{name:'documentationLinks',type:tr.v.d.GenericSet},INFO_BLURB:{name:'infoBlurb',type:tr.v.d.GenericSet},FUCHSIA_GARNET_REVISIONS:{name:'fuchsiaGarnetRevisions',type:tr.v.d.GenericSet},FUCHSIA_PERIDOT_REVISIONS:{name:'fuchsiaPeridotRevisions',type:tr.v.d.GenericSet},FUCHSIA_TOPAZ_REVISIONS:{name:'fuchsiaTopazRevisions',type:tr.v.d.GenericSet},FUCHSIA_ZIRCON_REVISIONS:{name:'fuchsiaZirconRevisions',type:tr.v.d.GenericSet},GPUS:{name:'gpus',type:tr.v.d.GenericSet},IS_REFERENCE_BUILD:{name:'isReferenceBuild',type:tr.v.d.GenericSet},LABELS:{name:'labels',type:tr.v.d.GenericSet},LOG_URLS:{name:'logUrls',type:tr.v.d.GenericSet},MASTERS:{name:'masters',type:tr.v.d.GenericSet},MEMORY_AMOUNTS:{name:'memoryAmounts',type:tr.v.d.GenericSet},OS_NAMES:{name:'osNames',type:tr.v.d.GenericSet},OS_VERSIONS:{name:'osVersions',type:tr.v.d.GenericSet},OWNERS:{name:'owners',type:tr.v.d.GenericSet},POINT_ID:{name:'pointId',type:tr.v.d.GenericSet},PRODUCT_VERSIONS:{name:'productVersions',type:tr.v.d.GenericSet},REVISION_TIMESTAMPS:{name:'revisionTimestamps',type:tr.v.d.DateRange},SKIA_REVISIONS:{name:'skiaRevisions',type:tr.v.d.GenericSet},STATISTICS_NAMES:{name:'statisticsNames',type:tr.v.d.GenericSet},STORIES:{name:'stories',type:tr.v.d.GenericSet},STORYSET_REPEATS:{name:'storysetRepeats',type:tr.v.d.GenericSet},STORY_TAGS:{name:'storyTags',type:tr.v.d.GenericSet},SUMMARY_KEYS:{name:'summaryKeys',type:tr.v.d.GenericSet},TEST_PATH:{name:'testPath',type:tr.v.d.GenericSet},TRACE_START:{name:'traceStart',type:tr.v.d.DateRange},TRACE_URLS:{name:'traceUrls',type:tr.v.d.GenericSet},V8_COMMIT_POSITIONS:{name:'v8CommitPositions',type:tr.v.d.DateRange},V8_REVISIONS:{name:'v8Revisions',type:tr.v.d.GenericSet},WEBRTC_REVISIONS:{name:'webrtcRevisions',type:tr.v.d.GenericSet},WEBRTC_INTERNAL_REVISIONS:{name:'webrtcInternalRevisions',type:tr.v.d.GenericSet},};const RESERVED_NAMES={};const RESERVED_NAMES_TO_TYPES=new Map();for(const[codename,info]of Object.entries(RESERVED_INFOS)){RESERVED_NAMES[codename]=info.name;if(RESERVED_NAMES_TO_TYPES.has(info.name)){throw new Error(`Duplicate reserved name "${info.name}"`);}
-RESERVED_NAMES_TO_TYPES.set(info.name,info.type);}
-const RESERVED_NAMES_SET=new Set(Object.values(RESERVED_NAMES));return{RESERVED_INFOS,RESERVED_NAMES,RESERVED_NAMES_SET,RESERVED_NAMES_TO_TYPES,};});'use strict';tr.exportTo('tr.v.d',function(){class DiagnosticMap extends Map{constructor(opt_allowReservedNames){super();if(opt_allowReservedNames===undefined){opt_allowReservedNames=true;}
-this.allowReservedNames_=opt_allowReservedNames;}
-set(name,diagnostic){if(typeof(name)!=='string'){throw new Error(`name must be string, not ${name}`);}
-if(!(diagnostic instanceof tr.v.d.Diagnostic)&&!(diagnostic instanceof tr.v.d.DiagnosticRef)){throw new Error(`Must be instanceof Diagnostic: ${diagnostic}`);}
-if(!this.allowReservedNames_&&tr.v.d.RESERVED_NAMES_SET.has(name)&&!(diagnostic instanceof tr.v.d.UnmergeableDiagnosticSet)&&!(diagnostic instanceof tr.v.d.DiagnosticRef)){const type=tr.v.d.RESERVED_NAMES_TO_TYPES.get(name);if(type&&!(diagnostic instanceof type)){throw new Error(`Diagnostics named "${name}" must be ${type.name}, `+`not ${diagnostic.constructor.name}`);}}
-Map.prototype.set.call(this,name,diagnostic);}
-delete(name){if(name===undefined)throw new Error('missing name');Map.prototype.delete.call(this,name);}
-deserializeAdd(data,deserializer){for(const id of data){const{name,diagnostic}=deserializer.getDiagnostic(id);this.set(name,diagnostic);}}
-addDicts(dict){for(const[name,diagnosticDict]of Object.entries(dict)){if(name==='tagmap')continue;if(typeof diagnosticDict==='string'){this.set(name,new tr.v.d.DiagnosticRef(diagnosticDict));}else if(diagnosticDict.type!=='RelatedHistogramMap'&&diagnosticDict.type!=='RelatedHistogramBreakdown'&&diagnosticDict.type!=='TagMap'){this.set(name,tr.v.d.Diagnostic.fromDict(diagnosticDict));}}}
-resolveSharedDiagnostics(histograms,opt_required){for(const[name,value]of this){if(!(value instanceof tr.v.d.DiagnosticRef)){continue;}
-const guid=value.guid;const diagnostic=histograms.lookupDiagnostic(guid);if(diagnostic instanceof tr.v.d.Diagnostic){this.set(name,diagnostic);}else if(opt_required){throw new Error('Unable to find shared Diagnostic '+guid);}}}
-serialize(serializer){const data=[];for(const[name,diagnostic]of this){data.push(serializer.getOrAllocateDiagnosticId(name,diagnostic));}
-return data;}
-asDict(){const dict={};for(const[name,diagnostic]of this){dict[name]=diagnostic.asDictOrReference();}
-return dict;}
-static deserialize(data,deserializer){const diagnostics=new DiagnosticMap();diagnostics.deserializeAdd(data,deserializer);return diagnostics;}
-static fromDict(d){const diagnostics=new DiagnosticMap();diagnostics.addDicts(d);return diagnostics;}
-static fromObject(obj){const diagnostics=new DiagnosticMap();if(!(obj instanceof Map))obj=Object.entries(obj);for(const[name,diagnostic]of obj){if(!diagnostic)continue;diagnostics.set(name,diagnostic);}
-return diagnostics;}
-addDiagnostics(other){for(const[name,otherDiagnostic]of other){const myDiagnostic=this.get(name);if(myDiagnostic!==undefined&&myDiagnostic.canAddDiagnostic(otherDiagnostic)){myDiagnostic.addDiagnostic(otherDiagnostic);continue;}
-const clone=otherDiagnostic.clone();if(myDiagnostic===undefined){this.set(name,clone);continue;}
-this.set(name,new tr.v.d.UnmergeableDiagnosticSet([myDiagnostic,clone]));}}}
-return{DiagnosticMap};});'use strict';tr.exportTo('tr.v',function(){const MAX_DIAGNOSTIC_MAPS=16;const DEFAULT_SAMPLE_VALUES_PER_BIN=10;const DEFAULT_REBINNED_COUNT=40;const DEFAULT_BOUNDARIES_FOR_UNIT=new Map();const DEFAULT_ITERATION_FOR_BOOTSTRAP_RESAMPLING=500;const DELTA=String.fromCharCode(916);const Z_SCORE_NAME='z-score';const P_VALUE_NAME='p-value';const U_STATISTIC_NAME='U';function percentToString(percent,opt_force3){if(percent<0||percent>1){throw new Error('percent must be in [0,1]');}
-if(percent===0)return'000';if(percent===1)return'100';let str=percent.toString();if(str[1]!=='.'){throw new Error('Unexpected percent');}
-str=str+'0'.repeat(Math.max(4-str.length,0));if(str.length>4){if(opt_force3){str=str.slice(0,4);}else{str=str.slice(0,4)+'_'+str.slice(4);}}
-return'0'+str.slice(2);}
-function percentFromString(s){return parseFloat(s[0]+'.'+s.substr(1).replace(/_/g,''));}
-class HistogramBin{constructor(range){this.range=range;this.count=0;this.diagnosticMaps=[];}
-addSample(value){this.count+=1;}
-addDiagnosticMap(diagnostics){tr.b.math.Statistics.uniformlySampleStream(this.diagnosticMaps,this.count,diagnostics,MAX_DIAGNOSTIC_MAPS);}
-addBin(other){if(!this.range.equals(other.range)){throw new Error('Merging incompatible Histogram bins.');}
-tr.b.math.Statistics.mergeSampledStreams(this.diagnosticMaps,this.count,other.diagnosticMaps,other.count,MAX_DIAGNOSTIC_MAPS);this.count+=other.count;}
-deserialize(data,deserializer){if(!(data instanceof Array)){this.count=data;return;}
-this.count=data[0];for(const sample of data.slice(1)){if(!(sample instanceof Array))continue;this.diagnosticMaps.push(tr.v.d.DiagnosticMap.deserialize(sample.slice(1),deserializer));}}
-fromDict(dict){this.count=dict[0];if(dict.length>1){for(const map of dict[1]){this.diagnosticMaps.push(tr.v.d.DiagnosticMap.fromDict(map));}}}
-serialize(serializer){if(!this.diagnosticMaps.length){return this.count;}
-return[this.count,...this.diagnosticMaps.map(d=>[undefined,...d.serialize(serializer)])];}
-asDict(){if(!this.diagnosticMaps.length){return[this.count];}
-return[this.count,this.diagnosticMaps.map(d=>d.asDict())];}}
-const DEFAULT_SUMMARY_OPTIONS=new Map([['avg',true],['count',true],['geometricMean',false],['max',true],['min',true],['nans',false],['std',true],['sum',true],]);class Histogram{constructor(name,unit,opt_binBoundaries){if(!(unit instanceof tr.b.Unit)){throw new Error('unit must be a Unit: '+unit);}
-let binBoundaries=opt_binBoundaries;if(!binBoundaries){const baseUnit=unit.baseUnit?unit.baseUnit:unit;binBoundaries=DEFAULT_BOUNDARIES_FOR_UNIT.get(baseUnit.unitName);}
-this.binBoundariesDict_=binBoundaries.asDict();this.allBins=binBoundaries.bins.slice();this.description='';const allowReservedNames=false;this.diagnostics_=new tr.v.d.DiagnosticMap(allowReservedNames);this.maxNumSampleValues_=this.defaultMaxNumSampleValues_;this.name_=name;this.nanDiagnosticMaps=[];this.numNans=0;this.running_=undefined;this.sampleValues_=[];this.sampleMeans_=[];this.summaryOptions=new Map(DEFAULT_SUMMARY_OPTIONS);this.summaryOptions.set('percentile',[]);this.summaryOptions.set('iprs',[]);this.summaryOptions.set('ci',[]);this.unit=unit;}
-static create(name,unit,samples,opt_options){const options=opt_options||{};const hist=new Histogram(name,unit,options.binBoundaries);if(options.alertGrouping!==undefined){hist.setAlertGrouping(options.alertGrouping);}
-if(options.description)hist.description=options.description;if(options.summaryOptions){let summaryOptions=options.summaryOptions;if(!(summaryOptions instanceof Map)){summaryOptions=Object.entries(summaryOptions);}
-for(const[name,value]of summaryOptions){hist.summaryOptions.set(name,value);}}
-if(options.diagnostics!==undefined){let diagnostics=options.diagnostics;if(!(diagnostics instanceof Map)){diagnostics=Object.entries(diagnostics);}
-for(const[name,diagnostic]of diagnostics){if(!diagnostic)continue;hist.diagnostics.set(name,diagnostic);}}
-if(!(samples instanceof Array))samples=[samples];for(const sample of samples){if(typeof sample==='object'){hist.addSample(sample.value,sample.diagnostics);}else{hist.addSample(sample);}}
-return hist;}
-get diagnostics(){return this.diagnostics_;}
-setAlertGrouping(alertGrouping){if(alertGrouping===undefined||alertGrouping===null||alertGrouping.length===undefined){throw Error('alertGrouping must be an array');}
-for(const alertGroup of alertGrouping){if(!Object.values(tr.v.d.ALERT_GROUPS).includes(alertGroup)){throw Error(`Alert group ${alertGroup} must be added to `+'/tracing/value/diagnostics/alert_groups.html');}}
-this.diagnostics.set(tr.v.d.RESERVED_NAMES.ALERT_GROUPING,new tr.v.d.GenericSet(alertGrouping));}
-get running(){return this.running_;}
-get maxNumSampleValues(){return this.maxNumSampleValues_;}
-set maxNumSampleValues(n){this.maxNumSampleValues_=n;tr.b.math.Statistics.uniformlySampleArray(this.sampleValues_,this.maxNumSampleValues_);}
-get name(){return this.name_;}
-deserializeStatistics_(){const statisticsNames=this.diagnostics.get(tr.v.d.RESERVED_NAMES.STATISTICS_NAMES);if(!statisticsNames)return;for(const statName of statisticsNames){if(statName.startsWith('pct_')){const percent=percentFromString(statName.substr(4));this.summaryOptions.get('percentile').push(percent);}else if(statName.startsWith('ipr_')){const lower=percentFromString(statName.substr(4,3));const upper=percentFromString(statName.substr(8));this.summaryOptions.get('iprs').push(tr.b.math.Range.fromExplicitRange(lower,upper));}else if(statName.startsWith('ci_')){const percent=percentFromString(statName.replace('_lower','').replace('_upper','').substr(3));if(!this.summaryOptions.get('ci').includes(percent)){this.summaryOptions.get('ci').push(percent);}}}
-for(const statName of this.summaryOptions.keys()){if(statName==='percentile'||statName==='iprs'||statName==='ci'){continue;}
-this.summaryOptions.set(statName,statisticsNames.has(statName));}}
-deserializeBin_(i,bin,deserializer){this.allBins[i]=new HistogramBin(this.allBins[i].range);this.allBins[i].deserialize(bin,deserializer);if(!(bin instanceof Array))return;for(let sample of bin.slice(1)){if(sample instanceof Array){sample=sample[0];}
-this.sampleValues_.push(sample);}}
-deserializeBins_(bins,deserializer){if(bins instanceof Array){for(let i=0;i<bins.length;++i){this.deserializeBin_(i,bins[i],deserializer);}}else{for(const[i,binData]of Object.entries(bins)){this.deserializeBin_(i,binData,deserializer);}}}
-static deserialize(data,deserializer){const[name,unit,boundaries,diagnostics,running,bins,nanBin]=data;const hist=new Histogram(deserializer.getObject(name),tr.b.Unit.fromJSON(unit),HistogramBinBoundaries.fromDict(deserializer.getObject(boundaries)));hist.diagnostics.deserializeAdd(diagnostics,deserializer);const description=hist.diagnostics.get(tr.v.d.RESERVED_NAMES.DESCRIPTION);if(description&&description.length){hist.description=[...description][0];}
-hist.deserializeStatistics_();if(running){hist.running_=tr.b.math.RunningStatistics.fromDict(running);}
-if(bins){hist.deserializeBins_(bins,deserializer);}
-if(nanBin){if(!(nanBin instanceof Array)){hist.numNans=nanBin;}else{hist.numNans=nanBin[0];for(const sample of nanBin.slice(1)){if(!(sample instanceof Array))continue;hist.nanDiagnosticMaps.push(tr.v.d.DiagnosticMap.deserialize(sample.slice(1),deserializer));}}}
-return hist;}
-static fromDict(dict){const hist=new Histogram(dict.name,tr.b.Unit.fromJSON(dict.unit),HistogramBinBoundaries.fromDict(dict.binBoundaries));if(dict.description){hist.description=dict.description;}
-if(dict.diagnostics){hist.diagnostics.addDicts(dict.diagnostics);}
-if(dict.allBins){if(dict.allBins.length!==undefined){for(let i=0;i<dict.allBins.length;++i){hist.allBins[i]=new HistogramBin(hist.allBins[i].range);hist.allBins[i].fromDict(dict.allBins[i]);}}else{for(const[i,binDict]of Object.entries(dict.allBins)){if(i>=hist.allBins.length||i<0){throw new Error('Invalid index "'+i+'" out of bounds of [0..'+hist.allBins.length+')');}
-hist.allBins[i]=new HistogramBin(hist.allBins[i].range);hist.allBins[i].fromDict(binDict);}}}
-if(dict.running){hist.running_=tr.b.math.RunningStatistics.fromDict(dict.running);}
-if(dict.summaryOptions){if(dict.summaryOptions.iprs){dict.summaryOptions.iprs=dict.summaryOptions.iprs.map(r=>tr.b.math.Range.fromExplicitRange(r[0],r[1]));}
-hist.customizeSummaryOptions(dict.summaryOptions);}
-if(dict.maxNumSampleValues!==undefined){hist.maxNumSampleValues=dict.maxNumSampleValues;}
-if(dict.sampleValues){hist.sampleValues_=dict.sampleValues;}
-if(dict.numNans){hist.numNans=dict.numNans;}
-if(dict.nanDiagnostics){for(const map of dict.nanDiagnostics){hist.nanDiagnosticMaps.push(tr.v.d.DiagnosticMap.fromDict(map));}}
-return hist;}
-get numValues(){return this.running_?this.running_.count:0;}
-get average(){return this.running_?this.running_.mean:undefined;}
-get standardDeviation(){return this.running_?this.running_.stddev:undefined;}
-get geometricMean(){return this.running_?this.running_.geometricMean:0;}
-get sum(){return this.running_?this.running_.sum:0;}
-get min(){return this.running_?this.running_.min:Infinity;}
-get max(){return this.running_?this.running_.max:-Infinity;}
-getDifferenceSignificance(other,opt_alpha){if(this.unit!==other.unit){throw new Error('Cannot compare Histograms with different units');}
-if(this.unit.improvementDirection===tr.b.ImprovementDirection.DONT_CARE){return tr.b.math.Statistics.Significance.DONT_CARE;}
-if(!(other instanceof Histogram)){throw new Error('Unable to compute a p-value');}
-const testResult=tr.b.math.Statistics.mwu(this.sampleValues,other.sampleValues,opt_alpha);return testResult.significance;}
-getApproximatePercentile(percent){if(percent<0||percent>1){throw new Error('percent must be in [0,1]');}
-if(this.numValues===0)return undefined;if(this.allBins.length===1){const sortedSampleValues=this.sampleValues.slice().sort((x,y)=>x-y);return sortedSampleValues[Math.floor((sortedSampleValues.length-1)*percent)];}
-let valuesToSkip=Math.floor((this.numValues-1)*percent);for(const bin of this.allBins){valuesToSkip-=bin.count;if(valuesToSkip>=0)continue;if(bin.range.min===-Number.MAX_VALUE){return bin.range.max;}
-if(bin.range.max===Number.MAX_VALUE){return bin.range.min;}
-return bin.range.center;}
-return this.allBins[this.allBins.length-1].range.min;}
-getBinIndexForValue(value){const i=tr.b.findFirstTrueIndexInSortedArray(this.allBins,b=>value<b.range.max);if(0<=i&&i<this.allBins.length)return i;return this.allBins.length-1;}
-getBinForValue(value){return this.allBins[this.getBinIndexForValue(value)];}
-addSample(value,opt_diagnostics){if(opt_diagnostics){if(!(opt_diagnostics instanceof tr.v.d.DiagnosticMap)){opt_diagnostics=tr.v.d.DiagnosticMap.fromObject(opt_diagnostics);}
-for(const[name,diag]of opt_diagnostics){if(diag instanceof tr.v.d.Breakdown){diag.truncate(this.unit);}}}
-if(typeof(value)!=='number'||isNaN(value)){this.numNans++;if(opt_diagnostics){tr.b.math.Statistics.uniformlySampleStream(this.nanDiagnosticMaps,this.numNans,opt_diagnostics,MAX_DIAGNOSTIC_MAPS);}}else{if(this.running_===undefined){this.running_=new tr.b.math.RunningStatistics();}
-this.sampleMeans_=[];this.running_.add(value);value=this.unit.truncate(value);const binIndex=this.getBinIndexForValue(value);let bin=this.allBins[binIndex];if(bin.count===0){bin=new HistogramBin(bin.range);this.allBins[binIndex]=bin;}
-bin.addSample(value);if(opt_diagnostics){bin.addDiagnosticMap(opt_diagnostics);}}
-tr.b.math.Statistics.uniformlySampleStream(this.sampleValues_,this.numValues+this.numNans,value,this.maxNumSampleValues);}
-resampleMean_(percent){const filteredSamples=this.sampleValues_.filter(value=>typeof(value)==='number'&&!isNaN(value));const sampleCount=filteredSamples.length;if(sampleCount===0||percent<=0.0||percent>=1.0){return[undefined,undefined];}else if(sampleCount===1){return[filteredSamples[0],filteredSamples[0]];}
-const iterations=DEFAULT_ITERATION_FOR_BOOTSTRAP_RESAMPLING;if(this.sampleMeans_.length!==iterations){this.sampleMeans_=[];for(let i=0;i<iterations;i++){let tempSum=0.0;for(let j=0;j<sampleCount;j++){tempSum+=filteredSamples[Math.floor(Math.random()*sampleCount)];}
-this.sampleMeans_.push(tempSum/sampleCount);}
-this.sampleMeans_.sort((a,b)=>a-b);}
-return[this.sampleMeans_[Math.floor((iterations-1)*(0.5-percent/2))],this.sampleMeans_[Math.ceil((iterations-1)*(0.5+percent/2))],];}
-sampleValuesInto(samples){for(const sampleValue of this.sampleValues){samples.push(sampleValue);}}
-canAddHistogram(other){if(this.unit!==other.unit){return false;}
-if(this.binBoundariesDict_===other.binBoundariesDict_){return true;}
-if(!this.binBoundariesDict_||!other.binBoundariesDict_){return true;}
-if(this.binBoundariesDict_.length!==other.binBoundariesDict_.length){return false;}
-for(let i=0;i<this.binBoundariesDict_.length;++i){const slice=this.binBoundariesDict_[i];const otherSlice=other.binBoundariesDict_[i];if(slice instanceof Array){if(!(otherSlice instanceof Array)){return false;}
-if(slice[0]!==otherSlice[0]||!tr.b.math.approximately(slice[1],otherSlice[1])||slice[2]!==otherSlice[2]){return false;}}else{if(otherSlice instanceof Array){return false;}
-if(!tr.b.math.approximately(slice,otherSlice)){return false;}}}
-return true;}
-addHistogram(other){if(!this.canAddHistogram(other)){throw new Error('Merging incompatible Histograms');}
-if(!!this.binBoundariesDict_===!!other.binBoundariesDict_){for(let i=0;i<this.allBins.length;++i){let bin=this.allBins[i];if(bin.count===0){bin=new HistogramBin(bin.range);this.allBins[i]=bin;}
-bin.addBin(other.allBins[i]);}}else{const[multiBin,singleBin]=this.binBoundariesDict_?[this,other]:[other,this];for(const value of singleBin.sampleValues){if(typeof(value)!=='number'||isNaN(value)){continue;}
-const binIndex=multiBin.getBinIndexForValue(value);let bin=multiBin.allBins[binIndex];if(bin.count===0){bin=new HistogramBin(bin.range);multiBin.allBins[binIndex]=bin;}
-bin.addSample(value);}}
-tr.b.math.Statistics.mergeSampledStreams(this.nanDiagnosticMaps,this.numNans,other.nanDiagnosticMaps,other.numNans,MAX_DIAGNOSTIC_MAPS);tr.b.math.Statistics.mergeSampledStreams(this.sampleValues,this.numValues+this.numNans,other.sampleValues,other.numValues+other.numNans,(this.maxNumSampleValues+other.maxNumSampleValues)/2);this.numNans+=other.numNans;if(other.running_!==undefined){if(this.running_===undefined){this.running_=new tr.b.math.RunningStatistics();}
-this.running_=this.running_.merge(other.running_);}
-this.sampleMeans_=[];this.diagnostics.addDiagnostics(other.diagnostics);for(const[stat,option]of other.summaryOptions){if(stat==='percentile'){const percentiles=this.summaryOptions.get(stat);for(const percent of option){if(!percentiles.includes(percent))percentiles.push(percent);}}else if(stat==='iprs'){const thisIprs=this.summaryOptions.get(stat);for(const ipr of option){let found=false;for(const thisIpr of thisIprs){found=ipr.equals(thisIpr);if(found)break;}
-if(!found)thisIprs.push(ipr);}}else if(stat==='ci'){const CIs=this.summaryOptions.get(stat);for(const CI of option){if(!CIs.includes(CI))CIs.push(CI);}}else if(option&&!this.summaryOptions.get(stat)){this.summaryOptions.set(stat,true);}}}
-customizeSummaryOptions(summaryOptions){for(const[key,value]of Object.entries(summaryOptions)){this.summaryOptions.set(key,value);}}
-getStatisticScalar(statName,opt_referenceHistogram,opt_mwu){if(statName==='avg'){if(typeof(this.average)!=='number')return undefined;return new tr.b.Scalar(this.unit,this.average);}
-if(statName==='std'){if(typeof(this.standardDeviation)!=='number')return undefined;return new tr.b.Scalar(this.unit,this.standardDeviation);}
-if(statName==='geometricMean'){if(typeof(this.geometricMean)!=='number')return undefined;return new tr.b.Scalar(this.unit,this.geometricMean);}
-if(statName==='min'||statName==='max'||statName==='sum'){if(this.running_===undefined){this.running_=new tr.b.math.RunningStatistics();}
-if(typeof(this.running_[statName])!=='number')return undefined;return new tr.b.Scalar(this.unit,this.running_[statName]);}
-if(statName==='nans'){return new tr.b.Scalar(tr.b.Unit.byName.count_smallerIsBetter,this.numNans);}
-if(statName==='count'){return new tr.b.Scalar(tr.b.Unit.byName.count_smallerIsBetter,this.numValues);}
-if(statName.substr(0,4)==='pct_'){if(this.numValues===0)return undefined;const percent=percentFromString(statName.substr(4));const percentile=this.getApproximatePercentile(percent);if(typeof(percentile)!=='number')return undefined;return new tr.b.Scalar(this.unit,percentile);}
-if(statName.substr(0,3)==='ci_'){const percent=percentFromString(statName.substr(3,3));const[lowCI,highCI]=this.resampleMean_(percent);if(statName.substr(7)==='lower'){if(typeof(lowCI)!=='number')return undefined;return new tr.b.Scalar(this.unit,lowCI);}else if(statName.substr(7)==='upper'){if(typeof(highCI)!=='number')return undefined;return new tr.b.Scalar(this.unit,highCI);}
-if(typeof(highCI)!=='number'||typeof(lowCI)!=='number'){return undefined;}
-return new tr.b.Scalar(this.unit,highCI-lowCI);}
-if(statName.substr(0,4)==='ipr_'){let lower=percentFromString(statName.substr(4,3));let upper=percentFromString(statName.substr(8));if(lower>=upper){throw new Error('Invalid inter-percentile range: '+statName);}
-lower=this.getApproximatePercentile(lower);upper=this.getApproximatePercentile(upper);const ipr=upper-lower;if(typeof(ipr)!=='number')return undefined;return new tr.b.Scalar(this.unit,ipr);}
-if(!this.canCompare(opt_referenceHistogram)){throw new Error('Cannot compute '+statName+' when histograms are not comparable');}
-const suffix=tr.b.Unit.nameSuffixForImprovementDirection(this.unit.improvementDirection);const deltaIndex=statName.indexOf(DELTA);if(deltaIndex>=0){const baseStatName=statName.substr(deltaIndex+1);const thisStat=this.getStatisticScalar(baseStatName);const otherStat=opt_referenceHistogram.getStatisticScalar(baseStatName);const deltaValue=thisStat.value-otherStat.value;if(statName[0]==='%'){return new tr.b.Scalar(tr.b.Unit.byName['normalizedPercentageDelta'+suffix],deltaValue/otherStat.value);}
-return new tr.b.Scalar(thisStat.unit.correspondingDeltaUnit,deltaValue);}
-if(statName===Z_SCORE_NAME){return new tr.b.Scalar(tr.b.Unit.byName['sigmaDelta'+suffix],(this.average-opt_referenceHistogram.average)/opt_referenceHistogram.standardDeviation);}
-const mwu=opt_mwu||tr.b.math.Statistics.mwu(this.sampleValues,opt_referenceHistogram.sampleValues);if(statName===P_VALUE_NAME){return new tr.b.Scalar(tr.b.Unit.byName.unitlessNumber,mwu.p);}
-if(statName===U_STATISTIC_NAME){return new tr.b.Scalar(tr.b.Unit.byName.unitlessNumber,mwu.U);}
-throw new Error('Unrecognized statistic name: '+statName);}
-get statisticsNames(){const statisticsNames=new Set();for(const[statName,option]of this.summaryOptions){if(statName==='percentile'){for(const pctile of option){statisticsNames.add('pct_'+tr.v.percentToString(pctile));}}else if(statName==='iprs'){for(const range of option){statisticsNames.add('ipr_'+tr.v.percentToString(range.min,true)+'_'+tr.v.percentToString(range.max,true));}}else if(statName==='ci'){for(const CIpctile of option){const CIpctStr=tr.v.percentToString(CIpctile);statisticsNames.add('ci_'+CIpctStr+'_lower');statisticsNames.add('ci_'+CIpctStr+'_upper');statisticsNames.add('ci_'+CIpctStr);}}else if(option){statisticsNames.add(statName);}}
-return statisticsNames;}
-canCompare(other){return other instanceof Histogram&&this.unit===other.unit&&this.numValues>0&&other.numValues>0;}
-getAvailableStatisticName(statName,opt_referenceHist){if(this.canCompare(opt_referenceHist))return statName;if(statName===Z_SCORE_NAME||statName===P_VALUE_NAME||statName===U_STATISTIC_NAME){return'avg';}
-const deltaIndex=statName.indexOf(DELTA);if(deltaIndex<0)return statName;return statName.substr(deltaIndex+1);}
-static getDeltaStatisticsNames(statNames){const deltaNames=[];for(const statName of statNames){deltaNames.push(`${DELTA}${statName}`);deltaNames.push(`%${DELTA}${statName}`);}
-return deltaNames.concat([Z_SCORE_NAME,P_VALUE_NAME,U_STATISTIC_NAME]);}
-get statisticsScalars(){const results=new Map();for(const statName of this.statisticsNames){const scalar=this.getStatisticScalar(statName);if(scalar===undefined)continue;results.set(statName,scalar);}
-return results;}
-get sampleValues(){return this.sampleValues_;}
-clone(){const binBoundaries=HistogramBinBoundaries.fromDict(this.binBoundariesDict_);const hist=new Histogram(this.name,this.unit,binBoundaries);for(const[stat,option]of this.summaryOptions){if(stat==='percentile'||stat==='iprs'||stat==='ci'){hist.summaryOptions.set(stat,Array.from(option));}else{hist.summaryOptions.set(stat,option);}}
-hist.addHistogram(this);return hist;}
-rebin(newBoundaries){const rebinned=new tr.v.Histogram(this.name,this.unit,newBoundaries);rebinned.description=this.description;for(const sample of this.sampleValues){rebinned.addSample(sample);}
-rebinned.running_=this.running_;for(const[name,diagnostic]of this.diagnostics){rebinned.diagnostics.set(name,diagnostic);}
-for(const[stat,option]of this.summaryOptions){if(stat==='percentile'||stat==='ci'){rebinned.summaryOptions.set(stat,Array.from(option));}else{rebinned.summaryOptions.set(stat,option);}}
-return rebinned;}
-serialize(serializer){let nanBin=this.numNans;if(this.nanDiagnosticMaps.length){nanBin=[nanBin,...this.nanDiagnosticMaps.map(dm=>[undefined,...dm.serialize(serializer)])];}
-this.diagnostics.set(tr.v.d.RESERVED_NAMES.STATISTICS_NAMES,new tr.v.d.GenericSet([...this.statisticsNames].sort()));this.diagnostics.set(tr.v.d.RESERVED_NAMES.DESCRIPTION,new tr.v.d.GenericSet([this.description].sort()));return[serializer.getOrAllocateId(this.name),this.unit.asJSON2(),serializer.getOrAllocateId(this.binBoundariesDict_),this.diagnostics.serialize(serializer),this.running_?this.running_.asDict():0,this.serializeBins_(serializer),nanBin,];}
-asDict(){const dict={};dict.name=this.name;dict.unit=this.unit.asJSON();if(this.binBoundariesDict_!==undefined){dict.binBoundaries=this.binBoundariesDict_;}
-if(this.description){dict.description=this.description;}
-if(this.diagnostics.size){dict.diagnostics=this.diagnostics.asDict();}
-if(this.maxNumSampleValues!==this.defaultMaxNumSampleValues_){dict.maxNumSampleValues=this.maxNumSampleValues;}
-if(this.numNans){dict.numNans=this.numNans;}
-if(this.nanDiagnosticMaps.length){dict.nanDiagnostics=this.nanDiagnosticMaps.map(dm=>dm.asDict());}
-if(this.numValues){dict.sampleValues=this.sampleValues.slice();this.running.truncate(this.unit);dict.running=this.running_.asDict();dict.allBins=this.allBinsAsDict_();}
-const summaryOptions={};let anyOverriddenSummaryOptions=false;for(const[name,value]of this.summaryOptions){let option;if(name==='percentile'){if(value.length===0)continue;option=Array.from(value);}else if(name==='iprs'){if(value.length===0)continue;option=value.map(r=>[r.min,r.max]);}else if(name==='ci'){if(value.length===0)continue;option=Array.from(value);}else if(value===DEFAULT_SUMMARY_OPTIONS.get(name)){continue;}else{option=value;}
-summaryOptions[name]=option;anyOverriddenSummaryOptions=true;}
-if(anyOverriddenSummaryOptions){dict.summaryOptions=summaryOptions;}
-return dict;}
-serializeBins_(serializer){const numBins=this.allBins.length;let emptyBins=0;for(let i=0;i<numBins;++i){if(this.allBins[i].count===0){++emptyBins;}}
-if(emptyBins===numBins){return 0;}
-if(emptyBins>(numBins/2)){const allBinsDict={};for(let i=0;i<numBins;++i){const bin=this.allBins[i];if(bin.count>0){allBinsDict[i]=bin.serialize(serializer);}}
-return allBinsDict;}
-const allBinsArray=[];for(let i=0;i<numBins;++i){allBinsArray.push(this.allBins[i].serialize(serializer));}
-return allBinsArray;}
-allBinsAsDict_(){const numBins=this.allBins.length;let emptyBins=0;for(let i=0;i<numBins;++i){if(this.allBins[i].count===0){++emptyBins;}}
-if(emptyBins===numBins){return undefined;}
-if(emptyBins>(numBins/2)){const allBinsDict={};for(let i=0;i<numBins;++i){const bin=this.allBins[i];if(bin.count>0){allBinsDict[i]=bin.asDict();}}
-return allBinsDict;}
-const allBinsArray=[];for(let i=0;i<numBins;++i){allBinsArray.push(this.allBins[i].asDict());}
-return allBinsArray;}
-get defaultMaxNumSampleValues_(){return DEFAULT_SAMPLE_VALUES_PER_BIN*Math.max(this.allBins.length,DEFAULT_REBINNED_COUNT);}}
-Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS={count:false,max:false,min:false,std:false,sum:false,};const HISTOGRAM_BIN_BOUNDARIES_CACHE=new Map();class HistogramBinBoundaries{static createLinear(min,max,numBins){return new HistogramBinBoundaries(min).addLinearBins(max,numBins);}
-static createExponential(min,max,numBins){return new HistogramBinBoundaries(min).addExponentialBins(max,numBins);}
-static createWithBoundaries(binBoundaries){const builder=new HistogramBinBoundaries(binBoundaries[0]);for(const boundary of binBoundaries.slice(1)){builder.addBinBoundary(boundary);}
-return builder;}
-constructor(minBinBoundary){this.builder_=[minBinBoundary];this.range_=new tr.b.math.Range();this.range_.addValue(minBinBoundary);this.binRanges_=undefined;this.bins_=undefined;}
-get range(){return this.range_;}
-asDict(){if(this.builder_.length===1&&this.builder_[0]===Number.MAX_VALUE){return undefined;}
-return this.builder_;}
-pushBuilderSlice_(slice){this.builder_.push(slice);this.builder_=this.builder_.slice();}
-static fromDict(dict){if(dict===undefined){return HistogramBinBoundaries.SINGULAR;}
-const cacheKey=JSON.stringify(dict);if(HISTOGRAM_BIN_BOUNDARIES_CACHE.has(cacheKey)){return HISTOGRAM_BIN_BOUNDARIES_CACHE.get(cacheKey);}
-const binBoundaries=new HistogramBinBoundaries(dict[0]);for(const slice of dict.slice(1)){if(!(slice instanceof Array)){binBoundaries.addBinBoundary(slice);continue;}
-switch(slice[0]){case HistogramBinBoundaries.SLICE_TYPE.LINEAR:binBoundaries.addLinearBins(slice[1],slice[2]);break;case HistogramBinBoundaries.SLICE_TYPE.EXPONENTIAL:binBoundaries.addExponentialBins(slice[1],slice[2]);break;default:throw new Error('Unrecognized HistogramBinBoundaries slice type');}}
-HISTOGRAM_BIN_BOUNDARIES_CACHE.set(cacheKey,binBoundaries);return binBoundaries;}
-get bins(){if(this.bins_===undefined){this.buildBins_();}
-return this.bins_;}
-buildBins_(){this.bins_=this.binRanges.map(r=>new HistogramBin(r));}
-get binRanges(){if(this.binRanges_===undefined){this.buildBinRanges_();}
-return this.binRanges_;}
-buildBinRanges_(){if(typeof this.builder_[0]!=='number'){throw new Error('Invalid start of builder_');}
-this.binRanges_=[];let prevBoundary=this.builder_[0];if(prevBoundary>-Number.MAX_VALUE){this.binRanges_.push(tr.b.math.Range.fromExplicitRange(-Number.MAX_VALUE,prevBoundary));}
-for(const slice of this.builder_.slice(1)){if(!(slice instanceof Array)){this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,slice));prevBoundary=slice;continue;}
-const nextMaxBinBoundary=slice[1];const binCount=slice[2];const sliceMinBinBoundary=prevBoundary;switch(slice[0]){case HistogramBinBoundaries.SLICE_TYPE.LINEAR:{const binWidth=(nextMaxBinBoundary-prevBoundary)/binCount;for(let i=1;i<binCount;i++){const boundary=sliceMinBinBoundary+i*binWidth;this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,boundary));prevBoundary=boundary;}
-break;}
-case HistogramBinBoundaries.SLICE_TYPE.EXPONENTIAL:{const binExponentWidth=Math.log(nextMaxBinBoundary/prevBoundary)/binCount;for(let i=1;i<binCount;i++){const boundary=sliceMinBinBoundary*Math.exp(i*binExponentWidth);this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,boundary));prevBoundary=boundary;}
-break;}
-default:throw new Error('Unrecognized HistogramBinBoundaries slice type');}
-this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,nextMaxBinBoundary));prevBoundary=nextMaxBinBoundary;}
-if(prevBoundary<Number.MAX_VALUE){this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,Number.MAX_VALUE));}}
-addBinBoundary(nextMaxBinBoundary){if(nextMaxBinBoundary<=this.range.max){throw new Error('The added max bin boundary must be larger than '+'the current max boundary');}
-this.binRanges_=undefined;this.bins_=undefined;this.pushBuilderSlice_(nextMaxBinBoundary);this.range.addValue(nextMaxBinBoundary);return this;}
-addLinearBins(nextMaxBinBoundary,binCount){if(binCount<=0){throw new Error('Bin count must be positive');}
-if(nextMaxBinBoundary<=this.range.max){throw new Error('The new max bin boundary must be greater than '+'the previous max bin boundary');}
-this.binRanges_=undefined;this.bins_=undefined;this.pushBuilderSlice_([HistogramBinBoundaries.SLICE_TYPE.LINEAR,nextMaxBinBoundary,binCount]);this.range.addValue(nextMaxBinBoundary);return this;}
-addExponentialBins(nextMaxBinBoundary,binCount){if(binCount<=0){throw new Error('Bin count must be positive');}
-if(this.range.max<=0){throw new Error('Current max bin boundary must be positive');}
-if(this.range.max>=nextMaxBinBoundary){throw new Error('The last added max boundary must be greater than '+'the current max boundary boundary');}
-this.binRanges_=undefined;this.bins_=undefined;this.pushBuilderSlice_([HistogramBinBoundaries.SLICE_TYPE.EXPONENTIAL,nextMaxBinBoundary,binCount]);this.range.addValue(nextMaxBinBoundary);return this;}}
-HistogramBinBoundaries.SLICE_TYPE={LINEAR:0,EXPONENTIAL:1,};HistogramBinBoundaries.SINGULAR=new HistogramBinBoundaries(Number.MAX_VALUE);DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.timeDurationInMs.unitName,HistogramBinBoundaries.createExponential(1e-3,1e6,1e2));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.timeInMsAutoFormat.unitName,new HistogramBinBoundaries(0).addBinBoundary(1).addExponentialBins(1e3,3).addBinBoundary(tr.b.convertUnit(2,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(5,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(10,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(30,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(tr.b.UnitScale.TIME.MINUTE.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(2*tr.b.convertUnit(tr.b.UnitScale.TIME.MINUTE.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(5*tr.b.convertUnit(tr.b.UnitScale.TIME.MINUTE.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(10*tr.b.convertUnit(tr.b.UnitScale.TIME.MINUTE.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(30*tr.b.convertUnit(tr.b.UnitScale.TIME.MINUTE.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(tr.b.UnitScale.TIME.HOUR.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(2*tr.b.convertUnit(tr.b.UnitScale.TIME.HOUR.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(6*tr.b.convertUnit(tr.b.UnitScale.TIME.HOUR.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(12*tr.b.convertUnit(tr.b.UnitScale.TIME.HOUR.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(tr.b.UnitScale.TIME.DAY.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(tr.b.UnitScale.TIME.WEEK.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(tr.b.UnitScale.TIME.MONTH.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)).addBinBoundary(tr.b.convertUnit(tr.b.UnitScale.TIME.YEAR.value,tr.b.UnitScale.TIME.SEC,tr.b.UnitScale.TIME.MILLI_SEC)));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.timeStampInMs.unitName,HistogramBinBoundaries.createLinear(0,1e10,1e3));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.normalizedPercentage.unitName,HistogramBinBoundaries.createLinear(0,1.0,20));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.sizeInBytes.unitName,HistogramBinBoundaries.createExponential(1,1e12,1e2));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.energyInJoules.unitName,HistogramBinBoundaries.createExponential(1e-3,1e3,50));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.powerInWatts.unitName,HistogramBinBoundaries.createExponential(1e-3,1,50));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.unitlessNumber.unitName,HistogramBinBoundaries.createExponential(1e-3,1e3,50));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.count.unitName,HistogramBinBoundaries.createExponential(1,1e3,20));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.sigma.unitName,HistogramBinBoundaries.createLinear(-5,5,50));return{DEFAULT_REBINNED_COUNT,DELTA,Histogram,HistogramBinBoundaries,P_VALUE_NAME,U_STATISTIC_NAME,Z_SCORE_NAME,percentFromString,percentToString,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-scalar-context-controller',created(){this.host_=undefined;this.groupToContext_=new Map();this.dirtyGroups_=new Set();},attached(){if(this.host_){throw new Error('Scalar context controller is already attached to a host');}
-const host=findParentOrHost(this);if(host.__scalarContextController){throw new Error('Multiple scalar context controllers attached to this host');}
-host.__scalarContextController=this;this.host_=host;},detached(){if(!this.host_){throw new Error('Scalar context controller is not attached to a host');}
-if(this.host_.__scalarContextController!==this){throw new Error('Scalar context controller is not attached to its host');}
-delete this.host_.__scalarContextController;this.host_=undefined;},getContext(group){return this.groupToContext_.get(group);},onScalarSpanAdded(group,span){let context=this.groupToContext_.get(group);if(context===undefined){context={spans:new Set(),range:new tr.b.math.Range()};this.groupToContext_.set(group,context);}
-if(context.spans.has(span)){throw new Error('Scalar span already registered with group: '+group);}
-context.spans.add(span);this.markGroupDirtyAndScheduleUpdate_(group);},onScalarSpanRemoved(group,span){const context=this.groupToContext_.get(group);if(!context.spans.has(span)){throw new Error('Scalar span not registered with group: '+group);}
-context.spans.delete(span);this.markGroupDirtyAndScheduleUpdate_(group);},onScalarSpanUpdated(group,span){const context=this.groupToContext_.get(group);if(!context.spans.has(span)){throw new Error('Scalar span not registered with group: '+group);}
-this.markGroupDirtyAndScheduleUpdate_(group);},markGroupDirtyAndScheduleUpdate_(group){const alreadyDirty=this.dirtyGroups_.size>0;this.dirtyGroups_.add(group);if(!alreadyDirty){tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContext,this);}},updateContext(){const groups=this.dirtyGroups_;if(groups.size===0)return;this.dirtyGroups_=new Set();for(const group of groups){this.updateGroup_(group);}
-const event=new tr.b.Event('context-updated');event.groups=groups;this.dispatchEvent(event);},updateGroup_(group){const context=this.groupToContext_.get(group);if(context.spans.size===0){this.groupToContext_.delete(group);return;}
-context.range.reset();for(const span of context.spans){context.range.addValue(span.value);}}});function getScalarContextControllerForElement(element){while(element){if(element.__scalarContextController){return element.__scalarContextController;}
-element=findParentOrHost(element);}
-return undefined;}
-function findParentOrHost(node){if(node.parentElement){return node.parentElement;}
-while(Polymer.dom(node).parentNode){node=Polymer.dom(node).parentNode;}
-return node.host;}
-return{getScalarContextControllerForElement,};});'use strict';tr.exportTo('tr.v.ui',function(){function createScalarSpan(value,opt_config){if(value===undefined)return'';const config=opt_config||{};const ownerDocument=config.ownerDocument||document;const span=unwrap(ownerDocument).createElement('tr-v-ui-scalar-span');let numericValue;if(value instanceof tr.b.Scalar){span.value=value;numericValue=value.value;}else if(value instanceof tr.v.Histogram){numericValue=value.average;if(numericValue===undefined)return'';span.setValueAndUnit(numericValue,value.unit);}else{const unit=config.unit;if(unit===undefined){throw new Error('Unit must be provided in config when value is a number');}
-span.setValueAndUnit(value,unit);numericValue=value;}
-if(config.context){span.context=config.context;}
-if(config.customContextRange){span.customContextRange=config.customContextRange;}
-if(config.leftAlign){span.leftAlign=true;}
-if(config.inline){span.inline=true;}
-if(config.significance!==undefined){span.significance=config.significance;}
-if(config.contextGroup!==undefined){span.contextGroup=config.contextGroup;}
-return span;}
-return{createScalarSpan,};});'use strict';Polymer({is:'tr-v-ui-scalar-span',properties:{contextGroup:{type:String,reflectToAttribute:true,observer:'contextGroupChanged_'}},created(){this.value_=undefined;this.unit_=undefined;this.context_=undefined;this.warning_=undefined;this.significance_=tr.b.math.Statistics.Significance.DONT_CARE;this.shouldSearchForContextController_=false;this.lazyContextController_=undefined;this.onContextUpdated_=this.onContextUpdated_.bind(this);this.updateContents_=this.updateContents_.bind(this);this.customContextRange_=undefined;},get significance(){return this.significance_;},set significance(s){this.significance_=s;this.updateContents_();},set contentTextDecoration(deco){this.$.content.style.textDecoration=deco;},get value(){return this.value_;},set value(value){if(value instanceof tr.b.Scalar){this.value_=value.value;this.unit_=value.unit;}else{this.value_=value;}
-this.updateContents_();if(this.hasContext_(this.contextGroup)){this.contextController_.onScalarSpanUpdated(this.contextGroup,this);}else{this.updateSparkline_();}},get contextController_(){if(this.shouldSearchForContextController_){this.lazyContextController_=tr.v.ui.getScalarContextControllerForElement(this);this.shouldSearchForContextController_=false;}
-return this.lazyContextController_;},hasContext_(contextGroup){return!!(contextGroup&&this.contextController_);},contextGroupChanged_(newContextGroup,oldContextGroup){this.detachFromContextControllerIfPossible_(oldContextGroup);if(!this.attachToContextControllerIfPossible_(newContextGroup)){this.onContextUpdated_();}},attachToContextControllerIfPossible_(contextGroup){if(!this.hasContext_(contextGroup))return false;this.contextController_.addEventListener('context-updated',this.onContextUpdated_);this.contextController_.onScalarSpanAdded(contextGroup,this);return true;},detachFromContextControllerIfPossible_(contextGroup){if(!this.hasContext_(contextGroup))return;this.contextController_.removeEventListener('context-updated',this.onContextUpdated_);this.contextController_.onScalarSpanRemoved(contextGroup,this);},attached(){tr.b.Unit.addEventListener('display-mode-changed',this.updateContents_);this.shouldSearchForContextController_=true;this.attachToContextControllerIfPossible_(this.contextGroup);},detached(){tr.b.Unit.removeEventListener('display-mode-changed',this.updateContents_);this.detachFromContextControllerIfPossible_(this.contextGroup);this.shouldSearchForContextController_=false;this.lazyContextController_=undefined;},onContextUpdated_(){this.updateSparkline_();},get context(){return this.context_;},set context(context){this.context_=context;this.updateContents_();},get unit(){return this.unit_;},set unit(unit){this.unit_=unit;this.updateContents_();this.updateSparkline_();},setValueAndUnit(value,unit){this.value_=value;this.unit_=unit;this.updateContents_();},get customContextRange(){return this.customContextRange_;},set customContextRange(customContextRange){this.customContextRange_=customContextRange;this.updateSparkline_();},get inline(){return Polymer.dom(this).classList.contains('inline');},set inline(inline){if(inline){Polymer.dom(this).classList.add('inline');}else{Polymer.dom(this).classList.remove('inline');}},get leftAlign(){return Polymer.dom(this).classList.contains('left-align');},set leftAlign(leftAlign){if(leftAlign){Polymer.dom(this).classList.add('left-align');}else{Polymer.dom(this).classList.remove('left-align');}},updateSparkline_(){Polymer.dom(this.$.sparkline).classList.remove('positive');Polymer.dom(this.$.sparkline).classList.remove('better');Polymer.dom(this.$.sparkline).classList.remove('worse');Polymer.dom(this.$.sparkline).classList.remove('same');this.$.sparkline.style.display='none';this.$.sparkline.style.left='0';this.$.sparkline.style.width='0';let range=this.customContextRange_;if(!range&&this.hasContext_(this.contextGroup)){const context=this.contextController_.getContext(this.contextGroup);if(context){range=context.range;}}
-if(!range||range.isEmpty)return;const leftPoint=Math.min(range.min,0);const rightPoint=Math.max(range.max,0);const pointDistance=rightPoint-leftPoint;if(pointDistance===0){return;}
-this.$.sparkline.style.display='block';let left;let width;if(this.value>0){width=Math.min(this.value,rightPoint);left=-leftPoint;Polymer.dom(this.$.sparkline).classList.add('positive');}else if(this.value<=0){width=-Math.max(this.value,leftPoint);left=(-leftPoint)-width;}
-this.$.sparkline.style.left=this.buildSparklineStyle_(left/pointDistance,false);this.$.sparkline.style.width=this.buildSparklineStyle_(width/pointDistance,true);const changeClass=this.changeClassName_;if(changeClass){Polymer.dom(this.$.sparkline).classList.add(changeClass);}},buildSparklineStyle_(ratio,isWidth){let position='calc('+ratio+' * (100% - 1px)';if(isWidth){position+=' + 1px';}
-position+=')';return position;},updateContents_(){Polymer.dom(this.$.content).textContent='';Polymer.dom(this.$.content).classList.remove('better');Polymer.dom(this.$.content).classList.remove('worse');Polymer.dom(this.$.content).classList.remove('same');this.$.insignificant.style.display='';this.$.significantly_better.style.display='';this.$.significantly_worse.style.display='';if(this.unit_===undefined)return;this.$.content.title='';Polymer.dom(this.$.content).textContent=this.unit_.format(this.value,this.context);this.updateDelta_();},updateDelta_(){let changeClass=this.changeClassName_;if(!changeClass){this.$.significance.style.display='none';return;}
-this.$.significance.style.display='inline';let title;switch(changeClass){case'better':title='improvement';break;case'worse':title='regression';break;case'same':title='no change';break;default:throw new Error('Unknown change class: '+changeClass);}
-Polymer.dom(this.$.content).classList.add(changeClass);switch(this.significance){case tr.b.math.Statistics.Significance.DONT_CARE:break;case tr.b.math.Statistics.Significance.INSIGNIFICANT:if(changeClass!=='same')title='insignificant '+title;this.$.insignificant.style.display='inline';changeClass='same';break;case tr.b.math.Statistics.Significance.SIGNIFICANT:if(changeClass==='same'){throw new Error('How can no change be significant?');}
-this.$['significantly_'+changeClass].style.display='inline';title='significant '+title;break;default:throw new Error('Unknown significance '+this.significance);}
-this.$.significance.title=title;this.$.content.title=title;},get changeClassName_(){if(!this.unit_||!this.unit_.isDelta)return undefined;switch(this.unit_.improvementDirection){case tr.b.ImprovementDirection.DONT_CARE:return undefined;case tr.b.ImprovementDirection.BIGGER_IS_BETTER:if(this.value===0)return'same';return this.value>0?'better':'worse';case tr.b.ImprovementDirection.SMALLER_IS_BETTER:if(this.value===0)return'same';return this.value<0?'better':'worse';default:throw new Error('Unknown improvement direction: '+
-this.unit_.improvementDirection);}},get warning(){return this.warning_;},set warning(warning){this.warning_=warning;const warningEl=this.$.warning;if(this.warning_){warningEl.title=warning;warningEl.style.display='inline';}else{warningEl.title='';warningEl.style.display='';}},get timestamp(){return this.value;},set timestamp(timestamp){if(timestamp instanceof tr.b.u.TimeStamp){this.value=timestamp;return;}
-this.setValueAndUnit(timestamp,tr.b.u.Units.timeStampInMs);},get duration(){return this.value;},set duration(duration){if(duration instanceof tr.b.u.TimeDuration){this.value=duration;return;}
-this.setValueAndUnit(duration,tr.b.u.Units.timeDurationInMs);}});'use strict';function isTable(object){if(!(object instanceof Array)||(object.length<2))return false;for(const colName in object[0]){if(typeof colName!=='string')return false;}
-for(let i=0;i<object.length;++i){if(!(object[i]instanceof Object))return false;for(const colName in object[i]){if(i&&(object[0][colName]===undefined))return false;const cellType=typeof object[i][colName];if(cellType!=='string'&&cellType!=='number')return false;}
-if(i){for(const colName in object[0]){if(object[i][colName]===undefined)return false;}}}
-return true;}
-Polymer({is:'tr-ui-a-generic-object-view',ready(){this.object_=undefined;},get object(){return this.object_;},set object(object){this.object_=object;this.updateContents_();},updateContents_(){Polymer.dom(this.$.content).textContent='';this.appendElementsForType_('',this.object_,0,0,5,'');},appendElementsForType_(label,object,indent,depth,maxDepth,suffix){if(depth>maxDepth){this.appendSimpleText_(label,indent,'<recursion limit reached>',suffix);return;}
-if(object===undefined){this.appendSimpleText_(label,indent,'undefined',suffix);return;}
-if(object===null){this.appendSimpleText_(label,indent,'null',suffix);return;}
-if(!(object instanceof Object)){const type=typeof object;if(type!=='string'){return this.appendSimpleText_(label,indent,String(object),suffix);}
-let objectReplaced=false;if((object[0]==='{'&&object[object.length-1]==='}')||(object[0]==='['&&object[object.length-1]===']')){try{object=JSON.parse(object);objectReplaced=true;}catch(e){}}
-if(!objectReplaced){if(object.includes('\n')){const lines=object.split('\n');lines.forEach(function(line,i){let text;let ioff;let ll;let ss;if(i===0){text='"'+line;ioff=0;ll=label;ss='';}else if(i<lines.length-1){text=line;ioff=1;ll='';ss='';}else{text=line+'"';ioff=1;ll='';ss=suffix;}
-const el=this.appendSimpleText_(ll,indent+ioff*label.length+ioff,text,ss);el.style.whiteSpace='pre';return el;},this);return;}
-if(tr.b.isUrl(object)){const link=document.createElement('a');link.href=object;link.textContent=object;this.appendElementWithLabel_(label,indent,link,suffix);return;}
-this.appendSimpleText_(label,indent,'"'+object+'"',suffix);return;}}
-if(object instanceof tr.model.ObjectSnapshot){const link=document.createElement('tr-ui-a-analysis-link');link.selection=new tr.model.EventSet(object);this.appendElementWithLabel_(label,indent,link,suffix);return;}
-if(object instanceof tr.model.ObjectInstance){const link=document.createElement('tr-ui-a-analysis-link');link.selection=new tr.model.EventSet(object);this.appendElementWithLabel_(label,indent,link,suffix);return;}
-if(object instanceof tr.b.math.Rect){this.appendSimpleText_(label,indent,object.toString(),suffix);return;}
-if(object instanceof tr.b.Scalar){const el=this.ownerDocument.createElement('tr-v-ui-scalar-span');el.value=object;el.inline=true;this.appendElementWithLabel_(label,indent,el,suffix);return;}
-if(object instanceof Array){this.appendElementsForArray_(label,object,indent,depth,maxDepth,suffix);return;}
-this.appendElementsForObject_(label,object,indent,depth,maxDepth,suffix);},appendElementsForArray_(label,object,indent,depth,maxDepth,suffix){if(object.length===0){this.appendSimpleText_(label,indent,'[]',suffix);return;}
-if(isTable(object)){const table=document.createElement('tr-ui-b-table');const columns=[];for(const colName of Object.keys(object[0])){let allStrings=true;let allNumbers=true;for(let i=0;i<object.length;++i){if(typeof(object[i][colName])!=='string'){allStrings=false;}
-if(typeof(object[i][colName])!=='number'){allNumbers=false;}
-if(!allStrings&&!allNumbers)break;}
-const column={title:colName};column.value=function(row){return row[colName];};if(allStrings){column.cmp=function(x,y){return x[colName].localeCompare(y[colName]);};}else if(allNumbers){column.cmp=function(x,y){return x[colName]-y[colName];};}
-columns.push(column);}
-table.tableColumns=columns;table.tableRows=object;this.appendElementWithLabel_(label,indent,table,suffix);table.rebuild();return;}
-this.appendElementsForType_(label+'[',object[0],indent,depth+1,maxDepth,object.length>1?',':']'+suffix);for(let i=1;i<object.length;i++){this.appendElementsForType_('',object[i],indent+label.length+1,depth+1,maxDepth,i<object.length-1?',':']'+suffix);}
-return;},appendElementsForObject_(label,object,indent,depth,maxDepth,suffix){const keys=Object.keys(object);if(keys.length===0){this.appendSimpleText_(label,indent,'{}',suffix);return;}
-this.appendElementsForType_(label+'{'+keys[0]+': ',object[keys[0]],indent,depth,maxDepth,keys.length>1?',':'}'+suffix);for(let i=1;i<keys.length;i++){this.appendElementsForType_(keys[i]+': ',object[keys[i]],indent+label.length+1,depth+1,maxDepth,i<keys.length-1?',':'}'+suffix);}},appendElementWithLabel_(label,indent,dataElement,suffix){const row=document.createElement('div');const indentSpan=document.createElement('span');indentSpan.style.whiteSpace='pre';for(let i=0;i<indent;i++){Polymer.dom(indentSpan).textContent+=' ';}
-Polymer.dom(row).appendChild(indentSpan);const labelSpan=document.createElement('span');Polymer.dom(labelSpan).textContent=label;Polymer.dom(row).appendChild(labelSpan);Polymer.dom(row).appendChild(dataElement);const suffixSpan=document.createElement('span');Polymer.dom(suffixSpan).textContent=suffix;Polymer.dom(row).appendChild(suffixSpan);row.dataElement=dataElement;Polymer.dom(this.$.content).appendChild(row);},appendSimpleText_(label,indent,text,suffix){const el=this.ownerDocument.createElement('span');Polymer.dom(el).textContent=text;this.appendElementWithLabel_(label,indent,el,suffix);return el;}});'use strict';Polymer({is:'tr-ui-a-generic-object-view-with-label',ready(){this.labelEl_=document.createElement('div');this.genericObjectView_=document.createElement('tr-ui-a-generic-object-view');Polymer.dom(this.root).appendChild(this.labelEl_);Polymer.dom(this.root).appendChild(this.genericObjectView_);},get label(){return Polymer.dom(this.labelEl_).textContent;},set label(label){Polymer.dom(this.labelEl_).textContent=label;},get object(){return this.genericObjectView_.object;},set object(object){this.genericObjectView_.object=object;}});'use strict';tr.exportTo('tr.ui.analysis',function(){const ObjectSnapshotView=tr.ui.b.define('object-snapshot-view');ObjectSnapshotView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.objectSnapshot_=undefined;},get requiresTallView(){return true;},set modelEvent(obj){this.objectSnapshot=obj;},get modelEvent(){return this.objectSnapshot;},get objectSnapshot(){return this.objectSnapshot_;},set objectSnapshot(i){this.objectSnapshot_=i;this.updateContents();},updateContents(){throw new Error('Not implemented');}};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);options.mandatoryBaseClass=ObjectSnapshotView;options.defaultMetadata={showInstances:true,showInTrackView:true};tr.b.decorateExtensionRegistry(ObjectSnapshotView,options);return{ObjectSnapshotView,};});'use strict';Polymer({is:'tr-ui-b-drag-handle',created(){this.lastMousePos_=0;this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.addEventListener('mousedown',this.onMouseDown_);this.target_=undefined;this.horizontal=true;this.observer_=new MutationObserver(this.didTargetMutate_.bind(this));this.targetSizesByModeKey_={};this.currentDraggingSize_=undefined;},get modeKey_(){return this.target_.className===''?'.':this.target_.className;},get target(){return this.target_;},set target(target){this.observer_.disconnect();this.target_=target;if(!this.target_)return;this.observer_.observe(this.target_,{attributes:true,attributeFilter:['class']});},get horizontal(){return this.horizontal_;},set horizontal(h){this.horizontal_=h;if(this.horizontal_){this.className='horizontal-drag-handle';}else{this.className='vertical-drag-handle';}},get vertical(){return!this.horizontal_;},set vertical(v){this.horizontal=!v;},forceMutationObserverFlush_(){const records=this.observer_.takeRecords();if(records.length){this.didTargetMutate_(records);}},didTargetMutate_(e){const modeSize=this.targetSizesByModeKey_[this.modeKey_];if(modeSize!==undefined){this.setTargetSize_(modeSize);return;}
-this.target_.style[this.targetStyleKey_]='';},get targetStyleKey_(){return this.horizontal_?'height':'width';},getTargetSize_(){const size=parseInt(window.getComputedStyle(this.target_)[this.targetStyleKey_]);this.targetSizesByModeKey_[this.modeKey_]=size;return size;},setTargetSize_(s){this.target_.style[this.targetStyleKey_]=s+'px';this.targetSizesByModeKey_[this.modeKey_]=this.getTargetSize_();tr.b.dispatchSimpleEvent(this,'drag-handle-resize',true,false);},applyDelta_(delta){if(this.target_===this.nextElementSibling){this.currentDraggingSize_+=delta;}else{this.currentDraggingSize_-=delta;}
-this.setTargetSize_(this.currentDraggingSize_);},onMouseMove_(e){const curMousePos=this.horizontal_?e.clientY:e.clientX;const delta=this.lastMousePos_-curMousePos;this.applyDelta_(delta);this.lastMousePos_=curMousePos;e.preventDefault();return true;},onMouseDown_(e){if(!this.target_)return;this.forceMutationObserverFlush_();this.currentDraggingSize_=this.getTargetSize_();this.lastMousePos_=this.horizontal_?e.clientY:e.clientX;document.addEventListener('mousemove',this.onMouseMove_);document.addEventListener('mouseup',this.onMouseUp_);e.preventDefault();return true;},onMouseUp_(e){document.removeEventListener('mousemove',this.onMouseMove_);document.removeEventListener('mouseup',this.onMouseUp_);e.preventDefault();this.currentDraggingSize_=undefined;}});'use strict';tr.exportTo('tr.ui.b',function(){function HotKey(dict){if(dict.eventType===undefined){throw new Error('eventType must be given');}
-if(dict.keyCode===undefined&&dict.keyCodes===undefined){throw new Error('keyCode or keyCodes must be given');}
-if(dict.keyCode!==undefined&&dict.keyCodes!==undefined){throw new Error('Only keyCode or keyCodes can be given');}
-if(dict.callback===undefined){throw new Error('callback must be given');}
-this.eventType_=dict.eventType;this.keyCodes_=[];if(dict.keyCode){this.pushKeyCode_(dict.keyCode);}else if(dict.keyCodes){dict.keyCodes.forEach(this.pushKeyCode_,this);}
-this.useCapture_=!!dict.useCapture;this.callback_=dict.callback;this.thisArg_=dict.thisArg!==undefined?dict.thisArg:undefined;this.helpText_=dict.helpText!==undefined?dict.helpText:undefined;}
-HotKey.prototype={get eventType(){return this.eventType_;},get keyCodes(){return this.keyCodes_;},get helpText(){return this.helpText_;},call(e){this.callback_.call(this.thisArg_,e);},pushKeyCode_(keyCode){this.keyCodes_.push(keyCode);}};return{HotKey,};});'use strict';Polymer({is:'tv-ui-b-hotkey-controller',created(){this.isAttached_=false;this.globalMode_=false;this.slavedToParentController_=undefined;this.curHost_=undefined;this.childControllers_=[];this.bubblingKeyDownHotKeys_={};this.capturingKeyDownHotKeys_={};this.bubblingKeyPressHotKeys_={};this.capturingKeyPressHotKeys_={};this.onBubblingKeyDown_=this.onKey_.bind(this,false);this.onCapturingKeyDown_=this.onKey_.bind(this,true);this.onBubblingKeyPress_=this.onKey_.bind(this,false);this.onCapturingKeyPress_=this.onKey_.bind(this,true);},attached(){this.isAttached_=true;const host=this.findHost_();if(host.__hotkeyController){throw new Error('Multiple hotkey controllers attached to this host');}
-host.__hotkeyController=this;this.curHost_=host;let parentElement;if(host.parentElement){parentElement=host.parentElement;}else{parentElement=Polymer.dom(host).parentNode.host;}
-const parentController=tr.b.getHotkeyControllerForElement(parentElement);if(parentController){this.slavedToParentController_=parentController;parentController.addChildController_(this);return;}
-host.addEventListener('keydown',this.onBubblingKeyDown_,false);host.addEventListener('keydown',this.onCapturingKeyDown_,true);host.addEventListener('keypress',this.onBubblingKeyPress_,false);host.addEventListener('keypress',this.onCapturingKeyPress_,true);},detached(){this.isAttached_=false;const host=this.curHost_;if(!host)return;delete host.__hotkeyController;this.curHost_=undefined;if(this.slavedToParentController_){this.slavedToParentController_.removeChildController_(this);this.slavedToParentController_=undefined;return;}
-host.removeEventListener('keydown',this.onBubblingKeyDown_,false);host.removeEventListener('keydown',this.onCapturingKeyDown_,true);host.removeEventListener('keypress',this.onBubblingKeyPress_,false);host.removeEventListener('keypress',this.onCapturingKeyPress_,true);},addChildController_(controller){const i=this.childControllers_.indexOf(controller);if(i!==-1){throw new Error('Controller already registered');}
-this.childControllers_.push(controller);},removeChildController_(controller){const i=this.childControllers_.indexOf(controller);if(i===-1){throw new Error('Controller not registered');}
-this.childControllers_.splice(i,1);return controller;},getKeyMapForEventType_(eventType,useCapture){if(eventType==='keydown'){if(!useCapture){return this.bubblingKeyDownHotKeys_;}
-return this.capturingKeyDownHotKeys_;}
-if(eventType==='keypress'){if(!useCapture){return this.bubblingKeyPressHotKeys_;}
-return this.capturingKeyPressHotKeys_;}
-throw new Error('Unsupported key event');},addHotKey(hotKey){if(!(hotKey instanceof tr.ui.b.HotKey)){throw new Error('hotKey must be a tr.ui.b.HotKey');}
-const keyMap=this.getKeyMapForEventType_(hotKey.eventType,hotKey.useCapture);for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];if(keyMap[keyCode]){throw new Error('Key is already bound for keyCode='+keyCode);}}
-for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];keyMap[keyCode]=hotKey;}
-return hotKey;},removeHotKey(hotKey){if(!(hotKey instanceof tr.ui.b.HotKey)){throw new Error('hotKey must be a tr.ui.b.HotKey');}
-const keyMap=this.getKeyMapForEventType_(hotKey.eventType,hotKey.useCapture);for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];if(!keyMap[keyCode]){throw new Error('Key is not bound for keyCode='+keyCode);}
-keyMap[keyCode]=hotKey;}
-for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];delete keyMap[keyCode];}
-return hotKey;},get globalMode(){return this.globalMode_;},set globalMode(globalMode){const wasAttached=this.isAttached_;if(wasAttached){this.detached();}
-this.globalMode_=!!globalMode;if(wasAttached){this.attached();}},get topmostConroller_(){if(this.slavedToParentController_){return this.slavedToParentController_.topmostConroller_;}
-return this;},childRequestsGeneralFocus(child){const topmost=this.topmostConroller_;if(topmost.curHost_){if(topmost.curHost_.hasAttribute('tabIndex')){topmost.curHost_.focus();}else{if(document.activeElement){document.activeElement.blur();}}}else{if(document.activeElement){document.activeElement.blur();}}},childRequestsBlur(child){child.blur();const topmost=this.topmostConroller_;if(topmost.curHost_){topmost.curHost_.focus();}},findHost_(){if(this.globalMode_)return wrap(document.body);if(this.parentElement)return this.parentElement;if(!Polymer.dom(this).parentNode)return this.host;let node=this.parentNode;while(Polymer.dom(node).parentNode)node=Polymer.dom(node).parentNode;return node.host;},appendMatchingHotKeysTo_(matchedHotKeys,useCapture,e){const localKeyMap=this.getKeyMapForEventType_(e.type,useCapture);const localHotKey=localKeyMap[e.keyCode];if(localHotKey){matchedHotKeys.push(localHotKey);}
-for(let i=0;i<this.childControllers_.length;i++){const controller=this.childControllers_[i];controller.appendMatchingHotKeysTo_(matchedHotKeys,useCapture,e);}},onKey_(useCapture,e){if(!useCapture&&e.path[0].tagName==='INPUT')return;let sortedControllers;const matchedHotKeys=[];this.appendMatchingHotKeysTo_(matchedHotKeys,useCapture,e);if(matchedHotKeys.length===0)return false;if(matchedHotKeys.length>1){throw new Error('More than one hotKey is currently unsupported');}
-const hotKey=matchedHotKeys[0];let prevented=0;prevented|=hotKey.call(e);return!prevented&&e.defaultPrevented;}});'use strict';tr.exportTo('tr.b',function(){function getHotkeyControllerForElement(refElement){let curElement=refElement;while(curElement){if(curElement.tagName==='tv-ui-b-hotkey-controller'){return curElement;}
-if(curElement.__hotkeyController){return curElement.__hotkeyController;}
-if(curElement.parentElement){curElement=curElement.parentElement;continue;}
-curElement=findHost(curElement);}
-return undefined;}
-function findHost(initialNode){let node=initialNode;while(Polymer.dom(node).parentNode){node=Polymer.dom(node).parentNode;}
-return node.host;}
-return{getHotkeyControllerForElement,};});'use strict';Polymer({is:'tr-ui-b-info-bar',ready(){this.messageEl_=this.$.message;this.buttonsEl_=this.$.buttons;this.message='';},get message(){return Polymer.dom(this.messageEl_).textContent;},set message(message){Polymer.dom(this.messageEl_).textContent=message;},get visible(){return!this.hidden;},set visible(visible){this.hidden=!visible;},removeAllButtons(){Polymer.dom(this.buttonsEl_).textContent='';},addButton(text,clickCallback){const button=document.createElement('button');Polymer.dom(button).textContent=text;button.addEventListener('click',event=>clickCallback(event,this));Polymer.dom(this.buttonsEl_).appendChild(button);return button;}});'use strict';tr.exportTo('tr.ui.b',function(){const ContainerThatDecoratesItsChildren=tr.ui.b.define('div');ContainerThatDecoratesItsChildren.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.observer_=new MutationObserver(this.didMutate_.bind(this));this.observer_.observe(this,{childList:true});Object.defineProperty(this,'textContent',{get:undefined,set:this.onSetTextContent_});},appendChild(x){HTMLDivElement.prototype.appendChild.call(this,x);this.didMutate_(this.observer_.takeRecords());},insertBefore(x,y){HTMLDivElement.prototype.insertBefore.call(this,x,y);this.didMutate_(this.observer_.takeRecords());},removeChild(x){HTMLDivElement.prototype.removeChild.call(this,x);this.didMutate_(this.observer_.takeRecords());},replaceChild(x,y){HTMLDivElement.prototype.replaceChild.call(this,x,y);this.didMutate_(this.observer_.takeRecords());},onSetTextContent_(textContent){if(textContent!==''){throw new Error('textContent can only be set to \'\'.');}
-this.clear();},clear(){while(Polymer.dom(this).lastChild){HTMLDivElement.prototype.removeChild.call(this,Polymer.dom(this).lastChild);}
-this.didMutate_(this.observer_.takeRecords());},didMutate_(records){this.beginDecorating_();for(let i=0;i<records.length;i++){const addedNodes=records[i].addedNodes;if(addedNodes){for(let j=0;j<addedNodes.length;j++){this.decorateChild_(addedNodes[j]);}}
-const removedNodes=records[i].removedNodes;if(removedNodes){for(let j=0;j<removedNodes.length;j++){this.undecorateChild_(removedNodes[j]);}}}
-this.doneDecoratingForNow_();},decorateChild_(child){throw new Error('Not implemented');},undecorateChild_(child){throw new Error('Not implemented');},beginDecorating_(){},doneDecoratingForNow_(){}};return{ContainerThatDecoratesItsChildren,};});'use strict';tr.exportTo('tr.ui.b',function(){const ListView=tr.ui.b.define('x-list-view',tr.ui.b.ContainerThatDecoratesItsChildren);ListView.prototype={__proto__:tr.ui.b.ContainerThatDecoratesItsChildren.prototype,decorate(){tr.ui.b.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);Polymer.dom(this).classList.add('x-list-view');this.style.display='block';this.style.userSelect='none';this.style.outline='none';this.onItemClicked_=this.onItemClicked_.bind(this);this.onKeyDown_=this.onKeyDown_.bind(this);this.tabIndex=0;this.addEventListener('keydown',this.onKeyDown_);this.selectionChanged_=false;},decorateChild_(item){Polymer.dom(item).classList.add('list-item');item.style.paddingTop='2px';item.style.paddingRight='4px';item.style.paddingBottom='2px';item.style.paddingLeft='4px';item.addEventListener('click',this.onItemClicked_,true);Object.defineProperty(item,'selected',{configurable:true,get:()=>item.hasAttribute('selected'),set:value=>{const oldSelection=this.selectedElement;if(oldSelection&&oldSelection!==item&&value){Polymer.dom(this.selectedElement).removeAttribute('selected');}
-if(value){Polymer.dom(item).setAttribute('selected','selected');item.style.backgroundColor='rgb(171, 217, 202)';item.style.outline='1px dotted rgba(0,0,0,0.1)';item.style.outlineOffset=0;}else{Polymer.dom(item).removeAttribute('selected');item.style.backgroundColor='';}
-const newSelection=this.selectedElement;if(newSelection!==oldSelection){tr.b.dispatchSimpleEvent(this,'selection-changed',false);}},});},undecorateChild_(item){this.selectionChanged_|=item.selected;Polymer.dom(item).classList.remove('list-item');item.removeEventListener('click',this.onItemClicked_);delete item.selected;},beginDecorating_(){this.selectionChanged_=false;},doneDecoratingForNow_(){if(this.selectionChanged_){tr.b.dispatchSimpleEvent(this,'selection-changed',false);}},get selectedElement(){const el=Polymer.dom(this).querySelector('.list-item[selected]');if(!el)return undefined;return el;},set selectedElement(el){if(!el){if(this.selectedElement){this.selectedElement.selected=false;}
-return;}
-if(el.parentElement!==this){throw new Error('Can only select elements that are children of this list view');}
-el.selected=true;},getElementByIndex(index){return Polymer.dom(this).querySelector('.list-item:nth-child('+index+')');},clear(){const changed=this.selectedElement!==undefined;tr.ui.b.ContainerThatDecoratesItsChildren.prototype.clear.call(this);if(changed){tr.b.dispatchSimpleEvent(this,'selection-changed',false);}},onItemClicked_(e){const currentSelectedElement=this.selectedElement;if(currentSelectedElement){Polymer.dom(currentSelectedElement).removeAttribute('selected');}
-let element=e.target;while(element.parentElement!==this){element=element.parentElement;}
-if(element!==currentSelectedElement){Polymer.dom(element).setAttribute('selected','selected');}
-tr.b.dispatchSimpleEvent(this,'selection-changed',false);},onKeyDown_(e){if(this.selectedElement===undefined)return;if(e.keyCode===38){const prev=Polymer.dom(this.selectedElement).previousSibling;if(prev){prev.selected=true;tr.ui.b.scrollIntoViewIfNeeded(prev);e.preventDefault();return true;}}else if(e.keyCode===40){const next=Polymer.dom(this.selectedElement).nextSibling;if(next){next.selected=true;tr.ui.b.scrollIntoViewIfNeeded(next);e.preventDefault();return true;}}},addItem(textContent){const item=document.createElement('div');Polymer.dom(item).textContent=textContent;Polymer.dom(this).appendChild(item);item.style.userSelect='none';return item;}};return{ListView,};});'use strict';tr.exportTo('tr.ui.b',function(){const MOUSE_SELECTOR_MODE={};MOUSE_SELECTOR_MODE.SELECTION=0x1;MOUSE_SELECTOR_MODE.PANSCAN=0x2;MOUSE_SELECTOR_MODE.ZOOM=0x4;MOUSE_SELECTOR_MODE.TIMING=0x8;MOUSE_SELECTOR_MODE.ROTATE=0x10;MOUSE_SELECTOR_MODE.ALL_MODES=0x1F;const MOUSE_SELECTOR_MODE_INFOS={};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.PANSCAN]={name:'PANSCAN',mode:MOUSE_SELECTOR_MODE.PANSCAN,title:'pan',eventNames:{enter:'enterpan',begin:'beginpan',update:'updatepan',end:'endpan',exit:'exitpan'},activeBackgroundPosition:'-30px -10px',defaultBackgroundPosition:'0 -10px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.SELECTION]={name:'SELECTION',mode:MOUSE_SELECTOR_MODE.SELECTION,title:'selection',eventNames:{enter:'enterselection',begin:'beginselection',update:'updateselection',end:'endselection',exit:'exitselection'},activeBackgroundPosition:'-30px -40px',defaultBackgroundPosition:'0 -40px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.ZOOM]={name:'ZOOM',mode:MOUSE_SELECTOR_MODE.ZOOM,title:'zoom',eventNames:{enter:'enterzoom',begin:'beginzoom',update:'updatezoom',end:'endzoom',exit:'exitzoom'},activeBackgroundPosition:'-30px -70px',defaultBackgroundPosition:'0 -70px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.TIMING]={name:'TIMING',mode:MOUSE_SELECTOR_MODE.TIMING,title:'timing',eventNames:{enter:'entertiming',begin:'begintiming',update:'updatetiming',end:'endtiming',exit:'exittiming'},activeBackgroundPosition:'-30px -100px',defaultBackgroundPosition:'0 -100px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.ROTATE]={name:'ROTATE',mode:MOUSE_SELECTOR_MODE.ROTATE,title:'rotate',eventNames:{enter:'enterrotate',begin:'beginrotate',update:'updaterotate',end:'endrotate',exit:'exitrotate'},activeBackgroundPosition:'-30px -130px',defaultBackgroundPosition:'0 -130px'};return{MOUSE_SELECTOR_MODE_INFOS,MOUSE_SELECTOR_MODE,};});'use strict';Polymer({is:'tr-ui-b-mouse-mode-icon',properties:{modeName:{type:String,reflectToAttribute:true,observer:'modeNameChanged'},},created(){this.active_=false;this.acceleratorKey_=undefined;},ready(){this.updateContents_();},get mode(){return tr.ui.b.MOUSE_SELECTOR_MODE[this.modeName];},set mode(mode){const modeInfo=tr.ui.b.MOUSE_SELECTOR_MODE_INFOS[mode];if(modeInfo===undefined){throw new Error('Unknown mode');}
-this.modeName=modeInfo.name;},modeNameChanged(){this.updateContents_();},get active(){return this.active_;},set active(active){this.active_=!!active;if(this.active_){Polymer.dom(this).classList.add('active');}else{Polymer.dom(this).classList.remove('active');}
-this.updateContents_();},get acceleratorKey(){return this.acceleratorKey_;},set acceleratorKey(acceleratorKey){this.acceleratorKey_=acceleratorKey;this.updateContents_();},updateContents_(){if(this.modeName===undefined)return;const mode=this.mode;if(mode===undefined){throw new Error('Invalid mode');}
-const modeInfo=tr.ui.b.MOUSE_SELECTOR_MODE_INFOS[mode];if(!modeInfo){throw new Error('Invalid mode');}
-let title=modeInfo.title;if(this.acceleratorKey_){title=title+' ('+this.acceleratorKey_+')';}
-this.title=title;let bp;if(this.active_){bp=modeInfo.activeBackgroundPosition;}else{bp=modeInfo.defaultBackgroundPosition;}
-this.style.backgroundPosition=bp;}});'use strict';tr.exportTo('tr.ui.b',function(){function MouseTracker(opt_targetElement){this.onMouseDown_=this.onMouseDown_.bind(this);this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.targetElement=opt_targetElement;}
-MouseTracker.prototype={get targetElement(){return this.targetElement_;},set targetElement(targetElement){if(this.targetElement_){this.targetElement_.removeEventListener('mousedown',this.onMouseDown_);}
-this.targetElement_=targetElement;if(this.targetElement_){this.targetElement_.addEventListener('mousedown',this.onMouseDown_);}},onMouseDown_(e){if(e.button!==0)return true;e=this.remakeEvent_(e,'mouse-tracker-start');this.targetElement_.dispatchEvent(e);document.addEventListener('mousemove',this.onMouseMove_);document.addEventListener('mouseup',this.onMouseUp_);this.targetElement_.addEventListener('blur',this.onMouseUp_);this.savePreviousUserSelect_=document.body.style['-webkit-user-select'];document.body.style['-webkit-user-select']='none';e.preventDefault();return true;},onMouseMove_(e){e=this.remakeEvent_(e,'mouse-tracker-move');this.targetElement_.dispatchEvent(e);},onMouseUp_(e){document.removeEventListener('mousemove',this.onMouseMove_);document.removeEventListener('mouseup',this.onMouseUp_);this.targetElement_.removeEventListener('blur',this.onMouseUp_);document.body.style['-webkit-user-select']=this.savePreviousUserSelect_;e=this.remakeEvent_(e,'mouse-tracker-end');this.targetElement_.dispatchEvent(e);},remakeEvent_(e,newType){const remade=new tr.b.Event(newType,true,true);remade.x=e.x;remade.y=e.y;remade.offsetX=e.offsetX;remade.offsetY=e.offsetY;remade.clientX=e.clientX;remade.clientY=e.clientY;return remade;}};function trackMouseMovesUntilMouseUp(mouseMoveHandler,opt_mouseUpHandler,opt_keyUpHandler){function cleanupAndDispatchToMouseUp(e){document.removeEventListener('mousemove',mouseMoveHandler);if(opt_keyUpHandler){document.removeEventListener('keyup',opt_keyUpHandler);}
-document.removeEventListener('mouseup',cleanupAndDispatchToMouseUp);if(opt_mouseUpHandler){opt_mouseUpHandler(e);}}
-document.addEventListener('mousemove',mouseMoveHandler);if(opt_keyUpHandler){document.addEventListener('keyup',opt_keyUpHandler);}
-document.addEventListener('mouseup',cleanupAndDispatchToMouseUp);}
-return{MouseTracker,trackMouseMovesUntilMouseUp,};});'use strict';tr.exportTo('tr.ui.b',function(){const MOUSE_SELECTOR_MODE=tr.ui.b.MOUSE_SELECTOR_MODE;const MOUSE_SELECTOR_MODE_INFOS=tr.ui.b.MOUSE_SELECTOR_MODE_INFOS;const MIN_MOUSE_SELECTION_DISTANCE=4;const MODIFIER={SHIFT:0x1,SPACE:0x2,CMD_OR_CTRL:0x4};function isCmdOrCtrlPressed(event){if(tr.isMac)return event.metaKey;return event.ctrlKey;}
-Polymer({is:'tr-ui-b-mouse-mode-selector',created(){this.supportedModeMask_=MOUSE_SELECTOR_MODE.ALL_MODES;this.initialRelativeMouseDownPos_={x:0,y:0};this.defaultMode_=MOUSE_SELECTOR_MODE.PANSCAN;this.settingsKey_=undefined;this.mousePos_={x:0,y:0};this.mouseDownPos_={x:0,y:0};this.onMouseDown_=this.onMouseDown_.bind(this);this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.onKeyDown_=this.onKeyDown_.bind(this);this.onKeyUp_=this.onKeyUp_.bind(this);this.mode_=undefined;this.modeToKeyCodeMap_={};this.modifierToModeMap_={};this.targetElement_=undefined;this.modeBeforeAlternativeModeActivated_=null;this.isInteracting_=false;this.isClick_=false;},ready(){this.buttonsEl_=Polymer.dom(this.root).querySelector('.buttons');this.dragHandleEl_=Polymer.dom(this.root).querySelector('.drag-handle');this.supportedModeMask=MOUSE_SELECTOR_MODE.ALL_MODES;this.dragHandleEl_.addEventListener('mousedown',this.onDragHandleMouseDown_.bind(this));this.buttonsEl_.addEventListener('mouseup',this.onButtonMouseUp_);this.buttonsEl_.addEventListener('mousedown',this.onButtonMouseDown_);this.buttonsEl_.addEventListener('click',this.onButtonPress_.bind(this));},attached(){document.addEventListener('keydown',this.onKeyDown_);document.addEventListener('keyup',this.onKeyUp_);},detached(){document.removeEventListener('keydown',this.onKeyDown_);document.removeEventListener('keyup',this.onKeyUp_);},get targetElement(){return this.targetElement_;},set targetElement(target){if(this.targetElement_){this.targetElement_.removeEventListener('mousedown',this.onMouseDown_);}
-this.targetElement_=target;if(this.targetElement_){this.targetElement_.addEventListener('mousedown',this.onMouseDown_);}},get defaultMode(){return this.defaultMode_;},set defaultMode(defaultMode){this.defaultMode_=defaultMode;},get settingsKey(){return this.settingsKey_;},set settingsKey(settingsKey){this.settingsKey_=settingsKey;if(!this.settingsKey_)return;let mode=tr.b.Settings.get(this.settingsKey_+'.mode',undefined);if(MOUSE_SELECTOR_MODE_INFOS[mode]===undefined){mode=undefined;}
-if((mode&this.supportedModeMask_)===0){mode=undefined;}
-if(!mode)mode=this.defaultMode_;this.mode=mode;const pos=tr.b.Settings.get(this.settingsKey_+'.pos',undefined);if(pos)this.pos=pos;},get supportedModeMask(){return this.supportedModeMask_;},set supportedModeMask(supportedModeMask){if(this.mode&&(supportedModeMask&this.mode)===0){throw new Error('supportedModeMask must include current mode.');}
-function createButtonForMode(mode){return button;}
-this.supportedModeMask_=supportedModeMask;Polymer.dom(this.buttonsEl_).textContent='';for(const modeName in MOUSE_SELECTOR_MODE){if(modeName==='ALL_MODES')continue;const mode=MOUSE_SELECTOR_MODE[modeName];if((this.supportedModeMask_&mode)===0)continue;const button=document.createElement('tr-ui-b-mouse-mode-icon');button.mode=mode;Polymer.dom(button).classList.add('tool-button');Polymer.dom(this.buttonsEl_).appendChild(button);}},getButtonForMode_(mode){for(let i=0;i<this.buttonsEl_.children.length;i++){const buttonEl=this.buttonsEl_.children[i];if(buttonEl.mode===mode){return buttonEl;}}
-return undefined;},get mode(){return this.currentMode_;},set mode(newMode){if(newMode!==undefined){if(typeof newMode!=='number'){throw new Error('Mode must be a number');}
-if((newMode&this.supportedModeMask_)===0){throw new Error('Cannot switch to this mode, it is not supported');}
-if(MOUSE_SELECTOR_MODE_INFOS[newMode]===undefined){throw new Error('Unrecognized mode');}}
-let modeInfo;if(this.currentMode_===newMode)return;if(this.currentMode_){const buttonEl=this.getButtonForMode_(this.currentMode_);if(buttonEl)buttonEl.active=false;if(this.isInteracting_){const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.end);this.dispatchEvent(mouseEvent);}
-modeInfo=MOUSE_SELECTOR_MODE_INFOS[this.currentMode_];tr.b.dispatchSimpleEvent(this,modeInfo.eventNames.exit,true);}
-this.currentMode_=newMode;if(this.currentMode_){const buttonEl=this.getButtonForMode_(this.currentMode_);if(buttonEl)buttonEl.active=true;this.mouseDownPos_.x=this.mousePos_.x;this.mouseDownPos_.y=this.mousePos_.y;modeInfo=MOUSE_SELECTOR_MODE_INFOS[this.currentMode_];if(!this.isInAlternativeMode_){tr.b.dispatchSimpleEvent(this,modeInfo.eventNames.enter,true);}
-if(this.isInteracting_){const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.begin);this.dispatchEvent(mouseEvent);}}
-if(this.settingsKey_&&!this.isInAlternativeMode_){tr.b.Settings.set(this.settingsKey_+'.mode',this.mode);}},setKeyCodeForMode(mode,keyCode){if((mode&this.supportedModeMask_)===0){throw new Error('Mode not supported');}
-this.modeToKeyCodeMap_[mode]=keyCode;if(!this.buttonsEl_)return;const buttonEl=this.getButtonForMode_(mode);if(buttonEl){buttonEl.acceleratorKey=String.fromCharCode(keyCode);}},setCurrentMousePosFromEvent_(e){this.mousePos_.x=e.clientX;this.mousePos_.y=e.clientY;},createEvent_(eventName,sourceEvent){const event=new tr.b.Event(eventName,true);event.clientX=this.mousePos_.x;event.clientY=this.mousePos_.y;event.deltaX=this.mousePos_.x-this.mouseDownPos_.x;event.deltaY=this.mousePos_.y-this.mouseDownPos_.y;event.mouseDownX=this.mouseDownPos_.x;event.mouseDownY=this.mouseDownPos_.y;event.didPreventDefault=false;event.preventDefault=function(){event.didPreventDefault=true;if(sourceEvent){sourceEvent.preventDefault();}};event.stopPropagation=function(){sourceEvent.stopPropagation();};event.stopImmediatePropagation=function(){throw new Error('Not implemented');};return event;},onMouseDown_(e){if(e.button!==0)return;this.setCurrentMousePosFromEvent_(e);const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.begin,e);if(this.mode===MOUSE_SELECTOR_MODE.SELECTION){mouseEvent.appendSelection=isCmdOrCtrlPressed(e);}
-this.dispatchEvent(mouseEvent);this.isInteracting_=true;this.isClick_=true;tr.ui.b.trackMouseMovesUntilMouseUp(this.onMouseMove_,this.onMouseUp_);},onMouseMove_(e){this.setCurrentMousePosFromEvent_(e);const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.update,e);this.dispatchEvent(mouseEvent);if(this.isInteracting_){this.checkIsClick_(e);}},onMouseUp_(e){if(e.button!==0)return;const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.end,e);mouseEvent.isClick=this.isClick_;this.dispatchEvent(mouseEvent);if(this.isClick_&&!mouseEvent.didPreventDefault){this.dispatchClickEvents_(e);}
-this.isInteracting_=false;this.updateAlternativeModeState_(e);},onButtonMouseDown_(e){e.preventDefault();e.stopImmediatePropagation();},onButtonMouseUp_(e){e.preventDefault();e.stopImmediatePropagation();},onButtonPress_(e){this.modeBeforeAlternativeModeActivated_=undefined;this.mode=e.target.mode;e.preventDefault();},onKeyDown_(e){if(e.path[0].tagName==='INPUT')return;if(e.keyCode===' '.charCodeAt(0)){this.spacePressed_=true;}
-this.updateAlternativeModeState_(e);},onKeyUp_(e){if(e.path[0].tagName==='INPUT')return;if(e.keyCode===' '.charCodeAt(0)){this.spacePressed_=false;}
-let didHandleKey=false;for(const[modeStr,keyCode]of Object.entries(this.modeToKeyCodeMap_)){if(e.keyCode===keyCode){this.modeBeforeAlternativeModeActivated_=undefined;const mode=parseInt(modeStr);this.mode=mode;didHandleKey=true;}}
-if(didHandleKey){e.preventDefault();e.stopPropagation();return;}
-this.updateAlternativeModeState_(e);},updateAlternativeModeState_(e){const shiftPressed=e.shiftKey;const spacePressed=this.spacePressed_;const cmdOrCtrlPressed=isCmdOrCtrlPressed(e);const smm=this.supportedModeMask_;let newMode;let isNewModeAnAlternativeMode=false;if(shiftPressed&&(this.modifierToModeMap_[MODIFIER.SHIFT]&smm)!==0){newMode=this.modifierToModeMap_[MODIFIER.SHIFT];isNewModeAnAlternativeMode=true;}else if(spacePressed&&(this.modifierToModeMap_[MODIFIER.SPACE]&smm)!==0){newMode=this.modifierToModeMap_[MODIFIER.SPACE];isNewModeAnAlternativeMode=true;}else if(cmdOrCtrlPressed&&(this.modifierToModeMap_[MODIFIER.CMD_OR_CTRL]&smm)!==0){newMode=this.modifierToModeMap_[MODIFIER.CMD_OR_CTRL];isNewModeAnAlternativeMode=true;}else{if(this.isInAlternativeMode_){newMode=this.modeBeforeAlternativeModeActivated_;isNewModeAnAlternativeMode=false;}else{newMode=undefined;}}
-if(this.mode===newMode||newMode===undefined)return;if(isNewModeAnAlternativeMode){this.modeBeforeAlternativeModeActivated_=this.mode;}
-this.mode=newMode;},get isInAlternativeMode_(){return!!this.modeBeforeAlternativeModeActivated_;},setModifierForAlternateMode(mode,modifier){this.modifierToModeMap_[modifier]=mode;},get pos(){return{x:parseInt(this.style.left),y:parseInt(this.style.top)};},set pos(pos){pos=this.constrainPositionToBounds_(pos);this.style.left=pos.x+'px';this.style.top=pos.y+'px';if(this.settingsKey_){tr.b.Settings.set(this.settingsKey_+'.pos',this.pos);}},constrainPositionToBounds_(pos){const parent=this.offsetParent||document.body;const parentRect=tr.ui.b.windowRectForElement(parent);const top=0;const bottom=parentRect.height-this.offsetHeight;const left=0;const right=parentRect.width-this.offsetWidth;const res={};res.x=Math.max(pos.x,left);res.x=Math.min(res.x,right);res.y=Math.max(pos.y,top);res.y=Math.min(res.y,bottom);return res;},onDragHandleMouseDown_(e){e.preventDefault();e.stopImmediatePropagation();const mouseDownPos={x:e.clientX-this.offsetLeft,y:e.clientY-this.offsetTop};tr.ui.b.trackMouseMovesUntilMouseUp(function(e){const pos={};pos.x=e.clientX-mouseDownPos.x;pos.y=e.clientY-mouseDownPos.y;this.pos=pos;}.bind(this));},checkIsClick_(e){if(!this.isInteracting_||!this.isClick_)return;const deltaX=this.mousePos_.x-this.mouseDownPos_.x;const deltaY=this.mousePos_.y-this.mouseDownPos_.y;const minDist=MIN_MOUSE_SELECTION_DISTANCE;if(deltaX*deltaX+deltaY*deltaY>minDist*minDist){this.isClick_=false;}},dispatchClickEvents_(e){if(!this.isClick_)return;const modeInfo=MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.SELECTION];const eventNames=modeInfo.eventNames;let mouseEvent=this.createEvent_(eventNames.begin);mouseEvent.appendSelection=isCmdOrCtrlPressed(e);this.dispatchEvent(mouseEvent);mouseEvent=this.createEvent_(eventNames.end);this.dispatchEvent(mouseEvent);}});return{MIN_MOUSE_SELECTION_DISTANCE,MODIFIER,};});'use strict';(function(){const DETAILS_SPLIT_REGEX=/^(\S*)\s*([\S\s]*)$/;Polymer({is:'tr-ui-e-chrome-cc-display-item-list-item',created(){Polymer.dom(this).setAttribute('name','');Polymer.dom(this).setAttribute('rawDetails','');Polymer.dom(this).setAttribute('richDetails',undefined);Polymer.dom(this).setAttribute('data_',undefined);},get data(){return this.data_;},set data(data){this.data_=data;if(!data){this.name='DATA MISSING';this.rawDetails='';this.richDetails=undefined;}else if(typeof data==='string'){const match=data.match(DETAILS_SPLIT_REGEX);this.name=match[1];this.rawDetails=match[2];this.richDetails=undefined;}else{this.name=data.name;this.rawDetails='';this.richDetails=data;}},stopPropagation(e){e.stopPropagation();},_computeIfSKP(richDetails){return richDetails&&richDetails.skp64;},_computeHref(richDetails){return'data:application/octet-stream;base64,'+richDetails.skp64;}});})();'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){function Selection(){this.selectionToSetIfClicked=undefined;}
-Selection.prototype={get specicifity(){throw new Error('Not implemented');},get associatedLayerId(){throw new Error('Not implemented');},get associatedRenderPassId(){throw new Error('Not implemented');},get highlightsByLayerId(){return{};},createAnalysis(){throw new Error('Not implemented');},findEquivalent(lthi){throw new Error('Not implemented');}};function RenderPassSelection(renderPass,renderPassId){if(!renderPass||(renderPassId===undefined)){throw new Error('Render pass (with id) is required');}
-this.renderPass_=renderPass;this.renderPassId_=renderPassId;}
-RenderPassSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 1;},get associatedLayerId(){return undefined;},get associatedRenderPassId(){return this.renderPassId_;},get renderPass(){return this.renderPass_;},createAnalysis(){const dataView=document.createElement('tr-ui-a-generic-object-view-with-label');dataView.label='RenderPass '+this.renderPassId_;dataView.object=this.renderPass_.args;return dataView;},get title(){return this.renderPass_.objectInstance.typeName;}};function LayerSelection(layer){if(!layer){throw new Error('Layer is required');}
-this.layer_=layer;}
-LayerSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 1;},get associatedLayerId(){return this.layer_.layerId;},get associatedRenderPassId(){return undefined;},get layer(){return this.layer_;},createAnalysis(){const dataView=document.createElement('tr-ui-a-generic-object-view-with-label');dataView.label='Layer '+this.layer_.layerId;if(this.layer_.usingGpuRasterization){dataView.label+=' (GPU-rasterized)';}
-dataView.object=this.layer_.args;return dataView;},get title(){return this.layer_.objectInstance.typeName;},findEquivalent(lthi){const layer=lthi.activeTree.findLayerWithId(this.layer_.layerId)||lthi.pendingTree.findLayerWithId(this.layer_.layerId);if(!layer)return undefined;return new LayerSelection(layer);}};function TileSelection(tile,opt_data){this.tile_=tile;this.data_=opt_data||{};}
-TileSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 2;},get associatedLayerId(){return this.tile_.layerId;},get highlightsByLayerId(){const highlights={};highlights[this.tile_.layerId]=[{colorKey:this.tile_.objectInstance.typeName,rect:this.tile_.layerRect}];return highlights;},createAnalysis(){const analysis=document.createElement('tr-ui-a-generic-object-view-with-label');analysis.label='Tile '+this.tile_.objectInstance.id+' on layer '+
-this.tile_.layerId;if(this.data_){analysis.object={moreInfo:this.data_,tileArgs:this.tile_.args};}else{analysis.object=this.tile_.args;}
-return analysis;},findEquivalent(lthi){const tileInstance=this.tile_.tileInstance;if(lthi.ts<tileInstance.creationTs||lthi.ts>=tileInstance.deletionTs){return undefined;}
-const tileSnapshot=tileInstance.getSnapshotAt(lthi.ts);if(!tileSnapshot)return undefined;return new TileSelection(tileSnapshot);}};function LayerRectSelection(layer,rectType,rect,opt_data){this.layer_=layer;this.rectType_=rectType;this.rect_=rect;this.data_=opt_data!==undefined?opt_data:rect;}
-LayerRectSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 2;},get associatedLayerId(){return this.layer_.layerId;},get highlightsByLayerId(){const highlights={};highlights[this.layer_.layerId]=[{colorKey:this.rectType_,rect:this.rect_}];return highlights;},createAnalysis(){const analysis=document.createElement('tr-ui-a-generic-object-view-with-label');analysis.label=this.rectType_+' on layer '+this.layer_.layerId;analysis.object=this.data_;return analysis;},findEquivalent(lthi){return undefined;}};function AnimationRectSelection(layer,rect){this.layer_=layer;this.rect_=rect;}
-AnimationRectSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 0;},get associatedLayerId(){return this.layer_.layerId;},createAnalysis(){const analysis=document.createElement('tr-ui-a-generic-object-view-with-label');analysis.label='Animation Bounds of layer '+this.layer_.layerId;analysis.object=this.rect_;return analysis;}};return{Selection,RenderPassSelection,LayerSelection,TileSelection,LayerRectSelection,AnimationRectSelection,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const OPS_TIMING_ITERATIONS=3;const ANNOTATION='Comment';const BEGIN_ANNOTATION='BeginCommentGroup';const END_ANNOTATION='EndCommentGroup';const ANNOTATION_ID='ID: ';const ANNOTATION_CLASS='CLASS: ';const ANNOTATION_TAG='TAG: ';const constants=tr.e.cc.constants;const PictureOpsListView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-ops-list-view');PictureOpsListView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.style.borderTop='1px solid grey';this.style.overflow='auto';this.opsList_=new tr.ui.b.ListView();Polymer.dom(this).appendChild(this.opsList_);this.selectedOp_=undefined;this.selectedOpIndex_=undefined;this.opsList_.addEventListener('selection-changed',this.onSelectionChanged_.bind(this));this.picture_=undefined;},get picture(){return this.picture_;},set picture(picture){this.picture_=picture;this.updateContents_();},updateContents_(){this.opsList_.clear();if(!this.picture_)return;let ops=this.picture_.getOps();if(!ops)return;ops=this.picture_.tagOpsWithTimings(ops);ops=this.opsTaggedWithAnnotations_(ops);for(let i=0;i<ops.length;i++){const op=ops[i];const item=document.createElement('div');item.opIndex=op.opIndex;Polymer.dom(item).textContent=i+') '+op.cmd_string;if(op.elementInfo.tag||op.elementInfo.id||op.elementInfo.class){const elementInfo=document.createElement('span');Polymer.dom(elementInfo).classList.add('elementInfo');elementInfo.style.color='purple';elementInfo.style.fontSize='small';elementInfo.style.fontWeight='bold';elementInfo.style.color='#777';const tag=op.elementInfo.tag?op.elementInfo.tag:'unknown';const id=op.elementInfo.id?'id='+op.elementInfo.id:undefined;const className=op.elementInfo.class?'class='+
-op.elementInfo.class:undefined;Polymer.dom(elementInfo).textContent='<'+tag+(id?' ':'')+
-(id?id:'')+(className?' ':'')+
-(className?className:'')+'>';Polymer.dom(item).appendChild(elementInfo);}
-if(op.info.length>0){const infoItem=document.createElement('div');Polymer.dom(infoItem).textContent=JSON.stringify(op.info);infoItem.style.fontSize='x-small';infoItem.style.color='#777';Polymer.dom(item).appendChild(infoItem);}
-if(op.cmd_time&&op.cmd_time>=0.0001){const time=document.createElement('span');Polymer.dom(time).classList.add('time');const rounded=op.cmd_time.toFixed(4);Polymer.dom(time).textContent='('+rounded+'ms)';time.style.fontSize='x-small';time.style.color='rgb(136, 0, 0)';Polymer.dom(item).appendChild(time);}
-item.style.borderBottom='1px solid #555';item.style.fontSize='small';item.style.fontWeight='bold';item.style.paddingBottom='5px';item.style.paddingLeft='5px';item.style.cursor='pointer';for(const child of item.children){child.style.fontWeight='normal';child.style.marginLeft='1em';child.style.maxWidth='300px';}
-Polymer.dom(this.opsList_).appendChild(item);}},onSelectionChanged_(e){let beforeSelectedOp=true;if(this.opsList_.selectedElement===this.selectedOp_){this.opsList_.selectedElement=undefined;beforeSelectedOp=false;this.selectedOpIndex_=undefined;}
-this.selectedOp_=this.opsList_.selectedElement;const ops=this.opsList_.children;for(let i=0;i<ops.length;i++){const op=ops[i];if(op===this.selectedOp_){beforeSelectedOp=false;this.selectedOpIndex_=op.opIndex;}else if(beforeSelectedOp){Polymer.dom(op).setAttribute('beforeSelection','beforeSelection');op.style.backgroundColor='rgb(103, 199, 165)';}else{Polymer.dom(op).removeAttribute('beforeSelection');op.style.backgroundColor='';}}
-tr.b.dispatchSimpleEvent(this,'selection-changed',false);},get numOps(){return this.opsList_.children.length;},get selectedOpIndex(){return this.selectedOpIndex_;},set selectedOpIndex(s){this.selectedOpIndex_=s;if(s===undefined){this.opsList_.selectedElement=this.selectedOp_;this.onSelectionChanged_();}else{if(s<0)throw new Error('Invalid index');if(s>=this.numOps)throw new Error('Invalid index');this.opsList_.selectedElement=this.opsList_.getElementByIndex(s+1);tr.ui.b.scrollIntoViewIfNeeded(this.opsList_.selectedElement);}},opsTaggedWithAnnotations_(ops){const annotationGroups=[];const opsWithoutAnnotations=[];for(let opIndex=0;opIndex<ops.length;opIndex++){const op=ops[opIndex];op.opIndex=opIndex;switch(op.cmd_string){case BEGIN_ANNOTATION:annotationGroups.push([]);break;case END_ANNOTATION:annotationGroups.pop();break;case ANNOTATION:annotationGroups[annotationGroups.length-1].push(op);break;default:{const annotations=[];let elementInfo={};annotationGroups.forEach(function(annotationGroup){elementInfo={};annotationGroup.forEach(function(annotation){annotation.info.forEach(function(info){if(info.includes(ANNOTATION_TAG)){elementInfo.tag=info.substring(info.indexOf(ANNOTATION_TAG)+
-ANNOTATION_TAG.length).toLowerCase();}else if(info.includes(ANNOTATION_ID)){elementInfo.id=info.substring(info.indexOf(ANNOTATION_ID)+
-ANNOTATION_ID.length);}else if(info.includes(ANNOTATION_CLASS)){elementInfo.class=info.substring(info.indexOf(ANNOTATION_CLASS)+
-ANNOTATION_CLASS.length);}
-annotations.push(info);});});});op.annotations=annotations;op.elementInfo=elementInfo;opsWithoutAnnotations.push(op);}}}
-return opsWithoutAnnotations;}};return{PictureOpsListView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const THIS_DOC=document.currentScript.ownerDocument;const DisplayItemDebugger=tr.ui.b.define('tr-ui-e-chrome-cc-display-item-debugger');DisplayItemDebugger.prototype={__proto__:HTMLDivElement.prototype,decorate(){const node=tr.ui.b.instantiateTemplate('#tr-ui-e-chrome-cc-display-item-debugger-template',THIS_DOC);Polymer.dom(this).appendChild(node);this.style.flexGrow=1;this.style.flexShrink=1;this.style.flexBasis='auto';this.style.display='flex';this.style.minWidth=0;this.pictureAsImageData_=undefined;this.zoomScaleValue_=1;this.sizeInfo_=Polymer.dom(this).querySelector('.size');this.rasterArea_=Polymer.dom(this).querySelector('raster-area');this.rasterArea_.style.flexGrow=1;this.rasterArea_.style.flexShrink=1;this.rasterArea_.style.flexBasis='auto';this.rasterArea_.style.backgroundColor='#ddd';this.rasterArea_.style.minHeight='200px';this.rasterArea_.style.minWidth='200px';this.rasterArea_.style.paddingLeft='5px';this.rasterArea_.style.display='flex';this.rasterArea_.style.flexDirection='column';this.rasterCanvas_=Polymer.dom(this.rasterArea_).querySelector('canvas');this.rasterCtx_=this.rasterCanvas_.getContext('2d');const canvasScroller=Polymer.dom(this).querySelector('canvas-scroller');canvasScroller.style.flexGrow=1;canvasScroller.style.flexShrink=1;canvasScroller.style.flexBasis='auto';canvasScroller.style.minWidth=0;canvasScroller.style.minHeight=0;canvasScroller.style.overflow='auto';this.trackMouse_();this.displayItemInfo_=Polymer.dom(this).querySelector('display-item-info');this.displayItemInfo_.addEventListener('click',this.onDisplayItemInfoClick_.bind(this),false);this.displayItemListView_=new tr.ui.b.ListView();this.displayItemListView_.addEventListener('selection-changed',this.onDisplayItemListSelection_.bind(this));Polymer.dom(this.displayItemInfo_).appendChild(this.displayItemListView_);this.displayListFilename_=Polymer.dom(this).querySelector('.dlfilename');this.displayListExportButton_=Polymer.dom(this).querySelector('.dlexport');this.displayListExportButton_.addEventListener('click',this.onExportDisplayListClicked_.bind(this));this.skpFilename_=Polymer.dom(this).querySelector('.skpfilename');this.skpExportButton_=Polymer.dom(this).querySelector('.skpexport');this.skpExportButton_.addEventListener('click',this.onExportSkPictureClicked_.bind(this));const leftPanel=Polymer.dom(this).querySelector('left-panel');leftPanel.style.flexGrow=0;leftPanel.style.flexShrink=0;leftPanel.style.flexBasis='auto';leftPanel.style.minWidth='200px';leftPanel.style.overflow='auto';leftPanel.children[0].paddingTop='2px';leftPanel.children[0].children[0].style.borderBottom='1px solid #555';const leftPanelTitle=leftPanel.querySelector('.title');leftPanelTitle.style.fontWeight='bold';leftPanelTitle.style.marginLeft='5px';leftPanelTitle.style.marginright='5px';for(const div of leftPanel.querySelectorAll('.export')){div.style.margin='5px';}
-const middleDragHandle=document.createElement('tr-ui-b-drag-handle');middleDragHandle.style.flexGrow=0;middleDragHandle.style.flexShrink=0;middleDragHandle.style.flexBasis='auto';middleDragHandle.horizontal=false;middleDragHandle.target=leftPanel;const rightPanel=Polymer.dom(this).querySelector('right-panel');rightPanel.style.display='flex';rightPanel.style.flexGrow=1;rightPanel.style.flexShrink=1;rightPanel.style.flexBasis='auto';rightPanel.style.minWidth=0;this.infoBar_=document.createElement('tr-ui-b-info-bar');Polymer.dom(this.rasterArea_).insertBefore(this.infoBar_,canvasScroller);Polymer.dom(this).insertBefore(middleDragHandle,rightPanel);this.picture_=undefined;this.pictureOpsListView_=new tr.ui.e.chrome.cc.PictureOpsListView();this.pictureOpsListView_.style.flexGrow=0;this.pictureOpsListView_.style.flexShrink=0;this.pictureOpsListView_.style.flexBasis='auto';this.pictureOpsListView_.style.overflow='auto';this.pictureOpsListView_.style.minWidth='100px';Polymer.dom(rightPanel).insertBefore(this.pictureOpsListView_,this.rasterArea_);this.pictureOpsListDragHandle_=document.createElement('tr-ui-b-drag-handle');this.pictureOpsListDragHandle_.horizontal=false;this.pictureOpsListDragHandle_.target=this.pictureOpsListView_;Polymer.dom(rightPanel).insertBefore(this.pictureOpsListDragHandle_,this.rasterArea_);},get picture(){return this.picture_;},set displayItemList(displayItemList){this.displayItemList_=displayItemList;this.picture=this.displayItemList_;this.displayItemListView_.clear();this.displayItemList_.items.forEach(function(item){const listItem=document.createElement('tr-ui-e-chrome-cc-display-item-list-item');listItem.data=item;Polymer.dom(this.displayItemListView_).appendChild(listItem);}.bind(this));},set picture(picture){this.picture_=picture;const showOpsList=picture&&picture!==this.displayItemList_;this.updateDrawOpsList_(showOpsList);if(picture){const size=this.getRasterCanvasSize_();this.rasterCanvas_.width=size.width;this.rasterCanvas_.height=size.height;}
-const bounds=this.rasterArea_.getBoundingClientRect();const selectorBounds=this.mouseModeSelector_.getBoundingClientRect();this.mouseModeSelector_.pos={x:(bounds.right-selectorBounds.width-10),y:bounds.top};this.rasterize_();this.scheduleUpdateContents_();},getRasterCanvasSize_(){const style=window.getComputedStyle(this.rasterArea_);let width=parseInt(style.width);let height=parseInt(style.height);if(this.picture_){width=Math.max(width,this.picture_.layerRect.width);height=Math.max(height,this.picture_.layerRect.height);}
-return{width,height};},scheduleUpdateContents_(){if(this.updateContentsPending_)return;this.updateContentsPending_=true;tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContents_.bind(this));},updateContents_(){this.updateContentsPending_=false;if(this.picture_){Polymer.dom(this.sizeInfo_).textContent='('+
-this.picture_.layerRect.width+' x '+
-this.picture_.layerRect.height+')';}
-if(!this.pictureAsImageData_)return;this.infoBar_.visible=false;this.infoBar_.removeAllButtons();if(this.pictureAsImageData_.error){this.infoBar_.message='Cannot rasterize...';this.infoBar_.addButton('More info...',function(e){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent=this.pictureAsImageData_.error;overlay.visible=true;e.stopPropagation();return false;}.bind(this));this.infoBar_.visible=true;}
-this.drawPicture_();},drawPicture_(){const size=this.getRasterCanvasSize_();if(size.width!==this.rasterCanvas_.width){this.rasterCanvas_.width=size.width;}
-if(size.height!==this.rasterCanvas_.height){this.rasterCanvas_.height=size.height;}
-this.rasterCtx_.clearRect(0,0,size.width,size.height);if(!this.picture_||!this.pictureAsImageData_.imageData)return;const imgCanvas=this.pictureAsImageData_.asCanvas();const w=imgCanvas.width;const h=imgCanvas.height;this.rasterCtx_.drawImage(imgCanvas,0,0,w,h,0,0,w*this.zoomScaleValue_,h*this.zoomScaleValue_);},rasterize_(){if(this.picture_){this.picture_.rasterize({showOverdraw:false},this.onRasterComplete_.bind(this));}},onRasterComplete_(pictureAsImageData){this.pictureAsImageData_=pictureAsImageData;this.scheduleUpdateContents_();},onDisplayItemListSelection_(e){const selected=this.displayItemListView_.selectedElement;if(!selected){this.picture=this.displayItemList_;return;}
-const index=Array.prototype.indexOf.call(this.displayItemListView_.children,selected);const displayItem=this.displayItemList_.items[index];if(displayItem&&displayItem.skp64){this.picture=new tr.e.cc.Picture(displayItem.skp64,this.displayItemList_.layerRect);}else{this.picture=undefined;}},onDisplayItemInfoClick_(e){if(e&&e.target===this.displayItemInfo_){this.displayItemListView_.selectedElement=undefined;}},updateDrawOpsList_(showOpsList){if(showOpsList){this.pictureOpsListView_.picture=this.picture_;if(this.pictureOpsListView_.numOps>0){this.pictureOpsListView_.style.display='block';this.pictureOpsListDragHandle_.style.display='block';}}else{this.pictureOpsListView_.style.display='none';this.pictureOpsListDragHandle_.style.display='none';}},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.rasterArea_;Polymer.dom(this.rasterArea_).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.defaultMode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.settingsKey='pictureDebugger.mouseModeSelector';this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));},onBeginZoom_(e){this.isZooming_=true;this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const currentMouseViewPos=this.extractRelativeMousePosition_(e);this.zoomScaleValue_+=((this.lastMouseViewPos_.y-currentMouseViewPos.y)*0.001);this.zoomScaleValue_=Math.max(this.zoomScaleValue_,0.1);this.drawPicture_();this.lastMouseViewPos_=currentMouseViewPos;},onEndZoom_(e){this.lastMouseViewPos_=undefined;this.isZooming_=false;e.preventDefault();},extractRelativeMousePosition_(e){return{x:e.clientX-this.rasterArea_.offsetLeft,y:e.clientY-this.rasterArea_.offsetTop};},saveFile_(filename,rawData){if(!rawData)return;const length=rawData.length;const arrayBuffer=new ArrayBuffer(length);const uint8Array=new Uint8Array(arrayBuffer);for(let c=0;c<length;c++){uint8Array[c]=rawData.charCodeAt(c);}
-const blob=new Blob([uint8Array],{type:'application/octet-binary'});const blobUrl=window.URL.createObjectURL(blob);const link=document.createElementNS('http://www.w3.org/1999/xhtml','a');link.href=blobUrl;link.download=filename;const event=document.createEvent('MouseEvents');event.initMouseEvent('click',true,false,window,0,0,0,0,0,false,false,false,false,0,null);link.dispatchEvent(event);},onExportDisplayListClicked_(){const rawData=JSON.stringify(this.displayItemList_.items);this.saveFile_(this.displayListFilename_.value,rawData);},onExportSkPictureClicked_(){const rawData=tr.b.Base64.atob(this.picture_.getBase64SkpData());this.saveFile_(this.skpFilename_.value,rawData);}};return{DisplayItemDebugger,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const DisplayItemSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-display-item-list-view',tr.ui.analysis.ObjectSnapshotView);DisplayItemSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){this.style.display='flex';this.style.flexGrow=1;this.style.flexShrink=1;this.style.flexBasis='auto';this.style.minWidth=0;this.displayItemDebugger_=new tr.ui.e.chrome.cc.DisplayItemDebugger();this.displayItemDebugger_.style.flexGrow=1;this.displayItemDebugger_.style.flexShrink=1;this.displayItemDebugger_.style.flexBasis='auto';this.displayItemDebugger_.style.minWidth=0;Polymer.dom(this).appendChild(this.displayItemDebugger_);},updateContents(){if(this.objectSnapshot_&&this.displayItemDebugger_){this.displayItemDebugger_.displayItemList=this.objectSnapshot_;}}};tr.ui.analysis.ObjectSnapshotView.register(DisplayItemSnapshotView,{typeNames:['cc::DisplayItemList'],showInstances:false});return{DisplayItemSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const constants=tr.e.cc.constants;const RENDER_PASS_QUADS=Math.max(constants.ACTIVE_TREE,constants.PENDING_TREE)+1;const LayerPicker=tr.ui.b.define('tr-ui-e-chrome-cc-layer-picker');LayerPicker.prototype={__proto__:HTMLUnknownElement.prototype,decorate(){this.lthi_=undefined;this.controls_=document.createElement('top-controls');this.renderPassQuads_=false;this.style.display='flex';this.style.flexDirection='column';this.controls_.style.flexGrow=0;this.controls_.style.flexShrink=0;this.controls_.style.flexBasis='auto';this.controls_.style.backgroundImage='-webkit-gradient(linear, 0 0, 100% 0, from(#E5E5E5), to(#D1D1D1))';this.controls_.style.borderBottom='1px solid #8e8e8e';this.controls_.style.borderTop='1px solid white';this.controls_.style.display='inline';this.controls_.style.fontSize='14px';this.controls_.style.paddingLeft='2px';this.itemList_=new tr.ui.b.ListView();this.itemList_.style.flexGrow=1;this.itemList_.style.flexShrink=1;this.itemList_.style.flexBasis='auto';this.itemList_.style.fontFamily='monospace';this.itemList_.style.overflow='auto';Polymer.dom(this).appendChild(this.controls_);Polymer.dom(this).appendChild(this.itemList_);this.itemList_.addEventListener('selection-changed',this.onItemSelectionChanged_.bind(this));Polymer.dom(this.controls_).appendChild(tr.ui.b.createSelector(this,'whichTree','layerPicker.whichTree',constants.ACTIVE_TREE,[{label:'Active tree',value:constants.ACTIVE_TREE},{label:'Pending tree',value:constants.PENDING_TREE},{label:'Render pass quads',value:RENDER_PASS_QUADS}]));this.showPureTransformLayers_=false;const showPureTransformLayers=tr.ui.b.createCheckBox(this,'showPureTransformLayers','layerPicker.showPureTransformLayers',false,'Transform layers');Polymer.dom(showPureTransformLayers).classList.add('show-transform-layers');showPureTransformLayers.title='When checked, pure transform layers are shown';Polymer.dom(this.controls_).appendChild(showPureTransformLayers);},get lthiSnapshot(){return this.lthiSnapshot_;},set lthiSnapshot(lthiSnapshot){this.lthiSnapshot_=lthiSnapshot;this.updateContents_();},get whichTree(){return this.renderPassQuads_?constants.ACTIVE_TREE:this.whichTree_;},set whichTree(whichTree){this.whichTree_=whichTree;this.renderPassQuads_=(whichTree===RENDER_PASS_QUADS);this.updateContents_();tr.b.dispatchSimpleEvent(this,'selection-change',false);},get layerTreeImpl(){if(this.lthiSnapshot===undefined)return undefined;return this.lthiSnapshot.getTree(this.whichTree);},get isRenderPassQuads(){return this.renderPassQuads_;},get showPureTransformLayers(){return this.showPureTransformLayers_;},set showPureTransformLayers(show){if(this.showPureTransformLayers_===show)return;this.showPureTransformLayers_=show;this.updateContents_();},getRenderPassInfos_(){if(!this.lthiSnapshot_)return[];const renderPassInfo=[];if(!this.lthiSnapshot_.args.frame||!this.lthiSnapshot_.args.frame.renderPasses){return renderPassInfo;}
-const renderPasses=this.lthiSnapshot_.args.frame.renderPasses;for(let i=0;i<renderPasses.length;++i){const info={renderPass:renderPasses[i],depth:0,id:i,name:'cc::RenderPass'};renderPassInfo.push(info);}
-return renderPassInfo;},getLayerInfos_(){if(!this.lthiSnapshot_)return[];const tree=this.lthiSnapshot_.getTree(this.whichTree_);if(!tree)return[];const layerInfos=[];const showPureTransformLayers=this.showPureTransformLayers_;const visitedLayers={};function visitLayer(layer,depth,isMask,isReplica){if(visitedLayers[layer.layerId])return;visitedLayers[layer.layerId]=true;const info={layer,depth};if(layer.args.drawsContent){info.name=layer.objectInstance.name;}else{info.name='cc::LayerImpl';}
-if(layer.usingGpuRasterization){info.name+=' (G)';}
-info.isMaskLayer=isMask;info.replicaLayer=isReplica;if(showPureTransformLayers||layer.args.drawsContent){layerInfos.push(info);}}
-tree.iterLayers(visitLayer);return layerInfos;},updateContents_(){if(this.renderPassQuads_){this.updateRenderPassContents_();}else{this.updateLayerContents_();}},updateRenderPassContents_(){this.itemList_.clear();let selectedRenderPassId;if(this.selection_&&this.selection_.associatedRenderPassId){selectedRenderPassId=this.selection_.associatedRenderPassId;}
-const renderPassInfos=this.getRenderPassInfos_();renderPassInfos.forEach(function(renderPassInfo){const renderPass=renderPassInfo.renderPass;const id=renderPassInfo.id;const item=this.createElementWithDepth_(renderPassInfo.depth);const labelEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());Polymer.dom(labelEl).textContent=renderPassInfo.name+' '+id;item.renderPass=renderPass;item.renderPassId=id;Polymer.dom(this.itemList_).appendChild(item);if(id===selectedRenderPassId){renderPass.selectionState=tr.model.SelectionState.SELECTED;}},this);},updateLayerContents_(){this.changingItemSelection_=true;try{this.itemList_.clear();let selectedLayerId;if(this.selection_&&this.selection_.associatedLayerId){selectedLayerId=this.selection_.associatedLayerId;}
-const layerInfos=this.getLayerInfos_();layerInfos.forEach(function(layerInfo){const layer=layerInfo.layer;const id=layer.layerId;const item=this.createElementWithDepth_(layerInfo.depth);const labelEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());Polymer.dom(labelEl).textContent=layerInfo.name+' '+id;const notesEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());if(layerInfo.isMaskLayer){Polymer.dom(notesEl).textContent+='(mask)';}
-if(layerInfo.isReplicaLayer){Polymer.dom(notesEl).textContent+='(replica)';}
-if((layer.gpuMemoryUsageInBytes!==undefined)&&(layer.gpuMemoryUsageInBytes>0)){const gpuUsageStr=tr.b.Unit.byName.sizeInBytes.format(layer.gpuMemoryUsageInBytes);Polymer.dom(notesEl).textContent+=' ('+gpuUsageStr+' MiB)';}
-item.layer=layer;Polymer.dom(this.itemList_).appendChild(item);if(layer.layerId===selectedLayerId){layer.selectionState=tr.model.SelectionState.SELECTED;item.selected=true;}},this);}finally{this.changingItemSelection_=false;}},createElementWithDepth_(depth){const item=document.createElement('div');const indentEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());indentEl.style.whiteSpace='pre';for(let i=0;i<depth;i++){Polymer.dom(indentEl).textContent=Polymer.dom(indentEl).textContent+' ';}
-return item;},onItemSelectionChanged_(e){if(this.changingItemSelection_)return;if(this.renderPassQuads_){this.onRenderPassSelected_(e);}else{this.onLayerSelected_(e);}
-tr.b.dispatchSimpleEvent(this,'selection-change',false);},onRenderPassSelected_(e){let selectedRenderPass;let selectedRenderPassId;if(this.itemList_.selectedElement){selectedRenderPass=this.itemList_.selectedElement.renderPass;selectedRenderPassId=this.itemList_.selectedElement.renderPassId;}
-if(selectedRenderPass){this.selection_=new tr.ui.e.chrome.cc.RenderPassSelection(selectedRenderPass,selectedRenderPassId);}else{this.selection_=undefined;}},onLayerSelected_(e){let selectedLayer;if(this.itemList_.selectedElement){selectedLayer=this.itemList_.selectedElement.layer;}
-if(selectedLayer){this.selection_=new tr.ui.e.chrome.cc.LayerSelection(selectedLayer);}else{this.selection_=undefined;}},get selection(){return this.selection_;},set selection(selection){if(this.selection_===selection)return;this.selection_=selection;this.updateContents_();}};return{LayerPicker,};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function RenderPassSnapshot(){ObjectSnapshot.apply(this,arguments);}
-RenderPassSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);},initialize(){tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['quadList']);}};ObjectSnapshot.subTypes.register(RenderPassSnapshot,{typeName:'cc::RenderPass'});return{RenderPassSnapshot,};});'use strict';tr.exportTo('tr.ui.b',function(){const deg2rad=tr.b.math.deg2rad;const constants={DEFAULT_SCALE:0.5,DEFAULT_EYE_DISTANCE:10000,MINIMUM_DISTANCE:1000,MAXIMUM_DISTANCE:100000,FOV:15,RESCALE_TIMEOUT_MS:200,MAXIMUM_TILT:80,SETTINGS_NAMESPACE:'tr.ui_camera'};const Camera=tr.ui.b.define('camera');Camera.prototype={__proto__:HTMLUnknownElement.prototype,decorate(eventSource){this.eventSource_=eventSource;this.eventSource_.addEventListener('beginpan',this.onPanBegin_.bind(this));this.eventSource_.addEventListener('updatepan',this.onPanUpdate_.bind(this));this.eventSource_.addEventListener('endpan',this.onPanEnd_.bind(this));this.eventSource_.addEventListener('beginzoom',this.onZoomBegin_.bind(this));this.eventSource_.addEventListener('updatezoom',this.onZoomUpdate_.bind(this));this.eventSource_.addEventListener('endzoom',this.onZoomEnd_.bind(this));this.eventSource_.addEventListener('beginrotate',this.onRotateBegin_.bind(this));this.eventSource_.addEventListener('updaterotate',this.onRotateUpdate_.bind(this));this.eventSource_.addEventListener('endrotate',this.onRotateEnd_.bind(this));this.eye_=[0,0,constants.DEFAULT_EYE_DISTANCE];this.gazeTarget_=[0,0,0];this.rotation_=[0,0];this.pixelRatio_=window.devicePixelRatio||1;},get modelViewMatrix(){const mvMatrix=mat4.create();mat4.lookAt(mvMatrix,this.eye_,this.gazeTarget_,[0,1,0]);return mvMatrix;},get projectionMatrix(){const rect=tr.ui.b.windowRectForElement(this.canvas_).scaleSize(this.pixelRatio_);const aspectRatio=rect.width/rect.height;const matrix=mat4.create();mat4.perspective(matrix,deg2rad(constants.FOV),aspectRatio,1,100000);return matrix;},set canvas(c){this.canvas_=c;},set deviceRect(rect){this.deviceRect_=rect;},get stackingDistanceDampening(){const gazeVector=[this.gazeTarget_[0]-this.eye_[0],this.gazeTarget_[1]-this.eye_[1],this.gazeTarget_[2]-this.eye_[2]];vec3.normalize(gazeVector,gazeVector);return 1+gazeVector[2];},loadCameraFromSettings(settings){this.eye_=settings.get('eye',this.eye_,constants.SETTINGS_NAMESPACE);this.gazeTarget_=settings.get('gaze_target',this.gazeTarget_,constants.SETTINGS_NAMESPACE);this.rotation_=settings.get('rotation',this.rotation_,constants.SETTINGS_NAMESPACE);this.dispatchRenderEvent_();},saveCameraToSettings(settings){settings.set('eye',this.eye_,constants.SETTINGS_NAMESPACE);settings.set('gaze_target',this.gazeTarget_,constants.SETTINGS_NAMESPACE);settings.set('rotation',this.rotation_,constants.SETTINGS_NAMESPACE);},resetCamera(){this.eye_=[0,0,constants.DEFAULT_EYE_DISTANCE];this.gazeTarget_=[0,0,0];this.rotation_=[0,0];const settings=tr.b.SessionSettings();const keys=settings.keys(constants.SETTINGS_NAMESPACE);if(keys.length!==0){this.loadCameraFromSettings(settings);return;}
-if(this.deviceRect_){const rect=tr.ui.b.windowRectForElement(this.canvas_).scaleSize(this.pixelRatio_);this.eye_[0]=this.deviceRect_.width/2;this.eye_[1]=this.deviceRect_.height/2;this.gazeTarget_[0]=this.deviceRect_.width/2;this.gazeTarget_[1]=this.deviceRect_.height/2;}
-this.saveCameraToSettings(settings);this.dispatchRenderEvent_();},updatePanByDelta(delta){const rect=tr.ui.b.windowRectForElement(this.canvas_).scaleSize(this.pixelRatio_);const eyeVector=[this.eye_[0]-this.gazeTarget_[0],this.eye_[1]-this.gazeTarget_[1],this.eye_[2]-this.gazeTarget_[2]];const length=vec3.length(eyeVector);vec3.normalize(eyeVector,eyeVector);const halfFov=constants.FOV/2;const multiplier=2.0*length*Math.tan(deg2rad(halfFov))/rect.height;const up=[0,1,0];const rotMatrix=mat4.create();mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[1]),[0,1,0]);mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[0]),[1,0,0]);vec3.transformMat4(up,up,rotMatrix);const right=[0,0,0];vec3.cross(right,eyeVector,up);vec3.normalize(right,right);for(let i=0;i<3;++i){this.gazeTarget_[i]+=delta[0]*multiplier*right[i]-delta[1]*multiplier*up[i];this.eye_[i]=this.gazeTarget_[i]+length*eyeVector[i];}
-if(Math.abs(this.gazeTarget_[2])>1e-6){const gazeVector=[-eyeVector[0],-eyeVector[1],-eyeVector[2]];const newLength=tr.b.math.clamp(-this.eye_[2]/gazeVector[2],constants.MINIMUM_DISTANCE,constants.MAXIMUM_DISTANCE);for(let i=0;i<3;++i){this.gazeTarget_[i]=this.eye_[i]+newLength*gazeVector[i];}}
-this.saveCameraToSettings(tr.b.SessionSettings());this.dispatchRenderEvent_();},updateZoomByDelta(delta){let deltaY=delta[1];deltaY=tr.b.math.clamp(deltaY,-50,50);let scale=1.0-deltaY/100.0;const eyeVector=[0,0,0];vec3.subtract(eyeVector,this.eye_,this.gazeTarget_);const length=vec3.length(eyeVector);if(length*scale<constants.MINIMUM_DISTANCE){scale=constants.MINIMUM_DISTANCE/length;}else if(length*scale>constants.MAXIMUM_DISTANCE){scale=constants.MAXIMUM_DISTANCE/length;}
-vec3.scale(eyeVector,eyeVector,scale);vec3.add(this.eye_,this.gazeTarget_,eyeVector);this.saveCameraToSettings(tr.b.SessionSettings());this.dispatchRenderEvent_();},updateRotateByDelta(delta){delta[0]*=0.5;delta[1]*=0.5;if(Math.abs(this.rotation_[0]+delta[1])>constants.MAXIMUM_TILT){return;}
-if(Math.abs(this.rotation_[1]-delta[0])>constants.MAXIMUM_TILT){return;}
-const eyeVector=[0,0,0,0];vec3.subtract(eyeVector,this.eye_,this.gazeTarget_);const rotMatrix=mat4.create();mat4.rotate(rotMatrix,rotMatrix,-deg2rad(this.rotation_[0]),[1,0,0]);mat4.rotate(rotMatrix,rotMatrix,-deg2rad(this.rotation_[1]),[0,1,0]);vec4.transformMat4(eyeVector,eyeVector,rotMatrix);this.rotation_[0]+=delta[1];this.rotation_[1]-=delta[0];mat4.identity(rotMatrix);mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[1]),[0,1,0]);mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[0]),[1,0,0]);vec4.transformMat4(eyeVector,eyeVector,rotMatrix);vec3.add(this.eye_,this.gazeTarget_,eyeVector);this.saveCameraToSettings(tr.b.SessionSettings());this.dispatchRenderEvent_();},onPanBegin_(e){this.panning_=true;this.lastMousePosition_=this.getMousePosition_(e);},onPanUpdate_(e){if(!this.panning_)return;const delta=this.getMouseDelta_(e,this.lastMousePosition_);this.lastMousePosition_=this.getMousePosition_(e);this.updatePanByDelta(delta);},onPanEnd_(e){this.panning_=false;},onZoomBegin_(e){this.zooming_=true;const p=this.getMousePosition_(e);this.lastMousePosition_=p;this.zoomPoint_=p;},onZoomUpdate_(e){if(!this.zooming_)return;const delta=this.getMouseDelta_(e,this.lastMousePosition_);this.lastMousePosition_=this.getMousePosition_(e);this.updateZoomByDelta(delta);},onZoomEnd_(e){this.zooming_=false;this.zoomPoint_=undefined;},onRotateBegin_(e){this.rotating_=true;this.lastMousePosition_=this.getMousePosition_(e);},onRotateUpdate_(e){if(!this.rotating_)return;const delta=this.getMouseDelta_(e,this.lastMousePosition_);this.lastMousePosition_=this.getMousePosition_(e);this.updateRotateByDelta(delta);},onRotateEnd_(e){this.rotating_=false;},getMousePosition_(e){const rect=tr.ui.b.windowRectForElement(this.canvas_);return[(e.clientX-rect.x)*this.pixelRatio_,(e.clientY-rect.y)*this.pixelRatio_];},getMouseDelta_(e,p){const newP=this.getMousePosition_(e);return[newP[0]-p[0],newP[1]-p[1]];},dispatchRenderEvent_(){tr.b.dispatchSimpleEvent(this,'renderrequired',false,false);}};return{Camera,};});'use strict';tr.exportTo('tr.ui.b',function(){const THIS_DOC=document.currentScript.ownerDocument;const constants={};constants.IMAGE_LOAD_RETRY_TIME_MS=500;constants.SUBDIVISION_MINIMUM=1;constants.SUBDIVISION_RECURSION_DEPTH=3;constants.SUBDIVISION_DEPTH_THRESHOLD=100;constants.FAR_PLANE_DISTANCE=10000;function drawTexturedTriangle(ctx,img,p0,p1,p2,t0,t1,t2){const tmpP0=[p0[0],p0[1]];const tmpP1=[p1[0],p1[1]];const tmpP2=[p2[0],p2[1]];const tmpT0=[t0[0],t0[1]];const tmpT1=[t1[0],t1[1]];const tmpT2=[t2[0],t2[1]];ctx.beginPath();ctx.moveTo(tmpP0[0],tmpP0[1]);ctx.lineTo(tmpP1[0],tmpP1[1]);ctx.lineTo(tmpP2[0],tmpP2[1]);ctx.closePath();tmpP1[0]-=tmpP0[0];tmpP1[1]-=tmpP0[1];tmpP2[0]-=tmpP0[0];tmpP2[1]-=tmpP0[1];tmpT1[0]-=tmpT0[0];tmpT1[1]-=tmpT0[1];tmpT2[0]-=tmpT0[0];tmpT2[1]-=tmpT0[1];const det=1/(tmpT1[0]*tmpT2[1]-tmpT2[0]*tmpT1[1]);const a=(tmpT2[1]*tmpP1[0]-tmpT1[1]*tmpP2[0])*det;const b=(tmpT2[1]*tmpP1[1]-tmpT1[1]*tmpP2[1])*det;const c=(tmpT1[0]*tmpP2[0]-tmpT2[0]*tmpP1[0])*det;const d=(tmpT1[0]*tmpP2[1]-tmpT2[0]*tmpP1[1])*det;const e=tmpP0[0]-a*tmpT0[0]-c*tmpT0[1];const f=tmpP0[1]-b*tmpT0[0]-d*tmpT0[1];ctx.save();ctx.transform(a,b,c,d,e,f);ctx.clip();ctx.drawImage(img,0,0);ctx.restore();}
-function drawTriangleSub(ctx,img,p0,p1,p2,t0,t1,t2,opt_recursionDepth){const depth=opt_recursionDepth||0;let subdivisionIndex=0;if(depth<constants.SUBDIVISION_MINIMUM){subdivisionIndex=7;}else if(depth<constants.SUBDIVISION_RECURSION_DEPTH){if(Math.abs(p0[2]-p1[2])>constants.SUBDIVISION_DEPTH_THRESHOLD){subdivisionIndex+=1;}
-if(Math.abs(p0[2]-p2[2])>constants.SUBDIVISION_DEPTH_THRESHOLD){subdivisionIndex+=2;}
-if(Math.abs(p1[2]-p2[2])>constants.SUBDIVISION_DEPTH_THRESHOLD){subdivisionIndex+=4;}}
-const p01=vec4.create();const p02=vec4.create();const p12=vec4.create();const t01=vec2.create();const t02=vec2.create();const t12=vec2.create();for(let i=0;i<2;++i){p0[i]*=p0[2];p1[i]*=p1[2];p2[i]*=p2[2];}
-for(let i=0;i<4;++i){p01[i]=(p0[i]+p1[i])/2;p02[i]=(p0[i]+p2[i])/2;p12[i]=(p1[i]+p2[i])/2;}
-for(let i=0;i<2;++i){p0[i]/=p0[2];p1[i]/=p1[2];p2[i]/=p2[2];p01[i]/=p01[2];p02[i]/=p02[2];p12[i]/=p12[2];}
-for(let i=0;i<2;++i){t01[i]=(t0[i]+t1[i])/2;t02[i]=(t0[i]+t2[i])/2;t12[i]=(t1[i]+t2[i])/2;}
-switch(subdivisionIndex){case 1:drawTriangleSub(ctx,img,p0,p01,p2,t0,t01,t2,depth+1);drawTriangleSub(ctx,img,p01,p1,p2,t01,t1,t2,depth+1);break;case 2:drawTriangleSub(ctx,img,p0,p1,p02,t0,t1,t02,depth+1);drawTriangleSub(ctx,img,p1,p02,p2,t1,t02,t2,depth+1);break;case 3:drawTriangleSub(ctx,img,p0,p01,p02,t0,t01,t02,depth+1);drawTriangleSub(ctx,img,p02,p01,p2,t02,t01,t2,depth+1);drawTriangleSub(ctx,img,p01,p1,p2,t01,t1,t2,depth+1);break;case 4:drawTriangleSub(ctx,img,p0,p12,p2,t0,t12,t2,depth+1);drawTriangleSub(ctx,img,p0,p1,p12,t0,t1,t12,depth+1);break;case 5:drawTriangleSub(ctx,img,p0,p01,p2,t0,t01,t2,depth+1);drawTriangleSub(ctx,img,p2,p01,p12,t2,t01,t12,depth+1);drawTriangleSub(ctx,img,p01,p1,p12,t01,t1,t12,depth+1);break;case 6:drawTriangleSub(ctx,img,p0,p12,p02,t0,t12,t02,depth+1);drawTriangleSub(ctx,img,p0,p1,p12,t0,t1,t12,depth+1);drawTriangleSub(ctx,img,p02,p12,p2,t02,t12,t2,depth+1);break;case 7:drawTriangleSub(ctx,img,p0,p01,p02,t0,t01,t02,depth+1);drawTriangleSub(ctx,img,p01,p12,p02,t01,t12,t02,depth+1);drawTriangleSub(ctx,img,p01,p1,p12,t01,t1,t12,depth+1);drawTriangleSub(ctx,img,p02,p12,p2,t02,t12,t2,depth+1);break;default:drawTexturedTriangle(ctx,img,p0,p1,p2,t0,t1,t2);break;}}
-const tmpVec4=vec4.create();function transform(transformed,point,matrix,viewport){vec4.set(tmpVec4,point[0],point[1],0,1);vec4.transformMat4(tmpVec4,tmpVec4,matrix);let w=tmpVec4[3];if(w<1e-6)w=1e-6;transformed[0]=((tmpVec4[0]/w)+1)*viewport.width/2;transformed[1]=((tmpVec4[1]/w)+1)*viewport.height/2;transformed[2]=w;}
-function drawProjectedQuadBackgroundToContext(quad,p1,p2,p3,p4,ctx,quadCanvas){if(quad.imageData){quadCanvas.width=quad.imageData.width;quadCanvas.height=quad.imageData.height;quadCanvas.getContext('2d').putImageData(quad.imageData,0,0);const quadBBox=new tr.b.math.BBox2();quadBBox.addQuad(quad);const iw=quadCanvas.width;const ih=quadCanvas.height;drawTriangleSub(ctx,quadCanvas,p1,p2,p4,[0,0],[iw,0],[0,ih]);drawTriangleSub(ctx,quadCanvas,p2,p3,p4,[iw,0],[iw,ih],[0,ih]);}
-if(quad.backgroundColor){ctx.fillStyle=quad.backgroundColor;ctx.beginPath();ctx.moveTo(p1[0],p1[1]);ctx.lineTo(p2[0],p2[1]);ctx.lineTo(p3[0],p3[1]);ctx.lineTo(p4[0],p4[1]);ctx.closePath();ctx.fill();}}
-function drawProjectedQuadOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas){ctx.beginPath();ctx.moveTo(p1[0],p1[1]);ctx.lineTo(p2[0],p2[1]);ctx.lineTo(p3[0],p3[1]);ctx.lineTo(p4[0],p4[1]);ctx.closePath();ctx.save();if(quad.borderColor){ctx.strokeStyle=quad.borderColor;}else{ctx.strokeStyle='rgb(128,128,128)';}
-if(quad.shadowOffset){ctx.shadowColor='rgb(0, 0, 0)';ctx.shadowOffsetX=quad.shadowOffset[0];ctx.shadowOffsetY=quad.shadowOffset[1];if(quad.shadowBlur){ctx.shadowBlur=quad.shadowBlur;}}
-if(quad.borderWidth){ctx.lineWidth=quad.borderWidth;}else{ctx.lineWidth=1;}
-ctx.stroke();ctx.restore();}
-function drawProjectedQuadSelectionOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas){if(!quad.upperBorderColor)return;ctx.lineWidth=8;ctx.strokeStyle=quad.upperBorderColor;ctx.beginPath();ctx.moveTo(p1[0],p1[1]);ctx.lineTo(p2[0],p2[1]);ctx.lineTo(p3[0],p3[1]);ctx.lineTo(p4[0],p4[1]);ctx.closePath();ctx.stroke();}
-function drawProjectedQuadToContext(passNumber,quad,p1,p2,p3,p4,ctx,quadCanvas){if(passNumber===0){drawProjectedQuadBackgroundToContext(quad,p1,p2,p3,p4,ctx,quadCanvas);}else if(passNumber===1){drawProjectedQuadOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas);}else if(passNumber===2){drawProjectedQuadSelectionOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas);}else{throw new Error('Invalid pass number');}}
-const tmpP1=vec3.create();const tmpP2=vec3.create();const tmpP3=vec3.create();const tmpP4=vec3.create();function transformAndProcessQuads(matrix,viewport,quads,numPasses,handleQuadFunc,opt_arg1,opt_arg2){for(let passNumber=0;passNumber<numPasses;passNumber++){for(let i=0;i<quads.length;i++){const quad=quads[i];transform(tmpP1,quad.p1,matrix,viewport);transform(tmpP2,quad.p2,matrix,viewport);transform(tmpP3,quad.p3,matrix,viewport);transform(tmpP4,quad.p4,matrix,viewport);handleQuadFunc(passNumber,quad,tmpP1,tmpP2,tmpP3,tmpP4,opt_arg1,opt_arg2);}}}
-const QuadStackView=tr.ui.b.define('quad-stack-view');QuadStackView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.className='quad-stack-view';this.style.display='flex';this.style.position='relative';const node=tr.ui.b.instantiateTemplate('#quad-stack-view-template',THIS_DOC);Polymer.dom(this).appendChild(node);this.updateHeaderVisibility_();const header=Polymer.dom(this).querySelector('#header');header.style.position='absolute';header.style.fontSize='70%';header.style.top='10px';header.style.left='10px';header.style.right='150px';const scroller=Polymer.dom(this).querySelector('#canvas-scroller');scroller.style.flexGrow=1;scroller.style.flexShrink=1;scroller.style.flexBasis='auto';scroller.style.minWidth=0;scroller.style.minHeight=0;scroller.style.overflow='auto';this.canvas_=Polymer.dom(this).querySelector('#canvas');this.chromeImages_={left:Polymer.dom(this).querySelector('#chrome-left'),mid:Polymer.dom(this).querySelector('#chrome-mid'),right:Polymer.dom(this).querySelector('#chrome-right')};const stackingDistanceSlider=Polymer.dom(this).querySelector('#stacking-distance-slider');stackingDistanceSlider.style.position='absolute';stackingDistanceSlider.style.fontSize='70%';stackingDistanceSlider.style.top='10px';stackingDistanceSlider.style.right='10px';stackingDistanceSlider.value=tr.b.Settings.get('quadStackView.stackingDistance',45);stackingDistanceSlider.addEventListener('change',this.onStackingDistanceChange_.bind(this));stackingDistanceSlider.addEventListener('input',this.onStackingDistanceChange_.bind(this));this.trackMouse_();this.camera_=new tr.ui.b.Camera(this.mouseModeSelector_);this.camera_.addEventListener('renderrequired',this.onRenderRequired_.bind(this));this.cameraWasReset_=false;this.camera_.canvas=this.canvas_;this.viewportRect_=tr.b.math.Rect.fromXYWH(0,0,0,0);this.pixelRatio_=window.devicePixelRatio||1;},updateHeaderVisibility_(){if(this.headerText){Polymer.dom(this).querySelector('#header').style.display='';}else{Polymer.dom(this).querySelector('#header').style.display='none';}},get headerText(){return Polymer.dom(this).querySelector('#header').textContent;},set headerText(headerText){Polymer.dom(this).querySelector('#header').textContent=headerText;this.updateHeaderVisibility_();},onStackingDistanceChange_(e){tr.b.Settings.set('quadStackView.stackingDistance',this.stackingDistance);this.scheduleRender();e.stopPropagation();},get stackingDistance(){return Polymer.dom(this).querySelector('#stacking-distance-slider').value;},get mouseModeSelector(){return this.mouseModeSelector_;},get camera(){return this.camera_;},set quads(q){this.quads_=q;this.scheduleRender();},set deviceRect(rect){if(!rect||rect.equalTo(this.deviceRect_))return;this.deviceRect_=rect;this.camera_.deviceRect=rect;this.chromeQuad_=undefined;},resize(){if(!this.offsetParent)return true;const width=parseInt(window.getComputedStyle(this.offsetParent).width);const height=parseInt(window.getComputedStyle(this.offsetParent).height);const rect=tr.b.math.Rect.fromXYWH(0,0,width,height);if(rect.equalTo(this.viewportRect_))return false;this.viewportRect_=rect;this.canvas_.style.width=width+'px';this.canvas_.style.height=height+'px';this.canvas_.width=this.pixelRatio_*width;this.canvas_.height=this.pixelRatio_*height;if(!this.cameraWasReset_){this.camera_.resetCamera();this.cameraWasReset_=true;}
-return true;},readyToDraw(){if(!this.chromeImages_.left.src){let leftContent=window.getComputedStyle(this.chromeImages_.left).backgroundImage;leftContent=tr.ui.b.extractUrlString(leftContent);let midContent=window.getComputedStyle(this.chromeImages_.mid).backgroundImage;midContent=tr.ui.b.extractUrlString(midContent);let rightContent=window.getComputedStyle(this.chromeImages_.right).backgroundImage;rightContent=tr.ui.b.extractUrlString(rightContent);this.chromeImages_.left.src=leftContent;this.chromeImages_.mid.src=midContent;this.chromeImages_.right.src=rightContent;}
-return(this.chromeImages_.left.height>0)&&(this.chromeImages_.mid.height>0)&&(this.chromeImages_.right.height>0);},get chromeQuad(){if(this.chromeQuad_)return this.chromeQuad_;const chromeCanvas=document.createElement('canvas');const offsetY=this.chromeImages_.left.height;chromeCanvas.width=this.deviceRect_.width;chromeCanvas.height=this.deviceRect_.height+offsetY;const leftWidth=this.chromeImages_.left.width;const midWidth=this.chromeImages_.mid.width;const rightWidth=this.chromeImages_.right.width;const chromeCtx=chromeCanvas.getContext('2d');chromeCtx.drawImage(this.chromeImages_.left,0,0);chromeCtx.save();chromeCtx.translate(leftWidth,0);const s=(this.deviceRect_.width-leftWidth-rightWidth)/midWidth;chromeCtx.scale(s,1);chromeCtx.drawImage(this.chromeImages_.mid,0,0);chromeCtx.restore();chromeCtx.drawImage(this.chromeImages_.right,leftWidth+s*midWidth,0);const chromeRect=tr.b.math.Rect.fromXYWH(this.deviceRect_.x,this.deviceRect_.y-offsetY,this.deviceRect_.width,this.deviceRect_.height+offsetY);const chromeQuad=tr.b.math.Quad.fromRect(chromeRect);chromeQuad.stackingGroupId=this.maxStackingGroupId_+1;chromeQuad.imageData=chromeCtx.getImageData(0,0,chromeCanvas.width,chromeCanvas.height);chromeQuad.shadowOffset=[0,0];chromeQuad.shadowBlur=5;chromeQuad.borderWidth=3;this.chromeQuad_=chromeQuad;return this.chromeQuad_;},scheduleRender(){if(this.redrawScheduled_)return false;this.redrawScheduled_=true;tr.b.requestAnimationFrame(this.render,this);},onRenderRequired_(e){this.scheduleRender();},stackTransformAndProcessQuads_(numPasses,handleQuadFunc,includeChromeQuad,opt_arg1,opt_arg2){const mv=this.camera_.modelViewMatrix;const p=this.camera_.projectionMatrix;const viewport=tr.b.math.Rect.fromXYWH(0,0,this.canvas_.width,this.canvas_.height);const quadStacks=[];for(let i=0;i<this.quads_.length;++i){const quad=this.quads_[i];const stackingId=quad.stackingGroupId||0;while(stackingId>=quadStacks.length){quadStacks.push([]);}
-quadStacks[stackingId].push(quad);}
-const mvp=mat4.create();this.maxStackingGroupId_=quadStacks.length;const effectiveStackingDistance=this.stackingDistance*this.camera_.stackingDistanceDampening;mat4.multiply(mvp,p,mv);for(let i=0;i<quadStacks.length;++i){transformAndProcessQuads(mvp,viewport,quadStacks[i],numPasses,handleQuadFunc,opt_arg1,opt_arg2);mat4.translate(mv,mv,[0,0,effectiveStackingDistance]);mat4.multiply(mvp,p,mv);}
-if(includeChromeQuad&&this.deviceRect_){transformAndProcessQuads(mvp,viewport,[this.chromeQuad],numPasses,drawProjectedQuadToContext,opt_arg1,opt_arg2);}},render(){this.redrawScheduled_=false;if(!this.readyToDraw()){setTimeout(this.scheduleRender.bind(this),constants.IMAGE_LOAD_RETRY_TIME_MS);return;}
-if(!this.quads_)return;const canvasCtx=this.canvas_.getContext('2d');if(!this.resize()){canvasCtx.clearRect(0,0,this.canvas_.width,this.canvas_.height);}
-const quadCanvas=document.createElement('canvas');this.stackTransformAndProcessQuads_(3,drawProjectedQuadToContext,true,canvasCtx,quadCanvas);quadCanvas.width=0;},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.canvas_;this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.SELECTION|tr.ui.b.MOUSE_SELECTOR_MODE.PANSCAN|tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM|tr.ui.b.MOUSE_SELECTOR_MODE.ROTATE;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.PANSCAN;this.mouseModeSelector_.pos={x:0,y:100};Polymer.dom(this).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.settingsKey='quadStackView.mouseModeSelector';this.mouseModeSelector_.setModifierForAlternateMode(tr.ui.b.MOUSE_SELECTOR_MODE.ROTATE,tr.ui.b.MODIFIER.SHIFT);this.mouseModeSelector_.setModifierForAlternateMode(tr.ui.b.MOUSE_SELECTOR_MODE.PANSCAN,tr.ui.b.MODIFIER.SPACE);this.mouseModeSelector_.setModifierForAlternateMode(tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM,tr.ui.b.MODIFIER.CMD_OR_CTRL);this.mouseModeSelector_.addEventListener('updateselection',this.onSelectionUpdate_.bind(this));this.mouseModeSelector_.addEventListener('endselection',this.onSelectionUpdate_.bind(this));},extractRelativeMousePosition_(e){const br=this.canvas_.getBoundingClientRect();return[this.pixelRatio_*(e.clientX-this.canvas_.offsetLeft-br.left),this.pixelRatio_*(e.clientY-this.canvas_.offsetTop-br.top)];},onSelectionUpdate_(e){const mousePos=this.extractRelativeMousePosition_(e);const res=[];function handleQuad(passNumber,quad,p1,p2,p3,p4){if(tr.b.math.pointInImplicitQuad(mousePos,p1,p2,p3,p4)){res.push(quad);}}
-this.stackTransformAndProcessQuads_(1,handleQuad,false);e=new tr.b.Event('selectionchange');e.quads=res;this.dispatchEvent(e);}};return{QuadStackView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const ColorScheme=tr.b.ColorScheme;const THIS_DOC=document.currentScript.ownerDocument;const TILE_HEATMAP_TYPE={};TILE_HEATMAP_TYPE.NONE='none';TILE_HEATMAP_TYPE.SCHEDULED_PRIORITY='scheduledPriority';TILE_HEATMAP_TYPE.USING_GPU_MEMORY='usingGpuMemory';const cc=tr.ui.e.chrome.cc;function createTileRectsSelectorBaseOptions(){return[{label:'None',value:'none'},{label:'Coverage Rects',value:'coverage'}];}
-const LayerTreeQuadStackView=tr.ui.b.define('tr-ui-e-chrome-cc-layer-tree-quad-stack-view');LayerTreeQuadStackView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.style.flexGrow=1;this.style.flexShrink=1;this.style.flexBasis='auto';this.style.flexDirection='column';this.style.minHeight=0;this.style.display='flex';this.isRenderPassQuads_=false;this.pictureAsImageData_={};this.messages_=[];this.controls_=document.createElement('top-controls');this.controls_.style.flexGrow=0;this.controls_.style.flexShrink=0;this.controls_.style.flexBasis='auto';this.controls_.style.backgroundImage='-webkit-gradient(linear, 0 0, 100% 0, from(#E5E5E5), to(#D1D1D1))';this.controls_.style.borderBottom='1px solid #8e8e8e';this.controls_.style.borderTop='1px solid white';this.controls_.style.display='flex';this.controls_.style.flexDirection='row';this.controls_.style.flexWrap='wrap';this.controls_.style.fontSize='14px';this.controls_.style.paddingLeft='2px';this.controls_.style.overflow='hidden';this.infoBar_=document.createElement('tr-ui-b-info-bar');this.quadStackView_=new tr.ui.b.QuadStackView();this.quadStackView_.addEventListener('selectionchange',this.onQuadStackViewSelectionChange_.bind(this));this.quadStackView_.style.flexGrow=1;this.quadStackView_.style.flexShrink=1;this.quadStackView_.style.flexBasis='auto';this.quadStackView_.style.minWidth='200px';this.extraHighlightsByLayerId_=undefined;this.inputEventImageData_=undefined;const m=tr.ui.b.MOUSE_SELECTOR_MODE;const mms=this.quadStackView_.mouseModeSelector;mms.settingsKey='tr.e.cc.layerTreeQuadStackView.mouseModeSelector';mms.setKeyCodeForMode(m.SELECTION,'Z'.charCodeAt(0));mms.setKeyCodeForMode(m.PANSCAN,'X'.charCodeAt(0));mms.setKeyCodeForMode(m.ZOOM,'C'.charCodeAt(0));mms.setKeyCodeForMode(m.ROTATE,'V'.charCodeAt(0));const node=tr.ui.b.instantiateTemplate('#tr-ui-e-chrome-cc-layer-tree-quad-stack-view-template',THIS_DOC);Polymer.dom(this).appendChild(node);Polymer.dom(this).appendChild(this.controls_);Polymer.dom(this).appendChild(this.infoBar_);Polymer.dom(this).appendChild(this.quadStackView_);this.tileRectsSelector_=tr.ui.b.createSelector(this,'howToShowTiles','layerView.howToShowTiles','none',createTileRectsSelectorBaseOptions());Polymer.dom(this.controls_).appendChild(this.tileRectsSelector_);const tileHeatmapText=tr.ui.b.createSpan({textContent:'Tile heatmap:'});Polymer.dom(this.controls_).appendChild(tileHeatmapText);const tileHeatmapSelector=tr.ui.b.createSelector(this,'tileHeatmapType','layerView.tileHeatmapType',TILE_HEATMAP_TYPE.NONE,[{label:'None',value:TILE_HEATMAP_TYPE.NONE},{label:'Scheduled Priority',value:TILE_HEATMAP_TYPE.SCHEDULED_PRIORITY},{label:'Is using GPU memory',value:TILE_HEATMAP_TYPE.USING_GPU_MEMORY}]);Polymer.dom(this.controls_).appendChild(tileHeatmapSelector);const showOtherLayersCheckbox=tr.ui.b.createCheckBox(this,'showOtherLayers','layerView.showOtherLayers',true,'Other layers/passes');showOtherLayersCheckbox.title='When checked, show all layers, selected or not.';Polymer.dom(this.controls_).appendChild(showOtherLayersCheckbox);const showInvalidationsCheckbox=tr.ui.b.createCheckBox(this,'showInvalidations','layerView.showInvalidations',true,'Invalidations');showInvalidationsCheckbox.title='When checked, compositing invalidations are highlighted in red';Polymer.dom(this.controls_).appendChild(showInvalidationsCheckbox);const showUnrecordedRegionCheckbox=tr.ui.b.createCheckBox(this,'showUnrecordedRegion','layerView.showUnrecordedRegion',true,'Unrecorded area');showUnrecordedRegionCheckbox.title='When checked, unrecorded areas are highlighted in yellow';Polymer.dom(this.controls_).appendChild(showUnrecordedRegionCheckbox);const showBottlenecksCheckbox=tr.ui.b.createCheckBox(this,'showBottlenecks','layerView.showBottlenecks',true,'Bottlenecks');showBottlenecksCheckbox.title='When checked, scroll bottlenecks are highlighted';Polymer.dom(this.controls_).appendChild(showBottlenecksCheckbox);const showLayoutRectsCheckbox=tr.ui.b.createCheckBox(this,'showLayoutRects','layerView.showLayoutRects',false,'Layout rects');showLayoutRectsCheckbox.title='When checked, shows rects for regions where layout happened';Polymer.dom(this.controls_).appendChild(showLayoutRectsCheckbox);const showContentsCheckbox=tr.ui.b.createCheckBox(this,'showContents','layerView.showContents',true,'Contents');showContentsCheckbox.title='When checked, show the rendered contents inside the layer outlines';Polymer.dom(this.controls_).appendChild(showContentsCheckbox);const showAnimationBoundsCheckbox=tr.ui.b.createCheckBox(this,'showAnimationBounds','layerView.showAnimationBounds',false,'Animation Bounds');showAnimationBoundsCheckbox.title='When checked, show a border around'+' a layer showing the extent of its animation.';Polymer.dom(this.controls_).appendChild(showAnimationBoundsCheckbox);const showInputEventsCheckbox=tr.ui.b.createCheckBox(this,'showInputEvents','layerView.showInputEvents',true,'Input events');showInputEventsCheckbox.title='When checked, input events are '+'displayed as circles.';Polymer.dom(this.controls_).appendChild(showInputEventsCheckbox);this.whatRasterizedLink_=document.createElement('tr-ui-a-analysis-link');this.whatRasterizedLink_.style.position='absolute';this.whatRasterizedLink_.style.bottom='15px';this.whatRasterizedLink_.style.left='10px';this.whatRasterizedLink_.selection=this.getWhatRasterizedEventSet_.bind(this);Polymer.dom(this.quadStackView_).appendChild(this.whatRasterizedLink_);},get layerTreeImpl(){return this.layerTreeImpl_;},set isRenderPassQuads(newValue){this.isRenderPassQuads_=newValue;},set layerTreeImpl(layerTreeImpl){if(this.layerTreeImpl_===layerTreeImpl)return;this.layerTreeImpl_=layerTreeImpl;this.selection=undefined;},get extraHighlightsByLayerId(){return this.extraHighlightsByLayerId_;},set extraHighlightsByLayerId(extraHighlightsByLayerId){this.extraHighlightsByLayerId_=extraHighlightsByLayerId;this.scheduleUpdateContents_();},get showOtherLayers(){return this.showOtherLayers_;},set showOtherLayers(show){this.showOtherLayers_=show;this.updateContents_();},get showAnimationBounds(){return this.showAnimationBounds_;},set showAnimationBounds(show){this.showAnimationBounds_=show;this.updateContents_();},get showInputEvents(){return this.showInputEvents_;},set showInputEvents(show){this.showInputEvents_=show;this.updateContents_();},get showContents(){return this.showContents_;},set showContents(show){this.showContents_=show;this.updateContents_();},get showInvalidations(){return this.showInvalidations_;},set showInvalidations(show){this.showInvalidations_=show;this.updateContents_();},get showUnrecordedRegion(){return this.showUnrecordedRegion_;},set showUnrecordedRegion(show){this.showUnrecordedRegion_=show;this.updateContents_();},get showBottlenecks(){return this.showBottlenecks_;},set showBottlenecks(show){this.showBottlenecks_=show;this.updateContents_();},get showLayoutRects(){return this.showLayoutRects_;},set showLayoutRects(show){this.showLayoutRects_=show;this.updateContents_();},get howToShowTiles(){return this.howToShowTiles_;},set howToShowTiles(val){if(val!=='none'&&val!=='coverage'&&isNaN(parseFloat(val))){throw new Error('howToShowTiles requires "none" or "coverage" or a number');}
-this.howToShowTiles_=val;this.updateContents_();},get tileHeatmapType(){return this.tileHeatmapType_;},set tileHeatmapType(val){this.tileHeatmapType_=val;this.updateContents_();},get selection(){return this.selection_;},set selection(selection){if(this.selection===selection)return;this.selection_=selection;tr.b.dispatchSimpleEvent(this,'selection-change');this.updateContents_();},regenerateContent(){this.updateTilesSelector_();this.updateContents_();},loadDataForImageElement_(image,callback){const imageContent=window.getComputedStyle(image).backgroundImage;if(!imageContent){this.scheduleUpdateContents_();return;}
-image.src=tr.ui.b.extractUrlString(imageContent);image.onload=function(){const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=image.width;canvas.height=image.height;ctx.drawImage(image,0,0);const imageData=ctx.getImageData(0,0,canvas.width,canvas.height);callback(imageData);};},onQuadStackViewSelectionChange_(e){const selectableQuads=e.quads.filter(function(q){return q.selectionToSetIfClicked!==undefined;});if(selectableQuads.length===0){this.selection=undefined;return;}
-selectableQuads.sort(function(x,y){const z=x.stackingGroupId-y.stackingGroupId;if(z!==0)return z;return x.selectionToSetIfClicked.specicifity-
-y.selectionToSetIfClicked.specicifity;});const quadToSelect=selectableQuads[selectableQuads.length-1];this.selection=quadToSelect.selectionToSetIfClicked;},scheduleUpdateContents_(){if(this.updateContentsPending_)return;this.updateContentsPending_=true;tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContents_,this);},updateContents_(){if(!this.layerTreeImpl_){this.quadStackView_.headerText='No tree';this.quadStackView_.quads=[];return;}
-const status=this.computePictureLoadingStatus_();if(!status.picturesComplete)return;const lthi=this.layerTreeImpl_.layerTreeHostImpl;const lthiInstance=lthi.objectInstance;const worldViewportRect=tr.b.math.Rect.fromXYWH(0,0,lthi.deviceViewportSize.width,lthi.deviceViewportSize.height);this.quadStackView_.deviceRect=worldViewportRect;if(this.isRenderPassQuads_){this.quadStackView_.quads=this.generateRenderPassQuads();}else{this.quadStackView_.quads=this.generateLayerQuads();}
-this.updateWhatRasterizedLinkState_();let message='';if(lthi.tilesHaveGpuMemoryUsageInfo){const thisTreeUsageInBytes=this.layerTreeImpl_.gpuMemoryUsageInBytes;const otherTreeUsageInBytes=lthi.gpuMemoryUsageInBytes-
-thisTreeUsageInBytes;message+=tr.b.convertUnit(thisTreeUsageInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB on this tree';if(otherTreeUsageInBytes){message+=', '+
-tr.b.convertUnit(otherTreeUsageInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB on the other tree';}}else{if(this.layerTreeImpl_){const thisTreeUsageInBytes=this.layerTreeImpl_.gpuMemoryUsageInBytes;message+=tr.b.convertUnit(thisTreeUsageInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB on this tree';if(this.layerTreeImpl_.otherTree){message+=', ??? MiB on other tree. ';}}}
-if(lthi.args.tileManagerBasicState){const tmgs=lthi.args.tileManagerBasicState.globalState;message+=' (softMax='+
-tr.b.convertUnit(tmgs.softMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, hardMax='+
-tr.b.convertUnit(tmgs.hardMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, '+
-tmgs.memoryLimitPolicy+')';}else{const thread=lthi.snapshottedOnThread;const didManageTilesSlices=thread.sliceGroup.slices.filter(s=>{if(s.category!=='tr.e.cc')return false;if(s.title!=='DidManage')return false;if(s.end>lthi.ts)return false;return true;});didManageTilesSlices.sort(function(x,y){return x.end-y.end;});if(didManageTilesSlices.length>0){const newest=didManageTilesSlices[didManageTilesSlices.length-1];const tmgs=newest.args.state.global_state;message+=' (softMax='+
-tr.b.convertUnit(tmgs.softMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, hardMax='+
-tr.b.convertUnit(tmgs.hardMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, '+
-tmgs.memoryLimitPolicy+')';}}
-if(this.layerTreeImpl_.otherTree){message+=' (Another tree exists)';}
-if(message.length){this.quadStackView_.headerText=message;}else{this.quadStackView_.headerText=undefined;}
-this.updateInfoBar_(status.messages);},updateTilesSelector_(){const data=createTileRectsSelectorBaseOptions();if(this.layerTreeImpl_){const lthi=this.layerTreeImpl_.layerTreeHostImpl;const scaleNames=lthi.getContentsScaleNames();for(const scale in scaleNames){data.push({label:'Scale '+scale+' ('+scaleNames[scale]+')',value:scale});}}
-const newSelector=tr.ui.b.createSelector(this,'howToShowTiles','layerView.howToShowTiles','none',data);this.controls_.replaceChild(newSelector,this.tileRectsSelector_);this.tileRectsSelector_=newSelector;},computePictureLoadingStatus_(){const layers=this.layers;const status={messages:[],picturesComplete:true};if(this.showContents){let hasPendingRasterizeImage=false;let firstPictureError=undefined;let hasMissingLayerRect=false;let hasUnresolvedPictureRef=false;for(let i=0;i<layers.length;i++){const layer=layers[i];for(let ir=0;ir<layer.pictures.length;++ir){const picture=layer.pictures[ir];if(picture.idRef){hasUnresolvedPictureRef=true;continue;}
-if(!picture.layerRect){hasMissingLayerRect=true;continue;}
-const pictureAsImageData=this.pictureAsImageData_[picture.guid];if(!pictureAsImageData){hasPendingRasterizeImage=true;this.pictureAsImageData_[picture.guid]=tr.e.cc.PictureAsImageData.Pending(this);picture.rasterize({stopIndex:undefined},function(pictureImageData){const picture_=pictureImageData.picture;this.pictureAsImageData_[picture_.guid]=pictureImageData;this.scheduleUpdateContents_();}.bind(this));continue;}
-if(pictureAsImageData.isPending()){hasPendingRasterizeImage=true;continue;}
-if(pictureAsImageData.error){if(!firstPictureError){firstPictureError=pictureAsImageData.error;}
-break;}}}
-if(hasPendingRasterizeImage){status.picturesComplete=false;}else{if(hasUnresolvedPictureRef){status.messages.push({header:'Missing picture',details:'Your trace didn\'t have pictures for every layer. '+'Old chrome versions had this problem'});}
-if(hasMissingLayerRect){status.messages.push({header:'Missing layer rect',details:'Your trace may be corrupt or from a very old '+'Chrome revision.'});}
-if(firstPictureError){status.messages.push({header:'Cannot rasterize',details:firstPictureError});}}}
-if(this.showInputEvents&&this.layerTreeImpl.tracedInputLatencies&&this.inputEventImageData_===undefined){const image=Polymer.dom(this).querySelector('#input-event');if(!image.src){this.loadDataForImageElement_(image,function(imageData){this.inputEventImageData_=imageData;this.updateContentsPending_=false;this.scheduleUpdateContents_();}.bind(this));}
-status.picturesComplete=false;}
-return status;},get selectedRenderPass(){if(this.selection){return this.selection.renderPass_;}},get selectedLayer(){if(this.selection){const selectedLayerId=this.selection.associatedLayerId;return this.layerTreeImpl_.findLayerWithId(selectedLayerId);}},get renderPasses(){let renderPasses=this.layerTreeImpl.layerTreeHostImpl.args.frame.renderPasses;if(!this.showOtherLayers){const selectedRenderPass=this.selectedRenderPass;if(selectedRenderPass){renderPasses=[selectedRenderPass];}}
-return renderPasses;},get layers(){let layers=this.layerTreeImpl.renderSurfaceLayerList;if(!this.showOtherLayers){const selectedLayer=this.selectedLayer;if(selectedLayer){layers=[selectedLayer];}}
-return layers;},appendImageQuads_(quads,layer,layerQuad){for(let ir=0;ir<layer.pictures.length;++ir){const picture=layer.pictures[ir];if(!picture.layerRect)continue;const unitRect=picture.layerRect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);const pictureData=this.pictureAsImageData_[picture.guid];if(this.showContents&&pictureData&&pictureData.imageData){iq.imageData=pictureData.imageData;iq.borderColor='rgba(0,0,0,0)';}else{iq.imageData=undefined;}
-iq.stackingGroupId=layerQuad.stackingGroupId;quads.push(iq);}},appendAnimationQuads_(quads,layer,layerQuad){if(!layer.animationBoundsRect)return;const rect=layer.animationBoundsRect;const abq=tr.b.math.Quad.fromRect(rect);abq.backgroundColor='rgba(164,191,48,0.5)';abq.borderColor='rgba(205,255,0,0.75)';abq.borderWidth=3.0;abq.stackingGroupId=layerQuad.stackingGroupId;abq.selectionToSetIfClicked=new cc.AnimationRectSelection(layer,rect);quads.push(abq);},appendInvalidationQuads_(quads,layer,layerQuad){if(layer.layerTreeImpl.hasSourceFrameBeenDrawnBefore)return;for(const rect of layer.invalidation.rects){const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor='rgba(0, 255, 0, 0.1)';if(rect.reason==='appeared'){iq.backgroundColor='rgba(0, 255, 128, 0.1)';}
-iq.borderColor='rgba(0, 255, 0, 1)';iq.stackingGroupId=layerQuad.stackingGroupId;let message='Invalidation rect';if(rect.reason){message+=' ('+rect.reason+')';}
-if(rect.client){message+=' for '+rect.client;}
-iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,message,rect,rect);quads.push(iq);}},appendUnrecordedRegionQuads_(quads,layer,layerQuad){for(let ir=0;ir<layer.unrecordedRegion.rects.length;ir++){const rect=layer.unrecordedRegion.rects[ir];const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor='rgba(240, 230, 140, 0.3)';iq.borderColor='rgba(240, 230, 140, 1)';iq.stackingGroupId=layerQuad.stackingGroupId;iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,'Unrecorded area',rect,rect);quads.push(iq);}},appendBottleneckQuads_(quads,layer,layerQuad,stackingGroupId){function processRegion(region,label,borderColor){const backgroundColor=borderColor.clone();backgroundColor.a=0.4*(borderColor.a||1.0);if(!region||!region.rects)return;for(let ir=0;ir<region.rects.length;ir++){const rect=region.rects[ir];const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor=backgroundColor.toString();iq.borderColor=borderColor.toString();iq.borderWidth=4.0;iq.stackingGroupId=stackingGroupId;iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,label,rect,rect);quads.push(iq);}}
-processRegion(layer.touchEventHandlerRegion,'Touch listener',tr.b.Color.fromString('rgb(228, 226, 27)'));processRegion(layer.wheelEventHandlerRegion,'Wheel listener',tr.b.Color.fromString('rgb(176, 205, 29)'));processRegion(layer.nonFastScrollableRegion,'Repaints on scroll',tr.b.Color.fromString('rgb(213, 134, 32)'));},appendTileCoverageRectQuads_(quads,layer,layerQuad,heatmapType){if(!layer.tileCoverageRects)return;const tiles=[];for(let ct=0;ct<layer.tileCoverageRects.length;++ct){const tile=layer.tileCoverageRects[ct].tile;if(tile!==undefined)tiles.push(tile);}
-const lthi=this.layerTreeImpl_.layerTreeHostImpl;const minMax=this.getMinMaxForHeatmap_(lthi.activeTiles,heatmapType);const heatmapResult=this.computeHeatmapColors_(tiles,minMax,heatmapType);let heatIndex=0;for(let ct=0;ct<layer.tileCoverageRects.length;++ct){let rect=layer.tileCoverageRects[ct].geometryRect;rect=rect.scale(1.0/layer.geometryContentsScale);const tile=layer.tileCoverageRects[ct].tile;const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);quad.backgroundColor='rgba(0, 0, 0, 0)';quad.stackingGroupId=layerQuad.stackingGroupId;let type=tr.e.cc.tileTypes.missing;if(tile){type=tile.getTypeForLayer(layer);quad.backgroundColor=heatmapResult[heatIndex].color;++heatIndex;}
-quad.borderColor=tr.e.cc.tileBorder[type].color;quad.borderWidth=tr.e.cc.tileBorder[type].width;let label;if(tile){label='coverageRect';}else{label='checkerboard coverageRect';}
-quad.selectionToSetIfClicked=new cc.LayerRectSelection(layer,label,rect,layer.tileCoverageRects[ct]);quads.push(quad);}},appendLayoutRectQuads_(quads,layer,layerQuad){if(!layer.layoutRects){return;}
-for(let ct=0;ct<layer.layoutRects.length;++ct){let rect=layer.layoutRects[ct].geometryRect;rect=rect.scale(1.0/layer.geometryContentsScale);const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);quad.backgroundColor='rgba(0, 0, 0, 0)';quad.stackingGroupId=layerQuad.stackingGroupId;quad.borderColor='rgba(0, 0, 200, 0.7)';quad.borderWidth=2;const label='Layout rect';quad.selectionToSetIfClicked=new cc.LayerRectSelection(layer,label,rect);quads.push(quad);}},getValueForHeatmap_(tile,heatmapType){if(heatmapType===TILE_HEATMAP_TYPE.SCHEDULED_PRIORITY){return tile.scheduledPriority===0?undefined:tile.scheduledPriority;}else if(heatmapType===TILE_HEATMAP_TYPE.USING_GPU_MEMORY){if(tile.isSolidColor)return 0.5;return tile.isUsingGpuMemory?0:1;}},getMinMaxForHeatmap_(tiles,heatmapType){const range=new tr.b.math.Range();if(heatmapType===TILE_HEATMAP_TYPE.USING_GPU_MEMORY){range.addValue(0);range.addValue(1);return range;}
-for(let i=0;i<tiles.length;++i){const value=this.getValueForHeatmap_(tiles[i],heatmapType);if(value===undefined)continue;range.addValue(value);}
-if(range.range===0){range.addValue(1);}
-return range;},computeHeatmapColors_(tiles,minMax,heatmapType){const min=minMax.min;const max=minMax.max;const color=function(value){let hue=120*(1-(value-min)/(max-min));if(hue<0)hue=0;return'hsla('+hue+', 100%, 50%, 0.5)';};const values=[];for(let i=0;i<tiles.length;++i){const tile=tiles[i];const value=this.getValueForHeatmap_(tile,heatmapType);const res={value,color:value!==undefined?color(value):undefined};values.push(res);}
-return values;},appendTilesWithScaleQuads_(quads,layer,layerQuad,scale,heatmapType){const lthi=this.layerTreeImpl_.layerTreeHostImpl;const tiles=[];for(let i=0;i<lthi.activeTiles.length;++i){const tile=lthi.activeTiles[i];if(Math.abs(tile.contentsScale-scale)>1e-6){continue;}
-if(layer.layerId!==tile.layerId)continue;tiles.push(tile);}
-const minMax=this.getMinMaxForHeatmap_(lthi.activeTiles,heatmapType);const heatmapResult=this.computeHeatmapColors_(tiles,minMax,heatmapType);for(let i=0;i<tiles.length;++i){const tile=tiles[i];const rect=tile.layerRect;if(!tile.layerRect)continue;const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);quad.backgroundColor='rgba(0, 0, 0, 0)';quad.stackingGroupId=layerQuad.stackingGroupId;const type=tile.getTypeForLayer(layer);quad.borderColor=tr.e.cc.tileBorder[type].color;quad.borderWidth=tr.e.cc.tileBorder[type].width;quad.backgroundColor=heatmapResult[i].color;const data={tileType:type};if(heatmapType!==TILE_HEATMAP_TYPE.NONE){data[heatmapType]=heatmapResult[i].value;}
-quad.selectionToSetIfClicked=new cc.TileSelection(tile,data);quads.push(quad);}},appendHighlightQuadsForLayer_(quads,layer,layerQuad,highlights){highlights.forEach(function(highlight){const rect=highlight.rect;const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);let colorId=ColorScheme.getColorIdForGeneralPurposeString(highlight.colorKey);const offset=ColorScheme.properties.brightenedOffsets[0];colorId=ColorScheme.getVariantColorId(colorId,offset);const color=ColorScheme.colors[colorId];const quadForDrawing=quad.clone();quadForDrawing.backgroundColor=color.withAlpha(0.5).toString();quadForDrawing.borderColor=color.withAlpha(1.0).darken().toString();quadForDrawing.stackingGroupId=layerQuad.stackingGroupId;quads.push(quadForDrawing);},this);},generateRenderPassQuads(){if(!this.layerTreeImpl.layerTreeHostImpl.args.frame)return[];const renderPasses=this.renderPasses;if(!renderPasses)return[];const quads=[];for(let i=0;i<renderPasses.length;++i){const quadList=renderPasses[i].quadList;for(let j=0;j<quadList.length;++j){const drawQuad=quadList[j];const quad=drawQuad.rectAsTargetSpaceQuad.clone();quad.borderColor='rgb(170, 204, 238)';quad.borderWidth=2;quad.stackingGroupId=i;quads.push(quad);}}
-return quads;},generateLayerQuads(){this.updateContentsPending_=false;const layers=this.layers;const quads=[];let nextStackingGroupId=0;const alreadyVisitedLayerIds={};let selectionHighlightsByLayerId;if(this.selection){selectionHighlightsByLayerId=this.selection.highlightsByLayerId;}else{selectionHighlightsByLayerId={};}
-const extraHighlightsByLayerId=this.extraHighlightsByLayerId||{};for(let i=1;i<=layers.length;i++){const layer=layers[layers.length-i];alreadyVisitedLayerIds[layer.layerId]=true;if(layer.objectInstance.name==='cc::NinePatchLayerImpl'){continue;}
-const layerQuad=layer.layerQuad.clone();if(layer.usingGpuRasterization){const pixelRatio=window.devicePixelRatio||1;layerQuad.borderWidth=2.0*pixelRatio;layerQuad.borderColor='rgba(154,205,50,0.75)';}else{layerQuad.borderColor='rgba(0,0,0,0.75)';}
-layerQuad.stackingGroupId=nextStackingGroupId++;layerQuad.selectionToSetIfClicked=new cc.LayerSelection(layer);layerQuad.layer=layer;if(this.showOtherLayers&&this.selectedLayer===layer){layerQuad.upperBorderColor='rgb(156,189,45)';}
-if(this.showAnimationBounds){this.appendAnimationQuads_(quads,layer,layerQuad);}
-this.appendImageQuads_(quads,layer,layerQuad);quads.push(layerQuad);if(this.showInvalidations){this.appendInvalidationQuads_(quads,layer,layerQuad);}
-if(this.showUnrecordedRegion){this.appendUnrecordedRegionQuads_(quads,layer,layerQuad);}
-if(this.showBottlenecks){this.appendBottleneckQuads_(quads,layer,layerQuad,layerQuad.stackingGroupId);}
-if(this.showLayoutRects){this.appendLayoutRectQuads_(quads,layer,layerQuad);}
-if(this.howToShowTiles==='coverage'){this.appendTileCoverageRectQuads_(quads,layer,layerQuad,this.tileHeatmapType);}else if(this.howToShowTiles!=='none'){this.appendTilesWithScaleQuads_(quads,layer,layerQuad,this.howToShowTiles,this.tileHeatmapType);}
-let highlights;highlights=extraHighlightsByLayerId[layer.layerId];if(highlights){this.appendHighlightQuadsForLayer_(quads,layer,layerQuad,highlights);}
-highlights=selectionHighlightsByLayerId[layer.layerId];if(highlights){this.appendHighlightQuadsForLayer_(quads,layer,layerQuad,highlights);}}
-this.layerTreeImpl.iterLayers(function(layer,depth,isMask,isReplica){if(!this.showOtherLayers&&this.selectedLayer!==layer)return;if(alreadyVisitedLayerIds[layer.layerId])return;const layerQuad=layer.layerQuad;const stackingGroupId=nextStackingGroupId++;if(this.showBottlenecks){this.appendBottleneckQuads_(quads,layer,layerQuad,stackingGroupId);}},this);const tracedInputLatencies=this.layerTreeImpl.tracedInputLatencies;if(this.showInputEvents&&tracedInputLatencies){for(let i=0;i<tracedInputLatencies.length;i++){const coordinatesArray=tracedInputLatencies[i].args.data.coordinates;for(let j=0;j<coordinatesArray.length;j++){const inputQuad=tr.b.math.Quad.fromXYWH(coordinatesArray[j].x-25,coordinatesArray[j].y-25,50,50);inputQuad.borderColor='rgba(0, 0, 0, 0)';inputQuad.imageData=this.inputEventImageData_;quads.push(inputQuad);}}}
-return quads;},updateInfoBar_(infoBarMessages){if(infoBarMessages.length){this.infoBar_.removeAllButtons();this.infoBar_.message='Some problems were encountered...';this.infoBar_.addButton('More info...',function(e){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent='';infoBarMessages.forEach(function(message){const title=document.createElement('h3');Polymer.dom(title).textContent=message.header;const details=document.createElement('div');Polymer.dom(details).textContent=message.details;Polymer.dom(overlay).appendChild(title);Polymer.dom(overlay).appendChild(details);});overlay.visible=true;e.stopPropagation();return false;});this.infoBar_.visible=true;}else{this.infoBar_.removeAllButtons();this.infoBar_.message='';this.infoBar_.visible=false;}},getWhatRasterized_(){const lthi=this.layerTreeImpl_.layerTreeHostImpl;const renderProcess=lthi.objectInstance.parent;const tasks=[];for(const event of renderProcess.getDescendantEvents()){if(!(event instanceof tr.model.Slice))continue;const tile=tr.e.cc.getTileFromRasterTaskSlice(event);if(tile===undefined)continue;if(tile.containingSnapshot===lthi){tasks.push(event);}}
-return tasks;},updateWhatRasterizedLinkState_(){const tasks=this.getWhatRasterized_();if(tasks.length){Polymer.dom(this.whatRasterizedLink_).textContent=tasks.length+' raster tasks';this.whatRasterizedLink_.style.display='';}else{Polymer.dom(this.whatRasterizedLink_).textContent='';this.whatRasterizedLink_.style.display='none';}},getWhatRasterizedEventSet_(){return new tr.model.EventSet(this.getWhatRasterized_());}};return{LayerTreeQuadStackView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const constants=tr.e.cc.constants;const LayerView=tr.ui.b.define('tr-ui-e-chrome-cc-layer-view');LayerView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.style.flexDirection='column';this.style.display='flex';this.layerTreeQuadStackView_=new tr.ui.e.chrome.cc.LayerTreeQuadStackView();this.dragBar_=document.createElement('tr-ui-b-drag-handle');this.analysisEl_=document.createElement('tr-ui-e-chrome-cc-layer-view-analysis');this.analysisEl_.style.flexGrow=0;this.analysisEl_.style.flexShrink=0;this.analysisEl_.style.flexBasis='auto';this.analysisEl_.style.height='150px';this.analysisEl_.style.overflow='auto';this.analysisEl_.addEventListener('requestSelectionChange',this.onRequestSelectionChangeFromAnalysisEl_.bind(this));this.dragBar_.target=this.analysisEl_;Polymer.dom(this).appendChild(this.layerTreeQuadStackView_);Polymer.dom(this).appendChild(this.dragBar_);Polymer.dom(this).appendChild(this.analysisEl_);this.layerTreeQuadStackView_.addEventListener('selection-change',function(){this.layerTreeQuadStackViewSelectionChanged_();}.bind(this));this.layerTreeQuadStackViewSelectionChanged_();},get layerTreeImpl(){return this.layerTreeQuadStackView_.layerTreeImpl;},set layerTreeImpl(newValue){return this.layerTreeQuadStackView_.layerTreeImpl=newValue;},set isRenderPassQuads(newValue){return this.layerTreeQuadStackView_.isRenderPassQuads=newValue;},get selection(){return this.layerTreeQuadStackView_.selection;},set selection(newValue){this.layerTreeQuadStackView_.selection=newValue;},regenerateContent(){this.layerTreeQuadStackView_.regenerateContent();},layerTreeQuadStackViewSelectionChanged_(){const selection=this.layerTreeQuadStackView_.selection;if(selection){this.dragBar_.style.display='';this.analysisEl_.style.display='';Polymer.dom(this.analysisEl_).textContent='';const layer=selection.layer;if(tr.e.cc.PictureSnapshot.CanDebugPicture()&&layer&&layer.args&&layer.args.pictures&&layer.args.pictures.length){Polymer.dom(this.analysisEl_).appendChild(this.createPictureBtn_(layer.args.pictures));}
-const analysis=selection.createAnalysis();Polymer.dom(this.analysisEl_).appendChild(analysis);for(const child of this.analysisEl_.children){child.style.userSelect='text';}}else{this.dragBar_.style.display='none';this.analysisEl_.style.display='none';const analysis=Polymer.dom(this.analysisEl_).firstChild;if(analysis){Polymer.dom(this.analysisEl_).removeChild(analysis);}
-this.layerTreeQuadStackView_.style.height=window.getComputedStyle(this).height;}
-tr.b.dispatchSimpleEvent(this,'selection-change');},createPictureBtn_(pictures){if(!(pictures instanceof Array)){pictures=[pictures];}
-const link=document.createElement('tr-ui-a-analysis-link');link.selection=function(){const layeredPicture=new tr.e.cc.LayeredPicture(pictures);const snapshot=new tr.e.cc.PictureSnapshot(layeredPicture);snapshot.picture=layeredPicture;const selection=new tr.model.EventSet();selection.push(snapshot);return selection;};Polymer.dom(link).textContent='View in Picture Debugger';return link;},onRequestSelectionChangeFromAnalysisEl_(e){if(!(e.selection instanceof tr.ui.e.chrome.cc.Selection)){return;}
-e.stopPropagation();this.selection=e.selection;},get extraHighlightsByLayerId(){return this.layerTreeQuadStackView_.extraHighlightsByLayerId;},set extraHighlightsByLayerId(extraHighlightsByLayerId){this.layerTreeQuadStackView_.extraHighlightsByLayerId=extraHighlightsByLayerId;}};return{LayerView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const LayerTreeHostImplSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-layer-tree-host-impl-snapshot-view',tr.ui.analysis.ObjectSnapshotView);LayerTreeHostImplSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-lthi-s-view');this.style.display='flex';this.style.flexDirection='row';this.style.flexGrow=1;this.style.flexShrink=1;this.style.flexBasis='auto';this.style.minWidth=0;this.selection_=undefined;this.layerPicker_=new tr.ui.e.chrome.cc.LayerPicker();this.layerPicker_.style.flexGrow=0;this.layerPicker_.style.flexShrink=0;this.layerPicker_.style.flexBasis='auto';this.layerPicker_.style.minWidth='200px';this.layerPicker_.addEventListener('selection-change',this.onLayerPickerSelectionChanged_.bind(this));this.layerView_=new tr.ui.e.chrome.cc.LayerView();this.layerView_.addEventListener('selection-change',this.onLayerViewSelectionChanged_.bind(this));this.layerView_.style.flexGrow=1;this.layerView_.style.flexShrink=1;this.layerView_.style.flexBasis='auto';this.layerView_.style.minWidth=0;this.dragHandle_=document.createElement('tr-ui-b-drag-handle');this.dragHandle_.style.flexGrow=0;this.dragHandle_.style.flexShrink=0;this.dragHandle_.style.flexBasis='auto';this.dragHandle_.horizontal=false;this.dragHandle_.target=this.layerPicker_;Polymer.dom(this).appendChild(this.layerPicker_);Polymer.dom(this).appendChild(this.dragHandle_);Polymer.dom(this).appendChild(this.layerView_);this.onLayerViewSelectionChanged_();this.onLayerPickerSelectionChanged_();},get objectSnapshot(){return this.objectSnapshot_;},set objectSnapshot(objectSnapshot){this.objectSnapshot_=objectSnapshot;const lthi=this.objectSnapshot;let layerTreeImpl;if(lthi){layerTreeImpl=lthi.getTree(this.layerPicker_.whichTree);}
-this.layerPicker_.lthiSnapshot=lthi;this.layerView_.layerTreeImpl=layerTreeImpl;this.layerView_.regenerateContent();if(!this.selection_)return;this.selection=this.selection_.findEquivalent(lthi);},get selection(){return this.selection_;},set selection(selection){if(this.selection_===selection)return;this.selection_=selection;this.layerPicker_.selection=selection;this.layerView_.selection=selection;tr.b.dispatchSimpleEvent(this,'cc-selection-change');},onLayerPickerSelectionChanged_(){this.selection_=this.layerPicker_.selection;this.layerView_.selection=this.selection;this.layerView_.layerTreeImpl=this.layerPicker_.layerTreeImpl;this.layerView_.isRenderPassQuads=this.layerPicker_.isRenderPassQuads;this.layerView_.regenerateContent();tr.b.dispatchSimpleEvent(this,'cc-selection-change');},onLayerViewSelectionChanged_(){this.selection_=this.layerView_.selection;this.layerPicker_.selection=this.selection;tr.b.dispatchSimpleEvent(this,'cc-selection-change');},get extraHighlightsByLayerId(){return this.layerView_.extraHighlightsByLayerId;},set extraHighlightsByLayerId(extraHighlightsByLayerId){this.layerView_.extraHighlightsByLayerId=extraHighlightsByLayerId;}};tr.ui.analysis.ObjectSnapshotView.register(LayerTreeHostImplSnapshotView,{typeName:'cc::LayerTreeHostImpl'});return{LayerTreeHostImplSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const OPS_TIMING_ITERATIONS=3;const CHART_PADDING_LEFT=65;const CHART_PADDING_RIGHT=40;const AXIS_PADDING_LEFT=60;const AXIS_PADDING_RIGHT=35;const AXIS_PADDING_TOP=25;const AXIS_PADDING_BOTTOM=45;const AXIS_LABEL_PADDING=5;const AXIS_TICK_SIZE=10;const LABEL_PADDING=5;const LABEL_INTERLEAVE_OFFSET=15;const BAR_PADDING=5;const VERTICAL_TICKS=5;const HUE_CHAR_CODE_ADJUSTMENT=5.7;const PictureOpsChartSummaryView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-ops-chart-summary-view');PictureOpsChartSummaryView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.style.flexGrow=0;this.style.flexShrink=0;this.style.flexBasis='auto';this.style.fontSize=0;this.style.margin=0;this.style.minHeight='200px';this.style.minWidth='200px';this.style.overflow='hidden';this.style.padding=0;this.picture_=undefined;this.pictureDataProcessed_=false;this.chartScale_=window.devicePixelRatio;this.chart_=document.createElement('canvas');this.chartCtx_=this.chart_.getContext('2d');Polymer.dom(this).appendChild(this.chart_);this.opsTimingData_=[];this.chartWidth_=0;this.chartHeight_=0;this.requiresRedraw_=true;this.currentBarMouseOverTarget_=null;this.chart_.addEventListener('mousemove',this.onMouseMove_.bind(this));try{new ResizeObserver(this.onResize_.bind(this)).observe(this);}catch(e){}},get requiresRedraw(){return this.requiresRedraw_;},set requiresRedraw(requiresRedraw){this.requiresRedraw_=requiresRedraw;},get picture(){return this.picture_;},set picture(picture){this.picture_=picture;this.pictureDataProcessed_=false;if(Polymer.dom(this).classList.contains('hidden'))return;this.processPictureData_();this.requiresRedraw=true;this.updateChartContents();},hide(){Polymer.dom(this).classList.add('hidden');this.style.display='none';},show(){Polymer.dom(this).classList.remove('hidden');this.style.display='';if(!this.pictureDataProcessed_){this.processPictureData_();}
-this.requiresRedraw=true;this.updateChartContents();},onMouseMove_(e){const lastBarMouseOverTarget=this.currentBarMouseOverTarget_;this.currentBarMouseOverTarget_=null;const x=e.offsetX;const y=e.offsetY;const chartLeft=CHART_PADDING_LEFT;const chartRight=this.chartWidth_-CHART_PADDING_RIGHT;const chartTop=AXIS_PADDING_TOP;const chartBottom=this.chartHeight_-AXIS_PADDING_BOTTOM;const chartInnerWidth=chartRight-chartLeft;if(x>chartLeft&&x<chartRight&&y>chartTop&&y<chartBottom){this.currentBarMouseOverTarget_=Math.floor((x-chartLeft)/chartInnerWidth*this.opsTimingData_.length);this.currentBarMouseOverTarget_=tr.b.math.clamp(this.currentBarMouseOverTarget_,0,this.opsTimingData_.length-1);}
-if(this.currentBarMouseOverTarget_===lastBarMouseOverTarget)return;this.drawChartContents_();},onResize_(){this.requiresRedraw=true;this.updateChartContents();},updateChartContents(){if(this.requiresRedraw){this.updateChartDimensions_();}
-this.drawChartContents_();},updateChartDimensions_(){this.chartWidth_=this.offsetWidth;this.chartHeight_=this.offsetHeight;this.chart_.width=this.chartWidth_*this.chartScale_;this.chart_.height=this.chartHeight_*this.chartScale_;this.chart_.style.width=this.chartWidth_+'px';this.chart_.style.height=this.chartHeight_+'px';this.chartCtx_.scale(this.chartScale_,this.chartScale_);},processPictureData_(){this.resetOpsTimingData_();this.pictureDataProcessed_=true;if(!this.picture_)return;let ops=this.picture_.getOps();if(!ops)return;ops=this.picture_.tagOpsWithTimings(ops);if(ops[0].cmd_time===undefined)return;this.collapseOpsToTimingBuckets_(ops);},drawChartContents_(){this.clearChartContents_();if(this.opsTimingData_.length===0){this.showNoTimingDataMessage_();return;}
-this.drawChartAxes_();this.drawBars_();this.drawLineAtBottomOfChart_();if(this.currentBarMouseOverTarget_===null)return;this.drawTooltip_();},drawLineAtBottomOfChart_(){this.chartCtx_.strokeStyle='#AAA';this.chartCtx_.moveTo(0,this.chartHeight_-0.5);this.chartCtx_.lineTo(this.chartWidth_,this.chartHeight_-0.5);this.chartCtx_.stroke();},drawTooltip_(){const tooltipData=this.opsTimingData_[this.currentBarMouseOverTarget_];const tooltipTitle=tooltipData.cmd_string;const tooltipTime=tooltipData.cmd_time.toFixed(4);const tooltipWidth=110;const tooltipHeight=40;const chartInnerWidth=this.chartWidth_-CHART_PADDING_RIGHT-
-CHART_PADDING_LEFT;const barWidth=chartInnerWidth/this.opsTimingData_.length;const tooltipOffset=Math.round((tooltipWidth-barWidth)*0.5);const left=CHART_PADDING_LEFT+this.currentBarMouseOverTarget_*barWidth-tooltipOffset;const top=Math.round((this.chartHeight_-tooltipHeight)*0.5);this.chartCtx_.save();this.chartCtx_.shadowOffsetX=0;this.chartCtx_.shadowOffsetY=5;this.chartCtx_.shadowBlur=4;this.chartCtx_.shadowColor='rgba(0,0,0,0.4)';this.chartCtx_.strokeStyle='#888';this.chartCtx_.fillStyle='#EEE';this.chartCtx_.fillRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.shadowColor='transparent';this.chartCtx_.translate(0.5,0.5);this.chartCtx_.strokeRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.restore();this.chartCtx_.fillStyle='#222';this.chartCtx_.textBaseline='top';this.chartCtx_.font='800 12px Arial';this.chartCtx_.fillText(tooltipTitle,left+8,top+8);this.chartCtx_.fillStyle='#555';this.chartCtx_.textBaseline='top';this.chartCtx_.font='400 italic 10px Arial';this.chartCtx_.fillText('Total: '+tooltipTime+'ms',left+8,top+22);},drawBars_(){const len=this.opsTimingData_.length;const max=this.opsTimingData_[0].cmd_time;const min=this.opsTimingData_[len-1].cmd_time;const width=this.chartWidth_-CHART_PADDING_LEFT-CHART_PADDING_RIGHT;const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const barWidth=Math.floor(width/len);let opData;let opTiming;let opHeight;let opLabel;let barLeft;for(let b=0;b<len;b++){opData=this.opsTimingData_[b];opTiming=opData.cmd_time/max;opHeight=Math.round(Math.max(1,opTiming*height));opLabel=opData.cmd_string;barLeft=CHART_PADDING_LEFT+b*barWidth;this.chartCtx_.fillStyle=this.getOpColor_(opLabel);this.chartCtx_.fillRect(barLeft+BAR_PADDING,AXIS_PADDING_TOP+
-height-opHeight,barWidth-2*BAR_PADDING,opHeight);}},getOpColor_(opName){const characters=opName.split('');const hue=characters.reduce(this.reduceNameToHue,0)%360;return'hsl('+hue+', 30%, 50%)';},reduceNameToHue(previousValue,currentValue,index,array){return Math.round(previousValue+currentValue.charCodeAt(0)*HUE_CHAR_CODE_ADJUSTMENT);},drawChartAxes_(){const len=this.opsTimingData_.length;const max=this.opsTimingData_[0].cmd_time;const min=this.opsTimingData_[len-1].cmd_time;const width=this.chartWidth_-AXIS_PADDING_LEFT-AXIS_PADDING_RIGHT;const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const totalBarWidth=this.chartWidth_-CHART_PADDING_LEFT-
-CHART_PADDING_RIGHT;const barWidth=Math.floor(totalBarWidth/len);const tickYInterval=height/(VERTICAL_TICKS-1);let tickYPosition=0;const tickValInterval=(max-min)/(VERTICAL_TICKS-1);let tickVal=0;this.chartCtx_.fillStyle='#333';this.chartCtx_.strokeStyle='#777';this.chartCtx_.save();this.chartCtx_.translate(0.5,0.5);this.chartCtx_.save();this.chartCtx_.translate(AXIS_PADDING_LEFT,AXIS_PADDING_TOP);this.chartCtx_.moveTo(0,0);this.chartCtx_.lineTo(0,height);this.chartCtx_.lineTo(width,height);this.chartCtx_.font='10px Arial';this.chartCtx_.textAlign='right';this.chartCtx_.textBaseline='middle';for(let t=0;t<VERTICAL_TICKS;t++){tickYPosition=Math.round(t*tickYInterval);tickVal=(max-t*tickValInterval).toFixed(4);this.chartCtx_.moveTo(0,tickYPosition);this.chartCtx_.lineTo(-AXIS_TICK_SIZE,tickYPosition);this.chartCtx_.fillText(tickVal,-AXIS_TICK_SIZE-AXIS_LABEL_PADDING,tickYPosition);}
-this.chartCtx_.stroke();this.chartCtx_.restore();this.chartCtx_.save();this.chartCtx_.translate(CHART_PADDING_LEFT+Math.round(barWidth*0.5),AXIS_PADDING_TOP+height+LABEL_PADDING);this.chartCtx_.font='10px Arial';this.chartCtx_.textAlign='center';this.chartCtx_.textBaseline='top';let labelTickLeft;let labelTickBottom;for(let l=0;l<len;l++){labelTickLeft=Math.round(l*barWidth);labelTickBottom=l%2*LABEL_INTERLEAVE_OFFSET;this.chartCtx_.save();this.chartCtx_.moveTo(labelTickLeft,-LABEL_PADDING);this.chartCtx_.lineTo(labelTickLeft,labelTickBottom);this.chartCtx_.stroke();this.chartCtx_.restore();this.chartCtx_.fillText(this.opsTimingData_[l].cmd_string,labelTickLeft,labelTickBottom);}
-this.chartCtx_.restore();this.chartCtx_.restore();},clearChartContents_(){this.chartCtx_.clearRect(0,0,this.chartWidth_,this.chartHeight_);},showNoTimingDataMessage_(){this.chartCtx_.font='800 italic 14px Arial';this.chartCtx_.fillStyle='#333';this.chartCtx_.textAlign='center';this.chartCtx_.textBaseline='middle';this.chartCtx_.fillText('No timing data available.',this.chartWidth_*0.5,this.chartHeight_*0.5);},collapseOpsToTimingBuckets_(ops){const opsTimingDataIndexHash_={};const timingData=this.opsTimingData_;let op;let opIndex;for(let i=0;i<ops.length;i++){op=ops[i];if(op.cmd_time===undefined)continue;opIndex=opsTimingDataIndexHash_[op.cmd_string]||null;if(opIndex===null){timingData.push({cmd_time:0,cmd_string:op.cmd_string});opIndex=timingData.length-1;opsTimingDataIndexHash_[op.cmd_string]=opIndex;}
-timingData[opIndex].cmd_time+=op.cmd_time;}
-timingData.sort(this.sortTimingBucketsByOpTimeDescending_);this.collapseTimingBucketsToOther_(4);},collapseTimingBucketsToOther_(count){const timingData=this.opsTimingData_;const otherSource=timingData.splice(count,timingData.length-count);let otherDestination=null;if(!otherSource.length)return;timingData.push({cmd_time:0,cmd_string:'Other'});otherDestination=timingData[timingData.length-1];for(let i=0;i<otherSource.length;i++){otherDestination.cmd_time+=otherSource[i].cmd_time;}},sortTimingBucketsByOpTimeDescending_(a,b){return b.cmd_time-a.cmd_time;},resetOpsTimingData_(){this.opsTimingData_.length=0;}};return{PictureOpsChartSummaryView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const BAR_PADDING=1;const BAR_WIDTH=5;const CHART_PADDING_LEFT=65;const CHART_PADDING_RIGHT=30;const CHART_PADDING_BOTTOM=35;const CHART_PADDING_TOP=20;const AXIS_PADDING_LEFT=55;const AXIS_PADDING_RIGHT=30;const AXIS_PADDING_BOTTOM=35;const AXIS_PADDING_TOP=20;const AXIS_TICK_SIZE=5;const AXIS_LABEL_PADDING=5;const VERTICAL_TICKS=5;const HUE_CHAR_CODE_ADJUSTMENT=5.7;const PictureOpsChartView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-ops-chart-view');PictureOpsChartView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.style.display='block';this.style.height='180px';this.style.margin=0;this.style.padding=0;this.style.position='relative';this.picture_=undefined;this.pictureOps_=undefined;this.opCosts_=undefined;this.chartScale_=window.devicePixelRatio;this.chart_=document.createElement('canvas');this.chartCtx_=this.chart_.getContext('2d');Polymer.dom(this).appendChild(this.chart_);this.selectedOpIndex_=undefined;this.chartWidth_=0;this.chartHeight_=0;this.dimensionsHaveChanged_=true;this.currentBarMouseOverTarget_=undefined;this.ninetyFifthPercentileCost_=0;this.totalOpCost_=0;this.chart_.addEventListener('click',this.onClick_.bind(this));this.chart_.addEventListener('mousemove',this.onMouseMove_.bind(this));try{new ResizeObserver(this.onResize_.bind(this)).observe(this);}catch(e){}
-this.usePercentileScale_=false;this.usePercentileScaleCheckbox_=tr.ui.b.createCheckBox(this,'usePercentileScale','PictureOpsChartView.usePercentileScale',false,'Limit to 95%-ile');Polymer.dom(this.usePercentileScaleCheckbox_).classList.add('use-percentile-scale');this.usePercentileScaleCheckbox_.style.position='absolute';this.usePercentileScaleCheckbox_.style.left=0;this.usePercentileScaleCheckbox_.style.top=0;Polymer.dom(this).appendChild(this.usePercentileScaleCheckbox_);},get dimensionsHaveChanged(){return this.dimensionsHaveChanged_;},set dimensionsHaveChanged(dimensionsHaveChanged){this.dimensionsHaveChanged_=dimensionsHaveChanged;},get usePercentileScale(){return this.usePercentileScale_;},set usePercentileScale(usePercentileScale){this.usePercentileScale_=usePercentileScale;this.drawChartContents_();},get numOps(){return this.opCosts_.length;},get selectedOpIndex(){return this.selectedOpIndex_;},set selectedOpIndex(selectedOpIndex){if(selectedOpIndex<0)throw new Error('Invalid index');if(selectedOpIndex>=this.numOps)throw new Error('Invalid index');this.selectedOpIndex_=selectedOpIndex;},get picture(){return this.picture_;},set picture(picture){this.picture_=picture;this.pictureOps_=picture.tagOpsWithTimings(picture.getOps());this.currentBarMouseOverTarget_=undefined;this.processPictureData_();this.dimensionsHaveChanged=true;},processPictureData_(){if(this.pictureOps_===undefined)return;let totalOpCost=0;this.opCosts_=this.pictureOps_.map(function(op){totalOpCost+=op.cmd_time;return op.cmd_time;});this.opCosts_.sort();const ninetyFifthPercentileCostIndex=Math.floor(this.opCosts_.length*0.95);this.ninetyFifthPercentileCost_=this.opCosts_[ninetyFifthPercentileCostIndex];this.maxCost_=this.opCosts_[this.opCosts_.length-1];this.totalOpCost_=totalOpCost;},extractBarIndex_(e){let index=undefined;if(this.pictureOps_===undefined||this.pictureOps_.length===0){return index;}
-const x=e.offsetX;const y=e.offsetY;const totalBarWidth=(BAR_WIDTH+BAR_PADDING)*this.pictureOps_.length;const chartLeft=CHART_PADDING_LEFT;const chartTop=0;const chartBottom=this.chartHeight_-CHART_PADDING_BOTTOM;const chartRight=chartLeft+totalBarWidth;if(x<chartLeft||x>chartRight||y<chartTop||y>chartBottom){return index;}
-index=Math.floor((x-chartLeft)/totalBarWidth*this.pictureOps_.length);index=tr.b.math.clamp(index,0,this.pictureOps_.length-1);return index;},onClick_(e){const barClicked=this.extractBarIndex_(e);if(barClicked===undefined)return;if(barClicked===this.selectedOpIndex){this.selectedOpIndex=undefined;}else{this.selectedOpIndex=barClicked;}
-e.preventDefault();tr.b.dispatchSimpleEvent(this,'selection-changed',false);},onMouseMove_(e){const lastBarMouseOverTarget=this.currentBarMouseOverTarget_;this.currentBarMouseOverTarget_=this.extractBarIndex_(e);if(this.currentBarMouseOverTarget_===lastBarMouseOverTarget){return;}
-this.drawChartContents_();},onResize_(){this.dimensionsHaveChanged=true;this.updateChartContents();},scrollSelectedItemIntoViewIfNecessary(){if(this.selectedOpIndex===undefined){return;}
-const width=this.offsetWidth;const left=this.scrollLeft;const right=left+width;const targetLeft=CHART_PADDING_LEFT+
-(BAR_WIDTH+BAR_PADDING)*this.selectedOpIndex;if(targetLeft>left&&targetLeft<right){return;}
-this.scrollLeft=(targetLeft-width*0.5);},updateChartContents(){if(this.dimensionsHaveChanged){this.updateChartDimensions_();}
-this.drawChartContents_();},updateChartDimensions_(){if(!this.pictureOps_)return;let width=CHART_PADDING_LEFT+CHART_PADDING_RIGHT+
-((BAR_WIDTH+BAR_PADDING)*this.pictureOps_.length);if(width<this.offsetWidth){width=this.offsetWidth;}
-this.chartWidth_=width;this.chartHeight_=this.getBoundingClientRect().height;this.chart_.width=this.chartWidth_*this.chartScale_;this.chart_.height=this.chartHeight_*this.chartScale_;this.chart_.style.width=this.chartWidth_+'px';this.chart_.style.height=this.chartHeight_+'px';this.chartCtx_.scale(this.chartScale_,this.chartScale_);this.dimensionsHaveChanged=false;},drawChartContents_(){this.clearChartContents_();if(this.pictureOps_===undefined||this.pictureOps_.length===0||this.pictureOps_[0].cmd_time===undefined){this.showNoTimingDataMessage_();return;}
-this.drawSelection_();this.drawBars_();this.drawChartAxes_();this.drawLinesAtTickMarks_();this.drawLineAtBottomOfChart_();if(this.currentBarMouseOverTarget_===undefined){return;}
-this.drawTooltip_();},drawSelection_(){if(this.selectedOpIndex===undefined){return;}
-const width=(BAR_WIDTH+BAR_PADDING)*this.selectedOpIndex;this.chartCtx_.fillStyle='rgb(223, 235, 230)';this.chartCtx_.fillRect(CHART_PADDING_LEFT,CHART_PADDING_TOP,width,this.chartHeight_-CHART_PADDING_TOP-CHART_PADDING_BOTTOM);},drawChartAxes_(){const min=this.opCosts_[0];const max=this.opCosts_[this.opCosts_.length-1];const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const tickYInterval=height/(VERTICAL_TICKS-1);let tickYPosition=0;const tickValInterval=(max-min)/(VERTICAL_TICKS-1);let tickVal=0;this.chartCtx_.fillStyle='#333';this.chartCtx_.strokeStyle='#777';this.chartCtx_.save();this.chartCtx_.translate(0.5,0.5);this.chartCtx_.beginPath();this.chartCtx_.moveTo(AXIS_PADDING_LEFT,AXIS_PADDING_TOP);this.chartCtx_.lineTo(AXIS_PADDING_LEFT,this.chartHeight_-
-AXIS_PADDING_BOTTOM);this.chartCtx_.lineTo(this.chartWidth_-AXIS_PADDING_RIGHT,this.chartHeight_-AXIS_PADDING_BOTTOM);this.chartCtx_.stroke();this.chartCtx_.closePath();this.chartCtx_.translate(AXIS_PADDING_LEFT,AXIS_PADDING_TOP);this.chartCtx_.font='10px Arial';this.chartCtx_.textAlign='right';this.chartCtx_.textBaseline='middle';this.chartCtx_.beginPath();for(let t=0;t<VERTICAL_TICKS;t++){tickYPosition=Math.round(t*tickYInterval);tickVal=(max-t*tickValInterval).toFixed(4);this.chartCtx_.moveTo(0,tickYPosition);this.chartCtx_.lineTo(-AXIS_TICK_SIZE,tickYPosition);this.chartCtx_.fillText(tickVal,-AXIS_TICK_SIZE-AXIS_LABEL_PADDING,tickYPosition);}
-this.chartCtx_.stroke();this.chartCtx_.closePath();this.chartCtx_.restore();},drawLinesAtTickMarks_(){const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const width=this.chartWidth_-AXIS_PADDING_LEFT-AXIS_PADDING_RIGHT;const tickYInterval=height/(VERTICAL_TICKS-1);let tickYPosition=0;this.chartCtx_.save();this.chartCtx_.translate(AXIS_PADDING_LEFT+0.5,AXIS_PADDING_TOP+0.5);this.chartCtx_.beginPath();this.chartCtx_.strokeStyle='rgba(0,0,0,0.05)';for(let t=0;t<VERTICAL_TICKS;t++){tickYPosition=Math.round(t*tickYInterval);this.chartCtx_.moveTo(0,tickYPosition);this.chartCtx_.lineTo(width,tickYPosition);this.chartCtx_.stroke();}
-this.chartCtx_.restore();this.chartCtx_.closePath();},drawLineAtBottomOfChart_(){this.chartCtx_.strokeStyle='#AAA';this.chartCtx_.beginPath();this.chartCtx_.moveTo(0,this.chartHeight_-0.5);this.chartCtx_.lineTo(this.chartWidth_,this.chartHeight_-0.5);this.chartCtx_.stroke();this.chartCtx_.closePath();},drawTooltip_(){const tooltipData=this.pictureOps_[this.currentBarMouseOverTarget_];const tooltipTitle=tooltipData.cmd_string;const tooltipTime=tooltipData.cmd_time.toFixed(4);const toolTipTimePercentage=((tooltipData.cmd_time/this.totalOpCost_)*100).toFixed(2);const tooltipWidth=120;const tooltipHeight=40;const chartInnerWidth=this.chartWidth_-CHART_PADDING_RIGHT-
-CHART_PADDING_LEFT;const barWidth=BAR_WIDTH+BAR_PADDING;const tooltipOffset=Math.round((tooltipWidth-barWidth)*0.5);const left=CHART_PADDING_LEFT+this.currentBarMouseOverTarget_*barWidth-tooltipOffset;const top=Math.round((this.chartHeight_-tooltipHeight)*0.5);this.chartCtx_.save();this.chartCtx_.shadowOffsetX=0;this.chartCtx_.shadowOffsetY=5;this.chartCtx_.shadowBlur=4;this.chartCtx_.shadowColor='rgba(0,0,0,0.4)';this.chartCtx_.strokeStyle='#888';this.chartCtx_.fillStyle='#EEE';this.chartCtx_.fillRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.shadowColor='transparent';this.chartCtx_.translate(0.5,0.5);this.chartCtx_.strokeRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.restore();this.chartCtx_.fillStyle='#222';this.chartCtx_.textAlign='left';this.chartCtx_.textBaseline='top';this.chartCtx_.font='800 12px Arial';this.chartCtx_.fillText(tooltipTitle,left+8,top+8);this.chartCtx_.fillStyle='#555';this.chartCtx_.font='400 italic 10px Arial';this.chartCtx_.fillText(tooltipTime+'ms ('+
-toolTipTimePercentage+'%)',left+8,top+22);},drawBars_(){let op;let opColor=0;let opHeight=0;const opWidth=BAR_WIDTH+BAR_PADDING;let opHover=false;const bottom=this.chartHeight_-CHART_PADDING_BOTTOM;const maxHeight=this.chartHeight_-CHART_PADDING_BOTTOM-
-CHART_PADDING_TOP;let maxValue;if(this.usePercentileScale){maxValue=this.ninetyFifthPercentileCost_;}else{maxValue=this.maxCost_;}
-for(let b=0;b<this.pictureOps_.length;b++){op=this.pictureOps_[b];opHeight=Math.round((op.cmd_time/maxValue)*maxHeight);opHeight=Math.max(opHeight,1);opHover=(b===this.currentBarMouseOverTarget_);opColor=this.getOpColor_(op.cmd_string,opHover);if(b===this.selectedOpIndex){this.chartCtx_.fillStyle='#FFFF00';}else{this.chartCtx_.fillStyle=opColor;}
-this.chartCtx_.fillRect(CHART_PADDING_LEFT+b*opWidth,bottom-opHeight,BAR_WIDTH,opHeight);}},getOpColor_(opName,hover){const characters=opName.split('');const hue=characters.reduce(this.reduceNameToHue,0)%360;const saturation=30;const lightness=hover?'75%':'50%';return'hsl('+hue+', '+saturation+'%, '+lightness+'%)';},reduceNameToHue(previousValue,currentValue,index,array){return Math.round(previousValue+currentValue.charCodeAt(0)*HUE_CHAR_CODE_ADJUSTMENT);},clearChartContents_(){this.chartCtx_.clearRect(0,0,this.chartWidth_,this.chartHeight_);},showNoTimingDataMessage_(){this.chartCtx_.font='800 italic 14px Arial';this.chartCtx_.fillStyle='#333';this.chartCtx_.textAlign='center';this.chartCtx_.textBaseline='middle';this.chartCtx_.fillText('No timing data available.',this.chartWidth_*0.5,this.chartHeight_*0.5);}};return{PictureOpsChartView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const THIS_DOC=document._currentScript.ownerDocument;const PictureDebugger=tr.ui.b.define('tr-ui-e-chrome-cc-picture-debugger');PictureDebugger.prototype={__proto__:HTMLDivElement.prototype,decorate(){const node=tr.ui.b.instantiateTemplate('#tr-ui-e-chrome-cc-picture-debugger-template',THIS_DOC);Polymer.dom(this).appendChild(node);this.style.display='flex';this.style.flexDirection='row';const title=this.querySelector('.title');title.style.fontWeight='bold';title.style.marginLeft='5px';title.style.marginRight='5px';this.pictureAsImageData_=undefined;this.showOverdraw_=false;this.zoomScaleValue_=1;this.sizeInfo_=Polymer.dom(this).querySelector('.size');this.rasterArea_=Polymer.dom(this).querySelector('raster-area');this.rasterArea_.style.backgroundColor='#ddd';this.rasterArea_.style.minHeight='100px';this.rasterArea_.style.minWidth='200px';this.rasterArea_.style.overflow='auto';this.rasterArea_.style.paddingLeft='5px';this.rasterCanvas_=Polymer.dom(this.rasterArea_).querySelector('canvas');this.rasterCtx_=this.rasterCanvas_.getContext('2d');this.filename_=Polymer.dom(this).querySelector('.filename');this.filename_.style.userSelect='text';this.filename_.style.marginLeft='5px';this.drawOpsChartSummaryView_=new tr.ui.e.chrome.cc.PictureOpsChartSummaryView();this.drawOpsChartView_=new tr.ui.e.chrome.cc.PictureOpsChartView();this.drawOpsChartView_.addEventListener('selection-changed',this.onChartBarClicked_.bind(this));this.exportButton_=Polymer.dom(this).querySelector('.export');this.exportButton_.addEventListener('click',this.onSaveAsSkPictureClicked_.bind(this));this.trackMouse_();const overdrawCheckbox=tr.ui.b.createCheckBox(this,'showOverdraw','pictureView.showOverdraw',false,'Show overdraw');const chartCheckbox=tr.ui.b.createCheckBox(this,'showSummaryChart','pictureView.showSummaryChart',false,'Show timing summary');const pictureInfo=Polymer.dom(this).querySelector('picture-info');pictureInfo.style.flexGrow=0;pictureInfo.style.flexShrink=0;pictureInfo.style.flexBasis='auto';pictureInfo.style.paddingTop='2px';Polymer.dom(pictureInfo).appendChild(overdrawCheckbox);Polymer.dom(pictureInfo).appendChild(chartCheckbox);this.drawOpsView_=new tr.ui.e.chrome.cc.PictureOpsListView();this.drawOpsView_.flexGrow=1;this.drawOpsView_.flexShrink=1;this.drawOpsView_.flexBasis='auto';this.drawOpsView_.addEventListener('selection-changed',this.onChangeDrawOps_.bind(this));const leftPanel=Polymer.dom(this).querySelector('left-panel');leftPanel.style.flexDirection='column';leftPanel.style.display='flex';leftPanel.style.flexGrow=0;leftPanel.style.flexShrink=0;leftPanel.style.flexBasis='auto';leftPanel.style.minWidth='200px';leftPanel.style.overflow='auto';Polymer.dom(leftPanel).appendChild(this.drawOpsChartSummaryView_);Polymer.dom(leftPanel).appendChild(this.drawOpsView_);const middleDragHandle=document.createElement('tr-ui-b-drag-handle');middleDragHandle.style.flexGrow=0;middleDragHandle.style.flexShrink=0;middleDragHandle.style.flexBasis='auto';middleDragHandle.horizontal=false;middleDragHandle.target=leftPanel;const rightPanel=Polymer.dom(this).querySelector('right-panel');rightPanel.style.flexGrow=1;rightPanel.style.flexShrink=1;rightPanel.style.flexBasis='auto';rightPanel.style.minWidth=0;rightPanel.style.flexDirection='column';rightPanel.style.display='flex';const chartView=Polymer.dom(rightPanel).querySelector('tr-ui-e-chrome-cc-picture-ops-chart-view');this.drawOpsChartView_.style.flexGrow=0;this.drawOpsChartView_.style.flexShrink=0;this.drawOpsChartView_.style.flexBasis='auto';this.drawOpsChartView_.style.minWidth=0;this.drawOpsChartView_.style.overflowX='auto';this.drawOpsChartView_.style.overflowY='hidden';rightPanel.replaceChild(this.drawOpsChartView_,chartView);this.infoBar_=document.createElement('tr-ui-b-info-bar');Polymer.dom(this.rasterArea_).appendChild(this.infoBar_);Polymer.dom(this).insertBefore(middleDragHandle,rightPanel);this.picture_=undefined;const hkc=document.createElement('tv-ui-b-hotkey-controller');hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',thisArg:this,keyCode:'h'.charCodeAt(0),callback(e){this.moveSelectedOpBy(-1);e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',thisArg:this,keyCode:'l'.charCodeAt(0),callback(e){this.moveSelectedOpBy(1);e.stopPropagation();}}));Polymer.dom(this).appendChild(hkc);},onSaveAsSkPictureClicked_(){const rawData=tr.b.Base64.atob(this.picture_.getBase64SkpData());const length=rawData.length;const arrayBuffer=new ArrayBuffer(length);const uint8Array=new Uint8Array(arrayBuffer);for(let c=0;c<length;c++){uint8Array[c]=rawData.charCodeAt(c);}
-const blob=new Blob([uint8Array],{type:'application/octet-binary'});const blobUrl=window.webkitURL.createObjectURL(blob);const link=document.createElementNS('http://www.w3.org/1999/xhtml','a');link.href=blobUrl;link.download=this.filename_.value;const event=document.createEvent('MouseEvents');event.initMouseEvent('click',true,false,window,0,0,0,0,0,false,false,false,false,0,null);link.dispatchEvent(event);},get picture(){return this.picture_;},set picture(picture){this.drawOpsView_.picture=picture;this.drawOpsChartView_.picture=picture;this.drawOpsChartSummaryView_.picture=picture;this.picture_=picture;this.exportButton_.disabled=!this.picture_.canSave;if(picture){const size=this.getRasterCanvasSize_();this.rasterCanvas_.width=size.width;this.rasterCanvas_.height=size.height;}
-const bounds=this.rasterArea_.getBoundingClientRect();const selectorBounds=this.mouseModeSelector_.getBoundingClientRect();this.mouseModeSelector_.pos={x:(bounds.right-selectorBounds.width-10),y:bounds.top};this.rasterize_();this.scheduleUpdateContents_();},getRasterCanvasSize_(){const style=window.getComputedStyle(this.rasterArea_);const width=Math.max(parseInt(style.width),this.picture_.layerRect.width);const height=Math.max(parseInt(style.height),this.picture_.layerRect.height);return{width,height};},scheduleUpdateContents_(){if(this.updateContentsPending_)return;this.updateContentsPending_=true;tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContents_.bind(this));},updateContents_(){this.updateContentsPending_=false;if(this.picture_){Polymer.dom(this.sizeInfo_).textContent='('+
-this.picture_.layerRect.width+' x '+
-this.picture_.layerRect.height+')';}
-this.drawOpsChartView_.updateChartContents();this.drawOpsChartView_.scrollSelectedItemIntoViewIfNecessary();if(!this.pictureAsImageData_)return;this.infoBar_.visible=false;this.infoBar_.removeAllButtons();if(this.pictureAsImageData_.error){this.infoBar_.message='Cannot rasterize...';this.infoBar_.addButton('More info...',function(e){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent=this.pictureAsImageData_.error;overlay.visible=true;e.stopPropagation();return false;}.bind(this));this.infoBar_.visible=true;}
-this.drawPicture_();},drawPicture_(){const size=this.getRasterCanvasSize_();if(size.width!==this.rasterCanvas_.width){this.rasterCanvas_.width=size.width;}
-if(size.height!==this.rasterCanvas_.height){this.rasterCanvas_.height=size.height;}
-this.rasterCtx_.clearRect(0,0,size.width,size.height);if(!this.pictureAsImageData_.imageData)return;const imgCanvas=this.pictureAsImageData_.asCanvas();const w=imgCanvas.width;const h=imgCanvas.height;this.rasterCtx_.drawImage(imgCanvas,0,0,w,h,0,0,w*this.zoomScaleValue_,h*this.zoomScaleValue_);},rasterize_(){if(this.picture_){this.picture_.rasterize({stopIndex:this.drawOpsView_.selectedOpIndex,showOverdraw:this.showOverdraw_},this.onRasterComplete_.bind(this));}},onRasterComplete_(pictureAsImageData){this.pictureAsImageData_=pictureAsImageData;this.scheduleUpdateContents_();},moveSelectedOpBy(increment){if(this.selectedOpIndex===undefined){this.selectedOpIndex=0;return;}
-this.selectedOpIndex=tr.b.math.clamp(this.selectedOpIndex+increment,0,this.numOps);},get numOps(){return this.drawOpsView_.numOps;},get selectedOpIndex(){return this.drawOpsView_.selectedOpIndex;},set selectedOpIndex(index){this.drawOpsView_.selectedOpIndex=index;this.drawOpsChartView_.selectedOpIndex=index;},onChartBarClicked_(e){this.drawOpsView_.selectedOpIndex=this.drawOpsChartView_.selectedOpIndex;},onChangeDrawOps_(e){this.rasterize_();this.scheduleUpdateContents_();this.drawOpsChartView_.selectedOpIndex=this.drawOpsView_.selectedOpIndex;},set showOverdraw(v){this.showOverdraw_=v;this.rasterize_();},set showSummaryChart(chartShouldBeVisible){if(chartShouldBeVisible){this.drawOpsChartSummaryView_.show();}else{this.drawOpsChartSummaryView_.hide();}},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.rasterArea_;Polymer.dom(this.rasterArea_).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.defaultMode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.settingsKey='pictureDebugger.mouseModeSelector';this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));},onBeginZoom_(e){this.isZooming_=true;this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const currentMouseViewPos=this.extractRelativeMousePosition_(e);this.zoomScaleValue_+=((this.lastMouseViewPos_.y-currentMouseViewPos.y)*0.001);this.zoomScaleValue_=Math.max(this.zoomScaleValue_,0.1);this.drawPicture_();this.lastMouseViewPos_=currentMouseViewPos;},onEndZoom_(e){this.lastMouseViewPos_=undefined;this.isZooming_=false;e.preventDefault();},extractRelativeMousePosition_(e){return{x:e.clientX-this.rasterArea_.offsetLeft,y:e.clientY-this.rasterArea_.offsetTop};}};return{PictureDebugger,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const PictureSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-snapshot-view',tr.ui.analysis.ObjectSnapshotView);PictureSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-picture-snapshot-view');this.style.display='flex';this.style.flexGrow=1;this.style.flexShrink=1;this.style.flexBasis='auto';this.style.minWidth=0;this.pictureDebugger_=new tr.ui.e.chrome.cc.PictureDebugger();this.pictureDebugger_.style.flexGrow=1;this.pictureDebugger_.style.flexShrink=1;this.pictureDebugger_.style.flexBasis='auto';this.pictureDebugger_.style.minWidth=0;Polymer.dom(this).appendChild(this.pictureDebugger_);},updateContents(){if(this.objectSnapshot_&&this.pictureDebugger_){this.pictureDebugger_.picture=this.objectSnapshot_;}}};tr.ui.analysis.ObjectSnapshotView.register(PictureSnapshotView,{typeNames:['cc::Picture','cc::LayeredPicture'],showInstances:false});return{PictureSnapshotView,};});'use strict';tr.exportTo('tr.e.cc',function(){const knownRasterTaskNames=['TileManager::RunRasterTask','RasterWorkerPoolTaskImpl::RunRasterOnThread','RasterWorkerPoolTaskImpl::Raster','RasterTaskImpl::Raster','cc::RasterTask','RasterTask'];const knownAnalysisTaskNames=['TileManager::RunAnalyzeTask','RasterWorkerPoolTaskImpl::RunAnalysisOnThread','RasterWorkerPoolTaskImpl::Analyze','RasterTaskImpl::Analyze','cc::AnalyzeTask','AnalyzeTask'];function getTileFromRasterTaskSlice(slice){if(!(isSliceDoingRasterization(slice)||isSliceDoingAnalysis(slice))){return undefined;}
-let tileData;if(slice.args.data){tileData=slice.args.data;}else{tileData=slice.args.tileData;}
-if(tileData===undefined)return undefined;if(tileData.tile_id)return tileData.tile_id;const tile=tileData.tileId;if(!(tile instanceof tr.e.cc.TileSnapshot)){return undefined;}
-return tileData.tileId;}
-function isSliceDoingRasterization(slice){return knownRasterTaskNames.includes(slice.title);}
-function isSliceDoingAnalysis(slice){return knownAnalysisTaskNames.includes(slice.title);}
-return{getTileFromRasterTaskSlice,isSliceDoingRasterization,isSliceDoingAnalysis};});'use strict';tr.exportTo('tr.ui.analysis',function(){const AnalysisSubView={set tabLabel(label){Polymer.dom(this).setAttribute('tab-label',label);},get tabLabel(){return this.getAttribute('tab-label');},get requiresTallView(){return false;},get relatedEventsToHighlight(){return undefined;},set selection(selection){throw new Error('Not implemented!');},get selection(){throw new Error('Not implemented!');}};const allTypeInfosByEventProto=new Map();let onlyRootTypeInfosByEventProto=undefined;let eventProtoToRootTypeInfoMap=undefined;function AnalysisSubViewTypeInfo(eventConstructor,options){if(options.multi===undefined){throw new Error('missing field: multi');}
-if(options.title===undefined){throw new Error('missing field: title');}
-this.eventConstructor=eventConstructor;this.singleTagName=undefined;this.singleTitle=undefined;this.multiTagName=undefined;this.multiTitle=undefined;this.childrenTypeInfos_=undefined;}
-AnalysisSubViewTypeInfo.prototype={get childrenTypeInfos(){return this.childrenTypeInfos_;},resetchildrenTypeInfos(){this.childrenTypeInfos_=[];}};AnalysisSubView.register=function(tagName,eventConstructor,options){let typeInfo=allTypeInfosByEventProto.get(eventConstructor.prototype);if(typeInfo===undefined){typeInfo=new AnalysisSubViewTypeInfo(eventConstructor,options);allTypeInfosByEventProto.set(typeInfo.eventConstructor.prototype,typeInfo);onlyRootTypeInfosByEventProto=undefined;}
-if(!options.multi){if(typeInfo.singleTagName!==undefined){throw new Error('SingleTagName already set');}
-typeInfo.singleTagName=tagName;typeInfo.singleTitle=options.title;}else{if(typeInfo.multiTagName!==undefined){throw new Error('MultiTagName already set');}
-typeInfo.multiTagName=tagName;typeInfo.multiTitle=options.title;}
-return typeInfo;};function rebuildRootSubViewTypeInfos(){onlyRootTypeInfosByEventProto=new Map();allTypeInfosByEventProto.forEach(function(typeInfo){typeInfo.resetchildrenTypeInfos();});allTypeInfosByEventProto.forEach(function(typeInfo,eventProto){const eventPrototype=typeInfo.eventConstructor.prototype;let lastEventProto=eventPrototype;let curEventProto=eventPrototype.__proto__;while(true){if(!allTypeInfosByEventProto.has(curEventProto)){const rootTypeInfo=allTypeInfosByEventProto.get(lastEventProto);const rootEventProto=lastEventProto;const isNew=onlyRootTypeInfosByEventProto.has(rootEventProto);onlyRootTypeInfosByEventProto.set(rootEventProto,rootTypeInfo);break;}
-lastEventProto=curEventProto;curEventProto=curEventProto.__proto__;}});allTypeInfosByEventProto.forEach(function(typeInfo,eventProto){const eventPrototype=typeInfo.eventConstructor.prototype;const parentEventProto=eventPrototype.__proto__;const parentTypeInfo=allTypeInfosByEventProto.get(parentEventProto);if(!parentTypeInfo)return;parentTypeInfo.childrenTypeInfos.push(typeInfo);});eventProtoToRootTypeInfoMap=new Map();allTypeInfosByEventProto.forEach(function(typeInfo,eventProto){const eventPrototype=typeInfo.eventConstructor.prototype;let curEventProto=eventPrototype;while(true){if(onlyRootTypeInfosByEventProto.has(curEventProto)){const rootTypeInfo=onlyRootTypeInfosByEventProto.get(curEventProto);eventProtoToRootTypeInfoMap.set(eventPrototype,rootTypeInfo);break;}
-curEventProto=curEventProto.__proto__;}});}
-function findLowestTypeInfoForEvents(thisTypeInfo,events){if(events.length===0)return thisTypeInfo;const event0=tr.b.getFirstElement(events);let candidateSubTypeInfo;for(let i=0;i<thisTypeInfo.childrenTypeInfos.length;i++){const childTypeInfo=thisTypeInfo.childrenTypeInfos[i];if(event0 instanceof childTypeInfo.eventConstructor){candidateSubTypeInfo=childTypeInfo;break;}}
-if(!candidateSubTypeInfo)return thisTypeInfo;let allMatch=true;for(const event of events){if(event instanceof candidateSubTypeInfo.eventConstructor)continue;allMatch=false;break;}
-if(!allMatch){return thisTypeInfo;}
-return findLowestTypeInfoForEvents(candidateSubTypeInfo,events);}
-const primaryEventProtoToTypeInfoMap=new Map();function getRootTypeInfoForEvent(event){const curProto=event.__proto__;const typeInfo=primaryEventProtoToTypeInfoMap.get(curProto);if(typeInfo)return typeInfo;return getRootTypeInfoForEventSlow(event);}
-function getRootTypeInfoForEventSlow(event){let typeInfo;let curProto=event.__proto__;while(true){if(curProto===Object.prototype){throw new Error('No view registered for '+event.toString());}
-typeInfo=onlyRootTypeInfosByEventProto.get(curProto);if(typeInfo){primaryEventProtoToTypeInfoMap.set(event.__proto__,typeInfo);return typeInfo;}
-curProto=curProto.__proto__;}}
-AnalysisSubView.getEventsOrganizedByTypeInfo=function(selection){if(onlyRootTypeInfosByEventProto===undefined){rebuildRootSubViewTypeInfos();}
-const eventsByRootTypeInfo=tr.b.groupIntoMap(selection,function(event){return getRootTypeInfoForEvent(event);},this,tr.model.EventSet);const eventsByLowestTypeInfo=new Map();eventsByRootTypeInfo.forEach(function(events,typeInfo){const lowestTypeInfo=findLowestTypeInfoForEvents(typeInfo,events);eventsByLowestTypeInfo.set(lowestTypeInfo,events);});return eventsByLowestTypeInfo;};return{AnalysisSubView,AnalysisSubViewTypeInfo,};});Polymer({is:'tr-ui-a-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView]});'use strict';Polymer({is:'tr-ui-a-stack-frame',ready(){this.stackFrame_=undefined;this.$.table.tableColumns=[];this.$.table.showHeader=true;},get stackFrame(){return this.stackFrame_;},set stackFrame(stackFrame){const table=this.$.table;this.stackFrame_=stackFrame;if(stackFrame===undefined){table.tableColumns=[];table.tableRows=[];table.rebuild();return;}
-let hasName=false;let hasTitle=false;table.tableRows=stackFrame.stackTrace;table.tableRows.forEach(function(row){hasName|=row.name!==undefined;hasTitle|=row.title!==undefined;});const cols=[];if(hasName){cols.push({title:'Name',value(row){return row.name;}});}
-if(hasTitle){cols.push({title:'Title',value(row){return row.title;}});}
-table.tableColumns=cols;table.rebuild();},tableForTesting(){return this.$.table;}});'use strict';Polymer({is:'tr-ui-a-single-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],properties:{isFlow:{type:Boolean,value:false}},ready(){this.currentSelection_=undefined;this.$.table.tableColumns=[{title:'Label',value(row){return row.name;},width:'150px'},{title:'Value',width:'100%',value(row){return row.value;}}];this.$.table.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){if(selection.length!==1){throw new Error('Only supports single slices');}
-this.setSelectionWithoutErrorChecks(selection);},setSelectionWithoutErrorChecks(selection){this.currentSelection_=selection;this.updateContents_();},getFlowEventRows_(event){const rows=this.getEventRowsHelper_(event);rows.splice(0,0,{name:'ID',value:event.id});function createLinkTo(slice){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(slice);});Polymer.dom(linkEl).textContent=slice.userFriendlyName;return linkEl;}
-rows.push({name:'From',value:createLinkTo(event.startSlice)});rows.push({name:'To',value:createLinkTo(event.endSlice)});return rows;},getEventRowsHelper_(event){const rows=[];if(event.error){rows.push({name:'Error',value:event.error});}
-if(event.title){let title=event.title;if(tr.isExported('tr-ui-e-chrome-codesearch')){const container=document.createElement('div');container.appendChild(document.createTextNode(title));const link=document.createElement('tr-ui-e-chrome-codesearch');link.searchPhrase=title;container.appendChild(link);title=container;}
-rows.push({name:'Title',value:title});}
-if(event.category){rows.push({name:'Category',value:event.category});}
-if(event.model!==undefined){const ufc=event.model.getUserFriendlyCategoryFromEvent(event);if(ufc!==undefined){rows.push({name:'User Friendly Category',value:ufc});}}
-if(event.name){rows.push({name:'Name',value:event.name});}
-rows.push({name:'Start',value:tr.v.ui.createScalarSpan(event.start,{unit:tr.b.Unit.byName.timeStampInMs})});if(event.category==='android'&&event.model!==undefined){rows.push({name:'Start (Absolute time)',value:tr.v.ui.createScalarSpan(event.model.convertTimestampFromModelTime('traceEventClock',event.start),{unit:tr.b.Unit.byName.timeStampInMs})});}
-if(event.duration){rows.push({name:'Wall Duration',value:tr.v.ui.createScalarSpan(event.duration,{unit:tr.b.Unit.byName.timeDurationInMs})});}
-if(event.cpuDuration){rows.push({name:'CPU Duration',value:tr.v.ui.createScalarSpan(event.cpuDuration,{unit:tr.b.Unit.byName.timeDurationInMs})});}
-if(event.subSlices!==undefined&&event.subSlices.length!==0){if(event.selfTime){rows.push({name:'Self Time',value:tr.v.ui.createScalarSpan(event.selfTime,{unit:tr.b.Unit.byName.timeDurationInMs})});}
-if(event.cpuSelfTime){const cpuSelfTimeEl=tr.v.ui.createScalarSpan(event.cpuSelfTime,{unit:tr.b.Unit.byName.timeDurationInMs});if(event.cpuSelfTime>event.selfTime){cpuSelfTimeEl.warning=' Note that CPU Self Time is larger than Self Time. '+'This is a known limitation of this system, which occurs '+'due to several subslices, rounding issues, and imprecise '+'time at which we get cpu- and real-time.';}
-rows.push({name:'CPU Self Time',value:cpuSelfTimeEl});}}
-if(event.durationInUserTime){rows.push({name:'Duration (U)',value:tr.v.ui.createScalarSpan(event.durationInUserTime,{unit:tr.b.Unit.byName.timeDurationInMs})});}
-function createStackFrameEl(sf){const sfEl=document.createElement('tr-ui-a-stack-frame');sfEl.stackFrame=sf;return sfEl;}
-if(event.startStackFrame&&event.endStackFrame){if(event.startStackFrame===event.endStackFrame){rows.push({name:'Start+End Stack Trace',value:createStackFrameEl(event.startStackFrame)});}else{rows.push({name:'Start Stack Trace',value:createStackFrameEl(event.startStackFrame)});rows.push({name:'End Stack Trace',value:createStackFrameEl(event.endStackFrame)});}}else if(event.startStackFrame){rows.push({name:'Start Stack Trace',value:createStackFrameEl(event.startStackFrame)});}else if(event.endStackFrame){rows.push({name:'End Stack Trace',value:createStackFrameEl(event.endStackFrame)});}
-if(event.info){const descriptionEl=tr.ui.b.createDiv({textContent:event.info.description,maxWidth:'300px'});rows.push({name:'Description',value:descriptionEl});if(event.info.docLinks){event.info.docLinks.forEach(function(linkObject){const linkEl=document.createElement('a');linkEl.target='_blank';linkEl.href=linkObject.href;Polymer.dom(linkEl).textContent=Polymer.dom(linkObject).textContent;rows.push({name:linkObject.label,value:linkEl});});}}
-if(event.associatedAlerts.length){const alertSubRows=[];event.associatedAlerts.forEach(function(alert){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(alert);},alert.info.description);alertSubRows.push({name:alert.title,value:linkEl});});rows.push({name:'Alerts',value:'',isExpanded:true,subRows:alertSubRows});}
-return rows;},getEventRows_(event){if(this.isFlow){return this.getFlowEventRows_(event);}
-return this.getEventRowsHelper_(event);},addArgsToRows_(rows,args){let n=0;for(const argName in args){n+=1;}
-if(n>0){const subRows=[];for(const argName in args){n+=1;}
-if(n>0){const subRows=[];for(const argName in args){const argView=document.createElement('tr-ui-a-generic-object-view');argView.object=args[argName];subRows.push({name:argName,value:argView});}
-rows.push({name:'Args',value:'',isExpanded:true,subRows});}}},addContextsToRows_(rows,contexts){if(contexts.length){const subRows=contexts.map(function(context){const contextView=document.createElement('tr-ui-a-generic-object-view');contextView.object=context;return{name:'Context',value:contextView};});rows.push({name:'Contexts',value:'',isExpanded:true,subRows});}},updateContents_(){if(this.currentSelection_===undefined){this.$.table.rows=[];this.$.table.rebuild();return;}
-const event=tr.b.getOnlyElement(this.currentSelection_);const rows=this.getEventRows_(event);if(event.argsStripped){rows.push({name:'Args',value:'Stripped'});}else{this.addArgsToRows_(rows,event.args);}
-this.addContextsToRows_(rows,event.contexts);const customizeRowsEvent=new tr.b.Event('customize-rows');customizeRowsEvent.rows=rows;this.dispatchEvent(customizeRowsEvent);this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-e-chrome-cc-raster-task-view',created(){this.selection_=undefined;},set selection(selection){this.selection_=selection;this.updateContents_();},updateColumns_(hadCpuDurations){const timeSpanConfig={unit:tr.b.Unit.byName.timeDurationInMs,ownerDocument:this.ownerDocument};const columns=[{title:'Layer',value(row){if(row.isTotals)return'Totals';if(row.layer){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.ui.e.chrome.cc.LayerSelection(row.layer);},'Layer '+row.layerId);return linkEl;}
-return'Layer '+row.layerId;},width:'250px'},{title:'Num Tiles',value(row){return row.numTiles;},cmp(a,b){return a.numTiles-b.numTiles;}},{title:'Num Analysis Tasks',value(row){return row.numAnalysisTasks;},cmp(a,b){return a.numAnalysisTasks-b.numAnalysisTasks;}},{title:'Num Raster Tasks',value(row){return row.numRasterTasks;},cmp(a,b){return a.numRasterTasks-b.numRasterTasks;}},{title:'Wall Duration (ms)',value(row){return tr.v.ui.createScalarSpan(row.duration,timeSpanConfig);},cmp(a,b){return a.duration-b.duration;}}];if(hadCpuDurations){columns.push({title:'CPU Duration (ms)',value(row){return tr.v.ui.createScalarSpan(row.cpuDuration,timeSpanConfig);},cmp(a,b){return a.cpuDuration-b.cpuDuration;}});}
-let colWidthPercentage;if(columns.length===1){colWidthPercentage='100%';}else{colWidthPercentage=(100/(columns.length-1)).toFixed(3)+'%';}
-for(let i=1;i<columns.length;i++){columns[i].width=colWidthPercentage;}
-this.$.content.tableColumns=columns;this.$.content.sortColumnIndex=columns.length-1;},updateContents_(){const table=this.$.content;if(this.selection_.length===0){this.$.link.setSelectionAndContent(undefined,'');table.tableRows=[];table.footerRows=[];table.rebuild();return;}
-const lthi=tr.e.cc.getTileFromRasterTaskSlice(tr.b.getFirstElement(this.selection_)).containingSnapshot;this.$.link.setSelectionAndContent(function(){return new tr.model.EventSet(lthi);},lthi.userFriendlyName);const costsByLayerId={};function getCurrentCostsForLayerId(tile){const layerId=tile.layerId;const lthi=tile.containingSnapshot;let layer;if(lthi.activeTree){layer=lthi.activeTree.findLayerWithId(layerId);}
-if(layer===undefined&&lthi.pendingTree){layer=lthi.pendingTree.findLayerWithId(layerId);}
-if(costsByLayerId[layerId]===undefined){costsByLayerId[layerId]={layerId,layer,numTiles:0,numAnalysisTasks:0,numRasterTasks:0,duration:0,cpuDuration:0};}
-return costsByLayerId[layerId];}
-let totalDuration=0;let totalCpuDuration=0;let totalNumAnalyzeTasks=0;let totalNumRasterizeTasks=0;let hadCpuDurations=false;const tilesThatWeHaveSeen={};this.selection_.forEach(function(slice){const tile=tr.e.cc.getTileFromRasterTaskSlice(slice);const curCosts=getCurrentCostsForLayerId(tile);if(!tilesThatWeHaveSeen[tile.objectInstance.id]){tilesThatWeHaveSeen[tile.objectInstance.id]=true;curCosts.numTiles+=1;}
-if(tr.e.cc.isSliceDoingAnalysis(slice)){curCosts.numAnalysisTasks+=1;totalNumAnalyzeTasks+=1;}else{curCosts.numRasterTasks+=1;totalNumRasterizeTasks+=1;}
-curCosts.duration+=slice.duration;totalDuration+=slice.duration;if(slice.cpuDuration!==undefined){curCosts.cpuDuration+=slice.cpuDuration;totalCpuDuration+=slice.cpuDuration;hadCpuDurations=true;}});this.updateColumns_(hadCpuDurations);table.tableRows=Object.values(costsByLayerId);table.rebuild();table.footerRows=[{isTotals:true,numTiles:Object.keys(tilesThatWeHaveSeen).length,numAnalysisTasks:totalNumAnalyzeTasks,numRasterTasks:totalNumRasterizeTasks,duration:totalDuration,cpuDuration:totalCpuDuration}];}});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){function RasterTaskSelection(selection){tr.ui.e.chrome.cc.Selection.call(this);const whySupported=RasterTaskSelection.whySuported(selection);if(!whySupported.ok){throw new Error('Fail: '+whySupported.why);}
-this.slices_=Array.from(selection);this.tiles_=this.slices_.map(function(slice){const tile=tr.e.cc.getTileFromRasterTaskSlice(slice);if(tile===undefined){throw new Error('This should never happen due to .supports check.');}
-return tile;});}
-RasterTaskSelection.whySuported=function(selection){if(!(selection instanceof tr.model.EventSet)){return{ok:false,why:'Must be selection'};}
-if(selection.length===0){return{ok:false,why:'Selection must be non empty'};}
-let referenceSnapshot=undefined;for(const event of selection){if(!(event instanceof tr.model.Slice)){return{ok:false,why:'Not a slice'};}
-const tile=tr.e.cc.getTileFromRasterTaskSlice(event);if(tile===undefined){return{ok:false,why:'No tile found'};}
-if(!referenceSnapshot){referenceSnapshot=tile.containingSnapshot;}else{if(tile.containingSnapshot!==referenceSnapshot){return{ok:false,why:'Raster tasks are from different compositor instances'};}}}
-return{ok:true};};RasterTaskSelection.supports=function(selection){return RasterTaskSelection.whySuported(selection).ok;};RasterTaskSelection.prototype={__proto__:tr.ui.e.chrome.cc.Selection.prototype,get specicifity(){return 3;},get associatedLayerId(){const tile0=this.tiles_[0];const allSameLayer=this.tiles_.every(function(tile){tile.layerId===tile0.layerId;});if(allSameLayer){return tile0.layerId;}
-return undefined;},get extraHighlightsByLayerId(){const highlights={};this.tiles_.forEach(function(tile,i){if(highlights[tile.layerId]===undefined){highlights[tile.layerId]=[];}
-const slice=this.slices_[i];highlights[tile.layerId].push({colorKey:slice.title,rect:tile.layerRect});},this);return highlights;},createAnalysis(){const sel=new tr.model.EventSet();this.slices_.forEach(function(slice){sel.push(slice);});let analysis;if(sel.length===1){analysis=document.createElement('tr-ui-a-single-event-sub-view');}else{analysis=document.createElement('tr-ui-e-chrome-cc-raster-task-view');}
-analysis.selection=sel;return analysis;},findEquivalent(lthi){return undefined;},get containingSnapshot(){return this.tiles_[0].containingSnapshot;}};return{RasterTaskSelection,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const TileSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-tile-snapshot-view',tr.ui.analysis.ObjectSnapshotView);TileSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-tile-snapshot-view');this.layerTreeView_=new tr.ui.e.chrome.cc.LayerTreeHostImplSnapshotView();Polymer.dom(this).appendChild(this.layerTreeView_);},updateContents(){const tile=this.objectSnapshot_;const layerTreeHostImpl=tile.containingSnapshot;if(!layerTreeHostImpl)return;this.layerTreeView_.objectSnapshot=layerTreeHostImpl;this.layerTreeView_.selection=new tr.ui.e.chrome.cc.TileSelection(tile);}};tr.ui.analysis.ObjectSnapshotView.register(TileSnapshotView,{typeName:'cc::Tile',showInTrackView:false});return{TileSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.chrome',function(){Polymer({is:'tr-ui-e-chrome-codesearch',set searchPhrase(phrase){const link=Polymer.dom(this.$.codesearchLink);const codeSearchURL='https://cs.chromium.org/search/?sq=package:chromium&type=cs&q=';link.setAttribute('href',codeSearchURL+encodeURIComponent(phrase));},onClick(clickEvent){clickEvent.stopPropagation();}});return{};});'use strict';tr.exportTo('tr.e.gpu',function(){const AsyncSlice=tr.model.AsyncSlice;function GpuAsyncSlice(){AsyncSlice.apply(this,arguments);}
-GpuAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get viewSubGroupTitle(){if(this.args.channel){if(this.category==='disabled-by-default-gpu.device'){return'Device.'+this.args.channel;}
-return'Service.'+this.args.channel;}
-return this.title;}};AsyncSlice.subTypes.register(GpuAsyncSlice,{categoryParts:['disabled-by-default-gpu.device','disabled-by-default-gpu.service']});return{GpuAsyncSlice,};});'use strict';tr.exportTo('tr.e.gpu',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function StateSnapshot(){ObjectSnapshot.apply(this,arguments);}
-StateSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){this.screenshot_=undefined;},initialize(){if(this.args.screenshot){this.screenshot_=this.args.screenshot;}},get screenshot(){return this.screenshot_;}};ObjectSnapshot.subTypes.register(StateSnapshot,{typeName:'gpu::State'});return{StateSnapshot,};});'use strict';tr.exportTo('tr.ui.e.chrome.gpu',function(){const StateSnapshotView=tr.ui.b.define('tr-ui-e-chrome-gpu-state-snapshot-view',tr.ui.analysis.ObjectSnapshotView);StateSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-gpu-state-snapshot-view');this.screenshotImage_=document.createElement('img');Polymer.dom(this).appendChild(this.screenshotImage_);},updateContents(){if(this.objectSnapshot_&&this.objectSnapshot_.screenshot){this.screenshotImage_.src='data:image/png;base64,'+
-this.objectSnapshot_.screenshot;}}};tr.ui.analysis.ObjectSnapshotView.register(StateSnapshotView,{typeName:'gpu::State'});return{StateSnapshotView,};});'use strict';tr.exportTo('tr.ui.analysis',function(){Polymer({is:'tr-ui-a-layout-tree-sub-view',behaviors:['tr-ui-a-sub-view'],set selection(selection){this.currentSelection_=selection;this.updateContents_();},get selection(){return this.currentSelection_;},updateContents_(){this.set('$.content.textContent','');if(!this.currentSelection_)return;const columns=[{title:'Tag/Name',value(layoutObject){return layoutObject.tag||':'+layoutObject.name;}},{title:'htmlId',value(layoutObject){return layoutObject.htmlId||'';}},{title:'classNames',value(layoutObject){return layoutObject.classNames||'';}},{title:'reasons',value(layoutObject){return layoutObject.needsLayoutReasons.join(', ');}},{title:'width',value(layoutObject){return layoutObject.absoluteRect.width;}},{title:'height',value(layoutObject){return layoutObject.absoluteRect.height;}},{title:'absX',value(layoutObject){return layoutObject.absoluteRect.left;}},{title:'absY',value(layoutObject){return layoutObject.absoluteRect.top;}},{title:'relX',value(layoutObject){return layoutObject.relativeRect.left;}},{title:'relY',value(layoutObject){return layoutObject.relativeRect.top;}},{title:'float',value(layoutObject){return layoutObject.isFloat?'float':'';}},{title:'positioned',value(layoutObject){return layoutObject.isPositioned?'positioned':'';}},{title:'relative',value(layoutObject){return layoutObject.isRelativePositioned?'relative':'';}},{title:'sticky',value(layoutObject){return layoutObject.isStickyPositioned?'sticky':'';}},{title:'anonymous',value(layoutObject){return layoutObject.isAnonymous?'anonymous':'';}},{title:'row',value(layoutObject){if(layoutObject.tableRow===undefined){return'';}
-return layoutObject.tableRow;}},{title:'col',value(layoutObject){if(layoutObject.tableCol===undefined){return'';}
-return layoutObject.tableCol;}},{title:'rowSpan',value(layoutObject){if(layoutObject.tableRowSpan===undefined){return'';}
-return layoutObject.tableRowSpan;}},{title:'colSpan',value(layoutObject){if(layoutObject.tableColSpan===undefined){return'';}
-return layoutObject.tableColSpan;}},{title:'address',value(layoutObject){return layoutObject.id.toString(16);}}];const table=this.ownerDocument.createElement('tr-ui-b-table');table.defaultExpansionStateCallback=function(layoutObject,parentLayoutObject){return true;};table.subRowsPropertyName='childLayoutObjects';table.tableColumns=columns;table.tableRows=this.currentSelection_.map(function(snapshot){return snapshot.rootLayoutObject;});table.rebuild();Polymer.dom(this.$.content).appendChild(table);},});return{};});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-layout-tree-sub-view',tr.e.chrome.LayoutTreeSnapshot,{multi:false,title:'Layout Tree',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-layout-tree-sub-view',tr.e.chrome.LayoutTreeSnapshot,{multi:true,title:'Layout Trees',});'use strict';tr.exportTo('tr.ui.e.img',function(){const THIS_DOC=document.currentScript.ownerDocument;const ImageSnapshotView=tr.ui.b.define('tr-ui-e-img-image-snapshot-view',tr.ui.analysis.ObjectSnapshotView);ImageSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){const node=tr.ui.b.instantiateTemplate('#tr-ui-e-img-image-snapshot-view-template',THIS_DOC);Polymer.dom(this).appendChild(node);const info=Polymer.dom(this).querySelector('.image-info');this.sizeInfo_=Polymer.dom(info).querySelector('.size');this.imageContainer_=Polymer.dom(this).querySelector('.image-container');this.image_=Polymer.dom(this.imageContainer_).querySelector('img');this.zoomScaleValue_=1;this.trackMouse_();},updateContents(){if(this.objectSnapshot_&&this.objectSnapshot_.data&&this.objectSnapshot_.type){this.image_.onload=this.drawPicture_.bind(this);this.image_.src=`data:image/${this.objectSnapshot_.type};`+`base64,${this.objectSnapshot_.data}`;}
-this.drawPicture_();},drawPicture_(){if(!this.image_.complete)return;const naturalWidth=this.image_.naturalWidth;const naturalHeight=this.image_.naturalHeight;this.sizeInfo_.textContent=`(${naturalWidth} x ${naturalHeight})`;this.image_.width=naturalWidth*this.zoomScaleValue_;this.image_.height=naturalHeight*this.zoomScaleValue_;},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.imageContainer_;Polymer.dom(this.imageContainer_).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.defaultMode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.settingsKey='pictureDebugger.mouseModeSelector';this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));},onBeginZoom_(e){this.isZooming_=true;this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const currentMouseViewPos=this.extractRelativeMousePosition_(e);this.zoomScaleValue_+=((this.lastMouseViewPos_.y-currentMouseViewPos.y)*0.001);this.zoomScaleValue_=Math.max(this.zoomScaleValue_,0.1);this.drawPicture_();this.lastMouseViewPos_=currentMouseViewPos;},onEndZoom_(e){this.lastMouseViewPos_=undefined;this.isZooming_=false;e.preventDefault();},extractRelativeMousePosition_(e){return{x:e.clientX-this.imageContainer_.offsetLeft,y:e.clientY-this.imageContainer_.offsetTop};},};tr.ui.analysis.ObjectSnapshotView.register(ImageSnapshotView,{typeName:'gfx::Image'});return{ImageSnapshotView,};});'use strict';tr.exportTo('tr.ui.behaviors',function(){const SidePanel={get rangeOfInterest(){throw new Error('Not implemented');},set rangeOfInterest(rangeOfInterest){throw new Error('Not implemented');},get selection(){throw new Error('Not implemented');},set selection(selection){throw new Error('Not implemented');},get model(){throw new Error('Not implemented');},set model(model){throw new Error('Not implemented');},supportsModel(m){throw new Error('Not implemented');}};return{SidePanel,};});'use strict';tr.exportTo('tr.ui.side_panel',function(){function SidePanelRegistry(){}
-const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(SidePanelRegistry,options);return{SidePanelRegistry,};});'use strict';tr.exportTo('tr.ui.e.s',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const FrameTreeNodeSnapshot=tr.e.chrome.FrameTreeNodeSnapshot;const RenderFrameSnapshot=tr.e.chrome.RenderFrameSnapshot;const TopLevelSnapshot=tr.e.chrome.TopLevelSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;const FrameTreeNodeInstance=tr.e.chrome.FrameTreeNodeInstance;const RenderFrameInstance=tr.e.chrome.RenderFrameInstance;const TopLevelInstance=tr.e.chrome.TopLevelInstance;function Row(context){this.subRows=undefined;this.contexts=[];this.type=undefined;this.renderer='N/A';this.url=undefined;this.time=0;this.eventsOfInterest=new tr.model.EventSet();if(context===undefined)return;this.type=context.objectInstance.blameContextType;this.contexts.push(context);if(context instanceof FrameTreeNodeSnapshot){if(context.renderFrame){this.contexts.push(context.renderFrame);this.renderer=context.renderFrame.objectInstance.parent.pid;}}else if(context instanceof RenderFrameSnapshot){if(context.frameTreeNode){this.contexts.push(context.frameTreeNode);}
-this.renderer=context.objectInstance.parent.pid;}else if(context instanceof TopLevelSnapshot){this.renderer=context.objectInstance.parent.pid;}else{throw new Error('Unknown context type');}
-this.eventsOfInterest.addEventSet(this.contexts);this.url=context.url;}
-const groupFunctions={none:rows=>rows,tree(rows,rowMap){const getParentRow=function(row){let pivot;row.contexts.forEach(function(context){if(context instanceof tr.e.chrome.FrameTreeNodeSnapshot){pivot=context;}});if(pivot&&pivot.parentContext){return rowMap[pivot.parentContext.guid];}
-return undefined;};const rootRows=[];rows.forEach(function(row){const parentRow=getParentRow(row);if(parentRow===undefined){rootRows.push(row);return;}
-if(parentRow.subRows===undefined){parentRow.subRows=[];}
-parentRow.subRows.push(row);});const aggregateAllDescendants=function(row){if(!row.subRows){if(getParentRow(row)){row.type='Subframe';}
-return row;}
-const result=new Row();result.type='Frame Tree';result.renderer=row.renderer;result.url=row.url;result.subRows=[row];row.subRows.forEach(subRow=>result.subRows.push(aggregateAllDescendants(subRow)));result.subRows.forEach(function(subRow){result.time+=subRow.time;result.eventsOfInterest.addEventSet(subRow.eventsOfInterest);});row.subRows=undefined;return result;};return rootRows.map(rootRow=>aggregateAllDescendants(rootRow));}};Polymer({is:'tr-ui-e-s-frame-data-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.model_=undefined;this.rangeOfInterest_=new tr.b.math.Range();this.$.table.showHeader=true;this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.tableColumns=this.createFrameDataTableColumns_();this.$.table.addEventListener('selection-changed',function(e){this.selectEventSet_(this.$.table.selectedTableRow.eventsOfInterest);}.bind(this));this.$.select.addEventListener('change',function(e){this.updateContents_();}.bind(this));},selectEventSet_(eventSet){const event=new tr.model.RequestSelectionChangeEvent();event.selection=eventSet;this.dispatchEvent(event);},createFrameDataTableColumns_(){return[{title:'Renderer',value:row=>row.renderer,cmp:(a,b)=>a.renderer-b.renderer},{title:'Type',value:row=>row.type},{title:'Time',value:row=>tr.v.ui.createScalarSpan(row.time,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument}),cmp:(a,b)=>a.time-b.time},{title:'URL',value:row=>row.url,cmp:(a,b)=>(a.url||'').localeCompare(b.url||'')}];},createFrameDataTableRows_(){if(!this.model_)return[];const rows=[];const rowMap={};for(const proc of Object.values(this.model_.processes)){proc.objects.iterObjectInstances(function(objectInstance){if(!(objectInstance instanceof BlameContextInstance)){return;}
-objectInstance.snapshots.forEach(function(snapshot){if(rowMap[snapshot.guid])return;const row=new Row(snapshot);row.contexts.forEach(context=>rowMap[context.guid]=row);rows.push(row);},this);},this);}
-for(const proc of Object.values(this.model_.processes)){for(const thread of Object.values(proc.threads)){thread.sliceGroup.iterSlicesInTimeRange(function(topLevelSlice){topLevelSlice.contexts.forEach(function(context){if(!context.snapshot.guid||!rowMap[context.snapshot.guid]){return;}
-const row=rowMap[context.snapshot.guid];row.eventsOfInterest.push(topLevelSlice);row.time+=topLevelSlice.selfTime||0;});},this.currentRangeOfInterest.min,this.currentRangeOfInterest.max);}}
-const select=this.$.select;const groupOption=select.options[select.selectedIndex].value;const groupFunction=groupFunctions[groupOption];return groupFunction(rows,rowMap);},updateContents_(){this.$.table.tableRows=this.createFrameDataTableRows_();this.$.table.rebuild();},supportsModel(m){if(!m){return{supported:false,reason:'No model available.'};}
-const ans={supported:false};for(const proc of Object.values(m.processes)){proc.objects.iterObjectInstances(function(instance){if(instance instanceof BlameContextInstance){ans.supported=true;}});}
-if(!ans.supported){ans.reason='No frame data available';}
-return ans;},get currentRangeOfInterest(){if(this.rangeOfInterest_.isEmpty){return this.model_.bounds;}
-return this.rangeOfInterest_;},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(rangeOfInterest){this.rangeOfInterest_=rangeOfInterest;this.updateContents_();},get selection(){},set selection(_){},get textLabel(){return'Frame Data';},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-e-s-frame-data-side-panel');});});'use strict';Polymer({is:'tr-ui-b-chart-legend-key',ready(){this.$.checkbox.addEventListener('change',this.onCheckboxChange_.bind(this));},onCheckboxChange_(){tr.b.dispatchSimpleEvent(this,tr.ui.b.DataSeriesEnableChangeEventType,true,false,{key:Polymer.dom(this).textContent,enabled:this.enabled});},set textContent(t){Polymer.dom(this.$.label).textContent=t;Polymer.dom(this.$.link).textContent=t;this.updateContents_();},set width(w){w-=20;this.$.link.style.width=w+'px';this.$.label.style.width=w+'px';},get textContent(){return Polymer.dom(this.$.label).textContent;},set optional(optional){this.$.checkbox.style.visibility=optional?'visible':'hidden';},get optional(){return this.$.checkbox.style.visibility==='visible';},set enabled(enabled){this.$.checkbox.checked=enabled?'checked':'';},get enabled(){return this.$.checkbox.checked;},set color(c){this.$.label.style.color=c;this.$.link.color=c;},set target(target){this.$.link.setSelectionAndContent(target,Polymer.dom(this.$.label).textContent);this.updateContents_();},get target(){return this.$.link.selection;},set title(title){this.$.link.title=title;},updateContents_(){this.$.link.style.display=this.target?'':'none';this.$.label.style.display=this.target?'none':'';this.$.label.htmlFor=this.optional?'checkbox':'';}});'use strict';(function(window){window.define=function(x){window.d3=x;};window.define.amd=true;})(this);!function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(n){return aa+n in this}function o(n){return n=aa+n,n in this&&delete this[n]}function a(){var n=[];return this.forEach(function(t){n.push(t)}),n}function c(){var n=0;for(var t in this)t.charCodeAt(0)===ca&&++n;return n}function s(){for(var n in this)if(n.charCodeAt(0)===ca)return!1;return!0}function l(){}function f(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function h(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=sa.length;r>e;++e){var u=sa[e]+t;if(u in n)return u}}function g(){}function p(){}function v(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function d(){Xo.event.preventDefault()}function m(){for(var n,t=Xo.event;n=t.sourceEvent;)t=n;return t}function y(n){for(var t=new p,e=0,r=arguments.length;++e<r;)t[arguments[e]]=v(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=Xo.event;u.target=n,Xo.event=u,t[u.type].apply(e,r)}finally{Xo.event=i}}},t}function x(n){return fa(n,da),n}function M(n){return"function"==typeof n?n:function(){return ha(n,this)}}function _(n){return"function"==typeof n?n:function(){return ga(n,this)}}function b(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=Xo.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function w(n){return n.trim().replace(/\s+/g," ")}function S(n){return new RegExp("(?:^|\\s+)"+Xo.requote(n)+"(?:\\s+|$)","g")}function k(n){return n.trim().split(/^|\s+/)}function E(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=k(n).map(A);var u=n.length;return"function"==typeof t?r:e}function A(n){var t=S(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",w(u+" "+n))):e.setAttribute("class",w(u.replace(t," ")))}}function C(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function N(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function L(n){return"function"==typeof n?n:(n=Xo.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function T(n){return{__data__:n}}function q(n){return function(){return va(this,n)}}function z(n){return arguments.length||(n=Xo.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function R(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function D(n){return fa(n,ya),n}function P(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function U(){var n=this.__transition__;n&&++n.active}function j(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,Bo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+Xo.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=H;a>0&&(n=n.substring(0,a));var s=Ma.get(n);return s&&(n=s,c=F),a?t?u:r:t?g:i}function H(n,t){return function(e){var r=Xo.event;Xo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Xo.event=r}}}function F(n,t){var e=H(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function O(){var n=".dragsuppress-"+ ++ba,t="click"+n,e=Xo.select(Go).on("touchmove"+n,d).on("dragstart"+n,d).on("selectstart"+n,d);if(_a){var r=Jo.style,u=r[_a];r[_a]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),_a&&(r[_a]=u),i&&(e.on(t,function(){d(),o()},!0),setTimeout(o,0))}}function Y(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>wa&&(Go.scrollX||Go.scrollY)){e=Xo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();wa=!(u.f||u.e),e.remove()}return wa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function I(n){return n>0?1:0>n?-1:0}function Z(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function V(n){return n>1?0:-1>n?Sa:Math.acos(n)}function X(n){return n>1?Ea:-1>n?-Ea:Math.asin(n)}function $(n){return((n=Math.exp(n))-1/n)/2}function B(n){return((n=Math.exp(n))+1/n)/2}function W(n){return((n=Math.exp(2*n))-1)/(n+1)}function J(n){return(n=Math.sin(n/2))*n}function G(){}function K(n,t,e){return new Q(n,t,e)}function Q(n,t,e){this.h=n,this.s=t,this.l=e}function nt(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,gt(u(n+120),u(n),u(n-120))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.h=n,this.c=t,this.l=e}function rt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),ut(e,Math.cos(n*=Na)*t,Math.sin(n)*t)}function ut(n,t,e){return new it(n,t,e)}function it(n,t,e){this.l=n,this.a=t,this.b=e}function ot(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=ct(u)*Fa,r=ct(r)*Oa,i=ct(i)*Ya,gt(lt(3.2404542*u-1.5371385*r-.4985314*i),lt(-.969266*u+1.8760108*r+.041556*i),lt(.0556434*u-.2040259*r+1.0572252*i))}function at(n,t,e){return n>0?tt(Math.atan2(e,t)*La,Math.sqrt(t*t+e*e),n):tt(0/0,0/0,n)}function ct(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function st(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function lt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ft(n){return gt(n>>16,255&n>>8,255&n)}function ht(n){return ft(n)+""}function gt(n,t,e){return new pt(n,t,e)}function pt(n,t,e){this.r=n,this.g=t,this.b=e}function vt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function dt(n,t,e){var r,u,i,o,a=0,c=0,s=0;if(u=/([a-z]+)\((.*)\)/i.exec(n))switch(i=u[2].split(","),u[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Mt(i[0]),Mt(i[1]),Mt(i[2]))}return(o=Va.get(n))?t(o.r,o.g,o.b):(null!=n&&"#"===n.charAt(0)&&(r=parseInt(n.substring(1),16),isNaN(r)||(4===n.length?(a=(3840&r)>>4,a=a>>4|a,c=240&r,c=c>>4|c,s=15&r,s=s<<4|s):7===n.length&&(a=(16711680&r)>>16,c=(65280&r)>>8,s=255&r))),t(a,c,s))}function mt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),K(r,u,c)}function yt(n,t,e){n=xt(n),t=xt(t),e=xt(e);var r=st((.4124564*n+.3575761*t+.1804375*e)/Fa),u=st((.2126729*n+.7151522*t+.072175*e)/Oa),i=st((.0193339*n+.119192*t+.9503041*e)/Ya);return ut(116*u-16,500*(r-u),200*(u-i))}function xt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Mt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function _t(n){return"function"==typeof n?n:function(){return n}}function bt(n){return n}function wt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),St(t,e,n,r)}}function St(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Xo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Go.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Xo.event;Xo.event=n;try{o.progress.call(i,c)}finally{Xo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Bo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Xo.rebind(i,o,"on"),null==r?i:i.get(kt(r))}function kt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Et(){var n=At(),t=Ct()-n;t>24?(isFinite(t)&&(clearTimeout(Wa),Wa=setTimeout(Et,t)),Ba=0):(Ba=1,Ga(Et))}function At(){var n=Date.now();for(Ja=Xa;Ja;)n>=Ja.t&&(Ja.f=Ja.c(n-Ja.t)),Ja=Ja.n;return n}function Ct(){for(var n,t=Xa,e=1/0;t;)t.f?t=n?n.n=t.n:Xa=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return $a=n,e}function Nt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Lt(n,t){var e=Math.pow(10,3*oa(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Tt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:bt;return function(n){var e=Qa.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=nc.get(g)||qt;var y=s&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var c=Xo.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x=n.lastIndexOf("."),M=0>x?n:n.substring(0,x),_=0>x?"":t+n.substring(x+1);!s&&f&&(M=i(M));var b=v.length+M.length+_.length+(y?0:u.length),w=l>b?new Array(b=l-b+1).join(r):"";return y&&(M=i(w+M)),u+=v,n=M+_,("<"===o?u+n+w:">"===o?w+u+n:"^"===o?w.substring(0,b>>=1)+u+n+w.substring(b):u+(y?n:w+n))+e}}}function qt(n){return n+""}function zt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Rt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new ec(e-1)),1),e}function i(n,e){return t(n=new ec(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{ec=zt;var r=new zt;return r._=n,o(r,t,e)}finally{ec=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Dt(n);return c.floor=c,c.round=Dt(r),c.ceil=Dt(u),c.offset=Dt(i),c.range=a,n}function Dt(n){return function(t,e){try{ec=zt;var r=new zt;return r._=t,n(r,e)._}finally{ec=Date}}}function Pt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=uc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=C[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.substring(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&ec!==zt,o=new(i?zt:ec);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+Math.floor(r.Z/100),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c>a;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in uc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{ec=zt;var t=new ec;return t._=n,r(t)}finally{ec=Date}}var r=t(n);return e.parse=function(n){try{ec=zt;var t=r.parse(n);return t&&t._}finally{ec=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ee;var x=Xo.map(),M=jt(v),_=Ht(v),b=jt(d),w=Ht(d),S=jt(m),k=Ht(m),E=jt(y),A=Ht(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ut(n.getDate(),t,2)},e:function(n,t){return Ut(n.getDate(),t,2)},H:function(n,t){return Ut(n.getHours(),t,2)},I:function(n,t){return Ut(n.getHours()%12||12,t,2)},j:function(n,t){return Ut(1+tc.dayOfYear(n),t,3)},L:function(n,t){return Ut(n.getMilliseconds(),t,3)},m:function(n,t){return Ut(n.getMonth()+1,t,2)},M:function(n,t){return Ut(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ut(n.getSeconds(),t,2)},U:function(n,t){return Ut(tc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ut(tc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ut(n.getFullYear()%100,t,2)},Y:function(n,t){return Ut(n.getFullYear()%1e4,t,4)},Z:ne,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Bt,e:Bt,H:Jt,I:Jt,j:Wt,L:Qt,m:$t,M:Gt,p:l,S:Kt,U:Ot,w:Ft,W:Yt,x:c,X:s,y:Zt,Y:It,Z:Vt,"%":te};return t}function Ut(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function jt(n){return new RegExp("^(?:"+n.map(Xo.requote).join("|")+")","i")}function Ht(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Ft(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Ot(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Yt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function It(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Zt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.y=Xt(+r[0]),e+r[0].length):-1}function Vt(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function Xt(n){return n+(n>68?1900:2e3)}function $t(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Bt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Wt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Jt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Gt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Kt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Qt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ne(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(oa(t)/60),u=oa(t)%60;return e+Ut(r,"0",2)+Ut(u,"0",2)}function te(n,t,e){oc.lastIndex=0;var r=oc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ee(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function re(){}function ue(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function ie(n,t){n&&lc.hasOwnProperty(n.type)&&lc[n.type](n,t)}function oe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function ae(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)oe(n[e],t,1);t.polygonEnd()}function ce(){function n(n,t){n*=Na,t=t*Na/2+Sa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),s=Math.sin(t),l=i*s,f=u*c+l*Math.cos(a),h=l*o*Math.sin(a);hc.add(Math.atan2(h,f)),r=n,u=c,i=s}var t,e,r,u,i;gc.point=function(o,a){gc.point=n,r=(t=o)*Na,u=Math.cos(a=(e=a)*Na/2+Sa/4),i=Math.sin(a)},gc.lineEnd=function(){n(t,e)}}function se(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function le(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function fe(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function he(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ge(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function pe(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function ve(n){return[Math.atan2(n[1],n[0]),X(n[2])]}function de(n,t){return oa(n[0]-t[0])<Aa&&oa(n[1]-t[1])<Aa}function me(n,t){n*=Na;var e=Math.cos(t*=Na);ye(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function ye(n,t,e){++pc,dc+=(n-dc)/pc,mc+=(t-mc)/pc,yc+=(e-yc)/pc}function xe(){function n(n,u){n*=Na;var i=Math.cos(u*=Na),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);vc+=s,xc+=s*(t+(t=o)),Mc+=s*(e+(e=a)),_c+=s*(r+(r=c)),ye(t,e,r)}var t,e,r;kc.point=function(u,i){u*=Na;var o=Math.cos(i*=Na);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),kc.point=n,ye(t,e,r)}}function Me(){kc.point=me}function _e(){function n(n,t){n*=Na;var e=Math.cos(t*=Na),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&&-V(g)/h,v=Math.atan2(h,g);bc+=p*s,wc+=p*l,Sc+=p*f,vc+=v,xc+=v*(r+(r=o)),Mc+=v*(u+(u=a)),_c+=v*(i+(i=c)),ye(r,u,i)}var t,e,r,u,i;kc.point=function(o,a){t=o,e=a,kc.point=n,o*=Na;var c=Math.cos(a*=Na);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),ye(r,u,i)},kc.lineEnd=function(){n(t,e),kc.lineEnd=Me,kc.point=me}}function be(){return!0}function we(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(de(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new ke(e,n,null,!0),s=new ke(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new ke(r,n,null,!1),s=new ke(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Se(i),Se(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Se(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function ke(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Ee(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ae))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Xo.merge(g);var n=Le(m,p);g.length?we(g,Ne,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ce(),M=t(x);return y}}function Ae(n){return n.length>1}function Ce(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:g,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ne(n,t){return((n=n.x)[0]<0?n[1]-Ea-Aa:Ea-n[1])-((t=t.x)[0]<0?t[1]-Ea-Aa:Ea-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Sa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Sa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=_>=0?1:-1,w=b*_,S=w>Sa,k=p*x;if(hc.add(Math.atan2(k*b*Math.sin(w),v*M+k*Math.cos(w))),i+=S?_+b*ka:_,S^h>=e^m>=e){var E=fe(se(f),se(n));pe(E);var A=fe(u,E);pe(A);var C=(S^_>=0?-1:1)*X(A[2]);(r>C||r===C&&(E[0]||E[1]))&&(o+=S^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Aa>i||Aa>i&&0>hc)^1&o}function Te(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Sa:-Sa,c=oa(i-e);oa(c-Sa)<Aa?(n.point(e,r=(r+o)/2>0?Ea:-Ea),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Sa&&(oa(e-u)<Aa&&(e-=u*Aa),oa(i-a)<Aa&&(i-=a*Aa),r=qe(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function qe(n,t,e,r){var u,i,o=Math.sin(n-e);return oa(o)>Aa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function ze(n,t,e,r){var u;if(null==n)u=e*Ea,r.point(-Sa,u),r.point(0,u),r.point(Sa,u),r.point(Sa,0),r.point(Sa,-u),r.point(0,-u),r.point(-Sa,-u),r.point(-Sa,0),r.point(-Sa,u);else if(oa(n[0]-t[0])>Aa){var i=n[0]<t[0]?Sa:-Sa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Re(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Sa:-Sa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(de(e,g)||de(p,g))&&(p[0]+=Aa,p[1]+=Aa,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&de(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=se(n),u=se(t),o=[1,0,0],a=fe(r,u),c=le(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=fe(o,a),p=ge(o,f),v=ge(a,h);he(p,v);var d=g,m=le(p,d),y=le(d,d),x=m*m-y*(le(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ge(d,(-m-M)/y);if(he(_,p),_=ve(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=oa(A-Sa)<Aa,N=C||Aa>A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(oa(_[0]-w)<Aa?k:E):k<=_[1]&&_[1]<=E:A>Sa^(w<=_[0]&&_[0]<=S)){var L=ge(d,(-m+M)/y);return he(L,p),[_,ve(L)]}}}function u(t,e){var r=o?n:Sa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=oa(i)>Aa,c=cr(n,6*Na);return Ee(t,e,c,o?[0,-n]:[-Sa,n-Sa])}function De(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Pe(n,t,e,r){function u(r,u){return oa(r[0]-n)<Aa?u>0?0:3:oa(r[0]-e)<Aa?u>0?2:1:oa(r[1]-t)<Aa?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&Z(s,i,n)>0&&++t:i[1]<=r&&Z(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ce(),C=De(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Xo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&we(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function Ue(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function je(n){var t=0,e=Sa/3,r=nr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Sa/180,e=n[1]*Sa/180):[180*(t/Sa),180*(e/Sa)]},u}function He(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,X((i-(n*n+e*e)*u*u)/(2*u))]},e}function Fe(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function Oe(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),Tc>t&&(Tc=t),t>zc&&(zc=t)}function Ye(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ie(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ie(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ie(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Ze(n,t){dc+=n,mc+=t,++yc}function Ve(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,Ze(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,Ze(t=r,e=u)}}function Xe(){Pc.point=Ze}function $e(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,Ze(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,Ze(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function Be(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,ka)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:g};return a}function We(n){function t(n){return(a?r:e)(n)}function e(t){return Ke(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=se([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=oa(oa(w)-1)<Aa||oa(r-h)<Aa?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],L=C-t,T=N-e,q=x*L-y*T;(q*q/M>i||oa((y*L+x*T)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Na),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Je(n){var t=We(function(t,e){return n([t*La,e*La])});return function(n){return tr(t(n))}}function Ge(n){this.stream=n}function Ke(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Qe(n){return nr(function(){return n})()}function nr(n){function t(n){return n=a(n[0]*Na,n[1]*Na),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*La,n[1]*La]}function r(){a=Ue(o=ur(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=We(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=bt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=tr(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):Re((b=+n)*Na),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Pe(n[0][0],n[0][1],n[1][0],n[1][1]):bt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Na,d=n[1]%360*Na,r()):[v*La,d*La]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Na,y=n[1]%360*Na,x=n.length>2?n[2]%360*Na:0,r()):[m*La,y*La,x*La]},Xo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function tr(n){return Ke(n,function(t,e){n.point(t*Na,e*Na)})}function er(n,t){return[n,t]}function rr(n,t){return[n>Sa?n-ka:-Sa>n?n+ka:n,t]}function ur(n,t,e){return n?t||e?Ue(or(n),ar(t,e)):or(n):t||e?ar(t,e):rr}function ir(n){return function(t,e){return t+=n,[t>Sa?t-ka:-Sa>t?t+ka:t,e]}}function or(n){var t=ir(n);return t.invert=ir(-n),t}function ar(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),X(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),X(l*r-a*u)]},e}function cr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=sr(e,u),i=sr(e,i),(o>0?i>u:u>i)&&(u+=o*ka)):(u=n+o*ka,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=ve([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function sr(n,t){var e=se(t);e[0]-=n,pe(e);var r=V(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Aa)%(2*Math.PI)}function lr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function fr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function hr(n){return n.source}function gr(n){return n.target}function pr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(J(r-t)+u*o*J(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*La,Math.atan2(o,Math.sqrt(r*r+u*u))*La]}:function(){return[n*La,t*La]};return p.distance=h,p}function vr(){function n(n,u){var i=Math.sin(u*=Na),o=Math.cos(u),a=oa((n*=Na)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*Na,e=Math.sin(i*=Na),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=g}}function dr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function mr(n,t){function e(n,t){var e=oa(oa(t)-Ea)<Aa?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(Sa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=I(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ea]},e):xr}function yr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return oa(u)<Aa?er:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-I(u)*Math.sqrt(n*n+e*e)]},e)}function xr(n,t){return[n,Math.log(Math.tan(Sa/4+t/2))]}function Mr(n){var t,e=Qe(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=Sa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function _r(n,t){return[Math.log(Math.tan(Sa/4+t/2)),-n]}function br(n){return n[0]}function wr(n){return n[1]}function Sr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Z(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function kr(n,t){return n[0]-t[0]||n[1]-t[1]}function Er(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Ar(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Cr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Nr(){Jr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Jc.pop()||new Nr;return t.site=n,t}function Tr(n){Or(n),$c.remove(n),Jc.push(n),Jr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Tr(n);for(var c=i;c.circle&&oa(e-c.circle.x)<Aa&&oa(r-c.circle.cy)<Aa;)i=c.P,a.unshift(c),Tr(c),c=i;a.unshift(c),Or(c);for(var s=o;s.circle&&oa(e-s.circle.x)<Aa&&oa(r-s.circle.cy)<Aa;)o=s.N,a.push(s),Tr(s),s=o;a.push(s),Or(s);var l,f=a.length;for(l=1;f>l;++l)s=a[l],c=a[l-1],$r(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Vr(c.site,s.site,null,u),Fr(c),Fr(s)}function zr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=Rr(a,o)-i,r>Aa)a=a.L;else{if(u=i-Dr(a,o),!(u>Aa)){r>-Aa?(t=a.P,e=a):u>-Aa?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if($c.insert(t,c),t||e){if(t===e)return Or(t),e=Lr(t.site),$c.insert(c,e),c.edge=e.edge=Vr(t.site,c.site),Fr(t),Fr(e),void 0;if(!e)return c.edge=Vr(t.site,c.site),void 0;Or(t),Or(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};$r(e.edge,s,p,M),c.edge=Vr(s,n,null,M),e.edge=Vr(n,p,null,M),Fr(t),Fr(e)}}function Rr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Dr(n,t){var e=n.N;if(e)return Rr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Pr(n){this.site=n,this.edges=[]}function Ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(oa(r-t)>Aa||oa(u-e)>Aa)&&(a.splice(o,0,new Br(Xr(i.site,l,oa(r-f)<Aa&&p-u>Aa?{x:f,y:oa(t-f)<Aa?e:p}:oa(u-p)<Aa&&h-r>Aa?{x:oa(e-p)<Aa?t:h,y:p}:oa(r-h)<Aa&&u-g>Aa?{x:h,y:oa(t-h)<Aa?e:g}:oa(u-g)<Aa&&r-f>Aa?{x:oa(e-g)<Aa?t:f,y:g}:null),i.site,null)),++c)}function jr(n,t){return t.angle-n.angle}function Hr(){Jr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Fr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h>=-Ca)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new Hr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Wc.insert(y,m),y||(Bc=m)}}}}function Or(n){var t=n.circle;t&&(t.P||(Bc=t.N),Wc.remove(t),Gc.push(t),Jr(t),n.circle=null)}function Yr(n){for(var t,e=Vc,r=De(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Ir(t,n)||!r(t)||oa(t.a.x-t.b.x)<Aa&&oa(t.a.y-t.b.y)<Aa)&&(t.a=t.b=null,e.splice(u,1))}function Ir(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y<c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y<c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Zr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Vr(n,t,e,r){var u=new Zr(n,t);return Vc.push(u),e&&$r(u,n,t,e),r&&$r(u,t,n,r),Xc[n.i].edges.push(new Br(u,n,t)),Xc[t.i].edges.push(new Br(u,t,n)),u}function Xr(n,t,e){var r=new Zr(n,null);return r.a=t,r.b=e,Vc.push(r),r}function $r(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Br(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function Wr(){this._=null}function Jr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function Gr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function Kr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function Qr(n){for(;n.L;)n=n.L;return n}function nu(n,t){var e,r,u,i=n.sort(tu).pop();for(Vc=[],Xc=new Array(n.length),$c=new Wr,Wc=new Wr;;)if(u=Bc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Xc[i.i]=new Pr(i),zr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;qr(u.arc)}t&&(Yr(t),Ur(t));var o={cells:Xc,edges:Vc};return $c=Wc=Vc=Xc=null,o}function tu(n,t){return t.y-n.y||t.x-n.x}function eu(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function ru(n){return n.x}function uu(n){return n.y}function iu(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function ou(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&ou(n,c[0],e,r,o,a),c[1]&&ou(n,c[1],o,r,u,a),c[2]&&ou(n,c[2],e,a,o,i),c[3]&&ou(n,c[3],o,a,u,i)}}function au(n,t){n=Xo.rgb(n),t=Xo.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+vt(Math.round(e+i*n))+vt(Math.round(r+o*n))+vt(Math.round(u+a*n))}}function cu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=fu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function su(n,t){return t-=n=+n,function(e){return n+t*e}}function lu(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+="",t+="",Qc.lastIndex=0,r=0;e=Qc.exec(t);++r)e.index&&s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=Qc.lastIndex;for(a<t.length&&s.push(t.substring(a)),r=0,i=l.length;(e=Qc.exec(n))&&i>r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=su(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function fu(n,t){for(var e,r=Xo.interpolators.length;--r>=0&&!(e=Xo.interpolators[r](n,t)););return e}function hu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(fu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function gu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function pu(n){return function(t){return 1-n(1-t)}}function vu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function du(n){return n*n}function mu(n){return n*n*n}function yu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function xu(n){return function(t){return Math.pow(t,n)}}function Mu(n){return 1-Math.cos(n*Ea)}function _u(n){return Math.pow(2,10*(n-1))}function bu(n){return 1-Math.sqrt(1-n*n)}function wu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/ka*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*ka/t)}}function Su(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function ku(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Eu(n,t){n=Xo.hcl(n),t=Xo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return rt(e+i*n,r+o*n,u+a*n)+""}}function Au(n,t){n=Xo.hsl(n),t=Xo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return nt(e+i*n,r+o*n,u+a*n)+""}}function Cu(n,t){n=Xo.lab(n),t=Xo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=Tu(t,e),i=qu(zu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*La,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*La:0}function Tu(n,t){return n[0]*t[0]+n[1]*t[1]}function qu(n){var t=Math.sqrt(Tu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function zu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ru(n,t){var e,r=[],u=[],i=Xo.transform(n),o=Xo.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:su(a[0],c[0])},{i:3,x:su(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),s!=l?(s-l>180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:su(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:su(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:su(g[0],p[0])},{i:e-2,x:su(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Du(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Pu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Uu(n){for(var t=n.source,e=n.target,r=Hu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function ju(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Hu(n,t){if(n===t)return n;for(var e=ju(n),r=ju(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Fu(n){n.fixed|=2}function Ou(n){n.fixed&=-7}function Yu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Iu(n){n.fixed&=-5}function Zu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Zu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Vu(n,t){return Xo.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=Wu,n}function Xu(n){return n.children}function $u(n){return n.value}function Bu(n,t){return t.value-n.value}function Wu(n){return Xo.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function Ju(n){return n.x}function Gu(n){return n.y}function Ku(n,t,e){n.y0=t,n.y=e}function Qu(n){return Xo.range(n.length)}function ni(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function ti(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ei(n){return n.reduce(ri,0)}function ri(n,t){return n+t[1]}function ui(n,t){return ii(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ii(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function oi(n){return[Xo.min(n),Xo.max(n)]}function ai(n,t){return n.parent==t.parent?1:2}function ci(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function si(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function li(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=li(e[i],t),n)>0&&(n=r);return n}function fi(n,t){return n.x-t.x}function hi(n,t){return t.x-n.x}function gi(n,t){return n.depth-t.depth}function pi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function vi(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function di(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function mi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function yi(n,t){return n.value-t.value}function xi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Mi(n,t){n._pack_next=t,t._pack_prev=n}function _i(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function bi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(wi),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ei(r,u,i),t(i),xi(r,i),r._pack_prev=i,xi(i,u),u=r._pack_next,o=3;s>o;o++){Ei(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(_i(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!_i(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Mi(r,u=a):Mi(r=c,u),o--):(xi(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Si)}}function wi(n){n._pack_next=n._pack_prev=n}function Si(n){delete n._pack_next,delete n._pack_prev}function ki(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)ki(u[i],t,e,r)}function Ei(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function Ai(n){return 1+Xo.max(n,function(n){return n.y})}function Ci(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ni(n){var t=n.children;return t&&t.length?Ni(t[0]):n}function Li(n){var t,e=n.children;return e&&(t=e.length)?Li(e[t-1]):n}function Ti(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function qi(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function zi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ri(n){return n.rangeExtent?n.rangeExtent():zi(n.range())}function Di(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Pi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ls}function ji(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=Xo.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Hi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?ji:Di,c=r?Pu:Du;return o=u(n,t,c,e),a=u(t,n,c,fu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Nu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Ii(n,t)},i.tickFormat=function(t,e){return Zi(n,t,e)},i.nice=function(t){return Oi(n,t),u()},i.copy=function(){return Hi(n,t,e,r)},u()}function Fi(n,t){return Xo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Oi(n,t){return Pi(n,Ui(Yi(n,t)[2]))}function Yi(n,t){null==t&&(t=10);var e=zi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Ii(n,t){return Xo.range.apply(Xo,Yi(n,t))}function Zi(n,t,e){var r=Yi(n,t);return Xo.format(e?e.replace(Qa,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+Xi(l,r),l].join("")}):",."+Vi(r[2])+"f")}function Vi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Xi(n,t){var e=Vi(t[2]);return n in fs?Math.abs(e-Vi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function $i(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Pi(r.map(u),e?Math:gs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=zi(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++<l;)for(var h=f-1;h>0;h--)o.push(i(s)*h);for(s=0;o[s]<a;s++);for(l=o.length;o[l-1]>c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hs;arguments.length<2?t=hs:"function"!=typeof t&&(t=Xo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return $i(n.copy(),t,e,r)},Fi(o,n)}function Bi(n,t,e){function r(t){return n(u(t))}var u=Wi(t),i=Wi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Ii(e,n)},r.tickFormat=function(n,t){return Zi(e,n,t)},r.nice=function(n){return r.domain(Oi(e,n))},r.exponent=function(o){return arguments.length?(u=Wi(t=o),i=Wi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Bi(n.copy(),t,e)},Fi(r,n)}function Wi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Ji(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return Xo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:"range",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+s)/2:c+l*i/2,l),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-i+2*c);return o=r(l+h*c,h),s&&o.reverse(),a=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-i+2*c)),g=f-l-(n.length-i)*h;return o=r(l+Math.round(g/2),h),s&&o.reverse(),a=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return zi(t.a[0])},e.copy=function(){return Ji(n,t)},e.domain(n)}function Gi(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=Xo.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[Xo.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(Xo.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return Gi(n,t)},e()}function Ki(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ki(n,t,e)},u()}function Qi(n,t){function e(e){return e>=e?t[Xo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Qi(n,t)},e}function no(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Ii(n,t)},t.tickFormat=function(t,e){return Zi(n,t,e)},t.copy=function(){return no(n)},t}function to(n){return n.innerRadius}function eo(n){return n.outerRadius}function ro(n){return n.startAngle}function uo(n){return n.endAngle}function io(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=_t(e),p=_t(r);++f<h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&&(o(),l=[]);return l.length&&o(),s.length?s.join(""):null}var e=br,r=wr,u=be,i=oo,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=Ms.get(n)||oo).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function oo(n){return n.join("L")}function ao(n){return oo(n)+"Z"}function co(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function so(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function lo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function fo(n,t){return n.length<4?oo(n):n[1]+po(n.slice(1,n.length-1),vo(n,t))}function ho(n,t){return n.length<3?oo(n):n[0]+po((n.push(n[0]),n),vo([n[n.length-2]].concat(n,[n[1]]),t))}function go(n,t){return n.length<3?oo(n):n[0]+po(n,vo(n,t))}function po(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return oo(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s<t.length;s++,c++)i=n[c],a=t[s],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var l=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+l[0]+","+l[1]}return r}function vo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function mo(n){if(n.length<3)return oo(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",_o(ws,o),",",_o(ws,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),bo(c,o,a);return n.pop(),c.push("L",r),c.join("")}function yo(n){if(n.length<4)return oo(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(_o(ws,i)+","+_o(ws,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),bo(e,i,o);return e.join("")}function xo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[_o(ws,o),",",_o(ws,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),bo(t,o,a);return t.join("")}function Mo(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s<=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return mo(n)}function _o(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function bo(n,t,e){n.push("C",_o(_s,t),",",_o(_s,e),",",_o(bs,t),",",_o(bs,e),",",_o(ws,t),",",_o(ws,e))}function wo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function So(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=wo(u,i);++t<e;)r[t]=(o+(o=wo(u=i,i=n[t+1])))/2;return r[t]=o,r}function ko(n){for(var t,e,r,u,i=[],o=So(n),a=-1,c=n.length-1;++a<c;)t=wo(n[a],n[a+1]),oa(t)<Aa?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Eo(n){return n.length<3?oo(n):n[0]+po(n,ko(n))}function Ao(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+ys,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Co(n){function t(t){function c(){v.push("M",a(n(m),f),l,s(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=_t(e),_=_t(u),b=e===r?function(){return g}:_t(r),w=u===i?function(){return p}:_t(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=br,r=br,u=0,i=wr,o=be,a=oo,c=a.key,s=a,l="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=Ms.get(n)||oo).key,s=a.reverse||a,l=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function No(n){return n.radius}function Lo(n){return[n.x,n.y]}function To(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ys;return[e*Math.cos(r),e*Math.sin(r)]}}function qo(){return 64}function zo(){return"circle"}function Ro(n){var t=Math.sqrt(n/Sa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Do(n,t){return fa(n,Ns),n.id=t,n}function Po(n,t,e,r){var u=n.id;return R(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function Uo(n){return null==n&&(n=""),function(){this.textContent=n}}function jo(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,Xo.timer(function(r){function u(r){return i.active>e?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Xo.timer(function(){return p.c=c(r||1)?be:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ja,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function Ho(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Fo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Xo.bisect(js,u);return i==js.length?[t.year,Yi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/js[i-1]<js[i]/u?i-1:i]:[Os,Yi(n,e)[2]]}return r.invert=function(t){return Io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Io(+e+1),t).length}var i=r.domain(),o=zi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Pi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=zi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},Fi(r,n)}function Io(n){return new Date(n)}function Zo(n){return JSON.parse(n.responseText)}function Vo(n){var t=Wo.createRange();return t.selectNode(Wo.body),t.createContextualFragment(n.responseText)}var Xo={version:"3.4.3"};Date.now||(Date.now=function(){return+new Date});var $o=[].slice,Bo=function(n){return $o.call(n)},Wo=document,Jo=Wo.documentElement,Go=window;try{Bo(Jo.childNodes)[0].nodeType}catch(Ko){Bo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Wo.createElement("div").style.setProperty("opacity",0,"")}catch(Qo){var na=Go.Element.prototype,ta=na.setAttribute,ea=na.setAttributeNS,ra=Go.CSSStyleDeclaration.prototype,ua=ra.setProperty;na.setAttribute=function(n,t){ta.call(this,n,t+"")},na.setAttributeNS=function(n,t,e){ea.call(this,n,t,e+"")},ra.setProperty=function(n,t,e){ua.call(this,n,t+"",e)}}Xo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},Xo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Xo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},Xo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},Xo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},Xo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},Xo.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},Xo.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},Xo.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?Xo.quantile(t.sort(Xo.ascending),.5):void 0},Xo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var ia=Xo.bisector(function(n){return n});Xo.bisectLeft=ia.left,Xo.bisect=Xo.bisectRight=ia.right,Xo.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},Xo.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},Xo.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Xo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=Xo.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},Xo.transpose=function(n){return Xo.zip.apply(Xo,n)},Xo.keys=function(n){var t=[];for(var e in n)t.push(e);return t},Xo.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},Xo.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},Xo.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var oa=Math.abs;Xo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(oa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},Xo.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:i,get:function(n){return this[aa+n]},set:function(n,t){return this[aa+n]=t},remove:o,keys:a,values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1),this[t])}});var aa="\x00",ca=aa.charCodeAt(0);Xo.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g<p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e>=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(Xo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},Xo.set=function(n){var t=new l;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(l,{has:i,add:function(n){return this[aa+n]=!0,n},remove:function(n){return n=aa+n,n in this&&delete this[n]},values:a,size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1))}}),Xo.behavior={},Xo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=f(n,t,t[e]);return n};var sa=["webkit","ms","moz","Moz","o","O"];Xo.dispatch=function(){for(var n=new p,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=v(n);return n},p.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Xo.event=null,Xo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,fa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ha=function(n,t){return t.querySelector(n)},ga=function(n,t){return t.querySelectorAll(n)},pa=Jo[h(Jo,"matchesSelector")],va=function(n,t){return pa.call(n,t)};"function"==typeof Sizzle&&(ha=function(n,t){return Sizzle(n,t)[0]||null},ga=Sizzle,va=Sizzle.matchesSelector),Xo.selection=function(){return xa};var da=Xo.selection.prototype=[];da.select=function(n){var t,e,r,u,i=[];n=M(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c<s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return x(i)},da.selectAll=function(n){var t,e,r=[];n=_(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Bo(n.call(e,e.__data__,a,u))),t.parentNode=e);return x(r)};var ma={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Xo.ns={prefix:ma,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ma.hasOwnProperty(e)?{space:ma[e],local:n}:n}},da.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Xo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(b(t,n[t]));return this}return this.each(b(n,t))},da.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=k(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!S(n[u]).test(t))return!1;return!0}for(t in n)this.each(E(t,n[t]));return this}return this.each(E(n,t))},da.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return Go.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(C(n,t,e))},da.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(N(t,n[t]));return this}return this.each(N(n,t))},da.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},da.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},da.append=function(n){return n=L(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},da.insert=function(n,t){return n=L(n),t=M(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},da.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},da.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++r<a;)d=t.call(i=n[r],i.__data__,r),m.has(d)?v[r]=i:m.set(d,i),x.push(d);for(r=-1;++r<f;)d=t.call(e,o=e[r],r),(i=m.get(d))?(g[r]=i,i.__data__=o):y.has(d)||(p[r]=T(o)),y.set(d,o),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=T(o);for(;f>r;++r)p[r]=T(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=D([]),s=x([]),l=x([]);if("function"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return s.enter=function(){return c},s.exit=function(){return l},s},da.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},da.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=q(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return x(u)},da.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},da.sort=function(n){n=z.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},da.each=function(n){return R(this,function(t,e,r){n.call(t,t.__data__,e,r)})},da.call=function(n){var t=Bo(arguments);return n.apply(t[0]=this,t),this},da.empty=function(){return!this.node()},da.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},da.size=function(){var n=0;return this.each(function(){++n}),n};var ya=[];Xo.selection.enter=D,Xo.selection.enter.prototype=ya,ya.append=da.append,ya.empty=da.empty,ya.node=da.node,ya.call=da.call,ya.size=da.size,ya.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s<l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return x(o)},ya.insert=function(n,t){return arguments.length<2&&(t=P(this)),da.insert.call(this,n,t)},da.transition=function(){for(var n,t,e=ks||++Ls,r=[],u=Es||{time:Date.now(),ease:yu,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c<s;)(t=a[c])&&jo(t,c,e,u),n.push(t)}return Do(r,e)},da.interrupt=function(){return this.each(U)},Xo.select=function(n){var t=["string"==typeof n?ha(n,Wo):n];return t.parentNode=Jo,x([t])},Xo.selectAll=function(n){var t=Bo("string"==typeof n?ga(n,Wo):n);return t.parentNode=Jo,x([t])};var xa=Xo.select(Jo);da.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(j(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(j(n,t,e))};var Ma=Xo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ma.forEach(function(n){"on"+n in Wo&&Ma.remove(n)});var _a="onselectstart"in Wo?null:h(Jo.style,"userSelect"),ba=0;Xo.mouse=function(n){return Y(n,m())};var wa=/WebKit/.test(Go.navigator.userAgent)?-1:0;Xo.touches=function(n,t){return arguments.length<2&&(t=m().touches),t?Bo(t).map(function(t){var e=Y(n,t);return e.identifier=t.identifier,e}):[]},Xo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return Xo.event.changedTouches[0].identifier}function e(n,t){return Xo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&Xo.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=Xo.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=Xo.select(Go).on(e+"."+p,o).on(r+"."+p,a),y=O();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=y(n,"drag","dragstart","dragend"),i=null,o=r(g,Xo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},Xo.rebind(n,u,"on")};var Sa=Math.PI,ka=2*Sa,Ea=Sa/2,Aa=1e-6,Ca=Aa*Aa,Na=Sa/180,La=180/Sa,Ta=Math.SQRT2,qa=2,za=4;Xo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=B(v),o=i/(qa*h)*(e*W(Ta*t+v)-$(v));return[r+o*s,u+o*l,i*e/B(Ta*t+v)]}return[r+n*s,u+n*l,i*Math.exp(Ta*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+za*f)/(2*i*qa*h),p=(c*c-i*i-za*f)/(2*c*qa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ta;return e.duration=1e3*y,e},Xo.behavior.zoom=function(){function n(n){n.on(A,s).on(Pa+".zoom",f).on(C,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Xo.mouse(r),g),a(i)}function e(){f.on(C,Go===r?h:null).on(N,null),p(l&&Xo.event.target===s),c(i)}var r=this,i=T.of(r,arguments),s=Xo.event.target,l=0,f=Xo.select(Go).on(C,n).on(N,e),g=t(Xo.mouse(r)),p=O();U.call(r),o(i)}function l(){function n(){var n=Xo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Xo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),d(),a(p)}x=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function i(){for(var n,t,e,i,o=Xo.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}x=null,u(n,t),a(p)}function f(){if(Xo.event.touches.length){for(var t=Xo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(p)}var h,g=this,p=T.of(g,arguments),v={},m=0,y=Xo.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=Xo.select(Go).on(M,i).on(_,f),w=Xo.select(g).on(A,null).on(L,e),k=O();U.call(g),e(),o(p)}function f(){var n=T.of(this,arguments);m?clearTimeout(m):(U.call(this),o(n)),m=setTimeout(function(){m=null,c(n)},50),d();var e=v||Xo.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*Ra())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=T.of(this,arguments),e=Xo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Xo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,m,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Da,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",T=y(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=T.of(this,arguments),t=S;ks?Xo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Xo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Da:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Xo.rebind(n,T,"on")};var Ra,Da=[0,1/0],Pa="onwheel"in Wo?(Ra=function(){return-Xo.event.deltaY*(Xo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Wo?(Ra=function(){return Xo.event.wheelDelta},"mousewheel"):(Ra=function(){return-Xo.event.detail},"MozMousePixelScroll");G.prototype.toString=function(){return this.rgb()+""},Xo.hsl=function(n,t,e){return 1===arguments.length?n instanceof Q?K(n.h,n.s,n.l):dt(""+n,mt,K):K(+n,+t,+e)};var Ua=Q.prototype=new G;Ua.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,this.l/n)},Ua.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,n*this.l)},Ua.rgb=function(){return nt(this.h,this.s,this.l)},Xo.hcl=function(n,t,e){return 1===arguments.length?n instanceof et?tt(n.h,n.c,n.l):n instanceof it?at(n.l,n.a,n.b):at((n=yt((n=Xo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):tt(+n,+t,+e)};var ja=et.prototype=new G;ja.brighter=function(n){return tt(this.h,this.c,Math.min(100,this.l+Ha*(arguments.length?n:1)))},ja.darker=function(n){return tt(this.h,this.c,Math.max(0,this.l-Ha*(arguments.length?n:1)))},ja.rgb=function(){return rt(this.h,this.c,this.l).rgb()},Xo.lab=function(n,t,e){return 1===arguments.length?n instanceof it?ut(n.l,n.a,n.b):n instanceof et?rt(n.l,n.c,n.h):yt((n=Xo.rgb(n)).r,n.g,n.b):ut(+n,+t,+e)};var Ha=18,Fa=.95047,Oa=1,Ya=1.08883,Ia=it.prototype=new G;Ia.brighter=function(n){return ut(Math.min(100,this.l+Ha*(arguments.length?n:1)),this.a,this.b)},Ia.darker=function(n){return ut(Math.max(0,this.l-Ha*(arguments.length?n:1)),this.a,this.b)},Ia.rgb=function(){return ot(this.l,this.a,this.b)},Xo.rgb=function(n,t,e){return 1===arguments.length?n instanceof pt?gt(n.r,n.g,n.b):dt(""+n,gt,nt):gt(~~n,~~t,~~e)};var Za=pt.prototype=new G;Za.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),gt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):gt(u,u,u)},Za.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),gt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Za.hsl=function(){return mt(this.r,this.g,this.b)},Za.toString=function(){return"#"+vt(this.r)+vt(this.g)+vt(this.b)};var Va=Xo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Va.forEach(function(n,t){Va.set(n,ft(t))}),Xo.functor=_t,Xo.xhr=wt(bt),Xo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=St(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++<s;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++l):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;s>l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new l,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Xo.csv=Xo.dsv(",","text/csv"),Xo.tsv=Xo.dsv("	","text/tab-separated-values");var Xa,$a,Ba,Wa,Ja,Ga=Go[h(Go,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Xo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};$a?$a.n=i:Xa=i,$a=i,Ba||(Wa=clearTimeout(Wa),Ba=1,Ga(Et))},Xo.timer.flush=function(){At(),Ct()},Xo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Lt);Xo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Xo.round(n,Nt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Ka[8+e/3]};var Qa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,nc=Xo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Xo.round(n,Nt(n,t))).toFixed(Math.max(0,Math.min(20,Nt(n*(1+1e-15),t))))}}),tc=Xo.time={},ec=Date;zt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){rc.setUTCDate.apply(this._,arguments)},setDay:function(){rc.setUTCDay.apply(this._,arguments)},setFullYear:function(){rc.setUTCFullYear.apply(this._,arguments)},setHours:function(){rc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){rc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){rc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){rc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){rc.setUTCSeconds.apply(this._,arguments)},setTime:function(){rc.setTime.apply(this._,arguments)}};var rc=Date.prototype;tc.year=Rt(function(n){return n=tc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),tc.years=tc.year.range,tc.years.utc=tc.year.utc.range,tc.day=Rt(function(n){var t=new ec(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),tc.days=tc.day.range,tc.days.utc=tc.day.utc.range,tc.dayOfYear=function(n){var t=tc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=tc[n]=Rt(function(n){return(n=tc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});tc[n+"s"]=e.range,tc[n+"s"].utc=e.utc.range,tc[n+"OfYear"]=function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)}}),tc.week=tc.sunday,tc.weeks=tc.sunday.range,tc.weeks.utc=tc.sunday.utc.range,tc.weekOfYear=tc.sundayOfYear;var uc={"-":"",_:" ",0:"0"},ic=/^\s*\d+/,oc=/^%/;Xo.locale=function(n){return{numberFormat:Tt(n),timeFormat:Pt(n)}};var ac=Xo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Xo.format=ac.numberFormat,Xo.geo={},re.prototype={s:0,t:0,add:function(n){ue(n,this.t,cc),ue(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new re;Xo.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):ie(n,t)};var sc={Feature:function(n,t){ie(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)ie(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){oe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)oe(e[r],t,0)},Polygon:function(n,t){ae(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)ae(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)ie(e[r],t)}};Xo.geo.area=function(n){return fc=0,Xo.geo.stream(n,gc),fc};var fc,hc=new re,gc={sphere:function(){fc+=4*Sa},point:g,lineStart:g,lineEnd:g,polygonStart:function(){hc.reset(),gc.lineStart=ce},polygonEnd:function(){var n=2*hc;fc+=0>n?4*Sa+n:n,gc.lineStart=gc.lineEnd=gc.point=g}};Xo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=se([t*Na,e*Na]);if(m){var u=fe(m,r),i=[u[1],-u[0],0],o=fe(i,u);pe(o),o=ve(o);var c=t-p,s=c>0?1:-1,v=o[0]*La*s,d=oa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*La;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*La;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=oa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),oa(y)>Aa&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,gc.polygonStart()},polygonEnd:function(){gc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>hc?(l=-(h=180),f=-(g=90)):y>Aa?g=90:-Aa>y&&(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],Xo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Xo.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Ca>u&&(t=xc,e=Mc,r=_c,Aa>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Ca>u)?[0/0,0/0]:[Math.atan2(e,t)*La,X(r/Math.sqrt(u))*La]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:g,point:me,lineStart:xe,lineEnd:Me,polygonStart:function(){kc.lineStart=_e},polygonEnd:function(){kc.lineStart=xe}},Ec=Ee(be,Te,ze,[-Sa,-Sa/2]),Ac=1e9;Xo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Pe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Xo.geo.conicEqualArea=function(){return je(He)}).raw=He,Xo.geo.albers=function(){return Xo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Xo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Xo.geo.albers(),o=Xo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Xo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Aa,f+.12*s+Aa],[l-.214*s-Aa,f+.234*s-Aa]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Aa,f+.166*s+Aa],[l-.115*s-Aa,f+.234*s-Aa]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,Tc,qc,zc,Rc={point:g,lineStart:g,lineEnd:g,polygonStart:function(){Nc=0,Rc.lineStart=Fe},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=g,Cc+=oa(Nc/2)}},Dc={point:Oe,lineStart:g,lineEnd:g,polygonStart:g,polygonEnd:g},Pc={point:Ze,lineStart:Ve,lineEnd:Xe,polygonStart:function(){Pc.lineStart=$e},polygonEnd:function(){Pc.point=Ze,Pc.lineStart=Ve,Pc.lineEnd=Xe}};Xo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Xo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,Xo.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=zc=-(Lc=Tc=1/0),Xo.geo.stream(n,u(Dc)),[[Lc,Tc],[qc,zc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Je(n):bt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ye:new Be(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Xo.geo.albersUsa()).context(null)},Xo.geo.transform=function(n){return{stream:function(t){var e=new Ge(t);for(var r in n)e[r]=n[r];return e}}},Ge.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Xo.geo.projection=Qe,Xo.geo.projectionMutator=nr,(Xo.geo.equirectangular=function(){return Qe(er)}).raw=er.invert=er,Xo.geo.rotation=function(n){function t(t){return t=n(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t}return n=ur(n[0]%360*Na,n[1]*Na,n.length>2?n[2]*Na:0),t.invert=function(t){return t=n.invert(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t},t},rr.invert=er,Xo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=ur(-n[0]*Na,-n[1]*Na,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=La,n[1]*=La}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=cr((t=+r)*Na,u*Na),n):t},n.precision=function(r){return arguments.length?(e=cr(t*Na,(u=+r)*Na),n):u},n.angle(90)},Xo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Na,u=n[1]*Na,i=t[1]*Na,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Xo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Xo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Xo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Xo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return oa(n%d)>Aa}).map(l)).concat(Xo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return oa(n%m)>Aa}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=lr(a,o,90),f=fr(r,e,y),h=lr(s,c,90),g=fr(i,u,y),n):y},n.majorExtent([[-180,-90+Aa],[180,90-Aa]]).minorExtent([[-180,-80-Aa],[180,80+Aa]])},Xo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=hr,u=gr;return n.distance=function(){return Xo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Xo.geo.interpolate=function(n,t){return pr(n[0]*Na,n[1]*Na,t[0]*Na,t[1]*Na)},Xo.geo.length=function(n){return Uc=0,Xo.geo.stream(n,jc),Uc};var Uc,jc={sphere:g,point:g,lineStart:vr,lineEnd:g,polygonStart:g,polygonEnd:g},Hc=dr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Xo.geo.azimuthalEqualArea=function(){return Qe(Hc)}).raw=Hc;var Fc=dr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},bt);(Xo.geo.azimuthalEquidistant=function(){return Qe(Fc)}).raw=Fc,(Xo.geo.conicConformal=function(){return je(mr)}).raw=mr,(Xo.geo.conicEquidistant=function(){return je(yr)}).raw=yr;var Oc=dr(function(n){return 1/n},Math.atan);(Xo.geo.gnomonic=function(){return Qe(Oc)}).raw=Oc,xr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ea]},(Xo.geo.mercator=function(){return Mr(xr)}).raw=xr;var Yc=dr(function(){return 1},Math.asin);(Xo.geo.orthographic=function(){return Qe(Yc)}).raw=Yc;var Ic=dr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Xo.geo.stereographic=function(){return Qe(Ic)}).raw=Ic,_r.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ea]},(Xo.geo.transverseMercator=function(){var n=Mr(_r),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=_r,Xo.geom={},Xo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=_t(e),i=_t(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(kr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Sr(a),l=Sr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t<l.length-h;++t)g.push(n[a[l[t]][2]]);return g}var e=br,r=wr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},Xo.geom.polygon=function(n){return fa(n,Zc),n};var Zc=Xo.geom.polygon.prototype=[];Zc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Zc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Zc.clip=function(n){for(var t,e,r,u,i,o,a=Cr(n),c=-1,s=this.length-Cr(this),l=this[s-1];++c<s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Er(o,l,u)?(Er(i,l,u)||n.push(Ar(i,o,l,u)),n.push(o)):Er(i,l,u)&&n.push(Ar(i,o,l,u)),i=o;a&&n.push(n[0]),l=u}return n};var Vc,Xc,$c,Bc,Wc,Jc=[],Gc=[];Pr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(jr),t.length},Br.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},Wr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=Qr(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(Gr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Kr(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(Kr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Gr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?Qr(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,Gr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,Kr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,Gr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,Kr(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,Gr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,Kr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},Xo.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return nu(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x>=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Aa)*Aa,y:Math.round(o(n,t)/Aa)*Aa,i:t}})}var r=br,u=wr,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return nu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return nu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(jr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c<s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r<i.i&&r<f.i&&eu(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=_t(r=n),t):r},t.y=function(n){return arguments.length?(o=_t(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Kc:n,t):a===Kc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===Kc?null:a&&a[1]},t)};var Kc=[[-1e6,-1e6],[1e6,1e6]];Xo.geom.delaunay=function(n){return Xo.geom.voronoi().triangles(n)},Xo.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(oa(c-e)+oa(l-r)<.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e>=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=iu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=_t(a),M=_t(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.x<v&&(v=l.x),l.y<d&&(d=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=iu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){ou(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=br,c=wr;return(o=arguments.length)?(a=ru,c=uu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},Xo.interpolateRgb=au,Xo.interpolateObject=cu,Xo.interpolateNumber=su,Xo.interpolateString=lu;var Qc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Xo.interpolate=fu,Xo.interpolators=[function(n,t){var e=typeof t;return("string"===e?Va.has(t)||/^(#|rgb\(|hsl\()/.test(t)?au:lu:t instanceof G?au:"object"===e?Array.isArray(t)?hu:cu:su)(n,t)}],Xo.interpolateArray=hu;var ns=function(){return bt},ts=Xo.map({linear:ns,poly:xu,quad:function(){return du},cubic:function(){return mu},sin:function(){return Mu},exp:function(){return _u},circle:function(){return bu},elastic:wu,back:Su,bounce:function(){return ku}}),es=Xo.map({"in":bt,out:pu,"in-out":vu,"out-in":function(n){return vu(pu(n))}});Xo.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||bt,gu(r(e.apply(null,$o.call(arguments,1))))},Xo.interpolateHcl=Eu,Xo.interpolateHsl=Au,Xo.interpolateLab=Cu,Xo.interpolateRound=Nu,Xo.transform=function(n){var t=Wo.createElementNS(Xo.ns.prefix.svg,"g");return(Xo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:rs)})(n)},Lu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};Xo.interpolateTransform=Ru,Xo.layout={},Xo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Uu(n[e]));return t}},Xo.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=Xo.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(s=0,g=-1;++g<i;)s+=u[h][g];v.push(s),m.push(Xo.range(i)),n+=s}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(ka-l*i)/n,s=0,h=-1;++h<i;){for(f=s,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&&t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},Xo.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Xo.event.x,n.py=Xo.event.y,a.resume()}var e,r,u,i,o,a={},c=Xo.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=os,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Zu(t=Xo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Xo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a<s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,l=y.length,p=s[0],v=s[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Xo.behavior.drag().origin(bt).on("dragstart.force",Fu).on("drag.force",t).on("dragend.force",Ou)),arguments.length?(this.on("mouseover.force",Yu).on("mouseout.force",Iu).call(e),void 0):e},Xo.rebind(a,c,"on")};var us=20,is=1,os=1/0;Xo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f<s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&&h.sort(r),i&&(t.value=g)}else delete t.children,i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,s=r+1;++c<a;)o+=t(u[c],s);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=Bu,u=Xu,i=$u;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},Xo.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s<o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=Xo.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Vu(e,r)},Xo.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/Xo.sum(o),s=Xo.range(i.length);null!=e&&s.sort(e===as?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=as,r=0,u=ka;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var as={};Xo.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=Xo.permute(s,f),l=Xo.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m>g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=bt,e=Qu,r=ni,u=Ku,i=Ju,o=Gu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cs.get(t)||Qu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ss.get(t)||ni,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cs=Xo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ti),i=n.map(ei),o=Xo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Xo.range(n.length).reverse()},"default":Qu}),ss=Xo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ni});Xo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=s[i],a>=l[0]&&a<=l[1]&&(o=c[Xo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=oi,u=ui;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=_t(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return ii(n,t)}:_t(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Xo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h<i;)s=r[h],o(s,a),f=c(s,a,f),a=s;vi(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=si(a),i=ci(i),a&&i;)c=ci(c),o=si(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u>0&&(di(mi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!si(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!ci(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];pi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=li(l,hi),h=li(l,fi),g=li(l,gi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return pi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,pi(a,function(n){n.r=+l(n.value)}),pi(a,bi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;pi(a,function(n){n.r+=f}),pi(a,bi),pi(a,function(n){n.r-=f})}return ki(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Xo.layout.hierarchy().sort(yi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Vu(n,e)},Xo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;pi(c,function(n){var t=n.children;t&&t.length?(n.x=Ci(t),n.y=Ai(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ni(c),f=Li(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return pi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++i<o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l>e.dx)&&(l=e.dx);++i<o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=Xo.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ti,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ti(t):qi(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return qi(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ti:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Vu(i,a)},Xo.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Xo.random.normal.apply(Xo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Xo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Xo.scale={};var ls={floor:bt,ceil:bt};Xo.scale.linear=function(){return Hi([0,1],[0,1],fu,!1)};var fs={s:1,g:1,p:1,r:1,e:1};Xo.scale.log=function(){return $i(Xo.scale.linear().domain([0,1]),10,!0,[1,10])};var hs=Xo.format(".0e"),gs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Xo.scale.pow=function(){return Bi(Xo.scale.linear(),1,[0,1])},Xo.scale.sqrt=function(){return Xo.scale.pow().exponent(.5)},Xo.scale.ordinal=function(){return Ji([],{t:"range",a:[[]]})},Xo.scale.category10=function(){return Xo.scale.ordinal().range(ps)},Xo.scale.category20=function(){return Xo.scale.ordinal().range(vs)},Xo.scale.category20b=function(){return Xo.scale.ordinal().range(ds)},Xo.scale.category20c=function(){return Xo.scale.ordinal().range(ms)};var ps=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ht),vs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ht),ds=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ht),ms=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ht);Xo.scale.quantile=function(){return Gi([],[])},Xo.scale.quantize=function(){return Ki(0,1,[0,1])},Xo.scale.threshold=function(){return Qi([.5],[0,1])},Xo.scale.identity=function(){return no([0,1])},Xo.svg={},Xo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=xs?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=to,e=eo,r=ro,u=uo;return n.innerRadius=function(e){return arguments.length?(t=_t(e),n):t},n.outerRadius=function(t){return arguments.length?(e=_t(t),n):e},n.startAngle=function(t){return arguments.length?(r=_t(t),n):r},n.endAngle=function(t){return arguments.length?(u=_t(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ys;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ys=-Ea,xs=ka-Aa;Xo.svg.line=function(){return io(bt)};var Ms=Xo.map({linear:oo,"linear-closed":ao,step:co,"step-before":so,"step-after":lo,basis:mo,"basis-open":yo,"basis-closed":xo,bundle:Mo,cardinal:go,"cardinal-open":fo,"cardinal-closed":ho,monotone:Eo});Ms.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _s=[0,2/3,1/3,0],bs=[0,1/3,2/3,0],ws=[0,1/6,2/3,1/6];Xo.svg.line.radial=function(){var n=io(Ao);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},so.reverse=lo,lo.reverse=so,Xo.svg.area=function(){return Co(bt)},Xo.svg.area.radial=function(){var n=Co(Ao);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Xo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ys,l=s.call(n,u,r)+ys;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Sa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=hr,o=gr,a=No,c=ro,s=uo;return n.radius=function(t){return arguments.length?(a=_t(t),n):a},n.source=function(t){return arguments.length?(i=_t(t),n):i},n.target=function(t){return arguments.length?(o=_t(t),n):o},n.startAngle=function(t){return arguments.length?(c=_t(t),n):c},n.endAngle=function(t){return arguments.length?(s=_t(t),n):s},n},Xo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=hr,e=gr,r=Lo;return n.source=function(e){return arguments.length?(t=_t(e),n):t},n.target=function(t){return arguments.length?(e=_t(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Xo.svg.diagonal.radial=function(){var n=Xo.svg.diagonal(),t=Lo,e=n.projection;return n.projection=function(n){return arguments.length?e(To(t=n)):t},n},Xo.svg.symbol=function(){function n(n,r){return(Ss.get(t.call(this,n,r))||Ro)(e.call(this,n,r))}var t=zo,e=qo;return n.type=function(e){return arguments.length?(t=_t(e),n):t},n.size=function(t){return arguments.length?(e=_t(t),n):e},n};var Ss=Xo.map({circle:Ro,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cs)),e=t*Cs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Xo.svg.symbolTypes=Ss.keys();var ks,Es,As=Math.sqrt(3),Cs=Math.tan(30*Na),Ns=[],Ls=0;Ns.call=da.call,Ns.empty=da.empty,Ns.node=da.node,Ns.size=da.size,Xo.transition=function(n){return arguments.length?ks?n.transition():n:xa.transition()},Xo.transition.prototype=Ns,Ns.select=function(n){var t,e,r,u=this.id,i=[];n=M(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s<l;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),jo(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return Do(i,u)},Ns.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=_(n);for(var c=-1,s=this.length;++c<s;)for(var l=this[c],f=-1,h=l.length;++f<h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&jo(u,g,o,i),t.push(u)}return Do(a,o)},Ns.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=q(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Do(u,this.id)},Ns.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):R(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Ns.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ru:fu,a=Xo.ns.qualify(n);return Po(this,"attr."+n,t,a.local?i:u)},Ns.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Xo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Ns.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Go.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=fu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Po(this,"style."+n,t,u)},Ns.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Go.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Ns.text=function(n){return Po(this,"text",n,Uo)},Ns.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Ns.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Xo.ease.apply(Xo,arguments)),R(this,function(e){e.__transition__[t].ease=n}))},Ns.delay=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Ns.duration=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Ns.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Es,u=ks;ks=e,R(this,function(t,r,u){Es=t.__transition__[e],n.call(t,t.__data__,r,u)}),Es=r,ks=u}else R(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Xo.dispatch("start","end"))).on(n,t)});return this},Ns.transition=function(){for(var n,t,e,r,u=this.id,i=++Ls,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,jo(e,s,i,r)),n.push(e)}return Do(o,i)},Xo.svg.axis=function(){function n(n){n.each(function(){var n,s=Xo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):bt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Aa),d=Xo.transition(p.exit()).style("opacity",Aa).remove(),m=Xo.transition(p).style("opacity",1),y=Ri(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Xo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Ho,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ho,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Fo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Fo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Xo.scale.linear(),r=Ts,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in qs?t+"":Ts,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ts="bottom",qs={top:1,right:1,bottom:1,left:1};Xo.svg.brush=function(){function n(i){i.each(function(){var i=Xo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,bt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return zs[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Xo.transition(i),h=Xo.transition(o);c&&(l=Ri(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Ri(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Xo.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=f[1],C=2),d())}function p(){32==Xo.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=f[1],C=0,d())}function v(){var n=Xo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Xo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]<x[0])],L[1]=f[+(n[1]<x[1])]):x=null),E&&m(n,c,0)&&(e(S),u=!0),A&&m(n,s,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,a=Ri(t),c=a[0],s=a[1],p=L[e],v=e?f:l,d=v[1]-v[0];return C&&(c-=p,s-=d+p),r=(e?g:h)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=p)+d:(x&&(p=Math.max(c,Math.min(s,2*x[e]-r))),r>p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Xo.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Xo.select(Xo.event.target),w=a.of(_,arguments),S=Xo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=O(),L=Xo.mouse(_),T=Xo.select(Go).on("keydown.brush",u).on("keyup.brush",p);if(Xo.event.changedTouches?T.on("touchmove.brush",v).on("touchend.brush",y):T.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],f[1-z]-L[1]],L[0]=l[q],L[1]=f[z]}else Xo.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Xo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=y(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=Rs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,ks?Xo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=hu(l,t.x),r=hu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=Rs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Xo.rebind(n,a,"on")};var zs={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Ds=tc.format=ac.timeFormat,Ps=Ds.utc,Us=Ps("%Y-%m-%dT%H:%M:%S.%LZ");Ds.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:Us,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=Us.toString,tc.second=Rt(function(n){return new ec(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),tc.seconds=tc.second.range,tc.seconds.utc=tc.second.utc.range,tc.minute=Rt(function(n){return new ec(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),tc.minutes=tc.minute.range,tc.minutes.utc=tc.minute.utc.range,tc.hour=Rt(function(n){var t=n.getTimezoneOffset()/60;return new ec(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),tc.hours=tc.hour.range,tc.hours.utc=tc.hour.utc.range,tc.month=Rt(function(n){return n=tc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),tc.months=tc.month.range,tc.months.utc=tc.month.utc.range;var js=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hs=[[tc.second,1],[tc.second,5],[tc.second,15],[tc.second,30],[tc.minute,1],[tc.minute,5],[tc.minute,15],[tc.minute,30],[tc.hour,1],[tc.hour,3],[tc.hour,6],[tc.hour,12],[tc.day,1],[tc.day,2],[tc.week,1],[tc.month,1],[tc.month,3],[tc.year,1]],Fs=Ds.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",be]]),Os={range:function(n,t,e){return Xo.range(Math.ceil(n/e)*e,+t,e).map(Io)},floor:bt,ceil:bt};Hs.year=tc.year,tc.scale=function(){return Yo(Xo.scale.linear(),Hs,Fs)};var Ys=Hs.map(function(n){return[n[0].utc,n[1]]}),Is=Ps.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",be]]);Ys.year=tc.year.utc,tc.scale.utc=function(){return Yo(Xo.scale.linear(),Ys,Is)},Xo.text=wt(function(n){return n.responseText}),Xo.json=function(n,t){return St(n,"application/json",Zo,t)},Xo.html=function(n,t){return St(n,"text/html",Vo,t)},Xo.xml=wt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Xo):"object"==typeof module&&module.exports?module.exports=Xo:this.d3=Xo}();'use strict';(function(window){window.define=undefined;}).call(this,this);'use strict';tr.exportTo('tr.ui.b',function(){const DataSeriesEnableChangeEventType='data-series-enabled-change';const THIS_DOC=document._currentScript.ownerDocument;const svgNS='http://www.w3.org/2000/svg';const ColorScheme=tr.b.ColorScheme;function getColorOfKey(key,selected){let id=ColorScheme.getColorIdForGeneralPurposeString(key);if(selected){id+=ColorScheme.properties.brightenedOffsets[0];}
-return ColorScheme.colorsAsStrings[id];}
-function getSVGTextSize(parentNode,text,opt_callback,opt_this){const textNode=document.createElementNS('http://www.w3.org/2000/svg','text');textNode.setAttributeNS(null,'x',0);textNode.setAttributeNS(null,'y',0);textNode.setAttributeNS(null,'fill','black');textNode.appendChild(document.createTextNode(text));parentNode.appendChild(textNode);if(opt_callback){opt_callback.call(opt_this||parentNode,textNode);}
-const width=textNode.getComputedTextLength();const height=textNode.getBBox().height;parentNode.removeChild(textNode);return{width,height};}
-function DataSeries(key){this.key_=key;this.target_=undefined;this.title_='';this.optional_=false;this.enabled_=true;this.color_=getColorOfKey(key,false);this.highlightedColor_=getColorOfKey(key,true);}
-DataSeries.prototype={get key(){return this.key_;},get title(){return this.title_;},set title(t){this.title_=t;},get color(){return this.color_;},set color(c){this.color_=c;},get highlightedColor(){return this.highlightedColor_;},set highlightedColor(c){this.highlightedColor_=c;},get optional(){return this.optional_;},set optional(optional){this.optional_=optional;},get enabled(){return this.enabled_;},set enabled(enabled){if(!this.optional&&!enabled){this.optional=true;}
-this.enabled_=enabled;},get target(){return this.target_;},set target(t){this.target_=t;}};const ChartBase=tr.ui.b.define('svg',undefined,svgNS);ChartBase.prototype={__proto__:HTMLUnknownElement.prototype,getDataSeries(key){if(!this.seriesByKey_.has(key)){this.seriesByKey_.set(key,new DataSeries(key));}
-return this.seriesByKey_.get(key);},decorate(){Polymer.dom(this).classList.add('chart-base');this.setAttribute('style','cursor: default; user-select: none;');this.chartTitle_=undefined;this.seriesByKey_=new Map();this.graphWidth_=undefined;this.graphHeight_=undefined;this.margin={top:0,right:0,bottom:0,left:0,};this.hideLegend_=false;this.showTitleInLegend_=false;this.titleHeight_='16pt';const template=Polymer.dom(THIS_DOC).querySelector('#chart-base-template');const svgEl=Polymer.dom(template.content).querySelector('svg');for(let i=0;i<Polymer.dom(svgEl).children.length;i++){Polymer.dom(this).appendChild(Polymer.dom(svgEl.children[i]).cloneNode(true));}
-this.addEventListener(DataSeriesEnableChangeEventType,this.onDataSeriesEnableChange_.bind(this));},get hideLegend(){return this.hideLegend_;},set hideLegend(h){this.hideLegend_=h;this.updateContents_();},get showTitleInLegend(){return this.showTitleInLegend_;},set showTitleInLegend(s){this.showTitleInLegend_=s;this.updateContents_();},isSeriesEnabled(key){return this.getDataSeries(key).enabled;},onDataSeriesEnableChange_(event){this.getDataSeries(event.key).enabled=event.enabled;this.updateContents_();},get chartTitle(){return this.chartTitle_;},set chartTitle(chartTitle){this.chartTitle_=chartTitle;this.updateContents_();},get chartAreaElement(){return Polymer.dom(this).querySelector('#chart-area');},get graphWidth(){if(this.graphWidth_===undefined)return this.defaultGraphWidth;return this.graphWidth_;},set graphWidth(width){this.graphWidth_=width;this.updateContents_();},get defaultGraphWidth(){return 0;},get graphHeight(){if(this.graphHeight_===undefined)return this.defaultGraphHeight;return this.graphHeight_;},set graphHeight(height){this.graphHeight_=height;this.updateContents_();},get titleHeight(){return this.titleHeight_;},set titleHeight(height){this.titleHeight_=height;this.updateContents_();},get defaultGraphHeight(){return 0;},get totalWidth(){return this.margin.left+this.graphWidth+this.margin.right;},get totalHeight(){return this.margin.top+this.graphHeight+this.margin.bottom;},updateMargins_(){const legendSize=this.computeLegendSize_();this.margin.right=Math.max(this.margin.right,legendSize.width);this.margin.bottom=Math.max(this.margin.bottom,legendSize.height-this.graphHeight);if(this.chartTitle_){const titleSize=getSVGTextSize(this,this.chartTitle_,textNode=>{textNode.style.fontSize='16pt';});this.margin.top=Math.max(this.margin.top,titleSize.height+15);const horizontalOverhangPx=(titleSize.width-this.graphWidth)/2;this.margin.left=Math.max(this.margin.left,horizontalOverhangPx);this.margin.right=Math.max(this.margin.right,horizontalOverhangPx);}},computeLegendSize_(){let width=0;let height=0;if(this.hideLegend)return{width,height};let series=[...this.seriesByKey_.values()];if(this.showTitleInLegend){series=series.filter(series=>series.title!=='');}
-for(const seriesEntry of series){const legendText=this.showTitleInLegend?seriesEntry.title:seriesEntry.key;const textSize=getSVGTextSize(this,legendText);width=Math.max(width,textSize.width+30);height+=textSize.height;}
-return{width,height};},updateDimensions_(){const thisSel=d3.select(this);thisSel.attr('width',this.totalWidth);thisSel.attr('height',this.totalHeight);d3.select(this.chartAreaElement).attr('transform','translate('+this.margin.left+', '+this.margin.top+')');},updateContents_(){this.updateMargins_();this.updateDimensions_();this.updateTitle_();this.updateLegend_();},updateTitle_(){const titleSel=d3.select(this.chartAreaElement).select('#title');if(!this.chartTitle_){titleSel.style('display','none');return;}
-titleSel.attr('transform','translate('+this.graphWidth*0.5+',-15)').style('display',undefined).style('text-anchor','middle').style('font-size',this.titleHeight).attr('class','title').attr('width',this.graphWidth).text(this.chartTitle_);},updateLegend_(){const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.legend').remove();if(this.hideLegend)return;let series;let seriesText;if(this.showTitleInLegend){series=[...this.seriesByKey_.values()].filter(series=>series.title!=='').filter(series=>series.color!=='transparent').reverse();seriesText=series=>series.title;}else{series=[...this.seriesByKey_.values()].filter(series=>series.color!=='transparent').reverse();seriesText=series=>series.key;}
-const legendEntriesSel=chartAreaSel.selectAll('.legend').data(series);legendEntriesSel.enter().append('foreignObject').attr('class','legend').attr('x',this.graphWidth+2).attr('width',this.margin.right).attr('height',18).attr('transform',(series,i)=>'translate(0,'+i*18+')').append('xhtml:body').style('margin',0).append('tr-ui-b-chart-legend-key').property('color',series=>((this.currentHighlightedLegendKey===series.key)?series.highlightedColor:series.color)).property('width',this.margin.right).property('target',series=>series.target).property('title',series=>series.title).property('optional',series=>series.optional).property('enabled',series=>series.enabled).text(seriesText);legendEntriesSel.exit().remove();},get highlightedLegendKey(){return this.highlightedLegendKey_;},set highlightedLegendKey(highlightedLegendKey){this.highlightedLegendKey_=highlightedLegendKey;this.updateHighlight_();},get currentHighlightedLegendKey(){if(this.tempHighlightedLegendKey_){return this.tempHighlightedLegendKey_;}
-return this.highlightedLegendKey_;},pushTempHighlightedLegendKey(key){if(this.tempHighlightedLegendKey_){throw new Error('push cannot nest');}
-this.tempHighlightedLegendKey_=key;this.updateHighlight_();},popTempHighlightedLegendKey(key){if(this.tempHighlightedLegendKey_!==key){throw new Error('pop cannot happen');}
-this.tempHighlightedLegendKey_=undefined;this.updateHighlight_();},updateHighlight_(){const chartAreaSel=d3.select(this.chartAreaElement);const legendEntriesSel=chartAreaSel.selectAll('.legend');const getDataSeries=chart.getDataSeries.bind(chart);const currentHighlightedLegendKey=chart.currentHighlightedLegendKey;legendEntriesSel.each(function(key){const dataSeries=getDataSeries(key);if(key===currentHighlightedLegendKey){this.style.fill=dataSeries.highlightedColor;this.style.fontWeight='bold';}else{this.style.fill=dataSeries.color;this.style.fontWeight='';}});}};return{ChartBase,DataSeriesEnableChangeEventType,getColorOfKey,getSVGTextSize,};});'use strict';tr.exportTo('tr.ui.b',function(){const D3_Y_AXIS_WIDTH_PX=9;const D3_X_AXIS_HEIGHT_PX=23;function sanitizePower(x,defaultValue){if(!isNaN(x)&&isFinite(x)&&(x!==0))return x;return defaultValue;}
-const ChartBase2D=tr.ui.b.define('chart-base-2d',tr.ui.b.ChartBase);ChartBase2D.prototype={__proto__:tr.ui.b.ChartBase.prototype,decorate(){super.decorate();Polymer.dom(this).classList.add('chart-base-2d');this.xScale_=d3.scale.linear();this.yScale_=d3.scale.linear();this.isYLogScale_=false;this.yLogScaleBase_=10;this.yLogScaleMin_=undefined;this.autoDataRange_=new tr.b.math.Range();this.overrideDataRange_=undefined;this.hideXAxis_=false;this.hideYAxis_=false;this.data_=[];this.xAxisLabel_='';this.yAxisLabel_='';this.textHeightPx_=0;this.unit_=undefined;d3.select(this.chartAreaElement).append('g').attr('id','brushes');d3.select(this.chartAreaElement).append('g').attr('id','series');this.addEventListener('mousedown',this.onMouseDown_.bind(this));},get yLogScaleBase(){return this.yLogScaleBase_;},set yLogScaleBase(b){this.yLogScaleBase_=b;},get unit(){return this.unit_;},set unit(unit){this.unit_=unit;this.updateContents_();},get xAxisLabel(){return this.xAxisLabel_;},set xAxisLabel(label){this.xAxisLabel_=label;},get yAxisLabel(){return this.yAxisLabel_;},set yAxisLabel(label){this.yAxisLabel_=label;},get hideXAxis(){return this.hideXAxis_;},set hideXAxis(h){this.hideXAxis_=h;this.updateContents_();},get hideYAxis(){return this.hideYAxis_;},set hideYAxis(h){this.hideYAxis_=h;this.updateContents_();},get data(){return this.data_;},set data(data){if(data===undefined){throw new Error('data must be an Array');}
-this.data_=data;this.updateSeriesKeys_();this.updateDataRange_();this.updateContents_();},set isYLogScale(logScale){if(logScale){this.yScale_=d3.scale.log().base(this.yLogScaleBase);}else{this.yScale_=d3.scale.linear();}
-this.isYLogScale_=logScale;},getYScaleMin_(){return this.isYLogScale_?this.yLogScaleMin_:0;},getYScaleDomain_(minValue,maxValue){if(this.overrideDataRange_!==undefined){return[this.dataRange.min,this.dataRange.max];}
-if(this.isYLogScale_){return[this.getYScaleMin_(),maxValue];}
-return[Math.min(minValue,this.getYScaleMin_()),maxValue];},getSampleWidth_(data,index,leftSide){let leftIndex;let rightIndex;if(leftSide){leftIndex=Math.max(index-1,0);rightIndex=index;}else{leftIndex=index;rightIndex=Math.min(index+1,data.length-1);}
-const leftWidth=this.getXForDatum_(data[index],index)-
-this.getXForDatum_(data[leftIndex],leftIndex);const rightWidth=this.getXForDatum_(data[rightIndex],rightIndex)-
-this.getXForDatum_(data[index],index);return tr.b.math.Statistics.mean([leftWidth,rightWidth]);},updateSeriesKeys_(){this.data_.forEach(function(datum){Object.keys(datum).forEach(function(key){if(this.isDatumFieldSeries_(key)){this.getDataSeries(key);}},this);},this);},isDatumFieldSeries_(fieldName){return fieldName!=='x';},getXForDatum_(datum,index){return datum.x;},updateMargins_(){this.margin.left=this.hideYAxis?0:this.yAxisWidth;this.margin.bottom=this.hideXAxis?0:this.xAxisHeight;if(this.hideXAxis&&!this.hideYAxis){this.margin.bottom=10;}
-if(this.hideYAxis&&!this.hideXAxis){this.margin.left=10;}
-this.margin.top=this.hideYAxis?0:10;if(this.yAxisLabel){this.margin.top+=this.textHeightPx_;}
-if(this.xAxisLabel){this.margin.right=Math.max(this.margin.right,16+tr.ui.b.getSVGTextSize(this,this.xAxisLabel).width);}
-super.updateMargins_();},get xAxisHeight(){return D3_X_AXIS_HEIGHT_PX;},computeScaleTickWidth_(scale){if(this.data.length===0)return 0;let tickValues=scale.ticks();let tickFormat=scale.tickFormat();if(this.isYLogScale_){const enclosingPowers=this.dataRange.enclosingPowers();tickValues=[];const maxPower=sanitizePower(enclosingPowers.max,this.yLogScaleBase);for(let power=sanitizePower(enclosingPowers.min,1);power<=maxPower;power*=this.yLogScaleBase){tickValues.push(power);}
-tickFormat=v=>v.toString();}
-if(this.unit){tickFormat=v=>this.unit.format(v);}
-let maxTickWidth=0;for(const tickValue of tickValues){maxTickWidth=Math.max(maxTickWidth,tr.ui.b.getSVGTextSize(this,tickFormat(tickValue)).width);}
-return D3_Y_AXIS_WIDTH_PX+maxTickWidth;},get yAxisWidth(){return this.computeScaleTickWidth_(this.yScale_);},updateScales_(){if(this.data_.length===0)return;this.xScale_.range([0,this.graphWidth]);this.xScale_.domain(d3.extent(this.data_,this.getXForDatum_.bind(this)));this.yScale_.range([this.graphHeight,0]);this.yScale_.domain([this.dataRange.min,this.dataRange.max]);},updateBrushContents_(brushSel){brushSel.selectAll('*').remove();},updateXAxis_(xAxis){xAxis.selectAll('*').remove();xAxis[0][0].style.opacity=0;if(this.hideXAxis)return;this.drawXAxis_(xAxis);const label=xAxis.append('text').attr('class','label');this.drawXAxisTicks_(xAxis);this.drawXAxisLabel_(label);xAxis[0][0].style.opacity=1;},drawXAxis_(xAxis){xAxis.attr('transform','translate(0,'+this.graphHeight+')').call(d3.svg.axis().scale(this.xScale_).orient('bottom'));},drawXAxisLabel_(label){label.attr('x',this.graphWidth+16).attr('y',8).text(this.xAxisLabel);},drawXAxisTicks_(xAxis){let previousRight=undefined;xAxis.selectAll('.tick')[0].forEach(function(tick){const currentLeft=tick.transform.baseVal[0].matrix.e;if((previousRight===undefined)||(currentLeft>(previousRight+3))){const currentWidth=tick.getBBox().width;previousRight=currentLeft+currentWidth;}else{tick.style.opacity=0;}});},set overrideDataRange(range){this.overrideDataRange_=range;},get dataRange(){if(this.overrideDataRange_!==undefined){return this.overrideDataRange_;}
-return this.autoDataRange_;},updateDataRange_(){if(this.overrideDataRange_!==undefined)return;const dataBySeriesKey=this.getDataBySeriesKey_();this.autoDataRange_.reset();for(const[series,values]of Object.entries(dataBySeriesKey)){for(let i=0;i<values.length;i++){this.autoDataRange_.addValue(values[i][series]);}}
-this.yLogScaleMin_=undefined;if(this.autoDataRange_.min!==undefined){let minValue=this.autoDataRange_.min;if(minValue===0){minValue=1;}
-const onePowerLess=tr.b.math.lesserPower(minValue/this.yLogScaleBase);this.yLogScaleMin_=onePowerLess;}},updateYAxis_(yAxis){yAxis.selectAll('*').remove();yAxis[0][0].style.opacity=0;if(this.hideYAxis)return;this.drawYAxis_(yAxis);this.drawYAxisTicks_(yAxis);const label=yAxis.append('text').attr('class','label');this.drawYAxisLabel_(label);},drawYAxis_(yAxis){let axisModifier=d3.svg.axis().scale(this.yScale_).orient('left');let tickFormat;if(this.isYLogScale_){if(this.yLogScaleMin_===undefined)return;const tickValues=[];const enclosingPowers=this.dataRange.enclosingPowers();const maxPower=sanitizePower(enclosingPowers.max,this.yLogScaleBase);for(let power=sanitizePower(enclosingPowers.min,1);power<=maxPower;power*=this.yLogScaleBase){tickValues.push(power);}
-axisModifier=axisModifier.tickValues(tickValues);tickFormat=v=>v.toString();}
-if(this.unit){tickFormat=v=>this.unit.format(v);}
-if(tickFormat){axisModifier=axisModifier.tickFormat(tickFormat);}
-yAxis.call(axisModifier);},drawYAxisLabel_(label){const labelWidthPx=Math.ceil(tr.ui.b.getSVGTextSize(this.chartAreaElement,this.yAxisLabel).width);label.attr('x',-labelWidthPx).attr('y',-8).text(this.yAxisLabel);},drawYAxisTicks_(yAxis){let previousTop=undefined;yAxis.selectAll('.tick')[0].forEach(function(tick){const bbox=tick.getBBox();const currentTop=tick.transform.baseVal[0].matrix.f;const currentBottom=currentTop+bbox.height;if((previousTop===undefined)||(previousTop>(currentBottom+3))){previousTop=currentTop;}else{tick.style.opacity=0;}});yAxis[0][0].style.opacity=1;},updateContents_(){if(this.textHeightPx_===0){this.textHeightPx_=tr.ui.b.getSVGTextSize(this,'Ay').height;}
-this.updateScales_();super.updateContents_();const chartAreaSel=d3.select(this.chartAreaElement);this.updateXAxis_(chartAreaSel.select('.x.axis'));this.updateYAxis_(chartAreaSel.select('.y.axis'));for(const child of Array.from(this.querySelectorAll('.axis path, .axis line'))){child.style.fill='none';child.style.shapeRendering='crispEdges';child.style.stroke='black';}
-this.updateBrushContents_(chartAreaSel.select('#brushes'));this.updateDataContents_(chartAreaSel.select('#series'));},updateDataContents_(seriesSel){throw new Error('Not implemented');},getDataBySeriesKey_(){const dataBySeriesKey={};for(const[key,series]of this.seriesByKey_){dataBySeriesKey[key]=[];}
-this.data_.forEach(function(multiSeriesDatum,index){const x=this.getXForDatum_(multiSeriesDatum,index);d3.keys(multiSeriesDatum).forEach(function(seriesKey){if(seriesKey==='x')return;if(multiSeriesDatum[seriesKey]===undefined)return;if(!this.isDatumFieldSeries_(seriesKey))return;const singleSeriesDatum={x};singleSeriesDatum[seriesKey]=multiSeriesDatum[seriesKey];dataBySeriesKey[seriesKey].push(singleSeriesDatum);},this);},this);return dataBySeriesKey;},getChartPointAtClientPoint_(clientPoint){const rect=this.getBoundingClientRect();return{x:clientPoint.x-rect.left-this.margin.left,y:clientPoint.y-rect.top-this.margin.top};},getDataPointAtChartPoint_(chartPoint){return{x:tr.b.math.clamp(this.xScale_.invert(chartPoint.x),this.xScale_.domain()[0],this.xScale_.domain()[1]),y:tr.b.math.clamp(this.yScale_.invert(chartPoint.y),this.yScale_.domain()[0],this.yScale_.domain()[1])};},getDataPointAtClientPoint_(clientX,clientY){const chartPoint=this.getChartPointAtClientPoint_({x:clientX,y:clientY});return this.getDataPointAtChartPoint_(chartPoint);},prepareDataEvent_(mouseEvent,dataEvent){const dataPoint=this.getDataPointAtClientPoint_(mouseEvent.clientX,mouseEvent.clientY);dataEvent.x=dataPoint.x;dataEvent.y=dataPoint.y;},onMouseDown_(mouseEvent){tr.ui.b.trackMouseMovesUntilMouseUp(this.onMouseMove_.bind(this,mouseEvent.button),this.onMouseUp_.bind(this,mouseEvent.button));mouseEvent.preventDefault();mouseEvent.stopPropagation();const dataEvent=new tr.b.Event('item-mousedown');dataEvent.button=mouseEvent.button;this.prepareDataEvent_(mouseEvent,dataEvent);this.dispatchEvent(dataEvent);for(const child of Array.from(this.querySelector('#brushes').children)){child.setAttribute('fill','rgb(103, 199, 165)');}},onMouseMove_(button,mouseEvent){if(mouseEvent.buttons!==undefined){mouseEvent.preventDefault();mouseEvent.stopPropagation();}
-const dataEvent=new tr.b.Event('item-mousemove');dataEvent.button=button;this.prepareDataEvent_(mouseEvent,dataEvent);this.dispatchEvent(dataEvent);for(const child of Array.from(this.querySelector('#brushes').children)){child.setAttribute('fill','rgb(103, 199, 165)');}},onMouseUp_(button,mouseEvent){mouseEvent.preventDefault();mouseEvent.stopPropagation();const dataEvent=new tr.b.Event('item-mouseup');dataEvent.button=button;this.prepareDataEvent_(mouseEvent,dataEvent);this.dispatchEvent(dataEvent);for(const child of Array.from(this.querySelector('#brushes').children)){child.setAttribute('fill','rgb(213, 236, 229)');}}};return{ChartBase2D,};});'use strict';tr.exportTo('tr.ui.b',function(){const ChartBase2D=tr.ui.b.ChartBase2D;const ChartBase2DBrushX=tr.ui.b.define('chart-base-2d-brush-1d',ChartBase2D);ChartBase2DBrushX.prototype={__proto__:ChartBase2D.prototype,decorate(){super.decorate();this.brushedRange_=new tr.b.math.Range();},set brushedRange(range){this.brushedRange_.reset();this.brushedRange_.addRange(range);this.updateContents_();},get brushedRange(){return tr.b.math.Range.fromDict(this.brushedRange_.toJSON());},computeBrushRangeFromIndices(indexA,indexB){indexA=tr.b.math.clamp(indexA,0,this.data_.length-1);indexB=tr.b.math.clamp(indexB,0,this.data_.length-1);const leftIndex=Math.min(indexA,indexB);const rightIndex=Math.max(indexA,indexB);const brushRange=new tr.b.math.Range();brushRange.addValue(this.getXForDatum_(this.data_[leftIndex],leftIndex)-
-this.getSampleWidth_(this.data_,leftIndex,true));brushRange.addValue(this.getXForDatum_(this.data_[rightIndex],rightIndex)+
-this.getSampleWidth_(this.data_,rightIndex,false));return brushRange;},getDataIndex_(dataX){if(this.data.length===0)return undefined;const bisect=d3.bisector(this.getXForDatum_.bind(this)).right;return bisect(this.data_,dataX)-1;},prepareDataEvent_(mouseEvent,dataEvent){ChartBase2D.prototype.prepareDataEvent_.call(this,mouseEvent,dataEvent);dataEvent.index=this.getDataIndex_(dataEvent.x);if(dataEvent.index!==undefined){dataEvent.data=this.data_[dataEvent.index];}},updateBrushContents_(brushSel){brushSel.selectAll('*').remove();const brushes=this.brushedRange_.isEmpty?[]:[this.brushedRange_];const brushRectsSel=brushSel.selectAll('rect').data(brushes);brushRectsSel.enter().append('rect');brushRectsSel.exit().remove();this.drawBrush_(brushRectsSel);},drawBrush_(brushRectsSel){brushRectsSel.attr('x',d=>this.xScale_(d.min)).attr('y',0).attr('width',d=>this.xScale_(d.max)-this.xScale_(d.min)).attr('height',this.graphHeight).attr('fill','rgb(213, 236, 229)');}};return{ChartBase2DBrushX,};});'use strict';tr.exportTo('tr.ui.b',function(){const ColumnChart=tr.ui.b.define('column-chart',tr.ui.b.ChartBase2DBrushX);ColumnChart.prototype={__proto__:tr.ui.b.ChartBase2DBrushX.prototype,decorate(){super.decorate();this.xCushion_=1;this.isStacked_=false;this.isGrouped_=false;this.enableHoverBox=true;this.displayXInHover=false;this.enableToolTip=false;this.toolTipCallBack_=()=>{};},set toolTipCallBack(callback){this.toolTipCallBack_=callback;},get toolTipCallBack(){return this.toolTipCallBack_;},set isGrouped(grouped){this.isGrouped_=grouped;if(grouped){this.getDataSeries('group').color='transparent';}
-this.updateContents_();},get isGrouped(){return this.isGrouped_;},set isStacked(stacked){this.isStacked_=true;this.updateContents_();},get isStacked(){return this.isStacked_;},get defaultGraphHeight(){return 100;},get defaultGraphWidth(){return 10*this.data_.length;},updateScales_(){if(this.data_.length===0)return;let xDifferences=0;let currentX=undefined;let previousX=undefined;this.data_.forEach(function(datum,index){previousX=currentX;currentX=this.getXForDatum_(datum,index);if(previousX!==undefined){xDifferences+=currentX-previousX;}},this);this.xScale_.range([0,this.graphWidth]);const domain=d3.extent(this.data_,this.getXForDatum_.bind(this));if(this.data_.length>1){this.xCushion_=xDifferences/(this.data_.length-1);}
-this.xScale_.domain([domain[0],domain[1]+this.xCushion_]);this.yScale_.range([this.graphHeight,0]);this.yScale_.domain(this.getYScaleDomain_(this.dataRange.min,this.dataRange.max));},updateDataRange_(){if(!this.isStacked){super.updateDataRange_();return;}
-this.autoDataRange_.reset();this.autoDataRange_.addValue(0);for(const datum of this.data_){let sum=0;for(const[key,series]of this.seriesByKey_){if(datum[key]===undefined){continue;}else if(this.isGrouped&&key==='group'){continue;}
-sum+=datum[key];}
-this.autoDataRange_.addValue(sum);}},getStackedRectsForDatum_(datum,index){const stacks=[];let bottom=this.yScale_.range()[0];let sum=0;for(const[key,series]of this.seriesByKey_){if(datum[key]===undefined||!this.isSeriesEnabled(key)){continue;}else if(this.isGrouped&&key==='group'){continue;}
-sum+=this.dataRange.clamp(datum[key]);const heightPx=bottom-this.yScale_(sum);bottom-=heightPx;stacks.push({key,value:datum[key],color:this.getDataSeries(key).color,heightPx,topPx:bottom,underflow:sum<this.dataRange.min,overflow:sum>this.dataRange.max,});}
-return stacks;},getRectsForDatum_(datum,index){if(this.isStacked){return this.getStackedRectsForDatum_(datum,index);}
-const stacks=[];for(const[key,series]of this.seriesByKey_){if(datum[key]===undefined||!this.isSeriesEnabled(key)){continue;}
-const clampedValue=this.dataRange.clamp(datum[key]);const topPx=this.yScale_(Math.max(clampedValue,this.getYScaleMin_()));stacks.push({key,value:datum[key],topPx,heightPx:this.yScale_.range()[0]-topPx,color:this.getDataSeries(key).color,underflow:datum[key]<this.dataRange.min,overflow:datum[key]>this.dataRange.max,});}
-stacks.sort(function(a,b){return b.topPx-a.topPx;});return stacks;},drawToolTip_(rect){if(!this.enableToolTip)return;const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.tooltip').remove();const labelText='View Breakdown';const labelWidth=tr.ui.b.getSVGTextSize(this.chartAreaElement,labelText).width+5;const labelHeight=this.textHeightPx_;const toolTipLeftPx=rect.leftPx+(rect.widthPx/2);const toolTipTopPx=rect.topPx;chartAreaSel.append('rect').attr('class','tooltip').attr('fill','white').attr('opacity',0.8).attr('stroke','black').attr('x',toolTipLeftPx).attr('y',toolTipTopPx).attr('width',labelWidth+5).attr('height',labelHeight+10);chartAreaSel.append('text').style('cursor','pointer').attr('class','tooltip').on('mousedown',()=>this.toolTipCallBack_(rect)).attr('fill','blue').attr('x',toolTipLeftPx+4).attr('y',toolTipTopPx+labelHeight).attr('text-decoration','underline').text(labelText);},drawHoverValueBox_(rect){const rectHoverEvent=new tr.b.Event('rect-mouseenter');rectHoverEvent.rect=rect;this.dispatchEvent(rectHoverEvent);if(!this.enableHoverBox)return;const seriesKeys=[...this.seriesByKey_.keys()];const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.hover').remove();let keyWidthPx=0;let keyHeightPx=0;if(seriesKeys.length>1&&!this.isGrouped){keyWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.key).width+5;keyHeightPx=this.textHeightPx_;}
-let xLabelWidthPx=0;let xLabelHeightPx=0;if(this.displayXInHover){xLabelWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.datum.x).width+5;xLabelHeightPx=this.textHeightPx_;}
-let groupWidthPx=0;let groupHeightPx=0;if(this.isGrouped&&rect.datum.group!==undefined){groupWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.datum.group).width+5;groupHeightPx=this.textHeightPx_;}
-let value=rect.value;if(this.unit)value=this.unit.format(value);const valueWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,value).width+5;const valueHeightPx=this.textHeightPx_;const hoverWidthPx=Math.max(keyWidthPx,valueWidthPx,xLabelWidthPx,groupWidthPx);let hoverLeftPx=rect.leftPx+(rect.widthPx/2);hoverLeftPx=Math.max(hoverLeftPx-hoverWidthPx,-this.margin.left);const hoverHeightPx=keyHeightPx+valueHeightPx+
-xLabelHeightPx+groupHeightPx+2;const topOffSetPx=this.isGrouped?36:12;let hoverTopPx=rect.topPx;hoverTopPx=Math.min(hoverTopPx,this.getBoundingClientRect().height-
-hoverHeightPx-topOffSetPx);chartAreaSel.append('rect').attr('class','hover').on('mouseleave',()=>this.clearHoverValueBox_(rect)).on('mousedown',this.drawToolTip_.bind(this,rect)).attr('fill','white').attr('stroke','black').attr('x',hoverLeftPx).attr('y',hoverTopPx).attr('width',hoverWidthPx).attr('height',hoverHeightPx);if(seriesKeys.length>1&&!this.isGrouped){chartAreaSel.append('text').attr('class','hover').on('mouseleave',()=>this.clearHoverValueBox_(rect)).on('mousedown',this.drawToolTip_.bind(this,rect)).attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx-2).text(rect.key);}
-if(this.displayXInHover){chartAreaSel.append('text').attr('class','hover').on('mouseleave',()=>this.clearHoverValueBox_(rect)).on('mousedown',this.drawToolTip_.bind(this,rect)).attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx+xLabelHeightPx-2).text(rect.datum.x);}
-if(this.isGrouped&&rect.datum.group!==undefined){chartAreaSel.append('text').attr('class','hover').on('mouseleave',()=>this.clearHoverValueBox_(rect)).on('mousedown',this.drawToolTip_.bind(this,rect)).attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx+
-xLabelHeightPx+groupHeightPx-2).text(rect.datum.group);}
-chartAreaSel.append('text').attr('class','hover').on('mouseleave',()=>this.clearHoverValueBox_(rect)).on('mousedown',this.drawToolTip_.bind(this,rect)).attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+hoverHeightPx-2).text(value);},clearHoverValueBox_(rect){const event=window.event;if(event.relatedTarget&&Array.from(event.relatedTarget.classList).includes('hover')){return;}
-const rectHoverEvent=new tr.b.Event('rect-mouseleave');rectHoverEvent.rect=rect;this.dispatchEvent(rectHoverEvent);d3.select(this.chartAreaElement).selectAll('.hover').remove();},drawRect_(rect,sel){sel=sel.data([rect]);sel.enter().append('rect').attr('fill',rect.color).attr('x',rect.leftPx).attr('y',rect.topPx).attr('width',rect.widthPx).attr('height',rect.heightPx).on('mousedown',this.drawToolTip_.bind(this,rect)).on('mouseenter',this.drawHoverValueBox_.bind(this,rect)).on('mouseleave',this.clearHoverValueBox_.bind(this,rect));sel.exit().remove();},drawUnderflow_(rect,sel){sel=sel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',rect.leftPx+(rect.widthPx/2)).attr('y',this.graphHeight).on('mousedown',this.drawToolTip_.bind(this,rect)).on('mouseenter',this.drawHoverValueBox_.bind(this,rect)).on('mouseleave',this.clearHoverValueBox_.bind(this,rect));sel.exit().remove();},drawOverflow_(rect,sel){sel=sel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',rect.leftPx+(rect.widthPx/2)).attr('y',0);sel.exit().remove();},updateDataContents_(dataSel){dataSel.selectAll('*').remove();const chartAreaSel=d3.select(this.chartAreaElement);const seriesKeys=[...this.seriesByKey_.keys()];const rectsSel=dataSel.selectAll('path');this.data_.forEach(function(datum,index){const currentX=this.getXForDatum_(datum,index);let width=undefined;if(index<(this.data_.length-1)){const nextX=this.getXForDatum_(this.data_[index+1],index+1);width=nextX-currentX;}else{width=this.xCushion_;}
-for(const rect of this.getRectsForDatum_(datum,index)){rect.datum=datum;rect.index=index;rect.leftPx=this.xScale_(currentX);rect.rightPx=this.xScale_(currentX+width);rect.widthPx=rect.rightPx-rect.leftPx;this.drawRect_(rect,rectsSel);if(rect.underflow){this.drawUnderflow_(rect,rectsSel);}
-if(rect.overflow){this.drawOverflow_(rect,rectsSel);}}},this);}};return{ColumnChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const LineChart=tr.ui.b.define('line-chart',tr.ui.b.ChartBase2DBrushX);LineChart.prototype={__proto__:tr.ui.b.ChartBase2DBrushX.prototype,decorate(){super.decorate();this.enableHoverBox=true;this.displayXInHover=false;},get defaultGraphWidth(){return 20*this.data_.length;},get defaultGraphHeight(){return 100;},drawHoverValueBox_(circle){tr.ui.b.ColumnChart.prototype.drawHoverValueBox_.call(this,circle);},clearHoverValueBox_(circle){tr.ui.b.ColumnChart.prototype.clearHoverValueBox_.call(this,circle);},updateDataContents_(dataSel){dataSel.selectAll('*').remove();const dataBySeriesKey=this.getDataBySeriesKey_();const seriesKeys=[...this.seriesByKey_.keys()];const pathsSel=dataSel.selectAll('path').data(seriesKeys);pathsSel.enter().append('path').style('fill','none').style('stroke-width','1.5px').style('stroke',key=>this.getDataSeries(key).color).attr('d',key=>{const line=d3.svg.line().x(d=>this.xScale_(d.x)).y(d=>this.yScale_(this.dataRange.clamp(d[key])));return line(dataBySeriesKey[key]);});pathsSel.exit().remove();if(this.enableHoverBox){for(let index=0;index<this.data_.length;++index){const datum=this.data_[index];const x=this.getXForDatum_(datum,index);for(const[key,value]of Object.entries(datum)){if(key==='x')continue;if(value===undefined)continue;const color=this.getDataSeries(key).color;const circle=document.createElementNS('http://www.w3.org/2000/svg','circle');circle.setAttribute('cx',this.xScale_(x));circle.setAttribute('cy',this.yScale_(this.dataRange.clamp(value)));circle.setAttribute('r',5);circle.style.fill=color;circle.datum=datum;circle.key=key;circle.value=datum[key];circle.leftPx=this.xScale_(x);circle.widthPx=0;circle.color=color;circle.topPx=this.yScale_(this.dataRange.clamp(value));circle.heightPx=0;circle.addEventListener('mouseenter',()=>this.drawHoverValueBox_(circle));circle.addEventListener('mouseleave',()=>this.clearHoverValueBox_(circle));dataSel[0][0].appendChild(circle);}}}}};return{LineChart,};});'use strict';Polymer({is:'tr-ui-e-s-input-latency-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.rangeOfInterest_=new tr.b.math.Range();this.frametimeType_=tr.model.helpers.IMPL_FRAMETIME_TYPE;this.latencyChart_=undefined;this.frametimeChart_=undefined;this.selectedProcessId_=undefined;this.mouseDownIndex_=undefined;this.curMouseIndex_=undefined;},get model(){return this.model_;},set model(model){this.model_=model;if(this.model_){this.modelHelper_=this.model_.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);}else{this.modelHelper_=undefined;}
-this.updateToolbar_();this.updateContents_();},get frametimeType(){return this.frametimeType_;},set frametimeType(type){if(this.frametimeType_===type)return;this.frametimeType_=type;this.updateContents_();},get selectedProcessId(){return this.selectedProcessId_;},set selectedProcessId(process){if(this.selectedProcessId_===process)return;this.selectedProcessId_=process;this.updateContents_();},set selection(selection){if(this.latencyChart_===undefined)return;this.latencyChart_.brushedRange=selection.bounds;},setBrushedIndices(mouseDownIndex,curIndex){this.mouseDownIndex_=mouseDownIndex;this.curMouseIndex_=curIndex;this.updateBrushedRange_();},updateBrushedRange_(){if(this.latencyChart_===undefined)return;let r=new tr.b.math.Range();if(this.mouseDownIndex_===undefined){this.latencyChart_.brushedRange=r;return;}
-r=this.latencyChart_.computeBrushRangeFromIndices(this.mouseDownIndex_,this.curMouseIndex_);this.latencyChart_.brushedRange=r;let latencySlices=[];for(const thread of this.model_.getAllThreads()){for(const event of thread.getDescendantEvents()){if(event.title.indexOf('InputLatency:')===0){latencySlices.push(event);}}}
-latencySlices=tr.model.helpers.getSlicesIntersectingRange(r,latencySlices);const event=new tr.model.RequestSelectionChangeEvent();event.selection=new tr.model.EventSet(latencySlices);this.latencyChart_.dispatchEvent(event);},registerMouseEventForLatencyChart_(){this.latencyChart_.addEventListener('item-mousedown',function(e){this.mouseDownIndex_=e.index;this.curMouseIndex_=e.index;this.updateBrushedRange_();}.bind(this));this.latencyChart_.addEventListener('item-mousemove',function(e){if(e.button===undefined)return;this.curMouseIndex_=e.index;this.updateBrushedRange_();}.bind(this));this.latencyChart_.addEventListener('item-mouseup',function(e){this.curMouseIndex=e.index;this.updateBrushedRange_();}.bind(this));},updateToolbar_(){const browserProcess=this.modelHelper_.browserProcess;const labels=[];if(browserProcess!==undefined){const labelStr='Browser: '+browserProcess.pid;labels.push({label:labelStr,value:browserProcess.pid});}
-for(const rendererHelper of
-Object.values(this.modelHelper_.rendererHelpers)){const rendererProcess=rendererHelper.process;const labelStr='Renderer: '+rendererProcess.userFriendlyName;labels.push({label:labelStr,value:rendererProcess.userFriendlyName});}
-if(labels.length===0)return;this.selectedProcessId_=labels[0].value;const toolbarEl=this.$.toolbar;Polymer.dom(toolbarEl).appendChild(tr.ui.b.createSelector(this,'frametimeType','inputLatencySidePanel.frametimeType',this.frametimeType_,[{label:'Main Thread Frame Times',value:tr.model.helpers.MAIN_FRAMETIME_TYPE},{label:'Impl Thread Frame Times',value:tr.model.helpers.IMPL_FRAMETIME_TYPE}]));Polymer.dom(toolbarEl).appendChild(tr.ui.b.createSelector(this,'selectedProcessId','inputLatencySidePanel.selectedProcessId',this.selectedProcessId_,labels));},get currentRangeOfInterest(){if(this.rangeOfInterest_.isEmpty){return this.model_.bounds;}
-return this.rangeOfInterest_;},createLatencyLineChart(data,title,parentNode){const chart=new tr.ui.b.LineChart();Polymer.dom(parentNode).appendChild(chart);let width=600;if(document.body.clientWidth!==undefined){width=document.body.clientWidth*0.5;}
-chart.graphWidth=width;chart.chartTitle=title;chart.data=data;return chart;},updateContents_(){const resultArea=this.$.result_area;this.latencyChart_=undefined;this.frametimeChart_=undefined;Polymer.dom(resultArea).textContent='';if(this.modelHelper_===undefined)return;const rangeOfInterest=this.currentRangeOfInterest;let chromeProcess;if(this.modelHelper_.rendererHelpers[this.selectedProcessId_]){chromeProcess=this.modelHelper_.rendererHelpers[this.selectedProcessId_];}else{chromeProcess=this.modelHelper_.browserHelper;}
-const frameEvents=chromeProcess.getFrameEventsInRange(this.frametimeType,rangeOfInterest);const frametimeData=tr.model.helpers.getFrametimeDataFromEvents(frameEvents);const averageFrametime=tr.b.math.Statistics.mean(frametimeData,d=>d.frametime);const latencyEvents=this.modelHelper_.browserHelper.getLatencyEventsInRange(rangeOfInterest);const latencyData=[];latencyEvents.forEach(function(event){if(event.inputLatency===undefined)return;latencyData.push({x:event.start,latency:event.inputLatency/1000});});const averageLatency=tr.b.math.Statistics.mean(latencyData,function(d){return d.latency;});const latencySummaryText=document.createElement('div');Polymer.dom(latencySummaryText).appendChild(tr.ui.b.createSpan({textContent:'Average Latency '+averageLatency+' ms',bold:true}));Polymer.dom(resultArea).appendChild(latencySummaryText);const frametimeSummaryText=document.createElement('div');Polymer.dom(frametimeSummaryText).appendChild(tr.ui.b.createSpan({textContent:'Average Frame Time '+averageFrametime+' ms',bold:true}));Polymer.dom(resultArea).appendChild(frametimeSummaryText);if(latencyData.length!==0){this.latencyChart_=this.createLatencyLineChart(latencyData,'Latency Over Time',resultArea);this.registerMouseEventForLatencyChart_();}
-if(frametimeData.length!==0){this.frametimeChart_=this.createLatencyLineChart(frametimeData,'Frame Times',resultArea);}},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(rangeOfInterest){this.rangeOfInterest_=rangeOfInterest;this.updateContents_();},supportsModel(m){if(m===undefined){return{supported:false,reason:'Unknown tracing model'};}
-if(!tr.model.helpers.ChromeModelHelper.supportsModel(m)){return{supported:false,reason:'No Chrome browser or renderer process found'};}
-const modelHelper=m.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper.browserHelper&&modelHelper.browserHelper.hasLatencyEvents){return{supported:true};}
-return{supported:false,reason:'No InputLatency events trace. Consider enabling '+'benchmark" and "input" category when recording the trace'};},get textLabel(){return'Input Latency';}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-e-s-input-latency-side-panel');});'use strict';tr.exportTo('tr.e.system_stats',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function SystemStatsSnapshot(objectInstance,ts,args){ObjectSnapshot.apply(this,arguments);this.objectInstance=objectInstance;this.ts=ts;this.args=args;this.stats_=args;}
-SystemStatsSnapshot.prototype={__proto__:ObjectSnapshot.prototype,initialize(){if(this.args.length===0){throw new Error('No system stats snapshot data.');}
-this.stats_=this.args;},getStats(){return this.stats_;},setStats(stats){this.stats_=stats;}};ObjectSnapshot.subTypes.register(SystemStatsSnapshot,{typeName:'base::TraceEventSystemStatsMonitor::SystemStats'});return{SystemStatsSnapshot,};});'use strict';tr.exportTo('tr.ui.b',function(){const constants={HEADING_WIDTH:250};return{constants,};});'use strict';Polymer({is:'tr-ui-b-heading',DOWN_ARROW:String.fromCharCode(0x25BE),RIGHT_ARROW:String.fromCharCode(0x25B8),ready(viewport){this.style.width=(tr.ui.b.constants.HEADING_WIDTH-6)+'px';this.heading_='';this.expanded_=true;this.arrowVisible_=false;this.selectionGenerator_=undefined;this.updateContents_();},get heading(){return this.heading_;},set heading(text){if(this.heading_===text)return;this.heading_=text;this.updateContents_();},set arrowVisible(val){if(this.arrowVisible_===val)return;this.arrowVisible_=!!val;this.updateContents_();},set tooltip(text){this.$.heading.title=text;},set selectionGenerator(generator){if(this.selectionGenerator_===generator)return;this.selectionGenerator_=generator;this.updateContents_();},get expanded(){return this.expanded_;},set expanded(expanded){if(this.expanded_===expanded)return;this.expanded_=!!expanded;this.updateContents_();},onHeadingDivClicked_(){this.dispatchEvent(new tr.b.Event('heading-clicked',true));},updateContents_(){if(this.arrowVisible_){this.$.arrow.style.display='';}else{this.$.arrow.style.display='none';this.$.heading.style.display=this.expanded_?'':'none';}
-if(this.arrowVisible_){Polymer.dom(this.$.arrow).textContent=this.expanded_?this.DOWN_ARROW:this.RIGHT_ARROW;}
-this.$.link.style.display='none';this.$.heading_content.style.display='none';if(this.selectionGenerator_){this.$.link.style.display='inline-block';this.$.link.selection=this.selectionGenerator_;Polymer.dom(this.$.link).textContent=this.heading_;}else{this.$.heading_content.style.display='inline-block';Polymer.dom(this.$.heading_content).textContent=this.heading_;}}});'use strict';tr.exportTo('tr.ui.tracks',function(){const Track=tr.ui.b.define('track',tr.ui.b.ContainerThatDecoratesItsChildren);Track.prototype={__proto__:tr.ui.b.ContainerThatDecoratesItsChildren.prototype,decorate(viewport){tr.ui.b.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);if(viewport===undefined){throw new Error('viewport is required when creating a Track.');}
-this.viewport_=viewport;Polymer.dom(this).classList.add('track');},get viewport(){return this.viewport_;},get drawingContainer(){if(this instanceof tr.ui.tracks.DrawingContainer)return this;let cur=this.parentElement;while(cur){if(cur instanceof tr.ui.tracks.DrawingContainer)return cur;cur=cur.parentElement;}
-return undefined;},get eventContainer(){},invalidateDrawingContainer(){const dc=this.drawingContainer;if(dc)dc.invalidate();},context(){if(!Polymer.dom(this).parentNode)return undefined;if(!Polymer.dom(this).parentNode.context){throw new Error('Parent container does not support context() method.');}
-return Polymer.dom(this).parentNode.context();},decorateChild_(childTrack){},undecorateChild_(childTrack){if(childTrack.detach){childTrack.detach();}},updateContents_(){},drawTrack(type){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const canvasBounds=ctx.canvas.getBoundingClientRect();ctx.save();ctx.translate(0,pixelRatio*(bounds.top-canvasBounds.top));const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(canvasBounds.width*pixelRatio);const viewHeight=bounds.height*pixelRatio;this.draw(type,viewLWorld,viewRWorld,viewHeight);ctx.restore();},draw(type,viewLWorld,viewRWorld,viewHeight){},addEventsToTrackMap(eventToTrackMap){},addContainersToTrackMap(containerToTrackMap){},addIntersectingEventsInRangeToSelection(loVX,hiVX,loVY,hiVY,selection){const pixelRatio=window.devicePixelRatio||1;const dt=this.viewport.currentDisplayTransform;const viewPixWidthWorld=dt.xViewVectorToWorld(1);const loWX=dt.xViewToWorld(loVX*pixelRatio);const hiWX=dt.xViewToWorld(hiVX*pixelRatio);const clientRect=this.getBoundingClientRect();const a=Math.max(loVY,clientRect.top);const b=Math.min(hiVY,clientRect.bottom);if(a>b)return;this.addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){},addClosestInstantEventToSelection(instantEvents,worldX,worldMaxDist,selection){const instantEvent=tr.b.findClosestElementInSortedArray(instantEvents,function(x){return x.start;},worldX,worldMaxDist);if(!instantEvent)return;selection.push(instantEvent);}};return{Track,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SelectionState=tr.model.SelectionState;const EventPresenter=tr.ui.b.EventPresenter;const ObjectInstanceTrack=tr.ui.b.define('object-instance-track',tr.ui.tracks.Track);ObjectInstanceTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('object-instance-track');this.objectInstances_=[];this.objectSnapshots_=[];this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},get objectInstances(){return this.objectInstances_;},set objectInstances(objectInstances){if(!objectInstances||objectInstances.length===0){this.heading='';this.objectInstances_=[];this.objectSnapshots_=[];return;}
-this.heading=objectInstances[0].baseTypeName;this.objectInstances_=objectInstances;this.objectSnapshots_=[];this.objectInstances_.forEach(function(instance){this.objectSnapshots_.push.apply(this.objectSnapshots_,instance.snapshots);},this);this.objectSnapshots_.sort(function(a,b){return a.ts-b.ts;});},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1);},draw(type,viewLWorld,viewRWorld,viewHeight){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawObjectInstances_(viewLWorld,viewRWorld);break;}},drawObjectInstances_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const height=bounds.height*pixelRatio;const halfHeight=height*0.5;const twoPi=Math.PI*2;const dt=this.viewport.currentDisplayTransform;const snapshotRadiusView=this.snapshotRadiusView;const snapshotRadiusWorld=dt.xViewVectorToWorld(height);const objectInstances=this.objectInstances_;let loI=tr.b.findLowIndexInSortedArray(objectInstances,function(instance){return instance.deletionTs;},viewLWorld);ctx.save();ctx.strokeStyle='rgb(0,0,0)';for(let i=loI;i<objectInstances.length;++i){const instance=objectInstances[i];const x=instance.creationTs;if(x>viewRWorld)break;const right=instance.deletionTs===Number.MAX_VALUE?viewRWorld:instance.deletionTs;const xView=dt.xWorldToView(x);const widthView=dt.xWorldVectorToView(right-x);ctx.fillStyle=EventPresenter.getObjectInstanceColor(instance);ctx.fillRect(xView,pixelRatio,widthView,height-2*pixelRatio);}
-ctx.restore();const objectSnapshots=this.objectSnapshots_;loI=tr.b.findLowIndexInSortedArray(objectSnapshots,function(snapshot){return snapshot.ts+snapshotRadiusWorld;},viewLWorld);for(let i=loI;i<objectSnapshots.length;++i){const snapshot=objectSnapshots[i];const x=snapshot.ts;if(x-snapshotRadiusWorld>viewRWorld)break;const xView=dt.xWorldToView(x);ctx.fillStyle=EventPresenter.getObjectSnapshotColor(snapshot);ctx.beginPath();ctx.arc(xView,halfHeight,snapshotRadiusView,0,twoPi);ctx.fill();if(snapshot.selected){ctx.lineWidth=5;ctx.strokeStyle='rgb(100,100,0)';ctx.stroke();ctx.beginPath();ctx.arc(xView,halfHeight,snapshotRadiusView-1,0,twoPi);ctx.lineWidth=2;ctx.strokeStyle='rgb(255,255,0)';ctx.stroke();}else{ctx.lineWidth=1;ctx.strokeStyle='rgb(0,0,0)';ctx.stroke();}}
-ctx.lineWidth=1;let selectionState=SelectionState.NONE;if(objectInstances.length&&objectInstances[0].selectionState===SelectionState.DIMMED){selectionState=SelectionState.DIMMED;}
-if(selectionState===SelectionState.DIMMED){const width=bounds.width*pixelRatio;ctx.fillStyle='rgba(255,255,255,0.5)';ctx.fillRect(0,0,width,height);ctx.restore();}},addEventsToTrackMap(eventToTrackMap){if(this.objectInstance_!==undefined){this.objectInstance_.forEach(function(obj){eventToTrackMap.addEvent(obj,this);},this);}
-if(this.objectSnapshots_!==undefined){this.objectSnapshots_.forEach(function(obj){eventToTrackMap.addEvent(obj,this);},this);}},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){let foundSnapshot=false;function onSnapshot(snapshot){selection.push(snapshot);foundSnapshot=true;}
-const snapshotRadiusView=this.snapshotRadiusView;const snapshotRadiusWorld=viewPixWidthWorld*snapshotRadiusView;tr.b.iterateOverIntersectingIntervals(this.objectSnapshots_,function(x){return x.ts-snapshotRadiusWorld;},function(x){return 2*snapshotRadiusWorld;},loWX,hiWX,onSnapshot);if(foundSnapshot)return;tr.b.iterateOverIntersectingIntervals(this.objectInstances_,function(x){return x.creationTs;},function(x){return x.deletionTs-x.creationTs;},loWX,hiWX,(value)=>{selection.push(value);});},addEventNearToProvidedEventToSelection(event,offset,selection){let events;if(event instanceof tr.model.ObjectSnapshot){events=this.objectSnapshots_;}else if(event instanceof tr.model.ObjectInstance){events=this.objectInstances_;}else{throw new Error('Unrecognized event');}
-const index=events.indexOf(event);const newIndex=index+offset;if(newIndex>=0&&newIndex<events.length){selection.push(events[newIndex]);return true;}
-return false;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const snapshot=tr.b.findClosestElementInSortedArray(this.objectSnapshots_,function(x){return x.ts;},worldX,worldMaxDist);if(!snapshot)return;selection.push(snapshot);}};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);tr.b.decorateExtensionRegistry(ObjectInstanceTrack,options);return{ObjectInstanceTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const StackedBarsTrack=tr.ui.b.define('stacked-bars-track',tr.ui.tracks.Track);StackedBarsTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('stacked-bars-track');this.objectInstance_=null;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},addEventsToTrackMap(eventToTrackMap){const objectSnapshots=this.objectInstance_.snapshots;objectSnapshots.forEach(function(obj){eventToTrackMap.addEvent(obj,this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onSnapshot(snapshot){selection.push(snapshot);}
-const snapshots=this.objectInstance_.snapshots;const maxBounds=this.objectInstance_.parent.model.bounds.max;tr.b.iterateOverIntersectingIntervals(snapshots,function(x){return x.ts;},function(x,i){if(i===snapshots.length-1){if(snapshots.length===1){return maxBounds;}
-return snapshots[i].ts-snapshots[i-1].ts;}
-return snapshots[i+1].ts-snapshots[i].ts;},loWX,hiWX,onSnapshot);},addEventNearToProvidedEventToSelection(event,offset,selection){if(!(event instanceof tr.model.ObjectSnapshot)){throw new Error('Unrecognized event');}
-const objectSnapshots=this.objectInstance_.snapshots;const index=objectSnapshots.indexOf(event);const newIndex=index+offset;if(newIndex>=0&&newIndex<objectSnapshots.length){selection.push(objectSnapshots[newIndex]);return true;}
-return false;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const snapshot=tr.b.findClosestElementInSortedArray(this.objectInstance_.snapshots,function(x){return x.ts;},worldX,worldMaxDist);if(!snapshot)return;selection.push(snapshot);}};return{StackedBarsTrack,};});'use strict';tr.exportTo('tr.ui.e.system_stats',function(){const EventPresenter=tr.ui.b.EventPresenter;let statCount;const excludedStats={'meminfo':{'pswpin':0,'pswpout':0,'pgmajfault':0},'diskinfo':{'io':0,'io_time':0,'read_time':0,'reads':0,'reads_merged':0,'sectors_read':0,'sectors_written':0,'weighted_io_time':0,'write_time':0,'writes':0,'writes_merged':0},'swapinfo':{},'perfinfo':{'idle_time':0,'read_transfer_count':0,'write_transfer_count':0,'other_transfer_count':0,'read_operation_count':0,'write_operation_count':0,'other_operation_count':0,'pagefile_pages_written':0,'pagefile_pages_write_ios':0,'available_pages':0,'pages_read':0,'page_read_ios':0}};const SystemStatsInstanceTrack=tr.ui.b.define('tr-ui-e-system-stats-instance-track',tr.ui.tracks.StackedBarsTrack);const kPageSizeWindows=4096;SystemStatsInstanceTrack.prototype={__proto__:tr.ui.tracks.StackedBarsTrack.prototype,decorate(viewport){tr.ui.tracks.StackedBarsTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('tr-ui-e-system-stats-instance-track');this.objectInstance_=null;},set objectInstances(objectInstances){if(!objectInstances){this.objectInstance_=[];return;}
-if(objectInstances.length!==1){throw new Error('Bad object instance count.');}
-this.objectInstance_=objectInstances[0];if(this.objectInstance_!==null){this.computeRates_(this.objectInstance_.snapshots);this.maxStats_=this.computeMaxStats_(this.objectInstance_.snapshots);}},computeRates_(snapshots){for(let i=0;i<snapshots.length;i++){const snapshot=snapshots[i];const stats=snapshot.getStats();let prevSnapshot;if(i===0){prevSnapshot=snapshots[0];}else{prevSnapshot=snapshots[i-1];}
-const prevStats=prevSnapshot.getStats();let timeIntervalSeconds=(snapshot.ts-prevSnapshot.ts)/1000;if(timeIntervalSeconds===0){timeIntervalSeconds=1;}
-this.computeRatesRecursive_(prevStats,stats,timeIntervalSeconds);}},computeRatesRecursive_(prevStats,stats,timeIntervalSeconds){for(const statName in stats){if(stats[statName]instanceof Object){this.computeRatesRecursive_(prevStats[statName],stats[statName],timeIntervalSeconds);}else{if(statName==='sectors_read'){stats.bytes_read_per_sec=(stats.sectors_read-
-prevStats.sectors_read)*512/timeIntervalSeconds;}
-if(statName==='sectors_written'){stats.bytes_written_per_sec=(stats.sectors_written-
-prevStats.sectors_written)*512/timeIntervalSeconds;}
-if(statName==='pgmajfault'){stats.pgmajfault_per_sec=(stats.pgmajfault-
-prevStats.pgmajfault)/timeIntervalSeconds;}
-if(statName==='pswpin'){stats.bytes_swpin_per_sec=(stats.pswpin-
-prevStats.pswpin)*1000/timeIntervalSeconds;}
-if(statName==='pswpout'){stats.bytes_swpout_per_sec=(stats.pswpout-
-prevStats.pswpout)*1000/timeIntervalSeconds;}
-if(statName==='idle_time'){const units=tr.b.convertUnit(100.,tr.b.UnitScale.TIME.NANO_SEC,tr.b.UnitScale.TIME.SEC);const idleTile=(stats.idle_time-prevStats.idle_time)*units;stats.idle_time_per_sec=idleTile/timeIntervalSeconds;}
-if(statName==='read_transfer_count'){const bytesRead=stats.read_transfer_count-
-prevStats.read_transfer_count;stats.bytes_read_per_sec=bytesRead/timeIntervalSeconds;}
-if(statName==='write_transfer_count'){const bytesWritten=stats.write_transfer_count-
-prevStats.write_transfer_count;stats.bytes_written_per_sec=bytesWritten/timeIntervalSeconds;}
-if(statName==='other_transfer_count'){const bytesTransfer=stats.other_transfer_count-
-prevStats.other_transfer_count;stats.bytes_other_per_sec=bytesTransfer/timeIntervalSeconds;}
-if(statName==='read_operation_count'){const readOperation=stats.read_operation_count-
-prevStats.read_operation_count;stats.read_operation_per_sec=readOperation/timeIntervalSeconds;}
-if(statName==='write_operation_count'){const writeOperation=stats.write_operation_count-
-prevStats.write_operation_count;stats.write_operation_per_sec=writeOperation/timeIntervalSeconds;}
-if(statName==='other_operation_count'){const otherOperation=stats.other_operation_count-
-prevStats.other_operation_count;stats.other_operation_per_sec=otherOperation/timeIntervalSeconds;}
-if(statName==='pagefile_pages_written'){const pageFileBytesWritten=(stats.pagefile_pages_written-
-prevStats.pagefile_pages_written)*kPageSizeWindows;stats.pagefile_bytes_written_per_sec=pageFileBytesWritten/timeIntervalSeconds;}
-if(statName==='pagefile_pages_write_ios'){const pagefileWriteOperation=stats.pagefile_pages_write_ios-
-prevStats.pagefile_pages_write_ios;stats.pagefile_write_operation_per_sec=pagefileWriteOperation/timeIntervalSeconds;}
-if(statName==='available_pages'){stats.available_pages_in_bytes=stats.available_pages*kPageSizeWindows;}
-if(statName==='pages_read'){const pagesBytesRead=(stats.pages_read-prevStats.pages_read)*kPageSizeWindows;stats.bytes_read_per_sec=pagesBytesRead/timeIntervalSeconds;}
-if(statName==='page_read_ios'){const pagesBytesReadOperations=stats.page_read_ios-prevStats.page_read_ios;stats.pagefile_write_operation_per_sec=pagesBytesReadOperations/timeIntervalSeconds;}}}},computeMaxStats_(snapshots){const maxStats={};statCount=0;for(let i=0;i<snapshots.length;i++){const snapshot=snapshots[i];const stats=snapshot.getStats();this.computeMaxStatsRecursive_(stats,maxStats,excludedStats);}
-return maxStats;},computeMaxStatsRecursive_(stats,maxStats,excludedStats){for(const statName in stats){if(stats[statName]instanceof Object){if(!(statName in maxStats)){maxStats[statName]={};}
-let excludedNested;if(excludedStats&&statName in excludedStats){excludedNested=excludedStats[statName];}else{excludedNested=null;}
-this.computeMaxStatsRecursive_(stats[statName],maxStats[statName],excludedNested);}else{if(excludedStats&&statName in excludedStats){continue;}
-if(!(statName in maxStats)){maxStats[statName]=0;statCount++;}
-if(stats[statName]>maxStats[statName]){maxStats[statName]=stats[statName];}}}},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;},draw(type,viewLWorld,viewRWorld,viewHeight){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawStatBars_(viewLWorld,viewRWorld);break;}},drawStatBars_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const width=bounds.width*pixelRatio;const height=(bounds.height*pixelRatio)/statCount;const vp=this.viewport.currentDisplayTransform;const maxStats=this.maxStats_;const objectSnapshots=this.objectInstance_.snapshots;let lowIndex=tr.b.findLowIndexInSortedArray(objectSnapshots,function(snapshot){return snapshot.ts;},viewLWorld);if(lowIndex>0)lowIndex-=1;for(let i=lowIndex;i<objectSnapshots.length;++i){const snapshot=objectSnapshots[i];const trace=snapshot.getStats();const currentY=height;const left=snapshot.ts;if(left>viewRWorld)break;let leftView=vp.xWorldToView(left);if(leftView<0)leftView=0;let right;if(i!==objectSnapshots.length-1){right=objectSnapshots[i+1].ts;}else{if(objectSnapshots.length>1){right=objectSnapshots[i].ts+(objectSnapshots[i].ts-
-objectSnapshots[i-1].ts);}else{right=this.objectInstance_.parent.model.bounds.max;}}
-let rightView=vp.xWorldToView(right);if(rightView>width){rightView=width;}
-leftView=Math.floor(leftView);rightView=Math.floor(rightView);this.drawStatBarsRecursive_(snapshot,leftView,rightView,height,trace,maxStats,currentY);if(i===lowIndex){this.drawStatNames_(leftView,height,currentY,'',maxStats);}}
-ctx.lineWidth=1;},drawStatBarsRecursive_(snapshot,leftView,rightView,height,stats,maxStats,currentY){const ctx=this.context();for(const statName in maxStats){if(stats[statName]instanceof Object){currentY=this.drawStatBarsRecursive_(snapshot,leftView,rightView,height,stats[statName],maxStats[statName],currentY);}else{const maxStat=maxStats[statName];ctx.fillStyle=EventPresenter.getBarSnapshotColor(snapshot,Math.round(currentY/height));let barHeight;if(maxStat>0){barHeight=height*Math.max(stats[statName],0)/maxStat;}else{barHeight=0;}
-ctx.fillRect(leftView,currentY-barHeight,Math.max(rightView-leftView,1),barHeight);currentY+=height;}}
-return currentY;},drawStatNames_(leftView,height,currentY,prefix,maxStats){const ctx=this.context();ctx.textAlign='end';ctx.font='12px Arial';ctx.fillStyle='#000000';for(const statName in maxStats){if(maxStats[statName]instanceof Object){currentY=this.drawStatNames_(leftView,height,currentY,statName,maxStats[statName]);}else{let fullname=statName;if(prefix!==''){fullname=prefix+' :: '+statName;}
-ctx.fillText(fullname,leftView-10,currentY-height/4);currentY+=height;}}
-return currentY;}};tr.ui.tracks.ObjectInstanceTrack.register(SystemStatsInstanceTrack,{typeName:'base::TraceEventSystemStatsMonitor::SystemStats'});return{SystemStatsInstanceTrack,};});'use strict';tr.exportTo('tr.ui.e.system_stats',function(){const SystemStatsSnapshotView=tr.ui.b.define('tr-ui-e-system-stats-snapshot-view',tr.ui.analysis.ObjectSnapshotView);SystemStatsSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-system-stats-snapshot-view');},updateContents(){const snapshot=this.objectSnapshot_;if(!snapshot||!snapshot.getStats()){Polymer.dom(this).textContent='No system stats snapshot found.';return;}
-Polymer.dom(this).textContent='';const stats=snapshot.getStats();Polymer.dom(this).appendChild(this.buildList_(stats));},isFloat(n){return typeof n==='number'&&n%1!==0;},buildList_(stats){const statList=document.createElement('ul');for(const statName in stats){const statText=document.createElement('li');Polymer.dom(statText).textContent=''+statName+': ';Polymer.dom(statList).appendChild(statText);if(stats[statName]instanceof Object){Polymer.dom(statList).appendChild(this.buildList_(stats[statName]));}else{if(this.isFloat(stats[statName])){Polymer.dom(statText).textContent+=stats[statName].toFixed(2);}else{Polymer.dom(statText).textContent+=stats[statName];}}}
-return statList;}};tr.ui.analysis.ObjectSnapshotView.register(SystemStatsSnapshotView,{typeName:'base::TraceEventSystemStatsMonitor::SystemStats'});return{SystemStatsSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.v8',function(){const IGNORED_ENTRIES={match:full=>full.startsWith('*CODE_AGE_')};const INSTANCE_TYPE_GROUPS={FIXED_ARRAY_TYPE:{match:full=>full.startsWith('*FIXED_ARRAY_'),realEntry:'FIXED_ARRAY_TYPE',keyToName:key=>key.slice('*FIXED_ARRAY_'.length).slice(0,-('_SUB_TYPE'.length)),nameToKey:name=>'*FIXED_ARRAY_'+name+'_SUB_TYPE'},CODE_TYPE:{match:full=>full.startsWith('*CODE_'),realEntry:'CODE_TYPE',keyToName:key=>key.slice('*CODE_'.length),nameToKey:name=>'*CODE_'+name},JS_OBJECTS:{match:full=>full.startsWith('JS_'),keyToName:key=>key,nameToKey:name=>name},Strings:{match:full=>full.endsWith('STRING_TYPE'),keyToName:key=>key,nameToKey:name=>name},Maps:{match:full=>full.startsWith('MAP_')&&full.endsWith('_TYPE'),keyToName:key=>key,nameToKey:name=>name},DescriptorArrays:{match:full=>full.endsWith('DESCRIPTOR_ARRAY_TYPE'),keyToName:key=>key,nameToKey:name=>name}};const DIFF_COLOR={GREEN:'#64DD17',RED:'#D50000'};function computePercentage(valueA,valueB){if(valueA===0)return 0;return valueA/valueB*100;}
-class DiffEntry{constructor(originalEntry,diffEntry){this.originalEntry_=originalEntry;this.diffEntry_=diffEntry;}
-get title(){return this.diffEntry_.title;}
-get overall(){return this.diffEntry_.overall;}
-get overAllocated(){return this.diffEntry_.overAllocated;}
-get count(){return this.diffEntry_.count;}
-get overallPercent(){return this.diffEntry_.overallPercent;}
-get overAllocatedPercent(){return this.diffEntry_.overAllocatedPercent;}
-get origin(){return this.originalEntry_;}
-get diff(){return this.diffEntry_;}
-get subRows(){return this.diffEntry_.subRows;}}
-class Entry{constructor(title,count,overall,overAllocated,histogram,overAllocatedHistogram){this.title_=title;this.overall_=overall;this.count_=count;this.overAllocated_=overAllocated;this.histogram_=histogram;this.overAllocatedHistogram_=overAllocatedHistogram;this.bucketSize_=this.histogram_.length;this.overallPercent_=100;this.overAllocatedPercent_=100;}
-get title(){return this.title_;}
-get overall(){return this.overall_;}
-get count(){return this.count_;}
-get overAllocated(){return this.overAllocated_;}
-get histogram(){return this.histogram_;}
-get overAllocatedHistogram(){return this.overAllocatedHistogram_;}
-get bucketSize(){return this.bucketSize_;}
-get overallPercent(){return this.overallPercent_;}
-set overallPercent(value){this.overallPercent_=value;}
-get overAllocatedPercent(){return this.overAllocatedPercent_;}
-set overAllocatedPercent(value){this.overAllocatedPercent_=value;}
-setFromObject(obj){this.count_=obj.count;this.overall_=obj.overall/1024;this.overAllocated_=obj.over_allocated/1024;this.histogram_=obj.histogram;this.overAllocatedHistogram_=obj.over_allocated_histogram;}
-diff(other){const entry=new Entry(this.title_,other.count_-this.count,other.overall_-this.overall,other.overAllocated_-this.overAllocated,[],[]);entry.overallPercent=computePercentage(entry.overall,this.overall);entry.overAllocatedPercent=computePercentage(entry.overAllocated,this.overAllocated);return new DiffEntry(this,entry);}}
-class GroupedEntry extends Entry{constructor(title,count,overall,overAllocated,histogram,overAllocatedHistogram){super(title,count,overall,overAllocated,histogram,overAllocatedHistogram);this.histogram_.fill(0);this.overAllocatedHistogram_.fill(0);this.entries_=new Map();}
-get title(){return this.title_;}
-set title(value){this.title_=value;}
-get subRows(){return Array.from(this.entries_.values());}
-getEntryFromTitle(title){return this.entries_.get(title);}
-add(entry){this.count_+=entry.count;this.overall_+=entry.overall;this.overAllocated_+=entry.overAllocated;if(this.bucketSize_===entry.bucketSize){for(let i=0;i<this.bucketSize_;++i){this.histogram_[i]+=entry.histogram[i];this.overAllocatedHistogram_[i]+=entry.overAllocatedHistogram[i];}}
-this.entries_.set(entry.title,entry);}
-accumulateUnknown(title){let unknownCount=this.count_;let unknownOverall=this.overall_;let unknownOverAllocated=this.overAllocated_;const unknownHistogram=tr.b.deepCopy(this.histogram_);const unknownOverAllocatedHistogram=tr.b.deepCopy(this.overAllocatedHistogram_);for(const entry of this.entries_.values()){unknownCount-=entry.count;unknownOverall-=entry.overall;unknownOverAllocated-=entry.overAllocated;for(let i=0;i<this.bucketSize_;++i){unknownHistogram[i]-=entry.histogram[i];unknownOverAllocatedHistogram[i]-=entry.overAllocatedHistogram[i];}}
-unknownOverAllocated=unknownOverAllocated<0?0:unknownOverAllocated;this.entries_.set(title,new Entry(title,unknownCount,unknownOverall,unknownOverAllocated,unknownHistogram,unknownOverAllocatedHistogram));}
-calculatePercentage(){for(const entry of this.entries_.values()){entry.overallPercent=computePercentage(entry.overall,this.overall_);entry.overAllocatedPercent=computePercentage(entry.overAllocated,this.overAllocated_);if(entry instanceof GroupedEntry)entry.calculatePercentage();}}
-diff(other){let newTitle='';if(this.title_.startsWith('Isolate')){newTitle='Total';}else{newTitle=this.title_;}
-const result=new GroupedEntry(newTitle,0,0,0,[],[]);for(const entry of this.entries_){const otherEntry=other.getEntryFromTitle(entry[0]);if(otherEntry===undefined)continue;result.add(entry[1].diff(otherEntry));}
-result.overallPercent=computePercentage(result.overall,this.overall);result.overAllocatedPercent=computePercentage(result.overAllocated,this.overAllocated);return new DiffEntry(this,result);}}
-function createSelector(targetEl,defaultValue,items,callback){const selectorEl=document.createElement('select');selectorEl.addEventListener('change',callback.bind(targetEl));const defaultOptionEl=document.createElement('option');for(let i=0;i<items.length;i++){const item=items[i];const optionEl=document.createElement('option');Polymer.dom(optionEl).textContent=item.label;optionEl.targetPropertyValue=item.value;optionEl.item=item;Polymer.dom(selectorEl).appendChild(optionEl);}
-selectorEl.__defineGetter__('selectedValue',function(v){if(selectorEl.children[selectorEl.selectedIndex]===undefined){return undefined;}
-return selectorEl.children[selectorEl.selectedIndex].targetPropertyValue;});selectorEl.__defineGetter__('selectedItem',function(v){if(selectorEl.children[selectorEl.selectedIndex]===undefined){return undefined;}
-return selectorEl.children[selectorEl.selectedIndex].item;});selectorEl.__defineSetter__('selectedValue',function(v){for(let i=0;i<selectorEl.children.length;i++){const value=selectorEl.children[i].targetPropertyValue;if(value===v){const changed=selectorEl.selectedIndex!==i;if(changed){selectorEl.selectedIndex=i;callback();}
-return;}}
-throw new Error('Not a valid value');});selectorEl.selectedIndex=-1;return selectorEl;}
-function plusMinus(value,toFixed=3){return(value>0?'+':'')+value.toFixed(toFixed);}
-function addArrow(value){if(value===0)return value;if(value===Number.NEGATIVE_INFINITY)return'\u2193\u221E';if(value===Number.POSITIVE_INFINITY)return'\u2191\u221E';return(value>0?'\u2191':'\u2193')+Math.abs(value.toFixed(3));}
-Polymer({is:'tr-ui-e-v8-gc-objects-stats-table',ready(){this.$.diffOption.style.display='none';this.isolateEntries_=[];this.selector1_=undefined;this.selector2_=undefined;},constructDiffTable_(table){this.$.diffTable.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.diffTable.tableColumns=[{title:'Component',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.title;return typeEl;},showExpandButtons:true},{title:'Overall Memory(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=row.origin.overall.toFixed(3);return spanEl;},cmp(a,b){return a.origin.overall-b.origin.overall;}},{title:'diff(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=plusMinus(row.overall);if(row.overall>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overall<0){spanEl.style.color=DIFF_COLOR.GREEN;}
-return spanEl;},cmp(a,b){return a.overall-b.overall;}},{title:'diff(%)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=addArrow(row.overallPercent);if(row.overall>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overall<0){spanEl.style.color=DIFF_COLOR.GREEN;}
-return spanEl;},cmp(a,b){return a.overall-b.overall;}},{title:'Over Allocated Memory(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=row.origin.overAllocated.toFixed(3);return spanEl;},cmp(a,b){return a.origin.overAllocated-b.origin.overAllocated;}},{title:'diff(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=plusMinus(row.overAllocated);if(row.overAllocated>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overAllocated<0){spanEl.style.color=DIFF_COLOR.GREEN;}
-return spanEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}},{title:'diff(%)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=addArrow(row.overAllocatedPercent);if(row.overAllocated>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overAllocated<0){spanEl.style.color=DIFF_COLOR.GREEN;}
-return spanEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}},{title:'Count',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=row.origin.count;return spanEl;},cmp(a,b){return a.origin.count-b.origin.count;}},{title:'diff',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=plusMinus(row.count,0);if(row.count>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.count<0){spanEl.style.color=DIFF_COLOR.GREEN;}
-return spanEl;},cmp(a,b){return a.count-b.count;}},];},buildOptions_(){const items=[];for(const isolateEntry of this.isolateEntries_){items.push({label:isolateEntry.title,value:isolateEntry});}
-this.$.diffOption.style.display='inline-block';this.selector1_=createSelector(this,'',items,this.diffOptionChanged_);Polymer.dom(this.$.diffOption).appendChild(this.selector1_);const spanEl=tr.ui.b.createSpan();spanEl.innerText=' VS ';Polymer.dom(this.$.diffOption).appendChild(spanEl);this.selector2_=createSelector(this,'',items,this.diffOptionChanged_);Polymer.dom(this.$.diffOption).appendChild(this.selector2_);},diffOptionChanged_(){const isolateEntry1=this.selector1_.selectedValue;const isolateEntry2=this.selector2_.selectedValue;if(isolateEntry1===undefined||isolateEntry2===undefined){return;}
-if(isolateEntry1===isolateEntry2){this.$.diffTable.tableRows=[];this.$.diffTable.rebuild();return;}
-this.$.diffTable.tableRows=[isolateEntry1.diff(isolateEntry2)];this.$.diffTable.rebuild();},constructTable_(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.tableColumns=[{title:'Component',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.title;return typeEl;},showExpandButtons:true},{title:'Overall Memory (KB)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overall.toFixed(3);return typeEl;},cmp(a,b){return a.overall-b.overall;}},{title:'Over Allocated Memory (KB)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overAllocated.toFixed(3);return typeEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}},{title:'Overall Count',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.count;return typeEl;},cmp(a,b){return a.count-b.count;}},{title:'Overall Memory Percent',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overallPercent.toFixed(3)+'%';return typeEl;},cmp(a,b){return a.overall-b.overall;}},{title:'Overall Allocated Memory Percent',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overAllocatedPercent.toFixed(3)+'%';return typeEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}}];this.$.table.sortColumnIndex=1;this.$.table.sortDescending=true;},buildSubEntry_(objects,groupEntry,keyToName){const typeGroup=INSTANCE_TYPE_GROUPS[groupEntry.title];for(const instanceType of typeGroup){const e=objects[instanceType];if(e===undefined)continue;delete objects[instanceType];let title=instanceType;if(keyToName!==undefined)title=keyToName(title);groupEntry.add(new Entry(title,e.count,e.overall/1024,e.over_allocated/1024,e.histogram,e.over_allocated_histogram));}},buildUnGroupedEntries_(objects,objectEntry,bucketSize){for(const title of Object.getOwnPropertyNames(objects)){const obj=objects[title];const groupedEntry=new GroupedEntry(title,0,0,0,new Array(bucketSize),new Array(bucketSize));groupedEntry.setFromObject(obj);objectEntry.add(groupedEntry);}},createGroupEntries_(groupEntries,objects,bucketSize){for(const groupName of Object.getOwnPropertyNames(INSTANCE_TYPE_GROUPS)){const groupEntry=new GroupedEntry(groupName,0,0,0,new Array(bucketSize),new Array(bucketSize));if(INSTANCE_TYPE_GROUPS[groupName].realEntry!==undefined){groupEntry.savedRealEntry=objects[INSTANCE_TYPE_GROUPS[groupName].realEntry];delete objects[INSTANCE_TYPE_GROUPS[groupName].realEntry];}
-groupEntries[groupName]=groupEntry;}},buildGroupEntries_(groupEntries,objectEntry){for(const groupName of Object.getOwnPropertyNames(groupEntries)){const groupEntry=groupEntries[groupName];if(groupEntry.savedRealEntry!==undefined){groupEntry.setFromObject(groupEntry.savedRealEntry);groupEntry.accumulateUnknown('UNKNOWN');delete groupEntry.savedRealEntry;}
-objectEntry.add(groupEntry);}},buildSubEntriesForGroups_(groupEntries,objects){for(const instanceType of Object.getOwnPropertyNames(objects)){if(IGNORED_ENTRIES.match(instanceType)){delete objects[instanceType];continue;}
-const e=objects[instanceType];for(const name of Object.getOwnPropertyNames(INSTANCE_TYPE_GROUPS)){const group=INSTANCE_TYPE_GROUPS[name];if(group.match(instanceType)){groupEntries[name].add(new Entry(group.keyToName(instanceType),e.count,e.overall/1024,e.over_allocated/1024,e.histogram,e.over_allocated_histogram));delete objects[instanceType];}}}},build_(objects,objectEntry,bucketSize){delete objects.END;const groupEntries={};this.createGroupEntries_(groupEntries,objects,bucketSize);this.buildSubEntriesForGroups_(groupEntries,objects);this.buildGroupEntries_(groupEntries,objectEntry);this.buildUnGroupedEntries_(objects,objectEntry,bucketSize);},set selection(slices){slices.sortEvents(function(a,b){return b.start-a.start;});const previous=undefined;for(const slice of slices){if(!slice instanceof tr.e.v8.V8GCStatsThreadSlice)continue;const liveObjects=slice.liveObjects;const deadObjects=slice.deadObjects;const isolate=liveObjects.isolate;const isolateEntry=new GroupedEntry('Isolate_'+isolate+' at '+slice.start.toFixed(3)+' ms',0,0,0,[],[]);const liveEntry=new GroupedEntry('live objects',0,0,0,[],[]);const deadEntry=new GroupedEntry('dead objects',0,0,0,[],[]);const liveBucketSize=liveObjects.bucket_sizes.length;const deadBucketSize=deadObjects.bucket_sizes.length;this.build_(tr.b.deepCopy(liveObjects.type_data),liveEntry,liveBucketSize);isolateEntry.add(liveEntry);this.build_(tr.b.deepCopy(deadObjects.type_data),deadEntry,deadBucketSize);isolateEntry.add(deadEntry);isolateEntry.calculatePercentage();this.isolateEntries_.push(isolateEntry);}
-this.updateTable_();if(slices.length>1){this.buildOptions_();this.constructDiffTable_();}},updateTable_(){this.constructTable_();this.$.table.tableRows=this.isolateEntries_;this.$.table.rebuild();},});return{};});'use strict';Polymer({is:'tr-ui-e-multi-v8-gc-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.gcObjectsStats.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-multi-v8-gc-stats-thread-slice-sub-view',tr.e.v8.V8GCStatsThreadSlice,{multi:true,title:'V8 GC Stats slices'});'use strict';tr.exportTo('tr.e.v8',function(){const IC_STATS_PROPERTIES=['type','category','scriptName','filePosition','state','isNative','map','propertiesMode','numberOfOwnProperties','instanceType'];class ICStatsEntry{constructor(obj){this.type_=obj.type;if(this.type_.includes('Store')){this.category_='Store';}else if(this.type_.includes('Load')){this.category_='Load';}
-this.state_=obj.state;if(obj.functionName){this.functionName_=obj.optimized?'*':'~';this.functionName_+=obj.functionName.length===0?'(anonymous function)':obj.functionName;}
-this.offset_=obj.offset;this.scriptName_=obj.scriptName?obj.scriptName:'unknown';this.isNative_=obj.scriptName&&obj.scriptName.includes('native');this.lineNum_=obj.lineNum?obj.lineNum:'unknown';this.filePosition_=this.scriptName_+':'+this.lineNum_;if(this.functionName_){this.filePosition_+=' '+this.functionName_+'+'+this.offset_;}
-this.constructor_=obj.constructor?false:true;this.map_=obj.map;if(this.map_){this.propertiesMode_=obj.dict===1?'slow':'fast';}else{this.propertiesMode_='unknown';}
-this.numberOfOwnProperties_=obj.own;this.instanceType_=obj.instanceType;this.key_=obj.key;}
-get type(){return this.type_;}
-get category(){return this.category_;}
-get state(){return this.state_;}
-get functionName(){return this.functionName_;}
-get offset(){return this.offset_;}
-get scriptName(){return this.scriptName_;}
-get isNative(){return this.isNative_;}
-get lineNumber(){return this.lineNum_;}
-get isConstructor(){return this.constructor_;}
-get map(){return this.map_;}
-get propertiesMode(){return this.propertiesMode_;}
-get numberOfOwnProperties(){return this.numberOfOwnProperties_;}
-get instanceType(){return this.instanceType_;}
-get filePosition(){return this.filePosition_;}}
-class ICStatsEntryGroup{constructor(property,key){this.property_=property;this.key_=key;this.percentage_=0;this.entries_=[];this.subGroup_=undefined;}
-static groupBy(groups,entries,property){for(const entry of entries){const key=entry[property];let group=groups.get(key);if(!group){group=new ICStatsEntryGroup(property,key);groups.set(key,group);}
-group.add(entry);}
-for(const group of groups.values()){group.percentage=group.length/entries.length;}}
-add(entry){this.entries_.push(entry);}
-createSubGroup(){if(this.subGroup_)return this.subGroup_;this.subGroup_=new Map();for(const property of IC_STATS_PROPERTIES){if(property===this.property_)continue;const groups=new Map();this.subGroup_.set(property,groups);ICStatsEntryGroup.groupBy(groups,this.entries_,property);}
-return this.subGroup_;}
-get entries(){return this.entries_;}
-get key(){return this.key_;}
-get length(){return this.entries_.length;}
-get percentage(){return this.percentage_;}
-set percentage(value){this.percentage_=value;}}
-class ICStatsCollection{constructor(){this.entries_=[];this.groupedEntries_=new Map();}
-add(entry){this.entries_.push(entry);}
-groupBy(property){if(this.groupedEntries_.has(property)){return Array.from(this.groupedEntries_.get(property).values());}
-const groups=new Map();this.groupedEntries_.set(property,groups);ICStatsEntryGroup.groupBy(groups,this.entries_,property);return Array.from(groups.values());}
-get entries(){return this.entries_;}
-get length(){return this.entries_.length;}}
-return{IC_STATS_PROPERTIES,ICStatsEntry,ICStatsEntryGroup,ICStatsCollection,};});'use strict';tr.exportTo('tr.ui.e.v8',function(){const PROPERTIES=tr.e.v8.IC_STATS_PROPERTIES.map(x=>{return{label:x,value:x};});const ICStatsEntry=tr.e.v8.ICStatsEntry;const ICStatsEntryGroup=tr.e.v8.ICStatsEntryGroup;const ICStatsCollection=tr.e.v8.ICStatsCollection;Polymer({is:'tr-ui-e-v8-ic-stats-table',ready(){this.icStatsCollection_=new ICStatsCollection();this.groupKey_=PROPERTIES[0].value;this.selector_=tr.ui.b.createSelector(this,'groupKey','v8ICStatsGroupKey',this.groupKey_,PROPERTIES);Polymer.dom(this.$.groupOption).appendChild(this.selector_);},get groupKey(){return this.groupKey_;},set groupKey(key){this.groupKey_=key;if(this.icStatsCollection_.length===0)return;this.updateTable_(this.groupKey_);},constructTable_(table,groupKey){table.tableColumns=[{title:'',value:row=>{let expanded=false;const buttonEl=tr.ui.b.createButton('details',function(){const previousSibling=Polymer.dom(this).parentNode.parentNode;const parentNode=previousSibling.parentNode;if(expanded){const trEls=parentNode.getElementsByClassName('subTable');Array.from(trEls).map(x=>x.parentNode.removeChild(x));expanded=false;return;}
-expanded=true;const subGroups=row.createSubGroup();const tr=document.createElement('tr');tr.classList.add('subTable');tr.appendChild(document.createElement('td'));const td=document.createElement('td');td.colSpan=3;for(const subGroup of subGroups){const property=subGroup[0];const all=Array.from(subGroup[1].values());const group=all.slice(0,20);const divEl=document.createElement('div');const spanEl=document.createElement('span');const subTableEl=document.createElement('tr-ui-b-table');spanEl.innerText=`Top 20 out of ${all.length}`;spanEl.style.fontWeight='bold';spanEl.style.fontSize='14px';divEl.appendChild(spanEl);this.constructTable_(subTableEl,property);subTableEl.tableRows=group;subTableEl.rebuild();divEl.appendChild(subTableEl);td.appendChild(divEl);}
-tr.appendChild(td);parentNode.insertBefore(tr,previousSibling.nextSibling);});return buttonEl;}},{title:'Percentage',value(row){const spanEl=document.createElement('span');spanEl.innerText=(row.percentage*100).toFixed(3)+'%';return spanEl;},cmp:(a,b)=>a.percentage-b.percentage},{title:'Count',value(row){const spanEl=document.createElement('span');spanEl.innerText=row.length;return spanEl;},cmp:(a,b)=>a.length-b.length},{title:groupKey,value(row){const spanEl=document.createElement('span');spanEl.innerText=row.key?row.key:'';return spanEl;}}];table.sortColumnIndex=1;table.sortDescending=true;},updateTable_(groupKey){this.constructTable_(this.$.table,groupKey);this.$.table.tableRows=this.icStatsCollection_.groupBy(groupKey);this.$.table.rebuild();},set selection(slices){for(const slice of slices){for(const icStatsObj of slice.icStats){const entry=new ICStatsEntry(icStatsObj);this.icStatsCollection_.add(entry);}}
-this.$.total.innerText='Total items: '+this.icStatsCollection_.length;this.updateTable_(this.selector_.selectedValue);}});return{};});'use strict';Polymer({is:'tr-ui-e-multi-v8-ic-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.table.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-multi-v8-ic-stats-thread-slice-sub-view',tr.e.v8.V8ICStatsThreadSlice,{multi:true,title:'V8 IC stats slices'});'use strict';tr.exportTo('tr.e.v8',function(){class RuntimeStatsEntry{constructor(name,count,time){this.name_=name;this.count_=count;this.time_=time;}
-get name(){return this.name_;}
-get count(){return this.count_;}
-get time(){return this.time_;}
-addSample(count,time){this.count_+=count;this.time_+=time;}}
-class RuntimeStatsGroup extends RuntimeStatsEntry{constructor(name,matchRegex){super(name,0,0);this.regex_=matchRegex;this.entries_=new Map();}
-match(name){return this.regex_&&name.match(this.regex_);}
-add(entry){const value=this.entries_.get(entry.name);if(value!==undefined){value.addSample(entry.count,entry.time);}else{this.entries_.set(entry.name,entry);}
-this.count_+=entry.count;this.time_+=entry.time;}
-get values(){return Array.from(this.entries_.values());}}
-class RuntimeStatsGroupCollection{constructor(){this.blink_cpp_group_=new RuntimeStatsGroup('Blink C++',/.*Callback.*/);this.api_group_=new RuntimeStatsGroup('API',/.*API.*/);this.groups_=[new RuntimeStatsGroup('Total'),new RuntimeStatsGroup('IC',/.*IC_.*/),new RuntimeStatsGroup('Optimize-Background',/(.*OptimizeBackground.*)|RecompileConcurrent.*/),new RuntimeStatsGroup('Optimize',/StackGuard|.*Optimize.*|.*Deoptimize.*|Recompile.*/),new RuntimeStatsGroup('Compile-Background',/(.*CompileBackground.*)/),new RuntimeStatsGroup('Compile',/(^Compile.*)|(.*_Compile.*)/),new RuntimeStatsGroup('Parse-Background',/.*ParseBackground.*/),new RuntimeStatsGroup('Parse',/.*Parse.*/),this.blink_cpp_group_,this.api_group_,new RuntimeStatsGroup('GC-Background-Marking',/.*GC.MC.BACKGROUND.*MARKING.*/),new RuntimeStatsGroup('GC-Background-Sweeping',/.*GC.MC.BACKGROUND.*SWEEPING.*/),new RuntimeStatsGroup('GC-Background-Scavenger',/.*GC.SCAVENGER.BACKGROUND.*/),new RuntimeStatsGroup('GC-Background-MinorMC',/.*GC.MINOR_MC.BACKGROUND.*/),new RuntimeStatsGroup('GC-Background-MajorMC',/.*GC.MC.BACKGROUND.*/),new RuntimeStatsGroup('GC-Background-Other',/.*GC.*BACKGROUND.*/),new RuntimeStatsGroup('GC',/GC|AllocateInTargetSpace/),new RuntimeStatsGroup('JavaScript',/JS_Execution/),new RuntimeStatsGroup('V8 C++',/.*/)];this.blink_group_collection_=null;}
-addSlices(slices){const blinkEntries=[];for(const slice of slices){if(!(slice instanceof tr.e.v8.V8ThreadSlice))return;let runtimeCallStats;try{runtimeCallStats=JSON.parse(slice.runtimeCallStats);}catch(e){runtimeCallStats=slice.runtimeCallStats;}
-if(runtimeCallStats===undefined)continue;for(const[name,stat]of Object.entries(runtimeCallStats)){if(name.match(/Blink_.*/)){if(name==='Blink_V8')continue;const entry=new RuntimeStatsEntry(name,stat[0],stat[1]);blinkEntries.push(entry);continue;}
-for(let i=1;i<this.groups_.length;++i){if(this.groups_[i].match(name)){if(stat.length!==2)break;const entry=new RuntimeStatsEntry(name,stat[0],stat[1]);this.groups_[0].addSample(stat[0],stat[1]);this.groups_[i].add(entry);break;}}}}
-this.blink_group_collection_=new BlinkRuntimeStatsGroupCollection(blinkEntries);}
-get totalTime(){return this.groups_[0].time;}
-get totalCount(){return this.groups_[0].count;}
-get runtimeGroups(){return this.groups_;}
-get blinkRCSGroupCollection(){return this.blink_group_collection_;}
-get blinkCppTotalTime(){return this.blink_cpp_group_.time+this.api_group_.time;}}
-class BlinkRuntimeStatsGroupCollection{constructor(entries){this.groups_=[new RuntimeStatsGroup('Blink_Bindings',/^Blink_Bindings_(.*)/),new RuntimeStatsGroup('Blink_GC',/^Blink_GC_(.*)/),new RuntimeStatsGroup('Blink_Layout',/^Blink_Layout_(.*)/),new RuntimeStatsGroup('Blink_Parsing',/^Blink_Parsing_(.*)/),new RuntimeStatsGroup('Blink_Style',/^Blink_Style_(.*)/),new RuntimeStatsGroup('Blink_Callbacks',/^Blink_(.*)/)];this.total_group_=new RuntimeStatsGroup('Blink_Total',/.*/);for(const entry of entries){for(const group of this.groups_){if(group.match(entry.name)){const newEntry=new RuntimeStatsEntry('Blink_'+group.match(entry.name)[1],entry.count,entry.time);group.add(newEntry);this.total_group_.addSample(entry.count,entry.time);break;}}}}
-get runtimeGroups(){return this.groups_.concat(this.total_group_);}
-get values(){return this.groups_.reduce((values,group)=>values.concat(group.values),[]);}
-get totalTime(){return this.total_group_.time;}
-get totalCount(){return this.total_group_.count;}}
-return{BlinkRuntimeStatsGroupCollection,RuntimeStatsEntry,RuntimeStatsGroup,RuntimeStatsGroupCollection,};});'use strict';tr.exportTo('tr.ui.e.v8',function(){const codeSearchURL_='https://cs.chromium.org/search/?sq=package:chromium&type=cs&q=';function removeBlinkPrefix_(name){if(name.startsWith('Blink_'))name=name.substring(6);return name;}
-function handleCodeSearchForV8_(event){if(event.target.parentNode===undefined)return;let name=event.target.parentNode.entryName;if(name.startsWith('API_'))name=name.substring(4);const url=codeSearchURL_+encodeURIComponent(name)+'+file:src/v8/src';window.open(url,'_blank');}
-function handleCodeSearchForBlink_(event){if(event.target.parentNode===undefined)return;const name=event.target.parentNode.entryName;const url=codeSearchURL_+
-encodeURIComponent('RuntimeCallStats::CounterId::k'+name)+'+file:src/third_party/WebKit/|src/out/Debug/';window.open(url,'_blank');}
-function createCodeSearchEl_(handleCodeSearch){const codeSearchEl=document.createElement('span');codeSearchEl.innerText='?';codeSearchEl.style.float='right';codeSearchEl.style.borderRadius='5px';codeSearchEl.style.backgroundColor='#EEE';codeSearchEl.addEventListener('click',handleCodeSearch.bind(this));return codeSearchEl;}
-const timeColumn_={title:'Time',value(row){const typeEl=document.createElement('span');typeEl.innerText=(row.time/1000.0).toFixed(3)+' ms';return typeEl;},width:'100px',cmp(a,b){return a.time-b.time;}};const countColumn_={title:'Count',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.count;return typeEl;},width:'100px',cmp(a,b){return a.count-b.count;}};function percentColumn_(title,totalTime){return{title,value(row){const typeEl=document.createElement('span');typeEl.innerText=(row.time/totalTime*100).toFixed(3)+'%';return typeEl;},width:'100px',cmp(a,b){return a.time-b.time;}};}
-function nameColumn_(handleCodeSearch,modifyName){return{title:'Name',value(row){const typeEl=document.createElement('span');let name=row.name;if(modifyName)name=modifyName(name);typeEl.innerText=name;if(!(row instanceof tr.e.v8.RuntimeStatsGroup)){typeEl.title='click ? for code search';typeEl.entryName=name;const codeSearchEl=createCodeSearchEl_(handleCodeSearch);typeEl.appendChild(codeSearchEl);}
-return typeEl;},width:'200px',showExpandButtons:true};}
-function initializeCommonOptions_(table){table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;table.sortColumnIndex=1;table.sortDescending=true;table.subRowsPropertyName='values';}
-Polymer({is:'tr-ui-e-v8-runtime-call-stats-table',ready(){this.table_=this.$.table;this.blink_rcs_table_=this.$.blink_rcs_table;this.totalTime_=0;},constructV8RCSTable_(totalTime){this.table_.tableColumns=[nameColumn_(handleCodeSearchForV8_),timeColumn_,countColumn_,percentColumn_('Percent',totalTime)];initializeCommonOptions_(this.table_);},constructBlinkRCSTable_(blinkCppTotalTime){this.blink_rcs_table_.tableColumns=[nameColumn_(handleCodeSearchForBlink_,removeBlinkPrefix_),timeColumn_,countColumn_,percentColumn_('Percent (of \'Blink C++\' + \'API\')',blinkCppTotalTime)];initializeCommonOptions_(this.blink_rcs_table_);},set slices(slices){const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(slices);if(runtimeGroupCollection.totalTime>0){this.$.v8_rcs_heading.textContent='V8 Runtime Call Stats';this.constructV8RCSTable_(runtimeGroupCollection.totalTime);this.table_.tableRows=runtimeGroupCollection.runtimeGroups;this.table_.rebuild();}
-const blinkRCSGroupCollection=runtimeGroupCollection.blinkRCSGroupCollection;if(runtimeGroupCollection.blinkCppTotalTime>0&&blinkRCSGroupCollection.totalTime>0){this.$.blink_rcs_heading.textContent='Blink Runtime Call Stats';this.constructBlinkRCSTable_(runtimeGroupCollection.blinkCppTotalTime);this.blink_rcs_table_.tableRows=blinkRCSGroupCollection.runtimeGroups;this.blink_rcs_table_.rebuild();}}});return{};});'use strict';Polymer({is:'tr-ui-e-multi-v8-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.runtimeCallStats.slices=selection;this.$.content.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-multi-v8-thread-slice-sub-view',tr.e.v8.V8ThreadSlice,{multi:true,title:'V8 slices'});'use strict';Polymer({is:'tr-ui-e-single-v8-gc-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.content.selection=selection;this.$.gcObjectsStats.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-single-v8-gc-stats-thread-slice-sub-view',tr.e.v8.V8GCStatsThreadSlice,{multi:false,title:'V8 GC stats slice'});'use strict';Polymer({is:'tr-ui-e-single-v8-ic-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.table.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-single-v8-ic-stats-thread-slice-sub-view',tr.e.v8.V8ICStatsThreadSlice,{multi:false,title:'V8 IC stats slice'});'use strict';Polymer({is:'tr-ui-e-single-v8-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.runtimeCallStats.slices=selection;this.$.content.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-single-v8-thread-slice-sub-view',tr.e.v8.V8ThreadSlice,{multi:false,title:'V8 slice'});'use strict';tr.exportTo('tr.c',function(){function ScriptingObject(){}
-ScriptingObject.prototype={onModelChanged(model){}};return{ScriptingObject,};});'use strict';tr.exportTo('tr.c',function(){function ScriptingController(brushingStateController){this.brushingStateController_=brushingStateController;this.scriptObjectNames_=[];this.scriptObjectValues_=[];this.brushingStateController.addEventListener('model-changed',this.onModelChanged_.bind(this));const typeInfos=ScriptingObjectRegistry.getAllRegisteredTypeInfos();typeInfos.forEach(function(typeInfo){this.addScriptObject(typeInfo.metadata.name,typeInfo.constructor);global[typeInfo.metadata.name]=typeInfo.constructor;},this);}
-function ScriptingObjectRegistry(){}
-const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(ScriptingObjectRegistry,options);ScriptingController.prototype={get brushingStateController(){return this.brushingStateController_;},onModelChanged_(){this.scriptObjectValues_.forEach(function(v){if(v.onModelChanged){v.onModelChanged(this.brushingStateController.model);}},this);},addScriptObject(name,value){this.scriptObjectNames_.push(name);this.scriptObjectValues_.push(value);},executeCommand(command){const f=new Function(this.scriptObjectNames_,'return eval('+command+')');return f.apply(null,this.scriptObjectValues_);}};return{ScriptingController,ScriptingObjectRegistry,};});'use strict';tr.exportTo('tr.metrics',function(){function MetricRegistry(){}
-const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};tr.b.decorateExtensionRegistry(MetricRegistry,options);function camelCaseToHackerString(camelCase){let hackerString='';for(const c of camelCase){const lowered=c.toLocaleLowerCase();if(lowered===c){hackerString+=c;}else{hackerString+='_'+lowered;}}
-return hackerString;}
-function getCallStack(){try{throw new Error();}catch(error){return error.stack;}}
-function getPathsFromStack(stack){return stack.split('\n').map(line=>{line=line.replace(/^ */,'').split(':');if(line.length<4)return'';return line[line.length-3].split('/');}).filter(x=>x);}
-MetricRegistry.checkFilename=function(metricName,opt_metricPathForTest){if(metricName==='runtimeStatsTotalMetric'||metricName==='v8AndMemoryMetrics'){return;}
-const expectedFilename=camelCaseToHackerString(metricName)+'.html';const stack=getCallStack();let metricPath=opt_metricPathForTest;if(metricPath===undefined){const paths=getPathsFromStack(stack);const METRIC_STACK_INDEX=5;if(paths.length<=METRIC_STACK_INDEX||paths[METRIC_STACK_INDEX].join('/')===paths[0].join('/')){return;}
-metricPath=paths[METRIC_STACK_INDEX].slice(paths[METRIC_STACK_INDEX].length-2);}
-if(!metricPath[1].endsWith('_test.html')&&!metricPath[1].endsWith('_test.html.js')&&metricPath[1]!==expectedFilename&&metricPath[1]!==expectedFilename+'.js'&&metricPath.join('_')!==expectedFilename&&metricPath.join('_')!==expectedFilename+'.js'){throw new Error('Expected '+metricName+' to be in a file named '+
-expectedFilename+'; actual: '+metricPath.join('/')+'; stack: '+stack.replace(/\n/g,'\n  '));}};MetricRegistry.addEventListener('will-register',function(e){const metric=e.typeInfo.constructor;if(!(metric instanceof Function)){throw new Error('Metrics must be functions.');}
-if(!metric.name.endsWith('Metric')&&!metric.name.endsWith('Metrics')){throw new Error('Metric names must end with "Metric" or "Metrics".');}
-if(metric.length<2){throw new Error('Metrics take a HistogramSet and a Model and '+'optionally an options dictionary.');}
-MetricRegistry.checkFilename(metric.name);});return{MetricRegistry,};});'use strict';tr.exportTo('tr.metrics',function(){function accessibilityMetric(histograms,model){const browserAccessibilityEventsHist=new tr.v.Histogram('browser_accessibility_events',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);browserAccessibilityEventsHist.description='Browser accessibility events time';const renderAccessibilityEventsHist=new tr.v.Histogram('render_accessibility_events',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);renderAccessibilityEventsHist.description='Render accessibility events time';const renderAccessibilityLocationsHist=new tr.v.Histogram('render_accessibility_locations',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);renderAccessibilityLocationsHist.description='Render accessibility locations time';const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(chromeHelper===undefined)return;for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){const mainThread=rendererHelper.mainThread;if(mainThread===undefined)continue;for(const slice of mainThread.getDescendantEvents()){if(!(slice instanceof tr.model.ThreadSlice))continue;if(slice.title==='RenderAccessibilityImpl::SendPendingAccessibilityEvents'){renderAccessibilityEventsHist.addSample(slice.duration,{event:new tr.v.d.RelatedEventSet(slice)});}
-if(slice.title==='RenderAccessibilityImpl::SendLocationChanges'){renderAccessibilityLocationsHist.addSample(slice.duration,{event:new tr.v.d.RelatedEventSet(slice)});}}}
-for(const browserHelper of Object.values(chromeHelper.browserHelpers)){const mainThread=browserHelper.mainThread;if(mainThread===undefined)continue;for(const slice of mainThread.getDescendantEvents()){if(slice.title==='BrowserAccessibilityManager::OnAccessibilityEvents'){browserAccessibilityEventsHist.addSample(slice.duration,{event:new tr.v.d.RelatedEventSet(slice)});}}}
-histograms.addHistogram(browserAccessibilityEventsHist);histograms.addHistogram(renderAccessibilityEventsHist);histograms.addHistogram(renderAccessibilityLocationsHist);}
-tr.metrics.MetricRegistry.register(accessibilityMetric);return{accessibilityMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const MESSAGE_LOOP_EVENT_NAME='Startup.BrowserMessageLoopStartTime';const CONTENT_START_EVENT_NAME='content::Start';const NAVIGATION_EVENT_NAME='Navigation StartToCommit';const FIRST_CONTENTFUL_PAINT_EVENT_NAME='firstContentfulPaint';const APPLICATION_START_EVENT_NAME='Startup.LoadTime.ProcessCreateToApplicationStart';function androidStartupMetric(histograms,model){let messageLoopStartEvents=[];let applicationStartEvents=[];let navigationEvents=[];const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper)return;for(const helper of chromeHelper.browserHelpers){for(const ev of helper.mainThread.asyncSliceGroup.childEvents()){if(ev.title===MESSAGE_LOOP_EVENT_NAME){messageLoopStartEvents.push(ev);}else if(ev.title===APPLICATION_START_EVENT_NAME){applicationStartEvents.push(ev);}else if(ev.title===NAVIGATION_EVENT_NAME){navigationEvents.push(ev);}}}
-let contentStartEvents=[];let firstContentfulPaintEvents=[];const rendererHelpers=chromeHelper.rendererHelpers;const pids=Object.keys(rendererHelpers);for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){if(!rendererHelper.mainThread)continue;for(const ev of rendererHelper.mainThread.sliceGroup.childEvents()){if(ev.title===FIRST_CONTENTFUL_PAINT_EVENT_NAME){firstContentfulPaintEvents.push(ev);break;}else if(ev.title===CONTENT_START_EVENT_NAME){contentStartEvents.push(ev);}}}
-let totalBrowserStarts=messageLoopStartEvents.length;let totalContentStartEvents=contentStartEvents.length;let totalFcpEvents=firstContentfulPaintEvents.length;let totalNavigations=navigationEvents.length;let totalApplicationStartEvents=applicationStartEvents.length;if(totalFcpEvents!==totalBrowserStarts||totalNavigations!==totalBrowserStarts||totalContentStartEvents!==totalBrowserStarts||totalApplicationStartEvents!==totalBrowserStarts||totalBrowserStarts===0){messageLoopStartEvents=[];contentStartEvents=[];navigationEvents=[];firstContentfulPaintEvents=[];applicationStartEvents=[];for(const proc of Object.values(model.processes)){for(const ev of proc.getDescendantEvents()){if(ev.title===MESSAGE_LOOP_EVENT_NAME){messageLoopStartEvents.push(ev);}else if(ev.title===APPLICATION_START_EVENT_NAME){applicationStartEvents.push(ev);}else if(ev.title===NAVIGATION_EVENT_NAME){navigationEvents.push(ev);}else if(ev.title===CONTENT_START_EVENT_NAME){contentStartEvents.push(ev);}}
-for(const ev of proc.getDescendantEvents()){if(ev.title===FIRST_CONTENTFUL_PAINT_EVENT_NAME){firstContentfulPaintEvents.push(ev);break;}}}
-totalBrowserStarts=messageLoopStartEvents.length;totalContentStartEvents=contentStartEvents.length;totalNavigations=navigationEvents.length;totalFcpEvents=firstContentfulPaintEvents.length;totalApplicationStartEvents=applicationStartEvents.length;}
-function orderEvents(event1,event2){return event1.start-event2.start;}
-messageLoopStartEvents.sort(orderEvents);applicationStartEvents.sort(orderEvents);contentStartEvents.sort(orderEvents);navigationEvents.sort(orderEvents);firstContentfulPaintEvents.sort(orderEvents);if(totalFcpEvents<totalBrowserStarts){throw new Error('Found fewer FCP events ('+totalFcpEvents+') than browser starts ('+totalBrowserStarts+')');}
-const messageLoopStartHistogram=histograms.createHistogram('messageloop_start_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[]);const contentStartHistogram=histograms.createHistogram('experimental_content_start_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[]);const navigationStartHistogram=histograms.createHistogram('experimental_navigation_start_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[]);const navigationCommitHistogram=histograms.createHistogram('navigation_commit_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[]);const firstContentfulPaintHistogram=histograms.createHistogram('first_contentful_paint_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[]);const applicationStartHistogram=histograms.createHistogram('process_create_to_app_start_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[]);let contentIndex=0;let navIndex=0;let fcpIndex=0;for(let loopStartIndex=0;loopStartIndex<totalBrowserStarts;){const loopStartEvent=messageLoopStartEvents[loopStartIndex];const applicationStartEvent=applicationStartEvents[loopStartIndex];if(fcpIndex===totalFcpEvents){break;}
-const contentStartEvent=contentIndex<contentStartEvents.length?contentStartEvents[contentIndex]:null;if(contentStartEvent&&contentStartEvent.start<loopStartEvent.start){contentIndex++;continue;}
-const navEvent=navIndex<navigationEvents.length?navigationEvents[navIndex]:null;if(navEvent&&navEvent.start<loopStartEvent.start){navIndex++;continue;}
-const fcpEvent=firstContentfulPaintEvents[fcpIndex];if(fcpEvent.start<loopStartEvent.start){fcpIndex++;continue;}
-loopStartIndex++;if(fcpIndex<2){continue;}
-messageLoopStartHistogram.addSample(loopStartEvent.duration,{events:new tr.v.d.RelatedEventSet([loopStartEvent])});if(contentStartEvent){contentStartHistogram.addSample(contentStartEvent.start-loopStartEvent.start,{events:new tr.v.d.RelatedEventSet([loopStartEvent,contentStartEvent])});}
-if(navEvent){navigationStartHistogram.addSample(navEvent.start-loopStartEvent.start,{events:new tr.v.d.RelatedEventSet([loopStartEvent,navEvent])});navigationCommitHistogram.addSample(navEvent.end-loopStartEvent.start,{events:new tr.v.d.RelatedEventSet([loopStartEvent,navEvent])});}
-firstContentfulPaintHistogram.addSample(fcpEvent.end-loopStartEvent.start,{events:new tr.v.d.RelatedEventSet([loopStartEvent,fcpEvent])});if(applicationStartEvent){applicationStartHistogram.addSample(applicationStartEvent.duration,{events:new tr.v.d.RelatedEventSet([applicationStartEvent])});}}}
-tr.metrics.MetricRegistry.register(androidStartupMetric);return{androidStartupMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const MAX_INPUT_EVENT_TO_STARTUP_DELAY_IN_MS=2000;const MIN_DRAW_DELAY_IN_MS=80;const MAX_DRAW_DELAY_IN_MS=2000;function findProcess(processName,model){for(const pid in model.processes){const process=model.processes[pid];if(process.name===processName){return process;}}
-return undefined;}
-function findThreads(process,threadPrefix){if(process===undefined)return undefined;const threads=[];for(const tid in process.threads){const thread=process.threads[tid];if(thread.name.startsWith(threadPrefix)){threads.push(thread);}}
-return threads;}
-function findUIThread(process){if(process===undefined)return undefined;const threads=findThreads(process,'UI Thread');if(threads!==undefined&&threads.length===1){return threads[0];}
-return process.threads[process.pid];}
-function findLaunchSlices(model){const launches=[];const binders=findThreads(findProcess('system_server',model),'Binder');for(const binderId in binders){const binder=binders[binderId];for(const sliceId in binder.asyncSliceGroup.slices){const slice=binder.asyncSliceGroup.slices[sliceId];if(slice.title.startsWith('launching:')){launches.push(slice);}}}
-return launches;}
-function findDrawSlice(appName,startNotBefore,model){let drawSlice=undefined;const thread=findUIThread(findProcess(appName,model));if(thread===undefined)return undefined;for(const sliceId in thread.sliceGroup.slices){const slice=thread.sliceGroup.slices[sliceId];if(slice.start<startNotBefore+MIN_DRAW_DELAY_IN_MS||slice.start>startNotBefore+MAX_DRAW_DELAY_IN_MS)continue;if(slice.title!=='draw')continue;if(drawSlice===undefined||slice.start<drawSlice.start){drawSlice=slice;}}
-return drawSlice;}
-function findInputEventSlice(endNotAfter,model){const endNotBefore=endNotAfter-MAX_INPUT_EVENT_TO_STARTUP_DELAY_IN_MS;let inputSlice=undefined;const systemUi=findUIThread(findProcess('com.android.systemui',model));if(systemUi===undefined)return undefined;for(const sliceId in systemUi.asyncSliceGroup.slices){const slice=systemUi.asyncSliceGroup.slices[sliceId];if(slice.end>endNotAfter||slice.end<endNotBefore)continue;if(slice.title!=='deliverInputEvent')continue;if(inputSlice===undefined||slice.end>inputSlice.end){inputSlice=slice;}}
-return inputSlice;}
-function computeStartupTimeInMs(appName,launchSlice,model){let startupStart=launchSlice.start;let startupEnd=launchSlice.end;const drawSlice=findDrawSlice(appName,launchSlice.end,model);if(drawSlice!==undefined){startupEnd=drawSlice.end;}
-const inputSlice=findInputEventSlice(launchSlice.start,model);if(inputSlice!==undefined){startupStart=inputSlice.start;}
-return startupEnd-startupStart;}
-function measureStartup(histograms,model){const launches=findLaunchSlices(model);for(const sliceId in launches){const launchSlice=launches[sliceId];const appName=launchSlice.title.split(': ')[1];const startupMs=computeStartupTimeInMs(appName,launchSlice,model);histograms.createHistogram(`android:systrace:startup:${appName}`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,startupMs);}}
-function measureThreadStates(histograms,model,rangeOfInterest){for(const pid in model.processes){const process=model.processes[pid];if(process.name===undefined)continue;let hasSlices=false;let timeRunning=0;let timeRunnable=0;let timeSleeping=0;let timeUninterruptible=0;let timeBlockIO=0;let timeUnknown=0;for(const tid in process.threads){const thread=process.threads[tid];if(thread.timeSlices===undefined)continue;for(const sliceId in thread.timeSlices){const slice=thread.timeSlices[sliceId];const sliceRange=tr.b.math.Range.fromExplicitRange(slice.start,slice.end);const intersection=rangeOfInterest.findIntersection(sliceRange);const duration=intersection.duration;if(duration===0)continue;hasSlices=true;if(slice.title==='Running'){timeRunning+=duration;}else if(slice.title==='Runnable'){timeRunnable+=duration;}else if(slice.title==='Sleeping'){timeSleeping+=duration;}else if(slice.title.startsWith('Uninterruptible')){timeUninterruptible+=duration;if(slice.title.includes('Block I/O'))timeBlockIO+=duration;}else{timeUnknown+=duration;}}}
-if(hasSlices){const wall=rangeOfInterest.max-rangeOfInterest.min;histograms.createHistogram(`android:systrace:threadtime:${process.name}:running`,tr.b.Unit.byName.normalizedPercentage,timeRunning/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:runnable`,tr.b.Unit.byName.normalizedPercentage,timeRunnable/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:sleeping`,tr.b.Unit.byName.normalizedPercentage,timeSleeping/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:blockio`,tr.b.Unit.byName.normalizedPercentage,timeBlockIO/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:uninterruptible`,tr.b.Unit.byName.normalizedPercentage,timeUninterruptible/wall);if(timeUnknown>0){histograms.createHistogram(`android:systrace:threadtime:${process.name}:unknown`,tr.b.Unit.byName.normalizedPercentage,timeUnknown/wall);}}}}
-function androidSystraceMetric(histograms,model,options){let rangeOfInterest=model.bounds;if(options!==undefined&&options.rangeOfInterest!==undefined){rangeOfInterest=options.rangeOfInterest;}
-measureStartup(histograms,model);measureThreadStates(histograms,model,rangeOfInterest);}
-tr.metrics.MetricRegistry.register(androidSystraceMetric,{supportsRangeOfInterest:true});return{androidSystraceMetric,};});'use strict';tr.exportTo('tr.b.math',function(){const PERCENTILE_PRECISION=1e-7;function PiecewiseLinearFunction(){this.pieces=[];}
-PiecewiseLinearFunction.prototype={push(x1,y1,x2,y2){if(x1>=x2){throw new Error('Invalid segment');}
-if(this.pieces.length>0&&this.pieces[this.pieces.length-1].x2>x1){throw new Error('Potentially overlapping segments');}
-if(x1<x2){this.pieces.push(new Piece(x1,y1,x2,y2));}},partBelow(y){return this.pieces.reduce((acc,p)=>(acc+p.partBelow(y)),0);},get min(){return this.pieces.reduce((acc,p)=>Math.min(acc,p.min),Infinity);},get max(){return this.pieces.reduce((acc,p)=>Math.max(acc,p.max),-Infinity);},get average(){let weightedSum=0;let totalWeight=0;this.pieces.forEach(function(piece){weightedSum+=piece.width*piece.average;totalWeight+=piece.width;});if(totalWeight===0)return 0;return weightedSum/totalWeight;},percentile(percent){if(!(percent>=0&&percent<=1)){throw new Error('percent must be [0,1]');}
-let lower=this.min;let upper=this.max;const total=this.partBelow(upper);if(total===0)return 0;while(upper-lower>PERCENTILE_PRECISION){const middle=(lower+upper)/2;const below=this.partBelow(middle);if(below/total<percent){lower=middle;}else{upper=middle;}}
-return(lower+upper)/2;}};function Piece(x1,y1,x2,y2){this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;}
-Piece.prototype={partBelow(y){const width=this.width;if(width===0)return 0;const minY=this.min;const maxY=this.max;if(y>=maxY)return width;if(y<minY)return 0;return(y-minY)/(maxY-minY)*width;},get min(){return Math.min(this.y1,this.y2);},get max(){return Math.max(this.y1,this.y2);},get average(){return(this.y1+this.y2)/2;},get width(){return this.x2-this.x1;}};return{PiecewiseLinearFunction,};});'use strict';tr.exportTo('tr.metrics.v8.utils',function(){const IDLE_TASK_EVENT='SingleThreadIdleTaskRunner::RunTask';const V8_EXECUTE='V8.Execute';const GC_EVENT_PREFIX='V8.GC';const FULL_GC_EVENT='V8.GCCompactor';const LOW_MEMORY_EVENT='V8.GCLowMemoryNotification';const MAJOR_GC_EVENT='MajorGC';const MINOR_GC_EVENT='MinorGC';const TOP_GC_EVENTS={'V8.GCCompactor':'v8-gc-full-mark-compactor','V8.GCFinalizeMC':'v8-gc-latency-mark-compactor','V8.GCFinalizeMCReduceMemory':'v8-gc-memory-mark-compactor','V8.GCIncrementalMarking':'v8-gc-incremental-step','V8.GCIncrementalMarkingFinalize':'v8-gc-incremental-finalize','V8.GCIncrementalMarkingStart':'v8-gc-incremental-start','V8.GCPhantomHandleProcessingCallback':'v8-gc-phantom-handle-callback','V8.GCScavenger':'v8-gc-scavenger'};const MARK_COMPACTOR_EVENTS=new Set(['V8.GCCompactor','V8.GCFinalizeMC','V8.GCFinalizeMCReduceMemory','V8.GCIncrementalMarking','V8.GCIncrementalMarkingFinalize','V8.GCIncrementalMarkingStart','V8.GCPhantomHandleProcessingCallback']);const LOW_MEMORY_MARK_COMPACTOR='v8-gc-low-memory-mark-compactor';function findParent(event,predicate){let parent=event.parentSlice;while(parent){if(predicate(parent)){return parent;}
-parent=parent.parentSlice;}
-return null;}
-function isIdleTask(event){return event.title===IDLE_TASK_EVENT;}
-function isLowMemoryEvent(event){return event.title===LOW_MEMORY_EVENT;}
-function isV8Event(event){return event.title.startsWith('V8.');}
-function isV8ExecuteEvent(event){return event.title===V8_EXECUTE;}
-function isTopV8ExecuteEvent(event){return isV8ExecuteEvent(event)&&findParent(isV8ExecuteEvent)===null;}
-function isGarbageCollectionEvent(event){return event.title&&event.title.startsWith(GC_EVENT_PREFIX)&&event.title!==LOW_MEMORY_EVENT;}
-function isTopGarbageCollectionEvent(event){return event.title in TOP_GC_EVENTS;}
-function isForcedGarbageCollectionEvent(event){return findParent(event,isLowMemoryEvent)!==null;}
-function isSubGarbageCollectionEvent(event){return isGarbageCollectionEvent(event)&&event.parentSlice&&(isTopGarbageCollectionEvent(event.parentSlice)||event.parentSlice.title===MAJOR_GC_EVENT||event.parentSlice.title===MINOR_GC_EVENT);}
-function isNotForcedTopGarbageCollectionEvent(event){return tr.metrics.v8.utils.isTopGarbageCollectionEvent(event)&&!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event);}
-function isNotForcedSubGarbageCollectionEvent(event){return tr.metrics.v8.utils.isSubGarbageCollectionEvent(event)&&!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event);}
-function isFullMarkCompactorEvent(event){return event.title==='V8.GCCompactor';}
-function isMarkCompactorSummaryEvent(event){return event.title==='V8.GCMarkCompactorSummary';}
-function isMarkCompactorMarkingSummaryEvent(event){return event.title==='V8.GCMarkCompactorMarkingSummary';}
-function isScavengerStackScanningEvent(event){return event.title==='V8.GCScavengerStackScanning';}
-function isIncrementalMarkingEvent(event){return event.title.startsWith('V8.GCIncrementalMarking');}
-function isLatencyMarkCompactorEvent(event){return event.title==='V8.GCFinalizeMC';}
-function isMemoryMarkCompactorEvent(event){return event.title==='V8.GCFinalizeMCReduceMemory';}
-function isScavengerEvent(event){return event.title==='V8.GCScavenger';}
-function isCompileOptimizeRCSCategory(name){return name==='Optimize';}
-function isCompileUnoptimizeRCSCategory(name){return name==='Compile';}
-function isCompileParseRCSCategory(name){return name==='Parse';}
-function isCompileRCSCategory(name){return name==='Compile'||name==='Optimize'||name==='Parse';}
-function isV8RCSEvent(event){return event instanceof tr.e.v8.V8ThreadSlice;}
-function isMarkCompactorEvent(event){return MARK_COMPACTOR_EVENTS.has(event.title);}
-function isNotForcedMarkCompactorEvent(event){return!isForcedGarbageCollectionEvent(event)&&isMarkCompactorEvent(event);}
-function forcedGCEventName(){return LOW_MEMORY_EVENT;}
-function topGarbageCollectionEventName(event){if(event.title===FULL_GC_EVENT){if(findParent(event,isLowMemoryEvent)){return LOW_MEMORY_MARK_COMPACTOR;}}
-return TOP_GC_EVENTS[event.title];}
-function topGarbageCollectionEventNames(){return Object.values(TOP_GC_EVENTS);}
-function subGarbageCollectionEventName(event){const topEvent=findParent(event,isTopGarbageCollectionEvent);const prefix=topEvent?topGarbageCollectionEventName(topEvent):'unknown';const name=event.title.replace('V8.GC_MC_','').replace('V8.GC_SCAVENGER_','').replace('V8.GC_','').replace(/_/g,'-').toLowerCase();return prefix+'-'+name;}
-function jsExecutionThreads(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);let threads=[];for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){if(rendererHelper.isChromeTracingUI)continue;threads.push(rendererHelper.mainThread);threads=threads.concat(rendererHelper.dedicatedWorkerThreads);threads=threads.concat(rendererHelper.serviceWorkerThreads);threads=threads.concat(rendererHelper.foregroundWorkerThreads);}
-return threads;}
-function groupAndProcessEvents(model,filterCallback,groupCallback,processCallback,groups){const groupToEvents={};if(groups){for(const group of groups){groupToEvents[group]=[];}}
-const threads=jsExecutionThreads(model);for(const thread of threads){for(const event of thread.sliceGroup.childEvents()){if(!filterCallback(event))continue;const group=groupCallback(event);if(groups&&!(group in groupToEvents)){continue;}
-groupToEvents[group]=groupToEvents[group]||[];groupToEvents[group].push(event);}}
-for(const[group,events]of Object.entries(groupToEvents)){processCallback(group,events);}}
-function filterEvents(model,filterCallback){const threads=jsExecutionThreads(model);const events=[];for(const thread of threads){for(const event of thread.sliceGroup.childEvents()){if(!filterCallback(event))continue;events.push(event);}}
-return events;}
-function filterAndOrderEvents(model,filterCallback,keyCallback){const threads=jsExecutionThreads(model);const events={};for(const thread of threads){for(const event of thread.sliceGroup.childEvents()){if(!filterCallback(event))continue;const key=keyCallback(event);if(events[key]){events[key].push(event);}else{events[key]=[event];}}}
-return events;}
-function unionOfIntervals(intervals){if(intervals.length===0)return[];return tr.b.math.mergeRanges(intervals.map(x=>{return{min:x.start,max:x.end};}),1e-6,function(ranges){return{start:ranges.reduce((acc,x)=>Math.min(acc,x.min),ranges[0].min),end:ranges.reduce((acc,x)=>Math.max(acc,x.max),ranges[0].max)};});}
-function hasV8Stats(globalMemoryDump){let v8stats=undefined;globalMemoryDump.iterateContainerDumps(function(dump){v8stats=v8stats||dump.getMemoryAllocatorDumpByFullName('v8');});return!!v8stats;}
-function rangeForMemoryDumps(model){const startOfFirstDumpWithV8=model.globalMemoryDumps.filter(hasV8Stats).reduce((start,dump)=>Math.min(start,dump.start),Infinity);if(startOfFirstDumpWithV8===Infinity)return new tr.b.math.Range();return tr.b.math.Range.fromExplicitRange(startOfFirstDumpWithV8,Infinity);}
-class WindowEndpoint{constructor(start,points){this.points=points;this.lastIndex=-1;this.position=start;this.distanceUntilNextPoint=points[0].position-start;this.cummulativePause=0;this.stackDepth=0;}
-advance(delta){if(delta<this.distanceUntilNextPoint){this.position+=delta;this.cummulativePause+=this.stackDepth>0?delta:0;this.distanceUntilNextPoint=this.points[this.lastIndex+1].position-this.position;}else{this.position+=this.distanceUntilNextPoint;this.cummulativePause+=this.stackDepth>0?this.distanceUntilNextPoint:0;this.distanceUntilNextPoint=0;this.lastIndex++;if(this.lastIndex<this.points.length){this.stackDepth+=this.points[this.lastIndex].delta;if(this.lastIndex+1<this.points.length){this.distanceUntilNextPoint=this.points[this.lastIndex+1].position-this.position;}}}}}
-function mutatorUtilization(start,end,timeWindow,intervals){const mu=new tr.b.math.PiecewiseLinearFunction();if(end-start<=timeWindow){return mu;}
-if(intervals.length===0){mu.push(start,1.0,end-timeWindow,1.0);return mu;}
-intervals=unionOfIntervals(intervals);const points=[];for(const interval of intervals){points.push({position:interval.start,delta:1});points.push({position:interval.end,delta:-1});}
-points.sort((a,b)=>a.position-b.position);points.push({position:end,delta:0});const left=new WindowEndpoint(start,points);const right=new WindowEndpoint(start,points);const EPSILON=1e-6;while(right.position-left.position<timeWindow-EPSILON){right.advance(timeWindow-(right.position-left.position));}
-while(right.lastIndex<points.length){const distanceUntilNextPoint=Math.min(left.distanceUntilNextPoint,right.distanceUntilNextPoint);const position1=left.position;const value1=right.cummulativePause-left.cummulativePause;left.advance(distanceUntilNextPoint);right.advance(distanceUntilNextPoint);if(distanceUntilNextPoint>0){const position2=left.position;const value2=right.cummulativePause-left.cummulativePause;mu.push(position1,1.0-value1/timeWindow,position2,1.0-value2/timeWindow);}}
-return mu;}
-function addMutatorUtilization(metricName,eventFilter,timeWindows,rendererHelpers,histograms){const histogramMap=new Map();for(const timeWindow of timeWindows){const summaryOptions={avg:false,count:false,max:false,min:true,std:false,sum:false};const description=`The minimum mutator utilization in ${timeWindow}ms time window`;const histogram=histograms.createHistogram(`${metricName}-${timeWindow}ms_window`,tr.b.Unit.byName.normalizedPercentage_biggerIsBetter,[],{summaryOptions,description});histogramMap.set(timeWindow,histogram);}
-for(const rendererHelper of rendererHelpers){if(rendererHelper.isChromeTracingUI)continue;if(rendererHelper.mainThread===undefined)continue;const pauses=[];for(const event of rendererHelper.mainThread.sliceGroup.childEvents()){if(eventFilter(event)&&event.end>event.start){pauses.push({start:event.start,end:event.end});}}
-pauses.sort((a,b)=>a.start-b.start);const start=rendererHelper.mainThread.bounds.min;const end=rendererHelper.mainThread.bounds.max;for(const timeWindow of timeWindows){const mu=mutatorUtilization(start,end,timeWindow,pauses);histogramMap.get(timeWindow).addSample(mu.min);}}}
-return{addMutatorUtilization,findParent,forcedGCEventName,filterEvents,filterAndOrderEvents,groupAndProcessEvents,isForcedGarbageCollectionEvent,isFullMarkCompactorEvent,isGarbageCollectionEvent,isIdleTask,isIncrementalMarkingEvent,isLatencyMarkCompactorEvent,isLowMemoryEvent,isMarkCompactorSummaryEvent,isMarkCompactorMarkingSummaryEvent,isMemoryMarkCompactorEvent,isNotForcedMarkCompactorEvent,isNotForcedTopGarbageCollectionEvent,isNotForcedSubGarbageCollectionEvent,isScavengerEvent,isScavengerStackScanningEvent,isSubGarbageCollectionEvent,isTopGarbageCollectionEvent,isTopV8ExecuteEvent,isV8Event,isV8ExecuteEvent,isV8RCSEvent,isCompileRCSCategory,isCompileOptimizeRCSCategory,isCompileUnoptimizeRCSCategory,isCompileParseRCSCategory,mutatorUtilization,rangeForMemoryDumps,subGarbageCollectionEventName,topGarbageCollectionEventName,topGarbageCollectionEventNames,unionOfIntervals,};});'use strict';tr.exportTo('tr.metrics.blink',function(){const BLINK_NON_AGGREGATED_GC_EVENTS_NAMES_MAP={'BlinkGC.AtomicPauseMarkEpilogue':'blink-gc-atomic-pause-mark-epilogue','BlinkGC.AtomicPauseMarkPrologue':'blink-gc-atomic-pause-mark-prologue','BlinkGC.AtomicPauseMarkRoots':'blink-gc-atomic-pause-mark-roots','BlinkGC.IncrementalMarkingStartMarking':'blink-gc-incremental-start','BlinkGC.IncrementalMarkingStep':'blink-gc-incremental-step','BlinkGC.UnifiedMarkingStep':'blink-gc-unified-marking-by-v8','BlinkGC.CompleteSweep':'blink-gc-complete-sweep','BlinkGC.LazySweepInIdle':'blink-gc-sweep-task-foreground','BlinkGC.LazySweepOnAllocation':'blink-gc-sweep-allocation','BlinkGC.AtomicPauseSweepAndCompact':'blink-gc-atomic-pause-sweep-and-compact'};const BLINK_NON_AGGREGATED_GC_EVENTS_NEW_NAMES_MAP={'BlinkGC.AtomicPauseMarkEpilogue':'blink:gc:main_thread:cycle:full:atomic:mark:epilogue','BlinkGC.AtomicPauseMarkPrologue':'blink:gc:main_thread:cycle:full:atomic:mark:prologue','BlinkGC.AtomicPauseMarkRoots':'blink:gc:main_thread:cycle:full:atomic:mark:roots','BlinkGC.IncrementalMarkingStartMarking':'blink:gc:main_thread:cycle:full:incremental:mark:start','BlinkGC.IncrementalMarkingStep':'blink:gc:main_thread:cycle:full:incremental:mark:step','BlinkGC.UnifiedMarkingStep':'unified:gc:main_thread:cycle:full:mark:step','BlinkGC.CompleteSweep':'blink:gc:main_thread:cycle:full:sweep:complete','BlinkGC.LazySweepInIdle':'blink:gc:main_thread:cycle:full:sweep:idle','BlinkGC.LazySweepOnAllocation':'blink:gc:main_thread:cycle:full:sweep:on_allocation','BlinkGC.AtomicPauseSweepAndCompact':'blink:gc:main_thread:cycle:full:atomic:sweep:compact'};const BLINK_TOP_GC_ROOTS_MARKING_EVENTS=['BlinkGC.VisitRoots'];const BLINK_GC_ATOMIC_PAUSE_TRANSITIVE_CLOSURE_EVENTS=['BlinkGC.AtomicPauseMarkTransitiveClosure'];const BLINK_GC_FOREGROUND_MARKING_TRANSITIVE_CLOSURE_EVENTS=['BlinkGC.AtomicPauseMarkTransitiveClosure','BlinkGC.IncrementalMarkingStep','BlinkGC.UnifiedMarkingStep'];const BLINK_TOP_GC_FOREGROUND_MARKING_EVENTS=['BlinkGC.AtomicPauseMarkEpilogue','BlinkGC.AtomicPauseMarkPrologue','BlinkGC.AtomicPauseMarkRoots','BlinkGC.IncrementalMarkingStartMarking',].concat(BLINK_GC_FOREGROUND_MARKING_TRANSITIVE_CLOSURE_EVENTS);const BLINK_GC_FORCED_FOREGROUND_MARKING_EVENTS=['BlinkGC.AtomicPauseMarkEpilogue','BlinkGC.AtomicPauseMarkPrologue','BlinkGC.AtomicPauseMarkRoots','BlinkGC.IncrementalMarkingStartMarking','BlinkGC.MarkBailOutObjects','BlinkGC.MarkFlushV8References','BlinkGC.MarkFlushEphemeronPairs',];const BLINK_TOP_GC_BACKGROUND_MARKING_EVENTS=['BlinkGC.ConcurrentMarkingStep'];const BLINK_TOP_GC_FOREGROUND_SWEEPING_EVENTS=['BlinkGC.CompleteSweep','BlinkGC.LazySweepInIdle','BlinkGC.LazySweepOnAllocation'];const BLINK_TOP_GC_BACKGROUND_SWEEPING_EVENTS=['BlinkGC.ConcurrentSweepingStep'];const BLINK_TOP_GC_EVENTS=Object.keys(BLINK_NON_AGGREGATED_GC_EVENTS_NAMES_MAP).concat(BLINK_GC_ATOMIC_PAUSE_TRANSITIVE_CLOSURE_EVENTS);const ATOMIC_PAUSE_EVENTS=['BlinkGC.AtomicPauseMarkEpilogue','BlinkGC.AtomicPauseMarkPrologue','BlinkGC.AtomicPauseMarkRoots','BlinkGC.AtomicPauseMarkTransitiveClosure','BlinkGC.AtomicPauseSweepAndCompact'];function blinkGarbageCollectionEventName(event){return BLINK_NON_AGGREGATED_GC_EVENTS_NAMES_MAP[event.title];}
-function blinkGarbageCollectionEventNames(){return Object.values(BLINK_NON_AGGREGATED_GC_EVENTS_NAMES_MAP);}
-function blinkGarbageCollectionEventNewName(event){return BLINK_NON_AGGREGATED_GC_EVENTS_NEW_NAMES_MAP[event.title];}
-function blinkGarbageCollectionEventNewNames(){return Object.values(BLINK_NON_AGGREGATED_GC_EVENTS_NEW_NAMES_MAP);}
-function isNonForcedEvent(event){return(!event.args||!event.args.forced)&&!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event);}
-function isNonForcedBlinkGarbageCollectionEvent(event){return BLINK_TOP_GC_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedNonAggregatedBlinkGarbageCollectionEvent(event){return event.title in BLINK_NON_AGGREGATED_GC_EVENTS_NAMES_MAP&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionAtomicPauseEvent(event){return ATOMIC_PAUSE_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionRootsMarkingEvent(event){return BLINK_TOP_GC_ROOTS_MARKING_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function
-isNonForcedBlinkGarbageCollectionMarkingTransitiveColsureEvent(event){return BLINK_GC_FOREGROUND_MARKING_TRANSITIVE_CLOSURE_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function
-isNonForcedBlinkGarbageCollectionAtomicPauseTransitiveColsureEvent(event){return BLINK_GC_ATOMIC_PAUSE_TRANSITIVE_CLOSURE_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionForegroundMarkingEvent(event){return BLINK_TOP_GC_FOREGROUND_MARKING_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionForcedForegroundMarkEvent(event){return BLINK_GC_FORCED_FOREGROUND_MARKING_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionBackgroundMarkingEvent(event){return BLINK_TOP_GC_BACKGROUND_MARKING_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionForegroundSweepingEvent(event){return BLINK_TOP_GC_FOREGROUND_SWEEPING_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonForcedBlinkGarbageCollectionBackgroundSweepingEvent(event){return BLINK_TOP_GC_BACKGROUND_SWEEPING_EVENTS.includes(event.title)&&isNonForcedEvent(event);}
-function isNonNestedNonForcedBlinkGarbageCollectionEvent(event){return isNonForcedBlinkGarbageCollectionEvent(event)&&!tr.metrics.v8.utils.findParent(event,tr.metrics.v8.utils.isGarbageCollectionEvent);}
-function blinkGcMetric(histograms,model){addDurationOfTopEvents(histograms,model);addDurationOfAtomicPause(histograms,model);addDurationOfAtomicPauseTransitiveClosure(histograms,model);addTotalDurationOfTopEvents(histograms,model);addTotalDurationOfBlinkAndV8TopEvents(histograms,model);addTotalDurationOfRootsMarking(histograms,model);addTotalDurationOfMarkingTransitiveClosure(histograms,model);addTotalDurationOfForegroundMarking(histograms,model);addTotalDurationOfForcedForegroundMarking(histograms,model);addTotalDurationOfBackgroundMarking(histograms,model);addTotalDurationOfForegroundSweeping(histograms,model);addTotalDurationOfBackgroundSweeping(histograms,model);}
-function getEventEpochUniqueId(event){return event.parentContainer.parent.stableId+':'+event.args.epoch;}
-tr.metrics.MetricRegistry.register(blinkGcMetric);const CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,20,200).addExponentialBins(200,100);function createNumericForEventTime(name){const n=new tr.v.Histogram(name,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:true,max:true,min:true,std:true,sum:true,percentile:[0.90]});return n;}
-function addDurationOfTopEvents(histograms,model){const nameToNumeric={};const nameToEpochNumeric={};for(const name of blinkGarbageCollectionEventNames()){nameToNumeric[name]=createNumericForEventTime(name);}
-for(const name of blinkGarbageCollectionEventNewNames()){nameToEpochNumeric[name]=createNumericForEventTime(name);}
-tr.metrics.v8.utils.groupAndProcessEvents(model,isNonForcedNonAggregatedBlinkGarbageCollectionEvent,getEventEpochUniqueId,function(epoch,events){const namesToPerEpochDurations={};for(const event of events){nameToNumeric[blinkGarbageCollectionEventName(event)].addSample(event.cpuDuration);const name=blinkGarbageCollectionEventNewName(event);namesToPerEpochDurations[name]=(namesToPerEpochDurations[name]||0)+event.cpuDuration;}
-for(const name in namesToPerEpochDurations){nameToEpochNumeric[name].addSample(namesToPerEpochDurations[name]);}});for(const name of blinkGarbageCollectionEventNames()){histograms.addHistogram(nameToNumeric[name]);}
-for(const name of blinkGarbageCollectionEventNewNames()){histograms.addHistogram(nameToEpochNumeric[name]);}}
-function addIndividualDurationsOfEvents(histograms,model,name,filter){const cpuDuration=createNumericForEventTime(name);tr.metrics.v8.utils.groupAndProcessEvents(model,filter,event=>name,function(group,events){for(const event of events){cpuDuration.addSample(event.cpuDuration);}},[name]);histograms.addHistogram(cpuDuration);}
-function addPerEpochDurationsOfEvents(histograms,model,name,filter){const cpuDuration=createNumericForEventTime(name);tr.metrics.v8.utils.groupAndProcessEvents(model,filter,getEventEpochUniqueId,function(epoch,events){cpuDuration.addSample(events.reduce((acc,current)=>acc+current.cpuDuration,0));});histograms.addHistogram(cpuDuration);}
-function addDurationOfAtomicPause(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-atomic-pause',isNonForcedBlinkGarbageCollectionAtomicPauseEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:atomic',isNonForcedBlinkGarbageCollectionAtomicPauseEvent);}
-function addDurationOfAtomicPauseTransitiveClosure(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-atomic-pause-mark-transitive-closure',isNonForcedBlinkGarbageCollectionAtomicPauseTransitiveColsureEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:atomic:mark:transitive_closure',isNonForcedBlinkGarbageCollectionAtomicPauseTransitiveColsureEvent);}
-function addTotalDurationOfTopEvents(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-total',isNonForcedBlinkGarbageCollectionEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full',isNonForcedBlinkGarbageCollectionEvent);}
-function addTotalDurationOfRootsMarking(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-mark-roots',isNonForcedBlinkGarbageCollectionRootsMarkingEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:mark:roots',isNonForcedBlinkGarbageCollectionRootsMarkingEvent);}
-function addTotalDurationOfMarkingTransitiveClosure(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-mark-transitive-closure',isNonForcedBlinkGarbageCollectionMarkingTransitiveColsureEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:mark:transitive_closure',isNonForcedBlinkGarbageCollectionMarkingTransitiveColsureEvent);}
-function addTotalDurationOfForegroundMarking(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-mark-foreground',isNonForcedBlinkGarbageCollectionForegroundMarkingEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:mark',isNonForcedBlinkGarbageCollectionForegroundMarkingEvent);}
-function addTotalDurationOfForcedForegroundMarking(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-mark-foreground-forced',isNonForcedBlinkGarbageCollectionForcedForegroundMarkEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:mark:forced',isNonForcedBlinkGarbageCollectionForcedForegroundMarkEvent);}
-function addTotalDurationOfBackgroundMarking(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-mark-background',isNonForcedBlinkGarbageCollectionBackgroundMarkingEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:concurrent_thread:cycle:full:mark',isNonForcedBlinkGarbageCollectionBackgroundMarkingEvent);}
-function addTotalDurationOfForegroundSweeping(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-sweep-foreground',isNonForcedBlinkGarbageCollectionForegroundSweepingEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:main_thread:cycle:full:sweep',isNonForcedBlinkGarbageCollectionForegroundSweepingEvent);}
-function addTotalDurationOfBackgroundSweeping(histograms,model){addIndividualDurationsOfEvents(histograms,model,'blink-gc-sweep-background',isNonForcedBlinkGarbageCollectionBackgroundSweepingEvent);addPerEpochDurationsOfEvents(histograms,model,'blink:gc:concurrent_thread:cycle:full:sweep',isNonForcedBlinkGarbageCollectionBackgroundSweepingEvent);}
-function isV8OrBlinkTopLevelGarbageCollectionEvent(event){return tr.metrics.v8.utils.isNotForcedTopGarbageCollectionEvent(event)||isNonNestedNonForcedBlinkGarbageCollectionEvent(event);}
-function addTotalDurationOfBlinkAndV8TopEvents(histograms,model){addIndividualDurationsOfEvents(histograms,model,'unified-gc-total',isV8OrBlinkTopLevelGarbageCollectionEvent);}
-return{blinkGcMetric,};});'use strict';tr.exportTo('tr.metrics.blink',function(){function leakDetectionMetric(histograms,model){const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper===undefined){throw new Error('Chrome is not present.');}
-const rendererHelpers=modelHelper.rendererHelpers;if(Object.keys(rendererHelpers).length===0){throw new Error('Renderer process is not present.');}
-const pids=Object.keys(rendererHelpers);const chromeDumps=tr.metrics.sh.splitGlobalDumpsByBrowserName(model,undefined).get('chrome');const sumCounter=new Map();for(const pid of pids){for(const[key,count]of countLeakedBlinkObjects(chromeDumps,pid)){sumCounter.set(key,(sumCounter.get(key)||0)+count);}}
-for(const[key,count]of sumCounter){histograms.createHistogram('Leaked '+key,tr.b.Unit.byName.count_smallerIsBetter,count);}
-for(const[key,count]of sumCounter){if(count>0){throw new Error('Memory leak is found.');}}}
-tr.metrics.MetricRegistry.register(leakDetectionMetric);function countLeakedBlinkObjects(dumps,pid){if(dumps===undefined||dumps.length<2){throw new Error('Expected at least two memory dumps.');}
-const firstCounter=countBlinkObjects(dumps[0],pid);const lastCounter=countBlinkObjects(dumps[dumps.length-1],pid);const diffCounter=new Map();for(const[key,lastCount]of lastCounter){diffCounter.set(key,lastCount-firstCounter.get(key));}
-return diffCounter;}
-function countBlinkObjects(dump,pid){const counter=new Map();const processesMemoryDumps=dump.processMemoryDumps;if(processesMemoryDumps[pid]===undefined)return counter;const blinkObjectsDump=processesMemoryDumps[pid].memoryAllocatorDumps.find(dump=>dump.fullName==='blink_objects');for(const v of blinkObjectsDump.children){counter.set(v.name,v.numerics.object_count.value);}
-return counter;}
-return{leakDetectionMetric,};});'use strict';tr.exportTo('tr.metrics',function(){function blinkResourceMetric(histograms,model,opt_options){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper){return;}
-const CATEGORY='blink';const NAME='ResourceFetcher::requestResource';let count=0;for(const helper of Object.values(chromeHelper.rendererHelpers)){if(helper.isChromeTracingUI)continue;const events=tr.e.chrome.EventFinderUtils.getMainThreadEvents(helper,NAME,CATEGORY);for(const event of events){count++;}}
-histograms.createHistogram('blinkRequestResourceCount',tr.b.Unit.byName.count,count);}
-tr.metrics.MetricRegistry.register(blinkResourceMetric,{supportsRangeOfInterest:false,});return{blinkResourceMetric,};});'use strict';tr.exportTo('tr.metrics.console',function(){const COUNT_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1e4,30);const SUMMARY_OPTIONS=tr.v.Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS;const SOURCES=['all','js','network'];function consoleErrorMetric(histograms,model){const counts={};for(const source of SOURCES){counts[source]={count:0,details:[]};}
-for(const slice of model.getDescendantEvents()){if(slice.category==='blink.console'&&slice.title==='ConsoleMessage::Error'){const source=slice.args.source.toLowerCase();counts.all.count++;if(slice.args.message){counts.all.details.push({pid:slice.getProcess().pid,...slice.args.message});}
-if(source in counts){counts[source].count++;if(slice.args.message){counts[source].details.push({pid:slice.getProcess().pid,...slice.args.message});}}}
-if(slice.category==='v8.console'&&(slice.title==='V8ConsoleMessage::Exception'||slice.title==='V8ConsoleMessage::Error'||slice.title==='V8ConsoleMessage::Assert')){counts.all.count++;counts.js.count++;}}
-for(const source of SOURCES){const hist=histograms.createHistogram(`console:error:${source}`,tr.b.Unit.byName.count_smallerIsBetter,{value:counts[source].count,diagnostics:{details:new tr.v.d.GenericSet(counts[source].details)}},{description:`Number of ${source} console error messages`,summaryOptions:SUMMARY_OPTIONS,});}}
-tr.metrics.MetricRegistry.register(consoleErrorMetric);return{consoleErrorMetric,};});'use strict';tr.exportTo('tr.metrics',function(){function countSumMetric(histograms,model,opt_options){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper){return;}
-const CATEGORY='benchmark';const NAME='count_sum';const counts=new Map();const sums=new Map();for(const pid in chromeHelper.rendererHelpers){const helper=chromeHelper.rendererHelpers[pid];if(helper.isChromeTracingUI)continue;const events=tr.e.chrome.EventFinderUtils.getMainThreadEvents(helper,NAME,CATEGORY);for(const event of events){const c=event.args.counter;if(!c){continue;}
-if(!counts.get(c)){counts.set(c,0);}
-counts.set(c,counts.get(c)+1);if(event.args.value){if(!sums.get(c)){sums.set(c,0);}
-sums.set(c,sums.get(c)+event.args.value);}}}
-counts.forEach((value,key)=>{histograms.createHistogram('count_'+key,tr.b.Unit.byName.count,value);});sums.forEach((value,key)=>{histograms.createHistogram('sum_'+key,tr.b.Unit.byName.unitlessNumber,value);});}
-tr.metrics.MetricRegistry.register(countSumMetric,{supportsRangeOfInterest:false,});return{countSumMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function getCpuSnapshotsFromModel(model){const snapshots=[];for(const pid in model.processes){const snapshotInstances=model.processes[pid].objects.getAllInstancesNamed('CPUSnapshots');if(!snapshotInstances)continue;for(const object of snapshotInstances[0].snapshots){snapshots.push(object.args.processes);}}
-return snapshots;}
-function getProcessSumsFromSnapshot(snapshot){const processSums=new Map();for(const processData of snapshot){const processName=processData.name;if(!(processSums.has(processName))){processSums.set(processName,{sum:0.0,paths:new Set()});}
-processSums.get(processName).sum+=parseFloat(processData.pCpu);if(processData.path){processSums.get(processName).paths.add(processData.path);}}
-return processSums;}
-function buildNumericsFromSnapshots(snapshots){const processNumerics=new Map();for(const snapshot of snapshots){const processSums=getProcessSumsFromSnapshot(snapshot);for(const[processName,processData]of processSums.entries()){if(!(processNumerics.has(processName))){processNumerics.set(processName,{numeric:new tr.v.Histogram('cpu:percent:'+processName,tr.b.Unit.byName.normalizedPercentage_smallerIsBetter),paths:new Set()});}
-processNumerics.get(processName).numeric.addSample(processData.sum/100.0);for(const path of processData.paths){processNumerics.get(processName).paths.add(path);}}}
-return processNumerics;}
-function cpuProcessMetric(histograms,model){const snapshots=getCpuSnapshotsFromModel(model);const processNumerics=buildNumericsFromSnapshots(snapshots);for(const[processName,processData]of processNumerics){const numeric=processData.numeric;const missingSnapshotCount=snapshots.length-numeric.numValues;for(let i=0;i<missingSnapshotCount;i++){numeric.addSample(0);}
-numeric.diagnostics.set('paths',new
-tr.v.d.GenericSet([...processData.paths]));histograms.addHistogram(numeric);}}
-tr.metrics.MetricRegistry.register(cpuProcessMetric);return{cpuProcessMetric,};});'use strict';tr.exportTo('tr.metrics',function(){function customMetric(histograms,model,opt_options){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper){return;}
-const TITLE_PREFIX='custom_metric:';const traces=new Map();const benchmarkValues=new Map();for(const helper of chromeHelper.browserHelpers){if(!helper.mainThread)continue;for(const slice of helper.mainThread.sliceGroup.slices.concat(helper.mainThread.asyncSliceGroup.slices)){if(!slice.error&&slice.title.startsWith(TITLE_PREFIX)){if(!traces.has(slice.title)){traces.set(slice.title,[]);}
-traces.get(slice.title).push(slice.duration);}}}
-const BENCHMARK_BEGIN='benchmark_begin';const BENCHMARK_END='benchmark_end';const BENCHMARK_VALUE='benchmark_value';const marks=new Map();for(const helper of Object.values(chromeHelper.rendererHelpers)){for(const event of helper.mainThread.sliceGroup.childEvents()){const navId=getNavigationId(event);if(!navId||!event.category.includes('blink.user_timing'))continue;const{title}=event;const index=title.lastIndexOf(':');if(index===-1){continue;}
-const name=title.substring(0,index);const lastPart=title.substring(index+1);if(lastPart===BENCHMARK_BEGIN){marks.set(name,event);}else if(lastPart===BENCHMARK_END){if(!marks.has(name)){continue;}
-const range=tr.b.math.Range.fromExplicitRange(marks.get(name).start,event.start);if(!traces.has(name)){traces.set(name,[]);}
-traces.get(name).push(range.duration);marks.delete(name);}else if(lastPart===BENCHMARK_VALUE){const index2=name.lastIndexOf(':');if(index2===-1){continue;}
-const key=name.substring(0,index2);const value=Number(name.substring(index2+1));if(key&&!isNaN(value)){if(!benchmarkValues.has(key)){benchmarkValues.set(key,[]);}
-benchmarkValues.get(key).push(value);}}}}
-traces.forEach((value,key)=>{histograms.createHistogram(key,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,value);});benchmarkValues.forEach((value,key)=>{histograms.createHistogram(key,tr.b.Unit.byName.unitlessNumber_smallerIsBetter,value);});}
-function getNavigationId(event){return event.args.data&&event.args.data.navigationId;}
-tr.metrics.MetricRegistry.register(customMetric,{supportsRangeOfInterest:false,});return{customMetric,};});'use strict';tr.exportTo('tr.metrics',function(){function mediaMetric(histograms,model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(chromeHelper===undefined)return;for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){const mainThread=rendererHelper.mainThread;if(mainThread===undefined)continue;const videoThreads=rendererHelper.process.findAllThreadsMatching(thread=>(thread.name?thread.name.startsWith('ThreadPoolSingleThreadSharedForegroundBlocking'):false));const compositorThread=rendererHelper.compositorThread;if(compositorThread!==undefined){videoThreads.push(compositorThread);}
-const audioThreads=rendererHelper.process.findAllThreadsNamed('AudioOutputDevice');if(audioThreads.length===0&&videoThreads.length===0)continue;const processData=new PerProcessData();processData.recordPlayStarts(mainThread);if(!processData.hasPlaybacks)continue;if(videoThreads.length!==0){processData.calculateTimeToVideoPlays(videoThreads);processData.calculateDroppedFrameCounts(videoThreads);}
-if(audioThreads.length!==0){processData.calculateTimeToAudioPlays(audioThreads);}
-processData.calculateSeekTimes(mainThread);processData.calculateBufferingTimes(mainThread);const allThreads=rendererHelper.process.findAllThreadsMatching(function(){return true;});processData.calculateVideoPlaybackQuality(allThreads);processData.addMetricToHistograms(histograms);}}
-class PerProcessData{constructor(){this.playbackIdToDataMap_=new Map();}
-recordPlayStarts(mainThread){for(const event of mainThread.sliceGroup.getDescendantEvents()){if(event.title==='WebMediaPlayerImpl::DoLoad'){const id=event.args.id;if(this.playbackIdToDataMap_.has(id)){throw new Error('Unexpected multiple initialization of a media playback');}
-this.playbackIdToDataMap_.set(id,new PerPlaybackData(event.start));}}}
-get hasPlaybacks(){return this.playbackIdToDataMap_.size>0;}
-calculateTimeToVideoPlays(videoThreads){for(const thread of videoThreads){for(const event of thread.sliceGroup.getDescendantEvents()){if(event.title==='VideoRendererImpl::Render'){this.getPerPlaybackObject_(event.args.id).processVideoRenderTime(event.start);}}}}
-calculateTimeToAudioPlays(audioThreads){for(const audioThread of audioThreads){for(const event of audioThread.sliceGroup.getDescendantEvents()){if(event.title==='AudioRendererImpl::Render'){this.getPerPlaybackObject_(event.args.id).processAudioRenderTime(event.start);}}}}
-calculateSeekTimes(mainThread){for(const event of mainThread.sliceGroup.getDescendantEvents()){if(event.title==='WebMediaPlayerImpl::DoSeek'){this.getPerPlaybackObject_(event.args.id).processDoSeek(event.args.target,event.start);}else if(event.title==='WebMediaPlayerImpl::OnPipelineSeeked'){this.getPerPlaybackObject_(event.args.id).processOnPipelineSeeked(event.args.target,event.start);}else if(event.title==='WebMediaPlayerImpl::BufferingHaveEnough'){this.getPerPlaybackObject_(event.args.id).processBufferingHaveEnough(event.start);}}}
-calculateBufferingTimes(mainThread){for(const event of mainThread.sliceGroup.getDescendantEvents()){if(event.title==='WebMediaPlayerImpl::OnEnded'){this.getPerPlaybackObject_(event.args.id).processOnEnded(event.start,event.args.duration);}}}
-calculateDroppedFrameCounts(videoThreads){for(const thread of videoThreads){for(const event of thread.sliceGroup.getDescendantEvents()){if(event.title==='VideoFramesDropped'){this.getPerPlaybackObject_(event.args.id).processVideoFramesDropped(event.args.count);}}}}
-calculateVideoPlaybackQuality(threads){for(const thread of threads){for(const event of thread.sliceGroup.getDescendantEvents()){if(event.title==='VideoPlaybackRoughness'){this.getPerPlaybackObject_(event.args.id).processVideoRoughness(event.args.roughness);}else if(event.title==='VideoPlaybackFreezing'){this.getPerPlaybackObject_(event.args.id).processVideoFreezing(event.args.freezing);}}}}
-addMetricToHistograms(histograms){for(const[id,playbackData]of this.playbackIdToDataMap_){playbackData.addMetricToHistograms(histograms);}}
-getPerPlaybackObject_(playbackId){let perPlaybackObject=this.playbackIdToDataMap_.get(playbackId);if(perPlaybackObject===undefined){perPlaybackObject=new PerPlaybackData(undefined);this.playbackIdToDataMap_.set(playbackId,perPlaybackObject);}
-return perPlaybackObject;}}
-class PerPlaybackData{constructor(playStartTime){this.playStart_=playStartTime;this.timeToVideoPlay_=undefined;this.timeToAudioPlay_=undefined;this.bufferingTime_=undefined;this.droppedFrameCount_=0;this.seekError_=false;this.seekTimes_=new Map();this.currentSeek_=undefined;this.roughness_=undefined;this.freezing_=undefined;}
-get timeToVideoPlay(){return this.timeToVideoPlay_;}
-get timeToAudioPlay(){return this.timeToAudioPlay_;}
-get bufferingTime(){return this.bufferingTime_;}
-get droppedFrameCount(){return(this.timeToVideoPlay_!==undefined)?this.droppedFrameCount_:undefined;}
-get seekTimes(){if(this.seekError_||this.currentSeek_!==undefined)return new Map();return this.seekTimes_;}
-get roughness(){return this.roughness_;}
-get freezing(){return this.freezing_;}
-processVideoRenderTime(videoRenderTime){if(this.playStart_!==undefined&&this.timeToVideoPlay_===undefined){this.timeToVideoPlay_=videoRenderTime-this.playStart_;}}
-processAudioRenderTime(audioRenderTime){if(this.playStart_!==undefined&&this.timeToAudioPlay_===undefined){this.timeToAudioPlay_=audioRenderTime-this.playStart_;}}
-processVideoFramesDropped(count){this.droppedFrameCount_+=count;}
-processDoSeek(target,startTime){if(this.currentSeek_!==undefined){this.seekError_=true;return;}
-this.currentSeek_={target,startTime};this.seekTimes_.set(target,this.currentSeek_);}
-processOnPipelineSeeked(target,time){if(this.seekError_)return;const currentSeek=this.currentSeek_;if(currentSeek===undefined){return;}
-if(currentSeek.target!==target){this.seekError_=true;return;}
-if(currentSeek.pipelineSeekTime!==undefined){this.seekError_=true;return;}
-currentSeek.pipelineSeekTime=time-currentSeek.startTime;}
-processBufferingHaveEnough(time){if(this.seekError_)return;const currentSeek=this.currentSeek_;if(currentSeek===undefined){return;}
-if(currentSeek.pipelineSeekTime===undefined){return;}
-currentSeek.seekTime=time-currentSeek.startTime;this.currentSeek_=undefined;}
-processOnEnded(playEndTime,duration){if(this.playStart_===undefined)return;if(this.seekTimes_.size!==0||this.seekError_)return;if(this.bufferingTime_!==undefined)return;duration=tr.b.convertUnit(duration,tr.b.UnitPrefixScale.METRIC.NONE,tr.b.UnitPrefixScale.METRIC.MILLI);const playTime=playEndTime-this.playStart_;if(this.timeToVideoPlay_!==undefined){this.bufferingTime_=playTime-duration-this.timeToVideoPlay_;}else if(this.timeToAudioPlay!==undefined){this.bufferingTime_=playTime-duration-this.timeToAudioPlay_;}}
-processVideoRoughness(roughness){if(this.roughness_===undefined||this.roughness_>roughness){this.roughness_=roughness;}}
-processVideoFreezing(freezing){if(this.freezing_===undefined||this.freezing_>freezing){this.freezing_=freezing;}}
-addMetricToHistograms(histograms){this.addSample_(histograms,'time_to_video_play',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,this.timeToVideoPlay);this.addSample_(histograms,'time_to_audio_play',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,this.timeToAudioPlay);this.addSample_(histograms,'dropped_frame_count',tr.b.Unit.byName.count_smallerIsBetter,this.droppedFrameCount);for(const[key,value]of this.seekTimes.entries()){const keyString=key.toString().replace('.','_');this.addSample_(histograms,'pipeline_seek_time_'+keyString,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,value.pipelineSeekTime);this.addSample_(histograms,'seek_time_'+keyString,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,value.seekTime);}
-this.addSample_(histograms,'buffering_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,this.bufferingTime);this.addSample_(histograms,'roughness',tr.b.Unit.byName.count_smallerIsBetter,this.roughness);this.addSample_(histograms,'freezing',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,this.freezing);}
-addSample_(histograms,name,unit,sample){if(sample===undefined)return;const histogram=histograms.getHistogramNamed(name);if(histogram===undefined){histograms.createHistogram(name,unit,sample);}else{histogram.addSample(sample);}}}
-tr.metrics.MetricRegistry.register(mediaMetric);return{mediaMetric,};});'use strict';tr.exportTo('tr.metrics.pa',function(){function pcscanMetric(histograms,model){function createNumericForProcess(name,processName,context,desc){function createNumericForEventTime(name,desc){const n=new tr.v.Histogram(name,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);n.description=desc;n.customizeSummaryOptions({avg:true,count:true,max:true,min:true,std:true,sum:true});return n;}
-const scheme=['pa','pcscan',processName,context];if(name)scheme.push(name);return createNumericForEventTime(scheme.join(':'),desc);}
-function createHistsForProcess(processName){return{scanner_scan:createNumericForProcess('scan',processName,'scanner','Time for scanning heap for quarantine pointers on concurrent threads'),scanner_sweep:createNumericForProcess('sweep',processName,'scanner','Time for sweeping quarantine'),scanner_clear:createNumericForProcess('clear',processName,'scanner','Time for clearing quarantine entries'),scanner_total:createNumericForProcess('',processName,'scanner','Total time for PCScan execution on concurrent threads'),mutator_scan:createNumericForProcess('scan',processName,'mutator','Time for scanning heap for quarantine pointers on mutator threads'),mutator_clear:createNumericForProcess('clear',processName,'mutator','Time for clearing heap quarantine entries on mutator threads'),mutator_total:createNumericForProcess('',processName,'mutator','Total time for PCScan execution on mutator threads (inside safepoints)'),};}
-function addSample(hists,slice){if(!(slice instanceof tr.model.ThreadSlice))return;if(slice.category!=='partition_alloc')return;if(slice.title==='PCScan.Scanner.Scan'){hists.scanner_scan.addSample(slice.duration);}else if(slice.title==='PCScan.Scanner.Sweep'){hists.scanner_sweep.addSample(slice.duration);}else if(slice.title==='PCScan.Scanner.Clear'){hists.scanner_clear.addSample(slice.duration);}else if(slice.title==='PCScan.Scanner'){hists.scanner_total.addSample(slice.duration);}else if(slice.title==='PCScan.Mutator.Scan'){hists.mutator_scan.addSample(slice.duration);}else if(slice.title==='PCScan.Mutator.Clear'){hists.mutator_clear.addSample(slice.duration);}else if(slice.title==='PCScan.Mutator'){hists.mutator_total.addSample(slice.duration);}}
-function addHistsForProcess(processHists,processHelpers){for(const helper of Object.values(processHelpers)){const processName=tr.e.chrome.chrome_processes.canonicalizeProcessName(helper.process.name);if(!processHists.has(processName)){processHists.set(processName,createHistsForProcess(processName));}
-for(const slice of helper.process.getDescendantEvents()){addSample(processHists.get(processName),slice);}}}
-const helper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const processHists=new Map();addHistsForProcess(processHists,helper.browserHelpers);addHistsForProcess(processHists,helper.rendererHelpers);for(const hists of processHists.values()){for(const hist of Object.values(hists)){histograms.addHistogram(hist);}}}
-tr.metrics.MetricRegistry.register(pcscanMetric);return{pcscanMetric,};});'use strict';tr.exportTo('tr.metrics.rendering',function(){const UNKNOWN_THREAD_NAME='Unknown';const CATEGORY_THREAD_MAP=new Map();CATEGORY_THREAD_MAP.set('total_all',[/.*/]);CATEGORY_THREAD_MAP.set('browser',[/^Browser Compositor$/,/^CrBrowserMain$/]);CATEGORY_THREAD_MAP.set('display_compositor',[/^VizCompositorThread$/]);CATEGORY_THREAD_MAP.set('GPU',[/^Chrome_InProcGpuThread$/,/^CrGpuMain$/]);CATEGORY_THREAD_MAP.set('IO',[/IOThread/]);CATEGORY_THREAD_MAP.set('raster',[/CompositorTileWorker/]);CATEGORY_THREAD_MAP.set('renderer_compositor',[/^Compositor$/]);CATEGORY_THREAD_MAP.set('renderer_main',[/^CrRendererMain$/]);CATEGORY_THREAD_MAP.set('total_rendering',[/^Browser Compositor$/,/^Chrome_InProcGpuThread$/,/^Compositor$/,/CompositorTileWorker/,/^CrBrowserMain$/,/^CrGpuMain$/,/^CrRendererMain$/,/IOThread/,/^VizCompositorThread$/]);const ALL_CATEGORIES=[...CATEGORY_THREAD_MAP.keys(),'other'];function addValueToMap_(map,key,value){const oldValue=map.get(key)||0;map.set(key,oldValue+value);}
-function addToArrayInMap_(map,key,value){const arr=map.get(key)||[];arr.push(value);map.set(key,arr);}
-function*getCategories_(threadName){let isOther=true;for(const[category,regexps]of CATEGORY_THREAD_MAP){for(const regexp of regexps){if(regexp.test(threadName)){if(category!=='total_all')isOther=false;yield category;break;}}}
-if(isOther)yield'other';}
-function addCpuUtilizationHistograms(histograms,model,segments,segmentCostFunc,histogramNameFunc,description){const categoryValues=new Map();for(const segment of segments){const threadValues=new Map();for(const thread of model.getAllThreads()){addValueToMap_(threadValues,thread.name||UNKNOWN_THREAD_NAME,segmentCostFunc(thread,segment));}
-for(const[threadName,coresPerSec]of threadValues){for(const category of getCategories_(threadName)){addToArrayInMap_(categoryValues,category,coresPerSec);}}}
-const unit=tr.b.Unit.byName.unitlessNumber_smallerIsBetter;for(const category of ALL_CATEGORIES){const values=categoryValues.get(category)||0;if(!values)continue;const avg=values.reduce((sum,e)=>sum+e,0)/segments.length;histograms.createHistogram(histogramNameFunc(category),unit,avg,{description,summaryOptions:{},});}}
-const SUMMARY_OPTIONS={percentile:[0.90,0.95],ci:[0.95],};return{addCpuUtilizationHistograms,SUMMARY_OPTIONS,};});'use strict';tr.exportTo('tr.metrics.rendering',function(){const PRESENT_EVENT='Display::FrameDisplayed';const DISPLAY_EVENT='BenchmarkInstrumentation::DisplayRenderingStats';const DRM_EVENT='DrmEventFlipComplete';const SURFACE_FLINGER_EVENT='vsync_before';const COMPOSITOR_FRAME_PRESENTED_EVENT='FramePresented';const MIN_FRAME_LENGTH=0.5;const MIN_FRAME_COUNT=10;const PAUSE_THRESHOLD=20;const ASH_ENVIRONMENT='ash';const BROWSER_ENVIRONMENT='browser';class FrameEvent{constructor(event){this.event_=event;}
-get eventStart(){return this.event_.start;}
-get frameStart(){if(this.event_.title!==DRM_EVENT)return this.event_.start;const data=this.event_.args.data;const TIME=tr.b.UnitScale.TIME;return tr.b.convertUnit(data['vblank.tv_sec'],TIME.SEC,TIME.MILLI_SEC)+
-tr.b.convertUnit(data['vblank.tv_usec'],TIME.MICRO_SEC,TIME.MILLI_SEC);}
-get event(){return this.event_;}}
-class FrameSegment{constructor(frameEvent,duration){this.frameEvent_=frameEvent;this.duration_=duration;this.segment_=new tr.model.um.Segment(frameEvent.eventStart,duration);this.length_=undefined;}
-updateLength(refreshPeriod){this.length_=this.duration_/refreshPeriod;}
-get segment(){return this.segment_;}
-get boundsRange(){return this.segment_.boundsRange;}
-get length(){return this.length_;}
-get duration(){return this.duration_;}
-get event(){return this.frameEvent_.event;}}
-function getDisplayCompositorPresentationEventsExp_(modelHelper){if(!modelHelper)return[];function findEventsFromProcess(process){const events=[];for(const event of process.findTopmostSlicesNamed(PRESENT_EVENT)){events.push(event);}
-return events;}
-if(modelHelper.gpuHelper){const events=findEventsFromProcess(modelHelper.gpuHelper.process);if(events.length>0)return events;}
-if(!modelHelper.browserProcess)return[];return findEventsFromProcess(modelHelper.browserProcess);}
-function getDisplayCompositorPresentationEvents_(modelHelper){if(!modelHelper||!modelHelper.browserProcess)return[];let events=[];if(modelHelper.surfaceFlingerProcess){events=[...modelHelper.surfaceFlingerProcess.findTopmostSlicesNamed(SURFACE_FLINGER_EVENT)];if(events.length>0)return events;}
-if(modelHelper.gpuHelper){const gpuProcess=modelHelper.gpuHelper.process;events=[...gpuProcess.findTopmostSlicesNamed(DRM_EVENT)];if(events.length>0)return events;events=[...gpuProcess.findTopmostSlicesNamed(DISPLAY_EVENT)];if(events.length>0)return events;}
-return[...modelHelper.browserProcess.findTopmostSlicesNamed(DISPLAY_EVENT)];}
-function getUIPresentationEvents_(modelHelper){if(!modelHelper||!modelHelper.browserProcess)return[];const legacyEvents=[];const eventsByEnvironment={};eventsByEnvironment[ASH_ENVIRONMENT]=[];eventsByEnvironment[BROWSER_ENVIRONMENT]=[];for(const event of modelHelper.browserProcess.findTopmostSlicesNamed(COMPOSITOR_FRAME_PRESENTED_EVENT)){if(!('environment'in event.args)){legacyEvents.push(event);}else{eventsByEnvironment[event.args.environment].push(event);}}
-if(eventsByEnvironment[ASH_ENVIRONMENT].length>0){return eventsByEnvironment[ASH_ENVIRONMENT];}
-if(eventsByEnvironment[BROWSER_ENVIRONMENT].length>0){return eventsByEnvironment[BROWSER_ENVIRONMENT];}
-return legacyEvents;}
-function computeFrameSegments_(events,segments,opt_minFrameCount){const minFrameCount=opt_minFrameCount||MIN_FRAME_COUNT;const frameEvents=events.map(e=>new FrameEvent(e));const frameSegments=[];for(const segment of segments){const filtered=segment.boundsRange.filterArray(frameEvents,x=>x.eventStart);if(filtered.length<minFrameCount)continue;for(let i=1;i<filtered.length;i++){const duration=filtered[i].frameStart-filtered[i-1].frameStart;frameSegments.push(new FrameSegment(filtered[i-1],duration));}}
-return frameSegments;}
-function addBasicFrameTimeHistograms_(histograms,frameSegments,prefix){const frameTimes=(frameSegments.length===0)?[0]:frameSegments.map(x=>x.duration);histograms.createHistogram(`${prefix}frame_times`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,frameTimes,{binBoundaries:tr.v.HistogramBinBoundaries.createLinear(0,50,20),description:'Raw frame times.',summaryOptions:tr.metrics.rendering.SUMMARY_OPTIONS,});}
-function addFrameTimeHistograms(histograms,model,segments,opt_minFrameCount){const minFrameCount=opt_minFrameCount||MIN_FRAME_COUNT;const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const events=getDisplayCompositorPresentationEvents_(modelHelper);if(!events)return;addFrameTimeHistogramsHelper(histograms,model,segments,events,'',true,minFrameCount);const eventsExp=getDisplayCompositorPresentationEventsExp_(modelHelper);if(eventsExp&&eventsExp.length>0){addFrameTimeHistogramsHelper(histograms,model,segments,eventsExp,'exp_',false,minFrameCount);}}
-function addFrameTimeHistogramsHelper(histograms,model,segments,events,prefix,addCpuMetrics,minFrameCount){const frameSegments=computeFrameSegments_(events,segments,minFrameCount);addBasicFrameTimeHistograms_(histograms,frameSegments,prefix+'');if(addCpuMetrics){tr.metrics.rendering.addCpuUtilizationHistograms(histograms,model,frameSegments,(thread,segment)=>thread.getCpuTimeForRange(segment.boundsRange),category=>`thread_${category}_cpu_time_per_frame`,'CPU cores of a thread group per frame');tr.metrics.rendering.addCpuUtilizationHistograms(histograms,model,frameSegments,(thread,segment)=>thread.getNumToplevelSlicesForRange(segment.boundsRange),category=>`tasks_per_frame_${category}`,'Number of tasks of a thread group per frame');let totalWallTime=0;let totalCpuTime=0;for(const segment of frameSegments){for(const thread of model.getAllThreads()){totalCpuTime+=thread.getCpuTimeForRange(segment.boundsRange);totalWallTime+=thread.getWallTimeForRange(segment.boundsRange);}}
-histograms.createHistogram('cpu_wall_time_ratio',tr.b.Unit.byName.unitlessNumber_biggerIsBetter,totalCpuTime/totalWallTime,{description:'Ratio of total cpu-time vs. wall-time.',summaryOptions:{},});}
-const refreshPeriod=getRefreshPeriod(model,frameSegments.map(fs=>fs.boundsRange));frameSegments.forEach(fs=>fs.updateLength(refreshPeriod));const validFrames=frameSegments.filter(fs=>fs.length>=MIN_FRAME_LENGTH);const totalFrameDuration=tr.b.math.Statistics.sum(frameSegments,fs=>fs.duration);addJankCountHistograms(histograms,validFrames,prefix);const frameLengths=validFrames.map(frame=>frame.length);histograms.createHistogram(prefix+'avg_surface_fps',tr.b.Unit.byName.unitlessNumber_biggerIsBetter,frameLengths.length/tr.b.convertUnit(totalFrameDuration,tr.b.UnitScale.TIME.MILLI_SEC,tr.b.UnitScale.TIME.SEC),{description:'Average frames per second.',summaryOptions:{},});}
-function addUIFrameTimeHistograms(histograms,model,segments,opt_minFrameCount){const minFrameCount=opt_minFrameCount||MIN_FRAME_COUNT;const events=getUIPresentationEvents_(model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper));if(events.length===0)return;const frameSegments=computeFrameSegments_(events,segments,minFrameCount);addBasicFrameTimeHistograms_(histograms,frameSegments,'ui_');}
-function addJankCountHistograms(histograms,validFrames,prefix){const jankEvents=[];for(let i=1;i<validFrames.length;i++){const change=Math.round((validFrames[i].length-validFrames[i-1].length));if(change>0&&change<PAUSE_THRESHOLD){jankEvents.push(validFrames[i].event);}}
-const jankCount=jankEvents.length;const diagnostics=new tr.v.d.DiagnosticMap();diagnostics.set('events',new tr.v.d.RelatedEventSet(jankEvents));diagnostics.set('timestamps',new tr.v.d.GenericSet(jankEvents.map(e=>e.start)));const histogram=histograms.createHistogram(prefix+'jank_count',tr.b.Unit.byName.count_smallerIsBetter,{value:jankCount,diagnostics},{description:'Number of changes in frame rate.',summaryOptions:{},});}
-function getRefreshPeriod(model,ranges){for(const metadata of model.metadata){if(metadata.value&&metadata.value.surface_flinger){return metadata.value.surface_flinger.refresh_period;}}
-const FRAME_LENGTH=1000.0/60;const BEGIN_FRAME_ARGS='Scheduler::BeginFrame';const FRAME_INTERVAL='interval_us';const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){if(rendererHelper.compositorThread===undefined)continue;const slices=rendererHelper.compositorThread.sliceGroup;for(const slice of slices.getDescendantEventsInSortedRanges(ranges)){if(slice.title!==BEGIN_FRAME_ARGS)continue;const data=slice.args.args;if(!(FRAME_INTERVAL in data)){throw new Error(`${FRAME_INTERVAL} is missing`);}
-return tr.b.convertUnit(data[FRAME_INTERVAL],tr.b.UnitScale.TIME.MICRO_SEC,tr.b.UnitScale.TIME.MILLI_SEC);}}
-return FRAME_LENGTH;}
-return{addFrameTimeHistograms,addUIFrameTimeHistograms,};});'use strict';tr.exportTo('tr.metrics.rendering',function(){const RGB_DECODE_EVENT='ImageFrameGenerator::decode';const YUV_DECODE_EVENT='ImageFrameGenerator::decodeToYUV';const BLINK_GPU_RASTER_DECODE_EVENT='GpuImageDecodeCache::DecodeImage';const BLINK_SOFTWARE_RASTER_DECODE_EVENT='SoftwareImageDecodeCache::'+'DecodeImageInTask';function getImageDecodingEvents_(modelHelper,ranges){if(!modelHelper||!modelHelper.rendererHelpers)return[];const events=[];for(const renderer of Object.values(modelHelper.rendererHelpers)){for(const thread of renderer.rasterWorkerThreads){const slices=thread.sliceGroup;for(const slice of slices.getDescendantEventsInSortedRanges(ranges)){if(slice.title===RGB_DECODE_EVENT||slice.title===YUV_DECODE_EVENT||slice.title===BLINK_GPU_RASTER_DECODE_EVENT||slice.title===BLINK_SOFTWARE_RASTER_DECODE_EVENT){events.push(slice);}}}}
-return events;}
-function addImageDecodeTimeHistograms(histograms,model,segments){const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const decodeEvents=getImageDecodingEvents_(modelHelper,segments.map(s=>s.boundsRange));if(!decodeEvents)return;histograms.createHistogram('rgb_decode_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,decodeEvents.filter(slice=>slice.title===RGB_DECODE_EVENT).map(slice=>slice.cpuDuration),{description:'Duration of the Blink RGB decoding path for a chunk '+'of image data (possibly the whole image).',summaryOptions:tr.metrics.rendering.SUMMARY_OPTIONS,});histograms.createHistogram('yuv_decode_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,decodeEvents.filter(slice=>slice.title===YUV_DECODE_EVENT).map(slice=>slice.cpuDuration),{description:'Duration of the Blink YUV decoding path for a '+'chunk of image data (possibly the whole image).',summaryOptions:tr.metrics.rendering.SUMMARY_OPTIONS,});histograms.createHistogram('blink_decode_time_gpu_rasterization',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,decodeEvents.filter(slice=>slice.title===BLINK_GPU_RASTER_DECODE_EVENT).map(slice=>slice.cpuDuration),{description:'Duration of decoding and scaling within the '+'GpuImageDecodeCache for a chunk of image data '+'(possibly the whole image)',summaryOptions:tr.metrics.rendering.SUMMARY_OPTIONS,});histograms.createHistogram('blink_decode_time_software_rasterization',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,decodeEvents.filter(slice=>slice.title===BLINK_SOFTWARE_RASTER_DECODE_EVENT).map(slice=>slice.cpuDuration),{description:'Duration of decoding and scaling within the '+'SoftwareImageDecodeCache for a chunk of image data '+'(possibly the whole image)',summaryOptions:tr.metrics.rendering.SUMMARY_OPTIONS,});}
-return{addImageDecodeTimeHistograms};});'use strict';tr.exportTo('tr.metrics.rendering',function(){const IMPL_THREAD_RENDERING_STATS_EVENT='BenchmarkInstrumentation::ImplThreadRenderingStats';const VISIBLE_CONTENT_DATA='visible_content_area';const APPROXIMATED_VISIBLE_CONTENT_DATA='approximated_visible_content_area';const CHECKERBOARDED_VISIBLE_CONTENT_DATA='checkerboarded_visible_content_area';function addPixelsHistograms(histograms,model,segments){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper)return;const approximatedPixelPercentages=[];const checkerboardedPixelPercentages=[];const ranges=segments.map(s=>s.boundsRange);for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){if(rendererHelper.compositorThread===undefined)continue;const slices=rendererHelper.compositorThread.sliceGroup;for(const slice of slices.getDescendantEventsInSortedRanges(ranges)){if(slice.title!==IMPL_THREAD_RENDERING_STATS_EVENT)continue;const data=slice.args.data;if(!(VISIBLE_CONTENT_DATA in data)){throw new Error(`${VISIBLE_CONTENT_DATA} is missing`);}
-const visibleContentArea=data[VISIBLE_CONTENT_DATA];if(visibleContentArea===0){continue;}
-if(APPROXIMATED_VISIBLE_CONTENT_DATA in data){approximatedPixelPercentages.push(data[APPROXIMATED_VISIBLE_CONTENT_DATA]/visibleContentArea);}
-if(CHECKERBOARDED_VISIBLE_CONTENT_DATA in data){checkerboardedPixelPercentages.push(data[CHECKERBOARDED_VISIBLE_CONTENT_DATA]/visibleContentArea);}}}
-histograms.createHistogram('mean_pixels_approximated',tr.b.Unit.byName.normalizedPercentage_smallerIsBetter,100*tr.b.math.Statistics.mean(approximatedPixelPercentages),{description:'Percentage of pixels that were approximated '+'(checkerboarding, low-resolution tiles, etc.).',summaryOptions:{},});histograms.createHistogram('mean_pixels_checkerboarded',tr.b.Unit.byName.normalizedPercentage_smallerIsBetter,100*tr.b.math.Statistics.mean(checkerboardedPixelPercentages),{description:'Percentage of pixels that were checkerboarded.',summaryOptions:{},});}
-return{addPixelsHistograms,};});'use strict';tr.exportTo('tr.metrics.rendering',function(){const BEGIN_MAIN_FRAME_EVENT='ThreadProxy::BeginMainFrame';const SEND_BEGIN_FRAME_EVENT='ThreadProxy::ScheduledActionSendBeginMainFrame';function getEventTimesByBeginFrameId_(thread,title,ranges){const out=new Map();const slices=thread.sliceGroup;for(const slice of slices.getDescendantEventsInSortedRanges(ranges)){if(slice.title!==title)continue;const id=slice.args.begin_frame_id;if(id===undefined)throw new Error('Event is missing begin_frame_id');if(out.has(id))throw new Error(`There must be exactly one ${title}`);out.set(id,slice.start);}
-return out;}
-function addQueueingDurationHistograms(histograms,model,segments){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper)return;let targetRenderers=chromeHelper.telemetryHelper.renderersWithIR;if(targetRenderers.length===0){targetRenderers=Object.values(chromeHelper.rendererHelpers);}
-const queueingDurations=[];const ranges=segments.map(s=>s.boundsRange);for(const rendererHelper of targetRenderers){const mainThread=rendererHelper.mainThread;const compositorThread=rendererHelper.compositorThread;if(mainThread===undefined||compositorThread===undefined)continue;const beginMainFrameTimes=getEventTimesByBeginFrameId_(mainThread,BEGIN_MAIN_FRAME_EVENT,ranges);const sendBeginFrameTimes=getEventTimesByBeginFrameId_(compositorThread,SEND_BEGIN_FRAME_EVENT,ranges);for(const[id,time]of sendBeginFrameTimes){queueingDurations.push(beginMainFrameTimes.get(id)-time);}}
-histograms.createHistogram('queueing_durations',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,queueingDurations,{binBoundaries:tr.v.HistogramBinBoundaries.createExponential(0.01,2,20),summaryOptions:tr.metrics.rendering.SUMMARY_OPTIONS,description:'Time between ScheduledActionSendBeginMainFrame in '+'the compositor thread and the corresponding '+'BeginMainFrame in the main thread.'});}
-return{addQueueingDurationHistograms,};});'use strict';tr.exportTo('tr.metrics.rendering',function(){const GESTURE_EVENT='SyntheticGestureController::running';function renderingMetric(histograms,model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper)return;let segments=chromeHelper.telemetryHelper.irSegments;if(segments.length===0){segments=chromeHelper.telemetryHelper.animationSegments;}
-if(segments.length>0){tr.metrics.rendering.addFrameTimeHistograms(histograms,model,segments);tr.metrics.rendering.addImageDecodeTimeHistograms(histograms,model,segments);tr.metrics.rendering.addPixelsHistograms(histograms,model,segments);tr.metrics.rendering.addQueueingDurationHistograms(histograms,model,segments);}
-const uiSegments=chromeHelper.telemetryHelper.uiSegments;if(uiSegments.length>0){tr.metrics.rendering.addUIFrameTimeHistograms(histograms,model,chromeHelper.telemetryHelper.uiSegments);}}
-tr.metrics.MetricRegistry.register(renderingMetric,{requiredCategories:['benchmark','toplevel'],});return{renderingMetric,};});'use strict';tr.exportTo('tr.metrics',function(){const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const unitlessNumber_smallerIsBetter=tr.b.Unit.byName.unitlessNumber_smallerIsBetter;const EventFinderUtils=tr.e.chrome.EventFinderUtils;const METRIC_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,1e3,20).addLinearBins(3e3,20).addExponentialBins(80e3,30);const SUMMARY_OPTIONS={avg:true,count:false,max:true,min:true,std:true,sum:false,};function reportedByPageMetric(histograms,model){const timeToViewable=histograms.createHistogram('reported_by_page:time_to_viewable',timeDurationInMs_smallerIsBetter,[],{binBoundaries:METRIC_BOUNDARIES,description:'Time from navigation start'+'to telemetry:reported_by_page:viewable',summaryOptions:SUMMARY_OPTIONS,});const timeToInteractive=histograms.createHistogram('reported_by_page:time_to_interactive',timeDurationInMs_smallerIsBetter,[],{binBoundaries:METRIC_BOUNDARIES,description:'Time from navigation start '+'to telemetry:reported_by_page:interactive',summaryOptions:SUMMARY_OPTIONS,});const benchmarkTime=histograms.createHistogram('reported_by_page:benchmark_time',timeDurationInMs_smallerIsBetter,[],{binBoundaries:METRIC_BOUNDARIES,description:'Time from telemetry:reported_by_page:benchmark_begin '+'to telemetry:reported_by_page:benchmark_end',summaryOptions:SUMMARY_OPTIONS,});const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const pid in chromeHelper.rendererHelpers){const rendererHelper=chromeHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI)continue;if(rendererHelper.mainThread===undefined)continue;measureUserTime(rendererHelper,'navigationStart','telemetry:reported_by_page:viewable',timeToViewable);measureUserTime(rendererHelper,'navigationStart','telemetry:reported_by_page:interactive',timeToInteractive);measureUserTime(rendererHelper,'telemetry:reported_by_page:benchmark_begin','telemetry:reported_by_page:benchmark_end',benchmarkTime);}}
-function measureUserTime(rendererHelper,startName,endName,histogram){const startEventByNavId=new Map();for(const event of rendererHelper.mainThread.sliceGroup.childEvents()){const navId=getNavigationId(event);if(!navId)continue;if(EventFinderUtils.hasCategoryAndName(event,'blink.user_timing',startName)){startEventByNavId.set(navId,event);}
-if(EventFinderUtils.hasCategoryAndName(event,'blink.user_timing',endName)){if(!startEventByNavId.has(navId)){throw Error(`Missing ${startName} for ${endName} at {event.start}`);}
-const range=tr.b.math.Range.fromExplicitRange(startEventByNavId.get(navId).start,event.start);histogram.addSample(range.duration);startEventByNavId.delete(navId);}}}
-function getNavigationId(event){return event.args.data&&event.args.data.navigationId;}
-tr.metrics.MetricRegistry.register(reportedByPageMetric);return{reportedByPageMetric};});'use strict';tr.exportTo('tr.metrics',function(){function sampleExceptionMetric(histograms,model){const hist=new tr.v.Histogram('foo',tr.b.Unit.byName.sizeInBytes_smallerIsBetter);hist.addSample(9);hist.addSample(91,{bar:new tr.v.d.GenericSet([{hello:42}])});for(const expectation of model.userModel.expectations){if(expectation instanceof tr.model.um.ResponseExpectation){}else if(expectation instanceof tr.model.um.AnimationExpectation){}else if(expectation instanceof tr.model.um.IdleExpectation){}else if(expectation instanceof tr.model.um.LoadExpectation){}}
-const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const[pid,process]of Object.entries(model.processes)){}
-histograms.addHistogram(hist);throw new Error('There was an error');}
-tr.metrics.MetricRegistry.register(sampleExceptionMetric);return{sampleExceptionMetric,};});'use strict';tr.exportTo('tr.metrics',function(){function sampleMetric(histograms,model){const hist=new tr.v.Histogram('foo',tr.b.Unit.byName.sizeInBytes_smallerIsBetter);hist.addSample(9);hist.addSample(91,{bar:new tr.v.d.GenericSet([{hello:42}])});for(const expectation of model.userModel.expectations){if(expectation instanceof tr.model.um.ResponseExpectation){}else if(expectation instanceof tr.model.um.AnimationExpectation){}else if(expectation instanceof tr.model.um.IdleExpectation){}else if(expectation instanceof tr.model.um.LoadExpectation){}}
-const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const[pid,process]of Object.entries(model.processes)){}
-histograms.addHistogram(hist);}
-tr.metrics.MetricRegistry.register(sampleMetric);return{sampleMetric,};});'use strict';tr.exportTo('tr.metrics',function(){const HANDLE_INPUT_EVENT_TITLE='WebViewImpl::handleInputEvent';function findPrecedingEvents_(eventsA,eventsB){const events=new Map();let eventsBIndex=0;for(const eventA of eventsA){for(;eventsBIndex<eventsB.length;eventsBIndex++){if(eventsB[eventsBIndex].start>eventA.start)break;}
-if(eventsBIndex>0){events.set(eventA,eventsB[eventsBIndex-1]);}}
-return events;}
-function findFollowingEvents_(eventsA,eventsB){const events=new Map();let eventsBIndex=0;for(const eventA of eventsA){for(;eventsBIndex<eventsB.length;eventsBIndex++){if(eventsB[eventsBIndex].start>=eventA.start)break;}
-if(eventsBIndex>=0&&eventsBIndex<eventsB.length){events.set(eventA,eventsB[eventsBIndex]);}}
-return events;}
-function getSpaNavigationStartCandidates_(rendererHelper,browserHelper){const isNavStartEvent=e=>{if(e.title===HANDLE_INPUT_EVENT_TITLE&&e.args.type==='MouseUp'){return true;}
-return e.title==='NavigationControllerImpl::GoToIndex';};return[...rendererHelper.mainThread.sliceGroup.getDescendantEvents(),...browserHelper.mainThread.sliceGroup.getDescendantEvents()].filter(isNavStartEvent);}
-function getSpaNavigationEvents_(rendererHelper){const isNavEvent=e=>e.category==='blink'&&e.title==='FrameLoader::updateForSameDocumentNavigation';return[...rendererHelper.mainThread.sliceGroup.getDescendantEvents()].filter(isNavEvent);}
-function getInputLatencyEvents_(browserHelper){const isInputLatencyEvent=e=>e.title==='InputLatency::MouseUp';return browserHelper.getAllAsyncSlicesMatching(isInputLatencyEvent);}
-function getInputLatencyEventByBindIdMap_(browserHelper){const inputLatencyEventByBindIdMap=new Map();for(const event of getInputLatencyEvents_(browserHelper)){inputLatencyEventByBindIdMap.set(event.args.data.trace_id,event);}
-return inputLatencyEventByBindIdMap;}
-function getSpaNavigationEventToNavigationStartMap_(rendererHelper,browserHelper){const mainThread=rendererHelper.mainThread;const spaNavEvents=getSpaNavigationEvents_(rendererHelper);const navStartCandidates=getSpaNavigationStartCandidates_(rendererHelper,browserHelper).sort(tr.importer.compareEvents);const spaNavEventToNavStartCandidateMap=findPrecedingEvents_(spaNavEvents,navStartCandidates);const inputLatencyEventByBindIdMap=getInputLatencyEventByBindIdMap_(browserHelper);const spaNavEventToNavStartEventMap=new Map();for(const[spaNavEvent,navStartCandidate]of
-spaNavEventToNavStartCandidateMap){if(navStartCandidate.title===HANDLE_INPUT_EVENT_TITLE){const inputLatencySlice=inputLatencyEventByBindIdMap.get(Number(navStartCandidate.parentSlice.bindId));if(inputLatencySlice){spaNavEventToNavStartEventMap.set(spaNavEvent,inputLatencySlice);}}else{spaNavEventToNavStartEventMap.set(spaNavEvent,navStartCandidate);}}
-return spaNavEventToNavStartEventMap;}
-function getFirstPaintEvents_(rendererHelper){const isFirstPaintEvent=e=>e.category==='blink'&&e.title==='PaintLayerCompositor::updateIfNeededRecursive';return[...rendererHelper.mainThread.sliceGroup.getDescendantEvents()].filter(isFirstPaintEvent);}
-function getSpaNavigationEventToFirstPaintEventMap_(rendererHelper){const spaNavEvents=getSpaNavigationEvents_(rendererHelper).sort(tr.importer.compareEvents);const firstPaintEvents=getFirstPaintEvents_(rendererHelper).sort(tr.importer.compareEvents);return findFollowingEvents_(spaNavEvents,firstPaintEvents);}
-function findSpaNavigationsOnRenderer(rendererHelper,browserHelper){const spaNavEventToNavStartMap=getSpaNavigationEventToNavigationStartMap_(rendererHelper,browserHelper);const spaNavEventToFirstPaintEventMap=getSpaNavigationEventToFirstPaintEventMap_(rendererHelper);const spaNavigations=[];for(const[spaNavEvent,navStartEvent]of
-spaNavEventToNavStartMap){if(spaNavEventToFirstPaintEventMap.has(spaNavEvent)){const firstPaintEvent=spaNavEventToFirstPaintEventMap.get(spaNavEvent);const isNavStartAsyncSlice=navStartEvent instanceof tr.model.AsyncSlice;spaNavigations.push({navStartCandidates:{inputLatencyAsyncSlice:isNavStartAsyncSlice?navStartEvent:undefined,goToIndexSlice:isNavStartAsyncSlice?undefined:navStartEvent},firstPaintEvent,url:spaNavEvent.args.url});}}
-return spaNavigations;}
-return{findSpaNavigationsOnRenderer,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function getWallClockSelfTime_(event,rangeOfInterest){if(event.duration===0)return 0;const selfTimeRanges=[rangeOfInterest.findIntersection(event.range)];for(const subSlice of event.subSlices){if(selfTimeRanges.length===0)return 0;const lastRange=selfTimeRanges.pop();selfTimeRanges.push(...tr.b.math.Range.findDifference(lastRange,subSlice.range));}
-return tr.b.math.Statistics.sum(selfTimeRanges,r=>r.duration);}
-function getCPUSelfTime_(event,rangeOfInterest){if(event.duration===0||event.selfTime===0)return 0;if(event.cpuSelfTime===undefined)return 0;const cpuTimeDensity=event.cpuSelfTime/event.selfTime;return getWallClockSelfTime_(event,rangeOfInterest)*cpuTimeDensity;}
-function generateTimeBreakdownTree(mainThread,rangeOfInterest,getEventSelfTime){if(mainThread===null)return;const breakdownTree={};for(const title of
-tr.e.chrome.ChromeUserFriendlyCategoryDriver.ALL_TITLES){breakdownTree[title]={total:0,events:{}};}
-for(const event of mainThread.sliceGroup.childEvents()){if(!rangeOfInterest.intersectsRangeExclusive(event.range))continue;const eventSelfTime=getEventSelfTime(event,rangeOfInterest);const title=tr.e.chrome.ChromeUserFriendlyCategoryDriver.fromEvent(event);breakdownTree[title].total+=eventSelfTime;if(breakdownTree[title].events[event.title]===undefined){breakdownTree[title].events[event.title]=0;}
-breakdownTree[title].events[event.title]+=eventSelfTime;let timeIntersectionRatio=0;if(event.duration>0){timeIntersectionRatio=rangeOfInterest.findExplicitIntersectionDuration(event.start,event.end)/event.duration;}
-const v8Runtime=event.args['runtime-call-stat'];if(v8Runtime!==undefined){const v8RuntimeObject=JSON.parse(v8Runtime);for(const runtimeCall in v8RuntimeObject){if(v8RuntimeObject[runtimeCall].length===2){if(breakdownTree.v8_runtime.events[runtimeCall]===undefined){breakdownTree.v8_runtime.events[runtimeCall]=0;}
-const runtimeTime=tr.b.Unit.timestampFromUs(v8RuntimeObject[runtimeCall][1]*timeIntersectionRatio);breakdownTree.v8_runtime.total+=runtimeTime;breakdownTree.v8_runtime.events[runtimeCall]+=runtimeTime;}}}}
-return breakdownTree;}
-function addIdleAndBlockByNetworkBreakdown_(breakdownTree,mainThreadEvents,networkEvents,rangeOfInterest){const mainThreadEventRanges=tr.b.math.convertEventsToRanges(mainThreadEvents);const networkEventRanges=tr.b.math.convertEventsToRanges(networkEvents);const eventRanges=mainThreadEventRanges.concat(networkEventRanges);const idleRanges=tr.b.math.findEmptyRangesBetweenRanges(eventRanges,rangeOfInterest);const totalFreeDuration=tr.b.math.Statistics.sum(idleRanges,range=>range.duration);breakdownTree.idle={total:totalFreeDuration,events:{}};let totalBlockedDuration=rangeOfInterest.duration;for(const[title,component]of Object.entries(breakdownTree)){if(title==='v8_runtime')continue;totalBlockedDuration-=component.total;}
-breakdownTree.blocked_on_network={total:Math.max(totalBlockedDuration,0),events:{}};}
-function generateWallClockTimeBreakdownTree(mainThread,networkEvents,rangeOfInterest){const breakdownTree=generateTimeBreakdownTree(mainThread,rangeOfInterest,getWallClockSelfTime_);const mainThreadEventsInRange=tr.model.helpers.getSlicesIntersectingRange(rangeOfInterest,mainThread.sliceGroup.topLevelSlices);addIdleAndBlockByNetworkBreakdown_(breakdownTree,mainThreadEventsInRange,networkEvents,rangeOfInterest);return breakdownTree;}
-function generateCpuTimeBreakdownTree(mainThread,rangeOfInterest){return generateTimeBreakdownTree(mainThread,rangeOfInterest,getCPUSelfTime_);}
-return{generateTimeBreakdownTree,generateWallClockTimeBreakdownTree,generateCpuTimeBreakdownTree,};});'use strict';tr.exportTo('tr.e.chrome',function(){const LCP_CANDIDATE_EVENT_TITLE='NavStartToLargestContentfulPaint::Candidate::AllFrames::UKM';const LCP_INVALIDATE_EVENT_TITLE='NavStartToLargestContentfulPaint::Invalidate::AllFrames::UKM';class LcpEvent{constructor(event){if(!LcpInvalidateEvent.isLcpInvalidateEvent(event)&&!LcpCandidateEvent.isLcpCandidateEvent(event)){throw new Error('The LCP event should be either a candidate event or'+'an invalidate event.');}
-if(event.start===undefined||event.args.main_frame_tree_node_id===undefined){throw new Error('The LCP event is in unexpected format.');}
-this.start=event.start;this.mainFrameTreeNodeId=event.args.main_frame_tree_node_id;}}
-class LcpCandidateEvent extends LcpEvent{constructor(event){super(event);const{durationInMilliseconds,size,type,inMainFrame}=event.args.data;if(durationInMilliseconds===undefined||size===undefined||type===undefined||inMainFrame===undefined||event.args.main_frame_tree_node_id===undefined||!LcpCandidateEvent.isLcpCandidateEvent(event)){throw new Error('The LCP candidate event is in unexpected format.');}
-this.durationInMilliseconds=durationInMilliseconds;this.size=size;this.type=type;this.inMainFrame=inMainFrame;}
-static isLcpCandidateEvent(event){return event.title===LCP_CANDIDATE_EVENT_TITLE;}}
-class LcpInvalidateEvent extends LcpEvent{constructor(event){super(event);if(!LcpInvalidateEvent.isLcpInvalidateEvent(event)){throw new Error('The LCP invalidate event is in unexpected format.');}}
-static isLcpInvalidateEvent(event){return event.title===LCP_INVALIDATE_EVENT_TITLE;}}
-class LargestContentfulPaint{constructor(allBrowserEvents){this.allBrowserEvents=allBrowserEvents;}
-findCandidates(){const finalLcpEvents=this.findFinalLcpEventOfEachNavigation(this.allBrowserEvents);const finalCandidates=finalLcpEvents.filter(finalLcpEvent=>!LcpInvalidateEvent.isLcpInvalidateEvent(finalLcpEvent));return finalCandidates;}
-findFinalLcpEventOfEachNavigation(allBrowserEvents){const lcpEvents=[];for(const lcpEvent of allBrowserEvents){if(LcpCandidateEvent.isLcpCandidateEvent(lcpEvent)){lcpEvents.push(new LcpCandidateEvent(lcpEvent));}else if(LcpInvalidateEvent.isLcpInvalidateEvent(lcpEvent)){lcpEvents.push(new LcpInvalidateEvent(lcpEvent));}}
-const lcpEventsGroupedByNavigation=new Map();for(const e of lcpEvents){const key=e.mainFrameTreeNodeId;if(!lcpEventsGroupedByNavigation.has(key)){lcpEventsGroupedByNavigation.set(key,[]);}
-lcpEventsGroupedByNavigation.get(key).push(e);}
-const finalLcpEventOfEachNavigation=[];for(const lcpEventList of lcpEventsGroupedByNavigation.values()){lcpEventList.sort((a,b)=>a.start-b.start);finalLcpEventOfEachNavigation.push(lcpEventList[lcpEventList.length-1]);}
-return finalLcpEventOfEachNavigation;}}
-return{LCP_CANDIDATE_EVENT_TITLE,LCP_INVALIDATE_EVENT_TITLE,LargestContentfulPaint,};});'use strict';tr.exportTo('tr.b.math',function(){function earthMoversDistance(firstHistogram,secondHistogram){const buckets=firstHistogram.length;if(secondHistogram.length!==buckets){throw new Error('Histograms have a different number of bins.');}
-const arrSum=arr=>arr.reduce((a,b)=>a+b,0);if(arrSum(firstHistogram)!==arrSum(secondHistogram)){throw new Error('The histograms\' sizes don\'t match.');}
-let total=0;let remainder=0;for(let bucket=0;bucket<buckets;bucket++){remainder+=secondHistogram[bucket]-
-firstHistogram[bucket];total+=Math.abs(remainder);}
-return total;}
-return{earthMoversDistance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const earthMoversDistance=tr.b.math.earthMoversDistance;class SpeedIndex{static getSnapshotsProgress_(timestampedColorHistograms){const numberOfScreenshots=timestampedColorHistograms.length;const firstHistogram=timestampedColorHistograms[0].colorHistogram;const lastHistogram=timestampedColorHistograms[numberOfScreenshots-1].colorHistogram;const totalDistance=earthMoversDistance(firstHistogram[0],lastHistogram[0])+
-earthMoversDistance(firstHistogram[1],lastHistogram[1])+
-earthMoversDistance(firstHistogram[2],lastHistogram[2]);if(totalDistance===0){return[{value:1,ts:timestampedColorHistograms[0].ts}];}
-const snapshotsProgress=new Array(numberOfScreenshots);for(let i=0;i<numberOfScreenshots;i++){const histogram=timestampedColorHistograms[i].colorHistogram;const distance=earthMoversDistance(histogram[0],lastHistogram[0])+
-earthMoversDistance(histogram[1],lastHistogram[1])+
-earthMoversDistance(histogram[2],lastHistogram[2]);const moved=Math.max(totalDistance-distance,0);snapshotsProgress[i]={value:(moved/totalDistance),ts:timestampedColorHistograms[i].ts};}
-return snapshotsProgress;}
-static speedIndexFromSnapshotsProgress_(snapshotsProgress){if(snapshotsProgress.length===0){throw new Error('No snapshots were provided.');}
-let prevSnapshotTimeTaken=0;let prevSnapshotProgress=0;let speedIndex=0;const numberOfScreenshots=snapshotsProgress.length;for(let i=0;i<numberOfScreenshots;i++){const elapsed=snapshotsProgress[i].ts-prevSnapshotTimeTaken;speedIndex+=elapsed*(1.0-prevSnapshotProgress);prevSnapshotTimeTaken=snapshotsProgress[i].ts;prevSnapshotProgress=snapshotsProgress[i].value;}
-return Math.round(speedIndex);}
-static createColorHistogram(imagePixelValues){const n=imagePixelValues.length;const histogram=new Array(3);for(let j=0;j<3;j++){histogram[j]=new Array(256).fill(0);}
-for(let i=0;i<n;i+=4){const r=imagePixelValues[i];const g=imagePixelValues[i+1];const b=imagePixelValues[i+2];histogram[0][r]++;histogram[1][g]++;histogram[2][b]++;}
-return histogram;}
-static calculateSpeedIndex(timestampedColorHistograms){const snapshotsProgress=SpeedIndex.getSnapshotsProgress_(timestampedColorHistograms);return SpeedIndex.speedIndexFromSnapshotsProgress_(snapshotsProgress);}
-static lineSweep(lineSweepRects,viewport){const verticalSweepEdges=[];const horizontalSweepEdges=[];for(let i=0;i<lineSweepRects.length;i++){const rect=lineSweepRects[i];let left=rect.left;let right=rect.right;let top=rect.top;let bottom=rect.bottom;if(left>viewport.x+viewport.width)continue;if(right<viewport.x)continue;if(top>viewport.y+viewport.height)continue;if(bottom<viewport.y)continue;left=Math.max(left,viewport.y);right=Math.min(right,viewport.y+viewport.width);top=Math.max(top,viewport.y);bottom=Math.min(bottom,viewport.y+viewport.height);verticalSweepEdges.push({id:i,value:left,type:'left'},{id:i,value:right,type:'right'});horizontalSweepEdges.push({id:i,value:top,type:'top'},{id:i,value:bottom,type:'bottom'});}
-if(verticalSweepEdges.length===0||horizontalSweepEdges.length===0){return 0;}
-verticalSweepEdges.sort((a,b)=>a.value-b.value);horizontalSweepEdges.sort((a,b)=>a.value-b.value);const active=new Array(lineSweepRects.length).fill(false);let area=0;active[verticalSweepEdges[0].id]=true;for(let i=1;i<verticalSweepEdges.length;i++){const currentLine=verticalSweepEdges[i];const previousLine=verticalSweepEdges[i-1];const deltaX=currentLine.value-previousLine.value;if(deltaX===0)continue;let count=0;let firstRect;for(let j=0;j<horizontalSweepEdges.length;j++){if(active[horizontalSweepEdges[j].id]===true){if(horizontalSweepEdges[j].type==='top'){if(count===0){firstRect=j;}
-count++;}else{if(count===1){const deltaY=horizontalSweepEdges[j].value-
-horizontalSweepEdges[firstRect].value;area+=deltaX*deltaY;}
-count--;}}}
-active[currentLine.id]=(currentLine.type==='left');}
-return area;}
-static quadToRect(quad){const left=Math.min(quad[0],quad[2],quad[4]);const right=Math.max(quad[0],quad[2],quad[4]);const top=Math.min(quad[1],quad[3],quad[5]);const bottom=Math.max(quad[1],quad[3],quad[5]);return{left,right,top,bottom};}
-static calculateRectsBasedSpeedIndex(timestampedPaintRects,viewport){const numberOfRects=timestampedPaintRects.length;if(numberOfRects===0){throw new Error('Can\'t calculate speed index without any paint '+'rectangles.');}
-const areaAddedAtTimestamp=new Array(numberOfRects);const rects=[];let previousAreaOfUnion=0;let totalAreaOfUnion=0;for(let i=numberOfRects-1;i>=0;i--){rects.push(timestampedPaintRects[i].rect);const currentAreaOfUnion=SpeedIndex.lineSweep(rects,viewport);areaAddedAtTimestamp[i]={value:currentAreaOfUnion-previousAreaOfUnion,ts:timestampedPaintRects[i].ts};totalAreaOfUnion+=areaAddedAtTimestamp[i].value;previousAreaOfUnion=currentAreaOfUnion;}
-const paintProgressAtTimestamp=new Array(numberOfRects);let lastProgressRecorded=0;for(let i=0;i<numberOfRects;i++){paintProgressAtTimestamp[i]={value:areaAddedAtTimestamp[i].value/totalAreaOfUnion+
-lastProgressRecorded,ts:areaAddedAtTimestamp[i].ts};lastProgressRecorded=paintProgressAtTimestamp[i].value;}
-return SpeedIndex.speedIndexFromSnapshotsProgress_(paintProgressAtTimestamp);}}
-return{SpeedIndex,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const SpeedIndex=tr.e.chrome.SpeedIndex;const EventFinderUtils=tr.e.chrome.EventFinderUtils;const BIN_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,1e3,20).addLinearBins(3e3,20).addExponentialBins(20e3,20);const SUMMARY_OPTIONS={avg:true,count:false,max:true,min:true,std:true,sum:false,};function addRectsBasedSpeedIndexSample(samples,rendererHelper,navigationStart,loadDuration,frameID){let viewport;for(const event of EventFinderUtils.getMainThreadEvents(rendererHelper,'viewport','loading')){if(event.args.data.frameID===frameID&&event.start<(navigationStart+loadDuration)){viewport=event.args.data;}}
-if(!viewport)return;const timestampedPaintRects=[];for(const event of EventFinderUtils.getMainThreadEvents(rendererHelper,'PaintTimingVisualizer::LayoutObjectPainted','loading')){if(event.start>=navigationStart&&event.start<navigationStart+loadDuration){const paintRect=event.args.data.rect;if(!paintRect)continue;timestampedPaintRects.push({rect:SpeedIndex.quadToRect(paintRect),ts:event.start});}}
-const numberOfRects=timestampedPaintRects.length;if(numberOfRects===0)return;samples.push({value:SpeedIndex.calculateRectsBasedSpeedIndex(timestampedPaintRects,viewport)-navigationStart});}
-function collectRectsBasedSpeedIndexSamplesFromLoadExpectations(model,chromeHelper){const rectsBasedSpeedIndexSamples=[];for(const expectation of model.userModel.expectations){if(!(expectation instanceof tr.model.um.LoadExpectation))continue;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(expectation.url)){continue;}
-const rendererHelper=chromeHelper.rendererHelpers[expectation.renderProcess.pid];addRectsBasedSpeedIndexSample(rectsBasedSpeedIndexSamples,rendererHelper,expectation.navigationStart.start,expectation.duration,expectation.navigationStart.args.frame);}
-return rectsBasedSpeedIndexSamples;}
-function rectsBasedSpeedIndexMetric(histograms,model){const rectsBasedSpeedIndexHistogram=histograms.createHistogram('rectsBasedSpeedIndex',timeDurationInMs_smallerIsBetter,[],{binBoundaries:BIN_BOUNDARIES,description:' the average time at which visible parts of the'+' page are displayed (in ms).',summaryOptions:SUMMARY_OPTIONS,});const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const samples=collectRectsBasedSpeedIndexSamplesFromLoadExpectations(model,chromeHelper);for(const sample of samples){rectsBasedSpeedIndexHistogram.addSample(sample.value);}}
-tr.metrics.MetricRegistry.register(rectsBasedSpeedIndexMetric);return{rectsBasedSpeedIndexMetric};});'use strict';tr.exportTo('tr.v.d',function(){const ALERT_GROUPS={CPU_USAGE:'cpu_usage',LOADING_PAINT:'loading_paint',LOADING_INTERACTIVITY:'loading_interactivity',LOADING_LAYOUT:'loading_layout',};return{ALERT_GROUPS,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const LONG_TASK_THRESHOLD_MS=50;const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const unitlessNumber_smallerIsBetter=tr.b.Unit.byName.unitlessNumber_smallerIsBetter;const RelatedEventSet=tr.v.d.RelatedEventSet;const hasCategoryAndName=tr.metrics.sh.hasCategoryAndName;const EventFinderUtils=tr.e.chrome.EventFinderUtils;function createBreakdownDiagnostic(breakdownTree){const breakdownDiagnostic=new tr.v.d.Breakdown();breakdownDiagnostic.colorScheme=tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER;for(const label in breakdownTree){breakdownDiagnostic.set(label,breakdownTree[label].total);}
-return breakdownDiagnostic;}
-const LOADING_METRIC_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,1e3,20).addLinearBins(3e3,20).addExponentialBins(20e3,20);const TIME_TO_INTERACTIVE_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,40e3,35).addExponentialBins(80e3,15);const LAYOUT_SHIFT_SCORE_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,50,25);const SUMMARY_OPTIONS={avg:true,count:false,max:true,min:true,std:true,sum:false,};function findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,ts){const objects=rendererHelper.process.objects;const frameLoaderInstances=objects.instancesByTypeName_.FrameLoader;if(frameLoaderInstances===undefined)return undefined;let snapshot;for(const instance of frameLoaderInstances){if(!instance.isAliveAt(ts))continue;const maybeSnapshot=instance.getSnapshotAt(ts);if(frameIdRef!==maybeSnapshot.args.frame.id_ref)continue;snapshot=maybeSnapshot;}
-return snapshot;}
-function findAllEvents(rendererHelper,category,title){const targetEvents=[];for(const ev of rendererHelper.process.getDescendantEvents()){if(!hasCategoryAndName(ev,category,title))continue;targetEvents.push(ev);}
-return targetEvents;}
-function getMostRecentValidEvent(rendererHelper,category,title){const targetEvents=findAllEvents(rendererHelper,category,title);let validEvent;for(const targetEvent of targetEvents){if(rendererHelper.isTelemetryInternalEvent(targetEvent))continue;if(validEvent===undefined){validEvent=targetEvent;}else{if(validEvent.start<targetEvent.start){validEvent=targetEvent;}}}
-return validEvent;}
-function getFirstViewportReadySamples(rendererHelper,navIdToNavStartEvents){const samples=[];const pcEvent=getMostRecentValidEvent(rendererHelper,'blink.user_timing','pc');if(pcEvent===undefined)return samples;if(rendererHelper.isTelemetryInternalEvent(pcEvent))return samples;const navigationStartEvent=navIdToNavStartEvents.get(pcEvent.args.data.navigationId);if(navigationStartEvent===undefined)return samples;const navStartToEventRange=tr.b.math.Range.fromExplicitRange(navigationStartEvent.start,pcEvent.start);const networkEvents=EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,navStartToEventRange);if(rendererHelper.mainThread===undefined)return samples;const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,navStartToEventRange);samples.push({value:navStartToEventRange.duration,breakdownTree,diagnostics:{breakdown:createBreakdownDiagnostic(breakdownTree),Start:new RelatedEventSet(navigationStartEvent),End:new RelatedEventSet(pcEvent)}});return samples;}
-function getAboveTheFoldLoadedToVisibleSamples(rendererHelper){const samples=[];const pcEvent=getMostRecentValidEvent(rendererHelper,'blink.user_timing','pc');const visibleEvent=getMostRecentValidEvent(rendererHelper,'blink.user_timing','visible');if(pcEvent!==undefined&&visibleEvent!==undefined){samples.push({value:Math.max(0.0,pcEvent.start-visibleEvent.start),diagnostics:{Start:new RelatedEventSet(visibleEvent),End:new RelatedEventSet(pcEvent)}});}
-return samples;}
-function findTimeToXEntries(category,eventName,rendererHelper,frameToNavStartEvents,navIdToNavStartEvents){const targetEvents=findAllEvents(rendererHelper,category,eventName);const entries=[];for(const targetEvent of targetEvents){if(rendererHelper.isTelemetryInternalEvent(targetEvent))continue;const frameIdRef=targetEvent.args.frame;const snapshot=findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,targetEvent.start);if(snapshot===undefined||!snapshot.args.isLoadingMainFrame)continue;const url=snapshot.args.documentLoaderURL;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(url))continue;let navigationStartEvent;if(targetEvent.args.data===undefined||targetEvent.args.data.navigationId===undefined){navigationStartEvent=EventFinderUtils.findLastEventStartingOnOrBeforeTimestamp(frameToNavStartEvents.get(frameIdRef)||[],targetEvent.start);}else{navigationStartEvent=navIdToNavStartEvents.get(targetEvent.args.data.navigationId);}
-if(navigationStartEvent===undefined)continue;entries.push({navigationStartEvent,targetEvent,url,});}
-return entries;}
-function collectTimeToEvent(rendererHelper,timeToXEntries){const samples=[];for(const{targetEvent,navigationStartEvent,url}of timeToXEntries){const navStartToEventRange=tr.b.math.Range.fromExplicitRange(navigationStartEvent.start,targetEvent.start);const networkEvents=EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,navStartToEventRange);const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,navStartToEventRange);samples.push({value:navStartToEventRange.duration,breakdownTree,diagnostics:{breakdown:createBreakdownDiagnostic(breakdownTree),url:new tr.v.d.GenericSet([url]),Start:new RelatedEventSet(navigationStartEvent),End:new RelatedEventSet(targetEvent)}});}
-return samples;}
-function collectTimeToEventInCpuTime(rendererHelper,timeToXEntries){const samples=[];for(const{targetEvent,navigationStartEvent,url}of timeToXEntries){const navStartToEventRange=tr.b.math.Range.fromExplicitRange(navigationStartEvent.start,targetEvent.start);const mainThreadCpuTime=rendererHelper.mainThread.getCpuTimeForRange(navStartToEventRange);const breakdownTree=tr.metrics.sh.generateCpuTimeBreakdownTree(rendererHelper.mainThread,navStartToEventRange);samples.push({value:mainThreadCpuTime,breakdownTree,diagnostics:{breakdown:createBreakdownDiagnostic(breakdownTree),start:new RelatedEventSet(navigationStartEvent),end:new RelatedEventSet(targetEvent),infos:new tr.v.d.GenericSet([{pid:rendererHelper.pid,start:navigationStartEvent.start,event:targetEvent.start,}]),}});}
-return samples;}
-function findMainFrameLayoutShiftSamples(rendererHelper){let sample;EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,'LayoutShift','loading').forEach((events)=>{const evData=events.pop().args.data;if(evData.is_main_frame){sample={value:evData.cumulative_score};}});return sample?[sample]:[];}
-function findAllLayoutShiftSamples(chromeHelper){let total=0;let foundMainFrame=false;for(const pid in chromeHelper.rendererHelpers){const rendererHelper=chromeHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI)continue;tr.e.chrome.EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,'LayoutShift','loading').forEach((events)=>{for(const event of events){const evData=event.args.data;if(evData.is_main_frame){total+=evData.score;foundMainFrame=true;}else{total+=evData.weighted_score_delta;}}});}
-return foundMainFrame?[{value:total}]:[];}
-function addFirstMeaningfulPaintSample(samples,rendererHelper,navigationStart,fmpMarkerEvent,url){const navStartToFMPRange=tr.b.math.Range.fromExplicitRange(navigationStart.start,fmpMarkerEvent.start);const networkEvents=EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,navStartToFMPRange);const timeToFirstMeaningfulPaint=navStartToFMPRange.duration;const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,navStartToFMPRange);samples.push({value:timeToFirstMeaningfulPaint,breakdownTree,diagnostics:{breakdown:createBreakdownDiagnostic(breakdownTree),start:new RelatedEventSet(navigationStart),end:new RelatedEventSet(fmpMarkerEvent),infos:new tr.v.d.GenericSet([{url,pid:rendererHelper.pid,start:navigationStart.start,fmp:fmpMarkerEvent.start,}]),}});}
-function addFirstMeaningfulPaintCpuTimeSample(samples,rendererHelper,navigationStart,fmpMarkerEvent,url){const navStartToFMPRange=tr.b.math.Range.fromExplicitRange(navigationStart.start,fmpMarkerEvent.start);const mainThreadCpuTime=rendererHelper.mainThread.getCpuTimeForRange(navStartToFMPRange);const breakdownTree=tr.metrics.sh.generateCpuTimeBreakdownTree(rendererHelper.mainThread,navStartToFMPRange);samples.push({value:mainThreadCpuTime,breakdownTree,diagnostics:{breakdown:createBreakdownDiagnostic(breakdownTree),start:new RelatedEventSet(navigationStart),end:new RelatedEventSet(fmpMarkerEvent),infos:new tr.v.d.GenericSet([{url,pid:rendererHelper.pid,start:navigationStart.start,fmp:fmpMarkerEvent.start,}]),}});}
-function decorateInteractivitySampleWithDiagnostics_(rendererHelper,eventTimestamp,navigationStartEvent,firstContentfulPaintTime,domContentLoadedEndTime,url){if(eventTimestamp===undefined)return undefined;const navigationStartTime=navigationStartEvent.start;const navStartToEventTimeRange=tr.b.math.Range.fromExplicitRange(navigationStartTime,eventTimestamp);const networkEvents=EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,navStartToEventTimeRange);const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,navStartToEventTimeRange);const breakdownDiagnostic=createBreakdownDiagnostic(breakdownTree);return{value:navStartToEventTimeRange.duration,diagnostics:tr.v.d.DiagnosticMap.fromObject({'Start':new RelatedEventSet(navigationStartEvent),'Navigation infos':new tr.v.d.GenericSet([{url,pid:rendererHelper.pid,navigationStartTime,firstContentfulPaintTime,domContentLoadedEndTime,eventTimestamp,}]),'Breakdown of [navStart, eventTimestamp]':breakdownDiagnostic,}),};}
-function getCandidateIndex(entry){return entry.targetEvent.args.data.candidateIndex;}
-function findLastCandidateForEachNavigation(timeToXEntries){const entryMap=new Map();for(const e of timeToXEntries){const navStartEvent=e.navigationStartEvent;if(!entryMap.has(navStartEvent)){entryMap.set(navStartEvent,[]);}
-entryMap.get(navStartEvent).push(e);}
-const lastCandidates=[];for(const timeToXEntriesByNavigation of entryMap.values()){let lastCandidate=timeToXEntriesByNavigation.shift();for(const entry of timeToXEntriesByNavigation){if(getCandidateIndex(entry)>getCandidateIndex(lastCandidate)){lastCandidate=entry;}}
-lastCandidates.push(lastCandidate);}
-return lastCandidates;}
-function findLargestTextPaintSamples(rendererHelper,frameToNavStartEvents,navIdToNavStartEvents){const timeToPaintEntries=findTimeToXEntries('loading','LargestTextPaint::Candidate',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const timeToPaintBlockingEntries=findTimeToXEntries('loading','LargestTextPaint::NoCandidate',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const lastCandidateEvents=findLastCandidateForEachNavigation(timeToPaintEntries.concat(timeToPaintBlockingEntries)).filter(event=>event.targetEvent.title!=='LargestTextPaint::NoCandidate');return collectTimeToEvent(rendererHelper,lastCandidateEvents);}
-function findLargestImagePaintSamples(rendererHelper,frameToNavStartEvents,navIdToNavStartEvents){const timeToPaintEntries=findTimeToXEntries('loading','LargestImagePaint::Candidate',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const timeToPaintBlockingEntries=findTimeToXEntries('loading','LargestImagePaint::NoCandidate',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const lastCandidateEvents=findLastCandidateForEachNavigation(timeToPaintEntries.concat(timeToPaintBlockingEntries)).filter(event=>event.targetEvent.title!=='LargestImagePaint::NoCandidate');return collectTimeToEvent(rendererHelper,lastCandidateEvents);}
-function findLargestContentfulPaintHistogramSamples(allBrowserEvents){const lcp=new tr.e.chrome.LargestContentfulPaint(allBrowserEvents);const lcpSamples=lcp.findCandidates().map(candidate=>{const{durationInMilliseconds,size,type,inMainFrame,mainFrameTreeNodeId}=candidate;return{value:durationInMilliseconds,diagnostics:{size:new tr.v.d.GenericSet([size]),type:new tr.v.d.GenericSet([type]),inMainFrame:new tr.v.d.GenericSet([inMainFrame]),mainFrameTreeNodeId:new tr.v.d.GenericSet([mainFrameTreeNodeId]),},};});return lcpSamples;}
-function collectLoadingMetricsForRenderer(rendererHelper){const frameToNavStartEvents=EventFinderUtils.getSortedMainThreadEventsByFrame(rendererHelper,'navigationStart','blink.user_timing');const navIdToNavStartEvents=EventFinderUtils.getSortedMainThreadEventsByNavId(rendererHelper,'navigationStart','blink.user_timing');const firstPaintSamples=collectTimeToEvent(rendererHelper,findTimeToXEntries('loading','firstPaint',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents));const timeToFCPEntries=findTimeToXEntries('loading','firstContentfulPaint',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const firstContentfulPaintSamples=collectTimeToEvent(rendererHelper,timeToFCPEntries);const firstContentfulPaintCpuTimeSamples=collectTimeToEventInCpuTime(rendererHelper,timeToFCPEntries);const onLoadSamples=collectTimeToEvent(rendererHelper,findTimeToXEntries('blink.user_timing','loadEventStart',rendererHelper,frameToNavStartEvents,navIdToNavStartEvents));const aboveTheFoldLoadedToVisibleSamples=getAboveTheFoldLoadedToVisibleSamples(rendererHelper);const firstViewportReadySamples=getFirstViewportReadySamples(rendererHelper,navIdToNavStartEvents);const largestImagePaintSamples=findLargestImagePaintSamples(rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const largestTextPaintSamples=findLargestTextPaintSamples(rendererHelper,frameToNavStartEvents,navIdToNavStartEvents);const mainFrameLayoutShiftSamples=findMainFrameLayoutShiftSamples(rendererHelper);const navigationStartSamples=timeToFCPEntries.map(entry=>{return{value:entry.navigationStartEvent.start};});return{frameToNavStartEvents,firstPaintSamples,firstContentfulPaintSamples,firstContentfulPaintCpuTimeSamples,onLoadSamples,aboveTheFoldLoadedToVisibleSamples,firstViewportReadySamples,largestImagePaintSamples,largestTextPaintSamples,mainFrameLayoutShiftSamples,navigationStartSamples,};}
-function collectMetricsFromLoadExpectations(model,chromeHelper){const interactiveSamples=[];const firstCpuIdleSamples=[];const firstMeaningfulPaintSamples=[];const firstMeaningfulPaintCpuTimeSamples=[];const totalBlockingTimeSamples=[];for(const expectation of model.userModel.expectations){if(!(expectation instanceof tr.model.um.LoadExpectation))continue;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(expectation.url)){continue;}
-const rendererHelper=chromeHelper.rendererHelpers[expectation.renderProcess.pid];if(expectation.fmpEvent!==undefined){addFirstMeaningfulPaintSample(firstMeaningfulPaintSamples,rendererHelper,expectation.navigationStart,expectation.fmpEvent,expectation.url);addFirstMeaningfulPaintCpuTimeSample(firstMeaningfulPaintCpuTimeSamples,rendererHelper,expectation.navigationStart,expectation.fmpEvent,expectation.url);}
-if(expectation.firstCpuIdleTime!==undefined){firstCpuIdleSamples.push(decorateInteractivitySampleWithDiagnostics_(rendererHelper,expectation.firstCpuIdleTime,expectation.navigationStart,expectation.fcpEvent.start,expectation.domContentLoadedEndEvent.start,expectation.url));}
-if(expectation.timeToInteractive!==undefined){interactiveSamples.push(decorateInteractivitySampleWithDiagnostics_(rendererHelper,expectation.timeToInteractive,expectation.navigationStart,expectation.fcpEvent.start,expectation.domContentLoadedEndEvent.start,expectation.url));}
-if(expectation.totalBlockingTime!==undefined){totalBlockingTimeSamples.push({value:expectation.totalBlockingTime,diagnostics:{url:new tr.v.d.GenericSet([expectation.url]),navigationStart:new RelatedEventSet(expectation.navigationStart),firstContentfulPaint:new RelatedEventSet(expectation.fcpEvent),interactiveTime:new tr.v.d.GenericSet([expectation.timeToInteractive]),}});}}
-return{firstMeaningfulPaintSamples,firstMeaningfulPaintCpuTimeSamples,firstCpuIdleSamples,interactiveSamples,totalBlockingTimeSamples,};}
-function addSamplesToHistogram(samples,histogram,histograms){for(const sample of samples){histogram.addSample(sample.value,sample.diagnostics);if(histogram.name!=='timeToFirstContentfulPaint')continue;if(!sample.breakdownTree)continue;for(const[category,breakdown]of Object.entries(sample.breakdownTree)){const relatedName=`${histogram.name}:${category}`;let relatedHist=histograms.getHistogramsNamed(relatedName)[0];if(!relatedHist){relatedHist=histograms.createHistogram(relatedName,histogram.unit,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,summaryOptions:{count:false,max:false,min:false,sum:false,},});let relatedNames=histogram.diagnostics.get('breakdown');if(!relatedNames){relatedNames=new tr.v.d.RelatedNameMap();histogram.diagnostics.set('breakdown',relatedNames);}
-relatedNames.set(category,relatedName);}
-relatedHist.addSample(breakdown.total,{breakdown:tr.v.d.Breakdown.fromEntries(Object.entries(breakdown.events)),});}}}
-function loadingMetric(histograms,model){const firstPaintHistogram=histograms.createHistogram('timeToFirstPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'time to first paint',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],});const firstContentfulPaintHistogram=histograms.createHistogram('timeToFirstContentfulPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'time to first contentful paint',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],});const firstContentfulPaintCpuTimeHistogram=histograms.createHistogram('cpuTimeToFirstContentfulPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'CPU time to first contentful paint',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],});const onLoadHistogram=histograms.createHistogram('timeToOnload',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'time to onload. '+'This is temporary metric used for PCv1/v2 sanity checking',summaryOptions:SUMMARY_OPTIONS,});const firstMeaningfulPaintHistogram=histograms.createHistogram('timeToFirstMeaningfulPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'time to first meaningful paint',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],});const firstMeaningfulPaintCpuTimeHistogram=histograms.createHistogram('cpuTimeToFirstMeaningfulPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'CPU time to first meaningful paint',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],});const timeToInteractiveHistogram=histograms.createHistogram('timeToInteractive',timeDurationInMs_smallerIsBetter,[],{binBoundaries:TIME_TO_INTERACTIVE_BOUNDARIES,description:'Time to Interactive',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY],});const totalBlockingTimeHistogram=histograms.createHistogram('totalBlockingTime',timeDurationInMs_smallerIsBetter,[],{binBoundaries:TIME_TO_INTERACTIVE_BOUNDARIES,description:'Total Blocking Time',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY],});const timeToFirstCpuIdleHistogram=histograms.createHistogram('timeToFirstCpuIdle',timeDurationInMs_smallerIsBetter,[],{binBoundaries:TIME_TO_INTERACTIVE_BOUNDARIES,description:'Time to First CPU Idle',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_INTERACTIVITY],});const aboveTheFoldLoadedToVisibleHistogram=histograms.createHistogram('aboveTheFoldLoadedToVisible',timeDurationInMs_smallerIsBetter,[],{binBoundaries:TIME_TO_INTERACTIVE_BOUNDARIES,description:'Time from first visible to load for AMP pages only.',summaryOptions:SUMMARY_OPTIONS,});const firstViewportReadyHistogram=histograms.createHistogram('timeToFirstViewportReady',timeDurationInMs_smallerIsBetter,[],{binBoundaries:TIME_TO_INTERACTIVE_BOUNDARIES,description:'Time from navigation to load for AMP pages only. ',summaryOptions:SUMMARY_OPTIONS,});const largestImagePaintHistogram=histograms.createHistogram('largestImagePaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'Time to Largest Image Paint',summaryOptions:SUMMARY_OPTIONS,});const largestTextPaintHistogram=histograms.createHistogram('largestTextPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'Time to Largest Text Paint',summaryOptions:SUMMARY_OPTIONS,});const largestContentfulPaintHistogram=histograms.createHistogram('largestContentfulPaint',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'Time to Largest Contentful Paint',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_PAINT],});const mainFrameLayoutShiftHistogram=histograms.createHistogram('mainFrameCumulativeLayoutShift',unitlessNumber_smallerIsBetter,[],{binBoundaries:LAYOUT_SHIFT_SCORE_BOUNDARIES,description:'Main Frame Document Cumulative Layout Shift Score',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_LAYOUT],});const allLayoutShiftHistogram=histograms.createHistogram('overallCumulativeLayoutShift',unitlessNumber_smallerIsBetter,[],{binBoundaries:LAYOUT_SHIFT_SCORE_BOUNDARIES,description:'Document Cumulative Layout Shift Score with iframes',summaryOptions:SUMMARY_OPTIONS,alertGrouping:[tr.v.d.ALERT_GROUPS.LOADING_LAYOUT],});const navigationStartHistogram=histograms.createHistogram('navigationStart',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'navigationStart',summaryOptions:SUMMARY_OPTIONS,});tr.metrics.sh.rectsBasedSpeedIndexMetric(histograms,model);const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const allLayoutShiftSamples=findAllLayoutShiftSamples(chromeHelper);addSamplesToHistogram(allLayoutShiftSamples,allLayoutShiftHistogram,histograms);for(const pid in chromeHelper.rendererHelpers){const rendererHelper=chromeHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI)continue;const samplesSet=collectLoadingMetricsForRenderer(rendererHelper);const lcpSamples=findLargestContentfulPaintHistogramSamples(chromeHelper.browserHelper.mainThread.sliceGroup.slices);addSamplesToHistogram(lcpSamples,largestContentfulPaintHistogram,histograms);addSamplesToHistogram(samplesSet.firstPaintSamples,firstPaintHistogram,histograms);addSamplesToHistogram(samplesSet.firstContentfulPaintSamples,firstContentfulPaintHistogram,histograms);addSamplesToHistogram(samplesSet.firstContentfulPaintCpuTimeSamples,firstContentfulPaintCpuTimeHistogram,histograms);addSamplesToHistogram(samplesSet.onLoadSamples,onLoadHistogram,histograms);addSamplesToHistogram(samplesSet.aboveTheFoldLoadedToVisibleSamples,aboveTheFoldLoadedToVisibleHistogram,histograms);addSamplesToHistogram(samplesSet.firstViewportReadySamples,firstViewportReadyHistogram,histograms);addSamplesToHistogram(samplesSet.largestImagePaintSamples,largestImagePaintHistogram,histograms);addSamplesToHistogram(samplesSet.largestTextPaintSamples,largestTextPaintHistogram,histograms);addSamplesToHistogram(samplesSet.mainFrameLayoutShiftSamples,mainFrameLayoutShiftHistogram,histograms);addSamplesToHistogram(samplesSet.navigationStartSamples,navigationStartHistogram,histograms);}
-const samplesSet=collectMetricsFromLoadExpectations(model,chromeHelper);addSamplesToHistogram(samplesSet.firstMeaningfulPaintSamples,firstMeaningfulPaintHistogram,histograms);addSamplesToHistogram(samplesSet.firstMeaningfulPaintCpuTimeSamples,firstMeaningfulPaintCpuTimeHistogram,histograms);addSamplesToHistogram(samplesSet.interactiveSamples,timeToInteractiveHistogram,histograms);addSamplesToHistogram(samplesSet.firstCpuIdleSamples,timeToFirstCpuIdleHistogram,histograms);addSamplesToHistogram(samplesSet.totalBlockingTimeSamples,totalBlockingTimeHistogram,histograms);}
-tr.metrics.MetricRegistry.register(loadingMetric);return{loadingMetric,createBreakdownDiagnostic};});'use strict';tr.exportTo('tr.metrics',function(){const SPA_NAVIGATION_START_TO_FIRST_PAINT_DURATION_BIN_BOUNDARY=tr.v.HistogramBinBoundaries.createExponential(1,1000,50);function spaNavigationMetric(histograms,model){const histogram=new tr.v.Histogram('spaNavigationStartToFpDuration',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,SPA_NAVIGATION_START_TO_FIRST_PAINT_DURATION_BIN_BOUNDARY);histogram.description='Latency between the input event causing'+' a SPA navigation and the first paint event after it';histogram.customizeSummaryOptions({count:false,sum:false,});const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!modelHelper){return;}
-const rendererHelpers=modelHelper.rendererHelpers;if(!rendererHelpers){return;}
-const browserHelper=modelHelper.browserHelper;for(const rendererHelper of Object.values(rendererHelpers)){const spaNavigations=tr.metrics.findSpaNavigationsOnRenderer(rendererHelper,browserHelper);for(const spaNav of spaNavigations){let beginTs=0;if(spaNav.navStartCandidates.inputLatencyAsyncSlice){const beginData=spaNav.navStartCandidates.inputLatencyAsyncSlice.args.data;beginTs=model.convertTimestampToModelTime('traceEventClock',beginData.INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT.time);}else{beginTs=spaNav.navStartCandidates.goToIndexSlice.start;}
-const rangeOfInterest=tr.b.math.Range.fromExplicitRange(beginTs,spaNav.firstPaintEvent.start);const networkEvents=tr.e.chrome.EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,rangeOfInterest);const breakdownDict=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,rangeOfInterest);const breakdownDiagnostic=new tr.v.d.Breakdown();breakdownDiagnostic.colorScheme=tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER;for(const label in breakdownDict){breakdownDiagnostic.set(label,parseInt(breakdownDict[label].total*1e3)/1e3);}
-histogram.addSample(rangeOfInterest.duration,{'Breakdown of [navStart, firstPaint]':breakdownDiagnostic,'Start':new tr.v.d.RelatedEventSet(spaNav.navigationStart),'End':new tr.v.d.RelatedEventSet(spaNav.firstPaintEvent),'Navigation infos':new tr.v.d.GenericSet([{url:spaNav.url,pid:rendererHelper.pid,navStart:beginTs,firstPaint:spaNav.firstPaintEvent.start}]),});}}
-histograms.addHistogram(histogram);}
-tr.metrics.MetricRegistry.register(spaNavigationMetric);return{spaNavigationMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const LATENCY_BOUNDS=tr.v.HistogramBinBoundaries.createLinear(0,20,100);function clockSyncLatencyMetric(values,model){const domains=Array.from(model.clockSyncManager.domainsSeen).sort();for(let i=0;i<domains.length;i++){for(let j=i+1;j<domains.length;j++){const latency=model.clockSyncManager.getTimeTransformerError(domains[i],domains[j]);const hist=new tr.v.Histogram('clock_sync_latency_'+
-domains[i].toLowerCase()+'_to_'+domains[j].toLowerCase(),tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,LATENCY_BOUNDS);hist.customizeSummaryOptions({avg:true,count:false,max:false,min:false,std:false,sum:false,});hist.description='Clock sync latency for domain '+domains[i]+' to domain '+domains[j];hist.addSample(latency);values.addHistogram(hist);}}}
-tr.metrics.MetricRegistry.register(clockSyncLatencyMetric);return{clockSyncLatencyMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const CPU_TIME_PERCENTAGE_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(0.01,50,200);function cpuTimeMetric(histograms,model,opt_options){let rangeOfInterest=model.bounds;if(opt_options&&opt_options.rangeOfInterest){rangeOfInterest=opt_options.rangeOfInterest;}else{const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(chromeHelper){const chromeBounds=chromeHelper.chromeBounds;if(chromeBounds){rangeOfInterest=chromeBounds;}}}
-let allProcessCpuTime=0;for(const pid in model.processes){const process=model.processes[pid];if(tr.model.helpers.ChromeRendererHelper.isTracingProcess(process)){continue;}
-let processCpuTime=0;for(const tid in process.threads){const thread=process.threads[tid];processCpuTime+=thread.getCpuTimeForRange(rangeOfInterest);}
-allProcessCpuTime+=processCpuTime;}
-let normalizedAllProcessCpuTime=0;if(rangeOfInterest.duration>0){normalizedAllProcessCpuTime=allProcessCpuTime/rangeOfInterest.duration;}
-const unit=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const cpuTimeHist=new tr.v.Histogram('cpu_time_percentage',unit,CPU_TIME_PERCENTAGE_BOUNDARIES);cpuTimeHist.description='Percent CPU utilization, normalized against a single core. Can be '+'greater than 100% if machine has multiple cores.';cpuTimeHist.setAlertGrouping([tr.v.d.ALERT_GROUPS.CPU_USAGE]);cpuTimeHist.customizeSummaryOptions({avg:true,count:false,max:false,min:false,std:false,sum:false});cpuTimeHist.addSample(normalizedAllProcessCpuTime);histograms.addHistogram(cpuTimeHist);}
-tr.metrics.MetricRegistry.register(cpuTimeMetric,{supportsRangeOfInterest:true});return{cpuTimeMetric,};});'use strict';tr.exportTo('tr.v',function(){class HistogramDeserializer{static deserialize(data){const deserializer=new HistogramDeserializer(data[0],data[1]);return data.slice(2).map(datum=>tr.v.Histogram.deserialize(datum,deserializer));}
-constructor(objects,diagnostics){this.objects_=objects;this.diagnostics_=[];for(const[type,diagnosticsByName]of Object.entries(diagnostics||{})){for(const[name,diagnosticsById]of Object.entries(diagnosticsByName)){for(const[id,data]of Object.entries(diagnosticsById)){const diagnostic=tr.v.d.Diagnostic.deserialize(type,data,this);this.diagnostics_[parseInt(id)]={name,diagnostic};}}}}
-getObject(id){return this.objects_[id];}
-getDiagnostic(id){return this.diagnostics_[parseInt(id)];}}
-return{HistogramDeserializer};});'use strict';tr.exportTo('tr.v',function(){class HistogramGrouping{constructor(key,callback){this.key_=key;this.callback_=callback;HistogramGrouping.BY_KEY.set(key,this);}
-get key(){return this.key_;}
-get callback(){return this.callback_;}
-get label(){return this.key;}
-static buildFromTags(tags,diagnosticName){const booleanTags=new Set();const keyValueTags=new Set();for(const tag of tags){if(tag.includes(':')){const key=tag.split(':')[0];if(booleanTags.has(key)){throw new Error(`Tag "${key}" cannot be both boolean and key-value`);}
-keyValueTags.add(key);}else{if(keyValueTags.has(tag)){throw new Error(`Tag "${tag}" cannot be both boolean and key-value`);}
-booleanTags.add(tag);}}
-const groupings=[];for(const tag of booleanTags){groupings.push(HistogramGrouping.buildBooleanTagGrouping_(tag,diagnosticName));}
-for(const tag of keyValueTags){groupings.push(HistogramGrouping.buildKeyValueTagGrouping_(tag,diagnosticName));}
-return groupings;}
-static buildBooleanTagGrouping_(tag,diagnosticName){return new HistogramGrouping(`${tag}Tag`,h=>{const tags=h.diagnostics.get(diagnosticName);if(tags===undefined||!tags.has(tag))return`~${tag}`;return tag;});}
-static buildKeyValueTagGrouping_(tag,diagnosticName){return new HistogramGrouping(`${tag}Tag`,h=>{const tags=h.diagnostics.get(diagnosticName);if(tags===undefined)return`~${tag}`;const values=new Set();for(const value of tags){const kvp=value.split(':');if(kvp.length<2||kvp[0]!==tag)continue;values.add(kvp[1]);}
-if(values.size===0)return`~${tag}`;const sortedValues=Array.from(values);sortedValues.sort();return sortedValues.join(',');},`${tag} tag`);}}
-HistogramGrouping.BY_KEY=new Map();HistogramGrouping.HISTOGRAM_NAME=new HistogramGrouping('name',h=>h.name);HistogramGrouping.DISPLAY_LABEL=new HistogramGrouping('displayLabel',hist=>{const labels=hist.diagnostics.get(tr.v.d.RESERVED_NAMES.LABELS);if(labels!==undefined&&labels.size>0){return Array.from(labels).join(',');}
-const benchmarks=hist.diagnostics.get(tr.v.d.RESERVED_NAMES.BENCHMARKS);const start=hist.diagnostics.get(tr.v.d.RESERVED_NAMES.BENCHMARK_START);if(benchmarks===undefined){if(start===undefined)return'Value';return start.toString();}
-const benchmarksStr=Array.from(benchmarks).join('\n');if(start===undefined)return benchmarksStr;return benchmarksStr+'\n'+start.toString();});class GenericSetGrouping extends HistogramGrouping{constructor(name){super(name,undefined);this.callback_=this.compute_.bind(this);}
-compute_(hist){const diag=hist.diagnostics.get(this.key);if(diag===undefined)return'';const parts=Array.from(diag);parts.sort();return parts.join(',');}}
-GenericSetGrouping.NAMES=[tr.v.d.RESERVED_NAMES.ARCHITECTURES,tr.v.d.RESERVED_NAMES.BENCHMARKS,tr.v.d.RESERVED_NAMES.BOTS,tr.v.d.RESERVED_NAMES.BUILDS,tr.v.d.RESERVED_NAMES.DEVICE_IDS,tr.v.d.RESERVED_NAMES.MASTERS,tr.v.d.RESERVED_NAMES.MEMORY_AMOUNTS,tr.v.d.RESERVED_NAMES.OS_NAMES,tr.v.d.RESERVED_NAMES.OS_VERSIONS,tr.v.d.RESERVED_NAMES.PRODUCT_VERSIONS,tr.v.d.RESERVED_NAMES.STORIES,tr.v.d.RESERVED_NAMES.STORYSET_REPEATS,tr.v.d.RESERVED_NAMES.STORY_TAGS,tr.v.d.RESERVED_NAMES.TEST_PATH,];for(const name of GenericSetGrouping.NAMES){new GenericSetGrouping(name);}
-class DateRangeGrouping extends HistogramGrouping{constructor(name){super(name,undefined);this.callback_=this.compute_.bind(this);}
-compute_(hist){const diag=hist.diagnostics.get(this.key);if(diag===undefined)return'';return diag.toString();}}
-DateRangeGrouping.NAMES=[tr.v.d.RESERVED_NAMES.BENCHMARK_START,tr.v.d.RESERVED_NAMES.TRACE_START,];for(const name of DateRangeGrouping.NAMES){new DateRangeGrouping(name);}
-return{HistogramGrouping,GenericSetGrouping,DateRangeGrouping,};});'use strict';tr.exportTo('tr.v',function(){class HistogramSet{constructor(opt_histograms){this.histograms_=new Set();this.sharedDiagnosticsByGuid_=new Map();if(opt_histograms!==undefined){for(const hist of opt_histograms){this.addHistogram(hist);}}}
-has(hist){return this.histograms_.has(hist);}
-createHistogram(name,unit,samples,opt_options){const hist=tr.v.Histogram.create(name,unit,samples,opt_options);this.addHistogram(hist);return hist;}
-addHistogram(hist,opt_diagnostics){if(this.has(hist)){throw new Error('Cannot add same Histogram twice');}
-if(opt_diagnostics!==undefined){if(!(opt_diagnostics instanceof Map)){opt_diagnostics=Object.entries(opt_diagnostics);}
-for(const[name,diagnostic]of opt_diagnostics){hist.diagnostics.set(name,diagnostic);}}
-this.histograms_.add(hist);}
-addSharedDiagnosticToAllHistograms(name,diagnostic){this.addSharedDiagnostic(diagnostic);for(const hist of this){hist.diagnostics.set(name,diagnostic);}}
-addSharedDiagnostic(diagnostic){this.sharedDiagnosticsByGuid_.set(diagnostic.guid,diagnostic);}
-get length(){return this.histograms_.size;}*[Symbol.iterator](){for(const hist of this.histograms_){yield hist;}}
-getHistogramsNamed(name){return[...this].filter(h=>h.name===name);}
-getHistogramNamed(name){const histograms=this.getHistogramsNamed(name);if(histograms.length===0)return undefined;if(histograms.length>1){throw new Error(`Unexpectedly found multiple histograms named "${name}"`);}
-return histograms[0];}
-lookupDiagnostic(guid){return this.sharedDiagnosticsByGuid_.get(guid);}
-deserialize(data){for(const hist of tr.v.HistogramDeserializer.deserialize(data)){this.addHistogram(hist);}}
-importDicts(dicts){if((dicts instanceof Array)&&(dicts.length>2)&&(dicts[0]instanceof Array)){this.deserialize(dicts);return;}
-for(const dict of dicts){this.importLegacyDict(dict);}}
-importLegacyDict(dict){if(dict.type!==undefined){if(dict.type==='TagMap')return;if(!tr.v.d.Diagnostic.findTypeInfoWithName(dict.type)){throw new Error('Unrecognized shared diagnostic type '+dict.type);}
-this.sharedDiagnosticsByGuid_.set(dict.guid,tr.v.d.Diagnostic.fromDict(dict));}else{const hist=tr.v.Histogram.fromDict(dict);this.addHistogram(hist);hist.diagnostics.resolveSharedDiagnostics(this,true);}}
-asDicts(){const dicts=[];for(const diagnostic of this.sharedDiagnosticsByGuid_.values()){dicts.push(diagnostic.asDict());}
-for(const hist of this){dicts.push(hist.asDict());}
-return dicts;}
-get sourceHistograms(){const diagnosticNames=new Set();for(const hist of this){for(const diagnostic of hist.diagnostics.values()){if(!(diagnostic instanceof tr.v.d.RelatedNameMap))continue;for(const name of diagnostic.values()){diagnosticNames.add(name);}}}
-const sourceHistograms=new HistogramSet;for(const hist of this){if(!diagnosticNames.has(hist.name)){sourceHistograms.addHistogram(hist);}}
-return sourceHistograms;}
-groupHistogramsRecursively(groupings,opt_skipGroupingCallback){function recurse(histograms,level){if(level===groupings.length){return histograms;}
-const grouping=groupings[level];const groupedHistograms=tr.b.groupIntoMap(histograms,grouping.callback);if(opt_skipGroupingCallback&&opt_skipGroupingCallback(grouping,groupedHistograms)){return recurse(histograms,level+1);}
-for(const[key,group]of groupedHistograms){groupedHistograms.set(key,recurse(group,level+1));}
-return groupedHistograms;}
-return recurse([...this],0);}
-deduplicateDiagnostics(){const namesToCandidates=new Map();const diagnosticsToHistograms=new Map();const keysToDiagnostics=new Map();for(const hist of this){for(const[name,candidate]of hist.diagnostics){if(candidate.equals===undefined){this.sharedDiagnosticsByGuid_.set(candidate.guid,candidate);continue;}
-const hashKey=candidate.hashKey;if(candidate.hashKey!==undefined){if(keysToDiagnostics.has(hashKey)){hist.diagnostics.set(name,keysToDiagnostics.get(hashKey));}else{keysToDiagnostics.set(hashKey,candidate);this.sharedDiagnosticsByGuid_.set(candidate.guid,candidate);}
-continue;}
-if(diagnosticsToHistograms.get(candidate)===undefined){diagnosticsToHistograms.set(candidate,[hist]);}else{diagnosticsToHistograms.get(candidate).push(hist);}
-if(!namesToCandidates.has(name)){namesToCandidates.set(name,new Set());}
-namesToCandidates.get(name).add(candidate);}}
-for(const[name,candidates]of namesToCandidates){const deduplicatedDiagnostics=new Set();for(const candidate of candidates){let found=false;for(const test of deduplicatedDiagnostics){if(candidate.equals(test)){const hists=diagnosticsToHistograms.get(candidate);for(const hist of hists){hist.diagnostics.set(name,test);}
-found=true;break;}}
-if(!found){deduplicatedDiagnostics.add(candidate);}
-for(const diagnostic of deduplicatedDiagnostics){this.sharedDiagnosticsByGuid_.set(diagnostic.guid,diagnostic);}}}}
-buildGroupingsFromTags(names){const tags=new Map();for(const hist of this){for(const name of names){if(!hist.diagnostics.has(name))continue;if(!tags.has(name))tags.set(name,new Set());for(const tag of hist.diagnostics.get(name)){tags.get(name).add(tag);}}}
-const groupings=[];for(const[name,values]of tags){const built=tr.v.HistogramGrouping.buildFromTags(values,name);for(const grouping of built){groupings.push(grouping);}}
-return groupings;}}
-return{HistogramSet};});'use strict';tr.exportTo('tr.e.chrome',function(){function hasTitleAndCategory(event,title,category){return event.title===title&&event.category&&tr.b.getCategoryParts(event.category).includes(category);}
-function getNavStartTimestamps(rendererHelper){const navStartTimestamps=[];for(const e of rendererHelper.mainThread.sliceGroup.childEvents()){if(hasTitleAndCategory(e,'navigationStart','blink.user_timing')){navStartTimestamps.push(e.start);}}
-return navStartTimestamps;}
-function getInteractiveTimestamps(model){const interactiveTimestampsMap=new Map();const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){const timestamps=[];interactiveTimestampsMap.set(rendererHelper.pid,timestamps);}
-for(const expectation of model.userModel.expectations){if(!(expectation instanceof tr.model.um.LoadExpectation))continue;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(expectation.url)){continue;}
-if(expectation.timeToInteractive===undefined)continue;if(interactiveTimestampsMap.get(expectation.renderProcess.pid)===undefined){interactiveTimestampsMap.set(expectation.renderProcess.pid,[]);}
-interactiveTimestampsMap.get(expectation.renderProcess.pid).push(expectation.timeToInteractive);}
-return interactiveTimestampsMap;}
-function getPostInteractiveTaskWindows(interactiveTimestamps,navStartTimestamps,traceEndTimestamp){let navStartTsIndex=0;let lastTaskWindowEndTs=undefined;const taskWindows=[];for(const currTTI of interactiveTimestamps){while(navStartTsIndex<navStartTimestamps.length&&navStartTimestamps[navStartTsIndex]<currTTI){navStartTsIndex++;}
-const taskWindowEndTs=navStartTsIndex<navStartTimestamps.length?navStartTimestamps[navStartTsIndex]:traceEndTimestamp;if(taskWindowEndTs===lastTaskWindowEndTs){throw Error('Encountered two consecutive interactive timestamps '+'with no navigationStart between them. '+'PostInteractiveTaskWindow is not well defined in this case.');}
-taskWindows.push(tr.b.math.Range.fromExplicitRange(currTTI,taskWindowEndTs));lastTaskWindowEndTs=taskWindowEndTs;}
-return taskWindows;}
-function contributionToEQT(window,task){const startInWindow=Math.max(window.min,task.start);const endInWindow=Math.min(window.max,task.end);const durationInWindow=endInWindow-startInWindow;if(durationInWindow<=0)return 0;const probabilityOfTask=durationInWindow/(window.max-window.min);const minQueueingTime=task.end-endInWindow;const maxQueueingTime=task.end-startInWindow;const expectedQueueingTimeDueToTask=(maxQueueingTime+minQueueingTime)/2;return probabilityOfTask*expectedQueueingTimeDueToTask;}
-function weightedExpectedQueueingTime(window,weightedTasks){let result=0;for(const task of weightedTasks){result+=contributionToEQT(window,task)*task.weight;}
-return result;}
-function expectedQueueingTime(window,tasks){return weightedExpectedQueueingTime(window,tasks.map(function(task){return{start:task.start,end:task.end,weight:1};}));}
-class SlidingWindow{constructor(startTime,windowSize,sortedTasks){this.windowSize_=windowSize;this.sortedTasks_=sortedTasks;this.range_=tr.b.math.Range.fromExplicitRange(startTime,startTime+windowSize);this.firstTaskIndex_=sortedTasks.findIndex(task=>startTime<task.end);if(this.firstTaskIndex_===-1){this.firstTaskIndex_=sortedTasks.length;}
-this.lastTaskIndex_=-1;while(this.lastTaskIndex_+1<sortedTasks.length&&sortedTasks[this.lastTaskIndex_+1].start<startTime+windowSize){this.lastTaskIndex_++;}
-this.innerEQT_=0;for(let i=this.firstTaskIndex_+1;i<this.lastTaskIndex_;i++){this.innerEQT_+=contributionToEQT(this.range_,sortedTasks[i]);}}
-get getEQT(){let firstTaskEQT=0;if(this.firstTaskIndex_<this.sortedTasks_.length){firstTaskEQT=contributionToEQT(this.range_,this.sortedTasks_[this.firstTaskIndex_]);}
-let lastTaskEQT=0;if(this.firstTaskIndex_<this.lastTaskIndex_){lastTaskEQT=contributionToEQT(this.range_,this.sortedTasks_[this.lastTaskIndex_]);}
-return firstTaskEQT+this.innerEQT_+lastTaskEQT;}
-slide(t){this.range_=tr.b.math.Range.fromExplicitRange(t,t+this.windowSize_);if(this.firstTaskIndex_<this.sortedTasks_.length&&this.sortedTasks_[this.firstTaskIndex_].end<=t){this.firstTaskIndex_++;if(this.firstTaskIndex_<this.lastTaskIndex_){this.innerEQT_-=contributionToEQT(this.range_,this.sortedTasks_[this.firstTaskIndex_]);}}
-if(this.lastTaskIndex_+1<this.sortedTasks_.length&&this.sortedTasks_[this.lastTaskIndex_+1].start<t+this.windowSize_){if(this.firstTaskIndex_<this.lastTaskIndex_){this.innerEQT_+=contributionToEQT(this.range_,this.sortedTasks_[this.lastTaskIndex_]);}
-this.lastTaskIndex_++;}}}
-function maxExpectedQueueingTimeInSlidingWindow(startTime,endTime,windowSize,tasks){if(windowSize<=0){throw Error('The window size must be positive number');}
-if(startTime+windowSize>endTime){throw Error('The sliding window must fit in the specified time range');}
-const sortedTasks=tasks.slice().sort((a,b)=>a.start-b.start);for(let i=1;i<sortedTasks.length;i++){if(sortedTasks[i-1].end>sortedTasks[i].start){const midpoint=(sortedTasks[i-1].end+sortedTasks[i].start)/2;sortedTasks[i-1].end=midpoint;sortedTasks[i].start=midpoint;}}
-let endpoints=[];endpoints.push(startTime);endpoints.push(endTime-windowSize);for(const task of tasks){endpoints.push(task.start-windowSize);endpoints.push(task.start);endpoints.push(task.end-windowSize);endpoints.push(task.end);}
-endpoints=endpoints.filter(x=>(startTime<=x&&x+windowSize<=endTime));endpoints.sort((a,b)=>a-b);const slidingWindow=new SlidingWindow(endpoints[0],windowSize,sortedTasks);let maxEQT=0;for(const t of endpoints){slidingWindow.slide(t);maxEQT=Math.max(maxEQT,slidingWindow.getEQT);}
-return maxEQT;}
-return{getPostInteractiveTaskWindows,getNavStartTimestamps,getInteractiveTimestamps,expectedQueueingTime,maxExpectedQueueingTimeInSlidingWindow,weightedExpectedQueueingTime};});'use strict';tr.exportTo('tr.metrics.sh',function(){const WINDOW_SIZE_MS=500;const EQT_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(0.01,WINDOW_SIZE_MS,50);function containsForcedGC_(slice){return slice.findTopmostSlicesRelativeToThisSlice(tr.metrics.v8.utils.isForcedGarbageCollectionEvent).length>0;}
-function getOrCreateHistogram_(histograms,name,description){return histograms.getHistogramNamed(name)||histograms.createHistogram(name,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[],{binBoundaries:EQT_BOUNDARIES,description,summaryOptions:{avg:false,count:false,max:true,min:false,std:false,sum:false,},});}
-function expectedQueueingTimeMetric(histograms,model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const rendererHelpers=Object.values(chromeHelper.rendererHelpers);addExpectedQueueingTimeMetric_('renderer_eqt',event=>{return{start:event.start,duration:event.duration};},false,rendererHelpers,histograms,model);}
-function addExpectedQueueingTimeMetric_(eqtName,getEventTimes,isCpuTime,rendererHelpers,histograms,model){function getTasks(rendererHelper){const tasks=[];for(const slice of
-tr.e.chrome.EventFinderUtils.findToplevelSchedulerTasks(rendererHelper.mainThread)){const times=getEventTimes(slice);if(times.duration>0&&!containsForcedGC_(slice)){tasks.push({start:times.start,end:times.start+times.duration});}}
-return tasks;}
-const totalHistogram=getOrCreateHistogram_(histograms,`total:${WINDOW_SIZE_MS}ms_window:${eqtName}`,`The maximum EQT in a ${WINDOW_SIZE_MS}ms sliding window`+' for a given renderer');for(const rendererHelper of rendererHelpers){if(rendererHelper.isChromeTracingUI)continue;if(rendererHelper.mainThread===undefined)continue;if(rendererHelper.mainThread.bounds.duration<WINDOW_SIZE_MS)continue;const tasks=getTasks(rendererHelper);const totalBreakdown=getV8Contribution_(eqtName,getEventTimes,isCpuTime,totalHistogram,histograms,rendererHelper,model);totalHistogram.addSample(tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow(rendererHelper.mainThread.bounds.min,rendererHelper.mainThread.bounds.max,WINDOW_SIZE_MS,tasks),{v8:totalBreakdown});}}
-function getV8Contribution_(eqtName,getEventTimes,isCpuTime,totalEqtHistogram,histograms,rendererHelper,model){if(!model.categories.includes('v8'))return null;const totalBreakdown=new tr.v.d.Breakdown();const eventNamesWithTaskExtractors=getV8EventNamesWithTaskExtractors_(getEventTimes);if(!isCpuTime){const taskExtractorsUsingRCS=getV8EventNamesWithTaskExtractorsUsingRCS_(getEventTimes);for(const[eventName,getTasks]of taskExtractorsUsingRCS){eventNamesWithTaskExtractors.set(eventName,getTasks);}}
-let totalNames=totalEqtHistogram.diagnostics.get('v8');if(!totalNames){totalNames=new tr.v.d.RelatedNameMap();totalEqtHistogram.diagnostics.set('v8',totalNames);}
-for(const[eventName,getTasks]of eventNamesWithTaskExtractors){const totalHistogram=getOrCreateHistogram_(histograms,`total:${WINDOW_SIZE_MS}ms_window:${eqtName}:${eventName}`,`Contribution to the expected queueing time by ${eventName}`+' for a given renderer. It is computed as the maximum EQT in'+` a ${WINDOW_SIZE_MS}ms sliding window after shrinking top-level`+` tasks to contain only ${eventName} subevents`);const tasks=getTasks(rendererHelper);const totalSample=tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow(rendererHelper.mainThread.bounds.min,rendererHelper.mainThread.bounds.max,WINDOW_SIZE_MS,tasks);totalHistogram.addSample(totalSample);totalBreakdown.set(eventName,totalSample);totalNames.set(eventName,totalHistogram.name);}
-return totalBreakdown;}
-function getV8EventNamesWithTaskExtractors_(getEventTimes,cpuMetrics){function durationOfTopmostSubSlices(slice,predicate,excludePredicate){let duration=0;for(const sub of slice.findTopmostSlicesRelativeToThisSlice(predicate)){duration+=getEventTimes(sub).duration;if(excludePredicate!==null&&excludePredicate!==undefined){duration-=durationOfTopmostSubSlices(sub,excludePredicate);}}
-return duration;}
-function taskExtractor(predicate,excludePredicate){return function(rendererHelper){const slices=tr.e.chrome.EventFinderUtils.findToplevelSchedulerTasks(rendererHelper.mainThread);const result=[];for(const slice of slices){const times=getEventTimes(slice);if(times.duration>0&&!containsForcedGC_(slice)){const duration=durationOfTopmostSubSlices(slice,predicate,excludePredicate);result.push({start:times.start,end:times.start+duration});}}
-return result;};}
-return new Map([['v8',taskExtractor(tr.metrics.v8.utils.isV8Event)],['v8:execute',taskExtractor(tr.metrics.v8.utils.isV8ExecuteEvent)],['v8:gc',taskExtractor(tr.metrics.v8.utils.isGarbageCollectionEvent)]]);}
-function extractTaskRCS(getEventTimes,predicate,rendererHelper){const result=[];for(const topSlice of
-rendererHelper.mainThread.sliceGroup.topLevelSlices){const times=getEventTimes(topSlice);if(times.duration<=0||containsForcedGC_(topSlice)){continue;}
-const v8ThreadSlices=[];for(const slice of topSlice.descendentSlices){if(tr.metrics.v8.utils.isV8RCSEvent(slice)){v8ThreadSlices.push(slice);}}
-const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(v8ThreadSlices);let duration=0;for(const runtimeGroup of runtimeGroupCollection.runtimeGroups){if(predicate(runtimeGroup.name)){duration+=runtimeGroup.time;}}
-duration=tr.b.convertUnit(duration,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);result.push({start:times.start,end:times.start+duration});}
-return result;}
-function getV8EventNamesWithTaskExtractorsUsingRCS_(getEventTimes){const extractors=new Map();extractors.set('v8:compile_rcs',rendererHelper=>extractTaskRCS(getEventTimes,tr.metrics.v8.utils.isCompileRCSCategory,rendererHelper));extractors.set('v8:compile:optimize_rcs',rendererHelper=>extractTaskRCS(getEventTimes,tr.metrics.v8.utils.isCompileOptimizeRCSCategory,rendererHelper));return extractors;}
-tr.metrics.MetricRegistry.register(expectedQueueingTimeMetric);return{expectedQueueingTimeMetric,};});'use strict';tr.exportTo('tr.b',function(){function MultiDimensionalViewNode(title,valueCount){this.title=title;const dimensions=title.length;this.children=new Array(dimensions);for(let i=0;i<dimensions;i++){this.children[i]=new Map();}
-this.values=new Array(valueCount);for(let v=0;v<valueCount;v++){this.values[v]={self:0,total:0,totalState:NOT_PROVIDED};}}
-MultiDimensionalViewNode.TotalState={NOT_PROVIDED:0,LOWER_BOUND:1,EXACT:2};const NOT_PROVIDED=MultiDimensionalViewNode.TotalState.NOT_PROVIDED;const LOWER_BOUND=MultiDimensionalViewNode.TotalState.LOWER_BOUND;const EXACT=MultiDimensionalViewNode.TotalState.EXACT;MultiDimensionalViewNode.prototype={get subRows(){return Array.from(this.children[0].values());}};function MultiDimensionalViewBuilder(dimensions,valueCount){if(typeof(dimensions)!=='number'||dimensions<0){throw new Error('Dimensions must be a non-negative number');}
-this.dimensions_=dimensions;if(typeof(valueCount)!=='number'||valueCount<0){throw new Error('Number of values must be a non-negative number');}
-this.valueCount_=valueCount;this.buildRoot_=this.createRootNode_();this.topDownTreeViewRoot_=undefined;this.topDownHeavyViewRoot_=undefined;this.bottomUpHeavyViewNode_=undefined;this.complete_=false;this.maxDimensionDepths_=new Array(dimensions);for(let d=0;d<dimensions;d++){this.maxDimensionDepths_[d]=0;}}
-MultiDimensionalViewBuilder.ValueKind={SELF:0,TOTAL:1};MultiDimensionalViewBuilder.ViewType={TOP_DOWN_TREE_VIEW:0,TOP_DOWN_HEAVY_VIEW:1,BOTTOM_UP_HEAVY_VIEW:2};MultiDimensionalViewBuilder.prototype={addPath(path,values,valueKind){if(this.buildRoot_===undefined){throw new Error('Paths cannot be added after either view has been built');}
-if(path.length!==this.dimensions_){throw new Error('Path must be '+this.dimensions_+'-dimensional');}
-if(values.length!==this.valueCount_){throw new Error('Must provide '+this.valueCount_+' values');}
-let isTotal;switch(valueKind){case MultiDimensionalViewBuilder.ValueKind.SELF:isTotal=false;break;case MultiDimensionalViewBuilder.ValueKind.TOTAL:isTotal=true;break;default:throw new Error('Invalid value kind: '+valueKind);}
-let node=this.buildRoot_;for(let d=0;d<path.length;d++){const singleDimensionPath=path[d];const singleDimensionPathLength=singleDimensionPath.length;this.maxDimensionDepths_[d]=Math.max(this.maxDimensionDepths_[d],singleDimensionPathLength);for(let i=0;i<singleDimensionPathLength;i++){node=this.getOrCreateChildNode_(node,d,singleDimensionPath[i]);}}
-for(let v=0;v<this.valueCount_;v++){const addedValue=values[v];if(addedValue===undefined)continue;const nodeValue=node.values[v];if(isTotal){nodeValue.total+=addedValue;nodeValue.totalState=EXACT;}else{nodeValue.self+=addedValue;nodeValue.totalState=Math.max(nodeValue.totalState,LOWER_BOUND);}}},get complete(){return this.complete_;},set complete(isComplete){if(this.buildRoot_===undefined){throw new Error('Can\'t set complete after any view has been built.');}
-this.complete_=isComplete;},buildView(viewType){switch(viewType){case MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW:return this.buildTopDownTreeView();case MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW:return this.buildTopDownHeavyView();case MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW:return this.buildBottomUpHeavyView();default:throw new Error('Unknown multi-dimensional view type: '+viewType);}},buildTopDownTreeView(){if(this.topDownTreeViewRoot_===undefined){const treeViewRoot=this.buildRoot_;this.buildRoot_=undefined;this.setUpMissingChildRelationships_(treeViewRoot,0);this.finalizeTotalValues_(treeViewRoot,0,new WeakMap());this.topDownTreeViewRoot_=treeViewRoot;}
-return this.topDownTreeViewRoot_;},buildTopDownHeavyView(){if(this.topDownHeavyViewRoot_===undefined){this.topDownHeavyViewRoot_=this.buildGenericHeavyView_(this.addDimensionToTopDownHeavyViewNode_.bind(this));}
-return this.topDownHeavyViewRoot_;},buildBottomUpHeavyView(){if(this.bottomUpHeavyViewNode_===undefined){this.bottomUpHeavyViewNode_=this.buildGenericHeavyView_(this.addDimensionToBottomUpHeavyViewNode_.bind(this));}
-return this.bottomUpHeavyViewNode_;},createRootNode_(){return new MultiDimensionalViewNode(new Array(this.dimensions_),this.valueCount_);},getOrCreateChildNode_(parentNode,dimension,childDimensionTitle){if(dimension<0||dimension>=this.dimensions_){throw new Error('Invalid dimension');}
-const dimensionChildren=parentNode.children[dimension];let childNode=dimensionChildren.get(childDimensionTitle);if(childNode!==undefined){return childNode;}
-const childTitle=parentNode.title.slice();childTitle[dimension]=childDimensionTitle;childNode=new MultiDimensionalViewNode(childTitle,this.valueCount_);dimensionChildren.set(childDimensionTitle,childNode);return childNode;},setUpMissingChildRelationships_(node,firstDimensionToSetUp){for(let d=firstDimensionToSetUp;d<this.dimensions_;d++){const currentDimensionChildTitles=new Set(node.children[d].keys());for(let i=0;i<d;i++){for(const previousDimensionChildNode of node.children[i].values()){for(const previousDimensionGrandChildTitle of
-previousDimensionChildNode.children[d].keys()){currentDimensionChildTitles.add(previousDimensionGrandChildTitle);}}}
-for(const currentDimensionChildTitle of currentDimensionChildTitles){const currentDimensionChildNode=this.getOrCreateChildNode_(node,d,currentDimensionChildTitle);for(let i=0;i<d;i++){for(const previousDimensionChildNode of
-node.children[i].values()){const previousDimensionGrandChildNode=previousDimensionChildNode.children[d].get(currentDimensionChildTitle);if(previousDimensionGrandChildNode!==undefined){currentDimensionChildNode.children[i].set(previousDimensionChildNode.title[i],previousDimensionGrandChildNode);}}}
-this.setUpMissingChildRelationships_(currentDimensionChildNode,d);}}},finalizeTotalValues_(node,firstDimensionToFinalize,dimensionalSelfSumsMap){const dimensionalSelfSums=new Array(this.dimensions_);const minResidual=new Array(this.valueCount_);for(let v=0;v<this.valueCount_;v++)minResidual[v]=0;const nodeValues=node.values;const nodeSelfSums=new Array(this.valueCount_);for(let v=0;v<this.valueCount_;v++){nodeSelfSums[v]=nodeValues[v].self;}
-for(let d=0;d<this.dimensions_;d++){const childResidualSums=new Array(this.valueCount_);for(let v=0;v<this.valueCount_;v++){childResidualSums[v]=0;}
-for(const childNode of node.children[d].values()){if(d>=firstDimensionToFinalize){this.finalizeTotalValues_(childNode,d,dimensionalSelfSumsMap);}
-const childNodeSelfSums=dimensionalSelfSumsMap.get(childNode);const childNodeValues=childNode.values;for(let v=0;v<this.valueCount_;v++){nodeSelfSums[v]+=childNodeSelfSums[d][v];const residual=childNodeValues[v].total-
-childNodeSelfSums[this.dimensions_-1][v];childResidualSums[v]+=residual;if(this.complete){nodeValues[v].totalState=EXACT;}else if(childNodeValues[v].totalState>NOT_PROVIDED){nodeValues[v].totalState=Math.max(nodeValues[v].totalState,LOWER_BOUND);}}}
-dimensionalSelfSums[d]=nodeSelfSums.slice();for(let v=0;v<this.valueCount_;v++){minResidual[v]=Math.max(minResidual[v],childResidualSums[v]);}}
-for(let v=0;v<this.valueCount_;v++){nodeValues[v].total=Math.max(nodeValues[v].total,nodeSelfSums[v]+minResidual[v]);}
-if(dimensionalSelfSumsMap.has(node)){throw new Error('Internal error: Node finalized more than once');}
-dimensionalSelfSumsMap.set(node,dimensionalSelfSums);},buildGenericHeavyView_(treeViewNodeHandler){const treeViewRoot=this.buildTopDownTreeView();const heavyViewRoot=this.createRootNode_();heavyViewRoot.values=treeViewRoot.values;const recursionDepthTrackers=new Array(this.dimensions_);for(let d=0;d<this.dimensions_;d++){recursionDepthTrackers[d]=new RecursionDepthTracker(this.maxDimensionDepths_[d],d);}
-this.addDimensionsToGenericHeavyViewNode_(treeViewRoot,heavyViewRoot,0,recursionDepthTrackers,false,treeViewNodeHandler);this.setUpMissingChildRelationships_(heavyViewRoot,0);return heavyViewRoot;},addDimensionsToGenericHeavyViewNode_(treeViewParentNode,heavyViewParentNode,startDimension,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler){for(let d=startDimension;d<this.dimensions_;d++){this.addDimensionDescendantsToGenericHeavyViewNode_(treeViewParentNode,heavyViewParentNode,d,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler);}},addDimensionDescendantsToGenericHeavyViewNode_(treeViewParentNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler){const treeViewChildren=treeViewParentNode.children[currentDimension];const recursionDepthTracker=recursionDepthTrackers[currentDimension];for(const treeViewChildNode of treeViewChildren.values()){recursionDepthTracker.push(treeViewChildNode);treeViewNodeHandler(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive);this.addDimensionDescendantsToGenericHeavyViewNode_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler);recursionDepthTracker.pop();}},addDimensionToTopDownHeavyViewNode_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive){this.addDimensionToTopDownHeavyViewNodeRecursively_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,1);},addDimensionToTopDownHeavyViewNodeRecursively_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,subTreeDepth){const recursionDepthTracker=recursionDepthTrackers[currentDimension];const currentDimensionRecursive=subTreeDepth<=recursionDepthTracker.recursionDepth;const currentOrPreviousDimensionsRecursive=currentDimensionRecursive||previousDimensionsRecursive;const dimensionTitle=treeViewChildNode.title[currentDimension];const heavyViewChildNode=this.getOrCreateChildNode_(heavyViewParentNode,currentDimension,dimensionTitle);this.addNodeValues_(treeViewChildNode,heavyViewChildNode,!currentOrPreviousDimensionsRecursive);this.addDimensionsToGenericHeavyViewNode_(treeViewChildNode,heavyViewChildNode,currentDimension+1,recursionDepthTrackers,currentOrPreviousDimensionsRecursive,this.addDimensionToTopDownHeavyViewNode_.bind(this));for(const treeViewGrandChildNode of
-treeViewChildNode.children[currentDimension].values()){recursionDepthTracker.push(treeViewGrandChildNode);this.addDimensionToTopDownHeavyViewNodeRecursively_(treeViewGrandChildNode,heavyViewChildNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,subTreeDepth+1);recursionDepthTracker.pop();}},addDimensionToBottomUpHeavyViewNode_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive){const recursionDepthTracker=recursionDepthTrackers[currentDimension];const bottomIndex=recursionDepthTracker.bottomIndex;const topIndex=recursionDepthTracker.topIndex;const firstNonRecursiveIndex=bottomIndex+recursionDepthTracker.recursionDepth;const viewNodePath=recursionDepthTracker.viewNodePath;const trackerAncestorNode=recursionDepthTracker.trackerAncestorNode;let heavyViewDescendantNode=heavyViewParentNode;for(let i=bottomIndex;i<topIndex;i++){const treeViewAncestorNode=viewNodePath[i];const dimensionTitle=treeViewAncestorNode.title[currentDimension];heavyViewDescendantNode=this.getOrCreateChildNode_(heavyViewDescendantNode,currentDimension,dimensionTitle);const currentDimensionRecursive=i<firstNonRecursiveIndex;const currentOrPreviousDimensionsRecursive=currentDimensionRecursive||previousDimensionsRecursive;this.addNodeValues_(treeViewChildNode,heavyViewDescendantNode,!currentOrPreviousDimensionsRecursive);this.addDimensionsToGenericHeavyViewNode_(treeViewChildNode,heavyViewDescendantNode,currentDimension+1,recursionDepthTrackers,currentOrPreviousDimensionsRecursive,this.addDimensionToBottomUpHeavyViewNode_.bind(this));}},addNodeValues_(sourceNode,targetNode,addTotal){const targetNodeValues=targetNode.values;const sourceNodeValues=sourceNode.values;for(let v=0;v<this.valueCount_;v++){const targetNodeValue=targetNodeValues[v];const sourceNodeValue=sourceNodeValues[v];targetNodeValue.self+=sourceNodeValue.self;if(addTotal){targetNodeValue.total+=sourceNodeValue.total;if(this.complete){targetNodeValue.totalState=EXACT;}else if(sourceNodeValue.totalState>NOT_PROVIDED){targetNodeValue.totalState=Math.max(targetNodeValue.totalState,LOWER_BOUND);}}}}};function RecursionDepthTracker(maxDepth,dimension){this.titlePath=new Array(maxDepth);this.viewNodePath=new Array(maxDepth);this.bottomIndex=this.topIndex=maxDepth;this.dimension_=dimension;this.currentTrackerNode_=this.createNode_(0,undefined);}
-RecursionDepthTracker.prototype={push(viewNode){if(this.bottomIndex===0){throw new Error('Cannot push to a full tracker');}
-const title=viewNode.title[this.dimension_];this.bottomIndex--;this.titlePath[this.bottomIndex]=title;this.viewNodePath[this.bottomIndex]=viewNode;let childTrackerNode=this.currentTrackerNode_.children.get(title);if(childTrackerNode!==undefined){this.currentTrackerNode_=childTrackerNode;return;}
-const maxLengths=zFunction(this.titlePath,this.bottomIndex);let recursionDepth=0;for(let i=0;i<maxLengths.length;i++){recursionDepth=Math.max(recursionDepth,maxLengths[i]);}
-childTrackerNode=this.createNode_(recursionDepth,this.currentTrackerNode_);this.currentTrackerNode_.children.set(title,childTrackerNode);this.currentTrackerNode_=childTrackerNode;},pop(){if(this.bottomIndex===this.topIndex){throw new Error('Cannot pop from an empty tracker');}
-this.titlePath[this.bottomIndex]=undefined;this.viewNodePath[this.bottomIndex]=undefined;this.bottomIndex++;this.currentTrackerNode_=this.currentTrackerNode_.parent;},get recursionDepth(){return this.currentTrackerNode_.recursionDepth;},createNode_(recursionDepth,parent){return{recursionDepth,parent,children:new Map()};}};function zFunction(list,startIndex){const n=list.length-startIndex;if(n===0)return[];const z=new Array(n);z[0]=0;for(let i=1,left=0,right=0;i<n;++i){let maxLength;if(i<=right){maxLength=Math.min(right-i+1,z[i-left]);}else{maxLength=0;}
-while(i+maxLength<n&&list[startIndex+maxLength]===list[startIndex+i+maxLength]){++maxLength;}
-if(i+maxLength-1>right){left=i;right=i+maxLength-1;}
-z[i]=maxLength;}
-return z;}
-return{MultiDimensionalViewBuilder,MultiDimensionalViewNode,RecursionDepthTracker,zFunction,};});'use strict';tr.exportTo('tr.e.chrome',function(){class CpuTime{static getStageToInitiatorToSegmentBounds(segments,rangeOfInterest){const stageToInitiatorToRanges=new Map();stageToInitiatorToRanges.set('all_stages',new Map([['all_initiators',new Set()]]));const allRanges=stageToInitiatorToRanges.get('all_stages').get('all_initiators');for(const segment of segments){if(!rangeOfInterest.intersectsRangeInclusive(segment.range))continue;const intersectingRange=rangeOfInterest.findIntersection(segment.range);allRanges.add(intersectingRange);for(const expectation of segment.expectations){const stageTitle=expectation.stageTitle;if(!stageToInitiatorToRanges.has(stageTitle)){stageToInitiatorToRanges.set(stageTitle,new Map([['all_initiators',new Set()]]));}
-const initiatorToRanges=stageToInitiatorToRanges.get(stageTitle);initiatorToRanges.get('all_initiators').add(intersectingRange);const initiatorType=expectation.initiatorType;if(initiatorType){if(!initiatorToRanges.has(initiatorType)){initiatorToRanges.set(initiatorType,new Set());}
-initiatorToRanges.get(initiatorType).add(intersectingRange);}}}
-return stageToInitiatorToRanges;}
-static constructMultiDimensionalView(model,rangeOfInterest){const mdvBuilder=new tr.b.MultiDimensionalViewBuilder(3,2);const stageToInitiatorToRanges=CpuTime.getStageToInitiatorToSegmentBounds(model.userModel.segments,rangeOfInterest);const allSegmentBoundsInRange=stageToInitiatorToRanges.get('all_stages').get('all_initiators');for(const[pid,process]of Object.entries(model.processes)){const processType=tr.e.chrome.chrome_processes.canonicalizeProcessName(process.name);for(const[tid,thread]of Object.entries(process.threads)){const rangeToCpuTime=new Map();for(const range of allSegmentBoundsInRange){rangeToCpuTime.set(range,thread.getCpuTimeForRange(range));}
-for(const[stage,initiatorToRanges]of stageToInitiatorToRanges){for(const[initiator,ranges]of initiatorToRanges){const cpuTime=tr.b.math.Statistics.sum(ranges,range=>rangeToCpuTime.get(range));const duration=tr.b.math.Statistics.sum(ranges,range=>range.duration);const cpuTimePerSecond=cpuTime/duration;mdvBuilder.addPath([[processType],[thread.type],[stage,initiator]],[cpuTimePerSecond,cpuTime],tr.b.MultiDimensionalViewBuilder.ValueKind.TOTAL);}}}}
-return mdvBuilder.buildTopDownTreeView();}}
-return{CpuTime,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const CPU_PERCENTAGE_UNIT=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const CPU_TIME_UNIT=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;function clonePath_(previousPath){return previousPath.map(subPath=>subPath.map(x=>x));}
-function decodePath_(path){return{processType:path[0][0],threadType:path[1][0],railStage:path[2][0],initiatorType:path[2][1]};}
-function stringifyPathName_(path){const decodedPath=decodePath_(path);return[decodedPath.processType,decodedPath.threadType,decodedPath.railStage,decodedPath.initiatorType].join(':');}
-class CpuTimeTreeDataReporter{constructor(){this.visitedSet_=new Set();}
-reportValuesFromNode_(node,path){const decodedPath=decodePath_(path);const processType=decodedPath.processType||'all_processes';const threadType=decodedPath.threadType||'all_threads';if(!decodedPath.railStage||!decodedPath.initiatorType)return;const{railStage,initiatorType}=decodedPath;const serializedPathName=[processType,threadType,railStage,initiatorType].join(':');const cpuPercentageValue=node.values[0].total;const cpuTimeValue=node.values[1].total;this.histogramSet_.createHistogram(`cpuPercentage:${serializedPathName}`,CPU_PERCENTAGE_UNIT,cpuPercentageValue);this.histogramSet_.createHistogram(`cpuTime:${serializedPathName}`,CPU_TIME_UNIT,cpuTimeValue);}
-reportDataFromTree_(root,rootPath){const rootPathString=stringifyPathName_(rootPath);if(this.visitedSet_.has(rootPathString))return;this.visitedSet_.add(rootPathString);this.reportValuesFromNode_(root,rootPath);for(let dimension=0;dimension<root.children.length;dimension++){const children=root.children[dimension];for(const[name,node]of children){const childPath=clonePath_(rootPath);childPath[dimension].push(name);this.reportDataFromTree_(node,childPath);}}}
-addTreeValuesToHistogramSet(rootNode,histogramSet){const rootPath=[[],[],[]];this.rootNode_=rootNode;this.histogramSet_=histogramSet;this.reportDataFromTree_(this.rootNode_,rootPath);}
-static reportToHistogramSet(rootNode,histogramSet){const reporter=new CpuTimeTreeDataReporter();reporter.addTreeValuesToHistogramSet(rootNode,histogramSet);}}
-return{CpuTimeTreeDataReporter,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function newCpuTimeMetric(histograms,model,opt_options){const rangeOfInterest=opt_options&&opt_options.rangeOfInterest?opt_options.rangeOfInterest:model.bounds;const rootNode=tr.e.chrome.CpuTime.constructMultiDimensionalView(model,rangeOfInterest);tr.metrics.sh.CpuTimeTreeDataReporter.reportToHistogramSet(rootNode,histograms);}
-tr.metrics.MetricRegistry.register(newCpuTimeMetric,{supportsRangeOfInterest:true});return{newCpuTimeMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const includeHistogramNames=['cpuTime:all_processes:all_threads:all_stages:all_initiators','cpuPercentage:all_processes:all_threads:all_stages:all_initiators','cpuTime:browser_process:all_threads:all_stages:all_initiators','cpuPercentage:browser_process:all_threads:all_stages:all_initiators','cpuTime:renderer_processes:all_threads:all_stages:all_initiators','cpuPercentage:renderer_processes:all_threads:all_stages:all_initiators','cpuTime:gpu_process:all_threads:all_stages:all_initiators','cpuPercentage:gpu_process:all_threads:all_stages:all_initiators','cpuTime:renderer_processes:CrRendererMain:all_stages:all_initiators','cpuPercentage:renderer_processes:CrRendererMain:all_stages:all_initiators','cpuTime:browser_process:CrBrowserMain:all_stages:all_initiators','cpuPercentage:browser_process:CrBrowserMain:all_stages:all_initiators','cpuTime:all_processes:all_threads:Load:Successful','cpuPercentage:all_processes:all_threads:Load:Successful',];function limitedCpuTimeMetric(histograms,model,opt_options){const allCpuHistograms=new tr.v.HistogramSet();tr.metrics.sh.newCpuTimeMetric(allCpuHistograms,model,opt_options);for(const histogramName of includeHistogramNames){const histogram=allCpuHistograms.getHistogramNamed(histogramName);if(histogram)histograms.addHistogram(histogram);}}
-tr.metrics.MetricRegistry.register(limitedCpuTimeMetric,{supportsRangeOfInterest:true});return{limitedCpuTimeMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const LONG_TASK_MS=50;const LONGEST_TASK_MS=1000;function iterateLongTopLevelTasksOnThreadInRange(thread,opt_range,cb,opt_this){thread.sliceGroup.topLevelSlices.forEach(function(slice){if(opt_range&&!opt_range.intersectsExplicitRangeInclusive(slice.start,slice.end)){return;}
-if(slice.duration<LONG_TASK_MS)return;cb.call(opt_this,slice);});}
-function iterateRendererMainThreads(model,cb,opt_this){const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper!==undefined){Object.values(modelHelper.rendererHelpers).forEach(function(rendererHelper){if(!rendererHelper.mainThread)return;cb.call(opt_this,rendererHelper.mainThread);});}}
-const BIN_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(LONG_TASK_MS,LONGEST_TASK_MS,40);function longTasksMetric(histograms,model,opt_options){const rangeOfInterest=opt_options?opt_options.rangeOfInterest:undefined;const longTaskHist=histograms.createHistogram('longTasks',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[],{binBoundaries:BIN_BOUNDARIES,description:'durations of long tasks',});const relatedNames=new tr.v.d.RelatedNameMap();longTaskHist.diagnostics.set('categories',relatedNames);iterateRendererMainThreads(model,function(thread){iterateLongTopLevelTasksOnThreadInRange(thread,rangeOfInterest,function(task){const breakdown=new tr.v.d.Breakdown();breakdown.colorScheme=tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER;for(const slice of task.descendentSlices){const sample=slice.cpuSelfTime;if(sample===undefined)continue;const category=model.getUserFriendlyCategoryFromEvent(slice);const histName='longTasks:'+category;let hist=histograms.getHistogramNamed(histName);if(hist===undefined){hist=histograms.createHistogram(histName,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[],{binBoundaries:BIN_BOUNDARIES,});relatedNames.set(category,hist.name);}
-hist.addSample(sample,{events:new tr.v.d.RelatedEventSet([slice]),});breakdown.set(category,sample+breakdown.get(category));}
-longTaskHist.addSample(task.duration,{events:new tr.v.d.RelatedEventSet([task]),categories:breakdown,});});});}
-tr.metrics.MetricRegistry.register(longTasksMetric,{supportsRangeOfInterest:true,requiredCategories:['toplevel'],});return{longTasksMetric,iterateLongTopLevelTasksOnThreadInRange,iterateRendererMainThreads,LONG_TASK_MS,LONGEST_TASK_MS,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const BACKGROUND=tr.model.ContainerMemoryDump.LevelOfDetail.BACKGROUND;const LIGHT=tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT;const DETAILED=tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const count_smallerIsBetter=tr.b.Unit.byName.count_smallerIsBetter;const DISPLAYED_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME;const LEVEL_OF_DETAIL_NAMES=new Map();LEVEL_OF_DETAIL_NAMES.set(BACKGROUND,'background');LEVEL_OF_DETAIL_NAMES.set(LIGHT,'light');LEVEL_OF_DETAIL_NAMES.set(DETAILED,'detailed');const HEAP_PROFILER_DETAIL_NAME='heap_profiler';const BOUNDARIES_FOR_UNIT_MAP=new WeakMap();BOUNDARIES_FOR_UNIT_MAP.set(count_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(0,20,20));BOUNDARIES_FOR_UNIT_MAP.set(sizeInBytes_smallerIsBetter,new tr.v.HistogramBinBoundaries(0).addBinBoundary(1024).addExponentialBins(16*1024*1024*1024,4*24));const CHROME_PROCESS_NAMES=tr.e.chrome.chrome_processes.CHROME_PROCESS_NAMES;function memoryMetric(values,model,opt_options){const rangeOfInterest=opt_options?opt_options.rangeOfInterest:undefined;const browserNameToGlobalDumps=tr.metrics.sh.splitGlobalDumpsByBrowserName(model,rangeOfInterest);addGeneralMemoryDumpValues(browserNameToGlobalDumps,values);addDetailedMemoryDumpValues(browserNameToGlobalDumps,values);addMemoryDumpCountValues(browserNameToGlobalDumps,values);}
-const USER_FRIENDLY_BROWSER_NAMES={'chrome':'Chrome','webview':'WebView','unknown_browser':'an unknown browser'};function convertBrowserNameToUserFriendlyName(browserName){for(const baseName in USER_FRIENDLY_BROWSER_NAMES){if(!browserName.startsWith(baseName))continue;const userFriendlyBaseName=USER_FRIENDLY_BROWSER_NAMES[baseName];const suffix=browserName.substring(baseName.length);if(suffix.length===0){return userFriendlyBaseName;}else if(/^\d+$/.test(suffix)){return userFriendlyBaseName+'('+suffix+')';}}
-return'\''+browserName+'\' browser';}
-function convertProcessNameToUserFriendlyName(processName,opt_requirePlural){switch(processName){case CHROME_PROCESS_NAMES.BROWSER:return opt_requirePlural?'browser processes':'the browser process';case CHROME_PROCESS_NAMES.RENDERER:return'renderer processes';case CHROME_PROCESS_NAMES.GPU:return opt_requirePlural?'GPU processes':'the GPU process';case CHROME_PROCESS_NAMES.PPAPI:return opt_requirePlural?'PPAPI processes':'the PPAPI process';case CHROME_PROCESS_NAMES.ALL:return'all processes';case CHROME_PROCESS_NAMES.UNKNOWN:return'unknown processes';default:return'\''+processName+'\' processes';}}
-function addGeneralMemoryDumpValues(browserNameToGlobalDumps,values){addMemoryDumpValues(browserNameToGlobalDumps,gmd=>true,function(processDump,addProcessScalar){addProcessScalar({source:'process_count',property:PROCESS_COUNT,value:1});if(processDump.totals!==undefined){addProcessScalar({source:'reported_by_os',property:RESIDENT_SIZE,component:['system_memory'],value:processDump.totals.residentBytes});addProcessScalar({source:'reported_by_os',property:PEAK_RESIDENT_SIZE,component:['system_memory'],value:processDump.totals.peakResidentBytes});addProcessScalar({source:'reported_by_os',property:PRIVATE_FOOTPRINT_SIZE,component:['system_memory'],value:processDump.totals.privateFootprintBytes,});}
-if(processDump.memoryAllocatorDumps===undefined)return;processDump.memoryAllocatorDumps.forEach(function(rootAllocatorDump){CHROME_VALUE_PROPERTIES.forEach(function(property){addProcessScalar({source:'reported_by_chrome',component:[rootAllocatorDump.name],property,value:rootAllocatorDump.numerics[property.name]});});if(rootAllocatorDump.numerics.allocated_objects_size===undefined){const allocatedObjectsDump=rootAllocatorDump.getDescendantDumpByFullName('allocated_objects');if(allocatedObjectsDump!==undefined){addProcessScalar({source:'reported_by_chrome',component:[rootAllocatorDump.name],property:ALLOCATED_OBJECTS_SIZE,value:allocatedObjectsDump.numerics.size});}}});addTopHeapDumpCategoryValue(processDump,addProcessScalar);addV8MemoryDumpValues(processDump,addProcessScalar);},function(componentTree){const tracingNode=componentTree.children[1].get('tracing');if(tracingNode===undefined)return;for(let i=0;i<componentTree.values.length;i++){componentTree.values[i].total-=tracingNode.values[i].total;}},values);}
-function addTopHeapDumpCategoryValue(processDump,addProcessScalar){if(!processDump.heapDumps){return;}
-for(const allocatorName in processDump.heapDumps){const heapDump=processDump.heapDumps[allocatorName];if(heapDump.entries===undefined||heapDump.entries.length===0){return;}
-const typeToSize={};for(let i=0;i<heapDump.entries.length;i+=1){const entry=heapDump.entries[i];if(!entry.objectTypeName||entry.leafStackFrame){continue;}
-if(!typeToSize[entry.objectTypeName]){typeToSize[entry.objectTypeName]=0;}
-typeToSize[entry.objectTypeName]+=entry.size;}
-let largestValue=0;let largestType='';for(const key in typeToSize){if(largestValue<typeToSize[key]){largestValue=typeToSize[key];largestType=key;}}
-addProcessScalar({source:'reported_by_chrome',component:[allocatorName,largestType],property:HEAP_CATEGORY_SIZE,value:largestValue});}}
-function addV8MemoryDumpValues(processDump,addProcessScalar){const v8Dump=processDump.getMemoryAllocatorDumpByFullName('v8');if(v8Dump===undefined)return;const sharedDump=v8Dump.getDescendantDumpByFullName('shared');if(sharedDump!==undefined){addV8ComponentValues(sharedDump,['v8','shared'],addProcessScalar);sharedDump.children.forEach(function(subDump){addV8ComponentValues(subDump,['v8','shared',subDump.name],addProcessScalar);});}
-v8Dump.children.forEach(function(isolateDump){const mallocDump=isolateDump.getDescendantDumpByFullName('malloc');if(mallocDump!==undefined){addV8ComponentValues(mallocDump,['v8','allocated_by_malloc'],addProcessScalar);}
-let heapDump=isolateDump.getDescendantDumpByFullName('heap');if(heapDump===undefined){heapDump=isolateDump.getDescendantDumpByFullName('heap_spaces');}
-if(heapDump!==undefined){addV8ComponentValues(heapDump,['v8','heap'],addProcessScalar);heapDump.children.forEach(function(spaceDump){if(spaceDump.name==='other_spaces')return;addV8ComponentValues(spaceDump,['v8','heap',spaceDump.name],addProcessScalar);});}});addProcessScalar({source:'reported_by_chrome',component:['v8'],property:CODE_AND_METADATA_SIZE,value:v8Dump.numerics.code_and_metadata_size});addProcessScalar({source:'reported_by_chrome',component:['v8'],property:CODE_AND_METADATA_SIZE,value:v8Dump.numerics.bytecode_and_metadata_size});}
-function addV8ComponentValues(componentDump,componentPath,addProcessScalar){CHROME_VALUE_PROPERTIES.forEach(function(property){addProcessScalar({source:'reported_by_chrome',component:componentPath,property,value:componentDump.numerics[property.name]});});}
-const PROCESS_COUNT={unit:count_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){if(componentPath.length>0){throw new Error('Unexpected process count non-empty component path: '+
-componentPath.join(':'));}
-return'total number of '+convertProcessNameToUserFriendlyName(processName,true);}};const EFFECTIVE_SIZE={name:'effective_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'effective size',componentPreposition:'of'});}};const ALLOCATED_OBJECTS_SIZE={name:'allocated_objects_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'size of all objects allocated',totalUserFriendlyPropertyName:'size of all allocated objects',componentPreposition:'by'});}};const SHIM_ALLOCATED_OBJECTS_SIZE={name:'shim_allocated_objects_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'size of all objects allocated through shim',totalUserFriendlyPropertyName:'size of all allocated objects through shim',componentPreposition:'by'});}};const LOCKED_SIZE={name:'locked_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'locked (pinned) size',componentPreposition:'of'});}};const PEAK_SIZE={name:'peak_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'peak size',componentPreposition:'of'});}};const HEAP_CATEGORY_SIZE={name:'heap_category_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'heap profiler category size',componentPreposition:'for'});}};const CODE_AND_METADATA_SIZE={name:'code_and_metadata_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyNamePrefix:'size of',userFriendlyPropertyName:'code and metadata'});}};const CHROME_VALUE_PROPERTIES=[EFFECTIVE_SIZE,ALLOCATED_OBJECTS_SIZE,SHIM_ALLOCATED_OBJECTS_SIZE,LOCKED_SIZE,PEAK_SIZE];function buildChromeValueDescriptionPrefix(componentPath,processName,formatSpec){const nameParts=[];if(componentPath.length===0){nameParts.push('total');if(formatSpec.totalUserFriendlyPropertyName){nameParts.push(formatSpec.totalUserFriendlyPropertyName);}else{if(formatSpec.userFriendlyPropertyNamePrefix){nameParts.push(formatSpec.userFriendlyPropertyNamePrefix);}
-nameParts.push(formatSpec.userFriendlyPropertyName);}
-nameParts.push('reported by Chrome for');}else{if(formatSpec.componentPreposition===undefined){if(formatSpec.userFriendlyPropertyNamePrefix){nameParts.push(formatSpec.userFriendlyPropertyNamePrefix);}
-nameParts.push(componentPath.join(':'));nameParts.push(formatSpec.userFriendlyPropertyName);}else{if(formatSpec.userFriendlyPropertyNamePrefix){nameParts.push(formatSpec.userFriendlyPropertyNamePrefix);}
-nameParts.push(formatSpec.userFriendlyPropertyName);nameParts.push(formatSpec.componentPreposition);if(componentPath[componentPath.length-1]==='allocated_by_malloc'){nameParts.push('objects allocated by malloc for');nameParts.push(componentPath.slice(0,componentPath.length-1).join(':'));}else{nameParts.push(componentPath.join(':'));}}
-nameParts.push('in');}
-nameParts.push(convertProcessNameToUserFriendlyName(processName));return nameParts.join(' ');}
-const RESIDENT_SIZE={name:'resident_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'resident set size (RSS)');}};const PEAK_RESIDENT_SIZE={name:'peak_resident_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'peak resident set size');}};const PROPORTIONAL_RESIDENT_SIZE={name:'proportional_resident_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'proportional resident size (PSS)');}};const PRIVATE_DIRTY_SIZE={name:'private_dirty_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'private dirty size');}};const PRIVATE_FOOTPRINT_SIZE={name:'private_footprint_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'private footprint size');}};const JAVA_BASE_CLEAN_RESIDENT={name:'java_base_clean_resident',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'java base odex and vdex total clean resident size');}};const JAVA_BASE_PSS={name:'java_base_pss',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'java base odex and vdex proportional resident size');}};const NATIVE_LIBRARY_PRIVATE_CLEAN_RESIDENT={name:'native_library_private_clean_resident',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'native library private clean resident size');}};const NATIVE_LIBRARY_SHARED_CLEAN_RESIDENT={name:'native_library_shared_clean_resident',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'native library shared clean resident size');}};const NATIVE_LIBRARY_PROPORTIONAL_RESIDENT={name:'native_library_proportional_resident',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'native library proportional resident size');}};function buildOsValueDescriptionPrefix(componentPath,processName,userFriendlyPropertyName){if(componentPath.length>2){throw new Error('OS value component path for \''+
-userFriendlyPropertyName+'\' too long: '+componentPath.join(':'));}
-const nameParts=[];if(componentPath.length<2){nameParts.push('total');}
-nameParts.push(userFriendlyPropertyName);if(componentPath.length>0){switch(componentPath[0]){case'system_memory':if(componentPath.length>1){const userFriendlyComponentName=SYSTEM_VALUE_COMPONENTS[componentPath[1]].userFriendlyName;if(userFriendlyComponentName===undefined){throw new Error('System value sub-component for \''+
-userFriendlyPropertyName+'\' unknown: '+
-componentPath.join(':'));}
-nameParts.push('of',userFriendlyComponentName,'in');}else{nameParts.push('of system memory (RAM) used by');}
-break;case'gpu_memory':if(componentPath.length>1){nameParts.push('of the',componentPath[1]);nameParts.push('Android memtrack component in');}else{nameParts.push('of GPU memory (Android memtrack) used by');}
-break;default:throw new Error('OS value component for \''+
-userFriendlyPropertyName+'\' unknown: '+
-componentPath.join(':'));}}else{nameParts.push('reported by the OS for');}
-nameParts.push(convertProcessNameToUserFriendlyName(processName));return nameParts.join(' ');}
-function addDetailedMemoryDumpValues(browserNameToGlobalDumps,values){addMemoryDumpValues(browserNameToGlobalDumps,g=>g.levelOfDetail===DETAILED,function(processDump,addProcessScalar){for(const[componentName,componentSpec]of
-Object.entries(SYSTEM_VALUE_COMPONENTS)){const node=getDescendantVmRegionClassificationNode(processDump.vmRegions,componentSpec.classificationPath);const componentPath=['system_memory'];if(componentName)componentPath.push(componentName);addProcessScalar({source:'reported_by_os',component:componentPath,property:PROPORTIONAL_RESIDENT_SIZE,value:node===undefined?0:(node.byteStats.proportionalResident||0)});addProcessScalar({source:'reported_by_os',component:componentPath,property:PRIVATE_DIRTY_SIZE,value:node===undefined?0:(node.byteStats.privateDirtyResident||0)});if(node){if(node.byteStats.javaBasePss){addProcessScalar({source:'reported_by_os',component:componentPath,property:JAVA_BASE_PSS,value:node.byteStats.javaBasePss});}
-if(node.byteStats.javaBaseCleanResident){addProcessScalar({source:'reported_by_os',component:componentPath,property:JAVA_BASE_CLEAN_RESIDENT,value:node.byteStats.javaBaseCleanResident});}}
-if(node){if(node.byteStats.nativeLibraryPrivateCleanResident){addProcessScalar({source:'reported_by_os',component:componentPath,property:NATIVE_LIBRARY_PRIVATE_CLEAN_RESIDENT,value:node.byteStats.nativeLibraryPrivateCleanResident});}
-if(node.byteStats.nativeLibrarySharedCleanResident){addProcessScalar({source:'reported_by_os',component:componentPath,property:NATIVE_LIBRARY_SHARED_CLEAN_RESIDENT,value:node.byteStats.nativeLibrarySharedCleanResident});}
-if(node.byteStats.nativeLibraryProportionalResident){addProcessScalar({source:'reported_by_os',component:componentPath,property:NATIVE_LIBRARY_PROPORTIONAL_RESIDENT,value:node.byteStats.nativeLibraryProportionalResident});}}}
-const memtrackDump=processDump.getMemoryAllocatorDumpByFullName('gpu/android_memtrack');if(memtrackDump!==undefined){memtrackDump.children.forEach(function(memtrackChildDump){addProcessScalar({source:'reported_by_os',component:['gpu_memory',memtrackChildDump.name],property:PROPORTIONAL_RESIDENT_SIZE,value:memtrackChildDump.numerics.memtrack_pss});});}},function(componentTree){},values);}
-const SYSTEM_VALUE_COMPONENTS={'':{classificationPath:[],},'java_heap':{classificationPath:['Android','Java runtime','Spaces'],userFriendlyName:'the Java heap'},'ashmem':{classificationPath:['Android','Ashmem'],userFriendlyName:'ashmem'},'native_heap':{classificationPath:['Native heap'],userFriendlyName:'the native heap'},'stack':{classificationPath:['Stack'],userFriendlyName:'the thread stacks'}};function getDescendantVmRegionClassificationNode(node,path){for(let i=0;i<path.length;i++){if(node===undefined)break;node=node.children.find(c=>c.title===path[i]);}
-return node;}
-function addMemoryDumpCountValues(browserNameToGlobalDumps,values){browserNameToGlobalDumps.forEach(function(globalDumps,browserName){let totalDumpCount=0;const levelOfDetailNameToDumpCount={};LEVEL_OF_DETAIL_NAMES.forEach(function(levelOfDetailName){levelOfDetailNameToDumpCount[levelOfDetailName]=0;});levelOfDetailNameToDumpCount[HEAP_PROFILER_DETAIL_NAME]=0;globalDumps.forEach(function(globalDump){totalDumpCount++;const levelOfDetailName=LEVEL_OF_DETAIL_NAMES.get(globalDump.levelOfDetail);if(levelOfDetailName===undefined){return;}
-levelOfDetailNameToDumpCount[levelOfDetailName]++;if(globalDump.levelOfDetail===DETAILED){if(detectHeapProfilerInMemoryDump(globalDump)){levelOfDetailNameToDumpCount[HEAP_PROFILER_DETAIL_NAME]++;}}});reportMemoryDumpCountAsValue(browserName,undefined,totalDumpCount,values);for(const[levelOfDetailName,levelOfDetailDumpCount]of
-Object.entries(levelOfDetailNameToDumpCount)){reportMemoryDumpCountAsValue(browserName,levelOfDetailName,levelOfDetailDumpCount,values);}});}
-function detectHeapProfilerInMemoryDump(globalDump){for(const processDump of Object.values(globalDump.processMemoryDumps)){if(processDump.heapDumps&&processDump.heapDumps.malloc){const mallocDump=processDump.heapDumps.malloc;if(mallocDump.entries&&mallocDump.entries.length>0){return true;}}}
-return false;}
-function reportMemoryDumpCountAsValue(browserName,levelOfDetailName,levelOfDetailDumpCount,values){const nameParts=['memory',browserName,'all_processes','dump_count'];if(levelOfDetailName!==undefined){nameParts.push(levelOfDetailName);}
-const name=nameParts.join(':');const histogram=new tr.v.Histogram(name,count_smallerIsBetter,BOUNDARIES_FOR_UNIT_MAP.get(count_smallerIsBetter));histogram.addSample(levelOfDetailDumpCount);const userFriendlyLevelOfDetail=(levelOfDetailName||'all').replace('_',' ');histogram.description=['total number of',userFriendlyLevelOfDetail,'memory dumps added by',convertBrowserNameToUserFriendlyName(browserName),'to the trace'].join(' ');values.addHistogram(histogram);}
-function addMemoryDumpValues(browserNameToGlobalDumps,customGlobalDumpFilter,customProcessDumpValueExtractor,customComponentTreeModifier,values){browserNameToGlobalDumps.forEach(function(globalDumps,browserName){const filteredGlobalDumps=globalDumps.filter(customGlobalDumpFilter);const sourceToPropertyToBuilder=extractDataFromGlobalDumps(filteredGlobalDumps,customProcessDumpValueExtractor);reportDataAsValues(sourceToPropertyToBuilder,browserName,customComponentTreeModifier,values);});}
-function extractDataFromGlobalDumps(globalDumps,customProcessDumpValueExtractor){const sourceToPropertyToBuilder=new Map();const dumpCount=globalDumps.length;globalDumps.forEach(function(globalDump,dumpIndex){for(const processDump of Object.values(globalDump.processMemoryDumps)){extractDataFromProcessDump(processDump,sourceToPropertyToBuilder,dumpIndex,dumpCount,customProcessDumpValueExtractor);}});return sourceToPropertyToBuilder;}
-function extractDataFromProcessDump(processDump,sourceToPropertyToBuilder,dumpIndex,dumpCount,customProcessDumpValueExtractor){const rawProcessName=processDump.process.name;const processNamePath=[tr.e.chrome.chrome_processes.canonicalizeProcessName(rawProcessName)];customProcessDumpValueExtractor(processDump,function addProcessScalar(spec){if(spec.value===undefined)return;const component=spec.component||[];function createDetailsForErrorMessage(){return['source=',spec.source,', property=',spec.property.name||'(undefined)',', component=',component.length===0?'(empty)':component.join(':'),' in ',processDump.process.userFriendlyName].join('');}
-let value;if(spec.value instanceof tr.b.Scalar){value=spec.value.value;if(spec.value.unit!==spec.property.unit){throw new Error('Scalar unit for '+
-createDetailsForErrorMessage()+' ('+
-spec.value.unit.unitName+') doesn\'t match the unit of the property ('+
-spec.property.unit.unitName+')');}}else{value=spec.value;}
-let propertyToBuilder=sourceToPropertyToBuilder.get(spec.source);if(propertyToBuilder===undefined){propertyToBuilder=new Map();sourceToPropertyToBuilder.set(spec.source,propertyToBuilder);}
-let builder=propertyToBuilder.get(spec.property);if(builder===undefined){builder=new tr.b.MultiDimensionalViewBuilder(2,dumpCount),propertyToBuilder.set(spec.property,builder);}
-const values=new Array(dumpCount);values[dumpIndex]=value;builder.addPath([processNamePath,component],values,tr.b.MultiDimensionalViewBuilder.ValueKind.TOTAL);});}
-function reportDataAsValues(sourceToPropertyToBuilder,browserName,customComponentTreeModifier,values){sourceToPropertyToBuilder.forEach(function(propertyToBuilder,sourceName){propertyToBuilder.forEach(function(builders,property){const tree=builders.buildTopDownTreeView();reportComponentDataAsValues(browserName,sourceName,property,[],[],tree,values,customComponentTreeModifier);});});}
-function reportComponentDataAsValues(browserName,sourceName,property,processPath,componentPath,tree,values,customComponentTreeModifier,opt_cachedHistograms){const cachedHistograms=opt_cachedHistograms||new Map();function recurse(processPath,componentPath,node){return reportComponentDataAsValues(browserName,sourceName,property,processPath,componentPath,node,values,customComponentTreeModifier,cachedHistograms);}
-function buildHistogram(processPath,componentPath,node){return buildNamedMemoryNumericFromNode(browserName,sourceName,property,processPath.length===0?'all_processes':processPath[0],componentPath,node);}
-customComponentTreeModifier(tree);const histogram=buildHistogram(processPath,componentPath,tree);if(cachedHistograms.has(histogram.name)){return cachedHistograms.get(histogram.name);}
-cachedHistograms.set(histogram.name,histogram);const processNames=new tr.v.d.RelatedNameMap();for(const[childProcessName,childProcessNode]of tree.children[0]){processPath.push(childProcessName);const childProcessHistogram=recurse(processPath,componentPath,childProcessNode);processNames.set(childProcessName,childProcessHistogram.name);processPath.pop();}
-const componentNames=new tr.v.d.RelatedNameMap();for(const[childComponentName,childComponentNode]of tree.children[1]){componentPath.push(childComponentName);const childComponentHistogram=recurse(processPath,componentPath,childComponentNode);componentNames.set(childComponentName,childComponentHistogram.name);componentPath.pop();}
-values.addHistogram(histogram);if(tree.children[0].size>0){histogram.diagnostics.set('processes',processNames);}
-if(tree.children[1].size>0){histogram.diagnostics.set('components',componentNames);}
-return histogram;}
-function getNumericName(browserName,sourceName,propertyName,processName,componentPath){const nameParts=['memory',browserName,processName,sourceName].concat(componentPath);if(propertyName!==undefined)nameParts.push(propertyName);return nameParts.join(':');}
-function getNumericDescription(property,browserName,processName,componentPath){return[property.buildDescriptionPrefix(componentPath,processName),'in',convertBrowserNameToUserFriendlyName(browserName)].join(' ');}
-function buildNamedMemoryNumericFromNode(browserName,sourceName,property,processName,componentPath,node){const name=getNumericName(browserName,sourceName,property.name,processName,componentPath);const description=getNumericDescription(property,browserName,processName,componentPath);const numeric=buildMemoryNumericFromNode(name,node,property.unit);numeric.description=description;return numeric;}
-function buildSampleDiagnostics(value,node){if(node.children.length<2)return undefined;const diagnostics=new Map();const i=node.values.indexOf(value);const processBreakdown=new tr.v.d.Breakdown();processBreakdown.colorScheme=tr.e.chrome.chrome_processes.PROCESS_COLOR_SCHEME_NAME;for(const[name,subNode]of node.children[0]){processBreakdown.set(name,subNode.values[i].total);}
-if(processBreakdown.size>0){diagnostics.set('processes',processBreakdown);}
-const componentBreakdown=new tr.v.d.Breakdown();for(const[name,subNode]of node.children[1]){componentBreakdown.set(name,subNode.values[i].total);}
-if(componentBreakdown.size>0){diagnostics.set('components',componentBreakdown);}
-if(diagnostics.size===0)return undefined;return diagnostics;}
-function buildMemoryNumericFromNode(name,node,unit){const histogram=new tr.v.Histogram(name,unit,BOUNDARIES_FOR_UNIT_MAP.get(unit));node.values.forEach(v=>histogram.addSample(v.total,buildSampleDiagnostics(v,node)));return histogram;}
-tr.metrics.MetricRegistry.register(memoryMetric,{supportsRangeOfInterest:true});return{memoryMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const BYTE_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1e9,1e2);function nativeCodeResidentMemoryMetric(histograms,model){const histogram=new tr.v.Histogram('NativeCodeResidentMemory',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);for(const slice of model.getDescendantEvents()){if(slice.category==='disabled-by-default-memory-infra'&&slice.title==='ReportGlobalNativeCodeResidentMemoryKb'&&slice.args.NativeCodeResidentMemory){histogram.addSample(slice.args.NativeCodeResidentMemory);}}
-histograms.addHistogram(histogram);}
-tr.metrics.MetricRegistry.register(nativeCodeResidentMemoryMetric);return{nativeCodeResidentMemoryMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const EventFinderUtils=tr.e.chrome.EventFinderUtils;const LOADING_METRIC_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,1e3,20).addLinearBins(3e3,20).addExponentialBins(20e3,20);const SUMMARY_OPTIONS={avg:true,count:false,max:false,min:false,std:false,sum:false,};function addSamplesToHistogram(pairInfo,breakdownTree,histogram,histograms,diagnostics){histogram.addSample(pairInfo.end-pairInfo.start,diagnostics);if(!breakdownTree){return;}
-for(const[category,breakdown]of Object.entries(breakdownTree)){const relatedName=`${histogram.name}:${category}`;if(!histograms.getHistogramNamed(relatedName)){const relatedHist=histograms.createHistogram(relatedName,histogram.unit,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,summaryOptions:{count:false,max:false,min:false,sum:false,},});}
-const relatedHist=histograms.getHistogramNamed(relatedName);let relatedNames=histogram.diagnostics.get('breakdown');if(!relatedNames){relatedNames=new tr.v.d.RelatedNameMap();histogram.diagnostics.set('breakdown',relatedNames);}
-relatedNames.set(category,relatedName);relatedHist.addSample(breakdown.total,{breakdown:tr.v.d.Breakdown.fromEntries(Object.entries(breakdown.events)),});}}
-function splitOneRangeIntoPerSecondRanges(startTime,endTime){const results=[];for(let i=0;startTime+(i+1)*1000<=endTime;i+=1){const start=i*1000;const end=(i+1)*1000;results.push({start,end,});}
-return results;}
-function getNavigationInfos(model){const navigationInfos=[];const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const expectation of model.userModel.expectations){if(!(expectation instanceof tr.model.um.LoadExpectation))continue;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(expectation.url)){continue;}
-const rendererHelper=chromeHelper.rendererHelpers[expectation.renderProcess.pid];if(rendererHelper.mainThread===undefined)continue;navigationInfos.push({navigationStart:expectation.navigationStart,rendererHelper,url:expectation.url});}
-navigationInfos.forEach((navInfo,i)=>{if(i===navigationInfos.length-1){navInfo.navigationEndTime=model.bounds.max;}else{navInfo.navigationEndTime=navigationInfos[i+1].navigationStart.start;}});return navigationInfos;}
-function getWallTimeBreakdownTree(rendererHelper,start,end){const startEndRange=tr.b.math.Range.fromExplicitRange(start,end);const networkEvents=EventFinderUtils.getNetworkEventsInRange(rendererHelper.process,startEndRange);const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,startEndRange);return breakdownTree;}
-function getCpuTimeBreakdownTree(rendererHelper,start,end){const startEndRange=tr.b.math.Range.fromExplicitRange(start,end);const breakdownTree=tr.metrics.sh.generateCpuTimeBreakdownTree(rendererHelper.mainThread,startEndRange);return breakdownTree;}
-function persecondMetric(histograms,model){const navigationInfos=getNavigationInfos(model);if(navigationInfos.length===0){return;}
-navigationInfos.forEach(navInfo=>{const navigationStart=navInfo.navigationStart.start;const navigationEnd=navInfo.navigationEndTime;const startEndPairs=splitOneRangeIntoPerSecondRanges(navigationStart,navigationEnd);const breakdownList=startEndPairs.map(p=>{const wallHistogramName=`wall_${p.start}_to_${p.end}`;const wallHistogramDescription=`Wall-clock time ${p.start} to ${p.end} breakdown`;const cpuHistogramName=`cpu_${p.start}_to_${p.end}`;const cpuHistogramDescription=`CPU time ${p.start} to ${p.end} breakdown`;const pid=navInfo.rendererHelper.pid;const breakdownTree=getWallTimeBreakdownTree(navInfo.rendererHelper,navigationStart+p.start,navigationStart+p.end);const cpuBreakdownTree=getCpuTimeBreakdownTree(navInfo.rendererHelper,navigationStart+p.start,navigationStart+p.end);const diagnostics={'Navigation infos':new tr.v.d.GenericSet([{url:navInfo.url,pid:navInfo.rendererHelper.pid,navStart:navigationStart,frameIdRef:navInfo.navigationStart.args.frame}]),'breakdown':tr.metrics.sh.createBreakdownDiagnostic(breakdownTree),};return Object.assign(p,{breakdownTree,cpuBreakdownTree,wallHistogramName,wallHistogramDescription,cpuHistogramName,cpuHistogramDescription,diagnostics,});});breakdownList.forEach(p=>{if(!histograms.getHistogramNamed(p.wallHistogramName)){histograms.createHistogram(p.wallHistogramName,timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:p.wallHistogramDescription,summaryOptions:SUMMARY_OPTIONS,});}
-const wallHistogram=histograms.getHistogramNamed(p.wallHistogramName);addSamplesToHistogram(p,p.breakdownTree,wallHistogram,histograms,p.diagnostics);if(!histograms.getHistogramNamed(p.cpuHistogramName)){histograms.createHistogram(p.cpuHistogramName,timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:p.cpuHistogramDescription,summaryOptions:SUMMARY_OPTIONS,});}
-const cpuHistogram=histograms.getHistogramNamed(p.cpuHistogramName);addSamplesToHistogram(p,p.cpuBreakdownTree,cpuHistogram,histograms,p.diagnostics);});});}
-tr.metrics.MetricRegistry.register(persecondMetric);return{persecondMetric,splitOneRangeIntoPerSecondRanges};});'use strict';tr.exportTo('tr.metrics.sh',function(){const CHROME_POWER_GRACE_PERIOD_MS=1;function createEmptyHistogram_(interval,histograms){if(interval.perSecond){return{perSecond:true,energy:histograms.createHistogram(`${interval.name}:power`,tr.b.Unit.byName.powerInWatts_smallerIsBetter,[],{description:`Energy consumption rate for ${interval.description}`,summaryOptions:{avg:true,count:false,max:true,min:true,std:false,sum:false,},}),};}
-return{perSecond:false,energy:histograms.createHistogram(`${interval.name}:energy`,tr.b.Unit.byName.energyInJoules_smallerIsBetter,[],{description:`Energy consumed in ${interval.description}`,summaryOptions:{avg:false,count:false,max:true,min:true,std:false,sum:true,},}),};}
-function createHistograms_(data,interval,histograms){if(data.histograms[interval.name]===undefined){data.histograms[interval.name]=createEmptyHistogram_(interval,histograms);}
-if(data.histograms[interval.name].perSecond){for(const sample of data.model.device.powerSeries.getSamplesWithinRange(interval.bounds.min,interval.bounds.max)){data.histograms[interval.name].energy.addSample(sample.powerInW);}}else{const energyInJ=data.model.device.powerSeries.getEnergyConsumedInJ(interval.bounds.min,interval.bounds.max);data.histograms[interval.name].energy.addSample(energyInJ);}}
-function getNavigationTTIIntervals_(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const intervals=[];for(const expectation of model.userModel.expectations){if(!(expectation instanceof tr.model.um.LoadExpectation))continue;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(expectation.url)){continue;}
-if(expectation.timeToInteractive!==undefined){intervals.push(tr.b.math.Range.fromExplicitRange(expectation.navigationStart.start,expectation.timeToInteractive));}}
-return intervals.sort((x,y)=>x.min-y.min);}
-function*computeTimeIntervals_(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const powerSeries=model.device.powerSeries;if(powerSeries===undefined||powerSeries.samples.length===0){return;}
-yield{bounds:model.bounds,name:'story',description:'user story',perSecond:true};const chromeBounds=computeChromeBounds_(model);if(chromeBounds.isEmpty)return;const powerSeriesBoundsWithGracePeriod=tr.b.math.Range.fromExplicitRange(powerSeries.bounds.min-CHROME_POWER_GRACE_PERIOD_MS,powerSeries.bounds.max+CHROME_POWER_GRACE_PERIOD_MS);if(!powerSeriesBoundsWithGracePeriod.containsRangeExclusive(chromeBounds)){return;}
-for(const interval of getRailStageIntervals_(model)){yield{bounds:interval.bounds.findIntersection(chromeBounds),name:interval.name,description:interval.description,perSecond:interval.perSecond};}
-for(const interval of getLoadingIntervals_(model,chromeBounds)){yield{bounds:interval.bounds.findIntersection(chromeBounds),name:interval.name,description:interval.description,perSecond:interval.perSecond};}}
-function*getRailStageIntervals_(model){for(const exp of model.userModel.expectations){const histogramName=exp.title.toLowerCase().replace(' ','_');const energyHist=undefined;if(histogramName.includes('response')){yield{bounds:tr.b.math.Range.fromExplicitRange(exp.start,exp.end),name:histogramName,description:'RAIL stage '+histogramName,perSecond:false};}else if(histogramName.includes('animation')||histogramName.includes('idle')){yield{bounds:tr.b.math.Range.fromExplicitRange(exp.start,exp.end),name:histogramName,description:'RAIL stage '+histogramName,perSecond:true};}}}
-function*getLoadingIntervals_(model,chromeBounds){const ttiIntervals=getNavigationTTIIntervals_(model);for(const ttiInterval of ttiIntervals){yield{bounds:ttiInterval,name:'load',description:'page loads',perSecond:false};}}
-function computeChromeBounds_(model){const chromeBounds=new tr.b.math.Range();const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(chromeHelper===undefined)return chromeBounds;for(const helper of chromeHelper.browserHelpers){if(helper.mainThread){chromeBounds.addRange(helper.mainThread.bounds);}}
-for(const pid in chromeHelper.rendererHelpers){if(chromeHelper.rendererHelpers[pid].mainThread){chromeBounds.addRange(chromeHelper.rendererHelpers[pid].mainThread.bounds);}}
-return chromeBounds;}
-function powerMetric(histograms,model){const data={model,histograms:{}};for(const interval of computeTimeIntervals_(model)){createHistograms_(data,interval,histograms);}}
-tr.metrics.MetricRegistry.register(powerMetric);return{powerMetric};});'use strict';tr.exportTo('tr.metrics.sh',function(){function computeAnimationThroughput(animationExpectation){if(animationExpectation.frameEvents===undefined||animationExpectation.frameEvents.length===0){throw new Error('Animation missing frameEvents '+
-animationExpectation.stableId);}
-const durationInS=tr.b.convertUnit(animationExpectation.duration,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);return animationExpectation.frameEvents.length/durationInS;}
-function computeAnimationframeTimeDiscrepancy(animationExpectation){if(animationExpectation.frameEvents===undefined||animationExpectation.frameEvents.length===0){throw new Error('Animation missing frameEvents '+
-animationExpectation.stableId);}
-let frameTimestamps=animationExpectation.frameEvents;frameTimestamps=frameTimestamps.toArray().map(function(event){return event.start;});const absolute=true;return tr.b.math.Statistics.timestampsDiscrepancy(frameTimestamps,absolute);}
-function responsivenessMetric(histograms,model,opt_options){const responseNumeric=new tr.v.Histogram('response latency',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(100,1e3,50));const throughputNumeric=new tr.v.Histogram('animation throughput',tr.b.Unit.byName.unitlessNumber_biggerIsBetter,tr.v.HistogramBinBoundaries.createLinear(10,60,10));const frameTimeDiscrepancyNumeric=new tr.v.Histogram('animation frameTimeDiscrepancy',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(0,1e3,50).addExponentialBins(1e4,10));const latencyNumeric=new tr.v.Histogram('animation latency',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(0,300,60));model.userModel.expectations.forEach(function(ue){if(opt_options&&opt_options.rangeOfInterest&&!opt_options.rangeOfInterest.intersectsExplicitRangeInclusive(ue.start,ue.end)){return;}
-const sampleDiagnosticMap=tr.v.d.DiagnosticMap.fromObject({relatedEvents:new tr.v.d.RelatedEventSet([ue])});if(ue instanceof tr.model.um.IdleExpectation){return;}else if(ue instanceof tr.model.um.StartupExpectation){return;}else if(ue instanceof tr.model.um.LoadExpectation){}else if(ue instanceof tr.model.um.ResponseExpectation){responseNumeric.addSample(ue.duration,sampleDiagnosticMap);}else if(ue instanceof tr.model.um.AnimationExpectation){if(ue.frameEvents===undefined||ue.frameEvents.length===0){return;}
-const throughput=computeAnimationThroughput(ue);if(throughput===undefined){throw new Error('Missing throughput for '+
-ue.stableId);}
-throughputNumeric.addSample(throughput,sampleDiagnosticMap);const frameTimeDiscrepancy=computeAnimationframeTimeDiscrepancy(ue);if(frameTimeDiscrepancy===undefined){throw new Error('Missing frameTimeDiscrepancy for '+
-ue.stableId);}
-frameTimeDiscrepancyNumeric.addSample(frameTimeDiscrepancy,sampleDiagnosticMap);ue.associatedEvents.forEach(function(event){if(!(event instanceof tr.e.cc.InputLatencyAsyncSlice)){return;}
-latencyNumeric.addSample(event.duration,sampleDiagnosticMap);});}else{throw new Error('Unrecognized stage for '+ue.stableId);}});[responseNumeric,throughputNumeric,frameTimeDiscrepancyNumeric,latencyNumeric].forEach(function(numeric){numeric.customizeSummaryOptions({avg:true,max:true,min:true,std:true});});histograms.addHistogram(responseNumeric);histograms.addHistogram(throughputNumeric);histograms.addHistogram(frameTimeDiscrepancyNumeric);histograms.addHistogram(latencyNumeric);}
-tr.metrics.MetricRegistry.register(responsivenessMetric,{supportsRangeOfInterest:true,requiredCategories:['rail'],});return{responsivenessMetric,};});var JpegImage=(function jpegImage(){"use strict";var dctZigZag=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]);var dctCos1=4017
-var dctSin1=799
-var dctCos3=3406
-var dctSin3=2276
-var dctCos6=1567
-var dctSin6=3784
-var dctSqrt2=5793
-var dctSqrt1d2=2896
-function constructor(){}
-function buildHuffmanTable(codeLengths,values){var k=0,code=[],i,j,length=16;while(length>0&&!codeLengths[length-1])
-length--;code.push({children:[],index:0});var p=code[0],q;for(i=0;i<length;i++){for(j=0;j<codeLengths[i];j++){p=code.pop();p.children[p.index]=values[k];while(p.index>0){p=code.pop();}
-p.index++;code.push(p);while(code.length<=i){code.push(q={children:[],index:0});p.children[p.index]=q.children;p=q;}
-k++;}
-if(i+1<length){code.push(q={children:[],index:0});p.children[p.index]=q.children;p=q;}}
-return code[0].children;}
-function decodeScan(data,offset,frame,components,resetInterval,spectralStart,spectralEnd,successivePrev,successive){var precision=frame.precision;var samplesPerLine=frame.samplesPerLine;var scanLines=frame.scanLines;var mcusPerLine=frame.mcusPerLine;var progressive=frame.progressive;var maxH=frame.maxH,maxV=frame.maxV;var startOffset=offset,bitsData=0,bitsCount=0;function readBit(){if(bitsCount>0){bitsCount--;return(bitsData>>bitsCount)&1;}
-bitsData=data[offset++];if(bitsData==0xFF){var nextByte=data[offset++];if(nextByte){throw new Error("unexpected marker: "+((bitsData<<8)|nextByte).toString(16));}}
-bitsCount=7;return bitsData>>>7;}
-function decodeHuffman(tree){var node=tree,bit;while((bit=readBit())!==null){node=node[bit];if(typeof node==='number')
-return node;if(typeof node!=='object')
-throw new Error("invalid huffman sequence");}
-return null;}
-function receive(length){var n=0;while(length>0){var bit=readBit();if(bit===null)return;n=(n<<1)|bit;length--;}
-return n;}
-function receiveAndExtend(length){var n=receive(length);if(n>=1<<(length-1))
-return n;return n+(-1<<length)+1;}
-function decodeBaseline(component,zz){var t=decodeHuffman(component.huffmanTableDC);var diff=t===0?0:receiveAndExtend(t);zz[0]=(component.pred+=diff);var k=1;while(k<64){var rs=decodeHuffman(component.huffmanTableAC);var s=rs&15,r=rs>>4;if(s===0){if(r<15)
-break;k+=16;continue;}
-k+=r;var z=dctZigZag[k];zz[z]=receiveAndExtend(s);k++;}}
-function decodeDCFirst(component,zz){var t=decodeHuffman(component.huffmanTableDC);var diff=t===0?0:(receiveAndExtend(t)<<successive);zz[0]=(component.pred+=diff);}
-function decodeDCSuccessive(component,zz){zz[0]|=readBit()<<successive;}
-var eobrun=0;function decodeACFirst(component,zz){if(eobrun>0){eobrun--;return;}
-var k=spectralStart,e=spectralEnd;while(k<=e){var rs=decodeHuffman(component.huffmanTableAC);var s=rs&15,r=rs>>4;if(s===0){if(r<15){eobrun=receive(r)+(1<<r)-1;break;}
-k+=16;continue;}
-k+=r;var z=dctZigZag[k];zz[z]=receiveAndExtend(s)*(1<<successive);k++;}}
-var successiveACState=0,successiveACNextValue;function decodeACSuccessive(component,zz){var k=spectralStart,e=spectralEnd,r=0;while(k<=e){var z=dctZigZag[k];var direction=zz[z]<0?-1:1;switch(successiveACState){case 0:var rs=decodeHuffman(component.huffmanTableAC);var s=rs&15,r=rs>>4;if(s===0){if(r<15){eobrun=receive(r)+(1<<r);successiveACState=4;}else{r=16;successiveACState=1;}}else{if(s!==1)
-throw new Error("invalid ACn encoding");successiveACNextValue=receiveAndExtend(s);successiveACState=r?2:3;}
-continue;case 1:case 2:if(zz[z])
-zz[z]+=(readBit()<<successive)*direction;else{r--;if(r===0)
-successiveACState=successiveACState==2?3:0;}
-break;case 3:if(zz[z])
-zz[z]+=(readBit()<<successive)*direction;else{zz[z]=successiveACNextValue<<successive;successiveACState=0;}
-break;case 4:if(zz[z])
-zz[z]+=(readBit()<<successive)*direction;break;}
-k++;}
-if(successiveACState===4){eobrun--;if(eobrun===0)
-successiveACState=0;}}
-function decodeMcu(component,decode,mcu,row,col){var mcuRow=(mcu/mcusPerLine)|0;var mcuCol=mcu%mcusPerLine;var blockRow=mcuRow*component.v+row;var blockCol=mcuCol*component.h+col;decode(component,component.blocks[blockRow][blockCol]);}
-function decodeBlock(component,decode,mcu){var blockRow=(mcu/component.blocksPerLine)|0;var blockCol=mcu%component.blocksPerLine;decode(component,component.blocks[blockRow][blockCol]);}
-var componentsLength=components.length;var component,i,j,k,n;var decodeFn;if(progressive){if(spectralStart===0)
-decodeFn=successivePrev===0?decodeDCFirst:decodeDCSuccessive;else
-decodeFn=successivePrev===0?decodeACFirst:decodeACSuccessive;}else{decodeFn=decodeBaseline;}
-var mcu=0,marker;var mcuExpected;if(componentsLength==1){mcuExpected=components[0].blocksPerLine*components[0].blocksPerColumn;}else{mcuExpected=mcusPerLine*frame.mcusPerColumn;}
-if(!resetInterval)resetInterval=mcuExpected;var h,v;while(mcu<mcuExpected){for(i=0;i<componentsLength;i++)
-components[i].pred=0;eobrun=0;if(componentsLength==1){component=components[0];for(n=0;n<resetInterval;n++){decodeBlock(component,decodeFn,mcu);mcu++;}}else{for(n=0;n<resetInterval;n++){for(i=0;i<componentsLength;i++){component=components[i];h=component.h;v=component.v;for(j=0;j<v;j++){for(k=0;k<h;k++){decodeMcu(component,decodeFn,mcu,j,k);}}}
-mcu++;if(mcu===mcuExpected)break;}}
-bitsCount=0;marker=(data[offset]<<8)|data[offset+1];if(marker<0xFF00){throw new Error("marker was not found");}
-if(marker>=0xFFD0&&marker<=0xFFD7){offset+=2;}
-else
-break;}
-return offset-startOffset;}
-function buildComponentData(frame,component){var lines=[];var blocksPerLine=component.blocksPerLine;var blocksPerColumn=component.blocksPerColumn;var samplesPerLine=blocksPerLine<<3;var R=new Int32Array(64),r=new Uint8Array(64);function quantizeAndInverse(zz,dataOut,dataIn){var qt=component.quantizationTable;var v0,v1,v2,v3,v4,v5,v6,v7,t;var p=dataIn;var i;for(i=0;i<64;i++)
-p[i]=zz[i]*qt[i];for(i=0;i<8;++i){var row=8*i;if(p[1+row]==0&&p[2+row]==0&&p[3+row]==0&&p[4+row]==0&&p[5+row]==0&&p[6+row]==0&&p[7+row]==0){t=(dctSqrt2*p[0+row]+512)>>10;p[0+row]=t;p[1+row]=t;p[2+row]=t;p[3+row]=t;p[4+row]=t;p[5+row]=t;p[6+row]=t;p[7+row]=t;continue;}
-v0=(dctSqrt2*p[0+row]+128)>>8;v1=(dctSqrt2*p[4+row]+128)>>8;v2=p[2+row];v3=p[6+row];v4=(dctSqrt1d2*(p[1+row]-p[7+row])+128)>>8;v7=(dctSqrt1d2*(p[1+row]+p[7+row])+128)>>8;v5=p[3+row]<<4;v6=p[5+row]<<4;t=(v0-v1+1)>>1;v0=(v0+v1+1)>>1;v1=t;t=(v2*dctSin6+v3*dctCos6+128)>>8;v2=(v2*dctCos6-v3*dctSin6+128)>>8;v3=t;t=(v4-v6+1)>>1;v4=(v4+v6+1)>>1;v6=t;t=(v7+v5+1)>>1;v5=(v7-v5+1)>>1;v7=t;t=(v0-v3+1)>>1;v0=(v0+v3+1)>>1;v3=t;t=(v1-v2+1)>>1;v1=(v1+v2+1)>>1;v2=t;t=(v4*dctSin3+v7*dctCos3+2048)>>12;v4=(v4*dctCos3-v7*dctSin3+2048)>>12;v7=t;t=(v5*dctSin1+v6*dctCos1+2048)>>12;v5=(v5*dctCos1-v6*dctSin1+2048)>>12;v6=t;p[0+row]=v0+v7;p[7+row]=v0-v7;p[1+row]=v1+v6;p[6+row]=v1-v6;p[2+row]=v2+v5;p[5+row]=v2-v5;p[3+row]=v3+v4;p[4+row]=v3-v4;}
-for(i=0;i<8;++i){var col=i;if(p[1*8+col]==0&&p[2*8+col]==0&&p[3*8+col]==0&&p[4*8+col]==0&&p[5*8+col]==0&&p[6*8+col]==0&&p[7*8+col]==0){t=(dctSqrt2*dataIn[i+0]+8192)>>14;p[0*8+col]=t;p[1*8+col]=t;p[2*8+col]=t;p[3*8+col]=t;p[4*8+col]=t;p[5*8+col]=t;p[6*8+col]=t;p[7*8+col]=t;continue;}
-v0=(dctSqrt2*p[0*8+col]+2048)>>12;v1=(dctSqrt2*p[4*8+col]+2048)>>12;v2=p[2*8+col];v3=p[6*8+col];v4=(dctSqrt1d2*(p[1*8+col]-p[7*8+col])+2048)>>12;v7=(dctSqrt1d2*(p[1*8+col]+p[7*8+col])+2048)>>12;v5=p[3*8+col];v6=p[5*8+col];t=(v0-v1+1)>>1;v0=(v0+v1+1)>>1;v1=t;t=(v2*dctSin6+v3*dctCos6+2048)>>12;v2=(v2*dctCos6-v3*dctSin6+2048)>>12;v3=t;t=(v4-v6+1)>>1;v4=(v4+v6+1)>>1;v6=t;t=(v7+v5+1)>>1;v5=(v7-v5+1)>>1;v7=t;t=(v0-v3+1)>>1;v0=(v0+v3+1)>>1;v3=t;t=(v1-v2+1)>>1;v1=(v1+v2+1)>>1;v2=t;t=(v4*dctSin3+v7*dctCos3+2048)>>12;v4=(v4*dctCos3-v7*dctSin3+2048)>>12;v7=t;t=(v5*dctSin1+v6*dctCos1+2048)>>12;v5=(v5*dctCos1-v6*dctSin1+2048)>>12;v6=t;p[0*8+col]=v0+v7;p[7*8+col]=v0-v7;p[1*8+col]=v1+v6;p[6*8+col]=v1-v6;p[2*8+col]=v2+v5;p[5*8+col]=v2-v5;p[3*8+col]=v3+v4;p[4*8+col]=v3-v4;}
-for(i=0;i<64;++i){var sample=128+((p[i]+8)>>4);dataOut[i]=sample<0?0:sample>0xFF?0xFF:sample;}}
-var i,j;for(var blockRow=0;blockRow<blocksPerColumn;blockRow++){var scanLine=blockRow<<3;for(i=0;i<8;i++)
-lines.push(new Uint8Array(samplesPerLine));for(var blockCol=0;blockCol<blocksPerLine;blockCol++){quantizeAndInverse(component.blocks[blockRow][blockCol],r,R);var offset=0,sample=blockCol<<3;for(j=0;j<8;j++){var line=lines[scanLine+j];for(i=0;i<8;i++)
-line[sample+i]=r[offset++];}}}
-return lines;}
-function clampTo8bit(a){return a<0?0:a>255?255:a;}
-constructor.prototype={load:function load(path){var xhr=new XMLHttpRequest();xhr.open("GET",path,true);xhr.responseType="arraybuffer";xhr.onload=(function(){var data=new Uint8Array(xhr.response||xhr.mozResponseArrayBuffer);this.parse(data);if(this.onload)
-this.onload();}).bind(this);xhr.send(null);},parse:function parse(data){var offset=0,length=data.length;function readUint16(){var value=(data[offset]<<8)|data[offset+1];offset+=2;return value;}
-function readDataBlock(){var length=readUint16();var array=data.subarray(offset,offset+length-2);offset+=array.length;return array;}
-function prepareComponents(frame){var maxH=0,maxV=0;var component,componentId;for(componentId in frame.components){if(frame.components.hasOwnProperty(componentId)){component=frame.components[componentId];if(maxH<component.h)maxH=component.h;if(maxV<component.v)maxV=component.v;}}
-var mcusPerLine=Math.ceil(frame.samplesPerLine/8/maxH);var mcusPerColumn=Math.ceil(frame.scanLines/8/maxV);for(componentId in frame.components){if(frame.components.hasOwnProperty(componentId)){component=frame.components[componentId];var blocksPerLine=Math.ceil(Math.ceil(frame.samplesPerLine/8)*component.h/maxH);var blocksPerColumn=Math.ceil(Math.ceil(frame.scanLines/8)*component.v/maxV);var blocksPerLineForMcu=mcusPerLine*component.h;var blocksPerColumnForMcu=mcusPerColumn*component.v;var blocks=[];for(var i=0;i<blocksPerColumnForMcu;i++){var row=[];for(var j=0;j<blocksPerLineForMcu;j++)
-row.push(new Int32Array(64));blocks.push(row);}
-component.blocksPerLine=blocksPerLine;component.blocksPerColumn=blocksPerColumn;component.blocks=blocks;}}
-frame.maxH=maxH;frame.maxV=maxV;frame.mcusPerLine=mcusPerLine;frame.mcusPerColumn=mcusPerColumn;}
-var jfif=null;var adobe=null;var pixels=null;var frame,resetInterval;var quantizationTables=[],frames=[];var huffmanTablesAC=[],huffmanTablesDC=[];var fileMarker=readUint16();if(fileMarker!=0xFFD8){throw new Error("SOI not found");}
-fileMarker=readUint16();while(fileMarker!=0xFFD9){var i,j,l;switch(fileMarker){case 0xFF00:break;case 0xFFE0:case 0xFFE1:case 0xFFE2:case 0xFFE3:case 0xFFE4:case 0xFFE5:case 0xFFE6:case 0xFFE7:case 0xFFE8:case 0xFFE9:case 0xFFEA:case 0xFFEB:case 0xFFEC:case 0xFFED:case 0xFFEE:case 0xFFEF:case 0xFFFE:var appData=readDataBlock();if(fileMarker===0xFFE0){if(appData[0]===0x4A&&appData[1]===0x46&&appData[2]===0x49&&appData[3]===0x46&&appData[4]===0){jfif={version:{major:appData[5],minor:appData[6]},densityUnits:appData[7],xDensity:(appData[8]<<8)|appData[9],yDensity:(appData[10]<<8)|appData[11],thumbWidth:appData[12],thumbHeight:appData[13],thumbData:appData.subarray(14,14+3*appData[12]*appData[13])};}}
-if(fileMarker===0xFFEE){if(appData[0]===0x41&&appData[1]===0x64&&appData[2]===0x6F&&appData[3]===0x62&&appData[4]===0x65&&appData[5]===0){adobe={version:appData[6],flags0:(appData[7]<<8)|appData[8],flags1:(appData[9]<<8)|appData[10],transformCode:appData[11]};}}
-break;case 0xFFDB:var quantizationTablesLength=readUint16();var quantizationTablesEnd=quantizationTablesLength+offset-2;while(offset<quantizationTablesEnd){var quantizationTableSpec=data[offset++];var tableData=new Int32Array(64);if((quantizationTableSpec>>4)===0){for(j=0;j<64;j++){var z=dctZigZag[j];tableData[z]=data[offset++];}}else if((quantizationTableSpec>>4)===1){for(j=0;j<64;j++){var z=dctZigZag[j];tableData[z]=readUint16();}}else
-throw new Error("DQT: invalid table spec");quantizationTables[quantizationTableSpec&15]=tableData;}
-break;case 0xFFC0:case 0xFFC1:case 0xFFC2:readUint16();frame={};frame.extended=(fileMarker===0xFFC1);frame.progressive=(fileMarker===0xFFC2);frame.precision=data[offset++];frame.scanLines=readUint16();frame.samplesPerLine=readUint16();frame.components={};frame.componentsOrder=[];var componentsCount=data[offset++],componentId;var maxH=0,maxV=0;for(i=0;i<componentsCount;i++){componentId=data[offset];var h=data[offset+1]>>4;var v=data[offset+1]&15;var qId=data[offset+2];frame.componentsOrder.push(componentId);frame.components[componentId]={h:h,v:v,quantizationIdx:qId};offset+=3;}
-prepareComponents(frame);frames.push(frame);break;case 0xFFC4:var huffmanLength=readUint16();for(i=2;i<huffmanLength;){var huffmanTableSpec=data[offset++];var codeLengths=new Uint8Array(16);var codeLengthSum=0;for(j=0;j<16;j++,offset++)
-codeLengthSum+=(codeLengths[j]=data[offset]);var huffmanValues=new Uint8Array(codeLengthSum);for(j=0;j<codeLengthSum;j++,offset++)
-huffmanValues[j]=data[offset];i+=17+codeLengthSum;((huffmanTableSpec>>4)===0?huffmanTablesDC:huffmanTablesAC)[huffmanTableSpec&15]=buildHuffmanTable(codeLengths,huffmanValues);}
-break;case 0xFFDD:readUint16();resetInterval=readUint16();break;case 0xFFDA:var scanLength=readUint16();var selectorsCount=data[offset++];var components=[],component;for(i=0;i<selectorsCount;i++){component=frame.components[data[offset++]];var tableSpec=data[offset++];component.huffmanTableDC=huffmanTablesDC[tableSpec>>4];component.huffmanTableAC=huffmanTablesAC[tableSpec&15];components.push(component);}
-var spectralStart=data[offset++];var spectralEnd=data[offset++];var successiveApproximation=data[offset++];var processed=decodeScan(data,offset,frame,components,resetInterval,spectralStart,spectralEnd,successiveApproximation>>4,successiveApproximation&15);offset+=processed;break;case 0xFFFF:if(data[offset]!==0xFF){offset--;}
-break;default:if(data[offset-3]==0xFF&&data[offset-2]>=0xC0&&data[offset-2]<=0xFE){offset-=3;break;}
-throw new Error("unknown JPEG marker "+fileMarker.toString(16));}
-fileMarker=readUint16();}
-if(frames.length!=1)
-throw new Error("only single frame JPEGs supported");for(var i=0;i<frames.length;i++){var cp=frames[i].components;for(var j in cp){cp[j].quantizationTable=quantizationTables[cp[j].quantizationIdx];delete cp[j].quantizationIdx;}}
-this.width=frame.samplesPerLine;this.height=frame.scanLines;this.jfif=jfif;this.adobe=adobe;this.components=[];for(var i=0;i<frame.componentsOrder.length;i++){var component=frame.components[frame.componentsOrder[i]];this.components.push({lines:buildComponentData(frame,component),scaleX:component.h/frame.maxH,scaleY:component.v/frame.maxV});}},getData:function getData(width,height){var scaleX=this.width/width,scaleY=this.height/height;var component1,component2,component3,component4;var component1Line,component2Line,component3Line,component4Line;var x,y;var offset=0;var Y,Cb,Cr,K,C,M,Ye,R,G,B;var colorTransform;var dataLength=width*height*this.components.length;var data=new Uint8Array(dataLength);switch(this.components.length){case 1:component1=this.components[0];for(y=0;y<height;y++){component1Line=component1.lines[0|(y*component1.scaleY*scaleY)];for(x=0;x<width;x++){Y=component1Line[0|(x*component1.scaleX*scaleX)];data[offset++]=Y;}}
-break;case 2:component1=this.components[0];component2=this.components[1];for(y=0;y<height;y++){component1Line=component1.lines[0|(y*component1.scaleY*scaleY)];component2Line=component2.lines[0|(y*component2.scaleY*scaleY)];for(x=0;x<width;x++){Y=component1Line[0|(x*component1.scaleX*scaleX)];data[offset++]=Y;Y=component2Line[0|(x*component2.scaleX*scaleX)];data[offset++]=Y;}}
-break;case 3:colorTransform=true;if(this.adobe&&this.adobe.transformCode)
-colorTransform=true;else if(typeof this.colorTransform!=='undefined')
-colorTransform=!!this.colorTransform;component1=this.components[0];component2=this.components[1];component3=this.components[2];for(y=0;y<height;y++){component1Line=component1.lines[0|(y*component1.scaleY*scaleY)];component2Line=component2.lines[0|(y*component2.scaleY*scaleY)];component3Line=component3.lines[0|(y*component3.scaleY*scaleY)];for(x=0;x<width;x++){if(!colorTransform){R=component1Line[0|(x*component1.scaleX*scaleX)];G=component2Line[0|(x*component2.scaleX*scaleX)];B=component3Line[0|(x*component3.scaleX*scaleX)];}else{Y=component1Line[0|(x*component1.scaleX*scaleX)];Cb=component2Line[0|(x*component2.scaleX*scaleX)];Cr=component3Line[0|(x*component3.scaleX*scaleX)];R=clampTo8bit(Y+1.402*(Cr-128));G=clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));B=clampTo8bit(Y+1.772*(Cb-128));}
-data[offset++]=R;data[offset++]=G;data[offset++]=B;}}
-break;case 4:if(!this.adobe)
-throw new Error('Unsupported color mode (4 components)');colorTransform=false;if(this.adobe&&this.adobe.transformCode)
-colorTransform=true;else if(typeof this.colorTransform!=='undefined')
-colorTransform=!!this.colorTransform;component1=this.components[0];component2=this.components[1];component3=this.components[2];component4=this.components[3];for(y=0;y<height;y++){component1Line=component1.lines[0|(y*component1.scaleY*scaleY)];component2Line=component2.lines[0|(y*component2.scaleY*scaleY)];component3Line=component3.lines[0|(y*component3.scaleY*scaleY)];component4Line=component4.lines[0|(y*component4.scaleY*scaleY)];for(x=0;x<width;x++){if(!colorTransform){C=component1Line[0|(x*component1.scaleX*scaleX)];M=component2Line[0|(x*component2.scaleX*scaleX)];Ye=component3Line[0|(x*component3.scaleX*scaleX)];K=component4Line[0|(x*component4.scaleX*scaleX)];}else{Y=component1Line[0|(x*component1.scaleX*scaleX)];Cb=component2Line[0|(x*component2.scaleX*scaleX)];Cr=component3Line[0|(x*component3.scaleX*scaleX)];K=component4Line[0|(x*component4.scaleX*scaleX)];C=255-clampTo8bit(Y+1.402*(Cr-128));M=255-clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));Ye=255-clampTo8bit(Y+1.772*(Cb-128));}
-data[offset++]=255-C;data[offset++]=255-M;data[offset++]=255-Ye;data[offset++]=255-K;}}
-break;default:throw new Error('Unsupported color mode');}
-return data;},copyToImageData:function copyToImageData(imageData){var width=imageData.width,height=imageData.height;var imageDataArray=imageData.data;var data=this.getData(width,height);var i=0,j=0,x,y;var Y,K,C,M,R,G,B;switch(this.components.length){case 1:for(y=0;y<height;y++){for(x=0;x<width;x++){Y=data[i++];imageDataArray[j++]=Y;imageDataArray[j++]=Y;imageDataArray[j++]=Y;imageDataArray[j++]=255;}}
-break;case 3:for(y=0;y<height;y++){for(x=0;x<width;x++){R=data[i++];G=data[i++];B=data[i++];imageDataArray[j++]=R;imageDataArray[j++]=G;imageDataArray[j++]=B;imageDataArray[j++]=255;}}
-break;case 4:for(y=0;y<height;y++){for(x=0;x<width;x++){C=data[i++];M=data[i++];Y=data[i++];K=data[i++];R=255-clampTo8bit(C*(1-K/255)+K);G=255-clampTo8bit(M*(1-K/255)+K);B=255-clampTo8bit(Y*(1-K/255)+K);imageDataArray[j++]=R;imageDataArray[j++]=G;imageDataArray[j++]=B;imageDataArray[j++]=255;}}
-break;default:throw new Error('Unsupported color mode');}}};return constructor;})();global.jpegDecode=decode;function decode(jpegData,opts){var defaultOpts={useTArray:false,colorTransform:true};if(opts){if(typeof opts==='object'){opts={useTArray:(typeof opts.useTArray==='undefined'?defaultOpts.useTArray:opts.useTArray),colorTransform:(typeof opts.colorTransform==='undefined'?defaultOpts.colorTransform:opts.colorTransform)};}else{opts=defaultOpts;opts.useTArray=true;}}else{opts=defaultOpts;}
-var arr=new Uint8Array(jpegData);var decoder=new JpegImage();decoder.parse(arr);decoder.colorTransform=opts.colorTransform;var image={width:decoder.width,height:decoder.height,data:opts.useTArray?new Uint8Array(decoder.width*decoder.height*4):new Buffer(decoder.width*decoder.height*4)};decoder.copyToImageData(image);return image;}'use strict';tr.exportTo('tr.metrics.sh',function(){const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const SpeedIndex=tr.e.chrome.SpeedIndex;const LOADING_METRIC_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,1e3,20).addLinearBins(3e3,20).addExponentialBins(20e3,20);const SUMMARY_OPTIONS={avg:true,count:false,max:true,min:true,std:true,sum:false,};function addSpeedIndexScreenshotsBasedSample(samples,navigationStart,loadDuration,browserHelper){const screenshotObjects=browserHelper.process.objects.getAllInstancesNamed('Screenshot');if(!screenshotObjects)return;for(let i=0;i<screenshotObjects.length;i++){const snapshots=screenshotObjects[i].snapshots;const timestampedColorHistograms=[];snapshots.map(snapshot=>{if(snapshot.ts>=navigationStart.start&&snapshot.ts<navigationStart.start+loadDuration){timestampedColorHistograms.push({colorHistogram:SpeedIndex.createColorHistogram(getPixelData(snapshot.args)),ts:snapshot.ts});}});samples.push({value:SpeedIndex.calculateSpeedIndex(timestampedColorHistograms)-
-navigationStart.start});}}
-function getPixelData(base64JpegImage){const binaryString=atob(base64JpegImage);const bytes=new DataView(new ArrayBuffer(base64JpegImage.length));tr.b.Base64.DecodeToTypedArray(base64JpegImage,bytes);const rawImageData=jpegDecode(bytes.buffer,{useTArray:true});return rawImageData.data;}
-function collectSpeedIndexSamplesFromLoadExpectations(model,chromeHelper){const speedIndexScreenshotsBasedSamples=[];for(const expectation of model.userModel.expectations){if(!(expectation instanceof tr.model.um.LoadExpectation))continue;if(tr.e.chrome.CHROME_INTERNAL_URLS.includes(expectation.url)){continue;}
-const rendererHelper=chromeHelper.rendererHelpers[expectation.renderProcess.pid];addSpeedIndexScreenshotsBasedSample(speedIndexScreenshotsBasedSamples,expectation.navigationStart,expectation.duration,chromeHelper.browserHelper);}
-return speedIndexScreenshotsBasedSamples;}
-function screenshotsBasedSpeedIndexMetric(histograms,model){const speedIndexScreenshotsBasedHistogram=histograms.createHistogram('speedIndexScreenshotsBased',timeDurationInMs_smallerIsBetter,[],{binBoundaries:LOADING_METRIC_BOUNDARIES,description:'The average time at which visible parts of the'+' page are displayed.',summaryOptions:SUMMARY_OPTIONS,});const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const samples=collectSpeedIndexSamplesFromLoadExpectations(model,chromeHelper);for(const sample of samples){speedIndexScreenshotsBasedHistogram.addSample(sample.value);}}
-tr.metrics.MetricRegistry.register(screenshotsBasedSpeedIndexMetric);return{screenshotsBasedSpeedIndexMetric};});'use strict';tr.exportTo('tr.metrics.sh',function(){function weblayerStartupMetric(histograms,model){const startupWallHist=new tr.v.Histogram('weblayer_startup_wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);startupWallHist.description='WebLayer startup wall time';const loadWallHist=new tr.v.Histogram('weblayer_url_load_wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);loadWallHist.description='WebLayer blank URL load wall time';for(const slice of model.getDescendantEvents()){if(!(slice instanceof tr.model.ThreadSlice))continue;if(slice.title==='WebLayerStartupInterval'){startupWallHist.addSample(slice.duration);}
-if(slice.title==='WebLayerBlankUrlLoadInterval'){loadWallHist.addSample(slice.duration);}}
-histograms.addHistogram(startupWallHist);histograms.addHistogram(loadWallHist);}
-tr.metrics.MetricRegistry.register(weblayerStartupMetric);return{weblayerStartupMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function webviewStartupMetric(histograms,model){const startupWallHist=new tr.v.Histogram('webview_startup_wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);startupWallHist.description='WebView startup wall time';const startupCPUHist=new tr.v.Histogram('webview_startup_cpu_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);startupCPUHist.description='WebView startup CPU time';const loadWallHist=new tr.v.Histogram('webview_url_load_wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);loadWallHist.description='WebView blank URL load wall time';const loadCPUHist=new tr.v.Histogram('webview_url_load_cpu_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);loadCPUHist.description='WebView blank URL load CPU time';for(const slice of model.getDescendantEvents()){if(!(slice instanceof tr.model.ThreadSlice))continue;if(slice.title==='WebViewStartupInterval'){startupWallHist.addSample(slice.duration);startupCPUHist.addSample(slice.cpuDuration);}
-if(slice.title==='WebViewBlankUrlLoadInterval'){loadWallHist.addSample(slice.duration);loadCPUHist.addSample(slice.cpuDuration);}}
-histograms.addHistogram(startupWallHist);histograms.addHistogram(startupCPUHist);histograms.addHistogram(loadWallHist);histograms.addHistogram(loadCPUHist);}
-tr.metrics.MetricRegistry.register(webviewStartupMetric);return{webviewStartupMetric,};});'use strict';tr.exportTo('tr.metrics.tabs',function(){function tabsMetric(histograms,model,opt_options){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!chromeHelper){return;}
-const tabSwitchRequestDelays=[];const TAB_SWITCHING_REQUEST_TITLE='TabSwitchVisibilityRequest';let startTabSwitchVisibilityRequest=Number.MAX_SAFE_INTEGER;for(const helper of chromeHelper.browserHelpers){if(!helper.mainThread)continue;for(const slice of helper.mainThread.asyncSliceGroup.slices){if(slice.title===TAB_SWITCHING_REQUEST_TITLE&&!slice.error){tabSwitchRequestDelays.push(slice.duration);if(slice.start<startTabSwitchVisibilityRequest){startTabSwitchVisibilityRequest=slice.start;}}}}
-histograms.createHistogram('tab_switching_request_delay',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tabSwitchRequestDelays,{description:'Delay before tab-request is made',summaryOptions:{sum:false}});const tabSwitchLatencies=[];const TAB_SWITCHING_SLICE_TITLE='TabSwitching::Latency';function extractLatencyFromHelpers(helpers,legacy){for(const helper of helpers){if(!helper.mainThread){continue;}
-const thread=helper.mainThread;for(const slice of thread.asyncSliceGroup.slices){if(slice.title===TAB_SWITCHING_SLICE_TITLE&&(legacy||slice.args.latency)&&slice.start>startTabSwitchVisibilityRequest-1){tabSwitchLatencies.push(legacy?slice.duration:slice.args.latency);}}}}
-extractLatencyFromHelpers(chromeHelper.browserHelpers);extractLatencyFromHelpers(Object.values(chromeHelper.rendererHelpers));if(tabSwitchLatencies.length===0){extractLatencyFromHelpers(chromeHelper.browserHelpers,true);}
-histograms.createHistogram('tab_switching_latency',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tabSwitchLatencies,{description:'Tab switching time in ms',summaryOptions:{sum:false}});}
-tr.metrics.MetricRegistry.register(tabsMetric,{supportsRangeOfInterest:false,});return{tabsMetric,};});'use strict';tr.exportTo('tr.metrics',function(){const MEMORY_INFRA_TRACING_CATEGORY='disabled-by-default-memory-infra';const TIME_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1e-3,1e5,30);const BYTE_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1e9,30);const COUNT_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1e5,30);const SUMMARY_OPTIONS=tr.v.Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS;function addMemoryInfraHistograms(histograms,model,categoryNamesToTotalEventSizes){const memoryDumpCount=model.globalMemoryDumps.length;if(memoryDumpCount===0)return;let totalOverhead=0;let nonMemoryInfraThreadOverhead=0;const overheadByProvider={};for(const process of Object.values(model.processes)){for(const thread of Object.values(process.threads)){for(const slice of Object.values(thread.sliceGroup.slices)){if(slice.category!==MEMORY_INFRA_TRACING_CATEGORY)continue;totalOverhead+=slice.duration;if(thread.name!=='MemoryInfra'){nonMemoryInfraThreadOverhead+=slice.duration;}
-if(slice.args&&slice.args['dump_provider.name']){const providerName=slice.args['dump_provider.name'];let durationAndCount=overheadByProvider[providerName];if(durationAndCount===undefined){overheadByProvider[providerName]=durationAndCount={duration:0,count:0};}
-durationAndCount.duration+=slice.duration;durationAndCount.count++;}}}}
-histograms.createHistogram('memory_dump_cpu_overhead',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,totalOverhead/memoryDumpCount,{binBoundaries:TIME_BOUNDARIES,description:'Average CPU overhead on all threads per memory-infra dump',summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('nonmemory_thread_memory_dump_cpu_overhead',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,nonMemoryInfraThreadOverhead/memoryDumpCount,{binBoundaries:TIME_BOUNDARIES,description:'Average CPU overhead on non-memory-infra threads '+'per memory-infra dump',summaryOptions:SUMMARY_OPTIONS,});for(const[providerName,overhead]of Object.entries(overheadByProvider)){histograms.createHistogram(`${providerName}_memory_dump_cpu_overhead`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,overhead.duration/overhead.count,{binBoundaries:TIME_BOUNDARIES,description:`Average CPU overhead of ${providerName} per OnMemoryDump call`,summaryOptions:SUMMARY_OPTIONS,});}
-const memoryInfraEventsSize=categoryNamesToTotalEventSizes.get(MEMORY_INFRA_TRACING_CATEGORY);const memoryInfraTraceBytesValue=new tr.v.Histogram('total_memory_dump_size',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);memoryInfraTraceBytesValue.description='Total trace size of memory-infra dumps in bytes';memoryInfraTraceBytesValue.customizeSummaryOptions(SUMMARY_OPTIONS);memoryInfraTraceBytesValue.addSample(memoryInfraEventsSize);histograms.addHistogram(memoryInfraTraceBytesValue);const traceBytesPerDumpValue=new tr.v.Histogram('memory_dump_size',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);traceBytesPerDumpValue.description='Average trace size of memory-infra dumps in bytes';traceBytesPerDumpValue.customizeSummaryOptions(SUMMARY_OPTIONS);traceBytesPerDumpValue.addSample(memoryInfraEventsSize/memoryDumpCount);histograms.addHistogram(traceBytesPerDumpValue);}
-function tracingMetric(histograms,model){if(!model.stats.hasEventSizesinBytes)return;const eventStats=model.stats.allTraceEventStatsInTimeIntervals;eventStats.sort((a,b)=>a.timeInterval-b.timeInterval);const totalTraceBytes=eventStats.reduce((a,b)=>a+b.totalEventSizeinBytes,0);let maxEventCountPerSec=0;let maxEventBytesPerSec=0;const INTERVALS_PER_SEC=Math.floor(1000/model.stats.TIME_INTERVAL_SIZE_IN_MS);let runningEventNumPerSec=0;let runningEventBytesPerSec=0;let start=0;let end=0;while(end<eventStats.length){runningEventNumPerSec+=eventStats[end].numEvents;runningEventBytesPerSec+=eventStats[end].totalEventSizeinBytes;end++;while((eventStats[end-1].timeInterval-
-eventStats[start].timeInterval)>=INTERVALS_PER_SEC){runningEventNumPerSec-=eventStats[start].numEvents;runningEventBytesPerSec-=eventStats[start].totalEventSizeinBytes;start++;}
-maxEventCountPerSec=Math.max(maxEventCountPerSec,runningEventNumPerSec);maxEventBytesPerSec=Math.max(maxEventBytesPerSec,runningEventBytesPerSec);}
-const stats=model.stats.allTraceEventStats;const categoryNamesToTotalEventSizes=(stats.reduce((map,stat)=>(map.set(stat.category,((map.get(stat.category)||0)+
-stat.totalEventSizeinBytes))),new Map()));const maxCatNameAndBytes=Array.from(categoryNamesToTotalEventSizes.entries()).reduce((a,b)=>((b[1]>=a[1])?b:a));const maxEventBytesPerCategory=maxCatNameAndBytes[1];const categoryWithMaxEventBytes=maxCatNameAndBytes[0];const maxEventCountPerSecValue=new tr.v.Histogram('peak_event_rate',tr.b.Unit.byName.count_smallerIsBetter,COUNT_BOUNDARIES);maxEventCountPerSecValue.description='Max number of events per second';maxEventCountPerSecValue.customizeSummaryOptions(SUMMARY_OPTIONS);maxEventCountPerSecValue.addSample(maxEventCountPerSec);const maxEventBytesPerSecValue=new tr.v.Histogram('peak_event_size_rate',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);maxEventBytesPerSecValue.description='Max event size in bytes per second';maxEventBytesPerSecValue.customizeSummaryOptions(SUMMARY_OPTIONS);maxEventBytesPerSecValue.addSample(maxEventBytesPerSec);const totalTraceBytesValue=new tr.v.Histogram('trace_size',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);totalTraceBytesValue.customizeSummaryOptions(SUMMARY_OPTIONS);totalTraceBytesValue.addSample(totalTraceBytes);const biggestCategory={name:categoryWithMaxEventBytes,size_in_bytes:maxEventBytesPerCategory};totalTraceBytesValue.diagnostics.set('category_with_max_event_size',new tr.v.d.GenericSet([biggestCategory]));histograms.addHistogram(totalTraceBytesValue);maxEventCountPerSecValue.diagnostics.set('category_with_max_event_size',new tr.v.d.GenericSet([biggestCategory]));histograms.addHistogram(maxEventCountPerSecValue);maxEventBytesPerSecValue.diagnostics.set('category_with_max_event_size',new tr.v.d.GenericSet([biggestCategory]));histograms.addHistogram(maxEventBytesPerSecValue);addMemoryInfraHistograms(histograms,model,categoryNamesToTotalEventSizes);}
-tr.metrics.MetricRegistry.register(tracingMetric);return{tracingMetric,MEMORY_INFRA_TRACING_CATEGORY,};});'use strict';tr.exportTo('tr.metrics',function(){function parseBuckets_(event,processName){const len=tr.b.Base64.getDecodedBufferLength(event.args.buckets);const buffer=new ArrayBuffer(len);const dataView=new DataView(buffer);tr.b.Base64.DecodeToTypedArray(event.args.buckets,dataView);const decoded=new Uint32Array(buffer);const sum=decoded[1]+decoded[2]*0x100000000;const bins=[];let position=4;while(position<=decoded.length-4){const min=decoded[position++];const max=decoded[position++]+decoded[position++]*0x100000000;const count=decoded[position++];const processes=new tr.v.d.Breakdown();processes.set(processName,count);const events=new tr.v.d.RelatedEventSet([event]);bins.push({min,max,count,processes,events});}
-return{sum,bins};}
-function mergeBins_(x,y){x.sum+=y.sum;const allBins=[...x.bins,...y.bins];allBins.sort((a,b)=>a.min-b.min);x.bins=[];let last=undefined;for(const bin of allBins){if(last!==undefined&&bin.min===last.min){if(last.max!==bin.max)throw new Error('Incompatible bins');if(bin.count===0)continue;last.count+=bin.count;for(const event of bin.events){last.events.add(event);}
-last.processes.addDiagnostic(bin.processes);}else{if(last!==undefined&&bin.min<last.max){throw new Error('Incompatible bins');}
-x.bins.push(bin);last=bin;}}}
-function getHistogramUnit_(name){return tr.b.Unit.byName.unitlessNumber_smallerIsBetter;}
-function getIsHistogramBinsLinear_(histogramName){return histogramName.startsWith('Graphics.Smoothness.Throughput')||histogramName.startsWith('Memory.Memory.GPU.PeakMemoryUsage');}
-function getHistogramBoundaries_(name){if(name.startsWith('Event.Latency.Scroll')){return tr.v.HistogramBinBoundaries.createExponential(1e3,1e5,50);}
-if(name.startsWith('Graphics.Smoothness.Throughput')){return tr.v.HistogramBinBoundaries.createLinear(0,100,101);}
-if(name.startsWith('Memory.Memory.GPU.PeakMemoryUsage')){return tr.v.HistogramBinBoundaries.createLinear(0,1e6,100);}
-return tr.v.HistogramBinBoundaries.createExponential(1e-3,1e3,50);}
-function umaMetric(histograms,model){const histogramValues=new Map();const nameCounts=new Map();for(const process of model.getAllProcesses()){const histogramEvents=new Map();for(const event of process.instantEvents){if(event.title!=='UMAHistogramSamples')continue;const name=event.args.name;const events=histogramEvents.get(name)||[];if(!histogramEvents.has(name))histogramEvents.set(name,events);events.push(event);}
-let processName=tr.e.chrome.chrome_processes.canonicalizeProcessName(process.name);nameCounts.set(processName,(nameCounts.get(processName)||0)+1);processName=`${processName}_${nameCounts.get(processName)}`;for(const[name,events]of histogramEvents){const values=histogramValues.get(name)||{sum:0,bins:[]};if(!histogramValues.has(name))histogramValues.set(name,values);const endValues=parseBuckets_(events[events.length-1],processName);if(events.length===1){mergeBins_(values,endValues,name);}else{throw new Error('There should be at most one snapshot of UMA '+`histogram for ${name} in each process.`);}}}
-for(const[name,values]of histogramValues){const histogram=new tr.v.Histogram(name,getHistogramUnit_(name),getHistogramBoundaries_(name));const isLinear=getIsHistogramBinsLinear_(name);let sumOfMiddles=0;let sumOfBinLengths=0;for(const bin of values.bins){sumOfMiddles+=bin.count*(bin.min+bin.max)/2;sumOfBinLengths+=bin.count*(bin.max-bin.min);}
-if(name.startsWith('CompositorLatency.Type')){let histogramBoundaries=tr.v.HistogramBinBoundaries.createLinear(0,100,101);let histogramUnit=getHistogramUnit_(name);let presentedCount=values.bins[0]?values.bins[0].count:0;let delayedCount=values.bins[1]?values.bins[1].count:0;let droppedCount=values.bins[2]?values.bins[2].count:0;let inTimeCount=presentedCount-delayedCount;let totalCount=presentedCount+droppedCount;const inTimeHistogram=new tr.v.Histogram(name+'.Percentage_of_in_time_frames',histogramUnit,histogramBoundaries);inTimeHistogram.addSample(100.0*inTimeCount/totalCount);histograms.addHistogram(inTimeHistogram);const delayedHistogram=new tr.v.Histogram(name+'.Percentage_of_delayed_frames',histogramUnit,histogramBoundaries);delayedHistogram.addSample(100.0*delayedCount/totalCount);histograms.addHistogram(delayedHistogram);const droppedHistogram=new tr.v.Histogram(name+'.Percentage_of_dropped_frames',histogramUnit,histogramBoundaries);droppedHistogram.addSample(100.0*droppedCount/totalCount);histograms.addHistogram(droppedHistogram);}
-const shift=(values.sum-sumOfMiddles)/sumOfBinLengths;if(isLinear&&Math.abs(shift)>0.5){throw new Error(`Samples sum is wrong for ${name}.`);}
-for(const bin of values.bins){if(bin.count===0)continue;const shiftedValue=(bin.min+bin.max)/2+shift*(bin.max-bin.min);for(const[processName,count]of bin.processes){bin.processes.set(processName,shiftedValue*count/bin.count);}
-for(let i=0;i<bin.count;i++){histogram.addSample(shiftedValue,{processes:bin.processes,events:bin.events});}}
-histograms.addHistogram(histogram);}}
-tr.metrics.MetricRegistry.register(umaMetric,{requiredCategories:['benchmark'],});return{umaMetric,};});'use strict';tr.exportTo('tr.metrics.v8',function(){const CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(4,200,100);function computeExecuteMetrics(histograms,model){const cpuTotalExecution=new tr.v.Histogram('v8_execution_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalExecution.description='cpu total time spent in script execution';const wallTotalExecution=new tr.v.Histogram('v8_execution_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalExecution.description='wall total time spent in script execution';const cpuSelfExecution=new tr.v.Histogram('v8_execution_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfExecution.description='cpu self time spent in script execution';const wallSelfExecution=new tr.v.Histogram('v8_execution_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfExecution.description='wall self time spent in script execution';for(const e of model.findTopmostSlicesNamed('V8.Execute')){cpuTotalExecution.addSample(e.cpuDuration);wallTotalExecution.addSample(e.duration);cpuSelfExecution.addSample(e.cpuSelfTime);wallSelfExecution.addSample(e.selfTime);}
-histograms.addHistogram(cpuTotalExecution);histograms.addHistogram(wallTotalExecution);histograms.addHistogram(cpuSelfExecution);histograms.addHistogram(wallSelfExecution);}
-function computeParseLazyMetrics(histograms,model){const cpuSelfParseLazy=new tr.v.Histogram('v8_parse_lazy_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfParseLazy.description='cpu self time spent performing lazy parsing';const wallSelfParseLazy=new tr.v.Histogram('v8_parse_lazy_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfParseLazy.description='wall self time spent performing lazy parsing';for(const e of model.findTopmostSlicesNamed('V8.ParseLazyMicroSeconds')){cpuSelfParseLazy.addSample(e.cpuSelfTime);wallSelfParseLazy.addSample(e.selfTime);}
-for(const e of model.findTopmostSlicesNamed('V8.ParseLazy')){cpuSelfParseLazy.addSample(e.cpuSelfTime);wallSelfParseLazy.addSample(e.selfTime);}
-histograms.addHistogram(cpuSelfParseLazy);histograms.addHistogram(wallSelfParseLazy);}
-function computeCompileFullCodeMetrics(histograms,model){const cpuSelfCompileFullCode=new tr.v.Histogram('v8_compile_full_code_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfCompileFullCode.description='cpu self time spent performing compiling full code';const wallSelfCompileFullCode=new tr.v.Histogram('v8_compile_full_code_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfCompileFullCode.description='wall self time spent performing compiling full code';for(const e of model.findTopmostSlicesNamed('V8.CompileFullCode')){cpuSelfCompileFullCode.addSample(e.cpuSelfTime);wallSelfCompileFullCode.addSample(e.selfTime);}
-histograms.addHistogram(cpuSelfCompileFullCode);histograms.addHistogram(wallSelfCompileFullCode);}
-function computeCompileIgnitionMetrics(histograms,model){const cpuSelfCompileIgnition=new tr.v.Histogram('v8_compile_ignition_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfCompileIgnition.description='cpu self time spent in compile ignition';const wallSelfCompileIgnition=new tr.v.Histogram('v8_compile_ignition_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfCompileIgnition.description='wall self time spent in compile ignition';for(const e of model.findTopmostSlicesNamed('V8.CompileIgnition')){cpuSelfCompileIgnition.addSample(e.cpuSelfTime);wallSelfCompileIgnition.addSample(e.selfTime);}
-histograms.addHistogram(cpuSelfCompileIgnition);histograms.addHistogram(wallSelfCompileIgnition);}
-function computeRecompileMetrics(histograms,model){const cpuTotalRecompileSynchronous=new tr.v.Histogram('v8_recompile_synchronous_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalRecompileSynchronous.description='cpu total time spent in synchronous recompilation';const wallTotalRecompileSynchronous=new tr.v.Histogram('v8_recompile_synchronous_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalRecompileSynchronous.description='wall total time spent in synchronous recompilation';const cpuTotalRecompileConcurrent=new tr.v.Histogram('v8_recompile_concurrent_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalRecompileConcurrent.description='cpu total time spent in concurrent recompilation';const wallTotalRecompileConcurrent=new tr.v.Histogram('v8_recompile_concurrent_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalRecompileConcurrent.description='wall total time spent in concurrent recompilation';const cpuTotalRecompileOverall=new tr.v.Histogram('v8_recompile_overall_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalRecompileOverall.description='cpu total time spent in synchronous or concurrent recompilation';const wallTotalRecompileOverall=new tr.v.Histogram('v8_recompile_overall_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalRecompileOverall.description='wall total time spent in synchronous or concurrent recompilation';for(const e of model.findTopmostSlicesNamed('V8.RecompileSynchronous')){cpuTotalRecompileSynchronous.addSample(e.cpuDuration);wallTotalRecompileSynchronous.addSample(e.duration);cpuTotalRecompileOverall.addSample(e.cpuDuration);wallTotalRecompileOverall.addSample(e.duration);}
-histograms.addHistogram(cpuTotalRecompileSynchronous);histograms.addHistogram(wallTotalRecompileSynchronous);for(const e of model.findTopmostSlicesNamed('V8.RecompileConcurrent')){cpuTotalRecompileConcurrent.addSample(e.cpuDuration);wallTotalRecompileConcurrent.addSample(e.duration);cpuTotalRecompileOverall.addSample(e.cpuDuration);wallTotalRecompileOverall.addSample(e.duration);}
-histograms.addHistogram(cpuTotalRecompileConcurrent);histograms.addHistogram(wallTotalRecompileConcurrent);histograms.addHistogram(cpuTotalRecompileOverall);histograms.addHistogram(wallTotalRecompileOverall);}
-function computeOptimizeCodeMetrics(histograms,model){const cpuTotalOptimizeCode=new tr.v.Histogram('v8_optimize_code_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalOptimizeCode.description='cpu total time spent in code optimization';const wallTotalOptimizeCode=new tr.v.Histogram('v8_optimize_code_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalOptimizeCode.description='wall total time spent in code optimization';for(const e of model.findTopmostSlicesNamed('V8.OptimizeCode')){cpuTotalOptimizeCode.addSample(e.cpuDuration);wallTotalOptimizeCode.addSample(e.duration);}
-histograms.addHistogram(cpuTotalOptimizeCode);histograms.addHistogram(wallTotalOptimizeCode);}
-function computeDeoptimizeCodeMetrics(histograms,model){const cpuTotalDeoptimizeCode=new tr.v.Histogram('v8_deoptimize_code_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalDeoptimizeCode.description='cpu total time spent in code deoptimization';const wallTotalDeoptimizeCode=new tr.v.Histogram('v8_deoptimize_code_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalDeoptimizeCode.description='wall total time spent in code deoptimization';for(const e of model.findTopmostSlicesNamed('V8.DeoptimizeCode')){cpuTotalDeoptimizeCode.addSample(e.cpuDuration);wallTotalDeoptimizeCode.addSample(e.duration);}
-histograms.addHistogram(cpuTotalDeoptimizeCode);histograms.addHistogram(wallTotalDeoptimizeCode);}
-function executionMetric(histograms,model){computeExecuteMetrics(histograms,model);computeParseLazyMetrics(histograms,model);computeCompileIgnitionMetrics(histograms,model);computeCompileFullCodeMetrics(histograms,model);computeRecompileMetrics(histograms,model);computeOptimizeCodeMetrics(histograms,model);computeDeoptimizeCodeMetrics(histograms,model);}
-tr.metrics.MetricRegistry.register(executionMetric);return{executionMetric,};});'use strict';tr.exportTo('tr.metrics.v8',function(){const TARGET_FPS=60;const MS_PER_SECOND=1000;const WINDOW_SIZE_MS=MS_PER_SECOND/TARGET_FPS;const EPSILON=1e-6;const METRICS=['v8:gc:cycle:full','v8:gc:cycle:full:cpp','v8:gc:cycle:full:mark','v8:gc:cycle:full:mark:cpp','v8:gc:cycle:full:weak','v8:gc:cycle:full:weak:cpp','v8:gc:cycle:full:sweep','v8:gc:cycle:full:sweep:cpp','v8:gc:cycle:full:compact','v8:gc:cycle:full:compact:cpp','v8:gc:cycle:main_thread:full','v8:gc:cycle:main_thread:full:cpp','v8:gc:cycle:main_thread:full:mark','v8:gc:cycle:main_thread:full:mark:cpp','v8:gc:cycle:main_thread:full:weak','v8:gc:cycle:main_thread:full:weak:cpp','v8:gc:cycle:main_thread:full:sweep','v8:gc:cycle:main_thread:full:sweep:cpp','v8:gc:cycle:main_thread:full:compact','v8:gc:cycle:main_thread:full:compact:cpp','v8:gc:cycle:main_thread:full:atomic','v8:gc:cycle:main_thread:full:atomic:cpp','v8:gc:cycle:main_thread:full:atomic:mark','v8:gc:cycle:main_thread:full:atomic:mark:cpp','v8:gc:cycle:main_thread:full:atomic:weak','v8:gc:cycle:main_thread:full:atomic:weak:cpp','v8:gc:cycle:main_thread:full:atomic:sweep','v8:gc:cycle:main_thread:full:atomic:sweep:cpp','v8:gc:cycle:main_thread:full:atomic:compact','v8:gc:cycle:main_thread:full:atomic:compact:cpp','v8:gc:cycle:main_thread:full:incremental','v8:gc:cycle:main_thread:full:incremental:cpp','v8:gc:cycle:main_thread:full:incremental:mark','v8:gc:cycle:main_thread:full:incremental:mark:cpp','v8:gc:cycle:main_thread:full:incremental:sweep','v8:gc:cycle:main_thread:full:incremental:sweep:cpp','v8:gc:event:main_thread:full:atomic','v8:gc:event:main_thread:full:atomic:cpp','v8:gc:event:main_thread:full:atomic:mark','v8:gc:event:main_thread:full:atomic:mark:cpp','v8:gc:event:main_thread:full:atomic:weak','v8:gc:event:main_thread:full:atomic:weak:cpp','v8:gc:event:main_thread:full:atomic:sweep','v8:gc:event:main_thread:full:atomic:sweep:cpp','v8:gc:event:main_thread:full:atomic:compact','v8:gc:event:main_thread:full:atomic:compact:cpp','v8:gc:event:main_thread:full:incremental','v8:gc:event:main_thread:full:incremental:cpp','v8:gc:event:main_thread:full:incremental:mark','v8:gc:event:main_thread:full:incremental:mark:cpp','v8:gc:event:main_thread:full:incremental:sweep','v8:gc:event:main_thread:full:incremental:sweep:cpp','v8:gc:cycle:young','v8:gc:cycle:main_thread:young',];const V8_FULL_ATOMIC_EVENTS=['V8.GC_MARK_COMPACTOR'];const V8_FULL_MARK_EVENTS=['V8.GC_MC_BACKGROUND_MARKING','V8.GC_MC_MARK','V8.GC_MC_INCREMENTAL','V8.GCIncrementalMarkingFinalize','V8.GCIncrementalMarkingStart',];const V8_FULL_COMPACT_EVENTS=['V8.GC_MC_BACKGROUND_EVACUATE_COPY','V8.GC_MC_BACKGROUND_EVACUATE_UPDATE_POINTERS','V8.GC_MC_EVACUATE',];const V8_FULL_SWEEP_EVENTS=['V8.GC_MC_BACKGROUND_SWEEPING','V8.GC_MC_SWEEP',];const V8_FULL_WEAK_EVENTS=['V8.GC_MC_CLEAR',];const V8_YOUNG_EVENTS=['V8.GC_SCAVENGER_BACKGROUND_SCAVENGE_PARALLEL','V8.GC_SCAVENGER',];const CPP_GC_FULL_MARK_EVENTS=['BlinkGC.AtomicPauseMarkEpilogue','BlinkGC.AtomicPauseMarkPrologue','BlinkGC.AtomicPauseMarkRoots','BlinkGC.AtomicPauseMarkTransitiveClosure','BlinkGC.ConcurrentMarkingStep','BlinkGC.IncrementalMarkingStartMarking','BlinkGC.IncrementalMarkingStep','BlinkGC.MarkBailOutObjects','BlinkGC.MarkFlushEphemeronPairs','BlinkGC.MarkFlushV8References','BlinkGC.UnifiedMarkingStep','CppGC.AtomicMark','CppGC.IncrementalMark','CppGC.ConcurrentMark',];const CPP_GC_FULL_COMPACT_EVENTS=['BlinkGC.AtomicPauseSweepAndCompact','CppGC.AtomicCompact',];const CPP_GC_FULL_SWEEP_EVENTS=['BlinkGC.CompleteSweep','BlinkGC.ConcurrentSweepingStep','BlinkGC.LazySweepInIdle','BlinkGC.LazySweepOnAllocation','CppGC.AtomicSweep','CppGC.IncrementalSweep','CppGC.ConcurrentSweep',];const CPP_GC_FULL_WEAK_EVENTS=['BlinkGC.MarkWeakProcessing','CppGC.AtomicWeak',];const RULES=[{events:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic',},{events:V8_FULL_MARK_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:mark',},{events:CPP_GC_FULL_MARK_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:mark:cpp',},{events:V8_FULL_MARK_EVENTS,outside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:incremental:mark',},{events:CPP_GC_FULL_MARK_EVENTS,outside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:incremental:mark:cpp',},{events:V8_FULL_COMPACT_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:compact',},{events:CPP_GC_FULL_COMPACT_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:compact:cpp',},{events:V8_FULL_SWEEP_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:sweep',},{events:CPP_GC_FULL_SWEEP_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:sweep:cpp',},{events:V8_FULL_WEAK_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:weak',},{events:CPP_GC_FULL_WEAK_EVENTS,inside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:atomic:weak:cpp',},{events:V8_FULL_SWEEP_EVENTS,outside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:incremental:sweep',},{events:CPP_GC_FULL_SWEEP_EVENTS,outside:V8_FULL_ATOMIC_EVENTS,contribute_to:'full:incremental:sweep:cpp',},{events:V8_YOUNG_EVENTS,contribute_to:'young:atomic',},];const Granularity={CYCLE:'cycle',EVENT:'event',};const ThreadType={MAIN:'main',BACKGROUND:'background',ALL_THREADS:'all_threads',};class Metric{constructor(name){const parts=name.split(':');this.granularity_=parts[2];assert(this.granularity_===Granularity.CYCLE||this.granularity_===Granularity.EVENT);this.thread_=ThreadType.ALL_THREADS;let phasesIndex=3;if(parts[3]==='main_thread'){this.thread_=ThreadType.MAIN;phasesIndex=4;}
-if(parts[3]==='background_threads'){this.thread_=ThreadType.BACKGROUND;phasesIndex=4;}
-this.phases_=parts.slice(phasesIndex);const maxValue=this.isPerCycleMetric()?10000:1000;const boundaries=tr.v.HistogramBinBoundaries.createExponential(0.1,maxValue,100);this.histogram=new tr.v.Histogram(name,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,boundaries);this.histogram.customizeSummaryOptions({avg:true,count:true,max:true,min:false,std:false,sum:this.isPerCycleMetric(),});}
-isPerCycleMetric(){return this.granularity_===Granularity.CYCLE;}
-isMoreGeneralThanOrEqualTo(phases){const phasesSet=new Set(phases.split(':'));return this.phases_.every(phase=>phasesSet.has(phase));}
-contributingEvents(rules,events){const eventsByName=groupBy(events,e=>e.title);function matches(rule,event){function isEnclosing(name){if(!eventsByName.has(name))return false;return eventsByName.get(name).some(e=>encloses(e,event));}
-if(!rule.events.includes(event.title)){return false;}
-if(rule.inside&&!rule.inside.some(isEnclosing)){return false;}
-if(rule.outside&&rule.outside.some(isEnclosing)){return false;}
-return true;}
-const result=[];for(const event of events){const matching=rules.filter(r=>matches(r,event));if(matching.length===0){continue;}
-assert(matching.length===1,`${event.userFriendlyName} matches more than one rule: `+
-JSON.stringify(matching));if(this.isMoreGeneralThanOrEqualTo(matching[0].contribute_to)){result.push(event);}}
-return result;}
-apply(rules,events,threadTypes){const filtered=this.contributingEvents(rules,events);const eventsByThread=groupBy(filtered,e=>e.parentContainer.tid);let flattened=[];for(const[tid,threadEvents]of eventsByThread){if(this.thread_===ThreadType.ALL_THREADS||this.thread_===threadTypes.get(tid)){flattened=flattened.concat(flatten(threadEvents));}}
-if(this.isPerCycleMetric()){let sum=0;for(const event of flattened){sum+=event.cpuDuration;}
-if(flattened.length>0){this.histogram.addSample(sum);}}else{for(const event of flattened){this.histogram.addSample(event.cpuDuration);}}}}
-function assert(condition,message){if(!condition){throw new Error(message);}}
-function groupBy(objects,keyCallback){const result=new Map();for(const object of objects){const group=keyCallback(object);if(result.has(group)){result.get(group).push(object);}else{result.set(group,[object]);}}
-return result;}
-function eventsMentionedIn(rules){let result=[];for(const rule of rules){result=result.concat(rule.events);if(rule.inside){result=result.concat(rule.inside);}
-if(rule.outside){result=result.concat(rule.outside);}}
-return result;}
-function encloses(event1,event2){return(event1.start-EPSILON<=event2.start&&event2.end<=event1.end+EPSILON);}
-function jsExecutionThreadsWithTypes(rendererHelper){const mainThreads=([rendererHelper.mainThread].concat(rendererHelper.dedicatedWorkerThreads).concat(rendererHelper.serviceWorkerThreads));const backgroundThreads=rendererHelper.foregroundWorkerThreads;const threadTypes=new Map();for(const thread of mainThreads){threadTypes.set(thread.tid,ThreadType.MAIN);}
-for(const thread of backgroundThreads){threadTypes.set(thread.tid,ThreadType.BACKGROUND);}
-return[mainThreads.concat(backgroundThreads),threadTypes];}
-function flatten(events){function compareWithEpsilon(a,b){if(a.start<b.start-EPSILON)return-1;if(a.start>b.start+EPSILON)return 1;return b.end-a.end;}
-events.sort(compareWithEpsilon);let last=events[0];const result=[last];for(const e of events){if(e.end>last.end+EPSILON){assert(e.start>=last.end-EPSILON,'Overlapping events: '+
-e.userFriendlyName+' '+
-last.userFriendlyName);result.push(e);last=e;}}
-return result;}
-function groupByEpoch(events){function isV8Event(event){return event.category&&event.category.includes('v8');}
-function getEpoch(event){function checkEpochConsistency(epoch,event){if(epoch===null)return;assert(epoch===event.args.epoch,`${event.userFriendlyName} has epoch ${event.args.epoch} `+`which contradicts the epoch of nested events ${epoch}`);}
-const result={v8:null,cpp:null};while(event){if('epoch'in event.args){if(isV8Event(event)){checkEpochConsistency(result.v8,event);result.v8=event.args.epoch;}else{checkEpochConsistency(result.cpp,event);result.cpp=event.args.epoch;}}
-event=event.parentSlice;}
-return result;}
-function GlobalEpochFromV8(v8Epoch){return 2*v8Epoch;}
-function GlobalEpochFromCpp(cppEpoch){return 2*cppEpoch+1;}
-const cppToV8=new Map();for(const event of events){const epoch=getEpoch(event);if(epoch.cpp!==null&&epoch.v8!==null){if(!cppToV8.has(epoch.cpp)||cppToV8.get(epoch.cpp)>epoch.v8){cppToV8.set(epoch.cpp,epoch.v8);}}}
-const result=new Map();for(const event of events){const epoch=getEpoch(event);if(epoch.cpp===null&&epoch.v8===null){continue;}
-let globalEpoch;if(epoch.v8!==null){globalEpoch=GlobalEpochFromV8(epoch.v8);}else if(cppToV8.has(epoch.cpp)){globalEpoch=GlobalEpochFromV8(cppToV8.get(epoch.cpp));}else{globalEpoch=GlobalEpochFromCpp(epoch.cpp);}
-if(result.has(globalEpoch)){result.get(globalEpoch).push(event);}else{result.set(globalEpoch,[event]);}}
-return result;}
-function addGarbageCollectionMetrics(metricNames,histograms,model){const metrics=metricNames.map(name=>new Metric(name));const gcEventNames=new Set(eventsMentionedIn(RULES));const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){if(rendererHelper.isChromeTracingUI)continue;const[threads,threadTypes]=jsExecutionThreadsWithTypes(rendererHelper);const events=[];for(const thread of threads){for(const event of thread.sliceGroup.childEvents()){if(gcEventNames.has(event.title)){events.push(event);}}}
-for(const cycleEvents of groupByEpoch(events).values()){if(cycleEvents.some(tr.metrics.v8.utils.isForcedGarbageCollectionEvent)){continue;}
-for(const metric of metrics){metric.apply(RULES,cycleEvents,threadTypes);}}}
-for(const metric of metrics){histograms.addHistogram(metric.histogram);}}
-function gcMetric(histograms,model,options){options=options||{};addDurationOfTopEvents(histograms,model);addTotalDurationOfTopEvents(histograms,model);if(options.include_sub_events){addDurationOfSubEvents(histograms,model);}
-addPercentageInV8ExecuteOfTopEvents(histograms,model);addTotalPercentageInV8Execute(histograms,model);addMarkCompactorMutatorUtilization(histograms,model);addTotalMarkCompactorTime(histograms,model);addTotalMarkCompactorMarkingTime(histograms,model);addScavengerSurvivedFromStackEvents(histograms,model);addGarbageCollectionMetrics(METRICS,histograms,model);}
-tr.metrics.MetricRegistry.register(gcMetric);const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const percentage_biggerIsBetter=tr.b.Unit.byName.normalizedPercentage_biggerIsBetter;const percentage_smallerIsBetter=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const bytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,20,200).addExponentialBins(200,100);function createNumericForTopEventTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:true,max:true,min:false,std:true,sum:true,percentile:[0.90]});return n;}
-function createNumericForSubEventTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:false,max:true,min:false,std:false,sum:false,percentile:[0.90]});return n;}
-function createNumericForIdleTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:false,max:true,min:false,std:false,sum:true,percentile:[]});return n;}
-function createPercentage(name,numerator,denominator,unit){const hist=new tr.v.Histogram(name,unit);if(denominator===0){hist.addSample(0);}else{hist.addSample(numerator/denominator);}
-hist.customizeSummaryOptions({avg:true,count:false,max:false,min:false,std:false,sum:false,percentile:[]});return hist;}
-function addDurationOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,tr.metrics.v8.utils.isNotForcedTopGarbageCollectionEvent,tr.metrics.v8.utils.topGarbageCollectionEventName,function(name,events){const cpuDuration=createNumericForTopEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);},tr.metrics.v8.utils.topGarbageCollectionEventNames());}
-function addTotalDurationOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,tr.metrics.v8.utils.isNotForcedTopGarbageCollectionEvent,event=>'v8-gc-total',function(name,events){const cpuDuration=createNumericForTopEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);},['v8-gc-total']);}
-function isV8MarkCompactorSummary(event){return!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event)&&tr.metrics.v8.utils.isMarkCompactorSummaryEvent(event);}
-function isV8MarkCompactorMarkingSummary(event){return!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event)&&tr.metrics.v8.utils.isMarkCompactorMarkingSummaryEvent(event);}
-function createHistogramFromSummary(histograms,name,events){const foregroundDuration=createNumericForTopEventTime(name+'-foreground');const backgroundDuration=createNumericForTopEventTime(name+'-background');const totalDuration=createNumericForTopEventTime(name+'-total');const relatedNames=new tr.v.d.RelatedNameMap();relatedNames.set('foreground',foregroundDuration.name);relatedNames.set('background',backgroundDuration.name);for(const event of events){foregroundDuration.addSample(event.args.duration);backgroundDuration.addSample(event.args.background_duration);const breakdownForTotal=new tr.v.d.Breakdown();breakdownForTotal.set('foreground',event.args.duration);breakdownForTotal.set('background',event.args.background_duration);totalDuration.addSample(event.args.duration+event.args.background_duration,{breakdown:breakdownForTotal});}
-histograms.addHistogram(foregroundDuration);histograms.addHistogram(backgroundDuration);histograms.addHistogram(totalDuration,{breakdown:relatedNames});}
-function addTotalMarkCompactorTime(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isV8MarkCompactorSummary,event=>'v8-gc-mark-compactor',(name,events)=>createHistogramFromSummary(histograms,name,events),['v8-gc-mark-compactor']);}
-function addTotalMarkCompactorMarkingTime(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isV8MarkCompactorMarkingSummary,event=>'v8-gc-mark-compactor-marking',(name,events)=>createHistogramFromSummary(histograms,name,events),['v8-gc-mark-compactor-marking']);}
-function createNumericForTotalBytes(name){const n=new tr.v.Histogram(name,bytes_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:false,count:false,max:false,min:false,std:false,sum:true,percentile:[]});return n;}
-function createNumericForSampledPercent(name){const n=new tr.v.Histogram(name,percentage_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:false,max:true,min:true,std:true,sum:false,percentile:[]});return n;}
-function addScavengerSurvivedFromStackEvents(histograms,model){const baseName='v8-gc-scavenger-survived';tr.metrics.v8.utils.groupAndProcessEvents(model,tr.metrics.v8.utils.isScavengerStackScanningEvent,event=>baseName,function(name,events){const sampledPercentage=createNumericForSampledPercent(baseName+'-percentage-from-stack');let survivedWithoutStack=0;let survivedWithStack=0;events.forEach(function(event){const bytesBefore=event.args.survived_bytes_before;const bytesAfter=event.args.survived_bytes_after;sampledPercentage.addSample((bytesAfter>0)?(bytesAfter-bytesBefore)/bytesAfter:0);survivedWithoutStack+=bytesBefore;survivedWithStack+=bytesAfter;});histograms.addHistogram(sampledPercentage);const totalBytesSurvivedWithoutStack=createNumericForTotalBytes(baseName+'-total-bytes-without-stack');totalBytesSurvivedWithoutStack.addSample(survivedWithoutStack);histograms.addHistogram(totalBytesSurvivedWithoutStack);const totalBytesSurvivedWithStack=createNumericForTotalBytes(baseName+'-total-bytes-with-stack');totalBytesSurvivedWithStack.addSample(survivedWithStack);histograms.addHistogram(totalBytesSurvivedWithStack);const overallPercentage=createPercentage(baseName+'-total-percentage-from-stack',survivedWithStack-survivedWithoutStack,survivedWithStack,percentage_smallerIsBetter);histograms.addHistogram(overallPercentage);},[baseName]);}
-function addDurationOfSubEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,tr.metrics.v8.utils.isNotForcedSubGarbageCollectionEvent,tr.metrics.v8.utils.subGarbageCollectionEventName,function(name,events){const cpuDuration=createNumericForSubEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);});}
-function addPercentageInV8ExecuteOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,tr.metrics.v8.utils.isNotForcedTopGarbageCollectionEvent,tr.metrics.v8.utils.topGarbageCollectionEventName,function(name,events){addPercentageInV8Execute(histograms,model,name,events);},tr.metrics.v8.utils.topGarbageCollectionEventNames());}
-function addTotalPercentageInV8Execute(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,tr.metrics.v8.utils.isNotForcedTopGarbageCollectionEvent,event=>'v8-gc-total',function(name,events){addPercentageInV8Execute(histograms,model,name,events);},['v8-gc-total']);}
-function addPercentageInV8Execute(histograms,model,name,events){let cpuDurationInV8Execute=0;let cpuDurationTotal=0;events.forEach(function(event){const v8Execute=tr.metrics.v8.utils.findParent(event,tr.metrics.v8.utils.isV8ExecuteEvent);if(v8Execute){cpuDurationInV8Execute+=event.cpuDuration;}
-cpuDurationTotal+=event.cpuDuration;});const percentage=createPercentage(name+'_percentage_in_v8_execute',cpuDurationInV8Execute,cpuDurationTotal,percentage_smallerIsBetter);histograms.addHistogram(percentage);}
-function addMarkCompactorMutatorUtilization(histograms,model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const rendererHelpers=Object.values(chromeHelper.rendererHelpers);tr.metrics.v8.utils.addMutatorUtilization('v8-gc-mark-compactor-mmu',tr.metrics.v8.utils.isNotForcedMarkCompactorEvent,[100],rendererHelpers,histograms);}
-return{gcMetric,WINDOW_SIZE_MS,addGarbageCollectionMetrics,};});'use strict';tr.exportTo('tr.metrics.v8',function(){const COUNT_CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1000000,50);const DURATION_CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(0.1,10000,50);const SUMMARY_OPTIONS={std:false,count:false,sum:false,min:false,max:false,};function convertMicroToMilli_(time){return tr.b.convertUnit(time,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);}
-function addDurationHistogram(histogramName,time,histograms){const value=convertMicroToMilli_(time);histograms.createHistogram(`${histogramName}:duration`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,{value},{binBoundaries:DURATION_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});}
-function addCountHistogram(histogramName,value,histograms){histograms.createHistogram(`${histogramName}:count`,tr.b.Unit.byName.count_smallerIsBetter,{value},{binBoundaries:COUNT_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS});}
-function runtimeStatsTotalMetric(histograms,model){const v8Slices=tr.metrics.v8.utils.filterEvents(model,ev=>ev instanceof tr.e.v8.V8ThreadSlice);const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(v8Slices);let overallV8Time=runtimeGroupCollection.totalTime;let overallV8Count=runtimeGroupCollection.totalCount;let mainThreadTime=runtimeGroupCollection.totalTime;let mainThreadCount=runtimeGroupCollection.totalCount;let mainThreadV8Time=runtimeGroupCollection.totalTime;let mainThreadV8Count=runtimeGroupCollection.totalCount;for(const runtimeGroup of runtimeGroupCollection.runtimeGroups){addDurationHistogram(runtimeGroup.name,runtimeGroup.time,histograms);if(runtimeGroup.name==='Blink C++'){overallV8Time-=runtimeGroup.time;mainThreadV8Time-=runtimeGroup.time;}else if(runtimeGroup.name.includes('Background')){mainThreadTime-=runtimeGroup.time;mainThreadV8Time-=runtimeGroup.time;}
-addCountHistogram(runtimeGroup.name,runtimeGroup.count,histograms);if(runtimeGroup.name==='Blink C++'){overallV8Count-=runtimeGroup.count;mainThreadV8Count-=runtimeGroup.count;}else if(runtimeGroup.name.includes('Background')){mainThreadCount-=runtimeGroup.count;mainThreadV8Count-=runtimeGroup.count;}}
-if(runtimeGroupCollection.blinkRCSGroupCollection.totalTime>0){const blinkRCSGroupCollection=runtimeGroupCollection.blinkRCSGroupCollection;for(const group of blinkRCSGroupCollection.runtimeGroups){addDurationHistogram(group.name,group.time,histograms);addCountHistogram(group.name,group.count,histograms);}}
-addDurationHistogram('V8-Only',overallV8Time,histograms);addCountHistogram('V8-Only',overallV8Count,histograms);addDurationHistogram('Total-Main-Thread',mainThreadTime,histograms);addCountHistogram('Total-Main-Thread',mainThreadCount,histograms);addDurationHistogram('V8-Only-Main-Thread',mainThreadV8Time,histograms);addCountHistogram('V8-Only-Main-Thread',mainThreadV8Count,histograms);}
-tr.metrics.MetricRegistry.register(runtimeStatsTotalMetric);return{runtimeStatsTotalMetric,};});'use strict';tr.exportTo('tr.metrics.v8',function(){function v8AndMemoryMetrics(histograms,model){tr.metrics.v8.executionMetric(histograms,model);tr.metrics.v8.gcMetric(histograms,model);tr.metrics.sh.memoryMetric(histograms,model,{rangeOfInterest:tr.metrics.v8.utils.rangeForMemoryDumps(model)});}
-tr.metrics.MetricRegistry.register(v8AndMemoryMetrics);return{v8AndMemoryMetrics,};});'use strict';tr.exportTo('tr.metrics.v8',function(){function computeSyncInstantiationTimeMetric(histograms,wasmEvents){if(!wasmEvents.hasOwnProperty('wasm.SyncInstantiate'))return;const wasmSyncInstantiationTimeCPU=new tr.v.Histogram('v8:wasm:sync_instantiate:cpu_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);wasmSyncInstantiationTimeCPU.description='cpu time spent instantiating a WebAssembly module';const wasmSyncInstantiationTimeWall=new tr.v.Histogram('v8:wasm:sync_instantiate:wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);wasmSyncInstantiationTimeWall.description='wall time spent instantiating a WebAssembly module';for(const e of wasmEvents['wasm.SyncInstantiate']){wasmSyncInstantiationTimeCPU.addSample(e.cpuDuration);wasmSyncInstantiationTimeWall.addSample(e.duration);}
-histograms.addHistogram(wasmSyncInstantiationTimeCPU);histograms.addHistogram(wasmSyncInstantiationTimeWall);}
-function computeSyncCompileTimeMetric(histograms,wasmEvents){if(!wasmEvents.hasOwnProperty('wasm.SyncCompile'))return;const wasmSyncCompileTimeCPU=new tr.v.Histogram('v8:wasm:sync_compile:cpu_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);wasmSyncCompileTimeCPU.description='cpu time spent compiling a WebAssembly module synchronously';const wasmSyncCompileTimeWall=new tr.v.Histogram('v8:wasm:sync_compile:wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);wasmSyncCompileTimeWall.description='wall time spent compiling a WebAssembly module synchronously';for(const e of wasmEvents['wasm.SyncCompile']){wasmSyncCompileTimeCPU.addSample(e.cpuDuration);wasmSyncCompileTimeWall.addSample(e.duration);}
-histograms.addHistogram(wasmSyncCompileTimeCPU);histograms.addHistogram(wasmSyncCompileTimeWall);}
-function computeStreamingBaselineCompileTimeMetric(histograms,wasmEvents){if(!wasmEvents.hasOwnProperty('wasm.StartStreamingCompilation')||!wasmEvents.hasOwnProperty('wasm.BaselineFinished')){return;}
-const histogram=new tr.v.Histogram('v8:wasm:streaming_baseline_compilation:wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);for(const endEvent of wasmEvents['wasm.BaselineFinished']){const compilationEnd=endEvent.end;const startEvent=wasmEvents['wasm.StartStreamingCompilation'].find(e=>e.args.id===endEvent.args.id);if(!startEvent)continue;const compilationStart=startEvent.start;histogram.addSample(compilationEnd-compilationStart);}
-histograms.addHistogram(histogram);}
-function computeCompilationTierupWallTimeMetric(histograms,wasmEvents){if(!wasmEvents.hasOwnProperty('wasm.BaselineFinished')||!wasmEvents.hasOwnProperty('wasm.TopTierFinished')){return;}
-const histogram=new tr.v.Histogram('v8:wasm:compilation_tierup:wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);for(const endEvent of wasmEvents['wasm.TopTierFinished']){const tierupEnd=endEvent.end;const startEvent=wasmEvents['wasm.BaselineFinished'].find(e=>e.args.id===endEvent.args.id);if(!startEvent)continue;const tierupStart=startEvent.start;histogram.addSample(tierupEnd-tierupStart);}
-histograms.addHistogram(histogram);}
-function collectWasmEvents(model){const wasmEvents=tr.metrics.v8.utils.filterAndOrderEvents(model,event=>event.title.startsWith('wasm.'),event=>event.title);return wasmEvents;}
-function wasmMetric(histograms,model){const wasmEvents=collectWasmEvents(model);computeSyncInstantiationTimeMetric(histograms,wasmEvents);computeSyncCompileTimeMetric(histograms,wasmEvents);computeStreamingBaselineCompileTimeMetric(histograms,wasmEvents);computeCompilationTierupWallTimeMetric(histograms,wasmEvents);}
-tr.metrics.MetricRegistry.register(wasmMetric);return{wasmMetric,};});'use strict';tr.exportTo('tr.metrics.vr',function(){const VR_GL_THREAD_NAME='VrShellGL';function createHistograms(histograms,name,options,hasCpuTime){const createdHistograms={wall:histograms.createHistogram(name+'_wall',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[],options)};if(hasCpuTime){createdHistograms.cpu=histograms.createHistogram(name+'_cpu',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[],options);}
-return createdHistograms;}
-function frameCycleDurationMetric(histograms,model,opt_options){const histogramsByEventTitle=new Map();const expectationEvents=tr.importer.VR_EXPECTATION_EVENTS;for(const eventName in expectationEvents){const extraInfo=expectationEvents[eventName];histogramsByEventTitle.set(eventName,createHistograms(histograms,extraInfo.histogramName,{description:extraInfo.description},extraInfo.hasCpuTime));}
-histogramsByEventTitle.set('UiScene::OnBeginFrame.UpdateAnimationsAndOpacity',createHistograms(histograms,'update_animations_and_opacity',{description:'Duration to apply animation and opacity changes'},true));histogramsByEventTitle.set('UiScene::OnBeginFrame.UpdateBindings',createHistograms(histograms,'update_bindings',{description:'Duration to push binding values'},true));histogramsByEventTitle.set('UiScene::OnBeginFrame.UpdateLayout',createHistograms(histograms,'update_layout',{description:'Duration to compute element sizes, layout and textures'},true));histogramsByEventTitle.set('UiScene::OnBeginFrame.UpdateWorldSpaceTransform',createHistograms(histograms,'update_world_space_transforms',{description:'Duration to calculate element transforms in world space'},true));histogramsByEventTitle.set('UiRenderer::DrawUiView',createHistograms(histograms,'draw_ui',{description:'Duration to draw the UI'},true));histogramsByEventTitle.set('UiElementRenderer::DrawTexturedQuad',createHistograms(histograms,'draw_textured_quad',{description:'Duration to draw a textured element'},true));histogramsByEventTitle.set('UiElementRenderer::DrawGradientQuad',createHistograms(histograms,'draw_gradient_quad',{description:'Duration to draw a gradient element'},true));histogramsByEventTitle.set('UiElementRenderer::DrawGradientGridQuad',createHistograms(histograms,'draw_gradient_grid_quad',{description:'Duration to draw a gradient grid element'},true));histogramsByEventTitle.set('UiElementRenderer::DrawController',createHistograms(histograms,'draw_controller',{description:'Duration to draw the controller'},true));histogramsByEventTitle.set('UiElementRenderer::DrawLaser',createHistograms(histograms,'draw_laser',{description:'Duration to draw the laser'},true));histogramsByEventTitle.set('UiElementRenderer::DrawReticle',createHistograms(histograms,'draw_reticle',{description:'Duration to draw the reticle'},true));histogramsByEventTitle.set('UiElementRenderer::DrawShadow',createHistograms(histograms,'draw_shadow',{description:'Duration to draw a shadow element'},true));histogramsByEventTitle.set('UiElementRenderer::DrawStars',createHistograms(histograms,'draw_stars',{description:'Duration to draw the stars'},true));histogramsByEventTitle.set('UiElementRenderer::DrawBackground',createHistograms(histograms,'draw_background',{description:'Duration to draw the textured background'},true));histogramsByEventTitle.set('UiElementRenderer::DrawKeyboard',createHistograms(histograms,'draw_keyboard',{description:'Duration to draw the keyboard'},true));const drawUiSubSlicesMap=new Map();const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);let rangeOfInterest=model.bounds;const userExpectationsOfInterest=[tr.model.um.AnimationExpectation];if(opt_options&&opt_options.rangeOfInterest){rangeOfInterest=opt_options.rangeOfInterest;userExpectationsOfInterest.push(tr.model.um.ResponseExpectation);}
-for(const ue of model.userModel.expectations){if(ue.initiatorType!==tr.model.um.INITIATOR_TYPE.VR){continue;}
-if(!userExpectationsOfInterest.some(function(ueOfInterest){return ue instanceof ueOfInterest;})){continue;}
-if(!rangeOfInterest.intersectsExplicitRangeInclusive(ue.start,ue.end)){continue;}
-for(const helper of chromeHelper.browserHelpers){const glThreads=helper.process.findAllThreadsNamed(VR_GL_THREAD_NAME);for(const glThread of glThreads){for(const event of glThread.getDescendantEvents()){if(!(histogramsByEventTitle.has(event.title))){continue;}
-if(event.start<ue.start||event.end>ue.end){continue;}
-if(event.start<rangeOfInterest.min||event.end>rangeOfInterest.max){continue;}
-if(event.parentSlice&&event.parentSlice.title==='UiRenderer::DrawUiView'){const guid=event.parentSlice.guid;if(!drawUiSubSlicesMap.has(guid)){drawUiSubSlicesMap.set(guid,[]);}
-drawUiSubSlicesMap.get(guid).push(event);continue;}
-const{wall:wallHist,cpu:cpuHist}=histogramsByEventTitle.get(event.title);wallHist.addSample(event.duration);if(cpuHist!==undefined){cpuHist.addSample(event.cpuDuration);}}}}}
-for(const subSlices of drawUiSubSlicesMap.values()){const eventMap=new Map();for(const event of subSlices){if(!eventMap.has(event.title)){eventMap.set(event.title,{wall:0,cpu:0});}
-eventMap.get(event.title).wall+=event.duration;eventMap.get(event.title).cpu+=event.cpuDuration;}
-for(const[title,values]of eventMap.entries()){const{wall:wallHist,cpu:cpuHist}=histogramsByEventTitle.get(title);wallHist.addSample(values.wall);if(cpuHist!==undefined){cpuHist.addSample(values.cpu);}}}}
-tr.metrics.MetricRegistry.register(frameCycleDurationMetric,{supportsRangeOfInterest:true,});return{frameCycleDurationMetric,};});'use strict';tr.exportTo('tr.metrics.vr',function(){function webvrMetric(histograms,model,opt_options){const WEBVR_COUNTERS=new Map([['gpu.WebVR FPS',{name:'webvr_fps',unit:tr.b.Unit.byName.count_biggerIsBetter,samples:{},options:{description:'WebVR frame per second',binBoundaries:tr.v.HistogramBinBoundaries.createLinear(20,120,25),},}],['gpu.WebVR frame time (ms)',{name:'webvr_frame_time',unit:tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,samples:{},options:{description:'WebVR frame time in ms',binBoundaries:tr.v.HistogramBinBoundaries.createLinear(20,120,25),},}],['gpu.WebVR pose prediction (ms)',{name:'webvr_pose_prediction',unit:tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,samples:{},options:{description:'WebVR pose prediction in ms',binBoundaries:tr.v.HistogramBinBoundaries.createLinear(20,120,25),},}],]);for(const ue of model.userModel.expectations){const rangeOfInterestEnabled=opt_options&&opt_options.rangeOfInterest;if(rangeOfInterestEnabled&&!opt_options.rangeOfInterest.intersectsExplicitRangeInclusive(ue.start,ue.end)){continue;}
-if(ue.initiatorType!==tr.model.um.INITIATOR_TYPE.VR)continue;if(!rangeOfInterestEnabled){if(!(ue instanceof tr.model.um.AnimationExpectation))continue;}else{if(!(ue instanceof tr.model.um.AnimationExpectation||ue instanceof tr.model.um.ResponseExpectation))continue;}
-for(const counter of model.getAllCounters()){if(!(WEBVR_COUNTERS.has(counter.id)))continue;for(const series of counter.series){if(!(series.name in WEBVR_COUNTERS.get(counter.id).samples)){WEBVR_COUNTERS.get(counter.id).samples[series.name]=[];}
-for(const sample of series.samples){if(sample.timestamp<ue.start||sample.timestamp>=ue.end){continue;}
-if(rangeOfInterestEnabled&&!opt_options.rangeOfInterest.intersectsExplicitRangeInclusive(sample.timestamp,sample.timestamp)){continue;}
-WEBVR_COUNTERS.get(counter.id).samples[series.name].push(sample.value);}}}}
-if(!('value'in WEBVR_COUNTERS.get('gpu.WebVR FPS').samples)){WEBVR_COUNTERS.get('gpu.WebVR FPS').samples.value=[0];}
-for(const[key,value]of WEBVR_COUNTERS){for(const[seriesName,samples]of Object.entries(value.samples)){let histogramName=value.name;if(seriesName!=='value'){histogramName=`${histogramName}_${seriesName}`;}
-histograms.createHistogram(histogramName,value.unit,samples,value.options);}}}
-tr.metrics.MetricRegistry.register(webvrMetric,{supportsRangeOfInterest:true,});return{webvrMetric,};});'use strict';tr.exportTo('tr.metrics.vr',function(){function webxrMetric(histograms,model,opt_options){const DEFAULT_BIN_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(20,120,25);const counterHistogramsByTitle=new Map();counterHistogramsByTitle.set('gpu.WebXR FPS',histograms.createHistogram('webxr_fps',tr.b.Unit.byName.count_biggerIsBetter,[],{description:'WebXR frames per second',binBoundaries:DEFAULT_BIN_BOUNDARIES,}));const instantHistogramsByTitle=new Map();const expectationEvents=tr.importer.WEBXR_INSTANT_EVENTS;for(const[eventName,eventData]of Object.entries(expectationEvents)){const argsToHistograms={};for(const[argName,argData]of Object.entries(eventData)){argsToHistograms[argName]=histograms.createHistogram(argData.histogramName,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[],{description:argData.description,binBoundaries:DEFAULT_BIN_BOUNDARIES,});}
-instantHistogramsByTitle.set(eventName,argsToHistograms);}
-const rangeOfInterestEnabled=opt_options&&opt_options.rangeOfInterest;const rangeOfInterest=(rangeOfInterestEnabled?opt_options.rangeOfInterest:tr.b.math.Range.fromExplicitRange(-Infinity,Infinity));for(const ue of model.userModel.expectations){if(!rangeOfInterest.intersectsExplicitRangeInclusive(ue.start,ue.end)){continue;}
-if(ue.initiatorType!==tr.model.um.INITIATOR_TYPE.VR)continue;if(!rangeOfInterestEnabled){if(!(ue instanceof tr.model.um.AnimationExpectation))continue;}else{if(!(ue instanceof tr.model.um.AnimationExpectation||ue instanceof tr.model.um.ResponseExpectation))continue;}
-for(const counter of model.getAllCounters()){if(!(counterHistogramsByTitle.has(counter.id)))continue;for(const series of counter.series){for(const sample of series.samples){if(sample.timestamp<ue.start||sample.timestamp>=ue.end){continue;}
-if(!rangeOfInterest.intersectsExplicitRangeInclusive(sample.timestamp,sample.timestamp)){continue;}
-counterHistogramsByTitle.get(counter.id).addSample(sample.value);}}}
-for(const event of ue.associatedEvents.asSet()){if(!(instantHistogramsByTitle.has(event.title))){continue;}
-if(!rangeOfInterest.intersectsExplicitRangeInclusive(event.start,event.start)){continue;}
-const eventHistograms=instantHistogramsByTitle.get(event.title);for(const[key,value]of Object.entries(event.args)){if(key in eventHistograms){eventHistograms[key].addSample(value,{event:new tr.v.d.RelatedEventSet(event)});}}}}
-if(counterHistogramsByTitle.get('gpu.WebXR FPS').numValues===0){counterHistogramsByTitle.get('gpu.WebXR FPS').addSample(0);}}
-tr.metrics.MetricRegistry.register(webxrMetric,{supportsRangeOfInterest:true,});return{webxrMetric,};});'use strict';tr.exportTo('tr.metrics.webrtc',function(){const DISPLAY_HERTZ=60.0;const VSYNC_DURATION_US=1e6/DISPLAY_HERTZ;const SEVERITY=3;const FROZEN_FRAME_VSYNC_COUNT_THRESHOLD=6;const WEB_MEDIA_PLAYER_UPDATE_TITLE='UpdateCurrentFrame';const IDEAL_RENDER_INSTANT_NAME='Ideal Render Instant';const ACTUAL_RENDER_BEGIN_NAME='Actual Render Begin';const ACTUAL_RENDER_END_NAME='Actual Render End';const STREAM_ID_NAME='Serial';const REQUIRED_EVENT_ARGS_NAMES=[IDEAL_RENDER_INSTANT_NAME,ACTUAL_RENDER_BEGIN_NAME,ACTUAL_RENDER_END_NAME,STREAM_ID_NAME];const SUMMARY_OPTIONS=tr.v.Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS;const count_smallerIsBetter=tr.b.Unit.byName.count_smallerIsBetter;const percentage_biggerIsBetter=tr.b.Unit.byName.normalizedPercentage_biggerIsBetter;const percentage_smallerIsBetter=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const unitlessNumber_biggerIsBetter=tr.b.Unit.byName.unitlessNumber_biggerIsBetter;function isValidEvent(event){if(event.title!==WEB_MEDIA_PLAYER_UPDATE_TITLE||!event.args){return false;}
-for(const parameter of REQUIRED_EVENT_ARGS_NAMES){if(!(parameter in event.args)){return false;}}
-return true;}
-function webrtcRenderingMetric(histograms,model){const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);let webMediaPlayerMSEvents=[];for(const rendererPid in modelHelper.rendererHelpers){const rendererHelper=modelHelper.rendererHelpers[rendererPid];const compositorThread=rendererHelper.compositorThread;if(compositorThread!==undefined){webMediaPlayerMSEvents=webMediaPlayerMSEvents.concat(compositorThread.sliceGroup.slices.filter(isValidEvent));}}
-const eventsByStreamName=tr.b.groupIntoMap(webMediaPlayerMSEvents,event=>event.args[STREAM_ID_NAME]);for(const[streamName,events]of eventsByStreamName){getTimeStats(histograms,streamName,events);}}
-tr.metrics.MetricRegistry.register(webrtcRenderingMetric);function getTimeStats(histograms,streamName,events){const frameHist=getFrameDistribution(histograms,events);addFpsFromFrameDistribution(histograms,frameHist);addFreezingScore(histograms,frameHist);const driftTimeStats=getDriftStats(events);histograms.createHistogram('WebRTCRendering_drift_time',timeDurationInMs_smallerIsBetter,driftTimeStats.driftTime,{summaryOptions:{count:false,min:false,percentile:[0.75,0.9],},});histograms.createHistogram('WebRTCRendering_rendering_length_error',percentage_smallerIsBetter,driftTimeStats.renderingLengthError,{summaryOptions:SUMMARY_OPTIONS,});const smoothnessStats=getSmoothnessStats(driftTimeStats.driftTime);histograms.createHistogram('WebRTCRendering_percent_badly_out_of_sync',percentage_smallerIsBetter,smoothnessStats.percentBadlyOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_percent_out_of_sync',percentage_smallerIsBetter,smoothnessStats.percentOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_smoothness_score',percentage_biggerIsBetter,smoothnessStats.smoothnessScore,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_frames_out_of_sync',count_smallerIsBetter,smoothnessStats.framesOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_frames_badly_out_of_sync',count_smallerIsBetter,smoothnessStats.framesSeverelyOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});}
-const FRAME_DISTRIBUTION_BIN_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(1,50,49);function getFrameDistribution(histograms,events){const cadence=tr.b.runLengthEncoding(events.map(e=>e.args[IDEAL_RENDER_INSTANT_NAME]));return histograms.createHistogram('WebRTCRendering_frame_distribution',count_smallerIsBetter,cadence.map(ticks=>ticks.count),{binBoundaries:FRAME_DISTRIBUTION_BIN_BOUNDARIES,summaryOptions:{percentile:[0.75,0.9],},});}
-function addFpsFromFrameDistribution(histograms,frameHist){let numberFrames=0;let numberVsyncs=0;for(let ticks=1;ticks<frameHist.allBins.length;++ticks){const count=frameHist.allBins[ticks].count;numberFrames+=count;numberVsyncs+=ticks*count;}
-const meanRatio=numberVsyncs/numberFrames;histograms.createHistogram('WebRTCRendering_fps',unitlessNumber_biggerIsBetter,DISPLAY_HERTZ/meanRatio,{summaryOptions:SUMMARY_OPTIONS,});}
-function frozenPenaltyWeight(numberFrozenFrames){const penalty={5:1,6:5,7:15,8:25};return penalty[numberFrozenFrames]||(8*(numberFrozenFrames-4));}
-function addFreezingScore(histograms,frameHist){let numberVsyncs=0;let freezingScore=0;let frozenFramesCount=0;for(let ticks=1;ticks<frameHist.allBins.length;++ticks){const count=frameHist.allBins[ticks].count;numberVsyncs+=ticks*count;if(ticks>=FROZEN_FRAME_VSYNC_COUNT_THRESHOLD){frozenFramesCount+=count*(ticks-1);freezingScore+=count*frozenPenaltyWeight(ticks-1);}}
-freezingScore=1-freezingScore/numberVsyncs;if(freezingScore<0){freezingScore=0;}
-histograms.createHistogram('WebRTCRendering_frozen_frames_count',count_smallerIsBetter,frozenFramesCount,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_freezing_score',percentage_biggerIsBetter,freezingScore,{summaryOptions:SUMMARY_OPTIONS,});}
-function getDriftStats(events){const driftTime=[];const discrepancy=[];let oldIdealRender=0;let expectedIdealRender=0;for(const event of events){const currentIdealRender=event.args[IDEAL_RENDER_INSTANT_NAME];expectedIdealRender+=VSYNC_DURATION_US;if(currentIdealRender===oldIdealRender){continue;}
-const actualRenderBegin=event.args[ACTUAL_RENDER_BEGIN_NAME];driftTime.push(actualRenderBegin-currentIdealRender);discrepancy.push(Math.abs(currentIdealRender-expectedIdealRender));expectedIdealRender=currentIdealRender;oldIdealRender=currentIdealRender;}
-const discrepancySum=tr.b.math.Statistics.sum(discrepancy)-
-discrepancy[0];const lastIdealRender=events[events.length-1].args[IDEAL_RENDER_INSTANT_NAME];const firstIdealRender=events[0].args[IDEAL_RENDER_INSTANT_NAME];const idealRenderSpan=lastIdealRender-firstIdealRender;const renderingLengthError=discrepancySum/idealRenderSpan;return{driftTime,renderingLengthError};}
-function getSmoothnessStats(driftTimes){const meanDriftTime=tr.b.math.Statistics.mean(driftTimes);const normDriftTimes=driftTimes.map(driftTime=>Math.abs(driftTime-meanDriftTime));const framesSeverelyOutOfSync=normDriftTimes.filter(driftTime=>driftTime>2*VSYNC_DURATION_US).length;const framesOutOfSync=normDriftTimes.filter(driftTime=>driftTime>VSYNC_DURATION_US).length;const percentBadlyOutOfSync=framesSeverelyOutOfSync/driftTimes.length;const percentOutOfSync=framesOutOfSync/driftTimes.length;const framesOutOfSyncOnlyOnce=framesOutOfSync-framesSeverelyOutOfSync;let smoothnessScore=1-(framesOutOfSyncOnlyOnce+
-SEVERITY*framesSeverelyOutOfSync)/driftTimes.length;if(smoothnessScore<0){smoothnessScore=0;}
-return{framesOutOfSync,framesSeverelyOutOfSync,percentBadlyOutOfSync,percentOutOfSync,smoothnessScore};}
-return{webrtcRenderingMetric,};});'use strict';Polymer({is:'tr-ui-a-alert-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;this.$.table.tableColumns=[{title:'Label',value(row){return row.name;},width:'150px'},{title:'Value',width:'100%',value(row){return row.value;}}];this.$.table.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},getRowsForSingleAlert_(alert){const rows=[];for(const argName in alert.args){const argView=document.createElement('tr-ui-a-generic-object-view');argView.object=alert.args[argName];rows.push({name:argName,value:argView});}
-if(alert.associatedEvents.length){alert.associatedEvents.forEach(function(event,i){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet(event),event.title);let valueString='';if(event instanceof tr.model.TimedEvent){valueString='took '+event.duration.toFixed(2)+'ms';}
-rows.push({name:linkEl,value:valueString});});}
-const descriptionEl=tr.ui.b.createDiv({textContent:alert.info.description,maxWidth:'300px'});rows.push({name:'Description',value:descriptionEl});if(alert.info.docLinks){alert.info.docLinks.forEach(function(linkObject){const linkEl=document.createElement('a');linkEl.target='_blank';linkEl.href=linkObject.href;Polymer.dom(linkEl).textContent=Polymer.dom(linkObject).textContent;rows.push({name:linkObject.label,value:linkEl});});}
-return rows;},getRowsForAlerts_(alerts){if(alerts.length===1){const rows=[{name:'Alert',value:tr.b.getOnlyElement(alerts).title}];const detailRows=this.getRowsForSingleAlert_(tr.b.getOnlyElement(alerts));rows.push.apply(rows,detailRows);return rows;}
-return alerts.map(function(alert){return{name:'Alert',value:alert.title,isExpanded:alerts.size<10,subRows:this.getRowsForSingleAlert_(alert)};},this);},updateContents_(){if(this.currentSelection_===undefined){this.$.table.rows=[];this.$.table.rebuild();return;}
-const alerts=this.currentSelection_;this.$.table.tableRows=this.getRowsForAlerts_(alerts);this.$.table.rebuild();},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;const result=new tr.model.EventSet();for(const event of this.currentSelection_){result.addEventSet(event.associatedEvents);}
-return result;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-alert-sub-view',tr.model.Alert,{multi:false,title:'Alert',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-alert-sub-view',tr.model.Alert,{multi:true,title:'Alerts',});'use strict';tr.exportTo('tr.ui.analysis',function(){const NO_BREAK_SPACE=String.fromCharCode(160);const RIGHTWARDS_ARROW=String.fromCharCode(8594);const COLLATOR=new Intl.Collator(undefined,{numeric:true});function TitleColumn(title){this.title=title;}
-TitleColumn.prototype={supportsCellSelection:false,value(row){const formattedTitle=this.formatTitle(row);const contexts=row.contexts;if(contexts===undefined||contexts.length===0){return formattedTitle;}
-const firstContext=contexts[0];const lastContext=contexts[contexts.length-1];let changeDefinedContextCount=0;for(let i=1;i<contexts.length;i++){if((contexts[i]===undefined)!==(contexts[i-1]===undefined)){changeDefinedContextCount++;}}
-let color=undefined;let prefix=undefined;if(!firstContext&&lastContext){color='red';prefix='+++';}else if(firstContext&&!lastContext){color='green';prefix='---';}
-if(changeDefinedContextCount>1){color='purple';}
-if(color===undefined&&prefix===undefined){return formattedTitle;}
-const titleEl=document.createElement('span');if(prefix!==undefined){const prefixEl=tr.ui.b.createSpan({textContent:prefix});prefixEl.style.fontFamily='monospace';Polymer.dom(titleEl).appendChild(prefixEl);Polymer.dom(titleEl).appendChild(tr.ui.b.asHTMLOrTextNode(NO_BREAK_SPACE));}
-if(color!==undefined){titleEl.style.color=color;}
-Polymer.dom(titleEl).appendChild(tr.ui.b.asHTMLOrTextNode(formattedTitle));return titleEl;},formatTitle(row){return row.title;},cmp(rowA,rowB){return COLLATOR.compare(rowA.title,rowB.title);}};function MemoryColumn(name,cellPath,aggregationMode){this.name=name;this.cellPath=cellPath;this.shouldSetContextGroup=false;this.aggregationMode=aggregationMode;}
-MemoryColumn.fromRows=function(rows,config){const cellNames=new Set();function gatherCellNames(rows){rows.forEach(function(row){if(row===undefined)return;const fieldCells=row[config.cellKey];if(fieldCells!==undefined){for(const[fieldName,fieldCell]of Object.entries(fieldCells)){if(fieldCell===undefined||fieldCell.fields===undefined){continue;}
-cellNames.add(fieldName);}}
-const subRows=row.subRows;if(subRows!==undefined){gatherCellNames(subRows);}});}
-gatherCellNames(rows);const positions=[];cellNames.forEach(function(cellName){const cellPath=[config.cellKey,cellName];const matchingRule=MemoryColumn.findMatchingRule(cellName,config.rules);const constructor=matchingRule.columnConstructor;const column=new constructor(cellName,cellPath,config.aggregationMode);column.shouldSetContextGroup=!!config.shouldSetContextGroup;positions.push({importance:matchingRule.importance,column});});positions.sort(function(a,b){if(a.importance===b.importance){return COLLATOR.compare(a.column.name,b.column.name);}
-return b.importance-a.importance;});return positions.map(function(position){return position.column;});};MemoryColumn.spaceEqually=function(columns){const columnWidth=(100/columns.length).toFixed(3)+'%';columns.forEach(function(column){column.width=columnWidth;});};MemoryColumn.findMatchingRule=function(name,rules){for(let i=0;i<rules.length;i++){const rule=rules[i];if(MemoryColumn.nameMatchesCondition(name,rule.condition)){return rule;}}
-return undefined;};MemoryColumn.nameMatchesCondition=function(name,condition){if(condition===undefined)return true;if(typeof(condition)==='string')return name===condition;return condition.test(name);};MemoryColumn.AggregationMode={DIFF:0,MAX:1};MemoryColumn.SOME_TIMESTAMPS_INFO_QUANTIFIER='at some selected timestamps';MemoryColumn.prototype={get title(){return this.name;},cell(row){let cell=row;const cellPath=this.cellPath;for(let i=0;i<cellPath.length;i++){if(cell===undefined)return undefined;cell=cell[cellPath[i]];}
-return cell;},aggregateCells(row,subRows){},fields(row){const cell=this.cell(row);if(cell===undefined)return undefined;return cell.fields;},value(row){const fields=this.fields(row);if(this.hasAllRelevantFieldsUndefined(fields))return'';const contexts=row.contexts;const color=this.color(fields,contexts);const infos=[];this.addInfos(fields,contexts,infos);const formattedFields=this.formatFields(fields);if((color===undefined||formattedFields==='')&&infos.length===0){return formattedFields;}
-const fieldEl=document.createElement('span');fieldEl.style.display='flex';fieldEl.style.alignItems='center';fieldEl.style.justifyContent='flex-end';Polymer.dom(fieldEl).appendChild(tr.ui.b.asHTMLOrTextNode(formattedFields));infos.forEach(function(info){const infoEl=document.createElement('span');infoEl.style.paddingLeft='4px';infoEl.style.cursor='help';infoEl.style.fontWeight='bold';Polymer.dom(infoEl).textContent=info.icon;if(info.color!==undefined){infoEl.style.color=info.color;}
-infoEl.title=info.message;Polymer.dom(fieldEl).appendChild(infoEl);},this);if(color!==undefined){fieldEl.style.color=color;}
-return fieldEl;},hasAllRelevantFieldsUndefined(fields){if(fields===undefined)return true;switch(this.aggregationMode){case MemoryColumn.AggregationMode.DIFF:return fields[0]===undefined&&fields[fields.length-1]===undefined;case MemoryColumn.AggregationMode.MAX:default:return fields.every(function(field){return field===undefined;});}},color(fields,contexts){return undefined;},formatFields(fields){if(fields.length===1){return this.formatSingleField(fields[0]);}
-return this.formatMultipleFields(fields);},formatSingleField(field){throw new Error('Not implemented');},formatMultipleFields(fields){switch(this.aggregationMode){case MemoryColumn.AggregationMode.DIFF:return this.formatMultipleFieldsDiff(fields[0],fields[fields.length-1]);case MemoryColumn.AggregationMode.MAX:return this.formatMultipleFieldsMax(fields);default:return tr.ui.b.createSpan({textContent:'(unsupported aggregation mode)',italic:true});}},formatMultipleFieldsDiff(firstField,lastField){throw new Error('Not implemented');},formatMultipleFieldsMax(fields){return this.formatSingleField(this.getMaxField(fields));},cmp(rowA,rowB){const fieldsA=this.fields(rowA);const fieldsB=this.fields(rowB);if(fieldsA!==undefined&&fieldsB!==undefined&&fieldsA.length!==fieldsB.length){throw new Error('Different number of fields');}
-const undefinedA=this.hasAllRelevantFieldsUndefined(fieldsA);const undefinedB=this.hasAllRelevantFieldsUndefined(fieldsB);if(undefinedA&&undefinedB)return 0;if(undefinedA)return-1;if(undefinedB)return 1;return this.compareFields(fieldsA,fieldsB);},compareFields(fieldsA,fieldsB){if(fieldsA.length===1){return this.compareSingleFields(fieldsA[0],fieldsB[0]);}
-return this.compareMultipleFields(fieldsA,fieldsB);},compareSingleFields(fieldA,fieldB){throw new Error('Not implemented');},compareMultipleFields(fieldsA,fieldsB){switch(this.aggregationMode){case MemoryColumn.AggregationMode.DIFF:return this.compareMultipleFieldsDiff(fieldsA[0],fieldsA[fieldsA.length-1],fieldsB[0],fieldsB[fieldsB.length-1]);case MemoryColumn.AggregationMode.MAX:return this.compareMultipleFieldsMax(fieldsA,fieldsB);default:return 0;}},compareMultipleFieldsDiff(firstFieldA,lastFieldA,firstFieldB,lastFieldB){throw new Error('Not implemented');},compareMultipleFieldsMax(fieldsA,fieldsB){return this.compareSingleFields(this.getMaxField(fieldsA),this.getMaxField(fieldsB));},getMaxField(fields){return fields.reduce(function(accumulator,field){if(field===undefined){return accumulator;}
-if(accumulator===undefined||this.compareSingleFields(field,accumulator)>0){return field;}
-return accumulator;}.bind(this),undefined);},addInfos(fields,contexts,infos){},getImportance(importanceRules){if(importanceRules.length===0)return 0;const matchingRule=MemoryColumn.findMatchingRule(this.name,importanceRules);if(matchingRule!==undefined){return matchingRule.importance;}
-let minImportance=importanceRules[0].importance;for(let i=1;i<importanceRules.length;i++){minImportance=Math.min(minImportance,importanceRules[i].importance);}
-return minImportance-1;}};function StringMemoryColumn(name,cellPath,aggregationMode){MemoryColumn.call(this,name,cellPath,aggregationMode);}
-StringMemoryColumn.prototype={__proto__:MemoryColumn.prototype,formatSingleField(string){return string;},formatMultipleFieldsDiff(firstString,lastString){if(firstString===undefined){const spanEl=tr.ui.b.createSpan({color:'red'});Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode('+'));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(lastString)));return spanEl;}else if(lastString===undefined){const spanEl=tr.ui.b.createSpan({color:'green'});Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode('-'));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(firstString)));return spanEl;}else if(firstString===lastString){return this.formatSingleField(firstString);}
-const spanEl=tr.ui.b.createSpan({color:'DarkOrange'});Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(firstString)));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(' '+RIGHTWARDS_ARROW+' '));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(lastString)));return spanEl;},compareSingleFields(stringA,stringB){return COLLATOR.compare(stringA,stringB);},compareMultipleFieldsDiff(firstStringA,lastStringA,firstStringB,lastStringB){if(firstStringA===undefined&&firstStringB!==undefined){return 1;}
-if(firstStringA!==undefined&&firstStringB===undefined){return-1;}
-if(firstStringA===undefined&&firstStringB===undefined){return this.compareSingleFields(lastStringA,lastStringB);}
-if(lastStringA===undefined&&lastStringB!==undefined){return-1;}
-if(lastStringA!==undefined&&lastStringB===undefined){return 1;}
-if(lastStringA===undefined&&lastStringB===undefined){return this.compareSingleFields(firstStringB,firstStringA);}
-const areStringsAEqual=firstStringA===lastStringA;const areStringsBEqual=firstStringB===lastStringB;if(areStringsAEqual&&areStringsBEqual)return 0;if(areStringsAEqual)return-1;if(areStringsBEqual)return 1;return 0;}};function NumericMemoryColumn(name,cellPath,aggregationMode){MemoryColumn.call(this,name,cellPath,aggregationMode);}
-NumericMemoryColumn.DIFF_EPSILON=0.0001;NumericMemoryColumn.prototype={__proto__:MemoryColumn.prototype,align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,aggregateCells(row,subRows){const subRowCells=subRows.map(this.cell,this);let hasDefinedSubRowNumeric=false;let timestampCount=undefined;subRowCells.forEach(function(subRowCell){if(subRowCell===undefined)return;const subRowNumerics=subRowCell.fields;if(subRowNumerics===undefined)return;if(timestampCount===undefined){timestampCount=subRowNumerics.length;}else if(timestampCount!==subRowNumerics.length){throw new Error('Sub-rows have different numbers of timestamps');}
-if(hasDefinedSubRowNumeric){return;}
-hasDefinedSubRowNumeric=subRowNumerics.some(function(numeric){return numeric!==undefined;});});if(!hasDefinedSubRowNumeric){return;}
-const cellPath=this.cellPath;let rowCell=row;for(let i=0;i<cellPath.length;i++){const nextStepName=cellPath[i];let nextStep=rowCell[nextStepName];if(nextStep===undefined){if(i<cellPath.length-1){nextStep={};}else{nextStep=new MemoryCell(undefined);}
-rowCell[nextStepName]=nextStep;}
-rowCell=nextStep;}
-if(rowCell.fields===undefined){rowCell.fields=new Array(timestampCount);}else if(rowCell.fields.length!==timestampCount){throw new Error('Row has a different number of timestamps than sub-rows');}
-for(let i=0;i<timestampCount;i++){if(rowCell.fields[i]!==undefined)continue;rowCell.fields[i]=tr.model.MemoryAllocatorDump.aggregateNumerics(subRowCells.map(function(subRowCell){if(subRowCell===undefined||subRowCell.fields===undefined){return undefined;}
-return subRowCell.fields[i];}));}},formatSingleField(numeric){return tr.v.ui.createScalarSpan(numeric,{context:this.getFormattingContext(numeric.unit),contextGroup:this.shouldSetContextGroup?this.name:undefined,inline:true,});},getFormattingContext(unit){return undefined;},formatMultipleFieldsDiff(firstNumeric,lastNumeric){return this.formatSingleField(this.getDiffField_(firstNumeric,lastNumeric));},compareSingleFields(numericA,numericB){return numericA.value-numericB.value;},compareMultipleFieldsDiff(firstNumericA,lastNumericA,firstNumericB,lastNumericB){return this.getDiffFieldValue_(firstNumericA,lastNumericA)-
-this.getDiffFieldValue_(firstNumericB,lastNumericB);},getDiffField_(firstNumeric,lastNumeric){const definedNumeric=firstNumeric||lastNumeric;return new tr.b.Scalar(definedNumeric.unit.correspondingDeltaUnit,this.getDiffFieldValue_(firstNumeric,lastNumeric));},getDiffFieldValue_(firstNumeric,lastNumeric){const firstValue=firstNumeric===undefined?0:firstNumeric.value;const lastValue=lastNumeric===undefined?0:lastNumeric.value;const diff=lastValue-firstValue;return Math.abs(diff)<NumericMemoryColumn.DIFF_EPSILON?0:diff;}};function MemoryCell(fields){this.fields=fields;}
-MemoryCell.extractFields=function(cell){if(cell===undefined)return undefined;return cell.fields;};const RECURSIVE_EXPANSION_MAX_VISIBLE_ROW_COUNT=10;function expandTableRowsRecursively(table){let currentLevelRows=table.tableRows;let totalVisibleRowCount=currentLevelRows.length;while(currentLevelRows.length>0){let nextLevelRowCount=0;currentLevelRows.forEach(function(currentLevelRow){const subRows=currentLevelRow.subRows;if(subRows===undefined||subRows.length===0)return;nextLevelRowCount+=subRows.length;});if(totalVisibleRowCount+nextLevelRowCount>RECURSIVE_EXPANSION_MAX_VISIBLE_ROW_COUNT){break;}
-const nextLevelRows=new Array(nextLevelRowCount);let nextLevelRowIndex=0;currentLevelRows.forEach(function(currentLevelRow){const subRows=currentLevelRow.subRows;if(subRows===undefined||subRows.length===0)return;table.setExpandedForTableRow(currentLevelRow,true);subRows.forEach(function(subRow){nextLevelRows[nextLevelRowIndex++]=subRow;});});totalVisibleRowCount+=nextLevelRowCount;currentLevelRows=nextLevelRows;}}
-function aggregateTableRowCellsRecursively(row,columns,opt_predicate){const subRows=row.subRows;if(subRows===undefined||subRows.length===0)return;subRows.forEach(function(subRow){aggregateTableRowCellsRecursively(subRow,columns,opt_predicate);});if(opt_predicate===undefined||opt_predicate(row.contexts)){aggregateTableRowCells(row,subRows,columns);}}
-function aggregateTableRowCells(row,subRows,columns){columns.forEach(function(column){if(!(column instanceof MemoryColumn))return;column.aggregateCells(row,subRows);});}
-function createCells(timeToValues,valueFieldsGetter,opt_this){opt_this=opt_this||this;const fieldNameToFields=tr.b.invertArrayOfDicts(timeToValues,valueFieldsGetter,opt_this);const result={};for(const[fieldName,fields]of Object.entries(fieldNameToFields)){result[fieldName]=new tr.ui.analysis.MemoryCell(fields);}
-return result;}
-function createWarningInfo(message){return{message,icon:String.fromCharCode(9888),color:'red'};}
-function DetailsNumericMemoryColumn(name,cellPath,aggregationMode){NumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
-DetailsNumericMemoryColumn.prototype={__proto__:NumericMemoryColumn.prototype,getFormattingContext(unit){if(unit.baseUnit===tr.b.Unit.byName.sizeInBytes){return{unitPrefix:tr.b.UnitPrefixScale.BINARY.KIBI};}
-return undefined;}};return{TitleColumn,MemoryColumn,StringMemoryColumn,NumericMemoryColumn,MemoryCell,expandTableRowsRecursively,aggregateTableRowCellsRecursively,aggregateTableRowCells,createCells,createWarningInfo,DetailsNumericMemoryColumn,};});'use strict';tr.exportTo('tr.ui.analysis',function(){const LATIN_SMALL_LETTER_F_WITH_HOOK=String.fromCharCode(0x0192);const CIRCLED_LATIN_CAPITAL_LETTER_T=String.fromCharCode(0x24C9);const HeapDetailsRowDimension={ROOT:{},STACK_FRAME:{label:'Stack frame',symbol:LATIN_SMALL_LETTER_F_WITH_HOOK,color:'heap_dump_stack_frame'},OBJECT_TYPE:{label:'Object type',symbol:CIRCLED_LATIN_CAPITAL_LETTER_T,color:'heap_dump_object_type'}};function HeapDetailsTitleColumn(title){tr.ui.analysis.TitleColumn.call(this,title);}
-HeapDetailsTitleColumn.prototype={__proto__:tr.ui.analysis.TitleColumn.prototype,formatTitle(row){if(row.dimension===HeapDetailsRowDimension.ROOT){return row.title;}
-const symbolEl=document.createElement('span');Polymer.dom(symbolEl).textContent=row.dimension.symbol;symbolEl.title=row.dimension.label;symbolEl.style.color=tr.b.ColorScheme.getColorForReservedNameAsString(row.dimension.color);symbolEl.style.paddingRight='4px';symbolEl.style.cursor='help';symbolEl.style.fontWeight='bold';const titleEl=document.createElement('span');Polymer.dom(titleEl).appendChild(symbolEl);Polymer.dom(titleEl).appendChild(document.createTextNode(row.title));return titleEl;}};function AllocationCountColumn(name,cellPath,aggregationMode){tr.ui.analysis.DetailsNumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
-AllocationCountColumn.prototype={__proto__:tr.ui.analysis.DetailsNumericMemoryColumn.prototype,getFormattingContext(unit){return{minimumFractionDigits:0};}};const HEAP_DETAILS_COLUMN_RULES=[{condition:'Size',importance:2,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Count',importance:1,columnConstructor:AllocationCountColumn},{importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn}];return{HeapDetailsRowDimension,HeapDetailsTitleColumn,AllocationCountColumn,HEAP_DETAILS_COLUMN_RULES,};});'use strict';tr.exportTo('tr.ui.analysis',function(){const RebuildableBehavior={rebuild(){if(!this.paneDirty_){return;}
-this.paneDirty_=false;this.onRebuild_();},scheduleRebuild_(){if(this.paneDirty_)return;this.paneDirty_=true;tr.b.requestAnimationFrame(this.rebuild.bind(this));},onRebuild_(){}};return{RebuildableBehavior,};});'use strict';Polymer({is:'tr-ui-b-tab-view',properties:{label_:{type:String,value:()=>''},selectedSubView_:Object,subViews_:{type:Array,value:()=>[]},tabsHidden:{type:Boolean,value:false,observer:'tabsHiddenChanged_'}},ready(){this.$.tabs.addEventListener('keydown',this.onKeyDown_.bind(this),true);this.updateFocusability_();},set label(newLabel){this.set('label_',newLabel);},get tabs(){return this.get('subViews_');},get selectedSubView(){return this.selectedSubView_;},set selectedSubView(subView){if(subView===this.selectedSubView_)return;if(this.selectedSubView_){Polymer.dom(this.$.subView).removeChild(this.selectedSubView_);const oldInput=this.root.getElementById(this.computeRadioId_(this.selectedSubView_));if(oldInput){oldInput.checked=false;}}
-this.set('selectedSubView_',subView);if(subView){Polymer.dom(this.$.subView).appendChild(subView);const newInput=this.root.getElementById(this.computeRadioId_(subView));if(newInput){newInput.checked=true;}}
-this.fire('selected-tab-change');},clearSubViews(){this.splice('subViews_',0,this.subViews_.length);this.selectedSubView=undefined;this.updateFocusability_();},addSubView(subView){this.push('subViews_',subView);if(!this.selectedSubView_)this.selectedSubView=subView;this.updateFocusability_();},get subViews(){return this.subViews_;},resetSubViews(subViews){this.splice('subViews_',0,this.subViews_.length);if(subViews.length){for(const subView of subViews){this.push('subViews_',subView);}
-this.selectedSubView=subViews[0];}else{this.selectedSubView=undefined;}
-this.updateFocusability_();},onTabChanged_(event){this.selectedSubView=event.model.item;},isChecked_(subView){return this.selectedSubView_===subView;},tabsHiddenChanged_(){this.updateFocusability_();},onKeyDown_(e){if(this.tabsHidden)return;let keyHandled=false;switch(e.keyCode){case 37:keyHandled=this.selectPreviousTabIfPossible();break;case 39:keyHandled=this.selectNextTabIfPossible();break;}
-if(!keyHandled)return;e.stopPropagation();e.preventDefault();},selectNextTabIfPossible(){return this.selectTabByOffsetIfPossible_(1);},selectPreviousTabIfPossible(){return this.selectTabByOffsetIfPossible_(-1);},selectTabByOffsetIfPossible_(offset){if(!this.selectedSubView_)return false;const currentIndex=this.subViews_.indexOf(this.selectedSubView_);const newSubView=this.tabs[currentIndex+offset];if(!newSubView)return false;this.selectedSubView=newSubView;return true;},shouldBeFocusable_(){return!this.tabsHidden&&this.subViews_.length>0;},updateFocusability_(){if(this.shouldBeFocusable_()){Polymer.dom(this.$.tabs).setAttribute('tabindex',0);}else{Polymer.dom(this.$.tabs).removeAttribute('tabindex');}},computeRadioId_(subView){return subView.tagName+'-'+subView.tabLabel.replace(/ /g,'-');}});'use strict';tr.exportTo('tr.ui.analysis',function(){const RESONABLE_NUMBER_OF_ROWS=200;const TabUiState={NO_LONG_TAIL:0,HIDING_LONG_TAIL:1,SHOWING_LONG_TAIL:2,};function EmptyFillerColumn(){}
-EmptyFillerColumn.prototype={title:'',value(){return'';},};Polymer({is:'tr-ui-a-memory-dump-heap-details-breakdown-view',behaviors:[tr.ui.analysis.RebuildableBehavior],created(){this.displayedNode_=undefined;this.dimensionToTab_=new Map();},ready(){this.scheduleRebuild_();this.root.addEventListener('keydown',this.onKeyDown_.bind(this),true);},get displayedNode(){return this.displayedNode_;},set displayedNode(node){this.displayedNode_=node;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;for(const tab of this.$.tabs.tabs){tab.aggregationMode=aggregationMode;}},onRebuild_(){const previouslySelectedTab=this.$.tabs.selectedSubView;let previouslySelectedTabFocused=false;let previouslySelectedDimension=undefined;if(previouslySelectedTab){previouslySelectedTabFocused=previouslySelectedTab.isFocused;previouslySelectedDimension=previouslySelectedTab.dimension;}
-for(const tab of this.$.tabs.tabs){tab.nodes=undefined;}
-this.$.tabs.clearSubViews();if(this.displayedNode_===undefined){this.$.tabs.label='No heap node provided.';return;}
-for(const[dimension,children]of this.displayedNode_.childNodes){if(!this.dimensionToTab_.has(dimension)){this.dimensionToTab_.set(dimension,document.createElement('tr-ui-a-memory-dump-heap-details-breakdown-view-tab'));}
-const tab=this.dimensionToTab_.get(dimension);tab.aggregationMode=this.aggregationMode_;tab.dimension=dimension;tab.nodes=children;this.$.tabs.addSubView(tab);tab.rebuild();if(dimension===previouslySelectedDimension){this.$.tabs.selectedSubView=tab;if(previouslySelectedTabFocused){tab.focus();}}}
-if(this.$.tabs.tabs.length>0){this.$.tabs.label='Break selected node further by:';}else{this.$.tabs.label='Selected node cannot be broken down any further.';}},onKeyDown_(keyEvent){if(!this.displayedNode_)return;let keyHandled=false;switch(keyEvent.keyCode){case 8:{if(!this.displayedNode_.parentNode)break;const viewEvent=new tr.b.Event('enter-node',true);viewEvent.node=this.displayedNode_.parentNode;this.dispatchEvent(viewEvent);keyHandled=true;break;}
-case 37:case 39:{const wasFocused=this.$.tabs.selectedSubView.isFocused;keyHandled=keyEvent.keyCode===37?this.$.tabs.selectPreviousTabIfPossible():this.$.tabs.selectNextTabIfPossible();if(wasFocused&&keyHandled){this.$.tabs.selectedSubView.focus();}}}
-if(!keyHandled)return;keyEvent.stopPropagation();keyEvent.preventDefault();}});Polymer({is:'tr-ui-a-memory-dump-heap-details-breakdown-view-tab',behaviors:[tr.ui.analysis.RebuildableBehavior],created(){this.dimension_=undefined;this.nodes_=undefined;this.aggregationMode_=undefined;this.displayLongTail_=false;},ready(){this.$.table.addEventListener('step-into',function(tableEvent){const viewEvent=new tr.b.Event('enter-node',true);viewEvent.node=tableEvent.tableRow;this.dispatchEvent(viewEvent);}.bind(this));},get displayLongTail(){return this.displayLongTail_;},set displayLongTail(newValue){if(this.displayLongTail===newValue)return;this.displayLongTail_=newValue;this.scheduleRebuild_();},get dimension(){return this.dimension_;},set dimension(dimension){this.dimension_=dimension;this.scheduleRebuild_();},get nodes(){return this.nodes_;},set nodes(nodes){this.nodes_=nodes;this.scheduleRebuild_();},get nodes(){return this.nodes_||[];},get dimensionLabel_(){if(this.dimension_===undefined)return'(undefined)';return this.dimension_.label;},get tabLabel(){let nodeCount=0;if(this.nodes_){nodeCount=this.nodes_.length;}
-return this.dimensionLabel_+' ('+nodeCount+')';},get tabIcon(){if(this.dimension_===undefined||this.dimension_===tr.ui.analysis.HeapDetailsRowDimension.ROOT){return undefined;}
-return{text:this.dimension_.symbol,style:'color: '+tr.b.ColorScheme.getColorForReservedNameAsString(this.dimension_.color)+';'};},get aggregationMode(){return this.aggregationMode_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},focus(){this.$.table.focus();},blur(){this.$.table.blur();},get isFocused(){return this.$.table.isFocused;},onRebuild_(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.emptyValue='Cannot break down by '+
-this.dimensionLabel_.toLowerCase()+' any further.';const[state,rows]=this.getRows_();const total=this.nodes.length;const displayed=rows.length;const hidden=total-displayed;this.updateInfoBar_(state,[total,displayed,hidden]);this.$.table.tableRows=rows;this.$.table.tableColumns=this.createColumns_(rows);if(this.$.table.sortColumnIndex===undefined){this.$.table.sortColumnIndex=0;this.$.table.sortDescending=false;}
-this.$.table.rebuild();},createColumns_(rows){const titleColumn=new tr.ui.analysis.HeapDetailsTitleColumn(this.dimensionLabel_);titleColumn.width='400px';const numericColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'cells',aggregationMode:this.aggregationMode_,rules:tr.ui.analysis.HEAP_DETAILS_COLUMN_RULES,shouldSetContextGroup:true});if(numericColumns.length===0){numericColumns.push(new EmptyFillerColumn());}
-tr.ui.analysis.MemoryColumn.spaceEqually(numericColumns);const columns=[titleColumn].concat(numericColumns);return columns;},getRows_(){let rows=this.nodes;if(rows.length<=RESONABLE_NUMBER_OF_ROWS){return[TabUiState.NO_LONG_TAIL,rows];}else if(this.displayLongTail){return[TabUiState.SHOWING_LONG_TAIL,rows];}
-const absSize=row=>Math.max(row.cells.Size.fields[0].value);rows.sort((a,b)=>absSize(b)-absSize(a));rows=rows.slice(0,RESONABLE_NUMBER_OF_ROWS);return[TabUiState.HIDING_LONG_TAIL,rows];},updateInfoBar_(state,rowStats){if(state===TabUiState.SHOWING_LONG_TAIL){this.longTailVisibleInfoBar_(rowStats);}else if(state===TabUiState.HIDING_LONG_TAIL){this.longTailHiddenInfoBar_(rowStats);}else{this.hideInfoBar_();}},longTailVisibleInfoBar_(rowStats){const[total,visible,hidden]=rowStats;const couldHide=total-RESONABLE_NUMBER_OF_ROWS;this.$.info.message='Showing '+total+' rows. This may be slow.';this.$.info.removeAllButtons();const buttonText='Hide '+couldHide+' rows.';this.$.info.addButton(buttonText,()=>this.displayLongTail=false);this.$.info.visible=true;},longTailHiddenInfoBar_(rowStats){const[total,visible,hidden]=rowStats;this.$.info.message='Hiding the smallest '+hidden+' rows.';this.$.info.removeAllButtons();this.$.info.addButton('Show all.',()=>this.displayLongTail=true);this.$.info.visible=true;},hideInfoBar_(){this.$.info.visible=false;},});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS=String.fromCharCode(0x21B3);function HeapDetailsPathColumn(title){tr.ui.analysis.HeapDetailsTitleColumn.call(this,title);}
-HeapDetailsPathColumn.prototype={__proto__:tr.ui.analysis.HeapDetailsTitleColumn.prototype,formatTitle(row){const title=tr.ui.analysis.HeapDetailsTitleColumn.prototype.formatTitle.call(this,row);if(row.dimension===tr.ui.analysis.HeapDetailsRowDimension.ROOT){return title;}
-const arrowEl=document.createElement('span');Polymer.dom(arrowEl).textContent=DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS;arrowEl.style.paddingRight='2px';arrowEl.style.fontWeight='bold';arrowEl.style.color=tr.b.ColorScheme.getColorForReservedNameAsString('heap_dump_child_node_arrow');const rowEl=document.createElement('span');Polymer.dom(rowEl).appendChild(arrowEl);Polymer.dom(rowEl).appendChild(tr.ui.b.asHTMLOrTextNode(title));return rowEl;}};Polymer({is:'tr-ui-a-memory-dump-heap-details-path-view',behaviors:[tr.ui.analysis.RebuildableBehavior],created(){this.selectedNode_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.addEventListener('selection-changed',function(event){this.selectedNode_=this.$.table.selectedTableRow;this.didSelectedNodeChange_();}.bind(this));},didSelectedNodeChange_(){this.dispatchEvent(new tr.b.Event('selected-node-changed'));},get selectedNode(){return this.selectedNode_;},set selectedNode(node){this.selectedNode_=node;this.didSelectedNodeChange_();this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},onRebuild_(){if(this.selectedNode_===undefined){this.$.table.clear();return;}
-if(this.$.table.tableRows.includes(this.selectedNode_)){this.$.table.selectedTableRow=this.selectedNode_;return;}
-this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.userCanModifySortOrder=false;const rows=this.createRows_(this.selectedNode_);this.$.table.tableRows=rows;this.$.table.tableColumns=this.createColumns_(rows);this.$.table.selectedTableRow=rows[rows.length-1];},createRows_(node){const rows=[];while(node){rows.push(node);node=node.parentNode;}
-rows.reverse();return rows;},createColumns_(rows){const titleColumn=new HeapDetailsPathColumn('Current path');titleColumn.width='200px';const numericColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'cells',aggregationMode:this.aggregationMode_,rules:tr.ui.analysis.HEAP_DETAILS_COLUMN_RULES,shouldSetContextGroup:true});tr.ui.analysis.MemoryColumn.spaceEqually(numericColumns);return[titleColumn].concat(numericColumns);}});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const StackedPaneImpl={set childPaneBuilder(childPaneBuilder){this.childPaneBuilder_=childPaneBuilder;this.dispatchEvent(new tr.b.Event('request-child-pane-change'));},get childPaneBuilder(){return this.childPaneBuilder_;},appended(){this.rebuild();}};const StackedPane=[tr.ui.analysis.RebuildableBehavior,StackedPaneImpl];return{StackedPane,};});Polymer({is:'tr-ui-a-stacked-pane',behaviors:[tr.ui.analysis.StackedPane]});'use strict';tr.exportTo('tr.ui.analysis',function(){const Scalar=tr.b.Scalar;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const count_smallerIsBetter=tr.b.Unit.byName.count_smallerIsBetter;const MultiDimensionalViewBuilder=tr.b.MultiDimensionalViewBuilder;const TotalState=tr.b.MultiDimensionalViewNode.TotalState;function HeapDumpTreeNode(stackFrameNodes,dimension,title,heavyView,parentNode){this.dimension=dimension;this.title=title;this.parentNode=parentNode;this.heavyView_=heavyView;this.stackFrameNodes_=stackFrameNodes;this.lazyCells_=undefined;this.lazyChildNodes_=undefined;}
-HeapDumpTreeNode.prototype={get minDisplayedTotalState_(){if(this.heavyView_){return TotalState.LOWER_BOUND;}
-return TotalState.EXACT;},get childNodes(){if(!this.lazyChildNodes_){this.lazyChildNodes_=new Map();this.addDimensionChildNodes_(tr.ui.analysis.HeapDetailsRowDimension.STACK_FRAME,0);this.addDimensionChildNodes_(tr.ui.analysis.HeapDetailsRowDimension.OBJECT_TYPE,1);this.releaseStackFrameNodesIfPossible_();}
-return this.lazyChildNodes_;},get cells(){if(!this.lazyCells_){this.addCells_();this.releaseStackFrameNodesIfPossible_();}
-return this.lazyCells_;},releaseStackFrameNodesIfPossible_(){if(this.lazyCells_&&this.lazyChildNodes_){this.stackFrameNodes_=undefined;}},addDimensionChildNodes_(dimension,dimensionIndex){const dimensionChildTitleToStackFrameNodes=tr.b.invertArrayOfDicts(this.stackFrameNodes_,node=>this.convertStackFrameNodeDimensionToChildDict_(node,dimensionIndex));const dimensionChildNodes=[];for(const[childTitle,childStackFrameNodes]of
-Object.entries(dimensionChildTitleToStackFrameNodes)){dimensionChildNodes.push(new HeapDumpTreeNode(childStackFrameNodes,dimension,childTitle,this.heavyView_,this));}
-this.lazyChildNodes_.set(dimension,dimensionChildNodes);},convertStackFrameNodeDimensionToChildDict_(stackFrameNode,dimensionIndex){const childDict={};let displayedChildrenTotalSize=0;let displayedChildrenTotalCount=0;let hasDisplayedChildren=false;let allDisplayedChildrenHaveDisplayedCounts=true;for(const child of stackFrameNode.children[dimensionIndex].values()){if(child.values[0].totalState<this.minDisplayedTotalState_){continue;}
-if(child.values[1].totalState<this.minDisplayedTotalState_){allDisplayedChildrenHaveDisplayedCounts=false;}
-childDict[child.title[dimensionIndex]]=child;displayedChildrenTotalSize+=child.values[0].total;displayedChildrenTotalCount+=child.values[1].total;hasDisplayedChildren=true;}
-const nodeTotalSize=stackFrameNode.values[0].total;const nodeTotalCount=stackFrameNode.values[1].total;const hasUnclassifiedSizeOrCount=displayedChildrenTotalSize<nodeTotalSize||displayedChildrenTotalCount<nodeTotalCount;if(!this.heavyView_&&hasUnclassifiedSizeOrCount&&hasDisplayedChildren){const otherTitle=stackFrameNode.title.slice();otherTitle[dimensionIndex]='<other>';const otherNode=new tr.b.MultiDimensionalViewNode(otherTitle,2);childDict[otherTitle[dimensionIndex]]=otherNode;otherNode.values[0].total=nodeTotalSize-displayedChildrenTotalSize;otherNode.values[0].totalState=this.minDisplayedTotalState_;otherNode.values[1].total=nodeTotalCount-displayedChildrenTotalCount;otherNode.values[1].totalState=allDisplayedChildrenHaveDisplayedCounts?this.minDisplayedTotalState_:TotalState.NOT_PROVIDED;}
-return childDict;},addCells_(){this.lazyCells_=tr.ui.analysis.createCells(this.stackFrameNodes_,function(stackFrameNode){const size=stackFrameNode.values[0].total;const numerics={'Size':new Scalar(sizeInBytes_smallerIsBetter,size)};const countValue=stackFrameNode.values[1];if(countValue.totalState>=this.minDisplayedTotalState_){const count=countValue.total;numerics.Count=new Scalar(count_smallerIsBetter,count);}
-return numerics;},this);}};Polymer({is:'tr-ui-a-memory-dump-heap-details-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.heapDumps_=undefined;this.viewMode_=undefined;this.aggregationMode_=undefined;this.cachedBuilders_=new Map();},ready(){this.$.info_bar.message='Note: Values displayed in the heavy view '+'are lower bounds (except for the root).';Polymer.dom(this.$.view_mode_container).appendChild(tr.ui.b.createSelector(this,'viewMode','memoryDumpHeapDetailsPane.viewMode',MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW,[{label:'Top-down (Tree)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW},{label:'Top-down (Heavy)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW},{label:'Bottom-up (Heavy)',value:MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW}]));this.$.drag_handle.target=this.$.path_view;this.$.drag_handle.horizontal=false;this.$.path_view.addEventListener('selected-node-changed',(function(e){this.$.breakdown_view.displayedNode=this.$.path_view.selectedNode;}).bind(this));this.$.breakdown_view.addEventListener('enter-node',(function(e){this.$.path_view.selectedNode=e.node;}).bind(this));},set heapDumps(heapDumps){this.heapDumps_=heapDumps;this.scheduleRebuild_();},get heapDumps(){return this.heapDumps_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.$.path_view.aggregationMode=aggregationMode;this.$.breakdown_view.aggregationMode=aggregationMode;},get aggregationMode(){return this.aggregationMode_;},set viewMode(viewMode){this.viewMode_=viewMode;this.scheduleRebuild_();},get viewMode(){return this.viewMode_;},get heavyView(){switch(this.viewMode){case MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW:case MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW:return true;default:return false;}},onRebuild_(){if(this.heapDumps_===undefined||this.heapDumps_.length===0){this.$.info_text.style.display='block';this.$.split_view.style.display='none';this.$.view_mode_container.style.display='none';this.$.info_bar.hidden=true;this.$.path_view.selectedNode=undefined;return;}
-this.$.info_text.style.display='none';this.$.split_view.style.display='flex';this.$.view_mode_container.style.display='block';this.$.info_bar.hidden=!this.heavyView;this.$.path_view.selectedNode=this.createHeapTree_();this.$.path_view.rebuild();this.$.breakdown_view.rebuild();},createHeapTree_(){const definedHeapDump=this.heapDumps_.find(x=>x);if(definedHeapDump===undefined)return undefined;const rootRowTitle=definedHeapDump.allocatorName;const stackFrameTrees=this.createStackFrameTrees_(this.heapDumps_);return new HeapDumpTreeNode(stackFrameTrees,tr.ui.analysis.HeapDetailsRowDimension.ROOT,rootRowTitle,this.heavyView);},createStackFrameTrees_(heapDumps){const builders=heapDumps.map(heapDump=>this.createBuilder_(heapDump));const views=builders.map(builder=>{if(builder===undefined)return undefined;return builder.buildView(this.viewMode);});return views;},createBuilder_(heapDump){if(heapDump===undefined)return undefined;if(this.cachedBuilders_.has(heapDump)){return this.cachedBuilders_.get(heapDump);}
-const dimensions=2;const valueCount=2;const builder=new MultiDimensionalViewBuilder(dimensions,valueCount);for(const entry of heapDump.entries){const leafStackFrame=entry.leafStackFrame;const stackTracePath=leafStackFrame===undefined?[]:leafStackFrame.getUserFriendlyStackTrace().reverse();const objectTypeName=entry.objectTypeName;const objectTypeNamePath=objectTypeName===undefined?[]:[objectTypeName];const valueKind=entry.valuesAreTotals?MultiDimensionalViewBuilder.ValueKind.TOTAL:MultiDimensionalViewBuilder.ValueKind.SELF;builder.addPath([stackTracePath,objectTypeNamePath],[entry.size,entry.count],valueKind);}
-builder.complete=heapDump.isComplete;this.cachedBuilders_.set(heapDump,builder);return builder;},});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const URL_TO_SIZE_VS_EFFECTIVE_SIZE='https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra/README.md#effective_size-vs_size';const SUBALLOCATION_CONTEXT=true;const MemoryAllocatorDumpInfoType=tr.model.MemoryAllocatorDumpInfoType;const PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN;const PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER;const LEFTWARDS_OPEN_HEADED_ARROW=String.fromCharCode(0x21FD);const RIGHTWARDS_OPEN_HEADED_ARROW=String.fromCharCode(0x21FE);const EN_DASH=String.fromCharCode(0x2013);const CIRCLED_LATIN_SMALL_LETTER_I=String.fromCharCode(0x24D8);function AllocatorDumpNameColumn(){tr.ui.analysis.TitleColumn.call(this,'Component');}
-AllocatorDumpNameColumn.prototype={__proto__:tr.ui.analysis.TitleColumn.prototype,formatTitle(row){if(!row.suballocation){return row.title;}
-return tr.ui.b.createSpan({textContent:row.title,italic:true,tooltip:row.fullNames===undefined?undefined:row.fullNames.join(', ')});}};function getAndUpdateEntry(map,name,createdCallback){let entry=map.get(name);if(entry===undefined){entry={count:0};createdCallback(entry);map.set(name,entry);}
-entry.count++;return entry;}
-function SizeInfoMessageBuilder(){this.parts_=[];this.indent_=0;}
-SizeInfoMessageBuilder.prototype={append(){this.parts_.push.apply(this.parts_,Array.prototype.slice.apply(arguments));},appendMap(map,hasPluralSuffix,emptyText,itemCallback,opt_this){opt_this=opt_this||this;if(map.size===0){if(emptyText){this.append(emptyText);}}else if(map.size===1){this.parts_.push(' ');const key=map.keys().next().value;itemCallback.call(opt_this,key,map.get(key));}else{if(hasPluralSuffix){this.parts_.push('s');}
-this.parts_.push(':');this.indent_++;for(const key of map.keys()){this.parts_.push('\n',' '.repeat(3*(this.indent_-1)),' - ');itemCallback.call(opt_this,key,map.get(key));}
-this.indent_--;}},appendImportanceRange(range){this.append(' (importance: ');if(range.min===range.max){this.append(range.min);}else{this.append(range.min,EN_DASH,range.max);}
-this.append(')');},appendSizeIfDefined(size){if(size!==undefined){this.append(' (',tr.b.Unit.byName.sizeInBytes.format(size),')');}},appendSomeTimestampsQuantifier(){this.append(' ',tr.ui.analysis.MemoryColumn.SOME_TIMESTAMPS_INFO_QUANTIFIER);},build(){return this.parts_.join('');}};function EffectiveSizeColumn(name,cellPath,aggregationMode){tr.ui.analysis.DetailsNumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
-EffectiveSizeColumn.prototype={__proto__:tr.ui.analysis.DetailsNumericMemoryColumn.prototype,get title(){return tr.ui.b.createLink({textContent:this.name,tooltip:'Memory used by this component',href:URL_TO_SIZE_VS_EFFECTIVE_SIZE});},addInfos(numerics,memoryAllocatorDumps,infos){if(memoryAllocatorDumps===undefined)return;const ownerNameToEntry=new Map();const ownedNameToEntry=new Map();for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;const dump=memoryAllocatorDumps[i];if(dump===SUBALLOCATION_CONTEXT){return;}
-dump.ownedBy.forEach(function(ownerLink){const ownerDump=ownerLink.source;this.getAndUpdateOwnershipEntry_(ownerNameToEntry,ownerDump,ownerLink);},this);const ownedLink=dump.owns;if(ownedLink!==undefined){const ownedDump=ownedLink.target;const ownedEntry=this.getAndUpdateOwnershipEntry_(ownedNameToEntry,ownedDump,ownedLink,true);const sharerNameToEntry=ownedEntry.sharerNameToEntry;ownedDump.ownedBy.forEach(function(sharerLink){const sharerDump=sharerLink.source;if(sharerDump===dump)return;this.getAndUpdateOwnershipEntry_(sharerNameToEntry,sharerDump,sharerLink);},this);}}
-if(ownerNameToEntry.size>0){const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('shared by');messageBuilder.appendMap(ownerNameToEntry,false,undefined,function(ownerName,ownerEntry){messageBuilder.append(ownerName);if(ownerEntry.count<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}
-messageBuilder.appendImportanceRange(ownerEntry.importanceRange);},this);infos.push({message:messageBuilder.build(),icon:LEFTWARDS_OPEN_HEADED_ARROW,color:'green'});}
-if(ownedNameToEntry.size>0){const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('shares');messageBuilder.appendMap(ownedNameToEntry,false,undefined,function(ownedName,ownedEntry){messageBuilder.append(ownedName);const ownedCount=ownedEntry.count;if(ownedCount<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}
-messageBuilder.appendImportanceRange(ownedEntry.importanceRange);messageBuilder.append(' with');messageBuilder.appendMap(ownedEntry.sharerNameToEntry,false,' no other dumps',function(sharerName,sharerEntry){messageBuilder.append(sharerName);if(sharerEntry.count<ownedCount){messageBuilder.appendSomeTimestampsQuantifier();}
-messageBuilder.appendImportanceRange(sharerEntry.importanceRange);},this);},this);infos.push({message:messageBuilder.build(),icon:RIGHTWARDS_OPEN_HEADED_ARROW,color:'green'});}},getAndUpdateOwnershipEntry_(map,dump,link,opt_withSharerNameToEntry){const entry=getAndUpdateEntry(map,dump.quantifiedName,function(newEntry){newEntry.importanceRange=new tr.b.math.Range();if(opt_withSharerNameToEntry){newEntry.sharerNameToEntry=new Map();}});entry.importanceRange.addValue(link.importance||0);return entry;}};function SizeColumn(name,cellPath,aggregationMode){tr.ui.analysis.DetailsNumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
-SizeColumn.prototype={__proto__:tr.ui.analysis.DetailsNumericMemoryColumn.prototype,get title(){return tr.ui.b.createLink({textContent:this.name,tooltip:'Memory requested by this component',href:URL_TO_SIZE_VS_EFFECTIVE_SIZE});},addInfos(numerics,memoryAllocatorDumps,infos){if(memoryAllocatorDumps===undefined)return;this.addOverlapInfo_(numerics,memoryAllocatorDumps,infos);this.addProvidedSizeWarningInfos_(numerics,memoryAllocatorDumps,infos);},addOverlapInfo_(numerics,memoryAllocatorDumps,infos){const siblingNameToEntry=new Map();for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;const dump=memoryAllocatorDumps[i];if(dump===SUBALLOCATION_CONTEXT){return;}
-const ownedBySiblingSizes=dump.ownedBySiblingSizes;for(const siblingDump of ownedBySiblingSizes.keys()){const siblingName=siblingDump.name;getAndUpdateEntry(siblingNameToEntry,siblingName,function(newEntry){if(numerics.length===1){newEntry.size=ownedBySiblingSizes.get(siblingDump);}});}}
-if(siblingNameToEntry.size>0){const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('overlaps with its sibling');messageBuilder.appendMap(siblingNameToEntry,true,undefined,function(siblingName,siblingEntry){messageBuilder.append('\'',siblingName,'\'');messageBuilder.appendSizeIfDefined(siblingEntry.size);if(siblingEntry.count<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}},this);infos.push({message:messageBuilder.build(),icon:CIRCLED_LATIN_SMALL_LETTER_I,color:'blue'});}},addProvidedSizeWarningInfos_(numerics,memoryAllocatorDumps,infos){const infoTypeToEntry=new Map();for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;const dump=memoryAllocatorDumps[i];if(dump===SUBALLOCATION_CONTEXT){return;}
-dump.infos.forEach(function(dumpInfo){getAndUpdateEntry(infoTypeToEntry,dumpInfo.type,function(newEntry){if(numerics.length===1){newEntry.providedSize=dumpInfo.providedSize;newEntry.dependencySize=dumpInfo.dependencySize;}});});}
-for(const infoType of infoTypeToEntry.keys()){const entry=infoTypeToEntry.get(infoType);const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('provided size');messageBuilder.appendSizeIfDefined(entry.providedSize);let dependencyName;switch(infoType){case PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN:dependencyName='the aggregated size of the children';break;case PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER:dependencyName='the size of the largest owner';break;default:dependencyName='an unknown dependency';break;}
-messageBuilder.append(' was less than ',dependencyName);messageBuilder.appendSizeIfDefined(entry.dependencySize);if(entry.count<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}
-infos.push(tr.ui.analysis.createWarningInfo(messageBuilder.build()));}}};const NUMERIC_COLUMN_RULES=[{condition:tr.model.MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME,importance:10,columnConstructor:EffectiveSizeColumn},{condition:tr.model.MemoryAllocatorDump.SIZE_NUMERIC_NAME,importance:9,columnConstructor:SizeColumn},{condition:'page_size',importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:/size/,importance:5,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn}];const DIAGNOSTIC_COLUMN_RULES=[{importance:0,columnConstructor:tr.ui.analysis.StringMemoryColumn}];Polymer({is:'tr-ui-a-memory-dump-allocator-details-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.memoryAllocatorDumps_=undefined;this.heapDumps_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;},set memoryAllocatorDumps(memoryAllocatorDumps){this.memoryAllocatorDumps_=memoryAllocatorDumps;this.scheduleRebuild_();},get memoryAllocatorDumps(){return this.memoryAllocatorDumps_;},set heapDumps(heapDumps){this.heapDumps_=heapDumps;this.scheduleRebuild_();},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},onRebuild_(){if(this.memoryAllocatorDumps_===undefined||this.memoryAllocatorDumps_.length===0){this.$.info_text.style.display='block';this.$.table.style.display='none';this.$.table.clear();this.$.table.rebuild();this.childPaneBuilder=undefined;return;}
-this.$.info_text.style.display='none';this.$.table.style.display='block';const rows=this.createRows_();const columns=this.createColumns_(rows);rows.forEach(function(rootRow){tr.ui.analysis.aggregateTableRowCellsRecursively(rootRow,columns,function(contexts){return contexts!==undefined&&contexts.some(function(context){return context===SUBALLOCATION_CONTEXT;});});});this.$.table.tableRows=rows;this.$.table.tableColumns=columns;this.$.table.rebuild();tr.ui.analysis.expandTableRowsRecursively(this.$.table);if(this.heapDumps_===undefined){this.childPaneBuilder=undefined;}else{this.childPaneBuilder=function(){const pane=document.createElement('tr-ui-a-memory-dump-heap-details-pane');pane.heapDumps=this.heapDumps_;pane.aggregationMode=this.aggregationMode_;return pane;}.bind(this);}},createRows_(){return[this.createAllocatorRowRecursively_(this.memoryAllocatorDumps_)];},createAllocatorRowRecursively_(dumps){const definedDump=dumps.find(x=>x);const title=definedDump.name;const fullName=definedDump.fullName;const numericCells=tr.ui.analysis.createCells(dumps,function(dump){return dump.numerics;});const diagnosticCells=tr.ui.analysis.createCells(dumps,function(dump){return dump.diagnostics;});let suballocatedBy=undefined;if(title.startsWith('__')){for(let i=0;i<dumps.length;i++){const dump=dumps[i];if(dump===undefined||dump.ownedBy.length===0){continue;}
-const ownerDump=dump.ownedBy[0].source;if(dump.ownedBy.length>1||dump.children.length>0||ownerDump.containerMemoryDump!==dump.containerMemoryDump){suballocatedBy=undefined;break;}
-if(suballocatedBy===undefined){suballocatedBy=ownerDump.fullName;}else if(suballocatedBy!==ownerDump.fullName){suballocatedBy=undefined;break;}}}
-const row={title,fullNames:[fullName],contexts:dumps,numericCells,diagnosticCells,suballocatedBy};const childDumpNameToDumps=tr.b.invertArrayOfDicts(dumps,function(dump){const results={};for(const child of dump.children){results[child.name]=child;}
-return results;});const subRows=[];let suballocationClassificationRootNode=undefined;for(const childDumps of Object.values(childDumpNameToDumps)){const childRow=this.createAllocatorRowRecursively_(childDumps);if(childRow.suballocatedBy===undefined){subRows.push(childRow);}else{suballocationClassificationRootNode=this.classifySuballocationRow_(childRow,suballocationClassificationRootNode);}}
-if(suballocationClassificationRootNode!==undefined){const suballocationRow=this.createSuballocationRowRecursively_('suballocations',suballocationClassificationRootNode);subRows.push(suballocationRow);}
-if(subRows.length>0){row.subRows=subRows;}
-return row;},classifySuballocationRow_(suballocationRow,rootNode){if(rootNode===undefined){rootNode={children:{},row:undefined};}
-const suballocationLevels=suballocationRow.suballocatedBy.split('/');let currentNode=rootNode;for(let i=0;i<suballocationLevels.length;i++){const suballocationLevel=suballocationLevels[i];let nextNode=currentNode.children[suballocationLevel];if(nextNode===undefined){currentNode.children[suballocationLevel]=nextNode={children:{},row:undefined};}
-currentNode=nextNode;}
-const existingRow=currentNode.row;if(existingRow!==undefined){for(let i=0;i<suballocationRow.contexts.length;i++){const newContext=suballocationRow.contexts[i];if(newContext===undefined)continue;if(existingRow.contexts[i]!==undefined){throw new Error('Multiple suballocations with the same owner name');}
-existingRow.contexts[i]=newContext;['numericCells','diagnosticCells'].forEach(function(cellKey){const suballocationCells=suballocationRow[cellKey];if(suballocationCells===undefined)return;for(const[cellName,cell]of Object.entries(suballocationCells)){if(cell===undefined)continue;const fields=cell.fields;if(fields===undefined)continue;const field=fields[i];if(field===undefined)continue;let existingCells=existingRow[cellKey];if(existingCells===undefined){existingCells={};existingRow[cellKey]=existingCells;}
-let existingCell=existingCells[cellName];if(existingCell===undefined){existingCell=new tr.ui.analysis.MemoryCell(new Array(fields.length));existingCells[cellName]=existingCell;}
-existingCell.fields[i]=field;}});}
-existingRow.fullNames.push.apply(existingRow.fullNames,suballocationRow.fullNames);}else{currentNode.row=suballocationRow;}
-return rootNode;},createSuballocationRowRecursively_(name,node){const childCount=Object.keys(node.children).length;if(childCount===0){if(node.row===undefined){throw new Error('Suballocation node must have a row or children');}
-const row=node.row;row.title=name;row.suballocation=true;return row;}
-const subRows=[];for(const[subName,subNode]of Object.entries(node.children)){subRows.push(this.createSuballocationRowRecursively_(subName,subNode));}
-if(node.row!==undefined){const row=node.row;row.title='<unspecified>';row.suballocation=true;subRows.unshift(row);}
-const contexts=new Array(subRows[0].contexts.length);for(let i=0;i<subRows.length;i++){subRows[i].contexts.forEach(function(subContext,index){if(subContext!==undefined){contexts[index]=SUBALLOCATION_CONTEXT;}});}
-return{title:name,suballocation:true,contexts,subRows};},createColumns_(rows){const titleColumn=new AllocatorDumpNameColumn();titleColumn.width='200px';const numericColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'numericCells',aggregationMode:this.aggregationMode_,rules:NUMERIC_COLUMN_RULES});const diagnosticColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'diagnosticCells',aggregationMode:this.aggregationMode_,rules:DIAGNOSTIC_COLUMN_RULES});const fieldColumns=numericColumns.concat(diagnosticColumns);tr.ui.analysis.MemoryColumn.spaceEqually(fieldColumns);const columns=[titleColumn].concat(fieldColumns);return columns;}});return{SUBALLOCATION_CONTEXT,AllocatorDumpNameColumn,EffectiveSizeColumn,SizeColumn,};});'use strict';tr.exportTo('tr.ui.analysis',function(){const Scalar=tr.b.Scalar;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const CONSTANT_COLUMN_RULES=[{condition:'Start address',importance:0,columnConstructor:tr.ui.analysis.StringMemoryColumn}];const VARIABLE_COLUMN_RULES=[{condition:'Virtual size',importance:7,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Protection flags',importance:6,columnConstructor:tr.ui.analysis.StringMemoryColumn},{condition:'PSS',importance:5,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Private dirty',importance:4,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Private clean',importance:3,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Shared dirty',importance:2,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Shared clean',importance:1,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Swapped',importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn}];const BYTE_STAT_COLUMN_MAP={'proportionalResident':'PSS','privateDirtyResident':'Private dirty','privateCleanResident':'Private clean','sharedDirtyResident':'Shared dirty','sharedCleanResident':'Shared clean','swapped':'Swapped'};function hexString(address,is64BitAddress){if(address===undefined)return undefined;const hexPadding=is64BitAddress?'0000000000000000':'00000000';return(hexPadding+address.toString(16)).substr(-hexPadding.length);}
-function pruneEmptyRuleRows(row){if(row.subRows===undefined||row.subRows.length===0)return;if(row.subRows[0].rule===undefined){return;}
-row.subRows.forEach(pruneEmptyRuleRows);row.subRows=row.subRows.filter(function(subRow){return subRow.subRows.length>0;});}
-Polymer({is:'tr-ui-a-memory-dump-vm-regions-details-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.vmRegions_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;},set vmRegions(vmRegions){this.vmRegions_=vmRegions;this.scheduleRebuild_();},get vmRegions(){return this.vmRegions_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},onRebuild_(){if(this.vmRegions_===undefined||this.vmRegions_.length===0){this.$.info_text.style.display='block';this.$.table.style.display='none';this.$.table.clear();this.$.table.rebuild();return;}
-this.$.info_text.style.display='none';this.$.table.style.display='block';const rows=this.createRows_(this.vmRegions_);const columns=this.createColumns_(rows);this.$.table.tableRows=rows;this.$.table.tableColumns=columns;this.$.table.rebuild();tr.ui.analysis.expandTableRowsRecursively(this.$.table);},createRows_(timeToVmRegionTree){const is64BitAddress=timeToVmRegionTree.some(function(vmRegionTree){if(vmRegionTree===undefined)return false;return vmRegionTree.someRegion(function(region){if(region.startAddress===undefined)return false;return region.startAddress>=4294967296;});});return[this.createClassificationNodeRow(timeToVmRegionTree,is64BitAddress)];},createClassificationNodeRow(timeToNode,is64BitAddress){const definedNode=timeToNode.find(x=>x);const childNodeIdToTimeToNode=Object.values(tr.b.invertArrayOfDicts(timeToNode,function(node){const children=node.children;if(children===undefined)return undefined;const childMap={};children.forEach(function(childNode){if(!childNode.hasRegions)return;childMap[childNode.title]=childNode;});return childMap;}));const childNodeSubRows=childNodeIdToTimeToNode.map(function(timeToChildNode){return this.createClassificationNodeRow(timeToChildNode,is64BitAddress);},this);const regionIdToTimeToRegion=Object.values(tr.b.invertArrayOfDicts(timeToNode,function(node){const regions=node.regions;if(regions===undefined)return undefined;const results={};for(const region of regions){results[region.uniqueIdWithinProcess]=region;}
-return results;}));const regionSubRows=regionIdToTimeToRegion.map(function(timeToRegion){return this.createRegionRow_(timeToRegion,is64BitAddress);},this);const subRows=childNodeSubRows.concat(regionSubRows);return{title:definedNode.title,contexts:timeToNode,variableCells:this.createVariableCells_(timeToNode),subRows};},createRegionRow_(timeToRegion,is64BitAddress){const definedRegion=timeToRegion.find(x=>x);return{title:definedRegion.mappedFile,contexts:timeToRegion,constantCells:this.createConstantCells_(definedRegion,is64BitAddress),variableCells:this.createVariableCells_(timeToRegion)};},createConstantCells_(definedRegion,is64BitAddress){return tr.ui.analysis.createCells([definedRegion],function(region){const startAddress=region.startAddress;if(startAddress===undefined)return undefined;return{'Start address':hexString(startAddress,is64BitAddress)};});},createVariableCells_(timeToRegion){return tr.ui.analysis.createCells(timeToRegion,function(region){const fields={};const sizeInBytes=region.sizeInBytes;if(sizeInBytes!==undefined){fields['Virtual size']=new Scalar(sizeInBytes_smallerIsBetter,sizeInBytes);}
-const protectionFlags=region.protectionFlagsToString;if(protectionFlags!==undefined){fields['Protection flags']=protectionFlags;}
-for(const[byteStatName,columnName]of
-Object.entries(BYTE_STAT_COLUMN_MAP)){const byteStat=region.byteStats[byteStatName];if(byteStat===undefined)continue;fields[columnName]=new Scalar(sizeInBytes_smallerIsBetter,byteStat);}
-return fields;});},createColumns_(rows){const titleColumn=new tr.ui.analysis.TitleColumn('Mapped file');titleColumn.width='200px';const constantColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'constantCells',aggregationMode:undefined,rules:CONSTANT_COLUMN_RULES});const variableColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'variableCells',aggregationMode:this.aggregationMode_,rules:VARIABLE_COLUMN_RULES});const fieldColumns=constantColumns.concat(variableColumns);tr.ui.analysis.MemoryColumn.spaceEqually(fieldColumns);const columns=[titleColumn].concat(fieldColumns);return columns;}});return{};});'use strict';Polymer({is:'tr-ui-b-color-legend',ready(){const blackSquareCharCode=9632;this.$.square.innerText=String.fromCharCode(blackSquareCharCode);this.label_=undefined;this.compoundEventSelectionState_=tr.model.CompoundEventSelectionState.NOT_SELECTED;},set compoundEventSelectionState(compoundEventSelectionState){this.compoundEventSelectionState_=compoundEventSelectionState;},get label(){return this.label_;},set label(label){if(label===undefined){this.setLabelAndColorId(undefined,undefined);return;}
-const colorId=tr.b.ColorScheme.getColorIdForGeneralPurposeString(label);this.setLabelAndColorId(label,colorId);},setLabelAndColorId(label,colorId){this.label_=label;Polymer.dom(this.$.label).textContent='';Polymer.dom(this.$.label).appendChild(tr.ui.b.asHTMLOrTextNode(label));if(colorId===undefined){this.$.square.style.color='initial';}else{this.$.square.style.color=tr.b.ColorScheme.colorsAsStrings[colorId];}}});'use strict';Polymer({is:'tr-ui-b-view-specific-brushing-state',get viewId(){return this.getAttribute('view-id');},set viewId(viewId){Polymer.dom(this).setAttribute('view-id',viewId);},get(){const viewId=this.viewId;if(!viewId){throw new Error('Element must have a view-id attribute!');}
-const brushingStateController=tr.c.BrushingStateController.getControllerForElement(this);if(!brushingStateController)return undefined;return brushingStateController.getViewSpecificBrushingState(viewId);},set(state){const viewId=this.viewId;if(!viewId){throw new Error('Element must have a view-id attribute!');}
-const brushingStateController=tr.c.BrushingStateController.getControllerForElement(this);if(!brushingStateController)return;brushingStateController.changeViewSpecificBrushingState(viewId,state);}});'use strict';tr.exportTo('tr.ui.analysis',function(){const MemoryColumnColorScheme=tr.b.MemoryColumnColorScheme;const Scalar=tr.b.Scalar;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const PLATFORM_SPECIFIC_TOTAL_NAME_SUFFIX='_bytes';const DISPLAYED_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME;const SOME_TIMESTAMPS_INFO_QUANTIFIER=tr.ui.analysis.MemoryColumn.SOME_TIMESTAMPS_INFO_QUANTIFIER;const RIGHTWARDS_ARROW_WITH_HOOK=String.fromCharCode(0x21AA);const RIGHTWARDS_ARROW_FROM_BAR=String.fromCharCode(0x21A6);const GREATER_THAN_OR_EQUAL_TO=String.fromCharCode(0x2265);const UNMARRIED_PARTNERSHIP_SYMBOL=String.fromCharCode(0x26AF);const TRIGRAM_FOR_HEAVEN=String.fromCharCode(0x2630);function lazyMap(list,fn,opt_this){opt_this=opt_this||this;let result=undefined;list.forEach(function(item,index){const value=fn.call(opt_this,item,index);if(value===undefined)return;if(result===undefined){result=new Array(list.length);}
-result[index]=value;});return result;}
-function ProcessNameColumn(){tr.ui.analysis.TitleColumn.call(this,'Process');}
-ProcessNameColumn.prototype={__proto__:tr.ui.analysis.TitleColumn.prototype,formatTitle(row){if(row.contexts===undefined){return row.title;}
-const titleEl=document.createElement('tr-ui-b-color-legend');titleEl.label=row.title;return titleEl;}};function UsedMemoryColumn(name,cellPath,aggregationMode){tr.ui.analysis.NumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
-UsedMemoryColumn.COLOR=MemoryColumnColorScheme.getColor('used_memory_column').toString();UsedMemoryColumn.OLDER_COLOR=MemoryColumnColorScheme.getColor('older_used_memory_column').toString();UsedMemoryColumn.prototype={__proto__:tr.ui.analysis.NumericMemoryColumn.prototype,get title(){return tr.ui.b.createSpan({textContent:this.name,color:UsedMemoryColumn.COLOR});},getFormattingContext(unit){return{unitPrefix:tr.b.UnitPrefixScale.BINARY.MEBI};},color(numerics,processMemoryDumps){return UsedMemoryColumn.COLOR;},getChildPaneBuilder(processMemoryDumps){if(processMemoryDumps===undefined)return undefined;const vmRegions=lazyMap(processMemoryDumps,function(pmd){if(pmd===undefined)return undefined;return pmd.mostRecentVmRegions;});if(vmRegions===undefined)return undefined;return function(){const pane=document.createElement('tr-ui-a-memory-dump-vm-regions-details-pane');pane.vmRegions=vmRegions;pane.aggregationMode=this.aggregationMode;return pane;}.bind(this);}};function PeakMemoryColumn(name,cellPath,aggregationMode){UsedMemoryColumn.call(this,name,cellPath,aggregationMode);}
-PeakMemoryColumn.prototype={__proto__:UsedMemoryColumn.prototype,addInfos(numerics,processMemoryDumps,infos){if(processMemoryDumps===undefined)return;let resettableValueCount=0;let nonResettableValueCount=0;for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;if(processMemoryDumps[i].arePeakResidentBytesResettable){resettableValueCount++;}else{nonResettableValueCount++;}}
-if(resettableValueCount>0&&nonResettableValueCount>0){infos.push(tr.ui.analysis.createWarningInfo('Both resettable and '+'non-resettable peak RSS values were provided by the process'));}else if(resettableValueCount>0){infos.push({icon:RIGHTWARDS_ARROW_WITH_HOOK,message:'Peak RSS since previous memory dump.'});}else{infos.push({icon:RIGHTWARDS_ARROW_FROM_BAR,message:'Peak RSS since process startup. Finer grained '+'peaks require a Linux kernel version '+
-GREATER_THAN_OR_EQUAL_TO+' 4.0.'});}}};function ByteStatColumn(name,cellPath,aggregationMode){UsedMemoryColumn.call(this,name,cellPath,aggregationMode);}
-ByteStatColumn.prototype={__proto__:UsedMemoryColumn.prototype,color(numerics,processMemoryDumps){if(processMemoryDumps===undefined){return UsedMemoryColumn.COLOR;}
-const allOlderValues=processMemoryDumps.every(function(processMemoryDump){if(processMemoryDump===undefined)return true;return!processMemoryDump.hasOwnVmRegions;});if(allOlderValues){return UsedMemoryColumn.OLDER_COLOR;}
-return UsedMemoryColumn.COLOR;},addInfos(numerics,processMemoryDumps,infos){if(processMemoryDumps===undefined)return;let olderValueCount=0;for(let i=0;i<numerics.length;i++){const processMemoryDump=processMemoryDumps[i];if(processMemoryDump!==undefined&&!processMemoryDump.hasOwnVmRegions){olderValueCount++;}}
-if(olderValueCount===0){return;}
-const infoQuantifier=olderValueCount<numerics.length?' '+SOME_TIMESTAMPS_INFO_QUANTIFIER:'';infos.push({message:'Older value'+infoQuantifier+' (only heavy (purple) memory dumps contain memory maps).',icon:UNMARRIED_PARTNERSHIP_SYMBOL});}};UsedMemoryColumn.RULES=[{condition:'Total resident',importance:10,columnConstructor:UsedMemoryColumn},{condition:'Peak total resident',importance:9,columnConstructor:PeakMemoryColumn},{condition:'PSS',importance:8,columnConstructor:ByteStatColumn},{condition:'Private dirty',importance:7,columnConstructor:ByteStatColumn},{condition:'Swapped',importance:6,columnConstructor:ByteStatColumn},{importance:0,columnConstructor:UsedMemoryColumn}];UsedMemoryColumn.TOTALS_MAP={'residentBytes':'Total resident','peakResidentBytes':'Peak total resident','privateFootprintBytes':'Private footprint',};UsedMemoryColumn.PLATFORM_SPECIFIC_TOTALS_MAP={'vm':'Total virtual','swp':'Swapped','pc':'Private clean','pd':'Private dirty','sc':'Shared clean','sd':'Shared dirty','gpu_egl':'GPU EGL','gpu_egl_pss':'GPU EGL PSS','gpu_gl':'GPU GL','gpu_gl_pss':'GPU GL PSS','gpu_etc':'GPU Other','gpu_etc_pss':'GPU Other PSS',};UsedMemoryColumn.BYTE_STAT_MAP={'proportionalResident':'PSS','privateDirtyResident':'Private dirty','swapped':'Swapped'};function AllocatorColumn(name,cellPath,aggregationMode){tr.ui.analysis.NumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
-AllocatorColumn.prototype={__proto__:tr.ui.analysis.NumericMemoryColumn.prototype,get title(){const titleEl=document.createElement('tr-ui-b-color-legend');titleEl.label=this.name;return titleEl;},getFormattingContext(unit){return{unitPrefix:tr.b.UnitPrefixScale.BINARY.MEBI};},addInfos(numerics,processMemoryDumps,infos){if(processMemoryDumps===undefined)return;let heapDumpCount=0;let missingSizeCount=0;for(let i=0;i<processMemoryDumps.length;i++){const processMemoryDump=processMemoryDumps[i];if(processMemoryDump===undefined)continue;const heapDumps=processMemoryDump.heapDumps;if(heapDumps!==undefined&&heapDumps[this.name]!==undefined){heapDumpCount++;}
-const allocatorDump=processMemoryDump.getMemoryAllocatorDumpByFullName(this.name);if(allocatorDump!==undefined&&allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME]===undefined){missingSizeCount++;}}
-if(heapDumpCount>0){const infoQuantifier=heapDumpCount<numerics.length?' '+SOME_TIMESTAMPS_INFO_QUANTIFIER:'';infos.push({message:'Heap dump provided'+infoQuantifier+'.',icon:TRIGRAM_FOR_HEAVEN});}
-if(missingSizeCount>0){const infoQuantifier=missingSizeCount<numerics.length?' '+SOME_TIMESTAMPS_INFO_QUANTIFIER:'';infos.push(tr.ui.analysis.createWarningInfo('Size was not provided'+infoQuantifier+'.'));}},getChildPaneBuilder(processMemoryDumps){if(processMemoryDumps===undefined)return undefined;const memoryAllocatorDumps=lazyMap(processMemoryDumps,function(pmd){if(pmd===undefined)return undefined;return pmd.getMemoryAllocatorDumpByFullName(this.name);},this);if(memoryAllocatorDumps===undefined)return undefined;const heapDumps=lazyMap(processMemoryDumps,function(pmd){if(pmd===undefined||pmd.heapDumps===undefined)return undefined;return pmd.heapDumps[this.name];},this);return function(){const pane=document.createElement('tr-ui-a-memory-dump-allocator-details-pane');pane.memoryAllocatorDumps=memoryAllocatorDumps;pane.heapDumps=heapDumps;pane.aggregationMode=this.aggregationMode;return pane;}.bind(this);}};function TracingColumn(name,cellPath,aggregationMode){AllocatorColumn.call(this,name,cellPath,aggregationMode);}
-TracingColumn.COLOR=MemoryColumnColorScheme.getColor('tracing_memory_column').toString();TracingColumn.prototype={__proto__:AllocatorColumn.prototype,get title(){return tr.ui.b.createSpan({textContent:this.name,color:TracingColumn.COLOR});},color(numerics,processMemoryDumps){return TracingColumn.COLOR;}};AllocatorColumn.RULES=[{condition:'tracing',importance:0,columnConstructor:TracingColumn},{importance:1,columnConstructor:AllocatorColumn}];Polymer({is:'tr-ui-a-memory-dump-overview-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.processMemoryDumps_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.CELL;this.$.table.addEventListener('selection-changed',function(tableEvent){tableEvent.stopPropagation();this.changeChildPane_();}.bind(this));},set processMemoryDumps(processMemoryDumps){this.processMemoryDumps_=processMemoryDumps;this.scheduleRebuild_();},get processMemoryDumps(){return this.processMemoryDumps_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},get selectedMemoryCell(){if(this.processMemoryDumps_===undefined||this.processMemoryDumps_.length===0){return undefined;}
-const selectedTableRow=this.$.table.selectedTableRow;if(!selectedTableRow)return undefined;const selectedColumnIndex=this.$.table.selectedColumnIndex;if(selectedColumnIndex===undefined)return undefined;const selectedColumn=this.$.table.tableColumns[selectedColumnIndex];const selectedMemoryCell=selectedColumn.cell(selectedTableRow);return selectedMemoryCell;},changeChildPane_(){this.storeSelection_();this.childPaneBuilder=this.determineChildPaneBuilderFromSelection_();},determineChildPaneBuilderFromSelection_(){if(this.processMemoryDumps_===undefined||this.processMemoryDumps_.length===0){return undefined;}
-const selectedTableRow=this.$.table.selectedTableRow;if(!selectedTableRow)return undefined;const selectedColumnIndex=this.$.table.selectedColumnIndex;if(selectedColumnIndex===undefined)return undefined;const selectedColumn=this.$.table.tableColumns[selectedColumnIndex];return selectedColumn.getChildPaneBuilder(selectedTableRow.contexts);},onRebuild_(){if(this.processMemoryDumps_===undefined||this.processMemoryDumps_.length===0){this.$.info_text.style.display='block';this.$.table.style.display='none';this.$.table.clear();this.$.table.rebuild();return;}
-this.$.info_text.style.display='none';this.$.table.style.display='block';const rows=this.createRows_();const columns=this.createColumns_(rows);const footerRows=this.createFooterRows_(rows,columns);this.$.table.tableRows=rows;this.$.table.footerRows=footerRows;this.$.table.tableColumns=columns;this.$.table.rebuild();this.restoreSelection_();},createRows_(){const timeToPidToProcessMemoryDump=this.processMemoryDumps_;const pidToTimeToProcessMemoryDump=tr.b.invertArrayOfDicts(timeToPidToProcessMemoryDump);const rows=[];for(const[pid,timeToDump]of
-Object.entries(pidToTimeToProcessMemoryDump)){const process=timeToDump.find(x=>x).process;const usedMemoryCells=tr.ui.analysis.createCells(timeToDump,function(dump){const sizes={};const totals=dump.totals;if(totals!==undefined){for(const[totalName,cellName]of
-Object.entries(UsedMemoryColumn.TOTALS_MAP)){const total=totals[totalName];if(total===undefined)continue;sizes[cellName]=new Scalar(sizeInBytes_smallerIsBetter,total);}
-const platformSpecific=totals.platformSpecific;if(platformSpecific!==undefined){for(const[name,size]of Object.entries(platformSpecific)){let newName=name;if(UsedMemoryColumn.PLATFORM_SPECIFIC_TOTALS_MAP[name]===undefined){if(name.endsWith(PLATFORM_SPECIFIC_TOTAL_NAME_SUFFIX)){newName=name.substring(0,name.length-
-PLATFORM_SPECIFIC_TOTAL_NAME_SUFFIX.length);}
-newName=newName.replace('_',' ').trim();newName=newName.charAt(0).toUpperCase()+newName.slice(1);}else{newName=UsedMemoryColumn.PLATFORM_SPECIFIC_TOTALS_MAP[name];}
-sizes[newName]=new Scalar(sizeInBytes_smallerIsBetter,size);}}}
-const vmRegions=dump.mostRecentVmRegions;if(vmRegions!==undefined){for(const[byteStatName,cellName]of
-Object.entries(UsedMemoryColumn.BYTE_STAT_MAP)){const byteStat=vmRegions.byteStats[byteStatName];if(byteStat===undefined)continue;sizes[cellName]=new Scalar(sizeInBytes_smallerIsBetter,byteStat);}}
-return sizes;});const allocatorCells=tr.ui.analysis.createCells(timeToDump,function(dump){const memoryAllocatorDumps=dump.memoryAllocatorDumps;if(memoryAllocatorDumps===undefined)return undefined;const sizes={};memoryAllocatorDumps.forEach(function(allocatorDump){let rootDisplayedSizeNumeric=allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME];if(rootDisplayedSizeNumeric===undefined){rootDisplayedSizeNumeric=new Scalar(sizeInBytes_smallerIsBetter,0);}
-sizes[allocatorDump.fullName]=rootDisplayedSizeNumeric;});return sizes;});rows.push({title:process.userFriendlyName,contexts:timeToDump,usedMemoryCells,allocatorCells});}
-return rows;},createFooterRows_(rows,columns){if(rows.length<=1)return[];const totalRow={title:'Total'};tr.ui.analysis.aggregateTableRowCells(totalRow,rows,columns);return[totalRow];},createColumns_(rows){const titleColumn=new ProcessNameColumn();titleColumn.width='200px';const usedMemorySizeColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'usedMemoryCells',aggregationMode:this.aggregationMode_,rules:UsedMemoryColumn.RULES});const allocatorSizeColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'allocatorCells',aggregationMode:this.aggregationMode_,rules:AllocatorColumn.RULES});const sizeColumns=usedMemorySizeColumns.concat(allocatorSizeColumns);tr.ui.analysis.MemoryColumn.spaceEqually(sizeColumns);const columns=[titleColumn].concat(sizeColumns);return columns;},storeSelection_(){let selectedRowTitle;const selectedRow=this.$.table.selectedTableRow;if(selectedRow!==undefined){selectedRowTitle=selectedRow.title;}
-let selectedColumnName;const selectedColumnIndex=this.$.table.selectedColumnIndex;if(selectedColumnIndex!==undefined){const selectedColumn=this.$.table.tableColumns[selectedColumnIndex];selectedColumnName=selectedColumn.name;}
-this.$.state.set({rowTitle:selectedRowTitle,columnName:selectedColumnName});},restoreSelection_(){const settings=this.$.state.get();if(settings===undefined||settings.rowTitle===undefined||settings.columnName===undefined){return;}
-const selectedColumnIndex=this.$.table.tableColumns.findIndex(col=>col.name===settings.columnName);if(selectedColumnIndex===-1)return;const selectedRowTitle=settings.rowTitle;const selectedRow=this.$.table.tableRows.find(row=>row.title===selectedRowTitle);if(selectedRow===undefined)return;this.$.table.selectedTableRow=selectedRow;this.$.table.selectedColumnIndex=selectedColumnIndex;}});return{ProcessNameColumn,UsedMemoryColumn,PeakMemoryColumn,ByteStatColumn,AllocatorColumn,TracingColumn,};});'use strict';tr.exportTo('tr.ui.analysis',function(){Polymer({is:'tr-ui-a-memory-dump-header-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.containerMemoryDumps_=undefined;},ready(){Polymer.dom(this.$.aggregation_mode_container).appendChild(tr.ui.b.createSelector(this,'aggregationMode','memoryDumpHeaderPane.aggregationMode',tr.ui.analysis.MemoryColumn.AggregationMode.DIFF,[{label:'Diff',value:tr.ui.analysis.MemoryColumn.AggregationMode.DIFF},{label:'Max',value:tr.ui.analysis.MemoryColumn.AggregationMode.MAX}]));},set containerMemoryDumps(containerMemoryDumps){this.containerMemoryDumps_=containerMemoryDumps;this.scheduleRebuild_();},get containerMemoryDumps(){return this.containerMemoryDumps_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},onRebuild_(){this.updateLabel_();this.updateAggregationModeSelector_();this.changeChildPane_();},updateLabel_(){Polymer.dom(this.$.label).textContent='';if(this.containerMemoryDumps_===undefined||this.containerMemoryDumps_.length<=0){Polymer.dom(this.$.label).textContent='No memory dumps selected';return;}
-const containerDumpCount=this.containerMemoryDumps_.length;const isMultiSelection=containerDumpCount>1;Polymer.dom(this.$.label).appendChild(document.createTextNode('Selected '+containerDumpCount+' memory dump'+
-(isMultiSelection?'s':'')+' in '+this.containerMemoryDumps_[0].containerName+' at '));Polymer.dom(this.$.label).appendChild(document.createTextNode(tr.b.Unit.byName.timeStampInMs.format(this.containerMemoryDumps_[0].start)));if(isMultiSelection){const ELLIPSIS=String.fromCharCode(8230);Polymer.dom(this.$.label).appendChild(document.createTextNode(ELLIPSIS));Polymer.dom(this.$.label).appendChild(document.createTextNode(tr.b.Unit.byName.timeStampInMs.format(this.containerMemoryDumps_[containerDumpCount-1].start)));}},updateAggregationModeSelector_(){let displayStyle;if(this.containerMemoryDumps_===undefined||this.containerMemoryDumps_.length<=1){displayStyle='none';}else{displayStyle='initial';}
-this.$.aggregation_mode_container.style.display=displayStyle;},changeChildPane_(){this.childPaneBuilder=function(){if(this.containerMemoryDumps_===undefined||this.containerMemoryDumps_.length<=0){return undefined;}
-const overviewPane=document.createElement('tr-ui-a-memory-dump-overview-pane');overviewPane.processMemoryDumps=this.containerMemoryDumps_.map(function(containerDump){return containerDump.processMemoryDumps;});overviewPane.aggregationMode=this.aggregationMode;return overviewPane;}.bind(this);}});return{};});'use strict';Polymer({is:'tr-ui-a-stacked-pane-view',setPaneBuilder(paneBuilder,opt_parentPane){const paneContainer=this.$.pane_container;if(opt_parentPane){if(!(opt_parentPane instanceof HTMLElement)){throw new Error('Parent pane must be an HTML element');}
-if(opt_parentPane.parentElement!==paneContainer){throw new Error('Parent pane must be a child of the pane container');}}
-while(Polymer.dom(paneContainer).lastElementChild!==null&&Polymer.dom(paneContainer).lastElementChild!==opt_parentPane){const removedPane=Polymer.dom(this.$.pane_container).lastElementChild;const listener=this.listeners_.get(removedPane);if(listener===undefined){throw new Error('No listener associated with pane');}
-this.listeners_.delete(removedPane);removedPane.removeEventListener('request-child-pane-change',listener);Polymer.dom(paneContainer).removeChild(removedPane);}
-if(opt_parentPane&&opt_parentPane.parentElement!==paneContainer){throw new Error('Parent pane was removed from the pane container');}
-if(!paneBuilder)return;const pane=paneBuilder();if(!pane)return;if(!(pane instanceof HTMLElement)){throw new Error('Pane must be an HTML element');}
-const listener=function(event){this.setPaneBuilder(pane.childPaneBuilder,pane);}.bind(this);if(!this.listeners_){this.listeners_=new WeakMap();}
-this.listeners_.set(pane,listener);pane.addEventListener('request-child-pane-change',listener);Polymer.dom(paneContainer).appendChild(pane);pane.appended();},rebuild(){let currentPane=Polymer.dom(this.$.pane_container).firstElementChild;while(currentPane){currentPane.rebuild();currentPane=currentPane.nextElementSibling;}},get panesForTesting(){const panes=[];let currentChild=Polymer.dom(this.$.pane_container).firstElementChild;while(currentChild){panes.push(currentChild);currentChild=currentChild.nextElementSibling;}
-return panes;}});'use strict';tr.exportTo('tr.ui.analysis',function(){Polymer({is:'tr-ui-a-container-memory-dump-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],set selection(selection){if(selection===undefined){this.currentSelection_=undefined;this.dumpsByContainerName_=undefined;this.updateContents_();return;}
-selection.forEach(function(event){if(!(event instanceof tr.model.ContainerMemoryDump)){throw new Error('Memory dump sub-view only supports container memory dumps');}});this.currentSelection_=selection;this.dumpsByContainerName_=tr.b.groupIntoMap(this.currentSelection_.toArray(),dump=>dump.containerName);for(const dumps of this.dumpsByContainerName_.values()){dumps.sort((a,b)=>a.start-b.start);}
-this.updateContents_();},get selection(){return this.currentSelection_;},get requiresTallView(){return true;},updateContents_(){Polymer.dom(this.$.content).textContent='';if(this.dumpsByContainerName_===undefined)return;const containerNames=Array.from(this.dumpsByContainerName_.keys());if(containerNames.length===0)return;if(containerNames.length>1){this.buildViewForMultipleContainerNames_();}else{this.buildViewForSingleContainerName_();}},buildViewForSingleContainerName_(){const containerMemoryDumps=tr.b.getFirstElement(this.dumpsByContainerName_.values());const dumpView=unwrap(this.ownerDocument).createElement('tr-ui-a-stacked-pane-view');Polymer.dom(this.$.content).appendChild(dumpView);dumpView.setPaneBuilder(function(){const headerPane=document.createElement('tr-ui-a-memory-dump-header-pane');headerPane.containerMemoryDumps=containerMemoryDumps;return headerPane;});},buildViewForMultipleContainerNames_(){const ownerDocument=this.ownerDocument;const rows=[];for(const[containerName,dumps]of this.dumpsByContainerName_){rows.push({containerName,subRows:dumps,isExpanded:true,});}
-rows.sort(function(a,b){return a.containerName.localeCompare(b.containerName);});const columns=[{title:'Dump',value(row){if(row.subRows===undefined){return this.singleDumpValue_(row);}
-return this.groupedDumpValue_(row);},singleDumpValue_(row){const linkEl=unwrap(ownerDocument).createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet([row]));Polymer.dom(linkEl).appendChild(tr.v.ui.createScalarSpan(row.start,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument}));return linkEl;},groupedDumpValue_(row){const linkEl=unwrap(ownerDocument).createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet(row.subRows));Polymer.dom(linkEl).appendChild(tr.ui.b.createSpan({ownerDocument,textContent:row.subRows.length+' memory dump'+
-(row.subRows.length===1?'':'s')+' in '}));Polymer.dom(linkEl).appendChild(tr.ui.b.createSpan({ownerDocument,textContent:row.containerName,bold:true}));return linkEl;}}];const table=unwrap(this.ownerDocument).createElement('tr-ui-b-table');table.tableColumns=columns;table.tableRows=rows;table.showHeader=false;table.rebuild();Polymer.dom(this.$.content).appendChild(table);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.GlobalMemoryDump,{multi:false,title:'Global Memory Dump',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.GlobalMemoryDump,{multi:true,title:'Global Memory Dumps',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.ProcessMemoryDump,{multi:false,title:'Process Memory Dump',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.ProcessMemoryDump,{multi:true,title:'Process Memory Dumps',});return{};});'use strict';(function(){const COUNTER_SAMPLE_TABLE_COLUMNS=[{title:'Counter',width:'150px',value(row){return row.counter;}},{title:'Series',width:'150px',value(row){return row.series;}},{title:'Time',width:'150px',value(row){return row.start;}},{title:'Value',width:'100%',value(row){return row.value;}}];Polymer({is:'tr-ui-a-counter-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;this.$.table.tableColumns=COUNTER_SAMPLE_TABLE_COLUMNS;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},updateContents_(){this.$.table.tableRows=this.selection?this.getRows_(this.selection.toArray()):[];this.$.table.rebuild();},getRows_(samples){const samplesByCounter=tr.b.groupIntoMap(samples,sample=>sample.series.counter.guid);const rows=[];for(const counterSamples of samplesByCounter.values()){const samplesBySeries=tr.b.groupIntoMap(counterSamples,sample=>sample.series.guid);for(const seriesSamples of samplesBySeries.values()){const seriesRows=this.getRowsForSamples_(seriesSamples);seriesRows[0].counter=seriesSamples[0].series.counter.name;seriesRows[0].series=seriesSamples[0].series.name;if(seriesRows.length>1){seriesRows[0].subRows=seriesRows.slice(1);seriesRows[0].isExpanded=true;}
-rows.push(seriesRows[0]);}}
-return rows;},getRowsForSamples_(samples){return samples.map(function(sample){return{start:sample.timestamp,value:sample.value};});}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-counter-sample-sub-view',tr.model.CounterSample,{multi:false,title:'Counter Sample',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-counter-sample-sub-view',tr.model.CounterSample,{multi:true,title:'Counter Samples',});})();'use strict';tr.exportTo('tr.ui.analysis',function(){function MultiEventSummary(title,events){this.title=title;this.duration_=undefined;this.selfTime_=undefined;this.events_=events;this.cpuTimesComputed_=false;this.cpuSelfTime_=undefined;this.cpuDuration_=undefined;this.maxDuration_=undefined;this.maxCpuDuration_=undefined;this.maxSelfTime_=undefined;this.maxCpuSelfTime_=undefined;this.untotallableArgs_=[];this.totalledArgs_=undefined;}
-MultiEventSummary.prototype={set title(title){if(title==='Totals'){this.totalsRow=true;}
-this.title_=title;},get title(){return this.title_;},get duration(){if(this.duration_===undefined){this.duration_=tr.b.math.Statistics.sum(this.events_,function(event){return event.duration;});}
-return this.duration_;},get cpuSelfTime(){this.computeCpuTimesIfNeeded_();return this.cpuSelfTime_;},get cpuDuration(){this.computeCpuTimesIfNeeded_();return this.cpuDuration_;},computeCpuTimesIfNeeded_(){if(this.cpuTimesComputed_)return;this.cpuTimesComputed_=true;let cpuSelfTime=0;let cpuDuration=0;let hasCpuData=false;for(const event of this.events_){if(event.cpuDuration!==undefined){cpuDuration+=event.cpuDuration;hasCpuData=true;}
-if(event.cpuSelfTime!==undefined){cpuSelfTime+=event.cpuSelfTime;hasCpuData=true;}}
-if(hasCpuData){this.cpuDuration_=cpuDuration;this.cpuSelfTime_=cpuSelfTime;}},get selfTime(){if(this.selfTime_===undefined){this.selfTime_=0;for(const event of this.events_){if(event.selfTime!==undefined){this.selfTime_+=event.selfTime;}}}
-return this.selfTime_;},get events(){return this.events_;},get numEvents(){return this.events_.length;},get numAlerts(){if(this.numAlerts_===undefined){this.numAlerts_=tr.b.math.Statistics.sum(this.events_,event=>event.associatedAlerts.length);}
-return this.numAlerts_;},get untotallableArgs(){this.updateArgsIfNeeded_();return this.untotallableArgs_;},get totalledArgs(){this.updateArgsIfNeeded_();return this.totalledArgs_;},get maxDuration(){if(this.maxDuration_===undefined){this.maxDuration_=tr.b.math.Statistics.max(this.events_,function(event){return event.duration;});}
-return this.maxDuration_;},get maxCpuDuration(){if(this.maxCpuDuration_===undefined){this.maxCpuDuration_=tr.b.math.Statistics.max(this.events_,function(event){return event.cpuDuration;});}
-return this.maxCpuDuration_;},get maxSelfTime(){if(this.maxSelfTime_===undefined){this.maxSelfTime_=tr.b.math.Statistics.max(this.events_,function(event){return event.selfTime;});}
-return this.maxSelfTime_;},get maxCpuSelfTime(){if(this.maxCpuSelfTime_===undefined){this.maxCpuSelfTime_=tr.b.math.Statistics.max(this.events_,function(event){return event.cpuSelfTime;});}
-return this.maxCpuSelfTime_;},updateArgsIfNeeded_(){if(this.totalledArgs_!==undefined)return;const untotallableArgs={};const totalledArgs={};for(const event of this.events_){for(const argName in event.args){const argVal=event.args[argName];const type=typeof argVal;if(type!=='number'){untotallableArgs[argName]=true;delete totalledArgs[argName];continue;}
-if(untotallableArgs[argName]){continue;}
-if(totalledArgs[argName]===undefined){totalledArgs[argName]=0;}
-totalledArgs[argName]+=argVal;}}
-this.untotallableArgs_=Object.keys(untotallableArgs);this.totalledArgs_=totalledArgs;}};return{MultiEventSummary,};});'use strict';Polymer({is:'tr-ui-a-multi-event-summary-table',ready(){this.showTotals_=false;this.eventsHaveDuration_=true;this.eventsHaveSubRows_=true;this.eventsByTitle_=undefined;},updateTableColumns_(rows,maxValues){let hasCpuData=false;let hasAlerts=false;rows.forEach(function(row){if(row.cpuDuration!==undefined){hasCpuData=true;}
-if(row.cpuSelfTime!==undefined){hasCpuData=true;}
-if(row.numAlerts){hasAlerts=true;}});const ownerDocument=this.ownerDocument;const columns=[];columns.push({title:'Name',value(row){if(row.title==='Totals')return'Totals';const container=document.createElement('div');const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(row.events);},row.title);container.appendChild(linkEl);if(tr.isExported('tr-ui-e-chrome-codesearch')){const link=document.createElement('tr-ui-e-chrome-codesearch');link.searchPhrase=row.title;container.appendChild(link);}
-return container;},width:'350px',cmp(rowA,rowB){return rowA.title.localeCompare(rowB.title);}});if(this.eventsHaveDuration_){columns.push({title:'Wall Duration',value(row){return tr.v.ui.createScalarSpan(row.duration,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.duration),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.duration-rowB.duration;}});}
-if(this.eventsHaveDuration_&&hasCpuData){columns.push({title:'CPU Duration',value(row){return tr.v.ui.createScalarSpan(row.cpuDuration,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.cpuDuration),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.cpuDuration-rowB.cpuDuration;}});}
-if(this.eventsHaveSubRows_&&this.eventsHaveDuration_){columns.push({title:'Self time',value(row){return tr.v.ui.createScalarSpan(row.selfTime,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.selfTime),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.selfTime-rowB.selfTime;}});}
-if(this.eventsHaveSubRows_&&this.eventsHaveDuration_&&hasCpuData){columns.push({title:'CPU Self Time',value(row){return tr.v.ui.createScalarSpan(row.cpuSelfTime,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.cpuSelfTime),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.cpuSelfTime-rowB.cpuSelfTime;}});}
-if(this.eventsHaveDuration_){columns.push({title:'Average '+(hasCpuData?'CPU':'Wall')+' Duration',value(row){const totalDuration=hasCpuData?row.cpuDuration:row.duration;return tr.v.ui.createScalarSpan(totalDuration/row.numEvents,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.duration),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){if(hasCpuData){return rowA.cpuDuration/rowA.numEvents-
-rowB.cpuDuration/rowB.numEvents;}
-return rowA.duration/rowA.numEvents-
-rowB.duration/rowB.numEvents;}});}
-columns.push({title:'Occurrences',value(row){return row.numEvents;},width:'<upated further down>',cmp(rowA,rowB){return rowA.numEvents-rowB.numEvents;}});let alertsColumnIndex;if(hasAlerts){columns.push({title:'Num Alerts',value(row){return row.numAlerts;},width:'<upated further down>',cmp(rowA,rowB){return rowA.numAlerts-rowB.numAlerts;}});alertsColumnIndex=columns.length-1;}
-let colWidthPercentage;if(columns.length===1){colWidthPercentage='100%';}else{colWidthPercentage=(100/(columns.length-1)).toFixed(3)+'%';}
-for(let i=1;i<columns.length;i++){columns[i].width=colWidthPercentage;}
-this.$.table.tableColumns=columns;if(hasAlerts){this.$.table.sortColumnIndex=alertsColumnIndex;this.$.table.sortDescending=true;}},configure(config){if(config.eventsByTitle===undefined){throw new Error('Required: eventsByTitle');}
-if(config.showTotals!==undefined){this.showTotals_=config.showTotals;}else{this.showTotals_=true;}
-if(config.eventsHaveDuration!==undefined){this.eventsHaveDuration_=config.eventsHaveDuration;}else{this.eventsHaveDuration_=true;}
-if(config.eventsHaveSubRows!==undefined){this.eventsHaveSubRows_=config.eventsHaveSubRows;}else{this.eventsHaveSubRows_=true;}
-this.eventsByTitle_=config.eventsByTitle;this.updateContents_();},get showTotals(){return this.showTotals_;},set showTotals(showTotals){this.showTotals_=showTotals;this.updateContents_();},get eventsHaveDuration(){return this.eventsHaveDuration_;},set eventsHaveDuration(eventsHaveDuration){this.eventsHaveDuration_=eventsHaveDuration;this.updateContents_();},get eventsHaveSubRows(){return this.eventsHaveSubRows_;},set eventsHaveSubRows(eventsHaveSubRows){this.eventsHaveSubRows_=eventsHaveSubRows;this.updateContents_();},get eventsByTitle(){return this.eventsByTitle_;},set eventsByTitle(eventsByTitle){this.eventsByTitle_=eventsByTitle;this.updateContents_();},get selectionBounds(){return this.selectionBounds_;},set selectionBounds(selectionBounds){this.selectionBounds_=selectionBounds;this.updateContents_();},updateContents_(){let eventsByTitle;if(this.eventsByTitle_!==undefined){eventsByTitle=this.eventsByTitle_;}else{eventsByTitle=[];}
-const allEvents=new tr.model.EventSet();const rows=[];for(const[title,eventsOfSingleTitle]of Object.entries(eventsByTitle)){for(const event of eventsOfSingleTitle)allEvents.push(event);const row=new tr.ui.analysis.MultiEventSummary(title,eventsOfSingleTitle);rows.push(row);}
-this.updateTableColumns_(rows);this.$.table.tableRows=rows;const maxValues={duration:undefined,selfTime:undefined,cpuSelfTime:undefined,cpuDuration:undefined};if(this.eventsHaveDuration){for(const column in maxValues){maxValues[column]=tr.b.math.Statistics.max(rows,function(event){return event[column];});}}
-const footerRows=[];if(this.showTotals_){const multiEventSummary=new tr.ui.analysis.MultiEventSummary('Totals',allEvents);footerRows.push(multiEventSummary);}
-this.updateTableColumns_(rows,maxValues);this.$.table.tableRows=rows;this.$.table.footerRows=footerRows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-selection-summary-table',created(){this.selection_=new tr.b.math.Range();},ready(){this.$.table.showHeader=false;this.$.table.tableColumns=[{title:'Name',value(row){return row.title;},width:'350px'},{title:'Value',width:'100%',value(row){return row.value;}}];},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;this.updateContents_();},updateContents_(){const selection=this.selection_;const rows=[];let hasRange;if(this.selection_&&(!selection.bounds.isEmpty)){hasRange=true;}else{hasRange=false;}
-rows.push({title:'Selection start',value:hasRange?tr.v.ui.createScalarSpan(selection.bounds.min,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument}):'<empty>'});rows.push({title:'Selection extent',value:hasRange?tr.v.ui.createScalarSpan(selection.bounds.range,{unit:tr.b.Unit.byName.timeDurationInMs,ownerDocument:this.ownerDocument}):'<empty>'});this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-b-radio-picker',created(){this.needsInit_=true;this.settingsKey_=undefined;this.isReady_=false;this.radioButtons_=undefined;this.selectedKey_=undefined;},ready(){this.isReady_=true;this.maybeInit_();this.maybeRenderRadioButtons_();},get vertical(){return this.getAttribute('vertical');},set vertical(vertical){if(vertical){this.setAttribute('vertical',true);}else{this.removeAttribute('vertical');}},get settingsKey(){return this.settingsKey_;},set settingsKey(settingsKey){if(!this.needsInit_){throw new Error('Already initialized.');}
-this.settingsKey_=settingsKey;this.maybeInit_();},maybeInit_(){if(!this.needsInit_)return;if(this.settingsKey_===undefined)return;this.needsInit_=false;this.select(tr.b.Settings.get(this.settingsKey_));},set items(items){this.radioButtons_={};items.forEach(function(e){if(e.key in this.radioButtons_){throw new Error(e.key+' already exists');}
-const radioButton=document.createElement('div');const input=document.createElement('input');const label=document.createElement('label');input.type='radio';input.id=e.label;input.addEventListener('click',function(){this.select(e.key);}.bind(this));Polymer.dom(label).innerHTML=e.label;label.htmlFor=e.label;label.style.display='inline';Polymer.dom(radioButton).appendChild(input);Polymer.dom(radioButton).appendChild(label);this.radioButtons_[e.key]=input;}.bind(this));this.maybeInit_();this.maybeRenderRadioButtons_();},maybeRenderRadioButtons_(){if(!this.isReady_)return;if(this.radioButtons_===undefined)return;for(const key in this.radioButtons_){Polymer.dom(this.$.container).appendChild(this.radioButtons_[key].parentElement);}
-if(this.selectedKey_!==undefined){this.select(this.selectedKey_);}},select(key){if(key===undefined||key===this.selectedKey_){return;}
-if(this.radioButtons_===undefined){this.selectedKey_=key;return;}
-if(!(key in this.radioButtons_)){throw new Error(key+' does not exists');}
-if(this.selectedKey_!==undefined){this.radioButtons_[this.selectedKey_].checked=false;}
-this.selectedKey_=key;tr.b.Settings.set(this.settingsKey_,this.selectedKey_);if(this.selectedKey_!==undefined){this.radioButtons_[this.selectedKey_].checked=true;}
-this.dispatchEvent(new tr.b.Event('change',false));},get selectedKey(){return this.selectedKey_;},});'use strict';tr.exportTo('tr.ui.b',function(){const MIN_GUIDELINE_HEIGHT_PX=3;const CHECKBOX_WIDTH_PX=18;const NameColumnChart=tr.ui.b.define('name-column-chart',tr.ui.b.ColumnChart);NameColumnChart.prototype={__proto__:tr.ui.b.ColumnChart.prototype,get xAxisHeight(){return 5+(this.textHeightPx_*this.data_.length);},updateMargins_(){super.updateMargins_();let xAxisTickOverhangPx=0;for(let i=0;i<this.data_.length;++i){const datum=this.data_[i];xAxisTickOverhangPx=Math.max(xAxisTickOverhangPx,this.xScale_(i)+tr.ui.b.getSVGTextSize(this,datum.x).width-
-this.graphWidth);}
-this.margin.right=Math.max(this.margin.right,xAxisTickOverhangPx);},getXForDatum_(datum,index){return index;},get xAxisTickOffset(){return 0.5;},updateXAxis_(xAxis){xAxis.selectAll('*').remove();if(this.hideXAxis)return;const nameTexts=xAxis.selectAll('text').data(this.data_);nameTexts.enter().append('text').attr('transform',(d,index)=>'translate(0, '+
-this.textHeightPx_*(this.data_.length-index)+')').attr('x',(d,index)=>this.xScale_(index)).attr('y',d=>this.graphHeight).text(d=>d.x);nameTexts.exit().remove();const guideLines=xAxis.selectAll('line.guide').data(this.data_);guideLines.enter().append('line').attr('x1',(d,index)=>this.xScale_(index+this.xAxisTickOffset)).attr('x2',(d,index)=>this.xScale_(index+this.xAxisTickOffset)).attr('y1',()=>this.graphHeight).attr('y2',(d,index)=>this.graphHeight+Math.max(MIN_GUIDELINE_HEIGHT_PX,(this.textHeightPx_*(this.data_.length-index-1))));}};return{NameColumnChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const LineChart=tr.ui.b.LineChart;const NameLineChart=tr.ui.b.define('name-line-chart',LineChart);NameLineChart.prototype={__proto__:LineChart.prototype,getXForDatum_(datum,index){return index;},get xAxisHeight(){return 5+(this.textHeightPx_*this.data_.length);},get xAxisTickOffset(){return 0;},updateMargins_(){tr.ui.b.NameColumnChart.prototype.updateMargins_.call(this);},updateXAxis_(xAxis){xAxis.selectAll('*').remove();if(this.hideXAxis)return;tr.ui.b.NameColumnChart.prototype.updateXAxis_.call(this,xAxis);const baseline=xAxis.selectAll('path').data([this]);baseline.enter().append('line').attr('stroke','black').attr('x1',this.xScale_(0)).attr('x2',this.xScale_(this.data_.length-1)).attr('y1',this.graphHeight).attr('y2',this.graphHeight);baseline.exit().remove();}};return{NameLineChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const BoxChart=tr.ui.b.define('box-chart',tr.ui.b.NameLineChart);BoxChart.prototype={__proto__:tr.ui.b.NameLineChart.prototype,get hideLegend(){return true;},updateDataRange_(){if(this.overrideDataRange_!==undefined){return;}
-this.autoDataRange_.reset();for(const datum of this.data_){this.autoDataRange_.addValue(datum.percentile_0);this.autoDataRange_.addValue(datum.percentile_100);}},updateScales_(){super.updateScales_();this.xScale_.domain([0,this.data_.length]);},get xAxisTickOffset(){return 0.5;},updateDataRange_(){if(this.overrideDataRange_!==undefined)return;this.autoDataRange_.reset();for(const datum of this.data_){this.autoDataRange_.addValue(datum.percentile_0);this.autoDataRange_.addValue(datum.percentile_100);}},updateXAxis_(xAxis){xAxis.selectAll('*').remove();if(this.hideXAxis)return;tr.ui.b.NameColumnChart.prototype.updateXAxis_.call(this,xAxis);const baseline=xAxis.selectAll('path').data([this]);baseline.enter().append('line').attr('stroke','black').attr('x1',this.xScale_(0)).attr('x2',this.xScale_(this.data_.length)).attr('y1',this.graphHeight).attr('y2',this.graphHeight);baseline.exit().remove();},updateDataContents_(dataSel){dataSel.selectAll('*').remove();const boxesSel=dataSel.selectAll('path');for(let index=0;index<this.data_.length;++index){const datum=this.data_[index];const color=datum.color||'black';let sel=boxesSel.data([datum]);sel.enter().append('rect').attr('fill',color).attr('x',this.xScale_(index+0.2)).attr('width',this.xScale_(index+0.8)-this.xScale_(index+0.2)).attr('y',this.yScale_(datum.percentile_75)).attr('height',this.yScale_(datum.percentile_25)-
-this.yScale_(datum.percentile_75));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index)).attr('x2',this.xScale_(index+1)).attr('y1',this.yScale_(datum.percentile_50)).attr('y2',this.yScale_(datum.percentile_50));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index+0.4)).attr('x2',this.xScale_(index+0.6)).attr('y1',this.yScale_(datum.percentile_0)).attr('y2',this.yScale_(datum.percentile_0));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index+0.4)).attr('x2',this.xScale_(index+0.6)).attr('y1',this.yScale_(datum.percentile_100)).attr('y2',this.yScale_(datum.percentile_100));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index+0.5)).attr('x2',this.xScale_(index+0.5)).attr('y1',this.yScale_(datum.percentile_100)).attr('y2',this.yScale_(datum.percentile_0));sel.exit().remove();}}};return{BoxChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const BarChart=tr.ui.b.define('bar-chart',tr.ui.b.ColumnChart);BarChart.prototype={__proto__:tr.ui.b.ColumnChart.prototype,decorate(){super.decorate();this.verticalScale_=undefined;this.horizontalScale_=undefined;this.isWaterfall_=false;},updateScales_(){super.updateScales_();this.yScale_.range([this.graphWidth,0]);this.xScale_.range([0,this.graphHeight]);this.verticalScale_=this.isYLogScale_?d3.scale.log(10):d3.scale.linear();this.verticalScale_.domain(this.xScale_.domain());this.verticalScale_.range([this.graphHeight,0]);this.horizontalScale_=d3.scale.linear();this.horizontalScale_.domain(this.yScale_.domain());this.horizontalScale_.range([0,this.graphWidth]);},set isWaterfall(waterfall){this.isWaterfall_=waterfall;if(waterfall){this.getDataSeries('hide').color='transparent';}
-this.updateContents_();},get isWaterfall(){return this.isWaterfall_;},get defaultGraphHeight(){return Math.max(20,10*this.data_.length);},get defaultGraphWidth(){return 100;},get barHeight(){return this.graphHeight/this.data.length;},drawBrush_(brushRectsSel){brushRectsSel.attr('x',0).attr('width',this.graphWidth).attr('y',d=>this.verticalScale_(d.max)).attr('height',d=>this.verticalScale_(d.min)-this.verticalScale_(d.max)).attr('fill','rgb(213, 236, 229)');},getDataPointAtChartPoint_(chartPoint){const flippedPoint={x:this.graphHeight-chartPoint.y,y:this.graphWidth-chartPoint.x};return super.getDataPointAtChartPoint_(flippedPoint);},drawXAxis_(xAxis){xAxis.attr('transform','translate(0,'+this.graphHeight+')').call(d3.svg.axis().scale(this.horizontalScale_).orient('bottom'));},get yAxisWidth(){return this.computeScaleTickWidth_(this.verticalScale_);},drawYAxis_(yAxis){const axisModifier=d3.svg.axis().scale(this.verticalScale_).orient('left');yAxis.call(axisModifier);},drawHoverValueBox_(rect){const rectHoverEvent=new tr.b.Event('rect-mouseenter');rectHoverEvent.rect=rect;this.dispatchEvent(rectHoverEvent);if(!this.enableHoverBox||(this.isWaterfall_&&rect.key==='hide')){return;}
-const seriesKeys=[...this.seriesByKey_.keys()];const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.hover').remove();let keyWidthPx=0;let keyHeightPx=0;let xWidthPx=0;let xHeightPx=0;let groupWidthPx=0;let groupHeightPx=0;if(seriesKeys.length>1&&!this.isGrouped&&!this.isWaterfall_){keyWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.key).width;keyHeightPx=this.textHeightPx_;}
-if(this.data.length>1&&!this.isWaterfall_){xWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,''+rect.datum.x).width;xHeightPx=this.textHeightPx_;}
-if(this.isGrouped&&rect.datum.group!==undefined){groupWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.datum.group).width;groupHeightPx=this.textHeightPx_;}
-const valueWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.value).width;const valueHeightPx=this.textHeightPx_;const maxWidthPx=Math.max(keyWidthPx,xWidthPx,groupWidthPx,valueWidthPx)+5;const hoverWidthPx=this.isGrouped?maxWidthPx:Math.min(maxWidthPx,Math.max(50,rect.widthPx));let hoverTopPx=rect.topPx;hoverTopPx=Math.min(hoverTopPx,this.getBoundingClientRect().height-
-valueHeightPx);let hoverLeftPx=rect.leftPx+(rect.widthPx/2);hoverLeftPx=Math.max(hoverLeftPx-hoverWidthPx,-this.margin.left);chartAreaSel.append('rect').attr('class','hover').attr('fill','white').attr('x',hoverLeftPx).attr('y',hoverTopPx).attr('width',hoverWidthPx).attr('height',keyHeightPx+xHeightPx+
-valueHeightPx+groupHeightPx);if(seriesKeys.length>1&&!this.isGrouped&&!this.isWaterfall_){chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color==='transparent'?'#000000':rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx-3).text(rect.key);}
-if(this.data.length>1&&!this.isWaterfall_){chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color==='transparent'?'#000000':rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx+valueHeightPx-3).text(''+rect.datum.x);}
-if(this.isGrouped&&rect.datum.group!==undefined){chartAreaSel.append('text').on('mouseleave',()=>this.clearHoverValueBox_(rect)).attr('class','hover').attr('fill',rect.color==='transparent'?'#000000':rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx+xHeightPx+groupHeightPx-3).text(rect.datum.group);}
-chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color==='transparent'?'#000000':rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+xHeightPx+keyHeightPx+
-groupHeightPx+valueHeightPx-3).text(rect.value);},flipRect_(rect){return{datum:rect.datum,index:rect.index,key:rect.key,value:rect.value,color:rect.color,topPx:this.graphHeight-rect.leftPx-rect.widthPx,leftPx:this.graphWidth-rect.topPx-rect.heightPx,widthPx:rect.heightPx,heightPx:rect.widthPx,underflow:rect.underflow,overflow:rect.overflow,};},drawRect_(rect,sel){super.drawRect_(this.flipRect_(rect),sel);},drawUnderflow_(rect,rectsSel){let sel=rectsSel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',0).attr('y',this.graphHeight-rect.leftPx+
-3+(rect.widthPx/2));sel.exit().remove();sel=rectsSel.data([rect]);sel.enter().append('rect').attr('fill','rgba(0, 0, 0, 0)').attr('x',0).attr('y',this.graphHeight-rect.leftPx-rect.widthPx).attr('width',10).attr('height',rect.widthPx).on('mouseenter',()=>this.drawHoverValueBox_(this.flipRect_(rect))).on('mouseleave',()=>this.clearHoverValueBox_(rect));sel.exit().remove();},drawOverflow_(rect,sel){sel=sel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',this.graphWidth).attr('y',this.graphHeight-rect.leftPx+
-3+(rect.widthPx/2));sel.exit().remove();}};return{BarChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const NameBarChart=tr.ui.b.define('name-bar-chart',tr.ui.b.BarChart);const Y_AXIS_PADDING=2;NameBarChart.prototype={__proto__:tr.ui.b.BarChart.prototype,getDataPointAtChartPoint_(chartPoint){return{x:tr.ui.b.BarChart.prototype.getDataPointAtChartPoint_.call(this,chartPoint).x,y:parseInt(Math.floor((this.graphHeight-chartPoint.y)/this.barHeight))};},getXForDatum_(datum,index){return index;},get yAxisWidth(){if(this.data.length===0)return 0;return Y_AXIS_PADDING+tr.b.math.Statistics.max(this.data_,d=>tr.ui.b.getSVGTextSize(this,d.x).width);},get defaultGraphHeight(){return(3+this.textHeightPx_)*this.data.length;},updateYAxis_(yAxis){if(tr.ui.b.getSVGTextSize(this,'test').width===0){tr.b.requestAnimationFrame(()=>this.updateYAxis_(yAxis));return;}
-yAxis.selectAll('*').remove();if(this.hideYAxis)return;const nameTexts=yAxis.selectAll('text').data(this.data_);nameTexts.enter().append('text').attr('x',d=>-(tr.ui.b.getSVGTextSize(this,d.x).width+Y_AXIS_PADDING)).attr('y',(d,index)=>this.verticalScale_(index)).text(d=>d.x);nameTexts.exit().remove();let previousTop=undefined;for(const text of nameTexts[0]){const bbox=text.getBBox();if((previousTop===undefined)||(previousTop>(bbox.y+bbox.height))){previousTop=bbox.y;}else{text.style.opacity=0;}}}};return{NameBarChart,};});'use strict';tr.exportTo('tr.v.ui',function(){const DIAGNOSTIC_SPAN_BEHAVIOR={created(){this.diagnostic_=undefined;this.name_=undefined;this.histogram_=undefined;},attached(){if(this.diagnostic_)this.updateContents_();},get diagnostic(){return this.diagnostic_;},build(diagnostic,name,histogram){this.diagnostic_=diagnostic;this.name_=name;this.histogram_=histogram;if(this.isAttached)this.updateContents_();},updateContents_(){throw new Error('dom-modules must override updateContents_()');}};return{DIAGNOSTIC_SPAN_BEHAVIOR,};});'use strict';tr.exportTo('tr.v.ui',function(){const DEFAULT_COLOR_SCHEME=new tr.b.SinebowColorGenerator();function getHistogramName(histogram,diagnosticName,key){if(histogram===undefined)return undefined;const nameMap=histogram.diagnostics.get(diagnosticName);if(nameMap===undefined)return undefined;return nameMap.get(key);}
-class BreakdownTableSummaryRow{constructor(displayElement,histogramNames){this.displayElement_=displayElement;this.histogramNames_=histogramNames;this.keySpan_=undefined;}
-get numberValue(){return undefined;}
-get keySpan(){if(this.keySpan_===undefined){if(this.histogramNames_.length){this.keySpan_=document.createElement('tr-ui-a-analysis-link');this.keySpan_.setSelectionAndContent(this.histogramNames_,'Select All');}else{this.keySpan_='Sum';}}
-return this.keySpan_;}
-get name(){return'Sum';}
-get displayElement(){return this.displayElement_;}
-get stringPercent(){return'100%';}}
-class BreakdownTableRow{constructor(name,value,histogramName,unit,color){this.name_=name;this.value_=value;this.histogramName_=histogramName;this.unit_=unit;if(typeof value!=='number'){throw new Error('unsupported value '+value);}
-this.tableSum_=undefined;this.keySpan_=undefined;this.color_=color;const hsl=this.color.toHSL();hsl.l*=0.85;this.highlightedColor_=tr.b.Color.fromHSL(hsl);if(this.unit_){this.displayElement_=tr.v.ui.createScalarSpan(this.numberValue,{unit:this.unit_,});}else{this.displayElement_=tr.ui.b.createSpan({textContent:this.stringValue,});}}
-get name(){return this.name_;}
-get color(){return this.color_;}
-get highlightedColor(){return this.highlightedColor_;}
-get keySpan(){if(this.keySpan_===undefined){if(this.histogramName_){this.keySpan_=document.createElement('tr-ui-a-analysis-link');this.keySpan_.setSelectionAndContent([this.histogramName_],this.name);this.keySpan_.color=this.color;this.keySpan_.title=this.histogramName_;}else{this.keySpan_=document.createElement('span');this.keySpan_.innerText=this.name;this.keySpan_.style.color=this.color;}}
-return this.keySpan_;}
-get numberValue(){if(!isNaN(this.value_)&&(this.value_!==Infinity)&&(this.value_!==-Infinity)&&(this.value_>0))return this.value_;return undefined;}
-get stringValue(){if((this.unit_!==undefined)&&!isNaN(this.value_)&&(this.value_!==Infinity)&&(this.value_!==-Infinity)){return this.unit_.format(this.value_);}
-return this.value_.toString();}
-set tableSum(s){this.tableSum_=s;}
-get stringPercent(){if(this.tableSum_===undefined)return'';const num=this.numberValue;if(num===undefined)return'';return Math.floor(num*100.0/this.tableSum_)+'%';}
-get displayElement(){return this.displayElement_;}
-compare(other){if(this.numberValue===undefined){if(other.numberValue===undefined){return this.name.localeCompare(other.name);}
-return 1;}
-if(other.numberValue===undefined){return-1;}
-if(this.numberValue===other.numberValue){return this.name.localeCompare(other.name);}
-return other.numberValue-this.numberValue;}}
-Polymer({is:'tr-v-ui-breakdown-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],created(){this.chart_=new tr.ui.b.ColumnChart();this.chart_.graphHeight=130;this.chart_.isStacked=true;this.chart_.hideXAxis=true;this.chart_.hideLegend=true;this.chart_.enableHoverBox=false;this.chart_.addEventListener('rect-mouseenter',event=>this.onRectMouseEnter_(event));this.chart_.addEventListener('rect-mouseleave',event=>this.onRectMouseLeave_(event));},onRectMouseEnter_(event){for(const row of this.$.table.tableRows){if(row.name===event.rect.key){row.displayElement.style.background=event.rect.color;row.keySpan.scrollIntoViewIfNeeded();}else{row.displayElement.style.background='';}}},onRectMouseLeave_(event){for(const row of this.$.table.tableRows){row.displayElement.style.background='';}},ready(){Polymer.dom(this.$.container).appendChild(this.chart_);this.$.table.zebra=true;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row.keySpan,},{value:row=>row.displayElement,align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,},{value:row=>row.stringPercent,align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,},];},updateContents_(){this.$.container.style.display='none';this.$.table.style.display='none';this.$.empty.style.display='block';if(!this.diagnostic_){this.chart_.data=[];return;}
-if(this.histogram_)this.chart_.unit=this.histogram_.unit;let colorScheme=undefined;if(this.diagnostic.colorScheme===tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER){colorScheme=(name)=>{let cat=name.split(' ');cat=cat[cat.length-1];return tr.e.chrome.ChromeUserFriendlyCategoryDriver.getColor(cat);};}else if(this.diagnostic.colorScheme){colorScheme=(name)=>tr.b.FixedColorSchemeRegistry.lookUp(this.diagnostic.colorScheme).getColor(name);}else{colorScheme=(name)=>DEFAULT_COLOR_SCHEME.colorForKey(name);}
-const tableRows=[];let tableSum=0;const histogramNames=[];for(const[key,value]of this.diagnostic){const histogramName=getHistogramName(this.histogram_,this.name_,key);const row=new BreakdownTableRow(key,value,histogramName,this.chart_.unit,colorScheme(key));tableRows.push(row);if(row.numberValue!==undefined)tableSum+=row.numberValue;if(histogramName){histogramNames.push(histogramName);}}
-tableRows.sort((x,y)=>x.compare(y));if(tableSum>0){let summaryDisplayElement=tableSum;if(this.chart_.unit!==undefined){summaryDisplayElement=this.chart_.unit.format(tableSum);}
-summaryDisplayElement=tr.ui.b.createSpan({textContent:summaryDisplayElement,});tableRows.unshift(new BreakdownTableSummaryRow(summaryDisplayElement,histogramNames));}
-const chartData={x:0};for(const row of tableRows){if(row.numberValue===undefined)continue;row.tableSum=tableSum;chartData[row.name]=row.numberValue;const dataSeries=this.chart_.getDataSeries(row.name);dataSeries.color=row.color;dataSeries.highlightedColor=row.highlightedColor;}
-if(tableRows.length>0){this.$.table.style.display='block';this.$.empty.style.display='none';this.$.table.tableRows=tableRows;this.$.table.rebuild();}
-if(Object.keys(chartData).length>1){this.$.container.style.display='block';this.$.empty.style.display='none';this.chart_.data=[chartData];}}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-collected-related-event-set-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],updateContents_(){Polymer.dom(this).textContent='';for(const[canonicalUrl,events]of this.diagnostic){const link=document.createElement('a');if(events.length===1){const event=tr.b.getOnlyElement(events);link.textContent=event.title+' '+
-tr.b.Unit.byName.timeDurationInMs.format(event.duration);}else{link.textContent=events.length+' events';}
-link.href=canonicalUrl;Polymer.dom(this).appendChild(link);Polymer.dom(this).appendChild(document.createElement('br'));}}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-date-range-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],updateContents_(){if(this.diagnostic===undefined){Polymer.dom(this).textContent='';return;}
-Polymer.dom(this).textContent=this.diagnostic.toString();}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){function isLinkTuple(value){return((value instanceof Array)&&(value.length===2)&&(typeof value[0]==='string')&&tr.b.isUrl(value[1]));}
-Polymer({is:'tr-v-ui-generic-set-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],updateContents_(){this.$.generic.style.display='none';this.$.links.textContent='';if(this.diagnostic===undefined)return;const values=Array.from(this.diagnostic);let areAllStrings=true;let areAllNumbers=true;for(const value of values){if(typeof value!=='number'){areAllNumbers=false;if(typeof value!=='string'&&!isLinkTuple(value)){areAllStrings=false;break;}}}
-if(!areAllStrings){this.$.generic.style.display='';this.$.generic.object=values;return;}
-if(areAllNumbers){values.sort((x,y)=>x-y);}else{values.sort();}
-for(const value of values){const link={textContent:''+value};if(isLinkTuple(value)){link.textContent=value[0];link.href=value[1];}else if(tr.b.isUrl(value)){link.href=value;}
-if(this.name_===tr.v.d.RESERVED_NAMES.TRACE_URLS){link.textContent=value.substr(1+value.lastIndexOf('/'));}
-const linkEl=tr.ui.b.createLink(link);if(link.href){linkEl.target='_blank';linkEl.addEventListener('click',e=>e.stopPropagation());}
-this.$.links.appendChild(linkEl);}}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-related-event-set-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],updateContents_(){Polymer.dom(this).textContent='';const events=new tr.model.EventSet([...this.diagnostic]);const link=document.createElement('tr-ui-a-analysis-link');let label=events.length+' events';if(events.length===1){const event=tr.b.getOnlyElement(events);label=event.title+' ';label+=tr.b.Unit.byName.timeDurationInMs.format(event.duration);}
-link.setSelectionAndContent(events,label);Polymer.dom(this).appendChild(link);}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-scalar-diagnostic-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],updateContents_(){this.$.scalar.setValueAndUnit(this.diagnostic.value.value,this.diagnostic.value.unit);}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-unmergeable-diagnostic-set-span',behaviors:[tr.v.ui.DIAGNOSTIC_SPAN_BEHAVIOR],updateContents_(){Polymer.dom(this).textContent='';for(const diagnostic of this.diagnostic){if(diagnostic instanceof tr.v.d.RelatedNameMap)continue;const div=document.createElement('div');div.appendChild(tr.v.ui.createDiagnosticSpan(diagnostic,this.name_,this.histogram_));Polymer.dom(this).appendChild(div);}}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){function findElementNameForDiagnostic(diagnostic){let typeInfo=undefined;let curProto=diagnostic.constructor.prototype;while(curProto){typeInfo=tr.v.d.Diagnostic.findTypeInfo(curProto.constructor);if(typeInfo&&typeInfo.metadata.elementName)break;typeInfo=undefined;curProto=curProto.__proto__;}
-if(typeInfo===undefined){throw new Error(diagnostic.constructor.name+' or a base class must have a registered elementName');}
-return typeInfo.metadata.elementName;}
-function createDiagnosticSpan(diagnostic,name,histogram){const tagName=findElementNameForDiagnostic(diagnostic);const span=document.createElement(tagName);if(span instanceof HTMLUnknownElement){throw new Error('Element not registered: '+tagName);}
-if(span.build===undefined)throw new Error(tagName);span.build(diagnostic,name,histogram);return span;}
-return{createDiagnosticSpan,};});'use strict';tr.exportTo('tr.v.ui',function(){function makeColumn(title,histogram){return{title,value(map){const diagnostic=map.get(title);if(!diagnostic)return'';return tr.v.ui.createDiagnosticSpan(diagnostic,title,histogram);}};}
-Polymer({is:'tr-v-ui-diagnostic-map-table',created(){this.diagnosticMaps_=undefined;this.histogram_=undefined;this.isMetadata_=false;},set histogram(h){this.histogram_=h;},set isMetadata(m){this.isMetadata_=m;this.$.table.showHeader=!this.isMetadata_;},set diagnosticMaps(maps){this.diagnosticMaps_=maps;this.updateContents_();},get diagnosticMaps(){return this.diagnosticMaps_;},updateContents_(){if(this.isMetadata_&&this.diagnosticMaps_.length!==1){throw new Error('Metadata diagnostic-map-tables require exactly 1 DiagnosticMap');}
-if(this.diagnosticMaps_===undefined||this.diagnosticMaps_.length===0){this.$.table.tableRows=[];this.$.table.tableColumns=[];return;}
-let names=new Set();for(const map of this.diagnosticMaps_){for(const[name,diagnostic]of map){if(diagnostic instanceof tr.v.d.UnmergeableDiagnosticSet)continue;if(diagnostic instanceof tr.v.d.CollectedRelatedEventSet)continue;names.add(name);}}
-names=Array.from(names).sort();const histogram=this.histogram_;if(this.isMetadata_){const diagnosticMap=this.diagnosticMaps_[0];this.$.table.tableColumns=[{value(name){return name.name;}},{value(name){const diagnostic=diagnosticMap.get(name.name);if(!diagnostic)return'';return tr.v.ui.createDiagnosticSpan(diagnostic,name.name,histogram);}},];this.$.table.tableRows=names.map(name=>{return{name};});}else{this.$.table.tableColumns=names.map(name=>makeColumn(name,histogram));this.$.table.tableRows=this.diagnosticMaps_;}
-this.$.table.rebuild();}});return{};});'use strict';tr.exportTo('tr.b',function(){class Serializable{constructor(){Object.defineProperty(this,'properties_',{configurable:false,enumerable:false,value:new Map(),});}
-define(name,initialValue){if(this[name]!==undefined){throw new Error(`"${name}" is already defined.`);}
-if(name[name.length-1]==='_'){throw new Error(`"${name}" cannot end with an underscore.`);}
-this.properties_.set(name,initialValue);Object.defineProperty(this,name,{configurable:false,enumerable:true,get:()=>this.properties_.get(name),set:value=>this.setProperty_(name,value),});}
-setProperty_(name,value){this.properties_.set(name,value);}
-clone(){return Serializable.fromDict(this.asDict());}
-asDict(){function visit(obj){if(obj instanceof Serializable)return obj.asDict();if(obj instanceof Set)return Array.from(obj);if(obj instanceof Array)return obj.map(visit);if(!(obj instanceof Map))return obj;const result={};for(const[name,value]of obj){result[name]=visit(value);}
-return result;}
-const dict={type:this.constructor.name};for(const[name,value]of this.properties_){dict[name.replace(/_$/,'')]=visit(value);}
-return dict;}
-static fromDict(dict){function visit(d){if(d instanceof Array)return d.map(visit);if(!(d instanceof Object))return d;if(typeof d.type==='string')return Serializable.fromDict(d);const result=new Map();for(const[name,value]of Object.entries(d)){result.set(name,visit(value));}
-return result;}
-const typeInfo=Serializable.findTypeInfoWithName(dict.type);const result=new typeInfo.constructor();for(const[name,value]of Object.entries(dict)){result[name]=visit(value);}
-return result;}}
-const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Serializable;tr.b.decorateExtensionRegistry(Serializable,options);return{Serializable,};});'use strict';tr.exportTo('tr.b',function(){class ViewState extends tr.b.Serializable{constructor(){super();tr.b.EventTarget.decorate(this);}
-setProperty_(name,value){this.update(new Map([[name,value]]));}
-async updateFromViewState(other){await this.update(other.properties_);}
-async update(delta){if(!(delta instanceof Map))delta=new Map(Object.entries(delta));const actualDelta={};for(const[name,current]of delta){const previous=this[name];if(previous===current)continue;actualDelta[name]={previous,current};tr.b.Serializable.prototype.setProperty_.call(this,name,current);}
-if(Object.keys(actualDelta).length===0)return;await tr.b.dispatchSimpleEventAsync(this,this.updateEventName_,{delta:actualDelta});}
-get updateEventName_(){return this.constructor.name+'.update';}
-addUpdateListener(listener){this.addEventListener(this.updateEventName_,listener);}
-removeUpdateListener(listener){this.removeEventListener(this.updateEventName_,listener);}}
-return{ViewState,};});'use strict';tr.exportTo('tr.v.ui',function(){class HistogramSetViewState extends tr.b.ViewState{constructor(){super();this.define('searchQuery','');this.define('referenceDisplayLabel','');this.define('displayStatisticName','');this.define('showAll',true);this.define('groupings',[]);this.define('sortColumnIndex',0);this.define('sortDescending',false);this.define('constrainNameColumn',true);this.define('tableRowStates',new Map());this.define('alpha',0.01);}}
-tr.b.ViewState.register(HistogramSetViewState);class HistogramSetTableRowState extends tr.b.ViewState{constructor(){super();this.define('isExpanded',false);this.define('isOverviewed',false);this.define('cells',new Map());this.define('subRows',new Map());this.define('diagnosticsTab','');}
-asCompactDict(){const result={};if(this.isExpanded)result.e='1';if(this.isOverviewed)result.o='1';if(this.diagnosticsTab)result.d=this.diagnosticsTab;const cells={};for(const[name,cell]of this.cells){const cellDict=cell.asCompactDict();if(cellDict===undefined)continue;cells[name]=cellDict;}
-if(Object.keys(cells).length>0)result.c=cells;const subRows={};for(const[name,row]of this.subRows){const rowDict=row.asCompactDict();if(rowDict===undefined)continue;subRows[name]=rowDict;}
-if(Object.keys(subRows).length>0)result.r=subRows;if(Object.keys(result).length===0)return undefined;return result;}
-async updateFromCompactDict(dict){await this.update({isExpanded:dict.e==='1',isOverviewed:dict.o==='1',diagnosticsTab:dict.d||'',});for(const[name,cellDict]of Object.entries(dict.c||{})){const cell=this.cells.get(name);if(cell===undefined)continue;await cell.updateFromCompactDict(cellDict);}
-for(const[name,subRowDict]of Object.entries(dict.r||{})){const subRow=this.subRows.get(name);if(subRow===undefined)continue;await subRow.updateFromCompactDict(subRowDict);}}*walk(){yield this;for(const row of this.subRows.values())yield*row.walk();}
-static*walkAll(rootRows){for(const rootRow of rootRows)yield*rootRow.walk();}}
-tr.b.ViewState.register(HistogramSetTableRowState);class HistogramSetTableCellState extends tr.b.ViewState{constructor(){super();this.define('isOpen',false);this.define('brushedBinRange',new tr.b.math.Range());this.define('mergeSampleDiagnostics',true);}
-asCompactDict(){const result={};if(this.isOpen)result.o='1';if(!this.mergeSampleDiagnostics)result.m='0';if(!this.brushedBinRange.isEmpty){result.b=this.brushedBinRange.min+'_'+this.brushedBinRange.max;}
-if(Object.keys(result).length===0)return undefined;return result;}
-async updateFromCompactDict(dict){let binRange=this.brushedBinRange;if(dict.b){let[bMin,bMax]=dict.b.split('_');bMin=parseInt(bMin);bMax=parseInt(bMax);if(bMin!==binRange.min||bMax!==binRange.max){binRange=tr.b.math.Range.fromExplicitRange(bMin,bMax);}}
-await this.update({isOpen:dict.o==='1',brushedBinRange:binRange,mergeSampleDiagnostics:dict.m!=='0',});}}
-tr.b.ViewState.register(HistogramSetTableCellState);return{HistogramSetTableCellState,HistogramSetTableRowState,HistogramSetViewState,};});'use strict';Polymer({is:'tr-v-ui-scalar-map-table',created(){this.scalarMap_=new Map();this.significance_=new Map();},ready(){this.$.table.showHeader=false;this.$.table.tableColumns=[{value(row){return row.name;}},{value(row){const span=tr.v.ui.createScalarSpan(row.value);if(row.significance!==undefined){span.significance=row.significance;}else if(row.anyRowsHaveSignificance){span.style.marginRight='18px';}
-span.style.whiteSpace='nowrap';return span;}}];},get scalarMap(){return this.scalarMap_;},set scalarMap(map){this.scalarMap_=map;this.updateContents_();},setSignificanceForKey(key,significance){this.significance_.set(key,significance);this.updateContents_();},updateContents_(){const rows=[];for(const[key,scalar]of this.scalarMap){rows.push({name:key,value:scalar,significance:this.significance_.get(key),anyRowsHaveSignificance:(this.significance_.size>0)});}
-this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';tr.exportTo('tr.v.ui',function(){const DEFAULT_BAR_HEIGHT_PX=5;const TRUNCATE_BIN_MARGIN=0.15;const IGNORE_DELTA_STATISTICS_NAMES=[`${tr.v.DELTA}min`,`%${tr.v.DELTA}min`,`${tr.v.DELTA}max`,`%${tr.v.DELTA}max`,`${tr.v.DELTA}sum`,`%${tr.v.DELTA}sum`,`${tr.v.DELTA}count`,`%${tr.v.DELTA}count`,];Polymer({is:'tr-v-ui-histogram-span',created(){this.viewStateListener_=this.onViewStateUpdate_.bind(this);this.viewState=new tr.v.ui.HistogramSetTableCellState();this.rowStateListener_=this.onRowStateUpdate_.bind(this);this.rowState=new tr.v.ui.HistogramSetTableRowState();this.rootStateListener_=this.onRootStateUpdate_.bind(this);this.rootState=new tr.v.ui.HistogramSetViewState();this.histogram_=undefined;this.referenceHistogram_=undefined;this.graphWidth_=undefined;this.graphHeight_=undefined;this.mouseDownBin_=undefined;this.prevBrushedBinRange_=new tr.b.math.Range();this.anySampleDiagnostics_=false;this.canMergeSampleDiagnostics_=true;this.mwuResult_=undefined;},get rowState(){return this.rowState_;},set rowState(rs){if(this.rowState){this.rowState.removeUpdateListener(this.rowStateListener_);}
-this.rowState_=rs;this.rowState.addUpdateListener(this.rowStateListener_);if(this.isAttached)this.updateContents_();},get viewState(){return this.viewState_;},set viewState(vs){if(this.viewState){this.viewState.removeUpdateListener(this.viewStateListener_);}
-this.viewState_=vs;this.viewState.addUpdateListener(this.viewStateListener_);if(this.isAttached)this.updateContents_();},get rootState(){return this.rootState_;},set rootState(vs){if(this.rootState){this.rootState.removeUpdateListener(this.rootStateListener_);}
-this.rootState_=vs;this.rootState.addUpdateListener(this.rootStateListener_);if(this.isAttached)this.updateContents_();},build(histogram,opt_referenceHistogram){this.histogram_=histogram;this.$.metric_diagnostics.histogram=histogram;this.$.sample_diagnostics.histogram=histogram;this.referenceHistogram_=opt_referenceHistogram;if(this.histogram.canCompare(this.referenceHistogram)){this.mwuResult_=tr.b.math.Statistics.mwu(this.histogram.sampleValues,this.referenceHistogram.sampleValues,this.rootState.alpha);}
-this.anySampleDiagnostics_=false;for(const bin of this.histogram.allBins){if(bin.diagnosticMaps.length>0){this.anySampleDiagnostics_=true;break;}}
-if(this.isAttached)this.updateContents_();},onViewStateUpdate_(event){if(event.delta.brushedBinRange){if(this.chart_!==undefined){this.chart_.brushedRange=this.viewState.brushedBinRange;}
-this.updateDiagnostics_();}
-if(event.delta.mergeSampleDiagnostics&&(this.viewState.mergeSampleDiagnostics!==this.$.merge_sample_diagnostics.checked)){this.$.merge_sample_diagnostics.checked=this.canMergeSampleDiagnostics&&this.viewState.mergeSampleDiagnostics;this.updateDiagnostics_();}},updateSignificance_(){if(!this.mwuResult_)return;this.$.stats.setSignificanceForKey(`${tr.v.DELTA}avg`,this.mwuResult_.significance);},onRootStateUpdate_(event){if(event.delta.alpha&&this.mwuResult_){this.mwuResult_.compare(this.rootState.alpha);this.updateSignificance_();}},onRowStateUpdate_(event){if(event.delta.diagnosticsTab){if(this.rowState.diagnosticsTab===this.$.sample_diagnostics_container.tabLabel){this.updateDiagnostics_();}else{for(const tab of this.$.diagnostics.subViews){if(this.rowState.diagnosticsTab===tab.tabLabel){this.$.diagnostics.selectedSubView=tab;break;}}}}},ready(){this.$.metric_diagnostics.tabLabel='histogram diagnostics';this.$.sample_diagnostics_container.tabLabel='sample diagnostics';this.$.metadata_diagnostics.tabLabel='metadata';this.$.metadata_diagnostics.isMetadata=true;this.$.diagnostics.addEventListener('selected-tab-change',this.onSelectedDiagnosticsChanged_.bind(this));this.$.drag_handle.target=this.$.container;this.$.drag_handle.addEventListener('drag-handle-resize',this.onResize_.bind(this));},attached(){if(this.histogram_!==undefined)this.updateContents_();},get canMergeSampleDiagnostics(){return this.canMergeSampleDiagnostics_;},set canMergeSampleDiagnostics(merge){this.canMergeSampleDiagnostics_=merge;if(!merge)this.viewState.mergeSampleDiagnostics=false;this.$.merge_sample_diagnostics_container.style.display=(merge?'':'none');},onResize_(event){event.stopPropagation();let heightPx=parseInt(this.$.container.style.height);if(heightPx<this.defaultGraphHeight){heightPx=this.defaultGraphHeight;this.$.container.style.height=this.defaultGraphHeight+'px';}
-this.chart_.graphHeight=heightPx-(this.chart_.margin.top+
-this.chart_.margin.bottom);this.$.stats_container.style.maxHeight=this.chart_.getBoundingClientRect().height+'px';},get graphWidth(){return this.graphWidth_||this.defaultGraphWidth;},set graphWidth(width){this.graphWidth_=width;},get graphHeight(){return this.graphHeight_||this.defaultGraphHeight;},set graphHeight(height){this.graphHeight_=height;},get barHeight(){return this.chart_.barHeight;},set barHeight(px){this.graphHeight=this.computeChartHeight_(px);},computeChartHeight_(barHeightPx){return(this.chart_.margin.top+
-this.chart_.margin.bottom+
-(barHeightPx*this.histogram.allBins.length));},get defaultGraphHeight(){if(this.histogram&&this.histogram.allBins.length===1){return 150;}
-return this.computeChartHeight_(DEFAULT_BAR_HEIGHT_PX);},get defaultGraphWidth(){if(this.histogram.allBins.length===1){return 100;}
-return 300;},get brushedBins(){const bins=[];if(this.histogram&&!this.viewState.brushedBinRange.isEmpty){for(let i=this.viewState.brushedBinRange.min;i<this.viewState.brushedBinRange.max;++i){bins.push(this.histogram.allBins[i]);}}
-return bins;},async updateBrushedRange_(binIndex){const brushedBinRange=new tr.b.math.Range();brushedBinRange.addValue(tr.b.math.clamp(this.mouseDownBinIndex_,0,this.histogram.allBins.length-1));brushedBinRange.addValue(tr.b.math.clamp(binIndex,0,this.histogram.allBins.length-1));brushedBinRange.max+=1;await this.viewState.update({brushedBinRange});},onMouseDown_(chartEvent){chartEvent.stopPropagation();if(!this.histogram)return;this.prevBrushedBinRange_=this.viewState.brushedBinRange;this.mouseDownBinIndex_=chartEvent.y;this.updateBrushedRange_(chartEvent.y);},onMouseMove_(chartEvent){chartEvent.stopPropagation();if(!this.histogram)return;this.updateBrushedRange_(chartEvent.y);},onMouseUp_(chartEvent){chartEvent.stopPropagation();if(!this.histogram)return;this.updateBrushedRange_(chartEvent.y);if(this.prevBrushedBinRange_.range===1&&this.viewState.brushedBinRange.range===1&&(this.prevBrushedBinRange_.min===this.viewState.brushedBinRange.min)){tr.b.Timing.instant('histogram-span','clearBrushedBins');this.viewState.update({brushedBinRange:new tr.b.math.Range()});}else{tr.b.Timing.instant('histogram-span','brushBins');}
-this.mouseDownBinIndex_=undefined;},async onSelectedDiagnosticsChanged_(){await this.rowState.update({diagnosticsTab:this.$.diagnostics.selectedSubView.tabLabel,});if((this.$.diagnostics.selectedSubView===this.$.sample_diagnostics_container)&&this.histogram&&this.viewState.brushedBinRange.isEmpty){const brushedBinRange=tr.b.math.Range.fromExplicitRange(0,this.histogram.allBins.length);await this.viewState.update({brushedBinRange});this.updateDiagnostics_();}},updateDiagnostics_(){let maps=[];for(const bin of this.brushedBins){for(const map of bin.diagnosticMaps){maps.push(map);}}
-if(this.$.merge_sample_diagnostics.checked!==this.viewState.mergeSampleDiagnostics){this.viewState.update({mergeSampleDiagnostics:this.$.merge_sample_diagnostics.checked});}
-if(this.viewState.mergeSampleDiagnostics){const merged=new tr.v.d.DiagnosticMap();for(const map of maps){merged.addDiagnostics(map);}
-maps=[merged];}
-const mark=tr.b.Timing.mark('histogram-span',(this.viewState.mergeSampleDiagnostics?'merge':'split')+'SampleDiagnostics');this.$.sample_diagnostics.diagnosticMaps=maps;mark.end();if(this.anySampleDiagnostics_){this.$.diagnostics.selectedSubView=this.$.sample_diagnostics_container;}},get histogram(){return this.histogram_;},get referenceHistogram(){return this.referenceHistogram_;},getDeltaScalars_(statNames,scalarMap){if(!this.histogram.canCompare(this.referenceHistogram))return;for(const deltaStatName of tr.v.Histogram.getDeltaStatisticsNames(statNames)){if(IGNORE_DELTA_STATISTICS_NAMES.includes(deltaStatName))continue;const scalar=this.histogram.getStatisticScalar(deltaStatName,this.referenceHistogram,this.mwuResult_);if(scalar===undefined)continue;scalarMap.set(deltaStatName,scalar);}},set isYLogScale(logScale){this.chart_.isYLogScale=logScale;},async updateContents_(){this.$.chart.style.display='none';this.$.drag_handle.style.display='none';this.$.container.style.justifyContent='';while(Polymer.dom(this.$.chart).lastChild){Polymer.dom(this.$.chart).removeChild(Polymer.dom(this.$.chart).lastChild);}
-if(!this.histogram)return;this.$.container.style.display='';const scalarMap=new Map();this.getDeltaScalars_(this.histogram.statisticsNames,scalarMap);for(const[name,scalar]of this.histogram.statisticsScalars){scalarMap.set(name,scalar);}
-this.$.stats.scalarMap=scalarMap;this.updateSignificance_();const metricDiagnosticMap=new tr.v.d.DiagnosticMap();const metadataDiagnosticMap=new tr.v.d.DiagnosticMap();for(const[key,diagnostic]of this.histogram.diagnostics){if(diagnostic instanceof tr.v.d.RelatedNameMap)continue;if(tr.v.d.RESERVED_NAMES_SET.has(key)){metadataDiagnosticMap.set(key,diagnostic);}else{metricDiagnosticMap.set(key,diagnostic);}}
-const diagnosticTabs=[];if(metricDiagnosticMap.size){this.$.metric_diagnostics.diagnosticMaps=[metricDiagnosticMap];diagnosticTabs.push(this.$.metric_diagnostics);}
-if(this.anySampleDiagnostics_){diagnosticTabs.push(this.$.sample_diagnostics_container);}
-if(metadataDiagnosticMap.size){this.$.metadata_diagnostics.diagnosticMaps=[metadataDiagnosticMap];diagnosticTabs.push(this.$.metadata_diagnostics);}
-this.$.diagnostics.resetSubViews(diagnosticTabs);this.$.diagnostics.set('tabsHidden',diagnosticTabs.length<2);if(this.histogram.numValues<=1){await this.viewState.update({brushedBinRange:tr.b.math.Range.fromExplicitRange(0,this.histogram.allBins.length)});this.$.container.style.justifyContent='flex-end';return;}
-this.$.chart.style.display='block';this.$.drag_handle.style.display='block';if(this.histogram.allBins.length===1){if(this.histogram.min!==this.histogram.max){this.chart_=new tr.ui.b.BoxChart();Polymer.dom(this.$.chart).appendChild(this.chart_);this.chart_.graphWidth=this.graphWidth;this.chart_.graphHeight=this.graphHeight;this.chart_.hideXAxis=true;this.chart_.data=[{x:'',color:'blue',percentile_0:this.histogram.running.min,percentile_25:this.histogram.getApproximatePercentile(0.25),percentile_50:this.histogram.getApproximatePercentile(0.5),percentile_75:this.histogram.getApproximatePercentile(0.75),percentile_100:this.histogram.running.max,}];}
-this.$.stats_container.style.maxHeight=this.chart_.getBoundingClientRect().height+'px';await this.viewState.update({brushedBinRange:tr.b.math.Range.fromExplicitRange(0,this.histogram.allBins.length)});return;}
-this.chart_=new tr.ui.b.NameBarChart();Polymer.dom(this.$.chart).appendChild(this.chart_);this.chart_.graphWidth=this.graphWidth;this.chart_.graphHeight=this.graphHeight;this.chart_.addEventListener('item-mousedown',this.onMouseDown_.bind(this));this.chart_.addEventListener('item-mousemove',this.onMouseMove_.bind(this));this.chart_.addEventListener('item-mouseup',this.onMouseUp_.bind(this));this.chart_.hideLegend=true;this.chart_.getDataSeries('y').color='blue';this.chart_.xAxisLabel='#';this.chart_.brushedRange=this.viewState.brushedBinRange;if(!this.viewState.brushedBinRange.isEmpty){this.updateDiagnostics_();}
-const chartData=[];const binCounts=[];for(const bin of this.histogram.allBins){let x=bin.range.min;if(x===-Number.MAX_VALUE){x='<'+new tr.b.Scalar(this.histogram.unit,bin.range.max).toString();}else{x=new tr.b.Scalar(this.histogram.unit,x).toString();}
-chartData.push({x,y:bin.count});binCounts.push(bin.count);}
-binCounts.sort((x,y)=>y-x);const dataRange=tr.b.math.Range.fromExplicitRange(0,binCounts[0]);if(binCounts[1]>0&&binCounts[0]>(binCounts[1]*2)){dataRange.max=binCounts[1]*(1+TRUNCATE_BIN_MARGIN);}
-if(binCounts[2]>0&&binCounts[1]>(binCounts[2]*2)){dataRange.max=binCounts[2]*(1+TRUNCATE_BIN_MARGIN);}
-this.chart_.overrideDataRange=dataRange;this.chart_.data=chartData;this.$.stats_container.style.maxHeight=this.chart_.getBoundingClientRect().height+'px';}});});'use strict';tr.exportTo('tr.ui.analysis',function(){const EVENT_FIELD=[{key:'start',label:'Start'},{key:'cpuDuration',label:'CPU Duration'},{key:'duration',label:'Duration'},{key:'cpuSelfTime',label:'CPU Self Time'},{key:'selfTime',label:'Self Time'}];function buildDiagnostics_(slice){const diagnostics={};for(const item of EVENT_FIELD){const fieldName=item.key;if(slice[fieldName]===undefined)continue;diagnostics[fieldName]=new tr.v.d.Scalar(new tr.b.Scalar(tr.b.Unit.byName.timeDurationInMs,slice[fieldName]));}
-diagnostics.args=new tr.v.d.GenericSet([slice.args]);diagnostics.event=new tr.v.d.RelatedEventSet(slice);return diagnostics;}
-Polymer({is:'tr-ui-a-multi-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;this.eventsHaveDuration_=true;this.eventsHaveSubRows_=true;},ready(){this.$.radioPicker.style.display='none';this.$.radioPicker.items=EVENT_FIELD;this.$.radioPicker.select('cpuSelfTime');this.$.radioPicker.addEventListener('change',()=>{if(this.isAttached)this.updateContents_();});this.$.histogramSpan.graphWidth=400;this.$.histogramSpan.canMergeSampleDiagnostics=false;this.$.histogramContainer.style.display='none';},attached(){if(this.currentSelection_!==undefined)this.updateContents_();},set selection(selection){if(selection.length<=1){throw new Error('Only supports multiple items');}
-this.setSelectionWithoutErrorChecks(selection);},get selection(){return this.currentSelection_;},setSelectionWithoutErrorChecks(selection){this.currentSelection_=selection;if(this.isAttached)this.updateContents_();},get eventsHaveDuration(){return this.eventsHaveDuration_;},set eventsHaveDuration(eventsHaveDuration){this.eventsHaveDuration_=eventsHaveDuration;if(this.isAttached)this.updateContents_();},get eventsHaveSubRows(){return this.eventsHaveSubRows_;},set eventsHaveSubRows(eventsHaveSubRows){this.eventsHaveSubRows_=eventsHaveSubRows;if(this.isAttached)this.updateContents_();},buildHistogram_(selectedKey){let leftBoundary=Number.MAX_VALUE;let rightBoundary=tr.b.math.Statistics.percentile(this.currentSelection_,0.95,function(value){leftBoundary=Math.min(leftBoundary,value[selectedKey]);return value[selectedKey];});if(leftBoundary===rightBoundary)rightBoundary+=1;const histogram=new tr.v.Histogram('',tr.b.Unit.byName.timeDurationInMs,tr.v.HistogramBinBoundaries.createLinear(leftBoundary,rightBoundary,Math.ceil(Math.sqrt(this.currentSelection_.length))));histogram.customizeSummaryOptions({sum:false,percentile:[0.5,0.9],});for(const slice of this.currentSelection_){histogram.addSample(slice[selectedKey],buildDiagnostics_(slice));}
-return histogram;},updateContents_(){const selection=this.currentSelection_;if(!selection)return;const eventsByTitle=selection.getEventsOrganizedByTitle();const numTitles=Object.keys(eventsByTitle).length;this.$.eventSummaryTable.configure({showTotals:numTitles>1,eventsByTitle,eventsHaveDuration:this.eventsHaveDuration_,eventsHaveSubRows:this.eventsHaveSubRows_});this.$.selectionSummaryTable.selection=this.currentSelection_;if(numTitles===1){this.$.radioPicker.style.display='block';this.$.histogramContainer.style.display='flex';this.$.histogramSpan.build(this.buildHistogram_(this.$.radioPicker.selectedKey));if(this.$.histogramSpan.histogram.numValues===0){this.$.histogramContainer.style.display='none';}}else{this.$.radioPicker.style.display='none';this.$.histogramContainer.style.display='none';}}});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const FLOW_IN=0x1;const FLOW_OUT=0x2;const FLOW_IN_OUT=FLOW_IN|FLOW_OUT;function FlowClassifier(){this.numEvents_=0;this.eventsByGUID_={};}
-FlowClassifier.prototype={getFS_(event){let fs=this.eventsByGUID_[event.guid];if(fs===undefined){this.numEvents_++;fs={state:0,event};this.eventsByGUID_[event.guid]=fs;}
-return fs;},addInFlow(event){const fs=this.getFS_(event);fs.state|=FLOW_IN;return event;},addOutFlow(event){const fs=this.getFS_(event);fs.state|=FLOW_OUT;return event;},hasEvents(){return this.numEvents_>0;},get inFlowEvents(){const selection=new tr.model.EventSet();for(const guid in this.eventsByGUID_){const fs=this.eventsByGUID_[guid];if(fs.state===FLOW_IN){selection.push(fs.event);}}
-return selection;},get outFlowEvents(){const selection=new tr.model.EventSet();for(const guid in this.eventsByGUID_){const fs=this.eventsByGUID_[guid];if(fs.state===FLOW_OUT){selection.push(fs.event);}}
-return selection;},get internalFlowEvents(){const selection=new tr.model.EventSet();for(const guid in this.eventsByGUID_){const fs=this.eventsByGUID_[guid];if(fs.state===FLOW_IN_OUT){selection.push(fs.event);}}
-return selection;}};return{FlowClassifier,};});'use strict';function*getEventInFlowEvents(event){if(!event.inFlowEvents)return;yield*event.inFlowEvents;}
-function*getEventOutFlowEvents(event){if(!event.outFlowEvents)return;yield*event.outFlowEvents;}
-function*getEventAncestors(event){if(!event.enumerateAllAncestors)return;yield*event.enumerateAllAncestors();}
-function*getEventDescendents(event){if(!event.enumerateAllDescendents)return;yield*event.enumerateAllDescendents();}
-Polymer({is:'tr-ui-a-related-events',ready(){this.eventGroups_=[];this.cancelFunctions_=[];this.$.table.tableColumns=[{title:'Event(s)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.type;if(row.tooltip){typeEl.title=row.tooltip;}
-return typeEl;},width:'150px'},{title:'Link',width:'100%',value(row){const linkEl=document.createElement('tr-ui-a-analysis-link');if(row.name){linkEl.setSelectionAndContent(row.selection,row.name);}else{linkEl.selection=row.selection;}
-return linkEl;}}];},hasRelatedEvents(){return(this.eventGroups_&&this.eventGroups_.length>0);},setRelatedEvents(eventSet){this.cancelAllTasks_();this.eventGroups_=[];this.addRuntimeCallStats_(eventSet);this.addOverlappingV8ICStats_(eventSet);this.addV8GCObjectStats_(eventSet);this.addV8Slices_(eventSet);this.addConnectedFlows_(eventSet);this.addConnectedEvents_(eventSet);this.addOverlappingSamples_(eventSet);this.updateContents_();},addConnectedFlows_(eventSet){const classifier=new tr.ui.analysis.FlowClassifier();eventSet.forEach(function(slice){if(slice.inFlowEvents){slice.inFlowEvents.forEach(function(flow){classifier.addInFlow(flow);});}
-if(slice.outFlowEvents){slice.outFlowEvents.forEach(function(flow){classifier.addOutFlow(flow);});}});if(!classifier.hasEvents())return;const addToEventGroups=function(type,flowEvent){this.eventGroups_.push({type,selection:new tr.model.EventSet(flowEvent),name:flowEvent.title});};classifier.inFlowEvents.forEach(addToEventGroups.bind(this,'Incoming flow'));classifier.outFlowEvents.forEach(addToEventGroups.bind(this,'Outgoing flow'));classifier.internalFlowEvents.forEach(addToEventGroups.bind(this,'Internal flow'));},cancelAllTasks_(){this.cancelFunctions_.forEach(function(cancelFunction){cancelFunction();});this.cancelFunctions_=[];},addConnectedEvents_(eventSet){this.cancelFunctions_.push(this.createEventsLinkIfNeeded_('Preceding events','Add all events that have led to the selected one(s), connected by '+'flow arrows or by call stack.',eventSet,function*(event){yield*getEventInFlowEvents(event);yield*getEventAncestors(event);if(event.startSlice){yield event.startSlice;}}.bind(this)));this.cancelFunctions_.push(this.createEventsLinkIfNeeded_('Following events','Add all events that have been caused by the selected one(s), '+'connected by flow arrows or by call stack.',eventSet,function*(event){yield*getEventOutFlowEvents(event);yield*getEventDescendents(event);if(event.endSlice){yield event.endSlice;}}.bind(this)));this.cancelFunctions_.push(this.createEventsLinkIfNeeded_('All connected events','Add all events connected to the selected one(s) by flow arrows or '+'by call stack.',eventSet,function*(event){yield*getEventInFlowEvents(event);yield*getEventOutFlowEvents(event);yield*getEventAncestors(event);yield*getEventDescendents(event);if(event.startSlice){yield event.startSlice;}
-if(event.endSlice){yield event.endSlice;}}.bind(this)));},createEventsLinkIfNeeded_(title,tooltip,events,connectedFn){events=new tr.model.EventSet(events);const eventsToProcess=new Set(events);let wasChanged=false;let task;let isCanceled=false;function addEventsUntilTimeout(){if(isCanceled)return;const timeout=window.performance.now()+8;while(eventsToProcess.size>0&&window.performance.now()<=timeout){const nextEvent=tr.b.getFirstElement(eventsToProcess);eventsToProcess.delete(nextEvent);for(const eventToAdd of connectedFn(nextEvent)){if(!events.contains(eventToAdd)){events.push(eventToAdd);eventsToProcess.add(eventToAdd);wasChanged=true;}}}
-if(eventsToProcess.size>0){const newTask=new tr.b.Task(addEventsUntilTimeout.bind(this),this);task.after(newTask);task=newTask;return;}
-if(!wasChanged)return;this.eventGroups_.push({type:title,tooltip,selection:events});this.updateContents_();}
-function cancelTask(){isCanceled=true;}
-task=new tr.b.Task(addEventsUntilTimeout.bind(this),this);tr.b.Task.RunWhenIdle(task);return cancelTask;},addOverlappingSamples_(eventSet){const samples=new tr.model.EventSet();for(const slice of eventSet){if(!slice.parentContainer||!slice.parentContainer.samples){continue;}
-const candidates=slice.parentContainer.samples;const range=tr.b.math.Range.fromExplicitRange(slice.start,slice.start+slice.duration);const filteredSamples=range.filterArray(candidates,function(value){return value.start;});for(const sample of filteredSamples){samples.push(sample);}}
-if(samples.length>0){this.eventGroups_.push({type:'Overlapping samples',tooltip:'All samples overlapping the selected slice(s).',selection:samples});}},addV8Slices_(eventSet){const v8Slices=new tr.model.EventSet();for(const slice of eventSet){if(slice.category==='v8'){v8Slices.push(slice);}}
-if(v8Slices.length>0){this.eventGroups_.push({type:'V8 Slices',tooltip:'All V8 slices in the selected slice(s).',selection:v8Slices});}},addRuntimeCallStats_(eventSet){const slices=eventSet.filter(function(slice){return(slice.category==='v8'||slice.category==='disabled-by-default-v8.runtime_stats')&&slice.runtimeCallStats;});if(slices.length>0){this.eventGroups_.push({type:'Runtime call stats table',tooltip:'All V8 slices containing runtime call stats table in the selected slice(s).',selection:slices});}},addV8GCObjectStats_(eventSet){const slices=new tr.model.EventSet();for(const slice of eventSet){if(slice.title==='V8.GC_Objects_Stats'){slices.push(slice);}}
-if(slices.length>0){this.eventGroups_.push({type:'V8 GC stats table',tooltip:'All V8 GC statistics slices in the selected set.',selection:slices});}},addOverlappingV8ICStats_(eventSet){const slices=new tr.model.EventSet();for(const slice of eventSet){if(!slice.parentContainer||!slice.parentContainer.sliceGroup){continue;}
-const sliceGroup=slice.parentContainer.sliceGroup.slices;const range=tr.b.math.Range.fromExplicitRange(slice.start,slice.start+slice.duration);const filteredSlices=range.filterArray(sliceGroup,value=>value.start);const icSlices=filteredSlices.filter(x=>x.title==='V8.ICStats');for(const icSlice of icSlices){slices.push(icSlice);}}
-if(slices.length>0){this.eventGroups_.push({type:'Overlapping V8 IC stats',tooltip:'All V8 IC statistics overlapping the selected set.',selection:slices});}},updateContents_(){const table=this.$.table;if(this.eventGroups_===undefined){table.tableRows=[];}else{table.tableRows=this.eventGroups_.slice();}
-table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-multi-async-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.content.selection=selection;this.$.relatedEvents.setRelatedEvents(selection);if(this.$.relatedEvents.hasRelatedEvents()){this.$.relatedEvents.style.display='';}else{this.$.relatedEvents.style.display='none';}},get relatedEventsToHighlight(){if(!this.$.content.selection)return undefined;const selection=new tr.model.EventSet();this.$.content.selection.forEach(function(asyncEvent){if(!asyncEvent.associatedEvents)return;asyncEvent.associatedEvents.forEach(function(event){selection.push(event);});});if(selection.length)return selection;return undefined;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-async-slice-sub-view',tr.model.AsyncSlice,{multi:true,title:'Async Slices',});'use strict';Polymer({is:'tr-ui-a-multi-cpu-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.$.content.eventsHaveSubRows=false;},get selection(){return this.$.content.selection;},set selection(selection){this.$.content.setSelectionWithoutErrorChecks(selection);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-cpu-slice-sub-view',tr.model.CpuSlice,{multi:true,title:'CPU Slices',});'use strict';Polymer({is:'tr-ui-a-multi-flow-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.$.content.eventsHaveDuration=false;this.$.content.eventsHaveSubRows=false;},set selection(selection){this.$.content.selection=selection;},get selection(){return this.$.content.selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-flow-event-sub-view',tr.model.FlowEvent,{multi:true,title:'Flow Events',});'use strict';Polymer({is:'tr-ui-a-multi-frame-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){Polymer.dom(this).textContent='';const realView=document.createElement('tr-ui-a-multi-event-sub-view');realView.eventsHaveDuration=false;realView.eventsHaveSubRows=false;Polymer.dom(this).appendChild(realView);realView.setSelectionWithoutErrorChecks(selection);this.currentSelection_=selection;},get selection(){return this.currentSelection_;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;const selection=new tr.model.EventSet();this.currentSelection_.forEach(function(frameEvent){frameEvent.associatedEvents.forEach(function(event){selection.push(event);});});return selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-frame-sub-view',tr.model.Frame,{multi:true,title:'Frames',});'use strict';Polymer({is:'tr-ui-a-multi-instant-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){Polymer.dom(this.$.content).textContent='';const realView=document.createElement('tr-ui-a-multi-event-sub-view');realView.eventsHaveDuration=false;realView.eventsHaveSubRows=false;Polymer.dom(this.$.content).appendChild(realView);realView.setSelectionWithoutErrorChecks(selection);this.currentSelection_=selection;},get selection(){return this.currentSelection_;}});'use strict';Polymer({is:'tr-ui-a-multi-object-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},ready(){this.$.content.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;const objectEvents=Array.from(selection).sort(tr.b.math.Range.compareByMinTimes);const timeSpanConfig={unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument};const table=this.$.content;table.tableColumns=[{title:'First',value(event){if(event instanceof tr.model.ObjectSnapshot){return tr.v.ui.createScalarSpan(event.ts,timeSpanConfig);}
-const spanEl=document.createElement('span');Polymer.dom(spanEl).appendChild(tr.v.ui.createScalarSpan(event.creationTs,timeSpanConfig));Polymer.dom(spanEl).appendChild(tr.ui.b.createSpan({textContent:'-',marginLeft:'4px',marginRight:'4px'}));if(event.deletionTs!==Number.MAX_VALUE){Polymer.dom(spanEl).appendChild(tr.v.ui.createScalarSpan(event.deletionTs,timeSpanConfig));}
-return spanEl;},width:'200px'},{title:'Second',value(event){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(event);},event.userFriendlyName);return linkEl;},width:'100%'}];table.tableRows=objectEvents;table.rebuild();}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-object-sub-view',tr.model.ObjectInstance,{multi:true,title:'Object Instances',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-object-sub-view',tr.model.ObjectSnapshot,{multi:true,title:'Object Snapshots',});'use strict';const EventSet=tr.model.EventSet;const CHART_TITLE='Power (W) by ms since vertical sync';Polymer({is:'tr-ui-a-frame-power-usage-chart',ready(){this.chart_=undefined;this.samples_=new EventSet();this.vSyncTimestamps_=[];},attached(){if(this.samples_)this.updateContents_();},get chart(){return this.chart_;},get samples(){return this.samples_;},get vSyncTimestamps(){return this.vSyncTimestamps_;},setData(samples,vSyncTimestamps){this.samples_=(samples===undefined)?new EventSet():samples;this.vSyncTimestamps_=(vSyncTimestamps===undefined)?[]:vSyncTimestamps;if(this.isAttached)this.updateContents_();},updateContents_(){this.clearChart_();const data=this.getDataForLineChart_();if(data.length===0)return;this.chart_=new tr.ui.b.LineChart();Polymer.dom(this.$.content).appendChild(this.chart_);this.chart_.chartTitle=CHART_TITLE;this.chart_.data=data;},clearChart_(){const content=this.$.content;while(Polymer.dom(content).firstChild){Polymer.dom(content).removeChild(Polymer.dom(content).firstChild);}
-this.chart_=undefined;},getDataForLineChart_(){const sortedSamples=this.sortSamplesByTimestampAscending_(this.samples);const vSyncTimestamps=this.vSyncTimestamps.slice();let lastVSyncTimestamp=undefined;const points=[];let frameNumber=0;sortedSamples.forEach(function(sample){while(vSyncTimestamps.length>0&&vSyncTimestamps[0]<=sample.start){lastVSyncTimestamp=vSyncTimestamps.shift();frameNumber++;}
-if(lastVSyncTimestamp===undefined)return;const point={x:sample.start-lastVSyncTimestamp};point['f'+frameNumber]=sample.powerInW;points.push(point);});return points;},sortSamplesByTimestampAscending_(samples){return samples.toArray().sort(function(smpl1,smpl2){return smpl1.start-smpl2.start;});}});'use strict';Polymer({is:'tr-ui-a-power-sample-summary-table',ready(){this.$.table.tableColumns=[{title:'Min power',width:'100px',value(row){return tr.b.Unit.byName.powerInWatts.format(row.min);}},{title:'Max power',width:'100px',value(row){return tr.b.Unit.byName.powerInWatts.format(row.max);}},{title:'Time-weighted average',width:'100px',value(row){return tr.b.Unit.byName.powerInWatts.format(row.timeWeightedAverageInW);}},{title:'Energy consumed',width:'100px',value(row){return tr.b.Unit.byName.energyInJoules.format(row.energyConsumedInJ);}},{title:'Sample count',width:'100%',value(row){return row.sampleCount;}}];this.samples=new tr.model.EventSet();},get samples(){return this.samples_;},set samples(samples){if(samples===this.samples)return;this.samples_=(samples===undefined)?new tr.model.EventSet():samples;this.updateContents_();},updateContents_(){if(this.samples.length===0){this.$.table.tableRows=[];}else{this.$.table.tableRows=[{min:this.getMin(),max:this.getMax(),timeWeightedAverageInW:this.getTimeWeightedAverageInW(),energyConsumedInJ:this.getEnergyConsumedInJ(),sampleCount:this.samples.length}];}
-this.$.table.rebuild();},getMin(){return Math.min.apply(null,this.samples.map(function(sample){return sample.powerInW;}));},getMax(){return Math.max.apply(null,this.samples.map(function(sample){return sample.powerInW;}));},getTimeWeightedAverageInW(){const energyConsumedInJ=this.getEnergyConsumedInJ();if(energyConsumedInJ==='N/A')return'N/A';const durationInS=tr.b.convertUnit(this.samples.bounds.duration,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);return energyConsumedInJ/durationInS;},getEnergyConsumedInJ(){if(this.samples.length<2)return'N/A';const bounds=this.samples.bounds;const series=tr.b.getFirstElement(this.samples).series;return series.getEnergyConsumedInJ(bounds.min,bounds.max);}});'use strict';Polymer({is:'tr-ui-a-multi-power-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},updateContents_(){const samples=this.selection;const vSyncTimestamps=(!samples?[]:tr.b.getFirstElement(samples).series.device.vSyncTimestamps);this.$.summaryTable.samples=samples;this.$.chart.setData(this.selection,vSyncTimestamps);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-power-sample-sub-view',tr.model.PowerSample,{multi:true,title:'Power Samples',});'use strict';(function(){const MultiDimensionalViewBuilder=tr.b.MultiDimensionalViewBuilder;Polymer({is:'tr-ui-a-multi-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.viewOption_=undefined;this.selection_=undefined;},ready(){const viewSelector=tr.ui.b.createSelector(this,'viewOption','tracing.ui.analysis.multi_sample_sub_view',MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW,[{label:'Top-down (Tree)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW},{label:'Top-down (Heavy)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW},{label:'Bottom-up (Heavy)',value:MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW}]);Polymer.dom(this.$.control).appendChild(viewSelector);this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;this.updateContents_();},get viewOption(){return this.viewOption_;},set viewOption(viewOption){this.viewOption_=viewOption;this.updateContents_();},createSamplingSummary_(selection,viewOption){const builder=new MultiDimensionalViewBuilder(1,1);const samples=selection.filter(event=>event instanceof tr.model.Sample);samples.forEach(function(sample){builder.addPath([sample.userFriendlyStack.reverse()],[1],MultiDimensionalViewBuilder.ValueKind.SELF);});return builder.buildView(viewOption);},processSampleRows_(rows){for(const row of rows){let title=row.title[0];let results=/(.*) (Deoptimized reason: .*)/.exec(title);if(results!==null){row.deoptReason=results[2];title=results[1];}
-results=/(.*) url: (.*)/.exec(title);if(results!==null){row.functionName=results[1];row.url=results[2];if(row.functionName===''){row.functionName='(anonymous function)';}
-if(row.url===''){row.url='unknown';}}else{row.functionName=title;row.url='unknown';}
-this.processSampleRows_(row.subRows);}},updateContents_(){if(this.selection===undefined){this.$.table.tableColumns=[];this.$.table.tableRows=[];this.$.table.rebuild();return;}
-const samplingData=this.createSamplingSummary_(this.selection,this.viewOption);const total=samplingData.values[0].total;const columns=[this.createPercentColumn_('Total',total),this.createSamplesColumn_('Total'),this.createPercentColumn_('Self',total),this.createSamplesColumn_('Self'),{title:'Function Name',value(row){if(row.deoptReason!==undefined){const spanEl=tr.ui.b.createSpan({italic:true,color:'#F44336',tooltip:row.deoptReason});spanEl.innerText=row.functionName;return spanEl;}
-return row.functionName;},width:'150px',cmp:(a,b)=>a.functionName.localeCompare(b.functionName),showExpandButtons:true},{title:'Location',value(row){return row.url;},width:'250px',cmp:(a,b)=>a.url.localeCompare(b.url),}];this.processSampleRows_(samplingData.subRows);this.$.table.tableColumns=columns;this.$.table.sortColumnIndex=1;this.$.table.sortDescending=true;this.$.table.tableRows=samplingData.subRows;this.$.table.rebuild();},createPercentColumn_(title,samplingDataTotal){const field=title.toLowerCase();return{title:title+' percent',value(row){return tr.v.ui.createScalarSpan(row.values[0][field]/samplingDataTotal,{customContextRange:tr.b.math.Range.PERCENT_RANGE,unit:tr.b.Unit.byName.normalizedPercentage,context:{minimumFractionDigits:2,maximumFractionDigits:2},});},width:'60px',cmp:(a,b)=>a.values[0][field]-b.values[0][field]};},createSamplesColumn_(title){const field=title.toLowerCase();return{title:title+' samples',value(row){return tr.v.ui.createScalarSpan(row.values[0][field],{unit:tr.b.Unit.byName.unitlessNumber,context:{maximumFractionDigits:0},});},width:'60px',cmp:(a,b)=>a.values[0][field]-b.values[0][field]};}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-sample-sub-view',tr.model.Sample,{multi:true,title:'Samples',});})();'use strict';Polymer({is:'tr-ui-a-multi-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.selection_=undefined;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;if(tr.isExported('tr.ui.e.chrome.cc.RasterTaskSelection')){if(tr.ui.e.chrome.cc.RasterTaskSelection.supports(selection)){const ltvSelection=new tr.ui.e.chrome.cc.RasterTaskSelection(selection);const ltv=new tr.ui.e.chrome.cc.LayerTreeHostImplSnapshotView();ltv.objectSnapshot=ltvSelection.containingSnapshot;ltv.selection=ltvSelection;ltv.extraHighlightsByLayerId=ltvSelection.extraHighlightsByLayerId;Polymer.dom(this.$.content).textContent='';Polymer.dom(this.$.content).appendChild(ltv);this.requiresTallView_=true;return;}}
-Polymer.dom(this.$.content).textContent='';const mesv=document.createElement('tr-ui-a-multi-event-sub-view');mesv.selection=selection;Polymer.dom(this.$.content).appendChild(mesv);const relatedEvents=document.createElement('tr-ui-a-related-events');relatedEvents.setRelatedEvents(selection);if(relatedEvents.hasRelatedEvents()){Polymer.dom(this.$.content).appendChild(relatedEvents);}},get requiresTallView(){if(this.$.content.children.length===0)return false;const childTagName=this.$.content.children[0].tagName;if(childTagName==='TR-UI-A-MULTI-EVENT-SUB-VIEW'){return false;}
-return true;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-thread-slice-sub-view',tr.model.ThreadSlice,{multi:true,title:'Slices',});'use strict';Polymer({is:'tr-ui-a-multi-thread-time-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.$.content.eventsHaveSubRows=false;},get selection(){return this.$.content.selection;},set selection(selection){this.$.content.setSelectionWithoutErrorChecks(selection);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-thread-time-slice-sub-view',tr.model.ThreadTimeSlice,{multi:true,title:'Thread Timeslices',});'use strict';Polymer({is:'tr-ui-a-user-expectation-related-samples-table',ready(){this.samples_=[];this.$.table.tableColumns=[{title:'Event(s)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.type;if(row.tooltip){typeEl.title=row.tooltip;}
-return typeEl;},width:'150px'},{title:'Link',width:'100%',value(row){const linkEl=document.createElement('tr-ui-a-analysis-link');if(row.name){linkEl.setSelectionAndContent(row.selection,row.name);}else{linkEl.selection=row.selection;}
-return linkEl;}}];},hasRelatedSamples(){return(this.samples_&&this.samples_.length>0);},set selection(eventSet){this.samples_=[];const samples=new tr.model.EventSet;eventSet.forEach(function(ue){samples.addEventSet(ue.associatedSamples);}.bind(this));if(samples.length>0){this.samples_.push({type:'Overlapping samples',tooltip:'All samples overlapping the selected user expectation(s).',selection:samples});}
-this.updateContents_();},updateContents_(){const table=this.$.table;if(this.samples_&&this.samples_.length>0){table.tableRows=this.samples_.slice();}else{table.tableRows=[];}
-table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-multi-interaction-record-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){this.currentSelection_=selection;this.$.realView.setSelectionWithoutErrorChecks(selection);this.currentSelection_=selection;this.$.relatedSamples.selection=selection;if(this.$.relatedSamples.hasRelatedSamples()){this.$.events.style.display='';}else{this.$.events.style.display='none';}},get selection(){return this.currentSelection_;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;const selection=new tr.model.EventSet();this.currentSelection_.forEach(function(ir){ir.associatedEvents.forEach(function(event){selection.push(event);});});return selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-user-expectation-sub-view',tr.model.um.UserExpectation,{multi:true,title:'User Expectations',});'use strict';Polymer({is:'tr-ui-a-single-async-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){if(selection.length!==1){throw new Error('Only supports single slices');}
-this.$.content.setSelectionWithoutErrorChecks(selection);this.$.relatedEvents.setRelatedEvents(selection);if(this.$.relatedEvents.hasRelatedEvents()){this.$.relatedEvents.style.display='';}else{this.$.relatedEvents.style.display='none';}},getEventRows_(event){const rows=this.__proto__.__proto__.getEventRows_(event);rows.splice(0,0,{name:'ID',value:event.id});return rows;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;return tr.b.getOnlyElement(this.currentSelection_).associatedEvents;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-async-slice-sub-view',tr.model.AsyncSlice,{multi:false,title:'Async Slice',});'use strict';Polymer({is:'tr-ui-a-single-cpu-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){const cpuSlice=tr.b.getOnlyElement(selection);if(!(cpuSlice instanceof tr.model.CpuSlice)){throw new Error('Only supports thread time slices');}
-this.currentSelection_=selection;const thread=cpuSlice.threadThatWasRunning;const root=Polymer.dom(this.root);if(thread){Polymer.dom(root.querySelector('#process-name')).textContent=thread.parent.userFriendlyName;Polymer.dom(root.querySelector('#thread-name')).textContent=thread.userFriendlyName;}else{root.querySelector('#process-name').parentElement.style.display='none';Polymer.dom(root.querySelector('#thread-name')).textContent=cpuSlice.title;}
-root.querySelector('#start').setValueAndUnit(cpuSlice.start,tr.b.Unit.byName.timeStampInMs);root.querySelector('#duration').setValueAndUnit(cpuSlice.duration,tr.b.Unit.byName.timeDurationInMs);const runningThreadEl=root.querySelector('#running-thread');const timeSlice=cpuSlice.getAssociatedTimeslice();if(!timeSlice){runningThreadEl.parentElement.style.display='none';}else{const threadLink=document.createElement('tr-ui-a-analysis-link');threadLink.selection=new tr.model.EventSet(timeSlice);Polymer.dom(threadLink).textContent='Click to select';runningThreadEl.parentElement.style.display='';Polymer.dom(runningThreadEl).textContent='';Polymer.dom(runningThreadEl).appendChild(threadLink);}
-root.querySelector('#args').object=cpuSlice.args;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-cpu-slice-sub-view',tr.model.CpuSlice,{multi:false,title:'CPU Slice',});'use strict';function createAnalysisLinkTo(event){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet(event),event.userFriendlyName);return linkEl;}
-Polymer({is:'tr-ui-a-single-flow-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],listeners:{'singleEventSubView.customize-rows':'onCustomizeRows_'},set selection(selection){this.currentSelection_=selection;this.$.singleEventSubView.setSelectionWithoutErrorChecks(selection);},get selection(){return this.currentSelection_;},onCustomizeRows_(e){const event=tr.b.getOnlyElement(this.currentSelection_);const rows=e.rows;rows.unshift({name:'ID',value:event.id});rows.push({name:'From',value:createAnalysisLinkTo(event.startSlice)});rows.push({name:'To',value:createAnalysisLinkTo(event.endSlice)});}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-flow-event-sub-view',tr.model.FlowEvent,{multi:false,title:'Flow Event',});'use strict';Polymer({is:'tr-ui-a-single-frame-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.$.asv.selection=tr.b.getOnlyElement(selection).associatedAlerts;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;return tr.b.getOnlyElement(this.currentSelection_).associatedEvents;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-frame-sub-view',tr.model.Frame,{multi:false,title:'Frame',});'use strict';Polymer({is:'tr-ui-a-single-instant-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){Polymer.dom(this.$.content).textContent='';const realView=document.createElement('tr-ui-a-single-event-sub-view');realView.setSelectionWithoutErrorChecks(selection);Polymer.dom(this.$.content).appendChild(realView);this.currentSelection_=selection;},get selection(){return this.currentSelection_;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-instant-event-sub-view',tr.model.InstantEvent,{multi:false,title:'Instant Event',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-instant-event-sub-view',tr.model.InstantEvent,{multi:true,title:'Instant Events',});'use strict';tr.exportTo('tr.ui.analysis',function(){const ObjectInstanceView=tr.ui.b.define('object-instance-view');ObjectInstanceView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.objectInstance_=undefined;},get requiresTallView(){return true;},set modelEvent(obj){this.objectInstance=obj;},get modelEvent(){return this.objectInstance;},get objectInstance(){return this.objectInstance_;},set objectInstance(i){this.objectInstance_=i;this.updateContents();},updateContents(){throw new Error('Not implemented');}};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);options.mandatoryBaseClass=ObjectInstanceView;options.defaultMetadata={showInTrackView:true};tr.b.decorateExtensionRegistry(ObjectInstanceView,options);return{ObjectInstanceView,};});'use strict';Polymer({is:'tr-ui-a-single-object-instance-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get requiresTallView(){if(this.$.content.children.length===0){return false;}
-if(this.$.content.children[0]instanceof
-tr.ui.analysis.ObjectInstanceView){return this.$.content.children[0].requiresTallView;}},get selection(){return this.currentSelection_;},set selection(selection){const instance=tr.b.getOnlyElement(selection);if(!(instance instanceof tr.model.ObjectInstance)){throw new Error('Only supports object instances');}
-Polymer.dom(this.$.content).textContent='';this.currentSelection_=selection;const typeInfo=tr.ui.analysis.ObjectInstanceView.getTypeInfo(instance.category,instance.typeName);if(typeInfo){const customView=new typeInfo.constructor();Polymer.dom(this.$.content).appendChild(customView);customView.modelEvent=instance;}else{this.appendGenericAnalysis_(instance);}},appendGenericAnalysis_(instance){let html='';html+='<div class="title">'+
-instance.typeName+' '+
-instance.id+'</div>\n';html+='<table>';html+='<tr>';html+='<tr><td>creationTs:</td><td>'+
-instance.creationTs+'</td></tr>\n';if(instance.deletionTs!==Number.MAX_VALUE){html+='<tr><td>deletionTs:</td><td>'+
-instance.deletionTs+'</td></tr>\n';}else{html+='<tr><td>deletionTs:</td><td>not deleted</td></tr>\n';}
-html+='<tr><td>snapshots:</td><td id="snapshots"></td></tr>\n';html+='</table>';Polymer.dom(this.$.content).innerHTML=html;const snapshotsEl=Polymer.dom(this.$.content).querySelector('#snapshots');instance.snapshots.forEach(function(snapshot){const snapshotLink=document.createElement('tr-ui-a-analysis-link');snapshotLink.selection=new tr.model.EventSet(snapshot);Polymer.dom(snapshotsEl).appendChild(snapshotLink);});}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-object-instance-sub-view',tr.model.ObjectInstance,{multi:false,title:'Object Instance',});'use strict';Polymer({is:'tr-ui-a-single-object-snapshot-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get requiresTallView(){if(this.children.length===0){return false;}
-if(this.children[0]instanceof tr.ui.analysis.ObjectSnapshotView){return this.children[0].requiresTallView;}},get selection(){return this.currentSelection_;},set selection(selection){const snapshot=tr.b.getOnlyElement(selection);if(!(snapshot instanceof tr.model.ObjectSnapshot)){throw new Error('Only supports object instances');}
-Polymer.dom(this).textContent='';this.currentSelection_=selection;const typeInfo=tr.ui.analysis.ObjectSnapshotView.getTypeInfo(snapshot.objectInstance.category,snapshot.objectInstance.typeName);if(typeInfo){const customView=new typeInfo.constructor();Polymer.dom(this).appendChild(customView);customView.modelEvent=snapshot;}else{this.appendGenericAnalysis_(snapshot);}},appendGenericAnalysis_(snapshot){const instance=snapshot.objectInstance;Polymer.dom(this).textContent='';const titleEl=document.createElement('div');Polymer.dom(titleEl).classList.add('title');Polymer.dom(titleEl).appendChild(document.createTextNode('Snapshot of '));Polymer.dom(this).appendChild(titleEl);const instanceLinkEl=document.createElement('tr-ui-a-analysis-link');instanceLinkEl.selection=new tr.model.EventSet(instance);Polymer.dom(titleEl).appendChild(instanceLinkEl);Polymer.dom(titleEl).appendChild(document.createTextNode(' @ '));Polymer.dom(titleEl).appendChild(tr.v.ui.createScalarSpan(snapshot.ts,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument,inline:true,}));const tableEl=document.createElement('table');Polymer.dom(this).appendChild(tableEl);const rowEl=document.createElement('tr');Polymer.dom(tableEl).appendChild(rowEl);const labelEl=document.createElement('td');Polymer.dom(labelEl).textContent='args:';Polymer.dom(rowEl).appendChild(labelEl);const argsEl=document.createElement('td');argsEl.id='args';Polymer.dom(rowEl).appendChild(argsEl);const objectViewEl=document.createElement('tr-ui-a-generic-object-view');objectViewEl.object=snapshot.args;Polymer.dom(argsEl).appendChild(objectViewEl);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-object-snapshot-sub-view',tr.model.ObjectSnapshot,{multi:false,title:'Object Snapshot',});'use strict';Polymer({is:'tr-ui-a-power-sample-table',ready(){this.$.table.tableColumns=[{title:'Time',width:'100px',value(row){return tr.v.ui.createScalarSpan(row.start,{unit:tr.b.Unit.byName.timeStampInMs});}},{title:'Power',width:'100%',value(row){return tr.v.ui.createScalarSpan(row.powerInW,{unit:tr.b.Unit.byName.powerInWatts});}}];this.sample=undefined;},get sample(){return this.sample_;},set sample(sample){this.sample_=sample;this.updateContents_();},updateContents_(){if(this.sample===undefined){this.$.table.tableRows=[];}else{this.$.table.tableRows=[this.sample];}
-this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-single-power-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},updateContents_(){if(this.selection.length!==1){throw new Error('Cannot pass multiple samples to sample table.');}
-this.$.samplesTable.sample=tr.b.getOnlyElement(this.selection);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-power-sample-sub-view',tr.model.PowerSample,{multi:false,title:'Power Sample',});'use strict';Polymer({is:'tr-ui-a-single-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},ready(){this.$.content.tableColumns=[{title:'',value:row=>row.title,width:'100px'},{title:'',value:row=>row.value,width:'100%'}];this.$.content.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;if(this.currentSelection_===undefined){this.$.content.tableRows=[];return;}
-const sample=tr.b.getOnlyElement(this.currentSelection_);const table=this.$.content;const rows=[];rows.push({title:'Title',value:sample.title});rows.push({title:'Sample time',value:tr.v.ui.createScalarSpan(sample.start,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument})});const callStackTableEl=document.createElement('tr-ui-b-table');callStackTableEl.tableRows=sample.getNodesAsArray().reverse();callStackTableEl.tableColumns=[{title:'function name',value:row=>row.functionName||'(anonymous function)'},{title:'location',value:row=>row.url}];callStackTableEl.rebuild();rows.push({title:'Call stack',value:callStackTableEl});table.tableRows=rows;table.rebuild();}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-sample-sub-view',tr.model.Sample,{multi:false,title:'Sample',});'use strict';Polymer({is:'tr-ui-a-single-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.content.selection=selection;this.$.relatedEvents.setRelatedEvents(selection);if(this.$.relatedEvents.hasRelatedEvents()){this.$.relatedEvents.style.display='';}else{this.$.relatedEvents.style.display='none';}}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-thread-slice-sub-view',tr.model.ThreadSlice,{multi:false,title:'Slice',});'use strict';Polymer({is:'tr-ui-a-single-thread-time-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){const timeSlice=tr.b.getOnlyElement(selection);if(!(timeSlice instanceof tr.model.ThreadTimeSlice)){throw new Error('Only supports thread time slices');}
-this.currentSelection_=selection;const thread=timeSlice.thread;const root=Polymer.dom(this.root);Polymer.dom(root.querySelector('#state')).textContent=timeSlice.title;const stateColor=tr.b.ColorScheme.colorsAsStrings[timeSlice.colorId];root.querySelector('#state').style.backgroundColor=stateColor;Polymer.dom(root.querySelector('#process-name')).textContent=thread.parent.userFriendlyName;Polymer.dom(root.querySelector('#thread-name')).textContent=thread.userFriendlyName;root.querySelector('#start').setValueAndUnit(timeSlice.start,tr.b.Unit.byName.timeStampInMs);root.querySelector('#duration').setValueAndUnit(timeSlice.duration,tr.b.Unit.byName.timeDurationInMs);const onCpuEl=root.querySelector('#on-cpu');Polymer.dom(onCpuEl).textContent='';const runningInsteadEl=root.querySelector('#running-instead');if(timeSlice.cpuOnWhichThreadWasRunning){Polymer.dom(runningInsteadEl.parentElement).removeChild(runningInsteadEl);const cpuLink=document.createElement('tr-ui-a-analysis-link');cpuLink.selection=new tr.model.EventSet(timeSlice.getAssociatedCpuSlice());Polymer.dom(cpuLink).textContent=timeSlice.cpuOnWhichThreadWasRunning.userFriendlyName;Polymer.dom(onCpuEl).appendChild(cpuLink);}else{Polymer.dom(onCpuEl.parentElement).removeChild(onCpuEl);const cpuSliceThatTookCpu=timeSlice.getCpuSliceThatTookCpu();if(cpuSliceThatTookCpu){const cpuLink=document.createElement('tr-ui-a-analysis-link');cpuLink.selection=new tr.model.EventSet(cpuSliceThatTookCpu);if(cpuSliceThatTookCpu.thread){Polymer.dom(cpuLink).textContent=cpuSliceThatTookCpu.thread.userFriendlyName;}else{Polymer.dom(cpuLink).textContent=cpuSliceThatTookCpu.title;}
-Polymer.dom(runningInsteadEl).appendChild(cpuLink);}else{Polymer.dom(runningInsteadEl.parentElement).removeChild(runningInsteadEl);}}
-const argsEl=root.querySelector('#args');if(Object.keys(timeSlice.args).length>0){const argsView=document.createElement('tr-ui-a-generic-object-view');argsView.object=timeSlice.args;argsEl.parentElement.style.display='';Polymer.dom(argsEl).textContent='';Polymer.dom(argsEl).appendChild(argsView);}else{argsEl.parentElement.style.display='none';}}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-thread-time-slice-sub-view',tr.model.ThreadTimeSlice,{multi:false,title:'Thread Timeslice',});'use strict';Polymer({is:'tr-ui-a-single-user-expectation-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.$.realView.addEventListener('customize-rows',this.onCustomizeRows_.bind(this));this.currentSelection_=selection;this.$.realView.setSelectionWithoutErrorChecks(selection);this.$.relatedSamples.selection=selection;if(this.$.relatedSamples.hasRelatedSamples()){this.$.events.style.display='';}else{this.$.events.style.display='none';}},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;return tr.b.getOnlyElement(this.currentSelection_).associatedEvents;},onCustomizeRows_(event){const ue=tr.b.getOnlyElement(this.selection);if(ue.rawCpuMs){event.rows.push({name:'Total CPU',value:tr.v.ui.createScalarSpan(ue.totalCpuMs,{unit:tr.b.Unit.byName.timeDurationInMs})});}}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-user-expectation-sub-view',tr.model.um.UserExpectation,{multi:false,title:'User Expectation',});'use strict';(function(){const EventRegistry=tr.model.EventRegistry;function getTabStripLabel(numEvents){if(numEvents===0){return'Nothing selected. Tap stuff.';}else if(numEvents===1){return'1 item selected.';}
-return numEvents+' items selected.';}
-function createSubView(subViewTypeInfo,selection){let tagName;if(selection.length===1){tagName=subViewTypeInfo.singleTagName;}else{tagName=subViewTypeInfo.multiTagName;}
-if(tagName===undefined){throw new Error('No view registered for '+
-subViewTypeInfo.eventConstructor.name);}
-const subView=document.createElement(tagName);let title;if(selection.length===1){title=subViewTypeInfo.singleTitle;}else{title=subViewTypeInfo.multiTitle;}
-title+=' ('+selection.length+')';subView.tabLabel=title;subView.selection=selection;return subView;}
-Polymer({is:'tr-ui-a-analysis-view',ready(){this.brushingStateController_=undefined;this.lastSelection_=undefined;this.tabView_=document.createElement('tr-ui-b-tab-view');this.tabView_.addEventListener('selected-tab-change',this.onSelectedSubViewChanged_.bind(this));Polymer.dom(this).appendChild(this.tabView_);},set tallMode(value){Polymer.dom(this).classList.toggle('tall-mode',value);},get tallMode(){return Polymer.dom(this).classList.contains('tall-mode');},get tabView(){return this.tabView_;},get brushingStateController(){return this.brushingStateController_;},set brushingStateController(brushingStateController){if(this.brushingStateController_){this.brushingStateController_.removeEventListener('change',this.onSelectionChanged_.bind(this));}
-this.brushingStateController_=brushingStateController;if(this.brushingStateController){this.brushingStateController_.addEventListener('change',this.onSelectionChanged_.bind(this));}
-this.onSelectionChanged_();},get selection(){return this.brushingStateController_.selection;},onSelectionChanged_(e){if(this.lastSelection_&&this.selection.equals(this.lastSelection_)){return;}
-this.lastSelection_=this.selection;this.tallMode=false;this.tabView_.label=getTabStripLabel(this.selection.length);const eventsByBaseTypeName=this.selection.getEventsOrganizedByBaseType(true);const ASV=tr.ui.analysis.AnalysisSubView;const eventsByTagName=ASV.getEventsOrganizedByTypeInfo(this.selection);const newSubViews=[];eventsByTagName.forEach(function(events,typeInfo){newSubViews.push(createSubView(typeInfo,events));});this.tabView_.resetSubViews(newSubViews);},onSelectedSubViewChanged_(){const selectedSubView=this.tabView_.selectedSubView;if(!selectedSubView){this.tallMode=false;this.maybeChangeRelatedEvents_(undefined);return;}
-this.tallMode=selectedSubView.requiresTallView;this.maybeChangeRelatedEvents_(selectedSubView.relatedEventsToHighlight);},maybeChangeRelatedEvents_(events){if(this.brushingStateController){this.brushingStateController.changeAnalysisViewRelatedEvents(events);}}});})();'use strict';tr.exportTo('tr.ui.b',function(){Polymer({is:'tr-ui-b-dropdown',properties:{label:{type:String,value:'',},},open(){if(this.isOpen)return;Polymer.dom(this.$.button).classList.add('open');const buttonRect=this.$.button.getBoundingClientRect();this.$.dialog.style.top=buttonRect.bottom-1+'px';this.$.dialog.style.left=buttonRect.left+'px';this.$.dialog.showModal();const dialogRect=this.$.dialog.getBoundingClientRect();if(dialogRect.right>window.innerWidth){this.$.dialog.style.left=Math.max(0,buttonRect.right-
-dialogRect.width)+'px';}},onDialogTap_(event){if(event.detail.sourceEvent.srcElement!==unwrap(this.$.dialog))return;const dialogRect=this.$.dialog.getBoundingClientRect();let inside=true;inside&=event.detail.x>=dialogRect.left;inside&=event.detail.x<dialogRect.right;inside&=event.detail.y>=dialogRect.top;inside&=event.detail.y<dialogRect.bottom;if(inside)return;event.preventDefault();this.close();},close(){if(!this.isOpen)return;this.$.dialog.close();Polymer.dom(this.$.button).classList.remove('open');this.$.button.focus();},get isOpen(){return this.$.button.classList.contains('open');}});return{};});'use strict';tr.exportTo('tr.ui.b',function(){const FaviconsByHue={blue:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAC4CAYAAABQMybHAAAlrklEQVR4Ae2dCXwdVb3H5265yc3SpEk3ukEXCqVUBLT4Wm19oFKtaN0fKijy9CMguPBarIJsIiA8qsjTh7SllAoFeVBaEARkLV1ooXtL0yRdkqZp9u3uy/v/5uY/OZm75y659+acdnLOnP385zv/+58zZ2YMinTplIAhzsoDceaT2RKUQLwHIMFqh0V2ll0kn4XA6byv9/Vw834kX19e7keRQCzhRyk6bJJYRvD1YTXuhRdeqDj77LPPtNls400mU7HRaCzFFggEVJ/iSqhsicFgKIXUKL6bvB6fz9fj9/u7Kb4bPjaK67Xb7Q0HDhw49IUvfKEd2XUb7WpxHIYvXRgJ8AELkzRso1gmKrwkBfjG7373u5Zly5ZNKS8vn2G1Ws80m83YphPI0wnQUemQFp0IzQR9tdfrxXbI5XId6ujo+PCuu+6qXbNmjYfa9NMmngDoBmt+hIe944M53AUhwqwCvXTp0qJrr732opKSkk8XFhZ+imC+gIAryAZB0QnlJuB3OJ3Ot3p6el5/6KGHttxzzz0O6pse+GEP+3AGnKE2EhgG0tAFt99++4WkoT9tsVgW0DaH4guzAeg4+uD0eDxbaXuDNPzrt9xyy3bS8G4qB8BF6OOoKr+yDDfAB0B91VVXFf72t7+9lLT05QUFBZfQoYWtnA+ux+12v0ra/W+/+tWvXlq5cqWTBjUsYR8OgDPU8KGtjR9++OHHx4wZ8+2ioqKv0X4lbfnsWh0Ox9+bmprWzpgxYxsNFBpd1Op5bcbkM+AMtgr11q1bTz/zzDP/gy4Qv02zGtPzmehIY6MZmmq6UF176NChJ+bMmXOkD3QR9khFczY+HwEXwTbV1NTMI229FCYIXSTm43gTho8uUgMwYUir3zN16tR3qAIfbXkJej4dcIxF1dbkm44ePfqZqqqqpTT7MZf2pYsgAZqN2dTS0nLP5MmTX6EsDDrDHqFU7kTnA+Aa2BMmTDBv2bLliyNHjlxCZsgFuXMYhr6nZL7saGtru/eiiy7aUF9f76UeAfKcBz2XAUffVbgJbAuB/Y3KysoldONl5tDjkrs9oBtL+1tbWwH6UwS6/mZSzg0sVwHXTJG9e/deOGXKlOWksS/MOelncYdJo2+vra396axZs7ZTN0XTJYt7Hdq1XANc1dg0DNOqVatGLl68+DZa/3E1XTwCeOn6JLCly6ncU9+mNLnBZRLOYPAHHI5H2l5/8TdHbl3SRjUx6DkztZgrgKOfDLf5xIkT36moqLiLzJG0rAFJAomsKDp1W51S74IZnSIX8DcrXV3LlK/Oe5xqZPsckGc96LkAOPpowrZ79+5ZNK31BzkzQtKI4qxvV0dJTSLJ592kHKu7QfnPxXupFmhzbFkNeTb/tGsae/bs2Va6wr/lrLPO2izhTgLQZIuaaMp1yvTNyvNbb1HomFB1ZtrAUNYqymztGMNt2rhx44T58+evohs1n0r2+AyX8mnT4KIAvZ63lA82f1/55TX1FJ21tnk2As4zJObq6urP0BTgCmlri2TFDmcEcHQDtnlz4w+Uyz+Hm0Rsm2PuPGtcNpkomtZesGBBYXNz8210d+05CXfWsBLaEQNd5I+e8JyyYettCh0zyoBrpawyWbJFg2twv/jiixPnzZu3mhZFzQ2VqIyJRwIZ0+BiZzyeTcqebVcqS350nKKzxmTJBsDRB3WWZN++fXPpps060tpVouxkODEJDAng6GIg0KI0Hv+mcsXnN9FeVsyyDLWJwnCbadXfomnTpm2UcCcGc1blNhiqlNMmblT+9soi6hdmWKC4hlSJDiXgaBsCsNDKvysnTpz4JIWLaJMupyVgKFLGjHtSefrNK2kYFtpwjIeMs6FqWIOb7kr+Yty4cX+m2+0446XLBwkESHuPrPqz8uymX9BwhhTyoQBchZseQiigdcj30grAO+SDCPlAtW4MeLikdMQdyvqt9yp0rCl1SDR5pgFX4V64cGERvdhmRWlp6XU6scjdfJNAcfF1ysqNK5Q5C2F+ZhzyTF4AqHCPGjXKSjdwHqUHfr+ab8cyW8YzZLMo0QTgcj2jfO/S7ynNzS7KxtOI0UqkJC1TGlyFm3pccPDgwfsk3Ck5drlVidX6VWXFxvvAAG0Z0+SZAJzhtjQ2Ni6ld5D8KLeOjOxtyiRgK/6R8uy7S6m+jF14phtwmEBow3L8+PGr6FnJm1MmLFlRbkqgtOxm5am3rgITtIGNtJrJ6QQcHcdPkYUuKL9MsybLKSydlICijKxcrjz+0pdJFKzJ0wZ5ugBnuM27du2aT7ffV9JUIGCXTkqAJEAsjJ2wQlm1fj7tpPWOZzoAB9yo1/zSSy/NoLdJraMwFsdLJyUgSqBQGX/GOuX+FTMoEpCDmZRr8nQBbqIHgovnzp27mtaWlImjkmEpAU0CYGPmR1crF19cTHH4hU854KmuECcMOmo9derUAyNGjLiawtJlWAJZOQ8eTQb27keUyz7xM8qS8jnyVGpwNk0s+/fv/4qEO9oRlWkDJGArvVpZ89JXKC7lMyupApzhNm/YsGH6GWec8eCAAcgdKYFYEhhz2oPK3X+ZTtlSao+nEnDzxWRL0eNmj0q7O9bRlOkhEoA9ft6cR5WPq/Y4IE+J+ZyKSjS7m56jvK+srEzeqQw5epmNyDkbXBRPT8//Kl++6EaKSok9nqwG10yTHTt2fJpWB0q4xYMlw4lLoJhu5z/y3KepYEpMlWQBV7U3mSXFNN99H71YPfEByRJSAqIEwND4yfcpFyzgqcOkGE2mMGtvy2OPPXY9vZjnTLGfMiwlMGgJWCxnKktv/QmVT3pWZbCAM9zmxx9//IzRo0fj0STppARSJ4HykTcqN//3GVRhUqZKMoCrC6no6Zy7yTSxpW5ksiYpAZKA0WhTPj73dxRKakHWYABn7W3Zs2cPvjH5eXlApATSIoGi4i8oK56/tA9ysAr2EnKDARxlzJdddlkJ3dC5N6HWZGYpgUQlMH7SvbRWpYSKsamSUA2JAs7a2/ynP/3pOvrc9eSEWpOZpQQSlYDZPFn54a/xcDoDnpAWTxRw5DfRJ7DL6HUPP060rzK/lMCgJFA+8sfKZd/CqlRc9yXEbCKZWXtbli1b9gN6EX3loDorC0kJJCoBk6lS+ebVP6BiCU8bJgI48ppxU2fs2LHXJNpHmV9KICkJVFZdo3zsY7j5w6ZKXNXFCzhrb/PDDz/8HbK9x8ZVu8wkJZAqCZjNY5Wf3vkdqo4Bj8sWjxdw5DPRt3KKTjvtNNxhkk5KIPMSqBz1E2Xq7ITekBUP4Ky9LevWrfsGae9JmR+ZbFFKgCRgLpik3HL3NygUty0eD+Cq9h4/fnwBbTdIQUsJDKkERo+9QSkr47ubMfmNlQHaG5v56aef/ndaUDVtSAcnG5cSMFumKXc/fDGYpI35jCiXeADH3KOZ7lp+Sy6HjShHmZApCWA57dgJ3wKTtIFNQB7RxQIc6abLL7+cniEesTBiLTJBSiCTEiguWah8/isjqEkAHpXhaIk4M5BuXrp06ZfoOUtcvUonJTD0EjCaipSvff9L1JGYU4bRAEeaCjh9P+fr0jwZ+uMqe9AnAZgpo0Z/nfYY8IgcR0qA9sZmeuCBBybZbLZ/66taelIC2SEBKzF5zTJMWbMdDl5DXDTAVe29aNGib5D2jpQvpEIZISWQEQkYicm5C0QtnjDg6uwJPY72tYx0WDYiJZCoBMorGXDW4iE1hNPMOBMQb1qzZs0MmvueHlJKRmS1BCZYYZoOA2exTFd+dT/eTsuzKSFaPJwkNMDPO++8+fLiMvdA+Z8JJcqPN+9RGnocoZ0PBELjFF2cbjdYIEykvq4wWehd4APb05dBari4gaWCe/p8AT+uFOdT4j7aoJTB7oAGowFurqqqmicBV5QPmgLKX3b7lVbHANmRLLPVVSjnGT6hzFRa44dHHEqIHhQThXC8+YQiqQ66K9rnvakoD1O9DPiAJvSAo8vYjMXFxWZ6U9VFA3IP052fv+5VGntzBW4+SCYl4KtQ/L3tpCBJ0+WpC/hKLgKrvb29DDj41Q4WIvUOcaZHH310lslkGqlPHI77uQd38CgZTBbSVBVKXk+CGYwjS758/ywwS1sIz/oI1uCmmTNnflKaJ7l/OmuQG3migQ9xnvg0W2gaN/2TfYDzoLQDFw5wVYOT/T1XAq7JKacDKuS2csVg1B/unB6W2nkwaiiumEs7rMEBueZEG5zpN9Gt+QKyv+douWQg5yXAkPvtHYO78MxiCZisJXNsVRML7C3HndRN5li1w/WnNPaNDz744Ll0ZpRm8Zhk1wYhAYacjPJBlM7eIgHFUFryxZvPpR6q/Io9DavBJ0yYcJY0T0Qx5U84CDnNrtjb82dQZHqZysefRQPaRltEDc4JRlr7PS1/Ri9HopeAwWRWjLYKQiF/NLnBWgpmocGZY3XYoomCBOybaPXgNKnBVfnk7R8V8qLyvIAcrBoLiqaCXdoYcvXYMeB8KmPfSIBPUVPln7yWQD/kjEEOD7fABsBVfvtGoTIdYoOPHDnSXFhYODmHhyq7noAEgpCPUPyOTiql3QBMoIbsyGo0F04uInYdbW3RTZRbb711AnXZmh3dlr3IhAQYcpooz0RzaWmDTk1r0YLrwS4GwRaJuoMGmXrjOeecI5fHQiLDzKmQF9ILXFXIGYfc8q2jZ4JdBlyFnE9ZHolx1KhR8gJzmMHNw9Ugz8U7nrijWToyZCZFtMEBu7GoqGgiD1j6w08CKuTWUsXv6s65O56GApVdlWM+cnoNbqB3D+JzEdINYwkw5DlnkxvNYJetEdVEETU4Ioy0RLZEzoEPY7r7hh6EvIQ0eQ/FZP/sCpilPgNwKG0VbgyFdzTqCXC8ZFw6KQEAoxgLS3NoPbkR7GosIyxqcBxSgwQcYpCOJWDAOnIrKUbS5AH9M5GcKUt8OiEZcK1HbIMjQiVfAq7JRgb6JADIDQR5tpuuAaMGuGaisAbXIiTgkutwEujX5L2UnJ02uSEIOHdfZVpqcBaH9GNKIKjJQ6yAmOUylYHsa+6cprBZg3MfpA3OkpB+WAkENXmxEnDbs2+e3KABrvU9RINTih56LbMMSAlAAqomL7BRQFOU2SGYgMouOqV1jGHWIrxer50+8iofV8uOQ5a1vVA1OUEecOPtWdlhkxsUH/2saE5lmufBtVifz4erCOmkBGJKIKjJ8V0ETT/GLJPODAG/X8+uOg+O0087BaHB09kJWXd+SSCoyYuUgIceaB/qeXL/AA2uci3a4JB8QGrw/AIwE6NRNbmlcMht8oBftT40ZY2xsw2OsJogAYcopEtUAqomt5Am9w6dJg8ENPNagzysBs/2W7KJCl/mz4wE8OYsg3loNLnKbNAG1+DGqFmDI1LdpA2eGRjytRX19XAEecDr6kMqcyM1BNTrR41ltCxqcAYc6yOlkxIYtASCmhyP9WZ2doVmUXhtL1hWHWtw3lccDkcb1H22L6zROiwDWSmBoCa39mnyDHSRmPV7nG36lliDs1r3t7e31+kzyX0pgcFIQNPkGbrj6be3gV287Z95Vk0U7MCpkdXV1bXyIjMoEPk3eQmokJsKglOIAD1tm6J4Wo7UMsd9PQ+wBse+CvgzzzwjAe+TjvRSIwGGnB4qS02F4WohE8W58zk94CGzKP6XX3652+VyNdN6lFHh6pFxUgKDkQAgDygWxeDzDKZ47DJeV3PvvtfpVQChJgoKs80C+8Xf09NzRJopEIt0qZQAIFfou0GpXoUIVv0uxxHqq8ov+cxzyDShmsFut9elcmCyLikBloAKuZEm71Jsi/vdKrMi4GqTbIMz8cjgw0yK1OB8SKSfagkMgDwVlZMGDzg6oJR9tIFh5lmzwdEMR/pPnjxZiwjppATSJQHVJg/QRaffm3wT9Gvg624GswPgRsXhNLh//fr1u2nRFYCXTkogbRJQbybCXEl2diXgCzh2bthNFQHwAZAz4BgEgEaijz4C29zZ2VkjzRSIRbp0SiAIOT7MgCnExDeyThS/s7uma+vaZqpANFHUbusBZ8i9ra2tWyXgqozknzRLQIMcF56JOiLc19O6lYrB1hmgvVGVCDj2VQ1Ovq+mpmaLBBwikS4TElAhx7vJE55dIWhb6rZQH6G9WYNrXRYBh/ZmDe5buXLlVj85LacMSAmkWQIa5Im0Q4x2bXkUGpzhZo7VWsIBrp4JGzZsaCc7/KDU4olIW+ZNVgL9kMe2x4P2d+dB+86X8NFP1uARAUffWIPDnvHSdOE2CTjEIl0mJRCEPA57nAj3dzXj468qr+SzDa51V9TgiGTAcTZ4yQ7fLAHXZCUDGZSABnlUm5wgba3dDFZpE00Uraf6Bx5YveNM8C5fvnzbJZdc4iwuLqYH7Yavq+ytURq70rRIKIvEGlmZAYswDjZCRBchLUJ0ULeGqYzaQL8AfEj/PA5nz8u/Zw3O2ntAC+EAR0bVnnn33Xe7Gxsb35gyZcqlxhR9mGj/oU7liWfrlPZOd5jRZGfUbK9bmUnPGIYIeEB3B8i1PyUKBHTo+vPFEYrcfpR6orYfR6NZmiUQ8Cs9XU1vbDiyEysI2f5myLVe6wFHAqSlanDyPTt37nz+9NNPTxngv/3DHqW5lV4tkGPO67ErPi+9pgw/mYAGfjyO8zJo+vL6dH2dmc6vb1/fP31/9Pn1+7HK69P15fXt9eUP+LxKR/OB5yk7flrFOfABNehtcCSKgHuvu+66t2n5bGtk7TGgvpg7uQg3BmW22BSTGa8pIwehx+s4L3wxzOXFOM4j+sjHecSwmEcMi3nEsJhHDIt5ENY75IXjMhxWI+P4E6u8Pp3bYV/fHsWDRb/f1Vq3b9XblBzxAhNFowEOte+hlYWO+vr6f6QKcDSaq06F3FQYdeUEow9fDGfLmMU+ieFI/RPziOFU5Y9UT/T4gOJ2tP/D7e7Bmz+hwcNeYKKOcIAjHiaKZqa8+uqr6+l9KYgf9g6QG/sgxwHXbxAQgyCG9fmGal/skxiO1B8xjxhOVf5I9USLV8j+7mjd/Rz1RzRPwGuIiwQ4zBScFaDas3Tp0r0dHR2HpRYPyo8hD+7Jv5mUABj0eeyHjx58Yh+1y4CDVTAb4qIBzpCjEjfNiW+Qd+775dcPeTRdI9NCf+OSlQl98M3RvAFM0sbmCVhNCHAcSah8TYuvXr16PT2MjAql65OAapPjXXzRnP4iCnk5Llw5ToMvhsPlzYU4cQxiOFLfxTxiuC+/3+/xNB9/cz3tito7rHmCIpE0ONJwRrAd7l61alXjkSNHXpBaHKLpd5hZMfELJ3FA9Buy8oESw/p8vC/mEcOcnmu+OAYxHGkcYh4xTPlx38DtaHnhZP3rjZQEDR5xehBF4eIFXDVT1q5d+whp8YhnS7DK4fdXhdyEd/FJl04J+ANef3PDpkeoDTZPkgIcfR2gxe+7776aY8eO/VNq8dDD2A95sjamLE8/eSTggRsuLj2Otn821D5fQ4lxaW8cpWgaHOnQ1pqZQmHXU0899VePxxPWoEeB4ewYchwadhzmw4V4jhPDnJ6oL9YhhuOtRywjhuMtr88n1iGGOZ8YJ4Y5PZKv+H2BthOb/0pl8F5mEfCoFkUswNEHVICLTdVMufPOOw+QFn9TanGIJtTBHjeSucIHCjkQZsfhSOmcL14/2fqSLa/vZ6z6YqXr68M+1p24nK1vHq3++wHaZfMETEaFG2XjARzaWgOcwq4XX3zxYdLiKC9dGAkw5Pqf2czso0OMkRhGXG5u9N5vpb3p/YdpAKy9AR+YjGlJxAs4a3GcPa4lS5bsOnHixGapxUkaEVwQcnqrasYdw80wowMcl/HOJN0gtLfb1bH5yMHHd1FlDDhr75QAjk6yFsdVKyB3bty48UE5owLRRHYa5JgSY8dhniZDPMeJYU5P1BfrEMOR6hHzIBzLcV8j1aePR31cRgxzPjFODPel+xWvv6N5x4OUhCWoYA8MxqW9KV9cJgryAXBocQbcdeONN+6kd4k/J9eoQDyRnQq5se+Fk3yg2UcxDvcdULUmjotcbeQULhtvffr8XC6Sj5a5TORe9KdwXq5PXz5KOn0WUHH2nnyudt/qnVSMtXfMqcH+xuMHHGVYi6sXm2jwpptuWk4PJrfLNSqiSEPDGuShSTImggTUNSdee/uxA2uXUxaGO27bm6uNxwbnvKzF8fOABp2vvfZa89atW/8oLzhZRJF9zVyJnEWmCBKgb14qPZ01f2xv3o03VsE8AXNx295cVSKAo4yoxVXIFy9e/Aw91rZLXnCySCP7Jpo+NNLnPMQvHXAYfjz/UDuXEcNcVowTw5yeal9sQwxHakfMI4bF/HhiyuPq2LV/293PUB6GO2HtjfoHA7g4o4LGnWvWrLnL6XT6pKkCkUZ3gNxAL4HnA4rcCMfrOG+k8rHS420n3nyJthcrPxgK+D2+5oa37qI+qHyRj4vLhLU3xpAo4CjDgOOMUrX4HXfcse/AgQPr6I20SJcuhgQYcvVijS++pN938RpQHD0n1h378Cms99Zrb7CXkBsM4GiAIVenDGnfccMNNzzU0tLSKE2V+OSvmiuYXZFOkwDmvD2e7saa/X99iCLxOBoAF7W3ljfewGABZ1ucpw2d7733XusTTzxxE33+xCNNlfjED3vcqELON2WGr0+WCS03cXtaTmy6qbutppUkyHAnNO+tl/xgAUc9DLmmxWnacAeB/hDdANK3I/cjSCAIebi3d0QokKfRZHcrvZ01D9XtW72DhqjX3mBtUC5ZwGGqaFqcws5LL7109dGjR9+WN4DiPx7DHXLc0HE5Wt7es/m21WCob4PiTOimTjiJJwM46gPg2PiCE2ee/Wc/+9lvyB5vkvY4SSNO12+uxFkgT7LB7vZ6uptq9678DQ3JThsYggkAppgvCg7OJQs4WkUnMH2CMw6dc9ANoJNPPvnkL8ke90p7nCQSpzPS9CFscryHbzhsEEvA7/a2NLzzy46WXSdpV+WH/KQuLFEvu1QAzrY4mypqJ+lVE9u3bdv2Z9jjEnIWd2wfkBsM+W+T9813093K6j/X7l+9nSQjwp3UhaUo5VQAjvoY8gGmysKFC1fSgqxX3G6ckNLFKwEVcu3rY/k5swK729Hb9Mqed29fSXLRmyawCAZ9YSnKOVWAo06GHDTjQgGdti9atOjXdNH5noScpJGAU00VI74+ln+OXv2gOJ0t7x3cduevaXQqJ+TztGDK4IbkUg24aI+rkNNXIrquuOKKG+kBiYNyURZEHr/LR8j99OFXt6v94KH377/R4WjtImkAcBFuMJQS7Q1Jp0NFoHNiBw0Eube2tnbT/PnzFzz3UtMIA76mJV1cEjAYcIhInLgTkuMOZonH3XW8dvdff9zZur+JhtNLGwMO8zal2hviSgfgqBduAOhki7u6u7u3NHWO+yxNidkk5EEhxfM3CHmfSHN0zQq98Fjxunta6w+v+9GphneO0Wj0cKdUc7Nc0wW4qG608AcffNBrMlvfLx0x5XMGo7lAQs6HIbbfLytNnLELZUkOrO2mF2b2nDz64rX1hzccpG7p4YbmBuApd+kCHB3lI8G+2vnOlr0dBYVV+4tKxl1MswWW/gOX8rHlXYUsq+C8ChaeZv8/vOqYvo5hb2l48+d1+9fiNrwId8rmuyMd7HQCLrYJyDXQ20/tOGUxF+6wlU1aYDQWFPGBEwvIcHgJ9MtKE2f4jFkQq9rcnu72xrp//OTIgccx181wY8477XBDBJkGXAO9o2VPm+JzbioZMXWewVRQ2n/g0C3poklgoKyyc57cTxeUXnfHCVrXfU1D7fr9NJ4e2gA4w530OpNoMuK0TAGO9ljlaJB3tVd3u1yNb5ZVzPy40Wyt7L+Y4u5JP5IE+iFnsUbKmfl4zHN7nG3VdXtWXNvU8GYd9QBgZxxujDyTgKM9OAZc9e1dDY6ejoOvl1fNnm0yFY1TaApR/QhoMK/8G0UCGuQGEmUWKHK83jhA89z0gvoPDu1cfn1b864T1H29WZIRzc1iyzTgA+CmTqj7Lkeru6156xsVoy+cQk+fn44DJyHnQxTd1yBXRRk9bzpTsSrQ7/MoLvvJN/a/d9uSno5jLdQew40bOVghmFG4Md5MA4424UJA97rtvub6f71VPupcq9lSNttgNBLj8oZQUFzR/w6UU+ZVOeD2eV2B3u7ax/a9e/PvXI7OTuqxCDcuKDMON6Q2VICjbYacJ/jpHYte/8mjr35gtVUdLCwaPYfmyunDlFKbQ1ixXBByiDRzTl0RGPBiPXd7S8Pbyw68d+/TdAz5YlK8QzkkcEMSQwk42mfI4Wugt53c3uB0nHyttHz6THo4dywOnjRZIK7ojiHPxOw4lg4EYJI4mnfW7V95ff3h9bupd9DarLlhkohTgZk9+/pElS2AA27eVOjt3fW9p4699kr5qFkmc0HZR6TJ0nfEYngDzZUYmQeZrN6ZhEnSeXj1nk2/vr2nsw5vn4LGZrj1i6cG2VLyxYYacIyAz2zW4hro9HPnO3nstZ2FhZX7Cm1j5tCDAEWkyqU2j3HctV+7FJvjWE+CWRKvt6utpeGtX+7f/vv/6zNJGG7McfPFZNpuv8cY/oDkbAAcHRIhF0FXw21N2084HfWv2UonjaHPhEwJaikJ+oAjqdvRINfFD2ZXfSILF5I+Fz2kUP/akT0rlhyv2bCX6mKNDcD1N3CgqIbc4RzPJof+YOoEJx7eioNPl+FDlHSxqdgQnj77h5+oGPeJXxQUlE3Cg7qZ+EmmdnPWYYYjGRec/nMrbnfnsbaT2+6v2f3wZqoPJghDzVOAvNwVDbLCSqbplJTNNsAxKP5hBeR4OBGfSQDkDHpRYWFFyYzzf/Gd4oqpV5JGt+IZxlRqLGorr1zwmdjEmOMZEp/X4erpqFld/f4Djzud7ZghgabGBrDZ1sYsCa/lTqwhKphOly0min6MLCT42KAV2Kbzeb1Ob9Pxf+32utteLSqZOJ4++jRJmi16Efbv95/8rDsi++pzFX3mCM1kvXPkw7X/Vbd31eskc3H6D9pbhBvHJ7mfiv7upjSUjRpcHCD6xyYLa3PW6DBbVM0+4/yffKq88iPXmq0jJuOdf/J2vyjC/nBQk/fviyHRzva6u462N+96qHrng29RHtbUrLUx9cc3bljpsEISq8yKcLYDzkIC5Aw6bHNAzva5CrnZbC6c/pHrLykbefYVZmv5NAk6iy66PwBsV8fhrrYDj1Xv+uOr9GYyBpt9ntcWbe2s1NriiHMFcPSZtTlAhzZn0AE4ww7fOuP86z45ovLcKyzWkecEL0RN0kYnwYguaGP78MJLetl8277O1j2Pffj+n96mPAAZG8BmHxobYPMdSYCdtVqb+qa5XAKcO40+49qBQYc2Z42uAk77qj919tUfqxh1wZXWosrz6cEKslxQbPhOLwZNFKz4I7D9broL2fp+e/OO1TW7H3mPBMNgi75ojgBqvpCkYG64XAQckkW/sYlmCzQ6Ty2KoBeccc53Z5eP/uiXrIWjFpjNRTaD+no0FM1/2DWo6cIRb3D1eh12l7P5jY5TH6yv27cGt9cBsQg1wtDWvIl2dk5obeq75nIVcB4AQ86gs+nCoLNmV7V8YcnY4ikzvr3ANuKMz1mLqi4k0E3q+7nVu6OoIn+cOv9NUyJ4+ACfBKG3t263d9a9XPvh2jecPSdxg4a1M4BmyBlqnvaD1s4ZcyTc0ct1wHlMetBhi7CNziYM+6qmrzrtwtHjJi/6rK1k/OfoiblpAJ1hz0XNzpoai6AANTafu/uwvafh5cajG//ZcmL7KZIJA8xwiz7SoK1ZY+c02DQO1eUL4OJ4grZH0E6HRmetDsAZetE3T5q6eHr5mPPmWQurzjcXls8i0K20VFcx4iWYeA9JFpoyA4CmJatYI0JQu7zOjr0uZ8v7HU073zlW82w1dR7aGPAC5nA+0llj8z2HnDNFaAxhXb4BzoMMUtlvo0Ojs1bXA69qdEqHby4sLLeOm7p4Vln5tAsshRXnFxSMOJseirbgAhXPjAZvmrDYgn7/jRRuPjV+EGLUxbzRBSKWqdJ7RnChGKBPftAt9AMeZ/v7XR2HdzTWPLvX6eyAycFQA2jeGHBOY23NGhuNcEMUzA/HRyo/RhM6ChF0aHbRVhe1O0POceybiovH28ZNW/SR4pJJ55oLiieZzLZJJottPFY2BoHHWnWAT1Wr0owkUn18JJYoHv9xUQiQNd/roJfnNPi89mNed++x3p5jexoPb9zV29uAu4qAlDUx+ww2fI6Dz0CL9nWkzlD23HZ6qef2aKL3HmNl84VBZ83OQEfyOR98lDWOnjB3dFnFOZOttjGTLIWlk81m20RaMlBpUEw2Ay2QoRPARg1SffQXF7F9vtpFaOEgxbSrhuhDAV57gBZ+BBSf3e9ztXq99uMeZ/dRl73pWFf7vqOn6jfBhmYoRe0rwhsuLOZlu5p9tTv5/Gc4Ac7HEWMWN4ZW9AE6Q83Q8z6fHKKvQq+r10DmjrmoZEKx1Ta6yGItK7aYy7AiUvF4u+weV1evy37K4eip7yWzAmBCi4obwwyfta7oI8xAM8TYF/NwWbHevNXWNPYQNxwBF4Uggo4wg8q+CL0IuAg350Ec18H1oi0xjH3RMXiI4zBrVwZcDyxDy1DzPudnn+tjX2x32IQhfOmCEmBZMJDwGXQxLMYBbqSxz5AjDg4+b7wPH9DBMXz6fUCKOEAs+gwv+0gTw9jHBsd+cG+Y/uUDMUyHH3XYLBsGNJIvQq3PgwbEesQGGUDRR1i/Mez6eHEf9WJfOp0EWPi6aLkbQQIsLwYZ2aLFiekRqhwAJkPK8KJMtLhIdcr4PgnwwZECSU4Cejnq91G7Po7BFVvWx+n3xbwyHIcE/h9VLWRYHWXC/QAAAABJRU5ErkJggg==',green:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAC4CAYAAABQMybHAAAltklEQVR4Ae2dCXQcxZnHR3NoNDp8SD7kU7bxFXCchBhMYoLNmhCcOBBykGw2gYTkPV6AhGXD2sTZJQcJG3jsgw3hscuCsTEsOAQW1sbY+MAHxpYtHzI+5EOy5UMStnWPZkZzab9/j75WTWt6NKO5Z6r82lVdXV1d9e/ffPq6uro7zyBDIhXIi7DyngjLyWJRKhDpCYiy2pwoztrpxSwCb+d1bayFm9f1Yu3+cj2MAgOJH2bXnNnEGiHWppW8d999d/inPvWp6YWFheNMJlOR0WgswdLT06PElFdM+xbn5eWVQDXK76TI7vP57H6/v5PyOxFjobwuh8Nx4dixYye+9rWvtaK4ZqFVNY/TiGUIoQCfsBCbcjaLNVHgJRUQG3/4wx9ali1bNmXYsGEzrFbrdLPZjGUagTyNAB2ZCLXoh3CJoD/p9XqxnOju7j7R1tZ2/LHHHqtbtWqVh47pp0X8AaAZbPmRzvnAJzPXhRBhVoBeunSp7b777ruuuLj4xoKCghsI5s8TcPnpIBT9oNwE/D6Xy7Xdbrd/8Oyzz+5+/PHHndQ2LfA5D3suA85QGwmMPLLQ+b///e/nkIW+0WKxLKBlLuUXpAPQEbTB5fF4KmnZShb+g0ceeaSKLLyb9gPgIvQRVJVdRXIN8CCo77777oI//vGPt5CV/n5+fv5NdGrhK2dDsLvd7k1k3f/n17/+9frly5e7qFM5CXsuAM5QI4a1Nh4/fvza0aNH/4PNZvs2rZfRks2h2el0/u2TTz55dcaMGXuoo7DoolXPajcmmwFnsBWoKysrJ02fPv3v6QLxH2hUY1o2E63XNxqhOUkXqq+eOHHitblz557pBV2EXW/XjM3PRsBFsE21tbXXk7VeCheELhKzsb9Rw0cXqT1wYciqP37FFVd8SBX4aMlK0LPphKMvirWm2FRfX//lESNGLKXRj3m0LoOOAjQas/Py5cuPV1RUbKQiDDrDrrNX5mRnA+Aq2OPHjzfv3r3766WlpUvIDfl85pyG1LeU3Jd9LS0tT1x33XVrzp8/76UWAfKMBz2TAUfbFbgJbAuBfUdZWdkSuvFyZepxydwW0I2lo83NzQD9rwS69mZSxnUsUwFXXZHDhw/PmTJlytNksedknPpp3GCy6FV1dXX/OGvWrCpqpui6pHGr+zct0wBXLDZ1w/TSSy+V3n777b+j+R8/pYtHAC9DrwIO9xHD5c5XDF5fS0ya0MWo3+nwvrBx47nfLLlvKypj0DNmaDFTAEc7GW5zQ0PDD4YPH/4YuSMJmQMSExVpsPPxhjsMHt/FuLWkp8dwqb3dt2zhnD2vUKXsnwPytAc9EwBHG01YDh06NIuGtf5DjoyQGmHC4XMLwmwd/Caft2fnmXr3A3d8Zf9hqgXWHEtaQ57Of9pViz179mwrXeE/MnPmzF0S7sEDGuueJnPevCuusO76sPq6R2bPHm2l+sy0gKG0NZTp2jCG27R27drx8+fPf4lu1NwQ6wnKlf0TZcFF/bwe//Z9uxw/vvfuj89Tftr65ukIOI+QmE+ePPllGgJ8UfraIloDp5MBOFoB37zxQvdPvr5gP24SsW+OsfO0CenkoqhWe8GCBQWXLl36Hd1de1vCnTas9GtIXp5h5LgJ1re3H7z2dwsWjMTUYlwrpZXLki4WXIV73bp1E66//vqVNClK3mLvh1RkGcmy4GJr3B7/zkOVXXfd86PD5yg/bVyWdAAcbVBGSY4cOTKPbtqsJqs9QhRPpqNTIBWAo4U0l+1yw1nXd29duH8nrabFKEuqXRSG20yz/hZPnTp1rYQ7OpjTqTRNUhwxtsK69t3tcxZTuzDCAsOVUiOaSsBxbAhgoZl/d02YMOF1SttokSGDFSCabeVj819/v3LOXdQNCy04xynjLFUHVuGmu5K/HDNmzHN0ux2/eBmyQoEe84gRluc2V13zS+pOSiFPBeAK3PQQQj7NQ36CZgA+Kh9EyAqqgzpBQ4h5w4aZH6URlidwrmljSix5sgFX4F60aJGNXmzzYklJyf1BqsiVrFOgqNh0/5ubJr24aFEp3M+kQ57MCwAF7pEjR1rpBs4KeuD3W1l3NtOkQ6kaRQnXfZfL/+Y3bqz7Ed3f6KZyPIwYbpe4bEuWBVfgphbn19TUPCnhjsu5y6hKCgqM33pr4+QnwQAtSbPkyQCc4bY0NjYupXeQ3JNRZ0Y2Nm4KFBab7tlSdc1SqjBpF56JBhwuEI5hOXfu3N30rOS/xk0tWVFGKjB0mPlfN1bOuRtM0AI2EuomJxJwNBx/iix0QfkNupJ+mtIySAUMpSPyn16z5fPfICnYkicM8kQBznCbq6ur59Pt9+U0FAjYZZAK4J6+aczE/BffWn/1fJIjoXc8EwE44Ea95vXr18+gt0mtpjQmx8sgFVAVIEgKJkzJX/2fq66aQZmAHMzE3ZInCnATPRBcNG/evJU0t2SI2iuZkAoIChiNeUM+O6d45cLbxxVRNv7Cxx3weFeIHwwaar148eJTQ4cO/SmlZUiyAuk4Dh5Ogs5O3wsLPrfnQSoT9zHyeFpw/FhQn+Xo0aPflHCHO6Vym6hASYnpp29v+dw3wQ4tYChuhjdegDPc5jVr1kybPHnyM2IHZFoqMJAC48Zbn/nzi1dNo3Jx9cfjCbh54cKFRfS42Qrpdw90OuV2rQLwx6/9QvGKhQsVfxyQx8WKx6MS/EgUv5vmGTw5ZMgQeadSe/aSvJ5pPrgoj73D91/zr97zEOXFxR+P1YKrrsm+fftupNmBEm7xbMl01AoUlRjvWb1u9o20Y1xclVgBV6w3uSVFNN79JL3LLuoOyR2kAqICYKhisu3JBQvG8tBhTIzGsjNbb8vLL7/8C3oxz3SxoTItFRisAhaLcfqyP435Oe0f86jKYAFnuM2vvPLK5FGjRuHRJBmkAnFToLTM8tCfnpk5mSqMyVWJBXBcWFro6Zw/0Z+Vwrj1TFYkFSAFwNQX5w/5N0rGNCFrMICz9bZ8/PHH+MbkV+UZkQokQoGiQtPX/rb+M7f0Qg5WwV5UYTCAYx/zrbfeWkw3dJ6I6miysFQgSgXGV9ieWHjrqGLajV2VqGqIFnC23ua//OUv99PnriuiOposLBWIUgGLJa9iya8q8HA6Ax6VFY8WcJQ30Sewh9DrHn4WZVtlcanAoBQYXmr62fe+NwGzUnHdFxWz0RRm621ZtmzZT+hF9GWDaq3cSSoQpQImU17ZnfeO+gntFvWwYTSAo6wZN3XKy8vvjbKNsrhUICYFykZa7r1mwUjc/GFXJaL6IgWcrbf5+eef/wH53uUR1S4LSQXipIDZklf+m99N/AFVx4BH5ItHCjjKmehbObaxY8fiDpMMUoGkK0BW/OezZxdH9YasSABn621ZvXr1HWS9Jya9Z/KAUgFSID8/b+KjT02/g5IR++KRAK5Y73HjxuXT8oBUWiqQSgVGlVseoCnZfHdzQH4HKgDrjcX8xhtv/B1NqJqays7JY0sFLPl5U59bVbEQTNLCfOoKEwngGHs0013L78npsLo6yg1JUgAMjhlb8D0wSQvYBOS6YSDAsd30/e9/n54hHrpItxa5QSqQRAWKh5gWffWbY4bSIQF4WIbDbcQvA9vNS5cuvY2es8TVqwxSgZQrYDQabHffU34bNWTAIcNwgGObAjh9P+c70j1J+XmVDehVACyOLs//Dq0y4Loc621g59301FNPTSwsLPyiVFcqkE4K2ArzvvjPv52GIWv2w0P64uEAV6z34sWL76BfjF65dOqzbEsOKQAm5/9diWjFowZcGT2hx9G+nUO6ya5mkAL0WBsDzla8X+tDWWa+uDStWrVqBo19T+u3l8xIawUsplFp3b54NY7mik/703/MxNtpeTSlnxWHk64NKuCf/exn58uLS6086b8+3Pqg4WDNHw0O5yf9Gkuf9+sX6N3twXmaVWwMkUWv+Q7eLVShHk1mv310Kg9Vrt/h/PStQoN/PlVxhBYYa7AbVCwc4PQxzxHXS8ANhkZ7jaGq8W8Gh6ed9MuM4C2ebrD7Jhp6CIJsDr481/UGw4nnqY8MeFB3tYDjF6BY8KKiIjO9qeq6oNI5urL+1L8bOt2XM673PrPf4OjwZDXk/p6e68BqV1cXAx5kxUP54MgzrVixYpbJZCrNuLOagAZnItyQwWQ2GgppXlKeEec8OwON75V+/YErZlHv2A8P6qieBTddeeWVX5LuSZBWGbnCkDs7PQa/PyO7EL7RZI5HTCj+EhXaTwt7IKpfprXgintCBU3kf8+TgIfXNlO2AnJbicVAt7izLoBR2xDLPOoYW/CgP1eiBWf6TXRrPp/877lZp0YOd4ghhyUPNUKRydJYbaa5IyYU5l8+53BRP5hjxYprf9NYNz7zzDOfpl9GSSZ3Wra9vwIMORm9rArUn5Kbfzzt09QphV+xcyEt+Pjx42dK90SUKXvSDDksedYEwnrYyIKZ1J89tOhacN5gpLnfU7Om87Ij/RRgyLPJiFlsZjALC84cK/1GBgdswLqJZg9OzabOcwdl3KcAIC8oNuMtrn2ZGZpCHyxW0xXU/H4Xmgw49xLrRgJ8Sob2VTY7CgVUyLNgnLwXcIXfXgkUpvv54KWlpeaCgoKKKHSSRTNYAQXyIrPB1eXVzOLIrE5ZrcaK0lKbuaXFCbDZYCsuCfcEmcbf/va34ym2cqaMs18BhjyTZ/3TmKB17ncngV1Y8X6AM/XGq65SPsaZ/WdV9jBIAUBuLSSfnPFgIjIoHj2pCFO7xR6oFpy7YRw5cqS8wAw69bmz0gc5cMiwQE0uKrH0G0kRfXDFQbfZbBMyrGuyuXFUQIGc3p/Q7fSRT65O6YjjERJXVX6hCewqHPNRsILAFjyP3j2Iz0XIkMMKBCA3ZdwQosloBLsqyziFogXHBiNNkS3OhrFRdE6GwSsAyPPJkrvJkmeCHVeYNeUBcPbBlc7ziko9AY6XjMsgFVDmkysXnqAjAwIN54NdlWWkRQuOLuRJwCGDDKyA0ZRnsNrM5JOn/zi5yZzHgHPz1VEUZCjkS8BVbWSiVwGGXCEkjVUxGlXA1b85bMHVDAl4Gp/BFDaNIXe7vGk7uEL+iOheK0zzKAqkkxY8hQBlwqEBeX4BJmilZ2uNRuX6UeGYW8gWnNelD85KyDikAgy5uzv9xslNRvUiU217PwtOW7TQq4VlQioABRTIrTQzNc1MeU9eD9gNacHVPzper9dBH3mVj6tJlsMqwJB7yJKnyzg5vTXAITRaYZrHwdV8n8/Xpa7IhFQgjAKAnOZhp83gSo/foGVXGQfHD1D9EcKCh+mT3CQVCFKAIfe6yZKrFAUVSdqK39cjsqtwLfrgaEiPtOBJOx9ZcyBAbs7H3JUUd8mnWPCgn5l4QalskICn+CRl6OEVyMld8brp9VkpMuU9fj+7KCrkIS14v9fpZqjostnJVYDuJJIlJ6RSYMrBrK9HAVyFG71nC45MZZE+eHKhyLajMeQ+jz/phtzvy4MPrrIMbUULzoDbs0102Z/kKgDITRZj0g253+8Huwy40mm24KoCTqezBeZezglXJZGJQSgAyA0EOSx5MgLcfp+7p0V7LLbgTL2/tbX1tLaQXJcKDEYBtuSD2Xcw+zg6u8EuflHMs+KiYAVByTx58mSdvMgMCCL/j12BpEFO9Laed9Yxx70t72ELjnUF8DfffFMC3quOjOKjAEOeyMEVfOyqevtFLeD9RlH8GzZs6Ozu7r5E81FGxqd7shapAI1mwCen5zz93sT45H5Pz6UTey52ktb9XBTor1jv3o1+u91+RropkEWGeCoAyI0EebyHV8Bqt8t7htoKuEMCjn4AcqWAw+E4jQwZpALxVkCBnG7tK5DDZ4nT4nb5wawIuNJ09sFFC+7DSIq04PE+tbI+VoAhj5dPjiHCbrsXgNNTGMEWXBwHVyFvamqq48bIWCqQCAUAeQ8ZcJoBGHP1+KF0NHvALCw4c6zUG8qC+995551DNOkq9iPH3HRZQTYrgJuJmKQVa6CvOffUfNhwiOoRXRSFXwYcx0AGCvjoI7CX2tvba6WbAllkSKQCsUKuXGB2eWsr37twidopuihKs7WAM+Te5ubmSgl4Ik+trJsVYMgHMz0E/ndXm6eS6qI3E+m7KHwsxYLTiq+2tna3BJxlkXGiFQDceDe5EiMd6UIPzLU0OneD2d4FDKtBz4L7li9fXkmzs4IKq3vJhFQgAQow5NFUTYT696w5DwsuuieK/416QgGu/BLWrFnTSn54jbTi0cgty8aqgAo5rj0HWHB7vtvhqTnyUVMrlWYLDrhDAo62YQOsNvwZLw0X7pGAkxIyJFWBgHsy8CHhf9tb3Pj4q8IrxWBXhRs1iBYc6ww4fg1e8sN3ScAhiwzJVoAhJ1dc/2YnNaq5oWsXRQBcdFHU5oo3epAJwBly79NPP73npptuchUVFRWoe+RgwnXRZmh3YBQqu4OuMQuyiX0a6GQHCuhs1D1GX7VBKVhp7APgtfvSS4dcm1bUsQVn6x105FCAo6Diz3z00UedjY2NW6dMmXKL0ag19kHtiHil9nyj4b2dVYaOLvEVFhHvnpKCXs9XDUa3m44dpF1QW7TiB23UWdHdR+cw8DlDBlCgE/S30A5h9tOpLubsaG/r6JWnJ+gNrtbmrRdO7sYMQva/GXK1nVrAsQGaoCDMvufgwYP/N2nSpLgB/sJb6w0tHWhTZgV3t4teidBNjYbkkEhPem2/uCyjpt1fu127f7LLa4+vbZ+2Pdry2vWB9tdu1+6vPV6gvN/vMzTUHv8/Ku2hBaz2gxs1hTLLqIEB995///07aPpss661QS1RhEyEG93LtxbQKxH4+7gQPdLAZRGLad5fzOMyYoxyXEZMi2XEtFhGTItlxLRYBmltQFkE3ofTSmYE/w20v3Y7H4dj7fECrorP42mu2rZhB23VvcDEnuEAh9n30MxC5/nz59+LF+A4aKaGAOT5wbxpO6M9X9jOedqyqVjntujxo21Tostrjxfheldnx3tuu91JxWHBQ15goqpQgCMfFpytuGfTpk3v0PtSkJ/zAZBbLL2QMyRiDIUYCjEtlkllWmyTmNZrk1hGTMervF49YfL99JbNpvrat6k5onsCXvsFPcDhpuBXofjhS5cuPdzW1nZKWvGAfhaGvJ+cMiPRCoBBj8t16tCOTUfoWAw4WAWz/UKoi0wUQmGGHJW4aUx8TVlZ2YP0DR9sz/kAyBG8HsgjQ7IUAOD2jvY1dDwMa0F8hjsk4HoWHO2FyVet+MqVK9+hh5Hl2YQyvQGQm/PJXQkXcKcCge9YcFrJDPFftOVDVJFWWdH2Z4Dy9PpjT92R/e9QH8EiPAwwGtI9oXxdHxzb8ItgP9z90ksvNZ45c+ZdOf8K0vQFC42sKJAzwNoYRfmkiWltOV4Xy4hp3p5psdgHMa3XD7GMmKbyALKrs/3dMx8faKQkLDgAB6MhrTflRww4fi3uV1999QWy4rq/FlSYi0GB3GLJxa4ntc9+r9d/5tjHL9BB2T2JCXA0PsiKP/nkk7Vnz559X1rx/ueVIQ9z8a+OJMsygYGmaHTAXVdnZ+f7x/bsqO0FfEC4cZbC+eDYDmutuimU7v7rX//63x6PR/dPAnbK1QDITcoQYq/fDSHwp5hjMR3I7b9d70+3Xj7XPdj6Yt1f266B6htou7a+3nW6c9lTf/Lwf9PuuJ0suidhPYqBAEdzUAEcecVN+cMf/nCMrPg2acUhTf9goYtOk5ncFT5RKII0B07rbedykcax1hfr/tp2DlTfQNu19dE6Rk4c9o5th3d+cIxW2T0Je3HJ1UQCOKy1Cjilu9etW/c8WXGuQ8YaBVTINflydXAK+H007+TUyedpb7begA9MDuhJRAo4W3H8erqXLFlS3dDQsEtacVJDJ0jIdYSJMhvW29nVuevAtvXVtCsDztY7LoCjSWzF4dgDctfatWufkSMqkEY/AHIzja5gLjMHTgcm9AfyOQ9lOM3bo43FOsS0Xj1iGaQHCtG2D/XxPmKa2yPmiWne3uP3+Zvqjj9D21y0gD0wGJH1pnIDXmSiDAIAD7rYfOihhw7Su8TflnNUFH10/zPTRafJbFZOMp9ojrETp/mEinm6lYbZEG192vLcDr042vZp69fuH247psR2tDS/XbVl/UHaj613RKMnLFEkLgqXZSuuXGzigA8//PDT9GByK/6MyKCvAEOuX0Ju0SoAprzd3a3VO9Y/TdsY7oh9b64vWsDZF8cBXZs3b75UWVn5Z3nByXLqxwHI5c0gfYWCt8B6Nzde+HPj6dN4VhDuCZiL2Pfm2qIBHPuIVlyB/Pbbb3+THmurlhecLKl+DH9cHULkYuyfI45kwX68j5jmfcU8Mc3b4x2LxxDTescRy4hpoTwezXN1dVVvfeuVN6kIwx219Ub1gwGcrbhysYkGrFq16jGXy+WTrgokDR8UyE00iZNPKIojHWngsnr7D7Q90uNEWi7a4w1QHgz5vF5f3ZEDj1ETADdfXEZtvdGFaAHHPgw4flGKFX/00UePHDt2bDW9kRbbZRhAAYYcWMslWAMDPcxgb768mm7qYL631nqDvajCYADHARhytuLOBx544NnLly83SlclMv0BuZFGV2ToU6CH4HY7nI37Nr/3LOXicTSt9e4rHGFqsICzL66Oi+/du7f5tddee5g+f+KRrkpk6pvplr4CObsbORwDKBpy9pyuqX74YkN9M60y3FGNe2uVHyzgqIchV604DRvuI9CfpRtA2uPIdR0FFMjlU1L0pQcvjZo0PHvggw37SCqt9QZrgwqxAg5XRbXilHbdcsstK+vr63fIG0CRnw+GPFf9cbpbaejqaNuxZfXylWCod+G7lmAsJYDjDOLgWPiCE788x4MPPvgb8sc/kf44qRFhCECeez45/O5up/OTqo3v/oakwuvOwBBcADDFfFFycCEWC85HRCMwfIJfHBrnpBtATa+//vqvyB/3Sn+cFIkw4Ja+URxCzHKfHGaZ/tJ76SmdX9FrIJpoVeGHYrDEw4KUHHyIB+BoJxrDrorSSHrVRNWePXuegz8uIY/8BCmQG7P/zQVgAn735aYLz+3fsq6KFBLhjunCUlQ7HoCjPoY8yFVZtGjRcpqQtdGtvLhSPKxMh1MgYMkBefZ65TRJ0NDZ1rpxy2vLl1NHta4JDCaYijnEC3A0hCHnURU02rF48eJ/oYvOvRLy6M6ViVwVoymepye64yeytI8sd1dH+94tb6z4FzDSu/CwYNzgRh/iqSAAF/1xNNhBX4nouPPOOx+iByRq5KQsSB55YMizyRXHiEm3vbNm99o3HnJ2dHSQGgBchBsMxcV6Q+lEOHtonNjAPILcW1dXt3P+/PkLPth/eGgePqclQ0QK4L3synvBs2BKMmYIuhz2c/s2rf1ZY33tJyRAFy0MONzbuFpvCJwIwFEvQhDo5It3d3Z27naYCm6mGXWFPNE9UFT+H04B/vhAgPHM9Mv9fvpglNPZfGjnpntOHzl0lvqrhTuulpv1TBTgogVX0wcOHOiix7j2Dx899is0HJYvIefTMHCc1/uFjUwckcL9EHphpv34gY/uq9nzUU0IuGG5AXjcQ6IAR0MZbI6VxjfV17UVlQw5OqR0xEKah2GRkEd+TlXIIW2GGHK86tjtcjnqjx74pwNb38dteNFyx228W0/FRAIuHhOQq6BfqD1+0WIp2Dds1KgFNCRmkz65KFX4tAp5Bvjk8LndDkfriQN7fn5g6waMdTPcGPNOONxQMtmAq6DTnasWn8e1s7R8wvVkyEv4xKFRMoRXQDUIiiGnz16n4b8eGud2d9kbqnd+cC+9bu0o9chOCwBnuHEzJyF+N9WrhmQBjgOyBVchv9xwobOro3XbqPGTrjVZLGV8MaW2TiZ0FQhATlKyqrolk78B49z0HsGT+zatua/uyMHT1AKAnXS40fNkAo7jITDgStx++aKz+cLZD8onTZ1NryEeA59c+uUBoQb6X4UcBdPAJ8dwJt5CRTMDD+xY88YvGs+caqCWad2SpFhu1i7ZgAfBTY1Q1umdz+7zp45uHXfFjCn0AstJeUYJOZ+ggWLVXUmxKcesQHqWkm6/t2zd+saKJW0Xmy5T2xlu3MjBDMGkwg3tkg04jonQD3S60vbVVh/cPmbyFGu+rXA2+eRkyGGWZBhIAdYpYMST75H30Bg3fcqlp62p4eWNry7/N3rVWju1WYQbF5RJhxu6pQpwHJsh5wsN+nit13+quupA4ZChNSVDh881mkw0wiKtOcQaKEAnCJrMoMwIpJESj6Orlaa8Ltv2v6++QeeQLybFO5QpgRtapBJwHJ8hR6yCfuFUzQX6U7d5RPn4K8kvL5cuC6QaOKiQJ8EfJ2/bgItJR3vbwb1b1v3iaOX2Q9RCWG223HBJxKHAZP/+FMHSBXDAzYsCPV18dp06eGBjecVkk7Ww6DPSZVHO14D/sbsyYMEYCuDOpNfj7mlpOL9yw6oXf996sQFvn4LFZri1k6diOFpsu6YacLSef9lsxVXQ6c+d79ShqoN05/NI0TByWYxwWWjAQPrmYc96nz7xNeWBhxRofNvpbDl7rPpX2/73f97qdUkYboxx88Vkwm6/h+28ZmM6AI4miZCLoCvp86eON9ibWzYPHVk+mlyWKXBZMC7WdyI1vZKrvdqwrLEJArAxSoJvgna0XNpctXntkqOVHx6mWtliA3DtDRwYqpQHkJJOAe3BXFr88PCmSist+OKqjZZCpK+55bYvVEy78pcFRcUT8eRL3zAZbZWhnwIAM5bAw3/dXfaz9SeO/vve99fsovrggjDUPATI011xwPj8smJpeO++6QY4mhUwzwHI8Zg5vrQKyBl0W0FJSfENt/39D0pHj73LYrVayXWR1pwE0guBGYjRMaeOkNBDtc1NDSs/XLP6FVdnJ0ZIYKmxAGz2tTFKwnO5ozsQ7ZjIkC4uiraPLBJiLLAK7NP5vG63t/bQvkMOR8emoWWjx9Fr0CZKt0UrYd96nyvHtkM/xhwudkfsra0fHtz6/j/v2/zuB6S5OPwH6y3CjfMT25+KvubGNZWOFlzsINrHLgtbc7bocFsUyz7vq9+6oXzK9PsKCgsraE6L4rb0nVSxutxOByx5aA3Yz/aRn+1yOOobT598dte6N7dTabbUbLUx9Mc3btjosEEKXXkKc9MdcJYGkDPo8M0BOfvnCuRms7lg7uJv31Q+ruJOa1HxVLzcEv65BJ0lDB0z2LiAJD/7VNOF+pcr1/5tE72uhMHmmMe1RV87La222NNMARxtZmsO0GHNGXQAzrAjtn5x0Te/VD556p0FxSVX4Y1RmIorQSdlhKCAjfFsL1lse+eRptOnXv7ovbd2UBGAjAVgcwyLDbD5jiTATlurTW1TQyYBzo1Gm3HtwKDDmrNFVwCndSW+5uavXzNu8oy7CocMuRpfVgi8hiF3hxcDLgpm/GFilMfg6OjYf+H08ZU0MrKXNGOwxVh0RwA1X0hSMjNCJgIOZdFuLKLbAovOQ4si6PlXz7959tipM28rKhm2wGzNL8TrGHLlopShxoQo3Fr3drsdXZ1tWxtO1byzf9v7uL0OiEWokYa15kX0szPCalPb1ZCpgHMHGHIGnV0XBp0tu2Lli4eNKPrc/C8vKC0v/0phybA5NI5uogldivuSbePpGAkB3JifjU+CODrbqlqamjYc2LZxq73tMm7QsHUG0Aw5Q83DfrDaGeOOMBRinOmAc1+0oPONInZfxFix9BOmXjVq+py5Nw8rG/kVmp47lV+XFvDVM8+NUS11H9R0S91xqq350oYTVZXvnzt15CKJxQAz3GKMbbDWbLEzGmwRDE5nQ8ygIwbksOhs1QE54NbG5qu+cMO0cZOmXW8bMvTqgsLiWQS7FW95hc+ersAHA+1XXmRJlrqbXqxz2NnRvv/CmZMfHtm1/ST1F9YY8ALmUDG2s8WGC5IVYFM/lJAtFpz7wzH6xbADdF4AuBZ4xaJTvrKtoLjYOuvaL80qGzPx8wVDSq622Yo/ZTSbLLhbqjwzqsxPp9JKCMiXqBGaAMQ4UMD1xU0Y8jsMmM2HJ9ZpLprH6bQfc3V07m9uPLvv8J4dh112O1wOhhpA88KA8za21myxldqpfFaFbAWcT5IIOvx00VcXrTtDznkcm4aWlRXOuGbeZ4aXjfm0xVYwMT/fOtFsLRhnwsMYyvCjUQG/76KVD62NtVIHoNWWUiAmoHFRCJAVX5pi+oKdk+zzBbe7+6zH6Trb2tz48fG9O6vbm5txVxGQsiXmmMFGzHmIGWjRvw7dGCqc6UGreqb3J1z70VcAzjFbddGVYbC1sVhW+aFUzPzMqNETJ1YUDyubaLUVVeRbrRNMFnOZyWguzAvAj9fToZ6AmwPLjxUKCk1EMltoir30OJOjhyD2+b0On8fb7O7uPtft7Kq3tzWf/eTs2fr6mmr40AylaH1FeEOlxbLsfnCstCeb/2PNs7mP2r6hz+ICeNmycwwwGWqGnde5jBgjjUWsN4/cHfPQ0lFF9PidzVpUWFRgK8KMSIPL2eXo7qLRuvZWZ3vLxS5yKwAmuwgcM8yI2eqKMdIMNEOMdbEM78t1ckzFciPkIuDimQ0CkjYwqByL8IuAY7u4jcujPqS5XkoGpbEuBhE4TrN1ZcC1wDK0DDWvc3mOuT6OxePmTDrXARdPNGvBcCLWgsvrDDEgRzmOOT9UXTgW5wM6BIZPuw5IkQeIxZjh5RjbxDTWsSBwHFjL0f9Z8BztfthuszaIwy0i1NpyOIBYj3hABlCMkdYuDLs2X1xHvViXQaMAi6/Jlqs6CrBeDDKKhcsTt+tUGQQmQ8rwYp9weXp1yvxeBfjkSEFiU0Cro3YdtWvzGFzxyNo87bpYVqYjUOD/AZrbm7Ts1rpFAAAAAElFTkSuQmCC',red:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAC4CAYAAABQMybHAAAk/0lEQVR4Ae2dCZxUxZ3Hq8/pnhkGmOEQuQS5VCTxWHEDBlyNkciakMMkxujGuOvHO24IKCae0UQlKwmyroocoqtozGpA4oFiVAQU5IaRcchwDsPczNF39/5/b+bfVL/p7ume6bur+DyqXt31r2//5//q1XvPIJRLpgQMMVYeiDGfyhanBGKdgDirzYvsLLtIPguB0/lc7+vh5vNIvr68Oo8ige6EH6Vo3iSxjODrw1rcm2++2f+MM84YV1hYONRkMhUZjcY+OAKBgOZTXDGVLTYYDH0gNYpvIa/V5/O1+v3+FopvgY+D4tra29uP7N27d98VV1zRiOy6g06DcRyGr1wYCfCEhUnK2yiWiQYvSQG+8ac//all3rx5o/v16ze+oKBgnNlsxjGWQB5LgA5MhrToh1BL0Fd4vV4c+1wu176mpqYvHnnkkf0rVqzwUJt+OuQfALrBmh/hvHc8mfkuCBlmDei5c+fab7nllguLi4svttlsXyeYzyPgrJkgKPpBuQn4LU6n88PW1tZ1ixYt2vjoo486qG964PMe9nwGnKE2EhgG0tDWBx988HzS0BdbLJbpdEymeFsmAB1DH5wej2cTHR+Qhl937733biYN76ZyAFyGPoaqcitLvgEeAvX1119ve/jhhy8nLX211Wq9lKYWtnIuuFa3272WtPv/3nPPPW8tWbLESYPKS9jzAXCGGj60tfGLL764YPDgwT+x2+3fp/MyOnLZ1Tscjj/X1NS8OH78+E9poNDoslbPaTMmlwFnsDWoN23adNq4ceN+TBeIP6FVjbG5THSksdEKTQVdqL64b9++lyZPnlzVCboMe6SiWRufi4DLYJsqKyunkraeCxOELhJzcbxxw0cXqQGYMKTVHz399NM/pgp8dOQk6Lk04RiLpq3JNx04cOAbAwYMmEurH1PoXLkIEqDVmPV1dXWPjhw58l3KwqAz7BFKZU90LgAeBHvYsGHmjRs3/mtpaekcMkPOy55pSH9PyXzZ0tDQ8NiFF1646vDhw17qESDPetCzGXD0XYObwLYQ2FeVlZXNoRsvZ6Yfl+ztAd1Y2lNfXw/QXyHQ9TeTsm5g2Qp40BTZtWvX+aNHj15AGvv8rJN+BneYNPrm/fv3/2LixImbqZuy6ZLBve7atWwDXNPYNAzT0qVLS2fNmvUA7f+4gS4eAbxynRIwHN8ozDseFQZHTW9l4m/3BBa/8nnDfT97vKqBKmPQs2ZpMVsARz8ZbvPRo0ev6d+//yNkjiRlD0hvqUh3ecsrpwtD2+GEdcMfELUNbWLewNniBaqU7XNAnvGgZwPg6KMJx44dOybSstYf1coISSOKsy4tiJLa8ySPX6wvrxN3TLpX7KJaoM1xZDTkmfynPaixJ02aVEBX+PdOmDBhg4K754D2tqTFKKacPVhsOPEnce+kSQK/IjMdYChjFWWmdozhNq1evXrYtGnTltKNmq/3doLypXyyNLgsP49XfPhOpfjZzCcEbKGMtc0zEXBeITFXVFR8g5YAn1O2toxW9+FUAI5ewDY/UC9+PvrXAjeJ2DbH2nnGuEwyUYJae/r06bba2toH6O7a6wrujGGlS0eMBjFw1ADxetMT4oHpZ2lbi3GtlFEmS6Zo8CDca9asGT516tTltClK3WLvglRsEanS4HJvXF6x/v0vxHXfWigOUXzGmCyZADj6oK2S7N69ewrdtFlJWnuALDwVjk8C6QAcPSSTpa6iTvxwwm/EejrNiFWWdJsoDLeZdv3NHDNmzGoFd3wwZ1JuMlkGjBsoVlf9TsykfmGFBYorrUo0nYCjbQjAQjv/rhs+fPjLFLbToVwWS4Boto/sL14++ri4joZhoQNznDbO0tVwEG66K/nLIUOGPEW32/GLVy43JGAeUiKeqvsv8UsaTlohTwfgGtz0EIKV9iE/RjsAH1IPIuQG1SGjCAhDWaF4qHmBeGzwYIG3EaRFk6cacA3uGTNm2OnFNs/16dPn1hChqJOck0CJTdxaeY94bsZkzfxMOeSpvADQ4B44cGAB3cBZRg/8fi/nZjNDBpSuVZRow3d4xGsjHxT/VlsrXJSPlxGjFUlIWqo0uAY39dhaXl4+X8GdkLnLqkrsFvE90uTzwQAdKdPkqQCc4bZUV1fPpXeQ3JhVM6M6mzAJ9LGJG+v/IOZShSm78Ew24DCB0Ibl0KFD19Ozkr9JmLRURVkpgdIi8Zvqx8X1YIIOsJFUMzmZgKPj+FNkoQvK79CqyQIKK6ckIE4pEQsqHxbfIVGwJk8a5MkCnOE2b9++fRrdfl9CS4GAXTklATwiYRpVJp7bfb+YRuJI6h3PZAAOuFGv+a233hpPb5NaSeHkPGJCFSuXnRIgSGwTBomVb/2nGE8jAORgJuGaPFmAm+iB4KIpU6Ysp70lJdk5BarXyZaA0ShKLh4tls+6QBRRW/gLn3DAE10hfjDoaMHx48ef6Nu37w0UVi7FEsjEdfBoImh2iMX97hR3Up6Er5EnUoPjx4L6LHv27PmugjvalKo0WQJ97eKGLx8U3wU7dIChhCneRAHOcJtXrVo1dtSoUQvlAaiwkkB3EqAngxauuk2MpXwJtccTCbj5kksuKaLHzZYpu7u76VTpegnAHr9svFh2yQTNHgfkCdHiiagEPxLN7qbnKOeXlJSoO5X62UvxebbZ4LJ4yB5/muzx2RSXEHu8txo8aJps2bLlYtodqOCWZ0uF45YA7T68cfu94mIqmBBTpbeAa9qbzJIiWu+eTy9Wj3tAqoCSgCwBIETr4/OnjwsuHfaK0d4UZu1tef7552+nF/OMkzuqwkoCPZWA1SzGvXS9uI3K93pVpaeAM9zmF154YdSgQYPwaJJySgIJk8DgvmL2C/8hRlGFvTJVegM4Liwt9HTO78k0KUzYyFRFSgIkATJVCq88S/yOgr3akNUTwFl7W3bu3IlvTH5LzYiSQDIk0KdAXEEbsi7vhBysgr24XE8ARxnzlVdeWUw3dB6LqzWVWUkgTgmMHSgeu3Ky9oFeNlXiqiFewFl7m5988slb6XPXI+NqTWVWEohTAhaTGPnMLIGH0xnwuLR4vIAjv4k+gV1Cr3u4Kc6+quxKAj2SwIA+4qbrpwjsSsV1X1zMxpOZtbdl3rx5P6cX0Zf1qLeqkJJAnBIwmUTZ/TPFz6lY3MuG8QCOvGbc1DnllFNujrOPKruSQK8kQG/Kuple0Yx942yqxFRfrICz9jY/88wz15DtfUpMtatMSgIJkoDZJE5Z9mNxDVXHgMdki8cKOPKZ6Fs59lNPPRV3mJRTEki5BIb0FbdNOj2+N2TFAjhrb8vKlSuvIu09IuUjUw0qCZAErBYx4i/XiasoGLMtHgvgmvYeOnSolY47lKSVBNIpgWH9xR0lJcG7m93y210GaG8c5ldfffVfaEPVmHQOTrWtJEAbsca8f7O4BEzSwXxGFEwsgGPt0Ux3LX+ktsNGlKNKSJEEsJ121CDxIzBJB9gE5BFdd4Aj3XT11VfTM8R9Z0SsRSUoCaRQAn0LxIyrvyb6UpMAPCrD0RLxy0C6ee7cud+m5yzV50VIGMqlXwL0/Kb9nsvEt6kn3S4ZRgMcaRrg9P2cHyjzJP0Tq3rQIQGYKSP6iR/QGQMekeNICdDeOExPPPHEiMLCwq91VK3+VxLIDAkUWcXXnrhaYMma7XDw2sVFA1zT3jNnzryKtHekfF0qVBFKAqmQABFpnDUxRIvHDbi2ekKPo30/FR1WbSgJxCuBwcVBwFmLd6kinGbGLwHxphUrVoynte+xXUqpiIyWQKBoWEb3L1GdozXxsS/9u/Z2Wl5N6aLFYaTrXRDwr371q9PUxaVePJl/3nzef4uaN28S7hNHunQ2EOgSRa/r1rkuEXild1enr6unecJVHktd9OlwaOJp1LPddEApg92QotEANw8YMGCqApwktmen8K9cIURTI8kv810BdXGI72JR73LR9+ND5jvzOx9nD80u11QhVj1DxRjwkBr0gOMXoGnwoqIiM72p6sKQ3Hl64nv0fhGoPZ5Vo8ff7P5+v2jw+Eil5S7kfQKBC8FqW1sbAx6ixRGpd4gzLVu2bKLJZCrVJ+bjebbBzXNkoTsipfRQo0HTWRybWz7BWvqHkYMn0qjYDg8ZoB5w1uCmM8888yJlnoTIKitPGHIj3R3hyc0lHwCPLbRdRB4A56EF5yoc4Igzkf09RQEelFNWBwB5f3okJhfnE2MqNZumgFk6wC4gDzoZcKbfRLfmrWR/Tw7mUoGsl0Ao5DzVueEXmUyThxcW8heUeVDanMmAIwLnxoULF55Nv4w+Wg71X85IgCE3AoEccjScPr8ZderZNCSNX3lo8ioKk28aNmzYhFz8cyYPPF/DHZAbRKPXmzNrK6B6qM0ygbxP6WCOtaUjWYNzgpH2fo/JVwDyYdxmUuH9zWZN3eXKePuYjGAWPDPH2tD0GhwZTLR7cIzS4Jp8cvY/QN6PIG/KAU0OVouMxtPBLh0MuTZ3rMFBPRzOjQT4aO1M/ZfTEmDIc8Emt5s0wDV+OydNY5oBR5ym2ktLS802m21kTs+sGlxQAoC8r4nMFZp9DQAGIct8m9EwstRuh0XCw9DGqAfceP/992MrGrYzKJcnEjgJOdjIUhcQBbcPHQx2wXRwIGyDM/XGs846S22PzdI57k23AXkJmbAnfNm5dwUAn1mkbe3+ohNwRAVYgwcBHzhwoLrA7A0pWVxWg5xe5Wo8qQCzZjQAuNRs7rKSwhocAwHsRrvdPhwnyuWnBAB5H9LkLZomzy4ZFJmNYFfjmHuu1+AGevdgMScqPz8loEGuafLsGr/ZYAC7bI3A1x6751EgwkhbZIvVGjiLJH99QF5Mmrw1SzQ5mKVFcAAOpa3BjdnjkyD1BDheMq6ckoDQNDntQsQSYjY4ghzsBllGWLbBMQaDAhxiUI4lYCLNWEzmiqbJM/zBIKvByIBz9zUNzica+QpwFofyWQIMObGe0c4kAgx4sKeswYMRCvCMnsO0dY4hb/P5M/YZT7NJ0+AsI41pXkVBJCKUicLiUX4XCQDyIhNWyYP6sEuedEZE0+DcLwU4S0L5YSXAkLdrmjxslrRFGmOxwal3bLakraOq4cyWACAv1DR5ZvWTVlHArmaJcM/YRAn+zfF6ve2cqHwlgUgSYMi7rDNTASYs1b7PH5DZ1Zjm/gXH4fP52oInKqAkEEUCgJz2YWeMRU6Xv3p2NZWO1c3gCqfS4FFmVCV1kQBD7qS3aKX7LXE+v1/W4BrXbKJwxwNKg7MolB+rBAC5jd69Ql5anS8goMGDyhqdkS8otQQFeFrnKGsb1zQ5Qa5p8jSNwm8ImihByMNq8EC6/9akSUCq2d5JAK+H0zR576rpUWkwSyuXETW4Zq9QzQFlg/dIvqpQpwQYche9vDvVb7X1BgRs8CDL6JKswbUEAry1s6/KUxLokQQAeQFtQUz1HU96FzrYZcC1vss2uBbhcDgaoO7VnvAeza0q1CmBDsiFcPlTIxJQ7aTXoetbYw3O1PsbGxv/oc+kzpUEeiKBk5q8J6XjL9Pk9YBd/KSYZ81EwQmcFllRUbFfXWR2CET933sJAHKrZq4k9w4nelrldOwnLwg3wqzBka4lvPbaawpwSEO5hEkgCHkS18kB72v1zXrAg+vgTL3/7bffbnG5XLVms3lgwkaoKsp7CQByC0nBo+nRxIvD7ffXrjve1EI1dzFR0FoQcGRobW2tUmYKxKJcIiWgQU6gJ1qRg9U2X6CK+gq4wwKOcQByLUN7e/s/EKGckkCiJQDI6fUOCd9x2O7zgVkZcK3rbIPLGtyHlRSlwRM9tao+loAMOcf1xge8TT4vAPfREaLB5XXwIOTHjh3b35sGVVklge4kAMhhqngTsC0E9dR6fGA2BG70IZwG97/xxhs7aNMVgFdOSSBpEsDNxA5zpXdWuY/MjVW1zTuoowA8BHIGHIMA0Ej00Udga5ubmyuVmQKxKJdMCQByE/ENfd6Tf6C2xR+ofPFITS31UzZRtG7rAWfIvfX19ZsU4MmcWlU3SyAIeQ8UOYCt93g3keelI0R7o34ZcJxrGpx8X2Vl5UYFOESiXCokAMgBI3lxHTDkqxyujVQU2ps1eLDLMuD4MbAG9y1ZsmSTn1wwpwooCSRZAgx5PM3Qg3L+JTX10OAMN3OsVRMOcO2XsGrVqkayw8uVFo9H3CpvbyXAkMNa6e7AQ6DNXl/5W8fqGyk7a/CIgKNvrMFhz3hpufBTBTjEolwqJQDIAXd3DrDWuj34+KvGK/lsgweLyhockQw4fg1essM3KMCDslKBFEqAIY+mxdGdynbPBvIAuGyiIElz8o0eRLB6xy/Bu2DBgk8vvfRSZ1FRkU3Lnaf/VRaVCM/xmpwffSRlBijCuUjxyBsxLUJCpMfbkB39AvD6/jn8fufjh46wBmftHdJCOMCRUbNnPvnkk5bq6uoPRo8efbmRnphOhGvbWiGO/c9fhaeuORHVpaQOt+8rwlmCb7uHyC6k7UgpUctEKBStTEijnSf6iZfzRGhCyxJvO3K96Q7T42mi2nnig21N5dhByPY3Qx7snh5wJEAmmgYn37Nt27a/nnbaaQkDfP+dTwp3dT3aySrn9HtEu9+r2YYQUCw2IgbIeRk0lOO4cOmIk12q88ttI8x9jdR/fX79eXfl9en68pHG7w34xW5nzV8pv4cOeQ08pIpwahltMuDeW2+99SPaPlsfTUuE1NjNSTbCjSEVGS2i0NihD2KFG+U4L3w5jDQ4OY7zyL6cRw7LeeSwnEcOy3nksJwHYb1DXjguw2EtMob/uiuvT+d22Ne3h3iw6Az46he37PyITiNeYKJsNMCh9j20s9Bx+PDhvyUKcDSarQ6Q2wnyaNf4nMa3nTFWjsuEcXNfYu1fsvP3RCbQwLU+598a3W4HBaHBw15gou5wgCMeGpy1uGft2rVv0OskEJ/3DpDbjCYNWoZE9iEghkIOy3nSGZb7JIcj9UnOI4cTlT9SPdHiAeZ2Z93r5MnmCaK7uEiA40eCXwWo9sydO3dXU1PTl0qLd8iPIe84U/+nUgJgsC3g+XJJ8+7d1C4DDlbBbBcX7iITmZCZIUclbloTX1VWVnYnfcMH6XnvADmcKwDZKpcqCUBN13jbVpHnpoPNE+a1SzciaXBkRF1BLb58+fI36GFkVKhcpwQ0Td7lS4xKPMmUgFv4PG+3HXmD2pC1d1jzBP2IBjh+FSgIM8W9dOnS6qqqqjfV/iuShuSwsmJTkEsSSV4Qa9+1Pseb77ZWVVMr0OBgE4yC1bAuVsA1M+XFF19cTFo84q8lbAt5EKkgT80kuwMB/7q2I4upNTZPegU4eh2ixefPn1958ODBd5QW7zqhDHm0q3+V1nMJkPIW9f72d149UVHZCXi3cGOWomlwpENbB80UCrteeeWVZz0eT8Q/CSiUr64DciwhnnQcjnbjArk5PV6fy3KL+va6q6+35fX1d1dfd+n6+vjcL/yBjx3Vz1J5Fx2yeRLVougOcPQHFeBiUzNTfvvb3+4lLf53pcUhmq4ON4IKDB2QY3Lg2JfDPHFyHMLxOq67p/X1try+v93V1126vj6cd9jezr+vaCrfS6dsnoDJqHCjbCyAQ1sHAaewa82aNc+QFkd55cJIQA85w5cKH91hiORwKtpOVhs+4nij89gzNB7W3oAPTHZrScQKOGtx/Hpcc+bM2X706NENSouTNCI4QG4lTZ5qx3AzbGif41Ldl0S0B+1d73dtWNy4ezvVx4Cz9k4I4Ogna3EY9oDcuXr16oVqRQWiiexOavKTiOEyC44vtzisRXbGcxznicfnsrHWp8/P5SL5+v531zd9/fry3aV7aOVkk+P4QsrnpAPsgcGYtDfli8lEQT4ADi3OgLtmz569jd4l/rraowLxRHY2TZPjY6kd/5CTJ1kOR0qPXHP4FK471vr0+blcJF/uc/gehMbq69eXj5buoy2xR31trz/duGMblWPtHdPqCfciFhOF87IW1y420eBdd921gB5MblR7VFhE4X2GPHyqig0ngY49J97GxU27FlA6wx2z7c11xgs42+Jo0Pnee+/Vbtq06U/qgpPFGdkH5FhdUS42CeD5qb2exj997qzFG6tgnoC5mG1vbiUewFFG1uIa5LNmzXqNHmvbri44WaSR/QLaZstLiJyLrXP4sRwox2XkMJeV4+Qwpyfal9uQw5HakfPIYTk/tHej37X9vuMbX6M8DHfc2hv19wRw1uLaxSY6sGLFikecTifegYg6lYsiAUCO1RWeUGRFOFbHeSOV7y491nZizRdve93lB0Nu+qD8O22HH6E+AG6+uIxbe2MM8QKOMgw4flGaFn/ooYd27927dyW9kRbpynUjgSDkeP+HOkJkEKBfwCF/68oXmvdgv7dee4O9uFxPAEcDDDlrcccdd9yxqK6urlqZKrHJH5BbeqRfYqs/G3NhzftEwF39ZNPORdR/PI6m195xD6ungLMtzsuGzs8++6z+pZdeuos+f0JLl8pUiWUmGHL82c73A69hcwm/5/3WQ3eVOxrw2gWGO651b73cewo46mHIg1qclg23EOiL6AaQvh11HkECgNysNDltdPKLfe6GRU837d5CotJr7x5rzN4CDlMlqMUp7Lz88suXHzhw4CN1AygC0WGi8x1y3NCp8To++lXN+uVgqPPgu5ZgLC2AY6rQOA6+4MQvr/3OO++8j+zxGmWPkzRidJq5YuiNvomxoQzLBru72e+pWdS46z7qWjsdYAgmAJhivijYM5cIiaITWD7BLw6dc9ANoGMvv/zy3WSP0zeGevzjo6ryy2H50EKQR7pNnmvx0MvugN/7vuPw3Vucx47RbGv8kA+WeFmwVxAkAnAQjM6wqaJ1kl41sfnTTz99Cva4gjz2OQLk+DBTrjswAbt7r6fhqacbdm6m8cpw9+rCUpZdIgBHfQx5iKkyY8aMJbQh6123Gz9I5WKVwElNnrurK16C+4i39d05NeuXkFz0pgkUZkL+9CcKcMwdQw6acaGATrfPnDnz13TR+ZmCnKQRh4OpYs5Rm9yjXVS2f3ZX3YZfk0g0TsjnZcGEwQ1xJxpw2R7XIKevRJy49tprZ9MDEuVqUxZEHrtjyHNpjRwrJvU+R/nDjZtn13scJ0gaAFyGGwwlRHtD0snY3obOyR00EOTe/fv3r582bdr0pmXv9MVXbpWLTQImklWHQGWRxlY203IB7kaf69CC5p037XDU4osCbXQw4DBvE6q9Mf5kAI564UJAJ1vc1dLSsnFUZctltKOuUEHeIaRY/gfkcBBotq6k+KnzJwKe+mUnym9c13roIA1FD3dCNTfkBZcswGV1Ewxv3bq1rcBk+Xycpd836c+vVUHeMQmx/M+yCgozlkIZkoe2mYrWgKf19ROVt/y55cty6pYebmhuAJ5wlyzA0VGeC/a1zm9z1jaVme17hluKL6HVAgtPXMJHloMVsqxCBJrh4+yA292+tv3Ifz7btAu34WW4E7beHUkMyQRcbhNzEpyXTY5jx+kJly2jrSXTSZPbeeLkAiocXgIsq6Aww2fLiFjY3Cf8nsbX2/bf9mzjLqx1M9xY80463BBCqgEPgr7VWdvQbvCuH28tnUo2eR+eOHRKuegSCMqKTHOY55l44F0mDQHn0eXNX9z8yomKPTSiVjoAOMONmzlJsbup3qBLFeBokJVOEPJyV2PLUW/738+2DbjAZjCV8cVUsHcqEFECgDwoyIi50pOAde46n6NiYePuW9a2HfgH9QJgpxxujD6VgKM9OJ4XzT/gOeHY7W5Yd65t0CS70TRE24nRuWrQkV39H0kCDHmmrK1gZnH7/ZjXsfWRhs23b3HUHKW+682SlGhullmqAQ+Bmzqhndd6He5PHDUfTC48ZXShwXyagpynp3ufzRUIMp0OuwLpWUq6/d72wd21G+fsdzfVUX8YbtzIwQ7BlMINeaQacLQJ1wX0Fr/b9zfnwQ/PKxhUUGKyTjIJo4Enr6OI+j+SBGQ5YcU81Qfgdga8gQpP0/O/qP/4d41eB77yK8ONC8qUww15pQtwtM2Q84VGwEsbyN9srdo60FRYPsRin2wxmOzYS4AHc5WLLoGT5kr0fIlMxY5AvL+k2e9ufK/98Lz7aje9SnPIF5PyHcq0wI2xphNwtM+Qww+CvsFRfaTa2/beuILSM+0G0ynKZIGounephJxNkhpf+7aFjTtvp5WSHdRDaG3W3DBJ5KVAzHHKXaYADrj50KCv8rS0rXFUvXtOwSBTX5P1K8pkiY0NNleSSRNu3sAkKfc0L7+j9sMH97ua8fYpaGyGW795KrbOJyFXugHHkHgu4DPkmjanP3e+Na1V2waa7buHmAsn0/ZRu7YXQ5ksUVE4adIlducKcU0mCW7euBvWOo7c/UDtxr90miQMN9a4+WIyabffow5el5gJgKNLMuQy6Fp4g+PY0cNksoyylgymz4SM7nioS9nmurkMOT0JeUh0j05ga/toiuj78OKQr/W9RY3b57x64stdVBlrbACuv4EDJZV2l2lXb+gPrivxw8OXVgvosNFhp6MQ4TvKzvnni+yn/rLUaB2BJ1/4TzKlKRdGArCVe+PY1m70uw9+7Kz+wx/rt26g+mCCMNS8BMjbXbW/vr1pM5FlMw1wjA19wgHI8SVmKx2AnEG39zfbiu8vu+CasdZ+19HHWAvM2ESqzBYSUXgHDRwv5rxC0ub3uCrI1n6w/tMXGr1OrJBAU+MA2GxrY5WE93LH2xQVTZ7LFBNFP0IWEnwc0Aps0/mcfq/3rbYDO+r9zrUjLMVDaePWCGW26EV48px//Kw5ovl4wxSbI/Ty+Y+fa97zq0WNO9aRzOXlP2hvGW7MT0aYJCdH3RHCWDPZoX9ssrA2Z40Os0XT7HMGnP/1C2yDbulrtI7E64nx7lae1EweXKr7Bq0cybGd7SI7m9a1D3zmqln0WN3nH1J+1tSstbH0xzduWOlErjhSgymKz3TAWQyAnEGHbQ7I2T7XIDebzba7+p1z6STbgGv7GwvGKNBZdNF9GWx6J/eXO5x1z/++aetaejMZg80+r2vLtnZGam15xNkCOPrM2hygQ5sz6ACcYYdf8Kuy8y86zz7g2jKj7SwFOkkkjJPBJlNv9xZH3fOP12/+iLICZBwAm31obIDNdyQBdsZqbepb0GUT4Nxp9BnXDgw6tDlrdA1wOtf828rO+afJtkHXDTLZz7XiNQxUBIXz1XwB1KASa9n0Rilx3Of4fJPz+PKF9Vs/o2gGW/ZlcwRQ84UkBbPDZSPgkKzGKfmy2QKNzkuLMujWG0rPmnRhwZBvDzbbp9sN5kLAni8XpQy1n9AG1I6At51edPnBRlf1G4sbduP2OiCWoUYY2poP2c7OCq1NfQ+6bAWcB4D+A3IGnU0XBp01u6blh5qLi27od8b0Mdb+3xxosp9PoJvwch3Anmvr6Vi/BtRegprA9tX6HJu/dDe+vbhp7wf0RincoGHtDKAZcoaal/2gtbPGHKG+dnHZDjgPSA86TBi20dmEYV/T9FMKTx00q3j0ZSOsfb5ZYrCO0UyYLNbssqbuhBpfS/jyoLvl7f9r3f/O+vajx0kmDDDDLftIg7ZmjZ3VYNM4NJcrgMvjgTbHuAA5NDprdQDO0Mu++Yf9xo2dXDB4Kmn1c/uZCibShWkBPi+CR+gy1ZSRgcbmJzxJQ0t8riafaxdp6883uWo+Xtm0r4LGDG0MeAFzOB/prLFhguQE2DQOzeUa4PK4WKsDdD4Ath54TaNTvJbWz2wr+FHfsRMnWErPG2iyndvfVHAGwW7BBSqA7/jX0QwLL1kXrYAYjg1f+LhMBNC4UCSoPfSmqL21Pufn5Z6GLS83V+xq8jphcjDUAJoPBpzTWFuzxu6ongrkkuM5yqUxyWPB+Bh0va0ua3eGnOPYNw21FRX+oHDcV06zlpxdQvtfCg2mEYVGy1CrMNpZw7Mvwy93AmG9oBlafT6GGPYzQGbfLfyOdr/nSHvAd5B28x2scp/Y+Wr7vu1HnG24qwhIWROzz2DD5zj4DLRsX0fqDmXPbqeXe3aPJnrvGXT2WavLpgyDrfflvNoP5eLiYYMmWctGDjEVj+hrtowsMliG01cayugppEK6k2qnbWCFlNGMxhh81vRsXkAbgywizUuvWWinW+QOT8DX7vL76tsCnkPNXs+Bal/rwR3u+gPrWg/DhmYoZe0rwxsuLOdl84P96BLLgdR8Apynq4O5DqWKMOAFtLIPwBlqhp3P9Xk14DvrCKmbzB3zSGtx0RBjob2fuaCoj8GKHZGiJeBub/K62qr97Y4D7tY2MisAZofyPukzzPBZ68o+wgw0Q4xzOQ+X1ddN2fLD5SPg8syGAEkJMqx6kGXA9WlcDvUhzPWiLTmMc9kxeIjjMGtXBlwPLEPLUPM552ef62NfbjdvwhC+ch0SYFkwkPD14PI5QwzokY99jg9XF1rheEAHx/DpzwEp4gCx7DO87CNNDuMcBxz7HWd5+j8LPE+HH3XYLBv40Q4Zan0+NCDXIzfIAMo+wvqDYdfHy+eoF+fK6STAwtdFq9MIEmB5McjIFi1OTo9QZQiYDCnDizLR4iLVqeI7JcCTowTSOwno5ag/R+36OAZXblkfpz+X86pwDBL4fwN/IZwMBwH5AAAAAElFTkSuQmCC',yellow:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALcAAAC4CAYAAAChOH1KAAAlaElEQVR4Ae2dCZhUxbXHTy+zL8ywDDsSVhEVJQoCkoSIIr4kvohLxO2ZfC8an0mQrCQm+uJ7qHkv5hE/xSQaNokBogkxigaUuLDIpsiOMA4MOwyz7zPd7/yLOZfqnu7p7umeXut83+2qW7du3apTv3v63Lr31rWRkUhowOZViPc6Nutpbq/8WPVO8173sYtJ6kgDusI7yme2nYdTdIZQj0NH1vrgwYNtc+bMyb344otzCgsL87KysnLT0tKym5ub6+rr62vKy8urd+7cWfv444/XlJSUAGSB2VfoKw3HM9KBBqQzOsiSspsEXgmhCMTtDGT2TTfdNDwvL28kQzvC6XSOcDgcQ2w2Wzfenme323M5nuN2uwPql/O5OF+dy+Wq4X2rOV7Z2tpa3NLSsp9Pgv3V1dX7XnnllU/4RKnj7S5edNARl4WjRnQNBFS+njnJ4wKxHtp37NgxpG/fvlPY6l7CAI/kZTgv/YMBN1L64hPAzcAf5eUTXvax9d9x/PjxtZdcckkxH0OAF8gljNThE7acVIdbQLZzDyJuX7du3YChQ4dOycnJ+QJb5M+zFR4Qr73L1v4IW/h3amtr/3nw4MG1kyZNOsJ1FdglBOwpKakItwfQTz31VN4dd9wxnd2LL7J1/hzDPCxRSWDYD7BVf5fdmbeXLl26avbs2dXcFsCdkqCnCtwCNEL7gAEDnBs2bPh8QUHBnenp6TdyWi4vySY1TU1NKysqKl6cMGHCO0eOHGnhBuqQJ71FT3a4FczcqQgdu3btGtWvX787MzMzv8YWun+y0eyvPWzRjzY0NPzp2LFjL44ePXoP52vlRbfo/nZN6PRkhdvyoX/7299245GNe9iHvoMvBC9P6N6KQOX5gvRD9tGX8gjMovvuu6+SixRrjjCpJJngRluwAGz78uXLu0+dOvXbDPW3eL2QFyOeGihnyOevWbPm6VtvvfUsbwLcAnpSuCzJALcH1KtXr+4zduzYWbm5uf/OnZWMvrQnouGv1bD8ftu2bf937bXXnmgDPCkgT3S4lZXmDrGvX79+0EUXXTSbRz3u5fXM8Ps85Upo4FGWBbt3735q4sSJh7n1YskRJqQkKtyoN8B2vPzyyz2uueaaX2RnZ9/NN1bSE7IX4qjSfMOoqa6ubvFbb7318xkzZpRx1XDxKZY8jmoauCqJBjfqi8WB4bzNmzf/W/fu3R/j9R6Bm5o6OWyuErK1fMiKwuhfJ8VNZWUVtT/77MTHFrYNI8oIS8L444kEt7ggju3bt182bNiweXwHcXwnuy5pdwPYzrofMdiR8SaaW9wffFLc+N3RE/7xEStNrHhkCu/iXkgEuFFHBfb8+fMLb7vttkf4YvGb7II4u1g3CVm8vXEpORtfiGzdbbaWmpqW3724ou4/v/WDj8u5cMAd965KvMMt1tp56NCh24qKip7gmy99IttzyVWao3ERYekKcbnpxKmy5h/3HbVpGZcvdzzj1ooDnngUnHQOLI8++mhBZWXlC3369FlowI5tV9lt1KdPz7SFdaUTXnj00REF0kccxqWRjMdKWWBv2rTpUn7YfwnfWRwZ225NnKN3peXWtdDion0799TedfkXPvqY0+GLywWnni2m8Xiz3KgPLLbz6NGj3xgzZsw7BuyY8uH34E47jRxzUc47J/eN/wb6ixf0W1zxFC+VEWvtnDt3biE/ybagZ8+ez7CysngxEqcasNkoq6i785m6w1ctmDt3GB5xEMjjwiOIh0qgDjjJMG49hp9ae5Gt9fA47c+4r1a03BJvRbS43J/s3FN3R5ubIhebMR0Tj7XlFoudtm/fvmsuvfTSNQZsb2wSY91ptw0fMzrnrYObr7iGa5zGC9yUmBrPWMItYGOY7xZ+W/wvrIw8XowkqAa4Q/M+MzjjL0d2jL+FmxBzFyVWcOO4OLPT+AH6b/ELuAs5bp4LYSUkujDg6f37Ohee3ncVHjUWCx4TzmJxUAE7/eTJk4/06NHjKb7bGIt6JDpH8Vt/N9l7dnc8dfaTcY9wJWG0YjKSEm2oFNh80ZhRVlb2NL/D+KP47SFTs3A1UFiQ9qOakglPjx7dKyMWgEcTbgX2+PHjs3j6hCX8fMjXw1We2T/+NZCTY//65jeGLRk/vjuGdaNqwaN1NavA5salnz179jl+9evO+O+WxKxhrIYCA2mrtq71xdwLNt7P+Zp4kacLA+0W1vZoWG4BO4197McM2GH1V8LunJPtuLP84FWPcQOidpHZ1XCjfCxppaWl32Ef+6GE7R1T8bA1UJDveOjUnvHfAQ+8CBthl+uvgK6EGy6PAru4uPj23r17z/VXCZOeOhro1cs5t3T7uNu5xQJ4l7nGXQU3KqzGsfmF0+v79+8/P5oTR6YOKgnYUjfZ+vdLm7/vg7HXtwEOTroE8K6AWyy2kx9ZHTdkyJAlbY1IwJ4wVe4KDTAgacMHZy3Z9vbl47h83MkEhxEHvCvgRpnOefPmFfF49lLMU83rRowGPDRgs1POpRdlLZ33xJAi3iCAe+QJdyXSZ4sCmyuVwY+truA5RKaFW0Gzf2gaiNehQH+tqKt3vZkzaAOeRWnkRZ4m9Jc9pPRIWm6cKMrPPnz48HcN2CH1Q8pmzs6yTzux+8rvsgJkiDBiBjdScAvY8LOv4hd58UyBEaOBoDRQ1DPtEfa/r+LMEX2SMFJwoxzHE0880Yv97AXsZ6OSRowGgtIAeLl0VNaCJx4d0ot3wL9/RLiMxF8AKgKY4WcvY3dkOseNxEgDieZz62qqq29dlTNo422cFhH/O9wzBCeHgptfOHjAgK13lYmHqoHsLMf0ozvHPcD7yehJWMY3HLgtsBcvXnwB34F8ONTGmPxGA94a6FuU9vDiZy6+gNPDBjxcuNXoyA033PA4+01mLmzvnjLrIWuA36jP/dcb8h7nHcMePeks3JbV3rp167X8sVF8NMmI0UBENJCXa7/xo3fGXsuFhWW9Ows39nNed911uRdeeOEvI9IiU4jRgKaBi0Zk/vK663rDGxDAta3BRTsDt2W1n3/++Vk8jfDQ4A5lchkNBK+BNKdt6OJfD5rFewjcIV9chgq3BTZ/UGkY36wxz2cH318mZ4ga4Js7Dy1fMHpYZwHvDNzqIpI/1fEkX0Sab8+E2GEme/AasNltmdO/kP8k79Gpi8tQ4Las9rvvvjuBXxe7LvhqmpxGA53TQE6O7bp1r4+RW/PgNWj3JFS4ldXmW+zfY6vdudqavYwGQtAAOONb89/nXUK23sHCbVnt119//TKelmFqCPUzWY0GwtJAbq596j9eueQyLiSki8tQ4IbVdl555ZWzOTRmO6zuMjuHpgGbbfxlOeAOcIPDoPgLBm7LavM3H0fl5+d/KbSKmdxGA+FrID/P/qWXXxw1iksK2noHC7ey2pMnT8bQXzD7hN8aU4LRgIcGbPYpV3UDf0Fb70CgitV2LFq0aAhb7RkexzMrRgNR1ADPezJj0fyLhvAhYWzBbofuSbBwO6dOnfogX7miUCNGAzHRAA+cOP5lSt6DfPCgXJNg4HawO5LDs0XdFJMWmYMaDWgaKChw3DR5ck/MqBDwwrIjuMUlwTQN0/lzHvjuoBGjgZhqwG6ngmfnDsTbXgGtd0dwY5u6kBwwYMCt5qZNTPvUHLxNA+BwYP/0W3lVLiz9MuxvA6w2FsecOXN68fPaX2wr2wRGAzHXQF6O44tzZlsvEwur7erVEdzY5rz77rtv5s9S49anEaOBuNCA3W5L+/rt3W/mynTomnQEt3JJ+JvrmA3IiNFAXGmgX1FawC+m+YJbzLxjyZIlI/mNdtzTN2I0EFcayMqyXfbS7y4cyZWSURNw6yH+4MYOjokTJ95iLiQ99BX3K271Tx331Qy7guBy0vg8WG/FKoft4IbP4i3IpPztwsLCz3tvNOvxrYEW23iqKPs9VxKfnUlc4fncPSrvtUpYb2lygU+/frc33JZLcs899xSwS3KpxxFSdMVWv4dsle+Qzd0c9xqAGevm/AJVVBSTy+ViCDwhQQN8JLVLc1P7/bz39VXOuTye+/rK5zvNcz+U1ZG4XO5Lb5teWbBs1QHMUCXsWoV4w42yYLUd99133yQ2/dBVSoutbhc5997MmkscS4hOK2hxU1mlb7h9daj3f7r3uq99Yp3GJ67jnqktk5atopVcF3Dr0UnecKNNCu5+/fpNNv42m4PyN8jWdDTW/Rjy8TF22yPLTWeriFyWLQu5mLjeAbD26eaezMHfeQG3SLJaiwRdsK7g5icAJ+kbUjVuc+OziYkpPD0Cdc/nDk0EM9xJFedn2ybyrvizEnatknS4oQIsjlmzZvXMzs6+0MplIgmrAQHcwT0tHZxMYXaGe9QDX03vCW55kaap/vIFt33mzJlXt2VUmcxPYmsAgBfmsWkD4Nz9SbbYvnq1G7yC5Q7hRgYH35W82vjbiQ20d+11wL23JfI6OO1TSIBbXBMArsTbciu4eU4Sc1dSNJREoQKcZ9+DBY+U4F8AIv8GEleJUfrJyiTw2g5uGS0R2hXcPL79mSjVyxwmyhpwwkXJdVNFTeRGUQRwNEXiEkajedkZBF4FblUN/nHr5zDi9p/85Cd92NSzh2YkWTUAwAtgwcWkJXhD+UTKm3VLWh9uhmJYmiNwo5lY7Pw8yXDZaMLk1YAArkZRuOdhaRN5mXSxDdyCZ2FZrUgPKrj55s1QczEpKknuEIB347cRYcGFiEQMUf++3V1DubcEbtVx7Sw3v3UzLLm71LRO14AADqudyJKbaQO3ArdqjQ434naeB3CIsdyJ3M2h110Aj+QoSui16Pwe4DUnm4ZwCYphDhXcGC2Rcxahg0dKkMlIimkAgOdnu6mqzvdTg/Gujqx0G7jFiInFM0iHIME+atSo9MzMzAEqxfyknAbOAc4gMBWJdnGZke4eMOozmengmBcFuA63bdq0aYV4jDDletU02NIAAM/LOge3lZgYEceUMa2FXFWAbcEtKzaen4RHP42kugYE8M6Mg8uFqVh+6FLSfOlVtnU2v+yHcFCRG/xaPOt3KG29evUyN2989UAKpgHwXH4evKZee0A6SD0IsMgucQl9FaFvk7iEgfLr27vnucGvwK38E9lu42FAY7lFGyYkZcGz2YkFLgkg+TkOsdyqtjJaomjnZ7gN3AnQidGsosOhWXDrHZdo1iC4YwHgzEzfbglKsBm4g1NkquUSwGsb4neYEG5MTjp5WG6P0RIeBswxN3BSDd3g2gvAc/irox35wsGV1DW5UK/0DDemNlZeCI5ijQkikT91jY1GjAZ8asAX4AI7Qj3us4BOJOpl6nFfRaU77AI3Ntv00RK+gDBw+1KaSTuvgXOAu6mOZwqRuUcEOuSSuITn9+x8TC9L4hLqpTqdynIjCdbbc+6t1tbWFiQaMRroSAMAnF/MpXoA3lHGKG9rddk8+BWfG9WwNTU11fqaoSjKdTSHSwANAPCsjDYTGQf1xb9IYzPVclWU1UaVdLipoaEBG40YDQSlAR1wuYrzDlGQRZuPUmWb937+1r3L0/fnuQM9+NXhdhu4fWjfJHWoAQtwocwrtyQHC6vX7u1WvctDBkmrb7YBbstTErhVQl1dHb82asRoIDQNAHA8j+frIi+0ksLLzRe5wq/iGaMlQrq7oqLCw6yHdyizdypp4JwFd1MDzz4noyjRbD9OrMpaD8vtlqFAAO4uLy8X8qNZL3OsJNEAf6uGLfg5wKPdJMBdXuMCv4plHF/cElWX06dPV5vREqUK89NJDZwDPPouCv4tTpVTtV5tgVvRvnv37hoDt64eE++MBgB4Bs+hDGvqvaA8pIlIXPIhXdIkjx7KNskvIa4q9xyyA24Py40ViHvlypXVPNbNMzobMRoITwMW4F7FeMOJzZKmxwVa71DPg7hIczNVvba+SdwSJFszTgntbh4xKTHWW1RmwnA0AMDTYcG5kK5ccAXLIyUlfBiLY9Rb3BLEscFVW1tbghUjRgOR0IAFuOaKRKJc7zJqG2wlnObiRTwRBbfQjg0uHg781Fhu1oSRiGkAgKfxuJy3ixGpdVS0qtb9KQeKYQ4V02K5BXA3j5gUI7MRo4FIakAAj2SZelmnKuggr1scYxvg1hNaecTkoLHcUI2RSGtAAI+UxZZyUM89h1wwyviamcWzWG5sVyZ94cKFn/L3CxE3YjQQcQ0AcCfPjAMwIyVMq2vhasenXJ5iWMoVuIV2165duxp4xOSYZDCh0UCkNaADLtY3nLC+yXZs14EmfsPTuqAEz9ZoiQU3p7XW1NQY1wTaMdJlGsC7urDg4Qpc6JoGN/xtuCSw3MKyB9xi0l0nTpzYbPzucNVu9g+kAQE8lDFwlOnh0TDKJ8tsmznZ4pfjHpYb+yABGVq3bNmywbjdUImRrtYAAHeE4IML2HJC4OvIW/e3buB66pZbVbudz41MP/3pT3fziwvmNnxX96wpX2kAgHd2ZtnGFqr68QuO3eCWF59uCQ5iWe7q6uqms2fPbjWuCdRiJBoaEMBDORb4LKugLYwrvmGuw62KEcuNFQtujrccO3bsAwO30pH5iZIGBPBgR05QrWNltk0c4K33gHADcGRq2bBhw3rjd7MmjERVAwAccAcj8LfX7Wxdz3kFbvCLRYleDOIYnOEX9tWca93OnDmznmd+7aFypuiP48jjhMVIdDUQjNdQVecuK7iheSLXrJIXPO7KM6ko46wAl9fMOE0Rj0Q1YsJhC8O9mT+Vfb09Ub8EhFaFKc2taVReYRmDMEszu4eigY4Ad7HZPnyKMAQoVtvjYhLH0eHGusCNHVr27du3euDAgRGF21axm2zH1pLN3Yzjxb3YG89Qel02PzIM3bUXf9jjtSdf4i8def3s4veFW39l+StHHaODjaGW5zd/R8fw08pQy2ppddOuva2rGVPFKrdN4EYzlehuCRKwDuB5Pk/KGzlyZM/169e/z5/vi8gXFwC28x9fZrDh1ieOVNW7cBcscSqcAjWtbXRXf/l/K6/ed6rpDDcXr5fh9jtAtzrKl+XGRtDXzJa77siRI6tHjBhxUyRcE9vhV8lWe4SLTizJR3XZLtRiwMlIzDWAx/qOn6HV+04Rf1iQ4AKAV3Brgc1x6/Y74iIw71hwFjTxqMlKniBTtoUV2lyJS0c+f+GLJzc3EgcaYI+EthyilVwVAAVOhVmP2unj3LJBLLfyZe6///5NVVVVRzty7mXHZA8BeC6PJcF3M0tsdADbzF94OPq9P5OMb4NTsdweCPqDWwCHyW8uKSl5zcB9Tm95fDWSg8FSIzHRAC48SyvoNT64YpNDARvMeogvuJEBZh474axo5ikf/trM784bOacBATzYO2kmH1t5/quLxNLCCK/aSX8Fl7yI1Qav7cQf3DgLLL/7ySefLC4rK9turPd5/QHwbOODn1dIFGKw2uW1tP3/3qZiPpzub7ez2qhOMHDj7GjasWPHSy1qSBG7GYEGlAVnwI3/HR0dtLK53XWCXmLVC9hgE0Y4JLg5v9oBO8L8N82cOfM1nvah1FhvqOa85BoLfl4ZXRiD1a6sp9L7lil/G3CDS79goyr+LDe24Wyw/G5+9axh+/btf4jUsCAOkCwigEfCpzRl+PbN8ZDUzhP0h5oadbNG97d9Wm2wFQhuAVxZ729+85t/raysPGmsd/vTEoBn8dRhRiKvAWW1G+jk7OXqQlKstt9REqlBR3AjD8w+CgHcjUePHq3duXPnImO9WRs+xFhw31Y33H8jWO29J2jR0Qr1QSc8+QcewSX49CuB4IblRgHqopLDxm9/+9sr+E2dMmO9fesUY+DGgvvWTWdSYbVrmqjsxytpBfjjRS4mO/S3caxAcCOPWG8FOD9vUrVnz54XjfWGanyLAG5GUcIfRcFzJPtP0ov7jhPe6RWwA1pt9EwwcIv1Vn4379M4Z86cl9h6VxrrDRX6FgW4GQf3rZwgU2G1qxup8ud/V8N/YrXBYUCrjUMEAzfyifVWvvfGjRvLN2/e/LS5awnV+Bfc5MnCOHiE7s6lWjktTN22Unp6awmVs5aD9rWlR4KF29t6N8yYMWMFT96z07xnKar0HQLwTDOK4ls5HaTCHTlVTTvvWqR8bTyrLaMkQVltFB0s3MjrYb358yL1y5Ytm8vzm7iMewL1+BcB3PjgwfnguMPC85G4Xt5Gc3nShnrWbMhWG70RCtztrPfDDz/88f79+/9sLi79gy1bBHBZN6F/DeA2+4Ez9OdfvE4fc65OWW2UHgrcyC/WG38ROJsavv/97/+Gb8ufNdYb6ulY4H/DRUk13zmU9kKDlY109sd/pd9wFGDLhWRQIyTYXyRUuGG9cRAMC+Kg9e+9914ZX2D+mt0UXjUSSAMAPMP75b5AO6XQ9iama0sJ/XrjQSrjZotLAt7AHfgLWkKFGwUL4GrkhNfr+eJyJd+93Gbck+D0LoCHYtFSIS/uRJ6oom23v6BeIROwwVnIYKMnOgs33BPrriXHG+bNm/cIv45WY0ZPoNbAIoAHznk+By5IIXJhKnGV2JYuaXpe2R4o1PfR4/720/PocX/5O0rH6EhlA9U88096hPPp7gg4A28hWW0cqzNwYz/xvS3r/dxzzx1cvXr1L3j0hOfZCLkeKDPlBP43XBSAEcwCBQlEelz21dP0uGwPFOr76HF/++l59Li//P7S20ZHaO0++sXv31cfbvK22uAtZOks3DgQDijWG2da/V133fXm3r17l5ubO1BPcALA01PcB29mp4OnaVj+jcX0JmsNYMsIiVjt4JTplSscuGGeAbhYb1So7pZbbvnV8ePH9xr/20vTHaxaFpxNWyr41nob4WefrKG9dy6kX4EfXsQlAVfgq9NuQAS+SsKHPy829rt5gquWDydMmPCVjIyMdMzaKWI/8S5hMdJeA+r7MNyN6GwR0Zy/v/NIp+O4ckw9LsfR0/S4bA81xAx1VQ1U+8s19K1/7qVjXGYtL7Dc8oCUpg0cMTQJx3LjSDi4t3tSN3/+fPjfjxn/O7TOyGAXJQ2f0ODdsEAkPLfWtb9yLH/HD7Q9lNrhsqyBnY639tJjv39X+dlitQXssKw26hIu3ChDABf3BGdeHfvfq/jR2BVm/BsqCl4E8OD3SMycGM/ec4JW3LuYVnELADa4wb2TsN0RLkNJJOBGQTjLMBbpAfj06dOfLC4uft8ADhUFLwAcF5m6b5pMcVxAlpyl9298jp5krXiDDY7AU9gSKbhREVhwffSkjt+3rLn55pt/WFpa+rEZQQmtrwA3XJRkE4B9pJw+/trz9MPKOjVhvLc7Ao4iIpGGW/xv/L2o0ZMDBw5U8HyDD/HjscUteEDXSNAaEMCTxWrjgaiT1VT84Ev00IFTVMGKELDBiwz7RQzurrYNqqKHDh1q4tvzGyZfmHVNbsUHufz5byNBasDRZn7kvpiuOokj9LXgEJJHj/vKK/kk7Ex+7KOLlIUQdyBP19CJOa/Q/W/soSOchJERwB1RP5vLs6Qr4PZ55vHFZb2r1b1lXNHRa/muXKYB3OqDgBFfgOvg+CtAz6PHuyo/jqEvOA7WYbF5GrSKX71NDyzaQAc4SYb88O+O67SI+dlcliVdATcKB+CyyMFsH+w6WsnTAO+8pD9dx4CnGcBFNYFDAVwfBw+8V+xzAGyeKar+D+vpu798k7ZzjWCtxR3Rh/0iXtmugluvqECO0MbPD5zpmUs7RvamKQx4Rgp/S0rXUVBxAVwpkk1ivPviAPtsPVUv2Uizfvaq+jgToBarDbBhsdGcLpFowo0GqIas3kOnud0fjBlAk/nWc450Wpe0MMkKFV3BB9ddgHiLtzC27GOfmvcWPTj3DfqIuwFQY4ErolvshIab22KdnWiIasyGYqrkZwreu/ICmsivYBVIpyGzkY41IP92cpHZce7ob23icY/jVXToZ3+jB55fR59wDfCNSN1iR3xkxFcro2G55bhyhlqAf3yEanccp7WfG05j+XszRQAcf7VGAmsgHgHHyQawedqzXQ8up/949WNrVEQHO2J3IANpKZpwS10EbhV+eoYaV++lt68dRaPyM2mAAVzUFDgUwJEz1v436oBb6p+W0cZbX6CHNn1KpzkJUMPP1h+GYo/U+ifnaNdJtOHWwZZGus/UUMufPqS114+mfvkZNNxpLHjQPS6Ax9JFwRh2Hdtjnqzy9WnP0k9Ky9QNmpiCDQVGG27pNB1yxF31jeT63Xu07ooLqLx3N7oy3UFO6TjZyYS+NaAPqUbbgquhvkZq5FGwX13/ND3L/YgPnsLH9jXch76OmsQKbjRQQd0WWrAv30r7bXbaOLIPXZHppG7GTQmOBQ/AeZeuHj1B7/HEOXSikg4/vZZmzV5Ba/mwsNbiX8uoiNygQR9HVWIJtzQUjYaLYrkp6w5QOfvhb04aSn3YDx9m3BRRVcehAN7VFCk3hAfz9p6kN29fQD9Y+REd4poJ2GKx9TuPXV0ln4qJNdxotPeiQD9dTc3sprw39gI60zufxsFNkb9cny0xiUoDMtrUFTTBr1e30huo8e399D/TfkPPcj9V8oF1/1qeFRGLHbOeiTXcaLj0g1hvPXSv2EqfuG20bngRXc43fAod/H8rHRgzrcX5gS39tOlKjEI4IcDGmzPHKql43ts0i7/g+y6rQe44yoiIgC19GFNNwTWLF0FdcLJh4cf1Cd/p5Q9SqyW7ex7lLL2X7vjsILq3WyZ/vIBzWZ3ImYy01wDch3AFUOMZbJ5TpH7rYVrAs64uPVvtYan1N2hgrbGIwQr38GHtHw+WW28AlCKLnP0IW+ubyLX0A9pxqIzWXNib+vLk7oPlYtNArqvwfDwcvYgLUsu2eP9pemfOSvrBwyvpHe4HuCAyGgKwvZ/siwuwoYV4styojwieYsaCGT14dj1lxfl7YZYlz3j2drr6Xy6m2T3zqD+PqpAZNmTt+BGAiiVYgcWHC8L3H46+toOeenAZvc/7wuUAzAI01vVnRCLwP8ElRlDiFW40EXUTwAVyAG4tA3tR3oI76J4xA+mOvHTKgKtiIIfq2kswcANquCDVTdTIj0YsvXcpLSo9rcatYZ31RaDmU8Aa5Wp/0BinxDPcUA3qhwXuEwCHLw5LbgGO+MyraNCDk+nuEb1pOrsr6TyyYiBnxXiLP8ABNW6dswvStP8UrXrmPVr8x410mPfXgUYcUGOID1CLbx3CfwLvFUWJd7hFFagnrLhALq4KLjoF9IyvXkb9Zk+lmSOK6Cv8XfZMfl7cQC4a9BECatyIqW6gBob6b0+toT/+5SM1OQ5cDgEbcd0FAdRwQeIWaq6bkkSBG5VFXQVyWHFxVQC4QK7iU4ZTr4e/RLeN7kdfzcugXAU57xnOBRYfIykE1htv8yioG6lm1zH6y3/9nZat/UQ96CQgA2yJ+3JB4h5sdFYiwS1wCeDe/jjAFosOa57+2c9Q4X9/mW4Z3Zdm8J3OQszJJ3c7Uwl0AI0Fkw80sFPBU5iV7zpOL//0VVqx9VP1pTAALEAjrltq8asTwlpz3S1JRLil8gI5XBUs8MdlfFwgV8AX5lHW4zfSxCsG0vUDu9NEfnY8Xax5Ml+Awu0QK13bRE2lZ2n9llJ6g4f11pdXW4+h6hYacfjUcus8YVwQrnM7SWS40RjUXyAXn1wgB+ACucTTxw2mbj+cRlNH9aZp/QroYobcpmZ3QkFcUiJbdLHQ8Bnw0gC7Hu5jFbRzDz8Dwi/nrtlUom6VwzLLIhYa6zrUsNJiqRPCBeH6tpNEh1sa5AtyfXQFcAN6gVydAHdNoAF3j6PpQ3rQlIIcGoxRFoCubg5x5niHXYcZz3wAaIx6VNRSSXEZrV28iVYt2UBHuCkCrkCNdT0O10OsdMJDzW1Rkixw6+0R0MVd0V0WuQgV0MXKO798CRV9bRxdMbQHje3TjS7n0Za+cF0wdq7DjgPFwroDZIgCmkPAjDHpttGO4/zo6YcHy2jbnzbRlld30CnOAmB1qAVoPR1Ay4IjyMLRxJdkg1vvEbQNroq4KwI7ABeovUNsQz7nzHHU78YxdMWQnjSWn0q8LDuNemIObVyQAnbrwpQzQ3Tg9fi5rYF/BV7klLgijX9wIQiYEeKtcn7r5czJKvqo+AxtW7mdtvxxkxq+E+urwytwSyh5BGgu0XI/AlcywXIkM9zSFWLJBXSEFsQcB+BYF+glriBvS7dPGU6FUy+iwcOKaFBRPg3qlkUD89NpIFv4fmzdnQAez1OLK6POLK91bBPLq0IGFxd8AjHSsN5mlVt4/PlYVROV8qQ2paeq6DDPr3d4zW4q4WE7fAsdYAJWAVbiANk7DpiRJjAjVIflMGkFfZAqgrbqC+AF6Ahl8QU20mS7vo86WXIzyfm1K6jfZQNpQEEm5fP0w1lZaZTNw47Z7L9ns4XPZl8+i61+NsOdwQA3svWtY9+4ni1xHfvJdTw8V1fPS2Mz1Vc0UNVHpXTkT1voWE2DB5AAFFCK1RVgBWR9Xc8j+wjMEnJRyS2pBLfekzrkiCtQOdThFaB9wS0nhYRShne5so5jIy4CwCACmncolhWQCpwIJS7wAmyJ+8rrXS5nTx3RFZ46rfZsqQCohwK7Hgr4HaXpZUgcR9PjWBfo9LikIRSQBWZ93V8a0vUyJI5jpKRA6UY8NSAgeoeAGmmBQu/9UDrSvAXwQQRCPRRQA4X6PhI/V6r59al0oxZPDQisSPUVlzQ9lLx6iLi3AEiIHgqk3qHk886rCjA/7TWADjESugZ0vUncO5RSJV3W9VBAlTRZ9w6xXdIkrwkDaKAjxQfY1WwOoIFQdGvADaDMzmz+f6SMYEX4z7hMAAAAAElFTkSuQmCC'};return{FaviconsByHue,};});'use strict';Polymer({is:'tr-ui-b-info-bar-group',ready(){this.messages_=[];},get messageCount(){return this.messages_.length;},clearMessages(){this.messages_=[];this.updateContents_();},addMessage(text,opt_buttons){opt_buttons=opt_buttons||[];for(let i=0;i<opt_buttons.length;i++){if(opt_buttons[i].buttonText===undefined){throw new Error('buttonText must be provided');}
-if(opt_buttons[i].onClick===undefined){throw new Error('onClick must be provided');}}
-this.messages_.push({text,buttons:opt_buttons||[]});this.updateContents_();},updateContents_(){Polymer.dom(this.$.messages).textContent='';this.messages_.forEach(function(message){const bar=document.createElement('tr-ui-b-info-bar');bar.message=message.text;bar.visible=true;message.buttons.forEach(function(button){bar.addButton(button.buttonText,button.onClick);},this);Polymer.dom(this.$.messages).appendChild(bar);},this);}});'use strict';Polymer({is:'tr-ui-b-toolbar-button'});'use strict';tr.exportTo('tr.ui',function(){const Task=tr.b.Task;function FindController(brushingStateController){this.brushingStateController_=brushingStateController;this.filterHits_=[];this.currentHitIndex_=-1;this.activePromise_=Promise.resolve();this.activeTask_=undefined;}
-FindController.prototype={__proto__:Object.prototype,get model(){return this.brushingStateController_.model;},get brushingStateController(){return this.brushingStateController_;},enqueueOperation_(operation){let task;if(operation instanceof tr.b.Task){task=operation;}else{task=new tr.b.Task(operation,this);}
-if(this.activeTask_){this.activeTask_=this.activeTask_.enqueue(task);}else{this.activeTask_=task;this.activePromise_=Task.RunWhenIdle(this.activeTask_);this.activePromise_.then(function(){this.activePromise_=undefined;this.activeTask_=undefined;}.bind(this));}},startFiltering(filterText){const sc=this.brushingStateController_;if(!sc)return;this.enqueueOperation_(function(){this.filterHits_=[];this.currentHitIndex_=-1;}.bind(this));let stateFromString;try{stateFromString=sc.uiStateFromString(filterText);}catch(e){this.enqueueOperation_(function(){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent=e.message;overlay.title='UI State Navigation Error';overlay.visible=true;});return this.activePromise_;}
-if(stateFromString!==undefined){this.enqueueOperation_(sc.navToPosition.bind(this,stateFromString,true));}else{if(filterText.length===0){this.enqueueOperation_(sc.findTextCleared.bind(sc));}else{const filter=new tr.c.FullTextFilter(filterText);const filterHitSet=new tr.model.EventSet();this.enqueueOperation_(sc.addAllEventsMatchingFilterToSelectionAsTask(filter,filterHitSet));this.enqueueOperation_(function(){this.filterHits_=filterHitSet.toArray();sc.findTextChangedTo(filterHitSet);}.bind(this));}}
-return this.activePromise_;},get filterHits(){return this.filterHits_;},get currentHitIndex(){return this.currentHitIndex_;},find_(dir){const firstHit=this.currentHitIndex_===-1;if(firstHit&&dir<0){this.currentHitIndex_=0;}
-const N=this.filterHits.length;this.currentHitIndex_=(this.currentHitIndex_+dir+N)%N;if(!this.brushingStateController_)return;this.brushingStateController_.findFocusChangedTo(new tr.model.EventSet(this.filterHits[this.currentHitIndex]));},findNext(){this.find_(1);},findPrevious(){this.find_(-1);}};return{FindController,};});'use strict';tr.exportTo('tr.ui.b',function(){function TimingTool(viewport,targetElement){this.viewport_=viewport;this.onMouseMove_=this.onMouseMove_.bind(this);this.onDblClick_=this.onDblClick_.bind(this);this.targetElement_=targetElement;this.isMovingLeftEdge_=false;}
-TimingTool.prototype={onEnterTiming(e){this.targetElement_.addEventListener('mousemove',this.onMouseMove_);this.targetElement_.addEventListener('dblclick',this.onDblClick_);},onBeginTiming(e){if(!this.isTouchPointInsideTrackBounds_(e.clientX,e.clientY)){return;}
-const pt=this.getSnappedToEventPosition_(e);this.mouseDownAt_(pt.x,pt.y);this.updateSnapIndicators_(pt);},updateSnapIndicators_(pt){if(!pt.snapped)return;const ir=this.viewport_.interestRange;if(ir.min===pt.x){ir.leftSnapIndicator=new tr.ui.SnapIndicator(pt.y,pt.height);}
-if(ir.max===pt.x){ir.rightSnapIndicator=new tr.ui.SnapIndicator(pt.y,pt.height);}},onUpdateTiming(e){const pt=this.getSnappedToEventPosition_(e);this.mouseMoveAt_(pt.x,pt.y,true);this.updateSnapIndicators_(pt);},onEndTiming(e){this.mouseUp_();},onExitTiming(e){this.targetElement_.removeEventListener('mousemove',this.onMouseMove_);this.targetElement_.removeEventListener('dblclick',this.onDblClick_);},onMouseMove_(e){if(e.button)return;const worldX=this.getWorldXFromEvent_(e);this.mouseMoveAt_(worldX,e.clientY,false);},onDblClick_(e){},isTouchPointInsideTrackBounds_(clientX,clientY){if(!this.viewport_||!this.viewport_.modelTrackContainer||!this.viewport_.modelTrackContainer.canvas){return false;}
-const canvas=this.viewport_.modelTrackContainer.canvas;const canvasRect=canvas.getBoundingClientRect();if(clientX>=canvasRect.left&&clientX<=canvasRect.right&&clientY>=canvasRect.top&&clientY<=canvasRect.bottom){return true;}
-return false;},mouseDownAt_(worldX,y){const ir=this.viewport_.interestRange;const dt=this.viewport_.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const nearnessThresholdWorld=dt.xViewVectorToWorld(6*pixelRatio);if(ir.isEmpty){ir.setMinAndMax(worldX,worldX);ir.rightSelected=true;this.isMovingLeftEdge_=false;return;}
-if(Math.abs(worldX-ir.min)<nearnessThresholdWorld){ir.leftSelected=true;ir.min=worldX;this.isMovingLeftEdge_=true;return;}
-if(Math.abs(worldX-ir.max)<nearnessThresholdWorld){ir.rightSelected=true;ir.max=worldX;this.isMovingLeftEdge_=false;return;}
-ir.setMinAndMax(worldX,worldX);ir.rightSelected=true;this.isMovingLeftEdge_=false;},mouseMoveAt_(worldX,y,mouseDown){if(mouseDown){this.updateMovingEdge_(worldX);return;}
-const ir=this.viewport_.interestRange;const dt=this.viewport_.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const nearnessThresholdWorld=dt.xViewVectorToWorld(6*pixelRatio);if(Math.abs(worldX-ir.min)<nearnessThresholdWorld){ir.leftSelected=true;ir.rightSelected=false;return;}
-if(Math.abs(worldX-ir.max)<nearnessThresholdWorld){ir.leftSelected=false;ir.rightSelected=true;return;}
-ir.leftSelected=false;ir.rightSelected=false;return;},updateMovingEdge_(newWorldX){const ir=this.viewport_.interestRange;let a=ir.min;let b=ir.max;if(this.isMovingLeftEdge_){a=newWorldX;}else{b=newWorldX;}
-if(a<=b){ir.setMinAndMax(a,b);}else{ir.setMinAndMax(b,a);}
-if(ir.min===newWorldX){this.isMovingLeftEdge_=true;ir.leftSelected=true;ir.rightSelected=false;}else{this.isMovingLeftEdge_=false;ir.leftSelected=false;ir.rightSelected=true;}},mouseUp_(){const dt=this.viewport_.currentDisplayTransform;const ir=this.viewport_.interestRange;ir.leftSelected=false;ir.rightSelected=false;const pixelRatio=window.devicePixelRatio||1;const minWidthValue=dt.xViewVectorToWorld(2*pixelRatio);if(ir.range<minWidthValue){ir.reset();}},getWorldXFromEvent_(e){const pixelRatio=window.devicePixelRatio||1;const canvas=this.viewport_.modelTrackContainer.canvas;const worldOffset=canvas.getBoundingClientRect().left;const viewX=(e.clientX-worldOffset)*pixelRatio;return this.viewport_.currentDisplayTransform.xViewToWorld(viewX);},getSnappedToEventPosition_(e){const pixelRatio=window.devicePixelRatio||1;const EVENT_SNAP_RANGE=16*pixelRatio;const modelTrackContainer=this.viewport_.modelTrackContainer;const modelTrackContainerRect=modelTrackContainer.getBoundingClientRect();const viewport=this.viewport_;const dt=viewport.currentDisplayTransform;const worldMaxDist=dt.xViewVectorToWorld(EVENT_SNAP_RANGE);const worldX=this.getWorldXFromEvent_(e);const mouseY=e.clientY;const selection=new tr.model.EventSet();modelTrackContainer.addClosestEventToSelection(worldX,worldMaxDist,mouseY,mouseY,selection);if(!selection.length){modelTrackContainer.addClosestEventToSelection(worldX,worldMaxDist,modelTrackContainerRect.top,modelTrackContainerRect.bottom,selection);}
-let minDistX=worldMaxDist;let minDistY=Infinity;const pixWidth=dt.xViewVectorToWorld(1);const result={x:worldX,y:mouseY-modelTrackContainerRect.top,height:0,snapped:false};const eventBounds=new tr.b.math.Range();for(const event of selection){const track=viewport.trackForEvent(event);const trackRect=track.getBoundingClientRect();eventBounds.reset();event.addBoundsToRange(eventBounds);let eventX;if(Math.abs(eventBounds.min-worldX)<Math.abs(eventBounds.max-worldX)){eventX=eventBounds.min;}else{eventX=eventBounds.max;}
-const distX=eventX-worldX;const eventY=trackRect.top;const eventHeight=trackRect.height;const distY=Math.abs(eventY+eventHeight/2-mouseY);if((distX<=minDistX||Math.abs(distX-minDistX)<pixWidth)&&distY<minDistY){minDistX=distX;minDistY=distY;result.x=eventX;result.y=eventY+
-modelTrackContainer.scrollTop-modelTrackContainerRect.top;result.height=eventHeight;result.snapped=true;}}
-return result;}};return{TimingTool,};});'use strict';tr.exportTo('tr.ui',function(){const kDefaultPanAnimationDurationMs=100.0;const lerp=tr.b.math.lerp;function TimelineDisplayTransformPanAnimation(deltaX,deltaY,opt_durationMs){this.deltaX=deltaX;this.deltaY=deltaY;if(opt_durationMs===undefined){this.durationMs=kDefaultPanAnimationDurationMs;}else{this.durationMs=opt_durationMs;}
-this.startPanX=undefined;this.startPanY=undefined;this.startTimeMs=undefined;}
-TimelineDisplayTransformPanAnimation.prototype={__proto__:tr.ui.b.Animation.prototype,get affectsPanY(){return this.deltaY!==0;},canTakeOverFor(existingAnimation){return existingAnimation instanceof TimelineDisplayTransformPanAnimation;},takeOverFor(existing,timestamp,target){const remainingDeltaXOnExisting=existing.goalPanX-target.panX;const remainingDeltaYOnExisting=existing.goalPanY-target.panY;let remainingTimeOnExisting=timestamp-(existing.startTimeMs+existing.durationMs);remainingTimeOnExisting=Math.max(remainingTimeOnExisting,0);this.deltaX+=remainingDeltaXOnExisting;this.deltaY+=remainingDeltaYOnExisting;this.durationMs+=remainingTimeOnExisting;},start(timestamp,target){this.startTimeMs=timestamp;this.startPanX=target.panX;this.startPanY=target.panY;},tick(timestamp,target){let percentDone=(timestamp-this.startTimeMs)/this.durationMs;percentDone=tr.b.math.clamp(percentDone,0,1);target.panX=lerp(percentDone,this.startPanX,this.goalPanX);if(this.affectsPanY){target.panY=lerp(percentDone,this.startPanY,this.goalPanY);}
-return timestamp>=this.startTimeMs+this.durationMs;},get goalPanX(){return this.startPanX+this.deltaX;},get goalPanY(){return this.startPanY+this.deltaY;}};function TimelineDisplayTransformZoomToAnimation(goalFocalPointXWorld,goalFocalPointXView,goalFocalPointY,zoomInRatioX,opt_durationMs){this.goalFocalPointXWorld=goalFocalPointXWorld;this.goalFocalPointXView=goalFocalPointXView;this.goalFocalPointY=goalFocalPointY;this.zoomInRatioX=zoomInRatioX;if(opt_durationMs===undefined){this.durationMs=kDefaultPanAnimationDurationMs;}else{this.durationMs=opt_durationMs;}
-this.startTimeMs=undefined;this.startScaleX=undefined;this.goalScaleX=undefined;this.startPanY=undefined;}
-TimelineDisplayTransformZoomToAnimation.prototype={__proto__:tr.ui.b.Animation.prototype,get affectsPanY(){return this.startPanY!==this.goalFocalPointY;},canTakeOverFor(existingAnimation){return false;},takeOverFor(existingAnimation,timestamp,target){this.goalScaleX=target.scaleX*this.zoomInRatioX;},start(timestamp,target){this.startTimeMs=timestamp;this.startScaleX=target.scaleX;this.goalScaleX=this.zoomInRatioX*target.scaleX;this.startPanY=target.panY;},tick(timestamp,target){let percentDone=(timestamp-this.startTimeMs)/this.durationMs;percentDone=tr.b.math.clamp(percentDone,0,1);target.scaleX=lerp(percentDone,this.startScaleX,this.goalScaleX);if(this.affectsPanY){target.panY=lerp(percentDone,this.startPanY,this.goalFocalPointY);}
-target.xPanWorldPosToViewPos(this.goalFocalPointXWorld,this.goalFocalPointXView);return timestamp>=this.startTimeMs+this.durationMs;}};return{TimelineDisplayTransformPanAnimation,TimelineDisplayTransformZoomToAnimation,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const DrawType={GENERAL_EVENT:1,INSTANT_EVENT:2,BACKGROUND:3,GRID:4,FLOW_ARROWS:5,MARKERS:6,HIGHLIGHTS:7,ANNOTATIONS:8};const MAX_OVERSIZE_MULTIPLE=3.0;const REDRAW_SLOP=(MAX_OVERSIZE_MULTIPLE-1)/2;const DrawingContainer=tr.ui.b.define('drawing-container',tr.ui.tracks.Track);DrawingContainer.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('drawing-container');this.canvas_=document.createElement('canvas');this.canvas_.className='drawing-container-canvas';this.canvas_.style.left=tr.ui.b.constants.HEADING_WIDTH+'px';Polymer.dom(this).appendChild(this.canvas_);this.ctx_=this.canvas_.getContext('2d');this.offsetY_=0;this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener('change',this.viewportChange_);window.addEventListener('resize',this.windowResized_.bind(this));this.addEventListener('scroll',this.scrollChanged_.bind(this));},get canvas(){return this.canvas_;},context(){return this.ctx_;},viewportChange_(){this.invalidate();},windowResized_(){this.invalidate();},scrollChanged_(){if(this.updateOffsetY_()){this.invalidate();}},invalidate(){if(this.rafPending_)return;this.rafPending_=true;tr.b.requestPreAnimationFrame(this.preDraw_,this);},preDraw_(){this.rafPending_=false;this.updateCanvasSizeIfNeeded_();tr.b.requestAnimationFrameInThisFrameIfPossible(this.draw_,this);},draw_(){this.ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height);const typesToDraw=[DrawType.BACKGROUND,DrawType.HIGHLIGHTS,DrawType.GRID,DrawType.INSTANT_EVENT,DrawType.GENERAL_EVENT,DrawType.MARKERS,DrawType.ANNOTATIONS,DrawType.FLOW_ARROWS];const children=this.children;for(const idx in typesToDraw){for(let i=0;i<children.length;++i){if(!(children[i]instanceof tr.ui.tracks.Track)){continue;}
-children[i].drawTrack(typesToDraw[idx]);}}
-const pixelRatio=window.devicePixelRatio||1;const bounds=this.canvas_.getBoundingClientRect();const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(bounds.width*pixelRatio);const viewHeight=bounds.height*pixelRatio;this.viewport.drawGridLines(this.ctx_,viewLWorld,viewRWorld,viewHeight);},updateOffsetY_(){const maxYDelta=window.innerHeight*REDRAW_SLOP;let newOffset=this.scrollTop-maxYDelta;if(Math.abs(newOffset-this.offsetY_)<=maxYDelta)return false;const maxOffset=this.scrollHeight-
-this.canvas_.getBoundingClientRect().height;newOffset=Math.max(0,Math.min(newOffset,maxOffset));if(newOffset!==this.offsetY_){this.offsetY_=newOffset;return true;}
-return false;},updateCanvasSizeIfNeeded_(){const visibleChildTracks=Array.from(this.children).filter(this.visibleFilter_);if(visibleChildTracks.length===0){return;}
-const thisBounds=this.getBoundingClientRect();const firstChildTrackBounds=visibleChildTracks[0].getBoundingClientRect();const lastChildTrackBounds=visibleChildTracks[visibleChildTracks.length-1].getBoundingClientRect();const innerWidth=firstChildTrackBounds.width-
-tr.ui.b.constants.HEADING_WIDTH;const innerHeight=Math.min(lastChildTrackBounds.bottom-firstChildTrackBounds.top,Math.floor(window.innerHeight*MAX_OVERSIZE_MULTIPLE));const pixelRatio=window.devicePixelRatio||1;if(this.canvas_.width!==innerWidth*pixelRatio){this.canvas_.width=innerWidth*pixelRatio;this.canvas_.style.width=innerWidth+'px';}
-if(this.canvas_.height!==innerHeight*pixelRatio){this.canvas_.height=innerHeight*pixelRatio;this.canvas_.style.height=innerHeight+'px';}
-if(this.canvas_.top!==this.offsetY_){this.canvas_.top=this.offsetY_;this.canvas_.style.top=this.offsetY_+'px';}},visibleFilter_(element){if(!(element instanceof tr.ui.tracks.Track))return false;return window.getComputedStyle(element).display!=='none';},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const children=this.children;for(let i=0;i<children.length;++i){if(!(children[i]instanceof tr.ui.tracks.Track)){continue;}
-const trackClientRect=children[i].getBoundingClientRect();const a=Math.max(loY,trackClientRect.top);const b=Math.min(hiY,trackClientRect.bottom);if(a<=b){children[i].addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection);}}
-tr.ui.tracks.Track.prototype.addClosestEventToSelection.apply(this,arguments);},addEventsToTrackMap(eventToTrackMap){const children=this.children;for(let i=0;i<children.length;++i){if(!(children[i]instanceof tr.ui.tracks.Track)){continue;}
-children[i].addEventsToTrackMap(eventToTrackMap);}}};return{DrawingContainer,DrawType,};});'use strict';tr.exportTo('tr.model',function(){const SelectableItem=tr.model.SelectableItem;const SelectionState=tr.model.SelectionState;function ProxySelectableItem(modelItem){SelectableItem.call(this,modelItem);}
-ProxySelectableItem.prototype={__proto__:SelectableItem.prototype,get selectionState(){const modelItem=this.modelItem_;if(modelItem===undefined){return SelectionState.NONE;}
-return modelItem.selectionState;}};return{ProxySelectableItem,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const EventPresenter=tr.ui.b.EventPresenter;const SelectionState=tr.model.SelectionState;const LetterDotTrack=tr.ui.b.define('letter-dot-track',tr.ui.tracks.Track);LetterDotTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('letter-dot-track');this.items_=undefined;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},get items(){return this.items_;},set items(items){this.items_=items;this.invalidateDrawingContainer();},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;},get dumpRadiusView(){return 7*(window.devicePixelRatio||1);},draw(type,viewLWorld,viewRWorld,viewHeight){if(this.items_===undefined)return;switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawLetterDots_(viewLWorld,viewRWorld);break;}},drawLetterDots_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const height=bounds.height*pixelRatio;const halfHeight=height*0.5;const twoPi=Math.PI*2;const dt=this.viewport.currentDisplayTransform;const dumpRadiusView=this.dumpRadiusView;const itemRadiusWorld=dt.xViewVectorToWorld(height);const items=this.items_;const loI=tr.b.findLowIndexInSortedArray(items,function(item){return item.start;},viewLWorld);const oldFont=ctx.font;ctx.font='400 '+Math.floor(9*pixelRatio)+'px Arial';ctx.strokeStyle='rgb(0,0,0)';ctx.textBaseline='middle';ctx.textAlign='center';const drawItems=function(selected){for(let i=loI;i<items.length;++i){const item=items[i];const x=item.start;if(x-itemRadiusWorld>viewRWorld)break;if(item.selected!==selected)continue;const xView=dt.xWorldToView(x);ctx.fillStyle=EventPresenter.getSelectableItemColorAsString(item);ctx.beginPath();ctx.arc(xView,halfHeight,dumpRadiusView+0.5,0,twoPi);ctx.fill();if(item.selected){ctx.lineWidth=3;ctx.strokeStyle='rgb(100,100,0)';ctx.stroke();ctx.beginPath();ctx.arc(xView,halfHeight,dumpRadiusView,0,twoPi);ctx.lineWidth=1.5;ctx.strokeStyle='rgb(255,255,0)';ctx.stroke();}else{ctx.lineWidth=1;ctx.strokeStyle='rgb(0,0,0)';ctx.stroke();}
-ctx.fillStyle='rgb(255, 255, 255)';ctx.fillText(item.dotLetter,xView,halfHeight);}};drawItems(false);drawItems(true);ctx.lineWidth=1;ctx.font=oldFont;},addEventsToTrackMap(eventToTrackMap){if(this.items_===undefined)return;this.items_.forEach(function(item){item.addToTrackMap(eventToTrackMap,this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){if(this.items_===undefined)return;const itemRadiusWorld=viewPixWidthWorld*this.dumpRadiusView;tr.b.iterateOverIntersectingIntervals(this.items_,function(x){return x.start-itemRadiusWorld;},function(x){return 2*itemRadiusWorld;},loWX,hiWX,function(item){item.addToSelection(selection);}.bind(this));},addEventNearToProvidedEventToSelection(event,offset,selection){if(this.items_===undefined)return;const index=this.items_.findIndex(item=>item.modelItem===event);if(index===-1)return false;const newIndex=index+offset;if(newIndex>=0&&newIndex<this.items_.length){this.items_[newIndex].addToSelection(selection);return true;}
-return false;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){if(this.items_===undefined)return;const item=tr.b.findClosestElementInSortedArray(this.items_,function(x){return x.start;},worldX,worldMaxDist);if(!item)return;item.addToSelection(selection);}};function LetterDot(modelItem,dotLetter,colorId,start){tr.model.ProxySelectableItem.call(this,modelItem);this.dotLetter=dotLetter;this.colorId=colorId;this.start=start;}
-LetterDot.prototype={__proto__:tr.model.ProxySelectableItem.prototype};return{LetterDotTrack,LetterDot,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const AlertTrack=tr.ui.b.define('alert-track',tr.ui.tracks.LetterDotTrack);AlertTrack.prototype={__proto__:tr.ui.tracks.LetterDotTrack.prototype,decorate(viewport){tr.ui.tracks.LetterDotTrack.prototype.decorate.call(this,viewport);this.heading='Alerts';this.alerts_=undefined;},get alerts(){return this.alerts_;},set alerts(alerts){this.alerts_=alerts;if(alerts===undefined){this.items=undefined;return;}
-this.items=this.alerts_.map(function(alert){return new tr.ui.tracks.LetterDot(alert,String.fromCharCode(9888),alert.colorId,alert.start);});}};return{AlertTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const Task=tr.b.Task;const ContainerTrack=tr.ui.b.define('container-track',tr.ui.tracks.Track);ContainerTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);},detach(){Polymer.dom(this).textContent='';},get tracks_(){const tracks=[];const children=this.children;for(let i=0;i<children.length;i++){if(children[i]instanceof tr.ui.tracks.Track){tracks.push(children[i]);}}
-return tracks;},drawTrack(type){this.tracks_.forEach(function(track){track.drawTrack(type);});},addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection){const tracks=this.tracks_;for(let i=0;i<tracks.length;i++){const trackClientRect=tracks[i].getBoundingClientRect();const a=Math.max(loY,trackClientRect.top);const b=Math.min(hiY,trackClientRect.bottom);if(a<=b){tracks[i].addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection);}}
-tr.ui.tracks.Track.prototype.addIntersectingEventsInRangeToSelection.apply(this,arguments);},addEventsToTrackMap(eventToTrackMap){for(const track of this.tracks_){track.addEventsToTrackMap(eventToTrackMap);}},addAllEventsMatchingFilterToSelection(filter,selection){const tracks=this.tracks_;for(let i=0;i<tracks.length;i++){tracks[i].addAllEventsMatchingFilterToSelection(filter,selection);}},addAllEventsMatchingFilterToSelectionAsTask(filter,selection){const task=new Task();const tracks=this.tracks_;for(let i=0;i<tracks.length;i++){task.subTask(function(i){return function(){tracks[i].addAllEventsMatchingFilterToSelection(filter,selection);};}(i),this);}
-return task;},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const tracks=this.tracks_;for(let i=0;i<tracks.length;i++){const trackClientRect=tracks[i].getBoundingClientRect();const a=Math.max(loY,trackClientRect.top);const b=Math.min(hiY,trackClientRect.bottom);if(a<=b){tracks[i].addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection);}}
-tr.ui.tracks.Track.prototype.addClosestEventToSelection.apply(this,arguments);},addContainersToTrackMap(containerToTrackMap){this.tracks_.forEach(function(track){track.addContainersToTrackMap(containerToTrackMap);});},clearTracks_(){this.tracks_.forEach(function(track){Polymer.dom(this).removeChild(track);},this);}};return{ContainerTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function ChartPoint(modelItem,x,y,opt_yBase){tr.model.ProxySelectableItem.call(this,modelItem);this.x=x;this.y=y;this.dotLetter=undefined;this.yBase=opt_yBase;}
-ChartPoint.prototype={__proto__:tr.model.ProxySelectableItem.prototype,};return{ChartPoint,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const EventPresenter=tr.ui.b.EventPresenter;const SelectionState=tr.model.SelectionState;const ChartSeriesType={LINE:0,AREA:1};const DEFAULT_RENDERING_CONFIG={chartType:ChartSeriesType.LINE,selectedPointSize:4,unselectedPointSize:3,solidSelectedDots:false,colorId:0,lineWidth:1,skipDistance:1,unselectedPointDensityTransparent:0.10,unselectedPointDensityOpaque:0.05,backgroundOpacity:0.5,stepGraph:true};const LAST_POINT_WIDTH=16;const DOT_LETTER_RADIUS_PX=7;const DOT_LETTER_RADIUS_PADDING_PX=0.5;const DOT_LETTER_SELECTED_OUTLINE_WIDTH_PX=3;const DOT_LETTER_SELECTED_OUTLINE_DETAIL_WIDTH_PX=1.5;const DOT_LETTER_UNSELECTED_OUTLINE_WIDTH_PX=1;const DOT_LETTER_FONT_WEIGHT=400;const DOT_LETTER_FONT_SIZE_PX=9;const DOT_LETTER_FONT='Arial';const ChartSeriesComponent={BACKGROUND:0,LINE:1,DOTS:2};function ChartSeries(points,seriesYAxis,opt_renderingConfig){this.points=points;this.seriesYAxis=seriesYAxis;this.useRenderingConfig_(opt_renderingConfig);}
-ChartSeries.prototype={useRenderingConfig_(opt_renderingConfig){const config=opt_renderingConfig||{};for(const[key,defaultValue]of
-Object.entries(DEFAULT_RENDERING_CONFIG)){let value=config[key];if(value===undefined){value=defaultValue;}
-this[key+'_']=value;}
-this.topPadding=this.bottomPadding=Math.max(this.selectedPointSize_,this.unselectedPointSize_)/2;},get range(){const range=new tr.b.math.Range();this.points.forEach(function(point){range.addValue(point.y);},this);return range;},draw(ctx,transform,highDetails){if(this.points===undefined||this.points.length===0){return;}
-if(this.chartType_===ChartSeriesType.AREA){this.drawComponent_(ctx,transform,ChartSeriesComponent.BACKGROUND,highDetails);}
-if(this.chartType_===ChartSeriesType.LINE||highDetails){this.drawComponent_(ctx,transform,ChartSeriesComponent.LINE,highDetails);}
-this.drawComponent_(ctx,transform,ChartSeriesComponent.DOTS,highDetails);},drawComponent_(ctx,transform,component,highDetails){let extraPixels=0;if(component===ChartSeriesComponent.DOTS){extraPixels=Math.max(this.selectedPointSize_,this.unselectedPointSize_);}
-const pixelRatio=transform.pixelRatio;const leftViewX=transform.leftViewX-extraPixels*pixelRatio;const rightViewX=transform.rightViewX+extraPixels*pixelRatio;const leftTimestamp=transform.leftTimestamp-extraPixels;const rightTimestamp=transform.rightTimestamp+extraPixels;const firstVisibleIndex=tr.b.findLowIndexInSortedArray(this.points,function(point){return point.x;},leftTimestamp);let lastVisibleIndex=tr.b.findLowIndexInSortedArray(this.points,function(point){return point.x;},rightTimestamp);if(lastVisibleIndex>=this.points.length||this.points[lastVisibleIndex].x>rightTimestamp){lastVisibleIndex--;}
-const viewSkipDistance=this.skipDistance_*pixelRatio;let selectedCircleRadius;let letterDotRadius;let squareSize;let squareHalfSize;let squareOpacity;let unselectedSeriesColor;let currentStateSeriesColor;ctx.save();ctx.font=DOT_LETTER_FONT_WEIGHT+' '+
-Math.floor(DOT_LETTER_FONT_SIZE_PX*pixelRatio)+'px '+
-DOT_LETTER_FONT;ctx.textBaseline='middle';ctx.textAlign='center';switch(component){case ChartSeriesComponent.DOTS:{selectedCircleRadius=(this.selectedPointSize_/2)*pixelRatio;letterDotRadius=Math.max(selectedCircleRadius,DOT_LETTER_RADIUS_PX*pixelRatio);squareSize=this.unselectedPointSize_*pixelRatio;squareHalfSize=squareSize/2;unselectedSeriesColor=EventPresenter.getCounterSeriesColor(this.colorId_,SelectionState.NONE);if(!highDetails){squareOpacity=0;break;}
-const visibleIndexRange=lastVisibleIndex-firstVisibleIndex;if(visibleIndexRange<=0){squareOpacity=1;break;}
-const visibleViewXRange=transform.worldXToViewX(this.points[lastVisibleIndex].x)-
-transform.worldXToViewX(this.points[firstVisibleIndex].x);if(visibleViewXRange===0){squareOpacity=1;break;}
-const density=visibleIndexRange/visibleViewXRange;const clampedDensity=tr.b.math.clamp(density,this.unselectedPointDensityOpaque_,this.unselectedPointDensityTransparent_);const densityRange=this.unselectedPointDensityTransparent_-
-this.unselectedPointDensityOpaque_;squareOpacity=(this.unselectedPointDensityTransparent_-clampedDensity)/densityRange;break;}
-case ChartSeriesComponent.LINE:ctx.strokeStyle=EventPresenter.getCounterSeriesColor(this.colorId_,SelectionState.NONE);ctx.lineWidth=this.lineWidth_*pixelRatio;break;case ChartSeriesComponent.BACKGROUND:break;default:throw new Error('Invalid component: '+component);}
-let previousViewX=undefined;let previousViewY=undefined;let previousViewYBase=undefined;let lastSelectionState=undefined;let baseSteps=undefined;const startIndex=Math.max(firstVisibleIndex-1,0);let currentViewX;for(let i=startIndex;i<this.points.length;i++){const currentPoint=this.points[i];currentViewX=transform.worldXToViewX(currentPoint.x);if(currentViewX>rightViewX){if(previousViewX!==undefined){previousViewX=currentViewX=rightViewX;if(component===ChartSeriesComponent.BACKGROUND||component===ChartSeriesComponent.LINE){ctx.lineTo(currentViewX,previousViewY);}}
-break;}
-if(i+1<this.points.length){const nextPoint=this.points[i+1];const nextViewX=transform.worldXToViewX(nextPoint.x);if(previousViewX!==undefined&&nextViewX-previousViewX<=viewSkipDistance&&nextViewX<rightViewX){continue;}
-if(currentViewX<leftViewX){currentViewX=leftViewX;}}
-if(previousViewX!==undefined&&currentViewX-previousViewX<viewSkipDistance){currentViewX=previousViewX+viewSkipDistance;}
-const currentViewY=Math.round(transform.worldYToViewY(currentPoint.y));let currentViewYBase;if(currentPoint.yBase===undefined){currentViewYBase=transform.outerBottomViewY;}else{currentViewYBase=Math.round(transform.worldYToViewY(currentPoint.yBase));}
-const currentSelectionState=currentPoint.selectionState;if(currentSelectionState!==lastSelectionState){const opacity=currentSelectionState===SelectionState.SELECTED?1:squareOpacity;currentStateSeriesColor=EventPresenter.getCounterSeriesColor(this.colorId_,currentSelectionState,opacity);}
-switch(component){case ChartSeriesComponent.DOTS:if(currentPoint.dotLetter){ctx.fillStyle=unselectedSeriesColor;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('black');ctx.beginPath();ctx.arc(currentViewX,currentViewY,letterDotRadius+DOT_LETTER_RADIUS_PADDING_PX,0,2*Math.PI);ctx.fill();if(currentSelectionState===SelectionState.SELECTED){ctx.lineWidth=DOT_LETTER_SELECTED_OUTLINE_WIDTH_PX;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('olive');ctx.stroke();ctx.beginPath();ctx.arc(currentViewX,currentViewY,letterDotRadius,0,2*Math.PI);ctx.lineWidth=DOT_LETTER_SELECTED_OUTLINE_DETAIL_WIDTH_PX;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('yellow');ctx.stroke();}else{ctx.lineWidth=DOT_LETTER_UNSELECTED_OUTLINE_WIDTH_PX;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('black');ctx.stroke();}
-ctx.fillStyle=ColorScheme.getColorForReservedNameAsString('white');ctx.fillText(currentPoint.dotLetter,currentViewX,currentViewY);}else{ctx.strokeStyle=unselectedSeriesColor;ctx.lineWidth=pixelRatio;if(currentSelectionState===SelectionState.SELECTED){if(this.solidSelectedDots_){ctx.fillStyle=ctx.strokeStyle;}else{ctx.fillStyle=currentStateSeriesColor;}
-ctx.beginPath();ctx.arc(currentViewX,currentViewY,selectedCircleRadius,0,2*Math.PI);ctx.fill();ctx.stroke();}else if(squareOpacity>0){ctx.fillStyle=currentStateSeriesColor;ctx.fillRect(currentViewX-squareHalfSize,currentViewY-squareHalfSize,squareSize,squareSize);}}
-break;case ChartSeriesComponent.LINE:if(previousViewX===undefined){ctx.beginPath();ctx.moveTo(currentViewX,currentViewY);}else if(this.stepGraph_){ctx.lineTo(currentViewX,previousViewY);}
-ctx.lineTo(currentViewX,currentViewY);break;case ChartSeriesComponent.BACKGROUND:if(previousViewX!==undefined&&this.stepGraph_){ctx.lineTo(currentViewX,previousViewY);}else{ctx.lineTo(currentViewX,currentViewY);}
-if(currentSelectionState!==lastSelectionState){if(previousViewX!==undefined){let previousBaseStepViewX=currentViewX;for(let j=baseSteps.length-1;j>=0;j--){const baseStep=baseSteps[j];const baseStepViewX=baseStep.viewX;const baseStepViewY=baseStep.viewY;ctx.lineTo(previousBaseStepViewX,baseStepViewY);ctx.lineTo(baseStepViewX,baseStepViewY);previousBaseStepViewX=baseStepViewX;}
-ctx.closePath();ctx.fill();}
-ctx.beginPath();ctx.fillStyle=EventPresenter.getCounterSeriesColor(this.colorId_,currentSelectionState,this.backgroundOpacity_);ctx.moveTo(currentViewX,currentViewYBase);baseSteps=[];}
-if(currentViewYBase!==previousViewYBase||currentSelectionState!==lastSelectionState){baseSteps.push({viewX:currentViewX,viewY:currentViewYBase});}
-ctx.lineTo(currentViewX,currentViewY);break;default:throw new Error('Not reachable');}
-previousViewX=currentViewX;previousViewY=currentViewY;previousViewYBase=currentViewYBase;lastSelectionState=currentSelectionState;}
-if(previousViewX!==undefined){switch(component){case ChartSeriesComponent.DOTS:break;case ChartSeriesComponent.LINE:ctx.stroke();break;case ChartSeriesComponent.BACKGROUND:{let previousBaseStepViewX=currentViewX;for(let j=baseSteps.length-1;j>=0;j--){const baseStep=baseSteps[j];const baseStepViewX=baseStep.viewX;const baseStepViewY=baseStep.viewY;ctx.lineTo(previousBaseStepViewX,baseStepViewY);ctx.lineTo(baseStepViewX,baseStepViewY);previousBaseStepViewX=baseStepViewX;}
-ctx.closePath();ctx.fill();break;}
-default:throw new Error('Not reachable');}}
-ctx.restore();},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){const points=this.points;function getPointWidth(point,i){if(i===points.length-1){return LAST_POINT_WIDTH*viewPixWidthWorld;}
-const nextPoint=points[i+1];return nextPoint.x-point.x;}
-function selectPoint(point){point.addToSelection(selection);}
-tr.b.iterateOverIntersectingIntervals(this.points,function(point){return point.x;},getPointWidth,loWX,hiWX,selectPoint);},addEventNearToProvidedEventToSelection(event,offset,selection){if(this.points===undefined)return false;const index=this.points.findIndex(point=>point.modelItem===event);if(index===-1)return false;const newIndex=index+offset;if(newIndex<0||newIndex>=this.points.length)return false;this.points[newIndex].addToSelection(selection);return true;},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){if(this.points===undefined)return;const item=tr.b.findClosestElementInSortedArray(this.points,function(point){return point.x;},worldX,worldMaxDist);if(!item)return;item.addToSelection(selection);}};return{ChartSeries,ChartSeriesType,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const IDEAL_MAJOR_MARK_HEIGHT_PX=30;const AXIS_LABLE_MARGIN_PX=10;const AXIS_LABLE_FONT_SIZE_PX=9;const AXIS_LABLE_FONT='Arial';function ChartSeriesYAxis(opt_min,opt_max){this.guid_=tr.b.GUID.allocateSimple();this.bounds=new tr.b.math.Range();if(opt_min!==undefined)this.bounds.addValue(opt_min);if(opt_max!==undefined)this.bounds.addValue(opt_max);}
-ChartSeriesYAxis.prototype={get guid(){return this.guid_;},valueToUnitRange(value){if(this.bounds.isEmpty){throw new Error('Chart series y-axis bounds are empty');}
-const bounds=this.bounds;if(bounds.range===0)return 0;return(value-bounds.min)/bounds.range;},unitRangeToValue(unitRange){if(this.bounds.isEmpty){throw new Error('Chart series y-axis bounds are empty');}
-return unitRange*this.bounds.range+this.bounds.min;},autoSetFromSeries(series,opt_config){const range=new tr.b.math.Range();series.forEach(function(s){range.addRange(s.range);},this);this.autoSetFromRange(range,opt_config);},autoSetFromRange(range,opt_config){if(range.isEmpty)return;const bounds=this.bounds;if(bounds.isEmpty){bounds.addRange(range);return;}
-if(!opt_config)return;const useRangeMin=(opt_config.expandMin&&range.min<bounds.min||opt_config.shrinkMin&&range.min>bounds.min);const useRangeMax=(opt_config.expandMax&&range.max>bounds.max||opt_config.shrinkMax&&range.max<bounds.max);if(!useRangeMin&&!useRangeMax)return;if(useRangeMin&&useRangeMax){bounds.min=range.min;bounds.max=range.max;return;}
-if(useRangeMin){bounds.min=Math.min(range.min,bounds.max);}else{bounds.max=Math.max(range.max,bounds.min);}},majorMarkHeightWorld_(transform,pixelRatio){const idealMajorMarkHeightPx=IDEAL_MAJOR_MARK_HEIGHT_PX*pixelRatio;const idealMajorMarkHeightWorld=transform.vectorToWorldDistance(idealMajorMarkHeightPx);return tr.b.math.preferredNumberLargerThanMin(idealMajorMarkHeightWorld);},draw(ctx,transform,showYAxisLabels,showYGridLines){if(!showYAxisLabels&&!showYGridLines)return;const pixelRatio=transform.pixelRatio;const viewTop=transform.outerTopViewY;const worldTop=transform.viewYToWorldY(viewTop);const viewBottom=transform.outerBottomViewY;const viewHeight=viewBottom-viewTop;const viewLeft=transform.leftViewX;const viewRight=transform.rightViewX;const labelLeft=transform.leftYLabel;ctx.save();ctx.lineWidth=pixelRatio;ctx.fillStyle=ColorScheme.getColorForReservedNameAsString('black');ctx.textAlign='left';ctx.textBaseline='center';ctx.font=(AXIS_LABLE_FONT_SIZE_PX*pixelRatio)+'px '+AXIS_LABLE_FONT;ctx.beginPath();ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('black');tr.ui.b.drawLine(ctx,viewLeft,viewTop,viewLeft,viewBottom,viewLeft);ctx.stroke();ctx.closePath();ctx.beginPath();ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('grey');const majorMarkHeight=this.majorMarkHeightWorld_(transform,pixelRatio);const maxMajorMark=Math.max(transform.viewYToWorldY(viewTop),Math.abs(transform.viewYToWorldY(viewBottom)));for(let curWorldY=0;curWorldY<=maxMajorMark;curWorldY+=majorMarkHeight){const roundedUnitValue=Math.floor(curWorldY*1000000)/1000000;const curViewYPositive=transform.worldYToViewY(curWorldY);if(curViewYPositive>=viewTop){if(showYAxisLabels){ctx.fillText(roundedUnitValue,viewLeft+AXIS_LABLE_MARGIN_PX,curViewYPositive-AXIS_LABLE_MARGIN_PX);}
-if(showYGridLines){tr.ui.b.drawLine(ctx,viewLeft,curViewYPositive,viewRight,curViewYPositive);}}
-const curViewYNegative=transform.worldYToViewY(-1*curWorldY);if(curViewYNegative<=viewBottom){if(showYAxisLabels){ctx.fillText(roundedUnitValue,viewLeft+AXIS_LABLE_MARGIN_PX,curViewYNegative-AXIS_LABLE_MARGIN_PX);}
-if(showYGridLines){tr.ui.b.drawLine(ctx,viewLeft,curViewYNegative,viewRight,curViewYNegative);}}}
-ctx.stroke();ctx.restore();}};return{ChartSeriesYAxis,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function ChartTransform(displayTransform,axis,trackWidth,trackHeight,topPadding,bottomPadding,pixelRatio){this.pixelRatio=pixelRatio;this.leftViewX=0;this.rightViewX=trackWidth;this.leftTimestamp=displayTransform.xViewToWorld(this.leftViewX);this.rightTimestamp=displayTransform.xViewToWorld(this.rightViewX);this.displayTransform_=displayTransform;this.outerTopViewY=0;this.innerTopViewY=topPadding;this.innerBottomViewY=trackHeight-bottomPadding;this.outerBottomViewY=trackHeight;this.axis_=axis;this.innerHeight_=this.innerBottomViewY-this.innerTopViewY;}
-ChartTransform.prototype={worldXToViewX(worldX){return this.displayTransform_.xWorldToView(worldX);},viewXToWorldX(viewX){return this.displayTransform_.xViewToWorld(viewX);},vectorToWorldDistance(viewY){return this.axis_.bounds.range*Math.abs(viewY/this.innerHeight_);},viewYToWorldY(viewY){return this.axis_.unitRangeToValue(1-(viewY-this.innerTopViewY)/this.innerHeight_);},worldYToViewY(worldY){const innerHeightCoefficient=1-this.axis_.valueToUnitRange(worldY);return innerHeightCoefficient*this.innerHeight_+this.innerTopViewY;}};return{ChartTransform,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ChartTrack=tr.ui.b.define('chart-track',tr.ui.tracks.Track);ChartTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('chart-track');this.series_=undefined;this.axes_=undefined;this.axisGuidToAxisData_=undefined;this.topPadding_=undefined;this.bottomPadding_=undefined;this.showYAxisLabels_=undefined;this.showGridLines_=undefined;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},get series(){return this.series_;},set series(series){this.series_=series;this.calculateAxisDataAndPadding_();this.invalidateDrawingContainer();},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;this.invalidateDrawingContainer();},get showYAxisLabels(){return this.showYAxisLabels_;},set showYAxisLabels(showYAxisLabels){this.showYAxisLabels_=showYAxisLabels;this.invalidateDrawingContainer();},get showGridLines(){return this.showGridLines_;},set showGridLines(showGridLines){this.showGridLines_=showGridLines;this.invalidateDrawingContainer();},get hasVisibleContent(){return!!this.series&&this.series.length>0;},calculateAxisDataAndPadding_(){if(!this.series_){this.axes_=undefined;this.axisGuidToAxisData_=undefined;this.topPadding_=undefined;this.bottomPadding_=undefined;return;}
-const axisGuidToAxisData={};let topPadding=0;let bottomPadding=0;this.series_.forEach(function(series){const seriesYAxis=series.seriesYAxis;const axisGuid=seriesYAxis.guid;if(!(axisGuid in axisGuidToAxisData)){axisGuidToAxisData[axisGuid]={axis:seriesYAxis,series:[]};if(!this.axes_)this.axes_=[];this.axes_.push(seriesYAxis);}
-axisGuidToAxisData[axisGuid].series.push(series);topPadding=Math.max(topPadding,series.topPadding);bottomPadding=Math.max(bottomPadding,series.bottomPadding);},this);this.axisGuidToAxisData_=axisGuidToAxisData;this.topPadding_=topPadding;this.bottomPadding_=bottomPadding;},draw(type,viewLWorld,viewRWorld,viewHeight){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawChart_(viewLWorld,viewRWorld);break;}},drawChart_(viewLWorld,viewRWorld){if(!this.series_)return;const ctx=this.context();const displayTransform=this.viewport.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const highDetails=this.viewport.highDetails;const width=bounds.width*pixelRatio;const height=bounds.height*pixelRatio;const topPadding=this.topPadding_*pixelRatio;const bottomPadding=this.bottomPadding_*pixelRatio;ctx.save();ctx.beginPath();ctx.rect(0,0,width,height);ctx.clip();if(this.axes_){if((this.showGridLines_||this.showYAxisLabels_)&&this.axes_.length>1){throw new Error('Only one axis allowed when showing grid lines.');}
-for(const yAxis of this.axes_){const chartTransform=new tr.ui.tracks.ChartTransform(displayTransform,yAxis,width,height,topPadding,bottomPadding,pixelRatio);yAxis.draw(ctx,chartTransform,this.showYAxisLabels_,this.showGridLines_);}}
-for(const series of this.series){const chartTransform=new tr.ui.tracks.ChartTransform(displayTransform,series.seriesYAxis,width,height,topPadding,bottomPadding,pixelRatio);series.draw(ctx,chartTransform,highDetails);}
-ctx.restore();},addEventsToTrackMap(eventToTrackMap){this.series_.forEach(function(series){series.points.forEach(function(point){point.addToTrackMap(eventToTrackMap,this);},this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){this.series_.forEach(function(series){series.addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection);},this);},addEventNearToProvidedEventToSelection(event,offset,selection){let foundItem=false;this.series_.forEach(function(series){foundItem=foundItem||series.addEventNearToProvidedEventToSelection(event,offset,selection);},this);return foundItem;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){this.series_.forEach(function(series){series.addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection);},this);},autoSetAllAxes(opt_config){for(const axisData of Object.values(this.axisGuidToAxisData_)){const seriesYAxis=axisData.axis;const series=axisData.series;seriesYAxis.autoSetFromSeries(series,opt_config);}},autoSetAxis(seriesYAxis,opt_config){const series=this.axisGuidToAxisData_[seriesYAxis.guid].series;seriesYAxis.autoSetFromSeries(series,opt_config);}};return{ChartTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const ChartTrack=tr.ui.tracks.ChartTrack;const CpuUsageTrack=tr.ui.b.define('cpu-usage-track',ChartTrack);CpuUsageTrack.prototype={__proto__:ChartTrack.prototype,decorate(viewport){ChartTrack.prototype.decorate.call(this,viewport);this.classList.add('cpu-usage-track');this.heading='CPU usage';this.cpuUsageSeries_=undefined;},initialize(model){if(model!==undefined){this.cpuUsageSeries_=model.device.cpuUsageSeries;}else{this.cpuUsageSeries_=undefined;}
-this.series=this.buildChartSeries_();this.autoSetAllAxes({expandMax:true});},get hasVisibleContent(){return!!this.cpuUsageSeries_&&this.cpuUsageSeries_.samples.length>0;},addContainersToTrackMap(containerToTrackMap){containerToTrackMap.addContainer(this.series_,this);},buildChartSeries_(yAxis,color){if(!this.hasVisibleContent)return[];yAxis=new tr.ui.tracks.ChartSeriesYAxis(0,undefined);const usageSamples=this.cpuUsageSeries_.samples;const pts=new Array(usageSamples.length+1);for(let i=0;i<usageSamples.length;i++){pts[i]=new tr.ui.tracks.ChartPoint(undefined,usageSamples[i].start,usageSamples[i].usage);}
-pts[usageSamples.length]=new tr.ui.tracks.ChartPoint(undefined,usageSamples[usageSamples.length-1].start,0);const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:color};return[new tr.ui.tracks.ChartSeries(pts,yAxis,renderingConfig)];},};return{CpuUsageTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const ChartTrack=tr.ui.tracks.ChartTrack;const PowerSeriesTrack=tr.ui.b.define('power-series-track',ChartTrack);PowerSeriesTrack.prototype={__proto__:ChartTrack.prototype,decorate(viewport){ChartTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('power-series-track');this.heading='Power';this.powerSeries_=undefined;},set powerSeries(powerSeries){this.powerSeries_=powerSeries;this.series=this.buildChartSeries_();this.autoSetAllAxes({expandMax:true});},get hasVisibleContent(){return(this.powerSeries_&&this.powerSeries_.samples.length>0);},addContainersToTrackMap(containerToTrackMap){containerToTrackMap.addContainer(this.powerSeries_,this);},buildChartSeries_(){if(!this.hasVisibleContent)return[];const seriesYAxis=new tr.ui.tracks.ChartSeriesYAxis(0,undefined);const pts=this.powerSeries_.samples.map(function(smpl){return new tr.ui.tracks.ChartPoint(smpl,smpl.start,smpl.powerInW);});const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:ColorScheme.getColorIdForGeneralPurposeString(this.heading)};return[new tr.ui.tracks.ChartSeries(pts,seriesYAxis,renderingConfig)];}};return{PowerSeriesTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SpacingTrack=tr.ui.b.define('spacing-track',tr.ui.tracks.Track);SpacingTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('spacing-track');this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},addAllEventsMatchingFilterToSelection(filter,selection){}};return{SpacingTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ContainerTrack=tr.ui.tracks.ContainerTrack;const DeviceTrack=tr.ui.b.define('device-track',ContainerTrack);DeviceTrack.prototype={__proto__:ContainerTrack.prototype,decorate(viewport){ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('device-track');this.device_=undefined;this.powerSeriesTrack_=undefined;},get device(){return this.device_;},set device(device){this.device_=device;this.updateContents_();},get powerSeriesTrack(){return this.powerSeriesTrack_;},get hasVisibleContent(){return(this.powerSeriesTrack_&&this.powerSeriesTrack_.hasVisibleContent);},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ContainerTrack.prototype.addContainersToTrackMap.call(this,containerToTrackMap);containerToTrackMap.addContainer(this.device,this);},addEventsToTrackMap(eventToTrackMap){this.tracks_.forEach(function(track){track.addEventsToTrackMap(eventToTrackMap);});},appendPowerSeriesTrack_(){this.powerSeriesTrack_=new tr.ui.tracks.PowerSeriesTrack(this.viewport);this.powerSeriesTrack_.powerSeries=this.device.powerSeries;if(this.powerSeriesTrack_.hasVisibleContent){Polymer.dom(this).appendChild(this.powerSeriesTrack_);Polymer.dom(this).appendChild(new tr.ui.tracks.SpacingTrack(this.viewport));}},updateContents_(){this.clearTracks_();this.appendPowerSeriesTrack_();}};return{DeviceTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const DISPLAYED_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME;const BACKGROUND=tr.model.ContainerMemoryDump.LevelOfDetail.BACKGROUND;const LIGHT=tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT;const DETAILED=tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED;const SYSTEM_MEMORY_CHART_RENDERING_CONFIG={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:ColorScheme.getColorIdForGeneralPurposeString('systemMemory'),backgroundOpacity:0.8};const SYSTEM_MEMORY_SERIES_NAMES=['Used (KB)','Swapped (KB)'];function extractGlobalMemoryDumpUsedSizes(globalMemoryDump,addSize){for(const[pid,pmd]of
-Object.entries(globalMemoryDump.processMemoryDumps)){const mostRecentVmRegions=pmd.mostRecentVmRegions;if(mostRecentVmRegions===undefined)continue;addSize(pid,mostRecentVmRegions.byteStats.proportionalResident||0,pmd.process.userFriendlyName);}}
-function extractProcessMemoryDumpAllocatorSizes(processMemoryDump,addSize){const allocatorDumps=processMemoryDump.memoryAllocatorDumps;if(allocatorDumps===undefined)return;allocatorDumps.forEach(function(allocatorDump){if(allocatorDump.fullName==='tracing')return;const allocatorSize=allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME];if(allocatorSize===undefined)return;const allocatorSizeValue=allocatorSize.value;if(allocatorSizeValue===undefined)return;addSize(allocatorDump.fullName,allocatorSizeValue);});}
-function extractGlobalMemoryDumpAllocatorSizes(globalMemoryDump,addSize){for(const pmd of Object.values(globalMemoryDump.processMemoryDumps)){extractProcessMemoryDumpAllocatorSizes(pmd,addSize);}}
-function buildMemoryChartSeries(memoryDumps,dumpSizeExtractor){const dumpCount=memoryDumps.length;const idToTimestampToPoint={};const idToName={};memoryDumps.forEach(function(dump,index){dumpSizeExtractor(dump,function addSize(id,size,opt_name){let timestampToPoint=idToTimestampToPoint[id];if(timestampToPoint===undefined){idToTimestampToPoint[id]=timestampToPoint=new Array(dumpCount);for(let i=0;i<dumpCount;i++){const modelItem=memoryDumps[i];timestampToPoint[i]=new tr.ui.tracks.ChartPoint(modelItem,modelItem.start,0);}}
-timestampToPoint[index].y+=size;if(opt_name!==undefined)idToName[id]=opt_name;});});const ids=Object.keys(idToTimestampToPoint);if(ids.length===0)return undefined;ids.sort();for(let i=0;i<dumpCount;i++){let baseSize=0;for(let j=ids.length-1;j>=0;j--){const point=idToTimestampToPoint[ids[j]][i];point.yBase=baseSize;point.y+=baseSize;baseSize=point.y;}}
-const seriesYAxis=new tr.ui.tracks.ChartSeriesYAxis(0);const series=ids.map(function(id){const colorId=ColorScheme.getColorIdForGeneralPurposeString(idToName[id]||id);const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId,backgroundOpacity:0.8};return new tr.ui.tracks.ChartSeries(idToTimestampToPoint[id],seriesYAxis,renderingConfig);});series.reverse();return series;}
-function buildMemoryLetterDots(memoryDumps){const backgroundMemoryColorId=ColorScheme.getColorIdForReservedName('background_memory_dump');const lightMemoryColorId=ColorScheme.getColorIdForReservedName('light_memory_dump');const detailedMemoryColorId=ColorScheme.getColorIdForReservedName('detailed_memory_dump');return memoryDumps.map(function(memoryDump){let memoryColorId;switch(memoryDump.levelOfDetail){case BACKGROUND:memoryColorId=backgroundMemoryColorId;break;case DETAILED:memoryColorId=detailedMemoryColorId;break;case LIGHT:default:memoryColorId=lightMemoryColorId;}
-return new tr.ui.tracks.LetterDot(memoryDump,'M',memoryColorId,memoryDump.start);});}
-function buildGlobalUsedMemoryChartSeries(globalMemoryDumps){return buildMemoryChartSeries(globalMemoryDumps,extractGlobalMemoryDumpUsedSizes);}
-function buildProcessAllocatedMemoryChartSeries(processMemoryDumps){return buildMemoryChartSeries(processMemoryDumps,extractProcessMemoryDumpAllocatorSizes);}
-function buildGlobalAllocatedMemoryChartSeries(globalMemoryDumps){return buildMemoryChartSeries(globalMemoryDumps,extractGlobalMemoryDumpAllocatorSizes);}
-function buildSystemMemoryChartSeries(model){if(model.kernel.counters===undefined)return;const memoryCounter=model.kernel.counters['global.SystemMemory'];if(memoryCounter===undefined)return;const tracks=[];for(const name of SYSTEM_MEMORY_SERIES_NAMES){const series=memoryCounter.series.find(series=>series.name===name);if(series===undefined||series.samples.length===0)return;const chartPoints=[];const valueRange=new tr.b.math.Range();for(const sample of series.samples){chartPoints.push(new tr.ui.tracks.ChartPoint(sample,sample.timestamp,sample.value,0));valueRange.addValue(sample.value);}
-const baseLine=Math.max(0,valueRange.min-valueRange.range);const axisY=new tr.ui.tracks.ChartSeriesYAxis(baseLine,valueRange.max);const chartSeries=[new tr.ui.tracks.ChartSeries(chartPoints,axisY,SYSTEM_MEMORY_CHART_RENDERING_CONFIG)];tracks.push({name:'System Memory '+name,series:chartSeries});}
-return tracks;}
-return{buildMemoryLetterDots,buildGlobalUsedMemoryChartSeries,buildProcessAllocatedMemoryChartSeries,buildGlobalAllocatedMemoryChartSeries,buildSystemMemoryChartSeries,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const USED_MEMORY_TRACK_HEIGHT=50;const ALLOCATED_MEMORY_TRACK_HEIGHT=50;const GlobalMemoryDumpTrack=tr.ui.b.define('global-memory-dump-track',tr.ui.tracks.ContainerTrack);GlobalMemoryDumpTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.memoryDumps_=undefined;},get memoryDumps(){return this.memoryDumps_;},set memoryDumps(memoryDumps){this.memoryDumps_=memoryDumps;this.updateContents_();},updateContents_(){this.clearTracks_();if(!this.memoryDumps_||!this.memoryDumps_.length)return;this.appendDumpDotsTrack_();this.appendUsedMemoryTrack_();this.appendAllocatedMemoryTrack_();},appendDumpDotsTrack_(){const items=tr.ui.tracks.buildMemoryLetterDots(this.memoryDumps_);if(!items)return;const track=new tr.ui.tracks.LetterDotTrack(this.viewport);track.heading='Memory Dumps';track.items=items;Polymer.dom(this).appendChild(track);},appendUsedMemoryTrack_(){const tracks=[];const perProcessSeries=tr.ui.tracks.buildGlobalUsedMemoryChartSeries(this.memoryDumps_);if(perProcessSeries!==undefined){tracks.push({name:'Memory per process',series:perProcessSeries});}else{tracks.push.apply(tracks,tr.ui.tracks.buildSystemMemoryChartSeries(this.memoryDumps_[0].model));}
-for(const{name,series}of tracks){const track=new tr.ui.tracks.ChartTrack(this.viewport);track.heading=name;track.height=USED_MEMORY_TRACK_HEIGHT+'px';track.series=series;track.autoSetAllAxes({expandMax:true});Polymer.dom(this).appendChild(track);}},appendAllocatedMemoryTrack_(){const series=tr.ui.tracks.buildGlobalAllocatedMemoryChartSeries(this.memoryDumps_);if(!series)return;const track=new tr.ui.tracks.ChartTrack(this.viewport);track.heading='Memory per component';track.height=ALLOCATED_MEMORY_TRACK_HEIGHT+'px';track.series=series;track.autoSetAllAxes({expandMax:true});Polymer.dom(this).appendChild(track);}};return{GlobalMemoryDumpTrack,};});'use strict';tr.exportTo('tr.ui.b',function(){function FastRectRenderer(ctx,xMin,xMax,minRectSize,maxMergeDist,palette){this.ctx_=ctx;this.xMin_=xMin;this.xMax_=xMax;this.minRectSize_=minRectSize;this.maxMergeDist_=maxMergeDist;this.palette_=palette;}
-FastRectRenderer.prototype={y_:0,h_:0,merging_:false,mergeStartX_:0,mergeCurRight_:0,mergedColorId_:0,mergedAlpha_:0,setYandH(y,h){if(this.y_===y&&this.h_===h){return;}
-this.flush();this.y_=y;this.h_=h;},fillRect(x,w,colorId,alpha){const r=x+w;if(w<this.minRectSize_){if(r-this.mergeStartX_>this.maxMergeDist_){this.flush();}
-if(!this.merging_){this.merging_=true;this.mergeStartX_=x;this.mergeCurRight_=r;this.mergedColorId_=colorId;this.mergedAlpha_=alpha;}else{this.mergeCurRight_=r;if(this.mergedAlpha_<alpha||(this.mergedAlpha_===alpha&&this.mergedColorId_<colorId)){this.mergedAlpha_=alpha;this.mergedColorId_=colorId;}}}else{if(this.merging_){this.flush();}
-this.ctx_.fillStyle=this.palette_[colorId];this.ctx_.globalAlpha=alpha;const xLeft=Math.max(x,this.xMin_);const xRight=Math.min(r,this.xMax_);if(xLeft<xRight){this.ctx_.fillRect(xLeft,this.y_,xRight-xLeft,this.h_);}}},flush(){if(this.merging_){this.ctx_.fillStyle=this.palette_[this.mergedColorId_];this.ctx_.globalAlpha=this.mergedAlpha_;const xLeft=Math.max(this.mergeStartX_,this.xMin_);const xRight=Math.min(this.mergeCurRight_,this.xMax_);if(xLeft<xRight){this.ctx_.fillRect(xLeft,this.y_,xRight-xLeft,this.h_);}
-this.merging_=false;}}};return{FastRectRenderer,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const RectTrack=tr.ui.b.define('rect-track',tr.ui.tracks.Track);RectTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('rect-track');this.asyncStyle_=false;this.rects_=null;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},set selectionGenerator(generator){this.heading_.selectionGenerator=generator;},set expanded(expanded){this.heading_.expanded=!!expanded;},set arrowVisible(arrowVisible){this.heading_.arrowVisible=!!arrowVisible;},get expanded(){return this.heading_.expanded;},get asyncStyle(){return this.asyncStyle_;},set asyncStyle(v){this.asyncStyle_=!!v;},get rects(){return this.rects_;},set rects(rects){this.rects_=rects||[];this.invalidateDrawingContainer();},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;this.invalidateDrawingContainer();},get hasVisibleContent(){return this.rects_.length>0;},draw(type,viewLWorld,viewRWorld,viewHeight){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawRects_(viewLWorld,viewRWorld);break;}},drawRects_(viewLWorld,viewRWorld){const ctx=this.context();ctx.save();const bounds=this.getBoundingClientRect();tr.ui.b.drawSlices(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,bounds.height,this.rects_,this.asyncStyle_);ctx.restore();if(bounds.height<=6)return;let fontSize;let yOffset;if(bounds.height<15){fontSize=6;yOffset=1.0;}else{fontSize=10;yOffset=2.5;}
-tr.ui.b.drawLabels(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,this.rects_,this.asyncStyle_,fontSize,yOffset);},addEventsToTrackMap(eventToTrackMap){if(this.rects_===undefined||this.rects_===null){return;}
-this.rects_.forEach(function(rect){rect.addToTrackMap(eventToTrackMap,this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onRect(rect){rect.addToSelection(selection);}
-onRect=onRect.bind(this);const instantEventWidth=2*viewPixWidthWorld;tr.b.iterateOverIntersectingIntervals(this.rects_,function(x){return x.start;},function(x){return x.duration===0?x.duration+instantEventWidth:x.duration;},loWX,hiWX,onRect);},addEventNearToProvidedEventToSelection(event,offset,selection){const index=this.rects_.findIndex(rect=>rect.modelItem===event);if(index===-1)return false;const newIndex=index+offset;if(newIndex<0||newIndex>=this.rects_.length)return false;this.rects_[newIndex].addToSelection(selection);return true;},addAllEventsMatchingFilterToSelection(filter,selection){for(let i=0;i<this.rects_.length;++i){const modelItem=this.rects_[i].modelItem;if(!modelItem)continue;if(filter.matchSlice(modelItem)){selection.push(modelItem);}}},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const rect=tr.b.findClosestIntervalInSortedIntervals(this.rects_,function(x){return x.start;},function(x){return x.end;},worldX,worldMaxDist);if(!rect)return;rect.addToSelection(selection);}};function Rect(modelItem,title,colorId,start,duration){tr.model.ProxySelectableItem.call(this,modelItem);this.title=title;this.colorId=colorId;this.start=start;this.duration=duration;this.end=start+duration;}
-Rect.prototype={__proto__:tr.model.ProxySelectableItem.prototype};return{RectTrack,Rect,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SliceTrack=tr.ui.b.define('slice-track',tr.ui.tracks.RectTrack);SliceTrack.prototype={__proto__:tr.ui.tracks.RectTrack.prototype,decorate(viewport){tr.ui.tracks.RectTrack.prototype.decorate.call(this,viewport);},get slices(){return this.rects;},set slices(slices){this.rects=slices;}};return{SliceTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const CpuTrack=tr.ui.b.define('cpu-track',tr.ui.tracks.ContainerTrack);CpuTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('cpu-track');this.detailedMode_=true;},get cpu(){return this.cpu_;},set cpu(cpu){this.cpu_=cpu;this.updateContents_();},get detailedMode(){return this.detailedMode_;},set detailedMode(detailedMode){this.detailedMode_=detailedMode;this.updateContents_();},get tooltip(){return this.tooltip_;},set tooltip(value){this.tooltip_=value;this.updateContents_();},get hasVisibleContent(){if(this.cpu_===undefined)return false;const cpu=this.cpu_;if(cpu.slices.length)return true;if(cpu.samples&&cpu.samples.length)return true;if(Object.keys(cpu.counters).length>0)return true;return false;},updateContents_(){this.detach();if(!this.cpu_)return;const slices=this.cpu_.slices;if(slices.length){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;track.heading=this.cpu_.userFriendlyName+':';Polymer.dom(this).appendChild(track);}
-if(this.detailedMode_){this.appendSamplesTracks_();for(const counterName in this.cpu_.counters){const counter=this.cpu_.counters[counterName];const track=new tr.ui.tracks.CounterTrack(this.viewport);track.heading=this.cpu_.userFriendlyName+' '+
-counter.name+':';track.counter=counter;Polymer.dom(this).appendChild(track);}}},appendSamplesTracks_(){const samples=this.cpu_.samples;if(samples===undefined||samples.length===0){return;}
-const samplesByTitle={};samples.forEach(function(sample){if(samplesByTitle[sample.title]===undefined){samplesByTitle[sample.title]=[];}
-samplesByTitle[sample.title].push(sample);});const sampleTitles=Object.keys(samplesByTitle);sampleTitles.sort();sampleTitles.forEach(function(sampleTitle){const samples=samplesByTitle[sampleTitle];const samplesTrack=new tr.ui.tracks.SliceTrack(this.viewport);samplesTrack.group=this.cpu_;samplesTrack.slices=samples;samplesTrack.heading=this.cpu_.userFriendlyName+': '+
-sampleTitle;samplesTrack.tooltip=this.cpu_.userFriendlyDetails;samplesTrack.selectionGenerator=function(){const selection=new tr.model.EventSet();for(let i=0;i<samplesTrack.slices.length;i++){selection.push(samplesTrack.slices[i]);}
-return selection;};Polymer.dom(this).appendChild(samplesTrack);},this);}};return{CpuTrack,};});'use strict';tr.exportTo('tr.model',function(){const Settings=tr.b.Settings;function ModelSettings(model){this.model=model;this.objectsByKey_=[];this.nonuniqueKeys_=[];this.buildObjectsByKeyMap_();this.removeNonuniqueKeysFromSettings_();this.ephemeralSettingsByGUID_={};}
-ModelSettings.prototype={buildObjectsByKeyMap_(){const objects=[];this.model.iterateAllPersistableObjects(function(o){objects.push(o);});const objectsByKey={};const NONUNIQUE_KEY='nonuniqueKey';for(let i=0;i<objects.length;i++){const object=objects[i];const objectKey=object.getSettingsKey();if(!objectKey)continue;if(objectsByKey[objectKey]===undefined){objectsByKey[objectKey]=object;continue;}
-objectsByKey[objectKey]=NONUNIQUE_KEY;}
-const nonuniqueKeys={};Object.keys(objectsByKey).forEach(function(objectKey){if(objectsByKey[objectKey]!==NONUNIQUE_KEY){return;}
-delete objectsByKey[objectKey];nonuniqueKeys[objectKey]=true;});this.nonuniqueKeys=nonuniqueKeys;this.objectsByKey_=objectsByKey;},removeNonuniqueKeysFromSettings_(){const settings=Settings.get('trace_model_settings',{});let settingsChanged=false;Object.keys(settings).forEach(function(objectKey){if(!this.nonuniqueKeys[objectKey]){return;}
-settingsChanged=true;delete settings[objectKey];},this);if(settingsChanged){Settings.set('trace_model_settings',settings);}},hasUniqueSettingKey(object){const objectKey=object.getSettingsKey();if(!objectKey)return false;return this.objectsByKey_[objectKey]!==undefined;},getSettingFor(object,objectLevelKey,defaultValue){const objectKey=object.getSettingsKey();if(!objectKey||!this.objectsByKey_[objectKey]){const settings=this.getEphemeralSettingsFor_(object);const ephemeralValue=settings[objectLevelKey];if(ephemeralValue!==undefined){return ephemeralValue;}
-return defaultValue;}
-const settings=Settings.get('trace_model_settings',{});if(!settings[objectKey]){settings[objectKey]={};}
-const value=settings[objectKey][objectLevelKey];if(value!==undefined){return value;}
-return defaultValue;},setSettingFor(object,objectLevelKey,value){const objectKey=object.getSettingsKey();if(!objectKey||!this.objectsByKey_[objectKey]){this.getEphemeralSettingsFor_(object)[objectLevelKey]=value;return;}
-const settings=Settings.get('trace_model_settings',{});if(!settings[objectKey]){settings[objectKey]={};}
-if(settings[objectKey][objectLevelKey]===value){return;}
-settings[objectKey][objectLevelKey]=value;Settings.set('trace_model_settings',settings);},getEphemeralSettingsFor_(object){if(object.guid===undefined){throw new Error('Only objects with GUIDs can be persisted');}
-if(this.ephemeralSettingsByGUID_[object.guid]===undefined){this.ephemeralSettingsByGUID_[object.guid]={};}
-return this.ephemeralSettingsByGUID_[object.guid];}};return{ModelSettings,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const CounterTrack=tr.ui.b.define('counter-track',tr.ui.tracks.ChartTrack);CounterTrack.prototype={__proto__:tr.ui.tracks.ChartTrack.prototype,decorate(viewport){tr.ui.tracks.ChartTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('counter-track');},get counter(){return this.chart;},set counter(counter){this.heading=counter.name+': ';this.series=CounterTrack.buildChartSeriesFromCounter(counter);this.autoSetAllAxes({expandMax:true});},getModelEventFromItem(chartValue){return chartValue;}};CounterTrack.buildChartSeriesFromCounter=function(counter){const numSeries=counter.series.length;const totals=counter.totals;const seriesYAxis=new tr.ui.tracks.ChartSeriesYAxis(0,undefined);const chartSeries=counter.series.map(function(series,seriesIndex){const chartPoints=series.samples.map(function(sample,sampleIndex){const total=totals[sampleIndex*numSeries+seriesIndex];return new tr.ui.tracks.ChartPoint(sample,sample.timestamp,total);});const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:series.color};return new tr.ui.tracks.ChartSeries(chartPoints,seriesYAxis,renderingConfig);});chartSeries.reverse();return chartSeries;};return{CounterTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const startCompare=function(x,y){return x.start-y.start;};const FrameTrack=tr.ui.b.define('frame-track',tr.ui.tracks.LetterDotTrack);FrameTrack.prototype={__proto__:tr.ui.tracks.LetterDotTrack.prototype,decorate(viewport){tr.ui.tracks.LetterDotTrack.prototype.decorate.call(this,viewport);this.heading='Frames';this.frames_=undefined;this.items=undefined;},get frames(){return this.frames_;},set frames(frames){this.frames_=frames;if(frames===undefined)return;this.frames_=this.frames_.slice();this.frames_.sort(startCompare);this.items=this.frames_.map(function(frame){return new FrameDot(frame);});}};function FrameDot(frame){tr.ui.tracks.LetterDot.call(this,frame,'F',frame.colorId,frame.start);}
-FrameDot.prototype={__proto__:tr.ui.tracks.LetterDot.prototype};return{FrameTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const MultiRowTrack=tr.ui.b.define('multi-row-track',tr.ui.tracks.ContainerTrack);MultiRowTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.tooltip_='';this.heading_='';this.groupingSource_=undefined;this.itemsToGroup_=undefined;this.defaultToCollapsedWhenSubRowCountMoreThan=1;this.currentSubRowsWithHeadings_=undefined;this.expanded_=true;},get itemsToGroup(){return this.itemsToGroup_;},setItemsToGroup(itemsToGroup,opt_groupingSource){this.itemsToGroup_=itemsToGroup;this.groupingSource_=opt_groupingSource;this.currentSubRowsWithHeadings_=undefined;this.updateContents_();this.updateExpandedStateFromGroupingSource_();},setPrebuiltSubRows(groupingSource,subRowsWithHeadings){this.itemsToGroup_=undefined;this.groupingSource_=groupingSource;this.currentSubRowsWithHeadings_=subRowsWithHeadings;this.updateContents_();this.updateExpandedStateFromGroupingSource_();},get heading(){return this.heading_;},set heading(h){this.heading_=h;this.updateHeadingAndTooltip_();},get tooltip(){return this.tooltip_;},set tooltip(t){this.tooltip_=t;this.updateHeadingAndTooltip_();},get subRows(){return this.currentSubRowsWithHeadings_.map(elem=>elem.row);},get hasVisibleContent(){return this.children.length>0;},get expanded(){return this.expanded_;},set expanded(expanded){if(this.expanded_===expanded)return;this.expanded_=expanded;this.expandedStateChanged_();},onHeadingClicked_(e){if(this.subRows.length<=1)return;this.expanded=!this.expanded;if(this.groupingSource_){const modelSettings=new tr.model.ModelSettings(this.groupingSource_.model);modelSettings.setSettingFor(this.groupingSource_,'expanded',this.expanded);}
-e.stopPropagation();},updateExpandedStateFromGroupingSource_(){if(this.groupingSource_){const numSubRows=this.subRows.length;const modelSettings=new tr.model.ModelSettings(this.groupingSource_.model);if(numSubRows>1){let defaultExpanded;if(numSubRows>this.defaultToCollapsedWhenSubRowCountMoreThan){defaultExpanded=false;}else{defaultExpanded=true;}
-this.expanded=modelSettings.getSettingFor(this.groupingSource_,'expanded',defaultExpanded);}else{this.expanded=undefined;}}},expandedStateChanged_(){const children=this.children;const minH=Math.max(2,Math.ceil(18/children.length));const h=(this.expanded_?18:minH)+'px';for(let i=0;i<children.length;i++){children[i].height=h;if(i===0){children[i].arrowVisible=true;}
-children[i].expanded=this.expanded;}
-if(children.length===1){children[0].expanded=true;children[0].arrowVisible=false;}},updateContents_(){tr.ui.tracks.ContainerTrack.prototype.updateContents_.call(this);this.detach();if(this.currentSubRowsWithHeadings_===undefined){if(this.itemsToGroup_===undefined){return;}
-const subRows=this.buildSubRows_(this.itemsToGroup_);this.currentSubRowsWithHeadings_=subRows.map(row=>{return{row,heading:undefined};});}
-if(this.currentSubRowsWithHeadings_===undefined||this.currentSubRowsWithHeadings_.length===0){return;}
-const addSubTrackEx=(items,opt_heading)=>{const track=this.addSubTrack_(items);if(opt_heading!==undefined){track.heading=opt_heading;}
-track.addEventListener('heading-clicked',this.onHeadingClicked_.bind(this));};if(this.currentSubRowsWithHeadings_[0].heading!==undefined&&this.currentSubRowsWithHeadings_[0].heading!==this.heading_){addSubTrackEx([]);}
-for(const subRowWithHeading of this.currentSubRowsWithHeadings_){const subRow=subRowWithHeading.row;if(subRow.length===0){continue;}
-addSubTrackEx(subRow,subRowWithHeading.heading);}
-this.updateHeadingAndTooltip_();this.expandedStateChanged_();},updateHeadingAndTooltip_(){if(!Polymer.dom(this).firstChild)return;Polymer.dom(this).firstChild.heading=this.heading_;Polymer.dom(this).firstChild.tooltip=this.tooltip_;},buildSubRows_(itemsToGroup){throw new Error('Not implemented');},addSubTrack_(subRowItems){throw new Error('Not implemented');},areArrayContentsSame_(a,b){if(!a||!b)return false;if(!a.length||!b.length)return false;if(a.length!==b.length)return false;for(let i=0;i<a.length;++i){if(a[i]!==b[i])return false;}
-return true;}};return{MultiRowTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ObjectInstanceGroupTrack=tr.ui.b.define('object-instance-group-track',tr.ui.tracks.MultiRowTrack);ObjectInstanceGroupTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('object-instance-group-track');this.objectInstances_=undefined;},get objectInstances(){return this.itemsToGroup;},set objectInstances(objectInstances){this.setItemsToGroup(objectInstances);},addSubTrack_(objectInstances){const hasMultipleRows=this.subRows.length>1;const track=new tr.ui.tracks.ObjectInstanceTrack(this.viewport);track.objectInstances=objectInstances;Polymer.dom(this).appendChild(track);return track;},buildSubRows_(objectInstances){objectInstances.sort(function(x,y){return x.creationTs-y.creationTs;});const subRows=[];for(let i=0;i<objectInstances.length;i++){const objectInstance=objectInstances[i];let found=false;for(let j=0;j<subRows.length;j++){const subRow=subRows[j];const lastItemInSubRow=subRow[subRow.length-1];if(objectInstance.creationTs>=lastItemInSubRow.deletionTs){found=true;subRow.push(objectInstance);break;}}
-if(!found){subRows.push([objectInstance]);}}
-return subRows;},updateHeadingAndTooltip_(){}};return{ObjectInstanceGroupTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const AsyncSliceGroupTrack=tr.ui.b.define('async-slice-group-track',tr.ui.tracks.MultiRowTrack);AsyncSliceGroupTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('async-slice-group-track');this.group_=undefined;},addSubTrack_(slices){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;Polymer.dom(this).appendChild(track);track.asyncStyle=true;return track;},get group(){return this.group_;},set group(group){this.group_=group;this.buildAndSetSubRows_();},get eventContainer(){return this.group;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.MultiRowTrack.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.group,this);},buildAndSetSubRows_(){if(this.group_.viewSubGroups.length<=1){const rows=groupAsyncSlicesIntoSubRows(this.group_.slices);const rowsWithHeadings=rows.map(row=>{return{row,heading:undefined};});this.setPrebuiltSubRows(this.group_,rowsWithHeadings);return;}
-const rowsWithHeadings=[];for(const subGroup of this.group_.viewSubGroups){const subGroupRows=groupAsyncSlicesIntoSubRows(subGroup.slices);if(subGroupRows.length===0){continue;}
-for(let i=0;i<subGroupRows.length;i++){rowsWithHeadings.push({row:subGroupRows[i],heading:(i===0?subGroup.title:'')});}}
-this.setPrebuiltSubRows(this.group_,rowsWithHeadings);}};function stripSlice_(slice){if(slice.subSlices!==undefined&&slice.subSlices.length===1){const subSlice=slice.subSlices[0];if(tr.b.math.approximately(subSlice.start,slice.start,1)&&tr.b.math.approximately(subSlice.duration,slice.duration,1)){return subSlice;}}
-return slice;}
-function makeLevelSubRows_(slices){const rows=[];const putSlice=(slice,level)=>{if(slice.hidden){return;}
-while(rows.length<=level){rows.push([]);}
-rows[level].push(slice);};const putSliceRecursively=(slice,level)=>{putSlice(slice,level);if(slice.subSlices!==undefined){for(const subSlice of slice.subSlices){putSliceRecursively(subSlice,level+1);}}};for(const slice of slices){putSliceRecursively(stripSlice_(slice),0);}
-return rows;}
-function groupAsyncSlicesIntoSubRows(slices,opt_skipSort){if(!opt_skipSort){slices.sort((x,y)=>x.start-y.start);}
-const rows=[];let slicesLeft=slices;while(slicesLeft.length!==0){const fit=[];const unfit=[];let levelEndTime=-1;for(const slice of slicesLeft){if(slice.start>=levelEndTime){levelEndTime=slice.end;fit.push(slice);}else{unfit.push(slice);}}
-rows.push(...makeLevelSubRows_(fit));slicesLeft=unfit;}
-return rows;}
-return{AsyncSliceGroupTrack,groupAsyncSlicesIntoSubRows,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SampleTrack=tr.ui.b.define('sample-track',tr.ui.tracks.RectTrack);SampleTrack.prototype={__proto__:tr.ui.tracks.RectTrack.prototype,decorate(viewport){tr.ui.tracks.RectTrack.prototype.decorate.call(this,viewport);},get samples(){return this.rects;},set samples(samples){this.rects=samples;}};return{SampleTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SliceGroupTrack=tr.ui.b.define('slice-group-track',tr.ui.tracks.MultiRowTrack);SliceGroupTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('slice-group-track');this.group_=undefined;this.defaultToCollapsedWhenSubRowCountMoreThan=100;},addSubTrack_(slices){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;Polymer.dom(this).appendChild(track);return track;},get group(){return this.group_;},set group(group){this.group_=group;this.setItemsToGroup(this.group_.slices,this.group_);},get eventContainer(){return this.group;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.MultiRowTrack.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.group,this);},buildSubRows_(slices){const precisionUnit=this.group.model.intrinsicTimeUnit;if(!slices.length)return[];const ops=[];for(let i=0;i<slices.length;i++){if(slices[i].subSlices){slices[i].subSlices.splice(0,slices[i].subSlices.length);}
-ops.push(i);}
-ops.sort(function(ix,iy){const x=slices[ix];const y=slices[iy];if(x.start!==y.start)return x.start-y.start;return ix-iy;});const subRows=[[]];this.badSlices_=[];for(let i=0;i<ops.length;i++){const op=ops[i];const slice=slices[op];let inserted=false;for(let j=subRows.length-1;j>=0;j--){if(subRows[j].length===0)continue;const insertedSlice=subRows[j][subRows[j].length-1];if(slice.start<insertedSlice.start){this.badSlices_.push(slice);inserted=true;}
-if(insertedSlice.bounds(slice,precisionUnit)){while(subRows.length<=j+1){subRows.push([]);}
-subRows[j+1].push(slice);if(insertedSlice.subSlices){insertedSlice.subSlices.push(slice);}
-inserted=true;break;}}
-if(inserted)continue;subRows[0].push(slice);}
-return subRows;}};return{SliceGroupTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ThreadTrack=tr.ui.b.define('thread-track',tr.ui.tracks.ContainerTrack);ThreadTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('thread-track');this.heading_=document.createElement('tr-ui-b-heading');},get thread(){return this.thread_;},set thread(thread){this.thread_=thread;this.updateContents_();},get hasVisibleContent(){return this.tracks_.length>0;},get hasSlices(){return this.thread_.asyncSliceGroup.length>0||this.thread_.sliceGroup.length>0;},get hasTimeSlices(){return this.thread_.timeSlices;},get eventContainer(){return this.thread;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ContainerTrack.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.thread,this);},updateContents_(){this.detach();if(!this.thread_)return;this.heading_.heading=this.thread_.userFriendlyName;this.heading_.tooltip=this.thread_.userFriendlyDetails;if(this.thread_.asyncSliceGroup.length){this.appendAsyncSliceTracks_();}
-this.appendThreadSamplesTracks_();let needsHeading=false;if(this.thread_.timeSlices){const timeSlicesTrack=new tr.ui.tracks.SliceTrack(this.viewport);timeSlicesTrack.heading='';timeSlicesTrack.height=tr.ui.b.THIN_SLICE_HEIGHT+'px';timeSlicesTrack.slices=this.thread_.timeSlices;if(timeSlicesTrack.hasVisibleContent){needsHeading=true;Polymer.dom(this).appendChild(timeSlicesTrack);}}
-if(this.thread_.sliceGroup.length){const track=new tr.ui.tracks.SliceGroupTrack(this.viewport);track.heading=this.thread_.userFriendlyName;track.tooltip=this.thread_.userFriendlyDetails;track.group=this.thread_.sliceGroup;if(track.hasVisibleContent){needsHeading=false;Polymer.dom(this).appendChild(track);}}
-if(needsHeading){Polymer.dom(this).appendChild(this.heading_);}},appendAsyncSliceTracks_(){const subGroups=this.thread_.asyncSliceGroup.viewSubGroups;subGroups.forEach(function(subGroup){const asyncTrack=new tr.ui.tracks.AsyncSliceGroupTrack(this.viewport);asyncTrack.group=subGroup;asyncTrack.heading=subGroup.title;if(asyncTrack.hasVisibleContent){Polymer.dom(this).appendChild(asyncTrack);}},this);},appendThreadSamplesTracks_(){const threadSamples=this.thread_.samples;if(threadSamples===undefined||threadSamples.length===0){return;}
-const samplesByTitle={};threadSamples.forEach(function(sample){if(samplesByTitle[sample.title]===undefined){samplesByTitle[sample.title]=[];}
-samplesByTitle[sample.title].push(sample);});const sampleTitles=Object.keys(samplesByTitle);sampleTitles.sort();sampleTitles.forEach(function(sampleTitle){const samples=samplesByTitle[sampleTitle];const samplesTrack=new tr.ui.tracks.SampleTrack(this.viewport);samplesTrack.group=this.thread_;samplesTrack.samples=samples;samplesTrack.heading=this.thread_.userFriendlyName+': '+
-sampleTitle;samplesTrack.tooltip=this.thread_.userFriendlyDetails;samplesTrack.selectionGenerator=function(){const selection=new tr.model.EventSet();for(let i=0;i<samplesTrack.samples.length;i++){selection.push(samplesTrack.samples[i]);}
-return selection;};Polymer.dom(this).appendChild(samplesTrack);},this);},collapsedDidChange(collapsed){if(collapsed){let h=parseInt(this.tracks[0].height);for(let i=0;i<this.tracks.length;++i){if(h>2){this.tracks[i].height=Math.floor(h)+'px';}else{this.tracks[i].style.display='none';}
-h=h*0.5;}}else{for(let i=0;i<this.tracks.length;++i){this.tracks[i].height=this.tracks[0].height;this.tracks[i].style.display='';}}}};return{ThreadTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const OtherThreadsTrack=tr.ui.b.define('other-threads-track',tr.ui.tracks.OtherThreadsTrack);const SpacingTrack=tr.ui.tracks.SpacingTrack;OtherThreadsTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.header_=document.createElement('tr-ui-b-heading');this.header_.addEventListener('click',this.onHeaderClick_.bind(this));this.header_.heading='Other Threads';this.header_.tooltip='Threads with only scheduling information';this.header_.arrowVisible=true;this.threads_=[];this.expanded=false;this.collapsible_=true;},set threads(threads){this.threads_=threads;this.updateContents_();},set collapsible(collapsible){this.collapsible_=collapsible;this.updateContents_();},onHeaderClick_(e){e.stopPropagation();e.preventDefault();this.expanded=!this.expanded;},get expanded(){return this.header_.expanded;},set expanded(expanded){expanded=!!expanded;if(this.expanded===expanded)return;this.header_.expanded=expanded;this.viewport_.dispatchChangeEvent();this.updateContents_();},updateContents_(){this.detach();if(this.collapsible_){Polymer.dom(this).appendChild(this.header_);}
-if(this.expanded||!this.collapsible_){for(const thread of this.threads_){const track=new tr.ui.tracks.ThreadTrack(this.viewport);track.thread=thread;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}}}};return{OtherThreadsTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const ProcessSummaryTrack=tr.ui.b.define('process-summary-track',tr.ui.tracks.RectTrack);ProcessSummaryTrack.buildRectsFromProcess=function(process){if(!process)return[];const ops=[];const pushOp=function(isStart,time,slice){ops.push({isStart,time,slice});};for(const tid in process.threads){const sliceGroup=process.threads[tid].sliceGroup;sliceGroup.topLevelSlices.forEach(function(slice){pushOp(true,slice.start,undefined);pushOp(false,slice.end,undefined);});sliceGroup.slices.forEach(function(slice){if(slice.important){pushOp(true,slice.start,slice);pushOp(false,slice.end,slice);}});}
-ops.sort(function(a,b){return a.time-b.time;});const rects=[];const genericColorId=ColorScheme.getColorIdForReservedName('generic_work');const pushRect=function(start,end,slice){rects.push(new tr.ui.tracks.Rect(slice,slice?slice.title:'',slice?slice.colorId:genericColorId,start,end-start));};let depth=0;let currentSlice=undefined;let lastStart=undefined;ops.forEach(function(op){depth+=op.isStart?1:-1;if(currentSlice){if(!op.isStart&&op.slice===currentSlice){pushRect(lastStart,op.time,currentSlice);lastStart=depth>=1?op.time:undefined;currentSlice=undefined;}}else{if(op.isStart){if(depth===1){lastStart=op.time;currentSlice=op.slice;}else if(op.slice){if(op.time!==lastStart){pushRect(lastStart,op.time,undefined);lastStart=op.time;}
-currentSlice=op.slice;}}else{if(depth===0){pushRect(lastStart,op.time,undefined);lastStart=undefined;}}}});return rects;};ProcessSummaryTrack.prototype={__proto__:tr.ui.tracks.RectTrack.prototype,decorate(viewport){tr.ui.tracks.RectTrack.prototype.decorate.call(this,viewport);},get process(){return this.process_;},set process(process){this.process_=process;this.rects=ProcessSummaryTrack.buildRectsFromProcess(process);}};return{ProcessSummaryTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ObjectSnapshotView=tr.ui.analysis.ObjectSnapshotView;const ObjectInstanceView=tr.ui.analysis.ObjectInstanceView;const SpacingTrack=tr.ui.tracks.SpacingTrack;const ProcessTrackBase=tr.ui.b.define('process-track-base',tr.ui.tracks.ContainerTrack);ProcessTrackBase.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.processBase_=undefined;Polymer.dom(this).classList.add('process-track-base');Polymer.dom(this).classList.add('expanded');this.processNameEl_=tr.ui.b.createSpan();Polymer.dom(this.processNameEl_).classList.add('process-track-name');this.closeEl_=tr.ui.b.createSpan();Polymer.dom(this.closeEl_).classList.add('process-track-close');this.closeEl_.textContent='X';this.headerEl_=tr.ui.b.createDiv({className:'process-track-header'});Polymer.dom(this.headerEl_).appendChild(this.processNameEl_);Polymer.dom(this.headerEl_).appendChild(this.closeEl_);this.headerEl_.addEventListener('click',this.onHeaderClick_.bind(this));Polymer.dom(this).appendChild(this.headerEl_);},get processBase(){return this.processBase_;},set processBase(processBase){this.processBase_=processBase;if(this.processBase_){const modelSettings=new tr.model.ModelSettings(this.processBase_.model);const defaultValue=this.processBase_.important;this.expanded=modelSettings.getSettingFor(this.processBase_,'expanded',defaultValue);}
-this.updateContents_();},get expanded(){return Polymer.dom(this).classList.contains('expanded');},set expanded(expanded){expanded=!!expanded;if(this.expanded===expanded)return;Polymer.dom(this).classList.toggle('expanded');this.viewport_.dispatchChangeEvent();if(!this.processBase_)return;const modelSettings=new tr.model.ModelSettings(this.processBase_.model);modelSettings.setSettingFor(this.processBase_,'expanded',expanded);this.updateContents_();this.viewport.rebuildEventToTrackMap();this.viewport.rebuildContainerToTrackMap();},set visible(visible){if(visible===this.visible)return;this.hidden=!visible;tr.b.dispatchSimpleEvent(this,'visibility');this.viewport_.dispatchChangeEvent();if(!this.processBase_)return;this.updateContents_();this.viewport.rebuildEventToTrackMap();this.viewport.rebuildContainerToTrackMap();},get visible(){return!this.hidden;},get hasVisibleContent(){if(this.expanded){return this.children.length>1;}
-return true;},onHeaderClick_(e){e.stopPropagation();e.preventDefault();if(e.target===this.closeEl_){this.visible=false;}else{this.expanded=!this.expanded;}},updateContents_(){this.clearTracks_();if(!this.processBase_)return;if(!this.visible)return;Polymer.dom(this.processNameEl_).textContent=this.processBase_.userFriendlyName;this.headerEl_.title=this.processBase_.userFriendlyDetails;this.willAppendTracks_();if(this.expanded){this.appendMemoryDumpTrack_();this.appendObjectInstanceTracks_();this.appendCounterTracks_();this.appendFrameTrack_();this.appendThreadTracks_();}else{this.appendSummaryTrack_();}
-this.didAppendTracks_();},willAppendTracks_(){},didAppendTracks_(){},appendMemoryDumpTrack_(){},appendSummaryTrack_(){const track=new tr.ui.tracks.ProcessSummaryTrack(this.viewport);track.process=this.process;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},appendFrameTrack_(){const frames=this.process?this.process.frames:undefined;if(!frames||!frames.length)return;const track=new tr.ui.tracks.FrameTrack(this.viewport);track.frames=frames;Polymer.dom(this).appendChild(track);},appendObjectInstanceTracks_(){const instancesByTypeName=this.processBase_.objects.getAllInstancesByTypeName();const instanceTypeNames=Object.keys(instancesByTypeName);instanceTypeNames.sort();let didAppendAtLeastOneTrack=false;instanceTypeNames.forEach(function(typeName){const allInstances=instancesByTypeName[typeName];let instanceViewInfo=ObjectInstanceView.getTypeInfo(undefined,typeName);let snapshotViewInfo=ObjectSnapshotView.getTypeInfo(undefined,typeName);if(instanceViewInfo&&!instanceViewInfo.metadata.showInTrackView){instanceViewInfo=undefined;}
-if(snapshotViewInfo&&!snapshotViewInfo.metadata.showInTrackView){snapshotViewInfo=undefined;}
-const hasViewInfo=instanceViewInfo||snapshotViewInfo;const visibleInstances=[];for(let i=0;i<allInstances.length;i++){const instance=allInstances[i];if(instance.snapshots.length===0)continue;if(instance.hasImplicitSnapshots&&!hasViewInfo)continue;visibleInstances.push(instance);}
-if(visibleInstances.length===0)return;let trackConstructor=tr.ui.tracks.ObjectInstanceTrack.getConstructor(undefined,typeName);if(!trackConstructor){snapshotViewInfo=ObjectSnapshotView.getTypeInfo(undefined,typeName);if(snapshotViewInfo&&snapshotViewInfo.metadata.showInstances){trackConstructor=tr.ui.tracks.ObjectInstanceGroupTrack;}else{trackConstructor=tr.ui.tracks.ObjectInstanceTrack;}}
-const track=new trackConstructor(this.viewport);track.objectInstances=visibleInstances;Polymer.dom(this).appendChild(track);didAppendAtLeastOneTrack=true;},this);if(didAppendAtLeastOneTrack){Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}},appendCounterTracks_(){const counters=Object.values(this.processBase.counters);counters.sort(tr.model.Counter.compare);counters.forEach(function(counter){const track=new tr.ui.tracks.CounterTrack(this.viewport);track.counter=counter;Polymer.dom(this).appendChild(track);Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}.bind(this));},appendThreadTracks_(){const threads=Object.values(this.processBase.threads);threads.sort(tr.model.Thread.compare);const otherThreads=[];let hasVisibleThreads=false;threads.forEach(function(thread){const track=new tr.ui.tracks.ThreadTrack(this.viewport);track.thread=thread;if(!track.hasVisibleContent)return;if(track.hasSlices){hasVisibleThreads=true;Polymer.dom(this).appendChild(track);Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}else if(track.hasTimeSlices){otherThreads.push(thread);}}.bind(this));if(otherThreads.length>0){const track=new tr.ui.tracks.OtherThreadsTrack(this.viewport);track.threads=otherThreads;track.collapsible=otherThreads.length>1&&hasVisibleThreads;Polymer.dom(this).appendChild(track);}}};return{ProcessTrackBase,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const Cpu=tr.model.Cpu;const CpuTrack=tr.ui.tracks.cpu_track;const ProcessTrackBase=tr.ui.tracks.ProcessTrackBase;const SpacingTrack=tr.ui.tracks.SpacingTrack;const KernelTrack=tr.ui.b.define('kernel-track',ProcessTrackBase);KernelTrack.prototype={__proto__:ProcessTrackBase.prototype,decorate(viewport){ProcessTrackBase.prototype.decorate.call(this,viewport);},set kernel(kernel){this.processBase=kernel;},get kernel(){return this.processBase;},get eventContainer(){return this.kernel;},get hasVisibleContent(){return this.children.length>1;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ProcessTrackBase.prototype.addContainersToTrackMap.call(this,containerToTrackMap);containerToTrackMap.addContainer(this.kernel,this);},willAppendTracks_(){const cpus=Object.values(this.kernel.cpus);cpus.sort(tr.model.Cpu.compare);let didAppendAtLeastOneTrack=false;for(let i=0;i<cpus.length;++i){const cpu=cpus[i];const track=new tr.ui.tracks.CpuTrack(this.viewport);track.detailedMode=this.expanded;track.cpu=cpu;if(!track.hasVisibleContent)continue;Polymer.dom(this).appendChild(track);didAppendAtLeastOneTrack=true;}
-if(didAppendAtLeastOneTrack){Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}}};return{KernelTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const InteractionTrack=tr.ui.b.define('interaction-track',tr.ui.tracks.MultiRowTrack);InteractionTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);this.heading='Interactions';this.subRows_=[];},set model(model){this.setItemsToGroup(model.userModel.expectations,{guid:tr.b.GUID.allocateSimple(),model,getSettingsKey(){return undefined;}});},buildSubRows_(slices){if(this.subRows_.length){return this.subRows_;}
-this.subRows_.push(...tr.ui.tracks.groupAsyncSlicesIntoSubRows(slices,true));return this.subRows_;},addSubTrack_(slices){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;Polymer.dom(this).appendChild(track);return track;}};return{InteractionTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const LetterDotTrack=tr.ui.tracks.LetterDotTrack;const MemoryTrack=tr.ui.b.define('memory-track',LetterDotTrack);MemoryTrack.prototype={__proto__:LetterDotTrack.prototype,decorate(viewport){LetterDotTrack.prototype.decorate.call(this,viewport);this.classList.add('memory-track');this.heading='Memory Events';this.lowMemoryEvents_=undefined;},initialize(model){if(model!==undefined){this.lowMemoryEvents_=model.device.lowMemoryEvents;}else{this.lowMemoryEvents_=undefined;}
-if(this.hasVisibleContent){this.items=this.buildMemoryLetterDots_(this.lowMemoryEvents_);}},get hasVisibleContent(){return!!this.lowMemoryEvents_&&this.lowMemoryEvents_.length!==0;},buildMemoryLetterDots_(memoryEvents){return memoryEvents.map(memoryEvent=>new tr.ui.tracks.LetterDot(memoryEvent,'K',ColorScheme.getColorIdForReservedName('background_memory_dump'),memoryEvent.start));},};return{MemoryTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ALLOCATED_MEMORY_TRACK_HEIGHT=50;const ProcessMemoryDumpTrack=tr.ui.b.define('process-memory-dump-track',tr.ui.tracks.ContainerTrack);ProcessMemoryDumpTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.memoryDumps_=undefined;},get memoryDumps(){return this.memoryDumps_;},set memoryDumps(memoryDumps){this.memoryDumps_=memoryDumps;this.updateContents_();},updateContents_(){this.clearTracks_();if(!this.memoryDumps_||!this.memoryDumps_.length)return;this.appendAllocatedMemoryTrack_();},appendAllocatedMemoryTrack_(){const series=tr.ui.tracks.buildProcessAllocatedMemoryChartSeries(this.memoryDumps_);if(!series)return;const track=new tr.ui.tracks.ChartTrack(this.viewport);track.heading='Memory per component';track.height=ALLOCATED_MEMORY_TRACK_HEIGHT+'px';track.series=series;track.autoSetAllAxes({expandMax:true});Polymer.dom(this).appendChild(track);}};return{ProcessMemoryDumpTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ProcessTrackBase=tr.ui.tracks.ProcessTrackBase;const ProcessTrack=tr.ui.b.define('process-track',ProcessTrackBase);ProcessTrack.prototype={__proto__:ProcessTrackBase.prototype,decorate(viewport){tr.ui.tracks.ProcessTrackBase.prototype.decorate.call(this,viewport);},drawTrack(type){switch(type){case tr.ui.tracks.DrawType.INSTANT_EVENT:{if(!this.processBase.instantEvents||this.processBase.instantEvents.length===0){break;}
-const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const canvasBounds=ctx.canvas.getBoundingClientRect();ctx.save();ctx.translate(0,pixelRatio*(bounds.top-canvasBounds.top));const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(canvasBounds.width*pixelRatio);tr.ui.b.drawInstantSlicesAsLines(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,bounds.height,this.processBase.instantEvents,2);ctx.restore();break;}
-case tr.ui.tracks.DrawType.BACKGROUND:this.drawBackground_();return;}
-tr.ui.tracks.ContainerTrack.prototype.drawTrack.call(this,type);},drawBackground_(){const ctx=this.context();const canvasBounds=ctx.canvas.getBoundingClientRect();const pixelRatio=window.devicePixelRatio||1;const children=this.children;let draw=false;ctx.fillStyle='#eee';for(let i=0;i<children.length;++i){if(!(children[i]instanceof tr.ui.tracks.Track)||(children[i]instanceof tr.ui.tracks.SpacingTrack)){continue;}
-draw=!draw;if(!draw)continue;const bounds=children[i].getBoundingClientRect();ctx.fillRect(0,pixelRatio*(bounds.top-canvasBounds.top),ctx.canvas.width,pixelRatio*bounds.height);}},set process(process){this.processBase=process;},get process(){return this.processBase;},get eventContainer(){return this.process;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ProcessTrackBase.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.process,this);},appendMemoryDumpTrack_(){const processMemoryDumps=this.process.memoryDumps;if(processMemoryDumps.length){const pmdt=new tr.ui.tracks.ProcessMemoryDumpTrack(this.viewport_);pmdt.memoryDumps=processMemoryDumps;Polymer.dom(this).appendChild(pmdt);}},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onPickHit(instantEvent){selection.push(instantEvent);}
-const instantEventWidth=2*viewPixWidthWorld;tr.b.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(x){return x.start;},function(x){return x.duration+instantEventWidth;},loWX,hiWX,onPickHit.bind(this));tr.ui.tracks.ContainerTrack.prototype.addIntersectingEventsInRangeToSelectionInWorldSpace.apply(this,arguments);},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){this.addClosestInstantEventToSelection(this.processBase.instantEvents,worldX,worldMaxDist,selection);tr.ui.tracks.ContainerTrack.prototype.addClosestEventToSelection.apply(this,arguments);}};return{ProcessTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SelectionState=tr.model.SelectionState;const ColorScheme=tr.b.ColorScheme;const EventPresenter=tr.ui.b.EventPresenter;const ModelTrack=tr.ui.b.define('model-track',tr.ui.tracks.ContainerTrack);ModelTrack.VSYNC_HIGHLIGHT_ALPHA=0.1;ModelTrack.VSYNC_DENSITY_TRANSPARENT=0.20;ModelTrack.VSYNC_DENSITY_OPAQUE=0.10;ModelTrack.VSYNC_DENSITY_RANGE=ModelTrack.VSYNC_DENSITY_TRANSPARENT-ModelTrack.VSYNC_DENSITY_OPAQUE;ModelTrack.generateStripes_=function(times,minTime,maxTime){if(times.length===0)return[];const lowIndex=tr.b.findLowIndexInSortedArray(times,(x=>x),minTime);let highIndex=lowIndex-1;while(times[highIndex+1]<=maxTime){highIndex++;}
-const stripes=[];for(let i=lowIndex-(lowIndex%2);i<=highIndex;i+=2){const left=i<lowIndex?minTime:times[i];const right=i+1>highIndex?maxTime:times[i+1];stripes.push(tr.b.math.Range.fromExplicitRange(left,right));}
-return stripes;};ModelTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('model-track');this.upperMode_=false;this.annotationViews_=[];this.vSyncTimes_=[];},get processViews(){return Polymer.dom(this).querySelectorAll('.process-track-base');},get upperMode(){return this.upperMode_;},set upperMode(upperMode){this.upperMode_=upperMode;this.updateContents_();},detach(){tr.ui.tracks.ContainerTrack.prototype.detach.call(this);},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();this.model_.addEventListener('annotationChange',this.updateAnnotations_.bind(this));},get hasVisibleContent(){return this.children.length>0;},updateContents_(){Polymer.dom(this).textContent='';if(!this.model_)return;if(this.upperMode_){this.updateContentsForUpperMode_();}else{this.updateContentsForLowerMode_();}},updateContentsForUpperMode_(){},updateContentsForLowerMode_(){if(this.model_.userModel.expectations.length>1){const mrt=new tr.ui.tracks.InteractionTrack(this.viewport_);mrt.model=this.model_;Polymer.dom(this).appendChild(mrt);}
-if(this.model_.alerts.length){const at=new tr.ui.tracks.AlertTrack(this.viewport_);at.alerts=this.model_.alerts;Polymer.dom(this).appendChild(at);}
-if(this.model_.globalMemoryDumps.length){const gmdt=new tr.ui.tracks.GlobalMemoryDumpTrack(this.viewport_);gmdt.memoryDumps=this.model_.globalMemoryDumps;Polymer.dom(this).appendChild(gmdt);}
-this.appendDeviceTrack_();this.appendCpuUsageTrack_();this.appendMemoryTrack_();this.appendKernelTrack_();const processes=this.model_.getAllProcesses();processes.sort(tr.model.Process.compare);for(let i=0;i<processes.length;++i){const process=processes[i];const track=new tr.ui.tracks.ProcessTrack(this.viewport);track.process=process;if(!track.hasVisibleContent)continue;Polymer.dom(this).appendChild(track);}
-this.viewport_.rebuildEventToTrackMap();this.viewport_.rebuildContainerToTrackMap();this.vSyncTimes_=this.model_.device.vSyncTimestamps;this.updateAnnotations_();},getContentBounds(){return this.model.bounds;},addAnnotation(annotation){this.model.addAnnotation(annotation);},removeAnnotation(annotation){this.model.removeAnnotation(annotation);},updateAnnotations_(){this.annotationViews_=[];const annotations=this.model_.getAllAnnotations();for(let i=0;i<annotations.length;i++){this.annotationViews_.push(annotations[i].getOrCreateView(this.viewport_));}
-this.invalidateDrawingContainer();},addEventsToTrackMap(eventToTrackMap){if(!this.model_)return;const tracks=this.children;for(let i=0;i<tracks.length;++i){tracks[i].addEventsToTrackMap(eventToTrackMap);}
-if(this.instantEvents===undefined)return;const vp=this.viewport_;this.instantEvents.forEach(function(ev){eventToTrackMap.addEvent(ev,this);}.bind(this));},appendDeviceTrack_(){const device=this.model.device;const track=new tr.ui.tracks.DeviceTrack(this.viewport);track.device=this.model.device;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},appendKernelTrack_(){const kernel=this.model.kernel;const track=new tr.ui.tracks.KernelTrack(this.viewport);track.kernel=this.model.kernel;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},appendCpuUsageTrack_(){const track=new tr.ui.tracks.CpuUsageTrack(this.viewport);track.initialize(this.model);if(!track.hasVisibleContent)return;this.appendChild(track);},appendMemoryTrack_(){const track=new tr.ui.tracks.MemoryTrack(this.viewport);track.initialize(this.model);if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},drawTrack(type){const ctx=this.context();if(!this.model_)return;const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const canvasBounds=ctx.canvas.getBoundingClientRect();ctx.save();ctx.translate(0,pixelRatio*(bounds.top-canvasBounds.top));const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(canvasBounds.width*pixelRatio);const viewHeight=bounds.height*pixelRatio;switch(type){case tr.ui.tracks.DrawType.GRID:this.viewport.drawMajorMarkLines(ctx,viewHeight);ctx.restore();return;case tr.ui.tracks.DrawType.FLOW_ARROWS:if(this.model_.flowIntervalTree.size===0){ctx.restore();return;}
-this.drawFlowArrows_(viewLWorld,viewRWorld);ctx.restore();return;case tr.ui.tracks.DrawType.INSTANT_EVENT:if(!this.model_.instantEvents||this.model_.instantEvents.length===0){break;}
-tr.ui.b.drawInstantSlicesAsLines(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,bounds.height,this.model_.instantEvents,4);break;case tr.ui.tracks.DrawType.MARKERS:if(!this.viewport.interestRange.isEmpty){this.viewport.interestRange.draw(ctx,viewLWorld,viewRWorld,viewHeight);this.viewport.interestRange.drawIndicators(ctx,viewLWorld,viewRWorld);}
-ctx.restore();return;case tr.ui.tracks.DrawType.HIGHLIGHTS:this.drawVSyncHighlight(ctx,dt,viewLWorld,viewRWorld,viewHeight);ctx.restore();return;case tr.ui.tracks.DrawType.ANNOTATIONS:for(let i=0;i<this.annotationViews_.length;i++){this.annotationViews_[i].draw(ctx);}
-ctx.restore();return;}
-ctx.restore();tr.ui.tracks.ContainerTrack.prototype.drawTrack.call(this,type);},drawFlowArrows_(viewLWorld,viewRWorld){const ctx=this.context();ctx.strokeStyle='rgba(0, 0, 0, 0.4)';ctx.fillStyle='rgba(0, 0, 0, 0.4)';ctx.lineWidth=1;const events=this.model_.flowIntervalTree.findIntersection(viewLWorld,viewRWorld);const canvasBounds=ctx.canvas.getBoundingClientRect();for(let i=0;i<events.length;++i){const onlyHighlighted=!tr.b.getCategoryParts(events[i].category).some((x)=>this.viewport.selectedFlowEvents.has(x));if(onlyHighlighted&&events[i].selectionState!==SelectionState.SELECTED&&events[i].selectionState!==SelectionState.HIGHLIGHTED){continue;}
-this.drawFlowArrow_(ctx,events[i],canvasBounds);}},drawFlowArrow_(ctx,flowEvent,canvasBounds){const dt=this.viewport.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const startTrack=this.viewport.trackForEvent(flowEvent.startSlice);const endTrack=this.viewport.trackForEvent(flowEvent.endSlice);if(startTrack===undefined||endTrack===undefined)return;const startBounds=startTrack.getBoundingClientRect();const endBounds=endTrack.getBoundingClientRect();if(flowEvent.selectionState===SelectionState.SELECTED){ctx.shadowBlur=1;ctx.shadowColor='red';ctx.shadowOffsety=2;ctx.strokeStyle=tr.b.ColorScheme.colorsAsStrings[tr.b.ColorScheme.getVariantColorId(flowEvent.colorId,tr.b.ColorScheme.properties.brightenedOffsets[0])];}else if(flowEvent.selectionState===SelectionState.HIGHLIGHTED){ctx.shadowBlur=1;ctx.shadowColor='red';ctx.shadowOffsety=2;ctx.strokeStyle=tr.b.ColorScheme.colorsAsStrings[tr.b.ColorScheme.getVariantColorId(flowEvent.colorId,tr.b.ColorScheme.properties.brightenedOffsets[0])];}else if(flowEvent.selectionState===SelectionState.DIMMED){ctx.shadowBlur=0;ctx.shadowOffsetX=0;ctx.strokeStyle=tr.b.ColorScheme.colorsAsStrings[flowEvent.colorId];}else{let hasBoost=false;const startSlice=flowEvent.startSlice;hasBoost|=startSlice.selectionState===SelectionState.SELECTED;hasBoost|=startSlice.selectionState===SelectionState.HIGHLIGHTED;const endSlice=flowEvent.endSlice;hasBoost|=endSlice.selectionState===SelectionState.SELECTED;hasBoost|=endSlice.selectionState===SelectionState.HIGHLIGHTED;if(hasBoost){ctx.shadowBlur=1;ctx.shadowColor='rgba(255, 0, 0, 0.4)';ctx.shadowOffsety=2;ctx.strokeStyle=tr.b.ColorScheme.colorsAsStrings[tr.b.ColorScheme.getVariantColorId(flowEvent.colorId,tr.b.ColorScheme.properties.brightenedOffsets[0])];}else{ctx.shadowBlur=0;ctx.shadowOffsetX=0;ctx.strokeStyle=tr.b.ColorScheme.colorsAsStrings[flowEvent.colorId];}}
-const startSize=startBounds.left+startBounds.top+
-startBounds.bottom+startBounds.right;const endSize=endBounds.left+endBounds.top+
-endBounds.bottom+endBounds.right;if(startSize===0&&endSize===0)return;const startY=this.calculateTrackY_(startTrack,canvasBounds);const endY=this.calculateTrackY_(endTrack,canvasBounds);const worldOffset=this.getBoundingClientRect().top-canvasBounds.top;const pixelStartY=pixelRatio*(startY-worldOffset);const pixelEndY=pixelRatio*(endY-worldOffset);const startXView=dt.xWorldToView(flowEvent.start);const endXView=dt.xWorldToView(flowEvent.end);const midXView=(startXView+endXView)/2;ctx.beginPath();ctx.moveTo(startXView,pixelStartY);ctx.bezierCurveTo(midXView,pixelStartY,midXView,pixelEndY,endXView,pixelEndY);ctx.stroke();const arrowWidth=5*pixelRatio;const distance=endXView-startXView;if(distance<=(2*arrowWidth))return;const tipX=endXView;const tipY=pixelEndY;const arrowHeight=(endBounds.height/4)*pixelRatio;tr.ui.b.drawTriangle(ctx,tipX,tipY,tipX-arrowWidth,tipY-arrowHeight,tipX-arrowWidth,tipY+arrowHeight);ctx.fill();},drawVSyncHighlight(ctx,dt,viewLWorld,viewRWorld,viewHeight){if(!this.viewport_.highlightVSync){return;}
-const stripes=ModelTrack.generateStripes_(this.vSyncTimes_,viewLWorld,viewRWorld);if(stripes.length===0){return;}
-const vSyncHighlightColor=new tr.b.Color(ColorScheme.getColorForReservedNameAsString('vsync_highlight_color'));const stripeRange=stripes[stripes.length-1].max-stripes[0].min;const stripeDensity=stripeRange?stripes.length/(dt.scaleX*stripeRange):0;const clampedStripeDensity=tr.b.math.clamp(stripeDensity,ModelTrack.VSYNC_DENSITY_OPAQUE,ModelTrack.VSYNC_DENSITY_TRANSPARENT);const opacity=(ModelTrack.VSYNC_DENSITY_TRANSPARENT-clampedStripeDensity)/ModelTrack.VSYNC_DENSITY_RANGE;if(opacity===0){return;}
-ctx.fillStyle=vSyncHighlightColor.toStringWithAlphaOverride(ModelTrack.VSYNC_HIGHLIGHT_ALPHA*opacity);for(let i=0;i<stripes.length;i++){const xLeftView=dt.xWorldToView(stripes[i].min);const xRightView=dt.xWorldToView(stripes[i].max);ctx.fillRect(xLeftView,0,xRightView-xLeftView,viewHeight);}},calculateTrackY_(track,canvasBounds){const bounds=track.getBoundingClientRect();const size=bounds.left+bounds.top+bounds.bottom+bounds.right;if(size===0){return this.calculateTrackY_(Polymer.dom(track).parentNode,canvasBounds);}
-return bounds.top-canvasBounds.top+(bounds.height/2);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onPickHit(instantEvent){selection.push(instantEvent);}
-const instantEventWidth=3*viewPixWidthWorld;tr.b.iterateOverIntersectingIntervals(this.model_.instantEvents,function(x){return x.start;},function(x){return x.duration+instantEventWidth;},loWX,hiWX,onPickHit.bind(this));tr.ui.tracks.ContainerTrack.prototype.addIntersectingEventsInRangeToSelectionInWorldSpace.apply(this,arguments);},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){this.addClosestInstantEventToSelection(this.model_.instantEvents,worldX,worldMaxDist,selection);tr.ui.tracks.ContainerTrack.prototype.addClosestEventToSelection.apply(this,arguments);}};return{ModelTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const XAxisTrack=tr.ui.b.define('x-axis-track',tr.ui.tracks.Track);XAxisTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('x-axis-track');this.strings_secs_=[];this.strings_msecs_=[];this.strings_usecs_=[];this.strings_nsecs_=[];this.viewportChange_=this.viewportChange_.bind(this);viewport.addEventListener('change',this.viewportChange_);const heading=document.createElement('tr-ui-b-heading');heading.arrowVisible=false;Polymer.dom(this).appendChild(heading);},detach(){tr.ui.tracks.Track.prototype.detach.call(this);this.viewport.removeEventListener('change',this.viewportChange_);},viewportChange_(){if(this.viewport.interestRange.isEmpty){Polymer.dom(this).classList.remove('tall-mode');}else{Polymer.dom(this).classList.add('tall-mode');}},draw(type,viewLWorld,viewRWorld,viewHeight){switch(type){case tr.ui.tracks.DrawType.GRID:this.drawGrid_(viewLWorld,viewRWorld);break;case tr.ui.tracks.DrawType.MARKERS:this.drawMarkers_(viewLWorld,viewRWorld);break;}},drawGrid_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const canvasBounds=ctx.canvas.getBoundingClientRect();const trackBounds=this.getBoundingClientRect();const width=canvasBounds.width*pixelRatio;const height=trackBounds.height*pixelRatio;const hasInterestRange=!this.viewport.interestRange.isEmpty;const xAxisHeightPx=hasInterestRange?(height*2)/5:height;const vp=this.viewport;const dt=vp.currentDisplayTransform;vp.updateMajorMarkData(viewLWorld,viewRWorld);const majorMarkDistanceWorld=vp.majorMarkWorldPositions.length>1?vp.majorMarkWorldPositions[1]-vp.majorMarkWorldPositions[0]:0;const numTicksPerMajor=5;const minorMarkDistanceWorld=majorMarkDistanceWorld/numTicksPerMajor;const minorMarkDistancePx=dt.xWorldVectorToView(minorMarkDistanceWorld);const minorTickHeight=Math.floor(xAxisHeightPx*0.25);ctx.save();ctx.lineWidth=Math.round(pixelRatio);const crispLineCorrection=(ctx.lineWidth%2)/2;ctx.translate(crispLineCorrection,-crispLineCorrection);ctx.fillStyle='rgb(0, 0, 0)';ctx.strokeStyle='rgb(0, 0, 0)';ctx.textAlign='left';ctx.textBaseline='top';ctx.font=(9*pixelRatio)+'px sans-serif';const tickLabels=[];ctx.beginPath();for(let i=0;i<vp.majorMarkWorldPositions.length;i++){const curXWorld=vp.majorMarkWorldPositions[i];const curXView=dt.xWorldToView(curXWorld);const displayText=vp.majorMarkUnit.format(curXWorld,{deltaValue:majorMarkDistanceWorld});ctx.fillText(displayText,curXView+(2*pixelRatio),0);tr.ui.b.drawLine(ctx,curXView,0,curXView,xAxisHeightPx);if(minorMarkDistancePx){for(let j=1;j<numTicksPerMajor;++j){const xView=Math.floor(curXView+minorMarkDistancePx*j);tr.ui.b.drawLine(ctx,xView,xAxisHeightPx-minorTickHeight,xView,xAxisHeightPx);}}}
-ctx.strokeStyle='rgb(0, 0, 0)';tr.ui.b.drawLine(ctx,0,height,width,height);ctx.stroke();if(!hasInterestRange)return;tr.ui.b.drawLine(ctx,0,xAxisHeightPx,width,xAxisHeightPx);ctx.stroke();let displayDistance;const displayTextColor='rgb(0,0,0)';const arrowSpacing=10*pixelRatio;const arrowColor='rgb(128,121,121)';const arrowPosY=xAxisHeightPx*1.75;const arrowWidthView=3*pixelRatio;const arrowLengthView=10*pixelRatio;const spaceForArrowsView=2*(arrowWidthView+arrowSpacing);ctx.textBaseline='middle';ctx.font=(14*pixelRatio)+'px sans-serif';const textPosY=arrowPosY;const interestRange=vp.interestRange;if(interestRange.range===0){const markerWorld=interestRange.min;const markerView=dt.xWorldToView(markerWorld);const textToDraw=vp.majorMarkUnit.format(markerWorld);let textLeftView=markerView+4*pixelRatio;const textWidthView=ctx.measureText(textToDraw).width;if(textLeftView+textWidthView>width){textLeftView=markerView-4*pixelRatio-textWidthView;}
-ctx.fillStyle=displayTextColor;ctx.fillText(textToDraw,textLeftView,textPosY);return;}
-const leftMarker=interestRange.min;const rightMarker=interestRange.max;const leftMarkerView=dt.xWorldToView(leftMarker);const rightMarkerView=dt.xWorldToView(rightMarker);const distanceBetweenMarkers=interestRange.range;const distanceBetweenMarkersView=dt.xWorldVectorToView(distanceBetweenMarkers);const positionInMiddleOfMarkersView=leftMarkerView+(distanceBetweenMarkersView/2);const textToDraw=vp.majorMarkUnit.format(distanceBetweenMarkers);const textWidthView=ctx.measureText(textToDraw).width;const spaceForArrowsAndTextView=textWidthView+spaceForArrowsView+arrowSpacing;let textLeftView=positionInMiddleOfMarkersView-textWidthView/2;const textRightView=textLeftView+textWidthView;if(spaceForArrowsAndTextView>distanceBetweenMarkersView){textLeftView=rightMarkerView+2*arrowSpacing;if(textLeftView+textWidthView>width){textLeftView=leftMarkerView-2*arrowSpacing-textWidthView;}
-ctx.fillStyle=displayTextColor;ctx.fillText(textToDraw,textLeftView,textPosY);ctx.strokeStyle=arrowColor;ctx.beginPath();tr.ui.b.drawLine(ctx,leftMarkerView,arrowPosY,rightMarkerView,arrowPosY);ctx.stroke();ctx.fillStyle=arrowColor;tr.ui.b.drawArrow(ctx,leftMarkerView-1.5*arrowSpacing,arrowPosY,leftMarkerView,arrowPosY,arrowLengthView,arrowWidthView);tr.ui.b.drawArrow(ctx,rightMarkerView+1.5*arrowSpacing,arrowPosY,rightMarkerView,arrowPosY,arrowLengthView,arrowWidthView);}else if(spaceForArrowsView<=distanceBetweenMarkersView){let leftArrowStart;let rightArrowStart;if(spaceForArrowsAndTextView<=distanceBetweenMarkersView){ctx.fillStyle=displayTextColor;ctx.fillText(textToDraw,textLeftView,textPosY);leftArrowStart=textLeftView-arrowSpacing;rightArrowStart=textRightView+arrowSpacing;}else{leftArrowStart=positionInMiddleOfMarkersView;rightArrowStart=positionInMiddleOfMarkersView;}
-ctx.strokeStyle=arrowColor;ctx.fillStyle=arrowColor;tr.ui.b.drawArrow(ctx,leftArrowStart,arrowPosY,leftMarkerView,arrowPosY,arrowLengthView,arrowWidthView);tr.ui.b.drawArrow(ctx,rightArrowStart,arrowPosY,rightMarkerView,arrowPosY,arrowLengthView,arrowWidthView);}
-ctx.restore();},drawMarkers_(viewLWorld,viewRWorld){const pixelRatio=window.devicePixelRatio||1;const trackBounds=this.getBoundingClientRect();const viewHeight=trackBounds.height*pixelRatio;if(!this.viewport.interestRange.isEmpty){this.viewport.interestRange.draw(this.context(),viewLWorld,viewRWorld,viewHeight);}},addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection){},addAllEventsMatchingFilterToSelection(filter,selection){}};return{XAxisTrack,};});'use strict';Polymer({is:'tr-ui-timeline-track-view',ready(){this.displayTransform_=new tr.ui.TimelineDisplayTransform();this.model_=undefined;this.timelineView_=undefined;this.pollIfViewportAttachedInterval_=undefined;this.viewport_=new tr.ui.TimelineViewport(this);this.viewportDisplayTransformAtMouseDown_=undefined;this.brushingStateController_=undefined;this.rulerTrackContainer_=new tr.ui.tracks.DrawingContainer(this.viewport_);Polymer.dom(this).appendChild(this.rulerTrackContainer_);this.rulerTrackContainer_.invalidate();this.rulerTrackContainer_.style.overflowY='hidden';this.rulerTrackContainer_.style.flexShrink='0';this.rulerTrack_=new tr.ui.tracks.XAxisTrack(this.viewport_);Polymer.dom(this.rulerTrackContainer_).appendChild(this.rulerTrack_);this.upperModelTrack_=new tr.ui.tracks.ModelTrack(this.viewport_);this.upperModelTrack_.upperMode=true;Polymer.dom(this.rulerTrackContainer_).appendChild(this.upperModelTrack_);this.modelTrackContainer_=new tr.ui.tracks.DrawingContainer(this.viewport_);Polymer.dom(this).appendChild(this.modelTrackContainer_);this.modelTrackContainer_.style.display='block';this.modelTrackContainer_.style.flexGrow='1';this.modelTrackContainer_.invalidate();this.viewport_.modelTrackContainer=this.modelTrackContainer_;this.modelTrack_=new tr.ui.tracks.ModelTrack(this.viewport_);Polymer.dom(this.modelTrackContainer_).appendChild(this.modelTrack_);this.timingTool_=new tr.ui.b.TimingTool(this.viewport_,this);this.initMouseModeSelector();this.hideDragBox_();this.initHintText_();this.onSelectionChanged_=this.onSelectionChanged_.bind(this);this.onDblClick_=this.onDblClick_.bind(this);this.addEventListener('dblclick',this.onDblClick_);this.onMouseWheel_=this.onMouseWheel_.bind(this);this.addEventListener('mousewheel',this.onMouseWheel_);this.onMouseDown_=this.onMouseDown_.bind(this);this.addEventListener('mousedown',this.onMouseDown_);this.onMouseMove_=this.onMouseMove_.bind(this);this.addEventListener('mousemove',this.onMouseMove_);this.onTouchStart_=this.onTouchStart_.bind(this);this.addEventListener('touchstart',this.onTouchStart_);this.onTouchMove_=this.onTouchMove_.bind(this);this.addEventListener('touchmove',this.onTouchMove_);this.onTouchEnd_=this.onTouchEnd_.bind(this);this.addEventListener('touchend',this.onTouchEnd_);this.addHotKeys_();this.mouseViewPosAtMouseDown_={x:0,y:0};this.lastMouseViewPos_={x:0,y:0};this.lastTouchViewPositions_=[];this.alert_=undefined;this.isPanningAndScanning_=false;this.isZooming_=false;},initMouseModeSelector(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this;Polymer.dom(this).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.addEventListener('beginpan',this.onBeginPanScan_.bind(this));this.mouseModeSelector_.addEventListener('updatepan',this.onUpdatePanScan_.bind(this));this.mouseModeSelector_.addEventListener('endpan',this.onEndPanScan_.bind(this));this.mouseModeSelector_.addEventListener('beginselection',this.onBeginSelection_.bind(this));this.mouseModeSelector_.addEventListener('updateselection',this.onUpdateSelection_.bind(this));this.mouseModeSelector_.addEventListener('endselection',this.onEndSelection_.bind(this));this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));this.mouseModeSelector_.addEventListener('entertiming',this.timingTool_.onEnterTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('begintiming',this.timingTool_.onBeginTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('updatetiming',this.timingTool_.onUpdateTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('endtiming',this.timingTool_.onEndTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('exittiming',this.timingTool_.onExitTiming.bind(this.timingTool_));const m=tr.ui.b.MOUSE_SELECTOR_MODE;this.mouseModeSelector_.supportedModeMask=m.SELECTION|m.PANSCAN|m.ZOOM|m.TIMING;this.mouseModeSelector_.settingsKey='timelineTrackView.mouseModeSelector';this.mouseModeSelector_.setKeyCodeForMode(m.PANSCAN,'2'.charCodeAt(0));this.mouseModeSelector_.setKeyCodeForMode(m.SELECTION,'1'.charCodeAt(0));this.mouseModeSelector_.setKeyCodeForMode(m.ZOOM,'3'.charCodeAt(0));this.mouseModeSelector_.setKeyCodeForMode(m.TIMING,'4'.charCodeAt(0));this.mouseModeSelector_.setModifierForAlternateMode(m.SELECTION,tr.ui.b.MODIFIER.SHIFT);this.mouseModeSelector_.setModifierForAlternateMode(m.PANSCAN,tr.ui.b.MODIFIER.SPACE);},get brushingStateController(){return this.brushingStateController_;},set brushingStateController(brushingStateController){if(this.brushingStateController_){this.brushingStateController_.removeEventListener('change',this.onSelectionChanged_);}
-this.brushingStateController_=brushingStateController;if(this.brushingStateController_){this.brushingStateController_.addEventListener('change',this.onSelectionChanged_);}},set timelineView(view){this.timelineView_=view;},get processViews(){return this.modelTrack_.processViews;},onSelectionChanged_(){this.showHintText_('Press \'m\' to mark current selection');this.viewport_.dispatchChangeEvent();},set selection(selection){throw new Error('DO NOT CALL THIS');},set highlight(highlight){throw new Error('DO NOT CALL THIS');},detach(){this.modelTrack_.detach();this.upperModelTrack_.detach();if(this.pollIfViewportAttachedInterval_){window.clearInterval(this.pollIfViewportAttachedInterval_);this.pollIfViewportAttachedInterval_=undefined;}
-this.viewport_.detach();},get viewport(){return this.viewport_;},get model(){return this.model_;},set model(model){if(!model){throw new Error('Model cannot be undefined');}
-const modelInstanceChanged=this.model_!==model;this.model_=model;this.modelTrack_.model=model;this.upperModelTrack_.model=model;if(modelInstanceChanged){this.pollIfViewportAttachedInterval_=window.setInterval(this.pollIfViewportAttached_.bind(this),250);}},get hasVisibleContent(){return this.modelTrack_.hasVisibleContent||this.upperModelTrack_.hasVisibleContent;},pollIfViewportAttached_(){if(!this.viewport_.isAttachedToDocumentOrInTestMode||this.viewport_.clientWidth===0){return;}
-window.addEventListener('resize',this.viewport_.dispatchChangeEvent);window.clearInterval(this.pollIfViewportAttachedInterval_);this.pollIfViewportAttachedInterval_=undefined;this.setInitialViewport_();},setInitialViewport_(){this.modelTrackContainer_.updateCanvasSizeIfNeeded_();const w=this.modelTrackContainer_.canvas.width;let min;let range;if(this.model_.bounds.isEmpty){min=0;range=1000;}else if(this.model_.bounds.range===0){min=this.model_.bounds.min;range=1000;}else{min=this.model_.bounds.min;range=this.model_.bounds.range;}
-const boost=range*0.15;this.displayTransform_.set(this.viewport_.currentDisplayTransform);this.displayTransform_.xSetWorldBounds(min-boost,min+range+boost,w);this.viewport_.setDisplayTransformImmediately(this.displayTransform_);},addAllEventsMatchingFilterToSelectionAsTask(filter,selection){const modelTrack=this.modelTrack_;const firstT=modelTrack.addAllEventsMatchingFilterToSelectionAsTask(filter,selection);const lastT=firstT.after(function(){this.upperModelTrack_.addAllEventsMatchingFilterToSelection(filter,selection);},this);return firstT;},onMouseMove_(e){if(this.isZooming_)return;this.storeLastMousePos_(e);},onTouchStart_(e){this.storeLastTouchPositions_(e);this.focusElements_();},onTouchMove_(e){e.preventDefault();this.onUpdateTransformForTouch_(e);},onTouchEnd_(e){this.storeLastTouchPositions_(e);this.focusElements_();},addHotKeys_(){this.addKeyDownHotKeys_();this.addKeyPressHotKeys_();},addKeyPressHotKey(dict){dict.eventType='keypress';dict.useCapture=false;dict.thisArg=this;const binding=new tr.ui.b.HotKey(dict);this.$.hotkey_controller.addHotKey(binding);},addKeyPressHotKeys_(){this.addKeyPressHotKey({keyCodes:['w'.charCodeAt(0),','.charCodeAt(0)],callback(e){this.zoomBy_(1.5,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['s'.charCodeAt(0),'o'.charCodeAt(0)],callback(e){this.zoomBy_(1/1.5,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'g'.charCodeAt(0),callback(e){this.onGridToggle_(true);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'G'.charCodeAt(0),callback(e){this.onGridToggle_(false);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['W'.charCodeAt(0),'<'.charCodeAt(0)],callback(e){this.zoomBy_(10,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['S'.charCodeAt(0),'O'.charCodeAt(0)],callback(e){this.zoomBy_(1/10,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'a'.charCodeAt(0),callback(e){this.queueSmoothPan_(this.viewWidth_*0.3,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['d'.charCodeAt(0),'e'.charCodeAt(0)],callback(e){this.queueSmoothPan_(this.viewWidth_*-0.3,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'A'.charCodeAt(0),callback(e){this.queueSmoothPan_(viewWidth*0.5,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'D'.charCodeAt(0),callback(e){this.queueSmoothPan_(viewWidth*-0.5,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'0'.charCodeAt(0),callback(e){this.setInitialViewport_();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'f'.charCodeAt(0),callback(e){this.zoomToSelection();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'m'.charCodeAt(0),callback(e){this.setCurrentSelectionAsInterestRange_();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'p'.charCodeAt(0),callback(e){this.selectPowerSamplesInCurrentTimeRange_();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'h'.charCodeAt(0),callback(e){this.toggleHighDetails_();e.stopPropagation();}});},get viewWidth_(){return this.modelTrackContainer_.canvas.clientWidth;},addKeyDownHotKeys_(){const addBinding=function(dict){dict.eventType='keydown';dict.useCapture=false;dict.thisArg=this;const binding=new tr.ui.b.HotKey(dict);this.$.hotkey_controller.addHotKey(binding);}.bind(this);addBinding({keyCode:37,callback(e){const curSel=this.brushingStateController_.selection;const sel=this.viewport.getShiftedSelection(curSel,-1);if(sel){this.brushingStateController.changeSelectionFromTimeline(sel);this.panToSelection();}else{this.queueSmoothPan_(this.viewWidth_*0.3,0);}
-e.preventDefault();e.stopPropagation();}});addBinding({keyCode:39,callback(e){const curSel=this.brushingStateController_.selection;const sel=this.viewport.getShiftedSelection(curSel,1);if(sel){this.brushingStateController.changeSelectionFromTimeline(sel);this.panToSelection();}else{this.queueSmoothPan_(-this.viewWidth_*0.3,0);}
-e.preventDefault();e.stopPropagation();}});},onDblClick_(e){if(this.mouseModeSelector_.mode!==tr.ui.b.MOUSE_SELECTOR_MODE.SELECTION){return;}
-const curSelection=this.brushingStateController_.selection;if(!curSelection.length||!tr.b.getOnlyElement(curSelection).title){return;}
-const selection=new tr.model.EventSet();const filter=new tr.c.ExactTitleFilter(tr.b.getOnlyElement(curSelection).title);this.modelTrack_.addAllEventsMatchingFilterToSelection(filter,selection);this.brushingStateController.changeSelectionFromTimeline(selection);},onMouseWheel_(e){if(!e.altKey)return;const delta=e.wheelDelta/120;const zoomScale=Math.pow(1.5,delta);this.zoomBy_(zoomScale);e.preventDefault();},onMouseDown_(e){if(this.mouseModeSelector_.mode!==tr.ui.b.MOUSE_SELECTOR_MODE.SELECTION){return;}
-if(e.target!==this.rulerTrack_)return;this.dragBeginEvent_=undefined;if(this.xNavStringMarker_){this.model.removeAnnotation(this.xNavStringMarker_);this.xNavStringMarker_=undefined;}
-const dt=this.viewport_.currentDisplayTransform;tr.ui.b.trackMouseMovesUntilMouseUp(function(e){if(e.target===this.rulerTrack_)return;const relativePosition=this.extractRelativeMousePosition_(e);const loc=tr.model.Location.fromViewCoordinates(this.viewport_,relativePosition.x,relativePosition.y);if(!loc)return;if(this.guideLineAnnotation_===undefined){this.guideLineAnnotation_=new tr.model.XMarkerAnnotation(loc.xWorld);this.model.addAnnotation(this.guideLineAnnotation_);}else{this.guideLineAnnotation_.timestamp=loc.xWorld;this.modelTrackContainer_.invalidate();}
-const state=new tr.ui.b.UIState(loc,this.viewport_.currentDisplayTransform.scaleX);this.timelineView_.setFindCtlText(state.toUserFriendlyString(this.viewport_));}.bind(this),undefined,function onKeyUpDuringDrag(){if(this.dragBeginEvent_){this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_);}}.bind(this));},queueSmoothPan_(viewDeltaX,deltaY){const deltaX=this.viewport_.currentDisplayTransform.xViewVectorToWorld(viewDeltaX);const animation=new tr.ui.TimelineDisplayTransformPanAnimation(deltaX,deltaY);this.viewport_.queueDisplayTransformAnimation(animation);},zoomBy_(scale,smooth){if(scale<=0){return;}
-smooth=!!smooth;const vp=this.viewport_;const pixelRatio=window.devicePixelRatio||1;const goalFocalPointXView=this.lastMouseViewPos_.x*pixelRatio;const goalFocalPointXWorld=vp.currentDisplayTransform.xViewToWorld(goalFocalPointXView);if(smooth){const animation=new tr.ui.TimelineDisplayTransformZoomToAnimation(goalFocalPointXWorld,goalFocalPointXView,vp.currentDisplayTransform.panY,scale);vp.queueDisplayTransformAnimation(animation);}else{this.displayTransform_.set(vp.currentDisplayTransform);this.displayTransform_.scaleX*=scale;this.displayTransform_.xPanWorldPosToViewPos(goalFocalPointXWorld,goalFocalPointXView,this.viewWidth_);vp.setDisplayTransformImmediately(this.displayTransform_);}},zoomToSelection(){if(!this.brushingStateController.selectionOfInterest.length)return;const bounds=this.brushingStateController.selectionOfInterest.bounds;if(!bounds.range)return;const worldCenter=bounds.center;const viewCenter=this.modelTrackContainer_.canvas.width/2;const adjustedWorldRange=bounds.range*1.25;const newScale=this.modelTrackContainer_.canvas.width/adjustedWorldRange;const zoomInRatio=newScale/this.viewport_.currentDisplayTransform.scaleX;const animation=new tr.ui.TimelineDisplayTransformZoomToAnimation(worldCenter,viewCenter,this.viewport_.currentDisplayTransform.panY,zoomInRatio);this.viewport_.queueDisplayTransformAnimation(animation);},panToSelection(){if(!this.brushingStateController.selectionOfInterest.length)return;const bounds=this.brushingStateController.selectionOfInterest.bounds;const worldCenter=bounds.center;const viewWidth=this.viewWidth_;const dt=this.viewport_.currentDisplayTransform;if(false&&!bounds.range){if(dt.xWorldToView(bounds.center)<0||dt.xWorldToView(bounds.center)>viewWidth){this.displayTransform_.set(dt);this.displayTransform_.xPanWorldPosToViewPos(worldCenter,'center',viewWidth);const deltaX=this.displayTransform_.panX-dt.panX;const animation=new tr.ui.TimelineDisplayTransformPanAnimation(deltaX,0);this.viewport_.queueDisplayTransformAnimation(animation);}
-return;}
-this.displayTransform_.set(dt);this.displayTransform_.xPanWorldBoundsIntoView(bounds.min,bounds.max,viewWidth);const deltaX=this.displayTransform_.panX-dt.panX;const animation=new tr.ui.TimelineDisplayTransformPanAnimation(deltaX,0);this.viewport_.queueDisplayTransformAnimation(animation);},navToPosition(uiState,showNavLine){const location=uiState.location;const scaleX=uiState.scaleX;const track=location.getContainingTrack(this.viewport_);const worldCenter=location.xWorld;const viewCenter=this.modelTrackContainer_.canvas.width/5;const zoomInRatio=scaleX/this.viewport_.currentDisplayTransform.scaleX;track.scrollIntoViewIfNeeded();const animation=new tr.ui.TimelineDisplayTransformZoomToAnimation(worldCenter,viewCenter,this.viewport_.currentDisplayTransform.panY,zoomInRatio);this.viewport_.queueDisplayTransformAnimation(animation);if(!showNavLine)return;if(this.xNavStringMarker_){this.model.removeAnnotation(this.xNavStringMarker_);}
-this.xNavStringMarker_=new tr.model.XMarkerAnnotation(worldCenter);this.model.addAnnotation(this.xNavStringMarker_);},selectPowerSamplesInCurrentTimeRange_(){const selectionBounds=this.brushingStateController_.selection.bounds;if(this.model.device.powerSeries&&!selectionBounds.empty){const events=this.model.device.powerSeries.getSamplesWithinRange(selectionBounds.min,selectionBounds.max);const selection=new tr.model.EventSet(events);this.brushingStateController_.changeSelectionFromTimeline(selection);}},setCurrentSelectionAsInterestRange_(){const selectionBounds=this.brushingStateController_.selection.bounds;if(selectionBounds.empty){this.viewport_.interestRange.reset();return;}
-if(this.viewport_.interestRange.min===selectionBounds.min&&this.viewport_.interestRange.max===selectionBounds.max){this.viewport_.interestRange.reset();}else{this.viewport_.interestRange.set(selectionBounds);}},toggleHighDetails_(){this.viewport_.highDetails=!this.viewport_.highDetails;},hideDragBox_(){this.$.drag_box.style.left='-1000px';this.$.drag_box.style.top='-1000px';this.$.drag_box.style.width=0;this.$.drag_box.style.height=0;},setDragBoxPosition_(xStart,yStart,xEnd,yEnd){const loY=Math.min(yStart,yEnd);const hiY=Math.max(yStart,yEnd);const loX=Math.min(xStart,xEnd);const hiX=Math.max(xStart,xEnd);const modelTrackRect=this.modelTrack_.getBoundingClientRect();const dragRect={left:loX,top:loY,width:hiX-loX,height:hiY-loY};dragRect.right=dragRect.left+dragRect.width;dragRect.bottom=dragRect.top+dragRect.height;const modelTrackContainerRect=this.modelTrackContainer_.getBoundingClientRect();const clipRect={left:modelTrackContainerRect.left,top:modelTrackContainerRect.top,right:modelTrackContainerRect.right,bottom:modelTrackContainerRect.bottom};const headingWidth=window.getComputedStyle(Polymer.dom(this).querySelector('tr-ui-b-heading')).width;const trackTitleWidth=parseInt(headingWidth);clipRect.left=clipRect.left+trackTitleWidth;const intersectRect_=function(r1,r2){if(r2.left>r1.right||r2.right<r1.left||r2.top>r1.bottom||r2.bottom<r1.top){return false;}
-const results={};results.left=Math.max(r1.left,r2.left);results.top=Math.max(r1.top,r2.top);results.right=Math.min(r1.right,r2.right);results.bottom=Math.min(r1.bottom,r2.bottom);results.width=results.right-results.left;results.height=results.bottom-results.top;return results;};const finalDragBox=intersectRect_(clipRect,dragRect);this.$.drag_box.style.left=finalDragBox.left+'px';this.$.drag_box.style.width=finalDragBox.width+'px';this.$.drag_box.style.top=finalDragBox.top+'px';this.$.drag_box.style.height=finalDragBox.height+'px';this.$.drag_box.style.whiteSpace='nowrap';const pixelRatio=window.devicePixelRatio||1;const canv=this.modelTrackContainer_.canvas;const dt=this.viewport_.currentDisplayTransform;const loWX=dt.xViewToWorld((loX-canv.offsetLeft)*pixelRatio);const hiWX=dt.xViewToWorld((hiX-canv.offsetLeft)*pixelRatio);Polymer.dom(this.$.drag_box).textContent=tr.b.Unit.byName.timeDurationInMs.format(hiWX-loWX);const e=new tr.b.Event('selectionChanging');e.loWX=loWX;e.hiWX=hiWX;this.dispatchEvent(e);},onGridToggle_(left){const selection=this.brushingStateController_.selection;const tb=left?selection.bounds.min:selection.bounds.max;if(this.viewport_.gridEnabled&&this.viewport_.gridSide===left&&this.viewport_.gridInitialTimebase===tb){this.viewport_.gridside=undefined;this.viewport_.gridEnabled=false;this.viewport_.gridInitialTimebase=undefined;return;}
-const numIntervalsSinceStart=Math.ceil((tb-this.model_.bounds.min)/this.viewport_.gridStep_);this.viewport_.gridEnabled=true;this.viewport_.gridSide=left;this.viewport_.gridInitialTimebase=tb;this.viewport_.gridTimebase=tb-
-(numIntervalsSinceStart+1)*this.viewport_.gridStep_;},storeLastMousePos_(e){this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);},storeLastTouchPositions_(e){this.lastTouchViewPositions_=this.extractRelativeTouchPositions_(e);},extractRelativeMousePosition_(e){const canv=this.modelTrackContainer_.canvas;return{x:e.clientX-canv.offsetLeft,y:e.clientY-canv.offsetTop};},extractRelativeTouchPositions_(e){const canv=this.modelTrackContainer_.canvas;const touches=[];for(let i=0;i<e.touches.length;++i){touches.push({x:e.touches[i].clientX-canv.offsetLeft,y:e.touches[i].clientY-canv.offsetTop});}
-return touches;},storeInitialMouseDownPos_(e){const position=this.extractRelativeMousePosition_(e);this.mouseViewPosAtMouseDown_.x=position.x;this.mouseViewPosAtMouseDown_.y=position.y;},focusElements_(){this.$.hotkey_controller.childRequestsGeneralFocus(this);},storeInitialInteractionPositionsAndFocus_(e){this.storeInitialMouseDownPos_(e);this.storeLastMousePos_(e);this.focusElements_();},onBeginPanScan_(e){const vp=this.viewport_;this.viewportDisplayTransformAtMouseDown_=vp.currentDisplayTransform.clone();this.isPanningAndScanning_=true;this.storeInitialInteractionPositionsAndFocus_(e);e.preventDefault();},onUpdatePanScan_(e){if(!this.isPanningAndScanning_)return;const viewWidth=this.viewWidth_;const pixelRatio=window.devicePixelRatio||1;const xDeltaView=pixelRatio*(this.lastMouseViewPos_.x-
-this.mouseViewPosAtMouseDown_.x);const yDelta=this.lastMouseViewPos_.y-
-this.mouseViewPosAtMouseDown_.y;this.displayTransform_.set(this.viewportDisplayTransformAtMouseDown_);this.displayTransform_.incrementPanXInViewUnits(xDeltaView);this.displayTransform_.panY-=yDelta;this.viewport_.setDisplayTransformImmediately(this.displayTransform_);e.preventDefault();e.stopPropagation();this.storeLastMousePos_(e);},onEndPanScan_(e){this.isPanningAndScanning_=false;this.storeLastMousePos_(e);if(!e.isClick){e.preventDefault();}},onBeginSelection_(e){const canv=this.modelTrackContainer_.canvas;const rect=this.modelTrack_.getBoundingClientRect();const canvRect=canv.getBoundingClientRect();const inside=rect&&e.clientX>=rect.left&&e.clientX<rect.right&&e.clientY>=rect.top&&e.clientY<rect.bottom&&e.clientX>=canvRect.left&&e.clientX<canvRect.right;if(!inside)return;this.dragBeginEvent_=e;this.storeInitialInteractionPositionsAndFocus_(e);e.preventDefault();},onUpdateSelection_(e){if(!this.dragBeginEvent_)return;this.dragBoxXStart_=this.dragBeginEvent_.clientX;this.dragBoxXEnd_=e.clientX;this.dragBoxYStart_=this.dragBeginEvent_.clientY;this.dragBoxYEnd_=e.clientY;this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_);},onEndSelection_(e){e.preventDefault();if(!this.dragBeginEvent_)return;this.hideDragBox_();const eDown=this.dragBeginEvent_;this.dragBeginEvent_=undefined;const loY=Math.min(eDown.clientY,e.clientY);const hiY=Math.max(eDown.clientY,e.clientY);const loX=Math.min(eDown.clientX,e.clientX);const hiX=Math.max(eDown.clientX,e.clientX);const canv=this.modelTrackContainer_.canvas;const worldOffset=canv.getBoundingClientRect().left;const loVX=loX-worldOffset;const hiVX=hiX-worldOffset;const selection=new tr.model.EventSet();if(eDown.appendSelection){const previousSelection=this.brushingStateController_.selection;if(previousSelection!==undefined){selection.addEventSet(previousSelection);}}
-this.modelTrack_.addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection);this.brushingStateController_.changeSelectionFromTimeline(selection);},onBeginZoom_(e){this.isZooming_=true;this.storeInitialInteractionPositionsAndFocus_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const newPosition=this.extractRelativeMousePosition_(e);const zoomScaleValue=1+(this.lastMouseViewPos_.y-
-newPosition.y)*0.01;this.zoomBy_(zoomScaleValue,false);this.storeLastMousePos_(e);},onEndZoom_(e){this.isZooming_=false;if(!e.isClick){e.preventDefault();}},computeTouchCenter_(positions){let xSum=0;let ySum=0;for(let i=0;i<positions.length;++i){xSum+=positions[i].x;ySum+=positions[i].y;}
-return{x:xSum/positions.length,y:ySum/positions.length};},computeTouchSpan_(positions){let xMin=Number.MAX_VALUE;let yMin=Number.MAX_VALUE;let xMax=Number.MIN_VALUE;let yMax=Number.MIN_VALUE;for(let i=0;i<positions.length;++i){xMin=Math.min(xMin,positions[i].x);yMin=Math.min(yMin,positions[i].y);xMax=Math.max(xMax,positions[i].x);yMax=Math.max(yMax,positions[i].y);}
-return Math.sqrt((xMin-xMax)*(xMin-xMax)+
-(yMin-yMax)*(yMin-yMax));},onUpdateTransformForTouch_(e){const newPositions=this.extractRelativeTouchPositions_(e);const currentPositions=this.lastTouchViewPositions_;const newCenter=this.computeTouchCenter_(newPositions);const currentCenter=this.computeTouchCenter_(currentPositions);const newSpan=this.computeTouchSpan_(newPositions);const currentSpan=this.computeTouchSpan_(currentPositions);const vp=this.viewport_;const viewWidth=this.viewWidth_;const pixelRatio=window.devicePixelRatio||1;const xDelta=pixelRatio*(newCenter.x-currentCenter.x);const yDelta=newCenter.y-currentCenter.y;const zoomScaleValue=currentSpan>10?newSpan/currentSpan:1;const viewFocus=pixelRatio*newCenter.x;const worldFocus=vp.currentDisplayTransform.xViewToWorld(viewFocus);this.displayTransform_.set(vp.currentDisplayTransform);this.displayTransform_.scaleX*=zoomScaleValue;this.displayTransform_.xPanWorldPosToViewPos(worldFocus,viewFocus,viewWidth);this.displayTransform_.incrementPanXInViewUnits(xDelta);this.displayTransform_.panY-=yDelta;vp.setDisplayTransformImmediately(this.displayTransform_);this.storeLastTouchPositions_(e);},initHintText_(){this.$.hint_text.style.display='none';this.pendingHintTextClearTimeout_=undefined;},showHintText_(text){if(this.pendingHintTextClearTimeout_){window.clearTimeout(this.pendingHintTextClearTimeout_);this.pendingHintTextClearTimeout_=undefined;}
-this.pendingHintTextClearTimeout_=setTimeout(this.hideHintText_.bind(this),1000);Polymer.dom(this.$.hint_text).textContent=text;this.$.hint_text.style.display='';},hideHintText_(){this.pendingHintTextClearTimeout_=undefined;this.$.hint_text.style.display='none';}});'use strict';Polymer({is:'tr-ui-find-control',filterKeyDown(e){if(e.keyCode===27){const hkc=tr.b.getHotkeyControllerForElement(this);if(hkc){hkc.childRequestsBlur(this);}else{this.blur();}
-e.preventDefault();e.stopPropagation();return;}else if(e.keyCode===13){if(e.shiftKey){this.findPrevious();}else{this.findNext();}}},filterBlur(e){this.updateHitCountEl();},filterFocus(e){this.$.filter.select();},filterMouseUp(e){e.preventDefault();},get controller(){return this.controller_;},set controller(c){this.controller_=c;this.updateHitCountEl();},focus(){this.$.filter.focus();},get hasFocus(){return this===document.activeElement;},filterTextChanged(){Polymer.dom(this.$.hitCount).textContent='';this.$.spinner.style.visibility='visible';this.$.spinner.style.animation='spin 1s linear infinite';this.controller.startFiltering(this.$.filter.value).then(function(){this.$.spinner.style.visibility='hidden';this.$.spinner.style.animation='';this.updateHitCountEl();}.bind(this));},findNext(){if(this.controller){this.controller.findNext();}
-this.updateHitCountEl();},findPrevious(){if(this.controller){this.controller.findPrevious();}
-this.updateHitCountEl();},updateHitCountEl(){if(!this.controller||this.$.filter.value.length===0){Polymer.dom(this.$.hitCount).textContent='';return;}
-const n=this.controller.filterHits.length;const i=n===0?-1:this.controller.currentHitIndex;Polymer.dom(this.$.hitCount).textContent=(i+1)+' of '+n;},setText(string){this.$.filter.value=string;}});'use strict';tr.exportTo('tr.e.tquery',function(){function Context(){this.event=undefined;this.ancestors=[];}
-Context.prototype={push(event){const ctx=new Context();ctx.ancestors=this.ancestors.slice();ctx.ancestors.push(event);return ctx;},pop(event){const ctx=new Context();ctx.event=this.ancestors[this.ancestors.length-1];ctx.ancestors=this.ancestors.slice(0,this.ancestors.length-1);return ctx;}};return{Context,};});'use strict';tr.exportTo('tr.e.tquery',function(){function Filter(){tr.c.ScriptingObject.call(this);}
-Filter.normalizeFilterExpression=function(filterExpression){if(filterExpression instanceof String||typeof(filterExpression)==='string'||filterExpression instanceof RegExp){const filter=new tr.e.tquery.FilterHasTitle(filterExpression);return filter;}
-return filterExpression;};Filter.prototype={__proto__:tr.c.ScriptingObject.prototype,evaluate(context){throw new Error('Not implemented');},matchValue_(value,expected){if(expected instanceof RegExp){return expected.test(value);}else if(expected instanceof Function){return expected(value);}
-return value===expected;}};return{Filter,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterAllOf(opt_subExpressions){tr.e.tquery.Filter.call(this);this.subExpressions=opt_subExpressions||[];}
-FilterAllOf.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpressions(exprs){this.subExpressions_=[];for(let i=0;i<exprs.length;i++){this.subExpressions_.push(tr.e.tquery.Filter.normalizeFilterExpression(exprs[i]));}},get subExpressions(){return this.subExpressions_;},evaluate(context){if(!this.subExpressions.length)return true;for(let i=0;i<this.subExpressions.length;i++){if(!this.subExpressions[i].evaluate(context)){return false;}}
-return true;}};tr.c.ScriptingObjectRegistry.register(function(){const exprs=[];for(let i=0;i<arguments.length;i++){exprs.push(arguments[i]);}
-return new FilterAllOf(exprs);},{name:'allOf'});return{FilterAllOf,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterNot(subExpression){tr.e.tquery.Filter.call(this);this.subExpression=subExpression;}
-FilterNot.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpression(expr){this.subExpression_=tr.e.tquery.Filter.normalizeFilterExpression(expr);},get subExpression(){return this.subExpression_;},evaluate(context){return!this.subExpression.evaluate(context);}};tr.c.ScriptingObjectRegistry.register(function(){const exprs=Array.prototype.slice.call(arguments);if(exprs.length!==1){throw new Error('not() must have exactly one subexpression');}
-return new FilterNot(exprs[0]);},{name:'not'});return{FilterNot,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterAnyOf(opt_subExpressions){tr.e.tquery.Filter.call(this);this.subExpressions=opt_subExpressions||[];}
-FilterAnyOf.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpressions(exprs){this.subExpressions_=[];for(let i=0;i<exprs.length;i++){this.subExpressions_.push(tr.e.tquery.Filter.normalizeFilterExpression(exprs[i]));}},get subExpressions(){return this.subExpressions_;},evaluate(context){if(!this.subExpressions.length)return true;for(let i=0;i<this.subExpressions.length;i++){if(this.subExpressions[i].evaluate(context))return true;}
-return false;}};tr.c.ScriptingObjectRegistry.register(function(){const exprs=Array.prototype.slice.call(arguments);return new FilterAnyOf(exprs);},{name:'anyOf'});tr.c.ScriptingObjectRegistry.register(function(){const exprs=Array.prototype.slice.call(arguments);return new tr.e.tquery.FilterNot(new FilterAnyOf(exprs));},{name:'noneOf'});return{FilterAnyOf,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterHasAncestor(opt_subExpression){this.subExpression=opt_subExpression;}
-FilterHasAncestor.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpression(expr){this.subExpression_=tr.e.tquery.Filter.normalizeFilterExpression(expr);},get subExpression(){return this.subExpression_;},evaluate(context){if(!this.subExpression){return context.ancestors.length>0;}
-while(context.ancestors.length){context=context.pop();if(this.subExpression.evaluate(context))return true;}
-return false;}};tr.c.ScriptingObjectRegistry.register(function(subExpression){return new FilterHasAncestor(subExpression);},{name:'hasAncestor'});return{FilterHasAncestor,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterHasDuration(minValueOrExpected,opt_maxValue){if(minValueOrExpected!==undefined&&opt_maxValue!==undefined){this.minValue=minValueOrExpected;this.maxValue=opt_maxValue;}else{this.expected=minValueOrExpected;}}
-FilterHasDuration.prototype={__proto__:tr.e.tquery.Filter.prototype,evaluate(context){if(context.event.duration===undefined)return false;if(this.minValue!==undefined&&this.maxValue!==undefined){return context.event.duration>=this.minValue&&context.event.duration<=this.maxValue;}
-return this.matchValue_(context.event.duration,this.expected);}};tr.c.ScriptingObjectRegistry.register(function(minValueOrExpected,opt_maxValue){return new FilterHasDuration(minValueOrExpected,opt_maxValue);},{name:'hasDuration'});return{FilterHasDuration,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterHasTitle(expected){tr.e.tquery.Filter.call(this);this.expected=expected;}
-FilterHasTitle.prototype={__proto__:tr.e.tquery.Filter.prototype,evaluate(context){return this.matchValue_(context.event.title,this.expected);}};tr.c.ScriptingObjectRegistry.register(function(expected){const filter=new tr.e.tquery.FilterHasTitle(expected);return filter;},{name:'hasTitle'});return{FilterHasTitle,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterIsTopLevel(opt_subExpression){this.subExpression=opt_subExpression;}
-FilterIsTopLevel.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpression(expr){this.subExpression_=tr.e.tquery.Filter.normalizeFilterExpression(expr);},get subExpression(){return this.subExpression_;},evaluate(context){if(context.ancestors.length>0)return false;if(!this.subExpression)return true;return this.subExpression.evaluate(context);}};tr.c.ScriptingObjectRegistry.register(function(subExpression){return new FilterIsTopLevel(subExpression);},{name:'isTopLevel'});return{FilterIsTopLevel,};});'use strict';tr.exportTo('tr.e.tquery',function(){function addEventTreeToSelection(selection,event){selection.push(event);if(!event.subSlices)return;event.subSlices.forEach(addEventTreeToSelection.bind(undefined,selection));}
-function TQuery(model){tr.c.ScriptingObject.call(this);this.model_=model;this.parent_=undefined;this.filterExpression_=undefined;this.selection_=undefined;}
-TQuery.prototype={__proto__:tr.c.ScriptingObject.prototype,onModelChanged(model){this.model_=model;this.selection_=undefined;},get brushingStateController(){return this.brushingStateController_;},filter(filterExpression){const result=new TQuery(this.model_);result.parent_=this;result.filterExpression_=tr.e.tquery.Filter.normalizeFilterExpression(filterExpression);return result;},createFilterTaskGraph_(){const nodes=[this];while(nodes[nodes.length-1].parent_){nodes.push(nodes[nodes.length-1].parent_);}
-const rootTask=new tr.b.Task();let lastTask=rootTask;let node;for(let i=nodes.length-1;i>=0;i--){node=nodes[i];if(node.selection_!==undefined)continue;node.selection_=new tr.model.EventSet();if(node.parent_===undefined){lastTask=lastTask.after(this.selectEverythingAsTask_(node.selection_));}else{const prevNode=nodes[i+1];lastTask=this.createFilterTaskForNode_(lastTask,node,prevNode);}}
-return{rootTask,lastTask,lastNode:node};},createFilterTaskForNode_(lastTask,node,prevNode){return lastTask.after(function(){node.evaluateFilterExpression_(prevNode.selection_,node.selection_);},this);},evaluateFilterExpression_(inputSelection,outputSelection){const seenEvents={};inputSelection.forEach(function(event){const context=new tr.e.tquery.Context();context.event=event;this.evaluateFilterExpressionForEvent_(context,inputSelection,outputSelection,seenEvents);}.bind(this));},evaluateFilterExpressionForEvent_(context,inputSelection,outputSelection,seenEvents){const event=context.event;if(inputSelection.contains(event)&&!seenEvents[event.guid]){seenEvents[event.guid]=true;if(!this.filterExpression_||this.filterExpression_.evaluate(context)){outputSelection.push(event);}}
-if(!event.subSlices)return;context=context.push(event);for(let i=0;i<event.subSlices.length;i++){context.event=event.subSlices[i];this.evaluateFilterExpressionForEvent_(context,inputSelection,outputSelection,seenEvents);}},selectEverythingAsTask_(selection){const filterTask=new tr.b.Task();for(const container of this.model_.getDescendantEventContainers()){filterTask.subTask(()=>{for(const event of container.childEvents()){addEventTreeToSelection(selection,event);}},this);}
-return filterTask;},ready(){return new Promise(function(resolve,reject){const graph=this.createFilterTaskGraph_();graph.lastTask=graph.lastTask.after(function(){resolve(this.selection_);},this);tr.b.Task.RunWhenIdle(graph.rootTask);}.bind(this));},get selection(){if(this.selection_===undefined){const graph=this.createFilterTaskGraph_();tr.b.Task.RunSynchronously(graph.rootTask);}
-return this.selection_;}};tr.c.ScriptingObjectRegistry.register(new TQuery(),{name:'$t'});return{TQuery,};});'use strict';Polymer({is:'tr-ui-scripting-control',isEnterKey_(event){return event.keyCode!==229&&(event.key==='Enter'||event.keyIdentifier==='Enter');},setFocus_(focused){const promptEl=this.$.prompt;if(focused){promptEl.focus();Polymer.dom(this.$.root).classList.add('focused');if(promptEl.value.length>0){const sel=window.getSelection();sel.collapse(Polymer.dom(promptEl).firstChild,promptEl.value.length);}}else{promptEl.blur();Polymer.dom(this.$.root).classList.remove('focused');const parent=promptEl.parentElement;const nextEl=Polymer.dom(promptEl).nextSibling;promptEl.remove();Polymer.dom(parent).insertBefore(promptEl,nextEl);}},onConsoleFocus(e){e.stopPropagation();this.setFocus_(true);},onConsoleBlur(e){e.stopPropagation();this.setFocus_(false);},promptKeyDown(e){e.stopPropagation();if(!this.isEnterKey_(e))return;e.preventDefault();const promptEl=this.$.prompt;const command=promptEl.value;if(command.length===0)return;promptEl.value='';this.addLine_(String.fromCharCode(187)+' '+command);let result;try{result=this.controller_.executeCommand(command);}catch(e){result=e.stack||e.stackTrace;}
-if(result instanceof tr.e.tquery.TQuery){result.ready().then(function(selection){this.addLine_(selection.length+' matches');this.controller_.brushingStateController.showScriptControlSelection(selection);}.bind(this));}else{this.addLine_(result);}
-promptEl.scrollIntoView();},addLine_(line){const historyEl=this.$.history;if(historyEl.innerText.length!==0){historyEl.innerText+='\n';}
-historyEl.innerText+=line;},promptKeyPress(e){e.stopPropagation();},toggleVisibility(){const root=this.$.root;if(!this.visible){Polymer.dom(root).classList.remove('hidden');this.setFocus_(true);}else{Polymer.dom(root).classList.add('hidden');this.setFocus_(false);}},get hasFocus(){return this===document.activeElement;},get visible(){const root=this.$.root;return!Polymer.dom(root).classList.contains('hidden');},get controller(){return this.controller_;},set controller(c){this.controller_=c;}});'use strict';Polymer({is:'tr-ui-side-panel-container',ready(){this.activePanelContainer_=this.$.active_panel_container;this.tabStrip_=this.$.tab_strip;this.dragHandle_=this.$.side_panel_drag_handle;this.dragHandle_.horizontal=false;this.dragHandle_.target=this.activePanelContainer_;this.rangeOfInterest_=new tr.b.math.Range();this.brushingStateController_=undefined;this.onSelectionChanged_=this.onSelectionChanged_.bind(this);this.onModelChanged_=this.onModelChanged_.bind(this);},get brushingStateController(){return this.brushingStateController_;},set brushingStateController(brushingStateController){if(this.brushingStateController){this.brushingStateController_.removeEventListener('change',this.onSelectionChanged_);this.brushingStateController_.removeEventListener('model-changed',this.onModelChanged_);}
-this.brushingStateController_=brushingStateController;if(this.brushingStateController){this.brushingStateController_.addEventListener('change',this.onSelectionChanged_);this.brushingStateController_.addEventListener('model-changed',this.onModelChanged_);if(this.model){this.onModelChanged_();}}},onSelectionChanged_(){if(this.activePanel){this.activePanel.selection=this.selection;}},get model(){return this.brushingStateController_.model;},onModelChanged_(){this.activePanelType_=undefined;this.updateContents_();},get expanded(){this.hasAttribute('expanded');},get activePanel(){return this.activePanelContainer_.children[0];},get activePanelType(){return this.activePanelType_;},set activePanelType(panelType){if(this.model===undefined){throw new Error('Cannot activate panel without a model');}
-let panel=undefined;if(panelType){panel=document.createElement(panelType);}
-if(panel!==undefined&&!panel.supportsModel(this.model)){throw new Error('Cannot activate panel: does not support this model');}
-if(this.activePanelType){Polymer.dom(this.getLabelElementForPanelType_(this.activePanelType)).removeAttribute('selected');}
-if(this.activePanelType){this.getLabelElementForPanelType_(this.activePanelType).removeAttribute('selected');}
-if(this.activePanel){this.activePanelContainer_.removeChild(this.activePanel);}
-if(panelType===undefined){Polymer.dom(this).removeAttribute('expanded');this.activePanelType_=undefined;return;}
-Polymer.dom(this.getLabelElementForPanelType_(panelType)).setAttribute('selected',true);Polymer.dom(this).setAttribute('expanded',true);Polymer.dom(this.activePanelContainer_).appendChild(panel);panel.rangeOfInterest=this.rangeOfInterest_;panel.selection=this.selection_;panel.model=this.model;this.activePanelType_=panelType;},getPanelTypeForConstructor_(constructor){for(let i=0;i<this.tabStrip_.children.length;i++){if(this.tabStrip_.children[i].panelType.constructor===constructor){return this.tabStrip_.children[i].panelType;}}},getLabelElementForPanelType_(panelType){for(let i=0;i<this.tabStrip_.children.length;i++){if(this.tabStrip_.children[i].panelType===panelType){return this.tabStrip_.children[i];}}
-return undefined;},updateContents_(){const previouslyActivePanelType=this.activePanelType;Polymer.dom(this.tabStrip_).textContent='';const supportedPanelTypes=[];const panelTypeInfos=tr.ui.side_panel.SidePanelRegistry.getAllRegisteredTypeInfos();const unsupportedLabelEls=[];for(const panelTypeInfo of panelTypeInfos){const labelEl=document.createElement('tab-strip-label');const panel=panelTypeInfo.constructor();const panelType=panel.tagName;Polymer.dom(labelEl).textContent=panel.textLabel;labelEl.panelType=panelType;const supported=panel.supportsModel(this.model);if(this.model&&supported.supported){supportedPanelTypes.push(panelType);Polymer.dom(labelEl).setAttribute('enabled',true);labelEl.addEventListener('click',function(panelType){this.activePanelType=this.activePanelType===panelType?undefined:panelType;}.bind(this,panelType));Polymer.dom(this.tabStrip_).appendChild(labelEl);}else{if(this.activePanel){this.activePanelContainer_.removeChild(this.activePanel);}
-this.removeAttribute('expanded');unsupportedLabelEls.push(labelEl);}}
-for(const labelEl of unsupportedLabelEls){Polymer.dom(this.tabStrip_).appendChild(labelEl);}
-if(previouslyActivePanelType&&supportedPanelTypes.includes(previouslyActivePanelType)){this.activePanelType=previouslyActivePanelType;Polymer.dom(this).setAttribute('expanded',true);}else{if(this.activePanel){Polymer.dom(this.activePanelContainer_).removeChild(this.activePanel);}
-Polymer.dom(this).removeAttribute('expanded');}},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(range){if(range===undefined){throw new Error('Must not be undefined');}
-this.rangeOfInterest_=range;if(this.activePanel){this.activePanel.rangeOfInterest=range;}}});'use strict';Polymer({is:'tr-ui-timeline-view-help-overlay',ready(){const mod=tr.isMac?'cmd ':'ctrl';const spans=Polymer.dom(this.root).querySelectorAll('span.mod');for(let i=0;i<spans.length;i++){Polymer.dom(spans[i]).textContent=mod;}}});'use strict';Polymer({is:'tr-ui-timeline-view-metadata-overlay',created(){this.metadata_=undefined;},ready(){this.$.table.tableColumns=[{title:'name',value:d=>d.name,},{title:'value',value:d=>{const gov=document.createElement('tr-ui-a-generic-object-view');gov.object=d.value;return gov;},}];},get metadata(){return this.metadata_;},set metadata(metadata){this.metadata_=metadata;this.$.table.tableRows=this.metadata_;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-v-ui-preferred-display-unit',ready(){this.preferredTimeDisplayMode_=undefined;},attached(){tr.b.Unit.didPreferredTimeDisplayUnitChange();},detached(){tr.b.Unit.didPreferredTimeDisplayUnitChange();},get preferredTimeDisplayMode(){return this.preferredTimeDisplayMode_;},set preferredTimeDisplayMode(v){if(this.preferredTimeDisplayMode_===v)return;this.preferredTimeDisplayMode_=v;tr.b.Unit.didPreferredTimeDisplayUnitChange();}});'use strict';const POLYFILL_WARNING_MESSAGE='Trace Viewer is running with WebComponentsV0 polyfill, and some '+'features may be broken. See crbug.com/1036492.';Polymer({is:'tr-ui-timeline-view',created(){this.trackViewContainer_=undefined;this.queuedModel_=undefined;this.builtPromise_=undefined;this.doneBuilding_=undefined;},attached(){this.async(function(){this.trackViewContainer_=Polymer.dom(this).querySelector('#track_view_container');if(!this.trackViewContainer_){throw new Error('missing trackviewContainer');}
-if(this.queuedModel_)this.updateContents_();});},ready(){this.tabIndex=0;this.polyfillWarnedOnce_=false;this.titleEl_=this.$.title;this.leftControlsEl_=this.$.left_controls;this.rightControlsEl_=this.$.right_controls;this.collapsingControlsEl_=this.$.collapsing_controls;this.sidePanelContainer_=this.$.side_panel_container;this.brushingStateController_=new tr.c.BrushingStateController(this);this.findCtl_=this.$.view_find_control;this.findCtl_.controller=new tr.ui.FindController(this.brushingStateController_);this.scriptingCtl_=document.createElement('tr-ui-scripting-control');this.scriptingCtl_.controller=new tr.c.ScriptingController(this.brushingStateController_);this.sidePanelContainer_.brushingStateController=this.brushingStateController_;if(window.tr.metrics&&window.tr.metrics.sh&&window.tr.metrics.sh.SystemHealthMetric){this.railScoreSpan_=document.createElement('tr-metrics-ui-sh-system-health-span');Polymer.dom(this.rightControls).appendChild(this.railScoreSpan_);}else{this.railScoreSpan_=undefined;}
-this.flowEventFilter_=this.$.flow_event_filter_dropdown;this.processFilter_=this.$.process_filter_dropdown;this.optionsDropdown_=this.$.view_options_dropdown;this.selectedFlowEvents_=new Set();this.highlightVSync_=false;this.highlightVSyncCheckbox_=tr.ui.b.createCheckBox(this,'highlightVSync','tr.ui.TimelineView.highlightVSync',false,'Highlight VSync');Polymer.dom(this.optionsDropdown_).appendChild(this.highlightVSyncCheckbox_);this.initMetadataButton_();this.initConsoleButton_();this.initHelpButton_();Polymer.dom(this.collapsingControls).appendChild(this.scriptingCtl_);this.dragEl_=this.$.drag_handle;this.analysisEl_=this.$.analysis;this.analysisEl_.brushingStateController=this.brushingStateController_;this.addEventListener('requestSelectionChange',function(e){const sc=this.brushingStateController_;sc.changeSelectionFromRequestSelectionChangeEvent(e.selection);}.bind(this));this.onViewportChanged_=this.onViewportChanged_.bind(this);this.bindKeyListeners_();this.dragEl_.target=this.analysisEl_;},get globalMode(){return this.hotkeyController.globalMode;},set globalMode(globalMode){globalMode=!!globalMode;this.brushingStateController_.historyEnabled=globalMode;this.hotkeyController.globalMode=globalMode;},get hotkeyController(){return this.$.hkc;},warnPolyfill(){if(this.polyfillWarnedOnce_)return;console.warn(POLYFILL_WARNING_MESSAGE);this.polyfillWarnedOnce_=true;},updateDocumentFavicon(){let hue;if(!this.model){hue='blue';}else{hue=this.model.faviconHue;}
-let faviconData=tr.ui.b.FaviconsByHue[hue];if(faviconData===undefined){faviconData=tr.ui.b.FaviconsByHue.blue;}
-let link=Polymer.dom(document.head).querySelector('link[rel="shortcut icon"]');if(!link){link=document.createElement('link');link.rel='shortcut icon';Polymer.dom(document.head).appendChild(link);}
-link.href=faviconData;},get selectedFlowEvents(){return this.selectedFlowEvents_;},set selectedFlowEvents(selectedFlowEvents){this.selectedFlowEvents_=selectedFlowEvents;},get highlightVSync(){return this.highlightVSync_;},set highlightVSync(highlightVSync){this.highlightVSync_=highlightVSync;if(!this.trackView_)return;this.trackView_.viewport.highlightVSync=highlightVSync;},initHelpButton_(){const helpButtonEl=this.$.view_help_button;const dlg=new tr.ui.b.Overlay();dlg.title='Chrome Tracing Help';dlg.visible=false;dlg.appendChild(document.createElement('tr-ui-timeline-view-help-overlay'));function onClick(e){dlg.visible=!dlg.visible;e.stopPropagation();}
-helpButtonEl.addEventListener('click',onClick.bind(this));},initConsoleButton_(){const toggleEl=this.$.view_console_button;function onClick(e){this.scriptingCtl_.toggleVisibility();e.stopPropagation();return false;}
-toggleEl.addEventListener('click',onClick.bind(this));},initMetadataButton_(){const showEl=this.$.view_metadata_button;function onClick(e){const dlg=new tr.ui.b.Overlay();dlg.title='Metadata for trace';const metadataOverlay=document.createElement('tr-ui-timeline-view-metadata-overlay');metadataOverlay.metadata=this.model.metadata;Polymer.dom(dlg).appendChild(metadataOverlay);dlg.visible=true;e.stopPropagation();return false;}
-showEl.addEventListener('click',onClick.bind(this));this.updateMetadataButtonVisibility_();},updateMetadataButtonVisibility_(){const showEl=this.$.view_metadata_button;showEl.style.display=(this.model&&this.model.metadata.length)?'':'none';},updateFlowEventList_(){const dropdown=Polymer.dom(this.flowEventFilter_);while(dropdown.firstChild){dropdown.removeChild(dropdown.firstChild);}
-if(!this.model)return;const cboxes=[];const updateAll=(checked)=>{for(const cbox of cboxes){cbox.checked=checked;}};dropdown.appendChild(tr.ui.b.createButton('All',()=>updateAll(true)));dropdown.appendChild(tr.ui.b.createButton('None',()=>updateAll(false)));const categories=new Set();for(const event of this.model.flowEvents){for(const category of tr.b.getCategoryParts(event.category)){categories.add(category);}}
-const sortedCategories=[...categories].sort((a,b)=>a.localeCompare(b,'en',{sensitivity:'base'}));for(const category of sortedCategories){const cbox=tr.ui.b.createCheckBox(undefined,undefined,'tr.ui.TimelineView.selectedFlowEvents.'+category,false,category,()=>{if(cbox.checked){this.selectedFlowEvents.add(category);}else{this.selectedFlowEvents.delete(category);}
-if(this.trackView_){this.trackView_.viewport.dispatchChangeEvent();}});if(cbox.checked){this.selectedFlowEvents.add(category);}
-cboxes.push(cbox);dropdown.appendChild(cbox);}},updateProcessList_(){const dropdown=Polymer.dom(this.processFilter_);while(dropdown.firstChild){dropdown.removeChild(dropdown.firstChild);}
-if(!this.model)return;const trackView=this.trackViewContainer_.querySelector('tr-ui-timeline-track-view');const processViews=trackView.processViews;const cboxes=[];const updateAll=(checked)=>{for(const cbox of cboxes){cbox.checked=checked;}};dropdown.appendChild(tr.ui.b.createButton('All',()=>updateAll(true)));dropdown.appendChild(tr.ui.b.createButton('None',()=>updateAll(false)));for(const view of processViews){const cbox=tr.ui.b.createCheckBox(undefined,undefined,undefined,true,view.processBase.userFriendlyName,()=>view.visible=cbox.checked);cbox.checked=view.visible;cboxes.push(cbox);view.addEventListener('visibility',()=>cbox.checked=view.visible);dropdown.appendChild(cbox);}},get leftControls(){return this.leftControlsEl_;},get rightControls(){return this.rightControlsEl_;},get collapsingControls(){return this.collapsingControlsEl_;},get viewTitle(){return Polymer.dom(this.titleEl_).textContent.substring(Polymer.dom(this.titleEl_).textContent.length-2);},set viewTitle(text){if(text===undefined){Polymer.dom(this.titleEl_).textContent='';this.titleEl_.hidden=true;return;}
-this.titleEl_.hidden=false;Polymer.dom(this.titleEl_).textContent=text;},get model(){if(this.trackView_){return this.trackView_.model;}
-return undefined;},set model(model){this.build(model);},async build(model){this.queuedModel_=model;this.builtPromise_=new Promise((resolve,reject)=>{this.doneBuilding_=resolve;});if(this.trackViewContainer_)await this.updateContents_();},get builtPromise(){return this.builtPromise_;},async updateContents_(){if(this.trackViewContainer_===undefined){throw new Error('timeline-view.updateContents_ requires trackViewContainer_');}
-const model=this.queuedModel_;this.queuedModel_=undefined;const modelInstanceChanged=model!==this.model;const modelValid=model&&!model.bounds.isEmpty;const importWarningsEl=Polymer.dom(this.root).querySelector('#import-warnings');Polymer.dom(importWarningsEl).textContent='';if(modelInstanceChanged){if(this.railScoreSpan_){this.railScoreSpan_.model=undefined;}
-Polymer.dom(this.trackViewContainer_).textContent='';if(this.trackView_){this.trackView_.viewport.removeEventListener('change',this.onViewportChanged_);this.trackView_.brushingStateController=undefined;this.trackView_.detach();this.trackView_=undefined;}
-this.brushingStateController_.modelWillChange();}
-if(modelValid&&!this.trackView_){this.trackView_=document.createElement('tr-ui-timeline-track-view');this.trackView_.timelineView=this;this.trackView.brushingStateController=this.brushingStateController_;Polymer.dom(this.trackViewContainer_).appendChild(this.trackView_);this.trackView_.viewport.addEventListener('change',this.onViewportChanged_);}
-if(modelValid){this.trackView_.model=model;this.trackView_.viewport.selectedFlowEvents=this.selectedFlowEvents;this.trackView_.viewport.highlightVSync=this.highlightVSync;if(this.railScoreSpan_){this.railScoreSpan_.model=model;}
-this.$.display_unit.preferredTimeDisplayMode=model.intrinsicTimeUnit;}
-if(window.CustomElements&&!window.CustomElements.hasNative){this.warnPolyfill();}
-if(model){for(const warning of model.importWarningsThatShouldBeShownToUser){importWarningsEl.addMessage(`Import Warning: ${warning.type}: ${warning.message}`,[{buttonText:'Dismiss',onClick(event,infobar){infobar.visible=false;}}]);}}
-if(modelInstanceChanged){this.updateFlowEventList_();this.updateProcessList_();this.updateMetadataButtonVisibility_();this.brushingStateController_.modelDidChange();this.onViewportChanged_();}
-this.doneBuilding_();},get brushingStateController(){return this.brushingStateController_;},get trackView(){return this.trackView_;},get settings(){if(!this.settings_){this.settings_=new tr.b.Settings();}
-return this.settings_;},set focusElement(value){throw new Error('This is deprecated. Please set globalMode to true.');},bindKeyListeners_(){const hkc=this.hotkeyController;hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'`'.charCodeAt(0),useCapture:true,thisArg:this,callback(e){this.scriptingCtl_.toggleVisibility();if(!this.scriptingCtl_.hasFocus){this.focus();}
-e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'/'.charCodeAt(0),useCapture:true,thisArg:this,callback(e){if(this.scriptingCtl_.hasFocus)return;if(this.findCtl_.hasFocus){this.focus();}else{this.findCtl_.focus();}
-e.preventDefault();e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'?'.charCodeAt(0),useCapture:false,thisArg:this,callback(e){this.$.view_help_button.click();e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'v'.charCodeAt(0),useCapture:false,thisArg:this,callback(e){this.toggleHighlightVSync_();e.stopPropagation();}}));},onViewportChanged_(e){const spc=this.sidePanelContainer_;if(!this.trackView_){spc.rangeOfInterest.reset();return;}
-const vr=this.trackView_.viewport.interestRange.asRangeObject();if(!spc.rangeOfInterest.equals(vr)){spc.rangeOfInterest=vr;}
-if(this.railScoreSpan_&&this.model){this.railScoreSpan_.model=this.model;}},toggleHighlightVSync_(){this.highlightVSyncCheckbox_.checked=!this.highlightVSyncCheckbox_.checked;},setFindCtlText(string){this.findCtl_.setText(string);}});'use strict';tr.exportTo('tr.ui.b',function(){function Row(title,data,groupingKeyFuncs,rowStatsConstructor){this.title=title;this.data_=data;if(groupingKeyFuncs===undefined){groupingKeyFuncs=[];}
-this.groupingKeyFuncs_=groupingKeyFuncs;this.rowStatsConstructor_=rowStatsConstructor;this.subRowsBuilt_=false;this.subRows_=undefined;this.rowStats_=undefined;}
-Row.prototype={getCurrentGroupingKeyFunc_(){if(this.groupingKeyFuncs_.length===0)return undefined;return this.groupingKeyFuncs_[0];},get data(){return this.data_;},get rowStats(){if(this.rowStats_===undefined){this.rowStats_=new this.rowStatsConstructor_(this);}
-return this.rowStats_;},rebuildSubRowsIfNeeded_(){if(this.subRowsBuilt_)return;this.subRowsBuilt_=true;const groupingKeyFunc=this.getCurrentGroupingKeyFunc_();if(groupingKeyFunc===undefined){this.subRows_=undefined;return;}
-const dataByKey={};let hasValues=false;this.data_.forEach(function(datum){const key=groupingKeyFunc(datum);hasValues=hasValues||(key!==undefined);if(dataByKey[key]===undefined){dataByKey[key]=[];}
-dataByKey[key].push(datum);});if(!hasValues){this.subRows_=undefined;return;}
-this.subRows_=[];for(const key in dataByKey){const row=new Row(key,dataByKey[key],this.groupingKeyFuncs_.slice(1),this.rowStatsConstructor_);this.subRows_.push(row);}},get isExpanded(){return(this.subRows&&(this.subRows.length>0)&&(this.subRows.length<5));},get subRows(){this.rebuildSubRowsIfNeeded_();return this.subRows_;}};Polymer({is:'tr-ui-b-grouping-table',created(){this.dataToGroup_=undefined;this.groupBy_=undefined;this.rowStatsConstructor_=undefined;},get tableColumns(){return this.$.table.tableColumns;},set tableColumns(tableColumns){this.$.table.tableColumns=tableColumns;},get tableRows(){return this.$.table.tableRows;},get sortColumnIndex(){return this.$.table.sortColumnIndex;},set sortColumnIndex(sortColumnIndex){this.$.table.sortColumnIndex=sortColumnIndex;},get sortDescending(){return this.$.table.sortDescending;},set sortDescending(sortDescending){this.$.table.sortDescending=sortDescending;},get selectionMode(){return this.$.table.selectionMode;},set selectionMode(selectionMode){this.$.table.selectionMode=selectionMode;},get rowHighlightStyle(){return this.$.table.rowHighlightStyle;},set rowHighlightStyle(rowHighlightStyle){this.$.table.rowHighlightStyle=rowHighlightStyle;},get cellHighlightStyle(){return this.$.table.cellHighlightStyle;},set cellHighlightStyle(cellHighlightStyle){this.$.table.cellHighlightStyle=cellHighlightStyle;},get selectedColumnIndex(){return this.$.table.selectedColumnIndex;},set selectedColumnIndex(selectedColumnIndex){this.$.table.selectedColumnIndex=selectedColumnIndex;},get selectedTableRow(){return this.$.table.selectedTableRow;},set selectedTableRow(selectedTableRow){this.$.table.selectedTableRow=selectedTableRow;},get groupBy(){return this.groupBy_;},set groupBy(groupBy){this.groupBy_=groupBy;this.updateContents_();},get dataToGroup(){return this.dataToGroup_;},set dataToGroup(dataToGroup){this.dataToGroup_=dataToGroup;this.updateContents_();},get rowStatsConstructor(){return this.rowStatsConstructor_;},set rowStatsConstructor(rowStatsConstructor){this.rowStatsConstructor_=rowStatsConstructor;this.updateContents_();},rebuild(){this.$.table.rebuild();},updateContents_(){const groupBy=this.groupBy_||[];const dataToGroup=this.dataToGroup_||[];const rowStatsConstructor=this.rowStatsConstructor_||function(){};const superRow=new Row('',dataToGroup,groupBy,rowStatsConstructor);this.$.table.tableRows=superRow.subRows||[];}});return{};});'use strict';tr.exportTo('tr.ui.b',function(){const THIS_DOC=document.currentScript.ownerDocument;Polymer({is:'tr-ui-b-grouping-table-groupby-picker-group',created(){this.picker_=undefined;this.group_=undefined;},get picker(){return this.picker_;},set picker(picker){this.picker_=picker;},get group(){return this.group_;},set group(g){this.group_=g;this.$.label.textContent=g.label;},get enabled(){return this.$.enabled.checked;},set enabled(enabled){this.$.enabled.checked=enabled;if(!this.enabled){this.$.left.style.display='none';this.$.right.style.display='none';}},set isFirst(isFirst){this.$.left.style.display=(!this.enabled||isFirst)?'none':'inline';},set isLast(isLast){this.$.right.style.display=(!this.enabled||isLast)?'none':'inline';},moveLeft_(){this.picker.moveLeft_(this);},moveRight_(){this.picker.moveRight_(this);},onEnableChanged_(){if(!this.enabled){this.$.left.style.display='none';this.$.right.style.display='none';}
-this.picker.onEnableChanged_(this);}});Polymer({is:'tr-ui-b-grouping-table-groupby-picker',created(){this.settingsKey_=undefined;},get settingsKey(){return this.settingsKey_;},set settingsKey(settingsKey){this.settingsKey_=settingsKey;if(this.$.container.children.length){this.restoreSetting_();}},restoreSetting_(){if(this.settingsKey_===undefined)return;this.currentGroupKeys=tr.b.Settings.get(this.settingsKey_,this.currentGroupKeys);},get possibleGroups(){return Array.from(this.$.container.children).map(groupEl=>groupEl.group);},set possibleGroups(possibleGroups){Polymer.dom(this.$.container).textContent='';for(let i=0;i<possibleGroups.length;++i){const groupEl=document.createElement('tr-ui-b-grouping-table-groupby-picker-group');groupEl.picker=this;groupEl.group=possibleGroups[i];Polymer.dom(this.$.container).appendChild(groupEl);}
-this.restoreSetting_();this.updateFirstLast_();},updateFirstLast_(){const groupEls=Array.from(this.$.container.children);const enabledGroupEls=groupEls.filter(el=>el.enabled);for(let i=0;i<enabledGroupEls.length;++i){enabledGroupEls[i].isFirst=i===0;enabledGroupEls[i].isLast=i===enabledGroupEls.length-1;}},get currentGroupKeys(){return this.currentGroups.map(group=>group.key);},get currentGroups(){const groups=[];for(const groupEl of Array.from(this.$.container.children)){if(groupEl.enabled){groups.push(groupEl.group);}}
-return groups;},set currentGroupKeys(newKeys){if(!tr.b.compareArrays(this.currentGroupKeys,newKeys,(x,y)=>x.localeCompare(y))){return;}
-const possibleGroups=new Map();for(const group of this.possibleGroups){possibleGroups.set(group.key,group);}
-const groupEls=this.$.container.children;let i=0;for(i=0;i<newKeys.length;++i){const group=possibleGroups.get(newKeys[i]);if(group===undefined){newKeys.splice(i,1);--i;continue;}
-groupEls[i].group=group;groupEls[i].enabled=true;possibleGroups.delete(newKeys[i]);}
-for(const group of possibleGroups.values()){groupEls[i].group=group;groupEls[i].enabled=false;++i;}
-this.updateFirstLast_();this.onCurrentGroupsChanged_();},moveLeft_(groupEl){const reference=groupEl.previousSibling;Polymer.dom(this.$.container).removeChild(groupEl);Polymer.dom(this.$.container).insertBefore(groupEl,reference);this.updateFirstLast_();if(groupEl.enabled){this.onCurrentGroupsChanged_();}},moveRight_(groupEl){const reference=groupEl.nextSibling.nextSibling;Polymer.dom(this.$.container).removeChild(groupEl);if(reference){Polymer.dom(this.$.container).insertBefore(groupEl,reference);}else{Polymer.dom(this.$.container).appendChild(groupEl);}
-this.updateFirstLast_();if(groupEl.enabled){this.onCurrentGroupsChanged_();}},onCurrentGroupsChanged_(){this.dispatchEvent(new tr.b.Event('current-groups-changed'));tr.b.Settings.set(this.settingsKey_,this.currentGroupKeys);},onEnableChanged_(groupEl){this.updateFirstLast_();this.onCurrentGroupsChanged_();}});return{};});'use strict';(function(){Polymer({is:'tr-ui-sp-file-size-stats-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.model_=undefined;this.selection_=new tr.model.EventSet();this.$.picker.settingsKey='tr-ui-sp-file-size-stats-side-panel-picker';this.$.picker.possibleGroups=[{key:'phase',label:'Event Type',dataFn(eventStat){return eventStat.phase;}},{key:'category',label:'Category',dataFn(eventStat){return eventStat.category;}},{key:'title',label:'Title',dataFn(eventStat){return eventStat.title;}}];if(this.$.picker.currentGroupKeys.length===0){this.$.picker.currentGroupKeys=['phase','title'];}
-this.$.picker.addEventListener('current-groups-changed',this.updateContents_.bind(this));},get textLabel(){return'File Size Stats';},supportsModel(m){if(!m){return{supported:false,reason:'No stats were collected for this file.'};}
-if(m.stats.allTraceEventStats.length===0){return{supported:false,reason:'No stats were collected for this file.'};}
-return{supported:true};},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(rangeOfInterest){this.rangeOfInterest_=rangeOfInterest;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;},createColumns_(stats){const columns=[{title:'Title',value(row){const titleEl=document.createElement('span');Polymer.dom(titleEl).textContent=row.title;titleEl.style.textOverflow='ellipsis';return titleEl;},cmp(a,b){return a.title.localeCompare(b.title);},width:'400px'},{title:'Num Events',align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,value(row){return row.rowStats.numEvents;},cmp(a,b){return a.rowStats.numEvents-b.rowStats.numEvents;},width:'80px'}];if(stats&&stats.hasEventSizesinBytes){columns.push({title:'Bytes',value(row){const value=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes,row.rowStats.totalEventSizeinBytes);const spanEl=tr.v.ui.createScalarSpan(value);return spanEl;},cmp(a,b){return a.rowStats.totalEventSizeinBytes-
-b.rowStats.totalEventSizeinBytes;},width:'80px'});}
-return columns;},updateContents_(){const table=this.$.table;const columns=this.createColumns_(this.model.stats);table.rowStatsConstructor=function ModelStatsRowStats(row){const sum=tr.b.math.Statistics.sum(row.data,function(x){return x.numEvents;});const totalEventSizeinBytes=tr.b.math.Statistics.sum(row.data,x=>x.totalEventSizeinBytes);return{numEvents:sum,totalEventSizeinBytes};};table.tableColumns=columns;table.sortColumnIndex=1;table.sortDescending=true;table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;table.groupBy=this.$.picker.currentGroups.map(function(group){return group.dataFn;});if(!this.model){table.dataToGroup=[];}else{table.dataToGroup=this.model.stats.allTraceEventStats;}
-this.$.table.rebuild();}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-sp-file-size-stats-side-panel');});})();'use strict';tr.exportTo('tr.mre',function(){function Failure(job,functionHandleString,traceCanonicalUrl,failureTypeName,description,stack){this.job=job;this.functionHandleString=functionHandleString;this.traceCanonicalUrl=traceCanonicalUrl;this.failureTypeName=failureTypeName;this.description=description;this.stack=stack;}
-Failure.prototype={asDict(){return{function_handle_string:this.functionHandleString,trace_canonical_url:this.traceCanonicalUrl,type:this.failureTypeName,description:this.description,stack:this.stack};}};Failure.fromDict=function(failureDict){return new Failure(undefined,failureDict.function_handle_string,failureDict.trace_canonical_url,failureDict.type,failureDict.description,failureDict.stack);};return{Failure,};});'use strict';tr.exportTo('tr.mre',function(){const FunctionRegistry={allFunctions_:[],allFunctionsByName_:{},get allFunctions(){return this.allFunctions_;},get allFunctionsByName(){return this.allFunctionsByName_;}};FunctionRegistry.getFunction=function(name){return this.allFunctionsByName_[name];};FunctionRegistry.register=function(func){if(func.name===''){throw new Error('Registered functions must not be anonymous');}
-if(this.allFunctionsByName[func.name]!==undefined){throw new Error('Function named '+func.name+'is already registered.');}
-this.allFunctionsByName[func.name]=func;this.allFunctions.push(func);};function ModuleToLoad(href,filename){if((href!==undefined)?(filename!==undefined):(filename===undefined)){throw new Error('ModuleToLoad must specify exactly one of href or '+'filename');}
-this.href=href;this.filename=filename;}
-ModuleToLoad.prototype={asDict(){if(this.href!==undefined){return{'href':this.href};}
-return{'filename':this.filename};},toString(){if(this.href!==undefined){return'ModuleToLoad(href="'+this.href+'")';}
-return'ModuleToLoad(filename="'+this.filename+'")';}};ModuleToLoad.fromDict=function(moduleDict){return new ModuleToLoad(moduleDict.href,moduleDict.filename);};function FunctionHandle(modulesToLoad,functionName,opt_options){if(!(modulesToLoad instanceof Array)){throw new Error('modulesToLoad in FunctionHandle must be an array');}
-if(typeof(functionName)!=='string'){throw new Error('functionName in FunctionHandle must be a string');}
-this.modulesToLoad=modulesToLoad;this.functionName=functionName;this.options_=opt_options;}
-FunctionHandle.prototype={get options(){return this.options_;},asDict(){return{'modules_to_load':this.modulesToLoad.map(function(m){return m.asDict();}),'function_name':this.functionName,'options':this.options_};},asUserFriendlyString(){const parts=this.modulesToLoad.map(mtl=>mtl.filename);parts.push(this.functionName);parts.push(JSON.stringify(this.options_));return parts.join(',');},hasHrefs(){for(const module in this.modulesToLoad){if(this.modulesToLoad[module].href!==undefined){return true;}}
-return false;},load(){if(this.hasHrefs()){const err=new Error('FunctionHandle named '+this.functionName+' specifies hrefs, which cannot be loaded.');err.name='FunctionLoadingError';throw err;}
-for(const module in this.modulesToLoad){const filename=this.modulesToLoad[module].filename;try{HTMLImportsLoader.loadHTMLFile(filename);}catch(err){err.name='FunctionLoadingError';throw err;}}
-const func=FunctionRegistry.getFunction(this.functionName);if(func===undefined){const err=new Error('No registered function named '+this.functionName);err.name='FunctionNotDefinedError';throw err;}
-return func;},toString(){const modulesToLoadStr=this.modulesToLoad.map(function(module){return module.toString();});return'FunctionHandle(modulesToLoad=['+modulesToLoadStr+'], '+'functionName="'+this.functionName+'", options="'+
-JSON.stringify(this.options_)+'")';}};FunctionHandle.loadFromFilename_=function(filename){try{const numFunctionsBefore=FunctionRegistry.allFunctions.length;HTMLImportsLoader.loadHTMLFile(filename);}catch(err){err.name='FunctionLoadingError';throw err;}
-const numFunctionsNow=FunctionRegistry.allFunctions.length;if(numFunctionsNow!==(numFunctionsBefore+1)){const err=new Error(filename+' didn\'t call FunctionRegistry.register');err.name='FunctionNotDefinedError';throw err;}
-return FunctionRegistry.allFunctions[numFunctionsNow-1];};FunctionHandle.fromDict=function(handleDict){const options=handleDict.options;let modulesToLoad;if(handleDict.modules_to_load!==undefined){modulesToLoad=handleDict.modules_to_load.map(function(module){return ModuleToLoad.fromDict(module);});}
-return new FunctionHandle(modulesToLoad,handleDict.function_name,options);};return{FunctionHandle,ModuleToLoad,FunctionRegistry,};});'use strict';tr.exportTo('tr.metrics',function(){function runMetrics(model,options,addFailureCb){if(options===undefined){throw new Error('Options are required.');}
-const metricNames=options.metrics;if(!metricNames){throw new Error('Metric names should be specified.');}
-const allMetricsStart=new Date();const durationBreakdown=new tr.v.d.Breakdown();const categories=getTraceCategories(model);const histograms=new tr.v.HistogramSet();histograms.createHistogram('trace_import_duration',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,model.stats.traceImportDurationMs,{binBoundaries:tr.v.HistogramBinBoundaries.createExponential(1e-3,1e5,30),description:'Duration that trace viewer required to import the trace',summaryOptions:tr.v.Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS,});for(const metricName of metricNames){const metricStart=new Date();const metric=tr.metrics.MetricRegistry.findTypeInfoWithName(metricName);if(metric===undefined){throw new Error(`"${metricName}" is not a registered metric.`);}
-validateTraceCategories(metric.metadata.requiredCategories,categories);try{metric.constructor(histograms,model,options);}catch(e){const err=tr.b.normalizeException(e);addFailureCb(new tr.mre.Failure(undefined,'metricMapFunction',model.canonicalUrl,err.typeName,err.message,err.stack));}
-const metricMs=new Date()-metricStart;histograms.createHistogram(metricName+'_duration',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[metricMs]);durationBreakdown.set(metricName,metricMs);}
-validateDiagnosticNames(histograms);const allMetricsMs=new Date()-allMetricsStart+
-model.stats.traceImportDurationMs;durationBreakdown.set('traceImport',model.stats.traceImportDurationMs);durationBreakdown.set('other',allMetricsMs-tr.b.math.Statistics.sum(durationBreakdown,([metricName,metricMs])=>metricMs));const breakdownNames=tr.v.d.RelatedNameMap.fromEntries(new Map(metricNames.map(metricName=>[metricName,metricName+'_duration'])));breakdownNames.set('traceImport','trace_import_duration');histograms.createHistogram('metrics_duration',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,[{value:allMetricsMs,diagnostics:{breakdown:durationBreakdown},},],{diagnostics:{breakdown:breakdownNames},});return histograms;}
-function getTraceCategories(model){for(const metadata of model.metadata){let config;if(metadata.name==='TraceConfig'&&metadata.value){config=metadata.value;}
-if(metadata.name==='metadata'&&metadata.value&&metadata.value['trace-config']&&metadata.value['trace-config']!=='__stripped__'){config=JSON.parse(metadata.value['trace-config']);}
-if(config){return{excluded:config.excluded_categories||[],included:config.included_categories||[],};}}}
-function validateTraceCategories(requiredCategories,categories){if(!requiredCategories)return;if(!categories)throw new Error('Missing trace config metadata');for(const cat of requiredCategories){const isDisabledByDefault=(cat.indexOf('disabled-by-default')===0);let missing=false;if(isDisabledByDefault){if(!categories.included.includes(cat)){missing=true;}}else if(categories.excluded.includes(cat)){missing=true;}
-if(missing){throw new Error(`Trace is missing required category "${cat}"`);}}}
-function validateDiagnosticNames(histograms){for(const hist of histograms){for(const name of hist.diagnostics.keys()){if(name===tr.v.d.RESERVED_NAMES.ALERT_GROUPING){continue;}
-if(tr.v.d.RESERVED_NAMES_SET.has(name)){throw new Error(`Illegal diagnostic name "${name}" on Histogram "${hist.name}"`);}}}}
-function addTelemetryInfo(histograms,model){for(const metadata of model.metadata){if(!metadata.value||!metadata.value.telemetry)continue;for(const[name,value]of Object.entries(metadata.value.telemetry)){const type=tr.v.d.RESERVED_NAMES_TO_TYPES.get(name);if(type===undefined){throw new Error(`Unexpected telemetry.${name}`);}
-histograms.addSharedDiagnosticToAllHistograms(name,new type(value));}}}
-function metricMapFunction(result,model,options){const histograms=runMetrics(model,options,result.addFailure.bind(result));addTelemetryInfo(histograms,model);if(model.canonicalUrl!==undefined){const info=tr.v.d.RESERVED_INFOS.TRACE_URLS;histograms.addSharedDiagnosticToAllHistograms(info.name,new info.type([model.canonicalUrl]));}
-result.addPair('histograms',histograms.asDicts());const scalarDicts=[];for(const value of histograms){for(const[statName,scalar]of value.statisticsScalars){scalarDicts.push({name:value.name+'_'+statName,numeric:scalar.asDict(),description:value.description,});}}
-result.addPair('scalars',scalarDicts);}
-tr.mre.FunctionRegistry.register(metricMapFunction);return{metricMapFunction,runMetrics,};});'use strict';tr.exportTo('tr.mre',function(){class MreResult{constructor(failures,pairs){if(failures===undefined){failures=[];}
-if(pairs===undefined){pairs={};}
-this.failures=failures;this.pairs=pairs;}
-addFailure(failure){this.failures.push(failure);}
-addPair(key,value){if(key in this.pairs){throw new Error('Key '+key+' already exists in result.');}
-this.pairs[key]=value;}
-asDict(){const d={pairs:this.pairs};if(this.failures){d.failures=this.failures.map(function(f){return f.asDict();});}
-return d;}
-hadFailures(){return this.failures.length>0;}
-static fromDict(resultDict){const failures=(resultDict.failures!==undefined)?resultDict.failures.map(tr.mre.Failure.fromDict):undefined;const pairs=resultDict.pairs;return new MreResult(failures,pairs);}}
-return{MreResult,};});'use strict';tr.exportTo('tr.ui',function(){class NullBrushingStateController extends tr.c.BrushingStateController{constructor(){super(undefined);this.parentController=undefined;}
-dispatchChangeEvent_(){if(this.parentController)this.parentController.dispatchChangeEvent_();}
-get model(){if(!this.parentController)return undefined;return this.parentController.model;}
-get trackView(){if(!this.parentController)return undefined;return this.parentController.trackView;}
-get viewport(){if(!this.parentController)return undefined;return this.parentController.viewport;}
-get historyEnabled(){if(!this.parentController)return undefined;return this.parentController.historyEnabled;}
-set historyEnabled(historyEnabled){if(this.parentController){this.parentController.historyEnabled=historyEnabled;}}
-modelWillChange(){if(this.parentController)this.parentController.modelWillChange();}
-modelDidChange(){if(this.parentController)this.parentController.modelDidChange();}
-onUserInitiatedSelectionChange_(){if(this.parentController){this.parentController.onUserInitiatedSelectionChange_();}}
-onPopState_(e){if(this.parentController)this.parentController.onPopState_(e);}
-get selection(){if(!this.parentController)return undefined;return this.parentController.selection;}
-get findMatches(){if(!this.parentController)return undefined;return this.parentController.findMatches;}
-get selectionOfInterest(){if(!this.parentController)return undefined;return this.parentController.selectionOfInterest;}
-get currentBrushingState(){if(!this.parentController)return undefined;return this.parentController.currentBrushingState;}
-set currentBrushingState(newBrushingState){if(this.parentController){this.parentController.currentBrushingState=newBrushingState;}}
-addAllEventsMatchingFilterToSelectionAsTask(filter,selection){if(this.parentController){this.parentController.addAllEventsMatchingFilterToSelectionAsTask(filter,selection);}}
-findTextChangedTo(allPossibleMatches){if(this.parentController){this.parentController.findTextChangedTo(allPossibleMatches);}}
-findFocusChangedTo(currentFocus){if(this.parentController){this.parentController.findFocusChangedTo(currentFocus);}}
-findTextCleared(){if(this.parentController){this.parentController.findTextCleared();}}
-uiStateFromString(string){if(this.parentController){this.parentController.uiStateFromString(string);}}
-navToPosition(uiState,showNavLine){if(this.parentController){this.parentController.navToPosition(uiState,showNavLine);}}
-changeSelectionFromTimeline(selection){if(this.parentController){this.parentController.changeSelectionFromTimeline(selection);}}
-showScriptControlSelection(selection){if(this.parentController){this.parentController.showScriptControlSelection(selection);}}
-changeSelectionFromRequestSelectionChangeEvent(selection){if(this.parentController){this.parentController.changeSelectionFromRequestSelectionChangeEvent(selection);}}
-changeAnalysisViewRelatedEvents(eventSet){if(this.parentController&&(eventSet instanceof tr.model.EventSet)){this.parentController.changeAnalysisViewRelatedEvents(eventSet);}}
-changeAnalysisLinkHoveredEvents(eventSet){if(this.parentController&&(eventSet instanceof tr.model.EventSet)){this.parentController.changeAnalysisLinkHoveredEvents(eventSet);}}
-getViewSpecificBrushingState(viewId){if(this.parentController){this.parentController.getViewSpecificBrushingState(viewId);}}
-changeViewSpecificBrushingState(viewId,newState){if(this.parentController){this.parentController.changeViewSpecificBrushingState(viewId,newState);}}}
-return{NullBrushingStateController,};});'use strict';tr.exportTo('tr.v',function(){const IGNORE_GROUPING_KEYS=['name','storyTags','testPath',];class CSVBuilder{constructor(histograms){this.histograms_=histograms;this.table_=[];this.statisticsNames_=new Set();this.groupings_=[];}
-build(){this.prepare_();this.buildHeader_();this.buildTable_();}
-prepare_(){for(const[key,grouping]of tr.v.HistogramGrouping.BY_KEY){if(IGNORE_GROUPING_KEYS.includes(key))continue;this.groupings_.push(grouping);}
-this.groupings_.push(new tr.v.GenericSetGrouping(tr.v.d.RESERVED_NAMES.TRACE_URLS));this.groupings_.sort((a,b)=>a.key.localeCompare(b.key));for(const hist of this.histograms_){for(const name of hist.statisticsNames){this.statisticsNames_.add(name);}}
-this.statisticsNames_=Array.from(this.statisticsNames_);this.statisticsNames_.sort();}
-buildHeader_(){const header=['name','unit'];for(const name of this.statisticsNames_){header.push(name);}
-for(const grouping of this.groupings_){header.push(grouping.key);}
-this.table_.push(header);}
-buildTable_(){for(const hist of this.histograms_){const row=[hist.name,hist.unit.unitString];this.table_.push(row);for(const name of this.statisticsNames_){const stat=hist.getStatisticScalar(name);if(stat){row.push(stat.value);}else{row.push('');}}
-for(const grouping of this.groupings_){row.push(grouping.callback(hist));}}}
-toString(){let str='';for(const row of this.table_){for(let i=0;i<row.length;++i){if(i>0){str+=',';}
-let cell=''+row[i];cell=cell.replace(/\n/g,' ');if(cell.indexOf(',')>=0||cell.indexOf('"')>=0){cell='"'+cell.replace(/"/g,'""')+'"';}
-str+=cell;}
-str+='\n';}
-return str;}}
-return{CSVBuilder,};});'use strict';tr.exportTo('tr.v',function(){const getDisplayLabel=tr.v.HistogramGrouping.DISPLAY_LABEL.callback;const DEFAULT_POSSIBLE_GROUPS=[];const EXCLUDED_GROUPING_KEYS=[tr.v.HistogramGrouping.DISPLAY_LABEL.key,];for(const group of tr.v.HistogramGrouping.BY_KEY.values()){if(EXCLUDED_GROUPING_KEYS.includes(group.key))continue;DEFAULT_POSSIBLE_GROUPS.push(group);}
-class HistogramParameterCollector{constructor(){this.statisticNames_=new Set(['avg']);this.labelsToStartTimes_=new Map();this.keysToGroupings_=new Map(DEFAULT_POSSIBLE_GROUPS.map(g=>[g.key,g]));this.keysToValues_=new Map(DEFAULT_POSSIBLE_GROUPS.map(g=>[g.key,new Set()]));this.keysToValues_.delete(tr.v.HistogramGrouping.HISTOGRAM_NAME.key);}
-process(histograms){const allStoryTags=new Set();let maxSampleCount=0;for(const hist of histograms){maxSampleCount=Math.max(maxSampleCount,hist.numValues);for(const statName of hist.statisticsNames){this.statisticNames_.add(statName);}
-let startTime=hist.diagnostics.get(tr.v.d.RESERVED_NAMES.BENCHMARK_START);if(startTime!==undefined)startTime=startTime.minDate.getTime();const displayLabel=getDisplayLabel(hist);if(this.labelsToStartTimes_.has(displayLabel)){startTime=Math.min(startTime,this.labelsToStartTimes_.get(displayLabel));}
-this.labelsToStartTimes_.set(displayLabel,startTime);for(const[groupingKey,values]of this.keysToValues_){const grouping=this.keysToGroupings_.get(groupingKey);const value=grouping.callback(hist);if(!value)continue;values.add(value);if(values.size>1){this.keysToValues_.delete(groupingKey);}}
-const storyTags=hist.diagnostics.get(tr.v.d.RESERVED_NAMES.STORY_TAGS);for(const tag of(storyTags||[])){allStoryTags.add(tag);}}
-tr.b.Timing.instant('HistogramParameterCollector','maxSampleCount',maxSampleCount);for(const tagGrouping of tr.v.HistogramGrouping.buildFromTags(allStoryTags,tr.v.d.RESERVED_NAMES.STORY_TAGS)){const values=new Set();for(const hist of histograms){values.add(tagGrouping.callback(hist));}
-if(values.size>1){this.keysToGroupings_.set(tagGrouping.key,tagGrouping);this.keysToValues_.set(tagGrouping.key,values);}}
-this.statisticNames_.add('pct_090');}
-get statisticNames(){return Array.from(this.statisticNames_);}
-get labels(){const displayLabels=Array.from(this.labelsToStartTimes_.keys());displayLabels.sort((x,y)=>this.labelsToStartTimes_.get(x)-this.labelsToStartTimes_.get(y));return displayLabels;}
-get possibleGroupings(){for(const[key,values]of this.keysToValues_){if(values.size>=2)continue;this.keysToGroupings_.delete(key);}
-return Array.from(this.keysToGroupings_.values());}}
-return{HistogramParameterCollector,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-histogram-set-controls-export',exportRawCsv_(){this.export_(false,'csv');},exportRawJson_(){this.export_(false,'json');},exportMergedCsv_(){this.export_(true,'csv');},exportMergedJson_(){this.export_(true,'json');},export_(merged,format){tr.b.dispatchSimpleEvent(this,'export',true,true,{merged,format});},});return{};});'use strict';tr.exportTo('tr.v.ui',function(){const ALPHA_OPTIONS=[];for(let i=1;i<10;++i)ALPHA_OPTIONS.push(i*1e-3);for(let i=1;i<10;++i)ALPHA_OPTIONS.push(i*1e-2);ALPHA_OPTIONS.push(0.1);Polymer({is:'tr-v-ui-histogram-set-controls',properties:{searchQuery:{type:String,value:'',observer:'onSearchQueryChange_',},showAll:{type:Boolean,value:true,observer:'onUserChange_',},referenceDisplayLabel:{type:String,value:'',observer:'onUserChange_',},displayStatisticName:{type:String,value:'',observer:'onUserChange_',},alphaString:{type:String,computed:'getAlphaString_(alphaIndex)',},alphaIndex:{type:Number,value:9,observer:'onUserChange_',},},created(){this.viewState_=undefined;this.rowListener_=this.onRowViewStateUpdate_.bind(this);this.baseStatisticNames_=[];this.isInOnViewStateUpdate_=false;this.searchQueryDebounceMs=200;},ready(){this.$.picker.addEventListener('current-groups-changed',this.onGroupsChanged_.bind(this));},get viewState(){return this.viewState_;},set viewState(vs){if(this.viewState_){throw new Error('viewState must be set exactly once.');}
-this.viewState_=vs;this.viewState.addUpdateListener(this.onViewStateUpdate_.bind(this));},async onSearchQueryChange_(){if(this.searchQueryDebounceMs===0)return this.onUserChange_();this.debounce('onSearchQueryDebounce',this.onUserChange_,this.searchQueryDebounceMs);},async onUserChange_(){if(!this.viewState)return;if(this.isInOnViewStateUpdate_)return;const marks=[];if(this.searchQuery!==this.viewState.searchQuery){marks.push(tr.b.Timing.mark('histogram-set-controls','search'));}
-if(this.showAll!==this.viewState.showAll){marks.push(tr.b.Timing.mark('histogram-set-controls','showAll'));}
-if(this.referenceDisplayLabel!==this.viewState.referenceDisplayLabel){marks.push(tr.b.Timing.mark('histogram-set-controls','referenceColumn'));}
-if(this.displayStatisticName!==this.viewState.displayStatisticName){marks.push(tr.b.Timing.mark('histogram-set-controls','statistic'));}
-if(parseInt(this.alphaIndex)!==this.getAlphaIndexFromViewState_()){marks.push(tr.b.Timing.mark('histogram-set-controls','alpha'));}
-this.$.clear_search.style.visibility=this.searchQuery?'visible':'hidden';let displayStatisticName=this.displayStatisticName;if(this.viewState.referenceDisplayLabel===''&&this.referenceDisplayLabel!==''&&this.baseStatisticNames.length){displayStatisticName=`%${tr.v.DELTA}${this.displayStatisticName}`;}
-if(this.referenceDisplayLabel===''&&this.viewState.referenceDisplayLabel!==''&&this.baseStatisticNames.length){const deltaIndex=displayStatisticName.indexOf(tr.v.DELTA);if(deltaIndex>=0){displayStatisticName=displayStatisticName.slice(deltaIndex+1);}else if(!this.baseStatisticNames.includes(displayStatisticName)){displayStatisticName='avg';}}
-await this.viewState.update({searchQuery:this.searchQuery,showAll:this.showAll,referenceDisplayLabel:this.referenceDisplayLabel,displayStatisticName,alpha:ALPHA_OPTIONS[this.alphaIndex],});if(this.referenceDisplayLabel&&this.statisticNames.length===this.baseStatisticNames.length){this.statisticNames=this.baseStatisticNames.concat(tr.v.Histogram.getDeltaStatisticsNames(this.baseStatisticNames));}else if(!this.referenceDisplayLabel&&this.statisticNames.length>this.baseStatisticNames.length){this.statisticNames=this.baseStatisticNames;}
-for(const mark of marks)mark.end();},onViewStateUpdate_(event){this.isInOnViewStateUpdate_=true;if(event.delta.searchQuery){this.searchQuery=this.viewState.searchQuery;}
-if(event.delta.showAll)this.showAll=this.viewState.showAll;if(event.delta.displayStatisticName){this.displayStatisticName=this.viewState.displayStatisticName;}
-if(event.delta.referenceDisplayLabel){this.referenceDisplayLabel=this.viewState.referenceDisplayLabel;this.$.alpha.style.display=this.referenceDisplayLabel?'inline':'';}
-if(event.delta.groupings){this.$.picker.currentGroupKeys=this.viewState.groupings.map(g=>g.key);}
-if(event.delta.tableRowStates){for(const row of tr.v.ui.HistogramSetTableRowState.walkAll(this.viewState.tableRowStates.values())){row.addUpdateListener(this.rowListener_);}
-const anyShowing=this.anyOverviewCharts_;this.$.hide_overview.style.display=anyShowing?'inline':'none';this.$.show_overview.style.display=anyShowing?'none':'inline';}
-if(event.delta.alpha){this.alphaIndex=this.getAlphaIndexFromViewState_();}
-this.isInOnViewStateUpdate_=false;this.onUserChange_();},onRowViewStateUpdate_(event){if(event.delta.isOverviewed){const anyShowing=event.delta.isOverviewed.current||this.anyOverviewCharts_;this.$.hide_overview.style.display=anyShowing?'inline':'none';this.$.show_overview.style.display=anyShowing?'none':'inline';}
-if(event.delta.subRows){for(const subRow of event.delta.subRows.previous){subRow.removeUpdateListener(this.rowListener_);}
-for(const subRow of event.delta.subRows.current){subRow.addUpdateListener(this.rowListener_);}}},onGroupsChanged_(){if(this.$.picker.currentGroups.length===0&&this.$.picker.possibleGroups.length>0){this.$.picker.currentGroupKeys=[this.$.picker.possibleGroups[0].key];}
-this.viewState.groupings=this.$.picker.currentGroups;},set showAllEnabled(enable){if(!enable)this.$.show_all.checked=true;this.$.show_all.disabled=!enable;},set possibleGroupings(groupings){this.$.picker.possibleGroups=groupings;this.$.picker.style.display=(groupings.length<2)?'none':'block';this.onGroupsChanged_();},set displayLabels(labels){this.$.reference_display_label.style.display=(labels.length<2)?'none':'inline';while(this.$.reference_display_label.children.length>1){this.$.reference_display_label.removeChild(this.$.reference_display_label.lastChild);}
-for(const displayLabel of labels){const option=document.createElement('option');option.textContent=displayLabel;option.value=displayLabel;this.$.reference_display_label.appendChild(option);}
-if(labels.includes(this.viewState.referenceDisplayLabel)){this.referenceDisplayLabel=this.viewState.referenceDisplayLabel;}else{this.viewState.referenceDisplayLabel='';}},get baseStatisticNames(){return this.baseStatisticNames_;},set baseStatisticNames(names){this.baseStatisticNames_=names;this.statisticNames=names;},get statisticNames(){return Array.from(this.$.statistic.options).map(o=>o.value);},set statisticNames(names){this.$.statistic.style.display=(names.length<2)?'none':'inline';while(this.$.statistic.children.length){this.$.statistic.removeChild(this.$.statistic.lastChild);}
-for(const name of names){const option=document.createElement('option');option.textContent=name;this.$.statistic.appendChild(option);}
-if(names.includes(this.viewState.displayStatisticName)){this.displayStatisticName=this.viewState.displayStatisticName;this.$.statistic.value=this.displayStatisticName;}else{this.viewState.displayStatisticName=names[0]||'';}},get anyOverviewCharts_(){for(const row of tr.v.ui.HistogramSetTableRowState.walkAll(this.viewState.tableRowStates.values())){if(row.isOverviewed)return true;}
-return false;},async toggleOverviewLineCharts_(){const showOverviews=!this.anyOverviewCharts_;const mark=tr.b.Timing.mark('histogram-set-controls',(showOverviews?'show':'hide')+'OverviewCharts');for(const row of tr.v.ui.HistogramSetTableRowState.walkAll(this.viewState.tableRowStates.values())){await row.update({isOverviewed:showOverviews});}
-this.$.hide_overview.style.display=showOverviews?'inline':'none';this.$.show_overview.style.display=showOverviews?'none':'inline';await tr.b.animationFrame();mark.end();},set helpHref(href){this.$.help.href=href;this.$.help.style.display='inline';},set feedbackHref(href){this.$.feedback.href=href;this.$.feedback.style.display='inline';},clearSearch_(){this.set('searchQuery','');this.$.search.focus();},getAlphaString_(alphaIndex){return(''+ALPHA_OPTIONS[alphaIndex]).substr(0,5);},openAlphaSlider_(){const alphaButtonRect=this.$.alpha.getBoundingClientRect();this.$.alpha_slider_container.style.display='flex';this.$.alpha_slider_container.style.top=alphaButtonRect.bottom+'px';this.$.alpha_slider_container.style.left=alphaButtonRect.left+'px';this.$.alpha_slider.focus();},closeAlphaSlider_(){this.$.alpha_slider_container.style.display='';},updateAlpha_(){this.alphaIndex=this.$.alpha_slider.value;},getAlphaIndexFromViewState_(){for(let i=0;i<ALPHA_OPTIONS.length;++i){if(ALPHA_OPTIONS[i]>=this.viewState.alpha)return i;}
-return ALPHA_OPTIONS.length-1;},});return{};});'use strict';tr.exportTo('tr.v',function(){class HistogramSetHierarchy{constructor(name){this.name=name;this.description='';this.depth=0;this.subRows=[];this.columns=new Map();}*walk(){yield this;for(const row of this.subRows)yield*row.walk();}
-static*walkAll(rootRows){for(const rootRow of rootRows)yield*rootRow.walk();}
-static build(histogramArrayMap){const rootRows=[];HistogramSetHierarchy.buildInternal_(histogramArrayMap,[],rootRows);const histograms=new tr.v.HistogramSet();for(const row of HistogramSetHierarchy.walkAll(rootRows)){for(const hist of row.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;histograms.addHistogram(hist);}}
-histograms.deduplicateDiagnostics();for(const row of HistogramSetHierarchy.walkAll(rootRows)){row.maybeRebin_();}
-return rootRows;}
-maybeRebin_(){const dataRange=new tr.b.math.Range();for(const hist of this.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;if(hist.allBins.length>1)return;if(hist.numValues===0)continue;dataRange.addValue(hist.min);dataRange.addValue(hist.max);}
-dataRange.addValue(tr.b.math.lesserWholeNumber(dataRange.min));dataRange.addValue(tr.b.math.greaterWholeNumber(dataRange.max));if(dataRange.min===dataRange.max)return;const boundaries=tr.v.HistogramBinBoundaries.createLinear(dataRange.min,dataRange.max,tr.v.DEFAULT_REBINNED_COUNT);for(const[name,hist]of this.columns){if(!(hist instanceof tr.v.Histogram))continue;this.columns.set(name,hist.rebin(boundaries));}}
-static mergeHistogramDownHierarchy_(histogram,hierarchy,columnName){for(const row of hierarchy){if(!row.description){row.description=histogram.description;}
-const existing=row.columns.get(columnName);if(existing===undefined){row.columns.set(columnName,histogram.clone());continue;}
-if(existing instanceof tr.v.HistogramSet){existing.addHistogram(histogram);continue;}
-if(!existing.canAddHistogram(histogram)){const unmergeableHistograms=new tr.v.HistogramSet([histogram]);row.columns.set(columnName,unmergeableHistograms);continue;}
-existing.addHistogram(histogram);}}
-static buildInternal_(histogramArrayMap,hierarchy,rootRows){for(const[name,histograms]of histogramArrayMap){if(histograms instanceof Array){for(const histogram of histograms){HistogramSetHierarchy.mergeHistogramDownHierarchy_(histogram,hierarchy,name);}}else if(histograms instanceof Map){const row=new HistogramSetHierarchy(name);row.depth=hierarchy.length;hierarchy.push(row);HistogramSetHierarchy.buildInternal_(histograms,hierarchy,rootRows);hierarchy.pop();if(hierarchy.length===0){rootRows.push(row);}else{const parentRow=hierarchy[hierarchy.length-1];parentRow.subRows.push(row);}}}}}
-return{HistogramSetHierarchy};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-histogram-set-table-cell',created(){this.viewState_=undefined;this.rootListener_=this.onRootStateUpdate_.bind(this);this.row_=undefined;this.displayLabel_='';this.histogram_=undefined;this.histogramSpan_=undefined;this.overviewChart_=undefined;this.mwuResult_=undefined;},ready(){this.addEventListener('click',this.onClick_.bind(this));},attached(){if(this.row){this.row.rootViewState.addUpdateListener(this.rootListener_);}},detached(){this.row.rootViewState.removeUpdateListener(this.rootListener_);},updateMwu_(){const referenceHistogram=this.referenceHistogram;this.mwuResult_=undefined;if(!(this.histogram instanceof tr.v.Histogram))return;if(!this.histogram.canCompare(referenceHistogram))return;this.mwuResult_=tr.b.math.Statistics.mwu(this.histogram.sampleValues,referenceHistogram.sampleValues,this.row.rootViewState.alpha);},build(row,displayLabel,viewState){this.row_=row;this.displayLabel_=displayLabel;this.viewState_=viewState;this.histogram_=this.row.columns.get(displayLabel);if(this.viewState){this.viewState.addUpdateListener(this.onViewStateUpdate_.bind(this));}
-this.row.viewState.addUpdateListener(this.onRowStateUpdate_.bind(this));if(this.isAttached){this.row.rootViewState.addUpdateListener(this.rootListener_);}
-this.updateMwu_();this.updateContents_();},updateSignificance_(){if(!this.mwuResult_)return;this.$.scalar.significance=this.mwuResult_.significance;},get viewState(){return this.viewState_;},get row(){return this.row_;},get histogram(){return this.histogram_;},get referenceHistogram(){const referenceDisplayLabel=this.row.rootViewState.referenceDisplayLabel;if(!referenceDisplayLabel)return undefined;if(referenceDisplayLabel===this.displayLabel_)return undefined;return this.row.columns.get(referenceDisplayLabel);},get isHistogramOpen(){return(this.histogramSpan_!==undefined)&&(this.$.histogram.style.display==='block');},set isHistogramOpen(open){if(!(this.histogram instanceof tr.v.Histogram)||(this.histogram.numValues===0)){return;}
-this.$.scalar.style.display=open?'none':'flex';this.$.open_histogram.style.display=open?'none':'block';this.$.close_histogram.style.display=open?'block':'none';this.$.histogram.style.display=open?'block':'none';if(open&&this.histogramSpan_===undefined){this.histogramSpan_=document.createElement('tr-v-ui-histogram-span');this.histogramSpan_.viewState=this.viewState;this.histogramSpan_.rowState=this.row.viewState;this.histogramSpan_.rootState=this.row.rootViewState;this.histogramSpan_.build(this.histogram,this.referenceHistogram);this.$.histogram.appendChild(this.histogramSpan_);}
-this.viewState.isOpen=open;},onViewStateUpdate_(event){if(event.delta.isOpen){this.isHistogramOpen=this.viewState.isOpen;}},onRowStateUpdate_(event){if(event.delta.isOverviewed===undefined)return;if(this.row.viewState.isOverviewed){this.showOverview();}else{this.hideOverview();}},onRootStateUpdate_(event){if(event.delta.referenceDisplayLabel&&this.histogramSpan_){this.histogramSpan_.build(this.histogram,this.referenceHistogram);}
-if(event.delta.displayStatisticName||event.delta.referenceDisplayLabel){this.updateMwu_();this.updateContents_();}else if(event.delta.alpha&&this.mwuResult_){this.mwuResult_.compare(this.row.rootViewState.alpha);this.updateSignificance_();}
-if(this.row.viewState.isOverviewed&&(event.delta.sortColumnIndex||event.delta.sortDescending||event.delta.displayStatisticName||event.delta.referenceDisplayLabel)){if(this.overviewChart_!==undefined){this.$.overview_container.removeChild(this.overviewChart_);this.overviewChart_=undefined;}
-this.showOverview();}},onClick_(event){event.stopPropagation();},openHistogram_(){this.isHistogramOpen=true;tr.b.Timing.instant('histogram-set-table-cell','open');},closeHistogram_(){this.isHistogramOpen=false;tr.b.Timing.instant('histogram-set-table-cell','close');},updateContents_(){const isOpen=this.isHistogramOpen;this.$.empty.style.display='none';this.$.unmergeable.style.display='none';this.$.scalar.style.display='none';this.$.histogram.style.display='none';this.$.close_histogram.style.display='none';this.$.open_histogram.style.visibility='hidden';if(!this.histogram){this.$.missing.style.display='block';return;}
-this.$.missing.style.display='none';if(this.histogram instanceof tr.v.HistogramSet){this.$.unmergeable.style.display='block';return;}
-if(!(this.histogram instanceof tr.v.Histogram)){throw new Error('Invalid Histogram: '+this.histogram);}
-if(this.histogram.numValues===0){this.$.empty.style.display='block';return;}
-this.$.open_histogram.style.display='block';this.$.open_histogram.style.visibility='visible';this.$.scalar.style.display='flex';this.updateSignificance_();const referenceHistogram=this.referenceHistogram;const statName=this.histogram.getAvailableStatisticName(this.row.rootViewState.displayStatisticName,referenceHistogram);const statisticScalar=this.histogram.getStatisticScalar(statName,referenceHistogram);this.$.scalar.setValueAndUnit(statisticScalar.value,statisticScalar.unit);this.isHistogramOpen=isOpen;},showOverview(){this.$.overview_container.style.display='block';if(this.overviewChart_!==undefined)return;this.row.sortSubRows();let referenceDisplayLabel=this.row.rootViewState.referenceDisplayLabel;if(referenceDisplayLabel===this.displayLabel_){referenceDisplayLabel=undefined;}
-const displayStatisticName=this.row.rootViewState.displayStatisticName;const data=[];let unit;for(const subRow of this.row.subRows){const subHist=subRow.columns.get(this.displayLabel_);if(!(subHist instanceof tr.v.Histogram))continue;if(unit===undefined){unit=subHist.unit;}else if(unit!==subHist.unit){data.splice(0);break;}
-const refHist=subRow.columns.get(referenceDisplayLabel);const statName=subHist.getAvailableStatisticName(displayStatisticName,refHist);const statScalar=subHist.getStatisticScalar(statName,refHist);if(statScalar!==undefined){data.push({x:subRow.name,y:statScalar.value,});}}
-if(data.length<2)return;this.overviewChart_=new tr.ui.b.NameLineChart();this.$.overview_container.appendChild(this.overviewChart_);this.overviewChart_.displayXInHover=true;this.overviewChart_.hideLegend=true;this.overviewChart_.unit=unit;this.overviewChart_.overrideDataRange=this.row.overviewDataRange;this.overviewChart_.data=data;},hideOverview(){this.$.overview_container.style.display='none';}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){const NAME_COLUMN_WIDTH_PX=300;Polymer({is:'tr-v-ui-histogram-set-table-name-cell',created(){this.row_=undefined;this.overviewChart_=undefined;this.cellListener_=this.onCellStateUpdate_.bind(this);this.rootListener_=this.onRootStateUpdate_.bind(this);},attached(){if(this.row){this.row.rootViewState.addUpdateListener(this.rootListener_);}},detached(){this.row.rootViewState.removeUpdateListener(this.rootListener_);},get row(){return this.row_;},build(row){if(this.row_!==undefined){throw new Error('row must be set exactly once.');}
-this.row_=row;this.row.viewState.addUpdateListener(this.onRowStateUpdate_.bind(this));this.constrainWidth=this.row.rootViewState.constrainNameColumn;if(this.isAttached){this.row.rootViewState.addUpdateListener(this.rootListener_);}
-for(const cellState of this.row.viewState.cells.values()){cellState.addUpdateListener(this.cellListener_);}
-Polymer.dom(this.$.name).textContent=this.row.name;this.title=this.row.name;if(this.row.description){this.title+='\n'+this.row.description;}
-if(this.row.overviewDataRange.isEmpty||this.row.overviewDataRange.min===this.row.overviewDataRange.max){this.$.show_overview.style.display='none';}
-let histogramCount=0;for(const cell of this.row.columns.values()){if(cell instanceof tr.v.Histogram&&cell.numValues>0){++histogramCount;}}
-if(histogramCount<=1){this.$.open_histograms.style.display='none';}},set constrainWidth(constrain){this.$.name.style.maxWidth=constrain?(this.nameWidthPx+'px'):'none';},get nameWidthPx(){return NAME_COLUMN_WIDTH_PX-(16*this.row.depth);},get isOverflowing(){return this.$.name.style.maxWidth!=='none'&&this.$.name.getBoundingClientRect().width===this.nameWidthPx;},get isOverviewed(){return this.$.overview_container.style.display==='block';},set isOverviewed(isOverviewed){if(isOverviewed===this.isOverviewed)return;if(isOverviewed){this.showOverview_();}else{this.hideOverview_();}},hideOverview_(opt_event){this.$.overview_container.style.display='none';this.$.hide_overview.style.display='none';this.$.show_overview.style.display='block';if(opt_event!==undefined){opt_event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','hideOverview');this.row.viewState.isOverviewed=this.isOverviewed;}},showOverview_(opt_event){if(opt_event!==undefined){opt_event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','showOverview');this.row.viewState.isOverviewed=true;}
-this.$.overview_container.style.display='block';this.$.hide_overview.style.display='block';this.$.show_overview.style.display='none';if(this.overviewChart_===undefined){const displayStatisticName=this.row.rootViewState.displayStatisticName;const data=[];let unit;for(const[displayLabel,hist]of this.row.sortedColumns()){if(!(hist instanceof tr.v.Histogram))continue;if(unit===undefined){unit=hist.unit;}else if(unit!==hist.unit){data.splice(0);break;}
-const statName=hist.getAvailableStatisticName(displayStatisticName);const statScalar=hist.getStatisticScalar(statName);if(statScalar!==undefined){data.push({x:displayLabel,y:statScalar.value,});}}
-if(data.length<2){return;}
-this.overviewChart_=new tr.ui.b.NameLineChart();this.$.overview_container.appendChild(this.overviewChart_);this.overviewChart_.displayXInHover=true;this.overviewChart_.hideLegend=true;this.overviewChart_.unit=unit;this.overviewChart_.overrideDataRange=this.row.overviewDataRange;this.overviewChart_.data=data;}},openHistograms_(event){event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','openHistograms');for(const cell of this.row.cells.values()){cell.isHistogramOpen=true;}
-this.$.close_histograms.style.display='block';this.$.open_histograms.style.display='none';},closeHistograms_(event){event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','closeHistograms');for(const cell of this.row.cells.values()){cell.isHistogramOpen=false;}
-this.$.open_histograms.style.display='block';this.$.close_histograms.style.display='none';},onRootStateUpdate_(event){if(event.delta.constrainNameColumn){this.constrainWidth=this.row.rootViewState.constrainNameColumn;}
-if(this.row.viewState.isOverviewed&&event.delta.displayStatisticName){this.row.resetOverviewDataRange();if(this.overviewChart_!==undefined){this.$.overview_container.removeChild(this.overviewChart_);this.overviewChart_=undefined;}
-this.showOverview_();}},onRowStateUpdate_(event){if(event.delta.isOverviewed){this.isOverviewed=this.row.viewState.isOverviewed;}},onCellStateUpdate_(event){if(!event.delta.isOpen)return;let cellCount=0;let openCellCount=0;for(const cell of this.row.cells.values()){if(!(cell.histogram instanceof tr.v.Histogram)||(cell.histogram.numValues===0)){continue;}
-++cellCount;if(cell.isHistogramOpen)++openCellCount;}
-if(cellCount<=1)return;const mostlyOpen=openCellCount>(cellCount/2);this.$.open_histograms.style.display=mostlyOpen?'none':'block';this.$.close_histograms.style.display=mostlyOpen?'block':'none';}});return{NAME_COLUMN_WIDTH_PX,};});'use strict';tr.exportTo('tr.v.ui',function(){class HistogramSetTableRow{constructor(hierarchy,baseTable,rootViewState){this.hierarchy_=hierarchy;this.baseTable_=baseTable;this.rootViewState_=rootViewState;this.viewState_=new tr.v.ui.HistogramSetTableRowState();this.viewState_.addUpdateListener(this.onViewStateUpdate_.bind(this));this.overviewDataRange_=undefined;this.nameCell_=undefined;this.cells_=new Map();this.subRows_=[];for(const subHierarchy of hierarchy.subRows){const subRow=new HistogramSetTableRow(subHierarchy,baseTable,rootViewState);this.subRows_.push(subRow);this.viewState.subRows.set(subRow.name,subRow.viewState);}
-for(const columnName of this.columns.keys()){this.viewState.cells.set(columnName,new tr.v.ui.HistogramSetTableCellState());}}
-get name(){return this.hierarchy_.name;}
-get depth(){return this.hierarchy_.depth;}
-get description(){return this.hierarchy_.description;}
-get columns(){return this.hierarchy_.columns;}*sortedColumns(){for(const col of this.baseTable_.tableColumns){yield[col.displayLabel,this.hierarchy_.columns.get(col.displayLabel),];}}
-get overviewDataRange(){if(this.overviewDataRange_===undefined){this.overviewDataRange_=new tr.b.math.Range();const displayStatisticName=this.rootViewState.displayStatisticName;const referenceDisplayLabel=this.rootViewState.referenceDisplayLabel;for(const[displayLabel,hist]of this.columns){if(hist instanceof tr.v.Histogram){const statName=hist.getAvailableStatisticName(displayStatisticName);const statScalar=hist.getStatisticScalar(statName);if(statScalar!==undefined){this.overviewDataRange_.addValue(statScalar.value);}}
-for(const subRow of this.subRows){const subHist=subRow.columns.get(displayLabel);if(!(subHist instanceof tr.v.Histogram))continue;const refHist=subRow.columns.get(referenceDisplayLabel);const statName=subHist.getAvailableStatisticName(displayStatisticName,refHist);const statScalar=subHist.getStatisticScalar(statName,refHist);if(statScalar!==undefined){this.overviewDataRange_.addValue(statScalar.value);}}}}
-return this.overviewDataRange_;}
-resetOverviewDataRange(){this.overviewDataRange_=undefined;}
-get rootViewState(){return this.rootViewState_;}
-get cells(){return this.cells_;}
-get subRows(){return this.subRows_;}
-get viewState(){return this.viewState_;}*walk(){yield this;for(const row of this.subRows)yield*row.walk();}
-static*walkAll(rootRows){for(const rootRow of rootRows)yield*rootRow.walk();}
-get nameCell(){if(this.nameCell_===undefined){this.nameCell_=document.createElement('tr-v-ui-histogram-set-table-name-cell');this.nameCell_.build(this);}
-return this.nameCell_;}
-getCell(columnName){if(this.cells.has(columnName))return this.cells.get(columnName);const cell=document.createElement('tr-v-ui-histogram-set-table-cell');cell.build(this,columnName,this.viewState.cells.get(columnName));this.cells.set(columnName,cell);return cell;}
-compareNames(other){return this.name.localeCompare(other.name);}
-compareCells(other,displayLabel){const referenceDisplayLabel=this.rootViewState.referenceDisplayLabel;let referenceCellA;let referenceCellB;if(referenceDisplayLabel&&referenceDisplayLabel!==displayLabel){referenceCellA=this.columns.get(referenceDisplayLabel);referenceCellB=other.columns.get(referenceDisplayLabel);}
-const cellA=this.columns.get(displayLabel);let valueA=0;if(cellA instanceof tr.v.Histogram){const statisticA=cellA.getAvailableStatisticName(this.rootViewState.displayStatisticName,referenceCellA);const scalarA=cellA.getStatisticScalar(statisticA,referenceCellA);if(scalarA){valueA=scalarA.value;}}
-const cellB=other.columns.get(displayLabel);let valueB=0;if(cellB instanceof tr.v.Histogram){const statisticB=cellB.getAvailableStatisticName(this.rootViewState.displayStatisticName,referenceCellB);const scalarB=cellB.getStatisticScalar(statisticB,referenceCellB);if(scalarB){valueB=scalarB.value;}}
-return valueA-valueB;}
-onViewStateUpdate_(event){if(event.delta.isExpanded){this.baseTable_.setExpandedForTableRow(this,this.viewState.isExpanded);}
-if(event.delta.subRows){throw new Error('HistogramSetTableRow.subRows must not be reassigned.');}
-if(event.delta.cells){for(const[displayLabel,cell]of this.cells){if(cell.viewState!==this.viewState.cells.get(displayLabel)){throw new Error('Only HistogramSetTableRow may update cells');}}}}
-async restoreState(vs){await this.viewState.update({isExpanded:vs.isExpanded,isOverviewed:vs.isOverviewed,});for(const[displayLabel,cell]of this.cells){const previousState=vs.cells.get(displayLabel);if(!previousState)continue;await cell.viewState.updateFromViewState(previousState);}
-for(const row of this.subRows){const previousState=vs.subRows.get(row.name);if(!previousState)continue;await row.restoreState(previousState);}}
-sortSubRows(){const sortColumn=this.baseTable_.tableColumns[this.rootViewState_.sortColumnIndex];if(sortColumn===undefined)return;this.subRows_.sort(sortColumn.cmp);if(this.rootViewState_.sortDescending){this.subRows_.reverse();}}}
-return{HistogramSetTableRow,};});'use strict';tr.exportTo('tr.v.ui',function(){const MIDLINE_HORIZONTAL_ELLIPSIS=String.fromCharCode(0x22ef);function escapeRegExp(str){return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,'\\$&');}
-Polymer({is:'tr-v-ui-histogram-set-table',created(){this.viewState_=undefined;this.progress_=()=>Promise.resolve();this.nameColumnTitle_=undefined;this.displayLabels_=[];this.histograms_=undefined;this.sourceHistograms_=undefined;this.filteredHistograms_=undefined;this.groupedHistograms_=undefined;this.hierarchies_=undefined;this.tableRows_=undefined;this.sortColumnChangedListener_=e=>this.onSortColumnChanged_(e);},ready(){this.$.table.zebra=true;this.addEventListener('sort-column-changed',this.sortColumnChangedListener_);this.addEventListener('requestSelectionChange',this.onRequestSelectionChange_.bind(this));this.addEventListener('row-expanded-changed',this.onRowExpandedChanged_.bind(this));},get viewState(){return this.viewState_;},set viewState(vs){if(this.viewState_){throw new Error('viewState must be set exactly once.');}
-this.viewState_=vs;this.viewState.addUpdateListener(this.onViewStateUpdate_.bind(this));},get histograms(){return this.histograms_;},async build(histograms,sourceHistograms,displayLabels,opt_progress){this.histograms_=histograms;this.sourceHistograms_=sourceHistograms;this.filteredHistograms_=undefined;this.groupedHistograms_=undefined;this.displayLabels_=displayLabels;if(opt_progress!==undefined)this.progress_=opt_progress;if(histograms.length===0){throw new Error('histogram-set-table requires non-empty HistogramSet.');}
-await this.progress_('Building columns...');this.$.table.tableColumns=[{title:this.buildNameColumnTitle_(),value:row=>row.nameCell,cmp:(a,b)=>a.compareNames(b),}].concat(displayLabels.map(l=>this.buildColumn_(l)));tr.b.Timing.instant('histogram-set-table','columnCount',this.$.table.tableColumns.length);await this.updateContents_();this.fire('display-ready');this.progress_=()=>Promise.resolve();this.checkNameColumnOverflow_(tr.v.ui.HistogramSetTableRow.walkAll(this.$.table.tableRows));},buildNameColumnTitle_(){this.nameColumnTitle_=document.createElement('span');this.nameColumnTitle_.style.display='inline-flex';const nameEl=document.createElement('span');nameEl.textContent='Name';this.nameColumnTitle_.appendChild(nameEl);const toggleWidthEl=document.createElement('span');toggleWidthEl.style.fontWeight='bold';toggleWidthEl.style.background='#bbb';toggleWidthEl.style.color='#333';toggleWidthEl.style.padding='0px 3px';toggleWidthEl.style.marginRight='8px';toggleWidthEl.style.display='none';toggleWidthEl.textContent=MIDLINE_HORIZONTAL_ELLIPSIS;toggleWidthEl.addEventListener('click',this.toggleNameColumnWidth_.bind(this));this.nameColumnTitle_.appendChild(toggleWidthEl);return this.nameColumnTitle_;},toggleNameColumnWidth_(opt_event){this.viewState.update({constrainNameColumn:!this.viewState.constrainNameColumn,});if(opt_event!==undefined){opt_event.stopPropagation();opt_event.preventDefault();tr.b.Timing.instant('histogram-set-table','nameColumn'+
-(this.viewState.constrainNameColumn?'Constrained':'Unconstrained'));}},buildColumn_(displayLabel){const title=document.createElement('span');title.textContent=displayLabel;title.style.whiteSpace='pre';return{displayLabel,title,value:row=>row.getCell(displayLabel),cmp:(rowA,rowB)=>rowA.compareCells(rowB,displayLabel),};},async updateContents_(){const previousRowStates=this.viewState.tableRowStates;if(!this.filteredHistograms_){await this.progress_('Filtering rows...');this.filteredHistograms_=this.viewState.showAll?this.histograms:this.sourceHistograms_;if(this.viewState.searchQuery){let query;try{query=new RegExp(this.viewState.searchQuery);}catch(e){}
-if(query!==undefined){this.filteredHistograms_=new tr.v.HistogramSet([...this.filteredHistograms_].filter(hist=>hist.name.match(query)));if(this.filteredHistograms_.length===0&&!this.viewState.showAll){await this.viewState.update({showAll:true});return;}}}
-this.groupedHistograms_=undefined;}
-if(!this.groupedHistograms_){await this.progress_('Grouping Histograms...');this.groupHistograms_();}
-if(!this.hierarchies_){await this.progress_('Merging Histograms...');this.hierarchies_=tr.v.HistogramSetHierarchy.build(this.groupedHistograms_);this.tableRows_=undefined;}
-const tableRowsDirty=this.tableRows_===undefined;if(tableRowsDirty){this.tableRows_=this.hierarchies_.map(hierarchy=>new tr.v.ui.HistogramSetTableRow(hierarchy,this.$.table,this.viewState));tr.b.Timing.instant('histogram-set-table','rootRowCount',this.tableRows_.length);const namesToRowStates=new Map();for(const row of this.tableRows_){namesToRowStates.set(row.name,row.viewState);}
-await this.viewState.update({tableRowStates:namesToRowStates});}
-await this.progress_('Configuring table...');this.nameColumnTitle_.children[1].style.filter=this.viewState.constrainNameColumn?'invert(100%)':'';const referenceDisplayLabelIndex=this.displayLabels_.indexOf(this.viewState.referenceDisplayLabel);this.$.table.selectedTableColumnIndex=(referenceDisplayLabelIndex<0)?undefined:(1+referenceDisplayLabelIndex);this.removeEventListener('sort-column-changed',this.sortColumnChangedListener_);this.$.table.sortColumnIndex=this.viewState.sortColumnIndex;this.$.table.sortDescending=this.viewState.sortDescending;this.addEventListener('sort-column-changed',this.sortColumnChangedListener_);if(tableRowsDirty){await this.progress_('Building DOM...');this.$.table.tableRows=this.tableRows_;for(const row of this.tableRows_){const previousState=previousRowStates.get(row.name);if(!previousState)continue;await row.restoreState(previousState);}}
-this.$.table.rebuild();},async onRowExpandedChanged_(event){event.row.viewState.isExpanded=this.$.table.getExpandedForTableRow(event.row);tr.b.Timing.instant('histogram-set-table','row'+(event.row.viewState.isExpanded?'Expanded':'Collapsed'));if(this.nameColumnTitle_.children[1].style.display==='block')return;await tr.b.animationFrame();this.checkNameColumnOverflow_(event.row.subRows);},checkNameColumnOverflow_(rows){for(const row of rows){if(!row.nameCell.isOverflowing)continue;const[nameSpan,dots]=Array.from(this.nameColumnTitle_.children);dots.style.display='block';const labelWidthPx=tr.v.ui.NAME_COLUMN_WIDTH_PX-
-dots.getBoundingClientRect().width;nameSpan.style.width=labelWidthPx+'px';return;}},groupHistograms_(){const groupings=this.viewState.groupings.slice();groupings.push(tr.v.HistogramGrouping.DISPLAY_LABEL);function canSkipGrouping(grouping,groupedHistograms){if(groupedHistograms.size>1)return false;if(grouping.key===groupings[0].key)return false;if(grouping.key===tr.v.HistogramGrouping.DISPLAY_LABEL.key){return false;}
-return true;}
-this.groupedHistograms_=this.filteredHistograms_.groupHistogramsRecursively(groupings,canSkipGrouping);this.hierarchies_=undefined;},async onViewStateUpdate_(event){if(this.histograms_===undefined)return;if(event.delta.searchQuery!==undefined||event.delta.showAll!==undefined){this.filteredHistograms_=undefined;}
-if(event.delta.groupings!==undefined){this.groupedHistograms_=undefined;}
-if(event.delta.displayStatistic!==undefined&&this.$.table.sortColumnIndex>0){this.$.table.sortColumnIndex=undefined;}
-if(event.delta.referenceDisplayLabel!==undefined||event.delta.displayStatisticName!==undefined){this.$.table.tableRows=this.$.table.tableRows;}
-if(event.delta.tableRowStates){if(this.tableRows_.length!==this.viewState.tableRowStates.size){throw new Error('Only histogram-set-table may update tableRowStates');}
-for(const row of this.tableRows_){if(this.viewState.tableRowStates.get(row.name)!==row.viewState){throw new Error('Only histogram-set-table may update tableRowStates');}}
-return;}
-await this.updateContents_();},onSortColumnChanged_(event){tr.b.Timing.instant('histogram-set-table','sortColumn');this.viewState.update({sortColumnIndex:event.sortColumnIndex,sortDescending:event.sortDescending,});},onRequestSelectionChange_(event){if(event.selection instanceof tr.model.EventSet)return;event.stopPropagation();tr.b.Timing.instant('histogram-set-table','selectHistogramNames');let histogramNames=event.selection;histogramNames.sort();histogramNames=histogramNames.map(escapeRegExp).join('|');this.viewState.update({showAll:true,searchQuery:`^(${histogramNames})$`,});},get leafHistograms(){const histograms=new tr.v.HistogramSet();for(const row of
-tr.v.ui.HistogramSetTableRow.walkAll(this.$.table.tableRows)){if(row.subRows.length)continue;for(const hist of row.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;histograms.addHistogram(hist);}}
-return histograms;}});return{MIDLINE_HORIZONTAL_ELLIPSIS,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-histogram-set-view',listeners:{export:'onExport_',},created(){this.brushingStateController_=new tr.ui.NullBrushingStateController();this.viewState_=new tr.v.ui.HistogramSetViewState();},ready(){this.$.table.viewState=this.viewState;this.$.controls.viewState=this.viewState;},attached(){this.brushingStateController.parentController=tr.c.BrushingStateController.getControllerForElement(this.parentNode);},get brushingStateController(){return this.brushingStateController_;},get viewState(){return this.viewState_;},get histograms(){return this.$.table.histograms;},async build(histograms,opt_options){const options=opt_options||{};const progress=options.progress||(()=>Promise.resolve());if(options.helpHref)this.$.controls.helpHref=options.helpHref;if(options.feedbackHref){this.$.controls.feedbackHref=options.feedbackHref;}
-if(histograms===undefined||histograms.length===0){this.$.container.style.display='none';this.$.zero.style.display='block';this.style.display='block';return;}
-this.$.zero.style.display='none';this.$.container.style.display='block';this.$.container.style.maxHeight=(window.innerHeight-16)+'px';const buildMark=tr.b.Timing.mark('histogram-set-view','build');await progress('Finding important Histograms...');const sourceHistogramsMark=tr.b.Timing.mark('histogram-set-view','sourceHistograms');const sourceHistograms=histograms.sourceHistograms;sourceHistogramsMark.end();this.$.controls.showAllEnabled=(sourceHistograms.length!==histograms.length);await progress('Collecting parameters...');const collectParametersMark=tr.b.Timing.mark('histogram-set-view','collectParameters');const parameterCollector=new tr.v.HistogramParameterCollector();parameterCollector.process(histograms);this.$.controls.baseStatisticNames=parameterCollector.statisticNames;this.$.controls.possibleGroupings=parameterCollector.possibleGroupings;const displayLabels=parameterCollector.labels;this.$.controls.displayLabels=displayLabels;collectParametersMark.end();await this.$.table.build(histograms,sourceHistograms,displayLabels,progress);buildMark.end();},onExport_(event){const mark=tr.b.Timing.mark('histogram-set-view','export'+
-(event.merged?'Merged':'Raw')+event.format.toUpperCase());const histograms=event.merged?this.$.table.leafHistograms:this.histograms;let blob;if(event.format==='csv'){const csv=new tr.v.CSVBuilder(histograms);csv.build();blob=new window.Blob([csv.toString()],{type:'text/csv'});}else if(event.format==='json'){blob=new window.Blob([JSON.stringify(histograms.asDicts())],{type:'text/json'});}else{throw new Error(`Unable to export format "${event.format}"`);}
-const path=window.location.pathname.split('/');const basename=path[path.length-1].split('.')[0]||'histograms';const anchor=document.createElement('a');anchor.download=`${basename}.${event.format}`;anchor.href=window.URL.createObjectURL(blob);anchor.click();mark.end();},});return{};});'use strict';tr.exportTo('tr.ui',function(){Polymer({is:'tr-ui-sp-metrics-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.model_=undefined;this.rangeOfInterest_=undefined;this.metricLatenciesMs_=[];this.metrics_=[];tr.metrics.MetricRegistry.getAllRegisteredTypeInfos().forEach(function(m){if(m.constructor.name==='sampleMetric')return;this.metrics_.push({label:m.constructor.name,value:m.constructor.name});},this);this.metrics_.sort((x,y)=>x.label.localeCompare(y.label));this.settingsKey_='metrics-side-panel-metric-name';this.currentMetricName_='responsivenessMetric';const metricSelector=tr.ui.b.createSelector(this,'currentMetricName_',this.settingsKey_,this.currentMetricName_,this.metrics_);Polymer.dom(this.$.top_left_controls).appendChild(metricSelector);metricSelector.addEventListener('change',this.onMetricChange_.bind(this));this.currentMetricTypeInfo_=tr.metrics.MetricRegistry.findTypeInfoWithName(this.currentMetricName_);this.recomputeButton_=tr.ui.b.createButton('Recompute',this.onRecompute_,this);Polymer.dom(this.$.top_left_controls).appendChild(this.recomputeButton_);this.$.results.addEventListener('display-ready',()=>{this.$.results.style.display='';});},async build(model){this.model_=model;await this.updateContents_();},get metricLatencyMs(){return tr.b.math.Statistics.mean(this.metricLatenciesMs_);},onMetricChange_(){this.currentMetricTypeInfo_=tr.metrics.MetricRegistry.findTypeInfoWithName(this.currentMetricName_);this.metricLatenciesMs_=[];this.updateContents_();},onRecompute_(){this.updateContents_();},get textLabel(){return'Metrics';},supportsModel(m){if(!m){return{supported:false,reason:'No model available'};}
-return{supported:true};},get model(){return this.model_;},set model(model){this.build(model);},get selection(){},set selection(_){},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(range){this.rangeOfInterest_=range;if(this.currentMetricTypeInfo_&&this.currentMetricTypeInfo_.metadata.supportsRangeOfInterest){if((this.metricLatencyMs===undefined)||(this.metricLatencyMs<100)){this.updateContents_();}else{this.recomputeButton_.style.background='red';}}},async updateContents_(){Polymer.dom(this.$.error).textContent='';this.$.results.style.display='none';if(!this.model_){Polymer.dom(this.$.error).textContent='Missing model';return;}
-const options={metrics:[this.currentMetricName_]};if(this.currentMetricTypeInfo_&&this.currentMetricTypeInfo_.metadata.supportsRangeOfInterest&&this.rangeOfInterest&&!this.rangeOfInterest.isEmpty){options.rangeOfInterest=this.rangeOfInterest;}
-const startDate=new Date();const addFailureCb=failure=>{Polymer.dom(this.$.error).textContent=failure.description;};const histograms=tr.metrics.runMetrics(this.model_,options,addFailureCb);this.metricLatenciesMs_.push(new Date()-startDate);while(this.metricLatenciesMs_.length>20){this.metricLatenciesMs_.shift();}
-this.recomputeButton_.style.background='';await this.$.results.build(histograms);}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-sp-metrics-side-panel');});return{};});'use strict';Polymer({is:'tr-ui-e-s-alerts-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.rangeOfInterest_=new tr.b.math.Range();this.selection_=undefined;},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();},set selection(selection){},set rangeOfInterest(rangeOfInterest){},selectAlertsOfType(alertTypeString){const alertsOfType=this.model_.alerts.filter(function(alert){return alert.title===alertTypeString;});const event=new tr.model.RequestSelectionChangeEvent();event.selection=new tr.model.EventSet(alertsOfType);this.dispatchEvent(event);},alertsByType_(alerts){const alertsByType={};alerts.forEach(function(alert){if(!alertsByType[alert.title]){alertsByType[alert.title]=[];}
-alertsByType[alert.title].push(alert);});return alertsByType;},alertsTableRows_(alertsByType){return Object.keys(alertsByType).map(function(key){return{alertType:key,count:alertsByType[key].length};});},alertsTableColumns_(){return[{title:'Alert type',value(row){return row.alertType;},width:'180px'},{title:'Count',width:'100%',value(row){return row.count;}}];},createAlertsTable_(alerts){const alertsByType=this.alertsByType_(alerts);const table=document.createElement('tr-ui-b-table');table.tableColumns=this.alertsTableColumns_();table.tableRows=this.alertsTableRows_(alertsByType);table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;table.addEventListener('selection-changed',function(e){const row=table.selectedTableRow;if(row){this.selectAlertsOfType(row.alertType);}}.bind(this));return table;},updateContents_(){Polymer.dom(this.$.result_area).textContent='';if(this.model_===undefined)return;const panel=this.createAlertsTable_(this.model_.alerts);Polymer.dom(this.$.result_area).appendChild(panel);},supportsModel(m){if(m===undefined){return{supported:false,reason:'Unknown tracing model'};}else if(m.alerts.length===0){return{supported:false,reason:'No alerts in tracing model'};}
-return{supported:true};},get textLabel(){return'Alerts';}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-e-s-alerts-side-panel');});
-</script>
-<!--CATAPULT_REV=NO_AUTO_UPDATE-->
\ No newline at end of file
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_data b/systrace/catapult/systrace/systrace/test_data/atrace_data
deleted file mode 100644
index 2aceb18..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_data
+++ /dev/null
@@ -1,127 +0,0 @@
-# tracer: nop
-#
-# entries-in-buffer/entries-written: 116/116   #P:1
-#
-#                              _-----=> irqs-off
-#                             / _----=> need-resched
-#                            | / _---=> hardirq/softirq
-#                            || / _--=> preempt-depth
-#                            ||| /     delay
-#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
-#              | |       |   ||||       |         |
-atrace-14446 [000] ...2  1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h5  1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
-dsx_exp_workque-212   [000] d..4  1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
-dsx_exp_workque-212   [000] ...2  1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
-uether-209   [000] d..4  1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
-uether-209   [000] ...2  1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
-dsx_rebuild_wor-211   [000] ...2  1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h5  1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
-irq/363-ARM64 s-292   [000] ...2  1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-sensors.qcom-14447 [000] d..4  1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-sensors.qcom-14447 [000] ...2  1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-sensors.qcom-1593  [000] ...2  1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-sensors.qcom-14447 [000] d..3  1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-sensors.qcom-14447 [000] ...2  1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-sensors.qcom-1593  [000] d..4  1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
-sensors.qcom-1593  [000] ...2  1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
-sensors.qcom-760   [000] d..4  1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
-sensors.qcom-760   [000] ...2  1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
-system_server-782   [000] d..4  1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
-system_server-782   [000] ...2  1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
-system_server-785   [000] ...2  1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-sensors.qcom-14447 [000] ...3  1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
-MMHandlerThread-7231  [000] ...2  1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNs6  1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
-kworker/u:1-21    [000] d..5  1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
-kworker/u:1-21    [000] ...2  1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-thermal-engine-557   [000] d..4  1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-thermal-engine-557   [000] ...2  1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
-mpdecision-2046  [000] ...2  1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-kworker/0:1H-17    [000] ...2  1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-migration/0-7     [000] d..6  1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-migration/0-7     [000] ...2  1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-kworker/0:1H-17    [000] ...2  1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-migration/0-7     [000] d..6  1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-migration/0-7     [000] ...2  1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-kworker/0:1H-17    [000] ...2  1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-migration/0-7     [000] d..6  1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-migration/0-7     [000] ...2  1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-kworker/0:1H-17    [000] d..4  1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-kworker/0:1H-17    [000] ...2  1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-thermal-engine-557   [000] ...2  1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
-RILSender0-1365  [000] ...2  1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
-MMHandlerThread-7231  [000] ...2  1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
-AsyncTask #1-5750  [000] ...2  1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
-MMHandlerThread-7231  [000] ...2  1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
-MMHandlerThread-7231  [000] ...2  1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
-pandora.android-5395  [000] d..4  1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-pandora.android-5395  [000] ...2  1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-Binder_1-780   [000] ...2  1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
-pandora.android-5395  [000] d..3  1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-pandora.android-5395  [000] ...2  1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-Binder_1-780   [000] d..4  1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
-Binder_1-780   [000] ...2  1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
-Binder_1-878   [000] d..4  1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-Binder_1-878   [000] ...2  1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
-Binder_1-780   [000] ...2  1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
-pandora.android-5395  [000] ...2  1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3     [000] ...2  1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_data_raw b/systrace/catapult/systrace/systrace/test_data/atrace_data_raw
deleted file mode 100644
index 1c8e086..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_data_raw
+++ /dev/null
@@ -1,128 +0,0 @@
-
-# tracer: nop
-#
-# entries-in-buffer/entries-written: 116/116   #P:1
-#
-#                              _-----=> irqs-off
-#                             / _----=> need-resched
-#                            | / _---=> hardirq/softirq
-#                            || / _--=> preempt-depth
-#                            ||| /     delay
-#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
-#              | |       |   ||||       |         |
-          atrace-14446 [000] ...2  1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h5  1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
-            adbd-212   [000] d..4  1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
-            adbd-212   [000] ...2  1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
-            adbd-209   [000] d..4  1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
-            adbd-209   [000] ...2  1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
-            adbd-211   [000] ...2  1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h5  1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
-    sensors.qcom-292   [000] ...2  1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447 [000] d..4  1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447 [000] ...2  1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593  [000] ...2  1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447 [000] d..3  1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447 [000] ...2  1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593  [000] d..4  1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
-    sensors.qcom-1593  [000] ...2  1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
-    sensors.qcom-760   [000] d..4  1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
-    sensors.qcom-760   [000] ...2  1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
-   system_server-782   [000] d..4  1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
-   system_server-782   [000] ...2  1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
-   system_server-785   [000] ...2  1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447 [000] ...3  1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNs6  1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
-     kworker/u:1-21    [000] d..5  1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
-     kworker/u:1-21    [000] ...2  1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557   [000] d..4  1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/0:2H-557   [000] ...2  1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
-      mpdecision-2046  [000] ...2  1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] ...2  1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7     [000] d..6  1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7     [000] ...2  1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] ...2  1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7     [000] d..6  1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7     [000] ...2  1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] ...2  1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7     [000] d..6  1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7     [000] ...2  1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] d..4  1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-    kworker/0:1H-17    [000] ...2  1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557   [000] ...2  1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
-      RILSender0-1365  [000] ...2  1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
-      Thread-625-5750  [000] ...2  1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395  [000] d..4  1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395  [000] ...2  1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780   [000] ...2  1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395  [000] d..3  1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395  [000] ...2  1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780   [000] d..4  1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
-        Binder_1-780   [000] ...2  1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
-        Binder_1-878   [000] d..4  1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-        Binder_1-878   [000] ...2  1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780   [000] ...2  1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395  [000] ...2  1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped b/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped
deleted file mode 100644
index 3261ebf..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped
+++ /dev/null
@@ -1,127 +0,0 @@
-# tracer: nop
-#
-# entries-in-buffer/entries-written: 116/116   #P:1
-#
-#                              _-----=> irqs-off
-#                             / _----=> need-resched
-#                            | / _---=> hardirq/softirq
-#                            || / _--=> preempt-depth
-#                            ||| /     delay
-#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
-#              | |       |   ||||       |         |
-          atrace-14446 [000] ...2  1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h5  1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
-            adbd-212   [000] d..4  1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
-            adbd-212   [000] ...2  1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
-            adbd-209   [000] d..4  1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
-            adbd-209   [000] ...2  1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
-            adbd-211   [000] ...2  1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h5  1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
-    sensors.qcom-292   [000] ...2  1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447 [000] d..4  1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447 [000] ...2  1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593  [000] ...2  1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447 [000] d..3  1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447 [000] ...2  1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593  [000] d..4  1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
-    sensors.qcom-1593  [000] ...2  1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
-    sensors.qcom-760   [000] d..4  1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
-    sensors.qcom-760   [000] ...2  1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
-   system_server-782   [000] d..4  1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
-   system_server-782   [000] ...2  1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
-   system_server-785   [000] ...2  1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447 [000] ...3  1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNs6  1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
-     kworker/u:1-21    [000] d..5  1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
-     kworker/u:1-21    [000] ...2  1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557   [000] d..4  1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/0:2H-557   [000] ...2  1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
-      mpdecision-2046  [000] ...2  1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] ...2  1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7     [000] d..6  1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7     [000] ...2  1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] ...2  1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7     [000] d..6  1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7     [000] ...2  1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] ...2  1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h6  1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7     [000] d..6  1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7     [000] ...2  1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17    [000] d..4  1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-    kworker/0:1H-17    [000] ...2  1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557   [000] ...2  1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
-      RILSender0-1365  [000] ...2  1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
-      Thread-625-5750  [000] ...2  1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] dNh4  1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231  [000] ...2  1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395  [000] d..4  1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395  [000] ...2  1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780   [000] ...2  1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395  [000] d..3  1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395  [000] ...2  1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780   [000] d..4  1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
-        Binder_1-780   [000] ...2  1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
-        Binder_1-878   [000] d..4  1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-        Binder_1-878   [000] ...2  1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780   [000] ...2  1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395  [000] ...2  1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d..4  1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3     [000] ...2  1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0     [000] d.h4  1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
-          <idle>-0     [000] ...2  1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids b/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids
deleted file mode 100644
index 1084fba..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids
+++ /dev/null
@@ -1 +0,0 @@
-{'22503': '18089', '1868': '1772', '10458': '1772', '429': '429', '234': '234', '18956': '18949', '18957': '18949', '18954': '18949', '18955': '18949', '5980': '1370', '344': '344', '345': '345', '346': '346', '340': '340', '341': '341', '342': '342', '343': '343', '3723': '450', '22184': '1760', '349': '349', '411': '406', '2912': '1483', '2913': '1483', '1793': '1772', '1790': '1772', '1797': '1483', '1490': '1393', '1397': '1393', '1492': '1483', '1493': '1483', '1494': '1483', '1495': '1483', '1496': '858', '1497': '1483', '1498': '1483', '18686': '454', '24304': '24304', '1395': '1393', '1068': '1068', '422': '422', '1704': '1500', '5262': '1772', '425': '425', '6654': '1370', '25224': '25224', '424': '424', '868': '858', '1669': '1655', '1668': '1655', '1667': '1655', '1666': '1655', '294': '294', '295': '295', '1663': '1655', '2708': '2579', '1660': '1655', '1129': '1124', '1628': '1483', '3776': '858', '1081': '1079', '1080': '1079', '1124': '1124', '1127': '1124', '270': '270', '271': '271', '272': '272', '273': '273', '274': '274', '275': '275', '276': '276', '277': '277', '278': '278', '279': '279', '25115': '25115', '583': '444', '3386': '858', '11689': '8269', '2544': '1655', '2548': '1655', '524': '450', '525': '450', '526': '450', '527': '450', '520': '450', '521': '450', '522': '450', '523': '450', '1403': '1393', '1402': '1393', '1016': '445', '1017': '445', '1407': '1393', '1406': '1393', '1405': '1393', '1013': '445', '303': '303', '1339': '858', '7516': '858', '1232': '1124', '2445': '1760', '25227': '25227', '442': '442', '2761': '2761', '421': '421', '447': '447', '446': '446', '445': '445', '305': '305', '108': '108', '109': '109', '18101': '18089', '18100': '18089', '8280': '8269', '2102': '1772', '102': '102', '103': '103', '100': '100', '101': '101', '106': '106', '107': '107', '104': '104', '105': '105', '1849': '1500', '1848': '1500', '906': '906', '907': '907', '905': '905', '33': '33', '1842': '1500', '31': '31', '30': '30', '1847': '1500', '1536': '858', '1535': '1393', '246': '246', '1533': '1393', '1532': '1393', '1531': '1500', '21920': '1370', '24281': '24281', '437': '437', '434': '434', '1512': '1500', '2161': '1370', '1940': '1772', '1539': '1458', '2162': '1772', '2615': '1655', '2614': '1760', '2612': '1760', '2611': '2579', '423': '423', '335': '335', '337': '337', '18450': '18089', '331': '331', '19187': '1370', '333': '333', '332': '332', '5136': '1500', '23246': '23233', '2087': '1772', '23240': '23233', '23241': '23233', '23242': '23233', '23243': '23233', '854': '439', '850': '439', '851': '439', '852': '439', '853': '439', '858': '858', '88': '88', '1375': '858', '541': '442', '2688': '2579', '6': '6', '2684': '2579', '2685': '2579', '23398': '1124', '2683': '2579', '49': '49', '846': '439', '1374': '858', '3555': '858', '5424': '445', '99': '99', '98': '98', '2245': '858', '91': '91', '90': '90', '93': '93', '92': '92', '95': '95', '94': '94', '14143': '1760', '96': '96', '1623': '1471', '1622': '1483', '1621': '1483', '5181': '1500', '1627': '1483', '2578': '2558', '1625': '1483', '1624': '1483', '348': '348', '5189': '1500', '5427': '445', '4469': '442', '20228': '18649', '559': '442', '774': '405', '11180': '858', '22758': '18649', '18670': '18649', '238': '238', '239': '239', '24337': '1124', '235': '235', '22751': '18649', '22750': '18649', '236': '236', '22752': '18649', '22755': '18649', '231': '231', '232': '232', '22756': '18649', '1050': '858', '1051': '445', '1052': '858', '237': '237', '230': '230', '233': '233', '2705': '2579', '1692': '1370', '1693': '1500', '2704': '2579', '1754': '1655', '5928': '858', '502': '450', '1579': '1483', '614': '457', '12281': '1772', '4468': '442', '2565': '2558', '1887': '405', '1886': '1500', '1885': '1760', '1438': '445', '1882': '1772', '11048': '1370', '2123': '1370', '80': '80', '1491': '1471', '2082': '1370', '3116': '1772', '3114': '1370', '1288': '1124', '1028': '858', '1470': '1458', '1471': '1471', '1476': '1458', '1475': '1471', '1478': '1471', '1479': '1471', '680': '452', '23200': '23187', '23201': '23187', '2659': '2579', '2711': '2579', '2716': '2579', '1301': '1124', '23206': '23187', '2715': '2579', '2653': '2579', '2652': '2579', '2651': '2579', '2650': '2579', '2657': '2579', '2655': '2579', '873': '871', '23590': '453', '23591': '453', '23593': '453', '498': '450', '499': '436', '135': '135', '134': '134', '494': '450', '495': '450', '218': '218', '497': '450', '490': '450', '491': '450', '492': '450', '493': '450', '24': '24', '2037': '1772', '26': '26', '27': '27', '1836': '1655', '22': '22', '23': '23', '1838': '1655', '1839': '1772', '28': '28', '29': '29', '1370': '1370', '405': '405', '404': '404', '403': '403', '402': '402', '1377': '1370', '451': '451', '1378': '1370', '452': '452', '453': '453', '879': '877', '3': '3', '454': '454', '8298': '8269', '2450': '858', '11274': '8269', '9': '9', '1951': '1772', '456': '456', '2712': '2579', '9701': '858', '23370': '1124', '18969': '18089', '8290': '8269', '18964': '18949', '18962': '18949', '18961': '18949', '371': '364', '370': '364', '372': '372', '821': '442', '820': '442', '1314': '858', '1334': '858', '179': '179', '18665': '18649', '18660': '18649', '18661': '18649', '1483': '1483', '1482': '1471', '1481': '1471', '1480': '1471', '397': '397', '9011': '1772', '1485': '1471', '394': '366', '82': '82', '83': '83', '1489': '1483', '398': '398', '86': '86', '87': '87', '84': '84', '85': '85', '797': '442', '796': '442', '5250': '1500', '1710': '1655', '1716': '1655', '415': '405', '1718': '1655', '799': '442', '7': '7', '1655': '1655', '3214': '1760', '298': '298', '18690': '454', '1133': '1124', '1772': '1772', '1131': '1124', '299': '299', '1137': '1124', '1136': '1124', '1135': '1124', '1134': '1124', '245': '245', '244': '244', '247': '247', '18340': '18089', '241': '241', '3156': '1772', '243': '243', '19309': '1760', '249': '249', '248': '248', '1983': '1772', '1437': '1437', '201': '201', '1430': '1124', '2579': '2579', '2577': '1655', '3213': '1760', '2570': '2558', '519': '450', '518': '450', '1009': '445', '1008': '405', '511': '450', '510': '450', '513': '450', '512': '450', '515': '450', '514': '450', '517': '450', '516': '450', '2594': '2579', '459': '459', '1224': '1124', '2590': '2579', '2591': '2579', '53': '53', '450': '450', '5234': '1471', '2714': '2579', '8058': '1370', '2598': '2579', '1345': '1345', '2453': '1370', '457': '457', '3702': '450', '25228': '465', '8294': '8269', '1870': '1655', '178': '178', '177': '177', '176': '176', '175': '175', '174': '174', '173': '173', '172': '172', '171': '171', '170': '170', '2883': '2883', '3200': '858', '2886': '2883', '3775': '858', '2441': '858', '69': '69', '895': '858', '2888': '2883', '3774': '858', '4463': '442', '1500': '1500', '1501': '1483', '871': '871', '297': '297', '1509': '1500', '6367': '1772', '2626': '2579', '2625': '1760', '2628': '2579', '2629': '2579', '1919': '1500', '1911': '1772', '1910': '1772', '1913': '1772', '1912': '1772', '1915': '1500', '1914': '1772', '23237': '23233', '11': '11', '10': '10', '3086': '1370', '15': '15', '14': '14', '16': '16', '19': '19', '18': '18', '25214': '8269', '862': '858', '865': '858', '5712': '1772', '7568': '858', '866': '858', '18949': '18949', '2699': '2579', '2698': '2579', '2697': '2579', '2694': '2579', '883': '858', '882': '877', '881': '877', '880': '880', '887': '457', '886': '858', '885': '858', '884': '858', '889': '457', '888': '858', '3908': '442', '1972': '1370', '1607': '1483', '1970': '1772', '1011': '445', '11181': '858', '496': '450', '18685': '454', '3234': '1760', '1616': '1500', '1617': '1471', '1614': '1471', '1967': '1772', '1613': '1370', '322': '322', '323': '323', '320': '320', '321': '321', '326': '326', '327': '327', '324': '324', '325': '325', '433': '433', '328': '328', '329': '329', '18655': '18649', '18654': '18649', '18657': '18649', '18656': '18649', '205': '205', '204': '204', '207': '207', '772': '405', '209': '209', '208': '208', '18659': '18649', '18658': '18649', '1340': '858', '77': '77', '3354': '436', '75': '75', '74': '74', '73': '73', '72': '72', '71': '71', '70': '70', '79': '79', '78': '78', '2': '2', '23239': '23233', '20067': '1500', '1040': '858', '1047': '858', '1043': '858', '1045': '858', '1044': '858', '1048': '858', '2235': '1760', '12764': '1760', '3575': '442', '1768': '1760', '1769': '1760', '4122': '442', '1760': '1760', '1766': '1760', '1767': '1760', '1765': '1760', '216': '216', '1268': '1268', '2713': '2579', '1267': '858', '2710': '2579', '13400': '1655', '2096': '1760', '2090': '1772', '2093': '1471', '3170': '858', '4470': '442', '3656': '450', '23233': '23233', '8753': '8269', '2717': '2579', '2524': '1500', '1542': '1458', '2520': '1500', '2486': '1760', '2487': '1760', '2484': '1760', '2485': '1760', '2483': '1760', '1548': '1458', '1549': '1458', '4494': '442', '1469': '1458', '368': '364', '1465': '1458', '8': '8', '1467': '1458', '1466': '1458', '1461': '1458', '2718': '2579', '1463': '1458', '23604': '1760', '869': '858', '1315': '1124', '2719': '2579', '2709': '2579', '2461': '1772', '5148': '1471', '1024': '858', '5146': '1471', '18097': '18089', '2707': '2579', '2706': '2579', '2702': '2579', '1014': '445', '12': '12', '8272': '8269', '18095': '18089', '1015': '445', '13927': '1370', '219': '219', '25219': '25219', '25218': '858', '4230': '436', '777': '405', '5740': '5740', '25181': '25181', '1023': '858', '1825': '1760', '1010': '445', '1827': '1760', '1821': '1500', '1822': '1500', '414': '405', '2069': '1471', '416': '405', '410': '406', '1389': '1370', '412': '406', '413': '406', '1384': '1370', '1385': '1124', '1386': '1370', '361': '361', '1184': '1124', '1382': '1370', '1383': '1370', '319': '319', '318': '318', '18693': '454', '313': '313', '312': '312', '311': '311', '310': '310', '317': '317', '316': '316', '315': '315', '314': '314', '1921': '1772', '1922': '1772', '448': '448', '867': '858', '369': '364', '24678': '24678', '20693': '18089', '784': '784', '808': '442', '2666': '2579', '2667': '2579', '2589': '2579', '2665': '2579', '2662': '2579', '2663': '2579', '2660': '2579', '2661': '2579', '366': '366', '364': '364', '362': '362', '363': '363', '360': '360', '2669': '2579', '440': '440', '12042': '8269', '2664': '2579', '1331': '858', '22782': '1124', '97': '97', '380': '364', '381': '364', '406': '406', '5133': '445', '528': '450', '20': '20', '444': '444', '9009': '1370', '1770': '1760', '4758': '1483', '4759': '1483', '1647': '1483', '5248': '1471', '1725': '1655', '5242': '1471', '5979': '1370', '3610': '437', '1072': '858', '8281': '8269', '1042': '858', '60': '60', '775': '405', '4631': '1483', '259': '259', '64': '64', '65': '65', '66': '66', '67': '67', '252': '252', '253': '253', '250': '250', '251': '251', '256': '256', '257': '257', '254': '254', '255': '255', '2568': '2558', '24358': '1124', '1426': '1124', '1429': '858', '2560': '2558', '1580': '1483', '2562': '2558', '24357': '1124', '24356': '1124', '24355': '1124', '2566': '2558', '1038': '858', '18958': '18949', '508': '450', '509': '450', '506': '450', '507': '450', '504': '450', '505': '450', '23245': '23233', '503': '450', '500': '450', '2001': '1772', '2586': '1655', '1359': '1345', '2584': '2579', '469': '465', '468': '465', '785': '785', '465': '465', '464': '451', '467': '465', '466': '466', '461': '461', '1355': '1345', '1354': '1345', '1861': '1655', '901': '436', '168': '168', '169': '169', '280': '280', '164': '164', '165': '165', '166': '166', '167': '167', '160': '160', '161': '161', '162': '162', '163': '163', '8289': '8269', '1457': '858', '2898': '2883', '864': '858', '2895': '2883', '2894': '2883', '2897': '2883', '2891': '2883', '2890': '2883', '2893': '2883', '2892': '2883', '1454': '858', '529': '450', '2108': '1760', '1519': '1500', '1518': '1500', '32': '32', '2103': '1370', '1514': '1500', '2516': '1471', '286': '286', '1458': '1458', '2106': '1370', '1513': '1500', '2104': '1760', '10168': '8269', '2634': '2579', '8278': '8269', '2631': '2579', '2630': '2579', '2633': '2579', '1097': '858', '23187': '23187', '18765': '858', '1810': '1471', '1811': '1471', '878': '877', '1813': '1471', '876': '871', '877': '877', '874': '871', '875': '871', '872': '872', '6410': '858', '870': '858', '441': '441', '7777': '1655', '7776': '1655', '7775': '1655', '7773': '1655', '10769': '8269', '18764': '858', '890': '457', '891': '858', '892': '858', '893': '858', '894': '858', '438': '438', '896': '858', '897': '436', '899': '858', '439': '439', '3186': '858', '436': '436', '9768': '8269', '63': '63', '1609': '1471', '435': '435', '4155': '442', '18089': '18089', '4158': '442', '25094': '25094', '3220': '1760', '3223': '1760', '3222': '1760', '356': '356', '355': '355', '354': '354', '52': '52', '430': '430', '803': '803', '908': '436', '801': '442', '431': '431', '807': '442', '1788': '1772', '18099': '18089', '18098': '18089', '212': '212', '213': '213', '211': '211', '18093': '18089', '1781': '1772', '18763': '858', '1783': '1772', '1784': '1772', '18096': '18089', '1786': '1772', '18649': '18649', '463': '463', '3329': '1370', '1033': '858', '338': '338', '1775': '1760', '76': '76', '1776': '1772', '1771': '1760', '4702': '1483', '1078': '858', '1079': '1079', '1076': '858', '1077': '858', '1074': '858', '1075': '858', '1779': '1772', '1073': '858', '484': '450', '1071': '858', '289': '289', '288': '288', '3750': '858', '281': '281', '1675': '1655', '283': '283', '282': '282', '285': '285', '284': '284', '287': '287', '1673': '1655', '1094': '858', '1096': '858', '336': '336', '2498': '1772', '330': '330', '263': '263', '262': '262', '261': '261', '260': '260', '267': '267', '266': '266', '265': '265', '264': '264', '59': '59', '269': '269', '268': '268', '18368': '18089', '58': '58', '2550': '1655', '1550': '1393', '2552': '1655', '1552': '1124', '2554': '1655', '1554': '1124', '61': '61', '1559': '1483', '54': '54', '57': '57', '56': '56', '2495': '1772', '2494': '1772', '2497': '1772', '2496': '1772', '2558': '2558', '535': '450', '24912': '24912', '533': '450', '532': '450', '531': '450', '530': '450', '24918': '24918', '1412': '1393', '1415': '858', '539': '466', '538': '461', '1322': '1124', '1323': '1124', '2475': '1760', '2473': '1760', '1327': '1124', '200': '200', '5151': '1458', '5152': '1471', '203': '203', '50': '50', '68': '68', '776': '405', '111': '111', '110': '110', '1907': '1772', '771': '405', '5': '5', '9356': '8269', '1858': '1760', '1859': '1500', '25194': '25194', '5134': '445', '536': '450', '1850': '1500', '16865': '1370', '1852': '1500', '1853': '1500', '1854': '1500', '1857': '1772', '1524': '1500', '534': '450', '1398': '858', '2073': '1471', '2072': '1471', '2071': '1471', '2070': '1471', '1393': '1393', '1392': '1370', '427': '427', '426': '426', '308': '308', '309': '309', '2607': '1655', '2600': '1655', '2602': '2579', '300': '300', '301': '301', '302': '302', '19192': '1370', '304': '304', '2609': '2579', '306': '306', '778': '405', '23253': '23253', '1035': '858', '4114': '436', '4112': '436', '4113': '436', '22382': '22382', '458': '458', '847': '439', '3343': '435', '3462': '442', '296': '296', '55': '55', '18869': '1772', '849': '439', '848': '439', '2671': '2579', '2670': '1760', '2672': '2579', '1428': '858', '24767': '24767', '1581': '405', '7100': '858', '20230': '18649', '62': '62', '81': '81', '487': '450', '240': '240', '258': '258', '2567': '2558', '23400': '23400', '23401': '1124', '1585': '858', '485': '450', '1986': '1760', '1738': '1345', '3216': '1760', '3217': '1760', '1982': '1370', '3211': '1760', '18697': '18649', '1637': '1500', '5232': '1500', '3218': '1760', '3219': '1760', '1737': '1655', '482': '435', '1039': '858', '480': '480', '1046': '858', '3602': '450', '2811': '858', '3604': '437', '1036': '858', '3608': '437', '1041': '858', '242': '242', '2183': '1760', '229': '229', '228': '228', '227': '227', '226': '226', '225': '225', '224': '224', '223': '223', '222': '222', '221': '221', '220': '220', '1025': '858', '393': '393', '1027': '858', '1026': '858', '1021': '445', '2272': '858', '8269': '8269', '1333': '858', '5425': '445', '1187': '1124', '17951': '1760', '5426': '445', '1182': '1124', '3372': '436', '1037': '858', '89': '89', '1034': '858', '1746': '1483', '501': '450', '396': '366', '605': '605', '8172': '858', '2438': '1370', '155': '155', '395': '366', '157': '157', '156': '156', '159': '159', '158': '158', '2585': '1655', '2435': '858', '1898': '1760', '1899': '1500', '8279': '8269', '15349': '8269', '8277': '8269', '8276': '8269', '8275': '8269', '3733': '858', '399': '399', '1892': '1655', '2136': '1772', '2135': '1370', '2132': '1772', '48': '48', '2131': '1370', '46': '46', '47': '47', '44': '44', '45': '45', '42': '42', '40': '40', '41': '41', '1682': '1483', '1443': '1370', '1442': '1370', '1012': '445', '3201': '858', '1449': '858', '477': '450', '2727': '2579', '2649': '2579', '2725': '2579', '5164': '1471', '5165': '1500', '2720': '2579', '2640': '2579', '606': '606', '475': '437', '486': '463', '23198': '23187', '8060': '1772', '488': '450', '23194': '23187', '23195': '23187', '23196': '23187', '23197': '23187', '483': '463', '23191': '23187', '23589': '453', '11310': '1655', '1800': '1483', '3789': '450', '1809': '1471', '1364': '1345', '1365': '1345', '1363': '1345', '1360': '1345', '1851': '1500', '479': '450', '1368': '1345', '3198': '2579'}
\ No newline at end of file
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads b/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads
deleted file mode 100644
index b649fbf..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads
+++ /dev/null
@@ -1 +0,0 @@
-{1: '/init', 2: 'kthreadd', 3: 'ksoftirqd/0', 7: 'kworker/u:0H', 8: 'migration/0', 13: 'khelper', 14: 'netns'}
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids b/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids
deleted file mode 100644
index 92456d5..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids
+++ /dev/null
@@ -1,127 +0,0 @@
-# tracer: nop
-#
-# entries-in-buffer/entries-written: 116/116   #P:1
-#
-#                              _-----=> irqs-off
-#                             / _----=> need-resched
-#                            | / _---=> hardirq/softirq
-#                            || / _--=> preempt-depth
-#                            ||| /     delay
-#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
-#              | |       |   ||||       |         |
-          atrace-14446  (-----) [000] ...2  1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h5  1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
-adbd-212 ( 212) [000] d..4  1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
-adbd-212 ( 212) [000] ...2  1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
-adbd-209 ( 209) [000] d..4  1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
-adbd-209 ( 209) [000] ...2  1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
-adbd-211 ( 211) [000] ...2  1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h5  1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
-    sensors.qcom-292    (-----) [000] ...2  1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447  (-----) [000] d..4  1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447  (-----) [000] ...2  1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593   (-----) [000] ...2  1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447  (-----) [000] d..3  1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447  (-----) [000] ...2  1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593   (-----) [000] d..4  1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
-    sensors.qcom-1593   (-----) [000] ...2  1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
-    sensors.qcom-760    (-----) [000] d..4  1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
-    sensors.qcom-760    (-----) [000] ...2  1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
-   system_server-782    (-----) [000] d..4  1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
-   system_server-782    (-----) [000] ...2  1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
-system_server-785 ( 785) [000] ...2  1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447  (-----) [000] ...3  1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h4  1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231   (-----) [000] ...2  1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h6  1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] dNs6  1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
-     kworker/u:1-21        (-----) [000] d..5  1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
-     kworker/u:1-21        (-----) [000] ...2  1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557       (-----) [000] d..4  1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/0:2H-557       (-----) [000] ...2  1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
-      mpdecision-2046      (-----) [000] ...2  1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] ...2  1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h6  1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-kworker/u:0H-7 ( 7) [000] d..6  1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-kworker/u:0H-7 ( 7) [000] ...2  1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] ...2  1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h6  1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-kworker/u:0H-7 ( 7) [000] d..6  1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-kworker/u:0H-7 ( 7) [000] ...2  1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] ...2  1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h6  1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-kworker/u:0H-7 ( 7) [000] d..6  1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-kworker/u:0H-7 ( 7) [000] ...2  1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] d..4  1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-    kworker/0:1H-17        (-----) [000] ...2  1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557       (-----) [000] ...2  1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] dNh4  1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
-RILSender0-1365 ( 1345) [000] ...2  1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231      (-----) [000] ...2  1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] dNh4  1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
-      Thread-625-5750      (-----) [000] ...2  1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231      (-----) [000] ...2  1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] dNh4  1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231      (-----) [000] ...2  1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395      (-----) [000] d..4  1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395      (-----) [000] ...2  1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780       (-----) [000] ...2  1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395      (-----) [000] d..3  1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395      (-----) [000] ...2  1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780       (-----) [000] d..4  1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
-        Binder_1-780       (-----) [000] ...2  1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
-Binder_1-878 ( 877) [000] d..4  1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-Binder_1-878 ( 877) [000] ...2  1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780       (-----) [000] ...2  1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395      (-----) [000] ...2  1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-ksoftirqd/0-3 ( 3) [000] ...2  1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids b/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids
deleted file mode 100644
index c662482..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids
+++ /dev/null
@@ -1,127 +0,0 @@
-# tracer: nop
-#
-# entries-in-buffer/entries-written: 116/116   #P:1
-#
-#                              _-----=> irqs-off
-#                             / _----=> need-resched
-#                            | / _---=> hardirq/softirq
-#                            || / _--=> preempt-depth
-#                            ||| /     delay
-#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
-#              | |       |   ||||       |         |
-          atrace-14446  (-----) [000] ...2  1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3      (-----) [000] ...2  1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3      (-----) [000] ...2  1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3      (-----) [000] ...2  1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h5  1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
-            adbd-212    (-----) [000] d..4  1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
-            adbd-212    (-----) [000] ...2  1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
-            adbd-209    (-----) [000] d..4  1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
-            adbd-209    (-----) [000] ...2  1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
-            adbd-211    (-----) [000] ...2  1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h5  1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
-    sensors.qcom-292    (-----) [000] ...2  1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447  (-----) [000] d..4  1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447  (-----) [000] ...2  1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593   (-----) [000] ...2  1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447  (-----) [000] d..3  1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
-    sensors.qcom-14447  (-----) [000] ...2  1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
-    sensors.qcom-1593   (-----) [000] d..4  1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
-    sensors.qcom-1593   (-----) [000] ...2  1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
-    sensors.qcom-760    (-----) [000] d..4  1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
-    sensors.qcom-760    (-----) [000] ...2  1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
-   system_server-782    (-----) [000] d..4  1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
-   system_server-782    (-----) [000] ...2  1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
-   system_server-785    (-----) [000] ...2  1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
-    sensors.qcom-14447  (-----) [000] ...3  1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3      (-----) [000] ...2  1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3      (-----) [000] ...2  1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d..4  1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3      (-----) [000] ...2  1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h4  1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231   (-----) [000] ...2  1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0      (-----) [000] d.h6  1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
-          <idle>-0      (-----) [000] dNs6  1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-          <idle>-0      (-----) [000] ...2  1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
-     kworker/u:1-21        (-----) [000] d..5  1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
-     kworker/u:1-21        (-----) [000] ...2  1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557       (-----) [000] d..4  1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/0:2H-557       (-----) [000] ...2  1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
-      mpdecision-2046      (-----) [000] ...2  1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] ...2  1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3         (-----) [000] ...2  1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3         (-----) [000] ...2  1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3         (-----) [000] ...2  1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h6  1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7         (-----) [000] d..6  1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7         (-----) [000] ...2  1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] ...2  1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h6  1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7         (-----) [000] d..6  1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7         (-----) [000] ...2  1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] ...2  1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h6  1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
-    kworker/u:0H-7         (-----) [000] d..6  1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
-    kworker/u:0H-7         (-----) [000] ...2  1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
-    kworker/0:1H-17        (-----) [000] d..4  1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
-    kworker/0:1H-17        (-----) [000] ...2  1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
-    kworker/0:2H-557       (-----) [000] ...2  1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] dNh4  1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
-      RILSender0-1365      (-----) [000] ...2  1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231      (-----) [000] ...2  1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] dNh4  1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
-      Thread-625-5750      (-----) [000] ...2  1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231      (-----) [000] ...2  1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] dNh4  1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
- MMHandlerThread-7231      (-----) [000] ...2  1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395      (-----) [000] d..4  1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395      (-----) [000] ...2  1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780       (-----) [000] ...2  1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395      (-----) [000] d..3  1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
- pandora.android-5395      (-----) [000] ...2  1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780       (-----) [000] d..4  1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
-        Binder_1-780       (-----) [000] ...2  1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
-        Binder_1-878       (-----) [000] d..4  1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
-        Binder_1-878       (-----) [000] ...2  1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
-        Binder_1-780       (-----) [000] ...2  1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
- pandora.android-5395      (-----) [000] ...2  1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3         (-----) [000] ...2  1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3         (-----) [000] ...2  1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d..4  1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
-     ksoftirqd/0-3         (-----) [000] ...2  1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
-          <idle>-0         (-----) [000] d.h4  1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
-          <idle>-0         (-----) [000] ...2  1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump b/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump
deleted file mode 100644
index f1f0c76..0000000
--- a/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump
+++ /dev/null
@@ -1,1156 +0,0 @@
-proc/1/task/1
-/proc/10/task/10
-/proc/100/task/100
-/proc/101/task/101
-/proc/102/task/102
-/proc/103/task/103
-/proc/104/task/104
-/proc/105/task/105
-/proc/106/task/106
-/proc/1068/task/1068
-/proc/107/task/107
-/proc/1079/task/1079
-/proc/1079/task/1080
-/proc/1079/task/1081
-/proc/108/task/108
-/proc/109/task/109
-/proc/11/task/11
-/proc/110/task/110
-/proc/111/task/111
-/proc/1124/task/1124
-/proc/1124/task/1127
-/proc/1124/task/1129
-/proc/1124/task/1131
-/proc/1124/task/1133
-/proc/1124/task/1134
-/proc/1124/task/1135
-/proc/1124/task/1136
-/proc/1124/task/1137
-/proc/1124/task/1182
-/proc/1124/task/1184
-/proc/1124/task/1187
-/proc/1124/task/1224
-/proc/1124/task/1232
-/proc/1124/task/1288
-/proc/1124/task/1301
-/proc/1124/task/1315
-/proc/1124/task/1322
-/proc/1124/task/1323
-/proc/1124/task/1327
-/proc/1124/task/1385
-/proc/1124/task/1426
-/proc/1124/task/1430
-/proc/1124/task/1552
-/proc/1124/task/1554
-/proc/1124/task/22782
-/proc/1124/task/23370
-/proc/1124/task/23398
-/proc/1124/task/23401
-/proc/1124/task/24337
-/proc/1124/task/24355
-/proc/1124/task/24356
-/proc/1124/task/24357
-/proc/1124/task/24358
-/proc/12/task/12
-/proc/1268/task/1268
-/proc/134/task/134
-/proc/1345/task/1345
-/proc/1345/task/1354
-/proc/1345/task/1355
-/proc/1345/task/1359
-/proc/1345/task/1360
-/proc/1345/task/1363
-/proc/1345/task/1364
-/proc/1345/task/1365
-/proc/1345/task/1368
-/proc/1345/task/1738
-/proc/135/task/135
-/proc/1370/task/11048
-/proc/1370/task/1370
-/proc/1370/task/1377
-/proc/1370/task/1378
-/proc/1370/task/1382
-/proc/1370/task/1383
-/proc/1370/task/1384
-/proc/1370/task/1386
-/proc/1370/task/1389
-/proc/1370/task/1392
-/proc/1370/task/13927
-/proc/1370/task/1442
-/proc/1370/task/1443
-/proc/1370/task/1613
-/proc/1370/task/16865
-/proc/1370/task/1692
-/proc/1370/task/19187
-/proc/1370/task/19192
-/proc/1370/task/1972
-/proc/1370/task/1982
-/proc/1370/task/2082
-/proc/1370/task/2103
-/proc/1370/task/2106
-/proc/1370/task/2123
-/proc/1370/task/2131
-/proc/1370/task/2135
-/proc/1370/task/2161
-/proc/1370/task/21920
-/proc/1370/task/2438
-/proc/1370/task/2453
-/proc/1370/task/3086
-/proc/1370/task/3114
-/proc/1370/task/3329
-/proc/1370/task/5979
-/proc/1370/task/5980
-/proc/1370/task/6654
-/proc/1370/task/8058
-/proc/1370/task/9009
-/proc/1393/task/1393
-/proc/1393/task/1395
-/proc/1393/task/1397
-/proc/1393/task/1402
-/proc/1393/task/1403
-/proc/1393/task/1405
-/proc/1393/task/1406
-/proc/1393/task/1407
-/proc/1393/task/1412
-/proc/1393/task/1490
-/proc/1393/task/1532
-/proc/1393/task/1533
-/proc/1393/task/1535
-/proc/1393/task/1550
-/proc/14/task/14
-/proc/1437/task/1437
-/proc/1458/task/1458
-/proc/1458/task/1461
-/proc/1458/task/1463
-/proc/1458/task/1465
-/proc/1458/task/1466
-/proc/1458/task/1467
-/proc/1458/task/1469
-/proc/1458/task/1470
-/proc/1458/task/1476
-/proc/1458/task/1539
-/proc/1458/task/1542
-/proc/1458/task/1548
-/proc/1458/task/1549
-/proc/1458/task/5151
-/proc/1471/task/1471
-/proc/1471/task/1475
-/proc/1471/task/1478
-/proc/1471/task/1479
-/proc/1471/task/1480
-/proc/1471/task/1481
-/proc/1471/task/1482
-/proc/1471/task/1485
-/proc/1471/task/1491
-/proc/1471/task/1609
-/proc/1471/task/1614
-/proc/1471/task/1617
-/proc/1471/task/1623
-/proc/1471/task/1809
-/proc/1471/task/1810
-/proc/1471/task/1811
-/proc/1471/task/1813
-/proc/1471/task/2069
-/proc/1471/task/2070
-/proc/1471/task/2071
-/proc/1471/task/2072
-/proc/1471/task/2073
-/proc/1471/task/2093
-/proc/1471/task/2516
-/proc/1471/task/5146
-/proc/1471/task/5148
-/proc/1471/task/5152
-/proc/1471/task/5164
-/proc/1471/task/5234
-/proc/1471/task/5242
-/proc/1471/task/5248
-/proc/1483/task/1483
-/proc/1483/task/1489
-/proc/1483/task/1492
-/proc/1483/task/1493
-/proc/1483/task/1494
-/proc/1483/task/1495
-/proc/1483/task/1497
-/proc/1483/task/1498
-/proc/1483/task/1501
-/proc/1483/task/1559
-/proc/1483/task/1579
-/proc/1483/task/1580
-/proc/1483/task/1607
-/proc/1483/task/1621
-/proc/1483/task/1622
-/proc/1483/task/1624
-/proc/1483/task/1625
-/proc/1483/task/1627
-/proc/1483/task/1628
-/proc/1483/task/1647
-/proc/1483/task/1682
-/proc/1483/task/1746
-/proc/1483/task/1797
-/proc/1483/task/1800
-/proc/1483/task/2912
-/proc/1483/task/2913
-/proc/1483/task/4631
-/proc/1483/task/4702
-/proc/1483/task/4758
-/proc/1483/task/4759
-/proc/15/task/15
-/proc/1500/task/1500
-/proc/1500/task/1509
-/proc/1500/task/1512
-/proc/1500/task/1513
-/proc/1500/task/1514
-/proc/1500/task/1518
-/proc/1500/task/1519
-/proc/1500/task/1524
-/proc/1500/task/1531
-/proc/1500/task/1616
-/proc/1500/task/1637
-/proc/1500/task/1693
-/proc/1500/task/1704
-/proc/1500/task/1821
-/proc/1500/task/1822
-/proc/1500/task/1842
-/proc/1500/task/1847
-/proc/1500/task/1848
-/proc/1500/task/1849
-/proc/1500/task/1850
-/proc/1500/task/1851
-/proc/1500/task/1852
-/proc/1500/task/1853
-/proc/1500/task/1854
-/proc/1500/task/1859
-/proc/1500/task/1886
-/proc/1500/task/1899
-/proc/1500/task/1915
-/proc/1500/task/1919
-/proc/1500/task/20067
-/proc/1500/task/2520
-/proc/1500/task/2524
-/proc/1500/task/5136
-/proc/1500/task/5165
-/proc/1500/task/5181
-/proc/1500/task/5189
-/proc/1500/task/5232
-/proc/1500/task/5250
-/proc/155/task/155
-/proc/156/task/156
-/proc/157/task/157
-/proc/158/task/158
-/proc/159/task/159
-/proc/16/task/16
-/proc/160/task/160
-/proc/161/task/161
-/proc/162/task/162
-/proc/163/task/163
-/proc/164/task/164
-/proc/165/task/165
-/proc/1655/task/11310
-/proc/1655/task/13400
-/proc/1655/task/1655
-/proc/1655/task/1660
-/proc/1655/task/1663
-/proc/1655/task/1666
-/proc/1655/task/1667
-/proc/1655/task/1668
-/proc/1655/task/1669
-/proc/1655/task/1673
-/proc/1655/task/1675
-/proc/1655/task/1710
-/proc/1655/task/1716
-/proc/1655/task/1718
-/proc/1655/task/1725
-/proc/1655/task/1737
-/proc/1655/task/1754
-/proc/1655/task/1836
-/proc/1655/task/1838
-/proc/1655/task/1861
-/proc/1655/task/1870
-/proc/1655/task/1892
-/proc/1655/task/2544
-/proc/1655/task/2548
-/proc/1655/task/2550
-/proc/1655/task/2552
-/proc/1655/task/2554
-/proc/1655/task/2577
-/proc/1655/task/2585
-/proc/1655/task/2586
-/proc/1655/task/2600
-/proc/1655/task/2607
-/proc/1655/task/2615
-/proc/1655/task/7773
-/proc/1655/task/7775
-/proc/1655/task/7776
-/proc/1655/task/7777
-/proc/166/task/166
-/proc/167/task/167
-/proc/168/task/168
-/proc/169/task/169
-/proc/170/task/170
-/proc/171/task/171
-/proc/172/task/172
-/proc/173/task/173
-/proc/174/task/174
-/proc/175/task/175
-/proc/176/task/176
-/proc/1760/task/12764
-/proc/1760/task/14143
-/proc/1760/task/1760
-/proc/1760/task/1765
-/proc/1760/task/1766
-/proc/1760/task/1767
-/proc/1760/task/1768
-/proc/1760/task/1769
-/proc/1760/task/1770
-/proc/1760/task/1771
-/proc/1760/task/1775
-/proc/1760/task/17951
-/proc/1760/task/1825
-/proc/1760/task/1827
-/proc/1760/task/1858
-/proc/1760/task/1885
-/proc/1760/task/1898
-/proc/1760/task/19309
-/proc/1760/task/1986
-/proc/1760/task/2096
-/proc/1760/task/2104
-/proc/1760/task/2108
-/proc/1760/task/2183
-/proc/1760/task/22184
-/proc/1760/task/2235
-/proc/1760/task/23604
-/proc/1760/task/2445
-/proc/1760/task/2473
-/proc/1760/task/2475
-/proc/1760/task/2483
-/proc/1760/task/2484
-/proc/1760/task/2485
-/proc/1760/task/2486
-/proc/1760/task/2487
-/proc/1760/task/2612
-/proc/1760/task/2614
-/proc/1760/task/2625
-/proc/1760/task/2670
-/proc/1760/task/3211
-/proc/1760/task/3213
-/proc/1760/task/3214
-/proc/1760/task/3216
-/proc/1760/task/3217
-/proc/1760/task/3218
-/proc/1760/task/3219
-/proc/1760/task/3220
-/proc/1760/task/3222
-/proc/1760/task/3223
-/proc/1760/task/3234
-/proc/177/task/177
-/proc/1772/task/10458
-/proc/1772/task/12281
-/proc/1772/task/1772
-/proc/1772/task/1776
-/proc/1772/task/1779
-/proc/1772/task/1781
-/proc/1772/task/1783
-/proc/1772/task/1784
-/proc/1772/task/1786
-/proc/1772/task/1788
-/proc/1772/task/1790
-/proc/1772/task/1793
-/proc/1772/task/1839
-/proc/1772/task/1857
-/proc/1772/task/1868
-/proc/1772/task/1882
-/proc/1772/task/18869
-/proc/1772/task/1907
-/proc/1772/task/1910
-/proc/1772/task/1911
-/proc/1772/task/1912
-/proc/1772/task/1913
-/proc/1772/task/1914
-/proc/1772/task/1921
-/proc/1772/task/1922
-/proc/1772/task/1940
-/proc/1772/task/1951
-/proc/1772/task/1967
-/proc/1772/task/1970
-/proc/1772/task/1983
-/proc/1772/task/2001
-/proc/1772/task/2037
-/proc/1772/task/2087
-/proc/1772/task/2090
-/proc/1772/task/2102
-/proc/1772/task/2132
-/proc/1772/task/2136
-/proc/1772/task/2162
-/proc/1772/task/2461
-/proc/1772/task/2494
-/proc/1772/task/2495
-/proc/1772/task/2496
-/proc/1772/task/2497
-/proc/1772/task/2498
-/proc/1772/task/3116
-/proc/1772/task/3156
-/proc/1772/task/5262
-/proc/1772/task/5712
-/proc/1772/task/6367
-/proc/1772/task/8060
-/proc/1772/task/9011
-/proc/178/task/178
-/proc/179/task/179
-/proc/18/task/18
-/proc/18089/task/18089
-/proc/18089/task/18093
-/proc/18089/task/18095
-/proc/18089/task/18096
-/proc/18089/task/18097
-/proc/18089/task/18098
-/proc/18089/task/18099
-/proc/18089/task/18100
-/proc/18089/task/18101
-/proc/18089/task/18340
-/proc/18089/task/18368
-/proc/18089/task/18450
-/proc/18089/task/18969
-/proc/18089/task/20693
-/proc/18089/task/22503
-/proc/18649/task/18649
-/proc/18649/task/18654
-/proc/18649/task/18655
-/proc/18649/task/18656
-/proc/18649/task/18657
-/proc/18649/task/18658
-/proc/18649/task/18659
-/proc/18649/task/18660
-/proc/18649/task/18661
-/proc/18649/task/18665
-/proc/18649/task/18670
-/proc/18649/task/18697
-/proc/18649/task/20228
-/proc/18649/task/20230
-/proc/18649/task/22750
-/proc/18649/task/22751
-/proc/18649/task/22752
-/proc/18649/task/22755
-/proc/18649/task/22756
-/proc/18649/task/22758
-/proc/18949/task/18949
-/proc/18949/task/18954
-/proc/18949/task/18955
-/proc/18949/task/18956
-/proc/18949/task/18957
-/proc/18949/task/18958
-/proc/18949/task/18961
-/proc/18949/task/18962
-/proc/18949/task/18964
-/proc/19/task/19
-/proc/2/task/2
-/proc/20/task/20
-/proc/200/task/200
-/proc/201/task/201
-/proc/203/task/203
-/proc/204/task/204
-/proc/205/task/205
-/proc/207/task/207
-/proc/208/task/208
-/proc/209/task/209
-/proc/211/task/211
-/proc/212/task/212
-/proc/213/task/213
-/proc/216/task/216
-/proc/218/task/218
-/proc/219/task/219
-/proc/22/task/22
-/proc/220/task/220
-/proc/221/task/221
-/proc/222/task/222
-/proc/223/task/223
-/proc/22382/task/22382
-/proc/224/task/224
-/proc/225/task/225
-/proc/226/task/226
-/proc/227/task/227
-/proc/228/task/228
-/proc/229/task/229
-/proc/23/task/23
-/proc/230/task/230
-/proc/231/task/231
-/proc/23187/task/23187
-/proc/23187/task/23191
-/proc/23187/task/23194
-/proc/23187/task/23195
-/proc/23187/task/23196
-/proc/23187/task/23197
-/proc/23187/task/23198
-/proc/23187/task/23200
-/proc/23187/task/23201
-/proc/23187/task/23206
-/proc/232/task/232
-/proc/23233/task/23233
-/proc/23233/task/23237
-/proc/23233/task/23239
-/proc/23233/task/23240
-/proc/23233/task/23241
-/proc/23233/task/23242
-/proc/23233/task/23243
-/proc/23233/task/23245
-/proc/23233/task/23246
-/proc/23253/task/23253
-/proc/233/task/233
-/proc/234/task/234
-/proc/23400/task/23400
-/proc/235/task/235
-/proc/236/task/236
-/proc/237/task/237
-/proc/238/task/238
-/proc/239/task/239
-/proc/24/task/24
-/proc/240/task/240
-/proc/241/task/241
-/proc/242/task/242
-/proc/24281/task/24281
-/proc/243/task/243
-/proc/24304/task/24304
-/proc/244/task/244
-/proc/245/task/245
-/proc/246/task/246
-/proc/24678/task/24678
-/proc/247/task/247
-/proc/24767/task/24767
-/proc/248/task/248
-/proc/249/task/249
-/proc/24912/task/24912
-/proc/24918/task/24918
-/proc/250/task/250
-/proc/25094/task/25094
-/proc/251/task/251
-/proc/25115/task/25115
-/proc/25181/task/25181
-/proc/25194/task/25194
-/proc/252/task/252
-/proc/25219/task/25219
-/proc/25224/task/25224
-/proc/25227/task/25227
-/proc/253/task/253
-/proc/254/task/254
-/proc/255/task/255
-/proc/2558/task/2558
-/proc/2558/task/2560
-/proc/2558/task/2562
-/proc/2558/task/2565
-/proc/2558/task/2566
-/proc/2558/task/2567
-/proc/2558/task/2568
-/proc/2558/task/2570
-/proc/2558/task/2578
-/proc/256/task/256
-/proc/257/task/257
-/proc/2579/task/2579
-/proc/2579/task/2584
-/proc/2579/task/2589
-/proc/2579/task/2590
-/proc/2579/task/2591
-/proc/2579/task/2594
-/proc/2579/task/2598
-/proc/2579/task/2602
-/proc/2579/task/2609
-/proc/2579/task/2611
-/proc/2579/task/2626
-/proc/2579/task/2628
-/proc/2579/task/2629
-/proc/2579/task/2630
-/proc/2579/task/2631
-/proc/2579/task/2633
-/proc/2579/task/2634
-/proc/2579/task/2640
-/proc/2579/task/2649
-/proc/2579/task/2650
-/proc/2579/task/2651
-/proc/2579/task/2652
-/proc/2579/task/2653
-/proc/2579/task/2655
-/proc/2579/task/2657
-/proc/2579/task/2659
-/proc/2579/task/2660
-/proc/2579/task/2661
-/proc/2579/task/2662
-/proc/2579/task/2663
-/proc/2579/task/2664
-/proc/2579/task/2665
-/proc/2579/task/2666
-/proc/2579/task/2667
-/proc/2579/task/2669
-/proc/2579/task/2671
-/proc/2579/task/2672
-/proc/2579/task/2683
-/proc/2579/task/2684
-/proc/2579/task/2685
-/proc/2579/task/2688
-/proc/2579/task/2694
-/proc/2579/task/2697
-/proc/2579/task/2698
-/proc/2579/task/2699
-/proc/2579/task/2702
-/proc/2579/task/2704
-/proc/2579/task/2705
-/proc/2579/task/2706
-/proc/2579/task/2707
-/proc/2579/task/2708
-/proc/2579/task/2709
-/proc/2579/task/2710
-/proc/2579/task/2711
-/proc/2579/task/2712
-/proc/2579/task/2713
-/proc/2579/task/2714
-/proc/2579/task/2715
-/proc/2579/task/2716
-/proc/2579/task/2717
-/proc/2579/task/2718
-/proc/2579/task/2719
-/proc/2579/task/2720
-/proc/2579/task/2725
-/proc/2579/task/2727
-/proc/2579/task/3198
-/proc/258/task/258
-/proc/259/task/259
-/proc/26/task/26
-/proc/260/task/260
-/proc/261/task/261
-/proc/262/task/262
-/proc/263/task/263
-/proc/264/task/264
-/proc/265/task/265
-/proc/266/task/266
-/proc/267/task/267
-/proc/268/task/268
-/proc/269/task/269
-/proc/27/task/27
-/proc/270/task/270
-/proc/271/task/271
-/proc/272/task/272
-/proc/273/task/273
-/proc/274/task/274
-/proc/275/task/275
-/proc/276/task/276
-/proc/2761/task/2761
-/proc/277/task/277
-/proc/278/task/278
-/proc/279/task/279
-/proc/28/task/28
-/proc/280/task/280
-/proc/281/task/281
-/proc/282/task/282
-/proc/283/task/283
-/proc/284/task/284
-/proc/285/task/285
-/proc/286/task/286
-/proc/287/task/287
-/proc/288/task/288
-/proc/2883/task/2883
-/proc/2883/task/2886
-/proc/2883/task/2888
-/proc/2883/task/2890
-/proc/2883/task/2891
-/proc/2883/task/2892
-/proc/2883/task/2893
-/proc/2883/task/2894
-/proc/2883/task/2895
-/proc/2883/task/2897
-/proc/2883/task/2898
-/proc/289/task/289
-/proc/29/task/29
-/proc/294/task/294
-/proc/295/task/295
-/proc/296/task/296
-/proc/297/task/297
-/proc/298/task/298
-/proc/299/task/299
-/proc/3/task/3
-/proc/30/task/30
-/proc/300/task/300
-/proc/301/task/301
-/proc/302/task/302
-/proc/303/task/303
-/proc/304/task/304
-/proc/305/task/305
-/proc/306/task/306
-/proc/308/task/308
-/proc/309/task/309
-/proc/31/task/31
-/proc/310/task/310
-/proc/311/task/311
-/proc/312/task/312
-/proc/313/task/313
-/proc/314/task/314
-/proc/315/task/315
-/proc/316/task/316
-/proc/317/task/317
-/proc/318/task/318
-/proc/319/task/319
-/proc/32/task/32
-/proc/320/task/320
-/proc/321/task/321
-/proc/322/task/322
-/proc/323/task/323
-/proc/324/task/324
-/proc/325/task/325
-/proc/326/task/326
-/proc/327/task/327
-/proc/328/task/328
-/proc/329/task/329
-/proc/33/task/33
-/proc/330/task/330
-/proc/331/task/331
-/proc/332/task/332
-/proc/333/task/333
-/proc/335/task/335
-/proc/336/task/336
-/proc/337/task/337
-/proc/338/task/338
-/proc/340/task/340
-/proc/341/task/341
-/proc/342/task/342
-/proc/343/task/343
-/proc/344/task/344
-/proc/345/task/345
-/proc/346/task/346
-/proc/348/task/348
-/proc/349/task/349
-/proc/354/task/354
-/proc/355/task/355
-/proc/356/task/356
-/proc/360/task/360
-/proc/361/task/361
-/proc/362/task/362
-/proc/363/task/363
-/proc/364/task/364
-/proc/364/task/368
-/proc/364/task/369
-/proc/364/task/370
-/proc/364/task/371
-/proc/364/task/380
-/proc/364/task/381
-/proc/366/task/366
-/proc/366/task/394
-/proc/366/task/395
-/proc/366/task/396
-/proc/372/task/372
-/proc/393/task/393
-/proc/397/task/397
-/proc/398/task/398
-/proc/399/task/399
-/proc/40/task/40
-/proc/402/task/402
-/proc/403/task/403
-/proc/404/task/404
-/proc/405/task/1008
-/proc/405/task/1581
-/proc/405/task/1887
-/proc/405/task/405
-/proc/405/task/414
-/proc/405/task/415
-/proc/405/task/416
-/proc/405/task/771
-/proc/405/task/772
-/proc/405/task/774
-/proc/405/task/775
-/proc/405/task/776
-/proc/405/task/777
-/proc/405/task/778
-/proc/406/task/406
-/proc/406/task/410
-/proc/406/task/411
-/proc/406/task/412
-/proc/406/task/413
-/proc/41/task/41
-/proc/42/task/42
-/proc/421/task/421
-/proc/422/task/422
-/proc/423/task/423
-/proc/424/task/424
-/proc/425/task/425
-/proc/426/task/426
-/proc/427/task/427
-/proc/429/task/429
-/proc/430/task/430
-/proc/431/task/431
-/proc/433/task/433
-/proc/434/task/434
-/proc/435/task/3343
-/proc/435/task/435
-/proc/435/task/482
-/proc/436/task/3354
-/proc/436/task/3372
-/proc/436/task/4112
-/proc/436/task/4113
-/proc/436/task/4114
-/proc/436/task/4230
-/proc/436/task/436
-/proc/436/task/499
-/proc/436/task/897
-/proc/436/task/901
-/proc/436/task/908
-/proc/437/task/3604
-/proc/437/task/3608
-/proc/437/task/3610
-/proc/437/task/437
-/proc/437/task/475
-/proc/438/task/438
-/proc/439/task/439
-/proc/439/task/846
-/proc/439/task/847
-/proc/439/task/848
-/proc/439/task/849
-/proc/439/task/850
-/proc/439/task/851
-/proc/439/task/852
-/proc/439/task/853
-/proc/439/task/854
-/proc/44/task/44
-/proc/440/task/440
-/proc/441/task/441
-/proc/442/task/3462
-/proc/442/task/3575
-/proc/442/task/3908
-/proc/442/task/4122
-/proc/442/task/4155
-/proc/442/task/4158
-/proc/442/task/442
-/proc/442/task/4463
-/proc/442/task/4468
-/proc/442/task/4469
-/proc/442/task/4470
-/proc/442/task/4494
-/proc/442/task/541
-/proc/442/task/559
-/proc/442/task/796
-/proc/442/task/797
-/proc/442/task/799
-/proc/442/task/801
-/proc/442/task/807
-/proc/442/task/808
-/proc/442/task/820
-/proc/442/task/821
-/proc/444/task/444
-/proc/444/task/583
-/proc/445/task/1009
-/proc/445/task/1010
-/proc/445/task/1011
-/proc/445/task/1012
-/proc/445/task/1013
-/proc/445/task/1014
-/proc/445/task/1015
-/proc/445/task/1016
-/proc/445/task/1017
-/proc/445/task/1021
-/proc/445/task/1051
-/proc/445/task/1438
-/proc/445/task/445
-/proc/445/task/5133
-/proc/445/task/5134
-/proc/445/task/5424
-/proc/445/task/5425
-/proc/445/task/5426
-/proc/445/task/5427
-/proc/446/task/446
-/proc/447/task/447
-/proc/448/task/448
-/proc/45/task/45
-/proc/450/task/3602
-/proc/450/task/3656
-/proc/450/task/3702
-/proc/450/task/3723
-/proc/450/task/3789
-/proc/450/task/450
-/proc/450/task/477
-/proc/450/task/479
-/proc/450/task/484
-/proc/450/task/485
-/proc/450/task/487
-/proc/450/task/488
-/proc/450/task/490
-/proc/450/task/491
-/proc/450/task/492
-/proc/450/task/493
-/proc/450/task/494
-/proc/450/task/495
-/proc/450/task/496
-/proc/450/task/497
-/proc/450/task/498
-/proc/450/task/500
-/proc/450/task/501
-/proc/450/task/502
-/proc/450/task/503
-/proc/450/task/504
-/proc/450/task/505
-/proc/450/task/506
-/proc/450/task/507
-/proc/450/task/508
-/proc/450/task/509
-/proc/450/task/510
-/proc/450/task/511
-/proc/450/task/512
-/proc/450/task/513
-/proc/450/task/514
-/proc/450/task/515
-/proc/450/task/516
-/proc/450/task/517
-/proc/450/task/518
-/proc/450/task/519
-/proc/450/task/520
-/proc/450/task/521
-/proc/450/task/522
-/proc/450/task/523
-/proc/450/task/524
-/proc/450/task/525
-/proc/450/task/526
-/proc/450/task/527
-/proc/450/task/528
-/proc/450/task/529
-/proc/450/task/530
-/proc/450/task/531
-/proc/450/task/532
-/proc/450/task/533
-/proc/450/task/534
-/proc/450/task/535
-/proc/450/task/536
-/proc/451/task/451
-/proc/451/task/464
-/proc/452/task/452
-/proc/452/task/680
-/proc/453/task/23589
-/proc/453/task/23590
-/proc/453/task/23591
-/proc/453/task/23593
-/proc/453/task/453
-/proc/454/task/18685
-/proc/454/task/18686
-/proc/454/task/18690
-/proc/454/task/18693
-/proc/454/task/454
-/proc/456/task/456
-/proc/457/task/457
-/proc/457/task/614
-/proc/457/task/887
-/proc/457/task/889
-/proc/457/task/890
-/proc/458/task/458
-/proc/459/task/459
-/proc/46/task/46
-/proc/461/task/461
-/proc/461/task/538
-/proc/463/task/463
-/proc/463/task/483
-/proc/463/task/486
-/proc/465/task/25228
-/proc/465/task/465
-/proc/465/task/467
-/proc/465/task/468
-/proc/465/task/469
-/proc/466/task/466
-/proc/466/task/539
-/proc/47/task/47
-/proc/48/task/48
-/proc/480/task/480
-/proc/49/task/49
-/proc/5/task/5
-/proc/50/task/50
-/proc/52/task/52
-/proc/53/task/53
-/proc/54/task/54
-/proc/55/task/55
-/proc/56/task/56
-/proc/57/task/57
-/proc/5740/task/5740
-/proc/58/task/58
-/proc/59/task/59
-/proc/6/task/6
-/proc/60/task/60
-/proc/605/task/605
-/proc/606/task/606
-/proc/61/task/61
-/proc/62/task/62
-/proc/63/task/63
-/proc/64/task/64
-/proc/65/task/65
-/proc/66/task/66
-/proc/67/task/67
-/proc/68/task/68
-/proc/69/task/69
-/proc/7/task/7
-/proc/70/task/70
-/proc/71/task/71
-/proc/72/task/72
-/proc/73/task/73
-/proc/74/task/74
-/proc/75/task/75
-/proc/76/task/76
-/proc/77/task/77
-/proc/78/task/78
-/proc/784/task/784
-/proc/785/task/785
-/proc/79/task/79
-/proc/8/task/8
-/proc/80/task/80
-/proc/803/task/803
-/proc/81/task/81
-/proc/82/task/82
-/proc/8269/task/10168
-/proc/8269/task/10769
-/proc/8269/task/11274
-/proc/8269/task/11689
-/proc/8269/task/12042
-/proc/8269/task/15349
-/proc/8269/task/25214
-/proc/8269/task/8269
-/proc/8269/task/8272
-/proc/8269/task/8275
-/proc/8269/task/8276
-/proc/8269/task/8277
-/proc/8269/task/8278
-/proc/8269/task/8279
-/proc/8269/task/8280
-/proc/8269/task/8281
-/proc/8269/task/8289
-/proc/8269/task/8290
-/proc/8269/task/8294
-/proc/8269/task/8298
-/proc/8269/task/8753
-/proc/8269/task/9356
-/proc/8269/task/9768
-/proc/83/task/83
-/proc/84/task/84
-/proc/85/task/85
-/proc/858/task/1023
-/proc/858/task/1024
-/proc/858/task/1025
-/proc/858/task/1026
-/proc/858/task/1027
-/proc/858/task/1028
-/proc/858/task/1033
-/proc/858/task/1034
-/proc/858/task/1035
-/proc/858/task/1036
-/proc/858/task/1037
-/proc/858/task/1038
-/proc/858/task/1039
-/proc/858/task/1040
-/proc/858/task/1041
-/proc/858/task/1042
-/proc/858/task/1043
-/proc/858/task/1044
-/proc/858/task/1045
-/proc/858/task/1046
-/proc/858/task/1047
-/proc/858/task/1048
-/proc/858/task/1050
-/proc/858/task/1052
-/proc/858/task/1071
-/proc/858/task/1072
-/proc/858/task/1073
-/proc/858/task/1074
-/proc/858/task/1075
-/proc/858/task/1076
-/proc/858/task/1077
-/proc/858/task/1078
-/proc/858/task/1094
-/proc/858/task/1096
-/proc/858/task/1097
-/proc/858/task/11180
-/proc/858/task/11181
-/proc/858/task/1267
-/proc/858/task/1314
-/proc/858/task/1331
-/proc/858/task/1333
-/proc/858/task/1334
-/proc/858/task/1339
-/proc/858/task/1340
-/proc/858/task/1374
-/proc/858/task/1375
-/proc/858/task/1398
-/proc/858/task/1415
-/proc/858/task/1428
-/proc/858/task/1429
-/proc/858/task/1449
-/proc/858/task/1454
-/proc/858/task/1457
-/proc/858/task/1496
-/proc/858/task/1536
-/proc/858/task/1585
-/proc/858/task/18763
-/proc/858/task/18764
-/proc/858/task/18765
-/proc/858/task/2245
-/proc/858/task/2272
-/proc/858/task/2435
-/proc/858/task/2441
-/proc/858/task/2450
-/proc/858/task/25218
-/proc/858/task/2811
-/proc/858/task/3170
-/proc/858/task/3186
-/proc/858/task/3200
-/proc/858/task/3201
-/proc/858/task/3386
-/proc/858/task/3555
-/proc/858/task/3733
-/proc/858/task/3750
-/proc/858/task/3774
-/proc/858/task/3775
-/proc/858/task/3776
-/proc/858/task/5928
-/proc/858/task/6410
-/proc/858/task/7100
-/proc/858/task/7516
-/proc/858/task/7568
-/proc/858/task/8172
-/proc/858/task/858
-/proc/858/task/862
-/proc/858/task/864
-/proc/858/task/865
-/proc/858/task/866
-/proc/858/task/867
-/proc/858/task/868
-/proc/858/task/869
-/proc/858/task/870
-/proc/858/task/883
-/proc/858/task/884
-/proc/858/task/885
-/proc/858/task/886
-/proc/858/task/888
-/proc/858/task/891
-/proc/858/task/892
-/proc/858/task/893
-/proc/858/task/894
-/proc/858/task/895
-/proc/858/task/896
-/proc/858/task/899
-/proc/858/task/9701
-/proc/86/task/86
-/proc/87/task/87
-/proc/871/task/871
-/proc/871/task/873
-/proc/871/task/874
-/proc/871/task/875
-/proc/871/task/876
-/proc/872/task/872
-/proc/877/task/877
-/proc/877/task/878
-/proc/877/task/879
-/proc/877/task/881
-/proc/877/task/882
-/proc/88/task/88
-/proc/880/task/880
-/proc/89/task/89
-/proc/9/task/9
-/proc/90/task/90
-/proc/905/task/905
-/proc/906/task/906
-/proc/907/task/907
-/proc/91/task/91
-/proc/92/task/92
-/proc/93/task/93
-/proc/94/task/94
-/proc/95/task/95
-/proc/96/task/96
-/proc/97/task/97
-/proc/98/task/98
-/proc/99/task/99
\ No newline at end of file
diff --git a/systrace/catapult/systrace/systrace/test_data/cgroup_dump b/systrace/catapult/systrace/systrace/test_data/cgroup_dump
deleted file mode 100644
index 4373e4a..0000000
--- a/systrace/catapult/systrace/systrace/test_data/cgroup_dump
+++ /dev/null
@@ -1,17 +0,0 @@
-# tracer: 
-CGROUP DUMP
-#subsys_name	hierarchy	num_cgroups	enabled
-cpuset	4	7	1
-cpu	2	1	1
-cpuacct	3	565	1
-schedtune	7	7	1
-blkio	1	2	1
-memory	6	3	1
-freezer	5	2	1
-# cgroup task attachment
-/background (root=4) : 466 467 484 485 486 514 518 520 923 925
-/camera-daemon (root=4) : 971 1155 1209 1298 1299 1312 1313 1314
-/foreground (root=4) : 653 669 670 671 959 960 968 972 975 976 977 991 993
-/restricted (root=4) : 
-/system-background (root=4) : 632 633 634 635 636 639
-/top-app (root=4) : 466 467 484 485 486 514 518 520 925
diff --git a/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt b/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt
deleted file mode 100644
index b0fdc74..0000000
--- a/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt b/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt
deleted file mode 100644
index a7fb5e8..0000000
--- a/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt
+++ /dev/null
@@ -1,1053 +0,0 @@
-# tracer: nop
-#
-# entries-in-buffer/entries-written: 1042/1042   #P:6
-#
-#                                      _-----=> irqs-off
-#                                     / _----=> need-resched
-#                                    | / _---=> hardirq/softirq
-#                                    || / _--=> preempt-depth
-#                                    ||| /     delay
-#           TASK-PID    TGID   CPU#  ||||    TIMESTAMP  FUNCTION
-#              | |        |      |   ||||       |         |
-           <...>-19161 (-----) [001] ...1 683201.354908: tracing_mark_write: trace_event_clock_sync: parent_ts=683201.375000
-           <...>-19161 (-----) [001] ...1 683201.354926: tracing_mark_write: trace_event_clock_sync: realtime_ts=3720325137
- ndroid.systemui-13580 (13580) [001] ...1 683202.104223: tracing_mark_write: S|13580|deliverInputEvent|263
-           <...>-18926 (-----) [000] ...1 683202.104223: tracing_mark_write: S|18926|deliverInputEvent|1024
- ndroid.systemui-13580 (13580) [001] ...1 683202.104606: tracing_mark_write: F|13580|deliverInputEvent|263
- ndroid.systemui-13580 (13580) [001] ...1 683202.104846: tracing_mark_write: S|13580|deliverInputEvent|267
- ndroid.systemui-13580 (13580) [001] ...1 683202.105046: tracing_mark_write: F|13580|deliverInputEvent|267
-           <...>-18926 (-----) [000] ...1 683202.107286: tracing_mark_write: F|18926|deliverInputEvent|1024
-           <...>-18926 (-----) [005] ...1 683202.115809: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [005] ...1 683202.115860: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [005] ...1 683202.115972: tracing_mark_write: S|18926|deliverInputEvent|1041
-           <...>-18926 (-----) [005] ...1 683202.116506: tracing_mark_write: F|18926|deliverInputEvent|1041
-           <...>-18926 (-----) [005] ...1 683202.116849: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.116883: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.131660: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.131710: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.131833: tracing_mark_write: S|18926|deliverInputEvent|1056
-           <...>-18926 (-----) [004] ...1 683202.132351: tracing_mark_write: F|18926|deliverInputEvent|1056
-           <...>-18926 (-----) [004] ...1 683202.132442: tracing_mark_write: S|18926|deliverInputEvent|1071
-           <...>-18926 (-----) [004] ...1 683202.133158: tracing_mark_write: S|18926|animator:opacity|23751452
-           <...>-18964 (-----) [002] ...1 683202.133760: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [002] ...1 683202.133771: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.133780: tracing_mark_write: F|18926|deliverInputEvent|1071
-           <...>-18926 (-----) [004] ...1 683202.133853: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.133879: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.133993: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.134018: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.134075: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.134114: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18926 (-----) [004] ...1 683202.134466: tracing_mark_write: E
-           <...>-18964 (-----) [002] ...1 683202.134734: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [002] ...1 683202.134743: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [002] ...1 683202.134797: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [002] ...1 683202.135205: tracing_mark_write: E
-           <...>-18964 (-----) [002] ...1 683202.135213: tracing_mark_write: E
-           <...>-18964 (-----) [002] ...1 683202.135308: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [002] ...1 683202.135376: tracing_mark_write: E
-           <...>-18964 (-----) [002] ...1 683202.135819: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18989 (-----) [003] ...1 683202.136120: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.136133: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.136151: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136156: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.136165: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [002] ...1 683202.136165: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.136170: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.136177: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [002] ...1 683202.136177: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136186: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [002] ...1 683202.136204: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136210: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [003] ...1 683202.136220: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.136228: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136234: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136243: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136250: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [002] ...1 683202.136257: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [002] ...1 683202.136264: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136273: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [002] ...1 683202.136281: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136288: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [002] ...1 683202.136311: tracing_mark_write: E
-           <...>-18988 (-----) [002] ...1 683202.136318: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.136377: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.136393: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.136441: tracing_mark_write: C|18926|jitterNanos|6767359
-           <...>-18926 (-----) [004] ...1 683202.136470: tracing_mark_write: B|18926|commit
-           <...>-18926 (-----) [004] ...1 683202.136500: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.136531: tracing_mark_write: E
-           <...>-18964 (-----) [002] ...1 683202.137447: tracing_mark_write: E
-           <...>-18964 (-----) [001] ...1 683202.139502: tracing_mark_write: C|18926|hwui_Texture|1858380
-           <...>-18964 (-----) [001] ...1 683202.139532: tracing_mark_write: C|18926|hwui_Texture_count|157
-           <...>-18964 (-----) [001] ...1 683202.139542: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [001] ...1 683202.139552: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|0
-           <...>-18964 (-----) [001] ...1 683202.139562: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [001] ...1 683202.139571: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [001] ...1 683202.139771: tracing_mark_write: E
-           <...>-18964 (-----) [001] ...1 683202.139787: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [001] ...1 683202.139793: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.149085: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.149136: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.149185: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.149204: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.149511: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.149537: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.149595: tracing_mark_write: B|18926|measure
-           <...>-18926 (-----) [004] ...1 683202.149738: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.149762: tracing_mark_write: B|18926|layout
-           <...>-18926 (-----) [004] ...1 683202.157004: tracing_mark_write: S|18926|animator:bottom|177885989
-           <...>-18926 (-----) [004] ...1 683202.161620: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.161704: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.161755: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18926 (-----) [004] ...1 683202.165418: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.165542: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.165553: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.165586: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.165981: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.165989: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.166060: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.166072: tracing_mark_write: B|18926|computeOrdering
-           <...>-18926 (-----) [004] ...1 683202.166074: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.166116: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.166125: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.166296: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.166312: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18926 (-----) [004] ...1 683202.166314: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18988 (-----) [001] ...1 683202.166330: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.166342: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.166361: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.166363: tracing_mark_write: B|18926|animation
-           <...>-18988 (-----) [001] ...1 683202.166369: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.166408: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.166416: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.167058: tracing_mark_write: S|18926|animator|46267553
-           <...>-18926 (-----) [004] ...1 683202.167297: tracing_mark_write: S|18926|animator|219664070
-           <...>-18988 (-----) [001] ...1 683202.167362: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.167377: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.167386: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.167394: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.167402: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.167408: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.167429: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.167434: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.167467: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.167469: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [001] ...1 683202.167477: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [001] ...1 683202.167487: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.167494: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18926 (-----) [004] ...1 683202.167501: tracing_mark_write: B|18926|traversal
-           <...>-18964 (-----) [005] ...1 683202.167508: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18989 (-----) [001] ...1 683202.167529: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.167536: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [001] ...1 683202.167556: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.167561: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.167580: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.167626: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [005] ...1 683202.168483: tracing_mark_write: B|18926|Upload 63x63 Texture
-           <...>-18964 (-----) [005] ...1 683202.168780: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.168970: tracing_mark_write: B|18926|Upload 63x63 Texture
-           <...>-18926 (-----) [004] ...1 683202.168978: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.169188: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.169313: tracing_mark_write: B|18926|Upload 63x63 Texture
-           <...>-18964 (-----) [005] ...1 683202.169537: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.170878: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.171711: tracing_mark_write: C|18926|hwui_Texture|1906008
-           <...>-18964 (-----) [005] ...1 683202.171721: tracing_mark_write: C|18926|hwui_Texture_count|160
-           <...>-18964 (-----) [005] ...1 683202.171728: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.171735: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|0
-           <...>-18964 (-----) [005] ...1 683202.171742: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.171748: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.171872: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.171882: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.171886: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.171893: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.171896: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.171903: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.171909: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.171933: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.172095: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.172101: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.172156: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.172196: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172318: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.172326: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.172335: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172343: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.172354: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172360: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.172380: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172386: tracing_mark_write: E
-           <...>-18926 (-----) [000] ...1 683202.172480: tracing_mark_write: E
-           <...>-18926 (-----) [000] ...1 683202.172495: tracing_mark_write: E
-           <...>-18926 (-----) [000] ...1 683202.172539: tracing_mark_write: C|18926|jitterNanos|10113151
-           <...>-18926 (-----) [000] ...1 683202.172566: tracing_mark_write: B|18926|commit
-           <...>-18988 (-----) [001] ...1 683202.172593: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.172600: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18926 (-----) [000] ...1 683202.172603: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172607: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172615: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18964 (-----) [005] ...1 683202.172618: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [001] ...1 683202.172619: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172626: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18926 (-----) [000] ...1 683202.172642: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172646: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.172652: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.172681: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [001] ...1 683202.172687: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [001] ...1 683202.172695: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.172702: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [001] ...1 683202.172710: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.172716: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [001] ...1 683202.172741: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.172746: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.173451: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.173460: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.173489: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.173506: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.174384: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.179559: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [005] ...1 683202.179602: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [005] ...1 683202.179643: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.179663: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [005] ...1 683202.180146: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.180178: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [005] ...1 683202.180238: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [005] ...1 683202.180274: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18926 (-----) [005] ...1 683202.181062: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.181975: tracing_mark_write: C|18926|hwui_Texture|1906008
-           <...>-18964 (-----) [005] ...1 683202.181986: tracing_mark_write: C|18926|hwui_Texture_count|160
-           <...>-18964 (-----) [005] ...1 683202.181993: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.182000: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|0
-           <...>-18964 (-----) [005] ...1 683202.182006: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.182012: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.182117: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.182133: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.182138: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.182146: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.182152: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.182184: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.182379: tracing_mark_write: B|18926|Allocate 896x128 HW Layer
-           <...>-18964 (-----) [005] ...1 683202.182455: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.182548: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.182554: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.182809: tracing_mark_write: B|18926|Optimize HW Layer DisplayList Button 849x126
-           <...>-18964 (-----) [005] ...1 683202.182898: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.182956: tracing_mark_write: E
-           <...>-18926 (-----) [001] ...1 683202.183195: tracing_mark_write: E
-           <...>-18926 (-----) [001] ...1 683202.183223: tracing_mark_write: E
-           <...>-18926 (-----) [001] ...1 683202.183332: tracing_mark_write: C|18926|jitterNanos|4175322
-           <...>-18926 (-----) [001] ...1 683202.183361: tracing_mark_write: B|18926|commit
-           <...>-18926 (-----) [001] ...1 683202.183393: tracing_mark_write: E
-           <...>-18926 (-----) [001] ...1 683202.183428: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.184160: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.184173: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.184248: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184400: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.184411: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.184451: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184463: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.184478: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184485: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18964 (-----) [005] ...1 683202.184607: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [005] ...1 683202.184612: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184829: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184871: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184884: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.184891: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.184898: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184907: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.184910: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.184916: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [000] ...1 683202.184921: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [000] ...1 683202.184930: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [000] ...1 683202.184941: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.184949: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [000] ...1 683202.184961: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.184968: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [000] ...1 683202.184989: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.185017: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.185064: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.185072: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.187274: tracing_mark_write: B|18926|Issue HW Layer DisplayList Button 849x126
-           <...>-18964 (-----) [005] ...1 683202.187506: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.187645: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18964 (-----) [005] ...1 683202.188279: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.188289: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.188318: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.188332: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.188578: tracing_mark_write: B|18926|Build GL Shader
-           <...>-18964 (-----) [005] ...1 683202.188959: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.188972: tracing_mark_write: B|18926|Build GL Shader
-           <...>-18964 (-----) [005] ...1 683202.192088: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.192173: tracing_mark_write: B|18926|linkProgram
-           <...>-18926 (-----) [004] ...1 683202.196237: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.196276: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.196304: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.196320: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.196702: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.196732: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.196791: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.196824: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18926 (-----) [004] ...1 683202.197263: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.206362: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.207218: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208128: tracing_mark_write: C|18926|hwui_Texture|2364760
-           <...>-18964 (-----) [005] ...1 683202.208138: tracing_mark_write: C|18926|hwui_Texture_count|161
-           <...>-18964 (-----) [005] ...1 683202.208144: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.208150: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|1
-           <...>-18964 (-----) [005] ...1 683202.208156: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.208162: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.208236: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208244: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.208248: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208254: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.208260: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.208281: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.208469: tracing_mark_write: B|18926|Allocate 1088x192 HW Layer
-           <...>-18964 (-----) [005] ...1 683202.208515: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208545: tracing_mark_write: B|18926|Allocate 1088x192 HW Layer
-           <...>-18964 (-----) [005] ...1 683202.208559: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208574: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208580: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.208631: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208632: tracing_mark_write: B|18926|Optimize HW Layer DisplayList LinearLayout 1080x189
-           <...>-18964 (-----) [005] ...1 683202.208637: tracing_mark_write: B|18926|computeOrdering
-           <...>-18926 (-----) [004] ...1 683202.208642: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208644: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.208672: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208694: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208705: tracing_mark_write: B|18926|Optimize HW Layer DisplayList LinearLayout 1080x189
-           <...>-18964 (-----) [005] ...1 683202.208710: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.208716: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208741: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.208749: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.208798: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.208892: tracing_mark_write: F|18926|animator:opacity|23751452
-           <...>-18988 (-----) [003] ...1 683202.208930: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.208942: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.208956: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.208967: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18964 (-----) [005] ...1 683202.208971: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [005] ...1 683202.208975: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.208989: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.208995: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.209027: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.209034: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.209124: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.209127: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.209137: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.209140: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.209199: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.209205: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.209212: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.209220: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.209223: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.209228: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.209251: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.209257: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.209347: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.209357: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.209367: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.209421: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [003] ...1 683202.209476: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.209484: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [003] ...1 683202.209506: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.209511: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.210303: tracing_mark_write: B|18926|Issue HW Layer DisplayList LinearLayout 1080x189
-           <...>-18964 (-----) [005] ...1 683202.210644: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.211769: tracing_mark_write: B|18926|Issue HW Layer DisplayList LinearLayout 1080x189
-           <...>-18964 (-----) [005] ...1 683202.212040: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.212151: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18964 (-----) [005] ...1 683202.212697: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.212705: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.212733: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.212747: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.212810: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.212843: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.212878: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.212895: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.213187: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.213221: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.213321: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.213360: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [005] ...1 683202.214038: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.214843: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215111: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [005] ...1 683202.215118: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [005] ...1 683202.215122: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.215127: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [005] ...1 683202.215131: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.215135: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.215203: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215210: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.215212: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215219: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.215223: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.215242: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.215444: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215452: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.215496: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.215504: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215506: tracing_mark_write: B|18926|computeOrdering
-           <...>-18926 (-----) [004] ...1 683202.215527: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215546: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215665: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.215676: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.215691: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215699: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18988 (-----) [003] ...1 683202.215702: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18964 (-----) [005] ...1 683202.215703: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215718: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215725: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.215758: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215765: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215840: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.215843: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.215852: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.215854: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215907: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.215914: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.215916: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [003] ...1 683202.215922: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215930: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.215933: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215939: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.215959: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.215964: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.215995: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.216002: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.216010: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.216016: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [003] ...1 683202.216028: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.216034: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [003] ...1 683202.216054: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.216059: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.216381: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.216388: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.216407: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.216416: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.217126: tracing_mark_write: E
-           <...>-18964 (-----) [001] ...1 683202.222253: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [001] ...1 683202.222264: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [001] ...1 683202.222271: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [001] ...1 683202.222279: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [001] ...1 683202.222287: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [001] ...1 683202.222295: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [001] ...1 683202.222397: tracing_mark_write: E
-           <...>-18964 (-----) [001] ...1 683202.222406: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [001] ...1 683202.222421: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.229007: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.229029: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [004] ...1 683202.229037: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.229039: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.230451: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.230484: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.230507: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.230518: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.230755: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.230773: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.230818: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.230848: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18926 (-----) [004] ...1 683202.231162: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231162: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.231169: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231178: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.231182: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.231203: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.231342: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231347: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.231381: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.231388: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231392: tracing_mark_write: B|18926|computeOrdering
-           <...>-18926 (-----) [004] ...1 683202.231408: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231424: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231572: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [005] ...1 683202.231576: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231706: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18964 (-----) [005] ...1 683202.231715: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.231718: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231719: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.231728: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.231730: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231735: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231746: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.231771: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.231774: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [003] ...1 683202.231779: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.231811: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231818: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231832: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.231837: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.231844: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231851: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.231854: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231859: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.231883: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.231889: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.232044: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [000] ...1 683202.232053: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [000] ...1 683202.232063: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.232071: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [000] ...1 683202.232080: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.232085: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [000] ...1 683202.232107: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.232113: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.232269: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.232275: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.232293: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.232303: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.232352: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.232356: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.232363: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.232367: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.232939: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.233604: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [005] ...1 683202.233612: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [005] ...1 683202.233616: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.233621: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [005] ...1 683202.233626: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.233630: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.233688: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.233694: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [005] ...1 683202.233696: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.233700: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.233710: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.245778: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.245799: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [005] ...1 683202.245805: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.245807: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.246567: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [005] ...1 683202.246598: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [005] ...1 683202.246649: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.246661: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [005] ...1 683202.246881: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.246894: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [005] ...1 683202.246927: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [005] ...1 683202.246948: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [004] ...1 683202.247070: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [004] ...1 683202.247077: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.247196: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.247236: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [004] ...1 683202.247240: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [004] ...1 683202.247263: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [004] ...1 683202.247407: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.247412: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.247443: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.247450: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.247457: tracing_mark_write: B|18926|computeOrdering
-           <...>-18926 (-----) [005] ...1 683202.247465: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.247487: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.247631: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [004] ...1 683202.247634: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247744: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18964 (-----) [004] ...1 683202.247756: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18988 (-----) [003] ...1 683202.247756: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.247759: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.247768: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [004] ...1 683202.247772: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247772: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247783: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.247805: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247812: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18964 (-----) [004] ...1 683202.247819: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [003] ...1 683202.247847: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247854: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247864: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.247870: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.247876: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247883: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.247886: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247891: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.247912: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.247917: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.247948: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.247955: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.247963: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.247970: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [003] ...1 683202.247981: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.247986: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [003] ...1 683202.248006: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.248011: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.248259: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.248265: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.248282: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.248292: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.248345: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.248349: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.248358: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.248365: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.248952: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.249556: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [004] ...1 683202.249562: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [004] ...1 683202.249567: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [004] ...1 683202.249572: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [004] ...1 683202.249576: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [004] ...1 683202.249580: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [004] ...1 683202.249663: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.249669: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [004] ...1 683202.249671: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.249676: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.249684: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.262890: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.262909: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [004] ...1 683202.262917: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.262919: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.263007: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [005] ...1 683202.263032: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [005] ...1 683202.263055: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.263064: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [005] ...1 683202.263309: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.263323: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [005] ...1 683202.263356: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [005] ...1 683202.263379: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [004] ...1 683202.263518: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [004] ...1 683202.263523: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.263649: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.263700: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [004] ...1 683202.263704: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [004] ...1 683202.263729: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [004] ...1 683202.263882: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.263888: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.263946: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [004] ...1 683202.263978: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.264105: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.264116: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.264139: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.264149: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [004] ...1 683202.264153: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264271: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.264282: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.264291: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [004] ...1 683202.264294: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264297: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.264304: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [004] ...1 683202.264307: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264309: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.264323: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264329: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18964 (-----) [004] ...1 683202.264355: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [003] ...1 683202.264370: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264377: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264389: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.264395: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.264401: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264408: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.264411: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264416: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.264439: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.264444: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.264476: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.264483: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.264491: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.264498: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [003] ...1 683202.264507: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.264513: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [003] ...1 683202.264532: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.264538: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.264793: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.264799: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.264818: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.264828: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.264877: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.264881: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.264890: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.264896: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.265471: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.266007: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [004] ...1 683202.266013: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [004] ...1 683202.266018: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [004] ...1 683202.266023: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [004] ...1 683202.266027: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [004] ...1 683202.266031: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [004] ...1 683202.266086: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.266092: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [004] ...1 683202.266095: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.266099: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.266107: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.279197: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.279278: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [005] ...1 683202.279290: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.279292: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.280270: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [005] ...1 683202.280317: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [005] ...1 683202.280361: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.280373: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [005] ...1 683202.280645: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.280659: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [005] ...1 683202.280703: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [005] ...1 683202.280735: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [004] ...1 683202.281109: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18926 (-----) [005] ...1 683202.281109: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281118: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281131: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [004] ...1 683202.281135: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [004] ...1 683202.281160: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [004] ...1 683202.281328: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281334: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.281376: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.281383: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281387: tracing_mark_write: B|18926|computeOrdering
-           <...>-18926 (-----) [005] ...1 683202.281405: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281422: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281607: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [004] ...1 683202.281612: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281740: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18964 (-----) [004] ...1 683202.281751: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18988 (-----) [003] ...1 683202.281754: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.281755: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.281764: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [004] ...1 683202.281766: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281771: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281783: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.281808: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281815: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18964 (-----) [004] ...1 683202.281816: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [003] ...1 683202.281854: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281861: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281872: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [003] ...1 683202.281878: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [003] ...1 683202.281885: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281891: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [003] ...1 683202.281895: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281900: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [003] ...1 683202.281919: tracing_mark_write: E
-           <...>-18988 (-----) [003] ...1 683202.281924: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.281958: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [003] ...1 683202.281965: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [003] ...1 683202.281975: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.281982: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [003] ...1 683202.281993: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.281999: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [003] ...1 683202.282018: tracing_mark_write: E
-           <...>-18989 (-----) [003] ...1 683202.282024: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.282331: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.282338: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.282357: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.282367: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.282425: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.282429: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.282438: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.282444: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.283093: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.283996: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [004] ...1 683202.284005: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [004] ...1 683202.284011: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [004] ...1 683202.284016: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [004] ...1 683202.284020: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [004] ...1 683202.284025: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [004] ...1 683202.284112: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.284119: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [004] ...1 683202.284121: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.284125: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.284135: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.295969: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.296010: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [004] ...1 683202.296019: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.296021: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.297071: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.297129: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.297210: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.297224: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.297739: tracing_mark_write: S|18926|animator|122130055
-           <...>-18926 (-----) [004] ...1 683202.297847: tracing_mark_write: S|18926|animator|172949940
-           <...>-18926 (-----) [004] ...1 683202.297932: tracing_mark_write: S|18926|animator|190890461
-           <...>-18926 (-----) [004] ...1 683202.298010: tracing_mark_write: S|18926|animator|20058450
-           <...>-18926 (-----) [004] ...1 683202.298087: tracing_mark_write: S|18926|animator|184847395
-           <...>-18926 (-----) [004] ...1 683202.298200: tracing_mark_write: S|18926|animator|162825504
-           <...>-18926 (-----) [004] ...1 683202.298288: tracing_mark_write: S|18926|animator|153919193
-           <...>-18926 (-----) [004] ...1 683202.298327: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.298340: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.298377: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.298402: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [005] ...1 683202.298521: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [005] ...1 683202.298566: tracing_mark_write: B|18926|prepareAndDraw
-           <...>-18964 (-----) [005] ...1 683202.298580: tracing_mark_write: B|18926|prepareTree
-           <...>-18926 (-----) [004] ...1 683202.298754: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.298770: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.298832: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.298903: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299039: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [000] ...1 683202.299052: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [000] ...1 683202.299068: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299079: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18964 (-----) [005] ...1 683202.299087: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.299090: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299099: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.299100: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
-           <...>-18964 (-----) [005] ...1 683202.299103: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299108: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18964 (-----) [005] ...1 683202.299153: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18988 (-----) [000] ...1 683202.299155: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299162: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299178: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [000] ...1 683202.299184: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [000] ...1 683202.299191: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299198: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [000] ...1 683202.299201: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299207: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [000] ...1 683202.299227: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.299233: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.299267: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [000] ...1 683202.299274: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [000] ...1 683202.299284: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.299291: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [000] ...1 683202.299307: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.299313: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [000] ...1 683202.299334: tracing_mark_write: E
-           <...>-18989 (-----) [000] ...1 683202.299339: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.299552: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.299559: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.299576: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.299587: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.299659: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.299663: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.299672: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.299678: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.299902: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301062: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [005] ...1 683202.301075: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [005] ...1 683202.301084: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.301094: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [005] ...1 683202.301103: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.301112: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.301214: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301220: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301231: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.301236: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301247: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.301254: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.301281: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.301489: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301497: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301520: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.301537: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.301557: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.301798: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.301813: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.301858: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.312850: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.312883: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [005] ...1 683202.312896: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.312900: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.313023: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.313069: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.313105: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.313125: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.313914: tracing_mark_write: F|18926|animator|46267553
-           <...>-18926 (-----) [004] ...1 683202.314201: tracing_mark_write: F|18926|animator|219664070
-           <...>-18926 (-----) [004] ...1 683202.314488: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.314515: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.314638: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.314704: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [005] ...1 683202.314999: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.315016: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.315048: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [005] ...1 683202.315053: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.315061: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.315072: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.315243: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.315872: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.315882: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.315916: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.316177: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.316188: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.316281: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.316338: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.316502: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.316515: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.316532: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.316543: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.316560: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.316568: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18926 (-----) [004] ...1 683202.316571: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.316575: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [005] ...1 683202.316581: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.316585: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.316608: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.316673: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.316834: tracing_mark_write: C|18926|jitterNanos|5552900
-           <...>-18926 (-----) [004] ...1 683202.316973: tracing_mark_write: B|18926|commit
-           <...>-18989 (-----) [001] ...1 683202.316982: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18964 (-----) [005] ...1 683202.316984: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18989 (-----) [001] ...1 683202.316992: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [001] ...1 683202.317003: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.317010: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.317013: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [001] ...1 683202.317026: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.317032: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18926 (-----) [004] ...1 683202.317040: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.317054: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.317060: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.317090: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.317096: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.317103: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.317111: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.317115: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.317120: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.317141: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.317146: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.317779: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.317790: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.317823: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.317844: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.317935: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.317944: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.317964: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.317977: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.319029: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.319801: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [005] ...1 683202.319813: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [005] ...1 683202.319822: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.319832: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [005] ...1 683202.319841: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.319850: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.319939: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.320015: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.320033: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.329503: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.329538: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [005] ...1 683202.329557: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.329562: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.329759: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.329819: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.329857: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.329877: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.330409: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.330434: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.330505: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.330553: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18926 (-----) [004] ...1 683202.331128: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.331212: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [004] ...1 683202.331227: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.331237: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [004] ...1 683202.331245: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [004] ...1 683202.331281: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [004] ...1 683202.331518: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.331539: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.331639: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [004] ...1 683202.331700: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.331876: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.331892: tracing_mark_write: E
-           <...>-18926 (-----) [005] ...1 683202.331933: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.331988: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [004] ...1 683202.331994: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332075: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.332088: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.332107: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332119: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.332136: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332143: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.332189: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332195: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.332319: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18989 (-----) [001] ...1 683202.332349: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [001] ...1 683202.332357: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [001] ...1 683202.332368: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.332376: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [001] ...1 683202.332385: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.332391: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [001] ...1 683202.332412: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.332417: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332446: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.332453: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.332459: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332466: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.332469: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332475: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.332499: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.332504: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.333108: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.333119: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.333156: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.333176: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.333267: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [004] ...1 683202.333362: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [004] ...1 683202.333387: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.333405: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.334671: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.335531: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [004] ...1 683202.335544: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [004] ...1 683202.335554: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [004] ...1 683202.335563: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [004] ...1 683202.335572: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [004] ...1 683202.335582: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [004] ...1 683202.335733: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.335745: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [004] ...1 683202.335749: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.335757: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.335773: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.344870: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [004] ...1 683202.344923: tracing_mark_write: B|18926|queue mFrameCallbackTask
-           <...>-18964 (-----) [004] ...1 683202.344939: tracing_mark_write: E
-           <...>-18964 (-----) [004] ...1 683202.344943: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.346588: tracing_mark_write: B|18926|Choreographer#doFrame
-           <...>-18926 (-----) [004] ...1 683202.346695: tracing_mark_write: B|18926|input
-           <...>-18926 (-----) [004] ...1 683202.346761: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.346782: tracing_mark_write: B|18926|animation
-           <...>-18926 (-----) [004] ...1 683202.347462: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.347492: tracing_mark_write: B|18926|traversal
-           <...>-18926 (-----) [004] ...1 683202.347562: tracing_mark_write: B|18926|draw
-           <...>-18926 (-----) [004] ...1 683202.347603: tracing_mark_write: B|18926|Record View#draw()
-           <...>-18964 (-----) [005] ...1 683202.348107: tracing_mark_write: B|18926|notifyFramePending
-           <...>-18964 (-----) [005] ...1 683202.348120: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.348131: tracing_mark_write: B|18926|dispatchFrameCallbacks
-           <...>-18964 (-----) [005] ...1 683202.348135: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.348143: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.348155: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.348158: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.348226: tracing_mark_write: B|18926|DrawFrame
-           <...>-18964 (-----) [005] ...1 683202.348235: tracing_mark_write: B|18926|syncFrameState
-           <...>-18964 (-----) [005] ...1 683202.348270: tracing_mark_write: B|18926|prepareTree
-           <...>-18964 (-----) [005] ...1 683202.348510: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.348519: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.348615: tracing_mark_write: B|18926|computeOrdering
-           <...>-18964 (-----) [005] ...1 683202.348675: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.348863: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.348877: tracing_mark_write: E
-           <...>-18926 (-----) [004] ...1 683202.348910: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.348946: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
-           <...>-18964 (-----) [005] ...1 683202.348953: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.348986: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [000] ...1 683202.348999: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [000] ...1 683202.349018: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.349030: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [000] ...1 683202.349049: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.349056: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [000] ...1 683202.349096: tracing_mark_write: E
-           <...>-18988 (-----) [000] ...1 683202.349103: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.349254: tracing_mark_write: B|18926|flush drawing commands
-           <...>-18989 (-----) [001] ...1 683202.349316: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18989 (-----) [001] ...1 683202.349326: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18989 (-----) [001] ...1 683202.349338: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.349346: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18989 (-----) [001] ...1 683202.349359: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.349365: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18989 (-----) [001] ...1 683202.349386: tracing_mark_write: E
-           <...>-18989 (-----) [001] ...1 683202.349392: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.349424: tracing_mark_write: B|18926|shadow tessellation
-           <...>-18988 (-----) [001] ...1 683202.349430: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18988 (-----) [001] ...1 683202.349438: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.349445: tracing_mark_write: B|18926|tessellateAmbientShadow
-           <...>-18988 (-----) [001] ...1 683202.349448: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.349454: tracing_mark_write: B|18926|tessellateSpotShadow
-           <...>-18988 (-----) [001] ...1 683202.349473: tracing_mark_write: E
-           <...>-18988 (-----) [001] ...1 683202.349479: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.350099: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.350115: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.350172: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.350197: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.350339: tracing_mark_write: B|18926|tessellatePath
-           <...>-18964 (-----) [005] ...1 683202.350349: tracing_mark_write: B|18926|approximatePathOutlineVertices
-           <...>-18964 (-----) [005] ...1 683202.350368: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.350381: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.351526: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.352548: tracing_mark_write: C|18926|hwui_Texture|4035928
-           <...>-18964 (-----) [005] ...1 683202.352562: tracing_mark_write: C|18926|hwui_Texture_count|163
-           <...>-18964 (-----) [005] ...1 683202.352571: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
-           <...>-18964 (-----) [005] ...1 683202.352580: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
-           <...>-18964 (-----) [005] ...1 683202.352589: tracing_mark_write: C|18926|hwui_Layer|0
-           <...>-18964 (-----) [005] ...1 683202.352599: tracing_mark_write: C|18926|hwui_Layer_count|0
-           <...>-18964 (-----) [005] ...1 683202.352734: tracing_mark_write: E
-           <...>-18964 (-----) [005] ...1 683202.352745: tracing_mark_write: B|18926|drainDisplayEventQueue
-           <...>-18964 (-----) [005] ...1 683202.352760: tracing_mark_write: E
diff --git a/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data b/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data
deleted file mode 100644
index 3ef0b90..0000000
--- a/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data
+++ /dev/null
@@ -1 +0,0 @@
-{"traceEvents": [{"tdur": 460, "name": "MessageLoop::RunTask", "tts": 6016200, "args": {"src_func": "PushOntoImmediateIncomingQueueLocked", "src_file": "../../components/scheduler/base/task_queue_impl.cc"}, "pid": 13931, "ts": 196489505302, "cat": "toplevel", "tid": 13956, "ph": "X", "dur": 463}, {"tdur": 412, "name": "TaskQueueManager::DoWork", "tts": 6016243, "args": {"from_main_thread": false}, "pid": 13931, "ts": 196489505345, "cat": "renderer.scheduler", "tid": 13956, "ph": "X", "dur": 415}, {"tdur": 113, "name": "TaskQueueManager::ProcessTaskFromWorkQueue", "tts": 6016280, "args": {"src_func": "SetEnabled", "src_file": "../../base/trace_event/trace_log.cc"}, "pid": 13931, "ts": 196489505382, "cat": "toplevel", "tid": 13956, "ph": "X", "dur": 117}, {"name": "FrameBlameContext", "tts": 6016311, "args": {}, "pid": 13931, "ts": 196489505414, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": "(", "id": "0x3684"}, {"tdur": 71, "name": "TaskQueueManager::RunTask", "tts": 6016318, "args": {"queue": "default_tq"}, "pid": 13931, "ts": 196489505421, "cat": "renderer.scheduler", "tid": 13956, "ph": "X", "dur": 74}, {"name": "TopLevel", "tts": 6016332, "args": {"snapshot": {}}, "pid": 13931, "ts": 196489505434, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": "O", "id": "0x3684"}, {"name": "FrameBlameContext", "tts": 6016382, "args": {}, "pid": 13931, "ts": 196489505483, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": ")", "id": "0x3684"}, {"tdur": 87, "name": "TaskQueueManager::ProcessTaskFromWorkQueue", "tts": 6016413, "args": {"src_func": "SetEnabled", "src_file": "../../base/trace_event/trace_log.cc"}, "pid": 13931, "ts": 196489505515, "cat": "toplevel", "tid": 13956, "ph": "X", "dur": 91}, {"name": "FrameBlameContext", "tts": 6016441, "args": {}, "pid": 13931, "ts": 196489505543, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": "(", "id": "0x3684"}, {"tdur": 48, "name": "TaskQueueManager::RunTask", "tts": 6016447, "args": {"queue": "default_tq"}, "pid": 13931, "ts": 196489505550, "cat": "renderer.scheduler", "tid": 13956, "ph": "X", "dur": 51}], "stackFrames": {"2850": {"category": "Kernel", "name": "datagram_poll", "parent": 2573}, "2853": {"category": "Android", "name": "android::IPCThreadState::IPCThreadState()", "parent": 152}, "1523": {"category": "Kernel", "name": "update_clk_statistics", "parent": 1522}, "2855": {"category": "Java", "name": "art::mirror::PrimitiveArray<unsigned char>::SetArrayClass(art::mirror::Class*)"}, "1993": {"category": "Kernel", "name": "_find_next_bit_le"}, "2857": {"category": "Kernel", "name": "__put_task_struct", "parent": 2856}, "2856": {"category": "Kernel", "name": "delayed_put_task_struct", "parent": 541}, "1490": {"category": "Kernel", "name": "__rcu_read_unlock", "parent": 1194}, "1397": {"category": "Kernel", "name": "msm_rpm_send_smd_buffer", "parent": 1396}, "1492": {"category": "Kernel", "name": "kgsl_iommu_default_setstate", "parent": 1143}, "1493": {"category": "Kernel", "name": "_raw_spin_lock", "parent": 126}, "1494": {"category": "libinputflinger.so", "name": "android::EventHub::mapKey(int, int, int, int*, unsigned int*) const"}, "1495": {"category": "Standard Lib", "name": "je_free"}, "1496": {"category": "liboverlay.so", "name": "overlay::Overlay::configBegin()", "parent": 1495}, "1396": {"category": "Kernel", "name": "msm_rpm_send_data.isra.11", "parent": 1395}, "1498": {"category": "Kernel", "name": "schedule_hrtimeout_range", "parent": 1497}, "1499": {"category": "Kernel", "name": "schedule_hrtimeout_range_clock", "parent": 1498}, "3339": {"category": "Kernel", "name": "force_quiescent_state", "parent": 3338}, "3338": {"category": "Kernel", "name": "rcu_process_callbacks", "parent": 3337}, "1395": {"category": "Kernel", "name": "msm_rpm_send_request", "parent": 1394}, "4189": {"category": "libz.so", "name": "inflate_fast"}, "1994": {"category": "Kernel", "name": "up_read", "parent": 28}, "1700": {"category": "GPU Driver", "name": "gsl_memory_write"}, "1701": {"category": "GPU Driver", "name": "leia_end_tiling"}, "1702": {"category": "Kernel", "name": "tracing_mark_write", "parent": 59}, "1394": {"category": "Kernel", "name": "msm_bus_rpm_req.constprop.2", "parent": 1393}, "1704": {"category": "Android", "name": "android::SortedVector<android::key_value_pair_t<android::wp<android::IBinder>, android::HeapCache::heap_info_t> >::do_move_backward(void*, void const*, unsigned int) const"}, "1705": {"category": "Standard Lib", "name": "epoll_pwait"}, "1706": {"category": "Kernel", "name": "dpcm_dapm_stream_event", "parent": 1689}, "1707": {"category": "Kernel", "name": "snd_soc_dapm_rtd_stream_event", "parent": 1706}, "1708": {"category": "Kernel", "name": "widget_stream_event", "parent": 1707}, "1393": {"category": "Kernel", "name": "msm_bus_rpm_commit_arb.isra.1", "parent": 1392}, "1996": {"category": "Kernel", "name": "schedule", "parent": 1569}, "4572": {"category": "libc++_shared.so", "name": "std::__1::ios_base::~ios_base()"}, "1392": {"category": "Kernel", "name": "msm_bus_remote_hw_commit", "parent": 1391}, "4573": {"category": "Kernel", "name": "fput", "parent": 53}, "1391": {"category": "Kernel", "name": "msm_bus_bimc_commit", "parent": 1390}, "3217": {"category": "Kernel", "name": "msm_bus_fabric_clk_set", "parent": 3216}, "1390": {"category": "Kernel", "name": "msm_bus_fabric_hw_commit", "parent": 1389}, "4188": {"category": "libgpu.cr.so", "name": "gpu::gles2::GLES2DecoderImpl::RestoreState(gpu::gles2::ContextState const*)"}, "3659": {"category": "Kernel", "name": "__ocmem_allocate_range", "parent": 3658}, "1128": {"category": "Kernel", "name": "put_cred_rcu", "parent": 541}, "1129": {"category": "Kernel", "name": "kmem_cache_free", "parent": 1128}, "1628": {"category": "Kernel", "name": "kgsl_iommu_unmap", "parent": 1627}, "4576": {"category": "Java", "name": "art::JNI::ReleaseBooleanArrayElements(_JNIEnv*, _jbooleanArray*, unsigned char*, int)"}, "3813": {"category": "Kernel", "name": "regulator_disable", "parent": 3812}, "1120": {"category": "Standard Lib", "name": "sendto"}, "1121": {"category": "Java", "name": "artAllocStringFromBytesFromCodeRegion"}, "1122": {"category": "Android", "name": "android::IPCThreadState::decStrongHandle(int)", "parent": 152}, "1123": {"category": "Android", "name": "android::BpMemory::getMemory(int*, unsigned int*) const"}, "1124": {"category": "GPU Driver", "name": "oxili_configure_depthcontrol"}, "1125": {"category": "Android", "name": "android::BufferedTextOutput::popBundle()"}, "1126": {"category": "Kernel", "name": "_test_and_set_bit", "parent": 83}, "1127": {"category": "thermal-engine-hh", "name": "[unknown]"}, "4490": {"category": "Kernel", "name": "__schedule", "parent": 4489}, "4579": {"category": "libc++_shared.so", "name": "std::__1::num_put<char, std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > >::do_put(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, std::__1::ios_base&, char, long) const"}, "2989": {"category": "Kernel", "name": "tty_release", "parent": 51}, "2988": {"category": "Kernel", "name": "kmem_cache_alloc", "parent": 2987}, "3029": {"category": "Kernel", "name": "prepare_to_wait", "parent": 3028}, "3028": {"category": "Kernel", "name": "dhd_pno_stop_for_gscan", "parent": 2102}, "2983": {"category": "Kernel", "name": "kfree", "parent": 2982}, "2982": {"category": "Kernel", "name": "binder_deferred_func", "parent": 35}, "2981": {"category": "Kernel", "name": "__mutex_lock_slowpath", "parent": 2980}, "2980": {"category": "Kernel", "name": "mutex_lock", "parent": 2979}, "2987": {"category": "Kernel", "name": "split_vma", "parent": 2293}, "2986": {"category": "Kernel", "name": "__slab_free", "parent": 2985}, "2985": {"category": "Kernel", "name": "kmem_cache_free", "parent": 2984}, "2984": {"category": "Kernel", "name": "remove_vma", "parent": 2973}, "524": {"category": "Kernel", "name": "rcu_idle_enter", "parent": 200}, "525": {"category": "Standard Lib", "name": "sigemptyset"}, "526": {"category": "Kernel", "name": "skb_free_datagram", "parent": 284}, "527": {"category": "Kernel", "name": "consume_skb", "parent": 526}, "520": {"category": "Kernel", "name": "run_rebalance_domains", "parent": 519}, "521": {"category": "Kernel", "name": "rebalance_domains", "parent": 520}, "522": {"category": "Kernel", "name": "load_balance", "parent": 521}, "523": {"category": "Kernel", "name": "cpumask_next_and", "parent": 522}, "1014": {"category": "Java", "name": "art::mirror::Class::SetStatus(art::Handle<art::mirror::Class>, art::mirror::Class::Status, art::Thread*)"}, "1015": {"category": "Kernel", "name": "sg_next", "parent": 159}, "1016": {"category": "GPU Driver", "name": "leia_primitive_clear"}, "1017": {"category": "Standard Lib", "name": "memmove"}, "528": {"category": "Kernel", "name": "__kfree_skb", "parent": 527}, "529": {"category": "Kernel", "name": "skb_release_head_state", "parent": 528}, "1012": {"category": "Kernel", "name": "__schedule", "parent": 1011}, "1013": {"category": "Kernel", "name": "_raw_spin_unlock_irq", "parent": 1012}, "1234": {"category": "GPU Driver", "name": "eglMapImage"}, "1235": {"category": "Kernel", "name": "mutex_unlock", "parent": 391}, "1236": {"category": "Kernel", "name": "__mutex_unlock_slowpath", "parent": 1235}, "1237": {"category": "Kernel", "name": "gen_pool_alloc_aligned", "parent": 403}, "1230": {"category": "Standard Lib", "name": "strncmp"}, "1231": {"category": "libqmi_encdec.so", "name": "[unknown]"}, "1232": {"category": "base.odex", "name": "[unknown]"}, "1233": {"category": "Java", "name": "[unknown]", "parent": 1232}, "4196": {"category": "libcc.cr.so", "name": "cc::RollingTimeDeltaHistory::Percentile(double) const"}, "3957": {"category": "Android", "name": "android::BpBinder::BpBinder(int)"}, "4194": {"category": "Kernel", "name": "select_estimate_accuracy", "parent": 380}, "4195": {"category": "Kernel", "name": "ktime_get_ts", "parent": 4194}, "1238": {"category": "Kernel", "name": "set_bits_ll", "parent": 1237}, "1239": {"category": "Kernel", "name": "atomic_notifier_call_chain", "parent": 1146}, "4190": {"category": "libgpu.cr.so", "name": "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*, unsigned int)"}, "3956": {"category": "Kernel", "name": "remove_vm_area", "parent": 3955}, "2526": {"category": "Kernel", "name": "__d_alloc", "parent": 2525}, "4358": {"category": "Kernel", "name": "mdss_mdp_smp_reserve", "parent": 592}, "3955": {"category": "Kernel", "name": "__vunmap", "parent": 3954}, "4354": {"category": "Kernel", "name": "kmap_atomic", "parent": 4353}, "4355": {"category": "Kernel", "name": "kmap_high_get", "parent": 4354}, "4356": {"category": "Kernel", "name": "_raw_spin_unlock_irqrestore", "parent": 4355}, "3954": {"category": "Kernel", "name": "vfree", "parent": 1558}, "3167": {"category": "Kernel", "name": "__alloc_skb", "parent": 3166}, "4351": {"category": "Kernel", "name": "__inc_zone_page_state", "parent": 4350}, "4352": {"category": "Kernel", "name": "__inc_zone_state", "parent": 4351}, "4353": {"category": "Kernel", "name": "v6_clear_user_highpage_nonaliasing", "parent": 4349}, "4310": {"category": "libgpu.cr.so", "name": "[unknown]", "parent": 4309}, "438": {"category": "Kernel", "name": "kgsl_add_fence_event", "parent": 437}, "439": {"category": "Kernel", "name": "sync_fence_create", "parent": 438}, "436": {"category": "Android", "name": "android::RefBase::weakref_type::decWeak(void const*)"}, "437": {"category": "Kernel", "name": "kgsl_ioctl_timestamp_event", "parent": 386}, "434": {"category": "Standard Lib", "name": "pthread_create"}}, "samples": [{"name": "cycles:HG", "weight": 297850, "ts": 196493621870.241, "cpu": 2, "comm": "ksoftirqd/2", "tid": 14106, "sf": 539}, {"name": "cycles:HG", "weight": 1132096, "ts": 196493621938.626, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132116, "ts": 196493622439.043, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130919, "ts": 196493622938.678, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130876, "ts": 196493623438.105, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130876, "ts": 196493623937.897, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131083, "ts": 196493624437.22, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131128, "ts": 196493624936.074, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131320, "ts": 196493625435.918, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131601, "ts": 196493625937.48, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131734, "ts": 196493626435.918, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131397, "ts": 196493626935.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 437658, "ts": 196493626987.168, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131678, "ts": 196493627436.126, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131929, "ts": 196493627935.762, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131710, "ts": 196493628435.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131799, "ts": 196493628934.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131829, "ts": 196493629434.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131977, "ts": 196493629934.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132199, "ts": 196493630434.824, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132038, "ts": 196493630934.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131980, "ts": 196493631434.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 437658, "ts": 196493631773.105, "cpu": 0, "comm": "surfaceflinger", "tid": 235, "sf": 48}, {"name": "cycles:HG", "weight": 348651, "ts": 196493631851.855, "cpu": 2, "comm": "ksoftirqd/2", "tid": 14106, "sf": 3005}, {"name": "cycles:HG", "weight": 1131995, "ts": 196493631939.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 275538, "ts": 196493631973.626, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 152}, {"name": "cycles:HG", "weight": 386273, "ts": 196493632025.553, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 242822, "ts": 196493632086.282, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 524}, {"name": "cycles:HG", "weight": 306050, "ts": 196493632162.48, "cpu": 0, "comm": "ksoftirqd/0", "tid": 3, "sf": 84}, {"name": "cycles:HG", "weight": 1131861, "ts": 196493632439.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130548, "ts": 196493632938.105, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130563, "ts": 196493633438.366, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130932, "ts": 196493633937.637, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130919, "ts": 196493634437.22, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131082, "ts": 196493634936.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131230, "ts": 196493635435.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131407, "ts": 196493635935.293, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131717, "ts": 196493636434.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131747, "ts": 196493636934.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 343424, "ts": 196493637077.272, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131954, "ts": 196493637435.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131911, "ts": 196493637934.824, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 457251, "ts": 196493638301.23, "cpu": 0, "comm": "sensors.qcom", "tid": 973, "sf": 5}, {"name": "cycles:HG", "weight": 1131824, "ts": 196493638434.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 405911, "ts": 196493638480.189, "cpu": 0, "comm": "system_server", "tid": 844, "sf": 3006}, {"name": "cycles:HG", "weight": 337207, "ts": 196493638558.053, "cpu": 2, "comm": "system_server", "tid": 885, "sf": 584}, {"name": "cycles:HG", "weight": 375907, "ts": 196493638727.376, "cpu": 0, "comm": "r.ScannerThread", "tid": 14164, "sf": 409}, {"name": "cycles:HG", "weight": 482221, "ts": 196493638770.449, "cpu": 2, "comm": ".gms.persistent", "tid": 13885, "sf": 24}, {"name": "cycles:HG", "weight": 1131898, "ts": 196493638935.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131870, "ts": 196493639434.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131680, "ts": 196493639934.355, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131916, "ts": 196493640434.355, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132034, "ts": 196493640935.189, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132034, "ts": 196493641434.095, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131888, "ts": 196493641937.897, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 459973, "ts": 196493641989.147, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 426602, "ts": 196493642392.116, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 1132137, "ts": 196493642437.168, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131128, "ts": 196493642936.751, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131261, "ts": 196493643436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131335, "ts": 196493643936.803, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131394, "ts": 196493644435.762, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131336, "ts": 196493644935.97, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131602, "ts": 196493645435.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131662, "ts": 196493645935.137, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131736, "ts": 196493646434.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131810, "ts": 196493646935.345, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132017, "ts": 196493647436.699, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131739, "ts": 196493647935.345, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131417, "ts": 196493648434.147, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 468491, "ts": 196493648580.449, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 73}, {"name": "cycles:HG", "weight": 446158, "ts": 196493648862.585, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 152}, {"name": "cycles:HG", "weight": 1131831, "ts": 196493648934.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132141, "ts": 196493649434.824, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132025, "ts": 196493649934.616, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131982, "ts": 196493650434.251, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131968, "ts": 196493650935.241, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132057, "ts": 196493651434.512, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 398089, "ts": 196493651839.824, "cpu": 2, "comm": "ksoftirqd/2", "tid": 14106, "sf": 84}, {"name": "cycles:HG", "weight": 418907, "ts": 196493651861.074, "cpu": 0, "comm": "ksoftirqd/0", "tid": 3, "sf": 1699}, {"name": "cycles:HG", "weight": 1131926, "ts": 196493651937.22, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131921, "ts": 196493652437.949, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131233, "ts": 196493652936.855, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131087, "ts": 196493653435.866, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131309, "ts": 196493653935.866, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131590, "ts": 196493654435.814, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131562, "ts": 196493654935.449, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131607, "ts": 196493655435.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131710, "ts": 196493655935.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131740, "ts": 196493656434.616, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131653, "ts": 196493656934.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 331059, "ts": 196493657041.855, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131993, "ts": 196493657435.189, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131906, "ts": 196493657933.939, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 295985, "ts": 196493658029.98, "cpu": 0, "comm": "kworker/u:2", "tid": 13922, "sf": 34}, {"name": "cycles:HG", "weight": 262559, "ts": 196493658147.637, "cpu": 0, "comm": "sensors.qcom", "tid": 973, "sf": 534}, {"name": "cycles:HG", "weight": 246341, "ts": 196493658256.595, "cpu": 0, "comm": "system_server", "tid": 840, "sf": 2330}, {"name": "cycles:HG", "weight": 314916, "ts": 196493658369.616, "cpu": 2, "comm": "system_server", "tid": 885, "sf": 454}, {"name": "cycles:HG", "weight": 1131848, "ts": 196493658434.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 346814, "ts": 196493658469.928, "cpu": 0, "comm": "r.ScannerThread", "tid": 14164, "sf": 1262}, {"name": "cycles:HG", "weight": 282163, "ts": 196493658493.314, "cpu": 2, "comm": "system_server", "tid": 809, "sf": 480}, {"name": "cycles:HG", "weight": 249595, "ts": 196493658604.616, "cpu": 2, "comm": ".gms.persistent", "tid": 13885, "sf": 1186}, {"name": "cycles:HG", "weight": 1132099, "ts": 196493658934.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132012, "ts": 196493659435.189, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131969, "ts": 196493659935.137, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131764, "ts": 196493660434.303, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131868, "ts": 196493660934.98, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132045, "ts": 196493661433.835, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131884, "ts": 196493661938.21, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 502401, "ts": 196493661992.532, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 344348, "ts": 196493662348.418, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 1132124, "ts": 196493662438.366, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130985, "ts": 196493662938.105, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130913, "ts": 196493663437.532, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130987, "ts": 196493663937.168, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131105, "ts": 196493664435.657, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131208, "ts": 196493664935.762, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131637, "ts": 196493665436.282, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 439774, "ts": 196493665612.064, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 834}, {"name": "cycles:HG", "weight": 1131609, "ts": 196493665936.699, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131536, "ts": 196493666434.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131523, "ts": 196493666934.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 525437, "ts": 196493666979.303, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131893, "ts": 196493667436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131908, "ts": 196493667934.199, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131542, "ts": 196493668434.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132075, "ts": 196493668934.876, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132003, "ts": 196493669434.095, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131857, "ts": 196493669934.043, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132064, "ts": 196493670434.199, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132109, "ts": 196493670934.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132051, "ts": 196493671434.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131979, "ts": 196493671938.939, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 469080, "ts": 196493671981.387, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 313399, "ts": 196493672291.595, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 1060}, {"name": "cycles:HG", "weight": 1131941, "ts": 196493672438.574, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130831, "ts": 196493672937.793, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130831, "ts": 196493673436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131038, "ts": 196493673936.178, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131393, "ts": 196493674436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131511, "ts": 196493674936.647, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131394, "ts": 196493675435.866, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131424, "ts": 196493675935.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131557, "ts": 196493676435.449, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131690, "ts": 196493676935.553, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 370528, "ts": 196493677103.47, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131764, "ts": 196493677435.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 328843, "ts": 196493677897.741, "cpu": 0, "comm": "sensors.qcom", "tid": 973, "sf": 3009}, {"name": "cycles:HG", "weight": 1131647, "ts": 196493677934.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 291752, "ts": 196493678027.949, "cpu": 0, "comm": "system_server", "tid": 840, "sf": 1004}, {"name": "cycles:HG", "weight": 278245, "ts": 196493678150.293, "cpu": 0, "comm": "system_server", "tid": 844, "sf": 48}, {"name": "cycles:HG", "weight": 313399, "ts": 196493678267.376, "cpu": 2, "comm": "system_server", "tid": 885, "sf": 2046}, {"name": "cycles:HG", "weight": 377236, "ts": 196493678367.741, "cpu": 0, "comm": "r.ScannerThread", "tid": 14164, "sf": 409}, {"name": "cycles:HG", "weight": 277158, "ts": 196493678389.251, "cpu": 2, "comm": ".gms.persistent", "tid": 13885, "sf": 3010}, {"name": "cycles:HG", "weight": 1131750, "ts": 196493678435.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131839, "ts": 196493678934.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131722, "ts": 196493679434.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131944, "ts": 196493679935.345, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132003, "ts": 196493680434.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131725, "ts": 196493680934.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131902, "ts": 196493681434.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 245413, "ts": 196493681847.428, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 524}, {"name": "cycles:HG", "weight": 1131902, "ts": 196493681938.001, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 521979, "ts": 196493681991.699, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 304608, "ts": 196493682404.616, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 1191}, {"name": "cycles:HG", "weight": 1131941, "ts": 196493682438.678, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 272039, "ts": 196493682524.303, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 24}, {"name": "cycles:HG", "weight": 268553, "ts": 196493682649.928, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 1130903, "ts": 196493682938.366, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130772, "ts": 196493683437.324, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 607013, "ts": 196493683841.543, "cpu": 0, "comm": "dhd_dpc", "tid": 125, "sf": 3021}, {"name": "cycles:HG", "weight": 1130861, "ts": 196493683936.959, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 541605, "ts": 196493684080.137, "cpu": 0, "comm": "wpa_supplicant", "tid": 1108, "sf": 3022}, {"name": "cycles:HG", "weight": 1126514, "ts": 196493684083.678, "cpu": 3, "comm": "system_server", "tid": 1103, "sf": 1024}, {"name": "cycles:HG", "weight": 1131127, "ts": 196493684437.376, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 492206, "ts": 196493684605.709, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 559558, "ts": 196493684824.824, "cpu": 0, "comm": "dhd_dpc", "tid": 125, "sf": 3025}, {"name": "cycles:HG", "weight": 1050347, "ts": 196493684920.605, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 1887}, {"name": "cycles:HG", "weight": 1131216, "ts": 196493684935.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 272}, {"name": "cycles:HG", "weight": 1050347, "ts": 196493685385.241, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 152}, {"name": "cycles:HG", "weight": 1131114, "ts": 196493685435.241, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 997507, "ts": 196493685826.178, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 905}, {"name": "cycles:HG", "weight": 1131617, "ts": 196493685935.032, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1007073, "ts": 196493686270.345, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 3026}, {"name": "cycles:HG", "weight": 1131691, "ts": 196493686435.293, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1023885, "ts": 196493686722.428, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 3027}, {"name": "cycles:HG", "weight": 1131721, "ts": 196493686934.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1039957, "ts": 196493687182.897, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 2356}, {"name": "cycles:HG", "weight": 1131780, "ts": 196493687436.074, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1053686, "ts": 196493687647.428, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 2326}, {"name": "cycles:HG", "weight": 1131810, "ts": 196493687935.762, "cpu": 1, "comm": ".gms.persistent", "tid": 1660, "sf": 152}, {"name": "cycles:HG", "weight": 1065205, "ts": 196493688117.532, "cpu": 3, "comm": ".gms.persistent", "tid": 1729, "sf": 12}, {"name": "cycles:HG", "weight": 1131532, "ts": 196493688436.074, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 556143, "ts": 196493688570.345, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1232}, {"name": "cycles:HG", "weight": 1075356, "ts": 196493688591.855, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 3029}, {"name": "cycles:HG", "weight": 645259, "ts": 196493688855.137, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 152}, {"name": "cycles:HG", "weight": 1131680, "ts": 196493688935.032, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 575371, "ts": 196493689110.397, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1378}, {"name": "cycles:HG", "weight": 629674, "ts": 196493689387.845, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 12}, {"name": "cycles:HG", "weight": 1131593, "ts": 196493689434.095, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 705297, "ts": 196493689699.824, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 905}, {"name": "cycles:HG", "weight": 1131800, "ts": 196493689934.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 775837, "ts": 196493690042.272, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1232}, {"name": "cycles:HG", "weight": 834492, "ts": 196493690411.282, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 152}, {"name": "cycles:HG", "weight": 1132036, "ts": 196493690433.73, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 882321, "ts": 196493690800.814, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 3030}, {"name": "cycles:HG", "weight": 1131934, "ts": 196493690934.251, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 921577, "ts": 196493691209.407, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1014}, {"name": "cycles:HG", "weight": 1132126, "ts": 196493691434.876, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 954187, "ts": 196493691630.501, "cpu": 0, "comm": "system_server", "tid": 2277, "sf": 152}, {"name": "cycles:HG", "weight": 374916, "ts": 196493691678.262, "cpu": 2, "comm": "system_server", "tid": 815, "sf": 2713}, {"name": "cycles:HG", "weight": 514732, "ts": 196493691913.782, "cpu": 2, "comm": "dhd_dpc", "tid": 125, "sf": 728}, {"name": "cycles:HG", "weight": 1131980, "ts": 196493691937.48, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 980963, "ts": 196493692076.803, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 3031}, {"name": "cycles:HG", "weight": 1083778, "ts": 196493692182.064, "cpu": 3, "comm": "swapper", "tid": 0, "sf": 524}, {"name": "cycles:HG", "weight": 407059, "ts": 196493692255.709, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 201}, {"name": "cycles:HG", "weight": 1131786, "ts": 196493692438.782, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 464437, "ts": 196493692462.168, "cpu": 2, "comm": "system_server", "tid": 1419, "sf": 24}, {"name": "cycles:HG", "weight": 956095, "ts": 196493692503.939, "cpu": 0, "comm": "system_server", "tid": 808, "sf": 380}, {"name": "cycles:HG", "weight": 491108, "ts": 196493692678.991, "cpu": 2, "comm": "lmkd", "tid": 192, "sf": 1053}, {"name": "cycles:HG", "weight": 578691, "ts": 196493692934.98, "cpu": 2, "comm": "system_server", "tid": 1419, "sf": 2261}, {"name": "cycles:HG", "weight": 1131069, "ts": 196493692936.282, "cpu": 1, "comm": ".gms.persistent", "tid": 1375, "sf": 1479}, {"name": "cycles:HG", "weight": 673045, "ts": 196493693233.626, "cpu": 2, "comm": "system_server", "tid": 1436, "sf": 2382}, {"name": "cycles:HG", "weight": 970459, "ts": 196493693301.439, "cpu": 0, "comm": "system_server", "tid": 2979, "sf": 152}, {"name": "cycles:HG", "weight": 1130952, "ts": 196493693437.584, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 753340, "ts": 196493693568.678, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 990963, "ts": 196493693739.564, "cpu": 0, "comm": "system_server", "tid": 802, "sf": 152}, {"name": "cycles:HG", "weight": 1131425, "ts": 196493693939.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 816721, "ts": 196493694022.324, "cpu": 2, "comm": "system_server", "tid": 1202, "sf": 152}, {"name": "cycles:HG", "weight": 1018311, "ts": 196493694280.709, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 3031}, {"name": "cycles:HG", "weight": 944745, "ts": 196493694318.262, "cpu": 0, "comm": "dhd_dpc", "tid": 125, "sf": 718}, {"name": "cycles:HG", "weight": 1131132, "ts": 196493694436.907, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 866886, "ts": 196493694583.314, "cpu": 2, "comm": "system_server", "tid": 31585, "sf": 152}, {"name": "cycles:HG", "weight": 1130561, "ts": 196493694935.605, "cpu": 1, "comm": ".gms.persistent", "tid": 27896, "sf": 24}, {"name": "cycles:HG", "weight": 877972, "ts": 196493694970.709, "cpu": 2, "comm": "system_server", "tid": 31585, "sf": 1885}, {"name": "cycles:HG", "weight": 908751, "ts": 196493695255.397, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 1518}, {"name": "cycles:HG", "weight": 961487, "ts": 196493695255.97, "cpu": 0, "comm": ".gms.persistent", "tid": 1581, "sf": 2579}, {"name": "cycles:HG", "weight": 1131391, "ts": 196493695438.939, "cpu": 1, "comm": ".gms.persistent", "tid": 3490, "sf": 152}, {"name": "cycles:HG", "weight": 866087, "ts": 196493695617.793, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 822225, "ts": 196493695626.959, "cpu": 3, "comm": "system_server", "tid": 3435, "sf": 3036}, {"name": "cycles:HG", "weight": 945135, "ts": 196493695725.449, "cpu": 0, "comm": "system_server", "tid": 2276, "sf": 152}, {"name": "cycles:HG", "weight": 1131701, "ts": 196493695938.991, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 772163, "ts": 196493696069.512, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 24}, {"name": "cycles:HG", "weight": 889986, "ts": 196493696117.949, "cpu": 0, "comm": "system_server", "tid": 807, "sf": 152}, {"name": "cycles:HG", "weight": 1130736, "ts": 196493696437.168, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 897232, "ts": 196493696514.147, "cpu": 0, "comm": "system_server", "tid": 1428, "sf": 20}, {"name": "cycles:HG", "weight": 805509, "ts": 196493696757.064, "cpu": 3, "comm": ".gms.persistent", "tid": 1363, "sf": 2326}, {"name": "cycles:HG", "weight": 927988, "ts": 196493696926.022, "cpu": 0, "comm": "system_server", "tid": 2277, "sf": 152}, {"name": "cycles:HG", "weight": 1130736, "ts": 196493696940.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 897462, "ts": 196493696952.064, "cpu": 2, "comm": "system_server", "tid": 1419, "sf": 24}, {"name": "cycles:HG", "weight": 818607, "ts": 196493697124.147, "cpu": 3, "comm": ".gms.persistent", "tid": 1363, "sf": 447}, {"name": "cycles:HG", "weight": 958379, "ts": 196493697357.012, "cpu": 0, "comm": "system_server", "tid": 2979, "sf": 12}, {"name": "cycles:HG", "weight": 1131180, "ts": 196493697440.293, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 872027, "ts": 196493697586.959, "cpu": 2, "comm": "system_server", "tid": 1436, "sf": 152}, {"name": "cycles:HG", "weight": 983975, "ts": 196493697792.689, "cpu": 0, "comm": "sensors.qcom", "tid": 819, "sf": 2017}, {"name": "cycles:HG", "weight": 1130230, "ts": 196493697939.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 803857, "ts": 196493697942.376, "cpu": 2, "comm": ".gms.persistent", "tid": 1363, "sf": 192}, {"name": "cycles:HG", "weight": 1003687, "ts": 196493698237.116, "cpu": 0, "comm": ".gms.persistent", "tid": 1636, "sf": 1232}, {"name": "cycles:HG", "weight": 782509, "ts": 196493698288.105, "cpu": 2, "comm": "system_server", "tid": 1202, "sf": 19}, {"name": "cycles:HG", "weight": 1130334, "ts": 196493698438.678, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 822340, "ts": 196493698651.699, "cpu": 2, "comm": ".gms.persistent", "tid": 1363, "sf": 3038}, {"name": "cycles:HG", "weight": 1022348, "ts": 196493698687.012, "cpu": 0, "comm": "system_server", "tid": 807, "sf": 1256}, {"name": "cycles:HG", "weight": 1130541, "ts": 196493698938.782, "cpu": 1, "comm": "system_server", "tid": 807, "sf": 3039}, {"name": "cycles:HG", "weight": 790673, "ts": 196493699002.168, "cpu": 3, "comm": "system_server", "tid": 3435, "sf": 3041}, {"name": "cycles:HG", "weight": 868186, "ts": 196493699036.855, "cpu": 2, "comm": "system_server", "tid": 1414, "sf": 841}, {"name": "cycles:HG", "weight": 1038294, "ts": 196493699151.803, "cpu": 0, "comm": "surfaceflinger", "tid": 235, "sf": 48}, {"name": "cycles:HG", "weight": 826537, "ts": 196493699369.459, "cpu": 3, "comm": "system_server", "tid": 3435, "sf": 152}, {"name": "cycles:HG", "weight": 1130748, "ts": 196493699439.147, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 908964, "ts": 196493699439.459, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 24}, {"name": "cycles:HG", "weight": 1052615, "ts": 196493699622.116, "cpu": 0, "comm": "system_server", "tid": 1428, "sf": 450}, {"name": "cycles:HG", "weight": 750727, "ts": 196493699702.793, "cpu": 3, "comm": "system_server", "tid": 2978, "sf": 24}, {"name": "cycles:HG", "weight": 942863, "ts": 196493699855.032, "cpu": 2, "comm": ".gms.persistent", "tid": 1363, "sf": 1754}, {"name": "cycles:HG", "weight": 1130940, "ts": 196493699938.834, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 784670, "ts": 196493700050.241, "cpu": 3, "comm": "system_server", "tid": 807, "sf": 12}, {"name": "cycles:HG", "weight": 1062662, "ts": 196493700157.012, "cpu": 0, "comm": "system_server", "tid": 1428, "sf": 938}, {"name": "cycles:HG", "weight": 971451, "ts": 196493700288.366, "cpu": 2, "comm": "system_server", "tid": 2979, "sf": 3047}, {"name": "cycles:HG", "weight": 833621, "ts": 196493700418.887, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 1232}, {"name": "cycles:HG", "weight": 1130750, "ts": 196493700436.595, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 879395, "ts": 196493700810.709, "cpu": 3, "comm": "system_server", "tid": 804, "sf": 3054}, {"name": "cycles:HG", "weight": 1130898, "ts": 196493700936.751, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}], "metadata": {"network-type": "WiFi", "gpu-gl-vendor": "Qualcomm", "gpu-psver": "3.00", "field-trials": ["853359fa-f7de5af1", "236d5d9e-fecfffa1", "e036a196-3f4a17df", "77207729-3f4a17df", "4bf94d2-15606520", "2a33b90e-3f4a17df", "ba3f87da-92cc81ec", "46da3e07-3f4a17df", "1ce8a192-3f4a17df", "3fbe5359-3f4a17df", "43d0dd1e-3f4a17df", "10667b28-e2bc4126", "6ce7d7b5-3f4a17df", "93731dca-3f4a17df", "64cbdfc2-3f4a17df", "b7786474-d93a0620", "158a87f-3f4a17df", "868bda90-3f4a17df", "2182dcae-37a58975", "4ea303a6-3f4a17df", "826d6cab-96e3ef3c", "8b4d89aa-3f4a17df", "30e679f-3f4a17df", "f2cb3653-c2fe0862", "867c4c68-3f4a17df", "d747916f-d747916f", "77d0f131-df0c9747", "2f40feb6-3f4a17df", "dd139bd7-3f4a17df", "fe05be5f-4ad60575"], "product-version": "Chrome/53.0.2784.0", "gpu-vsver": "3.00", "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA59G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2784.0 Mobile Safari/537.36", "os-arch": "armv7l", "os-version": "6.0.0", "gpu-gl-renderer": "Adreno (TM) 330", "num-cpus": 4, "gpu-driver": "127.0", "clock-domain": "LINUX_CLOCK_MONOTONIC", "physical-memory": 1854, "cpu-model": 0, "cpu-family": 0, "highres-ticks": true, "cpu-brand": "RMv7 Processor rev 0 (v7l)", "cpu-stepping": 0, "os-name": "Android"}}
\ No newline at end of file
diff --git a/systrace/catapult/systrace/systrace/trace_result.py b/systrace/catapult/systrace/systrace/trace_result.py
deleted file mode 100644
index 11c78f7..0000000
--- a/systrace/catapult/systrace/systrace/trace_result.py
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-'''Tracing agent result wrapper for systrace.
-
-This class represents the captured trace results from a particular
-tool (e.g. atrace, ftrace.)
-'''
-
-
-class TraceResult(object):
-  def __init__(self, source_name, raw_data):
-    self.source_name = source_name
-    self.raw_data = raw_data
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/__init__.py b/systrace/catapult/systrace/systrace/tracing_agents/__init__.py
deleted file mode 100644
index 859d779..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/__init__.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-'''Tracing agent interface for systrace.
-
-This class represents an agent that captures traces from a particular
-tool (e.g. atrace, ftrace.)
-'''
-
-# Timeout interval constants.
-
-START_STOP_TIMEOUT = 10.0
-GET_RESULTS_TIMEOUT = 30.0
-
-
-class TracingConfig(object):
-  '''Store the tracing configuration options for all Systrace agents. If there
-  are ever any options that are to be shared between all of the agents, those
-  options should go here.
-  '''
-  def __init__(self):
-    pass
-
-
-class TracingAgent(object):
-  def __init__(self):
-    pass
-
-  def StartAgentTracing(self, config, timeout=None):
-    '''Starts running the trace for this agent. Stops with timeout if
-    not completed within timeout interval.
-
-    Args:
-        config: TracingConfig subclass containing agent-specific options
-                and categories.
-        timeout: Timeout interval in seconds.
-
-    Returns:
-        Boolean value indicating whether or not the trace started successfully.
-    '''
-    pass
-
-  def StopAgentTracing(self, timeout=None):
-    '''Stops running the trace for this agent and returns immediately.
-    Stops with timeout if not completed within timeout interval.
-
-    Args:
-        timeout: Timeout interval in seconds.
-
-    Returns:
-        Boolean value indicating whether or not the trace started successfully.
-    '''
-    pass
-
-  def SupportsExplicitClockSync(self):
-    '''Find out if this agent supports recording of clock sync markers.
-
-    Returns:
-        Boolean value indicating whether this agent supports recording
-        of clock sync markers.
-    '''
-    raise NotImplementedError
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    '''Record a clock sync marker for this agent.
-
-    Args:
-        sync_id: Clock sync ID string.
-        did_record_sync_marker_callback: Callback function to call
-        (with arguments: timestamp and sync_id) after the
-        clock sync marker is recorded.
-    '''
-    raise NotImplementedError
-
-  def GetResults(self, timeout=None):
-    '''Get the completed trace for this agent, stopping with timeout
-
-    Get the completed trace for this agent. Call only after
-    StopAgentTracing is done. This function blocks until the result
-    is collected (note; this may take several seconds). Stops with timeout
-    if not completed within self._options.collection_timeout seconds.
-
-    Args:
-        timeout: Timeout interval in seconds.
-    Returns:
-        Completed trace for this agent.
-    '''
-    pass
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py b/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py
deleted file mode 100644
index b9596ef..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-
-from systrace import util
-
-from devil.android import device_utils
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-
-
-class BaseAgentTest(unittest.TestCase):
-  def setUp(self):
-    devices = device_utils.DeviceUtils.HealthyDevices()
-    self.browser = 'stable'
-    self.package_info = util.get_supported_browsers()[self.browser]
-    self.device = devices[0]
-
-    curr_browser = self.GetChromeProcessID()
-    if curr_browser is None:
-      self.StartBrowser()
-
-  def tearDown(self):
-    # Stop the browser after each test to ensure that it doesn't interfere
-    # with subsequent tests, e.g. by holding the devtools socket open.
-    self.device.ForceStop(self.package_info.package)
-
-  def StartBrowser(self):
-    # Turn on the device screen.
-    self.device.SetScreen(True)
-
-    # Unlock device.
-    self.device.SendKeyEvent(keyevent.KEYCODE_MENU)
-
-    # Start browser.
-    self.device.StartActivity(
-      intent.Intent(activity=self.package_info.activity,
-                    package=self.package_info.package,
-                    data='about:blank',
-                    extras={'create_new_tab': True}),
-      blocking=True, force_stop=True)
-
-  def GetChromeProcessID(self):
-    return self.device.GetApplicationPids(
-        self.package_info.package, at_most_one=True)
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/android_cgroup_agent.py b/systrace/catapult/systrace/systrace/tracing_agents/android_cgroup_agent.py
deleted file mode 100644
index a6715ef..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/android_cgroup_agent.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Tracing agent that captures cgroup information from /dev/cpuset on
-# an Android device.
-
-import stat
-import py_utils
-
-from devil.android import device_utils
-from systrace import tracing_agents
-from systrace import trace_result
-
-# identify this as trace of cgroup state
-# for now fake it as trace as no importer supports it
-TRACE_HEADER = '# tracer: \nCGROUP DUMP\n'
-
-def add_options(parser): # pylint: disable=unused-argument
-  return None
-
-def try_create_agent(config):
-  if config.target != 'android':
-    return None
-  if not config.atrace_categories:
-    return None
-  # 'sched' contains cgroup events
-  if 'sched' not in config.atrace_categories:
-    return None
-  if config.from_file is not None:
-    return None
-  return AndroidCgroupAgent()
-
-def get_config(options):
-  return options
-
-def parse_proc_cgroups(cgroups, subsys):
-  for line in cgroups.split('\n'):
-    if line.startswith(subsys):
-      return line.split()[1]
-  return '-1'
-
-class AndroidCgroupAgent(tracing_agents.TracingAgent):
-  def __init__(self):
-    super(AndroidCgroupAgent, self).__init__()
-    self._config = None
-    self._device_utils = None
-    self._trace_data = ""
-
-  def __repr__(self):
-    return 'cgroup_data'
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._config = config
-    self._device_utils = device_utils.DeviceUtils(
-        self._config.device_serial_number)
-
-    if not self._device_utils.HasRoot():
-      return False
-
-    self._trace_data += self._get_cgroup_info()
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    result = TRACE_HEADER + self._trace_data
-    return trace_result.TraceResult('cgroupDump', result)
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    pass
-
-  def _get_cgroup_info(self):
-    data = []
-    CGROUP_SUBSYS = 'cpuset'
-    CGROUP_ROOT = '/dev/cpuset/'
-
-    cgroups = self._device_utils.ReadFile('/proc/cgroups')
-    header = '# cgroup task attachment\n'
-
-    root_id = parse_proc_cgroups(cgroups, CGROUP_SUBSYS)
-
-    for cgrp in self._device_utils.StatDirectory(CGROUP_ROOT):
-      if not stat.S_ISDIR(cgrp['st_mode']):
-        continue
-      tasks_file = CGROUP_ROOT + cgrp['filename'] + '/tasks'
-      tasks = self._device_utils.ReadFile(tasks_file).split('\n')
-      cgrp_info = '/%s (root=%s) : ' % (cgrp['filename'], root_id)
-      data.append(cgrp_info  + ' '.join(tasks))
-    return cgroups + header + '\n'.join(data) + '\n'
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py b/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py
deleted file mode 100644
index b809a0c..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Tracing agent that captures friendly process and thread data - names, pids and
-# tids and names, etc to enrich display in the trace viewer. Captures snapshots
-# of the output of 'ps' on the device at intervals.
-
-import logging
-import py_utils
-
-from devil.android import device_utils
-from devil.android.device_errors import AdbShellCommandFailedError
-from systrace import tracing_agents
-from systrace import trace_result
-
-# Leftmost output columns match those used on legacy devices.
-# Get thread names separately as there may be spaces that breaks col
-# splitting.
-# TODO(benm): Refactor device_utils.GetPids to get threads and use that here.
-PS_COMMAND_PROC = "ps -A -o USER,PID,PPID,VSIZE,RSS,WCHAN,ADDR=PC,S,NAME,COMM" \
-    "&& ps -AT -o USER,PID,TID,CMD"
-
-# Fallback for old devices.
-PS_COMMAND_PROC_LEGACY = "ps && ps -t"
-
-# identify this as trace of thread / process state
-TRACE_HEADER = 'PROCESS DUMP\n'
-
-def try_create_agent(config):
-  if config.target != 'android':
-    return None
-  if config.from_file is not None:
-    return None
-  if config.process_dump_enable:
-    # Since AtraceProcessDumpAgent was enabled it's unnecessary to collect ps
-    # data because each process memory dump updates information about processes
-    # and their threads. It's more complete data than two ps snapshots for an
-    # entire trace. However, that agent isn't enabled by default.
-    return None
-  return AndroidProcessDataAgent()
-
-def get_config(options):
-  return options
-
-class AndroidProcessDataAgent(tracing_agents.TracingAgent):
-  def __init__(self):
-    super(AndroidProcessDataAgent, self).__init__()
-    self._trace_data = ""
-    self._device = None
-
-  def __repr__(self):
-    return 'android_process_data'
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._device = device_utils.DeviceUtils(config.device_serial_number)
-    self._trace_data += self._get_process_snapshot()
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    self._trace_data += self._get_process_snapshot()
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    result = TRACE_HEADER + self._trace_data
-    return trace_result.TraceResult('androidProcessDump', result)
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    pass
-
-  def _get_process_snapshot(self):
-    use_legacy = False
-    try:
-      dump = self._device.RunShellCommand( \
-          PS_COMMAND_PROC, check_return=True, as_root=True, shell=True)
-    except AdbShellCommandFailedError:
-      use_legacy = True
-
-    # Check length of 2 as we execute two commands, which in case of failure
-    # on old devices output 1 line each.
-    if use_legacy or len(dump) == 2:
-      logging.debug('Couldn\'t parse ps dump, trying legacy method ...')
-      dump = self._device.RunShellCommand( \
-          PS_COMMAND_PROC_LEGACY, check_return=True, as_root=True, shell=True)
-      if len(dump) == 2:
-        logging.error('Unable to extract process data!')
-        return ""
-
-    return '\n'.join(dump) + '\n'
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py b/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py
deleted file mode 100644
index 05c4330..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py
+++ /dev/null
@@ -1,475 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import platform
-import re
-import sys
-import threading
-import zlib
-
-import py_utils
-
-from devil.android import device_utils
-from devil.android.sdk import version_codes
-from py_trace_event import trace_time as trace_time_module
-from systrace import trace_result
-from systrace import tracing_agents
-from systrace import util
-
-# Text that ADB sends, but does not need to be displayed to the user.
-ADB_IGNORE_REGEXP = r'^capturing trace\.\.\. done|^capturing trace\.\.\.'
-# The number of seconds to wait on output from ADB.
-ADB_STDOUT_READ_TIMEOUT = 0.2
-# The number of seconds to wait for large output from ADB.
-ADB_LARGE_OUTPUT_TIMEOUT = 600
-# The adb shell command to initiate a trace.
-ATRACE_BASE_ARGS = ['atrace']
-# If a custom list of categories is not specified, traces will include
-# these categories (if available on the device).
-DEFAULT_CATEGORIES = 'am,binder_driver,camera,dalvik,freq,'\
-                     'gfx,hal,idle,input,memory,memreclaim,'\
-                     'res,sched,sync,view,webview,wm,workq'
-# The command to list trace categories.
-LIST_CATEGORIES_ARGS = ATRACE_BASE_ARGS + ['--list_categories']
-# Minimum number of seconds between displaying status updates.
-MIN_TIME_BETWEEN_STATUS_UPDATES = 0.2
-# ADB sends this text to indicate the beginning of the trace data.
-TRACE_START_REGEXP = r'TRACE\:'
-# Plain-text trace data should always start with this string.
-TRACE_TEXT_HEADER = '# tracer'
-_FIX_MISSING_TGIDS = True
-_FIX_CIRCULAR_TRACES = True
-
-
-def list_categories(config):
-  """List the possible trace event categories.
-
-  This function needs the tracing config since it needs to get the serial
-  number of the device to send a command to.
-
-  Args:
-      config: Tracing config.
-  """
-  devutils = device_utils.DeviceUtils(config.device_serial_number)
-  categories = devutils.RunShellCommand(
-      LIST_CATEGORIES_ARGS, check_return=True)
-
-  device_sdk_version = util.get_device_sdk_version()
-  if device_sdk_version < version_codes.MARSHMALLOW:
-    # work around platform bug where rs tag would corrupt trace until M(Api23)
-    categories = [c for c in categories if not re.match(r'^\s*rs\s*-', c)]
-
-  print '\n'.join(categories)
-  if not devutils.HasRoot():
-    print '\nNOTE: more categories may be available with adb root\n'
-
-
-def get_available_categories(config, device_sdk_version):
-  """Gets the list of atrace categories available for tracing.
-  Args:
-      config: Tracing config.
-      device_sdk_version: Sdk version int of device to be queried.
-  """
-  devutils = device_utils.DeviceUtils(config.device_serial_number)
-  categories_output = devutils.RunShellCommand(
-      LIST_CATEGORIES_ARGS, check_return=True)
-  categories = [c.split('-')[0].strip() for c in categories_output]
-
-  if device_sdk_version < version_codes.MARSHMALLOW:
-    # work around platform bug where rs tag would corrupt trace until M(Api23)
-    categories = [c for c in categories if c != 'rs']
-  return categories
-
-
-def try_create_agent(config):
-  """Create an Atrace agent.
-
-  Args:
-      config: Command line config.
-  """
-  if config.target != 'android':
-    return None
-  if config.from_file is not None:
-    return None
-
-  if not config.atrace_categories:
-    return None
-
-  # Check device SDK version.
-  device_sdk_version = util.get_device_sdk_version()
-  if device_sdk_version < version_codes.JELLY_BEAN_MR2:
-    print ('Device SDK versions < 18 (Jellybean MR2) not supported.\n'
-           'Your device SDK version is %d.' % device_sdk_version)
-    return None
-
-  return AtraceAgent(device_sdk_version,
-                     util.get_tracing_path(config.device_serial_number))
-
-def _construct_extra_atrace_args(config, categories):
-  """Construct extra arguments (-a, -k, categories) for atrace command.
-
-  Args:
-      config: Tracing config.
-  """
-  extra_args = []
-
-  if config.app_name is not None:
-    extra_args.extend(['-a', config.app_name])
-
-  if config.kfuncs is not None:
-    extra_args.extend(['-k', config.kfuncs])
-
-  extra_args.extend(categories)
-  return extra_args
-
-def _construct_atrace_args(config, categories):
-  """Builds the command used to invoke a trace process.
-  Returns:
-    A tuple where the first element is an array of command arguments, and
-    the second element is a boolean which will be true if the command will
-    stream trace data.
-  """
-  atrace_args = ATRACE_BASE_ARGS[:]
-
-  if config.compress_trace_data:
-    atrace_args.extend(['-z'])
-
-  if (config.trace_time is not None) and (config.trace_time > 0):
-    atrace_args.extend(['-t', str(config.trace_time)])
-
-  if (config.trace_buf_size is not None) and (config.trace_buf_size > 0):
-    atrace_args.extend(['-b', str(config.trace_buf_size)])
-
-  elif 'webview' in categories and 'sched' in categories:
-    # https://crbug.com/814330: webview_startup sometimes exceeds the buffer
-    # limit, so doubling this.
-    atrace_args.extend(['-b', '8192'])
-
-  elif 'sched' in categories:
-    # 'sched' is a high-volume tag, double the default buffer size
-    # to accommodate that
-    atrace_args.extend(['-b', '4096'])
-  extra_args = _construct_extra_atrace_args(config, categories)
-
-  atrace_args.extend(extra_args)
-  return atrace_args
-
-
-class AtraceAgent(tracing_agents.TracingAgent):
-
-  def __init__(self, device_sdk_version, tracing_path):
-    super(AtraceAgent, self).__init__()
-    self._device_sdk_version = device_sdk_version
-    self._tracing_path = tracing_path
-    self._adb = None
-    self._trace_data = None
-    self._tracer_args = None
-    self._collection_thread = None
-    self._device_utils = None
-    self._device_serial_number = None
-    self._config = None
-    self._categories = None
-
-  def __repr__(self):
-    return 'atrace'
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    assert config.atrace_categories, 'Atrace categories are missing!'
-    self._config = config
-    self._categories = config.atrace_categories
-    if isinstance(self._categories, list):
-      self._categories = ','.join(self._categories)
-    avail_cats = get_available_categories(config, self._device_sdk_version)
-    unavailable = [x for x in self._categories.split(',') if
-        x not in avail_cats]
-    self._categories = [x for x in self._categories.split(',') if
-        x in avail_cats]
-    if unavailable:
-      print 'These categories are unavailable: ' + ' '.join(unavailable)
-    self._device_utils = device_utils.DeviceUtils(config.device_serial_number)
-    self._device_serial_number = config.device_serial_number
-    self._tracer_args = _construct_atrace_args(config,
-                                               self._categories)
-    self._device_utils.RunShellCommand(
-        self._tracer_args + ['--async_start'], check_return=True)
-    return True
-
-  def _collect_and_preprocess(self):
-    """Collects and preprocesses trace data.
-
-    Stores results in self._trace_data.
-    """
-    trace_data = self._collect_trace_data()
-    self._trace_data = self._preprocess_trace_data(trace_data)
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    """Stops tracing and starts collecting results.
-
-    To synchronously retrieve the results after calling this function,
-    call GetResults().
-    """
-    self._collection_thread = threading.Thread(
-        target=self._collect_and_preprocess)
-    self._collection_thread.start()
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    """Waits for collection thread to finish and returns trace results."""
-    self._collection_thread.join()
-    self._collection_thread = None
-    return trace_result.TraceResult('systemTraceEvents', self._trace_data)
-
-  def SupportsExplicitClockSync(self):
-    return True
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    """Records a clock sync marker.
-
-    Args:
-        sync_id: ID string for clock sync marker.
-    """
-    cmd = 'echo trace_event_clock_sync: name=%s >' \
-        ' %s/trace_marker' % (sync_id, self._tracing_path)
-    with self._device_utils.adb.PersistentShell(
-        self._device_serial_number) as shell:
-      t1 = trace_time_module.Now()
-      shell.RunCommand(cmd, close=True)
-      did_record_sync_marker_callback(t1, sync_id)
-
-  def _stop_collect_trace(self):
-    """Stops atrace.
-
-    Note that prior to Api 23, --async-stop isn't working correctly. It
-    doesn't stop tracing and clears trace buffer before dumping it rendering
-    results unusable."""
-    if self._device_sdk_version < version_codes.MARSHMALLOW:
-      is_trace_enabled_file = '%s/tracing_on' % self._tracing_path
-      # Stop tracing first so new data won't arrive while dump is performed (it
-      # may take a non-trivial time and tracing buffer may overflow).
-      self._device_utils.WriteFile(is_trace_enabled_file, '0')
-      result = self._device_utils.RunShellCommand(
-          self._tracer_args + ['--async_dump'], raw_output=True,
-          large_output=True, check_return=True,
-          timeout=ADB_LARGE_OUTPUT_TIMEOUT)
-      # Run synchronous tracing for 0 seconds to stop tracing, clear buffers
-      # and other state.
-      self._device_utils.RunShellCommand(
-          self._tracer_args + ['-t 0'], check_return=True)
-    else:
-      # On M+ --async_stop does everything necessary
-      result = self._device_utils.RunShellCommand(
-          self._tracer_args + ['--async_stop'], raw_output=True,
-          large_output=True, check_return=True,
-          timeout=ADB_LARGE_OUTPUT_TIMEOUT)
-
-    return result
-
-  def _collect_trace_data(self):
-    """Reads the output from atrace and stops the trace."""
-    result = self._stop_collect_trace()
-
-    data_start = re.search(TRACE_START_REGEXP, result)
-    if data_start:
-      data_start = data_start.end(0)
-    else:
-      raise IOError('Unable to get atrace data. Did you forget adb root?')
-    output = re.sub(ADB_IGNORE_REGEXP, '', result[data_start:])
-    return output
-
-  def _preprocess_trace_data(self, trace_data):
-    """Performs various processing on atrace data.
-
-    Args:
-      trace_data: The raw trace data.
-    Returns:
-      The processed trace data.
-    """
-    if trace_data:
-      trace_data = strip_and_decompress_trace(trace_data)
-
-    if not trace_data:
-      print >> sys.stderr, ('No data was captured.  Output file was not '
-                            'written.')
-      sys.exit(1)
-
-    if _FIX_MISSING_TGIDS:
-      # Gather proc data from device and patch tgids
-      procfs_dump = self._device_utils.RunShellCommand(
-          'echo -n /proc/[0-9]*/task/[0-9]*',
-          shell=True, check_return=True)[0].split(' ')
-      pid2_tgid = extract_tgids(procfs_dump)
-      trace_data = fix_missing_tgids(trace_data, pid2_tgid)
-
-    if _FIX_CIRCULAR_TRACES:
-      trace_data = fix_circular_traces(trace_data)
-
-    return trace_data
-
-def extract_tgids(trace_lines):
-  """Removes the procfs dump from the given trace text
-
-  Args:
-    trace_lines: The text portion of the trace
-
-  Returns:
-    a map of pids to their tgid.
-  """
-  tgid_2pid = {}
-  for line in trace_lines:
-    result = re.match('^/proc/([0-9]+)/task/([0-9]+)', line)
-    if result:
-      parent_pid, tgid = result.group(1, 2)
-      tgid_2pid[tgid] = parent_pid
-
-  return tgid_2pid
-
-
-def strip_and_decompress_trace(trace_data):
-  """Fixes new-lines and decompresses trace data.
-
-  Args:
-    trace_data: The trace data returned by atrace.
-  Returns:
-    The decompressed trace data.
-  """
-  # Collapse CRLFs that are added by adb shell.
-  if trace_data.startswith('\r\n'):
-    trace_data = trace_data.replace('\r\n', '\n')
-  elif trace_data.startswith('\r\r\n'):
-    # On windows, adb adds an extra '\r' character for each line.
-    trace_data = trace_data.replace('\r\r\n', '\n')
-
-  # Skip the initial newline.
-  if trace_data[0] == '\n':
-    trace_data = trace_data[1:]
-
-  if not trace_data.startswith(TRACE_TEXT_HEADER):
-    # No header found, so assume the data is compressed.
-    trace_data = zlib.decompress(trace_data)
-
-  # Enforce Unix line-endings.
-  trace_data = trace_data.replace('\r', '')
-
-  # Skip any initial newlines.
-  while trace_data and trace_data[0] == '\n':
-    trace_data = trace_data[1:]
-
-  return trace_data
-
-
-def fix_missing_tgids(trace_data, pid2_tgid):
-  """Replaces missing TGIDs from the trace data with those found in procfs
-
-  Args:
-    trace_data: the atrace data
-
-  Returns:
-    The updated trace data with missing TGIDs replaced with the correct TGID
-  """
-
-  def repl(m):
-    tid = m.group(2)
-    if (int(tid) > 0 and m.group(1) != '<idle>' and m.group(3) == '(-----)'
-        and tid in pid2_tgid):
-      # returns Proc_name-PID (TGID)
-      # Binder_2-381 (-----) becomes Binder_2-381 (128)
-      return m.group(1) + '-' + m.group(2) + ' ( ' + pid2_tgid[tid] + ')'
-
-    return m.group(0)
-
-  # matches something like:
-  # Binder_2-895 (-----)
-  trace_data = re.sub(r'^\s*(\S+)-(\d+)\s+(\(\S+\))', repl, trace_data,
-                      flags=re.MULTILINE)
-  return trace_data
-
-
-def fix_circular_traces(out):
-  """Fix inconsistentcies in traces due to circular buffering.
-
-  The circular buffers are kept per CPU, so it is not guaranteed that the
-  beginning of a slice is overwritten before the end. To work around this, we
-  throw away the prefix of the trace where not all CPUs have events yet.
-
-  Args:
-    out: The data to fix.
-  Returns:
-    The updated trace data.
-  """
-  # If any of the CPU's buffers have filled up and
-  # older events have been dropped, the kernel
-  # emits markers of the form '##### CPU 2 buffer started ####' on
-  # the line before the first event in the trace on that CPU.
-  #
-  # No such headers are emitted if there were no overflows or the trace
-  # was captured with non-circular buffers.
-  buffer_start_re = re.compile(r'^#+ CPU \d+ buffer started', re.MULTILINE)
-
-  start_of_full_trace = 0
-
-  while True:
-    result = buffer_start_re.search(out, start_of_full_trace + 1)
-    if result:
-      start_of_full_trace = result.start()
-    else:
-      break
-
-  if start_of_full_trace > 0:
-    # Need to keep the header intact to make the importer happy.
-    end_of_header = re.search(r'^[^#]', out, re.MULTILINE).start()
-    out = out[:end_of_header] + out[start_of_full_trace:]
-  return out
-
-
-class AtraceConfig(tracing_agents.TracingConfig):
-  def __init__(self, atrace_categories, trace_buf_size, kfuncs,
-               app_name, compress_trace_data, from_file,
-               device_serial_number, trace_time, target):
-    tracing_agents.TracingConfig.__init__(self)
-    self.atrace_categories = atrace_categories
-    self.trace_buf_size = trace_buf_size
-    self.kfuncs = kfuncs
-    self.app_name = app_name
-    # Trace compression is broken on Windows.
-    # TODO: Fix https://crbug.com/739751.
-    self.compress_trace_data = \
-        compress_trace_data and platform.system() != 'Windows'
-    self.from_file = from_file
-    self.device_serial_number = device_serial_number
-    self.trace_time = trace_time
-    self.target = target
-
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Atrace options')
-  options.add_option('--atrace-categories', dest='atrace_categories',
-                     help='Select atrace categories with a comma-delimited '
-                     'list, e.g. --atrace-categories=cat1,cat2,cat3')
-  options.add_option('-k', '--ktrace', dest='kfuncs', action='store',
-                     help='specify a comma-separated list of kernel functions '
-                     'to trace')
-  options.add_option('--no-compress', dest='compress_trace_data',
-                     default=True, action='store_false',
-                     help='Tell the device not to send the trace data in '
-                     'compressed form.')
-  options.add_option('-a', '--app', dest='app_name', default=None,
-                     type='string', action='store',
-                     help='enable application-level tracing for '
-                     'comma-separated list of app cmdlines')
-  options.add_option('--from-file', dest='from_file',
-                     action='store', help='read the trace from a '
-                     'file (compressed) rather than running a '
-                     'live trace')
-  return options
-
-def get_config(options):
-  return AtraceConfig(options.atrace_categories,
-                      options.trace_buf_size, options.kfuncs,
-                      options.app_name, options.compress_trace_data,
-                      options.from_file, options.device_serial_number,
-                      options.trace_time, options.target)
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py b/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py
deleted file mode 100755
index 203e846..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import logging
-import os
-import unittest
-
-from systrace import decorators
-from systrace import run_systrace
-from systrace import util
-from systrace.tracing_agents import atrace_agent
-
-from devil.android import device_utils
-from devil.android.sdk import intent
-from py_utils import tempfile_ext
-
-
-DEVICE_SERIAL = 'AG8404EC0444AGC'
-ATRACE_ARGS = ['atrace', '-z', '-t', '10', '-b', '4096']
-CATEGORIES = ['sched', 'gfx', 'view', 'wm']
-ADB_SHELL = ['adb', '-s', DEVICE_SERIAL, 'shell']
-
-SYSTRACE_CMD = ['./run_systrace.py', '--time', '10', '-o', 'out.html', '-e',
-                DEVICE_SERIAL] + CATEGORIES
-TRACE_ARGS = (ATRACE_ARGS + CATEGORIES)
-
-TEST_DIR = os.path.join(os.path.dirname(__file__), os.pardir, 'test_data')
-ATRACE_DATA = os.path.join(TEST_DIR, 'atrace_data')
-ATRACE_DATA_RAW = os.path.join(TEST_DIR, 'atrace_data_raw')
-ATRACE_DATA_STRIPPED = os.path.join(TEST_DIR, 'atrace_data_stripped')
-ATRACE_PROCFS_DUMP = os.path.join(TEST_DIR, 'atrace_procfs_dump')
-ATRACE_EXTRACTED_TGIDS = os.path.join(TEST_DIR, 'atrace_extracted_tgids')
-ATRACE_MISSING_TGIDS = os.path.join(TEST_DIR, 'atrace_missing_tgids')
-ATRACE_FIXED_TGIDS = os.path.join(TEST_DIR, 'atrace_fixed_tgids')
-
-
-class AtraceAgentTest(unittest.TestCase):
-
-  # TODO(washingtonp): These end-to-end tests do not work on the Trybot server
-  # because adb cannot be found on the Trybot servers. Figure out what the
-  # issue is and update this test.
-  @decorators.Disabled
-  def test_tracing(self):
-    TRACE_BUFFER_SIZE = '16384'
-    TRACE_TIME = '5'
-
-    devices = device_utils.DeviceUtils.HealthyDevices()
-    package_info = util.get_supported_browsers()['stable']
-    device = devices[0]
-    with tempfile_ext.TemporaryFileName() as output_file_name:
-      # Launch the browser before tracing.
-      device.StartActivity(
-          intent.Intent(activity=package_info.activity,
-                        package=package_info.package,
-                        data='about:blank',
-                        extras={'create_new_tab': True}),
-          blocking=True, force_stop=True)
-
-      # Run atrace agent.
-      run_systrace.main_impl(['./run_systrace.py',
-                              '-b',
-                              TRACE_BUFFER_SIZE,
-                              '-t',
-                              TRACE_TIME,
-                              '-o',
-                              output_file_name,
-                              '-e',
-                              str(device),
-                              '--atrace-categories=gfx,input,view'])
-
-      # Verify results.
-      with open(output_file_name, 'r') as f:
-        full_trace = f.read()
-      self.assertTrue('CPU#' in full_trace)
-
-  @decorators.HostOnlyTest
-  def test_construct_atrace_args(self):
-    options, categories = run_systrace.parse_options(SYSTRACE_CMD)
-    options.atrace_categories = categories
-    tracer_args = atrace_agent._construct_atrace_args(options, categories)
-    self.assertEqual(' '.join(TRACE_ARGS), ' '.join(tracer_args))
-
-  @decorators.HostOnlyTest
-  def test_strip_and_decompress_trace(self):
-    with contextlib.nested(open(ATRACE_DATA_RAW, 'r'),
-                           open(ATRACE_DATA_STRIPPED, 'r')) as (f1, f2):
-      atrace_data_raw = f1.read()
-      atrace_data_stripped = f2.read()
-
-      trace_data = atrace_agent.strip_and_decompress_trace(atrace_data_raw)
-      self.assertEqual(atrace_data_stripped, trace_data)
-
-  @decorators.HostOnlyTest
-  def test_extract_tgids(self):
-    with contextlib.nested(open(ATRACE_PROCFS_DUMP, 'r'),
-                           open(ATRACE_EXTRACTED_TGIDS, 'r')) as (f1, f2):
-
-      atrace_procfs_dump = f1.read()
-      atrace_procfs_extracted = f2.read()
-
-      tgids = eval(atrace_procfs_extracted)
-      result = atrace_agent.extract_tgids(atrace_procfs_dump.splitlines())
-
-      self.assertEqual(result, tgids)
-
-  @decorators.HostOnlyTest
-  def test_fix_missing_tgids(self):
-    with contextlib.nested(open(ATRACE_EXTRACTED_TGIDS, 'r'),
-                           open(ATRACE_MISSING_TGIDS, 'r'),
-                           open(ATRACE_FIXED_TGIDS, 'r')) as (f1, f2, f3):
-
-      atrace_data = f2.read()
-      tgid_map = eval(f1.read())
-      fixed = f3.read()
-
-      res = atrace_agent.fix_missing_tgids(atrace_data, tgid_map)
-      self.assertEqual(res, fixed)
-
-
-if __name__ == "__main__":
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py b/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py
deleted file mode 100644
index 4765e73..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import re
-import stat
-import subprocess
-import sys
-import urllib2
-
-import py_utils
-
-from systrace import trace_result
-from systrace import tracing_agents
-from systrace.tracing_agents import atrace_agent
-
-
-# ADB sends this text to indicate the beginning of the trace data.
-TRACE_START_REGEXP = r'TRACE\:'
-# Text that ADB sends, but does not need to be displayed to the user.
-ADB_IGNORE_REGEXP = r'^capturing trace\.\.\. done|^capturing trace\.\.\.'
-
-T2T_OUTPUT = 'trace.systrace'
-
-def try_create_agent(options):
-  if options.from_file is not None:
-    with open(options.from_file, 'rb') as f_in:
-      if is_perfetto(f_in):
-        if convert_perfetto_trace(options.from_file):
-          options.from_file = T2T_OUTPUT
-        else:
-          print ('Perfetto trace file: ' + options.from_file +
-                 ' could not be converted.')
-          sys.exit(1)
-    return AtraceFromFileAgent(options)
-  else:
-    return False
-
-def convert_perfetto_trace(in_file):
-  traceconv_path = os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                          '../traceconv'))
-  try:
-    traceconv = urllib2.urlopen('https://get.perfetto.dev/traceconv')
-    with open(traceconv_path, 'w') as out:
-      out.write(traceconv.read())
-  except urllib2.URLError:
-    print 'Could not download traceconv to convert the Perfetto trace.'
-    sys.exit(1)
-  os.chmod(traceconv_path, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR)
-  return subprocess.call([traceconv_path, 'systrace', in_file, T2T_OUTPUT]) == 0
-
-def is_perfetto(from_file):
-  # Starts with a preamble for field ID=1 (TracePacket)
-  if ord(from_file.read(1)) != 0x0a:
-    return False
-  for _ in range(10): # Check the first 10 packets are structured correctly
-    # Then a var int that specifies field size
-    field_size = 0
-    shift = 0
-    while True:
-      c = ord(from_file.read(1))
-      field_size |= (c & 0x7f) << shift
-      shift += 7
-      if not c & 0x80:
-        break
-    # The packet itself
-    from_file.seek(field_size, os.SEEK_CUR)
-    # The preamble for the next field ID=1 (TracePacket)
-    if ord(from_file.read(1)) != 0x0a:
-      return False
-  # Go back to the beginning of the file
-  from_file.seek(0)
-  return True
-
-class AtraceFromFileConfig(tracing_agents.TracingConfig):
-  def __init__(self, from_file):
-    tracing_agents.TracingConfig.__init__(self)
-    self.fix_circular = True
-    self.from_file = from_file
-
-def add_options(parser): # pylint: disable=unused-argument
-  # The atrace_from_file_agent is not currently used, so don't display
-  # any options.
-  return None
-
-def get_config(options):
-  return AtraceFromFileConfig(options.from_file)
-
-
-class AtraceFromFileAgent(tracing_agents.TracingAgent):
-  def __init__(self, options):
-    super(AtraceFromFileAgent, self).__init__()
-    self._filename = os.path.expanduser(options.from_file)
-    self._trace_data = False
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    # pylint: disable=unused-argument
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    self._trace_data = self._read_trace_data()
-    return True
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_clock_sync_callback):
-    raise NotImplementedError
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    return trace_result.TraceResult('trace-data', self._trace_data)
-
-  def _read_trace_data(self):
-    with open(self._filename, 'rb') as f:
-      result = f.read()
-    data_start = re.search(TRACE_START_REGEXP, result).end(0)
-    data = re.sub(ADB_IGNORE_REGEXP, '', result[data_start:])
-    return self._preprocess_data(data)
-
-  # pylint: disable=no-self-use
-  def _preprocess_data(self, data):
-    # TODO: add fix_threads and fix_tgids options back in here
-    # once we embed the dump data in the file (b/27504068)
-    data = atrace_agent.strip_and_decompress_trace(data)
-    data = atrace_agent.fix_circular_traces(data)
-    return data
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py b/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py
deleted file mode 100755
index 53e7943..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import unittest
-
-from py_utils import tempfile_ext
-from systrace import decorators
-from systrace import run_systrace
-from systrace import update_systrace_trace_viewer
-
-
-TEST_DIR = os.path.join(os.path.dirname(__file__), '..', 'test_data')
-
-COMPRESSED_ATRACE_DATA = os.path.join(TEST_DIR, 'compressed_atrace_data.txt')
-DECOMPRESSED_ATRACE_DATA = os.path.join(TEST_DIR,
-                                        'decompressed_atrace_data.txt')
-NON_EXISTENT_DATA = os.path.join(TEST_DIR, 'THIS_FILE_DOES_NOT_EXIST.txt')
-
-
-class AtraceFromFileAgentTest(unittest.TestCase):
-  @decorators.HostOnlyTest
-  def test_from_file(self):
-    update_systrace_trace_viewer.update(force_update=True)
-    self.assertTrue(os.path.exists(
-        update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
-    try:
-      with tempfile_ext.TemporaryFileName() as output_file_name:
-        # use from-file to create a specific expected output
-        run_systrace.main_impl(['./run_systrace.py',
-                                '--from-file',
-                                COMPRESSED_ATRACE_DATA,
-                                '-o',
-                                output_file_name])
-        # and verify file contents
-        with contextlib.nested(open(output_file_name, 'r'),
-                               open(DECOMPRESSED_ATRACE_DATA, 'r')) as (f1, f2):
-          full_trace = f1.read()
-          expected_contents = f2.read()
-          self.assertTrue(expected_contents in full_trace)
-    finally:
-      os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
-
-
-  @decorators.HostOnlyTest
-  def test_default_output_filename(self):
-    update_systrace_trace_viewer.update(force_update=True)
-    self.assertTrue(os.path.exists(
-        update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
-    output_file_name = os.path.join(TEST_DIR, 'compressed_atrace_data.html')
-    try:
-      # use from-file to create a specific expected output
-      run_systrace.main_impl(['./run_systrace.py',
-                              '--from-file',
-                              COMPRESSED_ATRACE_DATA])
-      # and verify file contents
-      with contextlib.nested(open(output_file_name, 'r'),
-                             open(DECOMPRESSED_ATRACE_DATA, 'r')) as (f1, f2):
-        full_trace = f1.read()
-        expected_contents = f2.read()
-        self.assertTrue(expected_contents in full_trace)
-    except:
-      raise
-    finally:
-      os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
-      if os.path.exists(output_file_name):
-        os.remove(output_file_name)
-
-
-  @decorators.HostOnlyTest
-  def test_missing_file(self):
-    try:
-      run_systrace.main_impl(['./run_systrace.py',
-                              '--from-file',
-                              NON_EXISTENT_DATA])
-      self.fail('should not get here')
-    except IOError:
-      pass
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/atrace_process_dump.py b/systrace/catapult/systrace/systrace/tracing_agents/atrace_process_dump.py
deleted file mode 100644
index 107da58..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/atrace_process_dump.py
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Tracing agent that captures periodic per-process memory dumps and other
-# useful information from ProcFS like utime, stime, OOM stats, etc.
-
-import json
-import logging
-import optparse
-import py_utils
-
-from devil.android import device_utils
-from devil.android.device_errors import AdbShellCommandFailedError
-from py_trace_event import trace_time as trace_time_module
-from systrace import tracing_agents
-from systrace import trace_result
-
-TRACE_HEADER = 'ATRACE_PROCESS_DUMP'
-TRACE_RESULT_NAME = 'atraceProcessDump'
-
-HELPER_COMMAND = '/data/local/tmp/atrace_helper'
-HELPER_STOP_COMMAND = 'kill -TERM `pidof atrace_helper`'
-HELPER_DUMP_JSON = '/data/local/tmp/procdump.json'
-
-
-class AtraceProcessDumpAgent(tracing_agents.TracingAgent):
-  def __init__(self):
-    super(AtraceProcessDumpAgent, self).__init__()
-    self._device = None
-    self._dump = None
-    self._clock_sync_markers = {}
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    self._device = device_utils.DeviceUtils(config.device_serial_number)
-    cmd = [HELPER_COMMAND, '-b', '-g',
-        '-t', str(config.dump_interval_ms),
-        '-o', HELPER_DUMP_JSON]
-    if config.full_dump_config:
-      cmd += ['-m', config.full_dump_config]
-    if config.enable_mmaps:
-      cmd += ['-s']
-    self._device.RunShellCommand(cmd, check_return=True, as_root=True)
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    self._device.RunShellCommand(
-        HELPER_STOP_COMMAND,
-        shell=True, check_return=True, as_root=True)
-    try:
-      self._device.RunShellCommand(['test', '-f', HELPER_DUMP_JSON],
-          check_return=True, as_root=True)
-      self._dump = self._device.ReadFile(HELPER_DUMP_JSON, force_pull=True)
-      self._device.RunShellCommand(['rm', HELPER_DUMP_JSON],
-          check_return=True, as_root=True)
-    except AdbShellCommandFailedError:
-      logging.error('AtraceProcessDumpAgent failed to pull data. Check device storage.')
-      return False
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    result = TRACE_HEADER + '\n' + self._dump
-    cs = json.dumps(self._clock_sync_markers)
-    result = TRACE_HEADER + \
-        '\n{\"clock_sync_markers\":' + cs + ',\n\"dump\":' + self._dump + '}'
-    return trace_result.TraceResult(TRACE_RESULT_NAME, result)
-
-  def SupportsExplicitClockSync(self):
-    return True
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    with self._device.adb.PersistentShell(self._device.serial) as shell:
-      ts_in_controller_domain = trace_time_module.Now()
-      output = shell.RunCommand(HELPER_COMMAND + ' --echo-ts', close=True)
-      ts_in_agent_domain = int(output[0][0])
-      self._clock_sync_markers[sync_id] = ts_in_agent_domain
-      did_record_sync_marker_callback(ts_in_controller_domain, sync_id)
-
-
-class AtraceProcessDumpConfig(tracing_agents.TracingConfig):
-  def __init__(self, enabled, device_serial_number,
-               dump_interval_ms, full_dump_config, enable_mmaps):
-    tracing_agents.TracingConfig.__init__(self)
-    self.enabled = enabled
-    self.device_serial_number = device_serial_number
-    self.dump_interval_ms = dump_interval_ms
-    self.full_dump_config = full_dump_config
-    self.enable_mmaps = enable_mmaps
-
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Atrace process dump options')
-  options.add_option('--process-dump', dest='process_dump_enable',
-                     default=False, action='store_true',
-                     help='Capture periodic per-process memory dumps.')
-  options.add_option('--process-dump-interval', dest='process_dump_interval_ms',
-                     default=5000,
-                     help='Interval between memory dumps in milliseconds.')
-  options.add_option('--process-dump-full', dest='process_dump_full_config',
-                     default=None,
-                     help='Capture full memory dumps for some processes.\n' \
-                          'Value: all, apps or comma-separated process names.')
-  options.add_option('--process-dump-mmaps', dest='process_dump_mmaps',
-                     default=False, action='store_true',
-                     help='Capture VM regions and memory-mapped files.\n' \
-                          'It increases dump size dramatically, hence only ' \
-                          'has effect if --process-dump-full is a whitelist.')
-  return options
-
-
-def get_config(options):
-  can_enable = (options.target == 'android') and (not options.from_file)
-  return AtraceProcessDumpConfig(
-    enabled=(options.process_dump_enable and can_enable),
-    device_serial_number=options.device_serial_number,
-    dump_interval_ms=options.process_dump_interval_ms,
-    full_dump_config=options.process_dump_full_config,
-    enable_mmaps=options.process_dump_mmaps
-  )
-
-
-def try_create_agent(config):
-  if config.enabled:
-    return AtraceProcessDumpAgent()
-  return None
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py b/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py
deleted file mode 100644
index 8830746..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py
+++ /dev/null
@@ -1,258 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import os
-import py_utils
-
-from systrace import trace_result
-from systrace import tracing_agents
-
-
-class FtraceAgentIo(object):
-  @staticmethod
-  def writeFile(path, data):
-    if FtraceAgentIo.haveWritePermissions(path):
-      with open(path, 'w') as f:
-        f.write(data)
-    else:
-      raise IOError('Cannot write to %s; did you forget sudo/root?' % path)
-
-  @staticmethod
-  def readFile(path):
-    with open(path, 'r') as f:
-      return f.read()
-
-  @staticmethod
-  def haveWritePermissions(path):
-    return os.access(path, os.W_OK)
-
-
-FT_DIR = "/sys/kernel/debug/tracing/"
-FT_CLOCK = FT_DIR + "trace_clock"
-FT_BUFFER_SIZE = FT_DIR + "buffer_size_kb"
-FT_TRACER = FT_DIR + "current_tracer"
-FT_PRINT_TGID = FT_DIR + "options/print-tgid"
-FT_TRACE_ON = FT_DIR + "tracing_on"
-FT_TRACE = FT_DIR + "trace"
-FT_TRACE_MARKER = FT_DIR + "trace_marker"
-FT_OVERWRITE = FT_DIR + "options/overwrite"
-
-all_categories = {
-    "sched": {
-          "desc": "CPU Scheduling",
-          "req": ["sched/sched_switch/", "sched/sched_wakeup/"]
-    },
-    "freq": {
-          "desc": "CPU Frequency",
-          "req": ["power/cpu_frequency/"],
-          "opt": ["power/clock_set_rate/", "clk/clk_set_rate/"]
-    },
-    "irq": {
-          "desc": "CPU IRQS and IPIS",
-          "req": ["irq/"],
-          "opt": ["ipi/"]
-    },
-    "workq": {
-          "desc": "Kernel workqueues",
-          "req": ["workqueue/"]
-    },
-    "memreclaim": {
-          "desc": "Kernel Memory Reclaim",
-          "req": ["vmscan/mm_vmscan_direct_reclaim_begin/",
-                  "vmscan/mm_vmscan_direct_reclaim_end/",
-                  "vmscan/mm_vmscan_kswapd_wake/",
-                  "vmscan/mm_vmscan_kswapd_sleep/"]
-    },
-    "idle": {
-          "desc": "CPU Idle",
-          "req": ["power/cpu_idle/"]
-    },
-    "regulators": {
-          "desc": "Voltage and Current Regulators",
-          "req": ["regulator/"]
-    },
-    "disk": {
-          "desc": "Disk I/O",
-          "req": ["block/block_rq_issue/",
-                  "block/block_rq_complete/"],
-          "opt": ["f2fs/f2fs_sync_file_enter/",
-                  "f2fs/f2fs_sync_file_exit/",
-                  "f2fs/f2fs_write_begin/",
-                  "f2fs/f2fs_write_end/",
-                  "ext4/ext4_da_write_begin/",
-                  "ext4/ext4_da_write_end/",
-                  "ext4/ext4_sync_file_enter/",
-                  "ext4/ext4_sync_file_exit/"]
-    }
-}
-
-
-def try_create_agent(config):
-  if config.target != 'linux':
-    return None
-  return FtraceAgent(FtraceAgentIo)
-
-
-def list_categories(_):
-  agent = FtraceAgent(FtraceAgentIo)
-  agent._print_avail_categories()
-
-
-class FtraceConfig(tracing_agents.TracingConfig):
-  def __init__(self, ftrace_categories, target, trace_buf_size):
-    tracing_agents.TracingConfig.__init__(self)
-    self.ftrace_categories = ftrace_categories
-    self.target = target
-    self.trace_buf_size = trace_buf_size
-
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'Ftrace options')
-  options.add_option('--ftrace-categories', dest='ftrace_categories',
-                     help='Select ftrace categories with a comma-delimited '
-                     'list, e.g. --ftrace-categories=cat1,cat2,cat3')
-  return options
-
-
-def get_config(options):
-  return FtraceConfig(options.ftrace_categories, options.target,
-                      options.trace_buf_size)
-
-
-class FtraceAgent(tracing_agents.TracingAgent):
-
-  def __init__(self, fio=FtraceAgentIo):
-    """Initialize a systrace agent.
-
-    Args:
-      config: The command-line config.
-      categories: The trace categories to capture.
-    """
-    super(FtraceAgent, self).__init__()
-    self._fio = fio
-    self._config = None
-    self._categories = None
-
-  def _get_trace_buffer_size(self):
-    buffer_size = 4096
-    if ((self._config.trace_buf_size is not None)
-        and (self._config.trace_buf_size > 0)):
-      buffer_size = self._config.trace_buf_size
-    return buffer_size
-
-  def _fix_categories(self, categories):
-    """
-    Applies the default category (sched) if there are no categories
-    in the list and removes unavailable categories from the list.
-    Args:
-        categories: List of categories.
-    """
-    if not categories:
-      categories = ["sched"]
-    return [x for x in categories
-            if self._is_category_available(x)]
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    """Start tracing.
-    """
-    self._config = config
-    categories = self._fix_categories(config.ftrace_categories)
-    self._fio.writeFile(FT_BUFFER_SIZE,
-                        str(self._get_trace_buffer_size()))
-    self._fio.writeFile(FT_CLOCK, 'global')
-    self._fio.writeFile(FT_TRACER, 'nop')
-    self._fio.writeFile(FT_OVERWRITE, "0")
-
-    # TODO: riandrews to push necessary patches for TGID option to upstream
-    # linux kernel
-    # self._fio.writeFile(FT_PRINT_TGID, '1')
-
-    for category in categories:
-      self._category_enable(category)
-
-    self._categories = categories # need to store list of categories to disable
-    print 'starting tracing.'
-
-    self._fio.writeFile(FT_TRACE, '')
-    self._fio.writeFile(FT_TRACE_ON, '1')
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    """Collect the result of tracing.
-
-    This function will block while collecting the result. For sync mode, it
-    reads the data, e.g., from stdout, until it finishes. For async mode, it
-    blocks until the agent is stopped and the data is ready.
-    """
-    self._fio.writeFile(FT_TRACE_ON, '0')
-    for category in self._categories:
-      self._category_disable(category)
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    # get the output
-    d = self._fio.readFile(FT_TRACE)
-    self._fio.writeFile(FT_BUFFER_SIZE, "1")
-    return trace_result.TraceResult('trace-data', d)
-
-  def SupportsExplicitClockSync(self):
-    return False
-
-  def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
-    # No implementation, but need to have this to support the API
-    # pylint: disable=unused-argument
-    return False
-
-  def _is_category_available(self, category):
-    if category not in all_categories:
-      return False
-    events_dir = FT_DIR + "events/"
-    req_events = all_categories[category]["req"]
-    for event in req_events:
-      event_full_path = events_dir + event + "enable"
-      if not self._fio.haveWritePermissions(event_full_path):
-        return False
-    return True
-
-  def _avail_categories(self):
-    ret = []
-    for event in all_categories:
-      if self._is_category_available(event):
-        ret.append(event)
-    return ret
-
-  def _print_avail_categories(self):
-    avail = self._avail_categories()
-    if len(avail):
-      print "tracing config:"
-      for category in self._avail_categories():
-        desc = all_categories[category]["desc"]
-        print "{0: <16}".format(category), ": ", desc
-    else:
-      print "No tracing categories available - perhaps you need root?"
-
-  def _category_enable_paths(self, category):
-    events_dir = FT_DIR + "events/"
-    req_events = all_categories[category]["req"]
-    for event in req_events:
-      event_full_path = events_dir + event + "enable"
-      yield event_full_path
-    if "opt" in all_categories[category]:
-      opt_events = all_categories[category]["opt"]
-      for event in opt_events:
-        event_full_path = events_dir + event + "enable"
-        if self._fio.haveWritePermissions(event_full_path):
-          yield event_full_path
-
-  def _category_enable(self, category):
-    for path in self._category_enable_paths(category):
-      self._fio.writeFile(path, "1")
-
-  def _category_disable(self, category):
-    for path in self._category_enable_paths(category):
-      self._fio.writeFile(path, "0")
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py b/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py
deleted file mode 100755
index fdc54cd..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import unittest
-import logging
-
-from systrace import decorators
-from systrace import run_systrace
-from systrace.tracing_agents import ftrace_agent
-
-
-SYSTRACE_HOST_CMD_DEFAULT = ['./systrace.py', '--target=linux']
-FT_DIR = "/sys/kernel/debug/tracing/"
-FT_EVENT_DIR = FT_DIR + "events/"
-FT_TRACE_ON = FT_DIR + "tracing_on"
-FT_TRACE = FT_DIR + "trace"
-FT_BUFFER_SIZE = FT_DIR + "buffer_size_kb"
-
-
-def make_test_io_interface(permitted_files):
-  class TestIoImpl(object):
-
-    @staticmethod
-    def writeFile(path, data):
-      permitted_files[path] = data
-
-    @staticmethod
-    def readFile(path):
-      if path in permitted_files:
-        return permitted_files[path]
-      else:
-        return ""
-
-    @staticmethod
-    def haveWritePermissions(path):
-      return path in permitted_files
-
-  return TestIoImpl
-
-
-class FtraceAgentTest(unittest.TestCase):
-
-  @decorators.HostOnlyTest
-  def test_avail_categories(self):
-    # sched only has required events
-    permitted_files = {
-      FT_EVENT_DIR + "sched/sched_switch/enable": "0",
-      FT_EVENT_DIR + "sched/sched_wakeup/enable": "0"
-    }
-    io_interface = make_test_io_interface(permitted_files)
-    agent = ftrace_agent.FtraceAgent(io_interface)
-    self.assertEqual(['sched'], agent._avail_categories())
-
-    # check for no available categories
-    permitted_files = {}
-    io_interface = make_test_io_interface(permitted_files)
-    agent = ftrace_agent.FtraceAgent(io_interface)
-    self.assertEqual([], agent._avail_categories())
-
-    # block has some required, some optional events
-    permitted_files = {
-      FT_EVENT_DIR + "block/block_rq_complete/enable": "0",
-      FT_EVENT_DIR + "block/block_rq_issue/enable": "0"
-    }
-    io_interface = make_test_io_interface(permitted_files)
-    agent = ftrace_agent.FtraceAgent(io_interface)
-    self.assertEqual(['disk'], agent._avail_categories())
-
-  @decorators.HostOnlyTest
-  def test_tracing_bootstrap(self):
-    workq_event_path = FT_EVENT_DIR + "workqueue/enable"
-    permitted_files = {
-      workq_event_path: "0",
-      FT_TRACE: "x"
-    }
-    io_interface = make_test_io_interface(permitted_files)
-    systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ["workq"]
-    options, categories = run_systrace.parse_options(systrace_cmd)
-    agent = ftrace_agent.FtraceAgent(io_interface)
-    self.assertEqual(['workq'], agent._avail_categories())
-
-    # confirm tracing is enabled, buffer is cleared
-    agent.StartAgentTracing(options, categories)
-    self.assertEqual(permitted_files[FT_TRACE_ON], "1")
-    self.assertEqual(permitted_files[FT_TRACE], "")
-
-    # fill in file with dummy contents
-    dummy_trace = "trace_contents"
-    permitted_files[FT_TRACE] = dummy_trace
-
-    # confirm tracing is disabled
-    agent.StopAgentTracing()
-    agent.GetResults()
-    self.assertEqual(permitted_files[FT_TRACE_ON], "0")
-
-    # confirm trace is expected, and read from fs
-    self.assertEqual(agent.GetResults().raw_data, dummy_trace)
-
-    # confirm buffer size is reset to 1
-    self.assertEqual(permitted_files[FT_BUFFER_SIZE], "1")
-
-  @decorators.HostOnlyTest
-  def test_tracing_event_enable_disable(self):
-    # turn on irq tracing
-    ipi_event_path = FT_EVENT_DIR + "ipi/enable"
-    irq_event_path = FT_EVENT_DIR + "irq/enable"
-    permitted_files = {
-      ipi_event_path: "0",
-      irq_event_path: "0"
-    }
-    io_interface = make_test_io_interface(permitted_files)
-    systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ["irq"]
-    options, categories = run_systrace.parse_options(systrace_cmd)
-    options.ftrace_categories = categories
-    agent = ftrace_agent.FtraceAgent(io_interface)
-    self.assertEqual(['irq'], agent._avail_categories())
-
-    # confirm all the event nodes are turned on during tracing
-    agent.StartAgentTracing(options)
-    self.assertEqual(permitted_files[irq_event_path], "1")
-    self.assertEqual(permitted_files[ipi_event_path], "1")
-
-    # and then turned off when completed.
-    agent.StopAgentTracing()
-    agent.GetResults()
-    self.assertEqual(permitted_files[irq_event_path], "0")
-    self.assertEqual(permitted_files[ipi_event_path], "0")
-
-  @decorators.HostOnlyTest
-  def test_buffer_size(self):
-    systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ['-b', '16000']
-    options, categories = run_systrace.parse_options(systrace_cmd)
-    agent = ftrace_agent.FtraceAgent()
-    agent._config = options
-    agent._config.atrace_categories = categories
-    self.assertEqual(agent._get_trace_buffer_size(), 16000)
-
-if __name__ == "__main__":
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py b/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py
deleted file mode 100644
index 6ff6061..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import threading
-
-import py_utils
-
-from devil.android import device_utils
-from systrace import trace_result
-from systrace import tracing_agents
-from py_trace_event import trace_time as trace_time_module
-
-TRACE_FILE_PATH = \
-    '/sdcard/Android/data/org.chromium.latency.walt/files/trace.txt'
-
-CLOCK_DOMAIN_MARKER = '# clock_type=LINUX_CLOCK_MONOTONIC\n'
-
-
-def try_create_agent(options):
-  if options.is_walt_enabled:
-    return WaltAgent()
-  return None
-
-
-class WaltConfig(tracing_agents.TracingConfig):
-  def __init__(self, device_serial_number, is_walt_enabled):
-    tracing_agents.TracingConfig.__init__(self)
-    self.device_serial_number = device_serial_number
-    self.is_walt_enabled = is_walt_enabled
-
-
-def add_options(parser):
-  options = optparse.OptionGroup(parser, 'WALT trace options')
-  options.add_option('--walt', dest='is_walt_enabled', default=False,
-                    action='store_true', help='Use the WALT tracing agent. '
-                    'WALT is a device for measuring latency of physical '
-                    'sensors on phones and computers. '
-                    'See https://github.com/google/walt')
-  return options
-
-
-def get_config(options):
-  return WaltConfig(options.device_serial_number, options.is_walt_enabled)
-
-
-class WaltAgent(tracing_agents.TracingAgent):
-  """
-  This tracing agent requires the WALT app to be installed on the Android phone,
-  and requires the WALT device to be attached to the phone. WALT is a device
-  for measuring latency of physical sensors and outputs on phones and
-  computers. For more information, visit https://github.com/google/walt
-  """
-  def __init__(self):
-    super(WaltAgent, self).__init__()
-    self._trace_contents = None
-    self._config = None
-    self._device_utils = None
-    self._clock_sync_marker = None
-    self._collection_thread = None
-
-  def __repr__(self):
-    return 'WaltAgent'
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    del timeout  # unused
-    self._config = config
-    self._device_utils = device_utils.DeviceUtils(
-        self._config.device_serial_number)
-    if self._device_utils.PathExists(TRACE_FILE_PATH):
-      # clear old trace events so they are not included in the current trace
-      self._device_utils.WriteFile(TRACE_FILE_PATH, '')
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    """Stops tracing and starts collecting results.
-
-    To synchronously retrieve the results after calling this function,
-    call GetResults().
-    """
-    del timeout  # unused
-    self._collection_thread = threading.Thread(
-        target=self._collect_trace_data)
-    self._collection_thread.start()
-    return True
-
-  def _collect_trace_data(self):
-    self._trace_contents = self._device_utils.ReadFile(TRACE_FILE_PATH)
-
-  def SupportsExplicitClockSync(self):
-    return True
-
-  def RecordClockSyncMarker(self, sync_id, did_record_clock_sync_callback):
-    cmd = 'cat /proc/timer_list | grep now'
-    t1 = trace_time_module.Now()
-    command_result = self._device_utils.RunShellCommand(cmd, shell=True)
-    nsec = command_result[0].split()[2]
-    self._clock_sync_marker = format_clock_sync_marker(sync_id, nsec)
-    did_record_clock_sync_callback(t1, sync_id)
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    del timeout  # unused
-    self._collection_thread.join()
-    self._collection_thread = None
-    return trace_result.TraceResult('waltTrace', self._get_trace_result())
-
-  def _get_trace_result(self):
-    result = '# tracer: \n' + CLOCK_DOMAIN_MARKER + self._trace_contents
-    if self._clock_sync_marker is not None:
-      result += self._clock_sync_marker
-    return result
-
-
-def format_clock_sync_marker(sync_id, nanosec_time):
-  return ('<0>-0  (-----) [001] ...1  ' + str(float(nanosec_time) / 1e9)
-          + ': tracing_mark_write: trace_event_clock_sync: name='
-          + sync_id + '\n')
diff --git a/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py b/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py
deleted file mode 100644
index 3bd7135..0000000
--- a/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import logging
-import unittest
-
-from systrace import decorators
-from systrace import run_systrace
-from systrace.tracing_agents import walt_agent
-
-
-class WaltAgentTest(unittest.TestCase):
-  """
-  The WALT agent pulls the trace log from the Android phone, and does not
-  communicate with the WALT device directly. This makes the agent similar
-  to atrace. Since the host only connects to the Android phone, more exhaustive
-  testing would require mocking DeviceUtils.
-  """
-
-  @decorators.HostOnlyTest
-  def test_construct_walt_args(self):
-    options, _ = run_systrace.parse_options(['./run_systrace.py',
-                                                      '--walt'])
-    self.assertTrue(walt_agent.get_config(options).is_walt_enabled)
-    options, _ = run_systrace.parse_options(['./run_systrace.py'])
-    self.assertFalse(walt_agent.get_config(options).is_walt_enabled)
-
-  @decorators.HostOnlyTest
-  def test_format_clock_sync_marker(self):
-    actual_marker = walt_agent.format_clock_sync_marker(
-                    'some_sync_id', 12345678901234)
-    expected_marker = ('<0>-0  (-----) [001] ...1  12345.6789012: ' +
-                       'tracing_mark_write: trace_event_clock_sync: ' +
-                       'name=some_sync_id\n')
-    self.assertEqual(actual_marker, expected_marker)
-
-  @decorators.HostOnlyTest
-  def test_get_results_string(self):
-    agent = walt_agent.WaltAgent()
-    agent._trace_contents = '<trace contents here>\n'
-    agent._clock_sync_marker = '<clock sync marker here>\n'
-    result = agent._get_trace_result()
-    self.assertEquals(result, '# tracer: \n# clock_type=LINUX_CLOCK_MONOTONIC\n'
-                      '<trace contents here>\n<clock sync marker here>\n')
-
-if __name__ == "__main__":
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/systrace/catapult/systrace/systrace/tracing_controller.py b/systrace/catapult/systrace/systrace/tracing_controller.py
deleted file mode 100644
index 86f1310..0000000
--- a/systrace/catapult/systrace/systrace/tracing_controller.py
+++ /dev/null
@@ -1,309 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-'''Tracing controller class. This class manages
-multiple tracing agents and collects data from all of them. It also
-manages the clock sync process.
-'''
-
-import ast
-import json
-import sys
-import tempfile
-import uuid
-
-import py_utils
-
-from systrace import trace_result
-from systrace import tracing_agents
-from py_trace_event import trace_event
-
-
-TRACE_DATA_CONTROLLER_NAME = 'systraceController'
-
-
-def ControllerAgentClockSync(issue_ts, name):
-  """Record the clock sync marker for controller tracing agent.
-
-  Unlike with the other tracing agents, the tracing controller should not
-  call this directly. Rather, it is called via callback from the other
-  tracing agents when they write a trace.
-  """
-  trace_event.clock_sync(name, issue_ts=issue_ts)
-
-
-class TracingControllerAgent(tracing_agents.TracingAgent):
-  def __init__(self):
-    super(TracingControllerAgent, self).__init__()
-    self._log_path = None
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StartAgentTracing(self, config, timeout=None):
-    """Start tracing for the controller tracing agent.
-
-    Start tracing for the controller tracing agent. Note that
-    the tracing controller records the "controller side"
-    of the clock sync records, and nothing else.
-    """
-    del config
-    if not trace_event.trace_can_enable():
-      raise RuntimeError, ('Cannot enable trace_event;'
-                           ' ensure py_utils is in PYTHONPATH')
-
-    controller_log_file = tempfile.NamedTemporaryFile(delete=False)
-    self._log_path = controller_log_file.name
-    controller_log_file.close()
-    trace_event.trace_enable(self._log_path)
-    return True
-
-  @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
-  def StopAgentTracing(self, timeout=None):
-    """Stops tracing for the controller tracing agent.
-    """
-    # pylint: disable=no-self-use
-    # This function doesn't use self, but making it a member function
-    # for consistency with the other TracingAgents
-    trace_event.trace_disable()
-    return True
-
-  @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
-  def GetResults(self, timeout=None):
-    """Gets the log output from the controller tracing agent.
-
-    This output only contains the "controller side" of the clock sync records.
-    """
-    with open(self._log_path, 'r') as outfile:
-      data = ast.literal_eval(outfile.read() + ']')
-    # Explicitly set its own clock domain. This will stop the Systrace clock
-    # domain from incorrectly being collapsed into the on device clock domain.
-    formatted_data = {
-        'traceEvents': data,
-        'metadata': {
-            'clock-domain': 'SYSTRACE',
-        }
-    }
-    return trace_result.TraceResult(TRACE_DATA_CONTROLLER_NAME,
-                                    json.dumps(formatted_data))
-
-  def SupportsExplicitClockSync(self):
-    """Returns whether this supports explicit clock sync.
-    Although the tracing controller conceptually supports explicit clock
-    sync, it is not an agent controlled by other controllers so it does not
-    define RecordClockSyncMarker (rather, the recording of the "controller
-    side" of the clock sync marker is done in _IssueClockSyncMarker). Thus,
-    SupportsExplicitClockSync must return false.
-    """
-    return False
-
-  # pylint: disable=unused-argument
-  def RecordClockSyncMarker(self, sync_id, callback):
-    raise NotImplementedError
-
-class TracingController(object):
-  def __init__(self, agents_with_config, controller_config):
-    """Create tracing controller.
-
-    Create a tracing controller object. Note that the tracing
-    controller is also a tracing agent.
-
-    Args:
-       agents_with_config: List of tracing agents for this controller with the
-                           corresponding tracing configuration objects.
-       controller_config:  Configuration options for the tracing controller.
-    """
-    self._child_agents = None
-    self._child_agents_with_config = agents_with_config
-    self._controller_agent = TracingControllerAgent()
-    self._controller_config = controller_config
-    self._trace_in_progress = False
-    self.all_results = None
-
-  @property
-  def get_child_agents(self):
-    return self._child_agents
-
-  def StartTracing(self):
-    """Start tracing for all tracing agents.
-
-    This function starts tracing for both the controller tracing agent
-    and the child tracing agents.
-
-    Returns:
-        Boolean indicating whether or not the start tracing succeeded.
-        Start tracing is considered successful if at least the
-        controller tracing agent was started.
-    """
-    assert not self._trace_in_progress, 'Trace already in progress.'
-    self._trace_in_progress = True
-
-    # Start the controller tracing agents. Controller tracing agent
-    # must be started successfully to proceed.
-    if not self._controller_agent.StartAgentTracing(
-        self._controller_config,
-        timeout=self._controller_config.timeout):
-      print 'Unable to start controller tracing agent.'
-      return False
-
-    # Start the child tracing agents.
-    succ_agents = []
-    for agent_and_config in self._child_agents_with_config:
-      agent = agent_and_config.agent
-      config = agent_and_config.config
-      if agent.StartAgentTracing(config,
-                                 timeout=self._controller_config.timeout):
-        succ_agents.append(agent)
-      else:
-        print 'Agent %s not started.' % str(agent)
-
-    # Print warning if all agents not started.
-    na = len(self._child_agents_with_config)
-    ns = len(succ_agents)
-    if ns < na:
-      print 'Warning: Only %d of %d tracing agents started.' % (ns, na)
-    self._child_agents = succ_agents
-    return True
-
-  def StopTracing(self):
-    """Issue clock sync marker and stop tracing for all tracing agents.
-
-    This function stops both the controller tracing agent
-    and the child tracing agents. It issues a clock sync marker prior
-    to stopping tracing.
-
-    Returns:
-        Boolean indicating whether or not the stop tracing succeeded
-        for all agents.
-    """
-    assert self._trace_in_progress, 'No trace in progress.'
-    self._trace_in_progress = False
-
-    # Issue the clock sync marker and stop the child tracing agents.
-    self._IssueClockSyncMarker()
-    succ_agents = []
-    for agent in self._child_agents:
-      if agent.StopAgentTracing(timeout=self._controller_config.timeout):
-        succ_agents.append(agent)
-      else:
-        print 'Agent %s not stopped.' % str(agent)
-
-    # Stop the controller tracing agent. Controller tracing agent
-    # must be stopped successfully to proceed.
-    if not self._controller_agent.StopAgentTracing(
-        timeout=self._controller_config.timeout):
-      print 'Unable to stop controller tracing agent.'
-      return False
-
-    # Print warning if all agents not stopped.
-    na = len(self._child_agents)
-    ns = len(succ_agents)
-    if ns < na:
-      print 'Warning: Only %d of %d tracing agents stopped.' % (ns, na)
-      self._child_agents = succ_agents
-
-    # Collect the results from all the stopped tracing agents.
-    all_results = []
-    for agent in self._child_agents + [self._controller_agent]:
-      try:
-        result = agent.GetResults(
-            timeout=self._controller_config.collection_timeout)
-        if not result:
-          print 'Warning: Timeout when getting results from %s.' % str(agent)
-          continue
-        if result.source_name in [r.source_name for r in all_results]:
-          print ('Warning: Duplicate tracing agents named %s.' %
-                 result.source_name)
-        all_results.append(result)
-      # Check for exceptions. If any exceptions are seen, reraise and abort.
-      # Note that a timeout exception will be swalloed by the timeout
-      # mechanism and will not get to that point (it will return False instead
-      # of the trace result, which will be dealt with above)
-      except:
-        print 'Warning: Exception getting results from %s:' % str(agent)
-        print sys.exc_info()[0]
-        raise
-    self.all_results = all_results
-    return all_results
-
-  def GetTraceType(self):
-    """Return a string representing the child agents that are being traced."""
-    sorted_agents = sorted(map(str, self._child_agents))
-    return ' + '.join(sorted_agents)
-
-  def _IssueClockSyncMarker(self):
-    """Issue clock sync markers to all the child tracing agents."""
-    for agent in self._child_agents:
-      if agent.SupportsExplicitClockSync():
-        sync_id = GetUniqueSyncID()
-        agent.RecordClockSyncMarker(sync_id, ControllerAgentClockSync)
-
-def GetUniqueSyncID():
-  """Get a unique sync ID.
-
-  Gets a unique sync ID by generating a UUID and converting it to a string
-  (since UUIDs are not JSON serializable)
-  """
-  return str(uuid.uuid4())
-
-
-class AgentWithConfig(object):
-  def __init__(self, agent, config):
-    self.agent = agent
-    self.config = config
-
-
-def CreateAgentsWithConfig(options, modules):
-  """Create tracing agents.
-
-  This function will determine which tracing agents are valid given the
-  options and create those agents along with their corresponding configuration
-  object.
-  Args:
-    options: The command-line options.
-    modules: The modules for either Systrace or profile_chrome.
-             TODO(washingtonp): After all profile_chrome agents are in
-             Systrace, this parameter will no longer be valid.
-  Returns:
-    A list of AgentWithConfig options containing agents and their corresponding
-    configuration object.
-  """
-  result = []
-  for module in modules:
-    config = module.get_config(options)
-    agent = module.try_create_agent(config)
-    if agent and config:
-      result.append(AgentWithConfig(agent, config))
-  return [x for x in result if x and x.agent]
-
-
-class TracingControllerConfig(tracing_agents.TracingConfig):
-  def __init__(self, output_file, trace_time, write_json,
-               link_assets, asset_dir, timeout, collection_timeout,
-               device_serial_number, target, trace_buf_size):
-    tracing_agents.TracingConfig.__init__(self)
-    self.output_file = output_file
-    self.trace_time = trace_time
-    self.write_json = write_json
-    self.link_assets = link_assets
-    self.asset_dir = asset_dir
-    self.timeout = timeout
-    self.collection_timeout = collection_timeout
-    self.device_serial_number = device_serial_number
-    self.target = target
-    self.trace_buf_size = trace_buf_size
-
-
-def GetControllerConfig(options):
-  return TracingControllerConfig(options.output_file, options.trace_time,
-                                 options.write_json,
-                                 options.link_assets, options.asset_dir,
-                                 options.timeout, options.collection_timeout,
-                                 options.device_serial_number, options.target,
-                                 options.trace_buf_size)
-
-def GetChromeStartupControllerConfig(options):
-  return TracingControllerConfig(None, options.trace_time,
-                                 options.write_json, None, None, None, None,
-                                 None, None, options.trace_buf_size)
diff --git a/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py b/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py
deleted file mode 100755
index 8460852..0000000
--- a/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import codecs
-import optparse
-import os
-import re
-import subprocess
-import sys
-
-_CATAPULT_PATH = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))
-sys.path.append(os.path.join(_CATAPULT_PATH, 'tracing'))
-
-# this import needs to be after the change to sys.path above
-#pylint: disable=wrong-import-position
-from tracing_build import vulcanize_trace_viewer
-
-
-SYSTRACE_TRACE_VIEWER_HTML_FILE = os.path.join(
-    os.path.abspath(os.path.dirname(__file__)),
-    'systrace_trace_viewer.html')
-CATAPULT_REV_ = 'CATAPULT_REV'
-NO_AUTO_UPDATE_ = 'NO_AUTO_UPDATE'
-UNKNOWN_REVISION_ = 'UNKNOWN'
-
-
-def create_catapult_rev_str_(revision):
-  return '<!--' + CATAPULT_REV_ + '=' + str(revision) + '-->'
-
-
-def get_catapult_rev_in_file_(html_file):
-  assert os.path.exists(html_file)
-  rev = ''
-  with open(html_file, 'r') as f:
-    lines = f.readlines()
-    for line in lines[::-1]:
-      if CATAPULT_REV_ in line:
-        tokens = line.split(CATAPULT_REV_)
-        rev = re.sub(r'[=\->]', '', tokens[1]).strip()
-        break
-  return rev
-
-
-def get_catapult_rev_in_git_():
-  try:
-    catapult_rev = subprocess.check_output(
-        'git rev-parse HEAD',
-        shell=True, # Needed by Windows
-        cwd=os.path.dirname(os.path.abspath(__file__))).strip()
-  except (subprocess.CalledProcessError, OSError):
-    return None
-  if not catapult_rev:
-    return None
-  return catapult_rev
-
-
-def update(no_auto_update=False, no_min=False, force_update=False):
-  """Update the systrace trace viewer html file.
-
-  When the html file exists, do not update the file if
-  1. the revision is NO_AUTO_UPDATE_;
-  2. or the revision is not changed.
-
-  Args:
-    no_auto_update: If true, force updating the file with revision
-                    NO_AUTO_UPDATE_. Future auto-updates will be skipped.
-    no_min:         If true, skip minification when updating the file.
-    force_update:   If true, update the systrace trace viewer file no matter
-                    what.
-  """
-  if no_auto_update:
-    new_rev = NO_AUTO_UPDATE_
-  else:
-    new_rev = get_catapult_rev_in_git_()
-    if not new_rev:
-      # Source tree could be missing git metadata.
-      print >> sys.stderr, 'Warning: Couldn\'t determine current git revision.'
-      new_rev = UNKNOWN_REVISION_
-
-  need_update = False
-  if force_update:
-    need_update = True
-  elif no_auto_update:
-    need_update = True
-  elif not os.path.exists(SYSTRACE_TRACE_VIEWER_HTML_FILE):
-    need_update = True
-  else:
-    old_rev = get_catapult_rev_in_file_(SYSTRACE_TRACE_VIEWER_HTML_FILE)
-    if not old_rev or old_rev == UNKNOWN_REVISION_:
-      need_update = True
-    # If old_rev was set to NO_AUTO_UPDATE_ it should be skipped, since forced
-    # update cases have been already handled above.
-    if old_rev != new_rev and old_rev != NO_AUTO_UPDATE_:
-      need_update = True
-
-  if not need_update:
-    print 'Update skipped.'
-    return
-
-  print 'Generating viewer file %s with revision %s.' % (
-            SYSTRACE_TRACE_VIEWER_HTML_FILE, new_rev)
-
-  # Generate the vulcanized result.
-  with codecs.open(SYSTRACE_TRACE_VIEWER_HTML_FILE,
-                   encoding='utf-8', mode='w') as f:
-    vulcanize_trace_viewer.WriteTraceViewer(
-        f,
-        config_name='full',
-        minify=(not no_min),
-        output_html_head_and_body=False)
-    if not force_update:
-      f.write(create_catapult_rev_str_(new_rev))
-
-def main():
-  parser = optparse.OptionParser()
-  parser.add_option('--force-update', dest='force_update',
-                    default=False, action='store_true', help='force update the '
-                    'systrace trace viewer html file')
-  parser.add_option('--no-auto-update', dest='no_auto_update',
-                    default=False, action='store_true', help='force update the '
-                    'systrace trace viewer html file and disable auto-updates, '
-                    'delete \'systrace_trace_viewer.html\' to re-enable '
-                    'auto-updates')
-  parser.add_option('--no-min', dest='no_min', default=False,
-                    action='store_true', help='skip minification')
-  # pylint: disable=unused-variable
-  options, unused_args = parser.parse_args(sys.argv[1:])
-
-  update(no_auto_update=options.no_auto_update,
-         no_min=options.no_min,
-         force_update=options.force_update)
-
-if __name__ == '__main__':
-  main()
diff --git a/systrace/catapult/systrace/systrace/util.py b/systrace/catapult/systrace/systrace/util.py
deleted file mode 100644
index 797d675..0000000
--- a/systrace/catapult/systrace/systrace/util.py
+++ /dev/null
@@ -1,172 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import os
-import sys
-
-from devil.android.constants import chrome
-from devil.android import device_utils, device_errors
-
-class OptionParserIgnoreErrors(optparse.OptionParser):
-  """Wrapper for OptionParser that ignores errors and produces no output."""
-
-  def error(self, msg):
-    pass
-
-  def exit(self, status=0, msg=None):
-    pass
-
-  def print_usage(self, out_file=None):
-    pass
-
-  def print_help(self, out_file=None):
-    pass
-
-  def print_version(self, out_file=None):
-    pass
-
-
-def run_adb_shell(shell_args, device_serial):
-  """Runs "adb shell" with the given arguments.
-
-  Args:
-    shell_args: array of arguments to pass to adb shell.
-    device_serial: if not empty, will add the appropriate command-line
-        parameters so that adb targets the given device.
-  Returns:
-    A tuple containing the adb output (stdout & stderr) and the return code
-    from adb.  Will exit if adb fails to start.
-  """
-  adb_output = []
-  adb_return_code = 0
-  device = device_utils.DeviceUtils.HealthyDevices(device_arg=device_serial)[0]
-  try:
-    adb_output = device.RunShellCommand(shell_args, shell=False,
-                                        check_return=True, raw_output=True)
-  except device_errors.AdbShellCommandFailedError as error:
-    adb_return_code = error.status
-    adb_output = error.output
-
-  return (adb_output, adb_return_code)
-
-
-def get_tracing_path(device_serial=None):
-  """Uses adb to attempt to determine tracing path. The newest kernel doesn't
-     support mounting debugfs, so the Android master uses tracefs to replace it.
-
-  Returns:
-    /sys/kernel/debug/tracing for device with debugfs mount support;
-    /sys/kernel/tracing for device with tracefs support;
-    /sys/kernel/debug/tracing if support can't be determined.
-  """
-  mount_info_args = ['mount']
-
-  if device_serial is None:
-    parser = OptionParserIgnoreErrors()
-    parser.add_option('-e', '--serial', dest='device_serial', type='string')
-    options, _ = parser.parse_args()
-    device_serial = options.device_serial
-
-  adb_output, adb_return_code = run_adb_shell(mount_info_args, device_serial, )
-  if adb_return_code == 0 and 'tracefs on /sys/kernel/tracing' in adb_output:
-    return '/sys/kernel/tracing'
-  return '/sys/kernel/debug/tracing'
-
-
-def get_device_sdk_version():
-  """Uses adb to attempt to determine the SDK version of a running device."""
-
-  getprop_args = ['getprop', 'ro.build.version.sdk']
-
-  # get_device_sdk_version() is called before we even parse our command-line
-  # args.  Therefore, parse just the device serial number part of the
-  # command-line so we can send the adb command to the correct device.
-  parser = OptionParserIgnoreErrors()
-  parser.add_option('-e', '--serial', dest='device_serial', type='string')
-  options, unused_args = parser.parse_args()  # pylint: disable=unused-variable
-
-  success = False
-
-  adb_output, adb_return_code = run_adb_shell(getprop_args,
-                                              options.device_serial)
-
-  if adb_return_code == 0:
-    # ADB may print output other than the version number (e.g. it chould
-    # print a message about starting the ADB server).
-    # Break the ADB output into white-space delimited segments.
-    parsed_output = str.split(adb_output)
-    if parsed_output:
-      # Assume that the version number is the last thing printed by ADB.
-      version_string = parsed_output[-1]
-      if version_string:
-        try:
-          # Try to convert the text into an integer.
-          version = int(version_string)
-        except ValueError:
-          version = -1
-        else:
-          success = True
-
-  if not success:
-    print >> sys.stderr, adb_output
-    raise Exception("Failed to get device sdk version")
-
-  return version
-
-
-def get_supported_browsers():
-  """Returns the package names of all supported browsers."""
-  # Add aliases for backwards compatibility.
-  supported_browsers = {
-    'stable': chrome.PACKAGE_INFO['chrome_stable'],
-    'beta': chrome.PACKAGE_INFO['chrome_beta'],
-    'dev': chrome.PACKAGE_INFO['chrome_dev'],
-    'build': chrome.PACKAGE_INFO['chrome'],
-  }
-  supported_browsers.update(chrome.PACKAGE_INFO)
-  return supported_browsers
-
-
-def get_default_serial():
-  if 'ANDROID_SERIAL' in os.environ:
-    return os.environ['ANDROID_SERIAL']
-  return None
-
-
-def get_main_options(parser):
-  parser.add_option('-o', dest='output_file', help='write trace output to FILE',
-                    default=None, metavar='FILE')
-  parser.add_option('-t', '--time', dest='trace_time', type='int',
-                    help='trace for N seconds', metavar='N')
-  parser.add_option('-j', '--json', dest='write_json',
-                    default=False, action='store_true',
-                    help='write a JSON file')
-  parser.add_option('--link-assets', dest='link_assets', default=False,
-                    action='store_true',
-                    help='(deprecated)')
-  parser.add_option('--from-file', dest='from_file', action='store',
-                    help='read the trace from a file (compressed) rather than'
-                    'running a live trace')
-  parser.add_option('--asset-dir', dest='asset_dir', default='trace-viewer',
-                    type='string', help='(deprecated)')
-  parser.add_option('-e', '--serial', dest='device_serial_number',
-                    default=get_default_serial(),
-                    type='string', help='adb device serial number')
-  parser.add_option('--target', dest='target', default='android', type='string',
-                    help='choose tracing target (android or linux)')
-  parser.add_option('--timeout', dest='timeout', type='int',
-                    help='timeout for start and stop tracing (seconds)')
-  parser.add_option('--collection-timeout', dest='collection_timeout',
-                    type='int', help='timeout for data collection (seconds)')
-  parser.add_option('-a', '--app', dest='app_name', default=None,
-                    type='string', action='store',
-                    help='enable application-level tracing for '
-                    'comma-separated list of app cmdlines')
-  parser.add_option('-t', '--time', dest='trace_time', type='int',
-                    help='trace for N seconds', metavar='N')
-  parser.add_option('-b', '--buf-size', dest='trace_buf_size',
-                    type='int', help='use a trace buffer size '
-                    ' of N KB', metavar='N')
-  return parser
diff --git a/systrace/catapult/third_party/polymer/LICENSE.polymer b/systrace/catapult/third_party/polymer/LICENSE.polymer
deleted file mode 100644
index 92d60b0..0000000
--- a/systrace/catapult/third_party/polymer/LICENSE.polymer
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 The Polymer Authors. 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/systrace/catapult/third_party/polymer/README.chromium b/systrace/catapult/third_party/polymer/README.chromium
deleted file mode 100644
index af8e9ad..0000000
--- a/systrace/catapult/third_party/polymer/README.chromium
+++ /dev/null
@@ -1,26 +0,0 @@
-Name: Polymer
-Short Name: polymer
-URL: http://www.polymer-project.org
-Version: 0.5.2-4
-Revision: (See components/<component>/.bower.json)
-License: BSD
-License File: LICENSE.polymer
-Security Critical: no
-
-Description:
-This directory contains a subset of the components provided by the
-Polymer project. See bower.json for a full list of components.
-
-The version can be found in header of polymer/polymer.js. The license can
-be found in polymer/LICENSE.
-
-The source git repositories can be found at:
-https://github.com/Polymer/<component>
-
-Note on Bower:
-New components can be added by editing bower.json and running `bower update`,
-which requires first installing bower (see http://bower.io/).
-
-Local Modifications:
-Removed unused file with no license header:
-components/web-animations-js/.travis-setup.sh
diff --git a/systrace/catapult/third_party/polymer/bower.json b/systrace/catapult/third_party/polymer/bower.json
deleted file mode 100644
index 9fead1c..0000000
--- a/systrace/catapult/third_party/polymer/bower.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "catapult",
-  "private": true,
-  "dependencies": {
-    "app-route": "PolymerElements/app-route#^1.0.0",
-    "google-signin": "GoogleWebComponents/google-signin#^2.0.0",
-    "iron-ajax": "PolymerElements/iron-ajax#^2.0.0",
-    "iron-collapse": "PolymerElements/iron-collapse#^1.0.0",
-    "iron-form": "PolymerElements/iron-form#^2.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.0",
-    "iron-pages": "PolymerElements/iron-pages#^1.0.8",
-    "iron-selector": "PolymerElements/iron-selector#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "paper-checkbox": "PolymerElements/paper-checkbox#^1.0.0",
-    "paper-dialog": "PolymerElements/paper-dialog#^1.0.0",
-    "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
-    "paper-fab": "PolymerElements/paper-fab#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "paper-input": "PolymerElements/paper-input#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-listbox": "polymerelements/paper-listbox#^1.1.2",
-    "paper-menu": "PolymerElements/paper-menu#^1.0.0",
-    "paper-progress": "PolymerElements/paper-progress#^1.0.0",
-    "paper-radio-button": "PolymerElements/paper-radio-button#^1.0.0",
-    "paper-radio-group": "PolymerElements/paper-radio-group#^1.0.0",
-    "paper-spinner": "PolymerElements/paper-spinner#^1.0.0",
-    "paper-tabs": "PolymerElements/paper-tabs#^1.0.0",
-    "paper-toast": "PolymerElements/paper-toast#^1.0.0",
-    "paper-tooltip": "PolymerElements/paper-tooltip#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/app-route/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/app-route/CONTRIBUTING.md
deleted file mode 100644
index 34d6154..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/hirore/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/hirore/edit?html,output](https://jsbin.com/hirore/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/app-route/README.md b/systrace/catapult/third_party/polymer/components/app-route/README.md
deleted file mode 100644
index ee6bdd1..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/README.md
+++ /dev/null
@@ -1,217 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-app-location.html  app-route-converter-behavior.html  app-route-converter.html  app-route.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/app-route.svg?branch=master)](https://travis-ci.org/PolymerElements/app-route)
-
-
-## &lt;app-route&gt;
-
-`app-route` is an element that enables declarative, self-describing routing
-for a web app.
-
-> *n.b. app-route is still in beta. We expect it will need some changes. We're counting on your feedback!*
-
-In its typical usage, a `app-route` element consumes an object that describes
-some state about the current route, via the `route` property. It then parses
-that state using the `pattern` property, and produces two artifacts: some `data`
-related to the `route`, and a `tail` that contains the rest of the `route` that
-did not match.
-
-Here is a basic example, when used with `app-location`:
-
-```html
-<app-location route="{{route}}"></app-location>
-<app-route
-    route="{{route}}"
-    pattern="/:page"
-    data="{{data}}"
-    tail="{{tail}}">
-</app-route>
-```
-
-In the above example, the `app-location` produces a `route` value. Then, the
-`route.path` property is matched by comparing it to the `pattern` property. If
-the `pattern` property matches `route.path`, the `app-route` will set or update
-its `data` property with an object whose properties correspond to the parameters
-in `pattern`. So, in the above example, if `route.path` was `'/about'`, the value
-of `data` would be `{"page": "about"}`.
-
-The `tail` property represents the remaining part of the route state after the
-`pattern` has been applied to a matching `route`.
-
-Here is another example, where `tail` is used:
-
-```html
-<app-location route="{{route}}"></app-location>
-<app-route
-    route="{{route}}"
-    pattern="/:page"
-    data="{{routeData}}"
-    tail="{{subroute}}">
-</app-route>
-<app-route
-    route="{{subroute}}"
-    pattern="/:id"
-    data="{{subrouteData}}">
-</app-route>
-```
-
-In the above example, there are two `app-route` elements. The first
-`app-route` consumes a `route`. When the `route` is matched, the first
-`app-route` also produces `routeData` from its `data`, and `subroute` from
-its `tail`. The second `app-route` consumes the `subroute`, and when it
-matches, it produces an object called `subrouteData` from its `data`.
-
-So, when `route.path` is `'/about'`, the `routeData` object will look like
-this: `{ page: 'about' }`
-
-And `subrouteData` will be null. However, if `route.path` changes to
-`'/article/123'`, the `routeData` object will look like this:
-`{ page: 'article' }`
-
-And the `subrouteData` will look like this: `{ id: '123' }`
-
-`app-route` is responsive to bi-directional changes to the `data` objects
-they produce. So, if `routeData.page` changed from `'article'` to `'about'`,
-the `app-route` will update `route.path`. This in-turn will update the
-`app-location`, and cause the global location bar to change its value.
-
-
-
-## &lt;app-location&gt;
-
-`app-location` is an element that provides synchronization between the
-browser location bar and the state of an app. When created, `app-location`
-elements will automatically watch the global location for changes. As changes
-occur, `app-location` produces and updates an object called `route`. This
-`route` object is suitable for passing into a `app-route`, and other similar
-elements.
-
-An example of the public API of a route object that describes the URL
-`https://elements.polymer-project.org/elements/app-location`:
-
-```css
-{
-  prefix: '',
-  path: '/elements/app-location'
-}
-```
-
-Example Usage:
-
-```html
-<app-location route="{{route}}"></app-location>
-<app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
-```
-
-As you can see above, the `app-location` element produces a `route` and that
-property is then bound into the `app-route` element. The bindings are two-
-directional, so when changes to the `route` object occur within `app-route`,
-they automatically reflect back to the global location.
-
-### Hashes vs Paths
-
-By default `app-location` routes using the pathname portion of the URL. This has
-broad browser support but it does require cooperation of the backend server. An
-`app-location` can be configured to use the hash part of a URL instead using
-the `use-hash-as-path` attribute, like so:
-
-```html
-<app-location route="{{route}}" use-hash-as-path></app-location>
-```
-
-### Integrating with other routing code
-
-There is no standard event that is fired when window.location is modified.
-`app-location` fires a `location-changed` event on `window` when it updates the
-location. It also listens for that same event, and re-reads the URL when it's
-fired. This makes it very easy to interop with other routing code.
-
-So for example if you want to navigate to `/new_path` imperatively you could
-call `window.location.pushState` or `window.location.replaceState` followed by
-firing a `location-changed` event on `window`. i.e.
-
-```javascript
-window.history.pushState({}, null, '/new_path');
-window.dispatchEvent(new CustomEvent('location-changed'));
-```
-
-
-
-## &lt;app-route-converter&gt;
-
-`app-route-converter` provides a means to convert a path and query
-parameters into a route object and vice versa. This produced route object
-is to be fed into route-consuming elements such as `app-route`.
-
-> n.b. This element is intended to be a primitive of the routing system and for
-creating bespoke routing solutions from scratch. To simply include routing in
-an app, please refer to [app-location](https://github.com/PolymerElements/app-route/blob/master/app-location.html)
-and [app-route](https://github.com/PolymerElements/app-route/blob/master/app-route.html).
-
-An example of a route object that describes
-`https://elements.polymer-project.org/elements/app-route-converter?foo=bar&baz=qux`
-and should be passed to other `app-route` elements:
-
-```css
-{
-  prefix: '',
-  path: '/elements/app-route-converter',
-  __queryParams: {
-    foo: 'bar',
-    baz: 'qux'
-  }
-}
-```
-
-`__queryParams` is private to discourage directly data-binding to it. This is so
-that routing elements like `app-route` can intermediate changes to the query
-params and choose whether to propagate them upstream or not. `app-route` for
-example will not propagate changes to its `queryParams` property if it is not
-currently active. A public queryParams object will also be produced in which you
-should perform data-binding operations.
-
-Example Usage:
-
-```html
-<iron-location path="{{path}}" query="{{query}}"></iron-location>
-<iron-query-params
-    params-string="{{query}}"
-    params-object="{{queryParams}}">
-</iron-query-params>
-<app-route-converter
-    path="{{path}}"
-    query-params="{{queryParams}}"
-    route="{{route}}">
-</app-route-converter>
-<app-route route='{{route}}' pattern='/:page' data='{{data}}'>
-</app-route>
-```
-
-This is a simplified implementation of the `app-location` element. Here the
-`iron-location` produces a path and a query, the `iron-query-params` consumes
-the query and produces a queryParams object, and the `app-route-converter`
-consumes the path and the query params and converts it into a route which is in
-turn is consumed by the `app-route`.
-
-
-
-## Polymer.AppRouteConverterBehavior
-
-Provides bidirectional mapping between `path` and `queryParams` and a
-app-route compatible `route` object.
-
-For more information, see the docs for `app-route-converter`.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/app-route/app-location.html b/systrace/catapult/third_party/polymer/components/app-route/app-location.html
deleted file mode 100644
index 3e001ae..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/app-location.html
+++ /dev/null
@@ -1,194 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-location/iron-location.html">
-<link rel="import" href="../iron-location/iron-query-params.html">
-<link rel="import" href="app-route-converter-behavior.html">
-
-<!--
-`app-location` is an element that provides synchronization between the
-browser location bar and the state of an app. When created, `app-location`
-elements will automatically watch the global location for changes. As changes
-occur, `app-location` produces and updates an object called `route`. This
-`route` object is suitable for passing into a `app-route`, and other similar
-elements.
-
-An example of the public API of a route object that describes the URL
-`https://elements.polymer-project.org/elements/app-location`:
-
-    {
-      prefix: '',
-      path: '/elements/app-location'
-    }
-
-Example Usage:
-
-    <app-location route="{{route}}"></app-location>
-    <app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
-
-As you can see above, the `app-location` element produces a `route` and that
-property is then bound into the `app-route` element. The bindings are two-
-directional, so when changes to the `route` object occur within `app-route`,
-they automatically reflect back to the global location.
-
-### Hashes vs Paths
-
-By default `app-location` routes using the pathname portion of the URL. This has
-broad browser support but it does require cooperation of the backend server. An
-`app-location` can be configured to use the hash part of a URL instead using
-the `use-hash-as-path` attribute, like so:
-
-    <app-location route="{{route}}" use-hash-as-path></app-location>
-
-### Integrating with other routing code
-
-There is no standard event that is fired when window.location is modified.
-`app-location` fires a `location-changed` event on `window` when it updates the
-location. It also listens for that same event, and re-reads the URL when it's
-fired. This makes it very easy to interop with other routing code.
-
-So for example if you want to navigate to `/new_path` imperatively you could
-call `window.location.pushState` or `window.location.replaceState` followed by
-firing a `location-changed` event on `window`. i.e.
-
-    window.history.pushState({}, null, '/new_path');
-    window.dispatchEvent(new CustomEvent('location-changed'));
-
-@element app-location
-@demo demo/index.html
--->
-<dom-module id="app-location">
-  <template>
-    <iron-location
-        path="{{__path}}"
-        query="{{__query}}"
-        hash="{{__hash}}"
-        url-space-regex={{urlSpaceRegex}}>
-    </iron-location>
-    <iron-query-params
-        params-string="{{__query}}"
-        params-object="{{queryParams}}">
-    </iron-query-params>
-  </template>
-  <script>
-    (function() {
-      'use strict';
-
-      Polymer({
-        is: 'app-location',
-
-        properties: {
-          /**
-           * A model representing the deserialized path through the route tree, as
-           * well as the current queryParams.
-           */
-          route: {
-            type: Object,
-            notify: true
-          },
-
-          /**
-           * In many scenarios, it is convenient to treat the `hash` as a stand-in
-           * alternative to the `path`. For example, if deploying an app to a static
-           * web server (e.g., Github Pages) - where one does not have control over
-           * server-side routing - it is usually a better experience to use the hash
-           * to represent paths through one's app.
-           *
-           * When this property is set to true, the `hash` will be used in place of
-
-           * the `path` for generating a `route`.
-           */
-          useHashAsPath: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * A regexp that defines the set of URLs that should be considered part
-           * of this web app.
-           *
-           * Clicking on a link that matches this regex won't result in a full page
-           * navigation, but will instead just update the URL state in place.
-           *
-           * This regexp is given everything after the origin in an absolute
-           * URL. So to match just URLs that start with /search/ do:
-           *     url-space-regex="^/search/"
-           *
-           * @type {string|RegExp}
-           */
-          urlSpaceRegex: {
-            type: String,
-            notify: true
-          },
-
-          /**
-           * A set of key/value pairs that are universally accessible to branches
-           * of the route tree.
-           */
-          __queryParams: {
-            type: Object
-          },
-
-          /**
-           * The pathname component of the current URL.
-           */
-          __path: {
-            type: String
-          },
-
-          /**
-           * The query string portion of the current URL.
-           */
-          __query: {
-            type: String
-          },
-
-          /**
-           * The hash portion of the current URL.
-           */
-          __hash: {
-            type: String
-          },
-
-          /**
-           * The route path, which will be either the hash or the path, depending
-           * on useHashAsPath.
-           */
-          path: {
-            type: String,
-            observer: '__onPathChanged'
-          }
-        },
-
-        behaviors: [Polymer.AppRouteConverterBehavior],
-
-        observers: [
-          '__computeRoutePath(useHashAsPath, __hash, __path)'
-        ],
-
-        __computeRoutePath: function() {
-          this.path = this.useHashAsPath ? this.__hash : this.__path;
-        },
-
-        __onPathChanged: function() {
-          if (!this._readied) {
-            return;
-          }
-
-          if (this.useHashAsPath) {
-            this.__hash = this.path;
-          } else {
-            this.__path = this.path;
-          }
-        }
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/app-route-converter-behavior.html b/systrace/catapult/third_party/polymer/components/app-route/app-route-converter-behavior.html
deleted file mode 100644
index 23cc9dc..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/app-route-converter-behavior.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-  (function() {
-    'use strict';
-
-    /**
-     * Provides bidirectional mapping between `path` and `queryParams` and a
-     * app-route compatible `route` object.
-     *
-     * For more information, see the docs for `app-route-converter`.
-     *
-     * @polymerBehavior
-     */
-    Polymer.AppRouteConverterBehavior = {
-      properties: {
-        /**
-         * A model representing the deserialized path through the route tree, as
-         * well as the current queryParams.
-         *
-         * A route object is the kernel of the routing system. It is intended to
-         * be fed into consuming elements such as `app-route`.
-         *
-         * @type {?Object}
-         */
-        route: {
-          type: Object,
-          notify: true
-        },
-
-        /**
-         * A set of key/value pairs that are universally accessible to branches of
-         * the route tree.
-         *
-         * @type {?Object}
-         */
-        queryParams: {
-          type: Object,
-          notify: true
-        },
-
-        /**
-         * The serialized path through the route tree. This corresponds to the
-         * `window.location.pathname` value, and will update to reflect changes
-         * to that value.
-         */
-        path: {
-          type: String,
-          notify: true,
-        }
-      },
-
-      observers: [
-        '_locationChanged(path, queryParams)',
-        '_routeChanged(route.prefix, route.path)',
-        '_routeQueryParamsChanged(route.__queryParams)'
-      ],
-
-      created: function() {
-        this.linkPaths('route.__queryParams', 'queryParams');
-        this.linkPaths('queryParams', 'route.__queryParams');
-      },
-
-      /**
-       * Handler called when the path or queryParams change.
-       */
-      _locationChanged: function() {
-        if (this.route &&
-            this.route.path === this.path &&
-            this.queryParams === this.route.__queryParams) {
-          return;
-        }
-        this.route = {
-          prefix: '',
-          path: this.path,
-          __queryParams: this.queryParams
-        };
-      },
-
-      /**
-       * Handler called when the route prefix and route path change.
-       */
-      _routeChanged: function() {
-        if (!this.route) {
-          return;
-        }
-
-        this.path = this.route.prefix + this.route.path;
-      },
-
-      /**
-       * Handler called when the route queryParams change.
-       *
-       * @param  {Object} queryParams A set of key/value pairs that are
-       * universally accessible to branches of the route tree.
-       */
-      _routeQueryParamsChanged: function(queryParams) {
-        if (!this.route) {
-          return;
-        }
-        this.queryParams = queryParams;
-      }
-    };
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/app-route-converter.html b/systrace/catapult/third_party/polymer/components/app-route/app-route-converter.html
deleted file mode 100644
index e16b653..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/app-route-converter.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="./app-route-converter-behavior.html">
-
-<!--
-`app-route-converter` provides a means to convert a path and query
-parameters into a route object and vice versa. This produced route object
-is to be fed into route-consuming elements such as `app-route`.
-
-> n.b. This element is intended to be a primitive of the routing system and for
-creating bespoke routing solutions from scratch. To simply include routing in
-an app, please refer to [app-location](https://github.com/PolymerElements/app-route/blob/master/app-location.html)
-and [app-route](https://github.com/PolymerElements/app-route/blob/master/app-route.html).
-
-An example of a route object that describes
-`https://elements.polymer-project.org/elements/app-route-converter?foo=bar&baz=qux`
-and should be passed to other `app-route` elements:
-
-    {
-      prefix: '',
-      path: '/elements/app-route-converter',
-      __queryParams: {
-        foo: 'bar',
-        baz: 'qux'
-      }
-    }
-
-`__queryParams` is private to discourage directly data-binding to it. This is so
-that routing elements like `app-route` can intermediate changes to the query
-params and choose whether to propagate them upstream or not. `app-route` for
-example will not propagate changes to its `queryParams` property if it is not
-currently active. A public queryParams object will also be produced in which you
-should perform data-binding operations.
-
-Example Usage:
-
-    <iron-location path="{{path}}" query="{{query}}"></iron-location>
-    <iron-query-params
-        params-string="{{query}}"
-        params-object="{{queryParams}}">
-    </iron-query-params>
-    <app-route-converter
-        path="{{path}}"
-        query-params="{{queryParams}}"
-        route="{{route}}">
-    </app-route-converter>
-    <app-route route='{{route}}' pattern='/:page' data='{{data}}'>
-    </app-route>
-
-This is a simplified implementation of the `app-location` element. Here the
-`iron-location` produces a path and a query, the `iron-query-params` consumes
-the query and produces a queryParams object, and the `app-route-converter`
-consumes the path and the query params and converts it into a route which is in
-turn is consumed by the `app-route`.
-
-@element app-route-converter
-@demo demo/index.html
--->
-
-<script>
-  (function() {
-    'use strict';
-
-    Polymer({
-      is: 'app-route-converter',
-
-      behaviors: [Polymer.AppRouteConverterBehavior]
-    });
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/app-route.html b/systrace/catapult/third_party/polymer/components/app-route/app-route.html
deleted file mode 100644
index 7ed66b4..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/app-route.html
+++ /dev/null
@@ -1,421 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-`app-route` is an element that enables declarative, self-describing routing
-for a web app.
-
-> *n.b. app-route is still in beta. We expect it will need some changes. We're counting on your feedback!*
-
-In its typical usage, a `app-route` element consumes an object that describes
-some state about the current route, via the `route` property. It then parses
-that state using the `pattern` property, and produces two artifacts: some `data`
-related to the `route`, and a `tail` that contains the rest of the `route` that
-did not match.
-
-Here is a basic example, when used with `app-location`:
-
-    <app-location route="{{route}}"></app-location>
-    <app-route
-        route="{{route}}"
-        pattern="/:page"
-        data="{{data}}"
-        tail="{{tail}}">
-    </app-route>
-
-In the above example, the `app-location` produces a `route` value. Then, the
-`route.path` property is matched by comparing it to the `pattern` property. If
-the `pattern` property matches `route.path`, the `app-route` will set or update
-its `data` property with an object whose properties correspond to the parameters
-in `pattern`. So, in the above example, if `route.path` was `'/about'`, the value
-of `data` would be `{"page": "about"}`.
-
-The `tail` property represents the remaining part of the route state after the
-`pattern` has been applied to a matching `route`.
-
-Here is another example, where `tail` is used:
-
-    <app-location route="{{route}}"></app-location>
-    <app-route
-        route="{{route}}"
-        pattern="/:page"
-        data="{{routeData}}"
-        tail="{{subroute}}">
-    </app-route>
-    <app-route
-        route="{{subroute}}"
-        pattern="/:id"
-        data="{{subrouteData}}">
-    </app-route>
-
-In the above example, there are two `app-route` elements. The first
-`app-route` consumes a `route`. When the `route` is matched, the first
-`app-route` also produces `routeData` from its `data`, and `subroute` from
-its `tail`. The second `app-route` consumes the `subroute`, and when it
-matches, it produces an object called `subrouteData` from its `data`.
-
-So, when `route.path` is `'/about'`, the `routeData` object will look like
-this: `{ page: 'about' }`
-
-And `subrouteData` will be null. However, if `route.path` changes to
-`'/article/123'`, the `routeData` object will look like this:
-`{ page: 'article' }`
-
-And the `subrouteData` will look like this: `{ id: '123' }`
-
-`app-route` is responsive to bi-directional changes to the `data` objects
-they produce. So, if `routeData.page` changed from `'article'` to `'about'`,
-the `app-route` will update `route.path`. This in-turn will update the
-`app-location`, and cause the global location bar to change its value.
-
-@element app-route
-@demo demo/index.html
-@demo demo/data-loading-demo.html
-@demo demo/simple-demo.html
--->
-
-<script>
-  (function() {
-    'use strict';
-
-    Polymer({
-      is: 'app-route',
-
-      properties: {
-        /**
-         * The URL component managed by this element.
-         */
-        route: {
-          type: Object,
-          notify: true
-        },
-
-        /**
-         * The pattern of slash-separated segments to match `route.path` against.
-         *
-         * For example the pattern "/foo" will match "/foo" or "/foo/bar"
-         * but not "/foobar".
-         *
-         * Path segments like `/:named` are mapped to properties on the `data` object.
-         */
-        pattern: {
-          type: String
-        },
-
-        /**
-         * The parameterized values that are extracted from the route as
-         * described by `pattern`.
-         */
-        data: {
-          type: Object,
-          value: function() {return {};},
-          notify: true
-        },
-
-        /**
-         * @type {?Object}
-         */
-        queryParams: {
-          type: Object,
-          value: function() {
-            return {};
-          },
-          notify: true
-        },
-
-        /**
-         * The part of `route.path` NOT consumed by `pattern`.
-         */
-        tail: {
-          type: Object,
-          value: function() {return {path: null, prefix: null, __queryParams: null};},
-          notify: true
-        },
-
-        /**
-         * Whether the current route is active. True if `route.path` matches the 
-         * `pattern`, false otherwise.
-         */
-        active: {
-          type: Boolean,
-          notify: true,
-          readOnly: true
-        },
-
-        _queryParamsUpdating: {
-          type: Boolean,
-          value: false
-        },
-        /**
-         * @type {?string}
-         */
-        _matched: {
-          type: String,
-          value: ''
-        }
-      },
-
-      observers: [
-        '__tryToMatch(route.path, pattern)',
-        '__updatePathOnDataChange(data.*)',
-        '__tailPathChanged(tail.path)',
-        '__routeQueryParamsChanged(route.__queryParams)',
-        '__tailQueryParamsChanged(tail.__queryParams)',
-        '__queryParamsChanged(queryParams.*)'
-      ],
-
-      created: function() {
-        this.linkPaths('route.__queryParams', 'tail.__queryParams');
-        this.linkPaths('tail.__queryParams', 'route.__queryParams');
-      },
-
-      /**
-       * Deal with the query params object being assigned to wholesale.
-       * @export
-       */
-      __routeQueryParamsChanged: function(queryParams) {
-        if (queryParams && this.tail) {
-          this.set('tail.__queryParams', queryParams);
-
-          if (!this.active || this._queryParamsUpdating) {
-            return;
-          }
-
-          // Copy queryParams and track whether there are any differences compared
-          // to the existing query params.
-          var copyOfQueryParams = {};
-          var anythingChanged = false;
-          for (var key in queryParams) {
-            copyOfQueryParams[key] = queryParams[key];
-            if (anythingChanged ||
-                !this.queryParams ||
-                queryParams[key] !== this.queryParams[key]) {
-              anythingChanged = true;
-            }
-          }
-          // Need to check whether any keys were deleted
-          for (var key in this.queryParams) {
-            if (anythingChanged || !(key in queryParams)) {
-              anythingChanged = true;
-              break;
-            }
-          }
-
-          if (!anythingChanged) {
-            return;
-          }
-          this._queryParamsUpdating = true;
-          this.set('queryParams', copyOfQueryParams);
-          this._queryParamsUpdating = false;
-        }
-      },
-
-      /**
-       * @export
-       */
-      __tailQueryParamsChanged: function(queryParams) {
-        if (queryParams && this.route) {
-          this.set('route.__queryParams', queryParams);
-        }
-      },
-
-      /**
-       * @export
-       */
-      __queryParamsChanged: function(changes) {
-        if (!this.active || this._queryParamsUpdating) {
-          return;
-        }
-
-        this.set('route.__' + changes.path, changes.value);
-      },
-
-      __resetProperties: function() {
-        this._setActive(false);
-        this._matched = null;
-        //this.tail = { path: null, prefix: null, queryParams: null };
-        //this.data = {};
-      },
-
-      /**
-       * @export
-       */
-      __tryToMatch: function() {
-        if (!this.route) {
-          return;
-        }
-        var path = this.route.path;
-        var pattern = this.pattern;
-        if (!pattern) {
-          return;
-        }
-
-        if (!path) {
-          this.__resetProperties();
-          return;
-        }
-
-        var remainingPieces = path.split('/');
-        var patternPieces = pattern.split('/');
-
-        var matched = [];
-        var namedMatches = {};
-
-        for (var i=0; i < patternPieces.length; i++) {
-          var patternPiece = patternPieces[i];
-          if (!patternPiece && patternPiece !== '') {
-            break;
-          }
-          var pathPiece = remainingPieces.shift();
-
-          // We don't match this path.
-          if (!pathPiece && pathPiece !== '') {
-            this.__resetProperties();
-            return;
-          }
-          matched.push(pathPiece);
-
-          if (patternPiece.charAt(0) == ':') {
-            namedMatches[patternPiece.slice(1)] = pathPiece;
-          } else if (patternPiece !== pathPiece) {
-            this.__resetProperties();
-            return;
-          }
-        }
-
-        this._matched = matched.join('/');
-
-        // Properties that must be updated atomically.
-        var propertyUpdates = {};
-
-        //this.active
-        if (!this.active) {
-          propertyUpdates.active = true;
-        }
-
-        // this.tail
-        var tailPrefix = this.route.prefix + this._matched;
-        var tailPath = remainingPieces.join('/');
-        if (remainingPieces.length > 0) {
-          tailPath = '/' + tailPath;
-        }
-        if (!this.tail ||
-            this.tail.prefix !== tailPrefix ||
-            this.tail.path !== tailPath) {
-          propertyUpdates.tail = {
-            prefix: tailPrefix,
-            path: tailPath,
-            __queryParams: this.route.__queryParams
-          };
-        }
-
-        // this.data
-        propertyUpdates.data = namedMatches;
-        this._dataInUrl = {};
-        for (var key in namedMatches) {
-          this._dataInUrl[key] = namedMatches[key];
-        }
-
-        this.__setMulti(propertyUpdates);
-      },
-
-      /**
-       * @export
-       */
-      __tailPathChanged: function(path) {
-        if (!this.active) {
-          return;
-        }
-        var tailPath = path;
-        var newPath = this._matched;
-        if (tailPath) {
-          if (tailPath.charAt(0) !== '/') {
-            tailPath = '/' + tailPath;
-          }
-          newPath += tailPath;
-        }
-        this.set('route.path', newPath);
-      },
-
-      /**
-       * @export
-       */
-      __updatePathOnDataChange: function() {
-        if (!this.route || !this.active) {
-          return;
-        }
-        var newPath = this.__getLink({});
-        var oldPath = this.__getLink(this._dataInUrl);
-        if (newPath === oldPath) {
-          return;
-        }
-        this.set('route.path', newPath);
-      },
-
-      __getLink: function(overrideValues) {
-        var values = {tail: null};
-        for (var key in this.data) {
-          values[key] = this.data[key];
-        }
-        for (var key in overrideValues) {
-          values[key] = overrideValues[key];
-        }
-        var patternPieces = this.pattern.split('/');
-        var interp = patternPieces.map(function(value) {
-          if (value[0] == ':') {
-            value = values[value.slice(1)];
-          }
-          return value;
-        }, this);
-        if (values.tail && values.tail.path) {
-          if (interp.length > 0 && values.tail.path.charAt(0) === '/') {
-            interp.push(values.tail.path.slice(1));
-          } else {
-            interp.push(values.tail.path);
-          }
-        }
-        return interp.join('/');
-      },
-
-      __setMulti: function(setObj) {
-        // HACK(rictic): skirting around 1.0's lack of a setMulti by poking at
-        //     internal data structures. I would not advise that you copy this
-        //     example.
-        //
-        //     In the future this will be a feature of Polymer itself.
-        //     See: https://github.com/Polymer/polymer/issues/3640
-        //
-        //     Hacking around with private methods like this is juggling footguns,
-        //     and is likely to have unexpected and unsupported rough edges.
-        //
-        //     Be ye so warned.
-        for (var property in setObj) {
-          this._propertySetter(property, setObj[property]);
-        }
-        //notify in a specific order
-        if (setObj.data !== undefined) {
-          this._pathEffector('data', this.data);
-          this._notifyChange('data');
-        }
-        if (setObj.active !== undefined) {
-          this._pathEffector('active', this.active);
-          this._notifyChange('active');
-        }
-        if (setObj.tail !== undefined) {
-          this._pathEffector('tail', this.tail);
-          this._notifyChange('tail');
-        }
-
-      }
-    });
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/bower.json b/systrace/catapult/third_party/polymer/components/app-route/bower.json
deleted file mode 100644
index 29023ae..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "app-route",
-  "version": "1.0.1",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "description": "App routing expressed as Polymer Custom Elements.",
-  "main": [
-    "app-route.html",
-    "app-location.html",
-    "app-route-converter.html"
-  ],
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/app-route",
-  "private": true,
-  "ignore": [],
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.13",
-    "paper-input": "polymerelements/paper-input#^1.1.2",
-    "web-component-tester": "^4.0.0",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "iron-pages": "PolymerElements/iron-pages#^1.0.7",
-    "paper-card": "PolymerElements/paper-card#^1.1.1",
-    "paper-icon-button": "polymerelements/paper-icon-button#^v1.0.0",
-    "paper-toggle-button": "polymerelements/paper-toggle-button#^v1.0.0",
-    "google-youtube": "GoogleWebComponents/google-youtube#^1.2.1",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.0",
-    "paper-spinner": "PolymerElements/paper-spinner#^1.1.1"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.3.1",
-    "iron-location": "PolymerElements/iron-location#^0.8.1"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo.html b/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo.html
deleted file mode 100644
index 20797f7..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>carbon-route data loading example</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-demo-helpers/url-bar.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="./data-loading-demo/flickr-search-demo.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-  </style>
-</head>
-<body>
-
-<url-bar></url-bar>
-
-<flickr-search-demo></flickr-search-demo>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-image-page.html b/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-image-page.html
deleted file mode 100644
index eeb3a1e..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-image-page.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-ajax/iron-ajax.html">
-<link rel="import" href="../../../paper-spinner/paper-spinner.html">
-<link rel="import" href="../../app-route.html">
-
-<dom-module id="flickr-image-page">
-  <template>
-    <style>
-      paper-spinner {
-        display: block;
-      }
-      .tags span {
-        display: inline-block;
-        padding-right: 10px;
-        font-size: 110%;
-      }
-      .tags span::after {
-        content: ', ';
-      }
-      .tags span:last-of-type::after {
-        content: '';
-      }
-    </style>
-    <app-route route="{{route}}" pattern="/:farm/:server/:id/:secret" data="{{data}}">
-    </app-route>
-    <img src="{{_computeSrc(data)}}">
-    <iron-ajax auto url="https://www.flickr.com/services/rest/"
-               handle-as="json"
-               params="{{params}}"
-               last-response="{{metadata}}"
-               last-error="{{error}}"
-               loading="{{loading}}">
-    </iron-ajax>
-    <paper-spinner active="{{loading}}"></paper-spinner>
-    <div>
-      <h1>{{metadata.photo.title._content}}</h1>
-      <div class="tags">
-      <template is="dom-repeat" items="{{metadata.photo.tags.tag}}">
-        <span>{{item.raw}}</span>
-      </template>
-      </div>
-      <div>
-        <ul>
-          <template is="dom-repeat" items="{{metadata.photo.urls.url}}">
-            <li>
-              <a target="_blank" href="{{item._content}}">
-                {{item._content}}
-              </a>
-            </li>
-          </template>
-        </ul>
-      </div>
-    </div>
-  </template>
-  <script>
-    Polymer({
-      is: 'flickr-image-page',
-      properties: {
-        apiKey: {
-          type: String,
-        },
-
-        params: {
-          type: Object,
-          computed: '_computeParams(apiKey, data.id, data.secret)'
-        }
-
-      },
-      observers: [
-        '_clearOldMetadata(route.path)'
-      ],
-
-      _clearOldMetadata: function() {
-        this.metadata = null;
-      },
-
-      _computeParams: function(apiKey, id, secret) {
-        return {
-          method: 'flickr.photos.getInfo',
-          api_key: apiKey,
-          photo_id: id,
-          secret: secret,
-          format: 'json',
-          nojsoncallback: 1
-        };
-      },
-
-      _computeSrc: function(photo) {
-        if (!photo || !photo.farm) {
-          return '';
-        }
-        return 'https://farm' + photo.farm + '.staticflickr.com/' +
-            photo.server + '/' + photo.id + '_' + photo.secret + '.jpg';
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-search-demo.html b/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-search-demo.html
deleted file mode 100644
index b13fc7b..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-search-demo.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-pages/iron-pages.html">
-<link rel="import" href="../../app-location.html">
-<link rel="import" href="../../app-route.html">
-<link rel="import" href="./flickr-search-page.html">
-<link rel="import" href="./flickr-image-page.html">
-
-
-<dom-module id="flickr-search-demo">
-  <template>
-    <style>
-      a {
-        text-decoration: none;
-        color: inherit;
-      }
-      a:hover {
-        text-decoration: underline;
-      }
-    </style>
-    <app-location route="{{route}}" use-hash-as-path></app-location>
-    <app-route route="{{route}}" pattern="/:page" data="{{data}}">
-    </app-route>
-    <app-route route="{{route}}" pattern="/search" tail="{{searchRoute}}">
-    </app-route>
-    <app-route route="{{route}}" pattern="/image" tail="{{imageRoute}}">
-    </app-route>
-
-    <h1><a href="#/search/">Public Domain Image Search</a></h1>
-
-    <iron-pages attr-for-selected="id" selected="{{data.page}}"
-                selected-attribute="selected">
-      <flickr-search-page id="search" api-key="{{apiKey}}"
-                          route="{{searchRoute}}">
-      </flickr-search-page>
-      <flickr-image-page id="image" api-key="{{apiKey}}" route="{{imageRoute}}">
-      </flickr-image-page>
-    </iron-pages>
-  </template>
-  <script>
-    Polymer({
-      is: 'flickr-search-demo',
-      properties: {
-        apiKey: {
-          type: String,
-          value: '5358d9830b6865a13d251e5e1acb4c30'
-        }
-      },
-
-      attached: function() {
-        if (this.route.path === '') {
-          this.set('route.path', '/search/');
-        }
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-search-page.html b/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-search-page.html
deleted file mode 100644
index dedb3eb..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/data-loading-demo/flickr-search-page.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-spinner/paper-spinner.html">
-<link rel="import" href="../../../paper-input/paper-input.html">
-<link rel="import" href="../../app-route.html">
-
-<dom-module id="flickr-search-page">
-  <template>
-    <style>
-      paper-spinner {
-        display: block;
-      }
-      img {
-        max-width: 200px;
-        max-height: 200px;
-      }
-    </style>
-    <app-route pattern="/" route="{{route}}" query-params="{{queryParams}}"
-               active="{{active}}">
-    </app-route>
-    <paper-input autofocus label="Search the public domain on Flickr"
-                 value="{{queryParams.search}}">
-    </paper-input>
-
-    <iron-ajax auto url="https://www.flickr.com/services/rest/"
-               handle-as="json"
-               debounce-duration="300"
-               params="{{params}}"
-               last-response="{{response}}"
-               last-error="{{error}}"
-               loading="{{loading}}">
-    </iron-ajax>
-    <paper-spinner active="{{loading}}"></paper-spinner>
-    <template is="dom-repeat" items="{{response.photos.photo}}" as="photo">
-      <a href="{{_computeLink(photo)}}">
-        <img src="{{_computeSrc(photo)}}">
-      </a>
-    </template>
-    <template is="dom-if" if="{{error}}">
-      <span>{{error.statusCode}}</span> Error:
-      <pre>{{error.response}}</pre>
-    </template>
-  </template>
-  <script>
-    Polymer({
-      is: 'flickr-search-page',
-      properties: {
-        apiKey: {
-          type: String,
-        },
-
-        params: {
-          type: Object,
-          computed: '_computeParams(apiKey, queryParams.search)'
-        },
-      },
-
-      observers: [
-        '_clearOldSearchResults(queryParams.search)',
-        '_setDefaultSearch(active)'
-      ],
-
-      _clearOldSearchResults: function() {
-        this.response = null;
-      },
-
-      _computeParams: function(apiKey, search) {
-        return {
-          method: 'flickr.photos.search',
-          api_key: apiKey,
-          text: search,
-          license: '7,8',
-          format: 'json',
-          nojsoncallback: 1
-        };
-      },
-
-      _computeSrc: function(photo) {
-        if (!photo || !photo.farm) {
-          return '';
-        }
-        return 'https://farm' + photo.farm + '.staticflickr.com/' +
-            photo.server + '/' + photo.id + '_' + photo.secret + '.jpg';
-      },
-
-      _computeLink: function(photo) {
-        return window.location.pathname + '#/image/' + photo.farm + '/' +
-            photo.server + '/' + photo.id + '/' + photo.secret;
-      },
-
-      _setDefaultSearch: function(active) {
-        if (active && !this.queryParams.search) {
-          this.set('queryParams.search', 'spaceship')
-        }
-      }
-    })
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/index.html b/systrace/catapult/third_party/polymer/components/app-route/demo/index.html
deleted file mode 100644
index 4a80ad0..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/index.html
+++ /dev/null
@@ -1,214 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at
-http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at
-http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at
-http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at
-http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-<title>app-route Demo</title>
-<link rel="import" href="../../polymer/polymer.html">
-
-<link rel="import" href="../../iron-demo-helpers/url-bar.html">
-<link rel="import" href="../../iron-pages/iron-pages.html">
-
-<link rel="import" href="../app-location.html">
-<link rel="import" href="../app-route.html">
-
-<link rel="import" href="youtube-demo/youtube-search.html">
-<link rel="import" href="youtube-demo/youtube-toolbar.html">
-<link rel="import" href="youtube-demo/video-viewer.html">
-<link rel="import" href="youtube-demo/search-results.html">
-
-<style>
-  body {
-    margin: 0;
-    padding: 0;
-  }
-  url-bar {
-    background-color: white;
-  }
-</style>
-</head>
-
-<body>
-
-<url-bar></url-bar>
-
-<app-router-demo></app-router-demo>
-
-<dom-module id="app-router-demo">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-        height: 100vh;
-        @apply(--paper-font-common-base);
-      }
-
-      :host([video-page-active]) {
-        overflow: hidden;
-      }
-
-      :host([video-page-active]) iron-pages {
-        transform: translateY(-170px);
-      }
-
-      iron-pages {
-        transition: transform 0.3s;
-      }
-    </style>
-
-
-    <!-- app-location binds with the URL and produces a route for
-    app-route elements to consume. Since this demo needs to run without
-    server cooperation (e.g. with polyserve, in the elements catalog, etc) we'll
-    use the hash portion of the URL for our route paths. -->
-    <app-location route="{{route}}" use-hash-as-path></app-location>
-
-    <!-- app-routes parse route paths based on the their `pattern`.
-    Parameters are extracted into the `data` object. The rest of the path that
-    comes after the `pattern` is put into the `tail` object, which can be
-    passed to the `route` property of downstream app-routes. -->
-    <app-route route="{{route}}" pattern="/:page" data="{{data}}"></app-route>
-    <app-route route="{{route}}" pattern="/search" tail="{{searchTail}}"></app-route>
-    <app-route route="{{route}}" pattern="/video" tail="{{videoTail}}" active="{{videoPageActive}}"></app-route>
-
-    <youtube-toolbar collapsed$="{{videoPageActive}}">
-      <!-- The youtube-search has a app-route that consumes the tail of
-      another route (`searchTail`) -->
-      <youtube-search
-          route="{{searchTail}}"
-          video-data="{{videoData}}">
-      </youtube-search>
-    </youtube-toolbar>
-
-    <iron-pages attr-for-selected="id" selected="{{data.page}}">
-      <search-results id="search" items="{{videos}}"></search-results>
-
-      <!-- The video-viewer has a app-route that consumes the tail of
-      another route -->
-      <video-viewer id="video" route="{{videoTail}}"></video-viewer>
-    </iron-pages>
-
-  </template>
-
-  <script>
-    window.addEventListener('WebComponentsReady', function() {
-      Polymer({
-        is: 'app-router-demo',
-
-        properties: {
-          route: {
-            type: Object
-          },
-
-          videoData: {
-            type: Object,
-            observer: '_videoDataChanged'
-          },
-
-          videoPageActive: {
-            type: Boolean,
-            reflectToAttribute: true,
-            observer: '_videoPageActiveChanged'
-          },
-
-          searchTail: {
-            type: Object,
-            notify: true
-          },
-
-          videoTail: {
-            type: Object,
-            notify: true
-          },
-
-          newCategory: {
-            type: String
-          },
-
-          videos: {
-            type: Array,
-            value: function() {
-              return [];
-            }
-          },
-
-          data: {
-            type: Object,
-            value: function() {
-              return {
-                page: '/search/'
-              };
-            }
-          }
-        },
-
-        observers: [
-          '_onRoutePathChanged(route.path)'
-        ],
-
-        _onRoutePathChanged: function(path) {
-          // If we do not have an initial URL, we redirect to /search
-          if (!path) {
-            this.set('route.path', '/search/');
-          }
-        },
-
-        _videoDataChanged: function(data) {
-          var allVideos = [];
-
-          var that = this;
-
-          data.items.forEach(function (videoItem) {
-            var youtubeVideo = {
-              id: videoItem.id.videoId,
-              title: videoItem.snippet.title,
-              thumbnail: videoItem.snippet.thumbnails.high.url
-            };
-
-            allVideos.push(youtubeVideo);
-          });
-
-          this.set('videos', allVideos);
-        },
-
-        _videoPageActiveChanged: function(videoPageActive, previousValue) {
-          // change color of page on page change
-          var newColor;
-
-          if (videoPageActive) {
-            // black
-            newColor = 0;
-          } else {
-            // white
-            newColor = 255;
-          }
-
-          document.body.style.backgroundColor = 'rgb(' + newColor + ',' + newColor
-              + ','  + newColor + ')';
-
-          // on first load, set the color then allow color transition animations
-          if (previousValue === undefined) {
-            document.body.style.transition = 'background-color .2s linear';
-            return;
-          }
-        }
-      });
-    });
-  </script>
-</dom-module>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/simple-demo.html b/systrace/catapult/third_party/polymer/components/app-route/demo/simple-demo.html
deleted file mode 100644
index 83f5014..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/simple-demo.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-<title>app-route Demo</title>
-<link rel="import" href="../../polymer/polymer.html">
-
-<link rel="import" href="../../iron-demo-helpers/url-bar.html">
-<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-<link rel="import" href="../../iron-pages/iron-pages.html">
-<link rel="import" href="../../paper-input/paper-input.html">
-<link rel="import" href="../../paper-button/paper-button.html">
-
-<link rel="import" href="../app-location.html">
-<link rel="import" href="../app-route.html">
-</head>
-
-<body>
-<dom-module id="route-display">
-  <template>
-    <div>
-      <div>route<template is="dom-if" if="{{tail}}"> / tail</template>: {</div>
-      <div>&nbsp;&nbsp;prefix: {{route.prefix}}</div>
-      <div>&nbsp;&nbsp;path: {{route.path}}</div>
-      <div>}</div>
-    </div>
-  </template>
-  <script>
-    Polymer({
-      is: 'route-display',
-
-      properties: {
-        route: Object,
-        tail: Boolean
-      }
-    });
-  </script>
-</dom-module>
-
-<template is="dom-bind">
-  <url-bar></url-bar>
-
-  <app-location route="{{route}}" use-hash-as-path></app-location>
-
-  <app-route
-    route="{{route}}"
-    pattern="/:demoType"
-    data="{{demoSelectionData}}"
-    tail="{{demoSelectionTail}}">
-  </app-route>
-
-  <app-route
-      route="{{route}}"
-      pattern="/pathDemo/:firstPath/:secondPath"
-      data="{{pathData}}"
-      tail="{{pathDataTail}}">
-  </app-route>
-
-  <app-route
-      route="{{route}}"
-      pattern="/queryParamsDemo"
-      query-params="{{queryParams}}"
-      tail="{{qpDemoTail}}">
-  </app-route>
-
-  <div>App location route object
-    <route-display route="{{route}}"></route-display>
-  </div>
-
-  <paper-button raised>
-    <a href="#/pathDemo/firstPath/secondPath/thirdPath">Changes in Path</a>
-  </paper-button>
-
-  <paper-button raised>
-    <a href="?hello=world&foo=bar#/queryParamsDemo">Changes in Query Params</a>
-  </paper-button>
-
-  <iron-pages selected={{demoSelectionData.demoType}} attr-for-selected="demo">
-    <div demo="pathDemo">
-      Change location of first part of the path:
-      <paper-input value="{{pathData.firstPath}}"></paper-input>
-      Change location of second part of the path:
-      <paper-input value="{{pathData.secondPath}}"></paper-input>
-      
-      <app-route
-          route="{{pathDataTail}}"
-          pattern="/:thirdPath"
-          data="{{tailExampleData}}">
-      </app-route>
-      You can pass the tail of an app-route to be the route another app-route. Here is
-      the tail object of the first app-route which is the route object of this new app-route:
-      <route-display route="{{pathDataTail}}" tail></route-display>
-      You can also bind to this new route. Change the location of the third part of
-      the path:
-      <paper-input value="{{tailExampleData.thirdPath}}"></paper-input>
-    </div>
-
-    <div demo="queryParamsDemo">
-      Change the value of the hello query param
-      <paper-input value="{{queryParams.hello}}"></paper-input>
-      Change the value of the foo param
-      <paper-input value="{{queryParams.foo}}"></paper-input>
-    </div>
-  </iron-pages>
-</template>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/route-info.html b/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/route-info.html
deleted file mode 100644
index 26e7909..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/route-info.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-
-<dom-module id="route-info">
-  <template>
-    <style>
-      :host {
-        font-style: italic;
-        font-size: 0.85em;
-        font-weight: 200;
-        white-space: nowrap;
-        overflow: hidden;
-        text-overflow: ellipsis;
-        color: #fff;
-      }
-    </style>
-    <span>Route prefix: {{route.prefix}} &middot; Route path: {{route.path}} &middot; Query params: {{_stringifyQueryParams(route.queryParams.*)}}</span>
-  </template>
-  <script>
-    Polymer({
-      is: 'route-info',
-
-      properties: {
-        route: {
-          type: Object
-        }
-      },
-
-      _stringifyQueryParams: function() {
-        var params = [];
-        if (this.route && this.route.queryParams) {
-          for (var key in this.route.queryParams) {
-            params.push(key + ' = ' + this.route.queryParams[key]);
-          }
-        }
-        return params.join(', ');
-      }
-    })
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/search-results.html b/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/search-results.html
deleted file mode 100644
index 752fdb1..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/search-results.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-card/paper-card.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-
-<dom-module id="search-results">
-  <template>
-    <style>
-      :host {
-        @apply(--layout-horizontal);
-        @apply(--layout-center-center);
-        @apply(--layout-wrap);
-      }
-
-      a {
-        color: black;
-        text-decoration: none;
-      }
-
-      paper-card {
-        width: 300px;
-        margin: 1em 0.5em 0em;
-        font-size: 14px;
-      }
-
-      .card-content {
-        white-space: nowrap;
-        overflow: hidden;
-        text-overflow: ellipsis;
-      }
-    </style>
-    <template is="dom-repeat" items="{{items}}" as="video">
-      <!-- The '#' is included because the use-hash-as-path property is
-      set to true in the app-location -->
-      <a href="./#/video/{{video.id}}">
-        <paper-card image="{{video.thumbnail}}">
-          <div class="card-content">
-            {{video.title}}
-          </div>
-        </paper-card>
-      </a>
-    </template>
-  </template>
-  <script>
-    Polymer({
-      is: 'search-results',
-
-      properties: {
-        items: {
-          type: Array
-        }
-      }
-    })
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/video-viewer.html b/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/video-viewer.html
deleted file mode 100644
index 4786e4a..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/video-viewer.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-styles/color.html">
-<link rel="import" href="../../../paper-input/paper-input.html">
-<link rel="import" href="../../../paper-toggle-button/paper-toggle-button.html">
-
-<link rel="import" href="../../app-route.html">
-
-<link rel="import" href="youtube-lite.html">
-<link rel="import" href="route-info.html">
-
-<dom-module id="video-viewer">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-        height: calc(100vh - 60px);
-        --primary-color: var(--paper-red-500);
-        --primary-text-color: #fff;
-        --paper-toggle-button-unchecked-bar-color: #888;
-      }
-
-      paper-input {
-        width: 100px;
-      }
-
-      #controls {
-        color: #fff;
-        @apply(--layout-vertical);
-        @apply(--layout-center-center);
-        height: 30%;
-      }
-
-      #controls > div {
-        @apply(--layout-horizontal);
-        padding-bottom: 1em;
-      }
-
-      #state {
-        margin-left: 16px;
-      }
-
-      #player {
-        height: 70%;
-      }
-    </style>
-
-    <!-- This app-route consumes the route which was provided by the tail of
-    a app-route in the host of this element. This means that the parent that
-    provides this route decides where this element lives in the URL space. In
-    this case, the parent, which uses hashes, matches #/video and hence this
-    element lives in <App serving point>?querParams#/video/:vid -->
-    <app-route route="{{route}}" pattern="/:vid" data="{{data}}" query-params="{{queryParams}}">
-    </app-route>
-
-    <!-- You can bind any element's state into the URL by binding their
-    properties into the queryParams object. youtube-lite doesn't have any code
-    that's even aware of routing or the URL. -->
-    <youtube-lite
-        id="player"
-        video-id="{{data.vid}}"
-        state="{{queryParams.state}}"
-        current-time="{{queryParams.time}}"
-        start-time="{{queryParams.time}}">
-    </youtube-lite>
-
-    <div id="controls">
-      <div>
-        <paper-input
-            id="time"
-            type="number"
-            on-focus="pause"
-            label="Time"
-            value="{{queryParams.time}}">
-        </paper-input>
-        <paper-toggle-button id="state" active="{{playing}}">[[queryParams.state]]</paper-toggle-button>
-      </div>
-      <route-info route="[[route]]"></route-info>
-    </div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'video-viewer',
-
-      properties: {
-        route: {
-          type: Object,
-          notify: true
-        },
-
-        data: {
-          type: Object
-        },
-
-        playing: {
-          type: Boolean
-        },
-
-        queryParams: {
-          type: Object
-        }
-      },
-
-      observers: [
-        '_playingChanged(playing)',
-        '_stateChanged(queryParams.state)'
-      ],
-
-      pause: function() {
-        this.set('queryParams.state', 'paused');
-      },
-
-      _playingChanged: function(playing) {
-        this.set('queryParams.state', playing ? 'playing' : 'paused');
-      },
-
-      _stateChanged: function(state) {
-        this.playing = state === 'playing';
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-lite.html b/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-lite.html
deleted file mode 100644
index 24f1a7b..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-lite.html
+++ /dev/null
@@ -1,204 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../google-youtube/google-youtube.html">
-<!--
-youtube-lite provides a simple subset of the google-youtube element's API. By
-simplifying the API we're also able to make it more amenable to two-way data
-binding.
-
-Note that this element is totally agnostic to routing!
--->
-<dom-module id="youtube-lite">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-        width: 100%;
-      }
-
-      google-youtube {
-        height: 100%;
-      }
-    </style>
-
-    <google-youtube
-        id="player"
-        video-id="{{videoId}}"
-        state="{{__state}}"
-        currenttime="{{__currentTime}}"
-        width="100%"
-        height="100%">
-    </google-youtube>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'youtube-lite',
-
-      properties: {
-        videoId: {
-          type: String,
-          notify: true
-        },
-
-        state: {
-          type: String,
-          notify: true,
-          observer: '_stateChanged'
-        },
-
-        currentTime: {
-          type: Number,
-          notify: true,
-          observer: '_currentTimeChanged'
-        },
-
-        startTime: {
-          type: Number
-        },
-
-        __state: {
-          type: String,
-          observer: '__ytApiStateChange'
-        },
-
-        __currentTime: {
-          type: String,
-          observer: '_ytCurrentTimeChanged'
-        },
-
-        __pauseOnFirstSeek: {
-          type: Boolean
-        }
-      },
-
-      listeners: {
-        'google-youtube-ready': '_onYoutubeReady'
-      },
-
-      _seekTo: function(newTime) {
-        var player = this.$.player;
-
-        if (player.duration == 1 || newTime < player.duration) {
-          player.seekTo(newTime);
-        }
-      },
-
-      _onYoutubeReady: function() {
-        this.__pauseOnFirstSeek = this.state == 'paused';
-
-        if (!this.__pauseOnFirstSeek || this.startTime) {
-          this._seekTo(this.startTime);
-        }
-      },
-
-      _currentTimeChanged: function(newTime, oldTime) {
-        var apiState = this.__readableStateToApiState(this.state);
-
-        if (apiState != 2 || this.__state != 2) {
-          return;
-        }
-
-        this._seekTo(newTime);
-      },
-
-      _ytCurrentTimeChanged: function(ytCurrentTime) {
-        if (this.__state === this.__apiStates.PAUSED) {
-          return;
-        }
-
-        this.currentTime = ytCurrentTime;
-      },
-
-      _stateChanged: function(newState, oldState) {
-        var newApiState = this.__readableStateToApiState(newState);
-
-        if (newApiState == this.__state ||
-            this.__state == this.__apiStates.UNSTARTED) {
-          return;
-        }
-
-        this.currentTime = this.__currentTime;
-        var player = this.$.player;
-
-        switch (newApiState) {
-          case this.__apiStates.PLAYING:
-            player.play();
-            break;
-          case this.__apiStates.PAUSED:
-            player.pause();
-            break;
-          default:
-            return;
-        }
-      },
-
-      __ytApiStateChange: function(newState, oldState) {
-        var readableState;
-
-        switch (newState) {
-          case this.__apiStates.ENDED:
-            readableState = this.__states.PAUSED;
-            break;
-          case this.__apiStates.PLAYING:
-            readableState = this.__states.PLAYING;
-            break;
-          case this.__apiStates.PAUSED:
-            readableState = this.__states.PAUSED;
-            break;
-          default:
-            return;
-        }
-
-        if (this.state == readableState) {
-          return;
-        }
-
-        if (this.__pauseOnFirstSeek && readableState == this.__states.PLAYING) {
-          this.__pauseOnFirstSeek = false;
-          this.$.player.pause();
-          return;
-        }
-
-        this.state = readableState;
-        this.currentTime = this.__currentTime;
-      },
-
-      __readableStateToApiState: function(readableState) {
-        var newApiState  = -2;
-
-        if (readableState == this.__states.PLAYING) {
-          newApiState = this.__apiStates.PLAYING;
-
-        } else if (readableState = this.__states.PAUSED) {
-          newApiState = this.__apiStates.PAUSED;
-        }
-
-        return newApiState;
-      },
-
-      __states: {
-        PLAYING: 'playing',
-        PAUSED: 'paused'
-      },
-
-      __apiStates: {
-        UNSTARTED: -1,
-        ENDED: 0,
-        PLAYING: 1,
-        PAUSED: 2,
-        BUFFERING: 3,
-        QUEUED: 5
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-search.html b/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-search.html
deleted file mode 100644
index 845c865..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-search.html
+++ /dev/null
@@ -1,103 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-input/paper-input.html">
-<link rel="import" href="../../../iron-ajax/iron-ajax.html">
-
-<link rel="import" href="../../app-route.html">
-
-<link rel="import" href="route-info.html">
-
-<dom-module id="youtube-search">
-  <template>
-    <style>
-      :host {
-        --primary-color: #fff;
-        --paper-input-container-color: #fff;
-        display: block;
-        position: relative;
-        padding: 1em;
-      }
-
-      route-info {
-        color: #fff;
-      }
-    </style>
-
-    <!-- This app-route consumes the route which was provided by the tail of
-    a app-route in the host of this element -->
-    <app-route route="{{route}}" pattern="/:searchQuery" data="{{data}}">
-    </app-route>
-
-    <paper-input label="Search Youtube" value="{{data.searchQuery}}"></paper-input>
-
-    <route-info route="[[route]]"></route-info>
-
-    <iron-ajax auto
-        id="youtubeSearch"
-        url="https://www.googleapis.com/youtube/v3/search"
-        params="{{params}}"
-        last-response="{{videoData}}">
-    </iron-ajax>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'youtube-search',
-
-      properties: {
-        route: {
-          type: Object,
-          notify: true
-        },
-
-        data: {
-          type: Object
-        },
-
-        category: {
-          type: String,
-          notify: true,
-          observer: '_categoryChanged'
-        },
-
-        params: {
-          type: String,
-          computed: '_setParams(data.searchQuery)'
-        },
-
-        videoData: {
-          type: Object,
-          notify: true
-        }
-      },
-
-      observers: ['_pathChanged(route.path)'],
-
-      _pathChanged: function() {
-        this.async(function() {
-          if (!this.route.path) {
-            this.set('route.path', '/');
-          }
-        });
-      },
-
-      _setParams: function(category) {
-        return {
-          part: 'snippet',
-          q: this.data.searchQuery,
-          key: 'AIzaSyAuecFZ9xJXbGDkQYWBmYrtzOGJD-iDIgI',
-          type: 'video'
-        }
-      },
-
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-toolbar.html b/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-toolbar.html
deleted file mode 100644
index 7adc0b7..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/demo/youtube-demo/youtube-toolbar.html
+++ /dev/null
@@ -1,181 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-styles/shadow.html">
-<link rel="import" href="../../../paper-icon-button/paper-icon-button.html">
-<link rel="import" href="../../../iron-icons/iron-icons.html">
-
-<dom-module id="youtube-toolbar">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-        --paper-icon-button-ink-color: #fff;
-        --iron-icon-fill-color: #fff;
-      }
-
-      :host([collapsed]) #background {
-        transform: scaleY(calc(60/230));
-      }
-
-      :host([collapsed]) #youtube-logo {
-        transform: scale(calc(60/230)) translateY(-195px);
-      }
-
-      :host([collapsed]) #back {
-        transform: translateX(0);
-      }
-
-      :host([collapsed]) #content {
-        opacity: 0;
-        transition-delay: 0s;
-        transform: translateY(-10px);
-      }
-
-      #background {
-        height: 230px;
-        background-image: linear-gradient(#E7291A, #C21616);
-        @apply(--shadow-elevation-2dp);
-        transform-origin: 0 0;
-        transition: transform 0.3s;
-        transform: scaleY(1);
-      }
-
-      #youtube-logo {
-        display: block;
-        position: absolute;
-        margin: auto;
-        top: 30px;
-
-        left: calc(50% - 75px);
-
-        width: 150px;
-        height: calc(150px / 1.45);
-        background-image: radial-gradient(transparent 50%, #fff 50%);
-        border-radius: 9% / 13%;
-        transition: transform 0.3s;
-      }
-
-      #youtube-logo:before,
-      #youtube-logo:after {
-        content: '';
-        display: block;
-        position: absolute;
-        background-color: #fff;
-        width: 90%;
-        height: 14%;
-        left: 5%;
-        border-radius: 100% / 90%;
-      }
-
-      #youtube-logo:before {
-        top: -3.7%;
-      }
-
-      #youtube-logo:after {
-        bottom: -3.7%;
-      }
-
-      #youtube-logo > .lr-edge {
-        display: block;
-        position: absolute;
-        width: 100%;
-        height: 100%;
-      }
-
-      #youtube-logo > .lr-edge:before,
-      #youtube-logo > .lr-edge:after {
-        content: '';
-        display: block;
-        position: absolute;
-        background-color: #fff;
-        width: 10%;
-        height: 90%;
-        top: 5%;
-
-        border-radius: 100% / 90%;
-      }
-
-      #youtube-logo > .lr-edge:before {
-        left: -2.5%;
-      }
-
-      #youtube-logo > .lr-edge:after {
-        right: -2.5%;
-      }
-
-      #youtube-logo > .play-icon {
-        display: block;
-        position: absolute;
-        width: 80%;
-        height: 80%;
-        top: 10%;
-        left: 10%;
-        overflow: hidden;
-        background-image:
-          linear-gradient(90deg, #fff 38%, transparent 38%),
-          linear-gradient(35deg, transparent 57%, rgba(0, 0, 0, 0.3) 57%);
-      }
-
-      #youtube-logo > .play-icon:before,
-      #youtube-logo > .play-icon:after {
-        content: '';
-        display: block;
-        position: absolute;
-        width: 200%;
-        height: 65%;
-        background-color: #fff;
-      }
-
-      #youtube-logo > .play-icon:before {
-        transform-origin: top left;
-        top: -80%;
-        transform: rotate(29deg);
-      }
-
-      #youtube-logo > .play-icon:after {
-        transform-origin: bottom left;
-        bottom: -80%;
-        transform: rotate(-29deg);
-      }
-
-      #content {
-        display: block;
-        position: absolute;
-        bottom: 0;
-        width: 100%;
-        transition: transform 0.15s, opacity 0.15s;
-        transition-delay: 0.2s;
-      }
-
-      #back {
-        position: absolute;
-        top: 10px;
-        transform: translateX(-64px);
-        transition: transform 0.3s;
-      }
-    </style>
-    <div id="background"></div>
-    <div id="youtube-logo">
-      <div class="lr-edge"></div>
-      <div class="play-icon"></div>
-    </div>
-    <div id="content">
-      <content></content>
-    </div>
-    <a id="back" href="../#/search/"><paper-icon-button icon="icons:arrow-back"></paper-icon-button></a>
-  </template>
-  <script>
-    Polymer({
-      is: 'youtube-toolbar'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/index.html b/systrace/catapult/third_party/polymer/components/app-route/index.html
deleted file mode 100644
index 5b354f5..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>app-router</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/app-example-1.html b/systrace/catapult/third_party/polymer/components/app-route/test/app-example-1.html
deleted file mode 100644
index e86a703..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/app-example-1.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel='import' href='../app-route.html'>
-<link rel='import' href='../app-location.html'>
-
-<dom-module id='app-example-1'>
-  <template>
-    <app-location route='{{route}}'>
-    </app-location>
-    <app-route id="page" route='{{route}}' pattern='/:page' data='{{data}}'>
-    </app-route>
-    <app-route id="user" route='{{route}}' pattern='/user' tail='{{userRoute}}'>
-    </app-route>
-    <app-route id="tail" route='{{userRoute}}' pattern='/:page' data='{{userData}}' query-params="{{userQueryParams}}">
-    </app-route>
-  </template>
-  <script>
-    Polymer({
-      is: 'app-example-1',
-      observers: [
-        'pageChanged(data.page)',
-        'userPathChanged(userRoute.path)',
-      ],
-      pageChanged: function(page) {
-        if (page === 'redirectToUser') {
-          this.set('data.page', 'user');
-        }
-      },
-      userPathChanged: function(path) {
-        // Redirect from /user/ and /user to /user/view
-        if (path === '/' || path === '') {
-          this.set('userRoute.path', '/view');
-        }
-      }
-    })
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/app-location.html b/systrace/catapult/third_party/polymer/components/app-route/test/app-location.html
deleted file mode 100644
index cdb7123..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/app-location.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>app-location</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../iron-test-helpers/mock-interactions.html">
-  <link rel="import" href="../app-location.html">
-</head>
-<body>
-  <test-fixture id="BasicLocation">
-    <template>
-      <app-location></app-location>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="LocationViaHash">
-    <template>
-      <app-location use-hash-as-path></app-location>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ClickableLink">
-    <template>
-      <a></a>
-    </template>
-  </test-fixture>
-
-  <script>
-    'use strict';
-
-    function setLocation(url) {
-      window.history.pushState({}, '', url);
-      Polymer.Base.fire('location-changed', {}, { node: window });
-    }
-
-    function assign(a, b) {
-      if (Object.assign) {
-        return Object.assign.apply(Object, arguments);
-      }
-
-      for (var property in b) {
-        a[property] = b[property];
-      }
-
-      return a;
-    }
-
-    suite('<app-location>', function () {
-      var initialUrl;
-
-      setup(function() {
-        initialUrl = window.location.href;
-      });
-
-      teardown(function() {
-        window.history.replaceState({}, '', initialUrl);
-      });
-
-      suite('in the default configuration', function() {
-        var appLocation;
-
-        setup(function() {
-          appLocation = fixture('BasicLocation');
-        });
-
-        test('it automatically exposes the current route', function() {
-          expect(appLocation.route).to.be.ok;
-          expect(appLocation.route.path).to.be.equal(window.location.pathname);
-        });
-
-        suite('manipulating the route', function() {
-          var originalPath;
-          var originalQueryParams;
-
-          setup(function() {
-            originalPath = appLocation.route.path;
-            originalQueryParams = assign({}, appLocation.route.__queryParams);
-          });
-
-          teardown(function() {
-            appLocation.set('route.prefix', '');
-            appLocation.set('route.path', originalPath);
-            appLocation.set('route.__queryParams', originalQueryParams);
-          });
-
-          test('it reflects path to location.pathname', function() {
-            appLocation.set('route.path', '/foo/bar');
-            expect(window.location.pathname).to.be.equal('/foo/bar');
-          });
-
-          test('it reflects queryParams values to location.search', function() {
-            appLocation.set('route.__queryParams.foo', 1);
-            expect(window.location.search).to.match(/foo=1/);
-          });
-
-          test('it reflects completely replaced queryParams', function() {
-            appLocation.set('route.__queryParams', { bar: 1 });
-            expect(window.location.search).to.be.equal('?bar=1');
-          });
-
-          test('it reflects the prefix to location.pathname', function() {
-            appLocation.set('route.prefix', '/fiz');
-            expect(window.location.pathname).to.be.equal('/fiz' + originalPath);
-          });
-        });
-
-        /**
-         * NOTE: For a more thorough spec describing this behavior, please refer
-         * to the `iron-location` component.
-         */
-        suite('manipulating the history state', function() {
-          var originalLocation;
-
-          setup(function() {
-            originalLocation = window.location.toString();
-          });
-
-          teardown(function() {
-            setLocation(originalLocation);
-          });
-
-          test('it reflects location.pathname to route.path', function() {
-            setLocation('/fiz/buz');
-            expect(appLocation.route.path).to.be.equal('/fiz/buz');
-          });
-
-          test('it reflects location.search to route.__queryParams', function() {
-            setLocation('?fiz=buz');
-            expect(appLocation.route.__queryParams).to.be.eql({
-              fiz: 'buz'
-            });
-          });
-        });
-      });
-
-      suite('using the hash as the route path', function() {
-        var appLocation;
-
-        setup(function() {
-          appLocation = fixture('LocationViaHash');
-        });
-
-        test('it reflects location.hash to route.path', function() {
-          setLocation('#/fiz/buz');
-          expect(appLocation.route.path).to.be.equal('/fiz/buz');
-        });
-
-        test('it reflects route.path to location.hash', function() {
-          appLocation.set('route.path', '/foo/bar');
-          expect(window.location.hash).to.be.equal('#/foo/bar');
-        });
-      });
-    });
-  </script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/app-route-converter.html b/systrace/catapult/third_party/polymer/components/app-route/test/app-route-converter.html
deleted file mode 100644
index b5b8c55..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/app-route-converter.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>app-route-converter</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../app-route-converter.html">
-</head>
-<body>
-  <test-fixture id="BasicRouteConversion">
-    <template>
-      <app-route-converter>
-      </app-route-converter>
-    </template>
-  </test-fixture>
-
-  <script>
-    'use strict';
-
-    suite('<app-route-converter>', function() {
-      test('it bidirectionally maps path and queryParams to route', function() {
-        var converter = fixture('BasicRouteConversion');
-
-        var queryParams = {x: '10'};
-        converter.path = '/a/b/c';
-        converter.queryParams = queryParams;
-
-        expect(converter.route).to.be.deep.equal({
-          prefix: '',
-          path: '/a/b/c',
-          __queryParams: queryParams
-        });
-
-        converter.set('route.path', '/d/e/f');
-        expect(converter.path).to.be.equal('/d/e/f');
-
-        queryParams = {y: '11'};
-        converter.set('route.__queryParams', queryParams);
-        expect(converter.queryParams).to.be.deep.equal(queryParams);
-
-        queryParams['z'] = '12';
-        expect(converter.queryParams).to.be.deep.equal(queryParams);
-      });
-    });
-  </script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/app-route.html b/systrace/catapult/third_party/polymer/components/app-route/test/app-route.html
deleted file mode 100644
index da4af2c..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/app-route.html
+++ /dev/null
@@ -1,488 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>app-route</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../app-route.html">
-  <link rel="import" href="./redirection.html">
-</head>
-<body>
-  <test-fixture id="BasicRoute">
-    <template>
-      <app-route pattern='/user/:username'>
-      </app-route>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ChainedRoutes">
-    <template is="dom-template">
-      <app-route
-          pattern="/foo/:foo"
-          route="{{numberOneTopRoute}}"
-          data="{{fooData}}"
-          tail="{{fooRoute}}">
-      </app-route>
-
-      <app-route
-          pattern="/bar/:bar"
-          route="{{fooRoute}}"
-          data="{{barData}}">
-      </app-route>
-
-      <app-route
-          pattern="/baz/:baz"
-          route="{{fooRoute}}"
-          data="{{bazData}}">
-      </app-route>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="Redirection">
-    <template>
-      <redirect-app-route></redirect-app-route>
-    </template>
-  </test-fixture>
-
-<script>
-  'use strict';
-
-  function fixtureChainedRoutes(route) {
-    var routes = fixture('ChainedRoutes', {
-      numberOneTopRoute: {
-        path: route.path || '',
-        prefix: route.prefix || '',
-        __queryParams: route.__queryParams || {}
-      }
-    });
-
-    return {
-      foo: routes[0],
-      bar: routes[1],
-      baz: routes[2]
-    };
-  }
-
-  suite('<app-route>', function () {
-    var route;
-
-    setup(function() {
-      route = fixture('BasicRoute');
-
-      // This works around a bug in `dom-template` that is somehow
-      // exaserbated by the `app-route` implementation. A reduced test case
-      // is hard to come by. Track polymerelements/test-fixture#31 and remove
-      // this when that has been resolved:
-      var tmpl = document.querySelector('#ChainedRoutes').fixtureTemplates[0];
-      tmpl._parentProps = {};
-    });
-
-    test('it parses a path', function() {
-      route.route = {
-        prefix: '',
-        path: '/user/papyrus/details',
-        __queryParams: {}
-      }
-      expect(route.tail.prefix).to.be.equal('/user/papyrus');
-      expect(route.tail.path).to.be.equal('/details');
-      expect(route.data.username).to.be.equal('papyrus');
-    });
-
-    test('it bidirectionally maps changes between tail and route', function() {
-      route.route = {
-        prefix: '',
-        path: '/user/papyrus/details',
-        __queryParams: {}
-      };
-
-      route.set('tail.path', '/messages');
-      expect(route.route.path).to.be.deep.equal('/user/papyrus/messages');
-      route.set('route.path', '/user/toriel');
-      expect(route.tail).to.be.deep.equal({
-        prefix: '/user/toriel',
-        path: '',
-        __queryParams: {}
-      });
-    });
-
-    test('it creates data as described by pattern', function() {
-      route.route = {
-        prefix: '',
-        path: '/user/sans'
-      };
-
-      expect(route.data).to.be.deep.equal({username: 'sans'});
-      expect(route.active).to.be.equal(true);
-
-      route.pattern = '/user/:username/likes/:count';
-
-      // At the moment, we don't reset data when we no longer match.
-      expect(route.data).to.be.deep.equal({username: 'sans'});
-      expect(route.active).to.be.equal(false);
-
-      route.set('route.path', "/does/not/match");
-
-      expect(route.data).to.be.deep.equal({username: 'sans'});
-      expect(route.active).to.be.equal(false);
-
-      route.set('route.path', '/user/undyne/likes/20');
-      expect(route.data).to.be.deep.equal({username: 'undyne', count: '20'});
-      expect(route.active).to.be.equal(true);
-    });
-
-    test('changing data changes the path', function() {
-      route.route = {
-        prefix: '',
-        path: '/user/asgore'
-      };
-
-      expect(route.data).to.be.deep.equal({username: 'asgore'});
-      route.data = {username: 'toriel'};
-      expect(route.route.path).to.be.equal('/user/toriel');
-    });
-
-    suite('propagating data', function() {
-      test('data is empty if no routes in the tree have matched', function() {
-        var routes = fixtureChainedRoutes({ path: '' });
-
-        expect(routes.foo.data).to.be.eql({});
-        expect(routes.bar.data).to.be.eql({});
-        expect(routes.baz.data).to.be.eql({});
-      });
-
-      test('limits propagation to last matched route', function() {
-        var routes = fixtureChainedRoutes({ path: '/foo/123' });
-
-        expect(routes.foo.data).to.be.eql({ foo: '123' });
-        expect(routes.bar.data).to.be.eql({});
-        expect(routes.baz.data).to.be.eql({});
-      });
-
-      test('propagates data to matching chained routes', function() {
-        var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc' });
-
-        expect(routes.foo.data).to.be.eql({ foo: '123' });
-        expect(routes.bar.data).to.be.eql({ bar: 'abc' });
-        expect(routes.baz.data).to.be.eql({});
-      });
-
-      test('chained route state is untouched when deactivated', function() {
-        var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc' });
-
-        routes.foo.set('route.path', '/foo/321/baz/zyx');
-
-        expect(routes.foo.data).to.be.eql({ foo: '321' });
-        expect(routes.bar.data).to.be.eql({ bar: 'abc' });
-        expect(routes.baz.data).to.be.eql({ baz: 'zyx' });
-      });
-
-      suite('updating the global path', function() {
-        test('happens when data changes if the route is active', function() {
-          var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc' });
-
-          expect(routes.bar.active).to.be.eql(true);
-          routes.bar.set('data.bar', 'cba');
-          expect(routes.foo.route.path).to.be.eql('/foo/123/bar/cba');
-        });
-
-        test('ignores changes when the route is inactive', function() {
-          var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc' });
-
-          expect(routes.baz.active).to.be.eql(false);
-          routes.baz.set('data.baz', 'cba');
-          expect(routes.foo.route.path).to.be.eql('/foo/123/bar/abc');
-        });
-
-        test('ignores changes after a route deactives', function() {
-          var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc' });
-
-          routes.foo.set('route.path', '/foo/123/baz/zyx');
-
-          expect(routes.bar.active).to.be.eql(false);
-          expect(routes.baz.active).to.be.eql(true);
-          routes.bar.set('data.bar', 'cba');
-          expect(routes.foo.route.path).to.be.eql('/foo/123/baz/zyx');
-        });
-      });
-    });
-
-    suite('propagating query params', function() {
-      test('query params are empty if no routes match', function() {
-        var routes = fixtureChainedRoutes({ path: '', __queryParams: {
-          qux: 'zot'
-        }});
-        expect(routes.foo.queryParams).to.be.eql({});
-        expect(routes.bar.queryParams).to.be.eql({});
-        expect(routes.baz.queryParams).to.be.eql({});
-      });
-
-      test('updates query params for all matched routes', function() {
-        var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc', __queryParams: {
-          qux: 'zot'
-        }});
-        expect(routes.foo.queryParams).to.be.eql({ qux: 'zot' });
-        expect(routes.bar.queryParams).to.be.eql({ qux: 'zot' });
-        expect(routes.baz.queryParams).to.be.eql({});
-      });
-
-      test('retains query params after routes deactivate', function() {
-        var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc', __queryParams: {
-          qux: 'zot'
-        }});
-        routes.foo.set('route.path', '/foo/123/baz/xyz')
-        routes.foo.set('queryParams', {
-          qux: 'quux'
-        });
-        expect(routes.foo.queryParams).to.be.eql({ qux: 'quux' });
-        expect(routes.bar.queryParams).to.be.eql({ qux: 'zot' });
-        expect(routes.baz.queryParams).to.be.eql({ qux: 'quux' });
-      });
-
-      suite('updating global query params', function() {
-        test('happens when query params change on active routes', function() {
-          var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc', __queryParams: {
-            qux: 'zot'
-          }});
-
-          routes.bar.set('queryParams', { qux: 'quux' });
-
-          expect(routes.foo.queryParams).to.be.eql({ qux: 'quux' });
-          expect(routes.bar.queryParams).to.be.eql({ qux: 'quux' });
-          expect(routes.baz.queryParams).to.be.eql({});
-        });
-
-        test('updates are ignored for routes that are inactive', function() {
-          var routes = fixtureChainedRoutes({ path: '/foo/123/bar/abc', __queryParams: {
-            qux: 'zot'
-          }});
-
-          routes.baz.set('queryParams', { qux: 'quux' });
-
-          expect(routes.foo.queryParams).to.be.eql({ qux: 'zot' });
-          expect(routes.bar.queryParams).to.be.eql({ qux: 'zot' });
-          expect(routes.baz.queryParams).to.be.eql({ qux: 'quux' });
-        });
-
-        test('doesn\'t generate excess query-params-changed events', function() {
-          var routes = fixtureChainedRoutes({});
-          var appRoutes = [routes.foo, routes.bar, routes.baz];
-          var numChanges = 0;
-          for (var i = 0; i < appRoutes.length; i++) {
-            appRoutes[i].addEventListener('query-params-changed', function() {
-              numChanges++;
-            });
-          }
-
-          // Messing with paths but not query params shouldn't generate any
-          // change events.
-          expect(numChanges).to.be.equal(0);
-          routes.foo.set('route.path', '/foo/123/bar/456');
-          expect(numChanges).to.be.equal(0);
-          routes.foo.set('route.path', '/foo/456/baz/789');
-          expect(numChanges).to.be.equal(0);
-
-          // Changing queryParams here should update foo and baz
-          routes.foo.set('route.__queryParams', {key: 'value'});
-          expect(numChanges).to.be.equal(2);
-          // Then this should update bar
-          routes.foo.set('route.path', '/foo/123/bar/456');
-          expect(numChanges).to.be.equal(3);
-
-          // Changing back to baz shouldn't generate a change event.
-          routes.foo.set('route.path', '/foo/456/baz/789');
-          expect(numChanges).to.be.equal(3);
-
-          routes.foo.set('route.__queryParams', {});
-          expect(numChanges).to.be.equal(5);
-          routes.foo.set('route.path', '/foo/123/bar/456');
-          expect(numChanges).to.be.equal(6);
-
-        });
-      });
-    });
-
-    suite('handles reentrent changes to its properties', function() {
-      var initialUrl;
-      setup(function() {
-        initialUrl = window.location.href;
-      });
-
-      teardown(function() {
-        window.history.replaceState({}, '', initialUrl);
-      });
-
-      test('changing path in response to path changing', function() {
-        var r = fixture('Redirection');
-        r.addEventListener('route-changed', function() {
-          r.set('route.path', '/bar/baz');
-        });
-        r.set('route.path', '/foo');
-        expect(window.location.pathname).to.be.equal('/bar/baz');
-        expect(r.data).to.be.deep.equal({page: 'bar'});
-        expect(r.route.path).to.be.equal('/bar/baz');
-        expect(r.tail.path).to.be.equal('/baz');
-      });
-
-      test('changing data wholesale in response to path changing', function() {
-        var r = fixture('Redirection');
-        r.set('data.page', 'bar');
-        r.addEventListener('route-changed', function(e) {
-          if (e.detail.path === 'route.path' && r.route.path === '/foo/baz') {
-            r.data = {page: 'bar'};
-          }
-        });
-        r.set('route.path', '/foo/baz');
-        expect(window.location.pathname).to.be.equal('/bar');
-        expect(r.data).to.be.deep.equal({page: 'bar'});
-        expect(r.route.path).to.be.equal('/bar');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing a data piece in response to path changing', function() {
-        var r = fixture('Redirection');
-        r.set('data.page', 'bar');
-        r.addEventListener('route-changed', function(e) {
-          r.set('data.page', 'bar');
-        });
-        r.set('route.path', '/foo/baz');
-        expect(window.location.pathname).to.be.equal('/bar');
-        expect(r.data).to.be.deep.equal({page: 'bar'});
-        expect(r.route.path).to.be.equal('/bar');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing the tail in response to path changing', function() {
-        var r = fixture('Redirection');
-        r.addEventListener('route-changed', function() {
-          r.set('tail.path', '/bar');
-        });
-        r.set('route.path', '/foo');
-        expect(window.location.pathname).to.be.equal('/foo/bar');
-        expect(r.data).to.be.deep.equal({page: 'foo'});
-        expect(r.route.path).to.be.equal('/foo/bar');
-        expect(r.tail.path).to.be.equal('/bar');
-
-        r.set('route.path', '/foo/baz');
-        expect(window.location.pathname).to.be.equal('/foo/bar');
-        expect(r.data).to.be.deep.equal({page: 'foo'});
-        expect(r.route.path).to.be.equal('/foo/bar');
-        expect(r.tail.path).to.be.equal('/bar');
-      });
-
-      test('changing the path in response to data changing', function() {
-        var r = fixture('Redirection');
-        r.addEventListener('data-changed', function() {
-          r.set('route.path', '/bar');
-        });
-        r.set('data', {page: 'foo'});
-        expect(window.location.pathname).to.be.equal('/bar');
-        expect(r.data).to.be.deep.equal({page: 'bar'});
-        expect(r.route.path).to.be.equal('/bar');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing data in response to data changing', function() {
-        var r = fixture('Redirection');
-        r.addEventListener('data-changed', function() {
-          r.set('data.page', 'bar');
-        });
-        r.set('data', {page: 'foo'});
-        expect(window.location.pathname).to.be.equal('/bar');
-        expect(r.data).to.be.deep.equal({page: 'bar'});
-        expect(r.route.path).to.be.equal('/bar');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing the data object wholesale in response to data changing', function() {
-        var r = fixture('Redirection');
-        r.addEventListener('data-changed', function() {
-          if (r.data.page == 'foo') {
-            r.set('data', {page: 'bar'});
-          }
-        });
-        r.set('data', {page: 'foo'});
-        expect(window.location.pathname).to.be.equal('/bar');
-        expect(r.data).to.be.deep.equal({page: 'bar'});
-        expect(r.route.path).to.be.equal('/bar');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing the tail in response to data changing', function() {
-        var r = fixture('Redirection');
-        r.addEventListener('data-changed', function() {
-          r.set('tail.path', '/bar');
-        });
-        r.set('data', {page: 'foo'});
-        expect(window.location.pathname).to.be.equal('/foo/bar');
-        expect(r.data).to.be.deep.equal({page: 'foo'});
-        expect(r.route.path).to.be.equal('/foo/bar');
-        expect(r.tail.path).to.be.equal('/bar');
-      });
-
-      test('changing the path in response to tail changing', function() {
-        var r = fixture('Redirection');
-        r.set('route.path', '/foo/');
-        r.addEventListener('tail-changed', function() {
-          r.set('route.path', '/baz' + r.tail.path);
-        });
-        r.set('tail.path', '/bar');
-        expect(window.location.pathname).to.be.equal('/baz/bar');
-        expect(r.data).to.be.deep.equal({page: 'baz'});
-        expect(r.route.path).to.be.equal('/baz/bar');
-        expect(r.tail.path).to.be.equal('/bar');
-      });
-
-      test('changing the data in response to tail changing', function() {
-        var r = fixture('Redirection');
-        r.set('route.path', '/foo/');
-        r.addEventListener('tail-changed', function() {
-          r.set('data.page', 'baz');
-        });
-        r.set('tail.path', '/bar');
-        expect(window.location.pathname).to.be.equal('/baz');
-        expect(r.data).to.be.deep.equal({page: 'baz'});
-        expect(r.route.path).to.be.equal('/baz');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing the data object wholesale in response to tail changing', function() {
-        var r = fixture('Redirection');
-        r.set('route.path', '/foo/');
-        r.addEventListener('tail-changed', function() {
-          r.set('data', {page: 'baz'});
-        });
-        r.set('tail.path', '/bar');
-        expect(window.location.pathname).to.be.equal('/baz');
-        expect(r.data).to.be.deep.equal({page: 'baz'});
-        expect(r.route.path).to.be.equal('/baz');
-        expect(r.tail.path).to.be.equal('');
-      });
-
-      test('changing the tail in response to tail changing', function() {
-        var r = fixture('Redirection');
-        r.set('route.path', '/foo/');
-        r.addEventListener('tail-changed', function() {
-          r.set('tail.path', '/baz');
-        });
-        r.set('tail.path', '/bar');
-        expect(window.location.pathname).to.be.equal('/foo/baz');
-        expect(r.data).to.be.deep.equal({page: 'foo'});
-        expect(r.route.path).to.be.equal('/foo/baz');
-        expect(r.tail.path).to.be.equal('/baz');
-      });
-    });
-  });
-</script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/index.html b/systrace/catapult/third_party/polymer/components/app-route/test/index.html
deleted file mode 100644
index f82b1f3..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <meta charset="utf-8">
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'app-route-converter.html',
-        'app-route.html',
-        'app-location.html',
-        'test-observer-app.html',
-        'test-app-example-1.html',
-
-      ]);
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/observer-tester.html b/systrace/catapult/third_party/polymer/components/app-route/test/observer-tester.html
deleted file mode 100644
index 95c4b22..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/observer-tester.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-  <link rel='import' href='../app-route.html'>
-  <link rel='import' href='../app-location.html'>
-
-
-
-  <dom-module id="observer-tester">
-    <template>
-      <app-location route="{{route}}"></app-location>
-      <app-route
-        route="{{route}}"
-        pattern="/report/:id"
-        data="{{data}}"
-        active="{{active}}"></app-route>
-    </template>
-    <script>
-      Polymer({
-        is: 'observer-tester',
-        properties: {
-          route: {
-            type: Object,
-            notify:true
-          },
-          data: {
-            type: Object,
-            notify: true
-          },
-          active: {
-            type: Boolean,
-            value: false,
-            observer: 'checkActive'
-          }
-        },
-        checkActive: function(active) {
-          var x = 1;
-        }
-      });
-    </script>
-  </dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/redirection.html b/systrace/catapult/third_party/polymer/components/app-route/test/redirection.html
deleted file mode 100644
index 020c9a8..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/redirection.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../app-location.html">
-<link rel="import" href="../app-route.html">
-
-<!--
- There are three relevant factors to route.path, and when any one of them
- changes we want to support synchronously updating any of the others.
--->
-
-<dom-module id='redirect-app-route'>
-  <template>
-    <app-location route='{{route}}'>
-    </app-location>
-    <app-route route='{{route}}' pattern="/:page" data="{{data}}" tail="{{tail}}">
-    </app-route>
-  </template>
-  <script>
-    Polymer({
-      is: 'redirect-app-route',
-      properties: {
-        route: {
-          notify: true
-        },
-        data: {
-          type: Object,
-          notify: true
-        },
-        tail: {
-          notify: true
-        },
-      },
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/test-app-example-1.html b/systrace/catapult/third_party/polymer/components/app-route/test/test-app-example-1.html
deleted file mode 100644
index 29b8104..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/test-app-example-1.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>app-route</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="./app-example-1.html">
-</head>
-<body>
-  <test-fixture id="ExampleApp">
-    <template>
-      <app-example-1></app-example-1>
-    </template>
-  </test-fixture>
-<script>
-  'use strict';
-
-  function setLocation(url) {
-    window.history.pushState({}, '', url);
-    Polymer.Base.fire('location-changed', {}, { node: window });
-  }
-
-  suite('<test-app-example-1>', function () {
-    var originalLocation;
-    var exampleApp;
-
-    setup(function() {
-      originalLocation = window.location.href;
-      exampleApp = fixture('ExampleApp');
-    });
-
-    teardown(function() {
-      window.history.replaceState({}, '', originalLocation);
-    });
-
-    test('runs through basic usage', function() {
-      // Navigate to /lol
-      setLocation('/lol');
-
-      expect(exampleApp.data).to.be.deep.eq({
-        page: 'lol'
-      });
-      expect(exampleApp.userData).to.be.deep.eq({
-      });
-      expect(exampleApp.route).to.be.deep.eq({
-        prefix: '',
-        path: '/lol',
-        __queryParams: {}
-      });
-      expect(exampleApp.userRoute).to.be.deep.eq({
-        prefix: null,
-        path: null,
-        __queryParams: {}
-      });
-      expect(window.location.pathname).to.be.equal('/lol');
-
-      // Navigate to /user
-      setLocation('/user');
-      expect(exampleApp.data).to.be.deep.eq({
-        page: 'user'
-      });
-
-      // We should have redirected to /user/view because of a redirect in
-      // the example app code.
-      expect(exampleApp.route).to.be.deep.eq({
-        prefix: '',
-        path: '/user/view',
-        __queryParams: {}
-      });
-      expect(exampleApp.userRoute).to.be.deep.eq({
-        prefix: '/user',
-        path: '/view',
-        __queryParams: {}
-      });
-      expect(window.location.pathname).to.be.equal('/user/view');
-
-      // Navigate to /user/details
-      setLocation('/user/details');
-      expect(exampleApp.data).to.be.deep.eq({
-        page: 'user'
-      });
-      expect(exampleApp.userData).to.be.deep.eq({
-        page: 'details'
-      });
-      expect(exampleApp.route).to.be.deep.eq({
-        prefix: '',
-        path: '/user/details',
-        __queryParams: {}
-      });
-      expect(exampleApp.userRoute).to.be.deep.eq({
-        prefix: '/user',
-        path: '/details',
-        __queryParams: {}
-      });
-      expect(window.location.pathname).to.be.equal('/user/details');
-
-      exampleApp.set('data.page', 'redirectToUser');
-      expect(window.location.pathname).to.be.equal('/user/view');
-
-      // This triggers two redirects in a row!
-      setLocation('/redirectToUser');
-      expect(window.location.pathname).to.be.equal('/user/view');
-
-      // Data binding changes to a different user subpage.
-      exampleApp.set('userData.page', 'profile');
-      expect(window.location.pathname).to.be.eq('/user/profile');
-
-      // Data binding changes to the aunt of the current page.
-      exampleApp.set('data.page', 'feed');
-      expect(window.location.pathname).to.be.eq('/feed');
-
-      setLocation('/user/etc');
-      exampleApp.set('userData.page', 'details');
-      expect(window.location.pathname).to.be.eq('/user/details')
-
-      expect(window.location.search).to.be.eq('');
-      exampleApp.set('userQueryParams.foo', 'bar');
-      expect(window.location.search).to.be.eq('?foo=bar');
-
-      exampleApp.userQueryParams = {bar: 'baz'};
-      expect(window.location.search).to.be.eq('?bar=baz');
-    });
-  });
-</script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/app-route/test/test-observer-app.html b/systrace/catapult/third_party/polymer/components/app-route/test/test-observer-app.html
deleted file mode 100644
index d2bcf07..0000000
--- a/systrace/catapult/third_party/polymer/components/app-route/test/test-observer-app.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>app-route 0bserver Test</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="./observer-tester.html">
-
-</head>
-<body>
-
-  <test-fixture id="observer_app">
-    <template>
-      <observer-tester id="testel"></observer-tester>
-    </template>
-  </test-fixture>
-  <script>
-  'use strict';
-    function setLocation(url) {
-      window.history.pushState({}, '', url);
-      Polymer.Base.fire('location-changed', {}, { node: window });
-    }
-
-
-    suite('observe app-route active changes', function(){
-      var originalLocation;
-      var sandbox, el;
-      setup(function(){
-        originalLocation = window.location.href;
-        sandbox = sinon.sandbox.create();
-        el = fixture('observer_app');
-     });
-      teardown(function(){
-        sandbox.restore();
-        window.history.replaceState({}, '', originalLocation);
-      });
-
-      test('observer should fire when route selected', function(){
-        sandbox.spy(el,'checkActive');
-        setLocation('/report/1000');
-        expect(el.checkActive).to.have.been.called.once;
-        expect(el.checkActive).to.have.been.calledWith(true);
-      });
-      test('observer should fire when route deselected',function(){
-        setLocation('/report/1000');
-        sandbox.spy(el,'checkActive');
-        setLocation('/menu');
-        expect(el.checkActive).to.have.been.called.once;
-        expect(el.checkActive).to.have.been.calledWith(false);
-      });
-    });
-  </script>
-</body>
-
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/README.md b/systrace/catapult/third_party/polymer/components/core-tooltip/README.md
deleted file mode 100644
index 22d55c1..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-core-tooltip
-============
-
-See the [component page](http://polymer-project.org/docs/elements/core-elements.html#core-tooltip) for more information.
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/bower.json b/systrace/catapult/third_party/polymer/components/core-tooltip/bower.json
deleted file mode 100644
index 9f11644..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/bower.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "name": "core-tooltip",
-  "private": true,
-  "description": "Tooltip popup for content",
-  "dependencies": {
-    "polymer": "Polymer/polymer#^0.5",
-    "core-focusable": "Polymer/core-focusable#^0.5",
-    "core-icon-button": "Polymer/core-icon-button#^0.5",
-    "paper-fab": "Polymer/paper-fab#^0.5",
-    "core-resizable": "Polymer/core-resizable#^0.5"
-  },
-  "version": "0.5.5"
-}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/core-tooltip.css b/systrace/catapult/third_party/polymer/components/core-tooltip/core-tooltip.css
deleted file mode 100644
index aa24c39..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/core-tooltip.css
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */
-
-:host {
-  box-sizing: border-box;
-  position: relative;
-  display: inline-block;
-  outline: none;
-}
-
-:host(:hover:not([disabled])) .core-tooltip {
-  visibility: visible !important;
-}
-
-:host([focused]) .core-tooltip {
-  visibility: visible !important;
-}
-
-.core-tooltip:not(.show) {
-  visibility: hidden;
-}
-
-.core-tooltip {
-  position: absolute;
-  font-size: 10px;
-  font-weight: 500;
-  padding: 8px;
-  color: white;
-  background-color: rgba(0, 0, 0, 0.9);
-  box-sizing: border-box;
-  border-radius: 3px; /* TODO: not in spec. */
-  white-space: nowrap;
-  line-height: 6px;
-  z-index: 1002; /* TODO: this is brittle. */
-  -webkit-user-select: none;
-  user-select: none;
-}
-
-:host([large]) .core-tooltip {
-  line-height: 14px;
-  font-size: 14px;
-  padding: 16px;
-}
-
-.core-tooltip.noarrow::after {
-  display: none;
-}
-
-.core-tooltip::after {
-  position: absolute;
-  border: solid transparent;
-  content: '';
-  height: 0;
-  width: 0;
-  border-width: 4px;
-}
-
-.top {
-  margin-bottom: 10px; /* TODO: not specified in spec */
-  bottom: 100%;
-}
-
-.right {
-  margin-left: 10px; /* TODO: not specified in spec */
-  left: 100%;
-}
-
-.bottom {
-  top: 100%;
-  margin-top: 10px; /* TODO: not specified in spec */
-}
-
-.left {
-  margin-right: 10px; /* TODO: not specified in spec */
-  right: 100%;
-}
-
-.core-tooltip.bottom::after {
-  bottom: 100%;
-  left: calc(50% - 4px);
-  border-bottom-color: rgba(0,0,0,0.8);
-}
-
-.core-tooltip.left::after {
-  left: 100%;
-  top: calc(50% - 4px);
-  border-left-color: rgba(0,0,0,0.8);
-}
-
-.core-tooltip.top::after {
-  top: 100%;
-  left: calc(50% - 4px);
-  border-top-color: rgba(0,0,0,0.8);
-}
-
-.core-tooltip.right::after {
-  right: 100%;
-  top: calc(50% - 4px);
-  border-right-color: rgba(0,0,0,0.8);
-}
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/core-tooltip.html b/systrace/catapult/third_party/polymer/components/core-tooltip/core-tooltip.html
deleted file mode 100644
index 634be46..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/core-tooltip.html
+++ /dev/null
@@ -1,217 +0,0 @@
-<!--
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<!--
-The `core-tooltip` element creates a hover tooltip centered for the content
-it contains. It can be positioned on the top|bottom|left|right of content using
-the `position` attribute.
-
-To include HTML in the tooltip, include the `tip` attribute on the relevant
-content.
-
-<b>Example</b>:
-
-    <core-tooltip label="I'm a tooltip">
-      <span>Hover over me.</span>
-    </core-tooltip>
-
-<b>Example</b> - positioning the tooltip to the right:
-
-    <core-tooltip label="I'm a tooltip to the right" position="right">
-      <core-icon-button icon="drawer"></core-icon-button>
-    </core-tooltip>
-
-<b>Example</b> - no arrow and showing by default:
-
-    <core-tooltip label="Tooltip with no arrow and always on" noarrow show>
-      <img src="image.jpg">
-    </core-tooltip>
-
-<b>Example</b> - disable the tooltip.
-
-    <core-tooltip label="Disabled label never shows" disabled>
-      ...
-    </core-tooltip>
-
-<b>Example</b> - rich tooltip using the `tip` attribute:
-
-    <core-tooltip>
-      <div>Example of a rich information tooltip</div>
-      <div tip>
-        <img src="profile.jpg">Foo <b>Bar</b> - <a href="#">@baz</a>
-      </div>
-    </core-tooltip>
-
-By default, the `tip` attribute specifies the HTML content for a rich tooltip.
-You can customize this attribute with the `tipAttribute` attribute:
-
-    <core-tooltip tipAttribute="htmltooltip">
-      <div>Example of a rich information tooltip</div>
-      <div htmltooltip>
-        ...
-      </div>
-    </core-tooltip>
-
-@group Polymer Core Elements
-@element core-tooltip
-@mixins Polymer.CoreFocusable https://github.com/polymer/core-focusable
-@mixins Polymer.CoreResizable https://github.com/polymer/core-resizable
-@homepage http://www.polymer-project.org/components/core-tooltip/index.html
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../core-focusable/core-focusable.html">
-<link rel="import" href="../core-resizable/core-resizable.html">
-
-<!-- TODO: would be nice to inherit from label to get .htmlFor, and .control,
-           but the latter is readonly. -->
-<!-- TODO: support off center arrows. -->
-<!-- TODO: detect mobile and apply the .large class, instead of manual
-           control. -->
-<!-- TODO: possibly reuse core-overlay. -->
-<polymer-element name="core-tooltip" attributes="noarrow position label show tipAttribute" role="tooltip" tabindex="0">
-<template>
-  <link rel="stylesheet" href="core-tooltip.css">
-
-  <div id="tooltip" hidden?="{{!hasTooltipContent}}"
-       class="core-tooltip {{position}} {{ {noarrow: noarrow, show: show && !disabled} | tokenList}}">
-    <content id="c" select="[{{tipAttribute}}]">{{label}}</content>
-  </div>
-
-  <content></content>
-
-</template>
-<script>
-(function() {
-
-  var proto = {
-
-      /**
-       * A simple string label for the tooltip to display. To display a rich
-       * HTML tooltip instead, omit `label` and include the `tip` attribute
-       * on a child node of `core-tooltip`.
-       *
-       * @attribute label
-       * @type string
-       * @default null
-       */
-      label: null,
-
-      eventDelegates: {
-        'core-resize': 'positionChanged'
-      },
-
-      computed: {
-        // Indicates whether the tooltip has a set label propety or
-        // an element with the `tip` attribute.
-        hasTooltipContent: 'label || !!tipElement'
-      },
-
-      publish: {
-        /**
-         * Forces the tooltip to display. If `disabled` is set, this property is ignored.
-         *
-         * @attribute show
-         * @type boolean
-         * @default false
-         */
-        show: {value: false, reflect: true},
-
-        /**
-         * Positions the tooltip to the top, right, bottom, left of its content.
-         *
-         * @attribute position
-         * @type string
-         * @default 'bottom'
-         */
-        position: {value: 'bottom', reflect: true},
-
-        /**
-         * If true, the tooltip an arrow pointing towards the content.
-         *
-         * @attribute noarrow
-         * @type boolean
-         * @default false
-         */
-        noarrow: {value: false, reflect: true}
-      },
-
-      /**
-       * Customizes the attribute used to specify which content
-       * is the rich HTML tooltip.
-       *
-       * @attribute tipAttribute
-       * @type string
-       * @default 'tip'
-       */
-      tipAttribute: 'tip',
-
-      attached: function() {
-        this.updatedChildren();
-        this.resizableAttachedHandler();
-      },
-
-      detached: function() {
-        this.resizableDetachedHandler();
-      },
-
-      updatedChildren: function () {
-        this.tipElement = null;
-
-        for (var i = 0, el; el = this.$.c.getDistributedNodes()[i]; ++i) {
-          if (el.hasAttribute && el.hasAttribute(this.tipAttribute)) {
-            this.tipElement = el;
-            break;
-          }
-        }
-
-        // Job ensures we're not double calling setPosition() on DOM attach.
-        this.job('positionJob', this.setPosition);
-
-        // Monitor children to re-position tooltip when light dom changes.
-        this.onMutation(this, this.updatedChildren);
-      },
-
-      labelChanged: function(oldVal, newVal) {
-        this.job('positionJob', this.setPosition);
-      },
-
-      positionChanged: function(oldVal, newVal) {
-        this.job('positionJob', this.setPosition);
-      },
-
-      setPosition: function() {
-        var controlWidth = this.clientWidth;
-        var controlHeight = this.clientHeight;
-        var toolTipWidth = this.$.tooltip.clientWidth;
-        var toolTipHeight = this.$.tooltip.clientHeight;
-
-        switch (this.position) {
-          case 'top':
-          case 'bottom':
-            this.$.tooltip.style.left = (controlWidth - toolTipWidth) / 2 + 'px';
-            this.$.tooltip.style.top = null;
-            break;
-          case 'left':
-          case 'right':
-            this.$.tooltip.style.left = null;
-            this.$.tooltip.style.top = (controlHeight - toolTipHeight) / 2 + 'px';
-            break;
-        }
-      }
-
-    };
-
-    Polymer.mixin2(proto, Polymer.CoreFocusable);
-    Polymer.mixin(proto, Polymer.CoreResizable);
-    Polymer(proto);
-  })();
-
-</script>
-</polymer-element>
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/demo.html b/systrace/catapult/third_party/polymer/components/core-tooltip/demo.html
deleted file mode 100644
index 7ea6aea..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/demo.html
+++ /dev/null
@@ -1,211 +0,0 @@
-<!--
-    @license
-    Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-    Code distributed by Google as part of the polymer project is also
-    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!doctype html>
-<html lang="en">
-<head>
-
-  <meta charset="utf-8">
-  <title>Core Tooltip</title>
-
-  <script src="../webcomponentsjs/webcomponents.js"></script>
-
-  <link rel="import" href="../core-icon-button/core-icon-button.html">
-  <link rel="import" href="../paper-fab/paper-fab.html">
-  <link rel="import" href="core-tooltip.html">
-
-  <style>
-    body {
-      font-family: "Open Sans", sans-serif;
-      font-weight: 300;
-      padding: 24px;
-    }
-
-    .example {
-      margin: 35px 15px;
-    }
-
-    .example > * {
-      margin: 0 15px;
-    }
-
-    .fakebutton {
-      box-shadow: 0 0 3px #aaa inset;
-      border-radius: 3px;
-      padding: 7px 5px;
-    }
-    .fakebutton:hover {
-      background-color: white;
-    }
-
-    img {
-      width: 400px;
-      height: 150px;
-      object-fit: cover;
-    }
-
-    img.large {
-      border: 15px solid white;
-      box-sizing: border-box;
-    }
-
-    .profile {
-      width: 60px;
-      height: auto;
-      border-radius: 50%;
-      vertical-align: middle;
-    }
-
-    a {
-      color: currentcolor;
-      text-decoration: none;
-    }
-
-    .rich {
-      background: hotpink;
-      color: white;
-      padding:20px;
-      border-radius: 5px;
-    }
-
-  </style>
-
-  <style shim-shadowdom>
-    core-tooltip.fancy::shadow .core-tooltip {
-      opacity: 0;
-      -webkit-transition: all 300ms cubic-bezier(0,1.92,.99,1.07);
-      transition: all 300ms cubic-bezier(0,1.92,.99,1.07);
-      -webkit-transform: translate3d(0, -10px, 0);
-      transform: translate3d(0, -10px, 0);
-    }
-
-    core-tooltip.fancy:hover::shadow .core-tooltip,
-    core-tooltip.fancy:focus::shadow .core-tooltip {
-      opacity: 1;
-      -webkit-transform: translate3d(0, 0, 0);
-      transform: translate3d(0, 0, 0);
-    }
-  </style>
-
-</head>
-<body unresolved>
-
-  <article>
-
-      <button>Toggle all</button>
-
-      <section class="small" layout horizontal center-center>
-
-        <div class="example">
-
-          <core-tooltip label='position="left"' position="left">
-            <core-icon-button icon="drawer"></core-icon-button>
-          </core-tooltip>
-
-          <core-tooltip label='position="top"' position="top">
-            <core-icon-button icon="drawer"></core-icon-button>
-          </core-tooltip>
-
-          <core-tooltip label='position="bottom"' position="bottom">
-            <core-icon-button icon="drawer"></core-icon-button>
-          </core-tooltip>
-
-          <core-tooltip label='position="right"' position="right">
-            <core-icon-button icon="drawer"></core-icon-button>
-          </core-tooltip>
-
-        </div>
-
-        <div class="example">
-
-          <core-tooltip label="Fancy effect" class="fancy">
-            <paper-fab icon="add"></paper-fab>
-          </core-tooltip>
-
-        </div>
-
-      </section>
-
-      <section layout horizontal center-center>
-
-        <div class="example">
-
-          <core-tooltip>
-            <div class="rich">Rich tooltip with HTML</div>
-            <div tip>
-              <img src="https://pbs.twimg.com/profile_images/378800000548263523/c110b0a4c3e3e4d3dcce1d2020f3eded.jpeg
-        " class="profile" style="width: 40px;margin-right: 8px;">Eric <b>Bidelman</b> - <a href="#">@ebidel</a></div>
-          </core-tooltip>
-
-        </div>
-
-        <div class="example">
-
-          <core-tooltip label="<core-tooltip large>" large>
-            Larger tooltips for mobile
-          </core-tooltip>
-
-        </div>
-
-        <div class="example">
-
-          <core-tooltip label="disabled" disabled>
-            Disabled Tooltip
-          </core-tooltip>
-
-        </div>
-
-      </section>
-
-      <section layout horizontal center-center>
-
-        <div class="example">
-
-          <core-tooltip label="Tooltip with no arrow and always on: <core-tooltip noarrow show>" position="bottom" noarrow show>
-            <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/building.jpg" class="large">
-          </core-tooltip>
-
-        </div>
-
-      </section>
-
-      <section layout horizontal center-center>
-
-        <div class="example">
-
-          <core-tooltip id="dynamic" show>
-            Tooltips are only shown (on hover) when a label is set<br> or a html rich snippet is given. &rarr;
-          </core-tooltip>
-          <button id="fillbutton">Fill tooltip</button>
-
-        </div>
-
-      </section>
-
-  </article>
-
-<script>
-  document.querySelector('button').addEventListener('click', function(e) {
-    var tooltips = document.querySelectorAll('core-tooltip');
-    Array.prototype.forEach.call(tooltips, function(tooltip) {
-      tooltip.show = !tooltip.show;
-    });
-  });
-
-  document.querySelector('#fillbutton').addEventListener('click', function(e) {
-    e.stopPropagation();
-
-    var el = document.querySelector('#dynamic');
-    el.insertAdjacentHTML('beforeend', '<div tip><b>See</b>. Told ya so!</div>');
-
-  });
-</script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/index.html b/systrace/catapult/third_party/polymer/components/core-tooltip/index.html
deleted file mode 100644
index cdf5808..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!doctype html>
-<!--
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
-The complete set of authors may be found at http://polymer.github.io/AUTHORS
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <script src="../webcomponentsjs/webcomponents.js"></script>
-  <link rel="import" href="../core-component-page/core-component-page.html">
-
-</head>
-<body unresolved>
-
-  <core-component-page></core-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/core-tooltip/metadata.html b/systrace/catapult/third_party/polymer/components/core-tooltip/metadata.html
deleted file mode 100644
index ffcf73a..0000000
--- a/systrace/catapult/third_party/polymer/components/core-tooltip/metadata.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-    @license
-    Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-    Code distributed by Google as part of the polymer project is also
-    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<x-meta id="core-tooltip" label="Tooltip" group="Core">
-  <template>
-    <core-tooltip label="I'm a tooltip">
-      <span>Hover over me.</span>
-    </core-tooltip>
-  </template>
-  <template id="imports">
-    <link rel="import" href="core-tooltip.html">
-  </template>
-</x-meta>
-
diff --git a/systrace/catapult/third_party/polymer/components/font-roboto/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/font-roboto/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/font-roboto/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/font-roboto/README.md b/systrace/catapult/third_party/polymer/components/font-roboto/README.md
deleted file mode 100644
index 61c6394..0000000
--- a/systrace/catapult/third_party/polymer/components/font-roboto/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# font-roboto
diff --git a/systrace/catapult/third_party/polymer/components/font-roboto/bower.json b/systrace/catapult/third_party/polymer/components/font-roboto/bower.json
deleted file mode 100644
index 7099d7f..0000000
--- a/systrace/catapult/third_party/polymer/components/font-roboto/bower.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "name": "font-roboto",
-  "version": "1.0.3",
-  "description": "An HTML import for Roboto",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "font",
-    "roboto"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/font-roboto.git"
-  },
-  "main": "roboto.html",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/font-roboto/",
-  "ignore": [
-    "/.*"
-  ]
-}
diff --git a/systrace/catapult/third_party/polymer/components/font-roboto/package.json b/systrace/catapult/third_party/polymer/components/font-roboto/package.json
deleted file mode 100644
index f02f2fb..0000000
--- a/systrace/catapult/third_party/polymer/components/font-roboto/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "@polymerelements/font-roboto",
-  "version": "1.0.1",
-  "description": "An HTML import for Roboto",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "font",
-    "roboto"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/font-roboto.git"
-  },
-  "main": "roboto.html",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/font-roboto/"
-}
diff --git a/systrace/catapult/third_party/polymer/components/font-roboto/roboto.html b/systrace/catapult/third_party/polymer/components/font-roboto/roboto.html
deleted file mode 100644
index 417ee18..0000000
--- a/systrace/catapult/third_party/polymer/components/font-roboto/roboto.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,700|Roboto:400,300,300italic,400italic,500,500italic,700,700italic" crossorigin="anonymous">
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/LICENSE b/systrace/catapult/third_party/polymer/components/google-apis/LICENSE
deleted file mode 100644
index 3dde500..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2015 Google 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
-
-    https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT 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/systrace/catapult/third_party/polymer/components/google-apis/README.md b/systrace/catapult/third_party/polymer/components/google-apis/README.md
deleted file mode 100644
index dd9268c..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-google-apis
-===========
-
-See https://elements.polymer-project.org/elements/google-apis
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/bower.json b/systrace/catapult/third_party/polymer/components/google-apis/bower.json
deleted file mode 100644
index 295bb36..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/bower.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "google-apis",
-  "version": "2.0.0",
-  "description": "Web components to load Google API libraries",
-  "homepage": "https://elements.polymer-project.org/elements/google-apis?active=google-js-api",
-  "main": "google-apis.html",
-  "authors": [
-    "Scott Miles <sjmiles@google.com>",
-    "Eric Bidelman <ebidel@gmail.com>"
-  ],
-  "license": "Apache-2.0",
-  "ignore": [
-    "/.*",
-    "/test/"
-  ],
-  "keywords": [
-    "web-component",
-    "web-components",
-    "polymer",
-    "google",
-    "apis"
-  ],
-  "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2",
-    "iron-jsonp-library": "PolymerElements/iron-jsonp-library#1 - 2"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "polymer": "Polymer/polymer#^1.0.0",
-        "iron-jsonp-library": "PolymerElements/iron-jsonp-library#^1.0.0"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
-      },
-      "resolutions": {
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/demo/index.html b/systrace/catapult/third_party/polymer/components/google-apis/demo/index.html
deleted file mode 100644
index 0455cbb..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/demo/index.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<!-- Copyright (c) 2015 Google Inc. All rights reserved. -->
-<html>
-<head>
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>google-apis Demo</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../google-apis.html">
-</head>
-<body>
-  <div id="messages"></div>
-
-  <dom-bind id="bind">
-    <template id="t" is="dom-bind">
-
-      <google-client-loader id="shortener"
-        name="urlshortener"
-        version="v1"
-        on-google-api-load="loadedShortener"></google-client-loader>
-      <google-js-api on-js-api-load="loaded"></google-js-api>
-      <google-plusone-api on-api-load="loaded"></google-plusone-api>
-      <google-realtime-api on-api-load="loaded"></google-realtime-api>
-      <google-maps-api on-api-load="loaded"></google-maps-api>
-      <google-youtube-api on-api-load="loaded"></google-youtube-api>
-      <google-legacy-loader on-api-load="loaded"></google-legacy-loader>
-
-    </template>
-  </dom-bind>
-  <script>
-    // polymer 1.x compatibility
-    t.loadedShortener = function(event) {
-      var request = event.target.api.url.get({
-        shortUrl: 'http://goo.gl/fbsS'
-      })
-      request.execute(function(resp) {
-        console.log(resp);
-      });
-    }
-
-    t.loaded = function(e) {
-      document.querySelector('#messages').innerHTML +=
-        e.target.localName + ' loaded' + '<br>';
-      console.log(e.target.localName + ' loaded', event.target.api);
-    }
-
-    // Polymer 2.0 compatibility
-    bind.loadedShortener = t.loadedShortener;
-    bind.loaded = t.loaded;
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-apis.html b/systrace/catapult/third_party/polymer/components/google-apis/google-apis.html
deleted file mode 100644
index 29f9883..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-apis.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<!-- Load all Google APIs, for backwards compatibility -->
-<link rel="import" href="google-client-loader.html">
-<link rel="import" href="google-legacy-loader.html">
-<link rel="import" href="google-maps-api.html">
-<link rel="import" href="google-plusone-api.html">
-<link rel="import" href="google-realtime-api.html">
-<link rel="import" href="google-youtube-api.html">
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-client-loader.html b/systrace/catapult/third_party/polymer/components/google-apis/google-client-loader.html
deleted file mode 100644
index 0257a86..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-client-loader.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="google-js-api.html">
-
-<!--
-Element for loading a specific client Google API with the JavaScript client library.
-
-For loading `gapi.client` libraries
-
-##### Example
-
-    <google-client-loader id="shortener"
-      name="urlshortener"
-      version="v1"></google-client-loader>
-
-    <script>
-      var shortener = document.getElementById('shortener');
-      shortener.addEventListener('google-api-load', function(event) {
-        var request = shortener.api.url.get({
-           shortUrl: 'http://goo.gl/fbsS'
-        });
-        request.execute(function(resp) {
-          console.log(resp);
-        });
-      });
-    </script>
-
-@demo
--->
-
-<script>
-  (function() {
-    'use strict';
-
-    // Stores whether the API client is done loading.
-    var _clientLoaded = false;
-
-    // Loaders and loading statuses for all APIs, indexed by API name.
-    // This helps prevent multiple loading requests being fired at the same time
-    // by multiple google-api-loader elements.
-    var _statuses = {};
-    var _loaders = {};
-
-    Polymer({
-
-      is: 'google-client-loader',
-
-      /**
-       * Fired when the requested API is loaded. Override this name
-       * by setting `successEventName`.
-       * @event google-api-load
-       */
-
-      /**
-       * Fired if an error occurs while loading the requested API. Override this name
-       * by setting `errorEventName`.
-       * @event google-api-load-error
-       */
-
-      properties: {
-        /**
-         * Name of the API to load, e.g. 'urlshortener'.
-         *
-         * You can find the full list of APIs on the
-         * <a href="https://developers.google.com/apis-explorer"> Google APIs
-         * Explorer</a>.
-         */
-        name: String,
-
-        /**
-         * Version of the API to load, e.g. 'v1'.
-         */
-        version: String,
-
-        /**
-         * App Engine application ID for loading a Google Cloud Endpoints API.
-         */
-        appId: String,
-
-        /**
-         * Root URL where to load the API from, e.g. 'http://host/apis'.
-         * For App Engine dev server this would be something like:
-         * 'http://localhost:8080/_ah/api'.
-         * Overrides 'appId' if both are specified.
-         */
-        apiRoot: String,
-
-        /**
-         * Name of the event fired when API library is loaded.
-         */
-        successEventName: {
-          type: String,
-          value: 'google-api-load'
-        },
-
-        /**
-         * Name of the event fired when there is an error loading the library.
-         */
-        errorEventName: {
-          type: String,
-          value: 'google-api-load-error'
-        }
-      },
-
-      hostAttributes: {
-        hidden: true // remove from rendering tree.
-      },
-
-      // Used to fix events potentially being fired multiple times by
-      // iron-jsonp-library.
-      _waiting: false,
-
-      /**
-       * Returns the loaded API.
-       */
-      get api() {
-        if (window.gapi && window.gapi.client &&
-            window.gapi.client[this.name]) {
-          return window.gapi.client[this.name];
-        } else {
-          return undefined;
-        }
-      },
-
-      /**
-       * Wrapper for `gapi.auth`.
-       */
-      get auth() {
-        return gapi.auth;
-      },
-
-      ready: function() {
-        this._loader = document.createElement('google-js-api');
-        this.listen(this._loader, 'js-api-load', '_loadClient');
-      },
-
-      detached: function() {
-        this.unlisten(this._loader, 'js-api-load', '_loadClient');
-      },
-
-      _loadClient: function() {
-        gapi.load('client', this._doneLoadingClient.bind(this));
-      },
-
-      _handleLoadResponse: function(response) {
-        if (response && response.error) {
-          _statuses[this.name] = 'error';
-          this._fireError(response);
-        } else {
-          _statuses[this.name] = 'loaded';
-          this._fireSuccess();
-        }
-      },
-
-      _fireSuccess: function() {
-        this.fire(this.successEventName,
-            { 'name': this.name, 'version': this.version });
-      },
-
-      _fireError: function(response) {
-        if (response && response.error) {
-          this.fire(this.errorEventName, {
-            'name': this.name,
-            'version': this.version,
-            'error': response.error });
-        } else {
-          this.fire(this.errorEventName, {
-            'name': this.name,
-            'version': this.version });
-        }
-      },
-
-      _doneLoadingClient: function() {
-        _clientLoaded = true;
-        // Fix for API client load event being fired multiple times by
-        // iron-jsonp-library.
-        if (!this._waiting) {
-          this._loadApi();
-        }
-      },
-
-      _createSelfRemovingListener: function(eventName) {
-        var handler = function () {
-          _loaders[this.name].removeEventListener(eventName, handler);
-          this._loadApi();
-        }.bind(this);
-
-        return handler;
-      },
-
-      _loadApi: function() {
-        if (_clientLoaded && this.name && this.version) {
-          this._waiting = false;
-          // Is this API already loaded?
-          if (_statuses[this.name] == 'loaded') {
-            this._fireSuccess();
-          // Is a different google-api-loader already loading this API?
-          } else if (_statuses[this.name] == 'loading') {
-            this._waiting = true;
-            _loaders[this.name].addEventListener(this.successEventName,
-                this._createSelfRemovingListener(this.successEventName));
-            _loaders[this.name].addEventListener(this.errorEventName,
-                this._createSelfRemovingListener(this.errorEventName));
-          // Did we get an error when we tried to load this API before?
-          } else if (_statuses[this.name] == 'error') {
-            this._fireError(null);
-          // Otherwise, looks like we're loading a new API.
-          } else {
-            var root;
-            if (this.apiRoot) {
-              root = this.apiRoot;
-            } else if (this.appId) {
-              root = 'https://' + this.appId + '.appspot.com/_ah/api';
-            }
-            _statuses[this.name] = 'loading';
-            _loaders[this.name] = this;
-            gapi.client.load(this.name, this.version,
-                this._handleLoadResponse.bind(this), root);
-          }
-        }
-      }
-    });
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-js-api.html b/systrace/catapult/third_party/polymer/components/google-apis/google-js-api.html
deleted file mode 100644
index 3b05a10..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-js-api.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
-
-<!--
-Dynamically loads Google JavaScript API `gapi`, firing the `js-api-load` event when ready.
-
-Any number of components can use `<google-js-api>` elements, and the library will only be loaded once.
-
-##### Example
-
-    <google-js-api></google-js-api>
-    <script>
-      var api = document.querySelector('google-js-api');
-      api.addEventListener('js-api-load', function(e) {
-        console.log('API loaded', gapi);
-      });
-    </script>
--->
-<script>
-  Polymer({
-
-    is: 'google-js-api',
-
-    behaviors: [
-      Polymer.IronJsonpLibraryBehavior
-    ],
-
-    properties: {
-
-      /** @private */
-      libraryUrl: {
-        type: String,
-        value: 'https://apis.google.com/js/api.js?onload=%%callback%%'
-      },
-
-      /**
-       * Fired when the API library is loaded and available.
-       * @event js-api-load
-       */
-      /**
-       * Name of event fired when library is loaded and available.
-       */
-      notifyEvent: {
-        type: String,
-        value: 'js-api-load'
-      },
-    },
-
-    get api() {
-      return gapi;
-    }
-
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-legacy-loader.html b/systrace/catapult/third_party/polymer/components/google-apis/google-legacy-loader.html
deleted file mode 100644
index 02e7a5c..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-legacy-loader.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
-
-<!--
-Dynamically loads the legacy Google JavaScript API Loader (https://developers.google.com/loader/).
-
-Fires `api-load` event when ready.
--->
-<script>
-  Polymer({
-
-    is: 'google-legacy-loader',
-
-    behaviors: [
-      Polymer.IronJsonpLibraryBehavior
-    ],
-
-    properties: {
-
-      /** @private */
-      libraryUrl: {
-        type: String,
-        value: 'https://www.google.com/jsapi?callback=%%callback%%'
-      },
-
-      /**
-       * Fired when the API library is loaded and available.
-       * @event js-api-load
-       */
-      /**
-       * Name of event fired when library is loaded and available.
-       */
-      notifyEvent: {
-        type: String,
-        value: 'api-load'
-      }
-    },
-
-    /**
-     * Wrapper for `google` API namespace.
-     */
-    get api() {
-      return google;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-maps-api.html b/systrace/catapult/third_party/polymer/components/google-apis/google-maps-api.html
deleted file mode 100644
index fb9bbac..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-maps-api.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
-
-<!--
-Dynamically loads the Google Maps JavaScript API, firing the `api-load` event when ready.
-
-#### Example
-
-    <google-maps-api api-key="abc123" version="3.exp"></google-maps-api>
-    <script>
-      var mapsAPI = document.querySelector('google-maps-api');
-      mapsAPI.addEventListener('api-load', function(e) {
-        // this.api === google.maps
-      });
-    </script>
-
-Any number of components can use `<google-maps-api>` elements, and the library will only be loaded once.
-
-@summary Element wrapper around Google Maps API.
--->
-<script>
-  Polymer({
-
-    is: 'google-maps-api',
-
-    behaviors: [
-      Polymer.IronJsonpLibraryBehavior
-    ],
-
-    properties: {
-
-      /** @private */
-      mapsUrl: {
-        type: String,
-        value: 'https://maps.googleapis.com/maps/api/js?callback=%%callback%%'
-      },
-
-      /**
-       * A Maps API key. To obtain an API key, see developers.google.com/maps/documentation/javascript/tutorial#api_key.
-       */
-      apiKey: {
-        type: String,
-        value: ''
-      },
-
-      /**
-       * A Maps API for Business Client ID. To obtain a Maps API for Business Client ID, see developers.google.com/maps/documentation/business/.
-       * If set, a Client ID will take precedence over an API Key.
-       */
-      clientId: {
-        type: String,
-        value: ''
-      },
-
-      /**
-       * Version of the Maps API to use.
-       */
-      version: {
-        type: String,
-        value: '3.exp'
-      },
-
-      /**
-       * The localized language to load the Maps API with. For more information
-       * see https://developers.google.com/maps/documentation/javascript/basics#Language
-       *
-       * Note: the Maps API defaults to the preffered language setting of the browser.
-       * Use this parameter to override that behavior.
-       */
-      language: {
-        type: String,
-        value: ''
-      },
-      /**
-       * If true, sign-in is enabled.
-       * See https://developers.google.com/maps/documentation/javascript/signedin#enable_sign_in
-       */
-      signedIn: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Fired when the Maps API library is loaded and ready.
-       * @event api-load
-       */
-      /**
-       * Name of event fired when library is loaded and available.
-       */
-      notifyEvent: {
-        type: String,
-        value: 'api-load'
-      },
-
-      /** @private */
-      libraryUrl: {
-        type: String,
-        computed: '_computeUrl(mapsUrl, version, apiKey, clientId, language, signedIn)'
-      }
-    },
-
-    _computeUrl: function(mapsUrl, version, apiKey, clientId, language, signedIn) {
-      var url = mapsUrl + '&v=' + version;
-
-      // Always load all Maps API libraries.
-      url += '&libraries=drawing,geometry,places,visualization';
-
-      if (apiKey && !clientId) {
-        url += '&key=' + apiKey;
-      }
-
-      if (clientId) {
-        url += '&client=' + clientId;
-      }
-
-      // Log a warning if the user is not using an API Key or Client ID.
-      if (!apiKey && !clientId) {
-        var warning = 'No Google Maps API Key or Client ID specified. ' +
-            'See https://developers.google.com/maps/documentation/javascript/get-api-key ' +
-            'for instructions to get started with a key or client id.';
-        console.warn(warning);
-      }
-
-      if (language) {
-        url += '&language=' + language;
-      }
-
-      if (signedIn) {
-        url += '&signed_in=' + signedIn;
-      }
-      return url;
-    },
-
-    /**
-     * Provides the google.maps JS API namespace.
-     */
-    get api() {
-      return google.maps;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-plusone-api.html b/systrace/catapult/third_party/polymer/components/google-apis/google-plusone-api.html
deleted file mode 100644
index 205658e..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-plusone-api.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
-
-<!--
-Dynamically loads the Google+ JavaScript API, firing the `api-load` event when ready.
-
-Any number of components can use `<google-plusone-api>` elements, and the library will only be loaded once.
--->
-<script>
-  Polymer({
-
-    is: 'google-plusone-api',
-
-    behaviors: [
-      Polymer.IronJsonpLibraryBehavior
-    ],
-
-    properties: {
-
-      /** @private */
-      libraryUrl:  {
-        type: String,
-        value: 'https://apis.google.com/js/plusone.js?onload=%%callback%%'
-      },
-
-      /**
-       * Fired when the API library is loaded and available.
-       * @event js-api-load
-       */
-      /**
-       * Name of event fired when library is loaded and available.
-       */
-      notifyEvent:  {
-        type: String,
-        value: 'api-load'
-      }
-
-    },
-
-    get api() {
-      return gapi;
-    }
-
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-realtime-api.html b/systrace/catapult/third_party/polymer/components/google-apis/google-realtime-api.html
deleted file mode 100644
index a41fb51..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-realtime-api.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
-
-<!--
-Dynamically loads the Google Drive Realtime API, firing the `api-load` event when ready.
-
-Any number of components can use `<google-realtime-api>` elements, and the library will only be loaded once.
--->
-<script>
-  Polymer({
-
-    is: 'google-realtime-api',
-
-    behaviors: [
-      Polymer.IronJsonpLibraryBehavior
-    ],
-
-    properties: {
-
-      /** @private */
-      libraryUrl:  {
-        type: String,
-        value: 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%'
-      },
-
-       /**
-       * Fired when the API library is loaded and available.
-       * @event api-load
-       */
-      /**
-       * Name of event fired when library is loaded and available.
-       */
-      notifyEvent:  {
-        type: String,
-        value: 'api-load'
-      }
-
-    },
-
-    /**
-     * Returns `gapi.drive.realtime`
-     */
-    get api() {
-      return gapi.drive.realtime;
-    }
-
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/google-youtube-api.html b/systrace/catapult/third_party/polymer/components/google-apis/google-youtube-api.html
deleted file mode 100644
index 7f8960d..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/google-youtube-api.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-jsonp-library/iron-jsonp-library.html">
-
-<!--
-Dynamically loads the Google Youtube Iframe API, firing the `api-load` event when ready.
-
-Any number of components can use `<google-youtube-api>` elements, and the library will only be loaded once.
-
-https://developers.google.com/youtube/iframe_api_reference
--->
-<script>
-  Polymer({
-
-    is: 'google-youtube-api',
-
-    behaviors: [
-      Polymer.IronJsonpLibraryBehavior
-    ],
-
-    properties: {
-
-      /** @private */
-      libraryUrl:  {
-        type: String,
-        value: 'https://www.youtube.com/iframe_api'
-      },
-
-      /**
-       * Fired when the API library is loaded and available.
-       * @event api-load
-       */
-      /**
-       * Name of event fired when library loads.
-       */
-      notifyEvent:  {
-        type: String,
-        value: 'api-load'
-      },
-
-      callbackName:  {
-        type: String,
-        value: 'onYouTubeIframeAPIReady'
-      }
-
-    },
-
-    get api() {
-      return YT;
-    }
-
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-apis/index.html b/systrace/catapult/third_party/polymer/components/google-apis/index.html
deleted file mode 100644
index 203f4fa..0000000
--- a/systrace/catapult/third_party/polymer/components/google-apis/index.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html>
-<!-- Copyright (c) 2015 Google Inc. All rights reserved. -->
-<html>
-<head>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/LICENSE b/systrace/catapult/third_party/polymer/components/google-signin/LICENSE
deleted file mode 100644
index 52aea39..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright 2014 Google 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
-
-    https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT 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/systrace/catapult/third_party/polymer/components/google-signin/README.md b/systrace/catapult/third_party/polymer/components/google-signin/README.md
deleted file mode 100644
index e2fc16e..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-google-signin
-================
-
-See https://elements.polymer-project.org/elements/google-signin
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/bower.json b/systrace/catapult/third_party/polymer/components/google-signin/bower.json
deleted file mode 100644
index 06febde..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/bower.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-  "name": "google-signin",
-  "version": "2.0.0",
-  "description": "Web components to authenticate with Google services",
-  "homepage": "https://googlewebcomponents.github.io/google-signin",
-  "main": "google-signin.html",
-  "authors": [
-    "Addy Osmani",
-    "Randy Merrill"
-  ],
-  "license": "Apache-2.0",
-  "ignore": [
-    "/.*",
-    "/test/"
-  ],
-  "keywords": [
-    "web-component",
-    "web-components",
-    "polymer",
-    "sign-in",
-    "google",
-    "authentication"
-  ],
-  "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2",
-    "font-roboto": "PolymerElements/font-roboto#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#1 - 2",
-    "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
-    "paper-ripple": "PolymerElements/paper-ripple#1 - 2",
-    "paper-material": "PolymerElements/paper-material#1 - 2",
-    "google-apis": "GoogleWebComponents/google-apis#1 - 2"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "polymer": "Polymer/polymer#^1.0.0",
-        "font-roboto": "PolymerElements/font-roboto#^1.0.0",
-        "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-        "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
-        "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.3.0",
-        "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
-        "paper-material": "PolymerElements/paper-material#^1.0.0",
-        "google-apis": "GoogleWebComponents/google-apis#^1.0.0"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/demo/index.html b/systrace/catapult/third_party/polymer/components/google-signin/demo/index.html
deleted file mode 100644
index 0db7e5a..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/demo/index.html
+++ /dev/null
@@ -1,208 +0,0 @@
-<!doctype html>
-<!-- Copyright (c) 2014 Google Inc. All rights reserved. -->
-<html>
-<head>
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>google-signin Demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../google-signin.html">
-  <link rel="import" href="../google-signin-aware.html">
-
-  <!-- Demo only styles -->
-  <style>
-    body {
-      font-family: 'RobotoDraft', 'Roboto', sans-serif;
-      line-height:1.2;
-      vertical-align:middle;
-      background: rgba(204, 204, 204, 0.31);
-    }
-
-
-    .map {
-      background: whitesmoke;
-      margin: .5rem -1.5rem 0 -1.5rem;
-      padding: 0.5rem;
-    }
-
-    h1 {
-      font-size: 2rem;
-      font-weight:200;
-      clear: both;
-    }
-
-    h1 strong {
-      font-weight:300;
-      color:#539D00;
-    }
-
-    h2 {
-      font-size:.9rem;
-      line-height:2.5;
-      color:gray;
-      font-weight:400;
-      clear: both;
-    }
-
-    .showcase {
-      display: inline-block;
-      margin-right: 2rem;
-      float: left;
-    }
-  </style>
-
-</head>
-
-<body>
-  <p>A <code>&lt;google-signin&gt;</code> element looks like this button:</p>
-
-  <p><google-signin brand="google" client-id="1054047045356-j8pgqgls9vdef3rl09hapoicumbte0bo.apps.googleusercontent.com"></google-signin>
-or like this if plus scopes are present
-  <google-signin brand="google-plus"></google-signin>
-  </p>
-  <p>Signin button can vary its appearance:</p>
-  <p>Width:
-    <google-signin brand="google" width="wide"></google-signin>
-    <google-signin brand="google" width="iconOnly"></google-signin>
-  Height:
-    <google-signin brand="google" height="tall"></google-signin>
-    <google-signin brand="google" height="standard"></google-signin>
-    <google-signin brand="google" height="short"></google-signin>
-  </p>
-  <p>
-  Theme:
-    <google-signin brand="google" theme="dark"></google-signin>
-    <google-signin brand="google" theme="light"></google-signin>
-    <google-signin brand="google-plus" theme="dark"></google-signin>
-    <google-signin brand="google-plus" theme="light"></google-signin>
-    <google-signin brand="google-plus" theme="light" raised></google-signin>
-  </p>
-  <!-- Demo the ability to use the google-signin-aware element. -->
-  <p><code>&lt;google-signin-aware&gt;</code> is a companion element.</p>
-  <p>You can use it inside your components to request additional scopes.</p>
-  <p>Every signin button will request all the scopes present in the document,
-  and change its appearance to match</p>
-  <p>For example, here is a signin-aware scope. You can change its scopes via popup</p>
-  <dom-bind id="awareness">
-    <template is="dom-bind">
-      <div><code>&lt;google-signin-aware
-        <div>scope=
-          <select value="{{scope::change}}">
-            <option value="">None</option>
-            <option value="https://www.googleapis.com/auth/analytics">Google Analytics</option>
-            <option value="https://www.googleapis.com/auth/plus.login">Google Plus view circles</option>
-            <option value="https://www.googleapis.com/auth/youtube">YouTube</option>
-            <option value="https://www.googleapis.com/auth/calendar">Calendar</option>
-            <option value="profile">Profile info</option>
-          </select>
-        </div>
-        <div>openid-prompt=
-          <input type="checkbox" checked="{{openidPrompt.none::change}}">none
-          <input type="checkbox" checked="{{openidPrompt.login::change}}">login
-          <input type="checkbox" checked="{{openidPrompt.consent::change}}">consent
-          <input type="checkbox"
-              checked="{{openidPrompt.select_account::change}}">select_account
-        </div>
-        <div>offline=<input type="checkbox" checked="{{offline::change}}"></div>
-        <div>initialized="<span>{{initialized}}</span>"</div>
-        <div>signedIn="<span>{{signedIn}}</span>"</div>
-        <div>isAuthorized="<span>{{isAuthorized}}</span>"</div>
-        <div>needAdditionalAuth:"<span>{{needAdditionalAuth}}</span>"&gt;</div>
-      </code></div>
-      <p>Every new scope you select will be added to requested scopes.</p>
-      <p>When you select a Google Plus scope, button will turn red.</p>
-        <google-signin></google-signin>
-      </p>
-      <google-signin-aware
-          scopes="{{scope}}"
-          openid-prompt="{{openidPromptValue}}"
-          initialized="{{initialized}}"
-          signed-in="{{signedIn}}"
-          offline="{{offline}}"
-          is-authorized="{{isAuthorized}}"
-          need-additional-auth="{{needAdditionalAuth}}"
-          on-google-signin-aware-error="handleSignInError"
-          on-google-signin-aware-success="handleSignIn"
-          on-google-signin-offline-success="handleOffline"
-          on-google-signin-aware-signed-out="handleSignOut"
-          on-signed-in-changed="handleStateChange"
-          on-initialized-changed="handleStateChange"></google-signin-aware>
-      <p>User name:<span>{{userName}}</span></p>
-      <p>Testing <code>google-signin-aware</code> events: <span>{{status}}</span></p>
-      <p>Testing <code>google-signin-offline</code> events: <span>{{offlineCode}}</span></p>
-      <p>Only display "not signed in" element after auth state is initialized (avoid flickering): <b hidden id="not-signed-in">Not signed in!</b></p>
-      <p><button on-click="disconnect">Disconnect to start over</button></p>
-    </template>
-  </dom-bind>
-  <script>
-    var aware = document.querySelector('#awareness');
-    if (!Polymer.Element) {
-      aware = aware.querySelector('template');
-    }
-
-    aware.status = 'Not granted';
-    aware.offlineCode = 'No offline login.';
-    aware.userName = 'N/A';
-    aware.openidPrompt = {};
-
-    aware.handleSignInError = function(event) {
-      this.status = JSON.stringify(event.detail);
-    };
-    aware.handleSignIn = function(response) {
-      this.status = 'Signin granted';
-      // console.log('[Aware] Signin Response', response);
-      this.userName = gapi.auth2.getAuthInstance().currentUser.get().getBasicProfile().getName();
-    };
-    aware.handleOffline = function(response) {
-      this.offlineCode = response.detail.code;
-    };
-    aware.handleSignOut = function(response) {
-      this.status = 'Signed out';
-      // console.log('[Aware] Signout Response', response);
-      this.userName = 'N/A';
-    };
-    aware.disconnect = function() {
-      var currentUser = gapi.auth2.getAuthInstance().currentUser.get();
-      if (currentUser) {
-        currentUser.disconnect();
-      }
-      gapi.auth2.getAuthInstance().signOut();
-    };
-
-    aware.handleStateChange = function(e) {
-      var signedIn = e.target.signedIn;
-      var initialized = e.target.initialized;
-      if(initialized && !signedIn) {
-        document.querySelector("#not-signed-in").removeAttribute("hidden");
-      } else {
-        document.querySelector("#not-signed-in").setAttribute("hidden", true);
-      }
-    };
-
-    aware.addEventListener('openid-prompt-changed', function(e) {
-      if (e.detail.value) {
-        if (e.detail.path === 'openidPrompt.none') {
-          aware.set('openidPrompt', {
-            none: true,
-            login: false,
-            consent: false,
-            select_account: false
-          });
-        } else {
-          aware.set('openidPrompt.none', false);
-        }
-      }
-
-      var values = [];
-      Object.keys(aware.openidPrompt).forEach(function(k) {
-        if (aware.openidPrompt[k]) {
-          values.push(k);
-        }
-      });
-      this.set('openidPromptValue', values.join(' '));
-    });
-
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/google-icons.html b/systrace/catapult/third_party/polymer/components/google-signin/google-icons.html
deleted file mode 100644
index 0787b94..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/google-icons.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-Copyright 2014 Google 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
-
-    https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="google" size="24">
-<svg>
-  <defs>
-    <g id="google">
-      <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
-      <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
-      <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
-      <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
-      <path fill="none" d="M1 1h22v22H1z"/>
-    </g>
-    <g id="google-plus">
-      <path fill="none" d="M0 0h24v24H0V0z"/>
-      <path d="M23 11h-2V9h-2v2h-2v2h2v2h2v-2h2zM8 11v2.4h3.97c-.16 1.03-1.2 3.02-3.97 3.02-2.39 0-4.34-1.98-4.34-4.42S5.61 7.58 8 7.58c1.36 0 2.27.58 2.79 1.08l1.9-1.83C11.47 5.69 9.89 5 8 5c-3.87 0-7 3.13-7 7s3.13 7 7 7c4.04 0 6.72-2.84 6.72-6.84 0-.46-.05-.81-.11-1.16H8z"/>
-      <path fill="none" d="M1 5h14v14H1z"/>
-    </g>
-  </defs>
-</svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/google-signin-aware.html b/systrace/catapult/third_party/polymer/components/google-signin/google-signin-aware.html
deleted file mode 100644
index e6e731b..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/google-signin-aware.html
+++ /dev/null
@@ -1,824 +0,0 @@
-<!--
-Copyright 2014 Google 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
-
-    https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../google-apis/google-js-api.html">
-
-<script>
-  (function() {
-
-    /**
-     * Enum of attributes to be passed through to the login API call.
-     * @readonly
-     * @enum {string}
-     */
-    var ProxyLoginAttributes = {
-      'appPackageName': 'apppackagename',
-      'clientId': 'clientid',
-      'cookiePolicy': 'cookiepolicy',
-      'hostedDomain': 'hostedDomain',
-      'openidPrompt': 'prompt',
-      'requestVisibleActions': 'requestvisibleactions'
-    };
-
-    /**
-     * AuthEngine does all interactions with gapi.auth2
-     *
-     * It is tightly coupled with <google-signin-aware> element
-     * The elements configure AuthEngine.
-     * AuthEngine propagates all authentication events to all google-signin-aware elements
-     *
-     * API used: https://developers.google.com/identity/sign-in/web/reference
-     *
-     */
-    var AuthEngine = {
-
-      /**
-       * oauth2 argument, set by google-signin-aware
-       */
-      _clientId: null,
-
-      get clientId() {
-        return this._clientId;
-      },
-
-      set clientId(val) {
-        if (this._clientId && val && val != this._clientId) {
-          throw new Error('clientId cannot change. Values do not match. New: ' + val + ' Old:' + this._clientId);
-        }
-        if (val && val != this._clientId) {
-          this._clientId = val;
-          this.initAuth2();
-        }
-      },
-
-      /**
-       * oauth2 argument, set by google-signin-aware
-       */
-      _cookiePolicy: 'single_host_origin',
-
-      get cookiePolicy() {
-        return this._cookiePolicy;
-      },
-
-      set cookiePolicy(val) {
-        if (val) {
-          this._cookiePolicy = val;
-        }
-      },
-
-      /**
-       * oauth2 argument, set by google-signin-aware
-       */
-      _appPackageName: '',
-
-      get appPackageName() {
-        return this._appPackageName;
-      },
-
-      set appPackageName(val) {
-        if (this._appPackageName && val && val != this._appPackageName) {
-          throw new Error('appPackageName cannot change. Values do not match. New: ' + val + ' Old: ' + this._appPackageName);
-        }
-        if (val) {
-          this._appPackageName = val;
-        }
-      },
-
-     /**
-       * oauth2 argument, set by google-signin-aware
-       */
-      _requestVisibleActions: '',
-
-      get requestVisibleactions() {
-        return this._requestVisibleActions;
-      },
-
-      set requestVisibleactions(val) {
-        if (this._requestVisibleActions && val && val != this._requestVisibleActions) {
-          throw new Error('requestVisibleactions cannot change. Values do not match. New: ' + val + ' Old: ' + this._requestVisibleActions);
-        }
-        if (val)
-          this._requestVisibleActions = val;
-      },
-
-     /**
-       * oauth2 argument, set by google-signin-aware
-       */
-      _hostedDomain: '',
-
-      get hostedDomain() {
-        return this._hostedDomain;
-      },
-
-      set hostedDomain(val) {
-        if (this._hostedDomain && val && val != this._hostedDomain) {
-          throw new Error('hostedDomain cannot change. Values do not match. New: ' + val + ' Old: ' + this._hostedDomain);
-        }
-        if (val)
-          this._hostedDomain = val;
-      },
-
-     /**
-       * oauth2 argument, set by google-signin-aware
-       */
-      _openidPrompt: '',
-
-      get openidPrompt() {
-        return this._openidPrompt;
-      },
-
-      set openidPrompt(val) {
-        if (typeof val !== 'string') {
-          throw new Error(
-              'openidPrompt must be a string. Received ' + typeof val);
-        }
-        if (val) {
-          var values = val.split(' ');
-          values = values.map(function(v) {
-            return v.trim();
-          });
-          values = values.filter(function(v) {
-            return v;
-          });
-          var validValues = {none: 0, login: 0, consent: 0, select_account: 0};
-          values.forEach(function(v) {
-            if (v == 'none' && values.length > 1) {
-              throw new Error(
-                  'none cannot be combined with other openidPrompt values');
-            }
-            if (!(v in validValues)) {
-              throw new Error(
-                  'invalid openidPrompt value ' + v +
-                  '. Valid values: ' + Object.keys(validValues).join(', '));
-            }
-          });
-        }
-        this._openidPrompt = val;
-      },
-
-      /** Is offline access currently enabled in the google-signin-aware element? */
-      _offline: false,
-
-      get offline() {
-        return this._offline;
-      },
-
-      set offline(val) {
-        this._offline = val;
-        this.updateAdditionalAuth();
-      },
-
-      /** Should we force a re-prompt for offline access? */
-      _offlineAlwaysPrompt: false,
-
-      get offlineAlwaysPrompt() {
-        return this._offlineAlwaysPrompt;
-      },
-
-      set offlineAlwaysPrompt(val) {
-        this._offlineAlwaysPrompt = val;
-        this.updateAdditionalAuth();
-      },
-
-      /** Have we already gotten offline access from Google during this session? */
-      offlineGranted: false,
-
-      /** <google-js-api> */
-      _apiLoader: null,
-
-      /** an array of wanted scopes. oauth2 argument */
-      _requestedScopeArray: [],
-
-      /** _requestedScopeArray as string */
-      get requestedScopes() {
-        return this._requestedScopeArray.join(' ');
-      },
-
-      /** Is auth library initalized? */
-      _initialized: false,
-
-      /** Is user signed in? */
-      _signedIn: false,
-
-      /** Currently granted scopes */
-      _grantedScopeArray: [],
-
-      /** True if additional authorization is required */
-      _needAdditionalAuth: true,
-
-      /** True if have google+ scopes */
-      _hasPlusScopes: false,
-
-      /**
-       * array of <google-signin-aware>
-       * state changes are broadcast to them
-       */
-      signinAwares: [],
-
-      init: function() {
-        this._apiLoader = document.createElement('google-js-api');
-        this._apiLoader.addEventListener('js-api-load', this.loadAuth2.bind(this));
-        if (Polymer.Element) {
-          document.body.appendChild(this._apiLoader);
-        }
-      },
-
-      loadAuth2: function() {
-        gapi.load('auth2', this.initAuth2.bind(this));
-      },
-
-      initAuth2: function() {
-        if (!('gapi' in window) || !('auth2' in window.gapi) || !this.clientId) {
-          return;
-        }
-        var auth = gapi.auth2.init({
-          'client_id': this.clientId,
-          'cookie_policy': this.cookiePolicy,
-          'scope': this.requestedScopes,
-          'hosted_domain': this.hostedDomain
-        });
-
-        auth['currentUser'].listen(this.handleUserUpdate.bind(this));
-
-        auth.then(
-          function onFulfilled() {
-          // Let the current user listener trigger the changes.
-          },
-          function onRejected(error) {
-            console.error(error);
-          }
-        );
-      },
-
-      handleUserUpdate: function(newPrimaryUser) {
-        // update and broadcast currentUser
-        var isSignedIn = newPrimaryUser.isSignedIn();
-        if (isSignedIn != this._signedIn) {
-          this._signedIn = isSignedIn;
-          for (var i=0; i<this.signinAwares.length; i++) {
-            this.signinAwares[i]._setSignedIn(isSignedIn);
-          }
-        }
-        // update and broadcast initialized property the first time the isSignedIn property is set.
-        if(!this._initialized) {
-            for (var i=0; i<this.signinAwares.length; i++) {
-                this.signinAwares[i]._setInitialized(true);
-            }
-            this._initialized = true;
-        }
-
-
-        // update granted scopes
-        this._grantedScopeArray = this.strToScopeArray(
-          newPrimaryUser.getGrantedScopes());
-        // console.log(this._grantedScopeArray);
-        this.updateAdditionalAuth();
-
-        var response = newPrimaryUser.getAuthResponse();
-        for (var i=0; i<this.signinAwares.length; i++) {
-          this.signinAwares[i]._updateScopeStatus(response);
-        }
-      },
-
-      setOfflineCode: function(code) {
-        for (var i=0; i<this.signinAwares.length; i++) {
-          this.signinAwares[i]._updateOfflineCode(code);
-        }
-      },
-
-      /** convert scope string to scope array */
-      strToScopeArray: function(str) {
-        if (!str) {
-          return [];
-        }
-        // remove extra spaces, then split
-        var scopes = str.replace(/\ +/g, ' ').trim().split(' ');
-        for (var i=0; i<scopes.length; i++) {
-          scopes[i] = scopes[i].toLowerCase();
-           // Handle scopes that will be deprecated but are still returned with their old value
-          if (scopes[i] === 'https://www.googleapis.com/auth/userinfo.profile') {
-            scopes[i] = 'profile';
-          }
-          if (scopes[i] === 'https://www.googleapis.com/auth/userinfo.email') {
-            scopes[i] = 'email';
-          }
-        }
-        // return with duplicates filtered out
-        return scopes.filter( function(value, index, self) {
-          return self.indexOf(value) === index;
-        });
-      },
-
-      /** true if scopes have google+ scopes */
-      isPlusScope: function(scope) {
-        return (scope.indexOf('/auth/games') > -1)
-            || (scope.indexOf('auth/plus.') > -1 && scope.indexOf('auth/plus.me') < 0);
-      },
-
-      /** true if scopes have been granted */
-      hasGrantedScopes: function(scopeStr) {
-        var scopes = this.strToScopeArray(scopeStr);
-        for (var i=0; i< scopes.length; i++) {
-          if (this._grantedScopeArray.indexOf(scopes[i]) === -1)
-            return false;
-        }
-        return true;
-      },
-
-      /** request additional scopes */
-      requestScopes: function(newScopeStr) {
-        var newScopes = this.strToScopeArray(newScopeStr);
-        var scopesUpdated = false;
-        for (var i=0; i<newScopes.length; i++) {
-          if (this._requestedScopeArray.indexOf(newScopes[i]) === -1) {
-            this._requestedScopeArray.push(newScopes[i]);
-            scopesUpdated = true;
-          }
-        }
-        if (scopesUpdated) {
-          this.updateAdditionalAuth();
-          this.updatePlusScopes();
-        }
-      },
-
-      /** update status of _needAdditionalAuth */
-      updateAdditionalAuth: function() {
-        var needMoreAuth = false;
-        if ((this.offlineAlwaysPrompt || this.offline ) && !this.offlineGranted) {
-          needMoreAuth = true;
-        } else {
-          for (var i=0; i<this._requestedScopeArray.length; i++) {
-            if (this._grantedScopeArray.indexOf(this._requestedScopeArray[i]) === -1) {
-              needMoreAuth = true;
-              break;
-            }
-          }
-        }
-        if (this._needAdditionalAuth != needMoreAuth) {
-          this._needAdditionalAuth = needMoreAuth;
-          // broadcast new value
-          for (var i=0; i<this.signinAwares.length; i++) {
-            this.signinAwares[i]._setNeedAdditionalAuth(needMoreAuth);
-          }
-        }
-      },
-
-      updatePlusScopes: function() {
-        var hasPlusScopes = false;
-        for (var i = 0; i < this._requestedScopeArray.length; i++) {
-          if (this.isPlusScope(this._requestedScopeArray[i])) {
-            hasPlusScopes = true;
-            break;
-          }
-        }
-        if (this._hasPlusScopes != hasPlusScopes) {
-          this._hasPlusScopes = hasPlusScopes;
-          for (var i=0; i<this.signinAwares.length; i++) {
-            this.signinAwares[i]._setHasPlusScopes(hasPlusScopes);
-          }
-        }
-      },
-      /**
-       * attached <google-signin-aware>
-       * @param {!GoogleSigninAwareElement} aware element to add
-       */
-      attachSigninAware: function(aware) {
-        if (this.signinAwares.indexOf(aware) == -1) {
-          this.signinAwares.push(aware);
-          // Initialize aware properties
-          aware._setNeedAdditionalAuth(this._needAdditionalAuth);
-          aware._setInitialized(this._initialized);
-          aware._setSignedIn(this._signedIn);
-          aware._setHasPlusScopes(this._hasPlusScopes);
-        } else {
-          console.warn('signinAware attached more than once', aware);
-        }
-      },
-
-      detachSigninAware: function(aware) {
-        var index = this.signinAwares.indexOf(aware);
-        if (index != -1) {
-          this.signinAwares.splice(index, 1);
-        } else {
-          console.warn('Trying to detach unattached signin-aware');
-        }
-      },
-
-      /** returns scopes not granted */
-      getMissingScopes: function() {
-        return this._requestedScopeArray.filter( function(scope) {
-          return this._grantedScopeArray.indexOf(scope) === -1;
-        }.bind(this)).join(' ');
-      },
-
-      assertAuthInitialized: function() {
-        if (!this.clientId) {
-          throw new Error("AuthEngine not initialized. clientId has not been configured.");
-        }
-        if (!('gapi' in window)) {
-          throw new Error("AuthEngine not initialized. gapi has not loaded.");
-        }
-        if (!('auth2' in window.gapi)) {
-          throw new Error("AuthEngine not initialized. auth2 not loaded.");
-        }
-      },
-
-      /** pops up sign-in dialog */
-      signIn: function() {
-        this.assertAuthInitialized();
-        var params = {
-          'scope': this.getMissingScopes()
-        };
-
-        // Proxy specific attributes through to the signIn options.
-        Object.keys(ProxyLoginAttributes).forEach(function(key) {
-          if (this[key] && this[key] !== '') {
-            params[ProxyLoginAttributes[key]] = this[key];
-          }
-        }, this);
-
-        var promise;
-        var user = gapi.auth2.getAuthInstance()['currentUser'].get();
-        if (!(this.offline || this.offlineAlwaysPrompt)) {
-          if (user.getGrantedScopes()) {
-            // additional auth, skip multiple account dialog
-            promise = user.grant(params);
-          } else {
-            // initial signin
-            promise = gapi.auth2.getAuthInstance().signIn(params);
-          }
-        } else {
-          params.redirect_uri = 'postmessage';
-          if (this.offlineAlwaysPrompt) {
-            params.approval_prompt = 'force';
-          }
-
-          // Despite being documented at https://goo.gl/tiO0Bk
-          // It doesn't seem like user.grantOfflineAccess() actually exists in
-          // the current version of the Google Sign-In JS client we're using
-          // through GoogleWebComponents. So in the offline case, we will not
-          // distinguish between a first auth and an additional one.
-          promise = gapi.auth2.getAuthInstance().grantOfflineAccess(params);
-        }
-        promise.then(
-          function onFulfilled(response) {
-            // If login was offline, response contains one string "code"
-            // Otherwise it contains the user object already
-            var newUser;
-            if (response.code) {
-              AuthEngine.offlineGranted = true;
-              newUser = gapi.auth2.getAuthInstance()['currentUser'].get();
-              AuthEngine.setOfflineCode(response.code);
-            } else {
-              newUser = response;
-            }
-
-            var authResponse = newUser.getAuthResponse();
-            // Let the current user listener trigger the changes.
-          },
-          function onRejected(error) {
-            // Access denied is not an error, user hit cancel
-            if ("Access denied." !== error.reason) {
-              this.signinAwares.forEach(function(awareInstance) {
-                awareInstance.errorNotify(error);
-              });
-            }
-          }.bind(this)
-        );
-      },
-
-      /** signs user out */
-      signOut: function() {
-        this.assertAuthInitialized();
-        gapi.auth2.getAuthInstance().signOut().then(
-          function onFulfilled() {
-          // Let the current user listener trigger the changes.
-          },
-          function onRejected(error) {
-            console.error(error);
-          }
-        );
-      }
-    };
-
-    AuthEngine.init();
-
-/**
-`google-signin-aware` is used to enable authentication in custom elements by
-interacting with a google-signin element that needs to be present somewhere
-on the page.
-
-The `scopes` attribute allows you to specify which scope permissions are required
-(e.g do you want to allow interaction with the Google Drive API).
-
-The `google-signin-aware-success` event is triggered when a user successfully
-authenticates. If either `offline` or `offlineAlwaysPrompt` is set to true, successful
-authentication will also trigger the `google-signin-offline-success`event.
-The `google-signin-aware-signed-out` event is triggered when a user explicitly
-signs out via the google-signin element.
-
-You can bind to `isAuthorized` property to monitor authorization state.
-##### Example
-
-    <google-signin-aware scopes="https://www.googleapis.com/auth/drive"></google-signin-aware>
-
-
-##### Example with offline
-    <template id="awareness" is="dom-bind">
-      <google-signin-aware
-          scopes="https://www.googleapis.com/auth/drive"
-          offline
-          on-google-signin-aware-success="handleSignin"
-          on-google-signin-offline-success="handleOffline"></google-signin-aware>
-    <\/template>
-    <script>
-      var aware = document.querySelector('#awareness');
-      aware.handleSignin = function(response) {
-        var user = gapi.auth2.getAuthInstance()['currentUser'].get();
-        console.log('User name: ' + user.getBasicProfile().getName());
-      };
-      aware.handleOffline = function(response) {
-        console.log('Offline code received: ' + response.detail.code);
-        // Here you would POST response.detail.code to your webserver, which can
-        // exchange the authorization code for an access token. More info at:
-        // https://developers.google.com/identity/protocols/OAuth2WebServer
-      };
-    <\/script>
-*/
-    Polymer({
-
-      is: 'google-signin-aware',
-
-      /**
-       * Fired when this scope has been authorized
-       * @param {Object} result Authorization result.
-       * @event google-signin-aware-success
-       */
-
-      /**
-       * Fired when an offline authorization is successful.
-       * @param {{code: string}} detail -
-       *     code: The one-time authorization code from Google.
-       *         Your application can exchange this for an `access_token` and `refresh_token`
-       * @event google-signin-offline-success
-       */
-
-      /**
-       * Fired when this scope is not authorized
-       * @event google-signin-aware-signed-out
-       */
-
-      /**
-       * Fired when there is an error during the signin flow.
-       * @param {Object} detail The error object returned from the OAuth 2 flow.
-       * @event google-signin-aware-error
-       */
-
-      /**
-       * This block is needed so the previous @param is not assigned to the next property.
-       */
-
-      properties: {
-        /**
-         * App package name for android over-the-air installs.
-         * See the relevant [docs](https://developers.google.com/+/web/signin/android-app-installs)
-         */
-        appPackageName: {
-          type: String,
-          observer: '_appPackageNameChanged'
-        },
-
-        /**
-         * a Google Developers clientId reference
-         */
-        clientId: {
-          type: String,
-          observer: '_clientIdChanged'
-        },
-
-        /**
-         * The cookie policy defines what URIs have access to the session cookie
-         * remembering the user's sign-in state.
-         * See the relevant [docs](https://developers.google.com/+/web/signin/reference#determining_a_value_for_cookie_policy) for more information.
-         * @default 'single_host_origin'
-         */
-        cookiePolicy: {
-          type: String,
-          observer: '_cookiePolicyChanged'
-        },
-
-        /**
-         * The app activity types you want to write on behalf of the user
-         * (e.g http://schemas.google.com/AddActivity)
-         *
-         */
-        requestVisibleActions: {
-          type: String,
-          observer: '_requestVisibleActionsChanged'
-        },
-
-        /**
-         * The Google Apps domain to which users must belong to sign in.
-         * See the relevant [docs](https://developers.google.com/identity/sign-in/web/reference) for more information.
-         */
-        hostedDomain: {
-          type: String,
-          observer: '_hostedDomainChanged'
-        },
-
-       /**
-         * Allows for offline `access_token` retrieval during the signin process.
-         * See also `offlineAlwaysPrompt`. You only need to set one of the two; if both
-         * are set, the behavior of `offlineAlwaysPrompt` will override `offline`.
-         */
-        offline: {
-          type: Boolean,
-          value: false,
-          observer: '_offlineChanged'
-        },
-
-        /**
-          * Works the same as `offline` with the addition that it will always
-          * force a re-prompt to the user, guaranteeing that you will get a
-          * refresh_token even if the user has already granted offline access to
-          * this application. You only need to set one of `offline` or
-          * `offlineAlwaysPrompt`, not both.
-          */
-        offlineAlwaysPrompt: {
-          type: Boolean,
-          value: false,
-          observer: '_offlineAlwaysPromptChanged'
-        },
-
-       /**
-         * The scopes to provide access to (e.g https://www.googleapis.com/auth/drive)
-         * and should be space-delimited.
-         */
-        scopes: {
-          type: String,
-          value: 'profile',
-          observer: '_scopesChanged'
-        },
-
-        /**
-         * Space-delimited, case-sensitive list of strings that
-         * specifies whether the the user is prompted for reauthentication
-         * and/or consent. The defined values are:
-         *   none: do not display authentication or consent pages.
-         *     This value is mutually exclusive with the rest.
-         *   login: always prompt the user for reauthentication.
-         *   consent: always show consent screen.
-         *   select_account: always show account selection page.
-         *     This enables a user who has multiple accounts to select amongst
-         *     the multiple accounts that they might have current sessions for.
-         * For more information, see "prompt" parameter description in
-         * https://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters
-         */
-        openidPrompt: {
-          type: String,
-          value: '',
-          observer: '_openidPromptChanged'
-        },
-
-        /**
-         * True when the auth library has been initialized, and signedIn property value is set from the first api response.
-         */
-        initialized: {
-            type: Boolean,
-            notify: true,
-            readOnly: true
-        },
-
-        /**
-         * True if user is signed in
-         */
-        signedIn: {
-          type: Boolean,
-          notify: true,
-          readOnly: true
-        },
-
-        /**
-         * True if authorizations for *this* element have been granted
-         */
-        isAuthorized: {
-          type: Boolean,
-          notify: true,
-          readOnly: true,
-          value: false
-        },
-
-        /**
-         * True if additional authorizations for *any* element are required
-         */
-        needAdditionalAuth: {
-          type: Boolean,
-          notify: true,
-          readOnly: true
-        },
-
-        /**
-         * True if *any* element has google+ scopes
-         */
-        hasPlusScopes: {
-          type: Boolean,
-          value: false,
-          notify: true,
-          readOnly: true
-        }
-      },
-
-      attached: function() {
-        AuthEngine.attachSigninAware(this);
-      },
-
-      detached: function() {
-        AuthEngine.detachSigninAware(this);
-      },
-
-      /** pops up the authorization dialog */
-      signIn: function() {
-        AuthEngine.signIn();
-      },
-
-      /** signs user out */
-      signOut: function() {
-        AuthEngine.signOut();
-      },
-
-      errorNotify: function(error) {
-        this.fire('google-signin-aware-error', error);
-      },
-
-      _appPackageNameChanged: function(newName, oldName) {
-        AuthEngine.appPackageName = newName;
-      },
-
-      _clientIdChanged: function(newId, oldId) {
-        AuthEngine.clientId = newId;
-      },
-
-      _cookiePolicyChanged: function(newPolicy, oldPolicy) {
-        AuthEngine.cookiePolicy = newPolicy;
-      },
-
-      _requestVisibleActionsChanged: function(newVal, oldVal) {
-        AuthEngine.requestVisibleActions = newVal;
-      },
-
-      _hostedDomainChanged: function(newVal, oldVal) {
-        AuthEngine.hostedDomain = newVal;
-      },
-
-      _offlineChanged: function(newVal, oldVal) {
-        AuthEngine.offline = newVal;
-      },
-
-      _offlineAlwaysPromptChanged: function(newVal, oldVal) {
-        AuthEngine.offlineAlwaysPrompt = newVal;
-      },
-
-      _scopesChanged: function(newVal, oldVal) {
-        AuthEngine.requestScopes(newVal);
-        this._updateScopeStatus(undefined);
-      },
-
-      _openidPromptChanged: function(newVal, oldVal) {
-        AuthEngine.openidPrompt = newVal;
-      },
-
-      _updateScopeStatus: function(user) {
-        var newAuthorized = this.signedIn && AuthEngine.hasGrantedScopes(this.scopes);
-        if (newAuthorized !== this.isAuthorized) {
-          this._setIsAuthorized(newAuthorized);
-          if (newAuthorized) {
-            this.fire('google-signin-aware-success', user);
-          }
-          else {
-            this.fire('google-signin-aware-signed-out', user);
-          }
-        }
-      },
-
-      _updateOfflineCode: function(code) {
-        if (code) {
-          this.fire('google-signin-offline-success', {code: code});
-        }
-      }
-    });
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/google-signin-styles.html b/systrace/catapult/third_party/polymer/components/google-signin/google-signin-styles.html
deleted file mode 100644
index 5a11119..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/google-signin-styles.html
+++ /dev/null
@@ -1,267 +0,0 @@
-<!--
-Copyright 2014 Google 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
-
-    https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<dom-module id="google-signin-styles">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        position: relative;
-        box-sizing: border-box;
-        margin: 0 0.29em;
-        background: transparent;
-        text-align: center;
-        font: inherit;
-        outline: none;
-        border-radius: 3px;
-        -webkit-user-select: none;
-        user-select: none;
-        cursor: pointer;
-        z-index: 0;
-      }
-
-      :host([disabled]) {
-        cursor: auto;
-        pointer-events: none;
-      }
-
-      :host([disabled]) #button {
-        background: #eaeaea;
-        color: #a8a8a8;
-      }
-
-      #button {
-        position: relative;
-        outline: none;
-        font-size: 14px;
-        font-weight: 400;
-        font-family: 'RobotoDraft','Roboto',arial,sans-serif;
-        white-space: nowrap;
-        border-radius: inherit;
-      }
-
-      iron-icon {
-        width: 22px;
-        height: 22px;
-        margin: 6px;
-      }
-
-      .icon {
-        display: inline-block;
-        vertical-align: middle;
-      }
-
-      #shadow {
-        border-radius: inherit;
-      }
-
-      #ripple {
-        pointer-events: none;
-      }
-
-      .button-content {
-        outline: none;
-      }
-
-      .buttonText {
-        display: inline-block;
-        vertical-align: middle;
-        padding-right: .8em;
-      }
-
-      /*
-       * Dark Theme
-       */
-      .theme-dark {
-        background: #da4336;
-        color: #ffffff;
-        border: 1px solid transparent;
-      }
-
-      .theme-dark.signedIn-true.additionalAuth-false {
-        background: #999;
-        border: 1px solid #888;
-      }
-
-      .theme-dark.signedIn-true.additionalAuth-false:hover,
-      .theme-dark.signedIn-true.additionalAuth-false:focus {
-        background: #aaa;
-      }
-
-      :host([noink]) .theme-dark:hover,
-      :host([noink]) .theme-dark:focus {
-        background: #e74b37;
-      }
-
-      :host([noink]) .theme-dark.signedIn-true.additionalAuth-false:hover,
-      :host([noink]) .theme-dark.signedIn-true.additionalAuth-false:focus {
-        background: #aaa;
-      }
-
-      /*
-       * Light Theme
-       */
-      .theme-light {
-        background: #fff;
-        color: #737373;
-        border: 1px solid #d9d9d9;
-      }
-
-      .theme-light.signedIn-true.additionalAuth-false {
-        background: #c0c0c0;
-        color: #fff;
-        border: #888 1px solid;
-      }
-
-      .theme-light.signedIn-true.additionalAuth-false:hover,
-      .theme-light.signedIn-true.additionalAuth-false:focus {
-        background: #aaa;
-      }
-
-      :host([noink]) .theme-light .button-content:hover,
-      :host([noink]) .theme-light:focus {
-        border: 1px solid #c0c0c0;
-      }
-
-      :host([noink]) .theme-light.signedIn-true.additionalAuth-false:hover,
-      :host([noink]) .theme-light.signedIn-true.additionalAuth-false:focus {
-        background: #aaa;
-      }
-
-      /*
-       * Icon Only Width
-       */
-      .width-iconOnly .buttonText {
-        display: none;
-      }
-
-      /*
-       * Tall Height
-       */
-      .height-tall .buttonText {
-        font-size: 15px;
-        font-weight: 700;
-      }
-
-      .height-tall iron-icon {
-        width: 30px;
-        height: 30px;
-        margin: 8px;
-      }
-
-      /*
-       * Short Height
-       */
-      .height-short .buttonText {
-        font-size: 11px;
-      }
-
-      .height-short iron-icon {
-        width: 16px;
-        height: 16px;
-        margin: 3px;
-      }
-
-
-      /*
-       * Branding
-       */
-
-      /* Google Scopes */
-
-      /* Dark Theme */
-      .brand-google.theme-dark {
-        background: #4184F3;
-        color: #fff;
-        border: 1px solid #3266d5;
-      }
-
-      .brand-google.theme-dark .icon {
-        background: #fff;
-        border-top-left-radius: 2px;
-        border-bottom-left-radius: 2px;
-      }
-
-      .brand-google.theme-dark.width-iconOnly .icon {
-        border-radius: 2px;
-      }
-
-      .brand-google.theme-dark .buttonText {
-        padding-left: .8em;
-      }
-
-      .brand-google.theme-dark #ripple {
-        color: #1b39a8;
-      }
-
-      :host([noink]) .brand-google.theme-dark:hover,
-      :host([noink]) .brand-google.theme-dark:focus {
-        background: #e74b37;
-      }
-
-      .brand-google.theme-light .icon {
-        color: #4184F3;
-      }
-
-      .brand-google.theme-light.signedIn-true.additionalAuth-false .icon {
-        color: #fff;
-      }
-
-      .brand-google.theme-light #ripple {
-        color: #444;
-      }
-
-      :host([noink]) .brand-google.theme-light:hover,
-      :host([noink]) .brand-google.theme-light:focus {
-        border: 1px solid #c0c0c0;
-      }
-
-      .brand-google-plus.theme-dark {
-        background: #da4336;
-        color: #fff;
-        border: 1px solid transparent;
-      }
-
-      .brand-google-plus.theme-dark #ripple {
-        color: #c43828;
-      }
-
-      /* Light Theme */
-      .brand-google-plus.theme-light {
-        background: #fff;
-        color: #737373;
-        border: 1px solid #d9d9d9;
-      }
-
-      .brand-google-plus.theme-light .icon {
-        color: #e74b37;
-      }
-
-      .brand-google-plus.theme-light.signedIn-true.additionalAuth-false .icon {
-        color: #fff;
-      }
-
-      .brand-google-plus.theme-light #ripple {
-        color: #400;
-      }
-
-      :host([noink]) .brand-google-plus.theme-light:hover,
-      :host([noink]) .brand-google-plus.theme-light:focus {
-        border: 1px solid #c0c0c0;
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/google-signin.html b/systrace/catapult/third_party/polymer/components/google-signin/google-signin.html
deleted file mode 100644
index dfafc8c..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/google-signin.html
+++ /dev/null
@@ -1,596 +0,0 @@
-<!--
-Copyright 2014 Google 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
-
-    https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="google-signin-aware.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../font-roboto/roboto.html">
-<link rel="import" href="../google-apis/google-js-api.html">
-<link rel="import" href="../paper-ripple/paper-ripple.html">
-<link rel="import" href="../paper-material/paper-material.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout-classes.html">
-<link rel="import" href="google-icons.html">
-<link rel="import" href="google-signin-styles.html">
-
-<dom-module id="google-signin">
-  <template>
-    <style include="google-signin-styles iron-positioning"></style>
-
-    <google-signin-aware id="aware"
-      app-package-name="{{appPackageName}}"
-      client-id="{{clientId}}"
-      cookie-policy="{{cookiePolicy}}"
-      request-visible-actions="{{requestVisibleActions}}"
-      hosted-domain="{{hostedDomain}}"
-      offline="{{offline}}"
-      offline-always-prompt="{{offlineAlwaysPrompt}}"
-      scopes="{{scopes}}"
-      openid-prompt="{{openidPrompt}}"
-      initialized="{{initialized}}"
-      signed-in="{{signedIn}}"
-      is-authorized="{{isAuthorized}}"
-      need-additional-auth="{{needAdditionalAuth}}"
-      has-plus-scopes="{{hasPlusScopes}}"></google-signin-aware>
-    <template is="dom-if" if="{{raised}}">
-      <paper-material id="shadow" class="fit" elevation="2" animated></paper-material>
-    </template>
-    <div id="button"
-      class$="[[_computeButtonClass(height, width, theme, signedIn, _brand, needAdditionalAuth)]]">
-
-      <paper-ripple id="ripple" class="fit"></paper-ripple>
-      <!-- this div is needed to position the ripple behind text content -->
-      <div>
-        <template is="dom-if" if="{{_computeButtonIsSignIn(signedIn, needAdditionalAuth)}}">
-          <div class="button-content signIn" tabindex="0"
-              on-click="signIn" on-keydown="_signInKeyPress">
-            <span class="icon"><iron-icon icon="[[_brandIcon]]"></iron-icon></span>
-            <span class="buttonText">{{_labelSignin}}</span>
-          </div>
-        </template>
-        <template is="dom-if" if="{{_computeButtonIsSignOut(signedIn, needAdditionalAuth) }}">
-          <div class="button-content signOut" tabindex="0"
-              on-click="signOut" on-keydown="_signOutKeyPress">
-            <span class="icon"><iron-icon icon="[[_brandIcon]]"></iron-icon></span>
-            <span class="buttonText">{{labelSignout}}</span>
-          </div>
-        </template>
-        <template is="dom-if" if="{{_computeButtonIsSignOutAddl(signedIn, needAdditionalAuth) }}">
-          <div class="button-content signIn" tabindex="0"
-              on-click="signIn" on-keydown="_signInKeyPress">
-            <span class="icon"><iron-icon icon="[[_brandIcon]]"></iron-icon></span>
-            <span class="buttonText">{{labelAdditional}}</span>
-          </div>
-        </template>
-      </div>
-
-    </div>
-  </template>
-</dom-module>
-<script>
-  (function() {
-
-    /**
-     * Enum brand values.
-     * @readonly
-     * @enum {string}
-     */
-    var BrandValue = {
-        GOOGLE: 'google',
-        PLUS: 'google-plus'
-    };
-
-    /**
-     * Enum height values.
-     * @readonly
-     * @enum {string}
-     */
-    var HeightValue = {
-      SHORT: 'short',
-      STANDARD: 'standard',
-      TALL: 'tall'
-    };
-
-    /**
-     * Enum button label default values.
-     * @readonly
-     * @enum {string}
-     */
-    var LabelValue = {
-      STANDARD: 'Sign in',
-      WIDE: 'Sign in with Google',
-      WIDE_PLUS: 'Sign in with Google+'
-    };
-
-    /**
-     * Enum theme values.
-     * @readonly
-     * @enum {string}
-     */
-    var ThemeValue = {
-      LIGHT: 'light',
-      DARK: 'dark'
-    };
-
-    /**
-     * Enum width values.
-     * @readonly
-     * @enum {string}
-     */
-    var WidthValue = {
-      ICON_ONLY: 'iconOnly',
-      STANDARD: 'standard',
-      WIDE: 'wide'
-    };
-
-/**
-&lt;google-signin&gt; is used to authenticate with Google, allowing you to interact
-with other Google APIs such as Drive and Google+.
-
-<img style="max-width:100%;" src="https://cloud.githubusercontent.com/assets/107076/6791176/5c868822-d16a-11e4-918c-ec9b84a2db45.png"/>
-
-If you do not need to show the button, use companion `<google-signin-aware>` element to declare scopes, check authentication state.
-
-#### Examples
-
-    <google-signin client-id="..." scopes="https://www.googleapis.com/auth/drive"></google-signin>
-
-    <google-signin label-signin="Sign-in" client-id="..." scopes="https://www.googleapis.com/auth/drive"></google-signin>
-
-    <google-signin theme="dark" width="iconOnly" client-id="..." scopes="https://www.googleapis.com/auth/drive"></google-signin>
-
-
-#### Notes
-
-The attribute `clientId` is provided in your Google Developers Console
-(https://console.developers.google.com).
-
-The `scopes` attribute allows you to specify which scope permissions are required
-(e.g do you want to allow interaction with the Google Drive API). Many APIs also
-need to be enabled in the Google Developers Console before you can use them.
-
-The `requestVisibleActions` attribute is necessary if you want to write app
-activities (https://developers.google.com/+/web/app-activities/) on behalf of
-the user. Please note that this attribute is only valid in combination with the
-plus.login scope (https://www.googleapis.com/auth/plus.login).
-
-The `offline` attribute allows you to get an auth code which your server can
-redeem for an offline access token
-(https://developers.google.com/identity/sign-in/web/server-side-flow).
-You can also set `offline-always-prompt` instead of `offline` to ensure that your app
-will re-prompt the user for offline access and generate a working `refresh_token`
-even if they have already granted offline access to your app in the past.
-
-Use label properties to customize prompts.
-
-The button can be styled in using the `height`, `width`, and `theme` attributes.
-These attributes help you follow the Google+ Sign-In button branding guidelines
-(https://developers.google.com/+/branding-guidelines).
-
-The `google-signin-success` event is triggered when a user successfully authenticates
-and `google-signed-out` is triggered when user signs out.
-You can also use `isAuthorized` attribute to observe user's authentication state.
-
-Additional events, such as `google-signout-attempted` are
-triggered when the user attempts to sign-out and successfully signs out.
-
-When requesting offline access, the `google-signin-offline-success` event is
-triggered when the user successfully consents with offline support.
-
-The `google-signin-necessary` event is fired when scopes requested via
-google-signin-aware elements require additional user permissions.
-
-#### Testing
-
-By default, the demo accompanying this element is setup to work on localhost with
-port 8080. That said, you *should* update the `clientId` to your own one for
-any apps you're building. See the Google Developers Console
-(https://console.developers.google.com) for more info.
-
-@demo
-*/
-
-    Polymer({
-
-      is: 'google-signin',
-
-      /**
-       * Fired when user is signed in.
-       * You can use auth2 api to retrieve current user: `gapi.auth2.getAuthInstance()['currentUser'].get();`
-       * @event google-signin-success
-       */
-
-      /**
-       * Fired when the user is signed-out.
-       * @event google-signed-out
-       */
-
-      /**
-       * Fired if user requires additional authorization
-       * @event google-signin-necessary
-       */
-
-      /**
-       * Fired when signed in, and scope has been authorized
-       * @param {Object} result Authorization result.
-       * @event google-signin-aware-success
-       */
-
-      /**
-       * Fired when there is an error during the signin flow.
-       * @param {Object} detail The error object returned from the OAuth 2 flow.
-       * @event google-signin-aware-error
-       */
-
-      /**
-       * Fired when an offline authorization is successful.
-       * @param {{code: string}} detail -
-       *     code: The one-time authorization code from Google.
-       *         Your application can exchange this for an `access_token` and `refresh_token`
-       * @event google-signin-offline-success
-       */
-
-      /**
-       * This block is needed so the previous @param is not assigned to the next property.
-       */
-
-      properties: {
-        /**
-         * App package name for android over-the-air installs.
-         * See the relevant [docs](https://developers.google.com/+/web/signin/android-app-installs)
-         */
-        appPackageName: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * The brand being used for logo and styling.
-         *
-         * @default 'google'
-         */
-        brand: {
-          type: String,
-          value: ''
-        },
-
-        /** @private */
-        _brand: {
-          type: String,
-          computed: '_computeBrand(brand, hasPlusScopes)'
-        },
-
-        /**
-         * a Google Developers clientId reference
-         */
-        clientId: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * The cookie policy defines what URIs have access to the session cookie
-         * remembering the user's sign-in state.
-         * See the relevant [docs](https://developers.google.com/+/web/signin/reference#determining_a_value_for_cookie_policy) for more information.
-         *
-         * @default 'single_host_origin'
-         */
-        cookiePolicy: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * The height to use for the button.
-         *
-         * Available options: short, standard, tall.
-         *
-         * @type {string}
-         */
-        height: {
-          type: String,
-          value: 'standard'
-        },
-
-        /**
-         * By default the ripple expands to fill the button. Set this to true to
-         * constrain the ripple to a circle within the button.
-         */
-        fill: {
-          type: Boolean,
-          value: true
-        },
-
-        /**
-         * An optional label for the button for additional permissions.
-         */
-        labelAdditional: {
-          type: String,
-          value: 'Additional permissions required'
-        },
-
-        /**
-         * An optional label for the sign-in button.
-         */
-        labelSignin: {
-          type: String,
-          value: ''
-        },
-
-        _labelSignin: {
-          type: String,
-          computed: '_computeSigninLabel(labelSignin, width, _brand)'
-        },
-
-        /**
-         * An optional label for the sign-out button.
-         */
-        labelSignout: {
-          type: String,
-          value: 'Sign out'
-        },
-
-        /**
-         * If true, the button will be styled with a shadow.
-         */
-        raised: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * The app activity types you want to write on behalf of the user
-         * (e.g http://schemas.google.com/AddActivity)
-         */
-        requestVisibleActions: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * The Google Apps domain to which users must belong to sign in.
-         * See the relevant [docs](https://developers.google.com/identity/sign-in/web/reference) for more information.
-         */
-        hostedDomain: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * Allows for offline `access_token` retrieval during the signin process.
-         */
-        offline: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * Forces a re-prompt, even if the user has already granted offline
-         * access to your application in the past. You only need one of
-         * `offline` and `offlineAlwaysPrompt`.
-         */
-        offlineAlwaysPrompt: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * The scopes to provide access to (e.g https://www.googleapis.com/auth/drive)
-         * and should be space-delimited.
-         */
-        scopes: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * Space-delimited, case-sensitive list of strings that
-         * specifies whether the the user is prompted for reauthentication
-         * and/or consent. The defined values are:
-         *   none: do not display authentication or consent pages.
-         *     This value is mutually exclusive with the rest.
-         *   login: always prompt the user for reauthentication.
-         *   consent: always show consent screen.
-         *   select_account: always show account selection page.
-         *     This enables a user who has multiple accounts to select amongst
-         *     the multiple accounts that they might have current sessions for.
-         * For more information, see "prompt" parameter description in
-         * https://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters
-         */
-        openidPrompt: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * The theme to use for the button.
-         *
-         * Available options: light, dark.
-         *
-         * @attribute theme
-         * @type {string}
-         * @default 'dark'
-         */
-        theme: {
-          type: String,
-          value: 'light'
-        },
-
-        /**
-         * The width to use for the button.
-         *
-         * Available options: iconOnly, standard, wide.
-         *
-         * @type {string}
-         */
-        width: {
-          type: String,
-          value: 'standard'
-        },
-
-        _brandIcon: {
-          type: String,
-          computed: '_computeIcon(_brand)'
-        },
-
-        /**
-         * True if *any* element has google+ scopes
-         */
-        hasPlusScopes: {
-          type: Boolean,
-          notify: true,
-          value: false
-        },
-
-        /**
-         * True if additional authorization required globally
-         */
-        needAdditionalAuth: {
-          type: Boolean,
-          notify: true,
-          value: false
-        },
-
-        /**
-         * True when the auth library has been initialized, and signedIn property value is set from the first api response.
-         */
-        initialized: {
-          type: Boolean,
-          notify: true,
-          value: false
-        },
-
-        /**
-         * Is user signed in?
-         */
-        signedIn: {
-          type: Boolean,
-          notify: true,
-          value: false,
-          observer: '_observeSignedIn'
-        },
-
-        /**
-         * True if authorizations for *this* element have been granted
-         */
-        isAuthorized: {
-          type: Boolean,
-          notify: true,
-          value: false
-        }
-
-      },
-
-      _computeButtonClass: function(height, width, theme, signedIn, brand, needAdditionalAuth) {
-        return "height-" + height + " width-" + width + " theme-" + theme + " signedIn-" + signedIn + " brand-" + brand + "  additionalAuth-" + needAdditionalAuth;
-      },
-
-      _computeIcon: function(brand) {
-        return "google:" + brand;
-      },
-
-      /* Button state computed */
-      _computeButtonIsSignIn: function(signedIn, additionalAuth) {
-        return !signedIn;
-      },
-
-      _computeButtonIsSignOut: function(signedIn, additionalAuth) {
-        return signedIn && !additionalAuth;
-      },
-
-      _computeButtonIsSignOutAddl: function(signedIn, additionalAuth) {
-        return signedIn && additionalAuth;
-      },
-
-      _computeBrand: function(attrBrand, hasPlusScopes) {
-        var newBrand;
-        if (attrBrand) {
-          newBrand = attrBrand;
-        } else if (hasPlusScopes) {
-          newBrand = BrandValue.PLUS;
-        } else {
-          newBrand = BrandValue.GOOGLE;
-        };
-        return newBrand;
-      },
-
-      _observeSignedIn: function(newVal, oldVal) {
-        if (newVal) {
-          if (this.needAdditionalAuth) {
-            this.fire('google-signin-necessary');
-          }
-          this.fire('google-signin-success');
-        }
-        // Use `oldVal` avoids to fire the event at the initialization of
-        // `signedIn`.
-        else if (oldVal) {
-          this.fire('google-signed-out');
-        }
-      },
-
-      /**
-       * Determines the proper label based on the attributes.
-       */
-      _computeSigninLabel: function(labelSignin, width, _brand) {
-        if (labelSignin) {
-          return labelSignin;
-        } else {
-          switch(width) {
-
-            case WidthValue.WIDE:
-              return (_brand == BrandValue.PLUS) ?
-                LabelValue.WIDE_PLUS : LabelValue.WIDE;
-
-            case WidthValue.STANDARD:
-              return LabelValue.STANDARD;
-
-            case WidthValue.ICON_ONLY:
-              return '';
-
-            default:
-              console.warn("bad width value: ", width);
-              return LabelValue.STANDARD;
-          }
-        }
-      },
-
-      /** Sign in user. Opens the authorization dialog for signing in.
-       * The dialog will be blocked by a popup blocker unless called inside click handler.
-       */
-      signIn: function () {
-        this.$.aware.signIn();
-      },
-
-      _signInKeyPress: function (e) {
-        if (e.which == 13 || e.keyCode == 13 || e.which == 32 || e.keyCode == 32) {
-          e.preventDefault();
-          this.signIn();
-        }
-      },
-
-      /** Sign out the user */
-      signOut: function () {
-        this.fire('google-signout-attempted');
-        this.$.aware.signOut();
-      },
-
-      _signOutKeyPress: function (e) {
-        if (e.which == 13 || e.keyCode == 13 || e.which == 32 || e.keyCode == 32) {
-          e.preventDefault();
-          this.signOut();
-        }
-      }
-    });
-  }());
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/google-signin/index.html b/systrace/catapult/third_party/polymer/components/google-signin/index.html
deleted file mode 100644
index e8f85ae..0000000
--- a/systrace/catapult/third_party/polymer/components/google-signin/index.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html>
-<!-- Copyright (c) 2014 Google Inc. All rights reserved. -->
-<html>
-<head>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/README.md b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/README.md
deleted file mode 100644
index 8b997a3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-a11y-announcer.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-announcer.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-announcer)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-a11y-announcer)_
-
-
-##&lt;iron-a11y-announcer&gt;
-
-`iron-a11y-announcer` is a singleton element that is intended to add a11y
-to features that require on-demand announcement from screen readers. In
-order to make use of the announcer, it is best to request its availability
-in the announcing element.
-
-Example:
-
-```javascript
-Polymer({
-
-  is: 'x-chatty',
-
-  attached: function() {
-    // This will create the singleton element if it has not
-    // been created yet:
-    Polymer.IronA11yAnnouncer.requestAvailability();
-  }
-});
-```
-
-After the `iron-a11y-announcer` has been made available, elements can
-make announces by firing bubbling `iron-announce` events.
-
-Example:
-
-```javascript
-this.fire('iron-announce', {
-  text: 'This is an announcement!'
-}, { bubbles: true });
-```
-
-Note: announcements are only audible if you have a screen reader enabled.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/bower.json b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/bower.json
deleted file mode 100644
index 8e96301..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "iron-a11y-announcer",
-  "version": "1.0.6",
-  "description": "A singleton element that simplifies announcing text to screen readers.",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "a11y",
-    "live"
-  ],
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-a11y-announcer.git"
-  },
-  "main": "iron-a11y-announcer.html",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "dependencies": {
-    "polymer": "polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "paper-button": "polymerelements/paper-button#^1.0.0",
-    "paper-styles": "polymerelements/paper-styles#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/demo/index.html
deleted file mode 100644
index 0dd286a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/demo/index.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>iron-a11y-announcer demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="x-announces.html">
-
-</head>
-<body>
-  <div class="horizontal-section-container">
-    <div>
-      <div class="vertical-section">
-        <span>Note: in order to hear the announcements, be sure to turn on your favorite screen reader!</span>
-        <x-announces>Hello, my name is Ava.</x-announces>
-        <x-announces>This true sentence is false.</x-announces>
-        <x-announces>Are you paying attention?</x-announces>
-      </div>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/demo/x-announces.html b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/demo/x-announces.html
deleted file mode 100644
index 15c43c0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/demo/x-announces.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!--
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
-The complete set of authors may be found at http://polymer.github.io/AUTHORS
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../paper-button/paper-button.html">
-<link rel="import" href="../iron-a11y-announcer.html">
-
-<dom-module id="x-announces">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-        padding: 1em 0;
-      }
-
-      paper-button {
-        background: #4285f4;
-        color: #fff;
-      }
-    </style>
-
-    <paper-button on-tap="_onTapAnnounce" raised>Announce</paper-button>
-    <span id="content" aria-hidden="true">
-      <content></content>
-    </span>
-  </template>
-  <script>
-    Polymer({
-      is: 'x-announces',
-
-      attached: function() {
-        Polymer.IronA11yAnnouncer.requestAvailability();
-      },
-
-      _onTapAnnounce: function() {
-        this.fire('iron-announce', {
-          text: this.$.content.textContent.trim()
-        }, {
-          bubbles: true
-        });
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/index.html b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/index.html
deleted file mode 100644
index 1f8889a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-a11y-announcer</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/iron-a11y-announcer.html b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/iron-a11y-announcer.html
deleted file mode 100644
index e2bec4e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/iron-a11y-announcer.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-`iron-a11y-announcer` is a singleton element that is intended to add a11y
-to features that require on-demand announcement from screen readers. In
-order to make use of the announcer, it is best to request its availability
-in the announcing element.
-
-Example:
-
-    Polymer({
-
-      is: 'x-chatty',
-
-      attached: function() {
-        // This will create the singleton element if it has not
-        // been created yet:
-        Polymer.IronA11yAnnouncer.requestAvailability();
-      }
-    });
-
-After the `iron-a11y-announcer` has been made available, elements can
-make announces by firing bubbling `iron-announce` events.
-
-Example:
-
-    this.fire('iron-announce', {
-      text: 'This is an announcement!'
-    }, { bubbles: true });
-
-Note: announcements are only audible if you have a screen reader enabled.
-
-@group Iron Elements
-@demo demo/index.html
--->
-
-<dom-module id="iron-a11y-announcer">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        position: fixed;
-        clip: rect(0px,0px,0px,0px);
-      }
-    </style>
-    <div aria-live$="[[mode]]">[[_text]]</div>
-  </template>
-</dom-module>
-<script>
-'use strict';
-(function() {
-  'use strict';
-  Polymer.IronA11yAnnouncer = Polymer({
-    is: 'iron-a11y-announcer',
-
-    properties: {
-
-      /**
-        * The value of mode is used to set the `aria-live` attribute
-        * for the element that will be announced. Valid values are: `off`,
-        * `polite` and `assertive`.
-        */
-      mode: {
-        type: String,
-        value: 'polite'
-      },
-
-      _text: {
-        type: String,
-        value: ''
-      }
-    },
-
-    created: function() {
-      if (!Polymer.IronA11yAnnouncer.instance) {
-        Polymer.IronA11yAnnouncer.instance = this;
-      }
-
-      document.body.addEventListener('iron-announce', this._onIronAnnounce.bind(this));
-    },
-
-    /**
-      * Cause a text string to be announced by screen readers.
-      *
-      * @param {string} text The text that should be announced.
-      */
-    announce: function(text) {
-      this._text = '';
-      this.async(function() {
-        this._text = text;
-      }, 100);
-    },
-
-    _onIronAnnounce: function(event) {
-      if (event.detail && event.detail.text) {
-        this.announce(event.detail.text);
-      }
-    }
-  });
-
-  Polymer.IronA11yAnnouncer.instance = null;
-
-  Polymer.IronA11yAnnouncer.requestAvailability = function() {
-    if (!Polymer.IronA11yAnnouncer.instance) {
-      Polymer.IronA11yAnnouncer.instance = document.createElement('iron-a11y-announcer');
-    }
-
-    document.body.appendChild(Polymer.IronA11yAnnouncer.instance);
-  };
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/test/index.html b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/test/index.html
deleted file mode 100644
index 4307eb3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-    <meta charset="utf-8">
-    <title>iron-a11y-announcer tests</title>
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'iron-a11y-announcer.html',
-        'iron-a11y-announcer.html?dom=shadow'
-      ]);
-    </script>
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/test/iron-a11y-announcer.html b/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/test/iron-a11y-announcer.html
deleted file mode 100644
index 510bf6f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-announcer/test/iron-a11y-announcer.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>iron-a11y-announcer</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../iron-a11y-announcer.html">
-</head>
-<body>
-
-  <test-fixture id="Announcer">
-    <template>
-      <iron-a11y-announcer></iron-a11y-announcer>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('<iron-a11y-announcer>', function() {
-      var announcer;
-
-      setup(function() {
-        announcer = fixture('Announcer');
-      });
-
-      test('announces when there is an iron-announce event', function() {
-        var event = new CustomEvent('iron-announce', {
-          bubbles: true,
-          detail: {
-            text: 'foo'
-          }
-        });
-
-        sinon.spy(announcer, 'announce');
-
-        document.body.dispatchEvent(event);
-
-        expect(announcer.announce.callCount).to.be.equal(1);
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/README.md
deleted file mode 100644
index b094987..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-a11y-keys-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-a11y-keys-behavior)_
-
-
-##Polymer.IronA11yKeysBehavior
-
-`Polymer.IronA11yKeysBehavior` provides a normalized interface for processing
-keyboard commands that pertain to [WAI-ARIA best practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding).
-The element takes care of browser differences with respect to Keyboard events
-and uses an expressive syntax to filter key presses.
-
-Use the `keyBindings` prototype property to express what combination of keys
-will trigger the callback. A key binding has the format
-`"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
-`"KEY:EVENT": "callback"` are valid as well). Some examples:
-
-```javascript
- keyBindings: {
-   'space': '_onKeydown', // same as 'space:keydown'
-   'shift+tab': '_onKeydown',
-   'enter:keypress': '_onKeypress',
-   'esc:keyup': '_onKeyup'
- }
-```
-
-The callback will receive with an event containing the following information in `event.detail`:
-
-```javascript
- _onKeydown: function(event) {
-   console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
-   console.log(event.detail.key); // KEY only, e.g. "tab"
-   console.log(event.detail.event); // EVENT, e.g. "keydown"
-   console.log(event.detail.keyboardEvent); // the original KeyboardEvent
- }
-```
-
-Use the `keyEventTarget` attribute to set up event handlers on a specific
-node.
-
-See the [demo source code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
-for an example.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/bower.json
deleted file mode 100644
index 9ad8c92..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "iron-a11y-keys-behavior",
-  "version": "1.1.9",
-  "description": "A behavior that enables keybindings for greater a11y.",
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "a11y",
-    "input"
-  ],
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-a11y-keys-behavior.git"
-  },
-  "main": "iron-a11y-keys-behavior.html",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "paper-styles": "PolymerElements/paper-styles#^1.0.2",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/demo/index.html
deleted file mode 100644
index 2c3fec7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/demo/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>Iron A11y Keys Behavior demo</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="x-key-aware.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-</head>
-<body>
-  <div class="vertical-section vertical-section-container centered">
-      <x-key-aware></x-key-aware>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/demo/x-key-aware.html b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/demo/x-key-aware.html
deleted file mode 100644
index 5914bb9..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/demo/x-key-aware.html
+++ /dev/null
@@ -1,105 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../paper-styles/color.html">
-<link rel="import" href="../iron-a11y-keys-behavior.html">
-
-<dom-module id="x-key-aware">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-      }
-
-      pre {
-        color: var(--google-blue-700);
-      }
-
-      .keys {
-        line-height: 25px;
-      }
-
-      .keys span {
-        cursor: default;
-        background-color: var(--google-grey-100);
-        border: 1px solid var(--google-grey-300);
-        padding: 1px 5px;
-        border-radius: 5px;
-      }
-    </style>
-
-    <h4>Press any of these keys</h4>
-    <input type="checkbox" checked="{{preventDefault::change}}"> prevent default = {{preventDefault}}
-    <p class="keys">
-      <template is="dom-repeat" items="[[boundKeys]]">
-        <span>{{item}}</span>
-      </template>
-    </p>
-    <pre>[[pressed]]</pre>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'x-key-aware',
-
-    behaviors: [
-      Polymer.IronA11yKeysBehavior
-    ],
-
-    properties: {
-      pressed: {
-        type: String,
-        readOnly: true,
-        value: ''
-      },
-
-      boundKeys: {
-        type: Array,
-        value: function() {
-          return Object.keys(this.keyBindings).join(' ').split(' ');
-        }
-      },
-
-      preventDefault: {
-        type: Boolean,
-        value: true,
-        notify: true
-      },
-
-      keyEventTarget: {
-        type: Object,
-        value: function() {
-          return document.body;
-        }
-      }
-    },
-
-    keyBindings: {
-      '* pageup pagedown left right down up home end space enter @ ~ " $ ? ! \\ + : # backspace': '_updatePressed',
-      'a': '_updatePressed',
-      'shift+a alt+a': '_updatePressed',
-      'shift+tab shift+space': '_updatePressed'
-    },
-
-    _updatePressed: function(event) {
-      console.log(event.detail);
-
-      if (this.preventDefault) {
-        event.preventDefault();
-      }
-      this._setPressed(
-        this.pressed + event.detail.combo + ' pressed!\n'
-      );
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/index.html
deleted file mode 100644
index c53ba6c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-a11y-keys-behavior</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html
deleted file mode 100644
index 840d357..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html
+++ /dev/null
@@ -1,496 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-  (function() {
-    'use strict';
-
-    /**
-     * Chrome uses an older version of DOM Level 3 Keyboard Events
-     *
-     * Most keys are labeled as text, but some are Unicode codepoints.
-     * Values taken from: http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/keyset.html#KeySet-Set
-     */
-    var KEY_IDENTIFIER = {
-      'U+0008': 'backspace',
-      'U+0009': 'tab',
-      'U+001B': 'esc',
-      'U+0020': 'space',
-      'U+007F': 'del'
-    };
-
-    /**
-     * Special table for KeyboardEvent.keyCode.
-     * KeyboardEvent.keyIdentifier is better, and KeyBoardEvent.key is even better
-     * than that.
-     *
-     * Values from: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode#Value_of_keyCode
-     */
-    var KEY_CODE = {
-      8: 'backspace',
-      9: 'tab',
-      13: 'enter',
-      27: 'esc',
-      33: 'pageup',
-      34: 'pagedown',
-      35: 'end',
-      36: 'home',
-      32: 'space',
-      37: 'left',
-      38: 'up',
-      39: 'right',
-      40: 'down',
-      46: 'del',
-      106: '*'
-    };
-
-    /**
-     * MODIFIER_KEYS maps the short name for modifier keys used in a key
-     * combo string to the property name that references those same keys
-     * in a KeyboardEvent instance.
-     */
-    var MODIFIER_KEYS = {
-      'shift': 'shiftKey',
-      'ctrl': 'ctrlKey',
-      'alt': 'altKey',
-      'meta': 'metaKey'
-    };
-
-    /**
-     * KeyboardEvent.key is mostly represented by printable character made by
-     * the keyboard, with unprintable keys labeled nicely.
-     *
-     * However, on OS X, Alt+char can make a Unicode character that follows an
-     * Apple-specific mapping. In this case, we fall back to .keyCode.
-     */
-    var KEY_CHAR = /[a-z0-9*]/;
-
-    /**
-     * Matches a keyIdentifier string.
-     */
-    var IDENT_CHAR = /U\+/;
-
-    /**
-     * Matches arrow keys in Gecko 27.0+
-     */
-    var ARROW_KEY = /^arrow/;
-
-    /**
-     * Matches space keys everywhere (notably including IE10's exceptional name
-     * `spacebar`).
-     */
-    var SPACE_KEY = /^space(bar)?/;
-
-    /**
-     * Matches ESC key.
-     *
-     * Value from: http://w3c.github.io/uievents-key/#key-Escape
-     */
-    var ESC_KEY = /^escape$/;
-
-    /**
-     * Transforms the key.
-     * @param {string} key The KeyBoardEvent.key
-     * @param {Boolean} [noSpecialChars] Limits the transformation to
-     * alpha-numeric characters.
-     */
-    function transformKey(key, noSpecialChars) {
-      var validKey = '';
-      if (key) {
-        var lKey = key.toLowerCase();
-        if (lKey === ' ' || SPACE_KEY.test(lKey)) {
-          validKey = 'space';
-        } else if (ESC_KEY.test(lKey)) {
-          validKey = 'esc';
-        } else if (lKey.length == 1) {
-          if (!noSpecialChars || KEY_CHAR.test(lKey)) {
-            validKey = lKey;
-          }
-        } else if (ARROW_KEY.test(lKey)) {
-          validKey = lKey.replace('arrow', '');
-        } else if (lKey == 'multiply') {
-          // numpad '*' can map to Multiply on IE/Windows
-          validKey = '*';
-        } else {
-          validKey = lKey;
-        }
-      }
-      return validKey;
-    }
-
-    function transformKeyIdentifier(keyIdent) {
-      var validKey = '';
-      if (keyIdent) {
-        if (keyIdent in KEY_IDENTIFIER) {
-          validKey = KEY_IDENTIFIER[keyIdent];
-        } else if (IDENT_CHAR.test(keyIdent)) {
-          keyIdent = parseInt(keyIdent.replace('U+', '0x'), 16);
-          validKey = String.fromCharCode(keyIdent).toLowerCase();
-        } else {
-          validKey = keyIdent.toLowerCase();
-        }
-      }
-      return validKey;
-    }
-
-    function transformKeyCode(keyCode) {
-      var validKey = '';
-      if (Number(keyCode)) {
-        if (keyCode >= 65 && keyCode <= 90) {
-          // ascii a-z
-          // lowercase is 32 offset from uppercase
-          validKey = String.fromCharCode(32 + keyCode);
-        } else if (keyCode >= 112 && keyCode <= 123) {
-          // function keys f1-f12
-          validKey = 'f' + (keyCode - 112);
-        } else if (keyCode >= 48 && keyCode <= 57) {
-          // top 0-9 keys
-          validKey = String(keyCode - 48);
-        } else if (keyCode >= 96 && keyCode <= 105) {
-          // num pad 0-9
-          validKey = String(keyCode - 96);
-        } else {
-          validKey = KEY_CODE[keyCode];
-        }
-      }
-      return validKey;
-    }
-
-    /**
-      * Calculates the normalized key for a KeyboardEvent.
-      * @param {KeyboardEvent} keyEvent
-      * @param {Boolean} [noSpecialChars] Set to true to limit keyEvent.key
-      * transformation to alpha-numeric chars. This is useful with key
-      * combinations like shift + 2, which on FF for MacOS produces
-      * keyEvent.key = @
-      * To get 2 returned, set noSpecialChars = true
-      * To get @ returned, set noSpecialChars = false
-     */
-    function normalizedKeyForEvent(keyEvent, noSpecialChars) {
-      // Fall back from .key, to .detail.key for artifical keyboard events,
-      // and then to deprecated .keyIdentifier and .keyCode.
-      if (keyEvent.key) {
-        return transformKey(keyEvent.key, noSpecialChars);
-      }
-      if (keyEvent.detail && keyEvent.detail.key) {
-        return transformKey(keyEvent.detail.key, noSpecialChars);
-      }
-      return transformKeyIdentifier(keyEvent.keyIdentifier) ||
-        transformKeyCode(keyEvent.keyCode) || '';
-    }
-
-    function keyComboMatchesEvent(keyCombo, event) {
-      // For combos with modifiers we support only alpha-numeric keys
-      var keyEvent = normalizedKeyForEvent(event, keyCombo.hasModifiers);
-      return keyEvent === keyCombo.key &&
-        (!keyCombo.hasModifiers || (
-          !!event.shiftKey === !!keyCombo.shiftKey &&
-          !!event.ctrlKey === !!keyCombo.ctrlKey &&
-          !!event.altKey === !!keyCombo.altKey &&
-          !!event.metaKey === !!keyCombo.metaKey)
-        );
-    }
-
-    function parseKeyComboString(keyComboString) {
-      if (keyComboString.length === 1) {
-        return {
-          combo: keyComboString,
-          key: keyComboString,
-          event: 'keydown'
-        };
-      }
-      return keyComboString.split('+').reduce(function(parsedKeyCombo, keyComboPart) {
-        var eventParts = keyComboPart.split(':');
-        var keyName = eventParts[0];
-        var event = eventParts[1];
-
-        if (keyName in MODIFIER_KEYS) {
-          parsedKeyCombo[MODIFIER_KEYS[keyName]] = true;
-          parsedKeyCombo.hasModifiers = true;
-        } else {
-          parsedKeyCombo.key = keyName;
-          parsedKeyCombo.event = event || 'keydown';
-        }
-
-        return parsedKeyCombo;
-      }, {
-        combo: keyComboString.split(':').shift()
-      });
-    }
-
-    function parseEventString(eventString) {
-      return eventString.trim().split(' ').map(function(keyComboString) {
-        return parseKeyComboString(keyComboString);
-      });
-    }
-
-    /**
-     * `Polymer.IronA11yKeysBehavior` provides a normalized interface for processing
-     * keyboard commands that pertain to [WAI-ARIA best practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding).
-     * The element takes care of browser differences with respect to Keyboard events
-     * and uses an expressive syntax to filter key presses.
-     *
-     * Use the `keyBindings` prototype property to express what combination of keys
-     * will trigger the callback. A key binding has the format
-     * `"KEY+MODIFIER:EVENT": "callback"` (`"KEY": "callback"` or
-     * `"KEY:EVENT": "callback"` are valid as well). Some examples:
-     *
-     *      keyBindings: {
-     *        'space': '_onKeydown', // same as 'space:keydown'
-     *        'shift+tab': '_onKeydown',
-     *        'enter:keypress': '_onKeypress',
-     *        'esc:keyup': '_onKeyup'
-     *      }
-     *
-     * The callback will receive with an event containing the following information in `event.detail`:
-     *
-     *      _onKeydown: function(event) {
-     *        console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab"
-     *        console.log(event.detail.key); // KEY only, e.g. "tab"
-     *        console.log(event.detail.event); // EVENT, e.g. "keydown"
-     *        console.log(event.detail.keyboardEvent); // the original KeyboardEvent
-     *      }
-     *
-     * Use the `keyEventTarget` attribute to set up event handlers on a specific
-     * node.
-     *
-     * See the [demo source code](https://github.com/PolymerElements/iron-a11y-keys-behavior/blob/master/demo/x-key-aware.html)
-     * for an example.
-     *
-     * @demo demo/index.html
-     * @polymerBehavior
-     */
-    Polymer.IronA11yKeysBehavior = {
-      properties: {
-        /**
-         * The EventTarget that will be firing relevant KeyboardEvents. Set it to
-         * `null` to disable the listeners.
-         * @type {?EventTarget}
-         */
-        keyEventTarget: {
-          type: Object,
-          value: function() {
-            return this;
-          }
-        },
-
-        /**
-         * If true, this property will cause the implementing element to
-         * automatically stop propagation on any handled KeyboardEvents.
-         */
-        stopKeyboardEventPropagation: {
-          type: Boolean,
-          value: false
-        },
-
-        _boundKeyHandlers: {
-          type: Array,
-          value: function() {
-            return [];
-          }
-        },
-
-        // We use this due to a limitation in IE10 where instances will have
-        // own properties of everything on the "prototype".
-        _imperativeKeyBindings: {
-          type: Object,
-          value: function() {
-            return {};
-          }
-        }
-      },
-
-      observers: [
-        '_resetKeyEventListeners(keyEventTarget, _boundKeyHandlers)'
-      ],
-
-
-      /**
-       * To be used to express what combination of keys  will trigger the relative
-       * callback. e.g. `keyBindings: { 'esc': '_onEscPressed'}`
-       * @type {!Object}
-       */
-      keyBindings: {},
-
-      registered: function() {
-        this._prepKeyBindings();
-      },
-
-      attached: function() {
-        this._listenKeyEventListeners();
-      },
-
-      detached: function() {
-        this._unlistenKeyEventListeners();
-      },
-
-      /**
-       * Can be used to imperatively add a key binding to the implementing
-       * element. This is the imperative equivalent of declaring a keybinding
-       * in the `keyBindings` prototype property.
-       */
-      addOwnKeyBinding: function(eventString, handlerName) {
-        this._imperativeKeyBindings[eventString] = handlerName;
-        this._prepKeyBindings();
-        this._resetKeyEventListeners();
-      },
-
-      /**
-       * When called, will remove all imperatively-added key bindings.
-       */
-      removeOwnKeyBindings: function() {
-        this._imperativeKeyBindings = {};
-        this._prepKeyBindings();
-        this._resetKeyEventListeners();
-      },
-
-      /**
-       * Returns true if a keyboard event matches `eventString`.
-       *
-       * @param {KeyboardEvent} event
-       * @param {string} eventString
-       * @return {boolean}
-       */
-      keyboardEventMatchesKeys: function(event, eventString) {
-        var keyCombos = parseEventString(eventString);
-        for (var i = 0; i < keyCombos.length; ++i) {
-          if (keyComboMatchesEvent(keyCombos[i], event)) {
-            return true;
-          }
-        }
-        return false;
-      },
-
-      _collectKeyBindings: function() {
-        var keyBindings = this.behaviors.map(function(behavior) {
-          return behavior.keyBindings;
-        });
-
-        if (keyBindings.indexOf(this.keyBindings) === -1) {
-          keyBindings.push(this.keyBindings);
-        }
-
-        return keyBindings;
-      },
-
-      _prepKeyBindings: function() {
-        this._keyBindings = {};
-
-        this._collectKeyBindings().forEach(function(keyBindings) {
-          for (var eventString in keyBindings) {
-            this._addKeyBinding(eventString, keyBindings[eventString]);
-          }
-        }, this);
-
-        for (var eventString in this._imperativeKeyBindings) {
-          this._addKeyBinding(eventString, this._imperativeKeyBindings[eventString]);
-        }
-
-        // Give precedence to combos with modifiers to be checked first.
-        for (var eventName in this._keyBindings) {
-          this._keyBindings[eventName].sort(function (kb1, kb2) {
-            var b1 = kb1[0].hasModifiers;
-            var b2 = kb2[0].hasModifiers;
-            return (b1 === b2) ? 0 : b1 ? -1 : 1;
-          })
-        }
-      },
-
-      _addKeyBinding: function(eventString, handlerName) {
-        parseEventString(eventString).forEach(function(keyCombo) {
-          this._keyBindings[keyCombo.event] =
-            this._keyBindings[keyCombo.event] || [];
-
-          this._keyBindings[keyCombo.event].push([
-            keyCombo,
-            handlerName
-          ]);
-        }, this);
-      },
-
-      _resetKeyEventListeners: function() {
-        this._unlistenKeyEventListeners();
-
-        if (this.isAttached) {
-          this._listenKeyEventListeners();
-        }
-      },
-
-      _listenKeyEventListeners: function() {
-        if (!this.keyEventTarget) {
-          return;
-        }
-        Object.keys(this._keyBindings).forEach(function(eventName) {
-          var keyBindings = this._keyBindings[eventName];
-          var boundKeyHandler = this._onKeyBindingEvent.bind(this, keyBindings);
-
-          this._boundKeyHandlers.push([this.keyEventTarget, eventName, boundKeyHandler]);
-
-          this.keyEventTarget.addEventListener(eventName, boundKeyHandler);
-        }, this);
-      },
-
-      _unlistenKeyEventListeners: function() {
-        var keyHandlerTuple;
-        var keyEventTarget;
-        var eventName;
-        var boundKeyHandler;
-
-        while (this._boundKeyHandlers.length) {
-          // My kingdom for block-scope binding and destructuring assignment..
-          keyHandlerTuple = this._boundKeyHandlers.pop();
-          keyEventTarget = keyHandlerTuple[0];
-          eventName = keyHandlerTuple[1];
-          boundKeyHandler = keyHandlerTuple[2];
-
-          keyEventTarget.removeEventListener(eventName, boundKeyHandler);
-        }
-      },
-
-      _onKeyBindingEvent: function(keyBindings, event) {
-        if (this.stopKeyboardEventPropagation) {
-          event.stopPropagation();
-        }
-
-        // if event has been already prevented, don't do anything
-        if (event.defaultPrevented) {
-          return;
-        }
-
-        for (var i = 0; i < keyBindings.length; i++) {
-          var keyCombo = keyBindings[i][0];
-          var handlerName = keyBindings[i][1];
-          if (keyComboMatchesEvent(keyCombo, event)) {
-            this._triggerKeyHandler(keyCombo, handlerName, event);
-            // exit the loop if eventDefault was prevented
-            if (event.defaultPrevented) {
-              return;
-            }
-          }
-        }
-      },
-
-      _triggerKeyHandler: function(keyCombo, handlerName, keyboardEvent) {
-        var detail = Object.create(keyCombo);
-        detail.keyboardEvent = keyboardEvent;
-        var event = new CustomEvent(keyCombo.event, {
-          detail: detail,
-          cancelable: true
-        });
-        this[handlerName].call(this, event);
-        if (event.defaultPrevented) {
-          keyboardEvent.preventDefault();
-        }
-      }
-    };
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/test/basic-test.html b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/test/basic-test.html
deleted file mode 100644
index d6947ac..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/test/basic-test.html
+++ /dev/null
@@ -1,445 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>iron-a11y-keys</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../iron-a11y-keys-behavior.html">
-</head>
-<body>
-  <test-fixture id="BasicKeys">
-    <template>
-      <x-a11y-basic-keys></x-a11y-basic-keys>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="NonPropagatingKeys">
-    <template>
-      <x-a11y-basic-keys stop-keyboard-event-propagation></x-a11y-basic-keys>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ComboKeys">
-    <template>
-      <x-a11y-combo-keys></x-a11y-combo-keys>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="AlternativeEventKeys">
-    <template>
-      <x-a11y-alternate-event-keys></x-a11y-alternate-event-keys>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="BehaviorKeys">
-    <template>
-      <x-a11y-behavior-keys></x-a11y-behavior-keys>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="PreventKeys">
-    <template>
-      <x-a11y-prevent-keys></x-a11y-prevent-keys>
-    </template>
-  </test-fixture>
-
-  <script>
-suite('Polymer.IronA11yKeysBehavior', function() {
-  var keys;
-
-  suiteSetup(function() {
-    var KeysTestBehavior = [Polymer.IronA11yKeysBehavior, {
-      properties: {
-        keyCount: {
-          type: Number,
-          value: 0
-        }
-      },
-
-      _keyHandler: function(event) {
-        this.keyCount++;
-        this.lastEvent = event;
-      },
-
-      // Same as _keyHandler, used to distinguish who's called before who.
-      _keyHandler2: function(event) {
-        this.keyCount++;
-        this.lastEvent = event;
-      },
-
-      _preventDefaultHandler: function(event) {
-        event.preventDefault();
-        this.keyCount++;
-        this.lastEvent = event;
-      }
-    }];
-
-    Polymer({
-      is: 'x-a11y-basic-keys',
-
-      behaviors: [
-        KeysTestBehavior
-      ],
-
-      keyBindings: {
-        'space': '_keyHandler',
-        '@': '_keyHandler',
-        'esc': '_keyHandler'
-      }
-    });
-
-    Polymer({
-      is: 'x-a11y-combo-keys',
-
-      behaviors: [
-        KeysTestBehavior
-      ],
-
-      keyBindings: {
-        'enter': '_keyHandler2',
-        'ctrl+shift+a shift+enter': '_keyHandler'
-      }
-    });
-
-    Polymer({
-      is: 'x-a11y-alternate-event-keys',
-
-      behaviors: [
-        KeysTestBehavior
-      ],
-
-      keyBindings: {
-        'space:keyup': '_keyHandler'
-      }
-    });
-
-    var XA11yBehavior = {
-      keyBindings: {
-        'enter': '_keyHandler'
-      }
-    };
-
-    Polymer({
-      is: 'x-a11y-behavior-keys',
-
-      behaviors: [
-        KeysTestBehavior,
-        XA11yBehavior
-      ],
-
-      keyBindings: {
-        'enter': '_keyHandler'
-      }
-    });
-
-    Polymer({
-      is: 'x-a11y-prevent-keys',
-
-      behaviors: [
-        KeysTestBehavior,
-        XA11yBehavior
-      ],
-
-      keyBindings: {
-        'space a': '_keyHandler',
-        'enter shift+a': '_preventDefaultHandler'
-      }
-    });
-  });
-
-  suite('basic keys', function() {
-    setup(function() {
-      keys = fixture('BasicKeys');
-    });
-
-    test('trigger the handler when the specified key is pressed', function() {
-      MockInteractions.pressSpace(keys);
-
-      expect(keys.keyCount).to.be.equal(1);
-    });
-
-    test('keyEventTarget can be null, and disables listeners', function() {
-      keys.keyEventTarget = null;
-      MockInteractions.pressSpace(keys);
-
-      expect(keys.keyCount).to.be.equal(0);
-    });
-
-    test('trigger the handler when the specified key is pressed together with a modifier', function() {
-      var event = new CustomEvent('keydown');
-      event.ctrlKey = true;
-      event.keyCode = event.code = 32;
-      keys.dispatchEvent(event);
-      expect(keys.keyCount).to.be.equal(1);
-    });
-
-    test('handles special character @', function() {
-      MockInteractions.pressAndReleaseKeyOn(keys, undefined, [], '@');
-
-      expect(keys.keyCount).to.be.equal(1);
-    });
-
-    test('handles variations of Esc key', function() {
-      MockInteractions.pressAndReleaseKeyOn(keys, undefined, [], 'Esc');
-      expect(keys.keyCount).to.be.equal(1);
-
-      MockInteractions.pressAndReleaseKeyOn(keys, undefined, [], 'Escape');
-      expect(keys.keyCount).to.be.equal(2);
-
-      MockInteractions.pressAndReleaseKeyOn(keys, 27, [], '');
-      expect(keys.keyCount).to.be.equal(3);
-    });
-
-    test('do not trigger the handler for non-specified keys', function() {
-      MockInteractions.pressEnter(keys);
-
-      expect(keys.keyCount).to.be.equal(0);
-    });
-
-    test('can have bindings added imperatively', function() {
-      keys.addOwnKeyBinding('enter', '_keyHandler');
-
-      MockInteractions.pressEnter(keys);
-      expect(keys.keyCount).to.be.equal(1);
-
-      MockInteractions.pressSpace(keys);
-      expect(keys.keyCount).to.be.equal(2);
-    });
-
-    test('can remove imperatively added bindings', function() {
-      keys.addOwnKeyBinding('enter', '_keyHandler');
-      keys.removeOwnKeyBindings();
-
-      MockInteractions.pressEnter(keys);
-      expect(keys.keyCount).to.be.equal(0);
-
-      MockInteractions.pressSpace(keys);
-      expect(keys.keyCount).to.be.equal(1);
-    });
-
-    test('allows propagation beyond the key combo handler', function() {
-      var keySpy = sinon.spy();
-      document.addEventListener('keydown', keySpy);
-
-      MockInteractions.pressEnter(keys);
-
-      expect(keySpy.callCount).to.be.equal(1);
-    });
-
-    suite('edge cases', function() {
-      test('knows that `spacebar` is the same as `space`', function() {
-        var event = new CustomEvent('keydown');
-        event.key = 'spacebar';
-        expect(keys.keyboardEventMatchesKeys(event, 'space')).to.be.equal(true);
-      });
-
-      test('handles `+`', function() {
-        var event = new CustomEvent('keydown');
-        event.key = '+';
-        expect(keys.keyboardEventMatchesKeys(event, '+')).to.be.equal(true);
-      });
-
-      test('handles `:`', function() {
-        var event = new CustomEvent('keydown');
-        event.key = ':';
-        expect(keys.keyboardEventMatchesKeys(event, ':')).to.be.equal(true);
-      });
-
-      test('handles ` ` (space)', function() {
-        var event = new CustomEvent('keydown');
-        event.key = ' ';
-        expect(keys.keyboardEventMatchesKeys(event, 'space')).to.be.equal(true);
-      });
-    });
-
-    suite('matching keyboard events to keys', function() {
-      test('can be done imperatively', function() {
-        var event = new CustomEvent('keydown');
-        event.keyCode = 65;
-        expect(keys.keyboardEventMatchesKeys(event, 'a')).to.be.equal(true);
-      });
-
-      test('can be done with a provided keyboardEvent', function() {
-        var event;
-        MockInteractions.pressSpace(keys);
-        event = keys.lastEvent;
-
-        expect(event.detail.keyboardEvent).to.be.okay;
-        expect(keys.keyboardEventMatchesKeys(event, 'space')).to.be.equal(true);
-      });
-
-      test('can handle variations in arrow key names', function() {
-        var event = new CustomEvent('keydown');
-        event.key = 'up';
-        expect(keys.keyboardEventMatchesKeys(event, 'up')).to.be.equal(true);
-        event.key = 'ArrowUp';
-        expect(keys.keyboardEventMatchesKeys(event, 'up')).to.be.equal(true);
-      });
-    });
-
-    suite('matching keyboard events to top row and number pad digit keys', function() {
-      test('top row can be done imperatively', function() {
-        var event = new CustomEvent('keydown');
-        event.keyCode = 49;
-        expect(keys.keyboardEventMatchesKeys(event, '1')).to.be.equal(true);
-      });
-
-      test('number pad digits can be done imperatively', function() {
-        var event = new CustomEvent('keydown');
-        event.keyCode = 97;
-        expect(keys.keyboardEventMatchesKeys(event, '1')).to.be.equal(true);
-      });
-    });
-  });
-
-  suite('combo keys', function() {
-    setup(function() {
-      keys = fixture('ComboKeys');
-    });
-
-    test('trigger the handler when the combo is pressed', function() {
-      var event = new CustomEvent('keydown');
-
-      event.ctrlKey = true;
-      event.shiftKey = true;
-      event.keyCode = event.code = 65;
-
-      keys.dispatchEvent(event);
-
-      expect(keys.keyCount).to.be.equal(1);
-    });
-
-    test('check if KeyBoardEvent.key is alpha-numberic', function() {
-      var event = new CustomEvent('keydown');
-
-      event.ctrlKey = true;
-      event.shiftKey = true;
-      event.key = 'A';
-
-      keys.dispatchEvent(event);
-
-      expect(keys.keyCount).to.be.equal(1);
-    });
-
-    test('trigger also bindings without modifiers', function() {
-      var event = new CustomEvent('keydown');
-      // Combo `shift+enter`.
-      event.shiftKey = true;
-      event.keyCode = event.code = 13;
-      keys.dispatchEvent(event);
-      expect(keys.keyCount).to.be.equal(2);
-    });
-
-    test('give precendence to combos with modifiers', function() {
-      var enterSpy = sinon.spy(keys, '_keyHandler2');
-      var shiftEnterSpy = sinon.spy(keys, '_keyHandler');
-      var event = new CustomEvent('keydown');
-      // Combo `shift+enter`.
-      event.shiftKey = true;
-      event.keyCode = event.code = 13;
-      keys.dispatchEvent(event);
-      expect(enterSpy.called).to.be.true;
-      expect(shiftEnterSpy.called).to.be.true;
-      expect(enterSpy.calledAfter(shiftEnterSpy)).to.be.true;
-    });
-
-  });
-
-  suite('alternative event keys', function() {
-    setup(function() {
-      keys = fixture('AlternativeEventKeys');
-    });
-
-    test('trigger on the specified alternative keyboard event', function() {
-      MockInteractions.keyDownOn(keys, 32);
-
-      expect(keys.keyCount).to.be.equal(0);
-
-      MockInteractions.keyUpOn(keys, 32);
-
-      expect(keys.keyCount).to.be.equal(1);
-    });
-  });
-
-  suite('behavior keys', function() {
-    setup(function() {
-      keys = fixture('BehaviorKeys');
-    });
-
-    test('bindings in other behaviors are transitive', function() {
-      MockInteractions.pressEnter(keys);
-      expect(keys.keyCount).to.be.equal(2);
-    });
-  });
-
-  suite('stopping propagation automatically', function() {
-    setup(function() {
-      keys = fixture('NonPropagatingKeys');
-    });
-
-    test('does not propagate key events beyond the combo handler', function() {
-      var keySpy = sinon.spy();
-
-      document.addEventListener('keydown', keySpy);
-
-      MockInteractions.pressEnter(keys);
-
-      expect(keySpy.callCount).to.be.equal(0);
-    });
-  });
-
-  suite('prevent default behavior of event', function() {
-    setup(function() {
-      keys = fixture('PreventKeys');
-    });
-
-    test('`defaultPrevented` is correctly set', function() {
-      MockInteractions.pressEnter(keys);
-      expect(keys.lastEvent.defaultPrevented).to.be.equal(true);
-    });
-
-    test('only 1 handler is invoked', function() {
-      var aSpy = sinon.spy(keys, '_keyHandler');
-      var shiftASpy = sinon.spy(keys, '_preventDefaultHandler');
-      var event = new CustomEvent('keydown', {
-        cancelable: true
-      });
-      // Combo `shift+a`.
-      event.shiftKey = true;
-      event.keyCode = event.code = 65;
-      keys.dispatchEvent(event);
-
-      expect(keys.keyCount).to.be.equal(1);
-      expect(shiftASpy.called).to.be.true;
-      expect(aSpy.called).to.be.false;
-    });
-  });
-
-  suite('remove key behavior with null target', function () {
-    test('add and remove a iron-a11y-keys-behavior', function () {
-      var element = document.createElement('x-a11y-basic-keys');
-      element.keyEventTarget = null;
-      document.body.appendChild(element);
-      document.body.removeChild(element);
-    });
-  });
-
-});
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/test/index.html
deleted file mode 100644
index d00850a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-a11y-keys-behavior/test/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-    @license
-    Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-    Code distributed by Google as part of the polymer project is also
-    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><!DOCTYPE html><html><head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-    <title>Tests</title>
-
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-
-  <body>
-    <script>
-      // Load and run all tests (.html, .js) as one suite:
-      WCT.loadSuites([
-        'basic-test.html',
-        'basic-test.html?dom=shadow'
-      ]);
-    </script>
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-ajax/CONTRIBUTING.md
deleted file mode 100644
index 543fda4..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/zeriha/2/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/zeriha/2/edit?html,output](https://jsbin.com/zeriha/2/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/README.md b/systrace/catapult/third_party/polymer/components/iron-ajax/README.md
deleted file mode 100644
index 7a1a369..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/README.md
+++ /dev/null
@@ -1,111 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-ajax.html  iron-request.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-ajax.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-ajax)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-ajax)_
-
-## Changes in 2.0
-
-*   Promise polyfill is now a dev dependency and no longer shipped with `iron-ajax`.
-
-    `iron-ajax` uses the `Promise` API, which is not yet supported in all browsers.
-
-    The 1.x version of `iron-ajax` automatically loaded the promise polyfill. This 
-    forced the application to include the polyfill, whether or not it was needed.
-
-    When using `iron-ajax` 2.x with Polymer 1.x, you must provide your own Promise polyfill, 
-    if needed. For example, you could use the promise polyfill by installing it in your project:
-
-        bower install --save PolymerLabs/promise-polyfill#1 - 2
-
-    Then your app should include the promise polyfill before loading `iron-ajax`:
-
-        <link rel="import" href="bower_components/promise-polyfill/promise-polyfill-lite.html">
-
-    You can use a different promise polyfill if you need a more fully-featured implementation of 
-    Promise.
-
-    For Polymer 2.x, you **do not need to provide your own Promise polyfill if  you are using
-    the web components polyfills.** Because the web components v1 APIs depend on `Promise`, 
-    a promise polyfill is loaded when needed by the v1 polyfills (`web-components-lite.js` or 
-    `webcomponents-loader.js`).
-
-*   New optional error information.
-
-    The `generateRequest` method returns an `iron-request` element representing the 
-    request, and the request element provides a `completes` property, which is a 
-    promise that completes when the request either succeeds or fails.
-
-    This version includes a new flag, `rejectWithRequest`, that modifies the error handling
-    of the `completes` promise. By default, when the promise is rejected (because the request 
-    failed), the rejection callback only receives an `Error` object describing the failure.
-
-    With `rejectWithRequest` set to true, the callback receives an object with two keys, `error`, 
-    the error message, and `request`, the original request that the error is related to:
-
-        let request = ironAjaxElement.generateRequest();
-        request.completes.then(function(req) {
-            // succesful request, argument is iron-request element
-            ...
-          }, function(rejected) {
-            // failed request, argument is an object
-            let req = rejected.request;
-            let error = rejected.error;
-            ...
-          }
-        )
-
-    Because this change could break existing code, `rejectWithRequest` is false by default,
-    however, in the next major release, this option will be removed and the new behavior made 
-    the default.
-
-
-## &lt;iron-ajax&gt;
-
-The `iron-ajax` element exposes network request functionality.
-
-```html
-<iron-ajax
-    auto
-    url="https://www.googleapis.com/youtube/v3/search"
-    params='{"part":"snippet", "q":"polymer", "key": "YOUTUBE_API_KEY", "type": "video"}'
-    handle-as="json"
-    on-response="handleResponse"
-    debounce-duration="300"></iron-ajax>
-```
-
-With `auto` set to `true`, the element performs a request whenever
-its `url`, `params` or `body` properties are changed. Automatically generated
-requests will be debounced in the case that multiple attributes are changed
-sequentially.
-
-Note: The `params` attribute must be double quoted JSON.
-
-You can trigger a request explicitly by calling `generateRequest` on the
-element.
-
-
-
-## &lt;iron-request&gt;
-
-iron-request can be used to perform XMLHttpRequests.
-
-```html
-<iron-request id="xhr"></iron-request>
-...
-this.$.xhr.send({url: url, body: params});
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/bower.json b/systrace/catapult/third_party/polymer/components/iron-ajax/bower.json
deleted file mode 100644
index fc9ae9d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/bower.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "name": "iron-ajax",
-  "version": "2.0.5",
-  "description": "Makes it easy to make ajax calls and parse the response",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "ajax"
-  ],
-  "main": "iron-ajax.html",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-ajax.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-ajax",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
-    "iron-image": "PolymerElements/iron-image#1 - 2",
-    "promise-polyfill": "PolymerLabs/promise-polyfill#1 - 2",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
-    "web-component-tester": "^6.0.0"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "promise-polyfill": "PolymerLabs/promise-polyfill#^1.0.0",
-        "polymer": "Polymer/polymer#^1.9"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-        "iron-image": "PolymerElements/iron-image#^1.0.0",
-        "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-        "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "web-component-tester": "^4.0.0",
-        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-      },
-      "resolutions": {
-        "promise-polyfill": "^1.0.0",
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-ajax/demo/index.html
deleted file mode 100644
index 02c37b5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/demo/index.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-ajax</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../iron-ajax.html">
-  <link rel="import" href="../../iron-image/iron-image.html">
-</head>
-<body unresolved>
-  <h1>Video Feed</h1>
-  <dom-module id="iron-ajax-demo">
-    <template>
-      <style>
-        iron-image {
-          background-color: lightgray;
-          margin: 1em;
-        }
-        .horizontal-section-container {
-          display: flex;
-          display: -ms-flexbox;
-          display: -webkit-flex;
-          -ms-flex-pack: center;
-          -webkit-justify-content: center;
-          justify-content: center;
-          -ms-flex-wrap: wrap;
-          -webkit-flex-wrap: wrap;
-          flex-wrap: wrap;
-        }
-        .horizontal-section {
-          background-color: white;
-          padding: 24px;
-          margin-right: 24px;
-          min-width: 200px;
-          box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
-                      0 1px 5px 0 rgba(0, 0, 0, 0.12),
-                      0 3px 1px -2px rgba(0, 0, 0, 0.2);
-          max-width: 300px;
-          margin-bottom: 24px;
-        }
-      </style>
-
-      <iron-ajax auto
-          url="https://www.googleapis.com/youtube/v3/search"
-          params='{"part":"snippet", "q":"polymer", "key": "AIzaSyAuecFZ9xJXbGDkQYWBmYrtzOGJD-iDIgI", "type": "video"}'
-          handle-as="json"
-          last-response="{{ajaxResponse}}"></iron-ajax>
-
-      <div class="horizontal-section-container">
-        <template is="dom-repeat" items="[[ajaxResponse.items]]">
-          <div class="horizontal-section">
-            <h2><a href="[[url(item.id.videoId)]]" target="_blank">[[item.snippet.title]]</a></h2>
-            <iron-image src="[[item.snippet.thumbnails.high.url]]" width="256" height="256" sizing="cover" preload fade></iron-image>
-            <p>[[item.snippet.description]]</p>
-          </div>
-        </template>
-      </div>
-    </template>
-
-    <script>
-      window.addEventListener('WebComponentsReady', function() {
-        Polymer({
-          is: 'iron-ajax-demo',
-
-          url: function(videoId) {
-            return 'https://www.youtube.com/watch?v=' + videoId;
-          }
-        });
-      })
-    </script>
-  </dom-module>
-
-  <iron-ajax-demo></iron-ajax-demo>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/hero.svg b/systrace/catapult/third_party/polymer/components/iron-ajax/hero.svg
deleted file mode 100644
index 6ee49f8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/hero.svg
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<g>

-		<path d="M42.1,54.6H30.9l-2.6,8.2h-4.5l10.9-32h3.8l10.6,32h-4.5L42.1,54.6z M32.1,50.9H41l-4.4-14.2L32.1,50.9z"/>

-		<path d="M69.1,30.8h4.4v22.7c0,1.5-0.3,2.9-0.8,4.1s-1.3,2.2-2.2,3.1c-0.9,0.8-2,1.5-3.3,1.9c-1.3,0.4-2.7,0.7-4.2,0.7

-			c-1.5,0-2.9-0.2-4.2-0.6c-1.3-0.4-2.4-1-3.3-1.7c-0.9-0.8-1.6-1.7-2.1-2.9s-0.7-2.5-0.7-4.1h4.4c0,2,0.5,3.4,1.5,4.4

-			s2.5,1.4,4.4,1.4c0.8,0,1.6-0.1,2.4-0.4c0.7-0.3,1.4-0.7,1.9-1.3s1-1.2,1.3-2s0.5-1.6,0.5-2.6V30.8z"/>

-		<path d="M96.1,54.6H84.9l-2.6,8.2h-4.5l10.9-32h3.8l10.6,32h-4.5L96.1,54.6z M86.1,50.9H95l-4.4-14.2L86.1,50.9z"/>

-		<path d="M117.7,43.2l7-12.3h5.3l-9.7,15.9l9.9,16.1h-5.2l-7.2-12.6l-7.2,12.6h-5.3l9.9-16.1l-9.7-15.9h5.3L117.7,43.2z"/>

-	</g>

-	<circle cx="25.7" cy="82.2" r="4"/>

-	<circle cx="130.7" cy="82.2" r="4"/>

-	<circle cx="52.7" cy="93.2" r="4"/>

-	<circle cx="104.7" cy="93.2" r="4"/>

-	<circle cx="156.7" cy="93.2" r="4"/>

-	<path d="M81.6,78.3c3.3,4.3-1.6,9.1-5.9,5.9C72.5,79.8,77.4,75,81.6,78.3z"/>

-	<polygon points="104.6,94.1 78.4,82.1 52.2,94.1 25.6,81.9 26.4,80.1 52.2,91.9 78.4,79.9 104.6,91.9 130.8,79.9 157.4,92.1 

-		156.6,93.9 130.8,82.1 	"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/index.html b/systrace/catapult/third_party/polymer/components/iron-ajax/index.html
deleted file mode 100644
index 41aca5c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-ajax</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/iron-ajax.html b/systrace/catapult/third_party/polymer/components/iron-ajax/iron-ajax.html
deleted file mode 100644
index 1a9dddf..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/iron-ajax.html
+++ /dev/null
@@ -1,580 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="iron-request.html">
-
-<!--
-The `iron-ajax` element exposes network request functionality.
-
-    <iron-ajax
-        auto
-        url="https://www.googleapis.com/youtube/v3/search"
-        params='{"part":"snippet", "q":"polymer", "key": "YOUTUBE_API_KEY", "type": "video"}'
-        handle-as="json"
-        on-response="handleResponse"
-        debounce-duration="300"></iron-ajax>
-
-With `auto` set to `true`, the element performs a request whenever
-its `url`, `params` or `body` properties are changed. Automatically generated
-requests will be debounced in the case that multiple attributes are changed
-sequentially.
-
-Note: The `params` attribute must be double quoted JSON.
-
-You can trigger a request explicitly by calling `generateRequest` on the
-element.
-
-@demo demo/index.html
-@hero hero.svg
--->
-
-<script>
-  'use strict';
-
-  Polymer({
-
-    is: 'iron-ajax',
-
-    /**
-     * Fired before a request is sent.
-     *
-     * @event iron-ajax-presend
-     */
-
-    /**
-     * Fired when a request is sent.
-     *
-     * @event request
-     * @event iron-ajax-request
-     */
-
-    /**
-     * Fired when a response is received.
-     *
-     * @event response
-     * @event iron-ajax-response
-     */
-
-    /**
-     * Fired when an error is received.
-     *
-     * @event error
-     * @event iron-ajax-error
-     */
-
-    hostAttributes: {
-      hidden: true
-    },
-
-    properties: {
-      /**
-       * The URL target of the request.
-       */
-      url: {
-        type: String
-      },
-
-      /**
-       * An object that contains query parameters to be appended to the
-       * specified `url` when generating a request. If you wish to set the body
-       * content when making a POST request, you should use the `body` property
-       * instead.
-       */
-      params: {
-        type: Object,
-        value: function() {
-          return {};
-        }
-      },
-
-      /**
-       * The HTTP method to use such as 'GET', 'POST', 'PUT', or 'DELETE'.
-       * Default is 'GET'.
-       */
-      method: {
-        type: String,
-        value: 'GET'
-      },
-
-      /**
-       * HTTP request headers to send.
-       *
-       * Example:
-       *
-       *     <iron-ajax
-       *         auto
-       *         url="http://somesite.com"
-       *         headers='{"X-Requested-With": "XMLHttpRequest"}'
-       *         handle-as="json"></iron-ajax>
-       *
-       * Note: setting a `Content-Type` header here will override the value
-       * specified by the `contentType` property of this element.
-       */
-      headers: {
-        type: Object,
-        value: function() {
-          return {};
-        }
-      },
-
-      /**
-       * Content type to use when sending data. If the `contentType` property
-       * is set and a `Content-Type` header is specified in the `headers`
-       * property, the `headers` property value will take precedence.
-       *
-       * Varies the handling of the `body` param.
-       */
-      contentType: {
-        type: String,
-        value: null
-      },
-
-      /**
-       * Body content to send with the request, typically used with "POST"
-       * requests.
-       *
-       * If body is a string it will be sent unmodified.
-       *
-       * If Content-Type is set to a value listed below, then
-       * the body will be encoded accordingly.
-       *
-       *    * `content-type="application/json"`
-       *      * body is encoded like `{"foo":"bar baz","x":1}`
-       *    * `content-type="application/x-www-form-urlencoded"`
-       *      * body is encoded like `foo=bar+baz&x=1`
-       *
-       * Otherwise the body will be passed to the browser unmodified, and it
-       * will handle any encoding (e.g. for FormData, Blob, ArrayBuffer).
-       *
-       * @type (ArrayBuffer|ArrayBufferView|Blob|Document|FormData|null|string|undefined|Object)
-       */
-      body: {
-        type: Object,
-        value: null
-      },
-
-      /**
-       * Toggle whether XHR is synchronous or asynchronous. Don't change this
-       * to true unless You Know What You Are Doing™.
-       */
-      sync: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Specifies what data to store in the `response` property, and
-       * to deliver as `event.detail.response` in `response` events.
-       *
-       * One of:
-       *
-       *    `text`: uses `XHR.responseText`.
-       *
-       *    `xml`: uses `XHR.responseXML`.
-       *
-       *    `json`: uses `XHR.responseText` parsed as JSON.
-       *
-       *    `arraybuffer`: uses `XHR.response`.
-       *
-       *    `blob`: uses `XHR.response`.
-       *
-       *    `document`: uses `XHR.response`.
-       */
-      handleAs: {
-        type: String,
-        value: 'json'
-      },
-
-      /**
-       * Set the withCredentials flag on the request.
-       */
-      withCredentials: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set the timeout flag on the request.
-       */
-      timeout: {
-        type: Number,
-        value: 0
-      },
-
-      /**
-       * If true, automatically performs an Ajax request when either `url` or
-       * `params` changes.
-       */
-      auto: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * If true, error messages will automatically be logged to the console.
-       */
-      verbose: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * The most recent request made by this iron-ajax element.
-       */
-      lastRequest: {
-        type: Object,
-        notify: true,
-        readOnly: true
-      },
-
-      /**
-       * True while lastRequest is in flight.
-       */
-      loading: {
-        type: Boolean,
-        notify: true,
-        readOnly: true
-      },
-
-      /**
-       * lastRequest's response.
-       *
-       * Note that lastResponse and lastError are set when lastRequest finishes,
-       * so if loading is true, then lastResponse and lastError will correspond
-       * to the result of the previous request.
-       *
-       * The type of the response is determined by the value of `handleAs` at
-       * the time that the request was generated.
-       *
-       * @type {Object}
-       */
-      lastResponse: {
-        type: Object,
-        notify: true,
-        readOnly: true
-      },
-
-      /**
-       * lastRequest's error, if any.
-       *
-       * @type {Object}
-       */
-      lastError: {
-        type: Object,
-        notify: true,
-        readOnly: true
-      },
-
-      /**
-       * An Array of all in-flight requests originating from this iron-ajax
-       * element.
-       */
-      activeRequests: {
-        type: Array,
-        notify: true,
-        readOnly: true,
-        value: function() {
-          return [];
-        }
-      },
-
-      /**
-       * Length of time in milliseconds to debounce multiple automatically generated requests.
-       */
-      debounceDuration: {
-        type: Number,
-        value: 0,
-        notify: true
-      },
-
-      /**
-       * Prefix to be stripped from a JSON response before parsing it.
-       *
-       * In order to prevent an attack using CSRF with Array responses
-       * (http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/)
-       * many backends will mitigate this by prefixing all JSON response bodies
-       * with a string that would be nonsensical to a JavaScript parser.
-       *
-       */
-      jsonPrefix: {
-        type: String,
-        value: ''
-      },
-
-      /**
-       * By default, iron-ajax's events do not bubble. Setting this attribute will cause its
-       * request and response events as well as its iron-ajax-request, -response,  and -error
-       * events to bubble to the window object. The vanilla error event never bubbles when
-       * using shadow dom even if this.bubbles is true because a scoped flag is not passed with
-       * it (first link) and because the shadow dom spec did not used to allow certain events,
-       * including events named error, to leak outside of shadow trees (second link).
-       * https://www.w3.org/TR/shadow-dom/#scoped-flag
-       * https://www.w3.org/TR/2015/WD-shadow-dom-20151215/#events-that-are-not-leaked-into-ancestor-trees
-       */
-      bubbles: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Changes the [`completes`](iron-request#property-completes) promise chain 
-       * from `generateRequest` to reject with an object
-       * containing the original request, as well an error message.
-       * If false (default), the promise rejects with an error message only.
-       */
-      rejectWithRequest: {
-        type: Boolean,
-        value: false
-      },
-
-      _boundHandleResponse: {
-        type: Function,
-        value: function() {
-          return this._handleResponse.bind(this);
-        }
-      }
-    },
-
-    observers: [
-      '_requestOptionsChanged(url, method, params.*, headers, contentType, ' +
-          'body, sync, handleAs, jsonPrefix, withCredentials, timeout, auto)'
-    ],
-
-    /**
-     * The query string that should be appended to the `url`, serialized from
-     * the current value of `params`.
-     *
-     * @return {string}
-     */
-    get queryString () {
-      var queryParts = [];
-      var param;
-      var value;
-
-      for (param in this.params) {
-        value = this.params[param];
-        param = window.encodeURIComponent(param);
-
-        if (Array.isArray(value)) {
-          for (var i = 0; i < value.length; i++) {
-            queryParts.push(param + '=' + window.encodeURIComponent(value[i]));
-          }
-        } else if (value !== null) {
-          queryParts.push(param + '=' + window.encodeURIComponent(value));
-        } else {
-          queryParts.push(param);
-        }
-      }
-
-      return queryParts.join('&');
-    },
-
-    /**
-     * The `url` with query string (if `params` are specified), suitable for
-     * providing to an `iron-request` instance.
-     *
-     * @return {string}
-     */
-    get requestUrl() {
-      var queryString = this.queryString;
-      var url = this.url || '';
-
-      if (queryString) {
-        var bindingChar = url.indexOf('?') >= 0 ? '&' : '?';
-        return url + bindingChar + queryString;
-      }
-
-      return url;
-    },
-
-    /**
-     * An object that maps header names to header values, first applying the
-     * the value of `Content-Type` and then overlaying the headers specified
-     * in the `headers` property.
-     *
-     * @return {Object}
-     */
-    get requestHeaders() {
-      var headers = {};
-      var contentType = this.contentType;
-      if (contentType == null && (typeof this.body === 'string')) {
-        contentType = 'application/x-www-form-urlencoded';
-      }
-      if (contentType) {
-        headers['content-type'] = contentType;
-      }
-      var header;
-
-      if (typeof this.headers === 'object') {
-        for (header in this.headers) {
-          headers[header] = this.headers[header].toString();
-        }
-      }
-
-      return headers;
-    },
-
-    /**
-     * Request options suitable for generating an `iron-request` instance based
-     * on the current state of the `iron-ajax` instance's properties.
-     *
-     * @return {{
-     *   url: string,
-     *   method: (string|undefined),
-     *   async: (boolean|undefined),
-     *   body: (ArrayBuffer|ArrayBufferView|Blob|Document|FormData|null|string|undefined|Object),
-     *   headers: (Object|undefined),
-     *   handleAs: (string|undefined),
-     *   jsonPrefix: (string|undefined),
-     *   withCredentials: (boolean|undefined)}}
-     */
-    toRequestOptions: function() {
-      return {
-        url: this.requestUrl || '',
-        method: this.method,
-        headers: this.requestHeaders,
-        body: this.body,
-        async: !this.sync,
-        handleAs: this.handleAs,
-        jsonPrefix: this.jsonPrefix,
-        withCredentials: this.withCredentials,
-        timeout: this.timeout,
-        rejectWithRequest: this.rejectWithRequest,
-      };
-    },
-
-    /**
-     * Performs an AJAX request to the specified URL.
-     *
-     * @return {!IronRequestElement}
-     */
-    generateRequest: function() {
-      var request = /** @type {!IronRequestElement} */ (document.createElement('iron-request'));
-      var requestOptions = this.toRequestOptions();
-
-      this.push('activeRequests', request);
-
-      request.completes.then(
-        this._boundHandleResponse
-      ).catch(
-        this._handleError.bind(this, request)
-      ).then(
-        this._discardRequest.bind(this, request)
-      );
-
-      var evt = this.fire('iron-ajax-presend', {
-        request: request,
-        options: requestOptions
-      }, {bubbles: this.bubbles, cancelable: true});
-
-      if (evt.defaultPrevented) {
-        request.abort();
-        request.rejectCompletes(request);
-        return request;
-      }
-
-      request.send(requestOptions);
-
-      this._setLastRequest(request);
-      this._setLoading(true);
-
-      this.fire('request', {
-        request: request,
-        options: requestOptions
-      }, {
-        bubbles: this.bubbles,
-        composed: true
-      });
-
-      this.fire('iron-ajax-request', {
-        request: request,
-        options: requestOptions
-      }, {
-        bubbles: this.bubbles,
-        composed: true
-      });
-
-      return request;
-    },
-
-    _handleResponse: function(request) {
-      if (request === this.lastRequest) {
-        this._setLastResponse(request.response);
-        this._setLastError(null);
-        this._setLoading(false);
-      }
-      this.fire('response', request, {
-        bubbles: this.bubbles,
-        composed: true
-      });
-      this.fire('iron-ajax-response', request, {
-        bubbles: this.bubbles,
-        composed: true
-      });
-    },
-
-    _handleError: function(request, error) {
-      if (this.verbose) {
-        Polymer.Base._error(error);
-      }
-
-      if (request === this.lastRequest) {
-        this._setLastError({
-          request: request,
-          error: error,
-          status: request.xhr.status,
-          statusText: request.xhr.statusText,
-          response: request.xhr.response
-        });
-        this._setLastResponse(null);
-        this._setLoading(false);
-      }
-
-      // Tests fail if this goes after the normal this.fire('error', ...)
-      this.fire('iron-ajax-error', {
-        request: request,
-        error: error
-      }, {
-        bubbles: this.bubbles,
-        composed: true
-      });
-
-      this.fire('error', {
-        request: request,
-        error: error
-      }, {
-        bubbles: this.bubbles,
-        composed: true
-      });
-    },
-
-    _discardRequest: function(request) {
-      var requestIndex = this.activeRequests.indexOf(request);
-
-      if (requestIndex > -1) {
-        this.splice('activeRequests', requestIndex, 1);
-      }
-    },
-
-    _requestOptionsChanged: function() {
-      this.debounce('generate-request', function() {
-        if (this.url == null) {
-          return;
-        }
-
-        if (this.auto) {
-          this.generateRequest();
-        }
-      }, this.debounceDuration);
-    },
-
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/iron-request.html b/systrace/catapult/third_party/polymer/components/iron-ajax/iron-request.html
deleted file mode 100644
index 0bb3b7f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/iron-request.html
+++ /dev/null
@@ -1,471 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-iron-request can be used to perform XMLHttpRequests.
-
-    <iron-request id="xhr"></iron-request>
-    ...
-    this.$.xhr.send({url: url, body: params});
--->
-<script>
-  'use strict';
-
-  Polymer({
-    is: 'iron-request',
-
-    hostAttributes: {
-      hidden: true
-    },
-
-    properties: {
-
-      /**
-       * A reference to the XMLHttpRequest instance used to generate the
-       * network request.
-       *
-       * @type {XMLHttpRequest}
-       */
-      xhr: {
-        type: Object,
-        notify: true,
-        readOnly: true,
-        value: function() {
-          return new XMLHttpRequest();
-        }
-      },
-
-      /**
-       * A reference to the parsed response body, if the `xhr` has completely
-       * resolved.
-       *
-       * @type {*}
-       * @default null
-       */
-      response: {
-        type: Object,
-        notify: true,
-        readOnly: true,
-        value: function() {
-          return null;
-        }
-      },
-
-      /**
-       * A reference to the status code, if the `xhr` has completely resolved.
-       */
-      status: {
-        type: Number,
-        notify: true,
-        readOnly: true,
-        value: 0
-      },
-
-      /**
-       * A reference to the status text, if the `xhr` has completely resolved.
-       */
-      statusText: {
-        type: String,
-        notify: true,
-        readOnly: true,
-        value: ''
-      },
-
-      /**
-       * A promise that resolves when the `xhr` response comes back, or rejects
-       * if there is an error before the `xhr` completes.
-       * The resolve callback is called with the original request as an argument.
-       * By default, the reject callback is called with an `Error` as an argument.
-       * If `rejectWithRequest` is true, the reject callback is called with an 
-       * object with two keys: `request`, the original request, and `error`, the 
-       * error object.
-       *
-       * @type {Promise}
-       */
-      completes: {
-        type: Object,
-        readOnly: true,
-        notify: true,
-        value: function() {
-          return new Promise(function(resolve, reject) {
-            this.resolveCompletes = resolve;
-            this.rejectCompletes = reject;
-          }.bind(this));
-        }
-      },
-
-      /**
-       * An object that contains progress information emitted by the XHR if
-       * available.
-       *
-       * @default {}
-       */
-      progress: {
-        type: Object,
-        notify: true,
-        readOnly: true,
-        value: function() {
-          return {};
-        }
-      },
-
-      /**
-       * Aborted will be true if an abort of the request is attempted.
-       */
-      aborted: {
-        type: Boolean,
-        notify: true,
-        readOnly: true,
-        value: false,
-      },
-
-      /**
-       * Errored will be true if the browser fired an error event from the
-       * XHR object (mainly network errors).
-       */
-      errored: {
-        type: Boolean,
-        notify: true,
-        readOnly: true,
-        value: false
-      },
-
-      /**
-       * TimedOut will be true if the XHR threw a timeout event.
-       */
-      timedOut: {
-        type: Boolean,
-        notify: true,
-        readOnly: true,
-        value: false
-      }
-    },
-
-    /**
-     * Succeeded is true if the request succeeded. The request succeeded if it
-     * loaded without error, wasn't aborted, and the status code is ≥ 200, and
-     * < 300, or if the status code is 0.
-     *
-     * The status code 0 is accepted as a success because some schemes - e.g.
-     * file:// - don't provide status codes.
-     *
-     * @return {boolean}
-     */
-    get succeeded() {
-      if (this.errored || this.aborted || this.timedOut) {
-        return false;
-      }
-      var status = this.xhr.status || 0;
-
-      // Note: if we are using the file:// protocol, the status code will be 0
-      // for all outcomes (successful or otherwise).
-      return status === 0 ||
-        (status >= 200 && status < 300);
-    },
-
-    /**
-     * Sends an HTTP request to the server and returns a promise (see the `completes`
-     * property for details).
-     *
-     * The handling of the `body` parameter will vary based on the Content-Type
-     * header. See the docs for iron-ajax's `body` property for details.
-     *
-     * @param {{
-     *   url: string,
-     *   method: (string|undefined),
-     *   async: (boolean|undefined),
-     *   body: (ArrayBuffer|ArrayBufferView|Blob|Document|FormData|null|string|undefined|Object),
-     *   headers: (Object|undefined),
-     *   handleAs: (string|undefined),
-     *   jsonPrefix: (string|undefined),
-     *   withCredentials: (boolean|undefined),
-     *   timeout: (Number|undefined),
-     *   rejectWithRequest: (boolean|undefined)}} options -
-     *   - url The url to which the request is sent.
-     *   - method The HTTP method to use, default is GET.
-     *   - async By default, all requests are sent asynchronously. To send synchronous requests,
-     *         set to false.
-     *   -  body The content for the request body for POST method.
-     *   -  headers HTTP request headers.
-     *   -  handleAs The response type. Default is 'text'.
-     *   -  withCredentials Whether or not to send credentials on the request. Default is false.
-     *   -  timeout - Timeout for request, in milliseconds.
-     *   -  rejectWithRequest Set to true to include the request object with promise rejections.
-     * @return {Promise}
-     */
-    send: function(options) {
-      var xhr = this.xhr;
-
-      if (xhr.readyState > 0) {
-        return null;
-      }
-
-      xhr.addEventListener('progress', function(progress) {
-        this._setProgress({
-          lengthComputable: progress.lengthComputable,
-          loaded: progress.loaded,
-          total: progress.total
-        });
-      }.bind(this));
-
-      xhr.addEventListener('error', function(error) {
-        this._setErrored(true);
-        this._updateStatus();
-        var response = options.rejectWithRequest ? {
-          error: error,
-          request: this
-        } : error;
-        this.rejectCompletes(response);
-      }.bind(this));
-
-      xhr.addEventListener('timeout', function(error) {
-        this._setTimedOut(true);
-        this._updateStatus();
-        var response = options.rejectWithRequest ? {
-          error: error,
-          request: this
-        } : error;
-        this.rejectCompletes(response);
-      }.bind(this));
-
-      xhr.addEventListener('abort', function() {
-        this._setAborted(true);
-        this._updateStatus();
-        var error = new Error('Request aborted.');
-        var response = options.rejectWithRequest ? {
-          error: error,
-          request: this
-        } : error;
-        this.rejectCompletes(response);
-      }.bind(this));
-
-      // Called after all of the above.
-      xhr.addEventListener('loadend', function() {
-        this._updateStatus();
-        this._setResponse(this.parseResponse());
-
-        if (!this.succeeded) {
-          var error = new Error('The request failed with status code: ' + this.xhr.status);
-          var response = options.rejectWithRequest ? {
-            error: error,
-            request: this
-          } : error;
-          this.rejectCompletes(response);
-          return;
-        }
-
-        this.resolveCompletes(this);
-      }.bind(this));
-
-      this.url = options.url;
-      xhr.open(
-        options.method || 'GET',
-        options.url,
-        options.async !== false
-      );
-
-      var acceptType = {
-        'json': 'application/json',
-        'text': 'text/plain',
-        'html': 'text/html',
-        'xml': 'application/xml',
-        'arraybuffer': 'application/octet-stream'
-      }[options.handleAs];
-      var headers = options.headers || Object.create(null);
-      var newHeaders = Object.create(null);
-      for (var key in headers) {
-        newHeaders[key.toLowerCase()] = headers[key];
-      }
-      headers = newHeaders;
-
-      if (acceptType && !headers['accept']) {
-        headers['accept'] = acceptType;
-      }
-      Object.keys(headers).forEach(function(requestHeader) {
-        if (/[A-Z]/.test(requestHeader)) {
-          Polymer.Base._error('Headers must be lower case, got', requestHeader);
-        }
-        xhr.setRequestHeader(
-          requestHeader,
-          headers[requestHeader]
-        );
-      }, this);
-
-      if (options.async !== false) {
-        if (options.async) {
-          xhr.timeout = options.timeout;
-        }
-
-        var handleAs = options.handleAs;
-
-        // If a JSON prefix is present, the responseType must be 'text' or the
-        // browser won’t be able to parse the response.
-        if (!!options.jsonPrefix || !handleAs) {
-          handleAs = 'text';
-        }
-
-        // In IE, `xhr.responseType` is an empty string when the response
-        // returns. Hence, caching it as `xhr._responseType`.
-        xhr.responseType = xhr._responseType = handleAs;
-
-        // Cache the JSON prefix, if it exists.
-        if (!!options.jsonPrefix) {
-          xhr._jsonPrefix = options.jsonPrefix;
-        }
-      }
-
-      xhr.withCredentials = !!options.withCredentials;
-
-
-      var body = this._encodeBodyObject(options.body, headers['content-type']);
-
-      xhr.send(
-        /** @type {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|
-                   null|string|undefined} */
-        (body));
-
-      return this.completes;
-    },
-
-    /**
-     * Attempts to parse the response body of the XHR. If parsing succeeds,
-     * the value returned will be deserialized based on the `responseType`
-     * set on the XHR.
-     *
-     * @return {*} The parsed response,
-     * or undefined if there was an empty response or parsing failed.
-     */
-    parseResponse: function() {
-      var xhr = this.xhr;
-      var responseType = xhr.responseType || xhr._responseType;
-      var preferResponseText = !this.xhr.responseType;
-      var prefixLen = (xhr._jsonPrefix && xhr._jsonPrefix.length) || 0;
-
-      try {
-        switch (responseType) {
-          case 'json':
-            // If the xhr object doesn't have a natural `xhr.responseType`,
-            // we can assume that the browser hasn't parsed the response for us,
-            // and so parsing is our responsibility. Likewise if response is
-            // undefined, as there's no way to encode undefined in JSON.
-            if (preferResponseText || xhr.response === undefined) {
-              // Try to emulate the JSON section of the response body section of
-              // the spec: https://xhr.spec.whatwg.org/#response-body
-              // That is to say, we try to parse as JSON, but if anything goes
-              // wrong return null.
-              try {
-                return JSON.parse(xhr.responseText);
-              } catch (_) {
-                return null;
-              }
-            }
-
-            return xhr.response;
-          case 'xml':
-            return xhr.responseXML;
-          case 'blob':
-          case 'document':
-          case 'arraybuffer':
-            return xhr.response;
-          case 'text':
-          default: {
-            // If `prefixLen` is set, it implies the response should be parsed
-            // as JSON once the prefix of length `prefixLen` is stripped from
-            // it. Emulate the behavior above where null is returned on failure
-            // to parse.
-            if (prefixLen) {
-              try {
-                return JSON.parse(xhr.responseText.substring(prefixLen));
-              } catch (_) {
-                return null;
-              }
-            }
-            return xhr.responseText;
-          }
-        }
-      } catch (e) {
-        this.rejectCompletes(new Error('Could not parse response. ' + e.message));
-      }
-    },
-
-    /**
-     * Aborts the request.
-     */
-    abort: function() {
-      this._setAborted(true);
-      this.xhr.abort();
-    },
-
-    /**
-     * @param {*} body The given body of the request to try and encode.
-     * @param {?string} contentType The given content type, to infer an encoding
-     *     from.
-     * @return {*} Either the encoded body as a string, if successful,
-     *     or the unaltered body object if no encoding could be inferred.
-     */
-    _encodeBodyObject: function(body, contentType) {
-      if (typeof body == 'string') {
-        return body;  // Already encoded.
-      }
-      var bodyObj = /** @type {Object} */ (body);
-      switch(contentType) {
-        case('application/json'):
-          return JSON.stringify(bodyObj);
-        case('application/x-www-form-urlencoded'):
-          return this._wwwFormUrlEncode(bodyObj);
-      }
-      return body;
-    },
-
-    /**
-     * @param {Object} object The object to encode as x-www-form-urlencoded.
-     * @return {string} .
-     */
-    _wwwFormUrlEncode: function(object) {
-      if (!object) {
-        return '';
-      }
-      var pieces = [];
-      Object.keys(object).forEach(function(key) {
-        // TODO(rictic): handle array values here, in a consistent way with
-        //   iron-ajax params.
-        pieces.push(
-            this._wwwFormUrlEncodePiece(key) + '=' +
-            this._wwwFormUrlEncodePiece(object[key]));
-      }, this);
-      return pieces.join('&');
-    },
-
-    /**
-     * @param {*} str A key or value to encode as x-www-form-urlencoded.
-     * @return {string} .
-     */
-    _wwwFormUrlEncodePiece: function(str) {
-      // Spec says to normalize newlines to \r\n and replace %20 spaces with +.
-      // jQuery does this as well, so this is likely to be widely compatible.
-      if (str === null || str === undefined || !str.toString) {
-        return '';
-      }
-
-      return encodeURIComponent(str.toString().replace(/\r?\n/g, '\r\n'))
-        .replace(/%20/g, '+');
-    },
-
-    /**
-     * Updates the status code and status text.
-     */
-    _updateStatus: function() {
-      this._setStatus(this.xhr.status);
-      this._setStatusText((this.xhr.statusText === undefined) ? '' : this.xhr.statusText);
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/test/index.html b/systrace/catapult/third_party/polymer/components/iron-ajax/test/index.html
deleted file mode 100644
index 997b08f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/test/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'iron-request.html?wc-shadowdom=true&wc-ce=true',
-      'iron-ajax.html?wc-shadowdom=true&wc-ce=true',
-      'iron-request.html?dom=shadow',
-      'iron-ajax.html?dom=shadow'
-    ]);
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/test/iron-ajax.html b/systrace/catapult/third_party/polymer/components/iron-ajax/test/iron-ajax.html
deleted file mode 100644
index eae0171..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/test/iron-ajax.html
+++ /dev/null
@@ -1,968 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-ajax</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../iron-ajax.html">
-</head>
-<body>
-  <test-fixture id="TrivialGet">
-    <template>
-      <iron-ajax url="/responds_to_get_with_json"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="ParamsGet">
-    <template>
-      <iron-ajax url="/responds_to_get_with_json"
-                 params='{"a": "a"}'></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="AutoGet">
-    <template>
-      <iron-ajax auto url="/responds_to_get_with_json"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="GetEcho">
-    <template>
-      <iron-ajax handle-as="json" url="/echoes_request_url"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="TrivialPost">
-    <template>
-      <iron-ajax method="POST"
-                 url="/responds_to_post_with_json"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="DebouncedGet">
-    <template>
-      <iron-ajax auto
-                 url="/responds_to_debounced_get_with_json"
-                 debounce-duration="150"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id='BlankUrl'>
-    <template>
-      <iron-ajax auto handle-as='text'></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="RealPost">
-    <template>
-      <iron-ajax method="POST" url="http://httpbin.org/post"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="Delay">
-    <template>
-      <iron-ajax url="http://httpbin.org/delay/1"></iron-ajax>
-    </template>
-  </test-fixture>
-  <test-fixture id="Bubbles">
-    <template>
-      <iron-ajax url="http://httpbin.org/post" method="POST" bubbles></iron-ajax>
-      <iron-ajax url="/responds_to_get_with_502_error_json" bubbles></iron-ajax>
-    </template>
-  </test-fixture>
-  <script>
-    'use strict';
-    suite('<iron-ajax>', function() {
-      var responseHeaders = {
-        json: { 'Content-Type': 'application/json' },
-        plain: { 'Content-Type': 'text/plain' }
-      };
-      var ajax;
-      var request;
-      var server;
-
-      function timePasses(ms) {
-        return new Promise(function(resolve) {
-          window.setTimeout(function() {
-            resolve();
-          }, ms);
-        });
-      }
-
-      setup(function() {
-        server = sinon.fakeServer.create();
-        server.respondWith(
-          'GET',
-          /\/responds_to_get_with_json.*/,
-          [
-            200,
-            responseHeaders.json,
-            '{"success":true}'
-          ]
-        );
-
-        server.respondWith(
-          'POST',
-          '/responds_to_post_with_json',
-          [
-            200,
-            responseHeaders.json,
-            '{"post_success":true}'
-          ]
-        );
-
-        server.respondWith(
-          'GET',
-          '/responds_to_get_with_text',
-          [
-            200,
-            responseHeaders.plain,
-            'Hello World'
-          ]
-        );
-
-        server.respondWith(
-          'GET',
-          '/responds_to_debounced_get_with_json',
-          [
-            200,
-            responseHeaders.json,
-            '{"success": "true"}'
-          ]
-        );
-
-        server.respondWith(
-          'GET',
-          '/responds_to_get_with_502_error_json',
-          [
-            502,
-            responseHeaders.json,
-            '{"message": "an error has occurred"}'
-          ]
-        );
-
-        ajax = fixture('TrivialGet');
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      // Echo requests are responded to individually and on demand, unlike the
-      // others in this file which are responded to with server.respond(),
-      // which responds to all open requests.
-      // We don't use server.respondWith here because there's no way to use it
-      // and only respond to a subset of requests.
-      // This way we can test for delayed and out of order responses and
-      // distinquish them by their responses.
-      function respondToEchoRequest(request) {
-        request.respond(200, responseHeaders.json, JSON.stringify({
-          url: request.url
-        }));
-      }
-
-      suite('when making simple GET requests for JSON', function() {
-        test('has sane defaults that love you', function() {
-          request = ajax.generateRequest();
-
-          server.respond();
-
-          expect(request.response).to.be.ok;
-          expect(request.response).to.be.an('object');
-          expect(request.response.success).to.be.equal(true);
-        });
-
-        test('will be asynchronous by default', function() {
-          expect(ajax.toRequestOptions().async).to.be.eql(true);
-        });
-      });
-
-      suite('when setting custom headers', function() {
-        test('are present in the request headers', function() {
-          ajax.headers['custom-header'] = 'valid';
-          var options = ajax.toRequestOptions();
-
-          expect(options.headers).to.be.ok;
-          expect(options.headers['custom-header']).to.be.an('string');
-          expect(options.headers.hasOwnProperty('custom-header')).to.be.equal(
-              true);
-        });
-
-        test('non-objects in headers are not applied', function() {
-          ajax.headers = 'invalid';
-          var options = ajax.toRequestOptions();
-
-          expect(Object.keys(options.headers).length).to.be.equal(0);
-        });
-      });
-
-      suite('when url isn\'t set yet', function() {
-        test('we don\'t fire any automatic requests', function() {
-          expect(server.requests.length).to.be.equal(0);
-          ajax = fixture('BlankUrl');
-
-          return timePasses(1).then(function() {
-            // We don't make any requests.
-            expect(server.requests.length).to.be.equal(0);
-
-            // Explicitly asking for the request to fire works.
-            ajax.generateRequest();
-            expect(server.requests.length).to.be.equal(1);
-            server.requests = [];
-
-            // Explicitly setting url to '' works too.
-            ajax = fixture('BlankUrl');
-            ajax.url = '';
-            return timePasses(1);
-          }).then(function() {
-            expect(server.requests.length).to.be.equal(1);
-          });
-        });
-
-        test('requestUrl remains empty despite valid queryString', function() {
-          ajax = fixture('BlankUrl');
-          expect(ajax.url).to.be.equal(undefined);
-          expect(ajax.queryString).to.be.equal('');
-          expect(ajax.requestUrl).to.be.equal('');
-
-          ajax.params = {'a':'b', 'c':'d'};
-
-          expect(ajax.queryString).to.be.equal('a=b&c=d');
-          expect(ajax.requestUrl).to.be.equal('?a=b&c=d');
-        });
-
-        test('generateRequest works with empty URL and valid queryString', function() {
-          ajax = fixture('BlankUrl');
-          expect(ajax.url).to.be.equal(undefined);
-
-          ajax.generateRequest();
-          expect(server.requests[0].url).to.be.eql('');
-
-          ajax.params = {'a':'b', 'c':'d'};
-
-          ajax.generateRequest();
-          expect(server.requests[1].url).to.be.eql('?a=b&c=d');
-        });
-      });
-
-      suite('when properties are changed', function() {
-        test('generates simple-request elements that reflect the change', function() {
-          request = ajax.generateRequest();
-
-          expect(request.xhr.method).to.be.equal('GET');
-
-          ajax.method = 'POST';
-          ajax.url = '/responds_to_post_with_json';
-
-          request = ajax.generateRequest();
-
-          expect(request.xhr.method).to.be.equal('POST');
-        });
-      });
-
-      suite('when generating a request', function() {
-        test('yields an iron-request instance', function() {
-          var IronRequest = document.createElement('iron-request').constructor;
-
-          expect(ajax.generateRequest()).to.be.instanceOf(IronRequest);
-        });
-
-        test('correctly adds params to a URL that already has some', function() {
-          ajax.url += '?a=b';
-          ajax.params = {'c': 'd'};
-
-          expect(ajax.requestUrl).to.be.equal('/responds_to_get_with_json?a=b&c=d')
-        })
-
-        test('encodes params properly', function() {
-          ajax.params = {'a b,c': 'd e f'};
-
-          expect(ajax.queryString).to.be.equal('a%20b%2Cc=d%20e%20f');
-        });
-
-        test('encodes array params properly', function() {
-          ajax.params = {'a b': ['c','d e', 'f']};
-
-          expect(ajax.queryString).to.be.equal('a%20b=c&a%20b=d%20e&a%20b=f');
-        });
-
-        test('reflects the loading state in the `loading` property', function() {
-          var request = ajax.generateRequest();
-
-          expect(ajax.loading).to.be.equal(true);
-
-          server.respond();
-
-          return request.completes.then(function() {
-            return timePasses(1);
-          }).then(function() {
-            expect(ajax.loading).to.be.equal(false);
-          });
-        });
-
-        test('the `iron-ajax-presend` event gets fired', function() {
-          var spy = sinon.spy();
-          var windowSpy = sinon.spy();
-          ajax.addEventListener('iron-ajax-presend', spy);
-          window.addEventListener('iron-ajax-presend', windowSpy);
-
-          var request = ajax.generateRequest();
-
-          server.respond()
-
-          return request.completes.then(function() {
-            expect(spy).to.be.calledOnce;
-            expect(windowSpy).not.to.be.called;
-          });
-        });
-
-        test('the loading-changed event gets fired twice', function() {
-          var count = 0;
-          ajax.addEventListener('loading-changed', function() {
-            count++;
-          });
-
-          var request = ajax.generateRequest();
-
-          server.respond();
-
-          return request.completes.then(function() {
-            return timePasses(1);
-          }).then(function() {
-            expect(count).to.be.equal(2);
-          });
-        });
-      });
-
-      suite('when there are multiple requests', function() {
-        var requests;
-        var echoAjax;
-        var promiseAllComplete;
-
-        setup(function() {
-          echoAjax = fixture('GetEcho');
-          requests = [];
-
-          for (var i = 0; i < 3; ++i) {
-            echoAjax.params = {'order': i + 1};
-            requests.push(echoAjax.generateRequest());
-          }
-          var allPromises = requests.map(function(r){return r.completes});
-          promiseAllComplete = Promise.all(allPromises);
-        });
-
-        test('holds all requests in the `activeRequests` Array', function() {
-          expect(requests).to.deep.eql(echoAjax.activeRequests);
-        });
-
-        test('empties `activeRequests` when requests are completed', function() {
-          expect(echoAjax.activeRequests.length).to.be.equal(3);
-          for (var i = 0; i < 3; i++) {
-            respondToEchoRequest(server.requests[i]);
-          }
-          return promiseAllComplete.then(function() {
-            return timePasses(1);
-          }).then(function() {
-            expect(echoAjax.activeRequests.length).to.be.equal(0);
-          });
-        });
-
-        test('avoids race conditions with last response', function() {
-          expect(echoAjax.lastResponse).to.be.equal(undefined);
-
-          // Resolving the oldest request doesn't update lastResponse.
-          respondToEchoRequest(server.requests[0]);
-          return requests[0].completes.then(function() {
-            expect(echoAjax.lastResponse).to.be.equal(undefined);
-
-            // Resolving the most recent request does!
-            respondToEchoRequest(server.requests[2]);
-            return requests[2].completes;
-          }).then(function() {
-            expect(echoAjax.lastResponse).to.be.deep.eql(
-                {url: '/echoes_request_url?order=3'});
-
-
-            // Resolving an out of order stale request after does nothing!
-            respondToEchoRequest(server.requests[1]);
-            return requests[1].completes;
-          }).then(function() {
-            expect(echoAjax.lastResponse).to.be.deep.eql(
-                {url: '/echoes_request_url?order=3'});
-          });
-        });
-
-        test('`loading` is true while the last one is loading', function() {
-          expect(echoAjax.loading).to.be.equal(true);
-
-          respondToEchoRequest(server.requests[0]);
-          return requests[0].completes.then(function() {
-            // We're still loading because requests[2] is the most recently
-            // made request.
-            expect(echoAjax.loading).to.be.equal(true);
-
-            respondToEchoRequest(server.requests[2]);
-            return requests[2].completes;
-          }).then(function() {
-            // Now we're done loading.
-            expect(echoAjax.loading).to.be.eql(false);
-
-            // Resolving an out of order stale request after should have
-            // no effect.
-            respondToEchoRequest(server.requests[1]);
-            return requests[1].completes;
-          }).then(function() {
-            expect(echoAjax.loading).to.be.eql(false);
-          });
-        });
-      });
-
-      suite('when params are changed', function() {
-        test('generates a request that reflects the change', function() {
-          ajax = fixture('ParamsGet');
-          request = ajax.generateRequest();
-
-          expect(request.xhr.url).to.be.equal('/responds_to_get_with_json?a=a');
-
-          ajax.params = {b: 'b'};
-          request = ajax.generateRequest();
-
-          expect(request.xhr.url).to.be.equal('/responds_to_get_with_json?b=b');
-        });
-      });
-
-      suite('when `auto` is enabled', function() {
-        setup(function() {
-          ajax = fixture('AutoGet');
-        });
-
-        test('automatically generates new requests', function() {
-          return new Promise(function(resolve) {
-            ajax.addEventListener('request', function() {
-              resolve();
-            });
-          });
-        });
-
-        test('does not send requests if url is not a string', function() {
-          return new Promise(function(resolve, reject) {
-            ajax.addEventListener('request', function() {
-              reject('A request was generated but url is null!');
-            });
-
-            ajax.url = null;
-            ajax.handleAs = 'text';
-
-            Polymer.Base.async(function() {
-              resolve();
-            }, 1);
-          });
-        });
-
-        test('deduplicates multiple changes to a single request', function() {
-          return new Promise(function(resolve, reject) {
-            ajax.addEventListener('request', function() {
-              server.respond();
-            });
-
-            ajax.addEventListener('response', function() {
-              try {
-                expect(ajax.activeRequests.length).to.be.eql(1);
-                resolve()
-              } catch (e) {
-                reject(e);
-              }
-            });
-
-            ajax.handleas = 'text';
-            ajax.params = { foo: 'bar' };
-            ajax.headers = { 'X-Foo': 'Bar' };
-          });
-        });
-
-        test('automatically generates new request when a sub-property of params is changed', function(done) {
-          ajax.addEventListener('request', function() {
-            server.respond();
-          });
-
-          ajax.params = { foo: 'bar' };
-          ajax.addEventListener('response', function() {
-            ajax.addEventListener('request', function() {
-              done();
-            });
-
-            ajax.set('params.foo', 'xyz');
-          });
-        });
-      });
-
-      suite('the last response', function() {
-        setup(function() {
-          request = ajax.generateRequest();
-          server.respond();
-        });
-
-        test('is accessible as a readonly property', function() {
-          return request.completes.then(function(request) {
-            expect(ajax.lastResponse).to.be.equal(request.response);
-          });
-        });
-
-
-        test('updates with each new response', function() {
-          return request.completes.then(function(request) {
-
-            expect(request.response).to.be.an('object');
-            expect(ajax.lastResponse).to.be.equal(request.response);
-
-            ajax.handleAs = 'text';
-            request = ajax.generateRequest();
-            server.respond();
-
-            return request.completes;
-          }).then(function(request) {
-            expect(request.response).to.be.a('string');
-            expect(ajax.lastResponse).to.be.equal(request.response);
-          });
-        });
-      });
-
-      suite('when making POST requests', function() {
-        setup(function() {
-          ajax = fixture('TrivialPost');
-        });
-
-        test('POSTs the value of the `body` attribute', function() {
-          var requestBody = JSON.stringify({foo: 'bar'});
-
-          ajax.body = requestBody;
-          ajax.generateRequest();
-
-          expect(server.requests[0]).to.be.ok;
-          expect(server.requests[0].requestBody).to.be.equal(requestBody);
-        });
-
-        test('if `contentType` is set to form encode, the body is encoded',function() {
-          ajax.body = {foo: 'bar\nbip', 'biz bo': 'baz blar'};
-          ajax.contentType = 'application/x-www-form-urlencoded';
-          ajax.generateRequest();
-
-          expect(server.requests[0]).to.be.ok;
-          expect(server.requests[0].requestBody).to.be.equal(
-              'foo=bar%0D%0Abip&biz+bo=baz+blar');
-        });
-
-        test('if `contentType` is json, the body is json encoded', function() {
-          var requestObj = {foo: 'bar', baz: [1,2,3]}
-          ajax.body = requestObj;
-          ajax.contentType = 'application/json';
-          ajax.generateRequest();
-
-          expect(server.requests[0]).to.be.ok;
-          expect(server.requests[0].requestBody).to.be.equal(
-              JSON.stringify(requestObj));
-        });
-
-        suite('the examples in the documentation work', function() {
-          test('json content, body attribute is an object', function() {
-            ajax.setAttribute('body', '{"foo": "bar baz", "x": 1}');
-            ajax.contentType = 'application/json';
-            ajax.generateRequest();
-
-            expect(server.requests[0]).to.be.ok;
-            expect(server.requests[0].requestBody).to.be.equal(
-                '{"foo":"bar baz","x":1}');
-          });
-
-          test('form content, body attribute is an object', function() {
-            ajax.setAttribute('body', '{"foo": "bar baz", "x": 1}');
-            ajax.contentType = 'application/x-www-form-urlencoded';
-            ajax.generateRequest();
-
-            expect(server.requests[0]).to.be.ok;
-            expect(server.requests[0].requestBody).to.be.equal(
-                'foo=bar+baz&x=1');
-          });
-        });
-
-        suite('and `contentType` is explicitly set to form encode', function() {
-          test('we encode a custom object', function() {
-            function Foo(bar) { this.bar = bar };
-            var requestObj = new Foo('baz');
-            ajax.body = requestObj;
-            ajax.contentType = 'application/x-www-form-urlencoded';
-            ajax.generateRequest();
-
-            expect(server.requests[0]).to.be.ok;
-            expect(server.requests[0].requestBody).to.be.equal('bar=baz');
-          });
-        })
-
-        suite('and `contentType` isn\'t set', function() {
-          test('we don\'t try to encode an ArrayBuffer', function() {
-            var requestObj = new ArrayBuffer()
-            ajax.body = requestObj;
-            ajax.generateRequest();
-
-            expect(server.requests[0]).to.be.ok;
-            // We give the browser the ArrayBuffer directly, without trying
-            // to encode it.
-            expect(server.requests[0].requestBody).to.be.equal(requestObj);
-          });
-        })
-      });
-
-      suite('when debouncing requests', function() {
-        setup(function() {
-          ajax = fixture('DebouncedGet');
-        });
-
-        test('only requests a single resource', function() {
-          ajax._requestOptionsChanged();
-          expect(server.requests[0]).to.be.equal(undefined);
-          ajax._requestOptionsChanged();
-          return timePasses(200).then(function() {
-            expect(server.requests[0]).to.be.ok;
-          });
-        });
-      });
-
-      suite('when a response handler is bound', function() {
-        var responseHandler;
-
-        setup(function() {
-          responseHandler = sinon.spy();
-          ajax.addEventListener('response', responseHandler);
-        });
-
-        test('calls the handler after every response', function() {
-          ajax.generateRequest();
-          ajax.generateRequest();
-
-          server.respond();
-
-          return ajax.lastRequest.completes.then(function() {
-            expect(responseHandler.callCount).to.be.equal(2);
-          });
-        });
-      });
-
-      suite('when the response type is `json`', function() {
-        setup(function() {
-          server.restore();
-        });
-
-        test('finds the JSON on any platform', function() {
-          ajax.url = '../bower.json';
-          request = ajax.generateRequest();
-          return request.completes.then(function() {
-            expect(ajax.lastResponse).to.be.instanceOf(Object);
-          });
-        });
-      });
-
-      suite('when handleAs parameter is `text`', function() {
-
-        test('response type is string', function() {
-          ajax.url = '/responds_to_get_with_json';
-          ajax.handleAs = 'text';
-
-          request = ajax.generateRequest();
-          var promise = request.completes.then(function() {
-            expect(typeof(ajax.lastResponse)).to.be.equal('string');
-          });
-
-          expect(server.requests.length).to.be.equal(1);
-          expect(server.requests[0].requestHeaders['accept']).to.be.equal(
-            'text/plain');
-          server.respond();
-
-          return promise;
-        });
-
-      });
-
-      suite('when a request fails', function() {
-        test('we give an error with useful details', function() {
-          ajax.url = '/responds_to_get_with_502_error_json';
-          ajax.handleAs = 'json';
-          var eventFired = false;
-          ajax.addEventListener('error', function(event) {
-            expect(event.detail.request).to.be.ok;
-            expect(event.detail.error).to.be.ok;
-            eventFired = true;
-          });
-          var request = ajax.generateRequest();
-          var promise = request.completes.then(function() {
-            throw new Error('Expected the request to fail!');
-          }, function(error) {
-            expect(error).to.be.instanceof(Error);
-            expect(request.succeeded).to.be.eq(false);
-            return timePasses(100);
-          }).then(function() {
-            expect(eventFired).to.be.eq(true);
-            expect(ajax.lastError).to.not.be.eq(null);
-            expect(ajax.lastError.status).to.be.eq(502);
-            expect(ajax.lastError.statusText).to.be.eq("Bad Gateway");
-            expect(ajax.lastError.response).to.be.ok;
-          });
-
-          server.respond();
-
-          return promise;
-        });
-
-        test('with rejectWithRequest the promise chain contains the request and error', function() {
-          ajax.url = '/responds_to_get_with_502_error_json';
-          ajax.handleAs = 'json';
-          ajax.rejectWithRequest = true;
-
-          var request = ajax.generateRequest();
-          var promise = request.completes.then(function() {
-            throw new Error('Expected the request to fail!');
-          }, function(resp) {
-            expect(resp.error).to.be.instanceof(Error);
-            expect(resp.request).to.deep.equal(request);
-          });
-
-          server.respond();
-
-          return promise;
-        });
-
-        test('we give a useful error even when the domain doesn\'t resolve', function() {
-          ajax.url = 'http://nonexistant.example.com/';
-          server.restore();
-          var eventFired = false;
-          ajax.addEventListener('error', function(event) {
-            expect(event.detail.request).to.be.ok;
-            expect(event.detail.error).to.be.ok;
-            eventFired = true;
-          });
-          var request = ajax.generateRequest();
-          var promise = request.completes.then(function() {
-            throw new Error('Expected the request to fail!');
-          }, function(error) {
-            expect(request.succeeded).to.be.eq(false);
-            expect(error).to.not.be.eq(null);
-            return timePasses(100);
-          }).then(function() {
-            expect(eventFired).to.be.eq(true);
-            expect(ajax.lastError).to.not.be.eq(null);
-          });
-
-          server.respond();
-
-          return promise;
-        });
-      });
-
-      suite('when handleAs parameter is `json`', function() {
-
-        test('response type is string', function() {
-          ajax.url = '/responds_to_get_with_json';
-          ajax.handleAs = 'json';
-
-          request = ajax.generateRequest();
-          var promise = request.completes.then(function() {
-            expect(typeof(ajax.lastResponse)).to.be.equal('object');
-          });
-
-          expect(server.requests.length).to.be.equal(1);
-          expect(server.requests[0].requestHeaders['accept']).to.be.equal(
-            'application/json');
-
-          server.respond();
-
-          return promise;
-        });
-
-      });
-
-      suite('when making a POST over the wire', function() {
-        test('FormData is handled correctly', function() {
-          server.restore();
-          var requestBody = new FormData();
-          requestBody.append('a', 'foo');
-          requestBody.append('b', 'bar');
-
-          var ajax = fixture('RealPost');
-          ajax.body = requestBody;
-          return ajax.generateRequest().completes.then(function() {
-            expect(ajax.lastResponse.headers['Content-Type']).to.match(
-                /^multipart\/form-data; boundary=.*$/);
-
-            expect(ajax.lastResponse.form.a).to.be.equal('foo');
-            expect(ajax.lastResponse.form.b).to.be.equal('bar');
-          });
-        });
-
-        test('json is handled correctly', function() {
-          server.restore();
-          var ajax = fixture('RealPost');
-          ajax.body = JSON.stringify({a: 'foo', b: 'bar'});
-          ajax.contentType = 'application/json';
-          return ajax.generateRequest().completes.then(function() {
-            expect(ajax.lastResponse.headers['Content-Type']).to.match(
-                /^application\/json(;.*)?$/);
-            expect(ajax.lastResponse.json.a).to.be.equal('foo');
-            expect(ajax.lastResponse.json.b).to.be.equal('bar');
-          });
-        });
-
-        test('urlencoded data is handled correctly', function() {
-          server.restore();
-          var ajax = fixture('RealPost');
-          ajax.body = 'a=foo&b=bar';
-          return ajax.generateRequest().completes.then(function() {
-            expect(ajax.lastResponse.headers['Content-Type']).to.match(
-                /^application\/x-www-form-urlencoded(;.*)?$/);
-
-            expect(ajax.lastResponse.form.a).to.be.equal('foo');
-            expect(ajax.lastResponse.form.b).to.be.equal('bar');
-          });
-        });
-
-        test('xml is handled correctly', function() {
-          server.restore();
-          var ajax = fixture('RealPost');
-
-          var xmlDoc = document.implementation.createDocument(
-              null, "foo", null);
-          var node = xmlDoc.createElement("bar");
-          node.setAttribute("name" , "baz");
-          xmlDoc.documentElement.appendChild(node);
-          ajax.body = xmlDoc;
-          return ajax.generateRequest().completes.then(function() {
-            expect(ajax.lastResponse.headers['Content-Type']).to.match(
-                /^application\/xml(;.*)?$/);
-            expect(ajax.lastResponse.data).to.match(
-                /<foo\s*><bar\s+name="baz"\s*\/><\/foo\s*>/);
-          });
-        });
-      });
-
-      suite('when setting timeout', function() {
-        setup(function() {
-          server.restore();
-        });
-
-        test('it is present in the request xhr object', function() {
-          ajax.url = '/responds_to_get_with_json';
-          ajax.timeout = 5000; // 5 Seconds
-
-          request = ajax.generateRequest();
-          expect(request.xhr.timeout).to.be.equal(5000); // 5 Seconds
-        });
-
-        test('it fails once that timeout is reached', function() {
-          var ajax = fixture('Delay');
-          ajax.timeout = 1; // 1 Millisecond
-
-          request = ajax.generateRequest();
-          return request.completes.then(function() {
-            throw new Error('Expected the request to throw an error.');
-          }, function() {
-            expect(request.succeeded).to.be.equal(false);
-            expect(request.xhr.status).to.be.equal(0);
-            expect(request.timedOut).to.be.equal(true);
-            return timePasses(1);
-          }).then(function() {
-            expect(ajax.loading).to.be.equal(false);
-            expect(ajax.lastResponse).to.be.equal(null);
-            expect(ajax.lastError).to.not.be.equal(null);
-          });
-        });
-      });
-
-      suite('when using the bubbles attribute', function() {
-        test('the request and response events should bubble to window', function(done) {
-          server.restore();
-          var total = 0;
-          function incrementTotal() {
-            total++;
-            if (total === 5) {
-              done();
-            }
-          }
-          window.addEventListener('iron-ajax-presend', incrementTotal);
-          window.addEventListener('request', incrementTotal);
-          window.addEventListener('iron-ajax-request', incrementTotal);
-          window.addEventListener('response', incrementTotal);
-          window.addEventListener('iron-ajax-response', incrementTotal);
-          var ajax = fixture('Bubbles')[0];
-          ajax.generateRequest();
-          server.respond();
-        });
-
-        test('the request and error events should bubble to window', function(done) {
-          var total = 0;
-          function incrementTotal() {
-            total++;
-            if (total === 5) {
-              done();
-            }
-          }
-          window.addEventListener('iron-ajax-presend', incrementTotal);
-          window.addEventListener('request', incrementTotal);
-          window.addEventListener('iron-ajax-request', incrementTotal);
-          // NOTE(cdata): This needs to be capturing because Mocha + Firefox
-          // results in the error event being observed too early by the test
-          // runner and failing the test:
-          window.addEventListener('error', incrementTotal, true);
-          window.addEventListener('iron-ajax-error', incrementTotal);
-          var ajax = fixture('Bubbles')[1];
-          ajax.generateRequest();
-          server.respond();
-        });
-      });
-
-      suite('when handling the `iron-ajax-presend` event', function() {
-        setup(function() {
-          server.restore();
-        });
-
-        test('ability to cancel request', function() {
-          var requestSpy = sinon.spy();
-          var promiseSpy = sinon.spy();
-
-          ajax.addEventListener('iron-ajax-presend', function(e) {
-            e.preventDefault();
-          });
-          ajax.addEventListener('iron-ajax-request', requestSpy);
-
-          var request = ajax.generateRequest();
-
-          return request.completes.catch(function(request) {
-            expect(request.aborted).to.be.true;
-            promiseSpy();
-          }).then(function() {
-            expect(promiseSpy).to.be.calledOnce;
-            expect(requestSpy).not.to.be.called;
-          });
-        });
-
-        test('ability to modify the request options', function(done) {
-          ajax.addEventListener('iron-ajax-presend', function(e) {
-            e.detail.options.url += '/test';
-            e.detail.options.headers.authToken = 'a.b.c';
-          });
-          ajax.addEventListener('iron-ajax-request', function(e) {
-            expect(e.detail.options.url).to.equal('/responds_to_get_with_json/test');
-            expect(e.detail.options.headers.authToken).to.equal('a.b.c');
-            done();
-          });
-
-          ajax.generateRequest();
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-ajax/test/iron-request.html b/systrace/catapult/third_party/polymer/components/iron-ajax/test/iron-request.html
deleted file mode 100644
index 6161bb5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-ajax/test/iron-request.html
+++ /dev/null
@@ -1,368 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-request</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../iron-request.html">
-</head>
-<body>
-  <test-fixture id="TrivialRequest">
-    <template>
-      <iron-request></iron-request>
-    </template>
-  </test-fixture>
-  <script>
-    suite('<iron-request>', function() {
-      var jsonResponseHeaders;
-      var successfulRequestOptions;
-      var request;
-      var server;
-
-      setup(function() {
-        jsonResponseHeaders = {
-          'Content-Type': 'application/json'
-        };
-        server = sinon.fakeServer.create();
-        server.respondWith('GET', '/responds_to_get_with_json', [
-          200,
-          jsonResponseHeaders,
-          '{"success":true}'
-        ]);
-
-        server.respondWith('GET', '/responds_to_get_with_prefixed_json', [
-          200,
-          jsonResponseHeaders,
-          '])}while(1);</x>{"success":true}'
-        ]);
-
-        server.respondWith('GET', '/responds_to_get_with_500', [
-          500,
-          {},
-          ''
-        ]);
-
-        server.respondWith('GET', '/responds_to_get_with_100', [
-          100,
-          {},
-          ''
-        ]);
-
-        server.respondWith('GET', '/responds_to_get_with_0', [
-          0,
-          jsonResponseHeaders,
-          '{"success":true}'
-        ]);
-
-
-        request = fixture('TrivialRequest');
-        successfulRequestOptions = {
-          url: '/responds_to_get_with_json'
-        };
-
-        synchronousSuccessfulRequestOptions = {
-          url: '/responds_to_get_with_json',
-          async: false,
-          timeout: 100
-        };
-
-        asynchronousSuccessfulRequestOptions = {
-          url: '/responds_to_get_with_json',
-          async: true,
-          timeout: 100
-        };
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      suite('basic usage', function() {
-        test('creates network requests, requiring only `url`', function() {
-          request.send(successfulRequestOptions);
-
-          server.respond();
-
-          expect(request.response).to.be.ok;
-        });
-
-        test('timeout not set if synchronous', function() {
-          request.send(synchronousSuccessfulRequestOptions);
-
-          expect(request.xhr.async).to.be.eql(false);
-          expect(request.xhr.timeout).to.be.eql(undefined);
-        });
-
-        test('timeout set if asynchronous', function() {
-          request.send(asynchronousSuccessfulRequestOptions);
-
-          expect(request.xhr.async).to.be.eql(true);
-          expect(request.xhr.timeout).to.be.eql(100);
-        });
-
-        test('sets async to true by default', function() {
-          request.send(successfulRequestOptions);
-          expect(request.xhr.async).to.be.eql(true);
-        });
-
-        test('can be aborted', function() {
-          request.send(successfulRequestOptions);
-
-          request.abort();
-
-          server.respond();
-
-          return request.completes.then(function() {
-            throw new Error('Request did not abort appropriately!');
-          }).catch(function(e) {
-            expect(request.response).to.not.be.ok;
-          });
-        });
-
-        test('can be aborted with request element', function() {
-          var options = {
-            url: successfulRequestOptions.url,
-            rejectWithRequest: true
-          };
-          request.send(options);
-
-          request.abort();
-
-          server.respond();
-
-          return request.completes.then(function() {
-            throw new Error('Request did not abort appropriately!');
-          }).catch(function(e) {
-            expect(e.error).to.be.instanceof(Error);
-            expect(e.request).to.deep.equal(request);
-          });
-        });
-
-        test('default responseType is text', function() {
-          request.send(successfulRequestOptions);
-          server.respond();
-
-          return request.completes.then(function() {
-            expect(request.response).to.be.an('string')
-          });
-        });
-
-        test('default responseType of text is not applied, when async is false', function() {
-          var options = Object.create(successfulRequestOptions);
-          options.async = false;
-
-          request.send(options);
-          server.respond();
-
-          return request.completes.then(function() {
-            expect(request.xhr.responseType).to.be.empty;
-          });
-        });
-
-        test('responseType can be configured via handleAs option', function() {
-          var options = Object.create(successfulRequestOptions);
-          options.handleAs = 'json';
-
-          request.send(options);
-          expect(server.requests.length).to.be.equal(1);
-          expect(server.requests[0].requestHeaders['accept']).to.be.equal(
-              'application/json');
-          server.respond();
-
-          return request.completes.then(function() {
-            expect(request.response).to.be.an('object');
-          });
-        });
-
-        test('setting jsonPrefix correctly strips it from the response', function() {
-          var options = {
-            url: '/responds_to_get_with_prefixed_json',
-            handleAs: 'json',
-            jsonPrefix: '])}while(1);</x>'
-          };
-
-          request.send(options);
-          expect(server.requests.length).to.be.equal(1);
-          expect(server.requests[0].requestHeaders['accept']).to.be.equal(
-              'application/json');
-          server.respond();
-
-          return request.completes.then(function() {
-            expect(request.response).to.deep.eq({success: true});
-          });
-        });
-
-        test('responseType cannot be configured via handleAs option, when async is false', function() {
-          var options = Object.create(successfulRequestOptions);
-          options.handleAs = 'json';
-          options.async = false;
-
-          request.send(options);
-          expect(server.requests.length).to.be.equal(1);
-          expect(server.requests[0].requestHeaders['accept']).to.be.equal(
-              'application/json');
-          server.respond();
-
-          return request.completes.then(function() {
-            expect(request.response).to.be.a('string');
-          });
-        });
-
-        test('headers are sent up', function() {
-          var options = Object.create(successfulRequestOptions);
-          options.headers = {
-            'foo': 'bar',
-            'accept': 'this should override the default'
-          };
-          request.send(options);
-          expect(server.requests.length).to.be.equal(1);
-          var fakeXhr = server.requests[0]
-          expect(fakeXhr.requestHeaders['foo']).to.be.equal(
-              'bar');
-          expect(fakeXhr.requestHeaders['accept']).to.be.equal(
-              'this should override the default');
-        });
-
-        test('headers are deduped by lowercasing', function() {
-          var options = Object.create(successfulRequestOptions);
-          options.headers = {
-            'foo': 'bar',
-            'Foo': 'bar',
-            'fOo': 'bar',
-            'Accept': 'this should also override the default'
-          };
-          request.send(options);
-          expect(server.requests.length).to.be.equal(1);
-          var fakeXhr = server.requests[0]
-          expect(Object.keys(fakeXhr.requestHeaders).length).to.be.equal(2);
-          expect(fakeXhr.requestHeaders['foo']).to.be.equal(
-              'bar');
-          expect(fakeXhr.requestHeaders['accept']).to.be.equal(
-              'this should also override the default');
-        });
-      });
-
-      suite('special cases', function() {
-        test('treats status code 0 as success, though the outcome is ambiguous', function() {
-          // Note: file:// status code will probably be 0 no matter what happened.
-          request.send({
-            url: '/responds_to_get_with_0'
-          });
-
-          server.respond();
-
-          expect(request.succeeded).to.be.equal(true);
-        });
-
-        test('special form characters', function() {
-          var testCases = [
-            {
-              test: null,
-              answer: ''
-            },
-            {
-              test: undefined,
-              answer: ''
-            },
-            {
-              test: NaN,
-              answer: 'NaN'
-            },
-            {
-              test: new String('\n\r\n\r'),
-              answer: '%0D%0A%0D%0A%0D' // \r\n\r\n\r
-            },
-            {
-              test: 0,
-              answer: '0'
-            },
-            {
-              test: new String('hello world'),
-              answer: 'hello+world'
-            }
-          ];
-
-          var testCase;
-          for (var i = 0; i < testCases.length; i++) {
-            testCase = testCases[i];
-            var encoded = request._wwwFormUrlEncodePiece(testCase.test);
-
-            expect(encoded).to.be.equal(testCase.answer);
-          }
-        });
-      });
-
-      suite('errors', function() {
-        test('treats status codes between 1 and 199 as errors', function() {
-          request.send({
-            url: '/responds_to_get_with_100'
-          });
-
-          server.respond();
-
-          expect(request.succeeded).to.be.equal(false);
-        });
-
-        test('treats status codes between 300 and ∞ as errors', function() {
-          request.send({
-            url: '/responds_to_get_with_500'
-          });
-
-          server.respond();
-
-          expect(request.succeeded).to.be.equal(false);
-        });
-      });
-
-      suite('status codes', function() {
-        test('status and statusText is set after a ambiguous request', function() {
-          request.send({
-            url: '/responds_to_get_with_0'
-          });
-
-          server.respond();
-
-          expect(request.status).to.be.equal(0);
-          expect(request.statusText).to.be.equal('');
-        });
-
-        test('status and statusText is set after a request that succeeded', function() {
-          request.send({
-            url: '/responds_to_get_with_json'
-          });
-
-          server.respond();
-
-          expect(request.status).to.be.equal(200);
-          expect(request.statusText).to.be.equal('OK');
-        });
-
-        test('status and statusText is set after a request that failed', function() {
-          request.send({
-            url: '/responds_to_get_with_500'
-          });
-
-          server.respond();
-
-          expect(request.status).to.be.equal(500);
-          expect(request.statusText).to.be.equal('Internal Server Error');
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/README.md b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/README.md
deleted file mode 100644
index 8a3363c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/README.md
+++ /dev/null
@@ -1,41 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-autogrow-textarea.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-autogrow-textarea.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-autogrow-textarea)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-autogrow-textarea)_
-
-
-##&lt;iron-autogrow-textarea&gt;
-
-`iron-autogrow-textarea` is an element containing a textarea that grows in height as more
-lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will
-never scroll.
-
-Example:
-
-```html
-<iron-autogrow-textarea></iron-autogrow-textarea>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--iron-autogrow-textarea` | Mixin applied to the textarea | `{}` |
-| `--iron-autogrow-textarea-placeholder` | Mixin applied to the textarea placeholder | `{}` |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/bower.json b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/bower.json
deleted file mode 100644
index 3abdfa3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/bower.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "iron-autogrow-textarea",
-  "version": "1.0.15",
-  "description": "A textarea element that automatically grows with input",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "input",
-    "textarea"
-  ],
-  "main": "iron-autogrow-textarea.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-autogrow-textarea.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-autogrow-textarea",
-  "ignore": [],
-  "dependencies": {
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
-    "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/demo/index.html
deleted file mode 100644
index 525d90a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/demo/index.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <title>iron-autogrow-textarea demo</title>
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../iron-autogrow-textarea.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      iron-autogrow-textarea {
-        display: block;
-        width: 200px;
-        margin: 5px 0;
-      }
-
-      textarea {
-        width: 200px;
-      }
-
-      .vertical-section {
-        box-sizing: border-box;
-        width: 400px;
-        margin: 0;
-      }
-    </style>
-  </head>
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>An iron-autogrow-textarea grows automatically as more text is entered</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <iron-autogrow-textarea></iron-autogrow-textarea>
-        </template>
-      </demo-snippet>
-
-      <h3>The maximum height can be controlled either through the <i>max-rows</i>
-      property, or through a fixed max height</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <iron-autogrow-textarea max-rows="4" placeholder="scrolls after 4 rows"></iron-autogrow-textarea>
-          <iron-autogrow-textarea style="max-height: 50px;" placeholder="scrolls after 50px"></iron-autogrow-textarea>
-        </template>
-      </demo-snippet>
-
-      <h3>The initial height can also be controlled using the <i>rows</i> property,
-      or through a fixed height</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <iron-autogrow-textarea rows="4" placeholder="start with 4 rows"></iron-autogrow-textarea>
-          <iron-autogrow-textarea style="height: 50px;"></iron-autogrow-textarea>
-        </template>
-      </demo-snippet>
-
-      <h3>Example of updating the value imperatively</h3>
-      <!-- TODO: replace this with a demo-snippet when https://github.com/webcomponents/webcomponentsjs/issues/362
-      is fixed -->
-      <div class="example">
-        <template is="dom-bind">
-          <div class="vertical-section">
-            <iron-autogrow-textarea bind-value="{{bindValue}}" id="a1"></iron-autogrow-textarea>
-            <br>
-            <code>bind-value</code>: <span>[[bindValue]]</span>
-            <p on-click="setValue">
-              Imperatively changing <code>bind-value</code> will also update
-              <code>textarea.value</code>:<br>
-              <textarea></textarea>
-              <button value="bindValue">set</button>
-              <br><br>
-
-              Imperatively updating <code>textarea.value</code> will update
-              the display, but not update <code>bind-value</code>:<br>
-              <textarea></textarea>
-              <button value="value">set</button>
-            </p>
-          </div>
-        </template>
-      </div>
-    </div>
-    <script>
-      var scope = document.querySelector('template[is=dom-bind]');
-
-      scope.setValue = function(event) {
-        if (!(event.target instanceof HTMLButtonElement)) {
-          return;
-        }
-        var inputValue = event.target.previousElementSibling.value;
-        if (event.target.value == "bindValue") {
-          document.querySelector('#a1').bindValue = inputValue;
-        } else {
-          document.querySelector('#a1').textarea.value = inputValue;
-        }
-      }
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/hero.svg b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/hero.svg
deleted file mode 100755
index ef7e97e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/hero.svg
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<path d="M140,47c-3,0-4.7-2.4-6.2-4.4c-1.3-1.9-2.4-3.6-4.7-3.6c-2.3,0-3.4,1.7-4.7,3.6c-1.5,2.1-3.1,4.4-6.4,4.4

-		c-3.3,0-4.9-2.4-6.4-4.4c-1.3-1.9-2.5-3.6-4.8-3.6c-2.3,0-3.4,1.7-4.8,3.6c-1.5,2.1-3.1,4.4-6.4,4.4s-5.2-2.4-6.7-4.4

-		c-1.3-1.9-2-3.6-5-3.6v-2c4,0,5.2,2.4,6.7,4.4c1.3,1.9,2.6,3.6,4.9,3.6c2.3,0,3.5-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.5-4.4

-		s5,2.4,6.4,4.4c1.3,1.9,2.5,3.6,4.8,3.6c2.3,0,3.4-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.4-4.4c3.3,0,4.7,2.4,6.2,4.4

-		c1.3,1.9,2.5,3.6,4.5,3.6V47z"/>

-	<path d="M140,65c-3,0-4.7-2.4-6.2-4.4c-1.3-1.9-2.4-3.6-4.7-3.6c-2.3,0-3.4,1.7-4.7,3.6c-1.5,2.1-3.1,4.4-6.4,4.4

-		c-3.3,0-4.9-2.4-6.4-4.4c-1.3-1.9-2.5-3.6-4.8-3.6c-2.3,0-3.4,1.7-4.8,3.6c-1.5,2.1-3.1,4.4-6.4,4.4s-5.2-2.4-6.7-4.4

-		c-1.3-1.9-2-3.6-5-3.6v-2c4,0,5.2,2.4,6.7,4.4c1.3,1.9,2.6,3.6,4.9,3.6c2.3,0,3.5-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.5-4.4

-		s5,2.4,6.4,4.4c1.3,1.9,2.5,3.6,4.8,3.6c2.3,0,3.4-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.4-4.4c3.3,0,4.7,2.4,6.2,4.4

-		c1.3,1.9,2.5,3.6,4.5,3.6V65z"/>

-	<path d="M140,83c-3,0-4.7-2.4-6.2-4.4c-1.3-1.9-2.4-3.6-4.7-3.6c-2.3,0-3.4,1.7-4.7,3.6c-1.5,2.1-3.1,4.4-6.4,4.4

-		c-3.3,0-4.9-2.4-6.4-4.4c-1.3-1.9-2.5-3.6-4.8-3.6c-2.3,0-3.4,1.7-4.8,3.6c-1.5,2.1-3.1,4.4-6.4,4.4s-5.2-2.4-6.7-4.4

-		c-1.3-1.9-2-3.6-5-3.6v-2c4,0,5.2,2.4,6.7,4.4c1.3,1.9,2.6,3.6,4.9,3.6c2.3,0,3.5-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.5-4.4

-		s5,2.4,6.4,4.4c1.3,1.9,2.5,3.6,4.8,3.6c2.3,0,3.4-1.7,4.8-3.6c1.5-2.1,3.1-4.4,6.4-4.4c3.3,0,4.7,2.4,6.2,4.4

-		c1.3,1.9,2.5,3.6,4.5,3.6V83z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-	<path d="M151,102H73V24h78V102z M75,100h74V26H75V100z"/>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/index.html b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/index.html
deleted file mode 100644
index 3be2964..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-    <title>iron-autogrow-textarea</title>
-
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../polymer/polymer.html">
-    <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-  </head>
-  <body>
-
-    <iron-component-page></iron-component-page>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/iron-autogrow-textarea.html b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/iron-autogrow-textarea.html
deleted file mode 100644
index b70d6ae..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/iron-autogrow-textarea.html
+++ /dev/null
@@ -1,373 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
-<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
-
-<!--
-`iron-autogrow-textarea` is an element containing a textarea that grows in height as more
-lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will
-never scroll.
-
-Example:
-
-    <iron-autogrow-textarea></iron-autogrow-textarea>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--iron-autogrow-textarea` | Mixin applied to the textarea | `{}`
-`--iron-autogrow-textarea-placeholder` | Mixin applied to the textarea placeholder | `{}`
-
-@group Iron Elements
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="iron-autogrow-textarea">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        position: relative;
-        width: 400px;
-        border: 1px solid;
-        padding: 2px;
-        -moz-appearance: textarea;
-        -webkit-appearance: textarea;
-        overflow: hidden;
-      }
-
-      .mirror-text {
-        visibility: hidden;
-        word-wrap: break-word;
-      }
-
-      .fit {
-        @apply(--layout-fit);
-      }
-
-      textarea {
-        position: relative;
-        outline: none;
-        border: none;
-        resize: none;
-        background: inherit;
-        color: inherit;
-        /* see comments in template */
-        width: 100%;
-        height: 100%;
-        font-size: inherit;
-        font-family: inherit;
-        line-height: inherit;
-        text-align: inherit;
-        @apply(--iron-autogrow-textarea);
-      }
-
-      ::content textarea:invalid {
-        box-shadow: none;
-      }
-
-      textarea::-webkit-input-placeholder {
-        @apply(--iron-autogrow-textarea-placeholder);
-      }
-
-      textarea:-moz-placeholder {
-        @apply(--iron-autogrow-textarea-placeholder);
-      }
-
-      textarea::-moz-placeholder {
-        @apply(--iron-autogrow-textarea-placeholder);
-      }
-
-      textarea:-ms-input-placeholder {
-        @apply(--iron-autogrow-textarea-placeholder);
-      }
-    </style>
-
-    <!-- the mirror sizes the input/textarea so it grows with typing -->
-    <!-- use &#160; instead &nbsp; of to allow this element to be used in XHTML -->
-    <div id="mirror" class="mirror-text" aria-hidden="true">&#160;</div>
-
-    <!-- size the input/textarea with a div, because the textarea has intrinsic size in ff -->
-    <div class="textarea-container fit">
-      <textarea id="textarea"
-        name$="[[name]]"
-        autocomplete$="[[autocomplete]]"
-        autofocus$="[[autofocus]]"
-        inputmode$="[[inputmode]]"
-        placeholder$="[[placeholder]]"
-        readonly$="[[readonly]]"
-        required$="[[required]]"
-        disabled$="[[disabled]]"
-        rows$="[[rows]]"
-        minlength$="[[minlength]]"
-        maxlength$="[[maxlength]]"></textarea>
-    </div>
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'iron-autogrow-textarea',
-
-    behaviors: [
-      Polymer.IronFormElementBehavior,
-      Polymer.IronValidatableBehavior,
-      Polymer.IronControlState
-    ],
-
-    properties: {
-
-      /**
-       * Use this property instead of `value` for two-way data binding.
-       * This property will be deprecated in the future. Use `value` instead.
-       * @type {string|number}
-       */
-      bindValue: {
-        observer: '_bindValueChanged',
-        type: String
-      },
-
-      /**
-       * The initial number of rows.
-       *
-       * @attribute rows
-       * @type number
-       * @default 1
-       */
-      rows: {
-        type: Number,
-        value: 1,
-        observer: '_updateCached'
-      },
-
-      /**
-       * The maximum number of rows this element can grow to until it
-       * scrolls. 0 means no maximum.
-       *
-       * @attribute maxRows
-       * @type number
-       * @default 0
-       */
-      maxRows: {
-       type: Number,
-       value: 0,
-       observer: '_updateCached'
-      },
-
-      /**
-       * Bound to the textarea's `autocomplete` attribute.
-       */
-      autocomplete: {
-        type: String,
-        value: 'off'
-      },
-
-      /**
-       * Bound to the textarea's `autofocus` attribute.
-       */
-      autofocus: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Bound to the textarea's `inputmode` attribute.
-       */
-      inputmode: {
-        type: String
-      },
-
-      /**
-       * Bound to the textarea's `placeholder` attribute.
-       */
-      placeholder: {
-        type: String
-      },
-
-      /**
-       * Bound to the textarea's `readonly` attribute.
-       */
-      readonly: {
-        type: String
-      },
-
-      /**
-       * Set to true to mark the textarea as required.
-       */
-      required: {
-        type: Boolean
-      },
-
-      /**
-       * The minimum length of the input value.
-       */
-      minlength: {
-        type: Number
-      },
-
-      /**
-       * The maximum length of the input value.
-       */
-      maxlength: {
-        type: Number
-      }
-
-    },
-
-    listeners: {
-      'input': '_onInput'
-    },
-
-    observers: [
-      '_onValueChanged(value)'
-    ],
-
-    /**
-     * Returns the underlying textarea.
-     * @type HTMLTextAreaElement
-     */
-    get textarea() {
-      return this.$.textarea;
-    },
-
-    /**
-     * Returns textarea's selection start.
-     * @type Number
-     */
-    get selectionStart() {
-      return this.$.textarea.selectionStart;
-    },
-
-    /**
-     * Returns textarea's selection end.
-     * @type Number
-     */
-    get selectionEnd() {
-      return this.$.textarea.selectionEnd;
-    },
-
-    /**
-     * Sets the textarea's selection start.
-     */
-    set selectionStart(value) {
-      this.$.textarea.selectionStart = value;
-    },
-
-    /**
-     * Sets the textarea's selection end.
-     */
-    set selectionEnd(value) {
-      this.$.textarea.selectionEnd = value;
-    },
-
-    attached: function() {
-      /* iOS has an arbitrary left margin of 3px that isn't present
-       * in any other browser, and means that the paper-textarea's cursor
-       * overlaps the label.
-       * See https://github.com/PolymerElements/paper-input/issues/468.
-       */
-      var IS_IOS = navigator.userAgent.match(/iP(?:[oa]d|hone)/);
-      if (IS_IOS) {
-        this.$.textarea.style.marginLeft = '-3px';
-      }
-    },
-
-    /**
-     * Returns true if `value` is valid. The validator provided in `validator`
-     * will be used first, if it exists; otherwise, the `textarea`'s validity
-     * is used.
-     * @return {boolean} True if the value is valid.
-     */
-    validate: function() {
-      // Empty, non-required input is valid.
-      if (!this.required && this.value == '') {
-        this.invalid = false;
-        return true;
-      }
-
-      var valid;
-      if (this.hasValidator()) {
-        valid = Polymer.IronValidatableBehavior.validate.call(this, this.value);
-      } else {
-        valid = this.$.textarea.validity.valid;
-        this.invalid = !valid;
-      }
-      this.fire('iron-input-validate');
-      return valid;
-    },
-
-    _bindValueChanged: function() {
-      var textarea = this.textarea;
-      if (!textarea) {
-        return;
-      }
-
-      // If the bindValue changed manually, then we need to also update
-      // the underlying textarea's value. Otherwise this change was probably
-      // generated from the _onInput handler, and the two values are already
-      // the same.
-      if (textarea.value !== this.bindValue) {
-        textarea.value = !(this.bindValue || this.bindValue === 0) ? '' : this.bindValue;
-      }
-
-      this.value = this.bindValue;
-      this.$.mirror.innerHTML = this._valueForMirror();
-      // manually notify because we don't want to notify until after setting value
-      this.fire('bind-value-changed', {value: this.bindValue});
-    },
-
-    _onInput: function(event) {
-      this.bindValue = event.path ? event.path[0].value : event.target.value;
-    },
-
-    _constrain: function(tokens) {
-      var _tokens;
-      tokens = tokens || [''];
-      // Enforce the min and max heights for a multiline input to avoid measurement
-      if (this.maxRows > 0 && tokens.length > this.maxRows) {
-        _tokens = tokens.slice(0, this.maxRows);
-      } else {
-        _tokens = tokens.slice(0);
-      }
-      while (this.rows > 0 && _tokens.length < this.rows) {
-        _tokens.push('');
-      }
-      // Use &#160; instead &nbsp; of to allow this element to be used in XHTML.
-      return _tokens.join('<br/>') + '&#160;';
-    },
-
-    _valueForMirror: function() {
-      var input = this.textarea;
-      if (!input) {
-        return;
-      }
-      this.tokens = (input && input.value) ? input.value.replace(/&/gm, '&amp;').replace(/"/gm, '&quot;').replace(/'/gm, '&#39;').replace(/</gm, '&lt;').replace(/>/gm, '&gt;').split('\n') : [''];
-      return this._constrain(this.tokens);
-    },
-
-    _updateCached: function() {
-      this.$.mirror.innerHTML = this._constrain(this.tokens);
-    },
-
-    _onValueChanged: function() {
-      this.bindValue = this.value;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/test/basic.html
deleted file mode 100644
index 51f3aba..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/test/basic.html
+++ /dev/null
@@ -1,190 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>iron-autogrow-textarea tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-      <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../iron-test-helpers/mock-interactions.js"></script>
-    <link rel="import" href="../iron-autogrow-textarea.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <iron-autogrow-textarea></iron-autogrow-textarea>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="has-bindValue">
-      <template>
-        <iron-autogrow-textarea bind-value="foobar"></iron-autogrow-textarea>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="has-value">
-      <template>
-        <iron-autogrow-textarea value="foobar"></iron-autogrow-textarea>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="rows">
-      <template>
-        <iron-autogrow-textarea rows="3"></iron-autogrow-textarea>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('basic', function() {
-
-        test('setting bindValue sets textarea value', function() {
-          var autogrow = fixture('basic');
-          var textarea = autogrow.textarea;
-
-          autogrow.bindValue = 'batman';
-          assert.equal(textarea.value, autogrow.bindValue, 'textarea value equals to bindValue');
-        });
-
-        test('can set an initial bindValue', function() {
-          var autogrow = fixture('has-bindValue');
-          assert.equal(autogrow.textarea.value, 'foobar', 'textarea value equals to initial bindValue');
-          assert.equal(autogrow.value, 'foobar', 'value equals to initial bindValue');
-        });
-
-        test('can set an initial value', function() {
-          var autogrow = fixture('has-value');
-          assert.equal(autogrow.textarea.value, 'foobar', 'textarea value equals to initial bindValue');
-          assert.equal(autogrow.bindValue, 'foobar', 'textarea bindValue equals to initial value');
-        });
-
-        test('can update the value', function() {
-          var autogrow = fixture('has-bindValue');
-          assert.equal(autogrow.textarea.value, 'foobar', 'textarea value equals to initial bindValue');
-          autogrow.value = 'batman';
-          assert.equal(autogrow.textarea.value, 'batman', 'textarea value is updated');
-          assert.equal(autogrow.bindValue, 'batman', 'bindValue is updated');
-          assert.equal(autogrow.value, 'batman', 'value is updated');
-        });
-
-        test('can update the bindValue', function() {
-          var autogrow = fixture('has-bindValue');
-          assert.equal(autogrow.textarea.value, 'foobar', 'textarea value equals to initial bindValue');
-          autogrow.bindValue = 'batman';
-          assert.equal(autogrow.textarea.value, 'batman', 'textarea value is updated');
-          assert.equal(autogrow.bindValue, 'batman', 'bindValue is updated');
-          assert.equal(autogrow.value, 'batman', 'value is updated');
-        });
-
-        test('can set an initial number of rows', function() {
-          var autogrow = fixture("rows");
-          assert.equal(autogrow.textarea.rows, 3, 'textarea has rows=3');
-        });
-
-        test('adding rows grows the textarea', function() {
-          var autogrow = fixture('basic');
-          var initialHeight = autogrow.offsetHeight;
-
-          autogrow.bindValue = 'batman\nand\nrobin';
-          var finalHeight = autogrow.offsetHeight
-          assert.isTrue(finalHeight > initialHeight);
-        });
-
-        test('removing rows shrinks the textarea', function() {
-          var autogrow = fixture('basic');
-          autogrow.bindValue = 'batman\nand\nrobin';
-          var initialHeight = autogrow.offsetHeight;
-
-          autogrow.bindValue = 'batman';
-          var finalHeight = autogrow.offsetHeight
-          assert.isTrue(finalHeight < initialHeight);
-        });
-
-        test('an undefined bindValue is the empty string', function() {
-          var autogrow = fixture('basic');
-          var initialHeight = autogrow.offsetHeight;
-
-          autogrow.bindValue = 'batman\nand\nrobin';
-          var finalHeight = autogrow.offsetHeight;
-          assert.isTrue(finalHeight > initialHeight);
-
-          autogrow.bindValue = undefined;
-          assert.equal(autogrow.offsetHeight, initialHeight);
-          assert.equal(autogrow.textarea.value, '');
-        });
-
-        test('textarea selection works', function() {
-          var autogrow = fixture('basic');
-          var textarea = autogrow.textarea;
-          autogrow.bindValue = 'batman\nand\nrobin';
-
-          autogrow.selectionStart = 3;
-          autogrow.selectionEnd = 5;
-
-          assert.equal(textarea.selectionStart, 3);
-          assert.equal(textarea.selectionEnd, 5);
-        });
-      });
-
-      suite('focus/blur events', function() {
-        var input;
-
-        setup(function() {
-          input = fixture('basic');
-        });
-
-        test('focus/blur events fired on host element', function(done) {
-          var nFocusEvents = 0;
-          var nBlurEvents = 0;
-          input.addEventListener('focus', function() {
-            nFocusEvents += 1;
-            // setTimeout to wait for potentially more, erroneous events
-            setTimeout(function() {
-              assert.equal(nFocusEvents, 1, 'one focus event fired');
-              MockInteractions.blur(input.textarea);
-            });
-          });
-          input.addEventListener('blur', function() {
-            nBlurEvents += 1;
-            // setTimeout to wait for potentially more, erroneous events
-            setTimeout(function() {
-              assert.equal(nBlurEvents, 1, 'one blur event fired');
-              done();
-            });
-          });
-          MockInteractions.focus(input.textarea);
-        });
-
-      });
-
-      suite('validation', function() {
-        test('a required textarea with no text is invalid', function() {
-          var input = fixture('basic');
-          input.required = true;
-          assert.isFalse(input.validate());
-
-          input.bindValue = 'batman';
-          assert.isTrue(input.validate());
-        });
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/test/index.html b/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/test/index.html
deleted file mode 100644
index c4c5215..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-autogrow-textarea/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-    <title>iron-autogrow-textarea tests</title>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'basic.html',
-        'basic.html?dom=shadow'
-      ]);
-    </script>
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-behaviors/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/README.md b/systrace/catapult/third_party/polymer/components/iron-behaviors/README.md
deleted file mode 100644
index 0a0629e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-button-state.html  iron-control-state.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-behaviors)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-behaviors)_
-
-
-<!-- No docs for Polymer.IronButtonState found. -->
-
-<!-- No docs for Polymer.IronControlState found. -->
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/bower.json b/systrace/catapult/third_party/polymer/components/iron-behaviors/bower.json
deleted file mode 100644
index 68cf080..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/bower.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "name": "iron-behaviors",
-  "version": "1.0.18",
-  "description": "Provides a set of behaviors for the iron elements",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-behaviors.git"
-  },
-  "main": [
-    "iron-button-state.html",
-    "iron-control-state.html"
-  ],
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.2.0",
-    "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.2",
-    "paper-input": "polymerelements/paper-input#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/demo/index.html
deleted file mode 100644
index 51fe2d6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/demo/index.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>simple-button</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link href="../../paper-styles/demo-pages.html" rel="import">
-  <link href="simple-button.html" rel="import">
-
-  <style>
-
-    .vertical-section {
-      text-align: center;
-    }
-
-  </style>
-
-</head>
-<body>
-  <div class="vertical-section vertical-section-container centered">
-    <h3>Normal</h3>
-
-    <simple-button tabindex="0">Hello World</simple-button>
-
-    <h3>Toggles</h3>
-
-    <simple-button toggles tabindex="0">Hello World</simple-button>
-
-    <h3>Disabled</h3>
-
-    <simple-button disabled tabindex="0">Hello World</simple-button>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/demo/simple-button.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/demo/simple-button.html
deleted file mode 100644
index bfa6a2b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/demo/simple-button.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-button-state.html">
-<link rel="import" href="../iron-control-state.html">
-
-<dom-module id="simple-button">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        background-color: #4285F4;
-        color: #fff;
-        min-height: 8px;
-        min-width: 8px;
-        padding: 16px;
-        text-transform: uppercase;
-        border-radius: 3px;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        -webkit-user-select: none;
-        user-select: none;
-        cursor: pointer;
-      }
-
-      :host([disabled]) {
-        opacity: 0.3;
-        pointer-events: none;
-      }
-
-      :host([active]),
-      :host([pressed]) {
-        background-color: #3367D6;
-        box-shadow: inset 0 3px 5px rgba(0,0,0,.2);
-      }
-    </style>
-    
-    <content></content>
-
-  </template>
-
-  <script>
-
-    Polymer({
-
-      behaviors: [
-        Polymer.IronControlState,
-        Polymer.IronButtonState
-      ],
-
-      hostAttributes: {
-        role: 'button'
-      }
-    });
-
-  </script>
-
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/index.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/index.html
deleted file mode 100644
index 220deb0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>Iron Behaviors</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page src="iron-button-state.html"></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/iron-button-state.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/iron-button-state.html
deleted file mode 100644
index c5221b8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/iron-button-state.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="iron-control-state.html">
-
-<script>
-
-  /**
-   * @demo demo/index.html
-   * @polymerBehavior Polymer.IronButtonState
-   */
-  Polymer.IronButtonStateImpl = {
-
-    properties: {
-
-      /**
-       * If true, the user is currently holding down the button.
-       */
-      pressed: {
-        type: Boolean,
-        readOnly: true,
-        value: false,
-        reflectToAttribute: true,
-        observer: '_pressedChanged'
-      },
-
-      /**
-       * If true, the button toggles the active state with each tap or press
-       * of the spacebar.
-       */
-      toggles: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true
-      },
-
-      /**
-       * If true, the button is a toggle and is currently in the active state.
-       */
-      active: {
-        type: Boolean,
-        value: false,
-        notify: true,
-        reflectToAttribute: true
-      },
-
-      /**
-       * True if the element is currently being pressed by a "pointer," which
-       * is loosely defined as mouse or touch input (but specifically excluding
-       * keyboard input).
-       */
-      pointerDown: {
-        type: Boolean,
-        readOnly: true,
-        value: false
-      },
-
-      /**
-       * True if the input device that caused the element to receive focus
-       * was a keyboard.
-       */
-      receivedFocusFromKeyboard: {
-        type: Boolean,
-        readOnly: true
-      },
-
-      /**
-       * The aria attribute to be set if the button is a toggle and in the
-       * active state.
-       */
-      ariaActiveAttribute: {
-        type: String,
-        value: 'aria-pressed',
-        observer: '_ariaActiveAttributeChanged'
-      }
-    },
-
-    listeners: {
-      down: '_downHandler',
-      up: '_upHandler',
-      tap: '_tapHandler'
-    },
-
-    observers: [
-      '_focusChanged(focused)',
-      '_activeChanged(active, ariaActiveAttribute)'
-    ],
-
-    keyBindings: {
-      'enter:keydown': '_asyncClick',
-      'space:keydown': '_spaceKeyDownHandler',
-      'space:keyup': '_spaceKeyUpHandler',
-    },
-
-    _mouseEventRe: /^mouse/,
-
-    _tapHandler: function() {
-      if (this.toggles) {
-       // a tap is needed to toggle the active state
-        this._userActivate(!this.active);
-      } else {
-        this.active = false;
-      }
-    },
-
-    _focusChanged: function(focused) {
-      this._detectKeyboardFocus(focused);
-
-      if (!focused) {
-        this._setPressed(false);
-      }
-    },
-
-    _detectKeyboardFocus: function(focused) {
-      this._setReceivedFocusFromKeyboard(!this.pointerDown && focused);
-    },
-
-    // to emulate native checkbox, (de-)activations from a user interaction fire
-    // 'change' events
-    _userActivate: function(active) {
-      if (this.active !== active) {
-        this.active = active;
-        this.fire('change');
-      }
-    },
-
-    _downHandler: function(event) {
-      this._setPointerDown(true);
-      this._setPressed(true);
-      this._setReceivedFocusFromKeyboard(false);
-    },
-
-    _upHandler: function() {
-      this._setPointerDown(false);
-      this._setPressed(false);
-    },
-
-    /**
-     * @param {!KeyboardEvent} event .
-     */
-    _spaceKeyDownHandler: function(event) {
-      var keyboardEvent = event.detail.keyboardEvent;
-      var target = Polymer.dom(keyboardEvent).localTarget;
-
-      // Ignore the event if this is coming from a focused light child, since that
-      // element will deal with it.
-      if (this.isLightDescendant(/** @type {Node} */(target)))
-        return;
-
-      keyboardEvent.preventDefault();
-      keyboardEvent.stopImmediatePropagation();
-      this._setPressed(true);
-    },
-
-    /**
-     * @param {!KeyboardEvent} event .
-     */
-    _spaceKeyUpHandler: function(event) {
-      var keyboardEvent = event.detail.keyboardEvent;
-      var target = Polymer.dom(keyboardEvent).localTarget;
-
-      // Ignore the event if this is coming from a focused light child, since that
-      // element will deal with it.
-      if (this.isLightDescendant(/** @type {Node} */(target)))
-        return;
-
-      if (this.pressed) {
-        this._asyncClick();
-      }
-      this._setPressed(false);
-    },
-
-    // trigger click asynchronously, the asynchrony is useful to allow one
-    // event handler to unwind before triggering another event
-    _asyncClick: function() {
-      this.async(function() {
-        this.click();
-      }, 1);
-    },
-
-    // any of these changes are considered a change to button state
-
-    _pressedChanged: function(pressed) {
-      this._changedButtonState();
-    },
-
-    _ariaActiveAttributeChanged: function(value, oldValue) {
-      if (oldValue && oldValue != value && this.hasAttribute(oldValue)) {
-        this.removeAttribute(oldValue);
-      }
-    },
-
-    _activeChanged: function(active, ariaActiveAttribute) {
-      if (this.toggles) {
-        this.setAttribute(this.ariaActiveAttribute,
-                          active ? 'true' : 'false');
-      } else {
-        this.removeAttribute(this.ariaActiveAttribute);
-      }
-      this._changedButtonState();
-    },
-
-    _controlStateChanged: function() {
-      if (this.disabled) {
-        this._setPressed(false);
-      } else {
-        this._changedButtonState();
-      }
-    },
-
-    // provide hook for follow-on behaviors to react to button-state
-
-    _changedButtonState: function() {
-      if (this._buttonStateChanged) {
-        this._buttonStateChanged(); // abstract
-      }
-    }
-
-  };
-
-  /** @polymerBehavior */
-  Polymer.IronButtonState = [
-    Polymer.IronA11yKeysBehavior,
-    Polymer.IronButtonStateImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/iron-control-state.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/iron-control-state.html
deleted file mode 100644
index f34d057..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/iron-control-state.html
+++ /dev/null
@@ -1,110 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-
-  /**
-   * @demo demo/index.html
-   * @polymerBehavior
-   */
-  Polymer.IronControlState = {
-
-    properties: {
-
-      /**
-       * If true, the element currently has focus.
-       */
-      focused: {
-        type: Boolean,
-        value: false,
-        notify: true,
-        readOnly: true,
-        reflectToAttribute: true
-      },
-
-      /**
-       * If true, the user cannot interact with this element.
-       */
-      disabled: {
-        type: Boolean,
-        value: false,
-        notify: true,
-        observer: '_disabledChanged',
-        reflectToAttribute: true
-      },
-
-      _oldTabIndex: {
-        type: Number
-      },
-
-      _boundFocusBlurHandler: {
-        type: Function,
-        value: function() {
-          return this._focusBlurHandler.bind(this);
-        }
-      }
-
-    },
-
-    observers: [
-      '_changedControlState(focused, disabled)'
-    ],
-
-    ready: function() {
-      this.addEventListener('focus', this._boundFocusBlurHandler, true);
-      this.addEventListener('blur', this._boundFocusBlurHandler, true);
-    },
-
-    _focusBlurHandler: function(event) {
-      // NOTE(cdata):  if we are in ShadowDOM land, `event.target` will
-      // eventually become `this` due to retargeting; if we are not in
-      // ShadowDOM land, `event.target` will eventually become `this` due
-      // to the second conditional which fires a synthetic event (that is also
-      // handled). In either case, we can disregard `event.path`.
-
-      if (event.target === this) {
-        this._setFocused(event.type === 'focus');
-      } else if (!this.shadowRoot) {
-        var target = /** @type {Node} */(Polymer.dom(event).localTarget);
-        if (!this.isLightDescendant(target)) {
-          this.fire(event.type, {sourceEvent: event}, {
-            node: this,
-            bubbles: event.bubbles,
-            cancelable: event.cancelable
-          });
-        }
-      }
-    },
-
-    _disabledChanged: function(disabled, old) {
-      this.setAttribute('aria-disabled', disabled ? 'true' : 'false');
-      this.style.pointerEvents = disabled ? 'none' : '';
-      if (disabled) {
-        this._oldTabIndex = this.tabIndex;
-        this._setFocused(false);
-        this.tabIndex = -1;
-        this.blur();
-      } else if (this._oldTabIndex !== undefined) {
-        this.tabIndex = this._oldTabIndex;
-      }
-    },
-
-    _changedControlState: function() {
-      // _controlStateChanged is abstract, follow-on behaviors may implement it
-      if (this._controlStateChanged) {
-        this._controlStateChanged();
-      }
-    }
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/active-state.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/test/active-state.html
deleted file mode 100644
index e1ed479..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/active-state.html
+++ /dev/null
@@ -1,290 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>active-state</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-  <link rel="import" href="test-elements.html">
-  <link rel="import" href="../../paper-input/paper-input.html">
-</head>
-<body>
-  <test-fixture id="TrivialActiveState">
-    <template>
-      <test-button></test-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ToggleActiveState">
-    <template>
-      <test-button toggles></test-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ButtonWithNativeInput">
-    <template>
-      <test-light-dom><input id="input"></test-light-dom>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ButtonWithPaperInput">
-    <template>
-      <test-light-dom><paper-input id="input"></paper-input></test-light-dom>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('active-state', function() {
-      var activeTarget;
-
-      setup(function() {
-        activeTarget = fixture('TrivialActiveState');
-      });
-
-      suite('active state with toggles attribute', function() {
-        setup(function() {
-          activeTarget = fixture('ToggleActiveState');
-        });
-
-        suite('when down', function() {
-          test('is pressed', function() {
-            MockInteractions.down(activeTarget);
-            expect(activeTarget.hasAttribute('pressed')).to.be.eql(true);
-          });
-        });
-
-        suite('when clicked', function() {
-          test('is activated', function(done) {
-            MockInteractions.downAndUp(activeTarget, function() {
-              try {
-                expect(activeTarget.hasAttribute('active')).to.be.eql(true);
-                expect(activeTarget.hasAttribute('aria-pressed')).to.be.eql(true);
-                expect(activeTarget.getAttribute('aria-pressed')).to.be.eql('true');
-                done();
-              } catch (e) {
-                done(e);
-              }
-            });
-          });
-
-          test('is deactivated by a subsequent click', function(done) {
-            MockInteractions.downAndUp(activeTarget, function() {
-              MockInteractions.downAndUp(activeTarget, function() {
-                try {
-                  expect(activeTarget.hasAttribute('active')).to.be.eql(false);
-                  expect(activeTarget.hasAttribute('aria-pressed')).to.be.eql(true);
-                  expect(activeTarget.getAttribute('aria-pressed')).to.be.eql('false');
-                  done();
-                } catch (e) {
-                  done(e);
-                }
-              });
-            });
-          });
-
-          test('the correct aria attribute is set', function(done) {
-            activeTarget.ariaActiveAttribute = 'aria-checked';
-            MockInteractions.downAndUp(activeTarget, function() {
-              try {
-                expect(activeTarget.hasAttribute('active')).to.be.eql(true);
-                expect(activeTarget.hasAttribute('aria-checked')).to.be.eql(true);
-                expect(activeTarget.getAttribute('aria-checked')).to.be.eql('true');
-                done();
-              } catch (e) {
-                done(e);
-              }
-            });
-          });
-
-          test('the aria attribute is updated correctly', function(done) {
-            activeTarget.ariaActiveAttribute = 'aria-checked';
-            MockInteractions.downAndUp(activeTarget, function() {
-              try {
-                expect(activeTarget.hasAttribute('active')).to.be.eql(true);
-                expect(activeTarget.hasAttribute('aria-checked')).to.be.eql(true);
-                expect(activeTarget.getAttribute('aria-checked')).to.be.eql('true');
-
-                activeTarget.ariaActiveAttribute = 'aria-pressed';
-                expect(activeTarget.hasAttribute('aria-checked')).to.be.eql(false);
-                expect(activeTarget.hasAttribute('aria-pressed')).to.be.eql(true);
-                expect(activeTarget.getAttribute('aria-pressed')).to.be.eql('true');
-                done();
-              } catch (e) {
-                done(e);
-              }
-            });
-          });
-        });
-
-        suite('on blur', function() {
-          test('the pressed property becomes false', function() {
-            MockInteractions.focus(activeTarget);
-            MockInteractions.down(activeTarget);
-            expect(activeTarget.hasAttribute('pressed')).to.be.eql(true);
-            MockInteractions.blur(activeTarget);
-            expect(activeTarget.hasAttribute('pressed')).to.be.eql(false);
-          });
-        });
-      });
-
-      suite('without toggles attribute', function() {
-        suite('when mouse is down', function() {
-          test('does not get an active attribute', function() {
-            expect(activeTarget.hasAttribute('active')).to.be.eql(false);
-            MockInteractions.down(activeTarget);
-            expect(activeTarget.hasAttribute('active')).to.be.eql(false);
-          });
-        });
-
-        suite('when mouse is up', function() {
-          test('does not get an active attribute', function() {
-            MockInteractions.down(activeTarget);
-            expect(activeTarget.hasAttribute('active')).to.be.eql(false);
-            MockInteractions.up(activeTarget);
-            expect(activeTarget.hasAttribute('active')).to.be.eql(false);
-          });
-        });
-      });
-
-      suite('when space is pressed', function() {
-        test('triggers a click event', function(done) {
-          activeTarget.addEventListener('click', function() {
-            done();
-          });
-          MockInteractions.pressSpace(activeTarget);
-        });
-
-        test('only triggers click after the key is released', function(done) {
-          var keyupTriggered = false;
-
-          activeTarget.addEventListener('keyup', function() {
-            keyupTriggered = true;
-          });
-
-          activeTarget.addEventListener('click', function() {
-            try {
-              expect(keyupTriggered).to.be.eql(true);
-              done();
-            } catch (e) {
-              done(e);
-            }
-          });
-
-          MockInteractions.pressSpace(activeTarget);
-        });
-      });
-
-      suite('when enter is pressed', function() {
-        test('triggers a click event', function(done) {
-          activeTarget.addEventListener('click', function() {
-            done();
-          });
-
-          MockInteractions.pressEnter(activeTarget);
-        });
-
-        test('only triggers click before the key is released', function(done) {
-          var keyupTriggered = false;
-
-          activeTarget.addEventListener('keyup', function() {
-            keyupTriggered = true;
-          });
-
-          activeTarget.addEventListener('click', function() {
-            try {
-              expect(keyupTriggered).to.be.eql(false);
-              done();
-            } catch (e) {
-              done(e);
-            }
-          });
-
-          MockInteractions.pressEnter(activeTarget);
-        });
-      });
-
-      suite('nested native input inside button', function() {
-        test('space in light child input does not trigger a button click event', function(done) {
-          var item = fixture('ButtonWithNativeInput');
-          var input = item.querySelector('#input');
-
-          var itemClickHandler = sinon.spy();
-          item.addEventListener('click', itemClickHandler);
-
-          input.focus();
-          MockInteractions.pressSpace(input);
-          Polymer.Base.async(function(){
-            expect(itemClickHandler.callCount).to.be.equal(0);
-            done();
-          }, 1);
-        });
-
-        test('space in button triggers a button click event', function(done) {
-          var item = fixture('ButtonWithNativeInput');
-          var input = item.querySelector('#input');
-
-          var itemClickHandler = sinon.spy();
-          item.addEventListener('click', itemClickHandler);
-
-          MockInteractions.pressSpace(item);
-
-          Polymer.Base.async(function(){
-            // You need two ticks, one for the MockInteractions event, and one
-            // for the button event.
-            Polymer.Base.async(function(){
-              expect(itemClickHandler.callCount).to.be.equal(1);
-              done();
-            }, 1);
-          }, 1);
-        });
-      });
-
-      suite('nested paper-input inside button', function() {
-        test('space in light child input does not trigger a button click event', function(done) {
-          var item = fixture('ButtonWithPaperInput');
-          var input = item.querySelector('#input');
-
-          var itemClickHandler = sinon.spy();
-          item.addEventListener('click', itemClickHandler);
-
-          input.focus();
-          MockInteractions.pressSpace(input);
-          Polymer.Base.async(function(){
-            expect(itemClickHandler.callCount).to.be.equal(0);
-            done();
-          }, 1);
-        });
-
-        test('space in button triggers a button click event', function(done) {
-          var item = fixture('ButtonWithPaperInput');
-          var input = item.querySelector('#input');
-
-          var itemClickHandler = sinon.spy();
-          item.addEventListener('click', itemClickHandler);
-
-          MockInteractions.pressSpace(item);
-          Polymer.Base.async(function(){
-            // You need two ticks, one for the MockInteractions event, and one
-            // for the button event.
-            Polymer.Base.async(function(){
-              expect(itemClickHandler.callCount).to.be.equal(1);
-              done();
-            }, 1);
-          }, 1);
-        });
-      });
-
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/disabled-state.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/test/disabled-state.html
deleted file mode 100644
index b342cfd..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/disabled-state.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>disabled-state</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <link rel="import" href="test-elements.html">
-</head>
-<body>
-
-  <test-fixture id="TrivialDisabledState">
-    <template>
-      <test-control></test-control>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="InitiallyDisabledState">
-    <template>
-      <test-control disabled></test-control>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('disabled-state', function() {
-      var disableTarget;
-
-      suite('a trivial disabled state', function() {
-        setup(function() {
-          disableTarget = fixture('TrivialDisabledState');
-        });
-
-        suite('when disabled is true', function() {
-          test('receives a disabled attribute', function() {
-            disableTarget.disabled = true;
-            expect(disableTarget.hasAttribute('disabled')).to.be.eql(true);
-          });
-
-          test('receives an appropriate aria attribute', function() {
-            disableTarget.disabled = true;
-            expect(disableTarget.getAttribute('aria-disabled')).to.be.eql('true');
-          });
-        });
-
-        suite('when disabled is false', function() {
-          test('loses the disabled attribute', function() {
-            disableTarget.disabled = true;
-            expect(disableTarget.hasAttribute('disabled')).to.be.eql(true);
-            disableTarget.disabled = false;
-            expect(disableTarget.hasAttribute('disabled')).to.be.eql(false);
-          });
-        });
-      });
-
-      suite('a state with an initially disabled target', function() {
-        setup(function() {
-          disableTarget = fixture('InitiallyDisabledState');
-        });
-
-        test('preserves the disabled attribute on target', function() {
-          expect(disableTarget.hasAttribute('disabled')).to.be.eql(true);
-          expect(disableTarget.disabled).to.be.eql(true);
-        });
-
-        test('adds `aria-disabled` to the target', function() {
-          expect(disableTarget.getAttribute('aria-disabled')).to.be.eql('true');
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/focused-state.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/test/focused-state.html
deleted file mode 100644
index 3b75c70..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/focused-state.html
+++ /dev/null
@@ -1,161 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>focused-state</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-  <link rel="import" href="test-elements.html">
-</head>
-<body>
-
-  <test-fixture id="TrivialFocusedState">
-    <template>
-      <test-control tabindex="-1"></test-control>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="NestedFocusedState">
-    <template>
-      <nested-focusable></nested-focusable>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="LightDOM">
-    <template>
-      <test-light-dom>
-        <input id="input">
-        <nested-focusable></nested-focusable>
-      </test-light-dom>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('focused-state', function() {
-      var focusTarget;
-
-      setup(function() {
-        focusTarget = fixture('TrivialFocusedState');
-      });
-
-      suite('when is focused', function() {
-        test('receives a focused attribute', function() {
-          expect(focusTarget.hasAttribute('focused')).to.be.eql(false);
-          MockInteractions.focus(focusTarget);
-          expect(focusTarget.hasAttribute('focused')).to.be.eql(true);
-        });
-
-        test('focused property is true', function() {
-          expect(focusTarget.focused).to.not.be.eql(true);
-          MockInteractions.focus(focusTarget);
-          expect(focusTarget.focused).to.be.eql(true);
-        });
-      });
-
-      suite('when is blurred', function() {
-        test('loses the focused attribute', function() {
-          MockInteractions.focus(focusTarget);
-          expect(focusTarget.hasAttribute('focused')).to.be.eql(true);
-          MockInteractions.blur(focusTarget);
-          expect(focusTarget.hasAttribute('focused')).to.be.eql(false);
-        });
-
-        test('focused property is false', function() {
-          MockInteractions.focus(focusTarget);
-          expect(focusTarget.focused).to.be.eql(true);
-          MockInteractions.blur(focusTarget);
-          expect(focusTarget.focused).to.be.eql(false);
-        });
-      });
-
-      suite('when the focused state is disabled', function() {
-        test('will not be focusable', function() {
-          var blurSpy = sinon.spy(focusTarget, 'blur');
-          MockInteractions.focus(focusTarget);
-          focusTarget.disabled = true;
-          expect(focusTarget.getAttribute('tabindex')).to.be.eql('-1');
-          expect(blurSpy.called).to.be.eql(true);
-        });
-      });
-    });
-
-    suite('nested focusable', function() {
-      var focusable;
-
-      setup(function() {
-        focusable = fixture('NestedFocusedState');
-      });
-
-      test('focus/blur events fired on host element', function() {
-        var nFocusEvents = 0;
-        var nBlurEvents = 0;
-
-        focusable.addEventListener('focus', function() {
-          nFocusEvents += 1;
-          expect(focusable.focused).to.be.equal(true);
-          MockInteractions.blur(focusable.$.input);
-        });
-        focusable.addEventListener('blur', function() {
-          expect(focusable.focused).to.be.equal(false);
-          nBlurEvents += 1;
-        });
-
-        MockInteractions.focus(focusable.$.input);
-
-        expect(nBlurEvents).to.be.greaterThan(0);
-        expect(nFocusEvents).to.be.greaterThan(0);
-      });
-
-    });
-
-
-    suite('elements in the light dom', function() {
-      var lightDOM, input, lightDescendantShadowInput;
-
-      setup(function() {
-        lightDOM = fixture('LightDOM');
-        input = document.querySelector('#input');
-        lightDescendantShadowInput = Polymer.dom(lightDOM)
-            .querySelector('nested-focusable').$.input;
-      });
-
-      test('should not fire the focus event', function() {
-        var nFocusEvents = 0;
-
-        lightDOM.addEventListener('focus', function() {
-          nFocusEvents += 1;
-        });
-
-        MockInteractions.focus(input);
-
-        expect(nFocusEvents).to.be.equal(0);
-      });
-
-      test('should not fire the focus event from shadow descendants', function() {
-        var nFocusEvents = 0;
-
-        lightDOM.addEventListener('focus', function() {
-          nFocusEvents += 1;
-        });
-
-        MockInteractions.focus(lightDescendantShadowInput);
-
-        expect(nFocusEvents).to.be.equal(0);
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/index.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/test/index.html
deleted file mode 100644
index 39e7f54..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="utf-8">
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'focused-state.html',
-      'active-state.html',
-      'disabled-state.html',
-      'focused-state.html?dom=shadow',
-      'active-state.html?dom=shadow',
-      'disabled-state.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/test-elements.html b/systrace/catapult/third_party/polymer/components/iron-behaviors/test/test-elements.html
deleted file mode 100644
index 92f6da8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-behaviors/test/test-elements.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-control-state.html">
-<link rel="import" href="../iron-button-state.html">
-
-<script>
-
-  Polymer({
-
-    is: 'test-control',
-
-    behaviors: [
-      Polymer.IronControlState
-    ]
-
-  });
-
-</script>
-
-<script>
-
-  Polymer({
-
-    is: 'test-button',
-
-    behaviors: [
-      Polymer.IronControlState,
-      Polymer.IronButtonState
-    ],
-
-    _buttonStateChanged: function() {
-
-    }
-
-  });
-
-</script>
-
-<dom-module id="nested-focusable">
-
-  <template>
-    <input id="input">
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'nested-focusable',
-
-    behaviors: [
-      Polymer.IronControlState
-    ]
-
-  });
-
-</script>
-
-<dom-module id="test-light-dom">
-
-  <template>
-    <content select="*"></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'test-light-dom',
-
-    behaviors: [
-      Polymer.IronControlState,
-      Polymer.IronButtonState
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/README.md
deleted file mode 100644
index c65e58f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-checked-element-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-checked-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-checked-element-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-checked-element-behavior)_
-
-
-##Polymer.IronCheckedElementBehavior
-
-Use `Polymer.IronCheckedElementBehavior` to implement a custom element
-that has a `checked` property, which can be used for validation if the
-element is also `required`. Element instances implementing this behavior
-will also be registered for use in an `iron-form` element.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/bower.json
deleted file mode 100644
index bc14a74..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/bower.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "iron-checked-element-behavior",
-  "version": "1.0.6",
-  "description": "Implements an element that has a checked attribute and can be added to a form",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "iron",
-    "behavior"
-  ],
-  "main": "iron-checked-element-behavior.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-checked-element-behavior.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-checked-element-behavior",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
-    "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/demo/index.html
deleted file mode 100644
index 788a64f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/demo/index.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>iron-checked-element-behavior demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="simple-checkbox.html">
-</head>
-<body unresolved>
-  <div class="horizontal-section-container">
-    <div>
-      <h4>Not required</h4>
-      <div class="horizontal-section">
-        <simple-checkbox></simple-checkbox>
-      </div>
-    </div>
-    <div>
-      <h4>Required</h4>
-      <div class="horizontal-section">
-        <simple-checkbox required></simple-checkbox>
-      </div>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/demo/simple-checkbox.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/demo/simple-checkbox.html
deleted file mode 100644
index 24c5c12..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/demo/simple-checkbox.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../paper-button/paper-button.html">
-<link rel="import" href="../iron-checked-element-behavior.html">
-
-<dom-module id="simple-checkbox">
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-
-      :host([invalid]) span {
-        color: red;
-      }
-
-      #labelText {
-        display: inline-block;
-        width: 100px;
-      }
-    </style>
-
-    <input type="checkbox" id="checkbox" on-tap="_onCheckTap">
-    <span id="labelText">{{label}}</span>
-    <paper-button raised on-click="_onClick">validate</paper-button>
-
-  </template>
-  <script>
-    Polymer({
-
-      is: 'simple-checkbox',
-
-      behaviors: [
-        Polymer.IronCheckedElementBehavior
-      ],
-
-      properties: {
-        label: {
-          type: String,
-          value: 'not validated'
-        }
-      },
-
-      _onCheckTap: function() {
-        this.checked = this.$.checkbox.checked;
-      },
-
-      _onClick: function() {
-        this.validate();
-        this.label = this.invalid ? 'is invalid' : 'is valid';
-      }
-    });
-
-  </script>
-
-  </dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/index.html
deleted file mode 100644
index 1975dc5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-checked-element-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/iron-checked-element-behavior.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/iron-checked-element-behavior.html
deleted file mode 100644
index 3ed2ffe..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/iron-checked-element-behavior.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
-<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
-
-<script>
-
-  /**
-   * Use `Polymer.IronCheckedElementBehavior` to implement a custom element
-   * that has a `checked` property, which can be used for validation if the
-   * element is also `required`. Element instances implementing this behavior
-   * will also be registered for use in an `iron-form` element.
-   *
-   * @demo demo/index.html
-   * @polymerBehavior Polymer.IronCheckedElementBehavior
-   */
-  Polymer.IronCheckedElementBehaviorImpl = {
-
-    properties: {
-      /**
-       * Fired when the checked state changes.
-       *
-       * @event iron-change
-       */
-
-      /**
-       * Gets or sets the state, `true` is checked and `false` is unchecked.
-       */
-      checked: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true,
-        notify: true,
-        observer: '_checkedChanged'
-      },
-
-      /**
-       * If true, the button toggles the active state with each tap or press
-       * of the spacebar.
-       */
-      toggles: {
-        type: Boolean,
-        value: true,
-        reflectToAttribute: true
-      },
-
-      /* Overriden from Polymer.IronFormElementBehavior */
-      value: {
-        type: String,
-        value: 'on',
-        observer: '_valueChanged'
-      }
-    },
-
-    observers: [
-      '_requiredChanged(required)'
-    ],
-
-    created: function() {
-      // Used by `iron-form` to handle the case that an element with this behavior
-      // doesn't have a role of 'checkbox' or 'radio', but should still only be
-      // included when the form is serialized if `this.checked === true`.
-      this._hasIronCheckedElementBehavior = true;
-    },
-
-    /**
-     * Returns false if the element is required and not checked, and true otherwise.
-     * @param {*=} _value Ignored.
-     * @return {boolean} true if `required` is false or if `checked` is true.
-     */
-    _getValidity: function(_value) {
-      return this.disabled || !this.required || this.checked;
-    },
-
-    /**
-     * Update the aria-required label when `required` is changed.
-     */
-    _requiredChanged: function() {
-      if (this.required) {
-        this.setAttribute('aria-required', 'true');
-      } else {
-        this.removeAttribute('aria-required');
-      }
-    },
-
-    /**
-     * Fire `iron-changed` when the checked state changes.
-     */
-    _checkedChanged: function() {
-      this.active = this.checked;
-      this.fire('iron-change');
-    },
-
-    /**
-     * Reset value to 'on' if it is set to `undefined`.
-     */
-    _valueChanged: function() {
-      if (this.value === undefined || this.value === null) {
-        this.value = 'on';
-      }
-    }
-  };
-
-  /** @polymerBehavior Polymer.IronCheckedElementBehavior */
-  Polymer.IronCheckedElementBehavior = [
-    Polymer.IronFormElementBehavior,
-    Polymer.IronValidatableBehavior,
-    Polymer.IronCheckedElementBehaviorImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/basic.html
deleted file mode 100644
index 4c13dd8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/basic.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>iron-checked-element-behavior basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link href="../../test-fixture/test-fixture.html" rel="import">
-  <link href="../../iron-meta/iron-meta.html" rel="import">
-  <link href="simple-checkbox.html" rel="import">
-
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <simple-checkbox></simple-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="checked">
-    <template>
-      <simple-checkbox checked></simple-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="with-value">
-    <template>
-      <simple-checkbox value="batman"></simple-checkbox>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-      test('can be checked', function() {
-        var c = fixture('basic');
-        assert.isFalse(c.checked);
-        c.checked = true;
-        assert.isTrue(c.checked);
-      });
-
-      test('can be unchecked', function() {
-        var c = fixture('checked');
-        assert.isTrue(c.checked);
-        c.checked = false;
-        assert.isFalse(c.checked);
-      });
-
-      test('invalid if required and not checked', function() {
-        var c = fixture('basic');
-        c.required = true;
-        assert.isFalse(c.checked);
-        assert.isFalse(c.validate());
-        assert.isTrue(c.invalid);
-      });
-
-      test('valid if required and checked', function() {
-        var c = fixture('basic');
-        c.required = true;
-        c.checked = true;
-        assert.isTrue(c.checked);
-        assert.isTrue(c.validate());
-        assert.isFalse(c.invalid);
-      });
-
-      test('valid if not required and not checked', function() {
-        var c = fixture('basic');
-        assert.isFalse(c.checked);
-        assert.isTrue(c.validate());
-        assert.isFalse(c.invalid);
-      });
-
-      test('has a default value of "on", always', function() {
-        var c = fixture('basic');
-
-        assert.isTrue(c.value === 'on');
-
-        c.checked = true;
-        assert.isTrue(c.value === 'on');
-      });
-
-      test('does not stomp over user defined value when checked', function() {
-        var c = fixture('with-value');
-        assert.isTrue(c.value === 'batman');
-
-        c.checked = true;
-        assert.isTrue(c.value === 'batman');
-      });
-
-      test('value returns "on" when no explicit value is specified', function() {
-        var c = fixture('basic');
-
-        assert.equal(c.value, 'on', 'returns "on"');
-      });
-
-      test('value returns the value when an explicit value is set', function() {
-        var c = fixture('basic');
-
-        c.value = 'abc';
-        assert.equal(c.value, 'abc', 'returns "abc"');
-
-        c.value = '123';
-        assert.equal(c.value, '123', 'returns "123"');
-      });
-
-      test('value returns "on" when value is set to undefined', function() {
-        var c = fixture('basic');
-
-        c.value = 'abc';
-        assert.equal(c.value, 'abc', 'returns "abc"');
-
-        c.value = undefined;
-        assert.equal(c.value, 'on', 'returns "on"');
-      });
-    });
-
-    suite('a11y', function() {
-      test('setting `required` sets `aria-required=true`', function() {
-        var c = fixture('basic');
-        c.required = true;
-        assert.equal(c.getAttribute('aria-required'), 'true');
-        c.required = false;
-        assert.isFalse(c.hasAttribute('aria-required'));
-      });
-
-      test('setting `invalid` sets `aria-invalid=true`', function() {
-        var c = fixture('basic');
-        c.invalid = true;
-        assert.equal(c.getAttribute('aria-invalid'), 'true');
-        c.invalid = false;
-        assert.isFalse(c.hasAttribute('aria-invalid'));
-      });
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/index.html
deleted file mode 100644
index 1ddeca3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>iron-checked-element-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'basic.html',
-        'basic.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/simple-checkbox.html b/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/simple-checkbox.html
deleted file mode 100644
index 95228fa..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-checked-element-behavior/test/simple-checkbox.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-checked-element-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'simple-checkbox',
-
-    behaviors: [
-      Polymer.IronCheckedElementBehavior
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-collapse/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/README.md b/systrace/catapult/third_party/polymer/components/iron-collapse/README.md
deleted file mode 100644
index 4fee050..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-collapse.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-collapse.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-collapse)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-collapse)_
-
-
-##&lt;iron-collapse&gt;
-
-`iron-collapse` creates a collapsible block of content.  By default, the content
-will be collapsed.  Use `opened` or `toggle()` to show/hide the content.
-
-```html
-<button on-click="toggle">toggle collapse</button>
-
-<iron-collapse id="collapse">
-  <div>Content goes here...</div>
-</iron-collapse>
-
-...
-
-toggle: function() {
-  this.$.collapse.toggle();
-}
-```
-
-`iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide
-the content.  So avoid putting padding/margin/border on the collapsible directly,
-and instead put a div inside and style that.
-
-```html
-<style>
-  .collapse-content {
-    padding: 15px;
-    border: 1px solid #dedede;
-  }
-</style>
-
-<iron-collapse>
-  <div class="collapse-content">
-    <div>Content goes here...</div>
-  </div>
-</iron-collapse>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--iron-collapse-transition-duration` | Animation transition duration | `300ms` |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/bower.json b/systrace/catapult/third_party/polymer/components/iron-collapse/bower.json
deleted file mode 100644
index a2e6b27..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/bower.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "iron-collapse",
-  "version": "1.3.0",
-  "description": "Provides a collapsable container",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "container"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/PolymerElements/iron-collapse"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-collapse",
-  "ignore": [],
-  "dependencies": {
-    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
-    "polymer": "Polymer/polymer#^1.5.0"
-  },
-  "devDependencies": {
-    "web-component-tester": "^4.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "main": "iron-collapse.html"
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-collapse/demo/index.html
deleted file mode 100644
index 79a873c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/demo/index.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-collapse demo</title>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../iron-collapse.html">
-    <link rel="import" href="../../paper-styles/shadow.html">
-    <link rel="stylesheet" href="../../paper-styles/demo.css">
-
-    <style is="custom-style">
-      .heading {
-        padding: 10px 15px;
-        margin-top: 20px;
-        background-color: #f3f3f3;
-        border: 1px solid #dedede;
-        border-top-left-radius: 5px;
-        border-top-right-radius: 5px;
-        font-size: 18px;
-        cursor: pointer;
-        -webkit-tap-highlight-color: rgba(0,0,0,0);
-        width: 100%;
-        text-align: left;
-      }
-
-      .content {
-        padding: 15px;
-        border: 1px solid #dedede;
-        border-top: none;
-        border-bottom-left-radius: 5px;
-        border-bottom-right-radius: 5px;
-        @apply(--shadow-elevation-2dp);
-      }
-
-      #collapse3 {
-        max-height: 250px;
-      }
-
-    </style>
-
-  </head>
-  <body unresolved>
-  <template is="dom-bind">
-
-    <button class="heading" aria-expanded$="[[isExpanded(opened1)]]" aria-controls="collapse1" onclick="toggle('#collapse1')">Collapse #1</button>
-
-    <iron-collapse id="collapse1" tabindex="0" opened="{{opened1}}">
-      <div class="content">
-        <div>Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus. Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea, id minim maiestatis incorrupte duo. Dolorum verterem ad ius, his et nullam verterem. Eu alia debet usu, an doming tritani est. Vix ad ponderum petentium suavitate, eum eu tempor populo, graece sententiae constituam vim ex. Cu torquatos reprimique neglegentur nec, voluptua periculis has ut, at eos discere deleniti sensibus.</div>
-      </div>
-    </iron-collapse>
-
-    <button class="heading" aria-expanded$="[[isExpanded(opened2)]]" aria-controls="collapse2" onclick="toggle('#collapse2')">Collapse #2</button>
-
-    <iron-collapse id="collapse2" tabindex="0" opened="{{opened2}}">
-      <div class="content">
-        <div>Pro saepe pertinax ei, ad pri animal labores suscipiantur. Modus commodo minimum eum te, vero utinam assueverit per eu, zril oportere suscipiantur pri te. Partem percipitur deterruisset ad sea, at eam suas luptatum dissentiunt. No error alienum pro, erant senserit ex mei, pri semper alterum no. Ut habemus menandri vulputate mea. Feugiat verterem ut sed. Dolores maiestatis id per. Pro saepe pertinax ei, ad pri animal labores suscipiantur. Modus commodo minimum eum te, vero utinam assueverit per eu, zril oportere suscipiantur pri te. Partem percipitur deterruisset ad sea, at eam suas luptatum dissentiunt. No error alienum pro, erant senserit ex mei, pri semper alterum no. Ut habemus menandri vulputate mea. Feugiat verterem ut sed. Dolores maiestatis id per.</div>
-
-        <button class="heading" aria-expanded$="[[isExpanded(opened3)]]" aria-controls="collapse3"  onclick="toggle('#collapse3')">Collapse #3 (horizontal)</button>
-
-        <iron-collapse id="collapse3" tabindex="0" opened="{{opened3}}" horizontal>
-          <div class="content">
-            <div>Iisque perfecto dissentiet cum et, sit ut quot mandamus, ut vim tibique splendide instructior. Id nam odio natum malorum, tibique copiosae expetenda mel ea. Mea melius malorum ut. Ut nec tollit vocent timeam. Facer nonumy numquam id his, munere salutatus consequuntur eum et, eum cotidieque definitionem signiferumque id. Ei oblique graecis patrioque vis, et probatus dignissim inciderint vel. Sed id paulo erroribus, autem semper accusamus in mel. Iisque perfecto dissentiet cum et, sit ut quot mandamus, ut vim tibique splendide instructior. Id nam odio natum malorum, tibique copiosae expetenda mel ea. Mea melius malorum ut. Ut nec tollit vocent timeam. Facer nonumy numquam id his, munere salutatus consequuntur eum et, eum cotidieque definitionem signiferumque id. Ei oblique graecis patrioque vis, et probatus dignissim inciderint vel. Sed id paulo erroribus, autem semper accusamus in mel.</div>
-          </div>
-        </iron-collapse>
-
-        <button class="heading" aria-expanded$="[[isExpanded(opened4)]]" aria-controls="collapse4"  onclick="toggle('#collapse4')">Collapse #4 (no animation)</button>
-
-        <iron-collapse id="collapse4" tabindex="0" opened="{{opened4}}" no-animation>
-          <div class="content">
-            <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
-          </div>
-        </iron-collapse>
-      </div>
-    </iron-collapse>
-</template>
-
-<script>
-
-  function toggle(selector) {
-    document.querySelector(selector).toggle();
-  }
-
-  document.querySelector('template[is=dom-bind]').isExpanded = function(opened) {
-    return String(opened);
-  };
-
-</script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/hero.svg b/systrace/catapult/third_party/polymer/components/iron-collapse/hero.svg
deleted file mode 100755
index 408ae52..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/hero.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-	<path display="inline" fill="none" d="M167.5,51.7c3.7-0.8,6.9,2.4,6.1,6.1c-0.4,1.9-1.9,3.4-3.8,3.8c-3.7,0.8-6.9-2.4-6.1-6.1

-		C164.2,53.6,165.7,52.1,167.5,51.7z"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<path d="M151,102H73V52h78V102z M75,100h74V54H75V100z"/>

-	<path d="M151,38H73V24h78V38z M75,36h74V26H75V36z"/>

-	<circle cx="171" cy="51" r="4"/>

-	<path d="M151,72v-2c10.5,0,19-8.5,19-19s-8.5-19-19-19v-2c11.6,0,21,9.4,21,21S162.6,72,151,72z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/index.html b/systrace/catapult/third_party/polymer/components/iron-collapse/index.html
deleted file mode 100644
index b5d2007..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-    <title>iron-collapse</title>
-
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../polymer/polymer.html">
-    <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-  </head>
-  <body>
-
-    <iron-component-page></iron-component-page>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/iron-collapse.html b/systrace/catapult/third_party/polymer/components/iron-collapse/iron-collapse.html
deleted file mode 100644
index 75a79e7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/iron-collapse.html
+++ /dev/null
@@ -1,302 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-
-<!--
-`iron-collapse` creates a collapsible block of content.  By default, the content
-will be collapsed.  Use `opened` or `toggle()` to show/hide the content.
-
-    <button on-click="toggle">toggle collapse</button>
-
-    <iron-collapse id="collapse">
-      <div>Content goes here...</div>
-    </iron-collapse>
-
-    ...
-
-    toggle: function() {
-      this.$.collapse.toggle();
-    }
-
-`iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide
-the content.  So avoid putting padding/margin/border on the collapsible directly,
-and instead put a div inside and style that.
-
-    <style>
-      .collapse-content {
-        padding: 15px;
-        border: 1px solid #dedede;
-      }
-    </style>
-
-    <iron-collapse>
-      <div class="collapse-content">
-        <div>Content goes here...</div>
-      </div>
-    </iron-collapse>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--iron-collapse-transition-duration` | Animation transition duration | `300ms`
-
-@group Iron Elements
-@hero hero.svg
-@demo demo/index.html
-@element iron-collapse
--->
-
-<dom-module id="iron-collapse">
-
-  <template>
-
-    <style>
-      :host {
-        display: block;
-        transition-duration: var(--iron-collapse-transition-duration, 300ms);
-        overflow: visible;
-      }
-
-      :host(.iron-collapse-closed) {
-        display: none;
-      }
-
-      :host(:not(.iron-collapse-opened)) {
-        overflow: hidden;
-      }
-    </style>
-
-    <content></content>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'iron-collapse',
-
-    behaviors: [
-      Polymer.IronResizableBehavior
-    ],
-
-    properties: {
-
-      /**
-       * If true, the orientation is horizontal; otherwise is vertical.
-       *
-       * @attribute horizontal
-       */
-      horizontal: {
-        type: Boolean,
-        value: false,
-        observer: '_horizontalChanged'
-      },
-
-      /**
-       * Set opened to true to show the collapse element and to false to hide it.
-       *
-       * @attribute opened
-       */
-      opened: {
-        type: Boolean,
-        value: false,
-        notify: true,
-        observer: '_openedChanged'
-      },
-
-      /**
-       * When true, the element is transitioning its opened state. When false,
-       * the element has finished opening/closing.
-       *
-       * @attribute transitioning
-       */
-      transitioning: {
-        type: Boolean,
-        notify: true,
-        readOnly: true
-      },
-
-      /**
-       * Set noAnimation to true to disable animations.
-       *
-       * @attribute noAnimation
-       */
-      noAnimation: {
-        type: Boolean
-      },
-
-      /**
-       * Stores the desired size of the collapse body.
-       * @private
-       */
-      _desiredSize: {
-        type: String,
-        value: ''
-      }
-    },
-
-    get dimension() {
-      return this.horizontal ? 'width' : 'height';
-    },
-
-    /**
-     * `maxWidth` or `maxHeight`.
-     * @private
-     */
-    get _dimensionMax() {
-      return this.horizontal ? 'maxWidth' : 'maxHeight';
-    },
-
-    /**
-     * `max-width` or `max-height`.
-     * @private
-     */
-    get _dimensionMaxCss() {
-      return this.horizontal ? 'max-width' : 'max-height';
-    },
-
-    hostAttributes: {
-      role: 'group',
-      'aria-hidden': 'true',
-      'aria-expanded': 'false'
-    },
-
-    listeners: {
-      transitionend: '_onTransitionEnd'
-    },
-
-    /**
-     * Toggle the opened state.
-     *
-     * @method toggle
-     */
-    toggle: function() {
-      this.opened = !this.opened;
-    },
-
-    show: function() {
-      this.opened = true;
-    },
-
-    hide: function() {
-      this.opened = false;
-    },
-
-    /**
-     * Updates the size of the element.
-     * @param {string} size The new value for `maxWidth`/`maxHeight` as css property value, usually `auto` or `0px`.
-     * @param {boolean=} animated if `true` updates the size with an animation, otherwise without.
-     */
-    updateSize: function(size, animated) {
-      // Consider 'auto' as '', to take full size.
-      size = size === 'auto' ? '' : size;
-
-      var willAnimate = animated && !this.noAnimation &&
-                        this.isAttached && this._desiredSize !== size;
-
-      this._desiredSize = size;
-
-      this._updateTransition(false);
-      // If we can animate, must do some prep work.
-      if (willAnimate) {
-        // Animation will start at the current size.
-        var startSize = this._calcSize();
-        // For `auto` we must calculate what is the final size for the animation.
-        // After the transition is done, _transitionEnd will set the size back to `auto`.
-        if (size === '') {
-          this.style[this._dimensionMax] = '';
-          size = this._calcSize();
-        }
-        // Go to startSize without animation.
-        this.style[this._dimensionMax] = startSize;
-        // Force layout to ensure transition will go. Set scrollTop to itself
-        // so that compilers won't remove it.
-        this.scrollTop = this.scrollTop;
-        // Enable animation.
-        this._updateTransition(true);
-        // If final size is the same as startSize it will not animate.
-        willAnimate = (size !== startSize);
-      }
-      // Set the final size.
-      this.style[this._dimensionMax] = size;
-      // If it won't animate, call transitionEnd to set correct classes.
-      if (!willAnimate) {
-        this._transitionEnd();
-      }
-    },
-
-    /**
-     * enableTransition() is deprecated, but left over so it doesn't break existing code.
-     * Please use `noAnimation` property instead.
-     *
-     * @method enableTransition
-     * @deprecated since version 1.0.4
-     */
-    enableTransition: function(enabled) {
-      Polymer.Base._warn('`enableTransition()` is deprecated, use `noAnimation` instead.');
-      this.noAnimation = !enabled;
-    },
-
-    _updateTransition: function(enabled) {
-      this.style.transitionDuration = (enabled && !this.noAnimation) ? '' : '0s';
-    },
-
-    _horizontalChanged: function() {
-      this.style.transitionProperty = this._dimensionMaxCss;
-      var otherDimension = this._dimensionMax === 'maxWidth' ? 'maxHeight' : 'maxWidth';
-      this.style[otherDimension] = '';
-      this.updateSize(this.opened ? 'auto' : '0px', false);
-    },
-
-    _openedChanged: function() {
-      this.setAttribute('aria-expanded', this.opened);
-      this.setAttribute('aria-hidden', !this.opened);
-
-      this._setTransitioning(true);
-      this.toggleClass('iron-collapse-closed', false);
-      this.toggleClass('iron-collapse-opened', false);
-      this.updateSize(this.opened ? 'auto' : '0px', true);
-
-      // Focus the current collapse.
-      if (this.opened) {
-        this.focus();
-      }
-    },
-
-    _transitionEnd: function() {
-      this.style[this._dimensionMax] = this._desiredSize;
-      this.toggleClass('iron-collapse-closed', !this.opened);
-      this.toggleClass('iron-collapse-opened', this.opened);
-      this._updateTransition(false);
-      this.notifyResize();
-      this._setTransitioning(false);
-    },
-
-    _onTransitionEnd: function(event) {
-      if (Polymer.dom(event).rootTarget === this) {
-        this._transitionEnd();
-      }
-    },
-
-    _calcSize: function() {
-      return this.getBoundingClientRect()[this.dimension] + 'px';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/test/a11y.html b/systrace/catapult/third_party/polymer/components/iron-collapse/test/a11y.html
deleted file mode 100644
index ddd3472..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/test/a11y.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-collapse-a11y</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-collapse.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="trivialCollapse">
-      <template>
-        <iron-collapse id="collapse" tabindex="0">
-          <div>
-            Forma temperiemque cornua sidera dissociata cornua recessit innabilis ligavit: solidumque coeptis nullus caelum sponte phoebe di regat mentisque tanta austro capacius amphitrite sui quin postquam semina fossae liquidum umor galeae coeptis caligine liberioris quin liquidum matutinis invasit posset: flexi glomeravit radiis certis invasit oppida postquam onerosior inclusum dominari opifex terris pace finxit quam aquae nunc sine altae auroram quam habentem homo totidemque scythiam in pondus ensis tegit caecoque poena lapidosos humanas coeperunt poena aetas totidem nec natura aethera locavit caelumque distinxit animalibus phoebe cingebant moderantum porrexerat terrae possedit sua sole diu summaque obliquis melioris orbem
-          </div>
-        </iron-collapse>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('a11y', function() {
-        var collapse;
-
-        setup(function () {
-          collapse = fixture('trivialCollapse');
-        });
-
-        test('aria attributes', function() {
-          assert.equal(collapse.getAttribute('role'), 'group');
-          assert.equal(collapse.getAttribute('aria-expanded'), 'false');
-          assert.equal(collapse.getAttribute('aria-hidden'), 'true');
-        });
-
-        test('set opened to true', function() {
-          collapse.opened = true;
-          assert.equal(collapse.getAttribute('aria-expanded'), 'true');
-          assert.equal(collapse.getAttribute('aria-hidden'), 'false');
-        });
-
-        test('focus the collapse when opened', function() {
-          assert.notEqual(document.activeElement, collapse);
-          collapse.opened = true;
-          assert.equal(document.activeElement, collapse);
-        });
-
-        a11ySuite('trivialCollapse');
-
-      });
-
-    </script>
-
-  </body>
-</html>
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-collapse/test/basic.html
deleted file mode 100644
index c47686c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/test/basic.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-collapse-basic</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-collapse.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="test">
-      <template>
-        <iron-collapse opened>
-          <div style="height:100px;">
-            Lorem ipsum
-          </div>
-        </iron-collapse>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="empty">
-      <template>
-        <iron-collapse opened></iron-collapse>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('basic', function() {
-
-        var collapse;
-        var collapseHeight;
-
-        setup(function() {
-          collapse = fixture('test');
-          collapseHeight = getComputedStyle(collapse).height;
-        });
-
-        test('opened attribute', function() {
-          assert.equal(collapse.opened, true);
-        });
-
-        test('animated by default', function() {
-          assert.isTrue(!collapse.noAnimation, '`noAnimation` is falsy');
-        });
-
-        test('not transitioning on attached', function() {
-          assert.isTrue(!collapse.transitioning, '`transitioning` is falsy');
-        });
-
-        test('horizontal attribute', function() {
-          assert.equal(collapse.horizontal, false);
-        });
-
-        test('default opened height', function() {
-          assert.equal(collapse.style.maxHeight, '');
-        });
-
-        test('set opened to false triggers animation', function(done) {
-          collapse.opened = false;
-          // Animation got enabled.
-          assert.notEqual(collapse.style.transitionDuration, '0s');
-          assert.equal(collapse.transitioning, true, 'transitioning became true');
-          collapse.addEventListener('transitionend', function() {
-            // Animation disabled.
-            assert.equal(collapse.style.transitionDuration, '0s');
-            assert.equal(collapse.transitioning, false, 'transitioning became false');
-            done();
-          });
-        });
-
-        test('transitioning updated only during transitions between open/close states', function() {
-          var spy = sinon.spy();
-          collapse.addEventListener('transitioning-changed', spy);
-          collapse.noAnimation = true;
-          assert.equal(spy.callCount, 0, 'transitioning not affected by noAnimation');
-          collapse.horizontal = true;
-          assert.equal(spy.callCount, 0, 'transitioning not affected by horizontal');
-          collapse.opened = false;
-          assert.equal(spy.callCount, 2, 'transitioning changed twice');
-          assert.equal(collapse.transitioning, false, 'transitioning is false');
-        });
-
-        test('enableTransition(false) disables animations', function() {
-          collapse.enableTransition(false);
-          assert.isTrue(collapse.noAnimation, '`noAnimation` is true');
-          // trying to animate the size update
-          collapse.updateSize('0px', true);
-          // Animation immediately disabled.
-          assert.equal(collapse.style.maxHeight, '0px');
-        });
-
-        test('set opened to false, then to true', function(done) {
-          // this listener will be triggered twice (every time `opened` changes)
-          collapse.addEventListener('transitionend', function() {
-            if (collapse.opened) {
-              // Check finalSize after animation is done.
-              assert.equal(collapse.style.height, '');
-              done();
-            } else {
-              // Check if size is still 0px.
-              assert.equal(collapse.style.maxHeight, '0px');
-              // Trigger 2nd toggle.
-              collapse.opened = true;
-              // Size should be immediately set.
-              assert.equal(collapse.style.maxHeight, collapseHeight);
-            }
-          });
-          // Trigger 1st toggle.
-          collapse.opened = false;
-          // Size should be immediately set.
-          assert.equal(collapse.style.maxHeight, '0px');
-        });
-
-        test('opened changes trigger iron-resize', function() {
-          var spy = sinon.stub();
-          collapse.addEventListener('iron-resize', spy);
-          // No animations for faster test.
-          collapse.noAnimation = true;
-          collapse.opened = false;
-          assert.isTrue(spy.calledOnce, 'iron-resize was fired');
-        });
-
-        test('overflow is hidden while animating', function(done) {
-          collapse.addEventListener('transitionend', function() {
-            // Should still be hidden.
-            assert.equal(getComputedStyle(collapse).overflow, 'hidden');
-            done();
-          });
-          assert.equal(getComputedStyle(collapse).overflow, 'visible');
-          collapse.opened = false;
-          // Immediately updated style.
-          assert.equal(getComputedStyle(collapse).overflow, 'hidden');
-        });
-
-        test('toggle horizontal updates size', function() {
-          collapse.horizontal = false;
-          assert.equal(collapse.style.width, '');
-          assert.equal(collapse.style.maxHeight, '');
-          assert.equal(collapse.style.transitionProperty, 'max-height');
-
-          collapse.horizontal = true;
-          assert.equal(collapse.style.maxWidth, '');
-          assert.equal(collapse.style.height, '');
-          assert.equal(collapse.style.transitionProperty, 'max-width');
-        });
-
-        test('change size with updateSize', function(done) {
-          collapse.addEventListener('transitionend', function() {
-            // size should be kept after transition
-            assert.equal(collapse.style.maxHeight, "123px");
-            done();
-          });
-          collapse.updateSize("123px", true);
-        });
-
-      });
-
-      suite('empty', function() {
-
-        var collapse;
-
-        setup(function() {
-          collapse = fixture('empty');
-        });
-
-        test('empty&opened shows dynamically loaded content', function(done) {
-          flush(function () {
-            collapse.toggle();
-            collapse.toggle();
-            assert.equal(collapse.style.maxHeight, '');
-            done();
-          });
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/test/flex.html b/systrace/catapult/third_party/polymer/components/iron-collapse/test/flex.html
deleted file mode 100644
index 6b10925..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/test/flex.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-collapse-flex</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../iron-flex-layout/iron-flex-layout-classes.html">
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-collapse.html">
-
-    <style is="custom-style" include="iron-flex">
-    </style>
-
-  </head>
-  <body>
-
-    <test-fixture id="test">
-      <template>
-        <div id="container" class="layout vertical" style="height: 200px">
-          <iron-collapse id="collapse" opened style="flex: 1 0 auto">
-            <div style="height:100px;">
-              Lorem ipsum
-            </div>
-          </iron-collapse>
-        </div>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('flex', function() {
-
-      	var container;
-        var collapse;
-        var collapseHeight;
-
-        setup(function() {
-          container = fixture('test');
-          collapse = container.querySelector('iron-collapse');
-          collapseHeight = getComputedStyle(collapse).height;
-        });
-
-        test('default opened height', function() {
-          assert.equal(collapse.style.height, '');
-        });
-
-        test('set opened to false triggers animation', function(done) {
-          collapse.opened = false;
-          // Animation got enabled.
-          assert.notEqual(collapse.style.transitionDuration, '0s');
-          collapse.addEventListener('transitionend', function() {
-            // Animation disabled.
-            assert.equal(collapse.style.transitionDuration, '0s');
-            done();
-          });
-        });
-
-        test('enableTransition(false) disables animations', function() {
-          collapse.enableTransition(false);
-          assert.isTrue(collapse.noAnimation, '`noAnimation` is true');
-          // trying to animate the size update
-          collapse.updateSize('0px', true);
-          // Animation immediately disabled.
-          assert.equal(collapse.style.maxHeight, '0px');
-        });
-
-        test('set opened to false, then to true', function(done) {
-          // this listener will be triggered twice (every time `opened` changes)
-          collapse.addEventListener('transitionend', function() {
-            if (collapse.opened) {
-              // Check finalSize after animation is done.
-              assert.equal(collapse.style.maxHeight, '');
-              done();
-            } else {
-              // Check if size is still 0px.
-              assert.equal(collapse.style.maxHeight, '0px');
-              // Trigger 2nd toggle.
-              collapse.opened = true;
-              // Size should be immediately set.
-              assert.equal(collapse.style.maxHeight, collapseHeight);
-            }
-          });
-          // Trigger 1st toggle.
-          collapse.opened = false;
-          // Size should be immediately set.
-          assert.equal(collapse.style.maxHeight, '0px');
-        });
-
-        test('opened changes trigger iron-resize', function() {
-          var spy = sinon.stub();
-          collapse.addEventListener('iron-resize', spy);
-          // No animations for faster test.
-          collapse.noAnimation = true;
-          collapse.opened = false;
-          assert.isTrue(spy.calledOnce, 'iron-resize was fired');
-        });
-
-        test('overflow is hidden while animating', function(done) {
-          collapse.addEventListener('transitionend', function() {
-            // Should still be hidden.
-            assert.equal(getComputedStyle(collapse).overflow, 'hidden');
-            done();
-          });
-          assert.equal(getComputedStyle(collapse).overflow, 'visible');
-          collapse.opened = false;
-          // Immediately updated style.
-          assert.equal(getComputedStyle(collapse).overflow, 'hidden');
-        });
-
-        test('toggle horizontal updates size', function() {
-          collapse.horizontal = false;
-          assert.equal(collapse.style.width, '');
-          assert.equal(collapse.style.maxHeight, '');
-          assert.equal(collapse.style.transitionProperty, 'max-height');
-
-          collapse.horizontal = true;
-          assert.equal(collapse.style.maxWidth, '');
-          assert.equal(collapse.style.height, '');
-          assert.equal(collapse.style.transitionProperty, 'max-width');
-        });
-
-        test('change size with updateSize', function(done) {
-          collapse.addEventListener('transitionend', function() {
-            // size should be kept after transition
-            assert.equal(collapse.style.maxHeight, "123px");
-            done();
-          });
-          collapse.updateSize("123px", true);
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/test/horizontal.html b/systrace/catapult/third_party/polymer/components/iron-collapse/test/horizontal.html
deleted file mode 100644
index 61121b6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/test/horizontal.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-    <title>iron-collapse-horizontal</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-collapse.html">
-  </head>
-  <body>
-
-    <test-fixture id="test">
-      <template>
-        <iron-collapse id="collapse" opened horizontal>
-          <div style="width:100px;">
-            Lorem ipsum
-          </div>
-        </iron-collapse>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('horizontal', function() {
-
-        var collapse;
-        var collapseWidth;
-
-        setup(function () {
-          collapse = fixture('test');
-          collapseWidth = getComputedStyle(collapse).width;
-        });
-
-        test('opened attribute', function() {
-          assert.equal(collapse.opened, true);
-        });
-
-        test('horizontal attribute', function() {
-          assert.equal(collapse.horizontal, true);
-        });
-
-        test('default opened width', function() {
-          assert.equal(collapse.style.width, '');
-        });
-
-        test('set opened to false, then to true', function(done) {
-          // This listener will be triggered twice (every time `opened` changes).
-          collapse.addEventListener('transitionend', function() {
-            if (collapse.opened) {
-              // Check finalSize after animation is done.
-              assert.equal(collapse.style.width, '');
-              done();
-            } else {
-              // Check if size is still 0px.
-              assert.equal(collapse.style.maxWidth, '0px');
-              // Trigger 2nd toggle.
-              collapse.opened = true;
-              // Size should be immediately set.
-              assert.equal(collapse.style.maxWidth, collapseWidth);
-            }
-          });
-          // Trigger 1st toggle.
-          collapse.opened = false;
-          // Size should be immediately set.
-          assert.equal(collapse.style.maxWidth, '0px');
-        });
-
-        test('change size with updateSize', function(done) {
-          collapse.addEventListener('transitionend', function() {
-            // size should be kept after transition
-            assert.equal(collapse.style.maxWidth, "123px");
-            done();
-          });
-          collapse.updateSize("123px", true);
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/test/index.html b/systrace/catapult/third_party/polymer/components/iron-collapse/test/index.html
deleted file mode 100644
index 5ccf532..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/test/index.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <meta charset="utf-8">
-    <title>Tests</title>
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'basic.html',
-        'horizontal.html',
-        'a11y.html',
-        'nested.html',
-        'flex.html',
-        'basic.html?dom=shadow',
-        'horizontal.html?dom=shadow',
-        'a11y.html?dom=shadow',
-        'nested.html?dom=shadow',
-        'flex.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-collapse/test/nested.html b/systrace/catapult/third_party/polymer/components/iron-collapse/test/nested.html
deleted file mode 100644
index ecfbc5e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-collapse/test/nested.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-    <title>iron-collapse-nested</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-collapse.html">
-  </head>
-  <body>
-
-    <test-fixture id="test">
-      <template>
-        <iron-collapse id="outer-collapse">
-          <div style="height:100px;">
-            Lorem ipsum
-          </div>
-
-          <iron-collapse id="inner-collapse-vertical">
-            <div style="height:100px;">
-              consectetur adipiscing elit
-            </div>
-          </iron-collapse>
-
-          <iron-collapse id="inner-collapse-horizontal" horizontal style="display: inline-block">
-            <div style="width:100px;">
-              consectetur adipiscing elit
-            </div>
-          </iron-collapse>
-        </iron-collapse>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('nested', function() {
-
-        var outerCollapse;
-        var innerCollapse;
-
-        setup(function () {
-          outerCollapse = fixture('test');
-        });
-
-        suite('vertical', function() {
-
-          setup(function () {
-            innerCollapse = outerCollapse.querySelector('#inner-collapse-vertical');
-          });
-
-          test('inner collapse default opened attribute', function() {
-            assert.equal(innerCollapse.opened, false);
-          });
-
-          test('inner collapse default style height', function() {
-            assert.equal(innerCollapse.style.maxHeight, '0px');
-          });
-
-          test('open inner collapse updates size without animation', function() {
-            innerCollapse.opened = true;
-
-            // Animation disabled
-            assert.equal(innerCollapse.style.transitionDuration, '0s');
-          });
-
-          test('open inner collapse then open outer collapse reveals inner collapse with expanded height', function() {
-            innerCollapse.opened = true;
-            outerCollapse.opened = true;
-
-            assert.equal(innerCollapse.getBoundingClientRect().height, 100);
-          });
-
-          test('notifyResize triggered only on element\'s animations', function(done) {
-            var spy = sinon.spy(outerCollapse, 'notifyResize');
-
-            outerCollapse.opened = true;
-            innerCollapse.opened = true;
-
-            setTimeout(function() {
-              assert.equal(spy.callCount, 1, 'notifyResize called once');
-              done();
-            }, 400);
-          });
-
-        });
-
-        suite('horizontal', function() {
-
-          setup(function () {
-            innerCollapse = outerCollapse.querySelector('#inner-collapse-horizontal');
-          });
-
-          test('inner collapse default style width', function() {
-            assert.equal(innerCollapse.style.maxWidth, '0px');
-          });
-
-          test('open inner collapse updates size without animation', function() {
-            innerCollapse.opened = true;
-
-            // Animation disabled
-            assert.equal(innerCollapse.style.transitionDuration, '0s');
-          });
-
-          test('open inner collapse then open outer collapse reveals inner collapse with expanded width', function() {
-            innerCollapse.opened = true;
-            outerCollapse.opened = true;
-
-            assert.equal(innerCollapse.getBoundingClientRect().width, 100);
-          });
-
-        });
-      });
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-dropdown/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/README.md b/systrace/catapult/third_party/polymer/components/iron-dropdown/README.md
deleted file mode 100644
index 6440ec6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-dropdown.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-dropdown.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-dropdown)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-dropdown)_
-
-
-##&lt;iron-dropdown&gt;
-
-`<iron-dropdown>` is a generalized element that is useful when you have
-hidden content (`.dropdown-content`) that is revealed due to some change in
-state that should cause it to do so.
-
-Note that this is a low-level element intended to be used as part of other
-composite elements that cause dropdowns to be revealed.
-
-Examples of elements that might be implemented using an `iron-dropdown`
-include comboboxes, menubuttons, selects. The list goes on.
-
-The `<iron-dropdown>` element exposes attributes that allow the position
-of the `.dropdown-content` relative to the `.dropdown-trigger` to be
-configured.
-
-```html
-<iron-dropdown horizontal-align="right" vertical-align="top">
-  <div class="dropdown-content">Hello!</div>
-</iron-dropdown>
-```
-
-In the above example, the `<div>` with class `.dropdown-content` will be
-hidden until the dropdown element has `opened` set to true, or when the `open`
-method is called on the element.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/bower.json b/systrace/catapult/third_party/polymer/components/iron-dropdown/bower.json
deleted file mode 100644
index 2d9fce7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/bower.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "iron-dropdown",
-  "version": "1.5.6",
-  "description": "An unstyled element that works similarly to a native browser select",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer"
-  ],
-  "main": "iron-dropdown.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-dropdown"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-dropdown",
-  "dependencies": {
-    "polymer": "polymer/polymer#^1.1.0",
-    "iron-behaviors": "polymerelements/iron-behaviors#^1.0.0",
-    "iron-overlay-behavior": "polymerelements/iron-overlay-behavior#^1.8.6",
-    "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0",
-    "neon-animation": "polymerelements/neon-animation#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "paper-styles": "polymerelements/paper-styles#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0",
-    "iron-image": "polymerelements/iron-image#^1.0.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/grow-height-animation.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/grow-height-animation.html
deleted file mode 100644
index e2fdc44..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/grow-height-animation.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../neon-animation/neon-animation-behavior.html">
-
-<script>
-  Polymer({
-    is: 'expand-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      var height = node.getBoundingClientRect().height;
-
-      this._effect = new KeyframeEffect(node, [{
-        height: (height / 2) + 'px'
-      }, {
-        height: height + 'px'
-      }], this.timingFromConfig(config));
-
-      return this._effect;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/index.html
deleted file mode 100644
index 3ddbaf2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/index.html
+++ /dev/null
@@ -1,160 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-dropdown</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../iron-image/iron-image.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="x-select.html">
-  <style>
-
-    .dropdown-content {
-      background-color: white;
-      line-height: 20px;
-      border-radius: 3px;
-      box-shadow: 0px 2px 6px #ccc;
-    }
-
-    .random-content {
-      padding: 1.5em 2em;
-      max-width: 250px;
-    }
-
-    button {
-      border: 1px solid #ccc;
-      background-color: #eee;
-      padding: 1em;
-      border-radius: 3px;
-      cursor: pointer;
-    }
-
-    button:focus {
-      outline: none;
-      border-color: blue;
-    }
-
-    ul {
-      margin: 0;
-      padding: 0;
-    }
-
-    li {
-      display: block;
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    a {
-      display: block;
-      position: relative;
-      padding: 1em;
-      text-decoration: none;
-    }
-
-    li:not(:last-of-type) {
-      border-bottom: 1px solid #eee;
-    }
-
-    a:hover {
-      text-decoration: underline;
-    }
-
-    iron-image {
-      padding: 1em;
-      background-color: #fff;
-      box-shadow: 0px 2px 6px #ccc;
-      border-radius: 3px;
-    }
-  </style>
-</head>
-<body>
-  <template is="dom-bind" id="Demo">
-   <div class="vertical-section vertical-section-container ">
-      <h1>iron-dropdown</h1>
-      <p>Examples of vanilla elements.</p>
-      <div>
-        <x-select>
-          <button class="dropdown-trigger">Basic</button>
-          <div class="dropdown-content random-content">
-           Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-          </div>
-        </x-select>
-        <x-select>
-          <button class="dropdown-trigger">Overflowing</button>
-          <div class="dropdown-content random-content">
-            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-            <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
-          </div>
-        </x-select>
-        <x-select vertical-align="bottom">
-          <button class="dropdown-trigger">Bottom-left Aligned</button>
-          <div class="dropdown-content random-content">
-            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-          </div>
-        </x-select>
-        <x-select horizontal-align="right" vertical-align="top">
-          <button class="dropdown-trigger">Top-right Aligned</button>
-          <div class="dropdown-content random-content">
-            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-          </div>
-        </x-select>
-        <x-select horizontal-align="left" vertical-align="top">
-          <button class="dropdown-trigger"> Content</button>
-          <iron-image class="dropdown-content" src="../../iron-image/demo/polymer.svg"></iron-image>
-        </x-select>
-        <x-select horizontal-align="right" vertical-align="top">
-          <button class="dropdown-trigger">Unordered list</button>
-          <ul class="dropdown-content" tabindex="0">
-            <template is="dom-repeat" items="[[dinosaurs]]">
-              <li><a href="javascript:void(0)">[[item]]</a></li>
-            </template>
-          </ul>
-        </x-select>
-      </div>
-    </div>
-  </template>
-
-  <script>
-    Demo.dinosaurs = [
-      'allosaurus',
-      'brontosaurus',
-      'carcharodontosaurus',
-      'diplodocus',
-      'ekrixinatosaurus',
-      'fukuiraptor',
-      'gallimimus',
-      'hadrosaurus',
-      'iguanodon',
-      'jainosaurus',
-      'kritosaurus',
-      'liaoceratops',
-      'megalosaurus',
-      'nemegtosaurus',
-      'ornithomimus',
-      'protoceratops',
-      'quetecsaurus',
-      'rajasaurus',
-      'stegosaurus',
-      'triceratops',
-      'utahraptor',
-      'vulcanodon',
-      'wannanosaurus',
-      'xenoceratops',
-      'yandusaurus',
-      'zephyrosaurus'
-    ];
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/x-select.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/x-select.html
deleted file mode 100644
index 30d8612..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/demo/x-select.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-dropdown.html">
-<link rel="import" href="../../neon-animation/neon-animations.html">
-<link rel="import" href="grow-height-animation.html">
-
-<dom-module id="x-select">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        margin: 1em;
-      }
-    </style>
-    <div on-tap="open">
-      <content select=".dropdown-trigger"></content>
-    </div>
-    <iron-dropdown id="dropdown"
-      vertical-align="[[verticalAlign]]"
-      horizontal-align="[[horizontalAlign]]"
-      disabled="[[disabled]]"
-      open-animation-config="[[openAnimationConfig]]"
-      close-animation-config="[[closeAnimationConfig]]">
-      <content select=".dropdown-content"></content>
-    </iron-dropdown>
-  </template>
-  <script>
-    Polymer({
-      is: 'x-select',
-
-      properties: {
-        verticalAlign: String,
-        horizontalAlign: String,
-        disabled: Boolean,
-        openAnimationConfig: {
-          type: Array,
-          value: function() {
-            return [{
-              name: 'fade-in-animation',
-              timing: {
-                delay: 150,
-                duration: 50
-              }
-            }, {
-              name: 'expand-animation',
-              timing: {
-                delay: 150,
-                duration: 200
-              }
-            }];
-          }
-        },
-
-        closeAnimationConfig: {
-          type: Array,
-          value: function() {
-            return [{
-              name: 'fade-out-animation',
-              timing: {
-                duration: 200
-              }
-            }];
-          }
-        }
-      },
-
-      open: function() {
-        this.$.dropdown.open();
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/index.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/index.html
deleted file mode 100644
index 1d3d6ca..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
-The complete set of authors may be found at http://polymer.github.io/AUTHORS
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
--->
-<html>
-<head>
-
-  <title>iron-dropdown</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/iron-dropdown-scroll-manager.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/iron-dropdown-scroll-manager.html
deleted file mode 100644
index 125bf2b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/iron-dropdown-scroll-manager.html
+++ /dev/null
@@ -1,372 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-  (function() {
-    'use strict';
-    /**
-     * Used to calculate the scroll direction during touch events.
-     * @type {!Object}
-     */
-    var lastTouchPosition = {
-      pageX: 0,
-      pageY: 0
-    };
-    /**
-     * Used to avoid computing event.path and filter scrollable nodes (better perf).
-     * @type {?EventTarget}
-     */
-    var lastRootTarget = null;
-    /**
-     * @type {!Array<Node>}
-     */
-    var lastScrollableNodes = [];
-
-    var scrollEvents = [
-      // Modern `wheel` event for mouse wheel scrolling:
-      'wheel',
-      // Older, non-standard `mousewheel` event for some FF:
-      'mousewheel',
-      // IE:
-      'DOMMouseScroll',
-      // Touch enabled devices
-      'touchstart',
-      'touchmove'
-    ];
-
-    /**
-     * The IronDropdownScrollManager is intended to provide a central source
-     * of authority and control over which elements in a document are currently
-     * allowed to scroll.
-     */
-
-    Polymer.IronDropdownScrollManager = {
-
-      /**
-       * The current element that defines the DOM boundaries of the
-       * scroll lock. This is always the most recently locking element.
-       */
-      get currentLockingElement() {
-        return this._lockingElements[this._lockingElements.length - 1];
-      },
-
-      /**
-       * Returns true if the provided element is "scroll locked", which is to
-       * say that it cannot be scrolled via pointer or keyboard interactions.
-       *
-       * @param {HTMLElement} element An HTML element instance which may or may
-       * not be scroll locked.
-       */
-      elementIsScrollLocked: function(element) {
-        var currentLockingElement = this.currentLockingElement;
-
-        if (currentLockingElement === undefined)
-          return false;
-
-        var scrollLocked;
-
-        if (this._hasCachedLockedElement(element)) {
-          return true;
-        }
-
-        if (this._hasCachedUnlockedElement(element)) {
-          return false;
-        }
-
-        scrollLocked = !!currentLockingElement &&
-          currentLockingElement !== element &&
-          !this._composedTreeContains(currentLockingElement, element);
-
-        if (scrollLocked) {
-          this._lockedElementCache.push(element);
-        } else {
-          this._unlockedElementCache.push(element);
-        }
-
-        return scrollLocked;
-      },
-
-      /**
-       * Push an element onto the current scroll lock stack. The most recently
-       * pushed element and its children will be considered scrollable. All
-       * other elements will not be scrollable.
-       *
-       * Scroll locking is implemented as a stack so that cases such as
-       * dropdowns within dropdowns are handled well.
-       *
-       * @param {HTMLElement} element The element that should lock scroll.
-       */
-      pushScrollLock: function(element) {
-        // Prevent pushing the same element twice
-        if (this._lockingElements.indexOf(element) >= 0) {
-          return;
-        }
-
-        if (this._lockingElements.length === 0) {
-          this._lockScrollInteractions();
-        }
-
-        this._lockingElements.push(element);
-
-        this._lockedElementCache = [];
-        this._unlockedElementCache = [];
-      },
-
-      /**
-       * Remove an element from the scroll lock stack. The element being
-       * removed does not need to be the most recently pushed element. However,
-       * the scroll lock constraints only change when the most recently pushed
-       * element is removed.
-       *
-       * @param {HTMLElement} element The element to remove from the scroll
-       * lock stack.
-       */
-      removeScrollLock: function(element) {
-        var index = this._lockingElements.indexOf(element);
-
-        if (index === -1) {
-          return;
-        }
-
-        this._lockingElements.splice(index, 1);
-
-        this._lockedElementCache = [];
-        this._unlockedElementCache = [];
-
-        if (this._lockingElements.length === 0) {
-          this._unlockScrollInteractions();
-        }
-      },
-
-      _lockingElements: [],
-
-      _lockedElementCache: null,
-
-      _unlockedElementCache: null,
-
-      _hasCachedLockedElement: function(element) {
-        return this._lockedElementCache.indexOf(element) > -1;
-      },
-
-      _hasCachedUnlockedElement: function(element) {
-        return this._unlockedElementCache.indexOf(element) > -1;
-      },
-
-      _composedTreeContains: function(element, child) {
-        // NOTE(cdata): This method iterates over content elements and their
-        // corresponding distributed nodes to implement a contains-like method
-        // that pierces through the composed tree of the ShadowDOM. Results of
-        // this operation are cached (elsewhere) on a per-scroll-lock basis, to
-        // guard against potentially expensive lookups happening repeatedly as
-        // a user scrolls / touchmoves.
-        var contentElements;
-        var distributedNodes;
-        var contentIndex;
-        var nodeIndex;
-
-        if (element.contains(child)) {
-          return true;
-        }
-
-        contentElements = Polymer.dom(element).querySelectorAll('content');
-
-        for (contentIndex = 0; contentIndex < contentElements.length; ++contentIndex) {
-
-          distributedNodes = Polymer.dom(contentElements[contentIndex]).getDistributedNodes();
-
-          for (nodeIndex = 0; nodeIndex < distributedNodes.length; ++nodeIndex) {
-
-            if (this._composedTreeContains(distributedNodes[nodeIndex], child)) {
-              return true;
-            }
-          }
-        }
-
-        return false;
-      },
-
-      _scrollInteractionHandler: function(event) {
-        // Avoid canceling an event with cancelable=false, e.g. scrolling is in
-        // progress and cannot be interrupted.
-        if (event.cancelable && this._shouldPreventScrolling(event)) {
-          event.preventDefault();
-        }
-        // If event has targetTouches (touch event), update last touch position.
-        if (event.targetTouches) {
-          var touch = event.targetTouches[0];
-          lastTouchPosition.pageX = touch.pageX;
-          lastTouchPosition.pageY = touch.pageY;
-        }
-      },
-
-      _lockScrollInteractions: function() {
-        this._boundScrollHandler = this._boundScrollHandler ||
-          this._scrollInteractionHandler.bind(this);
-        for (var i = 0, l = scrollEvents.length; i < l; i++) {
-          // NOTE: browsers that don't support objects as third arg will
-          // interpret it as boolean, hence useCapture = true in this case. 
-          document.addEventListener(scrollEvents[i], this._boundScrollHandler, {
-            capture: true,
-            passive: false
-          });
-        }
-      },
-
-      _unlockScrollInteractions: function() {
-        for (var i = 0, l = scrollEvents.length; i < l; i++) {
-          // NOTE: browsers that don't support objects as third arg will
-          // interpret it as boolean, hence useCapture = true in this case.
-          document.removeEventListener(scrollEvents[i], this._boundScrollHandler, {
-            capture: true,
-            passive: false
-          });
-        }
-      },
-
-      /**
-       * Returns true if the event causes scroll outside the current locking
-       * element, e.g. pointer/keyboard interactions, or scroll "leaking"
-       * outside the locking element when it is already at its scroll boundaries.
-       * @param {!Event} event
-       * @return {boolean}
-       * @private
-       */
-      _shouldPreventScrolling: function(event) {
-
-        // Update if root target changed. For touch events, ensure we don't
-        // update during touchmove.
-        var target = Polymer.dom(event).rootTarget;
-        if (event.type !== 'touchmove' && lastRootTarget !== target) {
-          lastRootTarget = target;
-          lastScrollableNodes = this._getScrollableNodes(Polymer.dom(event).path);
-        }
-
-        // Prevent event if no scrollable nodes.
-        if (!lastScrollableNodes.length) {
-          return true;
-        }
-        // Don't prevent touchstart event inside the locking element when it has
-        // scrollable nodes.
-        if (event.type === 'touchstart') {
-          return false;
-        }
-        // Get deltaX/Y.
-        var info = this._getScrollInfo(event);
-        // Prevent if there is no child that can scroll.
-        return !this._getScrollingNode(lastScrollableNodes, info.deltaX, info.deltaY);
-      },
-
-      /**
-       * Returns an array of scrollable nodes up to the current locking element,
-       * which is included too if scrollable.
-       * @param {!Array<Node>} nodes
-       * @return {Array<Node>} scrollables
-       * @private
-       */
-      _getScrollableNodes: function(nodes) {
-        var scrollables = [];
-        var lockingIndex = nodes.indexOf(this.currentLockingElement);
-        // Loop from root target to locking element (included).
-        for (var i = 0; i <= lockingIndex; i++) {
-          // Skip non-Element nodes.
-          if (nodes[i].nodeType !== Node.ELEMENT_NODE) {
-            continue;
-          }
-          var node = /** @type {!Element} */ (nodes[i]);
-          // Check inline style before checking computed style.
-          var style = node.style;
-          if (style.overflow !== 'scroll' && style.overflow !== 'auto') {
-            style = window.getComputedStyle(node);
-          }
-          if (style.overflow === 'scroll' || style.overflow === 'auto') {
-            scrollables.push(node);
-          }
-        }
-        return scrollables;
-      },
-
-      /**
-       * Returns the node that is scrolling. If there is no scrolling,
-       * returns undefined.
-       * @param {!Array<Node>} nodes
-       * @param {number} deltaX Scroll delta on the x-axis
-       * @param {number} deltaY Scroll delta on the y-axis
-       * @return {Node|undefined}
-       * @private
-       */
-      _getScrollingNode: function(nodes, deltaX, deltaY) {
-        // No scroll.
-        if (!deltaX && !deltaY) {
-          return;
-        }
-        // Check only one axis according to where there is more scroll.
-        // Prefer vertical to horizontal.
-        var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);
-        for (var i = 0; i < nodes.length; i++) {
-          var node = nodes[i];
-          var canScroll = false;
-          if (verticalScroll) {
-            // delta < 0 is scroll up, delta > 0 is scroll down.
-            canScroll = deltaY < 0 ? node.scrollTop > 0 :
-              node.scrollTop < node.scrollHeight - node.clientHeight;
-          } else {
-            // delta < 0 is scroll left, delta > 0 is scroll right.
-            canScroll = deltaX < 0 ? node.scrollLeft > 0 :
-              node.scrollLeft < node.scrollWidth - node.clientWidth;
-          }
-          if (canScroll) {
-            return node;
-          }
-        }
-      },
-
-      /**
-       * Returns scroll `deltaX` and `deltaY`.
-       * @param {!Event} event The scroll event
-       * @return {{deltaX: number, deltaY: number}} Object containing the
-       * x-axis scroll delta (positive: scroll right, negative: scroll left,
-       * 0: no scroll), and the y-axis scroll delta (positive: scroll down,
-       * negative: scroll up, 0: no scroll).
-       * @private
-       */
-      _getScrollInfo: function(event) {
-        var info = {
-          deltaX: event.deltaX,
-          deltaY: event.deltaY
-        };
-        // Already available.
-        if ('deltaX' in event) {
-          // do nothing, values are already good.
-        }
-        // Safari has scroll info in `wheelDeltaX/Y`.
-        else if ('wheelDeltaX' in event) {
-          info.deltaX = -event.wheelDeltaX;
-          info.deltaY = -event.wheelDeltaY;
-        }
-        // Firefox has scroll info in `detail` and `axis`.
-        else if ('axis' in event) {
-          info.deltaX = event.axis === 1 ? event.detail : 0;
-          info.deltaY = event.axis === 2 ? event.detail : 0;
-        }
-        // On mobile devices, calculate scroll direction.
-        else if (event.targetTouches) {
-          var touch = event.targetTouches[0];
-          // Touch moves from right to left => scrolling goes right.
-          info.deltaX = lastTouchPosition.pageX - touch.pageX;
-          // Touch moves from down to up => scrolling goes down.
-          info.deltaY = lastTouchPosition.pageY - touch.pageY;
-        }
-        return info;
-      }
-    };
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/iron-dropdown.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/iron-dropdown.html
deleted file mode 100644
index 82290a3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/iron-dropdown.html
+++ /dev/null
@@ -1,353 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-overlay-behavior/iron-overlay-behavior.html">
-<link rel="import" href="../neon-animation/neon-animation-runner-behavior.html">
-<link rel="import" href="../neon-animation/animations/opaque-animation.html">
-<link rel="import" href="iron-dropdown-scroll-manager.html">
-
-<!--
-`<iron-dropdown>` is a generalized element that is useful when you have
-hidden content (`.dropdown-content`) that is revealed due to some change in
-state that should cause it to do so.
-
-Note that this is a low-level element intended to be used as part of other
-composite elements that cause dropdowns to be revealed.
-
-Examples of elements that might be implemented using an `iron-dropdown`
-include comboboxes, menubuttons, selects. The list goes on.
-
-The `<iron-dropdown>` element exposes attributes that allow the position
-of the `.dropdown-content` relative to the `.dropdown-trigger` to be
-configured.
-
-    <iron-dropdown horizontal-align="right" vertical-align="top">
-      <div class="dropdown-content">Hello!</div>
-    </iron-dropdown>
-
-In the above example, the `<div>` with class `.dropdown-content` will be
-hidden until the dropdown element has `opened` set to true, or when the `open`
-method is called on the element.
-
-@demo demo/index.html
--->
-
-<dom-module id="iron-dropdown">
-  <template>
-    <style>
-      :host {
-        position: fixed;
-      }
-
-      #contentWrapper ::content > * {
-        overflow: auto;
-      }
-
-      #contentWrapper.animating ::content > * {
-        overflow: hidden;
-      }
-    </style>
-
-    <div id="contentWrapper">
-      <content id="content" select=".dropdown-content"></content>
-    </div>
-  </template>
-
-  <script>
-    (function() {
-      'use strict';
-
-      Polymer({
-        is: 'iron-dropdown',
-
-        behaviors: [
-          Polymer.IronControlState,
-          Polymer.IronA11yKeysBehavior,
-          Polymer.IronOverlayBehavior,
-          Polymer.NeonAnimationRunnerBehavior
-        ],
-
-        properties: {
-          /**
-           * The orientation against which to align the dropdown content
-           * horizontally relative to the dropdown trigger.
-           * Overridden from `Polymer.IronFitBehavior`.
-           */
-          horizontalAlign: {
-            type: String,
-            value: 'left',
-            reflectToAttribute: true
-          },
-
-          /**
-           * The orientation against which to align the dropdown content
-           * vertically relative to the dropdown trigger.
-           * Overridden from `Polymer.IronFitBehavior`.
-           */
-          verticalAlign: {
-            type: String,
-            value: 'top',
-            reflectToAttribute: true
-          },
-
-          /**
-           * An animation config. If provided, this will be used to animate the
-           * opening of the dropdown. Pass an Array for multiple animations.
-           * See `neon-animation` documentation for more animation configuration
-           * details.
-           */
-          openAnimationConfig: {
-            type: Object
-          },
-
-          /**
-           * An animation config. If provided, this will be used to animate the
-           * closing of the dropdown. Pass an Array for multiple animations.
-           * See `neon-animation` documentation for more animation configuration
-           * details.
-           */
-          closeAnimationConfig: {
-            type: Object
-          },
-
-          /**
-           * If provided, this will be the element that will be focused when
-           * the dropdown opens.
-           */
-          focusTarget: {
-            type: Object
-          },
-
-          /**
-           * Set to true to disable animations when opening and closing the
-           * dropdown.
-           */
-          noAnimations: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * By default, the dropdown will constrain scrolling on the page
-           * to itself when opened.
-           * Set to true in order to prevent scroll from being constrained
-           * to the dropdown when it opens.
-           */
-          allowOutsideScroll: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Callback for scroll events.
-           * @type {Function}
-           * @private
-           */
-          _boundOnCaptureScroll: {
-            type: Function,
-            value: function() {
-              return this._onCaptureScroll.bind(this);
-            }
-          }
-        },
-
-        listeners: {
-          'neon-animation-finish': '_onNeonAnimationFinish'
-        },
-
-        observers: [
-          '_updateOverlayPosition(positionTarget, verticalAlign, horizontalAlign, verticalOffset, horizontalOffset)'
-        ],
-
-        /**
-         * The element that is contained by the dropdown, if any.
-         */
-        get containedElement() {
-          return Polymer.dom(this.$.content).getDistributedNodes()[0];
-        },
-
-        /**
-         * The element that should be focused when the dropdown opens.
-         * @deprecated
-         */
-        get _focusTarget() {
-          return this.focusTarget || this.containedElement;
-        },
-
-        ready: function() {
-          // Memoized scrolling position, used to block scrolling outside.
-          this._scrollTop = 0;
-          this._scrollLeft = 0;
-          // Used to perform a non-blocking refit on scroll.
-          this._refitOnScrollRAF = null;
-        },
-
-        attached: function () {
-          if (!this.sizingTarget || this.sizingTarget === this) {
-            this.sizingTarget = this.containedElement || this;
-          }
-        },
-
-        detached: function() {
-          this.cancelAnimation();
-          document.removeEventListener('scroll', this._boundOnCaptureScroll);
-          Polymer.IronDropdownScrollManager.removeScrollLock(this);
-        },
-
-        /**
-         * Called when the value of `opened` changes.
-         * Overridden from `IronOverlayBehavior`
-         */
-        _openedChanged: function() {
-          if (this.opened && this.disabled) {
-            this.cancel();
-          } else {
-            this.cancelAnimation();
-            this._updateAnimationConfig();
-            this._saveScrollPosition();
-            if (this.opened) {
-              document.addEventListener('scroll', this._boundOnCaptureScroll);
-              !this.allowOutsideScroll && Polymer.IronDropdownScrollManager.pushScrollLock(this);
-            } else {
-              document.removeEventListener('scroll', this._boundOnCaptureScroll);
-              Polymer.IronDropdownScrollManager.removeScrollLock(this);
-            }
-            Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);
-          }
-        },
-
-        /**
-         * Overridden from `IronOverlayBehavior`.
-         */
-        _renderOpened: function() {
-          if (!this.noAnimations && this.animationConfig.open) {
-            this.$.contentWrapper.classList.add('animating');
-            this.playAnimation('open');
-          } else {
-            Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this, arguments);
-          }
-        },
-
-        /**
-         * Overridden from `IronOverlayBehavior`.
-         */
-        _renderClosed: function() {
-
-          if (!this.noAnimations && this.animationConfig.close) {
-            this.$.contentWrapper.classList.add('animating');
-            this.playAnimation('close');
-          } else {
-            Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this, arguments);
-          }
-        },
-
-        /**
-         * Called when animation finishes on the dropdown (when opening or
-         * closing). Responsible for "completing" the process of opening or
-         * closing the dropdown by positioning it or setting its display to
-         * none.
-         */
-        _onNeonAnimationFinish: function() {
-          this.$.contentWrapper.classList.remove('animating');
-          if (this.opened) {
-            this._finishRenderOpened();
-          } else {
-            this._finishRenderClosed();
-          }
-        },
-
-        _onCaptureScroll: function() {
-          if (!this.allowOutsideScroll) {
-            this._restoreScrollPosition();
-          } else {
-            this._refitOnScrollRAF && window.cancelAnimationFrame(this._refitOnScrollRAF);
-            this._refitOnScrollRAF = window.requestAnimationFrame(this.refit.bind(this));
-          }
-        },
-
-        /**
-         * Memoizes the scroll position of the outside scrolling element.
-         * @private
-         */
-        _saveScrollPosition: function() {
-          if (document.scrollingElement) {
-            this._scrollTop = document.scrollingElement.scrollTop;
-            this._scrollLeft = document.scrollingElement.scrollLeft;
-          } else {
-            // Since we don't know if is the body or html, get max.
-            this._scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
-            this._scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
-          }
-        },
-
-        /**
-         * Resets the scroll position of the outside scrolling element.
-         * @private
-         */
-        _restoreScrollPosition: function() {
-          if (document.scrollingElement) {
-            document.scrollingElement.scrollTop = this._scrollTop;
-            document.scrollingElement.scrollLeft = this._scrollLeft;
-          } else {
-            // Since we don't know if is the body or html, set both.
-            document.documentElement.scrollTop = this._scrollTop;
-            document.documentElement.scrollLeft = this._scrollLeft;
-            document.body.scrollTop = this._scrollTop;
-            document.body.scrollLeft = this._scrollLeft;
-          }
-        },
-
-        /**
-         * Constructs the final animation config from different properties used
-         * to configure specific parts of the opening and closing animations.
-         */
-        _updateAnimationConfig: function() {
-          // Update the animation node to be the containedElement.
-          var animationNode = this.containedElement;
-          var animations = [].concat(this.openAnimationConfig || []).concat(this.closeAnimationConfig || []);
-          for (var i = 0; i < animations.length; i++) {
-            animations[i].node = animationNode;
-          }
-          this.animationConfig = {
-            open: this.openAnimationConfig,
-            close: this.closeAnimationConfig
-          };
-        },
-
-        /**
-         * Updates the overlay position based on configured horizontal
-         * and vertical alignment.
-         */
-        _updateOverlayPosition: function() {
-          if (this.isAttached) {
-            // This triggers iron-resize, and iron-overlay-behavior will call refit if needed.
-            this.notifyResize();
-          }
-        },
-
-        /**
-         * Apply focus to focusTarget or containedElement
-         */
-        _applyFocus: function () {
-          var focusTarget = this.focusTarget || this.containedElement;
-          if (focusTarget && this.opened && !this.noAutoFocus) {
-            focusTarget.focus();
-          } else {
-            Polymer.IronOverlayBehaviorImpl._applyFocus.apply(this, arguments);
-          }
-        }
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/index.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/test/index.html
deleted file mode 100644
index 3507c6b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>iron-dropdown tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'iron-dropdown.html',
-      'iron-dropdown-scroll-manager.html',
-      'iron-dropdown.html?dom=shadow',
-      'iron-dropdown-scroll-manager.html?dom=shadow'
-    ]);
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/iron-dropdown-scroll-manager.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/test/iron-dropdown-scroll-manager.html
deleted file mode 100644
index ffc0661..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/iron-dropdown-scroll-manager.html
+++ /dev/null
@@ -1,187 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-  <meta charset="UTF-8">
-  <title>iron-dropdown-scroll-manager tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../iron-dropdown-scroll-manager.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="x-scrollable-element.html">
-</head>
-
-<body>
-
-  <test-fixture id="DOMSubtree">
-    <template>
-      <x-scrollable-element id="Parent"></x-scrollable-element>
-    </template>
-  </test-fixture>
-  <script>
-
-    suite('IronDropdownScrollManager', function() {
-      var parent;
-      var childOne;
-      var childTwo;
-      var grandChildOne;
-      var grandChildTwo;
-      var ancestor;
-
-      setup(function() {
-        parent = fixture('DOMSubtree');
-        childOne = parent.$$('#ChildOne');
-        childTwo = parent.$$('#ChildTwo');
-        grandChildOne = parent.$$('#GrandchildOne');
-        grandChildTwo = parent.$$('#GrandchildTwo');
-        ancestor = document.body;
-      });
-
-      suite('constraining scroll in the DOM', function() {
-        setup(function() {
-          Polymer.IronDropdownScrollManager.pushScrollLock(childOne);
-        });
-
-        teardown(function() {
-          Polymer.IronDropdownScrollManager.removeScrollLock(childOne);
-        });
-
-        test('recognizes sibling as locked', function() {
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(childTwo))
-            .to.be.equal(true);
-        });
-
-        test('recognizes neice as locked', function() {
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(grandChildTwo))
-            .to.be.equal(true);
-        });
-
-        test('recognizes parent as locked', function() {
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(parent))
-            .to.be.equal(true);
-        });
-
-        test('recognizes ancestor as locked', function() {
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(ancestor))
-            .to.be.equal(true);
-        });
-
-        test('recognizes locking child as unlocked', function() {
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(childOne))
-            .to.be.equal(false);
-        });
-
-        test('recognizes descendant of locking child as unlocked', function() {
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(grandChildOne))
-            .to.be.equal(false);
-        });
-
-        test('unlocks locked elements when there are no locking elements', function() {
-          Polymer.IronDropdownScrollManager.removeScrollLock(childOne);
-
-          expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(parent))
-            .to.be.equal(false);
-        });
-
-        suite('various scroll events', function() {
-          var scrollEvents;
-          var events;
-
-          setup(function() {
-            scrollEvents = [
-              'wheel',
-              'mousewheel',
-              'DOMMouseScroll',
-              'touchmove'
-            ];
-
-            events = scrollEvents.map(function(scrollEvent) {
-              var event = new CustomEvent(scrollEvent, {
-                bubbles: true,
-                cancelable: true
-              });
-              event.deltaX = 0;
-              event.deltaY = 10;
-              return event;
-            });
-          });
-
-          test('prevents wheel events from locked elements', function() {
-            events.forEach(function(event) {
-              childTwo.dispatchEvent(event);
-              expect(event.defaultPrevented).to.be.eql(true);
-            });
-          });
-
-          test('allows wheel events when there are no locking elements', function() {
-            Polymer.IronDropdownScrollManager.removeScrollLock(childOne);
-            events.forEach(function(event) {
-              childTwo.dispatchEvent(event);
-              expect(event.defaultPrevented).to.be.eql(false);
-            });
-          });
-
-          test('allows wheel events from unlocked elements', function() {
-            events.forEach(function(event) {
-              childOne.dispatchEvent(event);
-              expect(event.defaultPrevented).to.be.eql(false);
-            });
-          });
-
-          test('touchstart is prevented if dispatched by an element outside the locking element', function() {
-            var event = new CustomEvent('touchstart', {
-              bubbles: true,
-              cancelable: true
-            });
-            childTwo.dispatchEvent(event);
-            expect(event.defaultPrevented).to.be.eql(true);
-          });
-
-          test('touchstart is not prevented if dispatched by an element inside the locking element', function() {
-            var event = new CustomEvent('touchstart', {
-              bubbles: true,
-              cancelable: true
-            });
-            grandChildOne.dispatchEvent(event);
-            expect(event.defaultPrevented).to.be.eql(false);
-          });
-
-          test('arrow keyboard events not prevented by manager', function() {
-            // Even if these events might cause scrolling, they should not be
-            // prevented because they might cause a11y issues (e.g. arrow keys
-            // used for navigating the content). iron-dropdown is capable of
-            // restoring the scroll position of the document if necessary.
-            var left = MockInteractions.keyboardEventFor('keydown', 37);
-            var up = MockInteractions.keyboardEventFor('keydown', 38);
-            var right = MockInteractions.keyboardEventFor('keydown', 39);
-            var down = MockInteractions.keyboardEventFor('keydown', 40);
-            grandChildOne.dispatchEvent(left);
-            grandChildOne.dispatchEvent(up);
-            grandChildOne.dispatchEvent(right);
-            grandChildOne.dispatchEvent(down);
-            expect(left.defaultPrevented).to.be.eql(false);
-            expect(up.defaultPrevented).to.be.eql(false);
-            expect(right.defaultPrevented).to.be.eql(false);
-            expect(down.defaultPrevented).to.be.eql(false);
-          });
-        });
-      });
-    });
-  </script>
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/iron-dropdown.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/test/iron-dropdown.html
deleted file mode 100644
index a01b000..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/iron-dropdown.html
+++ /dev/null
@@ -1,597 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-  <meta charset="UTF-8">
-  <title>iron-dropdown basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../iron-dropdown.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-
-</head>
-<style>
-  body {
-    margin: 0;
-    padding: 0;
-  }
-
-  .container {
-    display: block;
-    position: relative;
-    width: 100px;
-    height: 100px;
-    background-color: yellow;
-  }
-
-  .positioned {
-    position: absolute;
-    top: 40px;
-    left: 40px;
-  }
-
-  .dropdown-content {
-    width: 50px;
-    height: 50px;
-    background-color: orange;
-  }
-
-  .big {
-    width: 3000px;
-    height: 3000px;
-  }
-</style>
-
-<body>
-
-  <test-fixture id="TrivialDropdown">
-    <template>
-      <iron-dropdown>
-        <div class="dropdown-content"></div>
-      </iron-dropdown>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="NonLockingDropdown">
-    <template>
-      <iron-dropdown allow-outside-scroll>
-        <div class="dropdown-content">I don't lock scroll!</div>
-      </iron-dropdown>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="AlignedDropdown">
-    <template>
-      <div class="container">
-        <iron-dropdown horizontal-align="right" vertical-align="top">
-          <div class="dropdown-content big"></div>
-        </iron-dropdown>
-      </div>
-    </template>
-  </test-fixture>
-
-  <!-- Absolutely position the dropdown so that it has enough space to move around -->
-  <test-fixture id="OffsetDropdownTopLeft">
-    <template>
-      <div class="container positioned">
-        <iron-dropdown>
-          <div class="dropdown-content"></div>
-        </iron-dropdown>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="OffsetDropdownBottomRight">
-    <template>
-      <div class="container positioned">
-        <iron-dropdown horizontal-align="right" vertical-align="bottom">
-          <div class="dropdown-content"></div>
-        </iron-dropdown>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="FocusableContentDropdown">
-    <template>
-      <iron-dropdown>
-        <div class="dropdown-content" tabindex="0">
-          <div class="subcontent" tabindex="0"></div>
-        </div>
-      </iron-dropdown>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="RTLDropdownLeft">
-    <template>
-      <div dir="rtl" class="container">
-        <iron-dropdown>
-          <div class="dropdown-content"></div>
-        </iron-dropdown>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="RTLDropdownRight">
-    <template>
-      <div dir="rtl" class="container">
-        <iron-dropdown horizontal-align="right">
-          <div class="dropdown-content"></div>
-        </iron-dropdown>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="sizingTarget">
-    <template>
-      <iron-dropdown>
-        <div class="dropdown-content">
-          <div class="subcontent"></div>
-        </div>
-      </iron-dropdown>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="EmptyDropdown">
-    <template>
-      <iron-dropdown></iron-dropdown>
-    </template>
-  </test-fixture>
-
-  <script>
-    function elementIsVisible(element) {
-      var contentRect = element.getBoundingClientRect();
-      var computedStyle = window.getComputedStyle(element);
-
-      return computedStyle.display !== 'none' &&
-        contentRect.width > 0 &&
-        contentRect.height > 0;
-    }
-
-    function runAfterOpen(overlay, callback) {
-      overlay.addEventListener('iron-overlay-opened', callback);
-      overlay.open();
-    }
-
-    function fireWheel(node, deltaX, deltaY) {
-      // IE 11 doesn't support WheelEvent, use CustomEvent.
-      var event = new CustomEvent('wheel', {
-        cancelable: true,
-        bubbles: true
-      });
-      event.deltaX = deltaX;
-      event.deltaY = deltaY;
-      node.dispatchEvent(event);
-      return event;
-    }
-
-    function dispatchScroll(target, scrollLeft, scrollTop) {
-      target.scrollLeft = scrollLeft;
-      target.scrollTop = scrollTop;
-      target.dispatchEvent(new CustomEvent('scroll', { bubbles:true } ));
-    }
-
-    suite('<iron-dropdown>', function() {
-      var dropdown;
-      var content;
-
-      suite('basic', function() {
-        setup(function() {
-          dropdown = fixture('TrivialDropdown');
-          content = Polymer.dom(dropdown).querySelector('.dropdown-content');
-        });
-
-        test('effectively hides the dropdown content', function() {
-          expect(elementIsVisible(content)).to.be.equal(false);
-        });
-
-        test('shows dropdown content when opened', function(done) {
-          runAfterOpen(dropdown, function() {
-            expect(elementIsVisible(content)).to.be.equal(true);
-            done();
-          });
-        });
-
-        test('hides dropdown content when outside is clicked', function(done) {
-          runAfterOpen(dropdown, function() {
-            expect(elementIsVisible(content)).to.be.equal(true);
-            dropdown.addEventListener('iron-overlay-closed', function() {
-              expect(elementIsVisible(content)).to.be.equal(false);
-              done();
-            });
-            MockInteractions.tap(dropdown.parentNode);
-          });
-        });
-
-        suite('when content is focusable', function() {
-          setup(function() {
-            dropdown = fixture('FocusableContentDropdown');
-            content = Polymer.dom(dropdown).querySelector('.dropdown-content');
-          });
-          test('focuses the content when opened', function(done) {
-            runAfterOpen(dropdown, function() {
-              expect(document.activeElement).to.be.equal(content);
-              done();
-            });
-          });
-
-          test('focuses a configured focus target', function(done) {
-            var focusableChild = Polymer.dom(content).querySelector('div[tabindex]');
-            dropdown.focusTarget = focusableChild;
-
-            runAfterOpen(dropdown, function() {
-              expect(document.activeElement).to.not.be.equal(content);
-              expect(document.activeElement).to.be.equal(focusableChild);
-              done();
-            });
-          });
-        });
-
-        suite('when dropdown is empty', function() {
-          test('keeps the sizingTarget default value', function() {
-            dropdown = fixture('EmptyDropdown');
-            expect(dropdown.sizingTarget).to.be.equal(dropdown);
-          });
-        });
-
-        suite('correct animationConfig setup', function() {
-          test('as objects', function() {
-            dropdown.openAnimationConfig = {
-              name: 'open-animation'
-            };
-            dropdown.closeAnimationConfig = {
-              name: 'close-animation'
-            };
-
-            dropdown.opened = true;
-
-            assert.deepEqual(dropdown.openAnimationConfig, {
-              name: 'open-animation',
-              node: content
-            }, 'open animation ok');
-
-            assert.deepEqual(dropdown.closeAnimationConfig, {
-              name: 'close-animation',
-              node: content
-            }, 'close animation ok');
-
-            assert.deepEqual(dropdown.animationConfig, {
-              open: dropdown.openAnimationConfig,
-              close: dropdown.closeAnimationConfig
-            }, 'animationConfig ok');
-          });
-
-          test('as arrays', function() {
-            dropdown.openAnimationConfig = [{
-              name: 'open-animation-1'
-            }, {
-              name: 'open-animation-2'
-            }];
-            dropdown.closeAnimationConfig = [{
-              name: 'close-animation-1'
-            }, {
-              name: 'close-animation-2'
-            }];
-
-            dropdown.opened = true;
-
-            assert.deepEqual(dropdown.openAnimationConfig, [{
-              name: 'open-animation-1',
-              node: content
-            }, {
-              name: 'open-animation-2',
-              node: content
-            }], 'open animation ok');
-
-            assert.deepEqual(dropdown.closeAnimationConfig, [{
-              name: 'close-animation-1',
-              node: content
-            }, {
-              name: 'close-animation-2',
-              node: content
-            }], 'close animation ok');
-
-            assert.deepEqual(dropdown.animationConfig, {
-              open: dropdown.openAnimationConfig,
-              close: dropdown.closeAnimationConfig
-            }, 'animationConfig ok');
-          });
-        });
-
-      });
-
-      suite('locking scroll', function() {
-
-        var bigDiv, scrollTarget;
-        suiteSetup(function() {
-          bigDiv = document.createElement('div');
-          bigDiv.classList.add('big');
-          document.body.appendChild(bigDiv);
-          // Need to discover if html or body is scrollable.
-          // Here we are sure the page is scrollable.
-          document.documentElement.scrollTop = 1;
-          if (document.documentElement.scrollTop === 1) {
-            document.documentElement.scrollTop = 0;
-            scrollTarget = document.documentElement;
-          } else {
-            scrollTarget = document.body;
-          }
-        });
-
-        suiteTeardown(function() {
-          document.body.removeChild(bigDiv);
-        });
-
-        setup(function() {
-          dropdown = fixture('TrivialDropdown');
-        });
-
-        teardown(function() {
-          dispatchScroll(scrollTarget, 0, 0);
-        });
-
-        test('should lock, only once', function(done) {
-          var openCount = 0;
-          runAfterOpen(dropdown, function() {
-            expect(Polymer.IronDropdownScrollManager._lockingElements.length)
-              .to.be.equal(1);
-            expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(document.body))
-              .to.be.equal(true);
-            expect(fireWheel(document.body, 0, 10).defaultPrevented).to.be.equal(true);
-
-            if (openCount === 0) {
-              // This triggers a second `pushScrollLock` with the same element, however
-              // that should not add the element to the `_lockingElements` stack twice
-              dropdown.close();
-              dropdown.open();
-            } else {
-              done();
-            }
-            openCount++;
-          });
-        });
-
-        test('should lock scroll', function(done) {
-          runAfterOpen(dropdown, function() {
-            dispatchScroll(scrollTarget, 10, 10);
-            assert.equal(scrollTarget.scrollTop, 0, 'scrollTop ok');
-            assert.equal(scrollTarget.scrollLeft, 0, 'scrollLeft ok');
-            done();
-          });
-        });
-
-        test('can be disabled with `allowOutsideScroll`', function(done) {
-          dropdown.allowOutsideScroll = true;
-          runAfterOpen(dropdown, function() {
-            dispatchScroll(scrollTarget, 10, 10);
-            assert.equal(scrollTarget.scrollTop, 10, 'scrollTop ok');
-            assert.equal(scrollTarget.scrollLeft, 10, 'scrollLeft ok');
-            done();
-          });
-        });
-
-      });
-
-      suite('non locking scroll', function() {
-
-        setup(function() {
-          dropdown = fixture('NonLockingDropdown');
-        });
-
-        test('can be disabled with `allowOutsideScroll`', function(done) {
-          runAfterOpen(dropdown, function() {
-            expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(document.body))
-              .to.be.equal(false);
-            expect(fireWheel(document.body, 0, 10).defaultPrevented).to.be.equal(false);
-            done();
-          });
-        });
-      });
-
-      suite('aligned dropdown', function() {
-        var parent;
-        var parentRect;
-        var dropdownRect;
-
-        setup(function() {
-          parent = fixture('AlignedDropdown');
-          dropdown = parent.querySelector('iron-dropdown');
-          parentRect = parent.getBoundingClientRect();
-        });
-
-        test('can be re-aligned to the right and the top', function(done) {
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            assert.equal(dropdownRect.top, parentRect.top, 'top ok');
-            assert.equal(dropdownRect.left, 0, 'left ok');
-            assert.equal(dropdownRect.bottom, window.innerHeight, 'bottom ok');
-            assert.equal(dropdownRect.right, parentRect.right, 'right ok');
-            done();
-          });
-        });
-
-        test('can be re-aligned to the bottom', function(done) {
-          dropdown.verticalAlign = 'bottom';
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            assert.equal(dropdownRect.top, 0, 'top ok');
-            assert.equal(dropdownRect.left, 0, 'left ok');
-            assert.equal(dropdownRect.bottom, parentRect.bottom, 'bottom ok');
-            assert.equal(dropdownRect.right, parentRect.right, 'right ok');
-            done();
-          });
-        });
-
-        test('handles parent\'s stacking context', function(done) {
-          // This will create a new stacking context.
-          parent.style.transform = 'translateZ(0)';
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            assert.equal(dropdownRect.top, parentRect.top, 'top ok');
-            assert.equal(dropdownRect.left, 0, 'left ok');
-            assert.equal(dropdownRect.bottom, window.innerHeight, 'bottom ok');
-            assert.equal(dropdownRect.right, parentRect.right, 'right ok');
-            done();
-          });
-        });
-      });
-
-      suite('when align is left/top, with an offset', function() {
-        var dropdownRect;
-        var offsetDropdownRect;
-        setup(function() {
-          var parent = fixture('OffsetDropdownTopLeft');
-          dropdown = parent.querySelector('iron-dropdown');
-        });
-
-        test('can be offset towards the bottom right', function(done) {
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            dropdown.verticalOffset = 10;
-            dropdown.horizontalOffset = 10;
-            // Force refit instead of waiting for requestAnimationFrame.
-            dropdown.refit();
-            offsetDropdownRect = dropdown.getBoundingClientRect();
-            // verticalAlign is top, so a positive offset moves down.
-            assert.equal(dropdownRect.top + 10, offsetDropdownRect.top, 'top ok');
-            // horizontalAlign is left, so a positive offset moves to the right.
-            assert.equal(dropdownRect.left + 10, offsetDropdownRect.left, 'left ok');
-            done();
-          });
-        });
-
-        test('can be offset towards the top left', function(done) {
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            dropdown.verticalOffset = -10;
-            dropdown.horizontalOffset = -10;
-            // Force refit instead of waiting for requestAnimationFrame.
-            dropdown.refit();
-            offsetDropdownRect = dropdown.getBoundingClientRect();
-            // verticalAlign is top, so a negative offset moves up.
-            assert.equal(dropdownRect.top - 10, offsetDropdownRect.top, 'top ok');
-            // horizontalAlign is left, so a negative offset moves to the left.
-            assert.equal(dropdownRect.left - 10, offsetDropdownRect.left, 'left ok');
-            done();
-          });
-        });
-      });
-
-      suite('when align is right/bottom, with an offset', function() {
-        var dropdownRect;
-        var offsetDropdownRect;
-        setup(function() {
-          var parent = fixture('OffsetDropdownBottomRight');
-          dropdown = parent.querySelector('iron-dropdown');
-        });
-
-        test('can be offset towards the top left', function(done) {
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            dropdown.verticalOffset = 10;
-            dropdown.horizontalOffset = 10;
-            // Force refit instead of waiting for requestAnimationFrame.
-            dropdown.refit();
-            offsetDropdownRect = dropdown.getBoundingClientRect();
-            // verticalAlign is bottom, so a positive offset moves up.
-            assert.equal(dropdownRect.bottom - 10, offsetDropdownRect.bottom, 'bottom ok');
-            // horizontalAlign is right, so a positive offset moves to the left.
-            assert.equal(dropdownRect.right - 10, offsetDropdownRect.right, 'right ok');
-            done();
-          });
-        });
-
-        test('can be offset towards the bottom right', function(done) {
-          runAfterOpen(dropdown, function() {
-            dropdownRect = dropdown.getBoundingClientRect();
-            dropdown.verticalOffset = -10;
-            dropdown.horizontalOffset = -10;
-            // Force refit instead of waiting for requestAnimationFrame.
-            dropdown.refit();
-            offsetDropdownRect = dropdown.getBoundingClientRect();
-            // verticalAlign is bottom, so a negative offset moves down.
-            assert.equal(dropdownRect.bottom + 10, offsetDropdownRect.bottom, 'bottom ok');
-            // horizontalAlign is right, so a positive offset moves to the right.
-            assert.equal(dropdownRect.right + 10, offsetDropdownRect.right, 'right ok');
-            done();
-          });
-        });
-      });
-
-      suite('RTL', function() {
-        var dropdownRect;
-
-        test('with horizontalAlign=left', function(done) {
-          var parent = fixture('RTLDropdownLeft');
-          dropdown = parent.querySelector('iron-dropdown');
-          runAfterOpen(dropdown, function() {
-            // In RTL, if `horizontalAlign` is "left", that's the same as
-            // being right-aligned in LTR. So the dropdown should be in the top
-            // right corner.
-            dropdownRect = dropdown.getBoundingClientRect();
-            expect(dropdownRect.top).to.be.equal(0);
-            expect(dropdownRect.right).to.be.equal(100);
-            done();
-          });
-        });
-
-        test('with horizontalAlign=right', function(done) {
-          var parent = fixture('RTLDropdownRight');
-          dropdown = parent.querySelector('iron-dropdown');
-          runAfterOpen(dropdown, function() {
-            // In RTL, if `horizontalAlign` is "right", that's the same as
-            // being left-aligned in LTR. So the dropdown should be in the top
-            // left corner.
-            dropdownRect = dropdown.getBoundingClientRect();
-            expect(dropdownRect.top).to.be.equal(0);
-            expect(dropdownRect.left).to.be.equal(0);
-            done();
-          });
-        });
-      });
-
-      suite('sizing target', function() {
-        setup(function() {
-          dropdown = fixture('sizingTarget');
-          content = Polymer.dom(dropdown).querySelector('.dropdown-content');
-        });
-
-        test('sizingTarget is the content element by default', function(done) {
-          runAfterOpen(dropdown, function() {
-            expect(dropdown.sizingTarget).to.be.equal(content);
-            expect(content.style.maxHeight).to.be.not.empty;
-            expect(content.style.maxWidth).to.be.not.empty;
-            done();
-          });
-        });
-
-        test('sizingTarget can be set to a child element', function(done) {
-          var subcontent = Polymer.dom(dropdown).querySelector('.subcontent');
-          dropdown.sizingTarget = subcontent;
-
-          runAfterOpen(dropdown, function() {
-            expect(dropdown.sizingTarget).to.be.equal(subcontent);
-            expect(subcontent.style.maxHeight).to.be.not.empty;
-            expect(subcontent.style.maxWidth).to.be.not.empty;
-            done();
-          });
-        });
-      });
-    });
-  </script>
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/x-scrollable-element.html b/systrace/catapult/third_party/polymer/components/iron-dropdown/test/x-scrollable-element.html
deleted file mode 100644
index 3bdb3cf..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-dropdown/test/x-scrollable-element.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<dom-module id="x-scrollable-element">
-  <template>
-    <style>
-      :host {
-        display: block;
-        height: 100px;
-        border: 1px solid red;
-        overflow: auto;
-      }
-      #ChildOne, #ChildTwo {
-        height: 200px;
-        border: 1px solid blue;
-        overflow: auto;
-      }
-      #GrandchildOne, #GrandchildTwo {
-        height: 300px;
-        border: 1px solid green;
-        overflow: auto;
-      }
-      .scrollContent {
-        height: 400px;
-        background-color: yellow;
-      }
-    </style>
-    <div id="ChildOne">
-      <div id="GrandchildOne">
-        <div class="scrollContent"></div>
-      </div>
-    </div>
-    <div id="ChildTwo">
-      <div id="GrandchildTwo">
-        <div class="scrollContent"></div>
-      </div>
-    </div>
-  </template>
-  <script>
-    Polymer({
-      is: 'x-scrollable-element'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/README.md
deleted file mode 100644
index 8dbc78e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-fit-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-fit-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-fit-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-fit-behavior)_
-
-
-##Polymer.IronFitBehavior
-
-`Polymer.IronFitBehavior` fits an element in another element using `max-height` and `max-width`, and
-optionally centers it in the window or another element.
-
-The element will only be sized and/or positioned if it has not already been sized and/or positioned
-by CSS.
-
-| CSS properties | Action |
-| --- | --- |
-| `position` set | Element is not centered horizontally or vertically |
-| `top` or `bottom` set | Element is not vertically centered |
-| `left` or `right` set | Element is not horizontally centered |
-| `max-height` set | Element respects `max-height` |
-| `max-width` set | Element respects `max-width` |
-
-`Polymer.IronFitBehavior` can position an element into another element using
-`verticalAlign` and `horizontalAlign`. This will override the element's css position.
-
-```html
-  <div class="container">
-    <iron-fit-impl vertical-align="top" horizontal-align="auto">
-      Positioned into the container
-    </iron-fit-impl>
-  </div>
-```
-
-Use `noOverlap` to position the element around another element without overlapping it.
-
-```html
-  <div class="container">
-    <iron-fit-impl no-overlap vertical-align="auto" horizontal-align="auto">
-      Positioned around the container
-    </iron-fit-impl>
-  </div>
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/bower.json
deleted file mode 100644
index 96dd478..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/bower.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "iron-fit-behavior",
-  "version": "1.2.7",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Fits an element inside another element",
-  "private": true,
-  "main": "iron-fit-behavior.html",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "behavior"
-  ],
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-fit-behavior.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/demo/index.html
deleted file mode 100644
index 2c716e0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/demo/index.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <title>iron-fit-behavior demo</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="simple-fit.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    .centered {
-      min-width: 500px;
-    }
-    demo-snippet {
-      --demo-snippet-code: {
-        max-height: 250px;
-      }
-    }
-  </style>
-
-</head>
-
-<body unresolved class="centered">
-  <h3>
-    An element with <code>IronFitBehavior</code> can be centered in
-    <code>fitInto</code> or positioned around a <code>positionTarget</code>
-  </h3>
-  <demo-snippet>
-    <template>
-      <style>
-        .target {
-          cursor: pointer;
-          text-align: center;
-          display: inline-block;
-          box-sizing: border-box;
-          border: 1px solid;
-          width: 100px;
-          padding: 20px 0;
-          margin: 5px;
-        }
-
-        #myFit {
-          z-index: 10;
-          padding: 20px;
-          overflow: auto;
-          min-width: 100px;
-          min-height: 100px;
-        }
-
-        button {
-          background-color: white;
-          border-radius: 5px;
-          border-width: 1px;
-        }
-        
-        button.selected {
-          background-color: #b3e5fc;
-        }
-      </style>
-      <template is="dom-bind">
-        <template is="dom-repeat" items="[[containers]]">
-          <div class="target" on-tap="updatePositionTarget">Target</div>
-        </template>
-        <simple-fit id="myFit" auto-fit-on-attach>
-          <h2>Align</h2>
-          <p>
-            <button on-tap="updateAlign" vertical-align="top">top</button>
-            <button on-tap="updateAlign" vertical-align="bottom">bottom</button>
-            <button on-tap="updateAlign" vertical-align="auto">auto</button>
-            <button on-tap="updateAlign" vertical-align>null</button>
-          </p>
-          <p>
-            <button on-tap="updateAlign" horizontal-align="left">left</button>
-            <button on-tap="updateAlign" horizontal-align="right">right</button>
-            <button on-tap="updateAlign" horizontal-align="auto">auto</button>
-            <button on-tap="updateAlign" horizontal-align>null</button>
-          </p>
-          <button on-tap="toggleNoOverlap">no overlap</button>
-          <button on-tap="toggleDynamicAlign">dynamic align</button>
-        </simple-fit>
-        <script>
-          var defaultTarget = Polymer.dom(myFit).parentNode;
-          var template = document.querySelector('template[is="dom-bind"]');
-
-          template.containers = new Array(30);
-
-          template.updatePositionTarget = function(e) {
-            var target = Polymer.dom(e).rootTarget;
-            target = myFit.positionTarget === target ? defaultTarget : target;
-            myFit.positionTarget.style.backgroundColor = '';
-            target.style.backgroundColor = 'orange';
-            myFit.positionTarget = target;
-            template.refit();
-          };
-
-          template._raf = null;
-          template.refit = function() {
-            template._raf && window.cancelAnimationFrame(template._raf);
-            template._raf = window.requestAnimationFrame(function() {
-              template._raf = null;
-              myFit.refit();
-            });
-          };
-
-          template.updateAlign = function(e) {
-            var target = Polymer.dom(e).rootTarget;
-            if (target.hasAttribute('horizontal-align')) {
-              myFit.horizontalAlign = target.getAttribute('horizontal-align');
-              var children = target.parentNode.querySelectorAll('[horizontal-align]');
-              for (var i = 0; i < children.length; i++) {
-                toggleClass(children[i], 'selected', children[i] === target);
-              }
-            }
-            if (target.hasAttribute('vertical-align')) {
-              myFit.verticalAlign = target.getAttribute('vertical-align');
-              var children = target.parentNode.querySelectorAll('[vertical-align]');
-              for (var i = 0; i < children.length; i++) {
-                toggleClass(children[i], 'selected', children[i] === target);
-              }
-            }
-            template.refit();
-          };
-
-          template.toggleNoOverlap = function(e) {
-            myFit.noOverlap = !myFit.noOverlap;
-            toggleClass(Polymer.dom(e).rootTarget, 'selected', myFit.noOverlap);
-            template.refit();
-          };
-
-          template.toggleDynamicAlign = function(e) {
-            myFit.dynamicAlign = !myFit.dynamicAlign;
-            toggleClass(Polymer.dom(e).rootTarget, 'selected', myFit.dynamicAlign);
-            template.refit();
-          };
-
-          // Listen for resize and scroll on window.
-          window.addEventListener('resize', template.refit);
-          window.addEventListener('scroll', template.refit);
-
-          function toggleClass(element, cssClass, condition) {
-            element.classList[condition ? 'add' : 'remove'](cssClass);
-          }
-        </script>
-      </template>
-    </template>
-  </demo-snippet>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/demo/simple-fit.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/demo/simple-fit.html
deleted file mode 100644
index 2dc83fb..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/demo/simple-fit.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-fit-behavior.html">
-<link rel="import" href="../../paper-styles/color.html">
-
-<dom-module id="simple-fit">
-  <template>
-    <style>
-      :host {
-        background-color: var(--paper-light-blue-500);
-        color: white;
-        text-align: center;
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'simple-fit',
-
-    behaviors: [
-      Polymer.IronFitBehavior
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/index.html
deleted file mode 100644
index 5ffa7d6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-fit-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/iron-fit-behavior.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/iron-fit-behavior.html
deleted file mode 100644
index 825b136..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/iron-fit-behavior.html
+++ /dev/null
@@ -1,611 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-/**
-`Polymer.IronFitBehavior` fits an element in another element using `max-height` and `max-width`, and
-optionally centers it in the window or another element.
-
-The element will only be sized and/or positioned if it has not already been sized and/or positioned
-by CSS.
-
-CSS properties               | Action
------------------------------|-------------------------------------------
-`position` set               | Element is not centered horizontally or vertically
-`top` or `bottom` set        | Element is not vertically centered
-`left` or `right` set        | Element is not horizontally centered
-`max-height` set             | Element respects `max-height`
-`max-width` set              | Element respects `max-width`
-
-`Polymer.IronFitBehavior` can position an element into another element using
-`verticalAlign` and `horizontalAlign`. This will override the element's css position.
-
-      <div class="container">
-        <iron-fit-impl vertical-align="top" horizontal-align="auto">
-          Positioned into the container
-        </iron-fit-impl>
-      </div>
-
-Use `noOverlap` to position the element around another element without overlapping it.
-
-      <div class="container">
-        <iron-fit-impl no-overlap vertical-align="auto" horizontal-align="auto">
-          Positioned around the container
-        </iron-fit-impl>
-      </div>
-
-Use `horizontalOffset, verticalOffset` to offset the element from its `positionTarget`;
-`Polymer.IronFitBehavior` will collapse these in order to keep the element
-within `fitInto` boundaries, while preserving the element's CSS margin values.
-
-      <div class="container">
-        <iron-fit-impl vertical-align="top" vertical-offset="20">
-          With vertical offset
-        </iron-fit-impl>
-      </div>
-
-
-@demo demo/index.html
-@polymerBehavior
-*/
-  Polymer.IronFitBehavior = {
-
-    properties: {
-
-      /**
-       * The element that will receive a `max-height`/`width`. By default it is the same as `this`,
-       * but it can be set to a child element. This is useful, for example, for implementing a
-       * scrolling region inside the element.
-       * @type {!Element}
-       */
-      sizingTarget: {
-        type: Object,
-        value: function() {
-          return this;
-        }
-      },
-
-      /**
-       * The element to fit `this` into.
-       */
-      fitInto: {
-        type: Object,
-        value: window
-      },
-
-      /**
-       * Will position the element around the positionTarget without overlapping it.
-       */
-      noOverlap: {
-        type: Boolean
-      },
-
-      /**
-       * The element that should be used to position the element. If not set, it will
-       * default to the parent node.
-       * @type {!Element}
-       */
-      positionTarget: {
-        type: Element
-      },
-
-      /**
-       * The orientation against which to align the element horizontally
-       * relative to the `positionTarget`. Possible values are "left", "right", "auto".
-       */
-      horizontalAlign: {
-        type: String
-      },
-
-      /**
-       * The orientation against which to align the element vertically
-       * relative to the `positionTarget`. Possible values are "top", "bottom", "auto".
-       */
-      verticalAlign: {
-        type: String
-      },
-
-      /**
-       * If true, it will use `horizontalAlign` and `verticalAlign` values as preferred alignment
-       * and if there's not enough space, it will pick the values which minimize the cropping.
-       */
-      dynamicAlign: {
-        type: Boolean
-      },
-
-      /**
-       * A pixel value that will be added to the position calculated for the
-       * given `horizontalAlign`, in the direction of alignment. You can think
-       * of it as increasing or decreasing the distance to the side of the
-       * screen given by `horizontalAlign`.
-       *
-       * If `horizontalAlign` is "left", this offset will increase or decrease
-       * the distance to the left side of the screen: a negative offset will
-       * move the dropdown to the left; a positive one, to the right.
-       *
-       * Conversely if `horizontalAlign` is "right", this offset will increase
-       * or decrease the distance to the right side of the screen: a negative
-       * offset will move the dropdown to the right; a positive one, to the left.
-       */
-      horizontalOffset: {
-        type: Number,
-        value: 0,
-        notify: true
-      },
-
-      /**
-       * A pixel value that will be added to the position calculated for the
-       * given `verticalAlign`, in the direction of alignment. You can think
-       * of it as increasing or decreasing the distance to the side of the
-       * screen given by `verticalAlign`.
-       *
-       * If `verticalAlign` is "top", this offset will increase or decrease
-       * the distance to the top side of the screen: a negative offset will
-       * move the dropdown upwards; a positive one, downwards.
-       *
-       * Conversely if `verticalAlign` is "bottom", this offset will increase
-       * or decrease the distance to the bottom side of the screen: a negative
-       * offset will move the dropdown downwards; a positive one, upwards.
-       */
-      verticalOffset: {
-        type: Number,
-        value: 0,
-        notify: true
-      },
-
-      /**
-       * Set to true to auto-fit on attach.
-       */
-      autoFitOnAttach: {
-        type: Boolean,
-        value: false
-      },
-
-      /** @type {?Object} */
-      _fitInfo: {
-        type: Object
-      }
-    },
-
-    get _fitWidth() {
-      var fitWidth;
-      if (this.fitInto === window) {
-        fitWidth = this.fitInto.innerWidth;
-      } else {
-        fitWidth = this.fitInto.getBoundingClientRect().width;
-      }
-      return fitWidth;
-    },
-
-    get _fitHeight() {
-      var fitHeight;
-      if (this.fitInto === window) {
-        fitHeight = this.fitInto.innerHeight;
-      } else {
-        fitHeight = this.fitInto.getBoundingClientRect().height;
-      }
-      return fitHeight;
-    },
-
-    get _fitLeft() {
-      var fitLeft;
-      if (this.fitInto === window) {
-        fitLeft = 0;
-      } else {
-        fitLeft = this.fitInto.getBoundingClientRect().left;
-      }
-      return fitLeft;
-    },
-
-    get _fitTop() {
-      var fitTop;
-      if (this.fitInto === window) {
-        fitTop = 0;
-      } else {
-        fitTop = this.fitInto.getBoundingClientRect().top;
-      }
-      return fitTop;
-    },
-
-    /**
-     * The element that should be used to position the element,
-     * if no position target is configured.
-     */
-    get _defaultPositionTarget() {
-      var parent = Polymer.dom(this).parentNode;
-
-      if (parent && parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
-        parent = parent.host;
-      }
-
-      return parent;
-    },
-
-    /**
-     * The horizontal align value, accounting for the RTL/LTR text direction.
-     */
-    get _localeHorizontalAlign() {
-      if (this._isRTL) {
-        // In RTL, "left" becomes "right".
-        if (this.horizontalAlign === 'right') {
-          return 'left';
-        }
-        if (this.horizontalAlign === 'left') {
-          return 'right';
-        }
-      }
-      return this.horizontalAlign;
-    },
-
-    attached: function() {
-      // Memoize this to avoid expensive calculations & relayouts.
-      // Make sure we do it only once
-      if (typeof this._isRTL === 'undefined') {
-        this._isRTL = window.getComputedStyle(this).direction == 'rtl';
-      }
-          
-      this.positionTarget = this.positionTarget || this._defaultPositionTarget;
-      if (this.autoFitOnAttach) {
-        if (window.getComputedStyle(this).display === 'none') {
-          setTimeout(function() {
-            this.fit();
-          }.bind(this));
-        } else {
-          this.fit();
-        }
-      }
-    },
-
-    /**
-     * Positions and fits the element into the `fitInto` element.
-     */
-    fit: function() {
-      this.position();
-      this.constrain();
-      this.center();
-    },
-
-    /**
-     * Memoize information needed to position and size the target element.
-     * @suppress {deprecated}
-     */
-    _discoverInfo: function() {
-      if (this._fitInfo) {
-        return;
-      }
-      var target = window.getComputedStyle(this);
-      var sizer = window.getComputedStyle(this.sizingTarget);
-
-      this._fitInfo = {
-        inlineStyle: {
-          top: this.style.top || '',
-          left: this.style.left || '',
-          position: this.style.position || ''
-        },
-        sizerInlineStyle: {
-          maxWidth: this.sizingTarget.style.maxWidth || '',
-          maxHeight: this.sizingTarget.style.maxHeight || '',
-          boxSizing: this.sizingTarget.style.boxSizing || ''
-        },
-        positionedBy: {
-          vertically: target.top !== 'auto' ? 'top' : (target.bottom !== 'auto' ?
-            'bottom' : null),
-          horizontally: target.left !== 'auto' ? 'left' : (target.right !== 'auto' ?
-            'right' : null)
-        },
-        sizedBy: {
-          height: sizer.maxHeight !== 'none',
-          width: sizer.maxWidth !== 'none',
-          minWidth: parseInt(sizer.minWidth, 10) || 0,
-          minHeight: parseInt(sizer.minHeight, 10) || 0
-        },
-        margin: {
-          top: parseInt(target.marginTop, 10) || 0,
-          right: parseInt(target.marginRight, 10) || 0,
-          bottom: parseInt(target.marginBottom, 10) || 0,
-          left: parseInt(target.marginLeft, 10) || 0
-        }
-      };
-    },
-
-    /**
-     * Resets the target element's position and size constraints, and clear
-     * the memoized data.
-     */
-    resetFit: function() {
-      var info = this._fitInfo || {};
-      for (var property in info.sizerInlineStyle) {
-        this.sizingTarget.style[property] = info.sizerInlineStyle[property];
-      }
-      for (var property in info.inlineStyle) {
-        this.style[property] = info.inlineStyle[property];
-      }
-
-      this._fitInfo = null;
-    },
-
-    /**
-     * Equivalent to calling `resetFit()` and `fit()`. Useful to call this after
-     * the element or the `fitInto` element has been resized, or if any of the
-     * positioning properties (e.g. `horizontalAlign, verticalAlign`) is updated.
-     * It preserves the scroll position of the sizingTarget.
-     */
-    refit: function() {
-      var scrollLeft = this.sizingTarget.scrollLeft;
-      var scrollTop = this.sizingTarget.scrollTop;
-      this.resetFit();
-      this.fit();
-      this.sizingTarget.scrollLeft = scrollLeft;
-      this.sizingTarget.scrollTop = scrollTop;
-    },
-
-    /**
-     * Positions the element according to `horizontalAlign, verticalAlign`.
-     */
-    position: function() {
-      if (!this.horizontalAlign && !this.verticalAlign) {
-        // needs to be centered, and it is done after constrain.
-        return;
-      }
-      this._discoverInfo();
-
-      this.style.position = 'fixed';
-      // Need border-box for margin/padding.
-      this.sizingTarget.style.boxSizing = 'border-box';
-      // Set to 0, 0 in order to discover any offset caused by parent stacking contexts.
-      this.style.left = '0px';
-      this.style.top = '0px';
-
-      var rect = this.getBoundingClientRect();
-      var positionRect = this.__getNormalizedRect(this.positionTarget);
-      var fitRect = this.__getNormalizedRect(this.fitInto);
-
-      var margin = this._fitInfo.margin;
-
-      // Consider the margin as part of the size for position calculations.
-      var size = {
-        width: rect.width + margin.left + margin.right,
-        height: rect.height + margin.top + margin.bottom
-      };
-
-      var position = this.__getPosition(this._localeHorizontalAlign, this.verticalAlign, size, positionRect, fitRect);
-
-      var left = position.left + margin.left;
-      var top = position.top + margin.top;
-
-      // We first limit right/bottom within fitInto respecting the margin,
-      // then use those values to limit top/left.
-      var right = Math.min(fitRect.right - margin.right, left + rect.width);
-      var bottom = Math.min(fitRect.bottom - margin.bottom, top + rect.height);
-
-      // Keep left/top within fitInto respecting the margin.
-      left = Math.max(fitRect.left + margin.left,
-        Math.min(left, right - this._fitInfo.sizedBy.minWidth));
-      top = Math.max(fitRect.top + margin.top,
-        Math.min(top, bottom - this._fitInfo.sizedBy.minHeight));
-
-      // Use right/bottom to set maxWidth/maxHeight, and respect minWidth/minHeight.
-      this.sizingTarget.style.maxWidth = Math.max(right - left, this._fitInfo.sizedBy.minWidth) + 'px';
-      this.sizingTarget.style.maxHeight = Math.max(bottom - top, this._fitInfo.sizedBy.minHeight) + 'px';
-
-      // Remove the offset caused by any stacking context.
-      this.style.left = (left - rect.left) + 'px';
-      this.style.top = (top - rect.top) + 'px';
-    },
-
-    /**
-     * Constrains the size of the element to `fitInto` by setting `max-height`
-     * and/or `max-width`.
-     */
-    constrain: function() {
-      if (this.horizontalAlign || this.verticalAlign) {
-        return;
-      }
-      this._discoverInfo();
-
-      var info = this._fitInfo;
-      // position at (0px, 0px) if not already positioned, so we can measure the natural size.
-      if (!info.positionedBy.vertically) {
-        this.style.position = 'fixed';
-        this.style.top = '0px';
-      }
-      if (!info.positionedBy.horizontally) {
-        this.style.position = 'fixed';
-        this.style.left = '0px';
-      }
-
-      // need border-box for margin/padding
-      this.sizingTarget.style.boxSizing = 'border-box';
-      // constrain the width and height if not already set
-      var rect = this.getBoundingClientRect();
-      if (!info.sizedBy.height) {
-        this.__sizeDimension(rect, info.positionedBy.vertically, 'top', 'bottom', 'Height');
-      }
-      if (!info.sizedBy.width) {
-        this.__sizeDimension(rect, info.positionedBy.horizontally, 'left', 'right', 'Width');
-      }
-    },
-
-    /**
-     * @protected
-     * @deprecated
-     */
-    _sizeDimension: function(rect, positionedBy, start, end, extent) {
-      this.__sizeDimension(rect, positionedBy, start, end, extent);
-    },
-
-    /**
-     * @private
-     */
-    __sizeDimension: function(rect, positionedBy, start, end, extent) {
-      var info = this._fitInfo;
-      var fitRect = this.__getNormalizedRect(this.fitInto);
-      var max = extent === 'Width' ? fitRect.width : fitRect.height;
-      var flip = (positionedBy === end);
-      var offset = flip ? max - rect[end] : rect[start];
-      var margin = info.margin[flip ? start : end];
-      var offsetExtent = 'offset' + extent;
-      var sizingOffset = this[offsetExtent] - this.sizingTarget[offsetExtent];
-      this.sizingTarget.style['max' + extent] = (max - margin - offset - sizingOffset) + 'px';
-    },
-
-    /**
-     * Centers horizontally and vertically if not already positioned. This also sets
-     * `position:fixed`.
-     */
-    center: function() {
-      if (this.horizontalAlign || this.verticalAlign) {
-        return;
-      }
-      this._discoverInfo();
-
-      var positionedBy = this._fitInfo.positionedBy;
-      if (positionedBy.vertically && positionedBy.horizontally) {
-        // Already positioned.
-        return;
-      }
-      // Need position:fixed to center
-      this.style.position = 'fixed';
-      // Take into account the offset caused by parents that create stacking
-      // contexts (e.g. with transform: translate3d). Translate to 0,0 and
-      // measure the bounding rect.
-      if (!positionedBy.vertically) {
-        this.style.top = '0px';
-      }
-      if (!positionedBy.horizontally) {
-        this.style.left = '0px';
-      }
-      // It will take in consideration margins and transforms
-      var rect = this.getBoundingClientRect();
-      var fitRect = this.__getNormalizedRect(this.fitInto);
-      if (!positionedBy.vertically) {
-        var top = fitRect.top - rect.top + (fitRect.height - rect.height) / 2;
-        this.style.top = top + 'px';
-      }
-      if (!positionedBy.horizontally) {
-        var left = fitRect.left - rect.left + (fitRect.width - rect.width) / 2;
-        this.style.left = left + 'px';
-      }
-    },
-
-    __getNormalizedRect: function(target) {
-      if (target === document.documentElement || target === window) {
-        return {
-          top: 0,
-          left: 0,
-          width: window.innerWidth,
-          height: window.innerHeight,
-          right: window.innerWidth,
-          bottom: window.innerHeight
-        };
-      }
-      return target.getBoundingClientRect();
-    },
-
-    __getCroppedArea: function(position, size, fitRect) {
-      var verticalCrop = Math.min(0, position.top) + Math.min(0, fitRect.bottom - (position.top + size.height));
-      var horizontalCrop = Math.min(0, position.left) + Math.min(0, fitRect.right - (position.left + size.width));
-      return Math.abs(verticalCrop) * size.width + Math.abs(horizontalCrop) * size.height;
-    },
-
-
-    __getPosition: function(hAlign, vAlign, size, positionRect, fitRect) {
-      // All the possible configurations.
-      // Ordered as top-left, top-right, bottom-left, bottom-right.
-      var positions = [{
-        verticalAlign: 'top',
-        horizontalAlign: 'left',
-        top: positionRect.top + this.verticalOffset,
-        left: positionRect.left + this.horizontalOffset
-      }, {
-        verticalAlign: 'top',
-        horizontalAlign: 'right',
-        top: positionRect.top + this.verticalOffset,
-        left: positionRect.right - size.width - this.horizontalOffset
-      }, {
-        verticalAlign: 'bottom',
-        horizontalAlign: 'left',
-        top: positionRect.bottom - size.height - this.verticalOffset,
-        left: positionRect.left + this.horizontalOffset
-      }, {
-        verticalAlign: 'bottom',
-        horizontalAlign: 'right',
-        top: positionRect.bottom - size.height - this.verticalOffset,
-        left: positionRect.right - size.width - this.horizontalOffset
-      }];
-
-      if (this.noOverlap) {
-        // Duplicate.
-        for (var i = 0, l = positions.length; i < l; i++) {
-          var copy = {};
-          for (var key in positions[i]) {
-            copy[key] = positions[i][key];
-          }
-          positions.push(copy);
-        }
-        // Horizontal overlap only.
-        positions[0].top = positions[1].top += positionRect.height;
-        positions[2].top = positions[3].top -= positionRect.height;
-        // Vertical overlap only.
-        positions[4].left = positions[6].left += positionRect.width;
-        positions[5].left = positions[7].left -= positionRect.width;
-      }
-
-      // Consider auto as null for coding convenience.
-      vAlign = vAlign === 'auto' ? null : vAlign;
-      hAlign = hAlign === 'auto' ? null : hAlign;
-
-      var position;
-      for (var i = 0; i < positions.length; i++) {
-        var pos = positions[i];
-
-        // If both vAlign and hAlign are defined, return exact match.
-        // For dynamicAlign and noOverlap we'll have more than one candidate, so
-        // we'll have to check the croppedArea to make the best choice.
-        if (!this.dynamicAlign && !this.noOverlap &&
-            pos.verticalAlign === vAlign && pos.horizontalAlign === hAlign) {
-          position = pos;
-          break;
-        }
-
-        // Align is ok if alignment preferences are respected. If no preferences,
-        // it is considered ok.
-        var alignOk = (!vAlign || pos.verticalAlign === vAlign) &&
-                      (!hAlign || pos.horizontalAlign === hAlign);
-
-        // Filter out elements that don't match the alignment (if defined).
-        // With dynamicAlign, we need to consider all the positions to find the
-        // one that minimizes the cropped area.
-        if (!this.dynamicAlign && !alignOk) {
-          continue;
-        }
-
-        position = position || pos;
-        pos.croppedArea = this.__getCroppedArea(pos, size, fitRect);
-        var diff = pos.croppedArea - position.croppedArea;
-        // Check which crops less. If it crops equally, check if align is ok.
-        if (diff < 0 || (diff === 0 && alignOk)) {
-          position = pos;
-        }
-        // If not cropped and respects the align requirements, keep it.
-        // This allows to prefer positions overlapping horizontally over the
-        // ones overlapping vertically.
-        if (position.croppedArea === 0 && alignOk) {
-          break;
-        }
-      }
-
-      return position;
-    }
-
-  };
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/index.html
deleted file mode 100644
index fd047ea..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>iron-fit-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'iron-fit-behavior.html',
-        'iron-fit-behavior.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/iron-fit-behavior.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/iron-fit-behavior.html
deleted file mode 100644
index 7dcc15d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/iron-fit-behavior.html
+++ /dev/null
@@ -1,1029 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>iron-fit-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="test-fit.html">
-
-    <style>
-      body {
-        margin: 0;
-        padding: 0;
-      }
-
-      .absolute {
-        position: absolute;
-        top: 0;
-        left: 0;
-      }
-
-      .scrolling {
-        overflow: auto;
-      }
-
-      .sized-x {
-        width: 100px;
-      }
-
-      .sized-y {
-        height: 100px;
-      }
-
-      .positioned-left {
-        position: absolute;
-        left: 100px;
-      }
-
-      .positioned-right {
-        position: absolute;
-        right: 100px;
-      }
-
-      .positioned-top {
-        position: absolute;
-        top: 100px;
-      }
-
-      .positioned-bottom {
-        position: absolute;
-        bottom: 100px;
-      }
-
-      .with-max-width {
-        max-width: 500px;
-      }
-
-      .with-max-height {
-        max-height: 500px;
-      }
-
-      .with-margin {
-        margin: 20px;
-      }
-
-      .constrain {
-        position: fixed;
-        top: 20px;
-        left: 20px;
-        width: 150px;
-        height: 150px;
-        border: 1px solid black;
-        box-sizing: border-box;
-      }
-
-      .sizer {
-        width: 9999px;
-        height: 9999px;
-      }
-
-    </style>
-
-  </head>
-  <body>
-
-    <div class="constrain"></div>
-
-    <test-fixture id="basic">
-      <template>
-        <test-fit>
-          Basic
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="absolute">
-      <template>
-        <test-fit auto-fit-on-attach class="absolute">
-          Absolutely positioned
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="sized-xy">
-      <template>
-        <test-fit auto-fit-on-attach class="sized-x sized-y">
-          Sized (x/y), auto center/center
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="sized-x">
-      <template>
-        <test-fit auto-fit-on-attach class="sized-x">
-          Sized (x), auto center/center
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="positioned-xy">
-      <template>
-        <test-fit auto-fit-on-attach class="sized-x positioned-left positioned-top">
-          Sized (x/y), positioned/positioned
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="inline-positioned-xy">
-      <template>
-        <test-fit auto-fit-on-attach class="sized-x sized-y" style="position:absolute;left:100px;top:100px;">
-          Sized (x/y), positioned/positioned
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="sectioned">
-      <template>
-        <test-fit auto-fit-on-attach class="sized-x">
-          <div>
-            Sized (x), auto center/center with scrolling section
-          </div>
-          <div class="internal"></div>
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="constrain-target">
-      <template>
-        <div class="constrain">
-          <test-fit auto-fit-on-attach class="el sized-x sized-y">
-            <div>
-              Auto center/center to parent element
-            </div>
-          </test-fit>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="offscreen-container">
-      <template>
-        <div style="position: fixed; top: -1px; left: 0;">
-          <test-fit auto-fit-on-attach class="el sized-x">
-            <div>
-              Sized (x), auto center/center, container is offscreen
-            </div>
-          </test-fit>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="scrollable">
-      <template>
-        <test-fit auto-fit-on-attach class="scrolling">
-          scrollable
-          <div class="sizer"></div>
-        </test-fit>
-      </template>
-    </test-fixture>
-
-    <template id="ipsum">
-      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-    </template>
-
-    <script>
-
-      function makeScrolling(el) {
-        el.classList.add('scrolling');
-        var template = document.getElementById('ipsum');
-        for (var i = 0; i < 20; i++) {
-          el.appendChild(template.content.cloneNode(true));
-        }
-      }
-
-      function intersects(r1, r2) {
-        return !(r2.left >= r1.right || r2.right <= r1.left || r2.top >= r1.bottom || r2.bottom <= r1.top);
-      }
-
-      suite('basic', function() {
-
-        var el;
-        setup(function() {
-          el = fixture('basic');
-        });
-
-        test('position() works without autoFitOnAttach', function() {
-          el.verticalAlign = 'top';
-          el.horizontalAlign = 'left';
-          el.position();
-          var rect = el.getBoundingClientRect();
-          assert.equal(rect.top, 0, 'top ok');
-          assert.equal(rect.left, 0, 'left ok');
-        });
-
-        test('constrain() works without autoFitOnAttach', function() {
-          el.constrain();
-          var style = getComputedStyle(el);
-          assert.equal(style.maxWidth, window.innerWidth + 'px', 'maxWidth ok');
-          assert.equal(style.maxHeight, window.innerHeight + 'px', 'maxHeight ok');
-        });
-
-        test('center() works without autoFitOnAttach', function() {
-          el.center();
-          var rect = el.getBoundingClientRect();
-          assert.closeTo(rect.left - (window.innerWidth - rect.right), 0, 5, 'centered horizontally');
-          assert.closeTo(rect.top - (window.innerHeight - rect.bottom), 0, 5, 'centered vertically');
-        });
-
-      });
-
-      suite('manual positioning', function() {
-
-        test('css positioned element is not re-positioned', function() {
-          var el = fixture('positioned-xy');
-          var rect = el.getBoundingClientRect();
-          assert.equal(rect.top, 100, 'top is unset');
-          assert.equal(rect.left, 100, 'left is unset');
-
-        });
-
-        test('inline positioned element is not re-positioned', function() {
-          var el = fixture('inline-positioned-xy');
-          var rect = el.getBoundingClientRect();
-          // need to measure document.body here because mocha sets a min-width on html,body, and
-          // the element is positioned wrt to that by css
-          var bodyRect = document.body.getBoundingClientRect();
-          assert.equal(rect.top, 100, 'top is unset');
-          assert.equal(rect.left, 100, 'left is unset');
-
-          el.refit();
-
-          rect = el.getBoundingClientRect();
-          assert.equal(rect.top, 100, 'top is unset after refit');
-          assert.equal(rect.left, 100, 'left is unset after refit');
-
-        });
-
-        test('position property is preserved after', function() {
-          var el = fixture('absolute');
-          assert.equal(getComputedStyle(el).position, 'absolute', 'position:absolute is preserved');
-        });
-      });
-
-      suite('fit to window', function() {
-
-        test('sized element is centered in viewport', function() {
-          var el = fixture('sized-xy');
-          var rect = el.getBoundingClientRect();
-          assert.closeTo(rect.left - (window.innerWidth - rect.right), 0, 5, 'centered horizontally');
-          assert.closeTo(rect.top - (window.innerHeight - rect.bottom), 0, 5, 'centered vertically');
-        });
-
-        test('sized element with margin is centered in viewport', function() {
-          var el = fixture('sized-xy');
-          el.classList.add('with-margin');
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.closeTo(rect.left - (window.innerWidth - rect.right), 0, 5, 'centered horizontally');
-          assert.closeTo(rect.top - (window.innerHeight - rect.bottom), 0, 5, 'centered vertically');
-        });
-
-        test('sized element with transformed parent is centered in viewport', function() {
-          var constrain = fixture('constrain-target');
-          var el = Polymer.dom(constrain).querySelector('.el');
-          var rectBefore = el.getBoundingClientRect();
-          constrain.style.transform = 'translate3d(5px, 5px, 0)';
-          el.center();
-          var rectAfter = el.getBoundingClientRect();
-          assert.equal(rectBefore.top, rectAfter.top, 'top ok');
-          assert.equal(rectBefore.bottom, rectAfter.bottom, 'bottom ok');
-          assert.equal(rectBefore.left, rectAfter.left, 'left ok');
-          assert.equal(rectBefore.right, rectAfter.right, 'right ok');
-        });
-
-        test('scrolling element is centered in viewport', function() {
-          var el = fixture('sized-x');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.closeTo(rect.left - (window.innerWidth - rect.right), 0, 5, 'centered horizontally');
-          assert.closeTo(rect.top - (window.innerHeight - rect.bottom), 0, 5, 'centered vertically');
-        });
-
-        test('scrolling element is constrained to viewport height', function() {
-          var el = fixture('sized-x');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight, 'height is less than or equal to viewport height');
-        });
-
-        test('scrolling element with offscreen container is constrained to viewport height', function() {
-          var container = fixture('offscreen-container');
-          var el = Polymer.dom(container).querySelector('.el')
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight, 'height is less than or equal to viewport height');
-        });
-
-        test('scrolling element with max-height is centered in viewport', function() {
-          var el = fixture('sized-x');
-          el.classList.add('with-max-height');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.closeTo(rect.left - (window.innerWidth - rect.right), 0, 5, 'centered horizontally');
-          assert.closeTo(rect.top - (window.innerHeight - rect.bottom), 0, 5, 'centered vertically');
-        });
-
-        test('scrolling element with max-height respects max-height', function() {
-          var el = fixture('sized-x');
-          el.classList.add('with-max-height');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= 500, 'height is less than or equal to max-height');
-        });
-
-        test('css positioned, scrolling element is constrained to viewport height (top,left)', function() {
-          var el = fixture('positioned-xy');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight - 100, 'height is less than or equal to viewport height');
-        });
-
-        test('css positioned, scrolling element is constrained to viewport height (bottom, right)', function() {
-          var el = fixture('sized-x');
-          el.classList.add('positioned-bottom');
-          el.classList.add('positioned-right');
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight - 100, 'height is less than or equal to viewport height');
-        });
-
-        test('sized, scrolling element with margin is centered in viewport', function() {
-          var el = fixture('sized-x');
-          el.classList.add('with-margin');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.closeTo(rect.left - (window.innerWidth - rect.right), 0, 5, 'centered horizontally');
-          assert.closeTo(rect.top - (window.innerHeight - rect.bottom), 0, 5, 'centered vertically');
-        });
-
-        test('sized, scrolling element is constrained to viewport height', function() {
-          var el = fixture('sized-x');
-          el.classList.add('with-margin');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight - 20 * 2, 'height is less than or equal to viewport height');
-        });
-
-        test('css positioned, scrolling element with margin is constrained to viewport height (top, left)', function() {
-          var el = fixture('positioned-xy');
-          el.classList.add('with-margin');
-          makeScrolling(el);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight - 100 - 20 * 2, 'height is less than or equal to viewport height');
-        });
-
-        test('css positioned, scrolling element with margin is constrained to viewport height (bottom, right)', function() {
-          var el = fixture('sized-x');
-          el.classList.add('positioned-bottom');
-          el.classList.add('positioned-right');
-          el.classList.add('with-margin')
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight - 100 - 20 * 2, 'height is less than or equal to viewport height');
-        });
-
-        test('scrolling sizingTarget is constrained to viewport height', function() {
-          el = fixture('sectioned');
-          var internal = Polymer.dom(el).querySelector('.internal');
-          el.sizingTarget = internal;
-          makeScrolling(internal);
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          assert.isTrue(rect.height <= window.innerHeight, 'height is less than or equal to viewport height');
-        });
-
-        test('scrolling sizingTarget preserves scrolling position', function() {
-          el = fixture('scrollable');
-          el.scrollTop = 20;
-          el.scrollLeft = 20;
-          el.refit();
-          assert.equal(el.scrollTop, 20, 'scrollTop ok');
-          assert.equal(el.scrollLeft, 20, 'scrollLeft ok');
-        });
-
-      });
-
-      suite('fit to element', function() {
-
-        test('element fits in another element', function() {
-          var constrain = fixture('constrain-target');
-          var el = Polymer.dom(constrain).querySelector('.el')
-          makeScrolling(el);
-          el.fitInto = constrain;
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          var crect = constrain.getBoundingClientRect();
-          assert.isTrue(rect.height <= crect.height, 'width is less than or equal to fitInto width');
-          assert.isTrue(rect.height <= crect.height, 'height is less than or equal to fitInto height');
-        });
-
-        test('element centers in another element', function() {
-          var constrain = fixture('constrain-target');
-          var el = Polymer.dom(constrain).querySelector('.el');
-          makeScrolling(el);
-          el.fitInto = constrain;
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          var crect = constrain.getBoundingClientRect();
-          assert.closeTo(rect.left - crect.left - (crect.right - rect.right), 0, 5, 'centered horizontally in fitInto');
-          assert.closeTo(rect.top - crect.top - (crect.bottom - rect.bottom), 0, 5, 'centered vertically in fitInto');
-        });
-
-        test('element with max-width centers in another element', function() {
-          var constrain = document.querySelector('.constrain');
-          var el = fixture('sized-xy');
-          el.classList.add('with-max-width');
-          el.fitInto = constrain;
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          var crect = constrain.getBoundingClientRect();
-          assert.closeTo(rect.left - crect.left - (crect.right - rect.right), 0, 5, 'centered horizontally in fitInto');
-          assert.closeTo(rect.top - crect.top - (crect.bottom - rect.bottom), 0, 5, 'centered vertically in fitInto');
-        });
-
-        test('positioned element fits in another element', function() {
-          var constrain = document.querySelector('.constrain');
-          // element's positionTarget is `body`, and fitInto is `constrain`.
-          var el = fixture('sized-xy');
-          el.verticalAlign = 'top';
-          el.horizontalAlign = 'left';
-          el.fitInto = constrain;
-          el.refit();
-          var rect = el.getBoundingClientRect();
-          var crect = constrain.getBoundingClientRect();
-          assert.equal(rect.top, crect.top, 'top ok');
-          assert.equal(rect.left, crect.left, 'left ok');
-        });
-
-      });
-
-      suite('horizontal/vertical align', function() {
-        var parent, parentRect;
-        var el, elRect;
-        var fitRect = {
-          left: 0,
-          top: 0,
-          right: window.innerWidth,
-          bottom: window.innerHeight,
-          width: window.innerWidth,
-          height: window.innerHeight
-        };
-
-        setup(function() {
-          parent = fixture('constrain-target');
-          parentRect = parent.getBoundingClientRect();
-          el = Polymer.dom(parent).querySelector('.el');
-          elRect = el.getBoundingClientRect();
-        });
-
-        test('intersects works', function() {
-          var base = {top: 0, bottom: 1, left:0, right: 1};
-          assert.isTrue(intersects(base, base), 'intersects itself');
-          assert.isFalse(intersects(base, {top:1, bottom: 2, left: 0, right: 1}), 'no intersect on edge');
-          assert.isFalse(intersects(base, {top:-2, bottom: -1, left: 0, right: 1}), 'no intersect on edge (negative values)');
-          assert.isFalse(intersects(base, {top:2, bottom: 3, left: 0, right: 1}), 'no intersect');
-        });
-
-        suite('when verticalAlign is top', function() {
-          test('element is aligned to the positionTarget top', function() {
-            el.verticalAlign = 'top';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, parentRect.top, 'top ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element is aligned to the positionTarget top without overlapping it', function() {
-            // Allow enough space on the parent's bottom & right.
-            parent.style.width = '10px';
-            parent.style.height = '10px';
-            parentRect = parent.getBoundingClientRect();
-            el.verticalAlign = 'top';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element margin is considered as offset', function() {
-            el.verticalAlign = 'top';
-            el.style.marginTop = '10px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, parentRect.top + 10, 'top ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-
-            el.style.marginTop = '-10px';
-            el.refit();
-            rect = el.getBoundingClientRect();
-            assert.equal(rect.top, parentRect.top - 10, 'top ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('verticalOffset is applied', function() {
-            el.verticalAlign = 'top';
-            el.verticalOffset = 10;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, parentRect.top + 10, 'top ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element is kept in viewport', function() {
-            el.verticalAlign = 'top';
-            // Make it go out of screen
-            el.verticalOffset = -1000;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, 0, 'top in viewport');
-            assert.isTrue(rect.height < elRect.height, 'reduced size');
-          });
-
-          test('negative verticalOffset does not crop element', function() {
-            // Push to the bottom of the screen.
-            parent.style.top = (window.innerHeight - 50) +'px';
-            el.verticalAlign = 'top';
-            el.verticalOffset = -10;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, window.innerHeight - 60, 'top ok');
-            assert.equal(rect.bottom, window.innerHeight, 'bottom ok');
-          });
-
-          test('max-height is updated', function() {
-            parent.style.top = '-10px';
-            el.verticalAlign = 'top';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, 0, 'top ok');
-            assert.isBelow(rect.height, elRect.height, 'height ok');
-          });
-
-          test('min-height is preserved: element is displayed even if partially', function() {
-            parent.style.top = '-10px';
-            el.verticalAlign = 'top';
-            el.style.minHeight = elRect.height + 'px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, 0, 'top ok');
-            assert.equal(rect.height, elRect.height, 'min-height ok');
-            assert.isTrue(intersects(rect, fitRect), 'partially visible');
-          });
-
-          test('dynamicAlign will prefer bottom align if it minimizes the cropping', function() {
-            parent.style.top = '-10px';
-            parentRect = parent.getBoundingClientRect();
-            el.verticalAlign = 'top';
-            el.dynamicAlign = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, parentRect.bottom, 'bottom ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-        });
-
-        suite('when verticalAlign is bottom', function() {
-          test('element is aligned to the positionTarget bottom', function() {
-            el.verticalAlign = 'bottom';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, parentRect.bottom, 'bottom ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element is aligned to the positionTarget bottom without overlapping it', function() {
-            el.verticalAlign = 'bottom';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element margin is considered as offset', function() {
-            el.verticalAlign = 'bottom';
-            el.style.marginBottom = '10px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, parentRect.bottom - 10, 'bottom ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-
-            el.style.marginBottom = '-10px';
-            el.refit();
-            rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, parentRect.bottom + 10, 'bottom ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('verticalOffset is applied', function() {
-            el.verticalAlign = 'bottom';
-            el.verticalOffset = 10;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, parentRect.bottom - 10, 'bottom ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element is kept in viewport', function() {
-            el.verticalAlign = 'bottom';
-            // Make it go out of screen
-            el.verticalOffset = 1000;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, 0, 'top in viewport');
-            assert.isTrue(rect.height < elRect.height, 'reduced size');
-          });
-
-          test('element max-height is updated', function() {
-            parent.style.top = (100 - parentRect.height) + 'px';
-            el.verticalAlign = 'bottom';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, 100, 'bottom ok');
-            assert.equal(rect.height, 100, 'height ok');
-          });
-
-          test('min-height is preserved: element is displayed even if partially', function() {
-            parent.style.top = (elRect.height - 10 - parentRect.height) + 'px';
-            el.verticalAlign = 'bottom';
-            el.style.minHeight = elRect.height + 'px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, 0, 'top ok');
-            assert.equal(rect.height, elRect.height, 'min-height ok');
-            assert.isTrue(intersects(rect, fitRect), 'partially visible');
-          });
-
-          test('dynamicAlign will prefer top align if it minimizes the cropping', function() {
-            parent.style.top = (window.innerHeight - elRect.height) + 'px';
-            parentRect = parent.getBoundingClientRect();
-            el.verticalAlign = 'bottom';
-            el.dynamicAlign = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, parentRect.top, 'top ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-        });
-
-        suite('when verticalAlign is auto', function() {
-          test('element is aligned to the positionTarget top', function() {
-            el.verticalAlign = 'auto';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.top, parentRect.top, 'auto aligned to top');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('element is aligned to the positionTarget top without overlapping it', function() {
-            // Allow enough space on the parent's bottom & right.
-            parent.style.width = '10px';
-            parent.style.height = '10px';
-            parentRect = parent.getBoundingClientRect();
-            el.verticalAlign = 'auto';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.height, elRect.height, 'no cropping');
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-          });
-
-          test('bottom is preferred to top if it diminishes the cropped area', function() {
-            // This would cause a cropping of the element, so it should automatically
-            // align to the bottom to avoid it.
-            parent.style.top = '-10px';
-            parentRect = parent.getBoundingClientRect();
-            el.verticalAlign = 'auto';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.bottom, parentRect.bottom, 'auto aligned to bottom');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-          test('bottom is preferred to top if it diminishes the cropped area, without overlapping positionTarget', function() {
-            // This would cause a cropping of the element, so it should automatically
-            // align to the bottom to avoid it.
-            parent.style.top = '-10px';
-            parentRect = parent.getBoundingClientRect();
-            el.verticalAlign = 'auto';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.height, elRect.height, 'no cropping');
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-          });
-        });
-
-        suite('when horizontalAlign is left', function() {
-          test('element is aligned to the positionTarget left', function() {
-            el.horizontalAlign = 'left';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left, 'left ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element is aligned to the positionTarget left without overlapping it', function() {
-            // Make space at the parent's right.
-            parent.style.width = '10px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'left';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element margin is considered as offset', function() {
-            el.horizontalAlign = 'left';
-            el.style.marginLeft = '10px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left + 10, 'left ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-
-            el.style.marginLeft = '-10px';
-            el.refit();
-            rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left - 10, 'left ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('horizontalOffset is applied', function() {
-            el.horizontalAlign = 'left';
-            el.horizontalOffset = 10;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left + 10, 'left ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element is kept in viewport', function() {
-            el.horizontalAlign = 'left';
-            // Make it go out of screen.
-            el.horizontalOffset = -1000;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, 0, 'left in viewport');
-            assert.isTrue(rect.width < elRect.width, 'reduced size');
-          });
-
-          test('negative horizontalOffset does not crop element', function() {
-            // Push to the bottom of the screen.
-            parent.style.left = (window.innerWidth - 50) +'px';
-            el.horizontalAlign = 'left';
-            el.horizontalOffset = -10;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, window.innerWidth - 60, 'left ok');
-            assert.equal(rect.right, window.innerWidth, 'right ok');
-          });
-
-          test('element max-width is updated', function() {
-            parent.style.left = '-10px';
-            el.horizontalAlign = 'left';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, 0, 'left ok');
-            assert.isBelow(rect.width, elRect.width, 'width ok');
-          });
-
-          test('min-width is preserved: element is displayed even if partially', function() {
-            parent.style.left = '-10px';
-            el.style.minWidth = elRect.width + 'px';
-            el.horizontalAlign = 'left';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, 0, 'left ok');
-            assert.equal(rect.width, elRect.width, 'min-width ok');
-            assert.isTrue(intersects(rect, fitRect), 'partially visible');
-          });
-
-          test('dynamicAlign will prefer right align if it minimizes the cropping', function() {
-            parent.style.left = '-10px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'left';
-            el.dynamicAlign = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right, 'right ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-        });
-
-        suite('when horizontalAlign is right', function() {
-          test('element is aligned to the positionTarget right', function() {
-            el.horizontalAlign = 'right';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right, 'right ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element is aligned to the positionTarget right without overlapping it', function() {
-            // Make space at the parent's left.
-            parent.style.left = elRect.width + 'px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'right';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element margin is considered as offset', function() {
-            el.horizontalAlign = 'right';
-            el.style.marginRight = '10px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right - 10, 'right ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-
-            el.style.marginRight = '-10px';
-            el.refit();
-            rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right + 10, 'right ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('horizontalOffset is applied', function() {
-            el.horizontalAlign = 'right';
-            el.horizontalOffset = 10;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right - 10, 'right ok');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element is kept in viewport', function() {
-            el.horizontalAlign = 'right';
-            // Make it go out of screen.
-            el.horizontalOffset = 1000;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, 0, 'left in viewport');
-            assert.isTrue(rect.width < elRect.width, 'reduced width');
-          });
-
-          test('element max-width is updated', function() {
-            parent.style.left = (100 - parentRect.width) + 'px';
-            el.horizontalAlign = 'right';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, 100, 'right ok');
-            assert.equal(rect.width, 100, 'width ok');
-          });
-
-          test('min-width is preserved: element is displayed even if partially', function() {
-            parent.style.left = (elRect.width - 10 - parentRect.width) + 'px';
-            el.horizontalAlign = 'right';
-            el.style.minWidth = elRect.width + 'px';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, 0, 'left ok');
-            assert.equal(rect.width, elRect.width, 'min-width ok');
-            assert.isTrue(intersects(rect, fitRect), 'partially visible');
-          });
-
-          test('dynamicAlign will prefer left align if it minimizes the cropping', function() {
-            parent.style.left = (window.innerWidth - elRect.width) + 'px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'right';
-            el.dynamicAlign = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left, 'left ok');
-            assert.equal(rect.height, elRect.height, 'no cropping');
-          });
-
-        });
-
-        suite('when horizontalAlign is auto', function() {
-          test('element is aligned to the positionTarget left', function() {
-            el.horizontalAlign = 'auto';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left, 'auto aligned to left');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('element is aligned to the positionTarget left without overlapping positionTarget', function() {
-            // Make space at the parent's left.
-            parent.style.left = elRect.width + 'px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'auto';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.width, elRect.width, 'no cropping');
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-          });
-
-          test('right is preferred to left if it diminishes the cropped area', function() {
-            // This would cause a cropping of the element, so it should automatically
-            // align to the right to avoid it.
-            parent.style.left = '-10px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'auto';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right, 'auto aligned to right');
-            assert.equal(rect.width, elRect.width, 'no cropping');
-          });
-
-          test('right is preferred to left if it diminishes the cropped area, without overlapping positionTarget', function() {
-            // Make space at the parent's right.
-            parent.style.width = '10px';
-            parentRect = parent.getBoundingClientRect();
-            el.horizontalAlign = 'auto';
-            el.noOverlap = true;
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.width, elRect.width, 'no cropping');
-            assert.isFalse(intersects(rect, parentRect), 'no overlap');
-          });
-        });
-
-        suite('prefer horizontal overlap to vertical overlap', function() {
-          setup(function() {
-            el.noOverlap = true;
-            el.dynamicAlign = true;
-            // Make space around the positionTarget.
-            parent.style.top = elRect.height + 'px';
-            parent.style.left = elRect.width + 'px';
-            parent.style.width = '10px';
-            parent.style.height = '10px';
-            parentRect = parent.getBoundingClientRect();
-          });
-
-          test('top-left aligns to target bottom-left', function() {
-            el.verticalAlign = 'top';
-            el.horizontalAlign = 'left';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left, 'left ok');
-            assert.equal(rect.top, parentRect.bottom, 'top ok');
-          });
-
-          test('top-right aligns to target bottom-right', function() {
-            el.verticalAlign = 'top';
-            el.horizontalAlign = 'right';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right, 'right ok');
-            assert.equal(rect.top, parentRect.bottom, 'top ok');
-          });
-
-          test('bottom-left aligns to target top-left', function() {
-            el.verticalAlign = 'bottom';
-            el.horizontalAlign = 'left';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.left, parentRect.left, 'left ok');
-            assert.equal(rect.bottom, parentRect.top, 'bottom ok');
-          });
-
-          test('bottom-right aligns to target top-right', function() {
-            el.verticalAlign = 'bottom';
-            el.horizontalAlign = 'right';
-            el.refit();
-            var rect = el.getBoundingClientRect();
-            assert.equal(rect.right, parentRect.right, 'right ok');
-            assert.equal(rect.bottom, parentRect.top, 'bottom ok');
-          });
-
-        });
-
-      });
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/test-fit.html b/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/test-fit.html
deleted file mode 100644
index 8062608..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-fit-behavior/test/test-fit.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-fit-behavior.html">
-
-<dom-module id="test-fit">
-  <template>
-    <style>
-      :host {
-        display: block;
-        background: black;
-        color: white;
-        padding: 8px;
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'test-fit',
-
-    behaviors: [
-      Polymer.IronFitBehavior
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-flex-layout/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/GUIDE.md b/systrace/catapult/third_party/polymer/components/iron-flex-layout/GUIDE.md
deleted file mode 100644
index 67a9e30..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/GUIDE.md
+++ /dev/null
@@ -1,1265 +0,0 @@
-## Overview
-
-The `iron-flex-layout` component provides simple ways to use [CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes), also known as _flexbox_. This component provides two different ways to use flexbox:
-
-*   Layout classes. The layout class stylesheet provides a simple set of class-based flexbox rules. Layout classes
-    let you specify layout properties directly in markup.
-
-*   Custom CSS mixins.  The mixin stylesheet includes custom CSS mixins that can be applied
-    inside a CSS rule using the `@apply` function.
-
-Using the classes or CSS mixins is largely a matter of preference. The following sections discuss
-how to use the each of the stylesheets.
-
-> <b>Note:</b> Before using either of these stylesheets, it's helpful to be familiar with the basics
-of flexbox layout. Chris Coyier's [A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) is a
-good primer.</aside>
-
-### Using layout classes
-
-To use layout classes import the `iron-flex-layout-classes` file. You
-must do this in any element that uses any of the `iron-flex-layout` styles.
-```html
-<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
-```
-
-Then include the module(s) that you need:
-```html
-<!-- include classes in the main document -->
-<style is="custom-style" include="iron-flex iron-flex-alignment">
-```
-
-or:
-```html
-<!-- import classes in an element -->
-<style include="iron-flex iron-flex-alignment">
-```
-
-Then simply apply the classes to any element.
-```html
-<div class="layout horizontal wrap">
-```
-
-Many of the layout rules involve combinations of multiple classes (such as `layout horizontal wrap` above),
-and will need a combination of modules.
-The order in which the classes are specified doesn't matter, so `layout horizontal` and `horizontal layout`
-are equivalent.
-
-There are 5 modules available:
-- `iron-flex`. Basic flex layouts.
-- `iron-flex-reverse`. Reverse flexbox layouts.
-- `iron-flex-alignment`.  Main axis, cross axis and self alignment.
-- `iron-flex-factors`. All the available flex factors.
-- `iron-positioning`. Generic, non-flexbox positioning helpers.
-
-**Example: using classes in the main document**
-```html
-<head>
-
-  ...
-
-  <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
-
-  ...
-
-  <!-- main document -- include the module you need in a custom-style element -->
-  <style is="custom-style" include="iron-flex"></style>
-
-</head>
-<body>
-
-  <div class="layout horizontal">
-    <div>One</div>
-    <div>Two</div>
-    <div>Three</div>
-  </div>
-
-</body>
-```
-**Example: using classes in a Polymer element**
-```html
-<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
-
-  ...
-
-<dom-module id="mixin-demo">
-
-  <!-- inside an element -- include the module you need in a standard style element -->
-  <style include="iron-flex"></style>
-
-  <template>
-    <div class="layout horizontal">
-      <div>One</div>
-      <div>Two</div>
-      <div>Three</div>
-    </div>
-  </template>
-
-  <script>
-    Polymer({ is: 'mixin-demo' });
-  </script>
-
-</dom-module>
-```
-
-It's important to note that unlike the previous layout class stylesheets
-(found in `/classes/iron-flex-layout.html`), the new version does not use the `/deep/`
-combinator: it does not work across local DOM boundaries,
-and the modules must be imported into each scope where they're used.
-
-### Using layout mixins
-
-Custom mixins can be applied inside a Polymer
-custom element's stylesheet, **or** inside a `custom-style` stylesheet to apply styles to the
-main document. (They cannot be applied in the main document without a `custom-style` stylesheet.)
-
-**Example: using mixins in the main document**
-```html
-<head>
-
-  ...
-
-  <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout.html">
-
-  ...
-
-  <!-- main document -- apply mixins in a custom-style element -->
-  <style is="custom-style">
-    .container {
-      @apply(--layout-horizontal);
-      @apply(--layout-wrap);
-    }
-  </style>
-
-</head>
-<body>
-
-  <div class="container">
-    <div>One</div>
-    <div>Two</div>
-    <div>Three</div>
-  </div>
-
-</body>
-```
-**Example: using mixins in a Polymer element**
-```html
-<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout.html">
-
-  ...
-
-<dom-module id="mixin-demo">
-
-  <!-- inside an element -- apply mixins in a standard style element -->
-  <style>
-    .container {
-      @apply(--layout-horizontal);
-      @apply(--layout-wrap);
-    }
-  </style>
-
-  <template>
-    <div class="container">
-      <div>One</div>
-      <div>Two</div>
-      <div>Three</div>
-    </div>
-  </template>
-
-  <script>
-    Polymer({ is: 'mixin-demo' });
-  </script>
-
-</dom-module>
-```
-
-In general the mixins require a little more code to use, but they can be preferable if you
-don't want to use the classes, or if you want to switch layouts based on a media query.
-
-Custom CSS properties and mixins are features provided by the Polymer library.
-See [Cross-scope styling](https://www.polymer-project.org/1.0/docs/devguide/styling.html#xscope-styling)
-in the Polymer developer guide.
-
-## Horizontal and vertical layout
-
-Create a flex container that lays out its children vertically or horizontally.
-
-Class | Mixin | Result
-:-|:-|:-
-<code>layout horizontal</code>| <code>--layout-horizontal</code> | Horizontal layout container.
-<code>layout vertical</code> | <code>--layout-vertical</code> | Vertical layout container.
-
-The classes listed here are included in the `iron-flex` module of the `iron-flex-layout-classes` file.
-
-**Example: classes**
-```html
-<div class="layout horizontal">
-  <div>One</div>
-  <div>Two</div>
-  <div>Three</div>
-</div>
-```
-
-**Example: mixins**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-  }
-</style>
-
-<div class="container">
-  <div>One</div>
-  <div>Two</div>
-  <div>Three</div>
-</div>
-```
-
-### Flexible children
-
-Children of a flex container can use flex to control their own sizing.
-
-Class | Mixin | Result
-:-|:-|:-
-<code>flex</code>| <code>--layout-flex</code> | Expand the child to fill available space in the main axis.
-<code>flex-<var>ratio</var></code>| <code>--layout-flex-<var>ratio</var></code> | Assign a flex ratio of 1 to 12.
-<code>flex-none</code>| <code>--layout-flex-none</code> | Don't flex the child.
-<code>flex-auto</code>| <code>--layout-flex-auto</code> | Sets flex `flex-basis` to `auto` and `flex-grow` and `flex-shrink` to 1.
-
-The classes listed here are included in the `iron-flex` module of the `iron-flex-layout-classes` file.
-
-**Example: classes**
-```html
-<div class="horizontal layout">
-  <div>Alpha</div>
-  <div class="flex">Beta (flex)</div>
-  <div>Gamma</div>
-</div>
-```
-
-**Example: mixins**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-  }
-  .flexchild {
-    @apply(--layout-flex);
-  }
-</style>
-
-<div class="container">
-<div>Alpha</div>
-  <div class="flexchild">Beta (flex)</div>
-  <div>Gamma</div>
-</div>
-```
-
-#### Flexible children in vertical layouts
-
-The same rules can be used for children in vertical layouts.
-
-**Example: classes**
-```html
-<div class="vertical layout" style="height:250px">
-  <div>Alpha</div>
-  <div class="flex">Beta (flex)</div>
-  <div>Gamma</div>
-</div>
-```
-
-**Example: mixins**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-vertical);
-  }
-  .flexchild {
-    @apply(--layout-flex);
-  }
-</style>
-
-<div class="container" style="height: 250px">
-  <div>One</div>
-  <div class="flexchild">Two</div>
-  <div>Three</div>
-</div>
-```
-
-> **Note**: for vertical layouts, the container needs to have a height for the
-children to flex correctly.
-
-#### Flex ratios
-
-Children elements can be told to take up more space by including a "flex ratio"
-from 1 to 12. This is equivalent to specifying the CSS `flex-grow` property.
-
-For example, the following examples make "Gamma" 2x larger than "Beta" and "Alpha" 3x larger, use
-`flex-2` and `flex-3`, respectively.
-
-The classes listed here are included in the `iron-flex-factors` module of the `iron-flex-layout-classes` file.
-
-**Example: classes**
-```html
-<div class="horizontal layout demo">
-  <div class="flex-3">Alpha</div>
-  <div class="flex">Beta</div>
-  <div class="flex-2">Gamma</div>
-</div>
-```
-
-**Example: mixins**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-  }
-  .flexchild {
-    @apply(--layout-flex)
-  }
-  .flex2child {
-    @apply(--layout-flex-2);
-  }
-  .flex3child {
-    @apply(--layout-flex-3);
-  }
-</style>
-
-<div class="container">
-  <div class="flex3child">One</div>
-  <div class="flexchild">Two</div>
-  <div class="flex2child">Three</div>
-</div>
-```
-
-### Cross-axis alignment
-
-By default, children stretch to fit the cross-axis (e.g. _vertical_ stretching in a _horizontal_ layout).
-
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal layout" style="height: 154px">
-  <div>Stretch Fill</div>
-</div>
-```
-
-Center _across_ the main axis (e.g. _vertical_ centering elements in a _horizontal_ layout)
-by adding the `center` class or applying the `--layout-center` mixin.
-
-**Example: classes, cross-axis center**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal layout center" style="height: 154px">
-  <div>Center</div>
-</div>
-```
-
-**Example: mixins, cross-axis center**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-            height: 154px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-    @apply(--layout-center);
-  }
-</style>
-
-<div class="container" style="height: 154px">
-  <div>Center</div>
-</div>
-```
-
-You can also position at the top/bottom (or left/right in `vertical` layouts) using the `start` or `end`
-classes, or by applying the `--layout-start` or `--layout-end` mixins.
-
-
-**Example: classes, cross-axis start**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal layout start" style="height: 154px">
-  <div>start</div>
-</div>
-```
-
-**Example: mixins, cross-axis start**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-    @apply(--layout-start);
-  }
-</style>
-
-<div class="container" style="height: 154px">
-  <div>start</div>
-</div>
-```
-
-**Example: classes, cross-axis end**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal layout end" style="height: 154px">
-  <div>end</div>
-</div>
-```
-
-**Example: mixins, cross-axis end**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-    @apply(--layout-end);
-  }
-</style>
-
-<div class="container" style="height: 154px">
-  <div>end</div>
-</div>
-```
-
-### Justification
-
-Justifying aligns contents along the **main axis**.  Justify the layout
-by specifying  one of the following.
-
-
-Class | Mixin | Result
-:-|:-|:-
-`start-justified`| <code>--layout-start-justified</code> | Aligns contents at the start of the main axis.
-`center-justified` | <code>--layout-center-justified</code> | Centers contents along the main axis.
-`end-justified` | <code>--layout-end-justified</code> | Aligns contents to the end of the main axis.
-`justified` | <code>--layout-justified</code> | Aligns contents with equal spaces between children.
-`around-justified` | <code>--layout-around-justified</code> | Aligns contents with equal spaces arround children.
-
-The classes listed here are included in the `iron-flex-alignment` module of the `iron-flex-layout-classes` file.
-
-**Example: classes, start justified**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal start-justified layout">
-  <div>start-justified</div>
-</div>
-```
-
-**Example: mixins, center justified**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-    @apply(--layout-center-justified);
-  }
-</style>
-
-<div class="container">
-  <div>center-justified</div>
-</div>
-```
-
-**Example: classes, end justified**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal end-justified layout">
-  <div>end-justified</div>
-</div>
-```
-
-**Example: mixins, equal space between elements**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-    @apply(--layout-justified);
-  }
-</style>
-
-<div class="container">
-  <div>justified</div>
-  <div>justified</div>
-  <div>justified</div>
-</div>
-```
-
-**Example: classes, equal space around each element**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal around-justified layout">
-  <div>around-justified</div>
-  <div>around-justified</div>
-</div>
-```
-
-## Self alignment
-
-Alignment can also be set per-child (instead of using the layout container's rules).
-
-Class | Mixin | Result
-:-|:-|:-
-`self-start`| <code>--layout-self-start</code> | Aligns the child at the start of the cross-axis.
-`self-center` | <code>--layout-self-center</code> | Centers the child along the cross-axis.
-`self-end` | <code>--layout-self-end</code> | Aligns the child at the end of the cross-axis.
-`self-stretch` | <code>--layout-self-stretch</code> | Stretches the child to fit the cross-axis.
-
-**Example: classes**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal layout" style="height: 120px;">
-  <div class="flex self-start">Alpha</div>
-  <div class="flex self-center">Beta</div>
-  <div class="flex self-end">Gamma</div>
-  <div class="flex self-stretch">Delta</div>
-</div>
-```
-
-**Example: mixins**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal);
-    @apply(--layout-justified);
-    height: 120px;
-  }
-  .container div {
-    @apply(--layout-flex);
-  }
-  .child1 {
-    @apply(--layout-self-start);
-  }
-  .child2 {
-    @apply(--layout-self-center);
-  }
-  .child3 {
-    @apply(--layout-self-end);
-  }
-  .child4 {
-    @apply(--layout-self-stretch);
-  }
-</style>
-<div class="container">
-  <div class="child1">Alpha</div>
-  <div class="child2">Beta</div>
-  <div class="child3">Gamma</div>
-  <div class="child4">Delta</div>
-</div>
-```
-
-> <b>Note:</b> The <code>flex</code> class
-(and <code>--layout-flex</code> mixin) shown in these examples is
-added for the demo and not required for self-alignment.
-
-
-## Wrapping
-
-Wrapped layouts can be enabled with the `wrap` class or `--layout-wrap` mixin.
-
-**Example: classes**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="horizontal layout wrap" style="width: 220px">
-  <div>Alpha</div>
-  <div>Beta</div>
-  <div>Gamma</div>
-  <div>Delta</div>
-</div>
-```
-
-## Reversed layouts
-
-Layout direction can be mirrored using the following rules:
-
-Class | Mixin | Result
-:-|:-|:-
-<code>layout horizontal-reverse</code>| <code>--layout-horizontal-reverse</code> | Horizontal layout with children laid out in reverse order (last-to-first).
-<code>layout vertical-reverse</code> | <code>--layout-vertical-reverse</code> | Vertical layout with children laid out in reverse order.
-<code>layout wrap-reverse</code> | <code>--layout-wrap-reverse</code> | Wrap layout with wrapped rows placed in the reverse order (for example, in a vertical layout, the second row is placed above the first row, instead of below).
-
-The classes listed here are included in the `iron-flex-reverse` module of the `iron-flex-layout-classes` file.
-
-**Example: mixins**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment iron-flex-reverse"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<style is="custom-style">
-  .container {
-    @apply(--layout-horizontal-reverse);
-  }
-</style>
-
-<div class="container">
-  <div>Alpha</div>
-  <div>Beta</div>
-  <div>Gamma</div>
-  <div>Delta</div>
-</div>
-```
-
-## Full bleed &lt;body>
-
-It's common to want the entire `<body>` to fit to the viewport. By themselves, Polymer's layout features on
-`<body>` don't achieve the result. You can make `<body>` take up the entire viewport by adding the `fullbleed` class:
-
-```html
-<body class="fullbleed vertical layout">
-  <div class="flex">Fitting a fullbleed body.</div>
-</body>
-```
-
-This removes its margins and maximizes its height to the viewport. There is no equivalent mixin, but the same result can
-be achieved in CSS very simply:
-```css
-body {
-  margin: 0;
-  height: 100vh;
-}
-```
-
-This class is included in the `iron-positioning` module of the `iron-flex-layout-classes` file.
-
-Note that the `fullbleed` class **only works on the `<body>` tag.** This is the only rule in the
-stylesheet that is scoped to a particular tag.
-
-
-## General purpose rules
-
-Polymer also includes other general purpose rules for basic positioning:
-
-Class | Mixin | Result
-:-|:-|:-
-`block`| `--layout-block` | Assigns `display: block`
-`invisible` | `--layout-invisible` | Assigns `visibility: hidden`
-`relative` | `--layout-relative` | Assigns `position: relative`
-`fit` | `--layout-fit` | Sets `position: absolute` and sets `top:0;right:0;bottom:0;left:0;` (aka "trbl fitting").
-
-The classes listed here are included in the `iron-positioning` module of the `iron-flex-layout-classes` file.
-
-> <b>Note:</b>When using `fit` layout, the element must have an ancestor with fixed size and `position: relative` layout
-to fit inside of.
-
-
-**Example: classes**
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment iron-positioning"></style>
-        <style>
-          :host {
-            display: block;
-            background: #ccc;
-          }
-          
-          .demo {
-            background-color: white;
-            margin: 12px;
-            padding: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="demo">Before <span>[A Span]</span> After</div>
-<div class="demo">Before <span class="block">[A Block Span]</span> After</div>
-<div class="demo">Before invisible span <span class="invisible">Not displayed</span> After invisible span</div>
-<div class="relative" style="height: 100px;">
-  <div class="fit" style="background-color: #000;color: white">Fit</div>
-</div>
-```
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/README.md b/systrace/catapult/third_party/polymer/components/iron-flex-layout/README.md
deleted file mode 100644
index d5aac2f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/README.md
+++ /dev/null
@@ -1,67 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/iron-flex-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-flex-layout)
-[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/iron-flex-layout)
-
-## &lt;iron-flex-layout&gt;
-
-The `<iron-flex-layout>` component provides simple ways to use
-[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes),
-also known as flexbox. This component provides two different ways to use flexbox:
-
-1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
-The layout class stylesheet provides a simple set of class-based flexbox rules, that
-let you specify layout properties directly in markup. You must include this file
-in every element that needs to use them.
-
-Sample use:
-
-<!--
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.min.js"></script>
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <dom-module id="demo-element">
-      <template>
-        <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-        <style>
-          .container, .layout {
-            background-color: #ccc;
-            padding: 4px;
-          }
-
-          .container div, .layout div {
-            background-color: white;
-            padding: 12px;
-            margin: 4px;
-          }
-        </style>
-        <next-code-block></next-code-block>
-      </template>
-      <script>Polymer({is: "demo-element"});</script>
-    </dom-module>
-    <demo-element></demo-element>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div class="layout horizontal layout-start" style="height: 154px">
-  <div>cross axis start alignment</div>
-</div>
-```
-
-1. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html).
-The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function.
-
-
-
-Please note that the old [/deep/ layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/classes)
-are deprecated, and should not be used. To continue using layout properties
-directly in markup, please switch to using the new `dom-module`-based
-[layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
-Please note that the new version does not use `/deep/`, and therefore requires you
-to import the `dom-modules` in every element that needs to use them.
-
-A complete [guide](https://elements.polymer-project.org/guides/flex-layout) to `<iron-flex-layout>` is available.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/bower.json b/systrace/catapult/third_party/polymer/components/iron-flex-layout/bower.json
deleted file mode 100644
index 7b6b1a2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/bower.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "iron-flex-layout",
-  "version": "1.3.7",
-  "description": "Provide flexbox-based layouts",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "layout"
-  ],
-  "main": "iron-flex-layout.html",
-  "private": true,
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-flex-layout.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0"
-  },
-  "pages": {
-    "Flexbox layout guide": "GUIDE.md"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/classes/iron-flex-layout.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/classes/iron-flex-layout.html
deleted file mode 100644
index 5fa7ce6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/classes/iron-flex-layout.html
+++ /dev/null
@@ -1,317 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="iron-shadow-flex-layout.html">
-
-<script>
-  console.warn('This file is deprecated. Please use `iron-flex-layout/iron-flex-layout-classes.html`, and one of the specific dom-modules instead');
-</script>
-
-<style>
-
-  /*******************************
-            Flex Layout
-  *******************************/
-
-  .layout.horizontal,
-  .layout.horizontal-reverse,
-  .layout.vertical,
-  .layout.vertical-reverse {
-    display: -ms-flexbox;
-    display: -webkit-flex;
-    display: flex;
-  }
-
-  .layout.inline {
-    display: -ms-inline-flexbox;
-    display: -webkit-inline-flex;
-    display: inline-flex;
-  }
-
-  .layout.horizontal {
-    -ms-flex-direction: row;
-    -webkit-flex-direction: row;
-    flex-direction: row;
-  }
-
-  .layout.horizontal-reverse {
-    -ms-flex-direction: row-reverse;
-    -webkit-flex-direction: row-reverse;
-    flex-direction: row-reverse;
-  }
-
-  .layout.vertical {
-    -ms-flex-direction: column;
-    -webkit-flex-direction: column;
-    flex-direction: column;
-  }
-
-  .layout.vertical-reverse {
-    -ms-flex-direction: column-reverse;
-    -webkit-flex-direction: column-reverse;
-    flex-direction: column-reverse;
-  }
-
-  .layout.wrap {
-    -ms-flex-wrap: wrap;
-    -webkit-flex-wrap: wrap;
-    flex-wrap: wrap;
-  }
-  
-  .layout.no-wrap {
-    -ms-flex-wrap: nowrap;
-    -webkit-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-  }
-
-  .layout.wrap-reverse {
-    -ms-flex-wrap: wrap-reverse;
-    -webkit-flex-wrap: wrap-reverse;
-    flex-wrap: wrap-reverse;
-  }
-
-  .flex-auto {
-    -ms-flex: 1 1 auto;
-    -webkit-flex: 1 1 auto;
-    flex: 1 1 auto;
-  }
-
-  .flex-none {
-    -ms-flex: none;
-    -webkit-flex: none;
-    flex: none;
-  }
-
-  .flex,
-  .flex-1 {
-    -ms-flex: 1;
-    -webkit-flex: 1;
-    flex: 1;
-  }
-
-  .flex-2 {
-    -ms-flex: 2;
-    -webkit-flex: 2;
-    flex: 2;
-  }
-
-  .flex-3 {
-    -ms-flex: 3;
-    -webkit-flex: 3;
-    flex: 3;
-  }
-
-  .flex-4 {
-    -ms-flex: 4;
-    -webkit-flex: 4;
-    flex: 4;
-  }
-
-  .flex-5 {
-    -ms-flex: 5;
-    -webkit-flex: 5;
-    flex: 5;
-  }
-
-  .flex-6 {
-    -ms-flex: 6;
-    -webkit-flex: 6;
-    flex: 6;
-  }
-
-  .flex-7 {
-    -ms-flex: 7;
-    -webkit-flex: 7;
-    flex: 7;
-  }
-
-  .flex-8 {
-    -ms-flex: 8;
-    -webkit-flex: 8;
-    flex: 8;
-  }
-
-  .flex-9 {
-    -ms-flex: 9;
-    -webkit-flex: 9;
-    flex: 9;
-  }
-
-  .flex-10 {
-    -ms-flex: 10;
-    -webkit-flex: 10;
-    flex: 10;
-  }
-
-  .flex-11 {
-    -ms-flex: 11;
-    -webkit-flex: 11;
-    flex: 11;
-  }
-
-  .flex-12 {
-    -ms-flex: 12;
-    -webkit-flex: 12;
-    flex: 12;
-  }
-
-  /* alignment in cross axis */
-
-  .layout.start {
-    -ms-flex-align: start;
-    -webkit-align-items: flex-start;
-    align-items: flex-start;
-  }
-
-  .layout.center,
-  .layout.center-center {
-    -ms-flex-align: center;
-    -webkit-align-items: center;
-    align-items: center;
-  }
-
-  .layout.end {
-    -ms-flex-align: end;
-    -webkit-align-items: flex-end;
-    align-items: flex-end;
-  }
-
-  /* alignment in main axis */
-
-  .layout.start-justified {
-    -ms-flex-pack: start;
-    -webkit-justify-content: flex-start;
-    justify-content: flex-start;
-  }
-
-  .layout.center-justified,
-  .layout.center-center {
-    -ms-flex-pack: center;
-    -webkit-justify-content: center;
-    justify-content: center;
-  }
-
-  .layout.end-justified {
-    -ms-flex-pack: end;
-    -webkit-justify-content: flex-end;
-    justify-content: flex-end;
-  }
-
-  .layout.around-justified {
-    -ms-flex-pack: around;
-    -webkit-justify-content: space-around;
-    justify-content: space-around;
-  }
-
-  .layout.justified {
-    -ms-flex-pack: justify;
-    -webkit-justify-content: space-between;
-    justify-content: space-between;
-  }
-
-  /* self alignment */
-
-  .self-start {
-    -ms-align-self: flex-start;
-    -webkit-align-self: flex-start;
-    align-self: flex-start;
-  }
-
-  .self-center {
-    -ms-align-self: center;
-    -webkit-align-self: center;
-    align-self: center;
-  }
-
-  .self-end {
-    -ms-align-self: flex-end;
-    -webkit-align-self: flex-end;
-    align-self: flex-end;
-  }
-
-  .self-stretch {
-    -ms-align-self: stretch;
-    -webkit-align-self: stretch;
-    align-self: stretch;
-  }
-
-  /*******************************
-            Other Layout
-  *******************************/
-
-  .block {
-    display: block;
-  }
-
-  /* IE 10 support for HTML5 hidden attr */
-  [hidden] {
-    display: none !important;
-  }
-
-  .invisible {
-    visibility: hidden !important;
-  }
-
-  .relative {
-    position: relative;
-  }
-
-  .fit {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-  }
-
-  body.fullbleed {
-    margin: 0;
-    height: 100vh;
-  }
-
-  .scroll {
-    -webkit-overflow-scrolling: touch;
-    overflow: auto;
-  }
-
-  /* fixed position */
-
-  .fixed-bottom,
-  .fixed-left,
-  .fixed-right,
-  .fixed-top {
-    position: fixed;
-  }
-
-  .fixed-top {
-    top: 0;
-    left: 0;
-    right: 0;
-  }
-
-  .fixed-right {
-    top: 0;
-    right: 0;
-    bottom: 0;
-  }
-
-  .fixed-bottom {
-    right: 0;
-    bottom: 0;
-    left: 0;
-  }
-
-  .fixed-left {
-    top: 0;
-    bottom: 0;
-    left: 0;
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/classes/iron-shadow-flex-layout.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/classes/iron-shadow-flex-layout.html
deleted file mode 100644
index 5dcde19..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/classes/iron-shadow-flex-layout.html
+++ /dev/null
@@ -1,313 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<script>
-  console.warn('This file is deprecated. Please use `iron-flex-layout/iron-flex-layout-classes.html`, and one of the specific dom-modules instead');
-</script>
-
-<style>
-
-  /*******************************
-            Flex Layout
-  *******************************/
-
-  html /deep/ .layout.horizontal,
-  html /deep/ .layout.horizontal-reverse,
-  html /deep/ .layout.vertical,
-  html /deep/ .layout.vertical-reverse {
-    display: -ms-flexbox;
-    display: -webkit-flex;
-    display: flex;
-  }
-
-  html /deep/ .layout.inline {
-    display: -ms-inline-flexbox;
-    display: -webkit-inline-flex;
-    display: inline-flex;
-  }
-
-  html /deep/ .layout.horizontal {
-    -ms-flex-direction: row;
-    -webkit-flex-direction: row;
-    flex-direction: row;
-  }
-
-  html /deep/ .layout.horizontal-reverse {
-    -ms-flex-direction: row-reverse;
-    -webkit-flex-direction: row-reverse;
-    flex-direction: row-reverse;
-  }
-
-  html /deep/ .layout.vertical {
-    -ms-flex-direction: column;
-    -webkit-flex-direction: column;
-    flex-direction: column;
-  }
-
-  html /deep/ .layout.vertical-reverse {
-    -ms-flex-direction: column-reverse;
-    -webkit-flex-direction: column-reverse;
-    flex-direction: column-reverse;
-  }
-
-  html /deep/ .layout.wrap {
-    -ms-flex-wrap: wrap;
-    -webkit-flex-wrap: wrap;
-    flex-wrap: wrap;
-  }
-  
-  html /deep/ .layout-no-wrap {
-    -ms-flex-wrap: nowrap;
-    -webkit-flex-wrap: nowrap;
-    flex-wrap: nowrap;
-  }
-
-  html /deep/ .layout.wrap-reverse {
-    -ms-flex-wrap: wrap-reverse;
-    -webkit-flex-wrap: wrap-reverse;
-    flex-wrap: wrap-reverse;
-  }
-
-  html /deep/ .flex-auto {
-    -ms-flex: 1 1 auto;
-    -webkit-flex: 1 1 auto;
-    flex: 1 1 auto;
-  }
-
-  html /deep/ .flex-none {
-    -ms-flex: none;
-    -webkit-flex: none;
-    flex: none;
-  }
-
-  html /deep/ .flex,
-  html /deep/ .flex-1 {
-    -ms-flex: 1;
-    -webkit-flex: 1;
-    flex: 1;
-  }
-
-  html /deep/ .flex-2 {
-    -ms-flex: 2;
-    -webkit-flex: 2;
-    flex: 2;
-  }
-
-  html /deep/ .flex-3 {
-    -ms-flex: 3;
-    -webkit-flex: 3;
-    flex: 3;
-  }
-
-  html /deep/ .flex-4 {
-    -ms-flex: 4;
-    -webkit-flex: 4;
-    flex: 4;
-  }
-
-  html /deep/ .flex-5 {
-    -ms-flex: 5;
-    -webkit-flex: 5;
-    flex: 5;
-  }
-
-  html /deep/ .flex-6 {
-    -ms-flex: 6;
-    -webkit-flex: 6;
-    flex: 6;
-  }
-
-  html /deep/ .flex-7 {
-    -ms-flex: 7;
-    -webkit-flex: 7;
-    flex: 7;
-  }
-
-  html /deep/ .flex-8 {
-    -ms-flex: 8;
-    -webkit-flex: 8;
-    flex: 8;
-  }
-
-  html /deep/ .flex-9 {
-    -ms-flex: 9;
-    -webkit-flex: 9;
-    flex: 9;
-  }
-
-  html /deep/ .flex-10 {
-    -ms-flex: 10;
-    -webkit-flex: 10;
-    flex: 10;
-  }
-
-  html /deep/ .flex-11 {
-    -ms-flex: 11;
-    -webkit-flex: 11;
-    flex: 11;
-  }
-
-  html /deep/ .flex-12 {
-    -ms-flex: 12;
-    -webkit-flex: 12;
-    flex: 12;
-  }
-
-  /* alignment in cross axis */
-
-  html /deep/ .layout.start {
-    -ms-flex-align: start;
-    -webkit-align-items: flex-start;
-    align-items: flex-start;
-  }
-
-  html /deep/ .layout.center,
-  html /deep/ .layout.center-center {
-    -ms-flex-align: center;
-    -webkit-align-items: center;
-    align-items: center;
-  }
-
-  html /deep/ .layout.end {
-    -ms-flex-align: end;
-    -webkit-align-items: flex-end;
-    align-items: flex-end;
-  }
-
-  /* alignment in main axis */
-
-  html /deep/ .layout.start-justified {
-    -ms-flex-pack: start;
-    -webkit-justify-content: flex-start;
-    justify-content: flex-start;
-  }
-
-  html /deep/ .layout.center-justified,
-  html /deep/ .layout.center-center {
-    -ms-flex-pack: center;
-    -webkit-justify-content: center;
-    justify-content: center;
-  }
-
-  html /deep/ .layout.end-justified {
-    -ms-flex-pack: end;
-    -webkit-justify-content: flex-end;
-    justify-content: flex-end;
-  }
-
-  html /deep/ .layout.around-justified {
-    -ms-flex-pack: around;
-    -webkit-justify-content: space-around;
-    justify-content: space-around;
-  }
-
-  html /deep/ .layout.justified {
-    -ms-flex-pack: justify;
-    -webkit-justify-content: space-between;
-    justify-content: space-between;
-  }
-
-  /* self alignment */
-
-  html /deep/ .self-start {
-    -ms-align-self: flex-start;
-    -webkit-align-self: flex-start;
-    align-self: flex-start;
-  }
-
-  html /deep/ .self-center {
-    -ms-align-self: center;
-    -webkit-align-self: center;
-    align-self: center;
-  }
-
-  html /deep/ .self-end {
-    -ms-align-self: flex-end;
-    -webkit-align-self: flex-end;
-    align-self: flex-end;
-  }
-
-  html /deep/ .self-stretch {
-    -ms-align-self: stretch;
-    -webkit-align-self: stretch;
-    align-self: stretch;
-  }
-
-  /*******************************
-            Other Layout
-  *******************************/
-
-  html /deep/ .block {
-    display: block;
-  }
-
-  /* IE 10 support for HTML5 hidden attr */
-  html /deep/ [hidden] {
-    display: none !important;
-  }
-
-  html /deep/ .invisible {
-    visibility: hidden !important;
-  }
-
-  html /deep/ .relative {
-    position: relative;
-  }
-
-  html /deep/ .fit {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-  }
-
-  body.fullbleed {
-    margin: 0;
-    height: 100vh;
-  }
-
-  html /deep/ .scroll {
-    -webkit-overflow-scrolling: touch;
-    overflow: auto;
-  }
-
-  .fixed-bottom,
-  .fixed-left,
-  .fixed-right,
-  .fixed-top {
-    position: fixed;
-  }
-
-  html /deep/ .fixed-top {
-    top: 0;
-    left: 0;
-    right: 0;
-  }
-
-  html /deep/ .fixed-right {
-    top: 0;
-    right: 0;
-    bottom: 0;
-  }
-
-  html /deep/ .fixed-bottom {
-    right: 0;
-    bottom: 0;
-    left: 0;
-  }
-
-  html /deep/ .fixed-left {
-    top: 0;
-    bottom: 0;
-    left: 0;
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/demo/index.html
deleted file mode 100644
index 4bc2d41..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/demo/index.html
+++ /dev/null
@@ -1,396 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-flex-layout demo</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../iron-flex-layout.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    demo-snippet {
-      --demo-snippet-demo: {
-        padding: 0;
-      }
-    }
-    .container {
-      background-color: #ccc;
-      padding: 5px;
-      margin: 0;
-    }
-    .container > div {
-      padding: 15px;
-      margin: 5px;
-      background-color: white;
-      min-height: 20px;
-    }
-
-    .vertical-section-container {
-      max-width: 700px
-    }
-  </style>
-
-</head>
-<body unresolved class="fullbleed">
-  <div class="vertical-section-container centered">
-    <h4>Horizontal and vertical layout</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex {
-            @apply(--layout-horizontal);
-          }
-        </style>
-        <div class="container flex">
-          <div>one</div>
-          <div>two</div>
-          <div>three</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Flexible children</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-horizontal {
-            @apply(--layout-horizontal);
-          }
-          .flexchild {
-            @apply(--layout-flex);
-          }
-        </style>
-
-        <div class="container flex-horizontal">
-          <div>one</div>
-          <div class="flexchild">two (flex)</div>
-          <div>three</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Flexible children in vertical layouts</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-vertical {
-            @apply(--layout-vertical);
-            height: 220px;
-          }
-          .flexchild-vertical {
-            @apply(--layout-flex);
-          }
-        </style>
-
-        <div class="container flex-vertical">
-          <div>one</div>
-          <div class="flexchild-vertical">two (flex)</div>
-          <div>three</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Flex ratios</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-horizontal-with-ratios {
-            @apply(--layout-horizontal);
-          }
-          .flexchild {
-            @apply(--layout-flex);
-          }
-          .flex2child {
-            @apply(--layout-flex-2);
-          }
-          .flex3child {
-            @apply(--layout-flex-3);
-          }
-        </style>
-
-        <div class="container flex-horizontal-with-ratios">
-          <div class="flex3child">one</div>
-          <div class="flexchild">two</div>
-          <div class="flex2child">three</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Cross-axis stretch alignment (default)</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-stretch-align {
-            @apply(--layout-horizontal);
-            height: 120px;
-          }
-        </style>
-
-        <div class="container flex-stretch-align">
-          <div>stretch</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Cross-axis center alignment</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-center-align {
-            @apply(--layout-horizontal);
-            @apply(--layout-center);
-            height: 120px;
-          }
-        </style>
-
-        <div class="container flex-center-align">
-          <div>center</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Cross-axis start alignment</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-start-align {
-            @apply(--layout-horizontal);
-            @apply(--layout-start);
-            height: 120px;
-          }
-        </style>
-
-        <div class="container flex-start-align">
-          <div>start</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Cross-axis end alignment</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-end-align {
-            @apply(--layout-horizontal);
-            @apply(--layout-end);
-            height: 120px;
-          }
-        </style>
-
-        <div class="container flex-end-align">
-          <div>end</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Justification, start justified</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-start-justified {
-            @apply(--layout-horizontal);
-            @apply(--layout-start-justified);
-          }
-        </style>
-
-        <div class="container flex-start-justified">
-          <div>start-justified</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Justification, center justified</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-center-justified {
-            @apply(--layout-horizontal);
-            @apply(--layout-center-justified);
-          }
-        </style>
-
-        <div class="container flex-center-justified">
-          <div>center-justified</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Justification, end justified</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-end-justified {
-            @apply(--layout-horizontal);
-            @apply(--layout-end-justified);
-          }
-        </style>
-
-        <div class="container flex-end-justified">
-          <div>end-justified</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Justification, equal space between elements</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-equal-justified {
-            @apply(--layout-horizontal);
-            @apply(--layout-justified);
-          }
-        </style>
-
-        <div class="container flex-equal-justified">
-          <div>justified</div>
-          <div>justified</div>
-          <div>justified</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Justification, equal space around each element</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-equal-around-justified {
-            @apply(--layout-horizontal);
-            @apply(--layout-around-justified);
-          }
-        </style>
-
-        <div class="container flex-equal-around-justified">
-          <div>around-justified</div>
-          <div>around-justified</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Self alignment</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-self-align {
-            @apply(--layout-horizontal);
-            @apply(--layout-justified);
-            height: 120px;
-          }
-          .flex-self-align div {
-            @apply(--layout-flex);
-          }
-          .child1 {
-            @apply(--layout-self-start);
-          }
-          .child2 {
-            @apply(--layout-self-center);
-          }
-          .child3 {
-            @apply(--layout-self-end);
-          }
-          .child4 {
-            @apply(--layout-self-stretch);
-          }
-        </style>
-
-        <div class="container flex-self-align">
-          <div class="child1">one</div>
-          <div class="child2">two</div>
-          <div class="child3">three</div>
-          <div class="child4">four</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Wrapping</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-wrap {
-            @apply(--layout-horizontal);
-            @apply(--layout-wrap);
-            width: 200px;
-          }
-        </style>
-
-        <div class="container flex-wrap">
-          <div>one</div>
-          <div>two</div>
-          <div>three</div>
-          <div>four</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>Reversed layouts</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .flex-reversed {
-            @apply(--layout-horizontal-reverse);
-          }
-        </style>
-
-        <div class="container flex-reversed">
-          <div>one</div>
-          <div>two</div>
-          <div>three</div>
-          <div>four</div>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h4>General purpose rules</h4>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .general {
-            width: 100%;
-          }
-          .general > div {
-            background-color: #ccc;
-            padding: 4px;
-            margin: 12px;
-          }
-          .block {
-            @apply(--layout-block);
-          }
-          .invisible {
-            @apply(--layout-invisible);
-          }
-          .relative {
-            @apply(--layout-relative);
-          }
-          .fit {
-            @apply(--layout-fit);
-          }
-        </style>
-
-        <div class="general">
-          <div>Before <span>[A Span]</span> After</div>
-          <div>Before <span class="block">[A Block Span]</span> After</div>
-          <div>Before invisible span <span class="invisible">Not displayed</span> After invisible span</div>
-          <div class="relative" style="height: 100px;">
-            <div class="fit" style="background-color: #000;color: white">Fit</div>
-          </div>
-        </div>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/index.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/index.html
deleted file mode 100644
index 7d3b088..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-flex-layout</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/iron-flex-layout-classes.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/iron-flex-layout-classes.html
deleted file mode 100644
index 6bf47f8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/iron-flex-layout-classes.html
+++ /dev/null
@@ -1,437 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<!--
-A set of layout classes that let you specify layout properties directly in markup.
-You must include this file in every element that needs to use them.
-
-Sample use:
-
-    <link rel="import" href="../iron-flex-layout/iron-flex-layout-classes.html">
-    <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-
-    <div class="layout horizontal layout-start">
-      <div>cross axis start alignment</div>
-    </div>
-
-The following imports are available:
- - iron-flex
- - iron-flex-reverse
- - iron-flex-alignment
- - iron-flex-factors
- - iron-positioning
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!-- Most common used flex styles-->
-<dom-module id="iron-flex">
-  <template>
-    <style>
-      .layout.horizontal,
-      .layout.vertical {
-        display: -ms-flexbox;
-        display: -webkit-flex;
-        display: flex;
-      }
-
-      .layout.inline {
-        display: -ms-inline-flexbox;
-        display: -webkit-inline-flex;
-        display: inline-flex;
-      }
-
-      .layout.horizontal {
-        -ms-flex-direction: row;
-        -webkit-flex-direction: row;
-        flex-direction: row;
-      }
-
-      .layout.vertical {
-        -ms-flex-direction: column;
-        -webkit-flex-direction: column;
-        flex-direction: column;
-      }
-
-      .layout.wrap {
-        -ms-flex-wrap: wrap;
-        -webkit-flex-wrap: wrap;
-        flex-wrap: wrap;
-      }
-
-      .layout.no-wrap {
-        -ms-flex-wrap: nowrap;
-        -webkit-flex-wrap: nowrap;
-        flex-wrap: nowrap;
-      }
-
-      .layout.center,
-      .layout.center-center {
-        -ms-flex-align: center;
-        -webkit-align-items: center;
-        align-items: center;
-      }
-
-      .layout.center-justified,
-      .layout.center-center {
-        -ms-flex-pack: center;
-        -webkit-justify-content: center;
-        justify-content: center;
-      }
-
-      .flex {
-        -ms-flex: 1 1 0.000000001px;
-        -webkit-flex: 1;
-        flex: 1;
-        -webkit-flex-basis: 0.000000001px;
-        flex-basis: 0.000000001px;
-      }
-
-      .flex-auto {
-        -ms-flex: 1 1 auto;
-        -webkit-flex: 1 1 auto;
-        flex: 1 1 auto;
-      }
-
-      .flex-none {
-        -ms-flex: none;
-        -webkit-flex: none;
-        flex: none;
-      }
-    </style>
-  </template>
-</dom-module>
-
-<!-- Basic flexbox reverse styles -->
-<dom-module id="iron-flex-reverse">
-  <template>
-    <style>
-      .layout.horizontal-reverse,
-      .layout.vertical-reverse {
-        display: -ms-flexbox;
-        display: -webkit-flex;
-        display: flex;
-      }
-
-      .layout.horizontal-reverse {
-        -ms-flex-direction: row-reverse;
-        -webkit-flex-direction: row-reverse;
-        flex-direction: row-reverse;
-      }
-
-      .layout.vertical-reverse {
-        -ms-flex-direction: column-reverse;
-        -webkit-flex-direction: column-reverse;
-        flex-direction: column-reverse;
-      }
-
-      .layout.wrap-reverse {
-        -ms-flex-wrap: wrap-reverse;
-        -webkit-flex-wrap: wrap-reverse;
-        flex-wrap: wrap-reverse;
-      }
-    </style>
-  </template>
-</dom-module>
-
-<!-- Flexbox alignment -->
-<dom-module id="iron-flex-alignment">
-  <template>
-    <style>
-      /**
-       * Alignment in cross axis.
-       */
-      .layout.start {
-        -ms-flex-align: start;
-        -webkit-align-items: flex-start;
-        align-items: flex-start;
-      }
-
-      .layout.center,
-      .layout.center-center {
-        -ms-flex-align: center;
-        -webkit-align-items: center;
-        align-items: center;
-      }
-
-      .layout.end {
-        -ms-flex-align: end;
-        -webkit-align-items: flex-end;
-        align-items: flex-end;
-      }
-
-      .layout.baseline {
-        -ms-flex-align: baseline;
-        -webkit-align-items: baseline;
-        align-items: baseline;
-      }
-
-      /**
-       * Alignment in main axis.
-       */
-      .layout.start-justified {
-        -ms-flex-pack: start;
-        -webkit-justify-content: flex-start;
-        justify-content: flex-start;
-      }
-
-      .layout.center-justified,
-      .layout.center-center {
-        -ms-flex-pack: center;
-        -webkit-justify-content: center;
-        justify-content: center;
-      }
-
-      .layout.end-justified {
-        -ms-flex-pack: end;
-        -webkit-justify-content: flex-end;
-        justify-content: flex-end;
-      }
-
-      .layout.around-justified {
-        -ms-flex-pack: distribute;
-        -webkit-justify-content: space-around;
-        justify-content: space-around;
-      }
-
-      .layout.justified {
-        -ms-flex-pack: justify;
-        -webkit-justify-content: space-between;
-        justify-content: space-between;
-      }
-
-      /**
-       * Self alignment.
-       */
-      .self-start {
-        -ms-align-self: flex-start;
-        -webkit-align-self: flex-start;
-        align-self: flex-start;
-      }
-
-      .self-center {
-        -ms-align-self: center;
-        -webkit-align-self: center;
-        align-self: center;
-      }
-
-      .self-end {
-        -ms-align-self: flex-end;
-        -webkit-align-self: flex-end;
-        align-self: flex-end;
-      }
-
-      .self-stretch {
-        -ms-align-self: stretch;
-        -webkit-align-self: stretch;
-        align-self: stretch;
-      }
-
-      .self-baseline {
-        -ms-align-self: baseline;
-        -webkit-align-self: baseline;
-        align-self: baseline;
-      }
-
-      /**
-       * multi-line alignment in main axis.
-       */
-      .layout.start-aligned {
-        -ms-flex-line-pack: start;  /* IE10 */
-        -ms-align-content: flex-start;
-        -webkit-align-content: flex-start;
-        align-content: flex-start;
-      }
-
-      .layout.end-aligned {
-        -ms-flex-line-pack: end;  /* IE10 */
-        -ms-align-content: flex-end;
-        -webkit-align-content: flex-end;
-        align-content: flex-end;
-      }
-
-      .layout.center-aligned {
-        -ms-flex-line-pack: center;  /* IE10 */
-        -ms-align-content: center;
-        -webkit-align-content: center;
-        align-content: center;
-      }
-
-      .layout.between-aligned {
-        -ms-flex-line-pack: justify;  /* IE10 */
-        -ms-align-content: space-between;
-        -webkit-align-content: space-between;
-        align-content: space-between;
-      }
-
-      .layout.around-aligned {
-        -ms-flex-line-pack: distribute;  /* IE10 */
-        -ms-align-content: space-around;
-        -webkit-align-content: space-around;
-        align-content: space-around;
-      }
-    </style>
-  </template>
-</dom-module>
-
-<dom-module id="iron-flex-factors">
-  <template>
-    <style>
-      .flex,
-      .flex-1 {
-        -ms-flex: 1 1 0.000000001px;
-        -webkit-flex: 1;
-        flex: 1;
-        -webkit-flex-basis: 0.000000001px;
-        flex-basis: 0.000000001px;
-      }
-
-      .flex-2 {
-        -ms-flex: 2;
-        -webkit-flex: 2;
-        flex: 2;
-      }
-
-      .flex-3 {
-        -ms-flex: 3;
-        -webkit-flex: 3;
-        flex: 3;
-      }
-
-      .flex-4 {
-        -ms-flex: 4;
-        -webkit-flex: 4;
-        flex: 4;
-      }
-
-      .flex-5 {
-        -ms-flex: 5;
-        -webkit-flex: 5;
-        flex: 5;
-      }
-
-      .flex-6 {
-        -ms-flex: 6;
-        -webkit-flex: 6;
-        flex: 6;
-      }
-
-      .flex-7 {
-        -ms-flex: 7;
-        -webkit-flex: 7;
-        flex: 7;
-      }
-
-      .flex-8 {
-        -ms-flex: 8;
-        -webkit-flex: 8;
-        flex: 8;
-      }
-
-      .flex-9 {
-        -ms-flex: 9;
-        -webkit-flex: 9;
-        flex: 9;
-      }
-
-      .flex-10 {
-        -ms-flex: 10;
-        -webkit-flex: 10;
-        flex: 10;
-      }
-
-      .flex-11 {
-        -ms-flex: 11;
-        -webkit-flex: 11;
-        flex: 11;
-      }
-
-      .flex-12 {
-        -ms-flex: 12;
-        -webkit-flex: 12;
-        flex: 12;
-      }
-    </style>
-  </template>
-</dom-module>
-
-<!-- Non-flexbox positioning helper styles -->
-<dom-module id="iron-positioning">
-  <template>
-    <style>
-      .block {
-        display: block;
-      }
-
-      /* IE 10 support for HTML5 hidden attr */
-      [hidden] {
-        display: none !important;
-      }
-
-      .invisible {
-        visibility: hidden !important;
-      }
-
-      .relative {
-        position: relative;
-      }
-
-      .fit {
-        position: absolute;
-        top: 0;
-        right: 0;
-        bottom: 0;
-        left: 0;
-      }
-
-      body.fullbleed {
-        margin: 0;
-        height: 100vh;
-      }
-
-      .scroll {
-        -webkit-overflow-scrolling: touch;
-        overflow: auto;
-      }
-
-      /* fixed position */
-      .fixed-bottom,
-      .fixed-left,
-      .fixed-right,
-      .fixed-top {
-        position: fixed;
-      }
-
-      .fixed-top {
-        top: 0;
-        left: 0;
-        right: 0;
-      }
-
-      .fixed-right {
-        top: 0;
-        right: 0;
-        bottom: 0;
-      }
-
-      .fixed-bottom {
-        right: 0;
-        bottom: 0;
-        left: 0;
-      }
-
-      .fixed-left {
-        top: 0;
-        bottom: 0;
-        left: 0;
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/iron-flex-layout.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/iron-flex-layout.html
deleted file mode 100644
index a69f46a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/iron-flex-layout.html
+++ /dev/null
@@ -1,418 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-The `<iron-flex-layout>` component provides simple ways to use
-[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes),
-also known as flexbox. This component provides two different ways to use flexbox:
-
-1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
-The layout class stylesheet provides a simple set of class-based flexbox rules, that
-let you specify layout properties directly in markup. You must include this file
-in every element that needs to use them.
-
-    Sample use:
-
-    ```
-    <custom-element-demo>
-      <template>
-        <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-        <next-code-block></next-code-block>
-      </template>
-    </custom-element-demo>
-    ```
-
-    ```html
-    <link rel="import" href="iron-flex-layout-classes.html">
-    <style is="custom-style" include="iron-flex iron-flex-alignment"></style>
-    <style>
-      .test { width: 100px; }
-    </style>
-    <div class="layout horizontal center-center">
-      <div class="test">horizontal layout center alignment</div>
-    </div>
-    ```
-
-2. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html).
-The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function.
-
-Please note that the old [/deep/ layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/classes)
-are deprecated, and should not be used. To continue using layout properties
-directly in markup, please switch to using the new `dom-module`-based
-[layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html).
-Please note that the new version does not use `/deep/`, and therefore requires you
-to import the `dom-modules` in every element that needs to use them.
-
-A complete [guide](https://elements.polymer-project.org/guides/flex-layout) to `<iron-flex-layout>` is available.
-
-@group Iron Elements
-@pseudoElement iron-flex-layout
-@demo demo/index.html
--->
-
-<style>
-  /* IE 10 support for HTML5 hidden attr */
-  [hidden] {
-    display: none !important;
-  }
-</style>
-
-<style is="custom-style">
-  :root {
-
-    --layout: {
-      display: -ms-flexbox;
-      display: -webkit-flex;
-      display: flex;
-    };
-
-    --layout-inline: {
-      display: -ms-inline-flexbox;
-      display: -webkit-inline-flex;
-      display: inline-flex;
-    };
-
-    --layout-horizontal: {
-      @apply(--layout);
-
-      -ms-flex-direction: row;
-      -webkit-flex-direction: row;
-      flex-direction: row;
-    };
-
-    --layout-horizontal-reverse: {
-      @apply(--layout);
-
-      -ms-flex-direction: row-reverse;
-      -webkit-flex-direction: row-reverse;
-      flex-direction: row-reverse;
-    };
-
-    --layout-vertical: {
-      @apply(--layout);
-
-      -ms-flex-direction: column;
-      -webkit-flex-direction: column;
-      flex-direction: column;
-    };
-
-    --layout-vertical-reverse: {
-      @apply(--layout);
-
-      -ms-flex-direction: column-reverse;
-      -webkit-flex-direction: column-reverse;
-      flex-direction: column-reverse;
-    };
-
-    --layout-wrap: {
-      -ms-flex-wrap: wrap;
-      -webkit-flex-wrap: wrap;
-      flex-wrap: wrap;
-    };
-
-    --layout-no-wrap: {
-      -ms-flex-wrap: nowrap;
-      -webkit-flex-wrap: nowrap;
-      flex-wrap: nowrap;
-    };
-
-    --layout-wrap-reverse: {
-      -ms-flex-wrap: wrap-reverse;
-      -webkit-flex-wrap: wrap-reverse;
-      flex-wrap: wrap-reverse;
-    };
-
-    --layout-flex-auto: {
-      -ms-flex: 1 1 auto;
-      -webkit-flex: 1 1 auto;
-      flex: 1 1 auto;
-    };
-
-    --layout-flex-none: {
-      -ms-flex: none;
-      -webkit-flex: none;
-      flex: none;
-    };
-
-    --layout-flex: {
-      -ms-flex: 1 1 0.000000001px;
-      -webkit-flex: 1;
-      flex: 1;
-      -webkit-flex-basis: 0.000000001px;
-      flex-basis: 0.000000001px;
-    };
-
-    --layout-flex-2: {
-      -ms-flex: 2;
-      -webkit-flex: 2;
-      flex: 2;
-    };
-
-    --layout-flex-3: {
-      -ms-flex: 3;
-      -webkit-flex: 3;
-      flex: 3;
-    };
-
-    --layout-flex-4: {
-      -ms-flex: 4;
-      -webkit-flex: 4;
-      flex: 4;
-    };
-
-    --layout-flex-5: {
-      -ms-flex: 5;
-      -webkit-flex: 5;
-      flex: 5;
-    };
-
-    --layout-flex-6: {
-      -ms-flex: 6;
-      -webkit-flex: 6;
-      flex: 6;
-    };
-
-    --layout-flex-7: {
-      -ms-flex: 7;
-      -webkit-flex: 7;
-      flex: 7;
-    };
-
-    --layout-flex-8: {
-      -ms-flex: 8;
-      -webkit-flex: 8;
-      flex: 8;
-    };
-
-    --layout-flex-9: {
-      -ms-flex: 9;
-      -webkit-flex: 9;
-      flex: 9;
-    };
-
-    --layout-flex-10: {
-      -ms-flex: 10;
-      -webkit-flex: 10;
-      flex: 10;
-    };
-
-    --layout-flex-11: {
-      -ms-flex: 11;
-      -webkit-flex: 11;
-      flex: 11;
-    };
-
-    --layout-flex-12: {
-      -ms-flex: 12;
-      -webkit-flex: 12;
-      flex: 12;
-    };
-
-    /* alignment in cross axis */
-
-    --layout-start: {
-      -ms-flex-align: start;
-      -webkit-align-items: flex-start;
-      align-items: flex-start;
-    };
-
-    --layout-center: {
-      -ms-flex-align: center;
-      -webkit-align-items: center;
-      align-items: center;
-    };
-
-    --layout-end: {
-      -ms-flex-align: end;
-      -webkit-align-items: flex-end;
-      align-items: flex-end;
-    };
-
-    --layout-baseline: {
-      -ms-flex-align: baseline;
-      -webkit-align-items: baseline;
-      align-items: baseline;
-    };
-
-    /* alignment in main axis */
-
-    --layout-start-justified: {
-      -ms-flex-pack: start;
-      -webkit-justify-content: flex-start;
-      justify-content: flex-start;
-    };
-
-    --layout-center-justified: {
-      -ms-flex-pack: center;
-      -webkit-justify-content: center;
-      justify-content: center;
-    };
-
-    --layout-end-justified: {
-      -ms-flex-pack: end;
-      -webkit-justify-content: flex-end;
-      justify-content: flex-end;
-    };
-
-    --layout-around-justified: {
-      -ms-flex-pack: distribute;
-      -webkit-justify-content: space-around;
-      justify-content: space-around;
-    };
-
-    --layout-justified: {
-      -ms-flex-pack: justify;
-      -webkit-justify-content: space-between;
-      justify-content: space-between;
-    };
-
-    --layout-center-center: {
-      @apply(--layout-center);
-      @apply(--layout-center-justified);
-    };
-
-    /* self alignment */
-
-    --layout-self-start: {
-      -ms-align-self: flex-start;
-      -webkit-align-self: flex-start;
-      align-self: flex-start;
-    };
-
-    --layout-self-center: {
-      -ms-align-self: center;
-      -webkit-align-self: center;
-      align-self: center;
-    };
-
-    --layout-self-end: {
-      -ms-align-self: flex-end;
-      -webkit-align-self: flex-end;
-      align-self: flex-end;
-    };
-
-    --layout-self-stretch: {
-      -ms-align-self: stretch;
-      -webkit-align-self: stretch;
-      align-self: stretch;
-    };
-
-    --layout-self-baseline: {
-      -ms-align-self: baseline;
-      -webkit-align-self: baseline;
-      align-self: baseline;
-    };
-
-    /* multi-line alignment in main axis */
-
-    --layout-start-aligned: {
-      -ms-flex-line-pack: start;  /* IE10 */
-      -ms-align-content: flex-start;
-      -webkit-align-content: flex-start;
-      align-content: flex-start;
-    };
-
-    --layout-end-aligned: {
-      -ms-flex-line-pack: end;  /* IE10 */
-      -ms-align-content: flex-end;
-      -webkit-align-content: flex-end;
-      align-content: flex-end;
-    };
-
-    --layout-center-aligned: {
-      -ms-flex-line-pack: center;  /* IE10 */
-      -ms-align-content: center;
-      -webkit-align-content: center;
-      align-content: center;
-    };
-
-    --layout-between-aligned: {
-      -ms-flex-line-pack: justify;  /* IE10 */
-      -ms-align-content: space-between;
-      -webkit-align-content: space-between;
-      align-content: space-between;
-    };
-
-    --layout-around-aligned: {
-      -ms-flex-line-pack: distribute;  /* IE10 */
-      -ms-align-content: space-around;
-      -webkit-align-content: space-around;
-      align-content: space-around;
-    };
-
-    /*******************************
-              Other Layout
-    *******************************/
-
-    --layout-block: {
-      display: block;
-    };
-
-    --layout-invisible: {
-      visibility: hidden !important;
-    };
-
-    --layout-relative: {
-      position: relative;
-    };
-
-    --layout-fit: {
-      position: absolute;
-      top: 0;
-      right: 0;
-      bottom: 0;
-      left: 0;
-    };
-
-    --layout-scroll: {
-      -webkit-overflow-scrolling: touch;
-      overflow: auto;
-    };
-
-    --layout-fullbleed: {
-      margin: 0;
-      height: 100vh;
-    };
-
-    /* fixed position */
-
-    --layout-fixed-top: {
-      position: fixed;
-      top: 0;
-      left: 0;
-      right: 0;
-    };
-
-    --layout-fixed-right: {
-      position: fixed;
-      top: 0;
-      right: 0;
-      bottom: 0;
-    };
-
-    --layout-fixed-bottom: {
-      position: fixed;
-      right: 0;
-      bottom: 0;
-      left: 0;
-    };
-
-    --layout-fixed-left: {
-      position: fixed;
-      top: 0;
-      bottom: 0;
-      left: 0;
-    };
-
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/index.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/index.html
deleted file mode 100644
index 90e12a7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>iron-flex-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-
-  <body>
-    <script>
-      WCT.loadSuites([
-        'iron-flex-layout.html',
-        'iron-flex-layout.html?dom=shadow',
-        'iron-flex-layout-classes.html',
-        'iron-flex-layout-classes.html?dom=shadow'
-      ]);
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/iron-flex-layout-classes.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/iron-flex-layout-classes.html
deleted file mode 100644
index 3173b30..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/iron-flex-layout-classes.html
+++ /dev/null
@@ -1,412 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>iron-flex-layout-classes tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../iron-flex-layout-classes.html">
-
-    <style is="custom-style" include="iron-flex iron-flex-reverse iron-flex-factors iron-flex-alignment iron-positioning">
-      body {
-        margin: 0;
-        padding: 0;
-      }
-      .container {
-        width: 300px;
-        min-height: 50px;
-        background-color: #ccc;
-      }
-      .container > div {
-        width: 50px;
-        min-height: 50px; /* so that it can grow in vertical layouts. */
-      }
-      /* IE11 does not calculate flex proportions correctly in a vertical
-       * layout if the children just have a min-height. For those tests,
-       * use a fixed height instead. */
-      .container > div.fixed-height {
-        min-height: 0;
-        height: 50px;
-      }
-      .container.relative > div {
-        min-width: 50px;
-        min-height: 50px;
-        width: inherit;
-      }
-      .container.small { width: 120px; }
-      .container.tall { height: 300px; }
-
-      #c1 { background-color: #E91E63; }
-      #c2 { background-color: #03A9F4; }
-      #c3 { background-color: #CDDC39; }
-      #c4 { background-color: #03A9F4; }
-      #c5 { background-color: #E91E63; }
-    </style>
-  </head>
-  <body>
-    <test-fixture id="basic">
-      <template>
-        <div class="container layout">
-          <div id="c1"></div>
-          <div id="c2"></div>
-          <div id="c3"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="flex">
-      <template>
-        <div class="container layout">
-          <div id="c1" class="fixed-height"></div>
-          <div id="c2" class="fixed-height"></div>
-          <div id="c3" class="fixed-height"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="single-child">
-      <template>
-        <div class="container layout">
-          <div id="c1"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="positioning">
-      <template>
-        <div class="container layout relative">
-          <div id="c1"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="align-content">
-      <template>
-        <div class="container layout">
-          <div id="c1"></div>
-          <div id="c2"></div>
-          <div id="c3"></div>
-          <div id="c4"></div>
-          <div id="c5"></div>
-        </div>
-      </template>
-    </test-fixture>
-    <script>
-      function positionEquals(node, top, bottom, left, right) {
-        var rect = node.getBoundingClientRect();
-        return rect.top === top && rect.bottom === bottom && 
-               rect.left === left && rect.right === right;
-      }
-      suite('basic layout', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('basic');
-        });
-
-        test('layout-horizontal', function() {
-          container.classList.add('horizontal');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          // |c1| |c2| |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 100, 150), "child 3 position ok");
-        });
-
-        test('layout-horizontal-reverse', function() {
-          container.classList.add('horizontal-reverse');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          //     |c3| |c2| |c1|
-          assert.isTrue(positionEquals(c1, 0, 50, 250, 300), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 200, 250), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 150, 200), "child 3 position ok");
-        });
-
-        test('layout-vertical', function() {
-          container.classList.add('vertical');
-          assert.isTrue(positionEquals(container, 0, 150, 0, 300), "container position ok");
-          // vertically, |c1| |c2| |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 100, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 100, 150, 0, 50), "child 3 position ok");
-        });
-
-        test('layout-vertical-reverse', function() {
-          container.classList.add('vertical-reverse');
-          assert.isTrue(positionEquals(container, 0, 150, 0, 300), "container position ok");
-          // vertically, |c3| |c2| |c1|
-          assert.isTrue(positionEquals(c1, 100, 150, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 100, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 0, 50), "child 3 position ok");
-        });
-
-        test('layout-wrap', function() {
-          container.classList.add('horizontal');
-          container.classList.add('wrap');
-          container.classList.add('small');
-          assert.isTrue(positionEquals(container, 0, 100, 0, 120), "container position ok");
-          // |c1| |c2|
-          // |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 50, 100, 0, 50), "child 3 position ok");
-        });
-
-        test('layout-wrap-reverse', function() {
-          container.classList.add('horizontal-reverse');
-          container.classList.add('wrap-reverse');
-          container.style.width = '100px';
-          assert.isTrue(positionEquals(container, 0, 100, 0, 100), "container position ok");
-          //      |c3|
-          // |c2| |c1|
-          assert.isTrue(positionEquals(c1, 50, 100, 50, 100), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 100, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 50, 100), "child 3 position ok");
-        });
-      });
-
-      suite('flex', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('flex');
-        });
-
-        test('layout-flex child in a horizontal layout', function() {
-          container.classList.add('horizontal');
-          c2.classList.add('flex');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          // |c1| |    c2    | |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 250), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 250, 300), "child 3 position ok");
-        });
-
-        test('layout-flex child in a vertical layout', function() {
-          container.classList.add('vertical');
-          container.classList.add('tall');
-          c2.classList.add('flex');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          // vertically, |c1| |    c2    | |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 250, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 250, 300, 0, 50), "child 3 position ok");
-        });
-
-        test('layout-flex, layout-flex-2, layout-flex-3 in a horizontal layout', function() {
-          container.classList.add('horizontal');
-          c1.classList.add('flex');
-          c2.classList.add('flex-2');
-          c3.classList.add('flex-3');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          // |c1| | c2 | |  c3  |
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 150), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 150, 300), "child 3 position ok");
-        });
-
-        test('layout-flex, layout-flex-2, layout-flex-3 in a vertical layout', function() {
-          container.classList.add('vertical');
-          container.classList.add('tall');
-          c1.classList.add('flex');
-          c2.classList.add('flex-2');
-          c3.classList.add('flex-3');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          // vertically, |c1| | c2 | |  c3  |
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 150, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 150, 300, 0, 50), "child 3 position ok");
-        });
-      });
-
-      suite('alignment', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('single-child');
-          container.classList.add('horizontal');
-        });
-
-        test('stretch (default)', function() {
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 300, 0, 50), "child 1 position ok");
-        });
-
-        test('layout-center', function() {
-          container.classList.add('center');
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, center, center + 50, 0, 50), "child 1 position ok");
-        });
-
-        test('layout-start', function() {
-          container.classList.add('start');
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-        });
-
-        test('layout-end', function() {
-          container.classList.add('end');
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 250, 300, 0, 50), "child 1 position ok");
-        });
-
-        test('layout-start-justified', function() {
-          container.classList.add('start-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-        });
-
-        test('layout-end-justified', function() {
-          container.classList.add('end-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 250, 300), "child 1 position ok");
-        });
-
-        test('layout-center-justified', function() {
-          container.classList.add('center-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 0, 50, center, center + 50), "child 1 position ok");
-        });
-      });
-
-      suite('justification', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('flex');
-          container.classList.add('horizontal');
-        });
-
-        test('layout-justified', function() {
-          container.classList.add('justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, center, center + 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 250, 300), "child 3 position ok");
-        });
-
-        test('layout-around-justified', function() {
-          container.classList.add('around-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          var spacing = (300 - 50 * 3) / 6;
-          // Every child gets `spacing` on its left and right side.
-          assert.isTrue(positionEquals(c1, 0, 50, spacing, spacing + 50), "child 1 position ok");
-          var end = spacing + 50 + spacing;
-          assert.isTrue(positionEquals(c2, 0, 50, end + spacing, end + spacing + 50), "child 2 position ok");
-          end = end + spacing + 50 + spacing;
-          assert.isTrue(positionEquals(c3, 0, 50, end + spacing, end + spacing + 50), "child 3 position ok");
-        });
-      });
-
-      suite('align-content', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('align-content');
-          container.classList.add('small');
-          container.classList.add('tall');
-          container.classList.add('horizontal');
-          container.classList.add('flex');
-          container.classList.add('wrap');
-        });
-
-        test('default is stretch', function() {
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 100, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 100, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 100, 200, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, 100, 200, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 200, 300, 0, 50), "child 5 position ok");
-        });
-
-        test('layout-start-aligned', function() {
-          container.classList.add('start-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 50, 100, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, 50, 100, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 100, 150, 0, 50), "child 5 position ok");
-        });
-
-        test('layout-end-aligned', function() {
-          container.classList.add('end-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          assert.isTrue(positionEquals(c1, 150, 200, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 150, 200, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 200, 250, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, 200, 250, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 250, 300, 0, 50), "child 5 position ok");
-        });
-
-        test('layout-center-aligned', function() {
-          container.classList.add('center-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, center-50, center, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, center-50, center, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, center, center+50, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, center, center+50, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, center+50, center+100, 0, 50), "child 5 position ok");
-        });
-
-        test('layout-between-aligned', function() {
-          container.classList.add('between-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, center, center+50, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, center, center+50, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 250, 300, 0, 50), "child 5 position ok");
-        });
-
-        test('layout-around-aligned', function() {
-          container.classList.add('around-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 25, 75, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 25, 75, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, center, center+50, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, center, center+50, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 225, 275, 0, 50), "child 5 position ok");
-        });
-      });
-
-      suite('positioning', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('positioning');
-          container.classList.add('tall');
-        });
-
-        test('layout-fit', function() {
-          c1.classList.add('fit');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "child 1 position ok");
-        });
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/iron-flex-layout.html b/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/iron-flex-layout.html
deleted file mode 100644
index f209087..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-flex-layout/test/iron-flex-layout.html
+++ /dev/null
@@ -1,434 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>iron-flex-layout tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../iron-flex-layout.html">
-
-    <style is="custom-style">
-      body {
-        margin: 0;
-        padding: 0;
-      }
-      .container {
-        width: 300px;
-        min-height: 50px;
-        background-color: #ccc;
-      }
-      .container > div {
-        width: 50px;
-        min-height: 50px; /* so that it can grow in vertical layouts. */
-      }
-      /* IE11 does not calculate flex proportions correctly in a vertical
-       * layout if the children just have a min-height. For those tests,
-       * use a fixed height instead. */
-      .container > div.fixed-height {
-        min-height: 0;
-        height: 50px;
-      }
-      .relative { @apply(--layout-relative); }
-      .container.relative > div {
-        min-width: 50px;
-        min-height: 50px;
-        width: inherit;
-      }
-      .container.small { width: 120px; }
-      .container.tall { height: 300px; }
-
-      #c1 { background-color: #E91E63; }
-      #c2 { background-color: #03A9F4; }
-      #c3 { background-color: #CDDC39; }
-      #c4 { background-color: #03A9F4; }
-      #c5 { background-color: #E91E63; }
-
-      .horizontal { @apply(--layout-horizontal); }
-      .horizontal-reverse { @apply(--layout-horizontal-reverse); }
-      .vertical { @apply(--layout-vertical); }
-      .vertical-reverse { @apply(--layout-vertical-reverse); }
-      .wrap { @apply(--layout-wrap); }
-      .wrap-reverse { @apply(--layout-wrap-reverse); }
-      .flex { @apply(--layout-flex); }
-      .flex2 { @apply(--layout-flex-2); }
-      .flex3 { @apply(--layout-flex-3); }
-      .center { @apply(--layout-center); }
-      .start { @apply(--layout-start); }
-      .end { @apply(--layout-end); }
-      .start-justified { @apply(--layout-start-justified); }
-      .center-justified { @apply(--layout-center-justified); }
-      .end-justified { @apply(--layout-end-justified); }
-      .justified { @apply(--layout-justified); }
-      .around-justified { @apply(--layout-around-justified); }
-      .fit { @apply(--layout-fit); }
-      .start-aligned { @apply(--layout-start-aligned); }
-      .end-aligned { @apply(--layout-end-aligned); }
-      .center-aligned { @apply(--layout-center-aligned); }
-      .between-aligned { @apply(--layout-between-aligned); }
-      .around-aligned { @apply(--layout-around-aligned); }
-
-    </style>
-  </head>
-  <body>
-    <test-fixture id="basic">
-      <template>
-        <div class="container">
-          <div id="c1"></div>
-          <div id="c2"></div>
-          <div id="c3"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="flex">
-      <template>
-        <div class="container">
-          <div id="c1" class="fixed-height"></div>
-          <div id="c2" class="fixed-height"></div>
-          <div id="c3" class="fixed-height"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="single-child">
-      <template>
-        <div class="container">
-          <div id="c1"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="positioning">
-      <template>
-        <div class="container relative">
-          <div id="c1"></div>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="align-content">
-      <template>
-        <div class="container small tall horizontal flex wrap">
-          <div id="c1"></div>
-          <div id="c2"></div>
-          <div id="c3"></div>
-          <div id="c4"></div>
-          <div id="c5"></div>
-        </div>
-      </template>
-    </test-fixture>
-    <script>
-      function positionEquals(node, top, bottom, left, right) {
-        var rect = node.getBoundingClientRect();
-        return rect.top === top && rect.bottom === bottom && 
-               rect.left === left && rect.right === right;
-      }
-      suite('basic layout', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('basic');
-        });
-
-        test('--layout-horizontal', function() {
-          container.classList.add('horizontal');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          // |c1| |c2| |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 100, 150), "child 3 position ok");
-        });
-
-        test('--layout-horizontal-reverse', function() {
-          container.classList.add('horizontal-reverse');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          //     |c3| |c2| |c1|
-          assert.isTrue(positionEquals(c1, 0, 50, 250, 300), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 200, 250), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 150, 200), "child 3 position ok");
-        });
-
-        test('--layout-vertical', function() {
-          container.classList.add('vertical');
-          assert.isTrue(positionEquals(container, 0, 150, 0, 300), "container position ok");
-          // vertically, |c1| |c2| |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 100, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 100, 150, 0, 50), "child 3 position ok");
-        });
-
-        test('--layout-vertical-reverse', function() {
-          container.classList.add('vertical-reverse');
-          assert.isTrue(positionEquals(container, 0, 150, 0, 300), "container position ok");
-          // vertically, |c3| |c2| |c1|
-          assert.isTrue(positionEquals(c1, 100, 150, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 100, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 0, 50), "child 3 position ok");
-        });
-
-        test('--layout-wrap', function() {
-          container.classList.add('horizontal');
-          container.classList.add('wrap');
-          container.classList.add('small');
-          assert.isTrue(positionEquals(container, 0, 100, 0, 120), "container position ok");
-          // |c1| |c2|
-          // |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 50, 100, 0, 50), "child 3 position ok");
-        });
-
-        test('--layout-wrap-reverse', function() {
-          container.classList.add('horizontal');
-          container.classList.add('wrap-reverse');
-          container.classList.add('small');
-          assert.isTrue(positionEquals(container, 0, 100, 0, 120), "container position ok");
-          // |c3|
-          // |c1| |c2|
-          assert.isTrue(positionEquals(c1, 50, 100, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 100, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 0, 50), "child 3 position ok");
-        });
-      });
-
-      suite('flex', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('flex');
-        });
-
-        test('--layout-flex child in a horizontal layout', function() {
-          container.classList.add('horizontal');
-          c2.classList.add('flex');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          // |c1| |    c2    | |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 250), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 250, 300), "child 3 position ok");
-        });
-
-        test('--layout-flex child in a vertical layout', function() {
-          container.classList.add('vertical');
-          container.classList.add('tall');
-          c2.classList.add('flex');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          // vertically, |c1| |    c2    | |c3|
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 250, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 250, 300, 0, 50), "child 3 position ok");
-        });
-
-        test('--layout-flex, --layout-flex-2, --layout-flex-3 in a horizontal layout', function() {
-          container.classList.add('horizontal');
-          c1.classList.add('flex');
-          c2.classList.add('flex2');
-          c3.classList.add('flex3');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          // |c1| | c2 | |  c3  |
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 150), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 150, 300), "child 3 position ok");
-        });
-
-        test('--layout-flex, --layout-flex-2, --layout-flex-3 in a vertical layout', function() {
-          container.classList.add('vertical');
-          container.classList.add('tall');
-          c1.classList.add('flex');
-          c2.classList.add('flex2');
-          c3.classList.add('flex3');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          // vertically, |c1| | c2 | |  c3  |
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 50, 150, 0, 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 150, 300, 0, 50), "child 3 position ok");
-        });
-      });
-
-      suite('alignment', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('single-child');
-          container.classList.add('horizontal');
-        });
-
-        test('stretch (default)', function() {
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 300, 0, 50), "child 1 position ok");
-        });
-
-        test('--layout-center', function() {
-          container.classList.add('center');
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, center, center + 50, 0, 50), "child 1 position ok");
-        });
-
-        test('--layout-start', function() {
-          container.classList.add('start');
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-        });
-
-        test('--layout-end', function() {
-          container.classList.add('end');
-          container.classList.add('tall');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 250, 300, 0, 50), "child 1 position ok");
-        });
-
-        test('--layout-start-justified', function() {
-          container.classList.add('start-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-        });
-
-        test('--layout-end-justified', function() {
-          container.classList.add('end-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 250, 300), "child 1 position ok");
-        });
-
-        test('--layout-center-justified', function() {
-          container.classList.add('center-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 0, 50, center, center + 50), "child 1 position ok");
-        });
-      });
-
-      suite('justification', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('flex');
-          container.classList.add('horizontal');
-        });
-
-        test('--layout-justified', function() {
-          container.classList.add('justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, center, center + 50), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 0, 50, 250, 300), "child 3 position ok");
-        });
-
-        test('--layout-around-justified', function() {
-          container.classList.add('around-justified');
-          assert.isTrue(positionEquals(container, 0, 50, 0, 300), "container position ok");
-          var spacing = (300 - 50 * 3) / 6;
-          // Every child gets `spacing` on its left and right side.
-          assert.isTrue(positionEquals(c1, 0, 50, spacing, spacing + 50), "child 1 position ok");
-          var end = spacing + 50 + spacing;
-          assert.isTrue(positionEquals(c2, 0, 50, end + spacing, end + spacing + 50), "child 2 position ok");
-          end = end + spacing + 50 + spacing;
-          assert.isTrue(positionEquals(c3, 0, 50, end + spacing, end + spacing + 50), "child 3 position ok");
-        });
-      });
-
-      suite('align-content', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('align-content');
-        });
-
-        test('default is stretch', function() {
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 100, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 100, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 100, 200, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, 100, 200, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 200, 300, 0, 50), "child 5 position ok");
-        });
-
-        test('--layout-start-aligned', function() {
-          container.classList.add('start-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 50, 100, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, 50, 100, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 100, 150, 0, 50), "child 5 position ok");
-        });
-
-        test('--layout-end-aligned', function() {
-          container.classList.add('end-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          assert.isTrue(positionEquals(c1, 150, 200, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 150, 200, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, 200, 250, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, 200, 250, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 250, 300, 0, 50), "child 5 position ok");
-        });
-
-        test('--layout-center-aligned', function() {
-          container.classList.add('center-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, center-50, center, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, center-50, center, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, center, center+50, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, center, center+50, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, center+50, center+100, 0, 50), "child 5 position ok");
-        });
-
-        test('--layout-between-aligned', function() {
-          container.classList.add('between-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 0, 50, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 0, 50, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, center, center+50, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, center, center+50, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 250, 300, 0, 50), "child 5 position ok");
-        });
-
-        test('--layout-around-aligned', function() {
-          container.classList.add('around-aligned');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 120), "container position ok");
-          var center = (300 - 50) / 2;
-          assert.isTrue(positionEquals(c1, 25, 75, 0, 50), "child 1 position ok");
-          assert.isTrue(positionEquals(c2, 25, 75, 50, 100), "child 2 position ok");
-          assert.isTrue(positionEquals(c3, center, center+50, 0, 50), "child 3 position ok");
-          assert.isTrue(positionEquals(c4, center, center+50, 50, 100), "child 4 position ok");
-          assert.isTrue(positionEquals(c5, 225, 275, 0, 50), "child 5 position ok");
-        });
-      });
-
-      suite('positioning', function() {
-        var container;
-
-        setup(function() {
-          container = fixture('positioning');
-          container.classList.add('tall');
-
-        });
-
-        test('--layout-fit', function() {
-          c1.classList.add('fit');
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "container position ok");
-          assert.isTrue(positionEquals(container, 0, 300, 0, 300), "child 1 position ok");
-        });
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/README.md
deleted file mode 100644
index a6e1ca5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-form-element-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-form-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-form-element-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-form-element-behavior)_
-
-
-##Polymer.IronFormElementBehavior
-
-  Polymer.IronFormElementBehavior enables a custom element to be included
-  in an `iron-form`.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/bower.json
deleted file mode 100644
index 680c2a2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/bower.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "iron-form-element-behavior",
-  "version": "1.0.7",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "private": true,
-  "main": "iron-form-element-behavior.html",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "description": "Enables a custom element to be included in an iron-form",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "form"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-form-element-behavior.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/index.html
deleted file mode 100644
index e919d0b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/index.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>iron-form-element-behavior demo</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../paper-styles/demo-pages.html">
-    <link rel="import" href="simple-form.html">
-    <link rel="import" href="simple-element.html">
-  </head>
-  <style>
-    input {
-      margin-bottom: 24px;
-      width: 200px;
-    }
-  </style>
-  <body>
-
-    <div class="vertical-section-container centered">
-      <div class="vertical-section">
-        <form is="simple-form" id="form">
-          Element with iron-form-element-behavior <input is="simple-element" type="text" name="one" value="one">
-          <br>
-          Element without iron-form-element-behavior <input type="text" name="two" value="two">
-          <br>
-          Element with iron-form-element-behavior <input is="simple-element" type="text" name="three" value="three">
-        </form>
-
-        <h4>Elements tracked by the form: <button onclick="update()">Update</button> </h4>
-
-        <ul id="output">
-        </ul>
-      </div>
-    </div>
-
-    <script>
-      function update() {
-        var output = document.getElementById('output');
-        var elements = document.getElementById('form').formElements;
-        document.getElementById('output').innerHTML = '';
-        for (var i = 0; i < elements.length; i++) {
-          var li = document.createElement('li');
-          var text = document.createTextNode(elements[i].value);
-          li.appendChild(text);
-          output.appendChild(li);
-        }
-      }
-    </script>
-  </body>
-
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/simple-element.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/simple-element.html
deleted file mode 100644
index 4502769..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/simple-element.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-form-element-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'simple-element',
-
-    extends: 'input',
-
-    behaviors: [
-      Polymer.IronFormElementBehavior
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/simple-form.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/simple-form.html
deleted file mode 100644
index 4dc5dc6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/demo/simple-form.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-
-<script>
-
-  Polymer({
-
-    is: 'simple-form',
-
-    extends: 'form',
-
-    properties: {
-      formElements: {
-        type: Object,
-        notify: true
-      }
-    },
-
-    listeners: {
-      'iron-form-element-register': '_elementRegistered',
-      'iron-form-element-unregister': '_elementUnregistered'
-    },
-
-    ready: function() {
-      this.formElements = [];
-    },
-
-    _elementRegistered: function(e) {
-      this.formElements.push(e.target);
-      e.target._parentForm = this;
-    },
-
-    _elementUnregistered: function(e) {
-      var target = e.detail.target;
-      if (target) {
-        var index = this.formElements.indexOf(target);
-        if (index > -1) {
-          this.formElements.splice(index, 1);
-        }
-      }
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/index.html
deleted file mode 100644
index 8d748c0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-form-element-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/iron-form-element-behavior.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/iron-form-element-behavior.html
deleted file mode 100644
index cd9c6b4..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/iron-form-element-behavior.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-  /**
-  Polymer.IronFormElementBehavior enables a custom element to be included
-  in an `iron-form`.
-
-  @demo demo/index.html
-  @polymerBehavior
-  */
-  Polymer.IronFormElementBehavior = {
-
-    properties: {
-      /**
-       * Fired when the element is added to an `iron-form`.
-       *
-       * @event iron-form-element-register
-       */
-
-      /**
-       * Fired when the element is removed from an `iron-form`.
-       *
-       * @event iron-form-element-unregister
-       */
-
-      /**
-       * The name of this element.
-       */
-      name: {
-        type: String
-      },
-
-      /**
-       * The value for this element.
-       */
-      value: {
-        notify: true,
-        type: String
-      },
-
-      /**
-       * Set to true to mark the input as required. If used in a form, a
-       * custom element that uses this behavior should also use
-       * Polymer.IronValidatableBehavior and define a custom validation method.
-       * Otherwise, a `required` element will always be considered valid.
-       * It's also strongly recommended to provide a visual style for the element
-       * when its value is invalid.
-       */
-      required: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * The form that the element is registered to.
-       */
-      _parentForm: {
-        type: Object
-      }
-    },
-
-    attached: function() {
-      // Note: the iron-form that this element belongs to will set this
-      // element's _parentForm property when handling this event.
-      this.fire('iron-form-element-register');
-    },
-
-    detached: function() {
-      if (this._parentForm) {
-        this._parentForm.fire('iron-form-element-unregister', {target: this});
-      }
-    }
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/basic.html
deleted file mode 100644
index 5947a1e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/basic.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-form-element-behavior</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../iron-form-element-behavior.html">
-  <link rel="import" href="simple-element.html">
-  <link rel="import" href="simple-form.html">
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <form is="simple-form"></form>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('basic', function() {
-      var form;
-
-      setup(function() {
-        form = fixture('basic');
-      });
-
-      test('elements fire an event when attached', function(done) {
-        var element = document.createElement('input', 'simple-element');
-
-        var handler = sinon.spy();
-        form.addEventListener('iron-form-element-register', handler);
-
-        form.appendChild(element);
-        Polymer.Base.async(function() {
-          expect(handler.callCount).to.be.equal(1);
-          done();
-        }, 1);
-      });
-
-      test('elements fire an event when detached', function(done) {
-        var element = document.createElement('input', 'simple-element');
-        form.appendChild(element);
-        element._parentForm = form;
-
-        var handler = sinon.spy();
-        form.addEventListener('iron-form-element-unregister', handler);
-
-        form.removeChild(element);
-        Polymer.Base.async(function() {
-          expect(handler.callCount).to.be.equal(1);
-          done();
-        }, 1);
-      });
-  });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/index.html
deleted file mode 100644
index 3b2bada..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <meta charset="utf-8">
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'basic.html'
-      ]);
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/simple-element.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/simple-element.html
deleted file mode 100644
index b1aa300..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/simple-element.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-form-element-behavior.html">
-
-<script>
-
-  Polymer({
-    is: 'simple-element',
-    extends: 'input',
-    behaviors: [
-      Polymer.IronFormElementBehavior
-    ]
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/simple-form.html b/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/simple-form.html
deleted file mode 100644
index 7fa38d8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form-element-behavior/test/simple-form.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-
-<script>
-
-  Polymer({
-    is: 'simple-form',
-    extends: 'form'
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-form/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/README.md b/systrace/catapult/third_party/polymer/components/iron-form/README.md
deleted file mode 100644
index 0135714..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/README.md
+++ /dev/null
@@ -1,52 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-form.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-form.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-form)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-form)_
-
-
-## &lt;iron-form&gt;
-`<iron-form>` is a wrapper around the HTML `<form>` element, that can
-validate and submit both custom and native HTML elements.
-
-It has two modes: if `allow-redirect` is true, then after the form submission you
-will be redirected to the server response. Otherwise, if it is false, it will
-use an `iron-ajax` element to submit the form contents to the server.
-
-  Example:
-
-```html
-    <iron-form>
-      <form method="get" action="/form/handler">
-        <input type="text" name="name" value="Batman">
-        <input type="checkbox" name="donuts" checked> I like donuts<br>
-        <paper-checkbox name="cheese" value="yes" checked></paper-checkbox>
-      </form>
-    </iron-form>
-```
-
-By default, a native `<button>` element (or `input type="submit"`) will submit this form. However, if you
-want to submit it from a custom element's click handler, you need to explicitly
-call the `iron-form`'s `submit` method.
-
-  Example:
-
-```html
-    <paper-button raised onclick="submitForm()">Submit</paper-button>
-
-    function submitForm() {
-      document.getElementById('iron-form').submit();
-    }
-```
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/bower.json b/systrace/catapult/third_party/polymer/components/iron-form/bower.json
deleted file mode 100644
index d4048a2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/bower.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "name": "iron-form",
-  "version": "2.0.1",
-  "description": "Wrapper around native form that submits native and custom elements",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "form"
-  ],
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "main": "iron-form.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-form.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-form",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2",
-    "iron-ajax": "PolymerElements/iron-ajax#1 - 2"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
-    "paper-button": "PolymerElements/paper-button#1 - 2",
-    "paper-checkbox": "PolymerElements/paper-checkbox#1 - 2",
-    "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#1 - 2",
-    "paper-input": "PolymerElements/paper-input#1 - 2",
-    "paper-item": "PolymerElements/paper-item#1 - 2",
-    "paper-listbox": "PolymerElements/paper-listbox#1 - 2",
-    "paper-spinner": "PolymerElements/paper-spinner#1 - 2",
-    "paper-styles": "PolymerElements/paper-styles#1 - 2",
-    "web-component-tester": "Polymer/web-component-tester#^6.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "polymer": "Polymer/polymer#^1.9",
-        "iron-ajax": "PolymerElements/iron-ajax#^1.0.0"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-        "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-        "paper-button": "PolymerElements/paper-button#^1.0.0",
-        "paper-checkbox": "PolymerElements/paper-checkbox#^1.0.0",
-        "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
-        "paper-input": "PolymerElements/paper-input#^1.0.0",
-        "paper-item": "PolymerElements/paper-item#^1.0.0",
-        "paper-menu": "PolymerElements/paper-menu#^1.0.0",
-        "paper-spinner": "PolymerElements/paper-spinner#^1.0.0",
-        "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-        "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "web-component-tester": "Polymer/web-component-tester#^4.0.0",
-        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-      },
-      "resolutions": {
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/demo/cats-only.html b/systrace/catapult/third_party/polymer/components/iron-form/demo/cats-only.html
deleted file mode 100644
index 116df8b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/demo/cats-only.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validatable-behavior/iron-validatable-behavior.html">
-
-<dom-module id="cats-only">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-      }
-      input {
-        width: 250px;
-      }
-      :host([invalid]) input {
-        border-color: red;
-      }
-    </style>
-    <input value="{{value}}" id="input" placeholder="Type 'cats' to prove you like cats">
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-    is: 'cats-only',
-
-    properties: {
-      value: {
-        type: String
-      },
-
-      name: {
-        type: String
-      }
-    },
-
-    behaviors: [
-      Polymer.IronValidatableBehavior
-    ],
-
-    listeners: {
-      'input': '_onInput'
-    },
-
-    _onInput: function() {
-      this.value = this.$.input.value;
-    },
-
-    // Overidden from Polymer.IronValidatableBehavior. Will set the `invalid`
-    // attribute automatically, which should be used for styling.
-    _getValidity: function() {
-      return this.value === 'cats';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-form/demo/index.html
deleted file mode 100644
index 2bafe2c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/demo/index.html
+++ /dev/null
@@ -1,250 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-form demo</title>
-
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <meta name="mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../paper-input/paper-input.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../../paper-checkbox/paper-checkbox.html">
-  <link rel="import" href="../../paper-dropdown-menu/paper-dropdown-menu.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../paper-listbox/paper-listbox.html">
-  <link rel="import" href="../../paper-spinner/paper-spinner.html">
-  <link rel="import" href="../../paper-styles/shadow.html">
-  <link rel="import" href="../iron-form.html">
-  <link rel="import" href="cats-only.html">
-
-  <custom-style>
-    <style is="custom-style" include="demo-pages-shared-styles">
-      input, paper-input, paper-checkbox {
-        margin-bottom: 8px;
-      }
-      iron-form {
-        @apply --shadow-elevation-2dp;
-        padding: 20px;
-      }
-      paper-button {
-        display: inline-block;
-        width: 45%;
-        text-align: center;
-      }
-      #form1 paper-button {
-        width: 30%;
-      }
-      paper-button:not([disabled]) {
-        background: #03a9f4;
-        color: white;
-      }
-      paper-spinner {
-        width: 14px;
-        height: 14px;
-        margin-right: 20px;
-      }
-      .output {
-        margin-top: 20px;
-        word-wrap: break-word;
-        font-family: monospace;
-      }
-    </style>
-  </custom-style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Iron-form works with native and custom elements, and can prevent automatic redirection</h3>
-    <demo-snippet>
-      <template>
-        <input type="checkbox" checked onchange="form1.allowRedirect = !this.checked;"> Prevent automatic form redirection<br><br>
-
-        <iron-form id="form1">
-          <form action="/foo" method="get">
-            <paper-input type="text" name="name" required label="Name" value="Batman"></paper-input>
-            <input name="foo" required>
-            <input type="checkbox" name="donuts" checked>I like donuts<br>
-            <paper-checkbox name="food" value="pizza" checked>pizza</paper-checkbox><br>
-            <paper-checkbox name="food" value="cheese" required>cheese</paper-checkbox>
-            <br>
-            <paper-dropdown-menu label="Cars" name="cars" required>
-              <paper-listbox class="dropdown-content" slot="dropdown-content">
-                <paper-item value="volvo">Volvo</paper-item>
-                <paper-item value="saab">Saab</paper-item>
-                <paper-item value="fiat">Fiat</paper-item>
-                <paper-item value="audi">Audi</paper-item>
-              </paper-listbox>
-            </paper-dropdown-menu>
-            <br><br>
-            <paper-button raised onclick="form1.submit()">Submit</paper-button>
-            <paper-button raised onclick="form1.reset()">Reset</paper-button>
-            <paper-button raised onclick="form1.validate()">Validate</paper-button>
-          </form>
-          <br>
-          <div class="output"></div>
-        </iron-form>
-        <script>
-          form1.addEventListener('iron-form-submit', function(event) {
-            this.querySelector('.output').innerHTML = JSON.stringify(event.detail);
-          });
-        </script>
-      </template>
-    </demo-snippet>
-
-    <h3>You can submit a form in many different ways: by manually calling submit(),
-      using a native button, or by wrapping a paper-button in a native button:</h3>
-    <demo-snippet>
-      <template>
-        <iron-form id="form2">
-          <form action="/foo" method="get">
-            <paper-input label="Name" value="Batman" name="name"></paper-input>
-            <input type="checkbox" required> You must check this box.
-            <p>Using a native button to submit the form will display
-            the native browser validation UI for native elements: </p>
-            <button type="submit">Submit</button>
-            <button type="reset">Reset</button>
-
-            <p>Using a custom element to submit the form will not display
-            the native browser validation UI:</p>
-            <paper-button raised onclick="form2.submit()">Submit</paper-button>
-            <paper-button raised onclick="form2.reset()">Reset</paper-button>
-          </form>
-          <br>
-          <div class="output"></div>
-        </iron-form>
-        <script>
-          form2.addEventListener('iron-form-submit', function(event) {
-            this.querySelector('.output').innerHTML = JSON.stringify(event.detail);
-          });
-        </script>
-      </template>
-    </demo-snippet>
-
-    <h3>To customize the request sent to the server, you can listen to the `iron-form-presubmit` event</h3>
-    <demo-snippet>
-      <template>
-        <iron-form id="form3">
-          <form action="/foo" method="get">
-            <paper-input name="name" label="Name" value="Batman" required></paper-input>
-            <paper-button raised onclick="form3.submit()">Submit</paper-button>
-            <paper-button raised onclick="form3.reset()">Reset</paper-button>
-          </form>
-          <div class="output"></div>
-        </iron-form>
-        <script>
-          form3.addEventListener('iron-form-presubmit', function(event) {
-            this.request.params['sidekick'] = 'Robin';
-          });
-          form3.addEventListener('iron-form-submit', function(event) {
-            this.querySelector('.output').innerHTML = JSON.stringify(event.detail);
-          });
-        </script>
-      </template>
-    </demo-snippet>
-
-    <h3>Example of an <code>iron-form</code> reacting to state changes.</h3>
-    <p>This form will have the "Submit" button disabled until all fields
-      are valid, and then show a spinner during submission.</p>
-
-    <demo-snippet>
-      <template>
-        <iron-form id="form4">
-          <form action="/foo" method="get">
-            <paper-input name="name" label="Name" required auto-validate></paper-input>
-            <paper-checkbox name="read" required>You must check this box</paper-checkbox><br>
-
-            <paper-button raised onclick="_delayedSubmit(event)" disabled id="form4Submit">
-              <paper-spinner id="spinner" hidden></paper-spinner>Submit</paper-button>
-            <paper-button raised onclick="form4.reset()">Reset</paper-button>
-          </form>
-          <div class="output"></div>
-        </iron-form>
-        <script>
-          form4.addEventListener('iron-form-submit', function(event) {
-            this.querySelector('.output').innerHTML = JSON.stringify(event.detail);
-            spinner.active = false;
-            spinner.hidden = true;
-            form4Submit.disabled = false;
-          });
-          form4.addEventListener('change', function(event) {
-            // Validate the entire form to see if we should enable the `Submit` button.
-            form4Submit.disabled = !form4.validate();
-          });
-          function _delayedSubmit(event) {
-            spinner.active = true;
-            spinner.hidden = false;
-            form4Submit.disabled = true;
-            // Simulate a slow server response.
-            setTimeout(function() {
-              form4.submit()
-            }, 1000);
-          }
-        </script>
-      </template>
-    </demo-snippet>
-
-
-    <h3>Iron-form respects the novalidate form attribute</h3>
-    <demo-snippet>
-      <template>
-        <iron-form id="form5">
-          <form method="get" action="/foo" novalidate>
-            <paper-input name="name" label="Name" required></paper-input>
-            <cats-only name="cats"></cats-only>
-            <input name="animal" placeholder="animal" required value="meerkat"><br>
-            <paper-checkbox name="cheese" required>Cheese</paper-checkbox>
-            <br>
-            <paper-button raised onclick="form5.submit()">Submit</paper-button>
-            <paper-button raised onclick="form5.reset()">Reset</paper-button>
-          </form>
-          <div class="output"></div>
-        </iron-form>
-        <script>
-          form5.addEventListener('iron-form-submit', function(event) {
-            this.querySelector('.output').innerHTML = JSON.stringify(event.detail);
-          });
-        </script>
-      </template>
-    </demo-snippet>
-
-    <h3>Iron-form respects nested elements</h3>
-    <demo-snippet>
-      <template>
-        <iron-form id="form6">
-          <form method="get" action="/foo">
-            <p>
-              <input name="name" label="Name" required>
-              <cats-only name="cats"></cats-only>
-              <paper-checkbox name="cheese" required>Cheese</paper-checkbox>
-            </p>
-
-            <input type="submit" value="Submit">
-            <br>
-            <paper-button raised onclick="form6.submit()">Submit</paper-button>
-            <paper-button raised onclick="form6.reset()">Reset</paper-button>
-          </form>
-          <div class="output"></div>
-        </iron-form>
-        <script>
-          form6.addEventListener('iron-form-submit', function(event) {
-            this.querySelector('.output').innerHTML = JSON.stringify(event.detail);
-          });
-        </script>
-      </template>
-    </demo-snippet>
-  </div>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/index.html b/systrace/catapult/third_party/polymer/components/iron-form/index.html
deleted file mode 100644
index acd7140..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-form</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/iron-form.html b/systrace/catapult/third_party/polymer/components/iron-form/iron-form.html
deleted file mode 100644
index 258ca99..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/iron-form.html
+++ /dev/null
@@ -1,462 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-ajax/iron-ajax.html">
-
-<!--
-`<iron-form>` is a wrapper around the HTML `<form>` element, that can
-validate and submit both custom and native HTML elements. Note that this
-is a breaking change from iron-form 1.0, which was a type extension.
-
-It has two modes: if `allow-redirect` is true, then after the form submission you
-will be redirected to the server response. Otherwise, if it is false, it will
-use an `iron-ajax` element to submit the form contents to the server.
-
-  Example:
-
-    <iron-form>
-      <form method="get" action="/form/handler">
-        <input type="text" name="name" value="Batman">
-        <input type="checkbox" name="donuts" checked> I like donuts<br>
-        <paper-checkbox name="cheese" value="yes" checked></paper-checkbox>
-      </form>
-    </iron-form>
-
-By default, a native `<button>` element will submit this form. However, if you
-want to submit it from a custom element's click handler, you need to explicitly
-call the `iron-form`'s `submit` method.
-
-  Example:
-
-    <paper-button raised onclick="submitForm()">Submit</paper-button>
-
-    function submitForm() {
-      document.getElementById('iron-form').submit();
-    }
-
-If you are not using the `allow-redirect` mode, then you also have the option of
-customizing the request sent to the server. To do so, you can listen to the `iron-form-presubmit`
-event, and modify the form's [`iron-ajax`](https://elements.polymer-project.org/elements/iron-ajax)
-object. However, If you want to not use `iron-ajax` at all, you can cancel the
-event and do your own custom submission:
-
-  Example of modifying the request, but still using the build-in form submission:
-
-    form.addEventListener('iron-form-presubmit', function() {
-      this.request.method = 'put';
-      this.request.params['extraParam'] = 'someValue';
-    });
-
-  Example of bypassing the build-in form submission:
-
-    form.addEventListener('iron-form-presubmit', function(event) {
-      event.preventDefault();
-      var firebase = new Firebase(form.getAttribute('action'));
-      firebase.set(form.serializeForm());
-    });
-
-Note that if you're dynamically creating this element, it's mandatory that you
-first create the contained `<form>` element and all its children, and only then
-attach it to the `<iron-form>`:
-
-  var wrapper = document.createElement('iron-form');
-  var form = document.createElement('form');
-  var input = document.createElement('input');
-  form.appendChild(input);
-  document.body.appendChild(wrapper);
-  wrapper.appendChild(form);
-
-@element iron-form
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="iron-form">
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-    </style>
-
-    <!-- This form is used to collect the elements that should be submitted -->
-    <slot></slot>
-
-    <!-- This form is used for submission -->
-    <form id="helper" action$="[[action]]" method$="[[method]]" enctype$="[[enctype]]"></form>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'iron-form',
-
-      properties: {
-        /*
-         * Set this to true if you don't want the form to be submitted through an
-         * ajax request, and you want the page to redirect to the action URL
-         * after the form has been submitted.
-         */
-        allowRedirect: {
-          type: Boolean,
-          value: false
-        },
-        /**
-        * HTTP request headers to send. See PolymerElements/iron-ajax for
-        * more details. Only works when `allowRedirect` is false.
-        */
-        headers: {
-          type: Object,
-          value: function() { return {}; }
-        },
-        /**
-        * Set the `withCredentials` flag on the request. See PolymerElements/iron-ajax for
-        * more details. Only works when `allowRedirect` is false.
-        */
-        withCredentials: {
-          type: Boolean,
-          value: false
-        },
-      },
-      /**
-       * Fired if the form cannot be submitted because it's invalid.
-       *
-       * @event iron-form-invalid
-       */
-
-      /**
-       * Fired after the form is submitted.
-       *
-       * @event iron-form-submit
-       */
-
-      /**
-       * Fired before the form is submitted.
-       *
-       * @event iron-form-presubmit
-       */
-
-      /**
-       * Fired after the form is submitted and a response is received. An
-       * IronRequestElement is included as the event.detail object.
-       *
-       * @event iron-form-response
-      */
-
-      /**
-       * Fired after the form is submitted and an error is received. An
-       * error message is included in event.detail.error and an
-       * IronRequestElement is included in event.detail.request.
-       *
-       * @event iron-form-error
-      */
-
-      attached: function() {
-        this._nodeObserver = Polymer.dom(this).observeNodes(
-          function(mutations) {
-            for (var i = 0; i < mutations.addedNodes.length; i++) {
-              if (mutations.addedNodes[i].tagName === 'FORM' && !this._alreadyCalledInit) {
-                this._alreadyCalledInit = true;
-                this._form = mutations.addedNodes[i];
-                this._init();
-              }
-            }
-          }.bind(this));
-      },
-
-      detached: function() {
-        if (this._nodeObserver) {
-          Polymer.dom(this).unobserveNodes(this._nodeObserver);
-          this._nodeObserver = null;
-        }
-      },
-
-      _init: function() {
-        this._form.addEventListener('submit', this.submit.bind(this));
-        this._form.addEventListener('reset', this.reset.bind(this));
-
-        // Save the initial values.
-        this._defaults = this._defaults || new WeakMap();
-        var nodes = this._getSubmittableElements();
-        for (var i = 0; i < nodes.length; i++) {
-          var node = nodes[i];
-          if (!this._defaults.has(node)) {
-            this._defaults.set(node, {
-              checked: node.checked,
-              value: node.value,
-            });
-          }
-        }
-      },
-
-      /**
-       * Validates all the required elements (custom and native) in the form.
-       * @return {boolean} True if all the elements are valid.
-       */
-      validate: function() {
-        if (this._form.getAttribute('novalidate') === '')
-          return true;
-
-        // Start by making the form check the native elements it knows about.
-        var valid = this._form.checkValidity();
-        var elements = this._getValidatableElements();
-
-        // Go through all the elements, and validate the custom ones.
-        for (var el, i = 0; el = elements[i], i < elements.length; i++) {
-          // This is weird to appease the compiler. We assume the custom element
-          // has a validate() method, otherwise we can't check it.
-          var validatable = /** @type {{validate: (function() : boolean)}} */ (el);
-          if (validatable.validate) {
-            valid = !!validatable.validate() && valid;
-          }
-        }
-        return valid;
-      },
-
-      /**
-       * Submits the form.
-       */
-      submit: function(event) {
-        // We are not using this form for submission, so always cancel its event.
-        if (event) {
-          event.preventDefault();
-        }
-
-        // If you've called this before distribution happened, bail out.
-        if (!this._form) {
-          return;
-        }
-
-        if (!this.validate()) {
-          this.fire('iron-form-invalid');
-          return;
-        }
-
-        // Remove any existing children in the submission form (from a previous submit).
-        this.$.helper.textContent = '';
-
-        var json = this.serializeForm();
-
-        // If we want a redirect, submit the form natively.
-        if (this.allowRedirect) {
-          // If we're submitting the form natively, then create a hidden element for
-          // each of the values.
-          for (var element in json) {
-            this.$.helper.appendChild(this._createHiddenElement(element, json[element]));
-          }
-
-          // Copy the original form attributes.
-          this.$.helper.action = this._form.getAttribute('action');
-          this.$.helper.method = this._form.getAttribute('method') || 'GET';
-          this.$.helper.contentType = this._form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
-
-          this.$.helper.submit();
-          this.fire('iron-form-submit');
-        } else {
-          this._makeAjaxRequest(json);
-        }
-      },
-
-      /**
-       * Resets the form to the default values.
-       */
-      reset: function(event) {
-        // We are not using this form for submission, so always cancel its event.
-        if (event)
-          event.preventDefault();
-
-        // If you've called this before distribution happened, bail out.
-        if (!this._form) {
-          return;
-        }
-
-        // Load the initial values.
-        var nodes = this._getSubmittableElements();
-        for (var i = 0; i < nodes.length; i++) {
-          var node = nodes[i];
-          if (this._defaults.has(node)) {
-            var defaults = this._defaults.get(node);
-            node.value = defaults.value;
-            node.checked = defaults.checked;
-          }
-        }
-      },
-
-      /**
-       * Serializes the form as will be used in submission. Note that `serialize`
-       * is a Polymer reserved keyword, so calling `someIronForm`.serialize()`
-       * will give you unexpected results.
-       * @return {Object} An object containing name-value pairs for elements that
-       *                  would be submitted.
-       */
-      serializeForm: function() {
-        // Only elements that have a `name` and are not disabled are submittable.
-        var elements = this._getSubmittableElements();
-        var json = {};
-        for (var i = 0; i < elements.length; i++) {
-          var values = this._serializeElementValues(elements[i]);
-          for (var v = 0; v < values.length; v++) {
-            this._addSerializedElement(json, elements[i].name, values[v]);
-          }
-        }
-        return json;
-      },
-
-      _handleFormResponse: function (event) {
-        this.fire('iron-form-response', event.detail);
-      },
-
-      _handleFormError: function (event) {
-        this.fire('iron-form-error', event.detail);
-      },
-
-      _makeAjaxRequest: function(json) {
-        // Initialize the iron-ajax element if we haven't already.
-        if (!this.request) {
-          this.request = document.createElement('iron-ajax');
-          this.request.addEventListener('response', this._handleFormResponse.bind(this));
-          this.request.addEventListener('error', this._handleFormError.bind(this));
-        }
-
-        // Native forms can also index elements magically by their name (can't make
-        // this up if I tried) so we need to get the correct attributes, not the
-        // elements with those names.
-        this.request.url = this._form.getAttribute('action');
-        this.request.method = this._form.getAttribute('method') || 'GET';
-        this.request.contentType = this._form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
-        this.request.withCredentials = this.withCredentials;
-        this.request.headers = this.headers;
-
-        if (this._form.method.toUpperCase() === 'POST') {
-          this.request.body = json;
-        } else {
-          this.request.params = json;
-        }
-
-        // Allow for a presubmit hook
-        var event = this.fire('iron-form-presubmit', {}, {cancelable: true});
-        if(!event.defaultPrevented) {
-          this.request.generateRequest();
-          this.fire('iron-form-submit', json);
-        }
-      },
-
-      _getValidatableElements: function() {
-        return this._findElements(this._form, true);
-      },
-
-      _getSubmittableElements: function() {
-        return this._findElements(this._form, false);
-      },
-
-      _findElements: function(parent, ignoreName) {
-        var nodes = Polymer.dom(parent).querySelectorAll('*');
-        var submittable = [];
-
-        for (var i = 0; i < nodes.length; i++) {
-          var node = nodes[i];
-          // An element is submittable if it is not disabled, and if it has a
-          // 'name' attribute.
-          if(!node.disabled && (ignoreName || node.name)) {
-            submittable.push(node);
-          }
-          else {
-            // This element has a root which could contain more submittable elements.
-            if(node.root) {
-              Array.prototype.push.apply(submittable, this._findElements(node.root, ignoreName));
-            }
-          }
-        }
-        return submittable;
-      },
-
-      _serializeElementValues: function(element) {
-        // We will assume that every custom element that needs to be serialized
-        // has a `value` property, and it contains the correct value.
-        // The only weird one is an element that implements IronCheckedElementBehaviour,
-        // in which case like the native checkbox/radio button, it's only used
-        // when checked.
-        // For native elements, from https://www.w3.org/TR/html5/forms.html#the-form-element.
-        // Native submittable elements: button, input, keygen, object, select, textarea;
-        // 1. We will skip `keygen and `object` for this iteration, and deal with
-        // them if they're actually required.
-        // 2. <button> and <textarea> have a `value` property, so they behave like
-        //    the custom elements.
-        // 3. <select> can have multiple options selected, in which case its
-        //    `value` is incorrect, and we must use the values of each of its
-        //    `selectedOptions`
-        // 4. <input> can have a whole bunch of behaviours, so it's handled separately.
-        // 5. Buttons are hard. The button that was clicked to submit the form
-        //    is the one who's name/value gets sent to the server.
-        var tag = element.tagName.toLowerCase();
-        if (tag === 'button' || (tag === 'input' && (element.type === 'submit' || element.type === 'reset'))) {
-          return [];
-        }
-
-        if (tag === 'select') {
-          return this._serializeSelectValues(element);
-        } else if (tag === 'input') {
-          return this._serializeInputValues(element);
-        } else {
-          if (element['_hasIronCheckedElementBehavior'] && !element.checked)
-            return [];
-          return [element.value];
-        }
-      },
-
-      _serializeSelectValues: function(element) {
-        var values = [];
-
-        // A <select multiple> has an array of options, some of which can be selected.
-        for (var i = 0; i < element.options.length; i++) {
-          if (element.options[i].selected) {
-            values.push(element.options[i].value)
-          }
-        }
-        return values;
-      },
-
-      _serializeInputValues: function(element) {
-        // Most of the inputs use their 'value' attribute, with the exception
-        // of radio buttons, checkboxes and file.
-        var type = element.type.toLowerCase();
-
-        // Don't do anything for unchecked checkboxes/radio buttons.
-        // Don't do anything for file, since that requires a different request.
-        if (((type === 'checkbox' || type === 'radio') && !element.checked) ||
-            type === 'file') {
-          return [];
-        }
-        return [element.value];
-      },
-
-      _createHiddenElement: function(name, value) {
-        var input = document.createElement("input");
-        input.setAttribute("type", "hidden");
-        input.setAttribute("name", name);
-        input.setAttribute("value", value);
-        return input;
-      },
-
-      _addSerializedElement: function(json, name, value) {
-        // If the name doesn't exist, add it. Otherwise, serialize it to
-        // an array,
-        if (json[name] === undefined) {
-          json[name] = value;
-        } else {
-          if (!Array.isArray(json[name])) {
-            json[name] = [json[name]];
-          }
-          json[name].push(value);
-        }
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-form/test/basic.html
deleted file mode 100644
index 8f64918..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/test/basic.html
+++ /dev/null
@@ -1,923 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-form</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../paper-checkbox/paper-checkbox.html">
-  <link rel="import" href="../../paper-input/paper-input.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../iron-form.html">
-
-</head>
-<body>
-
-  <dom-module id="x-input-wrapper">
-    <template>
-      <input name="check_wrapped" value="foo"/>
-    </template>
-  </dom-module>
-
-  <test-fixture id="serialization">
-    <template>
-      <div>
-        <iron-form id="native-checkboxes">
-          <form action="/get" method="get">
-            <input type="checkbox" name="check1" checked> <!-- default value is "on" -->
-            <input type="checkbox" name="check1" value="1">
-            <input type="checkbox" name="check1" value="2" checked>
-            <input type="checkbox" name="check2" value="3" checked>
-            <input type="checkbox" name="check3" value="4">
-          </form>
-        </iron-form>
-        <iron-form id="native-radios">
-          <form action="/get" method="get">
-            <input type="radio" name="radio1" checked> <!-- default value is "on" -->
-            <input type="radio" name="radio1" value="1">
-            <input type="radio" name="radio2" value="2" checked>
-            <input type="radio" name="radio2" value="3" checked> <!-- it's a radio group -->
-            <input type="radio" name="radio3" value="4">
-          </form>
-        </iron-form>
-        <iron-form id="native-buttons">
-          <form action="/get" method="get">
-            <input type="reset" name="reset1" value="reset">
-            <input type="submit" name="submit1" value="submit">
-            <button name="button1" value="button">text</button>
-          </form>
-        </iron-form>
-        <iron-form id="native-selects">
-          <form action="/get" method="get">
-            <select name="select1" multiple>
-              <option value="1" selected>A</option>
-              <option value="2" selected>B</option>
-              <option value="3">C</option>
-            </select>
-            <select name="select2">
-              <option value="1" selected>A</option>
-              <option value="2">B</option>
-            </select>
-          </form>
-        </iron-form>
-        <iron-form id="native-inputs">
-          <form action="/get" method="get">
-            <input type="text" name="input1">
-            <input type="text" name="input1" value="foo">
-            <input type="text" name="input1" value="zag">
-            <input type="text" name="input2" value="bar">
-            <input type="password" name="pass1" value="pass">
-            <input type="number" name="number1" value="35">
-            <input name="empty" value="">
-            <input name="empty" value="">
-          </form>
-        </iron-form>
-        <iron-form id="native-inputs-empty">
-          <form action="/get" method="get">
-            <input type="text" name="input1">
-          </form>
-        </iron-form>
-        <iron-form id="custom-checkboxes">
-          <form action="/get" method="get">
-            <paper-checkbox name="check1" checked></paper-checkbox> <!-- default value is "on" -->
-            <paper-checkbox name="check1" value="1"></paper-checkbox>
-            <paper-checkbox name="check1" value="2" checked></paper-checkbox>
-            <paper-checkbox name="check2" value="3" checked></paper-checkbox>
-            <paper-checkbox name="check3" value="4"></paper-checkbox>
-          </form>
-        </iron-form>
-        <iron-form id="custom-inputs">
-          <form action="/get" method="get">
-            <paper-input name="input1" value=""></paper-input>
-            <paper-input name="input1" value="foo"></paper-input>
-            <paper-input name="input1" value="zag"></paper-input>
-            <paper-input name="input2" value="bar"></paper-input>
-            <paper-input type="password" name="pass1" value="pass"></paper-input>
-            <paper-input type="number" name="number1" value="35"></paper-input>
-            <paper-input name="empty" value=""></paper-input>
-            <paper-input name="empty" value=""></paper-input>
-            <x-input-wrapper></x-input-wrapper>
-          </form>
-        </iron-form>
-        <iron-form id="nested-elements">
-          <form action="/get" method="get">
-            <div>
-              <input type="text" name="input1" value="i1">
-            </div>
-            <div>
-              <paper-input name="paper-input1" value="p1"></paper-input>
-            </div>
-            <div>
-              <p>
-                <div>
-                  <input type="text" name="input2" value="i2">
-                  <paper-input name="paper-input2" value="p2"></paper-input>
-                </div>
-              </p>
-            </div>
-          </form>
-        </iron-form>
-        <iron-form id="duplicate-names">
-          <form action="/get" method="get">
-            <input name="input1" value="">
-            <input name="input1" value="foo">
-            <paper-input name="input1" value=""></paper-input>
-            <paper-input name="input1" value="bar"></paper-input>
-            <input name="empty" value="">
-            <input name="empty" value="">
-            <paper-input name="empty" value=""></paper-input>
-            <paper-input name="empty" value=""></paper-input>
-          </form>
-        </iron-form>
-
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="validation">
-    <template>
-      <div>
-        <iron-form id="native-required">
-          <form action="/get" method="get">
-            <input required>
-          </form>
-        </iron-form>
-
-        <iron-form id="native-invalid">
-          <form action="/get" method="get">
-            <input pattern="aa" value="b">
-          </form>
-        </iron-form>
-
-        <iron-form id="custom-required">
-          <form action="/get" method="get">
-            <paper-input required></paper-input>
-          </form>
-        </iron-form>
-
-        <iron-form id="custom-invalid">
-          <form action="/get" method="get">
-            <paper-input pattern="aa" value="b"></paper-input>
-          </form>
-        </iron-form>
-
-        <iron-form id="mixed-invalid">
-          <form action="/get" method="get">
-            <input pattern="aa" value="b">
-            <paper-input pattern="aa" value="b"></paper-input>
-          </form>
-        </iron-form>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="submission">
-    <template>
-      <iron-form>
-        <form action="/get" method="get">
-          <input type="checkbox" name="check1" checked>
-          <input type="submit">
-          <input type="button">
-          <paper-button></paper-button>
-        </form>
-      </iron-form>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="resetting">
-    <template>
-      <iron-form>
-        <form action="/get" method="get">
-          <input type="input" name="input1" id="input1" value="input1">
-          <input type="input" name="input2" id="input2">
-          <input type="checkbox" name="check1" id="check1" checked>
-          <input type="checkbox" name="check2" id="check2">
-          <input type="radio" name="radio1" id="radio1" checked>
-          <input type="radio" name="radio2" id="radio2">
-          <paper-checkbox name="papercheck1" id="papercheck1" checked></paper-checkbox>
-          <paper-checkbox name="papercheck2" id="papercheck2"></paper-checkbox>
-          <paper-input name="paper1" id="paper1" value="paper1"></paper-input>
-          <paper-input name="paper2" id="paper2" value=""></paper-input>
-          <input type="reset">
-        </form>
-      </iron-form>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="content-type">
-    <template>
-      <div>
-        <iron-form id="simple-form">
-          <form action="/valid/url" method="post">
-            <paper-input name="paper1" value="value1"></paper-input>
-            <paper-input name="paper2" value="value2"></paper-input>
-          </form>
-        </iron-form>
-        <iron-form id="json-form">
-          <form action="/valid/url" method="post" enctype="application/json">
-            <paper-input name="paper1" value="value1"></paper-input>
-            <paper-input name="paper2" value="value2"></paper-input>
-          </form>
-        </iron-form>
-          <iron-form id="plain-form">
-              <form action="/valid/url" method="post" enctype="text/plain">
-                  <paper-input name="paper1" value="value1"></paper-input>
-                  <paper-input name="paper2" value="value2"></paper-input>
-              </form>
-          </iron-form>
-        </div>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('serialization', function() {
-      var f;
-      var server;
-
-      suiteSetup(function () {
-        Polymer({is: 'x-input-wrapper'});
-      });
-
-      setup(function() {
-        f = fixture('serialization');
-
-        server = sinon.fakeServer.create();
-        server.respondWith(
-          'GET',
-          /\/get.*/,
-          [
-            200,
-            '{"Content-Type":"application/json"}',
-            '{"success":true}'
-          ]
-        );
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      test('serializes native checkboxes', function(done) {
-        var form = f.querySelector('#native-checkboxes');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?check1=on&check1=2&check2=3');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes native radio buttons', function(done) {
-        var form = f.querySelector('#native-radios');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?radio1=on&radio2=3');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes native buttons', function(done) {
-        var form = f.querySelector('#native-buttons');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes native selects', function(done) {
-        var form = f.querySelector('#native-selects');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?select1=1&select1=2&select2=1');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes native inputs', function(done) {
-        var form = f.querySelector('#native-inputs');
-
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?input1=&input1=foo&input1=zag&input2=bar&pass1=pass&number1=35&empty=&empty=');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes empty native inputs', function(done) {
-        var form = f.querySelector('#native-inputs-empty');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?input1=');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes custom checkboxes', function(done) {
-        var form = f.querySelector('#custom-checkboxes');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?check1=on&check1=2&check2=3');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes custom inputs', function(done) {
-        var form = f.querySelector('#custom-inputs');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?input1=&input1=foo&input1=zag&input2=bar&pass1=pass&number1=35&empty=&empty=&check_wrapped=foo');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes elements deeply nested in divs', function(done) {
-        var form = f.querySelector('#nested-elements');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?input1=i1&paper-input1=p1&input2=i2&paper-input2=p2');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('serializes elements with duplicate names', function(done) {
-        var form = f.querySelector('#duplicate-names');
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?input1=&input1=foo&input1=&input1=bar&empty=&empty=&empty=&empty=');
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-    });
-
-
-    suite('validation', function() {
-      var f;
-      var server;
-
-      setup(function() {
-        f = fixture('validation');
-
-        server = sinon.fakeServer.create();
-        server.respondWith(
-          'GET',
-          /\/get.*/,
-          [
-            200,
-            '{"Content-Type":"application/json"}',
-            '{"success":true}'
-          ]
-        );
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      test('fires iron-form-invalid if it can\'t submit', function(done) {
-        var form = f.querySelector('#mixed-invalid');
-        form.addEventListener('iron-form-invalid', function(event) {
-          expect(form.validate()).to.be.equal(false);
-          done();
-        });
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          expect(form.validate()).to.be.equal(false);
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('<input required> is validated and does not submit the form', function(done) {
-        var form = f.querySelector('#native-required');
-
-        var responses = 0;
-        form.addEventListener('iron-form-response', function(event) {
-          responses++;
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          expect(form.validate()).to.be.equal(false);
-          form.submit();
-          server.respond();
-        });
-
-        setTimeout(function() {
-          expect(responses).to.be.equal(0);
-          done();
-        },  200);
-      });
-
-      test('invalid <input> but not required is validated and does not submit the form', function(done) {
-        var form = f.querySelector('#native-invalid');
-
-        var responses = 0;
-        form.addEventListener('iron-form-response', function(event) {
-          responses++;
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          expect(form.validate()).to.be.equal(false);
-          form.submit();
-          server.respond();
-        });
-
-        setTimeout(function() {
-          expect(responses).to.be.equal(0);
-          done();
-        },  200);
-      });
-
-      test('<paper-input required> is validated and does not submit the form', function(done) {
-        var form = f.querySelector('#custom-required');
-
-        var responses = 0;
-        form.addEventListener('iron-form-response', function(event) {
-          responses++;
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.validate();
-          expect(form.validate()).to.be.equal(false);
-          form.submit();
-          server.respond();
-        });
-
-        setTimeout(function() {
-          expect(responses).to.be.equal(0);
-          done();
-        },  200);
-      });
-
-      test('invalid <paper-input> but not required is validated and does not submit the form', function(done) {
-        var form = f.querySelector('#custom-invalid');
-
-        var responses = 0;
-        form.addEventListener('iron-form-response', function(event) {
-          responses++;
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          expect(form.validate()).to.be.equal(false);
-          form.submit();
-          server.respond();
-        });
-
-        setTimeout(function() {
-          expect(responses).to.be.equal(0);
-          done();
-        },  200);
-      });
-    });
-
-    suite('submission', function() {
-      var form;
-      var server;
-
-      setup(function() {
-        form = fixture('submission');
-
-        server = sinon.fakeServer.create();
-        server.respondWith(
-          'GET',
-          /\/get.*/,
-          [
-            200,
-            '{"Content-Type":"application/json"}',
-            '{"success":true}'
-          ]
-        );
-        server.respondWith(
-          'POST',
-          /\/post.*/,
-          [
-            200,
-            '{"Content-Type":"application/json"}',
-            '{"success":true}'
-          ]
-        );
-        server.respondWith(
-          'GET',
-          /\/error.*/,
-          [
-            404,
-            '{"Content-Type":"application/text"}',
-            '{"success":false}'
-          ]
-        );
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      test('calling submit() on a form with method=get', function(done) {
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('calling submit() on a form with method=post', function(done) {
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form._form.setAttribute('method', 'POST');
-          form._form.setAttribute('action', '/post');
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('calling submit() on a form with method unset', function(done) {
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form._form.removeAttribute('method');
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('pressing an <input type=submit> submits the form', function(done) {
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form._form.querySelector('input[type=submit]').click();
-          server.respond();
-        });
-      });
-
-      test('pressing an <input type=button> with an event handler submits the form', function(done) {
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          var button = form._form.querySelector('input[type=button]');
-          button.addEventListener('click', function() {
-            form.submit();
-          });
-          button.click();
-
-          server.respond();
-        });
-      });
-
-      test('pressing a paper-button with an event handler submits the form', function(done) {
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          var button = form._form.querySelector('paper-button');
-          button.addEventListener('click', function() {
-            form.submit();
-          });
-          button.click();
-
-          server.respond();
-        });
-      });
-
-      test('can modify the request in the presubmit', function(done) {
-        var submitted = false;
-        var presubmitted = false;
-
-        form.addEventListener('iron-form-submit', function() {
-          submitted = true;
-        });
-        form.addEventListener('iron-form-presubmit', function() {
-          presubmitted = true;
-          this.request.params = {batman: true};
-        });
-
-        form.addEventListener('iron-form-response', function(event) {
-          expect(submitted).to.be.equal(true);
-          expect(presubmitted).to.be.equal(true);
-
-          // We have changed the json parameters
-          expect(event.detail.url).to.contain('batman=true');
-
-          var response = event.detail.response;
-          expect(response).to.be.ok;
-          expect(response).to.be.an('object');
-          expect(response.success).to.be.equal(true);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-          server.respond();
-        });
-      });
-
-      test('can do a custom submission in the presubmit', function(done) {
-        var presubmitted = false;
-        // Since we are not using the normal form submission, these events should
-        // never be called.
-        var formResponseHandler = sinon.spy();
-        form.addEventListener('iron-form-response', formResponseHandler);
-        var formSubmitHandler = sinon.spy();
-        form.addEventListener('iron-form-submit', formSubmitHandler);
-
-        form.addEventListener('iron-form-presubmit', function(event) {
-          presubmitted = true;
-          event.preventDefault();
-          // Your custom submission logic could go here (like using Firebase).
-          // In this case, fire a custom event as a an example.
-          this.fire('custom-form-submit');
-        });
-        form.addEventListener('custom-form-submit', function(event) {
-          expect(presubmitted).to.be.equal(true);
-          expect(formResponseHandler.callCount).to.be.equal(0);
-          expect(formSubmitHandler.callCount).to.be.equal(0);
-          done();
-        });
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form.submit();
-        });
-      });
-
-      test('can relay errors', function(done) {
-        form.addEventListener('iron-form-error', function(event) {
-          var error = event.detail;
-          expect(error).to.be.ok;
-          expect(error).to.be.an('object');
-          expect(error.error).to.be.ok;
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          form._form.setAttribute('action', '/error');
-          form.submit();
-          server.respond();
-        });
-      });
-    });
-
-    suite('resetting', function() {
-      test('can reset a form', function(done) {
-        var form = fixture('resetting');
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          var initial = form.serializeForm();
-          expect(JSON.stringify(initial)).to.be.equal('{"input1":"input1","input2":"","check1":"on","radio1":"on","papercheck1":"on","paper1":"paper1","paper2":""}');
-
-          // Modify all the values, flip all the inputs.
-          document.getElementById('input1').value = 'input1++';
-          document.getElementById('input2').value = 'input2++';
-          document.getElementById('check1').checked = false;
-          document.getElementById('check2').checked = true;
-          document.getElementById('radio1').checked = false;
-          document.getElementById('radio2').checked = true;
-          document.getElementById('papercheck1').checked = false;
-          document.getElementById('papercheck2').checked = true;
-          document.getElementById('paper1').value = 'paper1++';
-          document.getElementById('paper2').value = 'paper2++';
-
-          var updated = form.serializeForm();
-          expect(JSON.stringify(updated)).to.not.be.equal(initial);
-          form.reset();
-          var final = form.serializeForm();
-          expect(JSON.stringify(initial)).to.be.equal(JSON.stringify(final));
-          done();
-        });
-      });
-    });
-
-    suite('dynamically created', function() {
-      var server;
-
-      setup(function() {
-        server = sinon.fakeServer.create();
-        server.respondWith(
-          'GET',
-          /\/get.*/,
-          [
-            200,
-            '{"Content-Type":"application/json"}',
-            '{"success":true}'
-          ]
-        );
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      test('submits a form', function(done) {
-        var form = document.createElement('iron-form');
-        // Need to add to the document so observeNodes runs.
-        document.body.appendChild(form);
-
-        var nativeForm = document.createElement('form');
-        nativeForm.action = '/get';
-        nativeForm.method = 'get';
-
-        var input = document.createElement('input');
-        nativeForm.appendChild(input);
-        input.required = true;
-        input.name = 'foo';
-        Polymer.dom(form).appendChild(nativeForm);
-
-        form.addEventListener('iron-form-response', function(event) {
-          expect(event.detail.url).to.equal('/get?foo=bar');
-          expect(event.detail.response.success).to.be.equal(true);
-          document.body.removeChild(form);
-          done();
-        });
-
-        // Wait one tick for observeNodes.
-        Polymer.Base.async(function() {
-          expect(form.validate()).to.be.equal(false);
-          input.value = 'bar';
-          expect(form.validate()).to.be.equal(true);
-          form.submit();
-          server.respond();
-        }, 1);
-      });
-    });
-
-    suite('content type', function() {
-      var server;
-      var f;
-
-      setup(function() {
-        server = sinon.fakeServer.create();
-        f = fixture('content-type');
-      });
-
-      teardown(function() {
-        server.restore();
-      });
-
-      test('submits a form with text/plain', function(done) {
-        var form = f.querySelector('#plain-form');
-
-        server.respondWith(
-          'POST',
-          /\/valid\/url.*/,
-          function (request) {
-            expect(request.requestHeaders).to.deep.equal({
-                "content-type": "text/plain;charset=utf-8",
-                "accept": "application/json"});
-            expect(request.requestBody).to.deep.equal({
-                "paper1": "value1",
-                "paper2": "value2"});
-            done();
-          }
-        );
-
-          // Wait one tick for observeNodes.
-          Polymer.Base.async(function() {
-            form.submit();
-            server.respond();
-          });
-      });
-      test('submits a form with application/json', function(done) {
-          var form = f.querySelector('#json-form');
-
-          server.respondWith(
-            'POST',
-            /\/valid\/url.*/,
-            function (request) {
-              expect(request.requestHeaders).to.deep.equal({
-                  "content-type": "application/json;charset=utf-8",
-                  "accept": "application/json"});
-              expect(request.requestBody).to.equal(
-                  '{"paper1":"value1","paper2":"value2"}');
-              done();
-            }
-          );
-
-          // Wait one tick for observeNodes.
-          Polymer.Base.async(function() {
-            form.submit();
-            server.respond();
-          });
-      });
-        test('submits a form with application/x-www-form-urlencoded', function(done) {
-            var form = f.querySelector('#simple-form');
-
-            server.respondWith(
-                'POST',
-                /\/valid\/url.*/,
-                function (request) {
-                    expect(request.requestHeaders).to.deep.equal({
-                        "content-type": "application/x-www-form-urlencoded;charset=utf-8",
-                        "accept": "application/json"});
-                    expect(request.requestBody).to.equal(
-                        'paper1=value1&paper2=value2');
-                    done();
-                }
-            );
-
-            // Wait one tick for observeNodes.
-            Polymer.Base.async(function() {
-                form.submit();
-                server.respond();
-            });
-        });
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-form/test/index.html b/systrace/catapult/third_party/polymer/components/iron-form/test/index.html
deleted file mode 100644
index d71cc47..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-form/test/index.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-    <meta charset="utf-8">
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'basic.html?wc-shadydom=true&wc-ce=true',
-        'basic.html?dom=shadow'
-      ]);
-    </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-icon/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/README.md b/systrace/catapult/third_party/polymer/components/iron-icon/README.md
deleted file mode 100644
index 0649f73..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/iron-icon.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icon)
-
-##&lt;iron-icon&gt;
-
-The `iron-icon` element displays an icon. By default an icon renders as a 24px square.
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../iron-icons/iron-icons.html">
-    <link rel="import" href="iron-icon.html">
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<iron-icon icon="menu"></iron-icon>
-<iron-icon src="demo/location.png"></iron-icon>
-```
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/bower.json b/systrace/catapult/third_party/polymer/components/iron-icon/bower.json
deleted file mode 100644
index 3d1d412..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "iron-icon",
-  "private": true,
-  "version": "1.0.13",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "An element that supports displaying an icon",
-  "main": "iron-icon.html",
-  "author": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "icon"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-icon.git"
-  },
-  "ignore": [],
-  "dependencies": {
-    "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
-    "iron-meta": "polymerelements/iron-meta#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
-    "iron-iconset": "polymerelements/iron-iconset#^1.0.0",
-    "iron-icons": "polymerelements/iron-icons#^1.0.0",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/demo/async.html b/systrace/catapult/third_party/polymer/components/iron-icon/demo/async.html
deleted file mode 100644
index eaf40d1..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/demo/async.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-icon demo</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-icon.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html" >
-
-  <style is="custom-style">
-    #loading_message {
-      color: #444;
-      margin-bottom: 16px;
-    }
-    .vertical-section h4 {
-      border-left: 3px solid var(--paper-grey-300);
-      padding-left: 10px;
-    }
-
-    .vertical-section h4:hover {
-      border-left-color: var(--google-blue-700);
-    }
-  </style>
-</head>
-<body>
-  <div class="vertical-section-container centered">
-    <h4>
-      This demo is for an &lt;iron-icon&gt; with an asynchronously loaded
-      iconset.
-    </h4>
-
-    <div id='loading_message'>Waiting to load iconset...</div>
-
-    <div class="vertical-section">
-      <!-- iron-icon using a iron-iconset as its icon source -->
-      <iron-iconset name="example" icons="location" src="location.png" size="24" width="24"></iron-iconset>
-
-      <h4>&lt;iron-icon icon="example:location"&gt;</h4>
-      <iron-icon icon="example:location"></iron-icon>
-
-    </div>
-  </div>
-  <script>
-    setTimeout(function() {
-      // Import the code that powers the iron-iconset asynchronously
-      var linkElem = document.createElement('link');
-      linkElem.setAttribute('rel', 'import');
-      linkElem.setAttribute('href', '../../iron-iconset/iron-iconset.html');
-      document.head.appendChild(linkElem);
-      document.querySelector('#loading_message').innerText = "Iconset Loaded.";
-    }, 1000);
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-icon/demo/index.html
deleted file mode 100644
index 999ed35..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/demo/index.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-icon demo</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-icon.html">
-  <link rel="import" href="../../iron-iconset/iron-iconset.html">
-  <link href="../../paper-styles/demo-pages.html" rel="import">
-
-  <style is="custom-style">
-    .vertical-section h4 {
-      border-left: 3px solid var(--paper-grey-300);
-      padding-left: 10px;
-    }
-
-    .vertical-section h4:hover {
-      border-left-color: var(--google-blue-700);
-    }
-  </style>
-</head>
-<body>
-  <div class="vertical-section-container centered">
-    <h4>This demo is for a single &lt;iron-icon&gt;. If you're looking for the
-      whole set of available icons, check out the <a href="/elements/iron-icons?view=demo:demo/index.html">&lt;iron-icons&gt; demo.</a></h5>
-
-    <div class="vertical-section">
-      <!-- iron-icon using a iron-iconset as its icon source -->
-      <iron-iconset name="example" icons="location" src="location.png" size="24" width="24"></iron-iconset>
-
-      <h4>&lt;iron-icon icon="example:location"&gt;</h4>
-      <iron-icon icon="example:location"></iron-icon>
-
-      <!-- iron-icon using an image url as its icon source -->
-      <h4>&lt;iron-icon src="location.png"&gt;</h4>
-      <iron-icon src="location.png"></iron-icon>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/demo/location.png b/systrace/catapult/third_party/polymer/components/iron-icon/demo/location.png
deleted file mode 100644
index 9bb7423..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/demo/location.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/hero.svg b/systrace/catapult/third_party/polymer/components/iron-icon/hero.svg
deleted file mode 100755
index 19f01c2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/hero.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<circle cx="112" cy="61" r="8"/>

-	<path d="M129,78H95V44h34V78z M97,76h30V46H97V76z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/index.html b/systrace/catapult/third_party/polymer/components/iron-icon/index.html
deleted file mode 100644
index 487bb5c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/iron-icon.html b/systrace/catapult/third_party/polymer/components/iron-icon/iron-icon.html
deleted file mode 100644
index f2b0d9a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/iron-icon.html
+++ /dev/null
@@ -1,204 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-
-<!--
-
-The `iron-icon` element displays an icon. By default an icon renders as a 24px square.
-
-Example using src:
-
-    <iron-icon src="star.png"></iron-icon>
-
-Example setting size to 32px x 32px:
-
-    <iron-icon class="big" src="big_star.png"></iron-icon>
-
-    <style is="custom-style">
-      .big {
-        --iron-icon-height: 32px;
-        --iron-icon-width: 32px;
-      }
-    </style>
-
-The iron elements include several sets of icons.
-To use the default set of icons, import `iron-icons.html` and use the `icon` attribute to specify an icon:
-
-    <link rel="import" href="/components/iron-icons/iron-icons.html">
-
-    <iron-icon icon="menu"></iron-icon>
-
-To use a different built-in set of icons, import the specific `iron-icons/<iconset>-icons.html`, and
-specify the icon as `<iconset>:<icon>`. For example, to use a communication icon, you would
-use:
-
-    <link rel="import" href="/components/iron-icons/communication-icons.html">
-
-    <iron-icon icon="communication:email"></iron-icon>
-
-You can also create custom icon sets of bitmap or SVG icons.
-
-Example of using an icon named `cherry` from a custom iconset with the ID `fruit`:
-
-    <iron-icon icon="fruit:cherry"></iron-icon>
-
-See [iron-iconset](iron-iconset) and [iron-iconset-svg](iron-iconset-svg) for more information about
-how to create a custom iconset.
-
-See the [iron-icons demo](iron-icons?view=demo:demo/index.html) to see the icons available
-in the various iconsets.
-
-To load a subset of icons from one of the default `iron-icons` sets, you can
-use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
-to select individual icons, and creates an iconset from them that you can
-use directly in your elements.
-
-### Styling
-
-The following custom properties are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--iron-icon` | Mixin applied to the icon | {}
-`--iron-icon-width` | Width of the icon | `24px`
-`--iron-icon-height` | Height of the icon | `24px`
-`--iron-icon-fill-color` | Fill color of the svg icon | `currentcolor`
-`--iron-icon-stroke-color` | Stroke color of the svg icon | none
-
-@group Iron Elements
-@element iron-icon
-@demo demo/index.html
-@hero hero.svg
-@homepage polymer.github.io
--->
-
-<dom-module id="iron-icon">
-  <template>
-    <style>
-      :host {
-        @apply(--layout-inline);
-        @apply(--layout-center-center);
-        position: relative;
-
-        vertical-align: middle;
-
-        fill: var(--iron-icon-fill-color, currentcolor);
-        stroke: var(--iron-icon-stroke-color, none);
-
-        width: var(--iron-icon-width, 24px);
-        height: var(--iron-icon-height, 24px);
-        @apply(--iron-icon);
-      }
-    </style>
-  </template>
-</dom-module>
-<script>
-Polymer({
-  is: 'iron-icon',
-
-  properties: {
-
-    /**
-      * The name of the icon to use. The name should be of the form:
-      * `iconset_name:icon_name`.
-      */
-    icon: {
-      type: String
-    },
-
-    /**
-      * The name of the theme to used, if one is specified by the
-      * iconset.
-      */
-    theme: {
-      type: String
-    },
-
-    /**
-      * If using iron-icon without an iconset, you can set the src to be
-      * the URL of an individual icon image file. Note that this will take
-      * precedence over a given icon attribute.
-      */
-    src: {
-      type: String
-    },
-
-    /**
-      * @type {!Polymer.IronMeta}
-      */
-    _meta: {
-      value: Polymer.Base.create('iron-meta', {type: 'iconset'})
-    }
-
-  },
-
-  observers: [
-    '_updateIcon(_meta, isAttached)',
-    '_updateIcon(theme, isAttached)',
-    '_srcChanged(src, isAttached)',
-    '_iconChanged(icon, isAttached)'
-  ],
-
-  _DEFAULT_ICONSET: 'icons',
-
-  _iconChanged: function(icon) {
-    var parts = (icon || '').split(':');
-    this._iconName = parts.pop();
-    this._iconsetName = parts.pop() || this._DEFAULT_ICONSET;
-    this._updateIcon();
-  },
-
-  _srcChanged: function(src) {
-    this._updateIcon();
-  },
-
-  _usesIconset: function() {
-    return this.icon || !this.src;
-  },
-
-  /** @suppress {visibility} */
-  _updateIcon: function() {
-    if (this._usesIconset()) {
-      if (this._img && this._img.parentNode) {
-        Polymer.dom(this.root).removeChild(this._img);
-      }
-      if (this._iconName === "") {
-        if (this._iconset) {
-          this._iconset.removeIcon(this);
-        }
-      } else if (this._iconsetName && this._meta) {
-        this._iconset = /** @type {?Polymer.Iconset} */ (
-          this._meta.byKey(this._iconsetName));
-        if (this._iconset) {
-          this._iconset.applyIcon(this, this._iconName, this.theme);
-          this.unlisten(window, 'iron-iconset-added', '_updateIcon');
-        } else {
-          this.listen(window, 'iron-iconset-added', '_updateIcon');
-        }
-      }
-    } else {
-      if (this._iconset) {
-        this._iconset.removeIcon(this);
-      }
-      if (!this._img) {
-        this._img = document.createElement('img');
-        this._img.style.width = '100%';
-        this._img.style.height = '100%';
-        this._img.draggable = false;
-      }
-      this._img.src = this.src;
-      Polymer.dom(this.root).appendChild(this._img);
-    }
-  }
-});
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/test/index.html b/systrace/catapult/third_party/polymer/components/iron-icon/test/index.html
deleted file mode 100644
index 4414532..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/test/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-  <meta charset="utf-8">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-
-</head>
-<body>
-
-  <script>
-    WCT.loadSuites([
-      'iron-icon.html',
-      'iron-icon.html?dom=shadow'
-    ]);
-  </script>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icon/test/iron-icon.html b/systrace/catapult/third_party/polymer/components/iron-icon/test/iron-icon.html
deleted file mode 100644
index 4dd9a8d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icon/test/iron-icon.html
+++ /dev/null
@@ -1,246 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-icon</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../iron-icon.html">
-  <link rel="import" href="../../iron-iconset/iron-iconset.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="icon-holder.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialIcon">
-    <template>
-      <iron-icon src="../demo/location.png"></iron-icon>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="IconFromIconset">
-    <template>
-      <iron-iconset name="example" icons="location blank" src="location.png" size="24" width="48"></iron-iconset>
-      <iron-icon icon="example:location"></iron-icon>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithoutAnIconSource">
-    <template>
-      <iron-icon icon=""></iron-icon>
-      <iron-icon></iron-icon>
-      <iron-icon src=""></iron-icon>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="UsingAsyncIconset">
-    <template>
-      <iron-icon icon="async:location"></iron-icon>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="AsyncIconset">
-    <template>
-      <iron-iconset name="async" icons="location blank" src="location.png" size="24" width="48"></iron-iconset>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="SrcIconSwitch">
-    <template>
-      <iron-iconset name="example" icons="location blank" src="location.png" size="24" width="48"></iron-iconset>
-      <iron-icon></iron-icon>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ParentForceUpdate">
-    <template>
-      <icon-holder>
-        <iron-icon></iron-icon>
-      </icon-holder>
-    </template>
-  </test-fixture>
-
-  <script>
-function iconElementFor (node) {
-  var nodes = Polymer.dom(node.root).childNodes;
-
-  for (var i = 0; i < nodes.length; ++i) {
-    if (nodes[i].nodeName.match(/DIV|IMG/)) {
-      return nodes[i];
-    }
-  }
-}
-
-function hasIcon (node) {
-  return /png/.test(node.style.backgroundImage);
-}
-
-suite('<iron-icon>', function() {
-  suite('basic behavior', function() {
-    var icon;
-
-    setup(function() {
-      icon = fixture('TrivialIcon');
-    });
-
-    test('can be assigned an icon with the src attribute', function() {
-      expect(iconElementFor(icon)).to.be.ok;
-      expect(iconElementFor(icon).src).to.match(/demo\/location\.png/);
-    });
-
-    test('can change its src dynamically', function() {
-      icon.src = 'foo.png';
-
-      expect(iconElementFor(icon).src).to.match(/foo\.png/);
-    });
-  });
-
-  suite('lifecycle', function() {
-    var icon;
-
-    setup(function() {
-      icon = document.createElement('iron-icon');
-    });
-
-    teardown(function() {
-      if (icon.parentNode != null) {
-        Polymer.dom(icon.parentNode).removeChild(icon);
-      }
-    });
-
-    test('does not create icon until attached', function() {
-      icon.src = 'location.png';
-
-      var children = Polymer.dom(icon.root).querySelectorAll('img,svg');
-
-      expect(children.length).to.be.eql(0);
-      Polymer.dom(document.body).appendChild(icon);
-      Polymer.dom.flush();
-      children = Polymer.dom(icon.root).querySelectorAll('img,svg');
-      expect(children.length).to.be.eql(1);
-    });
-  });
-
-  suite('when paired with an iconset', function() {
-    var icon;
-
-    setup(function() {
-      var elements = fixture('IconFromIconset');
-
-      icon = elements[1];
-    });
-
-    test('can be assigned an icon from the iconset', function() {
-      expect(hasIcon(icon)).to.be.ok;
-    });
-
-    test('can change its icon dynamically', function() {
-      var style = icon.style;
-
-      expect(style.backgroundPosition).to.match(/0(%|px) 0(%|px)/);
-
-      icon.icon = "example:blank";
-
-      expect(style.backgroundPosition).to.match(/-24px 0(%|px)/);
-    });
-  });
-
-  suite('when no icon source is provided', function() {
-    test('will politely wait for an icon source without throwing', function() {
-      document.createElement('iron-icon');
-      fixture('WithoutAnIconSource');
-    });
-  })
-
-  suite('when loading async', function() {
-    test('will get icon after iconset is added', function() {
-      var icon = fixture('UsingAsyncIconset');
-      expect(hasIcon(icon)).to.be.false;
-      return new Promise(function(resolve, reject) {
-        window.addEventListener('iron-iconset-added', function() {
-          if (hasIcon(icon)) {
-            resolve();
-          } else {
-            reject(new Error('icon didn\'t load after iconset loaded'));
-          }
-        });
-        fixture('AsyncIconset');
-      });
-    });
-  });
-
-  suite('when switching between src and icon properties', function() {
-    var icon;
-
-    setup(function() {
-      var elements = fixture('IconFromIconset');
-      icon = elements[1];
-    });
-
-    test('will display the icon if both icon and src are set', function() {
-      icon.src = '../demo/location.png';
-      icon.icon = 'example:location';
-      expect(hasIcon(icon)).to.be.true;
-      expect(iconElementFor(icon)).to.not.exist;
-
-      // Check if it works too it we change the affectation order
-      icon.icon = 'example:location';
-      icon.src = '../demo/location.png';
-      expect(hasIcon(icon)).to.be.true;
-      expect(iconElementFor(icon)).to.not.exist;
-    });
-
-    test('will display the icon when src is defined first and then reset', function() {
-      icon.src = '../demo/location.png';
-      icon.icon = null;
-      icon.src = null;
-      icon.icon = 'example:location';
-      expect(hasIcon(icon)).to.be.true;
-      expect(iconElementFor(icon)).to.not.exist;
-    });
-
-    test('will display the src when icon is defined first and then reset', function() {
-      icon.src = null;
-      icon.icon = 'example:location';
-      icon.src = '../demo/location.png';
-      icon.icon = null;
-      expect(hasIcon(icon)).to.be.false;
-      expect(iconElementFor(icon)).to.exist;
-    });
-
-    test('will display nothing if both properties are unset', function() {
-      icon.src = '../demo/location.png';
-      icon.icon = 'example:location';
-      icon.src = null;
-      icon.icon = null;
-      expect(hasIcon(icon)).to.be.false;
-      expect(iconElementFor(icon)).to.not.exist;
-    });
-  });
-  suite('ancestor direct updates', function() {
-    test('handle properties set before ready', function() {
-      var holder = fixture('ParentForceUpdate');
-    });
-  });
-});
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-icons/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/README.md b/systrace/catapult/third_party/polymer/components/iron-icons/README.md
deleted file mode 100644
index 05d4a3a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-icons.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-icons.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icons)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-icons)_
-
-
-##&lt;iron-icons&gt;
-
-`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set.
-
-The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project.
-
-Example loading icon set:
-
-```html
-<link rel="import" href="../iron-icons/maps-icons.html">
-```
-
-To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id.
-
-Example using the directions-bus icon from the maps icon set:
-
-```html
-<iron-icon icon="maps:directions-bus"></iron-icon>
-```
-
-To load a subset of icons from one of the default `iron-icons` sets, you can
-use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
-to select individual icons, and creates an iconset from them that you can
-use directly in your elements.
-
-See [iron-icon](./iron-icon) for more information about working with icons.
-
-See [iron-iconset](./iron-iconset) and [iron-iconset-svg](./iron-iconset-svg) for more information about how to create a custom iconset.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/av-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/av-icons.html
deleted file mode 100644
index 764d622..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/av-icons.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="av" size="24">
-<svg><defs>
-<g id="add-to-queue"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-7v2h-3v3h-2v-3H8v-2h3V7h2v3h3z"/></g>
-<g id="airplay"><path d="M6 22h12l-6-6zM21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V5h18v12h-4v2h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
-<g id="album"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"/></g>
-<g id="art-track"><path d="M22 13h-8v-2h8v2zm0-6h-8v2h8V7zm-8 10h8v-2h-8v2zm-2-8v6c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V9c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2zm-1.5 6l-2.25-3-1.75 2.26-1.25-1.51L3.5 15h7z"/></g>
-<g id="av-timer"><path d="M11 17c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1zm0-14v4h2V5.08c3.39.49 6 3.39 6 6.92 0 3.87-3.13 7-7 7s-7-3.13-7-7c0-1.68.59-3.22 1.58-4.42L12 13l1.41-1.41-6.8-6.8v.02C4.42 6.45 3 9.05 3 12c0 4.97 4.02 9 9 9 4.97 0 9-4.03 9-9s-4.03-9-9-9h-1zm7 9c0-.55-.45-1-1-1s-1 .45-1 1 .45 1 1 1 1-.45 1-1zM6 12c0 .55.45 1 1 1s1-.45 1-1-.45-1-1-1-1 .45-1 1z"/></g>
-<g id="branding-watermark"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16h-9v-6h9v6z"/></g>
-<g id="call-to-action"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3v-3h18v3z"/></g>
-<g id="closed-caption"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z"/></g>
-<g id="equalizer"><path d="M10 20h4V4h-4v16zm-6 0h4v-8H4v8zM16 9v11h4V9h-4z"/></g>
-<g id="explicit"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h4v2h-4v2h4v2H9V7h6v2z"/></g>
-<g id="fast-forward"><path d="M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z"/></g>
-<g id="fast-rewind"><path d="M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z"/></g>
-<g id="featured-play-list"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 8H3V9h9v2zm0-4H3V5h9v2z"/></g>
-<g id="featured-video"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 9H3V5h9v7z"/></g>
-<g id="fiber-dvr"><path d="M17.5 10.5h2v1h-2zm-13 0h2v3h-2zM21 3H3c-1.11 0-2 .89-2 2v14c0 1.1.89 2 2 2h18c1.11 0 2-.9 2-2V5c0-1.11-.89-2-2-2zM8 13.5c0 .85-.65 1.5-1.5 1.5H3V9h3.5c.85 0 1.5.65 1.5 1.5v3zm4.62 1.5h-1.5L9.37 9h1.5l1 3.43 1-3.43h1.5l-1.75 6zM21 11.5c0 .6-.4 1.15-.9 1.4L21 15h-1.5l-.85-2H17.5v2H16V9h3.5c.85 0 1.5.65 1.5 1.5v1z"/></g>
-<g id="fiber-manual-record"><circle cx="12" cy="12" r="8"/></g>
-<g id="fiber-new"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zM8.5 15H7.3l-2.55-3.5V15H3.5V9h1.25l2.5 3.5V9H8.5v6zm5-4.74H11v1.12h2.5v1.26H11v1.11h2.5V15h-4V9h4v1.26zm7 3.74c0 .55-.45 1-1 1h-4c-.55 0-1-.45-1-1V9h1.25v4.51h1.13V9.99h1.25v3.51h1.12V9h1.25v5z"/></g>
-<g id="fiber-pin"><path d="M5.5 10.5h2v1h-2zM20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zM9 11.5c0 .85-.65 1.5-1.5 1.5h-2v2H4V9h3.5c.85 0 1.5.65 1.5 1.5v1zm3.5 3.5H11V9h1.5v6zm7.5 0h-1.2l-2.55-3.5V15H15V9h1.25l2.5 3.5V9H20v6z"/></g>
-<g id="fiber-smart-record"><g><circle cx="9" cy="12" r="8"/><path d="M17 4.26v2.09c2.33.82 4 3.04 4 5.65s-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74s-2.55-6.85-6-7.74z"/></g></g>
-<g id="forward-10"><path d="M4 13c0 4.4 3.6 8 8 8s8-3.6 8-8h-2c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6v4l5-5-5-5v4c-4.4 0-8 3.6-8 8zm6.8 3H10v-3.3L9 13v-.7l1.8-.6h.1V16zm4.3-1.8c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.8-.8v-.5s-.1-.2-.1-.3-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5z"/></g>
-<g id="forward-30"><path d="M9.6 13.5h.4c.2 0 .4-.1.5-.2s.2-.2.2-.4v-.2s-.1-.1-.1-.2-.1-.1-.2-.1h-.5s-.1.1-.2.1-.1.1-.1.2v.2h-1c0-.2 0-.3.1-.5s.2-.3.3-.4.3-.2.4-.2.4-.1.5-.1c.2 0 .4 0 .6.1s.3.1.5.2.2.2.3.4.1.3.1.5v.3s-.1.2-.1.3-.1.2-.2.2-.2.1-.3.2c.2.1.4.2.5.4s.2.4.2.6c0 .2 0 .4-.1.5s-.2.3-.3.4-.3.2-.5.2-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.4-.1-.6h.8v.2s.1.1.1.2.1.1.2.1h.5s.1-.1.2-.1.1-.1.1-.2v-.5s-.1-.1-.1-.2-.1-.1-.2-.1h-.6v-.7zm5.7.7c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.9-.8v-.5s-.1-.2-.1-.3-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5zM4 13c0 4.4 3.6 8 8 8s8-3.6 8-8h-2c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6v4l5-5-5-5v4c-4.4 0-8 3.6-8 8z"/></g>
-<g id="forward-5"><path d="M4 13c0 4.4 3.6 8 8 8s8-3.6 8-8h-2c0 3.3-2.7 6-6 6s-6-2.7-6-6 2.7-6 6-6v4l5-5-5-5v4c-4.4 0-8 3.6-8 8zm6.7.9l.2-2.2h2.4v.7h-1.7l-.1.9s.1 0 .1-.1.1 0 .1-.1.1 0 .2 0h.2c.2 0 .4 0 .5.1s.3.2.4.3.2.3.3.5.1.4.1.6c0 .2 0 .4-.1.5s-.1.3-.3.5-.3.2-.5.3-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.3-.1-.5h.8c0 .2.1.3.2.4s.2.1.4.1c.1 0 .2 0 .3-.1l.2-.2s.1-.2.1-.3v-.6l-.1-.2-.2-.2s-.2-.1-.3-.1h-.2s-.1 0-.2.1-.1 0-.1.1-.1.1-.1.1h-.6z"/></g>
-<g id="games"><path d="M15 7.5V2H9v5.5l3 3 3-3zM7.5 9H2v6h5.5l3-3-3-3zM9 16.5V22h6v-5.5l-3-3-3 3zM16.5 9l-3 3 3 3H22V9h-5.5z"/></g>
-<g id="hd"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-8 12H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm2-6h4c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1h-4V9zm1.5 4.5h2v-3h-2v3z"/></g>
-<g id="hearing"><path d="M17 20c-.29 0-.56-.06-.76-.15-.71-.37-1.21-.88-1.71-2.38-.51-1.56-1.47-2.29-2.39-3-.79-.61-1.61-1.24-2.32-2.53C9.29 10.98 9 9.93 9 9c0-2.8 2.2-5 5-5s5 2.2 5 5h2c0-3.93-3.07-7-7-7S7 5.07 7 9c0 1.26.38 2.65 1.07 3.9.91 1.65 1.98 2.48 2.85 3.15.81.62 1.39 1.07 1.71 2.05.6 1.82 1.37 2.84 2.73 3.55.51.23 1.07.35 1.64.35 2.21 0 4-1.79 4-4h-2c0 1.1-.9 2-2 2zM7.64 2.64L6.22 1.22C4.23 3.21 3 5.96 3 9s1.23 5.79 3.22 7.78l1.41-1.41C6.01 13.74 5 11.49 5 9s1.01-4.74 2.64-6.36zM11.5 9c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5-1.12-2.5-2.5-2.5-2.5 1.12-2.5 2.5z"/></g>
-<g id="high-quality"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 11H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 .55-.45 1-1 1h-.75v1.5h-1.5V15H14c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v4zm-3.5-.5h2v-3h-2v3z"/></g>
-<g id="library-add"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"/></g>
-<g id="library-books"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9H9V9h10v2zm-4 4H9v-2h6v2zm4-8H9V5h10v2z"/></g>
-<g id="library-music"><path d="M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 5h-3v5.5c0 1.38-1.12 2.5-2.5 2.5S10 13.88 10 12.5s1.12-2.5 2.5-2.5c.57 0 1.08.19 1.5.51V5h4v2zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6z"/></g>
-<g id="loop"><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></g>
-<g id="mic"><path d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"/></g>
-<g id="mic-none"><path d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm-1.2-9.1c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2l-.01 6.2c0 .66-.53 1.2-1.19 1.2-.66 0-1.2-.54-1.2-1.2V4.9zm6.5 6.1c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"/></g>
-<g id="mic-off"><path d="M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28zm-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73 4.27 3z"/></g>
-<g id="movie"><path d="M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z"/></g>
-<g id="music-video"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14zM8 15c0-1.66 1.34-3 3-3 .35 0 .69.07 1 .18V6h5v2h-3v7.03c-.02 1.64-1.35 2.97-3 2.97-1.66 0-3-1.34-3-3z"/></g>
-<g id="new-releases"><path d="M23 12l-2.44-2.78.34-3.68-3.61-.82-1.89-3.18L12 3 8.6 1.54 6.71 4.72l-3.61.81.34 3.68L1 12l2.44 2.78-.34 3.69 3.61.82 1.89 3.18L12 21l3.4 1.46 1.89-3.18 3.61-.82-.34-3.68L23 12zm-10 5h-2v-2h2v2zm0-4h-2V7h2v6z"/></g>
-<g id="not-interested"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9L16.9 18.31C15.55 19.37 13.85 20 12 20zm6.31-3.1L7.1 5.69C8.45 4.63 10.15 4 12 4c4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z"/></g>
-<g id="note"><path d="M22 10l-6-6H4c-1.1 0-2 .9-2 2v12.01c0 1.1.9 1.99 2 1.99l16-.01c1.1 0 2-.89 2-1.99v-8zm-7-4.5l5.5 5.5H15V5.5z"/></g>
-<g id="pause"><path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/></g>
-<g id="pause-circle-filled"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 14H9V8h2v8zm4 0h-2V8h2v8z"/></g>
-<g id="pause-circle-outline"><path d="M9 16h2V8H9v8zm3-14C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm1-4h2V8h-2v8z"/></g>
-<g id="play-arrow"><path d="M8 5v14l11-7z"/></g>
-<g id="play-circle-filled"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 14.5v-9l6 4.5-6 4.5z"/></g>
-<g id="play-circle-outline"><path d="M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="playlist-add"><path d="M14 10H2v2h12v-2zm0-4H2v2h12V6zm4 8v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2 16h8v-2H2v2z"/></g>
-<g id="playlist-add-check"><path d="M14 10H2v2h12v-2zm0-4H2v2h12V6zM2 16h8v-2H2v2zm19.5-4.5L23 13l-6.99 7-4.51-4.5L13 14l3.01 3 5.49-5.5z"/></g>
-<g id="playlist-play"><path d="M19 9H2v2h17V9zm0-4H2v2h17V5zM2 15h13v-2H2v2zm15-2v6l5-3-5-3z"/></g>
-<g id="queue"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"/></g>
-<g id="queue-music"><path d="M15 6H3v2h12V6zm0 4H3v2h12v-2zM3 16h8v-2H3v2zM17 6v8.18c-.31-.11-.65-.18-1-.18-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3V8h3V6h-5z"/></g>
-<g id="queue-play-next"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h2v-2H3V5h18v8h2V5c0-1.11-.9-2-2-2zm-8 7V7h-2v3H8v2h3v3h2v-3h3v-2h-3zm11 8l-4.5 4.5L18 21l3-3-3-3 1.5-1.5L24 18z"/></g>
-<g id="radio"><path d="M3.24 6.15C2.51 6.43 2 7.17 2 8v12c0 1.1.89 2 2 2h16c1.11 0 2-.9 2-2V8c0-1.11-.89-2-2-2H8.3l8.26-3.34L15.88 1 3.24 6.15zM7 20c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm13-8h-2v-2h-2v2H4V8h16v4z"/></g>
-<g id="recent-actors"><path d="M21 5v14h2V5h-2zm-4 14h2V5h-2v14zM14 5H2c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zM8 7.75c1.24 0 2.25 1.01 2.25 2.25S9.24 12.25 8 12.25 5.75 11.24 5.75 10 6.76 7.75 8 7.75zM12.5 17h-9v-.75c0-1.5 3-2.25 4.5-2.25s4.5.75 4.5 2.25V17z"/></g>
-<g id="remove-from-queue"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-7v2H8v-2h8z"/></g>
-<g id="repeat"><path d="M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z"/></g>
-<g id="repeat-one"><path d="M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4zm-4-2V9h-1l-2 1v1h1.5v4H13z"/></g>
-<g id="replay"><path d="M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/></g>
-<g id="replay-10"><path d="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6H4c0 4.4 3.6 8 8 8s8-3.6 8-8-3.6-8-8-8zm-1.1 11H10v-3.3L9 13v-.7l1.8-.6h.1V16zm4.3-1.8c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1c.2.1.3.2.5.3s.2.3.3.6.1.5.1.8v.7zm-.9-.8v-.5s-.1-.2-.1-.3-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5z"/></g>
-<g id="replay-30"><path d="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6H4c0 4.4 3.6 8 8 8s8-3.6 8-8-3.6-8-8-8zm-2.4 8.5h.4c.2 0 .4-.1.5-.2s.2-.2.2-.4v-.2s-.1-.1-.1-.2-.1-.1-.2-.1h-.5s-.1.1-.2.1-.1.1-.1.2v.2h-1c0-.2 0-.3.1-.5s.2-.3.3-.4.3-.2.4-.2.4-.1.5-.1c.2 0 .4 0 .6.1s.3.1.5.2.2.2.3.4.1.3.1.5v.3s-.1.2-.1.3-.1.2-.2.2-.2.1-.3.2c.2.1.4.2.5.4s.2.4.2.6c0 .2 0 .4-.1.5s-.2.3-.3.4-.3.2-.5.2-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.4-.1-.6h.8v.2s.1.1.1.2.1.1.2.1h.5s.1-.1.2-.1.1-.1.1-.2v-.5s-.1-.1-.1-.2-.1-.1-.2-.1h-.6v-.7zm5.7.7c0 .3 0 .6-.1.8l-.3.6s-.3.3-.5.3-.4.1-.6.1-.4 0-.6-.1-.3-.2-.5-.3-.2-.3-.3-.6-.1-.5-.1-.8v-.7c0-.3 0-.6.1-.8l.3-.6s.3-.3.5-.3.4-.1.6-.1.4 0 .6.1.3.2.5.3.2.3.3.6.1.5.1.8v.7zm-.8-.8v-.5c0-.1-.1-.2-.1-.3s-.1-.1-.2-.2-.2-.1-.3-.1-.2 0-.3.1l-.2.2s-.1.2-.1.3v2s.1.2.1.3.1.1.2.2.2.1.3.1.2 0 .3-.1l.2-.2s.1-.2.1-.3v-1.5z"/></g>
-<g id="replay-5"><path d="M12 5V1L7 6l5 5V7c3.3 0 6 2.7 6 6s-2.7 6-6 6-6-2.7-6-6H4c0 4.4 3.6 8 8 8s8-3.6 8-8-3.6-8-8-8zm-1.3 8.9l.2-2.2h2.4v.7h-1.7l-.1.9s.1 0 .1-.1.1 0 .1-.1.1 0 .2 0h.2c.2 0 .4 0 .5.1s.3.2.4.3.2.3.3.5.1.4.1.6c0 .2 0 .4-.1.5s-.1.3-.3.5-.3.2-.4.3-.4.1-.6.1c-.2 0-.4 0-.5-.1s-.3-.1-.5-.2-.2-.2-.3-.4-.1-.3-.1-.5h.8c0 .2.1.3.2.4s.2.1.4.1c.1 0 .2 0 .3-.1l.2-.2s.1-.2.1-.3v-.6l-.1-.2-.2-.2s-.2-.1-.3-.1h-.2s-.1 0-.2.1-.1 0-.1.1-.1.1-.1.1h-.7z"/></g>
-<g id="shuffle"><path d="M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z"/></g>
-<g id="skip-next"><path d="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z"/></g>
-<g id="skip-previous"><path d="M6 6h2v12H6zm3.5 6l8.5 6V6z"/></g>
-<g id="slow-motion-video"><path d="M13.05 9.79L10 7.5v9l3.05-2.29L16 12zm0 0L10 7.5v9l3.05-2.29L16 12zm0 0L10 7.5v9l3.05-2.29L16 12zM11 4.07V2.05c-2.01.2-3.84 1-5.32 2.21L7.1 5.69c1.11-.86 2.44-1.44 3.9-1.62zM5.69 7.1L4.26 5.68C3.05 7.16 2.25 8.99 2.05 11h2.02c.18-1.46.76-2.79 1.62-3.9zM4.07 13H2.05c.2 2.01 1 3.84 2.21 5.32l1.43-1.43c-.86-1.1-1.44-2.43-1.62-3.89zm1.61 6.74C7.16 20.95 9 21.75 11 21.95v-2.02c-1.46-.18-2.79-.76-3.9-1.62l-1.42 1.43zM22 12c0 5.16-3.92 9.42-8.95 9.95v-2.02C16.97 19.41 20 16.05 20 12s-3.03-7.41-6.95-7.93V2.05C18.08 2.58 22 6.84 22 12z"/></g>
-<g id="snooze"><path d="M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-3-9h3.63L9 15.2V17h6v-2h-3.63L15 10.8V9H9v2z"/></g>
-<g id="sort-by-alpha"><path d="M14.94 4.66h-4.72l2.36-2.36zm-4.69 14.71h4.66l-2.33 2.33zM6.1 6.27L1.6 17.73h1.84l.92-2.45h5.11l.92 2.45h1.84L7.74 6.27H6.1zm-1.13 7.37l1.94-5.18 1.94 5.18H4.97zm10.76 2.5h6.12v1.59h-8.53v-1.29l5.92-8.56h-5.88v-1.6h8.3v1.26l-5.93 8.6z"/></g>
-<g id="stop"><path d="M6 6h12v12H6z"/></g>
-<g id="subscriptions"><path d="M20 8H4V6h16v2zm-2-6H6v2h12V2zm4 10v8c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2v-8c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2zm-6 4l-6-3.27v6.53L16 16z"/></g>
-<g id="subtitles"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM4 12h4v2H4v-2zm10 6H4v-2h10v2zm6 0h-4v-2h4v2zm0-4H10v-2h10v2z"/></g>
-<g id="surround-sound"><path d="M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7.76 16.24l-1.41 1.41C4.78 16.1 4 14.05 4 12c0-2.05.78-4.1 2.34-5.66l1.41 1.41C6.59 8.93 6 10.46 6 12s.59 3.07 1.76 4.24zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm5.66 1.66l-1.41-1.41C17.41 15.07 18 13.54 18 12s-.59-3.07-1.76-4.24l1.41-1.41C19.22 7.9 20 9.95 20 12c0 2.05-.78 4.1-2.34 5.66zM12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="video-call"><path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4zM14 13h-3v3H9v-3H6v-2h3V8h2v3h3v2z"/></g>
-<g id="video-label"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 13H3V5h18v11z"/></g>
-<g id="video-library"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8 12.5v-9l6 4.5-6 4.5z"/></g>
-<g id="videocam"><path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"/></g>
-<g id="videocam-off"><path d="M21 6.5l-4 4V7c0-.55-.45-1-1-1H9.82L21 17.18V6.5zM3.27 2L2 3.27 4.73 6H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.21 0 .39-.08.54-.18L19.73 21 21 19.73 3.27 2z"/></g>
-<g id="volume-down"><path d="M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"/></g>
-<g id="volume-mute"><path d="M7 9v6h4l5 5V4l-5 5H7z"/></g>
-<g id="volume-off"><path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/></g>
-<g id="volume-up"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/></g>
-<g id="web"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 14H4v-4h11v4zm0-5H4V9h11v4zm5 5h-4V9h4v9z"/></g>
-<g id="web-asset"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm0 14H5V8h14v10z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/bower.json b/systrace/catapult/third_party/polymer/components/iron-icons/bower.json
deleted file mode 100644
index 97cb222..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/bower.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "iron-icons",
-  "version": "1.2.1",
-  "description": "A set of icons for use with iron-icon",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "icon"
-  ],
-  "main": "iron-icons.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-icons"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-icons",
-  "dependencies": {
-    "iron-icon": "polymerelements/iron-icon#^1.0.0",
-    "iron-iconset-svg": "polymerelements/iron-iconset-svg#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.2",
-    "iron-component-page": "polymerelements/iron-component-page#1.0.0",
-    "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
-    "iron-meta": "polymerelements/iron-meta#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0"
-  },
-  "ignore": [
-    "util",
-    "update-icons.sh"
-  ]
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/communication-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/communication-icons.html
deleted file mode 100644
index a9e1839..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/communication-icons.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="communication" size="24">
-<svg><defs>
-<g id="business"><path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/></g>
-<g id="call"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></g>
-<g id="call-end"><path d="M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08c-.18-.17-.29-.42-.29-.7 0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28-.79-.74-1.69-1.36-2.67-1.85-.33-.16-.56-.5-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z"/></g>
-<g id="call-made"><path d="M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5z"/></g>
-<g id="call-merge"><path d="M17 20.41L18.41 19 15 15.59 13.59 17 17 20.41zM7.5 8H11v5.59L5.59 19 7 20.41l6-6V8h3.5L12 3.5 7.5 8z"/></g>
-<g id="call-missed"><path d="M19.59 7L12 14.59 6.41 9H11V7H3v8h2v-4.59l7 7 9-9z"/></g>
-<g id="call-missed-outgoing"><path d="M3 8.41l9 9 7-7V15h2V7h-8v2h4.59L12 14.59 4.41 7 3 8.41z"/></g>
-<g id="call-received"><path d="M20 5.41L18.59 4 7 15.59V9H5v10h10v-2H8.41z"/></g>
-<g id="call-split"><path d="M14 4l2.29 2.29-2.88 2.88 1.42 1.42 2.88-2.88L20 10V4zm-4 0H4v6l2.29-2.29 4.71 4.7V20h2v-8.41l-5.29-5.3z"/></g>
-<g id="chat"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 9h12v2H6V9zm8 5H6v-2h8v2zm4-6H6V6h12v2z"/></g>
-<g id="chat-bubble"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/></g>
-<g id="chat-bubble-outline"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/></g>
-<g id="clear-all"><path d="M5 13h14v-2H5v2zm-2 4h14v-2H3v2zM7 7v2h14V7H7z"/></g>
-<g id="comment"><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18zM18 14H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></g>
-<g id="contact-mail"><path d="M21 8V7l-3 2-3-2v1l3 2 3-2zm1-5H2C.9 3 0 3.9 0 5v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2L24 5c0-1.1-.9-2-2-2zM8 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H2v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm8-6h-8V6h8v6z"/></g>
-<g id="contact-phone"><path d="M22 3H2C.9 3 0 3.9 0 5v14c0 1.1.9 2 2 2h20c1.1 0 1.99-.9 1.99-2L24 5c0-1.1-.9-2-2-2zM8 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H2v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1zm3.85-4h1.64L21 16l-1.99 1.99c-1.31-.98-2.28-2.38-2.73-3.99-.18-.64-.28-1.31-.28-2s.1-1.36.28-2c.45-1.62 1.42-3.01 2.73-3.99L21 8l-1.51 2h-1.64c-.22.63-.35 1.3-.35 2s.13 1.37.35 2z"/></g>
-<g id="contacts"><path d="M20 0H4v2h16V0zM4 24h16v-2H4v2zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 2.25S9.75 10.24 9.75 9 10.76 6.75 12 6.75zM17 17H7v-1.5c0-1.67 3.33-2.5 5-2.5s5 .83 5 2.5V17z"/></g>
-<g id="dialer-sip"><path d="M17 3h-1v5h1V3zm-2 2h-2V4h2V3h-3v3h2v1h-2v1h3V5zm3-2v5h1V6h2V3h-3zm2 2h-1V4h1v1zm0 10.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.01.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.27-.26.35-.65.24-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z"/></g>
-<g id="dialpad"><path d="M12 19c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM6 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-6 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="email"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
-<g id="forum"><path d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"/></g>
-<g id="import-contacts"><path d="M21 5c-1.11-.35-2.33-.5-3.5-.5-1.95 0-4.05.4-5.5 1.5-1.45-1.1-3.55-1.5-5.5-1.5S2.45 4.9 1 6v14.65c0 .25.25.5.5.5.1 0 .15-.05.25-.05C3.1 20.45 5.05 20 6.5 20c1.95 0 4.05.4 5.5 1.5 1.35-.85 3.8-1.5 5.5-1.5 1.65 0 3.35.3 4.75 1.05.1.05.15.05.25.05.25 0 .5-.25.5-.5V6c-.6-.45-1.25-.75-2-1zm0 13.5c-1.1-.35-2.3-.5-3.5-.5-1.7 0-4.15.65-5.5 1.5V8c1.35-.85 3.8-1.5 5.5-1.5 1.2 0 2.4.15 3.5.5v11.5z"/></g>
-<g id="import-export"><path d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/></g>
-<g id="invert-colors-off"><path d="M20.65 20.87l-2.35-2.35-6.3-6.29-3.56-3.57-1.42-1.41L4.27 4.5 3 5.77l2.78 2.78c-2.55 3.14-2.36 7.76.56 10.69C7.9 20.8 9.95 21.58 12 21.58c1.79 0 3.57-.59 5.03-1.78l2.7 2.7L21 21.23l-.35-.36zM12 19.59c-1.6 0-3.11-.62-4.24-1.76C6.62 16.69 6 15.19 6 13.59c0-1.32.43-2.57 1.21-3.6L12 14.77v4.82zM12 5.1v4.58l7.25 7.26c1.37-2.96.84-6.57-1.6-9.01L12 2.27l-3.7 3.7 1.41 1.41L12 5.1z"/></g>
-<g id="live-help"><path d="M19 2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-6 16h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 11.9 13 12.5 13 14h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></g>
-<g id="location-off"><path d="M12 6.5c1.38 0 2.5 1.12 2.5 2.5 0 .74-.33 1.39-.83 1.85l3.63 3.63c.98-1.86 1.7-3.8 1.7-5.48 0-3.87-3.13-7-7-7-1.98 0-3.76.83-5.04 2.15l3.19 3.19c.46-.52 1.11-.84 1.85-.84zm4.37 9.6l-4.63-4.63-.11-.11L3.27 3 2 4.27l3.18 3.18C5.07 7.95 5 8.47 5 9c0 5.25 7 13 7 13s1.67-1.85 3.38-4.35L18.73 21 20 19.73l-3.63-3.63z"/></g>
-<g id="location-on"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
-<g id="mail-outline"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V8l8 5 8-5v10zm-8-7L4 6h16l-8 5z"/></g>
-<g id="message"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></g>
-<g id="no-sim"><path d="M18.99 5c0-1.1-.89-2-1.99-2h-7L7.66 5.34 19 16.68 18.99 5zM3.65 3.88L2.38 5.15 5 7.77V19c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27L3.65 3.88z"/></g>
-<g id="phone"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></g>
-<g id="phonelink-erase"><path d="M13 8.2l-1-1-4 4-4-4-1 1 4 4-4 4 1 1 4-4 4 4 1-1-4-4 4-4zM19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2z"/></g>
-<g id="phonelink-lock"><path d="M19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm-8.2 10V9.5C10.8 8.1 9.4 7 8 7S5.2 8.1 5.2 9.5V11c-.6 0-1.2.6-1.2 1.2v3.5c0 .7.6 1.3 1.2 1.3h5.5c.7 0 1.3-.6 1.3-1.2v-3.5c0-.7-.6-1.3-1.2-1.3zm-1.3 0h-3V9.5c0-.8.7-1.3 1.5-1.3s1.5.5 1.5 1.3V11z"/></g>
-<g id="phonelink-ring"><path d="M20.1 7.7l-1 1c1.8 1.8 1.8 4.6 0 6.5l1 1c2.5-2.3 2.5-6.1 0-8.5zM18 9.8l-1 1c.5.7.5 1.6 0 2.3l1 1c1.2-1.2 1.2-3 0-4.3zM14 1H4c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 19H4V4h10v16z"/></g>
-<g id="phonelink-setup"><path d="M11.8 12.5v-1l1.1-.8c.1-.1.1-.2.1-.3l-1-1.7c-.1-.1-.2-.2-.3-.1l-1.3.4c-.3-.2-.6-.4-.9-.5l-.2-1.3c0-.1-.1-.2-.3-.2H7c-.1 0-.2.1-.3.2l-.2 1.3c-.3.1-.6.3-.9.5l-1.3-.5c-.1 0-.2 0-.3.1l-1 1.7c-.1.1 0 .2.1.3l1.1.8v1l-1.1.8c-.1.2-.1.3-.1.4l1 1.7c.1.1.2.2.3.1l1.4-.4c.3.2.6.4.9.5l.2 1.3c-.1.1.1.2.2.2h2c.1 0 .2-.1.3-.2l.2-1.3c.3-.1.6-.3.9-.5l1.3.5c.1 0 .2 0 .3-.1l1-1.7c.1-.1 0-.2-.1-.3l-1.1-.9zM8 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM19 1H9c-1.1 0-2 .9-2 2v3h2V4h10v16H9v-2H7v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2z"/></g>
-<g id="portable-wifi-off"><path d="M17.56 14.24c.28-.69.44-1.45.44-2.24 0-3.31-2.69-6-6-6-.79 0-1.55.16-2.24.44l1.62 1.62c.2-.03.41-.06.62-.06 2.21 0 4 1.79 4 4 0 .21-.02.42-.05.63l1.61 1.61zM12 4c4.42 0 8 3.58 8 8 0 1.35-.35 2.62-.95 3.74l1.47 1.47C21.46 15.69 22 13.91 22 12c0-5.52-4.48-10-10-10-1.91 0-3.69.55-5.21 1.47l1.46 1.46C9.37 4.34 10.65 4 12 4zM3.27 2.5L2 3.77l2.1 2.1C2.79 7.57 2 9.69 2 12c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 17.53 4 14.96 4 12c0-1.76.57-3.38 1.53-4.69l1.43 1.44C6.36 9.68 6 10.8 6 12c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-.65.17-1.25.44-1.79l1.58 1.58L10 12c0 1.1.9 2 2 2l.21-.02.01.01 7.51 7.51L21 20.23 4.27 3.5l-1-1z"/></g>
-<g id="present-to-all"><path d="M21 3H3c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h18c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 16.02H3V4.98h18v14.04zM10 12H8l4-4 4 4h-2v4h-4v-4z"/></g>
-<g id="ring-volume"><path d="M23.71 16.67C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71 0 .28.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73s3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.66 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71 0-.27-.11-.52-.29-.7zM21.16 6.26l-1.41-1.41-3.56 3.55 1.41 1.41s3.45-3.52 3.56-3.55zM13 2h-2v5h2V2zM6.4 9.81L7.81 8.4 4.26 4.84 2.84 6.26c.11.03 3.56 3.55 3.56 3.55z"/></g>
-<g id="rss-feed"><circle cx="6.18" cy="17.82" r="2.18"/><path d="M4 4.44v2.83c7.03 0 12.73 5.7 12.73 12.73h2.83c0-8.59-6.97-15.56-15.56-15.56zm0 5.66v2.83c3.9 0 7.07 3.17 7.07 7.07h2.83c0-5.47-4.43-9.9-9.9-9.9z"/></g>
-<g id="screen-share"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.11-.9-2-2-2H4c-1.11 0-2 .89-2 2v10c0 1.1.89 2 2 2H0v2h24v-2h-4zm-7-3.53v-2.19c-2.78 0-4.61.85-6 2.72.56-2.67 2.11-5.33 6-5.87V7l4 3.73-4 3.74z"/></g>
-<g id="speaker-phone"><path d="M7 7.07L8.43 8.5c.91-.91 2.18-1.48 3.57-1.48s2.66.57 3.57 1.48L17 7.07C15.72 5.79 13.95 5 12 5s-3.72.79-5 2.07zM12 1C8.98 1 6.24 2.23 4.25 4.21l1.41 1.41C7.28 4 9.53 3 12 3s4.72 1 6.34 2.62l1.41-1.41C17.76 2.23 15.02 1 12 1zm2.86 9.01L9.14 10C8.51 10 8 10.51 8 11.14v9.71c0 .63.51 1.14 1.14 1.14h5.71c.63 0 1.14-.51 1.14-1.14v-9.71c.01-.63-.5-1.13-1.13-1.13zM15 20H9v-8h6v8z"/></g>
-<g id="stay-current-landscape"><path d="M1.01 7L1 17c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2H3c-1.1 0-1.99.9-1.99 2zM19 7v10H5V7h14z"/></g>
-<g id="stay-current-portrait"><path d="M17 1.01L7 1c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
-<g id="stay-primary-landscape"><path d="M1.01 7L1 17c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2H3c-1.1 0-1.99.9-1.99 2zM19 7v10H5V7h14z"/></g>
-<g id="stay-primary-portrait"><path d="M17 1.01L7 1c-1.1 0-1.99.9-1.99 2v18c0 1.1.89 2 1.99 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
-<g id="stop-screen-share"><path d="M21.22 18.02l2 2H24v-2h-2.78zm.77-2l.01-10c0-1.11-.9-2-2-2H7.22l5.23 5.23c.18-.04.36-.07.55-.1V7.02l4 3.73-1.58 1.47 5.54 5.54c.61-.33 1.03-.99 1.03-1.74zM2.39 1.73L1.11 3l1.54 1.54c-.4.36-.65.89-.65 1.48v10c0 1.1.89 2 2 2H0v2h18.13l2.71 2.71 1.27-1.27L2.39 1.73zM7 15.02c.31-1.48.92-2.95 2.07-4.06l1.59 1.59c-1.54.38-2.7 1.18-3.66 2.47z"/></g>
-<g id="swap-calls"><path d="M18 4l-4 4h3v7c0 1.1-.9 2-2 2s-2-.9-2-2V8c0-2.21-1.79-4-4-4S5 5.79 5 8v7H2l4 4 4-4H7V8c0-1.1.9-2 2-2s2 .9 2 2v7c0 2.21 1.79 4 4 4s4-1.79 4-4V8h3l-4-4z"/></g>
-<g id="textsms"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM9 11H7V9h2v2zm4 0h-2V9h2v2zm4 0h-2V9h2v2z"/></g>
-<g id="voicemail"><path d="M18.5 6C15.46 6 13 8.46 13 11.5c0 1.33.47 2.55 1.26 3.5H9.74c.79-.95 1.26-2.17 1.26-3.5C11 8.46 8.54 6 5.5 6S0 8.46 0 11.5 2.46 17 5.5 17h13c3.04 0 5.5-2.46 5.5-5.5S21.54 6 18.5 6zm-13 9C3.57 15 2 13.43 2 11.5S3.57 8 5.5 8 9 9.57 9 11.5 7.43 15 5.5 15zm13 0c-1.93 0-3.5-1.57-3.5-3.5S16.57 8 18.5 8 22 9.57 22 11.5 20.43 15 18.5 15z"/></g>
-<g id="vpn-key"><path d="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-icons/demo/index.html
deleted file mode 100644
index 0dfbf36..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/demo/index.html
+++ /dev/null
@@ -1,116 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-icons demo</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
-
-  <!-- load default iconset -->
-  <link rel="import" href="../iron-icons.html">
-
-  <!-- load the rest -->
-  <link rel="import" href="../av-icons.html">
-  <link rel="import" href="../communication-icons.html">
-  <link rel="import" href="../device-icons.html">
-  <link rel="import" href="../editor-icons.html">
-  <link rel="import" href="../hardware-icons.html">
-  <link rel="import" href="../image-icons.html">
-  <link rel="import" href="../maps-icons.html">
-  <link rel="import" href="../notification-icons.html">
-  <link rel="import" href="../social-icons.html">
-  <link rel="import" href="../places-icons.html">
-
-  <style is="custom-style">
-    h2 {
-      text-transform: capitalize;
-    }
-
-    iron-icon {
-      transition: all 0.2s;
-      -webkit-transition: all 0.2s;
-    }
-
-    iron-icon:hover {
-      fill: var(--google-yellow-700);
-    }
-
-    .set {
-      margin: auto;
-      padding: 1em 0;
-      border-bottom: 1px solid silver;
-      @apply(--layout-horizontal);
-      @apply(--layout-wrap);
-    }
-
-    .set:last-of-type {
-      border-bottom: none;
-    }
-
-    .set:nth-of-type(4n-3) {
-      color: var(--paper-grey-700);
-    }
-
-    .set:nth-of-type(4n-2) {
-      color: var(--paper-pink-500);
-    }
-
-    .set:nth-of-type(4n-1) {
-      color: var(--google-green-500);
-    }
-
-    .set:nth-of-type(4n) {
-      color: var( --google-blue-500);
-    }
-
-    .container {
-      min-width: 10em;
-      padding: 1em 0.5em;
-      text-align: center;
-      @apply(--layout-vertical);
-      @apply(--layout-center);
-      @apply(--layout-flex);
-    }
-
-    .container > div {
-      margin-top: 0.5em;
-      color: black;
-      font-size: 10px;
-    }
-  </style>
-</head>
-<body>
-  <template is="dom-bind">
-   <iron-meta type="iconset" list="{{iconsets}}"></iron-meta>
-
-    <template is="dom-repeat" items="{{iconsets}}">
-      <h2>{{item.name}}</h2>
-
-      <div class="set">
-        <template is="dom-repeat" items="{{getIconNames(item)}}">
-          <span class="container">
-            <iron-icon icon="{{item}}"></iron-icon>
-            <div>{{item}}</div>
-          </span>
-        </template>
-      </div>
-    </template>
-  </template>
-
-  <script>
-    document.querySelector('[is=dom-bind]').getIconNames = function(iconset) {
-      return iconset.getIconNames();
-    };
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/device-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/device-icons.html
deleted file mode 100644
index 190f896..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/device-icons.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="device" size="24">
-<svg><defs>
-<g id="access-alarm"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="access-alarms"><path d="M22 5.7l-4.6-3.9-1.3 1.5 4.6 3.9L22 5.7zM7.9 3.4L6.6 1.9 2 5.7l1.3 1.5 4.6-3.8zM12.5 8H11v6l4.7 2.9.8-1.2-4-2.4V8zM12 4c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9zm0 16c-3.9 0-7-3.1-7-7s3.1-7 7-7 7 3.1 7 7-3.1 7-7 7z"/></g>
-<g id="access-time"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></g>
-<g id="add-alarm"><path d="M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3H8v2h3v3h2v-3h3v-2h-3V9z"/></g>
-<g id="airplanemode-active"><path d="M10.18 9"/><path d="M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z"/></g>
-<g id="airplanemode-inactive"><path d="M13 9V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5v3.68l7.83 7.83L21 16v-2l-8-5zM3 5.27l4.99 4.99L2 14v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-3.73L18.73 21 20 19.73 4.27 4 3 5.27z"/></g>
-<g id="battery-20"><path d="M7 17v3.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V17H7z"/><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V17h10V5.33z"/></g>
-<g id="battery-30"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V15h10V5.33z"/><path d="M7 15v5.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V15H7z"/></g>
-<g id="battery-50"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V13h10V5.33z"/><path d="M7 13v7.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V13H7z"/></g>
-<g id="battery-60"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V11h10V5.33z"/><path d="M7 11v9.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V11H7z"/></g>
-<g id="battery-80"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V9h10V5.33z"/><path d="M7 9v11.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V9H7z"/></g>
-<g id="battery-90"><path fill-opacity=".3" d="M17 5.33C17 4.6 16.4 4 15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V8h10V5.33z"/><path d="M7 8v12.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V8H7z"/></g>
-<g id="battery-alert"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM13 18h-2v-2h2v2zm0-4h-2V9h2v5z"/></g>
-<g id="battery-charging-20"><path d="M11 20v-3H7v3.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V17h-4.4L11 20z"/><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V17h4v-2.5H9L13 7v5.5h2L12.6 17H17V5.33C17 4.6 16.4 4 15.67 4z"/></g>
-<g id="battery-charging-30"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v9.17h2L13 7v5.5h2l-1.07 2H17V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M11 20v-5.5H7v6.17C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V14.5h-3.07L11 20z"/></g>
-<g id="battery-charging-50"><path d="M14.47 13.5L11 20v-5.5H9l.53-1H7v7.17C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V13.5h-2.53z"/><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v8.17h2.53L13 7v5.5h2l-.53 1H17V5.33C17 4.6 16.4 4 15.67 4z"/></g>
-<g id="battery-charging-60"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V11h3.87L13 7v4h4V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M13 12.5h2L11 20v-5.5H9l1.87-3.5H7v9.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V11h-4v1.5z"/></g>
-<g id="battery-charging-80"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V9h4.93L13 7v2h4V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M13 12.5h2L11 20v-5.5H9L11.93 9H7v11.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V9h-4v3.5z"/></g>
-<g id="battery-charging-90"><path fill-opacity=".3" d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33V8h5.47L13 7v1h4V5.33C17 4.6 16.4 4 15.67 4z"/><path d="M13 12.5h2L11 20v-5.5H9L12.47 8H7v12.67C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V8h-4v4.5z"/></g>
-<g id="battery-charging-full"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM11 20v-5.5H9L13 7v5.5h2L11 20z"/></g>
-<g id="battery-full"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4z"/></g>
-<g id="battery-std"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4z"/></g>
-<g id="battery-unknown"><path d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zm-2.72 13.95h-1.9v-1.9h1.9v1.9zm1.35-5.26s-.38.42-.67.71c-.48.48-.83 1.15-.83 1.6h-1.6c0-.83.46-1.52.93-2l.93-.94c.27-.27.44-.65.44-1.06 0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5H9c0-1.66 1.34-3 3-3s3 1.34 3 3c0 .66-.27 1.26-.7 1.69z"/></g>
-<g id="bluetooth"><path d="M17.71 7.71L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88z"/></g>
-<g id="bluetooth-connected"><path d="M7 12l-2-2-2 2 2 2 2-2zm10.71-4.29L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88zM19 10l-2 2 2 2 2-2-2-2z"/></g>
-<g id="bluetooth-disabled"><path d="M13 5.83l1.88 1.88-1.6 1.6 1.41 1.41 3.02-3.02L12 2h-1v5.03l2 2v-3.2zM5.41 4L4 5.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l4.29-4.29 2.3 2.29L20 18.59 5.41 4zM13 18.17v-3.76l1.88 1.88L13 18.17z"/></g>
-<g id="bluetooth-searching"><path d="M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1L10 2H9v7.59L4.41 5 3 6.41 8.59 12 3 17.59 4.41 19 9 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM11 5.83l1.88 1.88L11 9.59V5.83zm1.88 10.46L11 18.17v-3.76l1.88 1.88z"/></g>
-<g id="brightness-auto"><path d="M10.85 12.65h2.3L12 9l-1.15 3.65zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM14.3 16l-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9h-1.9z"/></g>
-<g id="brightness-high"><path d="M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z"/></g>
-<g id="brightness-low"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/></g>
-<g id="brightness-medium"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18V6c3.31 0 6 2.69 6 6s-2.69 6-6 6z"/></g>
-<g id="data-usage"><path d="M13 2.05v3.03c3.39.49 6 3.39 6 6.92 0 .9-.18 1.75-.48 2.54l2.6 1.53c.56-1.24.88-2.62.88-4.07 0-5.18-3.95-9.45-9-9.95zM12 19c-3.87 0-7-3.13-7-7 0-3.53 2.61-6.43 6-6.92V2.05c-5.06.5-9 4.76-9 9.95 0 5.52 4.47 10 9.99 10 3.31 0 6.24-1.61 8.06-4.09l-2.6-1.53C16.17 17.98 14.21 19 12 19z"/></g>
-<g id="developer-mode"><path d="M7 5h10v2h2V3c0-1.1-.9-1.99-2-1.99L7 1c-1.1 0-2 .9-2 2v4h2V5zm8.41 11.59L20 12l-4.59-4.59L14 8.83 17.17 12 14 15.17l1.41 1.42zM10 15.17L6.83 12 10 8.83 8.59 7.41 4 12l4.59 4.59L10 15.17zM17 19H7v-2H5v4c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2v-4h-2v2z"/></g>
-<g id="devices"><path d="M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4V6zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z"/></g>
-<g id="dvr"><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12zm-2-9H8v2h11V8zm0 4H8v2h11v-2zM7 8H5v2h2V8zm0 4H5v2h2v-2z"/></g>
-<g id="gps-fixed"><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="gps-not-fixed"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="gps-off"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5C10.16 5.19 11.06 5 12 5c3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15H23v-2h-2.06zM3 4.27l2.04 2.04C3.97 7.62 3.25 9.23 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c1.77-.2 3.38-.91 4.69-1.98L19.73 21 21 19.73 4.27 3 3 4.27zm13.27 13.27C15.09 18.45 13.61 19 12 19c-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z"/></g>
-<g id="graphic-eq"><path d="M7 18h2V6H7v12zm4 4h2V2h-2v20zm-8-8h2v-4H3v4zm12 4h2V6h-2v12zm4-8v4h2v-4h-2z"/></g>
-<g id="location-disabled"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06c-1.13.12-2.19.46-3.16.97l1.5 1.5C10.16 5.19 11.06 5 12 5c3.87 0 7 3.13 7 7 0 .94-.19 1.84-.52 2.65l1.5 1.5c.5-.96.84-2.02.97-3.15H23v-2h-2.06zM3 4.27l2.04 2.04C3.97 7.62 3.25 9.23 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c1.77-.2 3.38-.91 4.69-1.98L19.73 21 21 19.73 4.27 3 3 4.27zm13.27 13.27C15.09 18.45 13.61 19 12 19c-3.87 0-7-3.13-7-7 0-1.61.55-3.09 1.46-4.27l9.81 9.81z"/></g>
-<g id="location-searching"><path d="M20.94 11c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="network-cell"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M17 7L2 22h15z"/></g>
-<g id="network-wifi"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54C20.04 10.62 16.81 8 12 8c-4.81 0-8.04 2.62-8.47 2.95z"/></g>
-<g id="nfc"><path d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 18H4V4h16v16zM18 6h-5c-1.1 0-2 .9-2 2v2.28c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72V8h3v8H8V8h2V6H6v12h12V6z"/></g>
-<g id="screen-lock-landscape"><path d="M21 5H3c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-2 12H5V7h14v10zm-9-1h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1z"/></g>
-<g id="screen-lock-portrait"><path d="M10 16h4c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1v-1c0-1.11-.9-2-2-2-1.11 0-2 .9-2 2v1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1zm.8-6c0-.66.54-1.2 1.2-1.2.66 0 1.2.54 1.2 1.2v1h-2.4v-1zM17 1H7c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 18H7V5h10v14z"/></g>
-<g id="screen-lock-rotation"><path d="M23.25 12.77l-2.57-2.57-1.41 1.41 2.22 2.22-5.66 5.66L4.51 8.17l5.66-5.66 2.1 2.1 1.41-1.41L11.23.75c-.59-.59-1.54-.59-2.12 0L2.75 7.11c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12zM8.47 20.48C5.2 18.94 2.86 15.76 2.5 12H1c.51 6.16 5.66 11 11.95 11l.66-.03-3.81-3.82-1.33 1.33zM16 9h5c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1v-.5C21 1.12 19.88 0 18.5 0S16 1.12 16 2.5V3c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1zm.8-6.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7V3h-3.4v-.5z"/></g>
-<g id="screen-rotation"><path d="M16.48 2.52c3.27 1.55 5.61 4.72 5.97 8.48h1.5C23.44 4.84 18.29 0 12 0l-.66.03 3.81 3.81 1.33-1.32zm-6.25-.77c-.59-.59-1.54-.59-2.12 0L1.75 8.11c-.59.59-.59 1.54 0 2.12l12.02 12.02c.59.59 1.54.59 2.12 0l6.36-6.36c.59-.59.59-1.54 0-2.12L10.23 1.75zm4.6 19.44L2.81 9.17l6.36-6.36 12.02 12.02-6.36 6.36zm-7.31.29C4.25 19.94 1.91 16.76 1.55 13H.05C.56 19.16 5.71 24 12 24l.66-.03-3.81-3.81-1.33 1.32z"/></g>
-<g id="sd-storage"><path d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-6 6h-2V4h2v4zm3 0h-2V4h2v4zm3 0h-2V4h2v4z"/></g>
-<g id="settings-system-daydream"><path d="M9 16h6.5c1.38 0 2.5-1.12 2.5-2.5S16.88 11 15.5 11h-.05c-.24-1.69-1.69-3-3.45-3-1.4 0-2.6.83-3.16 2.02h-.16C7.17 10.18 6 11.45 6 13c0 1.66 1.34 3 3 3zM21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z"/></g>
-<g id="signal-cellular-0-bar"><path fill-opacity=".3" d="M2 22h20V2z"/></g>
-<g id="signal-cellular-1-bar"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M12 12L2 22h10z"/></g>
-<g id="signal-cellular-2-bar"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M14 10L2 22h12z"/></g>
-<g id="signal-cellular-3-bar"><path fill-opacity=".3" d="M2 22h20V2z"/><path d="M17 7L2 22h15z"/></g>
-<g id="signal-cellular-4-bar"><path d="M2 22h20V2z"/></g>
-<g id="signal-cellular-connected-no-internet-0-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M20 22h2v-2h-2v2zm0-12v8h2v-8h-2z"/></g>
-<g id="signal-cellular-connected-no-internet-1-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M20 10v8h2v-8h-2zm-8 12V12L2 22h10zm8 0h2v-2h-2v2z"/></g>
-<g id="signal-cellular-connected-no-internet-2-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M14 22V10L2 22h12zm6-12v8h2v-8h-2zm0 12h2v-2h-2v2z"/></g>
-<g id="signal-cellular-connected-no-internet-3-bar"><path fill-opacity=".3" d="M22 8V2L2 22h16V8z"/><path d="M17 22V7L2 22h15zm3-12v8h2v-8h-2zm0 12h2v-2h-2v2z"/></g>
-<g id="signal-cellular-connected-no-internet-4-bar"><path d="M20 18h2v-8h-2v8zm0 4h2v-2h-2v2zM2 22h16V8h4V2L2 22z"/></g>
-<g id="signal-cellular-no-sim"><path d="M18.99 5c0-1.1-.89-2-1.99-2h-7L7.66 5.34 19 16.68 18.99 5zM3.65 3.88L2.38 5.15 5 7.77V19c0 1.1.9 2 2 2h10.01c.35 0 .67-.1.96-.26l1.88 1.88 1.27-1.27L3.65 3.88z"/></g>
-<g id="signal-cellular-null"><path d="M20 6.83V20H6.83L20 6.83M22 2L2 22h20V2z"/></g>
-<g id="signal-cellular-off"><path d="M21 1l-8.59 8.59L21 18.18V1zM4.77 4.5L3.5 5.77l6.36 6.36L1 21h17.73l2 2L22 21.73 4.77 4.5z"/></g>
-<g id="signal-wifi-0-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/></g>
-<g id="signal-wifi-1-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M6.67 14.86L12 21.49v.01l.01-.01 5.33-6.63C17.06 14.65 15.03 13 12 13s-5.06 1.65-5.33 1.86z"/></g>
-<g id="signal-wifi-1-bar-lock"><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16z"/><path d="M15.5 14.5c0-2.8 2.2-5 5-5 .4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4C5.3 3 .8 6.7.4 7L12 21.5l3.5-4.3v-2.7z" opacity=".3"/><path d="M6.7 14.9l5.3 6.6 3.5-4.3v-2.6c0-.2 0-.5.1-.7-.9-.5-2.2-.9-3.6-.9-3 0-5.1 1.7-5.3 1.9z"/></g>
-<g id="signal-wifi-2-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M4.79 12.52l7.2 8.98H12l.01-.01 7.2-8.98C18.85 12.24 16.1 10 12 10s-6.85 2.24-7.21 2.52z"/></g>
-<g id="signal-wifi-2-bar-lock"><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16z"/><path d="M15.5 14.5c0-2.8 2.2-5 5-5 .4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4C5.3 3 .8 6.7.4 7L12 21.5l3.5-4.3v-2.7z" opacity=".3"/><path d="M4.8 12.5l7.2 9 3.5-4.4v-2.6c0-1.3.5-2.5 1.4-3.4C15.6 10.5 14 10 12 10c-4.1 0-6.8 2.2-7.2 2.5z"/></g>
-<g id="signal-wifi-3-bar"><path fill-opacity=".3" d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/><path d="M3.53 10.95l8.46 10.54.01.01.01-.01 8.46-10.54C20.04 10.62 16.81 8 12 8c-4.81 0-8.04 2.62-8.47 2.95z"/></g>
-<g id="signal-wifi-3-bar-lock"><path opacity=".3" d="M12 3C5.3 3 .8 6.7.4 7l3.2 3.9L12 21.5l3.5-4.3v-2.6c0-2.2 1.4-4 3.3-4.7.3-.1.5-.2.8-.2.3-.1.6-.1.9-.1.4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4z"/><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16zm-10 5.5l3.5-4.3v-2.6c0-2.2 1.4-4 3.3-4.7C17.3 9 14.9 8 12 8c-4.8 0-8 2.6-8.5 2.9"/></g>
-<g id="signal-wifi-4-bar"><path d="M12.01 21.49L23.64 7c-.45-.34-4.93-4-11.64-4C5.28 3 .81 6.66.36 7l11.63 14.49.01.01.01-.01z"/></g>
-<g id="signal-wifi-4-bar-lock"><path d="M23 16v-1.5c0-1.4-1.1-2.5-2.5-2.5S18 13.1 18 14.5V16c-.5 0-1 .5-1 1v4c0 .5.5 1 1 1h5c.5 0 1-.5 1-1v-4c0-.5-.5-1-1-1zm-1 0h-3v-1.5c0-.8.7-1.5 1.5-1.5s1.5.7 1.5 1.5V16zm-6.5-1.5c0-2.8 2.2-5 5-5 .4 0 .7 0 1 .1L23.6 7c-.4-.3-4.9-4-11.6-4C5.3 3 .8 6.7.4 7L12 21.5l3.5-4.4v-2.6z"/></g>
-<g id="signal-wifi-off"><path d="M23.64 7c-.45-.34-4.93-4-11.64-4-1.5 0-2.89.19-4.15.48L18.18 13.8 23.64 7zm-6.6 8.22L3.27 1.44 2 2.72l2.05 2.06C1.91 5.76.59 6.82.36 7l11.63 14.49.01.01.01-.01 3.9-4.86 3.32 3.32 1.27-1.27-3.46-3.46z"/></g>
-<g id="storage"><path d="M2 20h20v-4H2v4zm2-3h2v2H4v-2zM2 4v4h20V4H2zm4 3H4V5h2v2zm-4 7h20v-4H2v4zm2-3h2v2H4v-2z"/></g>
-<g id="usb"><path d="M15 7v4h1v2h-3V5h2l-3-4-3 4h2v8H8v-2.07c.7-.37 1.2-1.08 1.2-1.93 0-1.21-.99-2.2-2.2-2.2-1.21 0-2.2.99-2.2 2.2 0 .85.5 1.56 1.2 1.93V13c0 1.11.89 2 2 2h3v3.05c-.71.37-1.2 1.1-1.2 1.95 0 1.22.99 2.2 2.2 2.2 1.21 0 2.2-.98 2.2-2.2 0-.85-.49-1.58-1.2-1.95V15h3c1.11 0 2-.89 2-2v-2h1V7h-4z"/></g>
-<g id="wallpaper"><path d="M4 4h7V2H4c-1.1 0-2 .9-2 2v7h2V4zm6 9l-4 5h12l-3-4-2.03 2.71L10 13zm7-4.5c0-.83-.67-1.5-1.5-1.5S14 7.67 14 8.5s.67 1.5 1.5 1.5S17 9.33 17 8.5zM20 2h-7v2h7v7h2V4c0-1.1-.9-2-2-2zm0 18h-7v2h7c1.1 0 2-.9 2-2v-7h-2v7zM4 13H2v7c0 1.1.9 2 2 2h7v-2H4v-7z"/></g>
-<g id="widgets"><path d="M13 13v8h8v-8h-8zM3 21h8v-8H3v8zM3 3v8h8V3H3zm13.66-1.31L11 7.34 16.66 13l5.66-5.66-5.66-5.65z"/></g>
-<g id="wifi-lock"><path d="M20.5 9.5c.28 0 .55.04.81.08L24 6c-3.34-2.51-7.5-4-12-4S3.34 3.49 0 6l12 16 3.5-4.67V14.5c0-2.76 2.24-5 5-5zM23 16v-1.5c0-1.38-1.12-2.5-2.5-2.5S18 13.12 18 14.5V16c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V16z"/></g>
-<g id="wifi-tethering"><path d="M12 11c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 2c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 2.22 1.21 4.15 3 5.19l1-1.74c-1.19-.7-2-1.97-2-3.45 0-2.21 1.79-4 4-4s4 1.79 4 4c0 1.48-.81 2.75-2 3.45l1 1.74c1.79-1.04 3-2.97 3-5.19zM12 3C6.48 3 2 7.48 2 13c0 3.7 2.01 6.92 4.99 8.65l1-1.73C5.61 18.53 4 15.96 4 13c0-4.42 3.58-8 8-8s8 3.58 8 8c0 2.96-1.61 5.53-4 6.92l1 1.73c2.99-1.73 5-4.95 5-8.65 0-5.52-4.48-10-10-10z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/editor-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/editor-icons.html
deleted file mode 100644
index bc7084d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/editor-icons.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="editor" size="24">
-<svg><defs>
-<g id="attach-file"><path d="M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4V5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1V6H10v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V5c0-2.21-1.79-4-4-4S7 2.79 7 5v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5V6h-1.5z"/></g>
-<g id="attach-money"><path d="M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4z"/></g>
-<g id="border-all"><path d="M3 3v18h18V3H3zm8 16H5v-6h6v6zm0-8H5V5h6v6zm8 8h-6v-6h6v6zm0-8h-6V5h6v6z"/></g>
-<g id="border-bottom"><path d="M9 11H7v2h2v-2zm4 4h-2v2h2v-2zM9 3H7v2h2V3zm4 8h-2v2h2v-2zM5 3H3v2h2V3zm8 4h-2v2h2V7zm4 4h-2v2h2v-2zm-4-8h-2v2h2V3zm4 0h-2v2h2V3zm2 10h2v-2h-2v2zm0 4h2v-2h-2v2zM5 7H3v2h2V7zm14-4v2h2V3h-2zm0 6h2V7h-2v2zM5 11H3v2h2v-2zM3 21h18v-2H3v2zm2-6H3v2h2v-2z"/></g>
-<g id="border-clear"><path d="M7 5h2V3H7v2zm0 8h2v-2H7v2zm0 8h2v-2H7v2zm4-4h2v-2h-2v2zm0 4h2v-2h-2v2zm-8 0h2v-2H3v2zm0-4h2v-2H3v2zm0-4h2v-2H3v2zm0-4h2V7H3v2zm0-4h2V3H3v2zm8 8h2v-2h-2v2zm8 4h2v-2h-2v2zm0-4h2v-2h-2v2zm0 8h2v-2h-2v2zm0-12h2V7h-2v2zm-8 0h2V7h-2v2zm8-6v2h2V3h-2zm-8 2h2V3h-2v2zm4 16h2v-2h-2v2zm0-8h2v-2h-2v2zm0-8h2V3h-2v2z"/></g>
-<g id="border-color"><path d="M17.75 7L14 3.25l-10 10V17h3.75l10-10zm2.96-2.96c.39-.39.39-1.02 0-1.41L18.37.29c-.39-.39-1.02-.39-1.41 0L15 2.25 18.75 6l1.96-1.96z"/><path fill-opacity=".36" d="M0 20h24v4H0z"/></g>
-<g id="border-horizontal"><path d="M3 21h2v-2H3v2zM5 7H3v2h2V7zM3 17h2v-2H3v2zm4 4h2v-2H7v2zM5 3H3v2h2V3zm4 0H7v2h2V3zm8 0h-2v2h2V3zm-4 4h-2v2h2V7zm0-4h-2v2h2V3zm6 14h2v-2h-2v2zm-8 4h2v-2h-2v2zm-8-8h18v-2H3v2zM19 3v2h2V3h-2zm0 6h2V7h-2v2zm-8 8h2v-2h-2v2zm4 4h2v-2h-2v2zm4 0h2v-2h-2v2z"/></g>
-<g id="border-inner"><path d="M3 21h2v-2H3v2zm4 0h2v-2H7v2zM5 7H3v2h2V7zM3 17h2v-2H3v2zM9 3H7v2h2V3zM5 3H3v2h2V3zm12 0h-2v2h2V3zm2 6h2V7h-2v2zm0-6v2h2V3h-2zm-4 18h2v-2h-2v2zM13 3h-2v8H3v2h8v8h2v-8h8v-2h-8V3zm6 18h2v-2h-2v2zm0-4h2v-2h-2v2z"/></g>
-<g id="border-left"><path d="M11 21h2v-2h-2v2zm0-4h2v-2h-2v2zm0-12h2V3h-2v2zm0 4h2V7h-2v2zm0 4h2v-2h-2v2zm-4 8h2v-2H7v2zM7 5h2V3H7v2zm0 8h2v-2H7v2zm-4 8h2V3H3v18zM19 9h2V7h-2v2zm-4 12h2v-2h-2v2zm4-4h2v-2h-2v2zm0-14v2h2V3h-2zm0 10h2v-2h-2v2zm0 8h2v-2h-2v2zm-4-8h2v-2h-2v2zm0-8h2V3h-2v2z"/></g>
-<g id="border-outer"><path d="M13 7h-2v2h2V7zm0 4h-2v2h2v-2zm4 0h-2v2h2v-2zM3 3v18h18V3H3zm16 16H5V5h14v14zm-6-4h-2v2h2v-2zm-4-4H7v2h2v-2z"/></g>
-<g id="border-right"><path d="M7 21h2v-2H7v2zM3 5h2V3H3v2zm4 0h2V3H7v2zm0 8h2v-2H7v2zm-4 8h2v-2H3v2zm8 0h2v-2h-2v2zm-8-8h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm8 8h2v-2h-2v2zm4-4h2v-2h-2v2zm4-10v18h2V3h-2zm-4 18h2v-2h-2v2zm0-16h2V3h-2v2zm-4 8h2v-2h-2v2zm0-8h2V3h-2v2zm0 4h2V7h-2v2z"/></g>
-<g id="border-style"><path d="M15 21h2v-2h-2v2zm4 0h2v-2h-2v2zM7 21h2v-2H7v2zm4 0h2v-2h-2v2zm8-4h2v-2h-2v2zm0-4h2v-2h-2v2zM3 3v18h2V5h16V3H3zm16 6h2V7h-2v2z"/></g>
-<g id="border-top"><path d="M7 21h2v-2H7v2zm0-8h2v-2H7v2zm4 0h2v-2h-2v2zm0 8h2v-2h-2v2zm-8-4h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2v-2H3v2zm0-4h2V7H3v2zm8 8h2v-2h-2v2zm8-8h2V7h-2v2zm0 4h2v-2h-2v2zM3 3v2h18V3H3zm16 14h2v-2h-2v2zm-4 4h2v-2h-2v2zM11 9h2V7h-2v2zm8 12h2v-2h-2v2zm-4-8h2v-2h-2v2z"/></g>
-<g id="border-vertical"><path d="M3 9h2V7H3v2zm0-4h2V3H3v2zm4 16h2v-2H7v2zm0-8h2v-2H7v2zm-4 0h2v-2H3v2zm0 8h2v-2H3v2zm0-4h2v-2H3v2zM7 5h2V3H7v2zm12 12h2v-2h-2v2zm-8 4h2V3h-2v18zm8 0h2v-2h-2v2zm0-8h2v-2h-2v2zm0-10v2h2V3h-2zm0 6h2V7h-2v2zm-4-4h2V3h-2v2zm0 16h2v-2h-2v2zm0-8h2v-2h-2v2z"/></g>
-<g id="bubble-chart"><circle cx="7.2" cy="14.4" r="3.2"/><circle cx="14.8" cy="18" r="2"/><circle cx="15.2" cy="8.8" r="4.8"/></g>
-<g id="drag-handle"><path d="M20 9H4v2h16V9zM4 15h16v-2H4v2z"/></g>
-<g id="format-align-center"><path d="M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z"/></g>
-<g id="format-align-justify"><path d="M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z"/></g>
-<g id="format-align-left"><path d="M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z"/></g>
-<g id="format-align-right"><path d="M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z"/></g>
-<g id="format-bold"><path d="M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z"/></g>
-<g id="format-clear"><path d="M3.27 5L2 6.27l6.97 6.97L6.5 19h3l1.57-3.66L16.73 21 18 19.73 3.55 5.27 3.27 5zM6 5v.18L8.82 8h2.4l-.72 1.68 2.1 2.1L14.21 8H20V5H6z"/></g>
-<g id="format-color-fill"><path d="M16.56 8.94L7.62 0 6.21 1.41l2.38 2.38-5.15 5.15c-.59.59-.59 1.54 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.58.59-1.53 0-2.12zM5.21 10L10 5.21 14.79 10H5.21zM19 11.5s-2 2.17-2 3.5c0 1.1.9 2 2 2s2-.9 2-2c0-1.33-2-3.5-2-3.5z"/><path fill-opacity=".36" d="M0 20h24v4H0z"/></g>
-<g id="format-color-reset"><path d="M18 14c0-4-6-10.8-6-10.8s-1.33 1.51-2.73 3.52l8.59 8.59c.09-.42.14-.86.14-1.31zm-.88 3.12L12.5 12.5 5.27 5.27 4 6.55l3.32 3.32C6.55 11.32 6 12.79 6 14c0 3.31 2.69 6 6 6 1.52 0 2.9-.57 3.96-1.5l2.63 2.63 1.27-1.27-2.74-2.74z"/></g>
-<g id="format-color-text"><path fill-opacity=".36" d="M0 20h24v4H0z"/><path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/></g>
-<g id="format-indent-decrease"><path d="M11 17h10v-2H11v2zm-8-5l4 4V8l-4 4zm0 9h18v-2H3v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z"/></g>
-<g id="format-indent-increase"><path d="M3 21h18v-2H3v2zM3 8v8l4-4-4-4zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z"/></g>
-<g id="format-italic"><path d="M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z"/></g>
-<g id="format-line-spacing"><path d="M6 7h2.5L5 3.5 1.5 7H4v10H1.5L5 20.5 8.5 17H6V7zm4-2v2h12V5H10zm0 14h12v-2H10v2zm0-6h12v-2H10v2z"/></g>
-<g id="format-list-bulleted"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></g>
-<g id="format-list-numbered"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></g>
-<g id="format-paint"><path d="M18 4V3c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6h1v4H9v11c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-9h8V4h-3z"/></g>
-<g id="format-quote"><path d="M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z"/></g>
-<g id="format-shapes"><path d="M23 7V1h-6v2H7V1H1v6h2v10H1v6h6v-2h10v2h6v-6h-2V7h2zM3 3h2v2H3V3zm2 18H3v-2h2v2zm12-2H7v-2H5V7h2V5h10v2h2v10h-2v2zm4 2h-2v-2h2v2zM19 5V3h2v2h-2zm-5.27 9h-3.49l-.73 2H7.89l3.4-9h1.4l3.41 9h-1.63l-.74-2zm-3.04-1.26h2.61L12 8.91l-1.31 3.83z"/></g>
-<g id="format-size"><path d="M9 4v3h5v12h3V7h5V4H9zm-6 8h3v7h3v-7h3V9H3v3z"/></g>
-<g id="format-strikethrough"><path d="M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z"/></g>
-<g id="format-textdirection-l-to-r"><path d="M9 10v5h2V4h2v11h2V4h2V2H9C6.79 2 5 3.79 5 6s1.79 4 4 4zm12 8l-4-4v3H5v2h12v3l4-4z"/></g>
-<g id="format-textdirection-r-to-l"><path d="M10 10v5h2V4h2v11h2V4h2V2h-8C7.79 2 6 3.79 6 6s1.79 4 4 4zm-2 7v-3l-4 4 4 4v-3h12v-2H8z"/></g>
-<g id="format-underlined"><path d="M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z"/></g>
-<g id="functions"><path d="M18 4H6v2l6.5 6L6 18v2h12v-3h-7l5-5-5-5h7z"/></g>
-<g id="highlight"><path d="M6 14l3 3v5h6v-5l3-3V9H6zm5-12h2v3h-2zM3.5 5.875L4.914 4.46l2.12 2.122L5.62 7.997zm13.46.71l2.123-2.12 1.414 1.414L18.375 8z"/></g>
-<g id="insert-chart"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></g>
-<g id="insert-comment"><path d="M20 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/></g>
-<g id="insert-drive-file"><path d="M6 2c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6H6zm7 7V3.5L18.5 9H13z"/></g>
-<g id="insert-emoticon"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
-<g id="insert-invitation"><path d="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z"/></g>
-<g id="insert-link"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></g>
-<g id="insert-photo"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></g>
-<g id="linear-scale"><path d="M19.5 9.5c-1.03 0-1.9.62-2.29 1.5h-2.92c-.39-.88-1.26-1.5-2.29-1.5s-1.9.62-2.29 1.5H6.79c-.39-.88-1.26-1.5-2.29-1.5C3.12 9.5 2 10.62 2 12s1.12 2.5 2.5 2.5c1.03 0 1.9-.62 2.29-1.5h2.92c.39.88 1.26 1.5 2.29 1.5s1.9-.62 2.29-1.5h2.92c.39.88 1.26 1.5 2.29 1.5 1.38 0 2.5-1.12 2.5-2.5s-1.12-2.5-2.5-2.5z"/></g>
-<g id="merge-type"><path d="M17 20.41L18.41 19 15 15.59 13.59 17 17 20.41zM7.5 8H11v5.59L5.59 19 7 20.41l6-6V8h3.5L12 3.5 7.5 8z"/></g>
-<g id="mode-comment"><path d="M21.99 4c0-1.1-.89-2-1.99-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14l4 4-.01-18z"/></g>
-<g id="mode-edit"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
-<g id="monetization-on"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1.41 16.09V20h-2.67v-1.93c-1.71-.36-3.16-1.46-3.27-3.4h1.96c.1 1.05.82 1.87 2.65 1.87 1.96 0 2.4-.98 2.4-1.59 0-.83-.44-1.61-2.67-2.14-2.48-.6-4.18-1.62-4.18-3.67 0-1.72 1.39-2.84 3.11-3.21V4h2.67v1.95c1.86.45 2.79 1.86 2.85 3.39H14.3c-.05-1.11-.64-1.87-2.22-1.87-1.5 0-2.4.68-2.4 1.64 0 .84.65 1.39 2.67 1.91s4.18 1.39 4.18 3.91c-.01 1.83-1.38 2.83-3.12 3.16z"/></g>
-<g id="money-off"><path d="M12.5 6.9c1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-.53.12-1.03.3-1.48.54l1.47 1.47c.41-.17.91-.27 1.51-.27zM5.33 4.06L4.06 5.33 7.5 8.77c0 2.08 1.56 3.21 3.91 3.91l3.51 3.51c-.34.48-1.05.91-2.42.91-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c.96-.18 1.82-.55 2.45-1.12l2.22 2.22 1.27-1.27L5.33 4.06z"/></g>
-<g id="multiline-chart"><path d="M22 6.92l-1.41-1.41-2.85 3.21C15.68 6.4 12.83 5 9.61 5 6.72 5 4.07 6.16 2 8l1.42 1.42C5.12 7.93 7.27 7 9.61 7c2.74 0 5.09 1.26 6.77 3.24l-2.88 3.24-4-4L2 16.99l1.5 1.5 6-6.01 4 4 4.05-4.55c.75 1.35 1.25 2.9 1.44 4.55H21c-.22-2.3-.95-4.39-2.04-6.14L22 6.92z"/></g>
-<g id="pie-chart"><path d="M11 2v20c-5.07-.5-9-4.79-9-10s3.93-9.5 9-10zm2.03 0v8.99H22c-.47-4.74-4.24-8.52-8.97-8.99zm0 11.01V22c4.74-.47 8.5-4.25 8.97-8.99h-8.97z"/></g>
-<g id="pie-chart-outlined"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm1 2.07c3.61.45 6.48 3.33 6.93 6.93H13V4.07zM4 12c0-4.06 3.07-7.44 7-7.93v15.87c-3.93-.5-7-3.88-7-7.94zm9 7.93V13h6.93c-.45 3.61-3.32 6.48-6.93 6.93z"/></g>
-<g id="publish"><path d="M5 4v2h14V4H5zm0 10h4v6h6v-6h4l-7-7-7 7z"/></g>
-<g id="short-text"><path d="M4 9h16v2H4zm0 4h10v2H4z"/></g>
-<g id="show-chart"><path d="M3.5 18.49l6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z"/></g>
-<g id="space-bar"><path d="M18 9v4H6V9H4v6h16V9z"/></g>
-<g id="strikethrough-s"><path d="M7.24 8.75c-.26-.48-.39-1.03-.39-1.67 0-.61.13-1.16.4-1.67.26-.5.63-.93 1.11-1.29.48-.35 1.05-.63 1.7-.83.66-.19 1.39-.29 2.18-.29.81 0 1.54.11 2.21.34.66.22 1.23.54 1.69.94.47.4.83.88 1.08 1.43.25.55.38 1.15.38 1.81h-3.01c0-.31-.05-.59-.15-.85-.09-.27-.24-.49-.44-.68-.2-.19-.45-.33-.75-.44-.3-.1-.66-.16-1.06-.16-.39 0-.74.04-1.03.13-.29.09-.53.21-.72.36-.19.16-.34.34-.44.55-.1.21-.15.43-.15.66 0 .48.25.88.74 1.21.38.25.77.48 1.41.7H7.39c-.05-.08-.11-.17-.15-.25zM21 12v-2H3v2h9.62c.18.07.4.14.55.2.37.17.66.34.87.51.21.17.35.36.43.57.07.2.11.43.11.69 0 .23-.05.45-.14.66-.09.2-.23.38-.42.53-.19.15-.42.26-.71.35-.29.08-.63.13-1.01.13-.43 0-.83-.04-1.18-.13s-.66-.23-.91-.42c-.25-.19-.45-.44-.59-.75-.14-.31-.25-.76-.25-1.21H6.4c0 .55.08 1.13.24 1.58.16.45.37.85.65 1.21.28.35.6.66.98.92.37.26.78.48 1.22.65.44.17.9.3 1.38.39.48.08.96.13 1.44.13.8 0 1.53-.09 2.18-.28s1.21-.45 1.67-.79c.46-.34.82-.77 1.07-1.27s.38-1.07.38-1.71c0-.6-.1-1.14-.31-1.61-.05-.11-.11-.23-.17-.33H21z"/></g>
-<g id="text-fields"><path d="M2.5 4v3h5v12h3V7h5V4h-13zm19 5h-9v3h3v7h3v-7h3V9z"/></g>
-<g id="title"><path d="M5 4v3h5.5v12h3V7H19V4z"/></g>
-<g id="vertical-align-bottom"><path d="M16 13h-3V3h-2v10H8l4 4 4-4zM4 19v2h16v-2H4z"/></g>
-<g id="vertical-align-center"><path d="M8 19h3v4h2v-4h3l-4-4-4 4zm8-14h-3V1h-2v4H8l4 4 4-4zM4 11v2h16v-2H4z"/></g>
-<g id="vertical-align-top"><path d="M8 11h3v10h2V11h3l-4-4-4 4zM4 3v2h16V3H4z"/></g>
-<g id="wrap-text"><path d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3 3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/hardware-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/hardware-icons.html
deleted file mode 100644
index 3268e5a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/hardware-icons.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="hardware" size="24">
-<svg><defs>
-<g id="cast"><path d="M21 3H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0-4v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11z"/></g>
-<g id="cast-connected"><path d="M1 18v3h3c0-1.66-1.34-3-3-3zm0-4v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm18-7H5v1.63c3.96 1.28 7.09 4.41 8.37 8.37H19V7zM1 10v2c4.97 0 9 4.03 9 9h2c0-6.08-4.93-11-11-11zm20-7H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
-<g id="computer"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z"/></g>
-<g id="desktop-mac"><path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7l-2 3v1h8v-1l-2-3h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 12H3V4h18v10z"/></g>
-<g id="desktop-windows"><path d="M21 2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v2H8v2h8v-2h-2v-2h7c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H3V4h18v12z"/></g>
-<g id="developer-board"><path d="M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6zm6-6h4v3h-4zM6 7h5v5H6zm6 4h4v6h-4z"/></g>
-<g id="device-hub"><path d="M17 16l-4-4V8.82C14.16 8.4 15 7.3 15 6c0-1.66-1.34-3-3-3S9 4.34 9 6c0 1.3.84 2.4 2 2.82V12l-4 4H3v5h5v-3.05l4-4.2 4 4.2V21h5v-5h-4z"/></g>
-<g id="devices-other"><path d="M3 6h18V4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V6zm10 6H9v1.78c-.61.55-1 1.33-1 2.22s.39 1.67 1 2.22V20h4v-1.78c.61-.55 1-1.34 1-2.22s-.39-1.67-1-2.22V12zm-2 5.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM22 8h-6c-.5 0-1 .5-1 1v10c0 .5.5 1 1 1h6c.5 0 1-.5 1-1V9c0-.5-.5-1-1-1zm-1 10h-4v-8h4v8z"/></g>
-<g id="dock"><path d="M8 23h8v-2H8v2zm8-21.99L8 1c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM16 15H8V5h8v10z"/></g>
-<g id="gamepad"><path d="M15 7.5V2H9v5.5l3 3 3-3zM7.5 9H2v6h5.5l3-3-3-3zM9 16.5V22h6v-5.5l-3-3-3 3zM16.5 9l-3 3 3 3H22V9h-5.5z"/></g>
-<g id="headset"><path d="M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8H5v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h3c1.66 0 3-1.34 3-3v-7c0-4.97-4.03-9-9-9z"/></g>
-<g id="headset-mic"><path d="M12 1c-4.97 0-9 4.03-9 9v7c0 1.66 1.34 3 3 3h3v-8H5v-2c0-3.87 3.13-7 7-7s7 3.13 7 7v2h-4v8h4v1h-7v2h6c1.66 0 3-1.34 3-3V10c0-4.97-4.03-9-9-9z"/></g>
-<g id="keyboard"><path d="M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-9 3h2v2h-2V8zm0 3h2v2h-2v-2zM8 8h2v2H8V8zm0 3h2v2H8v-2zm-1 2H5v-2h2v2zm0-3H5V8h2v2zm9 7H8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2V8h2v2zm3 3h-2v-2h2v2zm0-3h-2V8h2v2z"/></g>
-<g id="keyboard-arrow-down"><path d="M7.41 7.84L12 12.42l4.59-4.58L18 9.25l-6 6-6-6z"/></g>
-<g id="keyboard-arrow-left"><path d="M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"/></g>
-<g id="keyboard-arrow-right"><path d="M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"/></g>
-<g id="keyboard-arrow-up"><path d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"/></g>
-<g id="keyboard-backspace"><path d="M21 11H6.83l3.58-3.59L9 6l-6 6 6 6 1.41-1.41L6.83 13H21z"/></g>
-<g id="keyboard-capslock"><path d="M12 8.41L16.59 13 18 11.59l-6-6-6 6L7.41 13 12 8.41zM6 18h12v-2H6v2z"/></g>
-<g id="keyboard-hide"><path d="M20 3H4c-1.1 0-1.99.9-1.99 2L2 15c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 3h2v2h-2V6zm0 3h2v2h-2V9zM8 6h2v2H8V6zm0 3h2v2H8V9zm-1 2H5V9h2v2zm0-3H5V6h2v2zm9 7H8v-2h8v2zm0-4h-2V9h2v2zm0-3h-2V6h2v2zm3 3h-2V9h2v2zm0-3h-2V6h2v2zm-7 15l4-4H8l4 4z"/></g>
-<g id="keyboard-return"><path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/></g>
-<g id="keyboard-tab"><path d="M11.59 7.41L15.17 11H1v2h14.17l-3.59 3.59L13 18l6-6-6-6-1.41 1.41zM20 6v12h2V6h-2z"/></g>
-<g id="keyboard-voice"><path d="M12 15c1.66 0 2.99-1.34 2.99-3L15 6c0-1.66-1.34-3-3-3S9 4.34 9 6v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 15 6.7 12H5c0 3.42 2.72 6.23 6 6.72V22h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"/></g>
-<g id="laptop"><path d="M20 18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z"/></g>
-<g id="laptop-chromebook"><path d="M22 18V3H2v15H0v2h24v-2h-2zm-8 0h-4v-1h4v1zm6-3H4V5h16v10z"/></g>
-<g id="laptop-mac"><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2H0c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2h-4zM4 5h16v11H4V5zm8 14c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
-<g id="laptop-windows"><path d="M20 18v-1c1.1 0 1.99-.9 1.99-2L22 5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2v1H0v2h24v-2h-4zM4 5h16v10H4V5z"/></g>
-<g id="memory"><path d="M15 9H9v6h6V9zm-2 4h-2v-2h2v2zm8-2V9h-2V7c0-1.1-.9-2-2-2h-2V3h-2v2h-2V3H9v2H7c-1.1 0-2 .9-2 2v2H3v2h2v2H3v2h2v2c0 1.1.9 2 2 2h2v2h2v-2h2v2h2v-2h2c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2zm-4 6H7V7h10v10z"/></g>
-<g id="mouse"><path d="M13 1.07V9h7c0-4.08-3.05-7.44-7-7.93zM4 15c0 4.42 3.58 8 8 8s8-3.58 8-8v-4H4v4zm7-13.93C7.05 1.56 4 4.92 4 9h7V1.07z"/></g>
-<g id="phone-android"><path d="M16 1H8C6.34 1 5 2.34 5 4v16c0 1.66 1.34 3 3 3h8c1.66 0 3-1.34 3-3V4c0-1.66-1.34-3-3-3zm-2 20h-4v-1h4v1zm3.25-3H6.75V4h10.5v14z"/></g>
-<g id="phone-iphone"><path d="M15.5 1h-8C6.12 1 5 2.12 5 3.5v17C5 21.88 6.12 23 7.5 23h8c1.38 0 2.5-1.12 2.5-2.5v-17C18 2.12 16.88 1 15.5 1zm-4 21c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5-4H7V4h9v14z"/></g>
-<g id="phonelink"><path d="M4 6h18V4H4c-1.1 0-2 .9-2 2v11H0v3h14v-3H4V6zm19 2h-6c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zm-1 9h-4v-7h4v7z"/></g>
-<g id="phonelink-off"><path d="M22 6V4H6.82l2 2H22zM1.92 1.65L.65 2.92l1.82 1.82C2.18 5.08 2 5.52 2 6v11H0v3h17.73l2.35 2.35 1.27-1.27L3.89 3.62 1.92 1.65zM4 6.27L14.73 17H4V6.27zM23 8h-6c-.55 0-1 .45-1 1v4.18l2 2V10h4v7h-2.18l3 3H23c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1z"/></g>
-<g id="power-input"><path d="M2 9v2h19V9H2zm0 6h5v-2H2v2zm7 0h5v-2H9v2zm7 0h5v-2h-5v2z"/></g>
-<g id="router"><path d="M20.2 5.9l.8-.8C19.6 3.7 17.8 3 16 3s-3.6.7-5 2.1l.8.8C13 4.8 14.5 4.2 16 4.2s3 .6 4.2 1.7zm-.9.8c-.9-.9-2.1-1.4-3.3-1.4s-2.4.5-3.3 1.4l.8.8c.7-.7 1.6-1 2.5-1 .9 0 1.8.3 2.5 1l.8-.8zM19 13h-2V9h-2v4H5c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-4c0-1.1-.9-2-2-2zM8 18H6v-2h2v2zm3.5 0h-2v-2h2v2zm3.5 0h-2v-2h2v2z"/></g>
-<g id="scanner"><path d="M19.8 10.7L4.2 5l-.7 1.9L17.6 12H5c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-5.5c0-.8-.5-1.6-1.2-1.8zM7 17H5v-2h2v2zm12 0H9v-2h10v2z"/></g>
-<g id="security"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z"/></g>
-<g id="sim-card"><path d="M19.99 4c0-1.1-.89-2-1.99-2h-8L4 8v12c0 1.1.9 2 2 2h12.01c1.1 0 1.99-.9 1.99-2l-.01-16zM9 19H7v-2h2v2zm8 0h-2v-2h2v2zm-8-4H7v-4h2v4zm4 4h-2v-4h2v4zm0-6h-2v-2h2v2zm4 2h-2v-4h2v4z"/></g>
-<g id="smartphone"><path d="M17 1.01L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
-<g id="speaker"><path d="M17 2H7c-1.1 0-2 .9-2 2v16c0 1.1.9 1.99 2 1.99L17 22c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5 2c1.1 0 2 .9 2 2s-.9 2-2 2c-1.11 0-2-.9-2-2s.89-2 2-2zm0 16c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
-<g id="speaker-group"><path d="M18.2 1H9.8C8.81 1 8 1.81 8 2.8v14.4c0 .99.81 1.79 1.8 1.79l8.4.01c.99 0 1.8-.81 1.8-1.8V2.8c0-.99-.81-1.8-1.8-1.8zM14 3c1.1 0 2 .89 2 2s-.9 2-2 2-2-.89-2-2 .9-2 2-2zm0 13.5c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"/><circle cx="14" cy="12.5" r="2.5"/><path d="M6 5H4v16c0 1.1.89 2 2 2h10v-2H6V5z"/></g>
-<g id="tablet"><path d="M21 4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 1.99-.9 1.99-2L23 6c0-1.1-.9-2-2-2zm-2 14H5V6h14v12z"/></g>
-<g id="tablet-android"><path d="M18 0H6C4.34 0 3 1.34 3 3v18c0 1.66 1.34 3 3 3h12c1.66 0 3-1.34 3-3V3c0-1.66-1.34-3-3-3zm-4 22h-4v-1h4v1zm5.25-3H4.75V3h14.5v16z"/></g>
-<g id="tablet-mac"><path d="M18.5 0h-14C3.12 0 2 1.12 2 2.5v19C2 22.88 3.12 24 4.5 24h14c1.38 0 2.5-1.12 2.5-2.5v-19C21 1.12 19.88 0 18.5 0zm-7 23c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7.5-4H4V3h15v16z"/></g>
-<g id="toys"><path d="M12 12c0-3 2.5-5.5 5.5-5.5S23 9 23 12H12zm0 0c0 3-2.5 5.5-5.5 5.5S1 15 1 12h11zm0 0c-3 0-5.5-2.5-5.5-5.5S9 1 12 1v11zm0 0c3 0 5.5 2.5 5.5 5.5S15 23 12 23V12z"/></g>
-<g id="tv"><path d="M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12z"/></g>
-<g id="videogame-asset"><path d="M21 6H3c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-10 7H8v3H6v-3H3v-2h3V8h2v3h3v2zm4.5 2c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4-3c-.83 0-1.5-.67-1.5-1.5S18.67 9 19.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="watch"><path d="M20 12c0-2.54-1.19-4.81-3.04-6.27L16 0H8l-.95 5.73C5.19 7.19 4 9.45 4 12s1.19 4.81 3.05 6.27L8 24h8l.96-5.73C18.81 16.81 20 14.54 20 12zM6 12c0-3.31 2.69-6 6-6s6 2.69 6 6-2.69 6-6 6-6-2.69-6-6z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/hero.svg b/systrace/catapult/third_party/polymer/components/iron-icons/hero.svg
deleted file mode 100755
index 52949be..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/hero.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<circle cx="73" cy="24" r="4"/>

-	<path d="M82,33H64V15h18V33z M66,31h14V17H66V31z"/>

-	<circle cx="112.5" cy="24" r="4"/>

-	<circle cx="151" cy="24" r="4"/>

-	<path d="M121,33h-18V15h18V33z M105,31h14V17h-14V31z"/>

-	<path d="M160,33h-18V15h18V33z M144,31h14V17h-14V31z"/>

-	<circle cx="73" cy="62" r="4"/>

-	<path d="M82,71H64V53h18V71z M66,69h14V55H66V69z"/>

-	<circle cx="112.5" cy="62" r="4"/>

-	<path d="M121,71h-18V53h18V71z M105,69h14V55h-14V69z"/>

-	<circle cx="151" cy="62" r="4"/>

-	<path d="M160,71h-18V53h18V71z M144,69h14V55h-14V69z"/>

-	<circle cx="73" cy="102" r="4"/>

-	<path d="M82,111H64V93h18V111z M66,109h14V95H66V109z"/>

-	<circle cx="112.5" cy="102" r="4"/>

-	<path d="M121,111h-18V93h18V111z M105,109h14V95h-14V109z"/>

-	<circle cx="151" cy="102" r="4"/>

-	<path d="M160,111h-18V93h18V111z M144,109h14V95h-14V109z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/image-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/image-icons.html
deleted file mode 100644
index bb1a4da..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/image-icons.html
+++ /dev/null
@@ -1,171 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="image" size="24">
-<svg><defs>
-<g id="add-a-photo"><path d="M3 4V1h2v3h3v2H5v3H3V6H0V4h3zm3 6V7h3V4h7l1.83 2H21c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V10h3zm7 9c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-3.2-5c0 1.77 1.43 3.2 3.2 3.2s3.2-1.43 3.2-3.2-1.43-3.2-3.2-3.2-3.2 1.43-3.2 3.2z"/></g>
-<g id="add-to-photos"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"/></g>
-<g id="adjust"><path d="M12 2C6.49 2 2 6.49 2 12s4.49 10 10 10 10-4.49 10-10S17.51 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3-8c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3z"/></g>
-<g id="assistant"><path d="M19 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5.12 10.88L12 17l-1.88-4.12L6 11l4.12-1.88L12 5l1.88 4.12L18 11l-4.12 1.88z"/></g>
-<g id="assistant-photo"><path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z"/></g>
-<g id="audiotrack"><path d="M12 3v9.28c-.47-.17-.97-.28-1.5-.28C8.01 12 6 14.01 6 16.5S8.01 21 10.5 21c2.31 0 4.2-1.75 4.45-4H15V6h4V3h-7z"/></g>
-<g id="blur-circular"><path d="M10 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zM7 9.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-3-3c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm3-6c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM14 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-1.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm3 6c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-4c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm2-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-3.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"/></g>
-<g id="blur-linear"><path d="M5 17.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zM9 13c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zM3 21h18v-2H3v2zM5 9.5c.83 0 1.5-.67 1.5-1.5S5.83 6.5 5 6.5 3.5 7.17 3.5 8 4.17 9.5 5 9.5zm0 4c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5.67 1.5 1.5 1.5zM9 17c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8-.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM3 3v2h18V3H3zm14 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm0 4c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM13 9c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1z"/></g>
-<g id="blur-off"><path d="M14 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-.2 4.48l.2.02c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5-1.5.67-1.5 1.5l.02.2c.09.67.61 1.19 1.28 1.28zM14 3.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-4 0c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm11 7c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM10 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm8 8c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-4c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-4 13.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM2.5 5.27l3.78 3.78L6 9c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l2.81 2.81c-.71.11-1.25.73-1.25 1.47 0 .83.67 1.5 1.5 1.5.74 0 1.36-.54 1.47-1.25l2.81 2.81c-.09-.03-.18-.06-.28-.06-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1c0-.1-.03-.19-.06-.28l3.78 3.78L20 20.23 3.77 4 2.5 5.27zM10 17c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm11-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM6 13c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zM3 9.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 11c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM6 17c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3-3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z"/></g>
-<g id="blur-on"><path d="M6 13c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm-3 .5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM6 5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm15 5.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM14 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0-3.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zm-11 10c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 7c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm0-17c.28 0 .5-.22.5-.5s-.22-.5-.5-.5-.5.22-.5.5.22.5.5.5zM10 7c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm0 5.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm8 .5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-8c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0-4c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm3 8.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zM14 17c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm0 3.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-4-12c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0 8.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1zm4-4.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-4c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z"/></g>
-<g id="brightness-1"><circle cx="12" cy="12" r="10"/></g>
-<g id="brightness-2"><path d="M10 2c-1.82 0-3.53.5-5 1.35C7.99 5.08 10 8.3 10 12s-2.01 6.92-5 8.65C6.47 21.5 8.18 22 10 22c5.52 0 10-4.48 10-10S15.52 2 10 2z"/></g>
-<g id="brightness-3"><path d="M9 2c-1.05 0-2.05.16-3 .46 4.06 1.27 7 5.06 7 9.54 0 4.48-2.94 8.27-7 9.54.95.3 1.95.46 3 .46 5.52 0 10-4.48 10-10S14.52 2 9 2z"/></g>
-<g id="brightness-4"><path d="M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6c3.31 0 6 2.69 6 6s-2.69 6-6 6z"/></g>
-<g id="brightness-5"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/></g>
-<g id="brightness-6"><path d="M20 15.31L23.31 12 20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69zM12 18V6c3.31 0 6 2.69 6 6s-2.69 6-6 6z"/></g>
-<g id="brightness-7"><path d="M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12 20 8.69zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zm0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4z"/></g>
-<g id="broken-image"><path d="M21 5v6.59l-3-3.01-4 4.01-4-4-4 4-3-3.01V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2zm-3 6.42l3 3.01V19c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2v-6.58l3 2.99 4-4 4 4 4-3.99z"/></g>
-<g id="brush"><path d="M7 14c-1.66 0-3 1.34-3 3 0 1.31-1.16 2-2 2 .92 1.22 2.49 2 4 2 2.21 0 4-1.79 4-4 0-1.66-1.34-3-3-3zm13.71-9.37l-1.34-1.34c-.39-.39-1.02-.39-1.41 0L9 12.25 11.75 15l8.96-8.96c.39-.39.39-1.02 0-1.41z"/></g>
-<g id="burst-mode"><path d="M1 5h2v14H1zm4 0h2v14H5zm17 0H10c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zM11 17l2.5-3.15L15.29 16l2.5-3.22L21 17H11z"/></g>
-<g id="camera"><path d="M9.4 10.5l4.77-8.26C13.47 2.09 12.75 2 12 2c-2.4 0-4.6.85-6.32 2.25l3.66 6.35.06-.1zM21.54 9c-.92-2.92-3.15-5.26-6-6.34L11.88 9h9.66zm.26 1h-7.49l.29.5 4.76 8.25C21 16.97 22 14.61 22 12c0-.69-.07-1.35-.2-2zM8.54 12l-3.9-6.75C3.01 7.03 2 9.39 2 12c0 .69.07 1.35.2 2h7.49l-1.15-2zm-6.08 3c.92 2.92 3.15 5.26 6 6.34L12.12 15H2.46zm11.27 0l-3.9 6.76c.7.15 1.42.24 2.17.24 2.4 0 4.6-.85 6.32-2.25l-3.66-6.35-.93 1.6z"/></g>
-<g id="camera-alt"><circle cx="12" cy="12" r="3.2"/><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
-<g id="camera-front"><path d="M10 20H5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zM12 8c1.1 0 2-.9 2-2s-.9-2-2-2-1.99.9-1.99 2S10.9 8 12 8zm5-8H7C5.9 0 5 .9 5 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V2c0-1.1-.9-2-2-2zM7 2h10v10.5c0-1.67-3.33-2.5-5-2.5s-5 .83-5 2.5V2z"/></g>
-<g id="camera-rear"><path d="M10 20H5v2h5v2l3-3-3-3v2zm4 0v2h5v-2h-5zm3-20H7C5.9 0 5 .9 5 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V2c0-1.1-.9-2-2-2zm-5 6c-1.11 0-2-.9-2-2s.89-2 1.99-2 2 .9 2 2C14 5.1 13.1 6 12 6z"/></g>
-<g id="camera-roll"><path d="M14 5c0-1.1-.9-2-2-2h-1V2c0-.55-.45-1-1-1H6c-.55 0-1 .45-1 1v1H4c-1.1 0-2 .9-2 2v15c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2h8V5h-8zm-2 13h-2v-2h2v2zm0-9h-2V7h2v2zm4 9h-2v-2h2v2zm0-9h-2V7h2v2zm4 9h-2v-2h2v2zm0-9h-2V7h2v2z"/></g>
-<g id="center-focus-strong"><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-7 7H3v4c0 1.1.9 2 2 2h4v-2H5v-4zM5 5h4V3H5c-1.1 0-2 .9-2 2v4h2V5zm14-2h-4v2h4v4h2V5c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4z"/></g>
-<g id="center-focus-weak"><path d="M5 15H3v4c0 1.1.9 2 2 2h4v-2H5v-4zM5 5h4V3H5c-1.1 0-2 .9-2 2v4h2V5zm14-2h-4v2h4v4h2V5c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zM12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-<g id="collections"><path d="M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"/></g>
-<g id="collections-bookmark"><path d="M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 10l-2.5-1.5L15 12V4h5v8z"/></g>
-<g id="color-lens"><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="colorize"><path d="M20.71 5.63l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-3.12 3.12-1.93-1.91-1.41 1.41 1.42 1.42L3 16.25V21h4.75l8.92-8.92 1.42 1.42 1.41-1.41-1.92-1.92 3.12-3.12c.4-.4.4-1.03.01-1.42zM6.92 19L5 17.08l8.06-8.06 1.92 1.92L6.92 19z"/></g>
-<g id="compare"><path d="M10 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h5v2h2V1h-2v2zm0 15H5l5-6v6zm9-15h-5v2h5v13l-5-6v9h5c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
-<g id="control-point"><path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.49 2 2 6.49 2 12s4.49 10 10 10 10-4.49 10-10S17.51 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="control-point-duplicate"><path d="M16 8h-2v3h-3v2h3v3h2v-3h3v-2h-3zM2 12c0-2.79 1.64-5.2 4.01-6.32V3.52C2.52 4.76 0 8.09 0 12s2.52 7.24 6.01 8.48v-2.16C3.64 17.2 2 14.79 2 12zm13-9c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9zm0 16c-3.86 0-7-3.14-7-7s3.14-7 7-7 7 3.14 7 7-3.14 7-7 7z"/></g>
-<g id="crop"><path d="M17 15h2V7c0-1.1-.9-2-2-2H9v2h8v8zM7 17V1H5v4H1v2h4v10c0 1.1.9 2 2 2h10v4h2v-4h4v-2H7z"/></g>
-<g id="crop-16-9"><path d="M19 6H5c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 10H5V8h14v8z"/></g>
-<g id="crop-3-2"><path d="M19 4H5c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H5V6h14v12z"/></g>
-<g id="crop-5-4"><path d="M19 5H5c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 12H5V7h14v10z"/></g>
-<g id="crop-7-5"><path d="M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z"/></g>
-<g id="crop-din"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/></g>
-<g id="crop-free"><path d="M3 5v4h2V5h4V3H5c-1.1 0-2 .9-2 2zm2 10H3v4c0 1.1.9 2 2 2h4v-2H5v-4zm14 4h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zm0-16h-4v2h4v4h2V5c0-1.1-.9-2-2-2z"/></g>
-<g id="crop-landscape"><path d="M19 5H5c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 12H5V7h14v10z"/></g>
-<g id="crop-original"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zm-5.04-6.71l-2.75 3.54-1.96-2.36L6.5 17h11l-3.54-4.71z"/></g>
-<g id="crop-portrait"><path d="M17 3H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H7V5h10v14z"/></g>
-<g id="crop-rotate"><path d="M7.47 21.49C4.2 19.93 1.86 16.76 1.5 13H0c.51 6.16 5.66 11 11.95 11 .23 0 .44-.02.66-.03L8.8 20.15l-1.33 1.34zM12.05 0c-.23 0-.44.02-.66.04l3.81 3.81 1.33-1.33C19.8 4.07 22.14 7.24 22.5 11H24c-.51-6.16-5.66-11-11.95-11zM16 14h2V8c0-1.11-.9-2-2-2h-6v2h6v6zm-8 2V4H6v2H4v2h2v8c0 1.1.89 2 2 2h8v2h2v-2h2v-2H8z"/></g>
-<g id="crop-square"><path d="M18 4H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H6V6h12v12z"/></g>
-<g id="dehaze"><path d="M2 15.5v2h20v-2H2zm0-5v2h20v-2H2zm0-5v2h20v-2H2z"/></g>
-<g id="details"><path d="M3 4l9 16 9-16H3zm3.38 2h11.25L12 16 6.38 6z"/></g>
-<g id="edit"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
-<g id="exposure"><path d="M15 17v2h2v-2h2v-2h-2v-2h-2v2h-2v2h2zm5-15H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM5 5h6v2H5V5zm15 15H4L20 4v16z"/></g>
-<g id="exposure-neg-1"><path d="M4 11v2h8v-2H4zm15 7h-2V7.38L14 8.4V6.7L18.7 5h.3v13z"/></g>
-<g id="exposure-neg-2"><path d="M15.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17s.19-.79.19-1.18c0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55V18H21v-1.71h-5.95zM2 11v2h8v-2H2z"/></g>
-<g id="exposure-plus-1"><path d="M10 7H8v4H4v2h4v4h2v-4h4v-2h-4V7zm10 11h-2V7.38L15 8.4V6.7L19.7 5h.3v13z"/></g>
-<g id="exposure-plus-2"><path d="M16.05 16.29l2.86-3.07c.38-.39.72-.79 1.04-1.18.32-.39.59-.78.82-1.17.23-.39.41-.78.54-1.17.13-.39.19-.79.19-1.18 0-.53-.09-1.02-.27-1.46-.18-.44-.44-.81-.78-1.11-.34-.31-.77-.54-1.26-.71-.51-.16-1.08-.24-1.72-.24-.69 0-1.31.11-1.85.32-.54.21-1 .51-1.36.88-.37.37-.65.8-.84 1.3-.18.47-.27.97-.28 1.5h2.14c.01-.31.05-.6.13-.87.09-.29.23-.54.4-.75.18-.21.41-.37.68-.49.27-.12.6-.18.96-.18.31 0 .58.05.81.15.23.1.43.25.59.43.16.18.28.4.37.65.08.25.13.52.13.81 0 .22-.03.43-.08.65-.06.22-.15.45-.29.7-.14.25-.32.53-.56.83-.23.3-.52.65-.88 1.03l-4.17 4.55V18H22v-1.71h-5.95zM8 7H6v4H2v2h4v4h2v-4h4v-2H8V7z"/></g>
-<g id="exposure-zero"><path d="M16.14 12.5c0 1-.1 1.85-.3 2.55-.2.7-.48 1.27-.83 1.7-.36.44-.79.75-1.3.95-.51.2-1.07.3-1.7.3-.62 0-1.18-.1-1.69-.3-.51-.2-.95-.51-1.31-.95-.36-.44-.65-1.01-.85-1.7-.2-.7-.3-1.55-.3-2.55v-2.04c0-1 .1-1.85.3-2.55.2-.7.48-1.26.84-1.69.36-.43.8-.74 1.31-.93C10.81 5.1 11.38 5 12 5c.63 0 1.19.1 1.7.29.51.19.95.5 1.31.93.36.43.64.99.84 1.69.2.7.3 1.54.3 2.55v2.04zm-2.11-2.36c0-.64-.05-1.18-.13-1.62-.09-.44-.22-.79-.4-1.06-.17-.27-.39-.46-.64-.58-.25-.13-.54-.19-.86-.19-.32 0-.61.06-.86.18s-.47.31-.64.58c-.17.27-.31.62-.4 1.06s-.13.98-.13 1.62v2.67c0 .64.05 1.18.14 1.62.09.45.23.81.4 1.09s.39.48.64.61.54.19.87.19c.33 0 .62-.06.87-.19s.46-.33.63-.61c.17-.28.3-.64.39-1.09.09-.45.13-.99.13-1.62v-2.66z"/></g>
-<g id="filter"><path d="M15.96 10.29l-2.75 3.54-1.96-2.36L8.5 15h11l-3.54-4.71zM3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
-<g id="filter-1"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm11 10h2V5h-4v2h2v8zm7-14H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
-<g id="filter-2"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-4-4h-4v-2h2c1.1 0 2-.89 2-2V7c0-1.11-.9-2-2-2h-4v2h4v2h-2c-1.1 0-2 .89-2 2v4h6v-2z"/></g>
-<g id="filter-3"><path d="M21 1H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zM3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm14 8v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5V7c0-1.11-.9-2-2-2h-4v2h4v2h-2v2h2v2h-4v2h4c1.1 0 2-.89 2-2z"/></g>
-<g id="filter-4"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm12 10h2V5h-2v4h-2V5h-2v6h4v4zm6-14H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
-<g id="filter-5"><path d="M21 1H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zM3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm14 8v-2c0-1.11-.9-2-2-2h-2V7h4V5h-6v6h4v2h-4v2h4c1.1 0 2-.89 2-2z"/></g>
-<g id="filter-6"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-8-2h2c1.1 0 2-.89 2-2v-2c0-1.11-.9-2-2-2h-2V7h4V5h-4c-1.1 0-2 .89-2 2v6c0 1.11.9 2 2 2zm0-4h2v2h-2v-2z"/></g>
-<g id="filter-7"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-8-2l4-8V5h-6v2h4l-4 8h2z"/></g>
-<g id="filter-8"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zm-8-2h2c1.1 0 2-.89 2-2v-1.5c0-.83-.67-1.5-1.5-1.5.83 0 1.5-.67 1.5-1.5V7c0-1.11-.9-2-2-2h-2c-1.1 0-2 .89-2 2v1.5c0 .83.67 1.5 1.5 1.5-.83 0-1.5.67-1.5 1.5V13c0 1.11.9 2 2 2zm0-8h2v2h-2V7zm0 4h2v2h-2v-2z"/></g>
-<g id="filter-9"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14zM15 5h-2c-1.1 0-2 .89-2 2v2c0 1.11.9 2 2 2h2v2h-4v2h4c1.1 0 2-.89 2-2V7c0-1.11-.9-2-2-2zm0 4h-2V7h2v2z"/></g>
-<g id="filter-9-plus"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm11 7V8c0-1.11-.9-2-2-2h-1c-1.1 0-2 .89-2 2v1c0 1.11.9 2 2 2h1v1H9v2h3c1.1 0 2-.89 2-2zm-3-3V8h1v1h-1zm10-8H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 8h-2V7h-2v2h-2v2h2v2h2v-2h2v6H7V3h14v6z"/></g>
-<g id="filter-b-and-w"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16l-7-8v8H5l7-8V5h7v14z"/></g>
-<g id="filter-center-focus"><path d="M5 15H3v4c0 1.1.9 2 2 2h4v-2H5v-4zM5 5h4V3H5c-1.1 0-2 .9-2 2v4h2V5zm14-2h-4v2h4v4h2V5c0-1.1-.9-2-2-2zm0 16h-4v2h4c1.1 0 2-.9 2-2v-4h-2v4zM12 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
-<g id="filter-drama"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.61 5.64 5.36 8.04 2.35 8.36 0 10.9 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM19 18H6c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4h2c0-2.76-1.86-5.08-4.4-5.78C8.61 6.88 10.2 6 12 6c3.03 0 5.5 2.47 5.5 5.5v.5H19c1.65 0 3 1.35 3 3s-1.35 3-3 3z"/></g>
-<g id="filter-frames"><path d="M20 4h-4l-4-4-4 4H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H4V6h4.52l3.52-3.5L15.52 6H20v14zM18 8H6v10h12"/></g>
-<g id="filter-hdr"><path d="M14 6l-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"/></g>
-<g id="filter-none"><path d="M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z"/></g>
-<g id="filter-tilt-shift"><path d="M11 4.07V2.05c-2.01.2-3.84 1-5.32 2.21L7.1 5.69c1.11-.86 2.44-1.44 3.9-1.62zm7.32.19C16.84 3.05 15.01 2.25 13 2.05v2.02c1.46.18 2.79.76 3.9 1.62l1.42-1.43zM19.93 11h2.02c-.2-2.01-1-3.84-2.21-5.32L18.31 7.1c.86 1.11 1.44 2.44 1.62 3.9zM5.69 7.1L4.26 5.68C3.05 7.16 2.25 8.99 2.05 11h2.02c.18-1.46.76-2.79 1.62-3.9zM4.07 13H2.05c.2 2.01 1 3.84 2.21 5.32l1.43-1.43c-.86-1.1-1.44-2.43-1.62-3.89zM15 12c0-1.66-1.34-3-3-3s-3 1.34-3 3 1.34 3 3 3 3-1.34 3-3zm3.31 4.9l1.43 1.43c1.21-1.48 2.01-3.32 2.21-5.32h-2.02c-.18 1.45-.76 2.78-1.62 3.89zM13 19.93v2.02c2.01-.2 3.84-1 5.32-2.21l-1.43-1.43c-1.1.86-2.43 1.44-3.89 1.62zm-7.32-.19C7.16 20.95 9 21.75 11 21.95v-2.02c-1.46-.18-2.79-.76-3.9-1.62l-1.42 1.43z"/></g>
-<g id="filter-vintage"><path d="M18.7 12.4c-.28-.16-.57-.29-.86-.4.29-.11.58-.24.86-.4 1.92-1.11 2.99-3.12 3-5.19-1.79-1.03-4.07-1.11-6 0-.28.16-.54.35-.78.54.05-.31.08-.63.08-.95 0-2.22-1.21-4.15-3-5.19C10.21 1.85 9 3.78 9 6c0 .32.03.64.08.95-.24-.2-.5-.39-.78-.55-1.92-1.11-4.2-1.03-6 0 0 2.07 1.07 4.08 3 5.19.28.16.57.29.86.4-.29.11-.58.24-.86.4-1.92 1.11-2.99 3.12-3 5.19 1.79 1.03 4.07 1.11 6 0 .28-.16.54-.35.78-.54-.05.32-.08.64-.08.96 0 2.22 1.21 4.15 3 5.19 1.79-1.04 3-2.97 3-5.19 0-.32-.03-.64-.08-.95.24.2.5.38.78.54 1.92 1.11 4.2 1.03 6 0-.01-2.07-1.08-4.08-3-5.19zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"/></g>
-<g id="flare"><path d="M7 11H1v2h6v-2zm2.17-3.24L7.05 5.64 5.64 7.05l2.12 2.12 1.41-1.41zM13 1h-2v6h2V1zm5.36 6.05l-1.41-1.41-2.12 2.12 1.41 1.41 2.12-2.12zM17 11v2h6v-2h-6zm-5-2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm2.83 7.24l2.12 2.12 1.41-1.41-2.12-2.12-1.41 1.41zm-9.19.71l1.41 1.41 2.12-2.12-1.41-1.41-2.12 2.12zM11 23h2v-6h-2v6z"/></g>
-<g id="flash-auto"><path d="M3 2v12h3v9l7-12H9l4-9H3zm16 0h-2l-3.2 9h1.9l.7-2h3.2l.7 2h1.9L19 2zm-2.15 5.65L18 4l1.15 3.65h-2.3z"/></g>
-<g id="flash-off"><path d="M3.27 3L2 4.27l5 5V13h3v9l3.58-6.14L17.73 20 19 18.73 3.27 3zM17 10h-4l4-8H7v2.18l8.46 8.46L17 10z"/></g>
-<g id="flash-on"><path d="M7 2v11h3v9l7-12h-4l4-8z"/></g>
-<g id="flip"><path d="M15 21h2v-2h-2v2zm4-12h2V7h-2v2zM3 5v14c0 1.1.9 2 2 2h4v-2H5V5h4V3H5c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2V1h-2v22zm8-6h2v-2h-2v2zM15 5h2V3h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z"/></g>
-<g id="gradient"><path d="M11 9h2v2h-2zm-2 2h2v2H9zm4 0h2v2h-2zm2-2h2v2h-2zM7 9h2v2H7zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z"/></g>
-<g id="grain"><path d="M10 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM6 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12-8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-4 8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-4-4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="grid-off"><path d="M8 4v1.45l2 2V4h4v4h-3.45l2 2H14v1.45l2 2V10h4v4h-3.45l2 2H20v1.45l2 2V4c0-1.1-.9-2-2-2H4.55l2 2H8zm8 0h4v4h-4V4zM1.27 1.27L0 2.55l2 2V20c0 1.1.9 2 2 2h15.46l2 2 1.27-1.27L1.27 1.27zM10 12.55L11.45 14H10v-1.45zm-6-6L5.45 8H4V6.55zM8 20H4v-4h4v4zm0-6H4v-4h3.45l.55.55V14zm6 6h-4v-4h3.45l.55.54V20zm2 0v-1.46L17.46 20H16z"/></g>
-<g id="grid-on"><path d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z"/></g>
-<g id="hdr-off"><path d="M17.5 15v-2h1.1l.9 2H21l-.9-2.1c.5-.2.9-.8.9-1.4v-1c0-.8-.7-1.5-1.5-1.5H16v4.9l1.1 1.1h.4zm0-4.5h2v1h-2v-1zm-4.5 0v.4l1.5 1.5v-1.9c0-.8-.7-1.5-1.5-1.5h-1.9l1.5 1.5h.4zm-3.5-1l-7-7-1.1 1L6.9 9h-.4v2h-2V9H3v6h1.5v-2.5h2V15H8v-4.9l1.5 1.5V15h3.4l7.6 7.6 1.1-1.1-12.1-12z"/></g>
-<g id="hdr-on"><path d="M21 11.5v-1c0-.8-.7-1.5-1.5-1.5H16v6h1.5v-2h1.1l.9 2H21l-.9-2.1c.5-.3.9-.8.9-1.4zm-1.5 0h-2v-1h2v1zm-13-.5h-2V9H3v6h1.5v-2.5h2V15H8V9H6.5v2zM13 9H9.5v6H13c.8 0 1.5-.7 1.5-1.5v-3c0-.8-.7-1.5-1.5-1.5zm0 4.5h-2v-3h2v3z"/></g>
-<g id="hdr-strong"><path d="M17 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zM5 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-<g id="hdr-weak"><path d="M5 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm12-2c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4z"/></g>
-<g id="healing"><path d="M17.73 12.02l3.98-3.98c.39-.39.39-1.02 0-1.41l-4.34-4.34c-.39-.39-1.02-.39-1.41 0l-3.98 3.98L8 2.29C7.8 2.1 7.55 2 7.29 2c-.25 0-.51.1-.7.29L2.25 6.63c-.39.39-.39 1.02 0 1.41l3.98 3.98L2.25 16c-.39.39-.39 1.02 0 1.41l4.34 4.34c.39.39 1.02.39 1.41 0l3.98-3.98 3.98 3.98c.2.2.45.29.71.29.26 0 .51-.1.71-.29l4.34-4.34c.39-.39.39-1.02 0-1.41l-3.99-3.98zM12 9c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-4.71 1.96L3.66 7.34l3.63-3.63 3.62 3.62-3.62 3.63zM10 13c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2 2c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2-4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2.66 9.34l-3.63-3.62 3.63-3.63 3.62 3.62-3.62 3.63z"/></g>
-<g id="image"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></g>
-<g id="image-aspect-ratio"><path d="M16 10h-2v2h2v-2zm0 4h-2v2h2v-2zm-8-4H6v2h2v-2zm4 0h-2v2h2v-2zm8-6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V6h16v12z"/></g>
-<g id="iso"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5.5 7.5h2v-2H9v2h2V9H9v2H7.5V9h-2V7.5zM19 19H5L19 5v14zm-2-2v-1.5h-5V17h5z"/></g>
-<g id="landscape"><path d="M14 6l-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"/></g>
-<g id="leak-add"><path d="M6 3H3v3c1.66 0 3-1.34 3-3zm8 0h-2c0 4.97-4.03 9-9 9v2c6.08 0 11-4.93 11-11zm-4 0H8c0 2.76-2.24 5-5 5v2c3.87 0 7-3.13 7-7zm0 18h2c0-4.97 4.03-9 9-9v-2c-6.07 0-11 4.93-11 11zm8 0h3v-3c-1.66 0-3 1.34-3 3zm-4 0h2c0-2.76 2.24-5 5-5v-2c-3.87 0-7 3.13-7 7z"/></g>
-<g id="leak-remove"><path d="M10 3H8c0 .37-.04.72-.12 1.06l1.59 1.59C9.81 4.84 10 3.94 10 3zM3 4.27l2.84 2.84C5.03 7.67 4.06 8 3 8v2c1.61 0 3.09-.55 4.27-1.46L8.7 9.97C7.14 11.24 5.16 12 3 12v2c2.71 0 5.19-.99 7.11-2.62l2.5 2.5C10.99 15.81 10 18.29 10 21h2c0-2.16.76-4.14 2.03-5.69l1.43 1.43C14.55 17.91 14 19.39 14 21h2c0-1.06.33-2.03.89-2.84L19.73 21 21 19.73 4.27 3 3 4.27zM14 3h-2c0 1.5-.37 2.91-1.02 4.16l1.46 1.46C13.42 6.98 14 5.06 14 3zm5.94 13.12c.34-.08.69-.12 1.06-.12v-2c-.94 0-1.84.19-2.66.52l1.6 1.6zm-4.56-4.56l1.46 1.46C18.09 12.37 19.5 12 21 12v-2c-2.06 0-3.98.58-5.62 1.56z"/></g>
-<g id="lens"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z"/></g>
-<g id="linked-camera"><circle cx="12" cy="14" r="3.2"/><path d="M16 3.33c2.58 0 4.67 2.09 4.67 4.67H22c0-3.31-2.69-6-6-6v1.33M16 6c1.11 0 2 .89 2 2h1.33c0-1.84-1.49-3.33-3.33-3.33V6"/><path d="M17 9c0-1.11-.89-2-2-2V4H9L7.17 6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V9h-5zm-5 10c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
-<g id="looks"><path d="M12 10c-3.86 0-7 3.14-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.86-3.14-7-7-7zm0-4C5.93 6 1 10.93 1 17h2c0-4.96 4.04-9 9-9s9 4.04 9 9h2c0-6.07-4.93-11-11-11z"/></g>
-<g id="looks-3"><path d="M19.01 3h-14c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 7.5c0 .83-.67 1.5-1.5 1.5.83 0 1.5.67 1.5 1.5V15c0 1.11-.9 2-2 2h-4v-2h4v-2h-2v-2h2V9h-4V7h4c1.1 0 2 .89 2 2v1.5z"/></g>
-<g id="looks-4"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 14h-2v-4H9V7h2v4h2V7h2v10z"/></g>
-<g id="looks-5"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2H9v-2h4v-2H9V7h6v2z"/></g>
-<g id="looks-6"><path d="M11 15h2v-2h-2v2zm8-12H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 6h-4v2h2c1.1 0 2 .89 2 2v2c0 1.11-.9 2-2 2h-2c-1.1 0-2-.89-2-2V9c0-1.11.9-2 2-2h4v2z"/></g>
-<g id="looks-one"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14h-2V9h-2V7h4v10z"/></g>
-<g id="looks-two"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4 8c0 1.11-.9 2-2 2h-2v2h4v2H9v-4c0-1.11.9-2 2-2h2V9H9V7h4c1.1 0 2 .89 2 2v2z"/></g>
-<g id="loupe"><path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.49 2 2 6.49 2 12s4.49 10 10 10h8c1.1 0 2-.9 2-2v-8c0-5.51-4.49-10-10-10zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="monochrome-photos"><path d="M20 5h-3.2L15 3H9L7.2 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 14h-8v-1c-2.8 0-5-2.2-5-5s2.2-5 5-5V7h8v12zm-3-6c0-2.8-2.2-5-5-5v1.8c1.8 0 3.2 1.4 3.2 3.2s-1.4 3.2-3.2 3.2V18c2.8 0 5-2.2 5-5zm-8.2 0c0 1.8 1.4 3.2 3.2 3.2V9.8c-1.8 0-3.2 1.4-3.2 3.2z"/></g>
-<g id="movie-creation"><path d="M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4z"/></g>
-<g id="movie-filter"><path d="M18 4l2 3h-3l-2-3h-2l2 3h-3l-2-3H8l2 3H7L5 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4h-4zm-6.75 11.25L10 18l-1.25-2.75L6 14l2.75-1.25L10 10l1.25 2.75L14 14l-2.75 1.25zm5.69-3.31L16 14l-.94-2.06L13 11l2.06-.94L16 8l.94 2.06L19 11l-2.06.94z"/></g>
-<g id="music-note"><path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/></g>
-<g id="nature"><path d="M13 16.12c3.47-.41 6.17-3.36 6.17-6.95 0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89V20H5v2h14v-2h-6v-3.88z"/></g>
-<g id="nature-people"><path d="M22.17 9.17c0-3.87-3.13-7-7-7s-7 3.13-7 7c0 3.47 2.52 6.34 5.83 6.89V20H6v-3h1v-4c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v4h1v5h16v-2h-3v-3.88c3.47-.41 6.17-3.36 6.17-6.95zM4.5 11c.83 0 1.5-.67 1.5-1.5S5.33 8 4.5 8 3 8.67 3 9.5 3.67 11 4.5 11z"/></g>
-<g id="navigate-before"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
-<g id="navigate-next"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
-<g id="palette"><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="panorama"><path d="M23 18V6c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zM8.5 12.5l2.5 3.01L14.5 11l4.5 6H5l3.5-4.5z"/></g>
-<g id="panorama-fish-eye"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="panorama-horizontal"><path d="M20 6.54v10.91c-2.6-.77-5.28-1.16-8-1.16-2.72 0-5.4.39-8 1.16V6.54c2.6.77 5.28 1.16 8 1.16 2.72.01 5.4-.38 8-1.16M21.43 4c-.1 0-.2.02-.31.06C18.18 5.16 15.09 5.7 12 5.7c-3.09 0-6.18-.55-9.12-1.64-.11-.04-.22-.06-.31-.06-.34 0-.57.23-.57.63v14.75c0 .39.23.62.57.62.1 0 .2-.02.31-.06 2.94-1.1 6.03-1.64 9.12-1.64 3.09 0 6.18.55 9.12 1.64.11.04.21.06.31.06.33 0 .57-.23.57-.63V4.63c0-.4-.24-.63-.57-.63z"/></g>
-<g id="panorama-vertical"><path d="M19.94 21.12c-1.1-2.94-1.64-6.03-1.64-9.12 0-3.09.55-6.18 1.64-9.12.04-.11.06-.22.06-.31 0-.34-.23-.57-.63-.57H4.63c-.4 0-.63.23-.63.57 0 .1.02.2.06.31C5.16 5.82 5.71 8.91 5.71 12c0 3.09-.55 6.18-1.64 9.12-.05.11-.07.22-.07.31 0 .33.23.57.63.57h14.75c.39 0 .63-.24.63-.57-.01-.1-.03-.2-.07-.31zM6.54 20c.77-2.6 1.16-5.28 1.16-8 0-2.72-.39-5.4-1.16-8h10.91c-.77 2.6-1.16 5.28-1.16 8 0 2.72.39 5.4 1.16 8H6.54z"/></g>
-<g id="panorama-wide-angle"><path d="M12 6c2.45 0 4.71.2 7.29.64.47 1.78.71 3.58.71 5.36 0 1.78-.24 3.58-.71 5.36-2.58.44-4.84.64-7.29.64s-4.71-.2-7.29-.64C4.24 15.58 4 13.78 4 12c0-1.78.24-3.58.71-5.36C7.29 6.2 9.55 6 12 6m0-2c-2.73 0-5.22.24-7.95.72l-.93.16-.25.9C2.29 7.85 2 9.93 2 12s.29 4.15.87 6.22l.25.89.93.16c2.73.49 5.22.73 7.95.73s5.22-.24 7.95-.72l.93-.16.25-.89c.58-2.08.87-4.16.87-6.23s-.29-4.15-.87-6.22l-.25-.89-.93-.16C17.22 4.24 14.73 4 12 4z"/></g>
-<g id="photo"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></g>
-<g id="photo-album"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4zm0 15l3-3.86 2.14 2.58 3-3.86L18 19H6z"/></g>
-<g id="photo-camera"><circle cx="12" cy="12" r="3.2"/><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
-<g id="photo-filter"><path d="M19.02 10v9H5V5h9V3H5.02c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-9h-2zM17 10l.94-2.06L20 7l-2.06-.94L17 4l-.94 2.06L14 7l2.06.94zm-3.75.75L12 8l-1.25 2.75L8 12l2.75 1.25L12 16l1.25-2.75L16 12z"/></g>
-<g id="photo-library"><path d="M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"/></g>
-<g id="photo-size-select-actual"><path d="M21 3H3C2 3 1 4 1 5v14c0 1.1.9 2 2 2h18c1 0 2-1 2-2V5c0-1-1-2-2-2zM5 17l3.5-4.5 2.5 3.01L14.5 11l4.5 6H5z"/></g>
-<g id="photo-size-select-large"><path d="M21 15h2v2h-2v-2zm0-4h2v2h-2v-2zm2 8h-2v2c1 0 2-1 2-2zM13 3h2v2h-2V3zm8 4h2v2h-2V7zm0-4v2h2c0-1-1-2-2-2zM1 7h2v2H1V7zm16-4h2v2h-2V3zm0 16h2v2h-2v-2zM3 3C2 3 1 4 1 5h2V3zm6 0h2v2H9V3zM5 3h2v2H5V3zm-4 8v8c0 1.1.9 2 2 2h12V11H1zm2 8l2.5-3.21 1.79 2.15 2.5-3.22L13 19H3z"/></g>
-<g id="photo-size-select-small"><path d="M23 15h-2v2h2v-2zm0-4h-2v2h2v-2zm0 8h-2v2c1 0 2-1 2-2zM15 3h-2v2h2V3zm8 4h-2v2h2V7zm-2-4v2h2c0-1-1-2-2-2zM3 21h8v-6H1v4c0 1.1.9 2 2 2zM3 7H1v2h2V7zm12 12h-2v2h2v-2zm4-16h-2v2h2V3zm0 16h-2v2h2v-2zM3 3C2 3 1 4 1 5h2V3zm0 8H1v2h2v-2zm8-8H9v2h2V3zM7 3H5v2h2V3z"/></g>
-<g id="picture-as-pdf"><path d="M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 7.5c0 .83-.67 1.5-1.5 1.5H9v2H7.5V7H10c.83 0 1.5.67 1.5 1.5v1zm5 2c0 .83-.67 1.5-1.5 1.5h-2.5V7H15c.83 0 1.5.67 1.5 1.5v3zm4-3H19v1h1.5V11H19v2h-1.5V7h3v1.5zM9 9.5h1v-1H9v1zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm10 5.5h1v-3h-1v3z"/></g>
-<g id="portrait"><path d="M12 12.25c1.24 0 2.25-1.01 2.25-2.25S13.24 7.75 12 7.75 9.75 8.76 9.75 10s1.01 2.25 2.25 2.25zm4.5 4c0-1.5-3-2.25-4.5-2.25s-4.5.75-4.5 2.25V17h9v-.75zM19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/></g>
-<g id="remove-red-eye"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
-<g id="rotate-90-degrees-ccw"><path d="M7.34 6.41L.86 12.9l6.49 6.48 6.49-6.48-6.5-6.49zM3.69 12.9l3.66-3.66L11 12.9l-3.66 3.66-3.65-3.66zm15.67-6.26C17.61 4.88 15.3 4 13 4V.76L8.76 5 13 9.24V6c1.79 0 3.58.68 4.95 2.05 2.73 2.73 2.73 7.17 0 9.9C16.58 19.32 14.79 20 13 20c-.97 0-1.94-.21-2.84-.61l-1.49 1.49C10.02 21.62 11.51 22 13 22c2.3 0 4.61-.88 6.36-2.64 3.52-3.51 3.52-9.21 0-12.72z"/></g>
-<g id="rotate-left"><path d="M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z"/></g>
-<g id="rotate-right"><path d="M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z"/></g>
-<g id="slideshow"><path d="M10 8v8l5-4-5-4zm9-5H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/></g>
-<g id="straighten"><path d="M21 6H3c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 10H3V8h2v4h2V8h2v4h2V8h2v4h2V8h2v4h2V8h2v8z"/></g>
-<g id="style"><path d="M2.53 19.65l1.34.56v-9.03l-2.43 5.86c-.41 1.02.08 2.19 1.09 2.61zm19.5-3.7L17.07 3.98c-.31-.75-1.04-1.21-1.81-1.23-.26 0-.53.04-.79.15L7.1 5.95c-.75.31-1.21 1.03-1.23 1.8-.01.27.04.54.15.8l4.96 11.97c.31.76 1.05 1.22 1.83 1.23.26 0 .52-.05.77-.15l7.36-3.05c1.02-.42 1.51-1.59 1.09-2.6zM7.88 8.75c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-2 11c0 1.1.9 2 2 2h1.45l-3.45-8.34v6.34z"/></g>
-<g id="switch-camera"><path d="M20 4h-3.17L15 2H9L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 11.5V13H9v2.5L5.5 12 9 8.5V11h6V8.5l3.5 3.5-3.5 3.5z"/></g>
-<g id="switch-video"><path d="M18 9.5V6c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h14c.55 0 1-.45 1-1v-3.5l4 4v-13l-4 4zm-5 6V13H7v2.5L3.5 12 7 8.5V11h6V8.5l3.5 3.5-3.5 3.5z"/></g>
-<g id="tag-faces"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
-<g id="texture"><path d="M19.51 3.08L3.08 19.51c.09.34.27.65.51.9.25.24.56.42.9.51L20.93 4.49c-.19-.69-.73-1.23-1.42-1.41zM11.88 3L3 11.88v2.83L14.71 3h-2.83zM5 3c-1.1 0-2 .9-2 2v2l4-4H5zm14 18c.55 0 1.05-.22 1.41-.59.37-.36.59-.86.59-1.41v-2l-4 4h2zm-9.71 0h2.83L21 12.12V9.29L9.29 21z"/></g>
-<g id="timelapse"><path d="M16.24 7.76C15.07 6.59 13.54 6 12 6v6l-4.24 4.24c2.34 2.34 6.14 2.34 8.49 0 2.34-2.34 2.34-6.14-.01-8.48zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
-<g id="timer"><path d="M15 1H9v2h6V1zm-4 13h2V8h-2v6zm8.03-6.61l1.42-1.42c-.43-.51-.9-.99-1.41-1.41l-1.42 1.42C16.07 4.74 14.12 4 12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9 9-4.03 9-9c0-2.12-.74-4.07-1.97-5.61zM12 20c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="timer-10"><path d="M0 7.72V9.4l3-1V18h2V6h-.25L0 7.72zm23.78 6.65c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39 0-.14.03-.28.09-.41.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59C21.49 9.07 21 9 20.46 9c-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.69.23.96c.15.28.36.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02zm-9.96-7.32c-.34-.4-.75-.7-1.23-.88-.47-.18-1.01-.27-1.59-.27-.58 0-1.11.09-1.59.27-.48.18-.89.47-1.23.88-.34.41-.6.93-.79 1.59-.18.65-.28 1.45-.28 2.39v1.92c0 .94.09 1.74.28 2.39.19.66.45 1.19.8 1.6.34.41.75.71 1.23.89.48.18 1.01.28 1.59.28.59 0 1.12-.09 1.59-.28.48-.18.88-.48 1.22-.89.34-.41.6-.94.78-1.6.18-.65.28-1.45.28-2.39v-1.92c0-.94-.09-1.74-.28-2.39-.18-.66-.44-1.19-.78-1.59zm-.92 6.17c0 .6-.04 1.11-.12 1.53-.08.42-.2.76-.36 1.02-.16.26-.36.45-.59.57-.23.12-.51.18-.82.18-.3 0-.58-.06-.82-.18s-.44-.31-.6-.57c-.16-.26-.29-.6-.38-1.02-.09-.42-.13-.93-.13-1.53v-2.5c0-.6.04-1.11.13-1.52.09-.41.21-.74.38-1 .16-.25.36-.43.6-.55.24-.11.51-.17.81-.17.31 0 .58.06.81.17.24.11.44.29.6.55.16.25.29.58.37.99.08.41.13.92.13 1.52v2.51z"/></g>
-<g id="timer-3"><path d="M11.61 12.97c-.16-.24-.36-.46-.62-.65-.25-.19-.56-.35-.93-.48.3-.14.57-.3.8-.5.23-.2.42-.41.57-.64.15-.23.27-.46.34-.71.08-.24.11-.49.11-.73 0-.55-.09-1.04-.28-1.46-.18-.42-.44-.77-.78-1.06-.33-.28-.73-.5-1.2-.64-.45-.13-.97-.2-1.53-.2-.55 0-1.06.08-1.52.24-.47.17-.87.4-1.2.69-.33.29-.6.63-.78 1.03-.2.39-.29.83-.29 1.29h1.98c0-.26.05-.49.14-.69.09-.2.22-.38.38-.52.17-.14.36-.25.58-.33.22-.08.46-.12.73-.12.61 0 1.06.16 1.36.47.3.31.44.75.44 1.32 0 .27-.04.52-.12.74-.08.22-.21.41-.38.57-.17.16-.38.28-.63.37-.25.09-.55.13-.89.13H6.72v1.57H7.9c.34 0 .64.04.91.11.27.08.5.19.69.35.19.16.34.36.44.61.1.24.16.54.16.87 0 .62-.18 1.09-.53 1.42-.35.33-.84.49-1.45.49-.29 0-.56-.04-.8-.13-.24-.08-.44-.2-.61-.36-.17-.16-.3-.34-.39-.56-.09-.22-.14-.46-.14-.72H4.19c0 .55.11 1.03.32 1.45.21.42.5.77.86 1.05s.77.49 1.24.63.96.21 1.48.21c.57 0 1.09-.08 1.58-.23.49-.15.91-.38 1.26-.68.36-.3.64-.66.84-1.1.2-.43.3-.93.3-1.48 0-.29-.04-.58-.11-.86-.08-.25-.19-.51-.35-.76zm9.26 1.4c-.14-.28-.35-.53-.63-.74-.28-.21-.61-.39-1.01-.53s-.85-.27-1.35-.38c-.35-.07-.64-.15-.87-.23-.23-.08-.41-.16-.55-.25-.14-.09-.23-.19-.28-.3-.05-.11-.08-.24-.08-.39s.03-.28.09-.41c.06-.13.15-.25.27-.34.12-.1.27-.18.45-.24s.4-.09.64-.09c.25 0 .47.04.66.11.19.07.35.17.48.29.13.12.22.26.29.42.06.16.1.32.1.49h1.95c0-.39-.08-.75-.24-1.09-.16-.34-.39-.63-.69-.88-.3-.25-.66-.44-1.09-.59-.43-.15-.92-.22-1.46-.22-.51 0-.98.07-1.39.21-.41.14-.77.33-1.06.57-.29.24-.51.52-.67.84-.16.32-.23.65-.23 1.01s.08.68.23.96c.15.28.37.52.64.73.27.21.6.38.98.53.38.14.81.26 1.27.36.39.08.71.17.95.26s.43.19.57.29c.13.1.22.22.27.34.05.12.07.25.07.39 0 .32-.13.57-.4.77-.27.2-.66.29-1.17.29-.22 0-.43-.02-.64-.08-.21-.05-.4-.13-.56-.24-.17-.11-.3-.26-.41-.44-.11-.18-.17-.41-.18-.67h-1.89c0 .36.08.71.24 1.05.16.34.39.65.7.93.31.27.69.49 1.15.66.46.17.98.25 1.58.25.53 0 1.01-.06 1.44-.19.43-.13.8-.31 1.11-.54.31-.23.54-.51.71-.83.17-.32.25-.67.25-1.06-.02-.4-.09-.74-.24-1.02z"/></g>
-<g id="timer-off"><path d="M19.04 4.55l-1.42 1.42C16.07 4.74 14.12 4 12 4c-1.83 0-3.53.55-4.95 1.48l1.46 1.46C9.53 6.35 10.73 6 12 6c3.87 0 7 3.13 7 7 0 1.27-.35 2.47-.94 3.49l1.45 1.45C20.45 16.53 21 14.83 21 13c0-2.12-.74-4.07-1.97-5.61l1.42-1.42-1.41-1.42zM15 1H9v2h6V1zm-4 8.44l2 2V8h-2v1.44zM3.02 4L1.75 5.27 4.5 8.03C3.55 9.45 3 11.16 3 13c0 4.97 4.02 9 9 9 1.84 0 3.55-.55 4.98-1.5l2.5 2.5 1.27-1.27-7.71-7.71L3.02 4zM12 20c-3.87 0-7-3.13-7-7 0-1.28.35-2.48.95-3.52l9.56 9.56c-1.03.61-2.23.96-3.51.96z"/></g>
-<g id="tonality"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.94-.49-7-3.85-7-7.93s3.05-7.44 7-7.93v15.86zm2-15.86c1.03.13 2 .45 2.87.93H13v-.93zM13 7h5.24c.25.31.48.65.68 1H13V7zm0 3h6.74c.08.33.15.66.19 1H13v-1zm0 9.93V19h2.87c-.87.48-1.84.8-2.87.93zM18.24 17H13v-1h5.92c-.2.35-.43.69-.68 1zm1.5-3H13v-1h6.93c-.04.34-.11.67-.19 1z"/></g>
-<g id="transform"><path d="M22 18v-2H8V4h2L7 1 4 4h2v2H2v2h4v8c0 1.1.9 2 2 2h8v2h-2l3 3 3-3h-2v-2h4zM10 8h6v6h2V8c0-1.1-.9-2-2-2h-6v2z"/></g>
-<g id="tune"><path d="M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z"/></g>
-<g id="view-comfy"><path d="M3 9h4V5H3v4zm0 5h4v-4H3v4zm5 0h4v-4H8v4zm5 0h4v-4h-4v4zM8 9h4V5H8v4zm5-4v4h4V5h-4zm5 9h4v-4h-4v4zM3 19h4v-4H3v4zm5 0h4v-4H8v4zm5 0h4v-4h-4v4zm5 0h4v-4h-4v4zm0-14v4h4V5h-4z"/></g>
-<g id="view-compact"><path d="M3 19h6v-7H3v7zm7 0h12v-7H10v7zM3 5v6h19V5H3z"/></g>
-<g id="vignette"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9 15c-4.42 0-8-2.69-8-6s3.58-6 8-6 8 2.69 8 6-3.58 6-8 6z"/></g>
-<g id="wb-auto"><path d="M6.85 12.65h2.3L8 9l-1.15 3.65zM22 7l-1.2 6.29L19.3 7h-1.6l-1.49 6.29L15 7h-.76C12.77 5.17 10.53 4 8 4c-4.42 0-8 3.58-8 8s3.58 8 8 8c3.13 0 5.84-1.81 7.15-4.43l.1.43H17l1.5-6.1L20 16h1.75l2.05-9H22zm-11.7 9l-.7-2H6.4l-.7 2H3.8L7 7h2l3.2 9h-1.9z"/></g>
-<g id="wb-cloudy"><path d="M19.36 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.64-4.96z"/></g>
-<g id="wb-incandescent"><path d="M3.55 18.54l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8zM11 22.45h2V19.5h-2v2.95zM4 10.5H1v2h3v-2zm11-4.19V1.5H9v4.81C7.21 7.35 6 9.28 6 11.5c0 3.31 2.69 6 6 6s6-2.69 6-6c0-2.22-1.21-4.15-3-5.19zm5 4.19v2h3v-2h-3zm-2.76 7.66l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4z"/></g>
-<g id="wb-iridescent"><path d="M5 14.5h14v-6H5v6zM11 .55V3.5h2V.55h-2zm8.04 2.5l-1.79 1.79 1.41 1.41 1.8-1.79-1.42-1.41zM13 22.45V19.5h-2v2.95h2zm7.45-3.91l-1.8-1.79-1.41 1.41 1.79 1.8 1.42-1.42zM3.55 4.46l1.79 1.79 1.41-1.41-1.79-1.79-1.41 1.41zm1.41 15.49l1.79-1.8-1.41-1.41-1.79 1.79 1.41 1.42z"/></g>
-<g id="wb-sunny"><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/index.html b/systrace/catapult/third_party/polymer/components/iron-icons/index.html
deleted file mode 100644
index fa5b89b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/iron-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/iron-icons.html
deleted file mode 100644
index 739131c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/iron-icons.html
+++ /dev/null
@@ -1,353 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!--
-
-`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set.
-
-The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project.
-
-Example loading icon set:
-
-    <link rel="import" href="../iron-icons/maps-icons.html">
-
-To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id.
-
-Example using the directions-bus icon from the maps icon set:
-
-    <iron-icon icon="maps:directions-bus"></iron-icon>
-
-    To load a subset of icons from one of the default `iron-icons` sets, you can
-    use the [poly-icon](https://poly-icon.appspot.com/) tool. It allows you
-    to select individual icons, and creates an iconset from them that you can
-    use directly in your elements.
-
-See [iron-icon](#iron-icon) for more information about working with icons.
-
-See [iron-iconset](#iron-iconset) and [iron-iconset-svg](#iron-iconset-svg) for more information about how to create a custom iconset.
-
-@group Iron Elements
-@pseudoElement iron-icons
-@demo demo/index.html
--->
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="icons" size="24">
-<svg><defs>
-<g id="3d-rotation"><path d="M7.52 21.48C4.25 19.94 1.91 16.76 1.55 13H.05C.56 19.16 5.71 24 12 24l.66-.03-3.81-3.81-1.33 1.32zm.89-6.52c-.19 0-.37-.03-.52-.08-.16-.06-.29-.13-.4-.24-.11-.1-.2-.22-.26-.37-.06-.14-.09-.3-.09-.47h-1.3c0 .36.07.68.21.95.14.27.33.5.56.69.24.18.51.32.82.41.3.1.62.15.96.15.37 0 .72-.05 1.03-.15.32-.1.6-.25.83-.44s.42-.43.55-.72c.13-.29.2-.61.2-.97 0-.19-.02-.38-.07-.56-.05-.18-.12-.35-.23-.51-.1-.16-.24-.3-.4-.43-.17-.13-.37-.23-.61-.31.2-.09.37-.2.52-.33.15-.13.27-.27.37-.42.1-.15.17-.3.22-.46.05-.16.07-.32.07-.48 0-.36-.06-.68-.18-.96-.12-.28-.29-.51-.51-.69-.2-.19-.47-.33-.77-.43C9.1 8.05 8.76 8 8.39 8c-.36 0-.69.05-1 .16-.3.11-.57.26-.79.45-.21.19-.38.41-.51.67-.12.26-.18.54-.18.85h1.3c0-.17.03-.32.09-.45s.14-.25.25-.34c.11-.09.23-.17.38-.22.15-.05.3-.08.48-.08.4 0 .7.1.89.31.19.2.29.49.29.86 0 .18-.03.34-.08.49-.05.15-.14.27-.25.37-.11.1-.25.18-.41.24-.16.06-.36.09-.58.09H7.5v1.03h.77c.22 0 .42.02.6.07s.33.13.45.23c.12.11.22.24.29.4.07.16.1.35.1.57 0 .41-.12.72-.35.93-.23.23-.55.33-.95.33zm8.55-5.92c-.32-.33-.7-.59-1.14-.77-.43-.18-.92-.27-1.46-.27H12v8h2.3c.55 0 1.06-.09 1.51-.27.45-.18.84-.43 1.16-.76.32-.33.57-.73.74-1.19.17-.47.26-.99.26-1.57v-.4c0-.58-.09-1.1-.26-1.57-.18-.47-.43-.87-.75-1.2zm-.39 3.16c0 .42-.05.79-.14 1.13-.1.33-.24.62-.43.85-.19.23-.43.41-.71.53-.29.12-.62.18-.99.18h-.91V9.12h.97c.72 0 1.27.23 1.64.69.38.46.57 1.12.57 1.99v.4zM12 0l-.66.03 3.81 3.81 1.33-1.33c3.27 1.55 5.61 4.72 5.96 8.48h1.5C23.44 4.84 18.29 0 12 0z"/></g>
-<g id="accessibility"><path d="M12 2c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 7h-6v13h-2v-6h-2v6H9V9H3V7h18v2z"/></g>
-<g id="accessible"><circle cx="12" cy="4" r="2"/><path d="M19 13v-2c-1.54.02-3.09-.75-4.07-1.83l-1.29-1.43c-.17-.19-.38-.34-.61-.45-.01 0-.01-.01-.02-.01H13c-.35-.2-.75-.3-1.19-.26C10.76 7.11 10 8.04 10 9.09V15c0 1.1.9 2 2 2h5v5h2v-5.5c0-1.1-.9-2-2-2h-3v-3.45c1.29 1.07 3.25 1.94 5 1.95zm-6.17 5c-.41 1.16-1.52 2-2.83 2-1.66 0-3-1.34-3-3 0-1.31.84-2.41 2-2.83V12.1c-2.28.46-4 2.48-4 4.9 0 2.76 2.24 5 5 5 2.42 0 4.44-1.72 4.9-4h-2.07z"/></g>
-<g id="account-balance"><path d="M4 10v7h3v-7H4zm6 0v7h3v-7h-3zM2 22h19v-3H2v3zm14-12v7h3v-7h-3zm-4.5-9L2 6v2h19V6l-9.5-5z"/></g>
-<g id="account-balance-wallet"><path d="M21 18v1c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2V5c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10V8H12v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="account-box"><path d="M3 5v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.11 0-2 .9-2 2zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1H6v-1z"/></g>
-<g id="account-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/></g>
-<g id="add"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></g>
-<g id="add-alert"><path d="M10.01 21.01c0 1.1.89 1.99 1.99 1.99s1.99-.89 1.99-1.99h-3.98zm8.87-4.19V11c0-3.25-2.25-5.97-5.29-6.69v-.72C13.59 2.71 12.88 2 12 2s-1.59.71-1.59 1.59v.72C7.37 5.03 5.12 7.75 5.12 11v5.82L3 18.94V20h18v-1.06l-2.12-2.12zM16 13.01h-3v3h-2v-3H8V11h3V8h2v3h3v2.01z"/></g>
-<g id="add-box"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></g>
-<g id="add-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></g>
-<g id="add-circle-outline"><path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="add-shopping-cart"><path d="M11 9h2V6h3V4h-3V1h-2v3H8v2h3v3zm-4 9c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zm10 0c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2zm-9.83-3.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.86-7.01L19.42 4h-.01l-1.1 2-2.76 5H8.53l-.13-.27L6.16 6l-.95-2-.94-2H1v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.13 0-.25-.11-.25-.25z"/></g>
-<g id="alarm"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="alarm-add"><path d="M7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm1-11h-2v3H8v2h3v3h2v-3h3v-2h-3V9z"/></g>
-<g id="alarm-off"><path d="M12 6c3.87 0 7 3.13 7 7 0 .84-.16 1.65-.43 2.4l1.52 1.52c.58-1.19.91-2.51.91-3.92 0-4.97-4.03-9-9-9-1.41 0-2.73.33-3.92.91L9.6 6.43C10.35 6.16 11.16 6 12 6zm10-.28l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM2.92 2.29L1.65 3.57 2.98 4.9l-1.11.93 1.42 1.42 1.11-.94.8.8C3.83 8.69 3 10.75 3 13c0 4.97 4.02 9 9 9 2.25 0 4.31-.83 5.89-2.2l2.2 2.2 1.27-1.27L3.89 3.27l-.97-.98zm13.55 16.1C15.26 19.39 13.7 20 12 20c-3.87 0-7-3.13-7-7 0-1.7.61-3.26 1.61-4.47l9.86 9.86zM8.02 3.28L6.6 1.86l-.86.71 1.42 1.42.86-.71z"/></g>
-<g id="alarm-on"><path d="M22 5.72l-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39L6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7zm-1.46-5.47L8.41 12.4l-1.06 1.06 3.18 3.18 6-6-1.06-1.06-4.93 4.95z"/></g>
-<g id="all-out"><path d="M16.21 4.16l4 4v-4zm4 12l-4 4h4zm-12 4l-4-4v4zm-4-12l4-4h-4zm12.95-.95c-2.73-2.73-7.17-2.73-9.9 0s-2.73 7.17 0 9.9 7.17 2.73 9.9 0 2.73-7.16 0-9.9zm-1.1 8.8c-2.13 2.13-5.57 2.13-7.7 0s-2.13-5.57 0-7.7 5.57-2.13 7.7 0 2.13 5.57 0 7.7z"/></g>
-<g id="android"><path d="M6 18c0 .55.45 1 1 1h1v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V19h2v3.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5V19h1c.55 0 1-.45 1-1V8H6v10zM3.5 8C2.67 8 2 8.67 2 9.5v7c0 .83.67 1.5 1.5 1.5S5 17.33 5 16.5v-7C5 8.67 4.33 8 3.5 8zm17 0c-.83 0-1.5.67-1.5 1.5v7c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5v-7c0-.83-.67-1.5-1.5-1.5zm-4.97-5.84l1.3-1.3c.2-.2.2-.51 0-.71-.2-.2-.51-.2-.71 0l-1.48 1.48C13.85 1.23 12.95 1 12 1c-.96 0-1.86.23-2.66.63L7.85.15c-.2-.2-.51-.2-.71 0-.2.2-.2.51 0 .71l1.31 1.31C6.97 3.26 6 5.01 6 7h12c0-1.99-.97-3.75-2.47-4.84zM10 5H9V4h1v1zm5 0h-1V4h1v1z"/></g>
-<g id="announcement"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 9h-2V5h2v6zm0 4h-2v-2h2v2z"/></g>
-<g id="apps"><path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z"/></g>
-<g id="archive"><path d="M20.54 5.23l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27zM12 17.5L6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.81-1h12l.94 1H5.12z"/></g>
-<g id="arrow-back"><path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/></g>
-<g id="arrow-downward"><path d="M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"/></g>
-<g id="arrow-drop-down"><path d="M7 10l5 5 5-5z"/></g>
-<g id="arrow-drop-down-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 12l-4-4h8l-4 4z"/></g>
-<g id="arrow-drop-up"><path d="M7 14l5-5 5 5z"/></g>
-<g id="arrow-forward"><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/></g>
-<g id="arrow-upward"><path d="M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z"/></g>
-<g id="aspect-ratio"><path d="M19 12h-2v3h-3v2h5v-5zM7 9h3V7H5v5h2V9zm14-6H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z"/></g>
-<g id="assessment"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></g>
-<g id="assignment"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"/></g>
-<g id="assignment-ind"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 4c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H6v-1.4c0-2 4-3.1 6-3.1s6 1.1 6 3.1V19z"/></g>
-<g id="assignment-late"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-6 15h-2v-2h2v2zm0-4h-2V8h2v6zm-1-9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
-<g id="assignment-return"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm4 12h-4v3l-5-5 5-5v3h4v4z"/></g>
-<g id="assignment-returned"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm0 15l-5-5h3V9h4v4h3l-5 5z"/></g>
-<g id="assignment-turned-in"><path d="M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm-2 14l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z"/></g>
-<g id="attachment"><path d="M2 12.5C2 9.46 4.46 7 7.5 7H18c2.21 0 4 1.79 4 4s-1.79 4-4 4H9.5C8.12 15 7 13.88 7 12.5S8.12 10 9.5 10H17v2H9.41c-.55 0-.55 1 0 1H18c1.1 0 2-.9 2-2s-.9-2-2-2H7.5C5.57 9 4 10.57 4 12.5S5.57 16 7.5 16H17v2H7.5C4.46 18 2 15.54 2 12.5z"/></g>
-<g id="autorenew"><path d="M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"/></g>
-<g id="backspace"><path d="M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.9.89 1.59.89h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z"/></g>
-<g id="backup"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"/></g>
-<g id="block"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"/></g>
-<g id="book"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></g>
-<g id="bookmark"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2z"/></g>
-<g id="bookmark-border"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15l-5-2.18L7 18V5h10v13z"/></g>
-<g id="bug-report"><path d="M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5c-.49 0-.96.06-1.41.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z"/></g>
-<g id="build"><path d="M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4z"/></g>
-<g id="cached"><path d="M19 8l-4 4h3c0 3.31-2.69 6-6 6-1.01 0-1.97-.25-2.8-.7l-1.46 1.46C8.97 19.54 10.43 20 12 20c4.42 0 8-3.58 8-8h3l-4-4zM6 12c0-3.31 2.69-6 6-6 1.01 0 1.97.25 2.8.7l1.46-1.46C15.03 4.46 13.57 4 12 4c-4.42 0-8 3.58-8 8H1l4 4 4-4H6z"/></g>
-<g id="camera-enhance"><path d="M9 3L7.17 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2h-3.17L15 3H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-1l1.25-2.75L16 13l-2.75-1.25L12 9l-1.25 2.75L8 13l2.75 1.25z"/></g>
-<g id="cancel"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></g>
-<g id="card-giftcard"><path d="M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15H4v-2h16v2zm0-5H4V8h5.08L7 10.83 8.62 12 11 8.76l1-1.36 1 1.36L15.38 12 17 10.83 14.92 8H20v6z"/></g>
-<g id="card-membership"><path d="M20 2H4c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h4v5l4-2 4 2v-5h4c1.11 0 2-.89 2-2V4c0-1.11-.89-2-2-2zm0 13H4v-2h16v2zm0-5H4V4h16v6z"/></g>
-<g id="card-travel"><path d="M20 6h-3V4c0-1.11-.89-2-2-2H9c-1.11 0-2 .89-2 2v2H4c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zM9 4h6v2H9V4zm11 15H4v-2h16v2zm0-5H4V8h3v2h2V8h6v2h2V8h3v6z"/></g>
-<g id="change-history"><path d="M12 7.77L18.39 18H5.61L12 7.77M12 4L2 20h20L12 4z"/></g>
-<g id="check"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></g>
-<g id="check-box"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></g>
-<g id="check-box-outline-blank"><path d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
-<g id="check-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></g>
-<g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
-<g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
-<g id="chrome-reader-mode"><path d="M13 12h7v1.5h-7zm0-2.5h7V11h-7zm0 5h7V16h-7zM21 4H3c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 15h-9V6h9v13z"/></g>
-<g id="class"><path d="M18 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 4h5v8l-2.5-1.5L6 12V4z"/></g>
-<g id="clear"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></g>
-<g id="close"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></g>
-<g id="cloud"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z"/></g>
-<g id="cloud-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.5 14H8c-1.66 0-3-1.34-3-3s1.34-3 3-3l.14.01C8.58 8.28 10.13 7 12 7c2.21 0 4 1.79 4 4h.5c1.38 0 2.5 1.12 2.5 2.5S17.88 16 16.5 16z"/></g>
-<g id="cloud-done"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM10 17l-3.5-3.5 1.41-1.41L10 14.17 15.18 9l1.41 1.41L10 17z"/></g>
-<g id="cloud-download"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM17 13l-5 5-5-5h3V9h4v4h3z"/></g>
-<g id="cloud-off"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4c-1.48 0-2.85.43-4.01 1.17l1.46 1.46C10.21 6.23 11.08 6 12 6c3.04 0 5.5 2.46 5.5 5.5v.5H19c1.66 0 3 1.34 3 3 0 1.13-.64 2.11-1.56 2.62l1.45 1.45C23.16 18.16 24 16.68 24 15c0-2.64-2.05-4.78-4.65-4.96zM3 5.27l2.75 2.74C2.56 8.15 0 10.77 0 14c0 3.31 2.69 6 6 6h11.73l2 2L21 20.73 4.27 4 3 5.27zM7.73 10l8 8H6c-2.21 0-4-1.79-4-4s1.79-4 4-4h1.73z"/></g>
-<g id="cloud-queue"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM19 18H6c-2.21 0-4-1.79-4-4s1.79-4 4-4h.71C7.37 7.69 9.48 6 12 6c3.04 0 5.5 2.46 5.5 5.5v.5H19c1.66 0 3 1.34 3 3s-1.34 3-3 3z"/></g>
-<g id="cloud-upload"><path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"/></g>
-<g id="code"><path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"/></g>
-<g id="compare-arrows"><path d="M9.01 14H2v2h7.01v3L13 15l-3.99-4v3zm5.98-1v-3H22V8h-7.01V5L11 9l3.99 4z"/></g>
-<g id="content-copy"><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></g>
-<g id="content-cut"><path d="M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4S2 3.79 2 6s1.79 4 4 4c.59 0 1.14-.13 1.64-.36L10 12l-2.36 2.36C7.14 14.13 6.59 14 6 14c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64L12 14l7 7h3v-1L9.64 7.64zM6 8c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zM19 3l-6 6 2 2 7-7V3z"/></g>
-<g id="content-paste"><path d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z"/></g>
-<g id="copyright"><path d="M10.08 10.86c.05-.33.16-.62.3-.87s.34-.46.59-.62c.24-.15.54-.22.91-.23.23.01.44.05.63.13.2.09.38.21.52.36s.25.33.34.53.13.42.14.64h1.79c-.02-.47-.11-.9-.28-1.29s-.4-.73-.7-1.01-.66-.5-1.08-.66-.88-.23-1.39-.23c-.65 0-1.22.11-1.7.34s-.88.53-1.2.92-.56.84-.71 1.36S8 11.29 8 11.87v.27c0 .58.08 1.12.23 1.64s.39.97.71 1.35.72.69 1.2.91 1.05.34 1.7.34c.47 0 .91-.08 1.32-.23s.77-.36 1.08-.63.56-.58.74-.94.29-.74.3-1.15h-1.79c-.01.21-.06.4-.15.58s-.21.33-.36.46-.32.23-.52.3c-.19.07-.39.09-.6.1-.36-.01-.66-.08-.89-.23-.25-.16-.45-.37-.59-.62s-.25-.55-.3-.88-.08-.67-.08-1v-.27c0-.35.03-.68.08-1.01zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="create"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
-<g id="create-new-folder"><path d="M20 6h-8l-2-2H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-1 8h-3v3h-2v-3h-3v-2h3V9h2v3h3v2z"/></g>
-<g id="credit-card"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z"/></g>
-<g id="dashboard"><path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/></g>
-<g id="date-range"><path d="M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z"/></g>
-<g id="delete"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></g>
-<g id="delete-forever"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"/></g>
-<g id="delete-sweep"><path d="M15 16h4v2h-4zm0-8h7v2h-7zm0 4h6v2h-6zM3 18c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V8H3v10zM14 5h-3l-1-1H6L5 5H2v2h12z"/></g>
-<g id="description"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z"/></g>
-<g id="dns"><path d="M20 13H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zM7 19c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM20 3H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zM7 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-<g id="done"><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/></g>
-<g id="done-all"><path d="M18 7l-1.41-1.41-6.34 6.34 1.41 1.41L18 7zm4.24-1.41L11.66 16.17 7.48 12l-1.41 1.41L11.66 19l12-12-1.42-1.41zM.41 13.41L6 19l1.41-1.41L1.83 12 .41 13.41z"/></g>
-<g id="donut-large"><path d="M11 5.08V2c-5 .5-9 4.81-9 10s4 9.5 9 10v-3.08c-3-.48-6-3.4-6-6.92s3-6.44 6-6.92zM18.97 11H22c-.47-5-4-8.53-9-9v3.08C16 5.51 18.54 8 18.97 11zM13 18.92V22c5-.47 8.53-4 9-9h-3.03c-.43 3-2.97 5.49-5.97 5.92z"/></g>
-<g id="donut-small"><path d="M11 9.16V2c-5 .5-9 4.79-9 10s4 9.5 9 10v-7.16c-1-.41-2-1.52-2-2.84s1-2.43 2-2.84zM14.86 11H22c-.48-4.75-4-8.53-9-9v7.16c1 .3 1.52.98 1.86 1.84zM13 14.84V22c5-.47 8.52-4.25 9-9h-7.14c-.34.86-.86 1.54-1.86 1.84z"/></g>
-<g id="drafts"><path d="M21.99 8c0-.72-.37-1.35-.94-1.7L12 1 2.95 6.3C2.38 6.65 2 7.28 2 8v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2l-.01-10zM12 13L3.74 7.84 12 3l8.26 4.84L12 13z"/></g>
-<g id="eject"><path d="M5 17h14v2H5zm7-12L5.33 15h13.34z"/></g>
-<g id="error"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/></g>
-<g id="error-outline"><path d="M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
-<g id="euro-symbol"><path d="M15 18.5c-2.51 0-4.68-1.42-5.76-3.5H15v-2H8.58c-.05-.33-.08-.66-.08-1s.03-.67.08-1H15V9H9.24C10.32 6.92 12.5 5.5 15 5.5c1.61 0 3.09.59 4.23 1.57L21 5.3C19.41 3.87 17.3 3 15 3c-3.92 0-7.24 2.51-8.48 6H3v2h3.06c-.04.33-.06.66-.06 1 0 .34.02.67.06 1H3v2h3.52c1.24 3.49 4.56 6 8.48 6 2.31 0 4.41-.87 6-2.3l-1.78-1.77c-1.13.98-2.6 1.57-4.22 1.57z"/></g>
-<g id="event"><path d="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z"/></g>
-<g id="event-seat"><path d="M4 18v3h3v-3h10v3h3v-6H4zm15-8h3v3h-3zM2 10h3v3H2zm15 3H7V5c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2v8z"/></g>
-<g id="exit-to-app"><path d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></g>
-<g id="expand-less"><path d="M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"/></g>
-<g id="expand-more"><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"/></g>
-<g id="explore"><path d="M12 10.9c-.61 0-1.1.49-1.1 1.1s.49 1.1 1.1 1.1c.61 0 1.1-.49 1.1-1.1s-.49-1.1-1.1-1.1zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm2.19 12.19L6 18l3.81-8.19L18 6l-3.81 8.19z"/></g>
-<g id="extension"><path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z"/></g>
-<g id="face"><path d="M9 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm6 0c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-.29.02-.58.05-.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c.78 0 1.53-.09 2.25-.26.21.71.33 1.47.33 2.26 0 4.41-3.59 8-8 8z"/></g>
-<g id="favorite"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></g>
-<g id="favorite-border"><path d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z"/></g>
-<g id="feedback"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2V6h2v4z"/></g>
-<g id="file-download"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></g>
-<g id="file-upload"><path d="M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z"/></g>
-<g id="filter-list"><path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/></g>
-<g id="find-in-page"><path d="M20 19.59V8l-6-6H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75L20 19.59zM9 13c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z"/></g>
-<g id="find-replace"><path d="M11 6c1.38 0 2.63.56 3.54 1.46L12 10h6V4l-2.05 2.05C14.68 4.78 12.93 4 11 4c-3.53 0-6.43 2.61-6.92 6H6.1c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14H15.9c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46L10 12H4v6l2.05-2.05C7.32 17.22 9.07 18 11 18c1.55 0 2.98-.51 4.14-1.36L20 21.49 21.49 20l-4.85-4.86z"/></g>
-<g id="fingerprint"><path d="M17.81 4.47c-.08 0-.16-.02-.23-.06C15.66 3.42 14 3 12.01 3c-1.98 0-3.86.47-5.57 1.41-.24.13-.54.04-.68-.2-.13-.24-.04-.55.2-.68C7.82 2.52 9.86 2 12.01 2c2.13 0 3.99.47 6.03 1.52.25.13.34.43.21.67-.09.18-.26.28-.44.28zM3.5 9.72c-.1 0-.2-.03-.29-.09-.23-.16-.28-.47-.12-.7.99-1.4 2.25-2.5 3.75-3.27C9.98 4.04 14 4.03 17.15 5.65c1.5.77 2.76 1.86 3.75 3.25.16.22.11.54-.12.7-.23.16-.54.11-.7-.12-.9-1.26-2.04-2.25-3.39-2.94-2.87-1.47-6.54-1.47-9.4.01-1.36.7-2.5 1.7-3.4 2.96-.08.14-.23.21-.39.21zm6.25 12.07c-.13 0-.26-.05-.35-.15-.87-.87-1.34-1.43-2.01-2.64-.69-1.23-1.05-2.73-1.05-4.34 0-2.97 2.54-5.39 5.66-5.39s5.66 2.42 5.66 5.39c0 .28-.22.5-.5.5s-.5-.22-.5-.5c0-2.42-2.09-4.39-4.66-4.39-2.57 0-4.66 1.97-4.66 4.39 0 1.44.32 2.77.93 3.85.64 1.15 1.08 1.64 1.85 2.42.19.2.19.51 0 .71-.11.1-.24.15-.37.15zm7.17-1.85c-1.19 0-2.24-.3-3.1-.89-1.49-1.01-2.38-2.65-2.38-4.39 0-.28.22-.5.5-.5s.5.22.5.5c0 1.41.72 2.74 1.94 3.56.71.48 1.54.71 2.54.71.24 0 .64-.03 1.04-.1.27-.05.53.13.58.41.05.27-.13.53-.41.58-.57.11-1.07.12-1.21.12zM14.91 22c-.04 0-.09-.01-.13-.02-1.59-.44-2.63-1.03-3.72-2.1-1.4-1.39-2.17-3.24-2.17-5.22 0-1.62 1.38-2.94 3.08-2.94 1.7 0 3.08 1.32 3.08 2.94 0 1.07.93 1.94 2.08 1.94s2.08-.87 2.08-1.94c0-3.77-3.25-6.83-7.25-6.83-2.84 0-5.44 1.58-6.61 4.03-.39.81-.59 1.76-.59 2.8 0 .78.07 2.01.67 3.61.1.26-.03.55-.29.64-.26.1-.55-.04-.64-.29-.49-1.31-.73-2.61-.73-3.96 0-1.2.23-2.29.68-3.24 1.33-2.79 4.28-4.6 7.51-4.6 4.55 0 8.25 3.51 8.25 7.83 0 1.62-1.38 2.94-3.08 2.94s-3.08-1.32-3.08-2.94c0-1.07-.93-1.94-2.08-1.94s-2.08.87-2.08 1.94c0 1.71.66 3.31 1.87 4.51.95.94 1.86 1.46 3.27 1.85.27.07.42.35.35.61-.05.23-.26.38-.47.38z"/></g>
-<g id="first-page"><path d="M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"/></g>
-<g id="flag"><path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z"/></g>
-<g id="flight-land"><path d="M2.5 19h19v2h-19zm7.18-5.73l4.35 1.16 5.31 1.42c.8.21 1.62-.26 1.84-1.06.21-.8-.26-1.62-1.06-1.84l-5.31-1.42-2.76-9.02L10.12 2v8.28L5.15 8.95l-.93-2.32-1.45-.39v5.17l1.6.43 5.31 1.43z"/></g>
-<g id="flight-takeoff"><path d="M2.5 19h19v2h-19zm19.57-9.36c-.21-.8-1.04-1.28-1.84-1.06L14.92 10l-6.9-6.43-1.93.51 4.14 7.17-4.97 1.33-1.97-1.54-1.45.39 1.82 3.16.77 1.33 1.6-.43 5.31-1.42 4.35-1.16L21 11.49c.81-.23 1.28-1.05 1.07-1.85z"/></g>
-<g id="flip-to-back"><path d="M9 7H7v2h2V7zm0 4H7v2h2v-2zm0-8c-1.11 0-2 .9-2 2h2V3zm4 12h-2v2h2v-2zm6-12v2h2c0-1.1-.9-2-2-2zm-6 0h-2v2h2V3zM9 17v-2H7c0 1.1.89 2 2 2zm10-4h2v-2h-2v2zm0-4h2V7h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zM5 7H3v12c0 1.1.89 2 2 2h12v-2H5V7zm10-2h2V3h-2v2zm0 12h2v-2h-2v2z"/></g>
-<g id="flip-to-front"><path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm2 4v-2H3c0 1.1.89 2 2 2zM3 9h2V7H3v2zm12 12h2v-2h-2v2zm4-18H9c-1.11 0-2 .9-2 2v10c0 1.1.89 2 2 2h10c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 12H9V5h10v10zm-8 6h2v-2h-2v2zm-4 0h2v-2H7v2z"/></g>
-<g id="folder"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></g>
-<g id="folder-open"><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/></g>
-<g id="folder-shared"><path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-5 3c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm4 8h-8v-1c0-1.33 2.67-2 4-2s4 .67 4 2v1z"/></g>
-<g id="font-download"><path d="M9.93 13.5h4.14L12 7.98zM20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-4.05 16.5l-1.14-3H9.17l-1.12 3H5.96l5.11-13h1.86l5.11 13h-2.09z"/></g>
-<g id="forward"><path d="M12 8V4l8 8-8 8v-4H4V8z"/></g>
-<g id="fullscreen"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></g>
-<g id="fullscreen-exit"><path d="M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"/></g>
-<g id="g-translate"><path d="M20 5h-9.12L10 2H4c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h7l1 3h8c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zM7.17 14.59c-2.25 0-4.09-1.83-4.09-4.09s1.83-4.09 4.09-4.09c1.04 0 1.99.37 2.74 1.07l.07.06-1.23 1.18-.06-.05c-.29-.27-.78-.59-1.52-.59-1.31 0-2.38 1.09-2.38 2.42s1.07 2.42 2.38 2.42c1.37 0 1.96-.87 2.12-1.46H7.08V9.91h3.95l.01.07c.04.21.05.4.05.61 0 2.35-1.61 4-3.92 4zm6.03-1.71c.33.6.74 1.18 1.19 1.7l-.54.53-.65-2.23zm.77-.76h-.99l-.31-1.04h3.99s-.34 1.31-1.56 2.74c-.52-.62-.89-1.23-1.13-1.7zM21 20c0 .55-.45 1-1 1h-7l2-2-.81-2.77.92-.92L17.79 18l.73-.73-2.71-2.68c.9-1.03 1.6-2.25 1.92-3.51H19v-1.04h-3.64V9h-1.04v1.04h-1.96L11.18 6H20c.55 0 1 .45 1 1v13z"/></g>
-<g id="gavel"><path d="M1 21h12v2H1zM5.245 8.07l2.83-2.827 14.14 14.142-2.828 2.828zM12.317 1l5.657 5.656-2.83 2.83-5.654-5.66zM3.825 9.485l5.657 5.657-2.828 2.828-5.657-5.657z"/></g>
-<g id="gesture"><path d="M4.59 6.89c.7-.71 1.4-1.35 1.71-1.22.5.2 0 1.03-.3 1.52-.25.42-2.86 3.89-2.86 6.31 0 1.28.48 2.34 1.34 2.98.75.56 1.74.73 2.64.46 1.07-.31 1.95-1.4 3.06-2.77 1.21-1.49 2.83-3.44 4.08-3.44 1.63 0 1.65 1.01 1.76 1.79-3.78.64-5.38 3.67-5.38 5.37 0 1.7 1.44 3.09 3.21 3.09 1.63 0 4.29-1.33 4.69-6.1H21v-2.5h-2.47c-.15-1.65-1.09-4.2-4.03-4.2-2.25 0-4.18 1.91-4.94 2.84-.58.73-2.06 2.48-2.29 2.72-.25.3-.68.84-1.11.84-.45 0-.72-.83-.36-1.92.35-1.09 1.4-2.86 1.85-3.52.78-1.14 1.3-1.92 1.3-3.28C8.95 3.69 7.31 3 6.44 3 5.12 3 3.97 4 3.72 4.25c-.36.36-.66.66-.88.93l1.75 1.71zm9.29 11.66c-.31 0-.74-.26-.74-.72 0-.6.73-2.2 2.87-2.76-.3 2.69-1.43 3.48-2.13 3.48z"/></g>
-<g id="get-app"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></g>
-<g id="gif"><path d="M11.5 9H13v6h-1.5zM9 9H6c-.6 0-1 .5-1 1v4c0 .5.4 1 1 1h3c.6 0 1-.5 1-1v-2H8.5v1.5h-2v-3H10V10c0-.5-.4-1-1-1zm10 1.5V9h-4.5v6H16v-2h2v-1.5h-2v-1z"/></g>
-<g id="grade"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></g>
-<g id="group-work"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM8 17.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5zM9.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S9.5 9.38 9.5 8zm6.5 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
-<g id="help"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></g>
-<g id="help-outline"><path d="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"/></g>
-<g id="highlight-off"><path d="M14.59 8L12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41 14.59 8zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="history"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></g>
-<g id="home"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></g>
-<g id="hourglass-empty"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"/></g>
-<g id="hourglass-full"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6z"/></g>
-<g id="http"><path d="M4.5 11h-2V9H1v6h1.5v-2.5h2V15H6V9H4.5v2zm2.5-.5h1.5V15H10v-4.5h1.5V9H7v1.5zm5.5 0H14V15h1.5v-4.5H17V9h-4.5v1.5zm9-1.5H18v6h1.5v-2h2c.8 0 1.5-.7 1.5-1.5v-1c0-.8-.7-1.5-1.5-1.5zm0 2.5h-2v-1h2v1z"/></g>
-<g id="https"><path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/></g>
-<g id="important-devices"><path d="M23 11.01L18 11c-.55 0-1 .45-1 1v9c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-9c0-.55-.45-.99-1-.99zM23 20h-5v-7h5v7zM20 2H2C.89 2 0 2.89 0 4v12c0 1.1.89 2 2 2h7v2H7v2h8v-2h-2v-2h2v-2H2V4h18v5h2V4c0-1.11-.9-2-2-2zm-8.03 7L11 6l-.97 3H7l2.47 1.76-.94 2.91 2.47-1.8 2.47 1.8-.94-2.91L15 9h-3.03z"/></g>
-<g id="inbox"><path d="M19 3H4.99c-1.11 0-1.98.89-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.11-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10z"/></g>
-<g id="indeterminate-check-box"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"/></g>
-<g id="info"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></g>
-<g id="info-outline"><path d="M11 17h2v-6h-2v6zm1-15C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 9h2V7h-2v2z"/></g>
-<g id="input"><path d="M21 3.01H3c-1.1 0-2 .9-2 2V9h2V4.99h18v14.03H3V15H1v4.01c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98v-14c0-1.11-.9-2-2-2zM11 16l4-4-4-4v3H1v2h10v3z"/></g>
-<g id="invert-colors"><path d="M17.66 7.93L12 2.27 6.34 7.93c-3.12 3.12-3.12 8.19 0 11.31C7.9 20.8 9.95 21.58 12 21.58c2.05 0 4.1-.78 5.66-2.34 3.12-3.12 3.12-8.19 0-11.31zM12 19.59c-1.6 0-3.11-.62-4.24-1.76C6.62 16.69 6 15.19 6 13.59s.62-3.11 1.76-4.24L12 5.1v14.49z"/></g>
-<g id="label"><path d="M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16z"/></g>
-<g id="label-outline"><path d="M17.63 5.84C17.27 5.33 16.67 5 16 5L5 5.01C3.9 5.01 3 5.9 3 7v10c0 1.1.9 1.99 2 1.99L16 19c.67 0 1.27-.33 1.63-.84L22 12l-4.37-6.16zM16 17H5V7h11l3.55 5L16 17z"/></g>
-<g id="language"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56zM12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96zM4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2H4.26zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56zm2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8zM12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96zM14.34 14H9.66c-.09-.66-.16-1.32-.16-2 0-.68.07-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2zm.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56zM16.36 14c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2h-3.38z"/></g>
-<g id="last-page"><path d="M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"/></g>
-<g id="launch"><path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/></g>
-<g id="lightbulb-outline"><path d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z"/></g>
-<g id="line-style"><path d="M3 16h5v-2H3v2zm6.5 0h5v-2h-5v2zm6.5 0h5v-2h-5v2zM3 20h2v-2H3v2zm4 0h2v-2H7v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zM3 12h8v-2H3v2zm10 0h8v-2h-8v2zM3 4v4h18V4H3z"/></g>
-<g id="line-weight"><path d="M3 17h18v-2H3v2zm0 3h18v-1H3v1zm0-7h18v-3H3v3zm0-9v4h18V4H3z"/></g>
-<g id="link"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></g>
-<g id="list"><path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z"/></g>
-<g id="lock"><path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/></g>
-<g id="lock-open"><path d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z"/></g>
-<g id="lock-outline"><path d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H8.9V6zM18 20H6V10h12v10z"/></g>
-<g id="low-priority"><path d="M14 5h8v2h-8zm0 5.5h8v2h-8zm0 5.5h8v2h-8zM2 11.5C2 15.08 4.92 18 8.5 18H9v2l3-3-3-3v2h-.5C6.02 16 4 13.98 4 11.5S6.02 7 8.5 7H12V5H8.5C4.92 5 2 7.92 2 11.5z"/></g>
-<g id="loyalty"><path d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7zm11.77 8.27L13 19.54l-4.27-4.27C8.28 14.81 8 14.19 8 13.5c0-1.38 1.12-2.5 2.5-2.5.69 0 1.32.28 1.77.74l.73.72.73-.73c.45-.45 1.08-.73 1.77-.73 1.38 0 2.5 1.12 2.5 2.5 0 .69-.28 1.32-.73 1.77z"/></g>
-<g id="mail"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
-<g id="markunread"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
-<g id="markunread-mailbox"><path d="M20 6H10v6H8V4h6V0H6v6H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z"/></g>
-<g id="menu"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></g>
-<g id="more-horiz"><path d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="more-vert"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="motorcycle"><path d="M19.44 9.03L15.41 5H11v2h3.59l2 2H5c-2.8 0-5 2.2-5 5s2.2 5 5 5c2.46 0 4.45-1.69 4.9-4h1.65l2.77-2.77c-.21.54-.32 1.14-.32 1.77 0 2.8 2.2 5 5 5s5-2.2 5-5c0-2.65-1.97-4.77-4.56-4.97zM7.82 15C7.4 16.15 6.28 17 5 17c-1.63 0-3-1.37-3-3s1.37-3 3-3c1.28 0 2.4.85 2.82 2H5v2h2.82zM19 17c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"/></g>
-<g id="move-to-inbox"><path d="M19 3H4.99c-1.11 0-1.98.9-1.98 2L3 19c0 1.1.88 2 1.99 2H19c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 12h-4c0 1.66-1.35 3-3 3s-3-1.34-3-3H4.99V5H19v10zm-3-5h-2V7h-4v3H8l4 4 4-4z"/></g>
-<g id="next-week"><path d="M20 7h-4V5c0-.55-.22-1.05-.59-1.41C15.05 3.22 14.55 3 14 3h-4c-1.1 0-2 .9-2 2v2H4c-1.1 0-2 .9-2 2v11c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zM10 5h4v2h-4V5zm1 13.5l-1-1 3-3-3-3 1-1 4 4-4 4z"/></g>
-<g id="note-add"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 14h-3v3h-2v-3H8v-2h3v-3h2v3h3v2zm-3-7V3.5L18.5 9H13z"/></g>
-<g id="offline-pin"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm5 16H7v-2h10v2zm-6.7-4L7 10.7l1.4-1.4 1.9 1.9 5.3-5.3L17 7.3 10.3 14z"/></g>
-<g id="opacity"><path d="M17.66 8L12 2.35 6.34 8C4.78 9.56 4 11.64 4 13.64s.78 4.11 2.34 5.67 3.61 2.35 5.66 2.35 4.1-.79 5.66-2.35S20 15.64 20 13.64 19.22 9.56 17.66 8zM6 14c.01-2 .62-3.27 1.76-4.4L12 5.27l4.24 4.38C17.38 10.77 17.99 12 18 14H6z"/></g>
-<g id="open-in-browser"><path d="M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6l-4 4h3v6h2v-6h3l-4-4z"/></g>
-<g id="open-in-new"><path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/></g>
-<g id="open-with"><path d="M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z"/></g>
-<g id="pageview"><path d="M11.5 9C10.12 9 9 10.12 9 11.5s1.12 2.5 2.5 2.5 2.5-1.12 2.5-2.5S12.88 9 11.5 9zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-3.21 14.21l-2.91-2.91c-.69.44-1.51.7-2.39.7C9.01 16 7 13.99 7 11.5S9.01 7 11.5 7 16 9.01 16 11.5c0 .88-.26 1.69-.7 2.39l2.91 2.9-1.42 1.42z"/></g>
-<g id="pan-tool"><path d="M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5z"/></g>
-<g id="payment"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z"/></g>
-<g id="perm-camera-mic"><path d="M20 5h-3.17L15 3H9L7.17 5H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h7v-2.09c-2.83-.48-5-2.94-5-5.91h2c0 2.21 1.79 4 4 4s4-1.79 4-4h2c0 2.97-2.17 5.43-5 5.91V21h7c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-6 8c0 1.1-.9 2-2 2s-2-.9-2-2V9c0-1.1.9-2 2-2s2 .9 2 2v4z"/></g>
-<g id="perm-contact-calendar"><path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm6 12H6v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z"/></g>
-<g id="perm-data-setting"><path d="M18.99 11.5c.34 0 .67.03 1 .07L20 0 0 20h11.56c-.04-.33-.07-.66-.07-1 0-4.14 3.36-7.5 7.5-7.5zm3.71 7.99c.02-.16.04-.32.04-.49 0-.17-.01-.33-.04-.49l1.06-.83c.09-.08.12-.21.06-.32l-1-1.73c-.06-.11-.19-.15-.31-.11l-1.24.5c-.26-.2-.54-.37-.85-.49l-.19-1.32c-.01-.12-.12-.21-.24-.21h-2c-.12 0-.23.09-.25.21l-.19 1.32c-.3.13-.59.29-.85.49l-1.24-.5c-.11-.04-.24 0-.31.11l-1 1.73c-.06.11-.04.24.06.32l1.06.83c-.02.16-.03.32-.03.49 0 .17.01.33.03.49l-1.06.83c-.09.08-.12.21-.06.32l1 1.73c.06.11.19.15.31.11l1.24-.5c.26.2.54.37.85.49l.19 1.32c.02.12.12.21.25.21h2c.12 0 .23-.09.25-.21l.19-1.32c.3-.13.59-.29.84-.49l1.25.5c.11.04.24 0 .31-.11l1-1.73c.06-.11.03-.24-.06-.32l-1.07-.83zm-3.71 1.01c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="perm-device-information"><path d="M13 7h-2v2h2V7zm0 4h-2v6h2v-6zm4-9.99L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14z"/></g>
-<g id="perm-identity"><path d="M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z"/></g>
-<g id="perm-media"><path d="M2 6H0v5h.01L0 20c0 1.1.9 2 2 2h18v-2H2V6zm20-2h-8l-2-2H6c-1.1 0-1.99.9-1.99 2L4 16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM7 15l4.5-6 3.5 4.51 2.5-3.01L21 15H7z"/></g>
-<g id="perm-phone-msg"><path d="M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM12 3v10l3-3h6V3h-9z"/></g>
-<g id="perm-scan-wifi"><path d="M12 3C6.95 3 3.15 4.85 0 7.23L12 22 24 7.25C20.85 4.87 17.05 3 12 3zm1 13h-2v-6h2v6zm-2-8V6h2v2h-2z"/></g>
-<g id="pets"><circle cx="4.5" cy="9.5" r="2.5"/><circle cx="9" cy="5.5" r="2.5"/><circle cx="15" cy="5.5" r="2.5"/><circle cx="19.5" cy="9.5" r="2.5"/><path d="M17.34 14.86c-.87-1.02-1.6-1.89-2.48-2.91-.46-.54-1.05-1.08-1.75-1.32-.11-.04-.22-.07-.33-.09-.25-.04-.52-.04-.78-.04s-.53 0-.79.05c-.11.02-.22.05-.33.09-.7.24-1.28.78-1.75 1.32-.87 1.02-1.6 1.89-2.48 2.91-1.31 1.31-2.92 2.76-2.62 4.79.29 1.02 1.02 2.03 2.33 2.32.73.15 3.06-.44 5.54-.44h.18c2.48 0 4.81.58 5.54.44 1.31-.29 2.04-1.31 2.33-2.32.31-2.04-1.3-3.49-2.61-4.8z"/></g>
-<g id="picture-in-picture"><path d="M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98V5c0-1.1-.9-2-2-2zm0 16.01H3V4.98h18v14.03z"/></g>
-<g id="picture-in-picture-alt"><path d="M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V4.97h18v14.05z"/></g>
-<g id="play-for-work"><path d="M11 5v5.59H7.5l4.5 4.5 4.5-4.5H13V5h-2zm-5 9c0 3.31 2.69 6 6 6s6-2.69 6-6h-2c0 2.21-1.79 4-4 4s-4-1.79-4-4H6z"/></g>
-<g id="polymer"><path d="M19 4h-4L7.11 16.63 4.5 12 9 4H5L.5 12 5 20h4l7.89-12.63L19.5 12 15 20h4l4.5-8z"/></g>
-<g id="power-settings-new"><path d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z"/></g>
-<g id="pregnant-woman"><path d="M9 4c0-1.11.89-2 2-2s2 .89 2 2-.89 2-2 2-2-.89-2-2zm7 9c-.01-1.34-.83-2.51-2-3 0-1.66-1.34-3-3-3s-3 1.34-3 3v7h2v5h3v-5h3v-4z"/></g>
-<g id="print"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></g>
-<g id="query-builder"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></g>
-<g id="question-answer"><path d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"/></g>
-<g id="radio-button-checked"><path d="M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
-<g id="radio-button-unchecked"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
-<g id="receipt"><path d="M18 17H6v-2h12v2zm0-4H6v-2h12v2zm0-4H6V7h12v2zM3 22l1.5-1.5L6 22l1.5-1.5L9 22l1.5-1.5L12 22l1.5-1.5L15 22l1.5-1.5L18 22l1.5-1.5L21 22V2l-1.5 1.5L18 2l-1.5 1.5L15 2l-1.5 1.5L12 2l-1.5 1.5L9 2 7.5 3.5 6 2 4.5 3.5 3 2v20z"/></g>
-<g id="record-voice-over"><circle cx="9" cy="9" r="4"/><path d="M9 15c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4zm7.76-9.64l-1.68 1.69c.84 1.18.84 2.71 0 3.89l1.68 1.69c2.02-2.02 2.02-5.07 0-7.27zM20.07 2l-1.63 1.63c2.77 3.02 2.77 7.56 0 10.74L20.07 16c3.9-3.89 3.91-9.95 0-14z"/></g>
-<g id="redeem"><path d="M20 6h-2.18c.11-.31.18-.65.18-1 0-1.66-1.34-3-3-3-1.05 0-1.96.54-2.5 1.35l-.5.67-.5-.68C10.96 2.54 10.05 2 9 2 7.34 2 6 3.34 6 5c0 .35.07.69.18 1H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-5-2c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM9 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm11 15H4v-2h16v2zm0-5H4V8h5.08L7 10.83 8.62 12 11 8.76l1-1.36 1 1.36L15.38 12 17 10.83 14.92 8H20v6z"/></g>
-<g id="redo"><path d="M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"/></g>
-<g id="refresh"><path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></g>
-<g id="remove"><path d="M19 13H5v-2h14v2z"/></g>
-<g id="remove-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z"/></g>
-<g id="remove-circle-outline"><path d="M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></g>
-<g id="remove-shopping-cart"><path d="M22.73 22.73L2.77 2.77 2 2l-.73-.73L0 2.54l4.39 4.39 2.21 4.66-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h7.46l1.38 1.38c-.5.36-.83.95-.83 1.62 0 1.1.89 2 1.99 2 .67 0 1.26-.33 1.62-.84L21.46 24l1.27-1.27zM7.42 15c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h2.36l2 2H7.42zm8.13-2c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H6.54l9.01 9zM7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2z"/></g>
-<g id="reorder"><path d="M3 15h18v-2H3v2zm0 4h18v-2H3v2zm0-8h18V9H3v2zm0-6v2h18V5H3z"/></g>
-<g id="reply"><path d="M10 9V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"/></g>
-<g id="reply-all"><path d="M7 8V5l-7 7 7 7v-3l-4-4 4-4zm6 1V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"/></g>
-<g id="report"><path d="M15.73 3H8.27L3 8.27v7.46L8.27 21h7.46L21 15.73V8.27L15.73 3zM12 17.3c-.72 0-1.3-.58-1.3-1.3 0-.72.58-1.3 1.3-1.3.72 0 1.3.58 1.3 1.3 0 .72-.58 1.3-1.3 1.3zm1-4.3h-2V7h2v6z"/></g>
-<g id="report-problem"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></g>
-<g id="restore"><path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/></g>
-<g id="restore-page"><path d="M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm-2 16c-2.05 0-3.81-1.24-4.58-3h1.71c.63.9 1.68 1.5 2.87 1.5 1.93 0 3.5-1.57 3.5-3.5S13.93 9.5 12 9.5c-1.35 0-2.52.78-3.1 1.9l1.6 1.6h-4V9l1.3 1.3C8.69 8.92 10.23 8 12 8c2.76 0 5 2.24 5 5s-2.24 5-5 5z"/></g>
-<g id="room"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
-<g id="rounded-corner"><path d="M19 19h2v2h-2v-2zm0-2h2v-2h-2v2zM3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm0-4h2V3H3v2zm4 0h2V3H7v2zm8 16h2v-2h-2v2zm-4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm-8 0h2v-2H7v2zm-4 0h2v-2H3v2zM21 8c0-2.76-2.24-5-5-5h-5v2h5c1.65 0 3 1.35 3 3v5h2V8z"/></g>
-<g id="rowing"><path d="M8.5 14.5L4 19l1.5 1.5L9 17h2l-2.5-2.5zM15 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 20.01L18 24l-2.99-3.01V19.5l-7.1-7.09c-.31.05-.61.07-.91.07v-2.16c1.66.03 3.61-.87 4.67-2.04l1.4-1.55c.19-.21.43-.38.69-.5.29-.14.62-.23.96-.23h.03C15.99 6.01 17 7.02 17 8.26v5.75c0 .84-.35 1.61-.92 2.16l-3.58-3.58v-2.27c-.63.52-1.43 1.02-2.29 1.39L16.5 18H18l3 3.01z"/></g>
-<g id="save"><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></g>
-<g id="schedule"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></g>
-<g id="search"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></g>
-<g id="select-all"><path d="M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10zm2-8h6v6H9V9z"/></g>
-<g id="send"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/></g>
-<g id="settings"><path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></g>
-<g id="settings-applications"><path d="M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm7-7H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-1.75 9c0 .23-.02.46-.05.68l1.48 1.16c.13.11.17.3.08.45l-1.4 2.42c-.09.15-.27.21-.43.15l-1.74-.7c-.36.28-.76.51-1.18.69l-.26 1.85c-.03.17-.18.3-.35.3h-2.8c-.17 0-.32-.13-.35-.29l-.26-1.85c-.43-.18-.82-.41-1.18-.69l-1.74.7c-.16.06-.34 0-.43-.15l-1.4-2.42c-.09-.15-.05-.34.08-.45l1.48-1.16c-.03-.23-.05-.46-.05-.69 0-.23.02-.46.05-.68l-1.48-1.16c-.13-.11-.17-.3-.08-.45l1.4-2.42c.09-.15.27-.21.43-.15l1.74.7c.36-.28.76-.51 1.18-.69l.26-1.85c.03-.17.18-.3.35-.3h2.8c.17 0 .32.13.35.29l.26 1.85c.43.18.82.41 1.18.69l1.74-.7c.16-.06.34 0 .43.15l1.4 2.42c.09.15.05.34-.08.45l-1.48 1.16c.03.23.05.46.05.69z"/></g>
-<g id="settings-backup-restore"><path d="M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9H0l4 4 4-4H5c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44C8.04 20.3 9.94 21 12 21c4.97 0 9-4.03 9-9s-4.03-9-9-9z"/></g>
-<g id="settings-bluetooth"><path d="M11 24h2v-2h-2v2zm-4 0h2v-2H7v2zm8 0h2v-2h-2v2zm2.71-18.29L12 0h-1v7.59L6.41 3 5 4.41 10.59 10 5 15.59 6.41 17 11 12.41V20h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 3.83l1.88 1.88L13 7.59V3.83zm1.88 10.46L13 16.17v-3.76l1.88 1.88z"/></g>
-<g id="settings-brightness"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02zM8 16h2.5l1.5 1.5 1.5-1.5H16v-2.5l1.5-1.5-1.5-1.5V8h-2.5L12 6.5 10.5 8H8v2.5L6.5 12 8 13.5V16zm4-7c1.66 0 3 1.34 3 3s-1.34 3-3 3V9z"/></g>
-<g id="settings-cell"><path d="M7 24h2v-2H7v2zm4 0h2v-2h-2v2zm4 0h2v-2h-2v2zM16 .01L8 0C6.9 0 6 .9 6 2v16c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V2c0-1.1-.9-1.99-2-1.99zM16 16H8V4h8v12z"/></g>
-<g id="settings-ethernet"><path d="M7.77 6.76L6.23 5.48.82 12l5.41 6.52 1.54-1.28L3.42 12l4.35-5.24zM7 13h2v-2H7v2zm10-2h-2v2h2v-2zm-6 2h2v-2h-2v2zm6.77-7.52l-1.54 1.28L20.58 12l-4.35 5.24 1.54 1.28L23.18 12l-5.41-6.52z"/></g>
-<g id="settings-input-antenna"><path d="M12 5c-3.87 0-7 3.13-7 7h2c0-2.76 2.24-5 5-5s5 2.24 5 5h2c0-3.87-3.13-7-7-7zm1 9.29c.88-.39 1.5-1.26 1.5-2.29 0-1.38-1.12-2.5-2.5-2.5S9.5 10.62 9.5 12c0 1.02.62 1.9 1.5 2.29v3.3L7.59 21 9 22.41l3-3 3 3L16.41 21 13 17.59v-3.3zM12 1C5.93 1 1 5.93 1 12h2c0-4.97 4.03-9 9-9s9 4.03 9 9h2c0-6.07-4.93-11-11-11z"/></g>
-<g id="settings-input-component"><path d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"/></g>
-<g id="settings-input-composite"><path d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"/></g>
-<g id="settings-input-hdmi"><path d="M18 7V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v3H5v6l3 6v3h8v-3l3-6V7h-1zM8 4h8v3h-2V5h-1v2h-2V5h-1v2H8V4z"/></g>
-<g id="settings-input-svideo"><path d="M8 11.5c0-.83-.67-1.5-1.5-1.5S5 10.67 5 11.5 5.67 13 6.5 13 8 12.33 8 11.5zm7-5c0-.83-.67-1.5-1.5-1.5h-3C9.67 5 9 5.67 9 6.5S9.67 8 10.5 8h3c.83 0 1.5-.67 1.5-1.5zM8.5 15c-.83 0-1.5.67-1.5 1.5S7.67 18 8.5 18s1.5-.67 1.5-1.5S9.33 15 8.5 15zM12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9zm5.5-11c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm-2 5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z"/></g>
-<g id="settings-overscan"><path d="M12.01 5.5L10 8h4l-1.99-2.5zM18 10v4l2.5-1.99L18 10zM6 10l-2.5 2.01L6 14v-4zm8 6h-4l2.01 2.5L14 16zm7-13H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16.01H3V4.99h18v14.02z"/></g>
-<g id="settings-phone"><path d="M13 9h-2v2h2V9zm4 0h-2v2h2V9zm3 6.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.58l2.2-2.21c.28-.27.36-.66.25-1.01C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 9v2h2V9h-2z"/></g>
-<g id="settings-power"><path d="M7 24h2v-2H7v2zm4 0h2v-2h-2v2zm2-22h-2v10h2V2zm3.56 2.44l-1.45 1.45C16.84 6.94 18 8.83 18 11c0 3.31-2.69 6-6 6s-6-2.69-6-6c0-2.17 1.16-4.06 2.88-5.12L7.44 4.44C5.36 5.88 4 8.28 4 11c0 4.42 3.58 8 8 8s8-3.58 8-8c0-2.72-1.36-5.12-3.44-6.56zM15 24h2v-2h-2v2z"/></g>
-<g id="settings-remote"><path d="M15 9H9c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h6c.55 0 1-.45 1-1V10c0-.55-.45-1-1-1zm-3 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM7.05 6.05l1.41 1.41C9.37 6.56 10.62 6 12 6s2.63.56 3.54 1.46l1.41-1.41C15.68 4.78 13.93 4 12 4s-3.68.78-4.95 2.05zM12 0C8.96 0 6.21 1.23 4.22 3.22l1.41 1.41C7.26 3.01 9.51 2 12 2s4.74 1.01 6.36 2.64l1.41-1.41C17.79 1.23 15.04 0 12 0z"/></g>
-<g id="settings-voice"><path d="M7 24h2v-2H7v2zm5-11c1.66 0 2.99-1.34 2.99-3L15 4c0-1.66-1.34-3-3-3S9 2.34 9 4v6c0 1.66 1.34 3 3 3zm-1 11h2v-2h-2v2zm4 0h2v-2h-2v2zm4-14h-1.7c0 3-2.54 5.1-5.3 5.1S6.7 13 6.7 10H5c0 3.41 2.72 6.23 6 6.72V20h2v-3.28c3.28-.49 6-3.31 6-6.72z"/></g>
-<g id="shop"><path d="M16 6V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H2v13c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6h-6zm-6-2h4v2h-4V4zM9 18V9l7.5 4L9 18z"/></g>
-<g id="shop-two"><path d="M3 9H1v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2H3V9zm15-4V3c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H5v11c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5h-5zm-6-2h4v2h-4V3zm0 12V8l5.5 3-5.5 4z"/></g>
-<g id="shopping-basket"><path d="M17.21 9l-4.38-6.56c-.19-.28-.51-.42-.83-.42-.32 0-.64.14-.83.43L6.79 9H2c-.55 0-1 .45-1 1 0 .09.01.18.04.27l2.54 9.27c.23.84 1 1.46 1.92 1.46h13c.92 0 1.69-.62 1.93-1.46l2.54-9.27L23 10c0-.55-.45-1-1-1h-4.79zM9 9l3-4.4L15 9H9zm3 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-<g id="shopping-cart"><path d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="sort"><path d="M3 18h6v-2H3v2zM3 6v2h18V6H3zm0 7h12v-2H3v2z"/></g>
-<g id="speaker-notes"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 14H6v-2h2v2zm0-3H6V9h2v2zm0-3H6V6h2v2zm7 6h-5v-2h5v2zm3-3h-8V9h8v2zm0-3h-8V6h8v2z"/></g>
-<g id="speaker-notes-off"><path d="M10.54 11l-.54-.54L7.54 8 6 6.46 2.38 2.84 1.27 1.73 0 3l2.01 2.01L2 22l4-4h9l5.73 5.73L22 22.46 17.54 18l-7-7zM8 14H6v-2h2v2zm-2-3V9l2 2H6zm14-9H4.08L10 7.92V6h8v2h-7.92l1 1H18v2h-4.92l6.99 6.99C21.14 17.95 22 17.08 22 16V4c0-1.1-.9-2-2-2z"/></g>
-<g id="spellcheck"><path d="M12.45 16h2.09L9.43 3H7.57L2.46 16h2.09l1.12-3h5.64l1.14 3zm-6.02-5L8.5 5.48 10.57 11H6.43zm15.16.59l-8.09 8.09L9.83 16l-1.41 1.41 5.09 5.09L23 13l-1.41-1.41z"/></g>
-<g id="star"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></g>
-<g id="star-border"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></g>
-<g id="star-half"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></g>
-<g id="stars"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zm4.24 16L12 15.45 7.77 18l1.12-4.81-3.73-3.23 4.92-.42L12 5l1.92 4.53 4.92.42-3.73 3.23L16.23 18z"/></g>
-<g id="store"><path d="M20 4H4v2h16V4zm1 10v-2l-1-5H4l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4H6v-4h6v4z"/></g>
-<g id="subdirectory-arrow-left"><path d="M11 9l1.42 1.42L8.83 14H18V4h2v12H8.83l3.59 3.58L11 21l-6-6 6-6z"/></g>
-<g id="subdirectory-arrow-right"><path d="M19 15l-6 6-1.42-1.42L15.17 16H4V4h2v10h9.17l-3.59-3.58L13 9l6 6z"/></g>
-<g id="subject"><path d="M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z"/></g>
-<g id="supervisor-account"><path d="M16.5 12c1.38 0 2.49-1.12 2.49-2.5S17.88 7 16.5 7C15.12 7 14 8.12 14 9.5s1.12 2.5 2.5 2.5zM9 11c1.66 0 2.99-1.34 2.99-3S10.66 5 9 5C7.34 5 6 6.34 6 8s1.34 3 3 3zm7.5 3c-1.83 0-5.5.92-5.5 2.75V19h11v-2.25c0-1.83-3.67-2.75-5.5-2.75zM9 13c-2.33 0-7 1.17-7 3.5V19h7v-2.25c0-.85.33-2.34 2.37-3.47C10.5 13.1 9.66 13 9 13z"/></g>
-<g id="swap-horiz"><path d="M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z"/></g>
-<g id="swap-vert"><path d="M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z"/></g>
-<g id="swap-vertical-circle"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM6.5 9L10 5.5 13.5 9H11v4H9V9H6.5zm11 6L14 18.5 10.5 15H13v-4h2v4h2.5z"/></g>
-<g id="system-update-alt"><path d="M12 16.5l4-4h-3v-9h-2v9H8l4 4zm9-13h-6v1.99h6v14.03H3V5.49h6V3.5H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z"/></g>
-<g id="tab"><path d="M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h10v4h8v10z"/></g>
-<g id="tab-unselected"><path d="M1 9h2V7H1v2zm0 4h2v-2H1v2zm0-8h2V3c-1.1 0-2 .9-2 2zm8 16h2v-2H9v2zm-8-4h2v-2H1v2zm2 4v-2H1c0 1.1.9 2 2 2zM21 3h-8v6h10V5c0-1.1-.9-2-2-2zm0 14h2v-2h-2v2zM9 5h2V3H9v2zM5 21h2v-2H5v2zM5 5h2V3H5v2zm16 16c1.1 0 2-.9 2-2h-2v2zm0-8h2v-2h-2v2zm-8 8h2v-2h-2v2zm4 0h2v-2h-2v2z"/></g>
-<g id="text-format"><path d="M5 17v2h14v-2H5zm4.5-4.2h5l.9 2.2h2.1L12.75 4h-1.5L6.5 15h2.1l.9-2.2zM12 5.98L13.87 11h-3.74L12 5.98z"/></g>
-<g id="theaters"><path d="M18 3v2h-2V3H8v2H6V3H4v18h2v-2h2v2h8v-2h2v2h2V3h-2zM8 17H6v-2h2v2zm0-4H6v-2h2v2zm0-4H6V7h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V7h2v2z"/></g>
-<g id="thumb-down"><path d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v1.91l.01.01L1 14c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"/></g>
-<g id="thumb-up"><path d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-1.91l-.01-.01L23 10z"/></g>
-<g id="thumbs-up-down"><path d="M12 6c0-.55-.45-1-1-1H5.82l.66-3.18.02-.23c0-.31-.13-.59-.33-.8L5.38 0 .44 4.94C.17 5.21 0 5.59 0 6v6.5c0 .83.67 1.5 1.5 1.5h6.75c.62 0 1.15-.38 1.38-.91l2.26-5.29c.07-.17.11-.36.11-.55V6zm10.5 4h-6.75c-.62 0-1.15.38-1.38.91l-2.26 5.29c-.07.17-.11.36-.11.55V18c0 .55.45 1 1 1h5.18l-.66 3.18-.02.24c0 .31.13.59.33.8l.79.78 4.94-4.94c.27-.27.44-.65.44-1.06v-6.5c0-.83-.67-1.5-1.5-1.5z"/></g>
-<g id="timeline"><path d="M23 8c0 1.1-.9 2-2 2-.18 0-.35-.02-.51-.07l-3.56 3.55c.05.16.07.34.07.52 0 1.1-.9 2-2 2s-2-.9-2-2c0-.18.02-.36.07-.52l-2.55-2.55c-.16.05-.34.07-.52.07s-.36-.02-.52-.07l-4.55 4.56c.05.16.07.33.07.51 0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2c.18 0 .35.02.51.07l4.56-4.55C8.02 9.36 8 9.18 8 9c0-1.1.9-2 2-2s2 .9 2 2c0 .18-.02.36-.07.52l2.55 2.55c.16-.05.34-.07.52-.07s.36.02.52.07l3.55-3.56C19.02 8.35 19 8.18 19 8c0-1.1.9-2 2-2s2 .9 2 2z"/></g>
-<g id="toc"><path d="M3 9h14V7H3v2zm0 4h14v-2H3v2zm0 4h14v-2H3v2zm16 0h2v-2h-2v2zm0-10v2h2V7h-2zm0 6h2v-2h-2v2z"/></g>
-<g id="today"><path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z"/></g>
-<g id="toll"><path d="M15 4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6zM3 12c0-2.61 1.67-4.83 4-5.65V4.26C3.55 5.15 1 8.27 1 12s2.55 6.85 6 7.74v-2.09c-2.33-.82-4-3.04-4-5.65z"/></g>
-<g id="touch-app"><path d="M9 11.24V7.5C9 6.12 10.12 5 11.5 5S14 6.12 14 7.5v3.74c1.21-.81 2-2.18 2-3.74C16 5.01 13.99 3 11.5 3S7 5.01 7 7.5c0 1.56.79 2.93 2 3.74zm9.84 4.63l-4.54-2.26c-.17-.07-.35-.11-.54-.11H13v-6c0-.83-.67-1.5-1.5-1.5S10 6.67 10 7.5v10.74l-3.43-.72c-.08-.01-.15-.03-.24-.03-.31 0-.59.13-.79.33l-.79.8 4.94 4.94c.27.27.65.44 1.06.44h6.79c.75 0 1.33-.55 1.44-1.28l.75-5.27c.01-.07.02-.14.02-.2 0-.62-.38-1.16-.91-1.38z"/></g>
-<g id="track-changes"><path d="M19.07 4.93l-1.41 1.41C19.1 7.79 20 9.79 20 12c0 4.42-3.58 8-8 8s-8-3.58-8-8c0-4.08 3.05-7.44 7-7.93v2.02C8.16 6.57 6 9.03 6 12c0 3.31 2.69 6 6 6s6-2.69 6-6c0-1.66-.67-3.16-1.76-4.24l-1.41 1.41C15.55 9.9 16 10.9 16 12c0 2.21-1.79 4-4 4s-4-1.79-4-4c0-1.86 1.28-3.41 3-3.86v2.14c-.6.35-1 .98-1 1.72 0 1.1.9 2 2 2s2-.9 2-2c0-.74-.4-1.38-1-1.72V2h-1C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10c0-2.76-1.12-5.26-2.93-7.07z"/></g>
-<g id="translate"><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></g>
-<g id="trending-down"><path d="M16 18l2.29-2.29-4.88-4.88-4 4L2 7.41 3.41 6l6 6 4-4 6.3 6.29L22 12v6z"/></g>
-<g id="trending-flat"><path d="M22 12l-4-4v3H3v2h15v3z"/></g>
-<g id="trending-up"><path d="M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z"/></g>
-<g id="turned-in"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2z"/></g>
-<g id="turned-in-not"><path d="M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2zm0 15l-5-2.18L7 18V5h10v13z"/></g>
-<g id="unarchive"><path d="M20.55 5.22l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.15.55L3.46 5.22C3.17 5.57 3 6.01 3 6.5V19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.49-.17-.93-.45-1.28zM12 9.5l5.5 5.5H14v2h-4v-2H6.5L12 9.5zM5.12 5l.82-1h12l.93 1H5.12z"/></g>
-<g id="undo"><path d="M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"/></g>
-<g id="unfold-less"><path d="M7.41 18.59L8.83 20 12 16.83 15.17 20l1.41-1.41L12 14l-4.59 4.59zm9.18-13.18L15.17 4 12 7.17 8.83 4 7.41 5.41 12 10l4.59-4.59z"/></g>
-<g id="unfold-more"><path d="M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z"/></g>
-<g id="update"><path d="M21 10.12h-6.78l2.74-2.82c-2.73-2.7-7.15-2.8-9.88-.1-2.73 2.71-2.73 7.08 0 9.79 2.73 2.71 7.15 2.71 9.88 0C18.32 15.65 19 14.08 19 12.1h2c0 1.98-.88 4.55-2.64 6.29-3.51 3.48-9.21 3.48-12.72 0-3.5-3.47-3.53-9.11-.02-12.58 3.51-3.47 9.14-3.47 12.65 0L21 3v7.12zM12.5 8v4.25l3.5 2.08-.72 1.21L11 13V8h1.5z"/></g>
-<g id="verified-user"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm-2 16l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9l-8 8z"/></g>
-<g id="view-agenda"><path d="M20 13H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zm0-10H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1z"/></g>
-<g id="view-array"><path d="M4 18h3V5H4v13zM18 5v13h3V5h-3zM8 18h9V5H8v13z"/></g>
-<g id="view-carousel"><path d="M7 19h10V4H7v15zm-5-2h4V6H2v11zM18 6v11h4V6h-4z"/></g>
-<g id="view-column"><path d="M10 18h5V5h-5v13zm-6 0h5V5H4v13zM16 5v13h5V5h-5z"/></g>
-<g id="view-day"><path d="M2 21h19v-3H2v3zM20 8H3c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h17c.55 0 1-.45 1-1V9c0-.55-.45-1-1-1zM2 3v3h19V3H2z"/></g>
-<g id="view-headline"><path d="M4 15h16v-2H4v2zm0 4h16v-2H4v2zm0-8h16V9H4v2zm0-6v2h16V5H4z"/></g>
-<g id="view-list"><path d="M4 14h4v-4H4v4zm0 5h4v-4H4v4zM4 9h4V5H4v4zm5 5h12v-4H9v4zm0 5h12v-4H9v4zM9 5v4h12V5H9z"/></g>
-<g id="view-module"><path d="M4 11h5V5H4v6zm0 7h5v-6H4v6zm6 0h5v-6h-5v6zm6 0h5v-6h-5v6zm-6-7h5V5h-5v6zm6-6v6h5V5h-5z"/></g>
-<g id="view-quilt"><path d="M10 18h5v-6h-5v6zm-6 0h5V5H4v13zm12 0h5v-6h-5v6zM10 5v6h11V5H10z"/></g>
-<g id="view-stream"><path d="M4 18h17v-6H4v6zM4 5v6h17V5H4z"/></g>
-<g id="view-week"><path d="M6 5H3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm14 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1zm-7 0h-3c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h3c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1z"/></g>
-<g id="visibility"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></g>
-<g id="visibility-off"><path d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"/></g>
-<g id="warning"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/></g>
-<g id="watch-later"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"/></g>
-<g id="weekend"><path d="M21 10c-1.1 0-2 .9-2 2v3H5v-3c0-1.1-.9-2-2-2s-2 .9-2 2v5c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-5c0-1.1-.9-2-2-2zm-3-5H6c-1.1 0-2 .9-2 2v2.15c1.16.41 2 1.51 2 2.82V14h12v-2.03c0-1.3.84-2.4 2-2.82V7c0-1.1-.9-2-2-2z"/></g>
-<g id="work"><path d="M20 6h-4V4c0-1.11-.89-2-2-2h-4c-1.11 0-2 .89-2 2v2H4c-1.11 0-1.99.89-1.99 2L2 19c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V8c0-1.11-.89-2-2-2zm-6 0h-4V4h4v2z"/></g>
-<g id="youtube-searched-for"><path d="M17.01 14h-.8l-.27-.27c.98-1.14 1.57-2.61 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 3-6.5 6.5H2l3.84 4 4.16-4H6.51C6.51 7 8.53 5 11.01 5s4.5 2.01 4.5 4.5c0 2.48-2.02 4.5-4.5 4.5-.65 0-1.26-.14-1.82-.38L7.71 15.1c.97.57 2.09.9 3.3.9 1.61 0 3.08-.59 4.22-1.57l.27.27v.79l5.01 4.99L22 19l-4.99-5z"/></g>
-<g id="zoom-in"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zm2.5-4h-2v2H9v-2H7V9h2V7h1v2h2v1z"/></g>
-<g id="zoom-out"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/maps-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/maps-icons.html
deleted file mode 100644
index d6ad092..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/maps-icons.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="maps" size="24">
-<svg><defs>
-<g id="add-location"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7zm4 8h-3v3h-2v-3H8V8h3V5h2v3h3v2z"/></g>
-<g id="beenhere"><path d="M19 1H5c-1.1 0-1.99.9-1.99 2L3 15.93c0 .69.35 1.3.88 1.66L12 23l8.11-5.41c.53-.36.88-.97.88-1.66L21 3c0-1.1-.9-2-2-2zm-9 15l-5-5 1.41-1.41L10 13.17l7.59-7.59L19 7l-9 9z"/></g>
-<g id="directions"><path d="M21.71 11.29l-9-9c-.39-.39-1.02-.39-1.41 0l-9 9c-.39.39-.39 1.02 0 1.41l9 9c.39.39 1.02.39 1.41 0l9-9c.39-.38.39-1.01 0-1.41zM14 14.5V12h-4v3H8v-4c0-.55.45-1 1-1h5V7.5l3.5 3.5-3.5 3.5z"/></g>
-<g id="directions-bike"><path d="M15.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM5 12c-2.8 0-5 2.2-5 5s2.2 5 5 5 5-2.2 5-5-2.2-5-5-5zm0 8.5c-1.9 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5 3.5 1.6 3.5 3.5-1.6 3.5-3.5 3.5zm5.8-10l2.4-2.4.8.8c1.3 1.3 3 2.1 5.1 2.1V9c-1.5 0-2.7-.6-3.6-1.5l-1.9-1.9c-.5-.4-1-.6-1.6-.6s-1.1.2-1.4.6L7.8 8.4c-.4.4-.6.9-.6 1.4 0 .6.2 1.1.6 1.4L11 14v5h2v-6.2l-2.2-2.3zM19 12c-2.8 0-5 2.2-5 5s2.2 5 5 5 5-2.2 5-5-2.2-5-5-5zm0 8.5c-1.9 0-3.5-1.6-3.5-3.5s1.6-3.5 3.5-3.5 3.5 1.6 3.5 3.5-1.6 3.5-3.5 3.5z"/></g>
-<g id="directions-boat"><path d="M20 21c-1.39 0-2.78-.47-4-1.32-2.44 1.71-5.56 1.71-8 0C6.78 20.53 5.39 21 4 21H2v2h2c1.38 0 2.74-.35 4-.99 2.52 1.29 5.48 1.29 8 0 1.26.65 2.62.99 4 .99h2v-2h-2zM3.95 19H4c1.6 0 3.02-.88 4-2 .98 1.12 2.4 2 4 2s3.02-.88 4-2c.98 1.12 2.4 2 4 2h.05l1.89-6.68c.08-.26.06-.54-.06-.78s-.34-.42-.6-.5L20 10.62V6c0-1.1-.9-2-2-2h-3V1H9v3H6c-1.1 0-2 .9-2 2v4.62l-1.29.42c-.26.08-.48.26-.6.5s-.15.52-.06.78L3.95 19zM6 6h12v3.97L12 8 6 9.97V6z"/></g>
-<g id="directions-bus"><path d="M4 16c0 .88.39 1.67 1 2.22V20c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h8v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1.78c.61-.55 1-1.34 1-2.22V6c0-3.5-3.58-4-8-4s-8 .5-8 4v10zm3.5 1c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm9 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6H6V6h12v5z"/></g>
-<g id="directions-car"><path d="M18.92 6.01C18.72 5.42 18.16 5 17.5 5h-11c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z"/></g>
-<g id="directions-railway"><path d="M4 15.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h12v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V5c0-3.5-3.58-4-8-4s-8 .5-8 4v10.5zm8 1.5c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm6-7H6V5h12v5z"/></g>
-<g id="directions-run"><path d="M13.49 5.48c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm-3.6 13.9l1-4.4 2.1 2v6h2v-7.5l-2.1-2 .6-3c1.3 1.5 3.3 2.5 5.5 2.5v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1l-5.2 2.2v4.7h2v-3.4l1.8-.7-1.6 8.1-4.9-1-.4 2 7 1.4z"/></g>
-<g id="directions-subway"><path d="M12 2c-4.42 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h12v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm3.5-6H6V6h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5V6h5v5z"/></g>
-<g id="directions-transit"><path d="M12 2c-4.42 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h12v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm3.5-6H6V6h5v5zm5.5 6c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm1.5-6h-5V6h5v5z"/></g>
-<g id="directions-walk"><path d="M13.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM9.8 8.9L7 23h2.1l1.8-8 2.1 2v6h2v-7.5l-2.1-2 .6-3C14.8 12 16.8 13 19 13v-2c-1.9 0-3.5-1-4.3-2.4l-1-1.6c-.4-.6-1-1-1.7-1-.3 0-.5.1-.8.1L6 8.3V13h2V9.6l1.8-.7"/></g>
-<g id="edit-location"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7zm-1.56 10H9v-1.44l3.35-3.34 1.43 1.43L10.44 12zm4.45-4.45l-.7.7-1.44-1.44.7-.7c.15-.15.39-.15.54 0l.9.9c.15.15.15.39 0 .54z"/></g>
-<g id="ev-station"><path d="M19.77 7.23l.01-.01-3.72-3.72L15 4.56l2.11 2.11c-.94.36-1.61 1.26-1.61 2.33 0 1.38 1.12 2.5 2.5 2.5.36 0 .69-.08 1-.21v7.21c0 .55-.45 1-1 1s-1-.45-1-1V14c0-1.1-.9-2-2-2h-1V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v16h10v-7.5h1.5v5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V9c0-.69-.28-1.32-.73-1.77zM18 10c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zM8 18v-4.5H6L10 6v5h2l-4 7z"/></g>
-<g id="flight"><path d="M10.18 9"/><path d="M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z"/></g>
-<g id="hotel"><path d="M7 13c1.66 0 3-1.34 3-3S8.66 7 7 7s-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7H3V5H1v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z"/></g>
-<g id="layers"><path d="M11.99 18.54l-7.37-5.73L3 14.07l9 7 9-7-1.63-1.27-7.38 5.74zM12 16l7.36-5.73L21 9l-9-7-9 7 1.63 1.27L12 16z"/></g>
-<g id="layers-clear"><path d="M19.81 14.99l1.19-.92-1.43-1.43-1.19.92 1.43 1.43zm-.45-4.72L21 9l-9-7-2.91 2.27 7.87 7.88 2.4-1.88zM3.27 1L2 2.27l4.22 4.22L3 9l1.63 1.27L12 16l2.1-1.63 1.43 1.43L12 18.54l-7.37-5.73L3 14.07l9 7 4.95-3.85L20.73 21 22 19.73 3.27 1z"/></g>
-<g id="local-activity"><path d="M20 12c0-1.1.9-2 2-2V6c0-1.1-.9-2-2-2H4c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8L12 14.5l-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25L12 5.8l1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z"/></g>
-<g id="local-airport"><path d="M21 16v-2l-8-5V3.5c0-.83-.67-1.5-1.5-1.5S10 2.67 10 3.5V9l-8 5v2l8-2.5V19l-2 1.5V22l3.5-1 3.5 1v-1.5L13 19v-5.5l8 2.5z"/></g>
-<g id="local-atm"><path d="M11 17h2v-1h1c.55 0 1-.45 1-1v-3c0-.55-.45-1-1-1h-3v-1h4V8h-2V7h-2v1h-1c-.55 0-1 .45-1 1v3c0 .55.45 1 1 1h3v1H9v2h2v1zm9-13H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4V6h16v12z"/></g>
-<g id="local-bar"><path d="M21 5V3H3v2l8 9v5H6v2h12v-2h-5v-5l8-9zM7.43 7L5.66 5h12.69l-1.78 2H7.43z"/></g>
-<g id="local-cafe"><path d="M20 3H4v10c0 2.21 1.79 4 4 4h6c2.21 0 4-1.79 4-4v-3h2c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 5h-2V5h2v3zM2 21h18v-2H2v2z"/></g>
-<g id="local-car-wash"><path d="M17 5c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zm-5 0c.83 0 1.5-.67 1.5-1.5 0-1-1.5-2.7-1.5-2.7s-1.5 1.7-1.5 2.7c0 .83.67 1.5 1.5 1.5zM7 5c.83 0 1.5-.67 1.5-1.5C8.5 2.5 7 .8 7 .8S5.5 2.5 5.5 3.5C5.5 4.33 6.17 5 7 5zm11.92 3.01C18.72 7.42 18.16 7 17.5 7h-11c-.66 0-1.21.42-1.42 1.01L3 14v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 18c-.83 0-1.5-.67-1.5-1.5S5.67 15 6.5 15s1.5.67 1.5 1.5S7.33 18 6.5 18zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 13l1.5-4.5h11L19 13H5z"/></g>
-<g id="local-convenience-store"><path d="M19 7V4H5v3H2v13h8v-4h4v4h8V7h-3zm-8 3H9v1h2v1H8V9h2V8H8V7h3v3zm5 2h-1v-2h-2V7h1v2h1V7h1v5z"/></g>
-<g id="local-dining"><path d="M8.1 13.34l2.83-2.83L3.91 3.5c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27L3.7 19.87l1.41 1.41L12 14.41l6.88 6.88 1.41-1.41L13.41 13l1.47-1.47z"/></g>
-<g id="local-drink"><path d="M3 2l2.01 18.23C5.13 21.23 5.97 22 7 22h10c1.03 0 1.87-.77 1.99-1.77L21 2H3zm9 17c-1.66 0-3-1.34-3-3 0-2 3-5.4 3-5.4s3 3.4 3 5.4c0 1.66-1.34 3-3 3zm6.33-11H5.67l-.44-4h13.53l-.43 4z"/></g>
-<g id="local-florist"><path d="M12 22c4.97 0 9-4.03 9-9-4.97 0-9 4.03-9 9zM5.6 10.25c0 1.38 1.12 2.5 2.5 2.5.53 0 1.01-.16 1.42-.44l-.02.19c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5l-.02-.19c.4.28.89.44 1.42.44 1.38 0 2.5-1.12 2.5-2.5 0-1-.59-1.85-1.43-2.25.84-.4 1.43-1.25 1.43-2.25 0-1.38-1.12-2.5-2.5-2.5-.53 0-1.01.16-1.42.44l.02-.19C14.5 2.12 13.38 1 12 1S9.5 2.12 9.5 3.5l.02.19c-.4-.28-.89-.44-1.42-.44-1.38 0-2.5 1.12-2.5 2.5 0 1 .59 1.85 1.43 2.25-.84.4-1.43 1.25-1.43 2.25zM12 5.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5S9.5 9.38 9.5 8s1.12-2.5 2.5-2.5zM3 13c0 4.97 4.03 9 9 9 0-4.97-4.03-9-9-9z"/></g>
-<g id="local-gas-station"><path d="M19.77 7.23l.01-.01-3.72-3.72L15 4.56l2.11 2.11c-.94.36-1.61 1.26-1.61 2.33 0 1.38 1.12 2.5 2.5 2.5.36 0 .69-.08 1-.21v7.21c0 .55-.45 1-1 1s-1-.45-1-1V14c0-1.1-.9-2-2-2h-1V5c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v16h10v-7.5h1.5v5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V9c0-.69-.28-1.32-.73-1.77zM12 10H6V5h6v5zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
-<g id="local-grocery-store"><path d="M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z"/></g>
-<g id="local-hospital"><path d="M19 3H5c-1.1 0-1.99.9-1.99 2L3 19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 11h-4v4h-4v-4H6v-4h4V6h4v4h4v4z"/></g>
-<g id="local-hotel"><path d="M7 13c1.66 0 3-1.34 3-3S8.66 7 7 7s-3 1.34-3 3 1.34 3 3 3zm12-6h-8v7H3V5H1v15h2v-3h18v3h2v-9c0-2.21-1.79-4-4-4z"/></g>
-<g id="local-laundry-service"><path d="M9.17 16.83c1.56 1.56 4.1 1.56 5.66 0 1.56-1.56 1.56-4.1 0-5.66l-5.66 5.66zM18 2.01L6 2c-1.11 0-2 .89-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2V4c0-1.11-.89-1.99-2-1.99zM10 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM7 4c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm5 16c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/></g>
-<g id="local-library"><path d="M12 11.55C9.64 9.35 6.48 8 3 8v11c3.48 0 6.64 1.35 9 3.55 2.36-2.19 5.52-3.55 9-3.55V8c-3.48 0-6.64 1.35-9 3.55zM12 8c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3z"/></g>
-<g id="local-mall"><path d="M19 6h-2c0-2.76-2.24-5-5-5S7 3.24 7 6H5c-1.1 0-1.99.9-1.99 2L3 20c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-7-3c1.66 0 3 1.34 3 3H9c0-1.66 1.34-3 3-3zm0 10c-2.76 0-5-2.24-5-5h2c0 1.66 1.34 3 3 3s3-1.34 3-3h2c0 2.76-2.24 5-5 5z"/></g>
-<g id="local-movies"><path d="M18 3v2h-2V3H8v2H6V3H4v18h2v-2h2v2h8v-2h2v2h2V3h-2zM8 17H6v-2h2v2zm0-4H6v-2h2v2zm0-4H6V7h2v2zm10 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V7h2v2z"/></g>
-<g id="local-offer"><path d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/></g>
-<g id="local-parking"><path d="M13 3H6v18h4v-6h3c3.31 0 6-2.69 6-6s-2.69-6-6-6zm.2 8H10V7h3.2c1.1 0 2 .9 2 2s-.9 2-2 2z"/></g>
-<g id="local-pharmacy"><path d="M21 5h-2.64l1.14-3.14L17.15 1l-1.46 4H3v2l2 6-2 6v2h18v-2l-2-6 2-6V5zm-5 9h-3v3h-2v-3H8v-2h3V9h2v3h3v2z"/></g>
-<g id="local-phone"><path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/></g>
-<g id="local-pizza"><path d="M12 2C8.43 2 5.23 3.54 3.01 6L12 22l8.99-16C18.78 3.55 15.57 2 12 2zM7 7c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm5 8c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-<g id="local-play"><path d="M20 12c0-1.1.9-2 2-2V6c0-1.1-.9-2-2-2H4c-1.1 0-1.99.9-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2zm-4.42 4.8L12 14.5l-3.58 2.3 1.08-4.12-3.29-2.69 4.24-.25L12 5.8l1.54 3.95 4.24.25-3.29 2.69 1.09 4.11z"/></g>
-<g id="local-post-office"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></g>
-<g id="local-printshop"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></g>
-<g id="local-see"><circle cx="12" cy="12" r="3.2"/><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/></g>
-<g id="local-shipping"><path d="M20 8h-3V4H3c-1.1 0-2 .9-2 2v11h2c0 1.66 1.34 3 3 3s3-1.34 3-3h6c0 1.66 1.34 3 3 3s3-1.34 3-3h2v-5l-3-4zM6 18.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm13.5-9l1.96 2.5H17V9.5h2.5zm-1.5 9c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="local-taxi"><path d="M18.92 6.01C18.72 5.42 18.16 5 17.5 5H15V3H9v2H6.5c-.66 0-1.21.42-1.42 1.01L3 12v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 16c-.83 0-1.5-.67-1.5-1.5S5.67 13 6.5 13s1.5.67 1.5 1.5S7.33 16 6.5 16zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 11l1.5-4.5h11L19 11H5z"/></g>
-<g id="map"><path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM15 19l-6-2.11V5l6 2.11V19z"/></g>
-<g id="my-location"><path d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm8.94 3c-.46-4.17-3.77-7.48-7.94-7.94V1h-2v2.06C6.83 3.52 3.52 6.83 3.06 11H1v2h2.06c.46 4.17 3.77 7.48 7.94 7.94V23h2v-2.06c4.17-.46 7.48-3.77 7.94-7.94H23v-2h-2.06zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"/></g>
-<g id="navigation"><path d="M12 2L4.5 20.29l.71.71L12 18l6.79 3 .71-.71z"/></g>
-<g id="near-me"><path d="M21 3L3 10.53v.98l6.84 2.65L12.48 21h.98L21 3z"/></g>
-<g id="person-pin"><path d="M19 2H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h4l3 3 3-3h4c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 3.3c1.49 0 2.7 1.21 2.7 2.7 0 1.49-1.21 2.7-2.7 2.7-1.49 0-2.7-1.21-2.7-2.7 0-1.49 1.21-2.7 2.7-2.7zM18 16H6v-.9c0-2 4-3.1 6-3.1s6 1.1 6 3.1v.9z"/></g>
-<g id="person-pin-circle"><path d="M12 2C8.14 2 5 5.14 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7zm0 2c1.1 0 2 .9 2 2 0 1.11-.9 2-2 2s-2-.89-2-2c0-1.1.9-2 2-2zm0 10c-1.67 0-3.14-.85-4-2.15.02-1.32 2.67-2.05 4-2.05s3.98.73 4 2.05c-.86 1.3-2.33 2.15-4 2.15z"/></g>
-<g id="pin-drop"><path d="M18 8c0-3.31-2.69-6-6-6S6 4.69 6 8c0 4.5 6 11 6 11s6-6.5 6-11zm-8 0c0-1.1.9-2 2-2s2 .9 2 2-.89 2-2 2c-1.1 0-2-.9-2-2zM5 20v2h14v-2H5z"/></g>
-<g id="place"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"/></g>
-<g id="rate-review"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM6 14v-2.47l6.88-6.88c.2-.2.51-.2.71 0l1.77 1.77c.2.2.2.51 0 .71L8.47 14H6zm12 0h-7.5l2-2H18v2z"/></g>
-<g id="restaurant"><path d="M11 9H9V2H7v7H5V2H3v7c0 2.12 1.66 3.84 3.75 3.97V22h2.5v-9.03C11.34 12.84 13 11.12 13 9V2h-2v7zm5-3v8h2.5v8H21V2c-2.76 0-5 2.24-5 4z"/></g>
-<g id="restaurant-menu"><path d="M8.1 13.34l2.83-2.83L3.91 3.5c-1.56 1.56-1.56 4.09 0 5.66l4.19 4.18zm6.78-1.81c1.53.71 3.68.21 5.27-1.38 1.91-1.91 2.28-4.65.81-6.12-1.46-1.46-4.2-1.1-6.12.81-1.59 1.59-2.09 3.74-1.38 5.27L3.7 19.87l1.41 1.41L12 14.41l6.88 6.88 1.41-1.41L13.41 13l1.47-1.47z"/></g>
-<g id="satellite"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5 4.99h3C8 6.65 6.66 8 5 8V4.99zM5 12v-2c2.76 0 5-2.25 5-5.01h2C12 8.86 8.87 12 5 12zm0 6l3.5-4.5 2.5 3.01L14.5 12l4.5 6H5z"/></g>
-<g id="store-mall-directory"><path d="M20 4H4v2h16V4zm1 10v-2l-1-5H4l-1 5v2h1v6h10v-6h4v6h2v-6h1zm-9 4H6v-4h6v4z"/></g>
-<g id="streetview"><path d="M12.56 14.33c-.34.27-.56.7-.56 1.17V21h7c1.1 0 2-.9 2-2v-5.98c-.94-.33-1.95-.52-3-.52-2.03 0-3.93.7-5.44 1.83z"/><circle cx="18" cy="6" r="5"/><path d="M11.5 6c0-1.08.27-2.1.74-3H5c-1.1 0-2 .9-2 2v14c0 .55.23 1.05.59 1.41l9.82-9.82C12.23 9.42 11.5 7.8 11.5 6z"/></g>
-<g id="subway"><circle cx="15.5" cy="16" r="1"/><circle cx="8.5" cy="16" r="1"/><path d="M7.01 9h10v5h-10zM17.8 2.8C16 2.09 13.86 2 12 2c-1.86 0-4 .09-5.8.8C3.53 3.84 2 6.05 2 8.86V22h20V8.86c0-2.81-1.53-5.02-4.2-6.06zm.2 13.08c0 1.45-1.18 2.62-2.63 2.62l1.13 1.12V20H15l-1.5-1.5h-2.83L9.17 20H7.5v-.38l1.12-1.12C7.18 18.5 6 17.32 6 15.88V9c0-2.63 3-3 6-3 3.32 0 6 .38 6 3v6.88z"/></g>
-<g id="terrain"><path d="M14 6l-3.75 5 2.85 3.8-1.6 1.2C9.81 13.75 7 10 7 10l-6 8h22L14 6z"/></g>
-<g id="traffic"><path d="M20 10h-3V8.86c1.72-.45 3-2 3-3.86h-3V4c0-.55-.45-1-1-1H8c-.55 0-1 .45-1 1v1H4c0 1.86 1.28 3.41 3 3.86V10H4c0 1.86 1.28 3.41 3 3.86V15H4c0 1.86 1.28 3.41 3 3.86V20c0 .55.45 1 1 1h8c.55 0 1-.45 1-1v-1.14c1.72-.45 3-2 3-3.86h-3v-1.14c1.72-.45 3-2 3-3.86zm-8 9c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2s.89-2 2-2c1.1 0 2 .9 2 2s-.89 2-2 2zm0-5c-1.11 0-2-.9-2-2 0-1.11.89-2 2-2 1.1 0 2 .89 2 2 0 1.1-.89 2-2 2z"/></g>
-<g id="train"><path d="M12 2c-4 0-8 .5-8 4v9.5C4 17.43 5.57 19 7.5 19L6 20.5v.5h2.23l2-2H14l2 2h2v-.5L16.5 19c1.93 0 3.5-1.57 3.5-3.5V6c0-3.5-3.58-4-8-4zM7.5 17c-.83 0-1.5-.67-1.5-1.5S6.67 14 7.5 14s1.5.67 1.5 1.5S8.33 17 7.5 17zm3.5-7H6V6h5v4zm2 0V6h5v4h-5zm3.5 7c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="tram"><path d="M19 16.94V8.5c0-2.79-2.61-3.4-6.01-3.49l.76-1.51H17V2H7v1.5h4.75l-.76 1.52C7.86 5.11 5 5.73 5 8.5v8.44c0 1.45 1.19 2.66 2.59 2.97L6 21.5v.5h2.23l2-2H14l2 2h2v-.5L16.5 20h-.08c1.69 0 2.58-1.37 2.58-3.06zm-7 1.56c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5-4.5H7V9h10v5z"/></g>
-<g id="transfer-within-a-station"><path d="M16.49 15.5v-1.75L14 16.25l2.49 2.5V17H22v-1.5zm3.02 4.25H14v1.5h5.51V23L22 20.5 19.51 18zM9.5 5.5c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zM5.75 8.9L3 23h2.1l1.75-8L9 17v6h2v-7.55L8.95 13.4l.6-3C10.85 12 12.8 13 15 13v-2c-1.85 0-3.45-1-4.35-2.45l-.95-1.6C9.35 6.35 8.7 6 8 6c-.25 0-.5.05-.75.15L2 8.3V13h2V9.65l1.75-.75"/></g>
-<g id="zoom-out-map"><path d="M15 3l2.3 2.3-2.89 2.87 1.42 1.42L18.7 6.7 21 9V3zM3 9l2.3-2.3 2.87 2.89 1.42-1.42L6.7 5.3 9 3H3zm6 12l-2.3-2.3 2.89-2.87-1.42-1.42L5.3 17.3 3 15v6zm12-6l-2.3 2.3-2.87-2.89-1.42 1.42 2.89 2.87L15 21h6z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/notification-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/notification-icons.html
deleted file mode 100644
index 272b95b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/notification-icons.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="notification" size="24">
-<svg><defs>
-<g id="adb"><path d="M5 16c0 3.87 3.13 7 7 7s7-3.13 7-7v-4H5v4zM16.12 4.37l2.1-2.1-.82-.83-2.3 2.31C14.16 3.28 13.12 3 12 3s-2.16.28-3.09.75L6.6 1.44l-.82.83 2.1 2.1C6.14 5.64 5 7.68 5 10v1h14v-1c0-2.32-1.14-4.36-2.88-5.63zM9 9c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm6 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z"/></g>
-<g id="airline-seat-flat"><path d="M22 11v2H9V7h9c2.21 0 4 1.79 4 4zM2 14v2h6v2h8v-2h6v-2H2zm5.14-1.9c1.16-1.19 1.14-3.08-.04-4.24-1.19-1.16-3.08-1.14-4.24.04-1.16 1.19-1.14 3.08.04 4.24 1.19 1.16 3.08 1.14 4.24-.04z"/></g>
-<g id="airline-seat-flat-angled"><path d="M22.25 14.29l-.69 1.89L9.2 11.71l2.08-5.66 8.56 3.09c2.1.76 3.18 3.06 2.41 5.15zM1.5 12.14L8 14.48V19h8v-1.63L20.52 19l.69-1.89-19.02-6.86-.69 1.89zm5.8-1.94c1.49-.72 2.12-2.51 1.41-4C7.99 4.71 6.2 4.08 4.7 4.8c-1.49.71-2.12 2.5-1.4 4 .71 1.49 2.5 2.12 4 1.4z"/></g>
-<g id="airline-seat-individual-suite"><path d="M7 13c1.65 0 3-1.35 3-3S8.65 7 7 7s-3 1.35-3 3 1.35 3 3 3zm12-6h-8v7H3V7H1v10h22v-6c0-2.21-1.79-4-4-4z"/></g>
-<g id="airline-seat-legroom-extra"><path d="M4 12V3H2v9c0 2.76 2.24 5 5 5h6v-2H7c-1.66 0-3-1.34-3-3zm18.83 5.24c-.38-.72-1.29-.97-2.03-.63l-1.09.5-3.41-6.98c-.34-.68-1.03-1.12-1.79-1.12L11 9V3H5v8c0 1.66 1.34 3 3 3h7l3.41 7 3.72-1.7c.77-.36 1.1-1.3.7-2.06z"/></g>
-<g id="airline-seat-legroom-normal"><path d="M5 12V3H3v9c0 2.76 2.24 5 5 5h6v-2H8c-1.66 0-3-1.34-3-3zm15.5 6H19v-7c0-1.1-.9-2-2-2h-5V3H6v8c0 1.65 1.35 3 3 3h7v7h4.5c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5z"/></g>
-<g id="airline-seat-legroom-reduced"><path d="M19.97 19.2c.18.96-.55 1.8-1.47 1.8H14v-3l1-4H9c-1.65 0-3-1.35-3-3V3h6v6h5c1.1 0 2 .9 2 2l-2 7h1.44c.73 0 1.39.49 1.53 1.2zM5 12V3H3v9c0 2.76 2.24 5 5 5h4v-2H8c-1.66 0-3-1.34-3-3z"/></g>
-<g id="airline-seat-recline-extra"><path d="M5.35 5.64c-.9-.64-1.12-1.88-.49-2.79.63-.9 1.88-1.12 2.79-.49.9.64 1.12 1.88.49 2.79-.64.9-1.88 1.12-2.79.49zM16 19H8.93c-1.48 0-2.74-1.08-2.96-2.54L4 7H2l1.99 9.76C4.37 19.2 6.47 21 8.94 21H16v-2zm.23-4h-4.88l-1.03-4.1c1.58.89 3.28 1.54 5.15 1.22V9.99c-1.63.31-3.44-.27-4.69-1.25L9.14 7.47c-.23-.18-.49-.3-.76-.38-.32-.09-.66-.12-.99-.06h-.02c-1.23.22-2.05 1.39-1.84 2.61l1.35 5.92C7.16 16.98 8.39 18 9.83 18h6.85l3.82 3 1.5-1.5-5.77-4.5z"/></g>
-<g id="airline-seat-recline-normal"><path d="M7.59 5.41c-.78-.78-.78-2.05 0-2.83.78-.78 2.05-.78 2.83 0 .78.78.78 2.05 0 2.83-.79.79-2.05.79-2.83 0zM6 16V7H4v9c0 2.76 2.24 5 5 5h6v-2H9c-1.66 0-3-1.34-3-3zm14 4.07L14.93 15H11.5v-3.68c1.4 1.15 3.6 2.16 5.5 2.16v-2.16c-1.66.02-3.61-.87-4.67-2.04l-1.4-1.55c-.19-.21-.43-.38-.69-.5-.29-.14-.62-.23-.96-.23h-.03C8.01 7 7 8.01 7 9.25V15c0 1.66 1.34 3 3 3h5.07l3.5 3.5L20 20.07z"/></g>
-<g id="bluetooth-audio"><path d="M14.24 12.01l2.32 2.32c.28-.72.44-1.51.44-2.33 0-.82-.16-1.59-.43-2.31l-2.33 2.32zm5.29-5.3l-1.26 1.26c.63 1.21.98 2.57.98 4.02s-.36 2.82-.98 4.02l1.2 1.2c.97-1.54 1.54-3.36 1.54-5.31-.01-1.89-.55-3.67-1.48-5.19zm-3.82 1L10 2H9v7.59L4.41 5 3 6.41 8.59 12 3 17.59 4.41 19 9 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM11 5.83l1.88 1.88L11 9.59V5.83zm1.88 10.46L11 18.17v-3.76l1.88 1.88z"/></g>
-<g id="confirmation-number"><path d="M22 10V6c0-1.11-.9-2-2-2H4c-1.1 0-1.99.89-1.99 2v4c1.1 0 1.99.9 1.99 2s-.89 2-2 2v4c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-4c-1.1 0-2-.9-2-2s.9-2 2-2zm-9 7.5h-2v-2h2v2zm0-4.5h-2v-2h2v2zm0-4.5h-2v-2h2v2z"/></g>
-<g id="disc-full"><path d="M20 16h2v-2h-2v2zm0-9v5h2V7h-2zM10 4c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm0 10c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z"/></g>
-<g id="do-not-disturb"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8 0-1.85.63-3.55 1.69-4.9L16.9 18.31C15.55 19.37 13.85 20 12 20zm6.31-3.1L7.1 5.69C8.45 4.63 10.15 4 12 4c4.42 0 8 3.58 8 8 0 1.85-.63 3.55-1.69 4.9z"/></g>
-<g id="do-not-disturb-alt"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zM4 12c0-4.4 3.6-8 8-8 1.8 0 3.5.6 4.9 1.7L5.7 16.9C4.6 15.5 4 13.8 4 12zm8 8c-1.8 0-3.5-.6-4.9-1.7L18.3 7.1C19.4 8.5 20 10.2 20 12c0 4.4-3.6 8-8 8z"/></g>
-<g id="do-not-disturb-off"><path d="M17 11v2h-1.46l4.68 4.68C21.34 16.07 22 14.11 22 12c0-5.52-4.48-10-10-10-2.11 0-4.07.66-5.68 1.78L13.54 11H17zM2.27 2.27L1 3.54l2.78 2.78C2.66 7.93 2 9.89 2 12c0 5.52 4.48 10 10 10 2.11 0 4.07-.66 5.68-1.78L20.46 23l1.27-1.27L11 11 2.27 2.27zM7 13v-2h1.46l2 2H7z"/></g>
-<g id="do-not-disturb-on"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11H7v-2h10v2z"/></g>
-<g id="drive-eta"><path d="M18.92 5.01C18.72 4.42 18.16 4 17.5 4h-11c-.66 0-1.21.42-1.42 1.01L3 11v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 15c-.83 0-1.5-.67-1.5-1.5S5.67 12 6.5 12s1.5.67 1.5 1.5S7.33 15 6.5 15zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 10l1.5-4.5h11L19 10H5z"/></g>
-<g id="enhanced-encryption"><path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H8.9V6zM16 16h-3v3h-2v-3H8v-2h3v-3h2v3h3v2z"/></g>
-<g id="event-available"><path d="M16.53 11.06L15.47 10l-4.88 4.88-2.12-2.12-1.06 1.06L10.59 17l5.94-5.94zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"/></g>
-<g id="event-busy"><path d="M9.31 17l2.44-2.44L14.19 17l1.06-1.06-2.44-2.44 2.44-2.44L14.19 10l-2.44 2.44L9.31 10l-1.06 1.06 2.44 2.44-2.44 2.44L9.31 17zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"/></g>
-<g id="event-note"><path d="M17 10H7v2h10v-2zm2-7h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zm-5-5H7v2h7v-2z"/></g>
-<g id="folder-special"><path d="M20 6h-8l-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm-2.06 11L15 15.28 12.06 17l.78-3.33-2.59-2.24 3.41-.29L15 8l1.34 3.14 3.41.29-2.59 2.24.78 3.33z"/></g>
-<g id="live-tv"><path d="M21 6h-7.59l3.29-3.29L16 2l-4 4-4-4-.71.71L10.59 6H3c-1.1 0-2 .89-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V8c0-1.11-.9-2-2-2zm0 14H3V8h18v12zM9 10v8l7-4z"/></g>
-<g id="mms"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM5 14l3.5-4.5 2.5 3.01L14.5 8l4.5 6H5z"/></g>
-<g id="more"><path d="M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.11c.36.53.97.89 1.66.89H22c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 13.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm5 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"/></g>
-<g id="network-check"><path d="M15.9 5c-.17 0-.32.09-.41.23l-.07.15-5.18 11.65c-.16.29-.26.61-.26.96 0 1.11.9 2.01 2.01 2.01.96 0 1.77-.68 1.96-1.59l.01-.03L16.4 5.5c0-.28-.22-.5-.5-.5zM1 9l2 2c2.88-2.88 6.79-4.08 10.53-3.62l1.19-2.68C9.89 3.84 4.74 5.27 1 9zm20 2l2-2c-1.64-1.64-3.55-2.82-5.59-3.57l-.53 2.82c1.5.62 2.9 1.53 4.12 2.75zm-4 4l2-2c-.8-.8-1.7-1.42-2.66-1.89l-.55 2.92c.42.27.83.59 1.21.97zM5 13l2 2c1.13-1.13 2.56-1.79 4.03-2l1.28-2.88c-2.63-.08-5.3.87-7.31 2.88z"/></g>
-<g id="network-locked"><path d="M19.5 10c.17 0 .33.03.5.05V1L1 20h13v-3c0-.89.39-1.68 1-2.23v-.27c0-2.48 2.02-4.5 4.5-4.5zm2.5 6v-1.5c0-1.38-1.12-2.5-2.5-2.5S17 13.12 17 14.5V16c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1v-4c0-.55-.45-1-1-1zm-1 0h-3v-1.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V16z"/></g>
-<g id="no-encryption"><path d="M21 21.78L4.22 5 3 6.22l2.04 2.04C4.42 8.6 4 9.25 4 10v10c0 1.1.9 2 2 2h12c.23 0 .45-.05.66-.12L19.78 23 21 21.78zM8.9 6c0-1.71 1.39-3.1 3.1-3.1s3.1 1.39 3.1 3.1v2H9.66L20 18.34V10c0-1.1-.9-2-2-2h-1V6c0-2.76-2.24-5-5-5-2.56 0-4.64 1.93-4.94 4.4L8.9 7.24V6z"/></g>
-<g id="ondemand-video"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-6l-7 4V7z"/></g>
-<g id="personal-video"><path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12z"/></g>
-<g id="phone-bluetooth-speaker"><path d="M14.71 9.5L17 7.21V11h.5l2.85-2.85L18.21 6l2.15-2.15L17.5 1H17v3.79L14.71 2.5l-.71.71L16.79 6 14 8.79l.71.71zM18 2.91l.94.94-.94.94V2.91zm0 4.3l.94.94-.94.94V7.21zm2 8.29c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z"/></g>
-<g id="phone-forwarded"><path d="M18 11l5-5-5-5v3h-4v4h4v3zm2 4.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1z"/></g>
-<g id="phone-in-talk"><path d="M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 12h2c0-4.97-4.03-9-9-9v2c3.87 0 7 3.13 7 7zm-4 0h2c0-2.76-2.24-5-5-5v2c1.66 0 3 1.34 3 3z"/></g>
-<g id="phone-locked"><path d="M20 15.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM20 4v-.5C20 2.12 18.88 1 17.5 1S15 2.12 15 3.5V4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1V5c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7V4z"/></g>
-<g id="phone-missed"><path d="M6.5 5.5L12 11l7-7-1-1-6 6-4.5-4.5H11V3H5v6h1.5V5.5zm17.21 11.17C20.66 13.78 16.54 12 12 12 7.46 12 3.34 13.78.29 16.67c-.18.18-.29.43-.29.71s.11.53.29.71l2.48 2.48c.18.18.43.29.71.29.27 0 .52-.11.7-.28.79-.74 1.69-1.36 2.66-1.85.33-.16.56-.5.56-.9v-3.1c1.45-.48 3-.73 4.6-.73 1.6 0 3.15.25 4.6.72v3.1c0 .39.23.74.56.9.98.49 1.87 1.12 2.67 1.85.18.18.43.28.7.28.28 0 .53-.11.71-.29l2.48-2.48c.18-.18.29-.43.29-.71s-.12-.52-.3-.7z"/></g>
-<g id="phone-paused"><path d="M17 3h-2v7h2V3zm3 12.5c-1.25 0-2.45-.2-3.57-.57-.35-.11-.74-.03-1.02.24l-2.2 2.2c-2.83-1.44-5.15-3.75-6.59-6.59l2.2-2.21c.28-.26.36-.65.25-1C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.5c0-.55-.45-1-1-1zM19 3v7h2V3h-2z"/></g>
-<g id="power"><path d="M16.01 7L16 3h-2v4h-4V3H8v4h-.01C7 6.99 6 7.99 6 8.99v5.49L9.5 18v3h5v-3l3.5-3.51v-5.5c0-1-1-2-1.99-1.99z"/></g>
-<g id="priority-high"><circle cx="12" cy="19" r="2"/><path d="M10 3h4v12h-4z"/></g>
-<g id="rv-hookup"><path d="M20 17v-6c0-1.1-.9-2-2-2H7V7l-3 3 3 3v-2h4v3H4v3c0 1.1.9 2 2 2h2c0 1.66 1.34 3 3 3s3-1.34 3-3h8v-2h-2zm-9 3c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm7-6h-4v-3h4v3zM17 2v2H9v2h8v2l3-3z"/></g>
-<g id="sd-card"><path d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-6 6h-2V4h2v4zm3 0h-2V4h2v4zm3 0h-2V4h2v4z"/></g>
-<g id="sim-card-alert"><path d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5 15h-2v-2h2v2zm0-4h-2V8h2v5z"/></g>
-<g id="sms"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM9 11H7V9h2v2zm4 0h-2V9h2v2zm4 0h-2V9h2v2z"/></g>
-<g id="sms-failed"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 12h-2v-2h2v2zm0-4h-2V6h2v4z"/></g>
-<g id="sync"><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></g>
-<g id="sync-disabled"><path d="M10 6.35V4.26c-.8.21-1.55.54-2.23.96l1.46 1.46c.25-.12.5-.24.77-.33zm-7.14-.94l2.36 2.36C4.45 8.99 4 10.44 4 12c0 2.21.91 4.2 2.36 5.64L4 20h6v-6l-2.24 2.24C6.68 15.15 6 13.66 6 12c0-1 .25-1.94.68-2.77l8.08 8.08c-.25.13-.5.25-.77.34v2.09c.8-.21 1.55-.54 2.23-.96l2.36 2.36 1.27-1.27L4.14 4.14 2.86 5.41zM20 4h-6v6l2.24-2.24C17.32 8.85 18 10.34 18 12c0 1-.25 1.94-.68 2.77l1.46 1.46C19.55 15.01 20 13.56 20 12c0-2.21-.91-4.2-2.36-5.64L20 4z"/></g>
-<g id="sync-problem"><path d="M3 12c0 2.21.91 4.2 2.36 5.64L3 20h6v-6l-2.24 2.24C5.68 15.15 5 13.66 5 12c0-2.61 1.67-4.83 4-5.65V4.26C5.55 5.15 3 8.27 3 12zm8 5h2v-2h-2v2zM21 4h-6v6l2.24-2.24C18.32 8.85 19 10.34 19 12c0 2.61-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74 0-2.21-.91-4.2-2.36-5.64L21 4zm-10 9h2V7h-2v6z"/></g>
-<g id="system-update"><path d="M17 1.01L7 1c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99zM17 19H7V5h10v14zm-1-6h-3V8h-2v5H8l4 4 4-4z"/></g>
-<g id="tap-and-play"><path d="M2 16v2c2.76 0 5 2.24 5 5h2c0-3.87-3.13-7-7-7zm0 4v3h3c0-1.66-1.34-3-3-3zm0-8v2c4.97 0 9 4.03 9 9h2c0-6.08-4.92-11-11-11zM17 1.01L7 1c-1.1 0-2 .9-2 2v7.37c.69.16 1.36.37 2 .64V5h10v13h-3.03c.52 1.25.84 2.59.95 4H17c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99z"/></g>
-<g id="time-to-leave"><path d="M18.92 5.01C18.72 4.42 18.16 4 17.5 4h-11c-.66 0-1.21.42-1.42 1.01L3 11v8c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-1h12v1c0 .55.45 1 1 1h1c.55 0 1-.45 1-1v-8l-2.08-5.99zM6.5 15c-.83 0-1.5-.67-1.5-1.5S5.67 12 6.5 12s1.5.67 1.5 1.5S7.33 15 6.5 15zm11 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM5 10l1.5-4.5h11L19 10H5z"/></g>
-<g id="vibration"><path d="M0 15h2V9H0v6zm3 2h2V7H3v10zm19-8v6h2V9h-2zm-3 8h2V7h-2v10zM16.5 3h-9C6.67 3 6 3.67 6 4.5v15c0 .83.67 1.5 1.5 1.5h9c.83 0 1.5-.67 1.5-1.5v-15c0-.83-.67-1.5-1.5-1.5zM16 19H8V5h8v14z"/></g>
-<g id="voice-chat"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12l-4-3.2V14H6V6h8v3.2L18 6v8z"/></g>
-<g id="vpn-lock"><path d="M22 4v-.5C22 2.12 20.88 1 19.5 1S17 2.12 17 3.5V4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h5c.55 0 1-.45 1-1V5c0-.55-.45-1-1-1zm-.8 0h-3.4v-.5c0-.94.76-1.7 1.7-1.7s1.7.76 1.7 1.7V4zm-2.28 8c.04.33.08.66.08 1 0 2.08-.8 3.97-2.1 5.39-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H7v-2h2c.55 0 1-.45 1-1V8h2c1.1 0 2-.9 2-2V3.46c-.95-.3-1.95-.46-3-.46C5.48 3 1 7.48 1 13s4.48 10 10 10 10-4.48 10-10c0-.34-.02-.67-.05-1h-2.03zM10 20.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L8 16v1c0 1.1.9 2 2 2v1.93z"/></g>
-<g id="wc"><path d="M5.5 22v-7.5H4V9c0-1.1.9-2 2-2h3c1.1 0 2 .9 2 2v5.5H9.5V22h-4zM18 22v-6h3l-2.54-7.63C18.18 7.55 17.42 7 16.56 7h-.12c-.86 0-1.63.55-1.9 1.37L12 16h3v6h3zM7.5 6c1.11 0 2-.89 2-2s-.89-2-2-2-2 .89-2 2 .89 2 2 2zm9 0c1.11 0 2-.89 2-2s-.89-2-2-2-2 .89-2 2 .89 2 2 2z"/></g>
-<g id="wifi"><path d="M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/places-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/places-icons.html
deleted file mode 100644
index fa4827b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/places-icons.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="places" size="24">
-<svg><defs>
-<g id="ac-unit"><path d="M22 11h-4.17l3.24-3.24-1.41-1.42L15 11h-2V9l4.66-4.66-1.42-1.41L13 6.17V2h-2v4.17L7.76 2.93 6.34 4.34 11 9v2H9L4.34 6.34 2.93 7.76 6.17 11H2v2h4.17l-3.24 3.24 1.41 1.42L9 13h2v2l-4.66 4.66 1.42 1.41L11 17.83V22h2v-4.17l3.24 3.24 1.42-1.41L13 15v-2h2l4.66 4.66 1.41-1.42L17.83 13H22z"/></g>
-<g id="airport-shuttle"><path d="M17 5H3c-1.1 0-2 .89-2 2v9h2c0 1.65 1.34 3 3 3s3-1.35 3-3h5.5c0 1.65 1.34 3 3 3s3-1.35 3-3H23v-5l-6-6zM3 11V7h4v4H3zm3 6.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7-6.5H9V7h4v4zm4.5 6.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM15 11V7h1l4 4h-5z"/></g>
-<g id="all-inclusive"><path d="M18.6 6.62c-1.44 0-2.8.56-3.77 1.53L12 10.66 10.48 12h.01L7.8 14.39c-.64.64-1.49.99-2.4.99-1.87 0-3.39-1.51-3.39-3.38S3.53 8.62 5.4 8.62c.91 0 1.76.35 2.44 1.03l1.13 1 1.51-1.34L9.22 8.2C8.2 7.18 6.84 6.62 5.4 6.62 2.42 6.62 0 9.04 0 12s2.42 5.38 5.4 5.38c1.44 0 2.8-.56 3.77-1.53l2.83-2.5.01.01L13.52 12h-.01l2.69-2.39c.64-.64 1.49-.99 2.4-.99 1.87 0 3.39 1.51 3.39 3.38s-1.52 3.38-3.39 3.38c-.9 0-1.76-.35-2.44-1.03l-1.14-1.01-1.51 1.34 1.27 1.12c1.02 1.01 2.37 1.57 3.82 1.57 2.98 0 5.4-2.41 5.4-5.38s-2.42-5.37-5.4-5.37z"/></g>
-<g id="beach-access"><path d="M13.127 14.56l1.43-1.43 6.44 6.443L19.57 21zm4.293-5.73l2.86-2.86c-3.95-3.95-10.35-3.96-14.3-.02 3.93-1.3 8.31-.25 11.44 2.88zM5.95 5.98c-3.94 3.95-3.93 10.35.02 14.3l2.86-2.86C5.7 14.29 4.65 9.91 5.95 5.98zm.02-.02l-.01.01c-.38 3.01 1.17 6.88 4.3 10.02l5.73-5.73c-3.13-3.13-7.01-4.68-10.02-4.3z"/></g>
-<g id="business-center"><path d="M10 16v-1H3.01L3 19c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2v-4h-7v1h-4zm10-9h-4.01V5l-2-2h-4l-2 2v2H4c-1.1 0-2 .9-2 2v3c0 1.11.89 2 2 2h6v-2h4v2h6c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm-6 0h-4V5h4v2z"/></g>
-<g id="casino"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM7.5 18c-.83 0-1.5-.67-1.5-1.5S6.67 15 7.5 15s1.5.67 1.5 1.5S8.33 18 7.5 18zm0-9C6.67 9 6 8.33 6 7.5S6.67 6 7.5 6 9 6.67 9 7.5 8.33 9 7.5 9zm4.5 4.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm4.5 4.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm0-9c-.83 0-1.5-.67-1.5-1.5S15.67 6 16.5 6s1.5.67 1.5 1.5S17.33 9 16.5 9z"/></g>
-<g id="child-care"><circle cx="14.5" cy="10.5" r="1.25"/><circle cx="9.5" cy="10.5" r="1.25"/><path d="M22.94 12.66c.04-.21.06-.43.06-.66s-.02-.45-.06-.66c-.25-1.51-1.36-2.74-2.81-3.17-.53-1.12-1.28-2.1-2.19-2.91C16.36 3.85 14.28 3 12 3s-4.36.85-5.94 2.26c-.92.81-1.67 1.8-2.19 2.91-1.45.43-2.56 1.65-2.81 3.17-.04.21-.06.43-.06.66s.02.45.06.66c.25 1.51 1.36 2.74 2.81 3.17.52 1.11 1.27 2.09 2.17 2.89C7.62 20.14 9.71 21 12 21s4.38-.86 5.97-2.28c.9-.8 1.65-1.79 2.17-2.89 1.44-.43 2.55-1.65 2.8-3.17zM19 14c-.1 0-.19-.02-.29-.03-.2.67-.49 1.29-.86 1.86C16.6 17.74 14.45 19 12 19s-4.6-1.26-5.85-3.17c-.37-.57-.66-1.19-.86-1.86-.1.01-.19.03-.29.03-1.1 0-2-.9-2-2s.9-2 2-2c.1 0 .19.02.29.03.2-.67.49-1.29.86-1.86C7.4 6.26 9.55 5 12 5s4.6 1.26 5.85 3.17c.37.57.66 1.19.86 1.86.1-.01.19-.03.29-.03 1.1 0 2 .9 2 2s-.9 2-2 2zM7.5 14c.76 1.77 2.49 3 4.5 3s3.74-1.23 4.5-3h-9z"/></g>
-<g id="child-friendly"><path d="M13 2v8h8c0-4.42-3.58-8-8-8zm6.32 13.89C20.37 14.54 21 12.84 21 11H6.44l-.95-2H2v2h2.22s1.89 4.07 2.12 4.42c-1.1.59-1.84 1.75-1.84 3.08C4.5 20.43 6.07 22 8 22c1.76 0 3.22-1.3 3.46-3h2.08c.24 1.7 1.7 3 3.46 3 1.93 0 3.5-1.57 3.5-3.5 0-1.04-.46-1.97-1.18-2.61zM8 20c-.83 0-1.5-.67-1.5-1.5S7.17 17 8 17s1.5.67 1.5 1.5S8.83 20 8 20zm9 0c-.83 0-1.5-.67-1.5-1.5S16.17 17 17 17s1.5.67 1.5 1.5S17.83 20 17 20z"/></g>
-<g id="fitness-center"><path d="M20.57 14.86L22 13.43 20.57 12 17 15.57 8.43 7 12 3.43 10.57 2 9.14 3.43 7.71 2 5.57 4.14 4.14 2.71 2.71 4.14l1.43 1.43L2 7.71l1.43 1.43L2 10.57 3.43 12 7 8.43 15.57 17 12 20.57 13.43 22l1.43-1.43L16.29 22l2.14-2.14 1.43 1.43 1.43-1.43-1.43-1.43L22 16.29z"/></g>
-<g id="free-breakfast"><path d="M20 3H4v10c0 2.21 1.79 4 4 4h6c2.21 0 4-1.79 4-4v-3h2c1.11 0 2-.9 2-2V5c0-1.11-.89-2-2-2zm0 5h-2V5h2v3zM4 19h16v2H4z"/></g>
-<g id="golf-course"><circle cx="19.5" cy="19.5" r="1.5"/><path d="M17 5.92L9 2v18H7v-1.73c-1.79.35-3 .99-3 1.73 0 1.1 2.69 2 6 2s6-.9 6-2c0-.99-2.16-1.81-5-1.97V8.98l6-3.06z"/></g>
-<g id="hot-tub"><circle cx="7" cy="6" r="2"/><path d="M11.15 12c-.31-.22-.59-.46-.82-.72l-1.4-1.55c-.19-.21-.43-.38-.69-.5-.29-.14-.62-.23-.96-.23h-.03C6.01 9 5 10.01 5 11.25V12H2v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2v-8H11.15zM7 20H5v-6h2v6zm4 0H9v-6h2v6zm4 0h-2v-6h2v6zm4 0h-2v-6h2v6zm-.35-14.14l-.07-.07c-.57-.62-.82-1.41-.67-2.2L18 3h-1.89l-.06.43c-.2 1.36.27 2.71 1.3 3.72l.07.06c.57.62.82 1.41.67 2.2l-.11.59h1.91l.06-.43c.21-1.36-.27-2.71-1.3-3.71zm-4 0l-.07-.07c-.57-.62-.82-1.41-.67-2.2L14 3h-1.89l-.06.43c-.2 1.36.27 2.71 1.3 3.72l.07.06c.57.62.82 1.41.67 2.2l-.11.59h1.91l.06-.43c.21-1.36-.27-2.71-1.3-3.71z"/></g>
-<g id="kitchen"><path d="M18 2.01L6 2c-1.1 0-2 .89-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.11-.9-1.99-2-1.99zM18 20H6v-9.02h12V20zm0-11H6V4h12v5zM8 5h2v3H8zm0 7h2v5H8z"/></g>
-<g id="pool"><path d="M22 21c-1.11 0-1.73-.37-2.18-.64-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.46.27-1.07.64-2.18.64s-1.73-.37-2.18-.64c-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.46.27-1.08.64-2.19.64-1.11 0-1.73-.37-2.18-.64-.37-.23-.6-.36-1.15-.36s-.78.13-1.15.36c-.46.27-1.08.64-2.19.64v-2c.56 0 .78-.13 1.15-.36.46-.27 1.08-.64 2.19-.64s1.73.37 2.18.64c.37.23.59.36 1.15.36.56 0 .78-.13 1.15-.36.46-.27 1.08-.64 2.19-.64 1.11 0 1.73.37 2.18.64.37.22.6.36 1.15.36s.78-.13 1.15-.36c.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.23.59.36 1.15.36v2zm0-4.5c-1.11 0-1.73-.37-2.18-.64-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.45.27-1.07.64-2.18.64s-1.73-.37-2.18-.64c-.37-.22-.6-.36-1.15-.36-.56 0-.78.13-1.15.36-.45.27-1.07.64-2.18.64s-1.73-.37-2.18-.64c-.37-.22-.6-.36-1.15-.36s-.78.13-1.15.36c-.47.27-1.09.64-2.2.64v-2c.56 0 .78-.13 1.15-.36.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.22.6.36 1.15.36.56 0 .78-.13 1.15-.36.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.22.6.36 1.15.36s.78-.13 1.15-.36c.45-.27 1.07-.64 2.18-.64s1.73.37 2.18.64c.37.22.6.36 1.15.36v2zM8.67 12c.56 0 .78-.13 1.15-.36.46-.27 1.08-.64 2.19-.64 1.11 0 1.73.37 2.18.64.37.22.6.36 1.15.36s.78-.13 1.15-.36c.12-.07.26-.15.41-.23L10.48 5C8.93 3.45 7.5 2.99 5 3v2.5c1.82-.01 2.89.39 4 1.5l1 1-3.25 3.25c.31.12.56.27.77.39.37.23.59.36 1.15.36z"/><circle cx="16.5" cy="5.5" r="2.5"/></g>
-<g id="room-service"><path d="M2 17h20v2H2zm11.84-9.21c.1-.24.16-.51.16-.79 0-1.1-.9-2-2-2s-2 .9-2 2c0 .28.06.55.16.79C6.25 8.6 3.27 11.93 3 16h18c-.27-4.07-3.25-7.4-7.16-8.21z"/></g>
-<g id="rv-hookup"><path d="M20 17v-6c0-1.1-.9-2-2-2H7V7l-3 3 3 3v-2h4v3H4v3c0 1.1.9 2 2 2h2c0 1.66 1.34 3 3 3s3-1.34 3-3h8v-2h-2zm-9 3c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm7-6h-4v-3h4v3zM17 2v2H9v2h8v2l3-3z"/></g>
-<g id="smoke-free"><path d="M2 6l6.99 7H2v3h9.99l7 7 1.26-1.25-17-17zm18.5 7H22v3h-1.5zM18 13h1.5v3H18zm.85-8.12c.62-.61 1-1.45 1-2.38h-1.5c0 1.02-.83 1.85-1.85 1.85v1.5c2.24 0 4 1.83 4 4.07V12H22V9.92c0-2.23-1.28-4.15-3.15-5.04zM14.5 8.7h1.53c1.05 0 1.97.74 1.97 2.05V12h1.5v-1.59c0-1.8-1.6-3.16-3.47-3.16H14.5c-1.02 0-1.85-.98-1.85-2s.83-1.75 1.85-1.75V2c-1.85 0-3.35 1.5-3.35 3.35s1.5 3.35 3.35 3.35zm2.5 7.23V13h-2.93z"/></g>
-<g id="smoking-rooms"><path d="M2 16h15v3H2zm18.5 0H22v3h-1.5zM18 16h1.5v3H18zm.85-8.27c.62-.61 1-1.45 1-2.38C19.85 3.5 18.35 2 16.5 2v1.5c1.02 0 1.85.83 1.85 1.85S17.52 7.2 16.5 7.2v1.5c2.24 0 4 1.83 4 4.07V15H22v-2.24c0-2.22-1.28-4.14-3.15-5.03zm-2.82 2.47H14.5c-1.02 0-1.85-.98-1.85-2s.83-1.75 1.85-1.75v-1.5c-1.85 0-3.35 1.5-3.35 3.35s1.5 3.35 3.35 3.35h1.53c1.05 0 1.97.74 1.97 2.05V15h1.5v-1.64c0-1.81-1.6-3.16-3.47-3.16z"/></g>
-<g id="spa"><path d="M8.55 12c-1.07-.71-2.25-1.27-3.53-1.61 1.28.34 2.46.9 3.53 1.61zm10.43-1.61c-1.29.34-2.49.91-3.57 1.64 1.08-.73 2.28-1.3 3.57-1.64z"/><path d="M15.49 9.63c-.18-2.79-1.31-5.51-3.43-7.63-2.14 2.14-3.32 4.86-3.55 7.63 1.28.68 2.46 1.56 3.49 2.63 1.03-1.06 2.21-1.94 3.49-2.63zm-6.5 2.65c-.14-.1-.3-.19-.45-.29.15.11.31.19.45.29zm6.42-.25c-.13.09-.27.16-.4.26.13-.1.27-.17.4-.26zM12 15.45C9.85 12.17 6.18 10 2 10c0 5.32 3.36 9.82 8.03 11.49.63.23 1.29.4 1.97.51.68-.12 1.33-.29 1.97-.51C18.64 19.82 22 15.32 22 10c-4.18 0-7.85 2.17-10 5.45z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/social-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/social-icons.html
deleted file mode 100644
index a042473..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/social-icons.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-<iron-iconset-svg name="social" size="24">
-<svg><defs>
-<g id="cake"><path d="M12 6c1.11 0 2-.9 2-2 0-.38-.1-.73-.29-1.03L12 0l-1.71 2.97c-.19.3-.29.65-.29 1.03 0 1.1.9 2 2 2zm4.6 9.99l-1.07-1.07-1.08 1.07c-1.3 1.3-3.58 1.31-4.89 0l-1.07-1.07-1.09 1.07C6.75 16.64 5.88 17 4.96 17c-.73 0-1.4-.23-1.96-.61V21c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-4.61c-.56.38-1.23.61-1.96.61-.92 0-1.79-.36-2.44-1.01zM18 9h-5V7h-2v2H6c-1.66 0-3 1.34-3 3v1.54c0 1.08.88 1.96 1.96 1.96.52 0 1.02-.2 1.38-.57l2.14-2.13 2.13 2.13c.74.74 2.03.74 2.77 0l2.14-2.13 2.13 2.13c.37.37.86.57 1.38.57 1.08 0 1.96-.88 1.96-1.96V12C21 10.34 19.66 9 18 9z"/></g>
-<g id="domain"><path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"/></g>
-<g id="group"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></g>
-<g id="group-add"><path d="M8 10H5V7H3v3H0v2h3v3h2v-3h3v-2zm10 1c1.66 0 2.99-1.34 2.99-3S19.66 5 18 5c-.32 0-.63.05-.91.14.57.81.9 1.79.9 2.86s-.34 2.04-.9 2.86c.28.09.59.14.91.14zm-5 0c1.66 0 2.99-1.34 2.99-3S14.66 5 13 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm6.62 2.16c.83.73 1.38 1.66 1.38 2.84v2h3v-2c0-1.54-2.37-2.49-4.38-2.84zM13 13c-2 0-6 1-6 3v2h12v-2c0-2-4-3-6-3z"/></g>
-<g id="location-city"><path d="M15 11V5l-3-3-3 3v2H3v14h18V11h-6zm-8 8H5v-2h2v2zm0-4H5v-2h2v2zm0-4H5V9h2v2zm6 8h-2v-2h2v2zm0-4h-2v-2h2v2zm0-4h-2V9h2v2zm0-4h-2V5h2v2zm6 12h-2v-2h2v2zm0-4h-2v-2h2v2z"/></g>
-<g id="mood"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
-<g id="mood-bad"><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 3c-2.33 0-4.31 1.46-5.11 3.5h10.22c-.8-2.04-2.78-3.5-5.11-3.5z"/></g>
-<g id="notifications"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"/></g>
-<g id="notifications-active"><path d="M7.58 4.08L6.15 2.65C3.75 4.48 2.17 7.3 2.03 10.5h2c.15-2.65 1.51-4.97 3.55-6.42zm12.39 6.42h2c-.15-3.2-1.73-6.02-4.12-7.85l-1.42 1.43c2.02 1.45 3.39 3.77 3.54 6.42zM18 11c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2v-5zm-6 11c.14 0 .27-.01.4-.04.65-.14 1.18-.58 1.44-1.18.1-.24.15-.5.15-.78h-4c.01 1.1.9 2 2.01 2z"/></g>
-<g id="notifications-none"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"/></g>
-<g id="notifications-off"><path d="M20 18.69L7.84 6.14 5.27 3.49 4 4.76l2.8 2.8v.01c-.52.99-.8 2.16-.8 3.42v5l-2 2v1h13.73l2 2L21 19.72l-1-1.03zM12 22c1.11 0 2-.89 2-2h-4c0 1.11.89 2 2 2zm6-7.32V11c0-3.08-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68c-.15.03-.29.08-.42.12-.1.03-.2.07-.3.11h-.01c-.01 0-.01 0-.02.01-.23.09-.46.2-.68.31 0 0-.01 0-.01.01L18 14.68z"/></g>
-<g id="notifications-paused"><path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.93 6 11v5l-2 2v1h16v-1l-2-2zm-3.5-6.2l-2.8 3.4h2.8V15h-5v-1.8l2.8-3.4H9.5V8h5v1.8z"/></g>
-<g id="pages"><path d="M3 5v6h5L7 7l4 1V3H5c-1.1 0-2 .9-2 2zm5 8H3v6c0 1.1.9 2 2 2h6v-5l-4 1 1-4zm9 4l-4-1v5h6c1.1 0 2-.9 2-2v-6h-5l1 4zm2-14h-6v5l4-1-1 4h5V5c0-1.1-.9-2-2-2z"/></g>
-<g id="party-mode"><path d="M20 4h-3.17L15 2H9L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 3c1.63 0 3.06.79 3.98 2H12c-1.66 0-3 1.34-3 3 0 .35.07.69.18 1H7.1c-.06-.32-.1-.66-.1-1 0-2.76 2.24-5 5-5zm0 10c-1.63 0-3.06-.79-3.98-2H12c1.66 0 3-1.34 3-3 0-.35-.07-.69-.18-1h2.08c.07.32.1.66.1 1 0 2.76-2.24 5-5 5z"/></g>
-<g id="people"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></g>
-<g id="people-outline"><path d="M16.5 13c-1.2 0-3.07.34-4.5 1-1.43-.67-3.3-1-4.5-1C5.33 13 1 14.08 1 16.25V19h22v-2.75c0-2.17-4.33-3.25-6.5-3.25zm-4 4.5h-10v-1.25c0-.54 2.56-1.75 5-1.75s5 1.21 5 1.75v1.25zm9 0H14v-1.25c0-.46-.2-.86-.52-1.22.88-.3 1.96-.53 3.02-.53 2.44 0 5 1.21 5 1.75v1.25zM7.5 12c1.93 0 3.5-1.57 3.5-3.5S9.43 5 7.5 5 4 6.57 4 8.5 5.57 12 7.5 12zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2zm9 5.5c1.93 0 3.5-1.57 3.5-3.5S18.43 5 16.5 5 13 6.57 13 8.5s1.57 3.5 3.5 3.5zm0-5.5c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2z"/></g>
-<g id="person"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></g>
-<g id="person-add"><path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></g>
-<g id="person-outline"><path d="M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z"/></g>
-<g id="plus-one"><path d="M10 8H8v4H4v2h4v4h2v-4h4v-2h-4zm4.5-1.92V7.9l2.5-.5V18h2V5z"/></g>
-<g id="poll"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"/></g>
-<g id="public"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></g>
-<g id="school"><path d="M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82zM12 3L1 9l11 6 9-4.91V17h2V9L12 3z"/></g>
-<g id="sentiment-dissatisfied"><circle cx="15.5" cy="9.5" r="1.5"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-6c-2.33 0-4.32 1.45-5.12 3.5h1.67c.69-1.19 1.97-2 3.45-2s2.75.81 3.45 2h1.67c-.8-2.05-2.79-3.5-5.12-3.5z"/></g>
-<g id="sentiment-neutral"><path d="M9 14h6v1.5H9z"/><circle cx="15.5" cy="9.5" r="1.5"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></g>
-<g id="sentiment-satisfied"><circle cx="15.5" cy="9.5" r="1.5"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm0-4c-1.48 0-2.75-.81-3.45-2H6.88c.8 2.05 2.79 3.5 5.12 3.5s4.32-1.45 5.12-3.5h-1.67c-.7 1.19-1.97 2-3.45 2z"/></g>
-<g id="sentiment-very-dissatisfied"><path d="M11.99 2C6.47 2 2 6.47 2 12s4.47 10 9.99 10S22 17.53 22 12 17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm4.18-12.24l-1.06 1.06-1.06-1.06L13 8.82l1.06 1.06L13 10.94 14.06 12l1.06-1.06L16.18 12l1.06-1.06-1.06-1.06 1.06-1.06zM7.82 12l1.06-1.06L9.94 12 11 10.94 9.94 9.88 11 8.82 9.94 7.76 8.88 8.82 7.82 7.76 6.76 8.82l1.06 1.06-1.06 1.06zM12 14c-2.33 0-4.31 1.46-5.11 3.5h10.22c-.8-2.04-2.78-3.5-5.11-3.5z"/></g>
-<g id="sentiment-very-satisfied"><path d="M11.99 2C6.47 2 2 6.47 2 12s4.47 10 9.99 10S22 17.53 22 12 17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm1-10.06L14.06 11l1.06-1.06L16.18 11l1.06-1.06-2.12-2.12zm-4.12 0L9.94 11 11 9.94 8.88 7.82 6.76 9.94 7.82 11zM12 17.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></g>
-<g id="share"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z"/></g>
-<g id="whatshot"><path d="M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36C5.21 7.51 4 10.62 4 14c0 4.42 3.58 8 8 8s8-3.58 8-8C20 8.61 17.41 3.8 13.5.67zM11.71 19c-1.78 0-3.22-1.4-3.22-3.14 0-1.62 1.05-2.76 2.81-3.12 1.77-.36 3.6-1.21 4.62-2.58.39 1.29.59 2.65.59 4.04 0 2.65-2.15 4.8-4.8 4.8z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/test/index.html b/systrace/catapult/third_party/polymer/components/iron-icons/test/index.html
deleted file mode 100644
index d1a1d04..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/test/index.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-  <meta charset="utf-8">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-
-</head>
-<body>
-
-  <script>
-    WCT.loadSuites([
-      'iron-icons.html',
-      'iron-icons.html?dom=shadow'
-    ]);
-  </script>
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-icons/test/iron-icons.html b/systrace/catapult/third_party/polymer/components/iron-icons/test/iron-icons.html
deleted file mode 100644
index 41ef21a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-icons/test/iron-icons.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-icons</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../av-icons.html">
-  <link rel="import" href="../communication-icons.html">
-  <link rel="import" href="../device-icons.html">
-  <link rel="import" href="../editor-icons.html">
-  <link rel="import" href="../hardware-icons.html">
-  <link rel="import" href="../image-icons.html">
-  <link rel="import" href="../iron-icons.html">
-  <link rel="import" href="../maps-icons.html">
-  <link rel="import" href="../notification-icons.html">
-  <link rel="import" href="../places-icons.html">
-  <link rel="import" href="../social-icons.html">
-
-</head>
-<body>
-
-  <script>
-
-suite('<iron-icons>', function() {
-  suite('basic behavior', function() {
-    var meta;
-    var iconsetNames = [
-      'av', 'communication', 'device', 'editor', 'hardware', 'icons', 'image',
-      'maps', 'notification', 'places', 'social'
-    ];
-
-    setup(function() {
-      meta = Polymer.Base.create('iron-meta', {type: 'iconset'});
-    });
-
-    test('all uniquely named', function() {
-      var allIcons = {};
-      for (var i = 0; i < iconsetNames.length; i++) {
-        var iconset = meta.byKey(iconsetNames[i]);
-        expect(iconset).to.be.ok;
-
-        var iconNames = iconset.getIconNames();
-        expect(iconNames).to.not.be.empty;
-
-        for (var j = 0; j < iconNames.length; j++) {
-          var parts = iconNames[j].split(':');
-          expect(parts).to.have.length(2);
-          expect(parts[0]).to.equal(iconsetNames[i]);
-          expect(parts[1]).to.have.length.at.least(1);
-          expect(allIcons.hasOwnProperty(parts[1])).to.be.false;
-
-          allIcons[parts[1]] = true;
-        }
-      }
-
-      // Sanity check.
-      expect(Object.getOwnPropertyNames(allIcons))
-          .to.have.length.of.at.least(iconsetNames.length);
-    });
-  });
-});
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/README.md b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/README.md
deleted file mode 100644
index 971ab0c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-iconset-svg.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-iconset-svg.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-iconset-svg)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-iconset-svg)_
-
-
-##&lt;iron-iconset-svg&gt;
-
-The `iron-iconset-svg` element allows users to define their own icon sets
-that contain svg icons. The svg icon elements should be children of the
-`iron-iconset-svg` element. Multiple icons should be given distinct id's.
-
-Using svg elements to create icons has a few advantages over traditional
-bitmap graphics like jpg or png. Icons that use svg are vector based so
-they are resolution independent and should look good on any device. They
-are stylable via css. Icons can be themed, colorized, and even animated.
-
-Example:
-
-```html
-<iron-iconset-svg name="my-svg-icons" size="24">
-  <svg>
-    <defs>
-      <g id="shape">
-        <rect x="12" y="0" width="12" height="24" />
-        <circle cx="12" cy="12" r="12" />
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
-```
-
-This will automatically register the icon set "my-svg-icons" to the iconset
-database.  To use these icons from within another element, make a
-`iron-iconset` element and call the `byId` method
-to retrieve a given iconset. To apply a particular icon inside an
-element use the `applyIcon` method. For example:
-
-```javascript
-iconset.applyIcon(iconNode, 'car');
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/bower.json b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/bower.json
deleted file mode 100644
index 6f4a1ff..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/bower.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "iron-iconset-svg",
-  "description": "Manages a set of svg icons",
-  "version": "1.1.2",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "icon"
-  ],
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-iconset-svg.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0",
-    "iron-meta": "PolymerElements/iron-meta#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.2",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-icon": "polymerelements/iron-icon#^1.0.0",
-    "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0"
-  },
-  "main": "iron-iconset-svg.html",
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/demo/index.html
deleted file mode 100644
index 53b291a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/demo/index.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-iconset-svg</title>
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link href="../../paper-styles/demo-pages.html" rel="import">
-
-  <link rel="import" href="svg-sample-icons.html">
-  <style is="custom-style">
-
-    .centered {
-      text-align: center;
-    }
-
-    iron-icon {
-      height: 64px;
-      width: 64px;
-      margin: auto 1em;
-    }
-
-    iron-icon:nth-of-type(1) {
-      fill: orange;
-    }
-
-    iron-icon:nth-of-type(2) {
-      fill: green;
-    }
-
-    iron-icon:nth-of-type(3) {
-      fill: navy;
-    }
-
-    iron-icon:nth-of-type(4) {
-      fill: red;
-    }
-
-    iron-icon {
-      transition: all 0.5s;
-      -webkit-transition: all 0.5s;
-    }
-
-    iron-icon:hover {
-      -webkit-filter: drop-shadow( 2px 2px 2px var(--google-grey-700) );
-      filter: drop-shadow( 2px 2px 2px var(--google-grey-700) );
-    }
-  </style>
-</head>
-<body>
-
-  <div class="vertical-section vertical-section-container centered">
-    <iron-icon icon="svg-sample-icons:codepen"></iron-icon>
-    <iron-icon icon="svg-sample-icons:twitter"></iron-icon>
-    <iron-icon icon="svg-sample-icons:youtube"></iron-icon>
-    <iron-icon icon="inline:shape"></iron-icon>
-  </div>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/demo/svg-sample-icons.html b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/demo/svg-sample-icons.html
deleted file mode 100644
index 3eed843..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/demo/svg-sample-icons.html
+++ /dev/null
@@ -1,81 +0,0 @@
-
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-iconset-svg.html">
-
-<iron-iconset-svg name="svg-sample-icons" size="100">
-  <svg>
-    <defs>
-    <g id="codepen">
-      <path class="outer-ring"  d="M50,0C22.385,0,0,22.385,0,50c0,27.615,22.385,50,50,50c27.614,0,50-22.385,50-50C100,22.385,77.615,0,50,0z M50,91.789
-      C26.958,91.789,8.212,73.042,8.212,50C8.212,26.958,26.958,8.212,50,8.212c23.042,0,41.788,18.747,41.788,41.789
-      C91.788,73.042,73.042,91.789,50,91.789z"></path>
-      <path class="inner-logo"  d="M80.893,40.234c-0.006-0.039-0.016-0.076-0.022-0.115c-0.013-0.075-0.027-0.15-0.046-0.223
-      c-0.012-0.044-0.028-0.086-0.042-0.128c-0.021-0.065-0.042-0.13-0.068-0.193c-0.018-0.044-0.039-0.088-0.059-0.13
-      c-0.028-0.06-0.057-0.119-0.09-0.175c-0.024-0.042-0.051-0.083-0.076-0.124c-0.036-0.055-0.073-0.109-0.112-0.161
-      c-0.029-0.039-0.06-0.078-0.091-0.115c-0.042-0.049-0.086-0.098-0.132-0.143c-0.035-0.036-0.069-0.072-0.106-0.104
-      c-0.049-0.044-0.099-0.086-0.15-0.127c-0.04-0.031-0.079-0.062-0.12-0.091c-0.016-0.01-0.029-0.023-0.044-0.033L51.474,19.531
-      c-0.893-0.595-2.055-0.595-2.947,0L20.267,38.371c-0.015,0.01-0.028,0.023-0.044,0.033c-0.042,0.029-0.081,0.06-0.12,0.091
-      c-0.052,0.041-0.102,0.083-0.15,0.127c-0.037,0.032-0.071,0.068-0.106,0.104c-0.046,0.045-0.09,0.094-0.132,0.143
-      c-0.031,0.038-0.062,0.077-0.092,0.115c-0.039,0.052-0.076,0.106-0.111,0.161c-0.027,0.041-0.052,0.082-0.076,0.124
-      c-0.033,0.057-0.062,0.115-0.09,0.175c-0.021,0.042-0.042,0.086-0.06,0.13c-0.026,0.063-0.047,0.128-0.068,0.193
-      c-0.014,0.042-0.029,0.084-0.042,0.128c-0.02,0.073-0.032,0.148-0.046,0.223c-0.006,0.039-0.016,0.076-0.021,0.115
-      c-0.016,0.114-0.024,0.229-0.024,0.346V59.42c0,0.117,0.009,0.233,0.024,0.348c0.005,0.038,0.015,0.077,0.021,0.114
-      c0.014,0.075,0.027,0.149,0.046,0.223c0.012,0.043,0.028,0.086,0.042,0.128c0.021,0.065,0.042,0.13,0.068,0.195
-      c0.018,0.044,0.039,0.086,0.06,0.129c0.028,0.06,0.058,0.118,0.09,0.177c0.024,0.041,0.049,0.082,0.076,0.122
-      c0.035,0.056,0.072,0.109,0.111,0.161c0.029,0.041,0.061,0.078,0.092,0.115c0.042,0.049,0.086,0.098,0.132,0.144
-      c0.035,0.036,0.069,0.071,0.106,0.104c0.048,0.044,0.099,0.086,0.15,0.127c0.039,0.031,0.078,0.062,0.12,0.091
-      c0.016,0.01,0.029,0.023,0.044,0.032l28.259,18.84c0.446,0.297,0.96,0.447,1.474,0.447c0.513,0,1.027-0.149,1.473-0.447
-      l28.259-18.84c0.015-0.009,0.028-0.022,0.044-0.032c0.042-0.029,0.081-0.06,0.12-0.091c0.051-0.041,0.102-0.083,0.15-0.127
-      c0.037-0.033,0.071-0.068,0.106-0.104c0.046-0.046,0.09-0.095,0.132-0.144c0.031-0.037,0.062-0.075,0.091-0.115
-      c0.04-0.052,0.076-0.105,0.112-0.161c0.025-0.041,0.051-0.081,0.076-0.122c0.033-0.059,0.062-0.117,0.09-0.177
-      c0.02-0.042,0.041-0.085,0.059-0.129c0.026-0.065,0.047-0.13,0.068-0.195c0.014-0.042,0.03-0.085,0.042-0.128
-      c0.02-0.074,0.033-0.148,0.046-0.223c0.006-0.037,0.016-0.076,0.022-0.114c0.014-0.115,0.023-0.231,0.023-0.348V40.581
-      C80.916,40.464,80.907,40.348,80.893,40.234z M52.657,26.707l20.817,13.877l-9.298,6.221l-11.519-7.706V26.707z M47.343,26.707
-      v12.393l-11.518,7.706l-9.299-6.221L47.343,26.707z M24.398,45.554L31.046,50l-6.648,4.446V45.554z M47.343,73.294L26.525,59.417
-      l9.299-6.219l11.518,7.704V73.294z M50,56.286L40.603,50L50,43.715L59.397,50L50,56.286z M52.657,73.294V60.902l11.519-7.704
-      l9.298,6.219L52.657,73.294z M75.602,54.447L68.955,50l6.647-4.446V54.447z"></path>
-    </g>
-
-    <path id="twitter" d="M100.001,17.942c-3.681,1.688-7.633,2.826-11.783,3.339
-    c4.236-2.624,7.49-6.779,9.021-11.73c-3.965,2.432-8.354,4.193-13.026,5.146C80.47,10.575,75.138,8,69.234,8
-    c-11.33,0-20.518,9.494-20.518,21.205c0,1.662,0.183,3.281,0.533,4.833c-17.052-0.884-32.168-9.326-42.288-22.155
-    c-1.767,3.133-2.778,6.773-2.778,10.659c0,7.357,3.622,13.849,9.127,17.65c-3.363-0.109-6.525-1.064-9.293-2.651
-    c-0.002,0.089-0.002,0.178-0.002,0.268c0,10.272,7.072,18.845,16.458,20.793c-1.721,0.484-3.534,0.744-5.405,0.744
-    c-1.322,0-2.606-0.134-3.859-0.379c2.609,8.424,10.187,14.555,19.166,14.726c-7.021,5.688-15.867,9.077-25.48,9.077
-    c-1.656,0-3.289-0.102-4.895-0.297C9.08,88.491,19.865,92,31.449,92c37.737,0,58.374-32.312,58.374-60.336
-    c0-0.92-0.02-1.834-0.059-2.743C93.771,25.929,97.251,22.195,100.001,17.942L100.001,17.942z"></path>
-
-    <g id="youtube">
-      <path class="youtube"  d="M98.77,27.492c-1.225-5.064-5.576-8.799-10.811-9.354C75.561,16.818,63.01,15.993,50.514,16
-      c-12.495-0.007-25.045,0.816-37.446,2.139c-5.235,0.557-9.583,4.289-10.806,9.354C0.522,34.704,0.5,42.574,0.5,50.001
-      c0,7.426,0,15.296,1.741,22.509c1.224,5.061,5.572,8.799,10.807,9.352c12.399,1.32,24.949,2.145,37.446,2.14
-      c12.494,0.005,25.047-0.817,37.443-2.14c5.234-0.555,9.586-4.291,10.81-9.352c1.741-7.213,1.753-15.083,1.753-22.509
-      S100.51,34.704,98.77,27.492 M67.549,52.203L43.977,64.391c-2.344,1.213-4.262,0.119-4.262-2.428V38.036
-      c0-2.548,1.917-3.644,4.262-2.429l23.572,12.188C69.896,49.008,69.896,50.992,67.549,52.203"></path>
-    </g>
-
-    </defs>
-
-  </svg>
-</iron-iconset-svg>
-
-<iron-iconset-svg name="inline" size="24">
-  <svg>
-    <defs>
-      <g id="shape">
-        <rect x="12" y="0" width="12" height="24" />
-        <circle cx="12" cy="12" r="12" />
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/index.html b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/index.html
deleted file mode 100644
index 487bb5c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/iron-iconset-svg.html b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/iron-iconset-svg.html
deleted file mode 100644
index ab07e88..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/iron-iconset-svg.html
+++ /dev/null
@@ -1,242 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
-
-<script>
-  /**
-   * The `iron-iconset-svg` element allows users to define their own icon sets
-   * that contain svg icons. The svg icon elements should be children of the
-   * `iron-iconset-svg` element. Multiple icons should be given distinct id's.
-   *
-   * Using svg elements to create icons has a few advantages over traditional
-   * bitmap graphics like jpg or png. Icons that use svg are vector based so
-   * they are resolution independent and should look good on any device. They
-   * are stylable via css. Icons can be themed, colorized, and even animated.
-   *
-   * Example:
-   *
-   *     <iron-iconset-svg name="my-svg-icons" size="24">
-   *       <svg>
-   *         <defs>
-   *           <g id="shape">
-   *             <rect x="12" y="0" width="12" height="24" />
-   *             <circle cx="12" cy="12" r="12" />
-   *           </g>
-   *         </defs>
-   *       </svg>
-   *     </iron-iconset-svg>
-   *
-   * This will automatically register the icon set "my-svg-icons" to the iconset
-   * database.  To use these icons from within another element, make a
-   * `iron-iconset` element and call the `byId` method
-   * to retrieve a given iconset. To apply a particular icon inside an
-   * element use the `applyIcon` method. For example:
-   *
-   *     iconset.applyIcon(iconNode, 'car');
-   *
-   * @element iron-iconset-svg
-   * @demo demo/index.html
-   * @implements {Polymer.Iconset}
-   */
-  Polymer({
-    is: 'iron-iconset-svg',
-
-    properties: {
-
-      /**
-       * The name of the iconset.
-       */
-      name: {
-        type: String,
-        observer: '_nameChanged'
-      },
-
-      /**
-       * The size of an individual icon. Note that icons must be square.
-       */
-      size: {
-        type: Number,
-        value: 24
-      },
-
-      /**
-       * Set to true to enable mirroring of icons where specified when they are
-       * stamped. Icons that should be mirrored should be decorated with a
-       * `mirror-in-rtl` attribute.
-       *
-       * NOTE: For performance reasons, direction will be resolved once per
-       * document per iconset, so moving icons in and out of RTL subtrees will
-       * not cause their mirrored state to change.
-       */
-      rtlMirroring: {
-        type: Boolean,
-        value: false
-      }
-    },
-
-    attached: function() {
-      this.style.display = 'none';
-    },
-
-    /**
-     * Construct an array of all icon names in this iconset.
-     *
-     * @return {!Array} Array of icon names.
-     */
-    getIconNames: function() {
-      this._icons = this._createIconMap();
-      return Object.keys(this._icons).map(function(n) {
-        return this.name + ':' + n;
-      }, this);
-    },
-
-    /**
-     * Applies an icon to the given element.
-     *
-     * An svg icon is prepended to the element's shadowRoot if it exists,
-     * otherwise to the element itself.
-     *
-     * If RTL mirroring is enabled, and the icon is marked to be mirrored in
-     * RTL, the element will be tested (once and only once ever for each
-     * iconset) to determine the direction of the subtree the element is in.
-     * This direction will apply to all future icon applications, although only
-     * icons marked to be mirrored will be affected.
-     *
-     * @method applyIcon
-     * @param {Element} element Element to which the icon is applied.
-     * @param {string} iconName Name of the icon to apply.
-     * @return {?Element} The svg element which renders the icon.
-     */
-    applyIcon: function(element, iconName) {
-      // insert svg element into shadow root, if it exists
-      element = element.root || element;
-      // Remove old svg element
-      this.removeIcon(element);
-      // install new svg element
-      var svg = this._cloneIcon(iconName,
-          this.rtlMirroring && this._targetIsRTL(element));
-      if (svg) {
-        var pde = Polymer.dom(element);
-        pde.insertBefore(svg, pde.childNodes[0]);
-        return element._svgIcon = svg;
-      }
-      return null;
-    },
-
-    /**
-     * Remove an icon from the given element by undoing the changes effected
-     * by `applyIcon`.
-     *
-     * @param {Element} element The element from which the icon is removed.
-     */
-    removeIcon: function(element) {
-      // Remove old svg element
-      element = element.root || element;
-      if (element._svgIcon) {
-        Polymer.dom(element).removeChild(element._svgIcon);
-        element._svgIcon = null;
-      }
-    },
-
-    /**
-     * Measures and memoizes the direction of the element. Note that this
-     * measurement is only done once and the result is memoized for future
-     * invocations.
-     */
-    _targetIsRTL: function(target) {
-      if (this.__targetIsRTL == null) {
-        if (target && target.nodeType !== Node.ELEMENT_NODE) {
-          target = target.host;
-        }
-
-        this.__targetIsRTL = target &&
-            window.getComputedStyle(target)['direction'] === 'rtl';
-      }
-
-      return this.__targetIsRTL;
-    },
-
-    /**
-     *
-     * When name is changed, register iconset metadata
-     *
-     */
-    _nameChanged: function() {
-      new Polymer.IronMeta({type: 'iconset', key: this.name, value: this});
-      this.async(function() {
-        this.fire('iron-iconset-added', this, {node: window});
-      });
-    },
-
-    /**
-     * Create a map of child SVG elements by id.
-     *
-     * @return {!Object} Map of id's to SVG elements.
-     */
-    _createIconMap: function() {
-      // Objects chained to Object.prototype (`{}`) have members. Specifically,
-      // on FF there is a `watch` method that confuses the icon map, so we
-      // need to use a null-based object here.
-      var icons = Object.create(null);
-      Polymer.dom(this).querySelectorAll('[id]')
-        .forEach(function(icon) {
-          icons[icon.id] = icon;
-        });
-      return icons;
-    },
-
-    /**
-     * Produce installable clone of the SVG element matching `id` in this
-     * iconset, or `undefined` if there is no matching element.
-     *
-     * @return {Element} Returns an installable clone of the SVG element
-     * matching `id`.
-     */
-    _cloneIcon: function(id, mirrorAllowed) {
-      // create the icon map on-demand, since the iconset itself has no discrete
-      // signal to know when it's children are fully parsed
-      this._icons = this._icons || this._createIconMap();
-      return this._prepareSvgClone(this._icons[id], this.size, mirrorAllowed);
-    },
-
-    /**
-     * @param {Element} sourceSvg
-     * @param {number} size
-     * @param {Boolean} mirrorAllowed
-     * @return {Element}
-     */
-    _prepareSvgClone: function(sourceSvg, size, mirrorAllowed) {
-      if (sourceSvg) {
-        var content = sourceSvg.cloneNode(true),
-            svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
-            viewBox = content.getAttribute('viewBox') || '0 0 ' + size + ' ' + size,
-            cssText = 'pointer-events: none; display: block; width: 100%; height: 100%;';
-
-        if (mirrorAllowed && content.hasAttribute('mirror-in-rtl')) {
-          cssText += '-webkit-transform:scale(-1,1);transform:scale(-1,1);';
-        }
-
-        svg.setAttribute('viewBox', viewBox);
-        svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');
-        svg.setAttribute('focusable', 'false');
-        // TODO(dfreedm): `pointer-events: none` works around https://crbug.com/370136
-        // TODO(sjmiles): inline style may not be ideal, but avoids requiring a shadow-root
-        svg.style.cssText = cssText;
-        svg.appendChild(content).removeAttribute('id');
-        return svg;
-      }
-      return null;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/test/index.html b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/test/index.html
deleted file mode 100644
index 65e4abf..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/test/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-  <meta charset="utf-8">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-
-</head>
-<body>
-
-  <script>
-    WCT.loadSuites([
-      'iron-iconset-svg.html',
-      'iron-iconset-svg.html?dom=shadow'
-    ]);
-  </script>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/test/iron-iconset-svg.html b/systrace/catapult/third_party/polymer/components/iron-iconset-svg/test/iron-iconset-svg.html
deleted file mode 100644
index c982abc..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-iconset-svg/test/iron-iconset-svg.html
+++ /dev/null
@@ -1,233 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-iconset-svg</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../iron-iconset-svg.html">
-  <link rel="import" href="../../iron-meta/iron-meta.html">
-  <link rel="import" href="../../iron-icon/iron-icon.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialIconsetSvg">
-    <template>
-      <iron-iconset-svg name="foo"></iron-iconset-svg>
-      <iron-meta type="iconset"></iron-meta>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="MirroredIconsetSvg">
-    <template>
-      <iron-iconset-svg name="mirrored-icons" rtl-mirroring>
-        <circle id="circle" cx="20" cy="20" r="10"></circle>
-        <symbol id="rect" viewBox="0 0 50 25" mirror-in-rtl>
-          <rect x="0" y="0" width="50" height="25"></rect>
-        </symbol>
-      </iron-iconset-svg>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="RtlContainer">
-    <template>
-      <div dir="rtl"></div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="StandardIconsetSvg">
-    <template>
-      <iron-iconset-svg name="my-icons" size="20">
-        <svg>
-          <defs>
-            <circle id="circle" cx="20" cy="20" r="10"></circle>
-            <rect id="square" x="0" y="0" width="20" height="20"></rect>
-            <symbol id="rect" viewBox="0 0 50 25">
-              <rect x="0" y="0" width="50" height="25"></rect>
-            </symbol>
-          </defs>
-        </svg>
-      </iron-iconset-svg>
-      <div></div>
-      <iron-icon></iron-icon>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('<iron-iconset>', function () {
-
-      suite('basic behavior', function () {
-        var iconset;
-        var meta;
-        var loadedPromise;
-
-        setup(function () {
-          loadedPromise = new Promise(function(resolve) {
-            window.addEventListener('iron-iconset-added', function(ev) {
-              if (ev && ev.detail === iconset) {
-                resolve();
-              }
-            });
-          });
-          var elements = fixture('TrivialIconsetSvg');
-          iconset = elements[0];
-          meta = elements[1];
-        });
-
-        test('it can be accessed via iron-meta', function () {
-          expect(meta.byKey('foo')).to.be.equal(iconset);
-        });
-
-        test('it does not have a size', function () {
-          var rect = iconset.getBoundingClientRect();
-          expect(rect.width).to.be.equal(0);
-          expect(rect.height).to.be.equal(0);
-        });
-
-        test('it fires an iron-iconset-added event on the window', function() {
-          return loadedPromise;
-        });
-      });
-
-      suite('when stamping in an RTL context', function() {
-        var iconset;
-        var rtlContainer;
-
-        setup(function() {
-          iconset = fixture('MirroredIconsetSvg');
-          rtlContainer = fixture('RtlContainer');
-        });
-
-        test('icons marked as mirror-in-rtl are mirrored', function() {
-          iconset.applyIcon(rtlContainer, 'rect');
-          var svg = rtlContainer.firstElementChild;
-          var computedStyle = window.getComputedStyle(svg);
-          var transform = computedStyle.transform || computedStyle.webkitTransform;
-          expect(transform).to.be.eql('matrix(-1, 0, 0, 1, 0, 0)');
-        });
-
-        test('icons not marked as mirror-in-rtl are not mirrored', function() {
-          iconset.applyIcon(rtlContainer, 'circle');
-          var svg = rtlContainer.firstElementChild;
-          var computedStyle = window.getComputedStyle(svg);
-          var transform = computedStyle.transform || computedStyle.webkitTransform;
-          expect(transform).to.be.eql('none');
-        });
-
-        test('many mirrored icons only call getComputedStyle once', function() {
-          sinon.spy(window, 'getComputedStyle');
-
-          for (var i = 0; i < 3; ++i) {
-            iconset.applyIcon(rtlContainer, 'rect');
-          }
-
-          expect(window.getComputedStyle.callCount).to.be.eql(1);
-          window.getComputedStyle.restore();
-        });
-      });
-
-      suite('when paired with a size and SVG definition', function () {
-        var iconset;
-        var div;
-
-        setup(function () {
-          var elements = fixture('StandardIconsetSvg');
-          iconset = elements[0];
-          div = elements[1];
-        });
-
-        test('it does not have a size', function () {
-          var rect = iconset.getBoundingClientRect();
-          expect(rect.width).to.be.equal(0);
-          expect(rect.height).to.be.equal(0);
-        });
-
-        test('appends a child to the target element', function () {
-          expect(div.firstElementChild).to.not.be.ok;
-          iconset.applyIcon(div, 'circle');
-          expect(div.firstElementChild).to.be.ok;
-        });
-
-        test('can be queried for all available icons', function () {
-          expect(iconset.getIconNames()).to.deep.eql(['my-icons:circle', 'my-icons:square', 'my-icons:rect']);
-        });
-
-        test('supports any icon defined in the svg', function () {
-          var lastSvgIcon;
-
-          iconset.getIconNames().forEach(function (iconName) {
-            iconset.applyIcon(div, iconName.split(':').pop());
-            expect(div.firstElementChild).to.not.be.equal(lastSvgIcon);
-            lastSvgIcon = div.firstElementChild;
-          });
-        });
-
-        test('prefers a viewBox attribute over the iconset size', function () {
-          iconset.applyIcon(div, 'rect');
-          expect(div.firstElementChild.getAttribute('viewBox')).to.be.equal('0 0 50 25');
-        });
-
-        test('uses the iconset size when viewBox is not defined on the element', function () {
-          iconset.applyIcon(div, 'circle');
-          expect(div.firstElementChild.getAttribute('viewBox')).to.be.equal('0 0 20 20');
-        });
-      });
-
-      suite('Adding / removal from iron-icon', function () {
-        var iconset;
-        var div;
-        var ironIcon;
-
-        setup(function () {
-          var elements = fixture('StandardIconsetSvg');
-          iconset = elements[0];
-          div = elements[1];
-          ironIcon = elements[2];
-        });
-
-        test('be able to remove an iconset from a standard DOM element', function () {
-          iconset.applyIcon(div, 'circle');
-          Polymer.dom.flush();
-          expect(div.children.length).to.be.equal(1);
-          iconset.removeIcon(div);
-          Polymer.dom.flush();
-          expect(div.children.length).to.be.equal(0);
-        });
-
-        test('be able to remove an iconset from a Polymer element', function () {
-          var baseLength = Polymer.dom(ironIcon.root).children.length;
-          iconset.applyIcon(ironIcon, 'circle');
-          Polymer.dom.flush();
-          expect(Polymer.dom(ironIcon.root).children.length - baseLength).to.be.equal(1);
-          iconset.removeIcon(ironIcon);
-          Polymer.dom.flush();
-          expect(Polymer.dom(ironIcon.root).children.length - baseLength).to.be.equal(0);
-        });
-
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-image/CONTRIBUTING.md
deleted file mode 100755
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/README.md b/systrace/catapult/third_party/polymer/components/iron-image/README.md
deleted file mode 100755
index 3797962..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/README.md
+++ /dev/null
@@ -1,86 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-image.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-image.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-image)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-image)_
-
-
-##&lt;iron-image&gt;
-
-`iron-image` is an element for displaying an image that provides useful sizing and
-preloading options not found on the standard `<img>` tag.
-
-The `sizing` option allows the image to be either cropped (`cover`) or
-letterboxed (`contain`) to fill a fixed user-size placed on the element.
-
-The `preload` option prevents the browser from rendering the image until the
-image is fully loaded.  In the interim, either the element's CSS `background-color`
-can be be used as the placeholder, or the `placeholder` property can be
-set to a URL (preferably a data-URI, for instant rendering) for an
-placeholder image.
-
-The `fade` option (only valid when `preload` is set) will cause the placeholder
-image/color to be faded out once the image is rendered.
-
-Examples:
-
-  Basically identical to `<img src="...">` tag:
-
-```html
-<iron-image src="http://lorempixel.com/400/400"></iron-image>
-```
-
-  Will letterbox the image to fit:
-
-```html
-<iron-image style="width:400px; height:400px;" sizing="contain"
-  src="http://lorempixel.com/600/400"></iron-image>
-```
-
-  Will crop the image to fit:
-
-```html
-<iron-image style="width:400px; height:400px;" sizing="cover"
-  src="http://lorempixel.com/600/400"></iron-image>
-```
-
-  Will show light-gray background until the image loads:
-
-```html
-<iron-image style="width:400px; height:400px; background-color: lightgray;"
-  sizing="cover" preload src="http://lorempixel.com/600/400"></iron-image>
-```
-
-  Will show a base-64 encoded placeholder image until the image loads:
-
-```html
-<iron-image style="width:400px; height:400px;" placeholder="data:image/gif;base64,..."
-  sizing="cover" preload src="http://lorempixel.com/600/400"></iron-image>
-```
-
-  Will fade the light-gray background out once the image is loaded:
-
-```html
-<iron-image style="width:400px; height:400px; background-color: lightgray;"
-  sizing="cover" preload fade src="http://lorempixel.com/600/400"></iron-image>
-```
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--iron-image-placeholder` | Mixin applied to #placeholder | `{}` |
-| `--iron-image-width` | Sets the width of the wrapped image | `auto` |
-| `--iron-image-height` | Sets the height of the wrapped image | `auto` |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/bower.json b/systrace/catapult/third_party/polymer/components/iron-image/bower.json
deleted file mode 100755
index 9ac7b5d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "iron-image",
-  "version": "1.2.3",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "An image-displaying element with lots of convenient features",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "media"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-image.git"
-  },
-  "dependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.4",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "main": "iron-image.html",
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-image/demo/index.html
deleted file mode 100644
index 06c533c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/demo/index.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>iron-image demo</title>
-    
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-    <meta name="mobile-web-app-capable" content="yes">
-    <meta name="apple-mobile-web-app-capable" content="yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../polymer/polymer.html">
-    <link rel="import" href="../iron-image.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      .example {
-        margin: 4px;
-        flex: 1;
-      }
-
-      code {
-        white-space: nowrap;
-      }
-    </style>
-
-    <script>
-      function load(id) {
-        document.getElementById(id).src = "./polymer.svg?" + Math.random();
-      }
-    </script>
-
-  </head>
-  <body unresolved>
-
-    <div class="vertical-section-container centered">
-
-      <h3>A plain <code>iron-image</code>.</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <iron-image alt="The Polymer logo." src="./polymer.svg"></iron-image>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        <code>sizing="cover"</code> expands the image to cover all of its
-        specified size.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            #example-sizing-cover {
-              width: 150px;
-              height: 150px;
-              background: #ddd;
-            }
-          </style>
-
-          <iron-image sizing="cover" id="example-sizing-cover" alt="The Polymer logo." src="./polymer.svg"></iron-image>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        <code>sizing="contain"</code> expands the image to fit within its
-        specified size.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            #example-sizing-contain {
-              width: 150px;
-              height: 150px;
-              background: #ddd;
-            }
-          </style>
-
-          <iron-image sizing="contain" id="example-sizing-contain" alt="The Polymer logo." src="./polymer.svg"></iron-image>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use the <code>--iron-image-width</code> property to set the width of
-        the image wrapped by the <code>iron-image</code>.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            #example-full-width-container {
-              width: 200px;
-              border: 2px solid #444;
-              background: #444;
-            }
-
-            #example-full-width-container iron-image {
-              background: #ddd;
-            }
-
-            #example-full-width {
-              width: 100%;
-              --iron-image-width: 100%;
-            }
-
-            #example-half-width {
-              width: 50%;
-              --iron-image-width: 100%;
-            }
-          </style>
-
-
-          <div id="example-full-width-container">
-            <iron-image id="example-full-width" alt="The Polymer logo." src="./polymer.svg"></iron-image>
-            <iron-image id="example-half-width" alt="The Polymer logo." src="./polymer.svg"></iron-image>
-          </div>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use the <code>--iron-image-height</code> property to set the height of
-        the image wrapped by the <code>iron-image</code>.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            #example-full-height-container {
-              height: 150px;
-              border: 2px solid #444;
-              background: #444;
-            }
-
-            #example-full-height-container iron-image{
-              background: #ddd;
-            }
-
-            #example-full-height {
-              height: 100%;
-              --iron-image-height: 100%;
-            }
-
-            #example-half-height {
-              height: 50%;
-              --iron-image-height: 100%;
-            }
-          </style>
-
-
-          <div id="example-full-height-container">
-            <iron-image id="example-full-height" alt="The Polymer logo." src="./polymer.svg"></iron-image>
-            <iron-image id="example-half-height" alt="The Polymer logo." src="./polymer.svg"></iron-image>
-          </div>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        No placeholder is shown by default.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            .example.without-preload iron-image {
-              width: 150px;
-              height: 150px;
-              background: #ddd;
-            }
-          </style>
-
-          <div class="example without-preload">
-            <button onclick="load('example-without-preload-1')">
-              Load image
-            </button>
-            <br>
-            <iron-image sizing="contain" alt="The Polymer logo." id="example-without-preload-1"></iron-image>
-          </div>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        The <code>preload</code> attribute shows a placeholder element in front
-        of the image before it has loaded. Use the
-        <code>--iron-image-placeholder</code> CSS mixin to style it.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            .example.preload iron-image {
-              width: 150px;
-              height: 150px;
-              background: #ddd;
-              --iron-image-placeholder: {
-                background: #939ed5;
-              };
-            }
-          </style>
-
-          <div class="example preload">
-            <button onclick="load('example-preload-1')">
-              Load image
-            </button>
-            <br>
-            <iron-image preload id="example-preload-1" alt="The Polymer logo." class="sized" sizing="contain"></iron-image>
-            <br>
-            Without the <code>fade</code> attribute, the placeholder element is
-            hidden with no transition when the image loads.
-          </div>
-          <div class="example preload">
-            <button onclick="load('example-preload-2')">
-              Load image
-            </button>
-            <br>
-            <iron-image preload fade id="example-preload-2" alt="The Polymer logo." class="sized" sizing="contain"></iron-image>
-            <br>
-            With the <code>fade</code> attribute, the placeholder element is
-            fades away when the image loads.
-          </div>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use the <code>placeholder</code> attribute to specify a background image
-        for the placeholder element.
-      </h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            .example.preload-image iron-image {
-              width: 150px;
-              height: 150px;
-              background: #ddd;
-            }
-          </style>
-
-          <div class="example preload-image">
-            <button onclick="load('example-preload-image-1')">
-              Load image
-            </button>
-            <br>
-            <iron-image preload placeholder="./loading.png" id="example-preload-image-1" alt="The Polymer logo." class="sized" sizing="contain"></iron-image>
-            <br>
-            (without <code>fade</code> attribute)
-          </div>
-          <div class="example preload-image">
-            <button onclick="load('example-preload-image-2')">
-              Load image
-            </button>
-            <br>
-            <iron-image preload placeholder="./loading.png" fade id="example-preload-image-2" alt="The Polymer logo." class="sized" sizing="contain"></iron-image>
-            <br>
-            (with <code>fade</code> attribute)
-          </div>
-        </template>
-      </demo-snippet>
-
-    </div>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/demo/loading.png b/systrace/catapult/third_party/polymer/components/iron-image/demo/loading.png
deleted file mode 100644
index a87e171..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/demo/loading.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/demo/polymer.svg b/systrace/catapult/third_party/polymer/components/iron-image/demo/polymer.svg
deleted file mode 100755
index f7a815d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/demo/polymer.svg
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="208px" height="143px" viewBox="0 0 416 286" enable-background="new 0 0 416 286" xml:space="preserve">
-<g>
-	<g>
-		<polygon fill="#303F9F" points="84.157,143 42.878,214.5 84.157,286 125.436,214.5 		"/>
-		<polygon fill="#3F51B5" points="331.842,0 290.561,71.5 331.842,143 373.121,71.5 		"/>
-		<polygon fill="#7986CB" points="373.121,71.5 249.278,286 331.842,286 414.4,143 		"/>
-		<polygon fill="#FF4081" points="249.278,0 84.157,286 166.721,286 331.842,0 		"/>
-		<polygon fill="#536DFE" points="84.157,0 1.596,143 42.878,214.5 166.721,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="249.278,0 290.561,71.5 331.842,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="208,71.5 249.278,0 290.561,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="208,71.5 249.278,143 290.561,71.5 		"/>
-		<polygon fill-opacity="0.1" points="166.721,143 208,71.5 249.278,143 		"/>
-		<polygon fill-opacity="0.2" points="166.721,143 208,214.5 249.278,143 		"/>
-		<polygon fill-opacity="0.3" points="125.438,214.5 166.721,143 208,214.5 		"/>
-		<polygon fill-opacity="0.4" points="125.438,214.5 166.721,286 208,214.5 		"/>
-		<polygon fill-opacity="0.5" points="84.157,286 125.438,214.5 166.721,286 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="84.157,0 125.438,71.5 166.721,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="42.878,71.5 84.157,0 125.438,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="42.878,71.5 84.157,143 125.438,71.5 		"/>
-		<polygon fill-opacity="0.1" points="1.598,143 42.878,71.5 84.157,143 		"/>
-		<polygon fill-opacity="0.2" points="1.598,143 42.878,214.5 84.157,143 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="125.438,214.5 84.157,143 42.878,214.5 		"/>
-		<polygon fill-opacity="0.2" points="125.438,214.5 84.157,286 42.878,214.5 		"/>
-		<polygon fill-opacity="0.2" points="373.121,71.5 331.842,0 290.561,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="373.121,71.5 331.842,143 290.561,71.5 		"/>
-		<g>
-			<polygon fill="#FFFFFF" fill-opacity="0.2" points="331.842,143 373.121,71.5 414.4,143 			"/>
-			<polygon fill="#FFFFFF" fill-opacity="0.1" points="331.842,143 373.121,214.5 414.4,143 			"/>
-			<polygon fill="#FFFFFF" fill-opacity="0" points="290.561,214.5 331.842,143 373.121,214.5 			"/>
-			<polygon fill-opacity="0.1" points="290.561,214.5 331.842,286 373.121,214.5 			"/>
-			<polygon fill-opacity="0.2" points="249.278,286 290.561,214.5 331.842,286 			"/>
-		</g>
-	</g>
-	<rect y="-65" fill="none" width="416" height="416"/>
-</g>
-<g display="none">
-	<g display="inline">
-		<polygon fill="#303F9F" points="84.157,143 42.878,214.5 84.157,286 166.721,286 		"/>
-		<polygon fill="#3F51B5" points="331.842,0 249.278,0 331.842,143 373.121,71.5 		"/>
-		<polygon fill="#7986CB" points="373.121,71.5 249.278,286 331.842,286 414.4,143 		"/>
-		<polygon fill="#536DFE" points="84.157,0 1.596,143 42.878,214.5 166.721,0 		"/>
-		<polygon fill-opacity="0.5" points="249.278,0 290.561,71.5 331.842,0 		"/>
-		<polygon fill-opacity="0.5" points="84.157,286 125.438,214.5 166.721,286 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="84.157,0 125.438,71.5 166.721,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="42.878,71.5 84.157,0 125.438,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="42.878,71.5 84.157,143 125.438,71.5 		"/>
-		<polygon fill-opacity="0.1" points="1.598,143 42.878,71.5 84.157,143 		"/>
-		<polygon fill-opacity="0.2" points="1.598,143 42.878,214.5 84.157,143 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="125.438,214.5 84.157,143 42.878,214.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="373.121,71.5 331.842,143 290.561,71.5 		"/>
-		<g>
-			<polygon fill="#FFFFFF" fill-opacity="0.2" points="331.842,143 373.121,71.5 414.4,143 			"/>
-			<polygon fill="#FFFFFF" fill-opacity="0.1" points="331.842,143 373.121,214.5 414.4,143 			"/>
-			<polygon fill="#FFFFFF" fill-opacity="0" points="290.561,214.5 331.842,143 373.121,214.5 			"/>
-			<polygon fill-opacity="0.1" points="290.561,214.5 331.842,286 373.121,214.5 			"/>
-			<polygon fill-opacity="0.2" points="249.278,286 290.561,214.5 331.842,286 			"/>
-		</g>
-		<polygon fill-opacity="0.2" points="125.438,214.5 84.157,286 42.878,214.5 		"/>
-		<polygon fill-opacity="0.2" points="373.121,71.5 331.842,0 290.561,71.5 		"/>
-	</g>
-	<rect y="-65" display="inline" fill="none" width="416" height="416"/>
-</g>
-<g display="none">
-	<g display="inline">
-		<polygon fill="#FF4081" points="249.279,0 84.157,286 166.721,286 331.843,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="249.279,0 290.558,71.5 331.843,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="208,71.5 249.279,0 290.558,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="208,71.5 249.279,143 290.558,71.5 		"/>
-		<polygon fill-opacity="0.2" points="166.721,143 208,214.5 249.279,143 		"/>
-		<polygon fill-opacity="0.3" points="125.439,214.5 166.721,143 208,214.5 		"/>
-		<polygon fill-opacity="0.4" points="125.439,214.5 166.721,286 208,214.5 		"/>
-		<polygon fill-opacity="0.5" points="84.157,286 125.439,214.5 166.721,286 		"/>
-		<polygon fill-opacity="0.1" points="166.721,143 208,71.5 249.279,143 		"/>
-	</g>
-	<g display="inline">
-		<polygon fill="#FF4081" points="331.84,0 166.718,286 249.279,286 373.121,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="290.558,71.5 331.84,0 373.121,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="290.558,71.5 331.84,143 373.121,71.5 		"/>
-		<polygon fill-opacity="0.2" points="249.279,143 290.558,214.5 331.84,143 		"/>
-		<polygon fill-opacity="0.3" points="208,214.5 249.279,143 290.558,214.5 		"/>
-		<polygon fill-opacity="0.4" points="208,214.5 249.279,286 290.558,214.5 		"/>
-		<polygon fill-opacity="0.5" points="166.718,286 208,214.5 249.279,286 		"/>
-		<polygon fill-opacity="0.1" points="249.279,143 290.558,71.5 331.84,143 		"/>
-	</g>
-	<g display="inline">
-		<polygon fill="#FF4081" points="166.718,0 42.878,214.5 84.16,286 249.279,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="166.718,0 208,71.5 249.279,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="125.439,71.5 166.718,0 208,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="125.439,71.5 166.718,143 208,71.5 		"/>
-		<polygon fill-opacity="0.2" points="84.16,143 125.439,214.5 166.718,143 		"/>
-		<polygon fill-opacity="0.3" points="42.878,214.5 84.16,143 125.439,214.5 		"/>
-		<polygon fill-opacity="0.4" points="42.878,214.5 84.16,286 125.439,214.5 		"/>
-		<polygon fill-opacity="0.1" points="84.16,143 125.439,71.5 166.718,143 		"/>
-	</g>
-	<rect y="-65" display="inline" fill="none" width="416" height="416"/>
-	<g display="inline">
-		<polygon fill="#303F9F" points="84.157,143 42.878,214.5 84.157,286 166.721,286 		"/>
-		<polygon fill="#3F51B5" points="331.843,0 249.279,0 331.843,143 373.121,71.5 		"/>
-		<polygon fill="#7986CB" points="373.121,71.5 249.279,286 331.843,286 414.4,143 		"/>
-		<polygon fill="#536DFE" points="84.157,0 1.597,143 42.878,214.5 166.721,0 		"/>
-		<polygon fill-opacity="0.5" points="249.279,0 290.558,71.5 331.843,0 		"/>
-		<polygon fill-opacity="0.5" points="84.157,286 125.439,214.5 166.721,286 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="84.157,0 125.439,71.5 166.721,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="42.878,71.5 84.157,0 125.439,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="42.878,71.5 84.157,143 125.439,71.5 		"/>
-		<polygon fill-opacity="0.1" points="1.6,143 42.878,71.5 84.157,143 		"/>
-		<polygon fill-opacity="0.2" points="1.6,143 42.878,214.5 84.157,143 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="125.439,214.5 84.157,143 42.878,214.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="373.121,71.5 331.843,143 290.558,71.5 		"/>
-		<g>
-			<polygon fill="#FFFFFF" fill-opacity="0.2" points="331.843,143 373.121,71.5 414.4,143 			"/>
-			<polygon fill="#FFFFFF" fill-opacity="0.1" points="331.843,143 373.121,214.5 414.4,143 			"/>
-			<polygon fill="#FFFFFF" fill-opacity="0" points="290.558,214.5 331.843,143 373.121,214.5 			"/>
-			<polygon fill-opacity="0.1" points="290.558,214.5 331.843,286 373.121,214.5 			"/>
-			<polygon fill-opacity="0.2" points="249.279,286 290.558,214.5 331.843,286 			"/>
-		</g>
-		<polygon fill-opacity="0.2" points="125.439,214.5 84.157,286 42.878,214.5 		"/>
-		<polygon fill-opacity="0.2" points="373.121,71.5 331.843,0 290.558,71.5 		"/>
-	</g>
-</g>
-<g display="none">
-	<g display="inline">
-		<polygon fill="#9F499B" points="249.279,0 84.157,286 166.721,286 331.843,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="249.279,0 290.558,71.5 331.843,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="208,71.5 249.279,0 290.558,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="208,71.5 249.279,143 290.558,71.5 		"/>
-		<polygon fill-opacity="0.2" points="166.721,143 208,214.5 249.279,143 		"/>
-		<polygon fill-opacity="0.3" points="125.439,214.5 166.721,143 208,214.5 		"/>
-		<polygon fill-opacity="0.4" points="125.439,214.5 166.721,286 208,214.5 		"/>
-		<polygon fill-opacity="0.5" points="84.157,286 125.439,214.5 166.721,286 		"/>
-		<polygon fill-opacity="0.1" points="166.721,143 208,71.5 249.279,143 		"/>
-	</g>
-	<g display="inline">
-		<polygon fill="#9F499B" points="331.84,0 166.718,286 249.279,286 373.121,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="290.558,71.5 331.84,0 373.121,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="290.558,71.5 331.84,143 373.121,71.5 		"/>
-		<polygon fill-opacity="0.2" points="249.279,143 290.558,214.5 331.84,143 		"/>
-		<polygon fill-opacity="0.3" points="208,214.5 249.279,143 290.558,214.5 		"/>
-		<polygon fill-opacity="0.4" points="208,214.5 249.279,286 290.558,214.5 		"/>
-		<polygon fill-opacity="0.5" points="166.718,286 208,214.5 249.279,286 		"/>
-		<polygon fill-opacity="0.1" points="249.279,143 290.558,71.5 331.84,143 		"/>
-	</g>
-	<g display="inline">
-		<polygon fill="#9F499B" points="373.121,71.5 249.279,286 331.843,286 414.4,143 		"/>
-		<polygon fill-opacity="0.2" points="331.843,143 373.121,214.5 414.4,143 		"/>
-		<polygon fill-opacity="0.3" points="290.558,214.5 331.843,143 373.121,214.5 		"/>
-		<polygon fill-opacity="0.4" points="290.558,214.5 331.843,286 373.121,214.5 		"/>
-		<polygon fill-opacity="0.5" points="249.279,286 290.558,214.5 331.843,286 		"/>
-		<polygon fill-opacity="0.1" points="331.843,143 373.121,71.5 414.4,143 		"/>
-	</g>
-	<g display="inline">
-		<polygon fill="#9F499B" points="166.718,0 42.878,214.5 84.16,286 249.279,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="166.718,0 208,71.5 249.279,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="125.439,71.5 166.718,0 208,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="125.439,71.5 166.718,143 208,71.5 		"/>
-		<polygon fill-opacity="0.2" points="84.16,143 125.439,214.5 166.718,143 		"/>
-		<polygon fill-opacity="0.3" points="42.878,214.5 84.16,143 125.439,214.5 		"/>
-		<polygon fill-opacity="0.4" points="42.878,214.5 84.16,286 125.439,214.5 		"/>
-		<polygon fill-opacity="0.1" points="84.16,143 125.439,71.5 166.718,143 		"/>
-	</g>
-	<g display="inline">
-		<polygon fill="#9F499B" points="84.157,0 1.6,143 42.878,214.5 166.721,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.2" points="84.157,0 125.439,71.5 166.721,0 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0.1" points="42.878,71.5 84.157,0 125.439,71.5 		"/>
-		<polygon fill="#FFFFFF" fill-opacity="0" points="42.878,71.5 84.157,143 125.439,71.5 		"/>
-		<polygon fill-opacity="0.2" points="1.6,143 42.878,214.5 84.157,143 		"/>
-		<polygon fill-opacity="0.1" points="1.6,143 42.878,71.5 84.157,143 		"/>
-	</g>
-	<rect y="-65" display="inline" fill="none" width="416" height="416"/>
-</g>
-</svg>
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/index.html b/systrace/catapult/third_party/polymer/components/iron-image/index.html
deleted file mode 100644
index bb7da82..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-image</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/iron-image.html b/systrace/catapult/third_party/polymer/components/iron-image/iron-image.html
deleted file mode 100644
index bf774d6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/iron-image.html
+++ /dev/null
@@ -1,403 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-
-<!--
-`iron-image` is an element for displaying an image that provides useful sizing and
-preloading options not found on the standard `<img>` tag.
-
-The `sizing` option allows the image to be either cropped (`cover`) or
-letterboxed (`contain`) to fill a fixed user-size placed on the element.
-
-The `preload` option prevents the browser from rendering the image until the
-image is fully loaded.  In the interim, either the element's CSS `background-color`
-can be be used as the placeholder, or the `placeholder` property can be
-set to a URL (preferably a data-URI, for instant rendering) for an
-placeholder image.
-
-The `fade` option (only valid when `preload` is set) will cause the placeholder
-image/color to be faded out once the image is rendered.
-
-Examples:
-
-  Basically identical to `<img src="...">` tag:
-
-    <iron-image src="http://lorempixel.com/400/400"></iron-image>
-
-  Will letterbox the image to fit:
-
-    <iron-image style="width:400px; height:400px;" sizing="contain"
-      src="http://lorempixel.com/600/400"></iron-image>
-
-  Will crop the image to fit:
-
-    <iron-image style="width:400px; height:400px;" sizing="cover"
-      src="http://lorempixel.com/600/400"></iron-image>
-
-  Will show light-gray background until the image loads:
-
-    <iron-image style="width:400px; height:400px; background-color: lightgray;"
-      sizing="cover" preload src="http://lorempixel.com/600/400"></iron-image>
-
-  Will show a base-64 encoded placeholder image until the image loads:
-
-    <iron-image style="width:400px; height:400px;" placeholder="data:image/gif;base64,..."
-      sizing="cover" preload src="http://lorempixel.com/600/400"></iron-image>
-
-  Will fade the light-gray background out once the image is loaded:
-
-    <iron-image style="width:400px; height:400px; background-color: lightgray;"
-      sizing="cover" preload fade src="http://lorempixel.com/600/400"></iron-image>
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--iron-image-placeholder` | Mixin applied to #placeholder | `{}`
-`--iron-image-width` | Sets the width of the wrapped image | `auto`
-`--iron-image-height` | Sets the height of the wrapped image | `auto`
-
-@group Iron Elements
-@element iron-image
-@demo demo/index.html
--->
-
-<dom-module id="iron-image">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        overflow: hidden;
-        position: relative;
-      }
-
-      #sizedImgDiv {
-        @apply(--layout-fit);
-
-        display: none;
-      }
-
-      #img {
-        display: block;
-        width: var(--iron-image-width, auto);
-        height: var(--iron-image-height, auto);
-      }
-
-      :host([sizing]) #sizedImgDiv {
-        display: block;
-      }
-
-      :host([sizing]) #img {
-        display: none;
-      }
-
-      #placeholder {
-        @apply(--layout-fit);
-
-        background-color: inherit;
-        opacity: 1;
-
-        @apply(--iron-image-placeholder);
-      }
-
-      #placeholder.faded-out {
-        transition: opacity 0.5s linear;
-        opacity: 0;
-      }
-    </style>
-
-    <div id="sizedImgDiv"
-      role="img"
-      hidden$="[[_computeImgDivHidden(sizing)]]"
-      aria-hidden$="[[_computeImgDivARIAHidden(alt)]]"
-      aria-label$="[[_computeImgDivARIALabel(alt, src)]]"></div>
-    <img id="img" alt$="[[alt]]" hidden$="[[_computeImgHidden(sizing)]]">
-    <div id="placeholder"
-      hidden$="[[_computePlaceholderHidden(preload, fade, loading, loaded)]]"
-      class$="[[_computePlaceholderClassName(preload, fade, loading, loaded)]]"></div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'iron-image',
-
-      properties: {
-        /**
-         * The URL of an image.
-         */
-        src: {
-          observer: '_srcChanged',
-          type: String,
-          value: ''
-        },
-
-        /**
-         * A short text alternative for the image.
-         */
-        alt: {
-          type: String,
-          value: null
-        },
-
-        /**
-         * When true, the image is prevented from loading and any placeholder is
-         * shown.  This may be useful when a binding to the src property is known to
-         * be invalid, to prevent 404 requests.
-         */
-        preventLoad: {
-          type: Boolean,
-          value: false,
-          observer: '_preventLoadChanged'
-        },
-
-        /**
-         * Sets a sizing option for the image.  Valid values are `contain` (full
-         * aspect ratio of the image is contained within the element and
-         * letterboxed) or `cover` (image is cropped in order to fully cover the
-         * bounds of the element), or `null` (default: image takes natural size).
-         */
-        sizing: {
-          type: String,
-          value: null,
-          reflectToAttribute: true
-        },
-
-        /**
-         * When a sizing option is used (`cover` or `contain`), this determines
-         * how the image is aligned within the element bounds.
-         */
-        position: {
-          type: String,
-          value: 'center'
-        },
-
-        /**
-         * When `true`, any change to the `src` property will cause the `placeholder`
-         * image to be shown until the new image has loaded.
-         */
-        preload: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * This image will be used as a background/placeholder until the src image has
-         * loaded.  Use of a data-URI for placeholder is encouraged for instant rendering.
-         */
-        placeholder: {
-          type: String,
-          value: null,
-          observer: '_placeholderChanged'
-        },
-
-        /**
-         * When `preload` is true, setting `fade` to true will cause the image to
-         * fade into place.
-         */
-        fade: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * Read-only value that is true when the image is loaded.
-         */
-        loaded: {
-          notify: true,
-          readOnly: true,
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * Read-only value that tracks the loading state of the image when the `preload`
-         * option is used.
-         */
-        loading: {
-          notify: true,
-          readOnly: true,
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * Read-only value that indicates that the last set `src` failed to load.
-         */
-        error: {
-          notify: true,
-          readOnly: true,
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * Can be used to set the width of image (e.g. via binding); size may also be
-         * set via CSS.
-         */
-        width: {
-          observer: '_widthChanged',
-          type: Number,
-          value: null
-        },
-
-        /**
-         * Can be used to set the height of image (e.g. via binding); size may also be
-         * set via CSS.
-         *
-         * @attribute height
-         * @type number
-         * @default null
-         */
-        height: {
-          observer: '_heightChanged',
-          type: Number,
-          value: null
-        },
-      },
-
-      observers: [
-        '_transformChanged(sizing, position)'
-      ],
-
-      ready: function() {
-        var img = this.$.img;
-
-        img.onload = function() {
-          if (this.$.img.src !== this._resolveSrc(this.src)) return;
-
-          this._setLoading(false);
-          this._setLoaded(true);
-          this._setError(false);
-        }.bind(this);
-
-        img.onerror = function() {
-          if (this.$.img.src !== this._resolveSrc(this.src)) return;
-
-          this._reset();
-
-          this._setLoading(false);
-          this._setLoaded(false);
-          this._setError(true);
-        }.bind(this);
-
-        this._resolvedSrc = '';
-      },
-
-      _load: function(src) {
-        if (src) {
-          this.$.img.src = src;
-        } else {
-          this.$.img.removeAttribute('src');
-        }
-        this.$.sizedImgDiv.style.backgroundImage = src ? 'url("' + src + '")' : '';
-
-        this._setLoading(!!src);
-        this._setLoaded(false);
-        this._setError(false);
-      },
-
-      _reset: function() {
-        this.$.img.removeAttribute('src');
-        this.$.sizedImgDiv.style.backgroundImage = '';
-
-        this._setLoading(false);
-        this._setLoaded(false);
-        this._setError(false);
-      },
-
-      _computePlaceholderHidden: function() {
-        return !this.preload || (!this.fade && !this.loading && this.loaded);
-      },
-
-      _computePlaceholderClassName: function() {
-        return (this.preload && this.fade && !this.loading && this.loaded) ? 'faded-out' : '';
-      },
-
-      _computeImgDivHidden: function() {
-        return !this.sizing;
-      },
-
-      _computeImgDivARIAHidden: function() {
-        return this.alt === '' ? 'true' : undefined;
-      },
-
-      _computeImgDivARIALabel: function() {
-        if (this.alt !== null) {
-          return this.alt;
-        }
-
-        // Polymer.ResolveUrl.resolveUrl will resolve '' relative to a URL x to
-        // that URL x, but '' is the default for src.
-        if (this.src === '') {
-          return '';
-        }
-
-        var pathComponents = (new URL(this._resolveSrc(this.src))).pathname.split("/");
-        return pathComponents[pathComponents.length - 1];
-      },
-
-      _computeImgHidden: function() {
-        return !!this.sizing;
-      },
-
-      _widthChanged: function() {
-        this.style.width = isNaN(this.width) ? this.width : this.width + 'px';
-      },
-
-      _heightChanged: function() {
-        this.style.height = isNaN(this.height) ? this.height : this.height + 'px';
-      },
-
-      _preventLoadChanged: function() {
-        if (this.preventLoad || this.loaded) return;
-
-        this._reset();
-        this._load(this.src);
-      },
-
-      _srcChanged: function(newSrc, oldSrc) {
-        var newResolvedSrc = this._resolveSrc(newSrc);
-        if (newResolvedSrc === this._resolvedSrc) return;
-        this._resolvedSrc = newResolvedSrc;
-
-        this._reset();
-        if (!this.preventLoad) {
-          this._load(newSrc);
-        }
-      },
-
-      _placeholderChanged: function() {
-        this.$.placeholder.style.backgroundImage =
-          this.placeholder ? 'url("' + this.placeholder + '")' : '';
-      },
-
-      _transformChanged: function() {
-        var sizedImgDivStyle = this.$.sizedImgDiv.style;
-        var placeholderStyle = this.$.placeholder.style;
-
-        sizedImgDivStyle.backgroundSize =
-        placeholderStyle.backgroundSize =
-          this.sizing;
-
-        sizedImgDivStyle.backgroundPosition =
-        placeholderStyle.backgroundPosition =
-          this.sizing ? this.position : '';
-
-        sizedImgDivStyle.backgroundRepeat =
-        placeholderStyle.backgroundRepeat =
-          this.sizing ? 'no-repeat' : '';
-      },
-
-      _resolveSrc: function(testSrc) {
-        return Polymer.ResolveUrl.resolveUrl(testSrc, this.ownerDocument.baseURI);
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/test/index.html b/systrace/catapult/third_party/polymer/components/iron-image/test/index.html
deleted file mode 100644
index 7145c47..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/test/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-    <meta charset="utf-8">
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'iron-image.html',
-        'iron-image.html?dom=shadow'
-      ]);
-    </script>
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-image/test/iron-image.html b/systrace/catapult/third_party/polymer/components/iron-image/test/iron-image.html
deleted file mode 100644
index 162ff4e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-image/test/iron-image.html
+++ /dev/null
@@ -1,338 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>iron-image</title>
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../polymer/polymer.html">
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-image.html">
-
-    <style is="custom-style">
-      .fixed-width-container {
-        width: 500px;
-      }
-
-      .fixed-width-container iron-image {
-        width: 100%;
-        --iron-image-width: 100%;
-      }
-
-      .fixed-height-container {
-        height: 500px;
-      }
-
-      .fixed-height-container iron-image {
-        height: 100%;
-        --iron-image-height: 100%;
-      }
-    </style>
-  </head>
-  <body>
-    <test-fixture id="TrivialImage">
-      <template>
-        <iron-image></iron-image>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="FixedWidthContainer">
-      <template>
-        <div class="fixed-width-container">
-          <iron-image></iron-image>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="FixedHeightContainer">
-      <template>
-        <div class="fixed-height-container">
-          <iron-image></iron-image>
-        </div>
-      </template>
-    </test-fixture>
-
-    <script>
-      suite('<iron-image>', function() {
-        function randomImageUrl () {
-          return '../demo/polymer.svg?' + Math.random();
-        }
-
-        var image;
-
-        suite('basic behavior', function() {
-          setup(function() {
-            image = fixture('TrivialImage');
-          });
-
-          test('loading, loaded, error are false before any src is set', function() {
-            expect(image.loading).to.be.eql(false);
-            expect(image.loaded).to.be.eql(false);
-            expect(image.error).to.be.eql(false);
-          });
-
-          test('loading, loaded, error are false when src is set to empty string', function(done) {
-            image.addEventListener('loaded-changed', function onLoadedChanged() {
-              if (image.loaded) {
-                image.removeEventListener('loaded-changed', onLoadedChanged);
-                image.addEventListener('loaded-changed', function onLoadedChanged2() {
-                  image.removeEventListener('loaded-changed', onLoadedChanged2);
-
-                  expect(image.loading).to.be.eql(false);
-                  expect(image.loaded).to.be.eql(false);
-                  expect(image.error).to.be.eql(false);
-                  done();
-                });
-
-                expect(image.loading).to.be.eql(false);
-                expect(image.loaded).to.be.eql(true);
-                expect(image.error).to.be.eql(false);
-                image.src = '';
-              }
-            });
-            image.src = randomImageUrl();
-          });
-
-          test('can load images given a src', function(done) {
-            image.addEventListener('loaded-changed', function onLoadedChanged() {
-              image.removeEventListener('loaded-changed', onLoadedChanged);
-
-              try {
-                expect(image.loaded).to.be.eql(true);
-                done();
-              } catch (e) {
-                done(e);
-              }
-            });
-            image.src = randomImageUrl();
-          });
-
-          test('will reload images when src changes', function(done) {
-            var loadCount = 0;
-
-            image.addEventListener('loaded-changed', function onLoadedChanged() {
-              if (image.loaded === true) {
-                loadCount++;
-
-                if (loadCount === 2) {
-                  image.removeEventListener('loaded-changed', onLoadedChanged);
-                  done();
-                } else {
-                  image.src = randomImageUrl();
-                }
-              }
-            });
-
-            image.src = randomImageUrl();
-          });
-
-          test('error property is set when the image fails to load', function(done) {
-            image.addEventListener('error-changed', function onErrorChanged() {
-              assert(image.error, 'image has error property set');
-              image.removeEventListener('error-changed', onErrorChanged);
-              done();
-            });
-
-            image.src = '/this_image_should_not_exist.jpg';
-          });
-
-          // Test for PolymerElements/iron-image#16.
-          test('placeholder is hidden after loading when src is changed from invalid to valid', function(done) {
-            image.preload = true;
-
-            image.addEventListener('error-changed', function onErrorChanged() {
-              image.removeEventListener('error-changed', onErrorChanged);
-
-              assert.equal(image.loading, false, 'errored image loading = false');
-              assert.equal(image.loaded, false, 'errored image loaded = false');
-              assert.equal(image.error, true, 'errored image error = true');
-
-              image.addEventListener('loaded-changed', function onLoadedChanged() {
-                if (!image.loaded) return;
-
-                image.removeEventListener('loaded-changed', onLoadedChanged);
-
-                assert.equal(image.loading, false, 'ok image loading = false');
-                assert.equal(image.loaded, true, 'ok image loaded = true');
-                assert.equal(image.error, false, 'ok image error = false');
-                assert.equal(getComputedStyle(image.$.placeholder).display, 'none', 'placeholder has style.display = none');
-
-                done();
-              });
-
-              image.src = randomImageUrl();
-            });
-
-            image.src = '/this_image_should_not_exist.jpg';
-          });
-
-          // Test for PolymerElements/iron-image#23.
-          test('image is not shown below placeholder if previous image was loaded with' +
-               ' sizing on and current image fails to load', function(done) {
-            image.preload = true;
-            image.sizing = 'cover';
-
-            image.addEventListener('loaded-changed', function onLoadedChanged() {
-              if (!image.loaded) return;
-              image.removeEventListener('loaded-changed', onLoadedChanged);
-
-              assert.notEqual(getComputedStyle(image.$.sizedImgDiv).backgroundImage, 'none', 'image visible after successful load');
-              assert.equal(getComputedStyle(image.$.placeholder).display, 'none', 'placeholder hidden after successful load');
-
-              image.addEventListener('error-changed', function onErrorChanged() {
-                if (!image.error) return;
-                image.removeEventListener('error-changed', onErrorChanged);
-
-                assert.equal(getComputedStyle(image.$.sizedImgDiv).backgroundImage, 'none', 'image hidden after failed load');
-                assert.notEqual(getComputedStyle(image.$.placeholder).display, 'none', 'placeholder visible after failed load');
-
-                done();
-              });
-
-              image.src = '/this_image_should_not_exist.jpg';
-            });
-
-            image.src = randomImageUrl();
-          });
-        });
-
-        suite('--iron-image-width, --iron-image-height', function() {
-          var fixedWidthContainer;
-          var fixedWidthIronImage;
-          var fixedHeightContainer;
-          var fixedHeightIronImage;
-
-          setup(function() {
-            fixedWidthContainer = fixture('FixedWidthContainer');
-            fixedWidthIronImage = fixedWidthContainer.querySelector('iron-image');
-            fixedHeightContainer = fixture('FixedHeightContainer');
-            fixedHeightIronImage = fixedHeightContainer.querySelector('iron-image');
-          });
-
-          test('100% width image fills container', function(done) {
-            fixedWidthIronImage.$.img.addEventListener('load', function onLoadedChanged(e) {
-              fixedWidthIronImage.$.img.removeEventListener('load', onLoadedChanged);
-              Polymer.updateStyles();
-
-              var containerRect = fixedWidthContainer.getBoundingClientRect();
-              var ironImageRect = fixedWidthIronImage.getBoundingClientRect();
-              var wrappedImageRect = fixedWidthIronImage.$.img.getBoundingClientRect();
-
-              expect(containerRect.width).to.be.closeTo(500, 0.5);
-              expect(ironImageRect.width).to.be.closeTo(500, 0.5);
-              expect(wrappedImageRect.width).to.be.closeTo(500, 0.5);
-
-              done();
-            });
-
-            fixedWidthIronImage.src = randomImageUrl();
-          });
-
-          test('100% height image fills container', function(done) {
-            fixedHeightIronImage.$.img.addEventListener('load', function onLoadedChanged(e) {
-              fixedHeightIronImage.$.img.removeEventListener('load', onLoadedChanged);
-              Polymer.updateStyles();
-
-              var containerRect = fixedHeightContainer.getBoundingClientRect();
-              var ironImageRect = fixedHeightIronImage.getBoundingClientRect();
-              var wrappedImageRect = fixedHeightIronImage.$.img.getBoundingClientRect();
-
-              expect(containerRect.height).to.be.closeTo(500, 0.5);
-              expect(ironImageRect.height).to.be.closeTo(500, 0.5);
-              expect(wrappedImageRect.height).to.be.closeTo(500, 0.5);
-
-              done();
-            });
-
-            fixedHeightIronImage.src = randomImageUrl();
-          });
-        });
-
-        suite('accessibility', function() {
-          suite('sizing inactive', function() {
-            var image;
-
-            setup(function() {
-              image = fixture('TrivialImage');
-            });
-
-            test('#sizedImgDiv is hidden', function() {
-              var sizedImgDivStyle = window.getComputedStyle(image.$.sizedImgDiv);
-              assert.strictEqual(sizedImgDivStyle.display, 'none');
-            });
-
-            test('img has no alt text by default', function() {
-              assert.isFalse(image.$.img.hasAttribute('alt'));
-            });
-
-            test('img alt text is empty string when iron-image alt text is empty string', function() {
-              image.alt = '';
-
-              assert.isTrue(image.$.img.hasAttribute('alt'));
-              assert.strictEqual(image.$.img.getAttribute('alt'), '');
-            });
-
-            test('img alt text matches iron-image alt text when defined', function() {
-              image.alt = 'alt text value';
-
-              assert.isTrue(image.$.img.hasAttribute('alt'));
-              assert.strictEqual(image.$.img.getAttribute('alt'), 'alt text value');
-            });
-          });
-
-          suite('sizing active', function() {
-            var image;
-
-            setup(function() {
-              image = fixture('TrivialImage');
-              image.sizing = 'cover';
-            });
-
-            test('inner img is hidden', function() {
-              var imgStyle = window.getComputedStyle(image.$.img);
-              assert.strictEqual(imgStyle.display, 'none');
-            });
-
-            test('#sizedImgDiv has empty aria-label text by default', function() {
-              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-label'));
-              assert.strictEqual(image.$.sizedImgDiv.getAttribute('aria-label'), '');
-            });
-
-            test('#sizedImgDiv has aria-hidden when iron-image alt text is empty string', function() {
-              image.alt = '';
-
-              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-hidden'));
-              var hiddenValue = image.$.sizedImgDiv.getAttribute('aria-hidden');
-              assert.isTrue(hiddenValue === '' || hiddenValue === 'true');
-            });
-
-            test('#sizedImgDiv aria-label matches iron-image alt text when defined', function() {
-              image.alt = 'alt text value';
-
-              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-label'));
-              assert.strictEqual(image.$.sizedImgDiv.getAttribute('aria-label'), 'alt text value');
-            });
-
-            test('#sizedImgDiv aria-label text is last path component of src when iron-image alt text is undefined', function() {
-              image.src = '/some/path.components/file.jpg?a=b&c=d#anchor';
-
-              assert.isTrue(image.$.sizedImgDiv.hasAttribute('aria-label'));
-              assert.strictEqual(image.$.sizedImgDiv.getAttribute('aria-label'), 'file.jpg');
-            });
-          });
-        });
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-input/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/README.md b/systrace/catapult/third_party/polymer/components/iron-input/README.md
deleted file mode 100644
index 24563f4..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-input.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-input.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-input)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-input)_
-
-
-## &lt;iron-input&gt;
-
-`<iron-input>` adds two-way binding and custom validators using `Polymer.IronValidatorBehavior`
-to `<input>`.
-
-### Two-way binding
-
-By default you can only get notified of changes to an `input`'s `value` due to user input:
-
-```html
-<input value="{{myValue::input}}">
-```
-
-`iron-input` adds the `bind-value` property that mirrors the `value` property, and can be used
-for two-way data binding. `bind-value` will notify if it is changed either by user input or by script.
-
-```html
-<input is="iron-input" bind-value="{{myValue}}">
-```
-
-### Custom validators
-
-You can use custom validators that implement `Polymer.IronValidatorBehavior` with `<iron-input>`.
-
-```html
-<input is="iron-input" validator="my-custom-validator">
-```
-
-### Stopping invalid input
-
-It may be desirable to only allow users to enter certain characters. You can use the
-`prevent-invalid-input` and `allowed-pattern` attributes together to accomplish this. This feature
-is separate from validation, and `allowed-pattern` does not affect how the input is validated.
-
-```html
-<!-- only allow characters that match [0-9] -->
-<input is="iron-input" prevent-invalid-input allowed-pattern="[0-9]">
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/bower.json b/systrace/catapult/third_party/polymer/components/iron-input/bower.json
deleted file mode 100644
index 8428fd1..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "iron-input",
-  "version": "1.0.11",
-  "description": "An input element with data binding",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "input"
-  ],
-  "main": "iron-input.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-input.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-input",
-  "ignore": [],
-  "dependencies": {
-    "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#^1.0.0",
-    "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.2",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-input/demo/index.html
deleted file mode 100644
index 59d37b2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/demo/index.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>iron-input demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../iron-input.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../../paper-styles/typography.html">
-  
-  <style is="custom-style">
-
-    .vertical-section {
-      @apply(--paper-font-body1);
-
-      line-height: 40px;
-    }
-
-    code {
-      color: var(--google-grey-700);
-    }
-
-    input[is=iron-input] {
-      width: 100%;
-      box-sizing: border-box;
-    }
-
-    input, button {
-      font-size: 20px;
-      padding: 0.2em;
-    }
-
-  </style>
-</head>
-<body>
-
-  <div class="vertical-section vertical-section-container centered">
-    <template is="dom-bind">
-      <p>
-        <input is="iron-input" bind-value="{{bindValue}}" value="{{value::input}}">
-        <br>
-        bind to <code>bind-value</code>: <b>[[bindValue]]</b>
-        <br>
-        bind to <code>value::input</code>: <b>{{value}}</b>
-      </p>
-
-      <p on-click="setValue">
-        set bind-value to: <input> <button is="paper-button" value="bindValue">set</button>
-        <br>
-        set value to: <input> <button value="value">set</button>
-      </p>
-    </template>
-    <p>only allows these characters:
-    <code>!@#0123456789</code></p>
-    <input is="iron-input" allowed-pattern="[!@#0-9]" prevent-invalid-input>
-
-  </div>
-
-  <script>
-    var scope = document.querySelector('template[is=dom-bind]');
-
-    scope.setValue = function(event) {
-      if (!(event.target instanceof HTMLButtonElement)) {
-        return;
-      }
-      document.querySelector('input[is=iron-input]')[event.target.value] = event.target.previousElementSibling.value;
-    }
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/hero.svg b/systrace/catapult/third_party/polymer/components/iron-input/hero.svg
deleted file mode 100755
index e72ebd3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/hero.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<rect x="49" y="53" width="2" height="18"/>

-	<path d="M188,78H37V44h151V78z M39,76h147V46H39V76z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-input/index.html b/systrace/catapult/third_party/polymer/components/iron-input/index.html
deleted file mode 100644
index ca0dac0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-input</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/iron-input.html b/systrace/catapult/third_party/polymer/components/iron-input/iron-input.html
deleted file mode 100644
index ddb5277..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/iron-input.html
+++ /dev/null
@@ -1,311 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-announcer/iron-a11y-announcer.html">
-<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
-
-<script>
-
-/*
-`<iron-input>` adds two-way binding and custom validators using `Polymer.IronValidatorBehavior`
-to `<input>`.
-
-### Two-way binding
-
-By default you can only get notified of changes to an `input`'s `value` due to user input:
-
-    <input value="{{myValue::input}}">
-
-`iron-input` adds the `bind-value` property that mirrors the `value` property, and can be used
-for two-way data binding. `bind-value` will notify if it is changed either by user input or by script.
-
-    <input is="iron-input" bind-value="{{myValue}}">
-
-### Custom validators
-
-You can use custom validators that implement `Polymer.IronValidatorBehavior` with `<iron-input>`.
-
-    <input is="iron-input" validator="my-custom-validator">
-
-### Stopping invalid input
-
-It may be desirable to only allow users to enter certain characters. You can use the
-`prevent-invalid-input` and `allowed-pattern` attributes together to accomplish this. This feature
-is separate from validation, and `allowed-pattern` does not affect how the input is validated.
-
-    <!-- only allow characters that match [0-9] -->
-    <input is="iron-input" prevent-invalid-input allowed-pattern="[0-9]">
-
-@hero hero.svg
-@demo demo/index.html
-*/
-
-  Polymer({
-
-    is: 'iron-input',
-
-    extends: 'input',
-
-    behaviors: [
-      Polymer.IronValidatableBehavior
-    ],
-
-    properties: {
-
-      /**
-       * Use this property instead of `value` for two-way data binding.
-       */
-      bindValue: {
-        observer: '_bindValueChanged',
-        type: String
-      },
-
-      /**
-       * Set to true to prevent the user from entering invalid input. If `allowedPattern` is set,
-       * any character typed by the user will be matched against that pattern, and rejected if it's not a match.
-       * Pasted input will have each character checked individually; if any character
-       * doesn't match `allowedPattern`, the entire pasted string will be rejected.
-       * If `allowedPattern` is not set, it will use the `type` attribute (only supported for `type=number`).
-       */
-      preventInvalidInput: {
-        type: Boolean
-      },
-
-      /**
-       * Regular expression that list the characters allowed as input.
-       * This pattern represents the allowed characters for the field; as the user inputs text,
-       * each individual character will be checked against the pattern (rather than checking
-       * the entire value as a whole). The recommended format should be a list of allowed characters;
-       * for example, `[a-zA-Z0-9.+-!;:]`
-       */
-      allowedPattern: {
-        type: String,
-        observer: "_allowedPatternChanged"
-      },
-
-      _previousValidInput: {
-        type: String,
-        value: ''
-      },
-
-      _patternAlreadyChecked: {
-        type: Boolean,
-        value: false
-      }
-
-    },
-
-    listeners: {
-      'input': '_onInput',
-      'keypress': '_onKeypress'
-    },
-
-    registered: function() {
-      // Feature detect whether we need to patch dispatchEvent (i.e. on FF and IE).
-      if (!this._canDispatchEventOnDisabled()) {
-        this._origDispatchEvent = this.dispatchEvent;
-        this.dispatchEvent = this._dispatchEventFirefoxIE;
-      }
-    },
-
-    created: function() {
-      Polymer.IronA11yAnnouncer.requestAvailability();
-    },
-
-    _canDispatchEventOnDisabled: function() {
-      var input = document.createElement('input');
-      var canDispatch = false;
-      input.disabled = true;
-
-      input.addEventListener('feature-check-dispatch-event', function() {
-        canDispatch = true;
-      });
-
-      try {
-        input.dispatchEvent(new Event('feature-check-dispatch-event'));
-      } catch(e) {}
-
-      return canDispatch;
-    },
-
-    /**
-     * @this {Node}
-     * @param {!Event} event
-     * @return {boolean}
-     */
-    _dispatchEventFirefoxIE: function(event) {
-      // Due to Firefox bug, events fired on disabled form controls can throw
-      // errors; furthermore, neither IE nor Firefox will actually dispatch
-      // events from disabled form controls; as such, we toggle disable around
-      // the dispatch to allow notifying properties to notify
-      // See issue #47 for details
-      var disabled = this.disabled;
-      this.disabled = false;
-      var defaultPrevented = this._origDispatchEvent(event);
-      this.disabled = disabled;
-      return defaultPrevented
-    },
-
-    get _patternRegExp() {
-      var pattern;
-      if (this.allowedPattern) {
-        pattern = new RegExp(this.allowedPattern);
-      } else {
-        switch (this.type) {
-          case 'number':
-            pattern = /[0-9.,e-]/;
-            break;
-        }
-      }
-      return pattern;
-    },
-
-    ready: function() {
-      this.bindValue = this.value;
-    },
-
-    /**
-     * @suppress {checkTypes}
-     */
-    _bindValueChanged: function() {
-      if (this.value !== this.bindValue) {
-        this.value = !(this.bindValue || this.bindValue === 0 || this.bindValue === false) ? '' : this.bindValue;
-      }
-      // manually notify because we don't want to notify until after setting value
-      this.fire('bind-value-changed', {value: this.bindValue});
-    },
-
-    _allowedPatternChanged: function() {
-      // Force to prevent invalid input when an `allowed-pattern` is set
-      this.preventInvalidInput = this.allowedPattern ? true : false;
-    },
-
-    _onInput: function() {
-      // Need to validate each of the characters pasted if they haven't
-      // been validated inside `_onKeypress` already.
-      if (this.preventInvalidInput && !this._patternAlreadyChecked) {
-        var valid = this._checkPatternValidity();
-        if (!valid) {
-          this._announceInvalidCharacter('Invalid string of characters not entered.');
-          this.value = this._previousValidInput;
-        }
-      }
-
-      this.bindValue = this.value;
-      this._previousValidInput = this.value;
-      this._patternAlreadyChecked = false;
-    },
-
-    _isPrintable: function(event) {
-      // What a control/printable character is varies wildly based on the browser.
-      // - most control characters (arrows, backspace) do not send a `keypress` event
-      //   in Chrome, but the *do* on Firefox
-      // - in Firefox, when they do send a `keypress` event, control chars have
-      //   a charCode = 0, keyCode = xx (for ex. 40 for down arrow)
-      // - printable characters always send a keypress event.
-      // - in Firefox, printable chars always have a keyCode = 0. In Chrome, the keyCode
-      //   always matches the charCode.
-      // None of this makes any sense.
-
-      // For these keys, ASCII code == browser keycode.
-      var anyNonPrintable =
-        (event.keyCode == 8)   ||  // backspace
-        (event.keyCode == 9)   ||  // tab
-        (event.keyCode == 13)  ||  // enter
-        (event.keyCode == 27);     // escape
-
-      // For these keys, make sure it's a browser keycode and not an ASCII code.
-      var mozNonPrintable =
-        (event.keyCode == 19)  ||  // pause
-        (event.keyCode == 20)  ||  // caps lock
-        (event.keyCode == 45)  ||  // insert
-        (event.keyCode == 46)  ||  // delete
-        (event.keyCode == 144) ||  // num lock
-        (event.keyCode == 145) ||  // scroll lock
-        (event.keyCode > 32 && event.keyCode < 41)   || // page up/down, end, home, arrows
-        (event.keyCode > 111 && event.keyCode < 124); // fn keys
-
-      return !anyNonPrintable && !(event.charCode == 0 && mozNonPrintable);
-    },
-
-    _onKeypress: function(event) {
-      if (!this.preventInvalidInput && this.type !== 'number') {
-        return;
-      }
-      var regexp = this._patternRegExp;
-      if (!regexp) {
-        return;
-      }
-
-      // Handle special keys and backspace
-      if (event.metaKey || event.ctrlKey || event.altKey)
-        return;
-
-      // Check the pattern either here or in `_onInput`, but not in both.
-      this._patternAlreadyChecked = true;
-
-      var thisChar = String.fromCharCode(event.charCode);
-      if (this._isPrintable(event) && !regexp.test(thisChar)) {
-        event.preventDefault();
-        this._announceInvalidCharacter('Invalid character ' + thisChar + ' not entered.');
-      }
-    },
-
-    _checkPatternValidity: function() {
-      var regexp = this._patternRegExp;
-      if (!regexp) {
-        return true;
-      }
-      for (var i = 0; i < this.value.length; i++) {
-        if (!regexp.test(this.value[i])) {
-          return false;
-        }
-      }
-      return true;
-    },
-
-    /**
-     * Returns true if `value` is valid. The validator provided in `validator` will be used first,
-     * then any constraints.
-     * @return {boolean} True if the value is valid.
-     */
-    validate: function() {
-      // First, check what the browser thinks. Some inputs (like type=number)
-      // behave weirdly and will set the value to "" if something invalid is
-      // entered, but will set the validity correctly.
-      var valid =  this.checkValidity();
-
-      // Only do extra checking if the browser thought this was valid.
-      if (valid) {
-        // Empty, required input is invalid
-        if (this.required && this.value === '') {
-          valid = false;
-        } else if (this.hasValidator()) {
-          valid = Polymer.IronValidatableBehavior.validate.call(this, this.value);
-        }
-      }
-
-      this.invalid = !valid;
-      this.fire('iron-input-validate');
-      return valid;
-    },
-
-    _announceInvalidCharacter: function(message) {
-      this.fire('iron-announce', { text: message });
-    }
-  });
-
-  /*
-  The `iron-input-validate` event is fired whenever `validate()` is called.
-  @event iron-input-validate
-  */
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/test/disabled-input.html b/systrace/catapult/third_party/polymer/components/iron-input/test/disabled-input.html
deleted file mode 100644
index 06503e5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/test/disabled-input.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<dom-module id="disabled-input">
-  <template>
-    <input is="iron-input" bind-value="{{myValue}}" invalid="{{myInvalid}}" disabled id="input">
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'disabled-input',
-    properties: {
-      myValue: {
-        value: 'foo'
-      },
-
-      myInvalid: {
-        value: false
-      }
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/test/index.html b/systrace/catapult/third_party/polymer/components/iron-input/test/index.html
deleted file mode 100644
index 0e3c37c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>iron-input tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'iron-input.html',
-      'iron-input.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/test/iron-input.html b/systrace/catapult/third_party/polymer/components/iron-input/test/iron-input.html
deleted file mode 100644
index fddf9ae..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/test/iron-input.html
+++ /dev/null
@@ -1,281 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-input tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <link rel="import" href="../iron-input.html">
-  <link rel="import" href="letters-only.html">
-  <link rel="import" href="disabled-input.html">
-
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <input is="iron-input">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="has-value">
-    <template>
-      <input is="iron-input" value="foobar">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="has-bind-value">
-    <template>
-      <input is="iron-input" bind-value="foobar">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="prevent-invalid-input">
-    <template>
-      <input is="iron-input" prevent-invalid-input allowed-pattern="[0-9]">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="prevent-invalid-input-with-pattern">
-    <template>
-      <input is="iron-input" prevent-invalid-input pattern="[a-zA-Z]{3}[0-9]*">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="prevent-invalid-input-has-value">
-    <template>
-      <input is="iron-input" prevent-invalid-input allowed-pattern="[0-9]" value="foobar">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="prevent-invalid-input-has-bind-value">
-    <template>
-      <input is="iron-input" prevent-invalid-input allowed-pattern="[0-9]" bind-value="foobar">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="automatically-prevent-invalid-input-if-allowed-pattern">
-    <template>
-      <input is="iron-input" allowed-pattern="[0-9]">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="no-validator">
-    <template>
-      <input is="iron-input" pattern="[a-zA-Z]{3}[0-9]*">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="has-validator">
-    <template>
-      <letters-only></letters-only>
-      <input is="iron-input" validator="letters-only" pattern="[0-9]*">
-    </template>
-  </test-fixture>
-
-  <test-fixture id="native-and-custom-validator">
-    <template>
-      <letters-only></letters-only>
-      <input is="iron-input" validator="letters-only" pattern="[a-c]*">
-    </template>
-  </test-fixture>
-
-  <template is="dom-bind" id="bind-to-object">
-    <input is="iron-input" id="input" bind-value="{{foo}}">
-  </template>
-
-  <test-fixture id="disabled-input">
-    <template>
-      <disabled-input></disabled-input>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('setting bindValue sets value', function() {
-        var input = fixture('basic');
-        input.bindValue = 'foobar';
-        assert.equal(input.value, input.bindValue, 'value equals to bindValue');
-      });
-
-      test('changing the input triggers an event', function(done) {
-        var input = fixture('basic');
-
-        input.addEventListener('bind-value-changed', function(value) {
-          assert.equal(input.value, input.bindValue, 'value equals to bindValue');
-          done();
-        });
-
-        input.value = "foo";
-        input._onInput();
-      });
-
-      test('default value sets bindValue', function() {
-        var input = fixture('has-value');
-        assert.equal(input.bindValue, input.value, 'bindValue equals value');
-      });
-
-      test('default bindValue sets value', function() {
-        var input = fixture('has-bind-value');
-        assert.equal(input.value, input.bindValue, 'value equals to bindValue');
-      });
-
-      test('set bindValue to undefined', function() {
-        var scope = document.getElementById('bind-to-object');
-        scope.foo = undefined;
-        assert.ok(!scope.$.input.bindValue, 'bindValue is falsy');
-        assert.ok(!scope.$.input.value, 'value is falsy');
-      });
-
-      test('can validate using a complex regex', function() {
-        var input = fixture('no-validator');
-        input.value = '123';
-        input.validate();
-        assert.isTrue(input.invalid, 'input is invalid');
-        input.value = 'foo';
-        input.validate();
-        assert.isFalse(input.invalid, 'input is valid');
-        input.value = 'foo123';
-        input.validate();
-        assert.isFalse(input.invalid, 'input is valid');
-      });
-
-      test('set bindValue to false', function() {
-        var scope = document.getElementById('bind-to-object');
-        scope.foo = false;
-        assert.isFalse(scope.$.input.bindValue);
-        assert.equal(scope.$.input.value, 'false');
-      });
-
-      test('validator used instead of constraints api if provided', function() {
-        var input = fixture('has-validator')[1];
-        input.value = '123';
-        input.validate();
-        assert.isTrue(input.invalid, 'input is invalid');
-      });
-
-      test('prevent invalid input works in _onInput', function() {
-        var input = fixture('prevent-invalid-input');
-        input.value = '123';
-        input._onInput();
-        assert.equal(input.bindValue, '123');
-
-        input.value = '123foo';
-        input._onInput();
-        assert.equal(input.bindValue, '123');
-      });
-
-      test('inputs can be validated', function() {
-        var input = fixture('prevent-invalid-input-with-pattern');
-        input.value = '123';
-        input._onInput();
-        assert.equal(input.bindValue, '123');
-        input.validate();
-        assert.isTrue(input.invalid, 'input is invalid');
-
-        input.value = 'foo';
-        input._onInput();
-        assert.equal(input.bindValue, 'foo');
-        input.validate();
-        assert.isFalse(input.invalid, 'input is valid');
-
-        input.value = 'foo123';
-        input._onInput();
-        assert.equal(input.bindValue, 'foo123');
-        input.validate();
-        assert.isFalse(input.invalid, 'input is valid');
-      });
-
-      test('prevent invalid input works automatically when allowed pattern is set', function() {
-        var input = fixture('automatically-prevent-invalid-input-if-allowed-pattern');
-        input.value = '123';
-        input._onInput();
-        assert.equal(input.bindValue, '123');
-
-        input.value = '123foo';
-        input._onInput();
-        assert.equal(input.bindValue, '123');
-
-        input.allowedPattern = '';
-        input.value = '#123foo BAR!';
-        input._onInput();
-        assert.equal(input.bindValue, '#123foo BAR!');
-
-        input.allowedPattern = '[a-zA-Z]';
-        input.value = 'foo';
-        input._onInput();
-        input.value = 'bar123';
-        input._onInput();
-        assert.equal(input.bindValue, 'foo');
-      });
-
-      test('disabled input doesn\'t throw on Firefox', function() {
-        var el = fixture('disabled-input');
-        var input = el.$.input;
-
-        assert.equal(input.bindValue, 'foo');
-
-        assert.isFalse(el.myInvalid);
-        assert.isTrue(input.disabled);
-      });
-
-      test('browser validation beats custom validation', function() {
-        var input = fixture('native-and-custom-validator')[1];
-        // The input allows any letters, but the browser only allows one
-        // of [abc].
-        input.value = 'aaaa';
-        input.validate();
-        assert.isFalse(input.invalid, 'input is valid');
-
-        // The validator allows this, but the browser doesn't.
-        input.value = 'zzz';
-        input.validate();
-        assert.isTrue(input.invalid, 'input is invalid');
-      });
-    });
-
-    suite('a11y', function() {
-      test('announces invalid characters when _onInput is called', function() {
-        var input = fixture('prevent-invalid-input');
-        input.addEventListener('iron-announce', function(event) {
-          assert.equal(event.detail.text, 'Invalid string of characters not entered.');
-        });
-        input.value = 'foo';
-        input._onInput();
-      });
-
-      test('announces invalid characters on keypress', function() {
-        var input = fixture('prevent-invalid-input');
-        input.addEventListener('iron-announce', function(event) {
-          assert.equal(event.detail.text, 'Invalid character a not entered.');
-        });
-
-        // Simulate key press event.
-        var event = new CustomEvent('keypress', {
-          bubbles: true,
-          cancelable: true
-        });
-        event.charCode = 97 /* a */;
-        input.dispatchEvent(event);
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-input/test/letters-only.html b/systrace/catapult/third_party/polymer/components/iron-input/test/letters-only.html
deleted file mode 100644
index bfc301c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-input/test/letters-only.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'letters-only',
-
-    behaviors: [
-      Polymer.IronValidatorBehavior
-    ],
-
-    validate: function(value) {
-      return !value || value.match(/^[a-zA-Z]*$/) !== null;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/README.md b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/README.md
deleted file mode 100644
index c93e1d6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-jsonp-library.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-jsonp-library.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-jsonp-library)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-jsonp-library)_
-
-
-## &lt;iron-jsonp-library&gt;
-
-Loads specified jsonp library.
-
-Example:
-
-```html
-<iron-jsonp-library
-  library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
-  notify-event="api-load"
-  library-loaded="{{loaded}}"></iron-jsonp-library>
-```
-
-Will emit 'api-load' event when loaded, and set 'loaded' to true
-
-Implemented by  Polymer.IronJsonpLibraryBehavior. Use it
-to create specific library loader elements.
-
-
-
-## Polymer.IronJsonpLibraryBehavior
-
-`Polymer.IronJsonpLibraryBehavior` loads a jsonp library.
-Multiple components can request same library, only one copy will load.
-
-Some libraries require a specific global function be defined.
-If this is the case, specify the `callbackName` property.
-
-You should use an HTML Import to load library dependencies
-when possible instead of using this element.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/bower.json b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/bower.json
deleted file mode 100644
index ef4c8b7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/bower.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "name": "iron-jsonp-library",
-  "version": "2.0.0",
-  "description": "Loads jsonp libraries",
-  "authors": [
-    "Aleks Totic <a@totic.org>",
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-component",
-    "polymer",
-    "behavior"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-jsonp-library.git"
-  },
-  "main": "iron-jsonp-library.html",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-jsonp-library/",
-  "ignore": [
-    "/.*",
-    "/test/"
-  ],
-  "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
-    "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
-    "web-component-tester": "^6.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#1 - 2",
-    "paper-spinner": "PolymerElements/paper-spinner#1 - 2"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "polymer": "Polymer/polymer#^1.9"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-        "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-        "paper-styles": "PolymerElements/paper-styles#^1.0.2",
-        "paper-spinner": "PolymerElements/paper-spinner#^1.0.1",
-        "web-component-tester": "Polymer/web-component-tester#^4.0.0"
-      },
-      "resolutions": {
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/demo/index.html
deleted file mode 100644
index 13abb9a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/demo/index.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-    <title>iron-jsonp-library Demo</title>
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../paper-styles/color.html">
-    <link rel="import" href="../../paper-styles/demo-pages.html">
-    <link rel="import" href="../../paper-spinner/paper-spinner.html">
-    <link rel="import" href="../iron-jsonp-library.html">
-    <style is="custom-style">
-
-      .loading {
-        color: var(--google-grey-500);
-      }
-
-      .success {
-        color: var(--paper-green-800);
-      }
-
-      .failure {
-        color: var(--paper-red-800);
-      }
-
-      paper-spinner {
-        --paper-spinner-layer-1-color: var(--google-grey-500);
-        --paper-spinner-layer-2-color: var(--google-grey-500);
-        --paper-spinner-layer-3-color: var(--google-grey-500);
-        --paper-spinner-layer-4-color: var(--google-grey-500);
-      }
-    </style>
-  </head>
-  <body>
-
-    <div class="vertical-section vertical-section-container centered">
-      <h1>&lt;iron-jsonp-library&gt;</h1>
-      <dom-bind>
-        <template is="dom-bind">
-          <h3>Good loader</h3>
-          <iron-jsonp-library
-            library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
-            notify-event="api-load"
-            library-loaded="{{loaded}}"
-            library-error-message="{{errorMessage}}"></iron-jsonp-library>
-          <template is="dom-if" if="{{loaded}}">
-            <p class="success">The <code>Google+ API</code> has been loaded</p>
-          </template>
-          <template is="dom-if" if="{{!loaded}}">
-            <template is="dom-if" if="{{errorMessage}}">
-              <p class="failure">{{errorMessage}}</p>
-            </template>
-            <template is="dom-if" if="{{!errorMessage}}">
-              <p class="loading">Loading...</p>
-            </template>
-          </template>
-        </template>
-      </dom-bind>
-
-      <hr>
-      <dom-bind>
-        <template is="dom-bind">
-          <h3>Bad loader</h3>
-          <iron-jsonp-library
-            library-url="https://badapis.google.com/js/plusone.js?onload=%%callback%%"
-            notify-event="api-load"
-            library-loaded="{{loaded}}"
-            library-error-message="{{errorMessage}}"></iron-jsonp-library>
-          <template is="dom-if" if="{{loaded}}">
-            <p><code>badapis</code> has been loaded</p>
-          </template>
-          <template is="dom-if" if="{{!loaded}}">
-            <template is="dom-if" if="{{errorMessage}}">
-              <p class="failure">{{errorMessage}}</p>
-            </template>
-            <template is="dom-if" if="{{!errorMessage}}">
-              <p class="loading">Loading...</p>
-            </template>
-          </template>
-        </template>
-      </dom-bind>
-
-      <hr>
-      <dom-bind>
-        <template is="dom-bind" id="delayedLoader">
-          <h3>Delayed libraryUrl loader</h3>
-          <iron-jsonp-library
-            library-url="{{libraryUrl}}"
-            library-loaded="{{loaded}}"
-            library-error-message="{{errorMessage}}">
-          </iron-jsonp-library>
-          <template is="dom-if" if="{{loaded}}">
-            <p><code>{{libraryUrl}}</code> has been loaded</p>
-          </template>
-          <template is="dom-if" if="{{!loaded}}">
-            <template is="dom-if" if="{{errorMessage}}">
-              <p class="failure">{{errorMessage}}</p>
-            </template>
-            <template is="dom-if" if="{{!errorMessage}}">
-              <p class="loading">Loading...<code>{{libraryUrl}}</code></p>
-            </template>
-          </template>
-        </template>
-      </dom-bind>
-
-    </div>
-
-    <script>
-      // kick off delayed loader by setting libraryUrl
-      window.setTimeout(function() {
-        var t = document.querySelector('#delayedLoader');
-
-        if (Polymer.Element) {
-          // value is set on the dom-bind in 2.x
-          t.parentNode.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
-        } else {
-          // value is set on template in Polymer 1.x
-          t.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
-        }
-      },
-      1000);
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/hero.svg b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/hero.svg
deleted file mode 100755
index b02c565..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/hero.svg
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<circle cx="112" cy="36" r="4"/>

-	<circle cx="112" cy="90" r="4"/>

-	<circle cx="91" cy="98" r="4"/>

-	<circle cx="91" cy="29" r="4"/>

-	<circle cx="133" cy="29" r="4"/>

-	<circle cx="133" cy="97" r="4"/>

-	<circle cx="56" cy="63" r="4"/>

-	<circle cx="168" cy="63" r="4"/>

-	<circle cx="99" cy="63" r="4"/>

-	<circle cx="125" cy="63" r="4"/>

-	<path d="M90.8,98.5c-19.6,0-35.5-15.9-35.5-35.5s15.9-35.5,35.5-35.5s35.5,15.9,35.5,35.5S110.3,98.5,90.8,98.5z M90.8,29.5

-		c-18.5,0-33.5,15-33.5,33.5s15,33.5,33.5,33.5s33.5-15,33.5-33.5S109.2,29.5,90.8,29.5z"/>

-	<path d="M133.2,98.5c-19.6,0-35.5-15.9-35.5-35.5s15.9-35.5,35.5-35.5s35.5,15.9,35.5,35.5S152.8,98.5,133.2,98.5z M133.2,29.5

-		c-18.5,0-33.5,15-33.5,33.5s15,33.5,33.5,33.5s33.5-15,33.5-33.5S151.7,29.5,133.2,29.5z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/index.html b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/index.html
deleted file mode 100644
index 487bb5c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/iron-jsonp-library.html b/systrace/catapult/third_party/polymer/components/iron-jsonp-library/iron-jsonp-library.html
deleted file mode 100644
index 09277da..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-jsonp-library/iron-jsonp-library.html
+++ /dev/null
@@ -1,271 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-(function() {
-  "use strict";
-  /**
-   * `Polymer.IronJsonpLibraryBehavior` loads a jsonp library.
-   * Multiple components can request same library, only one copy will load.
-   *
-   * Some libraries require a specific global function be defined.
-   * If this is the case, specify the `callbackName` property.
-   *
-   * You should use an HTML Import to load library dependencies
-   * when possible instead of using this element.
-   *
-   * @hero hero.svg
-   * @demo demo/index.html
-   * @polymerBehavior
-   */
-  Polymer.IronJsonpLibraryBehavior = {
-
-    properties: {
-      /**
-       * True if library has been successfully loaded
-       */
-      libraryLoaded: {
-        type: Boolean,
-        value: false,
-        notify: true,
-        readOnly: true
-      },
-      /**
-       * Not null if library has failed to load
-       */
-      libraryErrorMessage: {
-        type: String,
-        value: null,
-        notify: true,
-        readOnly: true
-      }
-      // Following properties are to be set by behavior users
-      /**
-       * Library url. Must contain string `%%callback%%`.
-       *
-       * `%%callback%%` is a placeholder for jsonp wrapper function name
-       *
-       * Ex: https://maps.googleapis.com/maps/api/js?callback=%%callback%%
-       * @property libraryUrl
-       */
-      /**
-       * Set if library requires specific callback name.
-       * Name will be automatically generated if not set.
-       * @property callbackName
-       */
-      /**
-       * name of event to be emitted when library loads. Standard is `api-load`
-       * @property notifyEvent
-       */
-      /**
-       * event with name specified in `notifyEvent` attribute
-       * will fire upon successful load2
-       * @event `notifyEvent`
-       */
-    },
-
-    observers: [
-      '_libraryUrlChanged(libraryUrl)'
-    ],
-
-    _libraryUrlChanged: function(libraryUrl) {
-      // can't load before ready because notifyEvent might not be set
-      if (this._isReady && this.libraryUrl)
-        this._loadLibrary();
-    },
-
-    _libraryLoadCallback: function(err, result) {
-      if (err) {
-        Polymer.Base._warn("Library load failed:", err.message);
-        this._setLibraryErrorMessage(err.message);
-      }
-      else {
-        this._setLibraryErrorMessage(null);
-        this._setLibraryLoaded(true);
-        if (this.notifyEvent)
-          this.fire(this.notifyEvent, result, {composed: true});
-      }
-    },
-
-    /** loads the library, and fires this.notifyEvent upon completion */
-    _loadLibrary: function() {
-      LoaderMap.require(
-        this.libraryUrl,
-        this._libraryLoadCallback.bind(this),
-        this.callbackName
-      );
-    },
-
-    ready: function() {
-      this._isReady = true;
-      if (this.libraryUrl)
-        this._loadLibrary();
-    }
-  };
-
-  /**
-   * LoaderMap keeps track of all Loaders
-   */
-  var LoaderMap = {
-    apiMap: {}, // { hash -> Loader }
-
-    /**
-     * @param {Function} notifyCallback loaded callback fn(result)
-     * @param {string} jsonpCallbackName name of jsonpcallback. If API does not provide it, leave empty. Optional.
-     */
-    require: function(url, notifyCallback, jsonpCallbackName) {
-
-      // make hashable string form url
-      var name = this.nameFromUrl(url);
-
-      // create a loader as needed
-      if (!this.apiMap[name])
-        this.apiMap[name] = new Loader(name, url, jsonpCallbackName);
-
-      // ask for notification
-      this.apiMap[name].requestNotify(notifyCallback);
-    },
-
-    nameFromUrl: function(url) {
-      return url.replace(/[\:\/\%\?\&\.\=\-\,]/g, '_') + '_api';
-    }
-  };
-
-  /** @constructor */
-  var Loader = function(name, url, callbackName) {
-    this.notifiers = [];  // array of notifyFn [ notifyFn* ]
-
-    // callback is specified either as callback name
-    // or computed dynamically if url has callbackMacro in it
-    if (!callbackName) {
-      if (url.indexOf(this.callbackMacro) >= 0) {
-        callbackName = name + '_loaded';
-        url = url.replace(this.callbackMacro, callbackName);
-      } else {
-        this.error = new Error('IronJsonpLibraryBehavior a %%callback%% parameter is required in libraryUrl');
-        // TODO(sjmiles): we should probably fallback to listening to script.load
-        return;
-      }
-    }
-    this.callbackName = callbackName;
-    window[this.callbackName] = this.success.bind(this);
-    this.addScript(url);
-  };
-
-  Loader.prototype = {
-
-    callbackMacro: '%%callback%%',
-    loaded: false,
-
-    addScript: function(src) {
-      var script = document.createElement('script');
-      script.src = src;
-      script.onerror = this.handleError.bind(this);
-      var s = document.querySelector('script') || document.body;
-      s.parentNode.insertBefore(script, s);
-      this.script = script;
-    },
-
-    removeScript: function() {
-      if (this.script.parentNode) {
-        this.script.parentNode.removeChild(this.script);
-      }
-      this.script = null;
-    },
-
-    handleError: function(ev) {
-      this.error = new Error("Library failed to load");
-      this.notifyAll();
-      this.cleanup();
-    },
-
-    success: function() {
-      this.loaded = true;
-      this.result = Array.prototype.slice.call(arguments);
-      this.notifyAll();
-      this.cleanup();
-    },
-
-    cleanup: function() {
-      delete window[this.callbackName];
-    },
-
-    notifyAll: function() {
-      this.notifiers.forEach( function(notifyCallback) {
-        notifyCallback(this.error, this.result);
-      }.bind(this));
-      this.notifiers = [];
-    },
-
-    requestNotify: function(notifyCallback) {
-      if (this.loaded || this.error) {
-        notifyCallback( this.error, this.result);
-      } else {
-        this.notifiers.push(notifyCallback);
-      }
-    }
-  };
-})();
-</script>
-
-<!--
-  Loads specified jsonp library.
-
-  Example:
-
-      <iron-jsonp-library
-        library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
-        notify-event="api-load"
-        library-loaded="{{loaded}}"></iron-jsonp-library>
-
-  Will emit 'api-load' event when loaded, and set 'loaded' to true
-
-  Implemented by  Polymer.IronJsonpLibraryBehavior. Use it
-  to create specific library loader elements.
-
-  @demo
--->
-<script>
-  Polymer({
-
-    is: 'iron-jsonp-library',
-
-    behaviors: [ Polymer.IronJsonpLibraryBehavior ],
-
-    properties: {
-      /**
-       * Library url. Must contain string `%%callback%%`.
-       *
-       * `%%callback%%` is a placeholder for jsonp wrapper function name
-       *
-       * Ex: https://maps.googleapis.com/maps/api/js?callback=%%callback%%
-       */
-      libraryUrl: String,
-      /**
-       * Set if library requires specific callback name.
-       * Name will be automatically generated if not set.
-       */
-      callbackName: String,
-      /**
-       * event with name specified in 'notifyEvent' attribute
-       * will fire upon successful load
-       */
-      notifyEvent: String
-      /**
-       * event with name specified in 'notifyEvent' attribute
-       * will fire upon successful load
-       * @event `notifyEvent`
-       */
-
-    }
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-location/CONTRIBUTING.md
deleted file mode 100644
index cfda1a5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/lebawa/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/lebawa/edit?html,output](https://jsbin.com/lebawa/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/README.md b/systrace/catapult/third_party/polymer/components/iron-location/README.md
deleted file mode 100644
index 702bd5e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-location.html  iron-query-params.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-location.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-location)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-location)_
-
-
-##&lt;iron-location&gt;
-
-The `iron-location` element manages binding to and from the current URL.
-
-iron-location is the first, and lowest level element in the Polymer team's
-routing system. This is a beta release of iron-location as we continue work
-on higher level elements, and as such iron-location may undergo breaking
-changes.
-
-#### Properties
-
-When the URL is: `/search?query=583#details` iron-location's properties will be:
-
-* path: `'/search'`
-* query: `'query=583'`
-* hash: `'details'`
-
-These bindings are bidirectional. Modifying them will in turn modify the URL.
-
-iron-location is only active while it is attached to the document.
-
-#### Links
-
-While iron-location is active in the document it will intercept clicks on links
-within your site, updating the URL pushing the updated URL out through the
-databinding system. iron-location only intercepts clicks with the intent to
-open in the same window, so middle mouse clicks and ctrl/cmd clicks work fine.
-
-You can customize this behavior with the `urlSpaceRegex`.
-
-#### Dwell Time
-
-iron-location protects against accidental history spamming by only adding
-entries to the user's history if the URL stays unchanged for `dwellTime`
-milliseconds.
-
-
-
-<!-- No docs for <iron-query-params> found. -->
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/bower.json b/systrace/catapult/third_party/polymer/components/iron-location/bower.json
deleted file mode 100644
index 9935b0b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/bower.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "iron-location",
-  "version": "0.8.11",
-  "description": "Bidirectional data binding into the page's URL.",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "routing"
-  ],
-  "main": [
-    "iron-location.html",
-    "iron-query-params.html"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-location.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-location",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "promise-polyfill": "polymerlabs/promise-polyfill#^1.0.0",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-flex-layout": "polymerelements/iron-flex-layout#^1.0.0",
-    "paper-input": "polymerelements/paper-input#^1.0.0",
-    "paper-slider": "polymerelements/paper-slider#^1.0.0",
-    "paper-styles": "polymerelements/paper-styles#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.2.3"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-location/demo/index.html
deleted file mode 100644
index 19d80bb..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/demo/index.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-location</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../iron-location.html">
-  <link rel="import" href="../../paper-styles/typography.html">
-  <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
-  <link rel="import" href="../../paper-input/paper-input.html">
-  <link rel="import" href="../../paper-slider/paper-slider.html">
-  <link rel="import" href="../../iron-demo-helpers/url-bar.html">
-  <link rel="stylesheet" href="../../paper-styles/demo.css">
-</head>
-<body>
-  <url-bar></url-bar>
-
-  <dom-module id="iron-location-demo">
-    <template>
-      <style>
-        div.inputs {
-          margin-bottom: 15px;
-        }
-        label {
-          display: inline-block;
-          width: 100px;
-        }
-
-        h3 {
-          padding: 0;
-          margin: 0;
-        }
-
-        .inputs, .history_entries {
-          @apply(--layout-vertical);
-          @apply(--layout-flex);
-          padding: 20px;
-          max-width: 500px;
-        }
-
-        .container {
-          @apply(--layout-horizontal);
-        }
-      </style>
-      <iron-location path="{{path}}" hash="{{hash}}" query="{{query}}"
-                     dwell-time="{{dwellTime}}">
-      </iron-location>
-
-      <div class="container">
-        <div class="inputs">
-          <h3>URL</h3>
-          <paper-input label="path" value="{{path}}" always-float-label>
-          </paper-input>
-          <paper-input label="hash" value="{{hash}}" always-float-label>
-          </paper-input>
-          <paper-input label='query' value='{{query}}' always-float-label>
-          </paper-input>
-        </div>
-        <div class="history_entries">
-          <h3>Dwell Time</h3>
-          <p>
-            iron-location won't add extraneous entries to the browser's history
-            when changes come in quick succession.
-          </p>
-          <p>
-            A new history entry will only be added if iron-location stays in
-            the same state longer than dwellTime.
-          </p>
-          <div>
-            <label>History added: </label>
-            {{historyElementsAdded}} entries
-          </div>
-          <div>
-            <label>Dwell time:</label>
-            {{inSeconds(dwellTime)}}s
-          </div>
-          <paper-slider min="-1" max="5000" value="2000" step="100"
-                        immediate-value="{{dwellTime}}">
-          </paper-slider>
-        </div>
-      </div>
-    </template>
-    <script>
-      window.addEventListener('WebComponentsReady', function() {
-        Polymer({
-          is: 'iron-location-demo',
-          properties: {
-            historyElementsAdded: {
-              type: Number
-            }
-          },
-          observers: [
-            'checkHistorySize(path, hash, query, startingHistoryLength)'
-          ],
-          ready: function() {
-            this.startingHistoryLength = window.history.length;
-          },
-          checkHistorySize: function() {
-            this.historyElementsAdded =
-                window.history.length - this.startingHistoryLength;
-          },
-          inSeconds: function(dwellTime) {
-            if (dwellTime === -1) {
-              return -1;
-            }
-            return (Math.round(dwellTime / 100) / 10)
-          }
-        });
-      });
-    </script>
-  </dom-module>
-
-  <iron-location-demo></iron-location-demo>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/demo/iron-query-params.html b/systrace/catapult/third_party/polymer/components/iron-location/demo/iron-query-params.html
deleted file mode 100644
index a7d753a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/demo/iron-query-params.html
+++ /dev/null
@@ -1,119 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-query-params</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-query-params.html">
-  <link rel="import" href="../../paper-styles/classes/typography.html">
-  <link rel="import" href="../../iron-flex-layout/classes/iron-flex-layout.html">
-  <link rel="import" href="../../paper-input/paper-input.html">
-  <link rel="stylesheet" href="../../paper-styles/demo.css">
-</head>
-<body>
-
-  <dom-module id='iron-query-params-demo'>
-    <template>
-      <style>
-        div.inputs {
-          margin-bottom: 15px;
-        }
-        label {
-          display: inline-block;
-          width: 100px;
-        }
-        span.seconds {
-        }
-        [layout] {
-          @apply(--layout);
-        }
-        [layout][horizontal] {
-          @apply(--layout-horizontal);
-        }
-        [layout][horizontal] > div {
-          padding: 20px;
-          max-width: 500px;
-        }
-        [layout][vertical] {
-          @apply(--layout-vertical);
-        }
-        [layout][flex] {
-          @apply(--layout-flex);
-        }
-        h3 {
-          padding: 0;
-          margin: 0;
-        }
-      </style>
-      <iron-query-params
-          params-string='{{paramString}}' params-object='{{params}}'>
-      </iron-query-params>
-
-      <div layout horizontal>
-        <div layout vertical flex class='inputs'>
-          <paper-input label='params as string'
-                       value='{{paramString}}' always-float-label>
-          </paper-input>
-          <paper-input label='params as object' value='{{paramsString}}'
-                       invalid='{{paramsInvalid}}'
-                       error-message='Should be legal JSON'
-                       always-float-label>
-          </paper-input>
-        </div>
-      </div>
-    </template>
-    <script>
-      window.addEventListener('WebComponentsReady', function() {
-        Polymer({
-          is: 'iron-query-params-demo',
-          properties: {
-            paramsString: {
-              observer: 'paramsStringChanged'
-            },
-            params: {
-              observer: 'paramsChanged'
-            },
-            paramsInvalid: {
-              value: false,
-            },
-          },
-          paramsStringChanged: function() {
-            if (this.ignore) {
-              return;
-            }
-            this.ignore = true;
-            try {
-              this.params = JSON.parse(this.paramsString);
-              this.paramsInvalid = false;
-            } catch(_) {
-              this.paramsInvalid = true;
-            }
-            this.ignore = false;
-          },
-          paramsChanged: function() {
-            if (this.ignore) {
-              return;
-            }
-            this.ignore = true;
-            this.paramsString = JSON.stringify(this.params);
-            this.paramsInvalid = false;
-            this.ignore = false;
-          }
-        });
-      });
-    </script>
-  </dom-module>
-
-  <iron-query-params-demo></iron-query-params-demo>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/index.html b/systrace/catapult/third_party/polymer/components/iron-location/index.html
deleted file mode 100644
index 8ded210..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-location</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/iron-location.html b/systrace/catapult/third_party/polymer/components/iron-location/iron-location.html
deleted file mode 100644
index eda1406..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/iron-location.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-
-The `iron-location` element manages binding to and from the current URL.
-
-iron-location is the first, and lowest level element in the Polymer team's
-routing system. This is a beta release of iron-location as we continue work
-on higher level elements, and as such iron-location may undergo breaking
-changes.
-
-#### Properties
-
-When the URL is: `/search?query=583#details` iron-location's properties will be:
-
-  - path: `'/search'`
-  - query: `'query=583'`
-  - hash: `'details'`
-
-These bindings are bidirectional. Modifying them will in turn modify the URL.
-
-iron-location is only active while it is attached to the document.
-
-#### Links
-
-While iron-location is active in the document it will intercept clicks on links
-within your site, updating the URL pushing the updated URL out through the
-databinding system. iron-location only intercepts clicks with the intent to
-open in the same window, so middle mouse clicks and ctrl/cmd clicks work fine.
-
-You can customize this behavior with the `urlSpaceRegex`.
-
-#### Dwell Time
-
-iron-location protects against accidental history spamming by only adding
-entries to the user's history if the URL stays unchanged for `dwellTime`
-milliseconds.
-
-@demo demo/index.html
-
- -->
-<script>
-  (function() {
-    'use strict';
-
-    Polymer({
-      is: 'iron-location',
-      properties: {
-        /**
-         * The pathname component of the URL.
-         */
-        path: {
-          type: String,
-          notify: true,
-          value: function() {
-            return window.decodeURIComponent(window.location.pathname);
-          }
-        },
-        /**
-         * The query string portion of the URL.
-         */
-        query: {
-          type: String,
-          notify: true,
-          value: function() {
-            return window.location.search.slice(1);
-          }
-        },
-        /**
-         * The hash component of the URL.
-         */
-        hash: {
-          type: String,
-          notify: true,
-          value: function() {
-            return window.decodeURIComponent(window.location.hash.slice(1));
-          }
-        },
-        /**
-         * If the user was on a URL for less than `dwellTime` milliseconds, it
-         * won't be added to the browser's history, but instead will be replaced
-         * by the next entry.
-         *
-         * This is to prevent large numbers of entries from clogging up the user's
-         * browser history. Disable by setting to a negative number.
-         */
-        dwellTime: {
-          type: Number,
-          value: 2000
-        },
-
-        /**
-         * A regexp that defines the set of URLs that should be considered part
-         * of this web app.
-         *
-         * Clicking on a link that matches this regex won't result in a full page
-         * navigation, but will instead just update the URL state in place.
-         *
-         * This regexp is given everything after the origin in an absolute
-         * URL. So to match just URLs that start with /search/ do:
-         *     url-space-regex="^/search/"
-         *
-         * @type {string|RegExp}
-         */
-        urlSpaceRegex: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * urlSpaceRegex, but coerced into a regexp.
-         *
-         * @type {RegExp}
-         */
-        _urlSpaceRegExp: {
-          computed: '_makeRegExp(urlSpaceRegex)'
-        },
-
-        _lastChangedAt: {
-          type: Number
-        },
-
-        _initialized: {
-          type: Boolean,
-          value: false
-        }
-      },
-      hostAttributes: {
-        hidden: true
-      },
-      observers: [
-        '_updateUrl(path, query, hash)'
-      ],
-      attached: function() {
-        this.listen(window, 'hashchange', '_hashChanged');
-        this.listen(window, 'location-changed', '_urlChanged');
-        this.listen(window, 'popstate', '_urlChanged');
-        this.listen(/** @type {!HTMLBodyElement} */(document.body), 'click', '_globalOnClick');
-        // Give a 200ms grace period to make initial redirects without any
-        // additions to the user's history.
-        this._lastChangedAt = window.performance.now() - (this.dwellTime - 200);
-
-        this._initialized = true;
-        this._urlChanged();
-      },
-      detached: function() {
-        this.unlisten(window, 'hashchange', '_hashChanged');
-        this.unlisten(window, 'location-changed', '_urlChanged');
-        this.unlisten(window, 'popstate', '_urlChanged');
-        this.unlisten(/** @type {!HTMLBodyElement} */(document.body), 'click', '_globalOnClick');
-        this._initialized = false;
-      },
-      _hashChanged: function() {
-        this.hash = window.decodeURIComponent(window.location.hash.substring(1));
-      },
-      _urlChanged: function() {
-        // We want to extract all info out of the updated URL before we
-        // try to write anything back into it.
-        //
-        // i.e. without _dontUpdateUrl we'd overwrite the new path with the old
-        // one when we set this.hash. Likewise for query.
-        this._dontUpdateUrl = true;
-        this._hashChanged();
-        this.path = window.decodeURIComponent(window.location.pathname);
-        this.query = window.location.search.substring(1);
-        this._dontUpdateUrl = false;
-        this._updateUrl();
-      },
-      _getUrl: function() {
-        var partiallyEncodedPath = window.encodeURI(
-            this.path).replace(/\#/g, '%23').replace(/\?/g, '%3F');
-        var partiallyEncodedQuery = '';
-        if (this.query) {
-          partiallyEncodedQuery = '?' + this.query.replace(/\#/g, '%23');
-        }
-        var partiallyEncodedHash = '';
-        if (this.hash) {
-          partiallyEncodedHash = '#' + window.encodeURI(this.hash);
-        }
-        return (
-            partiallyEncodedPath + partiallyEncodedQuery + partiallyEncodedHash);
-      },
-      _updateUrl: function() {
-        if (this._dontUpdateUrl || !this._initialized) {
-          return;
-        }
-        if (this.path === window.decodeURIComponent(window.location.pathname) &&
-            this.query === window.location.search.substring(1) &&
-            this.hash === window.decodeURIComponent(
-                window.location.hash.substring(1))) {
-          // Nothing to do, the current URL is a representation of our properties.
-          return;
-        }
-        var newUrl = this._getUrl();
-        // Need to use a full URL in case the containing page has a base URI.
-        var fullNewUrl = new URL(
-            newUrl, window.location.protocol + '//' + window.location.host).href;
-        var now = window.performance.now();
-        var shouldReplace =
-            this._lastChangedAt + this.dwellTime > now;
-        this._lastChangedAt = now;
-        if (shouldReplace) {
-          window.history.replaceState({}, '', fullNewUrl);
-        } else {
-          window.history.pushState({}, '', fullNewUrl);
-        }
-        this.fire('location-changed', {}, {node: window});
-      },
-      /**
-       * A necessary evil so that links work as expected. Does its best to
-       * bail out early if possible.
-       *
-       * @param {MouseEvent} event .
-       */
-      _globalOnClick: function(event) {
-        // If another event handler has stopped this event then there's nothing
-        // for us to do. This can happen e.g. when there are multiple
-        // iron-location elements in a page.
-        if (event.defaultPrevented) {
-          return;
-        }
-        var href = this._getSameOriginLinkHref(event);
-        if (!href) {
-          return;
-        }
-        event.preventDefault();
-        // If the navigation is to the current page we shouldn't add a history
-        // entry or fire a change event.
-        if (href === window.location.href) {
-          return;
-        }
-        window.history.pushState({}, '', href);
-        this.fire('location-changed', {}, {node: window});
-      },
-      /**
-       * Returns the absolute URL of the link (if any) that this click event
-       * is clicking on, if we can and should override the resulting full
-       * page navigation. Returns null otherwise.
-       *
-       * @param {MouseEvent} event .
-       * @return {string?} .
-       */
-      _getSameOriginLinkHref: function(event) {
-        // We only care about left-clicks.
-        if (event.button !== 0) {
-          return null;
-        }
-        // We don't want modified clicks, where the intent is to open the page
-        // in a new tab.
-        if (event.metaKey || event.ctrlKey) {
-          return null;
-        }
-        var eventPath = Polymer.dom(event).path;
-        var anchor = null;
-        for (var i = 0; i < eventPath.length; i++) {
-          var element = eventPath[i];
-          if (element.tagName === 'A' && element.href) {
-            anchor = element;
-            break;
-          }
-        }
-
-        // If there's no link there's nothing to do.
-        if (!anchor) {
-          return null;
-        }
-
-        // Target blank is a new tab, don't intercept.
-        if (anchor.target === '_blank') {
-          return null;
-        }
-        // If the link is for an existing parent frame, don't intercept.
-        if ((anchor.target === '_top' ||
-             anchor.target === '_parent') &&
-            window.top !== window) {
-          return null;
-        }
-
-        var href = anchor.href;
-
-        // It only makes sense for us to intercept same-origin navigations.
-        // pushState/replaceState don't work with cross-origin links.
-        var url;
-        if (document.baseURI != null) {
-          url = new URL(href, /** @type {string} */(document.baseURI));
-        } else {
-          url = new URL(href);
-        }
-
-        var origin;
-
-        // IE Polyfill
-        if (window.location.origin) {
-          origin = window.location.origin;
-        } else {
-          origin = window.location.protocol + '//' + window.location.hostname;
-
-          if (window.location.port) {
-            origin += ':' + window.location.port;
-          }
-        }
-
-        if (url.origin !== origin) {
-          return null;
-        }
-        var normalizedHref = url.pathname + url.search + url.hash;
-
-        // If we've been configured not to handle this url... don't handle it!
-        if (this._urlSpaceRegExp &&
-            !this._urlSpaceRegExp.test(normalizedHref)) {
-          return null;
-        }
-        // Need to use a full URL in case the containing page has a base URI.
-        var fullNormalizedHref = new URL(
-            normalizedHref, window.location.href).href;
-        return fullNormalizedHref;
-      },
-      _makeRegExp: function(urlSpaceRegex) {
-        return RegExp(urlSpaceRegex);
-      }
-    });
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/iron-query-params.html b/systrace/catapult/third_party/polymer/components/iron-location/iron-query-params.html
deleted file mode 100644
index edcc3e1..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/iron-query-params.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-
-<script>
-  'use strict';
-
-  Polymer({
-    is: 'iron-query-params',
-    properties: {
-      paramsString: {
-        type: String,
-        notify: true,
-        observer: 'paramsStringChanged',
-      },
-      paramsObject: {
-        type: Object,
-        notify: true,
-        value: function() {
-          return {};
-        }
-      },
-      _dontReact: {
-        type: Boolean,
-        value: false
-      }
-    },
-    hostAttributes: {
-      hidden: true
-    },
-    observers: [
-      'paramsObjectChanged(paramsObject.*)'
-    ],
-    paramsStringChanged: function() {
-      this._dontReact = true;
-      this.paramsObject = this._decodeParams(this.paramsString);
-      this._dontReact = false;
-    },
-    paramsObjectChanged: function() {
-      if (this._dontReact) {
-        return;
-      }
-      this.paramsString = this._encodeParams(this.paramsObject)
-          .replace(/%3F/g, '?').replace(/%2F/g, '/').replace(/'/g, '%27');
-    },
-    _encodeParams: function(params) {
-      var encodedParams = [];
-      for (var key in params) {
-        var value = params[key];
-        if (value === '') {
-          encodedParams.push(encodeURIComponent(key));
-        } else if (value) {
-          encodedParams.push(
-              encodeURIComponent(key) +
-              '=' +
-              encodeURIComponent(value.toString())
-          );
-        }
-      }
-      return encodedParams.join('&');
-    },
-    _decodeParams: function(paramString) {
-      var params = {};
-
-      // Work around a bug in decodeURIComponent where + is not
-      // converted to spaces:
-      paramString = (paramString || '').replace(/\+/g, '%20');
-
-      var paramList = paramString.split('&');
-      for (var i = 0; i < paramList.length; i++) {
-        var param = paramList[i].split('=');
-        if (param[0]) {
-          params[decodeURIComponent(param[0])] =
-              decodeURIComponent(param[1] || '');
-        }
-      }
-      return params;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/index.html b/systrace/catapult/third_party/polymer/components/iron-location/test/index.html
deleted file mode 100644
index ce67fdf..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <meta charset="utf-8">
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'iron-location.html',
-        'iron-query-params.html',
-        'initialization-tests.html',
-        'integration.html'
-      ]);
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-cases.html b/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-cases.html
deleted file mode 100644
index f8bde4f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-cases.html
+++ /dev/null
@@ -1,277 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel='import' href='../iron-location.html'>
-<link rel='import' href='../../polymer/polymer.html'>
-
-<script>
-  Polymer({
-    is: 'default-value',
-    properties: {
-      val: {
-        type: String,
-        notify: true,
-        value: 'default-value'
-      }
-    },
-  });
-
-  Polymer({
-    is: 'on-attached',
-    properties: {
-      val: {
-        type: String,
-        notify: true,
-        value: 'on-attached-default-value'
-      }
-    },
-    attached: function() {
-      if (this.val === 'on-attached-default-value') {
-        this.val = 'on-attached';
-      }
-    }
-  });
-
-  Polymer({
-    is: 'on-ready',
-    properties: {
-      val: {
-        type: String,
-        notify: true,
-        value: 'on-ready-default-value'
-      }
-    },
-    ready: function() {
-      this.val = 'on-ready';
-    }
-  });
-
-  Polymer({
-    is: 'on-timeout',
-    properties: {
-      val: {
-        type: String,
-        notify: true,
-        value: 'on-timeout-default-value'
-      }
-    },
-    attached: function() {
-      setTimeout(function() {
-        this.val = 'on-timeout';
-      }.bind(this), 10);
-    }
-  })
-</script>
-
-<dom-module id='default-before'>
-  <template>
-    <default-value value='{{val}}'></default-value>
-    <iron-location query='{{val}}'></iron-location>
-
-  </template>
-  <script>Polymer({is: 'default-before', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='attached-before'>
-  <template>
-    <on-attached val='{{val}}'></on-attached>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>Polymer({is: 'attached-before', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='ready-before'>
-  <template>
-    <on-ready val='{{val}}'></on-ready>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>Polymer({is: 'ready-before', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='timeout-before'>
-  <template>
-    <on-timeout val='{{val}}'></on-timeout>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>Polymer({is: 'timeout-before', properties: {val: {type: String}}});</script>
-</dom-module>
-
-
-<dom-module id='default-after'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-    <default-value value='{{val}}'></default-value>
-  </template>
-  <script>Polymer({is: 'default-after', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='attached-after'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-    <on-attached val='{{val}}'></on-attached>
-  </template>
-  <script>Polymer({is: 'attached-after', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='ready-after'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-    <on-ready val='{{val}}'></on-ready>
-  </template>
-  <script>Polymer({is: 'ready-after', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='timeout-after'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-    <on-timeout val='{{val}}'></on-timeout>
-  </template>
-  <script>Polymer({is: 'timeout-after', properties: {val: {type: String}}});</script>
-</dom-module>
-
-
-<dom-module id='default-below'>
-  <template>
-    <iron-location query='{{val}}'>
-      <default-value value='{{val}}'></default-value>
-    </iron-location>
-  </template>
-  <script>Polymer({is: 'default-below', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='attached-below'>
-  <template>
-    <iron-location query='{{val}}'>
-      <on-attached val='{{val}}'></on-attached>
-    </iron-location>
-  </template>
-  <script>Polymer({is: 'attached-below', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='ready-below'>
-  <template>
-    <iron-location query='{{val}}'>
-      <on-ready val='{{val}}'></on-ready>
-    </iron-location>
-  </template>
-  <script>Polymer({is: 'ready-below', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='timeout-below'>
-  <template>
-    <iron-location query='{{val}}'>
-      <on-timeout val='{{val}}'></on-timeout>
-    </iron-location>
-  </template>
-  <script>Polymer({is: 'timeout-below', properties: {val: {type: String}}});</script>
-</dom-module>
-
-
-<dom-module id='default-above'>
-  <template>
-    <default-value value='{{val}}'>
-      <iron-location query='{{val}}'></iron-location>
-    </default-value>
-  </template>
-  <script>Polymer({is: 'default-above', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='attached-above'>
-  <template>
-    <on-attached val='{{val}}'>
-      <iron-location query='{{val}}'>
-      </iron-location>
-    </on-attached>
-  </template>
-  <script>Polymer({is: 'attached-above', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='ready-above'>
-  <template>
-    <on-ready val='{{val}}'>
-      <iron-location query='{{val}}'>
-      </iron-location>
-    </on-ready>
-  </template>
-  <script>Polymer({is: 'ready-above', properties: {val: {type: String}}});</script>
-</dom-module>
-
-<dom-module id='timeout-above'>
-  <template>
-    <on-timeout val='{{val}}'>
-      <iron-location query='{{val}}'></iron-location>
-    </on-timeout>
-  </template>
-  <script>Polymer({is: 'timeout-above', properties: {val: {type: String}}});</script>
-</dom-module>
-
-
-<dom-module id='default-container'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>
-    Polymer({
-      is: 'default-container',
-      properties: {val: {type: String, value: 'default-container-val'}}
-    });
-  </script>
-</dom-module>
-
-<dom-module id='attached-container'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>
-    Polymer({
-      is: 'attached-container',
-      properties: {val: {type: String, value: 'container-attached-default-val'}},
-      attached: function() {
-        if (this.val === 'container-attached-default-val') {
-          this.val = 'attached-container-val';
-        }
-      }
-    });
-  </script>
-</dom-module>
-
-<dom-module id='ready-container'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>
-    Polymer({
-      is: 'ready-container', properties: {val: {type: String}},
-      ready: function() {
-        this.val = 'ready-container-val';
-      }
-    });
-  </script>
-</dom-module>
-
-<dom-module id='timeout-container'>
-  <template>
-    <iron-location query='{{val}}'></iron-location>
-  </template>
-  <script>Polymer({
-    is: 'timeout-container',
-    properties: {
-      val: {
-        type: String,
-        notify: true
-      }
-    },
-    attached: function() {
-      setTimeout(function() {
-        this.val = 'on-timeout';
-      }.bind(this), 10);
-    }
-  });</script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-iframe.html b/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-iframe.html
deleted file mode 100644
index 564bf26..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-iframe.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title>Base source for injecting into an iframe for tests</title>
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <link rel='import' href='./initialization-cases.html'>
-  </head>
-  <body>
-    <script>
-      window.addEventListener("message", messageReceived, false);
-
-      window.addEventListener('WebComponentsReady', function() {
-        window.parent.postMessage({
-          'type': 'ready'
-        }, '*');
-      });
-
-      var appendBodyReceived = false;
-      function messageReceived(msg) {
-        if (!msg.data) {
-          console.error('got invalid msg?');
-        }
-        // the parent can (at any time) ask for our URL.
-        if (msg.data.type === 'urlQuery') {
-          msg.source.postMessage({
-            'type': 'urlQueryResponse',
-            'href': window.location.href,
-            'pathname': window.location.pathname,
-            'hash': window.location.hash,
-            'search': window.location.search
-          }, '*');
-        } else if (msg.data.type === 'appendBody') {
-          if (appendBodyReceived) {
-            throw new Error('should only receive at most one appendBody call');
-          }
-          var element = document.createElement(msg.data.tagName);
-          document.body.appendChild(element);
-          appendBodyReceived = true;
-        }
-      }
-
-      window.addEventListener('error', function(e) {
-        window.parent.postMessage({
-          'type': 'error',
-          'error': e.message
-        }, '*');
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-tests.html b/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-tests.html
deleted file mode 100644
index 16c9111..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/initialization-tests.html
+++ /dev/null
@@ -1,145 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title></title>
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../../polymer/polymer.html">
-    <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-    <link rel="import" href="../iron-location.html">
-  </head>
-
-  <body>
-    <script>
-      'use strict';
-
-      function getIframe() {
-        return new Promise(function(resolve, reject) {
-          var iframe = document.createElement('iframe');
-          var result = getMessageMatching(iframe, function(message) {
-            return message.type === 'ready';
-          });
-          iframe.src = './initialization-iframe.html';
-          document.body.appendChild(iframe);
-          iframe.addEventListener('error', reject);
-          result.then(function() {resolve(iframe)}, reject);
-        });
-      }
-
-      function onMessage(iframe, callback) {
-        var f = function(event) {
-          if (event.source === iframe.contentWindow) {
-            callback(event.data);
-          }
-        };
-        window.addEventListener('message', f, false);
-        return function() {
-          window.removeEventListener('message', f);
-        }
-      }
-
-      function getMessageMatching(iframe, predicate) {
-        var revoke = function() {};
-        var result = new Promise(function(resolve, reject) {
-          revoke = onMessage(iframe, function(message) {
-            if (predicate(message)) {
-              resolve(message);
-            }
-          });
-        });
-        result.then(revoke, revoke);
-        return result;
-      }
-
-      function getUrl(iframe) {
-        var result = getMessageMatching(iframe, function(message) {
-          return message.type === 'urlQueryResponse';
-        })
-        var revoke = function() {};
-        var result = new Promise(function(resolve, reject) {
-          revoke = onMessage(iframe, resolve);
-        });
-        result.then(revoke, revoke);
-        iframe.contentWindow.postMessage({type: 'urlQuery'}, '*');
-        return result;
-      }
-
-      function timePasses(ms) {
-        return new Promise(function(resolve) {
-          window.setTimeout(function() {
-            resolve();
-          }, ms);
-        });
-      }
-
-      suite('<iron-location>\'s initialization', function() {
-        var iframe;
-        var error;
-        setup(function() {
-          return getIframe().then(function(i) {
-            iframe = i;
-            function isError(m) {return m.type === 'error'}
-            getMessageMatching(iframe, isError).then(function(m) {
-              error = m.error;
-            });
-          });
-        });
-        teardown(function() {
-          if (iframe) {
-            document.body.removeChild(iframe);
-          }
-          var e = error;
-          iframe = null;
-          error = null;
-          if (e) {
-            throw new Error('Error message from contained iframe: ' + e);
-          }
-        });
-        var cases = [
-          'default-before', 'attached-before', 'ready-before',
-          'default-after', 'attached-after', 'ready-after',
-          'default-below', 'attached-below', 'ready-below',
-          'default-above', 'attached-above', 'ready-above',
-          'default-container', 'attached-container', 'ready-container'
-        ];
-        cases.forEach(function(caseName) {
-          test('the url takes priority in ' + caseName + ' initialization', function() {
-            return getUrl(iframe).then(function(url) {
-              expect(url.search).to.be.eq('');
-              iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*');
-              return timePasses(10).then(function() {return getUrl(iframe)});
-            }).then(function(url) {
-              expect(url.search).to.be.eq('');
-            });
-          });
-        });
-        var expectedFailureCases = ['timeout-before', 'timeout-after', 'timeout-below', 'timeout-above', 'timeout-container'];
-        expectedFailureCases.forEach(function(caseName) {
-          test('the url does not take priority in ' + caseName + ' initialization', function() {
-            return getUrl(iframe).then(function(url) {
-              expect(url.search).to.be.eq('');
-              iframe.contentWindow.postMessage({type: 'appendBody', tagName: caseName}, '*');
-              return timePasses(60).then(function() {return getUrl(iframe)});
-            }).then(function(url) {
-              expect(url.search).to.be.eq('?on-timeout');
-            });
-          });
-        });
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/integration.html b/systrace/catapult/third_party/polymer/components/iron-location/test/integration.html
deleted file mode 100644
index 9518d17..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/integration.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-location</title>
-
-  <script src="../../webcomponentsjs/webcomponents.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../iron-query-params.html">
-  <link rel="import" href="../iron-location.html">
-</head>
-<body>
-  <dom-module id="integration-element">
-    <template>
-      <iron-location
-          id="location"
-          path="{{path}}"
-          query="{{query}}"
-          hash="{{hash}}">
-      </iron-location>
-      <iron-query-params
-          id="queryParams"
-          params-string="{{query}}"
-          params-object="{{queryParams}}">
-      </iron-query-params>
-    </template>
-    <script>
-      HTMLImports.whenReady(function() {
-        Polymer({
-          is: 'integration-element'
-        });
-      });
-    </script>
-  </dom-module>
-
-  <test-fixture id="Integration">
-    <template>
-      <integration-element></integration-element>
-    </template>
-  </test-fixture>
-
-  <script>
-    'use strict';
-
-    suite('Integration tests', function () {
-
-      var integration;
-      var ironLocation;
-      var ironQueryParams;
-
-      setup(function() {
-        integration = fixture('Integration');
-        ironLocation = integration.$.location;
-        ironQueryParams = integration.$.queryParams;
-      });
-
-      test('propagations from location to iqp', function() {
-        var queryEncodingExamples = {
-          'foo': '?foo',
-          '': '',
-          'foo bar': '?foo%20bar',
-          'foo#bar': '?foo%23bar',
-          'foo?bar': '?foo?bar',
-          '/foo\'bar\'baz': ['?/foo%27bar%27baz', '?/foo\'bar\'baz'],
-          'foo/bar/baz': '?foo/bar/baz'
-        };
-        for (var plainTextQuery in queryEncodingExamples) {
-          var encodedQueries = queryEncodingExamples[plainTextQuery];
-          var ironLocationQuery = encodedQueries;
-          if (typeof encodedQueries === 'string') {
-            encodedQueries = [encodedQueries];
-            ironLocationQuery = [ironLocationQuery.substring(1)];
-          } else {
-            ironLocationQuery = ironLocationQuery.map(function(value) {
-              return value.substring(1);
-            });
-          }
-
-          ironLocation.query = plainTextQuery;
-          expect(encodedQueries).to.contain(window.location.search);
-          expect(ironLocationQuery).to.contain(ironLocation.query);
-          expect(ironLocationQuery).to.contain(ironQueryParams.paramsString);
-          if (plainTextQuery) {
-            expect('').to.be.equal(ironQueryParams.paramsObject[plainTextQuery])
-          } else {
-            expect(ironQueryParams.paramsObject[plainTextQuery]).to.be.undefined;          
-          }
-        }
-      });
-
-      test('propagations from iqp to location', function() {
-        var queryEncodingExamples = {
-          'foo': '?foo',
-          '': '',
-          'foo bar': '?foo%20bar',
-          'foo#bar': '?foo%23bar',
-          'foo?bar': '?foo?bar',
-          '/foo\'bar\'baz': ['?/foo%27bar%27baz', '?/foo\'bar\'baz'],
-          'foo/bar/baz': '?foo/bar/baz'
-        };
-        for (var plainTextQuery in queryEncodingExamples) {
-          var encodedQueries = queryEncodingExamples[plainTextQuery];
-          var ironLocationQuery = encodedQueries;
-          if (typeof encodedQueries === 'string') {
-            encodedQueries = [encodedQueries];
-            ironLocationQuery = [ironLocationQuery.substring(1)];
-          } else {
-            ironLocationQuery = ironLocationQuery.map(function(value) {
-              return value.substring(1);
-            });
-          }
-
-          var newParamsObject = {};
-          newParamsObject[plainTextQuery] = '';
-
-          ironQueryParams.paramsObject = newParamsObject;
-          expect(encodedQueries).to.contain(window.location.search);
-          expect(ironLocationQuery).to.contain(ironLocation.query);
-        }
-      });
-    });
-
-  </script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/iron-location.html b/systrace/catapult/third_party/polymer/components/iron-location/test/iron-location.html
deleted file mode 100644
index 4eebc61..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/iron-location.html
+++ /dev/null
@@ -1,499 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-location</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../iron-location.html">
-  <link rel="import" href="./redirection.html">
-  <style>
-    #safari-cooldown {
-      font-size: 18px;
-      max-width: 300px;
-    }
-    #safari-cooldown div {
-      margin-bottom: 20px;
-    }
-  </style>
-</head>
-<body>
-
-  <div id='safari-cooldown' hidden>
-    <div>Danger: URL overheating.</div>
-    <div>
-      Safari requires a cooldown period before we call
-      pushState/replaceState any more.
-    </div>
-    <div>Testing will resume after 30 seconds.</div>
-    <div>
-      <a href="https://forums.developer.apple.com/thread/36650">More info</a>
-    </div>
-  </div>
-
-<test-fixture id='Solo'>
-  <template>
-    <iron-location></iron-location>
-  </template>
-</test-fixture>
-<test-fixture id='Together'>
-  <template>
-    <div>
-      <iron-location id='one'></iron-location>
-      <iron-location id='two'></iron-location>
-    </div>
-  </template>
-</test-fixture>
-<test-fixture id='RedirectHash'>
-  <template>
-    <redirect-hash></redirect-hash>
-  </template>
-</test-fixture>
-<test-fixture id='RedirectPath'>
-  <template>
-    <redirect-path></redirect-path>
-  </template>
-</test-fixture>
-<test-fixture id='RedirectQuery'>
-  <template>
-    <redirect-query></redirect-query>
-  </template>
-</test-fixture>
-
-<script>
-  'use strict';
-
-  function timePasses(ms) {
-    return new Promise(function(resolve) {
-      window.setTimeout(function() {
-        resolve();
-      }, ms);
-    });
-  }
-
-  function makeAbsoluteUrl(path) {
-    return window.location.protocol + '//' + window.location.host + path;
-  }
-
-  // A window.history.replaceState wrapper that's smart about baseURI.
-  function replaceState(path) {
-    window.history.replaceState({}, '', makeAbsoluteUrl(path));
-  }
-
-  /**
-   * We run the iron location tests with a couple different page configurations
-   * (e.g. with and withoug a base URI), so we define the test set as a function
-   * that we call in each of these configurations.
-   */
-  function ironLocationTests() {
-    suite('when used solo', function() {
-      var urlElem;
-      var toRemove;
-      setup(function() {
-        replaceState('/');
-        urlElem = fixture('Solo');
-        toRemove = [];
-      });
-      teardown(function() {
-        for (var i = 0; i < toRemove.length; i++) {
-          document.body.removeChild(toRemove[i]);
-        }
-      });
-      test('basic functionality with #hash urls', function() {
-        // Initialized to the window location's hash.
-        expect(window.location.hash).to.be.equal(urlElem.hash);
-
-        // Changing the urlElem's hash changes the URL
-        urlElem.hash = '/lol/ok';
-        expect(window.location.hash).to.be.equal('#/lol/ok');
-
-        // Changing the hash via normal means changes the urlElem.
-        var anchor = document.createElement('a');
-        var base =
-            window.location.protocol + '//' + window.location.host +
-            window.location.pathname;
-        anchor.href = base + '#/wat';
-        document.body.appendChild(anchor);
-        anchor.click();
-        // In IE10 it appears that the hashchange event is asynchronous.
-        return timePasses(10).then(function() {
-          expect(urlElem.hash).to.be.equal('/wat');
-        });
-      });
-      test('basic functionality with paths', function() {
-        // Initialized to the window location's path.
-        expect(window.location.pathname).to.be.equal(urlElem.path);
-
-        // Changing the urlElem's path changes the URL
-        urlElem.path = '/foo/bar';
-        expect(window.location.pathname).to.be.equal('/foo/bar');
-
-        // Changing the path and sending a custom event on the window changes
-        // the urlElem.
-        replaceState('/baz');
-        window.dispatchEvent(new CustomEvent('location-changed'));
-        expect(urlElem.path).to.be.equal('/baz');
-      });
-      function makeTemporaryIronLocation() {
-        var ironLocation = document.createElement('iron-location');
-        document.body.appendChild(ironLocation);
-        toRemove.push(ironLocation);
-        return ironLocation
-      }
-      test('dealing with paths with unusual characters', function() {
-        var pathEncodingExamples = {
-          '/foo': '/foo',
-          '/': '/',
-          '/foo bar': '/foo%20bar',
-          '/foo#bar': '/foo%23bar',
-          '/foo?xyz': '/foo%3Fxyz',
-          '/foo\'bar\'baz': '/foo\'bar\'baz',
-        };
-
-        for (var plainTextPath in pathEncodingExamples) {
-          var encodedPath = pathEncodingExamples[plainTextPath];
-
-          urlElem.path = plainTextPath;
-          expect(window.location.pathname).to.be.equal(encodedPath);
-          expect(urlElem.path).to.be.equal(plainTextPath);
-          var temporaryIronLocation = makeTemporaryIronLocation();
-          expect(temporaryIronLocation.path).to.be.equal(plainTextPath);
-        }
-      });
-      test('dealing with hashes with unusual characters', function() {
-        var hashEncodingExamples = {
-          'foo': '#foo',
-          '': '',
-          'foo bar': ['#foo%20bar', '#foo bar'],
-          'foo#bar': '#foo#bar',
-          'foo?bar': '#foo?bar',
-          '/foo\'bar\'baz': ['#/foo%27bar%27baz', '#/foo\'bar\'baz'],
-        };
-        for (var plainTextHash in hashEncodingExamples) {
-          var encodedHashes = hashEncodingExamples[plainTextHash];
-          if (typeof encodedHashes === 'string') {
-            encodedHashes = [encodedHashes];
-          }
-
-          urlElem.hash = plainTextHash;
-          expect(encodedHashes).to.contain(window.location.hash);
-          expect(urlElem.hash).to.be.equal(plainTextHash);
-          expect(makeTemporaryIronLocation().hash).to.be.equal(plainTextHash);
-        }
-      });
-      test('dealing with queries with unusual characters', function() {
-        var queryEncodingExamples = {
-          'foo': '?foo',
-          '': '',
-          'foo bar': '?foo%20bar',
-          'foo#bar': '?foo%23bar',
-          'foo?bar': '?foo?bar',
-          '/foo\'bar\'baz': ['?/foo%27bar%27baz', '?/foo\'bar\'baz'],
-          'foo/bar/baz': '?foo/bar/baz'
-        };
-        for (var plainTextQuery in queryEncodingExamples) {
-          var encodedQueries = queryEncodingExamples[plainTextQuery];
-          if (typeof encodedQueries === 'string') {
-            encodedQueries = [encodedQueries];
-          }
-          
-          var ironLocationQuery = encodedQueries.map(function(value) {
-            return value.substring(1);
-          });
-
-          expect(urlElem._initialized).to.be.eq(true);
-          urlElem.query = plainTextQuery;
-          expect(encodedQueries).to.contain(window.location.search);
-          expect(ironLocationQuery).to.contain(urlElem.query);
-          expect(ironLocationQuery).to.contain(makeTemporaryIronLocation().query);
-
-          urlElem.query = 'dummyValue';
-          urlElem.query = ironLocationQuery[0];
-
-          expect(encodedQueries).to.contain(window.location.search);
-          expect(ironLocationQuery).to.contain(urlElem.query);
-          expect(ironLocationQuery).to.contain(makeTemporaryIronLocation().query);
-        }
-      });
-      test('assigning to a relative path URL', function() {
-        urlElem.path = '/foo/bar';
-        expect(window.location.pathname).to.be.equal('/foo/bar');
-
-        // A relative path is treated as an absolute one, just with a
-        // missing leading slash.
-        urlElem.path = 'baz';
-        expect(window.location.pathname).to.be.equal('/baz');
-      });
-      test('basic functionality with ?key=value params', function() {
-        // Initialized to the window location's params.
-        expect(urlElem.query).to.be.eq('');
-
-        // Changing location.search and sending a custom event on the window
-        // changes the urlElem.
-        replaceState('/?greeting=hello&target=world');
-        window.dispatchEvent(new CustomEvent('location-changed'));
-        expect(urlElem.query).to.be.equal('greeting=hello&target=world');
-
-        // Changing the urlElem's query changes the URL.
-        urlElem.query = 'greeting=hello&target=world&another=key';
-        expect(window.location.search).to.be.equal(
-            '?greeting=hello&target=world&another=key');
-      });
-    });
-    suite('does not spam the user\'s history', function() {
-      var replaceStateCalls, pushStateCalls;
-      var nativeReplaceState, nativePushState;
-      setup(function() {
-        replaceStateCalls = pushStateCalls = 0;
-        nativeReplaceState = window.history.replaceState;
-        nativePushState = window.history.pushState;
-        window.history.replaceState = function() {
-          replaceStateCalls++;
-        };
-        window.history.pushState = function() {
-          pushStateCalls++;
-        };
-      });
-      teardown(function() {
-        window.history.replaceState = nativeReplaceState;
-        window.history.pushState = nativePushState;
-      });
-      test('when a change happens immediately after ' +
-           'the iron-location is attached', function() {
-        var ironLocation = fixture('Solo');
-        expect(pushStateCalls).to.be.equal(0);
-        expect(replaceStateCalls).to.be.equal(0);
-        ironLocation.path = '/foo';
-        expect(replaceStateCalls).to.be.equal(1);
-        expect(pushStateCalls).to.be.equal(0);
-    });
-
-      suite('when intercepting links', function() {
-      /**
-       * Clicks the given link while an iron-location element with the given
-       * urlSpaceRegex is in the same document. Returns whether the
-       * iron-location prevented the default behavior of the click.
-       *
-       * No matter what, it prevents the default behavior of the click itself
-       * to ensure that no navigation occurs (as that would interrupt
-       * running and reporting these tests!)
-       */
-      function isClickCaptured(anchor, urlSpaceRegex) {
-        var defaultWasPrevented;
-        function handler(event) {
-          expect(event.target).to.be.eq(anchor);
-          defaultWasPrevented = event.defaultPrevented;
-          event.preventDefault();
-          expect(event.defaultPrevented).to.be.eq(true);
-        }
-        window.addEventListener('click', handler);
-        var ironLocation = fixture('Solo');
-        if (urlSpaceRegex != null) {
-          ironLocation.urlSpaceRegex = urlSpaceRegex;
-        }
-        document.body.appendChild(anchor);
-        anchor.click();
-        document.body.removeChild(anchor);
-        window.removeEventListener('click', handler);
-        return defaultWasPrevented;
-      }
-
-      test('simple link to / is intercepted', function() {
-        var anchor = document.createElement('a');
-        if (document.baseURI !== window.location.href) {
-          anchor.href = makeAbsoluteUrl('/');
-        } else {
-          anchor.href = '/';
-        }
-
-        expect(isClickCaptured(anchor)).to.be.eq(true);
-          expect(pushStateCalls).to.be.equal(1);
-      });
-
-      test('link that matches url space is intercepted', function() {
-        var anchor = document.createElement('a');
-        anchor.href = makeAbsoluteUrl('/foo');
-
-        expect(isClickCaptured(anchor, '/fo+')).to.be.eq(true);
-          expect(pushStateCalls).to.be.equal(1);
-      });
-
-      test('link that doesn\'t match url space isn\'t intercepted', function() {
-        var anchor = document.createElement('a');
-        anchor.href = makeAbsoluteUrl('/bar');
-
-        expect(isClickCaptured(anchor, '/fo+')).to.be.eq(false);
-          expect(pushStateCalls).to.be.equal(0);
-      });
-
-      test('link to another domain isn\'t intercepted', function() {
-        var anchor = document.createElement('a');
-        anchor.href = 'http://example.com/';
-
-        expect(isClickCaptured(anchor)).to.be.eq(false);
-          expect(pushStateCalls).to.be.equal(0);
-      });
-
-      test('a link with target=_blank isn\'t intercepted', function() {
-        var anchor = document.createElement('a');
-        anchor.href = makeAbsoluteUrl('/');
-        anchor.target = '_blank';
-
-        expect(isClickCaptured(anchor)).to.be.eq(false);
-          expect(pushStateCalls).to.be.equal(0);
-        });
-
-        test('a link with an href to the ' +
-             'current page shouldn\'t add to history.', function() {
-          var anchor = document.createElement('a');
-          anchor.href = window.location.href;
-
-          // The click is captured, but it doesn't add to history.
-          expect(isClickCaptured(anchor)).to.be.equal(true);
-          expect(pushStateCalls).to.be.equal(0);
-        });
-
-        test('a click that has already been defaultPrevented ' +
-             'shouldn\'t result in a navigation', function() {
-           fixture('Solo');
-           var anchor = document.createElement('a');
-           anchor.href = makeAbsoluteUrl('/');
-           anchor.addEventListener('click', function(event) {
-             event.preventDefault();
-           });
-           document.body.appendChild(anchor);
-
-           var originalPushState = window.history.pushState;
-           var count = 0;
-           window.history.pushState = function() {
-             count++;
-           }
-           anchor.click();
-           window.history.pushState = originalPushState;
-
-           expect(count).to.be.equal(0);
-      })
-    });
-    });
-    suite('when used with other iron-location elements', function() {
-      var otherUrlElem;
-      var urlElem;
-      setup(function() {
-        var elems = fixture('Together');
-        urlElem = elems.querySelector('#one');
-        otherUrlElem = elems.querySelector('#two');
-      });
-      function assertHaveSameUrls(urlElemOne, urlElemTwo) {
-        expect(urlElemOne.path).to.be.equal(urlElemTwo.path);
-        expect(urlElemOne.hash).to.be.equal(urlElemTwo.hash);
-        expect(urlElemOne.query).to.be.equal(urlElemTwo.query);
-      }
-      test('coordinate their changes (by firing events on window)', function() {
-        assertHaveSameUrls(urlElem, otherUrlElem);
-
-        urlElem.path = '/a/b/c';
-        assertHaveSameUrls(urlElem, otherUrlElem);
-
-        otherUrlElem.query = 'alsdkjflaksjfd=alksjfdlkajsdfl';
-        assertHaveSameUrls(urlElem, otherUrlElem);
-
-        urlElem.hash = 'lkjljifosjkldfjlksjfldsjf';
-        assertHaveSameUrls(urlElem, otherUrlElem);
-      });
-    });
-
-    suite('supports doing synchronous redirection', function() {
-      test('of the hash portion of the URL', function() {
-        expect(window.location.hash).to.be.equal('');
-        var redirector = fixture('RedirectHash');
-        expect(window.location.hash).to.be.equal('#redirectedTo');
-        expect(redirector.hash).to.be.equal('redirectedTo');
-        redirector.hash = 'newHash';
-        expect(window.location.hash).to.be.equal('#redirectedTo');
-        expect(redirector.hash).to.be.equal('redirectedTo');
-      });
-
-      test('of the path portion of the URL', function() {
-        expect(window.location.pathname).to.not.be.equal('/redirectedTo');
-        var redirector = fixture('RedirectPath');
-        expect(window.location.pathname).to.be.equal('/redirectedTo');
-        expect(redirector.path).to.be.equal('/redirectedTo');
-        redirector.path = '/newPath';
-        expect(window.location.pathname).to.be.equal('/redirectedTo');
-        expect(redirector.path).to.be.equal('/redirectedTo');
-      });
-
-      test('of the query portion of the URL', function() {
-        expect(window.location.search).to.be.equal('');
-        var redirector = fixture('RedirectQuery');
-        expect(window.location.search).to.be.equal('?redirectedTo');
-        expect(redirector.query).to.be.equal('redirectedTo');
-        redirector.query = 'newQuery';
-        expect(window.location.search).to.be.equal('?redirectedTo');
-        expect(redirector.query).to.be.equal('redirectedTo');
-      });
-    });
-  }
-
-  suite('<iron-location>', function () {
-    var initialUrl;
-    setup(function() {
-      initialUrl = window.location.href;
-    });
-    teardown(function(){
-      window.history.replaceState({}, '', initialUrl);
-    });
-
-    // This is as dumb as it looks. See #safari-cooldown in the dom above.
-    var cooldownFunction = function() {};
-    if (/^Apple/.test(navigator.vendor)) {
-      cooldownFunction = function(done) {
-        var cooldownPeriod = 30 * 1000;
-        this.timeout(cooldownPeriod + 5000);
-        var cooldownMessage = document.querySelector('#safari-cooldown');
-        cooldownMessage.removeAttribute('hidden');
-        setTimeout(function() {
-          done();
-          cooldownMessage.setAttribute('hidden', 'hidden');
-        }, cooldownPeriod);
-      };
-    }
-
-    suite('without a base URI', function() {
-      ironLocationTests();
-
-      suiteTeardown(cooldownFunction);
-    });
-
-    suite('with a base URI', function() {
-      var baseElem;
-      setup(function() {
-        expect(document.baseURI).to.be.equal(window.location.href);
-        baseElem = document.createElement('base');
-        var href = 'https://example.com/i/dont/exist/obviously'
-        baseElem.href = href;
-        document.head.appendChild(baseElem);
-        expect(document.baseURI).to.be.equal(href);
-      });
-      teardown(function() {
-        document.head.removeChild(baseElem);
-      });
-      suiteTeardown(cooldownFunction);
-      ironLocationTests();
-    });
-  });
-
-</script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/iron-query-params.html b/systrace/catapult/third_party/polymer/components/iron-location/test/iron-query-params.html
deleted file mode 100644
index 8b27642..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/iron-query-params.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>iron-location</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
-  <link rel="import" href="../iron-query-params.html">
-</head>
-<body>
-
-  <test-fixture id="BasicQueryParams">
-    <template>
-      <iron-query-params></iron-query-params>
-    </template>
-  </test-fixture>
-
-  <script>
-    'use strict';
-
-    suite('<iron-query-params>', function () {
-
-      var paramsElem;
-      setup(function() {
-        paramsElem = fixture('BasicQueryParams');
-      });
-
-      test('basic functionality with ?key=value params', function() {
-        // Check initialization
-        expect(paramsElem.paramsString).to.be.eq('');
-        expect(paramsElem.paramsObject).to.deep.eq({});
-
-        // Check the mapping from paramsString to paramsObject.
-        paramsElem.paramsString = 'greeting=hello&target=world';
-        expect(paramsElem.paramsObject).to.deep.equal(
-            {greeting: 'hello', target: 'world'});
-
-        // Check the mapping from paramsObject back to paramsString.
-        paramsElem.set('paramsObject.another', 'key');
-        expect(paramsElem.paramsString).to.be.equal(
-            'greeting=hello&target=world&another=key');
-      });
-      test('encoding of params', function() {
-        var mappings = [
-          {
-            string: 'a=b',
-            object: {'a': 'b'}
-          },
-          {
-            string: 'debug&ok',
-            object: {'debug': '', 'ok': ''}
-          },
-          {
-            string: 'monster%20kid%3A=%F0%9F%98%BF&quotes=%27%27',
-            object: {'monster kid:': '😿', 'quotes': '\'\''}
-          },
-          {
-            string: 'yes%2C%20ok?%20what%20is%20up%20with%20%CB%9Athiiis%CB%9A=%E2%98%83',
-            object: {'yes, ok? what is up with ˚thiiis˚': '☃'}
-          },
-        ];
-
-        mappings.forEach(function(mapping) {
-          // Clear
-          paramsElem.paramsObject = {};
-          expect(paramsElem.paramsString).to.be.equal('');
-
-          // Test going from string to object
-          paramsElem.paramsString = mapping.string;
-          expect(paramsElem.paramsObject).to.deep.equal(mapping.object);
-
-          // Clear again.
-          paramsElem.paramsObject = {};
-          expect(paramsElem.paramsString).to.be.equal('');
-
-          // Test going from object to string
-          paramsElem.paramsObject = mapping.object;
-          expect(paramsElem.paramsString).to.be.equal(mapping.string);
-        });
-      });
-      test('query strings with alternative encodings', function() {
-        // Check the mapping for querystrings with + instead of %20.
-        paramsElem.paramsString = 'key=value+with+spaces';
-        expect(paramsElem.paramsObject).to.deep.equal(
-            {key: 'value with spaces'});
-      });
-    });
-
-  </script>
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/iron-location/test/redirection.html b/systrace/catapult/third_party/polymer/components/iron-location/test/redirection.html
deleted file mode 100644
index 3b21f26..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-location/test/redirection.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<dom-module id='redirect-hash'>
-  <template>
-    <iron-location hash='{{hash}}'></iron-location>
-  </template>
-  <script>
-    Polymer({
-      is: 'redirect-hash',
-      properties: {
-        hash: {
-          value: '',
-          observer: 'hashChanged'
-        }
-      },
-      hashChanged: function(hash) {
-        this.hash = 'redirectedTo';
-      }
-    });
-  </script>
-</dom-module>
-
-<dom-module id='redirect-path'>
-  <template>
-    <iron-location path='{{path}}'></iron-location>
-  </template>
-  <script>
-    Polymer({
-      is: 'redirect-path',
-      properties: {
-        path: {
-          value: '',
-          observer: 'pathChanged'
-        }
-      },
-      pathChanged: function(path) {
-        this.path = '/redirectedTo';
-      }
-    });
-  </script>
-</dom-module>
-
-<dom-module id='redirect-query'>
-  <template>
-    <iron-location query='{{query}}'></iron-location>
-  </template>
-  <script>
-    Polymer({
-      is: 'redirect-query',
-      properties: {
-        query: {
-          value: '',
-          observer: 'queryChanged'
-        }
-      },
-      queryChanged: function(query) {
-        this.query = 'redirectedTo';
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/README.md
deleted file mode 100644
index f8d90c6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-menu-behavior.html  iron-menubar-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-menu-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-menu-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-menu-behavior)_
-
-
-##Polymer.IronMenuBehavior
-
-`Polymer.IronMenuBehavior` implements accessible menu behavior.
-
-
-
-##Polymer.IronMenubarBehavior
-
-`Polymer.IronMenubarBehavior` implements accessible menubar behavior.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/bower.json
deleted file mode 100644
index e00194e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/bower.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "name": "iron-menu-behavior",
-  "version": "1.3.1",
-  "description": "Provides accessible menu behavior",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "behavior",
-    "menu"
-  ],
-  "main": [
-    "iron-menu-behavior.html",
-    "iron-menubar-behavior.html"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-menu-behavior"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-menu-behavior",
-  "ignore": [],
-  "dependencies": {
-    "iron-selector": "PolymerElements/iron-selector#^1.0.0",
-    "polymer": "Polymer/polymer#^1.2.4",
-    "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.2",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/index.html
deleted file mode 100644
index 11da832..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/index.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>iron-menu-behavior demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../../paper-styles/default-theme.html">
-  <link rel="import" href="simple-menu.html">
-  <link rel="import" href="simple-menubar.html">
-
-  <style is="custom-style">
-    simple-menu,
-    simple-menubar {
-      display: inline-block;
-      width: 100%;
-    }
-
-    simple-menu a {
-      display: block;
-    }
-
-    simple-menubar a,
-    simple-menu a {
-      padding: 15px 20px;
-      color: var(--primary-text-color);
-      text-decoration: none;
-    }
-
-    simple-menu a[disabled],
-    simple-menubar a[disabled] {
-      color: var(--google-grey-300);
-    }
-
-    .horizontal-section {
-      padding: 0;
-      margin-bottom: 20px;
-    }
-
-    .row {
-      height: 120px;
-    }
-  </style>
-</head>
-<body unresolved>
-
-  <div class="horizontal-section-container">
-    <div>
-      <h3>Simple menu</h3>
-      <div class="horizontal-section">
-        <simple-menu>
-          <a href="javascript:void(0)" role="menuitem">Item 0</a>
-          <a href="javascript:void(0)" role="menuitem">Item 1</a>
-          <a href="javascript:void(0)" role="menuitem" disabled>Item 2</a>
-          <a href="javascript:void(0)" role="menuitem" hidden>Ghost</a>
-          <a href="javascript:void(0)" role="menuitem">Item 3</a>
-          <a href="javascript:void(0)" role="menuitem" style="display:none">Another ghost</a>
-        </simple-menu>
-      </div>
-    </div>
-
-    <div>
-      <h3>Multi-select menu</h3>
-      <div class="horizontal-section">
-        <simple-menu multi>
-          <a href="javascript:void(0)" role="menuitem">Item 0</a>
-          <a href="javascript:void(0)" role="menuitem" disabled>Item 1</a>
-          <a href="javascript:void(0)" role="menuitem" hidden>Ghost</a>
-          <a href="javascript:void(0)" role="menuitem">Item 2</a>
-          <a href="javascript:void(0)" role="menuitem">Item 3</a>
-          <a href="javascript:void(0)" role="menuitem" style="display:none">Another ghost</a>
-        </simple-menu>
-      </div>
-    </div>
-
-    <div>
-      <div class="row">
-        <h3>Simple menubar</h3>
-        <div class="horizontal-section">
-          <simple-menubar>
-            <a href="javascript:void(0)" role="menuitem">Item 0</a>
-            <a href="javascript:void(0)" role="menuitem">Item 1</a>
-            <a href="javascript:void(0)" role="menuitem" disabled>Item 2</a>
-            <a href="javascript:void(0)" role="menuitem">Item 3</a>
-          </simple-menubar>
-        </div>
-      </div>
-      <div class="row">
-        <h3>Multi-select menubar</h3>
-        <div class="horizontal-section">
-          <simple-menubar multi>
-            <a href="javascript:void(0)" role="menuitem">Item 0</a>
-            <a href="javascript:void(0)" role="menuitem">Item 1</a>
-            <a href="javascript:void(0)" role="menuitem">Item 2</a>
-            <a href="javascript:void(0)" role="menuitem">Item 3</a>
-          </simple-menubar>
-        </div>
-      </div>
-    </div>
-
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/simple-menu.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/simple-menu.html
deleted file mode 100644
index da16eeb..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/simple-menu.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-menu-behavior.html">
-<link rel="import" href="../../paper-styles/color.html">
-
-<dom-module id="simple-menu">
-  <template>
-    <style>
-      .content ::content > .iron-selected {
-        color: white;
-        background-color: var(--google-blue-500);
-      }
-    </style>
-
-    <div class="content">
-      <content></content>
-    </div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'simple-menu',
-
-    behaviors: [
-      Polymer.IronMenuBehavior
-    ]
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/simple-menubar.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/simple-menubar.html
deleted file mode 100644
index 0176ad0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/demo/simple-menubar.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-menubar-behavior.html">
-<link rel="import" href="../../paper-styles/color.html">
-
-<dom-module id="simple-menubar">
-  <template>
-    <style>
-      .content ::content > .iron-selected {
-        color: white;
-        background-color: var(--google-red-500);
-      }
-
-      .content ::content > * {
-        display: inline-block;
-      }
-    </style>
-
-    <div class="content">
-      <content></content>
-    </div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'simple-menubar',
-
-    behaviors: [
-      Polymer.IronMenubarBehavior
-    ]
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/index.html
deleted file mode 100644
index 2c643c4..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-menu-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page src="iron-menubar-behavior.html"></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/iron-menu-behavior.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/iron-menu-behavior.html
deleted file mode 100644
index 92a2445..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/iron-menu-behavior.html
+++ /dev/null
@@ -1,396 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-selector/iron-multi-selectable.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-
-<script>
-
-  /**
-   * `Polymer.IronMenuBehavior` implements accessible menu behavior.
-   *
-   * @demo demo/index.html
-   * @polymerBehavior Polymer.IronMenuBehavior
-   */
-  Polymer.IronMenuBehaviorImpl = {
-
-    properties: {
-
-      /**
-       * Returns the currently focused item.
-       * @type {?Object}
-       */
-      focusedItem: {
-        observer: '_focusedItemChanged',
-        readOnly: true,
-        type: Object
-      },
-
-      /**
-       * The attribute to use on menu items to look up the item title. Typing the first
-       * letter of an item when the menu is open focuses that item. If unset, `textContent`
-       * will be used.
-       */
-      attrForItemTitle: {
-        type: String
-      },
-
-      disabled: {
-        type: Boolean,
-        value: false,
-        observer: '_disabledChanged',
-      },
-    },
-
-    _SEARCH_RESET_TIMEOUT_MS: 1000,
-
-    _previousTabIndex: 0,
-
-    hostAttributes: {
-      'role': 'menu',
-    },
-
-    observers: [
-      '_updateMultiselectable(multi)'
-    ],
-
-    listeners: {
-      'focus': '_onFocus',
-      'keydown': '_onKeydown',
-      'iron-items-changed': '_onIronItemsChanged'
-    },
-
-    keyBindings: {
-      'up': '_onUpKey',
-      'down': '_onDownKey',
-      'esc': '_onEscKey',
-      'shift+tab:keydown': '_onShiftTabDown'
-    },
-
-    attached: function() {
-      this._resetTabindices();
-    },
-
-    /**
-     * Selects the given value. If the `multi` property is true, then the selected state of the
-     * `value` will be toggled; otherwise the `value` will be selected.
-     *
-     * @param {string|number} value the value to select.
-     */
-    select: function(value) {
-      // Cancel automatically focusing a default item if the menu received focus
-      // through a user action selecting a particular item.
-      if (this._defaultFocusAsync) {
-        this.cancelAsync(this._defaultFocusAsync);
-        this._defaultFocusAsync = null;
-      }
-      var item = this._valueToItem(value);
-      if (item && item.hasAttribute('disabled')) return;
-      this._setFocusedItem(item);
-      Polymer.IronMultiSelectableBehaviorImpl.select.apply(this, arguments);
-    },
-
-    /**
-     * Resets all tabindex attributes to the appropriate value based on the
-     * current selection state. The appropriate value is `0` (focusable) for
-     * the default selected item, and `-1` (not keyboard focusable) for all
-     * other items.
-     */
-    _resetTabindices: function() {
-      var selectedItem = this.multi ? (this.selectedItems && this.selectedItems[0]) : this.selectedItem;
-
-      this.items.forEach(function(item) {
-        item.setAttribute('tabindex', item === selectedItem ? '0' : '-1');
-      }, this);
-    },
-
-    /**
-     * Sets appropriate ARIA based on whether or not the menu is meant to be
-     * multi-selectable.
-     *
-     * @param {boolean} multi True if the menu should be multi-selectable.
-     */
-    _updateMultiselectable: function(multi) {
-      if (multi) {
-        this.setAttribute('aria-multiselectable', 'true');
-      } else {
-        this.removeAttribute('aria-multiselectable');
-      }
-    },
-
-    /**
-     * Given a KeyboardEvent, this method will focus the appropriate item in the
-     * menu (if there is a relevant item, and it is possible to focus it).
-     *
-     * @param {KeyboardEvent} event A KeyboardEvent.
-     */
-    _focusWithKeyboardEvent: function(event) {
-      this.cancelDebouncer('_clearSearchText');
-
-      var searchText = this._searchText || '';
-      var key = event.key && event.key.length == 1 ? event.key :
-          String.fromCharCode(event.keyCode);
-      searchText += key.toLocaleLowerCase();
-
-      var searchLength = searchText.length;
-
-      for (var i = 0, item; item = this.items[i]; i++) {
-        if (item.hasAttribute('disabled')) {
-          continue;
-        }
-
-        var attr = this.attrForItemTitle || 'textContent';
-        var title = (item[attr] || item.getAttribute(attr) || '').trim();
-
-        if (title.length < searchLength) {
-          continue;
-        }
-
-        if (title.slice(0, searchLength).toLocaleLowerCase() == searchText) {
-          this._setFocusedItem(item);
-          break;
-        }
-      }
-
-      this._searchText = searchText;
-      this.debounce('_clearSearchText', this._clearSearchText,
-                    this._SEARCH_RESET_TIMEOUT_MS);
-    },
-
-    _clearSearchText: function() {
-      this._searchText = '';
-    },
-
-    /**
-     * Focuses the previous item (relative to the currently focused item) in the
-     * menu, disabled items will be skipped.
-     * Loop until length + 1 to handle case of single item in menu.
-     */
-    _focusPrevious: function() {
-      var length = this.items.length;
-      var curFocusIndex = Number(this.indexOf(this.focusedItem));
-
-      for (var i = 1; i < length + 1; i++) {
-        var item = this.items[(curFocusIndex - i + length) % length];
-        if (!item.hasAttribute('disabled')) {
-          var owner = Polymer.dom(item).getOwnerRoot() || document;
-          this._setFocusedItem(item);
-
-          // Focus might not have worked, if the element was hidden or not
-          // focusable. In that case, try again.
-          if (Polymer.dom(owner).activeElement == item) {
-            return;
-          }
-        }
-      }
-    },
-
-    /**
-     * Focuses the next item (relative to the currently focused item) in the
-     * menu, disabled items will be skipped.
-     * Loop until length + 1 to handle case of single item in menu.
-     */
-    _focusNext: function() {
-      var length = this.items.length;
-      var curFocusIndex = Number(this.indexOf(this.focusedItem));
-
-      for (var i = 1; i < length + 1; i++) {
-        var item = this.items[(curFocusIndex + i) % length];
-        if (!item.hasAttribute('disabled')) {
-          var owner = Polymer.dom(item).getOwnerRoot() || document;
-          this._setFocusedItem(item);
-
-          // Focus might not have worked, if the element was hidden or not
-          // focusable. In that case, try again.
-          if (Polymer.dom(owner).activeElement == item) {
-            return;
-          }
-        }
-      }
-    },
-
-    /**
-     * Mutates items in the menu based on provided selection details, so that
-     * all items correctly reflect selection state.
-     *
-     * @param {Element} item An item in the menu.
-     * @param {boolean} isSelected True if the item should be shown in a
-     * selected state, otherwise false.
-     */
-    _applySelection: function(item, isSelected) {
-      if (isSelected) {
-        item.setAttribute('aria-selected', 'true');
-      } else {
-        item.removeAttribute('aria-selected');
-      }
-      Polymer.IronSelectableBehavior._applySelection.apply(this, arguments);
-    },
-
-    /**
-     * Discretely updates tabindex values among menu items as the focused item
-     * changes.
-     *
-     * @param {Element} focusedItem The element that is currently focused.
-     * @param {?Element} old The last element that was considered focused, if
-     * applicable.
-     */
-    _focusedItemChanged: function(focusedItem, old) {
-      old && old.setAttribute('tabindex', '-1');
-      if (focusedItem && !focusedItem.hasAttribute('disabled') && !this.disabled) {
-        focusedItem.setAttribute('tabindex', '0');
-        focusedItem.focus();
-      }
-    },
-
-    /**
-     * A handler that responds to mutation changes related to the list of items
-     * in the menu.
-     *
-     * @param {CustomEvent} event An event containing mutation records as its
-     * detail.
-     */
-    _onIronItemsChanged: function(event) {
-      if (event.detail.addedNodes.length) {
-        this._resetTabindices();
-      }
-    },
-
-    /**
-     * Handler that is called when a shift+tab keypress is detected by the menu.
-     *
-     * @param {CustomEvent} event A key combination event.
-     */
-    _onShiftTabDown: function(event) {
-      var oldTabIndex = this.getAttribute('tabindex');
-
-      Polymer.IronMenuBehaviorImpl._shiftTabPressed = true;
-
-      this._setFocusedItem(null);
-
-      this.setAttribute('tabindex', '-1');
-
-      this.async(function() {
-        this.setAttribute('tabindex', oldTabIndex);
-        Polymer.IronMenuBehaviorImpl._shiftTabPressed = false;
-        // NOTE(cdata): polymer/polymer#1305
-      }, 1);
-    },
-
-    /**
-     * Handler that is called when the menu receives focus.
-     *
-     * @param {FocusEvent} event A focus event.
-     */
-    _onFocus: function(event) {
-      if (Polymer.IronMenuBehaviorImpl._shiftTabPressed) {
-        // do not focus the menu itself
-        return;
-      }
-
-      // Do not focus the selected tab if the deepest target is part of the
-      // menu element's local DOM and is focusable.
-      var rootTarget = /** @type {?HTMLElement} */(
-          Polymer.dom(event).rootTarget);
-      if (rootTarget !== this && typeof rootTarget.tabIndex !== "undefined" && !this.isLightDescendant(rootTarget)) {
-        return;
-      }
-
-      // clear the cached focus item
-      this._defaultFocusAsync = this.async(function() {
-        // focus the selected item when the menu receives focus, or the first item
-        // if no item is selected
-        var selectedItem = this.multi ? (this.selectedItems && this.selectedItems[0]) : this.selectedItem;
-
-        this._setFocusedItem(null);
-
-        if (selectedItem) {
-          this._setFocusedItem(selectedItem);
-        } else if (this.items[0]) {
-          // We find the first none-disabled item (if one exists)
-          this._focusNext();
-        }
-      });
-    },
-
-    /**
-     * Handler that is called when the up key is pressed.
-     *
-     * @param {CustomEvent} event A key combination event.
-     */
-    _onUpKey: function(event) {
-      // up and down arrows moves the focus
-      this._focusPrevious();
-      event.detail.keyboardEvent.preventDefault();
-    },
-
-    /**
-     * Handler that is called when the down key is pressed.
-     *
-     * @param {CustomEvent} event A key combination event.
-     */
-    _onDownKey: function(event) {
-      this._focusNext();
-      event.detail.keyboardEvent.preventDefault();
-    },
-
-    /**
-     * Handler that is called when the esc key is pressed.
-     *
-     * @param {CustomEvent} event A key combination event.
-     */
-    _onEscKey: function(event) {
-      // esc blurs the control
-      this.focusedItem.blur();
-    },
-
-    /**
-     * Handler that is called when a keydown event is detected.
-     *
-     * @param {KeyboardEvent} event A keyboard event.
-     */
-    _onKeydown: function(event) {
-      if (!this.keyboardEventMatchesKeys(event, 'up down esc')) {
-        // all other keys focus the menu item starting with that character
-        this._focusWithKeyboardEvent(event);
-      }
-      event.stopPropagation();
-    },
-
-    // override _activateHandler
-    _activateHandler: function(event) {
-      Polymer.IronSelectableBehavior._activateHandler.call(this, event);
-      event.stopPropagation();
-    },
-
-    /**
-     * Updates this element's tab index when it's enabled/disabled.
-     * @param {boolean} disabled
-     */
-    _disabledChanged: function(disabled) {
-      if (disabled) {
-        this._previousTabIndex = this.hasAttribute('tabindex') ? this.tabIndex : 0;
-        this.removeAttribute('tabindex');  // No tabindex means not tab-able or select-able.
-      } else if (!this.hasAttribute('tabindex')) {
-        this.setAttribute('tabindex', this._previousTabIndex);
-      }
-    }
-  };
-
-  Polymer.IronMenuBehaviorImpl._shiftTabPressed = false;
-
-  /** @polymerBehavior Polymer.IronMenuBehavior */
-  Polymer.IronMenuBehavior = [
-    Polymer.IronMultiSelectableBehavior,
-    Polymer.IronA11yKeysBehavior,
-    Polymer.IronMenuBehaviorImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/iron-menubar-behavior.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/iron-menubar-behavior.html
deleted file mode 100644
index f3b6518..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/iron-menubar-behavior.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="iron-menu-behavior.html">
-
-<script>
-
-  /**
-   * `Polymer.IronMenubarBehavior` implements accessible menubar behavior.
-   *
-   * @polymerBehavior Polymer.IronMenubarBehavior
-   */
-  Polymer.IronMenubarBehaviorImpl = {
-
-    hostAttributes: {
-      'role': 'menubar'
-    },
-
-    keyBindings: {
-      'left': '_onLeftKey',
-      'right': '_onRightKey'
-    },
-
-    _onUpKey: function(event) {
-      this.focusedItem.click();
-      event.detail.keyboardEvent.preventDefault();
-    },
-
-    _onDownKey: function(event) {
-      this.focusedItem.click();
-      event.detail.keyboardEvent.preventDefault();
-    },
-
-    get _isRTL() {
-      return window.getComputedStyle(this)['direction'] === 'rtl';
-    },
-
-    _onLeftKey: function(event) {
-      if (this._isRTL) {
-        this._focusNext();
-      } else {
-        this._focusPrevious();
-      }
-      event.detail.keyboardEvent.preventDefault();
-    },
-
-    _onRightKey: function(event) {
-      if (this._isRTL) {
-        this._focusPrevious();
-      } else {
-        this._focusNext();
-      }
-      event.detail.keyboardEvent.preventDefault();
-    },
-
-    _onKeydown: function(event) {
-      if (this.keyboardEventMatchesKeys(event, 'up down left right esc')) {
-        return;
-      }
-
-      // all other keys focus the menu item starting with that character
-      this._focusWithKeyboardEvent(event);
-    }
-
-  };
-
-  /** @polymerBehavior Polymer.IronMenubarBehavior */
-  Polymer.IronMenubarBehavior = [
-    Polymer.IronMenuBehavior,
-    Polymer.IronMenubarBehaviorImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/index.html
deleted file mode 100644
index 851835b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>iron-menu-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'iron-menu-behavior.html',
-        'iron-menubar-behavior.html',
-        'iron-menu-behavior.html?dom=shadow',
-        'iron-menubar-behavior.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/iron-menu-behavior.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/iron-menu-behavior.html
deleted file mode 100644
index 07c3f92..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/iron-menu-behavior.html
+++ /dev/null
@@ -1,617 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>iron-menu-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../iron-test-helpers/mock-interactions.js"></script>
-    <link rel="import" href="test-menu.html">
-    <link rel="import" href="test-nested-menu.html">
-
-    <style>
-      .ghost, [hidden] {
-        display: none;
-      }
-      .invisible {
-        visibility: hidden;
-      }
-    </style>
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <test-menu>
-          <div>item 1</div>
-          <div>item 2</div>
-          <div>item 3</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-     <test-fixture id="single-item">
-      <template>
-        <test-menu>
-          <div>item 1</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="disabled">
-      <template>
-        <test-menu>
-          <div>a item 1</div>
-          <div disabled>b item 2</div>
-          <div>b item 3</div>
-          <div disabled>c item 4</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="invisible">
-      <template>
-        <test-menu>
-          <div>item 1</div>
-          <div hidden>item 2</div>
-          <div class="ghost">item 3</div>
-          <div class="invisible">item 3.1</div>
-          <div>item 4</div>
-          <div hidden>item 5</div>
-          <div class="ghost">item 6</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="nested-invisible">
-      <template>
-        <test-nested-menu></test-nested-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="only-disabled">
-      <template>
-        <test-menu>
-          <div disabled>disabled item</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="multi">
-      <template>
-        <test-menu multi>
-          <div>item 1</div>
-          <div>item 2</div>
-          <div>item 3</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="nested">
-      <template>
-        <test-menu>
-          <test-menu>
-            <div>item 1</div>
-            <div>item 2</div>
-            <div>item 3</div>
-          </test-menu>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="empty">
-      <template>
-        <test-menu></test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="disabled-group-and-options">
-      <template>
-        <test-menu disabled>
-          <div disabled>one</div>
-          <div disabled>two</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="nonzero-tabindex">
-      <template>
-        <test-menu tabindex="32">
-          <div>One</div>
-          <div>Two</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="countries">
-      <template>
-        <test-menu>
-          <div>Ghana</div>
-          <div>Uganda</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="bogus-attr-for-item-title">
-      <template>
-        <test-menu attr-for-item-title="totally-doesnt-exist">
-          <div>Focused by default</div>
-          <div>I'm not entitled!</div>
-        </test-menu>
-      </template>
-    </test-fixture>
-
-    <script>
-      suite('menu a11y tests', function() {
-        test('menu has role="menu"', function() {
-          var menu = fixture('basic');
-          assert.equal(menu.getAttribute('role'), 'menu', 'has role="menu"');
-        });
-
-        test('first item gets focus when menu is focused', function(done) {
-          var menu = fixture('basic');
-          MockInteractions.focus(menu);
-          Polymer.Base.async(function() {
-            var ownerRoot = Polymer.dom(menu.firstElementChild).getOwnerRoot() || document;
-            var activeElement = Polymer.dom(ownerRoot).activeElement;
-            assert.equal(activeElement, menu.firstElementChild, 'menu.firstElementChild is focused');
-            done();
-          });
-        });
-
-        test('first item gets focus when menu is focused in a single item menu', function(done) {
-          var menu = fixture('single-item');
-          MockInteractions.focus(menu);
-          Polymer.Base.async(function() {
-            var ownerRoot = Polymer.dom(menu.firstElementChild).getOwnerRoot() || document;
-            var activeElement = Polymer.dom(ownerRoot).activeElement;
-            assert.equal(activeElement, menu.firstElementChild, 'menu.firstElementChild is focused');
-            done();
-          });
-        });
-
-        test('selected item gets focus when menu is focused', function(done) {
-          var menu = fixture('basic');
-          menu.selected = 1;
-          MockInteractions.focus(menu);
-          Polymer.Base.async(function() {
-            var ownerRoot = Polymer.dom(menu.selectedItem).getOwnerRoot() || document;
-            var activeElement = Polymer.dom(ownerRoot).activeElement;
-            assert.equal(activeElement, menu.selectedItem, 'menu.selectedItem is focused');
-            done();
-          });
-        });
-
-        test('focusing on next item skips disabled items', function(done) {
-          var menu = fixture('disabled');
-          MockInteractions.focus(menu);
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press down
-            MockInteractions.keyDownOn(menu, 40);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[2], 'menu.items[2] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on next item skips invisible items', function(done) {
-          var menu = fixture('invisible');
-
-          MockInteractions.focus(menu);
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press down
-            MockInteractions.keyDownOn(menu, 40);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[4], 'menu.items[4] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on next item skips nested invisible items', function(done) {
-          var nestedMenu = fixture('nested-invisible');
-          var menu = nestedMenu.$.actualMenu;
-
-          MockInteractions.focus(menu);
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press down
-            MockInteractions.keyDownOn(menu, 40);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[4], 'menu.items[4] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on next item in empty menu', function(done) {
-          var menu = fixture('empty');
-          MockInteractions.focus(menu);
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press down
-            MockInteractions.keyDownOn(menu, 40);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, undefined, 'no focused item');
-              done();
-            });
-          });
-        });
-
-        test('focusing on next item in all disabled menu', function(done) {
-          var menu = fixture('only-disabled');
-          MockInteractions.focus(menu);
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press down
-            MockInteractions.keyDownOn(menu, 40);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, undefined, 'no focused item');
-              done();
-            });
-          });
-        });
-
-        test('focusing on previous item skips disabled items', function(done) {
-          var menu = fixture('disabled');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press up
-            MockInteractions.keyDownOn(menu, 38);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[2], 'menu.items[2] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on previous item skips invisible items', function(done) {
-          var menu = fixture('invisible');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press up
-            MockInteractions.keyDownOn(menu, 38);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[4], 'menu.items[4] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on previous item skips nested invisible items', function(done) {
-          var nestedMenu = fixture('nested-invisible');
-          var menu = nestedMenu.$.actualMenu;
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press up
-            MockInteractions.keyDownOn(menu, 38);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[4], 'menu.items[4] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on previous item in empty menu', function(done) {
-          var menu = fixture('empty');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press up
-            MockInteractions.keyDownOn(menu, 38);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem,  undefined, 'no focused item');
-              done();
-            });
-          });
-        });
-
-        test('focusing on previous item in all disabled menu', function(done) {
-          var menu = fixture('only-disabled');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press up
-            MockInteractions.keyDownOn(menu, 38);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem,  undefined, 'no focused item');
-              done();
-            });
-          });
-        });
-
-        test('focusing on item using key press skips disabled items', function(done) {
-          var menu = fixture('disabled');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press 'b'
-            MockInteractions.keyDownOn(menu, 66);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[2], 'menu.items[2] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on item using key press ignores disabled items', function(done) {
-          var menu = fixture('disabled');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press 'c'
-            MockInteractions.keyDownOn(menu, 67);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[0], 'menu.items[0] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on item using key press in all disabled items', function(done) {
-          var menu = fixture('only-disabled');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press 'c'
-            MockInteractions.keyDownOn(menu, 67);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem,  undefined, 'no focused item');
-              done();
-            });
-          });
-        });
-
-        test('focusing on item with multi-char, quick input', function(done) {
-          var menu = fixture('countries');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press 'u'
-            MockInteractions.keyDownOn(menu, 85);
-
-            // Key press 'g'
-            MockInteractions.keyDownOn(menu, 71);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[1], 'menu.items[1] is focused');
-              done();
-            });
-          });
-        });
-
-        test('focusing on item with bogus attr-for-item-title', function(done) {
-          var menu = fixture('bogus-attr-for-item-title');
-          MockInteractions.focus(menu);
-
-          // Wait for async focus
-          Polymer.Base.async(function() {
-            // Key press 'i'
-            MockInteractions.keyDownOn(menu, 73);
-
-            Polymer.Base.async(function() {
-              var focusedItem = Polymer.dom(menu).node.focusedItem;
-              assert.equal(focusedItem, menu.items[0], 'menu.items[0] is still focused');
-              done();
-            });
-          });
-
-        });
-
-        test('focusing non-item content does not auto-focus an item', function(done) {
-          var menu = fixture('basic');
-          menu.extraContent.focus();
-          Polymer.Base.async(function() {
-            var menuOwnerRoot = Polymer.dom(menu.extraContent).getOwnerRoot() || document;
-            var menuActiveElement = Polymer.dom(menuOwnerRoot).activeElement;
-            assert.equal(menuActiveElement, menu.extraContent, 'menu.extraContent is focused');
-            assert.equal(Polymer.dom(document).activeElement, menu, 'menu is document.activeElement');
-            done();
-          });
-        });
-
-        test('last activated item in a multi select menu is focused', function(done) {
-          var menu = fixture('multi');
-          menu.selected = 0;
-          menu.items[1].click();
-          Polymer.Base.async(function() {
-            var ownerRoot = Polymer.dom(menu.items[1]).getOwnerRoot() || document;
-            var activeElement = Polymer.dom(ownerRoot).activeElement;
-            assert.equal(activeElement, menu.items[1], 'menu.items[1] is focused');
-            done();
-          });
-        });
-
-        test('deselection in a multi select menu focuses deselected item', function(done) {
-          var menu = fixture('multi');
-          menu.selected = 0;
-          menu.items[0].click();
-          Polymer.Base.async(function() {
-            var ownerRoot = Polymer.dom(menu.items[0]).getOwnerRoot() || document;
-            var activeElement = Polymer.dom(ownerRoot).activeElement;
-            assert.equal(activeElement, menu.items[0], 'menu.items[0] is focused');
-            done();
-          });
-        });
-
-        test('keyboard events should not bubble', function(done) {
-          var menu = fixture('nested');
-          var keyCounter = 0;
-
-          menu.addEventListener('keydown', function(event) {
-            if (menu.keyboardEventMatchesKeys(event, 'esc')) {
-              keyCounter++;
-            }
-            if (menu.keyboardEventMatchesKeys(event, 'up')) {
-              keyCounter++;
-            }
-            if (menu.keyboardEventMatchesKeys(event, 'down')) {
-              keyCounter++;
-            }
-          });
-
-          // up
-          MockInteractions.keyDownOn(menu.firstElementChild, 38);
-          // down
-          MockInteractions.keyDownOn(menu.firstElementChild, 40);
-          // esc
-          MockInteractions.keyDownOn(menu.firstElementChild, 27);
-
-          Polymer.Base.async(function() {
-            assert.equal(menu.firstElementChild.tagName, 'TEST-MENU');
-            assert.equal(keyCounter, 0);
-            done();
-          });
-        });
-
-        test('empty menus don\'t unfocus themselves', function(done) {
-          var menu = fixture('empty');
-
-          menu.focus();
-          Polymer.Base.async(function() {
-            assert.equal(Polymer.dom(document).activeElement, menu);
-            done();
-          });
-        });
-
-        test('A disabled menu should not be focusable', function(done) {
-          var menu = fixture('disabled-group-and-options');
-          menu.focus();
-          Polymer.Base.async(function() {
-            assert.notEqual(Polymer.dom(document).activeElement, menu);
-            assert.notEqual(Polymer.dom(document).activeElement, menu.items[0]);
-            assert.notEqual(Polymer.dom(document).activeElement, menu.items[1]);
-            done();
-          });
-        });
-
-        test('A disabled menu will not have a tab index.', function() {
-          var menu = fixture('countries');
-          assert.equal(menu.getAttribute('tabindex'), '0');
-          menu.disabled = true;
-          assert.equal(menu.getAttribute('tabindex'), null);
-          menu.disabled = false;
-          assert.equal(menu.getAttribute('tabindex'), '0');
-        });
-
-        test('Updated tab index of disabled element should remain.', function() {
-          var menu = fixture('countries');
-          assert.equal(menu.getAttribute('tabindex'), '0');
-          menu.disabled = true;
-          assert.equal(menu.getAttribute('tabindex'), null);
-          menu.setAttribute('tabindex', 15);
-          assert.equal(menu.getAttribute('tabindex'), '15');
-          menu.disabled = false;
-          assert.equal(menu.getAttribute('tabindex'), '15');
-        });
-
-        test('A disabled menu will regain its non-zero tab index when re-enabled.', function() {
-          var menu = fixture('nonzero-tabindex');
-          assert.equal(menu.getAttribute('tabindex'), '32');
-          menu.disabled = true;
-          assert.equal(menu.getAttribute('tabindex'), null);
-          menu.disabled = false;
-          assert.equal(menu.getAttribute('tabindex'), '32');
-        });
-
-        test('`tabIndex` properties of all items are updated when items change', function(done) {
-          var menu = fixture('basic');
-
-          function assertTabIndexCounts(nodes, expected) {
-            var tabIndexCounts = {};
-            for (var i = 0; i < nodes.length; i++) {
-              var tabIndex = nodes[i].tabIndex;
-              if (tabIndexCounts[tabIndex]) {
-                tabIndexCounts[tabIndex]++;
-              } else {
-                tabIndexCounts[tabIndex] = 1;
-              }
-            }
-
-            assert.equal(Object.keys(tabIndexCounts).length, Object.keys(expected).length);
-            Object.keys(expected).forEach(function(key) {
-              assert.equal(tabIndexCounts[key], expected[key]);
-            });
-          }
-
-          function divWithTabIndex(tabIndex) {
-            var div = document.createElement('div');
-            div.tabIndex = tabIndex;
-            return div;
-          }
-
-          // Only the selected item will have tabIndex 0.
-          menu.select(0);
-          assertTabIndexCounts(menu.items, {"-1": 2, "0": 1});
-
-          Polymer.dom(menu).appendChild(divWithTabIndex(1));
-          Polymer.dom(menu).appendChild(divWithTabIndex(2));
-          Polymer.dom(menu).appendChild(divWithTabIndex(3));
-
-          // Async wait for `observeNodes`.
-          Polymer.Base.async(function() {
-            assertTabIndexCounts(menu.items, {"-1": 5, "0": 1});
-            done();
-          });
-        });
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/iron-menubar-behavior.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/iron-menubar-behavior.html
deleted file mode 100644
index 78af4ea..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/iron-menubar-behavior.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>iron-menubar-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-    <link rel="import" href="test-menubar.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <test-menubar>
-          <div>item 1</div>
-          <div>item 2</div>
-          <div>item 3</div>
-        </test-menubar>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="multi">
-      <template>
-        <test-menubar multi>
-          <div>item 1</div>
-          <div>item 2</div>
-          <div>item 3</div>
-        </test-menubar>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="rtl">
-      <template>
-        <div dir="rtl">
-          <test-menubar>
-            <div>item 1</div>
-            <div>item 2</div>
-            <div>item 3</div>
-          </test-menubar>
-        </div>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('menubar a11y tests', function() {
-
-        test('menubar has role="menubar"', function() {
-          var menubar = fixture('basic');
-          assert.equal(menubar.getAttribute('role'), 'menubar', 'has role="menubar"');
-        });
-
-        test('first item gets focus when menubar is focused', function(done) {
-          var menubar = fixture('basic');
-          MockInteractions.focus(menubar);
-          Polymer.Base.async(function() {
-            assert.equal(Polymer.dom(document).activeElement, menubar.firstElementChild, 'document.activeElement is first item')
-            done();
-          });
-        });
-
-        test('selected item gets focus when menubar is focused', function(done) {
-          var menubar = fixture('basic');
-          menubar.selected = 1;
-          MockInteractions.focus(menubar);
-          Polymer.Base.async(function() {
-            assert.equal(Polymer.dom(document).activeElement, menubar.selectedItem, 'document.activeElement is selected item');
-            done();
-          });
-        });
-
-        test('focusing non-item content does not auto-focus an item', function(done) {
-          var menubar = fixture('basic');
-          menubar.extraContent.focus();
-          Polymer.Base.async(function() {
-            var ownerRoot = Polymer.dom(menubar.extraContent).getOwnerRoot() || document;
-            var activeElement = Polymer.dom(ownerRoot).activeElement;
-            assert.equal(activeElement, menubar.extraContent, 'menubar.extraContent is focused');
-            assert.equal(Polymer.dom(document).activeElement, menubar, 'menubar is document.activeElement');
-            done();
-          });
-        });
-
-        test('last activated item in a multi select menubar is focused', function(done) {
-          var menubar = fixture('multi');
-          menubar.selected = 0;
-          menubar.items[1].click();
-          Polymer.Base.async(function() {
-            assert.equal(Polymer.dom(document).activeElement, menubar.items[1], 'document.activeElement is last activated item');
-            done();
-          });
-        });
-
-        test('deselection in a multi select menubar focuses deselected item', function(done) {
-          var menubar = fixture('multi');
-          menubar.selected = 0;
-          menubar.items[0].click();
-          Polymer.Base.async(function() {
-            assert.equal(Polymer.dom(document).activeElement, menubar.items[0], 'document.activeElement is last activated item');
-            done();
-          });
-        });
-
-        suite('left / right keys are reversed when the menubar has RTL directionality', function() {
-          var LEFT = 37;
-          var RIGHT = 39;
-
-          test('left key moves to the next item', function() {
-            var rtlContainer = fixture('rtl');
-            var menubar = rtlContainer.querySelector('test-menubar');
-            menubar.selected = 0;
-            menubar.items[1].click();
-
-            assert.equal(Polymer.dom(document).activeElement, menubar.items[1]);
-
-            MockInteractions.pressAndReleaseKeyOn(menubar, LEFT);
-
-            assert.equal(Polymer.dom(document).activeElement, menubar.items[2],
-                '`document.activeElement` should be the next item.');
-            assert.equal(menubar.selected, 1,
-                '`menubar.selected` should not change.');
-          });
-
-          test('right key moves to the previous item', function() {
-            var rtlContainer = fixture('rtl');
-            var menubar = rtlContainer.querySelector('test-menubar');
-            menubar.selected = 0;
-            menubar.items[1].click();
-
-            assert.equal(Polymer.dom(document).activeElement, menubar.items[1]);
-
-            MockInteractions.pressAndReleaseKeyOn(menubar, RIGHT);
-
-            assert.equal(Polymer.dom(document).activeElement, menubar.items[0],
-                '`document.activeElement` should be the previous item');
-            assert.equal(menubar.selected, 1,
-                '`menubar.selected` should not change.');
-          });
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-menu.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-menu.html
deleted file mode 100644
index aa8eab2..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-menu.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-menu-behavior.html">
-
-<dom-module id="test-menu">
-
-  <template>
-
-    <content></content>
-
-    <div id="extraContent" tabindex="-1">focusable extra content</div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'test-menu',
-
-    behaviors: [
-      Polymer.IronMenuBehavior
-    ],
-
-    get extraContent() {
-      return this.$.extraContent;
-    }
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-menubar.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-menubar.html
deleted file mode 100644
index 66ce6fd..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-menubar.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-menubar-behavior.html">
-
-<dom-module id="test-menubar">
-
-  <template>
-
-    <content></content>
-
-    <div id="extraContent" tabindex="-1">focusable extra content</div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'test-menubar',
-
-    behaviors: [
-      Polymer.IronMenubarBehavior
-    ],
-
-    get extraContent() {
-      return this.$.extraContent;
-    }
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-nested-menu.html b/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-nested-menu.html
deleted file mode 100644
index 9eab85f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-menu-behavior/test/test-nested-menu.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="test-menu.html">
-
-<dom-module id="test-nested-menu">
-  <template>
-    <style>
-      .ghost, [hidden] {
-        display: none !important;
-      }
-      .invisible {
-        visibility: hidden;
-      }
-    </style>
-    <test-menu id="actualMenu">
-      <div>item 1</div>
-      <div hidden>item 2</div>
-      <div class="ghost">item 3</div>
-      <div class="invisible">item 3.1</div>
-      <div>item 4</div>
-      <div hidden>item 5</div>
-      <div class="ghost">item 6</div>
-    </test-menu>
-  </template>
-</dom-module>
-
-<script>
-
-(function() {
-  Polymer({
-    is: 'test-nested-menu',
-  });
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-meta/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/README.md b/systrace/catapult/third_party/polymer/components/iron-meta/README.md
deleted file mode 100644
index 3f2ebb3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/README.md
+++ /dev/null
@@ -1,110 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-meta.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-meta.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-meta)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-meta)_
-
-
-##&lt;iron-meta&gt;
-
-`iron-meta` is a generic element you can use for sharing information across the DOM tree.
-It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any
-instance of iron-meta has access to the shared
-information. You can use `iron-meta` to share whatever you want (or create an extension
-[like x-meta] for enhancements).
-
-The `iron-meta` instances containing your actual data can be loaded in an import,
-or constructed in any way you see fit. The only requirement is that you create them
-before you try to access them.
-
-Examples:
-
-If I create an instance like this:
-
-```html
-<iron-meta key="info" value="foo/bar"></iron-meta>
-```
-
-Note that value="foo/bar" is the metadata I've defined. I could define more
-attributes or use child nodes to define additional metadata.
-
-Now I can access that element (and it's metadata) from any iron-meta instance
-via the byKey method, e.g.
-
-```javascript
-meta.byKey('info');
-```
-
-Pure imperative form would be like:
-
-```javascript
-document.createElement('iron-meta').byKey('info');
-```
-
-Or, in a Polymer element, you can include a meta in your template:
-
-```html
-<iron-meta id="meta"></iron-meta>
-...
-this.$.meta.byKey('info');
-```
-
-
-
-##&lt;iron-meta-query&gt;
-
-`iron-meta` is a generic element you can use for sharing information across the DOM tree.
-It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any
-instance of iron-meta has access to the shared
-information. You can use `iron-meta` to share whatever you want (or create an extension
-[like x-meta] for enhancements).
-
-The `iron-meta` instances containing your actual data can be loaded in an import,
-or constructed in any way you see fit. The only requirement is that you create them
-before you try to access them.
-
-Examples:
-
-If I create an instance like this:
-
-```html
-<iron-meta key="info" value="foo/bar"></iron-meta>
-```
-
-Note that value="foo/bar" is the metadata I've defined. I could define more
-attributes or use child nodes to define additional metadata.
-
-Now I can access that element (and it's metadata) from any iron-meta instance
-via the byKey method, e.g.
-
-```javascript
-meta.byKey('info');
-```
-
-Pure imperative form would be like:
-
-```javascript
-document.createElement('iron-meta').byKey('info');
-```
-
-Or, in a Polymer element, you can include a meta in your template:
-
-```html
-<iron-meta id="meta"></iron-meta>
-...
-this.$.meta.byKey('info');
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/bower.json b/systrace/catapult/third_party/polymer/components/iron-meta/bower.json
deleted file mode 100644
index 5ab0c84..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/bower.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "iron-meta",
-  "version": "1.1.3",
-  "keywords": [
-    "web-components",
-    "polymer"
-  ],
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Useful for sharing information across a DOM tree",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-meta.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "polymerelements/paper-styles#^1.0.4",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "main": "iron-meta.html",
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-meta/demo/index.html
deleted file mode 100644
index 0fc39e3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/demo/index.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <title>iron-meta</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../iron-meta.html">
-</head>
-<body>
-
-  <div class="vertical-section centered">
-    <h1>&lt;iron-meta&gt;</h1>
-    <h2>Key Query</h2>
-
-    <iron-meta key="info" value="foo/bar"></iron-meta>
-
-    The <code>value</code> stored at <code>key="info"</code> is <code><meta-test></meta-test></code>.
-  </div>
-
-  <div class="vertical-section centered">
-    <h2>Type Query</h2>
-
-    <iron-meta type="type1" key="a" value="Polymer"></iron-meta>
-    <iron-meta type="type1" key="b" value="is"></iron-meta>
-    <iron-meta type="type2" key="a" value="wonderful"></iron-meta>
-    <iron-meta type="type2" key="b" value="<3"></iron-meta>
-
-    The <code>value(s)</code> stored at <code>type="type1"</code> are:<br><code><type-one></type-one></code>.<br><br>The <code>value(s)</code> stored at <code>type="type2"</code> are:<br><code><type-two></type-two></code>.
-  </div>
-
-  <script>
-    document.addEventListener('WebComponentsReady', function() {
-      Polymer({
-        is: 'meta-test',
-        ready: function() {
-          this.textContent = new Polymer.IronMetaQuery({key: 'info'}).value;
-        }
-      });
-    });
-
-    Polymer({
-      is: 'type-one',
-
-      ready: function() {
-        var resultList = new Polymer.IronMetaQuery({type: "type1"}).list;
-        this.textContent = JSON.stringify(resultList);
-      }
-    });
-
-    Polymer({
-      is: 'type-two',
-
-      ready: function() {
-        var resultList = new Polymer.IronMetaQuery({type: "type2"}).list;
-        this.textContent = JSON.stringify(resultList);
-      }
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/hero.svg b/systrace/catapult/third_party/polymer/components/iron-meta/hero.svg
deleted file mode 100755
index 8d36c50..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/hero.svg
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<circle cx="22" cy="85" r="4"/>

-	<circle cx="88" cy="98" r="4"/>

-	<path d="M87.5,100c-3.8-0.3-5.5-2.8-7-5c-1.4-2.1-2.7-3.9-5.5-4.2c-2.8-0.3-4.4,1.3-6.2,3.1c-1.9,1.9-4,4-7.8,3.7

-		c-3.8-0.3-5.5-2.8-7-5c-1.4-2.1-2.7-3.9-5.5-4.2c-2.8-0.3-4.4,1.3-6.2,3.1c-1.9,1.9-4,4-7.8,3.7c-3.8-0.3-5.5-2.8-7-5

-		c-1.4-2.1-2.7-3.9-5.5-4.2l0.2-2c3.8,0.3,5.5,2.8,7,5c1.4,2.1,2.7,3.9,5.5,4.2c2.8,0.3,4.4-1.3,6.2-3.1c1.9-1.9,4-4,7.8-3.7

-		c3.8,0.3,5.5,2.8,7,5c1.4,2.1,2.7,3.9,5.5,4.2c2.8,0.3,4.4-1.3,6.2-3.1c1.9-1.9,4-4,7.8-3.7c3.8,0.3,5.5,2.8,7,5

-		c1.4,2.1,2.7,3.9,5.5,4.2L87.5,100z"/>

-	<circle cx="96" cy="86" r="4"/>

-	<circle cx="162" cy="98" r="4"/>

-	<rect x="95.5" y="91" transform="matrix(0.9839 0.1789 -0.1789 0.9839 18.5382 -21.5923)" width="67.1" height="2"/>

-	<g>

-		<path d="M27,41.5l4.5,13.4l4.9-13.4h5.4v32h-4.4V61l0.4-13.4l-5.4,14.5h-2L25.6,48L26,61v12.5h-4.4v-32H27z"/>

-		<path d="M67.5,58.7H53.4V70h16.4v3.5H49v-32h20.6V45H53.4v10.2h14.2V58.7z"/>

-		<path d="M98.5,45H88.3v28.5h-4.4V45H73.6v-3.5h24.9V45z"/>

-		<path d="M116.2,65.3H105l-2.6,8.2h-4.5l10.9-32h3.8l10.6,32h-4.5L116.2,65.3z M106.2,61.6h8.9l-4.4-14.2L106.2,61.6z"/>

-	</g>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/index.html b/systrace/catapult/third_party/polymer/components/iron-meta/index.html
deleted file mode 100644
index dce8362..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>iron-meta</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/iron-meta.html b/systrace/catapult/third_party/polymer/components/iron-meta/iron-meta.html
deleted file mode 100644
index 73d66cc..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/iron-meta.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-`iron-meta` is a generic element you can use for sharing information across the DOM tree.
-It uses [monostate pattern](http://c2.com/cgi/wiki?MonostatePattern) such that any
-instance of iron-meta has access to the shared
-information. You can use `iron-meta` to share whatever you want (or create an extension
-[like x-meta] for enhancements).
-
-The `iron-meta` instances containing your actual data can be loaded in an import,
-or constructed in any way you see fit. The only requirement is that you create them
-before you try to access them.
-
-Examples:
-
-If I create an instance like this:
-
-    <iron-meta key="info" value="foo/bar"></iron-meta>
-
-Note that value="foo/bar" is the metadata I've defined. I could define more
-attributes or use child nodes to define additional metadata.
-
-Now I can access that element (and it's metadata) from any iron-meta instance
-via the byKey method, e.g.
-
-    meta.byKey('info');
-
-Pure imperative form would be like:
-
-    document.createElement('iron-meta').byKey('info');
-
-Or, in a Polymer element, you can include a meta in your template:
-
-    <iron-meta id="meta"></iron-meta>
-    ...
-    this.$.meta.byKey('info');
-
-@group Iron Elements
-@demo demo/index.html
-@hero hero.svg
-@element iron-meta
--->
-
-<script>
-
-  (function() {
-
-    // monostate data
-    var metaDatas = {};
-    var metaArrays = {};
-    var singleton = null;
-
-    Polymer.IronMeta = Polymer({
-
-      is: 'iron-meta',
-
-      properties: {
-
-        /**
-         * The type of meta-data.  All meta-data of the same type is stored
-         * together.
-         */
-        type: {
-          type: String,
-          value: 'default',
-          observer: '_typeChanged'
-        },
-
-        /**
-         * The key used to store `value` under the `type` namespace.
-         */
-        key: {
-          type: String,
-          observer: '_keyChanged'
-        },
-
-        /**
-         * The meta-data to store or retrieve.
-         */
-        value: {
-          type: Object,
-          notify: true,
-          observer: '_valueChanged'
-        },
-
-        /**
-         * If true, `value` is set to the iron-meta instance itself.
-         */
-         self: {
-          type: Boolean,
-          observer: '_selfChanged'
-        },
-
-        /**
-         * Array of all meta-data values for the given type.
-         */
-        list: {
-          type: Array,
-          notify: true
-        }
-
-      },
-
-      hostAttributes: {
-        hidden: true
-      },
-
-      /**
-       * Only runs if someone invokes the factory/constructor directly
-       * e.g. `new Polymer.IronMeta()`
-       *
-       * @param {{type: (string|undefined), key: (string|undefined), value}=} config
-       */
-      factoryImpl: function(config) {
-        if (config) {
-          for (var n in config) {
-            switch(n) {
-              case 'type':
-              case 'key':
-              case 'value':
-                this[n] = config[n];
-                break;
-            }
-          }
-        }
-      },
-
-      created: function() {
-        // TODO(sjmiles): good for debugging?
-        this._metaDatas = metaDatas;
-        this._metaArrays = metaArrays;
-      },
-
-      _keyChanged: function(key, old) {
-        this._resetRegistration(old);
-      },
-
-      _valueChanged: function(value) {
-        this._resetRegistration(this.key);
-      },
-
-      _selfChanged: function(self) {
-        if (self) {
-          this.value = this;
-        }
-      },
-
-      _typeChanged: function(type) {
-        this._unregisterKey(this.key);
-        if (!metaDatas[type]) {
-          metaDatas[type] = {};
-        }
-        this._metaData = metaDatas[type];
-        if (!metaArrays[type]) {
-          metaArrays[type] = [];
-        }
-        this.list = metaArrays[type];
-        this._registerKeyValue(this.key, this.value);
-      },
-
-      /**
-       * Retrieves meta data value by key.
-       *
-       * @method byKey
-       * @param {string} key The key of the meta-data to be returned.
-       * @return {*}
-       */
-      byKey: function(key) {
-        return this._metaData && this._metaData[key];
-      },
-
-      _resetRegistration: function(oldKey) {
-        this._unregisterKey(oldKey);
-        this._registerKeyValue(this.key, this.value);
-      },
-
-      _unregisterKey: function(key) {
-        this._unregister(key, this._metaData, this.list);
-      },
-
-      _registerKeyValue: function(key, value) {
-        this._register(key, value, this._metaData, this.list);
-      },
-
-      _register: function(key, value, data, list) {
-        if (key && data && value !== undefined) {
-          data[key] = value;
-          list.push(value);
-        }
-      },
-
-      _unregister: function(key, data, list) {
-        if (key && data) {
-          if (key in data) {
-            var value = data[key];
-            delete data[key];
-            this.arrayDelete(list, value);
-          }
-        }
-      }
-
-    });
-
-    Polymer.IronMeta.getIronMeta = function getIronMeta() {
-       if (singleton === null) {
-         singleton = new Polymer.IronMeta();
-       }
-       return singleton;
-     };
-
-    /**
-    `iron-meta-query` can be used to access infomation stored in `iron-meta`.
-
-    Examples:
-
-    If I create an instance like this:
-
-        <iron-meta key="info" value="foo/bar"></iron-meta>
-
-    Note that value="foo/bar" is the metadata I've defined. I could define more
-    attributes or use child nodes to define additional metadata.
-
-    Now I can access that element (and it's metadata) from any `iron-meta-query` instance:
-
-         var value = new Polymer.IronMetaQuery({key: 'info'}).value;
-
-    @group Polymer Iron Elements
-    @element iron-meta-query
-    */
-    Polymer.IronMetaQuery = Polymer({
-
-      is: 'iron-meta-query',
-
-      properties: {
-
-        /**
-         * The type of meta-data.  All meta-data of the same type is stored
-         * together.
-         */
-        type: {
-          type: String,
-          value: 'default',
-          observer: '_typeChanged'
-        },
-
-        /**
-         * Specifies a key to use for retrieving `value` from the `type`
-         * namespace.
-         */
-        key: {
-          type: String,
-          observer: '_keyChanged'
-        },
-
-        /**
-         * The meta-data to store or retrieve.
-         */
-        value: {
-          type: Object,
-          notify: true,
-          readOnly: true
-        },
-
-        /**
-         * Array of all meta-data values for the given type.
-         */
-        list: {
-          type: Array,
-          notify: true
-        }
-
-      },
-
-      /**
-       * Actually a factory method, not a true constructor. Only runs if
-       * someone invokes it directly (via `new Polymer.IronMeta()`);
-       *
-       * @param {{type: (string|undefined), key: (string|undefined)}=} config
-       */
-      factoryImpl: function(config) {
-        if (config) {
-          for (var n in config) {
-            switch(n) {
-              case 'type':
-              case 'key':
-                this[n] = config[n];
-                break;
-            }
-          }
-        }
-      },
-
-      created: function() {
-        // TODO(sjmiles): good for debugging?
-        this._metaDatas = metaDatas;
-        this._metaArrays = metaArrays;
-      },
-
-      _keyChanged: function(key) {
-        this._setValue(this._metaData && this._metaData[key]);
-      },
-
-      _typeChanged: function(type) {
-        this._metaData = metaDatas[type];
-        this.list = metaArrays[type];
-        if (this.key) {
-          this._keyChanged(this.key);
-        }
-      },
-
-      /**
-       * Retrieves meta data value by key.
-       * @param {string} key The key of the meta-data to be returned.
-       * @return {*}
-       */
-      byKey: function(key) {
-        return this._metaData && this._metaData[key];
-      }
-
-    });
-
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-meta/test/basic.html
deleted file mode 100644
index c561dc3..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/test/basic.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-meta-basic</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../iron-meta.html">
-
-</head>
-<body>
-
-  <iron-meta key="info" value="foo/bar"></iron-meta>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('byKey', function() {
-        var meta = document.createElement('iron-meta');
-        assert.equal(meta.byKey('info'), 'foo/bar');
-      });
-
-      test('list', function() {
-        var meta = document.createElement('iron-meta');
-        assert.equal(meta.list.length, 1);
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/test/index.html b/systrace/catapult/third_party/polymer/components/iron-meta/test/index.html
deleted file mode 100644
index 2fb0d69..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/test/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-  <meta charset="utf-8">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-
-</head>
-<body>
-
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'iron-meta.html',
-      'basic.html?dom=shadow',
-      'iron-meta.html?dom=shadow'
-    ]);
-  </script>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-meta/test/iron-meta.html b/systrace/catapult/third_party/polymer/components/iron-meta/test/iron-meta.html
deleted file mode 100644
index c4dc250..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-meta/test/iron-meta.html
+++ /dev/null
@@ -1,195 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-meta</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link rel="import" href="../iron-meta.html">
-    <link rel="import" href="../../test-fixture/test-fixture.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="TrivialMeta">
-      <template>
-        <iron-meta self key="info"></iron-meta>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="ManyMetas">
-      <template>
-        <iron-meta self key="default1"></iron-meta>
-        <iron-meta self key="default2"></iron-meta>
-        <iron-meta self key="default3"></iron-meta>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="DifferentTypedMetas">
-      <template>
-        <iron-meta self type="foo" key="foobarKey"></iron-meta>
-        <iron-meta self type="bar" key="foobarKey"></iron-meta>
-        <iron-meta self key="defaultKey"></iron-meta>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="ClashingMetas">
-      <template>
-        <iron-meta self key="baz"></iron-meta>
-        <iron-meta self key="baz"></iron-meta>
-      </template>
-    </test-fixture>
-
-    <script>
-suite('<iron-meta>', function () {
-  suite('basic behavior', function () {
-    var meta;
-
-    setup(function () {
-      meta = fixture('TrivialMeta');
-    });
-
-    teardown(function () {
-      meta.key = null;
-    });
-
-    test('uses itself as the default value', function () {
-      expect(meta.value).to.be.equal(meta);
-    });
-
-    test('can be assigned alternative values', function () {
-      meta.value = 'foobar';
-
-      expect(meta.list[0]).to.be.equal('foobar');
-    });
-
-    test('can access same-type meta values by key', function () {
-      expect(meta.byKey(meta.key)).to.be.equal(meta.value);
-    });
-
-    test('yields a list of same-type meta data', function () {
-      expect(meta.list).to.be.ok;
-      expect(meta.list.length).to.be.equal(1);
-      expect(meta.list[0]).to.be.equal(meta);
-    });
-  });
-
-  suite('many same-typed metas', function () {
-    var metas;
-
-    setup(function () {
-      metas = fixture('ManyMetas');
-    });
-
-    teardown(function () {
-      metas.forEach(function (meta) {
-        meta.key = null;
-      });
-    });
-
-    test('all cache all meta values', function () {
-      metas.forEach(function (meta, index) {
-        expect(meta.list.length).to.be.equal(metas.length);
-        expect(meta.list[index].value).to.be.equal(meta.value);
-      });
-    });
-
-    test('can be unregistered individually', function () {
-      metas[0].key = null;
-
-      expect(metas[0].list.length).to.be.equal(2);
-      expect(metas[0].list).to.be.deep.equal([metas[1], metas[2]])
-    });
-
-    test('can access each others value by key', function () {
-      expect(metas[0].byKey('default2')).to.be.equal(metas[1].value);
-    });
-  });
-
-  suite('different-typed metas', function () {
-    var metas;
-
-    setup(function () {
-      metas = fixture('DifferentTypedMetas');
-    });
-
-    teardown(function () {
-      metas.forEach(function (meta) {
-        meta.key = null;
-      });
-    });
-
-    test('cache their values separately', function () {
-      var fooMeta = metas[0];
-      var barMeta = metas[1];
-
-      expect(fooMeta.value).to.not.be.equal(barMeta.value);
-      expect(fooMeta.byKey('foobarKey')).to.be.equal(fooMeta.value);
-      expect(barMeta.byKey('foobarKey')).to.be.equal(barMeta.value);
-    });
-
-    test('cannot access values of other types', function () {
-      var defaultMeta = metas[2];
-
-      expect(defaultMeta.byKey('foobarKey')).to.be.equal(undefined);
-    });
-
-    test('only list values of their type', function () {
-      metas.forEach(function (meta) {
-        expect(meta.list.length).to.be.equal(1);
-        expect(meta.list[0]).to.be.equal(meta.value);
-      })
-    });
-  });
-
-  suite('metas with clashing keys', function () {
-    var metaPair;
-
-    setup(function () {
-      metaPair = fixture('ClashingMetas');
-    });
-
-    teardown(function () {
-      metaPair.forEach(function (meta) {
-        meta.key = null;
-      });
-    });
-
-    test('let the last value win registration against the key', function () {
-      var registeredValue = metaPair[0].byKey(metaPair[0].key);
-      var firstValue = metaPair[0].value;
-      var secondValue = metaPair[1].value;
-
-      expect(registeredValue).to.not.be.equal(firstValue);
-      expect(registeredValue).to.be.equal(secondValue);
-    });
-  });
-
-  suite('singleton', function () {
-
-    test('only one ironmeta created', function () {
-      var first = Polymer.IronMeta.getIronMeta();
-      var second = Polymer.IronMeta.getIronMeta();
-      expect(first).to.be.equal(second);
-    });
-  });
-});
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/README.md
deleted file mode 100644
index d4ac2af..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/README.md
+++ /dev/null
@@ -1,78 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-overlay-backdrop.html  iron-overlay-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-overlay-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-overlay-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-overlay-behavior)_
-
-
-##Polymer.IronOverlayBehavior
-
-Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays
-on top of other content. It includes an optional backdrop, and can be used to implement a variety
-of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once.
-
-See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
-for an example.
-
-### Closing and canceling
-
-An overlay may be hidden by closing or canceling. The difference between close and cancel is user
-intent. Closing generally implies that the user acknowledged the content on the overlay. By default,
-it will cancel whenever the user taps outside it or presses the escape key. This behavior is
-configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
-`close()` should be called explicitly by the implementer when the user interacts with a control
-in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled'
-event. Call `preventDefault` on this event to prevent the overlay from closing.
-
-### Positioning
-
-By default the element is sized and positioned to fit and centered inside the window. You can
-position and size it manually using CSS. See `Polymer.IronFitBehavior`.
-
-### Backdrop
-
-Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is
-appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling
-options.
-
-In addition, `with-backdrop` will wrap the focus within the content in the light DOM.
-Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes)
-to achieve a different behavior.
-
-### Limitations
-
-The element is styled to appear on top of other content by setting its `z-index` property. You
-must ensure no element has a stacking context with a higher `z-index` than its parent stacking
-context. You should place this element as a child of `<body>` whenever possible.
-
-
-
-##&lt;iron-overlay-backdrop&gt;
-
-`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a
-singleton.
-
-### Styling
-
-The following custom properties and mixins are available for styling.
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--iron-overlay-backdrop-background-color` | Backdrop background color | #000 |
-| `--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6 |
-| `--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {} |
-| `--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {} |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/bower.json
deleted file mode 100644
index 621f28b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/bower.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "name": "iron-overlay-behavior",
-  "version": "1.10.4",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Provides a behavior for making an element an overlay",
-  "private": true,
-  "main": "iron-overlay-behavior.html",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "behavior",
-    "overlay"
-  ],
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-overlay-behavior.git"
-  },
-  "dependencies": {
-    "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
-    "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.0.0",
-    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.2",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/demo/index.html
deleted file mode 100644
index 4933bf7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/demo/index.html
+++ /dev/null
@@ -1,188 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <title>simple-overlay demo</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
-  <link rel="import" href="simple-overlay.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    demo-snippet {
-      --demo-snippet-code: {
-        max-height: 250px;
-      }
-    }
-  </style>
-
-</head>
-
-<body unresolved class="centered">
-
-  <h3>An element with <code>IronOverlayBehavior</code> can be opened, closed, toggled.</h3>
-  <demo-snippet>
-    <template>
-      <button onclick="plain.open()">Plain overlay</button>
-      <simple-overlay id="plain" tabindex=-1>
-        <h2>Hello world!</h2>
-        <p>This can be closed by pressing the ESC key too.</p>
-        <button onclick="plain.close()">Close</button>
-      </simple-overlay>
-    </template>
-  </demo-snippet>
-
-  <h3>Use <code>with-backdrop</code> to add a backdrop to your overlay. Tabbing will be trapped within the overlay.</h3>
-  <demo-snippet>
-    <template>
-      <button onclick="backdrop.open()">Overlay with backdrop</button>
-      <simple-overlay id="backdrop" with-backdrop>
-        <p>Hello world!</p>
-        <button>Button</button>
-        <button onclick="backdrop.close()">Close</button>
-      </simple-overlay>
-    </template>
-  </demo-snippet>
-
-  <h3>Use <code>restore-focus-on-close</code> to return the focus to the element that opened the overlay when it gets closed.</h3>
-  <demo-snippet>
-    <template>
-      <button onclick="returnFocus.open()">Overlay that restores focus</button>
-      <simple-overlay id="returnFocus" restore-focus-on-close>
-        <p>Hello world!</p>
-        <button onclick="returnFocus.close()">Close</button>
-      </simple-overlay>
-    </template>
-  </demo-snippet>
-
-  <h3>The child with <code>autofocus</code> gets focused when opening the overlay.</h3>
-  <demo-snippet>
-    <template>
-      <button onclick="withAutofocus.open()">Overlay with autofocus child</button>
-      <simple-overlay id="withAutofocus">
-        <p>Hello world!</p>
-        <button autofocus>autofocus</button>
-        <button onclick="withAutofocus.close()">Close</button>
-      </simple-overlay>
-    </template>
-  </demo-snippet>
-
-  <h3>Multiple overlays can be opened.</h3>
-  <demo-snippet>
-    <template>
-      <button onclick="multiple.open()">Open first overlay</button>
-      <simple-overlay id="multiple" tabindex=-1>
-        <p>click to open another overlay</p>
-        <button onclick="multiple2.open()">Open second overlay</button>
-        <button onclick="multiple.close()">Close this</button>
-      </simple-overlay>
-      <simple-overlay id="multiple2" tabindex=-1>
-        <h2>Hi!</h2>
-        <button onclick="multiple2.close()">Close</button>
-      </simple-overlay>
-    </template>
-  </demo-snippet>
-
-  <h3>Use <code>always-on-top</code> to keep the overlay on top of others.</h3>
-  <demo-snippet>
-    <template>
-      <button onclick="onTop.open()">Open always-on-top</button>
-      <simple-overlay id="onTop" always-on-top tabindex=-1>
-        <h2>Always on top</h2>
-        <button onclick="backdrop2.open()">Open with backdrop</button>
-        <button onclick="onTop.close()">Close this</button>
-      </simple-overlay>
-      <simple-overlay id="backdrop2" with-backdrop tabindex=-1>
-        <h2>With backdrop</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-        <button onclick="backdrop2.close()">Close</button>
-      </simple-overlay>
-    </template>
-  </demo-snippet>
-
-  <h3>An element with <code>IronOverlayBehavior</code> can be scrollable or contain scrollable content.</h3>
-  <demo-snippet>
-    <template>
-      <style is="custom-style">
-        .with-margin {
-          margin: 24px 40px;
-        }
-        .scrollable {
-          border: 1px solid lightgray;
-          padding: 24px;
-          @apply(--layout-scroll);
-        }
-      </style>
-      <button onclick="scrolling.open()">Scrolling overlay</button>
-
-      <simple-overlay id="scrolling" class="with-margin scrollable" tabindex=-1>
-        <h2>This overlay scrolls internally.</h2>
-        <p>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-        </p>
-        <button onclick="scrolling.close()">Close</button>
-      </simple-overlay>
-
-      <button onclick="scrolling2.open()">Scrolling content</button>
-
-      <simple-overlay id="scrolling2" class="with-margin" tabindex=-1>
-        <h2>This overlay has a scrolling child.</h2>
-        <p class="scrollable">
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.<br>
-          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-        </p>
-        <button onclick="scrolling2.close()">Close</button>
-      </simple-overlay>
-
-      <script>
-        // .scrollable is the element that determines the size of the overlay.
-        scrolling2.sizingTarget = Polymer.dom(scrolling2).querySelector('.scrollable');
-      </script>
-    </template>
-  </demo-snippet>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/demo/simple-overlay.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/demo/simple-overlay.html
deleted file mode 100644
index 047f047..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/demo/simple-overlay.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-overlay-behavior.html">
-
-<dom-module id="simple-overlay">
-  <template>
-    <style>
-      :host {
-        background: white;
-        color: black;
-        padding: 24px;
-        box-shadow: rgba(0, 0, 0, 0.24) -2px 5px 12px 0px, rgba(0, 0, 0, 0.12) 0px 0px 12px 0px;
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'simple-overlay',
-
-    behaviors: [
-      Polymer.IronOverlayBehavior
-    ]
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/index.html
deleted file mode 100644
index d69e304..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-overlay-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-focusables-helper.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-focusables-helper.html
deleted file mode 100644
index 084ad7d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-focusables-helper.html
+++ /dev/null
@@ -1,220 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-  (function() {
-    'use strict';
-
-    var p = Element.prototype;
-    var matches = p.matches || p.matchesSelector || p.mozMatchesSelector ||
-      p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector;
-
-    Polymer.IronFocusablesHelper = {
-
-      /**
-       * Returns a sorted array of tabbable nodes, including the root node.
-       * It searches the tabbable nodes in the light and shadow dom of the chidren,
-       * sorting the result by tabindex.
-       * @param {!Node} node
-       * @return {Array<HTMLElement>}
-       */
-      getTabbableNodes: function(node) {
-        var result = [];
-        // If there is at least one element with tabindex > 0, we need to sort
-        // the final array by tabindex.
-        var needsSortByTabIndex = this._collectTabbableNodes(node, result);
-        if (needsSortByTabIndex) {
-          return this._sortByTabIndex(result);
-        }
-        return result;
-      },
-
-      /**
-       * Returns if a element is focusable.
-       * @param {!HTMLElement} element
-       * @return {boolean}
-       */
-      isFocusable: function(element) {
-        // From http://stackoverflow.com/a/1600194/4228703:
-        // There isn't a definite list, it's up to the browser. The only
-        // standard we have is DOM Level 2 HTML https://www.w3.org/TR/DOM-Level-2-HTML/html.html,
-        // according to which the only elements that have a focus() method are
-        // HTMLInputElement,  HTMLSelectElement, HTMLTextAreaElement and
-        // HTMLAnchorElement. This notably omits HTMLButtonElement and
-        // HTMLAreaElement.
-        // Referring to these tests with tabbables in different browsers
-        // http://allyjs.io/data-tables/focusable.html
-
-        // Elements that cannot be focused if they have [disabled] attribute.
-        if (matches.call(element, 'input, select, textarea, button, object')) {
-          return matches.call(element, ':not([disabled])');
-        }
-        // Elements that can be focused even if they have [disabled] attribute.
-        return matches.call(element,
-          'a[href], area[href], iframe, [tabindex], [contentEditable]');
-      },
-
-      /**
-       * Returns if a element is tabbable. To be tabbable, a element must be
-       * focusable, visible, and with a tabindex !== -1.
-       * @param {!HTMLElement} element
-       * @return {boolean}
-       */
-      isTabbable: function(element) {
-        return this.isFocusable(element) &&
-          matches.call(element, ':not([tabindex="-1"])') &&
-          this._isVisible(element);
-      },
-
-      /**
-       * Returns the normalized element tabindex. If not focusable, returns -1.
-       * It checks for the attribute "tabindex" instead of the element property
-       * `tabIndex` since browsers assign different values to it.
-       * e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`
-       * @param {!HTMLElement} element
-       * @return {!number}
-       * @private
-       */
-      _normalizedTabIndex: function(element) {
-        if (this.isFocusable(element)) {
-          var tabIndex = element.getAttribute('tabindex') || 0;
-          return Number(tabIndex);
-        }
-        return -1;
-      },
-
-      /**
-       * Searches for nodes that are tabbable and adds them to the `result` array.
-       * Returns if the `result` array needs to be sorted by tabindex.
-       * @param {!Node} node The starting point for the search; added to `result`
-       * if tabbable.
-       * @param {!Array<HTMLElement>} result
-       * @return {boolean}
-       * @private
-       */
-      _collectTabbableNodes: function(node, result) {
-        // If not an element or not visible, no need to explore children.
-        if (node.nodeType !== Node.ELEMENT_NODE || !this._isVisible(node)) {
-          return false;
-        }
-        var element = /** @type {HTMLElement} */ (node);
-        var tabIndex = this._normalizedTabIndex(element);
-        var needsSortByTabIndex = tabIndex > 0;
-        if (tabIndex >= 0) {
-          result.push(element);
-        }
-
-        // In ShadowDOM v1, tab order is affected by the order of distrubution.
-        // E.g. getTabbableNodes(#root) in ShadowDOM v1 should return [#A, #B];
-        // in ShadowDOM v0 tab order is not affected by the distrubution order,
-        // in fact getTabbableNodes(#root) returns [#B, #A].
-        //  <div id="root">
-        //   <!-- shadow -->
-        //     <slot name="a">
-        //     <slot name="b">
-        //   <!-- /shadow -->
-        //   <input id="A" slot="a">
-        //   <input id="B" slot="b" tabindex="1">
-        //  </div>
-        // TODO(valdrin) support ShadowDOM v1 when upgrading to Polymer v2.0.
-        var children;
-        if (element.localName === 'content') {
-          children = Polymer.dom(element).getDistributedNodes();
-        } else {
-          // Use shadow root if possible, will check for distributed nodes.
-          children = Polymer.dom(element.root || element).children;
-        }
-        for (var i = 0; i < children.length; i++) {
-          // Ensure method is always invoked to collect tabbable children.
-          var needsSort = this._collectTabbableNodes(children[i], result);
-          needsSortByTabIndex = needsSortByTabIndex || needsSort;
-        }
-        return needsSortByTabIndex;
-      },
-
-      /**
-       * Returns false if the element has `visibility: hidden` or `display: none`
-       * @param {!HTMLElement} element
-       * @return {boolean}
-       * @private
-       */
-      _isVisible: function(element) {
-        // Check inline style first to save a re-flow. If looks good, check also
-        // computed style.
-        var style = element.style;
-        if (style.visibility !== 'hidden' && style.display !== 'none') {
-          style = window.getComputedStyle(element);
-          return (style.visibility !== 'hidden' && style.display !== 'none');
-        }
-        return false;
-      },
-
-      /**
-       * Sorts an array of tabbable elements by tabindex. Returns a new array.
-       * @param {!Array<HTMLElement>} tabbables
-       * @return {Array<HTMLElement>}
-       * @private
-       */
-      _sortByTabIndex: function(tabbables) {
-        // Implement a merge sort as Array.prototype.sort does a non-stable sort
-        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
-        var len = tabbables.length;
-        if (len < 2) {
-          return tabbables;
-        }
-        var pivot = Math.ceil(len / 2);
-        var left = this._sortByTabIndex(tabbables.slice(0, pivot));
-        var right = this._sortByTabIndex(tabbables.slice(pivot));
-        return this._mergeSortByTabIndex(left, right);
-      },
-
-      /**
-       * Merge sort iterator, merges the two arrays into one, sorted by tab index.
-       * @param {!Array<HTMLElement>} left
-       * @param {!Array<HTMLElement>} right
-       * @return {Array<HTMLElement>}
-       * @private
-       */
-      _mergeSortByTabIndex: function(left, right) {
-        var result = [];
-        while ((left.length > 0) && (right.length > 0)) {
-          if (this._hasLowerTabOrder(left[0], right[0])) {
-            result.push(right.shift());
-          } else {
-            result.push(left.shift());
-          }
-        }
-
-        return result.concat(left, right);
-      },
-
-      /**
-       * Returns if element `a` has lower tab order compared to element `b`
-       * (both elements are assumed to be focusable and tabbable).
-       * Elements with tabindex = 0 have lower tab order compared to elements
-       * with tabindex > 0.
-       * If both have same tabindex, it returns false.
-       * @param {!HTMLElement} a
-       * @param {!HTMLElement} b
-       * @return {boolean}
-       * @private
-       */
-      _hasLowerTabOrder: function(a, b) {
-        // Normalize tabIndexes
-        // e.g. in Firefox `<div contenteditable>` has `tabIndex = -1`
-        var ati = Math.max(a.tabIndex, 0);
-        var bti = Math.max(b.tabIndex, 0);
-        return (ati === 0 || bti === 0) ? bti > ati : ati > bti;
-      }
-    };
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-backdrop.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-backdrop.html
deleted file mode 100644
index 432a57e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-backdrop.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<!--
-`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a
-singleton.
-
-### Styling
-
-The following custom properties and mixins are available for styling.
-
-Custom property | Description | Default
--------------------------------------------|------------------------|---------
-`--iron-overlay-backdrop-background-color` | Backdrop background color                                     | #000
-`--iron-overlay-backdrop-opacity`          | Backdrop opacity                                              | 0.6
-`--iron-overlay-backdrop`                  | Mixin applied to `iron-overlay-backdrop`.                      | {}
-`--iron-overlay-backdrop-opened`           | Mixin applied to `iron-overlay-backdrop` when it is displayed | {}
--->
-
-<dom-module id="iron-overlay-backdrop">
-
-  <template>
-    <style>
-      :host {
-        position: fixed;
-        top: 0;
-        left: 0;
-        width: 100%;
-        height: 100%;
-        background-color: var(--iron-overlay-backdrop-background-color, #000);
-        opacity: 0;
-        transition: opacity 0.2s;
-        pointer-events: none;
-        @apply(--iron-overlay-backdrop);
-      }
-
-      :host(.opened) {
-        opacity: var(--iron-overlay-backdrop-opacity, 0.6);
-        pointer-events: auto;
-        @apply(--iron-overlay-backdrop-opened);
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-(function() {
-'use strict';
-
-  Polymer({
-
-    is: 'iron-overlay-backdrop',
-
-    properties: {
-
-      /**
-       * Returns true if the backdrop is opened.
-       */
-      opened: {
-        reflectToAttribute: true,
-        type: Boolean,
-        value: false,
-        observer: '_openedChanged'
-      }
-
-    },
-
-    listeners: {
-      'transitionend': '_onTransitionend'
-    },
-
-    created: function() {
-      // Used to cancel previous requestAnimationFrame calls when opened changes.
-      this.__openedRaf = null;
-    },
-
-    attached: function() {
-      this.opened && this._openedChanged(this.opened);
-    },
-
-    /**
-     * Appends the backdrop to document body if needed.
-     */
-    prepare: function() {
-      if (this.opened && !this.parentNode) {
-        Polymer.dom(document.body).appendChild(this);
-      }
-    },
-
-    /**
-     * Shows the backdrop.
-     */
-    open: function() {
-      this.opened = true;
-    },
-
-    /**
-     * Hides the backdrop.
-     */
-    close: function() {
-      this.opened = false;
-    },
-
-    /**
-     * Removes the backdrop from document body if needed.
-     */
-    complete: function() {
-      if (!this.opened && this.parentNode === document.body) {
-        Polymer.dom(this.parentNode).removeChild(this);
-      }
-    },
-
-    _onTransitionend: function(event) {
-      if (event && event.target === this) {
-        this.complete();
-      }
-    },
-
-    /**
-     * @param {boolean} opened
-     * @private
-     */
-    _openedChanged: function(opened) {
-      if (opened) {
-        // Auto-attach.
-        this.prepare();
-      } else {
-        // Animation might be disabled via the mixin or opacity custom property.
-        // If it is disabled in other ways, it's up to the user to call complete.
-        var cs = window.getComputedStyle(this);
-        if (cs.transitionDuration === '0s' || cs.opacity == 0) {
-          this.complete();
-        }
-      }
-
-      if (!this.isAttached) {
-        return;
-      }
-
-      // Always cancel previous requestAnimationFrame.
-      if (this.__openedRaf) {
-        window.cancelAnimationFrame(this.__openedRaf);
-        this.__openedRaf = null;
-      }
-      // Force relayout to ensure proper transitions.
-      this.scrollTop = this.scrollTop;
-      this.__openedRaf = window.requestAnimationFrame(function() {
-        this.__openedRaf = null;
-        this.toggleClass('opened', this.opened);
-      }.bind(this));
-    }
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-behavior.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-behavior.html
deleted file mode 100644
index ae085c5..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-behavior.html
+++ /dev/null
@@ -1,637 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-fit-behavior/iron-fit-behavior.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="iron-overlay-manager.html">
-<link rel="import" href="iron-focusables-helper.html">
-
-<script>
-(function() {
-  'use strict';
-
-  /** @polymerBehavior */
-  Polymer.IronOverlayBehaviorImpl = {
-
-    properties: {
-
-      /**
-       * True if the overlay is currently displayed.
-       */
-      opened: {
-        observer: '_openedChanged',
-        type: Boolean,
-        value: false,
-        notify: true
-      },
-
-      /**
-       * True if the overlay was canceled when it was last closed.
-       */
-      canceled: {
-        observer: '_canceledChanged',
-        readOnly: true,
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to display a backdrop behind the overlay. It traps the focus
-       * within the light DOM of the overlay.
-       */
-      withBackdrop: {
-        observer: '_withBackdropChanged',
-        type: Boolean
-      },
-
-      /**
-       * Set to true to disable auto-focusing the overlay or child nodes with
-       * the `autofocus` attribute` when the overlay is opened.
-       */
-      noAutoFocus: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to disable canceling the overlay with the ESC key.
-       */
-      noCancelOnEscKey: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to disable canceling the overlay by clicking outside it.
-       */
-      noCancelOnOutsideClick: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Contains the reason(s) this overlay was last closed (see `iron-overlay-closed`).
-       * `IronOverlayBehavior` provides the `canceled` reason; implementers of the
-       * behavior can provide other reasons in addition to `canceled`.
-       */
-      closingReason: {
-        // was a getter before, but needs to be a property so other
-        // behaviors can override this.
-        type: Object
-      },
-
-      /**
-       * Set to true to enable restoring of focus when overlay is closed.
-       */
-      restoreFocusOnClose: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to keep overlay always on top.
-       */
-      alwaysOnTop: {
-        type: Boolean
-      },
-
-      /**
-       * Shortcut to access to the overlay manager.
-       * @private
-       * @type {Polymer.IronOverlayManagerClass}
-       */
-      _manager: {
-        type: Object,
-        value: Polymer.IronOverlayManager
-      },
-
-      /**
-       * The node being focused.
-       * @type {?Node}
-       */
-      _focusedChild: {
-        type: Object
-      }
-
-    },
-
-    listeners: {
-      'iron-resize': '_onIronResize'
-    },
-
-    /**
-     * The backdrop element.
-     * @type {Element}
-     */
-    get backdropElement() {
-      return this._manager.backdropElement;
-    },
-
-    /**
-     * Returns the node to give focus to.
-     * @type {Node}
-     */
-    get _focusNode() {
-      return this._focusedChild || Polymer.dom(this).querySelector('[autofocus]') || this;
-    },
-
-    /**
-     * Array of nodes that can receive focus (overlay included), ordered by `tabindex`.
-     * This is used to retrieve which is the first and last focusable nodes in order
-     * to wrap the focus for overlays `with-backdrop`.
-     *
-     * If you know what is your content (specifically the first and last focusable children),
-     * you can override this method to return only `[firstFocusable, lastFocusable];`
-     * @type {Array<Node>}
-     * @protected
-     */
-    get _focusableNodes() {
-      return Polymer.IronFocusablesHelper.getTabbableNodes(this);
-    },
-
-    ready: function() {
-      // Used to skip calls to notifyResize and refit while the overlay is animating.
-      this.__isAnimating = false;
-      // with-backdrop needs tabindex to be set in order to trap the focus.
-      // If it is not set, IronOverlayBehavior will set it, and remove it if with-backdrop = false.
-      this.__shouldRemoveTabIndex = false;
-      // Used for wrapping the focus on TAB / Shift+TAB.
-      this.__firstFocusableNode = this.__lastFocusableNode = null;
-      // Used by __onNextAnimationFrame to cancel any previous callback.
-      this.__raf = null;
-      // Focused node before overlay gets opened. Can be restored on close.
-      this.__restoreFocusNode = null;
-      this._ensureSetup();
-    },
-
-    attached: function() {
-      // Call _openedChanged here so that position can be computed correctly.
-      if (this.opened) {
-        this._openedChanged(this.opened);
-      }
-      this._observer = Polymer.dom(this).observeNodes(this._onNodesChange);
-    },
-
-    detached: function() {
-      Polymer.dom(this).unobserveNodes(this._observer);
-      this._observer = null;
-      if (this.__raf) {
-        window.cancelAnimationFrame(this.__raf);
-        this.__raf = null;
-      }
-      this._manager.removeOverlay(this);
-    },
-
-    /**
-     * Toggle the opened state of the overlay.
-     */
-    toggle: function() {
-      this._setCanceled(false);
-      this.opened = !this.opened;
-    },
-
-    /**
-     * Open the overlay.
-     */
-    open: function() {
-      this._setCanceled(false);
-      this.opened = true;
-    },
-
-    /**
-     * Close the overlay.
-     */
-    close: function() {
-      this._setCanceled(false);
-      this.opened = false;
-    },
-
-    /**
-     * Cancels the overlay.
-     * @param {Event=} event The original event
-     */
-    cancel: function(event) {
-      var cancelEvent = this.fire('iron-overlay-canceled', event, {cancelable: true});
-      if (cancelEvent.defaultPrevented) {
-        return;
-      }
-
-      this._setCanceled(true);
-      this.opened = false;
-    },
-
-    /**
-     * Invalidates the cached tabbable nodes. To be called when any of the focusable
-     * content changes (e.g. a button is disabled).
-     */
-    invalidateTabbables: function() {
-      this.__firstFocusableNode = this.__lastFocusableNode = null;
-    },
-
-    _ensureSetup: function() {
-      if (this._overlaySetup) {
-        return;
-      }
-      this._overlaySetup = true;
-      this.style.outline = 'none';
-      this.style.display = 'none';
-    },
-
-    /**
-     * Called when `opened` changes.
-     * @param {boolean=} opened
-     * @protected
-     */
-    _openedChanged: function(opened) {
-      if (opened) {
-        this.removeAttribute('aria-hidden');
-      } else {
-        this.setAttribute('aria-hidden', 'true');
-      }
-
-      // Defer any animation-related code on attached
-      // (_openedChanged gets called again on attached).
-      if (!this.isAttached) {
-        return;
-      }
-
-      this.__isAnimating = true;
-
-      // Use requestAnimationFrame for non-blocking rendering.
-      this.__onNextAnimationFrame(this.__openedChanged);
-    },
-
-    _canceledChanged: function() {
-      this.closingReason = this.closingReason || {};
-      this.closingReason.canceled = this.canceled;
-    },
-
-    _withBackdropChanged: function() {
-      // If tabindex is already set, no need to override it.
-      if (this.withBackdrop && !this.hasAttribute('tabindex')) {
-        this.setAttribute('tabindex', '-1');
-        this.__shouldRemoveTabIndex = true;
-      } else if (this.__shouldRemoveTabIndex) {
-        this.removeAttribute('tabindex');
-        this.__shouldRemoveTabIndex = false;
-      }
-      if (this.opened && this.isAttached) {
-        this._manager.trackBackdrop();
-      }
-    },
-
-    /**
-     * tasks which must occur before opening; e.g. making the element visible.
-     * @protected
-     */
-    _prepareRenderOpened: function() {
-      // Store focused node.
-      this.__restoreFocusNode = this._manager.deepActiveElement;
-
-      // Needed to calculate the size of the overlay so that transitions on its size
-      // will have the correct starting points.
-      this._preparePositioning();
-      this.refit();
-      this._finishPositioning();
-
-      // Safari will apply the focus to the autofocus element when displayed
-      // for the first time, so we make sure to return the focus where it was.
-      if (this.noAutoFocus && document.activeElement === this._focusNode) {
-        this._focusNode.blur();
-        this.__restoreFocusNode.focus();
-      }
-    },
-
-    /**
-     * Tasks which cause the overlay to actually open; typically play an animation.
-     * @protected
-     */
-    _renderOpened: function() {
-      this._finishRenderOpened();
-    },
-
-    /**
-     * Tasks which cause the overlay to actually close; typically play an animation.
-     * @protected
-     */
-    _renderClosed: function() {
-      this._finishRenderClosed();
-    },
-
-    /**
-     * Tasks to be performed at the end of open action. Will fire `iron-overlay-opened`.
-     * @protected
-     */
-    _finishRenderOpened: function() {
-      this.notifyResize();
-      this.__isAnimating = false;
-
-      this.fire('iron-overlay-opened');
-    },
-
-    /**
-     * Tasks to be performed at the end of close action. Will fire `iron-overlay-closed`.
-     * @protected
-     */
-    _finishRenderClosed: function() {
-      // Hide the overlay.
-      this.style.display = 'none';
-      // Reset z-index only at the end of the animation.
-      this.style.zIndex = '';
-      this.notifyResize();
-      this.__isAnimating = false;
-      this.fire('iron-overlay-closed', this.closingReason);
-    },
-
-    _preparePositioning: function() {
-      this.style.transition = this.style.webkitTransition = 'none';
-      this.style.transform = this.style.webkitTransform = 'none';
-      this.style.display = '';
-    },
-
-    _finishPositioning: function() {
-      // First, make it invisible & reactivate animations.
-      this.style.display = 'none';
-      // Force reflow before re-enabling animations so that they don't start.
-      // Set scrollTop to itself so that Closure Compiler doesn't remove this.
-      this.scrollTop = this.scrollTop;
-      this.style.transition = this.style.webkitTransition = '';
-      this.style.transform = this.style.webkitTransform = '';
-      // Now that animations are enabled, make it visible again
-      this.style.display = '';
-      // Force reflow, so that following animations are properly started.
-      // Set scrollTop to itself so that Closure Compiler doesn't remove this.
-      this.scrollTop = this.scrollTop;
-    },
-
-    /**
-     * Applies focus according to the opened state.
-     * @protected
-     */
-    _applyFocus: function() {
-      if (this.opened) {
-        if (!this.noAutoFocus) {
-          this._focusNode.focus();
-        }
-      }
-      else {
-        this._focusNode.blur();
-        this._focusedChild = null;
-        // Restore focus.
-        if (this.restoreFocusOnClose && this.__restoreFocusNode) {
-          this.__restoreFocusNode.focus();
-        }
-        this.__restoreFocusNode = null;
-        // If many overlays get closed at the same time, one of them would still
-        // be the currentOverlay even if already closed, and would call _applyFocus
-        // infinitely, so we check for this not to be the current overlay.
-        var currentOverlay = this._manager.currentOverlay();
-        if (currentOverlay && this !== currentOverlay) {
-          currentOverlay._applyFocus();
-        }
-      }
-    },
-
-    /**
-     * Cancels (closes) the overlay. Call when click happens outside the overlay.
-     * @param {!Event} event
-     * @protected
-     */
-    _onCaptureClick: function(event) {
-      if (!this.noCancelOnOutsideClick) {
-        this.cancel(event);
-      }
-    },
-
-    /**
-     * Keeps track of the focused child. If withBackdrop, traps focus within overlay.
-     * @param {!Event} event
-     * @protected
-     */
-    _onCaptureFocus: function (event) {
-      if (!this.withBackdrop) {
-        return;
-      }
-      var path = Polymer.dom(event).path;
-      if (path.indexOf(this) === -1) {
-        event.stopPropagation();
-        this._applyFocus();
-      } else {
-        this._focusedChild = path[0];
-      }
-    },
-
-    /**
-     * Handles the ESC key event and cancels (closes) the overlay.
-     * @param {!Event} event
-     * @protected
-     */
-    _onCaptureEsc: function(event) {
-      if (!this.noCancelOnEscKey) {
-        this.cancel(event);
-      }
-    },
-
-    /**
-     * Handles TAB key events to track focus changes.
-     * Will wrap focus for overlays withBackdrop.
-     * @param {!Event} event
-     * @protected
-     */
-    _onCaptureTab: function(event) {
-      if (!this.withBackdrop) {
-        return;
-      }
-      this.__ensureFirstLastFocusables();
-      // TAB wraps from last to first focusable.
-      // Shift + TAB wraps from first to last focusable.
-      var shift = event.shiftKey;
-      var nodeToCheck = shift ? this.__firstFocusableNode : this.__lastFocusableNode;
-      var nodeToSet = shift ? this.__lastFocusableNode : this.__firstFocusableNode;
-      var shouldWrap = false;
-      if (nodeToCheck === nodeToSet) {
-        // If nodeToCheck is the same as nodeToSet, it means we have an overlay
-        // with 0 or 1 focusables; in either case we still need to trap the
-        // focus within the overlay.
-        shouldWrap = true;
-      } else {
-        // In dom=shadow, the manager will receive focus changes on the main
-        // root but not the ones within other shadow roots, so we can't rely on
-        // _focusedChild, but we should check the deepest active element.
-        var focusedNode = this._manager.deepActiveElement;
-        // If the active element is not the nodeToCheck but the overlay itself,
-        // it means the focus is about to go outside the overlay, hence we
-        // should prevent that (e.g. user opens the overlay and hit Shift+TAB).
-        shouldWrap = (focusedNode === nodeToCheck || focusedNode === this);
-      }
-
-      if (shouldWrap) {
-        // When the overlay contains the last focusable element of the document
-        // and it's already focused, pressing TAB would move the focus outside
-        // the document (e.g. to the browser search bar). Similarly, when the
-        // overlay contains the first focusable element of the document and it's
-        // already focused, pressing Shift+TAB would move the focus outside the
-        // document (e.g. to the browser search bar).
-        // In both cases, we would not receive a focus event, but only a blur.
-        // In order to achieve focus wrapping, we prevent this TAB event and
-        // force the focus. This will also prevent the focus to temporarily move
-        // outside the overlay, which might cause scrolling.
-        event.preventDefault();
-        this._focusedChild = nodeToSet;
-        this._applyFocus();
-      }
-    },
-
-    /**
-     * Refits if the overlay is opened and not animating.
-     * @protected
-     */
-    _onIronResize: function() {
-      if (this.opened && !this.__isAnimating) {
-        this.__onNextAnimationFrame(this.refit);
-      }
-    },
-
-    /**
-     * Will call notifyResize if overlay is opened.
-     * Can be overridden in order to avoid multiple observers on the same node.
-     * @protected
-     */
-    _onNodesChange: function() {
-      if (this.opened && !this.__isAnimating) {
-        // It might have added focusable nodes, so invalidate cached values.
-        this.invalidateTabbables();
-        this.notifyResize();
-      }
-    },
-
-    /**
-     * Will set first and last focusable nodes if any of them is not set.
-     * @private
-     */
-    __ensureFirstLastFocusables: function() {
-      if (!this.__firstFocusableNode || !this.__lastFocusableNode) {
-        var focusableNodes = this._focusableNodes;
-        this.__firstFocusableNode = focusableNodes[0];
-        this.__lastFocusableNode = focusableNodes[focusableNodes.length - 1];
-      }
-    },
-
-    /**
-     * Tasks executed when opened changes: prepare for the opening, move the
-     * focus, update the manager, render opened/closed.
-     * @private
-     */
-    __openedChanged: function() {
-      if (this.opened) {
-        // Make overlay visible, then add it to the manager.
-        this._prepareRenderOpened();
-        this._manager.addOverlay(this);
-        // Move the focus to the child node with [autofocus].
-        this._applyFocus();
-
-        this._renderOpened();
-      } else {
-        // Remove overlay, then restore the focus before actually closing.
-        this._manager.removeOverlay(this);
-        this._applyFocus();
-
-        this._renderClosed();
-      }
-    },
-
-    /**
-     * Executes a callback on the next animation frame, overriding any previous
-     * callback awaiting for the next animation frame. e.g.
-     * `__onNextAnimationFrame(callback1) && __onNextAnimationFrame(callback2)`;
-     * `callback1` will never be invoked.
-     * @param {!Function} callback Its `this` parameter is the overlay itself.
-     * @private
-     */
-    __onNextAnimationFrame: function(callback) {
-      if (this.__raf) {
-        window.cancelAnimationFrame(this.__raf);
-      }
-      var self = this;
-      this.__raf = window.requestAnimationFrame(function nextAnimationFrame() {
-        self.__raf = null;
-        callback.call(self);
-      });
-    }
-
-  };
-
-  /**
-  Use `Polymer.IronOverlayBehavior` to implement an element that can be hidden or shown, and displays
-  on top of other content. It includes an optional backdrop, and can be used to implement a variety
-  of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once.
-
-  See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.html)
-  for an example.
-
-  ### Closing and canceling
-
-  An overlay may be hidden by closing or canceling. The difference between close and cancel is user
-  intent. Closing generally implies that the user acknowledged the content on the overlay. By default,
-  it will cancel whenever the user taps outside it or presses the escape key. This behavior is
-  configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties.
-  `close()` should be called explicitly by the implementer when the user interacts with a control
-  in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled'
-  event. Call `preventDefault` on this event to prevent the overlay from closing.
-
-  ### Positioning
-
-  By default the element is sized and positioned to fit and centered inside the window. You can
-  position and size it manually using CSS. See `Polymer.IronFitBehavior`.
-
-  ### Backdrop
-
-  Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is
-  appended to `<body>` and is of type `<iron-overlay-backdrop>`. See its doc page for styling
-  options.
-
-  In addition, `with-backdrop` will wrap the focus within the content in the light DOM.
-  Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes)
-  to achieve a different behavior.
-
-  ### Limitations
-
-  The element is styled to appear on top of other content by setting its `z-index` property. You
-  must ensure no element has a stacking context with a higher `z-index` than its parent stacking
-  context. You should place this element as a child of `<body>` whenever possible.
-
-  @demo demo/index.html
-  @polymerBehavior
-  */
-  Polymer.IronOverlayBehavior = [Polymer.IronFitBehavior, Polymer.IronResizableBehavior, Polymer.IronOverlayBehaviorImpl];
-
-  /**
-   * Fired after the overlay opens.
-   * @event iron-overlay-opened
-   */
-
-  /**
-   * Fired when the overlay is canceled, but before it is closed.
-   * @event iron-overlay-canceled
-   * @param {Event} event The closing of the overlay can be prevented
-   * by calling `event.preventDefault()`. The `event.detail` is the original event that
-   * originated the canceling (e.g. ESC keyboard event or click event outside the overlay).
-   */
-
-  /**
-   * Fired after the overlay closes.
-   * @event iron-overlay-closed
-   * @param {Event} event The `event.detail` is the `closingReason` property
-   * (contains `canceled`, whether the overlay was canceled).
-   */
-
-})();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-manager.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-manager.html
deleted file mode 100644
index 53fb265..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/iron-overlay-manager.html
+++ /dev/null
@@ -1,366 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="iron-overlay-backdrop.html">
-
-<script>
-
-  /**
-   * @struct
-   * @constructor
-   * @private
-   */
-  Polymer.IronOverlayManagerClass = function() {
-    /**
-     * Used to keep track of the opened overlays.
-     * @private {Array<Element>}
-     */
-    this._overlays = [];
-
-    /**
-     * iframes have a default z-index of 100,
-     * so this default should be at least that.
-     * @private {number}
-     */
-    this._minimumZ = 101;
-
-    /**
-     * Memoized backdrop element.
-     * @private {Element|null}
-     */
-    this._backdropElement = null;
-
-    // Enable document-wide tap recognizer.
-    // NOTE: Use useCapture=true to avoid accidentally prevention of the closing
-    // of an overlay via event.stopPropagation(). The only way to prevent
-    // closing of an overlay should be through its APIs.
-    // NOTE: enable tap on <html> to workaround Polymer/polymer#4459
-    Polymer.Gestures.add(document.documentElement, 'tap', null);
-    document.addEventListener('tap', this._onCaptureClick.bind(this), true);
-    document.addEventListener('focus', this._onCaptureFocus.bind(this), true);
-    document.addEventListener('keydown', this._onCaptureKeyDown.bind(this), true);
-  };
-
-  Polymer.IronOverlayManagerClass.prototype = {
-
-    constructor: Polymer.IronOverlayManagerClass,
-
-    /**
-     * The shared backdrop element.
-     * @type {!Element} backdropElement
-     */
-    get backdropElement() {
-      if (!this._backdropElement) {
-        this._backdropElement = document.createElement('iron-overlay-backdrop');
-      }
-      return this._backdropElement;
-    },
-
-    /**
-     * The deepest active element.
-     * @type {!Element} activeElement the active element
-     */
-    get deepActiveElement() {
-      // document.activeElement can be null
-      // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement
-      // In case of null, default it to document.body.
-      var active = document.activeElement || document.body;
-      while (active.root && Polymer.dom(active.root).activeElement) {
-        active = Polymer.dom(active.root).activeElement;
-      }
-      return active;
-    },
-
-    /**
-     * Brings the overlay at the specified index to the front.
-     * @param {number} i
-     * @private
-     */
-    _bringOverlayAtIndexToFront: function(i) {
-      var overlay = this._overlays[i];
-      if (!overlay) {
-        return;
-      }
-      var lastI = this._overlays.length - 1;
-      var currentOverlay = this._overlays[lastI];
-      // Ensure always-on-top overlay stays on top.
-      if (currentOverlay && this._shouldBeBehindOverlay(overlay, currentOverlay)) {
-        lastI--;
-      }
-      // If already the top element, return.
-      if (i >= lastI) {
-        return;
-      }
-      // Update z-index to be on top.
-      var minimumZ = Math.max(this.currentOverlayZ(), this._minimumZ);
-      if (this._getZ(overlay) <= minimumZ) {
-        this._applyOverlayZ(overlay, minimumZ);
-      }
-
-      // Shift other overlays behind the new on top.
-      while (i < lastI) {
-        this._overlays[i] = this._overlays[i + 1];
-        i++;
-      }
-      this._overlays[lastI] = overlay;
-    },
-
-    /**
-     * Adds the overlay and updates its z-index if it's opened, or removes it if it's closed.
-     * Also updates the backdrop z-index.
-     * @param {!Element} overlay
-     */
-    addOrRemoveOverlay: function(overlay) {
-      if (overlay.opened) {
-        this.addOverlay(overlay);
-      } else {
-        this.removeOverlay(overlay);
-      }
-    },
-
-    /**
-     * Tracks overlays for z-index and focus management.
-     * Ensures the last added overlay with always-on-top remains on top.
-     * @param {!Element} overlay
-     */
-    addOverlay: function(overlay) {
-      var i = this._overlays.indexOf(overlay);
-      if (i >= 0) {
-        this._bringOverlayAtIndexToFront(i);
-        this.trackBackdrop();
-        return;
-      }
-      var insertionIndex = this._overlays.length;
-      var currentOverlay = this._overlays[insertionIndex - 1];
-      var minimumZ = Math.max(this._getZ(currentOverlay), this._minimumZ);
-      var newZ = this._getZ(overlay);
-
-      // Ensure always-on-top overlay stays on top.
-      if (currentOverlay && this._shouldBeBehindOverlay(overlay, currentOverlay)) {
-        // This bumps the z-index of +2.
-        this._applyOverlayZ(currentOverlay, minimumZ);
-        insertionIndex--;
-        // Update minimumZ to match previous overlay's z-index.
-        var previousOverlay = this._overlays[insertionIndex - 1];
-        minimumZ = Math.max(this._getZ(previousOverlay), this._minimumZ);
-      }
-
-      // Update z-index and insert overlay.
-      if (newZ <= minimumZ) {
-        this._applyOverlayZ(overlay, minimumZ);
-      }
-      this._overlays.splice(insertionIndex, 0, overlay);
-
-      this.trackBackdrop();
-    },
-
-    /**
-     * @param {!Element} overlay
-     */
-    removeOverlay: function(overlay) {
-      var i = this._overlays.indexOf(overlay);
-      if (i === -1) {
-        return;
-      }
-      this._overlays.splice(i, 1);
-
-      this.trackBackdrop();
-    },
-
-    /**
-     * Returns the current overlay.
-     * @return {Element|undefined}
-     */
-    currentOverlay: function() {
-      var i = this._overlays.length - 1;
-      return this._overlays[i];
-    },
-
-    /**
-     * Returns the current overlay z-index.
-     * @return {number}
-     */
-    currentOverlayZ: function() {
-      return this._getZ(this.currentOverlay());
-    },
-
-    /**
-     * Ensures that the minimum z-index of new overlays is at least `minimumZ`.
-     * This does not effect the z-index of any existing overlays.
-     * @param {number} minimumZ
-     */
-    ensureMinimumZ: function(minimumZ) {
-      this._minimumZ = Math.max(this._minimumZ, minimumZ);
-    },
-
-    focusOverlay: function() {
-      var current = /** @type {?} */ (this.currentOverlay());
-      if (current) {
-        current._applyFocus();
-      }
-    },
-
-    /**
-     * Updates the backdrop z-index.
-     */
-    trackBackdrop: function() {
-      var overlay = this._overlayWithBackdrop();
-      // Avoid creating the backdrop if there is no overlay with backdrop.
-      if (!overlay && !this._backdropElement) {
-        return;
-      }
-      this.backdropElement.style.zIndex = this._getZ(overlay) - 1;
-      this.backdropElement.opened = !!overlay;
-    },
-
-    /**
-     * @return {Array<Element>}
-     */
-    getBackdrops: function() {
-      var backdrops = [];
-      for (var i = 0; i < this._overlays.length; i++) {
-        if (this._overlays[i].withBackdrop) {
-          backdrops.push(this._overlays[i]);
-        }
-      }
-      return backdrops;
-    },
-
-    /**
-     * Returns the z-index for the backdrop.
-     * @return {number}
-     */
-    backdropZ: function() {
-      return this._getZ(this._overlayWithBackdrop()) - 1;
-    },
-
-    /**
-     * Returns the first opened overlay that has a backdrop.
-     * @return {Element|undefined}
-     * @private
-     */
-    _overlayWithBackdrop: function() {
-      for (var i = 0; i < this._overlays.length; i++) {
-        if (this._overlays[i].withBackdrop) {
-          return this._overlays[i];
-        }
-      }
-    },
-
-    /**
-     * Calculates the minimum z-index for the overlay.
-     * @param {Element=} overlay
-     * @private
-     */
-    _getZ: function(overlay) {
-      var z = this._minimumZ;
-      if (overlay) {
-        var z1 = Number(overlay.style.zIndex || window.getComputedStyle(overlay).zIndex);
-        // Check if is a number
-        // Number.isNaN not supported in IE 10+
-        if (z1 === z1) {
-          z = z1;
-        }
-      }
-      return z;
-    },
-
-    /**
-     * @param {!Element} element
-     * @param {number|string} z
-     * @private
-     */
-    _setZ: function(element, z) {
-      element.style.zIndex = z;
-    },
-
-    /**
-     * @param {!Element} overlay
-     * @param {number} aboveZ
-     * @private
-     */
-    _applyOverlayZ: function(overlay, aboveZ) {
-      this._setZ(overlay, aboveZ + 2);
-    },
-
-    /**
-     * Returns the deepest overlay in the path.
-     * @param {Array<Element>=} path
-     * @return {Element|undefined}
-     * @suppress {missingProperties}
-     * @private
-     */
-    _overlayInPath: function(path) {
-      path = path || [];
-      for (var i = 0; i < path.length; i++) {
-        if (path[i]._manager === this) {
-          return path[i];
-        }
-      }
-    },
-
-    /**
-     * Ensures the click event is delegated to the right overlay.
-     * @param {!Event} event
-     * @private
-     */
-    _onCaptureClick: function(event) {
-      var overlay = /** @type {?} */ (this.currentOverlay());
-      // Check if clicked outside of top overlay.
-      if (overlay && this._overlayInPath(Polymer.dom(event).path) !== overlay) {
-        overlay._onCaptureClick(event);
-      }
-    },
-
-    /**
-     * Ensures the focus event is delegated to the right overlay.
-     * @param {!Event} event
-     * @private
-     */
-    _onCaptureFocus: function(event) {
-      var overlay = /** @type {?} */ (this.currentOverlay());
-      if (overlay) {
-        overlay._onCaptureFocus(event);
-      }
-    },
-
-    /**
-     * Ensures TAB and ESC keyboard events are delegated to the right overlay.
-     * @param {!Event} event
-     * @private
-     */
-    _onCaptureKeyDown: function(event) {
-      var overlay = /** @type {?} */ (this.currentOverlay());
-      if (overlay) {
-        if (Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event, 'esc')) {
-          overlay._onCaptureEsc(event);
-        } else if (Polymer.IronA11yKeysBehavior.keyboardEventMatchesKeys(event, 'tab')) {
-          overlay._onCaptureTab(event);
-        }
-      }
-    },
-
-    /**
-     * Returns if the overlay1 should be behind overlay2.
-     * @param {!Element} overlay1
-     * @param {!Element} overlay2
-     * @return {boolean}
-     * @suppress {missingProperties}
-     * @private
-     */
-    _shouldBeBehindOverlay: function(overlay1, overlay2) {
-      return !overlay1.alwaysOnTop && overlay2.alwaysOnTop;
-    }
-  };
-
-  Polymer.IronOverlayManager = new Polymer.IronOverlayManagerClass();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/index.html
deleted file mode 100644
index 2dac121..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>iron-overlay-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'iron-overlay-behavior.html',
-        'iron-overlay-behavior.html?dom=shadow',
-        'iron-focusables-helper.html',
-        'iron-focusables-helper.html?dom=shadow',
-        'iron-overlay-backdrop.html',
-        'iron-overlay-backdrop.html?dom=shadow',
-      ]);
-    </script>
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-focusables-helper.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-focusables-helper.html
deleted file mode 100644
index a400b4c..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-focusables-helper.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <title>iron-focusables-helper tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-  <link rel="import" href="../iron-focusables-helper.html">
-  <link rel="import" href="test-buttons.html">
-  <link rel="import" href="test-buttons-wrapper.html">
-
-  <style is="custom-style">
-    .hidden {
-      visibility: hidden;
-    }
-
-    .no-display {
-      display: none;
-    }
-  </style>
-</head>
-
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <div>
-        <h2>Focusables (no tabindex)</h2>
-        <div>
-          <input class="focusable1" placeholder="1 (nested)">
-        </div>
-        <a href="#" class="focusable2">2</a>
-        <button disabled> disabled button</button>
-        <input disabled tabindex="0" value="disabled input with tabindex">
-        <div tabindex="-1">not focusable</div>
-        <div contenteditable class="focusable3">3</div>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="tabindex">
-    <template>
-      <div>
-        <h2>Focusables (with tabindex)</h2>
-        <div tabindex="0" class="focusable7">7</div>
-        <div tabindex="0" class="focusable8">8</div>
-        <div tabindex="0" class="focusable9">9</div>
-        <div tabindex="0" class="focusable10">10</div>
-        <div tabindex="0" class="focusable11">11</div>
-        <div tabindex="0" class="focusable12">12</div>
-        <div tabindex="-1">not focusable</div>
-        <div tabindex="3" class="focusable3">3</div>
-        <div tabindex="4" class="focusable4">4</div>
-        <div tabindex="5" class="focusable5">5</div>
-        <div>
-          <div tabindex="1" class="focusable1">1 (nested)</div>
-          <div tabindex="6" class="focusable6">6 (nested)</div>
-        </div>
-        <div tabindex="2" class="focusable2">2</div>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="shadow">
-    <template>
-      <test-buttons>
-        <h2>focusables in ShadowDOM</h2>
-        <input placeholder="type something..">
-      </test-buttons>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="composed">
-    <template>
-      <test-buttons-wrapper>
-        <input placeholder="type something..">
-      </test-buttons-wrapper>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('getTabbableNodes', function() {
-
-      test('returns tabbable nodes', function() {
-        var node = fixture('basic');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 3, '3 nodes are focusable');
-        assert.equal(focusableNodes[0], Polymer.dom(node).querySelector('.focusable1'));
-        assert.equal(focusableNodes[1], Polymer.dom(node).querySelector('.focusable2'));
-        assert.equal(focusableNodes[2], Polymer.dom(node).querySelector('.focusable3'));
-      });
-
-      test('includes the root if it has a valid tabindex', function() {
-        var node = fixture('basic');
-        node.setAttribute('tabindex', '0');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 4, '4 focusable nodes');
-        assert.notEqual(focusableNodes.indexOf(node), -1, 'root is included');
-      });
-
-      test('excludes visibility: hidden elements', function() {
-        var node = fixture('basic');
-        var focusable = Polymer.dom(node).querySelector('.focusable1');
-        focusable.classList.add('hidden');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 2, '2 focusable nodes');
-        assert.equal(focusableNodes.indexOf(focusable), -1, 'hidden element is not included');
-      });
-
-      test('excludes display: none elements', function() {
-        var node = fixture('basic');
-        var focusable = Polymer.dom(node).querySelector('.focusable1');
-        focusable.classList.add('no-display');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 2, '2 focusable nodes');
-        assert.equal(focusableNodes.indexOf(focusable), -1, 'hidden element is not included');
-      });
-
-      test('respects the tabindex order', function() {
-        var node = fixture('tabindex');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 12, '12 nodes are focusable');
-        for (var i = 0; i < 12; i++) {
-          assert.equal(focusableNodes[i], Polymer.dom(node).querySelector('.focusable' + (i + 1)));
-        }
-      });
-
-      test('includes tabbable elements in the shadow dom', function() {
-        var node = fixture('shadow');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 4, '4 nodes are focusable');
-        assert.equal(focusableNodes[0], node.$.button0);
-        assert.equal(focusableNodes[1], node.$.button1);
-        assert.equal(focusableNodes[2], Polymer.dom(node).querySelector('input'));
-        assert.equal(focusableNodes[3], node.$.button2);
-      });
-
-      test('handles composition', function() {
-        var node = fixture('composed');
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(node);
-        assert.equal(focusableNodes.length, 6, '6 nodes are focusable');
-        assert.equal(focusableNodes[0], node.$.select);
-        assert.equal(focusableNodes[1], node.$.wrapped.$.button0);
-        assert.equal(focusableNodes[2], node.$.wrapped.$.button1);
-        assert.equal(focusableNodes[3], Polymer.dom(node).querySelector('input'));
-        assert.equal(focusableNodes[4], node.$.wrapped.$.button2);
-        assert.equal(focusableNodes[5], node.$.focusableDiv);
-      });
-
-      test('handles distributed nodes', function() {
-        var node = fixture('composed');
-        var wrapped = node.$.wrapped;
-        var focusableNodes = Polymer.IronFocusablesHelper.getTabbableNodes(wrapped);
-        assert.equal(focusableNodes.length, 4, '4 nodes are focusable');
-        assert.equal(focusableNodes[0], wrapped.$.button0);
-        assert.equal(focusableNodes[1], wrapped.$.button1);
-        assert.equal(focusableNodes[2], Polymer.dom(node).querySelector('input'));
-        assert.equal(focusableNodes[3], wrapped.$.button2);
-      });
-    });
-  </script>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-overlay-backdrop.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-overlay-backdrop.html
deleted file mode 100644
index 89c2e9a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-overlay-backdrop.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-    <title>iron-overlay-backdrop tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-    <link rel="import" href="test-overlay.html">
-
-    <style>
-        html,
-        body {
-            margin: 0;
-            width: 100%;
-            height: 100%;
-            min-width: 0;
-        }
-        .sizer {
-            width: 4000px;
-            height: 5000px;
-        }
-    </style>
-
-</head>
-
-<body>
-
-<div class="sizer"></div>
-
-<test-fixture id="backdrop">
-    <template>
-        <test-overlay with-backdrop>
-            Overlay with backdrop
-        </test-overlay>
-    </template>
-</test-fixture>
-
-<script>
-    function runAfterOpen(overlay, callback) {
-        overlay.addEventListener('iron-overlay-opened', callback);
-        overlay.open();
-    }
-
-    suite('overlay with backdrop', function() {
-        var overlay;
-
-        setup(function() {
-            overlay = fixture('backdrop');
-        });
-
-        test('backdrop size matches parent size', function(done) {
-            runAfterOpen(overlay, function() {
-                // Flush so we are sure backdrop is added in the DOM.
-                Polymer.dom.flush();
-                var backdrop = overlay.backdropElement;
-                var parent = backdrop.parentElement;
-                assert.strictEqual(backdrop.offsetWidth, parent.clientWidth, 'backdrop width matches parent width');
-                assert.strictEqual(backdrop.offsetHeight, parent.clientHeight, 'backdrop height matches parent height');
-                done();
-            });
-        });
-
-    });
-</script>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-overlay-behavior.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-overlay-behavior.html
deleted file mode 100644
index f6c3621..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/iron-overlay-behavior.html
+++ /dev/null
@@ -1,1282 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-  <head>
-
-    <title>iron-overlay-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-    <link rel="import" href="test-overlay.html">
-    <link rel="import" href="test-overlay2.html">
-    <link rel="import" href="test-buttons.html">
-    <link rel="import" href="test-menu-button.html">
-
-    <style is="custom-style">
-      iron-overlay-backdrop {
-        /* For quicker tests */
-        --iron-overlay-backdrop: {
-          transition: none;
-        }
-      }
-    </style>
-
-  </head>
-
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <test-overlay>
-          Basic Overlay
-        </test-overlay>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="opened">
-      <template>
-        <test-overlay opened>
-          Basic Overlay
-        </test-overlay>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="autofocus">
-      <template>
-        <test-overlay>
-          Autofocus
-          <button autofocus>button</button>
-        </test-overlay>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="focusables">
-      <template>
-        <test-overlay tabindex="-1">
-          <h2>Focusables (no tabindex)</h2>
-          <div>
-            <input class="focusable1" placeholder="1 (nested)">
-          </div>
-          <button class="focusable2">1</button>
-          <button disabled> disabled button</button>
-          <div tabindex="-1">not focusable</div>
-          <button class="focusable3">2</button>
-        </test-overlay>
-        <test-overlay tabindex="-1">
-          <h2>Focusables (with tabindex)</h2>
-          <div tabindex="-1">not focusable</div>
-          <div tabindex="3" class="focusable3">3</div>
-          <div tabindex="4" class="focusable4">4</div>
-          <div tabindex="5" class="focusable5">5</div>
-          <div>
-            <div tabindex="1" class="focusable1">1 (nested)</div>
-            <div tabindex="6" class="focusable6">6 (nested)</div>
-          </div>
-          <div tabindex="2" class="focusable2">2</div>
-        </test-overlay>
-        <test-overlay2>
-          Overlay with optimized focusableNodes getter
-          <button class="focusable1">1</button>
-        </test-overlay2>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="backdrop">
-      <template>
-        <test-overlay with-backdrop>
-          Overlay with backdrop
-        </test-overlay>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="multiple">
-      <template>
-        <test-overlay class="overlay-1">
-          Test overlay 1
-        </test-overlay>
-        <test-overlay class="overlay-2">
-          Test overlay 2
-          <button>Click</button>
-        </test-overlay>
-        <test-overlay2 class="overlay-3">
-          Other overlay 3
-        </test-overlay2>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="composed">
-      <template>
-        <test-menu-button></test-menu-button>
-      </template>
-    </test-fixture>
-
-    <test-buttons id="buttons"></test-buttons>
-    <input id="focusInput" placeholder="focus input">
-
-    <script>
-
-      function runAfterOpen(overlay, callback) {
-        overlay.addEventListener('iron-overlay-opened', callback);
-        overlay.open();
-      }
-
-      function runAfterClose(overlay, callback) {
-        overlay.addEventListener('iron-overlay-closed', callback);
-        overlay.close();
-      }
-
-      suite('basic overlay', function() {
-        var overlay;
-
-        setup(function() {
-          overlay = fixture('basic');
-        });
-
-        test('overlay starts hidden', function() {
-          assert.isFalse(overlay.opened, 'overlay starts closed');
-          assert.equal(getComputedStyle(overlay).display, 'none', 'overlay starts hidden');
-        });
-
-        test('_renderOpened called only after is attached', function(done) {
-          var overlay = document.createElement('test-overlay');
-          // The overlay is ready at this point, but not yet attached.
-          var spy = sinon.spy(overlay, '_renderOpened');
-          // This triggers _openedChanged.
-          overlay.opened = true;
-          // Wait long enough for requestAnimationFrame callback.
-          overlay.async(function() {
-            assert.isFalse(spy.called, '_renderOpened not called');
-            // Because not attached yet, overlay should not be the current overlay!
-            assert.isNotOk(overlay._manager.currentOverlay(), 'currentOverlay not set');
-            done();
-          }, 100);
-        });
-
-        test('overlay open/close events', function(done) {
-          var nevents = 0;
-
-          overlay.addEventListener('iron-overlay-opened', function() {
-            nevents += 1;
-            overlay.opened = false;
-          });
-
-          overlay.addEventListener('iron-overlay-closed', function() {
-            nevents += 1;
-            assert.equal(nevents, 2, 'opened and closed events fired');
-            done();
-          });
-
-          overlay.opened = true;
-        });
-
-        test('open() refits overlay only once', function(done) {
-          var spy = sinon.spy(overlay, 'refit');
-          runAfterOpen(overlay, function() {
-            assert.equal(spy.callCount, 1, 'overlay did refit only once');
-            done();
-          });
-        });
-
-        test('open overlay refits on iron-resize', function(done) {
-          runAfterOpen(overlay, function() {
-            var spy = sinon.spy(overlay, 'refit');
-            overlay.fire('iron-resize');
-            Polymer.dom.flush();
-            requestAnimationFrame(function() {
-              assert.isTrue(spy.called, 'overlay did refit');
-              done();
-            });
-          });
-        });
-
-        test('closed overlay does not refit on iron-resize', function(done) {
-          var spy = sinon.spy(overlay, 'refit');
-          overlay.fire('iron-resize');
-          Polymer.dom.flush();
-          requestAnimationFrame(function() {
-            assert.isFalse(spy.called, 'overlay should not refit');
-            done();
-          });
-        });
-
-        test('open() triggers iron-resize', function(done) {
-          var callCount = 0;
-          // Ignore iron-resize triggered by window resize.
-          window.addEventListener('resize', function() { callCount--; }, true);
-          overlay.addEventListener('iron-resize', function() { callCount++; });
-          runAfterOpen(overlay, function() {
-            assert.equal(callCount, 1, 'iron-resize called once before iron-overlay-opened');
-            done();
-          });
-        });
-
-        test('close() triggers iron-resize', function(done) {
-          runAfterOpen(overlay, function() {
-            var spy = sinon.stub();
-            overlay.addEventListener('iron-resize', spy);
-            runAfterClose(overlay, function() {
-              assert.equal(spy.callCount, 1, 'iron-resize called once before iron-overlay-closed');
-              done();
-            });
-          });
-        });
-
-        test('closed overlay does not trigger iron-resize when its content changes', function() {
-          // Ignore iron-resize triggered by window resize.
-          var callCount = 0;
-          window.addEventListener('resize', function() { callCount--; }, true);
-          overlay.addEventListener('iron-resize', function() { callCount++; });
-          Polymer.dom(overlay).appendChild(document.createElement('div'));
-          Polymer.dom.flush();
-          assert.equal(callCount, 0, 'iron-resize should not be called');
-        });
-
-        test('open overlay triggers iron-resize when its content changes', function(done) {
-          runAfterOpen(overlay, function() {
-            var spy = sinon.stub();
-            overlay.addEventListener('iron-resize', spy);
-            Polymer.dom(overlay).appendChild(document.createElement('div'));
-            Polymer.dom.flush();
-            assert.equal(spy.callCount, 1, 'iron-resize should be called once');
-            done();
-          });
-        });
-
-        test('close an overlay quickly after open', function(done) {
-          // first, open the overlay
-          overlay.open();
-          overlay.async(function() {
-            // during the opening transition, close the overlay
-            this.close();
-            // wait for any exceptions to be thrown until the transition is done
-            this.async(function() {
-              done();
-            }, 300);
-          });
-        });
-
-        test('clicking an overlay does not close it', function(done) {
-          runAfterOpen(overlay, function() {
-            var spy = sinon.stub();
-            overlay.addEventListener('iron-overlay-closed', spy);
-            MockInteractions.tap(overlay);
-            overlay.async(function() {
-              assert.isFalse(spy.called, 'iron-overlay-closed should not fire');
-              done();
-            }, 10);
-          });
-        });
-
-        test('open overlay on mousedown does not close it', function(done) {
-          var btn = document.createElement('button');
-          btn.addEventListener('mousedown', overlay.open.bind(overlay));
-          document.body.appendChild(btn);
-          // It triggers mousedown, mouseup, and click.
-          MockInteractions.tap(btn);
-          document.body.removeChild(btn);
-
-          assert.isTrue(overlay.opened, 'overlay opened');
-          overlay.async(function() {
-            assert.isTrue(overlay.opened, 'overlay is still open');
-            done();
-          }, 10);
-        });
-
-        test('clicking outside fires iron-overlay-canceled', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-canceled', function(event) {
-              assert.equal(event.detail.target, document.body, 'detail contains original click event');
-              done();
-            });
-            MockInteractions.tap(document.body);
-          });
-        });
-
-        test('clicking outside closes the overlay', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-closed', function(event) {
-              assert.isTrue(event.detail.canceled, 'overlay is canceled');
-              done();
-            });
-            MockInteractions.tap(document.body);
-          });
-        });
-
-        test('iron-overlay-canceled event can be prevented', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-canceled', function(event) {
-              event.preventDefault();
-            });
-            var spy = sinon.stub();
-            overlay.addEventListener('iron-overlay-closed', spy);
-            MockInteractions.tap(document.body);
-            Polymer.Base.async(function() {
-              assert.isTrue(overlay.opened, 'overlay is still open');
-              assert.isFalse(spy.called, 'iron-overlay-closed not fired');
-              done();
-            }, 10);
-          });
-        });
-
-        test('cancel an overlay with esc key', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-canceled', function(event) {
-              assert.equal(event.detail.type, 'keydown');
-              done();
-            });
-            MockInteractions.pressAndReleaseKeyOn(document, 27);
-          });
-        });
-
-        test('close an overlay with esc key', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-closed', function(event) {
-              assert.isTrue(event.detail.canceled, 'overlay is canceled');
-              done();
-            });
-            MockInteractions.pressAndReleaseKeyOn(document, 27);
-          });
-        });
-
-        test('no-cancel-on-outside-click property', function(done) {
-          overlay.noCancelOnOutsideClick = true;
-          runAfterOpen(overlay, function() {
-            var spy = sinon.stub();
-            overlay.addEventListener('iron-overlay-closed', spy);
-            MockInteractions.tap(document.body);
-            Polymer.Base.async(function() {
-              assert.isFalse(spy.called, 'iron-overlay-closed should not fire');
-              done();
-            }, 10);
-          });
-        });
-
-        test('no-cancel-on-esc-key property', function(done) {
-          overlay.noCancelOnEscKey = true;
-          runAfterOpen(overlay, function() {
-            var spy = sinon.stub();
-            overlay.addEventListener('iron-overlay-closed', spy);
-            MockInteractions.pressAndReleaseKeyOn(document, 27);
-            Polymer.Base.async(function() {
-              assert.isFalse(spy.called, 'iron-overlay-cancel should not fire');
-              done();
-            }, 10);
-          });
-        });
-
-        test('with-backdrop sets tabindex=-1 and removes it', function() {
-          overlay.withBackdrop = true;
-          assert.equal(overlay.getAttribute('tabindex'), '-1', 'tabindex is -1');
-          overlay.withBackdrop = false;
-          assert.isFalse(overlay.hasAttribute('tabindex'), 'tabindex removed');
-        });
-
-        test('with-backdrop does not override tabindex if already set', function() {
-          overlay.setAttribute('tabindex', '1');
-          overlay.withBackdrop = true;
-          assert.equal(overlay.getAttribute('tabindex'), '1', 'tabindex is 1');
-          overlay.withBackdrop = false;
-          assert.equal(overlay.getAttribute('tabindex'), '1', 'tabindex is still 1');
-        });
-
-      });
-
-      suite('keyboard event listener', function() {
-        var overlay;
-
-        var preventKeyDown = function(event) {
-          event.preventDefault();
-          event.stopPropagation();
-        }
-
-        suiteSetup(function() {
-          // Worst case scenario: listener with useCapture = true that prevents & stops propagation
-          // added before the overlay is initialized.
-          document.addEventListener('keydown', preventKeyDown, true);
-        });
-
-        setup(function() {
-          overlay = fixture('basic');
-        });
-
-        suiteTeardown(function() {
-          document.removeEventListener('keydown', preventKeyDown, true);
-        });
-
-        test('cancel an overlay with esc key even if event is prevented by other listeners', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-canceled', function(event) {
-              done();
-            });
-            MockInteractions.pressAndReleaseKeyOn(document, 27);
-          });
-        });
-      });
-
-      suite('tap event listener', function() {
-        var overlay;
-
-        var preventTap = function(event) {
-          event.preventDefault();
-          event.stopPropagation();
-        };
-
-        suiteSetup(function() {
-          // Worst case scenario: listener with useCapture = true that prevents & stops propagation
-          // added before the overlay is initialized.
-          document.body.addEventListener('tap', preventTap, true);
-        });
-
-        setup(function() {
-          overlay = fixture('basic');
-        });
-
-        suiteTeardown(function() {
-          document.body.removeEventListener('tap', preventTap, true);
-        });
-
-        test('cancel an overlay with tap outside even if event is prevented by other listeners', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-canceled', function(event) {
-              done();
-            });
-            MockInteractions.tap(document.body);
-          });
-        });
-      });
-
-      suite('opened overlay', function() {
-        var overlay;
-
-        setup(function() {
-          overlay = fixture('opened');
-        });
-
-        test('overlay open by default', function(done) {
-          overlay.addEventListener('iron-overlay-opened', function() {
-            assert.isTrue(overlay.opened, 'overlay starts opened');
-            assert.notEqual(getComputedStyle(overlay).display, 'none', 'overlay starts showing');
-            done();
-          });
-        });
-
-        test('overlay positioned & sized properly', function(done) {
-          overlay.addEventListener('iron-overlay-opened', function() {
-            var s = getComputedStyle(overlay);
-            assert.closeTo(parseFloat(s.left), (window.innerWidth - overlay.offsetWidth) / 2, 1, 'centered horizontally');
-            assert.closeTo(parseFloat(s.top), (window.innerHeight - overlay.offsetHeight) / 2, 1, 'centered vertically');
-            done();
-          });
-        });
-      });
-
-      suite('focus handling', function() {
-        var overlay;
-
-        setup(function() {
-          // Ensure focus is set to document.body
-          document.body.focus();
-          overlay = fixture('autofocus');
-        });
-
-        test('node with autofocus is focused', function(done) {
-          runAfterOpen(overlay, function() {
-            assert.equal(Polymer.dom(overlay).querySelector('[autofocus]'), document.activeElement, '<button autofocus> is focused');
-            done();
-          });
-        });
-
-        test('no-auto-focus will not focus node with autofocus', function(done) {
-          overlay.noAutoFocus = true;
-          runAfterOpen(overlay, function() {
-            assert.notEqual(Polymer.dom(overlay).querySelector('[autofocus]'), document.activeElement, '<button autofocus> not focused after opened');
-            done();
-          });
-          // In Safari the element with autofocus will immediately receive focus when displayed for the first time http://jsbin.com/woroci/2/
-          // Ensure this is not the case for overlay.
-          assert.notEqual(Polymer.dom(overlay).querySelector('[autofocus]'), document.activeElement, '<button autofocus> not immediately focused');
-        });
-
-        test('no-cancel-on-outside-click property; focus stays on overlay when click outside', function(done) {
-          overlay.noCancelOnOutsideClick = true;
-          runAfterOpen(overlay, function() {
-            MockInteractions.tap(document.body);
-            Polymer.Base.async(function() {
-              assert.equal(Polymer.dom(overlay).querySelector('[autofocus]'), document.activeElement, '<button autofocus> is focused');
-              done();
-            }, 10);
-          });
-        });
-
-        test('with-backdrop traps the focus within the overlay', function(done) {
-          var focusSpy = sinon.stub();
-          var button = document.createElement('button');
-          document.body.appendChild(button);
-          button.addEventListener('focus', focusSpy, true);
-
-          overlay.withBackdrop = true;
-          runAfterOpen(overlay, function() {
-            // Try to steal the focus
-            MockInteractions.focus(button);
-            assert.equal(Polymer.dom(overlay).querySelector('[autofocus]'), document.activeElement, '<button autofocus> is focused');
-            assert.equal(focusSpy.callCount, 0, 'button in body did not get the focus');
-            document.body.removeChild(button);
-            done();
-          });
-        });
-
-        test('overlay with-backdrop and 1 focusable: prevent TAB and trap the focus', function(done) {
-          overlay.withBackdrop = true;
-          runAfterOpen(overlay, function() {
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Spy keydown.
-              var tabSpy = sinon.spy();
-              document.addEventListener('keydown', tabSpy);
-              // Simulate TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9);
-              assert.equal(Polymer.dom(overlay).querySelector('[autofocus]'), document.activeElement, 'focus stays on button');
-              assert.isTrue(tabSpy.calledOnce, 'keydown spy called');
-              assert.isTrue(tabSpy.getCall(0).args[0].defaultPrevented, 'keydown default prevented');
-              // Cleanup.
-              document.removeEventListener('keydown', tabSpy);
-              done();
-            }, 1);
-          });
-        });
-
-        test('empty overlay with-backdrop: prevent TAB and trap the focus', function(done) {
-          overlay = fixture('basic');
-          overlay.withBackdrop = true;
-          runAfterOpen(overlay, function() {
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Spy keydown.
-              var tabSpy = sinon.spy();
-              document.addEventListener('keydown', tabSpy);
-              // Simulate TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9);
-              assert.equal(overlay, document.activeElement, 'focus stays on overlay');
-              assert.isTrue(tabSpy.calledOnce, 'keydown spy called');
-              assert.isTrue(tabSpy.getCall(0).args[0].defaultPrevented, 'keydown default prevented');
-              // Cleanup.
-              document.removeEventListener('keydown', tabSpy);
-              done();
-            }, 1);
-          });
-        });
-
-      });
-
-      suite('focusable nodes', function() {
-        var overlay, overlayWithTabIndex, overlayFocusableNodes;
-
-        setup(function() {
-          var f = fixture('focusables');
-          overlay = f[0];
-          overlayWithTabIndex = f[1];
-          overlayFocusableNodes = f[2];
-        });
-
-        test('_focusableNodes returns nodes that are focusable', function(done) {
-          runAfterOpen(overlay, function() {
-            var focusableNodes = overlay._focusableNodes;
-            assert.equal(focusableNodes.length, 3, '3 nodes are focusable');
-            assert.equal(focusableNodes[0], Polymer.dom(overlay).querySelector('.focusable1'));
-            assert.equal(focusableNodes[1], Polymer.dom(overlay).querySelector('.focusable2'));
-            assert.equal(focusableNodes[2], Polymer.dom(overlay).querySelector('.focusable3'));
-            done();
-          });
-        });
-
-        test('_focusableNodes includes overlay if it has a valid tabindex', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.setAttribute('tabindex', '0');
-            var focusableNodes = overlay._focusableNodes;
-            assert.equal(focusableNodes.length, 4, '4 focusable nodes');
-            assert.notEqual(focusableNodes.indexOf(overlay), -1, 'overlay is included');
-            done();
-          });
-        });
-
-        test('_focusableNodes respects the tabindex order', function(done) {
-          runAfterOpen(overlayWithTabIndex, function() {
-            var focusableNodes = overlayWithTabIndex._focusableNodes;
-            assert.equal(focusableNodes.length, 6, '6 nodes are focusable');
-            assert.equal(focusableNodes[0], Polymer.dom(overlayWithTabIndex).querySelector('.focusable1'));
-            assert.equal(focusableNodes[1], Polymer.dom(overlayWithTabIndex).querySelector('.focusable2'));
-            assert.equal(focusableNodes[2], Polymer.dom(overlayWithTabIndex).querySelector('.focusable3'));
-            assert.equal(focusableNodes[3], Polymer.dom(overlayWithTabIndex).querySelector('.focusable4'));
-            assert.equal(focusableNodes[4], Polymer.dom(overlayWithTabIndex).querySelector('.focusable5'));
-            assert.equal(focusableNodes[5], Polymer.dom(overlayWithTabIndex).querySelector('.focusable6'));
-            done();
-          });
-        });
-
-        test('_focusableNodes can be overridden', function(done) {
-          runAfterOpen(overlayFocusableNodes, function() {
-            // It has 1 focusable in the light dom, and 2 in the shadow dom.
-            var focusableNodes = overlayFocusableNodes._focusableNodes;
-            assert.equal(focusableNodes.length, 2, 'length ok');
-            assert.equal(focusableNodes[0], overlayFocusableNodes.$.first, 'first ok');
-            assert.equal(focusableNodes[1], overlayFocusableNodes.$.last, 'last ok');
-            done();
-          });
-        });
-
-        test('with-backdrop: TAB & Shift+TAB wrap focus', function(done) {
-          overlay.withBackdrop = true;
-          runAfterOpen(overlay, function() {
-            var focusableNodes = overlay._focusableNodes;
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Go to last element.
-              focusableNodes[focusableNodes.length-1].focus();
-              // Spy keydown.
-              var tabSpy = sinon.spy();
-              document.addEventListener('keydown', tabSpy);
-              // Simulate TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9);
-              assert.equal(focusableNodes[0], document.activeElement, 'focus wrapped to first focusable');
-              assert.isTrue(tabSpy.calledOnce, 'keydown spy called');
-              assert.isTrue(tabSpy.getCall(0).args[0].defaultPrevented, 'keydown default prevented');
-              // Simulate Shift+TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9, ['shift']);
-              assert.equal(focusableNodes[focusableNodes.length-1], document.activeElement, 'focus wrapped to last focusable');
-              assert.isTrue(tabSpy.calledTwice, 'keydown spy called again');
-              assert.isTrue(tabSpy.getCall(1).args[0].defaultPrevented, 'keydown default prevented again');
-              // Cleanup.
-              document.removeEventListener('keydown', tabSpy);
-              done();
-            }, 1);
-          });
-        });
-
-        test('with-backdrop: TAB & Shift+TAB wrap focus respecting tabindex', function(done) {
-          overlayWithTabIndex.withBackdrop = true;
-          runAfterOpen(overlayWithTabIndex, function() {
-            var focusableNodes = overlayWithTabIndex._focusableNodes;
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Go to last element.
-              focusableNodes[focusableNodes.length-1].focus();
-              // Simulate TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9);
-              assert.equal(focusableNodes[0], document.activeElement, 'focus wrapped to first focusable');
-              // Simulate Shift+TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9, ['shift']);
-              assert.equal(focusableNodes[focusableNodes.length-1], document.activeElement, 'focus wrapped to last focusable');
-              done();
-            }, 1);
-          });
-        });
-
-        test('with-backdrop: Shift+TAB after open wrap focus', function(done) {
-          overlay.withBackdrop = true;
-          runAfterOpen(overlay, function() {
-            var focusableNodes = overlay._focusableNodes;
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Spy keydown.
-              var tabSpy = sinon.spy();
-              document.addEventListener('keydown', tabSpy);
-              // Simulate Shift+TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9, ['shift']);
-              assert.equal(focusableNodes[focusableNodes.length-1], document.activeElement, 'focus wrapped to last focusable');
-              assert.isTrue(tabSpy.calledOnce, 'keydown spy called');
-              assert.isTrue(tabSpy.getCall(0).args[0].defaultPrevented, 'keydown default prevented');
-              // Cleanup.
-              document.removeEventListener('keydown', tabSpy);
-              done();
-            }, 1);
-          });
-        });
-
-        test('with-backdrop: after open, update last focusable node and then Shift+TAB', function(done) {
-          overlay.withBackdrop = true;
-          runAfterOpen(overlay, function() {
-            var focusableNodes = overlay._focusableNodes;
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Before tabbing, make lastFocusable non-tabbable. This will make
-              // the one before it (focusableNodes.length - 2), the new last focusable node.
-              focusableNodes[focusableNodes.length-1].setAttribute('tabindex', '-1');
-              overlay.invalidateTabbables();
-              // Simulate Shift+TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9, ['shift']);
-              assert.equal(focusableNodes[focusableNodes.length-2], document.activeElement, 'focus wrapped correctly');
-              done();
-            }, 1);
-          });
-        });
-
-        test('with-backdrop: Shift+TAB wrap focus in shadowDOM', function(done) {
-          overlayFocusableNodes.withBackdrop = true;
-          runAfterOpen(overlayFocusableNodes, function() {
-            // 1ms timeout needed by IE10 to have proper focus switching.
-            Polymer.Base.async(function() {
-              // Spy keydown.
-              var tabSpy = sinon.spy();
-              document.addEventListener('keydown', tabSpy);
-              // Simulate Shift+TAB.
-              MockInteractions.pressAndReleaseKeyOn(document, 9, ['shift']);
-              assert.equal(overlayFocusableNodes.$.last, Polymer.IronOverlayManager.deepActiveElement, 'focus wrapped to last focusable in the shadowDOM');
-              assert.isTrue(tabSpy.calledOnce, 'keydown spy called');
-              assert.isTrue(tabSpy.getCall(0).args[0].defaultPrevented, 'keydown default prevented');
-              // Cleanup.
-              document.removeEventListener('keydown', tabSpy);
-              done();
-            }, 1);
-          });
-        });
-
-      });
-
-      suite('Polymer.IronOverlayManager.deepActiveElement', function() {
-
-        test('handles document.body', function () {
-          document.body.focus();
-          assert.equal(Polymer.IronOverlayManager.deepActiveElement, document.body);
-        });
-
-        test('handles light dom', function () {
-          var focusable = document.getElementById('focusInput');
-          focusable.focus();
-          assert.equal(Polymer.IronOverlayManager.deepActiveElement, focusable, 'input is handled');
-          focusable.blur();
-        });
-
-        test('handles shadow dom', function () {
-          var focusable = document.getElementById('buttons').$.button0;
-          focusable.focus();
-          assert.equal(Polymer.IronOverlayManager.deepActiveElement, focusable);
-          focusable.blur();
-        });
-
-      });
-
-      suite('restore-focus-on-close', function() {
-
-        var overlay;
-        setup(function () {
-          overlay = fixture('autofocus');
-          overlay.restoreFocusOnClose = true;
-        });
-
-        teardown(function () {
-          // No matter what, return the focus to body!
-          document.body.focus();
-        });
-
-        test('does not return focus on close by default (restore-focus-on-close=false)', function(done) {
-          overlay.restoreFocusOnClose = false;
-          var focusable = document.getElementById('focusInput');
-          focusable.focus();
-          runAfterOpen(overlay, function() {
-            runAfterClose(overlay, function() {
-              assert.notEqual(Polymer.IronOverlayManager.deepActiveElement, focusable, 'focus is not restored to focusable');
-              done();
-            });
-          });
-        });
-
-        test('overlay returns focus on close', function(done) {
-          var focusable = document.getElementById('focusInput');
-          focusable.focus();
-          runAfterOpen(overlay, function() {
-            runAfterClose(overlay, function() {
-              assert.equal(Polymer.IronOverlayManager.deepActiveElement, focusable, 'focus restored to focusable');
-              done();
-            });
-          });
-        });
-
-        test('overlay returns focus on close (ShadowDOM)', function(done) {
-          var focusable = document.getElementById('buttons').$.button0;
-          focusable.focus();
-          runAfterOpen(overlay, function() {
-            runAfterClose(overlay, function() {
-              assert.equal(Polymer.IronOverlayManager.deepActiveElement, focusable, 'focus restored to focusable');
-              done();
-            });
-          });
-        });
-
-      });
-
-      suite('overlay with backdrop', function() {
-        var overlay;
-
-        setup(function() {
-          overlay = fixture('backdrop');
-        });
-
-        test('backdrop is opened when overlay is opened', function(done) {
-          assert.isOk(overlay.backdropElement, 'backdrop is defined');
-          runAfterOpen(overlay, function() {
-            assert.isTrue(overlay.backdropElement.opened, 'backdrop is opened');
-            assert.isOk(overlay.backdropElement.parentNode, 'backdrop is inserted in the DOM');
-            done();
-          });
-        });
-
-        test('backdrop appears behind the overlay', function(done) {
-          runAfterOpen(overlay, function() {
-            styleZ = parseInt(window.getComputedStyle(overlay).zIndex, 10);
-            backdropStyleZ = parseInt(window.getComputedStyle(overlay.backdropElement).zIndex, 10);
-            assert.isTrue(styleZ > backdropStyleZ, 'overlay has higher z-index than backdrop');
-            done();
-          });
-        });
-
-        test('backdrop is removed when overlay is closed', function(done) {
-          runAfterOpen(overlay, function() {
-            runAfterClose(overlay, function() {
-              assert.isFalse(overlay.backdropElement.opened, 'backdrop is closed');
-              assert.isNotOk(overlay.backdropElement.parentNode, 'backdrop is removed from the DOM');
-              assert.lengthOf(document.querySelectorAll('iron-overlay-backdrop'), 0, 'no backdrop elements on body');
-              done();
-            });
-          });
-        });
-
-        test('backdrop is removed when the element is removed from DOM', function(done) {
-          runAfterOpen(overlay, function() {
-            Polymer.dom(overlay).parentNode.removeChild(overlay);
-            // Ensure detached is executed.
-            Polymer.dom.flush();
-            assert.isFalse(overlay.backdropElement.opened, 'backdrop is closed');
-            assert.isNotOk(overlay.backdropElement.parentNode, 'backdrop is removed from the DOM');
-            assert.lengthOf(document.querySelectorAll('iron-overlay-backdrop'), 0, 'no backdrop elements on body');
-            assert.isNotOk(overlay._manager.currentOverlay(), 'currentOverlay ok');
-            done();
-          });
-        });
-
-        test('manager.getBackdrops() updated on opened changes', function(done) {
-          runAfterOpen(overlay, function() {
-            assert.equal(Polymer.IronOverlayManager.getBackdrops().length, 1, 'overlay added to manager backdrops');
-            runAfterClose(overlay, function() {
-              assert.equal(Polymer.IronOverlayManager.getBackdrops().length, 0, 'overlay removed from manager backdrops');
-              done();
-            });
-          });
-        });
-
-        test('updating with-backdrop to false closes backdrop', function(done) {
-          runAfterOpen(overlay, function() {
-            overlay.withBackdrop = false;
-            assert.isFalse(overlay.backdropElement.opened, 'backdrop is closed');
-            assert.isNotObject(overlay.backdropElement.parentNode, 'backdrop is removed from document');
-            done();
-          });
-        });
-
-        test('backdrop is removed when toggling overlay opened', function(done) {
-          overlay.open();
-          runAfterClose(overlay, function() {
-            assert.isFalse(overlay.backdropElement.opened, 'backdrop is closed');
-            assert.isNotOk(overlay.backdropElement.parentNode, 'backdrop is removed from document');
-            done();
-          });
-        });
-
-        test('withBackdrop = false does not prevent click outside event', function(done) {
-          overlay.withBackdrop = false;
-          runAfterOpen(overlay, function() {
-            overlay.addEventListener('iron-overlay-canceled', function(event) {
-              assert.isFalse(event.detail.defaultPrevented, 'click event not prevented');
-              done();
-            });
-            MockInteractions.tap(document.body);
-          });
-        });
-      });
-
-      suite('multiple overlays', function() {
-        var overlay1, overlay2;
-
-        setup(function() {
-          var f = fixture('multiple');
-          overlay1 = f[0];
-          overlay2 = f[1];
-        });
-
-        test('new overlays appear on top', function(done) {
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-              var styleZ1 = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-              assert.isTrue(styleZ1 > styleZ, 'overlay2 has higher z-index than overlay1');
-              done();
-            });
-          });
-        });
-
-        test('ESC closes only the top overlay', function(done) {
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              MockInteractions.pressAndReleaseKeyOn(document, 27);
-              assert.isFalse(overlay2.opened, 'overlay2 was closed');
-              assert.isTrue(overlay1.opened, 'overlay1 is still opened');
-              done();
-            });
-          });
-        });
-
-        test('close an overlay in proximity to another overlay', function(done) {
-          // Open and close a separate overlay.
-          overlay1.open();
-          overlay1.close();
-
-          // Open the overlay we care about.
-          overlay2.open();
-
-          // Immediately close the first overlay.
-          // Wait for infinite recursion, otherwise we win.
-          runAfterClose(overlay2, function() {
-            done();
-          })
-        });
-
-      });
-
-      suite('Manager overlays in sync', function() {
-        var overlay1, overlay2;
-        var overlays;
-
-        setup(function() {
-          var f = fixture('multiple');
-          overlay1 = f[0];
-          overlay2 = f[1];
-          overlays = Polymer.IronOverlayManager._overlays;
-        });
-
-        test('no duplicates after attached', function(done) {
-          overlay1 = document.createElement('test-overlay');
-          runAfterOpen(overlay1, function() {
-            assert.equal(overlays.length, 1, 'correct count after open and attached');
-            document.body.removeChild(overlay1);
-            done();
-          });
-          document.body.appendChild(overlay1);
-        });
-
-        test('call open multiple times handled', function(done) {
-          overlay1.open();
-          overlay1.open();
-          runAfterOpen(overlay1, function() {
-            assert.equal(overlays.length, 1, '1 overlay after open');
-            done();
-          })
-        });
-
-        test('close handled', function(done) {
-          runAfterOpen(overlay1, function() {
-            runAfterClose(overlay1, function() {
-              assert.equal(overlays.length, 0, '0 overlays after close');
-              done();
-            });
-          });
-        });
-
-        test('open/close brings overlay on top', function(done) {
-          overlay1.open();
-          runAfterOpen(overlay2, function() {
-            assert.equal(overlays.indexOf(overlay1), 0, 'overlay1 at index 0');
-            assert.equal(overlays.indexOf(overlay2), 1, 'overlay2 at index 1');
-            overlay1.close();
-            runAfterOpen(overlay1, function() {
-              assert.equal(overlays.indexOf(overlay1), 1, 'overlay1 moved at index 1');
-              assert.isAbove(parseInt(overlay1.style.zIndex), parseInt(overlay2.style.zIndex), 'overlay1 on top of overlay2');
-              done();
-            });
-          });
-        });
-      });
-
-      suite('z-ordering', function() {
-
-        var originalMinimumZ;
-        var overlay1, overlay2;
-
-        setup(function() {
-          var f = fixture('multiple');
-          overlay1 = f[0];
-          overlay2 = f[1];
-          originalMinimumZ = Polymer.IronOverlayManager._minimumZ;
-        });
-
-        teardown(function() {
-          Polymer.IronOverlayManager._minimumZ = originalMinimumZ;
-        });
-
-        // for iframes
-        test('default z-index is greater than 100', function(done) {
-          runAfterOpen(overlay1, function() {
-            var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-            assert.isTrue(styleZ > 100, 'overlay1 z-index is <= 100');
-            done();
-          });
-        });
-
-        test('ensureMinimumZ() effects z-index', function(done) {
-          Polymer.IronOverlayManager.ensureMinimumZ(1000);
-
-          runAfterOpen(overlay1, function() {
-            var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-            assert.isTrue(styleZ > 1000, 'overlay1 z-index is <= 1000');
-            done();
-          });
-        });
-
-        test('ensureMinimumZ() never decreases the minimum z-index', function(done) {
-          Polymer.IronOverlayManager.ensureMinimumZ(1000);
-          Polymer.IronOverlayManager.ensureMinimumZ(500);
-
-          runAfterOpen(overlay1, function() {
-            var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-            assert.isTrue(styleZ > 1000, 'overlay1 z-index is <= 1000');
-            done();
-          });
-        });
-
-      });
-
-      suite('multiple overlays with backdrop', function() {
-        var overlay1, overlay2, overlay3;
-
-        setup(function() {
-          var f = fixture('multiple');
-          overlay1 = f[0];
-          overlay2 = f[1];
-          overlay3 = f[2];
-          overlay1.withBackdrop = overlay2.withBackdrop = overlay3.withBackdrop = true;
-        });
-
-        test('multiple overlays share the same backdrop', function() {
-          assert.isTrue(overlay1.backdropElement === overlay2.backdropElement, 'overlay1 and overlay2 have the same backdrop element');
-          assert.isTrue(overlay1.backdropElement === overlay3.backdropElement, 'overlay1 and overlay3 have the same backdrop element');
-        });
-
-        test('only one iron-overlay-backdrop in the DOM', function(done) {
-          // Open them all.
-          overlay1.opened = true;
-          overlay2.opened = true;
-          runAfterOpen(overlay3, function() {
-            assert.lengthOf(document.querySelectorAll('iron-overlay-backdrop'), 1, 'only one backdrop element in the DOM');
-            done();
-          });
-        });
-
-        test('iron-overlay-backdrop is removed from the DOM when all overlays with backdrop are closed', function(done) {
-          // Open & close them all.
-          overlay1.opened = true;
-          overlay2.opened = true;
-          runAfterOpen(overlay3, function() {
-            overlay1.opened = overlay2.opened = false;
-            runAfterClose(overlay3, function() {
-              assert.lengthOf(document.querySelectorAll('iron-overlay-backdrop'), 0, 'backdrop element removed from the DOM');
-              done();
-            });
-          });
-        });
-
-        test('newest overlay appear on top', function(done) {
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-              var style1Z = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-              var bgStyleZ = parseInt(window.getComputedStyle(overlay1.backdropElement).zIndex, 10);
-              assert.isTrue(style1Z > styleZ, 'overlay2 has higher z-index than overlay1');
-              assert.isTrue(styleZ > bgStyleZ, 'overlay1 has higher z-index than backdrop');
-              done();
-            });
-          });
-        });
-
-        var clickEvents = ['click', 'tap'];
-        for (var i = 0; i < clickEvents.length; i++) {
-          var eventName = clickEvents[i];
-          test(eventName + ' event handled only by top overlay', function(done) {
-            runAfterOpen(overlay1, function() {
-              runAfterOpen(overlay2, function() {
-                var btn = Polymer.dom(overlay2).querySelector('button');
-                btn.addEventListener(eventName, overlay2.close.bind(overlay2));
-                MockInteractions.tap(btn);
-                assert.isFalse(overlay2.opened, 'overlay2 closed');
-                assert.isTrue(overlay1.opened, 'overlay1 opened');
-                overlay2.addEventListener('iron-overlay-closed', function() {
-                  assert.isTrue(overlay1.opened, 'overlay1 still opened');
-                  done();
-                });
-              });
-            });
-          });
-        }
-
-        test('updating with-backdrop updates z-index', function(done) {
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              overlay1.withBackdrop = false;
-              var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-              var style1Z = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-              var bgStyleZ = parseInt(window.getComputedStyle(overlay1.backdropElement).zIndex, 10);
-              assert.isTrue(style1Z > bgStyleZ, 'overlay2 has higher z-index than backdrop');
-              assert.isTrue(styleZ < bgStyleZ, 'overlay1 has lower z-index than backdrop');
-              done();
-            });
-          });
-        });
-
-      });
-
-      suite('overlay in composed tree', function() {
-        var composed, overlay, trigger;
-        setup(function(done) {
-          composed = fixture('composed');
-          overlay = composed.$.overlay;
-          trigger = composed.$.trigger;
-          overlay.withBackdrop = true;
-          overlay.addEventListener('iron-overlay-opened', function() {
-            done();
-          });
-          // Opens the overlay.
-          MockInteractions.tap(trigger);
-        });
-
-        test('click on overlay content does not close it', function(done) {
-          // Tap on button inside overlay.
-          MockInteractions.tap(Polymer.dom(overlay).querySelector('button'));
-          Polymer.Base.async(function(){
-            assert.isTrue(overlay.opened, 'overlay still opened');
-            done();
-          }, 1);
-        });
-
-        test('with-backdrop wraps the focus within the overlay', function(done) {
-          // 1ms timeout needed by IE10 to have proper focus switching.
-          Polymer.Base.async(function(){
-            var buttons = Polymer.dom(overlay).querySelectorAll('button');
-            // Go to last element.
-            buttons[buttons.length-1].focus();
-            // Spy keydown.
-            var tabSpy = sinon.spy();
-            document.addEventListener('keydown', tabSpy);
-            // Simulate TAB.
-            MockInteractions.pressAndReleaseKeyOn(document, 9);
-            assert.equal(buttons[0], Polymer.IronOverlayManager.deepActiveElement, 'focus wrapped to first focusable');
-            assert.isTrue(tabSpy.calledOnce, 'keydown spy called');
-            assert.isTrue(tabSpy.getCall(0).args[0].defaultPrevented, 'keydown default prevented');
-            // Simulate Shift+TAB.
-            MockInteractions.pressAndReleaseKeyOn(document, 9, ['shift']);
-            assert.equal(buttons[buttons.length-1], Polymer.IronOverlayManager.deepActiveElement, 'focus wrapped to last focusable');
-            assert.isTrue(tabSpy.calledTwice, 'keydown spy called again');
-            assert.isTrue(tabSpy.getCall(1).args[0].defaultPrevented, 'keydown default prevented again');
-            // Cleanup.
-            document.removeEventListener('keydown', tabSpy);
-            done();
-          }, 1);
-        });
-
-      });
-
-      suite('always-on-top', function() {
-        var overlay1, overlay2;
-
-        setup(function() {
-          var f = fixture('multiple');
-          overlay1 = f[0];
-          overlay2 = f[1];
-          overlay1.alwaysOnTop = true;
-        });
-
-        test('stays on top', function(done) {
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              var zIndex1 = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-              var zIndex2 = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-              assert.isAbove(zIndex1, zIndex2, 'overlay1 on top');
-              assert.equal(Polymer.IronOverlayManager.currentOverlay(), overlay1, 'currentOverlay ok');
-              done();
-            });
-          });
-        });
-
-        test('stays on top also if another overlay is with-backdrop', function(done) {
-          overlay2.withBackdrop = true;
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              var zIndex1 = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-              var zIndex2 = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-              assert.isAbove(zIndex1, zIndex2, 'overlay1 on top');
-              assert.equal(Polymer.IronOverlayManager.currentOverlay(), overlay1, 'currentOverlay ok');
-              done();
-            });
-          });
-        });
-
-        test('last overlay with always-on-top wins', function(done) {
-          overlay2.alwaysOnTop = true;
-          runAfterOpen(overlay1, function() {
-            runAfterOpen(overlay2, function() {
-              var zIndex1 = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-              var zIndex2 = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-              assert.isAbove(zIndex2, zIndex1, 'overlay2 on top');
-              assert.equal(Polymer.IronOverlayManager.currentOverlay(), overlay2, 'currentOverlay ok');
-              done();
-            });
-          });
-        });
-
-      });
-
-      suite('animations', function() {
-
-        test('overlay animations correctly triggered', function(done) {
-          var overlay = fixture('basic');
-          overlay.animated = true;
-          overlay.open();
-          overlay.addEventListener('simple-overlay-open-animation-start', function() {
-            // Since animated overlay will transition center + 300px to center,
-            // we should not find the element at the center when the open animation starts.
-            var centerElement = document.elementFromPoint(window.innerWidth/2, window.innerHeight/2);
-            assert.notEqual(centerElement, overlay, 'overlay should not be centered already');
-            done();
-          });
-        });
-
-      });
-
-      suite('a11y', function() {
-
-        test('overlay has aria-hidden=true when opened', function() {
-          var overlay = fixture('basic');
-          assert.equal(overlay.getAttribute('aria-hidden'), 'true', 'overlay has aria-hidden="true"');
-          overlay.open();
-          assert.isFalse(overlay.hasAttribute('aria-hidden'), 'overlay does not have aria-hidden attribute');
-          overlay.close();
-          assert.equal(overlay.getAttribute('aria-hidden'), 'true', 'overlay has aria-hidden="true"');
-        });
-
-      });
-    </script>
-
-  </body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-buttons-wrapper.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-buttons-wrapper.html
deleted file mode 100644
index 669b8ab..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-buttons-wrapper.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="test-buttons.html">
-
-<dom-module id="test-buttons-wrapper">
-  <template>
-    <style>
-      :host {
-        display: block;
-        border: 1px solid gray;
-        padding: 10px;
-      }
-    </style>
-
-    <select id="select">
-      <option>1</option>
-    </select>
-    <test-buttons id="wrapped">
-      <content></content>
-    </test-buttons>
-    <div tabindex="0" id="focusableDiv">Focusable div</div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'test-buttons-wrapper'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-buttons.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-buttons.html
deleted file mode 100644
index 05434a0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-buttons.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<dom-module id="test-buttons">
-  <template>
-    <style>
-      :host {
-        display: block;
-        border: 1px solid black;
-        padding: 10px;
-      }
-    </style>
-
-    <button id="button0">button0</button>
-    <button id="button1">button1</button>
-    <content></content>
-    <button id="button2">button2</button>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'test-buttons'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-menu-button.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-menu-button.html
deleted file mode 100644
index 24c78d9..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-menu-button.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="test-overlay.html">
-
-<dom-module id="test-menu-button">
-
-  <template>
-    <button id="trigger" on-click="toggle">Open</button>
-    <test-overlay id="overlay">
-      Composed overlay
-      <button>button 1</button>
-      <button>button 2</button>
-    </test-overlay>
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-  Polymer({
-    is: 'test-menu-button',
-    toggle: function() {
-      this.$.overlay.toggle();
-    }
-  });
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-overlay.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-overlay.html
deleted file mode 100644
index 6b8b32b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-overlay.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<link rel="import" href="../iron-overlay-behavior.html">
-
-<dom-module id="test-overlay">
-  <template>
-    <style>
-      :host {
-        background: white;
-        color: black;
-        border: 1px solid black;
-      }
-
-      :host([animated]) {
-        -webkit-transition: -webkit-transform 0.3s;
-        transition: transform 0.3s;
-        -webkit-transform: translateY(300px);
-        transform: translateY(300px);
-      }
-
-      :host(.opened[animated]) {
-        -webkit-transform: translateY(0px);
-        transform: translateY(0px);
-      }
-    </style>
-    
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-  (function() {
-
-    Polymer({
-
-      is: 'test-overlay',
-
-      properties: {
-        animated: {
-          type: Boolean,
-          reflectToAttribute: true
-        }
-      },
-
-      behaviors: [
-        Polymer.IronOverlayBehavior
-      ],
-
-      listeners: {
-        'transitionend': '__onTransitionEnd'
-      },
-
-      _renderOpened: function() {
-        if (this.animated) {
-          if (this.withBackdrop) {
-            this.backdropElement.open();
-          }
-          this.classList.add('opened');
-          this.fire('simple-overlay-open-animation-start');
-        } else {
-          Polymer.IronOverlayBehaviorImpl._renderOpened.apply(this, arguments);
-        }
-      },
-
-      _renderClosed: function() {
-        if (this.animated) {
-          if (this.withBackdrop) {
-            this.backdropElement.close();
-          }
-          this.classList.remove('opened');
-          this.fire('simple-overlay-close-animation-start');
-        } else {
-          Polymer.IronOverlayBehaviorImpl._renderClosed.apply(this, arguments);
-        }
-      },
-
-      __onTransitionEnd: function(e) {
-        if (e && e.target === this) {
-          if (this.opened) {
-            this._finishRenderOpened();
-          } else {
-            this._finishRenderClosed();
-          }
-        }
-      },
-
-    });
-
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-overlay2.html b/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-overlay2.html
deleted file mode 100644
index 23eac8e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-overlay-behavior/test/test-overlay2.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<link rel="import" href="../iron-overlay-behavior.html">
-
-<dom-module id="test-overlay2">
-  <template>
-    <style>
-      :host {
-        background: white;
-        color: black;
-        border: 1px solid black;
-      }
-    </style>
-
-    <button id="first">first</button>
-    <content></content>
-    <button id="last">last</button>
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'test-overlay2',
-
-    behaviors: [
-      Polymer.IronOverlayBehavior
-    ],
-
-    get _focusableNodes() {
-      return [this.$.first, this.$.last];
-    }
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-pages/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/README.md b/systrace/catapult/third_party/polymer/components/iron-pages/README.md
deleted file mode 100644
index 7a2e6b7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-pages.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-pages.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-pages)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-pages)_
-
-
-##&lt;iron-pages&gt;
-
-`iron-pages` is used to select one of its children to show. One use is to cycle through a list of
-children "pages".
-
-Example:
-
-```html
-<iron-pages selected="0">
-  <div>One</div>
-  <div>Two</div>
-  <div>Three</div>
-</iron-pages>
-
-<script>
-  document.addEventListener('click', function(e) {
-    var pages = document.querySelector('iron-pages');
-    pages.selectNext();
-  });
-</script>
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/bower.json b/systrace/catapult/third_party/polymer/components/iron-pages/bower.json
deleted file mode 100644
index 960a199..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/bower.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "iron-pages",
-  "version": "1.0.9",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Organizes a set of pages and shows one at a time",
-  "main": "iron-pages.html",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-pages.git"
-  },
-  "keywords": [
-    "web-components",
-    "polymer",
-    "container"
-  ],
-  "dependencies": {
-    "iron-resizable-behavior": "polymerelements/iron-resizable-behavior#^1.0.0",
-    "iron-selector": "polymerelements/iron-selector#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "polymerelements/iron-demo-helpers#^1.0.0",
-    "paper-styles": "polymerelements/paper-styles#^1.0.2",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-pages/demo/index.html
deleted file mode 100644
index d7e7c75..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/demo/index.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-pages demo</title>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <meta name="mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../iron-pages.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles"></style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>iron-pages shows only one of its children at a time.</h3>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          iron-pages {
-            width: 100%;
-            height: 200px;
-            font-size: 50px;
-            color: white;
-            text-align: center;
-          }
-          iron-pages div {
-            width: 100%;
-            height: 100%;
-            padding: 80px 0;
-          }
-          iron-pages div:nth-child(1) {
-            background-color: var(--google-blue-500);
-          }
-          iron-pages div:nth-child(2) {
-            background-color: var(--google-red-500);
-          }
-          iron-pages div:nth-child(3) {
-            background-color: var(--google-green-500);
-          }
-        </style>
-        <p>Click on a page to advance to the next one.</p>
-        <iron-pages selected="0">
-          <div>One</div>
-          <div>Two</div>
-          <div>Three</div>
-        </iron-pages>
-        <script>
-          var pages = document.querySelector('iron-pages');
-          pages.addEventListener('click', function(e) {
-            pages.selectNext();
-          });
-        </script>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/hero.svg b/systrace/catapult/third_party/polymer/components/iron-pages/hero.svg
deleted file mode 100755
index 12b9b72..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/hero.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<path d="M143.3,73.6H51.7V26.7h91.6V73.6z M53.7,71.6h87.6V28.7H53.7V71.6z"/>

-	<path d="M158.3,85.4H66.7V38.6h91.6V85.4z M68.7,83.4h87.6V40.6H68.7V83.4z"/>

-	<path d="M172,99H80.4V52.1H172V99z M82.4,97H170V54.1H82.4V97z"/>

-	<circle cx="53" cy="28" r="4"/>

-	<circle cx="171" cy="98" r="4"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/index.html b/systrace/catapult/third_party/polymer/components/iron-pages/index.html
deleted file mode 100644
index 67ae088..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/index.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>iron-pages</title>
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/iron-pages.html b/systrace/catapult/third_party/polymer/components/iron-pages/iron-pages.html
deleted file mode 100644
index 9325779..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/iron-pages.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="../iron-selector/iron-selectable.html">
-
-<!--
-`iron-pages` is used to select one of its children to show. One use is to cycle through a list of
-children "pages".
-
-Example:
-
-    <iron-pages selected="0">
-      <div>One</div>
-      <div>Two</div>
-      <div>Three</div>
-    </iron-pages>
-
-    <script>
-      document.addEventListener('click', function(e) {
-        var pages = document.querySelector('iron-pages');
-        pages.selectNext();
-      });
-    </script>
-
-@group Iron Elements
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="iron-pages">
-
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-
-      :host > ::content > :not(.iron-selected) {
-        display: none !important;
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-  <script>
-    Polymer({
-
-      is: 'iron-pages',
-
-      behaviors: [
-        Polymer.IronResizableBehavior,
-        Polymer.IronSelectableBehavior
-      ],
-
-      properties: {
-
-        // as the selected page is the only one visible, activateEvent
-        // is both non-sensical and problematic; e.g. in cases where a user
-        // handler attempts to change the page and the activateEvent
-        // handler immediately changes it back
-        activateEvent: {
-          type: String,
-          value: null
-        }
-
-      },
-
-      observers: [
-        '_selectedPageChanged(selected)'
-      ],
-
-      _selectedPageChanged: function(selected, old) {
-        this.async(this.notifyResize);
-      }
-    });
-
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/test/attr-for-selected.html b/systrace/catapult/third_party/polymer/components/iron-pages/test/attr-for-selected.html
deleted file mode 100644
index 954bc07..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/test/attr-for-selected.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-pages-attr-for-selected</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../iron-pages.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <iron-pages attr-for-selected="name" selected="page0">
-          <div name="page0">Page 0</div>
-          <div name="page1">Page 1</div>
-          <div name="page2">Page 2</div>
-          <div name="page3">Page 3</div>
-        </iron-pages>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('basic', function() {
-        var pages;
-
-        suite('honor the selected attribute', function() {
-          setup(function () {
-            pages = fixture('basic');
-          });
-
-          test('selected value', function() {
-            assert.equal(pages.selected, 'page0');
-          });
-
-          test('selected item', function(done) {
-            // iron-selector uses observeNodes, which is async.
-            Polymer.Base.async(function() {
-              assert.equal(pages.selectedItem, pages.items[0])
-              done();
-            }, 1);
-          });
-
-          test('selected item is display:block and all others are display:none', function() {
-            pages.items.forEach(function(p) {
-              assert.equal(getComputedStyle(p).display, p == pages.selectedItem ? 'block' : 'none');
-            });
-          });
-        });
-
-        suite('set selected attribute', function() {
-          setup(function () {
-            pages = fixture('basic');
-            pages.selected = 'page2';
-          });
-
-          test('selected value', function() {
-            assert.equal(pages.selected, 'page2');
-          });
-
-          test('selected item', function() {
-            assert.equal(pages.selectedItem, pages.items[2]);
-          });
-
-          test('selected item is display:block and all others are display:none', function() {
-            pages.items.forEach(function(p) {
-              assert.equal(getComputedStyle(p).display, p == pages.selectedItem ? 'block' : 'none');
-            });
-          });
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-pages/test/basic.html
deleted file mode 100644
index f031f8e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/test/basic.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-pages-basic</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../iron-pages.html">
-    
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <iron-pages>
-          <div id="page0">Page 0</div>
-          <div id="page1">Page 1</div>
-          <div id="page2">Page 2</div>
-          <div id="page3">Page 3</div>
-        </iron-pages>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('basic', function() {
-        var pages;
-
-        suite('defaults', function() {
-          setup(function () {
-            pages = fixture('basic');
-          });
-
-          test('to nothing selected', function() {
-            assert.equal(pages.selected, undefined);
-          });
-
-          test('null activateEvent', function() {
-            // `activateEvent` is not a useful feature for iron-pages and it can interfere
-            // with ux; ensure iron-pages has cleared any default `activateEvent`
-            assert.equal(pages.activateEvent, null);
-          });
-
-          test('to iron-selected as selectedClass', function() {
-            assert.equal(pages.selectedClass, 'iron-selected');
-          });
-
-          test('as many items as children', function() {
-            assert.equal(pages.items.length, 4);
-          });
-
-          test('all pages are display:none', function() {
-            pages.items.forEach(function(p) {
-              assert.equal(getComputedStyle(p).display, 'none');
-            });
-          });
-        });
-
-        suite('set the selected attribute', function() {
-          setup(function () {
-            pages = fixture('basic');
-            pages.selected = 0;
-          });
-
-          test('selected value', function() {
-            assert.equal(pages.selected, '0');
-          });
-
-          test('selected item', function() {
-            assert.equal(pages.selectedItem, pages.items[0]);
-          });
-
-          test('selected item is display:block and all others are display:none', function() {
-            pages.items.forEach(function(p) {
-              assert.equal(getComputedStyle(p).display, p == pages.selectedItem ? 'block' : 'none');
-            });
-          });
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-pages/test/index.html b/systrace/catapult/third_party/polymer/components/iron-pages/test/index.html
deleted file mode 100644
index 0cc658d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-pages/test/index.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <title>Tests</title>
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-
-      WCT.loadSuites([
-        'basic.html',
-        'attr-for-selected.html',
-        'basic.html?dom=shadow',
-        'attr-for-selected.html?dom=shadow'
-      ]);
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-range-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-range-behavior/README.md
deleted file mode 100644
index 9920269..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-range-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-range-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-range-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-range-behavior)_
-
-
-##Polymer.IronRangeBehavior
-
-`iron-range-behavior` provides the behavior for something with a minimum to maximum range.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-range-behavior/bower.json
deleted file mode 100644
index b4a9b77..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/bower.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name": "iron-range-behavior",
-  "version": "1.0.7",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Provides a behavior for something with a minimum and maximum value",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "behavior"
-  ],
-  "main": "iron-range-behavior.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-range-behavior.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-input": "PolymerElements/iron-input#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-range-behavior/demo/index.html
deleted file mode 100644
index a0afe84..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/demo/index.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!doctype html>
-<html>
-  <head>
-    <title>iron-range-behavior demo</title>
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../iron-range-behavior.html">
-    <link rel="import" href="../../iron-input/iron-input.html">
-
-    <style>
-
-      body {
-        font-family: sans-serif;
-      }
-
-    </style>
-  </head>
-
-  <body unresolved>
-
-    <dom-module id="x-progressbar">
-      <template>
-        <style>
-          :host {
-            display: block;
-            height: 40px;
-            background-color: #555;
-            border-radius: 4px;
-            padding: 8px;
-            box-shadow: inset 0px 2px 5px rgba(0, 0, 0, 0.5);
-          }
-
-          .progress {
-            background-color: #999;
-            height: 100%;
-            border-radius: 4px;
-            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);
-          }
-
-          .progress-value {
-            padding: 0 8px;
-            font-size: 18px;
-            color: #fff;
-          }
-        </style>
-
-        <div class="progress" horizontal center layout style$="{{_computeStyle(ratio)}}">
-          <div class="progress-value"><span>{{ratio}}</span>%</div>
-        </div>
-      </template>
-    </dom-module>
-
-    <script>
-      HTMLImports.whenReady(function() {
-        Polymer({
-          is: 'x-progressbar',
-
-          behaviors: [Polymer.IronRangeBehavior],
-
-          _computeStyle: function(ratio) {
-            return 'width: ' + ratio + '%;';
-          }
-        });
-      });
-    </script>
-
-    <x-progressbar min="0" max="200" value="120"></x-progressbar>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-range-behavior/index.html
deleted file mode 100644
index cc77788..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/iron-range-behavior.html b/systrace/catapult/third_party/polymer/components/iron-range-behavior/iron-range-behavior.html
deleted file mode 100644
index 96f3c15..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/iron-range-behavior.html
+++ /dev/null
@@ -1,121 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-
- /**
- * `iron-range-behavior` provides the behavior for something with a minimum to maximum range.
- *
- * @demo demo/index.html
- * @polymerBehavior
- */
- Polymer.IronRangeBehavior = {
-
-  properties: {
-
-    /**
-     * The number that represents the current value.
-     */
-    value: {
-      type: Number,
-      value: 0,
-      notify: true,
-      reflectToAttribute: true
-    },
-
-    /**
-     * The number that indicates the minimum value of the range.
-     */
-    min: {
-      type: Number,
-      value: 0,
-      notify: true
-    },
-
-    /**
-     * The number that indicates the maximum value of the range.
-     */
-    max: {
-      type: Number,
-      value: 100,
-      notify: true
-    },
-
-    /**
-     * Specifies the value granularity of the range's value.
-     */
-    step: {
-      type: Number,
-      value: 1,
-      notify: true
-    },
-
-    /**
-     * Returns the ratio of the value.
-     */
-    ratio: {
-      type: Number,
-      value: 0,
-      readOnly: true,
-      notify: true
-    },
-  },
-
-  observers: [
-    '_update(value, min, max, step)'
-  ],
-
-  _calcRatio: function(value) {
-    return (this._clampValue(value) - this.min) / (this.max - this.min);
-  },
-
-  _clampValue: function(value) {
-    return Math.min(this.max, Math.max(this.min, this._calcStep(value)));
-  },
-
-  _calcStep: function(value) {
-    // polymer/issues/2493
-    value = parseFloat(value);
-
-    if (!this.step) {
-      return value;
-    }
-
-    var numSteps = Math.round((value - this.min) / this.step);
-    if (this.step < 1) {
-     /**
-      * For small values of this.step, if we calculate the step using
-      * `Math.round(value / step) * step` we may hit a precision point issue
-      * eg. 0.1 * 0.2 =  0.020000000000000004
-      * http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
-      *
-      * as a work around we can divide by the reciprocal of `step`
-      */
-      return numSteps / (1 / this.step) + this.min;
-    } else {
-      return numSteps * this.step + this.min;
-    }
-  },
-
-  _validateValue: function() {
-    var v = this._clampValue(this.value);
-    this.value = this.oldValue = isNaN(v) ? this.oldValue : v;
-    return this.value !== v;
-  },
-
-  _update: function() {
-    this._validateValue();
-    this._setRatio(this._calcRatio(this.value) * 100);
-  }
-
-};
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/basic.html
deleted file mode 100644
index 9a7e41d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/basic.html
+++ /dev/null
@@ -1,180 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>iron-range-behavior</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="x-progressbar.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-</head>
-<body>
-
-  <test-fixture id="trivialRange">
-    <template>
-      <x-progressbar></x-progressbar>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('<x-progressbar>', function() {
-      var range;
-
-      setup(function() {
-        range = fixture('trivialRange');
-      });
-
-      test('check default', function() {
-        assert.equal(range.min, 0);
-        assert.equal(range.max, 100);
-        assert.equal(range.value, 0);
-      });
-
-      test('set value', function(done) {
-        range.value = 50;
-        flush(function() {
-          assert.equal(range.value, 50);
-          // test clamp value
-          range.value = 60.1;
-          flush(function() {
-            assert.equal(range.value, 60);
-            done();
-          });
-        });
-      });
-
-      test('set max', function(done) {
-        range.max = 10;
-        range.value = 11;
-        flush(function() {
-          assert.equal(range.value, range.max);
-          done();
-        });
-      });
-
-      test('test ratio', function(done) {
-        range.max = 10;
-        range.value = 5;
-        flush(function() {
-          assert.equal(range.ratio, 50);
-          done();
-        });
-      });
-
-      test('set min', function(done) {
-        range.min = 10
-        range.max = 50;
-        range.value = 30;
-        flush(function() {
-          assert.equal(range.ratio, 50);
-          range.value = 0;
-          flush(function() {
-            assert.equal(range.value, range.min);
-            done();
-          });
-        });
-      });
-
-      test('set step', function(done) {
-        range.min = 0;
-        range.max = 10;
-        range.value = 5.1;
-        flush(function() {
-          assert.equal(range.value, 5);
-          range.step = 0.1;
-          range.value = 5.1;
-          flush(function() {
-            assert.equal(range.value, 5.1);
-            done();
-          });
-        });
-      });
-
-      test('set large step', function(done) {
-        // PolymerElements/paper-slider#135
-        range.min = 0;
-        range.max = 2625;
-        range.step = 875;
-        range.value = 875;
-        flush(function() {
-          assert.equal(range.value, 875);
-          done();
-        });
-      });
-
-      test('set step with min', function(done) {
-        range.min = -0.9;
-        range.max = 1.1;
-        range.step = 0.5;
-        range.value = -0.5;
-        flush(function() {
-          assert.equal(range.value, -0.4);
-          range.value = 0.7;
-          flush(function() {
-            assert.equal(range.value, 0.6);
-            done();
-          });
-        });
-      });
-
-      test('odd values', function(done) {
-        range.min = 1;
-        range.max = 7;
-        range.step = 2;
-        range.value = 3;
-
-        flush(function() {
-          assert.equal(range.value, 3);
-
-          range.value += range.step;
-          assert.equal(range.value, 5);
-
-          range.value += range.step;
-          assert.equal(range.value, 7);
-          done();
-        });
-      });
-
-      test('negative values should round up', function(done) {
-        range.min = -10;
-        range.max = 10;
-        range.step = 0.1;
-        range.value = -8.4252;
-
-        flush(function() {
-          assert.equal(range.value, -8.4);
-          done();
-        });
-      });
-
-      test('positive values should round up', function(done) {
-        range.min = 10;
-        range.max = 100;
-        range.step = 0.25;
-        range.value = 19.34567;
-
-        flush(function() {
-          assert.equal(range.value, 19.25);
-          done();
-        });
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/index.html
deleted file mode 100644
index b66f1de..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'basic.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/x-progressbar.html b/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/x-progressbar.html
deleted file mode 100644
index 2f0db85..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-range-behavior/test/x-progressbar.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-range-behavior.html">
-
-<script>
-  Polymer({
-    is: 'x-progressbar',
-
-    behaviors: [Polymer.IronRangeBehavior]
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/README.md
deleted file mode 100644
index 2f37628..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-resizable-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-resizable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-resizable-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-resizable-behavior)_
-
-
-##Polymer.IronResizableBehavior
-
-`IronResizableBehavior` is a behavior that can be used in Polymer elements to
-coordinate the flow of resize events between "resizers" (elements that control the
-size or hidden state of their children) and "resizables" (elements that need to be
-notified when they are resized or un-hidden by their parents in order to take
-action on their new measurements).
-
-Elements that perform measurement should add the `IronResizableBehavior` behavior to
-their element definition and listen for the `iron-resize` event on themselves.
-This event will be fired when they become showing after having been hidden,
-when they are resized explicitly by another resizable, or when the window has been
-resized.
-
-Note, the `iron-resize` event is non-bubbling.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/bower.json
deleted file mode 100644
index 63b84a7..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/bower.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "iron-resizable-behavior",
-  "version": "1.0.6",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Coordinates the flow of resizeable elements",
-  "private": true,
-  "main": "iron-resizable-behavior.html",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "iron",
-    "behavior"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-resizable-behavior.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/demo/index.html
deleted file mode 100644
index 2896c50..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/demo/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-resizable-behavior demo</title>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="src/x-app.html">
-
-</head>
-<body>
-
-  <x-app></x-app>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/demo/src/x-app.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/demo/src/x-app.html
deleted file mode 100644
index c4bfa67..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/demo/src/x-app.html
+++ /dev/null
@@ -1,105 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../iron-resizable-behavior.html">
-
-<dom-module id="x-puck">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        border: 3px solid lightblue;
-      }
-    </style>
-
-    <b>I'm a resize-aware, thirdifying puck at (<span>{{x}}</span> x <span>{{y}}</span>).</b>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'x-puck',
-
-    behaviors: [
-      Polymer.IronResizableBehavior
-    ],
-
-    properties: {
-      x: {
-        type: Number,
-        value: 0
-      },
-
-      y: {
-        type: Number,
-        value: 0
-      }
-    },
-
-    listeners: {
-      'iron-resize': '_onIronResize'
-    },
-
-    attached: function() {
-      this.async(this.notifyResize, 1);
-    },
-
-    get parent() {
-      if (this.parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
-        return this.parentNode.host;
-      }
-
-      return this.parentNode;
-    },
-
-    _onIronResize: function() {
-      var x = this.x = Math.floor(this.parent.offsetWidth / 3);
-      var y = this.y = Math.floor(this.parent.offsetHeight / 3);
-
-      this.translate3d(x + 'px', y + 'px', 0);
-    }
-  });
-
-</script>
-
-<dom-module id="x-app">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: absolute;
-        top: 0;
-        right: 0;
-        bottom: 0;
-        left: 0;
-      }
-    </style>
-    <x-puck></x-puck>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'x-app',
-
-    behaviors: [
-      Polymer.IronResizableBehavior
-    ]
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/index.html
deleted file mode 100644
index b9b8809..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/index.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-resizable-behavior</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/iron-resizable-behavior.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/iron-resizable-behavior.html
deleted file mode 100644
index 42b6556..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/iron-resizable-behavior.html
+++ /dev/null
@@ -1,195 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-  /**
-   * `IronResizableBehavior` is a behavior that can be used in Polymer elements to
-   * coordinate the flow of resize events between "resizers" (elements that control the
-   * size or hidden state of their children) and "resizables" (elements that need to be
-   * notified when they are resized or un-hidden by their parents in order to take
-   * action on their new measurements).
-   *
-   * Elements that perform measurement should add the `IronResizableBehavior` behavior to
-   * their element definition and listen for the `iron-resize` event on themselves.
-   * This event will be fired when they become showing after having been hidden,
-   * when they are resized explicitly by another resizable, or when the window has been
-   * resized.
-   *
-   * Note, the `iron-resize` event is non-bubbling.
-   *
-   * @polymerBehavior Polymer.IronResizableBehavior
-   * @demo demo/index.html
-   **/
-  Polymer.IronResizableBehavior = {
-    properties: {
-      /**
-       * The closest ancestor element that implements `IronResizableBehavior`.
-       */
-      _parentResizable: {
-        type: Object,
-        observer: '_parentResizableChanged'
-      },
-
-      /**
-       * True if this element is currently notifying its descendant elements of
-       * resize.
-       */
-      _notifyingDescendant: {
-        type: Boolean,
-        value: false
-      }
-    },
-
-    listeners: {
-      'iron-request-resize-notifications': '_onIronRequestResizeNotifications'
-    },
-
-    created: function() {
-      // We don't really need property effects on these, and also we want them
-      // to be created before the `_parentResizable` observer fires:
-      this._interestedResizables = [];
-      this._boundNotifyResize = this.notifyResize.bind(this);
-    },
-
-    attached: function() {
-      this.fire('iron-request-resize-notifications', null, {
-        node: this,
-        bubbles: true,
-        cancelable: true
-      });
-
-      if (!this._parentResizable) {
-        window.addEventListener('resize', this._boundNotifyResize);
-        this.notifyResize();
-      }
-    },
-
-    detached: function() {
-      if (this._parentResizable) {
-        this._parentResizable.stopResizeNotificationsFor(this);
-      } else {
-        window.removeEventListener('resize', this._boundNotifyResize);
-      }
-
-      this._parentResizable = null;
-    },
-
-    /**
-     * Can be called to manually notify a resizable and its descendant
-     * resizables of a resize change.
-     */
-    notifyResize: function() {
-      if (!this.isAttached) {
-        return;
-      }
-
-      this._interestedResizables.forEach(function(resizable) {
-        if (this.resizerShouldNotify(resizable)) {
-          this._notifyDescendant(resizable);
-        }
-      }, this);
-
-      this._fireResize();
-    },
-
-    /**
-     * Used to assign the closest resizable ancestor to this resizable
-     * if the ancestor detects a request for notifications.
-     */
-    assignParentResizable: function(parentResizable) {
-      this._parentResizable = parentResizable;
-    },
-
-    /**
-     * Used to remove a resizable descendant from the list of descendants
-     * that should be notified of a resize change.
-     */
-    stopResizeNotificationsFor: function(target) {
-      var index = this._interestedResizables.indexOf(target);
-
-      if (index > -1) {
-        this._interestedResizables.splice(index, 1);
-        this.unlisten(target, 'iron-resize', '_onDescendantIronResize');
-      }
-    },
-
-    /**
-     * This method can be overridden to filter nested elements that should or
-     * should not be notified by the current element. Return true if an element
-     * should be notified, or false if it should not be notified.
-     *
-     * @param {HTMLElement} element A candidate descendant element that
-     * implements `IronResizableBehavior`.
-     * @return {boolean} True if the `element` should be notified of resize.
-     */
-    resizerShouldNotify: function(element) { return true; },
-
-    _onDescendantIronResize: function(event) {
-      if (this._notifyingDescendant) {
-        event.stopPropagation();
-        return;
-      }
-
-      // NOTE(cdata): In ShadowDOM, event retargeting makes echoing of the
-      // otherwise non-bubbling event "just work." We do it manually here for
-      // the case where Polymer is not using shadow roots for whatever reason:
-      if (!Polymer.Settings.useShadow) {
-        this._fireResize();
-      }
-    },
-
-    _fireResize: function() {
-      this.fire('iron-resize', null, {
-        node: this,
-        bubbles: false
-      });
-    },
-
-    _onIronRequestResizeNotifications: function(event) {
-      var target = event.path ? event.path[0] : event.target;
-
-      if (target === this) {
-        return;
-      }
-
-      if (this._interestedResizables.indexOf(target) === -1) {
-        this._interestedResizables.push(target);
-        this.listen(target, 'iron-resize', '_onDescendantIronResize');
-      }
-
-      target.assignParentResizable(this);
-      this._notifyDescendant(target);
-
-      event.stopPropagation();
-    },
-
-    _parentResizableChanged: function(parentResizable) {
-      if (parentResizable) {
-        window.removeEventListener('resize', this._boundNotifyResize);
-      }
-    },
-
-    _notifyDescendant: function(descendant) {
-      // NOTE(cdata): In IE10, attached is fired on children first, so it's
-      // important not to notify them if the parent is not attached yet (or
-      // else they will get redundantly notified when the parent attaches).
-      if (!this.isAttached) {
-        return;
-      }
-
-      this._notifyingDescendant = true;
-      descendant.notifyResize();
-      this._notifyingDescendant = false;
-    }
-  };
-</script>
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/basic.html
deleted file mode 100644
index d3183c0..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/basic.html
+++ /dev/null
@@ -1,223 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-resizable-behavior tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-resizable-behavior.html">
-  <link rel="import" href="test-elements.html">
-
-</head>
-<body>
-
-<!--
-
-Notes on Polyfill compatibility in tests:
-- Test elements loaded via imports, to ensure load order correctness
-  w.r.t. Polymer.mixin being availbale
-- Resize notifications and asserts are done asynchronously, since
-  there are timing differences w.r.t. when detached callbacks occur
-
--->
-
-  <test-fixture id="TestElement">
-    <template>
-      <test-element></test-element>
-    </template>
-  </test-fixture>
-
-
-  <script>
-
-  suite('iron-resizable-behavior', function() {
-    function ListenForResize(el, expectsResize) {
-      var listener = function(event) {
-        var target = event.path ? event.path[0] : event.target;
-        pendingNotifications--;
-      };
-
-      if (expectsResize !== false) {
-        pendingNotifications++;
-      }
-
-      el.addEventListener('iron-resize', listener);
-
-      return {
-        el: el,
-        remove: function() {
-          el.removeEventListener('iron-resize', listener);
-        }
-      };
-    }
-
-    function RemoveListeners(listeners) {
-      listeners.forEach(function(listener) {
-        listener.remove();
-      });
-    }
-
-    var pendingNotifications;
-    var testEl;
-
-    setup(function() {
-      pendingNotifications = 0;
-      testEl = fixture('TestElement');
-    });
-
-    suite('x-resizer-parent', function() {
-
-      test('notify resizables from window', function() {
-        var listeners = [
-          ListenForResize(testEl.$.parent),
-          ListenForResize(testEl.$.child1a),
-          ListenForResize(testEl.$.child1b),
-          ListenForResize(testEl.$.shadow1c.$.resizable),
-          ListenForResize(testEl.$.shadow1d.$.resizable)
-        ];
-
-        window.dispatchEvent(new CustomEvent('resize', { bubbles: false }));
-        expect(pendingNotifications).to.be.eql(0);
-
-        RemoveListeners(listeners);
-      });
-
-      test('notify resizables from parent', function() {
-        var listeners = [
-          ListenForResize(testEl.$.parent),
-          ListenForResize(testEl.$.child1a),
-          ListenForResize(testEl.$.child1b),
-          ListenForResize(testEl.$.shadow1c.$.resizable),
-          ListenForResize(testEl.$.shadow1d.$.resizable)
-        ];
-
-        testEl.$.parent.notifyResize();
-        expect(pendingNotifications).to.be.eql(0);
-        RemoveListeners(listeners);
-      });
-
-      test('detach resizables then notify parent', function() {
-        sinon.spy(testEl.$.child1a, 'notifyResize');
-        sinon.spy(testEl.$.shadow1c.$.resizable, 'notifyResize');
-        sinon.spy(testEl.$.child1b, 'notifyResize');
-        sinon.spy(testEl.$.shadow1d.$.resizable, 'notifyResize');
-
-        var firstElementToRemove = testEl.$.child1a;
-        var firstElementParent = Polymer.dom(firstElementToRemove).parentNode;
-        var secondElementToRemove = testEl.$.shadow1c.$.resizable;
-        var secondElementParent = Polymer.dom(secondElementToRemove).parentNode;
-
-        Polymer.dom(firstElementParent).removeChild(firstElementToRemove);
-        Polymer.dom(secondElementParent).removeChild(secondElementToRemove);
-
-        Polymer.dom.flush();
-
-        testEl.$.parent.notifyResize();
-
-        expect(testEl.$.child1a.notifyResize.callCount).to.be.equal(0);
-        expect(testEl.$.shadow1c.$.resizable.notifyResize.callCount).to.be.equal(0);
-        expect(testEl.$.child1b.notifyResize.callCount).to.be.equal(1);
-        expect(testEl.$.shadow1d.$.resizable.notifyResize.callCount).to.be.equal(1);
-      });
-
-      test('detach parent then notify window', function(done) {
-        var listeners = [
-          ListenForResize(testEl.$.parent, false),
-          ListenForResize(testEl.$.child1a, false),
-          ListenForResize(testEl.$.child1b, false),
-          ListenForResize(testEl.$.shadow1c.$.resizable, false),
-          ListenForResize(testEl.$.shadow1d.$.resizable, false)
-        ];
-
-        var el = Polymer.dom(testEl.root).querySelector('#parent');
-
-        el.parentNode.removeChild(el);
-
-        setTimeout(function() {
-          try {
-            window.dispatchEvent(new CustomEvent('resize', { bubbles: false }));
-            expect(pendingNotifications).to.be.eql(0);
-            RemoveListeners(listeners);
-            done();
-          } catch (e) {
-            done(e);
-          }
-        }, 0);
-      });
-
-    });
-
-    suite('x-resizer-parent-filtered', function() {
-
-      test('notify resizables from window', function() {
-        var listeners = [
-          ListenForResize(testEl.$.parentFiltered),
-          ListenForResize(testEl.$.child2a),
-          ListenForResize(testEl.$.child2b, false),
-          ListenForResize(testEl.$.shadow2c.$.resizable, false),
-          ListenForResize(testEl.$.shadow2d.$.resizable, false)
-        ];
-
-        testEl.$.parentFiltered.active = testEl.$.child2a;
-
-        window.dispatchEvent(new CustomEvent('resize', { bubbles: false }));
-        expect(pendingNotifications).to.be.eql(0);
-        RemoveListeners(listeners);
-      });
-
-      test('notify resizables from parent', function() {
-        var listeners = [
-          ListenForResize(testEl.$.parentFiltered),
-          ListenForResize(testEl.$.child2a),
-          ListenForResize(testEl.$.child2b, false),
-          ListenForResize(testEl.$.shadow2c.$.resizable, false),
-          ListenForResize(testEl.$.shadow2d.$.resizable, false)
-        ];
-
-        testEl.$.parentFiltered.active = testEl.$.child2a;
-
-        testEl.$.parentFiltered.notifyResize();
-        expect(pendingNotifications).to.be.eql(0);
-        RemoveListeners(listeners);
-      });
-
-      test('detach resizables then notify parent', function() {
-        var listeners = [
-          ListenForResize(testEl.$.parentFiltered),
-          ListenForResize(testEl.$.child2a, false),
-          ListenForResize(testEl.$.child2b, false),
-          ListenForResize(testEl.$.shadow2c.$.resizable, false),
-          ListenForResize(testEl.$.shadow2d.$.resizable)
-        ];
-
-        var el = Polymer.dom(testEl.root).querySelector('#child2a');
-        el.parentNode.removeChild(el);
-        el = Polymer.dom(testEl.root).querySelector('#shadow2c');
-        el.parentNode.removeChild(el);
-
-        testEl.$.parentFiltered.active = testEl.$.shadow2d.$.resizable;
-
-        testEl.$.parentFiltered.notifyResize();
-        expect(pendingNotifications).to.be.eql(0);
-        RemoveListeners(listeners);
-      });
-    });
-  });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/index.html
deleted file mode 100644
index fa83bf6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-  <meta charset="utf-8">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-
-</head>
-<body>
-
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'iron-resizable-behavior.html',
-      'basic.html?dom=shadow',
-      'iron-resizable-behavior.html?dom=shadow'
-    ]);
-  </script>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/iron-resizable-behavior.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/iron-resizable-behavior.html
deleted file mode 100644
index 9149004..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/iron-resizable-behavior.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-resizable-behavior tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-resizable-behavior.html">
-  <link rel="import" href="test-elements.html">
-
-</head>
-<body>
- 
-  <test-fixture id="ResizableAndShadowBoundaries">
-    <template>
-      <x-light-resizable></x-light-resizable>
-    </template>
-  </test-fixture>
-
-  <script>
-
-  suite('iron-resizable-behavior', function() {
-    var resizable;
-
-    suite('events across shadow boundaries', function() {
-      setup(function() {
-        resizable = fixture('ResizableAndShadowBoundaries');
-      });
-
-      suite('ancestor\'s iron-resize', function() {
-        test('only fires once for a notifying shadow descendent', function() {
-          resizable.$.childResizable1.notifyResize();
-
-          expect(resizable.ironResizeCount).to.be.equal(2);
-        });
-
-        test('only fires once when notifying descendent observables', function() {
-          resizable.notifyResize();
-
-          expect(resizable.ironResizeCount).to.be.equal(2);
-        });
-      });
-
-      suite('descendant\'s iron-resize', function() {
-        test('only fires once for a notifying shadow root', function() {
-          resizable.notifyResize();
-
-          expect(resizable.$.childResizable1.ironResizeCount).to.be.equal(2);
-          expect(resizable.$.childResizable2.ironResizeCount).to.be.equal(2);
-        });
-
-        test('only fires once for a notifying descendent observable', function() {
-          resizable.$.childResizable1.notifyResize();
-
-          expect(resizable.$.childResizable1.ironResizeCount).to.be.equal(2);
-        });
-      });
-
-      suite('window\'s resize', function() {
-        test('causes all iron-resize events to fire once', function() {
-          window.dispatchEvent(new CustomEvent('resize'));
-          Polymer.dom.flush();
-          expect(resizable.ironResizeCount).to.be.equal(2);
-          expect(resizable.$.childResizable1.ironResizeCount).to.be.equal(2);
-          expect(resizable.$.childResizable2.ironResizeCount).to.be.equal(2);
-        });
-      });
-    });
-
-  });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/test-elements.html b/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/test-elements.html
deleted file mode 100644
index 1ab8a9d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-resizable-behavior/test/test-elements.html
+++ /dev/null
@@ -1,194 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../iron-resizable-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'x-resizer-parent',
-
-    behaviors: [
-      Polymer.IronResizableBehavior
-    ],
-
-    listeners: {
-      'core-resize': 'resizeHandler'
-    },
-
-    resizeHandler: function() {
-    }
-
-  });
-
-</script>
-
-<script>
-
-  Polymer({
-
-    is: 'x-resizer-parent-filtered',
-
-    active: null,
-
-    behaviors: [
-      Polymer.IronResizableBehavior
-    ],
-
-    listeners: {
-      'core-resize': 'resizeHandler'
-    },
-
-    resizeHandler: function() {
-    },
-
-    resizerShouldNotify: function(el) {
-      return (el == this.active);
-    }
-
-  });
-
-</script>
-
-<script>
-
-  Polymer({
-
-    is: 'x-resizable',
-
-    behaviors: [
-      Polymer.IronResizableBehavior
-    ],
-
-    listeners: {
-      'core-resize': 'resizeHandler'
-    },
-
-    resizeHandler: function() {
-    }
-
-  });
-
-</script>
-
-<dom-module id="x-resizable-in-shadow">
-
-  <template>
-
-    <div>
-      <x-resizable id="resizable"></x-resizable>
-    </div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'x-resizable-in-shadow'
-
-  });
-
-</script>
-
-<dom-module id='test-element'>
-
-  <template>
-
-    <!-- Normal resizable parent with child resizables -->
-    <x-resizer-parent id="parent">
-      <x-resizable id="child1a"></x-resizable>
-      <div>
-        <x-resizable id="child1b"></x-resizable>
-      </div>
-      <x-resizable-in-shadow id="shadow1c"></x-resizable-in-shadow>
-      <div>
-        <x-resizable-in-shadow id="shadow1d"></x-resizable-in-shadow>
-      </div>
-    </x-resizer-parent>
-
-    <!-- Resizable parent using resizerShouldNotify, with child resizables -->
-    <x-resizer-parent-filtered id="parentFiltered">
-      <x-resizable id="child2a"></x-resizable>
-      <div>
-        <x-resizable id="child2b"></x-resizable>
-      </div>
-      <x-resizable-in-shadow id="shadow2c"></x-resizable-in-shadow>
-      <div>
-        <x-resizable-in-shadow id="shadow2d"></x-resizable-in-shadow>
-      </div>
-    </x-resizer-parent-filtered>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'test-element'
-
-  });
-
-</script>
-<script>
-  /** @polymerBehavior */
-  Polymer.ObserveIronResizeBehavior = {
-    properties: {
-      ironResizeCount: {
-        type: Number,
-        value: 0
-      }
-    },
-
-    listeners: {
-      'iron-resize': '_incrementIronResizeCount'
-    },
-
-    _incrementIronResizeCount: function() {
-      this.ironResizeCount++;
-    }
-  };
-</script>
-<dom-module id="x-shadow-resizable">
-  <template>
-    <div></div>
-  </template>
-</dom-module>
-<script>
-  Polymer({
-    is: 'x-shadow-resizable',
-
-    behaviors: [
-      Polymer.IronResizableBehavior,
-      Polymer.ObserveIronResizeBehavior
-    ]
-  });
-</script>
-
-<dom-module id="x-light-resizable">
-  <template>
-    <x-shadow-resizable id="childResizable1"></x-shadow-resizable>
-    <x-shadow-resizable id="childResizable2"></x-shadow-resizable>
-  </template>
-</dom-module>
-<script>
-  Polymer({
-    is: 'x-light-resizable',
-
-    behaviors: [
-      Polymer.IronResizableBehavior,
-      Polymer.ObserveIronResizeBehavior
-    ]
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-selector/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/README.md b/systrace/catapult/third_party/polymer/components/iron-selector/README.md
deleted file mode 100755
index 9d2ef31..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-multi-selectable.html  iron-selectable.html  iron-selector.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-selector.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-selector)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-selector)_
-
-
-##&lt;iron-selector&gt;
-
-  `iron-selector` is an element which can be used to manage a list of elements
-  that can be selected.  Tapping on the item will make the item selected.  The `selected` indicates
-  which item is being selected.  The default is to use the index of the item.
-
-  Example:
-
-```html
-  <iron-selector selected="0">
-    <div>Item 1</div>
-    <div>Item 2</div>
-    <div>Item 3</div>
-  </iron-selector>
-```
-
-  If you want to use the attribute value of an element for `selected` instead of the index,
-  set `attrForSelected` to the name of the attribute.  For example, if you want to select item by
-  `name`, set `attrForSelected` to `name`.
-
-  Example:
-
-```html
-  <iron-selector attr-for-selected="name" selected="foo">
-    <div name="foo">Foo</div>
-    <div name="bar">Bar</div>
-    <div name="zot">Zot</div>
-  </iron-selector>
-```
-
-  You can specify a default fallback with `fallbackSelection` in case the `selected` attribute does
-  not match the `attrForSelected` attribute of any elements.
-
-  Example:
-
-```html
-    <iron-selector attr-for-selected="name" selected="non-existing"
-                   fallback-selection="default">
-      <div name="foo">Foo</div>
-      <div name="bar">Bar</div>
-      <div name="default">Default</div>
-    </iron-selector>
-```
-
-  Note: When the selector is multi, the selection will set to `fallbackSelection` iff
-  the number of matching elements is zero.
-
-  `iron-selector` is not styled. Use the `iron-selected` CSS class to style the selected element.
-
-  Example:
-
-```html
-  <style>
-    .iron-selected {
-      background: #eee;
-    }
-  </style>
-
-  ...
-
-  <iron-selector selected="0">
-    <div>Item 1</div>
-    <div>Item 2</div>
-    <div>Item 3</div>
-  </iron-selector>
-```
-
-
-
-<!-- No docs for Polymer.IronMultiSelectableBehavior found. -->
-
-<!-- No docs for Polymer.IronSelectableBehavior found. -->
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/bower.json b/systrace/catapult/third_party/polymer/components/iron-selector/bower.json
deleted file mode 100755
index 36295dc..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/bower.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "iron-selector",
-  "version": "1.5.3",
-  "description": "Manages a set of elements that can be selected",
-  "private": true,
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "main": [
-    "iron-selector.html",
-    "iron-multi-selectable.html",
-    "iron-selectable.html",
-    "iron-selection.html"
-  ],
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "selector"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-selector.git"
-  },
-  "homepage": "https://github.com/PolymerElements/iron-selector",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.2.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.4",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-selector/demo/index.html
deleted file mode 100644
index 66724a1..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/demo/index.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>iron-selector</title>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../paper-styles/demo-pages.html">
-    <link rel="import" href="../iron-selector.html">
-
-    <style is="custom-style">
-
-      iron-selector > * {
-        padding: 8px;
-      }
-
-      .horizontal-section {
-        padding: 0;
-      }
-
-      .iron-selected {
-        background-color: var(--google-blue-500);
-        color: white;
-      }
-
-    </style>
-
-  </head>
-  <body unresolved>
-
-    <div class="horizontal center-justified layout">
-      <div>
-        <h3>Basic</h3>
-        <div class="horizontal-section">
-          <iron-selector selected="0">
-            <div>Item 0</div>
-            <div>Item 1</div>
-            <div>Item 2</div>
-            <div>Item 3</div>
-            <div>Item 4</div>
-          </iron-selector>
-        </div>
-      </div>
-
-      <div>
-        <h3>Multi-select</h3>
-        <div class="horizontal-section">
-          <iron-selector multi selected-values='[0,2]'>
-            <div>Item 0</div>
-            <div>Item 1</div>
-            <div>Item 2</div>
-            <div>Item 3</div>
-            <div>Item 4</div>
-          </iron-selector>
-        </div>
-      </div>
-
-      <div>
-        <h3>Example with attr-for-selected</h3>
-        <div class="horizontal-section">
-          <iron-selector selected="foo" attr-for-selected="name">
-            <div name="foo">Foo</div>
-            <div name="bar">Bar</div>
-            <div name="baz">Baz</div>
-            <div name="qux">Qux</div>
-            <div name="quux">Quux</div>
-          </iron-selector>
-        </div>
-      </div>
-
-      <div>
-        <h3>Example with fallback-selection</h3>
-        <div class="horizontal-section">
-          <iron-selector selected="non-existing" attr-for-selected="name" fallback-selection="default">
-            <div name="foo">Foo</div>
-            <div name="bar">Bar</div>
-            <div name="baz">Baz</div>
-            <div name="qux">Qux</div>
-            <div name="quux">Quux</div>
-            <div name="default">Default</div>
-          </iron-selector>
-        </div>
-      </div>
-    </div>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/index.html b/systrace/catapult/third_party/polymer/components/iron-selector/index.html
deleted file mode 100644
index a27840b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>

-<!--

-@license

-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.

-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt

-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt

-Code distributed by Google as part of the polymer project is also

-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt

--->

-

-<html>

-<head>

-

-  <title>iron-selector</title>

-  <meta charset="utf-8">

-  <meta name="viewport" content="width=device-width, initial-scale=1.0">

-

-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>

-  <link rel="import" href="../iron-component-page/iron-component-page.html">

-

-</head>

-<body>

-

-  <iron-component-page></iron-component-page>

-

-</body>

-</html>

diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/iron-multi-selectable.html b/systrace/catapult/third_party/polymer/components/iron-selector/iron-multi-selectable.html
deleted file mode 100644
index 9993151..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/iron-multi-selectable.html
+++ /dev/null
@@ -1,154 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="iron-selectable.html">
-
-<script>
-  /** @polymerBehavior Polymer.IronMultiSelectableBehavior */
-  Polymer.IronMultiSelectableBehaviorImpl = {
-    properties: {
-
-      /**
-       * If true, multiple selections are allowed.
-       */
-      multi: {
-        type: Boolean,
-        value: false,
-        observer: 'multiChanged'
-      },
-
-      /**
-       * Gets or sets the selected elements. This is used instead of `selected` when `multi`
-       * is true.
-       */
-      selectedValues: {
-        type: Array,
-        notify: true
-      },
-
-      /**
-       * Returns an array of currently selected items.
-       */
-      selectedItems: {
-        type: Array,
-        readOnly: true,
-        notify: true
-      },
-
-    },
-
-    observers: [
-      '_updateSelected(selectedValues.splices)'
-    ],
-
-    /**
-     * Selects the given value. If the `multi` property is true, then the selected state of the
-     * `value` will be toggled; otherwise the `value` will be selected.
-     *
-     * @method select
-     * @param {string|number} value the value to select.
-     */
-    select: function(value) {
-      if (this.multi) {
-        if (this.selectedValues) {
-          this._toggleSelected(value);
-        } else {
-          this.selectedValues = [value];
-        }
-      } else {
-        this.selected = value;
-      }
-    },
-
-    multiChanged: function(multi) {
-      this._selection.multi = multi;
-    },
-
-    get _shouldUpdateSelection() {
-      return this.selected != null ||
-        (this.selectedValues != null && this.selectedValues.length);
-    },
-
-    _updateAttrForSelected: function() {
-      if (!this.multi) {
-        Polymer.IronSelectableBehavior._updateAttrForSelected.apply(this);
-      } else if (this._shouldUpdateSelection) {
-        this.selectedValues = this.selectedItems.map(function(selectedItem) {
-          return this._indexToValue(this.indexOf(selectedItem));
-        }, this).filter(function(unfilteredValue) {
-          return unfilteredValue != null;
-        }, this);
-      }
-    },
-
-    _updateSelected: function() {
-      if (this.multi) {
-        this._selectMulti(this.selectedValues);
-      } else {
-        this._selectSelected(this.selected);
-      }
-    },
-
-    _selectMulti: function(values) {
-      if (values) {
-        var selectedItems = this._valuesToItems(values);
-        // clear all but the current selected items
-        this._selection.clear(selectedItems);
-        // select only those not selected yet
-        for (var i = 0; i < selectedItems.length; i++) {
-          this._selection.setItemSelected(selectedItems[i], true);
-        }
-        // Check for items, since this array is populated only when attached
-        if (this.fallbackSelection && this.items.length && !this._selection.get().length) {
-          var fallback = this._valueToItem(this.fallbackSelection);
-          if (fallback) {
-            this.selectedValues = [this.fallbackSelection];
-          }
-        }
-      } else {
-        this._selection.clear();
-      }
-    },
-
-    _selectionChange: function() {
-      var s = this._selection.get();
-      if (this.multi) {
-        this._setSelectedItems(s);
-      } else {
-        this._setSelectedItems([s]);
-        this._setSelectedItem(s);
-      }
-    },
-
-    _toggleSelected: function(value) {
-      var i = this.selectedValues.indexOf(value);
-      var unselected = i < 0;
-      if (unselected) {
-        this.push('selectedValues',value);
-      } else {
-        this.splice('selectedValues',i,1);
-      }
-    },
-
-    _valuesToItems: function(values) {
-      return (values == null) ? null : values.map(function(value) {
-        return this._valueToItem(value);
-      }, this);
-    }
-  };
-
-  /** @polymerBehavior */
-  Polymer.IronMultiSelectableBehavior = [
-    Polymer.IronSelectableBehavior,
-    Polymer.IronMultiSelectableBehaviorImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/iron-selectable.html b/systrace/catapult/third_party/polymer/components/iron-selector/iron-selectable.html
deleted file mode 100644
index 25cfe91..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/iron-selectable.html
+++ /dev/null
@@ -1,388 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="iron-selection.html">
-
-<script>
-
-  /** @polymerBehavior */
-  Polymer.IronSelectableBehavior = {
-
-      /**
-       * Fired when iron-selector is activated (selected or deselected).
-       * It is fired before the selected items are changed.
-       * Cancel the event to abort selection.
-       *
-       * @event iron-activate
-       */
-
-      /**
-       * Fired when an item is selected
-       *
-       * @event iron-select
-       */
-
-      /**
-       * Fired when an item is deselected
-       *
-       * @event iron-deselect
-       */
-
-      /**
-       * Fired when the list of selectable items changes (e.g., items are
-       * added or removed). The detail of the event is a mutation record that
-       * describes what changed.
-       *
-       * @event iron-items-changed
-       */
-
-    properties: {
-
-      /**
-       * If you want to use an attribute value or property of an element for
-       * `selected` instead of the index, set this to the name of the attribute
-       * or property. Hyphenated values are converted to camel case when used to
-       * look up the property of a selectable element. Camel cased values are
-       * *not* converted to hyphenated values for attribute lookup. It's
-       * recommended that you provide the hyphenated form of the name so that
-       * selection works in both cases. (Use `attr-or-property-name` instead of
-       * `attrOrPropertyName`.)
-       */
-      attrForSelected: {
-        type: String,
-        value: null
-      },
-
-      /**
-       * Gets or sets the selected element. The default is to use the index of the item.
-       * @type {string|number}
-       */
-      selected: {
-        type: String,
-        notify: true
-      },
-
-      /**
-       * Returns the currently selected item.
-       *
-       * @type {?Object}
-       */
-      selectedItem: {
-        type: Object,
-        readOnly: true,
-        notify: true
-      },
-
-      /**
-       * The event that fires from items when they are selected. Selectable
-       * will listen for this event from items and update the selection state.
-       * Set to empty string to listen to no events.
-       */
-      activateEvent: {
-        type: String,
-        value: 'tap',
-        observer: '_activateEventChanged'
-      },
-
-      /**
-       * This is a CSS selector string.  If this is set, only items that match the CSS selector
-       * are selectable.
-       */
-      selectable: String,
-
-      /**
-       * The class to set on elements when selected.
-       */
-      selectedClass: {
-        type: String,
-        value: 'iron-selected'
-      },
-
-      /**
-       * The attribute to set on elements when selected.
-       */
-      selectedAttribute: {
-        type: String,
-        value: null
-      },
-
-      /**
-       * Default fallback if the selection based on selected with `attrForSelected`
-       * is not found.
-       */
-      fallbackSelection: {
-        type: String,
-        value: null
-      },
-
-      /**
-       * The list of items from which a selection can be made.
-       */
-      items: {
-        type: Array,
-        readOnly: true,
-        notify: true,
-        value: function() {
-          return [];
-        }
-      },
-
-      /**
-       * The set of excluded elements where the key is the `localName`
-       * of the element that will be ignored from the item list.
-       *
-       * @default {template: 1}
-       */
-      _excludedLocalNames: {
-        type: Object,
-        value: function() {
-          return {
-            'template': 1
-          };
-        }
-      }
-    },
-
-    observers: [
-      '_updateAttrForSelected(attrForSelected)',
-      '_updateSelected(selected)',
-      '_checkFallback(fallbackSelection)'
-    ],
-
-    created: function() {
-      this._bindFilterItem = this._filterItem.bind(this);
-      this._selection = new Polymer.IronSelection(this._applySelection.bind(this));
-    },
-
-    attached: function() {
-      this._observer = this._observeItems(this);
-      this._updateItems();
-      if (!this._shouldUpdateSelection) {
-        this._updateSelected();
-      }
-      this._addListener(this.activateEvent);
-    },
-
-    detached: function() {
-      if (this._observer) {
-        Polymer.dom(this).unobserveNodes(this._observer);
-      }
-      this._removeListener(this.activateEvent);
-    },
-
-    /**
-     * Returns the index of the given item.
-     *
-     * @method indexOf
-     * @param {Object} item
-     * @returns Returns the index of the item
-     */
-    indexOf: function(item) {
-      return this.items.indexOf(item);
-    },
-
-    /**
-     * Selects the given value.
-     *
-     * @method select
-     * @param {string|number} value the value to select.
-     */
-    select: function(value) {
-      this.selected = value;
-    },
-
-    /**
-     * Selects the previous item.
-     *
-     * @method selectPrevious
-     */
-    selectPrevious: function() {
-      var length = this.items.length;
-      var index = (Number(this._valueToIndex(this.selected)) - 1 + length) % length;
-      this.selected = this._indexToValue(index);
-    },
-
-    /**
-     * Selects the next item.
-     *
-     * @method selectNext
-     */
-    selectNext: function() {
-      var index = (Number(this._valueToIndex(this.selected)) + 1) % this.items.length;
-      this.selected = this._indexToValue(index);
-    },
-
-    /**
-     * Selects the item at the given index.
-     *
-     * @method selectIndex
-     */
-    selectIndex: function(index) {
-      this.select(this._indexToValue(index));
-    },
-
-    /**
-     * Force a synchronous update of the `items` property.
-     *
-     * NOTE: Consider listening for the `iron-items-changed` event to respond to
-     * updates to the set of selectable items after updates to the DOM list and
-     * selection state have been made.
-     *
-     * WARNING: If you are using this method, you should probably consider an
-     * alternate approach. Synchronously querying for items is potentially
-     * slow for many use cases. The `items` property will update asynchronously
-     * on its own to reflect selectable items in the DOM.
-     */
-    forceSynchronousItemUpdate: function() {
-      this._updateItems();
-    },
-
-    get _shouldUpdateSelection() {
-      return this.selected != null;
-    },
-
-    _checkFallback: function() {
-      if (this._shouldUpdateSelection) {
-        this._updateSelected();
-      }
-    },
-
-    _addListener: function(eventName) {
-      this.listen(this, eventName, '_activateHandler');
-    },
-
-    _removeListener: function(eventName) {
-      this.unlisten(this, eventName, '_activateHandler');
-    },
-
-    _activateEventChanged: function(eventName, old) {
-      this._removeListener(old);
-      this._addListener(eventName);
-    },
-
-    _updateItems: function() {
-      var nodes = Polymer.dom(this).queryDistributedElements(this.selectable || '*');
-      nodes = Array.prototype.filter.call(nodes, this._bindFilterItem);
-      this._setItems(nodes);
-    },
-
-    _updateAttrForSelected: function() {
-      if (this._shouldUpdateSelection) {
-        this.selected = this._indexToValue(this.indexOf(this.selectedItem));
-      }
-    },
-
-    _updateSelected: function() {
-      this._selectSelected(this.selected);
-    },
-
-    _selectSelected: function(selected) {
-      this._selection.select(this._valueToItem(this.selected));
-      // Check for items, since this array is populated only when attached
-      // Since Number(0) is falsy, explicitly check for undefined
-      if (this.fallbackSelection && this.items.length && (this._selection.get() === undefined)) {
-        this.selected = this.fallbackSelection;
-      }
-    },
-
-    _filterItem: function(node) {
-      return !this._excludedLocalNames[node.localName];
-    },
-
-    _valueToItem: function(value) {
-      return (value == null) ? null : this.items[this._valueToIndex(value)];
-    },
-
-    _valueToIndex: function(value) {
-      if (this.attrForSelected) {
-        for (var i = 0, item; item = this.items[i]; i++) {
-          if (this._valueForItem(item) == value) {
-            return i;
-          }
-        }
-      } else {
-        return Number(value);
-      }
-    },
-
-    _indexToValue: function(index) {
-      if (this.attrForSelected) {
-        var item = this.items[index];
-        if (item) {
-          return this._valueForItem(item);
-        }
-      } else {
-        return index;
-      }
-    },
-
-    _valueForItem: function(item) {
-      var propValue = item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];
-      return propValue != undefined ? propValue : item.getAttribute(this.attrForSelected);
-    },
-
-    _applySelection: function(item, isSelected) {
-      if (this.selectedClass) {
-        this.toggleClass(this.selectedClass, isSelected, item);
-      }
-      if (this.selectedAttribute) {
-        this.toggleAttribute(this.selectedAttribute, isSelected, item);
-      }
-      this._selectionChange();
-      this.fire('iron-' + (isSelected ? 'select' : 'deselect'), {item: item});
-    },
-
-    _selectionChange: function() {
-      this._setSelectedItem(this._selection.get());
-    },
-
-    // observe items change under the given node.
-    _observeItems: function(node) {
-      return Polymer.dom(node).observeNodes(function(mutation) {
-        this._updateItems();
-
-        if (this._shouldUpdateSelection) {
-          this._updateSelected();
-        }
-
-        // Let other interested parties know about the change so that
-        // we don't have to recreate mutation observers everywhere.
-        this.fire('iron-items-changed', mutation, {
-          bubbles: false,
-          cancelable: false
-        });
-      });
-    },
-
-    _activateHandler: function(e) {
-      var t = e.target;
-      var items = this.items;
-      while (t && t != this) {
-        var i = items.indexOf(t);
-        if (i >= 0) {
-          var value = this._indexToValue(i);
-          this._itemActivate(value, t);
-          return;
-        }
-        t = t.parentNode;
-      }
-    },
-
-    _itemActivate: function(value, item) {
-      if (!this.fire('iron-activate',
-          {selected: value, item: item}, {cancelable: true}).defaultPrevented) {
-        this.select(value);
-      }
-    }
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/iron-selection.html b/systrace/catapult/third_party/polymer/components/iron-selector/iron-selection.html
deleted file mode 100644
index 408ccae..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/iron-selection.html
+++ /dev/null
@@ -1,119 +0,0 @@
-
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-
-  /**
-   * @param {!Function} selectCallback
-   * @constructor
-   */
-  Polymer.IronSelection = function(selectCallback) {
-    this.selection = [];
-    this.selectCallback = selectCallback;
-  };
-
-  Polymer.IronSelection.prototype = {
-
-    /**
-     * Retrieves the selected item(s).
-     *
-     * @method get
-     * @returns Returns the selected item(s). If the multi property is true,
-     * `get` will return an array, otherwise it will return
-     * the selected item or undefined if there is no selection.
-     */
-    get: function() {
-      return this.multi ? this.selection.slice() : this.selection[0];
-    },
-
-    /**
-     * Clears all the selection except the ones indicated.
-     *
-     * @method clear
-     * @param {Array} excludes items to be excluded.
-     */
-    clear: function(excludes) {
-      this.selection.slice().forEach(function(item) {
-        if (!excludes || excludes.indexOf(item) < 0) {
-          this.setItemSelected(item, false);
-        }
-      }, this);
-    },
-
-    /**
-     * Indicates if a given item is selected.
-     *
-     * @method isSelected
-     * @param {*} item The item whose selection state should be checked.
-     * @returns Returns true if `item` is selected.
-     */
-    isSelected: function(item) {
-      return this.selection.indexOf(item) >= 0;
-    },
-
-    /**
-     * Sets the selection state for a given item to either selected or deselected.
-     *
-     * @method setItemSelected
-     * @param {*} item The item to select.
-     * @param {boolean} isSelected True for selected, false for deselected.
-     */
-    setItemSelected: function(item, isSelected) {
-      if (item != null) {
-        if (isSelected !== this.isSelected(item)) {
-          // proceed to update selection only if requested state differs from current
-          if (isSelected) {
-            this.selection.push(item);
-          } else {
-            var i = this.selection.indexOf(item);
-            if (i >= 0) {
-              this.selection.splice(i, 1);
-            }
-          }
-          if (this.selectCallback) {
-            this.selectCallback(item, isSelected);
-          }
-        }
-      }
-    },
-
-    /**
-     * Sets the selection state for a given item. If the `multi` property
-     * is true, then the selected state of `item` will be toggled; otherwise
-     * the `item` will be selected.
-     *
-     * @method select
-     * @param {*} item The item to select.
-     */
-    select: function(item) {
-      if (this.multi) {
-        this.toggle(item);
-      } else if (this.get() !== item) {
-        this.setItemSelected(this.get(), false);
-        this.setItemSelected(item, true);
-      }
-    },
-
-    /**
-     * Toggles the selection state for `item`.
-     *
-     * @method toggle
-     * @param {*} item The item to toggle.
-     */
-    toggle: function(item) {
-      this.setItemSelected(item, !this.isSelected(item));
-    }
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/iron-selector.html b/systrace/catapult/third_party/polymer/components/iron-selector/iron-selector.html
deleted file mode 100644
index 0ecc9fb..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/iron-selector.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="iron-multi-selectable.html">
-
-<script>
-  /**
-  `iron-selector` is an element which can be used to manage a list of elements
-  that can be selected.  Tapping on the item will make the item selected.  The `selected` indicates
-  which item is being selected.  The default is to use the index of the item.
-
-  Example:
-
-      <iron-selector selected="0">
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <div>Item 3</div>
-      </iron-selector>
-
-  If you want to use the attribute value of an element for `selected` instead of the index,
-  set `attrForSelected` to the name of the attribute.  For example, if you want to select item by
-  `name`, set `attrForSelected` to `name`.
-
-  Example:
-
-      <iron-selector attr-for-selected="name" selected="foo">
-        <div name="foo">Foo</div>
-        <div name="bar">Bar</div>
-        <div name="zot">Zot</div>
-      </iron-selector>
-
-  You can specify a default fallback with `fallbackSelection` in case the `selected` attribute does
-  not match the `attrForSelected` attribute of any elements.
-
-  Example:
-
-        <iron-selector attr-for-selected="name" selected="non-existing"
-                       fallback-selection="default">
-          <div name="foo">Foo</div>
-          <div name="bar">Bar</div>
-          <div name="default">Default</div>
-        </iron-selector>
-
-  Note: When the selector is multi, the selection will set to `fallbackSelection` iff
-  the number of matching elements is zero.
-
-  `iron-selector` is not styled. Use the `iron-selected` CSS class to style the selected element.
-
-  Example:
-
-      <style>
-        .iron-selected {
-          background: #eee;
-        }
-      </style>
-
-      ...
-
-      <iron-selector selected="0">
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <div>Item 3</div>
-      </iron-selector>
-
-  @demo demo/index.html
-  */
-
-  Polymer({
-
-    is: 'iron-selector',
-
-    behaviors: [
-      Polymer.IronMultiSelectableBehavior
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/activate-event.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/activate-event.html
deleted file mode 100644
index 40aa4fd..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/activate-event.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-activate-event</title>
-  <meta charset="UTF-8">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-fixture id="test">
-    <template>
-      <iron-selector id="selector" selected="0">
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <div>Item 3</div>
-        <div>Item 4</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('activate event', function() {
-
-      var s;
-
-      setup(function () {
-        s = fixture('test');
-      });
-
-      test('activates on tap', function() {
-        assert.equal(s.selected, '0');
-
-        // select Item 1
-        s.children[1].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-        assert.equal(s.selected, '1');
-      });
-
-      test('activates on tap and fires iron-activate', function(done) {
-        assert.equal(s.selected, '0');
-
-        // attach iron-activate listener
-        s.addEventListener("iron-activate", function(event) {
-          assert.equal(event.detail.selected, '1');
-          assert.equal(event.detail.item, s.children[1]);
-          done();
-        });
-
-        // select Item 1
-        s.children[1].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-      });
-
-      test('tap on already selected and fires iron-activate', function(done) {
-        assert.equal(s.selected, '0');
-
-        // attach iron-activate listener
-        s.addEventListener("iron-activate", function(event) {
-          assert.equal(event.detail.selected, '0');
-          assert.equal(event.detail.item, s.children[0]);
-          done();
-        });
-
-        // select Item 0
-        s.children[0].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-      });
-
-      test('activates on mousedown', function() {
-        // set activateEvent to mousedown
-        s.activateEvent = 'mousedown';
-        // select Item 2
-        s.children[2].dispatchEvent(new CustomEvent('mousedown', {bubbles: true}));
-        assert.equal(s.selected, '2');
-      });
-
-      test('activates on mousedown and fires iron-activate', function(done) {
-        // attach iron-activate listener
-        s.addEventListener("iron-activate", function(event) {
-          assert.equal(event.detail.selected, '2');
-          assert.equal(event.detail.item, s.children[2]);
-          done();
-        });
-
-        // set activateEvent to mousedown
-        s.activateEvent = 'mousedown';
-        // select Item 2
-        s.children[2].dispatchEvent(new CustomEvent('mousedown', {bubbles: true}));
-      });
-
-      test('no activation', function() {
-        assert.equal(s.selected, '0');
-        // set activateEvent to null
-        s.activateEvent = null;
-        // select Item 2
-        s.children[2].dispatchEvent(new CustomEvent('mousedown', {bubbles: true}));
-        assert.equal(s.selected, '0');
-      });
-
-      test('activates on tap and preventDefault', function() {
-        // attach iron-activate listener
-        s.addEventListener("iron-activate", function(event) {
-          event.preventDefault();
-        });
-        // select Item 2
-        s.children[2].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-        // shouldn't got selected since we preventDefault in iron-activate
-        assert.equal(s.selected, '0');
-      });
-
-      test('activates after detach and re-attach', function() {
-        // Detach and re-attach
-        var parent = s.parentNode;
-        parent.removeChild(s);
-        parent.appendChild(s);
-        
-        // select Item 2
-        s.children[2].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-        assert.equal(s.selected, '2');
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/attr-for-selected-elements.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/attr-for-selected-elements.html
deleted file mode 100644
index d9e4c4f..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/attr-for-selected-elements.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<dom-module id="attr-reflector">
-  <template>
-    <div>{{someAttr}}</div>
-  </template>
-  <script>
-    Polymer({
-      is: 'attr-reflector',
-
-      properties: {
-        someAttr: {
-          type: String,
-          value: "",
-          reflectToAttribute: true
-        }
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/attr-for-selected.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/attr-for-selected.html
deleted file mode 100644
index cc0dd14..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/attr-for-selected.html
+++ /dev/null
@@ -1,229 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector attr-for-selected</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-
-  <link rel="import" href="../iron-selector.html">
-  <link rel="import" href="attr-for-selected-elements.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-
-    .my-selected {
-      background: red;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-fixture id="inlineAttributes">
-    <template>
-      <iron-selector attr-for-selected="some-attr">
-        <div some-attr="value0">Item 0</div>
-        <div some-attr="value1">Item 1</div>
-        <div some-attr="value2">Item 2</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="reflectedProperties">
-    <template>
-      <iron-selector attr-for-selected="some-attr">
-        <attr-reflector>Item 0</attr-reflector>
-        <attr-reflector>Item 1</attr-reflector>
-        <attr-reflector>Item 2</attr-reflector>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="mixedPropertiesAndAttributes">
-    <template>
-      <iron-selector attr-for-selected="some-attr">
-        <attr-reflector>Item 0</attr-reflector>
-        <attr-reflector>Item 1</attr-reflector>
-        <div some-attr="value2">Item 2</div>
-        <div some-attr="value3">Item 3</div>
-        <attr-reflector>Item 4</attr-reflector>
-        <div some-attr="value5">Item 5</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="defaultAttribute">
-    <template>
-      <iron-selector attr-for-selected="some-attr" fallback-selection="default">
-        <div some-attr="value0">Item 0</div>
-        <div some-attr="value1">Item 1</div>
-        <div some-attr="default">Item 2</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('inline attributes', function() {
-      var selector;
-      var items;
-
-      setup(function () {
-        selector = fixture('inlineAttributes');
-        items = Array.prototype.slice.apply(selector.querySelectorAll('div[some-attr]'));
-      });
-
-      test('selecting value programatically selects correct item', function() {
-        selector.select('value1');
-        assert.equal(selector.selectedItem, items[1]);
-      });
-
-      test('selecting item sets the correct selected value', function(done) {
-        MockInteractions.downAndUp(items[2], function() {
-          assert.equal(selector.selected, 'value2');
-          done();
-        });
-      });
-    });
-
-    suite('reflected properties as attributes', function() {
-      var selector;
-      var items;
-
-      setup(function () {
-        selector = fixture('reflectedProperties');
-        items = Array.prototype.slice.apply(selector.querySelectorAll('attr-reflector'));
-        for (var i = 0; i < items.length; i++) {
-          items[i].someAttr = "value" + i;
-        }
-      });
-
-      test('selecting value programatically selects correct item', function() {
-        selector.select('value1');
-        assert.equal(selector.selectedItem, items[1]);
-      });
-
-      test('selecting item sets the correct selected value', function(done) {
-        MockInteractions.downAndUp(items[2], function() {
-          assert.equal(selector.selected, 'value2');
-          done();
-        });
-      });
-    });
-
-    suite('mixed properties and inline attributes', function() {
-      var selector;
-      var items;
-
-      setup(function () {
-        selector = fixture('mixedPropertiesAndAttributes');
-        items = Array.prototype.slice.apply(selector.querySelectorAll('attr-reflector, div[some-attr]'));
-        for (var i = 0; i < items.length; i++) {
-          items[i].someAttr = "value" + i;
-        }
-      });
-
-      test('selecting value programatically selects correct item', function() {
-        for (var i = 0; i < items.length; i++) {
-          selector.select('value' + i);
-          assert.equal(selector.selectedItem, items[i]);
-        }
-      });
-
-      test('selecting item sets the correct selected value', function(done) {
-        var i = 0;
-
-        function testSelectItem(i) {
-          if (i >= items.length) {
-            done();
-            return;
-          }
-
-          MockInteractions.downAndUp(items[i], function() {
-            assert.equal(selector.selected, 'value' + i);
-
-            testSelectItem(i + 1);
-          });
-        }
-
-        testSelectItem(i);
-      });
-    });
-
-    suite('default attribute', function() {
-      var selector;
-      var items;
-
-      setup(function () {
-        selector = fixture('defaultAttribute');
-        items = Array.prototype.slice.apply(selector.querySelectorAll('div[some-attr]'));
-      });
-
-      test('setting non-existing value sets default', function() {
-        selector.select('non-existing-value');
-        assert.equal(selector.selected, 'default');
-        assert.equal(selector.selectedItem, items[2]);
-      });
-
-      test('setting non-existing value sets default', function() {
-        selector.multi = true;
-        selector.select(['non-existing-value']);
-        assert.deepEqual(selector.selectedValues, ['default']);
-        assert.deepEqual(selector.selectedItems, [items[2]]);
-      });
-
-      test('default not used when there was at least one match', function() {
-        selector.multi = true;
-        selector.selectedValues = ['non-existing-value', 'value0'];
-        assert.deepEqual(selector.selectedValues, ['non-existing-value', 'value0']);
-        assert.deepEqual(selector.selectedItems, [items[0]]);
-      });
-
-      test('default element not found does not result in infinite loop', function() {
-        selector.fallbackSelection = 'non-existing-fallback';
-        selector.select('non-existing-value');
-        assert.equal(selector.selectedItem, undefined);
-        selector.multi = true;
-        selector.selectedValues = ['non-existing-value'];
-        assert.deepEqual(selector.selectedItems, [undefined]);
-        selector.fallbackSelection = 'default';
-        assert.deepEqual(selector.selectedItems, [items[2]]);
-      });
-
-      test('selection is updated after fallback is set', function() {
-        selector.fallbackSolution = undefined;
-        selector.select('non-existing-value');
-        selector.fallbackSelection = 'default';
-        assert.equal(selector.selectedItem, items[2]);
-      });
-
-      test('multi-selection is updated after fallback is set', function() {
-        selector.fallbackSolution = undefined;
-        selector.selectedValues = ['non-existing-value'];
-        selector.fallbackSolution = 'default';
-        assert.equal(selector.selectedItem, items[2]);
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/basic.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/basic.html
deleted file mode 100644
index 08866bb..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/basic.html
+++ /dev/null
@@ -1,263 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-basic</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-
-    .my-selected {
-      background: red;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-fixture id="defaults">
-    <template>
-      <iron-selector>
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <div>Item 3</div>
-        <div>Item 4</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <br><br>
-
-  <test-fixture id="basic">
-    <template>
-      <iron-selector selected="item2" attr-for-selected="id">
-        <div id="item0">Item 0</div>
-        <div id="item1">Item 1</div>
-        <div id="item2">Item 2</div>
-        <div id="item3">Item 3</div>
-        <div id="item4">Item 4</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('defaults', function() {
-
-      var s1;
-
-      setup(function () {
-        s1 = fixture('defaults');
-      });
-
-      test('to nothing selected', function() {
-        assert.equal(s1.selected, null);
-      });
-
-      test('to iron-selected as selectedClass', function() {
-        assert.equal(s1.selectedClass, 'iron-selected');
-      });
-
-      test('to false as multi', function() {
-        assert.isFalse(s1.multi);
-      });
-
-      test('to tap as activateEvent', function() {
-        assert.equal(s1.activateEvent, 'tap');
-      });
-
-      test('to nothing as attrForSelected', function() {
-        assert.equal(s1.attrForSelected, null);
-      });
-
-      test('as many items as children', function() {
-        assert.equal(s1.items.length, s1.querySelectorAll('div').length);
-      });
-    });
-
-    suite('basic', function() {
-
-      var s2;
-
-      setup(function () {
-        s2 = fixture('basic');
-      });
-
-      test('honors the attrForSelected attribute', function(done) {
-        Polymer.Base.async(function() {
-          assert.equal(s2.attrForSelected, 'id');
-          assert.equal(s2.selected, 'item2');
-          assert.equal(s2.selectedItem, document.querySelector('#item2'));
-          done();
-        });
-      });
-
-      test('allows assignment to selected', function() {
-        // set selected
-        s2.selected = 'item4';
-        // check selected class
-        assert.isTrue(s2.children[4].classList.contains('iron-selected'));
-        // check item
-        assert.equal(s2.selectedItem, s2.children[4]);
-      });
-
-      test('fire iron-select when selected is set', function() {
-        // setup listener for iron-select event
-        var selectedEventCounter = 0;
-        s2.addEventListener('iron-select', function(e) {
-          selectedEventCounter++;
-        });
-        // set selected
-        s2.selected = 'item4';
-        // check iron-select event
-        assert.equal(selectedEventCounter, 1);
-      });
-
-      test('set selected to old value', function() {
-        // setup listener for iron-select event
-        var selectedEventCounter = 0;
-        s2.addEventListener('iron-select', function(e) {
-          selectedEventCounter++;
-        });
-        // selecting the same value shouldn't fire iron-select
-        s2.selected = 'item2';
-        assert.equal(selectedEventCounter, 0);
-      });
-
-      test('force synchronous item update', function() {
-        expect(s2.items.length).to.be.equal(5);
-        Polymer.dom(s2).appendChild(document.createElement('div'));
-        expect(s2.items.length).to.be.equal(5);
-        s2.forceSynchronousItemUpdate();
-        expect(s2.items.length).to.be.equal(6);
-      });
-
-      suite('`select()` and `selectIndex()`', function() {
-        test('`select()` selects an item with the given value', function() {
-          s2.select('item1');
-          assert.equal(s2.selected, 'item1');
-
-          s2.select('item3');
-          assert.equal(s2.selected, 'item3');
-
-          s2.select('item2');
-          assert.equal(s2.selected, 'item2');
-        });
-
-        test('`selectIndex()` selects an item with the given index', function() {
-          assert.equal(s2.selectedItem, undefined);
-
-          s2.selectIndex(1);
-          assert.equal(s2.selected, 'item1');
-          assert.equal(s2.selectedItem, s2.items[1]);
-
-          s2.selectIndex(3);
-          assert.equal(s2.selected, 'item3');
-          assert.equal(s2.selectedItem, s2.items[3]);
-
-          s2.selectIndex(4);
-          assert.equal(s2.selected, 'item4');
-          assert.equal(s2.selectedItem, s2.items[4]);
-        });
-      });
-
-      suite('items changing', function() {
-        var s1;
-
-        setup(function() {
-          s1 = fixture('defaults');
-        });
-
-        test('cause iron-items-changed to fire', function(done) {
-          var newItem = document.createElement('div');
-          var changeCount = 0;
-
-          newItem.id = 'item999';
-
-          s2.addEventListener('iron-items-changed', function(event) {
-            changeCount++;
-            var mutation = event.detail;
-            assert.notEqual(mutation, undefined);
-            assert.notEqual(mutation.addedNodes, undefined);
-            assert.notEqual(mutation.removedNodes, undefined);
-          });
-
-          Polymer.dom(s2).appendChild(newItem);
-
-          Polymer.Base.async(function() {
-            Polymer.dom(s2).removeChild(newItem);
-
-            Polymer.Base.async(function() {
-              expect(changeCount).to.be.equal(2);
-              done();
-            }, 1);
-          }, 1);
-        });
-
-        test('updates selected item', function(done) {
-          s1.addEventListener('iron-items-changed', function firstListener() {
-            s1.removeEventListener('iron-items-changed', firstListener);
-            var firstElementChild = Polymer.dom(s1).firstElementChild;
-            expect(firstElementChild).to.be.equal(s1.selectedItem);
-            expect(firstElementChild.classList.contains('iron-selected'))
-                .to.be.eql(true);
-            Polymer.dom(s1).removeChild(s1.selectedItem);
-
-            s1.addEventListener('iron-items-changed', function() {
-              firstElementChild = Polymer.dom(s1).firstElementChild;
-              expect(firstElementChild).to.be.equal(s1.selectedItem);
-              expect(firstElementChild.classList.contains('iron-selected'))
-                  .to.be.eql(true);
-              done();
-            });
-          });
-          s1.selected = 0;
-        });
-      });
-
-      suite('dynamic selector', function() {
-        test('selects dynamically added child automatically', function(done) {
-          var selector = document.createElement('iron-selector');
-          var child = document.createElement('div');
-
-          selector.selected = '0';
-          child.textContent = 'Item 0';
-
-          Polymer.dom(selector).appendChild(child);
-          document.body.appendChild(selector);
-
-          Polymer.Base.async(function() {
-            assert.equal(child.className, 'iron-selected');
-            document.body.removeChild(selector);
-            done();
-          }, 1);
-        });
-      });
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/content-element.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/content-element.html
deleted file mode 100644
index 7d1d604..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/content-element.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-selector.html">
-
-<dom-module id="test-content-element">
-
-  <template>
-
-    <iron-selector id="selector" selected="{{selected}}" selectable="[[selectable]]" attr-for-selected="id">
-      <content></content>
-    </iron-selector>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'test-content-element',
-
-    properties: {
-
-      selectable: String,
-
-      selected: {
-        type: String,
-        notify: true
-      }
-
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/content.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/content.html
deleted file mode 100644
index af27cf8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/content.html
+++ /dev/null
@@ -1,169 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-content</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="content-element.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-content-element id="selector1" selected="item0">
-    <div id="item0">item0</div>
-    <div id="item1">item1</div>
-    <div id="item2">item2</div>
-    <div id="item3">item3</div>
-  </test-content-element>
-
-  <test-content-element id="selector2" selected="item0" selectable="item">
-    <item id="item0">item0</item>
-    <hr>
-    <item id="item1">item1</item>
-    <item id="item2">item2</item>
-    <hr>
-    <item id="item3">item3</item>
-  </test-content-element>
-
-  <test-content-element id="selector3" selected="item0">
-    <template is="dom-repeat" id="t">
-      <div id$="[[item.name]]">[[item.name]]</div>
-    </template>
-  </test-content-element>
-
-  <script>
-
-    var s1 = document.querySelector('#selector1');
-    var s2 = document.querySelector('#selector2');
-    var s3 = document.querySelector('#selector3');
-
-    var t = document.querySelector('#t');
-
-    suite('content', function() {
-
-      test('attribute selected', function() {
-        // check selected class
-        assert.isTrue(s1.querySelector('#item0').classList.contains('iron-selected'));
-      });
-
-      test('set selected', function() {
-        // set selected
-        s1.selected = 'item1';
-        // check selected class
-        assert.isTrue(s1.querySelector('#item1').classList.contains('iron-selected'));
-      });
-
-      test('get items', function() {
-        assert.equal(s1.$.selector.items.length, 4);
-      });
-
-      test('activate event', function() {
-        var item = s1.querySelector('#item2');
-        item.dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-        // check selected class
-        assert.isTrue(item.classList.contains('iron-selected'));
-      });
-
-      test('add item dynamically', function() {
-        var item = document.createElement('div');
-        item.id = 'item4';
-        item.textContent = 'item4';
-        Polymer.dom(s1).appendChild(item);
-        Polymer.dom.flush();
-        // set selected
-        s1.selected = 'item4';
-        // check items length
-        assert.equal(s1.$.selector.items.length, 5);
-        // check selected class
-        assert.isTrue(s1.querySelector('#item4').classList.contains('iron-selected'));
-      });
-
-    });
-
-    suite('content with selectable', function() {
-
-      test('attribute selected', function() {
-        // check selected class
-        assert.isTrue(s2.querySelector('#item0').classList.contains('iron-selected'));
-      });
-
-      test('set selected', function() {
-        // set selected
-        s2.selected = 'item1';
-        // check selected class
-        assert.isTrue(s2.querySelector('#item1').classList.contains('iron-selected'));
-      });
-
-      test('get items', function() {
-        assert.equal(s2.$.selector.items.length, 4);
-      });
-
-      test('activate event', function() {
-        var item = s2.querySelector('#item2');
-        item.dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-        // check selected class
-        assert.isTrue(item.classList.contains('iron-selected'));
-      });
-
-      test('add item dynamically', function() {
-        var item = document.createElement('item');
-        item.id = 'item4';
-        item.textContent = 'item4';
-        Polymer.dom(s2).appendChild(item);
-        Polymer.dom.flush();
-        // set selected
-        s2.selected = 'item4';
-        // check items length
-        assert.equal(s2.$.selector.items.length, 5);
-        // check selected class
-        assert.isTrue(s2.querySelector('#item4').classList.contains('iron-selected'));
-      });
-
-    });
-
-    suite('content with dom-repeat', function() {
-
-      test('supports repeated children', function(done) {
-        t.items = [{name:'item0'}, {name: 'item1'}, {name: 'item2'}, {name: 'item3'}];
-        setTimeout(function() {
-          // check selected
-          assert.equal(s3.selected, 'item0');
-          // check selected class
-          assert.isTrue(s3.querySelector('#item0').classList.contains('iron-selected'));
-          // set selected
-          s3.selected = 'item2';
-          // check selected class
-          assert.isTrue(s3.querySelector('#item2').classList.contains('iron-selected'));
-          done();
-        });
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/excluded-local-names.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/excluded-local-names.html
deleted file mode 100644
index 4b8d425..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/excluded-local-names.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-selected-attribute</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-selector.html">
-</head>
-<body>
-
-  <test-fixture id="test1">
-    <template>
-      <iron-selector>
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <span>Item 3</span>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="test2">
-    <template>
-      <iron-selector>
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <p>Item 3</p>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('excluded local names', function() {
-
-      var test1, test2;
-
-      setup(function () {
-        test1 = fixture('test1');
-        test2 = fixture('test2');
-      });
-
-      test('default `_excludedLocalNames`', function() {
-        assert.isTrue('template' in test1._excludedLocalNames);
-        assert.isTrue('template' in test2._excludedLocalNames);
-      });
-
-      test('custom `_excludedLocalNames`', function() {
-        test1._excludedLocalNames.foo = 1;
-
-        assert.isTrue('foo' in test1._excludedLocalNames);
-        assert.isFalse('foo' in test2._excludedLocalNames);
-      });
-
-
-      test('items', function(done) {
-        test1._excludedLocalNames.span = 1;
-        test2._excludedLocalNames.div = 1;
-        test1._updateItems();
-        test2._updateItems();
-
-        Polymer.Base.async(function() {
-          var NOT_FOUND = -1;
-          var items1 = test1.items.map(function(el) { return el.localName; });
-          var items2 = test2.items.map(function(el) { return el.localName; });
-
-          assert.equal(items1.indexOf('span'), NOT_FOUND);
-          assert.equal(items2.indexOf('div'), NOT_FOUND);
-          done();
-        });
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/index.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/index.html
deleted file mode 100644
index 3cfe559..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/index.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-  <meta charset="utf-8">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-
-</head>
-<body>
-
-  <script>
-    WCT.loadSuites([
-      'activate-event.html',
-      'attr-for-selected.html',
-      'basic.html',
-      'multi.html',
-      'next-previous.html',
-      'numeric-ids.html',
-      'selected-attribute.html',
-      'template-repeat.html',
-      'content.html',
-      'excluded-local-names.html',
-      'activate-event.html?dom=shadow',
-      'basic.html?dom=shadow',
-      'multi.html?dom=shadow',
-      'next-previous.html?dom=shadow',
-      'selected-attribute.html?dom=shadow',
-      'template-repeat.html?dom=shadow',
-      'content.html?dom=shadow',
-      'excluded-local-names.html?dom=shadow'
-    ]);
-  </script>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/multi.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/multi.html
deleted file mode 100644
index 39b70b9..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/multi.html
+++ /dev/null
@@ -1,375 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-multi</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-fixture id="test">
-    <template>
-      <iron-selector multi>
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <div>Item 3</div>
-        <div>Item 4</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="valueById">
-    <template>
-      <iron-selector multi attr-for-selected="id">
-        <div id="item0">Item 0</div>
-        <div id="item1">Item 1</div>
-        <div id="item2">Item 2</div>
-        <div id="item3">Item 3</div>
-        <div id="item4">Item 4</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <!--
-  NOTE(cdata): Enable test-fixture when polymer/polymer#2495 is resolved
-  -->
-  <!--<test-fixture id="repeatedItems">
-    <template>-->
-      <iron-selector multi id="repeatedItems">
-        <template is="dom-repeat" items='["foo", "bar", "baz"]'>
-          <div>[[item]]</div>
-        </template>
-        <div>vim</div>
-      </iron-selector>
-    <!--</template>
-  </test-fixture>-->
-
-  <script>
-
-    suite('multi', function() {
-
-      var s;
-
-      setup(function () {
-        s = fixture('test');
-        t = Polymer.dom(s).querySelector('[is="dom-repeat"]');
-      });
-
-      test('honors the multi attribute', function() {
-        assert.isTrue(s.multi);
-      });
-
-      test('has sane defaults', function() {
-        assert.equal(s.selectedValues, undefined);
-        assert.equal(s.selectedClass, 'iron-selected');
-        assert.equal(s.items.length, 5);
-      });
-
-      test('set multi-selection via selected property', function() {
-        // set selectedValues
-        s.selectedValues = [0, 2];
-        // check selected class
-        assert.isTrue(s.children[0].classList.contains('iron-selected'));
-        assert.isTrue(s.children[2].classList.contains('iron-selected'));
-        // check selectedItems
-        assert.equal(s.selectedItems.length, 2);
-        assert.equal(s.selectedItems[0], s.children[0]);
-        assert.equal(s.selectedItems[1], s.children[2]);
-      });
-
-      test('set multi-selection via tap', function() {
-        // set selectedValues
-        MockInteractions.tap(s.children[0]);
-        MockInteractions.tap(s.children[2]);
-        // check selected class
-        assert.isTrue(s.children[0].classList.contains('iron-selected'));
-        assert.isTrue(s.children[2].classList.contains('iron-selected'));
-        // check selectedItems
-        assert.equal(s.selectedItems.length, 2);
-        assert.equal(s.selectedItems[0], s.children[0]);
-        assert.equal(s.selectedItems[1], s.children[2]);
-      });
-
-      test('fire iron-select/deselect events when selectedValues changes', function() {
-        // setup listener for iron-select/deselect events
-        var items = [s.children[0], s.children[1], s.children[2]], 
-            selectEventCounters = [0, 0, 0], 
-            deselectEventCounters = [0, 0, 0];
-
-        s.addEventListener('iron-select', function(e) {
-          selectEventCounters[items.indexOf(e.detail.item)]++;
-        });
-        s.addEventListener('iron-deselect', function(e) {
-          deselectEventCounters[items.indexOf(e.detail.item)]++;
-        });
-
-        // programatically select values 0 and 1 (both fire select)
-        s.selectedValues = [0, 1];
-
-        // programatically select values 1 and 2 (2 fires select, 0 fires deselect)
-        s.selectedValues = [1, 2];
-
-        // programatically deselect all values (1 and 2 fire deselect)
-        s.selectedValues = [];
-
-        // check events
-        assert.equal(selectEventCounters[0], 1);
-        assert.equal(deselectEventCounters[0], 1);
-        assert.equal(selectEventCounters[1], 1);
-        assert.equal(deselectEventCounters[1], 1);
-        assert.equal(selectEventCounters[2], 1);
-        assert.equal(deselectEventCounters[2], 1);
-      });
-
-      test('fire iron-select/deselect events when selectedValues is modified', function() {
-        // setup listener for iron-select/deselect events
-        var items = [s.children[0], s.children[1], s.children[2]],
-            selectEventCounters = [0, 0, 0],
-            deselectEventCounters = [0, 0, 0];
-
-        s.addEventListener('iron-select', function(e) {
-          selectEventCounters[items.indexOf(e.detail.item)]++;
-        });
-        s.addEventListener('iron-deselect', function(e) {
-          deselectEventCounters[items.indexOf(e.detail.item)]++;
-        });
-
-        s.selectedValues = []
-
-        // programatically select value 0
-        s.push('selectedValues', 0, 1);
-
-        // programatically deselect value 0
-        s.shift('selectedValues');
-
-        // programatically select value 2
-        s.push('selectedValues', 2);
-
-        // programatically deselect value 1
-        s.shift('selectedValues');
-
-        assert.equal(selectEventCounters[0], 1);
-        assert.equal(deselectEventCounters[0], 1);
-        assert.equal(selectEventCounters[1], 1);
-        assert.equal(deselectEventCounters[1], 1);
-        assert.equal(selectEventCounters[2], 1);
-        assert.equal(deselectEventCounters[2], 0);
-      });
-
-      test('fire iron-select/deselect events when toggling items', function() {
-        // setup listener for iron-select/deselect events
-        var items = [s.children[0], s.children[1], s.children[2]], 
-            selectEventCounters = [0, 0, 0], 
-            deselectEventCounters = [0, 0, 0];
-
-        s.addEventListener('iron-select', function(e) {
-          selectEventCounters[items.indexOf(e.detail.item)]++;
-        });
-        s.addEventListener('iron-deselect', function(e) {
-          deselectEventCounters[items.indexOf(e.detail.item)]++;
-        });
-
-        // tap to select items 0 and 1 (both fire select)
-        MockInteractions.tap(items[0]);
-        MockInteractions.tap(items[1]);
-        
-        // programatically select values 1 and 2 (2 fires select, 0 fires deselect)
-        s.selectedValues = [1, 2];
-
-        // tap to deselect items 1 and 2 (both fire deselect)
-        MockInteractions.tap(items[1]);
-        MockInteractions.tap(items[2]);
-
-        // check events
-        assert.equal(selectEventCounters[0], 1);
-        assert.equal(deselectEventCounters[0], 1);
-        assert.equal(selectEventCounters[1], 1);
-        assert.equal(deselectEventCounters[1], 1);
-        assert.equal(selectEventCounters[2], 1);
-        assert.equal(deselectEventCounters[2], 1);
-      });
-
-      test('toggle iron-selected class when toggling items selection', function() {
-        // setup listener for iron-item-select/deselect events
-        var item0 = s.children[0], item1 = s.children[1];
-
-        assert.isFalse(item0.classList.contains('iron-selected'));
-        assert.isFalse(item1.classList.contains('iron-selected'));
-
-        // tap to select item 0 (add iron-selected class)
-        MockInteractions.tap(item0);
-
-        assert.isTrue(item0.classList.contains('iron-selected'));
-        assert.isFalse(item1.classList.contains('iron-selected'));
-        
-        // tap to select item 1 (add iron-selected class)
-        MockInteractions.tap(item1);
-        
-        assert.isTrue(item0.classList.contains('iron-selected'));
-        assert.isTrue(item1.classList.contains('iron-selected'));
-
-        // tap to deselect item 1 (remove iron-selected class)
-        MockInteractions.tap(item1);
-        
-        assert.isTrue(item0.classList.contains('iron-selected'));
-        assert.isFalse(item1.classList.contains('iron-selected'));
-
-        // programatically select both values (1 add iron-selected class)
-        s.selectedValues = [0, 1];
-
-        assert.isTrue(item0.classList.contains('iron-selected'));
-        assert.isTrue(item1.classList.contains('iron-selected'));
-
-        // programatically deselect all values (both removes iron-selected class)
-        s.selectedValues = [];
-        
-        assert.isFalse(item0.classList.contains('iron-selected'));
-        assert.isFalse(item1.classList.contains('iron-selected'));
-      });
-
-      test('fires selected-values-changed when selection changes', function() {
-        var selectedValuesChangedEventCounter = 0;
-
-        s.addEventListener('selected-values-changed', function(e) {
-          selectedValuesChangedEventCounter++;
-        });
-
-        MockInteractions.tap(Polymer.dom(s).children[0]);
-        MockInteractions.tap(Polymer.dom(s).children[0]);
-        MockInteractions.tap(Polymer.dom(s).children[0]);
-
-        expect(selectedValuesChangedEventCounter);
-      });
-
-      test('selects from items created by dom-repeat', function(done) {
-        var selectEventCounter = 0;
-        var firstChild;
-
-        s = document.querySelector('#repeatedItems');
-        s.addEventListener('iron-select', function(e) {
-          selectEventCounter++;
-        });
-
-        // NOTE(cdata): I guess `dom-repeat` doesn't stamp synchronously..
-        Polymer.Base.async(function() {
-          firstChild = Polymer.dom(s).querySelector('div');
-          MockInteractions.tap(firstChild);
-
-          assert.equal(s.selectedItems[0].textContent, 'foo');
-          done();
-        });
-      });
-
-      test('updates selection when dom changes', function(done) {
-        var selectEventCounter = 0;
-
-        s = fixture('test');
-
-        Polymer.Base.async(function() {
-          var firstChild = Polymer.dom(s).querySelector(':first-child');
-          var lastChild = Polymer.dom(s).querySelector(':last-child');
-
-          MockInteractions.tap(firstChild);
-          MockInteractions.tap(lastChild);
-
-          expect(s.selectedItems.length).to.be.equal(2);
-
-          Polymer.dom(s).removeChild(lastChild);
-
-          Polymer.dom.flush();
-
-          expect(s.selectedItems.length).to.be.equal(1);
-          expect(s.selectedItems[0]).to.be.equal(firstChild);
-
-          done();
-        });
-
-      });
-
-      suite('`select()` and `selectIndex()`', function() {
-        var selector;
-
-        setup(function() {
-          selector = fixture('valueById');
-        });
-
-        test('`select()` selects an item with the given value', function() {
-          selector.select('item1');
-          assert.equal(selector.selectedValues.length, 1);
-          assert.equal(selector.selectedValues.indexOf('item1'), 0);
-
-          selector.select('item3');
-          assert.equal(selector.selectedValues.length, 2);
-          assert.isTrue(selector.selectedValues.indexOf('item3') >= 0);
-
-          selector.select('item2');
-          assert.equal(selector.selectedValues.length, 3);
-          assert.isTrue(selector.selectedValues.indexOf('item2') >= 0);
-        });
-
-        test('`selectIndex()` selects an item with the given index', function() {
-          selector.selectIndex(1);
-          assert.equal(selector.selectedValues.length, 1);
-          assert.isTrue(selector.selectedValues.indexOf('item1') >= 0);
-          assert.equal(selector.selectedItems.length, 1);
-          assert.isTrue(selector.selectedItems.indexOf(selector.items[1]) >= 0);
-
-          selector.selectIndex(3);
-          assert.equal(selector.selectedValues.length, 2);
-          assert.isTrue(selector.selectedValues.indexOf('item3') >= 0);
-          assert.equal(selector.selectedItems.length, 2);
-          assert.isTrue(selector.selectedItems.indexOf(selector.items[3]) >= 0);
-
-          selector.selectIndex(0);
-          assert.equal(selector.selectedValues.length, 3);
-          assert.isTrue(selector.selectedValues.indexOf('item0') >= 0);
-          assert.equal(selector.selectedItems.length, 3);
-          assert.isTrue(selector.selectedItems.indexOf(selector.items[0]) >= 0);
-        });
-      });
-
-      /* test('toggle multi from true to false', function() {
-        // set selected
-        s.selected = [0, 2];
-        var first = s.selected[0];
-        // set mutli to false, so to make it single-selection
-        s.multi = false;
-        // selected should not be an array
-        assert.isNotArray(s.selected);
-        // selected should be the first value from the old array
-        assert.equal(s.selected, first);
-      }); */
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/next-previous.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/next-previous.html
deleted file mode 100644
index e161c1b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/next-previous.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-next-previous</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-fixture id="test1">
-    <template>
-      <iron-selector selected="0">
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="test2">
-    <template>
-      <iron-selector selected="foo" attr-for-selected="name">
-        <div name="foo">Item Foo</div>
-        <div name="bar">Item Bar</div>
-        <div name="zot">Item Zot</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    var s;
-
-    function assertAndSelect(method, expectedIndex) {
-      assert.equal(s.selected, expectedIndex);
-      s[method]();
-    }
-
-    suite('next/previous', function() {
-
-      setup(function () {
-        s = fixture('test1');
-      });
-
-      test('selectNext', function() {
-        assert.equal(s.selected, 0);
-        assertAndSelect('selectNext', 0);
-        assertAndSelect('selectNext', 1);
-        assertAndSelect('selectNext', 2);
-        assert.equal(s.selected, 0);
-      });
-
-      test('selectPrevious', function() {
-        assert.equal(s.selected, 0);
-        assertAndSelect('selectPrevious', 0);
-        assertAndSelect('selectPrevious', 2);
-        assertAndSelect('selectPrevious', 1);
-        assert.equal(s.selected, 0);
-      });
-
-      test('selectNext/Previous', function() {
-        assert.equal(s.selected, 0);
-        assertAndSelect('selectNext', 0);
-        assertAndSelect('selectNext', 1);
-        assertAndSelect('selectPrevious', 2);
-        assertAndSelect('selectNext', 1);
-        assertAndSelect('selectPrevious', 2);
-        assert.equal(s.selected, 1);
-      });
-
-    });
-
-    suite('next/previous attrForSelected', function() {
-
-      setup(function () {
-        s = fixture('test2');
-      });
-
-      test('selectNext', function() {
-        assert.equal(s.selected, 'foo');
-        assertAndSelect('selectNext', 'foo');
-        assertAndSelect('selectNext', 'bar');
-        assertAndSelect('selectNext', 'zot');
-        assert.equal(s.selected, 'foo');
-      });
-
-      test('selectPrevious', function() {
-        assert.equal(s.selected, 'foo');
-        assertAndSelect('selectPrevious', 'foo');
-        assertAndSelect('selectPrevious', 'zot');
-        assertAndSelect('selectPrevious', 'bar');
-        assert.equal(s.selected, 'foo');
-      });
-
-      test('selectNext/Previous', function() {
-        assert.equal(s.selected, 'foo');
-        assertAndSelect('selectNext', 'foo');
-        assertAndSelect('selectNext', 'bar');
-        assertAndSelect('selectPrevious', 'zot');
-        assertAndSelect('selectNext', 'bar');
-        assertAndSelect('selectPrevious', 'zot');
-        assert.equal(s.selected, 'bar');
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/numeric-ids.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/numeric-ids.html
deleted file mode 100644
index f8b5824..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/numeric-ids.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-numeric-ids</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <template is="dom-bind">
-    <iron-selector id="selector" attr-for-selected="name">
-      <template id="t" is="dom-repeat">
-        <div name="[[item.id]]">{{item.name}}</div>
-      </template>
-    </iron-selector>
-  </template>
-
-  <script>
-
-    suite('select by a numeric property', function() {
-
-      var scope, s, t;
-
-      setup(function() {
-        scope = document.querySelector('template[is="dom-bind"]');
-        s = scope.$.selector;
-        t = scope.$.t;
-        t.items = [{ id: 0, name:'item0'}, {id: 1, name: 'item1'}, {id: 2, name: 'item2'}];
-      });
-
-      teardown(function() {
-        t.items = [];
-      });
-
-      test('select a value of zero', function() {
-        t.render();
-        s.selected = 1;
-        assert.equal(s.selected, '1');
-
-        // select item with a name value of 0
-        s.children[0].dispatchEvent(new CustomEvent('tap', {bubbles: true}));
-        assert.equal(s.selected, 0);
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/selected-attribute.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/selected-attribute.html
deleted file mode 100644
index 35e7cec..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/selected-attribute.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-selected-attribute</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <test-fixture id="test">
-    <template>
-      <iron-selector id="selector">
-        <div>Item 0</div>
-        <div>Item 1</div>
-        <div>Item 2</div>
-        <div>Item 3</div>
-        <div>Item 4</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="test-attr-change">
-    <template>
-      <iron-selector id="selector" attr-for-selected="data-x" selected="x-1">
-        <div data-x="x-1" data-y="y-1">1</div>
-        <div data-x="x-2" data-y="y-2">2</div>
-        <div data-x="x-3" data-y="y-3">3</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="test-attr-change-multi">
-    <template>
-      <iron-selector multi id="selector"
-                     attr-for-selected="data-x"
-                     selected-values='["x-1","x-2"]'>
-        <div data-x="x-1" data-y="y-1">1</div>
-        <div data-x="x-2" data-y="y-2">2</div>
-        <div data-x="x-3" data-y="y-3">3</div>
-      </iron-selector>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('selected attributes', function() {
-
-      var s;
-
-      setup(function () {
-        s = fixture('test');
-      });
-
-      test('custom selectedAttribute', function() {
-        // set selectedAttribute
-        s.selectedAttribute = 'myattr';
-        // check selected attribute (should not be there)
-        assert.isFalse(s.children[4].hasAttribute('myattr'));
-        // set selected
-        s.selected = 4;
-        // now selected attribute should be there
-        assert.isTrue(s.children[4].hasAttribute('myattr'));
-      });
-
-    });
-
-    suite('changing attrForSelected', function() {
-
-      var s;
-
-      setup(function () {
-        s = fixture('test-attr-change');
-      });
-
-      test('changing selectedAttribute', function() {
-        Polymer.dom.flush();
-        s.attrForSelected = 'data-y';
-        assert.equal(s.selected, 'y-1');
-      });
-
-    });
-
-    suite('changing attrForSelected in multi', function() {
-
-      var s;
-
-      setup(function () {
-        s = fixture('test-attr-change-multi');
-      });
-
-      test('changing selectedAttribute', function() {
-        Polymer.dom.flush();
-        s.attrForSelected = 'data-y';
-        assert.equal(s.selectedValues.length, 2);
-        assert.equal(s.selectedValues[0],'y-1');
-        assert.equal(s.selectedValues[1],'y-2');
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-selector/test/template-repeat.html b/systrace/catapult/third_party/polymer/components/iron-selector/test/template-repeat.html
deleted file mode 100644
index b1ab6a6..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-selector/test/template-repeat.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <title>iron-selector-template-repeat</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../iron-selector.html">
-
-  <style>
-    .iron-selected {
-      background: #ccc;
-    }
-  </style>
-
-</head>
-<body>
-
-  <template is="dom-bind">
-    <iron-selector id="selector" selected="1">
-      <template id="t" is="dom-repeat">
-        <div id$="[[item.name]]">{{item.name}}</div>
-      </template>
-    </iron-selector>
-  </template>
-
-  <script>
-
-    suite('dom-repeat', function() {
-
-      var scope, s, t;
-
-      setup(function() {
-        scope = document.querySelector('template[is="dom-bind"]');
-        s = scope.$.selector;
-        t = scope.$.t;
-        t.items = [{name:'item0'}, {name: 'item1'}, {name: 'item2'}, {name: 'item3'}];
-      });
-
-      teardown(function() {
-        t.items = [];
-      });
-
-      test('supports repeated items', function() {
-        t.render();
-        // check items
-        assert.equal(s.items.length, 4);
-        // check selected
-        assert.equal(s.selected, 1);
-        // check selected item
-        var item = s.selectedItem;
-        assert.equal(s.items[1], item);
-        // check selected class
-        assert.isTrue(item.classList.contains('iron-selected'));
-      });
-
-      test('update items', function() {
-        t.render();
-        // check items
-        assert.equal(s.items.length, 4);
-        // check selected
-        assert.equal(s.selected, 1);
-        // update items
-        t.items = [{name:'foo'}, {name: 'bar'}];
-        t.render();
-        // check items
-        assert.equal(s.items.length, 2);
-        // check selected (should still honor the selected)
-        assert.equal(s.selected, 1);
-        // check selected class
-        assert.isTrue(s.querySelector('#bar').classList.contains('iron-selected'));
-      });
-
-      test('set selected to something else', function() {
-        t.render();
-        // set selected to something else
-        s.selected = 3;
-        // check selected item
-        var item = s.selectedItem;
-        assert.equal(s.items[3], item);
-        // check selected class
-        assert.isTrue(item.classList.contains('iron-selected'));
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/README.md b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/README.md
deleted file mode 100644
index 6fff76e..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-iron-validatable-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/iron-validatable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-validatable-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/iron-validatable-behavior)_
-
-
-##Polymer.IronValidatableBehavior
-
-`Use Polymer.IronValidatableBehavior` to implement an element that validates user input.
-Use the related `Polymer.IronValidatorBehavior` to add custom validation logic to an iron-input.
-
-By default, an `<iron-form>` element validates its fields when the user presses the submit button.
-To validate a form imperatively, call the form's `validate()` method, which in turn will
-call `validate()` on all its children. By using `Polymer.IronValidatableBehavior`, your
-custom element will get a public `validate()`, which
-will return the validity of the element, and a corresponding `invalid` attribute,
-which can be used for styling.
-
-To implement the custom validation logic of your element, you must override
-the protected `_getValidity()` method of this behaviour, rather than `validate()`.
-See [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html)
-for an example.
-
-### Accessibility
-
-Changing the `invalid` property, either manually or by calling `validate()` will update the
-`aria-invalid` attribute.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/bower.json b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/bower.json
deleted file mode 100644
index 36f20c1..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "iron-validatable-behavior",
-  "version": "1.1.2",
-  "description": "Provides a behavior for an element that validates user input",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "iron",
-    "behavior"
-  ],
-  "main": "iron-validatable-behavior.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/iron-validatable-behavior.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/iron-validatable-behavior",
-  "ignore": [],
-  "dependencies": {
-    "iron-meta": "PolymerElements/iron-meta#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "paper-styles": "PolymerElements/paper-styles#^1.0.4",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/cats-only.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/cats-only.html
deleted file mode 100644
index 83ef9ba..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/cats-only.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'cats-only',
-
-    behaviors: [
-      Polymer.IronValidatorBehavior
-    ],
-
-    validateObject: function(obj) {
-      var valid = true;
-      for (key in obj) {
-        if (obj[key] !== 'cats') {
-          valid = false;
-          break;
-        }
-      }
-      return valid;
-    },
-
-    validate: function(values) {
-      if (typeof values === 'object') {
-        return this.validateObject(values);
-      } else {
-        var value = Array.isArray(values) ? values.join('') : values;
-        return value.match(/^(c|ca|cat|cats)?$/) !== null;
-      }
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/index.html
deleted file mode 100644
index 84b96a8..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/index.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>iron-validatable-behavior demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="cats-only.html">
-  <link rel="import" href="validatable-input.html">
-
-  <style is="custom-style">
-
-    .valid {
-      color: var(--google-green-500);
-    }
-
-    .invalid {
-      color: var(--google-red-500);
-    }
-
-  </style>
-
-</head>
-<body>
-  <div class="vertical-section vertical-section-container centered">
-  <h1>&lt;iron-validatable-behavior&gt;</h1>
-
-  <template is="dom-bind">
-
-    <cats-only></cats-only>
-
-    <section>
-
-      <p>
-        only type <code>cats</code>:
-
-        <input is="validatable-input" invalid="{{invalid}}" validator="cats-only">
-
-        <span class="valid" hidden$="[[invalid]]">valid</span>
-        <span class="invalid" hidden$="[[!invalid]]">invalid</span>
-      </p>
-
-    </section>
-
-  </template>
-
-  </div>
-
-  <script>
-
-    document.querySelector('template[is="dom-bind"]').invalid = false;
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/validatable-input.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/validatable-input.html
deleted file mode 100644
index 19cf477..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/demo/validatable-input.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../iron-validatable-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'validatable-input',
-
-    extends: 'input',
-
-    properties: {
-
-      invalid: {
-        notify: true,
-        type: Boolean,
-        value: false
-      }
-
-    },
-
-    behaviors: [
-      Polymer.IronValidatableBehavior
-    ],
-
-    listeners: {
-      'input': '_onInput'
-    },
-
-    _onInput: function(event) {
-      this.invalid = !this.validate(event.target.value);
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/index.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/index.html
deleted file mode 100644
index cfaa5b1..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>iron-validatable-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/iron-validatable-behavior.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/iron-validatable-behavior.html
deleted file mode 100644
index 803731b..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/iron-validatable-behavior.html
+++ /dev/null
@@ -1,149 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
-
-<script>
-  /**
-   * Singleton IronMeta instance.
-   */
-  Polymer.IronValidatableBehaviorMeta = null;
-
-  /**
-   * `Use Polymer.IronValidatableBehavior` to implement an element that validates user input.
-   * Use the related `Polymer.IronValidatorBehavior` to add custom validation logic to an iron-input.
-   *
-   * By default, an `<iron-form>` element validates its fields when the user presses the submit button.
-   * To validate a form imperatively, call the form's `validate()` method, which in turn will
-   * call `validate()` on all its children. By using `Polymer.IronValidatableBehavior`, your
-   * custom element will get a public `validate()`, which
-   * will return the validity of the element, and a corresponding `invalid` attribute,
-   * which can be used for styling.
-   *
-   * To implement the custom validation logic of your element, you must override
-   * the protected `_getValidity()` method of this behaviour, rather than `validate()`.
-   * See [this](https://github.com/PolymerElements/iron-form/blob/master/demo/simple-element.html)
-   * for an example.
-   *
-   * ### Accessibility
-   *
-   * Changing the `invalid` property, either manually or by calling `validate()` will update the
-   * `aria-invalid` attribute.
-   *
-   * @demo demo/index.html
-   * @polymerBehavior
-   */
-  Polymer.IronValidatableBehavior = {
-
-    properties: {
-
-      /**
-       * Name of the validator to use.
-       */
-      validator: {
-        type: String
-      },
-
-      /**
-       * True if the last call to `validate` is invalid.
-       */
-      invalid: {
-        notify: true,
-        reflectToAttribute: true,
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * This property is deprecated and should not be used. Use the global
-       * validator meta singleton, `Polymer.IronValidatableBehaviorMeta` instead.
-       */
-      _validatorMeta: {
-        type: Object
-      },
-
-      /**
-       * Namespace for this validator. This property is deprecated and should
-       * not be used. For all intents and purposes, please consider it a
-       * read-only, config-time property.
-       */
-      validatorType: {
-        type: String,
-        value: 'validator'
-      },
-
-      _validator: {
-        type: Object,
-        computed: '__computeValidator(validator)'
-      }
-    },
-
-    observers: [
-      '_invalidChanged(invalid)'
-    ],
-
-    registered: function() {
-      Polymer.IronValidatableBehaviorMeta = new Polymer.IronMeta({type: 'validator'});
-    },
-
-    _invalidChanged: function() {
-      if (this.invalid) {
-        this.setAttribute('aria-invalid', 'true');
-      } else {
-        this.removeAttribute('aria-invalid');
-      }
-    },
-
-    /**
-     * @return {boolean} True if the validator `validator` exists.
-     */
-    hasValidator: function() {
-      return this._validator != null;
-    },
-
-    /**
-     * Returns true if the `value` is valid, and updates `invalid`. If you want
-     * your element to have custom validation logic, do not override this method;
-     * override `_getValidity(value)` instead.
-
-     * @param {Object} value The value to be validated. By default, it is passed
-     * to the validator's `validate()` function, if a validator is set.
-     * @return {boolean} True if `value` is valid.
-     */
-    validate: function(value) {
-      this.invalid = !this._getValidity(value);
-      return !this.invalid;
-    },
-
-    /**
-     * Returns true if `value` is valid.  By default, it is passed
-     * to the validator's `validate()` function, if a validator is set. You
-     * should override this method if you want to implement custom validity
-     * logic for your element.
-     *
-     * @param {Object} value The value to be validated.
-     * @return {boolean} True if `value` is valid.
-     */
-
-    _getValidity: function(value) {
-      if (this.hasValidator()) {
-        return this._validator.validate(value);
-      }
-      return true;
-    },
-
-    __computeValidator: function() {
-      return Polymer.IronValidatableBehaviorMeta &&
-          Polymer.IronValidatableBehaviorMeta.byKey(this.validator);
-    }
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/cats-only.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/cats-only.html
deleted file mode 100644
index f166993..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/cats-only.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'cats-only',
-
-    behaviors: [
-      Polymer.IronValidatorBehavior
-    ],
-
-    validate: function(value) {
-      return value === 'cats';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/dogs-only.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/dogs-only.html
deleted file mode 100644
index 1b462a4..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/dogs-only.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'dogs-only',
-
-    behaviors: [
-      Polymer.IronValidatorBehavior
-    ],
-
-    validate: function(value) {
-      return value === 'dogs';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/index.html
deleted file mode 100644
index 605c95a..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/index.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>iron-validatable-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      /* no tests */
-      WCT.loadSuites([
-        'iron-validatable-behavior.html',
-        'iron-validatable-behavior.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/iron-validatable-behavior.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/iron-validatable-behavior.html
deleted file mode 100644
index a8040ef..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/iron-validatable-behavior.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>iron-validatable-behavior tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="test-validatable.html">
-  <link rel="import" href="cats-only.html">
-  <link rel="import" href="dogs-only.html">
-
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <test-validatable></test-validatable>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="validators">
-    <template>
-      <cats-only></cats-only>
-      <dogs-only></dogs-only>
-      <test-validatable></test-validatable>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('setting `invalid` sets `aria-invalid=true`', function() {
-        var node = fixture('basic');
-        node.invalid = true;
-        assert.equal(node.getAttribute('aria-invalid'), 'true', 'aria-invalid is set');
-        node.invalid = false;
-        assert.isFalse(node.hasAttribute('aria-invalid'), 'aria-invalid is unset');
-      });
-
-      test('validate() is true if a validator isn\'t set', function() {
-        var node = fixture('basic');
-        var valid = node.validate();
-        assert.isTrue(valid);
-      });
-
-      test('changing the validator works', function() {
-        var node = fixture('validators');
-        var input = node[2];
-
-        // Initially there's no validator, so everything is valid.
-        assert.isTrue(input.validate(''));
-        assert.isTrue(input.validate('cats'));
-
-        // Only valid if the value is 'cats'.
-        input.validator = 'cats-only';
-        assert.isFalse(input.validate('ca'));
-        assert.isTrue(input.validate('cats'));
-
-        // Only valid if the value is 'dogs'.
-        input.validator = 'dogs-only';
-        assert.isFalse(input.validate('cats'));
-        assert.isTrue(input.validate('dogs'));
-      });
-
-    });
-
-  </script>
-
-</body>
diff --git a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/test-validatable.html b/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/test-validatable.html
deleted file mode 100644
index c4af269..0000000
--- a/systrace/catapult/third_party/polymer/components/iron-validatable-behavior/test/test-validatable.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../iron-validatable-behavior.html">
-
-<dom-module id="test-validatable">
-  <template>
-    <content></content>
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'test-validatable',
-
-    behaviors: [
-      Polymer.IronValidatableBehavior
-    ]
-
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/neon-animation/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/README.md b/systrace/catapult/third_party/polymer/components/neon-animation/README.md
deleted file mode 100644
index 29c0753..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/README.md
+++ /dev/null
@@ -1,306 +0,0 @@
-# neon-animation
-
-`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/).
-
-*Warning: The API may change.*
-
-* [A basic animatable element](#basic)
-* [Animation configuration](#configuration)
-  * [Animation types](#configuration-types)
-  * [Configuration properties](#configuration-properties)
-  * [Using multiple animations](#configuration-multiple)
-  * [Running animations encapsulated in children nodes](#configuration-encapsulation)
-* [Page transitions](#page-transitions)
-  * [Shared element animations](#shared-element)
-  * [Declarative page transitions](#declarative-page)
-* [Included animations](#animations)
-* [Demos](#demos)
-
-<a name="basic"></a>
-## A basic animatable element
-
-Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation.
-
-```js
-Polymer({
-  is: 'my-animatable',
-  behaviors: [
-    Polymer.NeonAnimationRunnerBehavior
-  ],
-  properties: {
-    animationConfig: {
-      value: function() {
-        return {
-          // provided by neon-animation/animations/scale-down-animation.html
-          name: 'scale-down-animation',
-          node: this
-        }
-      }
-    }
-  },
-  listeners: {
-    // this event is fired when the animation finishes
-    'neon-animation-finish': '_onNeonAnimationFinish'
-  },
-  animate: function() {
-    // run scale-down-animation
-    this.playAnimation();
-  },
-  _onNeonAnimationFinish: function() {
-    console.log('animation done!');
-  }
-});
-```
-
-[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html)
-
-<a name="configuration"></a>
-## Animation configuration
-
-<a name="configuration-types"></a>
-### Animation types
-
-An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration.
-
-```js
-Polymer({
-  is: 'my-dialog',
-  behaviors: [
-    Polymer.NeonAnimationRunnerBehavior
-  ],
-  properties: {
-    opened: {
-      type: Boolean
-    },
-    animationConfig: {
-      value: function() {
-        return {
-          'entry': {
-            // provided by neon-animation/animations/scale-up-animation.html
-            name: 'scale-up-animation',
-            node: this
-          },
-          'exit': {
-            // provided by neon-animation/animations/fade-out-animation.html
-            name: 'fade-out-animation',
-            node: this
-          }
-        }
-      }
-    }
-  },
-  listeners: {
-    'neon-animation-finish': '_onNeonAnimationFinish'
-  },
-  show: function() {
-    this.opened = true;
-    this.style.display = 'inline-block';
-    // run scale-up-animation
-    this.playAnimation('entry');
-  },
-  hide: function() {
-    this.opened = false;
-    // run fade-out-animation
-    this.playAnimation('exit');
-  },
-  _onNeonAnimationFinish: function() {
-    if (!this.opened) {
-      this.style.display = 'none';
-    }
-  }
-});
-```
-
-[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html)
-
-You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations:
-
-```js
-properties: {
-  entryAnimation: {
-    value: 'scale-up-animation'
-  },
-  exitAnimation: {
-    value: 'fade-out-animation'
-  }
-}
-```
-
-<a name="configuration-properties"></a>
-### Configuration properties
-
-You can pass additional parameters to configure an animation in the animation configuration object.
-All animations should accept the following properties:
-
- * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`.
- * `node`: The target node to apply the animation to. Defaults to `this`.
- * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The
- properties include the following:
-     * `duration`: The duration of the animation in milliseconds.
-     * `delay`: The delay before the start of the animation in milliseconds.
-     * `easing`: A timing function for the animation. Matches the CSS timing function values.
-
-Animations may define additional configuration properties and they are listed in their documentation.
-
-<a name="configuration-multiple"></a>
-### Using multiple animations
-
-Set the animation configuration to an array to combine animations, like this:
-
-```js
-animationConfig: {
-  value: function() {
-    return {
-      // fade-in-animation is run with a 50ms delay from slide-down-animation
-      'entry': [{
-        name: 'slide-down-animation',
-        node: this
-      }, {
-        name: 'fade-in-animation',
-        node: this,
-        timing: {delay: 50}
-      }]
-    }
-  }
-}
-```
-
-<a name="configuration-encapsulation"></a>
-### Running animations encapsulated in children nodes
-
-You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property.
-
-```js
-animationConfig: {
-  value: function() {
-    return {
-      // run fade-in-animation on this, and the entry animation on this.$.myAnimatable
-      'entry': [
-        {name: 'fade-in-animation', node: this},
-        {animatable: this.$.myAnimatable, type: 'entry'}
-      ]
-    }
-  }
-}
-```
-
-<a name="page-transitions"></a>
-## Page transitions
-
-*The artist formerly known as `<core-animated-pages>`*
-
-The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page.
-
-<a name="shared-element"></a>
-### Shared element animations
-
-Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation.
-
-In the incoming page:
-
-```js
-properties: {
-  animationConfig: {
-    value: function() {
-      return {
-        // the incoming page defines the 'entry' animation
-        'entry': {
-          name: 'hero-animation',
-          id: 'hero',
-          toPage: this
-        }
-      }
-    }
-  },
-  sharedElements: {
-    value: function() {
-      return {
-        'hero': this.$.hero
-      }
-    }
-  }
-}
-```
-
-In the outgoing page:
-
-```js
-properties: {
-  animationConfig: {
-    value: function() {
-      return {
-        // the outgoing page defines the 'exit' animation
-        'exit': {
-          name: 'hero-animation',
-          id: 'hero',
-          fromPage: this
-        }
-      }
-    }
-  },
-  sharedElements: {
-    value: function() {
-      return {
-        'hero': this.$.otherHero
-      }
-    }
-  }
-}
-```
-
-<a name="declarative-page"></a>
-### Declarative page transitions
-
-For convenience, if you define the `entry-animation` and `exit-animation` attributes on `<neon-animated-pages>`, those animations will apply for all page transitions.
-
-For example:
-
-```js
-<neon-animated-pages id="pages" class="flex" selected="[[selected]]" entry-animation="slide-from-right-animation" exit-animation="slide-left-animation">
-  <neon-animatable>1</neon-animatable>
-  <neon-animatable>2</neon-animatable>
-  <neon-animatable>3</neon-animatable>
-  <neon-animatable>4</neon-animatable>
-  <neon-animatable>5</neon-animatable>
-</neon-animated-pages>
-```
-
-The new page will slide in from the right, and the old page slide away to the left.
-
-<a name="animations"></a>
-## Included animations
-
-Single element animations:
-
- * `fade-in-animation` Animates opacity from `0` to `1`;
- * `fade-out-animation` Animates opacity from `1` to `0`;
- * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`;
- * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`;
- * `slide-down-animation` Animates transform from `none` to `translateY(100%)`;
- * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`;
- * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`;
- * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`;
- * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`;
- * `slide-right-animation` Animates transform from `none` to `translateX(100%)`;
- * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`;
- * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`;
- * `transform-animation` Animates a custom transform.
-
-Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties.
-
-Shared element animations
-
- * `hero-animation` Animates an element such that it looks like it scales and transforms from another element.
- * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element.
-
-Group animations
- * `cascaded-animation` Applys an animation to an array of elements with a delay between each.
-
-<a name="demos"></a>
-## Demos
-
- * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html)
- * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html)
- * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width)
- * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html)
- * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html)
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/cascaded-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/cascaded-animation.html
deleted file mode 100644
index 5399753..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/cascaded-animation.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<cascaded-animation>` applies an animation on an array of elements with a delay between each.
-the delay defaults to 50ms.
-
-Configuration:
-```
-{
-  name: 'cascaded-animation',
-  animation: <animation-name>,
-  nodes: <array-of-nodes>,
-  nodeDelay: <node-delay-in-ms>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'cascaded-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    /**
-     * @param {{
-     *   animation: string,
-     *   nodes: !Array<!Element>,
-     *   nodeDelay: (number|undefined),
-     *   timing: (Object|undefined)
-     *  }} config
-     */
-    configure: function(config) {
-      this._animations = [];
-      var nodes = config.nodes;
-      var effects = [];
-      var nodeDelay = config.nodeDelay || 50;
-
-      config.timing = config.timing || {};
-      config.timing.delay = config.timing.delay || 0;
-
-      var oldDelay = config.timing.delay;
-      var abortedConfigure;
-      for (var node, index = 0; node = nodes[index]; index++) {
-        config.timing.delay += nodeDelay;
-        config.node = node;
-
-        var animation = document.createElement(config.animation);
-        if (animation.isNeonAnimation) {
-          var effect = animation.configure(config);
-
-          this._animations.push(animation);
-          effects.push(effect);
-        } else {
-          console.warn(this.is + ':', config.animation, 'not found!');
-          abortedConfigure = true;
-          break;
-        }
-      }
-      config.timing.delay = oldDelay;
-      config.node = null;
-      // if a bad animation was configured, abort config.
-      if (abortedConfigure) {
-        return;
-      }
-
-      this._effect = new GroupEffect(effects);
-      return this._effect;
-    },
-
-    complete: function() {
-      for (var animation, index = 0; animation = this._animations[index]; index++) {
-        animation.complete(animation.config);
-      }
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/fade-in-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/fade-in-animation.html
deleted file mode 100644
index cdb74e3..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/fade-in-animation.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<fade-in-animation>` animates the opacity of an element from 0 to 1.
-
-Configuration:
-```
-{
-  name: 'fade-in-animation',
-  node: <node>
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'fade-in-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      this._effect = new KeyframeEffect(node, [
-        {'opacity': '0'},
-        {'opacity': '1'}
-      ], this.timingFromConfig(config));
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/fade-out-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/fade-out-animation.html
deleted file mode 100644
index 82cc399..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/fade-out-animation.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<fade-out-animation>` animates the opacity of an element from 1 to 0.
-
-Configuration:
-```
-{
-  name: 'fade-out-animation',
-  node: <node>
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'fade-out-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      this._effect = new KeyframeEffect(node, [
-        {'opacity': '1'},
-        {'opacity': '0'}
-      ], this.timingFromConfig(config));
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/hero-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/hero-animation.html
deleted file mode 100644
index 176bee7..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/hero-animation.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-shared-element-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<hero-animation>` is a shared element animation that scales and transform an element such that it
-appears to be shared between two pages. Use this in `<neon-animated-pages>`. The source page
-should use this animation in an 'exit' animation and set the `fromPage` configuration property to
-itself, and the destination page should use this animation in an `entry` animation and set the
-`toPage` configuration property to itself. They should also define the hero elements in the
-`sharedElements` property (not a configuration property, see
-`Polymer.NeonSharedElementAnimatableBehavior`).
-
-Configuration:
-```
-{
-  name: 'hero-animation',
-  id: <shared-element-id>,
-  timing: <animation-timing>,
-  toPage: <node>, /* define for the destination page */
-  fromPage: <node>, /* define for the source page */
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'hero-animation',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var shared = this.findSharedElements(config);
-      if (!shared) {
-        return;
-      }
-
-      var fromRect = shared.from.getBoundingClientRect();
-      var toRect = shared.to.getBoundingClientRect();
-
-      var deltaLeft = fromRect.left - toRect.left;
-      var deltaTop = fromRect.top - toRect.top;
-      var deltaWidth = fromRect.width / toRect.width;
-      var deltaHeight = fromRect.height / toRect.height;
-
-      this._effect = new KeyframeEffect(shared.to, [
-        {'transform': 'translate(' + deltaLeft + 'px,' + deltaTop + 'px) scale(' + deltaWidth + ',' + deltaHeight + ')'},
-        {'transform': 'none'}
-      ], this.timingFromConfig(config));
-
-      this.setPrefixedProperty(shared.to, 'transformOrigin', '0 0');
-      shared.to.style.zIndex = 10000;
-      shared.from.style.visibility = 'hidden';
-
-      return this._effect;
-    },
-
-    complete: function(config) {
-      var shared = this.findSharedElements(config);
-      if (!shared) {
-        return null;
-      }
-      shared.to.style.zIndex = '';
-      shared.from.style.visibility = '';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/opaque-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/opaque-animation.html
deleted file mode 100644
index e3a0072..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/opaque-animation.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<opaque-animation>` makes an element `opacity:1` for the duration of the animation. Used to prevent
-webkit/safari from drawing a frame before an animation for elements that animate from display:none.
--->
-
-<script>
-
-  Polymer({
-
-    is: 'opaque-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      this._effect = new KeyframeEffect(node, [
-        {'opacity': '1'},
-        {'opacity': '1'}
-      ], this.timingFromConfig(config));
-      node.style.opacity = '0';
-      return this._effect;
-    },
-
-    complete: function(config) {
-      config.node.style.opacity = '';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/reverse-ripple-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/reverse-ripple-animation.html
deleted file mode 100644
index f1f9de9..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/reverse-ripple-animation.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-shared-element-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<reverse-ripple-animation>` scales and transform an element such that it appears to ripple down from this element, to either
-a shared element, or a screen position.
-
-If using as a shared element animation in `<neon-animated-pages>`, use this animation in an `exit`
-animation in the source page and in an `entry` animation in the destination page. Also, define the
-reverse-ripple elements in the `sharedElements` property (not a configuration property, see
-`Polymer.NeonSharedElementAnimatableBehavior`).
-If using a screen position, define the `gesture` property.
-Configuration:
-```
-{
-  name: 'reverse-ripple-animation`.
-  id: <shared-element-id>, /* set this or gesture */
-  gesture: {x: <page-x>, y: <page-y>}, /* set this or id */
-  timing: <animation-timing>,
-  toPage: <node>, /* define for the destination page */
-  fromPage: <node>, /* define for the source page */
-}
-```
--->
-
-<script>
-  Polymer({
-    is: 'reverse-ripple-animation',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var shared = this.findSharedElements(config);
-      if (!shared) {
-        return null;
-      }
-
-      var translateX, translateY;
-      var fromRect = shared.from.getBoundingClientRect();
-      if (config.gesture) {
-        translateX = config.gesture.x - (fromRect.left + (fromRect.width / 2));
-        translateY = config.gesture.y - (fromRect.top + (fromRect.height / 2));
-      } else {
-        var toRect = shared.to.getBoundingClientRect();
-        translateX = (toRect.left + (toRect.width / 2)) - (fromRect.left + (fromRect.width / 2));
-        translateY = (toRect.top + (toRect.height / 2)) - (fromRect.top + (fromRect.height / 2));
-      }
-      var translate = 'translate(' + translateX + 'px,' + translateY + 'px)';
-
-      var size = Math.max(fromRect.width + Math.abs(translateX) * 2, fromRect.height + Math.abs(translateY) * 2);
-      var diameter = Math.sqrt(2 * size * size);
-      var scaleX = diameter / fromRect.width;
-      var scaleY = diameter / fromRect.height;
-      var scale = 'scale(' + scaleX + ',' + scaleY + ')';
-
-      this._effect = new KeyframeEffect(shared.from, [
-        {'transform': translate + ' ' + scale},
-        {'transform': translate + ' scale(0)'}
-      ], this.timingFromConfig(config));
-
-      this.setPrefixedProperty(shared.from, 'transformOrigin', '50% 50%');
-      shared.from.style.borderRadius = '50%';
-
-      return this._effect;
-    },
-
-    complete: function() {
-      if (this.sharedElements) {
-        this.setPrefixedProperty(this.sharedElements.from, 'transformOrigin', '');
-        this.sharedElements.from.style.borderRadius = '';
-      }
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/ripple-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/ripple-animation.html
deleted file mode 100644
index d97186c..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/ripple-animation.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-shared-element-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<ripple-animation>` scales and transform an element such that it appears to ripple from either
-a shared element, or from a screen position, to full screen.
-
-If using as a shared element animation in `<neon-animated-pages>`, use this animation in an `exit`
-animation in the source page and in an `entry` animation in the destination page. Also, define the
-hero elements in the `sharedElements` property (not a configuration property, see
-`Polymer.NeonSharedElementAnimatableBehavior`).
-
-If using a screen position, define the `gesture` property.
-
-Configuration:
-```
-{
-  name: 'ripple-animation`.
-  id: <shared-element-id>, /* set this or gesture */
-  gesture: {x: <page-x>, y: <page-y>}, /* set this or id */
-  timing: <animation-timing>,
-  toPage: <node>, /* define for the destination page */
-  fromPage: <node>, /* define for the source page */
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'ripple-animation',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var shared = this.findSharedElements(config);
-      if (!shared) {
-        return null;
-      }
-
-      var translateX, translateY;
-      var toRect = shared.to.getBoundingClientRect();
-      if (config.gesture) {
-        translateX = config.gesture.x - (toRect.left + (toRect.width / 2));
-        translateY = config.gesture.y - (toRect.top + (toRect.height / 2));
-      } else {
-        var fromRect = shared.from.getBoundingClientRect();
-        translateX = (fromRect.left + (fromRect.width / 2)) - (toRect.left + (toRect.width / 2));
-        translateY = (fromRect.top + (fromRect.height / 2)) - (toRect.top + (toRect.height / 2));
-      }
-      var translate = 'translate(' + translateX + 'px,' + translateY + 'px)';
-
-      var size = Math.max(toRect.width + Math.abs(translateX) * 2, toRect.height + Math.abs(translateY) * 2);
-      var diameter = Math.sqrt(2 * size * size);
-      var scaleX = diameter / toRect.width;
-      var scaleY = diameter / toRect.height;
-      var scale = 'scale(' + scaleX + ',' + scaleY + ')';
-
-      this._effect = new KeyframeEffect(shared.to, [
-        {'transform': translate + ' scale(0)'},
-        {'transform': translate + ' ' + scale}
-      ], this.timingFromConfig(config));
-
-      this.setPrefixedProperty(shared.to, 'transformOrigin', '50% 50%');
-      shared.to.style.borderRadius = '50%';
-
-      return this._effect;
-    },
-
-    complete: function() {
-      if (this.sharedElements) {
-        this.setPrefixedProperty(this.sharedElements.to, 'transformOrigin', '');
-        this.sharedElements.to.style.borderRadius = '';
-      }
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/scale-down-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/scale-down-animation.html
deleted file mode 100644
index 1dcb171..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/scale-down-animation.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<scale-down-animation>` animates the scale transform of an element from 1 to 0. By default it
-scales in both the x and y axes.
-
-Configuration:
-```
-{
-  name: 'scale-down-animation',
-  node: <node>,
-  axis: 'x' | 'y' | '',
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'scale-down-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      var scaleProperty = 'scale(0, 0)';
-      if (config.axis === 'x') {
-        scaleProperty = 'scale(0, 1)';
-      } else if (config.axis === 'y') {
-        scaleProperty = 'scale(1, 0)';
-      }
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'scale(1,1)'},
-        {'transform': scaleProperty}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/scale-up-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/scale-up-animation.html
deleted file mode 100644
index 42ec3f3..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/scale-up-animation.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<scale-up-animation>` animates the scale transform of an element from 0 to 1. By default it
-scales in both the x and y axes.
-
-Configuration:
-```
-{
-  name: 'scale-up-animation',
-  node: <node>,
-  axis: 'x' | 'y' | '',
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'scale-up-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      var scaleProperty = 'scale(0)';
-      if (config.axis === 'x') {
-        scaleProperty = 'scale(0, 1)';
-      } else if (config.axis === 'y') {
-        scaleProperty = 'scale(1, 0)';
-      }
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': scaleProperty},
-        {'transform': 'scale(1, 1)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-down-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-down-animation.html
deleted file mode 100644
index 9db28dd..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-down-animation.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-down-animation>` animates the transform of an element from `none` `translateY(100%)`.
-The `transformOrigin` defaults to `50% 0`.
-
-Configuration:
-```
-{
-  name: 'slide-down-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-down-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'translateY(0%)'},
-        {'transform': 'translateY(100%)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-bottom-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-bottom-animation.html
deleted file mode 100644
index d1156e9..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-bottom-animation.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-from-bottom-animation>` animates the transform of an element from `none` to `translateY(100%)`.
-The `transformOrigin` defaults to `50% 0`.
-
-Configuration:
-```
-{
-  name: 'slide-from-bottom-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-from-bottom-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'translateY(100%)'},
-        {'transform': 'translateY(0)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-left-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-left-animation.html
deleted file mode 100644
index 5386c9b..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-left-animation.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-from-left-animation>` animates the transform of an element from
-`translateX(-100%)` to `none`.
-The `transformOrigin` defaults to `0 50%`.
-
-Configuration:
-```
-{
-  name: 'slide-from-left-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-from-left-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'translateX(-100%)'},
-        {'transform': 'none'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-right-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-right-animation.html
deleted file mode 100644
index 2afb591..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-right-animation.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-from-right-animation>` animates the transform of an element from
-`translateX(100%)` to `none`.
-The `transformOrigin` defaults to `0 50%`.
-
-Configuration:
-```
-{
-  name: 'slide-from-right-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-from-right-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'translateX(100%)'},
-        {'transform': 'none'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-top-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-top-animation.html
deleted file mode 100644
index c0a4881..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-from-top-animation.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-from-top-animation>` animates the transform of an element from `translateY(-100%)` to
-`none`. The `transformOrigin` defaults to `50% 0`.
-
-Configuration:
-```
-{
-  name: 'slide-from-top-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-from-top-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'translateY(-100%)'},
-        {'transform': 'translateY(0%)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-left-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-left-animation.html
deleted file mode 100644
index da80a6b..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-left-animation.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-left-animation>` animates the transform of an element from `none` to `translateX(-100%)`.
-The `transformOrigin` defaults to `0 50%`.
-
-Configuration:
-```
-{
-  name: 'slide-left-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-left-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'none'},
-        {'transform': 'translateX(-100%)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-right-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-right-animation.html
deleted file mode 100644
index 99b5794..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-right-animation.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-right-animation>` animates the transform of an element from `none` to `translateX(100%)`.
-The `transformOrigin` defaults to `0 50%`.
-
-Configuration:
-```
-{
-  name: 'slide-right-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-right-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'none'},
-        {'transform': 'translateX(100%)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '0 50%');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-up-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-up-animation.html
deleted file mode 100644
index 6464e78..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/slide-up-animation.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<slide-up-animation>` animates the transform of an element from `translateY(0)` to
-`translateY(-100%)`. The `transformOrigin` defaults to `50% 0`.
-
-Configuration:
-```
-{
-  name: 'slide-up-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'slide-up-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': 'translate(0)'},
-        {'transform': 'translateY(-100%)'}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      } else {
-        this.setPrefixedProperty(node, 'transformOrigin', '50% 0');
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/animations/transform-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/animations/transform-animation.html
deleted file mode 100644
index 2e50444..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/animations/transform-animation.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-animation-behavior.html">
-<link rel="import" href="../web-animations.html">
-
-<!--
-`<transform-animation>` animates a custom transform on an element. Use this to animate multiple
-transform properties, or to apply a custom transform value.
-
-Configuration:
-```
-{
-  name: 'transform-animation',
-  node: <node>,
-  transformOrigin: <transform-origin>,
-  transformFrom: <transform-from-string>,
-  transformTo: <transform-to-string>,
-  timing: <animation-timing>
-}
-```
--->
-
-<script>
-
-  Polymer({
-
-    is: 'transform-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    /**
-     * @param {{
-     *   node: !Element,
-     *   transformOrigin: (string|undefined),
-     *   transformFrom: (string|undefined),
-     *   transformTo: (string|undefined),
-     *   timing: (Object|undefined)
-     * }} config
-     */
-    configure: function(config) {
-      var node = config.node;
-      var transformFrom = config.transformFrom || 'none';
-      var transformTo = config.transformTo || 'none';
-
-      this._effect = new KeyframeEffect(node, [
-        {'transform': transformFrom},
-        {'transform': transformTo}
-      ], this.timingFromConfig(config));
-
-      if (config.transformOrigin) {
-        this.setPrefixedProperty(node, 'transformOrigin', config.transformOrigin);
-      }
-
-      return this._effect;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/bower.json b/systrace/catapult/third_party/polymer/components/neon-animation/bower.json
deleted file mode 100644
index c3e121e..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/bower.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "name": "neon-animation",
-  "description": "A system for animating Polymer-based web components",
-  "version": "1.2.5",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "web-animations"
-  ],
-  "main": [
-    "neon-animated-pages.html",
-    "neon-animatable-behavior.html",
-    "neon-animation-behavior.html",
-    "neon-animation-runner-behavior.html",
-    "neon-shared-element-animatable-behavior.html",
-    "neon-shared-element-animation-behavior.html",
-    "neon-animatable.html",
-    "neon-animations.html"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/neon-animation"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/neon-animation",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-meta": "PolymerElements/iron-meta#^1.0.0",
-    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
-    "iron-selector": "PolymerElements/iron-selector#^1.0.0",
-    "web-animations-js": "web-animations/web-animations-js#^2.2.0"
-  },
-  "devDependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/index.html
deleted file mode 100644
index 4499346..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/index.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: card</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="../../neon-animated-pages.html">
-    <link rel="import" href="../../neon-animations.html">
-    <link rel="import" href="../../../paper-styles/typography.html">
-    <link rel="import" href="x-card.html">
-    <link rel="import" href="x-cards-list.html">
-
-    <style is="custom-style">
-
-      body {
-        padding: 15px;
-        @apply(--layout-fullbleed);
-        @apply(--paper-font-common-base);
-      }
-
-      neon-animated-pages {
-        height: 100%;
-      }
-
-      .large {
-        width: 100%
-      }
-
-      .button {
-        text-align: center;
-        width: 120px;
-        height: 32px;
-        line-height: 32px;
-        border-radius: 2px;
-        font-size: 0.9em;
-        background-color: #fff;
-        color: #646464;
-      }
-
-      .button.blue {
-        background-color: #4285f4;
-        color: #fff;
-      }
-
-      .button.raised {
-        box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
-      }
-
-      .button.back {
-        position: fixed;
-        top: 30px;
-        left: 30px;
-      }
-
-      .card-contents {
-        @apply(--layout-vertical);
-        @apply(--layout-center-center);
-        @apply(--layout-fit);
-      }
-
-      .button-container {
-        @apply(--layout-flex);
-        @apply(--layout-horizontal);
-        @apply(--layout-around-justified);
-      }
-    </style>
-
-  </head>
-  <body>
-
-    <template is="dom-bind">
-      <neon-animated-pages id="pages" selected="0">
-          <x-cards-list id="list">
-            <div class="card-contents">
-              <h2>Choose a subject</h2>
-              <div class="button-container large">
-                <div class="blue raised button" on-click="_onPolymerClick">
-                  POLYMER
-                </div>
-                <div class="blue raised button" on-click="_onAngularClick">
-                  ANGULAR
-                </div>
-              </div>
-            </div>
-          </x-cards-list>
-
-          <x-card>
-            <div class="card-contents">
-              <div class="raised back button" on-click="_onBackClick">
-                BACK
-              </div>
-              <h2>Polymer</h2>
-              <p>
-                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
-                tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
-                quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
-                consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
-                cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
-                proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-              </p>
-            </div>
-          </x-card>
-
-          <x-card>
-            <div class="card-contents">
-              <div class="raised back button" on-click="_onBackClick">
-                BACK
-              </div>
-              <h2>Angular</h2>
-              <p>
-                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
-                tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
-                quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
-                consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
-                cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
-                proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-              </p>
-            </div>
-          </x-card>
-
-        </neon-animated-pages>
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-
-      scope._onPolymerClick = function(event) {
-        this.$.list.sharedElements = {
-          'ripple': event.target,
-          'reverse-ripple': event.target
-        };
-        this.$.pages.selected = 1;
-      };
-
-      scope._onAngularClick = function(event) {
-        this.$.list.sharedElements = {
-          'ripple': event.target,
-          'reverse-ripple': event.target
-        };
-        this.$.pages.selected = 2;
-      };
-
-      scope._onBackClick = function(event) {
-        this.$.pages.selected = 0;
-      };
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/x-card.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/x-card.html
deleted file mode 100644
index 92885d2..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/x-card.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-
-<dom-module id="x-card">
-  <template>
-    <style>
-      :host {
-        display: block;
-        overflow: hidden;
-      }
-      #placeholder {
-        opacity: 0;
-        background-color: grey;
-        @apply(--layout-fit);
-      }
-    </style>
-
-    <div id="placeholder"></div>
-    <div id="container">
-      <content select="div"></content>
-    </div>
-
-  </template>
-</dom-module>
-
-<script>
-(function() {
-  Polymer({
-    is: 'x-card',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-      animationConfig: {
-        value: function() {
-          return {
-            'entry': [{
-              name: 'ripple-animation',
-              id: 'ripple',
-              toPage: this
-            }, {
-              name: 'fade-out-animation',
-              node: this.$.placeholder,
-              timing: {
-                delay: 250
-              }
-            }, {
-              name: 'fade-in-animation',
-              node: this.$.container,
-              timing: {
-                delay: 50
-              }
-            }],
-
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this.$.container,
-              timing: {
-                duration: 0
-              }
-            }, {
-              name: 'reverse-ripple-animation',
-              id: 'reverse-ripple',
-              fromPage: this
-            }]
-          };
-        }
-      },
-
-      sharedElements: {
-        value: function() {
-          return {
-            'ripple': this.$.placeholder,
-            'reverse-ripple': this.$.placeholder
-          };
-        }
-      }
-    }
-  });
-})();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/x-cards-list.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/x-cards-list.html
deleted file mode 100644
index b817698..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/card/x-cards-list.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-
-<dom-module id="x-cards-list">
-  <template>
-    <style>
-      :host {
-        display: block;
-        overflow: hidden;
-      }
-
-      #placeholder {
-        opacity: 0;
-        background-color: grey;
-        @apply(--layout-fit);
-      }
-    </style>
-    
-    <div id="placeholder"></div>
-    <div id="container">
-      <content select="div"></content>
-    </div>
-
-  </template>
-</dom-module>
-
-<script>
-(function() {
-  Polymer({
-    is: 'x-cards-list',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-      animationConfig: {
-        value: function() {
-          return {
-            'entry': [{
-              name: 'reverse-ripple-animation',
-              id: 'reverse-ripple',
-              toPage: this
-            }],
-
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this.$.container,
-              timing: {
-                delay: 150,
-                duration: 0
-              }
-            }, {
-              name: 'ripple-animation',
-              id: 'ripple',
-              fromPage: this
-            }]
-          };
-        }
-      }
-    }
-  });
-})();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/declarative/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/declarative/index.html
deleted file mode 100644
index 26ba53f..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/declarative/index.html
+++ /dev/null
@@ -1,132 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: declarative</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="../../../paper-styles/typography.html">
-    <link rel="import" href="../../../paper-styles/color.html">
-    <link rel="import" href="../../neon-animated-pages.html">
-    <link rel="import" href="../../neon-animatable.html">
-    <link rel="import" href="../../neon-animations.html">
-
-    <style is="custom-style">
-      body {
-        overflow: hidden;
-        @apply(--layout-fullbleed);
-        @apply(--layout-vertical);
-      }
-
-      .toolbar {
-        position: relative;
-
-        padding: 8px;
-
-        background-color: white;
-
-        z-index: 12;
-      }
-
-      neon-animated-pages {
-        @apply(--layout-flex);
-      }
-
-      neon-animatable {
-        color: white;
-        @apply(--layout-horizontal);
-        @apply(--layout-center-center);
-        @apply(--paper-font-display4);
-      }
-
-      neon-animatable:nth-child(1) {
-        background: var(--paper-red-500);
-      }
-
-      neon-animatable:nth-child(2) {
-        background: var(--paper-blue-500);
-      }
-
-      neon-animatable:nth-child(3) {
-        background: var(--paper-orange-500);
-      }
-
-      neon-animatable:nth-child(4) {
-        background: var(--paper-green-500);
-      }
-
-      neon-animatable:nth-child(5) {
-        background: var(--paper-purple-500);
-      }
-
-    </style>
-
-  </head>
-  <body>
-
-    <template is="dom-bind">
-
-      <div class="toolbar">
-        <button on-click="_onPrevClick">&#8678;</button>
-        <button on-click="_onNextClick">&#8680;</button>
-        <button on-click="_onUpClick">&#8679;</button>
-        <button on-click="_onDownClick">&#8681;</button>
-      </div>
-
-      <neon-animated-pages id="pages" selected="[[selected]]" entry-animation="[[entryAnimation]]" exit-animation="[[exitAnimation]]">
-        <neon-animatable>1</neon-animatable>
-        <neon-animatable>2</neon-animatable>
-        <neon-animatable>3</neon-animatable>
-        <neon-animatable>4</neon-animatable>
-        <neon-animatable>5</neon-animatable>
-      </neon-animated-pages>
-
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-      scope.selected = 0;
-
-      scope._onPrevClick = function() {
-        this.entryAnimation = 'slide-from-left-animation';
-        this.exitAnimation = 'slide-right-animation';
-        this.selected = this.selected === 0 ? 4 : (this.selected - 1);
-      }
-
-      scope._onNextClick = function() {
-        this.entryAnimation = 'slide-from-right-animation';
-        this.exitAnimation = 'slide-left-animation';
-        this.selected = this.selected === 4 ? 0 : (this.selected + 1);
-      }
-
-      scope._onUpClick = function() {
-        this.entryAnimation = 'slide-from-top-animation';
-        this.exitAnimation = 'slide-down-animation';
-        this.selected = this.selected === 4 ? 0 : (this.selected + 1);
-      }
-
-      scope._onDownClick = function() {
-        this.entryAnimation = 'slide-from-bottom-animation';
-        this.exitAnimation = 'slide-up-animation';
-        this.selected = this.selected === 0 ? 4 : (this.selected - 1);
-      }
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/index.html
deleted file mode 100644
index 8b3875e..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/index.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animation demo: basic</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="my-animatable.html">
-    <link rel="import" href="my-dialog.html">
-
-  </head>
-  <style>
-    my-animatable {
-      margin-top: 50px;
-    }
-  </style>
-  <body>
-
-    <template is="dom-bind">
-
-      <button on-click="_onCircleButtonClick">toggle circle</button>
-      <button on-click="_onDialogButtonClick">toggle dialog</button>
-
-      <div style="text-align: center">
-        <my-dialog>Hello World!</my-dialog>
-      </div>
-
-      <my-animatable></my-animatable>
-
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-
-      scope._onCircleButtonClick = function(event) {
-        var node = document.querySelector('my-animatable');
-        if (node) {
-          node.animate();
-        }
-      };
-
-      scope._onDialogButtonClick = function(event) {
-        var node = document.querySelector('my-dialog');
-        if (node) {
-          if (node.opened) {
-            node.hide();
-          } else {
-            node.show();
-          }
-        }
-      };
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/my-animatable.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/my-animatable.html
deleted file mode 100644
index 5063f74..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/my-animatable.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../neon-animation-runner-behavior.html">
-<link rel="import" href="../../animations/scale-down-animation.html">
-
-<dom-module id="my-animatable">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        border-radius: 50%;
-        width: 300px;
-        height: 300px;
-        background: orange;
-      }
-    </style>
-    <content></content>
-
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'my-animatable',
-
-    behaviors: [
-      Polymer.NeonAnimationRunnerBehavior
-    ],
-
-    properties: {
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            name: 'scale-down-animation',
-            node: this
-          }
-        }
-      }
-
-    },
-
-    listeners: {
-      'neon-animation-finish': '_onNeonAnimationFinish'
-    },
-
-    animate: function() {
-      this.playAnimation();
-    },
-
-    _onNeonAnimationFinish: function() {
-      console.log('animation finish!');
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/my-dialog.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/my-dialog.html
deleted file mode 100644
index bd3344c..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/doc/my-dialog.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-styles/shadow.html">
-<link rel="import" href="../../neon-animation-runner-behavior.html">
-<link rel="import" href="../../animations/scale-up-animation.html">
-<link rel="import" href="../../animations/fade-out-animation.html">
-
-
-<dom-module id="my-dialog">
-  <template>
-    <style>
-      :host {
-        display: none;
-        padding: 16px;
-        background: white;
-        color: black;
-        margin: 0 auto;
-        z-index: 100;
-        position: absolute;
-        @apply(--shadow-elevation-2dp);
-      }
-    </style>
-    <content></content>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'my-dialog',
-
-    behaviors: [
-      Polymer.NeonAnimationRunnerBehavior
-    ],
-
-    properties: {
-
-      opened: {
-        type: Boolean
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'scale-up-animation',
-              node: this
-            }],
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this
-            }]
-          }
-        }
-      }
-
-    },
-
-    listeners: {
-      'neon-animation-finish': '_onAnimationFinish'
-    },
-
-    _onAnimationFinish: function() {
-      if (!this.opened) {
-        this.style.display = '';
-      }
-    },
-
-    show: function() {
-      this.opened = true;
-      this.style.display = 'inline-block';
-      this.playAnimation('entry');
-    },
-
-    hide: function() {
-      this.opened = false;
-      this.playAnimation('exit');
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/dropdown/animated-dropdown.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/dropdown/animated-dropdown.html
deleted file mode 100644
index 9a61530..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/dropdown/animated-dropdown.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-styles/shadow.html">
-<link rel="import" href="../../neon-animation-runner-behavior.html">
-
-<dom-module id="animated-dropdown">
-  <template>
-    <style>
-      :host {
-        display: none;
-        padding: 16px;
-        background: white;
-        color: black;
-
-        @apply(--shadow-elevation-2dp);
-      }
-    </style>
-    <content></content>
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'animated-dropdown',
-
-    behaviors: [
-      Polymer.NeonAnimationRunnerBehavior
-    ],
-
-    properties: {
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'scale-up-animation',
-              node: this,
-              transformOrigin: '0 0'
-            }],
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this
-            }]
-          }
-        }
-      },
-
-      _showing: {
-        type: Boolean,
-        value: false
-      }
-
-    },
-
-    listeners: {
-      'neon-animation-finish': '_onAnimationFinish'
-    },
-
-    _onAnimationFinish: function() {
-      if (this._showing) {
-      } else {
-        this.style.display = '';
-      }
-    },
-
-    show: function() {
-      this.style.display = 'inline-block';
-      this._showing = true;
-      this.playAnimation('entry');
-    },
-
-    hide: function() {
-      this._showing = false;
-      this.playAnimation('exit');
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/dropdown/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/dropdown/index.html
deleted file mode 100644
index b238474..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/dropdown/index.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: dropdown</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../neon-animated-pages.html">
-    <link rel="import" href="../../neon-animations.html">
-    <link rel="import" href="animated-dropdown.html">
-
-  </head>
-  <body>
-
-    <template is="dom-bind">
-
-      <button dropdown-id="dropdown" on-click="_onButtonClick">dropdown</button>
-      <br>
-      <animated-dropdown id="dropdown" on-click="_onDropdownClick">Hello world!</animated-dropdown>
-
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-
-      scope._onButtonClick = function(event) {
-        var dropdown = document.querySelector('#' + event.target.getAttribute('dropdown-id'));
-        if (dropdown) {
-          dropdown.show();
-        }
-      };
-
-      scope._onDropdownClick = function(event) {
-        event.target.hide();
-      };
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/animated-grid.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/animated-grid.html
deleted file mode 100644
index a268936..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/animated-grid.html
+++ /dev/null
@@ -1,164 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-styles/typography.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-<link rel="import" href="../shared-styles.html">
-
-<dom-module id="animated-grid">
-  <template>
-    <style include="shared-styles"></style>
-    <style>
-
-      :host {
-        display: block;
-        background: #000;
-      }
-
-      .tile {
-        display: inline-block;
-        float: left;
-        vertical-align: top;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-
-        @apply(--paper-font-title);
-        @apply(--layout-vertical);
-        @apply(--layout-center-center);
-      }
-
-      .tile:nth-of-type(1) {
-        width: calc(100% / 3);
-        height: calc(100% / 3 * 2);
-      }
-
-      .tile:nth-of-type(4) {
-        width: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(5) {
-        width: calc(100% / 3);
-        height: calc(100% / 3 * 2);
-      }
-
-      .tile:nth-of-type(8) {
-        width: calc(100% / 3);
-        height: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(9) {
-        position: absolute;
-        top: calc(100% / 3 * 2);
-        left: 0;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(10) {
-        position: absolute;
-        top: calc(100% / 3 * 2);
-        left: calc(100% / 6);;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-      }
-    </style>
-
-    <template is="dom-repeat" items="[[config]]">
-      <div class$="[[_computeTileClass(item.color)]]">
-        <span>[[item.value]]</span>
-      </div>
-    </template>
-
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'animated-grid',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      config: {
-        type: Array,
-        value: function() {
-          return [
-            {value: 1, color: 'blue'},
-            {value: 2, color: 'red'},
-            {value: 3, color: 'blue'},
-            {value: 4, color: 'green'},
-            {value: 5, color: 'yellow'},
-            {value: 6, color: 'blue'},
-            {value: 7, color: 'red'},
-            {value: 8, color: 'green'},
-            {value: 9, color: 'yellow'},
-            {value: 10, color: 'red'}
-          ]
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'exit': [{
-              name: 'ripple-animation',
-              id: 'ripple',
-              fromPage: this
-            }, {
-              name: 'hero-animation',
-              id: 'hero',
-              fromPage: this
-            }]
-          }
-        }
-      }
-
-    },
-
-    listeners: {
-      click: '_onClick'
-    },
-
-    _computeTileClass: function(color) {
-      return 'tile ' + color + '-300';
-    },
-
-    _onClick: function(event) {
-      var target = event.target;
-      while (target !== this && !target._templateInstance) {
-        target = target.parentNode;
-      }
-
-      // configure the page animation
-      this.sharedElements = {
-        'hero': target,
-        'ripple': target
-      };
-      this.animationConfig['exit'][0].gesture = {
-        x: event.x || event.pageX,
-        y: event.y || event.pageY
-      };
-
-      this.fire('tile-click', {
-        tile: target,
-        data: target._templateInstance.item
-      });
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/fullsize-page-with-card.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/fullsize-page-with-card.html
deleted file mode 100644
index 63d35bb..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/fullsize-page-with-card.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-<link rel="import" href="../../../paper-styles/color.html">
-<link rel="import" href="../shared-styles.html">
-
-<dom-module id="fullsize-page-with-card">
-  <template>
-    <style include="shared-styles"></style>
-    <style>
-
-      :host {
-        display: block;
-      }
-
-      .fixed {
-        position: fixed;
-        top: 0;
-        left: 0;
-        height: 100vh;
-        width: 100vw;
-      }
-
-      .card {
-        position: relative;
-        margin: 200px 100px 0;
-        height: 700px;
-      }
-
-    </style>
-
-    <div id="fixed" class$="[[_computeFixedBackgroundClass(color)]]"></div>
-    <div id="card" class$="[[_computeCardClass(color)]]"></div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'fullsize-page-with-card',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      color: {
-        type: String
-      },
-
-      sharedElements: {
-        type: Object,
-        value: function() {
-          return {
-            'hero': this.$.card,
-            'ripple': this.$.fixed
-          }
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'ripple-animation',
-              id: 'ripple',
-              toPage: this,
-            }, {
-              name: 'hero-animation',
-              id: 'hero',
-              toPage: this,
-              timing: {
-                delay: 150
-              }
-            }],
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this.$.fixed
-            }, {
-              name: 'transform-animation',
-              transformFrom: 'none',
-              transformTo: 'translate(0px,-200vh) scale(0.9,1)',
-              node: this.$.card
-            }]
-          }
-        }
-      }
-
-    },
-
-    _computeCardClass: function(color) {
-      var cls = 'card';
-      if (color) {
-        cls += ' ' + color + '-300';
-      }
-      return cls;
-    },
-
-    _computeFixedBackgroundClass: function(color) {
-      var cls = 'fixed';
-      if (color) {
-        cls += ' ' + color + '-100';
-      }
-      return cls;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/index.html
deleted file mode 100644
index b102dba..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/grid/index.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: grid</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../neon-animated-pages.html">
-    <link rel="import" href="../../neon-animations.html">
-    <link rel="import" href="animated-grid.html">
-    <link rel="import" href="fullsize-page-with-card.html">
-
-    <style is="custom-style">
-      body {
-        overflow: hidden;
-        @apply(--layout-fullbleed);
-      }
-
-      neon-animated-pages {
-        height: 100%;
-      }
-    </style>
-
-  </head>
-  <body>
-
-    <template is="dom-bind">
-      <neon-animated-pages id="pages" selected="0">
-        <animated-grid on-tile-click="_onTileClick"></animated-grid>
-        <fullsize-page-with-card id="fullsize-card" on-click="_onFullsizeClick">
-        </fullsize-page-with-card>
-      </neon-animated-pages>
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-
-      scope._onTileClick = function(event) {
-        this.$['fullsize-card'].color = event.detail.data.color;
-        this.$.pages.selected = 1;
-      };
-
-      scope._onFullsizeClick = function(event) {
-        this.$.pages.selected = 0;
-      };
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/index.html
deleted file mode 100644
index 1e4e120..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/index.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html lang="en">
-<head>
-  <title>neon-animated pages demo</title>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-</head>
-<style>
-  a {
-    display: block;
-    margin-bottom: 10px;
-  }
-</style>
-<body unresolved>
-  <div class="horizontal-section-container">
-    <div>
-      <h4>Sample demos</h4>
-      <div class="horizontal-section">
-        <a href="doc/index.html">basic</a>
-        <a href="declarative/index.html">declarative</a>
-        <a href="dropdown/index.html">dropdown</a>
-        <a href="grid/index.html">grid</a>
-        <a href="list/index.html">list</a>
-        <a href="load/index.html">load</a>
-        <a href="tiles/index.html">tiles</a>
-        <a href="card/index.html">card</a>
-      </div>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/full-view.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/full-view.html
deleted file mode 100644
index 565618c..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/full-view.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../../paper-styles/shadow.html">
-<link rel="import" href="../../neon-animatable-behavior.html">
-
-<dom-module id="full-view">
-  <template>
-    <style>
-      :host {
-        @apply(--layout-vertical);
-      }
-
-      .main {
-        background: white;
-        @apply(--layout-flex);
-        @apply(--layout-scroll);
-        @apply(--shadow-elevation-8dp);
-      }
-
-      .image-container {
-        position: relative;
-        width: 100%;
-        padding-bottom: 100%;
-      }
-
-      .image {
-        position: absolute;
-        width: 100%;
-        height: 100%;
-        background: repeating-linear-gradient(
-          45deg,
-          #f5f5f5,
-          #f5f5f5 8px,
-          #e0e0e0 8px,
-          #e0e0e0 16px
-        );
-      }
-    </style>
-    <paper-toolbar class="medium-tall">
-      <paper-icon-button id="button" icon="clear" on-click="_onClearButtonClick"></paper-icon-button>
-    </paper-toolbar>
-
-    <div id="main" class="main">
-      <div class="image-container">
-        <div class="image">
-        </div>
-      </div>
-    </div>
-    
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'full-view',
-
-    behaviors: [
-      Polymer.NeonAnimatableBehavior
-    ],
-
-    properties: {
-
-      sharedElements: {
-        type: Object,
-        value: function() {
-          return {
-            'hero': this.$.main
-          };
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'fade-in-animation',
-              node: this.$.button
-            }, {
-              name: 'hero-animation',
-              id: 'hero',
-              toPage: this
-            }],
-
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this.$.button
-            }, {
-              name: 'scale-down-animation',
-              node: this.$.main,
-              transformOrigin: '50% 50%',
-              axis: 'y'
-            }]
-
-          }
-        }
-      }
-
-    },
-
-    _onClearButtonClick: function() {
-      this.fire('close');
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/index.html
deleted file mode 100644
index eabb02e..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/index.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: list</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="list-demo.html">
-
-  </head>
-  <style is="custom-style">
-    body {
-      @apply(--layout-fullbleed);
-    }
-
-    list-demo {
-      @apply(--layout-fit);
-    }
-  </style>
-  <body>
-    <list-demo></list-demo>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/list-demo.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/list-demo.html
deleted file mode 100644
index 45808c8..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/list-demo.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../paper-toolbar/paper-toolbar.html">
-<link rel="import" href="../../neon-animated-pages.html">
-<link rel="import" href="../../neon-animations.html">
-<link rel="import" href="list-view.html">
-<link rel="import" href="full-view.html">
-
-<dom-module id="list-demo">
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-      neon-animated-pages {
-        height: 100%;
-      }
-    </style>
-    <neon-animated-pages id="pages" selected="0">
-      <list-view data="[[fileData]]" on-item-click="_onItemClick"></list-view>
-      <full-view on-close="_onClose"></full-view>
-    </neon-animated-pages>
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'list-demo',
-
-    properties: {
-
-      fileData: {
-        type: Array,
-        value: function() {
-          return [
-            {fileName: 'IMG_4130.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4131.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4132.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4133.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4134.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4135.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4136.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4137.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4138.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4139.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4140.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4141.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4142.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4143.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4144.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4145.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4146.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4147.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4148.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4149.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4150.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4151.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4152.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4153.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4154.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4155.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4156.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4157.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4158.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4159.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4160.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4161.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4162.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4163.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4164.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4165.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4166.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4167.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4168.jpg', modifiedDate: 'May 12 2015'},
-            {fileName: 'IMG_4169.jpg', modifiedDate: 'May 12 2015'}
-          ]
-        }
-      }
-    },
-
-    _onItemClick: function() {
-      this.$.pages.selected = 1;
-    },
-
-    _onClose: function() {
-      this.$.pages.selected = 0;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/list-view.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/list-view.html
deleted file mode 100644
index ddb0550..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/list/list-view.html
+++ /dev/null
@@ -1,124 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-icons/iron-icons.html">
-<link rel="import" href="../../../iron-icon/iron-icon.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../../paper-icon-button/paper-icon-button.html">
-<link rel="import" href="../../../paper-item/paper-item.html">
-<link rel="import" href="../../../paper-item/paper-item-body.html">
-<link rel="import" href="../../../paper-styles/color.html">
-<link rel="import" href="../../neon-animatable-behavior.html">
-
-<dom-module id="list-view">
-  <template>
-    <style>
-      :host {
-        @apply(--layout-vertical);
-      }
-
-      .main {
-        @apply(--layout-flex);
-        @apply(--layout-scroll);
-      }
-
-      iron-icon {
-        color: var(--google-grey-500);
-      }
-    </style>
-    <paper-toolbar class="medium-tall">
-      <paper-icon-button id="button" icon="arrow-back"></paper-icon-button>
-    </paper-toolbar>
-
-    <div class="main">
-
-        <template is="dom-repeat" items="[[data]]">
-
-          <paper-item>
-            <paper-item-body two-line>
-              <div>[[item.fileName]]</div>
-              <div secondary>[[item.modifiedDate]]</div>
-            </paper-item-body>
-            <iron-icon icon="info"></iron-icon>
-          </paper-item>
-
-        </template>
-
-    </div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'list-view',
-
-    behaviors: [
-      Polymer.NeonAnimatableBehavior
-    ],
-
-    listeners: {
-      'click': '_onClick'
-    },
-
-    properties: {
-
-      data: {
-        type: Array,
-        value: function() {
-          return [];
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'fade-in-animation',
-              node: this.$.button
-            }],
-
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this.$.button
-            }, {
-              name: 'hero-animation',
-              id: 'hero',
-              fromPage: this
-            }]
-          };
-        }
-      }
-
-    },
-
-    _onClick: function(event) {
-      var target = event.target;
-      while (target !== this && !target._templateInstance) {
-        target = target.parentNode;
-      }
-
-      // configure the page animation
-      this.sharedElements = {
-        'hero': target,
-      };
-
-      this.fire('item-click', {
-        item: target,
-      });
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/animated-grid.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/animated-grid.html
deleted file mode 100644
index c1d52c1..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/animated-grid.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-<link rel="import" href="../../../paper-styles/typography.html">
-<link rel="import" href="../../../paper-styles/color.html">
-<link rel="import" href="../shared-styles.html">
-
-<dom-module id="animated-grid">
-  <template>
-    <style include="shared-styles"></style>
-    <style>
-      :host {
-        display: block;
-        background: #000;
-      }
-
-      .tile {
-        display: inline-block;
-        float: left;
-        vertical-align: top;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-
-        @apply(--paper-font-title);
-        @apply(--layout-vertical);
-        @apply(--layout-center-center);
-      }
-
-      .tile:nth-of-type(1) {
-        width: calc(100% / 3);
-        height: calc(100% / 3 * 2);
-      }
-
-      .tile:nth-of-type(4) {
-        width: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(5) {
-        width: calc(100% / 3);
-        height: calc(100% / 3 * 2);
-      }
-
-      .tile:nth-of-type(8) {
-        width: calc(100% / 3);
-        height: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(9) {
-        position: absolute;
-        top: calc(100% / 3 * 2);
-        left: 0;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(10) {
-        position: absolute;
-        top: calc(100% / 3 * 2);
-        left: calc(100% / 6);;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-      }
-    </style>
-
-    <template is="dom-repeat" items="[[config]]">
-      <div class$="[[_computeTileClass(item.color)]]">
-        <span>[[item.value]]</span>
-      </div>
-    </template>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'animated-grid',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      config: {
-        type: Array,
-        value: function() {
-          return [
-            {value: 1, color: 'blue'},
-            {value: 2, color: 'red'},
-            {value: 3, color: 'blue'},
-            {value: 4, color: 'green'},
-            {value: 5, color: 'yellow'},
-            {value: 6, color: 'blue'},
-            {value: 7, color: 'red'},
-            {value: 8, color: 'green'},
-            {value: 9, color: 'yellow'},
-            {value: 10, color: 'red'}
-          ]
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'cascaded-animation',
-              animation: 'transform-animation',
-              transformFrom: 'translateY(100%)',
-              transformTo: 'none',
-              timing: {
-                delay: 50
-              }
-            }]
-          }
-        }
-      }
-
-    },
-
-    attached: function() {
-      this.async(function() {
-        var nodeList = Polymer.dom(this.root).querySelectorAll('.tile');
-        this.animationConfig['entry'][0].nodes = Array.prototype.slice.call(nodeList);
-      });
-    },
-
-    _computeTileClass: function(color) {
-      return 'tile ' + color + '-300';
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/full-page.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/full-page.html
deleted file mode 100644
index 61a11bd..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/full-page.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-animatable-behavior.html">
-<link rel="import" href="../../neon-animation-runner-behavior.html">
-<link rel="import" href="../../../paper-styles/shadow.html">
-<link rel="import" href="animated-grid.html">
-
-<dom-module id="full-page">
-  <template>
-    <style>
-      :host {
-        background: black;
-        visibility: hidden;
-        @apply(--layout-vertical);
-      }
-
-      .toolbar {
-        background: #9c27b0;
-        height: 72px;
-        z-index: 1;
-        @apply(--shadow-elevation-2dp);
-      }
-
-      animated-grid {
-        height: calc(100% - 72px);
-        @apply(--layout-flex);
-      }
-    </style>
-
-    <div id="toolbar" class="toolbar"></div>
-    <animated-grid id="grid"></animated-grid>
-
-  </template>
-</dom-module>
-
-<script>
-
-Polymer({
-
-  is: 'full-page',
-
-  behaviors: [
-    Polymer.NeonAnimatableBehavior,
-    Polymer.NeonAnimationRunnerBehavior
-  ],
-
-  properties: {
-
-    animationConfig: {
-      type: Object,
-      value: function() {
-        return {
-          'entry': [{
-            name: 'slide-from-top-animation',
-            node: this.$.toolbar
-          }, {
-            animatable: this.$.grid,
-            type: 'entry'
-          }]
-        };
-      }
-    }
-
-  },
-
-  show: function() {
-    this.style.visibility = 'visible';
-    this.playAnimation('entry');
-  }
-
-});
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/index.html
deleted file mode 100644
index 54c8d68..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/load/index.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: load</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="../../neon-animated-pages.html">
-    <link rel="import" href="../../neon-animations.html">
-    <link rel="import" href="full-page.html">
-
-    <style is="custom-style">
-      body {
-        overflow: hidden;
-        @apply(--layout-fullbleed);
-      }
-      full-page {
-        @apply(--layout-fit);
-      }
-    </style>
-  </head>
-  <body>
-
-    <full-page></full-page>
-
-    <script>
-
-      document.addEventListener('WebComponentsReady', function() {
-        document.querySelector('full-page').show();
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/animated-grid.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/animated-grid.html
deleted file mode 100644
index f1244b4..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/animated-grid.html
+++ /dev/null
@@ -1,167 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-<link rel="import" href="../../../paper-styles/typography.html">
-<link rel="import" href="../../../paper-styles/color.html">
-<link rel="import" href="../shared-styles.html">
-
-<dom-module id="animated-grid">
-  <template>
-    <style include="shared-styles"></style>
-    <style>
-
-      :host {
-        display: block;
-        background: #000;
-      }
-
-      .tile {
-        display: inline-block;
-        float: left;
-        vertical-align: top;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-
-        @apply(--paper-font-title);
-        @apply(--layout-vertical);
-        @apply(--layout-center-center);
-      }
-
-      .tile:nth-of-type(1) {
-        width: calc(100% / 3);
-        height: calc(100% / 3 * 2);
-      }
-
-      .tile:nth-of-type(4) {
-        width: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(5) {
-        width: calc(100% / 3);
-        height: calc(100% / 3 * 2);
-      }
-
-      .tile:nth-of-type(8) {
-        width: calc(100% / 3);
-        height: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(9) {
-        position: absolute;
-        top: calc(100% / 3 * 2);
-        left: 0;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-      }
-
-      .tile:nth-of-type(10) {
-        position: absolute;
-        top: calc(100% / 3 * 2);
-        left: calc(100% / 6);;
-        width: calc(100% / 6);
-        height: calc(100% / 3);
-      }
-
-    </style>
-
-    <template is="dom-repeat" items="[[config]]">
-      <div class$="[[_computeTileClass(item.color)]]">
-        <span>[[item.value]]</span>
-      </div>
-    </template>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'animated-grid',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      config: {
-        type: Array,
-        value: function() {
-          return [
-            {value: 1, color: 'blue'},
-            {value: 2, color: 'red'},
-            {value: 3, color: 'blue'},
-            {value: 4, color: 'green'},
-            {value: 5, color: 'yellow'},
-            {value: 6, color: 'blue'},
-            {value: 7, color: 'red'},
-            {value: 8, color: 'green'},
-            {value: 9, color: 'yellow'},
-            {value: 10, color: 'red'}
-          ]
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'exit': [{
-              name: 'ripple-animation',
-              id: 'ripple',
-              fromPage: this
-            }, {
-              name: 'hero-animation',
-              id: 'hero',
-              fromPage: this
-            }]
-          }
-        }
-      }
-
-    },
-
-    listeners: {
-      click: '_onClick'
-    },
-
-    _computeTileClass: function(color) {
-      return 'tile ' + color + '-300';
-    },
-
-    _onClick: function(event) {
-      var target = event.target;
-      while (target !== this && !target._templateInstance) {
-        target = target.parentNode;
-      }
-
-      // configure the page animation
-      this.sharedElements = {
-        'hero': target,
-        'ripple': target
-      };
-      this.animationConfig['exit'][0].gesture = {
-        x: event.x,
-        y: event.y
-      };
-
-      this.fire('tile-click', {
-        tile: target,
-        data: target._templateInstance.item
-      });
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/fullsize-page-with-card.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/fullsize-page-with-card.html
deleted file mode 100644
index 83b8a91..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/fullsize-page-with-card.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-<link rel="import" href="../shared-styles.html">
-
-<dom-module id="fullsize-page-with-card">
-  <template>
-    <style include="shared-styles"></style>
-    <style>
-
-      :host {
-        display: block;
-      }
-
-      .fixed {
-        position: fixed;
-        top: 0;
-        left: 0;
-        height: 100vh;
-        width: 100vw;
-      }
-
-      .card {
-        position: relative;
-        margin: 200px 100px 0;
-        height: 700px;
-      }
-
-    </style>
-
-    <div id="fixed" class$="[[_computeFixedBackgroundClass(color)]]"></div>
-    <div id="card" class$="[[_computeCardClass(color)]]"></div>
-
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'fullsize-page-with-card',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      color: {
-        type: String
-      },
-
-      sharedElements: {
-        type: Object,
-        value: function() {
-          return {
-            'hero': this.$.card,
-            'ripple': this.$.fixed
-          }
-        }
-      },
-
-      animationConfig: {
-        type: Object,
-        value: function() {
-          return {
-            'entry': [{
-              name: 'ripple-animation',
-              id: 'ripple',
-              toPage: this,
-            }, {
-              name: 'hero-animation',
-              id: 'hero',
-              toPage: this,
-              timing: {
-                delay: 150
-              }
-            }],
-            'exit': [{
-              name: 'fade-out-animation',
-              node: this.$.fixed
-            }, {
-              name: 'transform-animation',
-              transformFrom: 'none',
-              transformTo: 'translate(0px,-200vh) scale(0.9,1)',
-              node: this.$.card
-            }]
-          }
-        }
-      }
-
-    },
-
-    _computeCardClass: function(color) {
-      var cls = 'card';
-      if (color) {
-        cls += ' ' + color + '-300';
-      }
-      return cls;
-    },
-
-    _computeFixedBackgroundClass: function(color) {
-      var cls = 'fixed';
-      if (color) {
-        cls += ' ' + color + '-100';
-      }
-      return cls;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/index.html
deleted file mode 100644
index 591d63c..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/index.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: grid</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="../../neon-animations.html">
-    <link rel="import" href="reprojected-pages.html">
-    <link rel="import" href="animated-grid.html">
-    <link rel="import" href="fullsize-page-with-card.html">
-
-    <style is="custom-style">
-      body {
-        overflow: hidden;
-        @apply(--layout-fullbleed);
-      }
-      reprojected-pages {
-        height: 100%;
-      }
-    </style>
-  </head>
-  <body>
-    <template is="dom-bind">
-
-      <reprojected-pages id="pages" selected="0">
-        <animated-grid on-tile-click="_onTileClick"></animated-grid>
-        <fullsize-page-with-card id="fullsize-card" hero-id="hero" on-click="_onFullsizeClick">
-        </fullsize-page-with-card>
-      </reprojected-pages>
-
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-
-      scope._onTileClick = function(event) {
-        this.$['fullsize-card'].color = event.detail.data.color;
-        this.$.pages.selected = 1;
-      };
-
-      scope._onFullsizeClick = function(event) {
-        this.$.pages.selected = 0;
-      };
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/reprojected-pages.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/reprojected-pages.html
deleted file mode 100644
index e71f2e0..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/reprojection/reprojected-pages.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../neon-animated-pages.html">
-
-<dom-module id="reprojected-pages">
-  <template>
-    <style>
-      neon-animated-pages {
-        height: 100%;
-      }
-    </style>
-    <neon-animated-pages selected="{{selected}}">
-      <content></content>
-    </neon-animated-pages>
-
-  </template>
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'reprojected-pages',
-
-    properties: {
-
-      selected: {
-        type: String,
-        notify: true
-      }
-
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/shared-styles.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/shared-styles.html
deleted file mode 100644
index 4e48c8c..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/shared-styles.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<dom-module id="shared-styles">
-  <template>
-    <style>
-      .red-100 {
-        background: var(--google-red-100);
-      }
-
-      .yellow-100 {
-        background: var(--google-yellow-100);
-      }
-
-      .blue-100 {
-        background: var(--google-blue-100);
-      }
-
-      .green-100 {
-        background: var(--google-green-100);
-      }
-
-      .red-300 {
-        background: var(--google-red-300);
-      }
-
-      .yellow-300 {
-        background: var(--google-yellow-300);
-      }
-
-      .blue-300 {
-        background: var(--google-blue-300);
-      }
-
-      .green-300 {
-        background: var(--google-green-300);
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/circles-page.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/circles-page.html
deleted file mode 100644
index 79dc8e3..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/circles-page.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-
-<dom-module id="circles-page">
-  <template>
-    <style>
-      :host {
-        @apply(--layout-horizontal);
-        @apply(--layout-center-center);
-      }
-
-      .circle {
-        display: inline-block;
-        box-sizing: border-box;
-        width: 100px;
-        height: 100px;
-        margin: 16px;
-        border-radius: 50%;
-        background: var(--color-one);
-      }
-    </style>
-
-    <div>
-      <div class="circle"></div>
-      <div class="circle"></div>
-      <div class="circle"></div>
-      <div class="circle"></div>
-    </div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'circles-page',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      animationConfig: {
-        value: function() {
-          var circles = Polymer.dom(this.root).querySelectorAll('.circle');
-          var circlesArray = Array.prototype.slice.call(circles);
-          return {
-            'entry': [{
-              name: 'cascaded-animation',
-              animation: 'scale-up-animation',
-              nodes: circlesArray
-            }],
-
-            'exit': [{
-              name: 'hero-animation',
-              id: 'hero',
-              fromPage: this
-            }, {
-              name: 'cascaded-animation',
-              animation: 'scale-down-animation'
-            }]
-          };
-        }
-      }
-    },
-
-    listeners: {
-      'click': '_onClick'
-    },
-
-    _onClick: function(event) {
-      var target = Polymer.dom(event).rootTarget;
-      if (target.classList.contains('circle')) {
-        // configure the page animation
-        this.sharedElements = {
-          'hero': target
-        };
-
-        var nodesToScale = [];
-        var circles = Polymer.dom(this.root).querySelectorAll('.circle');
-        for (var node, index = 0; node = circles[index]; index++) {
-          if (node !== event.target) {
-            nodesToScale.push(node);
-          }
-        }
-        this.animationConfig['exit'][1].nodes = nodesToScale;
-
-        this.fire('circle-click');
-      }
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/index.html
deleted file mode 100644
index f509f0b..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/index.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>neon-animated-pages demo: tiles</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="../../neon-animated-pages.html">
-    <link rel="import" href="../../neon-animations.html">
-    <link rel="import" href="../../../paper-styles/color.html">
-    <link rel="import" href="circles-page.html">
-    <link rel="import" href="squares-page.html">
-
-    <style is="custom-style">
-      body {
-        overflow: hidden;
-        @apply(--layout-fullbleed);
-      }
-      neon-animated-pages {
-        height: 100%;
-      }
-
-      :root {
-        --color-one: var(--paper-cyan-300);
-        --color-two: var(--paper-orange-500);
-      }
-    </style>
-
-  </head>
-  <body>
-
-    <template is="dom-bind">
-
-      <neon-animated-pages id="pages" selected="0">
-        <circles-page on-circle-click="_onCircleClick"></circles-page>
-        <squares-page on-click="_onSquaresClick"></squares-page>
-      </neon-animated-pages>
-
-    </template>
-
-    <script>
-
-      var scope = document.querySelector('template[is="dom-bind"]');
-
-      scope._onCircleClick = function(event) {
-        this.$.pages.selected = 1;
-      };
-
-      scope._onSquaresClick = function(event) {
-        this.$.pages.selected = 0;
-      };
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/squares-page.html b/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/squares-page.html
deleted file mode 100644
index 52fe7e1..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/demo/tiles/squares-page.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../../polymer/polymer.html">
-<link rel="import" href="../../neon-shared-element-animatable-behavior.html">
-
-<dom-module id="squares-page">
-  <template>
-    <style>
-      .header {
-        height: 40%;
-        background: var(--color-one);
-      }
-
-      .body {
-        text-align: center;
-        padding: 8px;
-      }
-
-      .square {
-        display: inline-block;
-        width: 150px;
-        height: 150px;
-        margin: 8px;
-        background: var(--color-two);
-      }
-    </style>
-    
-    <div id="header" class="header"></div>
-
-    <div class="body">
-      <div class="square"></div>
-      <div class="square"></div>
-      <div class="square"></div>
-      <div class="square"></div>
-    </div>
-
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'squares-page',
-
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior
-    ],
-
-    properties: {
-
-      sharedElements: {
-        value: function() {
-          return {
-            'hero': this.$.header
-          }
-        }
-      },
-
-      animationConfig: {
-        value: function() {
-          var squares = Polymer.dom(this.root).querySelectorAll('.square');
-          var squaresArray = Array.prototype.slice.call(squares);
-          return {
-            'entry': [{
-              name: 'hero-animation',
-              id: 'hero',
-              toPage: this
-            }, {
-              name: 'cascaded-animation',
-              animation: 'transform-animation',
-              transformFrom: 'translateY(100%)',
-              nodes: squaresArray
-            }],
-
-            'exit': [{
-              name: 'slide-up-animation',
-              node: this.$.header
-            }, {
-              name: 'cascaded-animation',
-              animation: 'transform-animation',
-              transformTo: 'translateY(60vh)',
-              nodes: squaresArray
-            }]
-          };
-        }
-      }
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/guides/neon-animation.md b/systrace/catapult/third_party/polymer/components/neon-animation/guides/neon-animation.md
deleted file mode 100644
index 69727b8..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/guides/neon-animation.md
+++ /dev/null
@@ -1,314 +0,0 @@
----
-title: neon-animation
-summary: "A short guide to neon-animation and neon-animated-pages"
-tags: ['animation','core-animated-pages']
-elements: ['neon-animation','neon-animated-pages']
-updated: 2015-05-26
----
-
-# neon-animation
-
-`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/).
-
-*Warning: The API may change.*
-
-* [A basic animatable element](#basic)
-* [Animation configuration](#configuration)
-  * [Animation types](#configuration-types)
-  * [Configuration properties](#configuration-properties)
-  * [Using multiple animations](#configuration-multiple)
-  * [Running animations encapsulated in children nodes](#configuration-encapsulation)
-* [Page transitions](#page-transitions)
-  * [Shared element animations](#shared-element)
-  * [Declarative page transitions](#declarative-page)
-* [Included animations](#animations)
-* [Demos](#demos)
-
-<a name="basic"></a>
-## A basic animatable element
-
-Elements that can be animated should implement the `Polymer.NeonAnimatableBehavior` behavior, or `Polymer.NeonAnimationRunnerBehavior` if they're also responsible for running an animation.
-
-```js
-Polymer({
-  is: 'my-animatable',
-  behaviors: [
-    Polymer.NeonAnimationRunnerBehavior
-  ],
-  properties: {
-    animationConfig: {
-      value: function() {
-        return {
-          // provided by neon-animation/animations/scale-down-animation.html
-          name: 'scale-down-animation',
-          node: this
-        }
-      }
-    }
-  },
-  listeners: {
-    // this event is fired when the animation finishes
-    'neon-animation-finish': '_onNeonAnimationFinish'
-  },
-  animate: function() {
-    // run scale-down-animation
-    this.playAnimation();
-  },
-  _onNeonAnimationFinish: function() {
-    console.log('animation done!');
-  }
-});
-```
-
-[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/basic.html)
-
-<a name="configuration"></a>
-## Animation configuration
-
-<a name="configuration-types"></a>
-### Animation types
-
-An element might run different animations, for example it might do something different when it enters the view and when it exits from view. You can set the `animationConfig` property to a map from an animation type to configuration.
-
-```js
-Polymer({
-  is: 'my-dialog',
-  behaviors: [
-    Polymer.NeonAnimationRunnerBehavior
-  ],
-  properties: {
-    opened: {
-      type: Boolean
-    },
-    animationConfig: {
-      value: function() {
-        return {
-          'entry': {
-            // provided by neon-animation/animations/scale-up-animation.html
-            name: 'scale-up-animation',
-            node: this
-          },
-          'exit': {
-            // provided by neon-animation-animations/fade-out-animation.html
-            name: 'fade-out-animation',
-            node: this
-          }
-        }
-      }
-    }
-  },
-  listeners: {
-    'neon-animation-finish': '_onNeonAnimationFinish'
-  },
-  show: function() {
-    this.opened = true;
-    this.style.display = 'inline-block';
-    // run scale-up-animation
-    this.playAnimation('entry');
-  },
-  hide: function() {
-    this.opened = false;
-    // run fade-out-animation
-    this.playAnimation('exit');
-  },
-  _onNeonAnimationFinish: function() {
-    if (!this.opened) {
-      this.style.display = 'none';
-    }
-  }
-});
-```
-
-[Live demo](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/doc/types.html)
-
-You can also use the convenience properties `entryAnimation` and `exitAnimation` to set `entry` and `exit` animations:
-
-```js
-properties: {
-  entryAnimation: {
-    value: 'scale-up-animation'
-  },
-  exitAnimation: {
-    value: 'fade-out-animation'
-  }
-}
-```
-
-<a name="configuration-properties"></a>
-### Configuration properties
-
-You can pass additional parameters to configure an animation in the animation configuration object.
-All animations should accept the following properties:
-
- * `name`: The name of an animation, ie. an element implementing `Polymer.NeonAnimationBehavior`.
- * `node`: The target node to apply the animation to. Defaults to `this`.
- * `timing`: Timing properties to use in this animation. They match the [Web Animations Animation Effect Timing interface](https://w3c.github.io/web-animations/#the-animationeffecttiming-interface). The
- properties include the following:
-     * `duration`: The duration of the animation in milliseconds.
-     * `delay`: The delay before the start of the animation in milliseconds.
-     * `easing`: A timing function for the animation. Matches the CSS timing function values.
-
-Animations may define additional configuration properties and they are listed in their documentation.
-
-<a name="configuration-multiple"></a>
-### Using multiple animations
-
-Set the animation configuration to an array to combine animations, like this:
-
-```js
-animationConfig: {
-  value: function() {
-    return {
-      // fade-in-animation is run with a 50ms delay from slide-down-animation
-      'entry': [{
-        name: 'slide-down-animation',
-        node: this
-      }, {
-        name: 'fade-in-animation',
-        node: this,
-        timing: {delay: 50}
-      }]
-    }
-  }
-}
-```
-
-<a name="configuration-encapsulation"></a>
-### Running animations encapsulated in children nodes
-
-You can include animations in the configuration that are encapsulated in a child element that implement `Polymer.NeonAnimatableBehavior` with the `animatable` property.
-
-```js
-animationConfig: {
-  value: function() {
-    return {
-      // run fade-in-animation on this, and the entry animation on this.$.myAnimatable
-      'entry': [
-        {name: 'fade-in-animation', node: this},
-        {animatable: this.$.myAnimatable, type: 'entry'}
-      ]
-    }
-  }
-}
-```
-
-<a name="page-transitions"></a>
-## Page transitions
-
-*The artist formerly known as `<core-animated-pages>`*
-
-The `neon-animated-pages` element manages a set of pages to switch between, and runs animations between the page transitions. It implements the `Polymer.IronSelectableBehavior` behavior. Each child node should implement `Polymer.NeonAnimatableBehavior` and define the `entry` and `exit` animations. During a page transition, the `entry` animation is run on the new page and the `exit` animation is run on the old page.
-
-<a name="shared-element"></a>
-### Shared element animations
-
-Shared element animations work on multiple nodes. For example, a "hero" animation is used during a page transition to make two elements from separate pages appear to animate as a single element. Shared element animation configurations have an `id` property that identify they belong in the same animation. Elements containing shared elements also have a `sharedElements` property defines a map from `id` to element, the element involved with the animation.
-
-In the incoming page:
-
-```js
-properties: {
-  animationConfig: {
-    value: function() {
-      return {
-        // the incoming page defines the 'entry' animation
-        'entry': {
-          name: 'hero-animation',
-          id: 'hero',
-          toPage: this
-        }
-      }
-    }
-  },
-  sharedElements: {
-    value: function() {
-      return {
-        'hero': this.$.hero
-      }
-    }
-  }
-}
-```
-
-In the outgoing page:
-
-```js
-properties: {
-  animationConfig: {
-    value: function() {
-      return {
-        // the outgoing page defines the 'exit' animation
-        'exit': {
-          name: 'hero-animation',
-          id: 'hero',
-          fromPage: this
-        }
-      }
-    }
-  },
-  sharedElements: {
-    value: function() {
-      return {
-        'hero': this.$.otherHero
-      }
-    }
-  }
-}
-```
-
-<a name="declarative-page"></a>
-### Declarative page transitions
-
-For convenience, if you define the `entry-animation` and `exit-animation` attributes on `<neon-animated-pages>`, those animations will apply for all page transitions.
-
-For example:
-
-```js
-<neon-animated-pages id="pages" class="flex" selected="[[selected]]" entry-animation="slide-from-right-animation" exit-animation="slide-left-animation">
-  <neon-animatable>1</neon-animatable>
-  <neon-animatable>2</neon-animatable>
-  <neon-animatable>3</neon-animatable>
-  <neon-animatable>4</neon-animatable>
-  <neon-animatable>5</neon-animatable>
-</neon-animated-pages>
-```
-
-The new page will slide in from the right, and the old page slide away to the left.
-
-<a name="animations"></a>
-## Included animations
-
-Single element animations:
-
- * `fade-in-animation` Animates opacity from `0` to `1`;
- * `fade-out-animation` Animates opacity from `1` to `0`;
- * `scale-down-animation` Animates transform from `scale(1)` to `scale(0)`;
- * `scale-up-animation` Animates transform from `scale(0)` to `scale(1)`;
- * `slide-down-animation` Animates transform from `none` to `translateY(100%)`;
- * `slide-up-animation` Animates transform from `none` to `translateY(-100%)`;
- * `slide-from-top-animation` Animates transform from `translateY(-100%)` to `none`;
- * `slide-from-bottom-animation` Animates transform from `translateY(100%)` to `none`;
- * `slide-left-animation` Animates transform from `none` to `translateX(-100%)`;
- * `slide-right-animation` Animates transform from `none` to `translateX(100%)`;
- * `slide-from-left-animation` Animates transform from `translateX(-100%)` to `none`;
- * `slide-from-right-animation` Animates transform from `translateX(100%)` to `none`;
- * `transform-animation` Animates a custom transform.
-
-Note that there is a restriction that only one transform animation can be applied on the same element at a time. Use the custom `transform-animation` to combine transform properties.
-
-Shared element animations
-
- * `hero-animation` Animates an element such that it looks like it scales and transforms from another element.
- * `ripple-animation` Animates an element to full screen such that it looks like it ripples from another element.
-
-Group animations
- * `cascaded-animation` Applys an animation to an array of elements with a delay between each.
-
-<a name="demos"></a>
-## Demos
-
- * [Grid to full screen](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/grid/index.html)
- * [Animation on load](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/load/index.html)
- * [List item to detail](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/list/index.html) (For narrow width)
- * [Dots to squares](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/tiles/index.html)
- * [Declarative](http://morethanreal.github.io/neon-animation-demo/bower_components/neon-animation/demo/declarative/index.html)
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/index.html
deleted file mode 100644
index 6f5feed..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>neon-animation</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animatable-behavior.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animatable-behavior.html
deleted file mode 100644
index dd58a6c..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animatable-behavior.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-
-  /**
-   * `Polymer.NeonAnimatableBehavior` is implemented by elements containing animations for use with
-   * elements implementing `Polymer.NeonAnimationRunnerBehavior`.
-   * @polymerBehavior
-   */
-  Polymer.NeonAnimatableBehavior = {
-
-    properties: {
-
-      /**
-       * Animation configuration. See README for more info.
-       */
-      animationConfig: {
-        type: Object
-      },
-
-      /**
-       * Convenience property for setting an 'entry' animation. Do not set `animationConfig.entry`
-       * manually if using this. The animated node is set to `this` if using this property.
-       */
-      entryAnimation: {
-        observer: '_entryAnimationChanged',
-        type: String
-      },
-
-      /**
-       * Convenience property for setting an 'exit' animation. Do not set `animationConfig.exit`
-       * manually if using this. The animated node is set to `this` if using this property.
-       */
-      exitAnimation: {
-        observer: '_exitAnimationChanged',
-        type: String
-      }
-
-    },
-
-    _entryAnimationChanged: function() {
-      this.animationConfig = this.animationConfig || {};
-      this.animationConfig['entry'] = [{
-        name: this.entryAnimation,
-        node: this
-      }];
-    },
-
-    _exitAnimationChanged: function() {
-      this.animationConfig = this.animationConfig || {};
-      this.animationConfig['exit'] = [{
-        name: this.exitAnimation,
-        node: this
-      }];
-    },
-
-    _copyProperties: function(config1, config2) {
-      // shallowly copy properties from config2 to config1
-      for (var property in config2) {
-        config1[property] = config2[property];
-      }
-    },
-
-    _cloneConfig: function(config) {
-      var clone = {
-        isClone: true
-      };
-      this._copyProperties(clone, config);
-      return clone;
-    },
-
-    _getAnimationConfigRecursive: function(type, map, allConfigs) {
-      if (!this.animationConfig) {
-        return;
-      }
-
-      if(this.animationConfig.value && typeof this.animationConfig.value === 'function') {
-      	this._warn(this._logf('playAnimation', "Please put 'animationConfig' inside of your components 'properties' object instead of outside of it."));
-      	return;
-      }
-
-      // type is optional
-      var thisConfig;
-      if (type) {
-        thisConfig = this.animationConfig[type];
-      } else {
-        thisConfig = this.animationConfig;
-      }
-
-      if (!Array.isArray(thisConfig)) {
-        thisConfig = [thisConfig];
-      }
-
-      // iterate animations and recurse to process configurations from child nodes
-      if (thisConfig) {
-        for (var config, index = 0; config = thisConfig[index]; index++) {
-          if (config.animatable) {
-            config.animatable._getAnimationConfigRecursive(config.type || type, map, allConfigs);
-          } else {
-            if (config.id) {
-              var cachedConfig = map[config.id];
-              if (cachedConfig) {
-                // merge configurations with the same id, making a clone lazily
-                if (!cachedConfig.isClone) {
-                  map[config.id] = this._cloneConfig(cachedConfig)
-                  cachedConfig = map[config.id];
-                }
-                this._copyProperties(cachedConfig, config);
-              } else {
-                // put any configs with an id into a map
-                map[config.id] = config;
-              }
-            } else {
-              allConfigs.push(config);
-            }
-          }
-        }
-      }
-    },
-
-    /**
-     * An element implementing `Polymer.NeonAnimationRunnerBehavior` calls this method to configure
-     * an animation with an optional type. Elements implementing `Polymer.NeonAnimatableBehavior`
-     * should define the property `animationConfig`, which is either a configuration object
-     * or a map of animation type to array of configuration objects.
-     */
-    getAnimationConfig: function(type) {
-      var map = {};
-      var allConfigs = [];
-      this._getAnimationConfigRecursive(type, map, allConfigs);
-      // append the configurations saved in the map to the array
-      for (var key in map) {
-        allConfigs.push(map[key]);
-      }
-      return allConfigs;
-    }
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animatable.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animatable.html
deleted file mode 100644
index 267ae5e..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animatable.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="neon-animatable-behavior.html">
-
-<!--
-`<neon-animatable>` is a simple container element implementing `Polymer.NeonAnimatableBehavior`. This is a convenience element for use with `<neon-animated-pages>`.
-
-```
-<neon-animated-pages selected="0"
-                     entry-animation="slide-from-right-animation"
-                     exit-animation="slide-left-animation">
-  <neon-animatable>1</neon-animatable>
-  <neon-animatable>2</neon-animatable>
-</neon-animated-pages>
-```
--->
-
-<dom-module id="neon-animatable">
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-    </style>
-    
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-  Polymer({
-
-    is: 'neon-animatable',
-
-    behaviors: [
-      Polymer.NeonAnimatableBehavior,
-      Polymer.IronResizableBehavior
-    ]
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animated-pages.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animated-pages.html
deleted file mode 100644
index 983cb47..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animated-pages.html
+++ /dev/null
@@ -1,220 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="../iron-selector/iron-selectable.html">
-<link rel="import" href="neon-animation-runner-behavior.html">
-
-<!--
-Material design: [Meaningful transitions](https://www.google.com/design/spec/animation/meaningful-transitions.html)
-
-`neon-animated-pages` manages a set of pages and runs an animation when switching between them. Its
-children pages should implement `Polymer.NeonAnimatableBehavior` and define `entry` and `exit`
-animations to be run when switching to or switching out of the page.
-
-@group Neon Elements
-@element neon-animated-pages
-@demo demo/index.html
--->
-
-<dom-module id="neon-animated-pages">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-      }
-
-      :host > ::content > * {
-        position: absolute;
-        top: 0;
-        left: 0;
-        bottom: 0;
-        right: 0;
-      }
-
-      :host > ::content > :not(.iron-selected):not(.neon-animating) {
-        display: none !important;
-      }
-
-      :host > ::content > .neon-animating {
-        pointer-events: none;
-      }
-    </style>
-    
-    <content id="content"></content>
-  </template>
-
-</dom-module>
-
-<script>
-(function() {
-
-  Polymer({
-
-    is: 'neon-animated-pages',
-
-    behaviors: [
-      Polymer.IronResizableBehavior,
-      Polymer.IronSelectableBehavior,
-      Polymer.NeonAnimationRunnerBehavior
-    ],
-
-    properties: {
-
-      activateEvent: {
-        type: String,
-        value: ''
-      },
-
-      // if true, the initial page selection will also be animated according to its animation config.
-      animateInitialSelection: {
-        type: Boolean,
-        value: false
-      }
-
-    },
-
-    listeners: {
-      'iron-select': '_onIronSelect',
-      'neon-animation-finish': '_onNeonAnimationFinish'
-    },
-
-    _onIronSelect: function(event) {
-      var selectedPage = event.detail.item;
-
-      // Only consider child elements.
-      if (this.items.indexOf(selectedPage) < 0) {
-        return;
-      }
-
-      var oldPage = this._valueToItem(this._prevSelected) || false;
-      this._prevSelected = this.selected;
-
-      // on initial load and if animateInitialSelection is negated, simply display selectedPage.
-      if (!oldPage && !this.animateInitialSelection) {
-        this._completeSelectedChanged();
-        return;
-      }
-
-      this.animationConfig = [];
-
-      // configure selectedPage animations.
-      if (this.entryAnimation) {
-        this.animationConfig.push({
-          name: this.entryAnimation,
-          node: selectedPage
-        });
-      } else {
-        if (selectedPage.getAnimationConfig) {
-          this.animationConfig.push({
-            animatable: selectedPage,
-            type: 'entry'
-          });
-        }
-      }
-
-      // configure oldPage animations iff exists.
-      if (oldPage) {
-
-        // cancel the currently running animation if one is ongoing.
-        if (oldPage.classList.contains('neon-animating')) {
-          this._squelchNextFinishEvent = true;
-          this.cancelAnimation();
-          this._completeSelectedChanged();
-          this._squelchNextFinishEvent = false;
-        }
-
-        // configure the animation.
-        if (this.exitAnimation) {
-          this.animationConfig.push({
-            name: this.exitAnimation,
-            node: oldPage
-          });
-        } else {
-          if (oldPage.getAnimationConfig) {
-            this.animationConfig.push({
-              animatable: oldPage,
-              type: 'exit'
-            });
-          }
-        }
-
-        // display the oldPage during the transition.
-        oldPage.classList.add('neon-animating');
-      }
-
-      // display the selectedPage during the transition.
-      selectedPage.classList.add('neon-animating');
-
-      // actually run the animations.
-      if (this.animationConfig.length >= 1) {
-
-        // on first load, ensure we run animations only after element is attached.
-        if (!this.isAttached) {
-          this.async(function () {
-            this.playAnimation(undefined, {
-              fromPage: null,
-              toPage: selectedPage
-            });
-          });
-
-        } else {
-          this.playAnimation(undefined, {
-            fromPage: oldPage,
-            toPage: selectedPage
-          });
-        }
-
-      } else {
-        this._completeSelectedChanged(oldPage, selectedPage);
-      }
-    },
-
-    /**
-     * @param {Object=} oldPage
-     * @param {Object=} selectedPage
-     */
-    _completeSelectedChanged: function(oldPage, selectedPage) {
-      if (selectedPage) {
-        selectedPage.classList.remove('neon-animating');
-      }
-      if (oldPage) {
-        oldPage.classList.remove('neon-animating');
-      }
-      if (!selectedPage || !oldPage) {
-        var nodes = Polymer.dom(this.$.content).getDistributedNodes();
-        for (var node, index = 0; node = nodes[index]; index++) {
-          node.classList && node.classList.remove('neon-animating');
-        }
-      }
-      this.async(this._notifyPageResize);
-    },
-
-    _onNeonAnimationFinish: function(event) {
-      if (this._squelchNextFinishEvent) {
-        this._squelchNextFinishEvent = false;
-        return;
-      }
-      this._completeSelectedChanged(event.detail.fromPage, event.detail.toPage);
-    },
-
-    _notifyPageResize: function() {
-      var selectedPage = this.selectedItem || this._valueToItem(this.selected);
-      this.resizerShouldNotify = function(element) {
-        return element == selectedPage;
-      }
-      this.notifyResize();
-    }
-
-  })
-
-})();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation-behavior.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation-behavior.html
deleted file mode 100644
index 6939d34..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation-behavior.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
-
-<script>
-
-  /**
-   * Use `Polymer.NeonAnimationBehavior` to implement an animation.
-   * @polymerBehavior
-   */
-  Polymer.NeonAnimationBehavior = {
-
-    properties: {
-
-      /**
-       * Defines the animation timing.
-       */
-      animationTiming: {
-        type: Object,
-        value: function() {
-          return {
-            duration: 500,
-            easing: 'cubic-bezier(0.4, 0, 0.2, 1)',
-            fill: 'both'
-          }
-        }
-      }
-
-    },
-
-    /**
-     * Can be used to determine that elements implement this behavior.
-     */
-    isNeonAnimation: true,
-
-    /**
-     * Do any animation configuration here.
-     */
-    // configure: function(config) {
-    // },
-
-    /**
-     * Returns the animation timing by mixing in properties from `config` to the defaults defined
-     * by the animation.
-     */
-    timingFromConfig: function(config) {
-      if (config.timing) {
-        for (var property in config.timing) {
-          this.animationTiming[property] = config.timing[property];
-        }
-      }
-      return this.animationTiming;
-    },
-
-    /**
-     * Sets `transform` and `transformOrigin` properties along with the prefixed versions.
-     */
-    setPrefixedProperty: function(node, property, value) {
-      var map = {
-        'transform': ['webkitTransform'],
-        'transformOrigin': ['mozTransformOrigin', 'webkitTransformOrigin']
-      };
-      var prefixes = map[property];
-      for (var prefix, index = 0; prefix = prefixes[index]; index++) {
-        node.style[prefix] = value;
-      }
-      node.style[property] = value;
-    },
-
-    /**
-     * Called when the animation finishes.
-     */
-    complete: function() {}
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation-runner-behavior.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation-runner-behavior.html
deleted file mode 100644
index 67c11b6..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation-runner-behavior.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-meta/iron-meta.html">
-<link rel="import" href="neon-animatable-behavior.html">
-
-<script>
-
-  /**
-   * `Polymer.NeonAnimationRunnerBehavior` adds a method to run animations.
-   *
-   * @polymerBehavior Polymer.NeonAnimationRunnerBehavior
-   */
-  Polymer.NeonAnimationRunnerBehaviorImpl = {
-
-    _configureAnimations: function(configs) {
-      var results = [];
-      if (configs.length > 0) {
-        for (var config, index = 0; config = configs[index]; index++) {
-          var neonAnimation = document.createElement(config.name);
-          // is this element actually a neon animation?
-          if (neonAnimation.isNeonAnimation) {
-            var result = null;
-            // configuration or play could fail if polyfills aren't loaded
-            try {
-              result = neonAnimation.configure(config);
-              // Check if we have an Effect rather than an Animation
-              if (typeof result.cancel != 'function') { 
-                result = document.timeline.play(result);
-              }
-            } catch (e) {
-              result = null;
-              console.warn('Couldnt play', '(', config.name, ').', e);
-            }
-            if (result) {
-              results.push({
-                neonAnimation: neonAnimation,
-                config: config,
-                animation: result,
-              });
-            }
-          } else {
-            console.warn(this.is + ':', config.name, 'not found!');
-          }
-        }
-      }
-      return results;
-    },
-
-    _shouldComplete: function(activeEntries) {
-      var finished = true;
-      for (var i = 0; i < activeEntries.length; i++) {
-        if (activeEntries[i].animation.playState != 'finished') {
-          finished = false;
-          break;
-        }
-      }
-      return finished;
-    },
-
-    _complete: function(activeEntries) {
-      for (var i = 0; i < activeEntries.length; i++) {
-        activeEntries[i].neonAnimation.complete(activeEntries[i].config);
-      }
-      for (var i = 0; i < activeEntries.length; i++) {
-        activeEntries[i].animation.cancel();
-      }
-    },
-
-    /**
-     * Plays an animation with an optional `type`.
-     * @param {string=} type
-     * @param {!Object=} cookie
-     */
-    playAnimation: function(type, cookie) {
-      var configs = this.getAnimationConfig(type);
-      if (!configs) {
-        return;
-      }
-      this._active = this._active || {};
-      if (this._active[type]) {
-        this._complete(this._active[type]);
-        delete this._active[type];
-      }
-
-      var activeEntries = this._configureAnimations(configs);
-
-      if (activeEntries.length == 0) {
-        this.fire('neon-animation-finish', cookie, {bubbles: false});
-        return;
-      }
-
-      this._active[type] = activeEntries;
-
-      for (var i = 0; i < activeEntries.length; i++) {
-        activeEntries[i].animation.onfinish = function() {
-          if (this._shouldComplete(activeEntries)) {
-            this._complete(activeEntries);
-            delete this._active[type];
-            this.fire('neon-animation-finish', cookie, {bubbles: false});
-          }
-        }.bind(this);
-      }
-    },
-
-    /**
-     * Cancels the currently running animations.
-     */
-    cancelAnimation: function() {
-      for (var k in this._animations) {
-        this._animations[k].cancel();
-      }
-      this._animations = {};
-    }
-  };
-
-  /** @polymerBehavior Polymer.NeonAnimationRunnerBehavior */
-  Polymer.NeonAnimationRunnerBehavior = [
-    Polymer.NeonAnimatableBehavior,
-    Polymer.NeonAnimationRunnerBehaviorImpl
-  ];
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation.html
deleted file mode 100644
index da64504..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animation.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="neon-animatable-behavior.html">
-<link rel="import" href="neon-animated-pages.html">
-<link rel="import" href="neon-animatable.html">
-<link rel="import" href="neon-animation-behavior.html">
-<link rel="import" href="neon-animation-runner-behavior.html">
-<link rel="import" href="neon-animations.html">
-<link rel="import" href="neon-shared-element-animatable-behavior.html">
-<link rel="import" href="neon-shared-element-animation-behavior.html">
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animations.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-animations.html
deleted file mode 100644
index 67c4df4..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-animations.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="animations/cascaded-animation.html">
-<link rel="import" href="animations/fade-in-animation.html">
-<link rel="import" href="animations/fade-out-animation.html">
-<link rel="import" href="animations/hero-animation.html">
-<link rel="import" href="animations/opaque-animation.html">
-<link rel="import" href="animations/ripple-animation.html">
-<link rel="import" href="animations/reverse-ripple-animation.html">
-<link rel="import" href="animations/scale-down-animation.html">
-<link rel="import" href="animations/scale-up-animation.html">
-<link rel="import" href="animations/slide-from-left-animation.html">
-<link rel="import" href="animations/slide-from-right-animation.html">
-<link rel="import" href="animations/slide-from-top-animation.html">
-<link rel="import" href="animations/slide-from-bottom-animation.html">
-<link rel="import" href="animations/slide-left-animation.html">
-<link rel="import" href="animations/slide-right-animation.html">
-<link rel="import" href="animations/slide-up-animation.html">
-<link rel="import" href="animations/slide-down-animation.html">
-<link rel="import" href="animations/transform-animation.html">
-
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-shared-element-animatable-behavior.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-shared-element-animatable-behavior.html
deleted file mode 100644
index e63173d..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-shared-element-animatable-behavior.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="neon-animatable-behavior.html">
-
-<script>
-
-  /**
-   * Use `Polymer.NeonSharedElementAnimatableBehavior` to implement elements containing shared element
-   * animations.
-   * @polymerBehavior Polymer.NeonSharedElementAnimatableBehavior
-   */
-  Polymer.NeonSharedElementAnimatableBehaviorImpl = {
-
-    properties: {
-
-      /**
-       * A map of shared element id to node.
-       */
-      sharedElements: {
-        type: Object,
-        value: {}
-      }
-
-    }
-
-  };
-
-  /** @polymerBehavior Polymer.NeonSharedElementAnimatableBehavior */
-  Polymer.NeonSharedElementAnimatableBehavior = [
-    Polymer.NeonAnimatableBehavior,
-    Polymer.NeonSharedElementAnimatableBehaviorImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/neon-shared-element-animation-behavior.html b/systrace/catapult/third_party/polymer/components/neon-animation/neon-shared-element-animation-behavior.html
deleted file mode 100644
index 7787615..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/neon-shared-element-animation-behavior.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="neon-animation-behavior.html">
-
-<script>
-
-  /**
-   * Use `Polymer.NeonSharedElementAnimationBehavior` to implement shared element animations.
-   * @polymerBehavior Polymer.NeonSharedElementAnimationBehavior
-   */
-  Polymer.NeonSharedElementAnimationBehaviorImpl = {
-
-    properties: {
-
-      /**
-       * Cached copy of shared elements.
-       */
-      sharedElements: {
-        type: Object
-      }
-
-    },
-
-    /**
-     * Finds shared elements based on `config`.
-     */
-    findSharedElements: function(config) {
-      var fromPage = config.fromPage;
-      var toPage = config.toPage;
-      if (!fromPage || !toPage) {
-        console.warn(this.is + ':', !fromPage ? 'fromPage' : 'toPage', 'is undefined!');
-        return null;
-      };
-
-      if (!fromPage.sharedElements || !toPage.sharedElements) {
-        console.warn(this.is + ':', 'sharedElements are undefined for', !fromPage.sharedElements ? fromPage : toPage);
-        return null;
-      };
-
-      var from = fromPage.sharedElements[config.id]
-      var to = toPage.sharedElements[config.id];
-
-      if (!from || !to) {
-        console.warn(this.is + ':', 'sharedElement with id', config.id, 'not found in', !from ? fromPage : toPage);
-        return null;
-      }
-
-      this.sharedElements = {
-        from: from,
-        to: to
-      };
-      return this.sharedElements;
-    }
-
-  };
-
-  /** @polymerBehavior Polymer.NeonSharedElementAnimationBehavior */
-  Polymer.NeonSharedElementAnimationBehavior = [
-    Polymer.NeonAnimationBehavior,
-    Polymer.NeonSharedElementAnimationBehaviorImpl
-  ];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/test/index.html b/systrace/catapult/third_party/polymer/components/neon-animation/test/index.html
deleted file mode 100644
index 81555a2..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/test/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>neon-animation tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'neon-animated-pages.html',
-      'neon-animated-pages.html?dom=shadow',
-      'neon-animated-pages-lazy.html',
-      'neon-animated-pages-lazy.html?dom=shadow',
-      'neon-animated-pages-descendant-selection.html',
-      'neon-animated-pages-descendant-selection.html?dom=shadow',
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages-descendant-selection.html b/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages-descendant-selection.html
deleted file mode 100644
index 0904a39..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages-descendant-selection.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-<meta charset="utf-8">
-<meta http-equiv="x-ua-compatible" content="ie=edge,chrome=1">
-<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-<script src="../../web-component-tester/browser.js"></script>
-<script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-<link rel="import" href="../../test-fixture/test-fixture.html">
-<link rel="import" href="../../neon-animation/neon-animated-pages.html">
-<link rel="import" href="../../neon-animation/neon-animation-behavior.html">
-<link rel="import" href="../../iron-selector/iron-selector.html">
-
-</head>
-<body>
-
-<test-fixture id="descendant-selection">
-  <template>
-    <neon-animated-pages entry-animation="test-animation" animate-initial-selection>
-      <iron-selector selected="0" id="selector">
-        <div>1</div>
-        <div id="target">2</div>
-      </iron-selector>
-    </neon-animated-pages>
-  </template>
-</test-fixture>
-
-<test-fixture id="selecting-item">
-  <template>
-    <neon-animated-pages entry-animation="test-animation" animate-initial-selection>
-      <x-selecting-element></x-selecting-element>
-      <div id="target"></div>
-    </neon-animated-pages>
-  </template>
-</test-fixture>
-
-<dom-module id="x-selecting-element">
-  <template>
-    <iron-selector selected="0" id="selector">
-      <div>1</div>
-      <div id="target">2</div>
-    </iron-selector>
-  </template>
-</dom-module>
-
-<dom-module id="test-element">
-  <template>
-    <neon-animated-pages entry-animation="test-animation" animate-initial-selection>
-      <content></content>
-    </neon-animated-pages>
-  </template>
-</dom-module>
-
-<script>
-  HTMLImports.whenReady(function() {
-    Polymer({ is: 'x-selecting-element' });
-    Polymer({ is: 'test-element' });
-    Polymer({
-      is: 'test-animation',
-      behaviors: [
-        Polymer.NeonAnimationBehavior
-      ],
-      configure: function(config) {
-        config.node.animated = true;
-      }
-    });
-  });
-</script>
-
-<test-fixture id="distributed-children">
-  <template>
-    <test-element>
-      <div>1</div>
-      <div id="target">2</div>
-    </test-element>
-  </template>
-</test-fixture>
-
-<script>
-suite('descendant selection', function() {
-  test('descendents of other selectors are not animated', function() {
-    var animatedPages = fixture('descendant-selection');
-    var selector = Polymer.dom(animatedPages).querySelector('#selector');
-    var target = Polymer.dom(animatedPages).querySelector('#target');
-    Polymer.dom(selector).setAttribute('selected', '1');
-    assert(!target.animated);
-  });
-  test('elements distributed as children are animated', function() {
-    var testElement = fixture('distributed-children');
-    var target = Polymer.dom(testElement).querySelector('#target');
-    var animatedPages = Polymer.dom(testElement.root).querySelector("neon-animated-pages");
-    Polymer.dom(animatedPages).setAttribute('selected', '1');
-    assert(target.animated);
-  });
-  test('ignores selection from shadow descendants of its items', function() {
-    var pages = fixture('selecting-item');
-    var target = Polymer.dom(pages).querySelector('#target');
-    var selecting = Polymer.dom(pages).querySelector('x-selecting-element');
-    selecting.$.selector.selected = 1;
-    assert(!target.animated);
-  });
-});
-</script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages-lazy.html b/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages-lazy.html
deleted file mode 100644
index 86ef198..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages-lazy.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>neon-animated-pages tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script>Polymer = {lazyRegister: true}</script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../neon-animated-pages.html">
-  <link rel="import" href="../neon-animatable.html">
-  <link rel="import" href="../animations/slide-from-left-animation.html">
-  <link rel="import" href="../animations/slide-right-animation.html">
-  <link rel="import" href="test-resizable-pages.html">
-
-</head>
-<body>
-
-  <test-fixture id="animate-initial-selection">
-    <template>
-      <neon-animated-pages entry-animation="slide-from-left-animation" exit-animation="slide-right-animation" animate-initial-selection>
-        <neon-animatable></neon-animatable>
-        <neon-animatable></neon-animatable>
-      </neon-animated-pages>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('animations found when `lazRegister` setting is true', function() {
-      test('animations are registered', function(done) {
-        var animatedPages = fixture('animate-initial-selection');
-        animatedPages._complete = sinon.spy(animatedPages._complete);
-        assert.isUndefined(animatedPages.selected);
-        var pages = Polymer.dom(animatedPages).children;
-        animatedPages.addEventListener('neon-animation-finish', function(event) {
-          if (animatedPages.selected === 0) {
-            animatedPages.selected = 1;
-            return;
-          }
-          assert.strictEqual(animatedPages.selected, 1);
-          assert.equal(event.detail.fromPage, pages[0]);
-          assert.equal(event.detail.toPage, pages[1]);
-          assert.isTrue(animatedPages._complete.calledTwice);
-          var a$ = animatedPages._complete.getCall(1).args[0];
-          assert.isTrue(a$[0].neonAnimation.isNeonAnimation, 'entry animation is not a registered animation');
-          assert.isTrue(a$[1].neonAnimation.isNeonAnimation, 'exit animation is not a registered animation');
-          done();
-        });
-        animatedPages.selected = 0;
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages.html b/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages.html
deleted file mode 100644
index 98220b6..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/test/neon-animated-pages.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>neon-animated-pages tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../neon-animated-pages.html">
-  <link rel="import" href="../neon-animatable.html">
-  <link rel="import" href="../animations/slide-from-left-animation.html">
-  <link rel="import" href="../animations/slide-right-animation.html">
-  <link rel="import" href="test-resizable-pages.html">
-
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <neon-animated-pages>
-      </neon-animated-pages>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="notify-resize">
-    <template>
-      <neon-animated-pages>
-        <a-resizable-page></a-resizable-page>
-        <b-resizable-page></b-resizable-page>
-        <c-resizable-page></c-resizable-page>
-      </neon-animated-pages>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="animate-initial-selection">
-    <template>
-      <neon-animated-pages entry-animation="slide-from-left-animation" exit-animation="slide-right-animation" animate-initial-selection>
-        <neon-animatable></neon-animatable>
-        <neon-animatable></neon-animatable>
-      </neon-animated-pages>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('basic', function() {
-    });
-    suite('notify-resize', function() {
-      test('only a destination page recieves a resize event', function(done) {
-        var animatedPages = fixture('notify-resize');
-        var resizables = Polymer.dom(animatedPages).children;
-        var recieves = {};
-        resizables.forEach(function(page) {
-          page.addEventListener('iron-resize', function(event) {
-            var pageName = event.currentTarget.tagName;
-            recieves[pageName] = pageName in recieves ? recieves[pageName] + 1 : 1;
-          });
-        });
-        animatedPages.selected = 2;
-        setTimeout(function() {
-          assert.deepEqual(recieves, {
-            'C-RESIZABLE-PAGE': 1
-          });
-          done();
-        }, 50);
-      });
-    });
-    suite('animate-initial-selection', function() {
-      test('\'neon-animation-finish\' event fired after animating initial selection', function(done) {
-        var animatedPages = fixture('animate-initial-selection');
-        assert.isUndefined(animatedPages.selected);
-        var pages = Polymer.dom(animatedPages).children;
-        animatedPages.addEventListener('neon-animation-finish', function(event) {
-          assert.strictEqual(animatedPages.selected, 0);
-          assert.isFalse(event.detail.fromPage);
-          assert.deepEqual(event.detail.toPage, pages[0]);
-          done();
-        });
-        animatedPages.selected = 0;
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/test/test-resizable-pages.html b/systrace/catapult/third_party/polymer/components/neon-animation/test/test-resizable-pages.html
deleted file mode 100644
index 7330a1f..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/test/test-resizable-pages.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../neon-shared-element-animatable-behavior.html">
-<link rel="import" href="../../iron-resizable-behavior/iron-resizable-behavior.html">
-
-<dom-module id="a-resizable-page">
-  <template>
-  </template>
-</dom-module>
-
-<dom-module id="b-resizable-page">
-  <template>
-  </template>
-</dom-module>
-
-<dom-module id="c-resizable-page">
-  <template>
-  </template>
-</dom-module>
-
-<script>
-(function() {
-
-  Polymer({
-    is: 'a-resizable-page',
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior,
-      Polymer.IronResizableBehavior
-    ]
-  });
-
-  Polymer({
-    is: 'b-resizable-page',
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior,
-      Polymer.IronResizableBehavior
-    ]
-  });
-
-  Polymer({
-    is: 'c-resizable-page',
-    behaviors: [
-      Polymer.NeonSharedElementAnimatableBehavior,
-      Polymer.IronResizableBehavior
-    ]
-  });
-
-})();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/neon-animation/web-animations.html b/systrace/catapult/third_party/polymer/components/neon-animation/web-animations.html
deleted file mode 100644
index c871854..0000000
--- a/systrace/catapult/third_party/polymer/components/neon-animation/web-animations.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<script src="../web-animations-js/web-animations-next-lite.min.js"></script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-behaviors/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/README.md b/systrace/catapult/third_party/polymer/components/paper-behaviors/README.md
deleted file mode 100644
index 43475db..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-button-behavior.html  paper-checked-element-behavior.html  paper-inky-focus-behavior.html  paper-ripple-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-behaviors)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-behaviors)_
-
-
-<!-- No docs for Polymer.PaperButtonBehavior found. -->
-
-##Polymer.PaperCheckedElementBehavior
-
-Use `Polymer.PaperCheckedElementBehavior` to implement a custom element
-that has a `checked` property similar to `Polymer.IronCheckedElementBehavior`
-and is compatible with having a ripple effect.
-
-
-
-##Polymer.PaperInkyFocusBehavior
-
-`Polymer.PaperInkyFocusBehavior` implements a ripple when the element has keyboard focus.
-
-
-
-##Polymer.PaperRippleBehavior
-
-`Polymer.PaperRippleBehavior` dynamically implements a ripple
-when the element has focus via pointer or keyboard.
-
-NOTE: This behavior is intended to be used in conjunction with and after
-`Polymer.IronButtonState` and `Polymer.IronControlState`.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/bower.json b/systrace/catapult/third_party/polymer/components/paper-behaviors/bower.json
deleted file mode 100644
index 96a8bd6..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/bower.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "name": "paper-behaviors",
-  "version": "1.0.13",
-  "description": "Common behaviors across the paper elements",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "main": [
-    "paper-button-behavior.html",
-    "paper-checked-element-behavior.html",
-    "paper-inky-focus-behavior.html"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "paper",
-    "behavior"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-behaviors"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-behaviors",
-  "dependencies": {
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
-    "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
-    "polymer": "Polymer/polymer#^1.2.1"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "polymerelements/iron-test-helpers#^1.0.0",
-    "paper-material": "PolymerElements/paper-material#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/index.html
deleted file mode 100644
index 0303fef..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/index.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <title>paper-behaviors demo</title>
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link href="paper-button.html" rel="import">
-    <link href="paper-radio-button.html" rel="import">
-
-    <style>
-      body {
-        font-family: sans-serif;
-        padding: 24px;
-        margin: 0;
-      }
-    </style>
-  </head>
-  <body unresolved>
-    <h3>Normal</h3>
-    <paper-button tabindex="0">Hello World</paper-button>
-
-    <h3>Toggles</h3>
-    <paper-button toggles tabindex="0">Hello World</paper-button>
-
-    <h3>Disabled</h3>
-    <paper-button disabled tabindex="0">Hello World</paper-button>
-
-    <h3>Radio button with focus state</h3>
-    <paper-radio-button tabindex="0" title="Radio button with focus state"></paper-radio-button>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/paper-button.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/paper-button.html
deleted file mode 100644
index 238bb17..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/paper-button.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../paper-material/paper-material.html">
-<link rel="import" href="../paper-button-behavior.html">
-
-<dom-module id="paper-button">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        position: relative;
-        background-color: #4285F4;
-        color: #fff;
-        border-radius: 3px;
-        text-transform: uppercase;
-        outline: none;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        -webkit-user-select: none;
-        user-select: none;
-        cursor: pointer;
-      }
-
-      paper-material {
-        border-radius: inherit;
-        padding: 16px;
-      }
-
-      :host([disabled]) {
-        background-color: #888;
-        pointer-events: none;
-      }
-
-      :host([active]),
-      :host([pressed]) {
-        background-color: #3367D6;
-        box-shadow: inset 0 3px 5px rgba(0,0,0,.2);
-      }
-    </style>
-
-    <paper-material class="content" elevation="[[_elevation]]" animated>
-      <content></content>
-    </paper-material>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-button',
-
-      behaviors: [
-        Polymer.PaperButtonBehavior
-      ]
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/paper-radio-button.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/paper-radio-button.html
deleted file mode 100644
index b847086..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/demo/paper-radio-button.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-checked-element-behavior.html">
-
-<dom-module id="paper-radio-button">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        white-space: nowrap;
-      }
-
-      :host(:focus) {
-        outline: none
-      }
-
-      #radioContainer {
-        display: inline-block;
-        position: relative;
-        width: 16px;
-        height: 16px;
-        cursor: pointer;
-        vertical-align: middle;
-      }
-
-      #offRadio {
-        position: absolute;
-        top: 0px;
-        left: 0px;
-        width: 12px;
-        height: 12px;
-        border-radius: 50%;
-        border: solid 2px;
-        border-color: black;
-        transition: border-color 0.28s;
-      }
-
-      #onRadio {
-        position: absolute;
-        top: 4px;
-        left: 4px;
-        width: 8px;
-        height: 8px;
-        border-radius: 50%;
-        background-color: red;
-        -webkit-transform: scale(0);
-        transform: scale(0);
-        transition: -webkit-transform ease 0.28s;
-        transition: transform ease 0.28s;
-      }
-
-      :host([disabled]) {
-        opacity: 0.3;
-        pointer-events: none;
-      }
-
-      :host([pressed]) #offRadio,
-      :host([active]) #offRadio {
-        border-color: red;
-      }
-
-      :host([pressed]) #onRadio,
-      :host([active]) #onRadio {
-        -webkit-transform: scale(1);
-        transform: scale(1);
-      }
-
-      #ink {
-        position: absolute;
-        top: -16px;
-        left: -16px;
-        width: 48px;
-        height: 48px;
-      }
-    </style>
-
-    <div id="radioContainer">
-      <div id="offRadio"></div>
-      <div id="onRadio"></div>
-    </div>
-  </template>
-
-  <script>
-    Polymer({
-      behaviors: [
-        Polymer.PaperCheckedElementBehavior
-      ],
-
-      hostAttributes: {
-        role: 'radio'
-      },
-
-      ready: function() {
-        this.toggles = true;
-      },
-
-      _createRipple: function() {
-        this._rippleContainer = this.$.radioContainer;
-        return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this);
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/index.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/index.html
deleted file mode 100644
index 37184ea..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page src="paper-button-behavior.html"></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-button-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-button-behavior.html
deleted file mode 100644
index c4d1330..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-button-behavior.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="paper-ripple-behavior.html">
-
-<script>
-  /** @polymerBehavior Polymer.PaperButtonBehavior */
-  Polymer.PaperButtonBehaviorImpl = {
-    properties: {
-      /**
-       * The z-depth of this element, from 0-5. Setting to 0 will remove the
-       * shadow, and each increasing number greater than 0 will be "deeper"
-       * than the last.
-       *
-       * @attribute elevation
-       * @type number
-       * @default 1
-       */
-      elevation: {
-        type: Number,
-        reflectToAttribute: true,
-        readOnly: true
-      }
-    },
-
-    observers: [
-      '_calculateElevation(focused, disabled, active, pressed, receivedFocusFromKeyboard)',
-      '_computeKeyboardClass(receivedFocusFromKeyboard)'
-    ],
-
-    hostAttributes: {
-      role: 'button',
-      tabindex: '0',
-      animated: true
-    },
-
-    _calculateElevation: function() {
-      var e = 1;
-      if (this.disabled) {
-        e = 0;
-      } else if (this.active || this.pressed) {
-        e = 4;
-      } else if (this.receivedFocusFromKeyboard) {
-        e = 3;
-      }
-      this._setElevation(e);
-    },
-
-    _computeKeyboardClass: function(receivedFocusFromKeyboard) {
-      this.toggleClass('keyboard-focus', receivedFocusFromKeyboard);
-    },
-
-    /**
-     * In addition to `IronButtonState` behavior, when space key goes down,
-     * create a ripple down effect.
-     *
-     * @param {!KeyboardEvent} event .
-     */
-    _spaceKeyDownHandler: function(event) {
-      Polymer.IronButtonStateImpl._spaceKeyDownHandler.call(this, event);
-      // Ensure that there is at most one ripple when the space key is held down.
-      if (this.hasRipple() && this.getRipple().ripples.length < 1) {
-        this._ripple.uiDownAction();
-      }
-    },
-
-    /**
-     * In addition to `IronButtonState` behavior, when space key goes up,
-     * create a ripple up effect.
-     *
-     * @param {!KeyboardEvent} event .
-     */
-    _spaceKeyUpHandler: function(event) {
-      Polymer.IronButtonStateImpl._spaceKeyUpHandler.call(this, event);
-      if (this.hasRipple()) {
-        this._ripple.uiUpAction();
-      }
-    }
-  };
-
-  /** @polymerBehavior */
-  Polymer.PaperButtonBehavior = [
-    Polymer.IronButtonState,
-    Polymer.IronControlState,
-    Polymer.PaperRippleBehavior,
-    Polymer.PaperButtonBehaviorImpl
-  ];
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-checked-element-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-checked-element-behavior.html
deleted file mode 100644
index 79812a6..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-checked-element-behavior.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-checked-element-behavior/iron-checked-element-behavior.html">
-<link rel="import" href="paper-inky-focus-behavior.html">
-
-<script>
-  /**
-   * Use `Polymer.PaperCheckedElementBehavior` to implement a custom element
-   * that has a `checked` property similar to `Polymer.IronCheckedElementBehavior`
-   * and is compatible with having a ripple effect.
-   * @polymerBehavior Polymer.PaperCheckedElementBehavior
-   */
-  Polymer.PaperCheckedElementBehaviorImpl = {
-    /**
-     * Synchronizes the element's checked state with its ripple effect.
-     */
-    _checkedChanged: function() {
-      Polymer.IronCheckedElementBehaviorImpl._checkedChanged.call(this);
-      if (this.hasRipple()) {
-        if (this.checked) {
-          this._ripple.setAttribute('checked', '');
-        } else {
-          this._ripple.removeAttribute('checked');
-        }
-      }
-    },
-
-    /**
-     * Synchronizes the element's `active` and `checked` state.
-     */
-    _buttonStateChanged: function() {
-      Polymer.PaperRippleBehavior._buttonStateChanged.call(this);
-      if (this.disabled) {
-        return;
-      }
-      if (this.isAttached) {
-        this.checked = this.active;
-      }
-    }
-  };
-
-  /** @polymerBehavior Polymer.PaperCheckedElementBehavior */
-  Polymer.PaperCheckedElementBehavior = [
-    Polymer.PaperInkyFocusBehavior,
-    Polymer.IronCheckedElementBehavior,
-    Polymer.PaperCheckedElementBehaviorImpl
-  ];
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-inky-focus-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-inky-focus-behavior.html
deleted file mode 100644
index 3ecb9ac..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-inky-focus-behavior.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="paper-ripple-behavior.html">
-
-<script>
-  /**
-   * `Polymer.PaperInkyFocusBehavior` implements a ripple when the element has keyboard focus.
-   *
-   * @polymerBehavior Polymer.PaperInkyFocusBehavior
-   */
-  Polymer.PaperInkyFocusBehaviorImpl = {
-    observers: [
-      '_focusedChanged(receivedFocusFromKeyboard)'
-    ],
-
-    _focusedChanged: function(receivedFocusFromKeyboard) {
-      if (receivedFocusFromKeyboard) {
-        this.ensureRipple();
-      }
-      if (this.hasRipple()) {
-        this._ripple.holdDown = receivedFocusFromKeyboard;
-      }
-    },
-
-    _createRipple: function() {
-      var ripple = Polymer.PaperRippleBehavior._createRipple();
-      ripple.id = 'ink';
-      ripple.setAttribute('center', '');
-      ripple.classList.add('circle');
-      return ripple;
-    }
-  };
-
-  /** @polymerBehavior Polymer.PaperInkyFocusBehavior */
-  Polymer.PaperInkyFocusBehavior = [
-    Polymer.IronButtonState,
-    Polymer.IronControlState,
-    Polymer.PaperRippleBehavior,
-    Polymer.PaperInkyFocusBehaviorImpl
-  ];
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-ripple-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-ripple-behavior.html
deleted file mode 100644
index aaacf34..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/paper-ripple-behavior.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-ripple/paper-ripple.html">
-
-<script>
-  /**
-   * `Polymer.PaperRippleBehavior` dynamically implements a ripple
-   * when the element has focus via pointer or keyboard.
-   *
-   * NOTE: This behavior is intended to be used in conjunction with and after
-   * `Polymer.IronButtonState` and `Polymer.IronControlState`.
-   *
-   * @polymerBehavior Polymer.PaperRippleBehavior
-   */
-  Polymer.PaperRippleBehavior = {
-    properties: {
-      /**
-       * If true, the element will not produce a ripple effect when interacted
-       * with via the pointer.
-       */
-      noink: {
-        type: Boolean,
-        observer: '_noinkChanged'
-      },
-
-      /**
-       * @type {Element|undefined}
-       */
-      _rippleContainer: {
-        type: Object,
-      }
-    },
-
-    /**
-     * Ensures a `<paper-ripple>` element is available when the element is
-     * focused.
-     */
-    _buttonStateChanged: function() {
-      if (this.focused) {
-        this.ensureRipple();
-      }
-    },
-
-    /**
-     * In addition to the functionality provided in `IronButtonState`, ensures
-     * a ripple effect is created when the element is in a `pressed` state.
-     */
-    _downHandler: function(event) {
-      Polymer.IronButtonStateImpl._downHandler.call(this, event);
-      if (this.pressed) {
-        this.ensureRipple(event);
-      }
-    },
-
-    /**
-     * Ensures this element contains a ripple effect. For startup efficiency
-     * the ripple effect is dynamically on demand when needed.
-     * @param {!Event=} optTriggeringEvent (optional) event that triggered the
-     * ripple.
-     */
-    ensureRipple: function(optTriggeringEvent) {
-      if (!this.hasRipple()) {
-        this._ripple = this._createRipple();
-        this._ripple.noink = this.noink;
-        var rippleContainer = this._rippleContainer || this.root;
-        if (rippleContainer) {
-          Polymer.dom(rippleContainer).appendChild(this._ripple);
-        }
-        if (optTriggeringEvent) {
-          // Check if the event happened inside of the ripple container
-          // Fall back to host instead of the root because distributed text
-          // nodes are not valid event targets
-          var domContainer = Polymer.dom(this._rippleContainer || this);
-          var target = Polymer.dom(optTriggeringEvent).rootTarget;
-          if (domContainer.deepContains( /** @type {Node} */(target))) {
-            this._ripple.uiDownAction(optTriggeringEvent);
-          }
-        }
-      }
-    },
-
-    /**
-     * Returns the `<paper-ripple>` element used by this element to create
-     * ripple effects. The element's ripple is created on demand, when
-     * necessary, and calling this method will force the
-     * ripple to be created.
-     */
-    getRipple: function() {
-      this.ensureRipple();
-      return this._ripple;
-    },
-
-    /**
-     * Returns true if this element currently contains a ripple effect.
-     * @return {boolean}
-     */
-    hasRipple: function() {
-      return Boolean(this._ripple);
-    },
-
-    /**
-     * Create the element's ripple effect via creating a `<paper-ripple>`.
-     * Override this method to customize the ripple element.
-     * @return {!PaperRippleElement} Returns a `<paper-ripple>` element.
-     */
-    _createRipple: function() {
-      return /** @type {!PaperRippleElement} */ (
-          document.createElement('paper-ripple'));
-    },
-
-    _noinkChanged: function(noink) {
-      if (this.hasRipple()) {
-        this._ripple.noink = noink;
-      }
-    }
-  };
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/index.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/index.html
deleted file mode 100644
index 693054c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="utf-8">
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-button-behavior.html',
-      'paper-radio-button-behavior.html',
-      'paper-checked-element-behavior.html',
-      'paper-ripple-behavior.html',
-      'paper-button-behavior.html?dom=shadow',
-      'paper-radio-button-behavior.html?dom=shadow',
-      'paper-checked-element-behavior.html?dom=shadow',
-      'paper-ripple-behavior.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-button-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-button-behavior.html
deleted file mode 100644
index ff85925..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-button-behavior.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>paper-button-behavior</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="test-button.html">
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <test-button></test-button>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('basic', function() {
-      var button;
-
-      setup(function() {
-        button = fixture('basic');
-      });
-
-      test('normal (no states)', function() {
-        assert.equal(button.elevation, 1);
-      });
-
-      test('set disabled property', function() {
-        button.disabled = true;
-        assert.equal(button.elevation, 0);
-      });
-
-      test('pressed and released', function() {
-        MockInteractions.down(button);
-        assert.equal(button.elevation, 4);
-        MockInteractions.up(button);
-        assert.equal(button.elevation, 1);
-        assert.ok(button.hasRipple());
-      });
-
-      suite('a button with toggles', function() {
-        setup(function() {
-          button.toggles = true;
-        });
-
-        test('activated by tap', function(done) {
-          MockInteractions.downAndUp(button, function() {
-            try {
-              assert.equal(button.elevation, 4);
-              assert.ok(button.hasRipple());
-              done();
-            } catch (e) {
-              done(e);
-            }
-          });
-        });
-      });
-
-      test('receives focused', function() {
-        MockInteractions.focus(button);
-        assert.equal(button.elevation, 3);
-        assert.ok(button.hasRipple());
-      });
-
-      test('space key', function(done) {
-        const SPACE_KEY_CODE = 32;
-        var ripple;
-        MockInteractions.focus(button);
-
-        assert.ok(button.hasRipple());
-
-        ripple = button.getRipple();
-        MockInteractions.keyDownOn(button, SPACE_KEY_CODE);
-
-        assert.equal(ripple.ripples.length, 1);
-
-        MockInteractions.keyDownOn(button, SPACE_KEY_CODE);
-
-        assert.equal(ripple.ripples.length, 1);
-
-        MockInteractions.keyUpOn(button, SPACE_KEY_CODE);
-
-        var transitionEndCalled = false;
-        ripple.addEventListener('transitionend', function() {
-          if (!transitionEndCalled) {
-            transitionEndCalled = true;
-            assert.equal(ripple.ripples.length, 0);
-            done();
-          }
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-checked-element-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-checked-element-behavior.html
deleted file mode 100644
index 363cf4c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-checked-element-behavior.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>paper-checked-element-behavior</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../paper-checked-element-behavior.html">
-</head>
-<body>
-
-  <dom-module id="test-checked">
-    <template>
-    </template>
-    <script>
-    HTMLImports.whenReady(function() {
-      Polymer({
-        is: 'test-checked',
-        behaviors: [
-          Polymer.PaperCheckedElementBehavior
-        ]
-      });
-    });
-    </script>
-  </dom-module>
-
-  <test-fixture id="basic">
-    <template>
-      <test-checked></test-checked>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('PaperCheckedElementBehavior', function() {
-      var checked;
-
-      setup(function() {
-        checked = fixture('basic');
-      });
-
-      test('element checked when tapped to check', function() {
-        MockInteractions.tap(checked);
-        assert.isTrue(checked.checked);
-      });
-
-      test('element checked when active', function() {
-        checked.active = true;
-        assert.isTrue(checked.checked);
-      });
-
-      test('element not checked when disabled and made active', function() {
-        checked.disabled = true;
-        checked.active = true;
-        assert.isFalse(checked.checked);
-      });
-
-      test('element not checked when disabled and tapped', function() {
-        checked.disabled = true;
-        MockInteractions.tap(checked);
-        assert.isFalse(checked.checked);
-      });
-
-      test('element ripple has checked attribute when element tapped to check', function() {
-        MockInteractions.tap(checked);
-        assert.isTrue(checked.hasRipple());
-        assert.isTrue(checked.getRipple().hasAttribute('checked'));
-      });
-
-      test('element ripple does not have checked attribute when element tapped to uncheck', function() {
-        MockInteractions.tap(checked);
-        MockInteractions.tap(checked);
-        assert.isFalse(checked.getRipple().hasAttribute('checked'));
-      });
-
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-radio-button-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-radio-button-behavior.html
deleted file mode 100644
index 0418057..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-radio-button-behavior.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>paper-radio-button-behavior</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="test-radio-button.html">
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <test-radio-button></test-radio-button>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('basic', function() {
-      var button;
-
-      setup(function() {
-        button = fixture('basic');
-        MockInteractions.blur(button);
-      });
-
-      test('normal (no states)', function() {
-        assert.isFalse(button.focused);
-        assert.isFalse(button.hasRipple());
-      });
-
-      test('receives focus', function() {
-        MockInteractions.focus(button);
-
-        assert.isTrue(button.focused);
-        assert.isTrue(button.hasRipple());
-      });
-
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-ripple-behavior.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-ripple-behavior.html
deleted file mode 100644
index 9daf17a..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/paper-ripple-behavior.html
+++ /dev/null
@@ -1,335 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-  <title>paper-ripple-behavior</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../polymer/polymer.html">
-  <link rel="import" href="../../iron-behaviors/iron-button-state.html">
-  <link rel="import" href="../paper-ripple-behavior.html">
-  <link rel="import" href="shadowed-ripple.html">
-</head>
-<body>
-
-  <dom-module id="test-ripple">
-    <template>
-    </template>
-    <script>
-    HTMLImports.whenReady(function() {
-      Polymer({
-        is: 'test-ripple',
-        behaviors: [
-          Polymer.IronButtonState,
-          Polymer.IronControlState,
-          Polymer.PaperRippleBehavior
-        ]
-      });
-    });
-    </script>
-  </dom-module>
-
-  <test-fixture id="basic">
-    <template>
-      <test-ripple></test-ripple>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ShadowBasic">
-    <template>
-      <sd-ripple></sd-ripple>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ShadowText">
-    <template>
-      <sd-ripple>Howdy!</sd-ripple>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ShadowElement">
-    <template>
-      <sd-ripple>
-        <div id="source">source!</div>
-      </sd-ripple>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('PaperRippleBehavior', function() {
-      var ripple;
-
-      setup(function() {
-        ripple = fixture('basic');
-      });
-
-      test('no ripple at startup', function() {
-        assert.isFalse(ripple.hasRipple());
-      });
-
-      test('calling getRipple returns ripple', function() {
-        assert.ok(ripple.getRipple());
-      });
-
-      test('focus generates ripple', function() {
-        MockInteractions.focus(ripple);
-        assert.ok(ripple.hasRipple());
-      });
-
-      test('down generates ripple', function() {
-        MockInteractions.down(ripple);
-        assert.ok(ripple.hasRipple());
-        MockInteractions.up(ripple);
-      });
-
-      suite('Correct Targeting', function() {
-
-        function assertInteractionCausesRipple(host, node, expected, msg) {
-          var ripple = host.getRipple();
-          Polymer.dom.flush();
-          MockInteractions.down(node);
-          assert.equal(ripple.ripples.length > 0, expected, msg);
-          MockInteractions.up(node);
-        }
-
-        function assertInteractionAtLocationCausesRipple(host, node, location, expected, msg) {
-          var ripple = host.getRipple();
-          Polymer.dom.flush();
-          MockInteractions.down(node, location);
-          assert.equal(ripple.ripples.length > 0, expected, msg);
-          MockInteractions.up(node);
-        }
-
-        suite('basic', function() {
-          suite('container = host', function() {
-
-            setup(function() {
-              ripple = fixture('ShadowBasic');
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, true, 'ripple');
-            });
-            test('tap #wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, true, '#wrapper');
-            });
-            test('tap #separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, true, '#separate')
-            });
-          });
-
-          suite('container = wrapper', function() {
-
-            setup(function() {
-              ripple = fixture('ShadowBasic');
-              ripple._rippleContainer = ripple.$.wrapper;
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, false, 'ripple');
-            });
-
-            test('tap #wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, true, '#wrapper');
-            });
-
-            test('tap #separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, false, '#separate')
-            });
-          });
-
-          suite('container = separate', function() {
-
-            setup(function() {
-              ripple = fixture('ShadowBasic');
-              ripple._rippleContainer = ripple.$.separate;
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, false, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, false, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, true, '#separate')
-            });
-          });
-        });
-
-        suite('distributed text', function() {
-          var textLocation;
-
-          function getTextLocation(ripple) {
-            // build a Range to get the BCR of a given text node
-            var r = document.createRange();
-            r.selectNode(Polymer.dom(ripple.$.content).getDistributedNodes()[0]);
-            return MockInteractions.middleOfNode(r);
-          }
-
-          suite('container = host', function() {
-            setup(function() {
-              ripple = fixture('ShadowText');
-              textLocation = getTextLocation(ripple);
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, true, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, true, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, true, '#separate')
-            });
-
-            test('tap text', function() {
-              assertInteractionAtLocationCausesRipple(ripple, ripple.$.wrapper, textLocation, true, 'text');
-            });
-          });
-
-          suite('container = wrapper', function() {
-            setup(function() {
-              ripple = fixture('ShadowText');
-              ripple._rippleContainer = ripple.$.wrapper;
-              textLocation = getTextLocation(ripple);
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, false, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, true, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, false, '#separate')
-            });
-
-            test('tap text', function() {
-              assertInteractionAtLocationCausesRipple(ripple, ripple.$.wrapper, textLocation, true, 'text');
-            });
-          });
-
-          suite('container = separate', function() {
-            setup(function() {
-              ripple = fixture('ShadowText');
-              ripple._rippleContainer = ripple.$.separate;
-              textLocation = getTextLocation(ripple);
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, false, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, false, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, true, '#separate')
-            });
-
-            test('tap text', function() {
-              assertInteractionAtLocationCausesRipple(ripple, ripple.$.wrapper, textLocation, false, 'text');
-            });
-          });
-        });
-
-        suite('distributed element', function() {
-          var source;
-
-          suite('container = host', function() {
-            setup(function() {
-              ripple = fixture('ShadowElement');
-              source = Polymer.dom(ripple).querySelector('#source');
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, true, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, true, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, true, '#separate')
-            });
-
-            test('tap source', function() {
-              assertInteractionCausesRipple(ripple, source, true, '#source');
-            });
-          });
-
-          suite('container = wrapper', function() {
-            setup(function() {
-              ripple = fixture('ShadowElement');
-              ripple._rippleContainer = ripple.$.wrapper;
-              source = Polymer.dom(ripple).querySelector('#source');
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, false, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, true, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, false, '#separate')
-            });
-
-            test('tap source', function() {
-              assertInteractionCausesRipple(ripple, source, true, '#source');
-            });
-          });
-
-          suite('container = separate', function() {
-            setup(function() {
-              ripple = fixture('ShadowElement');
-              ripple._rippleContainer = ripple.$.separate;
-              source = Polymer.dom(ripple).querySelector('#source');
-            });
-
-            test('tap host', function() {
-              assertInteractionCausesRipple(ripple, ripple, false, 'ripple');
-            });
-
-            test('tap wrapper', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.wrapper, false, '#wrapper');
-            });
-
-            test('tap separate', function() {
-              assertInteractionCausesRipple(ripple, ripple.$.separate, true, '#separate')
-            });
-
-            test('tap source', function() {
-              assertInteractionCausesRipple(ripple, source, false, '#source');
-            });
-          });
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/shadowed-ripple.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/shadowed-ripple.html
deleted file mode 100644
index 1ebad13..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/shadowed-ripple.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-behaviors/iron-button-state.html">
-<link rel="import" href="../paper-ripple-behavior.html">
-<dom-module id="sd-ripple">
-  <template>
-    <style>
-      :host {
-        display: block;
-        width: 200px;
-      }
-      #separate, #wrapper {
-        height: 50px;
-      }
-      #separate {
-        background: blue;
-      }
-      #wrapper {
-        background: red;
-      }
-      #wrapper > ::content  #source {
-        height: 25px;
-        width: 50px;
-        background: green;
-      }
-    </style>
-    <div id="separate">
-      <div id="target">
-        Internal Text Node
-      </div>
-    </div>
-    <div id="wrapper">
-      <content id="content"></content>
-    </div>
-  </template>
-  <script>
-    Polymer({
-      is: 'sd-ripple',
-      behaviors: [
-        Polymer.IronButtonState,
-        Polymer.IronControlState,
-        Polymer.PaperRippleBehavior
-      ]
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/test-button.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/test-button.html
deleted file mode 100644
index 3bbf356..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/test-button.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-button-behavior.html">
-
-<dom-module id="test-button">
-
-  <template>
-    <content></content>
-  </template>
-
-  <script>
-
-    Polymer({
-
-      is: 'test-button',
-
-      behaviors: [
-        Polymer.PaperButtonBehavior
-      ]
-
-    });
-
-  </script>
-
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/test-radio-button.html b/systrace/catapult/third_party/polymer/components/paper-behaviors/test/test-radio-button.html
deleted file mode 100644
index 945a08e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-behaviors/test/test-radio-button.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-checked-element-behavior.html">
-<link rel="import" href="../../paper-ripple/paper-ripple.html">
-
-<dom-module id="test-radio-button">
-  <template>
-    <style>
-      :host #ink {
-        position: absolute;
-        top: -16px;
-        left: -16px;
-        width: 48px;
-        height: 48px;
-      }
-    </style>
-    
-    <div id="container">
-      <paper-ripple id="ink" class="circle" center></paper-ripple>
-    </div>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'test-radio-button',
-
-    behaviors: [
-      Polymer.PaperCheckedElementBehavior
-    ]
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-button/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/README.md b/systrace/catapult/third_party/polymer/components/paper-button/README.md
deleted file mode 100644
index 6b36c91..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-button)
-[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-button)
-
-##&lt;paper-button&gt;
-
-Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html)
-
-`paper-button` is a button. When the user touches the button, a ripple effect emanates
-from the point of contact. It may be flat or raised. A raised button is styled with a
-shadow.
-
-Example:
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-button.html">
-    <link rel="import" href="../paper-styles/color.html">
-    <style is="custom-style">
-      #container {
-        display: flex;
-      }
-      paper-button {
-        font-family: 'Roboto', 'Noto', sans-serif;
-        font-weight: normal;
-        font-size: 14px;
-        -webkit-font-smoothing: antialiased;
-      }
-      paper-button.pink {
-        color: var(--paper-pink-a200);
-        --paper-button-ink-color: var(--paper-pink-a200);
-      }
-      paper-button.pink:hover {
-        background-color: var(--paper-pink-100);
-      }
-      paper-button.indigo {
-        background-color: var(--paper-indigo-500);
-        color: white;
-        --paper-button-raised-keyboard-focus: {
-          background-color: var(--paper-pink-a200) !important;
-          color: white !important;
-        };
-      }
-      paper-button.indigo:hover {
-        background-color: var(--paper-indigo-400);
-      }
-      paper-button.green {
-        background-color: var(--paper-green-500);
-        color: white;
-      }
-      paper-button.green[active] {
-        background-color: var(--paper-red-500);
-      }
-      paper-button.disabled {
-        color: white;
-      }
-    </style>
-    <div id="container">
-      <next-code-block></next-code-block>
-    </div>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-button class="pink">link</paper-button>
-<paper-button raised class="indigo">raised</paper-button>
-<paper-button toggles raised class="green">toggles</paper-button>
-<paper-button disabled class="disabled">disabled</paper-button>
-```
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/bower.json b/systrace/catapult/third_party/polymer/components/paper-button/bower.json
deleted file mode 100644
index a2c957a..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/bower.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "name": "paper-button",
-  "version": "1.0.15",
-  "description": "Material design button",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "paper",
-    "button"
-  ],
-  "main": "paper-button.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-button.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-button",
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-material": "PolymerElements/paper-material#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-button/demo/index.html
deleted file mode 100644
index c213090..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/demo/index.html
+++ /dev/null
@@ -1,138 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-button demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../paper-button.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    .vertical-section-container {
-      max-width: 500px;
-    }
-    paper-button {
-      margin-left: 10px;
-      margin-right: 10px;
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Buttons can be flat, raised, toggleable, or disabled</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-button>link</paper-button>
-        <paper-button raised>raised</paper-button>
-        <paper-button toggles raised>toggles</paper-button>
-        <paper-button disabled>disabled</paper-button>
-      </template>
-    </demo-snippet>
-
-    <h3>Buttons can have icons</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-button><iron-icon icon="check"></iron-icon>link</paper-button>
-        <paper-button raised><iron-icon icon="file-download"></iron-icon>raised</paper-button>
-        <paper-button toggles raised><iron-icon icon="favorite"></iron-icon>toggles</paper-button>
-        <paper-button disabled><iron-icon icon="block"></iron-icon>disabled</paper-button>
-      </template>
-    </demo-snippet>
-
-    <h3>Buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-button noink>link</paper-button>
-        <paper-button raised noink>raised</paper-button>
-        <paper-button toggles raised noink>toggles</paper-button>
-        <paper-button disabled noink>disabled</paper-button>
-      </template>
-    </demo-snippet>
-
-    <h3>Buttons can be styled using custom properties</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-button class="custom pink">link</paper-button>
-        <paper-button raised class="custom indigo">raised</paper-button>
-        <paper-button toggles raised class="custom green">toggles</paper-button>
-        <paper-button disabled class="custom disabled">disabled</paper-button>
-
-        <style is="custom-style">
-          paper-button.custom {
-            --paper-button-ink-color: var(--paper-pink-a200);
-            /* These could also be individually defined for each of the
-              specific css classes, but we'll just do it once as an example */
-            --paper-button-flat-keyboard-focus: {
-              background-color: var(--paper-pink-a200);
-              color: white !important;
-            };
-            --paper-button-raised-keyboard-focus: {
-              background-color: var(--paper-pink-a200) !important;
-              color: white !important;
-            };
-          }
-          paper-button.custom:hover {
-            background-color: var(--paper-indigo-100);
-          }
-          paper-button.pink {
-            color: var(--paper-pink-a200);
-
-          }
-          paper-button.indigo {
-            background-color: var(--paper-indigo-500);
-            color: white;
-            --paper-button-raised-keyboard-focus: {
-              background-color: var(--paper-pink-a200) !important;
-              color: white !important;
-            };
-          }
-          paper-button.green {
-            background-color: var(--paper-green-500);
-            color: white;
-          }
-          paper-button.green[active] {
-            background-color: var(--paper-red-500);
-          }
-          paper-button.disabled {
-            color: white;
-          }
-        </style>
-      </template>
-    </demo-snippet>
-
-    <h3>Buttons can be used as a link</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <a href="https://www.polymer-project.org/" tabindex="-1">
-          <paper-button raised>Polymer Project</paper-button>
-        </a>
-        <style>
-          a paper-button,
-          a:active paper-button,
-          a:visited paper-button {
-            color: #000;
-          }
-        </style>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/index.html b/systrace/catapult/third_party/polymer/components/paper-button/index.html
deleted file mode 100644
index 487bb5c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/package.json b/systrace/catapult/third_party/polymer/components/paper-button/package.json
deleted file mode 100644
index 24f4d4d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "name": "paper-button",
-  "version": "2.0.0",
-  "private": true,
-  "main": "index.js",
-  "repository": "https://github.com/PolymerElements/paper-button.git",
-  "author": "Justin Fagnani <justinfagnani@google.com>",
-  "license": "MIT"
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/paper-button.html b/systrace/catapult/third_party/polymer/components/paper-button/paper-button.html
deleted file mode 100644
index c93a3f5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/paper-button.html
+++ /dev/null
@@ -1,186 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-behaviors/paper-button-behavior.html">
-<link rel="import" href="../paper-material/paper-material-shared-styles.html">
-
-<!--
-Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html)
-
-`paper-button` is a button. When the user touches the button, a ripple effect emanates
-from the point of contact. It may be flat or raised. A raised button is styled with a
-shadow.
-
-Example:
-
-    <paper-button>Flat button</paper-button>
-    <paper-button raised>Raised button</paper-button>
-    <paper-button noink>No ripple effect</paper-button>
-    <paper-button toggles>Toggle-able button</paper-button>
-
-A button that has `toggles` true will remain `active` after being clicked (and
-will have an `active` attribute set). For more information, see the `Polymer.IronButtonState`
-behavior.
-
-You may use custom DOM in the button body to create a variety of buttons. For example, to
-create a button with an icon and some text:
-
-    <paper-button>
-      <iron-icon icon="favorite"></iron-icon>
-      custom button content
-    </paper-button>
-
-To use `paper-button` as a link, wrap it in an anchor tag. Since `paper-button` will already
-receive focus, you may want to prevent the anchor tag from receiving focus as well by setting
-its tabindex to -1.
-
-    <a href="https://www.polymer-project.org/" tabindex="-1">
-      <paper-button raised>Polymer Project</paper-button>
-    </a>
-
-### Styling
-
-Style the button with CSS as you would a normal DOM element.
-
-    paper-button.fancy {
-      background: green;
-      color: yellow;
-    }
-
-    paper-button.fancy:hover {
-      background: lime;
-    }
-
-    paper-button[disabled],
-    paper-button[toggles][active] {
-      background: red;
-    }
-
-By default, the ripple is the same color as the foreground at 25% opacity. You may
-customize the color using the `--paper-button-ink-color` custom property.
-
-The following custom properties and mixins are also available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-button-ink-color` | Background color of the ripple | `Based on the button's color`
-`--paper-button` | Mixin applied to the button | `{}`
-`--paper-button-disabled` | Mixin applied to the disabled button. Note that you can also use the `paper-button[disabled]` selector | `{}`
-`--paper-button-flat-keyboard-focus` | Mixin applied to a flat button after it's been focused using the keyboard | `{}`
-`--paper-button-raised-keyboard-focus` | Mixin applied to a raised button after it's been focused using the keyboard | `{}`
-
-@demo demo/index.html
--->
-
-<dom-module id="paper-button">
-  <template strip-whitespace>
-    <style include="paper-material-shared-styles">
-      :host {
-        @apply(--layout-inline);
-        @apply(--layout-center-center);
-        position: relative;
-        box-sizing: border-box;
-        min-width: 5.14em;
-        margin: 0 0.29em;
-        background: transparent;
-        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-        -webkit-tap-highlight-color: transparent;
-        font: inherit;
-        text-transform: uppercase;
-        outline-width: 0;
-        border-radius: 3px;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        -webkit-user-select: none;
-        user-select: none;
-        cursor: pointer;
-        z-index: 0;
-        padding: 0.7em 0.57em;
-
-        @apply(--paper-font-common-base);
-        @apply(--paper-button);
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      :host([raised].keyboard-focus) {
-        font-weight: bold;
-        @apply(--paper-button-raised-keyboard-focus);
-      }
-
-      :host(:not([raised]).keyboard-focus) {
-        font-weight: bold;
-        @apply(--paper-button-flat-keyboard-focus);
-      }
-
-      :host([disabled]) {
-        background: #eaeaea;
-        color: #a8a8a8;
-        cursor: auto;
-        pointer-events: none;
-
-        @apply(--paper-button-disabled);
-      }
-
-      :host([animated]) {
-        @apply(--shadow-transition);
-      }
-
-      paper-ripple {
-        color: var(--paper-button-ink-color);
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-</dom-module>
-<script>
-Polymer({
-  is: 'paper-button',
-
-  behaviors: [
-    Polymer.PaperButtonBehavior
-  ],
-
-  properties: {
-    /**
-      * If true, the button should be styled with a shadow.
-      */
-    raised: {
-      type: Boolean,
-      reflectToAttribute: true,
-      value: false,
-      observer: '_calculateElevation'
-    }
-  },
-
-  _calculateElevation: function() {
-    if (!this.raised) {
-      this._setElevation(0);
-    } else {
-      Polymer.PaperButtonBehaviorImpl._calculateElevation.apply(this);
-    }
-  }
-
-  /**
-  Fired when the animation finishes.
-  This is useful if you want to wait until
-  the ripple animation finishes to perform some action.
-
-  @event transitionend
-  Event param: {{node: Object}} detail Contains the animated node.
-  */
-});
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/test/index.html b/systrace/catapult/third_party/polymer/components/paper-button/test/index.html
deleted file mode 100644
index 5004819..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-button tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-button.html',
-      'paper-button.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-button/test/paper-button.html b/systrace/catapult/third_party/polymer/components/paper-button/test/paper-button.html
deleted file mode 100644
index 54200e6..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-button/test/paper-button.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-button basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../paper-button.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialButton">
-    <template>
-      <paper-button>Button</paper-button>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('<paper-button>', function() {
-      var button;
-
-      setup(function() {
-        button = fixture('TrivialButton');
-      });
-
-      test('can be raised imperatively', function(done) {
-        button.raised = true;
-
-        expect(button.hasAttribute('raised')).to.be.eql(true);
-
-        Polymer.Base.async(function() {
-          try {
-            expect(button.elevation).to.be.eql(1);
-            done();
-          } catch (e) {
-            done(e);
-          }
-        }, 1);
-      });
-
-      test('can be unraised after being raised imperatively', function(done) {
-        button.raised = true;
-        expect(button.hasAttribute('raised')).to.be.eql(true);
-
-        Polymer.Base.async(function() {
-          expect(button.elevation).to.be.eql(1);
-
-          button.raised = false;
-          expect(button.hasAttribute('raised')).to.be.eql(false);
-          Polymer.Base.async(function() {
-            expect(button.elevation).to.be.eql(0);
-            done();
-          }, 1);
-        }, 1);
-      });
-
-      test('can be disabled imperatively', function() {
-        button.disabled = true;
-        expect(button.getAttribute('aria-disabled')).to.be.eql('true');
-        expect(button.hasAttribute('disabled')).to.be.eql(true);
-      });
-
-      test('can be triggered with space', function(done) {
-        button.addEventListener('click', function() {
-          done();
-        });
-        MockInteractions.pressSpace(button);
-      });
-
-      test('can be triggered with enter', function(done) {
-        button.addEventListener('click', function() {
-          done();
-        });
-        MockInteractions.pressEnter(button);
-      });
-    });
-
-    suite('<paper-button>', function() {
-      var button;
-
-      setup(function() {
-        button = fixture('TrivialButton');
-      });
-
-      test('has aria role "button"', function() {
-        expect(button.getAttribute('role')).to.be.eql('button');
-      });
-
-      a11ySuite('TrivialButton');
-    });
-
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-card/CONTRIBUTING.md
deleted file mode 100755
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/README.md b/systrace/catapult/third_party/polymer/components/paper-card/README.md
deleted file mode 100755
index 94466db..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/README.md
+++ /dev/null
@@ -1,65 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-card.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-card.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-card)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-card)_
-
-
-##&lt;paper-card&gt;
-
-Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
-
-`paper-card` is a container with a drop shadow.
-
-Example:
-
-```html
-<paper-card heading="Card Title">
-  <div class="card-content">Some content</div>
-  <div class="card-actions">
-    <paper-button>Some action</paper-button>
-  </div>
-</paper-card>
-```
-
-Example - top card image:
-
-```html
-<paper-card heading="Card Title" image="/path/to/image.png">
-  ...
-</paper-card>
-```
-
-### Accessibility
-
-By default, the `aria-label` will be set to the value of the `heading` attribute.
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-card-background-color` | The background color of the card | `--primary-background-color` |
-| `--paper-card-header-color` | The color of the header text | `#000` |
-| `--paper-card-header` | Mixin applied to the card header section | `{}` |
-| `--paper-card-header-text` | Mixin applied to the title in the card header section | `{}` |
-| `--paper-card-header-image` | Mixin applied to the image in the card header section | `{}` |
-| `--paper-card-header-image-text` | Mixin applied to the text overlapping the image in the card header section | `{}` |
-| `--paper-card-content` | Mixin applied to the card content section | `{}` |
-| `--paper-card-actions` | Mixin applied to the card action section | `{}` |
-| `--paper-card` | Mixin applied to the card | `{}` |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/bower.json b/systrace/catapult/third_party/polymer/components/paper-card/bower.json
deleted file mode 100755
index b17e3fa..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/bower.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "name": "paper-card",
-  "version": "1.1.1",
-  "description": "Material design piece of paper with unique related data",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "card"
-  ],
-  "main": "paper-card.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-card.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-card",
-  "ignore": [],
-  "dependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-image": "PolymerElements/iron-image#^1.2.0",
-    "paper-material": "PolymerElements/paper-material#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.1.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-collapse": "PolymerElements/iron-collapse#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "paper-checkbox": "PolymerElements/paper-checkbox#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/demo/cafe.png b/systrace/catapult/third_party/polymer/components/paper-card/demo/cafe.png
deleted file mode 100644
index a3dc6a8..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/demo/cafe.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/demo/donuts.png b/systrace/catapult/third_party/polymer/components/paper-card/demo/donuts.png
deleted file mode 100644
index 5f66880..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/demo/donuts.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/demo/house.png b/systrace/catapult/third_party/polymer/components/paper-card/demo/house.png
deleted file mode 100644
index a7f1c24..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/demo/house.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-card/demo/index.html
deleted file mode 100644
index c4dfbe9..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/demo/index.html
+++ /dev/null
@@ -1,323 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html lang="en">
-<head>
-  <title>paper-card demo</title>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-
-  <link rel="import" href="../../iron-collapse/iron-collapse.html">
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../../iron-icons/communication-icons.html">
-  <link rel="import" href="../../iron-icons/hardware-icons.html">
-  <link rel="import" href="../../iron-icons/social-icons.html">
-  <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../../paper-checkbox/paper-checkbox.html">
-  <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../paper-styles/typography.html">
-  <link rel="import" href="../paper-card.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    demo-snippet {
-      --demo-snippet-demo: {
-        background: var(--paper-grey-200);
-        padding: 8px;
-      };
-      --demo-snippet-code: {
-        max-height: 300px;
-      };
-    }
-
-    paper-card {
-      width: 100%;
-    }
-
-    .horizontal {
-      @apply(--layout-horizontal);
-    }
-
-    .justified {
-      @apply(--layout-justified);
-    }
-
-    .amber {
-      background: var(--paper-amber-900);
-    }
-
-    .lime {
-      background: var(--paper-lime-500);
-    }
-
-    .cyan {
-      background: var(--paper-cyan-500);
-    }
-
-    .dark {
-      background: var(--paper-blue-grey-500);
-    }
-    paper-card.dark, paper-card.amber, paper-card.lime, paper-card.cyan {
-      color: white;
-      --paper-card-header-color: white;
-    }
-
-    paper-checkbox {
-      display: block;
-      margin-bottom: 4px;
-      --paper-checkbox-label-color: white;
-      --paper-checkbox-unchecked-color: white;
-    }
-
-    paper-icon-button {
-      color: var(--paper-grey-600);
-    }
-
-    paper-icon-button.white {
-      color: white !important;
-    }
-  </style>
-
-</head>
-<body unresolved>
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>A paper-card with a simple heading, header image, body content, and actions</h3>
-      <demo-snippet>
-        <template>
-          <paper-card heading="Emmental" image="http://placehold.it/350x150/FFC107/000000">
-            <div class="card-content">
-              Emmentaler or Emmental is a yellow, medium-hard cheese that originated in the area around Emmental, Switzerland. It is one of the cheeses of Switzerland, and is sometimes known as Swiss cheese.
-            </div>
-            <div class="card-actions">
-              <paper-button>Share</paper-button>
-              <paper-button>Explore!</paper-button>
-            </div>
-          </paper-card>
-        </template>
-      </demo-snippet>
-
-      <h3>Paper-cards can contain advanced content</h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            .cafe-header { @apply(--paper-font-headline); }
-            .cafe-light { color: var(--paper-grey-600); }
-            .cafe-location {
-              float: right;
-              font-size: 15px;
-              vertical-align: middle;
-            }
-            .cafe-reserve { color: var(--google-blue-500); }
-            iron-icon.star {
-              --iron-icon-width: 16px;
-              --iron-icon-height: 16px;
-              color: var(--paper-amber-500);
-            }
-            iron-icon.star:last-of-type { color: var(--paper-grey-500); }
-          </style>
-            <paper-card image="./donuts.png">
-              <div class="card-content">
-                <div class="cafe-header">Cafe Basilico
-                  <div class="cafe-location cafe-light">
-                    <iron-icon icon="communication:location-on"></iron-icon>
-                    <span>250ft</span>
-                  </div>
-                </div>
-                <div class="cafe-rating">
-                  <iron-icon class="star" icon="star"></iron-icon>
-                  <iron-icon class="star" icon="star"></iron-icon>
-                  <iron-icon class="star" icon="star"></iron-icon>
-                  <iron-icon class="star" icon="star"></iron-icon>
-                  <iron-icon class="star" icon="star"></iron-icon>
-                </div>
-                <p>$・Italian, Cafe</p>
-                <p class="cafe-light">Small plates, salads &amp; sandwiches in an intimate setting with 12 indoor seats plus patio seating.</p>
-              </div>
-              <div class="card-actions">
-                <p>Tonight's availability</p>
-                <div class="horizontal justified">
-                  <paper-icon-button icon="icons:event"></paper-icon-button>
-                  <paper-button>5:30PM</paper-button>
-                  <paper-button>7:30PM</paper-button>
-                  <paper-button>9:00PM</paper-button>
-                </div>
-                <paper-button class="cafe-reserve">Reserve</paper-button>
-              </div>
-            </paper-card>
-        </template>
-      </demo-snippet>
-
-      <h3>Paper-cards can have a horizontal image</h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            paper-card.rate { @apply(--layout-horizontal); }
-            .rate-image {
-              width: 100px;
-              height: 170px;
-              background: url('./donuts.png');
-              background-size: cover;
-            }
-            .rate-content {
-              @apply(--layout-flex);
-              float: left;
-            }
-            .rate-header { @apply(--paper-font-headline); }
-            .rate-name { color: var(--paper-grey-600); margin: 10px 0; }
-            paper-icon-button.rate-icon {
-              --iron-icon-fill-color: white;
-              --iron-icon-stroke-color: var(--paper-grey-600);
-            }
-          </style>
-          <paper-card class="rate">
-            <div class="rate-content">
-              <div class="card-content">
-                <div class="rate-header">Rate this album</div>
-                <div class="rate-name">Mac Miller</div>
-                <div>Live from space</div>
-              </div>
-              <div class="card-actions">
-                <paper-icon-button class="rate-icon" icon="star"></paper-icon-button>
-                <paper-icon-button class="rate-icon" icon="star"></paper-icon-button>
-                <paper-icon-button class="rate-icon" icon="star"></paper-icon-button>
-                <paper-icon-button class="rate-icon" icon="star"></paper-icon-button>
-                <paper-icon-button class="rate-icon" icon="star"></paper-icon-button>
-              </div>
-            </div>
-            <div class="rate-image"></div>
-          </paper-card>
-        </template>
-      </demo-snippet>
-
-      <h3>Paper-cards can have expanded supporting text</h3>
-      <demo-snippet>
-        <template>
-          <paper-card heading="Top western road trips" image="./trip.png" class="white">
-            <div class="card-content">1,000 miles of wonder</div>
-            <div class="card-actions">
-              <paper-button>Share</paper-button>
-              <paper-button>Explore</paper-button>
-              <paper-icon-button
-                icon="hardware:keyboard-arrow-up"
-                title="more info"
-                onclick="_toggle()"
-                style="float:right;">
-              </paper-icon-button>
-              <iron-collapse id="more-info" style="width:100%;">
-                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent enim ante, tempus eget volutpat ac, cursus ac ante. Nulla facilisi. Praesent sed lacinia ligula. Donec malesuada nisl eget quam iaculis, vel placerat justo cursus.
-              </iron-collapse>
-              <script>
-                function _toggle() {
-                  var moreInfo = document.getElementById('more-info');
-                  var iconButton = Polymer.dom(event).localTarget;
-                  iconButton.icon = moreInfo.opened ? 'hardware:keyboard-arrow-up'
-                                                    : 'hardware:keyboard-arrow-down';
-                  moreInfo.toggle();
-                }
-              </script>
-            </div>
-          </paper-card>
-        </template>
-      </demo-snippet>
-
-      <h3>Paper-cards can be organized in different collections</h3>
-
-      <h3>Same layout, different content</h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            paper-card.white {
-              --paper-card-header-color: #fff;
-            }
-          </style>
-          <paper-card heading="Pre-fab homes" image="./house.png" class="white" style="margin-bottom:8px;">
-            <div class="card-actions">
-              <paper-icon-button icon="favorite"></paper-icon-button>
-              <paper-icon-button icon="bookmark"></paper-icon-button>
-              <paper-icon-button icon="social:share"></paper-icon-button>
-            </div>
-          </paper-card>
-          <div class="horizontal">
-            <paper-card heading="Favorite trips" image="./trip.png" class="white" style="margin-right:4px;">
-              <div class="card-actions horizontal justified">
-                <paper-icon-button icon="favorite"></paper-icon-button>
-                <paper-icon-button icon="bookmark"></paper-icon-button>
-                <paper-icon-button icon="social:share"></paper-icon-button>
-              </div>
-            </paper-card>
-            <paper-card heading="Best airlines" image="./travel.png" class="white" style="margin-left:4px;">
-              <div class="card-actions horizontal justified">
-                <paper-icon-button icon="favorite"></paper-icon-button>
-                <paper-icon-button icon="bookmark"></paper-icon-button>
-                <paper-icon-button icon="social:share"></paper-icon-button>
-              </div>
-            </paper-card>
-          </div>
-        </template>
-      </demo-snippet>
-
-      <h3>Different layout and content</h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            #notes {
-              @apply(--layout-vertical);
-              @apply(--layout-wrap);
-              height: 344px;
-              width: 384px;
-            }
-
-            #notes > paper-card {
-              box-sizing: border-box;
-              max-width: 184px;
-              margin: 4px;
-              flex: 0 0 auto;
-            }
-          </style>
-          <div id="notes">
-            <paper-card heading="Call Jennifer" class="cyan">
-              <div class="card-actions">
-                <paper-icon-button icon="communication:call" style="color:white;"></paper-icon-button>
-                <span>March 19, 2017</span>
-              </div>
-            </paper-card>
-            <paper-card class="dark">
-              <div class="card-content">
-                <p>Groceries:</p>
-                <paper-checkbox>almond milk</paper-checkbox>
-                <paper-checkbox>coconut water</paper-checkbox>
-                <paper-checkbox>cheese</paper-checkbox>
-                <paper-checkbox>green apples</paper-checkbox>
-              </div>
-              <div class="card-actions">
-                <paper-icon-button icon="communication:location-on" style="color:white"></paper-icon-button>
-                <span>Campbell</span>
-              </div>
-            </paper-card>
-            <paper-card heading="clean desk" class="lime"></paper-card>
-            <paper-card image="./donuts.png" class="amber">
-              <div class="card-content">New cafe opened on Valencia St.</div>
-            </paper-card>
-            <paper-card heading="Yuna tickets on sale 6/24" class="cyan">
-            </paper-card>
-          </div>
-        </template>
-      </demo-snippet>
-    </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/demo/travel.png b/systrace/catapult/third_party/polymer/components/paper-card/demo/travel.png
deleted file mode 100644
index 7d8e821..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/demo/travel.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/demo/trip.png b/systrace/catapult/third_party/polymer/components/paper-card/demo/trip.png
deleted file mode 100644
index 746d0b3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/demo/trip.png
+++ /dev/null
Binary files differ
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/index.html b/systrace/catapult/third_party/polymer/components/paper-card/index.html
deleted file mode 100644
index fab428a..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <title>paper-card</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-<iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/paper-card.html b/systrace/catapult/third_party/polymer/components/paper-card/paper-card.html
deleted file mode 100644
index 20c462c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/paper-card.html
+++ /dev/null
@@ -1,226 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-image/iron-image.html">
-<link rel="import" href="../paper-material/paper-material.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<!--
-Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
-
-`paper-card` is a container with a drop shadow.
-
-Example:
-
-    <paper-card heading="Card Title">
-      <div class="card-content">Some content</div>
-      <div class="card-actions">
-        <paper-button>Some action</paper-button>
-      </div>
-    </paper-card>
-
-Example - top card image:
-
-    <paper-card heading="Card Title" image="/path/to/image.png">
-      ...
-    </paper-card>
-
-### Accessibility
-
-By default, the `aria-label` will be set to the value of the `heading` attribute.
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-card-background-color` | The background color of the card | `--primary-background-color`
-`--paper-card-header-color` | The color of the header text | `#000`
-`--paper-card-header` | Mixin applied to the card header section | `{}`
-`--paper-card-header-text` | Mixin applied to the title in the card header section | `{}`
-`--paper-card-header-image` | Mixin applied to the image in the card header section | `{}`
-`--paper-card-header-image-text` | Mixin applied to the text overlapping the image in the card header section | `{}`
-`--paper-card-content` | Mixin applied to the card content section| `{}`
-`--paper-card-actions` | Mixin applied to the card action section | `{}`
-`--paper-card` | Mixin applied to the card | `{}`
-
-@group Paper Elements
-@element paper-card
-@demo demo/index.html
--->
-
-<dom-module id="paper-card">
-  <template>
-    <style include="paper-material">
-      :host {
-        display: inline-block;
-        position: relative;
-        box-sizing: border-box;
-        background-color: var(--paper-card-background-color, --primary-background-color);
-        border-radius: 2px;
-
-        @apply(--paper-font-common-base);
-        @apply(--paper-card);
-      }
-
-      /* IE 10 support for HTML5 hidden attr */
-      [hidden] {
-        display: none !important;
-      }
-
-      .header {
-        position: relative;
-        border-top-left-radius: inherit;
-        border-top-right-radius: inherit;
-        overflow: hidden;
-
-        @apply(--paper-card-header);
-      }
-
-      .header iron-image {
-        display: block;
-        width: 100%;
-        --iron-image-width: 100%;
-        pointer-events: none;
-
-        @apply(--paper-card-header-image);
-      }
-
-      .header .title-text {
-        padding: 16px;
-        font-size: 24px;
-        font-weight: 400;
-        color: var(--paper-card-header-color, #000);
-
-        @apply(--paper-card-header-text);
-      }
-
-      .header .title-text.over-image {
-        position: absolute;
-        bottom: 0px;
-
-        @apply(--paper-card-header-image-text);
-      }
-
-      :host ::content .card-content {
-        padding: 16px;
-        position:relative;
-
-        @apply(--paper-card-content);
-      }
-
-      :host ::content .card-actions {
-        border-top: 1px solid #e8e8e8;
-        padding: 5px 16px;
-        position:relative;
-
-        @apply(--paper-card-actions);
-      }
-    </style>
-
-    <div class="header">
-      <iron-image hidden$="[[!image]]" src="[[image]]" preload$="[[preloadImage]]" fade$="[[fadeImage]]"></iron-image>
-      <div hidden$="[[!heading]]" class$="[[_computeHeadingClass(image)]]">[[heading]]</div>
-    </div>
-
-    <content></content>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-card',
-
-      properties: {
-        /**
-         * The title of the card.
-         */
-        heading: {
-          type: String,
-          value: '',
-          observer: '_headingChanged'
-        },
-
-        /**
-         * The url of the title image of the card.
-         */
-        image: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * When `true`, any change to the image url property will cause the
-         * `placeholder` image to be shown until the image is fully rendered.
-         */
-        preloadImage: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * When `preloadImage` is true, setting `fadeImage` to true will cause the
-         * image to fade into place.
-         */
-        fadeImage: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * The z-depth of the card, from 0-5.
-         */
-        elevation: {
-          type: Number,
-          value: 1,
-          reflectToAttribute: true
-        },
-
-        /**
-         * Set this to true to animate the card shadow when setting a new
-         * `z` value.
-         */
-        animatedShadow: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * Read-only property used to pass down the `animatedShadow` value to
-         * the underlying paper-material style (since they have different names).
-         */
-        animated: {
-          type: Boolean,
-          reflectToAttribute: true,
-          readOnly: true,
-          computed: '_computeAnimated(animatedShadow)'
-        }
-      },
-
-      _headingChanged: function(heading) {
-        var label = this.getAttribute('aria-label');
-        this.setAttribute('aria-label', heading);
-      },
-
-      _computeHeadingClass: function(image) {
-        var cls = 'title-text';
-        if (image)
-          cls += ' over-image';
-        return cls;
-      },
-
-      _computeAnimated: function(animatedShadow) {
-        return animatedShadow;
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-card/test/basic.html
deleted file mode 100644
index c1db560..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/test/basic.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-card a11y tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <link rel="import" href="../paper-card.html">
-
-  <style>
-    paper-card {
-      width: 400px;
-    }
-  </style>
-
-</head>
-<body>
-  <test-fixture id="basic">
-    <template>
-      <paper-card heading="header">
-        <div class="card-content"><p>Sample content</p></div>
-      </paper-card>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('a11y', function() {
-      var f;
-      setup(function () {
-        f = fixture('basic');
-      });
-
-      test('aria-label set on card', function() {
-        assert.strictEqual(f.getAttribute('aria-label'), f.heading);
-      });
-
-      test('aria-label can be updated', function() {
-        assert.strictEqual(f.getAttribute('aria-label'), f.heading);
-        f.heading = 'batman';
-        assert.strictEqual(f.getAttribute('aria-label'), 'batman');
-      });
-    });
-    suite('header image', function() {
-      var f, img;
-      setup(function () {
-        f = fixture('basic');
-        img = f.$$('iron-image');
-      });
-
-      test('is iron-image', function(){
-        expect(img).to.be.ok;
-      });
-
-      test('width properly setup', function() {
-        assert.strictEqual(img.offsetWidth, 0);
-        f.image = 'some-img-url';
-        assert.strictEqual(img.src, f.image);
-        assert.strictEqual(img.offsetWidth, f.offsetWidth);
-      });
-
-      test('preload properly setup', function() {
-        assert.strictEqual(img.preload, f.preloadImage);
-        f.preloadImage = !f.preloadImage;
-        assert.strictEqual(img.preload, f.preloadImage);
-      });
-
-      test('fade properly setup', function() {
-        assert.strictEqual(img.fade, f.fadeImage);
-        f.fadeImage = !f.fadeImage;
-        assert.strictEqual(img.fade, f.fadeImage);
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-card/test/index.html b/systrace/catapult/third_party/polymer/components/paper-card/test/index.html
deleted file mode 100644
index 24719fd..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-card/test/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-card tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'basic.html?dom=shadow'
-    ]);
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-checkbox/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/README.md b/systrace/catapult/third_party/polymer/components/paper-checkbox/README.md
deleted file mode 100644
index 8b72a6f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-checkbox.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-checkbox)
-
-##&lt;paper-checkbox&gt;
-
-`paper-checkbox` is a [material design checkbox](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-checkbox). 
-User can tap the checkbox to check or uncheck it. Usually you use checkboxes
-to allow user to select multiple options from a set. If you have a single
-ON/OFF option, avoid using a single checkbox and use `paper-toggle-button`
-instead.
-
-Example:
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-checkbox.html">
-    <style is="custom-style">
-      paper-checkbox {
-        font-family: 'Roboto', sans-serif;
-        margin: 24px;
-      }
-        
-      paper-checkbox:first-child {
-        --primary-color: #ff5722;
-      }
-      
-      paper-checkbox.styled {
-        align-self: center;
-        border: 1px solid var(--paper-green-200);
-        padding: 8px 16px;
-        --paper-checkbox-checked-color: var(--paper-green-500);
-        --paper-checkbox-checked-ink-color: var(--paper-green-500);
-        --paper-checkbox-unchecked-color: var(--paper-green-900);
-        --paper-checkbox-unchecked-ink-color: var(--paper-green-900);
-        --paper-checkbox-label-color: var(--paper-green-500);
-        --paper-checkbox-label-spacing: 0;
-        --paper-checkbox-margin: 8px 16px 8px 0;
-        --paper-checkbox-vertical-align: top;
-      }
-
-      paper-checkbox .subtitle {
-        display: block;
-        font-size: 0.8em;
-        margin-top: 2px;
-        max-width: 150px;
-      }
-    </style>
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-checkbox checked>Checked</paper-checkbox>
-<paper-checkbox class="styled">
-  Checkbox
-  <span class="subtitle">
-    With a longer label
-  </span>
-</paper-checkbox>
-<paper-checkbox disabled>Disabled</paper-checkbox>
-```
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/bower.json b/systrace/catapult/third_party/polymer/components/paper-checkbox/bower.json
deleted file mode 100644
index 6122429..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/bower.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "paper-checkbox",
-  "version": "1.4.2",
-  "description": "A material design checkbox",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "paper",
-    "checkbox",
-    "control"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-checkbox"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-checkbox",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.6.0",
-    "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.1.0"
-  },
-  "devDependencies": {
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
-  },
-  "main": "paper-checkbox.html"
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-checkbox/demo/index.html
deleted file mode 100644
index c52eef0..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/demo/index.html
+++ /dev/null
@@ -1,116 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>paper-checkbox demo</title>
-
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-    <meta name="mobile-web-app-capable" content="yes">
-    <meta name="apple-mobile-web-app-capable" content="yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../paper-checkbox.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      paper-checkbox {
-        display: block;
-        margin-right: 24px;
-      }
-
-      demo-snippet {
-        margin-bottom: 40px;
-      }
-      .vertical-section-container {
-        max-width: 550px;
-      }
-    </style>
-  </head>
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>Checkboxes can be checked or unchecked, or disabled entirely</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <paper-checkbox>Checkbox</paper-checkbox>
-          <paper-checkbox checked>Checkbox</paper-checkbox>
-          <paper-checkbox disabled>Disabled</paper-checkbox>
-        </template>
-      </demo-snippet>
-
-      <h3>Checkboxes can hide the ripple effect using the <i>noink</i> attribute</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <paper-checkbox noink>Checkbox</paper-checkbox>
-        </template>
-      </demo-snippet>
-
-      <h3>Checkboxes can be styled using custom properties</h3>
-      <demo-snippet class="centered-demo small-text">
-        <template>
-          <style is="custom-style">
-            paper-checkbox.red {
-              --paper-checkbox-checked-color: var(--paper-red-500);
-              --paper-checkbox-checked-ink-color: var(--paper-red-500);
-              --paper-checkbox-unchecked-color: var(--paper-red-900);
-              --paper-checkbox-unchecked-ink-color: var(--paper-red-900);
-              --paper-checkbox-label-color: var(--paper-red-500);
-              --paper-checkbox-vertical-align: top;
-            }
-
-            paper-checkbox.green {
-              align-self: center;
-              border: 1px solid var(--paper-green-200);
-              padding: 8px 16px;
-
-              --paper-checkbox-checked-color: var(--paper-green-500);
-              --paper-checkbox-checked-ink-color: var(--paper-green-500);
-              --paper-checkbox-unchecked-color: var(--paper-green-900);
-              --paper-checkbox-unchecked-ink-color: var(--paper-green-900);
-              --paper-checkbox-label-color: var(--paper-green-500);
-              --paper-checkbox-label-spacing: 0;
-              --paper-checkbox-margin: 8px 16px 8px 0;
-              --paper-checkbox-vertical-align: top;
-            }
-
-            paper-checkbox.blue {
-              --paper-checkbox-checked-color: var(--paper-blue-500);
-              --paper-checkbox-checked-ink-color: var(--paper-blue-500);
-              --paper-checkbox-unchecked-color: var(--paper-blue-900);
-              --paper-checkbox-unchecked-ink-color: var(--paper-blue-900);
-              --paper-checkbox-label-color: var(--paper-blue-500);
-              --paper-checkbox-label-checked-color: var(--paper-blue-900);
-            }
-
-            paper-checkbox .subtitle {
-              display: block;
-              font-size: 0.8em;
-              margin-top: 2px;
-              max-width: 150px;
-            }
-          </style>
-
-          <paper-checkbox class="red">
-            Checkbox
-            <span class="subtitle">With a subtitle</span>
-          </paper-checkbox>
-          <paper-checkbox checked class="green">
-            Checkbox
-            <span class="subtitle">
-              With a longer subtitle that wraps to another line
-            </span>
-          </paper-checkbox>
-          <paper-checkbox class="blue">Checkbox</paper-checkbox>
-        </template>
-      </demo-snippet>
-    </div>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/index.html b/systrace/catapult/third_party/polymer/components/paper-checkbox/index.html
deleted file mode 100644
index b368797..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-    <title>paper-checkbox</title>
-
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../polymer/polymer.html">
-    <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-  </head>
-  <body>
-
-    <iron-component-page></iron-component-page>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/paper-checkbox.html b/systrace/catapult/third_party/polymer/components/paper-checkbox/paper-checkbox.html
deleted file mode 100644
index 1445245..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/paper-checkbox.html
+++ /dev/null
@@ -1,310 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html">
-
-<!--
-Material design: [Checkbox](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-checkbox)
-
-`paper-checkbox` is a button that can be either checked or unchecked.  User
-can tap the checkbox to check or uncheck it.  Usually you use checkboxes
-to allow user to select multiple options from a set.  If you have a single
-ON/OFF option, avoid using a single checkbox and use `paper-toggle-button`
-instead.
-
-Example:
-
-    <paper-checkbox>label</paper-checkbox>
-
-    <paper-checkbox checked> label</paper-checkbox>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-checkbox-unchecked-background-color` | Checkbox background color when the input is not checked | `transparent`
-`--paper-checkbox-unchecked-color` | Checkbox border color when the input is not checked | `--primary-text-color`
-`--paper-checkbox-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`
-`--paper-checkbox-checked-color` | Checkbox color when the input is checked | `--primary-color`
-`--paper-checkbox-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
-`--paper-checkbox-checkmark-color` | Checkmark color | `white`
-`--paper-checkbox-label-color` | Label color | `--primary-text-color`
-`--paper-checkbox-label-checked-color` | Label color when the input is checked | `--paper-checkbox-label-color`
-`--paper-checkbox-label-spacing` | Spacing between the label and the checkbox | `8px`
-`--paper-checkbox-label` | Mixin applied to the label | `{}`
-`--paper-checkbox-label-checked` | Mixin applied to the label when the input is checked | `{}`
-`--paper-checkbox-error-color` | Checkbox color when invalid | `--error-color`
-`--paper-checkbox-size` | Size of the checkbox | `18px`
-`--paper-checkbox-ink-size` | Size of the ripple | `48px`
-`--paper-checkbox-margin` | Margin around the checkbox container | `initial`
-`--paper-checkbox-vertical-align` | Vertical alignment of the checkbox container | `middle`
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
-@demo demo/index.html
--->
-
-<dom-module id="paper-checkbox">
-  <template strip-whitespace>
-    <style>
-      :host {
-        display: inline-block;
-        white-space: nowrap;
-        cursor: pointer;
-        --calculated-paper-checkbox-size: var(--paper-checkbox-size, 18px);
-        /* -1px is a sentinel for the default and is replaced in `attached`. */
-        --calculated-paper-checkbox-ink-size: var(--paper-checkbox-ink-size, -1px);
-        @apply(--paper-font-common-base);
-        line-height: 0;
-        -webkit-tap-highlight-color: transparent;
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      :host(:focus) {
-        outline: none;
-      }
-
-      .hidden {
-        display: none;
-      }
-
-      #checkboxContainer {
-        display: inline-block;
-        position: relative;
-        width: var(--calculated-paper-checkbox-size);
-        height: var(--calculated-paper-checkbox-size);
-        min-width: var(--calculated-paper-checkbox-size);
-        margin: var(--paper-checkbox-margin, initial);
-        vertical-align: var(--paper-checkbox-vertical-align, middle);
-        background-color: var(--paper-checkbox-unchecked-background-color, transparent);
-      }
-
-      #ink {
-        position: absolute;
-
-        /* Center the ripple in the checkbox by negative offsetting it by
-         * (inkWidth - rippleWidth) / 2 */
-        top: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);
-        left: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);
-        width: var(--calculated-paper-checkbox-ink-size);
-        height: var(--calculated-paper-checkbox-ink-size);
-        color: var(--paper-checkbox-unchecked-ink-color, var(--primary-text-color));
-        opacity: 0.6;
-        pointer-events: none;
-      }
-
-      :host-context([dir="rtl"]) #ink {
-        right: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calculated-paper-checkbox-size)) / 2);
-        left: auto;
-      }
-
-      #ink[checked] {
-        color: var(--paper-checkbox-checked-ink-color, var(--primary-color));
-      }
-
-      #checkbox {
-        position: relative;
-        box-sizing: border-box;
-        height: 100%;
-        border: solid 2px;
-        border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));
-        border-radius: 2px;
-        pointer-events: none;
-        -webkit-transition: background-color 140ms, border-color 140ms;
-        transition: background-color 140ms, border-color 140ms;
-      }
-
-      /* checkbox checked animations */
-      #checkbox.checked #checkmark {
-        -webkit-animation: checkmark-expand 140ms ease-out forwards;
-        animation: checkmark-expand 140ms ease-out forwards;
-      }
-
-      @-webkit-keyframes checkmark-expand {
-        0% {
-          -webkit-transform: scale(0, 0) rotate(45deg);
-        }
-        100% {
-          -webkit-transform: scale(1, 1) rotate(45deg);
-        }
-      }
-
-      @keyframes checkmark-expand {
-        0% {
-          transform: scale(0, 0) rotate(45deg);
-        }
-        100% {
-          transform: scale(1, 1) rotate(45deg);
-        }
-      }
-
-      #checkbox.checked {
-        background-color: var(--paper-checkbox-checked-color, var(--primary-color));
-        border-color: var(--paper-checkbox-checked-color, var(--primary-color));
-      }
-
-      #checkmark {
-        position: absolute;
-        width: 36%;
-        height: 70%;
-        border-style: solid;
-        border-top: none;
-        border-left: none;
-        border-right-width: calc(2/15 * var(--calculated-paper-checkbox-size));
-        border-bottom-width: calc(2/15 * var(--calculated-paper-checkbox-size));
-        border-color: var(--paper-checkbox-checkmark-color, white);
-        -webkit-transform-origin: 97% 86%;
-        transform-origin: 97% 86%;
-        box-sizing: content-box; /* protect against page-level box-sizing */
-      }
-
-      :host-context([dir="rtl"]) #checkmark {
-        -webkit-transform-origin: 50% 14%;
-        transform-origin: 50% 14%;
-      }
-
-      /* label */
-      #checkboxLabel {
-        position: relative;
-        display: inline-block;
-        vertical-align: middle;
-        padding-left: var(--paper-checkbox-label-spacing, 8px);
-        white-space: normal;
-        line-height: normal;
-        color: var(--paper-checkbox-label-color, var(--primary-text-color));
-        @apply(--paper-checkbox-label);
-      }
-
-      :host([checked]) #checkboxLabel {
-        color: var(--paper-checkbox-label-checked-color, var(--paper-checkbox-label-color, var(--primary-text-color)));
-        @apply(--paper-checkbox-label-checked);
-      }
-
-      :host-context([dir="rtl"]) #checkboxLabel {
-        padding-right: var(--paper-checkbox-label-spacing, 8px);
-        padding-left: 0;
-      }
-
-      #checkboxLabel[hidden] {
-        display: none;
-      }
-
-      /* disabled state */
-
-      :host([disabled]) #checkbox {
-        opacity: 0.5;
-        border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));
-      }
-
-      :host([disabled][checked]) #checkbox {
-        background-color: var(--paper-checkbox-unchecked-color, var(--primary-text-color));
-        opacity: 0.5;
-      }
-
-      :host([disabled]) #checkboxLabel  {
-        opacity: 0.65;
-      }
-
-      /* invalid state */
-      #checkbox.invalid:not(.checked) {
-        border-color: var(--paper-checkbox-error-color, var(--error-color));
-      }
-    </style>
-
-    <div id="checkboxContainer">
-      <div id="checkbox" class$="[[_computeCheckboxClass(checked, invalid)]]">
-        <div id="checkmark" class$="[[_computeCheckmarkClass(checked)]]"></div>
-      </div>
-    </div>
-
-    <div id="checkboxLabel"><content></content></div>
-  </template>
-
-</dom-module>
-<script>
-Polymer({
-  is: 'paper-checkbox',
-
-  behaviors: [
-    Polymer.PaperCheckedElementBehavior
-  ],
-
-  hostAttributes: {
-    role: 'checkbox',
-    'aria-checked': false,
-    tabindex: 0
-  },
-
-  properties: {
-    /**
-      * Fired when the checked state changes due to user interaction.
-      *
-      * @event change
-      */
-
-    /**
-      * Fired when the checked state changes.
-      *
-      * @event iron-change
-      */
-    ariaActiveAttribute: {
-      type: String,
-      value: 'aria-checked'
-    }
-  },
-
-  attached: function() {
-    var inkSize = this.getComputedStyleValue('--calculated-paper-checkbox-ink-size').trim();
-    // If unset, compute and set the default `--paper-checkbox-ink-size`.
-    if (inkSize === '-1px') {
-      var checkboxSize = parseFloat(this.getComputedStyleValue('--calculated-paper-checkbox-size').trim());
-      var defaultInkSize = Math.floor((8 / 3) * checkboxSize);
-
-      // The checkbox and ripple need to have the same parity so that their
-      // centers align.
-      if (defaultInkSize % 2 !== checkboxSize % 2) {
-        defaultInkSize++;
-      }
-
-      this.customStyle['--paper-checkbox-ink-size'] = defaultInkSize + 'px';
-      this.updateStyles();
-    }
-  },
-
-  _computeCheckboxClass: function(checked, invalid) {
-    var className = '';
-    if (checked) {
-      className += 'checked ';
-    }
-    if (invalid) {
-      className += 'invalid';
-    }
-    return className;
-  },
-
-  _computeCheckmarkClass: function(checked) {
-    return checked ? '' : 'hidden';
-  },
-
-  // create ripple inside the checkboxContainer
-  _createRipple: function() {
-    this._rippleContainer = this.$.checkboxContainer;
-    return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this);
-  }
-});
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-checkbox/test/basic.html
deleted file mode 100644
index 8626a07..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/test/basic.html
+++ /dev/null
@@ -1,275 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-checkbox basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../paper-checkbox.html">
-
-  <style is="custom-style">
-    paper-checkbox.no-label-spacing {
-      --paper-checkbox-label-spacing: 0;
-    }
-
-    paper-checkbox.tiny {
-      --paper-checkbox-size: 5px;
-    }
-
-    paper-checkbox.medium {
-      --paper-checkbox-size: 37px;
-    }
-
-    paper-checkbox.giant {
-      --paper-checkbox-size: 50px;
-    }
-
-    paper-checkbox.enormous {
-      --paper-checkbox-size: 71px;
-    }
-
-    paper-checkbox.custom-ink-size {
-      --paper-checkbox-size: 25px;
-      --paper-checkbox-ink-size: 30px;
-    }
-
-    paper-checkbox.large-line-height {
-      line-height: 3;
-    }
-
-    paper-checkbox.small-line-height {
-      line-height: 0.25;
-    }
-  </style>
-</head>
-<body>
-
-  <test-fixture id="NoLabel">
-    <template>
-      <paper-checkbox id="check1"></paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithLabel">
-    <template>
-      <paper-checkbox id="check2">Batman</paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="AriaLabel">
-    <template>
-      <paper-checkbox id="check3" aria-label="Batman">Robin</paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithDifferentSizes">
-    <template>
-      <paper-checkbox class="no-label-spacing"></paper-checkbox>
-      <paper-checkbox class="no-label-spacing giant"></paper-checkbox>
-      <paper-checkbox class="no-label-spacing tiny"></paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithDifferentSizes2">
-    <template>
-      <paper-checkbox class="tiny"></paper-checkbox>
-      <paper-checkbox></paper-checkbox>
-      <paper-checkbox class="medium"></paper-checkbox>
-      <paper-checkbox class="giant"></paper-checkbox>
-      <paper-checkbox class="enormous"></paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="CustomInkSize">
-    <template>
-      <paper-checkbox class="custom-ink-size"></paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithLineHeight">
-    <template>
-      <paper-checkbox class="large-line-height">Checkbox</paper-checkbox>
-      <paper-checkbox class="small-line-height">Checkbox</paper-checkbox>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('defaults', function() {
-      var c1;
-
-      setup(function() {
-        c1 = fixture('NoLabel');
-      });
-
-      test('check checkbox via click', function(done) {
-        c1.addEventListener('click', function() {
-          assert.isTrue(c1.getAttribute('aria-checked') == 'true');
-          assert.isTrue(c1.checked);
-          done();
-        });
-        MockInteractions.tap(c1);
-      });
-
-      test('toggle checkbox via click', function(done) {
-        c1.checked = true;
-        c1.addEventListener('click', function() {
-          assert.isFalse(c1.getAttribute('aria-checked') != 'false');
-          assert.isFalse(c1.checked);
-          done();
-        });
-        MockInteractions.tap(c1);
-      });
-
-      test('disabled checkbox cannot be clicked', function(done) {
-        c1.disabled = true;
-        c1.checked = true;
-        MockInteractions.tap(c1);
-        setTimeout(function() {
-          assert.isTrue(c1.getAttribute('aria-checked') == 'true');
-          assert.isTrue(c1.checked);
-          done();
-        }, 1);
-      });
-
-      test('checkbox can be validated', function() {
-        c1.required = true;
-        assert.isFalse(c1.validate());
-
-        c1.checked = true;
-        assert.isTrue(c1.validate());
-      });
-
-      test('disabled checkbox is always valid', function() {
-        c1.disabled = true;
-        c1.required = true;
-        assert.isTrue(c1.validate());
-
-        c1.checked = true;
-        assert.isTrue(c1.validate());
-      });
-
-      test('checkbox can check sizes', function() {
-        var c2 = fixture('WithDifferentSizes');
-        var normal = c2[0].getBoundingClientRect();
-        var giant = c2[1].getBoundingClientRect();
-        var tiny = c2[2].getBoundingClientRect();
-
-        assert.isTrue(5 === tiny.height);
-        assert.isTrue(tiny.height < normal.height);
-        assert.isTrue(normal.height < giant.height);
-        assert.isTrue(giant.height <= 50);
-        
-        assert.isTrue(5 === tiny.width);
-        assert.isTrue(tiny.width < normal.width);
-        assert.isTrue(normal.width < giant.width);
-        assert.isTrue(giant.width === 50);
-      });
-
-      suite('checkbox line-height', function() {
-        var large;
-        var small;
-
-        setup(function() {
-          var checkboxes = fixture('WithLineHeight');
-          large = checkboxes[0];
-          small = checkboxes[1];
-        });
-
-        test('checkboxes with >1 line-height have an equal height', function() {
-          var largeRect = large.getBoundingClientRect();
-          var largeStyle = getComputedStyle(large);
-
-          assert.isTrue(largeRect.height === 3 * parseFloat(largeStyle.fontSize));
-        });
-
-        test('checkbox with <1 line-height are at least 1em tall', function() {
-          var smallRect = small.getBoundingClientRect();
-          var smallStyle = getComputedStyle(small);
-
-          assert.isTrue(smallRect.height >= 1 * parseFloat(smallStyle.fontSize));
-        });
-      });
-
-      suite('ink size', function() {
-        var checkboxes;
-
-        setup(function() {
-          checkboxes = fixture('WithDifferentSizes2');
-        });
-
-        test('`--paper-checkbox-ink-size` sets the ink size', function() {
-          var checkbox = fixture('CustomInkSize');
-          assert.equal(checkbox.getComputedStyleValue('--calculated-paper-checkbox-size').trim(), '25px');
-          assert.equal(checkbox.getComputedStyleValue('--calculated-paper-checkbox-ink-size').trim(), '30px');
-        });
-
-        test('ink sizes are near (8/3 * checkbox size) by default', function() {
-          checkboxes.forEach(function(checkbox) {
-            var size = parseFloat(checkbox.getComputedStyleValue('--calculated-paper-checkbox-size'), 10);
-            var inkSize = parseFloat(checkbox.getComputedStyleValue('--calculated-paper-checkbox-ink-size'), 10);
-            assert.approximately(inkSize / size, 8 / 3, 0.1);
-          });
-        });
-
-        test('ink sizes are integers', function() {
-          checkboxes.forEach(function(checkbox) {
-            var unparsedInkSize = checkbox.getComputedStyleValue('--calculated-paper-checkbox-ink-size');
-            var floatInkSize = parseFloat(unparsedInkSize, 10);
-            var intInkSize = parseInt(unparsedInkSize, 10);
-            assert.equal(floatInkSize, intInkSize);
-          });
-        });
-
-        test('ink size parity matches checkbox size parity (centers are aligned)', function() {
-          checkboxes.forEach(function(checkbox) {
-            var size = parseInt(checkbox.getComputedStyleValue('--calculated-paper-checkbox-size'), 10);
-            var inkSize = parseInt(checkbox.getComputedStyleValue('--calculated-paper-checkbox-ink-size'), 10);
-            assert.equal(size % 2, inkSize % 2);
-          });
-        });
-      });
-    });
-
-    suite('a11y', function() {
-      var c1;
-      var c2;
-
-      setup(function() {
-        c1 = fixture('NoLabel');
-        c2 = fixture('WithLabel');
-      });
-
-      test('has aria role "checkbox"', function() {
-        assert.isTrue(c1.getAttribute('role') == 'checkbox');
-        assert.isTrue(c2.getAttribute('role') == 'checkbox');
-      });
-
-      test('checkbox with no label has no aria label', function() {
-        assert.isTrue(!c1.getAttribute('aria-label'));
-      });
-
-      test('checkbox respects the user set aria-label', function() {
-        var c = fixture('AriaLabel');
-        assert.isTrue(c.getAttribute('aria-label') == "Batman");
-      });
-
-      a11ySuite('NoLabel');
-      a11ySuite('WithLabel');
-      a11ySuite('AriaLabel');
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-checkbox/test/index.html b/systrace/catapult/third_party/polymer/components/paper-checkbox/test/index.html
deleted file mode 100644
index 94f72bf..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-checkbox/test/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-checkbox tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'basic.html?dom=shadow',
-      // To enable `useNativeCSSProperties`, the native Shadow DOM and lazy
-      // registration flags must also be enabled.
-      // https://github.com/Polymer/polymer/blob/ff6e884ef4f309d41491333860a8bc9c2f178696/src/lib/settings.html#L55
-      'basic.html?dom=shadow&lazyRegister=true&useNativeCSSProperties=true'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/README.md b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/README.md
deleted file mode 100644
index c3c5298..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-dialog-behavior.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-dialog-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog-behavior)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-dialog-behavior)_
-
-
-##Polymer.PaperDialogBehavior
-
-Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to implement a Material Design
-dialog.
-
-For example, if `<paper-dialog-impl>` implements this behavior:
-
-```html
-<paper-dialog-impl>
-    <h2>Header</h2>
-    <div>Dialog body</div>
-    <div class="buttons">
-        <paper-button dialog-dismiss>Cancel</paper-button>
-        <paper-button dialog-confirm>Accept</paper-button>
-    </div>
-</paper-dialog-impl>
-```
-
-`paper-dialog-shared-styles.html` provide styles for a header, content area, and an action area for buttons.
-Use the `<h2>` tag for the header and the `buttons` class for the action area. You can use the
-`paper-dialog-scrollable` element (in its own repository) if you need a scrolling content area.
-
-Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls to close the
-dialog. If the user dismisses the dialog with `dialog-confirm`, the `closingReason` will update
-to include `confirmed: true`.
-
-### Accessibility
-
-This element has `role="dialog"` by default. Depending on the context, it may be more appropriate
-to override this attribute with `role="alertdialog"`.
-
-If `modal` is set, the element will prevent the focus from exiting the element.
-It will also ensure that focus remains in the dialog.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/bower.json b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/bower.json
deleted file mode 100644
index dcc5eb8..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/bower.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "paper-dialog-behavior",
-  "version": "1.2.9",
-  "description": "Implements a behavior used for material design dialogs",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "dialog",
-    "overlay",
-    "behavior"
-  ],
-  "main": "paper-dialog-behavior.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-dialog-behavior"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-dialog-behavior",
-  "ignore": [],
-  "dependencies": {
-    "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.1.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
-    "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-listbox": "PolymerElements/paper-listbox#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/demo/index.html
deleted file mode 100644
index 193dddc..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/demo/index.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-dialog-behavior demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="simple-dialog.html">
-
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../../paper-dropdown-menu/paper-dropdown-menu.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../paper-listbox/paper-listbox.html">
-  <link rel="import" href="../../paper-dialog-scrollable/paper-dialog-scrollable.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles"></style>
-</head>
-<body unresolved class="centered">
-
-  <h3>An element with <code>PaperDialogBehavior</code> can be opened, closed, toggled. Use <code>h2</code> for the title</h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <paper-button raised onclick="dialog.toggle()">dialog</paper-button>
-      <simple-dialog id="dialog">
-        <h2>Dialog Title</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-      </simple-dialog>
-    </template>
-  </demo-snippet>
-
-  <h3>An element with <code>PaperDialogBehavior</code> can be modal. Use the attributes <code>dialog-dismiss</code> and <code>dialog-confirm</code> on the children to close it.</h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <paper-button raised onclick="modalAlert.toggle()">modal alert</paper-button>
-      <simple-dialog id="modalAlert" modal role="alertdialog">
-        <h2>Alert</h2>
-        <paper-dropdown-menu label="Draft to discard">
-          <paper-listbox class="dropdown-content">
-            <paper-item>Draft 1</paper-item>
-            <paper-item>Draft 2</paper-item>
-            <paper-item>Draft 3</paper-item>
-            <paper-item>Draft 4</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-        <div class="buttons">
-          <paper-button onclick="modalDetails.toggle()">More details</paper-button>
-          <paper-button dialog-dismiss>Cancel</paper-button>
-          <paper-button dialog-confirm autofocus>Discard</paper-button>
-        </div>
-      </simple-dialog>
-      <simple-dialog id="modalDetails" modal>
-        <h2>Details</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-        <div class="buttons">
-          <paper-button dialog-confirm autofocus>OK</paper-button>
-        </div>
-      </simple-dialog>
-    </template>
-  </demo-snippet>
-
-  <h3>Use <code>paper-dialog-scrollable</code> for scrolling content</h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <paper-button raised onclick="scrolling.toggle()">scrolling</paper-button>
-      <simple-dialog id="scrolling">
-        <h2>Scrolling</h2>
-        <paper-dialog-scrollable>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-        </paper-dialog-scrollable>
-        <div class="buttons">
-          <paper-button dialog-dismiss>Cancel</paper-button>
-          <paper-button dialog-confirm>OK</paper-button>
-        </div>
-      </simple-dialog>
-    </template>
-  </demo-snippet>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/demo/simple-dialog.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/demo/simple-dialog.html
deleted file mode 100644
index a204372..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/demo/simple-dialog.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-dialog-behavior.html">
-<link rel="import" href="../paper-dialog-shared-styles.html">
-
-<dom-module id="simple-dialog">
-  <template>
-    <style include="paper-dialog-shared-styles"></style>
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'simple-dialog',
-
-    behaviors: [
-      Polymer.PaperDialogBehavior
-    ]
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/hero.svg b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/hero.svg
deleted file mode 100755
index 564ccd3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/hero.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<g>

-		<polygon points="76.7,98 79.2,98 74,91.1 74,94.4 		"/>

-		<polygon points="74,81.4 74,84.7 84.1,98 86.6,98 		"/>

-		<polygon points="74,71.7 74,75 91.5,98 94,98 		"/>

-		<polygon points="74,62 74,65.3 98.9,98 101.4,98 		"/>

-		<polygon points="94.3,79 92,79 92,76 74,52.3 74,55.6 106.2,98 108.7,98 		"/>

-		<polygon points="92,69.6 92,66.3 74,42.6 74,45.9 		"/>

-		<polygon points="101.7,79 99.2,79 113.6,98 116.1,98 		"/>

-		<polygon points="92,59.9 92,56.6 74,32.9 74,36.2 		"/>

-		<polygon points="109.1,79 106.5,79 121,98 123.5,98 		"/>

-		<polygon points="92,50.2 92,47 92.1,47 77.7,28 75.2,28 		"/>

-		<polygon points="116.4,79 113.9,79 128.4,98 130.9,98 		"/>

-		<polygon points="97,47 99.5,47 85,28 82.5,28 		"/>

-		<polygon points="123.8,79 121.3,79 135.7,98 138.2,98 		"/>

-		<polygon points="104.4,47 106.9,47 92.4,28 89.9,28 		"/>

-		<polygon points="131.2,79 128.7,79 143.1,98 145.6,98 		"/>

-		<polygon points="132,70.4 132,73.7 150,97.4 150,94.1 		"/>

-		<polygon points="111.7,47 114.2,47 99.8,28 97.3,28 		"/>

-		<polygon points="132,60.7 132,64 150,87.7 150,84.3 		"/>

-		<polygon points="119.1,47 121.6,47 107.2,28 104.7,28 		"/>

-		<polygon points="132,51 132,54.3 150,77.9 150,74.6 		"/>

-		<polygon points="114.6,28 112,28 126.5,47 129,47 		"/>

-		<polygon points="121.9,28 119.4,28 150,68.2 150,64.9 		"/>

-		<polygon points="129.3,28 126.8,28 150,58.5 150,55.2 		"/>

-		<polygon points="136.7,28 134.2,28 150,48.8 150,45.5 		"/>

-		<polygon points="144.1,28 141.5,28 150,39.1 150,35.8 		"/>

-		<polygon points="150,29.4 150,28 148.9,28 		"/>

-	</g>

-	<path d="M133,80H91V46h42V80z M93,78h38V48H93V78z"/>

-	<path d="M151,99H73V27h78V99z M75,97h74V29H75V97z"/>

-	<circle cx="74" cy="28" r="4"/>

-	<circle cx="150" cy="28" r="4"/>

-	<circle cx="150" cy="98" r="4"/>

-	<circle cx="74" cy="98" r="4"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/index.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/index.html
deleted file mode 100644
index af98b85..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-dialog-behavior</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-behavior.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-behavior.html
deleted file mode 100644
index 49d724c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-behavior.html
+++ /dev/null
@@ -1,139 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-overlay-behavior/iron-overlay-behavior.html">
-
-<script>
-
-/**
-Use `Polymer.PaperDialogBehavior` and `paper-dialog-shared-styles.html` to implement a Material Design
-dialog.
-
-For example, if `<paper-dialog-impl>` implements this behavior:
-
-    <paper-dialog-impl>
-        <h2>Header</h2>
-        <div>Dialog body</div>
-        <div class="buttons">
-            <paper-button dialog-dismiss>Cancel</paper-button>
-            <paper-button dialog-confirm>Accept</paper-button>
-        </div>
-    </paper-dialog-impl>
-
-`paper-dialog-shared-styles.html` provide styles for a header, content area, and an action area for buttons.
-Use the `<h2>` tag for the header and the `buttons` class for the action area. You can use the
-`paper-dialog-scrollable` element (in its own repository) if you need a scrolling content area.
-
-Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls to close the
-dialog. If the user dismisses the dialog with `dialog-confirm`, the `closingReason` will update
-to include `confirmed: true`.
-
-### Accessibility
-
-This element has `role="dialog"` by default. Depending on the context, it may be more appropriate
-to override this attribute with `role="alertdialog"`.
-
-If `modal` is set, the element will prevent the focus from exiting the element.
-It will also ensure that focus remains in the dialog.
-
-@hero hero.svg
-@demo demo/index.html
-@polymerBehavior Polymer.PaperDialogBehavior
-*/
-  Polymer.PaperDialogBehaviorImpl = {
-
-    hostAttributes: {
-      'role': 'dialog',
-      'tabindex': '-1'
-    },
-
-    properties: {
-
-      /**
-       * If `modal` is true, this implies `no-cancel-on-outside-click`, `no-cancel-on-esc-key` and `with-backdrop`.
-       */
-      modal: {
-        type: Boolean,
-        value: false
-      }
-
-    },
-
-    observers: [
-      '_modalChanged(modal, _readied)'
-    ],
-
-    listeners: {
-      'tap': '_onDialogClick'
-    },
-
-    ready: function () {
-      // Only now these properties can be read.
-      this.__prevNoCancelOnOutsideClick = this.noCancelOnOutsideClick;
-      this.__prevNoCancelOnEscKey = this.noCancelOnEscKey;
-      this.__prevWithBackdrop = this.withBackdrop;
-    },
-
-    _modalChanged: function(modal, readied) {
-      // modal implies noCancelOnOutsideClick, noCancelOnEscKey and withBackdrop.
-      // We need to wait for the element to be ready before we can read the
-      // properties values.
-      if (!readied) {
-        return;
-      }
-
-      if (modal) {
-        this.__prevNoCancelOnOutsideClick = this.noCancelOnOutsideClick;
-        this.__prevNoCancelOnEscKey = this.noCancelOnEscKey;
-        this.__prevWithBackdrop = this.withBackdrop;
-        this.noCancelOnOutsideClick = true;
-        this.noCancelOnEscKey = true;
-        this.withBackdrop = true;
-      } else {
-        // If the value was changed to false, let it false.
-        this.noCancelOnOutsideClick = this.noCancelOnOutsideClick &&
-          this.__prevNoCancelOnOutsideClick;
-        this.noCancelOnEscKey = this.noCancelOnEscKey &&
-          this.__prevNoCancelOnEscKey;
-        this.withBackdrop = this.withBackdrop && this.__prevWithBackdrop;
-      }
-    },
-
-    _updateClosingReasonConfirmed: function(confirmed) {
-      this.closingReason = this.closingReason || {};
-      this.closingReason.confirmed = confirmed;
-    },
-
-    /**
-     * Will dismiss the dialog if user clicked on an element with dialog-dismiss
-     * or dialog-confirm attribute.
-     */
-    _onDialogClick: function(event) {
-      // Search for the element with dialog-confirm or dialog-dismiss,
-      // from the root target until this (excluded).
-      var path = Polymer.dom(event).path;
-      for (var i = 0; i < path.indexOf(this); i++) {
-        var target = path[i];
-        if (target.hasAttribute && (target.hasAttribute('dialog-dismiss') || target.hasAttribute('dialog-confirm'))) {
-          this._updateClosingReasonConfirmed(target.hasAttribute('dialog-confirm'));
-          this.close();
-          event.stopPropagation();
-          break;
-        }
-      }
-    }
-
-  };
-
-  /** @polymerBehavior */
-  Polymer.PaperDialogBehavior = [Polymer.IronOverlayBehavior, Polymer.PaperDialogBehaviorImpl];
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-common.css b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-common.css
deleted file mode 100644
index 560b0a5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-common.css
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-:host {
-  display: block;
-  margin: 24px 40px;
-
-  background: var(--paper-dialog-background-color, --primary-background-color);
-  color: var(--paper-dialog-color, --primary-text-color);
-
-  @apply(--paper-font-body1);
-  @apply(--shadow-elevation-16dp);
-  @apply(--paper-dialog);
-}
-
-:host > ::content > * {
-  margin-top: 20px;
-  padding: 0 24px;
-}
-
-:host > ::content > .no-padding {
-  padding: 0;
-}
-
-:host > ::content > *:first-child {
-  margin-top: 24px;
-}
-
-:host > ::content > *:last-child {
-  margin-bottom: 24px;
-}
-
-:host > ::content h2 {
-  position: relative;
-  margin: 0;
-  @apply(--paper-font-title);
-
-  @apply(--paper-dialog-title);
-}
-
-:host > ::content .buttons {
-  position: relative;
-  padding: 8px 8px 8px 24px;
-  margin: 0;
-
-  color: var(--paper-dialog-button-color, --primary-color);
-
-  @apply(--layout-horizontal);
-  @apply(--layout-end-justified);
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-shared-styles.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-shared-styles.html
deleted file mode 100644
index 35ea74b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/paper-dialog-shared-styles.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-styles/typography.html">
-<link rel="import" href="../paper-styles/shadow.html">
-
-<!--
-### Styling
-
-The following custom properties and mixins are available for styling.
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-dialog-background-color` | Dialog background color                     | `--primary-background-color`
-`--paper-dialog-color`            | Dialog foreground color                     | `--primary-text-color`
-`--paper-dialog`                  | Mixin applied to the dialog                 | `{}`
-`--paper-dialog-title`            | Mixin applied to the title (`<h2>`) element | `{}`
-`--paper-dialog-button-color`     | Button area foreground color                | `--default-primary-color`
--->
-
-<dom-module id="paper-dialog-shared-styles">
-  <template>
-    <style>
-      :host {
-        display: block;
-        margin: 24px 40px;
-
-        background: var(--paper-dialog-background-color, --primary-background-color);
-        color: var(--paper-dialog-color, --primary-text-color);
-
-        @apply(--paper-font-body1);
-        @apply(--shadow-elevation-16dp);
-        @apply(--paper-dialog);
-      }
-
-      :host > ::content > * {
-        margin-top: 20px;
-        padding: 0 24px;
-      }
-
-      :host > ::content > .no-padding {
-        padding: 0;
-      }
-
-      :host > ::content > *:first-child {
-        margin-top: 24px;
-      }
-
-      :host > ::content > *:last-child {
-        margin-bottom: 24px;
-      }
-
-      :host > ::content h2 {
-        position: relative;
-        margin: 0;
-        @apply(--paper-font-title);
-
-        @apply(--paper-dialog-title);
-      }
-
-      :host > ::content .buttons {
-        position: relative;
-        padding: 8px 8px 8px 24px;
-        margin: 0;
-
-        color: var(--paper-dialog-button-color, --primary-color);
-
-        @apply(--layout-horizontal);
-        @apply(--layout-end-justified);
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/index.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/index.html
deleted file mode 100644
index cb0a870..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>paper-dialog tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'paper-dialog-behavior.html',
-        'paper-dialog-behavior.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/paper-dialog-behavior.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/paper-dialog-behavior.html
deleted file mode 100644
index d7c260e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/paper-dialog-behavior.html
+++ /dev/null
@@ -1,408 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-  <head>
-
-    <title>paper-dialog-behavior tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-
-    <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-    <link rel="import" href="../../iron-icons/iron-icons.html">
-    <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-    <link rel="import" href="test-dialog.html">
-    <link rel="import" href="test-buttons.html">
-
-  </head>
-
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <test-dialog>
-          <p>Dialog</p>
-          <div class="buttons">
-            <button extra>extra</button>
-            <button dialog-dismiss>dismiss</button>
-            <button dialog-confirm>confirm</button>
-          </div>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="buttons">
-      <template>
-        <test-dialog>
-          <p>Dialog with test-buttons</p>
-          <test-buttons class="buttons"></test-buttons>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="custom-element-button">
-      <template>
-        <test-dialog>
-          <p>Dialog</p>
-          <div class="buttons">
-            <paper-icon-button icon="cancel" dialog-dismiss></paper-icon-button>
-            <paper-icon-button icon="add-circle" dialog-confirm></paper-icon-button>
-            <paper-icon-button icon="favorite"></paper-icon-button>
-          </div>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="modal">
-      <template>
-        <test-dialog modal>
-          <p>Dialog</p>
-          <div class="buttons">
-            <button dialog-dismiss>dismiss</button>
-            <button dialog-confirm autofocus>confirm</button>
-          </div>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="like-modal">
-      <template>
-        <test-dialog no-cancel-on-esc-key no-cancel-on-outside-click with-backdrop>
-          <p>Dialog</p>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="header">
-      <template>
-        <test-dialog>
-          <h2>Dialog</h2>
-          <div class="buttons">
-            <button dialog-dismiss>dismiss</button>
-            <button dialog-confirm autofocus>confirm</button>
-          </div>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="header-with-id">
-      <template>
-        <test-dialog>
-          <h2 id="header">Dialog</h2>
-          <div class="buttons">
-            <button dialog-dismiss>dismiss</button>
-            <button dialog-confirm autofocus>confirm</button>
-          </div>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="multiple">
-      <template>
-        <test-dialog modal id="dialog1">
-          <p>Dialog 1</p>
-        </test-dialog>
-        <test-dialog modal id="dialog2">
-          <p>Dialog 2</p>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="nestedmodals">
-      <template>
-        <test-dialog modal opened>
-          <p>Dialog 1</p>
-          <div class="buttons">
-            <button dialog-dismiss>dismiss</button>
-            <button dialog-confirm autofocus>confirm</button>
-          </div>
-
-          <test-dialog modal opened>
-            <p>Dialog 2</p>
-            <div class="buttons">
-              <button dialog-dismiss>dismiss</button>
-              <button dialog-confirm autofocus>confirm</button>
-            </div>
-          </test-dialog>
-        </test-dialog>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      function runAfterOpen(dialog, callback) {
-        dialog.addEventListener('iron-overlay-opened', callback);
-        dialog.open();
-      }
-
-      suite('basic', function() {
-
-        test('clicking dialog does not cancel the dialog', function(done) {
-          var dialog = fixture('basic');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function() {
-              assert('dialog should not close');
-            });
-            MockInteractions.tap(dialog);
-            setTimeout(function() {
-              done();
-            }, 100);
-          });
-        });
-
-        test('clicking dialog-dismiss button closes the dialog without confirmation', function(done) {
-          var dialog = fixture('basic');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function(event) {
-              assert.isFalse(event.detail.canceled, 'dialog is not canceled');
-              assert.isFalse(event.detail.confirmed, 'dialog is not confirmed');
-              done();
-            });
-            MockInteractions.tap(Polymer.dom(dialog).querySelector('[dialog-dismiss]'));
-          });
-        });
-
-        test('dialog-dismiss on a custom element is handled', function(done) {
-          var dialog = fixture('custom-element-button');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function(event) {
-              assert.isFalse(event.detail.canceled, 'dialog is not canceled');
-              assert.isFalse(event.detail.confirmed, 'dialog is not confirmed');
-              done();
-            });
-            MockInteractions.tap(Polymer.dom(dialog).querySelector('[dialog-dismiss]'));
-          });
-        });
-
-        test('dialog-dismiss button inside a custom element is handled', function(done) {
-          var dialog = fixture('buttons');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function(event) {
-              assert.isFalse(event.detail.canceled, 'dialog is not canceled');
-              assert.isFalse(event.detail.confirmed, 'dialog is not confirmed');
-              done();
-            });
-            MockInteractions.tap(Polymer.dom(dialog).querySelector('test-buttons').$.dismiss);
-          });
-        });
-
-        test('clicking dialog-confirm button closes the dialog with confirmation', function(done) {
-          var dialog = fixture('basic');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function(event) {
-              assert.isFalse(event.detail.canceled, 'dialog is not canceled');
-              assert.isTrue(event.detail.confirmed, 'dialog is confirmed');
-              done();
-            });
-            MockInteractions.tap(Polymer.dom(dialog).querySelector('[dialog-confirm]'));
-          });
-        });
-
-        test('dialog-confirm on a custom element handled', function(done) {
-          var dialog = fixture('custom-element-button');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function(event) {
-              assert.isFalse(event.detail.canceled, 'dialog is not canceled');
-              assert.isTrue(event.detail.confirmed, 'dialog is confirmed');
-              done();
-            });
-            MockInteractions.tap(Polymer.dom(dialog).querySelector('[dialog-confirm]'));
-          });
-        });
-
-        test('dialog-confirm button inside a custom element is handled', function(done) {
-          var dialog = fixture('buttons');
-          runAfterOpen(dialog, function() {
-            dialog.addEventListener('iron-overlay-closed', function(event) {
-              assert.isFalse(event.detail.canceled, 'dialog is not canceled');
-              assert.isTrue(event.detail.confirmed, 'dialog is confirmed');
-              done();
-            });
-            MockInteractions.tap(Polymer.dom(dialog).querySelector('test-buttons').$.confirm);
-          });
-        });
-
-        test('clicking dialog-dismiss button closes only the dialog where is contained', function(done) {
-          var dialog = fixture('nestedmodals');
-          var innerDialog = Polymer.dom(dialog).querySelector('test-dialog');
-          MockInteractions.tap(Polymer.dom(innerDialog).querySelector('[dialog-dismiss]'));
-          setTimeout(function() {
-            assert.isFalse(innerDialog.opened, 'inner dialog is closed');
-            assert.isTrue(dialog.opened, 'dialog is still open');
-            done();
-          }, 10);
-        });
-
-        test('clicking dialog-confirm button closes only the dialog where is contained', function(done) {
-          var dialog = fixture('nestedmodals');
-          var innerDialog = Polymer.dom(dialog).querySelector('test-dialog');
-          MockInteractions.tap(Polymer.dom(innerDialog).querySelector('[dialog-confirm]'));
-          setTimeout(function() {
-            assert.isFalse(innerDialog.opened, 'inner dialog is closed');
-            assert.isTrue(dialog.opened, 'dialog is still open');
-            done();
-          }, 10);
-        });
-
-        var properties = ['noCancelOnEscKey', 'noCancelOnOutsideClick', 'withBackdrop'];
-        properties.forEach(function(property) {
-
-          test('modal sets ' + property + ' to true', function() {
-            var dialog = fixture('modal');
-            assert.isTrue(dialog[property], property);
-          });
-
-          test('modal toggling keeps current value of ' + property, function() {
-            var dialog = fixture('modal');
-            // Changed to false while modal is true.
-            dialog[property] = false;
-            dialog.modal = false;
-            assert.isFalse(dialog[property], property + ' is false');
-          });
-
-          test('modal toggling keeps previous value of ' + property, function() {
-            var dialog = fixture('basic');
-            // Changed before modal is true.
-            dialog[property] = true;
-            // Toggle twice to trigger observer.
-            dialog.modal = true;
-            dialog.modal = false;
-            assert.isTrue(dialog[property], property + ' is still true');
-          });
-
-          test('default modal does not override ' + property +' (attribute)', function() {
-            // Property is set on ready from attribute.
-            var dialog = fixture('like-modal');
-            assert.isTrue(dialog[property], property + ' is true');
-          });
-
-          test('modal toggling keeps previous value of ' + property + ' (attribute)', function() {
-            // Property is set on ready from attribute.
-            var dialog = fixture('like-modal');
-            // Toggle twice to trigger observer.
-            dialog.modal = true;
-            dialog.modal = false;
-            assert.isTrue(dialog[property], property + ' is still true');
-          });
-
-        });
-
-        test('clicking outside a modal dialog does not move focus from dialog', function(done) {
-          var dialog = fixture('modal');
-          runAfterOpen(dialog, function() {
-            MockInteractions.tap(document.body);
-            setTimeout(function() {
-              assert.equal(document.activeElement, Polymer.dom(dialog).querySelector('[autofocus]'), 'document.activeElement is the autofocused button');
-              done();
-            }, 10);
-          });
-        });
-
-        test('removing a child element on click does not cause an exception', function(done) {
-          var dialog = fixture('basic');
-          runAfterOpen(dialog, function() {
-            var button = Polymer.dom(dialog).querySelector('[extra]');
-            button.addEventListener('click', function(event) {
-              Polymer.dom(event.target.parentNode).removeChild(event.target);
-              // should not throw exception here
-              done();
-            });
-            MockInteractions.tap(button);
-          });
-        });
-
-        test('multiple modal dialogs opened, handle focus change', function(done) {
-          var dialogs = fixture('multiple');
-
-          runAfterOpen(dialogs[0], function() {
-            runAfterOpen(dialogs[1], function() {
-              // Each modal dialog will trap the focus within its children.
-              // Multiple modal dialogs doing it might result in an infinite loop
-              // dialog1 focus -> dialog2 focus -> dialog1 focus -> dialog2 focus...
-              // causing a "Maximum call stack size exceeded" error.
-              // Wait 50ms and verify this does not happen.
-              Polymer.Base.async(function() {
-                // Should not enter in an infinite loop.
-                done();
-              }, 50);
-            });
-          });
-        });
-
-        test('multiple modal dialogs opened, handle outside click', function(done) {
-          var dialogs = fixture('multiple');
-
-          runAfterOpen(dialogs[0], function() {
-            runAfterOpen(dialogs[1], function() {
-              // Click should be handled only by dialogs[1].
-              MockInteractions.tap(document.body);
-              // Each modal dialog will trap the focus within its children.
-              // Multiple modal dialogs doing it might result in an infinite loop
-              // dialog1 focus -> dialog2 focus -> dialog1 focus -> dialog2 focus...
-              // causing a "Maximum call stack size exceeded" error.
-              // Wait 50ms and verify this does not happen.
-              Polymer.Base.async(function() {
-                // Should not enter in an infinite loop.
-                done();
-              }, 50);
-            });
-          });
-        });
-
-        test('focus is given to the autofocus element when clicking on backdrop', function(done) {
-          var dialog = fixture('modal');
-          dialog.addEventListener('iron-overlay-opened', onFirstOpen);
-          dialog.open();
-
-          function onFirstOpen() {
-            dialog.removeEventListener('iron-overlay-opened', onFirstOpen);
-            dialog.addEventListener('iron-overlay-closed', onFirstClose);
-            // Set the focus on dismiss button
-            MockInteractions.focus(Polymer.dom(dialog).querySelector('[dialog-dismiss]'));
-            // Close the dialog
-            dialog.close();
-          }
-
-          function onFirstClose() {
-            dialog.removeEventListener('iron-overlay-closed', onFirstClose);
-            dialog.addEventListener('iron-overlay-opened', onSecondOpen);
-            dialog.open();
-          }
-
-          function onSecondOpen() {
-            MockInteractions.tap(document.body);
-            setTimeout(function() {
-              assert.equal(document.activeElement, Polymer.dom(dialog).querySelector('[autofocus]'), 'document.activeElement is the autofocused button');
-              done();
-            }, 10);
-          }
-        });
-
-      });
-
-      suite('a11y', function() {
-
-        test('dialog has role="dialog"', function() {
-          var dialog = fixture('basic');
-          assert.equal(dialog.getAttribute('role'), 'dialog', 'has role="dialog"');
-        });
-
-      });
-    </script>
-
-  </body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/test-buttons.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/test-buttons.html
deleted file mode 100644
index 9f0d09c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/test-buttons.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-
-<dom-module id="test-buttons">
-  <template>
-    <button dialog-dismiss id="dismiss">dismiss</button>
-    <button dialog-confirm id="confirm">confirm</button>
-  </template>
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-    is: 'test-buttons'
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/test-dialog.html b/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/test-dialog.html
deleted file mode 100644
index ccaf4e8..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog-behavior/test/test-dialog.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-dialog-behavior.html">
-<link rel="import" href="../paper-dialog-shared-styles.html">
-
-<dom-module id="test-dialog">
-  <template>
-    <style include="paper-dialog-shared-styles"></style>
-    <content></content>
-  </template>
-
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'test-dialog',
-
-    behaviors: [
-      Polymer.PaperDialogBehavior
-    ]
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-dialog/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/README.md b/systrace/catapult/third_party/polymer/components/paper-dialog/README.md
deleted file mode 100644
index a958f06..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/README.md
+++ /dev/null
@@ -1,75 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-dialog.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-dialog.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-dialog)_
-
-
-##&lt;paper-dialog&gt;
-
-Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html)
-
-`<paper-dialog>` is a dialog with Material Design styling and optional animations when it is
-opened or closed. It provides styles for a header, content area, and an action area for buttons.
-You can use the `<paper-dialog-scrollable>` element (in its own repository) if you need a scrolling
-content area. To autofocus a specific child element after opening the dialog, give it the `autofocus`
-attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics.
-
-For example, the following code implements a dialog with a header, scrolling content area and
-buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened.
-
-```html
-<paper-dialog>
-  <h2>Header</h2>
-  <paper-dialog-scrollable>
-    Lorem ipsum...
-  </paper-dialog-scrollable>
-  <div class="buttons">
-    <paper-button dialog-dismiss>Cancel</paper-button>
-    <paper-button dialog-confirm autofocus>Accept</paper-button>
-  </div>
-</paper-dialog>
-```
-
-### Styling
-
-See the docs for `Polymer.PaperDialogBehavior` for the custom properties available for styling
-this element.
-
-### Animations
-
-Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog
-is opened or closed. See the documentation in
-[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info.
-
-For example:
-
-```html
-<link rel="import" href="components/neon-animation/animations/scale-up-animation.html">
-<link rel="import" href="components/neon-animation/animations/fade-out-animation.html">
-
-<paper-dialog entry-animation="scale-up-animation"
-              exit-animation="fade-out-animation">
-  <h2>Header</h2>
-  <div>Dialog body</div>
-</paper-dialog>
-```
-
-### Accessibility
-
-See the docs for `Polymer.PaperDialogBehavior` for accessibility features implemented by this
-element.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/bower.json b/systrace/catapult/third_party/polymer/components/paper-dialog/bower.json
deleted file mode 100644
index e7882a5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/bower.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "paper-dialog",
-  "description": "A Material Design dialog",
-  "version": "1.1.0",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "dialog",
-    "overlay"
-  ],
-  "main": "paper-dialog.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-dialog"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-dialog",
-  "ignore": [],
-  "dependencies": {
-    "neon-animation": "PolymerElements/neon-animation#^1.0.0",
-    "paper-dialog-behavior": "PolymerElements/paper-dialog-behavior#^1.0.0",
-    "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.7.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "paper-dialog-scrollable": "PolymerElements/paper-dialog-scrollable#^1.0.0",
-    "paper-dropdown-menu": "PolymerElements/paper-dropdown-menu#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-menu": "PolymerElements/paper-menu#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-dialog/demo/index.html
deleted file mode 100644
index fc1a1a6..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/demo/index.html
+++ /dev/null
@@ -1,226 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-dialog demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../paper-dialog.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../../paper-dialog-scrollable/paper-dialog-scrollable.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../../neon-animation/neon-animations.html">
-  <link rel="import" href="../../paper-dropdown-menu/paper-dropdown-menu.html">
-  <link rel="import" href="../../paper-menu/paper-menu.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-
-
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    .centered {
-      min-width: 500px;
-    }
-
-    demo-snippet {
-      --demo-snippet-code: {
-        max-height: 250px;
-      }
-    }
-  </style>
-
-</head>
-
-<body unresolved class="centered">
-  <h3>Dialog layouts</h3>
-  <demo-snippet>
-    <template>
-      <paper-button raised onclick="dialog.open()">plain dialog</paper-button>
-      <paper-button raised onclick="modal.open()">modal dialog</paper-button>
-      <paper-button raised onclick="scrolling.open()">scrolling dialog</paper-button>
-      <paper-button raised onclick="actions.open()">dialog with actions</paper-button>
-      <paper-button raised onclick="dropdownDialog.open()">dialog with dropdown</paper-button>
-      <paper-button raised onclick="nested.open()">dialog with nested dialog</paper-button>
-
-      <paper-dialog id="dialog">
-        <h2>Dialog Title</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-          irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-      </paper-dialog>
-
-      <paper-dialog id="scrolling">
-        <h2>Scrolling</h2>
-        <paper-dialog-scrollable>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-            irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-        </paper-dialog-scrollable>
-        <div class="buttons">
-          <paper-button dialog-dismiss>Cancel</paper-button>
-          <paper-button dialog-confirm autofocus>OK</paper-button>
-        </div>
-      </paper-dialog>
-
-      <paper-dialog id="actions">
-        <h2>Dialog Title</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-          irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-        <div class="buttons">
-          <paper-button>More Info...</paper-button>
-          <paper-button dialog-dismiss>Decline</paper-button>
-          <paper-button dialog-confirm autofocus>Accept</paper-button>
-        </div>
-      </paper-dialog>
-
-      <paper-dialog id="modal" modal>
-        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
-        <div class="buttons">
-          <paper-button dialog-confirm autofocus>Tap me to close</paper-button>
-        </div>
-      </paper-dialog>
-
-      <paper-dialog id="dropdownDialog">
-        <h2>Dialog Title</h2>
-        <paper-dropdown-menu label="Value">
-          <paper-menu class="dropdown-content">
-            <paper-item>1</paper-item>
-            <paper-item>2</paper-item>
-            <paper-item>3</paper-item>
-            <paper-item>4</paper-item>
-            <paper-item>5</paper-item>
-            <paper-item>6</paper-item>
-            <paper-item>7</paper-item>
-            <paper-item>8</paper-item>
-            <paper-item>9</paper-item>
-            <paper-item>10</paper-item>
-          </paper-menu>
-        </paper-dropdown-menu>
-      </paper-dialog>
-
-      <paper-dialog id="nested">
-        <h2>Dialog Title</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-          irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-        <div class="buttons">
-          <paper-button onclick="innerDialog.open()">Open nested dialog</paper-button>
-        </div>
-      </paper-dialog>
-
-      <paper-dialog id="innerDialog">
-        <h2>Dialog Title</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
-      </paper-dialog>
-    </template>
-  </demo-snippet>
-
-  <h3>Styling and positioning</h3>
-  <demo-snippet>
-    <template>
-      <style is="custom-style">
-        paper-dialog.colored {
-          border: 2px solid;
-          border-color: var(--paper-green-500);
-          background-color: var(--paper-light-green-50);
-          color: var(--paper-green-500);
-        }
-
-        paper-dialog.size-position {
-          position: fixed;
-          top: 16px;
-          right: 16px;
-          width: 300px;
-          height: 300px;
-          overflow: auto;
-        }
-      </style>
-      <paper-button raised onclick="colors.open()">colors</paper-button>
-      <paper-button raised onclick="position.open()">size &amp; position</paper-button>
-
-      <paper-dialog id="colors" class="colored">
-        <h2>Custom Colors</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
-          dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-      </paper-dialog>
-
-      <paper-dialog id="position" class="size-position">
-        <h2>Custom Size &amp; Position</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
-          dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-      </paper-dialog>
-    </template>
-  </demo-snippet>
-
-  <h3>Position with <code>positionTarget</code></h3>
-  <demo-snippet>
-    <template>
-      <style is="custom-style">
-        #alignedDialog {
-          margin: 0;
-        }
-      </style>
-      <paper-button raised onclick="openBy(this)">Open</paper-button>
-      <paper-button raised onclick="openBy(this)">Open</paper-button>
-      <paper-button raised onclick="openBy(this)">Open</paper-button>
-
-      <paper-dialog id="alignedDialog" no-overlap horizontal-align="left" vertical-align="top">
-        <h2>Aligned dialog</h2>
-        <paper-dialog-scrollable>
-          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
-          dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-        </paper-dialog-scrollable>
-      </paper-dialog>
-
-      <script>
-        function openBy(element) {
-          alignedDialog.positionTarget = element;
-          alignedDialog.open();
-        }
-      </script>
-    </template>
-  </demo-snippet>
-
-  <h3>Transitions with neon-animation</h3>
-  <demo-snippet>
-    <template>
-      <paper-button raised onclick="animated.open()">open</paper-button>
-      <paper-dialog id="animated" entry-animation="scale-up-animation" exit-animation="fade-out-animation" with-backdrop>
-        <h2>Dialog Title</h2>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
-          irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-      </paper-dialog>
-    </template>
-  </demo-snippet>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/hero.svg b/systrace/catapult/third_party/polymer/components/paper-dialog/hero.svg
deleted file mode 100755
index 3628318..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/hero.svg
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<g>

-		<polygon points="0,124 0,126 2,126 		"/>

-		<polygon points="0,111.6 0,114.4 11.6,126 14.4,126 		"/>

-		<polygon points="0,99.1 0,101.9 24.1,126 26.9,126 		"/>

-		<polygon points="0,86.6 0,89.5 36.5,126 39.4,126 		"/>

-		<polygon points="0,74.2 0,77 49,126 51.8,126 		"/>

-		<polygon points="0,61.7 0,64.5 61.5,126 64.3,126 		"/>

-		<polygon points="0,49.2 0,52.1 73.9,126 76.8,126 		"/>

-		<polygon points="0,36.8 0,39.6 86.4,126 89.2,126 		"/>

-		<polygon points="0,24.3 0,27.1 98.9,126 101.7,126 		"/>

-		<polygon points="75.2,87 74,87 74,85.8 0,11.8 0,14.7 111.3,126 114.2,126 		"/>

-		<polygon points="87.6,87 84.8,87 123.8,126 126.6,126 		"/>

-		<polygon points="74,76.2 74,73.4 0.6,0 0,0 0,2.2 		"/>

-		<polygon points="74,63.7 74,60.9 13.1,0 10.3,0 		"/>

-		<polygon points="100.1,87 97.3,87 136.3,126 139.1,126 		"/>

-		<polygon points="112.6,87 109.7,87 148.7,126 151.6,126 		"/>

-		<polygon points="74,51.3 74,48.4 25.6,0 22.7,0 		"/>

-		<polygon points="125,87 122.2,87 161.2,126 164,126 		"/>

-		<polygon points="74.2,39 77,39 38,0 35.2,0 		"/>

-		<polygon points="86.7,39 89.5,39 50.5,0 47.7,0 		"/>

-		<polygon points="137.5,87 134.7,87 173.7,126 176.5,126 		"/>

-		<polygon points="150,87 147.1,87 186.1,126 189,126 		"/>

-		<polygon points="99.1,39 102,39 63,0 60.1,0 		"/>

-		<polygon points="150,74.6 150,77.4 198.6,126 201.4,126 		"/>

-		<polygon points="111.6,39 114.4,39 75.4,0 72.6,0 		"/>

-		<polygon points="150,62.1 150,64.9 211.1,126 213.9,126 		"/>

-		<polygon points="124.1,39 126.9,39 87.9,0 85.1,0 		"/>

-		<polygon points="100.3,0 97.5,0 136.5,39 139.3,39 		"/>

-		<polygon points="150,49.7 150,52.5 223.5,126 225,126 225,124.7 		"/>

-		<polygon points="112.8,0 110,0 149,39 150,39 150,40 225,115 225,112.2 		"/>

-		<polygon points="125.3,0 122.5,0 225,102.5 225,99.7 		"/>

-		<polygon points="137.7,0 134.9,0 225,90.1 225,87.3 		"/>

-		<polygon points="150.2,0 147.4,0 225,77.6 225,74.8 		"/>

-		<polygon points="162.7,0 159.8,0 225,65.2 225,62.3 		"/>

-		<polygon points="175.1,0 172.3,0 225,52.7 225,49.9 		"/>

-		<polygon points="187.6,0 184.8,0 225,40.2 225,37.4 		"/>

-		<polygon points="200.1,0 197.2,0 225,27.8 225,24.9 		"/>

-		<polygon points="212.5,0 209.7,0 225,15.3 225,12.5 		"/>

-		<polygon points="225,0 222.2,0 225,2.8 225,0 		"/>

-	</g>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-	<path d="M151,88H73V38h78V88z M75,86h74V40H75V86z"/>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/index.html b/systrace/catapult/third_party/polymer/components/paper-dialog/index.html
deleted file mode 100644
index 6304b8d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-dialog</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/paper-dialog.html b/systrace/catapult/third_party/polymer/components/paper-dialog/paper-dialog.html
deleted file mode 100644
index 512ca04..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/paper-dialog.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../neon-animation/neon-animation-runner-behavior.html">
-<link rel="import" href="../paper-dialog-behavior/paper-dialog-behavior.html">
-<link rel="import" href="../paper-dialog-behavior/paper-dialog-shared-styles.html">
-<!--
-Material design: [Dialogs](https://www.google.com/design/spec/components/dialogs.html)
-
-`<paper-dialog>` is a dialog with Material Design styling and optional animations when it is
-opened or closed. It provides styles for a header, content area, and an action area for buttons.
-You can use the `<paper-dialog-scrollable>` element (in its own repository) if you need a scrolling
-content area. To autofocus a specific child element after opening the dialog, give it the `autofocus`
-attribute. See `Polymer.PaperDialogBehavior` and `Polymer.IronOverlayBehavior` for specifics.
-
-For example, the following code implements a dialog with a header, scrolling content area and
-buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened.
-
-    <paper-dialog>
-      <h2>Header</h2>
-      <paper-dialog-scrollable>
-        Lorem ipsum...
-      </paper-dialog-scrollable>
-      <div class="buttons">
-        <paper-button dialog-dismiss>Cancel</paper-button>
-        <paper-button dialog-confirm autofocus>Accept</paper-button>
-      </div>
-    </paper-dialog>
-
-### Styling
-
-See the docs for `Polymer.PaperDialogBehavior` for the custom properties available for styling
-this element.
-
-### Animations
-
-Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog
-is opened or closed. See the documentation in
-[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info.
-
-For example:
-
-    <link rel="import" href="components/neon-animation/animations/scale-up-animation.html">
-    <link rel="import" href="components/neon-animation/animations/fade-out-animation.html">
-
-    <paper-dialog entry-animation="scale-up-animation"
-                  exit-animation="fade-out-animation">
-      <h2>Header</h2>
-      <div>Dialog body</div>
-    </paper-dialog>
-
-### Accessibility
-
-See the docs for `Polymer.PaperDialogBehavior` for accessibility features implemented by this
-element.
-
-@group Paper Elements
-@element paper-dialog
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-dialog">
-  <template>
-    <style include="paper-dialog-shared-styles"></style>
-    <content></content>
-  </template>
-</dom-module>
-
-<script>
-
-(function() {
-
-  Polymer({
-
-    is: 'paper-dialog',
-
-    behaviors: [
-      Polymer.PaperDialogBehavior,
-      Polymer.NeonAnimationRunnerBehavior
-    ],
-
-    listeners: {
-      'neon-animation-finish': '_onNeonAnimationFinish'
-    },
-
-    _renderOpened: function() {
-      this.cancelAnimation();
-      this.playAnimation('entry');
-    },
-
-    _renderClosed: function() {
-      this.cancelAnimation();
-      this.playAnimation('exit');
-    },
-
-    _onNeonAnimationFinish: function() {
-      if (this.opened) {
-        this._finishRenderOpened();
-      } else {
-        this._finishRenderClosed();
-      }
-    }
-
-  });
-
-})();
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/test/index.html b/systrace/catapult/third_party/polymer/components/paper-dialog/test/index.html
deleted file mode 100644
index 3d0c8ee..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>paper-dialog tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'paper-dialog.html',
-        'paper-dialog.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dialog/test/paper-dialog.html b/systrace/catapult/third_party/polymer/components/paper-dialog/test/paper-dialog.html
deleted file mode 100644
index 02ed509..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dialog/test/paper-dialog.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <title>paper-dialog tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <link rel="import" href="../paper-dialog.html">
-</head>
-
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <paper-dialog>
-        <p>Dialog</p>
-      </paper-dialog>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="modal">
-    <template>
-      <paper-dialog modal>
-        <p>Dialog</p>
-      </paper-dialog>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="opened-modals">
-    <template>
-      <paper-dialog modal opened>
-        <p>Dialog 1</p>
-        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
-      </paper-dialog>
-      <paper-dialog modal opened>
-        <p>Dialog 2</p>
-      </paper-dialog>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('modal', function() {
-
-      test('backdrop element remains opened when closing top modal, closes when all modals are closed', function(done) {
-        var modals = fixture('opened-modals');
-        modals[1].addEventListener('iron-overlay-opened', function() {
-          assert.isTrue(modals[1].backdropElement.opened, 'backdrop is open');
-          modals[1].close();
-        });
-        modals[1].addEventListener('iron-overlay-closed', function() {
-          assert.isTrue(modals[1].backdropElement.opened, 'backdrop is still open');
-          modals[0].close();
-        });
-        modals[0].addEventListener('iron-overlay-closed', function() {
-          assert.isFalse(modals[0].backdropElement.opened, 'backdrop is closed');
-          done();
-        });
-      });
-
-    });
-
-    suite('a11y', function() {
-      a11ySuite('basic', []);
-
-      a11ySuite('modal', []);
-
-      test('dialog has role="dialog"', function() {
-        var dialog = fixture('basic');
-        assert.equal(dialog.getAttribute('role'), 'dialog', 'has role="dialog"');
-      });
-
-    });
-  </script>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/README.md b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/README.md
deleted file mode 100644
index ff15080..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-dropdown-menu)
-[![Build status](https://travis-ci.org/PolymerElements/paper-dropdown-menu.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dropdown-menu)
-
-##&lt;paper-dropdown-menu&gt;
-
-Material design: [Dropdown menus](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)
-
-`paper-dropdown-menu` is similar to a native browser select element.
-`paper-dropdown-menu` works with selectable content. 
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-dropdown-menu.html">
-    <link rel="import" href="../paper-item/paper-item.html">
-    <link rel="import" href="../paper-listbox/paper-listbox.html">
-    <link rel="import" href="../iron-demo-helpers/demo-pages-shared-styles.html">
-    <style is="custom-style" include="demo-pages-shared-styles">
-      paper-dropdown-menu, paper-listbox {
-        width: 250px;
-      }
-      paper-dropdown-menu {
-        height: 200px;
-        margin: auto;
-        display: block;
-      }
-    </style>
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-dropdown-menu label="Dinosaurs">
-  <paper-listbox class="dropdown-content" selected="1">
-    <paper-item>allosaurus</paper-item>
-    <paper-item>brontosaurus</paper-item>
-    <paper-item>carcharodontosaurus</paper-item>
-    <paper-item>diplodocus</paper-item>
-  </paper-listbox>
-</paper-dropdown-menu>
-```
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/bower.json b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/bower.json
deleted file mode 100644
index aac4ec7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/bower.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "name": "paper-dropdown-menu",
-  "version": "1.5.1",
-  "description": "An element that works similarly to a native browser select",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "dropdown",
-    "select"
-  ],
-  "main": "paper-dropdown-menu.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-dropdown-menu.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-dropdown-menu",
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
-    "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
-    "iron-validatable-behavior": "PolymerElements/iron-validatable-behavior#^1.0.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-input": "PolymerElements/paper-input#^1.0.9",
-    "paper-menu-button": "PolymerElements/paper-menu-button#^1.3.0",
-    "paper-ripple": "PolymerElements/paper-ripple#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-listbox": "PolymerElements/paper-listbox#^1.0.0",
-    "paper-tabs": "PolymerElements/paper-tabs#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/demo/index.html
deleted file mode 100644
index 4bb258e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/demo/index.html
+++ /dev/null
@@ -1,295 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-dropdown-menu demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../paper-listbox/paper-listbox.html">
-  <link rel="import" href="../../paper-tabs/paper-tabs.html">
-  <link rel="import" href="../paper-dropdown-menu.html">
-  <link rel="import" href="../paper-dropdown-menu-light.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    paper-tabs {
-      width: 400px;
-    }
-
-    .vertical-section-container {
-      max-width: 500px;
-    }
-
-    paper-dropdown-menu {
-      width: 200px;
-      margin-right: 20px;
-    }
-  </style>
-
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h4>This is a plain paper-dropdown-menu</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-dropdown-menu label="Dinosaurs">
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light label="Dinosaurs (light)">
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-
-    <h4>You can pre-select a value using the <i>selected</i> attribute</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-dropdown-menu label="Dinosaurs">
-          <paper-listbox class="dropdown-content" selected="1">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light label="Dinosaurs (light)">
-          <paper-listbox class="dropdown-content" selected="1">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-
-    <h4>You can change the direction in which the menu opens</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-dropdown-menu label="Upwards and to the left!" vertical-align="bottom" horizontal-align="left">
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light label="Upwards and to the left! (light)" vertical-align="bottom" horizontal-align="left">
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-
-
-    <h4>A paper-dropdown-menu can be disabled</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-dropdown-menu label="Disabled dinosaurs" disabled>
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light label="Disabled dinosaurs (light)" disabled>
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-
-    <!-- TODO(noms): enable this demo when the webcomponentsjs bug is fixed -->
-    <!-- <h4>Here is an example of a long, scrolling menu, using a <i>dom-repeat</i></h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <template is="dom-bind" id="Demo">
-          <paper-dropdown-menu label="Dinosaurs">
-            <paper-listbox class="dropdown-content">
-              <template is="dom-repeat" items='[[dinosaurs]]' as="dinosaur">
-                <paper-item>[[dinosaur]]</paper-item>
-              </template>
-            </paper-listbox>
-          </paper-dropdown-menu>
-        </template>
-      </template>
-    </demo-snippet> -->
-
-    <h4>A paper-dropdown-menu can contain any kind of content, such as tabs</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-dropdown-menu label="Menu tabs!?">
-          <paper-tabs class="dropdown-content">
-            <paper-tab>cheddar</paper-tab>
-            <paper-tab>stilton</paper-tab>
-            <paper-tab>emmental</paper-tab>
-          </paper-tabs>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light label="Menu tabs!? (light)">
-          <paper-tabs class="dropdown-content">
-            <paper-tab>cheddar</paper-tab>
-            <paper-tab>stilton</paper-tab>
-            <paper-tab>emmental</paper-tab>
-          </paper-tabs>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-
-    <h4>You can remove the ripple and the animations</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-dropdown-menu label="Dinosaurs" noink no-animations>
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light label="Dinosaurs (light)" noink no-animations>
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-
-    <h4>You can style a paper-dropdown-menu using custom properties</h4>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style is="custom-style">
-          paper-dropdown-menu.custom {
-            --paper-input-container-label: {
-              color: var(--paper-pink-500);
-              font-style: italic;
-              text-align: center;
-              font-weight: bold;
-            };
-            --paper-input-container-input: {
-              color: var(--paper-indigo-500);
-              font-style: normal;
-              font-family: serif;
-              text-transform: uppercase;
-            }
-            /* no underline */
-            --paper-input-container-underline: {
-              display: none;
-            };
-          }
-
-          paper-dropdown-menu-light.custom {
-            --paper-dropdown-menu-label: {
-              color: var(--paper-pink-500);
-              font-style: italic;
-              text-align: center;
-              font-weight: bold;
-            };
-            --paper-dropdown-menu-input: {
-              color: var(--paper-indigo-500);
-              font-style: normal;
-              font-family: serif;
-              text-transform: uppercase;
-              /* no underline */
-              border-bottom: none;
-            }
-          }
-        </style>
-        <paper-dropdown-menu class="custom" label="Custom" no-label-float>
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu>
-
-        <paper-dropdown-menu-light class="custom" label="Custom (light)" no-label-float>
-          <paper-listbox class="dropdown-content">
-            <paper-item>allosaurus</paper-item>
-            <paper-item>brontosaurus</paper-item>
-            <paper-item>carcharodontosaurus</paper-item>
-            <paper-item>diplodocus</paper-item>
-          </paper-listbox>
-        </paper-dropdown-menu-light>
-      </template>
-    </demo-snippet>
-  </div>
-
-  <script>
-  // document.addEventListener('WebComponentsReady', function() {
-  //   Demo.dinosaurs = [
-  //     'allosaurus',
-  //     'brontosaurus',
-  //     'carcharodontosaurus',
-  //     'diplodocus',
-  //     'ekrixinatosaurus',
-  //     'fukuiraptor',
-  //     'gallimimus',
-  //     'hadrosaurus',
-  //     'iguanodon',
-  //     'jainosaurus',
-  //     'kritosaurus',
-  //     'liaoceratops',
-  //     'megalosaurus',
-  //     'nemegtosaurus',
-  //     'ornithomimus',
-  //     'protoceratops',
-  //     'quetecsaurus',
-  //     'rajasaurus',
-  //     'stegosaurus',
-  //     'triceratops',
-  //     'utahraptor',
-  //     'vulcanodon',
-  //     'wannanosaurus',
-  //     'xenoceratops',
-  //     'yandusaurus',
-  //     'zephyrosaurus'
-  //   ];
-  // });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/index.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/index.html
deleted file mode 100644
index b8053bf..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-dropdown-menu</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-icons.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-icons.html
deleted file mode 100644
index d8ca87c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-icons.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-
-<iron-iconset-svg name="paper-dropdown-menu" size="24">
-<svg><defs>
-<g id="arrow-drop-down"><path d="M7 10l5 5 5-5z"></path></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-light.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-light.html
deleted file mode 100644
index edaabf8..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-light.html
+++ /dev/null
@@ -1,597 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
-<link rel="import" href="../paper-behaviors/paper-ripple-behavior.html">
-<link rel="import" href="../paper-menu-button/paper-menu-button.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<link rel="import" href="paper-dropdown-menu-icons.html">
-<link rel="import" href="paper-dropdown-menu-shared-styles.html">
-
-<!--
-Material design: [Dropdown menus](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)
-
-This is a faster, lighter version of `paper-dropdown-menu`, that does not
-use a `<paper-input>` internally. Use this element if you're concerned about
-the performance of this element, i.e., if you plan on using many dropdowns on
-the same page. Note that this element has a slightly different styling API
-than `paper-dropdown-menu`.
-
-`paper-dropdown-menu-light` is similar to a native browser select element.
-`paper-dropdown-menu-light` works with selectable content. The currently selected
-item is displayed in the control. If no item is selected, the `label` is
-displayed instead.
-
-Example:
-
-    <paper-dropdown-menu-light label="Your favourite pastry">
-      <paper-listbox class="dropdown-content">
-        <paper-item>Croissant</paper-item>
-        <paper-item>Donut</paper-item>
-        <paper-item>Financier</paper-item>
-        <paper-item>Madeleine</paper-item>
-      </paper-listbox>
-    </paper-dropdown-menu-light>
-
-This example renders a dropdown menu with 4 options.
-
-The child element with the class `dropdown-content` is used as the dropdown
-menu. This can be a [`paper-listbox`](paper-listbox), or any other or
-element that acts like an [`iron-selector`](iron-selector).
-
-Specifically, the menu child must fire an
-[`iron-select`](iron-selector#event-iron-select) event when one of its
-children is selected, and an [`iron-deselect`](iron-selector#event-iron-deselect)
-event when a child is deselected. The selected or deselected item must
-be passed as the event's `detail.item` property.
-
-Applications can listen for the `iron-select` and `iron-deselect` events
-to react when options are selected and deselected.
-
-### Styling
-
-The following custom properties and mixins are also available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-dropdown-menu` | A mixin that is applied to the element host | `{}`
-`--paper-dropdown-menu-disabled` | A mixin that is applied to the element host when disabled | `{}`
-`--paper-dropdown-menu-ripple` | A mixin that is applied to the internal ripple | `{}`
-`--paper-dropdown-menu-button` | A mixin that is applied to the internal menu button | `{}`
-`--paper-dropdown-menu-icon` | A mixin that is applied to the internal icon | `{}`
-`--paper-dropdown-menu-disabled-opacity` | The opacity of the dropdown when disabled  | `0.33`
-`--paper-dropdown-menu-color` | The color of the input/label/underline when the dropdown is unfocused | `--primary-text-color`
-`--paper-dropdown-menu-focus-color` | The color of the label/underline when the dropdown is focused  | `--primary-color`
-`--paper-dropdown-error-color` | The color of the label/underline when the dropdown is invalid  | `--error-color`
-`--paper-dropdown-menu-label` | Mixin applied to the label | `{}`
-`--paper-dropdown-menu-input` | Mixin appled to the input | `{}`
-
-Note that in this element, the underline is just the bottom border of the "input".
-To style it:
-
-    <style is=custom-style>
-      paper-dropdown-menu-light.custom {
-        --paper-dropdown-menu-input: {
-          border-bottom: 2px dashed lavender;
-        };
-    </style>
-
-@group Paper Elements
-@element paper-dropdown-menu-light
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-dropdown-menu-light">
-  <template>
-    <style include="paper-dropdown-menu-shared-styles">
-      :host(:focus) {
-        outline: none;
-      }
-
-      :host {
-        width: 200px;  /* Default size of an <input> */
-      }
-
-      /**
-       * All of these styles below are for styling the fake-input display
-       */
-      .dropdown-trigger {
-        box-sizing: border-box;
-        position: relative;
-        width: 100%;
-        padding: 16px 0 8px 0;
-      }
-
-      :host([disabled]) .dropdown-trigger {
-        pointer-events: none;
-        opacity: var(--paper-dropdown-menu-disabled-opacity, 0.33);
-      }
-
-      :host([no-label-float]) .dropdown-trigger {
-        padding-top: 8px;   /* If there's no label, we need less space up top. */
-      }
-
-      #input {
-        @apply(--paper-font-subhead);
-        @apply(--paper-font-common-nowrap);
-        line-height: 1.5;
-        border-bottom: 1px solid var(--paper-dropdown-menu-color, --secondary-text-color);
-        color: var(--paper-dropdown-menu-color, --primary-text-color);
-        width: 100%;
-        box-sizing: border-box;
-        padding: 12px 20px 0 0;   /* Right padding so that text doesn't overlap the icon */
-        outline: none;
-        @apply(--paper-dropdown-menu-input);
-      }
-
-      :host-context([dir="rtl"]) #input {
-        padding-right: 0px;
-        padding-left: 20px;
-      }
-
-      :host([disabled]) #input {
-        border-bottom: 1px dashed var(--paper-dropdown-menu-color, --secondary-text-color);
-      }
-
-      :host([invalid]) #input {
-        border-bottom: 2px solid var(--paper-dropdown-error-color, --error-color);
-      }
-
-      :host([no-label-float]) #input {
-        padding-top: 0;   /* If there's no label, we need less space up top. */
-      }
-
-      label {
-        @apply(--paper-font-subhead);
-        @apply(--paper-font-common-nowrap);
-        display: block;
-        position: absolute;
-        bottom: 0;
-        left: 0;
-        right: 0;
-        /**
-         * The container has a 16px top padding, and there's 12px of padding
-         * between the input and the label (from the input's padding-top)
-         */
-        top: 28px;
-        box-sizing: border-box;
-        width: 100%;
-        padding-right: 20px;    /* Right padding so that text doesn't overlap the icon */
-        text-align: left;
-        transition-duration: .2s;
-        transition-timing-function: cubic-bezier(.4,0,.2,1);
-        color: var(--paper-dropdown-menu-color, --secondary-text-color);
-        @apply(--paper-dropdown-menu-label);
-      }
-
-      :host-context([dir="rtl"]) label {
-        padding-right: 0px;
-        padding-left: 20px;
-      }
-
-      :host([no-label-float]) label {
-        top: 8px;
-        /* Since the label doesn't need to float, remove the animation duration
-        which slows down visibility changes (i.e. when a selection is made) */
-        transition-duration: 0s;
-      }
-
-      label.label-is-floating {
-        font-size: 12px;
-        top: 8px;
-      }
-
-      label.label-is-hidden {
-        visibility: hidden;
-      }
-
-      :host([focused]) label.label-is-floating {
-        color: var(--paper-dropdown-menu-focus-color, --primary-color);
-      }
-
-      :host([invalid]) label.label-is-floating {
-        color: var(--paper-dropdown-error-color, --error-color);
-      }
-
-      /**
-       * Sets up the focused underline. It's initially hidden, and becomes
-       * visible when it's focused.
-       */
-      label:after {
-        background-color: var(--paper-dropdown-menu-focus-color, --primary-color);
-        bottom: 7px;    /* The container has an 8px bottom padding */
-        content: '';
-        height: 2px;
-        left: 45%;
-        position: absolute;
-        transition-duration: .2s;
-        transition-timing-function: cubic-bezier(.4,0,.2,1);
-        visibility: hidden;
-        width: 8px;
-        z-index: 10;
-      }
-
-      :host([invalid]) label:after {
-        background-color: var(--paper-dropdown-error-color, --error-color);
-      }
-
-      :host([no-label-float]) label:after {
-        bottom: 7px;    /* The container has a 8px bottom padding */
-      }
-
-      :host([focused]:not([disabled])) label:after {
-        left: 0;
-        visibility: visible;
-        width: 100%;
-      }
-
-      iron-icon {
-        position: absolute;
-        right: 0px;
-        bottom: 8px;    /* The container has an 8px bottom padding */
-        @apply(--paper-font-subhead);
-        color: var(--disabled-text-color);
-        @apply(--paper-dropdown-menu-icon);
-      }
-
-      :host-context([dir="rtl"]) iron-icon {
-        left: 0;
-        right: auto;
-      }
-
-      :host([no-label-float]) iron-icon {
-        margin-top: 0px;
-      }
-
-      .error {
-        display: inline-block;
-        visibility: hidden;
-        color: var(--paper-dropdown-error-color, --error-color);
-        @apply(--paper-font-caption);
-        position: absolute;
-        left:0;
-        right:0;
-        bottom: -12px;
-      }
-
-      :host([invalid]) .error {
-        visibility: visible;
-      }
-    </style>
-
-    <!-- this div fulfills an a11y requirement for combobox, do not remove -->
-    <span role="button"></span>
-    <paper-menu-button
-      id="menuButton"
-      vertical-align="[[verticalAlign]]"
-      horizontal-align="[[horizontalAlign]]"
-      vertical-offset="[[_computeMenuVerticalOffset(noLabelFloat)]]"
-      disabled="[[disabled]]"
-      no-animations="[[noAnimations]]"
-      on-iron-select="_onIronSelect"
-      on-iron-deselect="_onIronDeselect"
-      opened="{{opened}}"
-      close-on-activate
-      allow-outside-scroll="[[allowOutsideScroll]]">
-      <div class="dropdown-trigger">
-        <label class$="[[_computeLabelClass(noLabelFloat,alwaysFloatLabel,hasContent)]]">
-          [[label]]
-        </label>
-        <div id="input" tabindex="-1">&nbsp;</div>
-        <iron-icon icon="paper-dropdown-menu:arrow-drop-down"></iron-icon>
-        <span class="error">[[errorMessage]]</span>
-      </div>
-      <content id="content" select=".dropdown-content"></content>
-    </paper-menu-button>
-  </template>
-
-  <script>
-    (function() {
-      'use strict';
-
-      Polymer({
-        is: 'paper-dropdown-menu-light',
-
-        behaviors: [
-          Polymer.IronButtonState,
-          Polymer.IronControlState,
-          Polymer.PaperRippleBehavior,
-          Polymer.IronFormElementBehavior,
-          Polymer.IronValidatableBehavior
-        ],
-
-        properties: {
-          /**
-           * The derived "label" of the currently selected item. This value
-           * is the `label` property on the selected item if set, or else the
-           * trimmed text content of the selected item.
-           */
-          selectedItemLabel: {
-            type: String,
-            notify: true,
-            readOnly: true
-          },
-
-          /**
-           * The last selected item. An item is selected if the dropdown menu has
-           * a child with class `dropdown-content`, and that child triggers an
-           * `iron-select` event with the selected `item` in the `detail`.
-           *
-           * @type {?Object}
-           */
-          selectedItem: {
-            type: Object,
-            notify: true,
-            readOnly: true
-          },
-
-          /**
-           * The value for this element that will be used when submitting in
-           * a form. It is read only, and will always have the same value
-           * as `selectedItemLabel`.
-           */
-          value: {
-            type: String,
-            notify: true,
-            readOnly: true,
-            observer: '_valueChanged',
-          },
-
-          /**
-           * The label for the dropdown.
-           */
-          label: {
-            type: String
-          },
-
-          /**
-           * The placeholder for the dropdown.
-           */
-          placeholder: {
-            type: String
-          },
-
-          /**
-           * True if the dropdown is open. Otherwise, false.
-           */
-          opened: {
-            type: Boolean,
-            notify: true,
-            value: false,
-            observer: '_openedChanged'
-          },
-
-          /**
-           * By default, the dropdown will constrain scrolling on the page
-           * to itself when opened.
-           * Set to true in order to prevent scroll from being constrained
-           * to the dropdown when it opens.
-           */
-          allowOutsideScroll: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Set to true to disable the floating label. Bind this to the
-           * `<paper-input-container>`'s `noLabelFloat` property.
-           */
-          noLabelFloat: {
-              type: Boolean,
-              value: false,
-              reflectToAttribute: true
-          },
-
-          /**
-           * Set to true to always float the label. Bind this to the
-           * `<paper-input-container>`'s `alwaysFloatLabel` property.
-           */
-          alwaysFloatLabel: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Set to true to disable animations when opening and closing the
-           * dropdown.
-           */
-          noAnimations: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * The orientation against which to align the menu dropdown
-           * horizontally relative to the dropdown trigger.
-           */
-          horizontalAlign: {
-            type: String,
-            value: 'right'
-          },
-
-          /**
-           * The orientation against which to align the menu dropdown
-           * vertically relative to the dropdown trigger.
-           */
-          verticalAlign: {
-            type: String,
-            value: 'top'
-          },
-
-          hasContent: {
-            type: Boolean,
-            readOnly: true
-          }
-        },
-
-        listeners: {
-          'tap': '_onTap'
-        },
-
-        keyBindings: {
-          'up down': 'open',
-          'esc': 'close'
-        },
-
-        hostAttributes: {
-          tabindex: 0,
-          role: 'combobox',
-          'aria-autocomplete': 'none',
-          'aria-haspopup': 'true'
-        },
-
-        observers: [
-          '_selectedItemChanged(selectedItem)'
-        ],
-
-        attached: function() {
-          // NOTE(cdata): Due to timing, a preselected value in a `IronSelectable`
-          // child will cause an `iron-select` event to fire while the element is
-          // still in a `DocumentFragment`. This has the effect of causing
-          // handlers not to fire. So, we double check this value on attached:
-          var contentElement = this.contentElement;
-          if (contentElement && contentElement.selectedItem) {
-            this._setSelectedItem(contentElement.selectedItem);
-          }
-        },
-
-        /**
-         * The content element that is contained by the dropdown menu, if any.
-         */
-        get contentElement() {
-          return Polymer.dom(this.$.content).getDistributedNodes()[0];
-        },
-
-        /**
-         * Show the dropdown content.
-         */
-        open: function() {
-          this.$.menuButton.open();
-        },
-
-        /**
-         * Hide the dropdown content.
-         */
-        close: function() {
-          this.$.menuButton.close();
-        },
-
-        /**
-         * A handler that is called when `iron-select` is fired.
-         *
-         * @param {CustomEvent} event An `iron-select` event.
-         */
-        _onIronSelect: function(event) {
-          this._setSelectedItem(event.detail.item);
-        },
-
-        /**
-         * A handler that is called when `iron-deselect` is fired.
-         *
-         * @param {CustomEvent} event An `iron-deselect` event.
-         */
-        _onIronDeselect: function(event) {
-          this._setSelectedItem(null);
-        },
-
-        /**
-         * A handler that is called when the dropdown is tapped.
-         *
-         * @param {CustomEvent} event A tap event.
-         */
-        _onTap: function(event) {
-          if (Polymer.Gestures.findOriginalTarget(event) === this) {
-            this.open();
-          }
-        },
-
-        /**
-         * Compute the label for the dropdown given a selected item.
-         *
-         * @param {Element} selectedItem A selected Element item, with an
-         * optional `label` property.
-         */
-        _selectedItemChanged: function(selectedItem) {
-          var value = '';
-          if (!selectedItem) {
-            value = '';
-          } else {
-            value = selectedItem.label || selectedItem.getAttribute('label') || selectedItem.textContent.trim();
-          }
-
-          this._setValue(value);
-          this._setSelectedItemLabel(value);
-        },
-
-        /**
-         * Compute the vertical offset of the menu based on the value of
-         * `noLabelFloat`.
-         *
-         * @param {boolean} noLabelFloat True if the label should not float
-         * above the input, otherwise false.
-         */
-        _computeMenuVerticalOffset: function(noLabelFloat) {
-          // NOTE(cdata): These numbers are somewhat magical because they are
-          // derived from the metrics of elements internal to `paper-input`'s
-          // template. The metrics will change depending on whether or not the
-          // input has a floating label.
-          return noLabelFloat ? -4 : 8;
-        },
-
-        /**
-         * Returns false if the element is required and does not have a selection,
-         * and true otherwise.
-         * @param {*=} _value Ignored.
-         * @return {boolean} true if `required` is false, or if `required` is true
-         * and the element has a valid selection.
-         */
-        _getValidity: function(_value) {
-          return this.disabled || !this.required || (this.required && !!this.value);
-        },
-
-        _openedChanged: function() {
-          var openState = this.opened ? 'true' : 'false';
-          var e = this.contentElement;
-          if (e) {
-            e.setAttribute('aria-expanded', openState);
-          }
-        },
-
-        _computeLabelClass: function(noLabelFloat, alwaysFloatLabel, hasContent) {
-          var cls = '';
-          if (noLabelFloat === true) {
-            return hasContent ? 'label-is-hidden' : '';
-          }
-
-          if (hasContent || alwaysFloatLabel === true) {
-            cls += ' label-is-floating';
-          }
-          return cls;
-        },
-
-        _valueChanged: function() {
-          // Only update if it's actually different.
-          if (this.$.input && this.$.input.textContent !== this.value) {
-            this.$.input.textContent = this.value;
-          }
-          this._setHasContent(!!this.value);
-        },
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-shared-styles.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-shared-styles.html
deleted file mode 100644
index 1130805..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu-shared-styles.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<dom-module id="paper-dropdown-menu-shared-styles">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        position: relative;
-        text-align: left;
-
-        /* NOTE(cdata): Both values are needed, since some phones require the
-         * value to be `transparent`.
-         */
-        -webkit-tap-highlight-color: rgba(0,0,0,0);
-        -webkit-tap-highlight-color: transparent;
-
-        --paper-input-container-input: {
-          overflow: hidden;
-          white-space: nowrap;
-          text-overflow: ellipsis;
-          max-width: 100%;
-          box-sizing: border-box;
-          cursor: pointer;
-        };
-
-        @apply(--paper-dropdown-menu);
-      }
-
-      :host([disabled]) {
-        @apply(--paper-dropdown-menu-disabled);
-      }
-
-      :host([noink]) paper-ripple {
-        display: none;
-      }
-
-      :host([no-label-float]) paper-ripple {
-        top: 8px;
-      }
-
-      paper-ripple {
-        top: 12px;
-        left: 0px;
-        bottom: 8px;
-        right: 0px;
-
-        @apply(--paper-dropdown-menu-ripple);
-      }
-
-      paper-menu-button {
-        display: block;
-        padding: 0;
-
-        @apply(--paper-dropdown-menu-button);
-      }
-
-      paper-input {
-        @apply(--paper-dropdown-menu-input);
-      }
-
-      iron-icon {
-        color: var(--disabled-text-color);
-
-        @apply(--paper-dropdown-menu-icon);
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu.html
deleted file mode 100644
index 98ebecc..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/paper-dropdown-menu.html
+++ /dev/null
@@ -1,415 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-validatable-behavior/iron-validatable-behavior.html">
-<link rel="import" href="../paper-input/paper-input.html">
-<link rel="import" href="../paper-menu-button/paper-menu-button.html">
-<link rel="import" href="../paper-ripple/paper-ripple.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<link rel="import" href="paper-dropdown-menu-icons.html">
-<link rel="import" href="paper-dropdown-menu-shared-styles.html">
-
-<!--
-Material design: [Dropdown menus](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)
-
-`paper-dropdown-menu` is similar to a native browser select element.
-`paper-dropdown-menu` works with selectable content. The currently selected
-item is displayed in the control. If no item is selected, the `label` is
-displayed instead.
-
-Example:
-
-    <paper-dropdown-menu label="Your favourite pastry">
-      <paper-listbox class="dropdown-content">
-        <paper-item>Croissant</paper-item>
-        <paper-item>Donut</paper-item>
-        <paper-item>Financier</paper-item>
-        <paper-item>Madeleine</paper-item>
-      </paper-listbox>
-    </paper-dropdown-menu>
-
-This example renders a dropdown menu with 4 options.
-
-The child element with the class `dropdown-content` is used as the dropdown
-menu. This can be a [`paper-listbox`](paper-listbox), or any other or
-element that acts like an [`iron-selector`](iron-selector).
-
-Specifically, the menu child must fire an
-[`iron-select`](iron-selector#event-iron-select) event when one of its
-children is selected, and an [`iron-deselect`](iron-selector#event-iron-deselect)
-event when a child is deselected. The selected or deselected item must
-be passed as the event's `detail.item` property.
-
-Applications can listen for the `iron-select` and `iron-deselect` events
-to react when options are selected and deselected.
-
-### Styling
-
-The following custom properties and mixins are also available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-dropdown-menu` | A mixin that is applied to the element host | `{}`
-`--paper-dropdown-menu-disabled` | A mixin that is applied to the element host when disabled | `{}`
-`--paper-dropdown-menu-ripple` | A mixin that is applied to the internal ripple | `{}`
-`--paper-dropdown-menu-button` | A mixin that is applied to the internal menu button | `{}`
-`--paper-dropdown-menu-input` | A mixin that is applied to the internal paper input | `{}`
-`--paper-dropdown-menu-icon` | A mixin that is applied to the internal icon | `{}`
-
-You can also use any of the `paper-input-container` and `paper-menu-button`
-style mixins and custom properties to style the internal input and menu button
-respectively.
-
-@group Paper Elements
-@element paper-dropdown-menu
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-dropdown-menu">
-  <template>
-    <style include="paper-dropdown-menu-shared-styles"></style>
-
-    <!-- this div fulfills an a11y requirement for combobox, do not remove -->
-    <span role="button"></span>
-    <paper-menu-button
-      id="menuButton"
-      vertical-align="[[verticalAlign]]"
-      horizontal-align="[[horizontalAlign]]"
-      dynamic-align="[[dynamicAlign]]"
-      vertical-offset="[[_computeMenuVerticalOffset(noLabelFloat)]]"
-      disabled="[[disabled]]"
-      no-animations="[[noAnimations]]"
-      on-iron-select="_onIronSelect"
-      on-iron-deselect="_onIronDeselect"
-      opened="{{opened}}"
-      close-on-activate
-      allow-outside-scroll="[[allowOutsideScroll]]"
-      restore-focus-on-close="[[restoreFocusOnClose]]">
-      <div class="dropdown-trigger">
-        <paper-ripple></paper-ripple>
-        <!-- paper-input has type="text" for a11y, do not remove -->
-        <paper-input
-          type="text"
-          invalid="[[invalid]]"
-          readonly
-          disabled="[[disabled]]"
-          value="[[selectedItemLabel]]"
-          placeholder="[[placeholder]]"
-          error-message="[[errorMessage]]"
-          always-float-label="[[alwaysFloatLabel]]"
-          no-label-float="[[noLabelFloat]]"
-          label="[[label]]">
-          <iron-icon icon="paper-dropdown-menu:arrow-drop-down" suffix></iron-icon>
-        </paper-input>
-      </div>
-      <content id="content" select=".dropdown-content"></content>
-    </paper-menu-button>
-  </template>
-
-  <script>
-    (function() {
-      'use strict';
-
-      Polymer({
-        is: 'paper-dropdown-menu',
-
-        behaviors: [
-          Polymer.IronButtonState,
-          Polymer.IronControlState,
-          Polymer.IronFormElementBehavior,
-          Polymer.IronValidatableBehavior
-        ],
-
-        properties: {
-          /**
-           * The derived "label" of the currently selected item. This value
-           * is the `label` property on the selected item if set, or else the
-           * trimmed text content of the selected item.
-           */
-          selectedItemLabel: {
-            type: String,
-            notify: true,
-            readOnly: true
-          },
-
-          /**
-           * The last selected item. An item is selected if the dropdown menu has
-           * a child with class `dropdown-content`, and that child triggers an
-           * `iron-select` event with the selected `item` in the `detail`.
-           *
-           * @type {?Object}
-           */
-          selectedItem: {
-            type: Object,
-            notify: true,
-            readOnly: true
-          },
-
-          /**
-           * The value for this element that will be used when submitting in
-           * a form. It is read only, and will always have the same value
-           * as `selectedItemLabel`.
-           */
-          value: {
-            type: String,
-            notify: true,
-            readOnly: true
-          },
-
-          /**
-           * The label for the dropdown.
-           */
-          label: {
-            type: String
-          },
-
-          /**
-           * The placeholder for the dropdown.
-           */
-          placeholder: {
-            type: String
-          },
-
-          /**
-           * The error message to display when invalid.
-           */
-          errorMessage: {
-              type: String
-          },
-
-          /**
-           * True if the dropdown is open. Otherwise, false.
-           */
-          opened: {
-            type: Boolean,
-            notify: true,
-            value: false,
-            observer: '_openedChanged'
-          },
-
-          /**
-           * By default, the dropdown will constrain scrolling on the page
-           * to itself when opened.
-           * Set to true in order to prevent scroll from being constrained
-           * to the dropdown when it opens.
-           */
-          allowOutsideScroll: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Set to true to disable the floating label. Bind this to the
-           * `<paper-input-container>`'s `noLabelFloat` property.
-           */
-          noLabelFloat: {
-              type: Boolean,
-              value: false,
-              reflectToAttribute: true
-          },
-
-          /**
-           * Set to true to always float the label. Bind this to the
-           * `<paper-input-container>`'s `alwaysFloatLabel` property.
-           */
-          alwaysFloatLabel: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Set to true to disable animations when opening and closing the
-           * dropdown.
-           */
-          noAnimations: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * The orientation against which to align the menu dropdown
-           * horizontally relative to the dropdown trigger.
-           */
-          horizontalAlign: {
-            type: String,
-            value: 'right'
-          },
-
-          /**
-           * The orientation against which to align the menu dropdown
-           * vertically relative to the dropdown trigger.
-           */
-          verticalAlign: {
-            type: String,
-            value: 'top'
-          },
-
-          /**
-           * If true, the `horizontalAlign` and `verticalAlign` properties will
-           * be considered preferences instead of strict requirements when
-           * positioning the dropdown and may be changed if doing so reduces
-           * the area of the dropdown falling outside of `fitInto`.
-           */
-          dynamicAlign: {
-            type: Boolean
-          },
-            
-          /**
-           * Whether focus should be restored to the dropdown when the menu closes.
-           */
-          restoreFocusOnClose: {
-            type: Boolean,
-            value: true
-          },
-        },
-
-        listeners: {
-          'tap': '_onTap'
-        },
-
-        keyBindings: {
-          'up down': 'open',
-          'esc': 'close'
-        },
-
-        hostAttributes: {
-          role: 'combobox',
-          'aria-autocomplete': 'none',
-          'aria-haspopup': 'true'
-        },
-
-        observers: [
-          '_selectedItemChanged(selectedItem)'
-        ],
-
-        attached: function() {
-          // NOTE(cdata): Due to timing, a preselected value in a `IronSelectable`
-          // child will cause an `iron-select` event to fire while the element is
-          // still in a `DocumentFragment`. This has the effect of causing
-          // handlers not to fire. So, we double check this value on attached:
-          var contentElement = this.contentElement;
-          if (contentElement && contentElement.selectedItem) {
-            this._setSelectedItem(contentElement.selectedItem);
-          }
-        },
-
-        /**
-         * The content element that is contained by the dropdown menu, if any.
-         */
-        get contentElement() {
-          return Polymer.dom(this.$.content).getDistributedNodes()[0];
-        },
-
-        /**
-         * Show the dropdown content.
-         */
-        open: function() {
-          this.$.menuButton.open();
-        },
-
-        /**
-         * Hide the dropdown content.
-         */
-        close: function() {
-          this.$.menuButton.close();
-        },
-
-        /**
-         * A handler that is called when `iron-select` is fired.
-         *
-         * @param {CustomEvent} event An `iron-select` event.
-         */
-        _onIronSelect: function(event) {
-          this._setSelectedItem(event.detail.item);
-        },
-
-        /**
-         * A handler that is called when `iron-deselect` is fired.
-         *
-         * @param {CustomEvent} event An `iron-deselect` event.
-         */
-        _onIronDeselect: function(event) {
-          this._setSelectedItem(null);
-        },
-
-        /**
-         * A handler that is called when the dropdown is tapped.
-         *
-         * @param {CustomEvent} event A tap event.
-         */
-        _onTap: function(event) {
-          if (Polymer.Gestures.findOriginalTarget(event) === this) {
-            this.open();
-          }
-        },
-
-        /**
-         * Compute the label for the dropdown given a selected item.
-         *
-         * @param {Element} selectedItem A selected Element item, with an
-         * optional `label` property.
-         */
-        _selectedItemChanged: function(selectedItem) {
-          var value = '';
-          if (!selectedItem) {
-            value = '';
-          } else {
-            value = selectedItem.label || selectedItem.getAttribute('label') || selectedItem.textContent.trim();
-          }
-
-          this._setValue(value);
-          this._setSelectedItemLabel(value);
-        },
-
-        /**
-         * Compute the vertical offset of the menu based on the value of
-         * `noLabelFloat`.
-         *
-         * @param {boolean} noLabelFloat True if the label should not float
-         * above the input, otherwise false.
-         */
-        _computeMenuVerticalOffset: function(noLabelFloat) {
-          // NOTE(cdata): These numbers are somewhat magical because they are
-          // derived from the metrics of elements internal to `paper-input`'s
-          // template. The metrics will change depending on whether or not the
-          // input has a floating label.
-          return noLabelFloat ? -4 : 8;
-        },
-
-        /**
-         * Returns false if the element is required and does not have a selection,
-         * and true otherwise.
-         * @param {*=} _value Ignored.
-         * @return {boolean} true if `required` is false, or if `required` is true
-         * and the element has a valid selection.
-         */
-        _getValidity: function(_value) {
-          return this.disabled || !this.required || (this.required && !!this.value);
-        },
-
-        _openedChanged: function() {
-          var openState = this.opened ? 'true' : 'false';
-          var e = this.contentElement;
-          if (e) {
-            e.setAttribute('aria-expanded', openState);
-          }
-        }
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/index.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/index.html
deleted file mode 100644
index a3d0a28..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-dropdown-menu tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-dropdown-menu.html',
-      'paper-dropdown-menu.html?dom=shadow',
-      'paper-dropdown-menu-light.html',
-      'paper-dropdown-menu-light.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/paper-dropdown-menu-light.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/paper-dropdown-menu-light.html
deleted file mode 100644
index 183ca86..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/paper-dropdown-menu-light.html
+++ /dev/null
@@ -1,219 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-dropdown-menu-light basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../paper-listbox/paper-listbox.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../paper-dropdown-menu-light.html">
-</head>
-<body>
-
-  <test-fixture id="TrivialDropdownMenu">
-    <template>
-      <paper-dropdown-menu-light no-animations>
-        <paper-listbox class="dropdown-content">
-          <paper-item>Foo</paper-item>
-          <paper-item>Bar</paper-item>
-        </paper-listbox>
-      </paper-dropdown-menu-light>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="PreselectedDropdownMenu">
-    <template>
-      <paper-dropdown-menu-light no-animations>
-        <paper-listbox class="dropdown-content" selected="1">
-          <paper-item>Foo</paper-item>
-          <paper-item>Bar</paper-item>
-        </paper-listbox>
-      </paper-dropdown-menu-light>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="LabelsDropdownMenu">
-    <template>
-      <paper-dropdown-menu-light no-animations>
-        <paper-listbox class="dropdown-content">
-          <paper-item label="Foo label property">Foo textContent</paper-item>
-          <paper-item label="Foo label attribute">Foo textContent</paper-item>
-          <paper-item>Foo textContent</paper-item>
-        </paper-listbox>
-      </paper-dropdown-menu-light>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    function runAfterOpen(menu, callback) {
-      menu.$.menuButton.$.dropdown.addEventListener('iron-overlay-opened', function() {
-        Polymer.Base.async(callback, 1);
-      });
-      MockInteractions.tap(menu);
-    }
-
-    suite('<paper-dropdown-menu-light>', function() {
-      var dropdownMenu;
-
-      setup(function() {
-        dropdownMenu = fixture('TrivialDropdownMenu');
-        content = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-      });
-
-      test('opens when tapped', function(done) {
-        var contentRect = content.getBoundingClientRect();
-
-        expect(contentRect.width).to.be.equal(0);
-        expect(contentRect.height).to.be.equal(0);
-
-        runAfterOpen(dropdownMenu, function() {
-          contentRect = content.getBoundingClientRect();
-
-          expect(dropdownMenu.opened).to.be.equal(true);
-
-          expect(contentRect.width).to.be.greaterThan(0);
-          expect(contentRect.height).to.be.greaterThan(0);
-          done();
-        });
-
-        expect(dropdownMenu.opened).to.be.equal(true);
-      });
-
-      test('closes when an item is activated', function(done) {
-        runAfterOpen(dropdownMenu, function() {
-          var firstItem = Polymer.dom(content).querySelector('paper-item');
-
-          MockInteractions.tap(firstItem);
-
-          Polymer.Base.async(function() {
-            expect(dropdownMenu.opened).to.be.equal(false);
-            done();
-          });
-        });
-      });
-
-      test('sets selected item to the activated item', function(done) {
-        runAfterOpen(dropdownMenu, function() {
-          var firstItem = Polymer.dom(content).querySelector('paper-item');
-
-          MockInteractions.tap(firstItem);
-
-          Polymer.Base.async(function() {
-            expect(dropdownMenu.selectedItem).to.be.equal(firstItem);
-            done();
-          });
-        });
-      });
-
-      suite('when a value is preselected', function() {
-        setup(function() {
-          dropdownMenu = fixture('PreselectedDropdownMenu');
-        });
-
-        test('the input area shows the correct selection', function() {
-          Polymer.dom.flush();
-          var secondItem = Polymer.dom(dropdownMenu).querySelectorAll('paper-item')[1];
-          expect(dropdownMenu.selectedItem).to.be.equal(secondItem);
-        });
-      });
-
-      suite('deselecting', function() {
-        var menu;
-
-        setup(function() {
-          dropdownMenu = fixture('PreselectedDropdownMenu');
-          menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-        });
-
-        test('an `iron-deselect` event clears the current selection', function() {
-          Polymer.dom.flush();
-          menu.selected = null;
-          expect(dropdownMenu.selectedItem).to.be.equal(null);
-        });
-      });
-
-      suite('validation', function() {
-        test('a non required dropdown is valid regardless of its selection', function() {
-          var dropdownMenu = fixture('TrivialDropdownMenu');
-          menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-
-          // no selection.
-          expect(dropdownMenu.validate()).to.be.true;
-          expect(dropdownMenu.invalid).to.be.false;
-          expect(dropdownMenu.value).to.not.be.ok;
-
-          // some selection.
-          menu.selected = 1;
-          expect(dropdownMenu.validate()).to.be.true;
-          expect(dropdownMenu.invalid).to.be.false;
-          expect(dropdownMenu.value).to.be.equal('Bar');
-        });
-
-        test('a required dropdown is invalid without a selection', function() {
-          var dropdownMenu = fixture('TrivialDropdownMenu');
-          dropdownMenu.required = true;
-
-          // no selection.
-          expect(dropdownMenu.validate()).to.be.false;
-          expect(dropdownMenu.invalid).to.be.true;
-          expect(dropdownMenu.value).to.not.be.ok;
-        });
-
-        test('a required dropdown is valid with a selection', function() {
-          var dropdownMenu = fixture('PreselectedDropdownMenu');
-          Polymer.dom.flush();
-
-          dropdownMenu.required = true;
-
-          expect(dropdownMenu.validate()).to.be.true;
-          expect(dropdownMenu.invalid).to.be.false;
-          expect(dropdownMenu.value).to.be.equal('Bar');
-        });
-      });
-
-      suite('selectedItemLabel', function() {
-        test('label property', function() {
-          var dropdownMenu = fixture('LabelsDropdownMenu');
-          var menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-          menu.selected = 0;
-          //Fake a label property since paper-item doesn't have one
-          dropdownMenu.selectedItem.label = dropdownMenu.selectedItem.getAttribute('label');
-          expect(dropdownMenu.selectedItemLabel).to.be.equal('Foo label property');
-        });
-
-        test('label attribute', function() {
-          var dropdownMenu = fixture('LabelsDropdownMenu');
-          var menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-          menu.selected = 1;
-          expect(dropdownMenu.selectedItemLabel).to.be.equal('Foo label attribute');
-        });
-
-        test('textContent', function() {
-          var dropdownMenu = fixture('LabelsDropdownMenu');
-          var menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-          menu.selected = 2;
-          expect(dropdownMenu.selectedItemLabel).to.be.equal('Foo textContent');
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/paper-dropdown-menu.html b/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/paper-dropdown-menu.html
deleted file mode 100644
index 3587f98..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-dropdown-menu/test/paper-dropdown-menu.html
+++ /dev/null
@@ -1,220 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-dropdown-menu basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../paper-listbox/paper-listbox.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../paper-dropdown-menu.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialDropdownMenu">
-    <template>
-      <paper-dropdown-menu no-animations>
-        <paper-listbox class="dropdown-content">
-          <paper-item>Foo</paper-item>
-          <paper-item>Bar</paper-item>
-        </paper-listbox>
-      </paper-dropdown-menu>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="PreselectedDropdownMenu">
-    <template>
-      <paper-dropdown-menu no-animations>
-        <paper-listbox class="dropdown-content" selected="1">
-          <paper-item>Foo</paper-item>
-          <paper-item>Bar</paper-item>
-        </paper-listbox>
-      </paper-dropdown-menu>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="LabelsDropdownMenu">
-    <template>
-      <paper-dropdown-menu no-animations>
-        <paper-listbox class="dropdown-content">
-          <paper-item label="Foo label property">Foo textContent</paper-item>
-          <paper-item label="Foo label attribute">Foo textContent</paper-item>
-          <paper-item>Foo textContent</paper-item>
-        </paper-listbox>
-      </paper-dropdown-menu>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    function runAfterOpen(menu, callback) {
-      menu.$.menuButton.$.dropdown.addEventListener('iron-overlay-opened', function() {
-        Polymer.Base.async(callback, 1);
-      });
-      MockInteractions.tap(menu);
-    }
-
-    suite('<paper-dropdown-menu>', function() {
-      var dropdownMenu;
-
-      setup(function() {
-        dropdownMenu = fixture('TrivialDropdownMenu');
-        content = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-      });
-
-      test('opens when tapped', function(done) {
-        var contentRect = content.getBoundingClientRect();
-
-        expect(contentRect.width).to.be.equal(0);
-        expect(contentRect.height).to.be.equal(0);
-
-        runAfterOpen(dropdownMenu, function() {
-          contentRect = content.getBoundingClientRect();
-
-          expect(dropdownMenu.opened).to.be.equal(true);
-
-          expect(contentRect.width).to.be.greaterThan(0);
-          expect(contentRect.height).to.be.greaterThan(0);
-          done();
-        });
-
-        expect(dropdownMenu.opened).to.be.equal(true);
-      });
-
-      test('closes when an item is activated', function(done) {
-        runAfterOpen(dropdownMenu, function() {
-          var firstItem = Polymer.dom(content).querySelector('paper-item');
-
-          MockInteractions.tap(firstItem);
-
-          Polymer.Base.async(function() {
-            expect(dropdownMenu.opened).to.be.equal(false);
-            done();
-          });
-        });
-      });
-
-      test('sets selected item to the activated item', function(done) {
-        runAfterOpen(dropdownMenu, function() {
-          var firstItem = Polymer.dom(content).querySelector('paper-item');
-
-          MockInteractions.tap(firstItem);
-
-          Polymer.Base.async(function() {
-            expect(dropdownMenu.selectedItem).to.be.equal(firstItem);
-            done();
-          });
-        });
-      });
-
-      suite('when a value is preselected', function() {
-        setup(function() {
-          dropdownMenu = fixture('PreselectedDropdownMenu');
-        });
-
-        test('the input area shows the correct selection', function() {
-          Polymer.dom.flush();
-          var secondItem = Polymer.dom(dropdownMenu).querySelectorAll('paper-item')[1];
-          expect(dropdownMenu.selectedItem).to.be.equal(secondItem);
-        });
-      });
-
-      suite('deselecting', function() {
-        var menu;
-
-        setup(function() {
-          dropdownMenu = fixture('PreselectedDropdownMenu');
-          menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-        });
-
-        test('an `iron-deselect` event clears the current selection', function() {
-          Polymer.dom.flush();
-          menu.selected = null;
-          expect(dropdownMenu.selectedItem).to.be.equal(null);
-        });
-      });
-
-      suite('validation', function() {
-        test('a non required dropdown is valid regardless of its selection', function() {
-          var dropdownMenu = fixture('TrivialDropdownMenu');
-          menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-
-          // no selection.
-          expect(dropdownMenu.validate()).to.be.true;
-          expect(dropdownMenu.invalid).to.be.false;
-          expect(dropdownMenu.value).to.not.be.ok;
-
-          // some selection.
-          menu.selected = 1;
-          expect(dropdownMenu.validate()).to.be.true;
-          expect(dropdownMenu.invalid).to.be.false;
-          expect(dropdownMenu.value).to.be.equal('Bar');
-        });
-
-        test('a required dropdown is invalid without a selection', function() {
-          var dropdownMenu = fixture('TrivialDropdownMenu');
-          dropdownMenu.required = true;
-
-          // no selection.
-          expect(dropdownMenu.validate()).to.be.false;
-          expect(dropdownMenu.invalid).to.be.true;
-          expect(dropdownMenu.value).to.not.be.ok;
-        });
-
-        test('a required dropdown is valid with a selection', function() {
-          var dropdownMenu = fixture('PreselectedDropdownMenu');
-          Polymer.dom.flush();
-
-          dropdownMenu.required = true;
-
-          expect(dropdownMenu.validate()).to.be.true;
-          expect(dropdownMenu.invalid).to.be.false;
-          expect(dropdownMenu.value).to.be.equal('Bar');
-        });
-      });
-
-      suite('selectedItemLabel', function() {
-        test('label property', function() {
-          var dropdownMenu = fixture('LabelsDropdownMenu');
-          var menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-          menu.selected = 0;
-          //Fake a label property since paper-item doesn't have one
-          dropdownMenu.selectedItem.label = dropdownMenu.selectedItem.getAttribute('label');
-          expect(dropdownMenu.selectedItemLabel).to.be.equal('Foo label property');
-        });
-
-        test('label attribute', function() {
-          var dropdownMenu = fixture('LabelsDropdownMenu');
-          var menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-          menu.selected = 1;
-          expect(dropdownMenu.selectedItemLabel).to.be.equal('Foo label attribute');
-        });
-
-        test('textContent', function() {
-          var dropdownMenu = fixture('LabelsDropdownMenu');
-          var menu = Polymer.dom(dropdownMenu).querySelector('.dropdown-content');
-          menu.selected = 2;
-          expect(dropdownMenu.selectedItemLabel).to.be.equal('Foo textContent');
-        });
-      });
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-fab/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/README.md b/systrace/catapult/third_party/polymer/components/paper-fab/README.md
deleted file mode 100644
index 3967c1b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-fab.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-fab)
-
-##&lt;paper-fab&gt;
-
-Material design: [Floating Action Button](https://www.google.com/design/spec/components/buttons-floating-action-button.html)
-
-`paper-fab` is a floating action button. It contains an image placed in the center and
-comes in two sizes: regular size and a smaller size by applying the attribute `mini`. When
-the user touches the button, a ripple effect emanates from the center of the button.
-
-You may import `iron-icons` to use with this element, or provide a URL to a custom icon.
-See `iron-iconset` for more information about how to use a custom icon set.
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-fab.html">
-    <link rel="import" href="../iron-icons/iron-icons.html">
-    <style is="custom-style">
-      paper-fab {
-        display: inline-block;
-        margin: 8px;
-      }
-      
-      paper-fab[mini] {
-        --paper-fab-background: #FF5722;
-      }
-      
-      paper-fab[label] {
-        font-size: 20px;
-        --paper-fab-background: #2196F3;
-      }
-      
-      .container {
-        display: flex;
-        align-items: center;
-      }
-    </style>
-    <div class="container">
-      <next-code-block></next-code-block>
-    </div>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-fab icon="favorite"></paper-fab>
-<paper-fab mini icon="reply"></paper-fab>
-<paper-fab label="😻"></paper-fab>
-```
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/bower.json b/systrace/catapult/third_party/polymer/components/paper-fab/bower.json
deleted file mode 100644
index 4063926..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/bower.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "paper-fab",
-  "version": "1.2.2",
-  "description": "A material design floating action button",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "button"
-  ],
-  "main": "paper-fab.html",
-  "ignore": [],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-fab.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-fab",
-  "dependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-material": "PolymerElements/paper-material#^1.0.5",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-fab/demo/index.html
deleted file mode 100644
index 06e3d67..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/demo/index.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-fab demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../paper-fab.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    paper-fab {
-      margin-left: 10px;
-      margin-right: 10px;
-    }
-
-    .vertical-section-container {
-      max-width: 550px;
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>FABs can be enabled or disabled</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style>
-          paper-fab.label {
-            font-size: 20px;
-          }
-        </style>
-        <paper-fab icon="favorite" title="heart"></paper-fab>
-        <paper-fab disabled icon="reply" title="reply"></paper-fab>
-        <paper-fab class="label" label="😻" title="heart eyes cat"></paper-fab>
-      </template>
-    </demo-snippet>
-
-    <h3>FABs can be made smaller using the <i>mini</i> attribute</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-fab mini icon="favorite" title="heart"></paper-fab>
-        <paper-fab mini disabled icon="reply" title="reply"></paper-fab>
-        <paper-fab mini class="label" label="😻" title="heart eyes cat"></paper-fab>
-      </template>
-    </demo-snippet>
-
-    <h3>FABs can hide the ripple effect using the <i>noink</i> attribute</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-fab noink icon="favorite" title="heart"></paper-fab>
-      </template>
-    </demo-snippet>
-
-    <h3>FABs can be styled using custom properties</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style is="custom-style">
-          paper-fab.blue {
-            --paper-fab-background: var(--paper-light-blue-500);
-            --paper-fab-keyboard-focus-background: var(--paper-light-blue-900);
-          }
-          paper-fab.orange {
-            --paper-fab-background: var(--paper-orange-500);
-            --paper-fab-keyboard-focus-background: var(--paper-orange-900);
-          }
-        </style>
-
-        <paper-fab icon="favorite" title="heart" class="blue"></paper-fab>
-        <paper-fab icon="favorite" title="heart" class="orange"></paper-fab>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/index.html b/systrace/catapult/third_party/polymer/components/paper-fab/index.html
deleted file mode 100644
index b0ced26..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-fab</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/paper-fab.html b/systrace/catapult/third_party/polymer/components/paper-fab/paper-fab.html
deleted file mode 100644
index c7f0578..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/paper-fab.html
+++ /dev/null
@@ -1,187 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../paper-behaviors/paper-button-behavior.html">
-<link rel="import" href="../paper-material/paper-material-shared-styles.html">
-<link rel="import" href="../paper-styles/color.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<!--
-Material design: [Floating Action Button](https://www.google.com/design/spec/components/buttons-floating-action-button.html)
-
-`paper-fab` is a floating action button. It contains an image placed in the center and
-comes in two sizes: regular size and a smaller size by applying the attribute `mini`. When
-the user touches the button, a ripple effect emanates from the center of the button.
-
-You may import `iron-icons` to use with this element, or provide a URL to a custom icon.
-See `iron-iconset` for more information about how to use a custom icon set.
-
-Example:
-
-    <link href="path/to/iron-icons/iron-icons.html" rel="import">
-
-    <paper-fab icon="add"></paper-fab>
-    <paper-fab mini icon="favorite"></paper-fab>
-    <paper-fab src="star.png"></paper-fab>
-
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-fab-background` | The background color of the button | `--accent-color`
-`--paper-fab-keyboard-focus-background` | The background color of the button when focused | `--paper-pink-900`
-`--paper-fab-disabled-background` | The background color of the button when it's disabled | `--paper-grey-300`
-`--paper-fab-disabled-text` | The text color of the button when it's disabled | `--paper-grey-500`
-`--paper-fab` | Mixin applied to the button | `{}`
-`--paper-fab-mini` | Mixin applied to a mini button | `{}`
-`--paper-fab-disabled` | Mixin applied to a disabled button | `{}`
-`--paper-fab-iron-icon` | Mixin applied to the iron-icon within the button | `{}`
-`--paper-fab-label` | Mixin applied to the label within the button | `{}`
-
-@group Paper Elements
-@demo demo/index.html
--->
-
-<dom-module id="paper-fab">
-  <template strip-whitespace>
-    <style include="paper-material-shared-styles">
-      :host {
-        @apply(--layout-vertical);
-        @apply(--layout-center-center);
-
-        background: var(--paper-fab-background, --accent-color);
-        border-radius: 50%;
-        box-sizing: border-box;
-        color: var(--text-primary-color);
-        cursor: pointer;
-        height: 56px;
-        min-width: 0;
-        outline: none;
-        padding: 16px;
-        position: relative;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        -webkit-user-select: none;
-        user-select: none;
-        width: 56px;
-        z-index: 0;
-
-        /* NOTE: Both values are needed, since some phones require the value `transparent`. */
-        -webkit-tap-highlight-color: rgba(0,0,0,0);
-        -webkit-tap-highlight-color: transparent;
-
-        @apply(--paper-fab);
-      }
-
-      [hidden] {
-        display: none !important;
-      }
-
-      :host([mini]) {
-        width: 40px;
-        height: 40px;
-        padding: 8px;
-
-        @apply(--paper-fab-mini);
-      }
-
-      :host([disabled]) {
-        color: var(--paper-fab-disabled-text, --paper-grey-500);
-        background: var(--paper-fab-disabled-background, --paper-grey-300);
-
-        @apply(--paper-fab-disabled);
-      }
-
-      iron-icon {
-        @apply(--paper-fab-iron-icon);
-      }
-
-      span {
-        width: 100%;
-        white-space: nowrap;
-        overflow: hidden;
-        text-overflow: ellipsis;
-        text-align: center;
-
-        @apply(--paper-fab-label);
-      }
-
-      :host(.keyboard-focus) {
-        background: var(--paper-fab-keyboard-focus-background, --paper-pink-900);
-      }
-    </style>
-
-    <iron-icon id="icon" hidden$="{{!_computeIsIconFab(icon, src)}}" src="[[src]]" icon="[[icon]]"></iron-icon>
-    <span hidden$="{{_computeIsIconFab(icon, src)}}">{{label}}</span>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-fab',
-
-      behaviors: [
-        Polymer.PaperButtonBehavior
-      ],
-
-      properties: {
-        /**
-         * The URL of an image for the icon. If the src property is specified,
-         * the icon property should not be.
-         */
-        src: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * Specifies the icon name or index in the set of icons available in
-         * the icon's icon set. If the icon property is specified,
-         * the src property should not be.
-         */
-        icon: {
-          type: String,
-          value: ''
-        },
-
-        /**
-         * Set this to true to style this is a "mini" FAB.
-         */
-        mini: {
-          type: Boolean,
-          value: false,
-          reflectToAttribute: true
-        },
-
-        /**
-         * The label displayed in the badge. The label is centered, and ideally
-         * should have very few characters.
-         */
-        label: {
-          type: String,
-          observer: '_labelChanged'
-        }
-      },
-
-      _labelChanged: function() {
-        this.setAttribute('aria-label', this.label);
-      },
-
-      _computeIsIconFab: function(icon, src) {
-        return (icon.length > 0) || (src.length > 0);
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/test/a11y.html b/systrace/catapult/third_party/polymer/components/paper-fab/test/a11y.html
deleted file mode 100644
index 7029aff..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/test/a11y.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-fab a11y tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../paper-fab.html">
-
-</head>
-<body>
-
-  <test-fixture id="A11yFabs">
-    <template>
-      <paper-fab id="fab1" icon="add"></paper-fab>
-      <paper-fab id="fab2" icon="add" disabled></paper-fab>
-      <paper-fab id="fab3" icon="add" aria-label="custom"></paper-fab>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    var f1;
-    var f2;
-    var f3;
-
-    setup(function() {
-      var fabs = fixture('A11yFabs');
-
-      f1 = fabs[0];
-      f2 = fabs[1];
-      f3 = fabs[2];
-    });
-
-    test('aria role is a button', function() {
-      assert.strictEqual(f1.getAttribute('role'), 'button');
-    });
-
-    test('aria-disabled is set', function() {
-      assert.ok(f2.hasAttribute('aria-disabled'));
-      f2.removeAttribute('disabled');
-      assert.strictEqual(f2.getAttribute('aria-disabled'), 'false');
-    });
-
-    test('user-defined aria-label is preserved', function() {
-      assert.strictEqual(f3.getAttribute('aria-label'), 'custom');
-      f3.icon = 'arrow-forward';
-      assert.strictEqual(f3.getAttribute('aria-label'), 'custom');
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-fab/test/basic.html
deleted file mode 100644
index a0ae42d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/test/basic.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-fab basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../paper-fab.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialFab">
-    <template>
-      <div style="line-height:30px;">
-        <paper-fab id="fab1" icon="add"></paper-fab>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="SrcFab">
-    <template>
-      <paper-fab src="add.png"></paper-fab>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="icon-fab">
-    <template>
-      <paper-fab icon="favorite" label="favorite icon"></paper-fab>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="icon-src-fab">
-    <template>
-      <paper-fab src="add.png" label="add icon"></paper-fab>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="label-fab">
-    <template>
-      <paper-fab label="HTML"></paper-fab>
-    </template>
-  </test-fixture>
-
-  <script>
-    var f1;
-    var f2;
-    var f3;
-    var f4;
-    var f5;
-
-    function centerOf(element) {
-      var rect = element.getBoundingClientRect();
-      return {left: rect.left + rect.width / 2, top: rect.top + rect.height / 2};
-    }
-
-    function approxEqual(p1, p2) {
-      return Math.round(p1.left) == Math.round(p2.left) && Math.round(p1.top) == Math.round(p2.top);
-    }
-
-    function isHidden(element) {
-      var rect = element.getBoundingClientRect();
-      return (rect.width == 0 && rect.height == 0);
-    }
-
-    setup(function() {
-      f1 = fixture('TrivialFab').querySelector('#fab1');
-      f2 = fixture('SrcFab');
-      f3 = fixture('icon-fab');
-      f4 = fixture('icon-src-fab');
-      f5 = fixture('label-fab');
-    });
-
-    test('applies an icon specified by the `icon` attribute', function() {
-      assert.isFalse(!!f1.$.icon.usesSrcAttribute);
-      assert.ok(Polymer.dom(f1.$.icon.root).querySelector('svg'));
-    });
-
-    test('applies an icon specified by the `src` attribute', function() {
-      assert.isFalse(f2.$.icon._usesIconset());
-      assert.ok(f2.$.icon._img);
-    });
-
-    test('renders correctly independent of line height', function() {
-      assert.ok(approxEqual(centerOf(f1.$.icon), centerOf(f1)));
-    });
-
-    test('fab displays icon with `icon` and `label` attributes', function(done) {
-      Polymer.Base.async(function() {
-        var icon = f3.$$('iron-icon');
-        var text = f3.$$('span');
-        expect(icon).not.to.be.null;
-        assert.isFalse(isHidden(icon));
-        assert.isTrue(isHidden(text));
-        expect(icon.icon).to.be.equal(f3.icon);
-        expect(f3.getAttribute('aria-label')).to.be.equal(f3.label);
-        done();
-      });
-    });
-
-    test('fab displays icon with `src` and `label` attributes', function(done) {
-      Polymer.Base.async(function() {
-        var icon = f4.$$('iron-icon');
-        var text = f4.$$('span');
-        expect(icon).not.to.be.null;
-        assert.isFalse(isHidden(icon));
-        assert.isTrue(isHidden(text));
-        expect(icon.src).to.be.equal(f4.src);
-        expect(f4.getAttribute('aria-label')).to.be.equal(f4.label);
-        done();
-      });
-    });
-
-    test('fab displays label with `label` attribute correctly', function(done) {
-      Polymer.Base.async(function() {
-        var icon = f5.$$('iron-icon');
-        var text = f5.$$('span');
-        expect(text).not.to.be.null;
-        assert.isTrue(isHidden(icon));
-        assert.isFalse(isHidden(text));
-        expect(text.innerHTML).to.be.equal(f5.label);
-        expect(f5.getAttribute('aria-label')).to.be.equal(f5.label);
-        done();
-      });
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-fab/test/index.html b/systrace/catapult/third_party/polymer/components/paper-fab/test/index.html
deleted file mode 100644
index ca535db..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-fab/test/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-fab tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'a11y.html',
-      'basic.html?dom=shadow',
-      'a11y.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-icon-button/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/README.md b/systrace/catapult/third_party/polymer/components/paper-icon-button/README.md
deleted file mode 100644
index e724d75..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/README.md
+++ /dev/null
@@ -1,95 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-icon-button-light.html  paper-icon-button.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-icon-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-icon-button)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-icon-button)_
-
-
-##&lt;paper-icon-button&gt;
-
-Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons)
-
-`paper-icon-button` is a button with an image placed at the center. When the user touches
-the button, a ripple effect emanates from the center of the button.
-
-`paper-icon-button` includes a default icon set.  Use `icon` to specify which icon
-from the icon set to use.
-
-<!---
-```html
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-icon-button.html">
-    <link rel="import" href="../iron-icons/iron-icons.html">
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-icon-button icon="favorite"></paper-icon-button>
-<paper-icon-button icon="menu"></paper-icon-button>
-<paper-icon-button icon="star"></paper-icon-button>
-```
-
-See [`iron-iconset`](https://github.com/PolymerElements/iron-iconset) for more information about
-how to use a custom icon set.
-
-Example:
-
-```html
-<link href="path/to/iron-icons/iron-icons.html" rel="import">
-
-<paper-icon-button icon="favorite"></paper-icon-button>
-<paper-icon-button src="star.png"></paper-icon-button>
-```
-
-To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button`
-will already receive focus, you may want to prevent the anchor tag from receiving focus
-as well by setting its tabindex to -1.
-
-```html
-<a href="https://www.polymer-project.org" tabindex="-1">
-  <paper-icon-button icon="polymer"></paper-icon-button>
-</a>
-```
-
-### Styling
-
-Style the button with CSS as you would a normal DOM element. If you are using the icons
-provided by `iron-icons`, they will inherit the foreground color of the button.
-
-```html
-/* make a red "favorite" button */
-<paper-icon-button icon="favorite" style="color: red;"></paper-icon-button>
-```
-
-By default, the ripple is the same color as the foreground at 25% opacity. You may
-customize the color using the `--paper-icon-button-ink-color` custom property.
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color` |
-| `--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color` |
-| `--paper-icon-button` | Mixin for a button | `{}` |
-| `--paper-icon-button-disabled` | Mixin for a disabled button | `{}` |
-| `--paper-icon-button-hover` | Mixin for button on hover | `{}` |
-
-
-
-<!-- No docs for <paper-icon-button-light> found. -->
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/bower.json b/systrace/catapult/third_party/polymer/components/paper-icon-button/bower.json
deleted file mode 100644
index ca1f27d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/bower.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "paper-icon-button",
-  "private": true,
-  "version": "1.1.6",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "A material design icon button",
-  "main": [
-    "paper-icon-button.html",
-    "paper-icon-button-light.html"
-  ],
-  "author": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "button",
-    "icon",
-    "control"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-icon-button.git"
-  },
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/demo/index.html
deleted file mode 100644
index 98d496f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/demo/index.html
+++ /dev/null
@@ -1,103 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>paper-icon-button demo</title>
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../iron-icons/iron-icons.html">
-    <link rel="import" href="../../paper-styles/color.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../paper-icon-button.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      paper-icon-button {
-        margin-left: 10px;
-        margin-right: 10px;
-      }
-    </style>
-  </head>
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>Buttons can use iron-icons or external images, and can be disabled</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <paper-icon-button icon="favorite" title="heart"></paper-icon-button>
-          <paper-icon-button src="https://assets-cdn.github.com/images/modules/logos_page/Octocat.png" alt="octocat" title="octocat"></paper-icon-button>
-          <paper-icon-button disabled icon="reply" title="reply"></paper-icon-button>
-        </template>
-      </demo-snippet>
-
-      <h3>Buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <paper-icon-button noink icon="find-in-page" title="find"></paper-icon-button>
-        </template>
-      </demo-snippet>
-
-      <h3>Buttons can be styled using regular CSS and custom properties</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            paper-icon-button.pink {
-              color: var(--paper-pink-500);
-              --paper-icon-button-ink-color: var(--paper-indigo-500);
-            }
-            paper-icon-button.pink:hover {
-              background-color: var(--paper-pink-500);
-              color: white;
-            }
-            paper-icon-button.blue {
-              --paper-icon-button-ink-color: var(--paper-orange-500);
-              background-color: var(--paper-light-blue-500);
-              color: white;
-              border-radius: 3px;
-              padding: 2px;
-            }
-          </style>
-          <paper-icon-button icon="favorite" title="heart" class="pink"></paper-icon-button>
-          <paper-icon-button icon="flight-takeoff" title="take off" class="blue"></paper-icon-button>
-        </template>
-      </demo-snippet>
-
-      <h3>Buttons can be resized</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            paper-icon-button.giant {
-              width: 100px;
-              height: 100px;
-            }
-          </style>
-          <paper-icon-button icon="alarm-on" title="wake up" class="giant"></paper-icon-button>
-        </template>
-      </demo-snippet>
-
-      <h3>Buttons can be used as a link</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <a href="https://www.polymer-project.org" tabindex="-1">
-            <paper-icon-button icon="polymer"></paper-icon-button>
-          </a>
-          <style>
-            a paper-icon-button,
-            a:active paper-icon-button,
-            a:visited paper-icon-button {
-              color: #000000;
-            }
-          </style>
-        </template>
-      </demo-snippet>
-    </div>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/demo/paper-icon-button-light.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/demo/paper-icon-button-light.html
deleted file mode 100644
index 6bae8e3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/demo/paper-icon-button-light.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>paper-icon-button-light demo</title>
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../iron-icons/iron-icons.html">
-    <link rel="import" href="../../paper-styles/color.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../paper-icon-button-light.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles"></style>
-  </head>
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>paper-icon-button-light can contain iron-icons or external images and can be disabled</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            button[is=paper-icon-button-light] {
-              width: 40px;
-              height: 40px;
-              padding: 8px;
-              margin: 10px;
-            }
-
-            button[is=paper-icon-button-light] > img {
-              width: 24px;
-              height: 24px;
-            }
-          </style>
-
-          <button is="paper-icon-button-light" title="heart">
-            <iron-icon icon="favorite"></iron-icon>
-          </button>
-          <button is="paper-icon-button-light" title="octocat">
-            <img src="https://assets-cdn.github.com/images/modules/logos_page/Octocat.png" alt="octocat">
-          </button>
-          <button is="paper-icon-button-light" title="reply" disabled>
-            <iron-icon icon="reply"></iron-icon>
-          </button>
-        </template>
-      </demo-snippet>
-    </div>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/index.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/index.html
deleted file mode 100644
index 78f963c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <script src="../webcomponentsjs/webcomponents.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/paper-icon-button-light.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/paper-icon-button-light.html
deleted file mode 100644
index 11e771b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/paper-icon-button-light.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-behaviors/paper-ripple-behavior.html">
-
-<!--
-The following custom properties and mixins are also available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-icon-button-light-ripple` | Mixin applied to the paper ripple | `{}`
-
-@group Paper Elements
-@element paper-icon-button-light
-@demo demo/paper-icon-button-light.html
--->
-<dom-module id="paper-icon-button-light">
-  <template strip-whitespace>
-    <style>
-      :host {
-        vertical-align: middle;
-        color: inherit;
-        outline: none;
-        width: 24px;
-        height: 24px;
-        background: none;
-        margin: 0;
-        border: none;
-        padding: 0;
-
-        position: relative;
-        cursor: pointer;
-
-        /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
-        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-        -webkit-tap-highlight-color: transparent;
-      }
-
-      :host([disabled]) {
-        color: #9b9b9b;
-        pointer-events: none;
-        cursor: auto;
-      }
-
-      paper-ripple {
-        opacity: 0.6;
-        color: currentColor;
-        @apply(--paper-icon-button-light-ripple);
-      }
-    </style>
-    <content></content>
-  </template>
-  <script>
-    Polymer({
-      is: 'paper-icon-button-light',
-      extends: 'button',
-
-      behaviors: [
-        Polymer.PaperRippleBehavior
-      ],
-
-      listeners: {
-        'down': '_rippleDown',
-        'up': '_rippleUp',
-        'focus': '_rippleDown',
-        'blur': '_rippleUp',
-      },
-
-      _rippleDown: function() {
-        this.getRipple().uiDownAction();
-      },
-
-      _rippleUp: function() {
-        this.getRipple().uiUpAction();
-      },
-
-      /**
-       * @param {...*} var_args
-       */
-      ensureRipple: function(var_args) {
-        var lastRipple = this._ripple;
-        Polymer.PaperRippleBehavior.ensureRipple.apply(this, arguments);
-        if (this._ripple && this._ripple !== lastRipple) {
-          this._ripple.center = true;
-          this._ripple.classList.add('circle');
-        }
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/paper-icon-button.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/paper-icon-button.html
deleted file mode 100644
index 19f2574..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/paper-icon-button.html
+++ /dev/null
@@ -1,176 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../paper-behaviors/paper-inky-focus-behavior.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<!--
-Material design: [Icon toggles](https://www.google.com/design/spec/components/buttons.html#buttons-toggle-buttons)
-
-`paper-icon-button` is a button with an image placed at the center. When the user touches
-the button, a ripple effect emanates from the center of the button.
-
-`paper-icon-button` includes a default icon set.  Use `icon` to specify which icon
-from the icon set to use.
-
-    <paper-icon-button icon="menu"></paper-icon-button>
-
-See [`iron-iconset`](iron-iconset) for more information about
-how to use a custom icon set.
-
-Example:
-
-    <link href="path/to/iron-icons/iron-icons.html" rel="import">
-
-    <paper-icon-button icon="favorite"></paper-icon-button>
-    <paper-icon-button src="star.png"></paper-icon-button>
-
-To use `paper-icon-button` as a link, wrap it in an anchor tag. Since `paper-icon-button`
-will already receive focus, you may want to prevent the anchor tag from receiving focus
-as well by setting its tabindex to -1.
-
-    <a href="https://www.polymer-project.org" tabindex="-1">
-      <paper-icon-button icon="polymer"></paper-icon-button>
-    </a>
-
-### Styling
-
-Style the button with CSS as you would a normal DOM element. If you are using the icons
-provided by `iron-icons`, they will inherit the foreground color of the button.
-
-    /* make a red "favorite" button */
-    <paper-icon-button icon="favorite" style="color: red;"></paper-icon-button>
-
-By default, the ripple is the same color as the foreground at 25% opacity. You may
-customize the color using the `--paper-icon-button-ink-color` custom property.
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-icon-button-disabled-text` | The color of the disabled button | `--disabled-text-color`
-`--paper-icon-button-ink-color` | Selected/focus ripple color | `--primary-text-color`
-`--paper-icon-button` | Mixin for a button | `{}`
-`--paper-icon-button-disabled` | Mixin for a disabled button | `{}`
-`--paper-icon-button-hover` | Mixin for button on hover | `{}`
-
-@group Paper Elements
-@element paper-icon-button
-@demo demo/index.html
--->
-
-<dom-module id="paper-icon-button">
-  <template strip-whitespace>
-    <style>
-      :host {
-        display: inline-block;
-        position: relative;
-        padding: 8px;
-        outline: none;
-        -webkit-user-select: none;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        user-select: none;
-        cursor: pointer;
-        z-index: 0;
-        line-height: 1;
-
-        width: 40px;
-        height: 40px;
-
-        /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
-        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-        -webkit-tap-highlight-color: transparent;
-
-        /* Because of polymer/2558, this style has lower specificity than * */
-        box-sizing: border-box !important;
-
-        @apply(--paper-icon-button);
-      }
-
-      :host #ink {
-        color: var(--paper-icon-button-ink-color, --primary-text-color);
-        opacity: 0.6;
-      }
-
-      :host([disabled]) {
-        color: var(--paper-icon-button-disabled-text, --disabled-text-color);
-        pointer-events: none;
-        cursor: auto;
-
-        @apply(--paper-icon-button-disabled);
-      }
-
-      :host(:hover) {
-        @apply(--paper-icon-button-hover);
-      }
-
-      iron-icon {
-        --iron-icon-width: 100%;
-        --iron-icon-height: 100%;
-      }
-    </style>
-
-    <iron-icon id="icon" src="[[src]]" icon="[[icon]]" alt$="[[alt]]"></iron-icon>
-  </template>
-
-</dom-module>
-<script>
-Polymer({
-  is: 'paper-icon-button',
-
-  hostAttributes: {
-    role: 'button',
-    tabindex: '0'
-  },
-
-  behaviors: [
-    Polymer.PaperInkyFocusBehavior
-  ],
-
-  properties: {
-    /**
-      * The URL of an image for the icon. If the src property is specified,
-      * the icon property should not be.
-      */
-    src: {
-      type: String
-    },
-
-    /**
-      * Specifies the icon name or index in the set of icons available in
-      * the icon's icon set. If the icon property is specified,
-      * the src property should not be.
-      */
-    icon: {
-      type: String
-    },
-
-    /**
-      * Specifies the alternate text for the button, for accessibility.
-      */
-    alt: {
-      type: String,
-      observer: "_altChanged"
-    }
-  },
-
-  _altChanged: function(newValue, oldValue) {
-    var label = this.getAttribute('aria-label');
-
-    // Don't stomp over a user-set aria-label.
-    if (!label || oldValue == label) {
-      this.setAttribute('aria-label', newValue);
-    }
-  }
-});
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/test/a11y.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/test/a11y.html
deleted file mode 100644
index a56c9f4..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/test/a11y.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-icon-button a11y tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../paper-icon-button.html">
-
-</head>
-<body>
-
-  <test-fixture id="A11yIconButtons">
-    <template>
-      <paper-icon-button id="iconButton1" icon="add"></paper-icon-button>
-      <paper-icon-button id="iconButton2" icon="add" disabled></paper-icon-button>
-      <paper-icon-button id="iconButton3" icon="add" aria-label="custom"></paper-icon-button>
-      <paper-icon-button id="iconButton4" icon="add" alt="alt text"></paper-icon-button>
-      <paper-icon-button id="iconButton5" icon="add" aria-label="custom" alt="alt text" ></paper-icon-button>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    var b1;
-    var b2;
-    var b3;
-    var b4;
-    var b5;
-
-    setup(function() {
-      var iconButtons = fixture('A11yIconButtons');
-
-      b1 = iconButtons[0];
-      b2 = iconButtons[1];
-      b3 = iconButtons[2];
-      b4 = iconButtons[3];
-      b5 = iconButtons[4];
-    });
-
-    test('aria role is a button', function() {
-      assert.strictEqual(b1.getAttribute('role'), 'button');
-    });
-
-    test('aria-disabled is set', function() {
-      assert.strictEqual(b2.getAttribute('aria-disabled'), 'true');
-      b2.removeAttribute('disabled');
-      assert.strictEqual(b2.getAttribute('aria-disabled'), 'false');
-    });
-
-    test('user-defined aria-label is preserved', function() {
-      assert.strictEqual(b3.getAttribute('aria-label'), 'custom');
-      b3.icon = 'arrow-forward';
-      assert.strictEqual(b3.getAttribute('aria-label'), 'custom');
-    });
-
-    test('alt attribute is used for the aria-label', function() {
-      assert.strictEqual(b4.getAttribute('aria-label'), 'alt text');
-      b4.icon = 'arrow-forward';
-      assert.strictEqual(b4.getAttribute('aria-label'), 'alt text');
-    });
-
-    test('aria-label wins over alt attribute', function() {
-      assert.strictEqual(b5.getAttribute('aria-label'), 'custom');
-      b5.icon = 'arrow-forward';
-      b5.alt = 'other alt'
-      assert.strictEqual(b5.getAttribute('aria-label'), 'custom');
-    });
-
-    test('alt attribute can be updated', function() {
-      assert.strictEqual(b4.getAttribute('aria-label'), 'alt text');
-      b4.alt = 'alt again';
-      assert.strictEqual(b4.getAttribute('aria-label'), 'alt again');
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/test/basic.html
deleted file mode 100644
index fa3afad..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/test/basic.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-icon-button basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../paper-icon-button.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialIconButton">
-    <template>
-      <div style="line-height:30px;">
-        <paper-icon-button id="fab1" icon="add"></paper-icon-button>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="SrcIconButton">
-    <template>
-      <paper-icon-button src="add.png"></paper-icon-button>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    var b1;
-    var b2;
-
-    function centerOf(element) {
-      var rect = element.getBoundingClientRect();
-      return {left: rect.left + rect.width / 2, top: rect.top + rect.height / 2};
-    }
-
-    function approxEqual(p1, p2) {
-      return Math.abs(p1.left - p2.left) <= 2 && Math.abs(p1.top-p2.top) <= 2;
-    }
-
-    setup(function() {
-      b1 = fixture('TrivialIconButton').querySelector('#fab1');
-      b2 = fixture('SrcIconButton');
-    });
-
-    test('applies an icon specified by the `icon` attribute', function() {
-      assert.strictEqual(!!b1.$.icon.src, false);
-      assert.ok(Polymer.dom(b1.$.icon.root).querySelector('svg'));
-    });
-
-    test('applies an icon specified by the `src` attribute', function() {
-
-      assert.strictEqual(!!b2.$.icon.src, true);
-      assert.ok(b2.$.icon.src);
-    });
-
-    test('renders correctly independent of line height', function() {
-      assert.ok(approxEqual(centerOf(b1.$.icon), centerOf(b1)));
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-icon-button/test/index.html b/systrace/catapult/third_party/polymer/components/paper-icon-button/test/index.html
deleted file mode 100644
index 2069ec7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-icon-button/test/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-icon-button tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'a11y.html',
-      'basic.html?dom=shadow',
-      'a11y.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-input/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/README.md b/systrace/catapult/third_party/polymer/components/paper-input/README.md
deleted file mode 100644
index 80c6bc3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-input.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-input)
-[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-input)
-
-## &lt;paper-input&gt;
-
-Material design: [Text fields](https://www.google.com/design/spec/components/text-fields.html)
-
-`<paper-input>` is a single-line text field with Material Design styling.
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-input.html">
-    <link rel="import" href="../iron-icons/iron-icons.html">
-    <style>
-      paper-input {
-        max-width: 400px;
-        margin: auto;
-      }
-      iron-icon, div[suffix] {
-        color: hsl(0, 0%, 50%);
-        margin-right: 12px;
-      }
-    </style>
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-input always-float-label label="Floating label"></paper-input>
-<paper-input label="username">
-  <iron-icon icon="mail" prefix></iron-icon>
-  <div suffix>@email.com</div>
-</paper-input>
-```
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/all-imports.html b/systrace/catapult/third_party/polymer/components/paper-input/all-imports.html
deleted file mode 100644
index 0f45771..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/all-imports.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="paper-input.html">
-<link rel="import" href="paper-textarea.html">
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/bower.json b/systrace/catapult/third_party/polymer/components/paper-input/bower.json
deleted file mode 100644
index 84a2e99..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/bower.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "name": "paper-input",
-  "version": "1.1.24",
-  "description": "Material design text fields",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "input"
-  ],
-  "main": [
-    "paper-input.html",
-    "paper-textarea.html",
-    "paper-input-behavior.html",
-    "paper-input-container.html",
-    "paper-input-error.html",
-    "paper-input-addon-behavior.html",
-    "paper-input-char-counter.html"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-input.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-input",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.2.0",
-    "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^1.0.0",
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-form-element-behavior": "PolymerElements/iron-form-element-behavior#^1.0.0",
-    "iron-input": "PolymerElements/iron-input#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.1.4",
-    "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-input/demo/index.html
deleted file mode 100644
index f84799d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/demo/index.html
+++ /dev/null
@@ -1,155 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-input demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-icon/iron-icon.html">
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../../iron-input/iron-input.html">
-  <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../paper-input-container.html">
-  <link rel="import" href="../paper-input-error.html">
-  <link rel="import" href="../paper-input.html">
-  <link rel="import" href="../paper-textarea.html">
-  <link rel="import" href="ssn-input.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    paper-input {
-      display: block;
-    }
-
-    demo-snippet.horizontal {
-      --demo-snippet-demo: {
-        @apply(--layout-horizontal);
-        @apply(--layout-justified);
-        @apply(--layout-wrap);
-      }
-    }
-    demo-snippet.horizontal paper-input {
-      display: inline-block;
-    }
-
-    button {
-      width: 70px;
-    }
-
-    #inputForValidation {
-      display: inline-block;
-      width: calc(100% - 75px);
-    }
-
-    .vertical-section-container {
-      max-width: 600px;
-    }
-
-    paper-icon-button {
-      color: var(--paper-red-300);
-      --paper-icon-button-ink-color: var(--paper-red-a100);
-      width: 23px; /* 15px + 2*4px for padding */
-      height: 23px;
-      padding: 0px 4px;
-    }
-
-    iron-icon {
-      padding-right: 5px;
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Inputs can have different types, and be disabled</h3>
-    <demo-snippet>
-      <template>
-        <paper-input label="text input"></paper-input>
-        <paper-textarea label="autoresizing textarea input"></paper-textarea>
-        <paper-input label="password input" type="password"></paper-input>
-        <paper-input label="disabled input" disabled></paper-input>
-      </template>
-    </demo-snippet>
-
-    <h3>Inputs can have character counters</h3>
-    <demo-snippet>
-      <template>
-        <paper-input label="simple character counter" char-counter></paper-input>
-        <paper-input label="input with at most 10 characters" char-counter maxlength="10"></paper-input>
-      </template>
-    </demo-snippet>
-
-    <h3>The label can have different floating states</h3>
-    <demo-snippet>
-      <template>
-        <paper-input label="this label floats after typing"></paper-input>
-        <paper-input label="this label is always floating" always-float-label></paper-input>
-        <paper-input label="this label never floats" no-label-float></paper-input>
-        <paper-input label="this label is always floating" always-float-label placeholder="placeholder text"></paper-input>
-      </template>
-    </demo-snippet>
-
-    <h3>Inputs can validate automatically or on demand, and can have custom error messages</h3>
-    <demo-snippet>
-      <template>
-        <paper-input label="this input requires some text" required auto-validate error-message="needs some text!"></paper-input>
-        <paper-input label="this input requires letters only" auto-validate pattern="[a-zA-Z]*" error-message="letters only!"></paper-input>
-        <paper-input label="this input will only let you type letters" auto-validate allowed-pattern="[a-zA-Z]"></paper-input>
-        <paper-input id="inputForValidation" required label="this input is manually validated" pattern="[a-zA-Z]*" error-message="letters only!"></paper-input>
-        <button onclick="validate()">Validate!</button>
-      </template>
-    </demo-snippet>
-
-    <h3>Inputs can have prefixes and suffixes</h3>
-    <demo-snippet class="horizontal">
-      <template>
-        <paper-input label="total" type="number">
-          <div prefix>$</div>
-        </paper-input>
-        <paper-input label="username" id="inputWithButton">
-          <iron-icon icon="mail" prefix></iron-icon>
-          <div suffix>@email.com</div>
-          <paper-icon-button suffix onclick="clearInput()"
-              icon="clear" alt="clear" title="clear">
-          </paper-icon-button>
-        </paper-input>
-      </template>
-    </demo-snippet>
-
-    <h3>Inputs can have custom logic</h3>
-    <demo-snippet>
-      <template>
-        <paper-input-container always-float-label auto-validate attr-for-value="value">
-          <label>Social Security Number</label>
-          <ssn-input class="paper-input-input"></ssn-input>
-          <paper-input-error>SSN invalid!</paper-input-error>
-        </paper-input-container>
-      </template>
-    </demo-snippet>
-  </div>
-
-  <script>
-    function validate() {
-      document.getElementById('inputForValidation').validate();
-    }
-
-    function clearInput() {
-      document.getElementById('inputWithButton').value = '';
-    }
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/demo/ssn-input.html b/systrace/catapult/third_party/polymer/components/paper-input/demo/ssn-input.html
deleted file mode 100644
index c7ab51d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/demo/ssn-input.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-input/iron-input.html">
-<link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="ssn-validator.html">
-
-<dom-module id="ssn-input">
-  <template>
-
-    <style>
-      :host {
-        display: inline-block;
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      input[is="iron-input"] {
-        font: inherit;
-        outline: none;
-        box-shadow: none;
-        border: none;
-        width: auto;
-        text-align: center;
-      }
-
-      .container {
-        @apply(--layout-horizontal);
-      }
-    </style>
-
-    <ssn-validator></ssn-validator>
-
-    <div class="container">
-
-      <input is="iron-input" maxlength="3" bind-value="{{_ssn1}}" size="3" aria-label="First 3 digits of social security number">
-      -
-      <input is="iron-input" maxlength="2" bind-value="{{_ssn2}}" size="2" aria-label="Middle 2 digits of social security number">
-      -
-      <input is="iron-input" maxlength="4" bind-value="{{_ssn3}}" size="4" aria-label="Last 4 digits of social security number">
-
-    </div>
-
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'ssn-input',
-
-    behaviors: [
-      Polymer.IronValidatableBehavior
-    ],
-
-    properties: {
-      value: {
-        notify: true,
-        type: String
-      },
-
-      _ssn1: {
-        type: String
-      },
-
-      _ssn2: {
-        type: String
-      },
-
-      _ssn3: {
-        type: String
-      },
-
-      validator: {
-        type: String,
-        value: 'ssn-validator'
-      }
-    },
-
-    observers: [
-      '_computeValue(_ssn1,_ssn2,_ssn3)'
-    ],
-
-    _computeValue: function(ssn1, ssn2, ssn3) {
-      this.value = ssn1.trim() + '-' + ssn2.trim() + '-' + ssn3.trim();
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/demo/ssn-validator.html b/systrace/catapult/third_party/polymer/components/paper-input/demo/ssn-validator.html
deleted file mode 100644
index e45365b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/demo/ssn-validator.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
-
-<script>
-  Polymer({
-    is: 'ssn-validator',
-
-    behaviors: [
-      Polymer.IronValidatorBehavior
-    ],
-
-    validate: function(value) {
-      // this regex validates incomplete ssn's (by design)
-      return !value || value.match(/^[0-9]{0,3}-[0-9]{0,2}-[0-9]{0,4}$/);
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/hero.svg b/systrace/catapult/third_party/polymer/components/paper-input/hero.svg
deleted file mode 100755
index e72ebd3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/hero.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<rect x="49" y="53" width="2" height="18"/>

-	<path d="M188,78H37V44h151V78z M39,76h147V46H39V76z"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-input/index.html b/systrace/catapult/third_party/polymer/components/paper-input/index.html
deleted file mode 100644
index e6c9fad..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <title>paper-input</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page src="all-imports.html"></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-addon-behavior.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-input-addon-behavior.html
deleted file mode 100644
index 41081c7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-addon-behavior.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-
-  /**
-   * Use `Polymer.PaperInputAddonBehavior` to implement an add-on for `<paper-input-container>`. A
-   * add-on appears below the input, and may display information based on the input value and
-   * validity such as a character counter or an error message.
-   * @polymerBehavior
-   */
-  Polymer.PaperInputAddonBehavior = {
-
-    hostAttributes: {
-      'add-on': ''
-    },
-
-    attached: function() {
-      this.fire('addon-attached');
-    },
-
-    /**
-     * The function called by `<paper-input-container>` when the input value or validity changes.
-     * @param {{
-     *   inputElement: (Element|undefined),
-     *   value: (string|undefined),
-     *   invalid: boolean
-     * }} state -
-     *     inputElement: The input element.
-     *     value: The input value.
-     *     invalid: True if the input value is invalid.
-     */
-    update: function(state) {
-    }
-
-  };
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-behavior.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-input-behavior.html
deleted file mode 100644
index 33e2a2d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-behavior.html
+++ /dev/null
@@ -1,569 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-
-<script>
-
-  // Generate unique, monotonically increasing IDs for labels (needed by
-  // aria-labelledby) and add-ons.
-  Polymer.PaperInputHelper = {};
-  Polymer.PaperInputHelper.NextLabelID = 1;
-  Polymer.PaperInputHelper.NextAddonID = 1;
-
-  /**
-   * Use `Polymer.PaperInputBehavior` to implement inputs with `<paper-input-container>`. This
-   * behavior is implemented by `<paper-input>`. It exposes a number of properties from
-   * `<paper-input-container>` and `<input is="iron-input">` and they should be bound in your
-   * template.
-   *
-   * The input element can be accessed by the `inputElement` property if you need to access
-   * properties or methods that are not exposed.
-   * @polymerBehavior Polymer.PaperInputBehavior
-   */
-  Polymer.PaperInputBehaviorImpl = {
-
-    properties: {
-      /**
-       * Fired when the input changes due to user interaction.
-       *
-       * @event change
-       */
-
-      /**
-       * The label for this input. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * `<label>`'s content and `hidden` property, e.g.
-       * `<label hidden$="[[!label]]">[[label]]</label>` in your `template`
-       */
-      label: {
-        type: String
-      },
-
-      /**
-       * The value for this input. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<input is="iron-input">`'s `bindValue`
-       * property, or the value property of your input that is `notify:true`.
-       */
-      value: {
-        notify: true,
-        type: String
-      },
-
-      /**
-       * Set to true to disable this input. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * both the `<paper-input-container>`'s and the input's `disabled` property.
-       */
-      disabled: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Returns true if the value is invalid. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to both the
-       * `<paper-input-container>`'s and the input's `invalid` property.
-       *
-       * If `autoValidate` is true, the `invalid` attribute is managed automatically,
-       * which can clobber attempts to manage it manually.
-       */
-      invalid: {
-        type: Boolean,
-        value: false,
-        notify: true
-      },
-
-      /**
-       * Set to true to prevent the user from entering invalid input. If you're
-       * using PaperInputBehavior to  implement your own paper-input-like element,
-       * bind this to `<input is="iron-input">`'s `preventInvalidInput` property.
-       */
-      preventInvalidInput: {
-        type: Boolean
-      },
-
-      /**
-       * Set this to specify the pattern allowed by `preventInvalidInput`. If
-       * you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `allowedPattern`
-       * property.
-       */
-      allowedPattern: {
-        type: String
-      },
-
-      /**
-       * The type of the input. The supported types are `text`, `number` and `password`.
-       * If you're using PaperInputBehavior to implement your own paper-input-like element,
-       * bind this to the `<input is="iron-input">`'s `type` property.
-       */
-      type: {
-        type: String
-      },
-
-      /**
-       * The datalist of the input (if any). This should match the id of an existing `<datalist>`.
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `list` property.
-       */
-      list: {
-        type: String
-      },
-
-      /**
-       * A pattern to validate the `input` with. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<input is="iron-input">`'s `pattern` property.
-       */
-      pattern: {
-        type: String
-      },
-
-      /**
-       * Set to true to mark the input as required. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<input is="iron-input">`'s `required` property.
-       */
-      required: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * The error message to display when the input is invalid. If you're using
-       * PaperInputBehavior to implement your own paper-input-like element,
-       * bind this to the `<paper-input-error>`'s content, if using.
-       */
-      errorMessage: {
-        type: String
-      },
-
-      /**
-       * Set to true to show a character counter.
-       */
-      charCounter: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to disable the floating label. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<paper-input-container>`'s `noLabelFloat` property.
-       */
-      noLabelFloat: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to always float the label. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<paper-input-container>`'s `alwaysFloatLabel` property.
-       */
-      alwaysFloatLabel: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to auto-validate the input value. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<paper-input-container>`'s `autoValidate` property.
-       */
-      autoValidate: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Name of the validator to use. If you're using PaperInputBehavior to
-       * implement your own paper-input-like element, bind this to
-       * the `<input is="iron-input">`'s `validator` property.
-       */
-      validator: {
-        type: String
-      },
-
-      // HTMLInputElement attributes for binding if needed
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `autocomplete` property.
-       */
-      autocomplete: {
-        type: String,
-        value: 'off'
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `autofocus` property.
-       */
-      autofocus: {
-        type: Boolean,
-        observer: '_autofocusChanged'
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `inputmode` property.
-       */
-      inputmode: {
-        type: String
-      },
-
-      /**
-       * The minimum length of the input value.
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `minlength` property.
-       */
-      minlength: {
-        type: Number
-      },
-
-      /**
-       * The maximum length of the input value.
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `maxlength` property.
-       */
-      maxlength: {
-        type: Number
-      },
-
-      /**
-       * The minimum (numeric or date-time) input value.
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `min` property.
-       */
-      min: {
-        type: String
-      },
-
-      /**
-       * The maximum (numeric or date-time) input value.
-       * Can be a String (e.g. `"2000-01-01"`) or a Number (e.g. `2`).
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `max` property.
-       */
-      max: {
-        type: String
-      },
-
-      /**
-       * Limits the numeric or date-time increments.
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `step` property.
-       */
-      step: {
-        type: String
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `name` property.
-       */
-      name: {
-        type: String
-      },
-
-      /**
-       * A placeholder string in addition to the label. If this is set, the label will always float.
-       */
-      placeholder: {
-        type: String,
-        // need to set a default so _computeAlwaysFloatLabel is run
-        value: ''
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `readonly` property.
-       */
-      readonly: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `size` property.
-       */
-      size: {
-        type: Number
-      },
-
-      // Nonstandard attributes for binding if needed
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `autocapitalize` property.
-       */
-      autocapitalize: {
-        type: String,
-        value: 'none'
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `autocorrect` property.
-       */
-      autocorrect: {
-        type: String,
-        value: 'off'
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `autosave` property,
-       * used with type=search.
-       */
-      autosave: {
-        type: String
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `results` property,
-       * used with type=search.
-       */
-      results: {
-        type: Number
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the `<input is="iron-input">`'s `accept` property,
-       * used with type=file.
-       */
-      accept: {
-        type: String
-      },
-
-      /**
-       * If you're using PaperInputBehavior to implement your own paper-input-like
-       * element, bind this to the`<input is="iron-input">`'s `multiple` property,
-       * used with type=file.
-       */
-      multiple: {
-        type: Boolean
-      },
-
-      _ariaDescribedBy: {
-        type: String,
-        value: ''
-      },
-
-      _ariaLabelledBy: {
-        type: String,
-        value: ''
-      }
-
-    },
-
-    listeners: {
-      'addon-attached': '_onAddonAttached',
-    },
-
-    keyBindings: {
-      'shift+tab:keydown': '_onShiftTabDown'
-    },
-
-    hostAttributes: {
-      tabindex: 0
-    },
-
-    /**
-     * Returns a reference to the input element.
-     */
-    get inputElement() {
-      return this.$.input;
-    },
-
-    /**
-     * Returns a reference to the focusable element.
-     */
-    get _focusableElement() {
-      return this.inputElement;
-    },
-
-    registered: function() {
-      // These types have some default placeholder text; overlapping
-      // the label on top of it looks terrible. Auto-float the label in this case.
-      this._typesThatHaveText = ["date", "datetime", "datetime-local", "month",
-          "time", "week", "file"];
-    },
-
-    attached: function() {
-      this._updateAriaLabelledBy();
-
-      if (this.inputElement &&
-          this._typesThatHaveText.indexOf(this.inputElement.type) !== -1) {
-        this.alwaysFloatLabel = true;
-      }
-    },
-
-    _appendStringWithSpace: function(str, more) {
-      if (str) {
-        str = str + ' ' + more;
-      } else {
-        str = more;
-      }
-      return str;
-    },
-
-    _onAddonAttached: function(event) {
-      var target = event.path ? event.path[0] : event.target;
-      if (target.id) {
-        this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, target.id);
-      } else {
-        var id = 'paper-input-add-on-' + Polymer.PaperInputHelper.NextAddonID++;
-        target.id = id;
-        this._ariaDescribedBy = this._appendStringWithSpace(this._ariaDescribedBy, id);
-      }
-    },
-
-    /**
-     * Validates the input element and sets an error style if needed.
-     *
-     * @return {boolean}
-     */
-    validate: function() {
-      return this.inputElement.validate();
-    },
-
-    /**
-     * Forward focus to inputElement. Overriden from IronControlState.
-     */
-    _focusBlurHandler: function(event) {
-      Polymer.IronControlState._focusBlurHandler.call(this, event);
-
-      // Forward the focus to the nested input.
-      if (this.focused && !this._shiftTabPressed)
-        this._focusableElement.focus();
-    },
-
-    /**
-     * Handler that is called when a shift+tab keypress is detected by the menu.
-     *
-     * @param {CustomEvent} event A key combination event.
-     */
-    _onShiftTabDown: function(event) {
-      var oldTabIndex = this.getAttribute('tabindex');
-      this._shiftTabPressed = true;
-      this.setAttribute('tabindex', '-1');
-      this.async(function() {
-        this.setAttribute('tabindex', oldTabIndex);
-        this._shiftTabPressed = false;
-      }, 1);
-    },
-
-    /**
-     * If `autoValidate` is true, then validates the element.
-     */
-    _handleAutoValidate: function() {
-      if (this.autoValidate)
-        this.validate();
-    },
-
-    /**
-     * Restores the cursor to its original position after updating the value.
-     * @param {string} newValue The value that should be saved.
-     */
-    updateValueAndPreserveCaret: function(newValue) {
-      // Not all elements might have selection, and even if they have the
-      // right properties, accessing them might throw an exception (like for
-      // <input type=number>)
-      try {
-        var start = this.inputElement.selectionStart;
-        this.value = newValue;
-
-        // The cursor automatically jumps to the end after re-setting the value,
-        // so restore it to its original position.
-        this.inputElement.selectionStart = start;
-        this.inputElement.selectionEnd = start;
-      } catch (e) {
-        // Just set the value and give up on the caret.
-        this.value = newValue;
-      }
-    },
-
-    _computeAlwaysFloatLabel: function(alwaysFloatLabel, placeholder) {
-      return placeholder || alwaysFloatLabel;
-    },
-
-    _updateAriaLabelledBy: function() {
-      var label = Polymer.dom(this.root).querySelector('label');
-      if (!label) {
-        this._ariaLabelledBy = '';
-        return;
-      }
-      var labelledBy;
-      if (label.id) {
-        labelledBy = label.id;
-      } else {
-        labelledBy = 'paper-input-label-' + Polymer.PaperInputHelper.NextLabelID++;
-        label.id = labelledBy;
-      }
-      this._ariaLabelledBy = labelledBy;
-    },
-
-    _onChange:function(event) {
-      // In the Shadow DOM, the `change` event is not leaked into the
-      // ancestor tree, so we must do this manually.
-      // See https://w3c.github.io/webcomponents/spec/shadow/#events-that-are-not-leaked-into-ancestor-trees.
-      if (this.shadowRoot) {
-        this.fire(event.type, {sourceEvent: event}, {
-          node: this,
-          bubbles: event.bubbles,
-          cancelable: event.cancelable
-        });
-      }
-    },
-
-    _autofocusChanged: function() {
-      // Firefox doesn't respect the autofocus attribute if it's applied after
-      // the page is loaded (Chrome/WebKit do respect it), preventing an
-      // autofocus attribute specified in markup from taking effect when the
-      // element is upgraded. As a workaround, if the autofocus property is set,
-      // and the focus hasn't already been moved elsewhere, we take focus.
-      if (this.autofocus && this._focusableElement) {
-
-        // In IE 11, the default document.activeElement can be the page's
-        // outermost html element, but there are also cases (under the
-        // polyfill?) in which the activeElement is not a real HTMLElement, but
-        // just a plain object. We identify the latter case as having no valid
-        // activeElement.
-        var activeElement = document.activeElement;
-        var isActiveElementValid = activeElement instanceof HTMLElement;
-
-        // Has some other element has already taken the focus?
-        var isSomeElementActive = isActiveElementValid &&
-            activeElement !== document.body &&
-            activeElement !== document.documentElement; /* IE 11 */
-        if (!isSomeElementActive) {
-          // No specific element has taken the focus yet, so we can take it.
-          this._focusableElement.focus();
-        }
-      }
-    }
-  };
-
-  /** @polymerBehavior */
-  Polymer.PaperInputBehavior = [
-    Polymer.IronControlState,
-    Polymer.IronA11yKeysBehavior,
-    Polymer.PaperInputBehaviorImpl
-  ];
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-char-counter.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-input-char-counter.html
deleted file mode 100644
index 1a09a06..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-char-counter.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-styles/typography.html">
-<link rel="import" href="paper-input-addon-behavior.html">
-
-<!--
-`<paper-input-char-counter>` is a character counter for use with `<paper-input-container>`. It
-shows the number of characters entered in the input and the max length if it is specified.
-
-    <paper-input-container>
-      <input is="iron-input" maxlength="20">
-      <paper-input-char-counter></paper-input-char-counter>
-    </paper-input-container>
-
-### Styling
-
-The following mixin is available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-input-char-counter` | Mixin applied to the element | `{}`
--->
-
-<dom-module id="paper-input-char-counter">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        float: right;
-
-        @apply(--paper-font-caption);
-        @apply(--paper-input-char-counter);
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      :host-context([dir="rtl"]) {
-        float: left;
-      }
-    </style>
-
-    <span>[[_charCounterStr]]</span>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-input-char-counter',
-
-    behaviors: [
-      Polymer.PaperInputAddonBehavior
-    ],
-
-    properties: {
-      _charCounterStr: {
-        type: String,
-        value: '0'
-      }
-    },
-
-    /**
-     * This overrides the update function in PaperInputAddonBehavior.
-     * @param {{
-     *   inputElement: (Element|undefined),
-     *   value: (string|undefined),
-     *   invalid: boolean
-     * }} state -
-     *     inputElement: The input element.
-     *     value: The input value.
-     *     invalid: True if the input value is invalid.
-     */
-    update: function(state) {
-      if (!state.inputElement) {
-        return;
-      }
-
-      state.value = state.value || '';
-
-      var counter = state.value.toString().length.toString();
-
-      if (state.inputElement.hasAttribute('maxlength')) {
-        counter += '/' + state.inputElement.getAttribute('maxlength');
-      }
-
-      this._charCounterStr = counter;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-container.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-input-container.html
deleted file mode 100644
index 2ef06ef..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-container.html
+++ /dev/null
@@ -1,653 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-styles/typography.html">
-
-<!--
-`<paper-input-container>` is a container for a `<label>`, an `<input is="iron-input">` or
-`<textarea>` and optional add-on elements such as an error message or character
-counter, used to implement Material Design text fields.
-
-For example:
-
-    <paper-input-container>
-      <label>Your name</label>
-      <input is="iron-input">
-    </paper-input-container>
-
-Do not wrap `<paper-input-container>` around elements that already include it, such as `<paper-input>`.
-Doing so may cause events to bounce infintely between the container and its contained element.
-
-### Listening for input changes
-
-By default, it listens for changes on the `bind-value` attribute on its children nodes and perform
-tasks such as auto-validating and label styling when the `bind-value` changes. You can configure
-the attribute it listens to with the `attr-for-value` attribute.
-
-### Using a custom input element
-
-You can use a custom input element in a `<paper-input-container>`, for example to implement a
-compound input field like a social security number input. The custom input element should have the
-`paper-input-input` class, have a `notify:true` value property and optionally implements
-`Polymer.IronValidatableBehavior` if it is validatable.
-
-    <paper-input-container attr-for-value="ssn-value">
-      <label>Social security number</label>
-      <ssn-input class="paper-input-input"></ssn-input>
-    </paper-input-container>
-
-
-If you're using a `<paper-input-container>` imperatively, it's important to make sure
-that you attach its children (the `iron-input` and the optional `label`) before you
-attach the `<paper-input-container>` itself, so that it can be set up correctly.
-
-### Validation
-
-If the `auto-validate` attribute is set, the input container will validate the input and update
-the container styling when the input value changes.
-
-### Add-ons
-
-Add-ons are child elements of a `<paper-input-container>` with the `add-on` attribute and
-implements the `Polymer.PaperInputAddonBehavior` behavior. They are notified when the input value
-or validity changes, and may implement functionality such as error messages or character counters.
-They appear at the bottom of the input.
-
-### Prefixes and suffixes
-These are child elements of a `<paper-input-container>` with the `prefix`
-or `suffix` attribute, and are displayed inline with the input, before or after.
-
-    <paper-input-container>
-      <div prefix>$</div>
-      <label>Total</label>
-      <input is="iron-input">
-      <paper-icon-button suffix icon="clear"></paper-icon-button>
-    </paper-input-container>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-input-container-color` | Label and underline color when the input is not focused | `--secondary-text-color`
-`--paper-input-container-focus-color` | Label and underline color when the input is focused | `--primary-color`
-`--paper-input-container-invalid-color` | Label and underline color when the input is is invalid | `--error-color`
-`--paper-input-container-input-color` | Input foreground color | `--primary-text-color`
-`--paper-input-container` | Mixin applied to the container | `{}`
-`--paper-input-container-disabled` | Mixin applied to the container when it's disabled | `{}`
-`--paper-input-container-label` | Mixin applied to the label | `{}`
-`--paper-input-container-label-focus` | Mixin applied to the label when the input is focused | `{}`
-`--paper-input-container-label-floating` | Mixin applied to the label when floating | `{}`
-`--paper-input-container-input` | Mixin applied to the input | `{}`
-`--paper-input-container-input-focus` | Mixin applied to the input when focused | `{}`
-`--paper-input-container-input-invalid` | Mixin applied to the input when invalid | `{}`
-`--paper-input-container-input-webkit-spinner` | Mixin applied to the webkit spinner | `{}`
-`--paper-input-container-input-webkit-clear` | Mixin applied to the webkit clear button | `{}`
-`--paper-input-container-ms-clear` | Mixin applied to the Internet Explorer clear button | `{}`
-`--paper-input-container-underline` | Mixin applied to the underline | `{}`
-`--paper-input-container-underline-focus` | Mixin applied to the underline when the input is focused | `{}`
-`--paper-input-container-underline-disabled` | Mixin applied to the underline when the input is disabled | `{}`
-`--paper-input-prefix` | Mixin applied to the input prefix | `{}`
-`--paper-input-suffix` | Mixin applied to the input suffix | `{}`
-
-This element is `display:block` by default, but you can set the `inline` attribute to make it
-`display:inline-block`.
--->
-
-<dom-module id="paper-input-container">
-  <template>
-    <style>
-      :host {
-        display: block;
-        padding: 8px 0;
-
-        @apply(--paper-input-container);
-      }
-
-      :host([inline]) {
-        display: inline-block;
-      }
-
-      :host([disabled]) {
-        pointer-events: none;
-        opacity: 0.33;
-
-        @apply(--paper-input-container-disabled);
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      .floated-label-placeholder {
-        @apply(--paper-font-caption);
-      }
-
-      .underline {
-        height: 2px;
-        position: relative;
-      }
-
-      .focused-line {
-        @apply(--layout-fit);
-
-        border-bottom: 2px solid var(--paper-input-container-focus-color, --primary-color);
-
-        -webkit-transform-origin: center center;
-        transform-origin: center center;
-        -webkit-transform: scale3d(0,1,1);
-        transform: scale3d(0,1,1);
-
-        @apply(--paper-input-container-underline-focus);
-      }
-
-      .underline.is-highlighted .focused-line {
-        -webkit-transform: none;
-        transform: none;
-        -webkit-transition: -webkit-transform 0.25s;
-        transition: transform 0.25s;
-
-        @apply(--paper-transition-easing);
-      }
-
-      .underline.is-invalid .focused-line {
-        border-color: var(--paper-input-container-invalid-color, --error-color);
-        -webkit-transform: none;
-        transform: none;
-        -webkit-transition: -webkit-transform 0.25s;
-        transition: transform 0.25s;
-
-        @apply(--paper-transition-easing);
-      }
-
-      .unfocused-line {
-        @apply(--layout-fit);
-
-        border-bottom: 1px solid var(--paper-input-container-color, --secondary-text-color);
-
-        @apply(--paper-input-container-underline);
-      }
-
-      :host([disabled]) .unfocused-line {
-        border-bottom: 1px dashed;
-        border-color: var(--paper-input-container-color, --secondary-text-color);
-
-        @apply(--paper-input-container-underline-disabled);
-      }
-
-      .label-and-input-container {
-        @apply(--layout-flex-auto);
-        @apply(--layout-relative);
-
-        width: 100%;
-        max-width: 100%;
-      }
-
-      .input-content {
-        @apply(--layout-horizontal);
-        @apply(--layout-center);
-
-        position: relative;
-      }
-
-      .input-content ::content label,
-      .input-content ::content .paper-input-label {
-        position: absolute;
-        top: 0;
-        right: 0;
-        left: 0;
-        width: 100%;
-        font: inherit;
-        color: var(--paper-input-container-color, --secondary-text-color);
-        -webkit-transition: -webkit-transform 0.25s, width 0.25s;
-        transition: transform 0.25s, width 0.25s;
-        -webkit-transform-origin: left top;
-        transform-origin: left top;
-
-        @apply(--paper-font-common-nowrap);
-        @apply(--paper-font-subhead);
-        @apply(--paper-input-container-label);
-        @apply(--paper-transition-easing);
-      }
-
-      .input-content.label-is-floating ::content label,
-      .input-content.label-is-floating ::content .paper-input-label {
-        -webkit-transform: translateY(-75%) scale(0.75);
-        transform: translateY(-75%) scale(0.75);
-
-        /* Since we scale to 75/100 of the size, we actually have 100/75 of the
-        original space now available */
-        width: 133%;
-
-        @apply(--paper-input-container-label-floating);
-      }
-
-      :host-context([dir="rtl"]) .input-content.label-is-floating ::content label,
-      :host-context([dir="rtl"]) .input-content.label-is-floating ::content .paper-input-label {
-        /* TODO(noms): Figure out why leaving the width at 133% before the animation
-         * actually makes
-         * it wider on the right side, not left side, as you would expect in RTL */
-        width: 100%;
-        -webkit-transform-origin: right top;
-        transform-origin: right top;
-      }
-
-      .input-content.label-is-highlighted ::content label,
-      .input-content.label-is-highlighted ::content .paper-input-label {
-        color: var(--paper-input-container-focus-color, --primary-color);
-
-        @apply(--paper-input-container-label-focus);
-      }
-
-      .input-content.is-invalid ::content label,
-      .input-content.is-invalid ::content .paper-input-label {
-        color: var(--paper-input-container-invalid-color, --error-color);
-      }
-
-      .input-content.label-is-hidden ::content label,
-      .input-content.label-is-hidden ::content .paper-input-label {
-        visibility: hidden;
-      }
-
-      .input-content ::content input,
-      .input-content ::content textarea,
-      .input-content ::content iron-autogrow-textarea,
-      .input-content ::content .paper-input-input {
-        position: relative; /* to make a stacking context */
-        outline: none;
-        box-shadow: none;
-        padding: 0;
-        width: 100%;
-        max-width: 100%;
-        background: transparent;
-        border: none;
-        color: var(--paper-input-container-input-color, --primary-text-color);
-        -webkit-appearance: none;
-        text-align: inherit;
-        vertical-align: bottom;
-
-        @apply(--paper-font-subhead);
-        @apply(--paper-input-container-input);
-      }
-
-      .input-content.focused ::content input,
-      .input-content.focused ::content textarea,
-      .input-content.focused ::content iron-autogrow-textarea,
-      .input-content.focused ::content .paper-input-input {
-        @apply(--paper-input-container-input-focus);
-      }
-
-      .input-content.is-invalid ::content input,
-      .input-content.is-invalid ::content textarea,
-      .input-content.is-invalid ::content iron-autogrow-textarea,
-      .input-content.is-invalid ::content .paper-input-input {
-        @apply(--paper-input-container-input-invalid);
-      }
-
-      .input-content ::content input::-webkit-outer-spin-button,
-      .input-content ::content input::-webkit-inner-spin-button {
-        @apply(--paper-input-container-input-webkit-spinner);
-      }
-
-      ::content [prefix] {
-        @apply(--paper-font-subhead);
-
-        @apply(--paper-input-prefix);
-        @apply(--layout-flex-none);
-      }
-
-      ::content [suffix] {
-        @apply(--paper-font-subhead);
-
-        @apply(--paper-input-suffix);
-        @apply(--layout-flex-none);
-      }
-
-      /* Firefox sets a min-width on the input, which can cause layout issues */
-      .input-content ::content input {
-        min-width: 0;
-      }
-
-      .input-content ::content textarea {
-        resize: none;
-      }
-
-      .add-on-content {
-        position: relative;
-      }
-
-      .add-on-content.is-invalid ::content * {
-        color: var(--paper-input-container-invalid-color, --error-color);
-      }
-
-      .add-on-content.is-highlighted ::content * {
-        color: var(--paper-input-container-focus-color, --primary-color);
-      }
-    </style>
-
-    <template is="dom-if" if="[[!noLabelFloat]]">
-      <div class="floated-label-placeholder" aria-hidden="true">&nbsp;</div>
-    </template>
-
-    <div class$="[[_computeInputContentClass(noLabelFloat,alwaysFloatLabel,focused,invalid,_inputHasContent)]]">
-      <content select="[prefix]" id="prefix"></content>
-
-      <div class="label-and-input-container" id="labelAndInputContainer">
-        <content select=":not([add-on]):not([prefix]):not([suffix])"></content>
-      </div>
-
-      <content select="[suffix]"></content>
-    </div>
-
-    <div class$="[[_computeUnderlineClass(focused,invalid)]]">
-      <div class="unfocused-line"></div>
-      <div class="focused-line"></div>
-    </div>
-
-    <div class$="[[_computeAddOnContentClass(focused,invalid)]]">
-      <content id="addOnContent" select="[add-on]"></content>
-    </div>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-input-container',
-
-    properties: {
-      /**
-       * Set to true to disable the floating label. The label disappears when the input value is
-       * not null.
-       */
-      noLabelFloat: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * Set to true to always float the floating label.
-       */
-      alwaysFloatLabel: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * The attribute to listen for value changes on.
-       */
-      attrForValue: {
-        type: String,
-        value: 'bind-value'
-      },
-
-      /**
-       * Set to true to auto-validate the input value when it changes.
-       */
-      autoValidate: {
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * True if the input is invalid. This property is set automatically when the input value
-       * changes if auto-validating, or when the `iron-input-validate` event is heard from a child.
-       */
-      invalid: {
-        observer: '_invalidChanged',
-        type: Boolean,
-        value: false
-      },
-
-      /**
-       * True if the input has focus.
-       */
-      focused: {
-        readOnly: true,
-        type: Boolean,
-        value: false,
-        notify: true
-      },
-
-      _addons: {
-        type: Array
-        // do not set a default value here intentionally - it will be initialized lazily when a
-        // distributed child is attached, which may occur before configuration for this element
-        // in polyfill.
-      },
-
-      _inputHasContent: {
-        type: Boolean,
-        value: false
-      },
-
-      _inputSelector: {
-        type: String,
-        value: 'input,textarea,.paper-input-input'
-      },
-
-      _boundOnFocus: {
-        type: Function,
-        value: function() {
-          return this._onFocus.bind(this);
-        }
-      },
-
-      _boundOnBlur: {
-        type: Function,
-        value: function() {
-          return this._onBlur.bind(this);
-        }
-      },
-
-      _boundOnInput: {
-        type: Function,
-        value: function() {
-          return this._onInput.bind(this);
-        }
-      },
-
-      _boundValueChanged: {
-        type: Function,
-        value: function() {
-          return this._onValueChanged.bind(this);
-        }
-      }
-    },
-
-    listeners: {
-      'addon-attached': '_onAddonAttached',
-      'iron-input-validate': '_onIronInputValidate'
-    },
-
-    get _valueChangedEvent() {
-      return this.attrForValue + '-changed';
-    },
-
-    get _propertyForValue() {
-      return Polymer.CaseMap.dashToCamelCase(this.attrForValue);
-    },
-
-    get _inputElement() {
-      return Polymer.dom(this).querySelector(this._inputSelector);
-    },
-
-    get _inputElementValue() {
-      return this._inputElement[this._propertyForValue] || this._inputElement.value;
-    },
-
-    ready: function() {
-      if (!this._addons) {
-        this._addons = [];
-      }
-      this.addEventListener('focus', this._boundOnFocus, true);
-      this.addEventListener('blur', this._boundOnBlur, true);
-    },
-
-    attached: function() {
-      if (this.attrForValue) {
-        this._inputElement.addEventListener(this._valueChangedEvent, this._boundValueChanged);
-      } else {
-        this.addEventListener('input', this._onInput);
-      }
-
-      // Only validate when attached if the input already has a value.
-      if (this._inputElementValue != '') {
-        this._handleValueAndAutoValidate(this._inputElement);
-      } else {
-        this._handleValue(this._inputElement);
-      }
-    },
-
-    _onAddonAttached: function(event) {
-      if (!this._addons) {
-        this._addons = [];
-      }
-      var target = event.target;
-      if (this._addons.indexOf(target) === -1) {
-        this._addons.push(target);
-        if (this.isAttached) {
-          this._handleValue(this._inputElement);
-        }
-      }
-    },
-
-    _onFocus: function() {
-      this._setFocused(true);
-    },
-
-    _onBlur: function() {
-      this._setFocused(false);
-      this._handleValueAndAutoValidate(this._inputElement);
-    },
-
-    _onInput: function(event) {
-      this._handleValueAndAutoValidate(event.target);
-    },
-
-    _onValueChanged: function(event) {
-      this._handleValueAndAutoValidate(event.target);
-    },
-
-    _handleValue: function(inputElement) {
-      var value = this._inputElementValue;
-
-      // type="number" hack needed because this.value is empty until it's valid
-      if (value || value === 0 || (inputElement.type === 'number' && !inputElement.checkValidity())) {
-        this._inputHasContent = true;
-      } else {
-        this._inputHasContent = false;
-      }
-
-      this.updateAddons({
-        inputElement: inputElement,
-        value: value,
-        invalid: this.invalid
-      });
-    },
-
-    _handleValueAndAutoValidate: function(inputElement) {
-      if (this.autoValidate) {
-        var valid;
-        if (inputElement.validate) {
-          valid = inputElement.validate(this._inputElementValue);
-        } else {
-          valid = inputElement.checkValidity();
-        }
-        this.invalid = !valid;
-      }
-
-      // Call this last to notify the add-ons.
-      this._handleValue(inputElement);
-    },
-
-    _onIronInputValidate: function(event) {
-      this.invalid = this._inputElement.invalid;
-    },
-
-    _invalidChanged: function() {
-      if (this._addons) {
-        this.updateAddons({invalid: this.invalid});
-      }
-    },
-
-    /**
-     * Call this to update the state of add-ons.
-     * @param {Object} state Add-on state.
-     */
-    updateAddons: function(state) {
-      for (var addon, index = 0; addon = this._addons[index]; index++) {
-        addon.update(state);
-      }
-    },
-
-    _computeInputContentClass: function(noLabelFloat, alwaysFloatLabel, focused, invalid, _inputHasContent) {
-      var cls = 'input-content';
-      if (!noLabelFloat) {
-        var label = this.querySelector('label');
-
-        if (alwaysFloatLabel || _inputHasContent) {
-          cls += ' label-is-floating';
-          // If the label is floating, ignore any offsets that may have been
-          // applied from a prefix element.
-          this.$.labelAndInputContainer.style.position = 'static';
-
-          if (invalid) {
-            cls += ' is-invalid';
-          } else if (focused) {
-            cls += " label-is-highlighted";
-          }
-        } else {
-          // When the label is not floating, it should overlap the input element.
-          if (label) {
-            this.$.labelAndInputContainer.style.position = 'relative';
-          }
-          if (invalid) {
-            cls += ' is-invalid';
-          }
-        }
-      } else {
-        if (_inputHasContent) {
-          cls += ' label-is-hidden';
-        }
-        if (invalid) {
-          cls += ' is-invalid';
-        }
-      }
-      if (focused) {
-        cls += ' focused';
-      }
-      return cls;
-    },
-
-    _computeUnderlineClass: function(focused, invalid) {
-      var cls = 'underline';
-      if (invalid) {
-        cls += ' is-invalid';
-      } else if (focused) {
-        cls += ' is-highlighted'
-      }
-      return cls;
-    },
-
-    _computeAddOnContentClass: function(focused, invalid) {
-      var cls = 'add-on-content';
-      if (invalid) {
-        cls += ' is-invalid';
-      } else if (focused) {
-        cls += ' is-highlighted'
-      }
-      return cls;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-error.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-input-error.html
deleted file mode 100644
index 645f1e7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-input-error.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-styles/typography.html">
-<link rel="import" href="paper-input-addon-behavior.html">
-
-<!--
-`<paper-input-error>` is an error message for use with `<paper-input-container>`. The error is
-displayed when the `<paper-input-container>` is `invalid`.
-
-    <paper-input-container>
-      <input is="iron-input" pattern="[0-9]*">
-      <paper-input-error>Only numbers are allowed!</paper-input-error>
-    </paper-input-container>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-input-container-invalid-color` | The foreground color of the error | `--error-color`
-`--paper-input-error`                   | Mixin applied to the error        | `{}`
--->
-
-<dom-module id="paper-input-error">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        visibility: hidden;
-
-        color: var(--paper-input-container-invalid-color, --error-color);
-
-        @apply(--paper-font-caption);
-        @apply(--paper-input-error);
-        position: absolute;
-        left:0;
-        right:0;
-      }
-
-      :host([invalid]) {
-        visibility: visible;
-      };
-    </style>
-
-    <content></content>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-input-error',
-
-    behaviors: [
-      Polymer.PaperInputAddonBehavior
-    ],
-
-    properties: {
-      /**
-       * True if the error is showing.
-       */
-      invalid: {
-        readOnly: true,
-        reflectToAttribute: true,
-        type: Boolean
-      }
-    },
-
-    /**
-     * This overrides the update function in PaperInputAddonBehavior.
-     * @param {{
-     *   inputElement: (Element|undefined),
-     *   value: (string|undefined),
-     *   invalid: boolean
-     * }} state -
-     *     inputElement: The input element.
-     *     value: The input value.
-     *     invalid: True if the input value is invalid.
-     */
-    update: function(state) {
-      this._setInvalid(state.invalid);
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-input.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-input.html
deleted file mode 100644
index 3eb0024..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-input.html
+++ /dev/null
@@ -1,183 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
-<link rel="import" href="../iron-input/iron-input.html">
-<link rel="import" href="paper-input-behavior.html">
-<link rel="import" href="paper-input-char-counter.html">
-<link rel="import" href="paper-input-container.html">
-<link rel="import" href="paper-input-error.html">
-
-<!--
-Material design: [Text fields](https://www.google.com/design/spec/components/text-fields.html)
-
-`<paper-input>` is a single-line text field with Material Design styling.
-
-    <paper-input label="Input label"></paper-input>
-
-It may include an optional error message or character counter.
-
-    <paper-input error-message="Invalid input!" label="Input label"></paper-input>
-    <paper-input char-counter label="Input label"></paper-input>
-
-It can also include custom prefix or suffix elements, which are displayed
-before or after the text input itself. In order for an element to be
-considered as a prefix, it must have the `prefix` attribute (and similarly
-for `suffix`).
-
-    <paper-input label="total">
-      <div prefix>$</div>
-      <paper-icon-button suffix icon="clear"></paper-icon-button>
-    </paper-input>
-
-A `paper-input` can use the native `type=search` or `type=file` features.
-However, since we can't control the native styling of the input (search icon,
-file button, date placeholder, etc.), in these cases the label will be
-automatically floated. The `placeholder` attribute can still be used for
-additional informational text.
-
-    <paper-input label="search!" type="search"
-        placeholder="search for cats" autosave="test" results="5">
-    </paper-input>
-
-See `Polymer.PaperInputBehavior` for more API docs.
-
-### Focus
-
-To focus a paper-input, you can call the native `focus()` method as long as the
-paper input has a tab index.
-
-### Styling
-
-See `Polymer.PaperInputContainer` for a list of custom properties used to
-style this element.
-
-
-@group Paper Elements
-@element paper-input
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-input">
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-
-      :host([focused]) {
-        outline: none;
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      input::-webkit-outer-spin-button,                                                                                                     
-      input::-webkit-inner-spin-button {                                                                                                    
-        @apply(--paper-input-container-input-webkit-spinner);                                                                                                                                                                                      
-      }
-      
-      input::-webkit-clear-button {
-        @apply(--paper-input-container-input-webkit-clear);  
-      }
-
-      input::-webkit-input-placeholder {
-        color: var(--paper-input-container-color, --secondary-text-color);
-      }
-
-      input:-moz-placeholder {
-        color: var(--paper-input-container-color, --secondary-text-color);
-      }
-
-      input::-moz-placeholder {
-        color: var(--paper-input-container-color, --secondary-text-color);
-      }
-
-      input::-ms-clear {
-        @apply(--paper-input-container-ms-clear);
-      }
-
-      input:-ms-input-placeholder {
-        color: var(--paper-input-container-color, --secondary-text-color);
-      }
-
-      label {
-        pointer-events: none;
-      }
-    </style>
-
-    <paper-input-container no-label-float="[[noLabelFloat]]" always-float-label="[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]" auto-validate$="[[autoValidate]]" disabled$="[[disabled]]" invalid="[[invalid]]">
-
-      <content select="[prefix]"></content>
-
-      <label hidden$="[[!label]]" aria-hidden="true" for="input">[[label]]</label>
-
-      <input is="iron-input" id="input"
-        aria-labelledby$="[[_ariaLabelledBy]]"
-        aria-describedby$="[[_ariaDescribedBy]]"
-        disabled$="[[disabled]]"
-        title$="[[title]]"
-        bind-value="{{value}}"
-        invalid="{{invalid}}"
-        prevent-invalid-input="[[preventInvalidInput]]"
-        allowed-pattern="[[allowedPattern]]"
-        validator="[[validator]]"
-        type$="[[type]]"
-        pattern$="[[pattern]]"
-        required$="[[required]]"
-        autocomplete$="[[autocomplete]]"
-        autofocus$="[[autofocus]]"
-        inputmode$="[[inputmode]]"
-        minlength$="[[minlength]]"
-        maxlength$="[[maxlength]]"
-        min$="[[min]]"
-        max$="[[max]]"
-        step$="[[step]]"
-        name$="[[name]]"
-        placeholder$="[[placeholder]]"
-        readonly$="[[readonly]]"
-        list$="[[list]]"
-        size$="[[size]]"
-        autocapitalize$="[[autocapitalize]]"
-        autocorrect$="[[autocorrect]]"
-        on-change="_onChange"
-        tabindex$="[[tabindex]]"
-        autosave$="[[autosave]]"
-        results$="[[results]]"
-        accept$="[[accept]]"
-        multiple$="[[multiple]]">
-
-      <content select="[suffix]"></content>
-
-      <template is="dom-if" if="[[errorMessage]]">
-        <paper-input-error aria-live="assertive">[[errorMessage]]</paper-input-error>
-      </template>
-
-      <template is="dom-if" if="[[charCounter]]">
-        <paper-input-char-counter></paper-input-char-counter>
-      </template>
-
-    </paper-input-container>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-input',
-
-    behaviors: [
-      Polymer.IronFormElementBehavior,
-      Polymer.PaperInputBehavior
-    ]
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/paper-textarea.html b/systrace/catapult/third_party/polymer/components/paper-input/paper-textarea.html
deleted file mode 100644
index cfc0652..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/paper-textarea.html
+++ /dev/null
@@ -1,145 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-autogrow-textarea/iron-autogrow-textarea.html">
-<link rel="import" href="../iron-form-element-behavior/iron-form-element-behavior.html">
-<link rel="import" href="paper-input-behavior.html">
-<link rel="import" href="paper-input-char-counter.html">
-<link rel="import" href="paper-input-container.html">
-<link rel="import" href="paper-input-error.html">
-
-<!--
-`<paper-textarea>` is a multi-line text field with Material Design styling.
-
-    <paper-textarea label="Textarea label"></paper-textarea>
-
-See `Polymer.PaperInputBehavior` for more API docs.
-
-### Validation
-
-Currently only `required` and `maxlength` validation is supported.
-
-### Styling
-
-See `Polymer.PaperInputContainer` for a list of custom properties used to
-style this element.
--->
-
-<dom-module id="paper-textarea">
-  <template>
-    <style>
-      :host {
-        display: block;
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      label {
-        pointer-events: none;
-      }
-    </style>
-
-    <paper-input-container no-label-float$="[[noLabelFloat]]" always-float-label="[[_computeAlwaysFloatLabel(alwaysFloatLabel,placeholder)]]" auto-validate$="[[autoValidate]]" disabled$="[[disabled]]" invalid="[[invalid]]">
-
-      <label hidden$="[[!label]]" aria-hidden="true">[[label]]</label>
-
-      <iron-autogrow-textarea id="input" class="paper-input-input"
-        bind-value="{{value}}"
-        invalid="{{invalid}}"
-        validator$="[[validator]]"
-        disabled$="[[disabled]]"
-        autocomplete$="[[autocomplete]]"
-        autofocus$="[[autofocus]]"
-        inputmode$="[[inputmode]]"
-        name$="[[name]]"
-        placeholder$="[[placeholder]]"
-        readonly$="[[readonly]]"
-        required$="[[required]]"
-        minlength$="[[minlength]]"
-        maxlength$="[[maxlength]]"
-        autocapitalize$="[[autocapitalize]]"
-        rows$="[[rows]]"
-        max-rows$="[[maxRows]]"
-        on-change="_onChange"></iron-autogrow-textarea>
-
-      <template is="dom-if" if="[[errorMessage]]">
-        <paper-input-error>[[errorMessage]]</paper-input-error>
-      </template>
-
-      <template is="dom-if" if="[[charCounter]]">
-        <paper-input-char-counter></paper-input-char-counter>
-      </template>
-
-    </paper-input-container>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-textarea',
-
-    behaviors: [
-      Polymer.PaperInputBehavior,
-      Polymer.IronFormElementBehavior
-    ],
-
-    properties: {
-      _ariaLabelledBy: {
-        observer: '_ariaLabelledByChanged',
-        type: String
-      },
-
-      _ariaDescribedBy: {
-        observer: '_ariaDescribedByChanged',
-        type: String
-      },
-
-      /**
-       * The initial number of rows.
-       *
-       * @attribute rows
-       * @type number
-       * @default 1
-       */
-      rows: {
-        type: Number,
-        value: 1
-      },
-
-      /**
-       * The maximum number of rows this element can grow to until it
-       * scrolls. 0 means no maximum.
-       *
-       * @attribute maxRows
-       * @type number
-       * @default 0
-       */
-      maxRows: {
-       type: Number,
-       value: 0
-      }
-    },
-
-    _ariaLabelledByChanged: function(ariaLabelledBy) {
-      this.$.input.textarea.setAttribute('aria-labelledby', ariaLabelledBy);
-    },
-
-    _ariaDescribedByChanged: function(ariaDescribedBy) {
-      this.$.input.textarea.setAttribute('aria-describedby', ariaDescribedBy);
-    },
-
-    get _focusableElement() {
-      return this.$.input.textarea;
-    },
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/index.html b/systrace/catapult/third_party/polymer/components/paper-input/test/index.html
deleted file mode 100644
index 48aa82f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/index.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-input tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-input.html',
-      'paper-textarea.html',
-      'paper-input-container.html',
-      'paper-input-error.html',
-      'paper-input-char-counter.html',
-      'paper-input.html?dom=shadow',
-      'paper-textarea.html?dom=shadow',
-      'paper-input-container.html?dom=shadow',
-      'paper-input-error.html?dom=shadow',
-      'paper-input-char-counter.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/letters-only.html b/systrace/catapult/third_party/polymer/components/paper-input/test/letters-only.html
deleted file mode 100644
index bfc301c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/letters-only.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
-
-<script>
-
-  Polymer({
-
-    is: 'letters-only',
-
-    behaviors: [
-      Polymer.IronValidatorBehavior
-    ],
-
-    validate: function(value) {
-      return !value || value.match(/^[a-zA-Z]*$/) !== null;
-    }
-
-  });
-
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-char-counter.html b/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-char-counter.html
deleted file mode 100644
index 65d2d14..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-char-counter.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-input-counter tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/test-helpers.js"></script>
-
-  <link rel="import" href="../../iron-input/iron-input.html">
-  <link rel="import" href="../paper-input-container.html">
-  <link rel="import" href="../paper-input-char-counter.html">
-  <link rel="import" href="../paper-textarea.html">
-
-</head>
-<body>
-
-  <test-fixture id="counter">
-    <template>
-      <paper-input-container>
-        <label id="l">label</label>
-        <input id="i" value="foobar">
-        <paper-input-char-counter id="c"></paper-input-char-counter>
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="counter-with-max">
-    <template>
-      <paper-input-container>
-        <label id="l">label</label>
-        <input id="i" value="foobar" maxlength="10">
-        <paper-input-char-counter id="c"></paper-input-char-counter>
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="textarea">
-    <template>
-      <paper-textarea char-counter value="foobar"></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="textarea-with-max">
-    <template>
-      <paper-textarea char-counter value="foobar" maxlength="100"></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('character counter shows the value length', function() {
-        var container = fixture('counter');
-        var input = Polymer.dom(container).querySelector('#i');
-        var counter = Polymer.dom(container).querySelector('#c');
-        assert.equal(counter._charCounterStr, input.value.length, 'character counter shows input value length');
-      });
-
-      test('character counter shows the value length with maxlength', function() {
-        var container = fixture('counter-with-max');
-        var input = Polymer.dom(container).querySelector('#i');
-        var counter = Polymer.dom(container).querySelector('#c');
-        assert.equal(counter._charCounterStr, input.value.length + '/' + input.maxLength, 'character counter shows input value length and maxLength');
-      });
-
-      test('character counter shows the value length with maxlength', function() {
-        var input = fixture('textarea-with-max');
-        forceXIfStamp(input);
-
-        var counter = Polymer.dom(input.root).querySelector('paper-input-char-counter');
-        assert.ok(counter, 'paper-input-char-counter exists');
-
-        assert.equal(counter._charCounterStr, input.value.length + '/' + input.inputElement.textarea.getAttribute('maxlength'), 'character counter shows input value length and maxLength');
-      });
-
-      test('character counter counts new lines in textareas correctly', function() {
-        var input = fixture('textarea');
-        input.value = 'foo\nbar';
-        forceXIfStamp(input);
-
-        var counter = Polymer.dom(input.root).querySelector('paper-input-char-counter')
-        assert.ok(counter, 'paper-input-char-counter exists');
-
-        assert.equal(counter._charCounterStr, input.value.length, 'character counter shows the value length');
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-container.html b/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-container.html
deleted file mode 100644
index 6af730d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-container.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-input-container tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../iron-input/iron-input.html">
-  <link rel="import" href="../paper-input-container.html">
-  <link rel="import" href="letters-only.html">
-
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <paper-input-container>
-        <label id="l">label</label>
-        <input id="i">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="prefix">
-    <template>
-      <paper-input-container>
-        <div prefix>$</div>
-        <label id="l">label</label>
-        <input is="iron-input" id="i">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="prefix-has-value">
-    <template>
-      <paper-input-container>
-        <div prefix>$</div>
-        <label id="l">label</label>
-        <input is="iron-input" id="i" value="foo">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="has-value">
-    <template>
-      <paper-input-container>
-        <label id="l">label</label>
-        <input id="i" value="value">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="no-float-has-value">
-    <template>
-      <paper-input-container no-label-float>
-        <label id="l">label</label>
-        <input id="i" value="value">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="always-float">
-    <template>
-      <paper-input-container always-float-label>
-        <label id="l">label</label>
-        <input id="i" value="value">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="auto-validate-numbers">
-    <template>
-      <paper-input-container auto-validate>
-        <label id="l">label</label>
-        <input is="iron-input" id="i" pattern="[0-9]*">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="manual-validate-numbers">
-    <template>
-      <paper-input-container>
-        <label id="l">label</label>
-        <input is="iron-input" id="i" pattern="[0-9]*">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="required-validate">
-    <template>
-      <paper-input-container>
-        <label id="l">label</label>
-        <input is="iron-input" id="i" required>
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <letters-only></letters-only>
-
-  <test-fixture id="auto-validate-validator">
-    <template>
-      <paper-input-container auto-validate>
-        <label id="l">label</label>
-        <input is="iron-input" id="i" pattern="[0-9]*" validator="letters-only">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="auto-validate-validator-has-invalid-value">
-    <template>
-      <paper-input-container auto-validate>
-        <label id="l">label</label>
-        <input is="iron-input" id="i" validator="letters-only" value="123123">
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    function getTransform(node) {
-      var style = getComputedStyle(node);
-      return style.transform || style.webkitTransform;
-    }
-
-    suite('basic', function() {
-      test('can be created imperatively', function() {
-        var container = document.createElement('paper-input-container');
-        var input = document.createElement('input', 'iron-input');
-        input.className = 'paper-input-input';
-        input.id = 'input';
-
-        var label = document.createElement('label');
-        label.innerHTML = 'label';
-
-        Polymer.dom(container).appendChild(label);
-        Polymer.dom(container).appendChild(input);
-
-        document.body.appendChild(container);
-        assert.isOk(container);
-        document.body.removeChild(container);
-      });
-    });
-
-    suite('label position', function() {
-
-      test('label is visible by default', function() {
-        var container = fixture('basic');
-        assert.equal(getComputedStyle(container.querySelector('#l')).visibility, 'visible', 'label has visibility:visible');
-      });
-
-      test('label is floated if value is initialized to not null', function(done) {
-        var container = fixture('has-value');
-        requestAnimationFrame(function() {
-          assert.notEqual(getTransform(container.querySelector('#l')), 'none', 'label has transform');
-          done();
-        });
-      });
-
-      test('label is invisible if no-label-float and value is initialized to not null', function() {
-        var container = fixture('no-float-has-value');
-        assert.equal(getComputedStyle(container.querySelector('#l')).visibility, 'hidden', 'label has visibility:hidden');
-      });
-
-      test('label is floated if always-float-label is true', function() {
-        var container = fixture('always-float');
-        assert.notEqual(getTransform(container.querySelector('#l')), 'none', 'label has transform');
-      });
-
-      test('label is floated correctly with a prefix', function(done) {
-        var container = fixture('prefix');
-        var label = Polymer.dom(container).querySelector('#l');
-        var input = Polymer.dom(container).querySelector('#i');
-
-        // Label is initially visible.
-        assert.equal(getComputedStyle(label).visibility, 'visible', 'label has visibility:visible');
-
-        // After entering text, the label floats, and it is not indented.
-        input.bindValue = 'foobar';
-        requestAnimationFrame(function() {
-          assert.notEqual(getTransform(label), 'none', 'label has transform');
-          assert.equal(label.getBoundingClientRect().left, container.getBoundingClientRect().left);
-          done();
-        });
-      });
-
-      test('label is floated correctly with a prefix and prefilled value', function(done) {
-        var container = fixture('prefix-has-value');
-        var label = Polymer.dom(container).querySelector('#l');
-
-        // The label floats, and it is not indented.
-        requestAnimationFrame(function() {
-          assert.notEqual(getTransform(label), 'none', 'label has transform');
-          assert.equal(label.getBoundingClientRect().left, container.getBoundingClientRect().left);
-          done();
-        });
-      });
-
-    });
-
-    suite('focused styling', function() {
-
-      test('label is colored when input is focused and has value', function(done) {
-        var container = fixture('has-value');
-        var label = Polymer.dom(container).querySelector('#l');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        MockInteractions.focus(input);
-        requestAnimationFrame(function() {
-          assert.isTrue(container.focused, 'focused is true');
-          assert.isTrue(inputContent.classList.contains('label-is-highlighted'), 'label is highlighted when input has focus');
-          done();
-        });
-      });
-
-      test('label is not colored when input is focused and has null value', function(done) {
-        var container = fixture('basic');
-        var label = Polymer.dom(container).querySelector('#l');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        MockInteractions.focus(input);
-        requestAnimationFrame(function() {
-          assert.isFalse(inputContent.classList.contains('label-is-highlighted'), 'label is not highlighted when input has focus and has null value');
-          done();
-        });
-      });
-
-      test('underline is colored when input is focused', function(done) {
-        var container = fixture('basic');
-        var input = Polymer.dom(container).querySelector('#i');
-        var line = Polymer.dom(container.root).querySelector('.underline');
-        assert.isFalse(line.classList.contains('is-highlighted'), 'line is not highlighted when input is not focused');
-        MockInteractions.focus(input);
-        requestAnimationFrame(function() {
-          assert.isTrue(line.classList.contains('is-highlighted'), 'line is highlighted when input is focused');
-          done();
-        });
-      });
-
-      test('focused class added to input content', function(done) {
-        var container = fixture('basic');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        assert.isFalse(inputContent.classList.contains('focused'), 'input content does not have class "focused" when input is not focused');
-        MockInteractions.focus(input);
-        requestAnimationFrame(function() {
-          assert.isTrue(inputContent.classList.contains('focused'), 'input content has class "focused" when input is focused');
-          done();
-        });
-      });
-
-    });
-
-    suite('validation', function() {
-
-      test('styled when the input is set to an invalid value with auto-validate', function() {
-        var container = fixture('auto-validate-numbers');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        var line = Polymer.dom(container.root).querySelector('.underline');
-
-        input.bindValue = 'foobar';
-
-        assert.isTrue(container.invalid, 'invalid is true');
-        assert.isTrue(inputContent.classList.contains('is-invalid'), 'label has invalid styling when input is invalid');
-        assert.isTrue(line.classList.contains('is-invalid'), 'underline has invalid styling when input is invalid');
-      });
-
-      test('styled when the input is set to an invalid value with auto-validate, with validator', function() {
-        var container = fixture('auto-validate-validator');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        var line = Polymer.dom(container.root).querySelector('.underline');
-
-        input.bindValue = '123123';
-
-        assert.isTrue(container.invalid, 'invalid is true');
-        assert.isTrue(inputContent.classList.contains('is-invalid'), 'label has invalid styling when input is invalid');
-        assert.isTrue(line.classList.contains('is-invalid'), 'underline has invalid styling when input is invalid');
-      });
-
-      test('styled when the input is set initially to an invalid value with auto-validate, with validator', function() {
-        var container = fixture('auto-validate-validator-has-invalid-value');
-        assert.isTrue(container.invalid, 'invalid is true');
-        assert.isTrue(Polymer.dom(container.root).querySelector('.underline').classList.contains('is-invalid'), 'underline has is-invalid class');
-      });
-
-      test('styled when the input is set to an invalid value with manual validation', function() {
-        var container = fixture('manual-validate-numbers');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        var line = Polymer.dom(container.root).querySelector('.underline');
-
-        input.bindValue = 'foobar';
-        input.validate();
-
-        assert.isTrue(container.invalid, 'invalid is true');
-        assert.isTrue(inputContent.classList.contains('is-invalid'), 'label has invalid styling when input is invalid');
-        assert.isTrue(line.classList.contains('is-invalid'), 'underline has invalid styling when input is invalid');
-      });
-
-      test('styled when the input is manually validated and required', function() {
-        var container = fixture('required-validate');
-        var input = Polymer.dom(container).querySelector('#i');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        assert.isFalse(container.invalid, 'invalid is false');
-        input.validate();
-        assert.isTrue(container.invalid, 'invalid is true');
-        assert.isTrue(inputContent.classList.contains('is-invalid'), 'input content has is-invalid class');
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-error.html b/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-error.html
deleted file mode 100644
index 9337a95..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input-error.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-input-error tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../../iron-input/iron-input.html">
-  <link rel="import" href="../paper-input-container.html">
-  <link rel="import" href="../paper-input-error.html">
-
-</head>
-<body>
-
-  <paper-input-container id="container">
-    <input is="iron-input">
-    <paper-input-error>error</paper-input-error>
-  </paper-input-container>
-
-  <test-fixture id="auto-validate-numbers">
-    <template>
-      <paper-input-container auto-validate attr-for-value="bind-value">
-        <label id="l">label</label>
-        <input is="iron-input" id="i" pattern="[0-9]*">
-        <paper-input-error id="e">error</paper-input-error>
-      </paper-input-container>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('error message only appears when input is invalid', function() {
-        var container = fixture('auto-validate-numbers');
-        var input = Polymer.dom(container).querySelector('#i');
-        var error = Polymer.dom(container).querySelector('#e');
-        assert.equal(getComputedStyle(error).visibility, 'hidden', 'error is visibility:hidden');
-        input.bindValue = 'foobar';
-        assert.notEqual(getComputedStyle(error).visibility, 'hidden', 'error is not visibility:hidden');
-      });
-
-      test('error message add on is registered', function() {
-        var container = document.getElementById('container');
-        assert.isTrue(container._addons && container._addons.length === 1, 'add on is registered');
-      });
-
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input.html b/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input.html
deleted file mode 100644
index 77f68c5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-input.html
+++ /dev/null
@@ -1,398 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-input tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/test-helpers.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../paper-input.html">
-  <link rel="import" href="letters-only.html">
-
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <paper-input></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="has-tabindex">
-    <template>
-      <paper-input tabindex="0"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="label">
-    <template>
-      <paper-input label="foo"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="label-has-value">
-    <template>
-      <paper-input label="foo" value="bar"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="error">
-    <template>
-      <paper-input auto-validate pattern="[0-9]*" value="foobar" error-message="error"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="required">
-    <template>
-      <paper-input auto-validate required error-message="error"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="required-no-auto-validate">
-    <template>
-      <paper-input required error-message="error"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="required-char-counter">
-    <template>
-      <paper-input auto-validate char-counter required error-message="error"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="char-counter">
-    <template>
-      <paper-input char-counter value="foobar"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="type-number-char-counter">
-    <template>
-      <paper-input type="number" char-counter value="1138"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="always-float-label">
-    <template>
-      <paper-input always-float-label label="foo"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="placeholder">
-    <template>
-      <paper-input label="foo" placeholder="bar"></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="date">
-    <template>
-      <paper-input label="foo" type="date"></paper-input>
-    </template>
-  </test-fixture>
-
-  <letters-only></letters-only>
-
-  <test-fixture id="validator">
-    <template>
-      <paper-input value="123123" validator="letters-only" auto-validate></paper-input>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="multiple-inputs">
-    <template>
-      <paper-input label="one"></paper-input>
-      <paper-input label="two"></paper-input>
-      <paper-input label="three"></paper-input>
-      <paper-input label="four"></paper-input>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('setting value sets the input value', function() {
-        var input = fixture('basic');
-        input.value = 'foobar';
-        assert.equal(input.inputElement.value, input.value, 'inputElement.value equals input.value');
-      });
-
-      test('placeholder does not overlap label', function() {
-        var input = fixture('placeholder');
-        assert.equal(input.inputElement.placeholder, input.placeholder, 'inputElement.placeholder equals input.placeholder');
-        assert.equal(input.noLabelFloat, false);
-        var floatingLabel = Polymer.dom(Polymer.dom(input.root).querySelector('paper-input-container').root).querySelector('.label-is-floating');
-        assert.ok(floatingLabel);
-      });
-
-      test('special types autofloat the label', function() {
-        var input = fixture('date');
-        // Browsers that don't support special <input> types like `date` fallback
-        // to `text`, so make sure to only test if type is still preserved after
-        // the element is attached.
-        if (input.inputElement.type === "date") {
-          assert.equal(input.alwaysFloatLabel, true);
-          var floatingLabel = Polymer.dom(Polymer.dom(input.root).querySelector('paper-input-container').root).querySelector('.label-is-floating');
-          assert.ok(floatingLabel);
-        }
-      });
-
-      test('always-float-label attribute works without placeholder', function() {
-        var input = fixture('always-float-label');
-        var container = Polymer.dom(input.root).querySelector('paper-input-container');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        assert.isTrue(inputContent.classList.contains('label-is-floating'), 'label is floating');
-      });
-
-      test('label does not receive pointer events', function() {
-        var input = fixture('always-float-label');
-        var label = Polymer.dom(input.root).querySelector('label');
-        assert.equal(getComputedStyle(label).pointerEvents, 'none');
-      });
-
-      test('error message is displayed', function() {
-        var input = fixture('error');
-        forceXIfStamp(input);
-        var error = Polymer.dom(input.root).querySelector('paper-input-error');
-        assert.ok(error, 'paper-input-error exists');
-        assert.notEqual(getComputedStyle(error).display, 'none', 'error is not display:none');
-      });
-
-      test('empty required input shows error', function() {
-        var input = fixture('required');
-        forceXIfStamp(input);
-        var error = Polymer.dom(input.root).querySelector('paper-input-error');
-        assert.ok(error, 'paper-input-error exists');
-        assert.notEqual(getComputedStyle(error).display, 'none', 'error is not display:none');
-      });
-
-      test('character counter is displayed', function() {
-        var input = fixture('char-counter');
-        forceXIfStamp(input);
-        var counter = Polymer.dom(input.root).querySelector('paper-input-char-counter')
-        assert.ok(counter, 'paper-input-char-counter exists');
-        assert.equal(counter._charCounterStr, input.value.length, 'character counter shows the value length');
-      });
-
-      test('character counter is correct for type=number', function() {
-        var input = fixture('type-number-char-counter');
-        forceXIfStamp(input);
-        var counter = Polymer.dom(input.root).querySelector('paper-input-char-counter')
-        assert.ok(counter, 'paper-input-char-counter exists');
-        assert.equal(counter._charCounterStr, input.value.toString().length, 'character counter shows the value length');
-      });
-
-      test('validator is used', function() {
-        var input = fixture('validator');
-        assert.ok(input.inputElement.invalid, 'input is invalid');
-      });
-
-      test('caret position is preserved', function() {
-        var input = fixture('basic');
-        var ironInput = Polymer.dom(input.root).querySelector('input[is="iron-input"]');
-        input.value = 'nananana';
-        ironInput.selectionStart = 2;
-        ironInput.selectionEnd = 2;
-
-        input.updateValueAndPreserveCaret('nanananabatman');
-
-        assert.equal(ironInput.selectionStart, 2, 'selectionStart is preserved');
-        assert.equal(ironInput.selectionEnd, 2, 'selectionEnd is preserved');
-      });
-
-      test('setting autofocus to true implictly acquires focus', function(done) {
-        var input = fixture('basic');
-        var inputFocusSpy = sinon.spy(input.inputElement, 'focus');
-        window.setTimeout(function() {
-          assert(inputFocusSpy.called);
-          done();
-        }, 50);
-        input.autofocus = true;
-      });
-
-      test('autofocus doesn\'t grab focus if another element already has it', function(done) {
-        var inputs = fixture('multiple-inputs');
-        var inputFocusSpies = inputs.map(function(input) {
-          return sinon.spy(input.inputElement, 'focus');
-        });
-        window.setTimeout(function() {
-          assert(inputFocusSpies[0].called, 'first autofocus input with grabbed focus');
-          assert(!inputFocusSpies[1].called, 'second autofocus input let first input keep focus');
-          done();
-        }, 50);
-        inputs[0].autofocus = true;
-        inputs[1].autofocus = true; // Shouldn't cause focus to change
-      });
-
-    });
-
-    suite('focus/blur events', function() {
-      var input;
-
-      setup(function() {
-        input = fixture('basic');
-      });
-
-      // At the moment, it is very hard to correctly fire exactly
-      // one focus/blur events on a paper-input. This is because
-      // when a paper-input is focused, it needs to focus
-      // its underlying native input, which will also fire a `blur`
-      // event.
-      test('focus events fired on host element', function() {
-        input.addEventListener('focus', function(event) {
-          assert(input.focused, 'input is focused');
-        });
-        MockInteractions.focus(input);
-      });
-
-      test('focus events fired on host element if nested element is focused', function() {
-        input.addEventListener('focus', function(event) {
-          assert(input.focused, 'input is focused');
-        });
-        MockInteractions.focus(input.inputElement);
-      });
-
-      test('blur events fired on host element', function() {
-        MockInteractions.focus(input);
-        input.addEventListener('blur', function(event) {
-          assert(!input.focused, 'input is blurred');
-        });
-        MockInteractions.blur(input);
-      });
-
-      test('blur events fired on host element nested element is blurred', function() {
-        MockInteractions.focus(input);
-        input.addEventListener('blur', function(event) {
-          assert(!input.focused, 'input is blurred');
-        });
-        MockInteractions.blur(input.inputElement);
-      });
-
-      test('focusing then bluring sets the focused attribute correctly', function() {
-        MockInteractions.focus(input);
-        assert(input.focused, 'input is focused');
-        MockInteractions.blur(input);
-        assert(!input.focused, 'input is blurred');
-        MockInteractions.focus(input.inputElement);
-        assert(input.focused, 'input is focused');
-        MockInteractions.blur(input.inputElement);
-        assert(!input.focused, 'input is blurred');
-      });
-
-      test('focusing then bluring with shift-tab removes the focused attribute correctly', function() {
-        MockInteractions.focus(input);
-        assert(input.focused, 'input is focused');
-
-        // Fake a shift-tab induced blur by forcing the flag.
-        input._shiftTabPressed = true;
-        MockInteractions.blur(input.inputElement);
-        assert(!input.focused, 'input is blurred');
-      });
-    });
-
-    suite('focused styling (integration test)', function() {
-
-      test('underline is colored when input is focused', function(done) {
-        var input = fixture('basic');
-        var container = Polymer.dom(input.root).querySelector('paper-input-container');
-        var line = Polymer.dom(container.root).querySelector('.underline');
-        assert.isFalse(line.classList.contains('is-highlighted'), 'line is not highlighted when input is not focused');
-        MockInteractions.focus(input.inputElement);
-        requestAnimationFrame(function() {
-          assert.isTrue(line.classList.contains('is-highlighted'), 'line is highlighted when input is focused');
-          done();
-        });
-      });
-
-    });
-
-    suite('validation', function() {
-
-      test('invalid attribute updated after calling validate()', function() {
-        var input = fixture('required-no-auto-validate');
-        forceXIfStamp(input);
-        input.validate();
-        var error = Polymer.dom(input.root).querySelector('paper-input-error');
-        assert.ok(error, 'paper-input-error exists');
-        assert.notEqual(getComputedStyle(error).display, 'none', 'error is not display:none');
-        assert.isTrue(input.invalid, 'invalid is true');
-      });
-
-    });
-
-    suite('a11y', function() {
-      test('has aria-labelledby, which is monotonically increasing', function() {
-        var inputs = fixture('multiple-inputs');
-
-        // Find the first index of the input in this fixture. Since the label
-        // ids monotonically increase every time a new input is created, and
-        // this fixture isn't the first one in the document, we're going to start
-        // at an ID > 1.
-        var firstLabel = Polymer.dom(inputs[0].root).querySelector('label').id;
-        var index = parseInt(firstLabel.substr(firstLabel.lastIndexOf('-') + 1));
-
-        for (var i = 0; i < inputs.length; i++ ) {
-          var input = inputs[i].inputElement;
-          var label = Polymer.dom(inputs[i].root).querySelector('label').id;
-
-          assert.isTrue(input.hasAttribute('aria-labelledby'));
-          assert.equal(label, 'paper-input-label-' + (index++));
-          assert.equal(input.getAttribute('aria-labelledby'), label);
-        }
-      });
-
-      test('has aria-describedby for error message', function() {
-        var input = fixture('required');
-        forceXIfStamp(input);
-        assert.isTrue(input.inputElement.hasAttribute('aria-describedby'));
-        assert.equal(input.inputElement.getAttribute('aria-describedby'), Polymer.dom(input.root).querySelector('paper-input-error').id, 'aria-describedby points to the error message');
-      });
-
-      test('has aria-describedby for character counter', function() {
-        var input = fixture('char-counter');
-        forceXIfStamp(input);
-        assert.isTrue(input.inputElement.hasAttribute('aria-describedby'));
-        assert.equal(input.inputElement.getAttribute('aria-describedby'), Polymer.dom(input.root).querySelector('paper-input-char-counter').id, 'aria-describedby points to the character counter');
-      });
-
-      test('has aria-describedby for character counter and error', function() {
-        var input = fixture('required-char-counter');
-        forceXIfStamp(input);
-        assert.isTrue(input.inputElement.hasAttribute('aria-describedby'));
-        assert.equal(input.inputElement.getAttribute('aria-describedby'), Polymer.dom(input.root).querySelector('paper-input-error').id + ' ' + Polymer.dom(input.root).querySelector('paper-input-char-counter').id, 'aria-describedby points to the error message and character counter');
-      });
-
-      test('focus an input with tabindex', function(done) {
-        var input = fixture('has-tabindex');
-        flush(function() {
-          MockInteractions.focus(input);
-          flush(function() {
-            assert.equal(input.shadowRoot ? input.shadowRoot.activeElement :
-                document.activeElement, input._focusableElement);
-            done();
-          });
-        });
-      });
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-textarea.html b/systrace/catapult/third_party/polymer/components/paper-input/test/paper-textarea.html
deleted file mode 100644
index f69e4ee..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-input/test/paper-textarea.html
+++ /dev/null
@@ -1,233 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-textarea tests</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/test-helpers.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../paper-textarea.html">
-</head>
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <paper-textarea></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="label">
-    <template>
-      <paper-textarea label="foo"></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="char-counter">
-    <template>
-      <paper-textarea char-counter></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="required">
-    <template>
-      <paper-textarea auto-validate required error-message="error"></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="required-char-counter">
-    <template>
-      <paper-textarea auto-validate char-counter required error-message="error"></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="always-float-label">
-    <template>
-      <paper-textarea always-float-label label="label"></paper-textarea>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      test('setting value sets the input value', function() {
-        var input = fixture('basic');
-        input.value = 'foobar';
-        assert.equal(input.inputElement.bindValue, input.value, 'inputElement value equals input.value');
-      });
-
-      test('empty required input shows error', function() {
-        var input = fixture('required');
-        forceXIfStamp(input);
-        var error = Polymer.dom(input.root).querySelector('paper-input-error');
-        assert.ok(error, 'paper-input-error exists');
-        assert.notEqual(getComputedStyle(error).display, 'none', 'error is not display:none');
-      });
-
-      test('caret position is preserved', function() {
-        var input = fixture('basic');
-        var ironTextarea = Polymer.dom(input.root).querySelector('iron-autogrow-textarea');
-        input.value = 'nananana';
-        ironTextarea.selectionStart = 2;
-        ironTextarea.selectionEnd = 2;
-
-        input.updateValueAndPreserveCaret('nanananabatman');
-
-        assert.equal(ironTextarea.selectionStart, 2, 'selectionStart is preserved');
-        assert.equal(ironTextarea.selectionEnd, 2, 'selectionEnd is preserved');
-      });
-
-      test('input attributes are bound to textarea', function() {
-        var input = fixture('basic');
-        var attrs = {
-          'autocomplete': 'true',
-          'autofocus': true,
-          'inputmode': 'number',
-          'name': 'foo',
-          'placeholder': 'bar',
-          'readonly': true,
-          'required': true,
-          'maxlength': 3
-        };
-        for (var attr in attrs) {
-          input[attr] = attrs[attr];
-        }
-        for (var attr in attrs) {
-          var inputAttr = input.inputElement.getAttribute(attr);
-          if (typeof attrs[attr] === 'boolean') {
-            assert.equal(inputAttr !== null, attrs[attr], 'attribute "' + attr + '" is equal to property (' + attrs[attr] + ', ' + inputAttr !== null + ')');
-          } else {
-            assert.equal(inputAttr, attrs[attr], 'attribute "' + attr + '" is equal to property (' + attrs[attr] + ', ' + inputAttr + ')');
-          }
-        }
-      });
-
-      test('always-float-label attribute works', function() {
-        var input = fixture('always-float-label');
-        var container = Polymer.dom(input.root).querySelector('paper-input-container');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        assert.isTrue(inputContent.classList.contains('label-is-floating'), 'label is floating');
-      });
-
-      test('label does not receive pointer events', function() {
-        var input = fixture('always-float-label');
-        var label = Polymer.dom(input.root).querySelector('label');
-        assert.equal(getComputedStyle(label).pointerEvents, 'none');
-      });
-
-      test('no extra space between input and underline', function() {
-        var input = fixture('label');
-        var container = Polymer.dom(input.root).querySelector('paper-input-container');
-        var inputContent = Polymer.dom(container.root).querySelector('.input-content');
-        var ironTextarea = Polymer.dom(input.root).querySelector('iron-autogrow-textarea');
-        assert.equal(inputContent.clientHeight,ironTextarea.clientHeight, 'container and textarea are same height');
-      });
-    });
-
-    suite('focus/blur events', function() {
-      var input;
-
-      setup(function() {
-        input = fixture('basic');
-      });
-
-      // At the moment, it is very hard to correctly fire exactly
-      // one focus/blur events on a paper-textarea. This is because
-      // when a paper-textarea is focused, it needs to focus
-      // its underlying native textarea, which will also fire a `blur`
-      // event.
-      test('focus events fired on host element', function() {
-        input.addEventListener('focus', function(event) {
-          assert(input.focused, 'input is focused');
-        });
-        MockInteractions.focus(input);
-      });
-
-      test('focus events fired on host element if nested element is focused', function() {
-        input.addEventListener('focus', function(event) {
-          assert(input.focused, 'input is focused');
-        });
-        MockInteractions.focus(input.inputElement.textarea);
-      });
-
-      test('blur events fired on host element', function() {
-        MockInteractions.focus(input);
-        input.addEventListener('blur', function(event) {
-          assert(!input.focused, 'input is blurred');
-        });
-        MockInteractions.blur(input);
-      });
-
-      test('blur events fired on host element nested element is blurred', function() {
-        MockInteractions.focus(input);
-        input.addEventListener('blur', function(event) {
-          assert(!input.focused, 'input is blurred');
-        });
-        MockInteractions.blur(input.inputElement.textarea);
-      });
-
-      test('focusing then bluring sets the focused attribute correctly', function() {
-        MockInteractions.focus(input);
-        assert(input.focused, 'input is focused');
-        MockInteractions.blur(input);
-        assert(!input.focused, 'input is blurred');
-        MockInteractions.focus(input.inputElement.textarea);
-        assert(input.focused, 'input is focused');
-        MockInteractions.blur(input.inputElement.textarea);
-        assert(!input.focused, 'input is blurred');
-      });
-    });
-
-    suite('a11y', function() {
-
-      test('has aria-labelledby', function() {
-        var input = fixture('label');
-        assert.isTrue(input.inputElement.textarea.hasAttribute('aria-labelledby'))
-        assert.equal(input.inputElement.textarea.getAttribute('aria-labelledby'), Polymer.dom(input.root).querySelector('label').id, 'aria-labelledby points to the label');
-      });
-
-      test('has aria-describedby for error message', function() {
-        var input = fixture('required');
-        forceXIfStamp(input);
-        assert.isTrue(input.inputElement.textarea.hasAttribute('aria-describedby'));
-        assert.equal(input.inputElement.textarea.getAttribute('aria-describedby'), Polymer.dom(input.root).querySelector('paper-input-error').id, 'aria-describedby points to the error message');
-      });
-
-      test('has aria-describedby for character counter', function() {
-        var input = fixture('char-counter');
-        forceXIfStamp(input);
-        assert.isTrue(input.inputElement.textarea.hasAttribute('aria-describedby'));
-        assert.equal(input.inputElement.textarea.getAttribute('aria-describedby'), Polymer.dom(input.root).querySelector('paper-input-char-counter').id, 'aria-describedby points to the character counter');
-      });
-
-      test('has aria-describedby for character counter and error', function() {
-        var input = fixture('required-char-counter');
-        forceXIfStamp(input);
-        assert.isTrue(input.inputElement.textarea.hasAttribute('aria-describedby'));
-        assert.equal(input.inputElement.textarea.getAttribute('aria-describedby'), Polymer.dom(input.root).querySelector('paper-input-error').id + ' ' + Polymer.dom(input.root).querySelector('paper-input-char-counter').id, 'aria-describedby points to the error message and character counter');
-      });
-
-    });
-
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-item/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/README.md b/systrace/catapult/third_party/polymer/components/paper-item/README.md
deleted file mode 100644
index 18deb62..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/README.md
+++ /dev/null
@@ -1,163 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-icon-item.html  paper-item-behavior.html  paper-item-body.html  paper-item.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-item.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-item)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-item)_
-
-
-##&lt;paper-item&gt;
-
-Material design: [Lists](https://www.google.com/design/spec/components/lists.html)
-
-`<paper-item>` is an interactive list item. By default, it is a horizontal flexbox.
-
-```html
-<paper-item>Item</paper-item>
-```
-
-Use this element with `<paper-item-body>` to make Material Design styled two-line and three-line
-items.
-
-```html
-<paper-item>
-  <paper-item-body two-line>
-    <div>Show your status</div>
-    <div secondary>Your status is visible to everyone</div>
-  </paper-item-body>
-  <iron-icon icon="warning"></iron-icon>
-</paper-item>
-```
-
-To use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will
-already receive focus, you may want to prevent the anchor tag from receiving
-focus as well by setting its tabindex to -1.
-
-```html
-<a href="https://www.polymer-project.org/" tabindex="-1">
-  <paper-item raised>Polymer Project</paper-item>
-</a>
-```
-
-If you are concerned about performance and want to use `paper-item` in a `paper-listbox`
-with many items, you can just use a native `button` with the `paper-item` class
-applied (provided you have correctly included the shared styles):
-
-```html
-<style is="custom-style" include="paper-item-shared-styles"></style>
-
-<paper-listbox>
-  <button class="paper-item" role="option">Inbox</button>
-  <button class="paper-item" role="option">Starred</button>
-  <button class="paper-item" role="option">Sent mail</button>
-</paper-listbox>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-item-min-height` | Minimum height of the item | `48px` |
-| `--paper-item` | Mixin applied to the item | `{}` |
-| `--paper-item-selected-weight` | The font weight of a selected item | `bold` |
-| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` |
-| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` |
-| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` |
-| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` |
-| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` |
-
-### Accessibility
-
-This element has `role="listitem"` by default. Depending on usage, it may be more appropriate to set
-`role="menuitem"`, `role="menuitemcheckbox"` or `role="menuitemradio"`.
-
-```html
-<paper-item role="menuitemcheckbox">
-  <paper-item-body>
-    Show your status
-  </paper-item-body>
-  <paper-checkbox></paper-checkbox>
-</paper-item>
-```
-
-
-
-##&lt;paper-icon-item&gt;
-
-`<paper-icon-item>` is a convenience element to make an item with icon. It is an interactive list
-item with a fixed-width icon area, according to Material Design. This is useful if the icons are of
-varying widths, but you want the item bodies to line up. Use this like a `<paper-item>`. The child
-node with the attribute `item-icon` is placed in the icon area.
-
-```html
-<paper-icon-item>
-  <iron-icon icon="favorite" item-icon></iron-icon>
-  Favorite
-</paper-icon-item>
-<paper-icon-item>
-  <div class="avatar" item-icon></div>
-  Avatar
-</paper-icon-item>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-item-icon-width` | Width of the icon area | `56px` |
-| `--paper-item-icon` | Mixin applied to the icon area | `{}` |
-| `--paper-icon-item` | Mixin applied to the item | `{}` |
-| `--paper-item-selected-weight` | The font weight of a selected item | `bold` |
-| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` |
-| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` |
-| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` |
-| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` |
-| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` |
-
-
-
-##&lt;paper-item-body&gt;
-
-Use `<paper-item-body>` in a `<paper-item>` or `<paper-icon-item>` to make two- or
-three- line items. It is a flex item that is a vertical flexbox.
-
-```html
-<paper-item>
-  <paper-item-body two-line>
-    <div>Show your status</div>
-    <div secondary>Your status is visible to everyone</div>
-  </paper-item-body>
-</paper-item>
-```
-
-The child elements with the `secondary` attribute is given secondary text styling.
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-item-body-two-line-min-height` | Minimum height of a two-line item | `72px` |
-| `--paper-item-body-three-line-min-height` | Minimum height of a three-line item | `88px` |
-| `--paper-item-body-secondary-color` | Foreground color for the `secondary` area | `--secondary-text-color` |
-| `--paper-item-body-secondary` | Mixin applied to the `secondary` area | `{}` |
-
-
-
-<!-- No docs for Polymer.PaperItemBehavior found. -->
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/all-imports.html b/systrace/catapult/third_party/polymer/components/paper-item/all-imports.html
deleted file mode 100644
index 4b1583f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/all-imports.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="paper-item.html">
-<link rel="import" href="paper-item-body.html">
-<link rel="import" href="paper-icon-item.html">
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/bower.json b/systrace/catapult/third_party/polymer/components/paper-item/bower.json
deleted file mode 100644
index 5922382..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/bower.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-  "name": "paper-item",
-  "version": "1.2.2",
-  "description": "A material-design styled list item",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "item"
-  ],
-  "main": [
-    "paper-item.html",
-    "paper-icon-item.html",
-    "paper-item-body.html"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-item"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-item",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-behaviors": "polymerelements/iron-behaviors#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-item/demo/index.html
deleted file mode 100644
index 92a04d1..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/demo/index.html
+++ /dev/null
@@ -1,191 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-item demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-icon/iron-icon.html">
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../../iron-icons/communication-icons.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-  <link rel="import" href="../paper-icon-item.html">
-  <link rel="import" href="../paper-item.html">
-  <link rel="import" href="../paper-item-body.html">
-  <link rel="import" href="../../paper-styles/color.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    div[role="listbox"] {
-      border: 1px solid #e5e5e5;
-    }
-    .avatar {
-      display: inline-block;
-      box-sizing: border-box;
-      width: 40px;
-      height: 40px;
-      border-radius: 50%;
-      background: var(--paper-amber-500);
-    }
-
-    .blue {
-      background-color: var(--paper-light-blue-300);
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Paper-items are simple list elements, ideally used in a paper-listbox or
-    an element with <i>role="listbox"</i></h3>
-    <demo-snippet>
-      <template>
-        <div role="listbox">
-          <paper-item>Inbox</paper-item>
-          <paper-item>Starred</paper-item>
-          <paper-item>Sent mail</paper-item>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h3>They can be styled using custom properties</h3>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          paper-item.fancy {
-            --paper-item-focused: {
-              background: var(--paper-amber-500);
-              font-weight: bold;
-            };
-            --paper-item-focused-before: {
-              opacity: 0;
-            };
-          }
-        </style>
-        <div role="listbox">
-          <paper-item class="fancy">Inbox</paper-item>
-          <paper-item class="fancy">Starred</paper-item>
-          <paper-item class="fancy">Sent mail</paper-item>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h3>To add a leading element, use a paper-icon-item with an <i>item-icon</i> attribute. This
-    leading image can be an iron-icon, or any other regular element.</h3>
-    <demo-snippet>
-      <template>
-        <div role="listbox">
-          <paper-icon-item>
-            <iron-icon icon="inbox" item-icon></iron-icon>
-            Inbox
-          </paper-icon-item>
-          <paper-icon-item>
-            <iron-icon icon="star" item-icon></iron-icon>
-            Starred
-          </paper-icon-item>
-          <paper-icon-item>
-            <div class="avatar blue" item-icon></div>
-            Alphonso Engelking
-          </paper-icon-item>
-          <paper-icon-item>
-            <div class="avatar" item-icon></div>
-            Angela Decker
-          </paper-icon-item>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h3>For two-line items, use a paper-item-body inside a paper-item or paper-icon-item</h3>
-    <demo-snippet>
-      <template>
-        <div role="listbox">
-          <paper-item>
-            <paper-item-body two-line>
-              <div>Profile Photo</div>
-              <div secondary>Change your Google+ profile photo</div>
-            </paper-item-body>
-          </paper-item>
-          <paper-icon-item>
-            <iron-icon icon="communication:phone" item-icon>
-            </iron-icon>
-            <paper-item-body two-line>
-              <div>(650) 555-1234</div>
-              <div secondary>Mobile</div>
-            </paper-item-body>
-          </paper-icon-item>
-          <paper-icon-item>
-            <div class="avatar blue" item-icon></div>
-            <paper-item-body two-line>
-              <div>Alphonso Engelking</div>
-              <div secondary>Change photo</div>
-            </paper-item-body>
-          </paper-icon-item>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h3>Complex layouts are usually a combination of all these elements</h3>
-    <demo-snippet>
-      <template>
-        <div role="listbox">
-          <paper-icon-item>
-            <div class="avatar blue" item-icon></div>
-            <paper-item-body two-line>
-              <div>Photos</div>
-              <div secondary>Jan 9, 2014</div>
-            </paper-item-body>
-            <paper-icon-button icon="star" alt="favourite this!">
-            </paper-icon-button>
-          </paper-icon-item>
-          <paper-icon-item>
-            <div class="avatar" item-icon></div>
-            <paper-item-body two-line>
-              <div>Recipes</div>
-              <div secondary>Jan 17, 2014</div>
-            </paper-item-body>
-            <paper-icon-button icon="star" alt="favourite this!">
-            </paper-icon-button>
-          </paper-icon-item>
-        </div>
-      </template>
-    </demo-snippet>
-
-    <h3>Paper-items can be used as links</h3>
-    <demo-snippet>
-      <template>
-        <style is="custom-style">
-          .paper-item-link {
-            color: inherit;
-            text-decoration: none;
-          }
-        </style>
-        <div role="listbox">
-          <a class="paper-item-link" href="#inbox" tabindex="-1">
-            <paper-item>Inbox</paper-item>
-          </a>
-          <a class="paper-item-link" href="#starred" tabindex="-1">
-            <paper-item>Starred</paper-item>
-          </a>
-          <a class="paper-item-link" href="#sent" tabindex="-1">
-            <paper-item>Sent mail</paper-item>
-          </a>
-        </div>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/index.html b/systrace/catapult/third_party/polymer/components/paper-item/index.html
deleted file mode 100644
index b409ed1..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!doctype html>
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-item</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page src="all-imports.html"></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/paper-icon-item.html b/systrace/catapult/third_party/polymer/components/paper-item/paper-icon-item.html
deleted file mode 100644
index e8f6d07..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/paper-icon-item.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/typography.html">
-<link rel="import" href="paper-item-behavior.html">
-<link rel="import" href="paper-item-shared-styles.html">
-
-<!--
-`<paper-icon-item>` is a convenience element to make an item with icon. It is an interactive list
-item with a fixed-width icon area, according to Material Design. This is useful if the icons are of
-varying widths, but you want the item bodies to line up. Use this like a `<paper-item>`. The child
-node with the attribute `item-icon` is placed in the icon area.
-
-    <paper-icon-item>
-      <iron-icon icon="favorite" item-icon></iron-icon>
-      Favorite
-    </paper-icon-item>
-    <paper-icon-item>
-      <div class="avatar" item-icon></div>
-      Avatar
-    </paper-icon-item>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property               | Description                                    | Default
-------------------------------|------------------------------------------------|----------
-`--paper-item-icon-width`     | Width of the icon area                         | `56px`
-`--paper-item-icon`           | Mixin applied to the icon area                 | `{}`
-`--paper-icon-item`           | Mixin applied to the item                      | `{}`
-`--paper-item-selected-weight`| The font weight of a selected item             | `bold`
-`--paper-item-selected`       | Mixin applied to selected paper-items                | `{}`
-`--paper-item-disabled-color` | The color for disabled paper-items             | `--disabled-text-color`
-`--paper-item-disabled`       | Mixin applied to disabled paper-items        | `{}`
-`--paper-item-focused`        | Mixin applied to focused paper-items         | `{}`
-`--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}`
--->
-
-<dom-module id="paper-icon-item">
-  <template>
-    <style include="paper-item-shared-styles"></style>
-    <style>
-      :host {
-        @apply(--layout-horizontal);
-        @apply(--layout-center);
-        @apply(--paper-font-subhead);
-
-        @apply(--paper-item);
-        @apply(--paper-icon-item);
-      }
-
-      .content-icon {
-        @apply(--layout-horizontal);
-        @apply(--layout-center);
-
-        width: var(--paper-item-icon-width, 56px);
-        @apply(--paper-item-icon);
-      }
-    </style>
-
-    <div id="contentIcon" class="content-icon">
-      <content select="[item-icon]"></content>
-    </div>
-    <content></content>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-icon-item',
-
-      behaviors: [
-        Polymer.PaperItemBehavior
-      ]
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/paper-item-behavior.html b/systrace/catapult/third_party/polymer/components/paper-item/paper-item-behavior.html
deleted file mode 100644
index f97b262..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/paper-item-behavior.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-
-<!--
-`PaperItemBehavior` is a convenience behavior shared by <paper-item> and
-<paper-icon-item> that manages the shared control states and attributes of
-the items.
--->
-
-<script>
-  /** @polymerBehavior Polymer.PaperItemBehavior */
-  Polymer.PaperItemBehaviorImpl = {
-    hostAttributes: {
-      role: 'option',
-      tabindex: '0'
-    }
-  };
-
-  /** @polymerBehavior */
-  Polymer.PaperItemBehavior = [
-    Polymer.IronButtonState,
-    Polymer.IronControlState,
-    Polymer.PaperItemBehaviorImpl
-  ];
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/paper-item-body.html b/systrace/catapult/third_party/polymer/components/paper-item/paper-item-body.html
deleted file mode 100644
index 5c46cd8..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/paper-item-body.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-styles/typography.html">
-
-<!--
-Use `<paper-item-body>` in a `<paper-item>` or `<paper-icon-item>` to make two- or
-three- line items. It is a flex item that is a vertical flexbox.
-
-    <paper-item>
-      <paper-item-body two-line>
-        <div>Show your status</div>
-        <div secondary>Your status is visible to everyone</div>
-      </paper-item-body>
-    </paper-item>
-
-The child elements with the `secondary` attribute is given secondary text styling.
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-item-body-two-line-min-height`   | Minimum height of a two-line item          | `72px`
-`--paper-item-body-three-line-min-height` | Minimum height of a three-line item        | `88px`
-`--paper-item-body-secondary-color`       | Foreground color for the `secondary` area  | `--secondary-text-color`
-`--paper-item-body-secondary`             | Mixin applied to the `secondary` area      | `{}`
-
--->
-
-<dom-module id="paper-item-body">
-  <template>
-    <style>
-      :host {
-        overflow: hidden; /* needed for text-overflow: ellipsis to work on ff */
-        @apply(--layout-vertical);
-        @apply(--layout-center-justified);
-        @apply(--layout-flex);
-      }
-
-      :host([two-line]) {
-        min-height: var(--paper-item-body-two-line-min-height, 72px);
-      }
-
-      :host([three-line]) {
-        min-height: var(--paper-item-body-three-line-min-height, 88px);
-      }
-
-      :host > ::content > * {
-        overflow: hidden;
-        text-overflow: ellipsis;
-        white-space: nowrap;
-      }
-
-      :host > ::content [secondary] {
-        @apply(--paper-font-body1);
-
-        color: var(--paper-item-body-secondary-color, --secondary-text-color);
-
-        @apply(--paper-item-body-secondary);
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-item-body'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/paper-item-shared-styles.html b/systrace/catapult/third_party/polymer/components/paper-item/paper-item-shared-styles.html
deleted file mode 100644
index 868d415..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/paper-item-shared-styles.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/color.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-styles/typography.html">
-
-<dom-module id="paper-item-shared-styles">
-  <template>
-    <style>
-      :host, .paper-item {
-        display: block;
-        position: relative;
-        min-height: var(--paper-item-min-height, 48px);
-        padding: 0px 16px;
-      }
-
-      .paper-item {
-        @apply(--paper-font-subhead);
-        border:none;
-        outline: none;
-        background: white;
-        width: 100%;
-        text-align: left;
-      }
-
-      :host([hidden]), .paper-item[hidden] {
-        display: none !important;
-      }
-
-      :host(.iron-selected), .paper-item.iron-selected {
-        font-weight: var(--paper-item-selected-weight, bold);
-
-        @apply(--paper-item-selected);
-      }
-
-      :host([disabled]), .paper-item[disabled] {
-        color: var(--paper-item-disabled-color, --disabled-text-color);
-
-        @apply(--paper-item-disabled);
-      }
-
-      :host(:focus), .paper-item:focus {
-        position: relative;
-        outline: 0;
-
-        @apply(--paper-item-focused);
-      }
-
-      :host(:focus):before, .paper-item:focus:before {
-        @apply(--layout-fit);
-
-        background: currentColor;
-        content: '';
-        opacity: var(--dark-divider-opacity);
-        pointer-events: none;
-
-        @apply(--paper-item-focused-before);
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/paper-item.html b/systrace/catapult/third_party/polymer/components/paper-item/paper-item.html
deleted file mode 100644
index 60b4692..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/paper-item.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="paper-item-behavior.html">
-<link rel="import" href="paper-item-shared-styles.html">
-
-<!--
-Material design: [Lists](https://www.google.com/design/spec/components/lists.html)
-
-`<paper-item>` is an interactive list item. By default, it is a horizontal flexbox.
-
-    <paper-item>Item</paper-item>
-
-Use this element with `<paper-item-body>` to make Material Design styled two-line and three-line
-items.
-
-    <paper-item>
-      <paper-item-body two-line>
-        <div>Show your status</div>
-        <div secondary>Your status is visible to everyone</div>
-      </paper-item-body>
-      <iron-icon icon="warning"></iron-icon>
-    </paper-item>
-
-To use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will
-already receive focus, you may want to prevent the anchor tag from receiving
-focus as well by setting its tabindex to -1.
-
-    <a href="https://www.polymer-project.org/" tabindex="-1">
-      <paper-item raised>Polymer Project</paper-item>
-    </a>
-
-If you are concerned about performance and want to use `paper-item` in a `paper-listbox`
-with many items, you can just use a native `button` with the `paper-item` class
-applied (provided you have correctly included the shared styles):
-
-    <style is="custom-style" include="paper-item-shared-styles"></style>
-
-    <paper-listbox>
-      <button class="paper-item" role="option">Inbox</button>
-      <button class="paper-item" role="option">Starred</button>
-      <button class="paper-item" role="option">Sent mail</button>
-    </paper-listbox>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property               | Description                                  | Default
-------------------------------|----------------------------------------------|----------
-`--paper-item-min-height`     | Minimum height of the item                   | `48px`
-`--paper-item`                | Mixin applied to the item                    | `{}`
-`--paper-item-selected-weight`| The font weight of a selected item           | `bold`
-`--paper-item-selected`       | Mixin applied to selected paper-items        | `{}`
-`--paper-item-disabled-color` | The color for disabled paper-items           | `--disabled-text-color`
-`--paper-item-disabled`       | Mixin applied to disabled paper-items        | `{}`
-`--paper-item-focused`        | Mixin applied to focused paper-items         | `{}`
-`--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}`
-
-### Accessibility
-
-This element has `role="listitem"` by default. Depending on usage, it may be more appropriate to set
-`role="menuitem"`, `role="menuitemcheckbox"` or `role="menuitemradio"`.
-
-    <paper-item role="menuitemcheckbox">
-      <paper-item-body>
-        Show your status
-      </paper-item-body>
-      <paper-checkbox></paper-checkbox>
-    </paper-item>
-
-@group Paper Elements
-@element paper-item
-@demo demo/index.html
--->
-
-<dom-module id="paper-item">
-  <template>
-    <style include="paper-item-shared-styles"></style>
-    <style>
-      :host {
-        @apply(--layout-horizontal);
-        @apply(--layout-center);
-        @apply(--paper-font-subhead);
-
-        @apply(--paper-item);
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-item',
-
-      behaviors: [
-        Polymer.PaperItemBehavior
-      ]
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/test/index.html b/systrace/catapult/third_party/polymer/components/paper-item/test/index.html
deleted file mode 100644
index 7029d73..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>paper-item tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'paper-item.html',
-        'paper-item.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-item/test/paper-item.html b/systrace/catapult/third_party/polymer/components/paper-item/test/paper-item.html
deleted file mode 100644
index a728d6c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-item/test/paper-item.html
+++ /dev/null
@@ -1,218 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!doctype html>
-<html>
-  <head>
-
-    <title>paper-item tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-    <link rel="import" href="../../paper-input/paper-input.html">
-    <link rel="import" href="../paper-item.html">
-    <link rel="import" href="../paper-icon-item.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="item">
-      <template>
-        <div role="listbox">
-          <paper-item>item</paper-item>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="button">
-      <template>
-        <div role="listbox">
-          <button class="paper-item" role="option">item</button>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="iconItem">
-      <template>
-        <div role="listbox">
-          <paper-icon-item>item</paper-icon-item>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="item-with-input">
-      <template>
-        <div role="list">
-          <paper-item><input></paper-item>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="item-with-paper-input">
-      <template>
-        <div role="list">
-          <paper-item><paper-input></paper-input></paper-item>
-        </div>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="iconItem-with-input">
-      <template>
-        <div role="list">
-          <paper-icon-item><input></paper-icon-item>
-        </div>
-      </template>
-    </test-fixture>
-
-    <script>
-      suite('paper-item basic', function() {
-        var item, clickHandler;
-
-        setup(function() {
-          item = fixture('item').querySelector('paper-item');
-          clickHandler = sinon.spy();
-          item.addEventListener('click', clickHandler);
-        });
-
-        test('space triggers a click event', function(done) {
-          MockInteractions.pressSpace(item);
-          Polymer.Base.async(function(){
-            // You need two ticks, one for the MockInteractions event, and one
-            // for the button event.
-            Polymer.Base.async(function(){
-              expect(clickHandler.callCount).to.be.equal(1);
-              done();
-            }, 1);
-          }, 1);
-        });
-
-        test('enter triggers a click event', function(done) {
-          MockInteractions.pressEnter(item);
-          Polymer.Base.async(function(){
-            // You need two ticks, one for the MockInteractions event, and one
-            // for the button event.
-            Polymer.Base.async(function(){
-              expect(clickHandler.callCount).to.be.equal(1);
-              done();
-            }, 1);
-          }, 1);
-        });
-      });
-
-      suite('paper-icon-item basic', function() {
-        var item, clickHandler;
-
-        setup(function() {
-          item = fixture('iconItem').querySelector('paper-icon-item');
-          clickHandler = sinon.spy();
-          item.addEventListener('click', clickHandler);
-        });
-
-        test('space triggers a click event', function(done) {
-          MockInteractions.pressSpace(item);
-          Polymer.Base.async(function(){
-            // You need two ticks, one for the MockInteractions event, and one
-            // for the button event.
-            Polymer.Base.async(function(){
-              expect(clickHandler.callCount).to.be.equal(1);
-              done();
-            }, 1);
-          }, 1);
-        });
-
-        test('click triggers a click event', function(done) {
-          MockInteractions.tap(item);
-          Polymer.Base.async(function(){
-            expect(clickHandler.callCount).to.be.equal(1);
-            done();
-          }, 1);
-        });
-      });
-
-      suite('clickable element inside item', function() {
-        test('paper-item: space in child native input does not trigger a click event', function(done) {
-          var f = fixture('item-with-input');
-          var outerItem = f.querySelector('paper-item');
-          var innerInput = f.querySelector('input');
-
-          var itemClickHandler = sinon.spy();
-          outerItem.addEventListener('click', itemClickHandler);
-
-          innerInput.focus();
-          MockInteractions.pressSpace(innerInput);
-          Polymer.Base.async(function(){
-            expect(itemClickHandler.callCount).to.be.equal(0);
-            done();
-          }, 1);
-        });
-
-        test('paper-item: space in child paper-input does not trigger a click event', function(done) {
-          var f = fixture('item-with-paper-input');
-          var outerItem = f.querySelector('paper-item');
-          var innerInput = f.querySelector('paper-input');
-
-          var itemClickHandler = sinon.spy();
-          outerItem.addEventListener('click', itemClickHandler);
-
-          innerInput.focus();
-          MockInteractions.pressSpace(innerInput);
-          Polymer.Base.async(function(){
-            expect(itemClickHandler.callCount).to.be.equal(0);
-            done();
-          }, 1);
-        });
-
-        test('paper-icon-item: space in child input does not trigger a click event', function(done) {
-          var f = fixture('iconItem-with-input');
-          var outerItem = f.querySelector('paper-icon-item');
-          var innerInput = f.querySelector('input');
-
-          var itemClickHandler = sinon.spy();
-          outerItem.addEventListener('click', itemClickHandler);
-
-          MockInteractions.pressSpace(innerInput);
-          Polymer.Base.async(function(){
-            expect(itemClickHandler.callCount).to.be.equal(0);
-            done();
-          }, 1);
-        });
-      });
-
-      suite('item a11y tests', function() {
-        var item, iconItem;
-
-        setup(function() {
-          item = fixture('item').querySelector('paper-item');
-          iconItem = fixture('iconItem').querySelector('paper-icon-item');
-        });
-
-        test('item has role="listitem"', function() {
-          assert.equal(item.getAttribute('role'), 'option', 'has role="option"');
-        });
-
-        test('icon item has role="listitem"', function() {
-          assert.equal(iconItem.getAttribute('role'), 'option', 'has role="option"');
-        });
-
-        a11ySuite('item');
-        a11ySuite('button');
-        a11ySuite('iconItem');
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-listbox/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/README.md b/systrace/catapult/third_party/polymer/components/paper-listbox/README.md
deleted file mode 100644
index 247e1ba..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/README.md
+++ /dev/null
@@ -1,70 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-listbox.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-listbox.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-listbox)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-listbox)_
-
-
-##&lt;paper-listbox&gt;
-
-Material design: [Menus](https://www.google.com/design/spec/components/menus.html)
-
-`<paper-listbox>` implements an accessible listbox control with Material Design styling. The focused item
-is highlighted, and the selected item has bolded text.
-
-```html
-<paper-listbox>
-  <paper-item>Item 1</paper-item>
-  <paper-item>Item 2</paper-item>
-</paper-listbox>
-```
-
-An initial selection can be specified with the `selected` attribute.
-
-```html
-<paper-listbox selected="0">
-  <paper-item>Item 1</paper-item>
-  <paper-item>Item 2</paper-item>
-</paper-listbox>
-```
-
-Make a multi-select listbox with the `multi` attribute. Items in a multi-select listbox can be deselected,
-and multiple item can be selected.
-
-```html
-<paper-listbox multi>
-  <paper-item>Item 1</paper-item>
-  <paper-item>Item 2</paper-item>
-</paper-listbox>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-listbox-background-color` | Menu background color | `--primary-background-color` |
-| `--paper-listbox-color` | Menu foreground color | `--primary-text-color` |
-| `--paper-listbox` | Mixin applied to the listbox | `{}` |
-
-### Accessibility
-
-`<paper-listbox>` has `role="listbox"` by default. A multi-select listbox will also have
-`aria-multiselectable` set. It implements key bindings to navigate through the listbox with the up and
-down arrow keys, esc to exit the listbox, and enter to activate a listbox item. Typing the first letter
-of a listbox item will also focus it.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/bower.json b/systrace/catapult/third_party/polymer/components/paper-listbox/bower.json
deleted file mode 100644
index 6a8be17..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "paper-listbox",
-  "version": "1.1.3",
-  "description": "Implements an accessible material design listbox",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "listbox"
-  ],
-  "main": "paper-listbox.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-listbox"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-listbox",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-collapse": "PolymerElements/iron-collapse#^1.0.0",
-    "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-listbox/demo/index.html
deleted file mode 100644
index c79e63e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/demo/index.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-listbox demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../iron-collapse/iron-collapse.html">
-  <link rel="import" href="../paper-listbox.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-
-  <style is="custom-style">
-    .horizontal-section {
-      padding: 0 !important;
-    }
-
-    .avatar {
-      display: inline-block;
-      width: 40px;
-      height: 40px;
-      border-radius: 50%;
-      overflow: hidden;
-      background: #ccc;
-    }
-
-    paper-item {
-      --paper-item: {
-        cursor: pointer;
-      };
-    }
-
-    .sublist {
-      padding-left: 20px;
-      padding-right: 20px;
-
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="horizontal-section-container">
-    <div>
-      <h4>Standard</h4>
-      <div class="horizontal-section">
-        <paper-listbox>
-          <paper-item>Inbox</paper-item>
-          <paper-item>Starred</paper-item>
-          <paper-item>Sent mail</paper-item>
-          <paper-item>Drafts</paper-item>
-        </paper-listbox>
-      </div>
-    </div>
-
-    <div>
-      <h4>Pre-selected</h4>
-      <div class="horizontal-section">
-        <paper-listbox selected="0">
-          <paper-item>Inbox</paper-item>
-          <paper-item disabled>Starred</paper-item>
-          <paper-item>Sent mail</paper-item>
-          <paper-item>Drafts</paper-item>
-        </paper-listbox>
-      </div>
-    </div>
-
-    <div>
-      <h4>Multi-select</h4>
-      <div class="horizontal-section">
-        <paper-listbox multi>
-          <paper-item>Bold</paper-item>
-          <paper-item>Italic</paper-item>
-          <paper-item>Underline</paper-item>
-          <paper-item>Strikethrough</paper-item>
-        </paper-listbox>
-      </div>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/hero.svg b/systrace/catapult/third_party/polymer/components/paper-listbox/hero.svg
deleted file mode 100755
index eaa0fb5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/hero.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<g>

-		<circle cx="86.5" cy="39" r="4"/>

-		<path d="M138,44c-2,0-3.6-2.4-4.6-4.6c-1.1-2.1-1.7-3.4-3-3.4s-2,1.3-3,3.4c-1.1,2.1-2.2,4.6-4.9,4.6c-2.6,0-3.8-2.4-4.9-4.6

-			c-1.1-2.1-1.8-3.4-3.1-3.4c-1.3,0-2,1.3-3.1,3.4c-1.1,2.1-2.3,4.6-4.9,4.6c-2.6,0-4.1-2.4-5.1-4.6C100.3,37.3,100,36,98,36v-2

-			c3,0,4.1,2.4,5.1,4.6c1.1,2.1,1.9,3.4,3.2,3.4c1.3,0,2.1-1.3,3.2-3.4c1.1-2.1,2.3-4.6,4.9-4.6c2.6,0,3.8,2.4,4.9,4.6

-			c1.1,2.1,1.8,3.4,3.1,3.4c1.3,0,2-1.3,3.1-3.4c1.1-2.1,2.3-4.6,4.9-4.6s3.6,2.4,4.6,4.6c1.1,2.1,1.9,3.4,2.9,3.4V44z"/>

-		<circle cx="86.5" cy="63" r="4"/>

-		<path d="M138,68c-2,0-3.6-2.4-4.6-4.6c-1.1-2.1-1.7-3.4-3-3.4s-2,1.3-3,3.4c-1.1,2.1-2.2,4.6-4.9,4.6c-2.6,0-3.8-2.4-4.9-4.6

-			c-1.1-2.1-1.8-3.4-3.1-3.4c-1.3,0-2,1.3-3.1,3.4c-1.1,2.1-2.3,4.6-4.9,4.6c-2.6,0-4.1-2.4-5.1-4.6C100.3,61.3,100,60,98,60v-2

-			c3,0,4.1,2.4,5.1,4.6c1.1,2.1,1.9,3.4,3.2,3.4c1.3,0,2.1-1.3,3.2-3.4c1.1-2.1,2.3-4.6,4.9-4.6c2.6,0,3.8,2.4,4.9,4.6

-			c1.1,2.1,1.8,3.4,3.1,3.4c1.3,0,2-1.3,3.1-3.4c1.1-2.1,2.3-4.6,4.9-4.6s3.6,2.4,4.6,4.6c1.1,2.1,1.9,3.4,2.9,3.4V68z"/>

-		<circle cx="86.5" cy="88" r="4"/>

-		<path d="M138,93c-2,0-3.6-2.4-4.6-4.6c-1.1-2.1-1.7-3.4-3-3.4s-2,1.3-3,3.4c-1.1,2.1-2.2,4.6-4.9,4.6c-2.6,0-3.8-2.4-4.9-4.6

-			c-1.1-2.1-1.8-3.4-3.1-3.4c-1.3,0-2,1.3-3.1,3.4c-1.1,2.1-2.3,4.6-4.9,4.6c-2.6,0-4.1-2.4-5.1-4.6C100.3,86.3,100,85,98,85v-2

-			c3,0,4.1,2.4,5.1,4.6c1.1,2.1,1.9,3.4,3.2,3.4c1.3,0,2.1-1.3,3.2-3.4c1.1-2.1,2.3-4.6,4.9-4.6c2.6,0,3.8,2.4,4.9,4.6

-			c1.1,2.1,1.8,3.4,3.1,3.4c1.3,0,2-1.3,3.1-3.4c1.1-2.1,2.3-4.6,4.9-4.6s3.6,2.4,4.6,4.6c1.1,2.1,1.9,3.4,2.9,3.4V93z"/>

-		<path d="M151,102H73V24h78V102z M75,100h74V26H75V100z"/>

-	</g>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/index.html b/systrace/catapult/third_party/polymer/components/paper-listbox/index.html
deleted file mode 100644
index b9dad4b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-listbox</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/paper-listbox.html b/systrace/catapult/third_party/polymer/components/paper-listbox/paper-listbox.html
deleted file mode 100644
index 15d6cf0..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/paper-listbox.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-menu-behavior/iron-menu-behavior.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-
-<!--
-Material design: [Menus](https://www.google.com/design/spec/components/menus.html)
-
-`<paper-listbox>` implements an accessible listbox control with Material Design styling. The focused item
-is highlighted, and the selected item has bolded text.
-
-    <paper-listbox>
-      <paper-item>Item 1</paper-item>
-      <paper-item>Item 2</paper-item>
-    </paper-listbox>
-
-An initial selection can be specified with the `selected` attribute.
-
-    <paper-listbox selected="0">
-      <paper-item>Item 1</paper-item>
-      <paper-item>Item 2</paper-item>
-    </paper-listbox>
-
-Make a multi-select listbox with the `multi` attribute. Items in a multi-select listbox can be deselected,
-and multiple item can be selected.
-
-    <paper-listbox multi>
-      <paper-item>Item 1</paper-item>
-      <paper-item>Item 2</paper-item>
-    </paper-listbox>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-listbox-background-color`   | Menu background color                                            | `--primary-background-color`
-`--paper-listbox-color`              | Menu foreground color                                            | `--primary-text-color`
-`--paper-listbox`                    | Mixin applied to the listbox                                        | `{}`
-
-### Accessibility
-
-`<paper-listbox>` has `role="listbox"` by default. A multi-select listbox will also have
-`aria-multiselectable` set. It implements key bindings to navigate through the listbox with the up and
-down arrow keys, esc to exit the listbox, and enter to activate a listbox item. Typing the first letter
-of a listbox item will also focus it.
-
-@group Paper Elements
-@element paper-listbox
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-listbox">
-  <template>
-    <style>
-      :host {
-        display: block;
-        padding: 8px 0;
-
-        background: var(--paper-listbox-background-color, --primary-background-color);
-        color: var(--paper-listbox-color, --primary-text-color);
-
-        @apply(--paper-listbox);
-      }
-    </style>
-
-    <content></content>
-  </template>
-
-  <script>
-    (function() {
-      Polymer({
-        is: 'paper-listbox',
-
-        behaviors: [
-          Polymer.IronMenuBehavior
-        ],
-
-        hostAttributes: {
-          role: 'listbox'
-        }
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/test/index.html b/systrace/catapult/third_party/polymer/components/paper-listbox/test/index.html
deleted file mode 100644
index 59a5e2b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/test/index.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>paper-listbox tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-
-      WCT.loadSuites([
-        'paper-listbox.html'
-      ]);
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-listbox/test/paper-listbox.html b/systrace/catapult/third_party/polymer/components/paper-listbox/test/paper-listbox.html
deleted file mode 100644
index 58a4fa3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-listbox/test/paper-listbox.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>paper-listbox tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-
-    <link rel="import" href="../paper-listbox.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <paper-listbox selected="0">
-          <div role="option">item 1</div>
-          <div role="option">item 2</div>
-          <div role="option">item 3</div>
-        </paper-listbox>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('<paper-listbox>', function() {
-        var listbox;
-
-        setup(function() {
-          listbox = fixture('basic');
-        });
-
-        test('selected item has an appropriate className', function(done) {
-          Polymer.Base.async(function() {
-            assert(listbox.selectedItem.classList.contains('iron-selected'));
-            done();
-          }, 1);
-        });
-
-        test('has listbox aria role', function() {
-          assert(listbox.getAttribute('role') === 'listbox');
-        });
-
-        a11ySuite('basic');
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-material/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/README.md b/systrace/catapult/third_party/polymer/components/paper-material/README.md
deleted file mode 100644
index d1ad738..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-material.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-material.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-material)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-material)_
-
-
-##&lt;paper-material&gt;
-
-Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
-
-`paper-material` is a container that renders two shadows on top of each other to
-create the effect of a lifted piece of paper.
-
-Example:
-
-```html
-<paper-material elevation="1">
-  ... content ...
-</paper-material>
-```
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/bower.json b/systrace/catapult/third_party/polymer/components/paper-material/bower.json
deleted file mode 100644
index 2abf2f9..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "paper-material",
-  "version": "1.0.7",
-  "description": "A material design container that looks like a lifted sheet of paper",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "paper",
-    "container"
-  ],
-  "main": "paper-material.html",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-material"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-material",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "paper-styles": "polymerelements/paper-styles#^1.0.0"
-  },
-  "devDependencies": {
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-material/demo/index.html
deleted file mode 100644
index c0b6d39..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/demo/index.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>paper-material demo</title>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../paper-material.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    paper-material {
-      display: inline-block;
-      background: white;
-      box-sizing: border-box;
-      margin: 8px;
-      padding: 16px;
-      border-radius: 2px;
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Paper-materials can have different elevations</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-material elevation="0">0</paper-material>
-        <paper-material elevation="1">1</paper-material>
-        <paper-material elevation="2">2</paper-material>
-        <paper-material elevation="3">3</paper-material>
-        <paper-material elevation="4">4</paper-material>
-        <paper-material elevation="5">5</paper-material>
-      </template>
-    </demo-snippet>
-
-    <h3>Changes in elevation can be animated</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style>
-          #a1, #a2 { cursor: pointer; }
-        </style>
-        Tap each of these boxes!
-        <div>
-          <paper-material elevation="0" animated id="a1">animated</paper-material>
-          <paper-material elevation="3" id="a2">not animated</paper-material>
-        </div>
-        <script>
-          document.addEventListener('WebComponentsReady', function() {
-            a1.addEventListener('click', _onTap);
-            a2.addEventListener('click', _onTap);
-          });
-          function _onTap(e) {
-            var target = e.target;
-            if (!target.down) {
-              target.elevation += 1;
-              if (target.elevation === 5) {
-                target.down = true;
-              }
-            } else {
-              target.elevation -= 1;
-              if (target.elevation === 0) {
-                target.down = false;
-              }
-            }
-          };
-        </script>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/index.html b/systrace/catapult/third_party/polymer/components/paper-material/index.html
deleted file mode 100644
index 7209e6d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-material</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/paper-material-shared-styles.html b/systrace/catapult/third_party/polymer/components/paper-material/paper-material-shared-styles.html
deleted file mode 100644
index b795f4f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/paper-material-shared-styles.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../paper-styles/shadow.html">
-
-<dom-module id="paper-material-shared-styles">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: relative;
-      }
-
-      :host([elevation="1"]) {
-        @apply(--shadow-elevation-2dp);
-      }
-
-      :host([elevation="2"]) {
-        @apply(--shadow-elevation-4dp);
-      }
-
-      :host([elevation="3"]) {
-        @apply(--shadow-elevation-6dp);
-      }
-
-      :host([elevation="4"]) {
-        @apply(--shadow-elevation-8dp);
-      }
-
-      :host([elevation="5"]) {
-        @apply(--shadow-elevation-16dp);
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/paper-material.html b/systrace/catapult/third_party/polymer/components/paper-material/paper-material.html
deleted file mode 100644
index 29b3437..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/paper-material.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-styles/shadow.html">
-<link rel="import" href="paper-material-shared-styles.html">
-
-<!--
-Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
-
-`paper-material` is a container that renders two shadows on top of each other to
-create the effect of a lifted piece of paper.
-
-Example:
-
-    <paper-material elevation="1">
-      ... content ...
-    </paper-material>
-
-@group Paper Elements
-@demo demo/index.html
--->
-
-<dom-module id="paper-material">
-  <template>
-    <style include="paper-material-shared-styles"></style>
-    <style>
-      :host([animated]) {
-        @apply(--shadow-transition);
-      }
-      :host {
-        @apply(--paper-material);
-      }
-    </style>
-
-    <content></content>
-  </template>
-</dom-module>
-<script>
-  Polymer({
-    is: 'paper-material',
-
-    properties: {
-      /**
-       * The z-depth of this element, from 0-5. Setting to 0 will remove the
-       * shadow, and each increasing number greater than 0 will be "deeper"
-       * than the last.
-       *
-       * @attribute elevation
-       * @type number
-       * @default 1
-       */
-      elevation: {
-        type: Number,
-        reflectToAttribute: true,
-        value: 1
-      },
-
-      /**
-       * Set this to true to animate the shadow when setting a new
-       * `elevation` value.
-       *
-       * @attribute animated
-       * @type boolean
-       * @default false
-       */
-      animated: {
-        type: Boolean,
-        reflectToAttribute: true,
-        value: false
-      }
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/test/index.html b/systrace/catapult/third_party/polymer/components/paper-material/test/index.html
deleted file mode 100644
index 08fda47..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-material tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-material.html',
-      'paper-material.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-material/test/paper-material.html b/systrace/catapult/third_party/polymer/components/paper-material/test/paper-material.html
deleted file mode 100644
index 7949c11..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-material/test/paper-material.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-material basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <link href="../paper-material.html" rel="import">
-
-</head>
-<body>
-  <test-fixture id="TrivialCard">
-    <template>
-      <paper-material elevation="1"></paper-material>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="ProgressiveElevations">
-    <template>
-      <paper-material elevation="1"></paper-material>
-      <paper-material elevation="2"></paper-material>
-      <paper-material elevation="3"></paper-material>
-      <paper-material elevation="4"></paper-material>
-      <paper-material elevation="5"></paper-material>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('<paper-material>', function() {
-      suite('with a non-zero elevation attribute', function() {
-        var style;
-        var card;
-
-        setup(function() {
-          card = fixture('TrivialCard');
-          style = window.getComputedStyle(card);
-        });
-
-        test('has a shadow', function() {
-          expect(style.boxShadow).to.be.ok;
-          expect(style.boxShadow).to.not.be.eql('none');
-        });
-
-        test('loses shadow with elevation value 0', function() {
-          card.elevation = 0;
-          expect(style.boxShadow).to.be.eql('none');
-        });
-      });
-
-      suite('progressively increasing values of elevation', function() {
-        var cards;
-
-        setup(function() {
-          cards = fixture('ProgressiveElevations');
-        });
-
-        test('yield progressively "deeper" cards', function() {
-          var lastStyle;
-          var style;
-
-          expect(cards.length).to.be.eql(5);
-
-          cards.forEach(function (card) {
-            style = window.getComputedStyle(card);
-
-            expect(style.boxShadow).to.be.ok;
-            expect(style.boxShadow).to.not.be.eql('none');
-            expect(style.boxShadow).to.not.be.eql(lastStyle && lastStyle.boxShadow);
-
-            lastStyle = style;
-          });
-        });
-      });
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-menu-button/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/README.md b/systrace/catapult/third_party/polymer/components/paper-menu-button/README.md
deleted file mode 100644
index 4e45429..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/README.md
+++ /dev/null
@@ -1,69 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-menu-button-animations.html  paper-menu-button.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-menu-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-menu-button)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-menu-button)_
-
-
-##&lt;paper-menu-button&gt;
-
-Material design: [Dropdown buttons](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)
-
-`paper-menu-button` allows one to compose a designated "trigger" element with
-another element that represents "content", to create a dropdown menu that
-displays the "content" when the "trigger" is clicked.
-
-The child element with the class `dropdown-trigger` will be used as the
-"trigger" element. The child element with the class `dropdown-content` will be
-used as the "content" element.
-
-The `paper-menu-button` is sensitive to its content's `iron-select` events. If
-the "content" element triggers an `iron-select` event, the `paper-menu-button`
-will close automatically.
-
-Example:
-
-```html
-<paper-menu-button>
-  <paper-icon-button icon="menu" class="dropdown-trigger"></paper-icon-button>
-  <paper-menu class="dropdown-content">
-    <paper-item>Share</paper-item>
-    <paper-item>Settings</paper-item>
-    <paper-item>Help</paper-item>
-  </paper-menu>
-</paper-menu-button>
-```
-
-### Styling
-
-The following custom properties and mixins are also available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-menu-button-dropdown-background` | Background color of the paper-menu-button dropdown | `--primary-background-color` |
-| `--paper-menu-button` | Mixin applied to the paper-menu-button | `{}` |
-| `--paper-menu-button-disabled` | Mixin applied to the paper-menu-button when disabled | `{}` |
-| `--paper-menu-button-dropdown` | Mixin applied to the paper-menu-button dropdown | `{}` |
-| `--paper-menu-button-content` | Mixin applied to the paper-menu-button content | `{}` |
-
-
-
-<!-- No docs for <paper-menu-grow-height-animation> found. -->
-
-<!-- No docs for <paper-menu-grow-width-animation> found. -->
-
-<!-- No docs for <paper-menu-shrink-height-animation> found. -->
-
-<!-- No docs for <paper-menu-shrink-width-animation> found. -->
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/bower.json b/systrace/catapult/third_party/polymer/components/paper-menu-button/bower.json
deleted file mode 100644
index f930aaf..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/bower.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "paper-menu-button",
-  "version": "1.5.2",
-  "description": "A material design element that composes a trigger and a dropdown menu",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "web-component",
-    "polymer",
-    "menu",
-    "button"
-  ],
-  "main": "paper-menu-button.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-menu-button.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-menu-button",
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-dropdown": "PolymerElements/iron-dropdown#^1.0.0",
-    "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.2.0",
-    "neon-animation": "PolymerElements/neon-animation#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-icons": "PolymerElements/iron-icons#^1.0.0",
-    "iron-image": "PolymerElements/iron-image#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "paper-menu": "PolymerElements/paper-menu#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-menu-button/demo/index.html
deleted file mode 100644
index e439951..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/demo/index.html
+++ /dev/null
@@ -1,203 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-menu-button</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../../iron-icon/iron-icon.html">
-  <link rel="import" href="../../iron-image/iron-image.html">
-  <link rel="import" href="../../paper-menu/paper-menu.html">
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-
-  <link rel="import" href="../paper-menu-button.html">
-
-  <style is="custom-style">
-    paper-button {
-      display: block;
-      background: #4285f4;
-      color: #fff;
-    }
-
-    paper-menu {
-      display: block;
-    }
-
-    paper-menu-button {
-      margin: auto;
-    }
-
-    iron-image {
-      padding: 1em;
-    }
-
-    .item {
-      max-width: 300px;
-    }
-
-    .horizontal-section {
-      text-align: center;
-    }
-  </style>
-
-</head>
-<body unresolved>
-
-
-  <template id="Demo" is="dom-bind">
-
-    <div class="horizontal-section-container">
-      <div>
-        <h4>Paper Icon Button + Paper Menu</h4>
-        <div class="horizontal-section">
-          <paper-menu-button>
-            <paper-icon-button icon="menu" class="dropdown-trigger" alt="menu"></paper-icon-button>
-            <paper-menu class="dropdown-content">
-              <template is="dom-repeat" items="[[letters]]" as="letter">
-                <paper-item>[[letter]]</paper-item>
-              </template>
-            </paper-menu>
-          </paper-menu-button>
-        </div>
-      </div>
-    </div>
-
-    <div class="horizontal-section-container">
-      <div>
-        <h4>Paper Menu with multi selection</h4>
-        <div class="horizontal-section">
-          <paper-menu-button ignore-select>
-            <paper-icon-button icon="menu" class="dropdown-trigger" alt="multi select"></paper-icon-button>
-            <paper-menu class="dropdown-content" multi>
-              <template is="dom-repeat" items="[[letters]]" as="letter">
-                <paper-item>[[letter]]</paper-item>
-              </template>
-            </paper-menu>
-          </paper-menu-button>
-        </div>
-      </div>
-    </div>
-
-    <div class="horizontal-section-container">
-      <div>
-        <h4>Disabled</h4>
-        <div class="horizontal-section">
-          <paper-menu-button disabled>
-            <paper-icon-button icon="menu" class="dropdown-trigger" alt="menu"></paper-icon-button>
-            <paper-menu class="dropdown-content">
-              <template is="dom-repeat" items="[[letters]]" as="letter">
-                <paper-item>[[letter]]</paper-item>
-              </template>
-            </paper-menu>
-          </paper-menu-button>
-        </div>
-      </div>
-    </div>
-
-    <div class="horizontal-section-container">
-      <div>
-        <h4>Alternate Alignment</h4>
-        <div class="horizontal-section">
-          <paper-menu-button vertical-align="bottom" horizontal-align="right">
-            <paper-icon-button icon="menu" class="dropdown-trigger" alt="bottom align"></paper-icon-button>
-            <paper-menu class="dropdown-content">
-              <template is="dom-repeat" items="[[letters]]" as="letter">
-                <paper-item>[[letter]]</paper-item>
-              </template>
-            </paper-menu>
-          </paper-menu-button>
-        </div>
-      </div>
-    </div>
-
-    <div class="horizontal-section-container">
-      <div>
-        <h4>Alternate Button</h4>
-        <div class="horizontal-section">
-          <paper-menu-button>
-            <paper-button class="dropdown-trigger" raised>
-              <iron-icon icon="check"></iron-icon>
-              <span>Dinosaurs</span>
-            </paper-button>
-            <paper-menu class="dropdown-content">
-              <template is="dom-repeat" items="[[dinosaurs]]" as="dinosaur">
-                <paper-item>[[dinosaur]]</paper-item>
-              </template>
-            </paper-menu>
-          </paper-menu-button>
-        </div>
-      </div>
-    </div>
-
-    <div class="horizontal-section-container">
-      <div>
-        <h4>Alternate Content</h4>
-        <div class="horizontal-section">
-          <paper-menu-button vertical-align="bottom">
-            <paper-icon-button class="dropdown-trigger" icon="polymer" alt="polymer"></paper-icon-button>
-            <iron-image class="dropdown-content" src="../../iron-image/demo/polymer.svg"></iron-image>
-          </paper-menu-button>
-        </div>
-      </div>
-    </div>
-  </template>
-
-  <script>
-    Demo.letters = [
-      'alpha',
-      'beta',
-      'gamma',
-      'delta',
-      'epsilon'
-    ];
-    Demo.dinosaurs = [
-      'allosaurus',
-      'brontosaurus',
-      'carcharodontosaurus',
-      'diplodocus',
-      'ekrixinatosaurus',
-      'fukuiraptor',
-      'gallimimus',
-      'hadrosaurus',
-      'iguanodon',
-      'jainosaurus',
-      'kritosaurus',
-      'liaoceratops',
-      'megalosaurus',
-      'nemegtosaurus',
-      'ornithomimus',
-      'protoceratops',
-      'quetecsaurus',
-      'rajasaurus',
-      'stegosaurus',
-      'triceratops',
-      'utahraptor',
-      'vulcanodon',
-      'wannanosaurus',
-      'xenoceratops',
-      'yandusaurus',
-      'zephyrosaurus'
-    ];
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/hero.svg b/systrace/catapult/third_party/polymer/components/paper-menu-button/hero.svg
deleted file mode 100755
index b67f817..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/hero.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<circle cx="109" cy="45" r="4"/>

-	<path d="M165,50c-2.8,0-4.1-2.4-5.3-4.5c-1.2-2.2-2-3.5-3.5-3.5c-1.5,0-2.3,1.3-3.5,3.5c-1.2,2.1-2.5,4.5-5.3,4.5

-		c-2.8,0-4.1-2.4-5.3-4.5c-1.2-2.2-2-3.5-3.5-3.5c-1.5,0-2.3,1.3-3.5,3.5c-1.2,2.1-2.5,4.5-5.3,4.5c-2.8,0-4.1-2.4-5.3-4.5

-		c-1.2-2.2-2-3.5-3.5-3.5v-2c2.8,0,4.1,2.4,5.3,4.5c1.2,2.2,2,3.5,3.5,3.5c1.5,0,2.3-1.3,3.5-3.5c1.2-2.1,2.5-4.5,5.3-4.5

-		c2.8,0,4.1,2.4,5.3,4.5c1.2,2.2,2,3.5,3.5,3.5c1.5,0,2.3-1.3,3.5-3.5c1.2-2.1,2.5-4.5,5.3-4.5s4.1,2.4,5.3,4.5

-		c1.2,2.2,2,3.5,3.5,3.5V50z"/>

-	<circle cx="109" cy="63" r="4"/>

-	<path d="M165,68c-2.8,0-4.1-2.4-5.3-4.5c-1.2-2.2-2-3.5-3.5-3.5c-1.5,0-2.3,1.3-3.5,3.5c-1.2,2.1-2.5,4.5-5.3,4.5

-		c-2.8,0-4.1-2.4-5.3-4.5c-1.2-2.2-2-3.5-3.5-3.5c-1.5,0-2.3,1.3-3.5,3.5c-1.2,2.1-2.5,4.5-5.3,4.5c-2.8,0-4.1-2.4-5.3-4.5

-		c-1.2-2.2-2-3.5-3.5-3.5v-2c2.8,0,4.1,2.4,5.3,4.5c1.2,2.2,2,3.5,3.5,3.5c1.5,0,2.3-1.3,3.5-3.5c1.2-2.1,2.5-4.5,5.3-4.5

-		c2.8,0,4.1,2.4,5.3,4.5c1.2,2.2,2,3.5,3.5,3.5c1.5,0,2.3-1.3,3.5-3.5c1.2-2.1,2.5-4.5,5.3-4.5s4.1,2.4,5.3,4.5

-		c1.2,2.2,2,3.5,3.5,3.5V68z"/>

-	<circle cx="109" cy="81" r="4"/>

-	<path d="M165,86c-2.8,0-4.1-2.4-5.3-4.5c-1.2-2.2-2-3.5-3.5-3.5c-1.5,0-2.3,1.3-3.5,3.5c-1.2,2.1-2.5,4.5-5.3,4.5

-		c-2.8,0-4.1-2.4-5.3-4.5c-1.2-2.2-2-3.5-3.5-3.5c-1.5,0-2.3,1.3-3.5,3.5c-1.2,2.1-2.5,4.5-5.3,4.5c-2.8,0-4.1-2.4-5.3-4.5

-		c-1.2-2.2-2-3.5-3.5-3.5v-2c2.8,0,4.1,2.4,5.3,4.5c1.2,2.2,2,3.5,3.5,3.5c1.5,0,2.3-1.3,3.5-3.5c1.2-2.1,2.5-4.5,5.3-4.5

-		c2.8,0,4.1,2.4,5.3,4.5c1.2,2.2,2,3.5,3.5,3.5c1.5,0,2.3-1.3,3.5-3.5c1.2-2.1,2.5-4.5,5.3-4.5s4.1,2.4,5.3,4.5

-		c1.2,2.2,2,3.5,3.5,3.5V86z"/>

-	<path d="M176,98H94V28h82V98z M96,96h78V30H96V96z"/>

-	<circle cx="65" cy="61" r="8"/>

-	<path d="M82,78H48V44h34V78z M50,76h30V46H50V76z"/>

-	<rect x="81" y="58" width="14" height="2"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/index.html b/systrace/catapult/third_party/polymer/components/paper-menu-button/index.html
deleted file mode 100644
index 040b195..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
-The complete set of authors may be found at http://polymer.github.io/AUTHORS
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
--->
-<html>
-<head>
-
-  <title>paper-menu-button</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/paper-menu-button-animations.html b/systrace/catapult/third_party/polymer/components/paper-menu-button/paper-menu-button-animations.html
deleted file mode 100644
index b1339f2..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/paper-menu-button-animations.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../neon-animation/web-animations.html">
-<link rel="import" href="../neon-animation/neon-animation-behavior.html">
-<script>
-  Polymer({
-    is: 'paper-menu-grow-height-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      var rect = node.getBoundingClientRect();
-      var height = rect.height;
-
-      this._effect = new KeyframeEffect(node, [{
-        height: (height / 2) + 'px'
-      }, {
-        height: height + 'px'
-      }], this.timingFromConfig(config));
-
-      return this._effect;
-    }
-  });
-
-  Polymer({
-    is: 'paper-menu-grow-width-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      var rect = node.getBoundingClientRect();
-      var width = rect.width;
-
-      this._effect = new KeyframeEffect(node, [{
-        width: (width / 2) + 'px'
-      }, {
-        width: width + 'px'
-      }], this.timingFromConfig(config));
-
-      return this._effect;
-    }
-  });
-
-  Polymer({
-    is: 'paper-menu-shrink-width-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      var rect = node.getBoundingClientRect();
-      var width = rect.width;
-
-      this._effect = new KeyframeEffect(node, [{
-        width: width + 'px'
-      }, {
-        width: width - (width / 20) + 'px'
-      }], this.timingFromConfig(config));
-
-      return this._effect;
-    }
-  });
-
-  Polymer({
-    is: 'paper-menu-shrink-height-animation',
-
-    behaviors: [
-      Polymer.NeonAnimationBehavior
-    ],
-
-    configure: function(config) {
-      var node = config.node;
-      var rect = node.getBoundingClientRect();
-      var height = rect.height;
-      var top = rect.top;
-
-      this.setPrefixedProperty(node, 'transformOrigin', '0 0');
-
-      this._effect = new KeyframeEffect(node, [{
-        height: height + 'px',
-        transform: 'translateY(0)'
-      }, {
-        height: height / 2 + 'px',
-        transform: 'translateY(-20px)'
-      }], this.timingFromConfig(config));
-
-      return this._effect;
-    }
-  });
-</script>
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/paper-menu-button.html b/systrace/catapult/third_party/polymer/components/paper-menu-button/paper-menu-button.html
deleted file mode 100644
index 7bb4c74..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/paper-menu-button.html
+++ /dev/null
@@ -1,479 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-dropdown/iron-dropdown.html">
-<link rel="import" href="../neon-animation/animations/fade-in-animation.html">
-<link rel="import" href="../neon-animation/animations/fade-out-animation.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../paper-styles/shadow.html">
-<link rel="import" href="paper-menu-button-animations.html">
-
-<!--
-Material design: [Dropdown buttons](https://www.google.com/design/spec/components/buttons.html#buttons-dropdown-buttons)
-
-`paper-menu-button` allows one to compose a designated "trigger" element with
-another element that represents "content", to create a dropdown menu that
-displays the "content" when the "trigger" is clicked.
-
-The child element with the class `dropdown-trigger` will be used as the
-"trigger" element. The child element with the class `dropdown-content` will be
-used as the "content" element.
-
-The `paper-menu-button` is sensitive to its content's `iron-select` events. If
-the "content" element triggers an `iron-select` event, the `paper-menu-button`
-will close automatically.
-
-Example:
-
-    <paper-menu-button>
-      <paper-icon-button icon="menu" class="dropdown-trigger"></paper-icon-button>
-      <paper-menu class="dropdown-content">
-        <paper-item>Share</paper-item>
-        <paper-item>Settings</paper-item>
-        <paper-item>Help</paper-item>
-      </paper-menu>
-    </paper-menu-button>
-
-### Styling
-
-The following custom properties and mixins are also available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-menu-button-dropdown-background` | Background color of the paper-menu-button dropdown | `--primary-background-color`
-`--paper-menu-button` | Mixin applied to the paper-menu-button | `{}`
-`--paper-menu-button-disabled` | Mixin applied to the paper-menu-button when disabled | `{}`
-`--paper-menu-button-dropdown` | Mixin applied to the paper-menu-button dropdown | `{}`
-`--paper-menu-button-content` | Mixin applied to the paper-menu-button content | `{}`
-
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-menu-button">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-        position: relative;
-        padding: 8px;
-        outline: none;
-
-        @apply(--paper-menu-button);
-      }
-
-      :host([disabled]) {
-        cursor: auto;
-        color: var(--disabled-text-color);
-
-        @apply(--paper-menu-button-disabled);
-      }
-
-      iron-dropdown {
-        @apply(--paper-menu-button-dropdown);
-      }
-
-      .dropdown-content {
-        @apply(--shadow-elevation-2dp);
-
-        position: relative;
-        border-radius: 2px;
-        background-color: var(--paper-menu-button-dropdown-background, --primary-background-color);
-
-        @apply(--paper-menu-button-content);
-      }
-
-      :host([vertical-align="top"]) .dropdown-content {
-        margin-bottom: 20px;
-        margin-top: -10px;
-        top: 10px;
-      }
-
-      :host([vertical-align="bottom"]) .dropdown-content {
-        bottom: 10px;
-        margin-bottom: -10px;
-        margin-top: 20px;
-      }
-      
-      #trigger {
-        cursor: pointer;
-      }
-    </style>
-
-    <div id="trigger" on-tap="toggle">
-      <content select=".dropdown-trigger"></content>
-    </div>
-
-    <iron-dropdown
-      id="dropdown"
-      opened="{{opened}}"
-      horizontal-align="[[horizontalAlign]]"
-      vertical-align="[[verticalAlign]]"
-      dynamic-align="[[dynamicAlign]]"
-      horizontal-offset="[[horizontalOffset]]"
-      vertical-offset="[[verticalOffset]]"
-      no-overlap="[[noOverlap]]"
-      open-animation-config="[[openAnimationConfig]]"
-      close-animation-config="[[closeAnimationConfig]]"
-      no-animations="[[noAnimations]]"
-      focus-target="[[_dropdownContent]]"
-      allow-outside-scroll="[[allowOutsideScroll]]"
-      restore-focus-on-close="[[restoreFocusOnClose]]"
-      on-iron-overlay-canceled="__onIronOverlayCanceled">
-      <div class="dropdown-content">
-        <content id="content" select=".dropdown-content"></content>
-      </div>
-    </iron-dropdown>
-  </template>
-
-  <script>
-    (function() {
-      'use strict';
-
-      var config = {
-        ANIMATION_CUBIC_BEZIER: 'cubic-bezier(.3,.95,.5,1)',
-        MAX_ANIMATION_TIME_MS: 400
-      };
-
-      var PaperMenuButton = Polymer({
-        is: 'paper-menu-button',
-
-        /**
-         * Fired when the dropdown opens.
-         *
-         * @event paper-dropdown-open
-         */
-
-        /**
-         * Fired when the dropdown closes.
-         *
-         * @event paper-dropdown-close
-         */
-
-        behaviors: [
-          Polymer.IronA11yKeysBehavior,
-          Polymer.IronControlState
-        ],
-
-        properties: {
-          /**
-           * True if the content is currently displayed.
-           */
-          opened: {
-            type: Boolean,
-            value: false,
-            notify: true,
-            observer: '_openedChanged'
-          },
-
-          /**
-           * The orientation against which to align the menu dropdown
-           * horizontally relative to the dropdown trigger.
-           */
-          horizontalAlign: {
-            type: String,
-            value: 'left',
-            reflectToAttribute: true
-          },
-
-          /**
-           * The orientation against which to align the menu dropdown
-           * vertically relative to the dropdown trigger.
-           */
-          verticalAlign: {
-            type: String,
-            value: 'top',
-            reflectToAttribute: true
-          },
-
-          /**
-           * If true, the `horizontalAlign` and `verticalAlign` properties will
-           * be considered preferences instead of strict requirements when
-           * positioning the dropdown and may be changed if doing so reduces
-           * the area of the dropdown falling outside of `fitInto`.
-           */
-          dynamicAlign: {
-            type: Boolean
-          },
-
-          /**
-           * A pixel value that will be added to the position calculated for the
-           * given `horizontalAlign`. Use a negative value to offset to the
-           * left, or a positive value to offset to the right.
-           */
-          horizontalOffset: {
-            type: Number,
-            value: 0,
-            notify: true
-          },
-
-          /**
-           * A pixel value that will be added to the position calculated for the
-           * given `verticalAlign`. Use a negative value to offset towards the
-           * top, or a positive value to offset towards the bottom.
-           */
-          verticalOffset: {
-            type: Number,
-            value: 0,
-            notify: true
-          },
-
-          /**
-           * If true, the dropdown will be positioned so that it doesn't overlap
-           * the button.
-           */
-          noOverlap: {
-            type: Boolean
-          },
-
-          /**
-           * Set to true to disable animations when opening and closing the
-           * dropdown.
-           */
-          noAnimations: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Set to true to disable automatically closing the dropdown after
-           * a selection has been made.
-           */
-          ignoreSelect: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Set to true to enable automatically closing the dropdown after an
-           * item has been activated, even if the selection did not change.
-           */
-          closeOnActivate: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * An animation config. If provided, this will be used to animate the
-           * opening of the dropdown.
-           */
-          openAnimationConfig: {
-            type: Object,
-            value: function() {
-              return [{
-                name: 'fade-in-animation',
-                timing: {
-                  delay: 100,
-                  duration: 200
-                }
-              }, {
-                name: 'paper-menu-grow-width-animation',
-                timing: {
-                  delay: 100,
-                  duration: 150,
-                  easing: config.ANIMATION_CUBIC_BEZIER
-                }
-              }, {
-                name: 'paper-menu-grow-height-animation',
-                timing: {
-                  delay: 100,
-                  duration: 275,
-                  easing: config.ANIMATION_CUBIC_BEZIER
-                }
-              }];
-            }
-          },
-
-          /**
-           * An animation config. If provided, this will be used to animate the
-           * closing of the dropdown.
-           */
-          closeAnimationConfig: {
-            type: Object,
-            value: function() {
-              return [{
-                name: 'fade-out-animation',
-                timing: {
-                  duration: 150
-                }
-              }, {
-                name: 'paper-menu-shrink-width-animation',
-                timing: {
-                  delay: 100,
-                  duration: 50,
-                  easing: config.ANIMATION_CUBIC_BEZIER
-                }
-              }, {
-                name: 'paper-menu-shrink-height-animation',
-                timing: {
-                  duration: 200,
-                  easing: 'ease-in'
-                }
-              }];
-            }
-          },
-
-          /**
-           * By default, the dropdown will constrain scrolling on the page
-           * to itself when opened.
-           * Set to true in order to prevent scroll from being constrained
-           * to the dropdown when it opens.
-           */
-          allowOutsideScroll: {
-            type: Boolean,
-            value: false
-          },
-
-          /**
-           * Whether focus should be restored to the button when the menu closes.
-           */
-          restoreFocusOnClose: {
-            type: Boolean,
-            value: true
-          },
-
-          /**
-           * This is the element intended to be bound as the focus target
-           * for the `iron-dropdown` contained by `paper-menu-button`.
-           */
-          _dropdownContent: {
-            type: Object
-          }
-        },
-
-        hostAttributes: {
-          role: 'group',
-          'aria-haspopup': 'true'
-        },
-
-        listeners: {
-          'iron-activate': '_onIronActivate',
-          'iron-select': '_onIronSelect'
-        },
-
-        /**
-         * The content element that is contained by the menu button, if any.
-         */
-        get contentElement() {
-          return Polymer.dom(this.$.content).getDistributedNodes()[0];
-        },
-
-        /**
-         * Toggles the drowpdown content between opened and closed.
-         */
-        toggle: function() {
-          if (this.opened) {
-            this.close();
-          } else {
-            this.open();
-          }
-        },
-
-        /**
-         * Make the dropdown content appear as an overlay positioned relative
-         * to the dropdown trigger.
-         */
-        open: function() {
-          if (this.disabled) {
-            return;
-          }
-
-          this.$.dropdown.open();
-        },
-
-        /**
-         * Hide the dropdown content.
-         */
-        close: function() {
-          this.$.dropdown.close();
-        },
-
-        /**
-         * When an `iron-select` event is received, the dropdown should
-         * automatically close on the assumption that a value has been chosen.
-         *
-         * @param {CustomEvent} event A CustomEvent instance with type
-         * set to `"iron-select"`.
-         */
-        _onIronSelect: function(event) {
-          if (!this.ignoreSelect) {
-            this.close();
-          }
-        },
-
-        /**
-         * Closes the dropdown when an `iron-activate` event is received if
-         * `closeOnActivate` is true.
-         *
-         * @param {CustomEvent} event A CustomEvent of type 'iron-activate'.
-         */
-        _onIronActivate: function(event) {
-          if (this.closeOnActivate) {
-            this.close();
-          }
-        },
-
-        /**
-         * When the dropdown opens, the `paper-menu-button` fires `paper-open`.
-         * When the dropdown closes, the `paper-menu-button` fires `paper-close`.
-         *
-         * @param {boolean} opened True if the dropdown is opened, otherwise false.
-         * @param {boolean} oldOpened The previous value of `opened`.
-         */
-        _openedChanged: function(opened, oldOpened) {
-          if (opened) {
-            // TODO(cdata): Update this when we can measure changes in distributed
-            // children in an idiomatic way.
-            // We poke this property in case the element has changed. This will
-            // cause the focus target for the `iron-dropdown` to be updated as
-            // necessary:
-            this._dropdownContent = this.contentElement;
-            this.fire('paper-dropdown-open');
-          } else if (oldOpened != null) {
-            this.fire('paper-dropdown-close');
-          }
-        },
-
-        /**
-         * If the dropdown is open when disabled becomes true, close the
-         * dropdown.
-         *
-         * @param {boolean} disabled True if disabled, otherwise false.
-         */
-        _disabledChanged: function(disabled) {
-          Polymer.IronControlState._disabledChanged.apply(this, arguments);
-          if (disabled && this.opened) {
-            this.close();
-          }
-        },
-
-        __onIronOverlayCanceled: function(event) {
-          var uiEvent = event.detail;
-          var target = Polymer.dom(uiEvent).rootTarget;
-          var trigger = this.$.trigger;
-          var path = Polymer.dom(uiEvent).path;
-
-          if (path.indexOf(trigger) > -1) {
-            event.preventDefault();
-          }
-        }
-      });
-
-      Object.keys(config).forEach(function (key) {
-        PaperMenuButton[key] = config[key];
-      });
-
-      Polymer.PaperMenuButton = PaperMenuButton;
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/test/index.html b/systrace/catapult/third_party/polymer/components/paper-menu-button/test/index.html
deleted file mode 100644
index a1749e8..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-menu-button tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-menu-button.html',
-      'paper-menu-button.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu-button/test/paper-menu-button.html b/systrace/catapult/third_party/polymer/components/paper-menu-button/test/paper-menu-button.html
deleted file mode 100644
index bc223a7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu-button/test/paper-menu-button.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-menu-button basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../paper-menu-button.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-
-</head>
-<body>
-
-  <test-fixture id="TrivialMenuButton">
-    <template>
-      <paper-menu-button no-animations>
-        <span class="dropdown-trigger">trigger</span>
-        <span class="dropdown-content">content</span>
-      </paper-menu-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="TwoMenuButtons">
-    <template>
-      <paper-menu-button no-animations>
-        <span class="dropdown-trigger">trigger</span>
-        <span class="dropdown-content">content</span>
-      </paper-menu-button>
-      <paper-menu-button no-animations>
-        <span class="dropdown-trigger">trigger</span>
-        <span class="dropdown-content">content</span>
-      </paper-menu-button>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('<paper-menu-button>', function() {
-      var menuButton;
-      var trigger;
-      var content;
-
-      setup(function() {
-        menuButton = fixture('TrivialMenuButton');
-        trigger = Polymer.dom(menuButton).querySelector('.dropdown-trigger');
-        content = Polymer.dom(menuButton).querySelector('.dropdown-content');
-      });
-
-      test('opens when trigger is clicked', function(done) {
-        var contentRect;
-
-        contentRect = content.getBoundingClientRect();
-
-        expect(contentRect.width).to.be.equal(0);
-        expect(contentRect.height).to.be.equal(0);
-
-        menuButton.addEventListener('paper-dropdown-open', function() {
-          expect(menuButton.opened).to.be.equal(true);
-          done();
-        });
-
-        MockInteractions.tap(trigger);
-      });
-
-      test('closes when trigger is clicked again', function(done) {
-        menuButton.addEventListener('paper-dropdown-open', function() {
-          menuButton.addEventListener('paper-dropdown-close', function() {
-            expect(menuButton.opened).to.be.equal(false);
-            done();
-          });
-
-          Polymer.Base.async(function() {
-            MockInteractions.tap(trigger);
-          });
-        });
-
-        MockInteractions.tap(trigger);
-      });
-
-      test('closes when disabled while open', function() {
-        var contentRect;
-
-        menuButton.opened = true;
-        menuButton.disabled = true;
-
-        expect(menuButton.opened).to.be.equal(false);
-
-        contentRect = content.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(0);
-        expect(contentRect.height).to.be.equal(0);
-      });
-
-      test('has aria-haspopup attribute', function() {
-        expect(menuButton.hasAttribute('aria-haspopup')).to.be.equal(true);
-      });
-
-      test('closes on iron-activate if close-on-activate is true', function(done) {
-        menuButton.closeOnActivate = true;
-
-        menuButton.addEventListener('paper-dropdown-open', function() {
-          menuButton.addEventListener('paper-dropdown-close', function() {
-            done();
-          });
-
-          content.dispatchEvent(new CustomEvent('iron-activate', {
-            bubbles: true,
-            cancelable: true
-          }));
-        });
-
-        MockInteractions.tap(trigger);
-      });
-
-      test('allowOutsideScroll propagates to <iron-dropdown>', function() {
-        menuButton.allowOutsideScroll = false;
-        expect(menuButton.$.dropdown.allowOutsideScroll).to.be.equal(false);
-        menuButton.allowOutsideScroll = true;
-        expect(menuButton.$.dropdown.allowOutsideScroll).to.be.equal(true);
-      });
-
-      test('restoreFocusOnClose propagates to <iron-dropdown>', function() {
-        menuButton.restoreFocusOnClose = false;
-        expect(menuButton.$.dropdown.restoreFocusOnClose).to.be.equal(false);
-        menuButton.restoreFocusOnClose = true;
-        expect(menuButton.$.dropdown.restoreFocusOnClose).to.be.equal(true);
-      });
-
-    });
-
-    suite('when there are two buttons', function() {
-      var menuButton;
-      var trigger;
-      var otherButton;
-      var otherTrigger;
-
-      setup(function() {
-        var buttons = fixture('TwoMenuButtons');
-        menuButton = buttons[0];
-        otherButton = buttons[1];
-        trigger = Polymer.dom(menuButton).querySelector('.dropdown-trigger');
-        otherTrigger = Polymer.dom(otherButton).querySelector('.dropdown-trigger');
-      });
-
-      test('closes current and opens other', function(done) {
-        expect(menuButton.opened).to.be.equal(false);
-        expect(otherButton.opened).to.be.equal(false);
-
-        /*
-          NOTE: iron-overlay-behavior adds listeners asynchronously when the
-          overlay opens, so we need to wait for this event which is a
-          more-explicit signal that tells us that the overlay is really opened.
-         */
-        menuButton.addEventListener('iron-overlay-opened', function() {
-          expect(menuButton.opened).to.be.equal(true);
-          expect(otherButton.opened).to.be.equal(false);
-
-          var firstClosed = false;
-          var secondOpened = false;
-
-          menuButton.addEventListener('paper-dropdown-close', function() {
-            firstClosed = true;
-          });
-
-          otherButton.addEventListener('paper-dropdown-open', function() {
-            secondOpened = true;
-          });
-
-          Polymer.Base.async(function() {
-            MockInteractions.tap(otherTrigger);
-          });
-
-
-          Polymer.Base.async(function() {
-            expect(firstClosed).to.be.equal(true);
-            expect(secondOpened).to.be.equal(true);
-
-            done();
-          });
-        });
-
-        MockInteractions.tap(trigger);
-      });
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-menu/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/README.md b/systrace/catapult/third_party/polymer/components/paper-menu/README.md
deleted file mode 100644
index 3afbf6c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/README.md
+++ /dev/null
@@ -1,113 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-menu.html  paper-submenu.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-menu.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-menu)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-menu)_
-
-
-##&lt;paper-menu&gt;
-
-Material design: [Menus](https://www.google.com/design/spec/components/menus.html)
-
-`<paper-menu>` implements an accessible menu control with Material Design styling. The focused item
-is highlighted, and the selected item has bolded text.
-
-```html
-<paper-menu>
-  <paper-item>Item 1</paper-item>
-  <paper-item>Item 2</paper-item>
-</paper-menu>
-```
-
-An initial selection can be specified with the `selected` attribute.
-
-```html
-<paper-menu selected="0">
-  <paper-item>Item 1</paper-item>
-  <paper-item>Item 2</paper-item>
-</paper-menu>
-```
-
-Make a multi-select menu with the `multi` attribute. Items in a multi-select menu can be deselected,
-and multiple items can be selected.
-
-```html
-<paper-menu multi>
-  <paper-item>Item 1</paper-item>
-  <paper-item>Item 2</paper-item>
-</paper-menu>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-menu-background-color` | Menu background color | `--primary-background-color` |
-| `--paper-menu-color` | Menu foreground color | `--primary-text-color` |
-| `--paper-menu-disabled-color` | Foreground color for a disabled item | `--disabled-text-color` |
-| `--paper-menu` | Mixin applied to the menu | `{}` |
-| `--paper-menu-selected-item` | Mixin applied to the selected item | `{}` |
-| `--paper-menu-focused-item` | Mixin applied to the focused item | `{}` |
-| `--paper-menu-focused-item-after` | Mixin applied to the ::after pseudo-element for the focused item | `{}` |
-
-### Accessibility
-
-`<paper-menu>` has `role="menu"` by default. A multi-select menu will also have
-`aria-multiselectable` set. It implements key bindings to navigate through the menu with the up and
-down arrow keys, esc to exit the menu, and enter to activate a menu item. Typing the first letter
-of a menu item will also focus it.
-
-
-
-##&lt;paper-submenu&gt;
-
-`<paper-submenu>` is a nested menu inside of a parent `<paper-menu>`. It
-consists of a trigger that expands or collapses another `<paper-menu>`:
-
-```html
-<paper-menu>
-  <paper-submenu>
-    <paper-item class="menu-trigger">Topics</paper-item>
-    <paper-menu class="menu-content">
-      <paper-item>Topic 1</paper-item>
-      <paper-item>Topic 2</paper-item>
-      <paper-item>Topic 3</paper-item>
-    </paper-menu>
-  </paper-submenu>
-  <paper-submenu>
-    <paper-item class="menu-trigger">Faves</paper-item>
-    <paper-menu class="menu-content">
-      <paper-item>Fave 1</paper-item>
-      <paper-item>Fave 2</paper-item>
-    </paper-menu>
-  </paper-submenu>
-  <paper-submenu disabled>
-    <paper-item class="menu-trigger">Unavailable</paper-item>
-    <paper-menu class="menu-content">
-      <paper-item>Disabled 1</paper-item>
-      <paper-item>Disabled 2</paper-item>
-    </paper-menu>
-  </paper-submenu>
-</paper-menu>
-```
-
-Just like in `<paper-menu>`, the focused item is highlighted, and the selected
-item has bolded text. Please see the `<paper-menu>` docs for which attributes
-(such as `multi` and `selected`), and styling options are available for the
-`menu-content` menu.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/bower.json b/systrace/catapult/third_party/polymer/components/paper-menu/bower.json
deleted file mode 100644
index 2416c56..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/bower.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "paper-menu",
-  "version": "1.3.0",
-  "description": "Implements an accessible material design menu",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "menu"
-  ],
-  "main": [
-    "paper-menu.html",
-    "paper-submenu.html"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-menu"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-menu",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-collapse": "PolymerElements/iron-collapse#^1.0.0",
-    "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-item": "PolymerElements/paper-item#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-menu/demo/index.html
deleted file mode 100644
index 561fab9..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/demo/index.html
+++ /dev/null
@@ -1,149 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <title>paper-menu demo</title>
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../paper-item/paper-item.html">
-  <link rel="import" href="../../paper-styles/demo-pages.html">
-  <link rel="import" href="../paper-menu.html">
-  <link rel="import" href="../paper-submenu.html">
-
-  <style is="custom-style">
-    .horizontal-section {
-      padding: 0 !important;
-    }
-
-    .avatar {
-      display: inline-block;
-      width: 40px;
-      height: 40px;
-      border-radius: 50%;
-      overflow: hidden;
-      background: #ccc;
-    }
-
-    paper-item {
-      --paper-item: {
-        cursor: pointer;
-      };
-    }
-
-    .sublist paper-item {
-      padding-left: 30px;
-    }
-
-    .sublist2 paper-item {
-      padding-left: 50px;
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="horizontal-section-container">
-    <div>
-      <h4>Standard</h4>
-      <div class="horizontal-section">
-        <paper-menu>
-          <paper-item>Inbox</paper-item>
-          <paper-item>Starred</paper-item>
-          <paper-item>Sent mail</paper-item>
-          <paper-item>Drafts</paper-item>
-        </paper-menu>
-      </div>
-    </div>
-
-    <div>
-      <h4>Pre-selected</h4>
-      <div class="horizontal-section">
-        <paper-menu selected="0">
-          <paper-item>Inbox</paper-item>
-          <paper-item disabled>Starred</paper-item>
-          <paper-item>Sent mail</paper-item>
-          <paper-item>Drafts</paper-item>
-        </paper-menu>
-      </div>
-    </div>
-
-    <div>
-      <h4>Multi-select</h4>
-      <div class="horizontal-section">
-        <paper-menu multi>
-          <paper-item>Bold</paper-item>
-          <paper-item>Italic</paper-item>
-          <paper-item>Underline</paper-item>
-          <paper-item>Strikethrough</paper-item>
-        </paper-menu>
-      </div>
-    </div>
-
-    <div>
-      <h4>Sub-menu</h4>
-      <div class="horizontal-section">
-        <paper-menu attr-for-item-title="label" multi>
-          <paper-submenu label="paper-menu">
-            <paper-item class="menu-trigger">paper-menu</paper-item>
-            <paper-menu class="menu-content sublist" multi>
-              <paper-submenu label="Properties">
-                <paper-item class="menu-trigger">Properties</paper-item>
-                <paper-menu class="menu-content sublist2">
-                  <paper-item>focusedItem</paper-item>
-                  <paper-item>attrForItemTitle</paper-item>
-                </paper-menu>
-              </paper-submenu>
-              <paper-submenu label="Methods">
-                <paper-item class="menu-trigger">Methods</paper-item>
-                <paper-menu class="menu-content sublist2">
-                  <paper-item>select(value)</paper-item>
-                </paper-menu>
-              </paper-submenu>
-          </paper-menu>
-        </paper-submenu>
-
-        <paper-submenu label="paper-submenu">
-          <paper-item class="menu-trigger">paper-submenu</paper-item>
-          <paper-menu class="menu-content sublist">
-            <paper-submenu label="Properties">
-              <paper-item class="menu-trigger">Properties</paper-item>
-              <paper-menu class="menu-content sublist2">
-                <paper-item>opened</paper-item>
-              </paper-menu>
-              </paper-submenu>
-              <paper-submenu label="Methods">
-                <paper-item class="menu-trigger">Methods</paper-item>
-                <paper-menu class="menu-content sublist2">
-                  <paper-item>open()</paper-item>
-                  <paper-item>close()</paper-item>
-                  <paper-item>toggle()</paper-item>
-                </paper-menu>
-            </paper-submenu>
-          </paper-menu>
-        </paper-submenu>
-
-          <paper-submenu label="Unavailable" disabled>
-            <paper-item class="menu-trigger">Unavailable</paper-item>
-            <paper-menu class="menu-content sublist">
-              <paper-item>Unavailable 1</paper-item>
-              <paper-item>Unavailable 2</paper-item>
-            </paper-menu>
-          </paper-submenu>
-        </paper-menu>
-      </div>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/hero.svg b/systrace/catapult/third_party/polymer/components/paper-menu/hero.svg
deleted file mode 100755
index eaa0fb5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/hero.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<g>

-		<circle cx="86.5" cy="39" r="4"/>

-		<path d="M138,44c-2,0-3.6-2.4-4.6-4.6c-1.1-2.1-1.7-3.4-3-3.4s-2,1.3-3,3.4c-1.1,2.1-2.2,4.6-4.9,4.6c-2.6,0-3.8-2.4-4.9-4.6

-			c-1.1-2.1-1.8-3.4-3.1-3.4c-1.3,0-2,1.3-3.1,3.4c-1.1,2.1-2.3,4.6-4.9,4.6c-2.6,0-4.1-2.4-5.1-4.6C100.3,37.3,100,36,98,36v-2

-			c3,0,4.1,2.4,5.1,4.6c1.1,2.1,1.9,3.4,3.2,3.4c1.3,0,2.1-1.3,3.2-3.4c1.1-2.1,2.3-4.6,4.9-4.6c2.6,0,3.8,2.4,4.9,4.6

-			c1.1,2.1,1.8,3.4,3.1,3.4c1.3,0,2-1.3,3.1-3.4c1.1-2.1,2.3-4.6,4.9-4.6s3.6,2.4,4.6,4.6c1.1,2.1,1.9,3.4,2.9,3.4V44z"/>

-		<circle cx="86.5" cy="63" r="4"/>

-		<path d="M138,68c-2,0-3.6-2.4-4.6-4.6c-1.1-2.1-1.7-3.4-3-3.4s-2,1.3-3,3.4c-1.1,2.1-2.2,4.6-4.9,4.6c-2.6,0-3.8-2.4-4.9-4.6

-			c-1.1-2.1-1.8-3.4-3.1-3.4c-1.3,0-2,1.3-3.1,3.4c-1.1,2.1-2.3,4.6-4.9,4.6c-2.6,0-4.1-2.4-5.1-4.6C100.3,61.3,100,60,98,60v-2

-			c3,0,4.1,2.4,5.1,4.6c1.1,2.1,1.9,3.4,3.2,3.4c1.3,0,2.1-1.3,3.2-3.4c1.1-2.1,2.3-4.6,4.9-4.6c2.6,0,3.8,2.4,4.9,4.6

-			c1.1,2.1,1.8,3.4,3.1,3.4c1.3,0,2-1.3,3.1-3.4c1.1-2.1,2.3-4.6,4.9-4.6s3.6,2.4,4.6,4.6c1.1,2.1,1.9,3.4,2.9,3.4V68z"/>

-		<circle cx="86.5" cy="88" r="4"/>

-		<path d="M138,93c-2,0-3.6-2.4-4.6-4.6c-1.1-2.1-1.7-3.4-3-3.4s-2,1.3-3,3.4c-1.1,2.1-2.2,4.6-4.9,4.6c-2.6,0-3.8-2.4-4.9-4.6

-			c-1.1-2.1-1.8-3.4-3.1-3.4c-1.3,0-2,1.3-3.1,3.4c-1.1,2.1-2.3,4.6-4.9,4.6c-2.6,0-4.1-2.4-5.1-4.6C100.3,86.3,100,85,98,85v-2

-			c3,0,4.1,2.4,5.1,4.6c1.1,2.1,1.9,3.4,3.2,3.4c1.3,0,2.1-1.3,3.2-3.4c1.1-2.1,2.3-4.6,4.9-4.6c2.6,0,3.8,2.4,4.9,4.6

-			c1.1,2.1,1.8,3.4,3.1,3.4c1.3,0,2-1.3,3.1-3.4c1.1-2.1,2.3-4.6,4.9-4.6s3.6,2.4,4.6,4.6c1.1,2.1,1.9,3.4,2.9,3.4V93z"/>

-		<path d="M151,102H73V24h78V102z M75,100h74V26H75V100z"/>

-	</g>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/index.html b/systrace/catapult/third_party/polymer/components/paper-menu/index.html
deleted file mode 100644
index fc88411..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-menu</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/paper-menu-shared-styles.html b/systrace/catapult/third_party/polymer/components/paper-menu/paper-menu-shared-styles.html
deleted file mode 100644
index 08ccd58..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/paper-menu-shared-styles.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--

-@license

-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.

-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt

-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt

-Code distributed by Google as part of the polymer project is also

-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt

--->

-

-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">

-<link rel="import" href="../paper-styles/color.html">

-<link rel="import" href="../paper-styles/default-theme.html">

-

-<dom-module id="paper-menu-shared-styles">

-  <template>

-    <style>

-      /* need a wrapper element to make this higher specificity than the :host rule in paper-item */

-      .selectable-content > ::content > .iron-selected {

-        font-weight: bold;

-

-        @apply(--paper-menu-selected-item);

-      }

-

-      .selectable-content > ::content > [disabled] {

-        color: var(--paper-menu-disabled-color, --disabled-text-color);

-      }

-

-      .selectable-content > ::content > *:focus {

-        position: relative;

-        outline: 0;

-

-        @apply(--paper-menu-focused-item);

-      }

-

-      .selectable-content > ::content > *:focus:after {

-        @apply(--layout-fit);

-        background: currentColor;

-        opacity: var(--dark-divider-opacity);

-        content: '';

-        pointer-events: none;

-

-        @apply(--paper-menu-focused-item-after);

-      }

-

-      .selectable-content > ::content > *[colored]:focus:after {

-        opacity: 0.26;

-      }

-    </style>

-  </template>

-</dom-module>

diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/paper-menu.html b/systrace/catapult/third_party/polymer/components/paper-menu/paper-menu.html
deleted file mode 100644
index b3f68ab..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/paper-menu.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-menu-behavior/iron-menu-behavior.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="paper-menu-shared-styles.html">
-
-<!--
-Material design: [Menus](https://www.google.com/design/spec/components/menus.html)
-
-`<paper-menu>` implements an accessible menu control with Material Design styling. The focused item
-is highlighted, and the selected item has bolded text.
-
-    <paper-menu>
-      <paper-item>Item 1</paper-item>
-      <paper-item>Item 2</paper-item>
-    </paper-menu>
-
-An initial selection can be specified with the `selected` attribute.
-
-    <paper-menu selected="0">
-      <paper-item>Item 1</paper-item>
-      <paper-item>Item 2</paper-item>
-    </paper-menu>
-
-Make a multi-select menu with the `multi` attribute. Items in a multi-select menu can be deselected,
-and multiple items can be selected.
-
-    <paper-menu multi>
-      <paper-item>Item 1</paper-item>
-      <paper-item>Item 2</paper-item>
-    </paper-menu>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-menu-background-color`   | Menu background color                                            | `--primary-background-color`
-`--paper-menu-color`              | Menu foreground color                                            | `--primary-text-color`
-`--paper-menu-disabled-color`     | Foreground color for a disabled item                             | `--disabled-text-color`
-`--paper-menu`                    | Mixin applied to the menu                                        | `{}`
-`--paper-menu-selected-item`      | Mixin applied to the selected item                               | `{}`
-`--paper-menu-focused-item`       | Mixin applied to the focused item                                | `{}`
-`--paper-menu-focused-item-after` | Mixin applied to the ::after pseudo-element for the focused item | `{}`
-
-### Accessibility
-
-`<paper-menu>` has `role="menu"` by default. A multi-select menu will also have
-`aria-multiselectable` set. It implements key bindings to navigate through the menu with the up and
-down arrow keys, esc to exit the menu, and enter to activate a menu item. Typing the first letter
-of a menu item will also focus it.
-
-@group Paper Elements
-@element paper-menu
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-menu">
-  <template>
-    <style include="paper-menu-shared-styles"></style>
-    <style>
-      :host {
-        display: block;
-        padding: 8px 0;
-
-        background: var(--paper-menu-background-color, --primary-background-color);
-        color: var(--paper-menu-color, --primary-text-color);
-
-        @apply(--paper-menu);
-      }
-    </style>
-
-    <div class="selectable-content">
-      <content></content>
-    </div>
-  </template>
-
-  <script>
-    (function() {
-      Polymer({
-        is: 'paper-menu',
-
-        behaviors: [
-          Polymer.IronMenuBehavior
-        ]
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/paper-submenu.html b/systrace/catapult/third_party/polymer/components/paper-menu/paper-submenu.html
deleted file mode 100644
index 4fadb87..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/paper-submenu.html
+++ /dev/null
@@ -1,223 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-collapse/iron-collapse.html">
-<link rel="import" href="paper-menu-shared-styles.html">
-
-<!--
-`<paper-submenu>` is a nested menu inside of a parent `<paper-menu>`. It
-consists of a trigger that expands or collapses another `<paper-menu>`:
-
-    <paper-menu>
-      <paper-submenu>
-        <paper-item class="menu-trigger">Topics</paper-item>
-        <paper-menu class="menu-content">
-          <paper-item>Topic 1</paper-item>
-          <paper-item>Topic 2</paper-item>
-          <paper-item>Topic 3</paper-item>
-        </paper-menu>
-      </paper-submenu>
-      <paper-submenu>
-        <paper-item class="menu-trigger">Faves</paper-item>
-        <paper-menu class="menu-content">
-          <paper-item>Fave 1</paper-item>
-          <paper-item>Fave 2</paper-item>
-        </paper-menu>
-      </paper-submenu>
-      <paper-submenu disabled>
-        <paper-item class="menu-trigger">Unavailable</paper-item>
-        <paper-menu class="menu-content">
-          <paper-item>Disabled 1</paper-item>
-          <paper-item>Disabled 2</paper-item>
-        </paper-menu>
-      </paper-submenu>
-    </paper-menu>
-
-Just like in `<paper-menu>`, the focused item is highlighted, and the selected
-item has bolded text. Please see the `<paper-menu>` docs for which attributes
-(such as `multi` and `selected`), and styling options are available for the
-`menu-content` menu.
-
-@group Paper Elements
-@element paper-submenu
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-submenu">
-  <template>
-    <style include="paper-menu-shared-styles"></style>
-
-    <div class="selectable-content" on-tap="_onTap">
-      <content id="trigger" select=".menu-trigger"></content>
-    </div>
-    <iron-collapse id="collapse" opened="{{opened}}">
-      <content id="content" select=".menu-content"></content>
-    </iron-collapse>
-  </template>
-
-  <script>
-
-  (function() {
-
-    Polymer({
-
-      is: 'paper-submenu',
-
-      properties: {
-        /**
-         * Fired when the submenu is opened.
-         *
-         * @event paper-submenu-open
-         */
-
-        /**
-         * Fired when the submenu is closed.
-         *
-         * @event paper-submenu-close
-         */
-
-        /**
-         * Set opened to true to show the collapse element and to false to hide it.
-         *
-         * @attribute opened
-         */
-        opened: {
-          type: Boolean,
-          value: false,
-          notify: true,
-          observer: '_openedChanged'
-        }
-      },
-
-      behaviors: [
-        Polymer.IronControlState
-      ],
-
-      listeners: {
-        'focus': '_onFocus'
-      },
-
-      get __parent() {
-        return Polymer.dom(this).parentNode;
-      },
-
-      get __trigger() {
-        return Polymer.dom(this.$.trigger).getDistributedNodes()[0];
-      },
-
-      get __content() {
-        return Polymer.dom(this.$.content).getDistributedNodes()[0];
-      },
-
-      attached: function() {
-        this.listen(this.__parent, 'iron-activate', '_onParentIronActivate');
-      },
-
-      detached: function() {
-        this.unlisten(this.__parent, 'iron-activate', '_onParentIronActivate');
-      },
-
-      /**
-       * Expand the submenu content.
-       */
-      open: function() {
-        if (!this.disabled) {
-          this.opened = true;
-        }
-      },
-
-      /**
-       * Collapse the submenu content.
-       */
-      close: function() {
-        this.opened = false;
-      },
-
-      /**
-       * Toggle the submenu.
-       */
-      toggle: function() {
-        if (this.opened) {
-          this.close();
-        } else {
-          this.open();
-        }
-      },
-
-      /**
-       * A handler that is called when the trigger is tapped.
-       */
-      _onTap: function(e) {
-        if (!this.disabled) {
-          this.toggle();
-        }
-      },
-
-      /**
-       * Toggles the submenu content when the trigger is tapped.
-       */
-      _openedChanged: function(opened, oldOpened) {
-        if (opened) {
-          this.__trigger && this.__trigger.classList.add('iron-selected');
-          this.__content && this.__content.focus();
-          this.fire('paper-submenu-open');
-        } else if (oldOpened != null) {
-          this.__trigger && this.__trigger.classList.remove('iron-selected');
-          this.fire('paper-submenu-close');
-        }
-      },
-
-      /**
-       * A handler that is called when `iron-activate` is fired.
-       *
-       * @param {CustomEvent} event An `iron-activate` event.
-       */
-      _onParentIronActivate: function(event) {
-        var parent = this.__parent;
-        if (Polymer.dom(event).localTarget === parent) {
-          // The activated item can either be this submenu, in which case it
-          // should be expanded, or any of the other sibling submenus, in which
-          // case this submenu should be collapsed.
-          if (event.detail.item !== this && !parent.multi) {
-            this.close();
-          }
-        }
-      },
-
-      /**
-       * If the dropdown is open when disabled becomes true, close the
-       * dropdown.
-       *
-       * @param {boolean} disabled True if disabled, otherwise false.
-       */
-      _disabledChanged: function(disabled) {
-        Polymer.IronControlState._disabledChanged.apply(this, arguments);
-        if (disabled && this.opened) {
-          this.close();
-        }
-      },
-
-      /**
-       * Handler that is called when the menu receives focus.
-       *
-       * @param {FocusEvent} event A focus event.
-       */
-      _onFocus: function(event) {
-        this.__trigger && this.__trigger.focus();
-      }
-
-    });
-
-  })();
-</script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/test/index.html b/systrace/catapult/third_party/polymer/components/paper-menu/test/index.html
deleted file mode 100644
index 7956bc1..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/test/index.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>paper-menu tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-
-      WCT.loadSuites([
-        'paper-menu.html',
-        'paper-submenu.html',
-        'paper-menu.html?dom=shadow',
-        'paper-submenu.html?dom=shadow'
-      ]);
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/test/paper-menu.html b/systrace/catapult/third_party/polymer/components/paper-menu/test/paper-menu.html
deleted file mode 100644
index d92e673..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/test/paper-menu.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>paper-menu tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <link rel="import" href="../paper-menu.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <paper-menu>
-          <div>item 1</div>
-          <div>item 2</div>
-          <div>item 3</div>
-        </paper-menu>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('<paper-menu>', function() {
-        var menu;
-
-        setup(function() {
-          menu = fixture('basic');
-        });
-
-        test('selected item is styled', function() {
-
-          var boldDiv = document.createElement('div');
-          boldDiv.style.fontWeight = 'bold';
-          document.body.appendChild(boldDiv);
-
-          menu.selected = 1;
-
-          assert.equal(getComputedStyle(menu.selectedItem).fontWeight,
-              getComputedStyle(boldDiv).fontWeight, 'selected item is bold');
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-menu/test/paper-submenu.html b/systrace/catapult/third_party/polymer/components/paper-menu/test/paper-submenu.html
deleted file mode 100644
index 13d8ede..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-menu/test/paper-submenu.html
+++ /dev/null
@@ -1,285 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <title>paper-submenu tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-    <link rel="import" href="../../paper-item/paper-item.html">
-    <link rel="import" href="../paper-menu.html">
-    <link rel="import" href="../paper-submenu.html">
-
-  </head>
-  <style>
-    paper-item {
-      font-weight: normal;
-    }
-  </style>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <paper-menu>
-          <paper-submenu>
-            <paper-item class="menu-trigger">Topic 1</paper-item>
-            <paper-menu class="menu-content">
-              <paper-item>item 1.1</paper-item>
-              <paper-item>item 1.2</paper-item>
-              <paper-item>item 1.3</paper-item>
-            </paper-menu>
-          </paper-submenu>
-          <paper-submenu>
-            <paper-item class="menu-trigger">Topic 2</paper-item>
-            <paper-menu class="menu-content">
-              <paper-item>item 2.1</paper-item>
-              <paper-item>item 2.2</paper-item>
-              <paper-item>item 2.3</paper-item>
-            </paper-menu>
-          </paper-submenu>
-          <paper-submenu disabled>
-            <paper-item class="menu-trigger">Topic 3</paper-item>
-            <paper-menu class="menu-content">
-              <paper-item>item 3.1</paper-item>
-              <paper-item>item 3.2</paper-item>
-              <paper-item>item 3.3</paper-item>
-            </paper-menu>
-          </paper-submenu>
-        </paper-menu>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="opened">
-      <template>
-        <paper-menu>
-          <paper-submenu class="menu-content" opened>
-            <paper-item class="menu-trigger">My submenu is opened to start!</paper-item>
-            <paper-menu class="menu-content">
-              <paper-item>Triggered item</paper-item>
-            </paper-menu>
-          </paper-submenu>
-        </paper-menu>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('<paper-submenu>', function() {
-        var menu,
-            sub1, sub2, sub3,
-            collapse1, collapse2, collapse3,
-            trigger1, trigger2, trigger3;
-
-        setup(function() {
-          menu = fixture('basic');
-
-          sub1 = menu.querySelectorAll('paper-submenu')[0];
-          sub2 = menu.querySelectorAll('paper-submenu')[1];
-          sub3 = menu.querySelectorAll('paper-submenu')[2];
-
-          collapse1 = Polymer.dom(sub1.root).querySelector('iron-collapse');
-          collapse2 = Polymer.dom(sub2.root).querySelector('iron-collapse');
-          collapse3 = Polymer.dom(sub3.root).querySelector('iron-collapse');
-
-          trigger1 = sub1.querySelector('.menu-trigger');
-          trigger2 = sub2.querySelector('.menu-trigger');
-          trigger3 = sub3.querySelector('.menu-trigger');
-        });
-
-        test('selecting an item expands the submenu', function() {
-          assert.isFalse(collapse1.opened);
-          assert.isFalse(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-
-          MockInteractions.tap(trigger1);
-
-          assert.isTrue(collapse1.opened);
-          assert.isFalse(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-        });
-
-        test('selecting a different item closes the previously opened submenu', function() {
-          assert.isFalse(collapse1.opened);
-          assert.isFalse(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-
-          MockInteractions.tap(trigger1);
-
-          assert.isTrue(collapse1.opened);
-          assert.isFalse(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-
-          MockInteractions.tap(trigger2);
-
-          assert.isFalse(collapse1.opened);
-          assert.isTrue(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-        });
-
-        test('cannot open a disabled submenu', function() {
-          assert.isFalse(collapse1.opened);
-          assert.isFalse(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-
-          MockInteractions.tap(trigger3);
-
-          assert.isFalse(collapse1.opened);
-          assert.isFalse(collapse2.opened);
-          assert.isFalse(collapse3.opened);
-        });
-
-        test('selecting an item styles it and the parent', function() {
-          var boldDiv = document.createElement('div');
-          boldDiv.style.fontWeight = 'bold';
-          document.body.appendChild(boldDiv);
-
-          var normalDiv = document.createElement('div');
-          normalDiv.style.fontWeight = 'normal';
-          document.body.appendChild(normalDiv);
-
-          assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight);
-
-          var item1 = sub1.querySelector('.menu-content').querySelector('paper-item');
-
-          MockInteractions.tap(trigger1);
-          // Nothing is initially selected.
-          assert.equal(getComputedStyle(item1).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          MockInteractions.tap(item1);
-
-          assert.equal(getComputedStyle(item1).fontWeight, getComputedStyle(boldDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(boldDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight);
-        });
-
-        test('selecting a new item de-styles the previous one', function() {
-          var boldDiv = document.createElement('div');
-          boldDiv.style.fontWeight = 'bold';
-          document.body.appendChild(boldDiv);
-
-          var normalDiv = document.createElement('div');
-          normalDiv.style.fontWeight = 'normal';
-          document.body.appendChild(normalDiv);
-
-          assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight);
-
-          var item1 = sub1.querySelector('.menu-content').querySelector('paper-item');
-          var item2 = sub2.querySelector('.menu-content').querySelector('paper-item');
-
-          MockInteractions.tap(trigger1);
-          MockInteractions.tap(item1);
-          MockInteractions.tap(trigger2);
-          MockInteractions.tap(item2);
-
-          // Both children are still selected even though the first one is hidden.
-          assert.equal(getComputedStyle(item1).fontWeight, getComputedStyle(boldDiv).fontWeight);
-          assert.equal(getComputedStyle(item2).fontWeight, getComputedStyle(boldDiv).fontWeight);
-
-          assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(normalDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(boldDiv).fontWeight);
-          assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight);
-        });
-
-        test('focus a submenu should redirect focus to the trigger', function(done) {
-          MockInteractions.focus(sub1);
-          flush(function() {
-            assert.equal(sub1.shadowRoot ? sub1.shadowRoot.activeElement :
-                document.activeElement, sub1.__trigger);
-            done();
-          });
-        });
-      });
-
-      suite('<paper-submenu opened>', function() {
-        var opened;
-        var submenu;
-        var collapse;
-
-        var fail = function(msg) {
-          return function() {
-            throw new Error(msg);
-          };
-        };
-
-        setup(function() {
-          opened = fixture('opened');
-          submenu = opened.querySelector('paper-submenu');
-          collapse = Polymer.dom(submenu.root).querySelector('iron-collapse');
-        });
-
-        test('opened binding + .menu-trigger tap', function() {
-          assert.isTrue(submenu.opened);
-
-          var trigger = submenu.querySelector('.menu-trigger');
-          MockInteractions.tap(trigger);
-          assert.isFalse(submenu.opened);
-
-          MockInteractions.tap(trigger);
-          assert.isTrue(submenu.opened);
-        });
-
-        test('opened binding + open()/close()', function() {
-          assert.isTrue(submenu.opened);
-
-          submenu.close();
-          assert.isFalse(submenu.opened);
-          assert.isFalse(collapse.opened);
-
-          submenu.open();
-          assert.isTrue(submenu.opened);
-          assert.isTrue(collapse.opened);
-        });
-
-        test('opened binding + toggle()', function() {
-          assert.isTrue(submenu.opened);
-
-          submenu.toggle();
-          assert.isFalse(submenu.opened);
-          assert.isFalse(collapse.opened);
-
-          submenu.toggle();
-          assert.isTrue(submenu.opened);
-          assert.isTrue(collapse.opened);
-        });
-
-        test('opened binding + open() x 2', function() {
-          assert.isTrue(submenu.opened);
-
-          opened.addEventListener('paper-submenu-open', fail('duplicate open'));
-
-          submenu.open();  // Opening when already opened should not fire().
-        });
-
-        test('opened binding + close() x 2', function() {
-          submenu.close();
-          assert.isFalse(submenu.opened);
-
-          opened.addEventListener('paper-submenu-close', fail('duplicate close'));
-
-          submenu.close();  // Closing again when !opened should not fire().
-        });
-      });
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-progress/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/README.md b/systrace/catapult/third_party/polymer/components/paper-progress/README.md
deleted file mode 100644
index f2278de..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-progress.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-progress)
-
-##&lt;paper-progress&gt;
-
-Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../paper-styles/color.html">
-    <link rel="import" href="paper-progress.html">
-    <style is="custom-style">
-      paper-progress {
-        display: block;
-        width: 100%;
-        margin: 20px 0;
-      }
-      paper-progress.slow {
-        --paper-progress-indeterminate-cycle-duration: 5s;
-      }
-      paper-progress.blue {
-        --paper-progress-active-color: var(--paper-light-blue-500);
-        --paper-progress-secondary-color: var(--paper-light-blue-100);
-      }
-      paper-progress.red {
-        --paper-progress-active-color: var(--paper-red-500);
-        --paper-progress-secondary-color: var(--paper-red-100);
-      }
-    </style>
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-progress indeterminate class="blue"></paper-progress>
-<paper-progress indeterminate class="slow red"></paper-progress>
-<paper-progress value="40" secondary-progress="80"></paper-progress>
-```
-
-The progress bars are for situations where the percentage completed can be
-determined. They give users a quick sense of how much longer an operation
-will take.
-
-There is also a secondary progress which is useful for displaying intermediate
-progress, such as the buffer level during a streaming playback progress bar.
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/bower.json b/systrace/catapult/third_party/polymer/components/paper-progress/bower.json
deleted file mode 100644
index f488a19..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "paper-progress",
-  "version": "1.0.12",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "A material design progress bar",
-  "authors": "The Polymer Authors",
-  "keywords": [
-    "web-components",
-    "polymer",
-    "progress",
-    "loading"
-  ],
-  "main": "paper-progress.html",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-progress.git"
-  },
-  "dependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-range-behavior": "PolymerElements/iron-range-behavior#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-progress/demo/index.html
deleted file mode 100644
index 6f7b02b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/demo/index.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!doctype html>
-<html>
-<head>
-  <title>paper-progress demo</title>
-
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <meta name="mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../paper-progress.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    paper-progress {
-      display: block;
-      width: 100%;
-      margin: 20px 0;
-    }
-    paper-button {
-      display: inline-block;
-      padding: 5px;
-    }
-  </style>
-
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>paper-progress can be imperatively controlled</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <p>Once started, loops 5 times before stopping.
-          <!-- View the source code to see the contents of startProgress() -->
-          <paper-button raised onclick="startProgress();" id="start">Start</paper-button>
-        </p>
-        <paper-progress id="progress"></paper-progress>
-      </template>
-    </demo-snippet>
-
-    <h3>paper-progress can be indeterminate with a custom duration</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style is="custom-style">
-          paper-progress.slow {
-            --paper-progress-indeterminate-cycle-duration: 20s;
-          }
-        </style>
-        <paper-progress indeterminate></paper-progress>
-        <paper-progress indeterminate class="slow"></paper-progress>
-      </template>
-    </demo-snippet>
-
-    <h3>It can be styled using custom properties</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style is="custom-style">
-          paper-progress.blue {
-            --paper-progress-active-color: var(--paper-light-blue-500);
-            --paper-progress-secondary-color: var(--paper-light-blue-100);
-          }
-
-          paper-progress.red {
-            --paper-progress-active-color: var(--paper-red-500);
-            --paper-progress-secondary-color: var(--paper-red-100);
-          }
-
-          paper-progress.green {
-            --paper-progress-active-color: var(--paper-light-green-500);
-            --paper-progress-secondary-color: var(--paper-light-green-100);
-          }
-        </style>
-        <paper-progress value="800" min="100" max="1000" class="red"></paper-progress>
-        <paper-progress value="60" class="green"></paper-progress>
-        <paper-progress value="40" secondary-progress="80" class="blue"></paper-progress>
-      </template>
-    </demo-snippet>
-  </div>
-
-  <script>
-    var progress, button;
-    var repeat, maxRepeat = 5, animating = false;
-
-    function nextProgress() {
-      animating = true;
-      if (progress.value < progress.max) {
-        progress.value += (progress.step || 1);
-      } else {
-        if (++repeat >= maxRepeat) {
-          animating = false;
-          button.disabled = false;
-          return;
-        }
-        progress.value = progress.min;
-      }
-      requestAnimationFrame(nextProgress);
-    }
-
-    function startProgress() {
-      repeat = 0;
-      progress.value = progress.min;
-      button.disabled = true;
-      if (!animating) {
-        nextProgress();
-      }
-    }
-
-    window.addEventListener('WebComponentsReady', function() {
-      progress = document.querySelector('paper-progress');
-      button = document.querySelector('paper-button');
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/hero.svg b/systrace/catapult/third_party/polymer/components/paper-progress/hero.svg
deleted file mode 100755
index 0f569e6..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/hero.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<rect x="57" y="59" width="20" height="2"/>

-	<rect x="38" y="59" width="11" height="2"/>

-	<rect x="84" y="59" width="40" height="2"/>

-	<rect x="133" y="59" width="54" height="2"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/index.html b/systrace/catapult/third_party/polymer/components/paper-progress/index.html
deleted file mode 100644
index 225e3dd..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <title>paper-progress</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/paper-progress.html b/systrace/catapult/third_party/polymer/components/paper-progress/paper-progress.html
deleted file mode 100644
index f0334b4..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/paper-progress.html
+++ /dev/null
@@ -1,354 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-range-behavior/iron-range-behavior.html">
-<link rel="import" href="../paper-styles/color.html">
-
-<!--
-Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
-
-The progress bars are for situations where the percentage completed can be
-determined. They give users a quick sense of how much longer an operation
-will take.
-
-Example:
-
-    <paper-progress value="10"></paper-progress>
-
-There is also a secondary progress which is useful for displaying intermediate
-progress, such as the buffer level during a streaming playback progress bar.
-
-Example:
-
-    <paper-progress value="10" secondary-progress="30"></paper-progress>
-
-### Styling progress bar:
-
-To change the active progress bar color:
-
-    paper-progress {
-       --paper-progress-active-color: #e91e63;
-    }
-
-To change the secondary progress bar color:
-
-    paper-progress {
-      --paper-progress-secondary-color: #f8bbd0;
-    }
-
-To change the progress bar background color:
-
-    paper-progress {
-      --paper-progress-container-color: #64ffda;
-    }
-
-Add the class `transiting` to a paper-progress to animate the progress bar when
-the value changed. You can also customize the transition:
-
-    paper-progress {
-      --paper-progress-transition-duration: 0.08s;
-      --paper-progress-transition-timing-function: ease;
-      --paper-progress-transition-transition-delay: 0s;
-    }
-
-To change the duration of the indeterminate cycle:
-
-    paper-progress {
-      --paper-progress-indeterminate-cycle-duration: 2s;
-    }
-
-The following mixins are available for styling:
-
-Custom property                                  | Description                                 | Default
--------------------------------------------------|---------------------------------------------|--------------
-`--paper-progress-container`                     | Mixin applied to container                  | `{}`
-`--paper-progress-transition-duration`           | Duration of the transition                  | `0.008s`
-`--paper-progress-transition-timing-function`    | The timing function for the transition      | `ease`
-`--paper-progress-transition-delay`              | delay for the transition                    | `0s`
-`--paper-progress-container-color`               | Color of the container                      | `--google-grey-300`
-`--paper-progress-active-color`                  | The color of the active bar                 | `--google-green-500`
-`--paper-progress-secondary-color`               | The color of the secondary bar              | `--google-green-100`
-`--paper-progress-disabled-active-color`         | The color of the active bar if disabled     | `--google-grey-500`
-`--paper-progress-disabled-secondary-color`      | The color of the secondary bar if disabled  | `--google-grey-300`
-`--paper-progress-height`                        | The height of the progress bar              | `4px`
-`--paper-progress-indeterminate-cycle-duration`  | Duration of an indeterminate cycle          | `2s`
-
-@group Paper Elements
-@element paper-progress
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-progress">
-  <template>
-    <style>
-      :host {
-        display: block;
-        width: 200px;
-        position: relative;
-        overflow: hidden;
-      }
-
-      :host([hidden]) {
-        display: none !important;
-      }
-
-      #progressContainer {
-        @apply(--paper-progress-container);
-        position: relative;
-      }
-
-      #progressContainer,
-      /* the stripe for the indeterminate animation*/
-      .indeterminate::after {
-        height: var(--paper-progress-height, 4px);
-      }
-
-      #primaryProgress,
-      #secondaryProgress,
-      .indeterminate::after {
-        @apply(--layout-fit);
-      }
-
-      #progressContainer,
-      .indeterminate::after {
-        background: var(--paper-progress-container-color, --google-grey-300);
-      }
-
-      :host(.transiting) #primaryProgress,
-      :host(.transiting) #secondaryProgress {
-        -webkit-transition-property: -webkit-transform;
-        transition-property: transform;
-
-        /* Duration */
-        -webkit-transition-duration: var(--paper-progress-transition-duration, 0.08s);
-        transition-duration: var(--paper-progress-transition-duration, 0.08s);
-
-        /* Timing function */
-        -webkit-transition-timing-function: var(--paper-progress-transition-timing-function, ease);
-        transition-timing-function: var(--paper-progress-transition-timing-function, ease);
-
-        /* Delay */
-        -webkit-transition-delay: var(--paper-progress-transition-delay, 0s);
-        transition-delay: var(--paper-progress-transition-delay, 0s);
-      }
-
-      #primaryProgress,
-      #secondaryProgress {
-        @apply(--layout-fit);
-        -webkit-transform-origin: left center;
-        transform-origin: left center;
-        -webkit-transform: scaleX(0);
-        transform: scaleX(0);
-        will-change: transform;
-      }
-
-      #primaryProgress {
-        background: var(--paper-progress-active-color, --google-green-500);
-      }
-
-      #secondaryProgress {
-        background: var(--paper-progress-secondary-color, --google-green-100);
-      }
-
-      :host([disabled]) #primaryProgress {
-        background: var(--paper-progress-disabled-active-color, --google-grey-500);
-      }
-
-      :host([disabled]) #secondaryProgress {
-        background: var(--paper-progress-disabled-secondary-color, --google-grey-300);
-      }
-
-      :host(:not([disabled])) #primaryProgress.indeterminate {
-        -webkit-transform-origin: right center;
-        transform-origin: right center;
-        -webkit-animation: indeterminate-bar var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
-        animation: indeterminate-bar var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
-      }
-
-      :host(:not([disabled])) #primaryProgress.indeterminate::after {
-        content: "";
-        -webkit-transform-origin: center center;
-        transform-origin: center center;
-
-        -webkit-animation: indeterminate-splitter var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
-        animation: indeterminate-splitter var(--paper-progress-indeterminate-cycle-duration, 2s) linear infinite;
-      }
-
-      @-webkit-keyframes indeterminate-bar {
-        0% {
-          -webkit-transform: scaleX(1) translateX(-100%);
-        }
-        50% {
-          -webkit-transform: scaleX(1) translateX(0%);
-        }
-        75% {
-          -webkit-transform: scaleX(1) translateX(0%);
-          -webkit-animation-timing-function: cubic-bezier(.28,.62,.37,.91);
-        }
-        100% {
-          -webkit-transform: scaleX(0) translateX(0%);
-        }
-      }
-
-      @-webkit-keyframes indeterminate-splitter {
-        0% {
-          -webkit-transform: scaleX(.75) translateX(-125%);
-        }
-        30% {
-          -webkit-transform: scaleX(.75) translateX(-125%);
-          -webkit-animation-timing-function: cubic-bezier(.42,0,.6,.8);
-        }
-        90% {
-          -webkit-transform: scaleX(.75) translateX(125%);
-        }
-        100% {
-          -webkit-transform: scaleX(.75) translateX(125%);
-        }
-      }
-
-      @keyframes indeterminate-bar {
-        0% {
-          transform: scaleX(1) translateX(-100%);
-        }
-        50% {
-          transform: scaleX(1) translateX(0%);
-        }
-        75% {
-          transform: scaleX(1) translateX(0%);
-          animation-timing-function: cubic-bezier(.28,.62,.37,.91);
-        }
-        100% {
-          transform: scaleX(0) translateX(0%);
-        }
-      }
-
-      @keyframes indeterminate-splitter {
-        0% {
-          transform: scaleX(.75) translateX(-125%);
-        }
-        30% {
-          transform: scaleX(.75) translateX(-125%);
-          animation-timing-function: cubic-bezier(.42,0,.6,.8);
-        }
-        90% {
-          transform: scaleX(.75) translateX(125%);
-        }
-        100% {
-          transform: scaleX(.75) translateX(125%);
-        }
-      }
-    </style>
-
-    <div id="progressContainer">
-      <div id="secondaryProgress" hidden$="[[_hideSecondaryProgress(secondaryRatio)]]"></div>
-      <div id="primaryProgress"></div>
-    </div>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-progress',
-
-    behaviors: [
-      Polymer.IronRangeBehavior
-    ],
-
-    properties: {
-      /**
-       * The number that represents the current secondary progress.
-       */
-      secondaryProgress: {
-        type: Number,
-        value: 0
-      },
-
-      /**
-       * The secondary ratio
-       */
-      secondaryRatio: {
-        type: Number,
-        value: 0,
-        readOnly: true
-      },
-
-      /**
-       * Use an indeterminate progress indicator.
-       */
-      indeterminate: {
-        type: Boolean,
-        value: false,
-        observer: '_toggleIndeterminate'
-      },
-
-      /**
-       * True if the progress is disabled.
-       */
-      disabled: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true,
-        observer: '_disabledChanged'
-      }
-    },
-
-    observers: [
-      '_progressChanged(secondaryProgress, value, min, max)'
-    ],
-
-    hostAttributes: {
-      role: 'progressbar'
-    },
-
-    _toggleIndeterminate: function(indeterminate) {
-      // If we use attribute/class binding, the animation sometimes doesn't translate properly
-      // on Safari 7.1. So instead, we toggle the class here in the update method.
-      this.toggleClass('indeterminate', indeterminate, this.$.primaryProgress);
-    },
-
-    _transformProgress: function(progress, ratio) {
-      var transform = 'scaleX(' + (ratio / 100) + ')';
-      progress.style.transform = progress.style.webkitTransform = transform;
-    },
-
-    _mainRatioChanged: function(ratio) {
-      this._transformProgress(this.$.primaryProgress, ratio);
-    },
-
-    _progressChanged: function(secondaryProgress, value, min, max) {
-      secondaryProgress = this._clampValue(secondaryProgress);
-      value = this._clampValue(value);
-
-      var secondaryRatio = this._calcRatio(secondaryProgress) * 100;
-      var mainRatio = this._calcRatio(value) * 100;
-
-      this._setSecondaryRatio(secondaryRatio);
-      this._transformProgress(this.$.secondaryProgress, secondaryRatio);
-      this._transformProgress(this.$.primaryProgress, mainRatio);
-
-      this.secondaryProgress = secondaryProgress;
-
-      this.setAttribute('aria-valuenow', value);
-      this.setAttribute('aria-valuemin', min);
-      this.setAttribute('aria-valuemax', max);
-    },
-
-    _disabledChanged: function(disabled) {
-      this.setAttribute('aria-disabled', disabled ? 'true' : 'false');
-    },
-
-    _hideSecondaryProgress: function(secondaryRatio) {
-      return secondaryRatio === 0;
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-progress/test/basic.html
deleted file mode 100644
index 7354750..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/test/basic.html
+++ /dev/null
@@ -1,148 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-progress test</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-  <link rel="import" href="../paper-progress.html">
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-</head>
-<body>
-
-
-  <test-fixture id="trivialProgress">
-    <template>
-      <paper-progress></paper-progress>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="transitingProgress">
-    <template>
-      <paper-progress class="transiting"></paper-progress>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('basic features', function() {
-      var progress;
-
-      setup(function() {
-        progress = fixture('trivialProgress');
-      });
-
-      test('check default', function() {
-        assert.equal(progress.min, 0);
-        assert.equal(progress.max, 100);
-        assert.equal(progress.value, 0);
-      });
-
-      test('set value', function(done) {
-        progress.value = 50;
-        asyncPlatformFlush(function() {
-          assert.equal(progress.value, 50);
-          // test clamp value
-          progress.value = 60.1;
-          asyncPlatformFlush(function() {
-            assert.equal(progress.value, 60);
-            done();
-          });
-        });
-      });
-
-      test('set max', function(done) {
-        progress.max = 10;
-        progress.value = 11;
-        asyncPlatformFlush(function() {
-          assert.equal(progress.value, progress.max);
-          done();
-        });
-      });
-
-      test('test ratio', function(done) {
-        progress.max = 10;
-        progress.value = 5;
-        asyncPlatformFlush(function() {
-          assert.equal(progress.ratio, 50);
-          done();
-        });
-      });
-
-      test('test secondary ratio', function(done) {
-        progress.max = 10;
-        progress.secondaryProgress = 5;
-        asyncPlatformFlush(function() {
-          assert.equal(progress.secondaryRatio, 50);
-          done();
-        });
-      });
-
-      test('set min', function(done) {
-        progress.min = 10
-        progress.max = 50;
-        progress.value = 30;
-        asyncPlatformFlush(function() {
-          assert.equal(progress.ratio, 50);
-          progress.value = 0;
-          asyncPlatformFlush(function() {
-            assert.equal(progress.value, progress.min);
-            done();
-          });
-        });
-      });
-
-      test('set step', function(done) {
-        progress.min = 0;
-        progress.max = 10;
-        progress.value = 5.1;
-        asyncPlatformFlush(function() {
-          assert.equal(progress.value, 5);
-          progress.step = 0.1;
-          progress.value = 5.1;
-          asyncPlatformFlush(function() {
-            assert.equal(progress.value, 5.1);
-            done();
-          });
-        });
-      });
-    });
-
-    suite('transiting class', function() {
-      var progress;
-
-      setup(function() {
-        progress = fixture('transitingProgress');
-      });
-
-      test('progress bars', function() {
-        var stylesForPrimaryProgress = window.getComputedStyle(progress.$.primaryProgress);
-        var stylesForSecondaryProgress = window.getComputedStyle(progress.$.secondaryProgress);
-        var transitionProp = stylesForPrimaryProgress['transition-property'];
-
-        assert.isTrue(transitionProp === 'transform' || transitionProp === '-webkit-transform');
-        assert.equal(stylesForPrimaryProgress['transition-duration'], '0.08s');
-
-        transitionProp = stylesForSecondaryProgress['transition-property'];
-
-        assert.isTrue(transitionProp === 'transform' || transitionProp === '-webkit-transform');
-        assert.equal(stylesForSecondaryProgress['transition-duration'], '0.08s');
-      });
-    });
-
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-progress/test/index.html b/systrace/catapult/third_party/polymer/components/paper-progress/test/index.html
deleted file mode 100644
index b66f1de..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-progress/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'basic.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-radio-button/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/README.md b/systrace/catapult/third_party/polymer/components/paper-radio-button/README.md
deleted file mode 100644
index a99fda0..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-radio-button.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-radio-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-radio-button)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-radio-button)_
-
-
-##&lt;paper-radio-button&gt;
-
-Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
-
-`paper-radio-button` is a button that can be either checked or unchecked.
-User can tap the radio button to check or uncheck it.
-
-Use a `<paper-radio-group>` to group a set of radio buttons.  When radio buttons
-are inside a radio group, exactly one radio button in the group can be checked
-at any time.
-
-Example:
-
-```html
-<paper-radio-button></paper-radio-button>
-<paper-radio-button>Item label</paper-radio-button>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent` |
-| `--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color` |
-| `--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color` |
-| `--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color` |
-| `--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color` |
-| `--paper-radio-button-size` | Size of the radio button | `16px` |
-| `--paper-radio-button-label-color` | Label color | `--primary-text-color` |
-| `--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px` |
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/bower.json b/systrace/catapult/third_party/polymer/components/paper-radio-button/bower.json
deleted file mode 100644
index 90ec58c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/bower.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "paper-radio-button",
-  "version": "1.4.0",
-  "description": "A material design radio button",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "radio",
-    "control"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-radio-button"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-radio-button",
-  "ignore": [],
-  "dependencies": {
-    "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#~1.3.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.1.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "main": "paper-radio-button.html"
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-radio-button/demo/index.html
deleted file mode 100644
index 930e399..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/demo/index.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <title>paper-radio-button demo</title>
-
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <meta name="mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../paper-radio-button.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    .vertical-section-container {
-      max-width: 630px;
-    }
-
-    paper-radio-button {
-      margin-right: 24px;
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Radio buttons can be checked or unchecked, or disabled entirely</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-radio-button>Radio</paper-radio-button>
-        <paper-radio-button checked>Radio</paper-radio-button>
-        <paper-radio-button disabled>Disabled</paper-radio-button>
-      </template>
-    </demo-snippet>
-
-    <h3>Radio buttons can hide the ripple effect using the <i>noink</i> attribute</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-radio-button noink>Radio</paper-radio-button>
-      </template>
-    </demo-snippet>
-
-    <h3>Radio buttons can be styled using custom properties</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style is="custom-style">
-          paper-radio-button.red {
-            --paper-radio-button-checked-color: var(--paper-red-500);
-            --paper-radio-button-checked-ink-color: var(--paper-red-500);
-            --paper-radio-button-unchecked-color: var(--paper-red-900);
-            --paper-radio-button-unchecked-ink-color: var(--paper-red-900);
-            --paper-radio-button-label-color: var(--paper-red-500);
-          }
-          paper-radio-button.green {
-            --paper-radio-button-checked-color: var(--paper-green-500);
-            --paper-radio-button-checked-ink-color: var(--paper-green-500);
-            --paper-radio-button-unchecked-color: var(--paper-green-900);
-            --paper-radio-button-unchecked-ink-color: var(--paper-green-900);
-            --paper-radio-button-label-color: var(--paper-green-500);
-          }
-        </style>
-
-        <paper-radio-button class="red">Radio</paper-radio-button>
-        <paper-radio-button checked class="green">Radio</paper-radio-button>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/hero.svg b/systrace/catapult/third_party/polymer/components/paper-radio-button/hero.svg
deleted file mode 100755
index 7fbac94..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/hero.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
-<g id="background" display="none">
-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>
-</g>
-<g id="label">
-</g>
-<g id="art">
-	<g>
-		<circle cx="112.5" cy="63" r="8"/>
-		<path d="M112.5,80c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S121.9,80,112.5,80z M112.5,48c-8.3,0-15,6.7-15,15s6.7,15,15,15
-			s15-6.7,15-15S120.8,48,112.5,48z"/>
-	</g>
-	<g id="ic_x5F_add_x0D_">
-	</g>
-</g>
-<g id="Guides">
-</g>
-</svg>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/index.html b/systrace/catapult/third_party/polymer/components/paper-radio-button/index.html
deleted file mode 100644
index 04b0c66..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <title>paper-radio-button</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../polymer/polymer.html">
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/paper-radio-button.html b/systrace/catapult/third_party/polymer/components/paper-radio-button/paper-radio-button.html
deleted file mode 100644
index 1e63090..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/paper-radio-button.html
+++ /dev/null
@@ -1,247 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html">
-<link rel="import" href="../paper-styles/default-theme.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-
-<!--
-Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
-
-`paper-radio-button` is a button that can be either checked or unchecked.
-User can tap the radio button to check or uncheck it.
-
-Use a `<paper-radio-group>` to group a set of radio buttons.  When radio buttons
-are inside a radio group, exactly one radio button in the group can be checked
-at any time.
-
-Example:
-
-    <paper-radio-button></paper-radio-button>
-    <paper-radio-button>Item label</paper-radio-button>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-radio-button-unchecked-background-color` | Radio button background color when the input is not checked | `transparent`
-`--paper-radio-button-unchecked-color` | Radio button color when the input is not checked | `--primary-text-color`
-`--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when the input is not checked | `--primary-text-color`
-`--paper-radio-button-checked-color` | Radio button color when the input is checked | `--primary-color`
-`--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the input is checked | `--primary-color`
-`--paper-radio-button-size` | Size of the radio button | `16px`
-`--paper-radio-button-ink-size` | Size of the ripple | `48px`
-`--paper-radio-button-label-color` | Label color | `--primary-text-color`
-`--paper-radio-button-label-spacing` | Spacing between the label and the button | `10px`
-`--paper-radio-button-radio-container` | A mixin applied to the internal radio container | `{}`
-`--paper-radio-button-label` | A mixin applied to the internal label | `{}`
-`--paper-radio-button-label-checked` | A mixin applied to the internal label when the radio button is checked | `{}`
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
-@group Paper Elements
-@element paper-radio-button
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-radio-button">
-  <template strip-whitespace>
-    <style>
-      :host {
-        display: inline-block;
-        line-height: 0;
-        white-space: nowrap;
-        cursor: pointer;
-        @apply(--paper-font-common-base);
-        --calculated-paper-radio-button-size: var(--paper-radio-button-size, 16px);
-        /* -1px is a sentinel for the default and is replace in `attached`. */
-        --calculated-paper-radio-button-ink-size: var(--paper-radio-button-ink-size, -1px);
-      }
-
-      :host(:focus) {
-        outline: none;
-      }
-
-      #radioContainer {
-        @apply(--layout-inline);
-        @apply(--layout-center-center);
-        position: relative;
-        width: var(--calculated-paper-radio-button-size);
-        height: var(--calculated-paper-radio-button-size);
-        vertical-align: middle;
-        
-        @apply(--paper-radio-button-radio-container);
-      }
-
-      #ink {
-        position: absolute;
-        top: 50%;
-        left: 50%;
-        right: auto;
-        width: var(--calculated-paper-radio-button-ink-size);
-        height: var(--calculated-paper-radio-button-ink-size);
-        color: var(--paper-radio-button-unchecked-ink-color, --primary-text-color);
-        opacity: 0.6;
-        pointer-events: none;
-        -webkit-transform: translate(-50%, -50%);
-        transform: translate(-50%, -50%);
-      }
-
-      #ink[checked] {
-        color: var(--paper-radio-button-checked-ink-color, --primary-color);
-      }
-
-      #offRadio, #onRadio {
-        position: absolute;
-        box-sizing: border-box;
-        top: 0;
-        left: 0;
-        width: 100%;
-        height: 100%;
-        border-radius: 50%;
-      }
-
-      #offRadio {
-        border: 2px solid var(--paper-radio-button-unchecked-color, --primary-text-color);
-        background-color: var(--paper-radio-button-unchecked-background-color, transparent);
-        transition: border-color 0.28s;
-      }
-
-      #onRadio {
-        background-color: var(--paper-radio-button-checked-color, --primary-color);
-        -webkit-transform: scale(0);
-        transform: scale(0);
-        transition: -webkit-transform ease 0.28s;
-        transition: transform ease 0.28s;
-        will-change: transform;
-      }
-
-      :host([checked]) #offRadio {
-        border-color: var(--paper-radio-button-checked-color, --primary-color);
-      }
-
-      :host([checked]) #onRadio {
-        -webkit-transform: scale(0.5);
-        transform: scale(0.5);
-      }
-
-      #radioLabel {
-        line-height: normal;
-        position: relative;
-        display: inline-block;
-        vertical-align: middle;
-        margin-left: var(--paper-radio-button-label-spacing, 10px);
-        white-space: normal;
-        color: var(--paper-radio-button-label-color, --primary-text-color);
-
-        @apply(--paper-radio-button-label);
-      }
-
-      :host([checked]) #radioLabel {
-        @apply(--paper-radio-button-label-checked);
-      }
-
-      :host-context([dir="rtl"]) #radioLabel {
-        margin-left: 0;
-        margin-right: var(--paper-radio-button-label-spacing, 10px);
-      }
-
-      #radioLabel[hidden] {
-        display: none;
-      }
-
-      /* disabled state */
-
-      :host([disabled]) #offRadio {
-        border-color: var(--paper-radio-button-unchecked-color, --primary-text-color);
-        opacity: 0.5;
-      }
-
-      :host([disabled][checked]) #onRadio {
-        background-color: var(--paper-radio-button-unchecked-color, --primary-text-color);
-        opacity: 0.5;
-      }
-
-      :host([disabled]) #radioLabel {
-        /* slightly darker than the button, so that it's readable */
-        opacity: 0.65;
-      }
-    </style>
-
-    <div id="radioContainer">
-      <div id="offRadio"></div>
-      <div id="onRadio"></div>
-    </div>
-
-    <div id="radioLabel"><content></content></div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-radio-button',
-
-      behaviors: [
-        Polymer.PaperCheckedElementBehavior
-      ],
-
-      hostAttributes: {
-        role: 'radio',
-        'aria-checked': false,
-        tabindex: 0
-      },
-
-      properties: {
-        /**
-         * Fired when the checked state changes due to user interaction.
-         *
-         * @event change
-         */
-
-        /**
-         * Fired when the checked state changes.
-         *
-         * @event iron-change
-         */
-
-        ariaActiveAttribute: {
-          type: String,
-          value: 'aria-checked'
-        }
-      },
-
-      ready: function() {
-        this._rippleContainer = this.$.radioContainer;
-      },
-
-      attached: function() {
-        var inkSize = this.getComputedStyleValue('--calculated-paper-radio-button-ink-size').trim();
-        // If unset, compute and set the default `--paper-radio-button-ink-size`.
-        if (inkSize === '-1px') {
-          var size = parseFloat(this.getComputedStyleValue('--calculated-paper-radio-button-size').trim());
-          var defaultInkSize = Math.floor(3 * size);
-
-          // The button and ripple need to have the same parity so that their
-          // centers align.
-          if (defaultInkSize % 2 !== size % 2) {
-            defaultInkSize++;
-          }
-
-          this.customStyle['--paper-radio-button-ink-size'] = defaultInkSize + 'px';
-          this.updateStyles();
-        }
-      },
-    })
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-radio-button/test/basic.html
deleted file mode 100644
index 288f1b2..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/test/basic.html
+++ /dev/null
@@ -1,207 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-radio-button basic tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../paper-radio-button.html">
-
-  <style is="custom-style">
-    paper-radio-button.tiny {
-      --paper-radio-button-size: 5px;
-    }
-    paper-radio-button.medium {
-      --paper-radio-button-size: 37px;
-    }
-    paper-radio-button.giant {
-      --paper-radio-button-size: 50px;
-    }
-    paper-radio-button.enormous {
-      --paper-radio-button-size: 71px;
-    }
-
-    paper-radio-button.custom-ink-size {
-      --paper-radio-button-size: 25px;
-      --paper-radio-button-ink-size: 30px;
-    }
-  </style>
-</head>
-<body>
-  <test-fixture id="NoLabel">
-    <template>
-      <paper-radio-button id="radio1"></paper-radio-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithLabel">
-    <template>
-      <paper-radio-button id="radio2">Batman</paper-radio-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="AriaLabel">
-    <template>
-      <paper-radio-button aria-label="Batman">Robin</paper-radio-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="WithDifferentSizes">
-    <template>
-      <paper-radio-button class="tiny"></paper-radio-button>
-      <paper-radio-button></paper-radio-button>
-      <paper-radio-button class="medium"></paper-radio-button>
-      <paper-radio-button class="giant"></paper-radio-button>
-      <paper-radio-button class="enormous"></paper-radio-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="CustomInkSize">
-    <template>
-      <paper-radio-button class="custom-ink-size"></paper-radio-button>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('defaults', function() {
-      var r1;
-
-      setup(function() {
-        r1 = fixture('NoLabel');
-      });
-
-      test('check button via click', function(done) {
-        r1.addEventListener('click', function() {
-          assert.isTrue(r1.getAttribute('aria-checked') == 'true');
-          assert.isTrue(r1.checked);
-          done();
-        });
-        MockInteractions.tap(r1);
-      });
-
-      test('toggle button via click', function(done) {
-        r1.checked = true;
-        r1.addEventListener('click', function() {
-          assert.isFalse(r1.getAttribute('aria-checked') == 'true');
-          assert.isFalse(r1.checked);
-          done();
-        });
-        MockInteractions.tap(r1);
-      });
-
-      test('disabled button cannot be clicked', function(done) {
-        r1.disabled = true;
-        r1.checked = true;
-        MockInteractions.tap(r1);
-
-        setTimeout(function() {
-          assert.isTrue(r1.getAttribute('aria-checked') == 'true');
-          assert.isTrue(r1.checked);
-          done();
-        }, 1);
-      });
-
-      test('can be styled with different sizes', function() {
-        var r2 = fixture('WithDifferentSizes');
-        var small = r2[0].getBoundingClientRect();
-        var medium = r2[1].getBoundingClientRect();
-        var large = r2[2].getBoundingClientRect();
-
-        console.log(small.width, medium.width, large.width);
-
-        assert.isTrue(4 < small.height);
-        assert.isTrue(small.height < medium.height);
-        assert.isTrue(medium.height < large.height);
-        assert.isTrue(large.height < 72);
-
-        assert.isTrue(4 < small.width);
-        assert.isTrue(small.width < medium.width);
-        assert.isTrue(medium.width < large.width);
-        assert.isTrue(large.width < 72);
-      });
-    });
-
-    suite('ink size', function() {
-      var radioButtons;
-
-      setup(function() {
-        radioButtons = fixture('WithDifferentSizes');
-      });
-
-      test('`--paper-radio-button-ink-size` sets the ink size', function() {
-        var radioButton = fixture('CustomInkSize');
-        assert.equal(radioButton.getComputedStyleValue('--calculated-paper-radio-button-size').trim(), '25px');
-        assert.equal(radioButton.getComputedStyleValue('--calculated-paper-radio-button-ink-size').trim(), '30px');
-      });
-
-      test('ink sizes are near (3 * radio button size) by default', function() {
-        radioButtons.forEach(function(radioButton) {
-          var size = parseFloat(radioButton.getComputedStyleValue('--calculated-paper-radio-button-size'), 10);
-          var inkSize = parseFloat(radioButton.getComputedStyleValue('--calculated-paper-radio-button-ink-size'), 10);
-          assert.approximately(inkSize / size, 3, 0.1);
-        });
-      });
-
-      test('ink sizes are integers', function() {
-        radioButtons.forEach(function(radioButton) {
-          var unparsedInkSize = radioButton.getComputedStyleValue('--calculated-paper-radio-button-ink-size');
-          var floatInkSize = parseFloat(unparsedInkSize, 10);
-          var intInkSize = parseInt(unparsedInkSize, 10);
-          assert.equal(floatInkSize, intInkSize);
-        });
-      });
-
-      test('ink size parity matches radio button size parity (centers are aligned)', function() {
-        radioButtons.forEach(function(radioButton) {
-          var size = parseInt(radioButton.getComputedStyleValue('--calculated-paper-radio-button-size'), 10);
-          var inkSize = parseInt(radioButton.getComputedStyleValue('--calculated-paper-radio-button-ink-size'), 10);
-          assert.equal(size % 2, inkSize % 2);
-        });
-      });
-    });
-
-    suite('a11y', function() {
-      var r1;
-      var r2;
-
-      setup(function() {
-        r1 = fixture('NoLabel');
-        r2 = fixture('WithLabel');
-      });
-
-      test('has aria role "radio"', function() {
-        assert.isTrue(r1.getAttribute('role') == 'radio');
-        assert.isTrue(r2.getAttribute('role') == 'radio');
-      });
-
-      test('button with no label has no aria label', function() {
-        assert.isTrue(!r1.getAttribute('aria-label'));
-      });
-
-      test('button respects the user set aria-label', function() {
-        var c = fixture('AriaLabel');
-        assert.isTrue(c.getAttribute('aria-label') == "Batman");
-      });
-
-      a11ySuite('NoLabel');
-      a11ySuite('WithLabel');
-      a11ySuite('AriaLabel');
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-button/test/index.html b/systrace/catapult/third_party/polymer/components/paper-radio-button/test/index.html
deleted file mode 100644
index fdf44bf..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-button/test/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-radio-button tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'basic.html?dom=shadow',
-      // To enable `useNativeCSSProperties`, the native Shadow DOM and lazy
-      // registration flags must also be enabled.
-      // https://github.com/Polymer/polymer/blob/ff6e884ef4f309d41491333860a8bc9c2f178696/src/lib/settings.html#L55
-      'basic.html?dom=shadow&lazyRegister=true&useNativeCSSProperties=true'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-radio-group/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/README.md b/systrace/catapult/third_party/polymer/components/paper-radio-group/README.md
deleted file mode 100644
index 2f258bb..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-radio-group.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-radio-group.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-radio-group)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-radio-group)_
-
-
-##&lt;paper-radio-group&gt;
-
-Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
-
-`paper-radio-group` allows user to select at most one radio button from a set.
-Checking one radio button that belongs to a radio group unchecks any
-previously checked radio button within the same group. Use
-`selected` to get or set the selected radio button.
-
-The <paper-radio-buttons> inside the group must have the `name` attribute
-set.
-
-Example:
-
-```html
-<paper-radio-group selected="small">
-  <paper-radio-button name="small">Small</paper-radio-button>
-  <paper-radio-button name="medium">Medium</paper-radio-button>
-  <paper-radio-button name="large">Large</paper-radio-button>
-</paper-radio-group>
-```
-
-Radio-button-groups can be made optional, and allow zero buttons to be selected:
-
-```html
-<paper-radio-group selected="small" allow-empty-selection>
-  <paper-radio-button name="small">Small</paper-radio-button>
-  <paper-radio-button name="medium">Medium</paper-radio-button>
-  <paper-radio-button name="large">Large</paper-radio-button>
-</paper-radio-group>
-```
-
-See <a href="paper-radio-button">paper-radio-button</a> for more
-information about `paper-radio-button`.
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-radio-group-item-padding` | The padding of the item | `12px` |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/bower.json b/systrace/catapult/third_party/polymer/components/paper-radio-group/bower.json
deleted file mode 100644
index 2b94816..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/bower.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "paper-radio-group",
-  "version": "1.2.2",
-  "description": "A group of material design radio buttons",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "radio",
-    "control"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-radio-group.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-radio-group",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#^1.0.0",
-    "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.7",
-    "paper-radio-button": "PolymerElements/paper-radio-button#^1.0.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "main": "paper-radio-group.html"
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-radio-group/demo/index.html
deleted file mode 100644
index cfb613d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/demo/index.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <title>paper-radio-group demo</title>
-
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-    <meta name="mobile-web-app-capable" content="yes">
-    <meta name="apple-mobile-web-app-capable" content="yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../../paper-radio-button/paper-radio-button.html">
-    <link rel="import" href="../paper-radio-group.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      .vertical-section-container {
-        max-width: 500px;
-      }
-
-      label {
-        align-self: center;
-      }
-    </style>
-  </head>
-
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>A paper-radio-group allows only one item to be selected</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <label id="label1">Dinosaurs:</label>
-          <paper-radio-group aria-labelledby="label1">
-            <paper-radio-button name="a">allosaurus</paper-radio-button>
-            <paper-radio-button name="b">brontosaurus</paper-radio-button>
-            <paper-radio-button name="d" disabled>diplodocus</paper-radio-button>
-          </paper-radio-group>
-        </template>
-      </demo-snippet>
-
-      <h3>It can have an initial selection</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <label id="label2">Dinosaurs:</label>
-          <paper-radio-group selected="b" aria-labelledby="label2">
-            <paper-radio-button name="a">allosaurus</paper-radio-button>
-            <paper-radio-button name="b">brontosaurus</paper-radio-button>
-            <paper-radio-button name="d" disabled>diplodocus</paper-radio-button>
-          </paper-radio-group>
-        </template>
-      </demo-snippet>
-
-      <h3>It can optionally allow items to be deselected</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <label id="label3">Dinosaurs:</label>
-          <paper-radio-group selected="b" allow-empty-selection aria-labelledby="label3">
-            <paper-radio-button name="a">allosaurus</paper-radio-button>
-            <paper-radio-button name="b">brontosaurus</paper-radio-button>
-            <paper-radio-button name="d" disabled>diplodocus</paper-radio-button>
-          </paper-radio-group>
-        </template>
-      </demo-snippet>
-
-    </div>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/hero.svg b/systrace/catapult/third_party/polymer/components/paper-radio-group/hero.svg
deleted file mode 100755
index fc78ba7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/hero.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">
-<g id="background" display="none">
-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>
-</g>
-<g id="label">
-</g>
-<g id="art">
-	<g>
-		<circle cx="112.5" cy="41" r="8"/>
-		<path d="M112.5,58c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S121.9,58,112.5,58z M112.5,26c-8.3,0-15,6.7-15,15s6.7,15,15,15
-			s15-6.7,15-15S120.8,26,112.5,26z"/>
-		<circle cx="112.5" cy="85" r="8"/>
-		<path d="M112.5,102c-9.4,0-17-7.6-17-17s7.6-17,17-17s17,7.6,17,17S121.9,102,112.5,102z M112.5,70c-8.3,0-15,6.7-15,15
-			s6.7,15,15,15s15-6.7,15-15S120.8,70,112.5,70z"/>
-	</g>
-	<g id="ic_x5F_add_x0D_">
-	</g>
-</g>
-<g id="Guides">
-</g>
-</svg>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/index.html b/systrace/catapult/third_party/polymer/components/paper-radio-group/index.html
deleted file mode 100644
index 966c717..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-    <title>paper-radio-group</title>
-
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../polymer/polymer.html">
-    <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-  </head>
-  <body>
-
-    <iron-component-page></iron-component-page>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/paper-radio-group.html b/systrace/catapult/third_party/polymer/components/paper-radio-group/paper-radio-group.html
deleted file mode 100644
index 5027e11..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/paper-radio-group.html
+++ /dev/null
@@ -1,185 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-<link rel="import" href="../iron-menu-behavior/iron-menubar-behavior.html">
-<link rel="import" href="../paper-radio-button/paper-radio-button.html">
-
-<!--
-Material design: [Radio button](https://www.google.com/design/spec/components/selection-controls.html#selection-controls-radio-button)
-
-`paper-radio-group` allows user to select at most one radio button from a set.
-Checking one radio button that belongs to a radio group unchecks any
-previously checked radio button within the same group. Use
-`selected` to get or set the selected radio button.
-
-The <paper-radio-buttons> inside the group must have the `name` attribute
-set.
-
-Example:
-
-    <paper-radio-group selected="small">
-      <paper-radio-button name="small">Small</paper-radio-button>
-      <paper-radio-button name="medium">Medium</paper-radio-button>
-      <paper-radio-button name="large">Large</paper-radio-button>
-    </paper-radio-group>
-
-Radio-button-groups can be made optional, and allow zero buttons to be selected:
-
-    <paper-radio-group selected="small" allow-empty-selection>
-      <paper-radio-button name="small">Small</paper-radio-button>
-      <paper-radio-button name="medium">Medium</paper-radio-button>
-      <paper-radio-button name="large">Large</paper-radio-button>
-    </paper-radio-group>
-
-See <a href="paper-radio-button">paper-radio-button</a> for more
-information about `paper-radio-button`.
-
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-radio-group-item-padding` | The padding of the item | `12px`
-
-@group Paper Elements
-@element paper-radio-group
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-radio-group">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-      }
-
-      :host ::content > * {
-        padding: var(--paper-radio-group-item-padding, 12px);
-      }
-    </style>
-
-    <content id="items" select="*"></content>
-  </template>
-</dom-module>
-
-<script>
-  Polymer({
-    is: 'paper-radio-group',
-
-    behaviors: [
-      Polymer.IronMenubarBehavior
-    ],
-
-    hostAttributes: {
-      role: 'radiogroup',
-      tabindex: 0
-    },
-
-    properties: {
-      /**
-       * Fired when the radio group selection changes.
-       *
-       * @event paper-radio-group-changed
-       */
-
-      /**
-       * Overriden from Polymer.IronSelectableBehavior
-       */
-      attrForSelected: {
-        type: String,
-        value: 'name'
-      },
-
-      /**
-       * Overriden from Polymer.IronSelectableBehavior
-       */
-      selectedAttribute: {
-        type: String,
-        value: 'checked'
-      },
-
-      /**
-       * Overriden from Polymer.IronSelectableBehavior
-       */
-      selectable: {
-        type: String,
-        value: 'paper-radio-button'
-      },
-
-      /**
-       * If true, radio-buttons can be deselected
-       */
-      allowEmptySelection: {
-        type: Boolean,
-        value: false
-      }
-    },
-
-    /**
-     * Selects the given value.
-     */
-    select: function(value) {
-      var newItem = this._valueToItem(value);
-      if (newItem && newItem.hasAttribute('disabled')) {
-        return;
-      }
-
-      if (this.selected) {
-        var oldItem = this._valueToItem(this.selected);
-
-        if (this.selected == value) {
-          // If deselecting is allowed we'll have to apply an empty selection.
-          // Otherwise, we should force the selection to stay and make this
-          // action a no-op.
-          if (this.allowEmptySelection) {
-            value = '';
-          } else {
-            if (oldItem)
-              oldItem.checked = true;
-            return;
-          }
-        }
-
-        if (oldItem)
-          oldItem.checked = false;
-      }
-
-      Polymer.IronSelectableBehavior.select.apply(this, [value]);
-      this.fire('paper-radio-group-changed');
-    },
-
-    _activateFocusedItem: function() {
-      this._itemActivate(this._valueForItem(this.focusedItem), this.focusedItem);
-    },
-
-    _onUpKey: function(event) {
-      this._focusPrevious();
-      event.preventDefault();
-      this._activateFocusedItem();
-    },
-
-    _onDownKey: function(event) {
-      this._focusNext();
-      event.preventDefault();
-      this._activateFocusedItem();
-    },
-
-    _onLeftKey: function(event) {
-      Polymer.IronMenubarBehaviorImpl._onLeftKey.apply(this, arguments);
-      this._activateFocusedItem();
-    },
-
-    _onRightKey: function(event) {
-      Polymer.IronMenubarBehaviorImpl._onRightKey.apply(this, arguments);
-      this._activateFocusedItem();
-    }
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-radio-group/test/basic.html
deleted file mode 100644
index d123c7f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/test/basic.html
+++ /dev/null
@@ -1,249 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-    <meta charset="UTF-8">
-    <title>paper-radio-group basic tests</title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../iron-test-helpers/mock-interactions.js"></script>
-    <link rel="import" href="../paper-radio-group.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="NoSelection">
-      <template>
-        <paper-radio-group>
-          <paper-radio-button name="r1">r1</paper-radio-button>
-          <paper-radio-button name="r2">r2</paper-radio-button>
-          <paper-radio-button name="r3">r3</paper-radio-button>
-        </paper-radio-group>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="WithSelection">
-      <template>
-        <paper-radio-group selected="r1">
-          <paper-radio-button name="r1">r1</paper-radio-button>
-          <paper-radio-button name="r2">r2</paper-radio-button>
-          <paper-radio-button name="r3">r3</paper-radio-button>
-        </paper-radio-group>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="WithDisabled">
-      <template>
-        <paper-radio-group selected="r1">
-          <paper-radio-button name="r1">r1</paper-radio-button>
-          <paper-radio-button name="r2" disabled>r2</paper-radio-button>
-          <paper-radio-button name="r3">r3</paper-radio-button>
-        </paper-radio-group>
-      </template>
-    </test-fixture>
-
-    <script>
-      suite('defaults', function() {
-        var LEFT_ARROW = 37;
-        var RIGHT_ARROW = 39;
-
-        test('group can have no selection', function (done) {
-          var g = fixture('NoSelection');
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            expect(g.selected).to.not.be.ok;
-            var items = g.items;
-            expect(items.length).to.be.equal(3);
-
-            expect(items[0].checked).to.be.equal(false);
-            expect(items[1].checked).to.be.equal(false);
-            expect(items[2].checked).to.be.equal(false);
-
-            done();
-          }, 1);
-
-        });
-
-        test('group can have a selection', function (done) {
-          var g = fixture('WithSelection');
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            expect(g.selected).to.be.ok;
-            var items = g.items;
-            expect(items.length).to.be.equal(3);
-
-            expect(items[0].checked).to.be.equal(true);
-            expect(items[1].checked).to.be.equal(false);
-            expect(items[2].checked).to.be.equal(false);
-            expect(items[0].getAttribute('name')).to.be.equal(g.selected);
-
-            done();
-          }, 1);
-        });
-
-        test('right arrow advances the selection', function (done) {
-          var g = fixture('WithSelection');
-          MockInteractions.focus(g);
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            var items = g.items;
-            expect(items[0].checked).to.be.equal(true);
-
-            g.addEventListener('paper-radio-group-changed', function () {
-              expect(items[0].checked).to.be.equal(false);
-              expect(items[1].checked).to.be.equal(true);
-              expect(items[2].checked).to.be.equal(false);
-              done();
-            });
-            MockInteractions.keyDownOn(g, RIGHT_ARROW);
-          }, 1);
-        });
-
-        test('left arrow reverses the selection', function (done) {
-          var g = fixture('WithSelection');
-          MockInteractions.focus(g);
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            var items = g.items;
-            expect(items[0].checked).to.be.equal(true);
-
-            g.addEventListener('paper-radio-group-changed', function () {
-              expect(items[0].checked).to.be.equal(false);
-              expect(items[1].checked).to.be.equal(false);
-              expect(items[2].checked).to.be.equal(true);
-              done();
-            });
-            MockInteractions.keyDownOn(g, LEFT_ARROW);
-          }, 1);
-        });
-
-        test('selection should skip disabled items', function (done) {
-          var g = fixture('WithDisabled');
-          MockInteractions.focus(g);
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            var items = g.items;
-            expect(items[0].checked).to.be.equal(true);
-
-            g.addEventListener('paper-radio-group-changed', function () {
-              expect(items[0].checked).to.be.equal(false);
-              expect(items[1].checked).to.be.equal(false);
-              expect(items[2].checked).to.be.equal(true);
-              done();
-            });
-            MockInteractions.keyDownOn(g, RIGHT_ARROW);
-          }, 1);
-        });
-
-        test('clicking should change the selection', function (done) {
-          var g = fixture('WithSelection');
-          MockInteractions.focus(g);
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            var items = g.items;
-            expect(items[0].checked).to.be.equal(true);
-
-            g.addEventListener('paper-radio-group-changed', function () {
-              expect(items[0].checked).to.be.equal(false);
-              expect(items[1].checked).to.be.equal(true);
-              expect(items[2].checked).to.be.equal(false);
-              done();
-            });
-            MockInteractions.tap(items[1]);
-          }, 1);
-        });
-
-        test('clicking the selected item should not deselect', function (done) {
-          var g = fixture('WithSelection');
-          MockInteractions.focus(g);
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            var items = g.items;
-            expect(items[0].checked).to.be.equal(true);
-
-            // The selection should not change, but wait for a little bit just
-            // in case it would and an event would be fired.
-            setTimeout(function() {
-              expect(items[0].checked).to.be.equal(true);
-              expect(items[1].checked).to.be.equal(false);
-              expect(items[2].checked).to.be.equal(false);
-              done();
-            }, 1);
-            MockInteractions.tap(items[0]);
-          }, 1);
-        });
-
-        test('clicking the selected item should deselect if allow-empty-selection is set', function (done) {
-          var g = fixture('WithSelection');
-          g.allowEmptySelection = true;
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            var items = g.items;
-            expect(items[0].checked).to.be.equal(true);
-
-            // The selection should not change, but wait for a little bit just
-            // in case it would and an event would be fired.
-            setTimeout(function() {
-              expect(items[0].checked).to.be.equal(false);
-              expect(items[1].checked).to.be.equal(false);
-              expect(items[2].checked).to.be.equal(false);
-              done();
-            }, 1);
-            MockInteractions.tap(items[0]);
-          }, 1);
-        });
-
-        test('arrow keys cause iron-activate events', function(done) {
-          var g = fixture('WithSelection');
-          MockInteractions.focus(g);
-
-          // Needs to be async since the underlying iron-selector uses observeNodes.
-          Polymer.Base.async(function() {
-            g.items[0].focus();
-
-            var i = 0;
-            g.addEventListener('iron-activate', function() {
-              switch (i++) {
-                case 0:
-                  MockInteractions.pressAndReleaseKeyOn(g, 38);
-                break;
-
-                case 1:
-                  MockInteractions.pressAndReleaseKeyOn(g, 39);
-                break;
-
-                case 2:
-                  MockInteractions.pressAndReleaseKeyOn(g, 40);
-                break;
-
-                default:
-                  done();
-              }
-            });
-
-            MockInteractions.pressAndReleaseKeyOn(g, 37);
-          }, 1);
-        });
-
-      });
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-radio-group/test/index.html b/systrace/catapult/third_party/polymer/components/paper-radio-group/test/index.html
deleted file mode 100644
index cf387c5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-radio-group/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-    <title>paper-radio-group tests</title>
-    <script src="../../web-component-tester/browser.js"></script>
-  </head>
-  <body>
-    <script>
-      WCT.loadSuites([
-        'basic.html',
-        'basic.html?dom=shadow'
-      ]);
-    </script>
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-ripple/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/README.md b/systrace/catapult/third_party/polymer/components/paper-ripple/README.md
deleted file mode 100644
index 6d3fa5a..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-ripple.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-ripple)
-
-##&lt;paper-ripple&gt;
-
-Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction)
-
-`paper-ripple` provides a visual effect that other paper elements can
-use to simulate a rippling effect emanating from the point of contact.  The
-effect can be visualized as a concentric circle with motion.
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-ripple.html">
-    <style is="custom-style">
-      div {
-        height: 100px;
-        width: 100%;
-        box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24);
-      }
-      
-      paper-ripple {
-        color: #4285f4;
-      }
-    </style>
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<div style="position: relative">
-  <paper-ripple></paper-ripple>
-</div
-```
-
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/bower.json b/systrace/catapult/third_party/polymer/components/paper-ripple/bower.json
deleted file mode 100644
index f5e3dce..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "paper-ripple",
-  "version": "1.0.9",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Adds a material design ripple to any container",
-  "private": true,
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "ripple"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-ripple.git"
-  },
-  "main": "paper-ripple.html",
-  "dependencies": {
-    "iron-a11y-keys-behavior": "polymerelements/iron-a11y-keys-behavior#^1.1.5",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "iron-icon": "polymerelements/iron-icon#^1.0.0",
-    "iron-icons": "polymerelements/iron-icons#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-styles": "polymerelements/paper-styles#^1.0.0",
-    "test-fixture": "polymerelements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-ripple/demo/index.html
deleted file mode 100644
index e12cde5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/demo/index.html
+++ /dev/null
@@ -1,415 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<!doctype html>
-<html>
-<head>
-  <title>paper-ripple demo</title>
-
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-  <meta name="mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../paper-ripple.html">
-  <link rel="import" href="../../paper-styles/typography.html">
-  <link rel="import" href="../../iron-icon/iron-icon.html">
-
-  <style>
-
-    body {
-      background-color: #f9f9f9;
-      font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial;
-      -webkit-tap-highlight-color: rgba(0,0,0,0);
-      -webkit-touch-callout: none;
-    }
-
-    section {
-      padding: 30px 25px;
-    }
-
-    section > * {
-      margin: 10px
-    }
-
-    /* Button */
-    .button {
-      display: inline-block;
-      position: relative;
-      width: 120px;
-      height: 32px;
-      line-height: 32px;
-      border-radius: 2px;
-      font-size: 0.9em;
-      background-color: #fff;
-      color: #646464;
-    }
-
-    .button > paper-ripple {
-      border-radius: 2px;
-      overflow: hidden;
-    }
-
-    .button.narrow {
-      width: 60px;
-    }
-
-    .button.grey {
-      background-color: #eee;
-    }
-
-    .button.blue {
-      background-color: #4285f4;
-      color: #fff;
-    }
-
-    .button.green {
-      background-color: #0f9d58;
-      color: #fff;
-    }
-
-    .button.raised {
-      transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
-      transition-delay: 0.2s;
-      box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
-    }
-
-    .button.raised:active {
-      box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
-      transition-delay: 0s;
-    }
-
-    /* Icon Button */
-    .icon-button {
-      position: relative;
-      display: inline-block;
-      width: 56px;
-      height: 56px;
-    }
-
-    .icon-button > iron-icon {
-      margin: 16px;
-      transition: -webkit-transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
-      transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
-    }
-
-    .icon-button:hover > iron-icon {
-      -webkit-transform: scale(1.2);
-      transform: scale(1.2);
-    }
-
-    .icon-button > paper-ripple {
-      overflow: hidden;
-      color: #646464;
-    }
-
-    .icon-button.red > iron-icon::shadow path {
-      fill: #db4437;
-    }
-
-    .icon-button.red > paper-ripple {
-      color: #db4437;
-    }
-
-    .icon-button.blue > iron-icon::shadow path {
-      fill: #4285f4;
-    }
-
-    .icon-button.blue > paper-ripple {
-      color: #4285f4;
-    }
-
-    /* FAB */
-    .fab {
-      position: relative;
-      display: inline-block;
-      width: 56px;
-      height: 56px;
-      border-radius: 50%;
-      color: #fff;
-      overflow: hidden;
-      transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
-      transition-delay: 0.2s;
-      box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
-    }
-
-    .fab.red {
-      background-color: #d23f31;
-    }
-
-    .fab.blue {
-      background-color: #4285f4;
-    }
-
-    .fab.green {
-      background-color: #0f9d58;
-    }
-
-    .fab:active {
-      box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
-      transition-delay: 0s;
-    }
-
-    .fab > iron-icon {
-      margin: 16px;
-    }
-
-    .fab > iron-icon::shadow path {
-      fill: #fff;
-    }
-
-    /* Menu */
-    .menu {
-      display: inline-block;
-      width: 180px;
-      background-color: #fff;
-      box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2);
-    }
-
-    .item {
-      position: relative;
-      height: 48px;
-      line-height: 48px;
-      color: #646464;
-      font-size: 0.9em;
-    }
-
-    .menu.blue > .item {
-      color: #4285f4;
-    }
-
-    /* Card, Dialog */
-    .card, .dialog {
-      position: relative;
-      display: inline-block;
-      width: 300px;
-      height: 240px;
-      vertical-align: top;
-      background-color: #fff;
-      box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24);
-    }
-
-    .dialog {
-      box-sizing: border-box;
-      padding: 16px;
-    }
-
-    .dialog > .content {
-      height: 170px;
-      font-size: 0.9em;
-    }
-
-    .dialog > .content > .title {
-      font-size: 1.3em;
-    }
-
-    .dialog > .button {
-      width: 90px;
-      float: right;
-    }
-
-    .card.image {
-      background: url(http://lorempixel.com/300/240/nature/);
-      color: #fff;
-    }
-
-    /* Misc */
-    .center {
-      text-align: center;
-    }
-
-    .label {
-      padding: 0 16px;
-    }
-
-    .label-blue {
-      color: #4285f4;
-    }
-
-    .label-red {
-      color: #d23f31;
-    }
-
-  </style>
-
-</head>
-<body>
-
-  <section>
-
-    <div class="button raised">
-      <div class="center" fit tabindex="1">SUBMIT</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-    <div class="button raised" noink>
-      <div class="center" fit tabindex="1">NO INK</div>
-      <paper-ripple noink></paper-ripple>
-    </div>
-
-    <div class="button raised grey">
-      <div class="center" fit tabindex="1">CANCEL</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-    <div class="button raised blue">
-      <div class="center" fit tabindex="1">COMPOSE</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-    <div class="button raised green">
-      <div class="center" fit tabindex="1">OK</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-  </section>
-
-  <section>
-
-    <div class="button raised grey narrow">
-      <div class="center" fit tabindex="1">+1</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-    <div class="button raised grey narrow label-blue">
-      <div class="center" fit tabindex="1">+1</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-    <div class="button raised grey narrow label-red">
-      <div class="center" fit tabindex="1">+1</div>
-      <paper-ripple></paper-ripple>
-    </div>
-
-  </section>
-
-  <section>
-
-    <div class="icon-button">
-      <iron-icon icon="menu" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-    <div class="icon-button">
-      <iron-icon icon="more-vert" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-    <div class="icon-button red">
-      <iron-icon icon="delete" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-    <div class="icon-button blue">
-      <iron-icon icon="account-box" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-  </section>
-
-  <section>
-
-    <div class="fab red">
-      <iron-icon icon="add" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-    <div class="fab blue">
-      <iron-icon icon="mail" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-    <div class="fab green">
-      <iron-icon icon="create" tabindex="1"></iron-icon>
-      <paper-ripple class="circle" recenters></paper-ripple>
-    </div>
-
-  </section>
-
-  <section>
-
-    <div class="menu">
-
-      <div class="item">
-        <div class="label" fit tabindex="1">Mark as unread</div>
-        <paper-ripple></paper-ripple>
-      </div>
-      <div class="item">
-        <div class="label" fit tabindex="1">Mark as important</div>
-        <paper-ripple></paper-ripple>
-      </div>
-      <div class="item">
-        <div class="label" fit tabindex="1">Add to Tasks</div>
-        <paper-ripple></paper-ripple>
-      </div>
-      <div class="item">
-        <div class="label" fit tabindex="1">Create event</div>
-        <paper-ripple></paper-ripple>
-      </div>
-
-    </div>
-
-    <div class="menu blue">
-
-      <div class="item">
-        <div class="label" fit tabindex="1">Import</div>
-        <paper-ripple></paper-ripple>
-      </div>
-      <div class="item">
-        <div class="label" fit tabindex="1">Export</div>
-        <paper-ripple></paper-ripple>
-      </div>
-      <div class="item">
-        <div class="label" fit tabindex="1">Print</div>
-        <paper-ripple></paper-ripple>
-      </div>
-      <div class="item">
-        <div class="label" fit tabindex="1">Restore contacts</div>
-        <paper-ripple></paper-ripple>
-      </div>
-
-    </div>
-
-  </section>
-
-  <section>
-
-    <div class="dialog">
-
-      <div class="content">
-        <div class="title">Permission</div><br>
-        <div>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.</div>
-      </div>
-
-      <div class="button label-blue">
-        <div class="center" fit tabindex="1">ACCEPT</div>
-        <paper-ripple></paper-ripple>
-      </div>
-
-      <div class="button">
-        <div class="center" fit tabindex="1">DECLINE</div>
-        <paper-ripple></paper-ripple>
-      </div>
-
-    </div>
-
-    <div class="card" tabindex="1">
-      <paper-ripple recenters></paper-ripple>
-    </div>
-
-    <div class="card image" tabindex="1">
-      <paper-ripple recenters></paper-ripple>
-    </div>
-
-  </section>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/hero.svg b/systrace/catapult/third_party/polymer/components/paper-ripple/hero.svg
deleted file mode 100755
index 96f0b4c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/hero.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<path d="M175,81H49V45h126V81z M51,79h122V47H51V79z"/>

-	<g>

-		<defs>

-			<rect id="SVGID_5_" x="50" y="46" width="124" height="34"/>

-		</defs>

-		<clipPath id="SVGID_2_">

-			<use xlink:href="#SVGID_5_"  overflow="visible"/>

-		</clipPath>

-		<circle opacity="0.5" clip-path="url(#SVGID_2_)" cx="84.4" cy="62.7" r="41.9"/>

-		<circle opacity="0.6" clip-path="url(#SVGID_2_)" cx="84.4" cy="62.7" r="26.3"/>

-		<circle opacity="0.6" clip-path="url(#SVGID_2_)" cx="66.4" cy="62.7" r="26.3"/>

-	</g>

-	<circle cx="50" cy="80" r="4"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/index.html b/systrace/catapult/third_party/polymer/components/paper-ripple/index.html
deleted file mode 100644
index e552b0b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-ripple</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/paper-ripple.html b/systrace/catapult/third_party/polymer/components/paper-ripple/paper-ripple.html
deleted file mode 100644
index 3fb18a3..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/paper-ripple.html
+++ /dev/null
@@ -1,763 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
-
-<!--
-Material design: [Surface reaction](https://www.google.com/design/spec/animation/responsive-interaction.html#responsive-interaction-surface-reaction)
-
-`paper-ripple` provides a visual effect that other paper elements can
-use to simulate a rippling effect emanating from the point of contact.  The
-effect can be visualized as a concentric circle with motion.
-
-Example:
-
-    <div style="position:relative">
-      <paper-ripple></paper-ripple>
-    </div>
-
-Note, it's important that the parent container of the ripple be relative position, otherwise
-the ripple will emanate outside of the desired container.
-
-`paper-ripple` listens to "mousedown" and "mouseup" events so it would display ripple
-effect when touches on it.  You can also defeat the default behavior and
-manually route the down and up actions to the ripple element.  Note that it is
-important if you call `downAction()` you will have to make sure to call
-`upAction()` so that `paper-ripple` would end the animation loop.
-
-Example:
-
-    <paper-ripple id="ripple" style="pointer-events: none;"></paper-ripple>
-    ...
-    downAction: function(e) {
-      this.$.ripple.downAction({detail: {x: e.x, y: e.y}});
-    },
-    upAction: function(e) {
-      this.$.ripple.upAction();
-    }
-
-Styling ripple effect:
-
-  Use CSS color property to style the ripple:
-
-    paper-ripple {
-      color: #4285f4;
-    }
-
-  Note that CSS color property is inherited so it is not required to set it on
-  the `paper-ripple` element directly.
-
-By default, the ripple is centered on the point of contact.  Apply the `recenters`
-attribute to have the ripple grow toward the center of its container.
-
-    <paper-ripple recenters></paper-ripple>
-
-You can also  center the ripple inside its container from the start.
-
-    <paper-ripple center></paper-ripple>
-
-Apply `circle` class to make the rippling effect within a circle.
-
-    <paper-ripple class="circle"></paper-ripple>
-
-@group Paper Elements
-@element paper-ripple
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-ripple">
-
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: absolute;
-        border-radius: inherit;
-        overflow: hidden;
-        top: 0;
-        left: 0;
-        right: 0;
-        bottom: 0;
-
-        /* See PolymerElements/paper-behaviors/issues/34. On non-Chrome browsers,
-         * creating a node (with a position:absolute) in the middle of an event
-         * handler "interrupts" that event handler (which happens when the
-         * ripple is created on demand) */
-        pointer-events: none;
-      }
-
-      :host([animating]) {
-        /* This resolves a rendering issue in Chrome (as of 40) where the
-           ripple is not properly clipped by its parent (which may have
-           rounded corners). See: http://jsbin.com/temexa/4
-
-           Note: We only apply this style conditionally. Otherwise, the browser
-           will create a new compositing layer for every ripple element on the
-           page, and that would be bad. */
-        -webkit-transform: translate(0, 0);
-        transform: translate3d(0, 0, 0);
-      }
-
-      #background,
-      #waves,
-      .wave-container,
-      .wave {
-        pointer-events: none;
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 100%;
-        height: 100%;
-      }
-
-      #background,
-      .wave {
-        opacity: 0;
-      }
-
-      #waves,
-      .wave {
-        overflow: hidden;
-      }
-
-      .wave-container,
-      .wave {
-        border-radius: 50%;
-      }
-
-      :host(.circle) #background,
-      :host(.circle) #waves {
-        border-radius: 50%;
-      }
-
-      :host(.circle) .wave-container {
-        overflow: hidden;
-      }
-    </style>
-
-    <div id="background"></div>
-    <div id="waves"></div>
-  </template>
-</dom-module>
-<script>
-  (function() {
-    var Utility = {
-      distance: function(x1, y1, x2, y2) {
-        var xDelta = (x1 - x2);
-        var yDelta = (y1 - y2);
-
-        return Math.sqrt(xDelta * xDelta + yDelta * yDelta);
-      },
-
-      now: window.performance && window.performance.now ?
-          window.performance.now.bind(window.performance) : Date.now
-    };
-
-    /**
-     * @param {HTMLElement} element
-     * @constructor
-     */
-    function ElementMetrics(element) {
-      this.element = element;
-      this.width = this.boundingRect.width;
-      this.height = this.boundingRect.height;
-
-      this.size = Math.max(this.width, this.height);
-    }
-
-    ElementMetrics.prototype = {
-      get boundingRect () {
-        return this.element.getBoundingClientRect();
-      },
-
-      furthestCornerDistanceFrom: function(x, y) {
-        var topLeft = Utility.distance(x, y, 0, 0);
-        var topRight = Utility.distance(x, y, this.width, 0);
-        var bottomLeft = Utility.distance(x, y, 0, this.height);
-        var bottomRight = Utility.distance(x, y, this.width, this.height);
-
-        return Math.max(topLeft, topRight, bottomLeft, bottomRight);
-      }
-    };
-
-    /**
-     * @param {HTMLElement} element
-     * @constructor
-     */
-    function Ripple(element) {
-      this.element = element;
-      this.color = window.getComputedStyle(element).color;
-
-      this.wave = document.createElement('div');
-      this.waveContainer = document.createElement('div');
-      this.wave.style.backgroundColor = this.color;
-      this.wave.classList.add('wave');
-      this.waveContainer.classList.add('wave-container');
-      Polymer.dom(this.waveContainer).appendChild(this.wave);
-
-      this.resetInteractionState();
-    }
-
-    Ripple.MAX_RADIUS = 300;
-
-    Ripple.prototype = {
-      get recenters() {
-        return this.element.recenters;
-      },
-
-      get center() {
-        return this.element.center;
-      },
-
-      get mouseDownElapsed() {
-        var elapsed;
-
-        if (!this.mouseDownStart) {
-          return 0;
-        }
-
-        elapsed = Utility.now() - this.mouseDownStart;
-
-        if (this.mouseUpStart) {
-          elapsed -= this.mouseUpElapsed;
-        }
-
-        return elapsed;
-      },
-
-      get mouseUpElapsed() {
-        return this.mouseUpStart ?
-          Utility.now () - this.mouseUpStart : 0;
-      },
-
-      get mouseDownElapsedSeconds() {
-        return this.mouseDownElapsed / 1000;
-      },
-
-      get mouseUpElapsedSeconds() {
-        return this.mouseUpElapsed / 1000;
-      },
-
-      get mouseInteractionSeconds() {
-        return this.mouseDownElapsedSeconds + this.mouseUpElapsedSeconds;
-      },
-
-      get initialOpacity() {
-        return this.element.initialOpacity;
-      },
-
-      get opacityDecayVelocity() {
-        return this.element.opacityDecayVelocity;
-      },
-
-      get radius() {
-        var width2 = this.containerMetrics.width * this.containerMetrics.width;
-        var height2 = this.containerMetrics.height * this.containerMetrics.height;
-        var waveRadius = Math.min(
-          Math.sqrt(width2 + height2),
-          Ripple.MAX_RADIUS
-        ) * 1.1 + 5;
-
-        var duration = 1.1 - 0.2 * (waveRadius / Ripple.MAX_RADIUS);
-        var timeNow = this.mouseInteractionSeconds / duration;
-        var size = waveRadius * (1 - Math.pow(80, -timeNow));
-
-        return Math.abs(size);
-      },
-
-      get opacity() {
-        if (!this.mouseUpStart) {
-          return this.initialOpacity;
-        }
-
-        return Math.max(
-          0,
-          this.initialOpacity - this.mouseUpElapsedSeconds * this.opacityDecayVelocity
-        );
-      },
-
-      get outerOpacity() {
-        // Linear increase in background opacity, capped at the opacity
-        // of the wavefront (waveOpacity).
-        var outerOpacity = this.mouseUpElapsedSeconds * 0.3;
-        var waveOpacity = this.opacity;
-
-        return Math.max(
-          0,
-          Math.min(outerOpacity, waveOpacity)
-        );
-      },
-
-      get isOpacityFullyDecayed() {
-        return this.opacity < 0.01 &&
-          this.radius >= Math.min(this.maxRadius, Ripple.MAX_RADIUS);
-      },
-
-      get isRestingAtMaxRadius() {
-        return this.opacity >= this.initialOpacity &&
-          this.radius >= Math.min(this.maxRadius, Ripple.MAX_RADIUS);
-      },
-
-      get isAnimationComplete() {
-        return this.mouseUpStart ?
-          this.isOpacityFullyDecayed : this.isRestingAtMaxRadius;
-      },
-
-      get translationFraction() {
-        return Math.min(
-          1,
-          this.radius / this.containerMetrics.size * 2 / Math.sqrt(2)
-        );
-      },
-
-      get xNow() {
-        if (this.xEnd) {
-          return this.xStart + this.translationFraction * (this.xEnd - this.xStart);
-        }
-
-        return this.xStart;
-      },
-
-      get yNow() {
-        if (this.yEnd) {
-          return this.yStart + this.translationFraction * (this.yEnd - this.yStart);
-        }
-
-        return this.yStart;
-      },
-
-      get isMouseDown() {
-        return this.mouseDownStart && !this.mouseUpStart;
-      },
-
-      resetInteractionState: function() {
-        this.maxRadius = 0;
-        this.mouseDownStart = 0;
-        this.mouseUpStart = 0;
-
-        this.xStart = 0;
-        this.yStart = 0;
-        this.xEnd = 0;
-        this.yEnd = 0;
-        this.slideDistance = 0;
-
-        this.containerMetrics = new ElementMetrics(this.element);
-      },
-
-      draw: function() {
-        var scale;
-        var translateString;
-        var dx;
-        var dy;
-
-        this.wave.style.opacity = this.opacity;
-
-        scale = this.radius / (this.containerMetrics.size / 2);
-        dx = this.xNow - (this.containerMetrics.width / 2);
-        dy = this.yNow - (this.containerMetrics.height / 2);
-
-
-        // 2d transform for safari because of border-radius and overflow:hidden clipping bug.
-        // https://bugs.webkit.org/show_bug.cgi?id=98538
-        this.waveContainer.style.webkitTransform = 'translate(' + dx + 'px, ' + dy + 'px)';
-        this.waveContainer.style.transform = 'translate3d(' + dx + 'px, ' + dy + 'px, 0)';
-        this.wave.style.webkitTransform = 'scale(' + scale + ',' + scale + ')';
-        this.wave.style.transform = 'scale3d(' + scale + ',' + scale + ',1)';
-      },
-
-      /** @param {Event=} event */
-      downAction: function(event) {
-        var xCenter = this.containerMetrics.width / 2;
-        var yCenter = this.containerMetrics.height / 2;
-
-        this.resetInteractionState();
-        this.mouseDownStart = Utility.now();
-
-        if (this.center) {
-          this.xStart = xCenter;
-          this.yStart = yCenter;
-          this.slideDistance = Utility.distance(
-            this.xStart, this.yStart, this.xEnd, this.yEnd
-          );
-        } else {
-          this.xStart = event ?
-              event.detail.x - this.containerMetrics.boundingRect.left :
-              this.containerMetrics.width / 2;
-          this.yStart = event ?
-              event.detail.y - this.containerMetrics.boundingRect.top :
-              this.containerMetrics.height / 2;
-        }
-
-        if (this.recenters) {
-          this.xEnd = xCenter;
-          this.yEnd = yCenter;
-          this.slideDistance = Utility.distance(
-            this.xStart, this.yStart, this.xEnd, this.yEnd
-          );
-        }
-
-        this.maxRadius = this.containerMetrics.furthestCornerDistanceFrom(
-          this.xStart,
-          this.yStart
-        );
-
-        this.waveContainer.style.top =
-          (this.containerMetrics.height - this.containerMetrics.size) / 2 + 'px';
-        this.waveContainer.style.left =
-          (this.containerMetrics.width - this.containerMetrics.size) / 2 + 'px';
-
-        this.waveContainer.style.width = this.containerMetrics.size + 'px';
-        this.waveContainer.style.height = this.containerMetrics.size + 'px';
-      },
-
-      /** @param {Event=} event */
-      upAction: function(event) {
-        if (!this.isMouseDown) {
-          return;
-        }
-
-        this.mouseUpStart = Utility.now();
-      },
-
-      remove: function() {
-        Polymer.dom(this.waveContainer.parentNode).removeChild(
-          this.waveContainer
-        );
-      }
-    };
-
-    Polymer({
-      is: 'paper-ripple',
-
-      behaviors: [
-        Polymer.IronA11yKeysBehavior
-      ],
-
-      properties: {
-        /**
-         * The initial opacity set on the wave.
-         *
-         * @attribute initialOpacity
-         * @type number
-         * @default 0.25
-         */
-        initialOpacity: {
-          type: Number,
-          value: 0.25
-        },
-
-        /**
-         * How fast (opacity per second) the wave fades out.
-         *
-         * @attribute opacityDecayVelocity
-         * @type number
-         * @default 0.8
-         */
-        opacityDecayVelocity: {
-          type: Number,
-          value: 0.8
-        },
-
-        /**
-         * If true, ripples will exhibit a gravitational pull towards
-         * the center of their container as they fade away.
-         *
-         * @attribute recenters
-         * @type boolean
-         * @default false
-         */
-        recenters: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, ripples will center inside its container
-         *
-         * @attribute recenters
-         * @type boolean
-         * @default false
-         */
-        center: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * A list of the visual ripples.
-         *
-         * @attribute ripples
-         * @type Array
-         * @default []
-         */
-        ripples: {
-          type: Array,
-          value: function() {
-            return [];
-          }
-        },
-
-        /**
-         * True when there are visible ripples animating within the
-         * element.
-         */
-        animating: {
-          type: Boolean,
-          readOnly: true,
-          reflectToAttribute: true,
-          value: false
-        },
-
-        /**
-         * If true, the ripple will remain in the "down" state until `holdDown`
-         * is set to false again.
-         */
-        holdDown: {
-          type: Boolean,
-          value: false,
-          observer: '_holdDownChanged'
-        },
-
-        /**
-         * If true, the ripple will not generate a ripple effect
-         * via pointer interaction.
-         * Calling ripple's imperative api like `simulatedRipple` will
-         * still generate the ripple effect.
-         */
-        noink: {
-          type: Boolean,
-          value: false
-        },
-
-        _animating: {
-          type: Boolean
-        },
-
-        _boundAnimate: {
-          type: Function,
-          value: function() {
-            return this.animate.bind(this);
-          }
-        }
-      },
-
-      get target () {
-        return this.keyEventTarget;
-      },
-
-      keyBindings: {
-        'enter:keydown': '_onEnterKeydown',
-        'space:keydown': '_onSpaceKeydown',
-        'space:keyup': '_onSpaceKeyup'
-      },
-
-      attached: function() {
-        // Set up a11yKeysBehavior to listen to key events on the target,
-        // so that space and enter activate the ripple even if the target doesn't
-        // handle key events. The key handlers deal with `noink` themselves.
-        if (this.parentNode.nodeType == 11) { // DOCUMENT_FRAGMENT_NODE
-          this.keyEventTarget = Polymer.dom(this).getOwnerRoot().host;
-        } else {
-          this.keyEventTarget = this.parentNode;
-        }
-        var keyEventTarget = /** @type {!EventTarget} */ (this.keyEventTarget);
-        this.listen(keyEventTarget, 'up', 'uiUpAction');
-        this.listen(keyEventTarget, 'down', 'uiDownAction');
-      },
-
-      detached: function() {
-        this.unlisten(this.keyEventTarget, 'up', 'uiUpAction');
-        this.unlisten(this.keyEventTarget, 'down', 'uiDownAction');
-        this.keyEventTarget = null;
-      },
-
-      get shouldKeepAnimating () {
-        for (var index = 0; index < this.ripples.length; ++index) {
-          if (!this.ripples[index].isAnimationComplete) {
-            return true;
-          }
-        }
-
-        return false;
-      },
-
-      simulatedRipple: function() {
-        this.downAction(null);
-
-        // Please see polymer/polymer#1305
-        this.async(function() {
-          this.upAction();
-        }, 1);
-      },
-
-      /**
-       * Provokes a ripple down effect via a UI event,
-       * respecting the `noink` property.
-       * @param {Event=} event
-       */
-      uiDownAction: function(event) {
-        if (!this.noink) {
-          this.downAction(event);
-        }
-      },
-
-      /**
-       * Provokes a ripple down effect via a UI event,
-       * *not* respecting the `noink` property.
-       * @param {Event=} event
-       */
-      downAction: function(event) {
-        if (this.holdDown && this.ripples.length > 0) {
-          return;
-        }
-
-        var ripple = this.addRipple();
-
-        ripple.downAction(event);
-
-        if (!this._animating) {
-          this._animating = true;
-          this.animate();
-        }
-      },
-
-      /**
-       * Provokes a ripple up effect via a UI event,
-       * respecting the `noink` property.
-       * @param {Event=} event
-       */
-      uiUpAction: function(event) {
-        if (!this.noink) {
-          this.upAction(event);
-        }
-      },
-
-      /**
-       * Provokes a ripple up effect via a UI event,
-       * *not* respecting the `noink` property.
-       * @param {Event=} event
-       */
-      upAction: function(event) {
-        if (this.holdDown) {
-          return;
-        }
-
-        this.ripples.forEach(function(ripple) {
-          ripple.upAction(event);
-        });
-
-        this._animating = true;
-        this.animate();
-      },
-
-      onAnimationComplete: function() {
-        this._animating = false;
-        this.$.background.style.backgroundColor = null;
-        this.fire('transitionend');
-      },
-
-      addRipple: function() {
-        var ripple = new Ripple(this);
-
-        Polymer.dom(this.$.waves).appendChild(ripple.waveContainer);
-        this.$.background.style.backgroundColor = ripple.color;
-        this.ripples.push(ripple);
-
-        this._setAnimating(true);
-
-        return ripple;
-      },
-
-      removeRipple: function(ripple) {
-        var rippleIndex = this.ripples.indexOf(ripple);
-
-        if (rippleIndex < 0) {
-          return;
-        }
-
-        this.ripples.splice(rippleIndex, 1);
-
-        ripple.remove();
-
-        if (!this.ripples.length) {
-          this._setAnimating(false);
-        }
-      },
-
-      /**
-       * This conflicts with Element#antimate().
-       * https://developer.mozilla.org/en-US/docs/Web/API/Element/animate
-       * @suppress {checkTypes}
-       */
-      animate: function() {
-        if (!this._animating) {
-          return;
-        }
-        var index;
-        var ripple;
-
-        for (index = 0; index < this.ripples.length; ++index) {
-          ripple = this.ripples[index];
-
-          ripple.draw();
-
-          this.$.background.style.opacity = ripple.outerOpacity;
-
-          if (ripple.isOpacityFullyDecayed && !ripple.isRestingAtMaxRadius) {
-            this.removeRipple(ripple);
-          }
-        }
-
-        if (!this.shouldKeepAnimating && this.ripples.length === 0) {
-          this.onAnimationComplete();
-        } else {
-          window.requestAnimationFrame(this._boundAnimate);
-        }
-      },
-
-      _onEnterKeydown: function() {
-        this.uiDownAction();
-        this.async(this.uiUpAction, 1);
-      },
-
-      _onSpaceKeydown: function() {
-        this.uiDownAction();
-      },
-
-      _onSpaceKeyup: function() {
-        this.uiUpAction();
-      },
-
-      // note: holdDown does not respect noink since it can be a focus based
-      // effect.
-      _holdDownChanged: function(newVal, oldVal) {
-        if (oldVal === undefined) {
-          return;
-        }
-        if (newVal) {
-          this.downAction();
-        } else {
-          this.upAction();
-        }
-      }
-
-      /**
-      Fired when the animation finishes.
-      This is useful if you want to wait until
-      the ripple animation finishes to perform some action.
-
-      @event transitionend
-      @param {{node: Object}} detail Contains the animated node.
-      */
-    });
-  })();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/test/index.html b/systrace/catapult/third_party/polymer/components/paper-ripple/test/index.html
deleted file mode 100644
index 865c40e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>Tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'paper-ripple.html',
-      'paper-ripple.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-ripple/test/paper-ripple.html b/systrace/catapult/third_party/polymer/components/paper-ripple/test/paper-ripple.html
deleted file mode 100644
index 559f9cd..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-ripple/test/paper-ripple.html
+++ /dev/null
@@ -1,253 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="UTF-8">
-  <title>paper-ripple</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../paper-ripple.html">
-
-  <style>
-    #RippleContainer {
-      display: block;
-      position: relative;
-      width: 100px;
-      height: 50px;
-    }
-  </style>
-</head>
-<body>
-  <test-fixture id="TrivialRipple">
-    <template>
-      <div id="RippleContainer">
-        <paper-ripple></paper-ripple>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="CenteringRipple">
-    <template>
-      <div id="RippleContainer">
-        <paper-ripple center></paper-ripple>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="RecenteringRipple">
-    <template>
-      <div id="RippleContainer">
-        <paper-ripple recenters></paper-ripple>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="NoinkTarget">
-    <template>
-      <div id="RippleContainer">
-        <paper-ripple noink></paper-ripple>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="NoRipple">
-    <template>
-      <div id="RippleContainer">
-      </div>
-    </template>
-  </test-fixture>
-
-  <script>
-    suite('<paper-ripple>', function () {
-      var mouseEvent;
-      var rippleContainer;
-      var ripple;
-
-      suite('when tapped', function () {
-        setup(function () {
-          rippleContainer = fixture('TrivialRipple');
-          ripple = rippleContainer.firstElementChild;
-        });
-
-        test('creates a ripple', function () {
-          expect(ripple.ripples.length).to.be.eql(0);
-          MockInteractions.down(ripple);
-          expect(ripple.ripples.length).to.be.eql(1);
-        });
-
-        test('may create multiple ripples that overlap', function () {
-          expect(ripple.ripples.length).to.be.eql(0);
-
-          for (var i = 0; i < 3; ++i) {
-            MockInteractions.down(ripple);
-            expect(ripple.ripples.length).to.be.eql(i + 1);
-          }
-        });
-      });
-
-      suite('when holdDown is togggled', function() {
-        setup(function () {
-          rippleContainer = fixture('TrivialRipple');
-          ripple = rippleContainer.firstElementChild;
-        });
-
-        test('generates a ripple', function() {
-          ripple.holdDown = true;
-          expect(ripple.ripples.length).to.be.eql(1);
-        });
-
-        test('generates a ripple when noink', function() {
-          ripple.noink = true;
-          ripple.holdDown = true;
-          expect(ripple.ripples.length).to.be.eql(1);
-
-        });
-
-      });
-
-      suite('when target is noink', function () {
-        setup(function () {
-          rippleContainer = fixture('NoinkTarget');
-          ripple = rippleContainer.firstElementChild;
-        });
-
-        test('tapping does not create a ripple', function () {
-          expect(ripple.ripples.length).to.be.eql(0);
-          MockInteractions.down(ripple);
-          expect(ripple.ripples.length).to.be.eql(0);
-        });
-
-        test('ripples can be manually created', function () {
-          expect(ripple.ripples.length).to.be.eql(0);
-          ripple.simulatedRipple()
-          expect(ripple.ripples.length).to.be.eql(1);
-        });
-      });
-
-      suite('with the `center` attribute set to true', function () {
-        setup(function () {
-          rippleContainer = fixture('CenteringRipple');
-          ripple = rippleContainer.firstElementChild;
-        });
-
-        test('ripples will center', function (done) {
-          var waveContainerElement;
-          // let's ask the browser what `translate3d(0px, 0px, 0)` will actually look like
-          var div = document.createElement('div');
-          div.style.webkitTransform = 'translate3d(0px, 0px, 0px)';
-          div.style.transform = 'translate3d(0px, 0px, 0)';
-
-          MockInteractions.down(ripple);
-
-          waveContainerElement = ripple.ripples[0].waveContainer;
-
-          MockInteractions.up(ripple);
-
-          window.requestAnimationFrame(function () {
-            var currentTransform = waveContainerElement.style.transform;
-            try {
-              expect(div.style.transform).to.be.ok;
-              expect(currentTransform).to.be.ok;
-              expect(currentTransform).to.be.eql(div.style.transform);
-
-              done();
-            } catch (e) {
-              done(e);
-            }
-          });
-        });
-      });
-
-      suite('with the `recenters` attribute set to true', function () {
-        setup(function () {
-          rippleContainer = fixture('RecenteringRipple');
-          ripple = rippleContainer.firstElementChild;
-        });
-        test('ripples will gravitate towards the center', function (done) {
-          var waveContainerElement;
-          var waveTranslateString;
-          MockInteractions.down(ripple, {x: 10, y: 10});
-          waveContainerElement = ripple.ripples[0].waveContainer;
-          waveTranslateString = waveContainerElement.style.transform;
-          MockInteractions.up(ripple);
-          window.requestAnimationFrame(function () {
-            try {
-              expect(waveTranslateString).to.be.ok;
-              expect(waveContainerElement.style.transform).to.be.ok;
-              expect(waveContainerElement.style.transform).to.not.be.eql(waveTranslateString);
-              done();
-            } catch (e) {
-              done(e);
-            }
-          });
-        });
-      });
-
-      suite('remove a paper ripple', function () {
-        setup(function () {
-          rippleContainer = fixture('NoRipple');
-        });
-        test('add and remove a paper-ripple', function (done) {
-          var ripple = document.createElement('paper-ripple');
-          ripple.addEventListener('transitionend', function() {
-            expect(ripple.parentNode).to.be.ok;
-            Polymer.dom(rippleContainer).removeChild(ripple);
-            done();
-          });
-          Polymer.dom(rippleContainer).appendChild(ripple);
-          ripple.downAction();
-          ripple.upAction();
-        });
-        test('reuse a paper-ripple', function (done) {
-          var ripple = document.createElement('paper-ripple');
-          Polymer.dom(rippleContainer).appendChild(ripple);
-          Polymer.dom(rippleContainer).removeChild(ripple);
-          
-          ripple.addEventListener('transitionend', function() {
-            expect(ripple.parentNode).to.be.ok;
-            Polymer.dom(document.body).removeChild(ripple);
-            done();
-          });
-          Polymer.dom(document.body).appendChild(ripple);
-          ripple.downAction();
-          ripple.upAction();
-        });
-      });
-
-      suite('avoid double transitionend event', function () {
-        setup(function () {
-          rippleContainer = fixture('NoRipple');
-        });
-        test('the transitionend event should only fire once', function (done) {
-          var ripple = document.createElement('paper-ripple');
-          var transitionedEventCount = 0;
-          ripple.addEventListener('transitionend', function() {
-            ++transitionedEventCount;
-            expect(transitionedEventCount).to.be.eql(1);
-            Polymer.dom(rippleContainer).removeChild(ripple);
-            setTimeout(function() { done(); });
-          });
-          Polymer.dom(rippleContainer).appendChild(ripple);
-          ripple.downAction();
-          ripple.upAction();
-        });
-      });
-
-    });
-  </script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-spinner/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/README.md b/systrace/catapult/third_party/polymer/components/paper-spinner/README.md
deleted file mode 100644
index e913ae5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-spinner.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-spinner)
-
-##&lt;paper-spinner&gt;
-
-Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
-
-Element providing a multiple color material design circular spinner.
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-spinner.html">
-    <link rel="import" href="paper-spinner-lite.html">
-    <style is="custom-style">
-      paper-spinner, paper-spinner-lite {
-        margin: 8px 8px 8px 0;
-      }
-      paper-spinner-lite.orange {
-        --paper-spinner-color: var(--google-yellow-500);
-      }
-      paper-spinner-lite.green {
-        --paper-spinner-color: var(--google-green-500);
-      }
-      paper-spinner-lite.thin {
-        --paper-spinner-stroke-width: 1px;
-      }
-      paper-spinner-lite.thick {
-        --paper-spinner-stroke-width: 6px;
-      }
-      #container {
-        display: flex;
-      }
-    </style>
-    <div id="container">    
-      <next-code-block></next-code-block>
-    </div>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-spinner active>...</paper-spinner>
-<paper-spinner-lite active class="orange"></paper-spinner-lite>
-<paper-spinner-lite active class="green"></paper-spinner-lite>
-<paper-spinner-lite active class="thin"></paper-spinner-lite>
-<paper-spinner-lite active class="thick"></paper-spinner-lite>
-```
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/bower.json b/systrace/catapult/third_party/polymer/components/paper-spinner/bower.json
deleted file mode 100644
index 7f8f09a..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/bower.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "paper-spinner",
-  "version": "1.2.0",
-  "description": "A material design spinner",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "spinner",
-    "loading"
-  ],
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-spinner"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-spinner",
-  "ignore": [],
-  "dependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "main": [
-    "paper-spinner.html",
-    "paper-spinner-lite.html"
-  ]
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-spinner/demo/index.html
deleted file mode 100644
index d4c56f9..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/demo/index.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html lang="en">
-  <head>
-    <title>paper-spinner demo</title>
-
-    <meta charset="UTF-8">
-    <meta name="apple-mobile-web-app-capable" content="yes">
-    <meta name="mobile-web-app-capable" content="yes">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../paper-styles/color.html">
-    <link rel="import" href="../paper-spinner-lite.html">
-    <link rel="import" href="../paper-spinner.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      .vertical-section-container {
-        max-width: 550px;
-      }
-
-      paper-spinner, paper-spinner-lite {
-        margin-right: 24px;
-      }
-    </style>
-  </head>
-  <body unresolved>
-    <div class="vertical-section-container centered">
-      <h3>Spinners can be deactivated or activated</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <paper-spinner></paper-spinner>
-          <paper-spinner active></paper-spinner>
-
-          <paper-spinner-lite></paper-spinner-lite>
-          <paper-spinner-lite active></paper-spinner-lite>
-
-          <button onclick="toggle(event)">Toggle</button>
-        </template>
-      </demo-snippet>
-
-      <h3>Spinners can be styled using custom properties</h3>
-      <demo-snippet class="centered-demo">
-        <template>
-          <style is="custom-style">
-            paper-spinner.multi {
-              --paper-spinner-layer-1-color: var(--paper-purple-500);
-              --paper-spinner-layer-2-color: var(--paper-cyan-500);
-              --paper-spinner-layer-3-color: var(--paper-blue-grey-500);
-              --paper-spinner-layer-4-color: var(--paper-amber-500);
-            }
-            paper-spinner-lite.orange {
-              --paper-spinner-color: var(--google-yellow-500);
-            }
-            paper-spinner-lite.green {
-              --paper-spinner-color: var(--google-green-500);
-            }
-            paper-spinner-lite.thin {
-              --paper-spinner-stroke-width: 1px;
-            }
-            paper-spinner-lite.thick {
-              --paper-spinner-stroke-width: 6px;
-            }
-          </style>
-
-          <paper-spinner class="multi" active></paper-spinner>
-
-          <paper-spinner-lite class="orange" active></paper-spinner-lite>
-          <paper-spinner-lite class="green" active></paper-spinner-lite>
-
-          <paper-spinner-lite class="thin" active></paper-spinner-lite>
-          <paper-spinner-lite class="thick" active></paper-spinner-lite>
-        </template>
-      </demo-snippet>
-    </div>
-
-    <script>
-      function toggle(event) {
-        var spinners = event.target.parentElement.querySelectorAll('paper-spinner, paper-spinner-lite');
-        Array.prototype.forEach.call(spinners, function(spinner) {
-          spinner.active = !spinner.active;
-        });
-      };
-    </script>
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/hero.svg b/systrace/catapult/third_party/polymer/components/paper-spinner/hero.svg
deleted file mode 100755
index d35a53b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/hero.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<g>

-		<path d="M112.1,92.3c-13.4,0-25.1-9.1-28.4-22l1.9-0.5c3.1,12.1,13.9,20.5,26.4,20.5c15,0,27.3-12.2,27.3-27.3

-			s-12.2-27.3-27.3-27.3c-8.1,0-15.8,3.6-21,9.8l-1.5-1.3c5.6-6.7,13.8-10.6,22.5-10.6c16.1,0,29.3,13.1,29.3,29.3

-			S128.2,92.3,112.1,92.3z"/>

-		<path d="M112.7,87.3c-6.6,0-12.7-2.5-17.3-7.2c-4.6-4.6-7.2-10.8-7.2-17.3c0-6.6,2.5-12.7,7.2-17.3c7.9-7.9,20.2-9.5,29.8-3.8

-			l-1,1.7c-8.8-5.3-20.1-3.8-27.4,3.5c-4.2,4.2-6.6,9.9-6.6,15.9s2.3,11.7,6.6,15.9s9.9,6.6,15.9,6.6c6,0,11.7-2.3,15.9-6.6

-			c4.7-4.7,7.1-11.3,6.5-18l2-0.2c0.7,7.3-1.9,14.4-7.1,19.6C125.4,84.7,119.2,87.3,112.7,87.3z"/>

-		<path d="M112.5,43.5C101.8,43.5,93,52.3,93,63s8.7,19.5,19.5,19.5S132,73.7,132,63S123.2,43.5,112.5,43.5z M119,64h-6v6h-2v-6h-6

-			v-2h6v-6h2v6h6V64z"/>

-	</g>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/index.html b/systrace/catapult/third_party/polymer/components/paper-spinner/index.html
deleted file mode 100644
index 9874334..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-    <title>paper-spinner</title>
-
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../polymer/polymer.html">
-    <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-  </head>
-  <body>
-
-    <iron-component-page></iron-component-page>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-behavior.html b/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-behavior.html
deleted file mode 100644
index ce3594b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-behavior.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<script>
-
-  /** @polymerBehavior */
-  Polymer.PaperSpinnerBehavior = {
-
-    listeners: {
-      'animationend': '__reset',
-      'webkitAnimationEnd': '__reset'
-    },
-
-    properties: {
-      /**
-       * Displays the spinner.
-       */
-      active: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true,
-        observer: '__activeChanged'
-      },
-
-      /**
-       * Alternative text content for accessibility support.
-       * If alt is present, it will add an aria-label whose content matches alt when active.
-       * If alt is not present, it will default to 'loading' as the alt value.
-       */
-      alt: {
-        type: String,
-        value: 'loading',
-        observer: '__altChanged'
-      },
-
-      __coolingDown: {
-        type: Boolean,
-        value: false
-      }
-    },
-
-    __computeContainerClasses: function(active, coolingDown) {
-      return [
-        active || coolingDown ? 'active' : '',
-        coolingDown ? 'cooldown' : ''
-      ].join(' ');
-    },
-
-    __activeChanged: function(active, old) {
-      this.__setAriaHidden(!active);
-      this.__coolingDown = !active && old;
-    },
-
-    __altChanged: function(alt) {
-      // user-provided `aria-label` takes precedence over prototype default
-      if (alt === this.getPropertyInfo('alt').value) {
-        this.alt = this.getAttribute('aria-label') || alt;
-      } else {
-        this.__setAriaHidden(alt==='');
-        this.setAttribute('aria-label', alt);
-      }
-    },
-
-    __setAriaHidden: function(hidden) {
-      var attr = 'aria-hidden';
-      if (hidden) {
-        this.setAttribute(attr, 'true');
-      } else {
-        this.removeAttribute(attr);
-      }
-    },
-
-    __reset: function() {
-      this.active = false;
-      this.__coolingDown = false;
-    }
-  };
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-lite.html b/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-lite.html
deleted file mode 100644
index 5d123a7..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-lite.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/color.html">
-<link rel="import" href="paper-spinner-behavior.html">
-<link rel="import" href="paper-spinner-styles.html">
-
-<!--
-Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
-
-Element providing a single color material design circular spinner.
-
-    <paper-spinner-lite active></paper-spinner-lite>
-
-The default spinner is blue. It can be customized to be a different color.
-
-### Accessibility
-
-Alt attribute should be set to provide adequate context for accessibility. If not provided,
-it defaults to 'loading'.
-Empty alt can be provided to mark the element as decorative if alternative content is provided
-in another form (e.g. a text block following the spinner).
-
-    <paper-spinner-lite alt="Loading contacts list" active></paper-spinner-lite>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-spinner-color` | Color of the spinner | `--google-blue-500`
-`--paper-spinner-stroke-width` | The width of the spinner stroke | 3px
-
-@group Paper Elements
-@element paper-spinner-lite
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-spinner-lite">
-  <template strip-whitespace>
-    <style include="paper-spinner-styles"></style>
-
-    <div id="spinnerContainer" class-name="[[__computeContainerClasses(active, __coolingDown)]]">
-      <div class="spinner-layer">
-        <div class="circle-clipper left"></div>
-        <div class="circle-clipper right"></div>
-      </div>
-    </div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-spinner-lite',
-
-      behaviors: [
-        Polymer.PaperSpinnerBehavior
-      ]
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-styles.html b/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-styles.html
deleted file mode 100644
index 0832929..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner-styles.html
+++ /dev/null
@@ -1,341 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<dom-module id="paper-spinner-styles">
-  <template>
-    <style>
-      /*
-      /**************************/
-      /* STYLES FOR THE SPINNER */
-      /**************************/
-
-      /*
-       * Constants:
-       *      ARCSIZE     = 270 degrees (amount of circle the arc takes up)
-       *      ARCTIME     = 1333ms (time it takes to expand and contract arc)
-       *      ARCSTARTROT = 216 degrees (how much the start location of the arc
-       *                                should rotate each time, 216 gives us a
-       *                                5 pointed star shape (it's 360/5 * 3).
-       *                                For a 7 pointed star, we might do
-       *                                360/7 * 3 = 154.286)
-       *      SHRINK_TIME = 400ms
-       */
-
-      :host {
-        display: inline-block;
-        position: relative;
-        width: 28px;
-        height: 28px;
-
-        /* 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */
-        --paper-spinner-container-rotation-duration: 1568ms;
-
-        /* ARCTIME */
-        --paper-spinner-expand-contract-duration: 1333ms;
-
-        /* 4 * ARCTIME */
-        --paper-spinner-full-cycle-duration: 5332ms;
-
-        /* SHRINK_TIME */
-        --paper-spinner-cooldown-duration: 400ms;
-      }
-
-      #spinnerContainer {
-        width: 100%;
-        height: 100%;
-
-        /* The spinner does not have any contents that would have to be
-         * flipped if the direction changes. Always use ltr so that the
-         * style works out correctly in both cases. */
-        direction: ltr;
-      }
-
-      #spinnerContainer.active {
-        -webkit-animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite;
-        animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite;
-      }
-
-      @-webkit-keyframes container-rotate {
-        to { -webkit-transform: rotate(360deg) }
-      }
-
-      @keyframes container-rotate {
-        to { transform: rotate(360deg) }
-      }
-
-      .spinner-layer {
-        position: absolute;
-        width: 100%;
-        height: 100%;
-        opacity: 0;
-        white-space: nowrap;
-        border-color: var(--paper-spinner-color, --google-blue-500);
-      }
-
-      .layer-1 {
-        border-color: var(--paper-spinner-layer-1-color, --google-blue-500);
-      }
-
-      .layer-2 {
-        border-color: var(--paper-spinner-layer-2-color, --google-red-500);
-      }
-
-      .layer-3 {
-        border-color: var(--paper-spinner-layer-3-color, --google-yellow-500);
-      }
-
-      .layer-4 {
-        border-color: var(--paper-spinner-layer-4-color, --google-green-500);
-      }
-
-      /**
-       * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):
-       *
-       * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't
-       * guarantee that the animation will start _exactly_ after that value. So we avoid using
-       * animation-delay and instead set custom keyframes for each color (as layer-2undant as it
-       * seems).
-       */
-      .active .spinner-layer {
-        -webkit-animation-name: fill-unfill-rotate;
-        -webkit-animation-duration: var(--paper-spinner-full-cycle-duration);
-        -webkit-animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
-        -webkit-animation-iteration-count: infinite;
-        animation-name: fill-unfill-rotate;
-        animation-duration: var(--paper-spinner-full-cycle-duration);
-        animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
-        animation-iteration-count: infinite;
-        opacity: 1;
-      }
-
-      .active .spinner-layer.layer-1 {
-        -webkit-animation-name: fill-unfill-rotate, layer-1-fade-in-out;
-        animation-name: fill-unfill-rotate, layer-1-fade-in-out;
-      }
-
-      .active .spinner-layer.layer-2 {
-        -webkit-animation-name: fill-unfill-rotate, layer-2-fade-in-out;
-        animation-name: fill-unfill-rotate, layer-2-fade-in-out;
-      }
-
-      .active .spinner-layer.layer-3 {
-        -webkit-animation-name: fill-unfill-rotate, layer-3-fade-in-out;
-        animation-name: fill-unfill-rotate, layer-3-fade-in-out;
-      }
-
-      .active .spinner-layer.layer-4 {
-        -webkit-animation-name: fill-unfill-rotate, layer-4-fade-in-out;
-        animation-name: fill-unfill-rotate, layer-4-fade-in-out;
-      }
-
-      @-webkit-keyframes fill-unfill-rotate {
-        12.5% { -webkit-transform: rotate(135deg) } /* 0.5 * ARCSIZE */
-        25%   { -webkit-transform: rotate(270deg) } /* 1   * ARCSIZE */
-        37.5% { -webkit-transform: rotate(405deg) } /* 1.5 * ARCSIZE */
-        50%   { -webkit-transform: rotate(540deg) } /* 2   * ARCSIZE */
-        62.5% { -webkit-transform: rotate(675deg) } /* 2.5 * ARCSIZE */
-        75%   { -webkit-transform: rotate(810deg) } /* 3   * ARCSIZE */
-        87.5% { -webkit-transform: rotate(945deg) } /* 3.5 * ARCSIZE */
-        to    { -webkit-transform: rotate(1080deg) } /* 4   * ARCSIZE */
-      }
-
-      @keyframes fill-unfill-rotate {
-        12.5% { transform: rotate(135deg) } /* 0.5 * ARCSIZE */
-        25%   { transform: rotate(270deg) } /* 1   * ARCSIZE */
-        37.5% { transform: rotate(405deg) } /* 1.5 * ARCSIZE */
-        50%   { transform: rotate(540deg) } /* 2   * ARCSIZE */
-        62.5% { transform: rotate(675deg) } /* 2.5 * ARCSIZE */
-        75%   { transform: rotate(810deg) } /* 3   * ARCSIZE */
-        87.5% { transform: rotate(945deg) } /* 3.5 * ARCSIZE */
-        to    { transform: rotate(1080deg) } /* 4   * ARCSIZE */
-      }
-
-      @-webkit-keyframes layer-1-fade-in-out {
-        0% { opacity: 1 }
-        25% { opacity: 1 }
-        26% { opacity: 0 }
-        89% { opacity: 0 }
-        90% { opacity: 1 }
-        to { opacity: 1 }
-      }
-
-      @keyframes layer-1-fade-in-out {
-        0% { opacity: 1 }
-        25% { opacity: 1 }
-        26% { opacity: 0 }
-        89% { opacity: 0 }
-        90% { opacity: 1 }
-        to { opacity: 1 }
-      }
-
-      @-webkit-keyframes layer-2-fade-in-out {
-        0% { opacity: 0 }
-        15% { opacity: 0 }
-        25% { opacity: 1 }
-        50% { opacity: 1 }
-        51% { opacity: 0 }
-        to { opacity: 0 }
-      }
-
-      @keyframes layer-2-fade-in-out {
-        0% { opacity: 0 }
-        15% { opacity: 0 }
-        25% { opacity: 1 }
-        50% { opacity: 1 }
-        51% { opacity: 0 }
-        to { opacity: 0 }
-      }
-
-      @-webkit-keyframes layer-3-fade-in-out {
-        0% { opacity: 0 }
-        40% { opacity: 0 }
-        50% { opacity: 1 }
-        75% { opacity: 1 }
-        76% { opacity: 0 }
-        to { opacity: 0 }
-      }
-
-      @keyframes layer-3-fade-in-out {
-        0% { opacity: 0 }
-        40% { opacity: 0 }
-        50% { opacity: 1 }
-        75% { opacity: 1 }
-        76% { opacity: 0 }
-        to { opacity: 0 }
-      }
-
-      @-webkit-keyframes layer-4-fade-in-out {
-        0% { opacity: 0 }
-        65% { opacity: 0 }
-        75% { opacity: 1 }
-        90% { opacity: 1 }
-        to { opacity: 0 }
-      }
-
-      @keyframes layer-4-fade-in-out {
-        0% { opacity: 0 }
-        65% { opacity: 0 }
-        75% { opacity: 1 }
-        90% { opacity: 1 }
-        to { opacity: 0 }
-      }
-
-      .circle-clipper {
-        display: inline-block;
-        position: relative;
-        width: 50%;
-        height: 100%;
-        overflow: hidden;
-        border-color: inherit;
-      }
-
-      /**
-       * Patch the gap that appear between the two adjacent div.circle-clipper while the
-       * spinner is rotating (appears on Chrome 50, Safari 9.1.1, and Edge).
-       */
-      .spinner-layer::after {
-        left: 45%;
-        width: 10%;
-        border-top-style: solid;
-      }
-
-      .spinner-layer::after,
-      .circle-clipper::after {
-        content: '';
-        box-sizing: border-box;
-        position: absolute;
-        top: 0;
-        border-width: var(--paper-spinner-stroke-width, 3px);
-        border-color: inherit;
-        border-radius: 50%;
-      }
-
-      .circle-clipper::after {
-        bottom: 0;
-        width: 200%;
-        border-style: solid;
-        border-bottom-color: transparent !important;
-      }
-
-      .circle-clipper.left::after {
-        left: 0;
-        border-right-color: transparent !important;
-        -webkit-transform: rotate(129deg);
-        transform: rotate(129deg);
-      }
-
-      .circle-clipper.right::after {
-        left: -100%;
-        border-left-color: transparent !important;
-        -webkit-transform: rotate(-129deg);
-        transform: rotate(-129deg);
-      }
-
-      .active .gap-patch::after,
-      .active .circle-clipper::after {
-        -webkit-animation-duration: var(--paper-spinner-expand-contract-duration);
-        -webkit-animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
-        -webkit-animation-iteration-count: infinite;
-        animation-duration: var(--paper-spinner-expand-contract-duration);
-        animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
-        animation-iteration-count: infinite;
-      }
-
-      .active .circle-clipper.left::after {
-        -webkit-animation-name: left-spin;
-        animation-name: left-spin;
-      }
-
-      .active .circle-clipper.right::after {
-        -webkit-animation-name: right-spin;
-        animation-name: right-spin;
-      }
-
-      @-webkit-keyframes left-spin {
-        0% { -webkit-transform: rotate(130deg) }
-        50% { -webkit-transform: rotate(-5deg) }
-        to { -webkit-transform: rotate(130deg) }
-      }
-
-      @keyframes left-spin {
-        0% { transform: rotate(130deg) }
-        50% { transform: rotate(-5deg) }
-        to { transform: rotate(130deg) }
-      }
-
-      @-webkit-keyframes right-spin {
-        0% { -webkit-transform: rotate(-130deg) }
-        50% { -webkit-transform: rotate(5deg) }
-        to { -webkit-transform: rotate(-130deg) }
-      }
-
-      @keyframes right-spin {
-        0% { transform: rotate(-130deg) }
-        50% { transform: rotate(5deg) }
-        to { transform: rotate(-130deg) }
-      }
-
-      #spinnerContainer.cooldown {
-        -webkit-animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite, fade-out var(--paper-spinner-cooldown-duration) cubic-bezier(0.4, 0.0, 0.2, 1);
-        animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite, fade-out var(--paper-spinner-cooldown-duration) cubic-bezier(0.4, 0.0, 0.2, 1);
-      }
-
-      @-webkit-keyframes fade-out {
-        0% { opacity: 1 }
-        to { opacity: 0 }
-      }
-
-      @keyframes fade-out {
-        0% { opacity: 1 }
-        to { opacity: 0 }
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner.html b/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner.html
deleted file mode 100644
index 54ff8bc..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/paper-spinner.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-styles/color.html">
-<link rel="import" href="paper-spinner-behavior.html">
-<link rel="import" href="paper-spinner-styles.html">
-
-<!--
-Material design: [Progress & activity](https://www.google.com/design/spec/components/progress-activity.html)
-
-Element providing a multiple color material design circular spinner.
-
-    <paper-spinner active></paper-spinner>
-
-The default spinner cycles between four layers of colors; by default they are
-blue, red, yellow and green. It can be customized to cycle between four different
-colors. Use <paper-spinner-lite> for single color spinners.
-
-### Accessibility
-
-Alt attribute should be set to provide adequate context for accessibility. If not provided,
-it defaults to 'loading'.
-Empty alt can be provided to mark the element as decorative if alternative content is provided
-in another form (e.g. a text block following the spinner).
-
-    <paper-spinner alt="Loading contacts list" active></paper-spinner>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-spinner-layer-1-color` | Color of the first spinner rotation | `--google-blue-500`
-`--paper-spinner-layer-2-color` | Color of the second spinner rotation | `--google-red-500`
-`--paper-spinner-layer-3-color` | Color of the third spinner rotation | `--google-yellow-500`
-`--paper-spinner-layer-4-color` | Color of the fourth spinner rotation | `--google-green-500`
-`--paper-spinner-stroke-width` | The width of the spinner stroke | 3px
-
-@group Paper Elements
-@element paper-spinner
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-spinner">
-  <template strip-whitespace>
-    <style include="paper-spinner-styles"></style>
-
-    <div id="spinnerContainer" class-name="[[__computeContainerClasses(active, __coolingDown)]]">
-      <div class="spinner-layer layer-1">
-        <div class="circle-clipper left"></div>
-        <div class="circle-clipper right"></div>
-      </div>
-
-      <div class="spinner-layer layer-2">
-        <div class="circle-clipper left"></div>
-        <div class="circle-clipper right"></div>
-      </div>
-
-      <div class="spinner-layer layer-3">
-        <div class="circle-clipper left"></div>
-        <div class="circle-clipper right"></div>
-      </div>
-
-      <div class="spinner-layer layer-4">
-        <div class="circle-clipper left"></div>
-        <div class="circle-clipper right"></div>
-      </div>
-    </div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-spinner',
-
-      behaviors: [
-        Polymer.PaperSpinnerBehavior
-      ]
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/test/index.html b/systrace/catapult/third_party/polymer/components/paper-spinner/test/index.html
deleted file mode 100644
index e32c223..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <title>paper-spinner tests</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'paper-spinner.html',
-        'paper-spinner.html?dom=shadow'
-      ]);
-    </script>
-
-  
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-spinner/test/paper-spinner.html b/systrace/catapult/third_party/polymer/components/paper-spinner/test/paper-spinner.html
deleted file mode 100644
index 6e05f4c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-spinner/test/paper-spinner.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-  <head>
-
-    <meta charset="UTF-8">
-    <title>paper-spinner basic tests</title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-    <script src="../../webcomponentsjs/webcomponents.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-    <script src="../../test-fixture/test-fixture-mocha.js"></script>
-
-    <link href="../../test-fixture/test-fixture.html" rel="import">
-    <link href="../paper-spinner.html" rel="import">
-
-  </head>
-  <body>
-
-    <test-fixture id="PaperSpinner">
-      <template>
-        <paper-spinner></paper-spinner>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="ActivePaperSpinner">
-      <template>
-        <paper-spinner active></paper-spinner>
-      </template>
-    </test-fixture>
-
-    <script>
-      'use strict';
-
-      suite('<paper-spinner>', function() {
-
-        suite('an accessible paper spinner', function() {
-          var spinner;
-          var activeSpinner;
-
-          setup(function() {
-            spinner = fixture('PaperSpinner');
-            activeSpinner = fixture('ActivePaperSpinner');
-          });
-
-          test('adds an ARIA label when `alt` is supplied', function() {
-            var ALT_TEXT = 'Loading the next gif...';
-
-            spinner.alt = ALT_TEXT;
-            expect(spinner.getAttribute('aria-label')).to.be.eql(ALT_TEXT);
-          });
-
-          test('hides from ARIA when inactive', function() {
-            spinner.active = false;
-            expect(spinner.getAttribute('aria-hidden')).to.be.eql('true');
-          });
-
-          test('toggle during cooldown', function(done) {
-            activeSpinner.active = false;
-
-            // Set active to true before cooldown animation completes.
-            setTimeout(function() {
-              activeSpinner.active = true;
-
-              // Wait for cooldown animation to complete.
-              setTimeout(function() {
-                expect(activeSpinner.active).to.equal(true);
-                done();
-              }, 500);
-            }, 100);
-          });
-        });
-
-      });
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-styles/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/README.md b/systrace/catapult/third_party/polymer/components/paper-styles/README.md
deleted file mode 100644
index ca555bd..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-styles.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-styles.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-styles)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-styles)_
-
-
-##&lt;paper-styles&gt;
-
-The `<paper-styles>` component provides simple ways to use Material Design CSS styles
-in your application. The following imports are available:
-
-1. [color.html](https://github.com/PolymerElements/paper-styles/blob/master/color.html):
-a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html)
-
-
-1. [default-theme.html](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text,
-background and accent colors that match the default Material Design theme
-
-
-1. [shadow.html](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design
-[elevation](https://www.google.com/design/spec/what-is-material/elevation-shadows.html) and shadow styles
-
-
-1. [typography.html](https://github.com/PolymerElements/paper-styles/blob/master/typography.html):
-Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes
-
-
-1. [demo-pages.html](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles
-used in the PolymerElements demo pages
-
-
-
-We recommend importing each of these individual files, and using the style mixins
-available in each ones, rather than the aggregated `paper-styles.html` as a whole.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/bower.json b/systrace/catapult/third_party/polymer/components/paper-styles/bower.json
deleted file mode 100644
index daaab79..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "paper-styles",
-  "version": "1.3.1",
-  "description": "Common (global) styles for Material Design elements.",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-component",
-    "polymer",
-    "style"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-styles.git"
-  },
-  "main": "paper-styles.html",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/polymerelements/paper-styles/",
-  "ignore": [
-    "/.*"
-  ],
-  "dependencies": {
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "font-roboto": "PolymerElements/font-roboto#^1.0.1",
-    "polymer": "Polymer/polymer#^1.0.0"
-  },
-  "devDependencies": {
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "iron-component-page": "polymerelements/iron-component-page#^1.0.0",
-    "web-component-tester": "^4.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/classes/global.html b/systrace/catapult/third_party/polymer/components/paper-styles/classes/global.html
deleted file mode 100644
index 6f0d5dd..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/classes/global.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../paper-styles-classes.html">
-
-<!--
-A set of base styles that are applied to the document and standard elements that
-match the Material Design spec.
--->
-<style>
-/*
-Note that there is a lot of style duplication here. The hope is that the Polymer
-0.8 styling solution will allow for inheritance of properties so that we can
-eventually avoid it.
-*/
-
-/* Mixins */
-
-/* [paper-font] */
-body {
-  font-family: 'Roboto', 'Noto', sans-serif;
-  -webkit-font-smoothing: antialiased;  /* OS X subpixel AA bleed bug */
-}
-
-/* [paper-font=display2] */
-h1 {
-  font-size: 45px;
-  font-weight: 400;
-  letter-spacing: -.018em;
-  line-height: 48px;
-}
-
-/* [paper-font=display1] */
-h2 {
-  font-size: 34px;
-  font-weight: 400;
-  letter-spacing: -.01em;
-  line-height: 40px;
-}
-
-/* [paper-font=headline] */
-h3 {
-  font-size: 24px;
-  font-weight: 400;
-  letter-spacing: -.012em;
-  line-height: 32px;
-}
-
-/* [paper-font=subhead] */
-h4 {
-  font-size: 16px;
-  font-weight: 400;
-  line-height: 24px;
-}
-
-/* [paper-font=body2] */
-h5, h6 {
-  font-size: 14px;
-  font-weight: 500;
-  line-height: 24px;
-}
-
-/* [paper-font=button] */
-a {
-  font-size: 14px;
-  font-weight: 500;
-  letter-spacing: 0.018em;
-  line-height: 24px;
-  text-transform: uppercase;
-}
-
-/* Overrides */
-
-body, a {
-  color: #212121;
-}
-
-h1, h2, h3, h4, h5, h6, p {
-  margin: 0 0 20px 0;
-}
-
-h1, h2, h3, h4, h5, h6, a {
-  text-rendering: optimizeLegibility;
-}
-
-a {
-  text-decoration: none;
-}
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/classes/shadow-layout.html b/systrace/catapult/third_party/polymer/components/paper-styles/classes/shadow-layout.html
deleted file mode 100644
index 50708be..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/classes/shadow-layout.html
+++ /dev/null
@@ -1,307 +0,0 @@
-<!--

-@license

-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.

-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt

-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt

-Code distributed by Google as part of the polymer project is also

-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt

--->

-

-<script>

-  console.warn('This file is deprecated. Please use `iron-flex-layout/iron-flex-layout-classes.html`, and one of the specific dom-modules instead');

-</script>

-

-<style>

-

-  /*******************************

-            Flex Layout

-  *******************************/

-

-  html /deep/ .layout.horizontal,

-  html /deep/ .layout.horizontal-reverse,

-  html /deep/ .layout.vertical,

-  html /deep/ .layout.vertical-reverse {

-    display: -ms-flexbox;

-    display: -webkit-flex;

-    display: flex;

-  }

-

-  html /deep/ .layout.inline {

-    display: -ms-inline-flexbox;

-    display: -webkit-inline-flex;

-    display: inline-flex;

-  }

-

-  html /deep/ .layout.horizontal {

-    -ms-flex-direction: row;

-    -webkit-flex-direction: row;

-    flex-direction: row;

-  }

-

-  html /deep/ .layout.horizontal-reverse {

-    -ms-flex-direction: row-reverse;

-    -webkit-flex-direction: row-reverse;

-    flex-direction: row-reverse;

-  }

-

-  html /deep/ .layout.vertical {

-    -ms-flex-direction: column;

-    -webkit-flex-direction: column;

-    flex-direction: column;

-  }

-

-  html /deep/ .layout.vertical-reverse {

-    -ms-flex-direction: column-reverse;

-    -webkit-flex-direction: column-reverse;

-    flex-direction: column-reverse;

-  }

-

-  html /deep/ .layout.wrap {

-    -ms-flex-wrap: wrap;

-    -webkit-flex-wrap: wrap;

-    flex-wrap: wrap;

-  }

-

-  html /deep/ .layout.wrap-reverse {

-    -ms-flex-wrap: wrap-reverse;

-    -webkit-flex-wrap: wrap-reverse;

-    flex-wrap: wrap-reverse;

-  }

-

-  html /deep/ .flex-auto {

-    -ms-flex: 1 1 auto;

-    -webkit-flex: 1 1 auto;

-    flex: 1 1 auto;

-  }

-

-  html /deep/ .flex-none {

-    -ms-flex: none;

-    -webkit-flex: none;

-    flex: none;

-  }

-

-  html /deep/ .flex,

-  html /deep/ .flex-1 {

-    -ms-flex: 1;

-    -webkit-flex: 1;

-    flex: 1;

-  }

-

-  html /deep/ .flex-2 {

-    -ms-flex: 2;

-    -webkit-flex: 2;

-    flex: 2;

-  }

-

-  html /deep/ .flex-3 {

-    -ms-flex: 3;

-    -webkit-flex: 3;

-    flex: 3;

-  }

-

-  html /deep/ .flex-4 {

-    -ms-flex: 4;

-    -webkit-flex: 4;

-    flex: 4;

-  }

-

-  html /deep/ .flex-5 {

-    -ms-flex: 5;

-    -webkit-flex: 5;

-    flex: 5;

-  }

-

-  html /deep/ .flex-6 {

-    -ms-flex: 6;

-    -webkit-flex: 6;

-    flex: 6;

-  }

-

-  html /deep/ .flex-7 {

-    -ms-flex: 7;

-    -webkit-flex: 7;

-    flex: 7;

-  }

-

-  html /deep/ .flex-8 {

-    -ms-flex: 8;

-    -webkit-flex: 8;

-    flex: 8;

-  }

-

-  html /deep/ .flex-9 {

-    -ms-flex: 9;

-    -webkit-flex: 9;

-    flex: 9;

-  }

-

-  html /deep/ .flex-10 {

-    -ms-flex: 10;

-    -webkit-flex: 10;

-    flex: 10;

-  }

-

-  html /deep/ .flex-11 {

-    -ms-flex: 11;

-    -webkit-flex: 11;

-    flex: 11;

-  }

-

-  html /deep/ .flex-12 {

-    -ms-flex: 12;

-    -webkit-flex: 12;

-    flex: 12;

-  }

-

-  /* alignment in cross axis */

-

-  html /deep/ .layout.start {

-    -ms-flex-align: start;

-    -webkit-align-items: flex-start;

-    align-items: flex-start;

-  }

-

-  html /deep/ .layout.center,

-  html /deep/ .layout.center-center {

-    -ms-flex-align: center;

-    -webkit-align-items: center;

-    align-items: center;

-  }

-

-  html /deep/ .layout.end {

-    -ms-flex-align: end;

-    -webkit-align-items: flex-end;

-    align-items: flex-end;

-  }

-

-  /* alignment in main axis */

-

-  html /deep/ .layout.start-justified {

-    -ms-flex-pack: start;

-    -webkit-justify-content: flex-start;

-    justify-content: flex-start;

-  }

-

-  html /deep/ .layout.center-justified,

-  html /deep/ .layout.center-center {

-    -ms-flex-pack: center;

-    -webkit-justify-content: center;

-    justify-content: center;

-  }

-

-  html /deep/ .layout.end-justified {

-    -ms-flex-pack: end;

-    -webkit-justify-content: flex-end;

-    justify-content: flex-end;

-  }

-

-  html /deep/ .layout.around-justified {

-    -ms-flex-pack: around;

-    -webkit-justify-content: space-around;

-    justify-content: space-around;

-  }

-

-  html /deep/ .layout.justified {

-    -ms-flex-pack: justify;

-    -webkit-justify-content: space-between;

-    justify-content: space-between;

-  }

-

-  /* self alignment */

-

-  html /deep/ .self-start {

-    -ms-align-self: flex-start;

-    -webkit-align-self: flex-start;

-    align-self: flex-start;

-  }

-

-  html /deep/ .self-center {

-    -ms-align-self: center;

-    -webkit-align-self: center;

-    align-self: center;

-  }

-

-  html /deep/ .self-end {

-    -ms-align-self: flex-end;

-    -webkit-align-self: flex-end;

-    align-self: flex-end;

-  }

-

-  html /deep/ .self-stretch {

-    -ms-align-self: stretch;

-    -webkit-align-self: stretch;

-    align-self: stretch;

-  }

-

-  /*******************************

-            Other Layout

-  *******************************/

-

-  html /deep/ .block {

-    display: block;

-  }

-

-  /* IE 10 support for HTML5 hidden attr */

-  html /deep/ [hidden] {

-    display: none !important;

-  }

-

-  html /deep/ .invisible {

-    visibility: hidden !important;

-  }

-

-  html /deep/ .relative {

-    position: relative;

-  }

-

-  html /deep/ .fit {

-    position: absolute;

-    top: 0;

-    right: 0;

-    bottom: 0;

-    left: 0;

-  }

-

-  body.fullbleed {

-    margin: 0;

-    height: 100vh;

-  }

-

-  html /deep/ .scroll {

-    -webkit-overflow-scrolling: touch;

-    overflow: auto;

-  }

-

-  .fixed-bottom,

-  .fixed-left,

-  .fixed-right,

-  .fixed-top {

-    position: fixed;

-  }

-

-  html /deep/ .fixed-top {

-    top: 0;

-    left: 0;

-    right: 0;

-  }

-

-  html /deep/ .fixed-right {

-    top: 0;

-    right: 0;

-    bottom: 0;

-  }

-

-  html /deep/ .fixed-bottom {

-    right: 0;

-    bottom: 0;

-    left: 0;

-  }

-

-  html /deep/ .fixed-left {

-    top: 0;

-    bottom: 0;

-    left: 0;

-  }

-

-</style>

diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/classes/shadow.html b/systrace/catapult/third_party/polymer/components/paper-styles/classes/shadow.html
deleted file mode 100644
index 4c40a14..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/classes/shadow.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<style>
-.shadow-transition {
-  transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
-}
-
-.shadow-elevation-2dp {
-  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
-              0 1px 5px 0 rgba(0, 0, 0, 0.12),
-              0 3px 1px -2px rgba(0, 0, 0, 0.2);
-}
-
-.shadow-elevation-3dp {
-  box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14),
-              0 1px 8px 0 rgba(0, 0, 0, 0.12),
-              0 3px 3px -2px rgba(0, 0, 0, 0.4);
-}
-
-.shadow-elevation-4dp {
-  box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),
-              0 1px 10px 0 rgba(0, 0, 0, 0.12),
-              0 2px 4px -1px rgba(0, 0, 0, 0.4);
-}
-
-.shadow-elevation-6dp {
-  box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14),
-              0 1px 18px 0 rgba(0, 0, 0, 0.12),
-              0 3px 5px -1px rgba(0, 0, 0, 0.4);
-}
-
-.shadow-elevation-8dp {
-  box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),
-              0 3px 14px 2px rgba(0, 0, 0, 0.12),
-              0 5px 5px -3px rgba(0, 0, 0, 0.4);
-}
-
-.shadow-elevation-16dp {
-  box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14),
-              0  6px 30px 5px rgba(0, 0, 0, 0.12),
-              0  8px 10px -5px rgba(0, 0, 0, 0.4);
-}
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/classes/typography.html b/systrace/catapult/third_party/polymer/components/paper-styles/classes/typography.html
deleted file mode 100644
index b399395..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/classes/typography.html
+++ /dev/null
@@ -1,169 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../../font-roboto/roboto.html">
-
-<!--
-Typographic styles are provided matching the Material Design standard styles:
-http://www.google.com/design/spec/style/typography.html#typography-standard-styles
-
-To make use of them, apply a `paper-font-<style>` class to elements, matching
-the font style you wish it to inherit.
-
-  <h1 class="paper-font-display2">Hey there!</h1>
-
-Note that these are English/Latin centric styles. You may need to further adjust
-line heights and weights for CJK typesetting. See the notes in the Material
-Design typography section.
--->
-<style>
-
-.paper-font-display4,
-.paper-font-display3,
-.paper-font-display2,
-.paper-font-display1,
-.paper-font-headline,
-.paper-font-title,
-.paper-font-subhead,
-.paper-font-body2,
-.paper-font-body1,
-.paper-font-caption,
-.paper-font-menu,
-.paper-font-button {
-  font-family: 'Roboto', 'Noto', sans-serif;
-  -webkit-font-smoothing: antialiased;  /* OS X subpixel AA bleed bug */
-}
-
-.paper-font-code2,
-.paper-font-code1 {
-  font-family: 'Roboto Mono', 'Consolas', 'Menlo', monospace;
-  -webkit-font-smoothing: antialiased;  /* OS X subpixel AA bleed bug */
-}
-
-/* Opt for better kerning for headers & other short labels. */
-.paper-font-display4,
-.paper-font-display3,
-.paper-font-display2,
-.paper-font-display1,
-.paper-font-headline,
-.paper-font-title,
-.paper-font-subhead,
-.paper-font-menu,
-.paper-font-button {
-  text-rendering: optimizeLegibility;
-}
-
-/*
-"Line wrapping only applies to Body, Subhead, Headline, and the smaller Display
-styles. All other styles should exist as single lines."
-*/
-.paper-font-display4,
-.paper-font-display3,
-.paper-font-title,
-.paper-font-caption,
-.paper-font-menu,
-.paper-font-button {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.paper-font-display4 {
-  font-size: 112px;
-  font-weight: 300;
-  letter-spacing: -.044em;
-  line-height: 120px;
-}
-
-.paper-font-display3 {
-  font-size: 56px;
-  font-weight: 400;
-  letter-spacing: -.026em;
-  line-height: 60px;
-}
-
-.paper-font-display2 {
-  font-size: 45px;
-  font-weight: 400;
-  letter-spacing: -.018em;
-  line-height: 48px;
-}
-
-.paper-font-display1 {
-  font-size: 34px;
-  font-weight: 400;
-  letter-spacing: -.01em;
-  line-height: 40px;
-}
-
-.paper-font-headline {
-  font-size: 24px;
-  font-weight: 400;
-  letter-spacing: -.012em;
-  line-height: 32px;
-}
-
-.paper-font-title {
-  font-size: 20px;
-  font-weight: 500;
-  line-height: 28px;
-}
-
-.paper-font-subhead {
-  font-size: 16px;
-  font-weight: 400;
-  line-height: 24px;
-}
-
-.paper-font-body2 {
-  font-size: 14px;
-  font-weight: 500;
-  line-height: 24px;
-}
-
-.paper-font-body1 {
-  font-size: 14px;
-  font-weight: 400;
-  line-height: 20px;
-}
-
-.paper-font-caption {
-  font-size: 12px;
-  font-weight: 400;
-  letter-spacing: 0.011em;
-  line-height: 20px;
-}
-
-.paper-font-menu {
-  font-size: 13px;
-  font-weight: 500;
-  line-height: 24px;
-}
-
-.paper-font-button {
-  font-size: 14px;
-  font-weight: 500;
-  letter-spacing: 0.018em;
-  line-height: 24px;
-  text-transform: uppercase;
-}
-
-.paper-font-code2 {
-  font-size: 14px;
-  font-weight: 700;
-  line-height: 20px;
-}
-
-.paper-font-code1 {
-  font-size: 14px;
-  font-weight: 500;
-  line-height: 20px;
-}
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/color.html b/systrace/catapult/third_party/polymer/components/paper-styles/color.html
deleted file mode 100644
index 5188790..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/color.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<style is="custom-style">
-
-  :root {
-
-    /* Material Design color palette for Google products */
-
-    --google-red-100: #f4c7c3;
-    --google-red-300: #e67c73;
-    --google-red-500: #db4437;
-    --google-red-700: #c53929;
-
-    --google-blue-100: #c6dafc;
-    --google-blue-300: #7baaf7;
-    --google-blue-500: #4285f4;
-    --google-blue-700: #3367d6;
-
-    --google-green-100: #b7e1cd;
-    --google-green-300: #57bb8a;
-    --google-green-500: #0f9d58;
-    --google-green-700: #0b8043;
-
-    --google-yellow-100: #fce8b2;
-    --google-yellow-300: #f7cb4d;
-    --google-yellow-500: #f4b400;
-    --google-yellow-700: #f09300;
-
-    --google-grey-100: #f5f5f5;
-    --google-grey-300: #e0e0e0;
-    --google-grey-500: #9e9e9e;
-    --google-grey-700: #616161;
-    
-    /* Material Design color palette from online spec document */
-
-    --paper-red-50: #ffebee;
-    --paper-red-100: #ffcdd2;
-    --paper-red-200: #ef9a9a;
-    --paper-red-300: #e57373;
-    --paper-red-400: #ef5350;
-    --paper-red-500: #f44336;
-    --paper-red-600: #e53935;
-    --paper-red-700: #d32f2f;
-    --paper-red-800: #c62828;
-    --paper-red-900: #b71c1c;
-    --paper-red-a100: #ff8a80;
-    --paper-red-a200: #ff5252;
-    --paper-red-a400: #ff1744;
-    --paper-red-a700: #d50000;
- 
-    --paper-pink-50: #fce4ec;
-    --paper-pink-100: #f8bbd0;
-    --paper-pink-200: #f48fb1;
-    --paper-pink-300: #f06292;
-    --paper-pink-400: #ec407a;
-    --paper-pink-500: #e91e63;
-    --paper-pink-600: #d81b60;
-    --paper-pink-700: #c2185b;
-    --paper-pink-800: #ad1457;
-    --paper-pink-900: #880e4f;
-    --paper-pink-a100: #ff80ab;
-    --paper-pink-a200: #ff4081;
-    --paper-pink-a400: #f50057;
-    --paper-pink-a700: #c51162;
- 
-    --paper-purple-50: #f3e5f5;
-    --paper-purple-100: #e1bee7;
-    --paper-purple-200: #ce93d8;
-    --paper-purple-300: #ba68c8;
-    --paper-purple-400: #ab47bc;
-    --paper-purple-500: #9c27b0;
-    --paper-purple-600: #8e24aa;
-    --paper-purple-700: #7b1fa2;
-    --paper-purple-800: #6a1b9a;
-    --paper-purple-900: #4a148c;
-    --paper-purple-a100: #ea80fc;
-    --paper-purple-a200: #e040fb;
-    --paper-purple-a400: #d500f9;
-    --paper-purple-a700: #aa00ff;
- 
-    --paper-deep-purple-50: #ede7f6;
-    --paper-deep-purple-100: #d1c4e9;
-    --paper-deep-purple-200: #b39ddb;
-    --paper-deep-purple-300: #9575cd;
-    --paper-deep-purple-400: #7e57c2;
-    --paper-deep-purple-500: #673ab7;
-    --paper-deep-purple-600: #5e35b1;
-    --paper-deep-purple-700: #512da8;
-    --paper-deep-purple-800: #4527a0;
-    --paper-deep-purple-900: #311b92;
-    --paper-deep-purple-a100: #b388ff;
-    --paper-deep-purple-a200: #7c4dff;
-    --paper-deep-purple-a400: #651fff;
-    --paper-deep-purple-a700: #6200ea;
- 
-    --paper-indigo-50: #e8eaf6;
-    --paper-indigo-100: #c5cae9;
-    --paper-indigo-200: #9fa8da;
-    --paper-indigo-300: #7986cb;
-    --paper-indigo-400: #5c6bc0;
-    --paper-indigo-500: #3f51b5;
-    --paper-indigo-600: #3949ab;
-    --paper-indigo-700: #303f9f;
-    --paper-indigo-800: #283593;
-    --paper-indigo-900: #1a237e;
-    --paper-indigo-a100: #8c9eff;
-    --paper-indigo-a200: #536dfe;
-    --paper-indigo-a400: #3d5afe;
-    --paper-indigo-a700: #304ffe;
- 
-    --paper-blue-50: #e3f2fd;
-    --paper-blue-100: #bbdefb;
-    --paper-blue-200: #90caf9;
-    --paper-blue-300: #64b5f6;
-    --paper-blue-400: #42a5f5;
-    --paper-blue-500: #2196f3;
-    --paper-blue-600: #1e88e5;
-    --paper-blue-700: #1976d2;
-    --paper-blue-800: #1565c0;
-    --paper-blue-900: #0d47a1;
-    --paper-blue-a100: #82b1ff;
-    --paper-blue-a200: #448aff;
-    --paper-blue-a400: #2979ff;
-    --paper-blue-a700: #2962ff;
- 
-    --paper-light-blue-50: #e1f5fe;
-    --paper-light-blue-100: #b3e5fc;
-    --paper-light-blue-200: #81d4fa;
-    --paper-light-blue-300: #4fc3f7;
-    --paper-light-blue-400: #29b6f6;
-    --paper-light-blue-500: #03a9f4;
-    --paper-light-blue-600: #039be5;
-    --paper-light-blue-700: #0288d1;
-    --paper-light-blue-800: #0277bd;
-    --paper-light-blue-900: #01579b;
-    --paper-light-blue-a100: #80d8ff;
-    --paper-light-blue-a200: #40c4ff;
-    --paper-light-blue-a400: #00b0ff;
-    --paper-light-blue-a700: #0091ea;
- 
-    --paper-cyan-50: #e0f7fa;
-    --paper-cyan-100: #b2ebf2;
-    --paper-cyan-200: #80deea;
-    --paper-cyan-300: #4dd0e1;
-    --paper-cyan-400: #26c6da;
-    --paper-cyan-500: #00bcd4;
-    --paper-cyan-600: #00acc1;
-    --paper-cyan-700: #0097a7;
-    --paper-cyan-800: #00838f;
-    --paper-cyan-900: #006064;
-    --paper-cyan-a100: #84ffff;
-    --paper-cyan-a200: #18ffff;
-    --paper-cyan-a400: #00e5ff;
-    --paper-cyan-a700: #00b8d4;
- 
-    --paper-teal-50: #e0f2f1;
-    --paper-teal-100: #b2dfdb;
-    --paper-teal-200: #80cbc4;
-    --paper-teal-300: #4db6ac;
-    --paper-teal-400: #26a69a;
-    --paper-teal-500: #009688;
-    --paper-teal-600: #00897b;
-    --paper-teal-700: #00796b;
-    --paper-teal-800: #00695c;
-    --paper-teal-900: #004d40;
-    --paper-teal-a100: #a7ffeb;
-    --paper-teal-a200: #64ffda;
-    --paper-teal-a400: #1de9b6;
-    --paper-teal-a700: #00bfa5;
- 
-    --paper-green-50: #e8f5e9;
-    --paper-green-100: #c8e6c9;
-    --paper-green-200: #a5d6a7;
-    --paper-green-300: #81c784;
-    --paper-green-400: #66bb6a;
-    --paper-green-500: #4caf50;
-    --paper-green-600: #43a047;
-    --paper-green-700: #388e3c;
-    --paper-green-800: #2e7d32;
-    --paper-green-900: #1b5e20;
-    --paper-green-a100: #b9f6ca;
-    --paper-green-a200: #69f0ae;
-    --paper-green-a400: #00e676;
-    --paper-green-a700: #00c853;
- 
-    --paper-light-green-50: #f1f8e9;
-    --paper-light-green-100: #dcedc8;
-    --paper-light-green-200: #c5e1a5;
-    --paper-light-green-300: #aed581;
-    --paper-light-green-400: #9ccc65;
-    --paper-light-green-500: #8bc34a;
-    --paper-light-green-600: #7cb342;
-    --paper-light-green-700: #689f38;
-    --paper-light-green-800: #558b2f;
-    --paper-light-green-900: #33691e;
-    --paper-light-green-a100: #ccff90;
-    --paper-light-green-a200: #b2ff59;
-    --paper-light-green-a400: #76ff03;
-    --paper-light-green-a700: #64dd17;
- 
-    --paper-lime-50: #f9fbe7;
-    --paper-lime-100: #f0f4c3;
-    --paper-lime-200: #e6ee9c;
-    --paper-lime-300: #dce775;
-    --paper-lime-400: #d4e157;
-    --paper-lime-500: #cddc39;
-    --paper-lime-600: #c0ca33;
-    --paper-lime-700: #afb42b;
-    --paper-lime-800: #9e9d24;
-    --paper-lime-900: #827717;
-    --paper-lime-a100: #f4ff81;
-    --paper-lime-a200: #eeff41;
-    --paper-lime-a400: #c6ff00;
-    --paper-lime-a700: #aeea00;
- 
-    --paper-yellow-50: #fffde7;
-    --paper-yellow-100: #fff9c4;
-    --paper-yellow-200: #fff59d;
-    --paper-yellow-300: #fff176;
-    --paper-yellow-400: #ffee58;
-    --paper-yellow-500: #ffeb3b;
-    --paper-yellow-600: #fdd835;
-    --paper-yellow-700: #fbc02d;
-    --paper-yellow-800: #f9a825;
-    --paper-yellow-900: #f57f17;
-    --paper-yellow-a100: #ffff8d;
-    --paper-yellow-a200: #ffff00;
-    --paper-yellow-a400: #ffea00;
-    --paper-yellow-a700: #ffd600;
- 
-    --paper-amber-50: #fff8e1;
-    --paper-amber-100: #ffecb3;
-    --paper-amber-200: #ffe082;
-    --paper-amber-300: #ffd54f;
-    --paper-amber-400: #ffca28;
-    --paper-amber-500: #ffc107;
-    --paper-amber-600: #ffb300;
-    --paper-amber-700: #ffa000;
-    --paper-amber-800: #ff8f00;
-    --paper-amber-900: #ff6f00;
-    --paper-amber-a100: #ffe57f;
-    --paper-amber-a200: #ffd740;
-    --paper-amber-a400: #ffc400;
-    --paper-amber-a700: #ffab00;
- 
-    --paper-orange-50: #fff3e0;
-    --paper-orange-100: #ffe0b2;
-    --paper-orange-200: #ffcc80;
-    --paper-orange-300: #ffb74d;
-    --paper-orange-400: #ffa726;
-    --paper-orange-500: #ff9800;
-    --paper-orange-600: #fb8c00;
-    --paper-orange-700: #f57c00;
-    --paper-orange-800: #ef6c00;
-    --paper-orange-900: #e65100;
-    --paper-orange-a100: #ffd180;
-    --paper-orange-a200: #ffab40;
-    --paper-orange-a400: #ff9100;
-    --paper-orange-a700: #ff6500;
- 
-    --paper-deep-orange-50: #fbe9e7;
-    --paper-deep-orange-100: #ffccbc;
-    --paper-deep-orange-200: #ffab91;
-    --paper-deep-orange-300: #ff8a65;
-    --paper-deep-orange-400: #ff7043;
-    --paper-deep-orange-500: #ff5722;
-    --paper-deep-orange-600: #f4511e;
-    --paper-deep-orange-700: #e64a19;
-    --paper-deep-orange-800: #d84315;
-    --paper-deep-orange-900: #bf360c;
-    --paper-deep-orange-a100: #ff9e80;
-    --paper-deep-orange-a200: #ff6e40;
-    --paper-deep-orange-a400: #ff3d00;
-    --paper-deep-orange-a700: #dd2c00;
- 
-    --paper-brown-50: #efebe9;
-    --paper-brown-100: #d7ccc8;
-    --paper-brown-200: #bcaaa4;
-    --paper-brown-300: #a1887f;
-    --paper-brown-400: #8d6e63;
-    --paper-brown-500: #795548;
-    --paper-brown-600: #6d4c41;
-    --paper-brown-700: #5d4037;
-    --paper-brown-800: #4e342e;
-    --paper-brown-900: #3e2723;
- 
-    --paper-grey-50: #fafafa;
-    --paper-grey-100: #f5f5f5;
-    --paper-grey-200: #eeeeee;
-    --paper-grey-300: #e0e0e0;
-    --paper-grey-400: #bdbdbd;
-    --paper-grey-500: #9e9e9e;
-    --paper-grey-600: #757575;
-    --paper-grey-700: #616161;
-    --paper-grey-800: #424242;
-    --paper-grey-900: #212121;
- 
-    --paper-blue-grey-50: #eceff1;
-    --paper-blue-grey-100: #cfd8dc;
-    --paper-blue-grey-200: #b0bec5;
-    --paper-blue-grey-300: #90a4ae;
-    --paper-blue-grey-400: #78909c;
-    --paper-blue-grey-500: #607d8b;
-    --paper-blue-grey-600: #546e7a;
-    --paper-blue-grey-700: #455a64;
-    --paper-blue-grey-800: #37474f;
-    --paper-blue-grey-900: #263238;
-
-    /* opacity for dark text on a light background */
-    --dark-divider-opacity: 0.12;
-    --dark-disabled-opacity: 0.38; /* or hint text or icon */
-    --dark-secondary-opacity: 0.54;
-    --dark-primary-opacity: 0.87;
-
-    /* opacity for light text on a dark background */
-    --light-divider-opacity: 0.12;
-    --light-disabled-opacity: 0.3; /* or hint text or icon */
-    --light-secondary-opacity: 0.7;
-    --light-primary-opacity: 1.0;
-
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/default-theme.html b/systrace/catapult/third_party/polymer/components/paper-styles/default-theme.html
deleted file mode 100644
index cc69728..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/default-theme.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="color.html">
-
-<!-- Taken from https://www.google.com/design/spec/style/color.html#color-ui-color-application -->
-
-<style is="custom-style">
-
-  :root {
-    /*
-     * You can use these generic variables in your elements for easy theming.
-     * For example, if all your elements use `--primary-text-color` as its main
-     * color, then switching from a light to a dark theme is just a matter of
-     * changing the value of `--primary-text-color` in your application.
-     */
-    --primary-text-color: var(--light-theme-text-color);
-    --primary-background-color: var(--light-theme-background-color);
-    --secondary-text-color: var(--light-theme-secondary-color);
-    --disabled-text-color: var(--light-theme-disabled-color);
-    --divider-color: var(--light-theme-divider-color);
-    --error-color: var(--paper-deep-orange-a700);
-
-    /*
-     * Primary and accent colors. Also see color.html for more colors.
-     */
-    --primary-color: var(--paper-indigo-500);
-    --light-primary-color: var(--paper-indigo-100);
-    --dark-primary-color: var(--paper-indigo-700);
-
-    --accent-color: var(--paper-pink-a200);
-    --light-accent-color: var(--paper-pink-a100);
-    --dark-accent-color: var(--paper-pink-a400);
-
-
-    /*
-     * Material Design Light background theme
-     */
-    --light-theme-background-color: #ffffff;
-    --light-theme-base-color: #000000;
-    --light-theme-text-color: var(--paper-grey-900);
-    --light-theme-secondary-color: #737373;  /* for secondary text and icons */
-    --light-theme-disabled-color: #9b9b9b;  /* disabled/hint text */
-    --light-theme-divider-color: #dbdbdb;
-
-    /*
-     * Material Design Dark background theme
-     */
-    --dark-theme-background-color: var(--paper-grey-900);
-    --dark-theme-base-color: #ffffff;
-    --dark-theme-text-color: #ffffff;
-    --dark-theme-secondary-color: #bcbcbc;  /* for secondary text and icons */
-    --dark-theme-disabled-color: #646464;  /* disabled/hint text */
-    --dark-theme-divider-color: #3c3c3c;
-
-    /*
-     * Deprecated values because of their confusing names.
-     */
-    --text-primary-color: var(--dark-theme-text-color);
-    --default-primary-color: var(--primary-color);
-
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/demo-pages.html b/systrace/catapult/third_party/polymer/components/paper-styles/demo-pages.html
deleted file mode 100644
index 6e900ad..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/demo-pages.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-
-<link rel="import" href="color.html">
-<link rel="import" href="typography.html">
-<link rel="import" href="shadow.html">
-
-<style is="custom-style">
-
-  body {
-    @apply(--paper-font-common-base);
-    font-size: 14px;
-    margin: 0;
-    padding: 24px;
-    background-color: var(--paper-grey-50);
-  }
-
-  .horizontal-section-container {
-    @apply(--layout-horizontal);
-    @apply(--layout-center-justified);
-    @apply(--layout-wrap);
-  }
-
-  .vertical-section-container {
-    @apply(--layout-vertical);
-    @apply(--center-justified);
-  }
-
-  .horizontal-section {
-    background-color: white;
-    padding: 24px;
-    margin-right: 24px;
-    min-width: 200px;
-
-    @apply(--shadow-elevation-2dp);
-  }
-
-  .vertical-section {
-    background-color: white;
-    padding: 24px;
-    margin: 0 24px 24px 24px;
-
-    @apply(--shadow-elevation-2dp);
-  }
-
-  .centered {
-    max-width: 400px;
-    margin-left: auto;
-    margin-right: auto;
-  }
-
-  code {
-    color: var(--google-grey-700);
-  }
-
-  /* TODO: remove this hack and use horizontal-section-container instead */
-  body > div.layout.horizontal.center-justified {
-    @apply(--layout-wrap);
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/demo.css b/systrace/catapult/third_party/polymer/components/paper-styles/demo.css
deleted file mode 100644
index efd8b47..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/demo.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-
-*/
-body {
-  font-family: 'Roboto', 'Noto', sans-serif;
-  font-size: 14px;
-  margin: 0;
-  padding: 24px;
-}
-
-section {
-  padding: 20px 0;
-}
-
-section > div {
-  padding: 14px;
-  font-size: 16px;
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-styles/demo/index.html
deleted file mode 100644
index 1080cc6..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/demo/index.html
+++ /dev/null
@@ -1,339 +0,0 @@
-<!doctype html>
-
-<!--
-  @license
-  Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-  This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-  The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-  The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-  Code distributed by Google as part of the polymer project is also
-  subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-
-    <title>paper-styles demo</title>
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../color.html">
-    <link rel="import" href="../typography.html">
-    <link rel="import" href="../default-theme.html">
-    <link rel="import" href="../demo-pages.html">
-  </head>
-
-  <style>
-    .redlines {
-      background: linear-gradient(0deg, transparent, transparent 3.5px, rgba(255,0,0,0.2) 3.5px, rgba(255,0,0,0.2) 4px);
-      background-size: 100% 4px;
-    }
-
-    .paragraph {
-      margin-bottom: 20px;
-    }
-  </style>
-  <style is="custom-style">
-    .paper-font-display4 {
-      @apply(--paper-font-display4);
-    }
-
-    .paper-font-display3 {
-      @apply(--paper-font-display3);
-    }
-
-    .paper-font-display2 {
-      @apply(--paper-font-display2);
-    }
-
-    .paper-font-display1 {
-      @apply(--paper-font-display1);
-    }
-
-    .paper-font-headline {
-      @apply(--paper-font-headline);
-    }
-
-    .paper-font-title {
-      @apply(--paper-font-title);
-    }
-
-    .paper-font-subhead {
-      @apply(--paper-font-subhead);
-    }
-
-    .paper-font-body2 {
-      @apply(--paper-font-body2);
-    }
-
-    .paper-font-body1 {
-      @apply(--paper-font-body1);
-    }
-
-    .paper-font-caption {
-      @apply(--paper-font-caption);
-    }
-
-    .paper-font-menu {
-      @apply(--paper-font-menu);
-    }
-
-    .paper-font-button {
-      @apply(--paper-font-button);
-    }
-
-    .mobile-app {
-      max-width: 320px;
-    }
-
-    .toolbar {
-      height: 144px;
-      padding: 16px;
-
-      background: var(--default-primary-color);
-      color: var(--text-primary-color);
-      @apply(--paper-font-display1);
-    }
-
-    .item, .disabled-item {
-      position: relative;
-      padding: 8px;
-      border: 1px solid;
-      border-color: var(--divider-color);
-      border-top: 0;
-    }
-
-    .item .primary {
-      color: var(--primary-text-color);
-
-      @apply(--paper-font-body2);
-    }
-
-    .item .secondary {
-      color: var(--secondary-text-color);
-
-      @apply(--paper-font-body1);
-    }
-
-    .disabled-item {
-      color: var(--disabled-text-color);
-
-      @apply(--paper-font-body2);
-    }
-
-    .fab {
-      position: absolute;
-      box-sizing: border-box;
-      padding: 8px;
-      width: 56px;
-      height: 56px;
-      right: 16px;
-      top: -28px;
-      border-radius: 50%;
-      text-align: center;
-
-      background: var(--accent-color);
-      color: var(--text-primary-color);
-      @apply(--paper-font-display1);
-    }
-
-    .shadow {
-      display: inline-block;
-      padding: 8px;
-      margin: 16px;
-      height: 50px;
-      width: 50px;
-    }
-
-    .shadow-2dp {
-      @apply(--shadow-elevation-2dp);
-    }
-
-    .shadow-3dp {
-      @apply(--shadow-elevation-3dp);
-    }
-
-    .shadow-4dp {
-      @apply(--shadow-elevation-4dp);
-    }
-
-    .shadow-6dp {
-      @apply(--shadow-elevation-6dp);
-    }
-
-    .shadow-8dp {
-      @apply(--shadow-elevation-8dp);
-    }
-
-    .shadow-12dp {
-      @apply(--shadow-elevation-12dp);
-    }
-
-    .shadow-16dp {
-      @apply(--shadow-elevation-16dp);
-    }
-  </style>
-
-  <body unresolved>
-    <h1>paper-styles</h1>
-
-    <section id="default-theme">
-      <h2>default-theme.html</h2>
-
-      <section class="mobile-app">
-        <div class="toolbar">
-          Title
-        </div>
-        <div class="item">
-          <div class="fab">+</div>
-          <div class="primary">Primary text</div>
-          <div class="secondary">Secondary text</div>
-        </div>
-        <div class="disabled-item">
-          Disabled
-        </div>
-      </section>
-    </section>
-
-    <section id="typography">
-      <h2>typography.html</h2>
-      <p>
-        Grumpy wizards make toxic brew for the evil Queen and Jack.
-      </p>
-      <section class="redlines paragraph">
-        <div class="paper-font-display4">Display 4</div>
-        <div class="paper-font-display3">Display 3</div>
-        <div class="paper-font-display2">Display 2</div>
-        <div class="paper-font-display1">Display 1</div>
-        <div class="paper-font-headline">Headline</div>
-        <div class="paper-font-title">Title</div>
-        <div class="paper-font-subhead">Subhead</div>
-        <div class="paper-font-body2">Body 2</div>
-        <div class="paper-font-body1">Body 1</div>
-        <div class="paper-font-caption">Caption</div>
-        <div class="paper-font-menu">Menu</div>
-        <div class="paper-font-button">Button</div>
-      </section>
-
-      <h3>Paragraphs</h3>
-
-      <h4>body2</h4>
-      <section class="paper-font-body2 redlines">
-        <p>
-          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
-          tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis
-          purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis
-          dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id
-          egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet,
-          faucibus in leo.
-        </p>
-        <p>
-          Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus
-          interdum neque magna, eget dapibus est auctor et. Donec accumsan
-          libero nec augue scelerisque, ac egestas ante tincidunt. Proin
-          sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a
-          sollicitudin tellus quam non sapien.
-        </p>
-      </section>
-
-      <h4>body1</h4>
-      <section class="paper-font-body1 redlines">
-        <p>
-          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
-          tincidunt dui sit amet mi auctor, ac gravida magna aliquam. Fusce quis
-          purus elementum, tempus nisi vel, volutpat nulla. Vestibulum mollis
-          dictum tellus, vulputate porttitor arcu. Curabitur imperdiet risus id
-          egestas accumsan. Donec lectus felis, dignissim id iaculis sit amet,
-          faucibus in leo.
-        </p>
-        <p>
-          Mauris id urna ac ante ultrices commodo a imperdiet elit. Vivamus
-          interdum neque magna, eget dapibus est auctor et. Donec accumsan
-          libero nec augue scelerisque, ac egestas ante tincidunt. Proin
-          sollicitudin, mi eget sagittis mollis, arcu orci scelerisque turpis, a
-          sollicitudin tellus quam non sapien.
-        </p>
-      </section>
-    </section>
-
-    <section id="shadow">
-      <h2>shadow.html</h2>
-      <div class="shadow shadow-2dp">2dp</div>
-      <div class="shadow shadow-3dp">3dp</div>
-      <div class="shadow shadow-4dp">4dp</div>
-      <div class="shadow shadow-6dp">6dp</div>
-      <div class="shadow shadow-8dp">8dp</div>
-      <div class="shadow shadow-12dp">12dp</div>
-      <div class="shadow shadow-16dp">16dp</div>
-    </section>
-
-    <section id="demo-page">
-      <h2>demo-pages.html</h2>
-
-      <h3>Horizontal sections</h3>
-      <div class="horizontal-section-container">
-        <div>
-          <h4>Column 1</h4>
-          <div class="horizontal-section">
-            <div>Oxygen</div>
-            <div>Carbon</div>
-            <div>Hydrogen</div>
-            <div>Nitrogen</div>
-            <div>Calcium</div>
-          </div>
-        </div>
-
-        <div>
-          <h4>Column 2</h4>
-          <div class="horizontal-section">
-            <div>Oxygen</div>
-            <div>Carbon</div>
-            <div>Hydrogen</div>
-            <div>Nitrogen</div>
-            <div>Calcium</div>
-          </div>
-        </div>
-
-        <div>
-          <h4>Column 3</h4>
-          <div class="horizontal-section">
-            <div>Oxygen</div>
-            <div>Carbon</div>
-            <div>Hydrogen</div>
-            <div>Nitrogen</div>
-            <div>Calcium</div>
-          </div>
-        </div>
-      </div>
-
-      <h3>Vertical sections</h3>
-      <div class="vertical-section-container">
-        <div>
-          <h4>Section 1</h4>
-          <div class="vertical-section">
-            <div>Oxygen</div>
-            <div>Carbon</div>
-            <div>Hydrogen</div>
-            <div>Nitrogen</div>
-            <div>Calcium</div>
-          </div>
-        </div>
-      </div>
-
-      <div class="vertical-section-container centered">
-        <h4>Section 2 (centered)</h4>
-        <div class="vertical-section">
-          <div>Oxygen</div>
-          <div>Carbon</div>
-          <div>Hydrogen</div>
-          <div>Nitrogen</div>
-          <div>Calcium</div>
-        </div>
-      </div>
-    </section>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/element-styles/paper-item-styles.html b/systrace/catapult/third_party/polymer/components/paper-styles/element-styles/paper-item-styles.html
deleted file mode 100644
index 796cd24..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/element-styles/paper-item-styles.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../color.html">
-<link rel="import" href="../default-theme.html">
-<link rel="import" href="../typography.html">
-
-<!--
-Material design: [Lists](https://www.google.com/design/spec/components/lists.html)
-
-Shared styles for a native `button` to be used as an item in a `paper-listbox` element:
-
-    <custom-style>
-      <style is="custom-style" include="paper-item-styles"></style>
-    </custom-style>
-
-    <paper-listbox>
-      <button class="paper-item" role="option">Inbox</button>
-      <button class="paper-item" role="option">Starred</button>
-      <button class="paper-item" role="option">Sent mail</button>
-    </paper-listbox>
-
-@group Paper Elements
-@demo demo/index.html
--->
-
-<dom-module id="paper-item-styles">
-  <template>
-    <style>
-      :host, html {
-        --paper-item: {
-          display: block;
-          position: relative;
-          min-height: var(--paper-item-min-height, 48px);
-          padding: 0px 16px;
-          @apply --paper-font-subhead;
-          border:none;
-          outline: none;
-          background: white;
-          width: 100%;
-          text-align: left;
-        };
-      }
-      .paper-item {
-        @apply --paper-item;
-      }
-
-      .paper-item[hidden] {
-        display: none !important;
-      }
-
-      .paper-item.iron-selected {
-        font-weight: var(--paper-item-selected-weight, bold);
-        @apply --paper-item-selected;
-      }
-
-      .paper-item[disabled] {
-        color: var(--paper-item-disabled-color, var(--disabled-text-color));
-        @apply --paper-item-disabled;
-      }
-
-      .paper-item:focus {
-        position: relative;
-        outline: 0;
-        @apply --paper-item-focused;
-      }
-
-      .paper-item:focus:before {
-        position: absolute;
-        top: 0;
-        left: 0;
-        right: 0;
-        bottom: 0;
-        background: currentColor;
-        content: '';
-        opacity: var(--dark-divider-opacity);
-        pointer-events: none;
-        @apply --paper-item-focused-before;
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/element-styles/paper-material-styles.html b/systrace/catapult/third_party/polymer/components/paper-styles/element-styles/paper-material-styles.html
deleted file mode 100644
index 83aee8d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/element-styles/paper-material-styles.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../shadow.html">
-
-<!--
-Material design: [Cards](https://www.google.com/design/spec/components/cards.html)
-
-Shared styles that you can apply to an element to renders two shadows on top
-of each other,that create the effect of a lifted piece of paper.
-
-Example:
-
-    <custom-style>
-      <style is="custom-style" include="paper-material-styles"></style>
-    </custom-style>
-
-    <div class="paper-material elevation-1">
-      ... content ...
-    </div>
-
-@group Paper Elements
-@demo demo/index.html
--->
-
-<dom-module id="paper-material-styles">
-  <template>
-    <style>
-      :host, html {
-        --paper-material: {
-          display: block;
-          position: relative;
-        };
-        --paper-material-elevation-1: {
-          @apply --shadow-elevation-2dp;
-        };
-        --paper-material-elevation-2: {
-          @apply --shadow-elevation-4dp;
-        };
-        --paper-material-elevation-3: {
-          @apply --shadow-elevation-6dp;
-        };
-        --paper-material-elevation-4: {
-          @apply --shadow-elevation-8dp;
-        };
-        --paper-material-elevation-5: {
-          @apply --shadow-elevation-16dp;
-        };
-      }
-      :host(.paper-material), .paper-material {
-        @apply --paper-material;
-      }
-      :host(.paper-material[elevation="1"]), .paper-material[elevation="1"] {
-        @apply --paper-material-elevation-1;
-      }
-      :host(.paper-material[elevation="2"]), .paper-material[elevation="2"] {
-        @apply --paper-material-elevation-2;
-      }
-      :host(.paper-material[elevation="3"]), .paper-material[elevation="3"] {
-        @apply --paper-material-elevation-3;
-      }
-      :host(.paper-material[elevation="4"]), .paper-material[elevation="4"] {
-        @apply --paper-material-elevation-4;
-      }
-      :host(.paper-material[elevation="5"]), .paper-material[elevation="5"] {
-        @apply --paper-material-elevation-5;
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/index.html b/systrace/catapult/third_party/polymer/components/paper-styles/index.html
deleted file mode 100644
index 8e96ebe..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-styles</title>
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/paper-styles-classes.html b/systrace/catapult/third_party/polymer/components/paper-styles/paper-styles-classes.html
deleted file mode 100644
index ae315a5..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/paper-styles-classes.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-flex-layout/classes/iron-flex-layout.html">
-
-<link rel="import" href="classes/typography.html">
-<link rel="import" href="classes/shadow.html">
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/paper-styles.html b/systrace/catapult/third_party/polymer/components/paper-styles/paper-styles.html
deleted file mode 100644
index 9eca03a..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/paper-styles.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-flex-layout/classes/iron-flex-layout.html">
-
-<!--
-The `<paper-styles>` component provides simple ways to use Material Design CSS styles
-in your application. The following imports are available:
-
-1. [color.html](https://github.com/PolymerElements/paper-styles/blob/master/color.html):
-a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html)
-
-2. [default-theme.html](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text,
-background and accent colors that match the default Material Design theme
-
-3. [shadow.html](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design
-[elevation](https://www.google.com/design/spec/what-is-material/elevation-shadows.html) and shadow styles
-
-4. [typography.html](https://github.com/PolymerElements/paper-styles/blob/master/typography.html):
-Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes
-
-5. [demo-pages.html](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles
-used in the PolymerElements demo pages
-
-We recommend importing each of these individual files, and using the style mixins
-available in each ones, rather than the aggregated `paper-styles.html` as a whole.
-
-@group Paper Elements
-@pseudoElement paper-styles
-@demo demo/index.html
--->
-
-<link rel="import" href="color.html">
-<link rel="import" href="default-theme.html">
-<link rel="import" href="shadow.html">
-<link rel="import" href="typography.html">
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/shadow.html b/systrace/catapult/third_party/polymer/components/paper-styles/shadow.html
deleted file mode 100644
index 7e0546e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/shadow.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-
-<style is="custom-style">
-
-  :root {
-
-    --shadow-transition: {
-      transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
-    };
-
-    --shadow-none: {
-      box-shadow: none;
-    };
-
-    /* from http://codepen.io/shyndman/pen/c5394ddf2e8b2a5c9185904b57421cdb */
-
-    --shadow-elevation-2dp: {
-      box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
-                  0 1px 5px 0 rgba(0, 0, 0, 0.12),
-                  0 3px 1px -2px rgba(0, 0, 0, 0.2);
-    };
-
-    --shadow-elevation-3dp: {
-      box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14),
-                  0 1px 8px 0 rgba(0, 0, 0, 0.12),
-                  0 3px 3px -2px rgba(0, 0, 0, 0.4);
-    };
-
-    --shadow-elevation-4dp: {
-      box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14),
-                  0 1px 10px 0 rgba(0, 0, 0, 0.12),
-                  0 2px 4px -1px rgba(0, 0, 0, 0.4);
-    };
-
-    --shadow-elevation-6dp: {
-      box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14),
-                  0 1px 18px 0 rgba(0, 0, 0, 0.12),
-                  0 3px 5px -1px rgba(0, 0, 0, 0.4);
-    };
-
-    --shadow-elevation-8dp: {
-      box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),
-                  0 3px 14px 2px rgba(0, 0, 0, 0.12),
-                  0 5px 5px -3px rgba(0, 0, 0, 0.4);
-    };
-
-    --shadow-elevation-12dp: {
-      box-shadow: 0 12px 16px 1px rgba(0, 0, 0, 0.14),
-                  0 4px 22px 3px rgba(0, 0, 0, 0.12),
-                  0 6px 7px -4px rgba(0, 0, 0, 0.4);
-    };
-
-    --shadow-elevation-16dp: {
-      box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14),
-                  0  6px 30px 5px rgba(0, 0, 0, 0.12),
-                  0  8px 10px -5px rgba(0, 0, 0, 0.4);
-    };
-
-    --shadow-elevation-24dp: {
-      box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14),
-                  0 9px 46px 8px rgba(0, 0, 0, 0.12),
-                  0 11px 15px -7px rgba(0, 0, 0, 0.4);
-    };
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-styles/typography.html b/systrace/catapult/third_party/polymer/components/paper-styles/typography.html
deleted file mode 100644
index 055b5f9..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-styles/typography.html
+++ /dev/null
@@ -1,169 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../font-roboto/roboto.html">
-
-<style is="custom-style">
-
-  :root {
-
-    /* Shared Styles */
-    --paper-font-common-base: {
-      font-family: 'Roboto', 'Noto', sans-serif;
-      -webkit-font-smoothing: antialiased;
-    };
-
-    --paper-font-common-code: {
-      font-family: 'Roboto Mono', 'Consolas', 'Menlo', monospace;
-      -webkit-font-smoothing: antialiased;
-    };
-
-    --paper-font-common-expensive-kerning: {
-      text-rendering: optimizeLegibility;
-    };
-
-    --paper-font-common-nowrap: {
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-    };
-
-    /* Material Font Styles */
-
-    --paper-font-display4: {
-      @apply(--paper-font-common-base);
-      @apply(--paper-font-common-nowrap);
-
-      font-size: 112px;
-      font-weight: 300;
-      letter-spacing: -.044em;
-      line-height: 120px;
-    };
-
-    --paper-font-display3: {
-      @apply(--paper-font-common-base);
-      @apply(--paper-font-common-nowrap);
-
-      font-size: 56px;
-      font-weight: 400;
-      letter-spacing: -.026em;
-      line-height: 60px;
-    };
-
-    --paper-font-display2: {
-      @apply(--paper-font-common-base);
-
-      font-size: 45px;
-      font-weight: 400;
-      letter-spacing: -.018em;
-      line-height: 48px;
-    };
-
-    --paper-font-display1: {
-      @apply(--paper-font-common-base);
-
-      font-size: 34px;
-      font-weight: 400;
-      letter-spacing: -.01em;
-      line-height: 40px;
-    };
-
-    --paper-font-headline: {
-      @apply(--paper-font-common-base);
-
-      font-size: 24px;
-      font-weight: 400;
-      letter-spacing: -.012em;
-      line-height: 32px;
-    };
-
-    --paper-font-title: {
-      @apply(--paper-font-common-base);
-      @apply(--paper-font-common-nowrap);
-
-      font-size: 20px;
-      font-weight: 500;
-      line-height: 28px;
-    };
-
-    --paper-font-subhead: {
-      @apply(--paper-font-common-base);
-
-      font-size: 16px;
-      font-weight: 400;
-      line-height: 24px;
-    };
-
-    --paper-font-body2: {
-      @apply(--paper-font-common-base);
-
-      font-size: 14px;
-      font-weight: 500;
-      line-height: 24px;
-    };
-
-    --paper-font-body1: {
-      @apply(--paper-font-common-base);
-
-      font-size: 14px;
-      font-weight: 400;
-      line-height: 20px;
-    };
-
-    --paper-font-caption: {
-      @apply(--paper-font-common-base);
-      @apply(--paper-font-common-nowrap);
-
-      font-size: 12px;
-      font-weight: 400;
-      letter-spacing: 0.011em;
-      line-height: 20px;
-    };
-
-    --paper-font-menu: {
-      @apply(--paper-font-common-base);
-      @apply(--paper-font-common-nowrap);
-
-      font-size: 13px;
-      font-weight: 500;
-      line-height: 24px;
-    };
-
-    --paper-font-button: {
-      @apply(--paper-font-common-base);
-      @apply(--paper-font-common-nowrap);
-
-      font-size: 14px;
-      font-weight: 500;
-      letter-spacing: 0.018em;
-      line-height: 24px;
-      text-transform: uppercase;
-    };
-
-    --paper-font-code2: {
-      @apply(--paper-font-common-code);
-
-      font-size: 14px;
-      font-weight: 700;
-      line-height: 20px;
-    };
-
-    --paper-font-code1: {
-      @apply(--paper-font-common-code);
-
-      font-size: 14px;
-      font-weight: 500;
-      line-height: 20px;
-    };
-
-  }
-
-</style>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-tabs/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/README.md b/systrace/catapult/third_party/polymer/components/paper-tabs/README.md
deleted file mode 100644
index 050979f..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-[![Build status](https://travis-ci.org/PolymerElements/paper-tabs.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-tabs)
-[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://beta.webcomponents.org/element/PolymerElements/paper-tabs)
-
-##&lt;paper-tabs&gt;
-
-Material design: [Tabs](https://www.google.com/design/spec/components/tabs.html)
-
-`paper-tabs` makes it easy to explore and switch between different views or functional aspects of
-an app, or to browse categorized data sets.
-
-<!---
-```
-<custom-element-demo>
-  <template>
-    <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-    <link rel="import" href="paper-tabs.html">
-    <style>
-      body {
-        margin: 0;
-        display: flex;
-        align-items: flex-end;
-        height: 80px;
-        background: #009688;
-        color: white;
-      }
-      paper-tabs {
-        font-family: 'Roboto', 'Noto', sans-serif;
-        -webkit-font-smoothing: antialiased;
-        width: 100%;
-        text-transform: uppercase;
-        margin-bottom: 1px;
-      }
-    </style>
-    <next-code-block></next-code-block>
-  </template>
-</custom-element-demo>
-```
--->
-```html
-<paper-tabs selected="0" scrollable>
-  <paper-tab>The first tab</paper-tab>
-  <paper-tab>Tab two</paper-tab>
-  <paper-tab>The third tab</paper-tab>
-  <paper-tab>Fourth tab</paper-tab>
-</paper-tabs>
-```
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/bower.json b/systrace/catapult/third_party/polymer/components/paper-tabs/bower.json
deleted file mode 100644
index 01ed284..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/bower.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "paper-tabs",
-  "version": "1.8.0",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Material design tabs",
-  "private": true,
-  "main": "paper-tabs.html",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "tabs",
-    "control"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-tabs.git"
-  },
-  "dependencies": {
-    "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-    "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-    "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
-    "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.0",
-    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
-    "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "polymer": "Polymer/polymer#^1.1.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "iron-pages": "PolymerElements/iron-pages#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-toolbar": "PolymerElements/paper-toolbar#^1.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-tabs/demo/index.html
deleted file mode 100644
index 74e20df..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/demo/index.html
+++ /dev/null
@@ -1,338 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>paper-tabs demo</title>
-
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-    <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-    <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-    <link rel="import" href="../../iron-flex-layout/iron-flex-layout.html">
-    <link rel="import" href="../../iron-pages/iron-pages.html">
-    <link rel="import" href="../../paper-toolbar/paper-toolbar.html">
-    <link rel="import" href="../paper-tab.html">
-    <link rel="import" href="../paper-tabs.html">
-
-    <style is="custom-style" include="demo-pages-shared-styles">
-      #container {
-        max-width: 600px;
-      }
-
-      paper-tabs, paper-toolbar {
-        background-color: var(--paper-blue-900);
-        color: #fff;
-      }
-    </style>
-
-  </head>
-  <body unresolved>
-
-    <div id="container" class="vertical-section-container centered">
-
-      <h3>Plain <code>paper-tabs</code>.</h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0">
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>The <code>no-bar</code> attribute disables the selection bar.</h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            paper-tabs[no-bar] paper-tab.iron-selected {
-              color: #ffff8d;
-            }
-          </style>
-
-          <paper-tabs id="plain-tabs" selected="0" no-bar>
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        The <code>no-slide</code> attribute prevents the selection bar from
-        animating when the selection changes.
-      </h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0" no-slide>
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        The <code>noink</code> attribute disables the ink ripple animation seen
-        when the user activates a tab (by clicking, tapping, etc.).
-      </h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0" noink>
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        The <code>scrollable</code> attribute causes the tabs to scroll, rather
-        than compress, when there is not enough space. Arrow buttons appear when
-        any of the tabs are not completely visible.
-      </h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0" scrollable>
-            <paper-tab>NUMBER ONE ITEM</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>THE THIRD ITEM</paper-tab>
-            <paper-tab>THE ITEM FOUR</paper-tab>
-            <paper-tab>FIFTH</paper-tab>
-            <paper-tab>THE SIXTH TAB</paper-tab>
-            <paper-tab>NUMBER SEVEN</paper-tab>
-            <paper-tab>EIGHT</paper-tab>
-            <paper-tab>NUMBER NINE</paper-tab>
-            <paper-tab>THE TENTH</paper-tab>
-            <paper-tab>THE ITEM ELEVEN</paper-tab>
-            <paper-tab>TWELFTH ITEM</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        The <code>fit-container</code> attribute causes scrollable tabs to
-        stretch to fit their container if the tabs don't need to scroll.
-      </h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0" scrollable fit-container>
-            <paper-tab>NUMBER ONE ITEM</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>THE THIRD ITEM</paper-tab>
-          </paper-tabs>
-          <br>
-          <paper-tabs selected="0" scrollable fit-container style="width: 50%;">
-            <paper-tab>NUMBER ONE ITEM</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>THE THIRD ITEM</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Tab layout is affected by the writing direction of the surrounding area.
-      </h3>
-      <demo-snippet>
-        <template>
-          <div dir="rtl">
-            <paper-tabs selected="0">
-              <paper-tab>ITEM ONE</paper-tab>
-              <paper-tab>ITEM TWO</paper-tab>
-              <paper-tab>ITEM THREE</paper-tab>
-            </paper-tabs>
-            &nbsp;
-            <paper-tabs selected="0" scrollable>
-              <paper-tab>NUMBER ONE ITEM</paper-tab>
-              <paper-tab>ITEM TWO</paper-tab>
-              <paper-tab>THE THIRD ITEM</paper-tab>
-              <paper-tab>THE ITEM FOUR</paper-tab>
-              <paper-tab>FIFTH</paper-tab>
-              <paper-tab>THE SIXTH TAB</paper-tab>
-              <paper-tab>NUMBER SEVEN</paper-tab>
-              <paper-tab>EIGHT</paper-tab>
-              <paper-tab>NUMBER NINE</paper-tab>
-              <paper-tab>THE TENTH</paper-tab>
-              <paper-tab>THE ITEM ELEVEN</paper-tab>
-              <paper-tab>TWELFTH ITEM</paper-tab>
-            </paper-tabs>
-          </div>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use the <code>align-bottom</code> attribute when your tabs are
-        positioned below the content they control. The selection bar will be
-        shown at the top of the tabs.
-      </h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0" align-bottom>
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use the <code>link</code> attribute when a <code>paper-tab</code>
-        contains a link. The link will fill the entire tab. <code>paper-tabs</code>
-        implements its own tabindexing and keyboard focus patterns so an anchor
-        placed inside should set <code>tabindex="-1"</code>.
-      </h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            paper-tab[link] a {
-              /* These mixins (from iron-flex-layout) center the link text. */
-              @apply(--layout-horizontal);
-              @apply(--layout-center-center);
-              color: #fff;
-              text-decoration: none;
-            }
-          </style>
-
-          <paper-tabs selected="0">
-            <paper-tab link>
-              <a href="#item1" tabindex="-1">ITEM ONE</a>
-            </paper-tab>
-            <paper-tab link>
-              <a href="#item2" tabindex="-1">ITEM TWO</a>
-            </paper-tab>
-            <paper-tab link>
-              <a href="#item3" tabindex="-1">ITEM THREE</a>
-            </paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Tabs can be used in a <code>paper-toolbar</code>.
-      </h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            paper-toolbar {
-              --paper-toolbar-background: var(--paper-blue-900);
-            }
-
-            .self-end {
-              /* This mixin (from iron-flex-layout) aligns the tabs to the
-                 bottom of the toolbar. */
-              @apply(--layout-self-end);
-            }
-          </style>
-
-          <paper-toolbar class="tall">
-            <paper-tabs selected="0" class="bottom self-end" style="width: 300px;">
-              <paper-tab>ITEM ONE</paper-tab>
-              <paper-tab>ITEM TWO</paper-tab>
-            </paper-tabs>
-          </paper-toolbar>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use <code>autoselect</code> to enable automatic tab selection.
-      </h3>
-      <demo-snippet>
-        <template>
-          <paper-tabs selected="0" autoselect>
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <h3>
-        Use <code>autoselect-delay</code> to adjust the delay between the last
-        keyup event and when the tab is automatically selected (when
-        <code>autoselect</code> is true).
-      </h3>
-      <demo-snippet>
-        <template>
-          <h4>
-            <code>autoselect-delay="0"</code>
-          </h4>
-          <paper-tabs selected="0" no-slide autoselect autoselect-delay="0">
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-
-          <h4>
-            <code>autoselect-delay="1000"</code>
-          </h4>
-          <paper-tabs selected="0" autoselect autoselect-delay="1000">
-            <paper-tab>ITEM ONE</paper-tab>
-            <paper-tab>ITEM TWO</paper-tab>
-            <paper-tab>ITEM THREE</paper-tab>
-          </paper-tabs>
-        </template>
-      </demo-snippet>
-
-      <!--
-      Nested templates are not supported in IE, meaning they can't be used in a
-      demo-snippet. See Polymer/polymer#2495 for more details.
-      -->
-      <!--
-      <h3>J. Bound Selection</h3>
-      <demo-snippet>
-        <template>
-          <template is="dom-bind">
-            <h2>Current Tab: <span>[[selected]]</span></h2>
-            <paper-tabs selected="{{selected}}">
-              <paper-tab>ITEM ONE</paper-tab>
-              <paper-tab>ITEM TWO</paper-tab>
-              <paper-tab>ITEM THREE</paper-tab>
-            </paper-tabs>
-          </template>
-        </template>
-      </demo-snippet>
-
-      <h3>K. Controlling content</h3>
-      <demo-snippet>
-        <template>
-          <style is="custom-style">
-            iron-pages {
-              border: 1px solid #ccc;
-              border-top: none;
-              padding: 8px;
-            }
-          </style>
-
-          <template is="dom-bind">
-            <paper-tabs selected="{{selected}}">
-              <paper-tab>ITEM ONE</paper-tab>
-              <paper-tab>ITEM TWO</paper-tab>
-              <paper-tab>ITEM THREE</paper-tab>
-            </paper-tabs>
-            <iron-pages selected="{{selected}}">
-              <div>CONTENT ONE</div>
-              <div>CONTENT TWO</div>
-              <div>CONTENT THREE</div>
-            </iron-pages>
-          </template>
-        </template>
-      </demo-snippet>
-      -->
-
-    </div>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/hero.svg b/systrace/catapult/third_party/polymer/components/paper-tabs/hero.svg
deleted file mode 100755
index e29eaf4..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/hero.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<path d="M188,78H37V44h151V78z M39,76h147V46H39V76z"/>

-	<polygon points="66,64.8 60.6,56.8 55.3,64.8 49.2,55.6 50.8,54.4 55.3,61.2 60.6,53.2 66,61.2 71.3,53.2 77.4,62.4 75.8,63.6 

-		71.3,56.8 	"/>

-	<rect x="149" y="58" width="26" height="2"/>

-	<rect x="99" y="58" width="26" height="2"/>

-	<rect x="38" y="72" width="50" height="4"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/index.html b/systrace/catapult/third_party/polymer/components/paper-tabs/index.html
deleted file mode 100644
index f618702..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/index.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <title>paper-tabs</title>
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page sources='["paper-tabs.html", "paper-tab.html"]'></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tab.html b/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tab.html
deleted file mode 100644
index b2dd2c0..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tab.html
+++ /dev/null
@@ -1,175 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-behaviors/paper-ripple-behavior.html">
-
-<!--
-`paper-tab` is styled to look like a tab.  It should be used in conjunction with
-`paper-tabs`.
-
-Example:
-
-    <paper-tabs selected="0">
-      <paper-tab>TAB 1</paper-tab>
-      <paper-tab>TAB 2</paper-tab>
-      <paper-tab>TAB 3</paper-tab>
-    </paper-tabs>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-tab-ink` | Ink color | `--paper-yellow-a100`
-`--paper-tab` | Mixin applied to the tab | `{}`
-`--paper-tab-content` | Mixin applied to the tab content | `{}`
-`--paper-tab-content-unselected` | Mixin applied to the tab content when the tab is not selected | `{}`
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
--->
-
-<dom-module id="paper-tab">
-  <template>
-    <style>
-      :host {
-        @apply(--layout-inline);
-        @apply(--layout-center);
-        @apply(--layout-center-justified);
-        @apply(--layout-flex-auto);
-
-        position: relative;
-        padding: 0 12px;
-        overflow: hidden;
-        cursor: pointer;
-        vertical-align: middle;
-
-        @apply(--paper-font-common-base);
-        @apply(--paper-tab);
-      }
-
-      :host(:focus) {
-        outline: none;
-      }
-
-      :host([link]) {
-        padding: 0;
-      }
-
-      .tab-content {
-        height: 100%;
-        transform: translateZ(0);
-          -webkit-transform: translateZ(0);
-        transition: opacity 0.1s cubic-bezier(0.4, 0.0, 1, 1);
-        @apply(--layout-horizontal);
-        @apply(--layout-center-center);
-        @apply(--layout-flex-auto);
-        @apply(--paper-tab-content);
-      }
-
-      :host(:not(.iron-selected)) > .tab-content {
-        opacity: 0.8;
-
-        @apply(--paper-tab-content-unselected);
-      }
-
-      :host(:focus) .tab-content {
-        opacity: 1;
-        font-weight: 700;
-      }
-
-      paper-ripple {
-        color: var(--paper-tab-ink, --paper-yellow-a100);
-      }
-
-      .tab-content > ::content > a {
-        @apply(--layout-flex-auto);
-
-        height: 100%;
-      }
-    </style>
-
-    <div class="tab-content">
-      <content></content>
-    </div>
-  </template>
-</dom-module>
-<script>
-Polymer({
-  is: 'paper-tab',
-
-  behaviors: [
-    Polymer.IronControlState,
-    Polymer.IronButtonState,
-    Polymer.PaperRippleBehavior
-  ],
-
-  properties: {
-
-    /**
-      * If true, the tab will forward keyboard clicks (enter/space) to
-      * the first anchor element found in its descendants
-      */
-    link: {
-      type: Boolean,
-      value: false,
-      reflectToAttribute: true
-    }
-
-  },
-
-  hostAttributes: {
-    role: 'tab'
-  },
-
-  listeners: {
-    down: '_updateNoink',
-    tap: '_onTap'
-  },
-
-  attached: function() {
-    this._updateNoink();
-  },
-
-  get _parentNoink () {
-    var parent = Polymer.dom(this).parentNode;
-    return !!parent && !!parent.noink;
-  },
-
-  _updateNoink: function() {
-    this.noink = !!this.noink || !!this._parentNoink;
-  },
-
-  _onTap: function(event) {
-    if (this.link) {
-      var anchor = this.queryEffectiveChildren('a');
-
-      if (!anchor) {
-        return;
-      }
-
-      // Don't get stuck in a loop delegating
-      // the listener from the child anchor
-      if (event.target === anchor) {
-        return;
-      }
-
-      anchor.click();
-    }
-  }
-
-});
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tabs-icons.html b/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tabs-icons.html
deleted file mode 100644
index c299046..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tabs-icons.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-
-<iron-iconset-svg name="paper-tabs" size="24">
-<svg><defs>
-<g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
-<g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tabs.html b/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tabs.html
deleted file mode 100644
index bc504e1..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/paper-tabs.html
+++ /dev/null
@@ -1,661 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-menu-behavior/iron-menubar-behavior.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="../paper-icon-button/paper-icon-button.html">
-<link rel="import" href="../paper-styles/color.html">
-<link rel="import" href="paper-tabs-icons.html">
-<link rel="import" href="paper-tab.html">
-
-<!--
-Material design: [Tabs](https://www.google.com/design/spec/components/tabs.html)
-
-`paper-tabs` makes it easy to explore and switch between different views or functional aspects of
-an app, or to browse categorized data sets.
-
-Use `selected` property to get or set the selected tab.
-
-Example:
-
-    <paper-tabs selected="0">
-      <paper-tab>TAB 1</paper-tab>
-      <paper-tab>TAB 2</paper-tab>
-      <paper-tab>TAB 3</paper-tab>
-    </paper-tabs>
-
-See <a href="?active=paper-tab">paper-tab</a> for more information about
-`paper-tab`.
-
-A common usage for `paper-tabs` is to use it along with `iron-pages` to switch
-between different views.
-
-    <paper-tabs selected="{{selected}}">
-      <paper-tab>Tab 1</paper-tab>
-      <paper-tab>Tab 2</paper-tab>
-      <paper-tab>Tab 3</paper-tab>
-    </paper-tabs>
-
-    <iron-pages selected="{{selected}}">
-      <div>Page 1</div>
-      <div>Page 2</div>
-      <div>Page 3</div>
-    </iron-pages>
-
-
-To use links in tabs, add `link` attribute to `paper-tab` and put an `<a>`
-element in `paper-tab` with a `tabindex` of -1.
-
-Example:
-
-<pre><code>
-&lt;style is="custom-style">
-  .link {
-    &#64;apply(--layout-horizontal);
-    &#64;apply(--layout-center-center);
-  }
-&lt;/style>
-
-&lt;paper-tabs selected="0">
-  &lt;paper-tab link>
-    &lt;a href="#link1" class="link" tabindex="-1">TAB ONE&lt;/a>
-  &lt;/paper-tab>
-  &lt;paper-tab link>
-    &lt;a href="#link2" class="link" tabindex="-1">TAB TWO&lt;/a>
-  &lt;/paper-tab>
-  &lt;paper-tab link>
-    &lt;a href="#link3" class="link" tabindex="-1">TAB THREE&lt;/a>
-  &lt;/paper-tab>
-&lt;/paper-tabs>
-</code></pre>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-tabs-selection-bar-color` | Color for the selection bar | `--paper-yellow-a100`
-`--paper-tabs-selection-bar` | Mixin applied to the selection bar | `{}`
-`--paper-tabs` | Mixin applied to the tabs | `{}`
-`--paper-tabs-content` | Mixin applied to the content container of tabs | `{}`
-`--paper-tabs-container` | Mixin applied to the layout container of tabs | `{}`
-
-@hero hero.svg
-@demo demo/index.html
--->
-
-<dom-module id="paper-tabs">
-  <template>
-    <style>
-      :host {
-        @apply(--layout);
-        @apply(--layout-center);
-
-        height: 48px;
-        font-size: 14px;
-        font-weight: 500;
-        overflow: hidden;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        -webkit-user-select: none;
-        user-select: none;
-
-        /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
-        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-        -webkit-tap-highlight-color: transparent;
-
-        @apply(--paper-tabs);
-      }
-
-      :host-context([dir=rtl]) {
-        @apply(--layout-horizontal-reverse);
-      }
-
-      #tabsContainer {
-        position: relative;
-        height: 100%;
-        white-space: nowrap;
-        overflow: hidden;
-        @apply(--layout-flex-auto);
-        @apply(--paper-tabs-container);
-      }
-
-      #tabsContent {
-        height: 100%;
-        -moz-flex-basis: auto;
-        -ms-flex-basis: auto;
-        flex-basis: auto;
-        @apply(--paper-tabs-content);
-      }
-
-      #tabsContent.scrollable {
-        position: absolute;
-        white-space: nowrap;
-      }
-
-      #tabsContent:not(.scrollable),
-      #tabsContent.scrollable.fit-container {
-        @apply(--layout-horizontal);
-      }
-
-      #tabsContent.scrollable.fit-container {
-        min-width: 100%;
-      }
-
-      #tabsContent.scrollable.fit-container > ::content > * {
-        /* IE - prevent tabs from compressing when they should scroll. */
-        -ms-flex: 1 0 auto;
-        -webkit-flex: 1 0 auto;
-        flex: 1 0 auto;
-      }
-
-      .hidden {
-        display: none;
-      }
-
-      .not-visible {
-        opacity: 0;
-        cursor: default;
-      }
-
-      paper-icon-button {
-        width: 48px;
-        height: 48px;
-        padding: 12px;
-        margin: 0 4px;
-      }
-
-      #selectionBar {
-        position: absolute;
-        height: 0;
-        bottom: 0;
-        left: 0;
-        right: 0;
-        border-bottom: 2px solid var(--paper-tabs-selection-bar-color, --paper-yellow-a100);
-          -webkit-transform: scale(0);
-        transform: scale(0);
-          -webkit-transform-origin: left center;
-        transform-origin: left center;
-          transition: -webkit-transform;
-        transition: transform;
-
-        @apply(--paper-tabs-selection-bar);
-      }
-
-      #selectionBar.align-bottom {
-        top: 0;
-        bottom: auto;
-      }
-
-      #selectionBar.expand {
-        transition-duration: 0.15s;
-        transition-timing-function: cubic-bezier(0.4, 0.0, 1, 1);
-      }
-
-      #selectionBar.contract {
-        transition-duration: 0.18s;
-        transition-timing-function: cubic-bezier(0.0, 0.0, 0.2, 1);
-      }
-
-      #tabsContent > ::content > *:not(#selectionBar) {
-        height: 100%;
-      }
-    </style>
-
-    <paper-icon-button icon="paper-tabs:chevron-left" class$="[[_computeScrollButtonClass(_leftHidden, scrollable, hideScrollButtons)]]" on-up="_onScrollButtonUp" on-down="_onLeftScrollButtonDown" tabindex="-1"></paper-icon-button>
-
-    <div id="tabsContainer" on-track="_scroll" on-down="_down">
-      <div id="tabsContent" class$="[[_computeTabsContentClass(scrollable, fitContainer)]]">
-        <div id="selectionBar" class$="[[_computeSelectionBarClass(noBar, alignBottom)]]"
-            on-transitionend="_onBarTransitionEnd"></div>
-        <content select="*"></content>
-      </div>
-    </div>
-
-    <paper-icon-button icon="paper-tabs:chevron-right" class$="[[_computeScrollButtonClass(_rightHidden, scrollable, hideScrollButtons)]]" on-up="_onScrollButtonUp" on-down="_onRightScrollButtonDown" tabindex="-1"></paper-icon-button>
-
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-tabs',
-
-      behaviors: [
-        Polymer.IronResizableBehavior,
-        Polymer.IronMenubarBehavior
-      ],
-
-      properties: {
-        /**
-         * If true, ink ripple effect is disabled. When this property is changed,
-         * all descendant `<paper-tab>` elements have their `noink` property
-         * changed to the new value as well.
-         */
-        noink: {
-          type: Boolean,
-          value: false,
-          observer: '_noinkChanged'
-        },
-
-        /**
-         * If true, the bottom bar to indicate the selected tab will not be shown.
-         */
-        noBar: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, the slide effect for the bottom bar is disabled.
-         */
-        noSlide: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, tabs are scrollable and the tab width is based on the label width.
-         */
-        scrollable: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, tabs expand to fit their container. This currently only applies when
-         * scrollable is true.
-         */
-        fitContainer: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, dragging on the tabs to scroll is disabled.
-         */
-        disableDrag: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, scroll buttons (left/right arrow) will be hidden for scrollable tabs.
-         */
-        hideScrollButtons: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, the tabs are aligned to bottom (the selection bar appears at the top).
-         */
-        alignBottom: {
-          type: Boolean,
-          value: false
-        },
-
-        selectable: {
-          type: String,
-          value: 'paper-tab'
-        },
-
-        /**
-         * If true, tabs are automatically selected when focused using the
-         * keyboard.
-         */
-        autoselect: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * The delay (in milliseconds) between when the user stops interacting
-         * with the tabs through the keyboard and when the focused item is
-         * automatically selected (if `autoselect` is true).
-         */
-        autoselectDelay: {
-          type: Number,
-          value: 0
-        },
-
-        _step: {
-          type: Number,
-          value: 10
-        },
-
-        _holdDelay: {
-          type: Number,
-          value: 1
-        },
-
-        _leftHidden: {
-          type: Boolean,
-          value: false
-        },
-
-        _rightHidden: {
-          type: Boolean,
-          value: false
-        },
-
-        _previousTab: {
-          type: Object
-        }
-      },
-
-      hostAttributes: {
-        role: 'tablist'
-      },
-
-      listeners: {
-        'iron-resize': '_onTabSizingChanged',
-        'iron-items-changed': '_onTabSizingChanged',
-        'iron-select': '_onIronSelect',
-        'iron-deselect': '_onIronDeselect'
-      },
-
-      keyBindings: {
-        'left:keyup right:keyup': '_onArrowKeyup'
-      },
-
-      created: function() {
-        this._holdJob = null;
-        this._pendingActivationItem = undefined;
-        this._pendingActivationTimeout = undefined;
-        this._bindDelayedActivationHandler = this._delayedActivationHandler.bind(this);
-        this.addEventListener('blur', this._onBlurCapture.bind(this), true);
-      },
-
-      ready: function() {
-        this.setScrollDirection('y', this.$.tabsContainer);
-      },
-
-      detached: function() {
-        this._cancelPendingActivation();
-      },
-
-      _noinkChanged: function(noink) {
-        var childTabs = Polymer.dom(this).querySelectorAll('paper-tab');
-        childTabs.forEach(noink ? this._setNoinkAttribute : this._removeNoinkAttribute);
-      },
-
-      _setNoinkAttribute: function(element) {
-        element.setAttribute('noink', '');
-      },
-
-      _removeNoinkAttribute: function(element) {
-        element.removeAttribute('noink');
-      },
-
-      _computeScrollButtonClass: function(hideThisButton, scrollable, hideScrollButtons) {
-        if (!scrollable || hideScrollButtons) {
-          return 'hidden';
-        }
-
-        if (hideThisButton) {
-          return 'not-visible';
-        }
-
-        return '';
-      },
-
-      _computeTabsContentClass: function(scrollable, fitContainer) {
-        return scrollable ? 'scrollable' + (fitContainer ? ' fit-container' : '') : ' fit-container';
-      },
-
-      _computeSelectionBarClass: function(noBar, alignBottom) {
-        if (noBar) {
-          return 'hidden';
-        } else if (alignBottom) {
-          return 'align-bottom';
-        }
-
-        return '';
-      },
-
-      // TODO(cdata): Add `track` response back in when gesture lands.
-
-      _onTabSizingChanged: function() {
-        this.debounce('_onTabSizingChanged', function() {
-          this._scroll();
-          this._tabChanged(this.selectedItem);
-        }, 10);
-      },
-
-      _onIronSelect: function(event) {
-        this._tabChanged(event.detail.item, this._previousTab);
-        this._previousTab = event.detail.item;
-        this.cancelDebouncer('tab-changed');
-      },
-
-      _onIronDeselect: function(event) {
-        this.debounce('tab-changed', function() {
-          this._tabChanged(null, this._previousTab);
-          this._previousTab = null;
-        // See polymer/polymer#1305
-        }, 1);
-      },
-
-      _activateHandler: function() {
-        // Cancel item activations scheduled by keyboard events when any other
-        // action causes an item to be activated (e.g. clicks).
-        this._cancelPendingActivation();
-
-        Polymer.IronMenuBehaviorImpl._activateHandler.apply(this, arguments);
-      },
-
-      /**
-       * Activates an item after a delay (in milliseconds).
-       */
-      _scheduleActivation: function(item, delay) {
-        this._pendingActivationItem = item;
-        this._pendingActivationTimeout = this.async(
-            this._bindDelayedActivationHandler, delay);
-      },
-
-      /**
-       * Activates the last item given to `_scheduleActivation`.
-       */
-      _delayedActivationHandler: function() {
-        var item = this._pendingActivationItem;
-        this._pendingActivationItem = undefined;
-        this._pendingActivationTimeout = undefined;
-        item.fire(this.activateEvent, null, {
-          bubbles: true,
-          cancelable: true
-        });
-      },
-
-      /**
-       * Cancels a previously scheduled item activation made with
-       * `_scheduleActivation`.
-       */
-      _cancelPendingActivation: function() {
-        if (this._pendingActivationTimeout !== undefined) {
-          this.cancelAsync(this._pendingActivationTimeout);
-          this._pendingActivationItem = undefined;
-          this._pendingActivationTimeout = undefined;
-        }
-      },
-
-      _onArrowKeyup: function(event) {
-        if (this.autoselect) {
-          this._scheduleActivation(this.focusedItem, this.autoselectDelay);
-        }
-      },
-
-      _onBlurCapture: function(event) {
-        // Cancel a scheduled item activation (if any) when that item is
-        // blurred.
-        if (event.target === this._pendingActivationItem) {
-          this._cancelPendingActivation();
-        }
-      },
-
-      get _tabContainerScrollSize () {
-        return Math.max(
-          0,
-          this.$.tabsContainer.scrollWidth -
-            this.$.tabsContainer.offsetWidth
-        );
-      },
-
-      _scroll: function(e, detail) {
-        if (!this.scrollable) {
-          return;
-        }
-
-        var ddx = (detail && -detail.ddx) || 0;
-        this._affectScroll(ddx);
-      },
-
-      _down: function(e) {
-        // go one beat async to defeat IronMenuBehavior
-        // autorefocus-on-no-selection timeout
-        this.async(function() {
-          if (this._defaultFocusAsync) {
-            this.cancelAsync(this._defaultFocusAsync);
-            this._defaultFocusAsync = null;
-          }
-        }, 1);
-      },
-
-      _affectScroll: function(dx) {
-        this.$.tabsContainer.scrollLeft += dx;
-
-        var scrollLeft = this.$.tabsContainer.scrollLeft;
-
-        this._leftHidden = scrollLeft === 0;
-        this._rightHidden = scrollLeft === this._tabContainerScrollSize;
-      },
-
-      _onLeftScrollButtonDown: function() {
-        this._scrollToLeft();
-        this._holdJob = setInterval(this._scrollToLeft.bind(this), this._holdDelay);
-      },
-
-      _onRightScrollButtonDown: function() {
-        this._scrollToRight();
-        this._holdJob = setInterval(this._scrollToRight.bind(this), this._holdDelay);
-      },
-
-      _onScrollButtonUp: function() {
-        clearInterval(this._holdJob);
-        this._holdJob = null;
-      },
-
-      _scrollToLeft: function() {
-        this._affectScroll(-this._step);
-      },
-
-      _scrollToRight: function() {
-        this._affectScroll(this._step);
-      },
-
-      _tabChanged: function(tab, old) {
-        if (!tab) {
-          // Remove the bar without animation.
-          this.$.selectionBar.classList.remove('expand');
-          this.$.selectionBar.classList.remove('contract');
-          this._positionBar(0, 0);
-          return;
-        }
-
-        var r = this.$.tabsContent.getBoundingClientRect();
-        var w = r.width;
-        var tabRect = tab.getBoundingClientRect();
-        var tabOffsetLeft = tabRect.left - r.left;
-
-        this._pos = {
-          width: this._calcPercent(tabRect.width, w),
-          left: this._calcPercent(tabOffsetLeft, w)
-        };
-
-        if (this.noSlide || old == null) {
-          // Position the bar without animation.
-          this.$.selectionBar.classList.remove('expand');
-          this.$.selectionBar.classList.remove('contract');
-          this._positionBar(this._pos.width, this._pos.left);
-          return;
-        }
-
-        var oldRect = old.getBoundingClientRect();
-        var oldIndex = this.items.indexOf(old);
-        var index = this.items.indexOf(tab);
-        var m = 5;
-
-        // bar animation: expand
-        this.$.selectionBar.classList.add('expand');
-
-        var moveRight = oldIndex < index;
-        var isRTL = this._isRTL;
-        if (isRTL) {
-          moveRight = !moveRight;
-        }
-
-        if (moveRight) {
-          this._positionBar(this._calcPercent(tabRect.left + tabRect.width - oldRect.left, w) - m,
-              this._left);
-        } else {
-          this._positionBar(this._calcPercent(oldRect.left + oldRect.width - tabRect.left, w) - m,
-              this._calcPercent(tabOffsetLeft, w) + m);
-        }
-
-        if (this.scrollable) {
-          this._scrollToSelectedIfNeeded(tabRect.width, tabOffsetLeft);
-        }
-      },
-
-      _scrollToSelectedIfNeeded: function(tabWidth, tabOffsetLeft) {
-        var l = tabOffsetLeft - this.$.tabsContainer.scrollLeft;
-        if (l < 0) {
-          this.$.tabsContainer.scrollLeft += l;
-        } else {
-          l += (tabWidth - this.$.tabsContainer.offsetWidth);
-          if (l > 0) {
-            this.$.tabsContainer.scrollLeft += l;
-          }
-        }
-      },
-
-      _calcPercent: function(w, w0) {
-        return 100 * w / w0;
-      },
-
-      _positionBar: function(width, left) {
-        width = width || 0;
-        left = left || 0;
-
-        this._width = width;
-        this._left = left;
-        this.transform(
-            'translateX(' + left + '%) scaleX(' + (width / 100) + ')',
-            this.$.selectionBar);
-      },
-
-      _onBarTransitionEnd: function(e) {
-        var cl = this.$.selectionBar.classList;
-        // bar animation: expand -> contract
-        if (cl.contains('expand')) {
-          cl.remove('expand');
-          cl.add('contract');
-          this._positionBar(this._pos.width, this._pos.left);
-        // bar animation done
-        } else if (cl.contains('contract')) {
-          cl.remove('contract');
-        }
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/test/attr-for-selected.html b/systrace/catapult/third_party/polymer/components/paper-tabs/test/attr-for-selected.html
deleted file mode 100644
index cc1198e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/test/attr-for-selected.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>paper-tabs-attr-for-selected</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-
-    <link rel="import" href="../paper-tabs.html">
-    
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <paper-tabs attr-for-selected="name" selected="bar">
-          <paper-tab name="foo">ITEM FOO</paper-tab>
-          <paper-tab name="bar">ITEM BAR</paper-tab>
-          <paper-tab name="zot">ITEM ZOT</paper-tab>
-        </paper-tabs>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('set the selected attribute', function() {
-
-        var tabs;
-
-        setup(function () {
-          tabs = fixture('basic');
-        });
-
-        test('selected value', function() {
-          assert.equal(tabs.selected, 'bar');
-        });
-
-        test('selected tab has iron-selected class', function() {
-          Polymer.dom.flush();
-          assert.isTrue(tabs.querySelector('[name=bar]').classList.contains('iron-selected'));
-        });
-
-      });
-
-      suite('select tab via click', function() {
-
-        var tabs, tab;
-
-        setup(function () {
-          tabs = fixture('basic');
-          tab = tabs.querySelector('[name=zot]');
-          tab.dispatchEvent(new CustomEvent('click', {bubbles: true}));
-        });
-
-        test('selected value', function() {
-          assert.equal(tabs.selected, 'zot');
-        });
-
-        test('selected tab has iron-selected class', function() {
-          Polymer.dom.flush();
-          assert.isTrue(tab.classList.contains('iron-selected'));
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-tabs/test/basic.html
deleted file mode 100644
index dd74854..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/test/basic.html
+++ /dev/null
@@ -1,394 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>paper-tabs-basic</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-
-    <link rel="import" href="../paper-tabs.html">
-    <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-    
-  </head>
-  <body>
-
-    <test-fixture id="basic">
-      <template>
-        <paper-tabs>
-          <paper-tab>ITEM ONE</paper-tab>
-          <paper-tab>ITEM TWO</paper-tab>
-          <paper-tab>ITEM THREE</paper-tab>
-        </paper-tabs>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="HiddenTabs">
-      <template>
-        <paper-tabs hidden>
-          <paper-tab>ITEM ONE</paper-tab>
-          <paper-tab>ITEM TWO</paper-tab>
-        </paper-tabs>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      function ensureDocumentHasFocus() {
-        window.top && window.top.focus();
-      }
-
-      function checkSelectionBar(tabs, tab) {
-        var tabRect = tab.getBoundingClientRect();
-        var rect = Polymer.dom(tabs.root).querySelector('#selectionBar').getBoundingClientRect();
-        assert.equal(Math.round(tabRect.left), Math.round(rect.left));
-      }
-
-      suite('defaults', function() {
-
-        var tabs;
-
-        setup(function () {
-          tabs = fixture('basic');
-        });
-
-        test('to nothing selected', function() {
-          assert.equal(tabs.selected, undefined);
-        });
-
-        test('no tabs have iron-selected class', function() {
-          Array.prototype.forEach.call(tabs.querySelectorAll('paper-tab'), function(tab) {
-            assert.isFalse(tab.classList.contains('iron-selected'));
-          });
-        });
-
-        test('to false as noink', function() {
-          assert.equal(tabs.noink, false);
-        });
-
-        test('to false as noBar', function() {
-          assert.equal(tabs.noBar, false);
-        });
-
-        test('to false as noSlide', function() {
-          assert.equal(tabs.noSlide, false);
-        });
-
-        test('to false as scrollable', function() {
-          assert.equal(tabs.scrollable, false);
-        });
-
-        test('to false as disableDrag', function() {
-          assert.equal(tabs.disableDrag, false);
-        });
-
-        test('to false as hideScrollButtons', function() {
-          assert.equal(tabs.hideScrollButtons, false);
-        });
-
-        test('to false as alignBottom', function() {
-          assert.equal(tabs.alignBottom, false);
-        });
-      });
-
-      suite('hidden tabs', function() {
-        var tabs;
-
-        setup(function() {
-          tabs = fixture('HiddenTabs');
-        });
-
-        test('choose the correct bar position once made visible', function() {
-          tabs.removeAttribute('hidden');
-          tabs.selected = 0;
-          expect(tabs._width).to.be.greaterThan(0);
-          expect(tabs._left).to.be.equal(0);
-        });
-      });
-
-      suite('set the selected attribute', function() {
-
-        var tabs, index = 0;
-
-        setup(function () {
-          tabs = fixture('basic');
-          tabs.selected = index;
-        });
-
-        test('selected value', function() {
-          assert.equal(tabs.selected, index);
-        });
-
-        test('selected tab has iron-selected class', function() {
-          var tab = tabs.querySelectorAll('paper-tab')[index];
-          assert.isTrue(tab.classList.contains('iron-selected'));
-        });
-
-        test('selected tab has selection bar position at the bottom of the tab', function(done) {
-          setTimeout(function() {
-            checkSelectionBar(tabs, tabs.querySelectorAll('paper-tab')[index]);
-            done();
-          }, 1000);
-        });
-
-      });
-
-      suite('select tab via click', function() {
-
-        var tabs, index = 1;
-        var tab;
-
-        setup(function () {
-          tabs = fixture('basic');
-          tab = tabs.querySelectorAll('paper-tab')[index];
-          tab.dispatchEvent(new CustomEvent('click', {bubbles: true}));
-        });
-
-        test('selected value', function() {
-          assert.equal(tabs.selected, index);
-        });
-
-        test('selected tab has iron-selected class', function() {
-          var tab = tabs.querySelectorAll('paper-tab')[index];
-          assert.isTrue(tab.classList.contains('iron-selected'));
-        });
-
-        test('selected tab has selection bar position at the bottom of the tab', function(done) {
-          setTimeout(function() {
-            checkSelectionBar(tabs, tabs.querySelectorAll('paper-tab')[index]);
-            done();
-          }, 1000);
-        });
-
-        test('pressing enter on tab causes a click', function(done) {
-          var clickCount = 0;
-          tab.addEventListener('click', function onTabClick() {
-            clickCount++;
-            tab.removeEventListener('click', onTabClick);
-
-            expect(clickCount).to.be.equal(1);
-            done();
-          });
-
-          MockInteractions.pressEnter(tab);
-        });
-      });
-
-      suite('noink attribute', function() {
-        var tabs;
-
-        setup(function () {
-          tabs = fixture('basic');
-        });
-
-        test('noink attribute propagates to all descendant tabs', function() {
-          tabs.noink = true;
-          Array.prototype.slice.apply(tabs.querySelectorAll('paper-tab')).forEach(function(tab) {
-            assert.isTrue(tab.noink);
-          });
-
-          tabs.noink = false;
-          Array.prototype.slice.apply(tabs.querySelectorAll('paper-tab')).forEach(function(tab) {
-            assert.isFalse(tab.noink);
-          });
-        });
-      });
-
-      suite('accessibility', function() {
-        var LEFT = 37;
-        var RIGHT = 39;
-        var tabs;
-
-        setup(function () {
-          tabs = fixture('basic');
-          Polymer.dom.flush();
-        });
-
-        test('paper-tabs has role tablist', function() {
-          assert.equal(tabs.getAttribute('role'), 'tablist');
-        });
-
-        test('paper-tab has role tab', function() {
-          tabs.items.forEach(function(tab) {
-            assert.equal(tab.getAttribute('role'), 'tab');
-          });
-        });
-
-        test('without autoselect, tabs are not automatically selected',
-          function(done) {
-            ensureDocumentHasFocus();
-            Polymer.Base.async(function() {
-              tabs.select(0);
-              MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, RIGHT);
-              Polymer.Base.async(function() {
-                assert.equal(tabs.selected, 0);
-
-                MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, LEFT);
-                Polymer.Base.async(function() {
-                  assert.equal(tabs.selected, 0);
-
-                  MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, LEFT);
-                  Polymer.Base.async(function() {
-                    assert.equal(tabs.selected, 0);
-                    done();
-                  }, 100);
-                }, 100);
-              }, 100);
-            });
-          });
-
-        test('with autoselect, tabs are selected when moved to using arrow ' +
-          'keys', function(done) {
-            ensureDocumentHasFocus();
-            Polymer.Base.async(function() {
-              tabs.autoselect = true;
-              tabs.select(0);
-              MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, RIGHT);
-              Polymer.Base.async(function() {
-                assert.equal(tabs.selected, 1);
-
-                MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, RIGHT);
-                Polymer.Base.async(function() {
-                  assert.equal(tabs.selected, 2);
-
-                  MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, LEFT);
-                  Polymer.Base.async(function() {
-                    assert.equal(tabs.selected, 1);
-                    done();
-                  }, 100);
-                }, 100);
-              }, 100);
-            });
-          });
-
-        test('with autoselect, tabs are selected when moved to using arrow ' +
-          'keys (RTL)',function(done) {
-            ensureDocumentHasFocus();
-            Polymer.Base.async(function() {
-              tabs.setAttribute('dir', 'rtl');
-
-              tabs.autoselect = true;
-              tabs.select(0);
-              MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, LEFT);
-              Polymer.Base.async(function() {
-                assert.equal(tabs.selected, 1);
-
-                MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, LEFT);
-                Polymer.Base.async(function() {
-                  assert.equal(tabs.selected, 2);
-
-                  MockInteractions.pressAndReleaseKeyOn(tabs.selectedItem, RIGHT);
-                  Polymer.Base.async(function() {
-                    assert.equal(tabs.selected, 1);
-                    done();
-                  }, 100);
-                }, 100);
-              }, 100);
-            });
-          });
-
-        test('with autoselect-delay zero, tabs are selected with ' +
-          'microtask timing after the keyup', function(done) {
-            ensureDocumentHasFocus();
-            Polymer.Base.async(function() {
-              tabs.autoselect = true;
-              tabs.autoselectDelay = 0;
-              tabs.select(0);
-
-              MockInteractions.keyDownOn(tabs.selectedItem, RIGHT);
-              Polymer.Base.async(function() {
-                assert.equal(tabs.selected, 0);
-                assert.equal(tabs.items.indexOf(tabs.focusedItem), 1);
-
-                // No keyup between keydown events: the key is being held.
-                MockInteractions.keyDownOn(tabs.selectedItem, RIGHT);
-                Polymer.Base.async(function() {
-                  assert.equal(tabs.selected, 0);
-                  assert.equal(tabs.items.indexOf(tabs.focusedItem), 2);
-
-                  MockInteractions.keyUpOn(tabs.selectedItem, RIGHT);
-                  assert.equal(tabs.selected, 0);
-                  Polymer.Base.async(function() {
-                    assert.equal(tabs.selected, 2);
-                    assert.equal(tabs.items.indexOf(tabs.focusedItem), 2);
-
-                    MockInteractions.keyDownOn(tabs.selectedItem, LEFT);
-                    Polymer.Base.async(function() {
-                      assert.equal(tabs.selected, 2);
-                      assert.equal(tabs.items.indexOf(tabs.focusedItem), 1);
-
-                      MockInteractions.keyUpOn(tabs.selectedItem, LEFT);
-                      assert.equal(tabs.selected, 2);
-                      Polymer.Base.async(function() {
-                        assert.equal(tabs.selected, 1);
-                        done();
-                      });
-                    });
-                  });
-                });
-              });
-            });
-          });
-
-        test('with autoselect-delay positive, tabs are selected with ' +
-          'microtask timing after the keyup and delay', function(done) {
-            ensureDocumentHasFocus();
-            Polymer.Base.async(function() {
-              var DELAY = 100;
-
-              tabs.autoselect = true;
-              tabs.autoselectDelay = DELAY;
-              tabs.select(0);
-
-              MockInteractions.keyDownOn(tabs.selectedItem, RIGHT);
-              Polymer.Base.async(function() {
-                assert.equal(tabs.selected, 0);
-                assert.equal(tabs.items.indexOf(tabs.focusedItem), 1);
-
-                // No keyup between keydown events: the key is being held.
-                MockInteractions.keyDownOn(tabs.selectedItem, RIGHT);
-                Polymer.Base.async(function() {
-                  assert.equal(tabs.selected, 0);
-                  assert.equal(tabs.items.indexOf(tabs.focusedItem), 2);
-
-                  MockInteractions.keyUpOn(tabs.selectedItem, RIGHT);
-                  assert.equal(tabs.selected, 0);
-                  Polymer.Base.async(function() {
-                    assert.equal(tabs.selected, 2);
-                    assert.equal(tabs.items.indexOf(tabs.focusedItem), 2);
-
-                    MockInteractions.keyDownOn(tabs.selectedItem, LEFT);
-                    Polymer.Base.async(function() {
-                      assert.equal(tabs.selected, 2);
-                      assert.equal(tabs.items.indexOf(tabs.focusedItem), 1);
-
-                      MockInteractions.keyUpOn(tabs.selectedItem, LEFT);
-                      assert.equal(tabs.selected, 2);
-                      Polymer.Base.async(function() {
-                        assert.equal(tabs.selected, 1);
-                        done();
-                      }, DELAY + 100);
-                    });
-                  }, DELAY + 100);
-                });
-              });
-            });
-          });
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/test/index.html b/systrace/catapult/third_party/polymer/components/paper-tabs/test/index.html
deleted file mode 100644
index 9b58696..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-
-    <meta charset="utf-8">
-    <title>Tests</title>
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-      WCT.loadSuites([
-        'basic.html',
-        'attr-for-selected.html',
-        'links.html',
-        'basic.html?dom=shadow',
-        'attr-for-selected.html?dom=shadow',
-        'links.html?dom=shadow'
-      ]);
-    </script>
-
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tabs/test/links.html b/systrace/catapult/third_party/polymer/components/paper-tabs/test/links.html
deleted file mode 100644
index 5d43e0c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tabs/test/links.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <title>paper-tabs-links</title>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-    <script src="../../web-component-tester/browser.js"></script>
-
-    <link rel="import" href="../paper-tabs.html">
-    <link rel="import" href="../../iron-test-helpers/iron-test-helpers.html">
-
-  </head>
-  <body>
-
-    <test-fixture id="links">
-      <template>
-        <paper-tabs>
-          <paper-tab link><a href="#one" tabindex="-1">ONE</a></paper-tab>
-          <paper-tab link><a href="#two" tabindex="-1">TWO</a></paper-tab>
-          <paper-tab link><a href="#three" tabindex="-1">THREE</a></paper-tab>
-        </paper-tabs>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="not-links">
-      <template>
-        <paper-tabs>
-          <paper-tab><a href="#one" tabindex="-1">ONE</a></paper-tab>
-          <paper-tab><a href="#two" tabindex="-1">TWO</a></paper-tab>
-          <paper-tab><a href="#three" tabindex="-1">THREE</a></paper-tab>
-        </paper-tabs>
-      </template>
-    </test-fixture>
-
-    <test-fixture id="not-first-child">
-      <template>
-        <paper-tabs>
-          <paper-tab>
-            <div>
-              <a href="#one" tabindex="-1">ONE</a>
-            </div>
-          </paper-tab>
-          <paper-tab>
-            <div>
-              <a href="#two" tabindex="-1">TWO</a>
-            </div>
-          </paper-tab>
-          <paper-tab>
-            <div>
-              <a href="#three" tabindex="-1">THREE</a>
-            </div>
-          </paper-tab>
-        </paper-tabs>
-      </template>
-    </test-fixture>
-
-    <script>
-
-      suite('links', function() {
-
-        suite('has link attribute', function() {
-
-          var tabs;
-          var tab, anchor;
-
-          setup(function () {
-            tabs = fixture('links');
-            tab = tabs.querySelectorAll('paper-tab')[1];
-            anchor = tab.querySelector('a');
-          });
-
-          test('pressing enter on tab causes anchor click', function(done) {
-            tab.addEventListener('click', function onTabClick(event) {
-              tab.removeEventListener('click', onTabClick);
-
-              expect(event.target).to.be.equal(anchor);
-              done();
-            });
-
-            MockInteractions.pressEnter(tab);
-          });
-
-          test('pressing space on tab causes anchor click', function(done) {
-            tab.addEventListener('click', function onTabClick(event) {
-              tab.removeEventListener('click', onTabClick);
-
-              expect(event.target).to.be.equal(anchor);
-              done();
-            });
-
-            MockInteractions.pressSpace(tab);
-          });
-
-        });
-
-        suite('does not have link attribute', function() {
-
-          var tabs;
-          var tab, anchor;
-
-          setup(function () {
-            tabs = fixture('not-links');
-            tab = tabs.querySelectorAll('paper-tab')[1];
-            anchor = tab.querySelector('a');
-          });
-
-          test('pressing enter on tab does not cause anchor click', function(done) {
-            tab.addEventListener('click', function onTabClick(event) {
-              tab.removeEventListener('click', onTabClick);
-
-              expect(event.target).to.not.equal(anchor);
-              expect(event.target).to.be.equal(tab);
-              done();
-            });
-
-            MockInteractions.pressEnter(tab);
-          });
-
-        });
-
-        suite('not first child', function() {
-
-          var tabs;
-          var tab, anchor;
-
-          setup(function () {
-            tabs = fixture('links');
-            tab = tabs.querySelectorAll('paper-tab')[1];
-            anchor = tab.querySelector('a');
-          });
-
-          test('pressing enter on tab causes anchor click', function(done) {
-            tab.addEventListener('click', function onTabClick(event) {
-              tab.removeEventListener('click', onTabClick);
-
-              expect(event.target).to.be.equal(anchor);
-              done();
-            });
-
-            MockInteractions.pressEnter(tab);
-          });
-
-        });
-
-      });
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-toast/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/README.md b/systrace/catapult/third_party/polymer/components/paper-toast/README.md
deleted file mode 100644
index 3c9287d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-toast.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-toast.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-toast)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-toast)_
-
-
-##&lt;paper-toast&gt;
-
-Material design: [Snackbars & toasts](https://www.google.com/design/spec/components/snackbars-toasts.html)
-
-`paper-toast` provides a subtle notification toast. Only one `paper-toast` will
-be visible on screen.
-
-Use `opened` to show the toast:
-
-Example:
-
-```html
-<paper-toast text="Hello world!" opened></paper-toast>
-```
-
-Also `open()` or `show()` can be used to show the toast:
-
-Example:
-
-```html
-<paper-button on-click="openToast">Open Toast</paper-button>
-<paper-toast id="toast" text="Hello world!"></paper-toast>
-
-...
-
-openToast: function() {
-  this.$.toast.open();
-}
-```
-
-Set `duration` to 0, a negative number or Infinity to persist the toast on screen:
-
-Example:
-
-```html
-<paper-toast text="Terms and conditions" opened duration="0">
-  <a href="#">Show more</a>
-</paper-toast>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-toast-background-color` | The paper-toast background-color | `#323232` |
-| `--paper-toast-color` | The paper-toast color | `#f1f1f1` |
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/bower.json b/systrace/catapult/third_party/polymer/components/paper-toast/bower.json
deleted file mode 100644
index 2a2b34b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "paper-toast",
-  "version": "1.3.1",
-  "description": "A material design notification toast",
-  "private": true,
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "toast",
-    "notification"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-toast.git"
-  },
-  "main": "paper-toast.html",
-  "dependencies": {
-    "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#^1.0.0",
-    "iron-overlay-behavior": "PolymerElements/iron-overlay-behavior#^1.0.9",
-    "iron-fit-behavior": "PolymerElements/iron-fit-behavior#^1.1.0",
-    "polymer": "Polymer/polymer#^1.5.0"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-    "paper-button": "PolymerElements/paper-button#^1.0.0",
-    "web-component-tester": "^4.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-  },
-  "ignore": []
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-toast/demo/index.html
deleted file mode 100644
index 1263883..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/demo/index.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-  <title>paper-toast</title>
-
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <meta name="mobile-web-app-capable" content="yes">
-  <meta name="apple-mobile-web-app-capable" content="yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-
-  <link rel="import" href="../paper-toast.html">
-  <link rel="import" href="../../paper-button/paper-button.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles"></style>
-
-</head>
-
-<body unresolved class="centered">
-  <h3>Toast auto-closes after 3 seconds. Only one toast per time will be visible</h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <paper-button raised onclick="toast0.open()">Default toast</paper-button>
-      <paper-toast id="toast0" text="This toast auto-closes after 3 seconds"></paper-toast>
-    </template>
-  </demo-snippet>
-
-  <h3>Toast does not auto-close when <code>duration</code> is negative, <code>0</code>, or <code>Infinity</code></h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <style>
-        .yellow-button {
-          text-transform: none;
-          color: #eeff41;
-        }
-      </style>
-
-      <paper-button raised onclick="toast1.open()">Persistent toast</paper-button>
-
-      <paper-toast id="toast1" duration="0" text="This toast will stay opened until you close it, or open another toast.">
-        <paper-button onclick="toast1.toggle()" class="yellow-button">Close now!</paper-button>
-      </paper-toast>
-    </template>
-  </demo-snippet>
-
-  <h3>Toast can be styled</h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <style is="custom-style">
-        #toast2 {
-          --paper-toast-background-color: red;
-          --paper-toast-color: white;
-        }
-      </style>
-
-      <paper-button raised onclick="toast2.open()">Styled toast</paper-button>
-
-      <paper-toast id="toast2" class="fit-bottom" text="This toast is red and fits bottom!"></paper-toast>
-    </template>
-  </demo-snippet>
-
-  <h3>Toast can fit into any element</h3>
-  <demo-snippet class="centered-demo">
-    <template>
-      <style>
-        #container {
-          padding: 100px;
-          border: 1px solid gray;
-        }
-      </style>
-      <div id="container">
-        <paper-button raised onclick="toast3.open()">Open toast</paper-button>
-      </div>
-      <paper-toast id="toast3" class="fit-bottom" text="This toast fits into the container."></paper-toast>
-
-      <script>
-        toast3.fitInto = container;
-      </script>
-
-    </template>
-  </demo-snippet>
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/hero.svg b/systrace/catapult/third_party/polymer/components/paper-toast/hero.svg
deleted file mode 100755
index c82a707..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/hero.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>

-<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"

-	 viewBox="0 0 225 126" enable-background="new 0 0 225 126" xml:space="preserve">

-<g id="background" display="none">

-	<rect display="inline" fill="#B0BEC5" width="225" height="126"/>

-</g>

-<g id="label">

-</g>

-<g id="art">

-	<path d="M164,114H13V88h151V114z M15,112h147V90H15V112z"/>

-	<rect x="26" y="100" width="79" height="2"/>

-	<rect x="135" y="100" width="16" height="2"/>

-	<g id="ic_x5F_add_x0D_">

-	</g>

-</g>

-<g id="Guides">

-</g>

-</svg>

diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/index.html b/systrace/catapult/third_party/polymer/components/paper-toast/index.html
deleted file mode 100644
index 487bb5c..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-  <iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/paper-toast.html b/systrace/catapult/third_party/polymer/components/paper-toast/paper-toast.html
deleted file mode 100644
index 5a7d705..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/paper-toast.html
+++ /dev/null
@@ -1,323 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-a11y-announcer/iron-a11y-announcer.html">
-<link rel="import" href="../iron-overlay-behavior/iron-overlay-behavior.html">
-
-<!--
-Material design: [Snackbars & toasts](https://www.google.com/design/spec/components/snackbars-toasts.html)
-
-`paper-toast` provides a subtle notification toast. Only one `paper-toast` will
-be visible on screen.
-
-Use `opened` to show the toast:
-
-Example:
-
-    <paper-toast text="Hello world!" opened></paper-toast>
-
-Also `open()` or `show()` can be used to show the toast:
-
-Example:
-
-    <paper-button on-click="openToast">Open Toast</paper-button>
-    <paper-toast id="toast" text="Hello world!"></paper-toast>
-
-    ...
-
-    openToast: function() {
-      this.$.toast.open();
-    }
-
-Set `duration` to 0, a negative number or Infinity to persist the toast on screen:
-
-Example:
-
-    <paper-toast text="Terms and conditions" opened duration="0">
-      <a href="#">Show more</a>
-    </paper-toast>
-
-
-### Styling
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-toast-background-color` | The paper-toast background-color | `#323232`
-`--paper-toast-color` | The paper-toast color | `#f1f1f1`
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
-@group Paper Elements
-@element paper-toast
-@demo demo/index.html
-@hero hero.svg
--->
-
-<dom-module id="paper-toast">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: fixed;
-        background-color: var(--paper-toast-background-color, #323232);
-        color: var(--paper-toast-color, #f1f1f1);
-        min-height: 48px;
-        min-width: 288px;
-        padding: 16px 24px;
-        box-sizing: border-box;
-        box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
-        border-radius: 2px;
-        margin: 12px;
-        font-size: 14px;
-        cursor: default;
-        -webkit-transition: -webkit-transform 0.3s, opacity 0.3s;
-        transition: transform 0.3s, opacity 0.3s;
-        opacity: 0;
-        -webkit-transform: translateY(100px);
-        transform: translateY(100px);
-        @apply(--paper-font-common-base);
-      }
-
-      :host(.capsule) {
-        border-radius: 24px;
-      }
-
-      :host(.fit-bottom) {
-        width: 100%;
-        min-width: 0;
-        border-radius: 0;
-        margin: 0;
-      }
-
-      :host(.paper-toast-open) {
-        opacity: 1;
-        -webkit-transform: translateY(0px);
-        transform: translateY(0px);
-      }
-    </style>
-
-    <span id="label">{{text}}</span>
-    <content></content>
-  </template>
-
-  <script>
-    (function() {
-      // Keeps track of the toast currently opened.
-      var currentToast = null;
-
-      Polymer({
-        is: 'paper-toast',
-
-        behaviors: [
-          Polymer.IronOverlayBehavior
-        ],
-
-        properties: {
-          /**
-           * The element to fit `this` into.
-           * Overridden from `Polymer.IronFitBehavior`.
-           */
-          fitInto: {
-            type: Object,
-            value: window,
-            observer: '_onFitIntoChanged'
-          },
-
-          /**
-           * The orientation against which to align the dropdown content
-           * horizontally relative to `positionTarget`.
-           * Overridden from `Polymer.IronFitBehavior`.
-           */
-          horizontalAlign: {
-            type: String,
-            value: 'left'
-          },
-
-          /**
-           * The orientation against which to align the dropdown content
-           * vertically relative to `positionTarget`.
-           * Overridden from `Polymer.IronFitBehavior`.
-           */
-          verticalAlign: {
-            type: String,
-            value: 'bottom'
-          },
-
-          /**
-           * The duration in milliseconds to show the toast.
-           * Set to `0`, a negative number, or `Infinity`, to disable the
-           * toast auto-closing.
-           */
-          duration: {
-            type: Number,
-            value: 3000
-          },
-
-          /**
-           * The text to display in the toast.
-           */
-          text: {
-            type: String,
-            value: ''
-          },
-
-          /**
-           * Overridden from `IronOverlayBehavior`.
-           * Set to false to enable closing of the toast by clicking outside it.
-           */
-          noCancelOnOutsideClick: {
-            type: Boolean,
-            value: true
-          },
-
-          /**
-           * Overridden from `IronOverlayBehavior`.
-           * Set to true to disable auto-focusing the toast or child nodes with
-           * the `autofocus` attribute` when the overlay is opened.
-           */
-          noAutoFocus: {
-            type: Boolean,
-            value: true
-          }
-        },
-
-        listeners: {
-          'transitionend': '__onTransitionEnd'
-        },
-
-        /**
-         * Read-only. Deprecated. Use `opened` from `IronOverlayBehavior`.
-         * @property visible
-         * @deprecated
-         */
-        get visible() {
-          Polymer.Base._warn('`visible` is deprecated, use `opened` instead');
-          return this.opened;
-        },
-
-        /**
-         * Read-only. Can auto-close if duration is a positive finite number.
-         * @property _canAutoClose
-         */
-        get _canAutoClose() {
-          return this.duration > 0 && this.duration !== Infinity;
-        },
-
-        created: function() {
-          this._autoClose = null;
-          Polymer.IronA11yAnnouncer.requestAvailability();
-        },
-
-        /**
-         * Show the toast. Without arguments, this is the same as `open()` from `IronOverlayBehavior`.
-         * @param {(Object|string)=} properties Properties to be set before opening the toast.
-         * e.g. `toast.show('hello')` or `toast.show({text: 'hello', duration: 3000})`
-         */
-        show: function(properties) {
-          if (typeof properties == 'string') {
-            properties = { text: properties };
-          }
-          for (var property in properties) {
-            if (property.indexOf('_') === 0) {
-              Polymer.Base._warn('The property "' + property + '" is private and was not set.');
-            } else if (property in this) {
-              this[property] = properties[property];
-            } else {
-              Polymer.Base._warn('The property "' + property + '" is not valid.');
-            }
-          }
-          this.open();
-        },
-
-        /**
-         * Hide the toast. Same as `close()` from `IronOverlayBehavior`.
-         */
-        hide: function() {
-          this.close();
-        },
-
-        /**
-         * Called on transitions of the toast, indicating a finished animation
-         * @private
-         */
-        __onTransitionEnd: function(e) {
-          // there are different transitions that are happening when opening and
-          // closing the toast. The last one so far is for `opacity`.
-          // This marks the end of the transition, so we check for this to determine if this
-          // is the correct event.
-          if (e && e.target === this && e.propertyName === 'opacity') {
-            if (this.opened) {
-              this._finishRenderOpened();
-            } else {
-              this._finishRenderClosed();
-            }
-          }
-        },
-
-        /**
-         * Overridden from `IronOverlayBehavior`.
-         * Called when the value of `opened` changes.
-         */
-        _openedChanged: function() {
-          if (this._autoClose !== null) {
-            this.cancelAsync(this._autoClose);
-            this._autoClose = null;
-          }
-          if (this.opened) {
-            if (currentToast && currentToast !== this) {
-              currentToast.close();
-            }
-            currentToast = this;
-            this.fire('iron-announce', {
-              text: this.text
-            });
-            if (this._canAutoClose) {
-              this._autoClose = this.async(this.close, this.duration);
-            }
-          } else if (currentToast === this) {
-            currentToast = null;
-          }
-          Polymer.IronOverlayBehaviorImpl._openedChanged.apply(this, arguments);
-        },
-
-        /**
-         * Overridden from `IronOverlayBehavior`.
-         */
-        _renderOpened: function() {
-          this.classList.add('paper-toast-open');
-        },
-
-        /**
-         * Overridden from `IronOverlayBehavior`.
-         */
-        _renderClosed: function() {
-          this.classList.remove('paper-toast-open');
-        },
-
-        /**
-         * @private
-         */
-        _onFitIntoChanged: function(fitInto) {
-          this.positionTarget = fitInto;
-        }
-
-        /**
-         * Fired when `paper-toast` is opened.
-         *
-         * @event 'iron-announce'
-         * @param {{text: string}} detail Contains text that will be announced.
-         */
-      });
-    })();
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-toast/test/basic.html
deleted file mode 100644
index 154015d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/test/basic.html
+++ /dev/null
@@ -1,243 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-
-<head>
-
-  <title>paper-toast-basic</title>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-
-  <link rel="import" href="../paper-toast.html">
-
-  <style>
-    body {
-      margin: 0;
-      padding: 0;
-    }
-  </style>
-</head>
-
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <paper-toast></paper-toast>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="show">
-    <template>
-      <paper-toast opened></paper-toast>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="contained">
-    <template>
-      <paper-toast class="fit-bottom"></paper-toast>
-      <div style="margin: 50px; width: 100px; height: 100px; background-color: orange;"></div>
-    </template>
-  </test-fixture>
-
-  <script>
-
-    suite('basic', function() {
-
-      var toast;
-
-      test('is hidden', function() {
-        toast = fixture('basic');
-        assert.isFalse(toast.opened, '`opened` is false');
-      });
-
-      test('is visible', function() {
-        toast = fixture('show');
-        assert.isTrue(toast.opened, '`opened` is true');
-      });
-
-      test('show() will open toast', function() {
-        toast = fixture('basic');
-        toast.show();
-        assert.isTrue(toast.opened, '`opened` is true');
-      });
-
-      test('hide() will close toast', function() {
-        toast = fixture('show');
-        toast.hide();
-        assert.isFalse(toast.opened, '`opened` is false');
-      });
-
-      test('toast auto-close after 10ms', function(done) {
-        toast = fixture('basic');
-        toast.duration = 10;
-        toast.show();
-        setTimeout(function() {
-          assert.isFalse(toast.opened, '`opened` is false');
-          done();
-        }, 12);
-      });
-
-      test('toast fires opened event', function(done) {
-        toast = fixture('show');
-        toast.addEventListener('iron-overlay-opened', function() {
-          done();
-        });
-      });
-
-      test('toast does not get focused', function(done) {
-        toast = fixture('show');
-        var spy = sinon.spy(toast, 'focus');
-        assert.isTrue(toast.noAutoFocus, 'no-auto-focus is true');
-        toast.addEventListener('iron-overlay-opened', function() {
-          assert.isFalse(spy.called, 'toast is not focused');
-          done();
-        });
-      });
-
-      test('toast fires closed event', function(done) {
-        toast = fixture('basic');
-        toast.show({duration: 350});
-        toast.addEventListener('iron-overlay-closed', function() {
-          done();
-        });
-      });
-
-      test('show() accepts valid properties', function() {
-        toast = fixture('basic');
-        toast.show({text: 'hello world', duration: 20});
-        assert.isTrue(toast.opened, '`opened` is true');
-        assert.equal(toast.text, 'hello world', '`text` is correct');
-        assert.equal(toast.duration, 20, '`duration` is correct');
-      });
-
-      test('show() does not accept invalid properties', function() {
-        toast = fixture('basic');
-        toast.show({foo: 'bar'});
-        assert.isUndefined(toast.foo, '`foo` is not a valid property and will not be set');
-        assert.isTrue(toast.opened, '`opened` is true');
-      });
-
-      test('show() does not accept private properties', function() {
-        toast = fixture('basic');
-        var temp = toast._manager;
-        toast.show({_manager: 'bar'});
-        assert.equal(toast._manager, temp, '`_manager` is a private property and will not be set');
-        assert.isTrue(toast.opened, '`opened` is true');
-      });
-
-      test('show() accepts a string argument as the text parameter', function() {
-        toast = fixture('basic');
-        toast.show('hello world 2');
-        assert.equal(toast.text, 'hello world 2', '`text is correct`');
-      });
-
-      suite('disable auto-close', function() {
-        var spy;
-        setup(function() {
-          toast = fixture('basic');
-          spy = sinon.spy(toast, 'async');
-        });
-        test('duration = Infinity', function() {
-          toast.duration = Infinity;
-          toast.show();
-          assert.isFalse(spy.calledWith(toast.close), '`async` was not called with `close()`');
-          assert.isFalse(spy.calledWith(toast.hide), '`async` was not called with `hide()`');
-        });
-
-        test('duration = 0', function() {
-          toast.duration = 0;
-          toast.show();
-          assert.isFalse(spy.calledWith(toast.close), '`async` was not called with `close()`');
-          assert.isFalse(spy.calledWith(toast.hide), '`async` was not called with `hide()`');
-        });
-
-        test('duration = -10', function() {
-          toast.duration = -10;
-          toast.show();
-          assert.isFalse(spy.calledWith(toast.close), '`async` was not called with `close()`');
-          assert.isFalse(spy.calledWith(toast.hide), '`async` was not called with `hide()`');
-        });
-      });
-
-      test('there is only 1 toast opened', function() {
-        var toast1 = fixture('basic');
-        var toast2 = fixture('show');
-        toast2.open();
-        toast1.open();
-        assert.isTrue(toast1.opened, 'toast1 is opened');
-        assert.isFalse(toast2.opened, 'toast2 is not opened');
-        toast2.open();
-        assert.isFalse(toast1.opened, 'toast1 is now not opened');
-        assert.isTrue(toast2.opened, 'toast2 is now opened');
-      });
-
-      test('auto-close is correctly reset', function(done) {
-        toast = fixture('basic');
-        toast.duration = 10;
-        toast.show();
-        // a bit later (before the auto-close), toast is reset
-        setTimeout(function() {
-          toast.hide();
-          // keep toast opened
-          toast.duration = 0;
-          toast.show();
-          setTimeout(function() {
-            assert.isTrue(toast.opened, 'toast is still open');
-            done();
-          }, 10);
-        }, 5);
-      });
-
-      test('toast is positioned according at the bottom left of its fitInto', function(done) {
-        var f = fixture('contained');
-        var toast = f[0];
-        var container = f[1];
-        toast.fitInto = container;
-        toast.open();
-        // Wait for it to be opened, so it will be sized correctly.
-        toast.addEventListener('iron-overlay-opened', function() {
-          var rect = toast.getBoundingClientRect();
-          assert.equal(rect.left, 50, 'left ok');
-          // 150px from top, (100px of height + 50px of margin-top)
-          assert.equal(rect.bottom, 150, 'bottom');
-          done();
-        });
-      });
-
-      suite('a11y', function() {
-        test('show() will announce text', function() {
-          toast = fixture('basic');
-          var spy = sinon.spy(toast, 'fire');
-          toast.text = 'announce!';
-          toast.show();
-          assert.isTrue(spy.calledWith('iron-announce', {
-            text: 'announce!'
-          }), 'text announced');
-        });
-
-        test('hide() will not announce text', function() {
-          toast = fixture('show');
-          var spy = sinon.spy(toast, 'fire');
-          toast.hide();
-          assert.isFalse(spy.calledWith('iron-announce'), 'text not announced');
-        });
-      });
-
-    });
-  </script>
-
-</body>
-
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-toast/test/index.html b/systrace/catapult/third_party/polymer/components/paper-toast/test/index.html
deleted file mode 100644
index c058372..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-toast/test/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<html>
-  <head>
-
-    <meta charset="utf-8">
-    <title>Tests</title>
-    <script src="../../web-component-tester/browser.js"></script>
-
-  </head>
-  <body>
-
-    <script>
-
-      WCT.loadSuites([
-        'basic.html'
-      ]);
-
-    </script>
-
-  </body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/paper-tooltip/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/README.md b/systrace/catapult/third_party/polymer/components/paper-tooltip/README.md
deleted file mode 100644
index b20a34b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-paper-tooltip.html
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerElements/paper-tooltip.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-tooltip)
-
-_[Demo and API docs](https://elements.polymer-project.org/elements/paper-tooltip)_
-
-
-##&lt;paper-tooltip&gt;
-
-Material design: [Tooltips](https://www.google.com/design/spec/components/tooltips.html)
-
-`<paper-tooltip>` is a label that appears on hover and focus when the user
-hovers over an element with the cursor or with the keyboard. It will be centered
-to an anchor element specified in the `for` attribute, or, if that doesn't exist,
-centered to the parent node containing it.
-
-Example:
-
-```html
-<div style="display:inline-block">
-  <button>Click me!</button>
-  <paper-tooltip>Tooltip text</paper-tooltip>
-</div>
-
-<div>
-  <button id="btn">Click me!</button>
-  <paper-tooltip for="btn">Tooltip text</paper-tooltip>
-</div>
-```
-
-The tooltip can be positioned on the top|bottom|left|right of the anchor using
-the `position` attribute. The default position is bottom.
-
-```html
-<paper-tooltip for="btn" position="left">Tooltip text</paper-tooltip>
-<paper-tooltip for="btn" position="top">Tooltip text</paper-tooltip>
-```
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-| Custom property | Description | Default |
-| --- | --- | --- |
-| `--paper-tooltip-background` | The background color of the tooltip | `#616161` |
-| `--paper-tooltip-opacity` | The opacity of the tooltip | `0.9` |
-| `--paper-tooltip-text-color` | The text color of the tooltip | `white` |
-| `--paper-tooltip` | Mixin applied to the tooltip | `{}` |
-
-
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/bower.json b/systrace/catapult/third_party/polymer/components/paper-tooltip/bower.json
deleted file mode 100644
index f7a687d..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/bower.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "paper-tooltip",
-  "version": "1.1.4",
-  "description": "Material design tooltip popup for content",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "tooltip"
-  ],
-  "main": "paper-tooltip.html",
-  "private": true,
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-tooltip.git"
-  },
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "homepage": "https://github.com/PolymerElements/paper-tooltip",
-  "ignore": [],
-  "dependencies": {
-    "polymer": "Polymer/polymer#^1.1.0",
-    "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-    "neon-animation": "PolymerElements/neon-animation#^1.0.0"
-  },
-  "devDependencies": {
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-    "web-component-tester": "^4.0.0",
-    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-    "iron-demo-helpers": "polymerelements/iron-demo-helpers#^1.0.0",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/demo/index.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/demo/index.html
deleted file mode 100644
index c0bad5e..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/demo/index.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html lang="en">
-<head>
-  <title>paper-tooltip demo</title>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
-  <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html">
-  <link rel="import" href="../../iron-icons/iron-icons.html">
-  <link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-  <link rel="import" href="../../paper-styles/color.html">
-  <link rel="import" href="../paper-tooltip.html">
-  <link rel="import" href="test-button.html">
-
-  <style is="custom-style" include="demo-pages-shared-styles">
-    paper-icon-button, input, .avatar {
-      margin: 0 10px;
-    }
-
-    .avatar {
-      box-sizing: border-box;
-      width: 40px;
-      height: 40px;
-      padding: 8px;
-      border-radius: 50%;
-      cursor: pointer;
-    }
-
-    .blue {
-      background-color: var(--paper-light-blue-300);
-    }
-    .orange {
-      background-color: var(--paper-amber-500);
-    }
-    .green {
-      background-color: var(--paper-green-500);
-    }
-    .red {
-      background-color: var(--paper-pink-500);
-    }
-  </style>
-</head>
-<body unresolved>
-  <div class="vertical-section-container centered">
-    <h3>Tooltips can be anchored to elements using their ID</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <paper-icon-button id="id_1" icon="favorite" alt="heart"></paper-icon-button>
-        <paper-icon-button id="id_2" icon="alarm-on" alt="go back"></paper-icon-button>
-        <div id="id_3" class="avatar blue" tabindex="0"></div>
-        <div id="id_4" class="avatar orange" tabindex="0"></div>
-
-        <!-- paper-icon-buttons have an inherent padding that will push the tooltip down. offset undoes it -->
-        <paper-tooltip for="id_1" offset="0">&lt;3 &lt;3 &lt;3 </paper-tooltip>
-        <paper-tooltip for="id_2" offset="0">wake up!</paper-tooltip>
-        <paper-tooltip for="id_3" offset="0">halp I am trapped in a tooltip</paper-tooltip>
-        <paper-tooltip for="id_4" offset="0">meow!</paper-tooltip>
-      </template>
-    </demo-snippet>
-
-    <h3>Tooltips can be anchored to elements relative to their parent</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <!-- Adding a tabindex so that we can show the tooltip when the whole box is tabbed to -->
-        <div tabindex="0">
-          <input type="checkbox">allosaurus
-          <paper-tooltip>the name means "different lizard"</paper-tooltip>
-        </div>
-        <div tabindex="0">
-          <input type="checkbox">brontosaurus
-          <paper-tooltip>the name means "thunder lizard"</paper-tooltip>
-        </div>
-        <div tabindex="0">
-          <input type="checkbox">megalosaurus
-          <paper-tooltip>the name means "roof lizard"</paper-tooltip>
-        </div>
-      </div>
-      </template>
-    </demo-snippet>
-
-    <h3>Tooltips can open in different directions</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <div id="dir_1" class="avatar red" tabindex="0"></div>
-        <div id="dir_2" class="avatar blue" tabindex="0"></div>
-        <div id="dir_3" class="avatar green" tabindex="0"></div>
-        <div id="dir_4" class="avatar orange" tabindex="0"></div>
-
-        <paper-tooltip for="dir_1" position="left" animation-delay="0">👈</paper-tooltip>
-        <paper-tooltip for="dir_2" position="right" animation-delay="0">👉</paper-tooltip>
-        <paper-tooltip for="dir_3" position="top" animation-delay="0">👍</paper-tooltip>
-        <paper-tooltip for="dir_4" position="bottom" animation-delay="0">👎</paper-tooltip>
-      </template>
-    </demo-snippet>
-
-    <h3>Tooltips can contain rich text (though against the Material Design spec)</h3>
-    <demo-snippet class="centered-demo">
-      <template>
-        <style is="custom-style">
-          paper-tooltip.custom img {
-            width: 40px;
-            padding-right: 10px;
-            padding-bottom: 10px;
-            float: left;
-          }
-          .custom {
-            --paper-tooltip-background: black;
-            --paper-tooltip-text-color: var(--paper-pink-100);
-            width: 160px;
-          }
-        </style>
-        <paper-icon-button id="demo4_icon1" icon="favorite" alt="heart"></paper-icon-button>
-        <paper-tooltip for="demo4_icon1" class="custom" animation-delay="0">
-          <img src="https://placekitten.com/50/50">
-          Rich-text tooltips are doable but against the Material Design spec.
-        </paper-tooltip>
-      </template>
-    </demo-snippet>
-  </div>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/demo/test-button.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/demo/test-button.html
deleted file mode 100644
index 0942f58..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/demo/test-button.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../../paper-icon-button/paper-icon-button.html">
-<link rel="import" href="../../iron-icons/iron-icons.html">
-<link rel="import" href="../paper-tooltip.html">
-
-<dom-module id="test-button">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-      }
-
-      paper-icon-button {
-        padding: 0;
-      }
-    </style>
-
-    <paper-icon-button id="m" icon="menu" alt="menu"></paper-icon-button>
-    <paper-tooltip for="m" offset="8">hot dogs</paper-tooltip>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'test-button'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/index.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/index.html
deleted file mode 100644
index 848f042..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <title>paper-tooltip</title>
-
-  <script src="../webcomponentsjs/webcomponents-lite.js"></script>
-  <link rel="import" href="../iron-component-page/iron-component-page.html">
-
-</head>
-<body>
-
-<iron-component-page></iron-component-page>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/paper-tooltip.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/paper-tooltip.html
deleted file mode 100644
index 670280b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/paper-tooltip.html
+++ /dev/null
@@ -1,407 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-
-<link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../neon-animation/neon-animation-runner-behavior.html">
-<link rel="import" href="../neon-animation/animations/fade-in-animation.html">
-<link rel="import" href="../neon-animation/animations/fade-out-animation.html">
-
-<!--
-Material design: [Tooltips](https://www.google.com/design/spec/components/tooltips.html)
-
-`<paper-tooltip>` is a label that appears on hover and focus when the user
-hovers over an element with the cursor or with the keyboard. It will be centered
-to an anchor element specified in the `for` attribute, or, if that doesn't exist,
-centered to the parent node containing it.
-
-Example:
-
-    <div style="display:inline-block">
-      <button>Click me!</button>
-      <paper-tooltip>Tooltip text</paper-tooltip>
-    </div>
-
-    <div>
-      <button id="btn">Click me!</button>
-      <paper-tooltip for="btn">Tooltip text</paper-tooltip>
-    </div>
-
-The tooltip can be positioned on the top|bottom|left|right of the anchor using
-the `position` attribute. The default position is bottom.
-
-    <paper-tooltip for="btn" position="left">Tooltip text</paper-tooltip>
-    <paper-tooltip for="btn" position="top">Tooltip text</paper-tooltip>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-tooltip-background` | The background color of the tooltip | `#616161`
-`--paper-tooltip-opacity` | The opacity of the tooltip | `0.9`
-`--paper-tooltip-text-color` | The text color of the tooltip | `white`
-`--paper-tooltip` | Mixin applied to the tooltip | `{}`
-
-@group Paper Elements
-@element paper-tooltip
-@demo demo/index.html
--->
-
-<dom-module id="paper-tooltip">
-  <template>
-    <style>
-      :host {
-        display: block;
-        position: absolute;
-        outline: none;
-        z-index: 1002;
-        -moz-user-select: none;
-        -ms-user-select: none;
-        -webkit-user-select: none;
-        user-select: none;
-        cursor: default;
-      }
-
-      #tooltip {
-        display: block;
-        outline: none;
-        @apply(--paper-font-common-base);
-        font-size: 10px;
-        line-height: 1;
-
-        background-color: var(--paper-tooltip-background, #616161);
-        opacity: var(--paper-tooltip-opacity, 0.9);
-        color: var(--paper-tooltip-text-color, white);
-
-        padding: 8px;
-        border-radius: 2px;
-
-        @apply(--paper-tooltip);
-      }
-
-      /* Thanks IE 10. */
-      .hidden {
-        display: none !important;
-      }
-    </style>
-
-    <div id="tooltip" class="hidden">
-      <content></content>
-    </div>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'paper-tooltip',
-
-      hostAttributes: {
-        role: 'tooltip',
-        tabindex: -1
-      },
-
-      behaviors: [
-        Polymer.NeonAnimationRunnerBehavior
-      ],
-
-      properties: {
-        /**
-         * The id of the element that the tooltip is anchored to. This element
-         * must be a sibling of the tooltip.
-         */
-        for: {
-          type: String,
-          observer: '_findTarget'
-        },
-
-        /**
-         * Set this to true if you want to manually control when the tooltip
-         * is shown or hidden.
-         */
-        manualMode: {
-          type: Boolean,
-          value: false,
-          observer: '_manualModeChanged'
-        },
-
-        /**
-         * Positions the tooltip to the top, right, bottom, left of its content.
-         */
-        position: {
-          type: String,
-          value: 'bottom'
-        },
-
-        /**
-         * If true, no parts of the tooltip will ever be shown offscreen.
-         */
-        fitToVisibleBounds: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * The spacing between the top of the tooltip and the element it is
-         * anchored to.
-         */
-        offset: {
-          type: Number,
-          value: 14
-        },
-
-        /**
-         * This property is deprecated, but left over so that it doesn't
-         * break exiting code. Please use `offset` instead. If both `offset` and
-         * `marginTop` are provided, `marginTop` will be ignored.
-         * @deprecated since version 1.0.3
-         */
-        marginTop: {
-          type: Number,
-          value: 14
-        },
-
-        /**
-         * The delay that will be applied before the `entry` animation is
-         * played when showing the tooltip.
-         */
-        animationDelay: {
-          type: Number,
-          value: 500
-        },
-
-        /**
-         * The entry and exit animations that will be played when showing and
-         * hiding the tooltip. If you want to override this, you must ensure
-         * that your animationConfig has the exact format below.
-         */
-        animationConfig: {
-          type: Object,
-          value: function() {
-            return {
-              'entry': [{
-                name: 'fade-in-animation',
-                node: this,
-                timing: {delay: 0}
-              }],
-              'exit': [{
-                name: 'fade-out-animation',
-                node: this
-              }]
-            }
-          }
-        },
-
-        _showing: {
-          type: Boolean,
-          value: false
-        }
-      },
-
-      listeners: {
-        'neon-animation-finish': '_onAnimationFinish',
-      },
-
-      /**
-       * Returns the target element that this tooltip is anchored to. It is
-       * either the element given by the `for` attribute, or the immediate parent
-       * of the tooltip.
-       */
-      get target () {
-        var parentNode = Polymer.dom(this).parentNode;
-        // If the parentNode is a document fragment, then we need to use the host.
-        var ownerRoot = Polymer.dom(this).getOwnerRoot();
-
-        var target;
-        if (this.for) {
-          target = Polymer.dom(ownerRoot).querySelector('#' + this.for);
-        } else {
-          target = parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE ?
-              ownerRoot.host : parentNode;
-        }
-
-        return target;
-      },
-
-      attached: function() {
-        this._findTarget();
-      },
-
-      detached: function() {
-        if (!this.manualMode)
-          this._removeListeners();
-      },
-
-      show: function() {
-        // If the tooltip is already showing, there's nothing to do.
-        if (this._showing)
-          return;
-
-        if (Polymer.dom(this).textContent.trim() === ''){
-          // Check if effective children are also empty
-          var allChildrenEmpty = true;
-          var effectiveChildren = Polymer.dom(this).getEffectiveChildNodes();
-          for (var i = 0; i < effectiveChildren.length; i++) {
-            if (effectiveChildren[i].textContent.trim() !== '') {
-              allChildrenEmpty = false;
-              break;
-            }
-          }
-          if (allChildrenEmpty) {
-            return;
-          }
-        }
-
-
-        this.cancelAnimation();
-        this._showing = true;
-        this.toggleClass('hidden', false, this.$.tooltip);
-        this.updatePosition();
-
-        this.animationConfig.entry[0].timing = this.animationConfig.entry[0].timing || {};
-        this.animationConfig.entry[0].timing.delay = this.animationDelay;
-        this._animationPlaying = true;
-        this.playAnimation('entry');
-      },
-
-      hide: function() {
-        // If the tooltip is already hidden, there's nothing to do.
-        if (!this._showing) {
-          return;
-        }
-
-        // If the entry animation is still playing, don't try to play the exit
-        // animation since this will reset the opacity to 1. Just end the animation.
-        if (this._animationPlaying) {
-          this.cancelAnimation();
-          this._showing = false;
-          this._onAnimationFinish();
-          return;
-        }
-
-        this._showing = false;
-        this._animationPlaying = true;
-        this.playAnimation('exit');
-      },
-
-      updatePosition: function() {
-        if (!this._target || !this.offsetParent)
-          return;
-
-        var offset = this.offset;
-        // If a marginTop has been provided by the user (pre 1.0.3), use it.
-        if (this.marginTop != 14 && this.offset == 14)
-          offset = this.marginTop;
-
-        var parentRect = this.offsetParent.getBoundingClientRect();
-        var targetRect = this._target.getBoundingClientRect();
-        var thisRect = this.getBoundingClientRect();
-
-        var horizontalCenterOffset = (targetRect.width - thisRect.width) / 2;
-        var verticalCenterOffset = (targetRect.height - thisRect.height) / 2;
-
-        var targetLeft = targetRect.left - parentRect.left;
-        var targetTop = targetRect.top - parentRect.top;
-
-        var tooltipLeft, tooltipTop;
-
-        switch (this.position) {
-          case 'top':
-            tooltipLeft = targetLeft + horizontalCenterOffset;
-            tooltipTop = targetTop - thisRect.height - offset;
-            break;
-          case 'bottom':
-            tooltipLeft = targetLeft + horizontalCenterOffset;
-            tooltipTop = targetTop + targetRect.height + offset;
-            break;
-          case 'left':
-            tooltipLeft = targetLeft - thisRect.width - offset;
-            tooltipTop = targetTop + verticalCenterOffset;
-            break;
-          case 'right':
-            tooltipLeft = targetLeft + targetRect.width + offset;
-            tooltipTop = targetTop + verticalCenterOffset;
-            break;
-        }
-
-        // TODO(noms): This should use IronFitBehavior if possible.
-        if (this.fitToVisibleBounds) {
-          // Clip the left/right side
-          if (parentRect.left + tooltipLeft + thisRect.width > window.innerWidth) {
-            this.style.right = '0px';
-            this.style.left = 'auto';
-          } else {
-            this.style.left = Math.max(0, tooltipLeft) + 'px';
-            this.style.right = 'auto';
-          }
-
-          // Clip the top/bottom side.
-          if (parentRect.top + tooltipTop + thisRect.height > window.innerHeight) {
-            this.style.bottom = parentRect.height + 'px';
-            this.style.top = 'auto';
-          } else {
-            this.style.top = Math.max(-parentRect.top, tooltipTop) + 'px';
-            this.style.bottom = 'auto';
-          }
-        } else {
-          this.style.left = tooltipLeft + 'px';
-          this.style.top = tooltipTop + 'px';
-        }
-
-      },
-
-      _addListeners: function() {
-        if (this._target) {
-          this.listen(this._target, 'mouseenter', 'show');
-          this.listen(this._target, 'focus', 'show');
-          this.listen(this._target, 'mouseleave', 'hide');
-          this.listen(this._target, 'blur', 'hide');
-          this.listen(this._target, 'tap', 'hide');
-        }
-        this.listen(this, 'mouseenter', 'hide');
-      },
-
-      _findTarget: function() {
-        if (!this.manualMode)
-          this._removeListeners();
-
-        this._target = this.target;
-
-        if (!this.manualMode)
-          this._addListeners();
-      },
-
-      _manualModeChanged: function() {
-        if (this.manualMode)
-          this._removeListeners();
-        else
-          this._addListeners();
-      },
-
-      _onAnimationFinish: function() {
-        this._animationPlaying = false;
-        if (!this._showing) {
-          this.toggleClass('hidden', true, this.$.tooltip);
-        }
-      },
-
-      _removeListeners: function() {
-        if (this._target) {
-          this.unlisten(this._target, 'mouseenter', 'show');
-          this.unlisten(this._target, 'focus', 'show');
-          this.unlisten(this._target, 'mouseleave', 'hide');
-          this.unlisten(this._target, 'blur', 'hide');
-          this.unlisten(this._target, 'tap', 'hide');
-        }
-        this.unlisten(this, 'mouseenter', 'hide');
-      }
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/basic.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/test/basic.html
deleted file mode 100644
index 45e386b..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/basic.html
+++ /dev/null
@@ -1,552 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="UTF-8">
-  <title>paper-tooltip tests</title>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
-
-  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
-  <script src="../../web-component-tester/browser.js"></script>
-  <script src="../../test-fixture/test-fixture-mocha.js"></script>
-  <script src="../../iron-test-helpers/mock-interactions.js"></script>
-
-  <link rel="import" href="../../test-fixture/test-fixture.html">
-  <link rel="import" href="../paper-tooltip.html">
-  <link rel="import" href="test-button.html">
-  <link rel="import" href="test-icon.html">
-
-</head>
-<style>
-  body {
-    margin: 0;
-    padding: 0;
-  }
-  #target {
-    width: 100px;
-    height: 20px;
-    background-color: red;
-  }
-  paper-tooltip {
-    width: 70px;
-    height: 30px;
-  }
-
-  .wide {
-    width: 200px;
-  }
-
-  [hidden] {
-    display: none;
-  }
-</style>
-
-<body>
-
-  <test-fixture id="basic">
-    <template>
-      <div>
-        <div id="target"></div>
-        <paper-tooltip for="target" animation-delay="0">Tooltip text</paper-tooltip>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="fitted">
-    <template>
-      <div>
-        <div id="target" style="position:absolute"></div>
-        <paper-tooltip for="target" class="wide" fit-to-visible-bounds>Tooltip text</paper-tooltip>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="no-text">
-    <template>
-      <div>
-        <div id="target"></div>
-        <paper-tooltip for="target"></paper-tooltip>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="dynamic">
-    <template>
-      <div>
-        <div id="target"></div>
-        <paper-tooltip>Tooltip text</paper-tooltip>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="custom">
-    <template>
-      <test-button></test-button>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="custom-with-content">
-    <template>
-      <test-icon>Tooltip text</test-icon>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="no-offset-parent">
-    <template>
-      <div>
-        <div id="target"></div>
-        <paper-tooltip for="target" animation-delay="0" hidden></paper-tooltip>
-      </div>
-    </template>
-  </test-fixture>
-
-  <test-fixture id="manual-mode">
-    <template>
-      <div>
-        <div id="target"></div>
-        <paper-tooltip for="target" manual-mode>Text</paper-tooltip>
-      </div>
-    </template>
-  </test-fixture>
-
-  <script>
-    function isHidden(element) {
-      var rect = element.getBoundingClientRect();
-      return (rect.width == 0 && rect.height == 0);
-    }
-
-    suite('basic', function() {
-      test('tooltip is shown when target is focused', function() {
-        var f = fixture('no-text');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isTrue(isHidden(actualTooltip));
-      });
-
-      test('tooltip is not shown if empty', function() {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-      });
-
-      test('tooltip doesn\'t throw an exception if it has no offsetParent', function() {
-        var f = fixture('no-offset-parent');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-        tooltip.updatePosition();
-        tooltip.show();
-
-        // Doesn't get shown since there's no position computed.
-        assert.isTrue(isHidden(actualTooltip));
-      });
-
-      test('tooltip is positioned correctly (bottom)', function() {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var divRect = target.getBoundingClientRect();
-        expect(divRect.width).to.be.equal(100);
-        expect(divRect.height).to.be.equal(20);
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(70);
-        expect(contentRect.height).to.be.equal(30);
-
-        // The target div width is 100, and the tooltip width is 70, and
-        // it's centered. The height of the target div is 20, and the
-        // tooltip is 14px below.
-        expect(contentRect.left).to.be.equal((100 - 70)/2);
-        expect(contentRect.top).to.be.equal(20 + 14);
-
-        // Also check the math, just in case.
-        expect(contentRect.left).to.be.equal((divRect.width - contentRect.width)/2);
-        expect(contentRect.top).to.be.equal(divRect.height + tooltip.offset);
-      });
-
-      test('tooltip is positioned correctly (top)', function() {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-        tooltip.position = 'top';
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var divRect = target.getBoundingClientRect();
-        expect(divRect.width).to.be.equal(100);
-        expect(divRect.height).to.be.equal(20);
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(70);
-        expect(contentRect.height).to.be.equal(30);
-
-        // The target div width is 100, and the tooltip width is 70, and
-        // it's centered. The height of the tooltip is 30, and the
-        // tooltip is 14px above the target.
-        expect(contentRect.left).to.be.equal((100 - 70)/2);
-        expect(contentRect.top).to.be.equal(0 - 30 - 14);
-
-        // Also check the math, just in case.
-        expect(contentRect.left).to.be.equal((divRect.width - contentRect.width)/2);
-        expect(contentRect.top).to.be.equal(0 - contentRect.height - tooltip.offset);
-      });
-
-      test('tooltip is positioned correctly (right)', function() {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-        tooltip.position = 'right';
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var divRect = target.getBoundingClientRect();
-        expect(divRect.width).to.be.equal(100);
-        expect(divRect.height).to.be.equal(20);
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(70);
-        expect(contentRect.height).to.be.equal(30);
-
-        // The target div width is 100, and the tooltip is 14px to the right.
-        // The target div height is 20, the height of the tooltip is 20px, and
-        // the tooltip is centered.
-        expect(contentRect.left).to.be.equal(100 + 14);
-        expect(contentRect.top).to.be.equal((20 - 30)/2);
-
-        // Also check the math, just in case.
-        expect(contentRect.left).to.be.equal(divRect.width + tooltip.offset);
-        expect(contentRect.top).to.be.equal((divRect.height - contentRect.height)/2);
-      });
-
-      test('tooltip is positioned correctly (left)', function() {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-        tooltip.position = 'left';
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var divRect = target.getBoundingClientRect();
-        expect(divRect.width).to.be.equal(100);
-        expect(divRect.height).to.be.equal(20);
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(70);
-        expect(contentRect.height).to.be.equal(30);
-
-        // The tooltip width is 70px, and the tooltip is 14px to the left of the target.
-        // The target div height is 20, the height of the tooltip is 20px, and
-        // the tooltip is centered.
-        expect(contentRect.left).to.be.equal(0 - 70 - 14);
-        expect(contentRect.top).to.be.equal((20 - 30)/2);
-
-        // Also check the math, just in case.
-        expect(contentRect.left).to.be.equal(0 - contentRect.width - tooltip.offset);
-        expect(contentRect.top).to.be.equal((divRect.height - contentRect.height)/2);
-      });
-
-      test('tooltip is fitted correctly if out of bounds', function() {
-        var f = fixture('fitted');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-        target.style.top = 0;
-        target.style.left = 0;
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var contentRect = tooltip.getBoundingClientRect();
-        var divRect = target.getBoundingClientRect();
-
-        // Should be fitted on the left side.
-        expect(contentRect.left).to.be.equal(0);
-        expect(contentRect.top).to.be.equal(divRect.height + tooltip.offset);
-      });
-
-      test('tooltip is positioned correctly after being dynamically set', function() {
-        var f = fixture('dynamic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        // Skip animations in this test, which means we'll show and hide
-        // the tooltip manually, instead of calling focus and blur.
-
-        // The tooltip is shown because it's a sibling of the target,
-        // but it's positioned incorrectly
-        tooltip.toggleClass('hidden', false, actualTooltip);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.left).to.not.be.equal((100 - 70)/2);
-
-        tooltip.for = 'target';
-
-        // The tooltip needs to hide before it gets repositioned.
-        tooltip.toggleClass('hidden', true, actualTooltip);
-        tooltip.updatePosition();
-        tooltip.toggleClass('hidden', false, actualTooltip);
-        assert.isFalse(isHidden(actualTooltip));
-
-        // The target div width is 100, and the tooltip width is 70, and
-        // it's centered. The height of the target div is 20, and the
-        // tooltip is 14px below.
-        contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.left).to.be.equal((100 - 70)/2);
-        expect(contentRect.top).to.be.equal(20 + 14);
-      });
-
-      test('tooltip is hidden after target is blurred', function(done) {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-        // Simulate but don't actually run the entry animation.
-        tooltip.toggleClass('hidden', false, actualTooltip);
-        tooltip._showing = true;
-        assert.isFalse(isHidden(actualTooltip));
-
-        tooltip.addEventListener('neon-animation-finish', function() {
-          assert.isTrue(isHidden(actualTooltip));
-          done();
-        });
-        MockInteractions.blur(target);
-      });
-
-      test('tooltip unlistens to target on detach', function(done) {
-        var f = fixture('basic');
-        var target = f.querySelector('#target');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        sinon.spy(tooltip, 'show');
-
-        MockInteractions.focus(target);
-        expect(tooltip.show.callCount).to.be.equal(1);
-
-        MockInteractions.focus(target);
-        expect(tooltip.show.callCount).to.be.equal(2);
-
-        f.removeChild(tooltip);
-
-        setTimeout(function() {
-          // No more listener means no more calling show.
-          MockInteractions.focus(target);
-          expect(tooltip.show.callCount).to.be.equal(2);
-          done();
-        }, 200);
-      });
-
-      test('tooltip ignores events in manual-mode', function() {
-        var f = fixture('manual-mode');
-
-        var tooltip = f.querySelector('paper-tooltip');
-        assert.isTrue(tooltip.manualMode);
-
-        tooltip.show();
-        assert.isTrue(tooltip._showing);
-
-        sinon.spy(tooltip, 'hide');
-
-        tooltip.fire('mouseenter');
-
-        var target = f.querySelector('#target');
-        target.dispatchEvent(new CustomEvent('mouseenter'));
-        target.dispatchEvent(new CustomEvent('focus'));
-        target.dispatchEvent(new CustomEvent('mouseleave'));
-        target.dispatchEvent(new CustomEvent('blur'));
-        target.dispatchEvent(new CustomEvent('tap'));
-
-        expect(tooltip.hide.callCount).to.be.equal(0);
-      });
-
-      test('changing manual-mode toggles event listeners', function() {
-        var f = fixture('manual-mode');
-
-        var tooltip = f.querySelector('paper-tooltip');
-        assert.isTrue(tooltip.manualMode);
-
-        sinon.spy(tooltip, '_addListeners');
-        sinon.spy(tooltip, '_removeListeners');
-        expect(tooltip._addListeners.callCount).to.be.equal(0);
-        expect(tooltip._removeListeners.callCount).to.be.equal(0);
-
-        tooltip.manualMode = false;
-        expect(tooltip._addListeners.callCount).to.be.equal(1);
-        expect(tooltip._removeListeners.callCount).to.be.equal(0);
-
-        tooltip.manualMode = true;
-        expect(tooltip._addListeners.callCount).to.be.equal(1);
-        expect(tooltip._removeListeners.callCount).to.be.equal(1);
-      });
-
-      test('changing for= re-targets event listeners', function() {
-        var f = fixture('dynamic');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        sinon.spy(tooltip, '_addListeners');
-        sinon.spy(tooltip, '_removeListeners');
-
-        expect(tooltip._removeListeners.callCount).to.be.equal(0);
-        expect(tooltip._addListeners.callCount).to.be.equal(0);
-
-        tooltip.for = 'target';
-
-        expect(tooltip._removeListeners.callCount).to.be.equal(1);
-        expect(tooltip._addListeners.callCount).to.be.equal(1);
-      });
-    });
-
-    suite('tooltip is inside a custom element', function() {
-      var f, tooltip, target;
-
-      setup(function() {
-        f = fixture('custom');
-        target = f.$.button;
-        tooltip = f.$.buttonTooltip;
-      });
-
-      test('tooltip is shown when target is focused', function() {
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-      });
-
-      test('tooltip is positioned correctly', function() {
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var divRect = target.getBoundingClientRect();
-        expect(divRect.width).to.be.equal(100);
-        expect(divRect.height).to.be.equal(20);
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(70);
-        expect(contentRect.height).to.be.equal(30);
-
-        // The target div width is 100, and the tooltip width is 70, and
-        // it's centered. The height of the target div is 20, and the
-        // tooltip is 14px below.
-        expect(contentRect.left).to.be.equal((100 - 70)/2);
-        expect(contentRect.top).to.be.equal(20 + 14);
-
-        // Also check the math, just in case.
-        expect(contentRect.left).to.be.equal((divRect.width - contentRect.width)/2);
-        expect(contentRect.top).to.be.equal(divRect.height + tooltip.offset);
-      });
-    });
-
-    suite('tooltip is inside a custom element with content', function() {
-      var f, tooltip, target;
-
-      setup(function() {
-        f = fixture('custom-with-content');
-        target = f.$.icon;
-        tooltip = f.$.iconTooltip;
-      });
-
-      test('tooltip is shown when target is focused', function() {
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-      });
-
-      test('tooltip is positioned correctly', function() {
-        var actualTooltip = Polymer.dom(tooltip.root).querySelector('#tooltip');
-        assert.isTrue(isHidden(actualTooltip));
-
-        MockInteractions.focus(target);
-        assert.isFalse(isHidden(actualTooltip));
-
-        var divRect = target.getBoundingClientRect();
-        expect(divRect.width).to.be.equal(100);
-        expect(divRect.height).to.be.equal(20);
-
-        var contentRect = tooltip.getBoundingClientRect();
-        expect(contentRect.width).to.be.equal(70);
-        expect(contentRect.height).to.be.equal(30);
-
-        // The target div width is 100, and the tooltip width is 70, and
-        // it's centered. The height of the target div is 20, and the
-        // tooltip is 14px below.
-        expect(contentRect.left).to.be.equal((100 - 70)/2);
-        expect(contentRect.top).to.be.equal(20 + 14);
-
-        // Also check the math, just in case.
-        expect(contentRect.left).to.be.equal((divRect.width - contentRect.width)/2);
-        expect(contentRect.top).to.be.equal(divRect.height + tooltip.offset);
-      });
-    });
-
-    suite('a11y', function() {
-      test('has aria role "tooltip"', function() {
-        var f = fixture('basic');
-        var tooltip = f.querySelector('paper-tooltip');
-
-        assert.isTrue(tooltip.getAttribute('role') == 'tooltip');
-      });
-
-      var ignoredRules = ['roleTooltipRequiresDescribedby'];
-
-      a11ySuite('basic', ignoredRules);
-      a11ySuite('fitted', ignoredRules);
-      a11ySuite('no-text', ignoredRules);
-      a11ySuite('dynamic', ignoredRules);
-      a11ySuite('custom', ignoredRules);
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/index.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/test/index.html
deleted file mode 100644
index fbdc662..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html><!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head>
-  <meta charset="UTF-8">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-  <title>paper-tooltip tests</title>
-  <script src="../../web-component-tester/browser.js"></script>
-</head>
-<body>
-  <script>
-    WCT.loadSuites([
-      'basic.html',
-      'basic.html?dom=shadow'
-    ]);
-  </script>
-
-
-</body></html>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/test-button.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/test/test-button.html
deleted file mode 100644
index fa87105..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/test-button.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-tooltip.html">
-
-<dom-module id="test-button">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-      }
-
-      #button {
-        width: 100px;
-        height: 20px;
-        background-color: red;
-      }
-
-      paper-tooltip {
-        width: 70px;
-        height: 30px;
-      }
-
-    </style>
-
-    <div id="button"></div>
-    <paper-tooltip id="buttonTooltip" for="button">Tooltip text</paper-tooltip>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'test-button'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/test-icon.html b/systrace/catapult/third_party/polymer/components/paper-tooltip/test/test-icon.html
deleted file mode 100644
index 1345416..0000000
--- a/systrace/catapult/third_party/polymer/components/paper-tooltip/test/test-icon.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../../polymer/polymer.html">
-<link rel="import" href="../paper-tooltip.html">
-
-<dom-module id="test-icon">
-  <template>
-    <style>
-      :host {
-        display: inline-block;
-      }
-
-      #icon {
-        width: 100px;
-        height: 20px;
-        background-color: red;
-      }
-
-      paper-tooltip {
-        width: 70px;
-        height: 30px;
-      }
-
-    </style>
-
-    <div id="icon"></div>
-    <paper-tooltip id="iconTooltip" for="icon"><content></content></paper-tooltip>
-  </template>
-
-  <script>
-    Polymer({
-      is: 'test-icon'
-    });
-  </script>
-</dom-module>
diff --git a/systrace/catapult/third_party/polymer/components/polymer/LICENSE.txt b/systrace/catapult/third_party/polymer/components/polymer/LICENSE.txt
deleted file mode 100644
index 95987ba..0000000
--- a/systrace/catapult/third_party/polymer/components/polymer/LICENSE.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2014 The Polymer Authors. 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 Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/systrace/catapult/third_party/polymer/components/polymer/bower.json b/systrace/catapult/third_party/polymer/components/polymer/bower.json
deleted file mode 100644
index a278840..0000000
--- a/systrace/catapult/third_party/polymer/components/polymer/bower.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "polymer",
-  "version": "1.11.3",
-  "main": [
-    "polymer.html",
-    "polymer-mini.html",
-    "polymer-micro.html"
-  ],
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "ignore": [
-    "/.*",
-    "/test/",
-    "/util/",
-    "/explainer/",
-    "gulpfile.js",
-    "PRIMER.md",
-    "CONTRIBUTING.md",
-    "CHANGELOG.md"
-  ],
-  "authors": [
-    "The Polymer Authors (http://polymer.github.io/AUTHORS.txt)"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/Polymer/polymer.git"
-  },
-  "dependencies": {
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.24"
-  },
-  "devDependencies": {
-    "web-component-tester": "*",
-    "iron-component-page": "polymerElements/iron-component-page#^1.1.6"
-  },
-  "private": true
-}
diff --git a/systrace/catapult/third_party/polymer/components/polymer/build.log b/systrace/catapult/third_party/polymer/components/polymer/build.log
deleted file mode 100644
index eef1eba..0000000
--- a/systrace/catapult/third_party/polymer/components/polymer/build.log
+++ /dev/null
@@ -1,576 +0,0 @@
-BUILD LOG
----------
-Build Time: 2018-02-12T15:48:46-0800
-
-NODEJS INFORMATION
-==================
-nodejs: v8.9.4
-dom-serializer: 0.1.0
-estraverse: 4.2.0
-expand-tilde: 1.2.2
-is-windows: 0.2.0
-jade: 0.26.3
-mocha: 2.5.3
-path-is-inside: 1.0.2
-@types/clone: 0.1.30
-@types/chalk: 0.4.31
-@types/express: 4.0.37
-@types/express-serve-static-core: 4.0.53
-@types/freeport: 1.0.21
-@types/mime: 2.0.0
-@types/launchpad: 0.6.0
-@types/parse5: 0.0.31
-@types/which: 1.0.28
-@types/node: 4.2.20
-@types/serve-static: 1.7.32
-accessibility-developer-tools: 2.12.0
-accepts: 1.3.4
-abbrev: 1.1.1
-after: 0.8.2
-acorn-jsx: 3.0.1
-ansi-red: 0.1.1
-ansi-cyan: 0.1.1
-ansi-escapes: 1.4.0
-ajv-keywords: 1.5.1
-adm-zip: 0.4.7
-ajv: 4.11.8
-agent-base: 2.1.1
-ansi-regex: 2.1.1
-ansi-wrap: 0.1.0
-ansi-styles: 2.2.1
-align-text: 0.1.4
-append-field: 0.1.0
-archy: 1.0.0
-arr-diff: 2.0.0
-archiver: 0.14.4
-arr-flatten: 1.1.0
-arr-union: 2.1.0
-argparse: 1.0.9
-array-differ: 1.0.0
-array-slice: 1.0.0
-array-flatten: 1.1.1
-array-each: 1.0.1
-array-uniq: 1.0.3
-array-union: 1.0.2
-arrify: 1.0.1
-asap: 2.0.6
-array-unique: 0.2.1
-assert-plus: 0.2.0
-arraybuffer.slice: 0.0.6
-asn1: 0.2.3
-assertion-error: 1.0.2
-async: 0.9.2
-asynckit: 0.4.0
-aws-sign2: 0.6.0
-babel-polyfill: 6.26.0
-balanced-match: 1.0.0
-babel-runtime: 6.26.0
-babel-code-frame: 6.26.0
-aws4: 1.6.0
-backo2: 1.0.2
-beeper: 1.1.1
-base64-arraybuffer: 0.1.5
-base64-js: 1.2.0
-base64id: 1.0.0
-binaryextensions: 1.0.1
-bcrypt-pbkdf: 1.0.1
-better-assert: 1.0.2
-bl: 1.2.1
-blob: 0.0.4
-brace-expansion: 1.1.8
-boxen: 0.3.1
-bluebird: 2.11.0
-boom: 2.10.1
-body-parser: 1.18.2
-bufferstreams: 1.1.1
-braces: 1.8.5
-caller-path: 0.1.0
-browserstack: 1.5.0
-callsites: 0.2.0
-buffer-crc32: 0.2.13
-callsite: 1.0.0
-capture-stack-trace: 1.0.0
-bytes: 3.0.0
-camelcase: 1.2.1
-busboy: 0.2.14
-chalk: 1.1.3
-center-align: 0.1.3
-chai: 3.5.0
-caseless: 0.11.0
-circular-json: 0.3.3
-cli-width: 2.2.0
-clone: 1.0.2
-clone-stats: 0.0.1
-cleankill: 1.0.3
-co: 4.6.0
-cli-cursor: 1.0.2
-cliui: 2.1.0
-commander: 2.3.0
-code-point-at: 1.1.0
-component-bind: 1.0.0
-combined-stream: 1.0.5
-component-emitter: 1.1.2
-concat-map: 0.0.1
-component-inherit: 0.0.3
-compress-commons: 0.2.9
-concat-stream: 1.6.0
-configstore: 2.1.0
-content-disposition: 0.5.2
-cookie: 0.3.1
-content-type: 1.0.4
-cookie-signature: 1.0.6
-core-util-is: 1.0.2
-ctype: 0.5.3
-crc32-stream: 0.3.4
-cryptiles: 2.0.5
-create-error-class: 3.0.2
-crc: 3.2.1
-dateformat: 2.2.0
-debuglog: 1.0.1
-core-js: 2.5.1
-debug: 2.6.9
-dashdash: 1.14.1
-d: 1.0.0
-decamelize: 1.2.0
-defaults: 1.0.3
-del: 2.2.2
-deep-eql: 0.1.3
-delayed-stream: 1.0.0
-deep-extend: 0.4.2
-deep-is: 0.1.3
-dezalgo: 1.0.3
-deprecated: 0.0.1
-depd: 1.1.1
-dicer: 0.2.5
-destroy: 1.0.4
-dom5: 1.3.6
-diff: 1.4.0
-detect-file: 0.1.0
-domelementtype: 1.3.0
-doctrine: 2.0.0
-domhandler: 2.4.1
-domutils: 1.6.2
-duplexer: 0.1.1
-dot-prop: 3.0.0
-duplexer2: 0.0.2
-ee-first: 1.1.1
-end-of-stream: 0.1.5
-ecc-jsbn: 0.1.1
-encodeurl: 1.0.1
-engine.io: 1.8.4
-engine.io-client: 1.8.4
-es6-map: 0.1.5
-entities: 1.1.1
-es6-iterator: 2.0.1
-engine.io-parser: 1.3.2
-error-ex: 1.3.1
-es6-weak-map: 2.0.2
-escape-string-regexp: 1.0.5
-escape-html: 1.0.3
-es6-promise: 2.3.0
-es5-ext: 0.10.35
-es6-symbol: 3.1.1
-escope: 3.6.0
-espree: 3.5.1
-esrecurse: 4.2.0
-esquery: 1.0.0
-es6-set: 0.1.5
-esutils: 2.0.2
-event-emitter: 0.3.5
-etag: 1.8.1
-eslint-plugin-html: 1.7.0
-exit-hook: 1.1.1
-expand-range: 1.8.2
-extend-shallow: 1.1.4
-expand-brackets: 0.1.5
-express: 4.16.2
-extsprintf: 1.3.0
-extend: 3.0.1
-extglob: 0.3.2
-fast-levenshtein: 2.0.6
-file-entry-cache: 2.0.0
-fd-slicer: 1.0.1
-figures: 1.7.0
-fancy-log: 1.3.0
-filename-regex: 2.0.1
-filled-array: 1.1.0
-finalhandler: 1.1.0
-find-index: 0.1.1
-fill-range: 2.2.3
-flat-cache: 1.3.0
-fined: 1.1.0
-findup-sync: 0.4.3
-first-chunk-stream: 1.0.0
-flagged-respawn: 0.3.2
-for-in: 1.0.2
-for-own: 0.1.5
-forwarded: 0.1.2
-form-data: 2.1.4
-freeport: 1.0.5
-forever-agent: 0.6.1
-fs.realpath: 1.0.0
-generate-object-property: 1.2.0
-gaze: 0.5.2
-generate-function: 2.0.0
-formatio: 1.1.1
-github-url-from-username-repo: 1.0.2
-github-url-from-git: 1.5.0
-glob: 7.1.2
-fresh: 0.5.2
-glob-stream: 3.1.18
-glob-watcher: 0.0.6
-glob2base: 0.0.12
-fs-exists-sync: 0.1.0
-getpass: 0.1.7
-globals: 9.18.0
-global-modules: 0.2.3
-globby: 5.0.0
-glob-base: 0.3.0
-glob-parent: 2.0.0
-globule: 0.1.0
-graceful-fs: 3.0.11
-global-prefix: 0.1.5
-gulp-audit: 1.0.0
-got: 5.7.1
-gulp-eslint: 3.0.1
-glogg: 1.0.0
-gulp-rename: 1.2.2
-gulp-replace: 0.5.4
-gulp-vulcanize: 6.1.0
-growl: 1.9.2
-gulp-util: 3.0.8
-gulplog: 1.0.0
-has-ansi: 2.0.0
-has-gulplog: 0.1.0
-has-cors: 1.1.0
-has-binary: 0.1.7
-hoek: 2.16.3
-has-color: 0.1.7
-htmlparser2: 3.9.2
-homedir-polyfill: 1.0.1
-hydrolysis: 1.25.0
-ignore: 3.3.5
-hawk: 3.1.3
-https-proxy-agent: 1.0.0
-http-signature: 1.1.1
-iconv-lite: 0.4.19
-inflight: 1.0.6
-imurmurhash: 0.1.4
-http-errors: 1.6.2
-inherits: 2.0.3
-ini: 1.3.4
-indexof: 0.0.1
-ipaddr.js: 1.5.2
-is-arrayish: 0.2.1
-inquirer: 0.12.0
-interpret: 1.0.4
-is-dotfile: 1.0.3
-is-buffer: 1.1.5
-is-extendable: 0.1.1
-is-equal-shallow: 0.1.3
-is-absolute: 0.2.6
-is-extglob: 1.0.0
-is-my-json-valid: 2.16.1
-is-npm: 1.0.0
-is-fullwidth-code-point: 1.0.0
-is-number: 2.1.0
-is-finite: 1.0.2
-is-obj: 1.0.1
-is-path-cwd: 1.0.0
-is-path-in-cwd: 1.0.0
-is-path-inside: 1.0.0
-is-glob: 2.0.1
-is-plain-object: 2.0.4
-is-property: 1.0.2
-is-redirect: 1.0.0
-is-resolvable: 1.0.0
-is-posix-bracket: 0.1.1
-is-retry-allowed: 1.1.0
-is-stream: 1.1.0
-is-relative: 0.2.1
-is-primitive: 2.0.0
-is-typedarray: 1.0.0
-is-utf8: 0.2.1
-isarray: 1.0.0
-isexe: 2.0.0
-jju: 1.3.0
-is-unc-path: 0.1.2
-isobject: 2.1.0
-istextorbinary: 1.0.2
-jsbn: 0.1.1
-json-parse-helpfulerror: 1.0.3
-json-schema: 0.2.3
-json-stable-stringify: 1.0.1
-isstream: 0.1.2
-js-tokens: 3.0.2
-jsonpointer: 4.0.1
-json-stringify-safe: 5.0.1
-json3: 3.3.2
-jsonify: 0.0.0
-kind-of: 3.2.2
-lazy-cache: 1.0.4
-latest-version: 2.0.0
-lazypipe: 1.0.1
-jsprim: 1.4.1
-lodash: 1.0.2
-lodash._basecopy: 3.0.1
-levn: 0.3.0
-lazystream: 0.1.0
-launchpad: 0.6.0
-lodash._basetostring: 3.0.1
-liftoff: 2.3.0
-lodash._basevalues: 3.0.0
-lodash._getnative: 3.9.1
-lodash._reescape: 3.0.0
-lodash._isiterateecall: 3.0.9
-lodash._reevaluate: 3.0.0
-lodash._reinterpolate: 3.0.0
-lodash.isarguments: 3.1.0
-lodash.escape: 3.2.0
-lodash.isarray: 3.0.4
-lodash.keys: 3.1.2
-lodash._root: 3.0.1
-lodash.restparam: 3.6.1
-lodash.template: 3.6.2
-lodash.templatesettings: 3.1.1
-lodash.isstring: 4.0.1
-lodash.mapvalues: 4.6.0
-lodash.isplainobject: 4.0.6
-lru-cache: 2.7.3
-longest: 1.0.1
-lolex: 1.3.2
-map-cache: 0.2.2
-lowercase-keys: 1.0.0
-media-typer: 0.3.0
-methods: 1.1.2
-mime-db: 1.30.0
-micromatch: 2.3.11
-minimist: 1.2.0
-minimatch: 3.0.4
-multipipe: 0.1.2
-mime-types: 2.1.17
-merge-descriptors: 1.0.1
-ms: 2.0.0
-natives: 1.1.0
-mute-stream: 0.0.5
-natural-compare: 1.4.0
-multer: 1.3.0
-node-int64: 0.3.3
-node-status-codes: 1.0.0
-negotiator: 0.6.1
-normalize-package-data: 1.0.3
-nomnom: 1.8.1
-nodegit-promise: 4.0.0
-oauth-sign: 0.8.2
-number-is-nan: 1.0.1
-object-assign: 4.1.1
-object-component: 0.0.3
-once: 1.4.0
-object.defaults: 1.1.0
-normalize-path: 2.1.1
-onetime: 1.1.0
-orchestrator: 0.3.8
-on-finished: 2.3.0
-os-homedir: 1.0.2
-object.pick: 1.3.0
-ordered-read-streams: 0.1.0
-options: 0.0.6
-package-json: 2.4.0
-object.omit: 2.0.1
-os-tmpdir: 1.0.2
-osenv: 0.1.4
-optionator: 0.8.2
-parse5: 1.5.1
-parse-filepath: 1.0.1
-parse-glob: 3.0.4
-parseqs: 0.0.5
-path-is-absolute: 1.0.1
-parse-json: 2.2.0
-parse-passwd: 1.0.0
-parseurl: 1.3.2
-parseuri: 0.0.5
-parsejson: 0.0.3
-path-root-regex: 0.1.2
-path-posix: 1.0.0
-pify: 2.3.0
-path-parse: 1.0.5
-pinkie-promise: 2.0.1
-path-to-regexp: 0.1.7
-plugin-error: 0.1.2
-path-root: 0.1.1
-polyclean: 1.3.1
-pinkie: 2.0.4
-prelude-ls: 1.1.2
-pluralize: 1.2.1
-plist: 2.1.0
-process-nextick-args: 1.0.7
-pend: 1.2.0
-prepend-http: 1.0.4
-pretty-hrtime: 1.0.3
-promisify-node: 0.4.0
-preserve: 0.2.0
-proxy-addr: 2.0.2
-punycode: 1.4.1
-progress: 1.1.8
-randomatic: 1.1.7
-q: 1.5.0
-qs: 6.5.1
-range-parser: 1.2.0
-readable-stream: 2.3.3
-read-package-json: 1.3.3
-read-installed: 3.1.5
-read-all-stream: 3.1.0
-readdir-scoped-modules: 1.0.2
-readline2: 1.0.1
-raw-body: 2.3.2
-rechoir: 0.6.2
-regenerator-runtime: 0.10.5
-registry-auth-token: 3.3.1
-regex-cache: 0.4.4
-remove-trailing-separator: 1.1.0
-registry-url: 3.1.0
-repeat-element: 1.1.2
-replacestream: 4.0.3
-replace-ext: 0.0.1
-repeat-string: 1.6.1
-resolve-from: 1.0.1
-require-uncached: 1.0.3
-resolve-dir: 0.1.1
-repeating: 2.0.1
-run-sequence: 1.2.2
-request: 2.79.0
-restore-cursor: 1.0.1
-run-async: 0.1.0
-safe-buffer: 5.1.1
-right-align: 0.1.3
-samsam: 1.1.2
-rx-lite: 3.1.2
-sauce-connect-launcher: 1.2.2
-sequencify: 0.0.7
-serve-static: 1.13.1
-send: 0.11.1
-resolve: 1.4.0
-semver-diff: 2.1.0
-sigmund: 1.0.1
-setprototypeof: 1.0.3
-slide: 1.1.6
-server-destroy: 1.0.1
-sinon-chai: 2.14.0
-serve-waterfall: 1.1.1
-sinon: 1.17.7
-sparkles: 1.0.0
-sntp: 1.0.9
-socket.io-client: 1.7.4
-source-map: 0.5.7
-socket.io-adapter: 0.5.0
-slice-ansi: 0.0.4
-sprintf-js: 1.0.3
-socket.io: 1.7.4
-stream-combiner: 0.2.2
-statuses: 1.3.1
-stream-consume: 0.1.0
-strip-ansi: 3.0.1
-stacky: 1.3.1
-socket.io-parser: 2.3.1
-streamsearch: 0.1.2
-string-width: 1.0.2
-strip-json-comments: 2.0.1
-stringstream: 0.0.5
-string_decoder: 1.0.3
-supports-color: 2.0.0
-through: 2.3.8
-table: 3.8.3
-textextensions: 1.0.2
-test-fixture: 3.0.0-rc.1
-temp: 0.8.3
-through2: 2.0.3
-text-table: 0.2.0
-time-stamp: 1.1.0
-tildify: 1.2.0
-to-array: 0.1.4
-timed-out: 3.1.3
-tar-stream: 1.5.2
-to-iso-string: 0.0.2
-tunnel-agent: 0.4.3
-tough-cookie: 2.3.3
-tryit: 1.0.3
-type-check: 0.3.2
-type-detect: 1.0.0
-tweetnacl: 0.14.5
-type-is: 1.6.15
-typedarray: 0.0.6
-unique-stream: 1.0.0
-uglify-to-browserify: 1.0.2
-unc-path-regex: 0.1.2
-ultron: 1.0.2
-unpipe: 1.0.0
-underscore: 1.6.0
-update-notifier: 0.6.3
-underscore.string: 3.0.3
-unzip-response: 1.0.2
-util-deprecate: 1.0.2
-urijs: 1.16.1
-url-parse-lax: 1.0.0
-util: 0.10.3
-util-extend: 1.0.3
-uuid: 2.0.3
-utils-merge: 1.0.1
-v8flags: 2.1.1
-vinyl: 0.5.3
-vinyl-fs: 0.3.14
-vary: 1.1.2
-vargs: 0.1.0
-wct-local: 2.0.15
-wct-sauce: 1.8.6
-verror: 1.10.0
-wrappy: 1.0.2
-wordwrap: 1.0.0
-widest-line: 1.0.0
-write: 0.2.1
-window-size: 0.1.0
-ws: 1.1.4
-write-file-atomic: 1.3.4
-xdg-basedir: 2.0.0
-wtf-8: 1.0.0
-xtend: 4.0.1
-xmlbuilder: 8.2.2
-xmlhttprequest-ssl: 1.5.3
-xmldom: 0.1.27
-yeast: 0.1.2
-acorn: 5.1.2
-zip-stream: 0.5.2
-yargs: 3.10.0
-yauzl: 2.8.0
-escodegen: 1.9.0
-eslint: 3.19.0
-esprima: 4.0.0
-gulp: 3.9.1
-har-validator: 2.0.6
-js-yaml: 3.10.0
-mime: 1.4.1
-mkdirp: 0.5.1
-nopt: 3.0.6
-node-uuid: 1.4.8
-rc: 1.2.2
-rimraf: 2.6.2
-semver: 4.3.6
-selenium-standalone: 5.11.2
-shelljs: 0.7.8
-sshpk: 1.13.1
-strip-bom: 1.0.0
-uglify-js: 2.8.29
-user-home: 1.1.1
-vulcanize: 1.16.0
-wd: 0.3.12
-which: 1.3.0
-web-component-tester: 4.3.6
-
-REPO REVISIONS
-==============
-polymer-1.x: 62bd3503279b8e954467dc3cb4e739330b9dda10
-
-BUILD HASHES
-============
-polymer-mini.html: 41538c3e880a3db75fc80c61a8b9e5a3e831de7d
-polymer-micro.html: e64e86493573e21587fbed115ddc7187b778718e
-polymer.html: 34bc3eda3e3a732823d953a3f8eccc0910e5de61
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/polymer/polymer-micro.html b/systrace/catapult/third_party/polymer/components/polymer/polymer-micro.html
deleted file mode 100644
index 0944f7f..0000000
--- a/systrace/catapult/third_party/polymer/components/polymer/polymer-micro.html
+++ /dev/null
@@ -1,821 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><script>(function () {
-function resolve() {
-document.body.removeAttribute('unresolved');
-}
-if (window.WebComponents) {
-addEventListener('WebComponentsReady', resolve);
-} else {
-if (document.readyState === 'interactive' || document.readyState === 'complete') {
-resolve();
-} else {
-addEventListener('DOMContentLoaded', resolve);
-}
-}
-}());window.Polymer = {
-Settings: function () {
-var settings = window.Polymer || {};
-if (!settings.noUrlSettings) {
-var parts = location.search.slice(1).split('&');
-for (var i = 0, o; i < parts.length && (o = parts[i]); i++) {
-o = o.split('=');
-o[0] && (settings[o[0]] = o[1] || true);
-}
-}
-settings.wantShadow = settings.dom === 'shadow';
-settings.hasShadow = Boolean(Element.prototype.createShadowRoot);
-settings.nativeShadow = settings.hasShadow && !window.ShadowDOMPolyfill;
-settings.useShadow = settings.wantShadow && settings.hasShadow;
-settings.hasNativeImports = Boolean('import' in document.createElement('link'));
-settings.useNativeImports = settings.hasNativeImports;
-settings.useNativeCustomElements = !window.CustomElements || window.CustomElements.useNative;
-settings.useNativeShadow = settings.useShadow && settings.nativeShadow;
-settings.usePolyfillProto = !settings.useNativeCustomElements && !Object.__proto__;
-settings.hasNativeCSSProperties = !navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/) && window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)');
-settings.useNativeCSSProperties = settings.hasNativeCSSProperties && settings.lazyRegister && settings.useNativeCSSProperties;
-settings.isIE = navigator.userAgent.match('Trident');
-settings.passiveTouchGestures = settings.passiveTouchGestures || false;
-return settings;
-}()
-};(function () {
-var userPolymer = window.Polymer;
-window.Polymer = function (prototype) {
-if (typeof prototype === 'function') {
-prototype = prototype.prototype;
-}
-if (!prototype) {
-prototype = {};
-}
-prototype = desugar(prototype);
-var customCtor = prototype === prototype.constructor.prototype ? prototype.constructor : null;
-var options = { prototype: prototype };
-if (prototype.extends) {
-options.extends = prototype.extends;
-}
-Polymer.telemetry._registrate(prototype);
-var ctor = document.registerElement(prototype.is, options);
-return customCtor || ctor;
-};
-var desugar = function (prototype) {
-var base = Polymer.Base;
-if (prototype.extends) {
-base = Polymer.Base._getExtendedPrototype(prototype.extends);
-}
-prototype = Polymer.Base.chainObject(prototype, base);
-prototype.registerCallback();
-return prototype;
-};
-if (userPolymer) {
-for (var i in userPolymer) {
-Polymer[i] = userPolymer[i];
-}
-}
-Polymer.Class = function (prototype) {
-if (!prototype.factoryImpl) {
-prototype.factoryImpl = function () {
-};
-}
-return desugar(prototype).constructor;
-};
-}());
-Polymer.telemetry = {
-registrations: [],
-_regLog: function (prototype) {
-console.log('[' + prototype.is + ']: registered');
-},
-_registrate: function (prototype) {
-this.registrations.push(prototype);
-Polymer.log && this._regLog(prototype);
-},
-dumpRegistrations: function () {
-this.registrations.forEach(this._regLog);
-}
-};Object.defineProperty(window, 'currentImport', {
-enumerable: true,
-configurable: true,
-get: function () {
-return (document._currentScript || document.currentScript || {}).ownerDocument;
-}
-});Polymer.RenderStatus = {
-_ready: false,
-_callbacks: [],
-whenReady: function (cb) {
-if (this._ready) {
-cb();
-} else {
-this._callbacks.push(cb);
-}
-},
-_makeReady: function () {
-this._ready = true;
-for (var i = 0; i < this._callbacks.length; i++) {
-this._callbacks[i]();
-}
-this._callbacks = [];
-},
-_catchFirstRender: function () {
-requestAnimationFrame(function () {
-Polymer.RenderStatus._makeReady();
-});
-},
-_afterNextRenderQueue: [],
-_waitingNextRender: false,
-afterNextRender: function (element, fn, args) {
-this._watchNextRender();
-this._afterNextRenderQueue.push([
-element,
-fn,
-args
-]);
-},
-hasRendered: function () {
-return this._ready;
-},
-_watchNextRender: function () {
-if (!this._waitingNextRender) {
-this._waitingNextRender = true;
-var fn = function () {
-Polymer.RenderStatus._flushNextRender();
-};
-if (!this._ready) {
-this.whenReady(fn);
-} else {
-requestAnimationFrame(fn);
-}
-}
-},
-_flushNextRender: function () {
-var self = this;
-setTimeout(function () {
-self._flushRenderCallbacks(self._afterNextRenderQueue);
-self._afterNextRenderQueue = [];
-self._waitingNextRender = false;
-});
-},
-_flushRenderCallbacks: function (callbacks) {
-for (var i = 0, h; i < callbacks.length; i++) {
-h = callbacks[i];
-h[1].apply(h[0], h[2] || Polymer.nar);
-}
-}
-};
-if (window.HTMLImports) {
-HTMLImports.whenReady(function () {
-Polymer.RenderStatus._catchFirstRender();
-});
-} else {
-Polymer.RenderStatus._catchFirstRender();
-}
-Polymer.ImportStatus = Polymer.RenderStatus;
-Polymer.ImportStatus.whenLoaded = Polymer.ImportStatus.whenReady;(function () {
-'use strict';
-var settings = Polymer.Settings;
-Polymer.Base = {
-__isPolymerInstance__: true,
-_addFeature: function (feature) {
-this.mixin(this, feature);
-},
-registerCallback: function () {
-if (settings.lazyRegister === 'max') {
-if (this.beforeRegister) {
-this.beforeRegister();
-}
-} else {
-this._desugarBehaviors();
-for (var i = 0, b; i < this.behaviors.length; i++) {
-b = this.behaviors[i];
-if (b.beforeRegister) {
-b.beforeRegister.call(this);
-}
-}
-if (this.beforeRegister) {
-this.beforeRegister();
-}
-}
-this._registerFeatures();
-if (!settings.lazyRegister) {
-this.ensureRegisterFinished();
-}
-},
-createdCallback: function () {
-if (settings.disableUpgradeEnabled) {
-if (this.hasAttribute('disable-upgrade')) {
-this._propertySetter = disableUpgradePropertySetter;
-this._configValue = null;
-this.__data__ = {};
-return;
-} else {
-this.__hasInitialized = true;
-}
-}
-this.__initialize();
-},
-__initialize: function () {
-if (!this.__hasRegisterFinished) {
-this._ensureRegisterFinished(this.__proto__);
-}
-Polymer.telemetry.instanceCount++;
-this.root = this;
-for (var i = 0, b; i < this.behaviors.length; i++) {
-b = this.behaviors[i];
-if (b.created) {
-b.created.call(this);
-}
-}
-if (this.created) {
-this.created();
-}
-this._initFeatures();
-},
-ensureRegisterFinished: function () {
-this._ensureRegisterFinished(this);
-},
-_ensureRegisterFinished: function (proto) {
-if (proto.__hasRegisterFinished !== proto.is || !proto.is) {
-if (settings.lazyRegister === 'max') {
-proto._desugarBehaviors();
-for (var i = 0, b; i < proto.behaviors.length; i++) {
-b = proto.behaviors[i];
-if (b.beforeRegister) {
-b.beforeRegister.call(proto);
-}
-}
-}
-proto.__hasRegisterFinished = proto.is;
-if (proto._finishRegisterFeatures) {
-proto._finishRegisterFeatures();
-}
-for (var j = 0, pb; j < proto.behaviors.length; j++) {
-pb = proto.behaviors[j];
-if (pb.registered) {
-pb.registered.call(proto);
-}
-}
-if (proto.registered) {
-proto.registered();
-}
-if (settings.usePolyfillProto && proto !== this) {
-proto.extend(this, proto);
-}
-}
-},
-attachedCallback: function () {
-var self = this;
-Polymer.RenderStatus.whenReady(function () {
-self.isAttached = true;
-for (var i = 0, b; i < self.behaviors.length; i++) {
-b = self.behaviors[i];
-if (b.attached) {
-b.attached.call(self);
-}
-}
-if (self.attached) {
-self.attached();
-}
-});
-},
-detachedCallback: function () {
-var self = this;
-Polymer.RenderStatus.whenReady(function () {
-self.isAttached = false;
-for (var i = 0, b; i < self.behaviors.length; i++) {
-b = self.behaviors[i];
-if (b.detached) {
-b.detached.call(self);
-}
-}
-if (self.detached) {
-self.detached();
-}
-});
-},
-attributeChangedCallback: function (name, oldValue, newValue) {
-this._attributeChangedImpl(name);
-for (var i = 0, b; i < this.behaviors.length; i++) {
-b = this.behaviors[i];
-if (b.attributeChanged) {
-b.attributeChanged.call(this, name, oldValue, newValue);
-}
-}
-if (this.attributeChanged) {
-this.attributeChanged(name, oldValue, newValue);
-}
-},
-_attributeChangedImpl: function (name) {
-this._setAttributeToProperty(this, name);
-},
-extend: function (target, source) {
-if (target && source) {
-var n$ = Object.getOwnPropertyNames(source);
-for (var i = 0, n; i < n$.length && (n = n$[i]); i++) {
-this.copyOwnProperty(n, source, target);
-}
-}
-return target || source;
-},
-mixin: function (target, source) {
-for (var i in source) {
-target[i] = source[i];
-}
-return target;
-},
-copyOwnProperty: function (name, source, target) {
-var pd = Object.getOwnPropertyDescriptor(source, name);
-if (pd) {
-Object.defineProperty(target, name, pd);
-}
-},
-_logger: function (level, args) {
-if (args.length === 1 && Array.isArray(args[0])) {
-args = args[0];
-}
-switch (level) {
-case 'log':
-case 'warn':
-case 'error':
-console[level].apply(console, args);
-break;
-}
-},
-_log: function () {
-var args = Array.prototype.slice.call(arguments, 0);
-this._logger('log', args);
-},
-_warn: function () {
-var args = Array.prototype.slice.call(arguments, 0);
-this._logger('warn', args);
-},
-_error: function () {
-var args = Array.prototype.slice.call(arguments, 0);
-this._logger('error', args);
-},
-_logf: function () {
-return this._logPrefix.concat(this.is).concat(Array.prototype.slice.call(arguments, 0));
-}
-};
-Polymer.Base._logPrefix = function () {
-var color = window.chrome && !/edge/i.test(navigator.userAgent) || /firefox/i.test(navigator.userAgent);
-return color ? [
-'%c[%s::%s]:',
-'font-weight: bold; background-color:#EEEE00;'
-] : ['[%s::%s]:'];
-}();
-Polymer.Base.chainObject = function (object, inherited) {
-if (object && inherited && object !== inherited) {
-if (!Object.__proto__) {
-object = Polymer.Base.extend(Object.create(inherited), object);
-}
-object.__proto__ = inherited;
-}
-return object;
-};
-Polymer.Base = Polymer.Base.chainObject(Polymer.Base, HTMLElement.prototype);
-Polymer.BaseDescriptors = {};
-var disableUpgradePropertySetter;
-if (settings.disableUpgradeEnabled) {
-disableUpgradePropertySetter = function (property, value) {
-this.__data__[property] = value;
-};
-var origAttributeChangedCallback = Polymer.Base.attributeChangedCallback;
-Polymer.Base.attributeChangedCallback = function (name, oldValue, newValue) {
-if (!this.__hasInitialized && name === 'disable-upgrade') {
-this.__hasInitialized = true;
-this._propertySetter = Polymer.Bind._modelApi._propertySetter;
-this._configValue = Polymer.Base._configValue;
-this.__initialize();
-}
-origAttributeChangedCallback.call(this, name, oldValue, newValue);
-};
-}
-if (window.CustomElements) {
-Polymer.instanceof = CustomElements.instanceof;
-} else {
-Polymer.instanceof = function (obj, ctor) {
-return obj instanceof ctor;
-};
-}
-Polymer.isInstance = function (obj) {
-return Boolean(obj && obj.__isPolymerInstance__);
-};
-Polymer.telemetry.instanceCount = 0;
-}());(function () {
-var modules = {};
-var lcModules = {};
-var findModule = function (id) {
-return modules[id] || lcModules[id.toLowerCase()];
-};
-var DomModule = function () {
-return document.createElement('dom-module');
-};
-DomModule.prototype = Object.create(HTMLElement.prototype);
-Polymer.Base.mixin(DomModule.prototype, {
-createdCallback: function () {
-this.register();
-},
-register: function (id) {
-id = id || this.id || this.getAttribute('name') || this.getAttribute('is');
-if (id) {
-this.id = id;
-modules[id] = this;
-lcModules[id.toLowerCase()] = this;
-}
-},
-import: function (id, selector) {
-if (id) {
-var m = findModule(id);
-if (!m) {
-forceDomModulesUpgrade();
-m = findModule(id);
-}
-if (m && selector) {
-m = m.querySelector(selector);
-}
-return m;
-}
-}
-});
-Object.defineProperty(DomModule.prototype, 'constructor', {
-value: DomModule,
-configurable: true,
-writable: true
-});
-var cePolyfill = window.CustomElements && !CustomElements.useNative;
-document.registerElement('dom-module', DomModule);
-function forceDomModulesUpgrade() {
-if (cePolyfill) {
-var script = document._currentScript || document.currentScript;
-var doc = script && script.ownerDocument || document;
-var modules = doc.querySelectorAll('dom-module');
-for (var i = modules.length - 1, m; i >= 0 && (m = modules[i]); i--) {
-if (m.__upgraded__) {
-return;
-} else {
-CustomElements.upgrade(m);
-}
-}
-}
-}
-}());Polymer.Base._addFeature({
-_prepIs: function () {
-if (!this.is) {
-var module = (document._currentScript || document.currentScript).parentNode;
-if (module.localName === 'dom-module') {
-var id = module.id || module.getAttribute('name') || module.getAttribute('is');
-this.is = id;
-}
-}
-if (this.is) {
-this.is = this.is.toLowerCase();
-}
-}
-});Polymer.Base._addFeature({
-behaviors: [],
-_desugarBehaviors: function () {
-if (this.behaviors.length) {
-this.behaviors = this._desugarSomeBehaviors(this.behaviors);
-}
-},
-_desugarSomeBehaviors: function (behaviors) {
-var behaviorSet = [];
-behaviors = this._flattenBehaviorsList(behaviors);
-for (var i = behaviors.length - 1; i >= 0; i--) {
-var b = behaviors[i];
-if (behaviorSet.indexOf(b) === -1) {
-this._mixinBehavior(b);
-behaviorSet.unshift(b);
-}
-}
-return behaviorSet;
-},
-_flattenBehaviorsList: function (behaviors) {
-var flat = [];
-for (var i = 0; i < behaviors.length; i++) {
-var b = behaviors[i];
-if (b instanceof Array) {
-flat = flat.concat(this._flattenBehaviorsList(b));
-} else if (b) {
-flat.push(b);
-} else {
-this._warn(this._logf('_flattenBehaviorsList', 'behavior is null, check for missing or 404 import'));
-}
-}
-return flat;
-},
-_mixinBehavior: function (b) {
-var n$ = Object.getOwnPropertyNames(b);
-var useAssignment = b._noAccessors;
-for (var i = 0, n; i < n$.length && (n = n$[i]); i++) {
-if (!Polymer.Base._behaviorProperties[n] && !this.hasOwnProperty(n)) {
-if (useAssignment) {
-this[n] = b[n];
-} else {
-this.copyOwnProperty(n, b, this);
-}
-}
-}
-},
-_prepBehaviors: function () {
-this._prepFlattenedBehaviors(this.behaviors);
-},
-_prepFlattenedBehaviors: function (behaviors) {
-for (var i = 0, l = behaviors.length; i < l; i++) {
-this._prepBehavior(behaviors[i]);
-}
-this._prepBehavior(this);
-},
-_marshalBehaviors: function () {
-for (var i = 0; i < this.behaviors.length; i++) {
-this._marshalBehavior(this.behaviors[i]);
-}
-this._marshalBehavior(this);
-}
-});
-Polymer.Base._behaviorProperties = {
-hostAttributes: true,
-beforeRegister: true,
-registered: true,
-properties: true,
-observers: true,
-listeners: true,
-created: true,
-attached: true,
-detached: true,
-attributeChanged: true,
-ready: true,
-_noAccessors: true
-};Polymer.Base._addFeature({
-_getExtendedPrototype: function (tag) {
-return this._getExtendedNativePrototype(tag);
-},
-_nativePrototypes: {},
-_getExtendedNativePrototype: function (tag) {
-var p = this._nativePrototypes[tag];
-if (!p) {
-p = Object.create(this.getNativePrototype(tag));
-var p$ = Object.getOwnPropertyNames(Polymer.Base);
-for (var i = 0, n; i < p$.length && (n = p$[i]); i++) {
-if (!Polymer.BaseDescriptors[n]) {
-p[n] = Polymer.Base[n];
-}
-}
-Object.defineProperties(p, Polymer.BaseDescriptors);
-this._nativePrototypes[tag] = p;
-}
-return p;
-},
-getNativePrototype: function (tag) {
-return Object.getPrototypeOf(document.createElement(tag));
-}
-});Polymer.Base._addFeature({
-_prepConstructor: function () {
-this._factoryArgs = this.extends ? [
-this.extends,
-this.is
-] : [this.is];
-var ctor = function () {
-return this._factory(arguments);
-};
-if (this.hasOwnProperty('extends')) {
-ctor.extends = this.extends;
-}
-Object.defineProperty(this, 'constructor', {
-value: ctor,
-writable: true,
-configurable: true
-});
-ctor.prototype = this;
-},
-_factory: function (args) {
-var elt = document.createElement.apply(document, this._factoryArgs);
-if (this.factoryImpl) {
-this.factoryImpl.apply(elt, args);
-}
-return elt;
-}
-});Polymer.nob = Object.create(null);
-Polymer.Base._addFeature({
-getPropertyInfo: function (property) {
-var info = this._getPropertyInfo(property, this.properties);
-if (!info) {
-for (var i = 0; i < this.behaviors.length; i++) {
-info = this._getPropertyInfo(property, this.behaviors[i].properties);
-if (info) {
-return info;
-}
-}
-}
-return info || Polymer.nob;
-},
-_getPropertyInfo: function (property, properties) {
-var p = properties && properties[property];
-if (typeof p === 'function') {
-p = properties[property] = { type: p };
-}
-if (p) {
-p.defined = true;
-}
-return p;
-},
-_prepPropertyInfo: function () {
-this._propertyInfo = {};
-for (var i = 0; i < this.behaviors.length; i++) {
-this._addPropertyInfo(this._propertyInfo, this.behaviors[i].properties);
-}
-this._addPropertyInfo(this._propertyInfo, this.properties);
-this._addPropertyInfo(this._propertyInfo, this._propertyEffects);
-},
-_addPropertyInfo: function (target, source) {
-if (source) {
-var t, s;
-for (var i in source) {
-t = target[i];
-s = source[i];
-if (i[0] === '_' && !s.readOnly) {
-continue;
-}
-if (!target[i]) {
-target[i] = {
-type: typeof s === 'function' ? s : s.type,
-readOnly: s.readOnly,
-attribute: Polymer.CaseMap.camelToDashCase(i)
-};
-} else {
-if (!t.type) {
-t.type = s.type;
-}
-if (!t.readOnly) {
-t.readOnly = s.readOnly;
-}
-}
-}
-}
-}
-});
-(function () {
-var propertiesDesc = {
-configurable: true,
-writable: true,
-enumerable: true,
-value: {}
-};
-Polymer.BaseDescriptors.properties = propertiesDesc;
-Object.defineProperty(Polymer.Base, 'properties', propertiesDesc);
-}());Polymer.CaseMap = {
-_caseMap: {},
-_rx: {
-dashToCamel: /-[a-z]/g,
-camelToDash: /([A-Z])/g
-},
-dashToCamelCase: function (dash) {
-return this._caseMap[dash] || (this._caseMap[dash] = dash.indexOf('-') < 0 ? dash : dash.replace(this._rx.dashToCamel, function (m) {
-return m[1].toUpperCase();
-}));
-},
-camelToDashCase: function (camel) {
-return this._caseMap[camel] || (this._caseMap[camel] = camel.replace(this._rx.camelToDash, '-$1').toLowerCase());
-}
-};Polymer.Base._addFeature({
-_addHostAttributes: function (attributes) {
-if (!this._aggregatedAttributes) {
-this._aggregatedAttributes = {};
-}
-if (attributes) {
-this.mixin(this._aggregatedAttributes, attributes);
-}
-},
-_marshalHostAttributes: function () {
-if (this._aggregatedAttributes) {
-this._applyAttributes(this, this._aggregatedAttributes);
-}
-},
-_applyAttributes: function (node, attr$) {
-for (var n in attr$) {
-if (!this.hasAttribute(n) && n !== 'class') {
-var v = attr$[n];
-this.serializeValueToAttribute(v, n, this);
-}
-}
-},
-_marshalAttributes: function () {
-this._takeAttributesToModel(this);
-},
-_takeAttributesToModel: function (model) {
-if (this.hasAttributes()) {
-for (var i in this._propertyInfo) {
-var info = this._propertyInfo[i];
-if (this.hasAttribute(info.attribute)) {
-this._setAttributeToProperty(model, info.attribute, i, info);
-}
-}
-}
-},
-_setAttributeToProperty: function (model, attribute, property, info) {
-if (!this._serializing) {
-property = property || Polymer.CaseMap.dashToCamelCase(attribute);
-info = info || this._propertyInfo && this._propertyInfo[property];
-if (info && !info.readOnly) {
-var v = this.getAttribute(attribute);
-model[property] = this.deserialize(v, info.type);
-}
-}
-},
-_serializing: false,
-reflectPropertyToAttribute: function (property, attribute, value) {
-this._serializing = true;
-value = value === undefined ? this[property] : value;
-this.serializeValueToAttribute(value, attribute || Polymer.CaseMap.camelToDashCase(property));
-this._serializing = false;
-},
-serializeValueToAttribute: function (value, attribute, node) {
-var str = this.serialize(value);
-node = node || this;
-if (str === undefined) {
-node.removeAttribute(attribute);
-} else {
-node.setAttribute(attribute, str);
-}
-},
-deserialize: function (value, type) {
-switch (type) {
-case Number:
-value = Number(value);
-break;
-case Boolean:
-value = value != null;
-break;
-case Object:
-try {
-value = JSON.parse(value);
-} catch (x) {
-}
-break;
-case Array:
-try {
-value = JSON.parse(value);
-} catch (x) {
-value = null;
-console.warn('Polymer::Attributes: couldn`t decode Array as JSON');
-}
-break;
-case Date:
-value = new Date(value);
-break;
-case String:
-default:
-break;
-}
-return value;
-},
-serialize: function (value) {
-switch (typeof value) {
-case 'boolean':
-return value ? '' : undefined;
-case 'object':
-if (value instanceof Date) {
-return value.toString();
-} else if (value) {
-try {
-return JSON.stringify(value);
-} catch (x) {
-return '';
-}
-}
-default:
-return value != null ? value : undefined;
-}
-}
-});Polymer.version = "1.11.3";Polymer.Base._addFeature({
-_registerFeatures: function () {
-this._prepIs();
-this._prepBehaviors();
-this._prepConstructor();
-this._prepPropertyInfo();
-},
-_prepBehavior: function (b) {
-this._addHostAttributes(b.hostAttributes);
-},
-_marshalBehavior: function (b) {
-},
-_initFeatures: function () {
-this._marshalHostAttributes();
-this._marshalBehaviors();
-}
-});</script>
-
-
-
-
-
-
-
-
-
-
-
diff --git a/systrace/catapult/third_party/polymer/components/polymer/polymer-mini.html b/systrace/catapult/third_party/polymer/components/polymer/polymer-mini.html
deleted file mode 100644
index ac250d7..0000000
--- a/systrace/catapult/third_party/polymer/components/polymer/polymer-mini.html
+++ /dev/null
@@ -1,2246 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><link rel="import" href="polymer-micro.html"><script>(function () {
-function resolveCss(cssText, ownerDocument) {
-return cssText.replace(CSS_URL_RX, function (m, pre, url, post) {
-return pre + '\'' + resolve(url.replace(/["']/g, ''), ownerDocument) + '\'' + post;
-});
-}
-function resolveAttrs(element, ownerDocument) {
-for (var name in URL_ATTRS) {
-var a$ = URL_ATTRS[name];
-for (var i = 0, l = a$.length, a, at, v; i < l && (a = a$[i]); i++) {
-if (name === '*' || element.localName === name) {
-at = element.attributes[a];
-v = at && at.value;
-if (v && v.search(BINDING_RX) < 0) {
-at.value = a === 'style' ? resolveCss(v, ownerDocument) : resolve(v, ownerDocument);
-}
-}
-}
-}
-}
-function resolve(url, ownerDocument) {
-if (url && ABS_URL.test(url)) {
-return url;
-}
-var resolver = getUrlResolver(ownerDocument);
-resolver.href = url;
-return resolver.href || url;
-}
-var tempDoc;
-var tempDocBase;
-function resolveUrl(url, baseUri) {
-if (!tempDoc) {
-tempDoc = document.implementation.createHTMLDocument('temp');
-tempDocBase = tempDoc.createElement('base');
-tempDoc.head.appendChild(tempDocBase);
-}
-tempDocBase.href = baseUri;
-return resolve(url, tempDoc);
-}
-function getUrlResolver(ownerDocument) {
-return ownerDocument.body.__urlResolver || (ownerDocument.body.__urlResolver = ownerDocument.createElement('a'));
-}
-function pathFromUrl(url) {
-return url.substring(0, url.lastIndexOf('/') + 1);
-}
-var CSS_URL_RX = /(url\()([^)]*)(\))/g;
-var URL_ATTRS = {
-'*': [
-'href',
-'src',
-'style',
-'url'
-],
-form: ['action']
-};
-var ABS_URL = /(^\/)|(^#)|(^[\w-\d]*:)/;
-var BINDING_RX = /\{\{|\[\[/;
-Polymer.ResolveUrl = {
-resolveCss: resolveCss,
-resolveAttrs: resolveAttrs,
-resolveUrl: resolveUrl,
-pathFromUrl: pathFromUrl
-};
-Polymer.rootPath = Polymer.Settings.rootPath || pathFromUrl(document.baseURI || window.location.href);
-}());Polymer.Base._addFeature({
-_prepTemplate: function () {
-var module;
-if (this._template === undefined) {
-module = Polymer.DomModule.import(this.is);
-this._template = module && module.querySelector('template');
-}
-if (module) {
-var assetPath = module.getAttribute('assetpath') || '';
-var importURL = Polymer.ResolveUrl.resolveUrl(assetPath, module.ownerDocument.baseURI);
-this._importPath = Polymer.ResolveUrl.pathFromUrl(importURL);
-} else {
-this._importPath = '';
-}
-if (this._template && this._template.hasAttribute('is')) {
-this._warn(this._logf('_prepTemplate', 'top-level Polymer template ' + 'must not be a type-extension, found', this._template, 'Move inside simple <template>.'));
-}
-if (this._template && !this._template.content && window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
-HTMLTemplateElement.decorate(this._template);
-}
-},
-_stampTemplate: function () {
-if (this._template) {
-this.root = this.instanceTemplate(this._template);
-}
-},
-instanceTemplate: function (template) {
-var dom = document.importNode(template._content || template.content, true);
-return dom;
-}
-});(function () {
-var baseAttachedCallback = Polymer.Base.attachedCallback;
-var baseDetachedCallback = Polymer.Base.detachedCallback;
-Polymer.Base._addFeature({
-_hostStack: [],
-ready: function () {
-},
-_registerHost: function (host) {
-this.dataHost = host = host || Polymer.Base._hostStack[Polymer.Base._hostStack.length - 1];
-if (host && host._clients) {
-host._clients.push(this);
-}
-this._clients = null;
-this._clientsReadied = false;
-},
-_beginHosting: function () {
-Polymer.Base._hostStack.push(this);
-if (!this._clients) {
-this._clients = [];
-}
-},
-_endHosting: function () {
-Polymer.Base._hostStack.pop();
-},
-_tryReady: function () {
-this._readied = false;
-if (this._canReady()) {
-this._ready();
-}
-},
-_canReady: function () {
-return !this.dataHost || this.dataHost._clientsReadied;
-},
-_ready: function () {
-this._beforeClientsReady();
-if (this._template) {
-this._setupRoot();
-this._readyClients();
-}
-this._clientsReadied = true;
-this._clients = null;
-this._afterClientsReady();
-this._readySelf();
-},
-_readyClients: function () {
-this._beginDistribute();
-var c$ = this._clients;
-if (c$) {
-for (var i = 0, l = c$.length, c; i < l && (c = c$[i]); i++) {
-c._ready();
-}
-}
-this._finishDistribute();
-},
-_readySelf: function () {
-for (var i = 0, b; i < this.behaviors.length; i++) {
-b = this.behaviors[i];
-if (b.ready) {
-b.ready.call(this);
-}
-}
-if (this.ready) {
-this.ready();
-}
-this._readied = true;
-if (this._attachedPending) {
-this._attachedPending = false;
-this.attachedCallback();
-}
-},
-_beforeClientsReady: function () {
-},
-_afterClientsReady: function () {
-},
-_beforeAttached: function () {
-},
-attachedCallback: function () {
-if (this._readied) {
-this._beforeAttached();
-baseAttachedCallback.call(this);
-} else {
-this._attachedPending = true;
-}
-},
-detachedCallback: function () {
-if (this._readied) {
-baseDetachedCallback.call(this);
-} else {
-this._attachedPending = false;
-}
-}
-});
-}());Polymer.ArraySplice = function () {
-function newSplice(index, removed, addedCount) {
-return {
-index: index,
-removed: removed,
-addedCount: addedCount
-};
-}
-var EDIT_LEAVE = 0;
-var EDIT_UPDATE = 1;
-var EDIT_ADD = 2;
-var EDIT_DELETE = 3;
-function ArraySplice() {
-}
-ArraySplice.prototype = {
-calcEditDistances: function (current, currentStart, currentEnd, old, oldStart, oldEnd) {
-var rowCount = oldEnd - oldStart + 1;
-var columnCount = currentEnd - currentStart + 1;
-var distances = new Array(rowCount);
-for (var i = 0; i < rowCount; i++) {
-distances[i] = new Array(columnCount);
-distances[i][0] = i;
-}
-for (var j = 0; j < columnCount; j++)
-distances[0][j] = j;
-for (i = 1; i < rowCount; i++) {
-for (j = 1; j < columnCount; j++) {
-if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
-distances[i][j] = distances[i - 1][j - 1];
-else {
-var north = distances[i - 1][j] + 1;
-var west = distances[i][j - 1] + 1;
-distances[i][j] = north < west ? north : west;
-}
-}
-}
-return distances;
-},
-spliceOperationsFromEditDistances: function (distances) {
-var i = distances.length - 1;
-var j = distances[0].length - 1;
-var current = distances[i][j];
-var edits = [];
-while (i > 0 || j > 0) {
-if (i == 0) {
-edits.push(EDIT_ADD);
-j--;
-continue;
-}
-if (j == 0) {
-edits.push(EDIT_DELETE);
-i--;
-continue;
-}
-var northWest = distances[i - 1][j - 1];
-var west = distances[i - 1][j];
-var north = distances[i][j - 1];
-var min;
-if (west < north)
-min = west < northWest ? west : northWest;
-else
-min = north < northWest ? north : northWest;
-if (min == northWest) {
-if (northWest == current) {
-edits.push(EDIT_LEAVE);
-} else {
-edits.push(EDIT_UPDATE);
-current = northWest;
-}
-i--;
-j--;
-} else if (min == west) {
-edits.push(EDIT_DELETE);
-i--;
-current = west;
-} else {
-edits.push(EDIT_ADD);
-j--;
-current = north;
-}
-}
-edits.reverse();
-return edits;
-},
-calcSplices: function (current, currentStart, currentEnd, old, oldStart, oldEnd) {
-var prefixCount = 0;
-var suffixCount = 0;
-var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-if (currentStart == 0 && oldStart == 0)
-prefixCount = this.sharedPrefix(current, old, minLength);
-if (currentEnd == current.length && oldEnd == old.length)
-suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-currentStart += prefixCount;
-oldStart += prefixCount;
-currentEnd -= suffixCount;
-oldEnd -= suffixCount;
-if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
-return [];
-if (currentStart == currentEnd) {
-var splice = newSplice(currentStart, [], 0);
-while (oldStart < oldEnd)
-splice.removed.push(old[oldStart++]);
-return [splice];
-} else if (oldStart == oldEnd)
-return [newSplice(currentStart, [], currentEnd - currentStart)];
-var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
-splice = undefined;
-var splices = [];
-var index = currentStart;
-var oldIndex = oldStart;
-for (var i = 0; i < ops.length; i++) {
-switch (ops[i]) {
-case EDIT_LEAVE:
-if (splice) {
-splices.push(splice);
-splice = undefined;
-}
-index++;
-oldIndex++;
-break;
-case EDIT_UPDATE:
-if (!splice)
-splice = newSplice(index, [], 0);
-splice.addedCount++;
-index++;
-splice.removed.push(old[oldIndex]);
-oldIndex++;
-break;
-case EDIT_ADD:
-if (!splice)
-splice = newSplice(index, [], 0);
-splice.addedCount++;
-index++;
-break;
-case EDIT_DELETE:
-if (!splice)
-splice = newSplice(index, [], 0);
-splice.removed.push(old[oldIndex]);
-oldIndex++;
-break;
-}
-}
-if (splice) {
-splices.push(splice);
-}
-return splices;
-},
-sharedPrefix: function (current, old, searchLength) {
-for (var i = 0; i < searchLength; i++)
-if (!this.equals(current[i], old[i]))
-return i;
-return searchLength;
-},
-sharedSuffix: function (current, old, searchLength) {
-var index1 = current.length;
-var index2 = old.length;
-var count = 0;
-while (count < searchLength && this.equals(current[--index1], old[--index2]))
-count++;
-return count;
-},
-calculateSplices: function (current, previous) {
-return this.calcSplices(current, 0, current.length, previous, 0, previous.length);
-},
-equals: function (currentValue, previousValue) {
-return currentValue === previousValue;
-}
-};
-return new ArraySplice();
-}();Polymer.domInnerHTML = function () {
-var escapeAttrRegExp = /[&\u00A0"]/g;
-var escapeDataRegExp = /[&\u00A0<>]/g;
-function escapeReplace(c) {
-switch (c) {
-case '&':
-return '&amp;';
-case '<':
-return '&lt;';
-case '>':
-return '&gt;';
-case '"':
-return '&quot;';
-case '\xA0':
-return '&nbsp;';
-}
-}
-function escapeAttr(s) {
-return s.replace(escapeAttrRegExp, escapeReplace);
-}
-function escapeData(s) {
-return s.replace(escapeDataRegExp, escapeReplace);
-}
-function makeSet(arr) {
-var set = {};
-for (var i = 0; i < arr.length; i++) {
-set[arr[i]] = true;
-}
-return set;
-}
-var voidElements = makeSet([
-'area',
-'base',
-'br',
-'col',
-'command',
-'embed',
-'hr',
-'img',
-'input',
-'keygen',
-'link',
-'meta',
-'param',
-'source',
-'track',
-'wbr'
-]);
-var plaintextParents = makeSet([
-'style',
-'script',
-'xmp',
-'iframe',
-'noembed',
-'noframes',
-'plaintext',
-'noscript'
-]);
-function getOuterHTML(node, parentNode, composed) {
-switch (node.nodeType) {
-case Node.ELEMENT_NODE:
-var tagName = node.localName;
-var s = '<' + tagName;
-var attrs = node.attributes;
-for (var i = 0, attr; attr = attrs[i]; i++) {
-s += ' ' + attr.name + '="' + escapeAttr(attr.value) + '"';
-}
-s += '>';
-if (voidElements[tagName]) {
-return s;
-}
-return s + getInnerHTML(node, composed) + '</' + tagName + '>';
-case Node.TEXT_NODE:
-var data = node.data;
-if (parentNode && plaintextParents[parentNode.localName]) {
-return data;
-}
-return escapeData(data);
-case Node.COMMENT_NODE:
-return '<!--' + node.data + '-->';
-default:
-console.error(node);
-throw new Error('not implemented');
-}
-}
-function getInnerHTML(node, composed) {
-if (node instanceof HTMLTemplateElement)
-node = node.content;
-var s = '';
-var c$ = Polymer.dom(node).childNodes;
-for (var i = 0, l = c$.length, child; i < l && (child = c$[i]); i++) {
-s += getOuterHTML(child, node, composed);
-}
-return s;
-}
-return { getInnerHTML: getInnerHTML };
-}();(function () {
-'use strict';
-var nativeInsertBefore = Element.prototype.insertBefore;
-var nativeAppendChild = Element.prototype.appendChild;
-var nativeRemoveChild = Element.prototype.removeChild;
-Polymer.TreeApi = {
-arrayCopyChildNodes: function (parent) {
-var copy = [], i = 0;
-for (var n = parent.firstChild; n; n = n.nextSibling) {
-copy[i++] = n;
-}
-return copy;
-},
-arrayCopyChildren: function (parent) {
-var copy = [], i = 0;
-for (var n = parent.firstElementChild; n; n = n.nextElementSibling) {
-copy[i++] = n;
-}
-return copy;
-},
-arrayCopy: function (a$) {
-var l = a$.length;
-var copy = new Array(l);
-for (var i = 0; i < l; i++) {
-copy[i] = a$[i];
-}
-return copy;
-}
-};
-Polymer.TreeApi.Logical = {
-hasParentNode: function (node) {
-return Boolean(node.__dom && node.__dom.parentNode);
-},
-hasChildNodes: function (node) {
-return Boolean(node.__dom && node.__dom.childNodes !== undefined);
-},
-getChildNodes: function (node) {
-return this.hasChildNodes(node) ? this._getChildNodes(node) : node.childNodes;
-},
-_getChildNodes: function (node) {
-if (!node.__dom.childNodes) {
-node.__dom.childNodes = [];
-for (var n = node.__dom.firstChild; n; n = n.__dom.nextSibling) {
-node.__dom.childNodes.push(n);
-}
-}
-return node.__dom.childNodes;
-},
-getParentNode: function (node) {
-return node.__dom && node.__dom.parentNode !== undefined ? node.__dom.parentNode : node.parentNode;
-},
-getFirstChild: function (node) {
-return node.__dom && node.__dom.firstChild !== undefined ? node.__dom.firstChild : node.firstChild;
-},
-getLastChild: function (node) {
-return node.__dom && node.__dom.lastChild !== undefined ? node.__dom.lastChild : node.lastChild;
-},
-getNextSibling: function (node) {
-return node.__dom && node.__dom.nextSibling !== undefined ? node.__dom.nextSibling : node.nextSibling;
-},
-getPreviousSibling: function (node) {
-return node.__dom && node.__dom.previousSibling !== undefined ? node.__dom.previousSibling : node.previousSibling;
-},
-getFirstElementChild: function (node) {
-return node.__dom && node.__dom.firstChild !== undefined ? this._getFirstElementChild(node) : node.firstElementChild;
-},
-_getFirstElementChild: function (node) {
-var n = node.__dom.firstChild;
-while (n && n.nodeType !== Node.ELEMENT_NODE) {
-n = n.__dom.nextSibling;
-}
-return n;
-},
-getLastElementChild: function (node) {
-return node.__dom && node.__dom.lastChild !== undefined ? this._getLastElementChild(node) : node.lastElementChild;
-},
-_getLastElementChild: function (node) {
-var n = node.__dom.lastChild;
-while (n && n.nodeType !== Node.ELEMENT_NODE) {
-n = n.__dom.previousSibling;
-}
-return n;
-},
-getNextElementSibling: function (node) {
-return node.__dom && node.__dom.nextSibling !== undefined ? this._getNextElementSibling(node) : node.nextElementSibling;
-},
-_getNextElementSibling: function (node) {
-var n = node.__dom.nextSibling;
-while (n && n.nodeType !== Node.ELEMENT_NODE) {
-n = n.__dom.nextSibling;
-}
-return n;
-},
-getPreviousElementSibling: function (node) {
-return node.__dom && node.__dom.previousSibling !== undefined ? this._getPreviousElementSibling(node) : node.previousElementSibling;
-},
-_getPreviousElementSibling: function (node) {
-var n = node.__dom.previousSibling;
-while (n && n.nodeType !== Node.ELEMENT_NODE) {
-n = n.__dom.previousSibling;
-}
-return n;
-},
-saveChildNodes: function (node) {
-if (!this.hasChildNodes(node)) {
-node.__dom = node.__dom || {};
-node.__dom.firstChild = node.firstChild;
-node.__dom.lastChild = node.lastChild;
-node.__dom.childNodes = [];
-for (var n = node.firstChild; n; n = n.nextSibling) {
-n.__dom = n.__dom || {};
-n.__dom.parentNode = node;
-node.__dom.childNodes.push(n);
-n.__dom.nextSibling = n.nextSibling;
-n.__dom.previousSibling = n.previousSibling;
-}
-}
-},
-recordInsertBefore: function (node, container, ref_node) {
-container.__dom.childNodes = null;
-if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
-for (var n = node.firstChild; n; n = n.nextSibling) {
-this._linkNode(n, container, ref_node);
-}
-} else {
-this._linkNode(node, container, ref_node);
-}
-},
-_linkNode: function (node, container, ref_node) {
-node.__dom = node.__dom || {};
-container.__dom = container.__dom || {};
-if (ref_node) {
-ref_node.__dom = ref_node.__dom || {};
-}
-node.__dom.previousSibling = ref_node ? ref_node.__dom.previousSibling : container.__dom.lastChild;
-if (node.__dom.previousSibling) {
-node.__dom.previousSibling.__dom.nextSibling = node;
-}
-node.__dom.nextSibling = ref_node || null;
-if (node.__dom.nextSibling) {
-node.__dom.nextSibling.__dom.previousSibling = node;
-}
-node.__dom.parentNode = container;
-if (ref_node) {
-if (ref_node === container.__dom.firstChild) {
-container.__dom.firstChild = node;
-}
-} else {
-container.__dom.lastChild = node;
-if (!container.__dom.firstChild) {
-container.__dom.firstChild = node;
-}
-}
-container.__dom.childNodes = null;
-},
-recordRemoveChild: function (node, container) {
-node.__dom = node.__dom || {};
-container.__dom = container.__dom || {};
-if (node === container.__dom.firstChild) {
-container.__dom.firstChild = node.__dom.nextSibling;
-}
-if (node === container.__dom.lastChild) {
-container.__dom.lastChild = node.__dom.previousSibling;
-}
-var p = node.__dom.previousSibling;
-var n = node.__dom.nextSibling;
-if (p) {
-p.__dom.nextSibling = n;
-}
-if (n) {
-n.__dom.previousSibling = p;
-}
-node.__dom.parentNode = node.__dom.previousSibling = node.__dom.nextSibling = undefined;
-container.__dom.childNodes = null;
-}
-};
-Polymer.TreeApi.Composed = {
-getChildNodes: function (node) {
-return Polymer.TreeApi.arrayCopyChildNodes(node);
-},
-getParentNode: function (node) {
-return node.parentNode;
-},
-clearChildNodes: function (node) {
-node.textContent = '';
-},
-insertBefore: function (parentNode, newChild, refChild) {
-return nativeInsertBefore.call(parentNode, newChild, refChild || null);
-},
-appendChild: function (parentNode, newChild) {
-return nativeAppendChild.call(parentNode, newChild);
-},
-removeChild: function (parentNode, node) {
-return nativeRemoveChild.call(parentNode, node);
-}
-};
-}());Polymer.DomApi = function () {
-'use strict';
-var Settings = Polymer.Settings;
-var TreeApi = Polymer.TreeApi;
-var DomApi = function (node) {
-this.node = needsToWrap ? DomApi.wrap(node) : node;
-};
-var needsToWrap = Settings.hasShadow && !Settings.nativeShadow;
-DomApi.wrap = window.wrap ? window.wrap : function (node) {
-return node;
-};
-DomApi.prototype = {
-flush: function () {
-Polymer.dom.flush();
-},
-deepContains: function (node) {
-if (this.node.contains(node)) {
-return true;
-}
-var n = node;
-var doc = node.ownerDocument;
-while (n && n !== doc && n !== this.node) {
-n = Polymer.dom(n).parentNode || n.host;
-}
-return n === this.node;
-},
-queryDistributedElements: function (selector) {
-var c$ = this.getEffectiveChildNodes();
-var list = [];
-for (var i = 0, l = c$.length, c; i < l && (c = c$[i]); i++) {
-if (c.nodeType === Node.ELEMENT_NODE && DomApi.matchesSelector.call(c, selector)) {
-list.push(c);
-}
-}
-return list;
-},
-getEffectiveChildNodes: function () {
-var list = [];
-var c$ = this.childNodes;
-for (var i = 0, l = c$.length, c; i < l && (c = c$[i]); i++) {
-if (c.localName === CONTENT) {
-var d$ = dom(c).getDistributedNodes();
-for (var j = 0; j < d$.length; j++) {
-list.push(d$[j]);
-}
-} else {
-list.push(c);
-}
-}
-return list;
-},
-observeNodes: function (callback) {
-if (callback) {
-if (!this.observer) {
-this.observer = this.node.localName === CONTENT ? new DomApi.DistributedNodesObserver(this) : new DomApi.EffectiveNodesObserver(this);
-}
-return this.observer.addListener(callback);
-}
-},
-unobserveNodes: function (handle) {
-if (this.observer) {
-this.observer.removeListener(handle);
-}
-},
-notifyObserver: function () {
-if (this.observer) {
-this.observer.notify();
-}
-},
-_query: function (matcher, node, halter) {
-node = node || this.node;
-var list = [];
-this._queryElements(TreeApi.Logical.getChildNodes(node), matcher, halter, list);
-return list;
-},
-_queryElements: function (elements, matcher, halter, list) {
-for (var i = 0, l = elements.length, c; i < l && (c = elements[i]); i++) {
-if (c.nodeType === Node.ELEMENT_NODE) {
-if (this._queryElement(c, matcher, halter, list)) {
-return true;
-}
-}
-}
-},
-_queryElement: function (node, matcher, halter, list) {
-var result = matcher(node);
-if (result) {
-list.push(node);
-}
-if (halter && halter(result)) {
-return result;
-}
-this._queryElements(TreeApi.Logical.getChildNodes(node), matcher, halter, list);
-}
-};
-var CONTENT = DomApi.CONTENT = 'content';
-var dom = DomApi.factory = function (node) {
-node = node || document;
-if (!node.__domApi) {
-node.__domApi = new DomApi.ctor(node);
-}
-return node.__domApi;
-};
-DomApi.hasApi = function (node) {
-return Boolean(node.__domApi);
-};
-DomApi.ctor = DomApi;
-Polymer.dom = function (obj, patch) {
-if (obj instanceof Event) {
-return Polymer.EventApi.factory(obj);
-} else {
-return DomApi.factory(obj, patch);
-}
-};
-var p = Element.prototype;
-DomApi.matchesSelector = p.matches || p.matchesSelector || p.mozMatchesSelector || p.msMatchesSelector || p.oMatchesSelector || p.webkitMatchesSelector;
-return DomApi;
-}();(function () {
-'use strict';
-var Settings = Polymer.Settings;
-var DomApi = Polymer.DomApi;
-var dom = DomApi.factory;
-var TreeApi = Polymer.TreeApi;
-var getInnerHTML = Polymer.domInnerHTML.getInnerHTML;
-var CONTENT = DomApi.CONTENT;
-if (Settings.useShadow) {
-return;
-}
-var nativeCloneNode = Element.prototype.cloneNode;
-var nativeImportNode = Document.prototype.importNode;
-Polymer.Base.mixin(DomApi.prototype, {
-_lazyDistribute: function (host) {
-if (host.shadyRoot && host.shadyRoot._distributionClean) {
-host.shadyRoot._distributionClean = false;
-Polymer.dom.addDebouncer(host.debounce('_distribute', host._distributeContent));
-}
-},
-appendChild: function (node) {
-return this.insertBefore(node);
-},
-insertBefore: function (node, ref_node) {
-if (ref_node && TreeApi.Logical.getParentNode(ref_node) !== this.node) {
-throw Error('The ref_node to be inserted before is not a child ' + 'of this node');
-}
-if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {
-var parent = TreeApi.Logical.getParentNode(node);
-if (parent) {
-if (DomApi.hasApi(parent)) {
-dom(parent).notifyObserver();
-}
-this._removeNode(node);
-} else {
-this._removeOwnerShadyRoot(node);
-}
-}
-if (!this._addNode(node, ref_node)) {
-if (ref_node) {
-ref_node = ref_node.localName === CONTENT ? this._firstComposedNode(ref_node) : ref_node;
-}
-var container = this.node._isShadyRoot ? this.node.host : this.node;
-if (ref_node) {
-TreeApi.Composed.insertBefore(container, node, ref_node);
-} else {
-TreeApi.Composed.appendChild(container, node);
-}
-}
-this.notifyObserver();
-return node;
-},
-_addNode: function (node, ref_node) {
-var root = this.getOwnerRoot();
-if (root) {
-var ipAdded = this._maybeAddInsertionPoint(node, this.node);
-if (!root._invalidInsertionPoints) {
-root._invalidInsertionPoints = ipAdded;
-}
-this._addNodeToHost(root.host, node);
-}
-if (TreeApi.Logical.hasChildNodes(this.node)) {
-TreeApi.Logical.recordInsertBefore(node, this.node, ref_node);
-}
-var handled = this._maybeDistribute(node) || this.node.shadyRoot;
-if (handled) {
-if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
-while (node.firstChild) {
-TreeApi.Composed.removeChild(node, node.firstChild);
-}
-} else {
-var parent = TreeApi.Composed.getParentNode(node);
-if (parent) {
-TreeApi.Composed.removeChild(parent, node);
-}
-}
-}
-return handled;
-},
-removeChild: function (node) {
-if (TreeApi.Logical.getParentNode(node) !== this.node) {
-throw Error('The node to be removed is not a child of this node: ' + node);
-}
-if (!this._removeNode(node)) {
-var container = this.node._isShadyRoot ? this.node.host : this.node;
-var parent = TreeApi.Composed.getParentNode(node);
-if (container === parent) {
-TreeApi.Composed.removeChild(container, node);
-}
-}
-this.notifyObserver();
-return node;
-},
-_removeNode: function (node) {
-var logicalParent = TreeApi.Logical.hasParentNode(node) && TreeApi.Logical.getParentNode(node);
-var distributed;
-var root = this._ownerShadyRootForNode(node);
-if (logicalParent) {
-distributed = dom(node)._maybeDistributeParent();
-TreeApi.Logical.recordRemoveChild(node, logicalParent);
-if (root && this._removeDistributedChildren(root, node)) {
-root._invalidInsertionPoints = true;
-this._lazyDistribute(root.host);
-}
-}
-this._removeOwnerShadyRoot(node);
-if (root) {
-this._removeNodeFromHost(root.host, node);
-}
-return distributed;
-},
-replaceChild: function (node, ref_node) {
-this.insertBefore(node, ref_node);
-this.removeChild(ref_node);
-return node;
-},
-_hasCachedOwnerRoot: function (node) {
-return Boolean(node._ownerShadyRoot !== undefined);
-},
-getOwnerRoot: function () {
-return this._ownerShadyRootForNode(this.node);
-},
-_ownerShadyRootForNode: function (node) {
-if (!node) {
-return;
-}
-var root = node._ownerShadyRoot;
-if (root === undefined) {
-if (node._isShadyRoot) {
-root = node;
-} else {
-var parent = TreeApi.Logical.getParentNode(node);
-if (parent) {
-root = parent._isShadyRoot ? parent : this._ownerShadyRootForNode(parent);
-} else {
-root = null;
-}
-}
-if (root || document.documentElement.contains(node)) {
-node._ownerShadyRoot = root;
-}
-}
-return root;
-},
-_maybeDistribute: function (node) {
-var fragContent = node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && !node.__noContent && dom(node).querySelector(CONTENT);
-var wrappedContent = fragContent && TreeApi.Logical.getParentNode(fragContent).nodeType !== Node.DOCUMENT_FRAGMENT_NODE;
-var hasContent = fragContent || node.localName === CONTENT;
-if (hasContent) {
-var root = this.getOwnerRoot();
-if (root) {
-this._lazyDistribute(root.host);
-}
-}
-var needsDist = this._nodeNeedsDistribution(this.node);
-if (needsDist) {
-this._lazyDistribute(this.node);
-}
-return needsDist || hasContent && !wrappedContent;
-},
-_maybeAddInsertionPoint: function (node, parent) {
-var added;
-if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && !node.__noContent) {
-var c$ = dom(node).querySelectorAll(CONTENT);
-for (var i = 0, n, np, na; i < c$.length && (n = c$[i]); i++) {
-np = TreeApi.Logical.getParentNode(n);
-if (np === node) {
-np = parent;
-}
-na = this._maybeAddInsertionPoint(n, np);
-added = added || na;
-}
-} else if (node.localName === CONTENT) {
-TreeApi.Logical.saveChildNodes(parent);
-TreeApi.Logical.saveChildNodes(node);
-added = true;
-}
-return added;
-},
-_updateInsertionPoints: function (host) {
-var i$ = host.shadyRoot._insertionPoints = dom(host.shadyRoot).querySelectorAll(CONTENT);
-for (var i = 0, c; i < i$.length; i++) {
-c = i$[i];
-TreeApi.Logical.saveChildNodes(c);
-TreeApi.Logical.saveChildNodes(TreeApi.Logical.getParentNode(c));
-}
-},
-_nodeNeedsDistribution: function (node) {
-return node && node.shadyRoot && DomApi.hasInsertionPoint(node.shadyRoot);
-},
-_addNodeToHost: function (host, node) {
-if (host._elementAdd) {
-host._elementAdd(node);
-}
-},
-_removeNodeFromHost: function (host, node) {
-if (host._elementRemove) {
-host._elementRemove(node);
-}
-},
-_removeDistributedChildren: function (root, container) {
-var hostNeedsDist;
-var ip$ = root._insertionPoints;
-for (var i = 0; i < ip$.length; i++) {
-var content = ip$[i];
-if (this._contains(container, content)) {
-var dc$ = dom(content).getDistributedNodes();
-for (var j = 0; j < dc$.length; j++) {
-hostNeedsDist = true;
-var node = dc$[j];
-var parent = TreeApi.Composed.getParentNode(node);
-if (parent) {
-TreeApi.Composed.removeChild(parent, node);
-}
-}
-}
-}
-return hostNeedsDist;
-},
-_contains: function (container, node) {
-while (node) {
-if (node == container) {
-return true;
-}
-node = TreeApi.Logical.getParentNode(node);
-}
-},
-_removeOwnerShadyRoot: function (node) {
-if (this._hasCachedOwnerRoot(node)) {
-var c$ = TreeApi.Logical.getChildNodes(node);
-for (var i = 0, l = c$.length, n; i < l && (n = c$[i]); i++) {
-this._removeOwnerShadyRoot(n);
-}
-}
-node._ownerShadyRoot = undefined;
-},
-_firstComposedNode: function (content) {
-var n$ = dom(content).getDistributedNodes();
-for (var i = 0, l = n$.length, n, p$; i < l && (n = n$[i]); i++) {
-p$ = dom(n).getDestinationInsertionPoints();
-if (p$[p$.length - 1] === content) {
-return n;
-}
-}
-},
-querySelector: function (selector) {
-var result = this._query(function (n) {
-return DomApi.matchesSelector.call(n, selector);
-}, this.node, function (n) {
-return Boolean(n);
-})[0];
-return result || null;
-},
-querySelectorAll: function (selector) {
-return this._query(function (n) {
-return DomApi.matchesSelector.call(n, selector);
-}, this.node);
-},
-getDestinationInsertionPoints: function () {
-return this.node._destinationInsertionPoints || [];
-},
-getDistributedNodes: function () {
-return this.node._distributedNodes || [];
-},
-_clear: function () {
-while (this.childNodes.length) {
-this.removeChild(this.childNodes[0]);
-}
-},
-setAttribute: function (name, value) {
-this.node.setAttribute(name, value);
-this._maybeDistributeParent();
-},
-removeAttribute: function (name) {
-this.node.removeAttribute(name);
-this._maybeDistributeParent();
-},
-_maybeDistributeParent: function () {
-if (this._nodeNeedsDistribution(this.parentNode)) {
-this._lazyDistribute(this.parentNode);
-return true;
-}
-},
-cloneNode: function (deep) {
-var n = nativeCloneNode.call(this.node, false);
-if (deep) {
-var c$ = this.childNodes;
-var d = dom(n);
-for (var i = 0, nc; i < c$.length; i++) {
-nc = dom(c$[i]).cloneNode(true);
-d.appendChild(nc);
-}
-}
-return n;
-},
-importNode: function (externalNode, deep) {
-var doc = this.node instanceof Document ? this.node : this.node.ownerDocument;
-var n = nativeImportNode.call(doc, externalNode, false);
-if (deep) {
-var c$ = TreeApi.Logical.getChildNodes(externalNode);
-var d = dom(n);
-for (var i = 0, nc; i < c$.length; i++) {
-nc = dom(doc).importNode(c$[i], true);
-d.appendChild(nc);
-}
-}
-return n;
-},
-_getComposedInnerHTML: function () {
-return getInnerHTML(this.node, true);
-}
-});
-Object.defineProperties(DomApi.prototype, {
-activeElement: {
-get: function () {
-var active = document.activeElement;
-if (!active) {
-return null;
-}
-var isShadyRoot = !!this.node._isShadyRoot;
-if (this.node !== document) {
-if (!isShadyRoot) {
-return null;
-}
-if (this.node.host === active || !this.node.host.contains(active)) {
-return null;
-}
-}
-var activeRoot = dom(active).getOwnerRoot();
-while (activeRoot && activeRoot !== this.node) {
-active = activeRoot.host;
-activeRoot = dom(active).getOwnerRoot();
-}
-if (this.node === document) {
-return activeRoot ? null : active;
-} else {
-return activeRoot === this.node ? active : null;
-}
-},
-configurable: true
-},
-childNodes: {
-get: function () {
-var c$ = TreeApi.Logical.getChildNodes(this.node);
-return Array.isArray(c$) ? c$ : TreeApi.arrayCopyChildNodes(this.node);
-},
-configurable: true
-},
-children: {
-get: function () {
-if (TreeApi.Logical.hasChildNodes(this.node)) {
-return Array.prototype.filter.call(this.childNodes, function (n) {
-return n.nodeType === Node.ELEMENT_NODE;
-});
-} else {
-return TreeApi.arrayCopyChildren(this.node);
-}
-},
-configurable: true
-},
-parentNode: {
-get: function () {
-return TreeApi.Logical.getParentNode(this.node);
-},
-configurable: true
-},
-firstChild: {
-get: function () {
-return TreeApi.Logical.getFirstChild(this.node);
-},
-configurable: true
-},
-lastChild: {
-get: function () {
-return TreeApi.Logical.getLastChild(this.node);
-},
-configurable: true
-},
-nextSibling: {
-get: function () {
-return TreeApi.Logical.getNextSibling(this.node);
-},
-configurable: true
-},
-previousSibling: {
-get: function () {
-return TreeApi.Logical.getPreviousSibling(this.node);
-},
-configurable: true
-},
-firstElementChild: {
-get: function () {
-return TreeApi.Logical.getFirstElementChild(this.node);
-},
-configurable: true
-},
-lastElementChild: {
-get: function () {
-return TreeApi.Logical.getLastElementChild(this.node);
-},
-configurable: true
-},
-nextElementSibling: {
-get: function () {
-return TreeApi.Logical.getNextElementSibling(this.node);
-},
-configurable: true
-},
-previousElementSibling: {
-get: function () {
-return TreeApi.Logical.getPreviousElementSibling(this.node);
-},
-configurable: true
-},
-textContent: {
-get: function () {
-var nt = this.node.nodeType;
-if (nt === Node.TEXT_NODE || nt === Node.COMMENT_NODE) {
-return this.node.textContent;
-} else {
-var tc = [];
-for (var i = 0, cn = this.childNodes, c; c = cn[i]; i++) {
-if (c.nodeType !== Node.COMMENT_NODE) {
-tc.push(c.textContent);
-}
-}
-return tc.join('');
-}
-},
-set: function (text) {
-var nt = this.node.nodeType;
-if (nt === Node.TEXT_NODE || nt === Node.COMMENT_NODE) {
-this.node.textContent = text;
-} else {
-this._clear();
-if (text) {
-this.appendChild(document.createTextNode(text));
-}
-}
-},
-configurable: true
-},
-innerHTML: {
-get: function () {
-var nt = this.node.nodeType;
-if (nt === Node.TEXT_NODE || nt === Node.COMMENT_NODE) {
-return null;
-} else {
-return getInnerHTML(this.node);
-}
-},
-set: function (text) {
-var nt = this.node.nodeType;
-if (nt !== Node.TEXT_NODE || nt !== Node.COMMENT_NODE) {
-this._clear();
-var d = document.createElement('div');
-d.innerHTML = text;
-var c$ = TreeApi.arrayCopyChildNodes(d);
-for (var i = 0; i < c$.length; i++) {
-this.appendChild(c$[i]);
-}
-}
-},
-configurable: true
-}
-});
-DomApi.hasInsertionPoint = function (root) {
-return Boolean(root && root._insertionPoints.length);
-};
-}());(function () {
-'use strict';
-var Settings = Polymer.Settings;
-var TreeApi = Polymer.TreeApi;
-var DomApi = Polymer.DomApi;
-if (!Settings.useShadow) {
-return;
-}
-Polymer.Base.mixin(DomApi.prototype, {
-querySelectorAll: function (selector) {
-return TreeApi.arrayCopy(this.node.querySelectorAll(selector));
-},
-getOwnerRoot: function () {
-var n = this.node;
-while (n) {
-if (n.nodeType === Node.DOCUMENT_FRAGMENT_NODE && n.host) {
-return n;
-}
-n = n.parentNode;
-}
-},
-importNode: function (externalNode, deep) {
-var doc = this.node instanceof Document ? this.node : this.node.ownerDocument;
-return doc.importNode(externalNode, deep);
-},
-getDestinationInsertionPoints: function () {
-var n$ = this.node.getDestinationInsertionPoints && this.node.getDestinationInsertionPoints();
-return n$ ? TreeApi.arrayCopy(n$) : [];
-},
-getDistributedNodes: function () {
-var n$ = this.node.getDistributedNodes && this.node.getDistributedNodes();
-return n$ ? TreeApi.arrayCopy(n$) : [];
-}
-});
-Object.defineProperties(DomApi.prototype, {
-activeElement: {
-get: function () {
-var node = DomApi.wrap(this.node);
-var activeElement = node.activeElement;
-return node.contains(activeElement) ? activeElement : null;
-},
-configurable: true
-},
-childNodes: {
-get: function () {
-return TreeApi.arrayCopyChildNodes(this.node);
-},
-configurable: true
-},
-children: {
-get: function () {
-return TreeApi.arrayCopyChildren(this.node);
-},
-configurable: true
-},
-textContent: {
-get: function () {
-return this.node.textContent;
-},
-set: function (value) {
-return this.node.textContent = value;
-},
-configurable: true
-},
-innerHTML: {
-get: function () {
-return this.node.innerHTML;
-},
-set: function (value) {
-return this.node.innerHTML = value;
-},
-configurable: true
-}
-});
-var forwardMethods = function (m$) {
-for (var i = 0; i < m$.length; i++) {
-forwardMethod(m$[i]);
-}
-};
-var forwardMethod = function (method) {
-DomApi.prototype[method] = function () {
-return this.node[method].apply(this.node, arguments);
-};
-};
-forwardMethods([
-'cloneNode',
-'appendChild',
-'insertBefore',
-'removeChild',
-'replaceChild',
-'setAttribute',
-'removeAttribute',
-'querySelector'
-]);
-var forwardProperties = function (f$) {
-for (var i = 0; i < f$.length; i++) {
-forwardProperty(f$[i]);
-}
-};
-var forwardProperty = function (name) {
-Object.defineProperty(DomApi.prototype, name, {
-get: function () {
-return this.node[name];
-},
-configurable: true
-});
-};
-forwardProperties([
-'parentNode',
-'firstChild',
-'lastChild',
-'nextSibling',
-'previousSibling',
-'firstElementChild',
-'lastElementChild',
-'nextElementSibling',
-'previousElementSibling'
-]);
-}());Polymer.Base.mixin(Polymer.dom, {
-_flushGuard: 0,
-_FLUSH_MAX: 100,
-_needsTakeRecords: !Polymer.Settings.useNativeCustomElements,
-_debouncers: [],
-_staticFlushList: [],
-_finishDebouncer: null,
-flush: function () {
-this._flushGuard = 0;
-this._prepareFlush();
-while (this._debouncers.length && this._flushGuard < this._FLUSH_MAX) {
-while (this._debouncers.length) {
-this._debouncers.shift().complete();
-}
-if (this._finishDebouncer) {
-this._finishDebouncer.complete();
-}
-this._prepareFlush();
-this._flushGuard++;
-}
-if (this._flushGuard >= this._FLUSH_MAX) {
-console.warn('Polymer.dom.flush aborted. Flush may not be complete.');
-}
-},
-_prepareFlush: function () {
-if (this._needsTakeRecords) {
-CustomElements.takeRecords();
-}
-for (var i = 0; i < this._staticFlushList.length; i++) {
-this._staticFlushList[i]();
-}
-},
-addStaticFlush: function (fn) {
-this._staticFlushList.push(fn);
-},
-removeStaticFlush: function (fn) {
-var i = this._staticFlushList.indexOf(fn);
-if (i >= 0) {
-this._staticFlushList.splice(i, 1);
-}
-},
-addDebouncer: function (debouncer) {
-this._debouncers.push(debouncer);
-this._finishDebouncer = Polymer.Debounce(this._finishDebouncer, this._finishFlush);
-},
-_finishFlush: function () {
-Polymer.dom._debouncers = [];
-}
-});Polymer.EventApi = function () {
-'use strict';
-var DomApi = Polymer.DomApi.ctor;
-var Settings = Polymer.Settings;
-DomApi.Event = function (event) {
-this.event = event;
-};
-if (Settings.useShadow) {
-DomApi.Event.prototype = {
-get rootTarget() {
-return this.event.path[0];
-},
-get localTarget() {
-return this.event.target;
-},
-get path() {
-var path = this.event.path;
-if (!Array.isArray(path)) {
-path = Array.prototype.slice.call(path);
-}
-return path;
-}
-};
-} else {
-DomApi.Event.prototype = {
-get rootTarget() {
-return this.event.target;
-},
-get localTarget() {
-var current = this.event.currentTarget;
-var currentRoot = current && Polymer.dom(current).getOwnerRoot();
-var p$ = this.path;
-for (var i = 0; i < p$.length; i++) {
-if (Polymer.dom(p$[i]).getOwnerRoot() === currentRoot) {
-return p$[i];
-}
-}
-},
-get path() {
-if (!this.event._path) {
-var path = [];
-var current = this.rootTarget;
-while (current) {
-path.push(current);
-var insertionPoints = Polymer.dom(current).getDestinationInsertionPoints();
-if (insertionPoints.length) {
-for (var i = 0; i < insertionPoints.length - 1; i++) {
-path.push(insertionPoints[i]);
-}
-current = insertionPoints[insertionPoints.length - 1];
-} else {
-current = Polymer.dom(current).parentNode || current.host;
-}
-}
-path.push(window);
-this.event._path = path;
-}
-return this.event._path;
-}
-};
-}
-var factory = function (event) {
-if (!event.__eventApi) {
-event.__eventApi = new DomApi.Event(event);
-}
-return event.__eventApi;
-};
-return { factory: factory };
-}();(function () {
-'use strict';
-var DomApi = Polymer.DomApi.ctor;
-var useShadow = Polymer.Settings.useShadow;
-Object.defineProperty(DomApi.prototype, 'classList', {
-get: function () {
-if (!this._classList) {
-this._classList = new DomApi.ClassList(this);
-}
-return this._classList;
-},
-configurable: true
-});
-DomApi.ClassList = function (host) {
-this.domApi = host;
-this.node = host.node;
-};
-DomApi.ClassList.prototype = {
-add: function () {
-this.node.classList.add.apply(this.node.classList, arguments);
-this._distributeParent();
-},
-remove: function () {
-this.node.classList.remove.apply(this.node.classList, arguments);
-this._distributeParent();
-},
-toggle: function () {
-this.node.classList.toggle.apply(this.node.classList, arguments);
-this._distributeParent();
-},
-_distributeParent: function () {
-if (!useShadow) {
-this.domApi._maybeDistributeParent();
-}
-},
-contains: function () {
-return this.node.classList.contains.apply(this.node.classList, arguments);
-}
-};
-}());(function () {
-'use strict';
-var DomApi = Polymer.DomApi.ctor;
-var Settings = Polymer.Settings;
-DomApi.EffectiveNodesObserver = function (domApi) {
-this.domApi = domApi;
-this.node = this.domApi.node;
-this._listeners = [];
-};
-DomApi.EffectiveNodesObserver.prototype = {
-addListener: function (callback) {
-if (!this._isSetup) {
-this._setup();
-this._isSetup = true;
-}
-var listener = {
-fn: callback,
-_nodes: []
-};
-this._listeners.push(listener);
-this._scheduleNotify();
-return listener;
-},
-removeListener: function (handle) {
-var i = this._listeners.indexOf(handle);
-if (i >= 0) {
-this._listeners.splice(i, 1);
-handle._nodes = [];
-}
-if (!this._hasListeners()) {
-this._cleanup();
-this._isSetup = false;
-}
-},
-_setup: function () {
-this._observeContentElements(this.domApi.childNodes);
-},
-_cleanup: function () {
-this._unobserveContentElements(this.domApi.childNodes);
-},
-_hasListeners: function () {
-return Boolean(this._listeners.length);
-},
-_scheduleNotify: function () {
-if (this._debouncer) {
-this._debouncer.stop();
-}
-this._debouncer = Polymer.Debounce(this._debouncer, this._notify);
-this._debouncer.context = this;
-Polymer.dom.addDebouncer(this._debouncer);
-},
-notify: function () {
-if (this._hasListeners()) {
-this._scheduleNotify();
-}
-},
-_notify: function () {
-this._beforeCallListeners();
-this._callListeners();
-},
-_beforeCallListeners: function () {
-this._updateContentElements();
-},
-_updateContentElements: function () {
-this._observeContentElements(this.domApi.childNodes);
-},
-_observeContentElements: function (elements) {
-for (var i = 0, n; i < elements.length && (n = elements[i]); i++) {
-if (this._isContent(n)) {
-n.__observeNodesMap = n.__observeNodesMap || new WeakMap();
-if (!n.__observeNodesMap.has(this)) {
-n.__observeNodesMap.set(this, this._observeContent(n));
-}
-}
-}
-},
-_observeContent: function (content) {
-var self = this;
-var h = Polymer.dom(content).observeNodes(function () {
-self._scheduleNotify();
-});
-h._avoidChangeCalculation = true;
-return h;
-},
-_unobserveContentElements: function (elements) {
-for (var i = 0, n, h; i < elements.length && (n = elements[i]); i++) {
-if (this._isContent(n)) {
-h = n.__observeNodesMap.get(this);
-if (h) {
-Polymer.dom(n).unobserveNodes(h);
-n.__observeNodesMap.delete(this);
-}
-}
-}
-},
-_isContent: function (node) {
-return node.localName === 'content';
-},
-_callListeners: function () {
-var o$ = this._listeners;
-var nodes = this._getEffectiveNodes();
-for (var i = 0, o; i < o$.length && (o = o$[i]); i++) {
-var info = this._generateListenerInfo(o, nodes);
-if (info || o._alwaysNotify) {
-this._callListener(o, info);
-}
-}
-},
-_getEffectiveNodes: function () {
-return this.domApi.getEffectiveChildNodes();
-},
-_generateListenerInfo: function (listener, newNodes) {
-if (listener._avoidChangeCalculation) {
-return true;
-}
-var oldNodes = listener._nodes;
-var info = {
-target: this.node,
-addedNodes: [],
-removedNodes: []
-};
-var splices = Polymer.ArraySplice.calculateSplices(newNodes, oldNodes);
-for (var i = 0, s; i < splices.length && (s = splices[i]); i++) {
-for (var j = 0, n; j < s.removed.length && (n = s.removed[j]); j++) {
-info.removedNodes.push(n);
-}
-}
-for (i = 0, s; i < splices.length && (s = splices[i]); i++) {
-for (j = s.index; j < s.index + s.addedCount; j++) {
-info.addedNodes.push(newNodes[j]);
-}
-}
-listener._nodes = newNodes;
-if (info.addedNodes.length || info.removedNodes.length) {
-return info;
-}
-},
-_callListener: function (listener, info) {
-return listener.fn.call(this.node, info);
-},
-enableShadowAttributeTracking: function () {
-}
-};
-if (Settings.useShadow) {
-var baseSetup = DomApi.EffectiveNodesObserver.prototype._setup;
-var baseCleanup = DomApi.EffectiveNodesObserver.prototype._cleanup;
-Polymer.Base.mixin(DomApi.EffectiveNodesObserver.prototype, {
-_setup: function () {
-if (!this._observer) {
-var self = this;
-this._mutationHandler = function (mxns) {
-if (mxns && mxns.length) {
-self._scheduleNotify();
-}
-};
-this._observer = new MutationObserver(this._mutationHandler);
-this._boundFlush = function () {
-self._flush();
-};
-Polymer.dom.addStaticFlush(this._boundFlush);
-this._observer.observe(this.node, { childList: true });
-}
-baseSetup.call(this);
-},
-_cleanup: function () {
-this._observer.disconnect();
-this._observer = null;
-this._mutationHandler = null;
-Polymer.dom.removeStaticFlush(this._boundFlush);
-baseCleanup.call(this);
-},
-_flush: function () {
-if (this._observer) {
-this._mutationHandler(this._observer.takeRecords());
-}
-},
-enableShadowAttributeTracking: function () {
-if (this._observer) {
-this._makeContentListenersAlwaysNotify();
-this._observer.disconnect();
-this._observer.observe(this.node, {
-childList: true,
-attributes: true,
-subtree: true
-});
-var root = this.domApi.getOwnerRoot();
-var host = root && root.host;
-if (host && Polymer.dom(host).observer) {
-Polymer.dom(host).observer.enableShadowAttributeTracking();
-}
-}
-},
-_makeContentListenersAlwaysNotify: function () {
-for (var i = 0, h; i < this._listeners.length; i++) {
-h = this._listeners[i];
-h._alwaysNotify = h._isContentListener;
-}
-}
-});
-}
-}());(function () {
-'use strict';
-var DomApi = Polymer.DomApi.ctor;
-var Settings = Polymer.Settings;
-DomApi.DistributedNodesObserver = function (domApi) {
-DomApi.EffectiveNodesObserver.call(this, domApi);
-};
-DomApi.DistributedNodesObserver.prototype = Object.create(DomApi.EffectiveNodesObserver.prototype);
-Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype, {
-_setup: function () {
-},
-_cleanup: function () {
-},
-_beforeCallListeners: function () {
-},
-_getEffectiveNodes: function () {
-return this.domApi.getDistributedNodes();
-}
-});
-if (Settings.useShadow) {
-Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype, {
-_setup: function () {
-if (!this._observer) {
-var root = this.domApi.getOwnerRoot();
-var host = root && root.host;
-if (host) {
-var self = this;
-this._observer = Polymer.dom(host).observeNodes(function () {
-self._scheduleNotify();
-});
-this._observer._isContentListener = true;
-if (this._hasAttrSelect()) {
-Polymer.dom(host).observer.enableShadowAttributeTracking();
-}
-}
-}
-},
-_hasAttrSelect: function () {
-var select = this.node.getAttribute('select');
-return select && select.match(/[[.]+/);
-},
-_cleanup: function () {
-var root = this.domApi.getOwnerRoot();
-var host = root && root.host;
-if (host) {
-Polymer.dom(host).unobserveNodes(this._observer);
-}
-this._observer = null;
-}
-});
-}
-}());(function () {
-var DomApi = Polymer.DomApi;
-var TreeApi = Polymer.TreeApi;
-Polymer.Base._addFeature({
-_prepShady: function () {
-this._useContent = this._useContent || Boolean(this._template);
-},
-_setupShady: function () {
-this.shadyRoot = null;
-if (!this.__domApi) {
-this.__domApi = null;
-}
-if (!this.__dom) {
-this.__dom = null;
-}
-if (!this._ownerShadyRoot) {
-this._ownerShadyRoot = undefined;
-}
-},
-_poolContent: function () {
-if (this._useContent) {
-TreeApi.Logical.saveChildNodes(this);
-}
-},
-_setupRoot: function () {
-if (this._useContent) {
-this._createLocalRoot();
-if (!this.dataHost) {
-upgradeLogicalChildren(TreeApi.Logical.getChildNodes(this));
-}
-}
-},
-_createLocalRoot: function () {
-this.shadyRoot = this.root;
-this.shadyRoot._distributionClean = false;
-this.shadyRoot._hasDistributed = false;
-this.shadyRoot._isShadyRoot = true;
-this.shadyRoot._dirtyRoots = [];
-var i$ = this.shadyRoot._insertionPoints = !this._notes || this._notes._hasContent ? this.shadyRoot.querySelectorAll('content') : [];
-TreeApi.Logical.saveChildNodes(this.shadyRoot);
-for (var i = 0, c; i < i$.length; i++) {
-c = i$[i];
-TreeApi.Logical.saveChildNodes(c);
-TreeApi.Logical.saveChildNodes(c.parentNode);
-}
-this.shadyRoot.host = this;
-},
-distributeContent: function (updateInsertionPoints) {
-if (this.shadyRoot) {
-this.shadyRoot._invalidInsertionPoints = this.shadyRoot._invalidInsertionPoints || updateInsertionPoints;
-var host = getTopDistributingHost(this);
-Polymer.dom(this)._lazyDistribute(host);
-}
-},
-_distributeContent: function () {
-if (this._useContent && !this.shadyRoot._distributionClean) {
-if (this.shadyRoot._invalidInsertionPoints) {
-Polymer.dom(this)._updateInsertionPoints(this);
-this.shadyRoot._invalidInsertionPoints = false;
-}
-this._beginDistribute();
-this._distributeDirtyRoots();
-this._finishDistribute();
-}
-},
-_beginDistribute: function () {
-if (this._useContent && DomApi.hasInsertionPoint(this.shadyRoot)) {
-this._resetDistribution();
-this._distributePool(this.shadyRoot, this._collectPool());
-}
-},
-_distributeDirtyRoots: function () {
-var c$ = this.shadyRoot._dirtyRoots;
-for (var i = 0, l = c$.length, c; i < l && (c = c$[i]); i++) {
-c._distributeContent();
-}
-this.shadyRoot._dirtyRoots = [];
-},
-_finishDistribute: function () {
-if (this._useContent) {
-this.shadyRoot._distributionClean = true;
-if (DomApi.hasInsertionPoint(this.shadyRoot)) {
-this._composeTree();
-notifyContentObservers(this.shadyRoot);
-} else {
-if (!this.shadyRoot._hasDistributed) {
-TreeApi.Composed.clearChildNodes(this);
-this.appendChild(this.shadyRoot);
-} else {
-var children = this._composeNode(this);
-this._updateChildNodes(this, children);
-}
-}
-if (!this.shadyRoot._hasDistributed) {
-notifyInitialDistribution(this);
-}
-this.shadyRoot._hasDistributed = true;
-}
-},
-elementMatches: function (selector, node) {
-node = node || this;
-return DomApi.matchesSelector.call(node, selector);
-},
-_resetDistribution: function () {
-var children = TreeApi.Logical.getChildNodes(this);
-for (var i = 0; i < children.length; i++) {
-var child = children[i];
-if (child._destinationInsertionPoints) {
-child._destinationInsertionPoints = undefined;
-}
-if (isInsertionPoint(child)) {
-clearDistributedDestinationInsertionPoints(child);
-}
-}
-var root = this.shadyRoot;
-var p$ = root._insertionPoints;
-for (var j = 0; j < p$.length; j++) {
-p$[j]._distributedNodes = [];
-}
-},
-_collectPool: function () {
-var pool = [];
-var children = TreeApi.Logical.getChildNodes(this);
-for (var i = 0; i < children.length; i++) {
-var child = children[i];
-if (isInsertionPoint(child)) {
-pool.push.apply(pool, child._distributedNodes);
-} else {
-pool.push(child);
-}
-}
-return pool;
-},
-_distributePool: function (node, pool) {
-var p$ = node._insertionPoints;
-for (var i = 0, l = p$.length, p; i < l && (p = p$[i]); i++) {
-this._distributeInsertionPoint(p, pool);
-maybeRedistributeParent(p, this);
-}
-},
-_distributeInsertionPoint: function (content, pool) {
-var anyDistributed = false;
-for (var i = 0, l = pool.length, node; i < l; i++) {
-node = pool[i];
-if (!node) {
-continue;
-}
-if (this._matchesContentSelect(node, content)) {
-distributeNodeInto(node, content);
-pool[i] = undefined;
-anyDistributed = true;
-}
-}
-if (!anyDistributed) {
-var children = TreeApi.Logical.getChildNodes(content);
-for (var j = 0; j < children.length; j++) {
-distributeNodeInto(children[j], content);
-}
-}
-},
-_composeTree: function () {
-this._updateChildNodes(this, this._composeNode(this));
-var p$ = this.shadyRoot._insertionPoints;
-for (var i = 0, l = p$.length, p, parent; i < l && (p = p$[i]); i++) {
-parent = TreeApi.Logical.getParentNode(p);
-if (!parent._useContent && parent !== this && parent !== this.shadyRoot) {
-this._updateChildNodes(parent, this._composeNode(parent));
-}
-}
-},
-_composeNode: function (node) {
-var children = [];
-var c$ = TreeApi.Logical.getChildNodes(node.shadyRoot || node);
-for (var i = 0; i < c$.length; i++) {
-var child = c$[i];
-if (isInsertionPoint(child)) {
-var distributedNodes = child._distributedNodes;
-for (var j = 0; j < distributedNodes.length; j++) {
-var distributedNode = distributedNodes[j];
-if (isFinalDestination(child, distributedNode)) {
-children.push(distributedNode);
-}
-}
-} else {
-children.push(child);
-}
-}
-return children;
-},
-_updateChildNodes: function (container, children) {
-var composed = TreeApi.Composed.getChildNodes(container);
-var splices = Polymer.ArraySplice.calculateSplices(children, composed);
-for (var i = 0, d = 0, s; i < splices.length && (s = splices[i]); i++) {
-for (var j = 0, n; j < s.removed.length && (n = s.removed[j]); j++) {
-if (TreeApi.Composed.getParentNode(n) === container) {
-TreeApi.Composed.removeChild(container, n);
-}
-composed.splice(s.index + d, 1);
-}
-d -= s.addedCount;
-}
-for (var i = 0, s, next; i < splices.length && (s = splices[i]); i++) {
-next = composed[s.index];
-for (j = s.index, n; j < s.index + s.addedCount; j++) {
-n = children[j];
-TreeApi.Composed.insertBefore(container, n, next);
-composed.splice(j, 0, n);
-}
-}
-},
-_matchesContentSelect: function (node, contentElement) {
-var select = contentElement.getAttribute('select');
-if (!select) {
-return true;
-}
-select = select.trim();
-if (!select) {
-return true;
-}
-if (!(node instanceof Element)) {
-return false;
-}
-var validSelectors = /^(:not\()?[*.#[a-zA-Z_|]/;
-if (!validSelectors.test(select)) {
-return false;
-}
-return this.elementMatches(select, node);
-},
-_elementAdd: function () {
-},
-_elementRemove: function () {
-}
-});
-var domHostDesc = {
-get: function () {
-var root = Polymer.dom(this).getOwnerRoot();
-return root && root.host;
-},
-configurable: true
-};
-Object.defineProperty(Polymer.Base, 'domHost', domHostDesc);
-Polymer.BaseDescriptors.domHost = domHostDesc;
-function distributeNodeInto(child, insertionPoint) {
-insertionPoint._distributedNodes.push(child);
-var points = child._destinationInsertionPoints;
-if (!points) {
-child._destinationInsertionPoints = [insertionPoint];
-} else {
-points.push(insertionPoint);
-}
-}
-function clearDistributedDestinationInsertionPoints(content) {
-var e$ = content._distributedNodes;
-if (e$) {
-for (var i = 0; i < e$.length; i++) {
-var d = e$[i]._destinationInsertionPoints;
-if (d) {
-d.splice(d.indexOf(content) + 1, d.length);
-}
-}
-}
-}
-function maybeRedistributeParent(content, host) {
-var parent = TreeApi.Logical.getParentNode(content);
-if (parent && parent.shadyRoot && DomApi.hasInsertionPoint(parent.shadyRoot) && parent.shadyRoot._distributionClean) {
-parent.shadyRoot._distributionClean = false;
-host.shadyRoot._dirtyRoots.push(parent);
-}
-}
-function isFinalDestination(insertionPoint, node) {
-var points = node._destinationInsertionPoints;
-return points && points[points.length - 1] === insertionPoint;
-}
-function isInsertionPoint(node) {
-return node.localName == 'content';
-}
-function getTopDistributingHost(host) {
-while (host && hostNeedsRedistribution(host)) {
-host = host.domHost;
-}
-return host;
-}
-function hostNeedsRedistribution(host) {
-var c$ = TreeApi.Logical.getChildNodes(host);
-for (var i = 0, c; i < c$.length; i++) {
-c = c$[i];
-if (c.localName && c.localName === 'content') {
-return host.domHost;
-}
-}
-}
-function notifyContentObservers(root) {
-for (var i = 0, c; i < root._insertionPoints.length; i++) {
-c = root._insertionPoints[i];
-if (DomApi.hasApi(c)) {
-Polymer.dom(c).notifyObserver();
-}
-}
-}
-function notifyInitialDistribution(host) {
-if (DomApi.hasApi(host)) {
-Polymer.dom(host).notifyObserver();
-}
-}
-var needsUpgrade = window.CustomElements && !CustomElements.useNative;
-function upgradeLogicalChildren(children) {
-if (needsUpgrade && children) {
-for (var i = 0; i < children.length; i++) {
-CustomElements.upgrade(children[i]);
-}
-}
-}
-}());if (Polymer.Settings.useShadow) {
-Polymer.Base._addFeature({
-_poolContent: function () {
-},
-_beginDistribute: function () {
-},
-distributeContent: function () {
-},
-_distributeContent: function () {
-},
-_finishDistribute: function () {
-},
-_createLocalRoot: function () {
-this.createShadowRoot();
-this.shadowRoot.appendChild(this.root);
-this.root = this.shadowRoot;
-}
-});
-}Polymer.Async = {
-_currVal: 0,
-_lastVal: 0,
-_callbacks: [],
-_twiddleContent: 0,
-_twiddle: document.createTextNode(''),
-run: function (callback, waitTime) {
-if (waitTime > 0) {
-return ~setTimeout(callback, waitTime);
-} else {
-this._twiddle.textContent = this._twiddleContent++;
-this._callbacks.push(callback);
-return this._currVal++;
-}
-},
-cancel: function (handle) {
-if (handle < 0) {
-clearTimeout(~handle);
-} else {
-var idx = handle - this._lastVal;
-if (idx >= 0) {
-if (!this._callbacks[idx]) {
-throw 'invalid async handle: ' + handle;
-}
-this._callbacks[idx] = null;
-}
-}
-},
-_atEndOfMicrotask: function () {
-var len = this._callbacks.length;
-for (var i = 0; i < len; i++) {
-var cb = this._callbacks[i];
-if (cb) {
-try {
-cb();
-} catch (e) {
-i++;
-this._callbacks.splice(0, i);
-this._lastVal += i;
-this._twiddle.textContent = this._twiddleContent++;
-throw e;
-}
-}
-}
-this._callbacks.splice(0, len);
-this._lastVal += len;
-}
-};
-new window.MutationObserver(function () {
-Polymer.Async._atEndOfMicrotask();
-}).observe(Polymer.Async._twiddle, { characterData: true });Polymer.Debounce = function () {
-var Async = Polymer.Async;
-var Debouncer = function (context) {
-this.context = context;
-var self = this;
-this.boundComplete = function () {
-self.complete();
-};
-};
-Debouncer.prototype = {
-go: function (callback, wait) {
-var h;
-this.finish = function () {
-Async.cancel(h);
-};
-h = Async.run(this.boundComplete, wait);
-this.callback = callback;
-},
-stop: function () {
-if (this.finish) {
-this.finish();
-this.finish = null;
-this.callback = null;
-}
-},
-complete: function () {
-if (this.finish) {
-var callback = this.callback;
-this.stop();
-callback.call(this.context);
-}
-}
-};
-function debounce(debouncer, callback, wait) {
-if (debouncer) {
-debouncer.stop();
-} else {
-debouncer = new Debouncer(this);
-}
-debouncer.go(callback, wait);
-return debouncer;
-}
-return debounce;
-}();Polymer.Base._addFeature({
-_setupDebouncers: function () {
-this._debouncers = {};
-},
-debounce: function (jobName, callback, wait) {
-return this._debouncers[jobName] = Polymer.Debounce.call(this, this._debouncers[jobName], callback, wait);
-},
-isDebouncerActive: function (jobName) {
-var debouncer = this._debouncers[jobName];
-return !!(debouncer && debouncer.finish);
-},
-flushDebouncer: function (jobName) {
-var debouncer = this._debouncers[jobName];
-if (debouncer) {
-debouncer.complete();
-}
-},
-cancelDebouncer: function (jobName) {
-var debouncer = this._debouncers[jobName];
-if (debouncer) {
-debouncer.stop();
-}
-}
-});Polymer.DomModule = document.createElement('dom-module');
-Polymer.Base._addFeature({
-_registerFeatures: function () {
-this._prepIs();
-this._prepBehaviors();
-this._prepConstructor();
-this._prepTemplate();
-this._prepShady();
-this._prepPropertyInfo();
-},
-_prepBehavior: function (b) {
-this._addHostAttributes(b.hostAttributes);
-},
-_initFeatures: function () {
-this._registerHost();
-if (this._template) {
-this._poolContent();
-this._beginHosting();
-this._stampTemplate();
-this._endHosting();
-}
-this._marshalHostAttributes();
-this._setupDebouncers();
-this._marshalBehaviors();
-this._tryReady();
-},
-_marshalBehavior: function (b) {
-}
-});</script>
-
-
-
-
-
-
diff --git a/systrace/catapult/third_party/polymer/components/polymer/polymer.html b/systrace/catapult/third_party/polymer/components/polymer/polymer.html
deleted file mode 100644
index c7c8170..0000000
--- a/systrace/catapult/third_party/polymer/components/polymer/polymer.html
+++ /dev/null
@@ -1,5555 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><link rel="import" href="polymer-mini.html"><script>(function () {
-Polymer.nar = [];
-var disableUpgradeEnabled = Polymer.Settings.disableUpgradeEnabled;
-Polymer.Annotations = {
-parseAnnotations: function (template, stripWhiteSpace) {
-var list = [];
-var content = template._content || template.content;
-this._parseNodeAnnotations(content, list, stripWhiteSpace || template.hasAttribute('strip-whitespace'));
-return list;
-},
-_parseNodeAnnotations: function (node, list, stripWhiteSpace) {
-return node.nodeType === Node.TEXT_NODE ? this._parseTextNodeAnnotation(node, list) : this._parseElementAnnotations(node, list, stripWhiteSpace);
-},
-_bindingRegex: function () {
-var IDENT = '(?:' + '[a-zA-Z_$][\\w.:$\\-*]*' + ')';
-var NUMBER = '(?:' + '[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')';
-var SQUOTE_STRING = '(?:' + '\'(?:[^\'\\\\]|\\\\.)*\'' + ')';
-var DQUOTE_STRING = '(?:' + '"(?:[^"\\\\]|\\\\.)*"' + ')';
-var STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')';
-var ARGUMENT = '(?:' + IDENT + '|' + NUMBER + '|' + STRING + '\\s*' + ')';
-var ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\s*' + ARGUMENT + ')*' + ')';
-var ARGUMENT_LIST = '(?:' + '\\(\\s*' + '(?:' + ARGUMENTS + '?' + ')' + '\\)\\s*' + ')';
-var BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')';
-var OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*';
-var CLOSE_BRACKET = '(?:]]|}})';
-var NEGATE = '(?:(!)\\s*)?';
-var EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET;
-return new RegExp(EXPRESSION, 'g');
-}(),
-_parseBindings: function (text) {
-var re = this._bindingRegex;
-var parts = [];
-var lastIndex = 0;
-var m;
-while ((m = re.exec(text)) !== null) {
-if (m.index > lastIndex) {
-parts.push({ literal: text.slice(lastIndex, m.index) });
-}
-var mode = m[1][0];
-var negate = Boolean(m[2]);
-var value = m[3].trim();
-var customEvent, notifyEvent, colon;
-if (mode == '{' && (colon = value.indexOf('::')) > 0) {
-notifyEvent = value.substring(colon + 2);
-value = value.substring(0, colon);
-customEvent = true;
-}
-parts.push({
-compoundIndex: parts.length,
-value: value,
-mode: mode,
-negate: negate,
-event: notifyEvent,
-customEvent: customEvent
-});
-lastIndex = re.lastIndex;
-}
-if (lastIndex && lastIndex < text.length) {
-var literal = text.substring(lastIndex);
-if (literal) {
-parts.push({ literal: literal });
-}
-}
-if (parts.length) {
-return parts;
-}
-},
-_literalFromParts: function (parts) {
-var s = '';
-for (var i = 0; i < parts.length; i++) {
-var literal = parts[i].literal;
-s += literal || '';
-}
-return s;
-},
-_parseTextNodeAnnotation: function (node, list) {
-var parts = this._parseBindings(node.textContent);
-if (parts) {
-node.textContent = this._literalFromParts(parts) || ' ';
-var annote = {
-bindings: [{
-kind: 'text',
-name: 'textContent',
-parts: parts,
-isCompound: parts.length !== 1
-}]
-};
-list.push(annote);
-return annote;
-}
-},
-_parseElementAnnotations: function (element, list, stripWhiteSpace) {
-var annote = {
-bindings: [],
-events: []
-};
-if (element.localName === 'content') {
-list._hasContent = true;
-}
-this._parseChildNodesAnnotations(element, annote, list, stripWhiteSpace);
-if (element.attributes) {
-this._parseNodeAttributeAnnotations(element, annote, list);
-if (this.prepElement) {
-this.prepElement(element);
-}
-}
-if (annote.bindings.length || annote.events.length || annote.id) {
-list.push(annote);
-}
-return annote;
-},
-_parseChildNodesAnnotations: function (root, annote, list, stripWhiteSpace) {
-if (root.firstChild) {
-var node = root.firstChild;
-var i = 0;
-while (node) {
-var next = node.nextSibling;
-if (node.localName === 'template' && !node.hasAttribute('preserve-content')) {
-this._parseTemplate(node, i, list, annote, stripWhiteSpace);
-}
-if (node.localName == 'slot') {
-node = this._replaceSlotWithContent(node);
-}
-if (node.nodeType === Node.TEXT_NODE) {
-var n = next;
-while (n && n.nodeType === Node.TEXT_NODE) {
-node.textContent += n.textContent;
-next = n.nextSibling;
-root.removeChild(n);
-n = next;
-}
-if (stripWhiteSpace && !node.textContent.trim()) {
-root.removeChild(node);
-i--;
-}
-}
-if (node.parentNode) {
-var childAnnotation = this._parseNodeAnnotations(node, list, stripWhiteSpace);
-if (childAnnotation) {
-childAnnotation.parent = annote;
-childAnnotation.index = i;
-}
-}
-node = next;
-i++;
-}
-}
-},
-_replaceSlotWithContent: function (slot) {
-var content = slot.ownerDocument.createElement('content');
-while (slot.firstChild) {
-content.appendChild(slot.firstChild);
-}
-var attrs = slot.attributes;
-for (var i = 0; i < attrs.length; i++) {
-var attr = attrs[i];
-content.setAttribute(attr.name, attr.value);
-}
-var name = slot.getAttribute('name');
-if (name) {
-content.setAttribute('select', '[slot=\'' + name + '\']');
-}
-slot.parentNode.replaceChild(content, slot);
-return content;
-},
-_parseTemplate: function (node, index, list, parent, stripWhiteSpace) {
-var content = document.createDocumentFragment();
-content._notes = this.parseAnnotations(node, stripWhiteSpace);
-content.appendChild(node.content);
-list.push({
-bindings: Polymer.nar,
-events: Polymer.nar,
-templateContent: content,
-parent: parent,
-index: index
-});
-},
-_parseNodeAttributeAnnotations: function (node, annotation) {
-var attrs = Array.prototype.slice.call(node.attributes);
-for (var i = attrs.length - 1, a; a = attrs[i]; i--) {
-var n = a.name;
-var v = a.value;
-var b;
-if (n.slice(0, 3) === 'on-') {
-node.removeAttribute(n);
-annotation.events.push({
-name: n.slice(3),
-value: v
-});
-} else if (b = this._parseNodeAttributeAnnotation(node, n, v)) {
-annotation.bindings.push(b);
-} else if (n === 'id') {
-annotation.id = v;
-}
-}
-},
-_parseNodeAttributeAnnotation: function (node, name, value) {
-var parts = this._parseBindings(value);
-if (parts) {
-var origName = name;
-var kind = 'property';
-if (name[name.length - 1] == '$') {
-name = name.slice(0, -1);
-kind = 'attribute';
-}
-var literal = this._literalFromParts(parts);
-if (literal && kind == 'attribute') {
-node.setAttribute(name, literal);
-}
-if (node.localName === 'input' && origName === 'value') {
-node.setAttribute(origName, '');
-}
-if (disableUpgradeEnabled && origName === 'disable-upgrade$') {
-node.setAttribute(name, '');
-}
-node.removeAttribute(origName);
-var propertyName = Polymer.CaseMap.dashToCamelCase(name);
-if (kind === 'property') {
-name = propertyName;
-}
-return {
-kind: kind,
-name: name,
-propertyName: propertyName,
-parts: parts,
-literal: literal,
-isCompound: parts.length !== 1
-};
-}
-},
-findAnnotatedNode: function (root, annote) {
-var parent = annote.parent && Polymer.Annotations.findAnnotatedNode(root, annote.parent);
-if (parent) {
-for (var n = parent.firstChild, i = 0; n; n = n.nextSibling) {
-if (annote.index === i++) {
-return n;
-}
-}
-} else {
-return root;
-}
-}
-};
-}());Polymer.Path = {
-root: function (path) {
-var dotIndex = path.indexOf('.');
-if (dotIndex === -1) {
-return path;
-}
-return path.slice(0, dotIndex);
-},
-isDeep: function (path) {
-return path.indexOf('.') !== -1;
-},
-isAncestor: function (base, path) {
-return base.indexOf(path + '.') === 0;
-},
-isDescendant: function (base, path) {
-return path.indexOf(base + '.') === 0;
-},
-translate: function (base, newBase, path) {
-return newBase + path.slice(base.length);
-},
-matches: function (base, wildcard, path) {
-return base === path || this.isAncestor(base, path) || Boolean(wildcard) && this.isDescendant(base, path);
-}
-};Polymer.Base._addFeature({
-_prepAnnotations: function () {
-if (!this._template) {
-this._notes = [];
-} else {
-var self = this;
-Polymer.Annotations.prepElement = function (element) {
-self._prepElement(element);
-};
-if (this._template._content && this._template._content._notes) {
-this._notes = this._template._content._notes;
-} else {
-this._notes = Polymer.Annotations.parseAnnotations(this._template);
-this._processAnnotations(this._notes);
-}
-Polymer.Annotations.prepElement = null;
-}
-},
-_processAnnotations: function (notes) {
-for (var i = 0; i < notes.length; i++) {
-var note = notes[i];
-for (var j = 0; j < note.bindings.length; j++) {
-var b = note.bindings[j];
-for (var k = 0; k < b.parts.length; k++) {
-var p = b.parts[k];
-if (!p.literal) {
-var signature = this._parseMethod(p.value);
-if (signature) {
-p.signature = signature;
-} else {
-p.model = Polymer.Path.root(p.value);
-}
-}
-}
-}
-if (note.templateContent) {
-this._processAnnotations(note.templateContent._notes);
-var pp = note.templateContent._parentProps = this._discoverTemplateParentProps(note.templateContent._notes);
-var bindings = [];
-for (var prop in pp) {
-var name = '_parent_' + prop;
-bindings.push({
-index: note.index,
-kind: 'property',
-name: name,
-propertyName: name,
-parts: [{
-mode: '{',
-model: prop,
-value: prop
-}]
-});
-}
-note.bindings = note.bindings.concat(bindings);
-}
-}
-},
-_discoverTemplateParentProps: function (notes) {
-var pp = {};
-for (var i = 0, n; i < notes.length && (n = notes[i]); i++) {
-for (var j = 0, b$ = n.bindings, b; j < b$.length && (b = b$[j]); j++) {
-for (var k = 0, p$ = b.parts, p; k < p$.length && (p = p$[k]); k++) {
-if (p.signature) {
-var args = p.signature.args;
-for (var kk = 0; kk < args.length; kk++) {
-var model = args[kk].model;
-if (model) {
-pp[model] = true;
-}
-}
-if (p.signature.dynamicFn) {
-pp[p.signature.method] = true;
-}
-} else {
-if (p.model) {
-pp[p.model] = true;
-}
-}
-}
-}
-if (n.templateContent) {
-var tpp = n.templateContent._parentProps;
-Polymer.Base.mixin(pp, tpp);
-}
-}
-return pp;
-},
-_prepElement: function (element) {
-Polymer.ResolveUrl.resolveAttrs(element, this._template.ownerDocument);
-},
-_findAnnotatedNode: Polymer.Annotations.findAnnotatedNode,
-_marshalAnnotationReferences: function () {
-if (this._template) {
-this._marshalIdNodes();
-this._marshalAnnotatedNodes();
-this._marshalAnnotatedListeners();
-}
-},
-_configureAnnotationReferences: function () {
-var notes = this._notes;
-var nodes = this._nodes;
-for (var i = 0; i < notes.length; i++) {
-var note = notes[i];
-var node = nodes[i];
-this._configureTemplateContent(note, node);
-this._configureCompoundBindings(note, node);
-}
-},
-_configureTemplateContent: function (note, node) {
-if (note.templateContent) {
-node._content = note.templateContent;
-}
-},
-_configureCompoundBindings: function (note, node) {
-var bindings = note.bindings;
-for (var i = 0; i < bindings.length; i++) {
-var binding = bindings[i];
-if (binding.isCompound) {
-var storage = node.__compoundStorage__ || (node.__compoundStorage__ = {});
-var parts = binding.parts;
-var literals = new Array(parts.length);
-for (var j = 0; j < parts.length; j++) {
-literals[j] = parts[j].literal;
-}
-var name = binding.name;
-storage[name] = literals;
-if (binding.literal && binding.kind == 'property') {
-if (node._configValue) {
-node._configValue(name, binding.literal);
-} else {
-node[name] = binding.literal;
-}
-}
-}
-}
-},
-_marshalIdNodes: function () {
-this.$ = {};
-for (var i = 0, l = this._notes.length, a; i < l && (a = this._notes[i]); i++) {
-if (a.id) {
-this.$[a.id] = this._findAnnotatedNode(this.root, a);
-}
-}
-},
-_marshalAnnotatedNodes: function () {
-if (this._notes && this._notes.length) {
-var r = new Array(this._notes.length);
-for (var i = 0; i < this._notes.length; i++) {
-r[i] = this._findAnnotatedNode(this.root, this._notes[i]);
-}
-this._nodes = r;
-}
-},
-_marshalAnnotatedListeners: function () {
-for (var i = 0, l = this._notes.length, a; i < l && (a = this._notes[i]); i++) {
-if (a.events && a.events.length) {
-var node = this._findAnnotatedNode(this.root, a);
-for (var j = 0, e$ = a.events, e; j < e$.length && (e = e$[j]); j++) {
-this.listen(node, e.name, e.value);
-}
-}
-}
-}
-});Polymer.Base._addFeature({
-listeners: {},
-_listenListeners: function (listeners) {
-var node, name, eventName;
-for (eventName in listeners) {
-if (eventName.indexOf('.') < 0) {
-node = this;
-name = eventName;
-} else {
-name = eventName.split('.');
-node = this.$[name[0]];
-name = name[1];
-}
-this.listen(node, name, listeners[eventName]);
-}
-},
-listen: function (node, eventName, methodName) {
-var handler = this._recallEventHandler(this, eventName, node, methodName);
-if (!handler) {
-handler = this._createEventHandler(node, eventName, methodName);
-}
-if (handler._listening) {
-return;
-}
-this._listen(node, eventName, handler);
-handler._listening = true;
-},
-_boundListenerKey: function (eventName, methodName) {
-return eventName + ':' + methodName;
-},
-_recordEventHandler: function (host, eventName, target, methodName, handler) {
-var hbl = host.__boundListeners;
-if (!hbl) {
-hbl = host.__boundListeners = new WeakMap();
-}
-var bl = hbl.get(target);
-if (!bl) {
-bl = {};
-if (!Polymer.Settings.isIE || target != window) {
-hbl.set(target, bl);
-}
-}
-var key = this._boundListenerKey(eventName, methodName);
-bl[key] = handler;
-},
-_recallEventHandler: function (host, eventName, target, methodName) {
-var hbl = host.__boundListeners;
-if (!hbl) {
-return;
-}
-var bl = hbl.get(target);
-if (!bl) {
-return;
-}
-var key = this._boundListenerKey(eventName, methodName);
-return bl[key];
-},
-_createEventHandler: function (node, eventName, methodName) {
-var host = this;
-var handler = function (e) {
-if (host[methodName]) {
-host[methodName](e, e.detail);
-} else {
-host._warn(host._logf('_createEventHandler', 'listener method `' + methodName + '` not defined'));
-}
-};
-handler._listening = false;
-this._recordEventHandler(host, eventName, node, methodName, handler);
-return handler;
-},
-unlisten: function (node, eventName, methodName) {
-var handler = this._recallEventHandler(this, eventName, node, methodName);
-if (handler) {
-this._unlisten(node, eventName, handler);
-handler._listening = false;
-}
-},
-_listen: function (node, eventName, handler) {
-node.addEventListener(eventName, handler);
-},
-_unlisten: function (node, eventName, handler) {
-node.removeEventListener(eventName, handler);
-}
-});(function () {
-'use strict';
-var wrap = Polymer.DomApi.wrap;
-var HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string';
-var GESTURE_KEY = '__polymerGestures';
-var HANDLED_OBJ = '__polymerGesturesHandled';
-var TOUCH_ACTION = '__polymerGesturesTouchAction';
-var TAP_DISTANCE = 25;
-var TRACK_DISTANCE = 5;
-var TRACK_LENGTH = 2;
-var MOUSE_TIMEOUT = 2500;
-var MOUSE_EVENTS = [
-'mousedown',
-'mousemove',
-'mouseup',
-'click'
-];
-var MOUSE_WHICH_TO_BUTTONS = [
-0,
-1,
-4,
-2
-];
-var MOUSE_HAS_BUTTONS = function () {
-try {
-return new MouseEvent('test', { buttons: 1 }).buttons === 1;
-} catch (e) {
-return false;
-}
-}();
-function isMouseEvent(name) {
-return MOUSE_EVENTS.indexOf(name) > -1;
-}
-var SUPPORTS_PASSIVE = false;
-(function () {
-try {
-var opts = Object.defineProperty({}, 'passive', {
-get: function () {
-SUPPORTS_PASSIVE = true;
-}
-});
-window.addEventListener('test', null, opts);
-window.removeEventListener('test', null, opts);
-} catch (e) {
-}
-}());
-function PASSIVE_TOUCH(eventName) {
-if (isMouseEvent(eventName) || eventName === 'touchend') {
-return;
-}
-if (HAS_NATIVE_TA && SUPPORTS_PASSIVE && Polymer.Settings.passiveTouchGestures) {
-return { passive: true };
-}
-}
-var IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);
-var mouseCanceller = function (mouseEvent) {
-var sc = mouseEvent.sourceCapabilities;
-if (sc && !sc.firesTouchEvents) {
-return;
-}
-mouseEvent[HANDLED_OBJ] = { skip: true };
-if (mouseEvent.type === 'click') {
-var path = Polymer.dom(mouseEvent).path;
-if (path) {
-for (var i = 0; i < path.length; i++) {
-if (path[i] === POINTERSTATE.mouse.target) {
-return;
-}
-}
-}
-mouseEvent.preventDefault();
-mouseEvent.stopPropagation();
-}
-};
-function setupTeardownMouseCanceller(setup) {
-var events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS;
-for (var i = 0, en; i < events.length; i++) {
-en = events[i];
-if (setup) {
-document.addEventListener(en, mouseCanceller, true);
-} else {
-document.removeEventListener(en, mouseCanceller, true);
-}
-}
-}
-function ignoreMouse(ev) {
-if (!POINTERSTATE.mouse.mouseIgnoreJob) {
-setupTeardownMouseCanceller(true);
-}
-var unset = function () {
-setupTeardownMouseCanceller();
-POINTERSTATE.mouse.target = null;
-POINTERSTATE.mouse.mouseIgnoreJob = null;
-};
-POINTERSTATE.mouse.target = Polymer.dom(ev).rootTarget;
-POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob, unset, MOUSE_TIMEOUT);
-}
-function hasLeftMouseButton(ev) {
-var type = ev.type;
-if (!isMouseEvent(type)) {
-return false;
-}
-if (type === 'mousemove') {
-var buttons = ev.buttons === undefined ? 1 : ev.buttons;
-if (ev instanceof window.MouseEvent && !MOUSE_HAS_BUTTONS) {
-buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0;
-}
-return Boolean(buttons & 1);
-} else {
-var button = ev.button === undefined ? 0 : ev.button;
-return button === 0;
-}
-}
-function isSyntheticClick(ev) {
-if (ev.type === 'click') {
-if (ev.detail === 0) {
-return true;
-}
-var t = Gestures.findOriginalTarget(ev);
-var bcr = t.getBoundingClientRect();
-var x = ev.pageX, y = ev.pageY;
-return !(x >= bcr.left && x <= bcr.right && (y >= bcr.top && y <= bcr.bottom));
-}
-return false;
-}
-var POINTERSTATE = {
-mouse: {
-target: null,
-mouseIgnoreJob: null
-},
-touch: {
-x: 0,
-y: 0,
-id: -1,
-scrollDecided: false
-}
-};
-function firstTouchAction(ev) {
-var path = Polymer.dom(ev).path;
-var ta = 'auto';
-for (var i = 0, n; i < path.length; i++) {
-n = path[i];
-if (n[TOUCH_ACTION]) {
-ta = n[TOUCH_ACTION];
-break;
-}
-}
-return ta;
-}
-function trackDocument(stateObj, movefn, upfn) {
-stateObj.movefn = movefn;
-stateObj.upfn = upfn;
-document.addEventListener('mousemove', movefn);
-document.addEventListener('mouseup', upfn);
-}
-function untrackDocument(stateObj) {
-document.removeEventListener('mousemove', stateObj.movefn);
-document.removeEventListener('mouseup', stateObj.upfn);
-stateObj.movefn = null;
-stateObj.upfn = null;
-}
-document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? { passive: true } : false);
-var Gestures = {
-gestures: {},
-recognizers: [],
-deepTargetFind: function (x, y) {
-var node = document.elementFromPoint(x, y);
-var next = node;
-while (next && next.shadowRoot) {
-next = next.shadowRoot.elementFromPoint(x, y);
-if (next) {
-node = next;
-}
-}
-return node;
-},
-findOriginalTarget: function (ev) {
-if (ev.path) {
-return ev.path[0];
-}
-return ev.target;
-},
-handleNative: function (ev) {
-var handled;
-var type = ev.type;
-var node = wrap(ev.currentTarget);
-var gobj = node[GESTURE_KEY];
-if (!gobj) {
-return;
-}
-var gs = gobj[type];
-if (!gs) {
-return;
-}
-if (!ev[HANDLED_OBJ]) {
-ev[HANDLED_OBJ] = {};
-if (type.slice(0, 5) === 'touch') {
-var t = ev.changedTouches[0];
-if (type === 'touchstart') {
-if (ev.touches.length === 1) {
-POINTERSTATE.touch.id = t.identifier;
-}
-}
-if (POINTERSTATE.touch.id !== t.identifier) {
-return;
-}
-if (!HAS_NATIVE_TA) {
-if (type === 'touchstart' || type === 'touchmove') {
-Gestures.handleTouchAction(ev);
-}
-}
-}
-}
-handled = ev[HANDLED_OBJ];
-if (handled.skip) {
-return;
-}
-var recognizers = Gestures.recognizers;
-for (var i = 0, r; i < recognizers.length; i++) {
-r = recognizers[i];
-if (gs[r.name] && !handled[r.name]) {
-if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) {
-r.reset();
-}
-}
-}
-for (i = 0, r; i < recognizers.length; i++) {
-r = recognizers[i];
-if (gs[r.name] && !handled[r.name]) {
-handled[r.name] = true;
-r[type](ev);
-}
-}
-},
-handleTouchAction: function (ev) {
-var t = ev.changedTouches[0];
-var type = ev.type;
-if (type === 'touchstart') {
-POINTERSTATE.touch.x = t.clientX;
-POINTERSTATE.touch.y = t.clientY;
-POINTERSTATE.touch.scrollDecided = false;
-} else if (type === 'touchmove') {
-if (POINTERSTATE.touch.scrollDecided) {
-return;
-}
-POINTERSTATE.touch.scrollDecided = true;
-var ta = firstTouchAction(ev);
-var prevent = false;
-var dx = Math.abs(POINTERSTATE.touch.x - t.clientX);
-var dy = Math.abs(POINTERSTATE.touch.y - t.clientY);
-if (!ev.cancelable) {
-} else if (ta === 'none') {
-prevent = true;
-} else if (ta === 'pan-x') {
-prevent = dy > dx;
-} else if (ta === 'pan-y') {
-prevent = dx > dy;
-}
-if (prevent) {
-ev.preventDefault();
-} else {
-Gestures.prevent('track');
-}
-}
-},
-add: function (node, evType, handler) {
-node = wrap(node);
-var recognizer = this.gestures[evType];
-var deps = recognizer.deps;
-var name = recognizer.name;
-var gobj = node[GESTURE_KEY];
-if (!gobj) {
-node[GESTURE_KEY] = gobj = {};
-}
-for (var i = 0, dep, gd; i < deps.length; i++) {
-dep = deps[i];
-if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') {
-continue;
-}
-gd = gobj[dep];
-if (!gd) {
-gobj[dep] = gd = { _count: 0 };
-}
-if (gd._count === 0) {
-node.addEventListener(dep, this.handleNative, PASSIVE_TOUCH(dep));
-}
-gd[name] = (gd[name] || 0) + 1;
-gd._count = (gd._count || 0) + 1;
-}
-node.addEventListener(evType, handler);
-if (recognizer.touchAction) {
-this.setTouchAction(node, recognizer.touchAction);
-}
-},
-remove: function (node, evType, handler) {
-node = wrap(node);
-var recognizer = this.gestures[evType];
-var deps = recognizer.deps;
-var name = recognizer.name;
-var gobj = node[GESTURE_KEY];
-if (gobj) {
-for (var i = 0, dep, gd; i < deps.length; i++) {
-dep = deps[i];
-gd = gobj[dep];
-if (gd && gd[name]) {
-gd[name] = (gd[name] || 1) - 1;
-gd._count = (gd._count || 1) - 1;
-if (gd._count === 0) {
-node.removeEventListener(dep, this.handleNative, PASSIVE_TOUCH(dep));
-}
-}
-}
-}
-node.removeEventListener(evType, handler);
-},
-register: function (recog) {
-this.recognizers.push(recog);
-for (var i = 0; i < recog.emits.length; i++) {
-this.gestures[recog.emits[i]] = recog;
-}
-},
-findRecognizerByEvent: function (evName) {
-for (var i = 0, r; i < this.recognizers.length; i++) {
-r = this.recognizers[i];
-for (var j = 0, n; j < r.emits.length; j++) {
-n = r.emits[j];
-if (n === evName) {
-return r;
-}
-}
-}
-return null;
-},
-setTouchAction: function (node, value) {
-if (HAS_NATIVE_TA) {
-node.style.touchAction = value;
-}
-node[TOUCH_ACTION] = value;
-},
-fire: function (target, type, detail) {
-var ev = Polymer.Base.fire(type, detail, {
-node: target,
-bubbles: true,
-cancelable: true
-});
-if (ev.defaultPrevented) {
-var preventer = detail.preventer || detail.sourceEvent;
-if (preventer && preventer.preventDefault) {
-preventer.preventDefault();
-}
-}
-},
-prevent: function (evName) {
-var recognizer = this.findRecognizerByEvent(evName);
-if (recognizer.info) {
-recognizer.info.prevent = true;
-}
-},
-resetMouseCanceller: function () {
-if (POINTERSTATE.mouse.mouseIgnoreJob) {
-POINTERSTATE.mouse.mouseIgnoreJob.complete();
-}
-}
-};
-Gestures.register({
-name: 'downup',
-deps: [
-'mousedown',
-'touchstart',
-'touchend'
-],
-flow: {
-start: [
-'mousedown',
-'touchstart'
-],
-end: [
-'mouseup',
-'touchend'
-]
-},
-emits: [
-'down',
-'up'
-],
-info: {
-movefn: null,
-upfn: null
-},
-reset: function () {
-untrackDocument(this.info);
-},
-mousedown: function (e) {
-if (!hasLeftMouseButton(e)) {
-return;
-}
-var t = Gestures.findOriginalTarget(e);
-var self = this;
-var movefn = function movefn(e) {
-if (!hasLeftMouseButton(e)) {
-self.fire('up', t, e);
-untrackDocument(self.info);
-}
-};
-var upfn = function upfn(e) {
-if (hasLeftMouseButton(e)) {
-self.fire('up', t, e);
-}
-untrackDocument(self.info);
-};
-trackDocument(this.info, movefn, upfn);
-this.fire('down', t, e);
-},
-touchstart: function (e) {
-this.fire('down', Gestures.findOriginalTarget(e), e.changedTouches[0], e);
-},
-touchend: function (e) {
-this.fire('up', Gestures.findOriginalTarget(e), e.changedTouches[0], e);
-},
-fire: function (type, target, event, preventer) {
-Gestures.fire(target, type, {
-x: event.clientX,
-y: event.clientY,
-sourceEvent: event,
-preventer: preventer,
-prevent: function (e) {
-return Gestures.prevent(e);
-}
-});
-}
-});
-Gestures.register({
-name: 'track',
-touchAction: 'none',
-deps: [
-'mousedown',
-'touchstart',
-'touchmove',
-'touchend'
-],
-flow: {
-start: [
-'mousedown',
-'touchstart'
-],
-end: [
-'mouseup',
-'touchend'
-]
-},
-emits: ['track'],
-info: {
-x: 0,
-y: 0,
-state: 'start',
-started: false,
-moves: [],
-addMove: function (move) {
-if (this.moves.length > TRACK_LENGTH) {
-this.moves.shift();
-}
-this.moves.push(move);
-},
-movefn: null,
-upfn: null,
-prevent: false
-},
-reset: function () {
-this.info.state = 'start';
-this.info.started = false;
-this.info.moves = [];
-this.info.x = 0;
-this.info.y = 0;
-this.info.prevent = false;
-untrackDocument(this.info);
-},
-hasMovedEnough: function (x, y) {
-if (this.info.prevent) {
-return false;
-}
-if (this.info.started) {
-return true;
-}
-var dx = Math.abs(this.info.x - x);
-var dy = Math.abs(this.info.y - y);
-return dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE;
-},
-mousedown: function (e) {
-if (!hasLeftMouseButton(e)) {
-return;
-}
-var t = Gestures.findOriginalTarget(e);
-var self = this;
-var movefn = function movefn(e) {
-var x = e.clientX, y = e.clientY;
-if (self.hasMovedEnough(x, y)) {
-self.info.state = self.info.started ? e.type === 'mouseup' ? 'end' : 'track' : 'start';
-if (self.info.state === 'start') {
-Gestures.prevent('tap');
-}
-self.info.addMove({
-x: x,
-y: y
-});
-if (!hasLeftMouseButton(e)) {
-self.info.state = 'end';
-untrackDocument(self.info);
-}
-self.fire(t, e);
-self.info.started = true;
-}
-};
-var upfn = function upfn(e) {
-if (self.info.started) {
-movefn(e);
-}
-untrackDocument(self.info);
-};
-trackDocument(this.info, movefn, upfn);
-this.info.x = e.clientX;
-this.info.y = e.clientY;
-},
-touchstart: function (e) {
-var ct = e.changedTouches[0];
-this.info.x = ct.clientX;
-this.info.y = ct.clientY;
-},
-touchmove: function (e) {
-var t = Gestures.findOriginalTarget(e);
-var ct = e.changedTouches[0];
-var x = ct.clientX, y = ct.clientY;
-if (this.hasMovedEnough(x, y)) {
-if (this.info.state === 'start') {
-Gestures.prevent('tap');
-}
-this.info.addMove({
-x: x,
-y: y
-});
-this.fire(t, ct);
-this.info.state = 'track';
-this.info.started = true;
-}
-},
-touchend: function (e) {
-var t = Gestures.findOriginalTarget(e);
-var ct = e.changedTouches[0];
-if (this.info.started) {
-this.info.state = 'end';
-this.info.addMove({
-x: ct.clientX,
-y: ct.clientY
-});
-this.fire(t, ct, e);
-}
-},
-fire: function (target, touch, preventer) {
-var secondlast = this.info.moves[this.info.moves.length - 2];
-var lastmove = this.info.moves[this.info.moves.length - 1];
-var dx = lastmove.x - this.info.x;
-var dy = lastmove.y - this.info.y;
-var ddx, ddy = 0;
-if (secondlast) {
-ddx = lastmove.x - secondlast.x;
-ddy = lastmove.y - secondlast.y;
-}
-return Gestures.fire(target, 'track', {
-state: this.info.state,
-x: touch.clientX,
-y: touch.clientY,
-dx: dx,
-dy: dy,
-ddx: ddx,
-ddy: ddy,
-sourceEvent: touch,
-preventer: preventer,
-hover: function () {
-return Gestures.deepTargetFind(touch.clientX, touch.clientY);
-}
-});
-}
-});
-Gestures.register({
-name: 'tap',
-deps: [
-'mousedown',
-'click',
-'touchstart',
-'touchend'
-],
-flow: {
-start: [
-'mousedown',
-'touchstart'
-],
-end: [
-'click',
-'touchend'
-]
-},
-emits: ['tap'],
-info: {
-x: NaN,
-y: NaN,
-prevent: false
-},
-reset: function () {
-this.info.x = NaN;
-this.info.y = NaN;
-this.info.prevent = false;
-},
-save: function (e) {
-this.info.x = e.clientX;
-this.info.y = e.clientY;
-},
-mousedown: function (e) {
-if (hasLeftMouseButton(e)) {
-this.save(e);
-}
-},
-click: function (e) {
-if (hasLeftMouseButton(e)) {
-this.forward(e);
-}
-},
-touchstart: function (e) {
-this.save(e.changedTouches[0], e);
-},
-touchend: function (e) {
-this.forward(e.changedTouches[0], e);
-},
-forward: function (e, preventer) {
-var dx = Math.abs(e.clientX - this.info.x);
-var dy = Math.abs(e.clientY - this.info.y);
-var t = Gestures.findOriginalTarget(e);
-if (isNaN(dx) || isNaN(dy) || dx <= TAP_DISTANCE && dy <= TAP_DISTANCE || isSyntheticClick(e)) {
-if (!this.info.prevent) {
-Gestures.fire(t, 'tap', {
-x: e.clientX,
-y: e.clientY,
-sourceEvent: e,
-preventer: preventer
-});
-}
-}
-}
-});
-var DIRECTION_MAP = {
-x: 'pan-x',
-y: 'pan-y',
-none: 'none',
-all: 'auto'
-};
-Polymer.Base._addFeature({
-_setupGestures: function () {
-this.__polymerGestures = null;
-},
-_listen: function (node, eventName, handler) {
-if (Gestures.gestures[eventName]) {
-Gestures.add(node, eventName, handler);
-} else {
-node.addEventListener(eventName, handler);
-}
-},
-_unlisten: function (node, eventName, handler) {
-if (Gestures.gestures[eventName]) {
-Gestures.remove(node, eventName, handler);
-} else {
-node.removeEventListener(eventName, handler);
-}
-},
-setScrollDirection: function (direction, node) {
-node = node || this;
-Gestures.setTouchAction(node, DIRECTION_MAP[direction] || 'auto');
-}
-});
-Polymer.Gestures = Gestures;
-}());(function () {
-'use strict';
-Polymer.Base._addFeature({
-$$: function (slctr) {
-return Polymer.dom(this.root).querySelector(slctr);
-},
-toggleClass: function (name, bool, node) {
-node = node || this;
-if (arguments.length == 1) {
-bool = !node.classList.contains(name);
-}
-if (bool) {
-Polymer.dom(node).classList.add(name);
-} else {
-Polymer.dom(node).classList.remove(name);
-}
-},
-toggleAttribute: function (name, bool, node) {
-node = node || this;
-if (arguments.length == 1) {
-bool = !node.hasAttribute(name);
-}
-if (bool) {
-Polymer.dom(node).setAttribute(name, '');
-} else {
-Polymer.dom(node).removeAttribute(name);
-}
-},
-classFollows: function (name, toElement, fromElement) {
-if (fromElement) {
-Polymer.dom(fromElement).classList.remove(name);
-}
-if (toElement) {
-Polymer.dom(toElement).classList.add(name);
-}
-},
-attributeFollows: function (name, toElement, fromElement) {
-if (fromElement) {
-Polymer.dom(fromElement).removeAttribute(name);
-}
-if (toElement) {
-Polymer.dom(toElement).setAttribute(name, '');
-}
-},
-getEffectiveChildNodes: function () {
-return Polymer.dom(this).getEffectiveChildNodes();
-},
-getEffectiveChildren: function () {
-var list = Polymer.dom(this).getEffectiveChildNodes();
-return list.filter(function (n) {
-return n.nodeType === Node.ELEMENT_NODE;
-});
-},
-getEffectiveTextContent: function () {
-var cn = this.getEffectiveChildNodes();
-var tc = [];
-for (var i = 0, c; c = cn[i]; i++) {
-if (c.nodeType !== Node.COMMENT_NODE) {
-tc.push(Polymer.dom(c).textContent);
-}
-}
-return tc.join('');
-},
-queryEffectiveChildren: function (slctr) {
-var e$ = Polymer.dom(this).queryDistributedElements(slctr);
-return e$ && e$[0];
-},
-queryAllEffectiveChildren: function (slctr) {
-return Polymer.dom(this).queryDistributedElements(slctr);
-},
-getContentChildNodes: function (slctr) {
-var content = Polymer.dom(this.root).querySelector(slctr || 'content');
-return content ? Polymer.dom(content).getDistributedNodes() : [];
-},
-getContentChildren: function (slctr) {
-return this.getContentChildNodes(slctr).filter(function (n) {
-return n.nodeType === Node.ELEMENT_NODE;
-});
-},
-fire: function (type, detail, options) {
-options = options || Polymer.nob;
-var node = options.node || this;
-detail = detail === null || detail === undefined ? {} : detail;
-var bubbles = options.bubbles === undefined ? true : options.bubbles;
-var cancelable = Boolean(options.cancelable);
-var useCache = options._useCache;
-var event = this._getEvent(type, bubbles, cancelable, useCache);
-event.detail = detail;
-if (useCache) {
-this.__eventCache[type] = null;
-}
-node.dispatchEvent(event);
-if (useCache) {
-this.__eventCache[type] = event;
-}
-return event;
-},
-__eventCache: {},
-_getEvent: function (type, bubbles, cancelable, useCache) {
-var event = useCache && this.__eventCache[type];
-if (!event || (event.bubbles != bubbles || event.cancelable != cancelable)) {
-event = new Event(type, {
-bubbles: Boolean(bubbles),
-cancelable: cancelable
-});
-}
-return event;
-},
-async: function (callback, waitTime) {
-var self = this;
-return Polymer.Async.run(function () {
-callback.call(self);
-}, waitTime);
-},
-cancelAsync: function (handle) {
-Polymer.Async.cancel(handle);
-},
-arrayDelete: function (path, item) {
-var index;
-if (Array.isArray(path)) {
-index = path.indexOf(item);
-if (index >= 0) {
-return path.splice(index, 1);
-}
-} else {
-var arr = this._get(path);
-index = arr.indexOf(item);
-if (index >= 0) {
-return this.splice(path, index, 1);
-}
-}
-},
-transform: function (transform, node) {
-node = node || this;
-node.style.webkitTransform = transform;
-node.style.transform = transform;
-},
-translate3d: function (x, y, z, node) {
-node = node || this;
-this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node);
-},
-importHref: function (href, onload, onerror, optAsync) {
-var link = document.createElement('link');
-link.rel = 'import';
-link.href = href;
-var list = Polymer.Base.importHref.imported = Polymer.Base.importHref.imported || {};
-var cached = list[link.href];
-var imprt = cached || link;
-var self = this;
-var loadListener = function (e) {
-e.target.__firedLoad = true;
-e.target.removeEventListener('load', loadListener);
-e.target.removeEventListener('error', errorListener);
-return onload.call(self, e);
-};
-var errorListener = function (e) {
-e.target.__firedError = true;
-e.target.removeEventListener('load', loadListener);
-e.target.removeEventListener('error', errorListener);
-return onerror.call(self, e);
-};
-if (onload) {
-imprt.addEventListener('load', loadListener);
-}
-if (onerror) {
-imprt.addEventListener('error', errorListener);
-}
-if (cached) {
-if (cached.__firedLoad) {
-cached.dispatchEvent(new Event('load'));
-}
-if (cached.__firedError) {
-cached.dispatchEvent(new Event('error'));
-}
-} else {
-list[link.href] = link;
-optAsync = Boolean(optAsync);
-if (optAsync) {
-link.setAttribute('async', '');
-}
-document.head.appendChild(link);
-}
-return imprt;
-},
-create: function (tag, props) {
-var elt = document.createElement(tag);
-if (props) {
-for (var n in props) {
-elt[n] = props[n];
-}
-}
-return elt;
-},
-isLightDescendant: function (node) {
-return this !== node && this.contains(node) && Polymer.dom(this).getOwnerRoot() === Polymer.dom(node).getOwnerRoot();
-},
-isLocalDescendant: function (node) {
-return this.root === Polymer.dom(node).getOwnerRoot();
-}
-});
-if (!Polymer.Settings.useNativeCustomElements) {
-var importHref = Polymer.Base.importHref;
-Polymer.Base.importHref = function (href, onload, onerror, optAsync) {
-CustomElements.ready = false;
-var loadFn = function (e) {
-CustomElements.upgradeDocumentTree(document);
-CustomElements.ready = true;
-if (onload) {
-return onload.call(this, e);
-}
-};
-return importHref.call(this, href, loadFn, onerror, optAsync);
-};
-}
-}());Polymer.Bind = {
-prepareModel: function (model) {
-Polymer.Base.mixin(model, this._modelApi);
-},
-_modelApi: {
-_notifyChange: function (source, event, value) {
-value = value === undefined ? this[source] : value;
-event = event || Polymer.CaseMap.camelToDashCase(source) + '-changed';
-this.fire(event, { value: value }, {
-bubbles: false,
-cancelable: false,
-_useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE
-});
-},
-_propertySetter: function (property, value, effects, fromAbove) {
-var old = this.__data__[property];
-if (old !== value && (old === old || value === value)) {
-this.__data__[property] = value;
-if (typeof value == 'object') {
-this._clearPath(property);
-}
-if (this._propertyChanged) {
-this._propertyChanged(property, value, old);
-}
-if (effects) {
-this._effectEffects(property, value, effects, old, fromAbove);
-}
-}
-return old;
-},
-__setProperty: function (property, value, quiet, node) {
-node = node || this;
-var effects = node._propertyEffects && node._propertyEffects[property];
-if (effects) {
-node._propertySetter(property, value, effects, quiet);
-} else if (node[property] !== value) {
-node[property] = value;
-}
-},
-_effectEffects: function (property, value, effects, old, fromAbove) {
-for (var i = 0, l = effects.length, fx; i < l && (fx = effects[i]); i++) {
-fx.fn.call(this, property, this[property], fx.effect, old, fromAbove);
-}
-},
-_clearPath: function (path) {
-for (var prop in this.__data__) {
-if (Polymer.Path.isDescendant(path, prop)) {
-this.__data__[prop] = undefined;
-}
-}
-}
-},
-ensurePropertyEffects: function (model, property) {
-if (!model._propertyEffects) {
-model._propertyEffects = {};
-}
-var fx = model._propertyEffects[property];
-if (!fx) {
-fx = model._propertyEffects[property] = [];
-}
-return fx;
-},
-addPropertyEffect: function (model, property, kind, effect) {
-var fx = this.ensurePropertyEffects(model, property);
-var propEffect = {
-kind: kind,
-effect: effect,
-fn: Polymer.Bind['_' + kind + 'Effect']
-};
-fx.push(propEffect);
-return propEffect;
-},
-createBindings: function (model) {
-var fx$ = model._propertyEffects;
-if (fx$) {
-for (var n in fx$) {
-var fx = fx$[n];
-fx.sort(this._sortPropertyEffects);
-this._createAccessors(model, n, fx);
-}
-}
-},
-_sortPropertyEffects: function () {
-var EFFECT_ORDER = {
-'compute': 0,
-'annotation': 1,
-'annotatedComputation': 2,
-'reflect': 3,
-'notify': 4,
-'observer': 5,
-'complexObserver': 6,
-'function': 7
-};
-return function (a, b) {
-return EFFECT_ORDER[a.kind] - EFFECT_ORDER[b.kind];
-};
-}(),
-_createAccessors: function (model, property, effects) {
-var defun = {
-get: function () {
-return this.__data__[property];
-}
-};
-var setter = function (value) {
-this._propertySetter(property, value, effects);
-};
-var info = model.getPropertyInfo && model.getPropertyInfo(property);
-if (info && info.readOnly) {
-if (!info.computed) {
-model['_set' + this.upper(property)] = setter;
-}
-} else {
-defun.set = setter;
-}
-Object.defineProperty(model, property, defun);
-},
-upper: function (name) {
-return name[0].toUpperCase() + name.substring(1);
-},
-_addAnnotatedListener: function (model, index, property, path, event, negated) {
-if (!model._bindListeners) {
-model._bindListeners = [];
-}
-var fn = this._notedListenerFactory(property, path, Polymer.Path.isDeep(path), negated);
-var eventName = event || Polymer.CaseMap.camelToDashCase(property) + '-changed';
-model._bindListeners.push({
-index: index,
-property: property,
-path: path,
-changedFn: fn,
-event: eventName
-});
-},
-_isEventBogus: function (e, target) {
-return e.path && e.path[0] !== target;
-},
-_notedListenerFactory: function (property, path, isStructured, negated) {
-return function (target, value, targetPath) {
-if (targetPath) {
-var newPath = Polymer.Path.translate(property, path, targetPath);
-this._notifyPath(newPath, value);
-} else {
-value = target[property];
-if (negated) {
-value = !value;
-}
-if (!isStructured) {
-this[path] = value;
-} else {
-if (this.__data__[path] != value) {
-this.set(path, value);
-}
-}
-}
-};
-},
-prepareInstance: function (inst) {
-inst.__data__ = Object.create(null);
-},
-setupBindListeners: function (inst) {
-var b$ = inst._bindListeners;
-for (var i = 0, l = b$.length, info; i < l && (info = b$[i]); i++) {
-var node = inst._nodes[info.index];
-this._addNotifyListener(node, inst, info.event, info.changedFn);
-}
-},
-_addNotifyListener: function (element, context, event, changedFn) {
-element.addEventListener(event, function (e) {
-return context._notifyListener(changedFn, e);
-});
-}
-};Polymer.Base.mixin(Polymer.Bind, {
-_shouldAddListener: function (effect) {
-return effect.name && effect.kind != 'attribute' && effect.kind != 'text' && !effect.isCompound && effect.parts[0].mode === '{';
-},
-_annotationEffect: function (source, value, effect) {
-if (source != effect.value) {
-value = this._get(effect.value);
-this.__data__[effect.value] = value;
-}
-this._applyEffectValue(effect, value);
-},
-_reflectEffect: function (source, value, effect) {
-this.reflectPropertyToAttribute(source, effect.attribute, value);
-},
-_notifyEffect: function (source, value, effect, old, fromAbove) {
-if (!fromAbove) {
-this._notifyChange(source, effect.event, value);
-}
-},
-_functionEffect: function (source, value, fn, old, fromAbove) {
-fn.call(this, source, value, old, fromAbove);
-},
-_observerEffect: function (source, value, effect, old) {
-var fn = this[effect.method];
-if (fn) {
-fn.call(this, value, old);
-} else {
-this._warn(this._logf('_observerEffect', 'observer method `' + effect.method + '` not defined'));
-}
-},
-_complexObserverEffect: function (source, value, effect) {
-var fn = this[effect.method];
-if (fn) {
-var args = Polymer.Bind._marshalArgs(this.__data__, effect, source, value);
-if (args) {
-fn.apply(this, args);
-}
-} else if (effect.dynamicFn) {
-} else {
-this._warn(this._logf('_complexObserverEffect', 'observer method `' + effect.method + '` not defined'));
-}
-},
-_computeEffect: function (source, value, effect) {
-var fn = this[effect.method];
-if (fn) {
-var args = Polymer.Bind._marshalArgs(this.__data__, effect, source, value);
-if (args) {
-var computedvalue = fn.apply(this, args);
-this.__setProperty(effect.name, computedvalue);
-}
-} else if (effect.dynamicFn) {
-} else {
-this._warn(this._logf('_computeEffect', 'compute method `' + effect.method + '` not defined'));
-}
-},
-_annotatedComputationEffect: function (source, value, effect) {
-var computedHost = this._rootDataHost || this;
-var fn = computedHost[effect.method];
-if (fn) {
-var args = Polymer.Bind._marshalArgs(this.__data__, effect, source, value);
-if (args) {
-var computedvalue = fn.apply(computedHost, args);
-this._applyEffectValue(effect, computedvalue);
-}
-} else if (effect.dynamicFn) {
-} else {
-computedHost._warn(computedHost._logf('_annotatedComputationEffect', 'compute method `' + effect.method + '` not defined'));
-}
-},
-_marshalArgs: function (model, effect, path, value) {
-var values = [];
-var args = effect.args;
-var bailoutEarly = args.length > 1 || effect.dynamicFn;
-for (var i = 0, l = args.length; i < l; i++) {
-var arg = args[i];
-var name = arg.name;
-var v;
-if (arg.literal) {
-v = arg.value;
-} else if (path === name) {
-v = value;
-} else {
-v = model[name];
-if (v === undefined && arg.structured) {
-v = Polymer.Base._get(name, model);
-}
-}
-if (bailoutEarly && v === undefined) {
-return;
-}
-if (arg.wildcard) {
-var matches = Polymer.Path.isAncestor(path, name);
-values[i] = {
-path: matches ? path : name,
-value: matches ? value : v,
-base: v
-};
-} else {
-values[i] = v;
-}
-}
-return values;
-}
-});Polymer.Base._addFeature({
-_addPropertyEffect: function (property, kind, effect) {
-var prop = Polymer.Bind.addPropertyEffect(this, property, kind, effect);
-prop.pathFn = this['_' + prop.kind + 'PathEffect'];
-},
-_prepEffects: function () {
-Polymer.Bind.prepareModel(this);
-this._addAnnotationEffects(this._notes);
-},
-_prepBindings: function () {
-Polymer.Bind.createBindings(this);
-},
-_addPropertyEffects: function (properties) {
-if (properties) {
-for (var p in properties) {
-var prop = properties[p];
-if (prop.observer) {
-this._addObserverEffect(p, prop.observer);
-}
-if (prop.computed) {
-prop.readOnly = true;
-this._addComputedEffect(p, prop.computed);
-}
-if (prop.notify) {
-this._addPropertyEffect(p, 'notify', { event: Polymer.CaseMap.camelToDashCase(p) + '-changed' });
-}
-if (prop.reflectToAttribute) {
-var attr = Polymer.CaseMap.camelToDashCase(p);
-if (attr[0] === '-') {
-this._warn(this._logf('_addPropertyEffects', 'Property ' + p + ' cannot be reflected to attribute ' + attr + ' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.'));
-} else {
-this._addPropertyEffect(p, 'reflect', { attribute: attr });
-}
-}
-if (prop.readOnly) {
-Polymer.Bind.ensurePropertyEffects(this, p);
-}
-}
-}
-},
-_addComputedEffect: function (name, expression) {
-var sig = this._parseMethod(expression);
-var dynamicFn = sig.dynamicFn;
-for (var i = 0, arg; i < sig.args.length && (arg = sig.args[i]); i++) {
-this._addPropertyEffect(arg.model, 'compute', {
-method: sig.method,
-args: sig.args,
-trigger: arg,
-name: name,
-dynamicFn: dynamicFn
-});
-}
-if (dynamicFn) {
-this._addPropertyEffect(sig.method, 'compute', {
-method: sig.method,
-args: sig.args,
-trigger: null,
-name: name,
-dynamicFn: dynamicFn
-});
-}
-},
-_addObserverEffect: function (property, observer) {
-this._addPropertyEffect(property, 'observer', {
-method: observer,
-property: property
-});
-},
-_addComplexObserverEffects: function (observers) {
-if (observers) {
-for (var i = 0, o; i < observers.length && (o = observers[i]); i++) {
-this._addComplexObserverEffect(o);
-}
-}
-},
-_addComplexObserverEffect: function (observer) {
-var sig = this._parseMethod(observer);
-if (!sig) {
-throw new Error('Malformed observer expression \'' + observer + '\'');
-}
-var dynamicFn = sig.dynamicFn;
-for (var i = 0, arg; i < sig.args.length && (arg = sig.args[i]); i++) {
-this._addPropertyEffect(arg.model, 'complexObserver', {
-method: sig.method,
-args: sig.args,
-trigger: arg,
-dynamicFn: dynamicFn
-});
-}
-if (dynamicFn) {
-this._addPropertyEffect(sig.method, 'complexObserver', {
-method: sig.method,
-args: sig.args,
-trigger: null,
-dynamicFn: dynamicFn
-});
-}
-},
-_addAnnotationEffects: function (notes) {
-for (var i = 0, note; i < notes.length && (note = notes[i]); i++) {
-var b$ = note.bindings;
-for (var j = 0, binding; j < b$.length && (binding = b$[j]); j++) {
-this._addAnnotationEffect(binding, i);
-}
-}
-},
-_addAnnotationEffect: function (note, index) {
-if (Polymer.Bind._shouldAddListener(note)) {
-Polymer.Bind._addAnnotatedListener(this, index, note.name, note.parts[0].value, note.parts[0].event, note.parts[0].negate);
-}
-for (var i = 0; i < note.parts.length; i++) {
-var part = note.parts[i];
-if (part.signature) {
-this._addAnnotatedComputationEffect(note, part, index);
-} else if (!part.literal) {
-if (note.kind === 'attribute' && note.name[0] === '-') {
-this._warn(this._logf('_addAnnotationEffect', 'Cannot set attribute ' + note.name + ' because "-" is not a valid attribute starting character'));
-} else {
-this._addPropertyEffect(part.model, 'annotation', {
-kind: note.kind,
-index: index,
-name: note.name,
-propertyName: note.propertyName,
-value: part.value,
-isCompound: note.isCompound,
-compoundIndex: part.compoundIndex,
-event: part.event,
-customEvent: part.customEvent,
-negate: part.negate
-});
-}
-}
-}
-},
-_addAnnotatedComputationEffect: function (note, part, index) {
-var sig = part.signature;
-if (sig.static) {
-this.__addAnnotatedComputationEffect('__static__', index, note, part, null);
-} else {
-for (var i = 0, arg; i < sig.args.length && (arg = sig.args[i]); i++) {
-if (!arg.literal) {
-this.__addAnnotatedComputationEffect(arg.model, index, note, part, arg);
-}
-}
-if (sig.dynamicFn) {
-this.__addAnnotatedComputationEffect(sig.method, index, note, part, null);
-}
-}
-},
-__addAnnotatedComputationEffect: function (property, index, note, part, trigger) {
-this._addPropertyEffect(property, 'annotatedComputation', {
-index: index,
-isCompound: note.isCompound,
-compoundIndex: part.compoundIndex,
-kind: note.kind,
-name: note.name,
-negate: part.negate,
-method: part.signature.method,
-args: part.signature.args,
-trigger: trigger,
-dynamicFn: part.signature.dynamicFn
-});
-},
-_parseMethod: function (expression) {
-var m = expression.match(/([^\s]+?)\(([\s\S]*)\)/);
-if (m) {
-var sig = {
-method: m[1],
-static: true
-};
-if (this.getPropertyInfo(sig.method) !== Polymer.nob) {
-sig.static = false;
-sig.dynamicFn = true;
-}
-if (m[2].trim()) {
-var args = m[2].replace(/\\,/g, '&comma;').split(',');
-return this._parseArgs(args, sig);
-} else {
-sig.args = Polymer.nar;
-return sig;
-}
-}
-},
-_parseArgs: function (argList, sig) {
-sig.args = argList.map(function (rawArg) {
-var arg = this._parseArg(rawArg);
-if (!arg.literal) {
-sig.static = false;
-}
-return arg;
-}, this);
-return sig;
-},
-_parseArg: function (rawArg) {
-var arg = rawArg.trim().replace(/&comma;/g, ',').replace(/\\(.)/g, '$1');
-var a = { name: arg };
-var fc = arg[0];
-if (fc === '-') {
-fc = arg[1];
-}
-if (fc >= '0' && fc <= '9') {
-fc = '#';
-}
-switch (fc) {
-case '\'':
-case '"':
-a.value = arg.slice(1, -1);
-a.literal = true;
-break;
-case '#':
-a.value = Number(arg);
-a.literal = true;
-break;
-}
-if (!a.literal) {
-a.model = Polymer.Path.root(arg);
-a.structured = Polymer.Path.isDeep(arg);
-if (a.structured) {
-a.wildcard = arg.slice(-2) == '.*';
-if (a.wildcard) {
-a.name = arg.slice(0, -2);
-}
-}
-}
-return a;
-},
-_marshalInstanceEffects: function () {
-Polymer.Bind.prepareInstance(this);
-if (this._bindListeners) {
-Polymer.Bind.setupBindListeners(this);
-}
-},
-_applyEffectValue: function (info, value) {
-var node = this._nodes[info.index];
-var property = info.name;
-value = this._computeFinalAnnotationValue(node, property, value, info);
-if (info.kind == 'attribute') {
-this.serializeValueToAttribute(value, property, node);
-} else {
-var pinfo = node._propertyInfo && node._propertyInfo[property];
-if (pinfo && pinfo.readOnly) {
-return;
-}
-this.__setProperty(property, value, Polymer.Settings.suppressBindingNotifications, node);
-}
-},
-_computeFinalAnnotationValue: function (node, property, value, info) {
-if (info.negate) {
-value = !value;
-}
-if (info.isCompound) {
-var storage = node.__compoundStorage__[property];
-storage[info.compoundIndex] = value;
-value = storage.join('');
-}
-if (info.kind !== 'attribute') {
-if (property === 'className') {
-value = this._scopeElementClass(node, value);
-}
-if (property === 'textContent' || node.localName == 'input' && property == 'value') {
-value = value == undefined ? '' : value;
-}
-}
-return value;
-},
-_executeStaticEffects: function () {
-if (this._propertyEffects && this._propertyEffects.__static__) {
-this._effectEffects('__static__', null, this._propertyEffects.__static__);
-}
-}
-});(function () {
-var usePolyfillProto = Polymer.Settings.usePolyfillProto;
-var avoidInstanceProperties = Boolean(Object.getOwnPropertyDescriptor(document.documentElement, 'properties'));
-Polymer.Base._addFeature({
-_setupConfigure: function (initialConfig) {
-this._config = {};
-this._handlers = [];
-this._aboveConfig = null;
-if (initialConfig) {
-for (var i in initialConfig) {
-if (initialConfig[i] !== undefined) {
-this._config[i] = initialConfig[i];
-}
-}
-}
-},
-_marshalAttributes: function () {
-this._takeAttributesToModel(this._config);
-},
-_attributeChangedImpl: function (name) {
-var model = this._clientsReadied ? this : this._config;
-this._setAttributeToProperty(model, name);
-},
-_configValue: function (name, value) {
-var info = this._propertyInfo[name];
-if (!info || !info.readOnly) {
-this._config[name] = value;
-}
-},
-_beforeClientsReady: function () {
-this._configure();
-},
-_configure: function () {
-this._configureAnnotationReferences();
-this._configureInstanceProperties();
-this._aboveConfig = this.mixin({}, this._config);
-var config = {};
-for (var i = 0; i < this.behaviors.length; i++) {
-this._configureProperties(this.behaviors[i].properties, config);
-}
-this._configureProperties(avoidInstanceProperties ? this.__proto__.properties : this.properties, config);
-this.mixin(config, this._aboveConfig);
-this._config = config;
-if (this._clients && this._clients.length) {
-this._distributeConfig(this._config);
-}
-},
-_configureInstanceProperties: function () {
-for (var i in this._propertyEffects) {
-if (!usePolyfillProto && this.hasOwnProperty(i)) {
-this._configValue(i, this[i]);
-delete this[i];
-}
-}
-},
-_configureProperties: function (properties, config) {
-for (var i in properties) {
-var c = properties[i];
-if (c.value !== undefined) {
-var value = c.value;
-if (typeof value == 'function') {
-value = value.call(this, this._config);
-}
-config[i] = value;
-}
-}
-},
-_distributeConfig: function (config) {
-var fx$ = this._propertyEffects;
-if (fx$) {
-for (var p in config) {
-var fx = fx$[p];
-if (fx) {
-for (var i = 0, l = fx.length, x; i < l && (x = fx[i]); i++) {
-if (x.kind === 'annotation') {
-var node = this._nodes[x.effect.index];
-var name = x.effect.propertyName;
-var isAttr = x.effect.kind == 'attribute';
-var hasEffect = node._propertyEffects && node._propertyEffects[name];
-if (node._configValue && (hasEffect || !isAttr)) {
-var value = p === x.effect.value ? config[p] : this._get(x.effect.value, config);
-value = this._computeFinalAnnotationValue(node, name, value, x.effect);
-if (isAttr) {
-value = node.deserialize(this.serialize(value), node._propertyInfo[name].type);
-}
-node._configValue(name, value);
-}
-}
-}
-}
-}
-}
-},
-_afterClientsReady: function () {
-this.importPath = this._importPath;
-this.rootPath = Polymer.rootPath;
-this._executeStaticEffects();
-this._applyConfig(this._config, this._aboveConfig);
-this._flushHandlers();
-},
-_applyConfig: function (config, aboveConfig) {
-for (var n in config) {
-if (this[n] === undefined) {
-this.__setProperty(n, config[n], n in aboveConfig);
-}
-}
-},
-_notifyListener: function (fn, e) {
-if (!Polymer.Bind._isEventBogus(e, e.target)) {
-var value, path;
-if (e.detail) {
-value = e.detail.value;
-path = e.detail.path;
-}
-if (!this._clientsReadied) {
-this._queueHandler([
-fn,
-e.target,
-value,
-path
-]);
-} else {
-return fn.call(this, e.target, value, path);
-}
-}
-},
-_queueHandler: function (args) {
-this._handlers.push(args);
-},
-_flushHandlers: function () {
-var h$ = this._handlers;
-for (var i = 0, l = h$.length, h; i < l && (h = h$[i]); i++) {
-h[0].call(this, h[1], h[2], h[3]);
-}
-this._handlers = [];
-}
-});
-}());(function () {
-'use strict';
-var Path = Polymer.Path;
-Polymer.Base._addFeature({
-notifyPath: function (path, value, fromAbove) {
-var info = {};
-var v = this._get(path, this, info);
-if (arguments.length === 1) {
-value = v;
-}
-if (info.path) {
-this._notifyPath(info.path, value, fromAbove);
-}
-},
-_notifyPath: function (path, value, fromAbove) {
-var old = this._propertySetter(path, value);
-if (old !== value && (old === old || value === value)) {
-this._pathEffector(path, value);
-if (!fromAbove) {
-this._notifyPathUp(path, value);
-}
-return true;
-}
-},
-_getPathParts: function (path) {
-if (Array.isArray(path)) {
-var parts = [];
-for (var i = 0; i < path.length; i++) {
-var args = path[i].toString().split('.');
-for (var j = 0; j < args.length; j++) {
-parts.push(args[j]);
-}
-}
-return parts;
-} else {
-return path.toString().split('.');
-}
-},
-set: function (path, value, root) {
-var prop = root || this;
-var parts = this._getPathParts(path);
-var array;
-var last = parts[parts.length - 1];
-if (parts.length > 1) {
-for (var i = 0; i < parts.length - 1; i++) {
-var part = parts[i];
-if (array && part[0] == '#') {
-prop = Polymer.Collection.get(array).getItem(part);
-} else {
-prop = prop[part];
-if (array && parseInt(part, 10) == part) {
-parts[i] = Polymer.Collection.get(array).getKey(prop);
-}
-}
-if (!prop) {
-return;
-}
-array = Array.isArray(prop) ? prop : null;
-}
-if (array) {
-var coll = Polymer.Collection.get(array);
-var old, key;
-if (last[0] == '#') {
-key = last;
-old = coll.getItem(key);
-last = array.indexOf(old);
-coll.setItem(key, value);
-} else if (parseInt(last, 10) == last) {
-old = prop[last];
-key = coll.getKey(old);
-parts[i] = key;
-coll.setItem(key, value);
-}
-}
-prop[last] = value;
-if (!root) {
-this._notifyPath(parts.join('.'), value);
-}
-} else {
-prop[path] = value;
-}
-},
-get: function (path, root) {
-return this._get(path, root);
-},
-_get: function (path, root, info) {
-var prop = root || this;
-var parts = this._getPathParts(path);
-var array;
-for (var i = 0; i < parts.length; i++) {
-if (!prop) {
-return;
-}
-var part = parts[i];
-if (array && part[0] == '#') {
-prop = Polymer.Collection.get(array).getItem(part);
-} else {
-prop = prop[part];
-if (info && array && parseInt(part, 10) == part) {
-parts[i] = Polymer.Collection.get(array).getKey(prop);
-}
-}
-array = Array.isArray(prop) ? prop : null;
-}
-if (info) {
-info.path = parts.join('.');
-}
-return prop;
-},
-_pathEffector: function (path, value) {
-var model = Path.root(path);
-var fx$ = this._propertyEffects && this._propertyEffects[model];
-if (fx$) {
-for (var i = 0, fx; i < fx$.length && (fx = fx$[i]); i++) {
-var fxFn = fx.pathFn;
-if (fxFn) {
-fxFn.call(this, path, value, fx.effect);
-}
-}
-}
-if (this._boundPaths) {
-this._notifyBoundPaths(path, value);
-}
-},
-_annotationPathEffect: function (path, value, effect) {
-if (Path.matches(effect.value, false, path)) {
-Polymer.Bind._annotationEffect.call(this, path, value, effect);
-} else if (!effect.negate && Path.isDescendant(effect.value, path)) {
-var node = this._nodes[effect.index];
-if (node && node._notifyPath) {
-var newPath = Path.translate(effect.value, effect.name, path);
-node._notifyPath(newPath, value, true);
-}
-}
-},
-_complexObserverPathEffect: function (path, value, effect) {
-if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) {
-Polymer.Bind._complexObserverEffect.call(this, path, value, effect);
-}
-},
-_computePathEffect: function (path, value, effect) {
-if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) {
-Polymer.Bind._computeEffect.call(this, path, value, effect);
-}
-},
-_annotatedComputationPathEffect: function (path, value, effect) {
-if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) {
-Polymer.Bind._annotatedComputationEffect.call(this, path, value, effect);
-}
-},
-linkPaths: function (to, from) {
-this._boundPaths = this._boundPaths || {};
-if (from) {
-this._boundPaths[to] = from;
-} else {
-this.unlinkPaths(to);
-}
-},
-unlinkPaths: function (path) {
-if (this._boundPaths) {
-delete this._boundPaths[path];
-}
-},
-_notifyBoundPaths: function (path, value) {
-for (var a in this._boundPaths) {
-var b = this._boundPaths[a];
-if (Path.isDescendant(a, path)) {
-this._notifyPath(Path.translate(a, b, path), value);
-} else if (Path.isDescendant(b, path)) {
-this._notifyPath(Path.translate(b, a, path), value);
-}
-}
-},
-_notifyPathUp: function (path, value) {
-var rootName = Path.root(path);
-var dashCaseName = Polymer.CaseMap.camelToDashCase(rootName);
-var eventName = dashCaseName + this._EVENT_CHANGED;
-this.fire(eventName, {
-path: path,
-value: value
-}, {
-bubbles: false,
-_useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE
-});
-},
-_EVENT_CHANGED: '-changed',
-notifySplices: function (path, splices) {
-var info = {};
-var array = this._get(path, this, info);
-this._notifySplices(array, info.path, splices);
-},
-_notifySplices: function (array, path, splices) {
-var change = {
-keySplices: Polymer.Collection.applySplices(array, splices),
-indexSplices: splices
-};
-var splicesPath = path + '.splices';
-this._notifyPath(splicesPath, change);
-this._notifyPath(path + '.length', array.length);
-this.__data__[splicesPath] = {
-keySplices: null,
-indexSplices: null
-};
-},
-_notifySplice: function (array, path, index, added, removed) {
-this._notifySplices(array, path, [{
-index: index,
-addedCount: added,
-removed: removed,
-object: array,
-type: 'splice'
-}]);
-},
-push: function (path) {
-var info = {};
-var array = this._get(path, this, info);
-var args = Array.prototype.slice.call(arguments, 1);
-var len = array.length;
-var ret = array.push.apply(array, args);
-if (args.length) {
-this._notifySplice(array, info.path, len, args.length, []);
-}
-return ret;
-},
-pop: function (path) {
-var info = {};
-var array = this._get(path, this, info);
-var hadLength = Boolean(array.length);
-var args = Array.prototype.slice.call(arguments, 1);
-var ret = array.pop.apply(array, args);
-if (hadLength) {
-this._notifySplice(array, info.path, array.length, 0, [ret]);
-}
-return ret;
-},
-splice: function (path, start) {
-var info = {};
-var array = this._get(path, this, info);
-if (start < 0) {
-start = array.length - Math.floor(-start);
-} else {
-start = Math.floor(start);
-}
-if (!start) {
-start = 0;
-}
-var args = Array.prototype.slice.call(arguments, 1);
-var ret = array.splice.apply(array, args);
-var addedCount = Math.max(args.length - 2, 0);
-if (addedCount || ret.length) {
-this._notifySplice(array, info.path, start, addedCount, ret);
-}
-return ret;
-},
-shift: function (path) {
-var info = {};
-var array = this._get(path, this, info);
-var hadLength = Boolean(array.length);
-var args = Array.prototype.slice.call(arguments, 1);
-var ret = array.shift.apply(array, args);
-if (hadLength) {
-this._notifySplice(array, info.path, 0, 0, [ret]);
-}
-return ret;
-},
-unshift: function (path) {
-var info = {};
-var array = this._get(path, this, info);
-var args = Array.prototype.slice.call(arguments, 1);
-var ret = array.unshift.apply(array, args);
-if (args.length) {
-this._notifySplice(array, info.path, 0, args.length, []);
-}
-return ret;
-},
-prepareModelNotifyPath: function (model) {
-this.mixin(model, {
-fire: Polymer.Base.fire,
-_getEvent: Polymer.Base._getEvent,
-__eventCache: Polymer.Base.__eventCache,
-notifyPath: Polymer.Base.notifyPath,
-_get: Polymer.Base._get,
-_EVENT_CHANGED: Polymer.Base._EVENT_CHANGED,
-_notifyPath: Polymer.Base._notifyPath,
-_notifyPathUp: Polymer.Base._notifyPathUp,
-_pathEffector: Polymer.Base._pathEffector,
-_annotationPathEffect: Polymer.Base._annotationPathEffect,
-_complexObserverPathEffect: Polymer.Base._complexObserverPathEffect,
-_annotatedComputationPathEffect: Polymer.Base._annotatedComputationPathEffect,
-_computePathEffect: Polymer.Base._computePathEffect,
-_notifyBoundPaths: Polymer.Base._notifyBoundPaths,
-_getPathParts: Polymer.Base._getPathParts
-});
-}
-});
-}());Polymer.Base._addFeature({
-resolveUrl: function (url) {
-return Polymer.ResolveUrl.resolveUrl(url, this._importPath);
-}
-});Polymer.CssParse = function () {
-return {
-parse: function (text) {
-text = this._clean(text);
-return this._parseCss(this._lex(text), text);
-},
-_clean: function (cssText) {
-return cssText.replace(this._rx.comments, '').replace(this._rx.port, '');
-},
-_lex: function (text) {
-var root = {
-start: 0,
-end: text.length
-};
-var n = root;
-for (var i = 0, l = text.length; i < l; i++) {
-switch (text[i]) {
-case this.OPEN_BRACE:
-if (!n.rules) {
-n.rules = [];
-}
-var p = n;
-var previous = p.rules[p.rules.length - 1];
-n = {
-start: i + 1,
-parent: p,
-previous: previous
-};
-p.rules.push(n);
-break;
-case this.CLOSE_BRACE:
-n.end = i + 1;
-n = n.parent || root;
-break;
-}
-}
-return root;
-},
-_parseCss: function (node, text) {
-var t = text.substring(node.start, node.end - 1);
-node.parsedCssText = node.cssText = t.trim();
-if (node.parent) {
-var ss = node.previous ? node.previous.end : node.parent.start;
-t = text.substring(ss, node.start - 1);
-t = this._expandUnicodeEscapes(t);
-t = t.replace(this._rx.multipleSpaces, ' ');
-t = t.substring(t.lastIndexOf(';') + 1);
-var s = node.parsedSelector = node.selector = t.trim();
-node.atRule = s.indexOf(this.AT_START) === 0;
-if (node.atRule) {
-if (s.indexOf(this.MEDIA_START) === 0) {
-node.type = this.types.MEDIA_RULE;
-} else if (s.match(this._rx.keyframesRule)) {
-node.type = this.types.KEYFRAMES_RULE;
-node.keyframesName = node.selector.split(this._rx.multipleSpaces).pop();
-}
-} else {
-if (s.indexOf(this.VAR_START) === 0) {
-node.type = this.types.MIXIN_RULE;
-} else {
-node.type = this.types.STYLE_RULE;
-}
-}
-}
-var r$ = node.rules;
-if (r$) {
-for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {
-this._parseCss(r, text);
-}
-}
-return node;
-},
-_expandUnicodeEscapes: function (s) {
-return s.replace(/\\([0-9a-f]{1,6})\s/gi, function () {
-var code = arguments[1], repeat = 6 - code.length;
-while (repeat--) {
-code = '0' + code;
-}
-return '\\' + code;
-});
-},
-stringify: function (node, preserveProperties, text) {
-text = text || '';
-var cssText = '';
-if (node.cssText || node.rules) {
-var r$ = node.rules;
-if (r$ && !this._hasMixinRules(r$)) {
-for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {
-cssText = this.stringify(r, preserveProperties, cssText);
-}
-} else {
-cssText = preserveProperties ? node.cssText : this.removeCustomProps(node.cssText);
-cssText = cssText.trim();
-if (cssText) {
-cssText = '  ' + cssText + '\n';
-}
-}
-}
-if (cssText) {
-if (node.selector) {
-text += node.selector + ' ' + this.OPEN_BRACE + '\n';
-}
-text += cssText;
-if (node.selector) {
-text += this.CLOSE_BRACE + '\n\n';
-}
-}
-return text;
-},
-_hasMixinRules: function (rules) {
-return rules[0].selector.indexOf(this.VAR_START) === 0;
-},
-removeCustomProps: function (cssText) {
-cssText = this.removeCustomPropAssignment(cssText);
-return this.removeCustomPropApply(cssText);
-},
-removeCustomPropAssignment: function (cssText) {
-return cssText.replace(this._rx.customProp, '').replace(this._rx.mixinProp, '');
-},
-removeCustomPropApply: function (cssText) {
-return cssText.replace(this._rx.mixinApply, '').replace(this._rx.varApply, '');
-},
-types: {
-STYLE_RULE: 1,
-KEYFRAMES_RULE: 7,
-MEDIA_RULE: 4,
-MIXIN_RULE: 1000
-},
-OPEN_BRACE: '{',
-CLOSE_BRACE: '}',
-_rx: {
-comments: /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,
-port: /@import[^;]*;/gim,
-customProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,
-mixinProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,
-mixinApply: /@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,
-varApply: /[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,
-keyframesRule: /^@[^\s]*keyframes/,
-multipleSpaces: /\s+/g
-},
-VAR_START: '--',
-MEDIA_START: '@media',
-AT_START: '@'
-};
-}();Polymer.StyleUtil = function () {
-var settings = Polymer.Settings;
-return {
-unscopedStyleImports: new WeakMap(),
-SHADY_UNSCOPED_ATTR: 'shady-unscoped',
-NATIVE_VARIABLES: Polymer.Settings.useNativeCSSProperties,
-MODULE_STYLES_SELECTOR: 'style, link[rel=import][type~=css], template',
-INCLUDE_ATTR: 'include',
-toCssText: function (rules, callback) {
-if (typeof rules === 'string') {
-rules = this.parser.parse(rules);
-}
-if (callback) {
-this.forEachRule(rules, callback);
-}
-return this.parser.stringify(rules, this.NATIVE_VARIABLES);
-},
-forRulesInStyles: function (styles, styleRuleCallback, keyframesRuleCallback) {
-if (styles) {
-for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
-this.forEachRuleInStyle(s, styleRuleCallback, keyframesRuleCallback);
-}
-}
-},
-forActiveRulesInStyles: function (styles, styleRuleCallback, keyframesRuleCallback) {
-if (styles) {
-for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
-this.forEachRuleInStyle(s, styleRuleCallback, keyframesRuleCallback, true);
-}
-}
-},
-rulesForStyle: function (style) {
-if (!style.__cssRules && style.textContent) {
-style.__cssRules = this.parser.parse(style.textContent);
-}
-return style.__cssRules;
-},
-isKeyframesSelector: function (rule) {
-return rule.parent && rule.parent.type === this.ruleTypes.KEYFRAMES_RULE;
-},
-forEachRuleInStyle: function (style, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {
-var rules = this.rulesForStyle(style);
-var styleCallback, keyframeCallback;
-if (styleRuleCallback) {
-styleCallback = function (rule) {
-styleRuleCallback(rule, style);
-};
-}
-if (keyframesRuleCallback) {
-keyframeCallback = function (rule) {
-keyframesRuleCallback(rule, style);
-};
-}
-this.forEachRule(rules, styleCallback, keyframeCallback, onlyActiveRules);
-},
-forEachRule: function (node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {
-if (!node) {
-return;
-}
-var skipRules = false;
-if (onlyActiveRules) {
-if (node.type === this.ruleTypes.MEDIA_RULE) {
-var matchMedia = node.selector.match(this.rx.MEDIA_MATCH);
-if (matchMedia) {
-if (!window.matchMedia(matchMedia[1]).matches) {
-skipRules = true;
-}
-}
-}
-}
-if (node.type === this.ruleTypes.STYLE_RULE) {
-styleRuleCallback(node);
-} else if (keyframesRuleCallback && node.type === this.ruleTypes.KEYFRAMES_RULE) {
-keyframesRuleCallback(node);
-} else if (node.type === this.ruleTypes.MIXIN_RULE) {
-skipRules = true;
-}
-var r$ = node.rules;
-if (r$ && !skipRules) {
-for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) {
-this.forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);
-}
-}
-},
-applyCss: function (cssText, moniker, target, contextNode) {
-var style = this.createScopeStyle(cssText, moniker);
-return this.applyStyle(style, target, contextNode);
-},
-applyStyle: function (style, target, contextNode) {
-target = target || document.head;
-var after = contextNode && contextNode.nextSibling || target.firstChild;
-this.__lastHeadApplyNode = style;
-return target.insertBefore(style, after);
-},
-createScopeStyle: function (cssText, moniker) {
-var style = document.createElement('style');
-if (moniker) {
-style.setAttribute('scope', moniker);
-}
-style.textContent = cssText;
-return style;
-},
-__lastHeadApplyNode: null,
-applyStylePlaceHolder: function (moniker) {
-var placeHolder = document.createComment(' Shady DOM styles for ' + moniker + ' ');
-var after = this.__lastHeadApplyNode ? this.__lastHeadApplyNode.nextSibling : null;
-var scope = document.head;
-scope.insertBefore(placeHolder, after || scope.firstChild);
-this.__lastHeadApplyNode = placeHolder;
-return placeHolder;
-},
-cssFromModules: function (moduleIds, warnIfNotFound) {
-var modules = moduleIds.trim().split(/\s+/);
-var cssText = '';
-for (var i = 0; i < modules.length; i++) {
-cssText += this.cssFromModule(modules[i], warnIfNotFound);
-}
-return cssText;
-},
-cssFromModule: function (moduleId, warnIfNotFound) {
-var m = Polymer.DomModule.import(moduleId);
-if (m && !m._cssText) {
-m._cssText = this.cssFromElement(m);
-}
-if (!m && warnIfNotFound) {
-console.warn('Could not find style data in module named', moduleId);
-}
-return m && m._cssText || '';
-},
-cssFromElement: function (element) {
-var cssText = '';
-var content = element.content || element;
-var e$ = Polymer.TreeApi.arrayCopy(content.querySelectorAll(this.MODULE_STYLES_SELECTOR));
-for (var i = 0, e; i < e$.length; i++) {
-e = e$[i];
-if (e.localName === 'template') {
-if (!e.hasAttribute('preserve-content')) {
-cssText += this.cssFromElement(e);
-}
-} else {
-if (e.localName === 'style') {
-var include = e.getAttribute(this.INCLUDE_ATTR);
-if (include) {
-cssText += this.cssFromModules(include, true);
-}
-e = e.__appliedElement || e;
-e.parentNode.removeChild(e);
-var css = this.resolveCss(e.textContent, element.ownerDocument);
-if (!settings.useNativeShadow && e.hasAttribute(this.SHADY_UNSCOPED_ATTR)) {
-e.textContent = css;
-document.head.insertBefore(e, document.head.firstChild);
-} else {
-cssText += css;
-}
-} else if (e.import && e.import.body) {
-var importCss = this.resolveCss(e.import.body.textContent, e.import);
-if (!settings.useNativeShadow && e.hasAttribute(this.SHADY_UNSCOPED_ATTR)) {
-if (!this.unscopedStyleImports.has(e.import)) {
-this.unscopedStyleImports.set(e.import, true);
-var importStyle = document.createElement('style');
-importStyle.setAttribute(this.SHADY_UNSCOPED_ATTR, '');
-importStyle.textContent = importCss;
-document.head.insertBefore(importStyle, document.head.firstChild);
-}
-} else {
-cssText += importCss;
-}
-}
-}
-}
-return cssText;
-},
-styleIncludesToTemplate: function (targetTemplate) {
-var styles = targetTemplate.content.querySelectorAll('style[include]');
-for (var i = 0, s; i < styles.length; i++) {
-s = styles[i];
-s.parentNode.insertBefore(this._includesToFragment(s.getAttribute('include')), s);
-}
-},
-_includesToFragment: function (styleIncludes) {
-var includeArray = styleIncludes.trim().split(' ');
-var frag = document.createDocumentFragment();
-for (var i = 0; i < includeArray.length; i++) {
-var t = Polymer.DomModule.import(includeArray[i], 'template');
-if (t) {
-this._addStylesToFragment(frag, t.content);
-}
-}
-return frag;
-},
-_addStylesToFragment: function (frag, source) {
-var s$ = source.querySelectorAll('style');
-for (var i = 0, s; i < s$.length; i++) {
-s = s$[i];
-var include = s.getAttribute('include');
-if (include) {
-frag.appendChild(this._includesToFragment(include));
-}
-if (s.textContent) {
-frag.appendChild(s.cloneNode(true));
-}
-}
-},
-isTargetedBuild: function (buildType) {
-return settings.useNativeShadow ? buildType === 'shadow' : buildType === 'shady';
-},
-cssBuildTypeForModule: function (module) {
-var dm = Polymer.DomModule.import(module);
-if (dm) {
-return this.getCssBuildType(dm);
-}
-},
-getCssBuildType: function (element) {
-return element.getAttribute('css-build');
-},
-_findMatchingParen: function (text, start) {
-var level = 0;
-for (var i = start, l = text.length; i < l; i++) {
-switch (text[i]) {
-case '(':
-level++;
-break;
-case ')':
-if (--level === 0) {
-return i;
-}
-break;
-}
-}
-return -1;
-},
-processVariableAndFallback: function (str, callback) {
-var start = str.indexOf('var(');
-if (start === -1) {
-return callback(str, '', '', '');
-}
-var end = this._findMatchingParen(str, start + 3);
-var inner = str.substring(start + 4, end);
-var prefix = str.substring(0, start);
-var suffix = this.processVariableAndFallback(str.substring(end + 1), callback);
-var comma = inner.indexOf(',');
-if (comma === -1) {
-return callback(prefix, inner.trim(), '', suffix);
-}
-var value = inner.substring(0, comma).trim();
-var fallback = inner.substring(comma + 1).trim();
-return callback(prefix, value, fallback, suffix);
-},
-rx: {
-VAR_ASSIGN: /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:([^;{]*)|{([^}]*)})(?:(?=[;\s}])|$)/gi,
-MIXIN_MATCH: /(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,
-VAR_CONSUMED: /(--[\w-]+)\s*([:,;)]|$)/gi,
-ANIMATION_MATCH: /(animation\s*:)|(animation-name\s*:)/,
-MEDIA_MATCH: /@media[^(]*(\([^)]*\))/,
-IS_VAR: /^--/,
-BRACKETED: /\{[^}]*\}/g,
-HOST_PREFIX: '(?:^|[^.#[:])',
-HOST_SUFFIX: '($|[.:[\\s>+~])'
-},
-resolveCss: Polymer.ResolveUrl.resolveCss,
-parser: Polymer.CssParse,
-ruleTypes: Polymer.CssParse.types
-};
-}();Polymer.StyleTransformer = function () {
-var styleUtil = Polymer.StyleUtil;
-var settings = Polymer.Settings;
-var api = {
-dom: function (node, scope, useAttr, shouldRemoveScope) {
-this._transformDom(node, scope || '', useAttr, shouldRemoveScope);
-},
-_transformDom: function (node, selector, useAttr, shouldRemoveScope) {
-if (node.setAttribute) {
-this.element(node, selector, useAttr, shouldRemoveScope);
-}
-var c$ = Polymer.dom(node).childNodes;
-for (var i = 0; i < c$.length; i++) {
-this._transformDom(c$[i], selector, useAttr, shouldRemoveScope);
-}
-},
-element: function (element, scope, useAttr, shouldRemoveScope) {
-if (useAttr) {
-if (shouldRemoveScope) {
-element.removeAttribute(SCOPE_NAME);
-} else {
-element.setAttribute(SCOPE_NAME, scope);
-}
-} else {
-if (scope) {
-if (element.classList) {
-if (shouldRemoveScope) {
-element.classList.remove(SCOPE_NAME);
-element.classList.remove(scope);
-} else {
-element.classList.add(SCOPE_NAME);
-element.classList.add(scope);
-}
-} else if (element.getAttribute) {
-var c = element.getAttribute(CLASS);
-if (shouldRemoveScope) {
-if (c) {
-element.setAttribute(CLASS, c.replace(SCOPE_NAME, '').replace(scope, ''));
-}
-} else {
-element.setAttribute(CLASS, (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope);
-}
-}
-}
-}
-},
-elementStyles: function (element, callback) {
-var styles = element._styles;
-var cssText = '';
-var cssBuildType = element.__cssBuild;
-var passthrough = settings.useNativeShadow || cssBuildType === 'shady';
-var cb;
-if (passthrough) {
-var self = this;
-cb = function (rule) {
-rule.selector = self._slottedToContent(rule.selector);
-rule.selector = rule.selector.replace(ROOT, ':host > *');
-rule.selector = self._dirShadowTransform(rule.selector);
-if (callback) {
-callback(rule);
-}
-};
-}
-for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
-var rules = styleUtil.rulesForStyle(s);
-cssText += passthrough ? styleUtil.toCssText(rules, cb) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n';
-}
-return cssText.trim();
-},
-css: function (rules, scope, ext, callback, useAttr) {
-var hostScope = this._calcHostScope(scope, ext);
-scope = this._calcElementScope(scope, useAttr);
-var self = this;
-return styleUtil.toCssText(rules, function (rule) {
-if (!rule.isScoped) {
-self.rule(rule, scope, hostScope);
-rule.isScoped = true;
-}
-if (callback) {
-callback(rule, scope, hostScope);
-}
-});
-},
-_calcElementScope: function (scope, useAttr) {
-if (scope) {
-return useAttr ? CSS_ATTR_PREFIX + scope + CSS_ATTR_SUFFIX : CSS_CLASS_PREFIX + scope;
-} else {
-return '';
-}
-},
-_calcHostScope: function (scope, ext) {
-return ext ? '[is=' + scope + ']' : scope;
-},
-rule: function (rule, scope, hostScope) {
-this._transformRule(rule, this._transformComplexSelector, scope, hostScope);
-},
-_transformRule: function (rule, transformer, scope, hostScope) {
-rule.selector = rule.transformedSelector = this._transformRuleCss(rule, transformer, scope, hostScope);
-},
-_splitSelectorList: function (selector) {
-var parts = [];
-var part = '';
-for (var i = 0; i >= 0 && i < selector.length; i++) {
-if (selector[i] === '(') {
-var end = styleUtil._findMatchingParen(selector, i);
-part += selector.slice(i, end + 1);
-i = end;
-} else if (selector[i] === COMPLEX_SELECTOR_SEP) {
-parts.push(part);
-part = '';
-} else {
-part += selector[i];
-}
-}
-if (part) {
-parts.push(part);
-}
-if (parts.length === 0) {
-parts.push(selector);
-}
-return parts;
-},
-_transformRuleCss: function (rule, transformer, scope, hostScope) {
-var p$ = this._splitSelectorList(rule.selector);
-if (!styleUtil.isKeyframesSelector(rule)) {
-for (var i = 0, l = p$.length, p; i < l && (p = p$[i]); i++) {
-p$[i] = transformer.call(this, p, scope, hostScope);
-}
-}
-return p$.join(COMPLEX_SELECTOR_SEP);
-},
-_ensureScopedDir: function (s) {
-var m = s.match(DIR_PAREN);
-if (m && m[1] === '' && m[0].length === s.length) {
-s = '*' + s;
-}
-return s;
-},
-_additionalDirSelectors: function (dir, after, prefix) {
-if (!dir || !after) {
-return '';
-}
-prefix = prefix || '';
-return COMPLEX_SELECTOR_SEP + prefix + ' ' + dir + ' ' + after;
-},
-_transformComplexSelector: function (selector, scope, hostScope) {
-var stop = false;
-var hostContext = false;
-var dir = false;
-var self = this;
-selector = selector.trim();
-selector = this._slottedToContent(selector);
-selector = selector.replace(ROOT, ':host > *');
-selector = selector.replace(CONTENT_START, HOST + ' $1');
-selector = this._ensureScopedDir(selector);
-selector = selector.replace(SIMPLE_SELECTOR_SEP, function (m, c, s) {
-if (!stop) {
-var info = self._transformCompoundSelector(s, c, scope, hostScope);
-stop = stop || info.stop;
-hostContext = hostContext || info.hostContext;
-dir = dir || info.dir;
-c = info.combinator;
-s = info.value;
-} else {
-s = s.replace(SCOPE_JUMP, ' ');
-}
-return c + s;
-});
-if (hostContext) {
-selector = selector.replace(HOST_CONTEXT_PAREN, function (m, pre, paren, post) {
-var replacement = pre + paren + ' ' + hostScope + post + COMPLEX_SELECTOR_SEP + ' ' + pre + hostScope + paren + post;
-if (dir) {
-replacement += self._additionalDirSelectors(paren, post, hostScope);
-}
-return replacement;
-});
-}
-return selector;
-},
-_transformDir: function (s) {
-s = s.replace(HOST_DIR, HOST_DIR_REPLACE);
-s = s.replace(DIR_PAREN, DIR_REPLACE);
-return s;
-},
-_transformCompoundSelector: function (selector, combinator, scope, hostScope) {
-var jumpIndex = selector.search(SCOPE_JUMP);
-var hostContext = false;
-var dir = false;
-if (selector.match(DIR_PAREN)) {
-selector = this._transformDir(selector);
-dir = true;
-}
-if (selector.indexOf(HOST_CONTEXT) >= 0) {
-hostContext = true;
-} else if (selector.indexOf(HOST) >= 0) {
-selector = this._transformHostSelector(selector, hostScope);
-} else if (jumpIndex !== 0) {
-selector = scope ? this._transformSimpleSelector(selector, scope) : selector;
-}
-if (selector.indexOf(CONTENT) >= 0) {
-combinator = '';
-}
-var stop;
-if (jumpIndex >= 0) {
-selector = selector.replace(SCOPE_JUMP, ' ');
-stop = true;
-}
-return {
-value: selector,
-combinator: combinator,
-stop: stop,
-hostContext: hostContext,
-dir: dir
-};
-},
-_transformSimpleSelector: function (selector, scope) {
-var p$ = selector.split(PSEUDO_PREFIX);
-p$[0] += scope;
-return p$.join(PSEUDO_PREFIX);
-},
-_transformHostSelector: function (selector, hostScope) {
-var m = selector.match(HOST_PAREN);
-var paren = m && m[2].trim() || '';
-if (paren) {
-if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {
-var typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];
-if (typeSelector === hostScope) {
-return paren;
-} else {
-return SELECTOR_NO_MATCH;
-}
-} else {
-return selector.replace(HOST_PAREN, function (m, host, paren) {
-return hostScope + paren;
-});
-}
-} else {
-return selector.replace(HOST, hostScope);
-}
-},
-documentRule: function (rule) {
-rule.selector = rule.parsedSelector;
-this.normalizeRootSelector(rule);
-if (!settings.useNativeShadow) {
-this._transformRule(rule, this._transformDocumentSelector);
-}
-},
-normalizeRootSelector: function (rule) {
-rule.selector = rule.selector.replace(ROOT, 'html');
-var parts = this._splitSelectorList(rule.selector);
-parts = parts.filter(function (part) {
-return !part.match(HOST_OR_HOST_GT_STAR);
-});
-rule.selector = parts.join(COMPLEX_SELECTOR_SEP);
-},
-_transformDocumentSelector: function (selector) {
-return this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR);
-},
-_slottedToContent: function (cssText) {
-return cssText.replace(SLOTTED_PAREN, CONTENT + '> $1');
-},
-_dirShadowTransform: function (selector) {
-if (!selector.match(/:dir\(/)) {
-return selector;
-}
-return this._splitSelectorList(selector).map(function (s) {
-s = this._ensureScopedDir(s);
-s = this._transformDir(s);
-var m = HOST_CONTEXT_PAREN.exec(s);
-if (m) {
-s += this._additionalDirSelectors(m[2], m[3], '');
-}
-return s;
-}, this).join(COMPLEX_SELECTOR_SEP);
-},
-SCOPE_NAME: 'style-scope'
-};
-var SCOPE_NAME = api.SCOPE_NAME;
-var SCOPE_DOC_SELECTOR = ':not([' + SCOPE_NAME + '])' + ':not(.' + SCOPE_NAME + ')';
-var COMPLEX_SELECTOR_SEP = ',';
-var SIMPLE_SELECTOR_SEP = /(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=\[])+)/g;
-var SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;
-var HOST = ':host';
-var ROOT = ':root';
-var HOST_PAREN = /(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;
-var HOST_CONTEXT = ':host-context';
-var HOST_CONTEXT_PAREN = /(.*)(?::host-context)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))(.*)/;
-var CONTENT = '::content';
-var SCOPE_JUMP = /::content|::shadow|\/deep\//;
-var CSS_CLASS_PREFIX = '.';
-var CSS_ATTR_PREFIX = '[' + SCOPE_NAME + '~=';
-var CSS_ATTR_SUFFIX = ']';
-var PSEUDO_PREFIX = ':';
-var CLASS = 'class';
-var CONTENT_START = new RegExp('^(' + CONTENT + ')');
-var SELECTOR_NO_MATCH = 'should_not_match';
-var SLOTTED_PAREN = /(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g;
-var HOST_OR_HOST_GT_STAR = /:host(?:\s*>\s*\*)?/;
-var DIR_PAREN = /(.*):dir\((ltr|rtl)\)/;
-var DIR_REPLACE = ':host-context([dir="$2"]) $1';
-var HOST_DIR = /:host\(:dir\((rtl|ltr)\)\)/g;
-var HOST_DIR_REPLACE = ':host-context([dir="$1"])';
-return api;
-}();Polymer.StyleExtends = function () {
-var styleUtil = Polymer.StyleUtil;
-return {
-hasExtends: function (cssText) {
-return Boolean(cssText.match(this.rx.EXTEND));
-},
-transform: function (style) {
-var rules = styleUtil.rulesForStyle(style);
-var self = this;
-styleUtil.forEachRule(rules, function (rule) {
-self._mapRuleOntoParent(rule);
-if (rule.parent) {
-var m;
-while (m = self.rx.EXTEND.exec(rule.cssText)) {
-var extend = m[1];
-var extendor = self._findExtendor(extend, rule);
-if (extendor) {
-self._extendRule(rule, extendor);
-}
-}
-}
-rule.cssText = rule.cssText.replace(self.rx.EXTEND, '');
-});
-return styleUtil.toCssText(rules, function (rule) {
-if (rule.selector.match(self.rx.STRIP)) {
-rule.cssText = '';
-}
-}, true);
-},
-_mapRuleOntoParent: function (rule) {
-if (rule.parent) {
-var map = rule.parent.map || (rule.parent.map = {});
-var parts = rule.selector.split(',');
-for (var i = 0, p; i < parts.length; i++) {
-p = parts[i];
-map[p.trim()] = rule;
-}
-return map;
-}
-},
-_findExtendor: function (extend, rule) {
-return rule.parent && rule.parent.map && rule.parent.map[extend] || this._findExtendor(extend, rule.parent);
-},
-_extendRule: function (target, source) {
-if (target.parent !== source.parent) {
-this._cloneAndAddRuleToParent(source, target.parent);
-}
-target.extends = target.extends || [];
-target.extends.push(source);
-source.selector = source.selector.replace(this.rx.STRIP, '');
-source.selector = (source.selector && source.selector + ',\n') + target.selector;
-if (source.extends) {
-source.extends.forEach(function (e) {
-this._extendRule(target, e);
-}, this);
-}
-},
-_cloneAndAddRuleToParent: function (rule, parent) {
-rule = Object.create(rule);
-rule.parent = parent;
-if (rule.extends) {
-rule.extends = rule.extends.slice();
-}
-parent.rules.push(rule);
-},
-rx: {
-EXTEND: /@extends\(([^)]*)\)\s*?;/gim,
-STRIP: /%[^,]*$/
-}
-};
-}();Polymer.ApplyShim = function () {
-'use strict';
-var styleUtil = Polymer.StyleUtil;
-var MIXIN_MATCH = styleUtil.rx.MIXIN_MATCH;
-var VAR_ASSIGN = styleUtil.rx.VAR_ASSIGN;
-var BAD_VAR = /var\(\s*(--[^,]*),\s*(--[^)]*)\)/g;
-var APPLY_NAME_CLEAN = /;\s*/m;
-var INITIAL_INHERIT = /^\s*(initial)|(inherit)\s*$/;
-var MIXIN_VAR_SEP = '_-_';
-var mixinMap = {};
-function mapSet(name, props) {
-name = name.trim();
-mixinMap[name] = {
-properties: props,
-dependants: {}
-};
-}
-function mapGet(name) {
-name = name.trim();
-return mixinMap[name];
-}
-function replaceInitialOrInherit(property, value) {
-var match = INITIAL_INHERIT.exec(value);
-if (match) {
-if (match[1]) {
-value = ApplyShim._getInitialValueForProperty(property);
-} else {
-value = 'apply-shim-inherit';
-}
-}
-return value;
-}
-function cssTextToMap(text) {
-var props = text.split(';');
-var property, value;
-var out = {};
-for (var i = 0, p, sp; i < props.length; i++) {
-p = props[i];
-if (p) {
-sp = p.split(':');
-if (sp.length > 1) {
-property = sp[0].trim();
-value = replaceInitialOrInherit(property, sp.slice(1).join(':'));
-out[property] = value;
-}
-}
-}
-return out;
-}
-function invalidateMixinEntry(mixinEntry) {
-var currentProto = ApplyShim.__currentElementProto;
-var currentElementName = currentProto && currentProto.is;
-for (var elementName in mixinEntry.dependants) {
-if (elementName !== currentElementName) {
-mixinEntry.dependants[elementName].__applyShimInvalid = true;
-}
-}
-}
-function produceCssProperties(matchText, propertyName, valueProperty, valueMixin) {
-if (valueProperty) {
-styleUtil.processVariableAndFallback(valueProperty, function (prefix, value) {
-if (value && mapGet(value)) {
-valueMixin = '@apply ' + value + ';';
-}
-});
-}
-if (!valueMixin) {
-return matchText;
-}
-var mixinAsProperties = consumeCssProperties(valueMixin);
-var prefix = matchText.slice(0, matchText.indexOf('--'));
-var mixinValues = cssTextToMap(mixinAsProperties);
-var combinedProps = mixinValues;
-var mixinEntry = mapGet(propertyName);
-var oldProps = mixinEntry && mixinEntry.properties;
-if (oldProps) {
-combinedProps = Object.create(oldProps);
-combinedProps = Polymer.Base.mixin(combinedProps, mixinValues);
-} else {
-mapSet(propertyName, combinedProps);
-}
-var out = [];
-var p, v;
-var needToInvalidate = false;
-for (p in combinedProps) {
-v = mixinValues[p];
-if (v === undefined) {
-v = 'initial';
-}
-if (oldProps && !(p in oldProps)) {
-needToInvalidate = true;
-}
-out.push(propertyName + MIXIN_VAR_SEP + p + ': ' + v);
-}
-if (needToInvalidate) {
-invalidateMixinEntry(mixinEntry);
-}
-if (mixinEntry) {
-mixinEntry.properties = combinedProps;
-}
-if (valueProperty) {
-prefix = matchText + ';' + prefix;
-}
-return prefix + out.join('; ') + ';';
-}
-function fixVars(matchText, varA, varB) {
-return 'var(' + varA + ',' + 'var(' + varB + '))';
-}
-function atApplyToCssProperties(mixinName, fallbacks) {
-mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');
-var vars = [];
-var mixinEntry = mapGet(mixinName);
-if (!mixinEntry) {
-mapSet(mixinName, {});
-mixinEntry = mapGet(mixinName);
-}
-if (mixinEntry) {
-var currentProto = ApplyShim.__currentElementProto;
-if (currentProto) {
-mixinEntry.dependants[currentProto.is] = currentProto;
-}
-var p, parts, f;
-for (p in mixinEntry.properties) {
-f = fallbacks && fallbacks[p];
-parts = [
-p,
-': var(',
-mixinName,
-MIXIN_VAR_SEP,
-p
-];
-if (f) {
-parts.push(',', f);
-}
-parts.push(')');
-vars.push(parts.join(''));
-}
-}
-return vars.join('; ');
-}
-function consumeCssProperties(text) {
-var m;
-while (m = MIXIN_MATCH.exec(text)) {
-var matchText = m[0];
-var mixinName = m[1];
-var idx = m.index;
-var applyPos = idx + matchText.indexOf('@apply');
-var afterApplyPos = idx + matchText.length;
-var textBeforeApply = text.slice(0, applyPos);
-var textAfterApply = text.slice(afterApplyPos);
-var defaults = cssTextToMap(textBeforeApply);
-var replacement = atApplyToCssProperties(mixinName, defaults);
-text = [
-textBeforeApply,
-replacement,
-textAfterApply
-].join('');
-MIXIN_MATCH.lastIndex = idx + replacement.length;
-}
-return text;
-}
-var ApplyShim = {
-_measureElement: null,
-_map: mixinMap,
-_separator: MIXIN_VAR_SEP,
-transform: function (styles, elementProto) {
-this.__currentElementProto = elementProto;
-styleUtil.forRulesInStyles(styles, this._boundFindDefinitions);
-styleUtil.forRulesInStyles(styles, this._boundFindApplications);
-if (elementProto) {
-elementProto.__applyShimInvalid = false;
-}
-this.__currentElementProto = null;
-},
-_findDefinitions: function (rule) {
-var cssText = rule.parsedCssText;
-cssText = cssText.replace(BAD_VAR, fixVars);
-cssText = cssText.replace(VAR_ASSIGN, produceCssProperties);
-rule.cssText = cssText;
-if (rule.selector === ':root') {
-rule.selector = ':host > *';
-}
-},
-_findApplications: function (rule) {
-rule.cssText = consumeCssProperties(rule.cssText);
-},
-transformRule: function (rule) {
-this._findDefinitions(rule);
-this._findApplications(rule);
-},
-_getInitialValueForProperty: function (property) {
-if (!this._measureElement) {
-this._measureElement = document.createElement('meta');
-this._measureElement.style.all = 'initial';
-document.head.appendChild(this._measureElement);
-}
-return window.getComputedStyle(this._measureElement).getPropertyValue(property);
-}
-};
-ApplyShim._boundTransformRule = ApplyShim.transformRule.bind(ApplyShim);
-ApplyShim._boundFindDefinitions = ApplyShim._findDefinitions.bind(ApplyShim);
-ApplyShim._boundFindApplications = ApplyShim._findApplications.bind(ApplyShim);
-return ApplyShim;
-}();(function () {
-var prepElement = Polymer.Base._prepElement;
-var nativeShadow = Polymer.Settings.useNativeShadow;
-var styleUtil = Polymer.StyleUtil;
-var styleTransformer = Polymer.StyleTransformer;
-var styleExtends = Polymer.StyleExtends;
-var applyShim = Polymer.ApplyShim;
-var settings = Polymer.Settings;
-Polymer.Base._addFeature({
-_prepElement: function (element) {
-if (this._encapsulateStyle && this.__cssBuild !== 'shady') {
-styleTransformer.element(element, this.is, this._scopeCssViaAttr);
-}
-prepElement.call(this, element);
-},
-_prepStyles: function () {
-if (this._encapsulateStyle === undefined) {
-this._encapsulateStyle = !nativeShadow;
-}
-if (!nativeShadow) {
-this._scopeStyle = styleUtil.applyStylePlaceHolder(this.is);
-}
-this.__cssBuild = styleUtil.cssBuildTypeForModule(this.is);
-},
-_prepShimStyles: function () {
-if (this._template) {
-var hasTargetedCssBuild = styleUtil.isTargetedBuild(this.__cssBuild);
-if (settings.useNativeCSSProperties && this.__cssBuild === 'shadow' && hasTargetedCssBuild) {
-if (settings.preserveStyleIncludes) {
-styleUtil.styleIncludesToTemplate(this._template);
-}
-return;
-}
-this._styles = this._styles || this._collectStyles();
-if (settings.useNativeCSSProperties && !this.__cssBuild) {
-applyShim.transform(this._styles, this);
-}
-var cssText = settings.useNativeCSSProperties && hasTargetedCssBuild ? this._styles.length && this._styles[0].textContent.trim() : styleTransformer.elementStyles(this);
-this._prepStyleProperties();
-if (!this._needsStyleProperties() && cssText) {
-styleUtil.applyCss(cssText, this.is, nativeShadow ? this._template.content : null, this._scopeStyle);
-}
-} else {
-this._styles = [];
-}
-},
-_collectStyles: function () {
-var styles = [];
-var cssText = '', m$ = this.styleModules;
-if (m$) {
-for (var i = 0, l = m$.length, m; i < l && (m = m$[i]); i++) {
-cssText += styleUtil.cssFromModule(m);
-}
-}
-cssText += styleUtil.cssFromModule(this.is);
-var p = this._template && this._template.parentNode;
-if (this._template && (!p || p.id.toLowerCase() !== this.is)) {
-cssText += styleUtil.cssFromElement(this._template);
-}
-if (cssText) {
-var style = document.createElement('style');
-style.textContent = cssText;
-if (styleExtends.hasExtends(style.textContent)) {
-cssText = styleExtends.transform(style);
-}
-styles.push(style);
-}
-return styles;
-},
-_elementAdd: function (node) {
-if (this._encapsulateStyle) {
-if (node.__styleScoped) {
-node.__styleScoped = false;
-} else {
-styleTransformer.dom(node, this.is, this._scopeCssViaAttr);
-}
-}
-},
-_elementRemove: function (node) {
-if (this._encapsulateStyle) {
-styleTransformer.dom(node, this.is, this._scopeCssViaAttr, true);
-}
-},
-scopeSubtree: function (container, shouldObserve) {
-if (nativeShadow) {
-return;
-}
-var self = this;
-var scopify = function (node) {
-if (node.nodeType === Node.ELEMENT_NODE) {
-var className = node.getAttribute('class');
-node.setAttribute('class', self._scopeElementClass(node, className));
-var n$ = node.querySelectorAll('*');
-for (var i = 0, n; i < n$.length && (n = n$[i]); i++) {
-className = n.getAttribute('class');
-n.setAttribute('class', self._scopeElementClass(n, className));
-}
-}
-};
-scopify(container);
-if (shouldObserve) {
-var mo = new MutationObserver(function (mxns) {
-for (var i = 0, m; i < mxns.length && (m = mxns[i]); i++) {
-if (m.addedNodes) {
-for (var j = 0; j < m.addedNodes.length; j++) {
-scopify(m.addedNodes[j]);
-}
-}
-}
-});
-mo.observe(container, {
-childList: true,
-subtree: true
-});
-return mo;
-}
-}
-});
-}());Polymer.StyleProperties = function () {
-'use strict';
-var matchesSelector = Polymer.DomApi.matchesSelector;
-var styleUtil = Polymer.StyleUtil;
-var styleTransformer = Polymer.StyleTransformer;
-var IS_IE = navigator.userAgent.match('Trident');
-var settings = Polymer.Settings;
-return {
-decorateStyles: function (styles, scope) {
-var self = this, props = {}, keyframes = [], ruleIndex = 0;
-var scopeSelector = styleTransformer._calcHostScope(scope.is, scope.extends);
-styleUtil.forRulesInStyles(styles, function (rule, style) {
-self.decorateRule(rule);
-rule.index = ruleIndex++;
-self.whenHostOrRootRule(scope, rule, style, function (info) {
-if (rule.parent.type === styleUtil.ruleTypes.MEDIA_RULE) {
-scope.__notStyleScopeCacheable = true;
-}
-if (info.isHost) {
-var hostContextOrFunction = info.selector.split(' ').some(function (s) {
-return s.indexOf(scopeSelector) === 0 && s.length !== scopeSelector.length;
-});
-scope.__notStyleScopeCacheable = scope.__notStyleScopeCacheable || hostContextOrFunction;
-}
-});
-self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);
-}, function onKeyframesRule(rule) {
-keyframes.push(rule);
-});
-styles._keyframes = keyframes;
-var names = [];
-for (var i in props) {
-names.push(i);
-}
-return names;
-},
-decorateRule: function (rule) {
-if (rule.propertyInfo) {
-return rule.propertyInfo;
-}
-var info = {}, properties = {};
-var hasProperties = this.collectProperties(rule, properties);
-if (hasProperties) {
-info.properties = properties;
-rule.rules = null;
-}
-info.cssText = this.collectCssText(rule);
-rule.propertyInfo = info;
-return info;
-},
-collectProperties: function (rule, properties) {
-var info = rule.propertyInfo;
-if (info) {
-if (info.properties) {
-Polymer.Base.mixin(properties, info.properties);
-return true;
-}
-} else {
-var m, rx = this.rx.VAR_ASSIGN;
-var cssText = rule.parsedCssText;
-var value;
-var any;
-while (m = rx.exec(cssText)) {
-value = (m[2] || m[3]).trim();
-if (value !== 'inherit') {
-properties[m[1].trim()] = value;
-}
-any = true;
-}
-return any;
-}
-},
-collectCssText: function (rule) {
-return this.collectConsumingCssText(rule.parsedCssText);
-},
-collectConsumingCssText: function (cssText) {
-return cssText.replace(this.rx.BRACKETED, '').replace(this.rx.VAR_ASSIGN, '');
-},
-collectPropertiesInCssText: function (cssText, props) {
-var m;
-while (m = this.rx.VAR_CONSUMED.exec(cssText)) {
-var name = m[1];
-if (m[2] !== ':') {
-props[name] = true;
-}
-}
-},
-reify: function (props) {
-var names = Object.getOwnPropertyNames(props);
-for (var i = 0, n; i < names.length; i++) {
-n = names[i];
-props[n] = this.valueForProperty(props[n], props);
-}
-},
-valueForProperty: function (property, props) {
-if (property) {
-if (property.indexOf(';') >= 0) {
-property = this.valueForProperties(property, props);
-} else {
-var self = this;
-var fn = function (prefix, value, fallback, suffix) {
-var propertyValue = self.valueForProperty(props[value], props);
-if (!propertyValue || propertyValue === 'initial') {
-propertyValue = self.valueForProperty(props[fallback] || fallback, props) || fallback;
-} else if (propertyValue === 'apply-shim-inherit') {
-propertyValue = 'inherit';
-}
-return prefix + (propertyValue || '') + suffix;
-};
-property = styleUtil.processVariableAndFallback(property, fn);
-}
-}
-return property && property.trim() || '';
-},
-valueForProperties: function (property, props) {
-var parts = property.split(';');
-for (var i = 0, p, m; i < parts.length; i++) {
-if (p = parts[i]) {
-this.rx.MIXIN_MATCH.lastIndex = 0;
-m = this.rx.MIXIN_MATCH.exec(p);
-if (m) {
-p = this.valueForProperty(props[m[1]], props);
-} else {
-var colon = p.indexOf(':');
-if (colon !== -1) {
-var pp = p.substring(colon);
-pp = pp.trim();
-pp = this.valueForProperty(pp, props) || pp;
-p = p.substring(0, colon) + pp;
-}
-}
-parts[i] = p && p.lastIndexOf(';') === p.length - 1 ? p.slice(0, -1) : p || '';
-}
-}
-return parts.join(';');
-},
-applyProperties: function (rule, props) {
-var output = '';
-if (!rule.propertyInfo) {
-this.decorateRule(rule);
-}
-if (rule.propertyInfo.cssText) {
-output = this.valueForProperties(rule.propertyInfo.cssText, props);
-}
-rule.cssText = output;
-},
-applyKeyframeTransforms: function (rule, keyframeTransforms) {
-var input = rule.cssText;
-var output = rule.cssText;
-if (rule.hasAnimations == null) {
-rule.hasAnimations = this.rx.ANIMATION_MATCH.test(input);
-}
-if (rule.hasAnimations) {
-var transform;
-if (rule.keyframeNamesToTransform == null) {
-rule.keyframeNamesToTransform = [];
-for (var keyframe in keyframeTransforms) {
-transform = keyframeTransforms[keyframe];
-output = transform(input);
-if (input !== output) {
-input = output;
-rule.keyframeNamesToTransform.push(keyframe);
-}
-}
-} else {
-for (var i = 0; i < rule.keyframeNamesToTransform.length; ++i) {
-transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];
-input = transform(input);
-}
-output = input;
-}
-}
-rule.cssText = output;
-},
-propertyDataFromStyles: function (styles, element) {
-var props = {}, self = this;
-var o = [];
-styleUtil.forActiveRulesInStyles(styles, function (rule) {
-if (!rule.propertyInfo) {
-self.decorateRule(rule);
-}
-var selectorToMatch = rule.transformedSelector || rule.parsedSelector;
-if (element && rule.propertyInfo.properties && selectorToMatch) {
-if (matchesSelector.call(element, selectorToMatch)) {
-self.collectProperties(rule, props);
-addToBitMask(rule.index, o);
-}
-}
-});
-return {
-properties: props,
-key: o
-};
-},
-_rootSelector: /:root|:host\s*>\s*\*/,
-_checkRoot: function (hostScope, selector) {
-return Boolean(selector.match(this._rootSelector)) || hostScope === 'html' && selector.indexOf('html') > -1;
-},
-whenHostOrRootRule: function (scope, rule, style, callback) {
-if (!rule.propertyInfo) {
-self.decorateRule(rule);
-}
-if (!rule.propertyInfo.properties) {
-return;
-}
-var hostScope = scope.is ? styleTransformer._calcHostScope(scope.is, scope.extends) : 'html';
-var parsedSelector = rule.parsedSelector;
-var isRoot = this._checkRoot(hostScope, parsedSelector);
-var isHost = !isRoot && parsedSelector.indexOf(':host') === 0;
-var cssBuild = scope.__cssBuild || style.__cssBuild;
-if (cssBuild === 'shady') {
-isRoot = parsedSelector === hostScope + ' > *.' + hostScope || parsedSelector.indexOf('html') > -1;
-isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;
-}
-if (!isRoot && !isHost) {
-return;
-}
-var selectorToMatch = hostScope;
-if (isHost) {
-if (settings.useNativeShadow && !rule.transformedSelector) {
-rule.transformedSelector = styleTransformer._transformRuleCss(rule, styleTransformer._transformComplexSelector, scope.is, hostScope);
-}
-selectorToMatch = rule.transformedSelector || rule.parsedSelector;
-}
-if (isRoot && hostScope === 'html') {
-selectorToMatch = rule.transformedSelector || rule.parsedSelector;
-}
-callback({
-selector: selectorToMatch,
-isHost: isHost,
-isRoot: isRoot
-});
-},
-hostAndRootPropertiesForScope: function (scope) {
-var hostProps = {}, rootProps = {}, self = this;
-styleUtil.forActiveRulesInStyles(scope._styles, function (rule, style) {
-self.whenHostOrRootRule(scope, rule, style, function (info) {
-var element = scope._element || scope;
-if (matchesSelector.call(element, info.selector)) {
-if (info.isHost) {
-self.collectProperties(rule, hostProps);
-} else {
-self.collectProperties(rule, rootProps);
-}
-}
-});
-});
-return {
-rootProps: rootProps,
-hostProps: hostProps
-};
-},
-transformStyles: function (element, properties, scopeSelector) {
-var self = this;
-var hostSelector = styleTransformer._calcHostScope(element.is, element.extends);
-var rxHostSelector = element.extends ? '\\' + hostSelector.slice(0, -1) + '\\]' : hostSelector;
-var hostRx = new RegExp(this.rx.HOST_PREFIX + rxHostSelector + this.rx.HOST_SUFFIX);
-var keyframeTransforms = this._elementKeyframeTransforms(element, scopeSelector);
-return styleTransformer.elementStyles(element, function (rule) {
-self.applyProperties(rule, properties);
-if (!settings.useNativeShadow && !Polymer.StyleUtil.isKeyframesSelector(rule) && rule.cssText) {
-self.applyKeyframeTransforms(rule, keyframeTransforms);
-self._scopeSelector(rule, hostRx, hostSelector, element._scopeCssViaAttr, scopeSelector);
-}
-});
-},
-_elementKeyframeTransforms: function (element, scopeSelector) {
-var keyframesRules = element._styles._keyframes;
-var keyframeTransforms = {};
-if (!settings.useNativeShadow && keyframesRules) {
-for (var i = 0, keyframesRule = keyframesRules[i]; i < keyframesRules.length; keyframesRule = keyframesRules[++i]) {
-this._scopeKeyframes(keyframesRule, scopeSelector);
-keyframeTransforms[keyframesRule.keyframesName] = this._keyframesRuleTransformer(keyframesRule);
-}
-}
-return keyframeTransforms;
-},
-_keyframesRuleTransformer: function (keyframesRule) {
-return function (cssText) {
-return cssText.replace(keyframesRule.keyframesNameRx, keyframesRule.transformedKeyframesName);
-};
-},
-_scopeKeyframes: function (rule, scopeId) {
-rule.keyframesNameRx = new RegExp('\\b' + rule.keyframesName + '(?!\\B|-)', 'g');
-rule.transformedKeyframesName = rule.keyframesName + '-' + scopeId;
-rule.transformedSelector = rule.transformedSelector || rule.selector;
-rule.selector = rule.transformedSelector.replace(rule.keyframesName, rule.transformedKeyframesName);
-},
-_hasDirOrHostContext: function (parsedSelector) {
-return /:host-context|:dir/.test(parsedSelector);
-},
-_scopeSelector: function (rule, hostRx, hostSelector, viaAttr, scopeId) {
-rule.transformedSelector = rule.transformedSelector || rule.selector;
-var selector = rule.transformedSelector;
-var scope = styleTransformer._calcElementScope(scopeId, viaAttr);
-var hostScope = styleTransformer._calcElementScope(hostSelector, viaAttr);
-var parts = selector.split(',');
-var isDirOrHostContextSelector = this._hasDirOrHostContext(rule.parsedSelector);
-for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) {
-parts[i] = p.match(hostRx) ? p.replace(hostSelector, scope) : isDirOrHostContextSelector ? p.replace(hostScope, scope + ' ' + hostScope) : scope + ' ' + p;
-}
-rule.selector = parts.join(',');
-},
-applyElementScopeSelector: function (element, selector, old, viaAttr) {
-var c = viaAttr ? element.getAttribute(styleTransformer.SCOPE_NAME) : element.getAttribute('class') || '';
-var v = old ? c.replace(old, selector) : (c ? c + ' ' : '') + this.XSCOPE_NAME + ' ' + selector;
-if (c !== v) {
-if (viaAttr) {
-element.setAttribute(styleTransformer.SCOPE_NAME, v);
-} else {
-element.setAttribute('class', v);
-}
-}
-},
-applyElementStyle: function (element, properties, selector, style) {
-var cssText = style ? style.textContent || '' : this.transformStyles(element, properties, selector);
-var s = element._customStyle;
-if (s && !settings.useNativeShadow && s !== style) {
-s._useCount--;
-if (s._useCount <= 0 && s.parentNode) {
-s.parentNode.removeChild(s);
-}
-}
-if (settings.useNativeShadow) {
-if (element._customStyle) {
-element._customStyle.textContent = cssText;
-style = element._customStyle;
-} else if (cssText) {
-style = styleUtil.applyCss(cssText, selector, element.root, element._scopeStyle);
-}
-} else {
-if (!style) {
-if (cssText) {
-style = styleUtil.applyCss(cssText, selector, null, element._scopeStyle);
-}
-} else if (!style.parentNode) {
-if (IS_IE && cssText.indexOf('@media') > -1) {
-style.textContent = cssText;
-}
-styleUtil.applyStyle(style, null, element._scopeStyle);
-}
-}
-if (style) {
-style._useCount = style._useCount || 0;
-if (element._customStyle != style) {
-style._useCount++;
-}
-element._customStyle = style;
-}
-return style;
-},
-mixinCustomStyle: function (props, customStyle) {
-var v;
-for (var i in customStyle) {
-v = customStyle[i];
-if (v || v === 0) {
-props[i] = v;
-}
-}
-},
-updateNativeStyleProperties: function (element, properties) {
-var oldPropertyNames = element.__customStyleProperties;
-if (oldPropertyNames) {
-for (var i = 0; i < oldPropertyNames.length; i++) {
-element.style.removeProperty(oldPropertyNames[i]);
-}
-}
-var propertyNames = [];
-for (var p in properties) {
-if (properties[p] !== null) {
-element.style.setProperty(p, properties[p]);
-propertyNames.push(p);
-}
-}
-element.__customStyleProperties = propertyNames;
-},
-rx: styleUtil.rx,
-XSCOPE_NAME: 'x-scope'
-};
-function addToBitMask(n, bits) {
-var o = parseInt(n / 32);
-var v = 1 << n % 32;
-bits[o] = (bits[o] || 0) | v;
-}
-}();(function () {
-Polymer.StyleCache = function () {
-this.cache = {};
-};
-Polymer.StyleCache.prototype = {
-MAX: 100,
-store: function (is, data, keyValues, keyStyles) {
-data.keyValues = keyValues;
-data.styles = keyStyles;
-var s$ = this.cache[is] = this.cache[is] || [];
-s$.push(data);
-if (s$.length > this.MAX) {
-s$.shift();
-}
-},
-retrieve: function (is, keyValues, keyStyles) {
-var cache = this.cache[is];
-if (cache) {
-for (var i = cache.length - 1, data; i >= 0; i--) {
-data = cache[i];
-if (keyStyles === data.styles && this._objectsEqual(keyValues, data.keyValues)) {
-return data;
-}
-}
-}
-},
-clear: function () {
-this.cache = {};
-},
-_objectsEqual: function (target, source) {
-var t, s;
-for (var i in target) {
-t = target[i], s = source[i];
-if (!(typeof t === 'object' && t ? this._objectsStrictlyEqual(t, s) : t === s)) {
-return false;
-}
-}
-if (Array.isArray(target)) {
-return target.length === source.length;
-}
-return true;
-},
-_objectsStrictlyEqual: function (target, source) {
-return this._objectsEqual(target, source) && this._objectsEqual(source, target);
-}
-};
-}());Polymer.StyleDefaults = function () {
-var styleProperties = Polymer.StyleProperties;
-var StyleCache = Polymer.StyleCache;
-var nativeVariables = Polymer.Settings.useNativeCSSProperties;
-var api = {
-_styles: [],
-_properties: null,
-customStyle: {},
-_styleCache: new StyleCache(),
-_element: Polymer.DomApi.wrap(document.documentElement),
-addStyle: function (style) {
-this._styles.push(style);
-this._properties = null;
-},
-get _styleProperties() {
-if (!this._properties) {
-styleProperties.decorateStyles(this._styles, this);
-this._styles._scopeStyleProperties = null;
-this._properties = styleProperties.hostAndRootPropertiesForScope(this).rootProps;
-styleProperties.mixinCustomStyle(this._properties, this.customStyle);
-styleProperties.reify(this._properties);
-}
-return this._properties;
-},
-hasStyleProperties: function () {
-return Boolean(this._properties);
-},
-_needsStyleProperties: function () {
-},
-_computeStyleProperties: function () {
-return this._styleProperties;
-},
-updateStyles: function (properties) {
-this._properties = null;
-if (properties) {
-Polymer.Base.mixin(this.customStyle, properties);
-}
-this._styleCache.clear();
-for (var i = 0, s; i < this._styles.length; i++) {
-s = this._styles[i];
-s = s.__importElement || s;
-s._apply();
-}
-if (nativeVariables) {
-styleProperties.updateNativeStyleProperties(document.documentElement, this.customStyle);
-}
-}
-};
-return api;
-}();(function () {
-'use strict';
-var serializeValueToAttribute = Polymer.Base.serializeValueToAttribute;
-var propertyUtils = Polymer.StyleProperties;
-var styleTransformer = Polymer.StyleTransformer;
-var styleDefaults = Polymer.StyleDefaults;
-var nativeShadow = Polymer.Settings.useNativeShadow;
-var nativeVariables = Polymer.Settings.useNativeCSSProperties;
-Polymer.Base._addFeature({
-_prepStyleProperties: function () {
-if (!nativeVariables) {
-this._ownStylePropertyNames = this._styles && this._styles.length ? propertyUtils.decorateStyles(this._styles, this) : null;
-}
-},
-customStyle: null,
-getComputedStyleValue: function (property) {
-if (!nativeVariables && !this._styleProperties) {
-this._computeStyleProperties();
-}
-return !nativeVariables && this._styleProperties && this._styleProperties[property] || getComputedStyle(this).getPropertyValue(property);
-},
-_setupStyleProperties: function () {
-this.customStyle = {};
-this._styleCache = null;
-this._styleProperties = null;
-this._scopeSelector = null;
-this._ownStyleProperties = null;
-this._customStyle = null;
-},
-_needsStyleProperties: function () {
-return Boolean(!nativeVariables && this._ownStylePropertyNames && this._ownStylePropertyNames.length);
-},
-_validateApplyShim: function () {
-if (this.__applyShimInvalid) {
-Polymer.ApplyShim.transform(this._styles, this.__proto__);
-var cssText = styleTransformer.elementStyles(this);
-if (nativeShadow) {
-var templateStyle = this._template.content.querySelector('style');
-if (templateStyle) {
-templateStyle.textContent = cssText;
-}
-} else {
-var shadyStyle = this._scopeStyle && this._scopeStyle.nextSibling;
-if (shadyStyle) {
-shadyStyle.textContent = cssText;
-}
-}
-}
-},
-_beforeAttached: function () {
-if ((!this._scopeSelector || this.__stylePropertiesInvalid) && this._needsStyleProperties()) {
-this.__stylePropertiesInvalid = false;
-this._updateStyleProperties();
-}
-},
-_findStyleHost: function () {
-var e = this, root;
-while (root = Polymer.dom(e).getOwnerRoot()) {
-if (Polymer.isInstance(root.host)) {
-return root.host;
-}
-e = root.host;
-}
-return styleDefaults;
-},
-_updateStyleProperties: function () {
-var info, scope = this._findStyleHost();
-if (!scope._styleProperties) {
-scope._computeStyleProperties();
-}
-if (!scope._styleCache) {
-scope._styleCache = new Polymer.StyleCache();
-}
-var scopeData = propertyUtils.propertyDataFromStyles(scope._styles, this);
-var scopeCacheable = !this.__notStyleScopeCacheable;
-if (scopeCacheable) {
-scopeData.key.customStyle = this.customStyle;
-info = scope._styleCache.retrieve(this.is, scopeData.key, this._styles);
-}
-var scopeCached = Boolean(info);
-if (scopeCached) {
-this._styleProperties = info._styleProperties;
-} else {
-this._computeStyleProperties(scopeData.properties);
-}
-this._computeOwnStyleProperties();
-if (!scopeCached) {
-info = styleCache.retrieve(this.is, this._ownStyleProperties, this._styles);
-}
-var globalCached = Boolean(info) && !scopeCached;
-var style = this._applyStyleProperties(info);
-if (!scopeCached) {
-style = style && nativeShadow ? style.cloneNode(true) : style;
-info = {
-style: style,
-_scopeSelector: this._scopeSelector,
-_styleProperties: this._styleProperties
-};
-if (scopeCacheable) {
-scopeData.key.customStyle = {};
-this.mixin(scopeData.key.customStyle, this.customStyle);
-scope._styleCache.store(this.is, info, scopeData.key, this._styles);
-}
-if (!globalCached) {
-styleCache.store(this.is, Object.create(info), this._ownStyleProperties, this._styles);
-}
-}
-},
-_computeStyleProperties: function (scopeProps) {
-var scope = this._findStyleHost();
-if (!scope._styleProperties) {
-scope._computeStyleProperties();
-}
-var props = Object.create(scope._styleProperties);
-var hostAndRootProps = propertyUtils.hostAndRootPropertiesForScope(this);
-this.mixin(props, hostAndRootProps.hostProps);
-scopeProps = scopeProps || propertyUtils.propertyDataFromStyles(scope._styles, this).properties;
-this.mixin(props, scopeProps);
-this.mixin(props, hostAndRootProps.rootProps);
-propertyUtils.mixinCustomStyle(props, this.customStyle);
-propertyUtils.reify(props);
-this._styleProperties = props;
-},
-_computeOwnStyleProperties: function () {
-var props = {};
-for (var i = 0, n; i < this._ownStylePropertyNames.length; i++) {
-n = this._ownStylePropertyNames[i];
-props[n] = this._styleProperties[n];
-}
-this._ownStyleProperties = props;
-},
-_scopeCount: 0,
-_applyStyleProperties: function (info) {
-var oldScopeSelector = this._scopeSelector;
-this._scopeSelector = info ? info._scopeSelector : this.is + '-' + this.__proto__._scopeCount++;
-var style = propertyUtils.applyElementStyle(this, this._styleProperties, this._scopeSelector, info && info.style);
-if (!nativeShadow) {
-propertyUtils.applyElementScopeSelector(this, this._scopeSelector, oldScopeSelector, this._scopeCssViaAttr);
-}
-return style;
-},
-serializeValueToAttribute: function (value, attribute, node) {
-node = node || this;
-if (attribute === 'class' && !nativeShadow) {
-var host = node === this ? this.domHost || this.dataHost : this;
-if (host) {
-value = host._scopeElementClass(node, value);
-}
-}
-node = this.shadyRoot && this.shadyRoot._hasDistributed ? Polymer.dom(node) : node;
-serializeValueToAttribute.call(this, value, attribute, node);
-},
-_scopeElementClass: function (element, selector) {
-if (!nativeShadow && !this._scopeCssViaAttr) {
-selector = (selector ? selector + ' ' : '') + SCOPE_NAME + ' ' + this.is + (element._scopeSelector ? ' ' + XSCOPE_NAME + ' ' + element._scopeSelector : '');
-}
-return selector;
-},
-updateStyles: function (properties) {
-if (properties) {
-this.mixin(this.customStyle, properties);
-}
-if (nativeVariables) {
-propertyUtils.updateNativeStyleProperties(this, this.customStyle);
-} else {
-if (this.isAttached) {
-if (this._needsStyleProperties()) {
-this._updateStyleProperties();
-} else {
-this._styleProperties = null;
-}
-} else {
-this.__stylePropertiesInvalid = true;
-}
-if (this._styleCache) {
-this._styleCache.clear();
-}
-this._updateRootStyles();
-}
-},
-_updateRootStyles: function (root) {
-root = root || this.root;
-var c$ = Polymer.dom(root)._query(function (e) {
-return e.shadyRoot || e.shadowRoot;
-});
-for (var i = 0, l = c$.length, c; i < l && (c = c$[i]); i++) {
-if (c.updateStyles) {
-c.updateStyles();
-}
-}
-}
-});
-Polymer.updateStyles = function (properties) {
-styleDefaults.updateStyles(properties);
-Polymer.Base._updateRootStyles(document);
-};
-var styleCache = new Polymer.StyleCache();
-Polymer.customStyleCache = styleCache;
-var SCOPE_NAME = styleTransformer.SCOPE_NAME;
-var XSCOPE_NAME = propertyUtils.XSCOPE_NAME;
-}());Polymer.Base._addFeature({
-_registerFeatures: function () {
-this._prepIs();
-if (this.factoryImpl) {
-this._prepConstructor();
-}
-this._prepStyles();
-},
-_finishRegisterFeatures: function () {
-this._prepTemplate();
-this._prepShimStyles();
-this._prepAnnotations();
-this._prepEffects();
-this._prepBehaviors();
-this._prepPropertyInfo();
-this._prepBindings();
-this._prepShady();
-},
-_prepBehavior: function (b) {
-this._addPropertyEffects(b.properties);
-this._addComplexObserverEffects(b.observers);
-this._addHostAttributes(b.hostAttributes);
-},
-_initFeatures: function () {
-this._setupGestures();
-this._setupConfigure(this.__data__);
-this._setupStyleProperties();
-this._setupDebouncers();
-this._setupShady();
-this._registerHost();
-if (this._template) {
-this._validateApplyShim();
-this._poolContent();
-this._beginHosting();
-this._stampTemplate();
-this._endHosting();
-this._marshalAnnotationReferences();
-}
-this._marshalInstanceEffects();
-this._marshalBehaviors();
-this._marshalHostAttributes();
-this._marshalAttributes();
-this._tryReady();
-},
-_marshalBehavior: function (b) {
-if (b.listeners) {
-this._listenListeners(b.listeners);
-}
-}
-});(function () {
-var propertyUtils = Polymer.StyleProperties;
-var styleUtil = Polymer.StyleUtil;
-var cssParse = Polymer.CssParse;
-var styleDefaults = Polymer.StyleDefaults;
-var styleTransformer = Polymer.StyleTransformer;
-var applyShim = Polymer.ApplyShim;
-var debounce = Polymer.Debounce;
-var settings = Polymer.Settings;
-var updateDebouncer;
-Polymer({
-is: 'custom-style',
-extends: 'style',
-_template: null,
-properties: { include: String },
-ready: function () {
-this.__appliedElement = this.__appliedElement || this;
-this.__cssBuild = styleUtil.getCssBuildType(this);
-if (this.__appliedElement !== this) {
-this.__appliedElement.__cssBuild = this.__cssBuild;
-}
-if (this.ownerDocument !== window.document && this.__appliedElement === this) {
-document.head.appendChild(this);
-}
-this._tryApply();
-},
-attached: function () {
-this._tryApply();
-},
-_tryApply: function () {
-if (!this._appliesToDocument) {
-if (this.parentNode && this.parentNode.localName !== 'dom-module') {
-this._appliesToDocument = true;
-var e = this.__appliedElement;
-if (!settings.useNativeCSSProperties) {
-this.__needsUpdateStyles = styleDefaults.hasStyleProperties();
-styleDefaults.addStyle(e);
-}
-if (e.textContent || this.include) {
-this._apply(true);
-} else {
-var self = this;
-var observer = new MutationObserver(function () {
-observer.disconnect();
-self._apply(true);
-});
-observer.observe(e, { childList: true });
-}
-}
-}
-},
-_updateStyles: function () {
-Polymer.updateStyles();
-},
-_apply: function (initialApply) {
-var e = this.__appliedElement;
-if (this.include) {
-e.textContent = styleUtil.cssFromModules(this.include, true) + e.textContent;
-}
-if (!e.textContent) {
-return;
-}
-var buildType = this.__cssBuild;
-var targetedBuild = styleUtil.isTargetedBuild(buildType);
-if (settings.useNativeCSSProperties && targetedBuild) {
-return;
-}
-var styleRules = styleUtil.rulesForStyle(e);
-if (!targetedBuild) {
-styleUtil.forEachRule(styleRules, function (rule) {
-styleTransformer.documentRule(rule);
-});
-if (settings.useNativeCSSProperties && !buildType) {
-applyShim.transform([e]);
-}
-}
-if (settings.useNativeCSSProperties) {
-e.textContent = styleUtil.toCssText(styleRules);
-} else {
-var self = this;
-var fn = function fn() {
-self._flushCustomProperties();
-};
-if (initialApply) {
-Polymer.RenderStatus.whenReady(fn);
-} else {
-fn();
-}
-}
-},
-_flushCustomProperties: function () {
-if (this.__needsUpdateStyles) {
-this.__needsUpdateStyles = false;
-updateDebouncer = debounce(updateDebouncer, this._updateStyles);
-} else {
-this._applyCustomProperties();
-}
-},
-_applyCustomProperties: function () {
-var element = this.__appliedElement;
-this._computeStyleProperties();
-var props = this._styleProperties;
-var rules = styleUtil.rulesForStyle(element);
-if (!rules) {
-return;
-}
-element.textContent = styleUtil.toCssText(rules, function (rule) {
-var css = rule.cssText = rule.parsedCssText;
-if (rule.propertyInfo && rule.propertyInfo.cssText) {
-css = cssParse.removeCustomPropAssignment(css);
-rule.cssText = propertyUtils.valueForProperties(css, props);
-}
-});
-}
-});
-}());Polymer.Templatizer = {
-properties: { __hideTemplateChildren__: { observer: '_showHideChildren' } },
-_instanceProps: Polymer.nob,
-_parentPropPrefix: '_parent_',
-templatize: function (template) {
-this._templatized = template;
-if (!template._content) {
-template._content = template.content;
-}
-if (template._content._ctor) {
-this.ctor = template._content._ctor;
-this._prepParentProperties(this.ctor.prototype, template);
-return;
-}
-var archetype = Object.create(Polymer.Base);
-this._customPrepAnnotations(archetype, template);
-this._prepParentProperties(archetype, template);
-archetype._prepEffects();
-this._customPrepEffects(archetype);
-archetype._prepBehaviors();
-archetype._prepPropertyInfo();
-archetype._prepBindings();
-archetype._notifyPathUp = this._notifyPathUpImpl;
-archetype._scopeElementClass = this._scopeElementClassImpl;
-archetype.listen = this._listenImpl;
-archetype._showHideChildren = this._showHideChildrenImpl;
-archetype.__setPropertyOrig = this.__setProperty;
-archetype.__setProperty = this.__setPropertyImpl;
-var _constructor = this._constructorImpl;
-var ctor = function TemplateInstance(model, host) {
-_constructor.call(this, model, host);
-};
-ctor.prototype = archetype;
-archetype.constructor = ctor;
-template._content._ctor = ctor;
-this.ctor = ctor;
-},
-_getRootDataHost: function () {
-return this.dataHost && this.dataHost._rootDataHost || this.dataHost;
-},
-_showHideChildrenImpl: function (hide) {
-var c = this._children;
-for (var i = 0; i < c.length; i++) {
-var n = c[i];
-if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) {
-if (n.nodeType === Node.TEXT_NODE) {
-if (hide) {
-n.__polymerTextContent__ = n.textContent;
-n.textContent = '';
-} else {
-n.textContent = n.__polymerTextContent__;
-}
-} else if (n.style) {
-if (hide) {
-n.__polymerDisplay__ = n.style.display;
-n.style.display = 'none';
-} else {
-n.style.display = n.__polymerDisplay__;
-}
-}
-}
-n.__hideTemplateChildren__ = hide;
-}
-},
-__setPropertyImpl: function (property, value, fromAbove, node) {
-if (node && node.__hideTemplateChildren__ && property == 'textContent') {
-property = '__polymerTextContent__';
-}
-this.__setPropertyOrig(property, value, fromAbove, node);
-},
-_debounceTemplate: function (fn) {
-Polymer.dom.addDebouncer(this.debounce('_debounceTemplate', fn));
-},
-_flushTemplates: function () {
-Polymer.dom.flush();
-},
-_customPrepEffects: function (archetype) {
-var parentProps = archetype._parentProps;
-for (var prop in parentProps) {
-archetype._addPropertyEffect(prop, 'function', this._createHostPropEffector(prop));
-}
-for (prop in this._instanceProps) {
-archetype._addPropertyEffect(prop, 'function', this._createInstancePropEffector(prop));
-}
-},
-_customPrepAnnotations: function (archetype, template) {
-var t = archetype._template = document.createElement('template');
-var c = t._content = template._content;
-if (!c._notes) {
-var rootDataHost = archetype._rootDataHost;
-if (rootDataHost) {
-Polymer.Annotations.prepElement = function () {
-rootDataHost._prepElement();
-};
-}
-c._notes = Polymer.Annotations.parseAnnotations(template);
-Polymer.Annotations.prepElement = null;
-this._processAnnotations(c._notes);
-}
-archetype._notes = c._notes;
-archetype._parentProps = c._parentProps;
-},
-_prepParentProperties: function (archetype, template) {
-var parentProps = this._parentProps = archetype._parentProps;
-if (this._forwardParentProp && parentProps) {
-var proto = archetype._parentPropProto;
-var prop;
-if (!proto) {
-for (prop in this._instanceProps) {
-delete parentProps[prop];
-}
-proto = archetype._parentPropProto = Object.create(null);
-if (template != this) {
-Polymer.Bind.prepareModel(proto);
-Polymer.Base.prepareModelNotifyPath(proto);
-}
-for (prop in parentProps) {
-var parentProp = this._parentPropPrefix + prop;
-var effects = [
-{
-kind: 'function',
-effect: this._createForwardPropEffector(prop),
-fn: Polymer.Bind._functionEffect
-},
-{
-kind: 'notify',
-fn: Polymer.Bind._notifyEffect,
-effect: { event: Polymer.CaseMap.camelToDashCase(parentProp) + '-changed' }
-}
-];
-proto._propertyEffects = proto._propertyEffects || {};
-proto._propertyEffects[parentProp] = effects;
-Polymer.Bind._createAccessors(proto, parentProp, effects);
-}
-}
-var self = this;
-if (template != this) {
-Polymer.Bind.prepareInstance(template);
-template._forwardParentProp = function (source, value) {
-self._forwardParentProp(source, value);
-};
-}
-this._extendTemplate(template, proto);
-template._pathEffector = function (path, value, fromAbove) {
-return self._pathEffectorImpl(path, value, fromAbove);
-};
-}
-},
-_createForwardPropEffector: function (prop) {
-return function (source, value) {
-this._forwardParentProp(prop, value);
-};
-},
-_createHostPropEffector: function (prop) {
-var prefix = this._parentPropPrefix;
-return function (source, value) {
-this.dataHost._templatized[prefix + prop] = value;
-};
-},
-_createInstancePropEffector: function (prop) {
-return function (source, value, old, fromAbove) {
-if (!fromAbove) {
-this.dataHost._forwardInstanceProp(this, prop, value);
-}
-};
-},
-_extendTemplate: function (template, proto) {
-var n$ = Object.getOwnPropertyNames(proto);
-if (proto._propertySetter) {
-template._propertySetter = proto._propertySetter;
-}
-for (var i = 0, n; i < n$.length && (n = n$[i]); i++) {
-var val = template[n];
-if (val && n == '_propertyEffects') {
-var pe = Polymer.Base.mixin({}, val);
-template._propertyEffects = Polymer.Base.mixin(pe, proto._propertyEffects);
-} else {
-var pd = Object.getOwnPropertyDescriptor(proto, n);
-Object.defineProperty(template, n, pd);
-if (val !== undefined) {
-template._propertySetter(n, val);
-}
-}
-}
-},
-_showHideChildren: function (hidden) {
-},
-_forwardInstancePath: function (inst, path, value) {
-},
-_forwardInstanceProp: function (inst, prop, value) {
-},
-_notifyPathUpImpl: function (path, value) {
-var dataHost = this.dataHost;
-var root = Polymer.Path.root(path);
-dataHost._forwardInstancePath.call(dataHost, this, path, value);
-if (root in dataHost._parentProps) {
-dataHost._templatized._notifyPath(dataHost._parentPropPrefix + path, value);
-}
-},
-_pathEffectorImpl: function (path, value, fromAbove) {
-if (this._forwardParentPath) {
-if (path.indexOf(this._parentPropPrefix) === 0) {
-var subPath = path.substring(this._parentPropPrefix.length);
-var model = Polymer.Path.root(subPath);
-if (model in this._parentProps) {
-this._forwardParentPath(subPath, value);
-}
-}
-}
-Polymer.Base._pathEffector.call(this._templatized, path, value, fromAbove);
-},
-_constructorImpl: function (model, host) {
-this._rootDataHost = host._getRootDataHost();
-this._setupConfigure(model);
-this._registerHost(host);
-this._beginHosting();
-this.root = this.instanceTemplate(this._template);
-this.root.__noContent = !this._notes._hasContent;
-this.root.__styleScoped = true;
-this._endHosting();
-this._marshalAnnotatedNodes();
-this._marshalInstanceEffects();
-this._marshalAnnotatedListeners();
-var children = [];
-for (var n = this.root.firstChild; n; n = n.nextSibling) {
-children.push(n);
-n._templateInstance = this;
-}
-this._children = children;
-if (host.__hideTemplateChildren__) {
-this._showHideChildren(true);
-}
-this._tryReady();
-},
-_listenImpl: function (node, eventName, methodName) {
-var model = this;
-var host = this._rootDataHost;
-var handler = host._createEventHandler(node, eventName, methodName);
-var decorated = function (e) {
-e.model = model;
-handler(e);
-};
-host._listen(node, eventName, decorated);
-},
-_scopeElementClassImpl: function (node, value) {
-var host = this._rootDataHost;
-if (host) {
-return host._scopeElementClass(node, value);
-}
-return value;
-},
-stamp: function (model) {
-model = model || {};
-if (this._parentProps) {
-var templatized = this._templatized;
-for (var prop in this._parentProps) {
-if (model[prop] === undefined) {
-model[prop] = templatized[this._parentPropPrefix + prop];
-}
-}
-}
-return new this.ctor(model, this);
-},
-modelForElement: function (el) {
-var model;
-while (el) {
-if (model = el._templateInstance) {
-if (model.dataHost != this) {
-el = model.dataHost;
-} else {
-return model;
-}
-} else {
-el = el.parentNode;
-}
-}
-}
-};Polymer({
-is: 'dom-template',
-extends: 'template',
-_template: null,
-behaviors: [Polymer.Templatizer],
-ready: function () {
-this.templatize(this);
-}
-});Polymer._collections = new WeakMap();
-Polymer.Collection = function (userArray) {
-Polymer._collections.set(userArray, this);
-this.userArray = userArray;
-this.store = userArray.slice();
-this.initMap();
-};
-Polymer.Collection.prototype = {
-constructor: Polymer.Collection,
-initMap: function () {
-var omap = this.omap = new WeakMap();
-var pmap = this.pmap = {};
-var s = this.store;
-for (var i = 0; i < s.length; i++) {
-var item = s[i];
-if (item && typeof item == 'object') {
-omap.set(item, i);
-} else {
-pmap[item] = i;
-}
-}
-},
-add: function (item) {
-var key = this.store.push(item) - 1;
-if (item && typeof item == 'object') {
-this.omap.set(item, key);
-} else {
-this.pmap[item] = key;
-}
-return '#' + key;
-},
-removeKey: function (key) {
-if (key = this._parseKey(key)) {
-this._removeFromMap(this.store[key]);
-delete this.store[key];
-}
-},
-_removeFromMap: function (item) {
-if (item && typeof item == 'object') {
-this.omap.delete(item);
-} else {
-delete this.pmap[item];
-}
-},
-remove: function (item) {
-var key = this.getKey(item);
-this.removeKey(key);
-return key;
-},
-getKey: function (item) {
-var key;
-if (item && typeof item == 'object') {
-key = this.omap.get(item);
-} else {
-key = this.pmap[item];
-}
-if (key != undefined) {
-return '#' + key;
-}
-},
-getKeys: function () {
-return Object.keys(this.store).map(function (key) {
-return '#' + key;
-});
-},
-_parseKey: function (key) {
-if (key && key[0] == '#') {
-return key.slice(1);
-}
-},
-setItem: function (key, item) {
-if (key = this._parseKey(key)) {
-var old = this.store[key];
-if (old) {
-this._removeFromMap(old);
-}
-if (item && typeof item == 'object') {
-this.omap.set(item, key);
-} else {
-this.pmap[item] = key;
-}
-this.store[key] = item;
-}
-},
-getItem: function (key) {
-if (key = this._parseKey(key)) {
-return this.store[key];
-}
-},
-getItems: function () {
-var items = [], store = this.store;
-for (var key in store) {
-items.push(store[key]);
-}
-return items;
-},
-_applySplices: function (splices) {
-var keyMap = {}, key;
-for (var i = 0, s; i < splices.length && (s = splices[i]); i++) {
-s.addedKeys = [];
-for (var j = 0; j < s.removed.length; j++) {
-key = this.getKey(s.removed[j]);
-keyMap[key] = keyMap[key] ? null : -1;
-}
-for (j = 0; j < s.addedCount; j++) {
-var item = this.userArray[s.index + j];
-key = this.getKey(item);
-key = key === undefined ? this.add(item) : key;
-keyMap[key] = keyMap[key] ? null : 1;
-s.addedKeys.push(key);
-}
-}
-var removed = [];
-var added = [];
-for (key in keyMap) {
-if (keyMap[key] < 0) {
-this.removeKey(key);
-removed.push(key);
-}
-if (keyMap[key] > 0) {
-added.push(key);
-}
-}
-return [{
-removed: removed,
-added: added
-}];
-}
-};
-Polymer.Collection.get = function (userArray) {
-return Polymer._collections.get(userArray) || new Polymer.Collection(userArray);
-};
-Polymer.Collection.applySplices = function (userArray, splices) {
-var coll = Polymer._collections.get(userArray);
-return coll ? coll._applySplices(splices) : null;
-};Polymer({
-is: 'dom-repeat',
-extends: 'template',
-_template: null,
-properties: {
-items: { type: Array },
-as: {
-type: String,
-value: 'item'
-},
-indexAs: {
-type: String,
-value: 'index'
-},
-sort: {
-type: Function,
-observer: '_sortChanged'
-},
-filter: {
-type: Function,
-observer: '_filterChanged'
-},
-observe: {
-type: String,
-observer: '_observeChanged'
-},
-delay: Number,
-renderedItemCount: {
-type: Number,
-notify: !Polymer.Settings.suppressTemplateNotifications,
-readOnly: true
-},
-initialCount: {
-type: Number,
-observer: '_initializeChunking'
-},
-targetFramerate: {
-type: Number,
-value: 20
-},
-notifyDomChange: { type: Boolean },
-_targetFrameTime: {
-type: Number,
-computed: '_computeFrameTime(targetFramerate)'
-}
-},
-behaviors: [Polymer.Templatizer],
-observers: ['_itemsChanged(items.*)'],
-created: function () {
-this._instances = [];
-this._pool = [];
-this._limit = Infinity;
-var self = this;
-this._boundRenderChunk = function () {
-self._renderChunk();
-};
-},
-detached: function () {
-this.__isDetached = true;
-for (var i = 0; i < this._instances.length; i++) {
-this._detachInstance(i);
-}
-},
-attached: function () {
-if (this.__isDetached) {
-this.__isDetached = false;
-var refNode;
-var parentNode = Polymer.dom(this).parentNode;
-if (parentNode.localName == this.is) {
-refNode = parentNode;
-parentNode = Polymer.dom(parentNode).parentNode;
-} else {
-refNode = this;
-}
-var parent = Polymer.dom(parentNode);
-for (var i = 0; i < this._instances.length; i++) {
-this._attachInstance(i, parent, refNode);
-}
-}
-},
-ready: function () {
-this._instanceProps = { __key__: true };
-this._instanceProps[this.as] = true;
-this._instanceProps[this.indexAs] = true;
-if (!this.ctor) {
-this.templatize(this);
-}
-},
-_sortChanged: function (sort) {
-var dataHost = this._getRootDataHost();
-this._sortFn = sort && (typeof sort == 'function' ? sort : function () {
-return dataHost[sort].apply(dataHost, arguments);
-});
-this._needFullRefresh = true;
-if (this.items) {
-this._debounceTemplate(this._render);
-}
-},
-_filterChanged: function (filter) {
-var dataHost = this._getRootDataHost();
-this._filterFn = filter && (typeof filter == 'function' ? filter : function () {
-return dataHost[filter].apply(dataHost, arguments);
-});
-this._needFullRefresh = true;
-if (this.items) {
-this._debounceTemplate(this._render);
-}
-},
-_computeFrameTime: function (rate) {
-return Math.ceil(1000 / rate);
-},
-_initializeChunking: function () {
-if (this.initialCount) {
-this._limit = this.initialCount;
-this._chunkCount = this.initialCount;
-this._lastChunkTime = performance.now();
-}
-},
-_tryRenderChunk: function () {
-if (this.items && this._limit < this.items.length) {
-this.debounce('renderChunk', this._requestRenderChunk);
-}
-},
-_requestRenderChunk: function () {
-requestAnimationFrame(this._boundRenderChunk);
-},
-_renderChunk: function () {
-var currChunkTime = performance.now();
-var ratio = this._targetFrameTime / (currChunkTime - this._lastChunkTime);
-this._chunkCount = Math.round(this._chunkCount * ratio) || 1;
-this._limit += this._chunkCount;
-this._lastChunkTime = currChunkTime;
-this._debounceTemplate(this._render);
-},
-_observeChanged: function () {
-this._observePaths = this.observe && this.observe.replace('.*', '.').split(' ');
-},
-_itemsChanged: function (change) {
-if (change.path == 'items') {
-if (Array.isArray(this.items)) {
-this.collection = Polymer.Collection.get(this.items);
-} else if (!this.items) {
-this.collection = null;
-} else {
-this._error(this._logf('dom-repeat', 'expected array for `items`,' + ' found', this.items));
-}
-this._keySplices = [];
-this._indexSplices = [];
-this._needFullRefresh = true;
-this._initializeChunking();
-this._debounceTemplate(this._render);
-} else if (change.path == 'items.splices') {
-this._keySplices = this._keySplices.concat(change.value.keySplices);
-this._indexSplices = this._indexSplices.concat(change.value.indexSplices);
-this._debounceTemplate(this._render);
-} else {
-var subpath = change.path.slice(6);
-this._forwardItemPath(subpath, change.value);
-this._checkObservedPaths(subpath);
-}
-},
-_checkObservedPaths: function (path) {
-if (this._observePaths) {
-path = path.substring(path.indexOf('.') + 1);
-var paths = this._observePaths;
-for (var i = 0; i < paths.length; i++) {
-if (path.indexOf(paths[i]) === 0) {
-this._needFullRefresh = true;
-if (this.delay) {
-this.debounce('render', this._render, this.delay);
-} else {
-this._debounceTemplate(this._render);
-}
-return;
-}
-}
-}
-},
-render: function () {
-this._needFullRefresh = true;
-this._debounceTemplate(this._render);
-this._flushTemplates();
-},
-_render: function () {
-if (this._needFullRefresh) {
-this._applyFullRefresh();
-this._needFullRefresh = false;
-} else if (this._keySplices.length) {
-if (this._sortFn) {
-this._applySplicesUserSort(this._keySplices);
-} else {
-if (this._filterFn) {
-this._applyFullRefresh();
-} else {
-this._applySplicesArrayOrder(this._indexSplices);
-}
-}
-} else {
-}
-this._keySplices = [];
-this._indexSplices = [];
-var keyToIdx = this._keyToInstIdx = {};
-for (var i = this._instances.length - 1; i >= 0; i--) {
-var inst = this._instances[i];
-if (inst.isPlaceholder && i < this._limit) {
-inst = this._insertInstance(i, inst.__key__);
-} else if (!inst.isPlaceholder && i >= this._limit) {
-inst = this._downgradeInstance(i, inst.__key__);
-}
-keyToIdx[inst.__key__] = i;
-if (!inst.isPlaceholder) {
-inst.__setProperty(this.indexAs, i, true);
-}
-}
-this._pool.length = 0;
-this._setRenderedItemCount(this._instances.length);
-if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) {
-this.fire('dom-change');
-}
-this._tryRenderChunk();
-},
-_applyFullRefresh: function () {
-var c = this.collection;
-var keys;
-if (this._sortFn) {
-keys = c ? c.getKeys() : [];
-} else {
-keys = [];
-var items = this.items;
-if (items) {
-for (var i = 0; i < items.length; i++) {
-keys.push(c.getKey(items[i]));
-}
-}
-}
-var self = this;
-if (this._filterFn) {
-keys = keys.filter(function (a) {
-return self._filterFn(c.getItem(a));
-});
-}
-if (this._sortFn) {
-keys.sort(function (a, b) {
-return self._sortFn(c.getItem(a), c.getItem(b));
-});
-}
-for (i = 0; i < keys.length; i++) {
-var key = keys[i];
-var inst = this._instances[i];
-if (inst) {
-inst.__key__ = key;
-if (!inst.isPlaceholder && i < this._limit) {
-inst.__setProperty(this.as, c.getItem(key), true);
-}
-} else if (i < this._limit) {
-this._insertInstance(i, key);
-} else {
-this._insertPlaceholder(i, key);
-}
-}
-for (var j = this._instances.length - 1; j >= i; j--) {
-this._detachAndRemoveInstance(j);
-}
-},
-_numericSort: function (a, b) {
-return a - b;
-},
-_applySplicesUserSort: function (splices) {
-var c = this.collection;
-var keyMap = {};
-var key;
-for (var i = 0, s; i < splices.length && (s = splices[i]); i++) {
-for (var j = 0; j < s.removed.length; j++) {
-key = s.removed[j];
-keyMap[key] = keyMap[key] ? null : -1;
-}
-for (j = 0; j < s.added.length; j++) {
-key = s.added[j];
-keyMap[key] = keyMap[key] ? null : 1;
-}
-}
-var removedIdxs = [];
-var addedKeys = [];
-for (key in keyMap) {
-if (keyMap[key] === -1) {
-removedIdxs.push(this._keyToInstIdx[key]);
-}
-if (keyMap[key] === 1) {
-addedKeys.push(key);
-}
-}
-if (removedIdxs.length) {
-removedIdxs.sort(this._numericSort);
-for (i = removedIdxs.length - 1; i >= 0; i--) {
-var idx = removedIdxs[i];
-if (idx !== undefined) {
-this._detachAndRemoveInstance(idx);
-}
-}
-}
-var self = this;
-if (addedKeys.length) {
-if (this._filterFn) {
-addedKeys = addedKeys.filter(function (a) {
-return self._filterFn(c.getItem(a));
-});
-}
-addedKeys.sort(function (a, b) {
-return self._sortFn(c.getItem(a), c.getItem(b));
-});
-var start = 0;
-for (i = 0; i < addedKeys.length; i++) {
-start = this._insertRowUserSort(start, addedKeys[i]);
-}
-}
-},
-_insertRowUserSort: function (start, key) {
-var c = this.collection;
-var item = c.getItem(key);
-var end = this._instances.length - 1;
-var idx = -1;
-while (start <= end) {
-var mid = start + end >> 1;
-var midKey = this._instances[mid].__key__;
-var cmp = this._sortFn(c.getItem(midKey), item);
-if (cmp < 0) {
-start = mid + 1;
-} else if (cmp > 0) {
-end = mid - 1;
-} else {
-idx = mid;
-break;
-}
-}
-if (idx < 0) {
-idx = end + 1;
-}
-this._insertPlaceholder(idx, key);
-return idx;
-},
-_applySplicesArrayOrder: function (splices) {
-for (var i = 0, s; i < splices.length && (s = splices[i]); i++) {
-for (var j = 0; j < s.removed.length; j++) {
-this._detachAndRemoveInstance(s.index);
-}
-for (j = 0; j < s.addedKeys.length; j++) {
-this._insertPlaceholder(s.index + j, s.addedKeys[j]);
-}
-}
-},
-_detachInstance: function (idx) {
-var inst = this._instances[idx];
-if (!inst.isPlaceholder) {
-for (var i = 0; i < inst._children.length; i++) {
-var el = inst._children[i];
-Polymer.dom(inst.root).appendChild(el);
-}
-return inst;
-}
-},
-_attachInstance: function (idx, parent, refNode) {
-var inst = this._instances[idx];
-if (!inst.isPlaceholder) {
-parent.insertBefore(inst.root, refNode);
-}
-},
-_detachAndRemoveInstance: function (idx) {
-var inst = this._detachInstance(idx);
-if (inst) {
-this._pool.push(inst);
-}
-this._instances.splice(idx, 1);
-},
-_insertPlaceholder: function (idx, key) {
-this._instances.splice(idx, 0, {
-isPlaceholder: true,
-__key__: key
-});
-},
-_stampInstance: function (idx, key) {
-var model = { __key__: key };
-model[this.as] = this.collection.getItem(key);
-model[this.indexAs] = idx;
-return this.stamp(model);
-},
-_insertInstance: function (idx, key) {
-var inst = this._pool.pop();
-if (inst) {
-inst.__setProperty(this.as, this.collection.getItem(key), true);
-inst.__setProperty('__key__', key, true);
-} else {
-inst = this._stampInstance(idx, key);
-}
-var beforeRow = this._instances[idx + 1];
-var beforeNode = beforeRow && !beforeRow.isPlaceholder ? beforeRow._children[0] : this;
-var parentNode = Polymer.dom(this).parentNode;
-if (parentNode.localName == this.is) {
-if (beforeNode == this) {
-beforeNode = parentNode;
-}
-parentNode = Polymer.dom(parentNode).parentNode;
-}
-Polymer.dom(parentNode).insertBefore(inst.root, beforeNode);
-this._instances[idx] = inst;
-return inst;
-},
-_downgradeInstance: function (idx, key) {
-var inst = this._detachInstance(idx);
-if (inst) {
-this._pool.push(inst);
-}
-inst = {
-isPlaceholder: true,
-__key__: key
-};
-this._instances[idx] = inst;
-return inst;
-},
-_showHideChildren: function (hidden) {
-for (var i = 0; i < this._instances.length; i++) {
-if (!this._instances[i].isPlaceholder)
-this._instances[i]._showHideChildren(hidden);
-}
-},
-_forwardInstanceProp: function (inst, prop, value) {
-if (prop == this.as) {
-var idx;
-if (this._sortFn || this._filterFn) {
-idx = this.items.indexOf(this.collection.getItem(inst.__key__));
-} else {
-idx = inst[this.indexAs];
-}
-this.set('items.' + idx, value);
-}
-},
-_forwardInstancePath: function (inst, path, value) {
-if (path.indexOf(this.as + '.') === 0) {
-this._notifyPath('items.' + inst.__key__ + '.' + path.slice(this.as.length + 1), value);
-}
-},
-_forwardParentProp: function (prop, value) {
-var i$ = this._instances;
-for (var i = 0, inst; i < i$.length && (inst = i$[i]); i++) {
-if (!inst.isPlaceholder) {
-inst.__setProperty(prop, value, true);
-}
-}
-},
-_forwardParentPath: function (path, value) {
-var i$ = this._instances;
-for (var i = 0, inst; i < i$.length && (inst = i$[i]); i++) {
-if (!inst.isPlaceholder) {
-inst._notifyPath(path, value, true);
-}
-}
-},
-_forwardItemPath: function (path, value) {
-if (this._keyToInstIdx) {
-var dot = path.indexOf('.');
-var key = path.substring(0, dot < 0 ? path.length : dot);
-var idx = this._keyToInstIdx[key];
-var inst = this._instances[idx];
-if (inst && !inst.isPlaceholder) {
-if (dot >= 0) {
-path = this.as + '.' + path.substring(dot + 1);
-inst._notifyPath(path, value, true);
-} else {
-inst.__setProperty(this.as, value, true);
-}
-}
-}
-},
-itemForElement: function (el) {
-var instance = this.modelForElement(el);
-return instance && instance[this.as];
-},
-keyForElement: function (el) {
-var instance = this.modelForElement(el);
-return instance && instance.__key__;
-},
-indexForElement: function (el) {
-var instance = this.modelForElement(el);
-return instance && instance[this.indexAs];
-}
-});Polymer({
-is: 'array-selector',
-_template: null,
-properties: {
-items: {
-type: Array,
-observer: 'clearSelection'
-},
-multi: {
-type: Boolean,
-value: false,
-observer: 'clearSelection'
-},
-selected: {
-type: Object,
-notify: true
-},
-selectedItem: {
-type: Object,
-notify: true
-},
-toggle: {
-type: Boolean,
-value: false
-}
-},
-clearSelection: function () {
-if (Array.isArray(this.selected)) {
-for (var i = 0; i < this.selected.length; i++) {
-this.unlinkPaths('selected.' + i);
-}
-} else {
-this.unlinkPaths('selected');
-this.unlinkPaths('selectedItem');
-}
-if (this.multi) {
-if (!this.selected || this.selected.length) {
-this.selected = [];
-this._selectedColl = Polymer.Collection.get(this.selected);
-}
-} else {
-this.selected = null;
-this._selectedColl = null;
-}
-this.selectedItem = null;
-},
-isSelected: function (item) {
-if (this.multi) {
-return this._selectedColl.getKey(item) !== undefined;
-} else {
-return this.selected == item;
-}
-},
-deselect: function (item) {
-if (this.multi) {
-if (this.isSelected(item)) {
-var skey = this._selectedColl.getKey(item);
-this.arrayDelete('selected', item);
-this.unlinkPaths('selected.' + skey);
-}
-} else {
-this.selected = null;
-this.selectedItem = null;
-this.unlinkPaths('selected');
-this.unlinkPaths('selectedItem');
-}
-},
-select: function (item) {
-var icol = Polymer.Collection.get(this.items);
-var key = icol.getKey(item);
-if (this.multi) {
-if (this.isSelected(item)) {
-if (this.toggle) {
-this.deselect(item);
-}
-} else {
-this.push('selected', item);
-var skey = this._selectedColl.getKey(item);
-this.linkPaths('selected.' + skey, 'items.' + key);
-}
-} else {
-if (this.toggle && item == this.selected) {
-this.deselect();
-} else {
-this.selected = item;
-this.selectedItem = item;
-this.linkPaths('selected', 'items.' + key);
-this.linkPaths('selectedItem', 'items.' + key);
-}
-}
-}
-});Polymer({
-is: 'dom-if',
-extends: 'template',
-_template: null,
-properties: {
-'if': {
-type: Boolean,
-value: false,
-observer: '_queueRender'
-},
-restamp: {
-type: Boolean,
-value: false,
-observer: '_queueRender'
-},
-notifyDomChange: { type: Boolean }
-},
-behaviors: [Polymer.Templatizer],
-_queueRender: function () {
-this._debounceTemplate(this._render);
-},
-detached: function () {
-var parentNode = this.parentNode;
-if (parentNode && parentNode.localName == this.is) {
-parentNode = Polymer.dom(parentNode).parentNode;
-}
-if (!parentNode || parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE && (!Polymer.Settings.hasShadow || !(parentNode instanceof ShadowRoot))) {
-this._teardownInstance();
-}
-},
-attached: function () {
-if (this.if && this.ctor) {
-this.async(this._ensureInstance);
-}
-},
-render: function () {
-this._flushTemplates();
-},
-_render: function () {
-if (this.if) {
-if (!this.ctor) {
-this.templatize(this);
-}
-this._ensureInstance();
-this._showHideChildren();
-} else if (this.restamp) {
-this._teardownInstance();
-}
-if (!this.restamp && this._instance) {
-this._showHideChildren();
-}
-if (this.if != this._lastIf) {
-if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) {
-this.fire('dom-change');
-}
-this._lastIf = this.if;
-}
-},
-_ensureInstance: function () {
-var refNode;
-var parentNode = Polymer.dom(this).parentNode;
-if (parentNode && parentNode.localName == this.is) {
-refNode = parentNode;
-parentNode = Polymer.dom(parentNode).parentNode;
-} else {
-refNode = this;
-}
-if (parentNode) {
-if (!this._instance) {
-this._instance = this.stamp();
-var root = this._instance.root;
-Polymer.dom(parentNode).insertBefore(root, refNode);
-} else {
-var c$ = this._instance._children;
-if (c$ && c$.length) {
-var lastChild = Polymer.dom(refNode).previousSibling;
-if (lastChild !== c$[c$.length - 1]) {
-for (var i = 0, n; i < c$.length && (n = c$[i]); i++) {
-Polymer.dom(parentNode).insertBefore(n, refNode);
-}
-}
-}
-}
-}
-},
-_teardownInstance: function () {
-if (this._instance) {
-var c$ = this._instance._children;
-if (c$ && c$.length) {
-var parent = Polymer.dom(Polymer.dom(c$[0]).parentNode);
-for (var i = 0, n; i < c$.length && (n = c$[i]); i++) {
-parent.removeChild(n);
-}
-}
-this._instance = null;
-}
-},
-_showHideChildren: function () {
-var hidden = this.__hideTemplateChildren__ || !this.if;
-if (this._instance) {
-this._instance._showHideChildren(hidden);
-}
-},
-_forwardParentProp: function (prop, value) {
-if (this._instance) {
-this._instance.__setProperty(prop, value, true);
-}
-},
-_forwardParentPath: function (path, value) {
-if (this._instance) {
-this._instance._notifyPath(path, value, true);
-}
-}
-});Polymer({
-is: 'dom-bind',
-properties: { notifyDomChange: { type: Boolean } },
-extends: 'template',
-_template: null,
-created: function () {
-var self = this;
-Polymer.RenderStatus.whenReady(function () {
-if (document.readyState == 'loading') {
-document.addEventListener('DOMContentLoaded', function () {
-self._markImportsReady();
-});
-} else {
-self._markImportsReady();
-}
-});
-},
-_ensureReady: function () {
-if (!this._readied) {
-this._readySelf();
-}
-},
-_markImportsReady: function () {
-this._importsReady = true;
-this._ensureReady();
-},
-_registerFeatures: function () {
-this._prepConstructor();
-},
-_insertChildren: function () {
-var refNode;
-var parentNode = Polymer.dom(this).parentNode;
-if (parentNode.localName == this.is) {
-refNode = parentNode;
-parentNode = Polymer.dom(parentNode).parentNode;
-} else {
-refNode = this;
-}
-Polymer.dom(parentNode).insertBefore(this.root, refNode);
-},
-_removeChildren: function () {
-if (this._children) {
-for (var i = 0; i < this._children.length; i++) {
-this.root.appendChild(this._children[i]);
-}
-}
-},
-_initFeatures: function () {
-},
-_scopeElementClass: function (element, selector) {
-if (this.dataHost) {
-return this.dataHost._scopeElementClass(element, selector);
-} else {
-return selector;
-}
-},
-_configureInstanceProperties: function () {
-},
-_prepConfigure: function () {
-var config = {};
-for (var prop in this._propertyEffects) {
-config[prop] = this[prop];
-}
-var setupConfigure = this._setupConfigure;
-this._setupConfigure = function () {
-setupConfigure.call(this, config);
-};
-},
-attached: function () {
-if (this._importsReady) {
-this.render();
-}
-},
-detached: function () {
-this._removeChildren();
-},
-render: function () {
-this._ensureReady();
-if (!this._children) {
-this._template = this;
-this._prepAnnotations();
-this._prepEffects();
-this._prepBehaviors();
-this._prepConfigure();
-this._prepBindings();
-this._prepPropertyInfo();
-Polymer.Base._initFeatures.call(this);
-this._children = Polymer.TreeApi.arrayCopyChildNodes(this.root);
-}
-this._insertChildren();
-if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) {
-this.fire('dom-change');
-}
-}
-});</script>
-
-
-
-
-
-
-
-
-
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/promise-polyfill/CONTRIBUTING.md
deleted file mode 100644
index 093090d..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/CONTRIBUTING.md
+++ /dev/null
@@ -1,77 +0,0 @@
-<!--
-This file is autogenerated based on
-https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
-
-If you edit that file, it will get updated everywhere else.
-If you edit this file, your changes will get overridden :)
-
-You can however override the jsbin link with one that's customized to this
-specific element:
-
-jsbin=https://jsbin.com/cagaye/edit?html,output
--->
-
-# Polymer Elements
-## Guide for Contributors
-
-Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
-
-### Filing Issues
-
-**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
-
- 1. **Who will use the feature?** _“As someone filling out a form…”_
- 2. **When will they use the feature?** _“When I enter an invalid value…”_
- 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_
-
-**If you are filing an issue to report a bug**, please provide:
-
- 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
-
- ```markdown
- The `paper-foo` element causes the page to turn pink when clicked.
-
- ## Expected outcome
-
- The page stays the same color.
-
- ## Actual outcome
-
- The page turns pink.
-
- ## Steps to reproduce
-
- 1. Put a `paper-foo` element in the page.
- 2. Open the page in a web browser.
- 3. Click the `paper-foo` element.
- ```
-
- 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
-
- 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
-
-### Submitting Pull Requests
-
-**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
-
-When submitting pull requests, please provide:
-
- 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
-
- ```markdown
- (For a single issue)
- Fixes #20
-
- (For multiple issues)
- Fixes #32, fixes #40
- ```
-
- 2. **A succinct description of the design** used to fix any related issues. For example:
-
- ```markdown
- This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
- ```
-
- 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
-
-If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that!
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/Gruntfile.js b/systrace/catapult/third_party/polymer/components/promise-polyfill/Gruntfile.js
deleted file mode 100644
index 74f4fe5..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/Gruntfile.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-module.exports = function(grunt) {
-
-	grunt.initConfig({
-		pkg: grunt.file.readJSON('package.json'),
-
-		uglify: {
-			options: {
-				banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n'
-			},
-			dist: {
-				files: {
-					'Promise.min.uglify.js': ['Promise.js']
-				}
-			}
-		},
-
-    closurecompiler: {
-      options: {
-        compilation_level: 'ADVANCED_OPTIMIZATIONS',
-      },
-      dist: {
-        files: {
-          'Promise.min.js': ['Promise.js']
-        }
-      }
-    },
-
-    bytesize: {
-      dist: {
-        src: ['Promise*.js']
-      }
-    }
-	});
-
-	grunt.loadNpmTasks('grunt-contrib-uglify');
-	grunt.loadNpmTasks('grunt-closurecompiler');
-	grunt.loadNpmTasks('grunt-bytesize');
-
-	grunt.registerTask('build', ['closurecompiler', 'bytesize']);
-};
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/LICENSE b/systrace/catapult/third_party/polymer/components/promise-polyfill/LICENSE
deleted file mode 100644
index 94b9dac..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2014 Taylor Hakes
-Copyright (c) 2014 Forbes Lindesay
-
-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.
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise-Statics.js b/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise-Statics.js
deleted file mode 100644
index 49eeb8b..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise-Statics.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-Promise.all = Promise.all || function () {
-  var args = Array.prototype.slice.call(arguments.length === 1 && Array.isArray(arguments[0]) ? arguments[0] : arguments);
-
-  return new Promise(function (resolve, reject) {
-    if (args.length === 0) return resolve([]);
-    var remaining = args.length;
-    function res(i, val) {
-      try {
-        if (val && (typeof val === 'object' || typeof val === 'function')) {
-          var then = val.then;
-          if (typeof then === 'function') {
-            then.call(val, function (val) { res(i, val) }, reject);
-            return;
-          }
-        }
-        args[i] = val;
-        if (--remaining === 0) {
-          resolve(args);
-        }
-      } catch (ex) {
-        reject(ex);
-      }
-    }
-    for (var i = 0; i < args.length; i++) {
-      res(i, args[i]);
-    }
-  });
-};
-
-Promise.race = Promise.race || function(values) {
-  // TODO(bradfordcsmith): To be consistent with the ECMAScript spec, this
-  //     method should take any iterable, not just an array.
-  var forcedArray = /** @type {!Array<!Thenable>} */ (values);
-  return new Promise(function (resolve, reject) {
-    for(var i = 0, len = forcedArray.length; i < len; i++) {
-      forcedArray[i].then(resolve, reject);
-    }
-  });
-};
-
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise.js b/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise.js
deleted file mode 100644
index b8388bf..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-function MakePromise (asap) {
-  function Promise(fn) {
-		if (typeof this !== 'object' || typeof fn !== 'function') throw new TypeError();
-		this._state = null;
-		this._value = null;
-		this._deferreds = []
-
-		doResolve(fn, resolve.bind(this), reject.bind(this));
-	}
-
-	function handle(deferred) {
-		var me = this;
-		if (this._state === null) {
-			this._deferreds.push(deferred);
-			return
-		}
-		asap(function() {
-			var cb = me._state ? deferred.onFulfilled : deferred.onRejected
-			if (typeof cb !== 'function') {
-				(me._state ? deferred.resolve : deferred.reject)(me._value);
-				return;
-			}
-			var ret;
-			try {
-				ret = cb(me._value);
-			}
-			catch (e) {
-				deferred.reject(e);
-				return;
-			}
-			deferred.resolve(ret);
-		})
-	}
-
-	function resolve(newValue) {
-		try { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
-			if (newValue === this) throw new TypeError();
-			if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
-				var then = newValue.then;
-				if (typeof then === 'function') {
-					doResolve(then.bind(newValue), resolve.bind(this), reject.bind(this));
-					return;
-				}
-			}
-			this._state = true;
-			this._value = newValue;
-			finale.call(this);
-		} catch (e) { reject.call(this, e); }
-	}
-
-	function reject(newValue) {
-		this._state = false;
-		this._value = newValue;
-		finale.call(this);
-	}
-
-	function finale() {
-		for (var i = 0, len = this._deferreds.length; i < len; i++) {
-			handle.call(this, this._deferreds[i]);
-		}
-		this._deferreds = null;
-	}
-
-	/**
-	 * Take a potentially misbehaving resolver function and make sure
-	 * onFulfilled and onRejected are only called once.
-	 *
-	 * Makes no guarantees about asynchrony.
-	 */
-	function doResolve(fn, onFulfilled, onRejected) {
-		var done = false;
-		try {
-			fn(function (value) {
-				if (done) return;
-				done = true;
-				onFulfilled(value);
-			}, function (reason) {
-				if (done) return;
-				done = true;
-				onRejected(reason);
-			})
-		} catch (ex) {
-			if (done) return;
-			done = true;
-			onRejected(ex);
-		}
-	}
-
-	Promise.prototype['catch'] = function (onRejected) {
-		return this.then(null, onRejected);
-	};
-
-	Promise.prototype.then = function(onFulfilled, onRejected) {
-		var me = this;
-		return new Promise(function(resolve, reject) {
-      handle.call(me, {
-        onFulfilled: onFulfilled,
-        onRejected: onRejected,
-        resolve: resolve,
-        reject: reject
-      });
-		})
-	};
-
-	Promise.resolve = function (value) {
-		if (value && typeof value === 'object' && value.constructor === Promise) {
-			return value;
-		}
-
-		return new Promise(function (resolve) {
-			resolve(value);
-		});
-	};
-
-	Promise.reject = function (value) {
-		return new Promise(function (resolve, reject) {
-			reject(value);
-		});
-	};
-
-	
-  return Promise;
-}
-
-if (typeof module !== 'undefined') {
-  module.exports = MakePromise;
-}
-
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise.min.js b/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise.min.js
deleted file mode 100644
index 7961059..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/Promise.min.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-function m(n){function b(a){if("object"!==typeof this||"function"!==typeof a)throw new TypeError;this.c=this.a=null;this.b=[];g(a,h.bind(this),d.bind(this))}function k(a){var c=this;null===this.a?this.b.push(a):n(function(){var f=c.a?a.d:a.e;if("function"!==typeof f)(c.a?a.resolve:a.reject)(c.c);else{var e;try{e=f(c.c)}catch(b){a.reject(b);return}a.resolve(e)}})}function h(a){try{if(a===this)throw new TypeError;if(a&&("object"===typeof a||"function"===typeof a)){var c=a.then;if("function"===typeof c){g(c.bind(a),
-h.bind(this),d.bind(this));return}}this.a=!0;this.c=a;l.call(this)}catch(b){d.call(this,b)}}function d(a){this.a=!1;this.c=a;l.call(this)}function l(){for(var a=0,c=this.b.length;a<c;a++)k.call(this,this.b[a]);this.b=null}function g(a,c,b){var e=!1;try{a(function(a){e||(e=!0,c(a))},function(a){e||(e=!0,b(a))})}catch(d){e||(e=!0,b(d))}}b.prototype["catch"]=function(a){return this.then(null,a)};b.prototype.then=function(a,c){var f=this;return new b(function(b,d){k.call(f,{d:a,e:c,resolve:b,reject:d})})};
-b.resolve=function(a){return a&&"object"===typeof a&&a.constructor===b?a:new b(function(b){b(a)})};b.reject=function(a){return new b(function(b,d){d(a)})};return b}"undefined"!==typeof module&&(module.f=m);
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/README.md b/systrace/catapult/third_party/polymer/components/promise-polyfill/README.md
deleted file mode 100644
index 4dc7fd5..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-
-<!---
-
-This README is automatically generated from the comments in these files:
-
-
-Edit those files, and our readme bot will duplicate them over here!
-Edit this file, and the bot will squash your changes :)
-
-The bot does some handling of markdown. Please file a bug if it does the wrong
-thing! https://github.com/PolymerLabs/tedium/issues
-
--->
-
-[![Build status](https://travis-ci.org/PolymerLabs/promise-polyfill.svg?branch=master)](https://travis-ci.org/PolymerLabs/promise-polyfill)
-
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/bower.json b/systrace/catapult/third_party/polymer/components/promise-polyfill/bower.json
deleted file mode 100644
index 59163de..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/bower.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "promise-polyfill",
-  "version": "1.0.1",
-  "homepage": "https://github.com/taylorhakes/promise-polyfill",
-  "authors": [
-    "Taylor Hakes"
-  ],
-  "description": "Lightweight promise polyfill for the browser and node. A+ Compliant.",
-  "main": "Promise.js",
-  "moduleType": [
-    "globals",
-    "node"
-  ],
-  "keywords": [
-    "promise",
-    "es6",
-    "polyfill",
-    "html5"
-  ],
-  "license": "MIT",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test",
-    "tests"
-  ],
-  "dependencies": {
-    "polymer": "polymer/polymer#^1.0.0"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/package.json b/systrace/catapult/third_party/polymer/components/promise-polyfill/package.json
deleted file mode 100644
index d6d16dc..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "promise-polyfill",
-  "version": "2.0.1",
-  "description": "Lightweight promise polyfill. A+ compliant",
-  "main": "Promise.js",
-  "scripts": {
-    "test": "./node_modules/.bin/promises-aplus-tests tests/adapter.js; ./node_modules/.bin/promises-es6-tests tests/adapter.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://taylorhakes@github.com/taylorhakes/promise-polyfill.git"
-  },
-  "author": "Taylor Hakes",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/taylorhakes/promise-polyfill/issues"
-  },
-  "homepage": "https://github.com/taylorhakes/promise-polyfill",
-  "devDependencies": {
-    "grunt": "^0.4.5",
-    "grunt-bytesize": "^0.1.1",
-    "grunt-closurecompiler": "^0.9.9",
-    "grunt-contrib-uglify": "^0.4.0",
-    "mocha": "^2.2.1",
-    "promises-aplus-tests": "*",
-    "promises-es6-tests": "^0.5.0"
-  },
-  "keywords": [
-    "promise",
-    "promise-polyfill",
-    "ES6",
-    "promises-aplus"
-  ],
-  "dependencies": {}
-}
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/promise-polyfill-lite.html b/systrace/catapult/third_party/polymer/components/promise-polyfill/promise-polyfill-lite.html
deleted file mode 100644
index fe14c0b..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/promise-polyfill-lite.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="../polymer/polymer.html">
-<script src='./Promise.js'></script>
-<script>
-if (!window.Promise) {
-  window.Promise = MakePromise(Polymer.Base.async);
-}
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/promise-polyfill/promise-polyfill.html b/systrace/catapult/third_party/polymer/components/promise-polyfill/promise-polyfill.html
deleted file mode 100644
index 7cd341f..0000000
--- a/systrace/catapult/third_party/polymer/components/promise-polyfill/promise-polyfill.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!--
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<link rel="import" href="./promise-polyfill-lite.html">
-<script src='./Promise-Statics.js'></script>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/LICENSE.md b/systrace/catapult/third_party/polymer/components/shadycss/LICENSE.md
deleted file mode 100644
index bb3f440..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/LICENSE.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# License
-
-Everything in this repo is BSD style license unless otherwise specified.
-
-Copyright (c) 2015 The Polymer Authors. 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 Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/README.md b/systrace/catapult/third_party/polymer/components/shadycss/README.md
deleted file mode 100644
index e26cc2b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/README.md
+++ /dev/null
@@ -1,428 +0,0 @@
-# ShadyCSS
-
-ShadyCSS provides a library to simulate ShadowDOM style encapsulation (ScopingShim), a shim for the proposed CSS mixin `@apply` syntax (ApplyShim), and a library to integrate document-level stylesheets with both of the former libraries (CustomStyleInterface).
-
-## Requirements
-ShadyCSS requires support for the `<template>` element, ShadowDOM, MutationObserver, Promise, and Object.assign
-
-## Loading
-
-ShadyCSS can be used by loading the ScopingShim, ApplyShim, CustomStyleInterface, or any combination of those.
-
-The most-supported loading order is:
-1. ScopingShim
-1. ApplyShim
-1. CustomStyleInterface
-
-All libraries will expose an object on `window` named `ShadyCSS` with the following interface:
-
-```js
-ShadyCSS = {
-  prepareTemplate(templateElement, elementName, elementExtension){},
-  styleElement(element){},
-  styleSubtree(element, overrideProperties){},
-  styleDocument(overrideProperties){},
-  getComputedStyleValue(element, propertyName){
-    return // style value for property name on element
-  },
-  nativeCss: Boolean,
-  nativeShadow: Boolean
-}
-```
-
-## About ScopingShim
-
-ScopingShim provides simulated ShadyDOM style encapsulation, and a shim for CSS Custom Properties.
-
-ScopingShim works by rewriting style contents and transforming selectors to enforce scoping.
-Additionally, if CSS Custom Properties is not detected, ScopingShim will replace CSS Custom Property usage with realized values.
-
-### Example:
-Here's an example of a custom element when Scoping Shim is not needed.
-
-```html
-<my-element>
-  <!-- shadow-root -->
-  <style>
-  :host {
-    display: block;
-  }
-  #container slot::slotted(*) {
-    color: gray;
-  }
-  #foo {
-    color: black;
-  }
-  </style>
-  <div id="foo">Shadow</div>
-  <div id="container">
-    <slot>
-      <!-- span distributed here -->
-    </slot>
-  </div>
-  <!-- /shadow-root -->
-  <span>Light</span>
-</my-element>
-```
-
-becomes:
-
-```html
-<style scope="my-element">
-my-element {
-  display: block;
-}
-#container.my-element > * {
-  color: gray;
-}
-#foo.my-element {
-  color: black;
-}
-</style>
-<my-element>
-<div id="foo">Shadow</div>
-<div id="container">
-  <span>Light</span>
-</div>
-</my-element>
-```
-
-## About ApplyShim
-
-ApplyShim provides a shim for the `@apply` syntax proposed at https://tabatkins.github.io/specs/css-apply-rule/, which expands the definition CSS Custom Properties to include objects that can be applied as a block.
-
-This is done by transforming the block definition into a set of CSS Custom Properties, and replacing uses of `@apply` with consumption of those custom properties.
-
-### Status:
-
-The `@apply` proposal has been abandoned in favor of the ::part/::theme [Shadow Parts spec](https://tabatkins.github.io/specs/css-shadow-parts/). Therefore, the ApplyShim library is deprecated and provided only for backwards compatibility. Support going forward will be limited to critical bug fixes.
-
-### Known Issues:
-
-* Mixin properties cannot be modified at runtime.
-* Nested mixins are not supported.
-* Shorthand properties are not expanded and may conflict with more explicit properties. Whenever shorthand notations are used in conjunction with their expanded forms in `@apply`, depending in the order of usage of the mixins, properties can be overridden. This means that using both `background-color: green;` and `background: red;` in two separate CSS selectors
- can result in `background-color: transparent` in the selector that `background: red;` is specified.
- 
-   ```css
-   #nonexistent {
-     --my-mixin: {
-       background: red;
-     }
-   }
-   ```
-   with an element style definition of
-   ```css
-   :host {
-     display: block;
-     background-color: green;
-     @apply(--my-mixin);
-   }
-   ```
-   results in the background being `transparent`, as an empty `background` definition replaces
-   the `@apply` definition. 
- 
-   For this reason, we recommend avoiding shorthand properties.
-
-### Example:
-
-Here we define a block called `--mixin` at the document level, and apply that block to `my-element` somewhere in the page.
-
-```css
-html {
-  --mixin: {
-    border: 2px solid black;
-    background-color: green;
-  }
-}
-
-my-element {
-  border: 1px dotted orange;
-  @apply --mixin;
-}
-```
-
-becomes:
-
-```css
-html {
-  --mixin_-_border: 2px solid black;
-  --mixin_-_background-color: green;
-}
-
-my-element {
-  border: var(--mixin_-_border, 1px dotted orange);
-  background-color: var(--mixin_-_background-color);
-}
-```
-
-## About CustomStyleInterface
-
-CustomStyleInterface provides API to process `<style>` elements that are not inside of
-ShadowRoots, and simulate upper-boundary style scoping for ShadyDOM.
-
-To add document-level styles to ShadyCSS, one can call `CustomStyleInterface.addCustomStyle(styleElement)` or `CustomStyleInterface.addCustomStyle({getStyle: () => styleElement})`
-
-An example usage of the document-level styling api can be found in `examples/document-style-lib.js`, and another example that uses a custom element wrapper can be found in `examples/custom-style-element.js`
-
-### Example:
-
-```html
-<style class="document-style">
-html {
-  --content-color: brown;
-}
-</style>
-<my-element>This text will be brown!</my-element>
-<script>
-CustomStyleInterface.addCustomStyle(document.querySelector('style.document-style'));
-</script>
-```
-
-Another example with a wrapper `<custom-style>` element
-
-```html
-<custom-style>
-  <style>
-  html {
-    --content-color: brown;
-  }
-  </style>
-</custom-style>
-<script>
-class CustomStyle extends HTMLElement {
-  constructor() {
-    CustomStyleInterface.addCustomStyle(this);
-  }
-  getStyle() {
-    return this.querySelector('style');
-  }
-}
-</script>
-<my-element>This this text will be brown!</my-element>
-```
-
-Another example with a function that produces style elements
-
-```html
-<my-element>This this text will be brown!</my-element>
-<script>
-CustomStyleInterface.addCustomStyle({
-  getStyle() {
-    const s = document.createElement('style');
-    s.textContent = 'html{ --content-color: brown }';
-    return s;
-  }
-});
-</script>
-```
-
-## Usage
-
-To use ShadyCSS:
-
-1. First, call `ShadyCSS.prepareTemplate(template, name)` on a
-`<template>` element that will be imported into a `shadowRoot`.
-
-2. When the element instance is connected, call `ShadyCSS.styleElement(element)`
-
-3. Create and stamp the element's shadowRoot
-
-4. Whenever dynamic updates are required, call `ShadyCSS.styleSubtree(element)`.
-
-5. If a styling change is made that may affect the whole document, call
-`ShadyCSS.styleDocument()`.
-
-The following example uses ShadyCSS and ShadyDOM to define a custom element.
-
-```html
-<template id="myElementTemplate">
-  <style>
-    :host {
-      display: block;
-      padding: 8px;
-    }
-
-    #content {
-      background-color: var(--content-color);
-    }
-
-    .slot-container ::slotted(*) {
-      border: 1px solid steelblue;
-      margin: 4px;
-    }
-  </style>
-  <div id="content">Content</div>
-  <div class="slot-container">
-    <slot></slot>
-  </div>
-</template>
-<script>
-  // Use polyfill only in browsers that lack native Shadow DOM.
-  window.ShadyCSS && ShadyCSS.prepareTemplate(myElementTemplate, 'my-element');
-
-  class MyElement extends HTMLElement {
-    connectedCallback() {
-      window.ShadyCSS && ShadyCSS.styleElement(this);
-      if (!this.shadowRoot) {
-        this.attachShadow({mode: 'open'});
-        this.shadowRoot.appendChild(
-          document.importNode(myElementTemplate.content, true));
-      }
-    }
-  }
-
-  customElements.define('my-element', MyElement);
-</script>
-```
-
-## Type Extension elements
-
-ShadyCSS can also be used with type extension elements by supplying the base
-element name to `prepareTemplate` as a third argument.
-
-### Example
-
-```html
-<template id="myElementTemplate">
-  <style>
-    :host {
-      display: block;
-      padding: 8px;
-    }
-
-    #content {
-      background-color: var(--content-color);
-    }
-
-    .slot-container ::slotted(*) {
-      border: 1px solid steelblue;
-      margin: 4px;
-    }
-  </style>
-  <div id="content">Content</div>
-  <div class="slot-container">
-    <slot></slot>
-  </div>
-</template>
-<script>
-  window.ShadyCSS && ShadyCSS.prepareTemplate(myElementTemplate, 'my-element', 'div');
-
-  class MyElement extends HTMLDivElement {
-    connectedCallback() {
-      window.ShadyCSS && ShadyCSS.styleElement(this);
-      if (!this.shadowRoot) {
-        this.attachShadow({mode: 'open'});
-        this.shadowRoot.appendChild(
-          document.importNode(myElementTemplate.content, true));
-      }
-    }
-  }
-
-  customElements.define('my-element', MyElement, {extends: 'div'});
-</script>
-```
-
-## Imperative values for Custom properties
-
-To set the value of a CSS Custom Property imperatively, `ShadyCSS.styleSubtree`
-and `ShadyCSS.styleDocument` support an additional argument of an object mapping
-variable name to value.
-
-When using ApplyShim, defining new mixins or new values for current mixins imperatively is not
-supported.
-
-### Example
-```html
-<my-element id="a">Text</my-element>
-<my-element>Text</my-element>
-<script>
-let el = document.querySelector('my-element#a');
-// Set the color of all my-element instances to 'green'
-ShadyCSS.styleDocument({'--content-color' : 'green'});
-// Set the color my-element#a's text to 'red'
-ShadyCSS.styleSubtree(el, {'--content-color' : 'red'});
-</script>
-```
-
-## Limitations
-
-### Selector scoping
-
-To use the `::slotted` pseudo-element, you must select it as a descendant of some context element.
-```css
-/* Bad */
-::slotted() {}
-
-/* Good */
-.context ::slotted() {}
-```
-
-Since ShadyCSS removes all `<slot>` elements, you cannot select them directly or use any other selectors along with the `::slotted` pseudo-element selector.
-```html
-<!-- Bad -->
-<style>
-  .foo .bar::slotted(*) {}
-</style>
-<span class="foo">
-  <slot class="bar"></slot>
-</span>
-``` 
-
-```html
-<!-- Good -->
-<style>
-  .foo ::slotted(*) {}
-</style>
-<span class="foo">
-  <slot></slot>
-</span>
-``` 
-
-### Custom properties and `@apply`
-
-Dynamic changes are not automatically applied. If elements change such that they
-conditionally match selectors they did not previously, `ShadyCSS.styleDocument()`
-must be called.
-
-For a given element's shadowRoot, only 1 value is allowed per custom properties.
-Properties cannot change from parent to child as they can under native custom
-properties; they can only change when a shadowRoot boundary is crossed.
-
-To receive a custom property, an element must directly match a selector that
-defines the property in its host's stylesheet.
-
-### `<custom-style>` Flash of unstyled content
-
-If `ShadyCSS.applyStyle` is never called, `<custom-style>` elements will process
-after HTML Imports have loaded, after the document loads, or after the next paint.
-This means that there may be a flash of unstyled content on the first load.
-
-### Mixins do not cascade throught `<slot>`
-
-Crawling the DOM and updating styles is very expensive, and we found that trying to
-update mixins through `<slot>` insertion points to be too expensive to justify for both
-polyfilled CSS Mixins and polyfilled CSS Custom Properties.
-
-### External stylesheets not currently supported
-
-External stylesheets loaded via `<link rel="stylesheet">` within a shadow root or
-`@import` syntax inside a shadow root's stylesheet are not currently shimmed by
-the polyfill.  This is mainly due to the fact that shimming them would require
-a fetch of the stylesheet text that is async cannot be easily coordinated with
-the upgrade timing of custom elements using them, making it impossible to avoid
-"flash of unstyled content" when running on polyfill.
-
-### Document level styling is not scoped by default
-
-ShadyCSS mimics the behavior of shadow dom, but it is not able to prevent document
-level styling to affect elements inside a shady dom. Global styles defined in
-`index.html` or any styles not processed by ShadyCSS will affect all elements on the page.
-
-To scope document level styling, the style must be wrapped in the `<custom-style>` element
-found in Polymer, or use the `CustomStyleInterface` library to modify document level styles.
-
-### Dynamically created styles are not supported
-
-ShadyCSS works by processing a template for a given custom element class. Only the style
-elements present in that template will be scoped for the custom element's ShadowRoot.
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.html b/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.html
deleted file mode 100644
index d344ec3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script src="apply-shim.min.js"></script>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.min.js b/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.min.js
deleted file mode 100644
index 273f201..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.min.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function(){/*
-
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-'use strict';var l=!(window.ShadyDOM&&window.ShadyDOM.inUse),p;function r(a){p=a&&a.shimcssproperties?!1:l||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}var t;window.ShadyCSS&&void 0!==window.ShadyCSS.cssBuild&&(t=window.ShadyCSS.cssBuild);window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?p=window.ShadyCSS.nativeCss:window.ShadyCSS?(r(window.ShadyCSS),window.ShadyCSS=void 0):r(window.WebComponents&&window.WebComponents.flags);
-var u=p,v=t;function w(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
-function x(a){a=a.replace(aa,"").replace(ba,"");var b=y,c=a,e=new w;e.start=0;e.end=c.length;for(var d=e,f=0,g=c.length;f<g;f++)if("{"===c[f]){d.rules||(d.rules=[]);var h=d,k=h.rules[h.rules.length-1]||null;d=new w;d.start=f+1;d.parent=h;d.previous=k;h.rules.push(d)}else"}"===c[f]&&(d.end=f+1,d=d.parent||e);return b(e,a)}
-function y(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=ca(c),c=c.replace(z," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=A:c.match(da)&&(a.type=B,a.keyframesName=a.selector.split(z).pop()):a.type=0===c.indexOf("--")?C:D);if(c=a.rules)for(var e=0,d=c.length,f=void 0;e<d&&(f=c[e]);e++)y(f,b);
-return a}function ca(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
-function E(a,b,c){c=void 0===c?"":c;var e="";if(a.cssText||a.rules){var d=a.rules,f;if(f=d)f=d[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var g=d.length,h=void 0;f<g&&(h=d[f]);f++)e=E(h,b,e)}else b?b=a.cssText:(b=a.cssText,b=b.replace(ea,"").replace(fa,""),b=b.replace(ha,"").replace(ia,"")),(e=b.trim())&&(e="  "+e+"\n")}e&&(a.selector&&(c+=a.selector+" {\n"),c+=e,a.selector&&(c+="}\n\n"));return c}
-var D=1,B=7,A=4,C=1E3,aa=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,ba=/@import[^;]*;/gim,ea=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,fa=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,ha=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,ia=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,da=/^@[^\s]*keyframes/,z=/\s+/g;var G=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,H=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,ja=/@media\s(.*)/;var I=new Set;function J(a){if(!a)return"";"string"===typeof a&&(a=x(a));return E(a,u)}function K(a){!a.__cssRules&&a.textContent&&(a.__cssRules=x(a.textContent));return a.__cssRules||null}function L(a,b,c,e){if(a){var d=!1,f=a.type;if(e&&f===A){var g=a.selector.match(ja);g&&(window.matchMedia(g[1]).matches||(d=!0))}f===D?b(a):c&&f===B?c(a):f===C&&(d=!0);if((a=a.rules)&&!d)for(d=0,f=a.length,g=void 0;d<f&&(g=a[d]);d++)L(g,b,c,e)}}
-function M(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var e=0;var d=c+3;for(var f=a.length;d<f;d++)if("("===a[d])e++;else if(")"===a[d]&&0===--e)break a;d=-1}e=a.substring(c+4,d);c=a.substring(0,c);a=M(a.substring(d+1),b);d=e.indexOf(",");return-1===d?b(c,e.trim(),"",a):b(c,e.substring(0,d).trim(),e.substring(d+1).trim(),a)}
-function N(a){if(void 0!==v)return v;if(void 0===a.__cssBuild){var b=a.getAttribute("css-build");if(b)a.__cssBuild=b;else{a:{b="template"===a.localName?a.content.firstChild:a.firstChild;if(b instanceof Comment&&(b=b.textContent.trim().split(":"),"css-build"===b[0])){b=b[1];break a}b=""}if(""!==b){var c="template"===a.localName?a.content.firstChild:a.firstChild;c.parentNode.removeChild(c)}a.__cssBuild=b}}return a.__cssBuild||""};var ka=/;\s*/m,la=/^\s*(initial)|(inherit)\s*$/,O=/\s*!important/;function P(){this.a={}}P.prototype.set=function(a,b){a=a.trim();this.a[a]={h:b,i:{}}};P.prototype.get=function(a){a=a.trim();return this.a[a]||null};var Q=null;function R(){this.b=this.c=null;this.a=new P}R.prototype.o=function(a){a=H.test(a)||G.test(a);H.lastIndex=0;G.lastIndex=0;return a};
-R.prototype.m=function(a,b){if(void 0===a._gatheredStyle){var c=[];for(var e=a.content.querySelectorAll("style"),d=0;d<e.length;d++){var f=e[d];if(f.hasAttribute("shady-unscoped")){if(!l){var g=f.textContent;I.has(g)||(I.add(g),g=f.cloneNode(!0),document.head.appendChild(g));f.parentNode.removeChild(f)}}else c.push(f.textContent),f.parentNode.removeChild(f)}(c=c.join("").trim())?(e=document.createElement("style"),e.textContent=c,a.content.insertBefore(e,a.content.firstChild),c=e):c=null;a._gatheredStyle=
-c}return(a=a._gatheredStyle)?this.j(a,b):null};R.prototype.j=function(a,b){b=void 0===b?"":b;var c=K(a);this.l(c,b);a.textContent=J(c);return c};R.prototype.f=function(a){var b=this,c=K(a);L(c,function(a){":root"===a.selector&&(a.selector="html");b.g(a)});a.textContent=J(c);return c};R.prototype.l=function(a,b){var c=this;this.c=b;L(a,function(a){c.g(a)});this.c=null};R.prototype.g=function(a){a.cssText=ma(this,a.parsedCssText,a);":root"===a.selector&&(a.selector=":host > *")};
-function ma(a,b,c){b=b.replace(G,function(b,d,f,g){return na(a,b,d,f,g,c)});return S(a,b,c)}function oa(a,b){for(var c=b;c.parent;)c=c.parent;var e={},d=!1;L(c,function(c){(d=d||c===b)||c.selector===b.selector&&Object.assign(e,T(a,c.parsedCssText))});return e}
-function S(a,b,c){for(var e;e=H.exec(b);){var d=e[0],f=e[1];e=e.index;var g=b.slice(0,e+d.indexOf("@apply"));b=b.slice(e+d.length);var h=c?oa(a,c):{};Object.assign(h,T(a,g));d=void 0;var k=a;f=f.replace(ka,"");var n=[];var m=k.a.get(f);m||(k.a.set(f,{}),m=k.a.get(f));if(m){k.c&&(m.i[k.c]=!0);var q=m.h;for(d in q)k=h&&h[d],m=[d,": var(",f,"_-_",d],k&&m.push(",",k.replace(O,"")),m.push(")"),O.test(q[d])&&m.push(" !important"),n.push(m.join(""))}d=n.join("; ");b=g+d+b;H.lastIndex=e+d.length}return b}
-function T(a,b,c){c=void 0===c?!1:c;b=b.split(";");for(var e,d,f={},g=0,h;g<b.length;g++)if(e=b[g])if(h=e.split(":"),1<h.length){e=h[0].trim();d=h.slice(1).join(":");if(c){var k=a;h=e;var n=la.exec(d);n&&(n[1]?(k.b||(k.b=document.createElement("meta"),k.b.setAttribute("apply-shim-measure",""),k.b.style.all="initial",document.head.appendChild(k.b)),h=window.getComputedStyle(k.b).getPropertyValue(h)):h="apply-shim-inherit",d=h)}f[e]=d}return f}function pa(a,b){if(Q)for(var c in b.i)c!==a.c&&Q(c)}
-function na(a,b,c,e,d,f){e&&M(e,function(b,c){c&&a.a.get(c)&&(d="@apply "+c+";")});if(!d)return b;var g=S(a,""+d,f);f=b.slice(0,b.indexOf("--"));var h=g=T(a,g,!0),k=a.a.get(c),n=k&&k.h;n?h=Object.assign(Object.create(n),g):a.a.set(c,h);var m=[],q,Z=!1;for(q in h){var F=g[q];void 0===F&&(F="initial");!n||q in n||(Z=!0);m.push(c+"_-_"+q+": "+F)}Z&&pa(a,k);k&&(k.h=h);e&&(f=b+";"+f);return f+m.join("; ")+";"}R.prototype.detectMixin=R.prototype.o;R.prototype.transformStyle=R.prototype.j;
-R.prototype.transformCustomStyle=R.prototype.f;R.prototype.transformRules=R.prototype.l;R.prototype.transformRule=R.prototype.g;R.prototype.transformTemplate=R.prototype.m;R.prototype._separator="_-_";Object.defineProperty(R.prototype,"invalidCallback",{get:function(){return Q},set:function(a){Q=a}});var U={};var qa=Promise.resolve();function ra(a){if(a=U[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function sa(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function ta(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a._validating||(a._validating=!0,qa.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a._validating=!1}))};var V=new R;function W(){this.a=null;V.invalidCallback=ra}function X(a){!a.a&&window.ShadyCSS.CustomStyleInterface&&(a.a=window.ShadyCSS.CustomStyleInterface,a.a.transformCallback=function(a){V.f(a)},a.a.validateCallback=function(){requestAnimationFrame(function(){a.a.enqueued&&a.flushCustomStyles()})})}W.prototype.prepareTemplate=function(a,b){X(this);""===N(a)&&(U[b]=a,b=V.m(a,b),a._styleAst=b)};
-W.prototype.flushCustomStyles=function(){X(this);if(this.a){var a=this.a.processStyles();if(this.a.enqueued){for(var b=0;b<a.length;b++){var c=this.a.getStyleForCustomStyle(a[b]);c&&V.f(c)}this.a.enqueued=!1}}};
-W.prototype.styleSubtree=function(a,b){X(this);if(b)for(var c in b)null===c?a.style.removeProperty(c):a.style.setProperty(c,b[c]);if(a.shadowRoot)for(this.styleElement(a),a=a.shadowRoot.children||a.shadowRoot.childNodes,b=0;b<a.length;b++)this.styleSubtree(a[b]);else for(a=a.children||a.childNodes,b=0;b<a.length;b++)this.styleSubtree(a[b])};
-W.prototype.styleElement=function(a){X(this);var b=a.localName,c;b?-1<b.indexOf("-")?c=b:c=a.getAttribute&&a.getAttribute("is")||"":c=a.is;b=U[c];if(!(b&&""!==N(b)||!b||sa(b))){if(sa(b)||b._applyShimValidatingVersion!==b._applyShimNextVersion)this.prepareTemplate(b,c),ta(b);if(a=a.shadowRoot)if(a=a.querySelector("style"))a.__cssRules=b._styleAst,a.textContent=J(b._styleAst)}};W.prototype.styleDocument=function(a){X(this);this.styleSubtree(document.body,a)};
-if(!window.ShadyCSS||!window.ShadyCSS.ScopingShim){var Y=new W,ua=window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface;window.ShadyCSS={prepareTemplate:function(a,b){Y.flushCustomStyles();Y.prepareTemplate(a,b)},prepareTemplateStyles:function(a,b,c){window.ShadyCSS.prepareTemplate(a,b,c)},prepareTemplateDom:function(){},styleSubtree:function(a,b){Y.flushCustomStyles();Y.styleSubtree(a,b)},styleElement:function(a){Y.flushCustomStyles();Y.styleElement(a)},styleDocument:function(a){Y.flushCustomStyles();
-Y.styleDocument(a)},getComputedStyleValue:function(a,b){return(a=window.getComputedStyle(a).getPropertyValue(b))?a.trim():""},flushCustomStyles:function(){Y.flushCustomStyles()},nativeCss:u,nativeShadow:l,cssBuild:v};ua&&(window.ShadyCSS.CustomStyleInterface=ua)}window.ShadyCSS.ApplyShim=V;}).call(this);
-
-//# sourceMappingURL=apply-shim.min.js.map
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.min.js.map b/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.min.js.map
deleted file mode 100644
index f41ad4f..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/apply-shim.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["src/style-settings.js","src/css-parse.js","src/common-regex.js","src/unscoped-style-handler.js","src/style-util.js","src/apply-shim.js","src/common-utils.js","src/template-map.js","src/apply-shim-utils.js","entrypoints/apply-shim.js"],"names":["nativeShadow","window","nativeCssVariables_","calcCssVariables","settings","navigator","userAgent","match","CSS","supports","cssBuild","ShadyCSS","undefined","nativeCss","nativeCssVariables","module$src$style_settings.cssBuild","constructor","StyleNode","parse","text","replace","RX$$module$src$css_parse.comments","RX$$module$src$css_parse.port","parseCss","root","length","n","i","l","OPEN_BRACE","p","previous","push","CLOSE_BRACE","node","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$src$css_parse.multipleSpaces","lastIndexOf","s","indexOf","AT_START","MEDIA_START","types$$module$src$css_parse.MEDIA_RULE","RX$$module$src$css_parse.keyframesRule","types$$module$src$css_parse.KEYFRAMES_RULE","split","pop","VAR_START","types$$module$src$css_parse.MIXIN_RULE","types$$module$src$css_parse.STYLE_RULE","r$","r","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$src$css_parse.customProp","RX$$module$src$css_parse.mixinProp","RX$$module$src$css_parse.mixinApply","RX$$module$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","VAR_ASSIGN","MIXIN_MATCH","MEDIA_MATCH","styleTextSet","Set","toCssText","rulesForStyle","style","textContent","forEachRule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","type","matchMedia","matches","processVariableAndFallback","str","callback","start","level","inner","end","prefix","suffix","comma","value","fallback","getCssBuild","element","__cssBuild","attrValue","getAttribute","CSS_BUILD_ATTR","buildComment","localName","content","firstChild","Comment","commentParts","parentNode","removeChild","APPLY_NAME_CLEAN","INITIAL_INHERIT","IMPORTANT","MixinMap","_map","set","name","props","properties","dependants","get","invalidCallback","ApplyShim","_measureElement","_currentElement","detectMixin","has","test","lastIndex","transformTemplate","template","elementName","_gatheredStyle","styleTextParts","styles","querySelectorAll","hasAttribute","scopingAttribute","add","newStyle","cloneNode","document","head","appendChild","gatherStyles","join","createElement","insertBefore","transformStyle","ast","transformRules","transformCustomStyle","rule","transformRule","transformCssText","matchText","propertyName","valueProperty","valueMixin","_produceCssProperties","_consumeCssProperties","_fallbacksFromPreviousRules","startRule","topRule","fallbacks","seenStartRule","Object","assign","_cssTextToMap","m","exec","mixinName","idx","index","textBeforeApply","slice","textAfterApply","defaults","_atApplyToCssProperties","vars","mixinEntry","f","parts","MIXIN_VAR_SEP","replacement","replaceInitialOrInherit","property","out","sp","_replaceInitialOrInherit","_getInitialValueForProperty","setAttribute","all","getComputedStyle","getPropertyValue","_invalidateMixinEntry","mixinAsProperties","combinedProps","mixinValues","oldProps","create","needToInvalidate","v","prototype","defineProperty","cb","templateMap","promise","Promise","resolve","invalidate","templateIsValid","startValidatingTemplate","_validating","then","applyShim","ApplyShimInterface","customStyleInterface","ensure","CustomStyleInterface","requestAnimationFrame","flushCustomStyles","prepareTemplate","styleSubtree","removeProperty","setProperty","shadowRoot","styleElement","shadowChildren","children","childNodes","is","querySelector","styleDocument","body","ScopingShim","applyShimInterface","prepareTemplateStyles","elementExtends","prepareTemplateDom","getComputedStyleValue"],"mappings":"A;;;;;;;;;aAYO,IAAMA,EAAe,EAAEC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHC,CAKJC,SAASA,EAAgB,CAACC,CAAD,CAAW,CAEhCF,CAAA,CADEE,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwBJ,CATxB,EASwC,EAASK,SAAAC,UAAAC,MAAA,CAA0B,2BAA1B,CAAT,EACpCC,CAAAP,MAAAO,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAgB7B,IAAIC,CACPT,OAAAU,SAAJ,EAAoDC,IAAAA,EAApD,GAAuBX,MAAAU,SAAAD,SAAvB,GACEA,CADF,CACaT,MAAAU,SAAAD,SADb,CAIIT,OAAAU,SAAJ,EAAqDC,IAAAA,EAArD,GAAuBX,MAAAU,SAAAE,UAAvB,CACEX,CADF,CACwBD,MAAAU,SAAAE,UADxB,CAEWZ,MAAAU,SAAJ,EACLR,CAAA,CAAiBF,MAAAU,SAAjB,CAEA,CAAAV,MAAAU,SAAA,CAAkBC,IAAAA,EAHb,EAKLT,CAAA,CAAiBF,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK;IAAMa,EAA4CZ,CAAlD,CAlBIa,EAAAL,C,CCfTM,QADIC,EACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,EAAK,CAACC,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNC,QAAA,CAAgBC,EAAhB,CAA6B,EAA7B,CAAAD,QAAA,CAAyCE,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,CAAAA,CAAaJ,EAAAA,CAAbI,CAkBHC,EAAO,IAAIP,CACfO,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAcL,CAAAM,OAEd,KADA,IAAIC,EAAIF,CAAR,CACSG,EAAI,CADb,CACgBC,EAAIT,CAAAM,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAuKeE,GAvKf,GAAIV,CAAA,CAAKQ,CAAL,CAAJ,CAA4B,CACrBD,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAII,EAAIJ,CAAR,CACIK,EAAWD,CAAA,MAAA,CAAWA,CAAA,MAAAL,OAAX,CAA+B,CAA/B,CAAXM,EAAgD,IACpDL,EAAA,CAAI,IAAIT,CACRS,EAAA,MAAA,CAAaC,CAAb,CAAiB,CACjBD,EAAA,OAAA,CAAcI,CACdJ,EAAA,SAAA,CAAgBK,CAChBD,EAAA,MAAAE,KAAA,CAAgBN,CAAhB,CAV0B,CAA5B,IAwKgBO,GA7JT,GAAId,CAAA,CAAKQ,CAAL,CAAJ,GACLD,CAAA,IACA,CADWC,CACX,CADe,CACf,CAAAD,CAAA,CAAIA,CAAA,OAAJ,EAAmBF,CAFd,CAlCT,OAAOD,EAAA,CAuCAC,CAvCA,CAAoBL,CAApB,CAFmB;AAkD5BI,QAASA,EAAQ,CAACW,CAAD,CAAOf,CAAP,CAAa,CAC5B,IAAIgB,EAAIhB,CAAAiB,UAAA,CAAeF,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CC,CAAAE,KAAA,EACtCH,EAAA,OAAJ,GAEEC,CASA,CATIhB,CAAAiB,UAAA,CADKF,CAAA,SAAAI,CAAmBJ,CAAA,SAAA,IAAnBI,CAA6CJ,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAC,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAAf,QAAA,CAAUoB,CAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHIC,CAGJ,CAHQR,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDC,CAAAE,KAAA,EAGpD,CAFAH,CAAA,OAEA,CAF0C,CAE1C,GAFkBQ,CAAAC,QAAA,CAmJLC,GAnJK,CAElB,CAAIV,CAAA,OAAJ,CACiC,CAA/B,GAAIQ,CAAAC,QAAA,CA+IUE,QA/IV,CAAJ,CACEX,CAAA,KADF,CACiBY,CADjB,CAEWJ,CAAAnC,MAAA,CAAQwC,EAAR,CAFX,GAGEb,CAAA,KACA,CADec,CACf,CAAAd,CAAA,cAAA,CACEA,CAAA,SAAAe,MAAA,CAAuBT,CAAvB,CAAAU,IAAA,EALJ,CADF,CAUIhB,CAAA,KAVJ,CAS+B,CAA7B,GAAIQ,CAAAC,QAAA,CAsIQQ,IAtIR,CAAJ,CACiBC,CADjB,CAGiBC,CAvBrB,CA4BA,IADIC,CACJ,CADSpB,CAAA,MACT,CACE,IADM,IACGP,EAAI,CADP,CACUC,EAAI0B,CAAA7B,OADd,CACyB8B,EAAAA,IAAAA,EAA/B,CACG5B,CADH,CACOC,CADP,GACc2B,CADd,CACkBD,CAAA,CAAG3B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEJ,CAAA,CAASgC,CAAT,CAAYpC,CAAZ,CAGJ;MAAOe,EArCqB,CA8C9BK,QAASA,GAAqB,CAACG,CAAD,CAAI,CAChC,MAAOA,EAAAtB,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/CoC,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAA/B,OACf,CAAOgC,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,EAAS,CAACxB,CAAD,CAAOyB,CAAP,CAA2BxC,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAIyC,EAAU,EACd,IAAI1B,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIoB,EAAKpB,CAAA,MAAT,CACI,CAAA,IAAAoB,CAAA,CAAAA,CAAA,CAgCFC,CAhCQ,CAAAM,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCGN,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAZ,QAAA,CAuD/BQ,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpBxB,CAAAA,CAAI,CAAb,KAD6B,IACbC,EAAI0B,CAAA7B,OADS,CACE8B,EAAAA,IAAAA,EAA/B,CACG5B,CADH,CACOC,CADP,GACc2B,CADd,CACkBD,CAAA,CAAG3B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEiC,CAAA,CAAUF,CAAA,CAAUH,CAAV,CAAaI,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BxC,QAAA,CACI0C,EADJ,CACmB,EADnB,CAAA1C,QAAA,CAEI2C,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBxC,QAAA,CACI4C,EADJ,CACmB,EADnB,CAAA5C,QAAA,CAEI6C,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAvB,KAAA,EACV,IACEuB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACM1B,CAAA,SAIJ,GAHEf,CAGF,EAHUe,CAAA,SAGV,CAHgD,MAGhD,EADAf,CACA,EADQyC,CACR,CAAI1B,CAAA,SAAJ,GACEf,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7D+C,IAAAA,EAAYA,CAAZA,CACAC,EAAgBA,CADhBD,CAEAE,EAAYA,CAFZF,CAGAG,EAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,EAAgBA,M,CCxPX,IAAMC,EAAa,yHAAnB,CACMC,EAAc,sCADpB,CAIMC,GAAc,c,CCD3B,IAAMC,EAAe,IAAIC,G,CCSlBC,QAASA,EAAU,CAACtB,CAAD,CAAkB,CAC1C,GAAI,CAACA,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CACU3C,CAAA,CAAM2C,CAAN,CADV,CAMA,OAAOH,EAAA,CAAUG,CAAV,CAAiB/C,CAAjB,CAVmC,CAiBrCsE,QAASA,EAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAAC,YAA5B,GACED,CAAA,WADF,CACwBnE,CAAA,CAAMmE,CAAAC,YAAN,CADxB,CAGA,OAAOD,EAAA,WAAP,EAA8B,IAJK,CAyB9BE,QAASA,EAAW,CAACrD,CAAD,CAAOsD,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAKxD,CAAL,CAAA,CAGA,IAAIyD,EAAY,CAAA,CAAhB,CACIC,EAAO1D,CAAA,KACX,IAAIwD,CAAJ,EACME,CADN,GACe9C,CADf,CACiC,CAC7B,IAAI+C,EAAa3D,CAAA,SAAA3B,MAAA,CAAuByE,EAAvB,CACba,EAAJ,GAEO5F,MAAA4F,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAAC,QAFP,GAGIH,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7BC,CAAJ,GAAavC,CAAb,CACEmC,CAAA,CAAkBtD,CAAlB,CADF,CAEWuD,CAAJ,EACLG,CADK,GACI5C,CADJ,CAELyC,CAAA,CAAsBvD,CAAtB,CAFK,CAGI0D,CAHJ,GAGaxC,CAHb,GAILuC,CAJK,CAIO,CAAA,CAJP,CAOP,KADIrC,CACJ,CADSpB,CAAA,MACT,GAAU,CAACyD,CAAX,CACE,IAAShE,CAAkB4B,CAAhB,CAAgBA,CAAb3B,CAAa2B,CAAXD,CAAA7B,OAAW8B,CAAAA,CAAAA,CAAAA,IAAAA,EAA3B,CAA+B5B,CAA/B,CAAiCC,CAAjC,GAAwC2B,CAAxC,CAA0CD,CAAA,CAAG3B,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACE4D,CAAA,CAAYhC,CAAZ,CAAeiC,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CA3BJ,CAD2F;AAyItFK,QAASA,EAA0B,CAACC,CAAD,CAAMC,CAAN,CAAgB,CAExD,IAAIC,EAAQF,CAAArD,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAIuD,CAAJ,CAEE,MAAOD,EAAA,CAASD,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAvBoC,EAAA,CAAA,CAC7C,IAAIG,EAAQ,CACHxE,KAAAA,EAwBwBuE,CAxBxBvE,CAwBgC,CAxBzC,KAAK,IAAaC,EAwBUoE,CAxBRvE,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAuB0BqE,CAvBtB,CAAKrE,CAAL,CAAJ,CACEwE,CAAA,EADF,KAEO,IAAgB,GAAhB,GAqBmBH,CArBf,CAAKrE,CAAL,CAAJ,EACW,CADX,GACD,EAAEwE,CADD,CAEH,MAAA,CAIN,EAAA,CAAQ,EAXqC,CA2BzCC,CAAAA,CAAQJ,CAAA5D,UAAA,CAAc8D,CAAd,CAAsB,CAAtB,CAAyBG,CAAzB,CACRC,EAAAA,CAASN,CAAA5D,UAAA,CAAc,CAAd,CAAiB8D,CAAjB,CAETK,EAAAA,CAASR,CAAA,CAA2BC,CAAA5D,UAAA,CAAciE,CAAd,CAAoB,CAApB,CAA3B,CAAmDJ,CAAnD,CACTO,EAAAA,CAAQJ,CAAAzD,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAI6D,CAAJ,CAESP,CAAA,CAASK,CAAT,CAAiBF,CAAA/D,KAAA,EAAjB,CAA+B,EAA/B,CAAmCkE,CAAnC,CAFT,CAOON,CAAA,CAASK,CAAT,CAFKF,CAAAhE,UAAA,CAAgB,CAAhB,CAAmBoE,CAAnB,CAAAnE,KAAAoE,EAEL,CADQL,CAAAhE,UAAA,CAAgBoE,CAAhB,CAAwB,CAAxB,CAAAnE,KAAAqE,EACR,CAAkCH,CAAlC,CAtBiD;AA+HnDI,QAASA,EAAW,CAACC,CAAD,CAAU,CACnC,GAAiBhG,IAAAA,EAAjB,GAAIG,CAAJ,CACE,MAA6BA,EAE/B,IAA2BH,IAAAA,EAA3B,GAAIgG,CAAAC,WAAJ,CAAsC,CAEpC,IAAMC,EAAYF,CAAAG,aAAA,CAdCC,WAcD,CAClB,IAAIF,CAAJ,CACEF,CAAAC,WAAA,CAAqBC,CADvB,KAEO,CAsC8B,CAAA,CAAA,CACjCG,CAAAA,CAAqC,UAAtB,GAtCoBL,CAsCpBM,UAAA,CAtCoBN,CAuCDO,QAAAC,WADnB,CAtCoBR,CAwCrCQ,WACJ,IAAIH,CAAJ,WAA4BI,QAA5B,GACQC,CACF,CADiBL,CAAA3B,YAAAjD,KAAA,EAAAY,MAAA,CAAsC,GAAtC,CACjB,CA7De+D,WA6Df,GAAAM,CAAA,CAAa,CAAb,CAFN,EAE0C,CACtC,CAAA,CAAOA,CAAA,CAAa,CAAb,CAAP,OAAA,CADsC,CAI1C,CAAA,CAAO,EAVgC,CApCnC,GAAqB,EAArB,GAAIL,CAAJ,CAAA,CAmEJ,IAAMA,EAAqC,UAAtB,GAjEIL,CAiEJM,UAAA,CAjEIN,CAkEeO,QAAAC,WADnB,CAjEIR,CAmErBQ,WACJH,EAAAM,WAAAC,YAAA,CAAoCP,CAApC,CAtEI,CAIAL,CAAAC,WAAA,CAAqBI,CANhB,CAL6B,CActC,MAAOL,EAAAC,WAAP,EAA6B,EAlBM,C,CC1PrC,IAAMY,GAAmB,OAAzB,CACMC,GAAkB,6BADxB,CAEMC,EAAY,eA0BhB3G,SADI4G,EACO,EAAG,CAEZ,IAAAC,EAAA,CAAY,EAFA,CAQdC,CAAAA,UAAAA,IAAAA,CAAAA,QAAGA,CAACC,CAADD,CAAOE,CAAPF,CAAcA,CACfC,CAAAD,CAAOC,CAAA1F,KAAAyF,EACPA,KAAAD,EAAAC,CAAUC,CAAVD,CAAAA,CAAkBA,CAChBG,EAAYD,CADIF,CAEhBI,EAAYJ,EAFIA,CAFHA,CAWjBK,EAAAA,UAAAA,IAAAA,CAAAA,QAAGA,CAACJ,CAADI,CAAOA,CACRJ,CAAAI,CAAOJ,CAAA1F,KAAA8F,EACPA,OAAOA,KAAAN,EAAAM,CAAUJ,CAAVI,CAAPA,EAA0BA,IAFlBA,CAUZ,KAAIC,EAAkB,IAIpBpH,SADIqH,EACO,EAAG,CAIZ,IAAAC,EAAA,CAFA,IAAAC,EAEA,CAFuB,IAGvB,KAAAV,EAAA,CAAY,IAAID,CALJ,CAYdY,CAAAA,UAAAA,EAAAA,CAAAA,QAAWA,CAAC5E,CAAD4E,CAAUA,CClGfC,CAAAA,CAAM1D,CAAA2D,KAAA,CDmGS9E,CCnGT,CAAN6E,EAAmC3D,CAAA4D,KAAA,CDmGpB9E,CCnGoB,CAEzCmB,EAAA4D,UAAA,CAAwB,CACxB7D,EAAA6D,UAAA,CAAuB,CDgGrBH,OC/FKC,ED8FcD,CAwBrBI;CAAAA,UAAAA,EAAAA,CAAAA,QAAiBA,CAACC,CAADD,CAAWE,CAAXF,CAAwBA,CACvCA,GAAgChI,IAAAA,EAAhCgI,GAAIC,CAAAE,eAAJH,CAA2CA,CDgGvCI,IAAAA,EAAiB,EAEvB,KADA,IAAMC,EChG0CJ,CAhBZ1B,QDgHuB+B,iBAAA,CAAyB,OAAzB,CAA3D,CACSvH,EAAI,CAAb,CAAgBA,CAAhB,CAAoBsH,CAAAxH,OAApB,CAAmCE,CAAA,EAAnC,CAAwC,CACtC,IAAM0D,EAAQ4D,CAAA,CAAOtH,CAAP,CACd,IAAoB0D,CD9Of8D,aAAA,CAvBuBC,gBAuBvB,CC8OL,CACE,IAAI,CAACpJ,CAAL,CAAmB,CD7PvB,IAAMmB,EC8PqBkE,CD9PdC,YACRL,EAAAwD,IAAA,CAAiBtH,CAAjB,CAAL,GACE8D,CAAAoE,IAAA,CAAiBlI,CAAjB,CAEA,CADMmI,CACN,CC0PyBjE,CD3PRkE,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAAC,QAAAC,KAAAC,YAAA,CAA0BJ,CAA1B,CAHF,CC8PMjE,EAAAkC,WAAAC,YAAA,CAA6BnC,CAA7B,CAFiB,CAAnB,CADF,IAME2D,EAAAhH,KAAA,CAAoBqD,CAAAC,YAApB,CACA,CAAAD,CAAAkC,WAAAC,YAAA,CAA6BnC,CAA7B,CAToC,CChHtCsE,CD4HF,CC5HEA,CD4HKX,CAAAY,KAAA,CAAoB,EAApB,CAAAvH,KAAA,EC5HLsH,GACQtE,CAGNsE,CAH+CH,QAAAK,cAAAF,CAAuBA,OAAvBA,CAG/CA,CAFAtE,CAAAC,YAEAqE,CALgBA,CAKhBA,CAW4Cd,CAZ5C1B,QAAA2C,aAAAH,CAA8BtE,CAA9BsE,CAY4Cd,CAZP1B,QAAAC,WAArCuC,CACAA,CAAAA,CAAAA,CAAOtE,CAJTsE,EAMAA,CANAA,CAMOA,IASLd,EAAAE,eAAAH;AAA0BA,CADeA,CAK3CA,MAAOA,CADDvD,CACCuD,CADOC,CAAAE,eACPH,EAAQA,IAAAmB,EAAAnB,CAAoBvD,CAApBuD,CAA2BE,CAA3BF,CAARA,CAAkDA,IANlBA,CAazCmB,EAAAA,UAAAA,EAAAA,CAAAA,QAAcA,CAAC1E,CAAD0E,CAAQjB,CAARiB,CAA0BA,CAAlBjB,CAAAiB,CAAAA,IAAAA,EAAAA,GAAAjB,CAAAiB,CAAcA,EAAdA,CAAAjB,CACpBiB,KAAIC,EAAM5E,CAAA2E,CAAc1E,CAAd0E,CACVA,KAAAE,EAAAF,CAAoBC,CAApBD,CAAyBjB,CAAzBiB,CACA1E,EAAAC,YAAAyE,CAAoB5E,CAAA4E,CAAUC,CAAVD,CACpBA,OAAOC,EAJ+BD,CAUxCG,EAAAA,UAAAA,EAAAA,CAAAA,QAAoBA,CAAC7E,CAAD6E,CAAQA,CAAAA,IAAAA,EAAAA,IAAAA,CACtBF,EAAM5E,CAAA8E,CAAc7E,CAAd6E,CACV3E,EAAA2E,CAAYF,CAAZE,CAAiBA,QAAAA,CAACC,CAADD,CAAUA,CACAA,OAAzBA,GAAIC,CAAAD,SAAJA,GACEC,CAAAD,SADFA,CACqBA,MADrBA,CAGAA,EAAAE,EAAAF,CAAmBC,CAAnBD,CAJyBA,CAA3BA,CAMA7E,EAAAC,YAAA4E,CAAoB/E,CAAA+E,CAAUF,CAAVE,CACpBA,OAAOF,EATmBE,CAe5BD,EAAAA,UAAAA,EAAAA,CAAAA,QAAcA,CAACpG,CAADoG,CAAQnB,CAARmB,CAAqBA,CAAAA,IAAAA,EAAAA,IACjCA,KAAA1B,EAAA0B,CAAuBnB,CACvBvD,EAAA0E,CAAYpG,CAAZoG,CAAmBA,QAAAA,CAAC1G,CAAD0G,CAAOA,CACxBA,CAAAG,EAAAH,CAAmB1G,CAAnB0G,CADwBA,CAA1BA,CAGAA,KAAA1B,EAAA0B,CAAuBA,IALUA,CAUnCG,EAAAA,UAAAA,EAAAA,CAAAA,QAAaA,CAACD,CAADC,CAAOA,CAClBD,CAAAC,QAAAA,CAAkBC,EAAAD,CAAAA,IAAAA,CAAsBD,CAAAC,cAAtBA,CAA6CD,CAA7CC,CAIOA,QAAzBA,GAAID,CAAAC,SAAJA,GACED,CAAAC,SADFA,CACqBA,WADrBA,CALkBA,CAcpBC;QAAAA,GAAgBA,CAAhBA,CAAgBA,CAACzG,CAADyG,CAAUF,CAAVE,CAAgBA,CAE9BzG,CAAAyG,CAAUzG,CAAAxC,QAAAiJ,CAAgBvF,CAAhBuF,CAA4BA,QAAAA,CAACC,CAADD,CAAYE,CAAZF,CAA0BG,CAA1BH,CAAyCI,CAAzCJ,CACpCA,CAAAA,MAAAK,GAAAL,CAH4BA,CAG5BA,CAA2BC,CAA3BD,CAAsCE,CAAtCF,CAAoDG,CAApDH,CAAmEI,CAAnEJ,CAA+EF,CAA/EE,CAAAA,CADQA,CAGVA,OAAOM,EAAAN,CAAAA,CAAAA,CAA2BzG,CAA3ByG,CAAoCF,CAApCE,CALuBA,CA0BhCO,QAAAA,GAA2BA,CAA3BA,CAA2BA,CAACC,CAADD,CAAYA,CAGrCA,IADAA,IAAIE,EAAUD,CACdD,CAAOE,CAAAF,OAAPA,CAAAA,CACEE,CAAAF,CAAUE,CAAAF,OAEZA,KAAMG,EAAYH,EAAlBA,CACII,EAAgBJ,CAAAA,CACpBrF,EAAAqF,CAAYE,CAAZF,CAAqBA,QAAAA,CAACrH,CAADqH,CAAOA,CAG1BA,CADAI,CACAJ,CADgBI,CAChBJ,EADiCrH,CACjCqH,GADuCC,CACvCD,GAOIrH,CAAAqH,SAPJA,GAOsBC,CAAAD,SAPtBA,EAQEK,MAAAC,OAAAN,CAAcG,CAAdH,CAAyBO,CAAAP,CAnBQA,CAmBRA,CAAmBrH,CAAAqH,cAAnBA,CAAzBA,CAXwBA,CAA5BA,CAcAA,OAAOG,EAtB8BH;AA8BvCD,QAAAA,EAAqBA,CAArBA,CAAqBA,CAACxJ,CAADwJ,CAAOR,CAAPQ,CAAaA,CAIhCA,IAFAA,IAAIS,CAEJT,CAAOS,CAAPT,CAAW5F,CAAAsG,KAAAV,CAAiBxJ,CAAjBwJ,CAAXA,CAAAA,CAAoCA,CAClCA,IAAIL,EAAYc,CAAAT,CAAEA,CAAFA,CAAhBA,CACIW,EAAYF,CAAAT,CAAEA,CAAFA,CACZY,EAAAA,CAAMH,CAAAI,MAMVb,KAAIc,EAAkBtK,CAAAuK,MAAAf,CAAWA,CAAXA,CAHPY,CAGOZ,CAHDL,CAAA3H,QAAAgI,CAAkBA,QAAlBA,CAGCA,CAClBgB,EAAAA,CAAiBxK,CAAAuK,MAAAf,CAHDY,CAGCZ,CAHKL,CAAA7I,OAGLkJ,CACrBA,KAAIiB,EAAWzB,CAAAQ,CAAOC,EAAAD,CAAAA,CAAAA,CAAiCR,CAAjCQ,CAAPA,CAAgDA,EAC/DM,OAAAC,OAAAP,CAAciB,CAAdjB,CAAwBQ,CAAAR,CAAAA,CAAAA,CAAmBc,CAAnBd,CAAxBA,CAiCI7I,EAAAA,CAAAA,IAAAA,EAhCc6I,KAAAA,EAAAA,CAmBpBW,EAAAO,CAAYP,CAAAlK,QAAAyK,CAAkBpE,EAAlBoE,CAAoCA,EAApCA,CACZA,KAAIC,EAAOD,EACPE,KAAAA,EAAaF,CAAAhE,EAAAM,IAAA0D,CAAcP,CAAdO,CAGZE,EAALF,GACEA,CAAAhE,EAAAC,IAAA+D,CAAcP,CAAdO,CAAyBA,EAAzBA,CACAA,CAAAE,CAAAF,CAAaA,CAAAhE,EAAAM,IAAA0D,CAAcP,CAAdO,CAFfA,CAIAA,IAAIE,CAAJF,CAAgBA,CACVA,CAAAtD,EAAJsD,GACEE,CAAA7D,EAAA2D,CAAsBA,CAAAtD,EAAtBsD,CADFA,CACgDA,CAAAA,CADhDA,CAIAA,KAAM5D,EAAa8D,CAAA9D,EACnB4D,KAAK/J,CAAL+J,GAAU5D,EAAV4D,CACEG,CASAH,CATId,CASJc,EATiBd,CAAAc,CAAU/J,CAAV+J,CASjBA,CARAI,CAQAJ,CARQA,CAAC/J,CAAD+J,CAAIA,QAAJA,CAAcP,CAAdO,CAtQMK,KAsQNL,CAAwC/J,CAAxC+J,CAQRA,CAPIG,CAOJH,EANEI,CAAAjK,KAAA6J,CAAWA,GAAXA,CAAgBG,CAAA5K,QAAAyK,CAAUlE,CAAVkE,CAAqBA,EAArBA,CAAhBA,CAMFA,CAJAI,CAAAjK,KAAA6J,CAAWA,GAAXA,CAIAA,CAHIlE,CAAAe,KAAAmD,CAAe5D,CAAA4D,CAAW/J,CAAX+J,CAAfA,CAGJA,EAFEI,CAAAjK,KAAA6J,CAAWA,aAAXA,CAEFA,CAAAC,CAAA9J,KAAA6J,CAAUI,CAAArC,KAAAiC,CAAWA,EAAXA,CAAVA,CAhBYA,CAmBhBA,CAAAA,CAAOC,CAAAlC,KAAAiC,CAAUA,IAAVA,CA7CL1K,EAAAwJ,CAAUc,CAAVd,CAA4BwB,CAA5BxB,CAA0CgB,CAE1C5G,EAAA4D,UAAAgC,CAAwBY,CAAxBZ,CAA8BwB,CAAA1K,OAjBIkJ,CAmBpCA,MAAOxJ,EAvByBwJ;AAkGlCQ,QAAAA,EAAaA,CAAbA,CAAaA,CAAChK,CAADgK,CAAOiB,CAAPjB,CAAwCA,CAAjCiB,CAAAjB,CAAAA,IAAAA,EAAAA,GAAAiB,CAAAjB,CAA0BA,CAAAA,CAA1BA,CAAAiB,CACdpE,EAAAA,CAAQ7G,CAAA8B,MAAAkI,CAAWA,GAAXA,CAGZA,KAJmDA,IAE/CkB,CAF+ClB,CAErC1E,CAFqC0E,CAG/CmB,EAAMnB,EAHyCA,CAI1CxJ,EAAIwJ,CAJsCA,CAIhCoB,CAAnBpB,CAAuBxJ,CAAvBwJ,CAA2BnD,CAAAvG,OAA3B0J,CAAyCxJ,CAAAwJ,EAAzCA,CAEEA,GADArJ,CACAqJ,CADInD,CAAAmD,CAAMxJ,CAANwJ,CACJA,CAGEA,GAFAoB,CAEIpB,CAFCrJ,CAAAmB,MAAAkI,CAAQA,GAARA,CAEDA,CAAYA,CAAZA,CAAAoB,CAAA9K,OAAJ0J,CAAmBA,CACjBkB,CAAAlB,CAAWoB,CAAApB,CAAGA,CAAHA,CAAA9I,KAAA8I,EAEX1E,EAAA0E,CAAQoB,CAAAb,MAAAP,CAASA,CAATA,CAAAvB,KAAAuB,CAAiBA,GAAjBA,CACRA,IAAIiB,CAAJjB,CAAAA,CACUA,IAAAA,EAAAA,CAA8BkB,EAAAA,CAAAA,CAvC9CG,KAAIjM,EAAQmH,EAAA2D,KAAAmB,CAAqB/F,CAArB+F,CACRjM,EAAJiM,GACMjM,CAAAiM,CAAMA,CAANA,CAAJA,EAvHGC,CAAAnE,EAMLmE,GALEA,CAAAnE,EAGAmE,CAHsDjD,QAAAK,cAAA4C,CAAuBA,MAAvBA,CAGtDA,CAFAA,CAAAnE,EAAAoE,aAAAD,CAAkCA,oBAAlCA,CAAwDA,EAAxDA,CAEAA,CADAA,CAAAnE,EAAAjD,MAAAsH,IACAF,CADiCA,SACjCA,CAAAjD,QAAAC,KAAAC,YAAA+C,CAA0BA,CAAAnE,EAA1BmE,CAEFA,EAAAA,CAAAA,CAAOxM,MAAA2M,iBAAAH,CAAwBA,CAAAnE,EAAxBmE,CAAAI,iBAAAJ,CAA+DJ,CAA/DI,CAiHLD,EAUUA,CAVVA,CAUUA,oBAPRA,CAAA/F,CAAA+F,CAHFA,CADFA,CAqCMrB,CAGAmB,CAAAnB,CAAIkB,CAAJlB,CAAAA,CAAgB1E,CAPC0E,CAWvBA,MAAOmB,EApB4CnB,CA0BrD2B,QAAAA,GAAqBA,CAArBA,CAAqBA,CAACf,CAADe,CAAaA,CAChCA,GAAK1E,CAAL0E,CAGAA,IAAKA,IAAIhE,CAATgE,GAAwBf,EAAA7D,EAAxB4E,CACMhE,CAAJgE,GAAoBA,CAAAvE,EAApBuE,EACE1E,CAAA0E,CAAgBhE,CAAhBgE,CAN4BA;AAmBlCpC,QAAAA,GAAqBA,CAArBA,CAAqBA,CAACJ,CAADI,CAAYH,CAAZG,CAA0BF,CAA1BE,CAAyCD,CAAzCC,CAAqDP,CAArDO,CAA2DA,CAE1EF,CAAJE,EAEE3E,CAAA2E,CAA2BF,CAA3BE,CAA0CA,QAAAA,CAACpE,CAADoE,CAASjE,CAATiE,CAAmBA,CACvDjE,CAAJiE,EAL0EA,CAK7D7C,EAAAM,IAAAuC,CAAcjE,CAAdiE,CAAbA,GACED,CADFC,CACeA,SADfA,CACyBjE,CADzBiE,CAC8BA,GAD9BA,CAD2DA,CAA7DA,CAMFA,IAAIA,CAACD,CAALC,CACEA,MAAOJ,EAETI,KAAIqC,EAAoBpC,CAAAD,CAAAA,CAAAA,CAA2BA,EAA3BA,CAAgCD,CAAhCC,CAA4CP,CAA5CO,CACpBpE,EAAAA,CAASgE,CAAAoB,MAAAhB,CAAgBA,CAAhBA,CAAmBJ,CAAA3H,QAAA+H,CAAkBA,IAAlBA,CAAnBA,CAKbA,KAAIsC,EADAC,CACAD,CADc7B,CAAAT,CAAAA,CAAAA,CAAmBqC,CAAnBrC,CAAsCA,CAAAA,CAAtCA,CAClBA,CACIqB,EAAarB,CAAA7C,EAAAM,IAAAuC,CAAcH,CAAdG,CADjBA,CAEIwC,EAAWnB,CAAXmB,EAAyBnB,CAAA9D,EACzBiF,EAAJxC,CAGEsC,CAHFtC,CAGkBO,MAAAC,OAAAR,CAAcO,MAAAkC,OAAAzC,CAAcwC,CAAdxC,CAAdA,CAAuCuC,CAAvCvC,CAHlBA,CAKEA,CAAA7C,EAAAC,IAAA4C,CAAcH,CAAdG,CAA4BsC,CAA5BtC,CAEFA,KAAI4B,EAAM5B,EAAVA,CACI5I,CADJ4I,CAGI0C,EAAmB1C,CAAAA,CACvBA,KAAK5I,CAAL4I,GAAUsC,EAAVtC,CAAyBA,CACvBA,IAAA2C,EAAIJ,CAAAvC,CAAY5I,CAAZ4I,CAEM9J,KAAAA,EAAV8J,GAAI2C,CAAJ3C,GACE2C,CADF3C,CACMA,SADNA,CAGIwC,EAAAA,CAAJxC,EAAkB5I,CAAlB4I,GAAuBwC,EAAvBxC,GACE0C,CADF1C,CACqBA,CAAAA,CADrBA,CAGA4B,EAAAtK,KAAA0I,CAAYH,CAAZG,CA1YgBwB,KA0YhBxB,CAA2C5I,CAA3C4I,CAA4CA,IAA5CA,CAAiD2C,CAAjD3C,CATuBA,CAWrB0C,CAAJ1C,EACEoC,EAAApC,CAAAA,CAAAA,CAA2BqB,CAA3BrB,CAEEqB,EAAJrB,GACEqB,CAAA9D,EADFyC,CAC0BsC,CAD1BtC,CAaIF,EAAJE,GACEpE,CADFoE,CACcJ,CADdI,CACuBA,GADvBA,CAC2BpE,CAD3BoE,CAGAA,OAAUpE,EAAVoE,CAAmB4B,CAAA1C,KAAAc,CAASA,IAATA,CAAnBA,CAAiCA,GA/D6CA,CAqElFrC,CAAAiF,UAAA,YAAA,CAAqCjF,CAAAiF,UAAA9E,EACrCH,EAAAiF,UAAA,eAAA,CAAwCjF,CAAAiF,UAAAvD,EACxC1B;CAAAiF,UAAA,qBAAA,CAA8CjF,CAAAiF,UAAApD,EAC9C7B,EAAAiF,UAAA,eAAA,CAAwCjF,CAAAiF,UAAArD,EACxC5B,EAAAiF,UAAA,cAAA,CAAuCjF,CAAAiF,UAAAlD,EACvC/B,EAAAiF,UAAA,kBAAA,CAA2CjF,CAAAiF,UAAA1E,EAC3CP,EAAAiF,UAAA,WAAA,CA3asBpB,KA6atBjB,OAAAsC,eAAA,CAAsBlF,CAAAiF,UAAtB,CAA2C,iBAA3C,CAA8D,CAE5D,IAAAnF,QAAG,EAAG,CACJ,MAAOC,EADH,CAFsD,CAM5D,IAAAN,QAAG,CAAC0F,CAAD,CAAK,CACNpF,CAAA,CAAkBoF,CADZ,CANoD,CAA9D,C,CElfA,IAAMC,EAAc,E,CCkBpB,IAAMC,GAAUC,OAAAC,QAAA,EAKTC,SAASA,GAAU,CAAC/E,CAAD,CAAa,CAErC,GADID,CACJ,CDxBa4E,CCuBE,CAAY3E,CAAZ,CACf,CACqBD,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChCiF,QAASA,GAAe,CAACjF,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnCkF,QAASA,GAAuB,CAAClF,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAAmF,YAAL,GACEnF,CAAAmF,YACA,CADuB,CAAA,CACvB,CAAAN,EAAAO,KAAA,CAAa,QAAQ,EAAG,CAEtBpF,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAAmF,YAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CCtGlD,IAAME,EAAY,IJufH7F,CIpfbrH,SADImN,EACO,EAAG,CAEZ,IAAAC,EAAA,CAA4B,IAC5BF,EAAA,gBAAA,CAA8CL,EAHlC,CAKdQ,QAAAA,EAAMA,CAANA,CAAMA,CAAGA,CACHD,CAAAC,CAAAD,EAAJC,EAGIpO,MAAAU,SAAA2N,qBAHJD,GAIEA,CAAAD,EAMAC,CAJQpO,MAAAU,SAAA2N,qBAIRD,CAHAA,CAAAD,EAAAC,kBAGAA,CAHiDA,QAAAA,CAAChJ,CAADgJ,CAAWA,CAC1DH,CAAAhE,EAAAmE,CAA+BhJ,CAA/BgJ,CAD0DA,CAG5DA,CAAAA,CAAAD,EAAAC,iBAAAA,CAAgDA,QAAAA,EAAMA,CACpDE,qBAAAF,CAAsBA,QAAAA,EAAMA,CAZzBA,CAaGD,EAAAC,SAAJA,EAbCA,CAcCG,kBAAAH,EAFwBA,CAA5BA,CADoDA,CAVxDA,CADOA,CAwBTI,CAAAA,UAAAA,gBAAAA,CAAAA,QAAeA,CAAC5F,CAAD4F,CAAW3F,CAAX2F,CAAwBA,CACrCJ,CAAAI,CAAAA,IAAAA,CLuT8B,GKtT9BA,GLsTK9H,CAAA,CKtTkBkC,CLsTlB,CKtTL4F,GFvCWhB,CE0CXgB,CAAY3F,CAAZ2F,CAGAA,CAH2B5F,CAG3B4F,CAFIzE,CAEJyE,CAFUP,CAAAtF,EAAA6F,CAA4B5F,CAA5B4F,CAAsC3F,CAAtC2F,CAEVA,CAAA5F,CAAA4F,UAAAA,CAAwBzE,CANxByE,CAFqCA,CAUvCD;CAAAA,UAAAA,kBAAAA,CAAAA,QAAiBA,EAAGA,CAClBH,CAAAG,CAAAA,IAAAA,CACAA,IAAKA,IAAAJ,EAALI,CAAAA,CAGAA,IAAIvF,EAASuF,IAAAJ,EAAAI,cAAAA,EACbA,IAAKA,IAAAJ,EAAAI,SAALA,CAAAA,CAGAA,IAAKA,IAAI7M,EAAI6M,CAAbA,CAAgB7M,CAAhB6M,CAAoBvF,CAAAxH,OAApB+M,CAAmC7M,CAAA6M,EAAnCA,CAAyCA,CAEvCA,IAAInJ,EAAQmJ,IAAAJ,EAAAI,uBAAAA,CADHvF,CAAAuF,CAAO7M,CAAP6M,CACGA,CACRnJ,EAAJmJ,EACEN,CAAAhE,EAAAsE,CAA+BnJ,CAA/BmJ,CAJqCA,CAOzCA,IAAAJ,EAAAI,SAAAA,CAAwCA,CAAAA,CAVxCA,CAJAA,CAFkBA,CAsBpBE;CAAAA,UAAAA,aAAAA,CAAAA,QAAYA,CAAC9H,CAAD8H,CAAUzG,CAAVyG,CAAsBA,CAChCL,CAAAK,CAAAA,IAAAA,CACAA,IAAIzG,CAAJyG,CHnEF,IAAK5M,IAAIA,CAAT,GGoEoCmG,EHpEpC,CAEY,IAAV,GAAInG,CAAJ,CGkEyB8E,CHjEvBvB,MAAAsJ,eAAA,CAA6B7M,CAA7B,CADF,CGkEyB8E,CH/DvBvB,MAAAuJ,YAAA,CAA0B9M,CAA1B,CG+DgCmG,CH/DH,CAAWnG,CAAX,CAA7B,CGiEF4M,IAAI9H,CAAAiI,WAAJH,CAKEA,IAJAA,IAAAI,aAAAJ,CAAkB9H,CAAlB8H,CAIS/M,CAHLoN,CAGKpN,CAFuBiF,CAAAiI,WAADG,SAEtBrN,EADLiF,CAAAiI,WAAAI,WACKtN,CAAAA,CAAAA,CAAI+M,CAAbA,CAAgB/M,CAAhB+M,CAAoBK,CAAAtN,OAApBiN,CAA2C/M,CAAA+M,EAA3CA,CACEA,IAAAA,aAAAA,CAA6CK,CAAAL,CAAe/M,CAAf+M,CAA7CA,CANJA,KAUEA,KADIM,CACKrN,CADMiF,CAAAoI,SACNrN,EAD0BiF,CAAAqI,WAC1BtN,CAAAA,CAAAA,CAAI+M,CAAbA,CAAgB/M,CAAhB+M,CAAoBM,CAAAvN,OAApBiN,CAAqC/M,CAAA+M,EAArCA,CACEA,IAAAA,aAAAA,CAA6CM,CAAAN,CAAS/M,CAAT+M,CAA7CA,CAhB4BA,CAuBlCI;CAAAA,UAAAA,aAAAA,CAAAA,QAAYA,CAAClI,CAADkI,CAAUA,CACpBT,CAAAS,CAAAA,IAAAA,CLyIF,KAAI5H,EKxIsBN,CLwIV,UAAhB,CACIsI,CAKAhI,EAAJ,CACgC,EAA9B,CAAIA,CAAAvE,QAAA,CAAkB,GAAlB,CAAJ,CACEuM,CADF,CACOhI,CADP,CAIEgI,CAJF,CK/IwBtI,CLmJhBG,aAJR,EK/IwBH,CLmJQG,aAAA,CAAqB,IAArB,CAJhC,EAI+D,EALjE,CAQEmI,CARF,CK9I0BtI,CLsJHsI,GKrJjBrG,EAAAA,CF/FO4E,CE+FIqB,CAAYI,CAAZJ,CACfA,IAAIA,EAAAjG,CAAAiG,EL6P0B,EK7P1BA,GL6PCnI,CAAA,CK7P8BkC,CL6P9B,CK7PDiG,EAGAjG,CAAAA,CAHAiG,EAG4BA,EAAfA,CAA+BjG,CAA/BiG,CAHbA,CAAJA,CAG2DA,CAEzDA,GDfIhB,EAAA,CCeqCjF,CDfrC,CCeJiG,EAAyCjG,CDfR,4BCejCiG,GAAyCjG,CDfyB,sBCelEiG,CACEA,IAAAL,gBAAAK,CAAqBjG,CAArBiG,CAA+BI,CAA/BJ,CACAA,CAAeA,EAAfA,CAAuCjG,CAAvCiG,CAIFA,IADItN,CACJsN,CADWlI,CAAAiI,WACXC,CAEEA,GADIzJ,CACJyJ,CAD4CtN,CAAA2N,cAAAL,CAAmBA,OAAnBA,CAC5CA,CAEEzJ,CAAAyJ,WACAA,CADsBjG,CAAAiG,UACtBA,CAAAzJ,CAAAC,YAAAwJ,CAAoB3J,CAAA2J,CAAUjG,CAAAiG,UAAVA,CAbiCA,CAPvCA,CA4BtBM,EAAAA,UAAAA,cAAAA,CAAAA,QAAaA,CAACnH,CAADmH,CAAaA,CACxBf,CAAAe,CAAAA,IAAAA,CACAA,KAAAV,aAAAU,CAAkB5F,QAAA6F,KAAlBD,CAAiCnH,CAAjCmH,CAFwBA,CAM5B;GAAI,CAACnP,MAAAU,SAAL,EAAwB,CAACV,MAAAU,SAAA2O,YAAzB,CAAsD,CACpD,IAAMC,EAAqB,IAAIpB,CAA/B,CACIG,GAAuBrO,MAAAU,SAAvB2N,EAA0CrO,MAAAU,SAAA2N,qBAG9CrO,OAAAU,SAAA,CAAkB,CAMhB,gBAAA8N,QAAe,CAAC5F,CAAD,CAAWC,CAAX,CAAwC,CACrDyG,CAAAf,kBAAA,EACAe,EAAAd,gBAAA,CAAmC5F,CAAnC,CAA6CC,CAA7C,CAFqD,CANvC,CAgBhB,sBAAA0G,QAAqB,CAAC3G,CAAD,CAAWC,CAAX,CAAwB2G,CAAxB,CAAwC,CAC3DxP,MAAAU,SAAA8N,gBAAA,CAAgC5F,CAAhC,CAA0CC,CAA1C,CAAuD2G,CAAvD,CAD2D,CAhB7C,CAwBhB,mBAAAC,QAAkB,EAAwB,EAxB1B,CA8BhB,aAAAhB,QAAY,CAAC9H,CAAD,CAAUqB,CAAV,CAAsB,CAChCsH,CAAAf,kBAAA,EACAe,EAAAb,aAAA,CAAgC9H,CAAhC,CAAyCqB,CAAzC,CAFgC,CA9BlB,CAsChB,aAAA6G,QAAY,CAAClI,CAAD,CAAU,CACpB2I,CAAAf,kBAAA,EACAe,EAAAT,aAAA,CAAgClI,CAAhC,CAFoB,CAtCN,CA8ChB,cAAAwI,QAAa,CAACnH,CAAD,CAAa,CACxBsH,CAAAf,kBAAA,EACAe;CAAAH,cAAA,CAAiCnH,CAAjC,CAFwB,CA9CV,CAwDhB,sBAAA0H,QAAqB,CAAC/I,CAAD,CAAUyF,CAAV,CAAoB,CACvC,MHpKJ,CADM5F,CACN,CADcxG,MAAA2M,iBAAA,CGqKmBhG,CHrKnB,CAAAiG,iBAAA,CGqK4BR,CHrK5B,CACd,EAGS5F,CAAApE,KAAA,EAHT,CACS,EGkKkC,CAxDzB,CA4DhB,kBAAAmM,QAAiB,EAAG,CAClBe,CAAAf,kBAAA,EADkB,CA5DJ,CAgEhB3N,UAAWC,CAhEK,CAiEhBd,aAAcA,CAjEE,CAkEhBU,SAAUK,CAlEM,CAqEduN,GAAJ,GACErO,MAAAU,SAAA2N,qBADF,CACyCA,EADzC,CA1EoD,CA+EtDrO,MAAAU,SAAA0H,UAAA,CAA4B6F","file":"apply-shim.min.js","sourcesContent":["/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n  if (settings && settings['shimcssproperties']) {\n    nativeCssVariables_ = false;\n  } else {\n    // chrome 49 has semi-working css vars, check if box-shadow works\n    // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n    // However, shim css custom properties are only supported with ShadyDOM enabled,\n    // so fall back on native if we do not detect ShadyDOM\n    // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n    nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n      window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n  }\n}\n\n/** @type {string | undefined} */\nexport let cssBuild;\nif (window.ShadyCSS && window.ShadyCSS.cssBuild !== undefined) {\n  cssBuild = window.ShadyCSS.cssBuild;\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n  nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n  calcCssVariables(window.ShadyCSS);\n  // reset window variable to let ShadyCSS API take its place\n  window.ShadyCSS = undefined;\n} else {\n  calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n  constructor() {\n    /** @type {number} */\n    this['start'] = 0;\n    /** @type {number} */\n    this['end'] = 0;\n    /** @type {StyleNode} */\n    this['previous'] = null;\n    /** @type {StyleNode} */\n    this['parent'] = null;\n    /** @type {Array<StyleNode>} */\n    this['rules'] = null;\n    /** @type {string} */\n    this['parsedCssText'] = '';\n    /** @type {string} */\n    this['cssText'] = '';\n    /** @type {boolean} */\n    this['atRule'] = false;\n    /** @type {number} */\n    this['type'] = 0;\n    /** @type {string} */\n    this['keyframesName'] = '';\n    /** @type {string} */\n    this['selector'] = '';\n    /** @type {string} */\n    this['parsedSelector'] = '';\n  }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n  text = clean(text);\n  return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n  return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n  let root = new StyleNode();\n  root['start'] = 0;\n  root['end'] = text.length\n  let n = root;\n  for (let i = 0, l = text.length; i < l; i++) {\n    if (text[i] === OPEN_BRACE) {\n      if (!n['rules']) {\n        n['rules'] = [];\n      }\n      let p = n;\n      let previous = p['rules'][p['rules'].length - 1] || null;\n      n = new StyleNode();\n      n['start'] = i + 1;\n      n['parent'] = p;\n      n['previous'] = previous;\n      p['rules'].push(n);\n    } else if (text[i] === CLOSE_BRACE) {\n      n['end'] = i + 1;\n      n = n['parent'] || root;\n    }\n  }\n  return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n  let t = text.substring(node['start'], node['end'] - 1);\n  node['parsedCssText'] = node['cssText'] = t.trim();\n  if (node['parent']) {\n    let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n    t = text.substring(ss, node['start'] - 1);\n    t = _expandUnicodeEscapes(t);\n    t = t.replace(RX.multipleSpaces, ' ');\n    // TODO(sorvell): ad hoc; make selector include only after last ;\n    // helps with mixin syntax\n    t = t.substring(t.lastIndexOf(';') + 1);\n    let s = node['parsedSelector'] = node['selector'] = t.trim();\n    node['atRule'] = (s.indexOf(AT_START) === 0);\n    // note, support a subset of rule types...\n    if (node['atRule']) {\n      if (s.indexOf(MEDIA_START) === 0) {\n        node['type'] = types.MEDIA_RULE;\n      } else if (s.match(RX.keyframesRule)) {\n        node['type'] = types.KEYFRAMES_RULE;\n        node['keyframesName'] =\n          node['selector'].split(RX.multipleSpaces).pop();\n      }\n    } else {\n      if (s.indexOf(VAR_START) === 0) {\n        node['type'] = types.MIXIN_RULE;\n      } else {\n        node['type'] = types.STYLE_RULE;\n      }\n    }\n  }\n  let r$ = node['rules'];\n  if (r$) {\n    for (let i = 0, l = r$.length, r;\n      (i < l) && (r = r$[i]); i++) {\n      parseCss(r, text);\n    }\n  }\n  return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n  return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n    let code = arguments[1],\n      repeat = 6 - code.length;\n    while (repeat--) {\n      code = '0' + code;\n    }\n    return '\\\\' + code;\n  });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n  // calc rule cssText\n  let cssText = '';\n  if (node['cssText'] || node['rules']) {\n    let r$ = node['rules'];\n    if (r$ && !_hasMixinRules(r$)) {\n      for (let i = 0, l = r$.length, r;\n        (i < l) && (r = r$[i]); i++) {\n        cssText = stringify(r, preserveProperties, cssText);\n      }\n    } else {\n      cssText = preserveProperties ? node['cssText'] :\n        removeCustomProps(node['cssText']);\n      cssText = cssText.trim();\n      if (cssText) {\n        cssText = '  ' + cssText + '\\n';\n      }\n    }\n  }\n  // emit rule if there is cssText\n  if (cssText) {\n    if (node['selector']) {\n      text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n    }\n    text += cssText;\n    if (node['selector']) {\n      text += CLOSE_BRACE + '\\n\\n';\n    }\n  }\n  return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n  let r = rules[0];\n  return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n  cssText = removeCustomPropAssignment(cssText);\n  return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n  return cssText\n    .replace(RX.customProp, '')\n    .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n  return cssText\n    .replace(RX.mixinApply, '')\n    .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n  STYLE_RULE: 1,\n  KEYFRAMES_RULE: 7,\n  MEDIA_RULE: 4,\n  MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n  comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n  port: /@import[^;]*;/gim,\n  customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n  mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n  mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n  varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n  keyframesRule: /^@[^\\s]*keyframes/,\n  multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n  const text = style.textContent;\n  if (!styleTextSet.has(text)) {\n    styleTextSet.add(text);\n    const newStyle = style.cloneNode(true);\n    document.head.appendChild(newStyle);\n  }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n  return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables, cssBuild} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n  if (!rules) {\n    return '';\n  }\n  if (typeof rules === 'string') {\n    rules = parse(rules);\n  }\n  if (callback) {\n    forEachRule(rules, callback);\n  }\n  return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n  if (!style['__cssRules'] && style.textContent) {\n    style['__cssRules'] = parse(style.textContent);\n  }\n  return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n  return Boolean(rule['parent']) &&\n  rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n  if (!node) {\n    return;\n  }\n  let skipRules = false;\n  let type = node['type'];\n  if (onlyActiveRules) {\n    if (type === types.MEDIA_RULE) {\n      let matchMedia = node['selector'].match(MEDIA_MATCH);\n      if (matchMedia) {\n        // if rule is a non matching @media rule, skip subrules\n        if (!window.matchMedia(matchMedia[1]).matches) {\n          skipRules = true;\n        }\n      }\n    }\n  }\n  if (type === types.STYLE_RULE) {\n    styleRuleCallback(node);\n  } else if (keyframesRuleCallback &&\n    type === types.KEYFRAMES_RULE) {\n    keyframesRuleCallback(node);\n  } else if (type === types.MIXIN_RULE) {\n    skipRules = true;\n  }\n  let r$ = node['rules'];\n  if (r$ && !skipRules) {\n    for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n      forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n    }\n  }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n  let style = createScopeStyle(cssText, moniker);\n  applyStyle(style, target, contextNode);\n  return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n  let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n  if (moniker) {\n    style.setAttribute('scope', moniker);\n  }\n  style.textContent = cssText;\n  return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n  let placeHolder = document.createComment(' Shady DOM styles for ' +\n    moniker + ' ');\n  let after = lastHeadApplyNode ?\n    lastHeadApplyNode['nextSibling'] : null;\n  let scope = document.head;\n  scope.insertBefore(placeHolder, after || scope.firstChild);\n  lastHeadApplyNode = placeHolder;\n  return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n  target = target || document.head;\n  let after = (contextNode && contextNode.nextSibling) ||\n    target.firstChild;\n  target.insertBefore(style, after);\n  if (!lastHeadApplyNode) {\n    lastHeadApplyNode = style;\n  } else {\n    // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n    let position = style.compareDocumentPosition(lastHeadApplyNode);\n    if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n      lastHeadApplyNode = style;\n    }\n  }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n  return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nexport function findMatchingParen(text, start) {\n  let level = 0;\n  for (let i=start, l=text.length; i < l; i++) {\n    if (text[i] === '(') {\n      level++;\n    } else if (text[i] === ')') {\n      if (--level === 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n  // find 'var('\n  let start = str.indexOf('var(');\n  if (start === -1) {\n    // no var?, everything is prefix\n    return callback(str, '', '', '');\n  }\n  //${prefix}var(${inner})${suffix}\n  let end = findMatchingParen(str, start + 3);\n  let inner = str.substring(start + 4, end);\n  let prefix = str.substring(0, start);\n  // suffix may have other variables\n  let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n  let comma = inner.indexOf(',');\n  // value and fallback args should be trimmed to match in property lookup\n  if (comma === -1) {\n    // variable, no fallback\n    return callback(prefix, inner.trim(), '', suffix);\n  }\n  // var(${value},${fallback})\n  let value = inner.substring(0, comma).trim();\n  let fallback = inner.substring(comma + 1).trim();\n  return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n  // use native setAttribute provided by ShadyDOM when setAttribute is patched\n  if (nativeShadow) {\n    element.setAttribute('class', value);\n  } else {\n    window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n  }\n}\n\nexport const wrap = window['ShadyDOM'] && window['ShadyDOM']['wrap'] || ((node) => node);\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n  let localName = element['localName'];\n  let is = '', typeExtension = '';\n  /*\n  NOTE: technically, this can be wrong for certain svg elements\n  with `-` in the name like `<font-face>`\n  */\n  if (localName) {\n    if (localName.indexOf('-') > -1) {\n      is = localName;\n    } else {\n      typeExtension = localName;\n      is = (element.getAttribute && element.getAttribute('is')) || '';\n    }\n  } else {\n    is = /** @type {?} */(element).is;\n    typeExtension = /** @type {?} */(element).extends;\n  }\n  return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n  /** @type {!Array<string>} */\n  const styleTextParts = [];\n  const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n  for (let i = 0; i < styles.length; i++) {\n    const style = styles[i];\n    if (isUnscopedStyle(style)) {\n      if (!nativeShadow) {\n        processUnscopedStyle(style);\n        style.parentNode.removeChild(style);\n      }\n    } else {\n      styleTextParts.push(style.textContent);\n      style.parentNode.removeChild(style);\n    }\n  }\n  return styleTextParts.join('').trim();\n}\n\n/**\n * Split a selector separated by commas into an array in a smart way\n * @param {string} selector\n * @return {!Array<string>}\n */\nexport function splitSelectorList(selector) {\n  const parts = [];\n  let part = '';\n  for (let i = 0; i >= 0 && i < selector.length; i++) {\n    // A selector with parentheses will be one complete part\n    if (selector[i] === '(') {\n      // find the matching paren\n      const end = findMatchingParen(selector, i);\n      // push the paren block into the part\n      part += selector.slice(i, end + 1);\n      // move the index to after the paren block\n      i = end;\n    } else if (selector[i] === ',') {\n      parts.push(part);\n      part = '';\n    } else {\n      part += selector[i];\n    }\n  }\n  // catch any pieces after the last comma\n  if (part) {\n    parts.push(part);\n  }\n  return parts;\n}\n\nconst CSS_BUILD_ATTR = 'css-build';\n\n/**\n * Return the polymer-css-build \"build type\" applied to this element\n *\n * @param {!HTMLElement} element\n * @return {string} Can be \"\", \"shady\", or \"shadow\"\n */\nexport function getCssBuild(element) {\n  if (cssBuild !== undefined) {\n    return /** @type {string} */(cssBuild);\n  }\n  if (element.__cssBuild === undefined) {\n    // try attribute first, as it is the common case\n    const attrValue = element.getAttribute(CSS_BUILD_ATTR);\n    if (attrValue) {\n      element.__cssBuild = attrValue;\n    } else {\n      const buildComment = getBuildComment(element);\n      if (buildComment !== '') {\n        // remove build comment so it is not needlessly copied into every element instance\n        removeBuildComment(element);\n      }\n      element.__cssBuild = buildComment;\n    }\n  }\n  return element.__cssBuild || '';\n}\n\n/**\n * Check if the given element, either a <template> or <style>, has been processed\n * by polymer-css-build.\n *\n * If so, then we can make a number of optimizations:\n * - polymer-css-build will decompose mixins into individual CSS Custom Properties,\n * so the ApplyShim can be skipped entirely.\n * - Under native ShadowDOM, the style text can just be copied into each instance\n * without modification\n * - If the build is \"shady\" and ShadyDOM is in use, the styling does not need\n * scoping beyond the shimming of CSS Custom Properties\n *\n * @param {!HTMLElement} element\n * @return {boolean}\n */\nexport function elementHasBuiltCss(element) {\n  return getCssBuild(element) !== '';\n}\n\n/**\n * For templates made with tagged template literals, polymer-css-build will\n * insert a comment of the form `<!--css-build:shadow-->`\n *\n * @param {!HTMLElement} element\n * @return {string}\n */\nexport function getBuildComment(element) {\n  const buildComment = element.localName === 'template' ?\n      /** @type {!HTMLTemplateElement} */ (element).content.firstChild :\n      element.firstChild;\n  if (buildComment instanceof Comment) {\n    const commentParts = buildComment.textContent.trim().split(':');\n    if (commentParts[0] === CSS_BUILD_ATTR) {\n      return commentParts[1];\n    }\n  }\n  return '';\n}\n\n/**\n * Check if the css build status is optimal, and do no unneeded work.\n *\n * @param {string=} cssBuild CSS build status\n * @return {boolean} css build is optimal or not\n */\nexport function isOptimalCssBuild(cssBuild = '') {\n  // CSS custom property shim always requires work\n  if (cssBuild === '' || !nativeCssVariables) {\n    return false;\n  }\n  return nativeShadow ? cssBuild === 'shadow' : cssBuild === 'shady';\n}\n\n/**\n * @param {!HTMLElement} element\n */\nfunction removeBuildComment(element) {\n  const buildComment = element.localName === 'template' ?\n      /** @type {!HTMLTemplateElement} */ (element).content.firstChild :\n      element.firstChild;\n  buildComment.parentNode.removeChild(buildComment);\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n/*\n * The apply shim simulates the behavior of `@apply` proposed at\n * https://tabatkins.github.io/specs/css-apply-rule/.\n * The approach is to convert a property like this:\n *\n *    --foo: {color: red; background: blue;}\n *\n * to this:\n *\n *    --foo_-_color: red;\n *    --foo_-_background: blue;\n *\n * Then where `@apply --foo` is used, that is converted to:\n *\n *    color: var(--foo_-_color);\n *    background: var(--foo_-_background);\n *\n * This approach generally works but there are some issues and limitations.\n * Consider, for example, that somewhere *between* where `--foo` is set and used,\n * another element sets it to:\n *\n *    --foo: { border: 2px solid red; }\n *\n * We must now ensure that the color and background from the previous setting\n * do not apply. This is accomplished by changing the property set to this:\n *\n *    --foo_-_border: 2px solid red;\n *    --foo_-_color: initial;\n *    --foo_-_background: initial;\n *\n * This works but introduces one new issue.\n * Consider this setup at the point where the `@apply` is used:\n *\n *    background: orange;\n *    `@apply` --foo;\n *\n * In this case the background will be unset (initial) rather than the desired\n * `orange`. We address this by altering the property set to use a fallback\n * value like this:\n *\n *    color: var(--foo_-_color);\n *    background: var(--foo_-_background, orange);\n *    border: var(--foo_-_border);\n *\n * Note that the default is retained in the property set and the `background` is\n * the desired `orange`. This leads us to a limitation.\n *\n * Limitation 1:\n\n * Only properties in the rule where the `@apply`\n * is used are considered as default values.\n * If another rule matches the element and sets `background` with\n * less specificity than the rule in which `@apply` appears,\n * the `background` will not be set.\n *\n * Limitation 2:\n *\n * When using Polymer's `updateStyles` api, new properties may not be set for\n * `@apply` properties.\n\n*/\n\n'use strict';\n\nimport {forEachRule, processVariableAndFallback, rulesForStyle, toCssText, gatherStyleText} from './style-util.js';\nimport {MIXIN_MATCH, VAR_ASSIGN} from './common-regex.js';\nimport {detectMixin} from './common-utils.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\nconst APPLY_NAME_CLEAN = /;\\s*/m;\nconst INITIAL_INHERIT = /^\\s*(initial)|(inherit)\\s*$/;\nconst IMPORTANT = /\\s*!important/;\n\n// separator used between mixin-name and mixin-property-name when producing properties\n// NOTE: plain '-' may cause collisions in user styles\nconst MIXIN_VAR_SEP = '_-_';\n\n/**\n * @typedef {!Object<string, string>}\n */\nlet PropertyEntry; // eslint-disable-line no-unused-vars\n\n/**\n * @typedef {!Object<string, boolean>}\n */\nlet DependantsEntry; // eslint-disable-line no-unused-vars\n\n/** @typedef {{\n *    properties: PropertyEntry,\n *    dependants: DependantsEntry\n * }}\n */\nlet MixinMapEntry; // eslint-disable-line no-unused-vars\n\n// map of mixin to property names\n// --foo: {border: 2px} -> {properties: {(--foo, ['border'])}, dependants: {'element-name': proto}}\nclass MixinMap {\n  constructor() {\n    /** @type {!Object<string, !MixinMapEntry>} */\n    this._map = {};\n  }\n  /**\n   * @param {string} name\n   * @param {!PropertyEntry} props\n   */\n  set(name, props) {\n    name = name.trim();\n    this._map[name] = {\n      properties: props,\n      dependants: {}\n    }\n  }\n  /**\n   * @param {string} name\n   * @return {MixinMapEntry}\n   */\n  get(name) {\n    name = name.trim();\n    return this._map[name] || null;\n  }\n}\n\n/**\n * Callback for when an element is marked invalid\n * @type {?function(string)}\n */\nlet invalidCallback = null;\n\n/** @unrestricted */\nclass ApplyShim {\n  constructor() {\n    /** @type {?string} */\n    this._currentElement = null;\n    /** @type {HTMLMetaElement} */\n    this._measureElement = null;\n    this._map = new MixinMap();\n  }\n  /**\n   * return true if `cssText` contains a mixin definition or consumption\n   * @param {string} cssText\n   * @return {boolean}\n   */\n  detectMixin(cssText) {\n    return detectMixin(cssText);\n  }\n\n  /**\n   * Gather styles into one style for easier processing\n   * @param {!HTMLTemplateElement} template\n   * @return {HTMLStyleElement}\n   */\n  gatherStyles(template) {\n    const styleText = gatherStyleText(template.content);\n    if (styleText) {\n      const style = /** @type {!HTMLStyleElement} */(document.createElement('style'));\n      style.textContent = styleText;\n      template.content.insertBefore(style, template.content.firstChild);\n      return style;\n    }\n    return null;\n  }\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   * @return {StyleNode}\n   */\n  transformTemplate(template, elementName) {\n    if (template._gatheredStyle === undefined) {\n      template._gatheredStyle = this.gatherStyles(template);\n    }\n    /** @type {HTMLStyleElement} */\n    const style = template._gatheredStyle;\n    return style ? this.transformStyle(style, elementName) : null;\n  }\n  /**\n   * @param {!HTMLStyleElement} style\n   * @param {string} elementName\n   * @return {StyleNode}\n   */\n  transformStyle(style, elementName = '') {\n    let ast = rulesForStyle(style);\n    this.transformRules(ast, elementName);\n    style.textContent = toCssText(ast);\n    return ast;\n  }\n  /**\n   * @param {!HTMLStyleElement} style\n   * @return {StyleNode}\n   */\n  transformCustomStyle(style) {\n    let ast = rulesForStyle(style);\n    forEachRule(ast, (rule) => {\n      if (rule['selector'] === ':root') {\n        rule['selector'] = 'html';\n      }\n      this.transformRule(rule);\n    })\n    style.textContent = toCssText(ast);\n    return ast;\n  }\n  /**\n   * @param {StyleNode} rules\n   * @param {string} elementName\n   */\n  transformRules(rules, elementName) {\n    this._currentElement = elementName;\n    forEachRule(rules, (r) => {\n      this.transformRule(r);\n    });\n    this._currentElement = null;\n  }\n  /**\n   * @param {!StyleNode} rule\n   */\n  transformRule(rule) {\n    rule['cssText'] = this.transformCssText(rule['parsedCssText'], rule);\n    // :root was only used for variable assignment in property shim,\n    // but generates invalid selectors with real properties.\n    // replace with `:host > *`, which serves the same effect\n    if (rule['selector'] === ':root') {\n      rule['selector'] = ':host > *';\n    }\n  }\n  /**\n   * @param {string} cssText\n   * @param {!StyleNode} rule\n   * @return {string}\n   */\n  transformCssText(cssText, rule) {\n    // produce variables\n    cssText = cssText.replace(VAR_ASSIGN, (matchText, propertyName, valueProperty, valueMixin) =>\n      this._produceCssProperties(matchText, propertyName, valueProperty, valueMixin, rule));\n    // consume mixins\n    return this._consumeCssProperties(cssText, rule);\n  }\n  /**\n   * @param {string} property\n   * @return {string}\n   */\n  _getInitialValueForProperty(property) {\n    if (!this._measureElement) {\n      this._measureElement = /** @type {HTMLMetaElement} */(document.createElement('meta'));\n      this._measureElement.setAttribute('apply-shim-measure', '');\n      this._measureElement.style.all = 'initial';\n      document.head.appendChild(this._measureElement);\n    }\n    return window.getComputedStyle(this._measureElement).getPropertyValue(property);\n  }\n  /**\n   * Walk over all rules before this rule to find fallbacks for mixins\n   *\n   * @param {!StyleNode} startRule\n   * @return {!Object}\n   */\n  _fallbacksFromPreviousRules(startRule) {\n    // find the \"top\" rule\n    let topRule = startRule;\n    while (topRule['parent']) {\n      topRule = topRule['parent'];\n    }\n    const fallbacks = {};\n    let seenStartRule = false;\n    forEachRule(topRule, (r) => {\n      // stop when we hit the input rule\n      seenStartRule = seenStartRule || r === startRule;\n      if (seenStartRule) {\n        return;\n      }\n      // NOTE: Only matching selectors are \"safe\" for this fallback processing\n      // It would be prohibitive to run `matchesSelector()` on each selector,\n      // so we cheat and only check if the same selector string is used, which\n      // guarantees things like specificity matching\n      if (r['selector'] === startRule['selector']) {\n        Object.assign(fallbacks, this._cssTextToMap(r['parsedCssText']));\n      }\n    });\n    return fallbacks;\n  }\n  /**\n   * replace mixin consumption with variable consumption\n   * @param {string} text\n   * @param {!StyleNode=} rule\n   * @return {string}\n   */\n  _consumeCssProperties(text, rule) {\n    /** @type {Array} */\n    let m = null;\n    // loop over text until all mixins with defintions have been applied\n    while((m = MIXIN_MATCH.exec(text))) {\n      let matchText = m[0];\n      let mixinName = m[1];\n      let idx = m.index;\n      // collect properties before apply to be \"defaults\" if mixin might override them\n      // match includes a \"prefix\", so find the start and end positions of @apply\n      let applyPos = idx + matchText.indexOf('@apply');\n      let afterApplyPos = idx + matchText.length;\n      // find props defined before this @apply\n      let textBeforeApply = text.slice(0, applyPos);\n      let textAfterApply = text.slice(afterApplyPos);\n      let defaults = rule ? this._fallbacksFromPreviousRules(rule) : {};\n      Object.assign(defaults, this._cssTextToMap(textBeforeApply));\n      let replacement = this._atApplyToCssProperties(mixinName, defaults);\n      // use regex match position to replace mixin, keep linear processing time\n      text = `${textBeforeApply}${replacement}${textAfterApply}`;\n      // move regex search to _after_ replacement\n      MIXIN_MATCH.lastIndex = idx + replacement.length;\n    }\n    return text;\n  }\n  /**\n   * produce variable consumption at the site of mixin consumption\n   * `@apply` --foo; -> for all props (${propname}: var(--foo_-_${propname}, ${fallback[propname]}}))\n   * Example:\n   *  border: var(--foo_-_border); padding: var(--foo_-_padding, 2px)\n   *\n   * @param {string} mixinName\n   * @param {Object} fallbacks\n   * @return {string}\n   */\n  _atApplyToCssProperties(mixinName, fallbacks) {\n    mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');\n    let vars = [];\n    let mixinEntry = this._map.get(mixinName);\n    // if we depend on a mixin before it is created\n    // make a sentinel entry in the map to add this element as a dependency for when it is defined.\n    if (!mixinEntry) {\n      this._map.set(mixinName, {});\n      mixinEntry = this._map.get(mixinName);\n    }\n    if (mixinEntry) {\n      if (this._currentElement) {\n        mixinEntry.dependants[this._currentElement] = true;\n      }\n      let p, parts, f;\n      const properties = mixinEntry.properties;\n      for (p in properties) {\n        f = fallbacks && fallbacks[p];\n        parts = [p, ': var(', mixinName, MIXIN_VAR_SEP, p];\n        if (f) {\n          parts.push(',', f.replace(IMPORTANT, ''));\n        }\n        parts.push(')');\n        if (IMPORTANT.test(properties[p])) {\n          parts.push(' !important');\n        }\n        vars.push(parts.join(''));\n      }\n    }\n    return vars.join('; ');\n  }\n\n  /**\n   * @param {string} property\n   * @param {string} value\n   * @return {string}\n   */\n  _replaceInitialOrInherit(property, value) {\n    let match = INITIAL_INHERIT.exec(value);\n    if (match) {\n      if (match[1]) {\n        // initial\n        // replace `initial` with the concrete initial value for this property\n        value = this._getInitialValueForProperty(property);\n      } else {\n        // inherit\n        // with this purposfully illegal value, the variable will be invalid at\n        // compute time (https://www.w3.org/TR/css-variables/#invalid-at-computed-value-time)\n        // and for inheriting values, will behave similarly\n        // we cannot support the same behavior for non inheriting values like 'border'\n        value = 'apply-shim-inherit';\n      }\n    }\n    return value;\n  }\n\n  /**\n   * \"parse\" a mixin definition into a map of properties and values\n   * cssTextToMap('border: 2px solid black') -> ('border', '2px solid black')\n   * @param {string} text\n   * @param {boolean=} replaceInitialOrInherit\n   * @return {!Object<string, string>}\n   */\n  _cssTextToMap(text, replaceInitialOrInherit = false) {\n    let props = text.split(';');\n    let property, value;\n    let out = {};\n    for (let i = 0, p, sp; i < props.length; i++) {\n      p = props[i];\n      if (p) {\n        sp = p.split(':');\n        // ignore lines that aren't definitions like @media\n        if (sp.length > 1) {\n          property = sp[0].trim();\n          // some properties may have ':' in the value, like data urls\n          value = sp.slice(1).join(':');\n          if (replaceInitialOrInherit) {\n            value = this._replaceInitialOrInherit(property, value);\n          }\n          out[property] = value;\n        }\n      }\n    }\n    return out;\n  }\n\n  /**\n   * @param {MixinMapEntry} mixinEntry\n   */\n  _invalidateMixinEntry(mixinEntry) {\n    if (!invalidCallback) {\n      return;\n    }\n    for (let elementName in mixinEntry.dependants) {\n      if (elementName !== this._currentElement) {\n        invalidCallback(elementName);\n      }\n    }\n  }\n\n  /**\n   * @param {string} matchText\n   * @param {string} propertyName\n   * @param {?string} valueProperty\n   * @param {?string} valueMixin\n   * @param {!StyleNode} rule\n   * @return {string}\n   */\n  _produceCssProperties(matchText, propertyName, valueProperty, valueMixin, rule) {\n    // handle case where property value is a mixin\n    if (valueProperty) {\n      // form: --mixin2: var(--mixin1), where --mixin1 is in the map\n      processVariableAndFallback(valueProperty, (prefix, value) => {\n        if (value && this._map.get(value)) {\n          valueMixin = `@apply ${value};`\n        }\n      });\n    }\n    if (!valueMixin) {\n      return matchText;\n    }\n    let mixinAsProperties = this._consumeCssProperties('' + valueMixin, rule);\n    let prefix = matchText.slice(0, matchText.indexOf('--'));\n    // `initial` and `inherit` as properties in a map should be replaced because\n    // these keywords are eagerly evaluated when the mixin becomes CSS Custom Properties,\n    // and would set the variable value, rather than carry the keyword to the `var()` usage.\n    let mixinValues = this._cssTextToMap(mixinAsProperties, true);\n    let combinedProps = mixinValues;\n    let mixinEntry = this._map.get(propertyName);\n    let oldProps = mixinEntry && mixinEntry.properties;\n    if (oldProps) {\n      // NOTE: since we use mixin, the map of properties is updated here\n      // and this is what we want.\n      combinedProps = Object.assign(Object.create(oldProps), mixinValues);\n    } else {\n      this._map.set(propertyName, combinedProps);\n    }\n    let out = [];\n    let p, v;\n    // set variables defined by current mixin\n    let needToInvalidate = false;\n    for (p in combinedProps) {\n      v = mixinValues[p];\n      // if property not defined by current mixin, set initial\n      if (v === undefined) {\n        v = 'initial';\n      }\n      if (oldProps && !(p in oldProps)) {\n        needToInvalidate = true;\n      }\n      out.push(`${propertyName}${MIXIN_VAR_SEP}${p}: ${v}`);\n    }\n    if (needToInvalidate) {\n      this._invalidateMixinEntry(mixinEntry);\n    }\n    if (mixinEntry) {\n      mixinEntry.properties = combinedProps;\n    }\n    // because the mixinMap is global, the mixin might conflict with\n    // a different scope's simple variable definition:\n    // Example:\n    // some style somewhere:\n    // --mixin1:{ ... }\n    // --mixin2: var(--mixin1);\n    // some other element:\n    // --mixin1: 10px solid red;\n    // --foo: var(--mixin1);\n    // In this case, we leave the original variable definition in place.\n    if (valueProperty) {\n      prefix = `${matchText};${prefix}`;\n    }\n    return `${prefix}${out.join('; ')};`;\n  }\n}\n\n/* exports */\n/* eslint-disable no-self-assign */\nApplyShim.prototype['detectMixin'] = ApplyShim.prototype.detectMixin;\nApplyShim.prototype['transformStyle'] = ApplyShim.prototype.transformStyle;\nApplyShim.prototype['transformCustomStyle'] = ApplyShim.prototype.transformCustomStyle;\nApplyShim.prototype['transformRules'] = ApplyShim.prototype.transformRules;\nApplyShim.prototype['transformRule'] = ApplyShim.prototype.transformRule;\nApplyShim.prototype['transformTemplate'] = ApplyShim.prototype.transformTemplate;\nApplyShim.prototype['_separator'] = MIXIN_VAR_SEP;\n/* eslint-enable no-self-assign */\nObject.defineProperty(ApplyShim.prototype, 'invalidCallback', {\n  /** @return {?function(string)} */\n  get() {\n    return invalidCallback;\n  },\n  /** @param {?function(string)} cb */\n  set(cb) {\n    invalidCallback = cb;\n  }\n});\n\nexport default ApplyShim;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n  // remove previous properties\n  for (let p in properties) {\n    // NOTE: for bc with shim, don't apply null values.\n    if (p === null) {\n      element.style.removeProperty(p);\n    } else {\n      element.style.setProperty(p, properties[p]);\n    }\n  }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n  /**\n   * @const {string}\n   */\n  const value = window.getComputedStyle(element).getPropertyValue(property);\n  if (!value) {\n    return '';\n  } else {\n    return value.trim();\n  }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n  const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n  // reset state of the regexes\n  MIXIN_MATCH.lastIndex = 0;\n  VAR_ASSIGN.lastIndex = 0;\n  return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n  let template = templateMap[elementName];\n  if (template) {\n    invalidateTemplate(template);\n  }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n  // default the current version to 0\n  template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n  // ensure the \"validating for\" flag exists\n  template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n  // increment the next version\n  template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    return templateIsValid(template);\n  }\n  return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n  return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    return templateIsValidating(template);\n  }\n  return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n  return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n  let template = templateMap[elementName];\n  startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n  // remember that the current \"next version\" is the reason for this validation cycle\n  template[VALIDATING_VERSION] = template[NEXT_VERSION];\n  // however, there only needs to be one async task to clear the counters\n  if (!template._validating) {\n    template._validating = true;\n    promise.then(function() {\n      // sync the current version to let future invalidations cause a refresh cycle\n      template[CURRENT_VERSION] = template[NEXT_VERSION];\n      template._validating = false;\n    });\n  }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n  for (let elementName in templateMap) {\n    let template = templateMap[elementName];\n    if (!templateIsValid(template)) {\n      return true;\n    }\n  }\n  return false;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ApplyShim from '../src/apply-shim.js';\nimport templateMap from '../src/template-map.js';\nimport {getIsExtends, toCssText, elementHasBuiltCss} from '../src/style-util.js';\nimport * as ApplyShimUtils from '../src/apply-shim-utils.js';\nimport {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';\nimport {CustomStyleInterfaceInterface} from '../src/custom-style-interface.js'; // eslint-disable-line no-unused-vars\nimport {nativeCssVariables, nativeShadow, cssBuild} from '../src/style-settings.js';\n\n/** @const {ApplyShim} */\nconst applyShim = new ApplyShim();\n\nclass ApplyShimInterface {\n  constructor() {\n    /** @type {?CustomStyleInterfaceInterface} */\n    this.customStyleInterface = null;\n    applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n  }\n  ensure() {\n    if (this.customStyleInterface) {\n      return;\n    }\n    if (window.ShadyCSS.CustomStyleInterface) {\n      this.customStyleInterface =\n          /** @type {!CustomStyleInterfaceInterface} */ (\n              window.ShadyCSS.CustomStyleInterface);\n      this.customStyleInterface['transformCallback'] = (style) => {\n        applyShim.transformCustomStyle(style);\n      };\n      this.customStyleInterface['validateCallback'] = () => {\n        requestAnimationFrame(() => {\n          if (this.customStyleInterface['enqueued']) {\n            this.flushCustomStyles();\n          }\n        });\n      }\n    }\n  }\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   */\n  prepareTemplate(template, elementName) {\n    this.ensure();\n    if (elementHasBuiltCss(template)) {\n      return;\n    }\n    templateMap[elementName] = template;\n    let ast = applyShim.transformTemplate(template, elementName);\n    // save original style ast to use for revalidating instances\n    template['_styleAst'] = ast;\n  }\n  flushCustomStyles() {\n    this.ensure();\n    if (!this.customStyleInterface) {\n      return;\n    }\n    let styles = this.customStyleInterface['processStyles']();\n    if (!this.customStyleInterface['enqueued']) {\n      return;\n    }\n    for (let i = 0; i < styles.length; i++ ) {\n      let cs = styles[i];\n      let style = this.customStyleInterface['getStyleForCustomStyle'](cs);\n      if (style) {\n        applyShim.transformCustomStyle(style);\n      }\n    }\n    this.customStyleInterface['enqueued'] = false;\n  }\n  /**\n   * @param {HTMLElement} element\n   * @param {Object=} properties\n   */\n  styleSubtree(element, properties) {\n    this.ensure();\n    if (properties) {\n      updateNativeProperties(element, properties);\n    }\n    if (element.shadowRoot) {\n      this.styleElement(element);\n      let shadowChildren =\n          /** @type {!ParentNode} */ (element.shadowRoot).children ||\n          element.shadowRoot.childNodes;\n      for (let i = 0; i < shadowChildren.length; i++) {\n        this.styleSubtree(/** @type {HTMLElement} */(shadowChildren[i]));\n      }\n    } else {\n      let children = element.children || element.childNodes;\n      for (let i = 0; i < children.length; i++) {\n        this.styleSubtree(/** @type {HTMLElement} */(children[i]));\n      }\n    }\n  }\n  /**\n   * @param {HTMLElement} element\n   */\n  styleElement(element) {\n    this.ensure();\n    let {is} = getIsExtends(element);\n    let template = templateMap[is];\n    if (template && elementHasBuiltCss(template)) {\n      return;\n    }\n    if (template && !ApplyShimUtils.templateIsValid(template)) {\n      // only revalidate template once\n      if (!ApplyShimUtils.templateIsValidating(template)) {\n        this.prepareTemplate(template, is);\n        ApplyShimUtils.startValidatingTemplate(template);\n      }\n      // update this element instance\n      let root = element.shadowRoot;\n      if (root) {\n        let style = /** @type {HTMLStyleElement} */(root.querySelector('style'));\n        if (style) {\n          // reuse the template's style ast, it has all the original css text\n          style['__cssRules'] = template['_styleAst'];\n          style.textContent = toCssText(template['_styleAst'])\n        }\n      }\n    }\n  }\n  /**\n   * @param {Object=} properties\n   */\n  styleDocument(properties) {\n    this.ensure();\n    this.styleSubtree(document.body, properties);\n  }\n}\n\nif (!window.ShadyCSS || !window.ShadyCSS.ScopingShim) {\n  const applyShimInterface = new ApplyShimInterface();\n  let CustomStyleInterface = window.ShadyCSS && window.ShadyCSS.CustomStyleInterface;\n\n  /** @suppress {duplicate} */\n  window.ShadyCSS = {\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplate(template, elementName, elementExtends) { // eslint-disable-line no-unused-vars\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.prepareTemplate(template, elementName);\n    },\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplateStyles(template, elementName, elementExtends) {\n      window.ShadyCSS.prepareTemplate(template, elementName, elementExtends);\n    },\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     */\n    prepareTemplateDom(template, elementName) {}, // eslint-disable-line no-unused-vars\n\n    /**\n     * @param {!HTMLElement} element\n     * @param {Object=} properties\n     */\n    styleSubtree(element, properties) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.styleSubtree(element, properties);\n    },\n\n    /**\n     * @param {!HTMLElement} element\n     */\n    styleElement(element) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.styleElement(element);\n    },\n\n    /**\n     * @param {Object=} properties\n     */\n    styleDocument(properties) {\n      applyShimInterface.flushCustomStyles();\n      applyShimInterface.styleDocument(properties);\n    },\n\n    /**\n     * @param {Element} element\n     * @param {string} property\n     * @return {string}\n     */\n    getComputedStyleValue(element, property) {\n      return getComputedStyleValue(element, property);\n    },\n\n    flushCustomStyles() {\n      applyShimInterface.flushCustomStyles();\n    },\n\n    nativeCss: nativeCssVariables,\n    nativeShadow: nativeShadow,\n    cssBuild: cssBuild\n  };\n\n  if (CustomStyleInterface) {\n    window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n  }\n}\n\nwindow.ShadyCSS.ApplyShim = applyShim;\n"]}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.html b/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.html
deleted file mode 100644
index a3919fa..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script src="custom-style-interface.min.js"></script>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.min.js b/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.min.js
deleted file mode 100644
index 2e7fd88..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.min.js
+++ /dev/null
@@ -1,15 +0,0 @@
-(function(){/*
-
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-'use strict';var c=null,f=window.HTMLImports&&window.HTMLImports.whenReady||null,g;function h(a){requestAnimationFrame(function(){f?f(a):(c||(c=new Promise(function(a){g=a}),"complete"===document.readyState?g():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&g()})),c.then(function(){a&&a()}))})};var k=null,l=null;function m(){this.customStyles=[];this.enqueued=!1;h(function(){window.ShadyCSS.flushCustomStyles&&window.ShadyCSS.flushCustomStyles()})}function n(a){!a.enqueued&&l&&(a.enqueued=!0,h(l))}m.prototype.c=function(a){a.__seenByShadyCSS||(a.__seenByShadyCSS=!0,this.customStyles.push(a),n(this))};m.prototype.b=function(a){if(a.__shadyCSSCachedStyle)return a.__shadyCSSCachedStyle;var b;a.getStyle?b=a.getStyle():b=a;return b};
-m.prototype.a=function(){for(var a=this.customStyles,b=0;b<a.length;b++){var d=a[b];if(!d.__shadyCSSCachedStyle){var e=this.b(d);e&&(e=e.__appliedElement||e,k&&k(e),d.__shadyCSSCachedStyle=e)}}return a};m.prototype.addCustomStyle=m.prototype.c;m.prototype.getStyleForCustomStyle=m.prototype.b;m.prototype.processStyles=m.prototype.a;
-Object.defineProperties(m.prototype,{transformCallback:{get:function(){return k},set:function(a){k=a}},validateCallback:{get:function(){return l},set:function(a){var b=!1;l||(b=!0);l=a;b&&n(this)}}});function p(a,b){for(var d in b)null===d?a.style.removeProperty(d):a.style.setProperty(d,b[d])};var q=!(window.ShadyDOM&&window.ShadyDOM.inUse),r;function t(a){r=a&&a.shimcssproperties?!1:q||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}var u;window.ShadyCSS&&void 0!==window.ShadyCSS.cssBuild&&(u=window.ShadyCSS.cssBuild);window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?r=window.ShadyCSS.nativeCss:window.ShadyCSS?(t(window.ShadyCSS),window.ShadyCSS=void 0):t(window.WebComponents&&window.WebComponents.flags);
-var v=r,w=u;var x=new m;window.ShadyCSS||(window.ShadyCSS={prepareTemplate:function(){},prepareTemplateDom:function(){},prepareTemplateStyles:function(){},styleSubtree:function(a,b){x.a();p(a,b)},styleElement:function(){x.a()},styleDocument:function(a){x.a();p(document.body,a)},getComputedStyleValue:function(a,b){return(a=window.getComputedStyle(a).getPropertyValue(b))?a.trim():""},flushCustomStyles:function(){},nativeCss:v,nativeShadow:q,cssBuild:w});window.ShadyCSS.CustomStyleInterface=x;}).call(this);
-
-//# sourceMappingURL=custom-style-interface.min.js.map
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.min.js.map b/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.min.js.map
deleted file mode 100644
index 722c51e..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/custom-style-interface.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["src/document-wait.js","src/custom-style-interface.js","src/common-utils.js","src/style-settings.js","entrypoints/custom-style-interface.js"],"names":["readyPromise","whenReady","window","resolveFn","documentWait","callback","requestAnimationFrame","Promise","resolve","document","readyState","addEventListener","then","transformFn","validateFn","constructor","CustomStyleInterface","enqueueDocumentValidation","addCustomStyle","style","push","getStyleForCustomStyle","customStyle","processStyles","cs","i","length","styleToTransform","prototype","Object","defineProperties","get","set","fn","needsEnqueue","updateNativeProperties","element","properties","p","removeProperty","setProperty","nativeShadow","nativeCssVariables_","calcCssVariables","settings","navigator","userAgent","match","CSS","supports","cssBuild","ShadyCSS","undefined","nativeCss","nativeCssVariables","module$src$style_settings.cssBuild","customStyleInterface","prepareTemplate","prepareTemplateDom","prepareTemplateStyles","styleSubtree","styleElement","styleDocument","body","getComputedStyleValue","property","value","getComputedStyle","getPropertyValue","trim","flushCustomStyles"],"mappings":"A;;;;;;;;;aAaA,IAAIA,EAAe,IAAnB,CAGIC,EAAYC,MAAA,YAAZD,EAAqCC,MAAA,YAAA,UAArCD,EAA2E,IAH/E,CAMIE,CAKWC,SAASA,EAAY,CAACC,CAAD,CAAW,CAC7CC,qBAAA,CAAsB,QAAQ,EAAG,CAC3BL,CAAJ,CACEA,CAAA,CAAUI,CAAV,CADF,EAGOL,CAYL,GAXEA,CACA,CADe,IAAIO,OAAJ,CAAY,QAAA,CAACC,CAAD,CAAa,CAACL,CAAA,CAAYK,CAAb,CAAzB,CACf,CAA4B,UAA5B,GAAIC,QAAAC,WAAJ,CACEP,CAAA,EADF,CAGEM,QAAAE,iBAAA,CAA0B,kBAA1B,CAA8C,QAAA,EAAM,CACtB,UAA5B,GAAIF,QAAAC,WAAJ,EACEP,CAAA,EAFgD,CAApD,CAOJ,EAAAH,CAAAY,KAAA,CAAkB,QAAQ,EAAE,CAAEP,CAAA,EAAYA,CAAA,EAAd,CAA5B,CAfF,CAD+B,CAAjC,CAD6C,C,CCD/C,IAAIQ,EAAc,IAAlB,CAGIC,EAAa,IAiBfC,SADmBC,EACR,EAAG,CAEZ,IAAA,aAAA,CAAuB,EACvB,KAAA,SAAA,CAAmB,CAAA,CAEnBZ,EAAA,CAAa,QAAA,EAAM,CACbF,MAAA,SAAA,kBAAJ,EACEA,MAAA,SAAA,kBAAA,EAFe,CAAnB,CALY,CAcde,QAAAA,EAAyBA,CAAzBA,CAAyBA,CAAGA,CACtBA,CAAAA,CAAAA,SAAJA,EAAyBH,CAAzBG,GAGAA,CAAAA,SACAA,CADmBA,CAAAA,CACnBA,CAAAb,CAAAa,CAAaH,CAAbG,CAJAA,CAD0BA,CAU5BC,CAAAA,UAAAA,EAAAA,CAAAA,QAAcA,CAACC,CAADD,CAAQA,CACfC,CAAAD,iBAALA,GACEC,CAAAD,iBAEAA,CAFqBA,CAAAA,CAErBA,CADAA,IAAAA,aAAAE,KAAAF,CAA0BC,CAA1BD,CACAA,CAAAD,CAAAC,CAAAA,IAAAA,CAHFA,CADoBA,CAWtBG,EAAAA,UAAAA,EAAAA,CAAAA,QAAsBA,CAACC,CAADD,CAAcA,CAClCA,GAAIC,CAAAD,sBAAJA,CACEA,MAAOC,EAAAD,sBAETA,KAAIF,CACAG,EAAAD,SAAJA,CACEF,CADFE,CACUC,CAAAD,SAAAA,EADVA,CAGEF,CAHFE,CAGUC,CAEVD,OAAOF,EAV2BE,CAepCE;CAAAA,UAAAA,EAAAA,CAAAA,QAAaA,EAAGA,CAEdA,IADAA,IAAMC,EAAKD,IAAAA,aAAXA,CACSE,EAAIF,CAAbA,CAAgBE,CAAhBF,CAAoBC,CAAAE,OAApBH,CAA+BE,CAAAF,EAA/BA,CAAoCA,CAClCA,IAAMD,EAAcE,CAAAD,CAAGE,CAAHF,CACpBA,IAAIA,CAAAD,CAAAC,sBAAJA,CAAAA,CAGAA,IAAMJ,EAAQI,IAAAF,EAAAE,CAA4BD,CAA5BC,CACVJ,EAAJI,GAGQI,CAINJ,CAJ0DJ,CAAAI,iBAI1DA,EAJuFJ,CAIvFI,CAHIV,CAGJU,EAFEV,CAAAU,CAAYI,CAAZJ,CAEFA,CAAAD,CAAAC,sBAAAA,CAA4BI,CAP9BJ,CAJAA,CAFkCA,CAgBpCA,MAAOC,EAlBOD,CAuBlBP,EAAAY,UAAA,eAAA,CAAmDZ,CAAAY,UAAAV,EACnDF,EAAAY,UAAA,uBAAA,CAA2DZ,CAAAY,UAAAP,EAC3DL,EAAAY,UAAA,cAAA,CAAkDZ,CAAAY,UAAAL,EAGlDM;MAAAC,iBAAA,CAAwBd,CAAAY,UAAxB,CAAwD,CACtD,kBAAqB,CAEnB,IAAAG,QAAG,EAAG,CACJ,MAAOlB,EADH,CAFa,CAMnB,IAAAmB,QAAG,CAACC,CAAD,CAAK,CACNpB,CAAA,CAAcoB,CADR,CANW,CADiC,CAWtD,iBAAoB,CAElB,IAAAF,QAAG,EAAG,CACJ,MAAOjB,EADH,CAFY,CASlB,IAAAkB,QAAG,CAACC,CAAD,CAAK,CACN,IAAIC,EAAe,CAAA,CACdpB,EAAL,GACEoB,CADF,CACiB,CAAA,CADjB,CAGApB,EAAA,CAAamB,CACTC,EAAJ,EACEjB,CAAA,CAAAA,IAAA,CAPI,CATU,CAXkC,CAAxD,C,CCvGOkB,QAASA,EAAsB,CAACC,CAAD,CAAUC,CAAV,CAAsB,CAE1D,IAAKC,IAAIA,CAAT,GAAcD,EAAd,CAEY,IAAV,GAAIC,CAAJ,CACEF,CAAAjB,MAAAoB,eAAA,CAA6BD,CAA7B,CADF,CAGEF,CAAAjB,MAAAqB,YAAA,CAA0BF,CAA1B,CAA6BD,CAAA,CAAWC,CAAX,CAA7B,CAPsD,C,CCNrD,IAAMG,EAAe,EAAEvC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHwC,CAKJC,SAASA,EAAgB,CAACC,CAAD,CAAW,CAEhCF,CAAA,CADEE,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwBH,CATxB,EASwC,EAASI,SAAAC,UAAAC,MAAA,CAA0B,2BAA1B,CAAT,EACpCC,CAAA9C,MAAA8C,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAgB7B,IAAIC,CACPhD,OAAAiD,SAAJ,EAAoDC,IAAAA,EAApD,GAAuBlD,MAAAiD,SAAAD,SAAvB,GACEA,CADF,CACahD,MAAAiD,SAAAD,SADb,CAIIhD,OAAAiD,SAAJ,EAAqDC,IAAAA,EAArD,GAAuBlD,MAAAiD,SAAAE,UAAvB,CACEX,CADF,CACwBxC,MAAAiD,SAAAE,UADxB,CAEWnD,MAAAiD,SAAJ,EACLR,CAAA,CAAiBzC,MAAAiD,SAAjB,CAEA,CAAAjD,MAAAiD,SAAA,CAAkBC,IAAAA,EAHb,EAKLT,CAAA,CAAiBzC,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK;IAAMoD,EAA4CZ,CAAlD,CAlBIa,EAAAL,C,CClBX,IAAMM,EAAuB,IAAIxC,CAE5Bd,OAAAiD,SAAL,GACEjD,MAAAiD,SADF,CACoB,CAMhB,gBAAAM,QAAe,EAAwC,EANvC,CAYhB,mBAAAC,QAAkB,EAAwB,EAZ1B,CAmBhB,sBAAAC,QAAqB,EAAwC,EAnB7C,CAyBhB,aAAAC,QAAY,CAACxB,CAAD,CAAUC,CAAV,CAAsB,CAChCmB,CAAAjC,EAAA,EACAY,EAAA,CAAuBC,CAAvB,CAAgCC,CAAhC,CAFgC,CAzBlB,CAiChB,aAAAwB,QAAY,EAAU,CACpBL,CAAAjC,EAAA,EADoB,CAjCN,CAwChB,cAAAuC,QAAa,CAACzB,CAAD,CAAa,CACxBmB,CAAAjC,EAAA,EACAY,EAAA,CAAuB1B,QAAAsD,KAAvB,CAAsC1B,CAAtC,CAFwB,CAxCV,CAkDhB,sBAAA2B,QAAqB,CAAC5B,CAAD,CAAU6B,CAAV,CAAoB,CACvC,MF9BJ,CADMC,CACN,CADchE,MAAAiE,iBAAA,CE+BmB/B,CF/BnB,CAAAgC,iBAAA,CE+B4BH,CF/B5B,CACd,EAGSC,CAAAG,KAAA,EAHT,CACS,EE4BkC,CAlDzB,CAsDhB,kBAAAC,QAAiB,EAAG,EAtDJ,CAuDhBjB,UAAWC,CAvDK,CAwDhBb,aAAcA,CAxDE,CAyDhBS,SAAUK,CAzDM,CADpB,CA8DArD,OAAAiD,SAAAnC,qBAAA,CAAuCwC","file":"custom-style-interface.min.js","sourcesContent":["/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {Promise<void>} */\nlet readyPromise = null;\n\n/** @type {?function(?function())} */\nlet whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;\n\n/** @type {function()} */\nlet resolveFn;\n\n/**\n * @param {?function()} callback\n */\nexport default function documentWait(callback) {\n  requestAnimationFrame(function() {\n    if (whenReady) {\n      whenReady(callback)\n    } else {\n      if (!readyPromise) {\n        readyPromise = new Promise((resolve) => {resolveFn = resolve});\n        if (document.readyState === 'complete') {\n          resolveFn();\n        } else {\n          document.addEventListener('readystatechange', () => {\n            if (document.readyState === 'complete') {\n              resolveFn();\n            }\n          });\n        }\n      }\n      readyPromise.then(function(){ callback && callback(); });\n    }\n  });\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport documentWait from './document-wait.js';\n\n/**\n * @typedef {HTMLStyleElement | {getStyle: function():HTMLStyleElement}}\n */\nexport let CustomStyleProvider;\n\nconst SEEN_MARKER = '__seenByShadyCSS';\nconst CACHED_STYLE = '__shadyCSSCachedStyle';\n\n/** @type {?function(!HTMLStyleElement)} */\nlet transformFn = null;\n\n/** @type {?function()} */\nlet validateFn = null;\n\n/**\nThis interface is provided to add document-level <style> elements to ShadyCSS for processing.\nThese styles must be processed by ShadyCSS to simulate ShadowRoot upper-bound encapsulation from outside styles\nIn addition, these styles may also need to be processed for @apply rules and CSS Custom Properties\n\nTo add document-level styles to ShadyCSS, one can call `ShadyCSS.addDocumentStyle(styleElement)` or `ShadyCSS.addDocumentStyle({getStyle: () => styleElement})`\n\nIn addition, if the process used to discover document-level styles can be synchronously flushed, one should set `ShadyCSS.documentStyleFlush`.\nThis function will be called when calculating styles.\n\nAn example usage of the document-level styling api can be found in `examples/document-style-lib.js`\n\n@unrestricted\n*/\nexport default class CustomStyleInterface {\n  constructor() {\n    /** @type {!Array<!CustomStyleProvider>} */\n    this['customStyles'] = [];\n    this['enqueued'] = false;\n    // NOTE(dfreedm): use quotes here to prevent closure inlining to `function(){}`;\n    documentWait(() => {\n      if (window['ShadyCSS']['flushCustomStyles']) {\n        window['ShadyCSS']['flushCustomStyles']();\n      }\n    })\n  }\n  /**\n   * Queue a validation for new custom styles to batch style recalculations\n   */\n  enqueueDocumentValidation() {\n    if (this['enqueued'] || !validateFn) {\n      return;\n    }\n    this['enqueued'] = true;\n    documentWait(validateFn);\n  }\n  /**\n   * @param {!HTMLStyleElement} style\n   */\n  addCustomStyle(style) {\n    if (!style[SEEN_MARKER]) {\n      style[SEEN_MARKER] = true;\n      this['customStyles'].push(style);\n      this.enqueueDocumentValidation();\n    }\n  }\n  /**\n   * @param {!CustomStyleProvider} customStyle\n   * @return {HTMLStyleElement}\n   */\n  getStyleForCustomStyle(customStyle) {\n    if (customStyle[CACHED_STYLE]) {\n      return customStyle[CACHED_STYLE];\n    }\n    let style;\n    if (customStyle['getStyle']) {\n      style = customStyle['getStyle']();\n    } else {\n      style = customStyle;\n    }\n    return style;\n  }\n  /**\n   * @return {!Array<!CustomStyleProvider>}\n   */\n  processStyles() {\n    const cs = this['customStyles'];\n    for (let i = 0; i < cs.length; i++) {\n      const customStyle = cs[i];\n      if (customStyle[CACHED_STYLE]) {\n        continue;\n      }\n      const style = this.getStyleForCustomStyle(customStyle);\n      if (style) {\n        // HTMLImports polyfill may have cloned the style into the main document,\n        // which is referenced with __appliedElement.\n        const styleToTransform = /** @type {!HTMLStyleElement} */(style['__appliedElement'] || style);\n        if (transformFn) {\n          transformFn(styleToTransform);\n        }\n        customStyle[CACHED_STYLE] = styleToTransform;\n      }\n    }\n    return cs;\n  }\n}\n\n/* eslint-disable no-self-assign */\nCustomStyleInterface.prototype['addCustomStyle'] = CustomStyleInterface.prototype.addCustomStyle;\nCustomStyleInterface.prototype['getStyleForCustomStyle'] = CustomStyleInterface.prototype.getStyleForCustomStyle;\nCustomStyleInterface.prototype['processStyles'] = CustomStyleInterface.prototype.processStyles;\n/* eslint-enable no-self-assign */\n\nObject.defineProperties(CustomStyleInterface.prototype, {\n  'transformCallback': {\n    /** @return {?function(!HTMLStyleElement)} */\n    get() {\n      return transformFn;\n    },\n    /** @param {?function(!HTMLStyleElement)} fn */\n    set(fn) {\n      transformFn = fn;\n    }\n  },\n  'validateCallback': {\n    /** @return {?function()} */\n    get() {\n      return validateFn;\n    },\n    /**\n     * @param {?function()} fn\n     * @this {CustomStyleInterface}\n     */\n    set(fn) {\n      let needsEnqueue = false;\n      if (!validateFn) {\n        needsEnqueue = true;\n      }\n      validateFn = fn;\n      if (needsEnqueue) {\n        this.enqueueDocumentValidation();\n      }\n    },\n  }\n})\n\n/** @typedef {{\n * customStyles: !Array<!CustomStyleProvider>,\n * addCustomStyle: function(!CustomStyleProvider),\n * getStyleForCustomStyle: function(!CustomStyleProvider): HTMLStyleElement,\n * findStyles: function(),\n * transformCallback: ?function(!HTMLStyleElement),\n * validateCallback: ?function()\n * }}\n */\nexport const CustomStyleInterfaceInterface = {};\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n  // remove previous properties\n  for (let p in properties) {\n    // NOTE: for bc with shim, don't apply null values.\n    if (p === null) {\n      element.style.removeProperty(p);\n    } else {\n      element.style.setProperty(p, properties[p]);\n    }\n  }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n  /**\n   * @const {string}\n   */\n  const value = window.getComputedStyle(element).getPropertyValue(property);\n  if (!value) {\n    return '';\n  } else {\n    return value.trim();\n  }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n  const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n  // reset state of the regexes\n  MIXIN_MATCH.lastIndex = 0;\n  VAR_ASSIGN.lastIndex = 0;\n  return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n  if (settings && settings['shimcssproperties']) {\n    nativeCssVariables_ = false;\n  } else {\n    // chrome 49 has semi-working css vars, check if box-shadow works\n    // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n    // However, shim css custom properties are only supported with ShadyDOM enabled,\n    // so fall back on native if we do not detect ShadyDOM\n    // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n    nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n      window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n  }\n}\n\n/** @type {string | undefined} */\nexport let cssBuild;\nif (window.ShadyCSS && window.ShadyCSS.cssBuild !== undefined) {\n  cssBuild = window.ShadyCSS.cssBuild;\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n  nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n  calcCssVariables(window.ShadyCSS);\n  // reset window variable to let ShadyCSS API take its place\n  window.ShadyCSS = undefined;\n} else {\n  calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport CustomStyleInterface from '../src/custom-style-interface.js';\nimport {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';\nimport {nativeCssVariables, nativeShadow, cssBuild} from '../src/style-settings.js';\n\nconst customStyleInterface = new CustomStyleInterface();\n\nif (!window.ShadyCSS) {\n  window.ShadyCSS = {\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplate(template, elementName, elementExtends) {}, // eslint-disable-line no-unused-vars\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     */\n    prepareTemplateDom(template, elementName) {}, // eslint-disable-line no-unused-vars\n\n    /**\n     * @param {!HTMLTemplateElement} template\n     * @param {string} elementName\n     * @param {string=} elementExtends\n     */\n    prepareTemplateStyles(template, elementName, elementExtends) {}, // eslint-disable-line no-unused-vars\n\n    /**\n     * @param {Element} element\n     * @param {Object=} properties\n     */\n    styleSubtree(element, properties) {\n      customStyleInterface.processStyles();\n      updateNativeProperties(element, properties);\n    },\n\n    /**\n     * @param {Element} element\n     */\n    styleElement(element) { // eslint-disable-line no-unused-vars\n      customStyleInterface.processStyles();\n    },\n\n    /**\n     * @param {Object=} properties\n     */\n    styleDocument(properties) {\n      customStyleInterface.processStyles();\n      updateNativeProperties(document.body, properties);\n    },\n\n    /**\n     * @param {Element} element\n     * @param {string} property\n     * @return {string}\n     */\n    getComputedStyleValue(element, property) {\n      return getComputedStyleValue(element, property);\n    },\n\n    flushCustomStyles() {},\n    nativeCss: nativeCssVariables,\n    nativeShadow: nativeShadow,\n    cssBuild: cssBuild\n  }\n}\n\nwindow.ShadyCSS.CustomStyleInterface = customStyleInterface;"]}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/apply-shim.js b/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/apply-shim.js
deleted file mode 100644
index 4921bec..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/apply-shim.js
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import ApplyShim from '../src/apply-shim.js';
-import templateMap from '../src/template-map.js';
-import {getIsExtends, toCssText, elementHasBuiltCss} from '../src/style-util.js';
-import * as ApplyShimUtils from '../src/apply-shim-utils.js';
-import {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';
-import {CustomStyleInterfaceInterface} from '../src/custom-style-interface.js'; // eslint-disable-line no-unused-vars
-import {nativeCssVariables, nativeShadow, cssBuild} from '../src/style-settings.js';
-
-/** @const {ApplyShim} */
-const applyShim = new ApplyShim();
-
-class ApplyShimInterface {
-  constructor() {
-    /** @type {?CustomStyleInterfaceInterface} */
-    this.customStyleInterface = null;
-    applyShim['invalidCallback'] = ApplyShimUtils.invalidate;
-  }
-  ensure() {
-    if (this.customStyleInterface) {
-      return;
-    }
-    if (window.ShadyCSS.CustomStyleInterface) {
-      this.customStyleInterface =
-          /** @type {!CustomStyleInterfaceInterface} */ (
-              window.ShadyCSS.CustomStyleInterface);
-      this.customStyleInterface['transformCallback'] = (style) => {
-        applyShim.transformCustomStyle(style);
-      };
-      this.customStyleInterface['validateCallback'] = () => {
-        requestAnimationFrame(() => {
-          if (this.customStyleInterface['enqueued']) {
-            this.flushCustomStyles();
-          }
-        });
-      }
-    }
-  }
-  /**
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   */
-  prepareTemplate(template, elementName) {
-    this.ensure();
-    if (elementHasBuiltCss(template)) {
-      return;
-    }
-    templateMap[elementName] = template;
-    let ast = applyShim.transformTemplate(template, elementName);
-    // save original style ast to use for revalidating instances
-    template['_styleAst'] = ast;
-  }
-  flushCustomStyles() {
-    this.ensure();
-    if (!this.customStyleInterface) {
-      return;
-    }
-    let styles = this.customStyleInterface['processStyles']();
-    if (!this.customStyleInterface['enqueued']) {
-      return;
-    }
-    for (let i = 0; i < styles.length; i++ ) {
-      let cs = styles[i];
-      let style = this.customStyleInterface['getStyleForCustomStyle'](cs);
-      if (style) {
-        applyShim.transformCustomStyle(style);
-      }
-    }
-    this.customStyleInterface['enqueued'] = false;
-  }
-  /**
-   * @param {HTMLElement} element
-   * @param {Object=} properties
-   */
-  styleSubtree(element, properties) {
-    this.ensure();
-    if (properties) {
-      updateNativeProperties(element, properties);
-    }
-    if (element.shadowRoot) {
-      this.styleElement(element);
-      let shadowChildren =
-          /** @type {!ParentNode} */ (element.shadowRoot).children ||
-          element.shadowRoot.childNodes;
-      for (let i = 0; i < shadowChildren.length; i++) {
-        this.styleSubtree(/** @type {HTMLElement} */(shadowChildren[i]));
-      }
-    } else {
-      let children = element.children || element.childNodes;
-      for (let i = 0; i < children.length; i++) {
-        this.styleSubtree(/** @type {HTMLElement} */(children[i]));
-      }
-    }
-  }
-  /**
-   * @param {HTMLElement} element
-   */
-  styleElement(element) {
-    this.ensure();
-    let {is} = getIsExtends(element);
-    let template = templateMap[is];
-    if (template && elementHasBuiltCss(template)) {
-      return;
-    }
-    if (template && !ApplyShimUtils.templateIsValid(template)) {
-      // only revalidate template once
-      if (!ApplyShimUtils.templateIsValidating(template)) {
-        this.prepareTemplate(template, is);
-        ApplyShimUtils.startValidatingTemplate(template);
-      }
-      // update this element instance
-      let root = element.shadowRoot;
-      if (root) {
-        let style = /** @type {HTMLStyleElement} */(root.querySelector('style'));
-        if (style) {
-          // reuse the template's style ast, it has all the original css text
-          style['__cssRules'] = template['_styleAst'];
-          style.textContent = toCssText(template['_styleAst'])
-        }
-      }
-    }
-  }
-  /**
-   * @param {Object=} properties
-   */
-  styleDocument(properties) {
-    this.ensure();
-    this.styleSubtree(document.body, properties);
-  }
-}
-
-if (!window.ShadyCSS || !window.ShadyCSS.ScopingShim) {
-  const applyShimInterface = new ApplyShimInterface();
-  let CustomStyleInterface = window.ShadyCSS && window.ShadyCSS.CustomStyleInterface;
-
-  /** @suppress {duplicate} */
-  window.ShadyCSS = {
-    /**
-     * @param {!HTMLTemplateElement} template
-     * @param {string} elementName
-     * @param {string=} elementExtends
-     */
-    prepareTemplate(template, elementName, elementExtends) { // eslint-disable-line no-unused-vars
-      applyShimInterface.flushCustomStyles();
-      applyShimInterface.prepareTemplate(template, elementName);
-    },
-
-    /**
-     * @param {!HTMLTemplateElement} template
-     * @param {string} elementName
-     * @param {string=} elementExtends
-     */
-    prepareTemplateStyles(template, elementName, elementExtends) {
-      window.ShadyCSS.prepareTemplate(template, elementName, elementExtends);
-    },
-
-    /**
-     * @param {!HTMLTemplateElement} template
-     * @param {string} elementName
-     */
-    prepareTemplateDom(template, elementName) {}, // eslint-disable-line no-unused-vars
-
-    /**
-     * @param {!HTMLElement} element
-     * @param {Object=} properties
-     */
-    styleSubtree(element, properties) {
-      applyShimInterface.flushCustomStyles();
-      applyShimInterface.styleSubtree(element, properties);
-    },
-
-    /**
-     * @param {!HTMLElement} element
-     */
-    styleElement(element) {
-      applyShimInterface.flushCustomStyles();
-      applyShimInterface.styleElement(element);
-    },
-
-    /**
-     * @param {Object=} properties
-     */
-    styleDocument(properties) {
-      applyShimInterface.flushCustomStyles();
-      applyShimInterface.styleDocument(properties);
-    },
-
-    /**
-     * @param {Element} element
-     * @param {string} property
-     * @return {string}
-     */
-    getComputedStyleValue(element, property) {
-      return getComputedStyleValue(element, property);
-    },
-
-    flushCustomStyles() {
-      applyShimInterface.flushCustomStyles();
-    },
-
-    nativeCss: nativeCssVariables,
-    nativeShadow: nativeShadow,
-    cssBuild: cssBuild
-  };
-
-  if (CustomStyleInterface) {
-    window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;
-  }
-}
-
-window.ShadyCSS.ApplyShim = applyShim;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/custom-style-interface.js b/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/custom-style-interface.js
deleted file mode 100644
index 6e9d96f..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/custom-style-interface.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import CustomStyleInterface from '../src/custom-style-interface.js';
-import {getComputedStyleValue, updateNativeProperties} from '../src/common-utils.js';
-import {nativeCssVariables, nativeShadow, cssBuild} from '../src/style-settings.js';
-
-const customStyleInterface = new CustomStyleInterface();
-
-if (!window.ShadyCSS) {
-  window.ShadyCSS = {
-    /**
-     * @param {!HTMLTemplateElement} template
-     * @param {string} elementName
-     * @param {string=} elementExtends
-     */
-    prepareTemplate(template, elementName, elementExtends) {}, // eslint-disable-line no-unused-vars
-
-    /**
-     * @param {!HTMLTemplateElement} template
-     * @param {string} elementName
-     */
-    prepareTemplateDom(template, elementName) {}, // eslint-disable-line no-unused-vars
-
-    /**
-     * @param {!HTMLTemplateElement} template
-     * @param {string} elementName
-     * @param {string=} elementExtends
-     */
-    prepareTemplateStyles(template, elementName, elementExtends) {}, // eslint-disable-line no-unused-vars
-
-    /**
-     * @param {Element} element
-     * @param {Object=} properties
-     */
-    styleSubtree(element, properties) {
-      customStyleInterface.processStyles();
-      updateNativeProperties(element, properties);
-    },
-
-    /**
-     * @param {Element} element
-     */
-    styleElement(element) { // eslint-disable-line no-unused-vars
-      customStyleInterface.processStyles();
-    },
-
-    /**
-     * @param {Object=} properties
-     */
-    styleDocument(properties) {
-      customStyleInterface.processStyles();
-      updateNativeProperties(document.body, properties);
-    },
-
-    /**
-     * @param {Element} element
-     * @param {string} property
-     * @return {string}
-     */
-    getComputedStyleValue(element, property) {
-      return getComputedStyleValue(element, property);
-    },
-
-    flushCustomStyles() {},
-    nativeCss: nativeCssVariables,
-    nativeShadow: nativeShadow,
-    cssBuild: cssBuild
-  }
-}
-
-window.ShadyCSS.CustomStyleInterface = customStyleInterface;
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/scoping-shim.js b/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/scoping-shim.js
deleted file mode 100644
index 8e35a17..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/entrypoints/scoping-shim.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import ScopingShim from '../src/scoping-shim.js';
-import {nativeCssVariables, nativeShadow, cssBuild} from '../src/style-settings.js';
-
-/** @const {ScopingShim} */
-const scopingShim = new ScopingShim();
-
-let ApplyShim, CustomStyleInterface;
-
-if (window['ShadyCSS']) {
-  ApplyShim = window['ShadyCSS']['ApplyShim'];
-  CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];
-}
-
-window.ShadyCSS = {
-  ScopingShim: scopingShim,
-  /**
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   * @param {string=} elementExtends
-   */
-  prepareTemplate(template, elementName, elementExtends) {
-    scopingShim.flushCustomStyles();
-    scopingShim.prepareTemplate(template, elementName, elementExtends)
-  },
-
-  /**
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   */
-  prepareTemplateDom(template, elementName) {
-    scopingShim.prepareTemplateDom(template, elementName);
-  },
-
-  /**
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   * @param {string=} elementExtends
-   */
-  prepareTemplateStyles(template, elementName, elementExtends) {
-    scopingShim.flushCustomStyles();
-    scopingShim.prepareTemplateStyles(template, elementName, elementExtends)
-  },
-  /**
-   * @param {!HTMLElement} element
-   * @param {Object=} properties
-   */
-  styleSubtree(element, properties) {
-    scopingShim.flushCustomStyles();
-    scopingShim.styleSubtree(element, properties);
-  },
-
-  /**
-   * @param {!HTMLElement} element
-   */
-  styleElement(element) {
-    scopingShim.flushCustomStyles();
-    scopingShim.styleElement(element);
-  },
-
-  /**
-   * @param {Object=} properties
-   */
-  styleDocument(properties) {
-    scopingShim.flushCustomStyles();
-    scopingShim.styleDocument(properties);
-  },
-
-  flushCustomStyles() {
-    scopingShim.flushCustomStyles();
-  },
-
-  /**
-   * @param {Element} element
-   * @param {string} property
-   * @return {string}
-   */
-  getComputedStyleValue(element, property) {
-    return scopingShim.getComputedStyleValue(element, property);
-  },
-
-  nativeCss: nativeCssVariables,
-
-  nativeShadow: nativeShadow,
-
-  cssBuild: cssBuild
-};
-
-if (ApplyShim) {
-  window.ShadyCSS.ApplyShim = ApplyShim;
-}
-
-if (CustomStyleInterface) {
-  window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;
-}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/examples/custom-style-element.js b/systrace/catapult/third_party/polymer/components/shadycss/examples/custom-style-element.js
deleted file mode 100644
index 0542e8a..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/examples/custom-style-element.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-Wrapper over <style> elements to co-operate with ShadyCSS
-
-Example:
-<custom-style>
-  <style>
-  ...
-  </style>
-</custom-style>
-*/
-(function() {
-  'use strict';
-
-  const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
-
-  class CustomStyle extends HTMLElement {
-    constructor() {
-      super();
-      this._style = null;
-      CustomStyleInterface.addCustomStyle(this);
-    }
-    getStyle() {
-      if (!this._style) {
-        this._style = this.querySelector('style');
-      }
-      return this._style;
-    }
-  }
-
-  window.CustomStyle = CustomStyle;
-  window.customElements.define('custom-style', CustomStyle);
-})();
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/examples/document-style-lib.js b/systrace/catapult/third_party/polymer/components/shadycss/examples/document-style-lib.js
deleted file mode 100644
index a1c032c..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/examples/document-style-lib.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-Example library for adding document-level styles to ShadyCSS
-
-After DOMContentLoaded, synchronously add all document document level styles.
-Then, start a MutationObserver for dynamically added styles.
-
-Caveat: ShadyCSS will add a `scope` attribute to styles it controls, so do not add those styles.
-*/
-(function() {
-  'use strict';
-
-  const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
-
-  function shouldAddDocumentStyle(n) {
-    return n.nodeType === Node.ELEMENT_NODE && n.localName === 'style' && !n.hasAttribute('scope');
-  }
-
-  function handler(mxns) {
-    for (let i = 0; i < mxns.length; i++) {
-      let mxn = mxns[i];
-      for (let j = 0; j < mxn.addedNodes.length; j++) {
-        let n = mxn.addedNodes[j];
-        if (shouldAddDocumentStyle(n)) {
-          CustomStyleInterface.addCustomStyle(n);
-        }
-      }
-    }
-  }
-
-  const observer = new MutationObserver(handler);
-
-  document.addEventListener('DOMContentLoaded', () => {
-    const candidates = document.querySelectorAll('custom-style');
-    for (let i = 0; i < candidates.length; i++) {
-      const candidate = candidates[i];
-      if (shouldAddDocumentStyle(candidate)) {
-        CustomStyleInterface.addCustomStyle(candidate);
-      }
-    }
-    observer.observe(document, {childList: true, subtree: true});
-  });
-
-  window.documentStyleFlush = () => {handler(observer.takeRecords())};
-})();
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/externs/shadycss-externs.js b/systrace/catapult/third_party/polymer/components/shadycss/externs/shadycss-externs.js
deleted file mode 100644
index 85b3058..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/externs/shadycss-externs.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/** @externs */
-
-/** @typedef {{
- * styleElement: function(!HTMLElement),
- * styleSubtree: function(!HTMLElement, Object<string, string>=),
- * prepareTemplate: function(!HTMLTemplateElement, string, string=),
- * prepareTemplateStyles: function(!HTMLTemplateElement, string, string=),
- * prepareTemplateDom: function(!HTMLTemplateElement, string),
- * styleDocument: function(Object<string, string>=),
- * flushCustomStyles: function(),
- * getComputedStyleValue: function(!Element, string): string,
- * ScopingShim: (Object|undefined),
- * ApplyShim: (Object|undefined),
- * CustomStyleInterface: (Object|undefined),
- * nativeCss: boolean,
- * nativeShadow: boolean,
- * cssBuild: (string | undefined),
- * }}
- */
-let ShadyCSSInterface; //eslint-disable-line no-unused-vars
-
-/**
- * @typedef {{
- * shimcssproperties: (boolean | undefined),
- * shimshadow: (boolean | undefined),
- * cssBuild: (string | undefined),
- * }}
- */
-let ShadyCSSOptions; //eslint-disable-line no-unused-vars
-
-/** @type {(ShadyCSSInterface | ShadyCSSOptions | undefined)} */
-window.ShadyCSS;
-
-/** @type {string|undefined} */
-Element.prototype.extends;
-
-/** @type {?Element|undefined} */
-Element.prototype._element;
-
-/** @type {string|undefined} */
-Element.prototype.__cssBuild;
-
-/** @type {boolean|undefined} */
-HTMLTemplateElement.prototype._validating;
-
-/** @type {boolean|undefined} */
-HTMLTemplateElement.prototype._prepared;
-
-/** @type {boolean|undefined} */
-HTMLTemplateElement.prototype._domPrepared;
-
-/** @type {?DocumentFragment|undefined} */
-HTMLTemplateElement.prototype._content;
-
-/** @type {?HTMLStyleElement|undefined} */
-HTMLTemplateElement.prototype._gatheredStyle;
-
-/** @type {?HTMLStyleElement|undefined} */
-HTMLTemplateElement.prototype._style;
-
-/**
- * @type {string | undefined}
- */
-DOMTokenList.prototype.value;
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/gulpfile.js b/systrace/catapult/third_party/polymer/components/shadycss/gulpfile.js
deleted file mode 100644
index 1451742..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/gulpfile.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-'use strict';
-
-/* eslint-env node */
-/* eslint-disable no-console */
-
-const gulp = require('gulp');
-const sourcemaps = require('gulp-sourcemaps');
-const del = require('del');
-const rename = require('gulp-rename');
-const rollup = require('rollup-stream');
-const buffer = require('vinyl-buffer');
-const source = require('vinyl-source-stream');
-const closure = require('google-closure-compiler').gulp();
-const size = require('gulp-size');
-
-const modules = [
-  'css-parse',
-  'custom-style-element',
-  'make-element',
-  'svg-in-shadow',
-  'style-util',
-  'style-transformer',
-  'style-settings'
-];
-
-const moduleTasks = modules.map((m) => {
-  gulp.task(`test-module-${m}`, () => {
-    return rollup({
-      entry: `tests/module/${m}.js`,
-      format: 'iife',
-      moduleName: m.replace(/-/g, '_')
-    })
-    .pipe(source(`${m}.js`, 'tests/module'))
-    .pipe(gulp.dest('./tests/module/generated'))
-  });
-  return `test-module-${m}`;
-});
-
-gulp.task('clean-test-modules', () => del(['tests/module/generated']));
-
-gulp.task('test-modules', gulp.series(['clean-test-modules', ...moduleTasks]));
-
-function closurify(entry) {
-  gulp.task(`closure-${entry}`, () => {
-    return gulp.src(['src/*.js', 'entrypoints/*.js'], {base: './'})
-    .pipe(sourcemaps.init())
-    .pipe(closure({
-      compilation_level: 'ADVANCED',
-      language_in: 'ES6_STRICT',
-      language_out: 'ES5_STRICT',
-      isolation_mode: 'IIFE',
-      assume_function_wrapper: true,
-      js_output_file: `${entry}.min.js`,
-      entry_point: `./entrypoints/${entry}.js`,
-      dependency_mode: 'STRICT',
-      warning_level: 'VERBOSE',
-      rewrite_polyfills: false,
-      externs: 'externs/shadycss-externs.js'
-    }))
-    .pipe(size({showFiles: true, showTotal: false, gzip: true}))
-    .pipe(sourcemaps.write('.'))
-    .pipe(gulp.dest('.'))
-  });
-  return `closure-${entry}`;
-}
-
-function debugify(entry) {
-  gulp.task(`debug-${entry}`, () => {
-    return rollup({
-      entry: `entrypoints/${entry}.js`,
-      format: 'iife',
-      moduleName: `${entry}`.replace(/-/g, '_'),
-    })
-    .pipe(source(`${entry}.js`, 'entrypoints'))
-    .pipe(buffer())
-    .pipe(sourcemaps.init({loadMaps: true}))
-    .pipe(rename(`${entry}.min.js`))
-    .pipe(size({showFiles: true, showTotal: false, gzip: true}))
-    .pipe(gulp.dest('./'))
-  });
-  return `debug-${entry}`;
-}
-
-const entrypoints = [
-  'scoping-shim',
-  'apply-shim',
-  'custom-style-interface'
-]
-
-let closureTasks = entrypoints.map((e) => closurify(e));
-let debugTasks = entrypoints.map((e) => debugify(e));
-
-gulp.task('closure', gulp.series([...closureTasks]));
-
-gulp.task('default', gulp.series('closure', 'test-modules'));
-
-gulp.task('debug', gulp.series([...debugTasks]));
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/package-lock.json b/systrace/catapult/third_party/polymer/components/shadycss/package-lock.json
deleted file mode 100644
index bfdb2fe..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/package-lock.json
+++ /dev/null
@@ -1,12144 +0,0 @@
-{
-  "name": "@webcomponents/shadycss",
-  "version": "1.7.1",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@babel/code-frame": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
-      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
-      "dev": true,
-      "requires": {
-        "@babel/highlight": "^7.0.0"
-      }
-    },
-    "@babel/core": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz",
-      "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/generator": "^7.1.2",
-        "@babel/helpers": "^7.1.2",
-        "@babel/parser": "^7.1.2",
-        "@babel/template": "^7.1.2",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.1.2",
-        "convert-source-map": "^1.1.0",
-        "debug": "^3.1.0",
-        "json5": "^0.5.0",
-        "lodash": "^4.17.10",
-        "resolve": "^1.3.2",
-        "semver": "^5.4.1",
-        "source-map": "^0.5.0"
-      }
-    },
-    "@babel/generator": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz",
-      "integrity": "sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.1.3",
-        "jsesc": "^2.5.1",
-        "lodash": "^4.17.10",
-        "source-map": "^0.5.0",
-        "trim-right": "^1.0.1"
-      }
-    },
-    "@babel/helper-annotate-as-pure": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
-      "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
-      "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-call-delegate": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz",
-      "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-hoist-variables": "^7.0.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-define-map": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz",
-      "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/types": "^7.0.0",
-        "lodash": "^4.17.10"
-      }
-    },
-    "@babel/helper-explode-assignable-expression": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
-      "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
-      "dev": true,
-      "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-function-name": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
-      "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-get-function-arity": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
-      "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz",
-      "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-member-expression-to-functions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
-      "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
-      "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz",
-      "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.0.0",
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0",
-        "lodash": "^4.17.10"
-      }
-    },
-    "@babel/helper-optimise-call-expression": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
-      "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
-      "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
-      "dev": true
-    },
-    "@babel/helper-regex": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz",
-      "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.10"
-      }
-    },
-    "@babel/helper-remap-async-to-generator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
-      "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-wrap-function": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz",
-      "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.0.0",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
-      "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
-      "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-wrap-function": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz",
-      "integrity": "sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helpers": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz",
-      "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.1.2",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.1.2"
-      }
-    },
-    "@babel/highlight": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
-      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.0.0",
-        "esutils": "^2.0.2",
-        "js-tokens": "^4.0.0"
-      }
-    },
-    "@babel/parser": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz",
-      "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==",
-      "dev": true
-    },
-    "@babel/plugin-external-helpers": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.0.0.tgz",
-      "integrity": "sha512-tZKTMdhZvTy0KCEX5EGQQm1RHr7jUa36q/yax1baEA0yZapVYmu10yW7LTqijITgSq416gPVjrcexiA6y4pJlA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz",
-      "integrity": "sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0",
-        "@babel/plugin-syntax-async-generators": "^7.0.0"
-      }
-    },
-    "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz",
-      "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-async-generators": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz",
-      "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-dynamic-import": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz",
-      "integrity": "sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-import-meta": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.0.0.tgz",
-      "integrity": "sha512-FEoGvhXVAiWzpDjyZIlBGzKyNk/lnRPy7aPke3PjVkiAY0QFsvFfkjUg5diRwVfowBA8SJqvFt0ZoXNSjl70hQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz",
-      "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-arrow-functions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz",
-      "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-async-to-generator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz",
-      "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0"
-      }
-    },
-    "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz",
-      "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-block-scoping": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz",
-      "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "lodash": "^4.17.10"
-      }
-    },
-    "@babel/plugin-transform-classes": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz",
-      "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-define-map": "^7.1.0",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.0.0",
-        "globals": "^11.1.0"
-      }
-    },
-    "@babel/plugin-transform-computed-properties": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz",
-      "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-destructuring": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz",
-      "integrity": "sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz",
-      "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz",
-      "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-for-of": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz",
-      "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-function-name": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz",
-      "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-instanceof": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0.tgz",
-      "integrity": "sha512-Dv6MtJZOjjGjnHlSwQVpYlwZBkPzaWX/1zoHUW82fmKmUNOp+XnYA1lCYCB+7RXkX8rBa6IuNZ9Y8u3MLJCxuQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-literals": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz",
-      "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-modules-amd": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz",
-      "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-object-super": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz",
-      "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.1.0"
-      }
-    },
-    "@babel/plugin-transform-parameters": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz",
-      "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-call-delegate": "^7.1.0",
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-regenerator": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz",
-      "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==",
-      "dev": true,
-      "requires": {
-        "regenerator-transform": "^0.13.3"
-      }
-    },
-    "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz",
-      "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-spread": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz",
-      "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-sticky-regex": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz",
-      "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-template-literals": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz",
-      "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz",
-      "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-unicode-regex": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz",
-      "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.0.0",
-        "regexpu-core": "^4.1.3"
-      }
-    },
-    "@babel/template": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz",
-      "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.1.2",
-        "@babel/types": "^7.1.2"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.1.4",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.4.tgz",
-      "integrity": "sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/generator": "^7.1.3",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.0.0",
-        "@babel/parser": "^7.1.3",
-        "@babel/types": "^7.1.3",
-        "debug": "^3.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.10"
-      }
-    },
-    "@babel/types": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz",
-      "integrity": "sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.10",
-        "to-fast-properties": "^2.0.0"
-      }
-    },
-    "@gulp-sourcemaps/identity-map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz",
-      "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=",
-      "dev": true,
-      "requires": {
-        "acorn": "^5.0.3",
-        "css": "^2.2.1",
-        "normalize-path": "^2.1.1",
-        "source-map": "^0.5.6",
-        "through2": "^2.0.3"
-      }
-    },
-    "@gulp-sourcemaps/map-sources": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
-      "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^2.0.1",
-        "through2": "^2.0.3"
-      }
-    },
-    "@polymer/esm-amd-loader": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@polymer/esm-amd-loader/-/esm-amd-loader-1.0.3.tgz",
-      "integrity": "sha512-j7fDIkNeR8cekqK2WRH5YV1VtIdPwqrgb5OzAN5QUIWEBkFj5OsxTvrkJiSaFgEMdKZoozs/vz+oq83Qehp4wA==",
-      "dev": true
-    },
-    "@polymer/polymer": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.0.5.tgz",
-      "integrity": "sha512-Zbmhtr5vZ3NoHWwFYLKI4ff7yfE6DZopI8vaS7HvmUIuNqsv/EpEDXfNEYjqePQmkMX5LU9OIKV1eX/+9aveow==",
-      "dev": true,
-      "requires": {
-        "@webcomponents/shadycss": "^1.2.0"
-      }
-    },
-    "@polymer/sinonjs": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
-      "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
-      "dev": true
-    },
-    "@polymer/test-fixture": {
-      "version": "3.0.0-pre.21",
-      "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-3.0.0-pre.21.tgz",
-      "integrity": "sha512-IxzUe6YzaORzUksafHAXHprV29YncOJgr0+1zNAifl0/f+cb5iAd4IWUrnsnVFHG5UGTLjvis5RgV6vvIZPDrA==",
-      "dev": true
-    },
-    "@types/babel-generator": {
-      "version": "6.25.2",
-      "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.2.tgz",
-      "integrity": "sha512-W7PQkeDlYOqJblfNeqZARwj4W8nO+ZhQQZksU8+wbaKuHeUdIVUAdREO/Qb0FfNr3CY5Sq1gNtqsyFeZfS3iSw==",
-      "dev": true,
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "@types/babel-traverse": {
-      "version": "6.25.4",
-      "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.4.tgz",
-      "integrity": "sha512-+/670NaZE7qPvdh8EtGds32/2uHFKE5JeS+7ePH6nGwF8Wj8r671/RkTiJQP2k22nFntWEb9xQ11MFj7xEqI0g==",
-      "dev": true,
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "@types/babel-types": {
-      "version": "6.25.2",
-      "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
-      "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
-      "dev": true
-    },
-    "@types/babylon": {
-      "version": "6.16.3",
-      "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.3.tgz",
-      "integrity": "sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug==",
-      "dev": true,
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "@types/bluebird": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.24.tgz",
-      "integrity": "sha512-YeQoDpq4Lm8ppSBqAnAeF/xy1cYp/dMTif2JFcvmAbETMRlvKHT2iLcWu+WyYiJO3b3Ivokwo7EQca/xfLVJmg==",
-      "dev": true
-    },
-    "@types/body-parser": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
-      "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==",
-      "dev": true,
-      "requires": {
-        "@types/connect": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/chai": {
-      "version": "4.1.7",
-      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz",
-      "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==",
-      "dev": true
-    },
-    "@types/chai-subset": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
-      "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
-      "dev": true,
-      "requires": {
-        "@types/chai": "*"
-      }
-    },
-    "@types/chalk": {
-      "version": "0.4.31",
-      "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
-      "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
-      "dev": true
-    },
-    "@types/clean-css": {
-      "version": "3.4.30",
-      "resolved": "http://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz",
-      "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=",
-      "dev": true
-    },
-    "@types/clone": {
-      "version": "0.1.30",
-      "resolved": "http://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
-      "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
-      "dev": true
-    },
-    "@types/compression": {
-      "version": "0.0.33",
-      "resolved": "http://registry.npmjs.org/@types/compression/-/compression-0.0.33.tgz",
-      "integrity": "sha1-ldxzOiM5qoRjgdfxN3eS0lU9wn0=",
-      "dev": true,
-      "requires": {
-        "@types/express": "*"
-      }
-    },
-    "@types/connect": {
-      "version": "3.4.32",
-      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
-      "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/content-type": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.2.tgz",
-      "integrity": "sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg==",
-      "dev": true
-    },
-    "@types/cssbeautify": {
-      "version": "0.3.1",
-      "resolved": "http://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
-      "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
-      "dev": true
-    },
-    "@types/doctrine": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
-      "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
-      "dev": true
-    },
-    "@types/escape-html": {
-      "version": "0.0.20",
-      "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-0.0.20.tgz",
-      "integrity": "sha512-6dhZJLbA7aOwkYB2GDGdIqJ20wmHnkDzaxV9PJXe7O02I2dSFTERzRB6JrX6cWKaS+VqhhY7cQUMCbO5kloFUw==",
-      "dev": true
-    },
-    "@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
-      "dev": true
-    },
-    "@types/events": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
-      "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
-      "dev": true
-    },
-    "@types/express": {
-      "version": "4.16.0",
-      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz",
-      "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==",
-      "dev": true,
-      "requires": {
-        "@types/body-parser": "*",
-        "@types/express-serve-static-core": "*",
-        "@types/serve-static": "*"
-      }
-    },
-    "@types/express-serve-static-core": {
-      "version": "4.16.0",
-      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz",
-      "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==",
-      "dev": true,
-      "requires": {
-        "@types/events": "*",
-        "@types/node": "*",
-        "@types/range-parser": "*"
-      }
-    },
-    "@types/freeport": {
-      "version": "1.0.21",
-      "resolved": "https://registry.npmjs.org/@types/freeport/-/freeport-1.0.21.tgz",
-      "integrity": "sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=",
-      "dev": true,
-      "optional": true
-    },
-    "@types/glob": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
-      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
-      "dev": true,
-      "requires": {
-        "@types/events": "*",
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/glob-stream": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
-      "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
-      "dev": true,
-      "requires": {
-        "@types/glob": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/gulp-if": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
-      "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "@types/vinyl": "*"
-      }
-    },
-    "@types/html-minifier": {
-      "version": "3.5.2",
-      "resolved": "http://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz",
-      "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==",
-      "dev": true,
-      "requires": {
-        "@types/clean-css": "*",
-        "@types/relateurl": "*",
-        "@types/uglify-js": "*"
-      }
-    },
-    "@types/is-windows": {
-      "version": "0.2.0",
-      "resolved": "http://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
-      "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
-      "dev": true
-    },
-    "@types/launchpad": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/@types/launchpad/-/launchpad-0.6.0.tgz",
-      "integrity": "sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=",
-      "dev": true,
-      "optional": true
-    },
-    "@types/mime": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz",
-      "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==",
-      "dev": true
-    },
-    "@types/minimatch": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
-      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
-      "dev": true
-    },
-    "@types/mz": {
-      "version": "0.0.29",
-      "resolved": "http://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
-      "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
-      "dev": true,
-      "requires": {
-        "@types/bluebird": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/node": {
-      "version": "10.12.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.1.tgz",
-      "integrity": "sha512-i1sl+WCX2OCHeUi9oi7PiCNUtYFrpWhpcx878vpeq/tlZTKzcFdHePlyFHVbWqeuKN0SRPl/9ZFDSTsfv9h7VQ==",
-      "dev": true
-    },
-    "@types/opn": {
-      "version": "3.0.28",
-      "resolved": "http://registry.npmjs.org/@types/opn/-/opn-3.0.28.tgz",
-      "integrity": "sha1-CX0NHJtXSVc6XZbfEyOHu20CEYo=",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/parse5": {
-      "version": "2.2.34",
-      "resolved": "http://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
-      "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/path-is-inside": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/@types/path-is-inside/-/path-is-inside-1.0.0.tgz",
-      "integrity": "sha512-hfnXRGugz+McgX2jxyy5qz9sB21LRzlGn24zlwN2KEgoPtEvjzNRrLtUkOOebPDPZl3Rq7ywKxYvylVcEZDnEw==",
-      "dev": true
-    },
-    "@types/pem": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.3.tgz",
-      "integrity": "sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==",
-      "dev": true
-    },
-    "@types/range-parser": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz",
-      "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==",
-      "dev": true
-    },
-    "@types/relateurl": {
-      "version": "0.2.28",
-      "resolved": "http://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz",
-      "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=",
-      "dev": true
-    },
-    "@types/resolve": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
-      "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/serve-static": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz",
-      "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==",
-      "dev": true,
-      "requires": {
-        "@types/express-serve-static-core": "*",
-        "@types/mime": "*"
-      }
-    },
-    "@types/spdy": {
-      "version": "3.4.4",
-      "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
-      "integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/ua-parser-js": {
-      "version": "0.7.32",
-      "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
-      "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg==",
-      "dev": true
-    },
-    "@types/uglify-js": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz",
-      "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "@types/uuid": {
-      "version": "3.4.4",
-      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.4.tgz",
-      "integrity": "sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/vinyl": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
-      "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/vinyl-fs": {
-      "version": "2.4.9",
-      "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.9.tgz",
-      "integrity": "sha512-Q0EXd6c1fORjiOuK4ZaKdfFcMyFzJlTi56dqktwaWVLIDAzE49wUs3bKnYbZwzyMWoH+NcMWnRuR73S9A0jnRA==",
-      "dev": true,
-      "requires": {
-        "@types/events": "*",
-        "@types/glob-stream": "*",
-        "@types/node": "*",
-        "@types/vinyl": "*"
-      }
-    },
-    "@types/whatwg-url": {
-      "version": "6.4.0",
-      "resolved": "http://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-6.4.0.tgz",
-      "integrity": "sha512-tonhlcbQ2eho09am6RHnHOgvtDfDYINd5rgxD+2YSkKENooVCFsWizJz139MQW/PV8FfClyKrNe9ZbdHrSCxGg==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@types/winston": {
-      "version": "2.4.4",
-      "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz",
-      "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==",
-      "dev": true,
-      "requires": {
-        "winston": "*"
-      }
-    },
-    "@webcomponents/custom-elements": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.2.1.tgz",
-      "integrity": "sha512-flmTp4rVbBkcUIF3eBO3LNoAaYvleTdhPZKzdzr6iztWLLrxCctcK+7MAQeC3/SPjc3JDdC3jYLMRF4R6C3f9g==",
-      "dev": true
-    },
-    "@webcomponents/html-imports": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@webcomponents/html-imports/-/html-imports-1.2.0.tgz",
-      "integrity": "sha512-EIy8RqSfsoJ5Tk2wsfaSX4IKhXg8oYCq/xVEz8LEELXhv5tup/iZ/SInoz8SLtZGFP+vjUh2oRsgkUMhbrr0GQ==",
-      "dev": true
-    },
-    "@webcomponents/shadycss": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.5.2.tgz",
-      "integrity": "sha512-0OyrmVc7S+INtzoqP2ofAo+OdVn2Nj0Qvq4wD9FEGN7nMmLRxaD2mzy6hD6EslzxUSuGH302CDU4KXiY66SEqg==",
-      "dev": true
-    },
-    "@webcomponents/shadydom": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@webcomponents/shadydom/-/shadydom-1.1.2.tgz",
-      "integrity": "sha512-au9UMKTgs881UITNZfo6RqoIh4q7K3k/CeXAwcK6qbsb/0NF52X4SWVG/Yeb95hbTrDvH0IlVp6kaGJlpn4P3g==",
-      "dev": true
-    },
-    "@webcomponents/template": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@webcomponents/template/-/template-1.4.0.tgz",
-      "integrity": "sha512-HJfhAxCD+DZmtm8oCALtvyOL9JlisSDqwE/4FWfaxq4SK3gUIp/2eUjLE6zqt9n6VHeo1zQjMTOA4fKKF6qSQg==",
-      "dev": true
-    },
-    "@webcomponents/webcomponents-platform": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@webcomponents/webcomponents-platform/-/webcomponents-platform-1.0.0.tgz",
-      "integrity": "sha1-iHkUY4DdvsuGF+MiSX1Z53w/9Gg=",
-      "dev": true
-    },
-    "@webcomponents/webcomponentsjs": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.7.tgz",
-      "integrity": "sha512-011DyXjpQoZ7f6oMCpYTYgrzsWJ7+0fEbt6Y8KcfZZa3ZdJ/ttoMgeH75SqHDe7aNdolfMhCvrSNNgh9wcsgpA==",
-      "dev": true
-    },
-    "accepts": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
-      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
-      "dev": true,
-      "requires": {
-        "mime-types": "~2.1.18",
-        "negotiator": "0.6.1"
-      }
-    },
-    "accessibility-developer-tools": {
-      "version": "2.12.0",
-      "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
-      "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
-      "dev": true
-    },
-    "acorn": {
-      "version": "5.5.3",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
-      "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz",
-      "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==",
-      "dev": true
-    },
-    "adm-zip": {
-      "version": "0.4.11",
-      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz",
-      "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==",
-      "dev": true,
-      "optional": true
-    },
-    "after": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
-      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
-      "dev": true
-    },
-    "agent-base": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
-      "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "es6-promisify": "^5.0.0"
-      },
-      "dependencies": {
-        "es6-promisify": {
-          "version": "5.0.0",
-          "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
-          "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "es6-promise": "^4.0.3"
-          }
-        }
-      }
-    },
-    "ajv": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
-      "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^2.0.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "dev": true
-    },
-    "ansi-align": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
-      "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
-      "dev": true,
-      "requires": {
-        "string-width": "^2.0.0"
-      }
-    },
-    "ansi-colors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "^0.1.0"
-      }
-    },
-    "ansi-cyan": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
-      "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-escapes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
-      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
-      "dev": true
-    },
-    "ansi-gray": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
-      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-red": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
-      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-      "dev": true
-    },
-    "ansi-wrap": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
-      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
-      "dev": true
-    },
-    "any-promise": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
-      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
-      "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "append-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
-      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
-      "dev": true,
-      "requires": {
-        "buffer-equal": "^1.0.0"
-      }
-    },
-    "append-field": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
-      "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=",
-      "dev": true
-    },
-    "archiver": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz",
-      "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=",
-      "dev": true,
-      "requires": {
-        "archiver-utils": "^1.3.0",
-        "async": "^2.0.0",
-        "buffer-crc32": "^0.2.1",
-        "glob": "^7.0.0",
-        "lodash": "^4.8.0",
-        "readable-stream": "^2.0.0",
-        "tar-stream": "^1.5.0",
-        "zip-stream": "^1.2.0"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        }
-      }
-    },
-    "archiver-utils": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
-      "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.0",
-        "graceful-fs": "^4.1.0",
-        "lazystream": "^1.0.0",
-        "lodash": "^4.8.0",
-        "normalize-path": "^2.0.0",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "archy": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
-      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
-      "dev": true
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "argv-tools": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
-      "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
-      "dev": true,
-      "requires": {
-        "array-back": "^2.0.0",
-        "find-replace": "^2.0.1"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-filter": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
-      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-map": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
-      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
-    "array-back": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
-      "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
-      "dev": true,
-      "requires": {
-        "typical": "^2.6.1"
-      }
-    },
-    "array-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
-      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
-      "dev": true
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true
-    },
-    "array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
-      "dev": true
-    },
-    "array-initial": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
-      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
-      "dev": true,
-      "requires": {
-        "array-slice": "^1.0.0",
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "array-last": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
-      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "array-slice": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
-      "dev": true
-    },
-    "array-sort": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
-      "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
-      "dev": true,
-      "requires": {
-        "default-compare": "^1.0.0",
-        "get-value": "^2.0.6",
-        "kind-of": "^5.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "arraybuffer.slice": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
-      "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
-      "dev": true
-    },
-    "arrify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-      "dev": true
-    },
-    "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
-    },
-    "assertion-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
-      "dev": true
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "async": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-      "dev": true
-    },
-    "async-done": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz",
-      "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.2",
-        "process-nextick-args": "^1.0.7",
-        "stream-exhaust": "^1.0.1"
-      },
-      "dependencies": {
-        "process-nextick-args": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
-          "dev": true
-        }
-      }
-    },
-    "async-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
-      "dev": true
-    },
-    "async-limiter": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
-      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
-      "dev": true
-    },
-    "async-settle": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
-      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
-      "dev": true,
-      "requires": {
-        "async-done": "^1.2.2"
-      }
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
-      "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
-      "dev": true
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
-    },
-    "aws4": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
-      "dev": true
-    },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "js-tokens": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-      "dev": true,
-      "requires": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
-          "dev": true
-        }
-      }
-    },
-    "babel-helper-evaluate-path": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.4.3.tgz",
-      "integrity": "sha1-ComvcCwGshcCf6NxkI3UmJ0+Yz8=",
-      "dev": true
-    },
-    "babel-helper-flip-expressions": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz",
-      "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=",
-      "dev": true
-    },
-    "babel-helper-is-nodes-equiv": {
-      "version": "0.0.1",
-      "resolved": "http://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
-      "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
-      "dev": true
-    },
-    "babel-helper-is-void-0": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz",
-      "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=",
-      "dev": true
-    },
-    "babel-helper-mark-eval-scopes": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz",
-      "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=",
-      "dev": true
-    },
-    "babel-helper-remove-or-void": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz",
-      "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=",
-      "dev": true
-    },
-    "babel-helper-to-multiple-sequence-expressions": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.4.3.tgz",
-      "integrity": "sha1-W1GLESf0ezA4dzOGoVYaK0jmMrY=",
-      "dev": true
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-minify-builtins": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.4.3.tgz",
-      "integrity": "sha1-nqPVn0rEp7uVjXEtKVVqH4b3+B4=",
-      "dev": true,
-      "requires": {
-        "babel-helper-evaluate-path": "^0.4.3"
-      }
-    },
-    "babel-plugin-minify-constant-folding": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.4.3.tgz",
-      "integrity": "sha1-MA+d6N2ghEoXaxk2U5YOJK0z4ZE=",
-      "dev": true,
-      "requires": {
-        "babel-helper-evaluate-path": "^0.4.3"
-      }
-    },
-    "babel-plugin-minify-dead-code-elimination": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.4.3.tgz",
-      "integrity": "sha1-c2KCZYZPkAjQAnUG9Yq+s8HQLZg=",
-      "dev": true,
-      "requires": {
-        "babel-helper-evaluate-path": "^0.4.3",
-        "babel-helper-mark-eval-scopes": "^0.4.3",
-        "babel-helper-remove-or-void": "^0.4.3",
-        "lodash.some": "^4.6.0"
-      }
-    },
-    "babel-plugin-minify-flip-comparisons": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz",
-      "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=",
-      "dev": true,
-      "requires": {
-        "babel-helper-is-void-0": "^0.4.3"
-      }
-    },
-    "babel-plugin-minify-guarded-expressions": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.1.tgz",
-      "integrity": "sha1-ylpZoGvBwi3Vz9mWpnUWOm9hm30=",
-      "dev": true,
-      "requires": {
-        "babel-helper-flip-expressions": "^0.4.1"
-      }
-    },
-    "babel-plugin-minify-infinity": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz",
-      "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=",
-      "dev": true
-    },
-    "babel-plugin-minify-mangle-names": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.4.3.tgz",
-      "integrity": "sha1-FvG/90t6fJPfwkHngx3V+0sCPvc=",
-      "dev": true,
-      "requires": {
-        "babel-helper-mark-eval-scopes": "^0.4.3"
-      }
-    },
-    "babel-plugin-minify-numeric-literals": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz",
-      "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=",
-      "dev": true
-    },
-    "babel-plugin-minify-replace": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.4.3.tgz",
-      "integrity": "sha1-nSifS6FdTmAR6HmfpfG6d+yBIZ0=",
-      "dev": true
-    },
-    "babel-plugin-minify-simplify": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.4.3.tgz",
-      "integrity": "sha1-N3VthcYURktLCSfytOQXGR1Vc4o=",
-      "dev": true,
-      "requires": {
-        "babel-helper-flip-expressions": "^0.4.3",
-        "babel-helper-is-nodes-equiv": "^0.0.1",
-        "babel-helper-to-multiple-sequence-expressions": "^0.4.3"
-      }
-    },
-    "babel-plugin-minify-type-constructors": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz",
-      "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=",
-      "dev": true,
-      "requires": {
-        "babel-helper-is-void-0": "^0.4.3"
-      }
-    },
-    "babel-plugin-transform-inline-consecutive-adds": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz",
-      "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=",
-      "dev": true
-    },
-    "babel-plugin-transform-member-expression-literals": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-Jy69Ki1DQbhsJNzYQ3SuWqNwKHQ=",
-      "dev": true
-    },
-    "babel-plugin-transform-merge-sibling-variables": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-SKMw0oKT4xjQcXXCYMdIWec5i0M=",
-      "dev": true
-    },
-    "babel-plugin-transform-minify-booleans": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-He72nCITUDipHeH10T11njRkxDw=",
-      "dev": true
-    },
-    "babel-plugin-transform-property-literals": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-NxJ6qgQSXD0Iv5XNtajx0uRMpFM=",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "babel-plugin-transform-regexp-constructors": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz",
-      "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=",
-      "dev": true
-    },
-    "babel-plugin-transform-remove-console": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-xXF6+fdpGLKCHPrvRNgkXU6pQiw=",
-      "dev": true
-    },
-    "babel-plugin-transform-remove-debugger": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-H8NcKcfAh4zzDlWKczZRkG6IjkQ=",
-      "dev": true
-    },
-    "babel-plugin-transform-remove-undefined": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.4.3.tgz",
-      "integrity": "sha1-1AsNp/kcCMBsxyt2dHTAHEiU3gI=",
-      "dev": true,
-      "requires": {
-        "babel-helper-evaluate-path": "^0.4.3"
-      }
-    },
-    "babel-plugin-transform-simplify-comparison-operators": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-9UmabcPtaGvaUzY4ZrZ92ndMW+0=",
-      "dev": true
-    },
-    "babel-plugin-transform-undefined-to-void": {
-      "version": "6.10.0-alpha.f95869d4",
-      "resolved": "http://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.10.0-alpha.f95869d4.tgz",
-      "integrity": "sha1-F1oaMJDmFkA/jIGc3Ooa7LZlI7I=",
-      "dev": true
-    },
-    "babel-preset-minify": {
-      "version": "0.4.0-alpha.caaefb4c",
-      "resolved": "http://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.4.0-alpha.caaefb4c.tgz",
-      "integrity": "sha1-pQUsWVXdl9JGmbKB/amjAuqMGHE=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-minify-builtins": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-constant-folding": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-dead-code-elimination": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-flip-comparisons": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-guarded-expressions": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-infinity": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-mangle-names": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-numeric-literals": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-replace": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-simplify": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-minify-type-constructors": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-transform-inline-consecutive-adds": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-transform-member-expression-literals": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-merge-sibling-variables": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-minify-booleans": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-property-literals": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-regexp-constructors": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-transform-remove-console": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-remove-debugger": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-remove-undefined": "^0.4.0-alpha.caaefb4c",
-        "babel-plugin-transform-simplify-comparison-operators": "^6.10.0-alpha.caaefb4c",
-        "babel-plugin-transform-undefined-to-void": "^6.10.0-alpha.caaefb4c",
-        "lodash.isplainobject": "^4.0.6"
-      }
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      },
-      "dependencies": {
-        "babylon": {
-          "version": "6.18.0",
-          "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-          "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
-          "dev": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "globals": {
-          "version": "9.18.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-          "dev": true
-        }
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      },
-      "dependencies": {
-        "to-fast-properties": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-          "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
-          "dev": true
-        }
-      }
-    },
-    "babylon": {
-      "version": "7.0.0-beta.47",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz",
-      "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==",
-      "dev": true
-    },
-    "bach": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
-      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
-      "dev": true,
-      "requires": {
-        "arr-filter": "^1.1.1",
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "array-each": "^1.0.0",
-        "array-initial": "^1.0.0",
-        "array-last": "^1.1.1",
-        "async-done": "^1.2.2",
-        "async-settle": "^1.0.0",
-        "now-and-later": "^2.0.0"
-      }
-    },
-    "backo2": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
-      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "base64-arraybuffer": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
-      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
-      "dev": true
-    },
-    "base64-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
-      "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
-      "dev": true
-    },
-    "base64id": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
-      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
-      "dev": true
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "better-assert": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
-      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
-      "dev": true,
-      "requires": {
-        "callsite": "1.0.0"
-      }
-    },
-    "binary-extensions": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
-      "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
-      "dev": true
-    },
-    "bl": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
-      "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.5"
-      }
-    },
-    "blob": {
-      "version": "0.0.4",
-      "resolved": "http://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
-      "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
-      "dev": true
-    },
-    "body-parser": {
-      "version": "1.18.3",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
-      "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
-      "dev": true,
-      "requires": {
-        "bytes": "3.0.0",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "http-errors": "~1.6.3",
-        "iconv-lite": "0.4.23",
-        "on-finished": "~2.3.0",
-        "qs": "6.5.2",
-        "raw-body": "2.3.3",
-        "type-is": "~1.6.16"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.4.23",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
-          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        }
-      }
-    },
-    "boom": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
-      "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
-      "dev": true,
-      "requires": {
-        "hoek": "4.x.x"
-      }
-    },
-    "bower-config": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-1.4.1.tgz",
-      "integrity": "sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.3",
-        "mout": "^1.0.0",
-        "optimist": "^0.6.1",
-        "osenv": "^0.1.3",
-        "untildify": "^2.1.0"
-      }
-    },
-    "boxen": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
-      "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
-      "dev": true,
-      "requires": {
-        "ansi-align": "^2.0.0",
-        "camelcase": "^4.0.0",
-        "chalk": "^2.0.1",
-        "cli-boxes": "^1.0.0",
-        "string-width": "^2.0.0",
-        "term-size": "^1.2.0",
-        "widest-line": "^2.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
-          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
-          "dev": true
-        }
-      }
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
-      "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "kind-of": "^6.0.2",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "browser-capabilities": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-1.1.2.tgz",
-      "integrity": "sha512-T9BTu9Lmdrh9XZe0XnUY3jGiBlB0jAkl4M9qvt+1SszqlckgcUTzJuBwD6HNNKjdiDA+18KfiIUJEVxTY2W24g==",
-      "dev": true,
-      "requires": {
-        "@types/ua-parser-js": "^0.7.31",
-        "ua-parser-js": "^0.7.15"
-      }
-    },
-    "browser-stdout": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
-      "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
-      "dev": true
-    },
-    "browserstack": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz",
-      "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "https-proxy-agent": "^2.2.1"
-      }
-    },
-    "buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
-      "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
-      "dev": true,
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "buffer-alloc": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
-      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
-      "dev": true,
-      "requires": {
-        "buffer-alloc-unsafe": "^1.1.0",
-        "buffer-fill": "^1.0.0"
-      }
-    },
-    "buffer-alloc-unsafe": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
-      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
-      "dev": true
-    },
-    "buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
-      "dev": true
-    },
-    "buffer-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
-      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
-      "dev": true
-    },
-    "buffer-fill": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
-      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
-      "dev": true
-    },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
-      "dev": true
-    },
-    "busboy": {
-      "version": "0.2.14",
-      "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
-      "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
-      "dev": true,
-      "requires": {
-        "dicer": "0.2.5",
-        "readable-stream": "1.1.x"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "1.1.14",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "0.0.1",
-            "string_decoder": "~0.10.x"
-          }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        }
-      }
-    },
-    "bytes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
-      "dev": true
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "caller-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
-      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
-      "dev": true,
-      "requires": {
-        "callsites": "^0.2.0"
-      }
-    },
-    "callsite": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
-      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
-      "dev": true
-    },
-    "callsites": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
-      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
-      "dev": true
-    },
-    "camel-case": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
-      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
-      "dev": true,
-      "requires": {
-        "no-case": "^2.2.0",
-        "upper-case": "^1.1.1"
-      }
-    },
-    "camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-      "dev": true
-    },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      }
-    },
-    "cancel-token": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
-      "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
-      "dev": true,
-      "requires": {
-        "@types/node": "^4.0.30"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "4.9.0",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-4.9.0.tgz",
-          "integrity": "sha512-xUFkZ+er9gUGw0x9qyfmr/Th0LuX6IB0m7HrRMB6sO6vcBVRFZ/3YV1EeiOC2fG50RX09avDfKwGBHOnPVxFeg==",
-          "dev": true
-        }
-      }
-    },
-    "capture-stack-trace": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
-      "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
-      "dev": true
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
-    },
-    "chai": {
-      "version": "3.5.0",
-      "resolved": "http://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
-      "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
-      "dev": true,
-      "requires": {
-        "assertion-error": "^1.0.1",
-        "deep-eql": "^0.1.3",
-        "type-detect": "^1.0.0"
-      }
-    },
-    "chalk": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-      "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "chardet": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
-      "dev": true
-    },
-    "charenc": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
-      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
-      "dev": true
-    },
-    "chokidar": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
-      "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.0",
-        "braces": "^2.3.0",
-        "fsevents": "^1.2.2",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.1",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "lodash.debounce": "^4.0.8",
-        "normalize-path": "^2.1.1",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.0.0",
-        "upath": "^1.0.5"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "3.1.0",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^2.1.0"
-              }
-            }
-          }
-        },
-        "is-glob": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
-          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.1"
-          }
-        }
-      }
-    },
-    "ci-info": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
-      "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
-      "dev": true
-    },
-    "circular-json": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
-      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
-      "dev": true
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "clean-css": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
-      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
-      "dev": true,
-      "requires": {
-        "source-map": "~0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "cleankill": {
-      "version": "2.0.0",
-      "resolved": "http://registry.npmjs.org/cleankill/-/cleankill-2.0.0.tgz",
-      "integrity": "sha1-WYMN/ItBHVPccq0J1Fp46jMWGpE=",
-      "dev": true
-    },
-    "cli-boxes": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
-      "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
-      "dev": true
-    },
-    "cli-cursor": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
-      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
-      "dev": true,
-      "requires": {
-        "restore-cursor": "^2.0.0"
-      }
-    },
-    "cli-width": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
-      "dev": true
-    },
-    "cliui": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      },
-      "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-          "dev": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "clone": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
-      "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
-      "dev": true
-    },
-    "clone-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
-      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
-      "dev": true
-    },
-    "clone-stats": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
-      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
-      "dev": true
-    },
-    "cloneable-readable": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
-      "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      }
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "dev": true
-    },
-    "collection-map": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
-      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
-      "dev": true,
-      "requires": {
-        "arr-map": "^2.0.2",
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
-      "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^1.9.1",
-        "color-string": "^1.5.2"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.3"
-      }
-    },
-    "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "color-string": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
-      "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
-      "dev": true,
-      "requires": {
-        "color-name": "^1.0.0",
-        "simple-swizzle": "^0.2.2"
-      }
-    },
-    "color-support": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-      "dev": true
-    },
-    "colornames": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz",
-      "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=",
-      "dev": true
-    },
-    "colors": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz",
-      "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==",
-      "dev": true
-    },
-    "colorspace": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.1.tgz",
-      "integrity": "sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw==",
-      "dev": true,
-      "requires": {
-        "color": "3.0.x",
-        "text-hex": "1.0.x"
-      }
-    },
-    "combined-stream": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
-      "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "command-line-args": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
-      "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
-      "dev": true,
-      "requires": {
-        "argv-tools": "^0.1.1",
-        "array-back": "^2.0.0",
-        "find-replace": "^2.0.1",
-        "lodash.camelcase": "^4.3.0",
-        "typical": "^2.6.1"
-      }
-    },
-    "command-line-usage": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz",
-      "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==",
-      "dev": true,
-      "requires": {
-        "array-back": "^2.0.0",
-        "chalk": "^2.4.1",
-        "table-layout": "^0.4.3",
-        "typical": "^2.6.1"
-      }
-    },
-    "commander": {
-      "version": "2.9.0",
-      "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
-      "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
-      "dev": true,
-      "requires": {
-        "graceful-readlink": ">= 1.0.0"
-      }
-    },
-    "component-bind": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
-      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
-      "dev": true
-    },
-    "component-emitter": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-      "dev": true
-    },
-    "component-inherit": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
-      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
-      "dev": true
-    },
-    "compress-commons": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
-      "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
-      "dev": true,
-      "requires": {
-        "buffer-crc32": "^0.2.1",
-        "crc32-stream": "^2.0.0",
-        "normalize-path": "^2.0.0",
-        "readable-stream": "^2.0.0"
-      }
-    },
-    "compressible": {
-      "version": "2.0.15",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz",
-      "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==",
-      "dev": true,
-      "requires": {
-        "mime-db": ">= 1.36.0 < 2"
-      }
-    },
-    "compression": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
-      "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.5",
-        "bytes": "3.0.0",
-        "compressible": "~2.0.14",
-        "debug": "2.6.9",
-        "on-headers": "~1.0.1",
-        "safe-buffer": "5.1.2",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        }
-      }
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "concat-stream": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
-      "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "configstore": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
-      "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
-      "dev": true,
-      "requires": {
-        "dot-prop": "^4.1.0",
-        "graceful-fs": "^4.1.2",
-        "make-dir": "^1.0.0",
-        "unique-string": "^1.0.0",
-        "write-file-atomic": "^2.0.0",
-        "xdg-basedir": "^3.0.0"
-      }
-    },
-    "content-disposition": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
-      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
-      "dev": true
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
-      "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
-      "dev": true
-    },
-    "cookie": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
-      "dev": true
-    },
-    "cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
-      "dev": true
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "copy-props": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
-      "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
-      "dev": true,
-      "requires": {
-        "each-props": "^1.3.0",
-        "is-plain-object": "^2.0.1"
-      }
-    },
-    "core-js": {
-      "version": "2.5.7",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
-      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
-      "dev": true
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "crc": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
-      "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=",
-      "dev": true
-    },
-    "crc32-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
-      "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
-      "dev": true,
-      "requires": {
-        "crc": "^3.4.4",
-        "readable-stream": "^2.0.0"
-      },
-      "dependencies": {
-        "crc": {
-          "version": "3.8.0",
-          "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
-          "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
-          "dev": true,
-          "requires": {
-            "buffer": "^5.1.0"
-          }
-        }
-      }
-    },
-    "create-error-class": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
-      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
-      "dev": true,
-      "requires": {
-        "capture-stack-trace": "^1.0.0"
-      }
-    },
-    "cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "requires": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      }
-    },
-    "crypt": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
-      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
-      "dev": true
-    },
-    "cryptiles": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
-      "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
-      "dev": true,
-      "requires": {
-        "boom": "5.x.x"
-      },
-      "dependencies": {
-        "boom": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
-          "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
-          "dev": true,
-          "requires": {
-            "hoek": "4.x.x"
-          }
-        }
-      }
-    },
-    "crypto-random-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
-      "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
-      "dev": true
-    },
-    "css": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz",
-      "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "source-map": "^0.1.38",
-        "source-map-resolve": "^0.3.0",
-        "urix": "^0.1.0"
-      },
-      "dependencies": {
-        "atob": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz",
-          "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.1.43",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
-          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        },
-        "source-map-resolve": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz",
-          "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=",
-          "dev": true,
-          "requires": {
-            "atob": "~1.1.0",
-            "resolve-url": "~0.2.1",
-            "source-map-url": "~0.3.0",
-            "urix": "~0.1.0"
-          }
-        },
-        "source-map-url": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz",
-          "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=",
-          "dev": true
-        }
-      }
-    },
-    "css-slam": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/css-slam/-/css-slam-2.1.2.tgz",
-      "integrity": "sha512-cObrY+mhFEmepWpua6EpMrgRNTQ0eeym+kvR0lukI6hDEzK7F8himEDS4cJ9+fPHCoArTzVrrR0d+oAUbTR1NA==",
-      "dev": true,
-      "requires": {
-        "command-line-args": "^5.0.2",
-        "command-line-usage": "^5.0.5",
-        "dom5": "^3.0.0",
-        "parse5": "^4.0.0",
-        "shady-css-parser": "^0.1.0"
-      }
-    },
-    "cssbeautify": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
-      "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
-      "dev": true
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "cycle": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
-      "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
-      "dev": true
-    },
-    "d": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
-      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
-      "dev": true,
-      "requires": {
-        "es5-ext": "^0.10.9"
-      }
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "debug": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "debug-fabulous": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.0.0.tgz",
-      "integrity": "sha512-dsd50qQ1atDeurcxL7XOjPp4nZCGZzWIONDujDXzl1atSyC3hMbZD+v6440etw+Vt0Pr8ce4TQzHfX3KZM05Mw==",
-      "dev": true,
-      "requires": {
-        "debug": "3.X",
-        "memoizee": "0.4.X",
-        "object-assign": "4.X"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "deep-eql": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
-      "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
-      "dev": true,
-      "requires": {
-        "type-detect": "0.1.1"
-      },
-      "dependencies": {
-        "type-detect": {
-          "version": "0.1.1",
-          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
-          "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
-          "dev": true
-        }
-      }
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-      "dev": true
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "default-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
-      "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^5.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "default-resolution": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
-      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
-      "dev": true
-    },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      }
-    },
-    "del": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
-      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
-      "dev": true,
-      "requires": {
-        "globby": "^6.1.0",
-        "is-path-cwd": "^1.0.0",
-        "is-path-in-cwd": "^1.0.0",
-        "p-map": "^1.1.1",
-        "pify": "^3.0.0",
-        "rimraf": "^2.2.8"
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-      "dev": true
-    },
-    "destroy": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
-      "dev": true
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true
-    },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "detect-newline": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
-      "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
-      "dev": true
-    },
-    "detect-node": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
-      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
-      "dev": true
-    },
-    "diagnostics": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
-      "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==",
-      "dev": true,
-      "requires": {
-        "colorspace": "1.1.x",
-        "enabled": "1.0.x",
-        "kuler": "1.0.x"
-      }
-    },
-    "dicer": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
-      "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "1.1.x",
-        "streamsearch": "0.1.2"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "1.1.14",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "0.0.1",
-            "string_decoder": "~0.10.x"
-          }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        }
-      }
-    },
-    "diff": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
-      "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
-      "dev": true
-    },
-    "doctrine": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "dom-serializer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
-      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
-      "dev": true,
-      "requires": {
-        "domelementtype": "~1.1.1",
-        "entities": "~1.1.1"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
-          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
-          "dev": true
-        }
-      }
-    },
-    "dom-urls": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
-      "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
-      "dev": true,
-      "requires": {
-        "urijs": "^1.16.1"
-      }
-    },
-    "dom5": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz",
-      "integrity": "sha512-JPFiouQIr16VQ4dX6i0+Hpbg3H2bMKPmZ+WZgBOSSvOPx9QHwwY8sPzeM2baUtViESYto6wC2nuZOMC/6gulcA==",
-      "dev": true,
-      "requires": {
-        "@types/parse5": "^2.2.34",
-        "clone": "^2.1.0",
-        "parse5": "^4.0.0"
-      }
-    },
-    "domelementtype": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
-      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
-      "dev": true
-    },
-    "domhandler": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
-      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
-      "dev": true,
-      "requires": {
-        "domelementtype": "1"
-      }
-    },
-    "domutils": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
-      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
-      "dev": true,
-      "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "dot-prop": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
-      "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
-      "dev": true,
-      "requires": {
-        "is-obj": "^1.0.0"
-      }
-    },
-    "duplexer": {
-      "version": "0.1.1",
-      "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
-      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
-      "dev": true
-    },
-    "duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "duplexer3": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
-      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
-      "dev": true
-    },
-    "duplexify": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
-      "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      },
-      "dependencies": {
-        "end-of-stream": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-          "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
-          "dev": true,
-          "requires": {
-            "once": "^1.4.0"
-          }
-        }
-      }
-    },
-    "each-props": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
-      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.1",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
-      "dev": true
-    },
-    "emitter-component": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
-      "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=",
-      "dev": true
-    },
-    "enabled": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz",
-      "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=",
-      "dev": true,
-      "requires": {
-        "env-variable": "0.0.x"
-      }
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "engine.io": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz",
-      "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.4",
-        "base64id": "1.0.0",
-        "cookie": "0.3.1",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.0",
-        "ws": "~3.3.1"
-      }
-    },
-    "engine.io-client": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
-      "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
-      "dev": true,
-      "requires": {
-        "component-emitter": "1.2.1",
-        "component-inherit": "0.0.3",
-        "debug": "~3.1.0",
-        "engine.io-parser": "~2.1.1",
-        "has-cors": "1.1.0",
-        "indexof": "0.0.1",
-        "parseqs": "0.0.5",
-        "parseuri": "0.0.5",
-        "ws": "~3.3.1",
-        "xmlhttprequest-ssl": "~1.5.4",
-        "yeast": "0.1.2"
-      }
-    },
-    "engine.io-parser": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
-      "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
-      "dev": true,
-      "requires": {
-        "after": "0.8.2",
-        "arraybuffer.slice": "~0.0.7",
-        "base64-arraybuffer": "0.1.5",
-        "blob": "0.0.4",
-        "has-binary2": "~1.0.2"
-      }
-    },
-    "entities": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
-      "dev": true
-    },
-    "env-variable": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz",
-      "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==",
-      "dev": true
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es5-ext": {
-      "version": "0.10.40",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.40.tgz",
-      "integrity": "sha512-S9Fh3oya5OOvYSNGvPZJ+vyrs6VYpe1IXPowVe3N1OhaiwVaGlwfn3Zf5P5klYcWOA0toIwYQW8XEv/QqhdHvQ==",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.1"
-      }
-    },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "es6-promise": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
-      "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
-      "dev": true
-    },
-    "es6-promisify": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.1.tgz",
-      "integrity": "sha512-J3ZkwbEnnO+fGAKrjVpeUAnZshAdfZvbhQpqfIH9kSAspReRC4nJnu8ewm55b4y9ElyeuhCTzJD0XiH8Tsbhlw==",
-      "dev": true
-    },
-    "es6-symbol": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
-      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "es6-weak-map": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
-      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.14",
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "eslint": {
-      "version": "5.7.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz",
-      "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.5.3",
-        "chalk": "^2.1.0",
-        "cross-spawn": "^6.0.5",
-        "debug": "^4.0.1",
-        "doctrine": "^2.1.0",
-        "eslint-scope": "^4.0.0",
-        "eslint-utils": "^1.3.1",
-        "eslint-visitor-keys": "^1.0.0",
-        "espree": "^4.0.0",
-        "esquery": "^1.0.1",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^2.0.0",
-        "functional-red-black-tree": "^1.0.1",
-        "glob": "^7.1.2",
-        "globals": "^11.7.0",
-        "ignore": "^4.0.6",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^6.1.0",
-        "is-resolvable": "^1.1.0",
-        "js-yaml": "^3.12.0",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.5",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.2",
-        "path-is-inside": "^1.0.2",
-        "pluralize": "^7.0.0",
-        "progress": "^2.0.0",
-        "regexpp": "^2.0.1",
-        "require-uncached": "^1.0.3",
-        "semver": "^5.5.1",
-        "strip-ansi": "^4.0.0",
-        "strip-json-comments": "^2.0.1",
-        "table": "^5.0.2",
-        "text-table": "^0.2.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
-          "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true
-        },
-        "semver": {
-          "version": "5.6.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-          "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-plugin-html": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.6.tgz",
-      "integrity": "sha512-nj6A9oK+7BKnMm0E7dMRH3r75BfpkXtcVIb3pFC4AcDdBTNyg2NGxHXyFNT1emW4VsR7P2SZvRXXQtUR+kY08w==",
-      "dev": true,
-      "requires": {
-        "htmlparser2": "^3.8.2"
-      }
-    },
-    "eslint-scope": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
-      "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint-utils": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
-      "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
-      "dev": true
-    },
-    "eslint-visitor-keys": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
-      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
-      "dev": true
-    },
-    "espree": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz",
-      "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==",
-      "dev": true,
-      "requires": {
-        "acorn": "^6.0.2",
-        "acorn-jsx": "^5.0.0",
-        "eslint-visitor-keys": "^1.0.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz",
-          "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==",
-          "dev": true
-        }
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
-      "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.0.0"
-      }
-    },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.1.0"
-      }
-    },
-    "estraverse": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
-      "dev": true
-    },
-    "event-emitter": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
-      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "eventemitter3": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
-      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
-      "dev": true
-    },
-    "execa": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
-      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^5.0.1",
-        "get-stream": "^3.0.0",
-        "is-stream": "^1.1.0",
-        "npm-run-path": "^2.0.0",
-        "p-finally": "^1.0.0",
-        "signal-exit": "^3.0.0",
-        "strip-eof": "^1.0.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
-          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^4.0.1",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        }
-      }
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "expand-range": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
-      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
-      "dev": true,
-      "requires": {
-        "fill-range": "^2.1.0"
-      },
-      "dependencies": {
-        "fill-range": {
-          "version": "2.2.4",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
-          "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
-          "dev": true,
-          "requires": {
-            "is-number": "^2.1.0",
-            "isobject": "^2.0.0",
-            "randomatic": "^3.0.0",
-            "repeat-element": "^1.1.2",
-            "repeat-string": "^1.5.2"
-          }
-        },
-        "is-number": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
-          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "isobject": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-          "dev": true,
-          "requires": {
-            "isarray": "1.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "express": {
-      "version": "4.16.4",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
-      "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
-      "dev": true,
-      "requires": {
-        "accepts": "~1.3.5",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.18.3",
-        "content-disposition": "0.5.2",
-        "content-type": "~1.0.4",
-        "cookie": "0.3.1",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "~1.1.2",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.1.1",
-        "fresh": "0.5.2",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.4",
-        "qs": "6.5.2",
-        "range-parser": "~1.2.0",
-        "safe-buffer": "5.1.2",
-        "send": "0.16.2",
-        "serve-static": "1.13.2",
-        "setprototypeof": "1.1.0",
-        "statuses": "~1.4.0",
-        "type-is": "~1.6.16",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        },
-        "send": {
-          "version": "0.16.2",
-          "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
-          "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "destroy": "~1.0.4",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "etag": "~1.8.1",
-            "fresh": "0.5.2",
-            "http-errors": "~1.6.2",
-            "mime": "1.4.1",
-            "ms": "2.0.0",
-            "on-finished": "~2.3.0",
-            "range-parser": "~1.2.0",
-            "statuses": "~1.4.0"
-          }
-        },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
-          "dev": true
-        }
-      }
-    },
-    "extend": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
-      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "external-editor": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
-      "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
-      "dev": true,
-      "requires": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "eyes": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
-      "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
-      "dev": true
-    },
-    "fancy-log": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
-      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
-      "dev": true,
-      "requires": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "time-stamp": "^1.0.0"
-      }
-    },
-    "fast-deep-equal": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "fast-safe-stringify": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz",
-      "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==",
-      "dev": true
-    },
-    "fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "pend": "~1.2.0"
-      }
-    },
-    "fecha": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
-      "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==",
-      "dev": true
-    },
-    "figures": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
-      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5"
-      }
-    },
-    "file-entry-cache": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
-      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^1.2.1",
-        "object-assign": "^4.0.1"
-      }
-    },
-    "filename-regex": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
-      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
-      "dev": true
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "finalhandler": {
-      "version": "1.1.1",
-      "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
-      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
-      "dev": true,
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "statuses": "~1.4.0",
-        "unpipe": "~1.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
-          "dev": true
-        }
-      }
-    },
-    "find-port": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/find-port/-/find-port-1.0.1.tgz",
-      "integrity": "sha1-2whKbL+ZVk2Zhprnn73s9m6KGFw=",
-      "dev": true,
-      "requires": {
-        "async": "~0.2.9"
-      },
-      "dependencies": {
-        "async": {
-          "version": "0.2.10",
-          "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz",
-          "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
-          "dev": true
-        }
-      }
-    },
-    "find-replace": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
-      "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
-      "dev": true,
-      "requires": {
-        "array-back": "^2.0.0",
-        "test-value": "^3.0.0"
-      }
-    },
-    "find-up": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-      "dev": true,
-      "requires": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "findup-sync": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
-      "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^3.1.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      }
-    },
-    "fined": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
-      "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      }
-    },
-    "first-chunk-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
-      "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
-      "dev": true
-    },
-    "flagged-respawn": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
-      "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
-      "dev": true
-    },
-    "flat-cache": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
-      "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
-      "dev": true,
-      "requires": {
-        "circular-json": "^0.3.1",
-        "del": "^2.0.2",
-        "graceful-fs": "^4.1.2",
-        "write": "^0.2.1"
-      },
-      "dependencies": {
-        "del": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
-          "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
-          "dev": true,
-          "requires": {
-            "globby": "^5.0.0",
-            "is-path-cwd": "^1.0.0",
-            "is-path-in-cwd": "^1.0.0",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0",
-            "rimraf": "^2.2.8"
-          }
-        },
-        "globby": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
-          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
-          "dev": true,
-          "requires": {
-            "array-union": "^1.0.1",
-            "arrify": "^1.0.0",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          }
-        },
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "flush-write-stream": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
-      "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.4"
-      }
-    },
-    "follow-redirects": {
-      "version": "1.5.9",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz",
-      "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==",
-      "dev": true,
-      "requires": {
-        "debug": "=3.1.0"
-      }
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "for-own": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
-      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
-    },
-    "fork-stream": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
-      "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "formatio": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
-      "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
-      "dev": true,
-      "requires": {
-        "samsam": "~1.1"
-      }
-    },
-    "forwarded": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
-      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
-      "dev": true
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "freeport": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/freeport/-/freeport-1.0.5.tgz",
-      "integrity": "sha1-JV6KuEFwwzuoXZkOghrl9KGpvF0=",
-      "dev": true,
-      "optional": true
-    },
-    "fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
-      "dev": true
-    },
-    "fs-constants": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
-      "dev": true
-    },
-    "fs-mkdirp-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
-      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "through2": "^2.0.3"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
-      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "nan": "^2.9.2",
-        "node-pre-gyp": "^0.10.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "dev": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "deep-extend": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.21",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": "^2.1.0"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true,
-          "dev": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "dev": true
-        },
-        "minipass": {
-          "version": "2.2.4",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "safe-buffer": "^5.1.1",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "^2.1.2",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.10.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.0",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.1.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.1.10",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.7",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.5.1",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.0.5"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.1",
-          "bundled": true,
-          "dev": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.5.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.0.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.2.4",
-            "minizlib": "^1.1.0",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.1",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true
-        }
-      }
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "3.0.0",
-      "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
-      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
-      "dev": true
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-base": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
-      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
-      "dev": true,
-      "requires": {
-        "glob-parent": "^2.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "glob-parent": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
-      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
-      "dev": true,
-      "requires": {
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "glob-stream": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
-      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "glob": "^7.1.1",
-        "glob-parent": "^3.1.0",
-        "is-negated-glob": "^1.0.0",
-        "ordered-read-streams": "^1.0.0",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.1.5",
-        "remove-trailing-separator": "^1.0.1",
-        "to-absolute-glob": "^2.0.0",
-        "unique-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          }
-        },
-        "to-absolute-glob": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
-          "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
-          "dev": true,
-          "requires": {
-            "is-absolute": "^1.0.0",
-            "is-negated-glob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "glob-watcher": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz",
-      "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==",
-      "dev": true,
-      "requires": {
-        "async-done": "^1.2.0",
-        "chokidar": "^2.0.0",
-        "just-debounce": "^1.0.0",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "global-dirs": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
-      "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
-      "dev": true,
-      "requires": {
-        "ini": "^1.3.4"
-      }
-    },
-    "global-modules": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      }
-    },
-    "globals": {
-      "version": "11.7.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
-      "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
-      "dev": true
-    },
-    "globby": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "dev": true,
-      "requires": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "glogg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
-      "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
-      "dev": true,
-      "requires": {
-        "sparkles": "^1.0.0"
-      }
-    },
-    "google-closure-compiler": {
-      "version": "20180805.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180805.0.0.tgz",
-      "integrity": "sha512-MV9JTTQDO0tYOAaJmqd3MMIjCLxHkhZcj7hN6gUJdjQV7wYmH2wqwj56teIK22o9pSJvhKg89F/WCguaAZhSUA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.0.0",
-        "google-closure-compiler-linux": "^20180805.0.0",
-        "google-closure-compiler-osx": "^20180805.0.0",
-        "minimist": "^1.2.0",
-        "vinyl": "^2.0.1",
-        "vinyl-sourcemaps-apply": "^0.2.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "google-closure-compiler-linux": {
-      "version": "20180805.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20180805.0.0.tgz",
-      "integrity": "sha512-Y53/dehGj5/HoAEnxoYFWLpLf8gHq8QaQSOw8ulnh6VkpHPdcAuhRqIVLcLeJ9rVW3xteOMQ2WFyRfFMayVZcA==",
-      "dev": true,
-      "optional": true
-    },
-    "google-closure-compiler-osx": {
-      "version": "20180805.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20180805.0.0.tgz",
-      "integrity": "sha512-Zt558FPdkpcZulaT4uH7qNiO5wy3DT2Eaq+JPb4LjuS3KQSo8GSWx9caYWGZ1OdKULTv+v/flkHMtoHu5XP2bw==",
-      "dev": true,
-      "optional": true
-    },
-    "got": {
-      "version": "6.7.1",
-      "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz",
-      "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
-      "dev": true,
-      "requires": {
-        "create-error-class": "^3.0.0",
-        "duplexer3": "^0.1.4",
-        "get-stream": "^3.0.0",
-        "is-redirect": "^1.0.0",
-        "is-retry-allowed": "^1.0.0",
-        "is-stream": "^1.0.0",
-        "lowercase-keys": "^1.0.0",
-        "safe-buffer": "^5.0.1",
-        "timed-out": "^4.0.0",
-        "unzip-response": "^2.0.1",
-        "url-parse-lax": "^1.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-      "dev": true
-    },
-    "graceful-readlink": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
-      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
-      "dev": true
-    },
-    "growl": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
-      "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
-      "dev": true
-    },
-    "gulp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz",
-      "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=",
-      "dev": true,
-      "requires": {
-        "glob-watcher": "^5.0.0",
-        "gulp-cli": "^2.0.0",
-        "undertaker": "^1.0.0",
-        "vinyl-fs": "^3.0.0"
-      },
-      "dependencies": {
-        "gulp-cli": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz",
-          "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^1.0.1",
-            "archy": "^1.0.0",
-            "array-sort": "^1.0.0",
-            "color-support": "^1.1.3",
-            "concat-stream": "^1.6.0",
-            "copy-props": "^2.0.1",
-            "fancy-log": "^1.3.2",
-            "gulplog": "^1.0.0",
-            "interpret": "^1.1.0",
-            "isobject": "^3.0.1",
-            "liftoff": "^2.5.0",
-            "matchdep": "^2.0.0",
-            "mute-stdout": "^1.0.0",
-            "pretty-hrtime": "^1.0.0",
-            "replace-homedir": "^1.0.0",
-            "semver-greatest-satisfied-range": "^1.1.0",
-            "v8flags": "^3.0.1",
-            "yargs": "^7.1.0"
-          }
-        }
-      }
-    },
-    "gulp-if": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
-      "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
-      "dev": true,
-      "requires": {
-        "gulp-match": "^1.0.3",
-        "ternary-stream": "^2.0.1",
-        "through2": "^2.0.1"
-      }
-    },
-    "gulp-match": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
-      "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
-      "dev": true,
-      "requires": {
-        "minimatch": "^3.0.3"
-      }
-    },
-    "gulp-rename": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz",
-      "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==",
-      "dev": true
-    },
-    "gulp-size": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-3.0.0.tgz",
-      "integrity": "sha1-yxrI5rqD3t5SQwxH/QOTJPAD/4I=",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.3.0",
-        "fancy-log": "^1.3.2",
-        "gzip-size": "^4.1.0",
-        "plugin-error": "^0.1.2",
-        "pretty-bytes": "^4.0.2",
-        "stream-counter": "^1.0.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "gulp-sourcemaps": {
-      "version": "2.6.4",
-      "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz",
-      "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=",
-      "dev": true,
-      "requires": {
-        "@gulp-sourcemaps/identity-map": "1.X",
-        "@gulp-sourcemaps/map-sources": "1.X",
-        "acorn": "5.X",
-        "convert-source-map": "1.X",
-        "css": "2.X",
-        "debug-fabulous": "1.X",
-        "detect-newline": "2.X",
-        "graceful-fs": "4.X",
-        "source-map": "~0.6.0",
-        "strip-bom-string": "1.X",
-        "through2": "2.X"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "gulplog": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
-      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
-      "dev": true,
-      "requires": {
-        "glogg": "^1.0.0"
-      }
-    },
-    "gzip-size": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
-      "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=",
-      "dev": true,
-      "requires": {
-        "duplexer": "^0.1.1",
-        "pify": "^3.0.0"
-      }
-    },
-    "handle-thing": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
-      "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
-      "dev": true
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true
-    },
-    "har-validator": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
-      "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "ajv": "^5.3.0",
-        "har-schema": "^2.0.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "co": "^4.6.0",
-            "fast-deep-equal": "^1.0.0",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.3.0"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "1.1.0",
-          "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
-          "dev": true,
-          "optional": true
-        },
-        "json-schema-traverse": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "has-binary2": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
-      "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
-      "dev": true,
-      "requires": {
-        "isarray": "2.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
-          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
-          "dev": true
-        }
-      }
-    },
-    "has-color": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
-      "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
-      "dev": true
-    },
-    "has-cors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
-      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
-      "dev": true
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
-      "dev": true
-    },
-    "has-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-      "dev": true,
-      "requires": {
-        "get-value": "^2.0.6",
-        "has-values": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "has-values": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "kind-of": "^4.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "hawk": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
-      "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
-      "dev": true,
-      "requires": {
-        "boom": "4.x.x",
-        "cryptiles": "3.x.x",
-        "hoek": "4.x.x",
-        "sntp": "2.x.x"
-      }
-    },
-    "he": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
-      "dev": true
-    },
-    "hoek": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
-      "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
-      "dev": true
-    },
-    "homedir-polyfill": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
-      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
-      "dev": true,
-      "requires": {
-        "parse-passwd": "^1.0.0"
-      }
-    },
-    "hosted-git-info": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
-      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
-      "dev": true
-    },
-    "hpack.js": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
-      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "obuf": "^1.0.0",
-        "readable-stream": "^2.0.1",
-        "wbuf": "^1.1.0"
-      }
-    },
-    "html-minifier": {
-      "version": "3.5.21",
-      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
-      "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
-      "dev": true,
-      "requires": {
-        "camel-case": "3.0.x",
-        "clean-css": "4.2.x",
-        "commander": "2.17.x",
-        "he": "1.2.x",
-        "param-case": "2.1.x",
-        "relateurl": "0.2.x",
-        "uglify-js": "3.4.x"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.17.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
-          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
-          "dev": true
-        },
-        "he": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-          "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-          "dev": true
-        }
-      }
-    },
-    "htmlparser2": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz",
-      "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==",
-      "dev": true,
-      "requires": {
-        "domelementtype": "^1.3.0",
-        "domhandler": "^2.3.0",
-        "domutils": "^1.5.1",
-        "entities": "^1.1.1",
-        "inherits": "^2.0.1",
-        "readable-stream": "^3.0.6"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.0.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz",
-          "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "http-deceiver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
-      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
-      "dev": true
-    },
-    "http-errors": {
-      "version": "1.6.3",
-      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
-      "dev": true,
-      "requires": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.0",
-        "statuses": ">= 1.4.0 < 2"
-      }
-    },
-    "http-proxy": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
-      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
-      "dev": true,
-      "requires": {
-        "eventemitter3": "^3.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "http-proxy-middleware": {
-      "version": "0.17.4",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
-      "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
-      "dev": true,
-      "requires": {
-        "http-proxy": "^1.16.2",
-        "is-glob": "^3.1.0",
-        "lodash": "^4.17.2",
-        "micromatch": "^2.3.11"
-      },
-      "dependencies": {
-        "arr-diff": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
-          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1"
-          }
-        },
-        "array-unique": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
-          "dev": true
-        },
-        "braces": {
-          "version": "1.8.5",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
-          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
-          "dev": true,
-          "requires": {
-            "expand-range": "^1.8.1",
-            "preserve": "^0.2.0",
-            "repeat-element": "^1.1.2"
-          }
-        },
-        "expand-brackets": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
-          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
-          "dev": true,
-          "requires": {
-            "is-posix-bracket": "^0.1.0"
-          }
-        },
-        "extglob": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
-          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        },
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
-        "micromatch": {
-          "version": "2.3.11",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
-          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^2.0.0",
-            "array-unique": "^0.2.1",
-            "braces": "^1.8.2",
-            "expand-brackets": "^0.1.4",
-            "extglob": "^0.3.1",
-            "filename-regex": "^2.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.1",
-            "kind-of": "^3.0.2",
-            "normalize-path": "^2.0.1",
-            "object.omit": "^2.0.0",
-            "parse-glob": "^3.0.4",
-            "regex-cache": "^0.4.2"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-              "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
-            }
-          }
-        }
-      }
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "https-proxy-agent": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
-      "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "agent-base": "^4.1.0",
-        "debug": "^3.1.0"
-      }
-    },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ieee754": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
-      "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
-      "dev": true
-    },
-    "ignore": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-      "dev": true
-    },
-    "import-lazy": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
-      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
-      "dev": true
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "indent": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
-      "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
-      "dev": true
-    },
-    "indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "indexof": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
-      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
-    },
-    "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-      "dev": true
-    },
-    "inquirer": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
-      "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
-      "dev": true,
-      "requires": {
-        "ansi-escapes": "^3.0.0",
-        "chalk": "^2.0.0",
-        "cli-cursor": "^2.1.0",
-        "cli-width": "^2.0.0",
-        "external-editor": "^3.0.0",
-        "figures": "^2.0.0",
-        "lodash": "^4.17.10",
-        "mute-stream": "0.0.7",
-        "run-async": "^2.2.0",
-        "rxjs": "^6.1.0",
-        "string-width": "^2.1.0",
-        "strip-ansi": "^4.0.0",
-        "through": "^2.3.6"
-      }
-    },
-    "interpret": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
-      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
-      "dev": true
-    },
-    "invariant": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
-      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
-      "dev": true,
-      "requires": {
-        "loose-envify": "^1.0.0"
-      }
-    },
-    "invert-kv": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-      "dev": true
-    },
-    "ipaddr.js": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
-      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
-      "dev": true
-    },
-    "is-absolute": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
-      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
-      "dev": true,
-      "requires": {
-        "is-relative": "^1.0.0",
-        "is-windows": "^1.0.1"
-      }
-    },
-    "is-accessor-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.0"
-      }
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^1.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
-    },
-    "is-builtin-module": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
-      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
-      "dev": true,
-      "requires": {
-        "builtin-modules": "^1.0.0"
-      }
-    },
-    "is-ci": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
-      "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
-      "dev": true,
-      "requires": {
-        "ci-info": "^1.5.0"
-      }
-    },
-    "is-data-descriptor": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.0"
-      }
-    },
-    "is-descriptor": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-      "dev": true,
-      "requires": {
-        "is-accessor-descriptor": "^1.0.0",
-        "is-data-descriptor": "^1.0.0",
-        "kind-of": "^6.0.2"
-      }
-    },
-    "is-dotfile": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
-      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
-      "dev": true
-    },
-    "is-equal-shallow": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
-      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
-      "dev": true,
-      "requires": {
-        "is-primitive": "^2.0.0"
-      }
-    },
-    "is-extendable": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-      "dev": true
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
-    "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
-    },
-    "is-glob": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.0"
-      }
-    },
-    "is-installed-globally": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
-      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
-      "dev": true,
-      "requires": {
-        "global-dirs": "^0.1.0",
-        "is-path-inside": "^1.0.0"
-      }
-    },
-    "is-negated-glob": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
-      "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
-      "dev": true
-    },
-    "is-npm": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
-      "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
-      "dev": true
-    },
-    "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "is-obj": {
-      "version": "1.0.1",
-      "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
-      "dev": true
-    },
-    "is-odd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
-      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
-      "dev": true
-    },
-    "is-path-in-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
-      "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "^1.0.0"
-      }
-    },
-    "is-path-inside": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
-      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
-      "dev": true,
-      "requires": {
-        "path-is-inside": "^1.0.1"
-      }
-    },
-    "is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "is-posix-bracket": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
-      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
-      "dev": true
-    },
-    "is-primitive": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
-      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
-      "dev": true
-    },
-    "is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
-      "dev": true
-    },
-    "is-redirect": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
-      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
-      "dev": true
-    },
-    "is-relative": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
-      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
-      "dev": true,
-      "requires": {
-        "is-unc-path": "^1.0.0"
-      }
-    },
-    "is-resolvable": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
-      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
-      "dev": true
-    },
-    "is-retry-allowed": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
-      "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
-      "dev": true
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "dev": true
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true
-    },
-    "is-unc-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
-      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
-      "dev": true,
-      "requires": {
-        "unc-path-regex": "^0.1.2"
-      }
-    },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true
-    },
-    "is-valid-glob": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
-      "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
-      "dev": true
-    },
-    "is-windows": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
-      "dev": true
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-      "dev": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
-      "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true
-    },
-    "jsesc": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
-      "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
-      "dev": true
-    },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
-    },
-    "json-stable-stringify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
-      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
-      "dev": true,
-      "requires": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true
-    },
-    "json3": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
-      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
-      "dev": true
-    },
-    "json5": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
-      "dev": true
-    },
-    "jsonschema": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
-      "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
-      "dev": true
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "just-debounce": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
-      "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
-      "dev": true
-    },
-    "kind-of": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-      "dev": true
-    },
-    "kuler": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz",
-      "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==",
-      "dev": true,
-      "requires": {
-        "colornames": "^1.1.1"
-      }
-    },
-    "last-run": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
-      "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
-      "dev": true,
-      "requires": {
-        "default-resolution": "^2.0.0",
-        "es6-weak-map": "^2.0.1"
-      }
-    },
-    "latest-version": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
-      "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
-      "dev": true,
-      "requires": {
-        "package-json": "^4.0.0"
-      }
-    },
-    "launchpad": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/launchpad/-/launchpad-0.7.0.tgz",
-      "integrity": "sha1-9CfTwOFehp7hVROCi6/vwW+ce8M=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "async": "^2.0.1",
-        "browserstack": "^1.2.0",
-        "debug": "^2.2.0",
-        "plist": "^2.0.1",
-        "q": "^1.4.1",
-        "underscore": "^1.8.3"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        },
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "underscore": {
-          "version": "1.9.1",
-          "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
-          "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "lazystream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
-      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.5"
-      }
-    },
-    "lcid": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
-      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^1.0.0"
-      }
-    },
-    "lead": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
-      "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
-      "dev": true,
-      "requires": {
-        "flush-write-stream": "^1.0.2"
-      }
-    },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      }
-    },
-    "liftoff": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
-      "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "findup-sync": "^2.0.0",
-        "fined": "^1.0.1",
-        "flagged-respawn": "^1.0.0",
-        "is-plain-object": "^2.0.4",
-        "object.map": "^1.0.0",
-        "rechoir": "^0.6.2",
-        "resolve": "^1.1.7"
-      }
-    },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        },
-        "strip-bom": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-          "dev": true,
-          "requires": {
-            "is-utf8": "^0.2.0"
-          }
-        }
-      }
-    },
-    "lodash": {
-      "version": "4.17.11",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
-      "dev": true
-    },
-    "lodash._baseassign": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
-      "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
-      "dev": true,
-      "requires": {
-        "lodash._basecopy": "^3.0.0",
-        "lodash.keys": "^3.0.0"
-      }
-    },
-    "lodash._basecopy": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
-      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
-      "dev": true
-    },
-    "lodash._basecreate": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
-      "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
-      "dev": true
-    },
-    "lodash._getnative": {
-      "version": "3.9.1",
-      "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
-      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
-      "dev": true
-    },
-    "lodash._isiterateecall": {
-      "version": "3.0.9",
-      "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
-      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
-      "dev": true
-    },
-    "lodash._reinterpolate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
-      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
-      "dev": true
-    },
-    "lodash.camelcase": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
-      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
-      "dev": true
-    },
-    "lodash.create": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
-      "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
-      "dev": true,
-      "requires": {
-        "lodash._baseassign": "^3.0.0",
-        "lodash._basecreate": "^3.0.0",
-        "lodash._isiterateecall": "^3.0.0"
-      }
-    },
-    "lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
-      "dev": true
-    },
-    "lodash.defaults": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
-      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
-      "dev": true
-    },
-    "lodash.isarguments": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
-      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
-      "dev": true
-    },
-    "lodash.isarray": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
-      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
-      "dev": true
-    },
-    "lodash.isequal": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
-      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
-      "dev": true
-    },
-    "lodash.isplainobject": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
-      "dev": true
-    },
-    "lodash.keys": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
-      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
-      "dev": true,
-      "requires": {
-        "lodash._getnative": "^3.0.0",
-        "lodash.isarguments": "^3.0.0",
-        "lodash.isarray": "^3.0.0"
-      }
-    },
-    "lodash.padend": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
-      "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
-      "dev": true
-    },
-    "lodash.some": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
-      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
-      "dev": true
-    },
-    "lodash.sortby": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
-      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
-      "dev": true
-    },
-    "lodash.template": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
-      "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
-      "dev": true,
-      "requires": {
-        "lodash._reinterpolate": "~3.0.0",
-        "lodash.templatesettings": "^4.0.0"
-      }
-    },
-    "lodash.templatesettings": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
-      "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
-      "dev": true,
-      "requires": {
-        "lodash._reinterpolate": "~3.0.0"
-      }
-    },
-    "logform": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz",
-      "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==",
-      "dev": true,
-      "requires": {
-        "colors": "^1.2.1",
-        "fast-safe-stringify": "^2.0.4",
-        "fecha": "^2.3.3",
-        "ms": "^2.1.1",
-        "triple-beam": "^1.2.0"
-      },
-      "dependencies": {
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true
-        }
-      }
-    },
-    "lolex": {
-      "version": "1.3.2",
-      "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
-      "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
-      "dev": true
-    },
-    "loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "dev": true,
-      "requires": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      }
-    },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
-    "lower-case": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
-      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
-      "dev": true
-    },
-    "lowercase-keys": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
-      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
-      "dev": true
-    },
-    "lru-cache": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
-      "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
-      "dev": true,
-      "requires": {
-        "pseudomap": "^1.0.2",
-        "yallist": "^2.1.2"
-      }
-    },
-    "lru-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
-      "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
-      "dev": true,
-      "requires": {
-        "es5-ext": "~0.10.2"
-      }
-    },
-    "magic-string": {
-      "version": "0.22.5",
-      "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
-      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
-      "dev": true,
-      "requires": {
-        "vlq": "^0.2.2"
-      }
-    },
-    "make-dir": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
-      "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      }
-    },
-    "make-iterator": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
-      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
-    "map-cache": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
-      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
-      "dev": true
-    },
-    "map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-      "dev": true
-    },
-    "map-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-      "dev": true,
-      "requires": {
-        "object-visit": "^1.0.0"
-      }
-    },
-    "matchdep": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
-      "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
-      "dev": true,
-      "requires": {
-        "findup-sync": "^2.0.0",
-        "micromatch": "^3.0.4",
-        "resolve": "^1.4.0",
-        "stack-trace": "0.0.10"
-      }
-    },
-    "matcher": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz",
-      "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.4"
-      }
-    },
-    "math-random": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
-      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
-      "dev": true
-    },
-    "md5": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
-      "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
-      "dev": true,
-      "requires": {
-        "charenc": "~0.0.1",
-        "crypt": "~0.0.1",
-        "is-buffer": "~1.1.1"
-      }
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
-      "dev": true
-    },
-    "memoizee": {
-      "version": "0.4.12",
-      "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz",
-      "integrity": "sha512-sprBu6nwxBWBvBOh5v2jcsGqiGLlL2xr2dLub3vR8dnE8YB17omwtm/0NSHl8jjNbcsJd5GMWJAnTSVe/O0Wfg==",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.30",
-        "es6-weak-map": "^2.0.2",
-        "event-emitter": "^0.3.5",
-        "is-promise": "^2.1",
-        "lru-queue": "0.1",
-        "next-tick": "1",
-        "timers-ext": "^0.1.2"
-      }
-    },
-    "meow": {
-      "version": "3.7.0",
-      "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "requires": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
-      "dev": true
-    },
-    "merge-stream": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
-      "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
-      "dev": true
-    },
-    "micromatch": {
-      "version": "3.1.9",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
-      "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "mime": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
-      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
-      "dev": true
-    },
-    "mime-db": {
-      "version": "1.37.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
-      "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
-      "dev": true
-    },
-    "mime-types": {
-      "version": "2.1.21",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
-      "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
-      "dev": true,
-      "requires": {
-        "mime-db": "~1.37.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
-      "dev": true
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimatch-all": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
-      "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
-      "dev": true,
-      "requires": {
-        "minimatch": "^3.0.2"
-      }
-    },
-    "minimist": {
-      "version": "0.0.8",
-      "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-      "dev": true
-    },
-    "mixin-deep": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
-      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.2",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "dev": true,
-      "requires": {
-        "minimist": "0.0.8"
-      }
-    },
-    "mocha": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
-      "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
-      "dev": true,
-      "requires": {
-        "browser-stdout": "1.3.0",
-        "commander": "2.9.0",
-        "debug": "2.6.8",
-        "diff": "3.2.0",
-        "escape-string-regexp": "1.0.5",
-        "glob": "7.1.1",
-        "growl": "1.9.2",
-        "he": "1.1.1",
-        "json3": "3.3.2",
-        "lodash.create": "3.1.1",
-        "mkdirp": "0.5.1",
-        "supports-color": "3.1.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.8",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
-          "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.1",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
-          "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.2",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
-          "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
-          "dev": true,
-          "requires": {
-            "has-flag": "^1.0.0"
-          }
-        }
-      }
-    },
-    "mout": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/mout/-/mout-1.1.0.tgz",
-      "integrity": "sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw==",
-      "dev": true
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "multer": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.1.tgz",
-      "integrity": "sha512-zzOLNRxzszwd+61JFuAo0fxdQfvku12aNJgnla0AQ+hHxFmfc/B7jBVuPr5Rmvu46Jze/iJrFpSOsD7afO8SDw==",
-      "dev": true,
-      "requires": {
-        "append-field": "^1.0.0",
-        "busboy": "^0.2.11",
-        "concat-stream": "^1.5.2",
-        "mkdirp": "^0.5.1",
-        "object-assign": "^4.1.1",
-        "on-finished": "^2.3.0",
-        "type-is": "^1.6.4",
-        "xtend": "^4.0.0"
-      }
-    },
-    "multipipe": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
-      "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
-      "dev": true,
-      "requires": {
-        "duplexer2": "^0.1.2",
-        "object-assign": "^4.1.0"
-      }
-    },
-    "mute-stdout": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
-      "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
-      "dev": true
-    },
-    "mute-stream": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
-      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
-      "dev": true
-    },
-    "mz": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
-      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
-      "dev": true,
-      "requires": {
-        "any-promise": "^1.0.0",
-        "object-assign": "^4.0.1",
-        "thenify-all": "^1.0.0"
-      }
-    },
-    "nan": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz",
-      "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==",
-      "dev": true,
-      "optional": true
-    },
-    "nanomatch": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
-      "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
-      "dev": true,
-      "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "fragment-cache": "^0.2.1",
-        "is-odd": "^2.0.0",
-        "is-windows": "^1.0.2",
-        "kind-of": "^6.0.2",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      }
-    },
-    "native-promise-only": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
-      "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
-      "dev": true
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "negotiator": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
-      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
-      "dev": true
-    },
-    "next-tick": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
-      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
-      "dev": true
-    },
-    "nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
-    },
-    "no-case": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
-      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
-      "dev": true,
-      "requires": {
-        "lower-case": "^1.1.1"
-      }
-    },
-    "nomnom": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
-      "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
-      "dev": true,
-      "requires": {
-        "chalk": "~0.4.0",
-        "underscore": "~1.6.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
-          "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "0.4.0",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
-          "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "~1.0.0",
-            "has-color": "~0.1.0",
-            "strip-ansi": "~0.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "0.1.1",
-          "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
-          "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
-          "dev": true
-        }
-      }
-    },
-    "normalize-package-data": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^2.1.4",
-        "is-builtin-module": "^1.0.0",
-        "semver": "2 || 3 || 4 || 5",
-        "validate-npm-package-license": "^3.0.1"
-      }
-    },
-    "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
-      "requires": {
-        "remove-trailing-separator": "^1.0.1"
-      }
-    },
-    "now-and-later": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
-      "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.2"
-      }
-    },
-    "npm-run-path": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-      "dev": true,
-      "requires": {
-        "path-key": "^2.0.0"
-      }
-    },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true,
-      "optional": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
-    },
-    "object-component": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
-      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
-      "dev": true
-    },
-    "object-copy": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-      "dev": true,
-      "requires": {
-        "copy-descriptor": "^0.1.0",
-        "define-property": "^0.2.5",
-        "kind-of": "^3.0.3"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "5.1.0",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-              "dev": true
-            }
-          }
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "object-keys": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
-      "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
-      "dev": true
-    },
-    "object-visit": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
-      }
-    },
-    "object.defaults": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
-      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
-      "dev": true,
-      "requires": {
-        "array-each": "^1.0.1",
-        "array-slice": "^1.0.0",
-        "for-own": "^1.0.0",
-        "isobject": "^3.0.0"
-      }
-    },
-    "object.map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
-      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "object.omit": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
-      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
-      "dev": true,
-      "requires": {
-        "for-own": "^0.1.4",
-        "is-extendable": "^0.1.1"
-      },
-      "dependencies": {
-        "for-own": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
-          "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
-          "dev": true,
-          "requires": {
-            "for-in": "^1.0.1"
-          }
-        }
-      }
-    },
-    "object.pick": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
-      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
-      "dev": true,
-      "requires": {
-        "isobject": "^3.0.1"
-      }
-    },
-    "object.reduce": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
-      "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
-      "dev": true,
-      "requires": {
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "obuf": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
-      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true
-    },
-    "on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
-      "dev": true,
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "on-headers": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
-      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
-      "dev": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "one-time": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
-      "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=",
-      "dev": true
-    },
-    "onetime": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
-      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
-      "dev": true,
-      "requires": {
-        "mimic-fn": "^1.0.0"
-      }
-    },
-    "opn": {
-      "version": "3.0.3",
-      "resolved": "http://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
-      "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.0.1"
-      }
-    },
-    "optimist": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
-      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
-      "dev": true,
-      "requires": {
-        "minimist": "~0.0.1",
-        "wordwrap": "~0.0.2"
-      },
-      "dependencies": {
-        "wordwrap": {
-          "version": "0.0.3",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
-          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
-          "dev": true
-        }
-      }
-    },
-    "optionator": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
-      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
-      "dev": true,
-      "requires": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.4",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "wordwrap": "~1.0.0"
-      }
-    },
-    "ordered-read-streams": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
-      "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.1"
-      }
-    },
-    "os-homedir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-      "dev": true
-    },
-    "os-locale": {
-      "version": "1.4.0",
-      "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
-      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
-      "dev": true,
-      "requires": {
-        "lcid": "^1.0.0"
-      }
-    },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
-    "osenv": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
-      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0",
-        "os-tmpdir": "^1.0.0"
-      }
-    },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true
-    },
-    "p-map": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
-      "dev": true
-    },
-    "package-json": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
-      "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
-      "dev": true,
-      "requires": {
-        "got": "^6.7.1",
-        "registry-auth-token": "^3.0.1",
-        "registry-url": "^3.0.3",
-        "semver": "^5.1.0"
-      }
-    },
-    "param-case": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
-      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
-      "dev": true,
-      "requires": {
-        "no-case": "^2.2.0"
-      }
-    },
-    "parse-filepath": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
-      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
-      "dev": true,
-      "requires": {
-        "is-absolute": "^1.0.0",
-        "map-cache": "^0.2.0",
-        "path-root": "^0.1.1"
-      }
-    },
-    "parse-glob": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
-      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
-      "dev": true,
-      "requires": {
-        "glob-base": "^0.3.0",
-        "is-dotfile": "^1.0.0",
-        "is-extglob": "^1.0.0",
-        "is-glob": "^2.0.0"
-      },
-      "dependencies": {
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "is-glob": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        }
-      }
-    },
-    "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
-      "dev": true,
-      "requires": {
-        "error-ex": "^1.2.0"
-      }
-    },
-    "parse-passwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
-      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
-      "dev": true
-    },
-    "parse5": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-      "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
-      "dev": true
-    },
-    "parseqs": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
-      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
-      "dev": true,
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseuri": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
-      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
-      "dev": true,
-      "requires": {
-        "better-assert": "~1.0.0"
-      }
-    },
-    "parseurl": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
-      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
-      "dev": true
-    },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-      "dev": true
-    },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
-    "path-exists": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
-      "dev": true,
-      "requires": {
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-is-inside": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
-    },
-    "path-key": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
-      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
-      "dev": true
-    },
-    "path-root": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
-      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
-      "dev": true,
-      "requires": {
-        "path-root-regex": "^0.1.0"
-      }
-    },
-    "path-root-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
-      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
-      "dev": true
-    },
-    "path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
-      "dev": true
-    },
-    "path-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
-        }
-      }
-    },
-    "pem": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/pem/-/pem-1.13.2.tgz",
-      "integrity": "sha512-MPJWuEb/r6AG+GpZi2JnfNtGAZDeL/8+ERKwXEWRuST5i+4lq/Uy36B352OWIUSPQGH+HR1HEDcIDi+8cKxXNg==",
-      "dev": true,
-      "requires": {
-        "es6-promisify": "^6.0.0",
-        "md5": "^2.2.1",
-        "os-tmpdir": "^1.0.1",
-        "which": "^1.3.1"
-      },
-      "dependencies": {
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
-      "dev": true,
-      "optional": true
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true
-    },
-    "pify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-      "dev": true
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "plist": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
-      "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "base64-js": "1.2.0",
-        "xmlbuilder": "8.2.2",
-        "xmldom": "0.1.x"
-      }
-    },
-    "plugin-error": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
-      "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
-      "dev": true,
-      "requires": {
-        "ansi-cyan": "^0.1.1",
-        "ansi-red": "^0.1.1",
-        "arr-diff": "^1.0.1",
-        "arr-union": "^2.0.1",
-        "extend-shallow": "^1.1.2"
-      },
-      "dependencies": {
-        "arr-diff": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
-          "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1",
-            "array-slice": "^0.2.3"
-          }
-        },
-        "arr-union": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
-          "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
-          "dev": true
-        },
-        "array-slice": {
-          "version": "0.2.3",
-          "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
-          "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
-          "dev": true
-        },
-        "extend-shallow": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
-          "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^1.1.0"
-          }
-        },
-        "kind-of": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
-          "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
-          "dev": true
-        }
-      }
-    },
-    "pluralize": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
-      "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
-      "dev": true
-    },
-    "plylog": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/plylog/-/plylog-1.1.0.tgz",
-      "integrity": "sha512-/QnY5aSVaP54va6hruzNtAj02HpsLlAt7V5EndMrtq6ZUTZJKUja43rgiUtGXqm95yrSJjbZoPW0yQQQwLpoJA==",
-      "dev": true,
-      "requires": {
-        "logform": "^1.9.1",
-        "winston": "^3.0.0",
-        "winston-transport": "^4.2.0"
-      }
-    },
-    "polymer-analyzer": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.1.3.tgz",
-      "integrity": "sha512-PU2gp7I4PT9/oNweNaDOS/g8mnfxarDSvUCHJ/ThJSH/gkIeqtDr6v/35Eky8G/5NjE7rPHbY+l+PGXlTKAC9w==",
-      "dev": true,
-      "requires": {
-        "@babel/generator": "^7.0.0-beta.42",
-        "@babel/traverse": "^7.0.0-beta.42",
-        "@babel/types": "^7.0.0-beta.42",
-        "@types/babel-generator": "^6.25.1",
-        "@types/babel-traverse": "^6.25.2",
-        "@types/babel-types": "^6.25.1",
-        "@types/babylon": "^6.16.2",
-        "@types/chai-subset": "^1.3.0",
-        "@types/chalk": "^0.4.30",
-        "@types/clone": "^0.1.30",
-        "@types/cssbeautify": "^0.3.1",
-        "@types/doctrine": "^0.0.1",
-        "@types/is-windows": "^0.2.0",
-        "@types/minimatch": "^3.0.1",
-        "@types/parse5": "^2.2.34",
-        "@types/path-is-inside": "^1.0.0",
-        "@types/resolve": "0.0.6",
-        "@types/whatwg-url": "^6.4.0",
-        "babylon": "^7.0.0-beta.42",
-        "cancel-token": "^0.1.1",
-        "chalk": "^1.1.3",
-        "clone": "^2.0.0",
-        "cssbeautify": "^0.3.1",
-        "doctrine": "^2.0.2",
-        "dom5": "^3.0.0",
-        "indent": "0.0.2",
-        "is-windows": "^1.0.2",
-        "jsonschema": "^1.1.0",
-        "minimatch": "^3.0.4",
-        "parse5": "^4.0.0",
-        "path-is-inside": "^1.0.2",
-        "resolve": "^1.5.0",
-        "shady-css-parser": "^0.1.0",
-        "stable": "^0.1.6",
-        "strip-indent": "^2.0.0",
-        "vscode-uri": "^1.0.1",
-        "whatwg-url": "^6.4.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "polymer-build": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-3.1.0.tgz",
-      "integrity": "sha512-DwSiOtd1ERpGPfVCqi7SdSjW97yg4oGeUBtg2tnD/ZyEANNFSBCrkEtOFchKm/H5gCCjSEpLqqchTPrqZAYNcw==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.0.0",
-        "@babel/plugin-external-helpers": "^7.0.0",
-        "@babel/plugin-proposal-async-generator-functions": "^7.0.0",
-        "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
-        "@babel/plugin-syntax-async-generators": "^7.0.0",
-        "@babel/plugin-syntax-dynamic-import": "^7.0.0",
-        "@babel/plugin-syntax-import-meta": "^7.0.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
-        "@babel/plugin-transform-arrow-functions": "^7.0.0",
-        "@babel/plugin-transform-async-to-generator": "^7.0.0",
-        "@babel/plugin-transform-block-scoped-functions": "^7.0.0",
-        "@babel/plugin-transform-block-scoping": "^7.0.0",
-        "@babel/plugin-transform-classes": "^7.0.0",
-        "@babel/plugin-transform-computed-properties": "^7.0.0",
-        "@babel/plugin-transform-destructuring": "^7.0.0",
-        "@babel/plugin-transform-duplicate-keys": "^7.0.0",
-        "@babel/plugin-transform-exponentiation-operator": "^7.0.0",
-        "@babel/plugin-transform-for-of": "^7.0.0",
-        "@babel/plugin-transform-function-name": "^7.0.0",
-        "@babel/plugin-transform-instanceof": "^7.0.0",
-        "@babel/plugin-transform-literals": "^7.0.0",
-        "@babel/plugin-transform-modules-amd": "^7.0.0",
-        "@babel/plugin-transform-object-super": "^7.0.0",
-        "@babel/plugin-transform-parameters": "^7.0.0",
-        "@babel/plugin-transform-regenerator": "^7.0.0",
-        "@babel/plugin-transform-shorthand-properties": "^7.0.0",
-        "@babel/plugin-transform-spread": "^7.0.0",
-        "@babel/plugin-transform-sticky-regex": "^7.0.0",
-        "@babel/plugin-transform-template-literals": "^7.0.0",
-        "@babel/plugin-transform-typeof-symbol": "^7.0.0",
-        "@babel/plugin-transform-unicode-regex": "^7.0.0",
-        "@babel/traverse": "^7.0.0",
-        "@polymer/esm-amd-loader": "^1.0.0",
-        "@types/babel-types": "^6.25.1",
-        "@types/babylon": "^6.16.2",
-        "@types/gulp-if": "0.0.33",
-        "@types/html-minifier": "^3.5.1",
-        "@types/is-windows": "^0.2.0",
-        "@types/mz": "0.0.31",
-        "@types/parse5": "^2.2.34",
-        "@types/resolve": "0.0.7",
-        "@types/uuid": "^3.4.3",
-        "@types/vinyl": "^2.0.0",
-        "@types/vinyl-fs": "^2.4.8",
-        "babel-plugin-minify-guarded-expressions": "=0.4.1",
-        "babel-preset-minify": "=0.4.0-alpha.caaefb4c",
-        "babylon": "^7.0.0-beta.42",
-        "css-slam": "^2.1.2",
-        "dom5": "^3.0.0",
-        "gulp-if": "^2.0.2",
-        "html-minifier": "^3.5.10",
-        "matcher": "^1.1.0",
-        "multipipe": "^1.0.2",
-        "mz": "^2.6.0",
-        "parse5": "^4.0.0",
-        "plylog": "^1.0.0",
-        "polymer-analyzer": "^3.1.3",
-        "polymer-bundler": "^4.0.3",
-        "polymer-project-config": "^4.0.0",
-        "regenerator-runtime": "^0.11.1",
-        "stream": "0.0.2",
-        "sw-precache": "^5.1.1",
-        "uuid": "^3.2.1",
-        "vinyl": "^1.2.0",
-        "vinyl-fs": "^2.4.4"
-      },
-      "dependencies": {
-        "@types/mz": {
-          "version": "0.0.31",
-          "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
-          "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
-          "dev": true,
-          "requires": {
-            "@types/node": "*"
-          }
-        },
-        "@types/resolve": {
-          "version": "0.0.7",
-          "resolved": "http://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz",
-          "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==",
-          "dev": true,
-          "requires": {
-            "@types/node": "*"
-          }
-        },
-        "arr-diff": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
-          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
-          "dev": true,
-          "requires": {
-            "arr-flatten": "^1.0.1"
-          }
-        },
-        "array-unique": {
-          "version": "0.2.1",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
-          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
-          "dev": true
-        },
-        "braces": {
-          "version": "1.8.5",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
-          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
-          "dev": true,
-          "requires": {
-            "expand-range": "^1.8.1",
-            "preserve": "^0.2.0",
-            "repeat-element": "^1.1.2"
-          }
-        },
-        "clone": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
-          "dev": true
-        },
-        "clone-stats": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
-          "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
-          "dev": true
-        },
-        "expand-brackets": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
-          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
-          "dev": true,
-          "requires": {
-            "is-posix-bracket": "^0.1.0"
-          }
-        },
-        "extglob": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
-          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^1.0.0"
-          }
-        },
-        "glob": {
-          "version": "5.0.15",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
-          "dev": true,
-          "requires": {
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "2 || 3",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "glob-parent": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-          "dev": true,
-          "requires": {
-            "is-glob": "^3.1.0",
-            "path-dirname": "^1.0.0"
-          }
-        },
-        "glob-stream": {
-          "version": "5.3.5",
-          "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
-          "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
-          "dev": true,
-          "requires": {
-            "extend": "^3.0.0",
-            "glob": "^5.0.3",
-            "glob-parent": "^3.0.0",
-            "micromatch": "^2.3.7",
-            "ordered-read-streams": "^0.3.0",
-            "through2": "^0.6.0",
-            "to-absolute-glob": "^0.1.1",
-            "unique-stream": "^2.0.2"
-          },
-          "dependencies": {
-            "readable-stream": {
-              "version": "1.0.34",
-              "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
-              "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
-              "dev": true,
-              "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.1",
-                "isarray": "0.0.1",
-                "string_decoder": "~0.10.x"
-              }
-            },
-            "through2": {
-              "version": "0.6.5",
-              "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
-              "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
-              "dev": true,
-              "requires": {
-                "readable-stream": ">=1.0.33-1 <1.1.0-0",
-                "xtend": ">=4.0.0 <4.1.0-0"
-              }
-            }
-          }
-        },
-        "gulp-sourcemaps": {
-          "version": "1.6.0",
-          "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
-          "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
-          "dev": true,
-          "requires": {
-            "convert-source-map": "^1.1.1",
-            "graceful-fs": "^4.1.2",
-            "strip-bom": "^2.0.0",
-            "through2": "^2.0.0",
-            "vinyl": "^1.0.0"
-          }
-        },
-        "is-extglob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
-          "dev": true
-        },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        },
-        "micromatch": {
-          "version": "2.3.11",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
-          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^2.0.0",
-            "array-unique": "^0.2.1",
-            "braces": "^1.8.2",
-            "expand-brackets": "^0.1.4",
-            "extglob": "^0.3.1",
-            "filename-regex": "^2.0.0",
-            "is-extglob": "^1.0.0",
-            "is-glob": "^2.0.1",
-            "kind-of": "^3.0.2",
-            "normalize-path": "^2.0.1",
-            "object.omit": "^2.0.0",
-            "parse-glob": "^3.0.4",
-            "regex-cache": "^0.4.2"
-          },
-          "dependencies": {
-            "is-glob": {
-              "version": "2.0.1",
-              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-              "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
-              "dev": true,
-              "requires": {
-                "is-extglob": "^1.0.0"
-              }
-            }
-          }
-        },
-        "ordered-read-streams": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
-          "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
-          "dev": true,
-          "requires": {
-            "is-stream": "^1.0.1",
-            "readable-stream": "^2.0.1"
-          }
-        },
-        "replace-ext": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
-          "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
-          "dev": true
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        },
-        "vinyl": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
-          "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
-          "dev": true,
-          "requires": {
-            "clone": "^1.0.0",
-            "clone-stats": "^0.0.1",
-            "replace-ext": "0.0.1"
-          }
-        },
-        "vinyl-fs": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
-          "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
-          "dev": true,
-          "requires": {
-            "duplexify": "^3.2.0",
-            "glob-stream": "^5.3.2",
-            "graceful-fs": "^4.0.0",
-            "gulp-sourcemaps": "1.6.0",
-            "is-valid-glob": "^0.3.0",
-            "lazystream": "^1.0.0",
-            "lodash.isequal": "^4.0.0",
-            "merge-stream": "^1.0.0",
-            "mkdirp": "^0.5.0",
-            "object-assign": "^4.0.0",
-            "readable-stream": "^2.0.4",
-            "strip-bom": "^2.0.0",
-            "strip-bom-stream": "^1.0.0",
-            "through2": "^2.0.0",
-            "through2-filter": "^2.0.0",
-            "vali-date": "^1.0.0",
-            "vinyl": "^1.0.0"
-          }
-        }
-      }
-    },
-    "polymer-bundler": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-4.0.4.tgz",
-      "integrity": "sha512-XrTn//eNxushnirhM/+mLpUYEHGwZRh0w79J8rnFjocdoAttGvEK74G2oYkSAIWJYKGfpwqUZGrNUsNXvf/EvQ==",
-      "dev": true,
-      "requires": {
-        "@types/babel-generator": "^6.25.1",
-        "@types/babel-traverse": "^6.25.3",
-        "babel-generator": "^6.26.1",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "clone": "^2.1.0",
-        "command-line-args": "^5.0.2",
-        "command-line-usage": "^5.0.5",
-        "dom5": "^3.0.0",
-        "espree": "^3.5.2",
-        "magic-string": "^0.22.4",
-        "mkdirp": "^0.5.1",
-        "parse5": "^4.0.0",
-        "polymer-analyzer": "^3.1.3",
-        "rollup": "^0.64.1",
-        "source-map": "^0.5.6",
-        "vscode-uri": "^1.0.1"
-      },
-      "dependencies": {
-        "acorn-jsx": {
-          "version": "3.0.1",
-          "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
-          "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
-          "dev": true,
-          "requires": {
-            "acorn": "^3.0.4"
-          },
-          "dependencies": {
-            "acorn": {
-              "version": "3.3.0",
-              "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-              "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
-              "dev": true
-            }
-          }
-        },
-        "espree": {
-          "version": "3.5.4",
-          "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
-          "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
-          "dev": true,
-          "requires": {
-            "acorn": "^5.5.0",
-            "acorn-jsx": "^3.0.0"
-          }
-        },
-        "rollup": {
-          "version": "0.64.1",
-          "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.64.1.tgz",
-          "integrity": "sha512-+ThdVXrvonJdOTzyybMBipP0uz605Z8AnzWVY3rf+cSGnLO7uNkJBlN+9jXqWOomkvumXfm/esmBpA5d53qm7g==",
-          "dev": true,
-          "requires": {
-            "@types/estree": "0.0.39",
-            "@types/node": "*"
-          }
-        }
-      }
-    },
-    "polymer-project-config": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-4.0.2.tgz",
-      "integrity": "sha512-nnxLkbpYYPIVBYooeercovQIWqq4coHzQ5PwK2+NxNpVWUJ5tW3OCDt46dqw3CtJNe4r/qIOkPgBJdVwXAAEmw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "^9.6.4",
-        "browser-capabilities": "^1.0.0",
-        "jsonschema": "^1.1.1",
-        "minimatch-all": "^1.1.0",
-        "plylog": "^0.5.0"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "9.6.35",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.35.tgz",
-          "integrity": "sha512-h5zvHS8wXHGa+Gcqs9K8vqCgOtqjr0+NqG/DDJmQIX1wpR9HivAfgV8bjcD3mGM4bPfQw5Aneb2Pn8355L83jA==",
-          "dev": true
-        },
-        "async": {
-          "version": "1.0.0",
-          "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz",
-          "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
-          "dev": true
-        },
-        "colors": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
-          "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
-          "dev": true
-        },
-        "plylog": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
-          "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
-          "dev": true,
-          "requires": {
-            "@types/node": "^4.2.3",
-            "@types/winston": "^2.2.0",
-            "winston": "^2.2.0"
-          },
-          "dependencies": {
-            "@types/node": {
-              "version": "4.9.0",
-              "resolved": "https://registry.npmjs.org/@types/node/-/node-4.9.0.tgz",
-              "integrity": "sha512-xUFkZ+er9gUGw0x9qyfmr/Th0LuX6IB0m7HrRMB6sO6vcBVRFZ/3YV1EeiOC2fG50RX09avDfKwGBHOnPVxFeg==",
-              "dev": true
-            }
-          }
-        },
-        "winston": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz",
-          "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==",
-          "dev": true,
-          "requires": {
-            "async": "~1.0.0",
-            "colors": "1.0.x",
-            "cycle": "1.0.x",
-            "eyes": "0.1.x",
-            "isstream": "0.1.x",
-            "stack-trace": "0.0.x"
-          }
-        }
-      }
-    },
-    "polyserve": {
-      "version": "0.27.13",
-      "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.27.13.tgz",
-      "integrity": "sha512-9YlIJRx4TJ07ywVHpK/+W4tEPMcoJ4oyJWHkSDrPck5jmT5bitCme8dONCSxERZrE4J8hagHE3oOPa5U9iFfYg==",
-      "dev": true,
-      "requires": {
-        "@types/compression": "^0.0.33",
-        "@types/content-type": "^1.1.0",
-        "@types/escape-html": "0.0.20",
-        "@types/express": "^4.0.36",
-        "@types/mime": "^2.0.0",
-        "@types/mz": "0.0.29",
-        "@types/opn": "^3.0.28",
-        "@types/parse5": "^2.2.34",
-        "@types/pem": "^1.8.1",
-        "@types/resolve": "0.0.6",
-        "@types/serve-static": "^1.7.31",
-        "@types/spdy": "^3.4.1",
-        "bower-config": "^1.4.1",
-        "browser-capabilities": "^1.0.0",
-        "command-line-args": "^5.0.2",
-        "command-line-usage": "^5.0.5",
-        "compression": "^1.6.2",
-        "content-type": "^1.0.2",
-        "escape-html": "^1.0.3",
-        "express": "^4.8.5",
-        "find-port": "^1.0.1",
-        "http-proxy-middleware": "^0.17.2",
-        "lru-cache": "^4.0.2",
-        "mime": "^2.3.1",
-        "mz": "^2.4.0",
-        "opn": "^3.0.2",
-        "pem": "^1.8.3",
-        "polymer-build": "^3.1.0",
-        "polymer-project-config": "^4.0.0",
-        "requirejs": "^2.3.4",
-        "resolve": "^1.5.0",
-        "send": "^0.16.2",
-        "spdy": "^3.3.3"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "mime": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
-          "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
-          "dev": true
-        },
-        "send": {
-          "version": "0.16.2",
-          "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
-          "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "destroy": "~1.0.4",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "etag": "~1.8.1",
-            "fresh": "0.5.2",
-            "http-errors": "~1.6.2",
-            "mime": "1.4.1",
-            "ms": "2.0.0",
-            "on-finished": "~2.3.0",
-            "range-parser": "~1.2.0",
-            "statuses": "~1.4.0"
-          },
-          "dependencies": {
-            "mime": {
-              "version": "1.4.1",
-              "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
-              "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
-              "dev": true
-            }
-          }
-        },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
-          "dev": true
-        }
-      }
-    },
-    "posix-character-classes": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-      "dev": true
-    },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true
-    },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
-      "dev": true
-    },
-    "preserve": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
-      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
-      "dev": true
-    },
-    "pretty-bytes": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
-      "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
-      "dev": true
-    },
-    "pretty-hrtime": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
-      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
-      "dev": true
-    },
-    "private": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true
-    },
-    "process-nextick-args": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-      "dev": true
-    },
-    "progress": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
-      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
-      "dev": true
-    },
-    "proxy-addr": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
-      "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
-      "dev": true,
-      "requires": {
-        "forwarded": "~0.1.2",
-        "ipaddr.js": "1.8.0"
-      }
-    },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
-      "dev": true
-    },
-    "psl": {
-      "version": "1.1.29",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
-      "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
-      "dev": true,
-      "optional": true
-    },
-    "pump": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
-      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "pumpify": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
-      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.6.0",
-        "inherits": "^2.0.3",
-        "pump": "^2.0.0"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
-    },
-    "q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
-      "dev": true,
-      "optional": true
-    },
-    "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
-    },
-    "randomatic": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
-      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0",
-        "kind-of": "^6.0.0",
-        "math-random": "^1.0.1"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "range-parser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
-      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
-      "dev": true
-    },
-    "raw-body": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
-      "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
-      "dev": true,
-      "requires": {
-        "bytes": "3.0.0",
-        "http-errors": "1.6.3",
-        "iconv-lite": "0.4.23",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.4.23",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
-          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        }
-      }
-    },
-    "rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "dev": true,
-      "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
-      "dev": true,
-      "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
-      }
-    },
-    "read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
-      "dev": true,
-      "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.5",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
-      "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
-      "dev": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.0.3",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "readdirp": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "micromatch": "^3.1.10",
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "micromatch": {
-          "version": "3.1.10",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
-          "dev": true,
-          "requires": {
-            "arr-diff": "^4.0.0",
-            "array-unique": "^0.3.2",
-            "braces": "^2.3.1",
-            "define-property": "^2.0.2",
-            "extend-shallow": "^3.0.2",
-            "extglob": "^2.0.4",
-            "fragment-cache": "^0.2.1",
-            "kind-of": "^6.0.2",
-            "nanomatch": "^1.2.9",
-            "object.pick": "^1.3.0",
-            "regex-not": "^1.0.0",
-            "snapdragon": "^0.8.1",
-            "to-regex": "^3.0.2"
-          }
-        }
-      }
-    },
-    "rechoir": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
-      "dev": true,
-      "requires": {
-        "resolve": "^1.1.6"
-      }
-    },
-    "redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "requires": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      },
-      "dependencies": {
-        "strip-indent": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-          "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
-          "dev": true,
-          "requires": {
-            "get-stdin": "^4.0.1"
-          }
-        }
-      }
-    },
-    "reduce-flatten": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
-      "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
-      "dev": true
-    },
-    "regenerate": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
-      "dev": true
-    },
-    "regenerate-unicode-properties": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz",
-      "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==",
-      "dev": true,
-      "requires": {
-        "regenerate": "^1.4.0"
-      }
-    },
-    "regenerator-runtime": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-      "dev": true
-    },
-    "regenerator-transform": {
-      "version": "0.13.3",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz",
-      "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==",
-      "dev": true,
-      "requires": {
-        "private": "^0.1.6"
-      }
-    },
-    "regex-cache": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
-      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
-      "dev": true,
-      "requires": {
-        "is-equal-shallow": "^0.1.3"
-      }
-    },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "regexpp": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
-      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
-      "dev": true
-    },
-    "regexpu-core": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz",
-      "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==",
-      "dev": true,
-      "requires": {
-        "regenerate": "^1.4.0",
-        "regenerate-unicode-properties": "^7.0.0",
-        "regjsgen": "^0.4.0",
-        "regjsparser": "^0.3.0",
-        "unicode-match-property-ecmascript": "^1.0.4",
-        "unicode-match-property-value-ecmascript": "^1.0.2"
-      }
-    },
-    "registry-auth-token": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
-      "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
-      "dev": true,
-      "requires": {
-        "rc": "^1.1.6",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "registry-url": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
-      "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
-      "dev": true,
-      "requires": {
-        "rc": "^1.0.1"
-      }
-    },
-    "regjsgen": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz",
-      "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==",
-      "dev": true
-    },
-    "regjsparser": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz",
-      "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==",
-      "dev": true,
-      "requires": {
-        "jsesc": "~0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        }
-      }
-    },
-    "relateurl": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
-      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
-      "dev": true
-    },
-    "remove-bom-buffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
-      "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
-      "dev": true,
-      "requires": {
-        "is-buffer": "^1.1.5",
-        "is-utf8": "^0.2.1"
-      }
-    },
-    "remove-bom-stream": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
-      "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
-      "dev": true,
-      "requires": {
-        "remove-bom-buffer": "^3.0.0",
-        "safe-buffer": "^5.1.0",
-        "through2": "^2.0.3"
-      }
-    },
-    "remove-trailing-separator": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
-    },
-    "repeat-element": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
-      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
-      "dev": true
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
-      "dev": true
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
-    "replace-ext": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
-      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
-      "dev": true
-    },
-    "replace-homedir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
-      "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1",
-        "is-absolute": "^1.0.0",
-        "remove-trailing-separator": "^1.1.0"
-      }
-    },
-    "request": {
-      "version": "2.88.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
-      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.0",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.4.3",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      },
-      "dependencies": {
-        "extend": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-          "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-          "dev": true,
-          "optional": true
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
-      "dev": true
-    },
-    "require-uncached": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
-      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
-      "dev": true,
-      "requires": {
-        "caller-path": "^0.1.0",
-        "resolve-from": "^1.0.0"
-      }
-    },
-    "requirejs": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz",
-      "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==",
-      "dev": true
-    },
-    "requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
-      "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
-      "dev": true,
-      "requires": {
-        "path-parse": "^1.0.5"
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      }
-    },
-    "resolve-from": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
-      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
-      "dev": true
-    },
-    "resolve-options": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
-      "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
-      "dev": true,
-      "requires": {
-        "value-or-function": "^3.0.0"
-      }
-    },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-      "dev": true
-    },
-    "restore-cursor": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
-      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
-      "dev": true,
-      "requires": {
-        "onetime": "^2.0.0",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "rimraf": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
-      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.0.5"
-      }
-    },
-    "rollup": {
-      "version": "0.45.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.45.2.tgz",
-      "integrity": "sha512-2+bq5GQSrocdhr+M92mOQRmF1evtLRzv9NdmEC2wo7BILvTG8irHCtD0q+zg8ikNu63iJicdN5IzyxAXRTFKOQ==",
-      "dev": true,
-      "requires": {
-        "source-map-support": "^0.4.0"
-      }
-    },
-    "rollup-stream": {
-      "version": "1.23.1",
-      "resolved": "https://registry.npmjs.org/rollup-stream/-/rollup-stream-1.23.1.tgz",
-      "integrity": "sha512-niUbTM3sqckz1FNebsSiN+koCR7RdgrRZ2HCcR4V2DT9PSs53tB4z1xzdTGxrX6bo3QT00R2sQA5n1jr/to69Q==",
-      "dev": true,
-      "requires": {
-        "rollup": "^0.45.1"
-      }
-    },
-    "run-async": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
-      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
-      "dev": true,
-      "requires": {
-        "is-promise": "^2.1.0"
-      }
-    },
-    "run-sequence": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
-      "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.3",
-        "fancy-log": "^1.3.2",
-        "plugin-error": "^0.1.2"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "rxjs": {
-      "version": "6.3.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
-      "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
-      "dev": true,
-      "requires": {
-        "tslib": "^1.9.0"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
-      "dev": true
-    },
-    "safe-regex": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-      "dev": true,
-      "requires": {
-        "ret": "~0.1.10"
-      }
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
-    },
-    "samsam": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
-      "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
-      "dev": true
-    },
-    "sauce-connect-launcher": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz",
-      "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "adm-zip": "~0.4.3",
-        "async": "^2.1.2",
-        "https-proxy-agent": "^2.2.1",
-        "lodash": "^4.16.6",
-        "rimraf": "^2.5.4"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        }
-      }
-    },
-    "select-hose": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
-      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
-      "dev": true
-    },
-    "selenium-standalone": {
-      "version": "6.15.3",
-      "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.15.3.tgz",
-      "integrity": "sha512-BFzdXRB8yYPfCRcLxpJDBLWM0akTBP/x0hB0g+8AR7N/PEvbW39dM/hq0Yp1R0hihVQTPI3KkAJpW6h/f41S4g==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "async": "^2.1.4",
-        "commander": "^2.9.0",
-        "cross-spawn": "^6.0.0",
-        "debug": "^4.0.0",
-        "lodash": "^4.17.4",
-        "minimist": "^1.2.0",
-        "mkdirp": "^0.5.1",
-        "progress": "2.0.0",
-        "request": "2.88.0",
-        "tar-stream": "1.6.1",
-        "urijs": "^1.18.4",
-        "which": "^1.2.12",
-        "yauzl": "^2.5.0"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        },
-        "debug": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
-          "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true,
-          "optional": true
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "semver": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
-      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
-      "dev": true
-    },
-    "semver-diff": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
-      "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
-      "dev": true,
-      "requires": {
-        "semver": "^5.0.3"
-      }
-    },
-    "semver-greatest-satisfied-range": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
-      "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
-      "dev": true,
-      "requires": {
-        "sver-compat": "^1.5.0"
-      }
-    },
-    "send": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.11.1.tgz",
-      "integrity": "sha1-G+q/1C+eJwn5kCivMHisErRwktU=",
-      "dev": true,
-      "requires": {
-        "debug": "~2.1.1",
-        "depd": "~1.0.0",
-        "destroy": "1.0.3",
-        "escape-html": "1.0.1",
-        "etag": "~1.5.1",
-        "fresh": "0.2.4",
-        "mime": "1.2.11",
-        "ms": "0.7.0",
-        "on-finished": "~2.2.0",
-        "range-parser": "~1.0.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.1.3",
-          "resolved": "http://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
-          "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
-          "dev": true,
-          "requires": {
-            "ms": "0.7.0"
-          }
-        },
-        "depd": {
-          "version": "1.0.1",
-          "resolved": "http://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
-          "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
-          "dev": true
-        },
-        "destroy": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
-          "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
-          "dev": true
-        },
-        "ee-first": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
-          "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=",
-          "dev": true
-        },
-        "escape-html": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
-          "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=",
-          "dev": true
-        },
-        "etag": {
-          "version": "1.5.1",
-          "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
-          "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
-          "dev": true,
-          "requires": {
-            "crc": "3.2.1"
-          }
-        },
-        "fresh": {
-          "version": "0.2.4",
-          "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
-          "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=",
-          "dev": true
-        },
-        "mime": {
-          "version": "1.2.11",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
-          "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
-          "dev": true
-        },
-        "ms": {
-          "version": "0.7.0",
-          "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
-          "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=",
-          "dev": true
-        },
-        "on-finished": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
-          "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=",
-          "dev": true,
-          "requires": {
-            "ee-first": "1.1.0"
-          }
-        },
-        "range-parser": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
-          "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
-          "dev": true
-        }
-      }
-    },
-    "serve-static": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
-      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
-      "dev": true,
-      "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.2",
-        "send": "0.16.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "send": {
-          "version": "0.16.2",
-          "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
-          "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
-          "dev": true,
-          "requires": {
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "destroy": "~1.0.4",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "etag": "~1.8.1",
-            "fresh": "0.5.2",
-            "http-errors": "~1.6.2",
-            "mime": "1.4.1",
-            "ms": "2.0.0",
-            "on-finished": "~2.3.0",
-            "range-parser": "~1.2.0",
-            "statuses": "~1.4.0"
-          }
-        },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
-          "dev": true
-        }
-      }
-    },
-    "server-destroy": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
-      "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
-      "dev": true
-    },
-    "serviceworker-cache-polyfill": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
-      "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
-      "dev": true
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
-      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "setprototypeof": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true
-    },
-    "shady-css-parser": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
-      "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
-      "dev": true
-    },
-    "shebang-command": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^1.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true
-    },
-    "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-      "dev": true
-    },
-    "simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.3.1"
-      },
-      "dependencies": {
-        "is-arrayish": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
-          "dev": true
-        }
-      }
-    },
-    "sinon": {
-      "version": "1.17.7",
-      "resolved": "http://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
-      "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
-      "dev": true,
-      "requires": {
-        "formatio": "1.1.1",
-        "lolex": "1.3.2",
-        "samsam": "1.1.2",
-        "util": ">=0.10.3 <1"
-      }
-    },
-    "sinon-chai": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
-      "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
-      "dev": true
-    },
-    "slice-ansi": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
-      "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
-      "dev": true,
-      "requires": {
-        "is-fullwidth-code-point": "^2.0.0"
-      }
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "requires": {
-        "base": "^0.11.1",
-        "debug": "^2.2.0",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "map-cache": "^0.2.2",
-        "source-map": "^0.5.6",
-        "source-map-resolve": "^0.5.0",
-        "use": "^3.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "sntp": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
-      "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
-      "dev": true,
-      "requires": {
-        "hoek": "4.x.x"
-      }
-    },
-    "socket.io": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
-      "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==",
-      "dev": true,
-      "requires": {
-        "debug": "~3.1.0",
-        "engine.io": "~3.2.0",
-        "has-binary2": "~1.0.2",
-        "socket.io-adapter": "~1.1.0",
-        "socket.io-client": "2.1.1",
-        "socket.io-parser": "~3.2.0"
-      }
-    },
-    "socket.io-adapter": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
-      "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
-      "dev": true
-    },
-    "socket.io-client": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
-      "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
-      "dev": true,
-      "requires": {
-        "backo2": "1.0.2",
-        "base64-arraybuffer": "0.1.5",
-        "component-bind": "1.0.0",
-        "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "engine.io-client": "~3.2.0",
-        "has-binary2": "~1.0.2",
-        "has-cors": "1.1.0",
-        "indexof": "0.0.1",
-        "object-component": "0.0.3",
-        "parseqs": "0.0.5",
-        "parseuri": "0.0.5",
-        "socket.io-parser": "~3.2.0",
-        "to-array": "0.1.4"
-      }
-    },
-    "socket.io-parser": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
-      "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
-      "dev": true,
-      "requires": {
-        "component-emitter": "1.2.1",
-        "debug": "~3.1.0",
-        "isarray": "2.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
-          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
-          "dev": true
-        }
-      }
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
-    },
-    "source-map-resolve": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
-      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
-      "dev": true,
-      "requires": {
-        "atob": "^2.0.0",
-        "decode-uri-component": "^0.2.0",
-        "resolve-url": "^0.2.1",
-        "source-map-url": "^0.4.0",
-        "urix": "^0.1.0"
-      }
-    },
-    "source-map-support": {
-      "version": "0.4.18",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
-      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.5.6"
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
-    "sparkles": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
-      "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
-      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
-      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
-      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
-      "dev": true
-    },
-    "spdy": {
-      "version": "3.4.7",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
-      "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.8",
-        "handle-thing": "^1.2.5",
-        "http-deceiver": "^1.2.7",
-        "safe-buffer": "^5.0.1",
-        "select-hose": "^2.0.0",
-        "spdy-transport": "^2.0.18"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "spdy-transport": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
-      "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
-      "dev": true,
-      "requires": {
-        "debug": "^2.6.8",
-        "detect-node": "^2.0.3",
-        "hpack.js": "^2.1.6",
-        "obuf": "^1.1.1",
-        "readable-stream": "^2.2.9",
-        "safe-buffer": "^5.0.1",
-        "wbuf": "^1.7.2"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "sshpk": {
-      "version": "1.15.2",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
-      "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
-      "dev": true,
-      "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      }
-    },
-    "stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true
-    },
-    "stack-trace": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
-      "dev": true
-    },
-    "stacky": {
-      "version": "1.3.1",
-      "resolved": "http://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
-      "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.1",
-        "lodash": "^3.0.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-data-descriptor": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "^1.1.5"
-              }
-            }
-          }
-        },
-        "is-descriptor": {
-          "version": "0.1.6",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^0.1.6",
-            "is-data-descriptor": "^0.1.4",
-            "kind-of": "^5.0.0"
-          }
-        },
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-      "dev": true
-    },
-    "stream": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
-      "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
-      "dev": true,
-      "requires": {
-        "emitter-component": "^1.1.1"
-      }
-    },
-    "stream-counter": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz",
-      "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=",
-      "dev": true
-    },
-    "stream-exhaust": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
-      "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
-      "dev": true
-    },
-    "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
-      "dev": true
-    },
-    "streamsearch": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
-      "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
-      "dev": true
-    },
-    "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-      "dev": true,
-      "requires": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
-      }
-    },
-    "string_decoder": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "stringstream": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
-      "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
-      "dev": true
-    },
-    "strip-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^3.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        }
-      }
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-      "dev": true,
-      "requires": {
-        "is-utf8": "^0.2.0"
-      }
-    },
-    "strip-bom-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
-      "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
-      "dev": true,
-      "requires": {
-        "first-chunk-stream": "^1.0.0",
-        "strip-bom": "^2.0.0"
-      }
-    },
-    "strip-bom-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
-      "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
-      "dev": true
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true
-    },
-    "strip-indent": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
-      "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-      "dev": true
-    },
-    "supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-      "dev": true
-    },
-    "sver-compat": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
-      "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "^2.0.1",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "sw-precache": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
-      "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
-      "dev": true,
-      "requires": {
-        "dom-urls": "^1.1.0",
-        "es6-promise": "^4.0.5",
-        "glob": "^7.1.1",
-        "lodash.defaults": "^4.2.0",
-        "lodash.template": "^4.4.0",
-        "meow": "^3.7.0",
-        "mkdirp": "^0.5.1",
-        "pretty-bytes": "^4.0.2",
-        "sw-toolbox": "^3.4.0",
-        "update-notifier": "^2.3.0"
-      }
-    },
-    "sw-toolbox": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
-      "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
-      "dev": true,
-      "requires": {
-        "path-to-regexp": "^1.0.1",
-        "serviceworker-cache-polyfill": "^4.0.0"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "path-to-regexp": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
-          "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
-          "dev": true,
-          "requires": {
-            "isarray": "0.0.1"
-          }
-        }
-      }
-    },
-    "table": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz",
-      "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.5.3",
-        "lodash": "^4.17.10",
-        "slice-ansi": "1.0.0",
-        "string-width": "^2.1.1"
-      }
-    },
-    "table-layout": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.4.tgz",
-      "integrity": "sha512-uNaR3SRMJwfdp9OUr36eyEi6LLsbcTqTO/hfTsNviKsNeyMBPICJCC7QXRF3+07bAP6FRwA8rczJPBqXDc0CkQ==",
-      "dev": true,
-      "requires": {
-        "array-back": "^2.0.0",
-        "deep-extend": "~0.6.0",
-        "lodash.padend": "^4.6.1",
-        "typical": "^2.6.1",
-        "wordwrapjs": "^3.0.0"
-      }
-    },
-    "tar-stream": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz",
-      "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==",
-      "dev": true,
-      "requires": {
-        "bl": "^1.0.0",
-        "buffer-alloc": "^1.1.0",
-        "end-of-stream": "^1.0.0",
-        "fs-constants": "^1.0.0",
-        "readable-stream": "^2.3.0",
-        "to-buffer": "^1.1.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "temp": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
-      "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "os-tmpdir": "^1.0.0",
-        "rimraf": "~2.2.6"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.2.8",
-          "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
-          "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "term-size": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
-      "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
-      "dev": true,
-      "requires": {
-        "execa": "^0.7.0"
-      }
-    },
-    "ternary-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
-      "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
-      "dev": true,
-      "requires": {
-        "duplexify": "^3.5.0",
-        "fork-stream": "^0.0.4",
-        "merge-stream": "^1.0.0",
-        "through2": "^2.0.1"
-      }
-    },
-    "test-value": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
-      "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
-      "dev": true,
-      "requires": {
-        "array-back": "^2.0.0",
-        "typical": "^2.6.1"
-      }
-    },
-    "text-encoding": {
-      "version": "0.6.4",
-      "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
-      "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
-      "dev": true
-    },
-    "text-hex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
-      "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
-      "dev": true
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "thenify": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
-      "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
-      "dev": true,
-      "requires": {
-        "any-promise": "^1.0.0"
-      }
-    },
-    "thenify-all": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
-      "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
-      "dev": true,
-      "requires": {
-        "thenify": ">= 3.1.0 < 4"
-      }
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
-    },
-    "through2": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
-      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.1.5",
-        "xtend": "~4.0.1"
-      }
-    },
-    "through2-filter": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
-      "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
-      "dev": true,
-      "requires": {
-        "through2": "~2.0.0",
-        "xtend": "~4.0.0"
-      }
-    },
-    "time-stamp": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
-      "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
-      "dev": true
-    },
-    "timed-out": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
-      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
-      "dev": true
-    },
-    "timers-ext": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.5.tgz",
-      "integrity": "sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg==",
-      "dev": true,
-      "requires": {
-        "es5-ext": "~0.10.14",
-        "next-tick": "1"
-      }
-    },
-    "tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-      "dev": true,
-      "requires": {
-        "os-tmpdir": "~1.0.2"
-      }
-    },
-    "to-absolute-glob": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
-      "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "to-array": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
-      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
-      "dev": true
-    },
-    "to-buffer": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
-      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
-      "dev": true
-    },
-    "to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
-    },
-    "to-object-path": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "^1.1.5"
-          }
-        }
-      }
-    },
-    "to-regex": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-      "dev": true,
-      "requires": {
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "regex-not": "^1.0.2",
-        "safe-regex": "^1.1.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-      "dev": true,
-      "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      }
-    },
-    "to-through": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
-      "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
-      "dev": true,
-      "requires": {
-        "through2": "^2.0.3"
-      }
-    },
-    "tough-cookie": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
-      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "psl": "^1.1.24",
-        "punycode": "^1.4.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "tr46": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
-      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
-      "dev": true
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
-      "dev": true
-    },
-    "triple-beam": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
-      "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==",
-      "dev": true
-    },
-    "tslib": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
-      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
-      "dev": true
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true
-    },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2"
-      }
-    },
-    "type-detect": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
-      "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
-      "dev": true
-    },
-    "type-is": {
-      "version": "1.6.16",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
-      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
-      "dev": true,
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.18"
-      }
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
-      "dev": true
-    },
-    "typical": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
-      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
-      "dev": true
-    },
-    "ua-parser-js": {
-      "version": "0.7.19",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz",
-      "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==",
-      "dev": true
-    },
-    "uglify-js": {
-      "version": "3.4.9",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
-      "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
-      "dev": true,
-      "requires": {
-        "commander": "~2.17.1",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.17.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
-          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "ultron": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
-      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
-      "dev": true
-    },
-    "unc-path-regex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
-      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
-      "dev": true
-    },
-    "underscore": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
-      "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
-      "dev": true
-    },
-    "undertaker": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz",
-      "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "bach": "^1.0.0",
-        "collection-map": "^1.0.0",
-        "es6-weak-map": "^2.0.1",
-        "last-run": "^1.1.0",
-        "object.defaults": "^1.0.0",
-        "object.reduce": "^1.0.0",
-        "undertaker-registry": "^1.0.0"
-      }
-    },
-    "undertaker-registry": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
-      "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
-      "dev": true
-    },
-    "unicode-canonical-property-names-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
-      "dev": true
-    },
-    "unicode-match-property-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
-      "dev": true,
-      "requires": {
-        "unicode-canonical-property-names-ecmascript": "^1.0.4",
-        "unicode-property-aliases-ecmascript": "^1.0.4"
-      }
-    },
-    "unicode-match-property-value-ecmascript": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz",
-      "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==",
-      "dev": true
-    },
-    "unicode-property-aliases-ecmascript": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz",
-      "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==",
-      "dev": true
-    },
-    "union-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
-      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "get-value": "^2.0.6",
-        "is-extendable": "^0.1.1",
-        "set-value": "^0.4.3"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "set-value": {
-          "version": "0.4.3",
-          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
-          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.1",
-            "to-object-path": "^0.3.0"
-          }
-        }
-      }
-    },
-    "unique-stream": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
-      "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
-      "dev": true,
-      "requires": {
-        "json-stable-stringify": "^1.0.0",
-        "through2-filter": "^2.0.0"
-      }
-    },
-    "unique-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
-      "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
-      "dev": true,
-      "requires": {
-        "crypto-random-string": "^1.0.0"
-      }
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
-      "dev": true
-    },
-    "unset-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-      "dev": true,
-      "requires": {
-        "has-value": "^0.3.1",
-        "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "has-value": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-          "dev": true,
-          "requires": {
-            "get-value": "^2.0.3",
-            "has-values": "^0.1.4",
-            "isobject": "^2.0.0"
-          },
-          "dependencies": {
-            "isobject": {
-              "version": "2.1.0",
-              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-              "dev": true,
-              "requires": {
-                "isarray": "1.0.0"
-              }
-            }
-          }
-        },
-        "has-values": {
-          "version": "0.1.4",
-          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-          "dev": true
-        }
-      }
-    },
-    "untildify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
-      "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
-      "dev": true,
-      "requires": {
-        "os-homedir": "^1.0.0"
-      }
-    },
-    "unzip-response": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
-      "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
-      "dev": true
-    },
-    "upath": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
-      "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
-      "dev": true
-    },
-    "update-notifier": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
-      "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
-      "dev": true,
-      "requires": {
-        "boxen": "^1.2.1",
-        "chalk": "^2.0.1",
-        "configstore": "^3.0.0",
-        "import-lazy": "^2.1.0",
-        "is-ci": "^1.0.10",
-        "is-installed-globally": "^0.1.0",
-        "is-npm": "^1.0.0",
-        "latest-version": "^3.0.0",
-        "semver-diff": "^2.0.0",
-        "xdg-basedir": "^3.0.0"
-      }
-    },
-    "upper-case": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
-      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
-      "dev": true
-    },
-    "uri-js": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "urijs": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
-      "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
-      "dev": true
-    },
-    "urix": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-      "dev": true
-    },
-    "url-parse-lax": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
-      "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
-      "dev": true,
-      "requires": {
-        "prepend-http": "^1.0.1"
-      }
-    },
-    "use": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
-      "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      }
-    },
-    "util": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz",
-      "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==",
-      "dev": true,
-      "requires": {
-        "inherits": "2.0.3"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
-    },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
-      "dev": true
-    },
-    "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
-      "dev": true
-    },
-    "v8flags": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz",
-      "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "vali-date": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
-      "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
-      "dev": true
-    },
-    "validate-npm-package-license": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
-      "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "value-or-function": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
-      "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
-      "dev": true
-    },
-    "vargs": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
-      "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
-      "dev": true
-    },
-    "vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
-      "dev": true
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "vinyl": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
-      "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
-      "dev": true,
-      "requires": {
-        "clone": "^2.1.1",
-        "clone-buffer": "^1.0.0",
-        "clone-stats": "^1.0.0",
-        "cloneable-readable": "^1.0.0",
-        "remove-trailing-separator": "^1.0.1",
-        "replace-ext": "^1.0.0"
-      }
-    },
-    "vinyl-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz",
-      "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=",
-      "dev": true,
-      "requires": {
-        "bl": "^1.2.1",
-        "through2": "^2.0.3"
-      }
-    },
-    "vinyl-fs": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
-      "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
-      "dev": true,
-      "requires": {
-        "fs-mkdirp-stream": "^1.0.0",
-        "glob-stream": "^6.1.0",
-        "graceful-fs": "^4.0.0",
-        "is-valid-glob": "^1.0.0",
-        "lazystream": "^1.0.0",
-        "lead": "^1.0.0",
-        "object.assign": "^4.0.4",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.3.3",
-        "remove-bom-buffer": "^3.0.0",
-        "remove-bom-stream": "^1.2.0",
-        "resolve-options": "^1.1.0",
-        "through2": "^2.0.0",
-        "to-through": "^2.0.0",
-        "value-or-function": "^3.0.0",
-        "vinyl": "^2.0.0",
-        "vinyl-sourcemap": "^1.1.0"
-      },
-      "dependencies": {
-        "is-valid-glob": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
-          "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
-          "dev": true
-        }
-      }
-    },
-    "vinyl-source-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz",
-      "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=",
-      "dev": true,
-      "requires": {
-        "through2": "^2.0.3",
-        "vinyl": "^2.1.0"
-      }
-    },
-    "vinyl-sourcemap": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
-      "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
-      "dev": true,
-      "requires": {
-        "append-buffer": "^1.0.2",
-        "convert-source-map": "^1.5.0",
-        "graceful-fs": "^4.1.6",
-        "normalize-path": "^2.1.1",
-        "now-and-later": "^2.0.0",
-        "remove-bom-buffer": "^3.0.0",
-        "vinyl": "^2.0.0"
-      }
-    },
-    "vinyl-sourcemaps-apply": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
-      "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.5.1"
-      }
-    },
-    "vlq": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
-      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
-      "dev": true
-    },
-    "vscode-uri": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz",
-      "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==",
-      "dev": true
-    },
-    "wbuf": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
-      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
-      "dev": true,
-      "requires": {
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "wct-browser-legacy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wct-browser-legacy/-/wct-browser-legacy-1.0.2.tgz",
-      "integrity": "sha512-23rbZwBh/DxWU36htJN9lsyBq3NxgVbuyMUq7fgFP6ZVTel+uFWO6LPXPoZQ6VyvXvlUYLE5PxY+ZdJ88a4COw==",
-      "dev": true,
-      "requires": {
-        "@polymer/polymer": "^3.0.0",
-        "@polymer/sinonjs": "^1.14.1",
-        "@polymer/test-fixture": "^3.0.0-pre.1",
-        "@webcomponents/webcomponentsjs": "^2.0.0",
-        "accessibility-developer-tools": "^2.12.0",
-        "async": "^1.5.2",
-        "chai": "^3.5.0",
-        "lodash": "^3.10.1",
-        "mocha": "^3.4.2",
-        "sinon": "^1.17.1",
-        "sinon-chai": "^2.10.0",
-        "stacky": "^1.3.1"
-      },
-      "dependencies": {
-        "@webcomponents/webcomponentsjs": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.1.3.tgz",
-          "integrity": "sha512-0UHJNY88lR3pnEYtBVT7F8cuuxOiITQGWJa0LxoELqkBSB7IabzJFOj5K99PajD3CGAsWpjB0CAeijfe376Y1w==",
-          "dev": true
-        },
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
-          "dev": true
-        }
-      }
-    },
-    "wct-local": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/wct-local/-/wct-local-2.1.3.tgz",
-      "integrity": "sha512-pOGyT07Bh6TAJVk7E3P+n5RybjtYBqm745fCfY5vuhQd069mN1WUlivMgZzWfJuvuXVpKFkAERrN/+tTjbmgmQ==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "@types/express": "^4.0.30",
-        "@types/freeport": "^1.0.19",
-        "@types/launchpad": "^0.6.0",
-        "@types/which": "^1.3.1",
-        "chalk": "^2.3.0",
-        "cleankill": "^2.0.0",
-        "freeport": "^1.0.4",
-        "launchpad": "^0.7.0",
-        "selenium-standalone": "^6.7.0",
-        "which": "^1.0.8"
-      }
-    },
-    "wct-sauce": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wct-sauce/-/wct-sauce-2.1.0.tgz",
-      "integrity": "sha512-c3R4PJcbpS7Gxv2vZ4HDAqpXV6cT9peslAWMU7hHH9PMhKDPbn8RNa6E4DVL0tOmZznB+3cRmtZ6+vJ/aDwu1A==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^2.4.1",
-        "cleankill": "^2.0.0",
-        "lodash": "^4.17.10",
-        "request": "^2.85.0",
-        "sauce-connect-launcher": "^1.0.0",
-        "temp": "^0.8.1",
-        "uuid": "^3.2.1"
-      }
-    },
-    "wd": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/wd/-/wd-1.11.0.tgz",
-      "integrity": "sha512-h2EBfJvmsWocIjOOg5BsHh9IJKrqZDG4Az4jEZhFugEH7sOPcX6feZQ30aFuktqDI0jquarZJmNpA6V0A0Q7Mg==",
-      "dev": true,
-      "requires": {
-        "archiver": "2.1.1",
-        "async": "2.0.1",
-        "lodash": "4.17.10",
-        "mkdirp": "^0.5.1",
-        "q": "1.4.1",
-        "request": "2.85.0",
-        "vargs": "0.1.0"
-      },
-      "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-          "dev": true,
-          "requires": {
-            "co": "^4.6.0",
-            "fast-deep-equal": "^1.0.0",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.3.0"
-          }
-        },
-        "async": {
-          "version": "2.0.1",
-          "resolved": "http://registry.npmjs.org/async/-/async-2.0.1.tgz",
-          "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.8.0"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "1.1.0",
-          "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
-          "dev": true
-        },
-        "har-validator": {
-          "version": "5.0.3",
-          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
-          "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
-          "dev": true,
-          "requires": {
-            "ajv": "^5.1.0",
-            "har-schema": "^2.0.0"
-          }
-        },
-        "json-schema-traverse": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
-          "dev": true
-        },
-        "lodash": {
-          "version": "4.17.10",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
-          "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
-          "dev": true
-        },
-        "oauth-sign": {
-          "version": "0.8.2",
-          "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-          "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
-          "dev": true
-        },
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        },
-        "q": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
-          "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
-          "dev": true
-        },
-        "request": {
-          "version": "2.85.0",
-          "resolved": "http://registry.npmjs.org/request/-/request-2.85.0.tgz",
-          "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
-          "dev": true,
-          "requires": {
-            "aws-sign2": "~0.7.0",
-            "aws4": "^1.6.0",
-            "caseless": "~0.12.0",
-            "combined-stream": "~1.0.5",
-            "extend": "~3.0.1",
-            "forever-agent": "~0.6.1",
-            "form-data": "~2.3.1",
-            "har-validator": "~5.0.3",
-            "hawk": "~6.0.2",
-            "http-signature": "~1.2.0",
-            "is-typedarray": "~1.0.0",
-            "isstream": "~0.1.2",
-            "json-stringify-safe": "~5.0.1",
-            "mime-types": "~2.1.17",
-            "oauth-sign": "~0.8.2",
-            "performance-now": "^2.1.0",
-            "qs": "~6.5.1",
-            "safe-buffer": "^5.1.1",
-            "stringstream": "~0.0.5",
-            "tough-cookie": "~2.3.3",
-            "tunnel-agent": "^0.6.0",
-            "uuid": "^3.1.0"
-          }
-        },
-        "tough-cookie": {
-          "version": "2.3.4",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
-          "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
-          "dev": true,
-          "requires": {
-            "punycode": "^1.4.1"
-          }
-        }
-      }
-    },
-    "web-component-tester": {
-      "version": "6.9.0",
-      "resolved": "https://registry.npmjs.org/web-component-tester/-/web-component-tester-6.9.0.tgz",
-      "integrity": "sha512-l5KzzhlHJQ+I2qtVlo5cdUZdXenfb70mNJdHdOXc9YdgpUdkT1kQ9cRKWguaVpXQmphcpWjw8KOgkf5oUkafUw==",
-      "dev": true,
-      "requires": {
-        "@polymer/sinonjs": "^1.14.1",
-        "@polymer/test-fixture": "^0.0.3",
-        "@webcomponents/webcomponentsjs": "^1.0.7",
-        "accessibility-developer-tools": "^2.12.0",
-        "async": "^2.4.1",
-        "body-parser": "^1.17.2",
-        "bower-config": "^1.4.0",
-        "chalk": "^1.1.3",
-        "cleankill": "^2.0.0",
-        "express": "^4.15.3",
-        "findup-sync": "^2.0.0",
-        "glob": "^7.1.2",
-        "lodash": "^3.10.1",
-        "multer": "^1.3.0",
-        "nomnom": "^1.8.1",
-        "polyserve": "^0.27.13",
-        "resolve": "^1.5.0",
-        "semver": "^5.3.0",
-        "send": "^0.11.1",
-        "server-destroy": "^1.0.1",
-        "sinon": "^2.3.5",
-        "sinon-chai": "^2.10.0",
-        "socket.io": "^2.0.3",
-        "stacky": "^1.3.1",
-        "update-notifier": "^2.2.0",
-        "wct-local": "^2.1.1",
-        "wct-sauce": "^2.0.2",
-        "wd": "^1.2.0"
-      },
-      "dependencies": {
-        "@polymer/test-fixture": {
-          "version": "0.0.3",
-          "resolved": "http://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-0.0.3.tgz",
-          "integrity": "sha1-REN1JpfU2Sk7vEEuoLXk00HxSdk=",
-          "dev": true
-        },
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          },
-          "dependencies": {
-            "lodash": {
-              "version": "4.17.11",
-              "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-              "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
-              "dev": true
-            }
-          }
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "formatio": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
-          "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
-          "dev": true,
-          "requires": {
-            "samsam": "1.x"
-          }
-        },
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "lodash": {
-          "version": "3.10.1",
-          "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
-          "dev": true
-        },
-        "lolex": {
-          "version": "1.6.0",
-          "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
-          "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
-          "dev": true
-        },
-        "path-to-regexp": {
-          "version": "1.7.0",
-          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
-          "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
-          "dev": true,
-          "requires": {
-            "isarray": "0.0.1"
-          }
-        },
-        "samsam": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
-          "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
-          "dev": true
-        },
-        "sinon": {
-          "version": "2.4.1",
-          "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
-          "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
-          "dev": true,
-          "requires": {
-            "diff": "^3.1.0",
-            "formatio": "1.2.0",
-            "lolex": "^1.6.0",
-            "native-promise-only": "^0.8.1",
-            "path-to-regexp": "^1.7.0",
-            "samsam": "^1.1.3",
-            "text-encoding": "0.6.4",
-            "type-detect": "^4.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "type-detect": {
-          "version": "4.0.8",
-          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-          "dev": true
-        }
-      }
-    },
-    "webidl-conversions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
-      "dev": true
-    },
-    "whatwg-url": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
-      "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
-      "dev": true,
-      "requires": {
-        "lodash.sortby": "^4.7.0",
-        "tr46": "^1.0.1",
-        "webidl-conversions": "^4.0.2"
-      }
-    },
-    "which": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
-      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
-      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
-      "dev": true
-    },
-    "widest-line": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
-      "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^2.1.1"
-      }
-    },
-    "winston": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz",
-      "integrity": "sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg==",
-      "dev": true,
-      "requires": {
-        "async": "^2.6.0",
-        "diagnostics": "^1.1.1",
-        "is-stream": "^1.1.0",
-        "logform": "^1.9.1",
-        "one-time": "0.0.4",
-        "readable-stream": "^2.3.6",
-        "stack-trace": "0.0.x",
-        "triple-beam": "^1.3.0",
-        "winston-transport": "^4.2.0"
-      },
-      "dependencies": {
-        "async": {
-          "version": "2.6.1",
-          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
-          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
-          "dev": true,
-          "requires": {
-            "lodash": "^4.17.10"
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "winston-transport": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz",
-      "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.3.6",
-        "triple-beam": "^1.2.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "wordwrap": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-      "dev": true
-    },
-    "wordwrapjs": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
-      "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
-      "dev": true,
-      "requires": {
-        "reduce-flatten": "^1.0.1",
-        "typical": "^2.6.1"
-      }
-    },
-    "wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
-      },
-      "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-          "dev": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "write": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
-      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^0.5.1"
-      }
-    },
-    "write-file-atomic": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
-      "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "imurmurhash": "^0.1.4",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "ws": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
-      "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
-      "dev": true,
-      "requires": {
-        "async-limiter": "~1.0.0",
-        "safe-buffer": "~5.1.0",
-        "ultron": "~1.1.0"
-      }
-    },
-    "xdg-basedir": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
-      "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
-      "dev": true
-    },
-    "xmlbuilder": {
-      "version": "8.2.2",
-      "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
-      "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
-      "dev": true,
-      "optional": true
-    },
-    "xmldom": {
-      "version": "0.1.27",
-      "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
-      "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
-      "dev": true,
-      "optional": true
-    },
-    "xmlhttprequest-ssl": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
-      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
-      "dev": true
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
-      "dev": true
-    },
-    "y18n": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
-      "dev": true
-    },
-    "yallist": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
-      "dev": true
-    },
-    "yargs": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
-      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^3.0.0",
-        "cliui": "^3.2.0",
-        "decamelize": "^1.1.1",
-        "get-caller-file": "^1.0.1",
-        "os-locale": "^1.4.0",
-        "read-pkg-up": "^1.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^1.0.1",
-        "set-blocking": "^2.0.0",
-        "string-width": "^1.0.2",
-        "which-module": "^1.0.0",
-        "y18n": "^3.2.1",
-        "yargs-parser": "^5.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-          "dev": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        }
-      }
-    },
-    "yargs-parser": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
-      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^3.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
-          "dev": true
-        }
-      }
-    },
-    "yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    },
-    "yeast": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
-      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
-      "dev": true
-    },
-    "zip-stream": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
-      "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
-      "dev": true,
-      "requires": {
-        "archiver-utils": "^1.3.0",
-        "compress-commons": "^1.2.0",
-        "lodash": "^4.8.0",
-        "readable-stream": "^2.0.0"
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/package.json b/systrace/catapult/third_party/polymer/components/shadycss/package.json
deleted file mode 100644
index 3d36d67..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/package.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "name": "@webcomponents/shadycss",
-  "version": "1.7.1",
-  "description": "Styling helpers for ShadyDOM",
-  "main": "shadycss.min.js",
-  "directories": {
-    "test": "tests"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/webcomponents/shadycss.git"
-  },
-  "author": "The Polymer Project Authors (https://polymer.github.io/AUTHORS.txt)",
-  "license": "BSD-3-Clause",
-  "keywords": [
-    "shady-css",
-    "shadycss",
-    "shadow-css",
-    "shadowcss",
-    "web-components",
-    "webcomponents",
-    "polyfill",
-    "shim"
-  ],
-  "bugs": {
-    "url": "https://github.com/webcomponents/shadycss/issues"
-  },
-  "scripts": {
-    "build": "gulp",
-    "debug": "gulp debug",
-    "lint": "eslint src tests entrypoints",
-    "test": "npm run lint && gulp && wct",
-    "prepack": "gulp closure"
-  },
-  "files": [
-    "apply-shim.html",
-    "apply-shim.min.js*",
-    "custom-style-interface.html",
-    "custom-style-interface.min.js*",
-    "scoping-shim.min.js*",
-    "entrypoints/**/*.js",
-    "src/**/*.js",
-    "externs/**/*.js"
-  ],
-  "homepage": "https://webcomponents.org/polyfills",
-  "devDependencies": {
-    "@webcomponents/custom-elements": "^1.2.1",
-    "@webcomponents/html-imports": "^1.2.0",
-    "@webcomponents/shadydom": "1.1.2",
-    "@webcomponents/template": "^1.4.0",
-    "@webcomponents/webcomponents-platform": "^1.0.0",
-    "del": "^3.0.0",
-    "es6-promise": "^4.2.5",
-    "eslint": "^5.7.0",
-    "eslint-plugin-html": "^4.0.6",
-    "google-closure-compiler": "^20180805.0.0",
-    "gulp": "^4.0.0",
-    "gulp-rename": "^1.4.0",
-    "gulp-size": "^3.0.0",
-    "gulp-sourcemaps": "^2.6.4",
-    "rollup-stream": "=1.23.1",
-    "run-sequence": "^2.2.1",
-    "vinyl-buffer": "^1.0.1",
-    "vinyl-source-stream": "^2.0.0",
-    "wct-browser-legacy": "^1.0.2",
-    "web-component-tester": "^6.9.0"
-  },
-  "publishConfig": {
-    "access": "public"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/scoping-shim.min.js b/systrace/catapult/third_party/polymer/components/shadycss/scoping-shim.min.js
deleted file mode 100644
index 61794b4..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/scoping-shim.min.js
+++ /dev/null
@@ -1,58 +0,0 @@
-(function(){/*
-
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-'use strict';var k,aa="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function n(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
-function p(a){a=a.replace(ba,"").replace(ca,"");var b=da,c=a,e=new n;e.start=0;e.end=c.length;for(var d=e,f=0,g=c.length;f<g;f++)if("{"===c[f]){d.rules||(d.rules=[]);var h=d,l=h.rules[h.rules.length-1]||null;d=new n;d.start=f+1;d.parent=h;d.previous=l;h.rules.push(d)}else"}"===c[f]&&(d.end=f+1,d=d.parent||e);return b(e,a)}
-function da(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=ea(c),c=c.replace(fa," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=ha:c.match(ia)&&(a.type=q,a.keyframesName=a.selector.split(fa).pop()):a.type=0===c.indexOf("--")?ja:ka);if(c=a.rules)for(var e=0,d=c.length,f=void 0;e<d&&(f=c[e]);e++)da(f,
-b);return a}function ea(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
-function la(a,b,c){c=void 0===c?"":c;var e="";if(a.cssText||a.rules){var d=a.rules,f;if(f=d)f=d[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var g=d.length,h=void 0;f<g&&(h=d[f]);f++)e=la(h,b,e)}else b?b=a.cssText:(b=a.cssText,b=b.replace(ma,"").replace(na,""),b=b.replace(oa,"").replace(pa,"")),(e=b.trim())&&(e="  "+e+"\n")}e&&(a.selector&&(c+=a.selector+" {\n"),c+=e,a.selector&&(c+="}\n\n"));return c}
-var ka=1,q=7,ha=4,ja=1E3,ba=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,ca=/@import[^;]*;/gim,ma=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,na=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,oa=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,pa=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,ia=/^@[^\s]*keyframes/,fa=/\s+/g;var r=!(window.ShadyDOM&&window.ShadyDOM.inUse),t;function qa(a){t=a&&a.shimcssproperties?!1:r||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}var ra;window.ShadyCSS&&void 0!==window.ShadyCSS.cssBuild&&(ra=window.ShadyCSS.cssBuild);window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?t=window.ShadyCSS.nativeCss:window.ShadyCSS?(qa(window.ShadyCSS),window.ShadyCSS=void 0):qa(window.WebComponents&&window.WebComponents.flags);
-var u=t,v=ra;var w=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,x=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,sa=/(--[\w-]+)\s*([:,;)]|$)/gi,ta=/(animation\s*:)|(animation-name\s*:)/,ua=/@media\s(.*)/,va=/\{[^}]*\}/g;var wa=new Set;function y(a,b){if(!a)return"";"string"===typeof a&&(a=p(a));b&&z(a,b);return la(a,u)}function A(a){!a.__cssRules&&a.textContent&&(a.__cssRules=p(a.textContent));return a.__cssRules||null}function xa(a){return!!a.parent&&a.parent.type===q}function z(a,b,c,e){if(a){var d=!1,f=a.type;if(e&&f===ha){var g=a.selector.match(ua);g&&(window.matchMedia(g[1]).matches||(d=!0))}f===ka?b(a):c&&f===q?c(a):f===ja&&(d=!0);if((a=a.rules)&&!d)for(d=0,f=a.length,g=void 0;d<f&&(g=a[d]);d++)z(g,b,c,e)}}
-function B(a,b,c,e){var d=document.createElement("style");b&&d.setAttribute("scope",b);d.textContent=a;ya(d,c,e);return d}var C=null;function za(a){a=document.createComment(" Shady DOM styles for "+a+" ");var b=document.head;b.insertBefore(a,(C?C.nextSibling:null)||b.firstChild);return C=a}function ya(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);C?a.compareDocumentPosition(C)===Node.DOCUMENT_POSITION_PRECEDING&&(C=a):C=a}
-function D(a,b){for(var c=0,e=a.length;b<e;b++)if("("===a[b])c++;else if(")"===a[b]&&0===--c)return b;return-1}function Aa(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");var e=D(a,c+3),d=a.substring(c+4,e);c=a.substring(0,c);a=Aa(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function E(a,b){r?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
-var F=window.ShadyDOM&&window.ShadyDOM.wrap||function(a){return a};function G(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,s:c}}function Ba(a){for(var b=[],c="",e=0;0<=e&&e<a.length;e++)if("("===a[e]){var d=D(a,e);c+=a.slice(e,d+1);e=d}else","===a[e]?(b.push(c),c=""):c+=a[e];c&&b.push(c);return b}
-function H(a){if(void 0!==v)return v;if(void 0===a.__cssBuild){var b=a.getAttribute("css-build");if(b)a.__cssBuild=b;else{a:{b="template"===a.localName?a.content.firstChild:a.firstChild;if(b instanceof Comment&&(b=b.textContent.trim().split(":"),"css-build"===b[0])){b=b[1];break a}b=""}if(""!==b){var c="template"===a.localName?a.content.firstChild:a.firstChild;c.parentNode.removeChild(c)}a.__cssBuild=b}}return a.__cssBuild||""}
-function Ca(a){a=void 0===a?"":a;return""!==a&&u?r?"shadow"===a:"shady"===a:!1};function I(){}function Da(a,b){J(K,a,function(a){L(a,b||"")})}function J(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);var e;"template"===b.localName?e=(b.content||b._content||b).childNodes:e=b.children||b.childNodes;if(e)for(b=0;b<e.length;b++)J(a,e[b],c)}
-function L(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var e=a.getAttribute("class");c?e&&(b=e.replace("style-scope","").replace(b,""),E(a,b)):E(a,(e?e+" ":"")+"style-scope "+b)}}function Ea(a,b,c){J(K,a,function(a){L(a,b,!0);L(a,c)})}function Fa(a,b){J(K,a,function(a){L(a,b||"",!0)})}
-function M(a,b,c,e,d){var f=K;d=void 0===d?"":d;""===d&&(r||"shady"===(void 0===e?"":e)?d=y(b,c):(a=G(a),d=Ga(f,b,a.is,a.s,c)+"\n\n"));return d.trim()}function Ga(a,b,c,e,d){var f=Ha(c,e);c=c?"."+c:"";return y(b,function(b){b.c||(b.selector=b.g=Ia(a,b,a.b,c,f),b.c=!0);d&&d(b,c,f)})}function Ha(a,b){return b?"[is="+a+"]":a}function Ia(a,b,c,e,d){var f=Ba(b.selector);if(!xa(b)){b=0;for(var g=f.length,h=void 0;b<g&&(h=f[b]);b++)f[b]=c.call(a,h,e,d)}return f.filter(function(a){return!!a}).join(",")}
-function Ja(a){return a.replace(Ka,function(a,c,e){-1<e.indexOf("+")?e=e.replace(/\+/g,"___"):-1<e.indexOf("___")&&(e=e.replace(/___/g,"+"));return":"+c+"("+e+")"})}function La(a){for(var b=[],c;c=a.match(Ma);){var e=c.index,d=D(a,e);if(-1===d)throw Error(c.input+" selector missing ')'");c=a.slice(e,d+1);a=a.replace(c,"\ue000");b.push(c)}return{A:a,matches:b}}function Na(a,b){var c=a.split("\ue000");return b.reduce(function(a,b,f){return a+b+c[f+1]},c[0])}
-I.prototype.b=function(a,b,c){var e=!1;a=a.trim();var d=Ka.test(a);d&&(a=a.replace(Ka,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=Ja(a));var f=Ma.test(a);if(f){var g=La(a);a=g.A;g=g.matches}a=a.replace(Oa,":host $1");a=a.replace(Pa,function(a,d,f){e||(a=Qa(f,d,b,c),e=e||a.stop,d=a.G,f=a.value);return d+f});f&&(a=Na(a,g));d&&(a=Ja(a));return a};
-function Qa(a,b,c,e){var d=a.indexOf("::slotted");0<=a.indexOf(":host")?a=Ra(a,e):0!==d&&(a=c?Sa(a,c):a);c=!1;0<=d&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Ta,function(a,b){return" > "+b}))}a=a.replace(Ua,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,G:b,stop:f}}function Sa(a,b){a=a.split(/(\[.+?\])/);for(var c=[],e=0;e<a.length;e++)if(1===e%2)c.push(a[e]);else{var d=a[e];if(""!==d||e!==a.length-1)d=d.split(":"),d[0]+=b,c.push(d.join(":"))}return c.join("")}
-function Ra(a,b){var c=a.match(Va);return(c=c&&c[2].trim()||"")?c[0].match(Wa)?a.replace(Va,function(a,c,f){return b+f}):c.split(Wa)[0]===b?c:"should_not_match":a.replace(":host",b)}function Xa(a){":root"===a.selector&&(a.selector="html")}I.prototype.c=function(a){return a.match(":host")?"":a.match("::slotted")?this.b(a,":not(.style-scope)"):Sa(a.trim(),":not(.style-scope)")};aa.Object.defineProperties(I.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
-var Ka=/:(nth[-\w]+)\(([^)]+)\)/,Pa=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Wa=/[[.:#*]/,Oa=/^(::slotted)/,Va=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Ta=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Ua=/(.*):dir\((?:(ltr|rtl))\)/,Ma=/:(?:matches|any|-(?:webkit|moz)-any)/,K=new I;function N(a,b,c,e,d){this.m=a||null;this.b=b||null;this.w=c||[];this.o=null;this.cssBuild=d||"";this.s=e||"";this.a=this.i=this.l=null}function P(a){return a?a.__styleInfo:null}function Ya(a,b){return a.__styleInfo=b}N.prototype.c=function(){return this.m};N.prototype._getStyleRules=N.prototype.c;function Za(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var $a=navigator.userAgent.match("Trident");function ab(){}function bb(a){var b={},c=[],e=0;z(a,function(a){Q(a);a.index=e++;a=a.f.cssText;for(var c;c=sa.exec(a);){var d=c[1];":"!==c[2]&&(b[d]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var d in b)a.push(d);return a}
-function Q(a){if(!a.f){var b={},c={};R(a,c)&&(b.j=c,a.rules=null);b.cssText=a.parsedCssText.replace(va,"").replace(w,"");a.f=b}}function R(a,b){var c=a.f;if(c){if(c.j)return Object.assign(b,c.j),!0}else{c=a.parsedCssText;for(var e;a=w.exec(c);){e=(a[2]||a[3]).trim();if("inherit"!==e||"unset"!==e)b[a[1].trim()]=e;e=!0}return e}}
-function S(a,b,c){b&&(b=0<=b.indexOf(";")?cb(a,b,c):Aa(b,function(b,d,f,g){if(!d)return b+g;(d=S(a,c[d],c))&&"initial"!==d?"apply-shim-inherit"===d&&(d="inherit"):d=S(a,c[f]||f,c)||f;return b+(d||"")+g}));return b&&b.trim()||""}
-function cb(a,b,c){b=b.split(";");for(var e=0,d,f;e<b.length;e++)if(d=b[e]){x.lastIndex=0;if(f=x.exec(d))d=S(a,c[f[1]],c);else if(f=d.indexOf(":"),-1!==f){var g=d.substring(f);g=g.trim();g=S(a,g,c)||g;d=d.substring(0,f)+g}b[e]=d&&d.lastIndexOf(";")===d.length-1?d.slice(0,-1):d||""}return b.join(";")}
-function db(a,b){var c={},e=[];z(a,function(a){a.f||Q(a);var d=a.g||a.parsedSelector;b&&a.f.j&&d&&Za.call(b,d)&&(R(a,c),a=a.index,d=parseInt(a/32,10),e[d]=(e[d]||0)|1<<a%32)},null,!0);return{j:c,key:e}}
-function eb(a,b,c,e){b.f||Q(b);if(b.f.j){var d=G(a);a=d.is;d=d.s;d=a?Ha(a,d):"html";var f=b.parsedSelector,g=":host > *"===f||"html"===f,h=0===f.indexOf(":host")&&!g;"shady"===c&&(g=f===d+" > *."+d||-1!==f.indexOf("html"),h=!g&&0===f.indexOf(d));if(g||h)c=d,h&&(b.g||(b.g=Ia(K,b,K.b,a?"."+a:"",d)),c=b.g||d),e({A:c,K:h,S:g})}}function fb(a,b,c){var e={},d={};z(b,function(b){eb(a,b,c,function(c){Za.call(a._element||a,c.A)&&(c.K?R(b,e):R(b,d))})},null,!0);return{L:d,J:e}}
-function gb(a,b,c,e){var d=G(b),f=Ha(d.is,d.s),g=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])"),h=P(b);d=h.m;h=h.cssBuild;var l=hb(d,e);return M(b,d,function(b){var d="";b.f||Q(b);b.f.cssText&&(d=cb(a,b.f.cssText,c));b.cssText=d;if(!r&&!xa(b)&&b.cssText){var h=d=b.cssText;null==b.C&&(b.C=ta.test(d));if(b.C)if(null==b.u){b.u=[];for(var m in l)h=l[m],h=h(d),d!==h&&(d=h,b.u.push(m))}else{for(m=0;m<b.u.length;++m)h=l[b.u[m]],d=h(d);h=d}b.cssText=h;b.g=b.g||b.selector;
-d="."+e;m=Ba(b.g);h=0;for(var xb=m.length,O=void 0;h<xb&&(O=m[h]);h++)m[h]=O.match(g)?O.replace(f,d):d+" "+O;b.selector=m.join(",")}},h)}function hb(a,b){a=a.b;var c={};if(!r&&a)for(var e=0,d=a[e];e<a.length;d=a[++e]){var f=d,g=b;f.h=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+g;f.g=f.g||f.selector;f.selector=f.g.replace(f.keyframesName,f.a);c[d.keyframesName]=ib(d)}return c}function ib(a){return function(b){return b.replace(a.h,a.a)}}
-function jb(a,b){var c=T,e=A(a);a.textContent=y(e,function(a){var d=a.cssText=a.parsedCssText;a.f&&a.f.cssText&&(d=d.replace(ma,"").replace(na,""),a.cssText=cb(c,d,b))})}aa.Object.defineProperties(ab.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var T=new ab;var U={},V=window.customElements;if(V&&!r){var kb=V.define;V.define=function(a,b,c){U[a]||(U[a]=za(a));kb.call(V,a,b,c)}};function lb(){this.cache={}}lb.prototype.store=function(a,b,c,e){var d=this.cache[a]||[];d.push({j:b,styleElement:c,i:e});100<d.length&&d.shift();this.cache[a]=d};function mb(){}var nb=new RegExp(K.a+"\\s*([^\\s]*)");function ob(a){return(a=(a.classList&&a.classList.value?a.classList.value:a.getAttribute("class")||"").match(nb))?a[1]:""}function pb(a){var b=F(a).getRootNode();return b===a||b===a.ownerDocument?"":(a=b.host)?G(a).is:""}
-function qb(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var e=0;e<c.addedNodes.length;e++){var d=c.addedNodes[e];if(d.nodeType===Node.ELEMENT_NODE){var f=d.getRootNode(),g=ob(d);if(g&&f===d.ownerDocument&&("style"!==d.localName&&"template"!==d.localName||""===H(d)))Fa(d,g);else if(f instanceof ShadowRoot)for(f=pb(d),f!==g&&Ea(d,g,f),d=window.ShadyDOM.nativeMethods.querySelectorAll.call(d,":not(."+K.a+")"),g=0;g<d.length;g++){f=d[g];
-var h=pb(f);h&&L(f,h)}}}}}
-if(!(r||window.ShadyDOM&&window.ShadyDOM.handlesDynamicScoping)){var rb=new MutationObserver(qb),sb=function(a){rb.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)sb(document);else{var tb=function(){sb(document.body)};window.HTMLImports?window.HTMLImports.whenReady(tb):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){tb();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",
-a)}else tb()})}mb=function(){qb(rb.takeRecords())}}var ub=mb;var W={};var vb=Promise.resolve();function wb(a){if(a=W[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function yb(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function zb(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a._validating||(a._validating=!0,vb.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a._validating=!1}))};var Ab=new lb;function X(){this.B={};this.c=document.documentElement;var a=new n;a.rules=[];this.h=Ya(this.c,new N(a));this.v=!1;this.b=this.a=null}k=X.prototype;k.flush=function(){ub()};k.I=function(a){return A(a)};k.P=function(a){return y(a)};k.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
-k.prepareTemplateStyles=function(a,b,c){if(!a._prepared){r||U[b]||(U[b]=za(b));a._prepared=!0;a.name=b;a.extends=c;W[b]=a;var e=H(a),d=Ca(e);c={is:b,extends:c};var f=[];for(var g=a.content.querySelectorAll("style"),h=0;h<g.length;h++){var l=g[h];if(l.hasAttribute("shady-unscoped")){if(!r){var m=l.textContent;wa.has(m)||(wa.add(m),m=l.cloneNode(!0),document.head.appendChild(m));l.parentNode.removeChild(l)}}else f.push(l.textContent),l.parentNode.removeChild(l)}f=f.join("").trim();Y(this);if(!d){if(g=
-!e)g=x.test(f)||w.test(f),x.lastIndex=0,w.lastIndex=0;h=p(f);g&&u&&this.a&&this.a.transformRules(h,b);a._styleAst=h}g=[];u||(g=bb(a._styleAst));if(!g.length||u)h=r?a.content:null,b=U[b]||null,e=M(c,a._styleAst,null,e,d?f:""),e=e.length?B(e,c.is,h,b):null,a._style=e;a.a=g}};k.prepareTemplateDom=function(a,b){var c=H(a);r||"shady"===c||a._domPrepared||(a._domPrepared=!0,Da(a.content,b))};
-function Bb(a){var b=G(a),c=b.is;b=b.s;var e=U[c]||null,d=W[c];if(d){c=d._styleAst;var f=d.a;d=H(d);b=new N(c,e,f,b,d);Ya(a,b);return b}}function Cb(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.D(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.v)&&a.flushCustomStyles()})})}
-function Y(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=wb);Cb(a)}
-k.flushCustomStyles=function(){Y(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued&&!Ca(this.h.cssBuild)){if(u){if(!this.h.cssBuild)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&u&&this.a){var e=A(c);Y(this);this.a.transformRules(e);c.textContent=y(e)}}}else{Db(this,this.c,this.h);for(b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&jb(c,this.h.l);this.v&&this.styleDocument()}this.b.enqueued=!1}}};
-k.styleElement=function(a,b){var c=P(a)||Bb(a);if(c)if(a!==this.c&&(this.v=!0),b&&(c.o=c.o||{},Object.assign(c.o,b)),u){b=G(a).is;if(c.o){var e=c.o,d;for(d in e)null===d?a.style.removeProperty(d):a.style.setProperty(d,e[d])}if(!(!(d=W[b])&&a!==this.c||d&&""!==H(d))&&d&&d._style&&!yb(d)){if(yb(d)||d._applyShimValidatingVersion!==d._applyShimNextVersion)Y(this),this.a&&this.a.transformRules(d._styleAst,b),d._style.textContent=M(a,c.m),zb(d);r&&(b=a.shadowRoot)&&(b=b.querySelector("style"))&&(b.textContent=
-M(a,c.m));c.m=d._styleAst}}else if(this.flush(),Db(this,a,c),c.w&&c.w.length){b=G(a).is;a:{if(d=Ab.cache[b])for(e=d.length-1;0<=e;e--){var f=d[e];b:{var g=c.w;for(var h=0;h<g.length;h++){var l=g[h];if(f.j[l]!==c.l[l]){g=!1;break b}}g=!0}if(g){d=f;break a}}d=void 0}g=d?d.styleElement:null;e=c.i;(f=d&&d.i)||(f=this.B[b]=(this.B[b]||0)+1,f=b+"-"+f);c.i=f;f=c.i;h=T;h=g?g.textContent||"":gb(h,a,c.l,f);l=P(a);var m=l.a;m&&!r&&m!==g&&(m._useCount--,0>=m._useCount&&m.parentNode&&m.parentNode.removeChild(m));
-r?l.a?(l.a.textContent=h,g=l.a):h&&(g=B(h,f,a.shadowRoot,l.b)):g?g.parentNode||($a&&-1<h.indexOf("@media")&&(g.textContent=h),ya(g,null,l.b)):h&&(g=B(h,f,null,l.b));g&&(g._useCount=g._useCount||0,l.a!=g&&g._useCount++,l.a=g);f=g;r||(g=c.i,l=h=a.getAttribute("class")||"",e&&(l=h.replace(new RegExp("\\s*x-scope\\s*"+e+"\\s*","g")," ")),l+=(l?" ":"")+"x-scope "+g,h!==l&&E(a,l));d||Ab.store(b,c.l,f,c.i)}};function Eb(a,b){return(b=F(b).getRootNode().host)?P(b)||Bb(b)?b:Eb(a,b):a.c}
-function Db(a,b,c){var e=Eb(a,b),d=P(e),f=d.l;e===a.c||f||(Db(a,e,d),f=d.l);a=Object.create(f||null);e=fb(b,c.m,c.cssBuild);b=db(d.m,b).j;Object.assign(a,e.J,b,e.L);b=c.o;for(var g in b)if((d=b[g])||0===d)a[g]=d;g=T;b=Object.getOwnPropertyNames(a);for(d=0;d<b.length;d++)e=b[d],a[e]=S(g,a[e],a);c.l=a}k.styleDocument=function(a){this.styleSubtree(this.c,a)};
-k.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};
-k.D=function(a){var b=this,c=H(a);c!==this.h.cssBuild&&(this.h.cssBuild=c);if(!Ca(c)){var e=A(a);z(e,function(a){if(r)Xa(a);else{var d=K;a.selector=a.parsedSelector;Xa(a);a.selector=a.g=Ia(d,a,d.c,void 0,void 0)}u&&""===c&&(Y(b),b.a&&b.a.transformRule(a))});u?a.textContent=y(e):this.h.m.rules.push(e)}};k.getComputedStyleValue=function(a,b){var c;u||(c=(P(a)||P(Eb(this,a))).l[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};
-k.O=function(a,b){var c=F(a).getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var e=a.getAttribute("class");if(e){e=e.split(/\s/);for(var d=0;d<e.length;d++)if(e[d]===K.a){c=e[d+1];break}}}c&&b.push(K.a,c);u||(c=P(a))&&c.i&&b.push(T.a,c.i);E(a,b.join(" "))};k.F=function(a){return P(a)};k.N=function(a,b){L(a,b)};k.R=function(a,b){L(a,b,!0)};k.M=function(a){return pb(a)};k.H=function(a){return ob(a)};X.prototype.flush=X.prototype.flush;X.prototype.prepareTemplate=X.prototype.prepareTemplate;
-X.prototype.styleElement=X.prototype.styleElement;X.prototype.styleDocument=X.prototype.styleDocument;X.prototype.styleSubtree=X.prototype.styleSubtree;X.prototype.getComputedStyleValue=X.prototype.getComputedStyleValue;X.prototype.setElementClass=X.prototype.O;X.prototype._styleInfoForNode=X.prototype.F;X.prototype.transformCustomStyleForDocument=X.prototype.D;X.prototype.getStyleAst=X.prototype.I;X.prototype.styleAstToString=X.prototype.P;X.prototype.flushCustomStyles=X.prototype.flushCustomStyles;
-X.prototype.scopeNode=X.prototype.N;X.prototype.unscopeNode=X.prototype.R;X.prototype.scopeForNode=X.prototype.M;X.prototype.currentScopeForNode=X.prototype.H;Object.defineProperties(X.prototype,{nativeShadow:{get:function(){return r}},nativeCss:{get:function(){return u}}});var Z=new X,Fb,Gb;window.ShadyCSS&&(Fb=window.ShadyCSS.ApplyShim,Gb=window.ShadyCSS.CustomStyleInterface);
-window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){Z.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},
-getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:u,nativeShadow:r,cssBuild:v};Fb&&(window.ShadyCSS.ApplyShim=Fb);Gb&&(window.ShadyCSS.CustomStyleInterface=Gb);}).call(this);
-
-//# sourceMappingURL=scoping-shim.min.js.map
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/scoping-shim.min.js.map b/systrace/catapult/third_party/polymer/components/shadycss/scoping-shim.min.js.map
deleted file mode 100644
index 2389dcd..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/scoping-shim.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["src/css-parse.js"," [synthetic:util/global] ","src/style-settings.js","src/common-regex.js","src/unscoped-style-handler.js","src/style-util.js","src/style-transformer.js","src/scoping-shim.js","src/document-watcher.js","src/style-properties.js","src/style-info.js","src/style-placeholder.js","src/style-cache.js","src/template-map.js","src/apply-shim-utils.js","src/common-utils.js","entrypoints/scoping-shim.js"],"names":["$jscomp.global","constructor","StyleNode","parse","text","replace","RX$$module$src$css_parse.comments","RX$$module$src$css_parse.port","parseCss","root","length","n","i","l","OPEN_BRACE","p","previous","push","CLOSE_BRACE","node","t","substring","trim","ss","_expandUnicodeEscapes","RX$$module$src$css_parse.multipleSpaces","lastIndexOf","s","indexOf","AT_START","MEDIA_START","types$$module$src$css_parse.MEDIA_RULE","match","RX$$module$src$css_parse.keyframesRule","types$$module$src$css_parse.KEYFRAMES_RULE","split","pop","VAR_START","types$$module$src$css_parse.MIXIN_RULE","types$$module$src$css_parse.STYLE_RULE","r$","r","code","repeat","stringify","preserveProperties","cssText","rules","RX$$module$src$css_parse.customProp","RX$$module$src$css_parse.mixinProp","RX$$module$src$css_parse.mixinApply","RX$$module$src$css_parse.varApply","STYLE_RULE","KEYFRAMES_RULE","MEDIA_RULE","MIXIN_RULE","comments","port","customProp","mixinProp","mixinApply","varApply","keyframesRule","multipleSpaces","nativeShadow","window","nativeCssVariables_","calcCssVariables","settings","navigator","userAgent","CSS","supports","cssBuild","ShadyCSS","undefined","nativeCss","nativeCssVariables","module$src$style_settings.cssBuild","VAR_ASSIGN","MIXIN_MATCH","VAR_CONSUMED","ANIMATION_MATCH","MEDIA_MATCH","BRACKETED","styleTextSet","Set","toCssText","callback","forEachRule","rulesForStyle","style","textContent","isKeyframesSelector","rule","styleRuleCallback","keyframesRuleCallback","onlyActiveRules","skipRules","type","matchMedia","matches","applyCss","moniker","target","contextNode","document","createElement","setAttribute","applyStyle","lastHeadApplyNode","applyStylePlaceHolder","placeHolder","createComment","scope","head","insertBefore","after","firstChild","nextSibling","compareDocumentPosition","position","Node","DOCUMENT_POSITION_PRECEDING","findMatchingParen","start","level","processVariableAndFallback","str","end","inner","prefix","suffix","comma","value","fallback","setElementClassRaw","element","call","wrap","getIsExtends","localName","typeExtension","is","getAttribute","extends","splitSelectorList","selector","parts","part","slice","getCssBuild","__cssBuild","attrValue","CSS_BUILD_ATTR","buildComment","content","Comment","commentParts","parentNode","removeChild","isOptimalCssBuild","StyleTransformer","domAddScope","_transformDom","fn","startNode","transformer","nodeType","ELEMENT_NODE","c$","childNodes","_content","children","shouldRemoveScope","classList","remove","SCOPE_NAME","add","c","CLASS","newValue","domReplaceScope","oldScope","newScope","domRemoveScope","elementStyles","styleRules","css","ext","hostScope","_calcHostScope","_calcElementScope","CSS_CLASS_PREFIX","isScoped","_transformRule","transformedSelector","_transformRuleCss","_transformComplexSelector","p$","filter","join","COMPLEX_SELECTOR_SEP","_twiddleNthPlus","NTH","m","inside","_preserveMatchesPseudo","MATCHES","index","Error","input","MATCHES_REPLACEMENT","_replaceMatchesPseudo","reduce","acc","cur","idx","stop","isNth","test","isMatches","SLOTTED_START","SIMPLE_SELECTOR_SEP","info","_transformCompoundSelector","combinator","slottedIndex","SLOTTED","HOST","_transformHostSelector","_transformSimpleSelector","slotted","SLOTTED_PAREN","paren","DIR_PAREN","before","dir","attributes","output","PSEUDO_PREFIX","HOST_PAREN","SIMPLE_SELECTOR_PREFIX","host","SELECTOR_NO_MATCH","normalizeRootSelector","ROOT","_transformDocumentSelector","SCOPE_DOC_SELECTOR","$jscomp.global.Object.defineProperties","$jscompDefaultExport","StyleInfo","ast","placeholder","ownStylePropertyNames","overrideStyleProperties","customStyle","scopeSelector","styleProperties","get","set","styleInfo","_getStyleRules","prototype","matchesSelector","method","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","IS_IE","StyleProperties","decorateStyles","props","keyframes","ruleIndex","decorateRule","propertyInfo","collectPropertiesInCssText","exec","name","onKeyframesRule","_keyframes","names","properties","collectProperties","collectCssText","collectConsumingCssText","Object","assign","any","valueForProperty","property","valueForProperties","propertyValue","lastIndex","colon","pp","propertyDataFromStyles","o","selectorToMatch","parseInt","key","whenHostOrRootRule","parsedSelector","isRoot","isHost","hostAndRootPropertiesForScope","hostProps","rootProps","_element","transformStyles","hostSelector","hostRx","RegExp","StyleInfo$$module$src$style_info.get","keyframeTransforms","_elementKeyframeTransforms","applyProperties","applyKeyframeTransforms","hasAnimations","keyframeNamesToTransform","keyframe","transform","_scopeSelector","keyframesRules","keyframesNameRx","_scopeKeyframes","transformedKeyframesName","scopeId","_keyframesRuleTransformer","applyCustomStyle","XSCOPE_NAME","placeholderMap","ce","origDefine","wrappedDefine","clazz","options","StyleCache","cache","store","tagname","styleElement","list","typeMax","shift","flush","scopeRegExp","getCurrentScope","getOwnerScope","ownerRoot","getRootNode","ownerDocument","handler","mxns","x","mxn","documentElement","addedNodes","currentScope","ShadowRoot","j","unscopedNodes","unscopedNode","scopeForPreviouslyUnscopedNode","observer","MutationObserver","observe","childList","subtree","delayedStart","body","requestAnimationFrame","readyState","listener","removeEventListener","addEventListener","takeRecords","module$src$document_watcher.flush","templateMap","promise","Promise","resolve","invalidate","elementName","template","templateIsValid","startValidatingTemplate","_validating","then","styleCache","ScopingShim","_scopeCounter","_documentOwner","_documentOwnerStyleInfo","StyleInfo$$module$src$style_info.set","_elementsHaveApplied","_customStyleInterface","_applyShim","flush.prototype","getStyleAst.prototype","getStyleAst","styleAstToString.prototype","styleAstToString","prepareTemplate.prototype","prepareTemplate","prepareTemplateDom","prepareTemplateStyles","prepareTemplateStyles.prototype","_prepared","optimalBuild","styleTextParts","styles","querySelectorAll","hasAttribute","scopingAttribute","has","newStyle","cloneNode","appendChild","_ensure","hasMixins","ownPropertyNames","_generateStaticStyle","shadowroot","_style","_ownPropertyNames","prepareTemplateDom.prototype","_domPrepared","_prepareHost","_ensureCustomStyleInterface","CustomStyleInterface","transformCustomStyleForDocument","flushCustomStyles","_ensureApplyShim","ApplyShim","flushCustomStyles.prototype","customStyles","_revalidateCustomStyleApplyShim","_revalidateApplyShim","_updateProperties","_applyCustomStyles","styleDocument","styleElement.prototype","overrideProps","styleElementNativeVariables","removeProperty","setProperty","shadowRoot","querySelector","styleElementShimVariables","_applyStyleProperties","fetch","entry","_validate","pn","cachedStyle","cacheEntry","oldScopeSelector","id","_generateScopeSelector","applyElementStyle","applyElementScopeSelector","v","_styleOwnerForNode","owner","ownerStyleInfo","ownerProperties","create","hostAndRootProps","propertiesMatchingHost","_mixinOverrideStyles","overrides","reify","getOwnPropertyNames","styleDocument.prototype","styleSubtree","styleSubtree.prototype","shadowChildren","transformCustomStyleForDocument.prototype","documentRule","getComputedStyleValue.prototype","getComputedStyleValue","getComputedStyle","getPropertyValue","setElementClass.prototype","setElementClass","classString","classes","scopeName","classAttr","k$","_styleInfoForNode.prototype","_styleInfoForNode","scopeNode.prototype","scopeNode","unscopeNode.prototype","unscopeNode","scopeForNode.prototype","scopeForNode","currentScopeForNode.prototype","currentScopeForNode","defineProperties","scopingShim","elementExtends"],"mappings":"A;;;;;;;;;aAeA,IAAA,CAAA,CC4BAA,GAb2B,WAAlB,EAAC,MAAO,OAAR,EAAiC,MAAjC,GAa0B,IAb1B,CAa0B,IAb1B,CAEe,WAAlB,EAAC,MAAO,OAAR,EAA2C,IAA3C,EAAiC,MAAjC,CAAmD,MAAnD,CAW6B,IDxBjCC,SADIC,EACO,EAAG,CAIZ,IAAA,IAAA,CAFA,IAAA,MAEA,CAFgB,CAQhB,KAAA,MAAA,CAFA,IAAA,OAEA,CAJA,IAAA,SAIA,CAJmB,IAQnB,KAAA,QAAA,CAFA,IAAA,cAEA,CAFwB,EAIxB,KAAA,OAAA,CAAiB,CAAA,CAEjB,KAAA,KAAA,CAAe,CAMf,KAAA,eAAA,CAFA,IAAA,SAEA,CAJA,IAAA,cAIA,CAJwB,EApBZ;AAmCTC,QAASA,EAAK,CAACC,CAAD,CAAO,CAC1BA,CAAA,CAAaA,CAUNC,QAAA,CAAgBC,EAAhB,CAA6B,EAA7B,CAAAD,QAAA,CAAyCE,EAAzC,CAAkD,EAAlD,CATAC,KAAAA,EAAAA,EAAAA,CAAaJ,EAAAA,CAAbI,CAkBHC,EAAO,IAAIP,CACfO,EAAA,MAAA,CAAgB,CAChBA,EAAA,IAAA,CAAcL,CAAAM,OAEd,KADA,IAAIC,EAAIF,CAAR,CACSG,EAAI,CADb,CACgBC,EAAIT,CAAAM,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAuKeE,GAvKf,GAAIV,CAAA,CAAKQ,CAAL,CAAJ,CAA4B,CACrBD,CAAA,MAAL,GACEA,CAAA,MADF,CACe,EADf,CAGA,KAAII,EAAIJ,CAAR,CACIK,EAAWD,CAAA,MAAA,CAAWA,CAAA,MAAAL,OAAX,CAA+B,CAA/B,CAAXM,EAAgD,IACpDL,EAAA,CAAI,IAAIT,CACRS,EAAA,MAAA,CAAaC,CAAb,CAAiB,CACjBD,EAAA,OAAA,CAAcI,CACdJ,EAAA,SAAA,CAAgBK,CAChBD,EAAA,MAAAE,KAAA,CAAgBN,CAAhB,CAV0B,CAA5B,IAwKgBO,GA7JT,GAAId,CAAA,CAAKQ,CAAL,CAAJ,GACLD,CAAA,IACA,CADWC,CACX,CADe,CACf,CAAAD,CAAA,CAAIA,CAAA,OAAJ,EAAmBF,CAFd,CAlCT,OAAOD,EAAA,CAuCAC,CAvCA,CAAoBL,CAApB,CAFmB;AAkD5BI,QAASA,GAAQ,CAACW,CAAD,CAAOf,CAAP,CAAa,CAC5B,IAAIgB,EAAIhB,CAAAiB,UAAA,CAAeF,CAAA,MAAf,CAA8BA,CAAA,IAA9B,CAA4C,CAA5C,CACRA,EAAA,cAAA,CAAwBA,CAAA,QAAxB,CAA0CC,CAAAE,KAAA,EACtCH,EAAA,OAAJ,GAEEC,CASA,CATIhB,CAAAiB,UAAA,CADKF,CAAA,SAAAI,CAAmBJ,CAAA,SAAA,IAAnBI,CAA6CJ,CAAA,OAAA,MAClD,CAAmBA,CAAA,MAAnB,CAAmC,CAAnC,CASJ,CARAC,CAQA,CARII,EAAA,CAAsBJ,CAAtB,CAQJ,CAPAA,CAOA,CAPIA,CAAAf,QAAA,CAAUoB,EAAV,CAA6B,GAA7B,CAOJ,CAJAL,CAIA,CAJIA,CAAAC,UAAA,CAAYD,CAAAM,YAAA,CAAc,GAAd,CAAZ,CAAiC,CAAjC,CAIJ,CAHIC,CAGJ,CAHQR,CAAA,eAGR,CAHiCA,CAAA,SAGjC,CAHoDC,CAAAE,KAAA,EAGpD,CAFAH,CAAA,OAEA,CAF0C,CAE1C,GAFkBQ,CAAAC,QAAA,CAmJLC,GAnJK,CAElB,CAAIV,CAAA,OAAJ,CACiC,CAA/B,GAAIQ,CAAAC,QAAA,CA+IUE,QA/IV,CAAJ,CACEX,CAAA,KADF,CACiBY,EADjB,CAEWJ,CAAAK,MAAA,CAAQC,EAAR,CAFX,GAGEd,CAAA,KACA,CADee,CACf,CAAAf,CAAA,cAAA,CACEA,CAAA,SAAAgB,MAAA,CAAuBV,EAAvB,CAAAW,IAAA,EALJ,CADF,CAUIjB,CAAA,KAVJ,CAS+B,CAA7B,GAAIQ,CAAAC,QAAA,CAsIQS,IAtIR,CAAJ,CACiBC,EADjB,CAGiBC,EAvBrB,CA4BA,IADIC,CACJ,CADSrB,CAAA,MACT,CACE,IADM,IACGP,EAAI,CADP,CACUC,EAAI2B,CAAA9B,OADd,CACyB+B,EAAAA,IAAAA,EAA/B,CACG7B,CADH,CACOC,CADP,GACc4B,CADd,CACkBD,CAAA,CAAG5B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEJ,EAAA,CAASiC,CAAT;AAAYrC,CAAZ,CAGJ,OAAOe,EArCqB,CA8C9BK,QAASA,GAAqB,CAACG,CAAD,CAAI,CAChC,MAAOA,EAAAtB,QAAA,CAAU,uBAAV,CAAmC,QAAQ,CAAA,CAAA,CAAA,CAAA,CAAG,CAC/CqC,CAAAA,CAAO,CAEX,KADEC,CACF,CADW,CACX,CADeD,CAAAhC,OACf,CAAOiC,CAAA,EAAP,CAAA,CACED,CAAA,CAAO,GAAP,CAAaA,CAEf,OAAO,IAAP,CAAcA,CANqC,CAA9C,CADyB;AAkB3BE,QAASA,GAAS,CAACzB,CAAD,CAAO0B,CAAP,CAA2BzC,CAA3B,CAAsC,CAAXA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAO,EAAP,CAAAA,CAElD,KAAI0C,EAAU,EACd,IAAI3B,CAAA,QAAJ,EAAuBA,CAAA,MAAvB,CAAsC,CACpC,IAAIqB,EAAKrB,CAAA,MAAT,CACI,CAAA,IAAAqB,CAAA,CAAAA,CAAA,CAgCFC,CAhCQ,CAAAM,CAgCJ,CAAM,CAAN,CAhCI,CAAA,CAAA,CAAA,EAiCGN,CAjCH,EAiCiBA,CAAA,SAjCjB,EAiCwE,CAjCxE,GAiCmCA,CAAA,SAAAb,QAAA,CAuD/BS,IAvD+B,CAjCnC,CAAV,IAAI,CAAJ,CAA+B,CACpBzB,CAAAA,CAAI,CAAb,KAD6B,IACbC,EAAI2B,CAAA9B,OADS,CACE+B,EAAAA,IAAAA,EAA/B,CACG7B,CADH,CACOC,CADP,GACc4B,CADd,CACkBD,CAAA,CAAG5B,CAAH,CADlB,EAC0BA,CAAA,EAD1B,CAEEkC,CAAA,CAAUF,EAAA,CAAUH,CAAV,CAAaI,CAAb,CAAiCC,CAAjC,CAHiB,CAA/B,IAMYD,EAAA,CAAqB,CAArB,CAAqB,CAAA,QAArB,EACR,CAmCN,CAnCM,CAAA,QAmCN,CADAC,CACA,CADqCA,CAS9BzC,QAAA,CACI2C,EADJ,CACmB,EADnB,CAAA3C,QAAA,CAEI4C,EAFJ,CAEkB,EAFlB,CARP,CAAA,CAAA,CAA6BH,CAkBtBzC,QAAA,CACI6C,EADJ,CACmB,EADnB,CAAA7C,QAAA,CAEI8C,EAFJ,CAEiB,EAFjB,CAtDO,CAGV,EADAL,CACA,CAHUA,CAEAxB,KAAA,EACV,IACEwB,CADF,CACY,IADZ,CACmBA,CADnB,CAC6B,IAD7B,CAXkC,CAiBlCA,CAAJ,GACM3B,CAAA,SAIJ,GAHEf,CAGF,EAHUe,CAAA,SAGV,CAHgD,MAGhD,EADAf,CACA,EADQ0C,CACR,CAAI3B,CAAA,SAAJ,GACEf,CADF,EACU,OADV,CALF,CASA,OAAOA,EA7BsD;AAwE7DgD,IAAAA,GAAYA,CAAZA,CACAC,EAAgBA,CADhBD,CAEAE,GAAYA,CAFZF,CAGAG,GAAYA,GAHZH,CAWAI,GAAUA,mCAXVJ,CAYAK,GAAMA,kBAZNL,CAaAM,GAAYA,mDAbZN,CAcAO,GAAWA,4DAdXP,CAeAQ,GAAYA,yCAfZR,CAgBAS,GAAUA,2CAhBVT,CAiBAU,GAAeA,mBAjBfV,CAkBAW,GAAgBA,M,CEtPX,IAAMC,EAAe,EAAEC,MAAA,SAAF,EAAwBA,MAAA,SAAA,MAAxB,CAArB,CACHC,CAKJC,SAASA,GAAgB,CAACC,CAAD,CAAW,CAEhCF,CAAA,CADEE,CAAJ,EAAgBA,CAAA,kBAAhB,CACwB,CAAA,CADxB,CASwBJ,CATxB,EASwC,EAASK,SAAAC,UAAAtC,MAAA,CAA0B,2BAA1B,CAAT,EACpCuC,CAAAN,MAAAM,IADoC,EACtBC,CAAAD,GAAAC,SADsB,EACN,CAAAD,GAAAC,SAAA,CAAa,YAAb,CAA2B,kBAA3B,CADM,CAVN,CAgB7B,IAAIC,EACPR,OAAAS,SAAJ,EAAoDC,IAAAA,EAApD,GAAuBV,MAAAS,SAAAD,SAAvB,GACEA,EADF,CACaR,MAAAS,SAAAD,SADb,CAIIR,OAAAS,SAAJ,EAAqDC,IAAAA,EAArD,GAAuBV,MAAAS,SAAAE,UAAvB,CACEV,CADF,CACwBD,MAAAS,SAAAE,UADxB,CAEWX,MAAAS,SAAJ,EACLP,EAAA,CAAiBF,MAAAS,SAAjB,CAEA,CAAAT,MAAAS,SAAA,CAAkBC,IAAAA,EAHb,EAKLR,EAAA,CAAiBF,MAAA,cAAjB,EAA4CA,MAAA,cAAA,MAA5C,CAMK;IAAMY,EAA4CX,CAAlD,CAlBIY,EAAAL,E,CCxBJ,IAAMM,EAAa,yHAAnB,CACMC,EAAc,sCADpB,CAEMC,GAAe,2BAFrB,CAGMC,GAAkB,sCAHxB,CAIMC,GAAc,cAJpB,CAMMC,GAAY,Y,CCHzB,IAAMC,GAAe,IAAIC,G,CCSlBC,QAASA,EAAU,CAACxC,CAAD,CAAQyC,CAAR,CAAkB,CAC1C,GAAI,CAACzC,CAAL,CACE,MAAO,EAEY,SAArB,GAAI,MAAOA,EAAX,GACEA,CADF,CACU5C,CAAA,CAAM4C,CAAN,CADV,CAGIyC,EAAJ,EACEC,CAAA,CAAY1C,CAAZ,CAAmByC,CAAnB,CAEF,OAAO5C,GAAA,CAAUG,CAAV,CAAiB8B,CAAjB,CAVmC,CAiBrCa,QAASA,EAAa,CAACC,CAAD,CAAQ,CAC/B,CAACA,CAAA,WAAL,EAA4BA,CAAAC,YAA5B,GACED,CAAA,WADF,CACwBxF,CAAA,CAAMwF,CAAAC,YAAN,CADxB,CAGA,OAAOD,EAAA,WAAP,EAA8B,IAJK,CAc9BE,QAASA,GAAmB,CAACC,CAAD,CAAO,CACxC,MAAO,CAAA,CAAQA,CAAA,OAAf,EACAA,CAAA,OAAA,KADA,GAC2B5D,CAFa,CAWnCuD,QAASA,EAAW,CAACtE,CAAD,CAAO4E,CAAP,CAA0BC,CAA1B,CAAiDC,CAAjD,CAAkE,CAC3F,GAAK9E,CAAL,CAAA,CAGA,IAAI+E,EAAY,CAAA,CAAhB,CACIC,EAAOhF,CAAA,KACX,IAAI8E,CAAJ,EACME,CADN,GACepE,EADf,CACiC,CAC7B,IAAIqE,EAAajF,CAAA,SAAAa,MAAA,CAAuBmD,EAAvB,CACbiB,EAAJ,GAEOnC,MAAAmC,WAAA,CAAkBA,CAAA,CAAW,CAAX,CAAlB,CAAAC,QAFP,GAGIH,CAHJ,CAGgB,CAAA,CAHhB,EAF6B,CAU7BC,CAAJ,GAAa5D,EAAb,CACEwD,CAAA,CAAkB5E,CAAlB,CADF,CAEW6E,CAAJ,EACLG,CADK,GACIjE,CADJ,CAEL8D,CAAA,CAAsB7E,CAAtB,CAFK,CAGIgF,CAHJ,GAGa7D,EAHb,GAIL4D,CAJK,CAIO,CAAA,CAJP,CAOP,KADI1D,CACJ,CADSrB,CAAA,MACT,GAAU,CAAC+E,CAAX,CACE,IAAStF,CAAkB6B,CAAhB,CAAgBA,CAAb5B,CAAa4B,CAAXD,CAAA9B,OAAW+B,CAAAA,CAAAA,CAAAA,IAAAA,EAA3B,CAA+B7B,CAA/B,CAAiCC,CAAjC,GAAwC4B,CAAxC,CAA0CD,CAAA,CAAG5B,CAAH,CAA1C,EAAkDA,CAAA,EAAlD,CACE6E,CAAA,CAAYhD,CAAZ,CAAesD,CAAf,CAAkCC,CAAlC,CAAyDC,CAAzD,CA3BJ,CAD2F;AAyCtFK,QAASA,EAAQ,CAACxD,CAAD,CAAUyD,CAAV,CAAmBC,CAAnB,CAA2BC,CAA3B,CAAwC,CAY9D,IAAId,EAAwCe,QAAAC,cAAA,CAAuB,OAAvB,CAXNJ,EAYtC,EACEZ,CAAAiB,aAAA,CAAmB,OAAnB,CAboCL,CAapC,CAEFZ,EAAAC,YAAA,CAf6B9C,CAC7B+D,GAAA,CAeOlB,CAfP,CAAkBa,CAAlB,CAA0BC,CAA1B,CACA,OAcOd,EAjBuD,CAwBhE,IAAImB,EAAoB,IAOjBC,SAASA,GAAqB,CAACR,CAAD,CAAU,CACzCS,CAAAA,CAAcN,QAAAO,cAAA,CAAuB,wBAAvB,CAChBV,CADgB,CACN,GADM,CAIlB,KAAIW,EAAQR,QAAAS,KACZD,EAAAE,aAAA,CAAmBJ,CAAnB,EAHYF,CAAAO,CACVP,CAAA,YADUO,CACyB,IAErC,GAAyCH,CAAAI,WAAzC,CAEA,OADAR,EACA,CADoBE,CAPyB,CAgBxCH,QAASA,GAAU,CAAClB,CAAD,CAAQa,CAAR,CAAgBC,CAAhB,CAA6B,CACrDD,CAAA,CAASA,CAAT,EAAmBE,QAAAS,KAGnBX,EAAAY,aAAA,CAAoBzB,CAApB,CAFac,CAEb,EAF4BA,CAAAc,YAE5B,EADEf,CAAAc,WACF,CACKR,EAAL,CAIiBnB,CAAA6B,wBAAAC,CAA8BX,CAA9BW,CAJjB,GAKmBC,IAAAC,4BALnB,GAMIb,CANJ,CAMwBnB,CANxB,EACEmB,CADF,CACsBnB,CAN+B;AA+BhDiC,QAASA,EAAiB,CAACxH,CAAD,CAAOyH,CAAP,CAAc,CAE7C,IADA,IAAIC,EAAQ,CAAZ,CACkBjH,EAAET,CAAAM,OAApB,CAAiCE,CAAjC,CAAqCC,CAArC,CAAwCD,CAAA,EAAxC,CACE,GAAgB,GAAhB,GAAIR,CAAA,CAAKQ,CAAL,CAAJ,CACEkH,CAAA,EADF,KAEO,IAAgB,GAAhB,GAAI1H,CAAA,CAAKQ,CAAL,CAAJ,EACW,CADX,GACD,EAAEkH,CADD,CAEH,MAAOlH,EAIb,OAAQ,EAXqC,CAkBxCmH,QAASA,GAA0B,CAACC,CAAD,CAAMxC,CAAN,CAAgB,CAExD,IAAIqC,EAAQG,CAAApG,QAAA,CAAY,MAAZ,CACZ,IAAe,EAAf,GAAIiG,CAAJ,CAEE,MAAOrC,EAAA,CAASwC,CAAT,CAAc,EAAd,CAAkB,EAAlB,CAAsB,EAAtB,CAGT,KAAIC,EAAML,CAAA,CAAkBI,CAAlB,CAAuBH,CAAvB,CAA+B,CAA/B,CAAV,CACIK,EAAQF,CAAA3G,UAAA,CAAcwG,CAAd,CAAsB,CAAtB,CAAyBI,CAAzB,CACRE,EAAAA,CAASH,CAAA3G,UAAA,CAAc,CAAd,CAAiBwG,CAAjB,CAETO,EAAAA,CAASL,EAAA,CAA2BC,CAAA3G,UAAA,CAAc4G,CAAd,CAAoB,CAApB,CAA3B,CAAmDzC,CAAnD,CACT6C,EAAAA,CAAQH,CAAAtG,QAAA,CAAc,GAAd,CAEZ,OAAe,EAAf,GAAIyG,CAAJ,CAES7C,CAAA,CAAS2C,CAAT,CAAiBD,CAAA5G,KAAA,EAAjB,CAA+B,EAA/B,CAAmC8G,CAAnC,CAFT,CAOO5C,CAAA,CAAS2C,CAAT,CAFKD,CAAA7G,UAAA,CAAgB,CAAhB,CAAmBgH,CAAnB,CAAA/G,KAAAgH,EAEL,CADQJ,CAAA7G,UAAA,CAAgBgH,CAAhB,CAAwB,CAAxB,CAAA/G,KAAAiH,EACR,CAAkCH,CAAlC,CAtBiD,CA6BnDI,QAASA,EAAkB,CAACC,CAAD,CAAUH,CAAV,CAAiB,CAE7CtE,CAAJ,CACEyE,CAAA7B,aAAA,CAAqB,OAArB,CAA8B0B,CAA9B,CADF,CAGErE,MAAA,SAAA,cAAA,aAAAyE,KAAA,CAAyDD,CAAzD,CAAkE,OAAlE,CAA2EH,CAA3E,CAL+C;AAS5C,IAAMK,EAAO1E,MAAA,SAAP0E,EAA6B1E,MAAA,SAAA,KAA7B0E,EAA4D,QAAA,CAACxH,CAAD,CAAUA,CAAAA,MAAAA,EAAAA,CAM5EyH,SAASA,EAAY,CAACH,CAAD,CAAU,CACpC,IAAII,EAAYJ,CAAA,UAAhB,CACaK,EAAgB,EAKzBD,EAAJ,CACgC,EADhC,CACMA,CAAAjH,QAAA,CAAkB,GAAlB,CADN,GAIIkH,CACA,CADgBD,CAChB,CAAAE,CAAA,CAAMN,CAAAO,aAAN,EAA8BP,CAAAO,aAAA,CAAqB,IAArB,CAA9B,EAA6D,EALjE,GAQED,CACA,CADsBN,CAADM,GACrB,CAAAD,CAAA,CAAiCL,CAADQ,QATlC,CAWA,OAAO,CAACF,GAAAA,CAAD,CAAKD,EAAAA,CAAL,CAlB6B,CAiD/BI,QAASA,GAAiB,CAACC,CAAD,CAAW,CAG1C,IAFA,IAAMC,EAAQ,EAAd,CACIC,EAAO,EADX,CAESzI,EAAI,CAAb,CAAqB,CAArB,EAAgBA,CAAhB,EAA0BA,CAA1B,CAA8BuI,CAAAzI,OAA9B,CAA+CE,CAAA,EAA/C,CAEE,GAAoB,GAApB,GAAIuI,CAAA,CAASvI,CAAT,CAAJ,CAAyB,CAEvB,IAAMqH,EAAML,CAAA,CAAkBuB,CAAlB,CAA4BvI,CAA5B,CAEZyI,EAAA,EAAQF,CAAAG,MAAA,CAAe1I,CAAf,CAAkBqH,CAAlB,CAAwB,CAAxB,CAERrH,EAAA,CAAIqH,CANmB,CAAzB,IAO2B,GAApB,GAAIkB,CAAA,CAASvI,CAAT,CAAJ,EACLwI,CAAAnI,KAAA,CAAWoI,CAAX,CACA,CAAAA,CAAA,CAAO,EAFF,EAILA,CAJK,EAIGF,CAAA,CAASvI,CAAT,CAIRyI,EAAJ,EACED,CAAAnI,KAAA,CAAWoI,CAAX,CAEF,OAAOD,EAvBmC;AAkCrCG,QAASA,EAAW,CAACd,CAAD,CAAU,CACnC,GAAiB9D,IAAAA,EAAjB,GAAIG,CAAJ,CACE,MAA6BA,EAE/B,IAA2BH,IAAAA,EAA3B,GAAI8D,CAAAe,WAAJ,CAAsC,CAEpC,IAAMC,EAAYhB,CAAAO,aAAA,CAdCU,WAcD,CAClB,IAAID,CAAJ,CACEhB,CAAAe,WAAA,CAAqBC,CADvB,KAEO,CAsC8B,CAAA,CAAA,CACjCE,CAAAA,CAAqC,UAAtB,GAtCoBlB,CAsCpBI,UAAA,CAtCoBJ,CAuCDmB,QAAAtC,WADnB,CAtCoBmB,CAwCrCnB,WACJ,IAAIqC,CAAJ,WAA4BE,QAA5B,GACQC,CACF,CADiBH,CAAA/D,YAAAtE,KAAA,EAAAa,MAAA,CAAsC,GAAtC,CACjB,CA7DeuH,WA6Df,GAAAI,CAAA,CAAa,CAAb,CAFN,EAE0C,CACtC,CAAA,CAAOA,CAAA,CAAa,CAAb,CAAP,OAAA,CADsC,CAI1C,CAAA,CAAO,EAVgC,CApCnC,GAAqB,EAArB,GAAIH,CAAJ,CAAA,CAmEJ,IAAMA,EAAqC,UAAtB,GAjEIlB,CAiEJI,UAAA,CAjEIJ,CAkEemB,QAAAtC,WADnB,CAjEImB,CAmErBnB,WACJqC,EAAAI,WAAAC,YAAA,CAAoCL,CAApC,CAtEI,CAIAlB,CAAAe,WAAA,CAAqBG,CANhB,CAL6B,CActC,MAAOlB,EAAAe,WAAP,EAA6B,EAlBM;AAkE9BS,QAASA,GAAiB,CAACxF,CAAD,CAAgB,CAAfA,CAAA,CAAA,IAAA,EAAA,GAAAA,CAAA,CAAW,EAAX,CAAAA,CAEhC,OAAiB,EAAjB,GAAIA,CAAJ,EAAwBI,CAAxB,CAGOb,CAAA,CAA4B,QAA5B,GAAeS,CAAf,CAAoD,OAApD,GAAuCA,CAH9C,CACS,CAAA,CAHsC,C,CCpWjD,QAAMyF,EAAN,EAAA,EAwBEC,QAAAA,GAAWA,CAAChJ,CAADgJ,CAAOjD,CAAPiD,CAAcA,CAIvBC,CAAAD,CC8DED,CD9DFC,CAAmBhJ,CAAnBgJ,CAHWE,QAAAF,CAAChJ,CAADgJ,CAAUA,CACnB1B,CAAA0B,CAAahJ,CAAbgJ,CAAmBjD,CAAnBiD,EAA4BA,EAA5BA,CADmBA,CAGrBA,CAJuBA,CAWzBC,QAAAA,EAAaA,CAAbA,CAAaA,CAACE,CAADF,CAAYG,CAAZH,CAAyBA,CAChCE,CAAAE,SAAJJ,GAA2B1C,IAAA+C,aAA3BL,EACEG,CAAAH,CAAYE,CAAZF,CAEFA,KAAIM,CACwBN,WAA5BA,GAAIE,CAAAzB,UAAJuB,CAIEM,CAJFN,CAIOO,CAHiDL,CAGhDV,QAADe,EAHiDL,CAG5BM,SAArBD,EAHiDL,CAGjDK,YAJPP,CAMEM,CANFN,CAMmCE,CAADO,SANlCT,EAOME,CAAAK,WAENP,IAAIM,CAAJN,CACEA,IAASxJ,CAATwJ,CAAaA,CAAbA,CAAgBxJ,CAAhBwJ,CAAoBM,CAAAhK,OAApB0J,CAA+BxJ,CAAAwJ,EAA/BA,CACEA,CAAAA,CAAAA,CAAAA,CAAmBM,CAAAN,CAAGxJ,CAAHwJ,CAAnBA,CAA0BG,CAA1BH,CAhBgCA;AA0BtC3B,QAAAA,EAAOA,CAACA,CAADA,CAAUvB,CAAVuB,CAAiBqC,CAAjBrC,CAAoCA,CAIzCA,GAAIvB,CAAJuB,CAEEA,GAAIA,CAAAsC,UAAJtC,CACMqC,CAAJrC,EACEA,CAAAsC,UAAAC,OAAAvC,CAvESwC,aAuETxC,CACAA,CAAAA,CAAAsC,UAAAC,OAAAvC,CAAyBvB,CAAzBuB,CAFFA,GAIEA,CAAAsC,UAAAG,IAAAzC,CA1ESwC,aA0ETxC,CACAA,CAAAA,CAAAsC,UAAAG,IAAAzC,CAAsBvB,CAAtBuB,CALFA,CADFA,KAQOA,IAAIA,CAAAO,aAAJP,CAA0BA,CAC/BA,IAAI0C,EAAI1C,CAAAO,aAAAP,CA+WF2C,OA/WE3C,CACJqC,EAAJrC,CACM0C,CADN1C,GAEQ4C,CACJ5C,CADe0C,CAAA9K,QAAAoI,CAjFRwC,aAiFQxC,CAAsBA,EAAtBA,CAAApI,QAAAoI,CAAkCvB,CAAlCuB,CAAyCA,EAAzCA,CACfA,CAAUA,CAAVA,CAA6BA,CAA7BA,CAAsC4C,CAAtC5C,CAHJA,EAOYA,CAAVA,CAA6BA,CAA7BA,EADgB0C,CAAA1C,CAAI0C,CAAJ1C,CAAQA,GAARA,CAAcA,EAC9BA,EADiDA,cACjDA,CADuDvB,CACvDuB,CAT6BA,CAdMA,CAmC3C6C,QAAAA,GAAeA,CAACnK,CAADmK,CAAOC,CAAPD,CAAiBE,CAAjBF,CAA2BA,CAKxClB,CAAAkB,CEQMpB,CFRNoB,CAAmBnK,CAAnBmK,CAJWjB,QAAAiB,CAACnK,CAADmK,CAAUA,CACnB7C,CAAA6C,CAAanK,CAAbmK,CAAmBC,CAAnBD,CAA6BA,CAAAA,CAA7BA,CACA7C,EAAA6C,CAAanK,CAAbmK,CAAmBE,CAAnBF,CAFmBA,CAIrBA,CALwCA,CAY1CG,QAAAA,GAAcA,CAACtK,CAADsK,CAAOF,CAAPE,CAAiBA,CAI7BrB,CAAAqB,CERIvB,CFQJuB,CAAmBtK,CAAnBsK,CAHWpB,QAAAoB,CAACtK,CAADsK,CAAUA,CACnBhD,CAAAgD,CAAatK,CAAbsK,CAAmBF,CAAnBE,EAA+BA,EAA/BA,CAAmCA,CAAAA,CAAnCA,CADmBA,CAGrBA,CAJ6BA;AAe/BC,QAAAA,EAAaA,CAACjD,CAADiD,CAAUC,CAAVD,CAAsBlG,CAAtBkG,CAAgCjH,CAAhCiH,CAA+C5I,CAA/C4I,CAA6DA,CAA1EA,IAAAA,EGuOSxB,CHvOmDpH,EAAA4I,CAAAA,IAAAA,EAAAA,GAAA5I,CAAA4I,CAAUA,EAAVA,CAAA5I,CAO1C4I,GAAhBA,GAAI5I,CAAJ4I,GACM1H,CAAJ0H,EAAiCA,OAAjCA,IARyCA,IAAAA,EAAAA,GAAAjH,CAAAiH,CAAWA,EAAXA,CAAAjH,CAQzCiH,EACE5I,CADF4I,CACsBA,CAAVA,CAAoBC,CAApBD,CAAgClG,CAAhCkG,CADZA,EAGMA,CACJA,CADoCA,CAAVA,CAAuBjD,CAAvBiD,CAC1BA,CAAA5I,CAAA4I,CAAUE,EAAAF,CAAAA,CAAAA,CAASC,CAATD,CADLA,CAAAA,GACKA,CADDA,CAAAA,EACCA,CAAwClG,CAAxCkG,CAAVA,CAA8DA,MAJhEA,CADFA,CAQAA,OAAO5I,EAAAxB,KAAAoK,EAfiEA,CAsB1EE,QAAAA,GAAGA,CAAHA,CAAGA,CAAC7I,CAAD6I,CAAQ1E,CAAR0E,CAAeC,CAAfD,CAAoBpG,CAApBoG,CAA8BA,CAC/BA,IAAIE,EAAYC,EAAAH,CAAoB1E,CAApB0E,CAA2BC,CAA3BD,CAChB1E,EAAA0E,CAA+B1E,CAc/B8E,CAwRqBC,GAxRrBD,CAd+B9E,CAc/B8E,CAGSA,EAfTJ,OAAiBA,EAAVA,CAAoB7I,CAApB6I,CAA2BA,QAAQA,CAAiB9F,CAAjB8F,CAAuBA,CAC1D9F,CAAAoG,EAALN,GACY9F,CAqCdqG,SApCIP,CADU9F,CAqCKsG,EApCfR,CAqCFS,EAAAF,CAzCSP,CAyCTO,CAtCYrG,CAsCZqG,CAzCSP,CAyBeU,EAgBxBH,CAtCkBjF,CAsClBiF,CAtCyBL,CAsCzBK,CArCEP,CAAA9F,CAAAoG,EAAAN,CAAgBA,CAAAA,CAFlBA,CAIIpG,EAAJoG,EACEpG,CAAAoG,CAAS9F,CAAT8F,CAAe1E,CAAf0E,CAAsBE,CAAtBF,CAN6DA,CAA1DA,CAJwBA,CAuBjCG,QAAAA,GAAcA,CAAC7E,CAAD6E,CAAQF,CAARE,CAAaA,CACzBA,MAAOF,EAAAE,CAAMA,MAANA,CAAa7E,CAAb6E,CAAkBA,GAAlBA,CAAwB7E,CADN6E,CA8B3BM,QAAAA,GAAiBA,CAAjBA,CAAiBA,CAACvG,CAADuG,CAAO9B,CAAP8B,CAAoBnF,CAApBmF,CAA2BP,CAA3BO,CAAsCA,CACrDA,IAAIE,EAAeF,EAAVA,CAA4BvG,CAAAuG,SAA5BA,CAGTA,IAAIA,CAAWA,EAAVA,CAA8BvG,CAA9BuG,CAALA,CAA0CA,CAC/BzL,CAAAA,CAAEyL,CAAXA,KADwCA,IAC1BxL,EAAE0L,CAAA7L,OADwB2L,CACbtL,EAAAA,IAAAA,EAA3BsL,CAA+BzL,CAA/ByL,CAAiCxL,CAAjCwL,GAAwCtL,CAAxCsL,CAA0CE,CAAAF,CAAGzL,CAAHyL,CAA1CA,EAAkDzL,CAAAyL,EAAlDA,CACEE,CAAAF,CAAGzL,CAAHyL,CAAAA,CAAQ9B,CAAA7B,KAAA2D,CAAiBA,CAAjBA,CAAuBtL,CAAvBsL,CAA0BnF,CAA1BmF,CAAiCP,CAAjCO,CAF8BA,CAK1CA,MAAOE,EAAAC,OAAAH,CAAUA,QAAAA,CAAChD,CAADgD,CAAUA,CAAAA,MAAAA,CAAAA,CAAQhD,CAARgD,CAApBA,CAAAI,KAAAJ,CA4NkBK,GA5NlBL,CAT8CA;AAgBvDM,QAAAA,GAAeA,CAACxD,CAADwD,CAAWA,CACxBA,MAAOxD,EAAA9I,QAAAsM,CAAiBC,EAAjBD,CAAsBA,QAAAA,CAACE,CAADF,CAAIxG,CAAJwG,CAAUG,CAAVH,CAAqBA,CACrBA,EAA3BA,CAAIG,CAAAlL,QAAA+K,CAAeA,GAAfA,CAAJA,CACEG,CADFH,CACWG,CAAAzM,QAAAsM,CAAeA,KAAfA,CAAsBA,KAAtBA,CADXA,CAEoCA,EAFpCA,CAEWG,CAAAlL,QAAA+K,CAAeA,KAAfA,CAFXA,GAGEG,CAHFH,CAGWG,CAAAzM,QAAAsM,CAAeA,MAAfA,CAAuBA,GAAvBA,CAHXA,CAKAA,OAAOA,GAAPA,CAAWxG,CAAXwG,CAAeA,GAAfA,CAAmBG,CAAnBH,CAAyBA,GANuBA,CAA3CA,CADiBA,CAmB1BI,QAAAA,GAAsBA,CAAC5D,CAAD4D,CAAWA,CAI/BA,IAFAA,IAAM1G,EAAU0G,EAAhBA,CACI/K,CACJ+K,CAAQ/K,CAAR+K,CAAgB5D,CAAAnH,MAAA+K,CAAeC,EAAfD,CAAhBA,CAAAA,CAA0CA,CACxCA,IAAMlF,EAAQ7F,CAAAiL,MAAdF,CACM9E,EAAgB8E,CAAVA,CAA4B5D,CAA5B4D,CAAsClF,CAAtCkF,CACZA,IAAaA,EAAbA,GAAI9E,CAAJ8E,CACEA,KAAUG,MAAJH,CAAa/K,CAAAmL,MAAbJ,CAAwBA,uBAAxBA,CAANA,CAEI1D,CAAAA,CAAOF,CAAAG,MAAAyD,CAAelF,CAAfkF,CAAsB9E,CAAtB8E,CAA4BA,CAA5BA,CACb5D,EAAA4D,CAAW5D,CAAA9I,QAAA0M,CAAiB1D,CAAjB0D,CA0MWK,QA1MXL,CACX1G,EAAApF,KAAA8L,CAAa1D,CAAb0D,CARwCA,CAU1CA,MAAOA,CAAC5D,EAAAA,CAAD4D,CAAW1G,QAAAA,CAAX0G,CAdwBA,CAyBjCM,QAAAA,GAAqBA,CAAClE,CAADkE,CAAWhH,CAAXgH,CAAoBA,CACvCA,IAAMjE,EAAQD,CAAAhH,MAAAkL,CA2LUD,QA3LVC,CACdA,OAAOhH,EAAAiH,OAAAD,CAAeA,QAAAA,CAACE,CAADF,CAAMG,CAANH,CAAWI,CAAXJ,CAAmBA,CAAAA,MAAAE,EAAAF,CAAMG,CAANH,CAAYjE,CAAAiE,CAAMI,CAANJ,CAAYA,CAAZA,CAAZA,CAAlCA,CAA8DjE,CAAAiE,CAAMA,CAANA,CAA9DA,CAFgCA;AAUzCf,CAAAA,UAAAA,EAAAA,CAAAA,QAAyBA,CAACnD,CAADmD,CAAWpF,CAAXoF,CAAkBR,CAAlBQ,CAA6BA,CACpDA,IAAIoB,EAAOpB,CAAAA,CACXnD,EAAAmD,CAAWnD,CAAA7H,KAAAgL,EAEXA,KAAIqB,EAAQf,EAAAgB,KAAAtB,CAASnD,CAATmD,CACRqB,EAAJrB,GACEnD,CACAmD,CADWnD,CAAA9I,QAAAiM,CAAiBM,EAAjBN,CAAsBA,QAAAA,CAACO,CAADP,CAAInG,CAAJmG,CAAUpE,CAAVoE,CAAoBA,CAAAA,MAAAA,GAAAA,CAAInG,CAAJmG,CAAQA,GAARA,CAAYpE,CAAA7H,QAAAiM,CAAcA,KAAdA,CAAqBA,EAArBA,CAAZA,CAAoCA,GAApCA,CAA1CA,CACXA,CAAAnD,CAAAmD,CAAWK,EAAAL,CAAqBnD,CAArBmD,CAFbA,CAMAA,KAAMuB,EAAYb,EAAAY,KAAAtB,CAAanD,CAAbmD,CAGlBA,IAAIuB,CAAJvB,CAAeA,CACZA,IAAAA,EAAsBS,EAAAT,CAA4BnD,CAA5BmD,CAArBnD,EAAAmD,CAAAA,CAAAA,EAAUjG,EAAAiG,CAAAA,CAAAA,QADCA,CAGfnD,CAAAmD,CAAWnD,CAAA9I,QAAAiM,CAAiBwB,EAAjBxB,CAAgCA,UAAhCA,CACXnD,EAAAmD,CAAWnD,CAAA9I,QAAAiM,CAAiByB,EAAjBzB,CAAsCA,QAAAA,CAACO,CAADP,CAAInB,CAAJmB,CAAO3K,CAAP2K,CAAaA,CACvDoB,CAALpB,GACM0B,CAGJ1B,CAHW2B,EAAA3B,CAAgC3K,CAAhC2K,CAAmCnB,CAAnCmB,CAAsCpF,CAAtCoF,CAA6CR,CAA7CQ,CAGXA,CAFAoB,CAEApB,CAFOoB,CAEPpB,EAFe0B,CAAAN,KAEfpB,CADAnB,CACAmB,CADI0B,CAAAE,EACJ5B,CAAA3K,CAAA2K,CAAI0B,CAAA1F,MAJNgE,CAMAA,OAAOnB,EAAPmB,CAAW3K,CAPiD2K,CAAnDA,CAUPuB,EAAJvB,GACEnD,CADFmD,CACae,EAAAf,CAA2BnD,CAA3BmD,CAAqCjG,CAArCiG,CADbA,CAGIqB,EAAJrB,GACEnD,CADFmD,CACaK,EAAAL,CAAqBnD,CAArBmD,CADbA,CAGAA,OAAOnD,EAlC6CmD,CAqCtD2B;QAAAA,GAA0BA,CAAC9E,CAAD8E,CAAWC,CAAXD,CAAuB/G,CAAvB+G,CAA8BnC,CAA9BmC,CAAyCA,CAEjEA,IAAIE,EAAehF,CAAAvH,QAAAqM,CA6HPG,WA7HOH,CACWA,EAA9BA,EAAI9E,CAAAvH,QAAAqM,CA0HKI,OA1HLJ,CAAJA,CACE9E,CADF8E,CACaK,EAAAL,CAA4B9E,CAA5B8E,CAAsCnC,CAAtCmC,CADbA,CAG4BA,CAH5BA,GAGWE,CAHXF,GAIE9E,CAJF8E,CAIa/G,CAAA+G,CAAQM,EAAAN,CAA8B9E,CAA9B8E,CAAwC/G,CAAxC+G,CAARA,CACT9E,CALJ8E,CASIO,EAAAA,CAAUP,CAAAA,CACMA,EAApBA,EAAIE,CAAJF,GACEC,CACAD,CADaA,EACbA,CAAAO,CAAAP,CAAUA,CAAAA,CAFZA,CAMAA,IAAIO,CAAJP,CAAaA,CACXA,IAAAP,EAAOO,CAAAA,CACHO,EAAJP,GAEE9E,CAFF8E,CAEa9E,CAAA9I,QAAA4N,CAAiBQ,EAAjBR,CAAgCA,QAAAA,CAACpB,CAADoB,CAAIS,CAAJT,CAAcA,CAAAA,MAAAA,KAAAA,CAAMS,CAANT,CAA9CA,CAFbA,CAFWA,CAOb9E,CAAA8E,CAAW9E,CAAA9I,QAAA4N,CAAiBU,EAAjBV,CAA4BA,QAAAA,CAACpB,CAADoB,CAAIW,CAAJX,CAAYY,CAAZZ,CACrCA,CAAAA,MAAAA,QAAAA,CAASY,CAATZ,CAAYA,KAAZA,CAAkBW,CAAlBX,CAAwBA,IAAxBA,CAA6BW,CAA7BX,CAAmCA,QAAnCA,CAA4CY,CAA5CZ,CAA+CA,IAA/CA,CADSA,CAEXA,OAAOA,CAAC3F,MAAOa,CAAR8E,CAAkBC,EAAAA,CAAlBD,CAA8BP,KAAAA,CAA9BO,CA5B0DA,CA+BnEM,QAAAA,GAAwBA,CAACpF,CAADoF,CAAWrH,CAAXqH,CAAkBA,CAClCO,CAAAA,CAAa3F,CAAAhH,MAAAoM,CAAeA,WAAfA,CAGnBA,KADAA,IAAMQ,EAASR,EAAfA,CACS3N,EAAI2N,CAAbA,CAAgB3N,CAAhB2N,CAAoBO,CAAApO,OAApB6N,CAAuC3N,CAAA2N,EAAvCA,CAEEA,GAAgBA,CAAhBA,GAAK3N,CAAL2N,CAASA,CAATA,CACEQ,CAAA9N,KAAAsN,CAAYO,CAAAP,CAAW3N,CAAX2N,CAAZA,CADFA,KAEOA,CACLA,IAAMlF,EAAOyF,CAAAP,CAAW3N,CAAX2N,CAEbA,IAAeA,EAAfA,GAAMlF,CAANkF,EAAqB3N,CAArB2N,GAA2BO,CAAApO,OAA3B6N,CAA+CA,CAA/CA,CACMhC,CAEJgC,CAFSlF,CAAAlH,MAAAoM,CA8FGS,GA9FHT,CAETA,CADAhC,CAAAgC,CAAGA,CAAHA,CACAA,EADSrH,CACTqH,CAAAQ,CAAA9N,KAAAsN,CAAYhC,CAAAE,KAAA8B,CA4FAS,GA5FAT,CAAZA,CANGA,CAWTA,MAAOQ,EAAAtC,KAAA8B,CAAYA,EAAZA,CAnBiCA;AAuB1CD,QAAAA,GAAsBA,CAACnF,CAADmF,CAAWxC,CAAXwC,CAAsBA,CAC1CA,IAAIzB,EAAI1D,CAAAnH,MAAAsM,CAAeW,EAAfX,CAERA,OAAAA,CADII,CACJJ,CADYzB,CACZyB,EADiBzB,CAAAyB,CAAEA,CAAFA,CAAAhN,KAAAgN,EACjBA,EADgCA,EAChCA,EACOI,CAAAJ,CAAMA,CAANA,CAAAtM,MAAAsM,CAAeY,EAAfZ,CAALA,CAcSnF,CAAA9I,QAAAiO,CAAiBW,EAAjBX,CAA6BA,QAAQA,CAACzB,CAADyB,CAAIa,CAAJb,CAAUI,CAAVJ,CAAiBA,CAC3DA,MAAOxC,EAAPwC,CAAmBI,CADwCJ,CAAtDA,CAdTA,CAEqBI,CAAAvM,MAAAmM,CAAYY,EAAZZ,CAAAA,CAAoCA,CAApCA,CAEnBA,GAAqBxC,CAArBwC,CACSI,CADTJ,CA6EkBc,kBAlFtBd,CAyBSnF,CAAA9I,QAAAiO,CA2CAD,OA3CAC,CAAuBxC,CAAvBwC,CA5BiCA,CA6C5Ce,QAAAA,GAAqBA,CAACvJ,CAADuJ,CAAOA,CA2BjBC,OA1BTD,GAAIvJ,CAAAuJ,SAAJA,GACEvJ,CAAAuJ,SADFA,CACqBA,MADrBA,CAD0BA,CAS5BE,CAAAA,UAAAA,EAAAA,CAAAA,QAA0BA,CAACpG,CAADoG,CAAWA,CACnCA,MAAIpG,EAAAnH,MAAAuN,CAgBKlB,OAhBLkB,CAAJA,CAESA,EAFTA,CAGWpG,CAAAnH,MAAAuN,CAeCnB,WAfDmB,CAAJA,CACEA,IAAAjD,EAAAiD,CAA+BpG,CAA/BoG,CAQcC,oBARdD,CADFA,CAGEhB,EAAAgB,CAA8BpG,CAAA7H,KAAAiO,EAA9BA,CAMcC,oBANdD,CAP0BA,CA7ZvCE,GAAA,OAAA,iBAAA,CAAA,CAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAaxE,QAAA,EAAA,CACf,MAJeA,aAGA,CAAb,CADN,CAAA,CAyaA;IAAM2B,GAAM,yBAAZ,CAGMmB,GAAsB,wCAH5B,CAIMmB,GAAyB,SAJ/B,CAQMpB,GAAgB,cARtB,CAYMmB,GAAa,0CAZnB,CAcMR,GAAgB,gDAdtB,CAeME,GAAY,2BAflB,CAoBM3B,GAAU,sCApBhB,CAuBA0C,EAAe,IAAIxF,C,CIxbjBjK,QA7BmB0P,EA6BR,CAACC,CAAD,CAAMC,CAAN,CAAmBC,CAAnB,CAAuDhH,CAAvD,CAAsErE,CAAtE,CAAgF,CAEzF,IAAAkH,EAAA,CAAkBiE,CAAlB,EAAyB,IAEzB,KAAAC,EAAA,CAAmBA,CAAnB,EAAkC,IAElC,KAAAC,EAAA,CAA6BA,CAA7B,EAAsD,EAEtD,KAAAC,EAAA,CAA+B,IAI/B,KAAAtL,SAAA,CAAgBA,CAAhB,EAA4B,EAE5B,KAAAqE,EAAA,CAAqBA,CAArB,EAAsC,EAMtC,KAAAkH,EAAA,CAFA,IAAAC,EAEA,CAJA,IAAAC,EAIA,CAJuB,IAhBkE,CAxB3FC,QAAOA,EAAGA,CAAChP,CAADgP,CAAOA,CACfA,MAAIhP,EAAJgP,CACShP,CAAAgP,YADTA,CAGSA,IAJMA,CAYjBC,QAAOA,GAAGA,CAACjP,CAADiP,CAAOC,CAAPD,CAAkBA,CAE1BA,MADAjP,EAAAiP,YACAA,CADgBC,CADUD,CAkC5BE,CAAAA,UAAAA,EAAAA,CAAAA,QAAcA,EAAGA,CACfA,MAAOA,KAAA3E,EADQ2E,CAMnBX,EAAAY,UAAA,eAAA,CAAwCZ,CAAAY,UAAAD,E,CDjDhBE,QAAA,GAAQ,CAACrH,CAAD,CAAW,CACzC,IAAMsH,EAAS,IAAApK,QAAToK,EAAyB,IAAAD,gBAAzBC,EACJ,IAAAC,mBADID,EACuB,IAAAE,kBADvBF,EAEJ,IAAAG,iBAFIH,EAEqB,IAAAI,sBAC3B,OAAOJ,EAAP,EAAiBA,CAAA/H,KAAA,CAAY,IAAZ,CAAkBS,CAAlB,CAJwB,CAO3C,IAAM2H,GAAQzM,SAAAC,UAAAtC,MAAA,CAA0B,SAA1B,CAId,SAAM+O,GAAN,EAAA,EAUEC,QAAAA,GAAcA,CAACjO,CAADiO,CAAQA,CAAAA,IACHC,EAAQD,EADLA,CACSE,EAAYF,EADrBA,CACyBG,EAAYH,CAC/CA,EAAVA,CAAsBjO,CAAtBiO,CAA6BA,QAAQA,CAAClL,CAADkL,CAAOA,CAC1CI,CAAAJ,CAAkBlL,CAAlBkL,CAEAlL,EAAAmH,MAAA+D,CAAaG,CAAAH,EACmBlO,EAAAA,CAAAgD,CAAAuL,EAAAvO,QAwElCwO,KADAA,IAAIzE,CACJyE,CAAQzE,CAARyE,CAAeA,EAAHC,KAAAD,CAAqBxO,CAArBwO,CAAZA,CAAAA,CAA4CA,CAC1CA,IAAIE,EAAO3E,CAAAyE,CAAEA,CAAFA,CAGEA,IAAbA,GAAIzE,CAAAyE,CAAEA,CAAFA,CAAJA,GA5E2DL,CA6EzDK,CAAME,CAANF,CADFA,CACgBA,CAAAA,CADhBA,CAJ0CA,CA5EAN,CAA5CA,CAKGS,QAAwBT,CAAClL,CAADkL,CAAOA,CAChCE,CAAAjQ,KAAA+P,CAAelL,CAAfkL,CADgCA,CALlCA,CASAjO,EAAA2O,EAAAV,CAAmBE,CAEfS,EAAAA,CAAQX,EACZA,KAAKA,IAAIpQ,CAAToQ,GAAcC,EAAdD,CACEW,CAAA1Q,KAAA+P,CAAWpQ,CAAXoQ,CAEFA,OAAOW,EAjBaX;AAqBtBI,QAAAA,EAAYA,CAACtL,CAADsL,CAAOA,CACjBA,GAAIC,CAAAvL,CAAAuL,EAAJD,CAAAA,CADiBA,IAIbpD,EAAOoD,EAJMA,CAIFQ,EAAaR,EACRS,EAAAT,CAAuBtL,CAAvBsL,CAA6BQ,CAA7BR,CACpBA,GACEpD,CAAA4D,EAEAR,CAFkBQ,CAElBR,CAAAtL,CAAAsL,MAAAA,CAAgBA,IAHlBA,CAKApD,EAAAlL,QAAAsO,CAAmCtL,CAkCCgM,cAM7BzR,QAAA0R,CAAmBA,EAAnBA,CAA8BA,EAA9BA,CAAA1R,QAAA0R,CACOA,CADPA,CACmBA,EADnBA,CAvCPjM,EAAAuL,EAAAD,CAAoBpD,CAXpBoD,CADiBA,CAiBnBS,QAAAA,EAAiBA,CAAC/L,CAAD+L,CAAOD,CAAPC,CAAmBA,CAClCA,IAAI7D,EAAOlI,CAAAuL,EACXQ,IAAI7D,CAAJ6D,CACEA,IAAI7D,CAAA4D,EAAJC,CAEEA,MADAG,OAAAC,OAAAJ,CAAcD,CAAdC,CAA0B7D,CAAA4D,EAA1BC,CACOA,CAAAA,CAAAA,CAFTA,CADFA,IAKOA,CAED/O,CAAAA,CAAUgD,CAAA+L,cAGdA,KAFAA,IAAIvJ,CAEJuJ,CAAQhF,CAARgF,CAJeA,CAIHN,KAAAM,CAAQ/O,CAAR+O,CAAZA,CAAAA,CAA+BA,CAE7BvJ,CAAAuJ,CAAQvQ,CAACuL,CAAAgF,CAAEA,CAAFA,CAADvQ,EAASuL,CAAAgF,CAAEA,CAAFA,CAATvQ,MAAAuQ,EAERA,IAAcA,SAAdA,GAAIvJ,CAAJuJ,EAAqCA,OAArCA,GAA2BvJ,CAA3BuJ,CACED,CAAAC,CAAWhF,CAAAgF,CAAEA,CAAFA,CAAAvQ,KAAAuQ,EAAXA,CAAAA,CAA0BvJ,CAE5B4J,EAAAL,CAAMA,CAAAA,CAPuBA,CAS/BA,MAAOK,EAdFL,CAP2BA;AAoEpCM,QAAAA,EAAgBA,CAAhBA,CAAgBA,CAACC,CAADD,CAAWlB,CAAXkB,CAAkBA,CAG5BC,CAAJD,GAEIC,CAFJD,CAC8BA,CAA5BA,EAAIC,CAAAxQ,QAAAuQ,CAAiBA,GAAjBA,CAAJA,CACaE,EAAAF,CAAAA,CAAAA,CAAwBC,CAAxBD,CAAkClB,CAAlCkB,CADbA,CAuBuBA,EAAVA,CAAqCC,CAArCD,CAlBF9H,QAAQ8H,CAAChK,CAADgK,CAAS7J,CAAT6J,CAAgB5J,CAAhB4J,CAA0B/J,CAA1B+J,CAAkCA,CACjDA,GAAIA,CAAC7J,CAAL6J,CACEA,MAAOhK,EAAPgK,CAAgB/J,CAIlB+J,EAFIG,CAEJH,CAFoBA,CAAAA,CALXA,CAKWA,CAAsBlB,CAAAkB,CAAM7J,CAAN6J,CAAtBA,CAAoClB,CAApCkB,CAEpBA,GAAwCA,SAAxCA,GAAsBG,CAAtBH,CAI6BA,oBAJ7BA,GAIWG,CAJXH,GAQEG,CARFH,CAQkBA,SARlBA,EAEEG,CAFFH,CAEkBA,CAAAA,CATTA,CASSA,CAAsBlB,CAAAkB,CAAM5J,CAAN4J,CAAtBA,EAAyC5J,CAAzC4J,CAAmDlB,CAAnDkB,CAFlBA,EAGE5J,CAOF4J,OAAOhK,EAAPgK,EAAiBG,CAAjBH,EAAkCA,EAAlCA,EAAwC/J,CAhBS+J,CAkBxCA,CAxBfA,CA2BAA,OAAOC,EAAPD,EAAmBC,CAAA9Q,KAAA6Q,EAAnBA,EAAsCA,EA9BNA;AAkClCE,QAAAA,GAAkBA,CAAlBA,CAAkBA,CAACD,CAADC,CAAWpB,CAAXoB,CAAkBA,CAC9BjJ,CAAAA,CAAQgJ,CAAAjQ,MAAAkQ,CAAeA,GAAfA,CACZA,KAFkCA,IAEzBzR,EAAEyR,CAFuBA,CAEpBtR,CAFoBsR,CAEjBxF,CAAjBwF,CAAoBzR,CAApByR,CAAsBjJ,CAAA1I,OAAtB2R,CAAoCzR,CAAAyR,EAApCA,CACEA,GAAKtR,CAALsR,CAASjJ,CAAAiJ,CAAMzR,CAANyR,CAATA,CAAoBA,CACfA,CAAHE,UAAAF,CAA2BA,CAE3BA,IADAxF,CACAwF,CADOA,CAAHd,KAAAc,CAAoBtR,CAApBsR,CACJA,CACEtR,CAAAsR,CAAIF,CAAAE,CAAAA,CAAAA,CAAsBpB,CAAAoB,CAAMxF,CAAAwF,CAAEA,CAAFA,CAANA,CAAtBA,CAAmCpB,CAAnCoB,CADNA,KAIEA,IADIG,CACAH,CADQtR,CAAAa,QAAAyQ,CAAUA,GAAVA,CACRA,CAAWA,EAAXA,GAAAG,CAAJH,CAAkBA,CAChBA,IAAII,EAAK1R,CAAAM,UAAAgR,CAAYG,CAAZH,CACTI,EAAAJ,CAAKI,CAAAnR,KAAA+Q,EACLI,EAAAJ,CAAKF,CAAAE,CAAAA,CAAAA,CAAsBI,CAAtBJ,CAA0BpB,CAA1BoB,CAALA,EAAyCI,CACzC1R,EAAAsR,CAAItR,CAAAM,UAAAgR,CAAYA,CAAZA,CAAeG,CAAfH,CAAJA,CAA4BI,CAJZJ,CAOpBjJ,CAAAiJ,CAAMzR,CAANyR,CAAAA,CAAYtR,CAADsR,EAAMtR,CAAAW,YAAA2Q,CAAcA,GAAdA,CAANA,GAA6BtR,CAAAL,OAA7B2R,CAAwCA,CAAxCA,CAETtR,CAAAuI,MAAA+I,CAAQA,CAARA,CAAYA,EAAZA,CAFSA,CAGTtR,CAHSsR,EAGJA,EAjBWA,CAoBtBA,MAAOjJ,EAAAqD,KAAA4F,CAAWA,GAAXA,CAvB2BA;AAoFpCK,QAAAA,GAAsBA,CAAC3P,CAAD2P,CAAQjK,CAARiK,CAAiBA,CACrCA,IAAIzB,EAAQyB,EAAZA,CAEIC,EAAID,EAEEA,EAAVA,CAAsB3P,CAAtB2P,CAA6BA,QAAAA,CAAC5M,CAAD4M,CAAUA,CAGhC5M,CAAAuL,EAALqB,EACEtB,CAAAsB,CAAkB5M,CAAlB4M,CAKFA,KAAIE,EAAkB9M,CAAAsG,EAAlBwG,EAA8C9M,CAAA4M,eAC9CjK,EAAJiK,EAAe5M,CAAAuL,EAAAO,EAAfc,EAA+CE,CAA/CF,EACMlC,EAAA9H,KAAAgK,CAAqBjK,CAArBiK,CAA8BE,CAA9BF,CADNA,GAEIb,CAAAa,CAAuB5M,CAAvB4M,CAA6BzB,CAA7ByB,CA6TR,CA3TqBzF,CA2TrB,CA3TqBnH,CAAAmH,MA2TrB,CAFI0F,CAEJ,CAFQE,QAAA,CAASlS,CAAT,CAAa,EAAb,CAAiB,EAAjB,CAER,CA3TiCgS,CA2TjC,CAAKA,CAAL,CAAA,EA3TiCA,CA2TtB,CAAKA,CAAL,CAAX,EAAsB,CAAtB,EADQ,CACR,EADchS,CACd,CADkB,EA9Td+R,CAVqCA,CAAvCA,CAiBGA,IAjBHA,CAiBSA,CAAAA,CAjBTA,CAkBAA,OAAOA,CAACd,EAAYX,CAAbyB,CAAoBI,IAAKH,CAAzBD,CAvB8BA;AAgCvCK,QAAAA,GAAkBA,CAAC7L,CAAD6L,CAAQjN,CAARiN,CAActO,CAAdsO,CAAwBvN,CAAxBuN,CAAkCA,CAC7CjN,CAAAuL,EAAL0B,EACE3B,CAAA2B,CAAkBjN,CAAlBiN,CAEFA,IAAKjN,CAAAuL,EAAAO,EAALmB,CAAAA,CAGIA,IAAAA,EAAgCA,CAAVA,CAAuB7L,CAAvB6L,CAArBhK,EAAAA,CAAAgK,CAAAA,GAAIjK,EAAAA,CAAAiK,CAAAA,EACLjH,EAAAA,CAAY/C,CAAAgK,CACdhH,EAAAgH,CAAgChK,CAAhCgK,CAAoCjK,CAApCiK,CADcA,CAEdA,MACFA,KAAIC,EAAiBlN,CAAAiN,eAArBA,CACIE,EAA6BF,WAA7BE,GAAUD,CAAVC,EAA+DF,MAA/DE,GAA4CD,CADhDD,CAEIG,EAA6CH,CAA7CG,GAASF,CAAApR,QAAAmR,CAAuBA,OAAvBA,CAATG,EAAkDH,CAACE,CAItCF,QAAjBA,GAAItO,CAAJsO,GAEEE,CAEAF,CAFSC,CAETD,GAF6BjH,CAE7BiH,CAFyCA,OAEzCA,CAFmDjH,CAEnDiH,EAFqGA,EAErGA,GAFiEC,CAAApR,QAAAmR,CAAuBA,MAAvBA,CAEjEA,CAAAG,CAAAH,CAASA,CAACE,CAAVF,EAA0DA,CAA1DA,GAAoBC,CAAApR,QAAAmR,CAAuBjH,CAAvBiH,CAJtBA,CAMAA,IAAKE,CAALF,EAAgBG,CAAhBH,CAGIH,CAeJG,CAfsBjH,CAetBiH,CAdIG,CAcJH,GAZOjN,CAAAsG,EAUL2G,GAREjN,CAAAsG,EAQF2G,CAPE1G,EAAA0G,CAAA7I,CAAA6I,CACEjN,CADFiN,CAEE7I,CAAAoC,EAFFyG,CAGqChK,CH1IzCiD,CAwRqBC,GAxRrBD,CG0IyCjD,CH1IzCiD,CAGSA,EGoIL+G,CAIEjH,CAJFiH,CAOFA,EAAAH,CAAAG,CAAkBjN,CAAAsG,EAAlB2G,EAA8CjH,CAEhDiH,EAAAvN,CAAAuN,CAASA,CACP5J,EAAUyJ,CADHG,CAEPG,EAAQA,CAFDH,CAGPE,EAAQA,CAHDF,CAATA,CArCAA,CAJkDA,CAqDpDI,QAAAA,GAA6BA,CAACjM,CAADiM,CAAQpQ,CAARoQ,CAAe1O,CAAf0O,CAAyBA,CAAAA,IAChDC,EAAYD,EADoCA,CAChCE,EAAYF,EAEtBA,EAAVA,CAAsBpQ,CAAtBoQ,CAA6BA,QAAAA,CAACrN,CAADqN,CAAUA,CAErCJ,EAAAI,CAAwBjM,CAAxBiM,CAA+BrN,CAA/BqN,CAAqC1O,CAArC0O,CAA+CA,QAAAA,CAACnF,CAADmF,CAAUA,CAEnD3C,EAAA9H,KAAAyK,CADUjM,CAAAoM,SACVH,EAD4BjM,CAC5BiM,CAA8BnF,CAAA7E,EAA9BgK,CAAJA,GACMnF,CAAAkF,EAAJC,CACEtB,CAAAsB,CAAuBrN,CAAvBqN,CAA6BC,CAA7BD,CADFA,CAGEtB,CAAAsB,CAAuBrN,CAAvBqN,CAA6BE,CAA7BF,CAJJA,CAFuDA,CAAzDA,CAFqCA,CAAvCA,CAYGA,IAZHA,CAYSA,CAAAA,CAZTA,CAaAA,OAAOA,CAACE,EAAWA,CAAZF,CAAuBC,EAAWA,CAAlCD,CAhB6CA;AAwBtDI,QAAAA,GAAeA,CAAfA,CAAeA,CAAC9K,CAAD8K,CAAU3B,CAAV2B,CAAsBtD,CAAtBsD,CAAqCA,CAE9CA,IAAAA,EAAgCA,CAAVA,CAAuB9K,CAAvB8K,CAAtBA,CACAC,EAAezH,EAAAwH,CADdA,CAAAA,GACcA,CADVA,CAAAA,EACUA,CADfA,CAMAE,EAASF,IAAIG,MAAJH,CNlXUA,eMkXVA,EAHQ9K,CAAAQ,QAAAsK,CACnBA,IADmBA,CACZC,CAAAlK,MAAAiK,CAAmBA,CAAnBA,CAAuBA,EAAvBA,CADYA,CACgBA,KADhBA,CAEnBC,CACWD,ENjXUA,iBMiXVA,CANTA,CAQAA,EAAgCI,CAAAJ,CAAc9K,CAAd8K,CAAnBxQ,EAAAA,CAAZwQ,CAAAA,EAAmB9O,EAAAA,CAAA8O,CAAAA,SACxBA,KAAIK,EACFC,EAAAN,CAAyCxQ,CAAzCwQ,CAAgDtD,CAAhDsD,CACFA,OAAO7H,EAAA6H,CAA+B9K,CAA/B8K,CAAwCxQ,CAAxCwQ,CAA+CA,QAAQA,CAACzN,CAADyN,CAAOA,CAnLrEO,IAAI/E,EAAS+E,EAoLUhO,EAlLlBuL,EAALyC,EACE1C,CAAA0C,CAiLqBhO,CAjLrBgO,CAiLqBhO,EA/KnBuL,EAAAvO,QAAJgR,GACE/E,CADF+E,CACWzB,EAAAyB,CAiKAP,CAjKAO,CA8KYhO,CA9KYuL,EAAAvO,QAAxBgR,CA8KkBlC,CA9KlBkC,CADXA,CA+KuBhO,EA5KvBgO,QAAAA,CAAkB/E,CA6KhBwE,IAAIA,CAACvP,CAALuP,EACIA,CAAWA,EAAVA,CAA8BzN,CAA9ByN,CADLA,EAEIzN,CAAAyN,QAFJA,CAEqBA,CAvKvBQ,IAAIhF,EADA5B,CACA4B,CA0K6BjJ,CA3KrBiO,QAEcA,KAA1BA,EAyKiCjO,CAzK7BkO,EAAJD,GAyKiCjO,CAvK/BkO,EAFFD,CAE0BA,EAAHnG,KAAAmG,CAAwB5G,CAAxB4G,CAFvBA,CAKAA,IAoKiCjO,CApK7BkO,EAAJD,CAIEA,GAAqCA,IAArCA,EAgK+BjO,CAhK3BmO,EAAJF,CAA2CA,CAgKZjO,CA/J7BmO,EAAAF,CAAgCA,EAChCA,KAAKA,IAAIG,CAATH,GA8JmCH,EA9JnCG,CACEI,CAIAJ,CAyJiCH,CA7JrBG,CAAmBG,CAAnBH,CAIZA,CAHAhF,CAGAgF,CAHSI,CAAAJ,CAAU5G,CAAV4G,CAGTA,CAAI5G,CAAJ4G,GAAchF,CAAdgF,GACE5G,CACA4G,CADQhF,CACRgF,CAuJyBjO,CAvJzBmO,EAAAhT,KAAA8S,CAAmCG,CAAnCH,CAFFA,CAPuCA,CAA3CA,IAYOA,CAGLA,IAASnT,CAATmT,CAAaA,CAAbA,CAAgBnT,CAAhBmT,CAiJ6BjO,CAjJTmO,EAAAvT,OAApBqT,CAA0DA,EAAEnT,CAA5DmT,CACEI,CACAJ,CA+IiCH,CAhJrBG,CAgJejO,CAhJImO,EAAAF,CAA8BnT,CAA9BmT,CAAnBA,CACZA,CAAA5G,CAAA4G,CAAQI,CAAAJ,CAAU5G,CAAV4G,CAEVhF,EAAAgF,CAAS5G,CAPJ4G,CAoJwBjO,CA1IjCiO,QAAAA,CAAkBhF,CA2IMjJ,EA4ExBsG,EAAAgI,CA5EwBtO,CA4EGsG,EAA3BgI,EA5EwBtO,CA4E+BsO,SAEnDlN;CAAAA,CAAQkN,GAARlN,CA9EgD+I,CA+EhD7G,EAAAA,CAAkBgL,EAAVA,CA/EYtO,CA6ETsG,EAEHgI,CACHxT,EAAAA,CAAEwT,CAAXA,KALkDA,IAKpCvT,GAAEuI,CAAA1I,OALkC0T,CAKpBrT,EAAAA,IAAAA,EAA9BqT,CAAkCxT,CAAlCwT,CAAoCvT,EAApCuT,GAA2CrT,CAA3CqT,CAA6ChL,CAAAgL,CAAMxT,CAANwT,CAA7CA,EAAwDxT,CAAAwT,EAAxDA,CACEhL,CAAAgL,CAAMxT,CAANwT,CAAAA,CAAWrT,CAAAiB,MAAAoS,CAjFiBX,CAiFjBW,CAAAA,CACTrT,CAAAV,QAAA+T,CAlFkCZ,CAkFlCY,CAAwBlN,CAAxBkN,CADSA,CAETlN,CAFSkN,CAEDA,GAFCA,CAEKrT,CAnFM+E,EAqFxBsO,SAAAA,CAAmBhL,CAAAqD,KAAA2H,CAAWA,GAAXA,CAzFIb,CAJ8CA,CAA9DA,CAUJ9O,CAVI8O,CAb2CA,CAgCpDM,QAAAA,GAA0BA,CAAU9Q,CAAV8Q,CAAiB5D,CAAjB4D,CAAgCA,CACpDQ,CAAAA,CAAiBtR,CAAA2O,EACrBmC,KAAID,EAAqBC,EACzBA,IAAIA,CAAC7P,CAAL6P,EAAqBQ,CAArBR,CAIEA,IAJmCA,IAI1BjT,EAAIiT,CAJsBA,CAInB/P,EAAgBuQ,CAAAR,CAAejT,CAAfiT,CAAhCA,CACKjT,CADLiT,CACSQ,CAAA3T,OADTmT,CAEK/P,CAFL+P,CAEqBQ,CAAAR,CAAeA,EAAEjT,CAAjBiT,CAFrBA,CAE0CA,CACnB/P,IAAAA,EAAAA,CAAAA,CAAemM,EAAAA,CAiCxCnK,EAAAwO,EAAAC,CAAuBA,IAAIb,MAAJa,CAAWA,KAAXA,CAAiBzO,CAAAyO,cAAjBA,CAAsCA,WAAtCA,CAAmDA,GAAnDA,CACvBzO,EAAA0O,EAAAD,CAAgCzO,CAAAyO,cAAhCA,CAAwDA,GAAxDA,CAA8DE,CAC9D3O,EAAAsG,EAAAmI,CAA2BzO,CAAAsG,EAA3BmI,EAAuDzO,CAAAyO,SACvDzO,EAAAyO,SAAAA,CAAmBzO,CAAAsG,EAAA/L,QAAAkU,CACfzO,CAAAyO,cADeA,CACQzO,CAAA0O,EADRD,CAnCfX,EAAAC,CAAmB/P,CAAA+P,cAAnBA,CAAAA,CACIa,EAAAb,CAA+B/P,CAA/B+P,CAHoCA,CAM5CA,MAAOD,EAfiDC,CAwB1Da,QAAAA,GAAyBA,CAAC5Q,CAAD4Q,CAAgBA,CACvCA,MAAOA,SAAQA,CAAC5R,CAAD4R,CAAUA,CACvBA,MAAO5R,EAAAzC,QAAAqU,CACH5Q,CAAAwQ,EADGI,CAEH5Q,CAAA0Q,EAFGE,CADgBA,CADcA;AA4IzCC,QAAAA,GAAgBA,CAAChP,CAADgP,CAAQ/C,CAAR+C,CAAoBA,CAApCA,IAAAA,EFzJM5D,CEyJN4D,CACM5R,EAAkB4R,CAAVA,CAAwDhP,CAAxDgP,CAEZhP,EAAAC,YAAA+O,CAA8BA,CAAVA,CAAoB5R,CAApB4R,CAA2BA,QAAQA,CAAiB7O,CAAjB6O,CAAuBA,CAC5EA,IAAI/I,EAAM9F,CAAA6O,QAAN/I,CAAwB9F,CAAA6O,cACxB7O,EAAAuL,EAAJsD,EAAyB7O,CAAAuL,EAAAvO,QAAzB6R,GASE/I,CAEA+I,CAFuD/I,CT9WtDvL,QAAA,CACI2C,EADJ,CACmB,EADnB,CAAA3C,QAAAsU,CAEI1R,EAFJ0R,CAEkB,EAFlBA,CSgXDA,CAAA7O,CAAA6O,QAAAA,CAAkBtC,EAAAsC,CAdXA,CAcWA,CAAwB/I,CAAxB+I,CAA6B/C,CAA7B+C,CAXpBA,CAF4EA,CAA1DA,CAHcA,CA3hBtClF,EAAA,OAAA,iBAAA,CAAA,EAAA,UAAA,CAAA,CAAA,EACM,CAAA,aAAA,CAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAcmF,QAAA,EAAA,CAChB,MAJgBA,SAGA,CAAd,CADN,CAAA,CA2jBA,KAAAlF,EAAe,IAAIqB,E,CE/kBnB,IAAM8D,EAAiB,EAAvB,CAsBMC,EAAK7Q,MAAA,eACX,IAAI6Q,CAAJ,EAAU,CAAC9Q,CAAX,CAAyB,CAIvB,IAAM+Q,GAAaD,CAAA,OAUnBA,EAAA,OAAA,CAJsBE,QAAA,CAACxD,CAAD,CAAOyD,CAAP,CAAcC,CAAd,CAA0B,CAnB3CL,CAAA,CAoBoBrD,CApBpB,CAAL,GACEqD,CAAA,CAmBuBrD,CAnBvB,CADF,CACgCzK,EAAA,CAmBPyK,CAnBO,CADhC,CAqBEuD,GAAArM,KAAA,CAAsDoM,CAAtD,CAA2DtD,CAA3D,CAAiEyD,CAAjE,CAAwEC,CAAxE,CAF8C,CAVzB,C,CC3BvBjV,QADmBkV,GACR,EAAgB,CAEzB,IAAAC,MAAA,CAAa,EAFY,CAiB3BC,EAAAA,UAAAA,MAAAA,CAAAA,QAAKA,CAACC,CAADD,CAAUzD,CAAVyD,CAAsBE,CAAtBF,CAAoCpF,CAApCoF,CAAmDA,CACtDA,IAAIG,EAAOH,IAAAD,MAAAC,CAAWC,CAAXD,CAAPG,EAA8BH,EAClCG,EAAAvU,KAAAoU,CAAUA,CAACzD,EAAAA,CAADyD,CAAaE,aAAAA,CAAbF,CAA2BpF,EAAAA,CAA3BoF,CAAVA,CAnBoBI,IAoBpBJ,CAAIG,CAAA9U,OAAJ2U,EACEG,CAAAE,MAAAL,EAEFA,KAAAD,MAAAC,CAAWC,CAAXD,CAAAA,CAAsBG,CANgCH,C,CJbvCM,QAAA,GAAQ,EAAG,EAgB9B,IAAMC,GAAc,IAAIlC,MAAJ,CAAcxJ,CAAAe,EAAd,CAAyC,eAAzC,CAMb4K,SAASA,GAAe,CAACpN,CAAD,CAAU,CAEvC,MAAA,CADMzG,CACN,CADcA,CAAWyG,CAhBrBsC,UAAJ,EAgByBtC,CAhBAsC,UAAAzC,MAAzB,CAgByBG,CAfhBsC,UAAAzC,MADT,CAgByBG,CAXhBO,aAAA,CAAqB,OAArB,CALT,EAK0C,EAW5BhH,OAAA,CAA0B4T,EAA1B,CACd,EACS5T,CAAA,CAAM,CAAN,CADT,CAGS,EAL8B,CAYlC8T,QAASA,GAAa,CAAC3U,CAAD,CAAO,CAClC,IAAM4U,EAAYpN,CAAA,CAAKxH,CAAL,CAAA6U,YAAA,EAClB,OAAID,EAAJ,GAAkB5U,CAAlB,EAA0B4U,CAA1B,GAAwC5U,CAAA8U,cAAxC,CACS,EADT,CAIA,CADM9G,CACN,CADwC4G,CAAD5G,KACvC,EAIOvG,CAAA,CAAauG,CAAb,CAAApG,GAJP,CAES,EARyB;AAyEpCmN,QAASA,GAAO,CAACC,CAAD,CAAO,CACrB,IAAK,IAAIC,EAAE,CAAX,CAAcA,CAAd,CAAkBD,CAAAzV,OAAlB,CAA+B0V,CAAA,EAA/B,CAAoC,CAClC,IAAIC,EAAMF,CAAA,CAAKC,CAAL,CACV,IAAIC,CAAA7P,OAAJ,GAAmBE,QAAA4P,gBAAnB,EACED,CAAA7P,OADF,GACiBE,QAAAS,KADjB,CAIA,IAAK,IAAIvG,EAAE,CAAX,CAAcA,CAAd,CAAkByV,CAAAE,WAAA7V,OAAlB,CAAyCE,CAAA,EAAzC,CAA8C,CAC5C,IAAID,EAAI0V,CAAAE,WAAA,CAAe3V,CAAf,CACR,IAAID,CAAA6J,SAAJ,GAAmB9C,IAAA+C,aAAnB,CAAA,CAIA,IAAIhK,EAAOE,CAAAqV,YAAA,EAAX,CACIQ,EAAeX,EAAA,CAAgBlV,CAAhB,CAInB,IAAI6V,CAAJ,EAAoB/V,CAApB,GAA6BE,CAAAsV,cAA7B,GA3BiB,OA2BjB,GAAuEtV,CA3BvEkI,UA2BA,EA3B6C,UA2B7C,GAAuElI,CA3B3CkI,UA2B5B,EHgO4B,EGhO5B,GHgOGU,CAAA,CGhOoE5I,CHgOpE,CGhOH,EACE8K,EAAA,CAAgC9K,CAAhC,CAAmC6V,CAAnC,CADF,KAEO,IAAI/V,CAAJ,WAAoBgW,WAApB,CAnDX,IAoDYjL,CApDHkL,CAoDcZ,EAAA,CAAcnV,CAAd,CApDd+V,CAsDClL,CAtDDkL,GAsDcF,CAtDdE,EAuDDpL,EAAA,CAAiC3K,CAAjC,CAAoC6V,CAApC,CAAkDhL,CAAlD,CAvDCkL,CAHHC,CAGGD,CAHazS,MAAA,SAAA,cAAA,iBAAAyE,KAAA,CA6DY/H,CA7DZ,CACX,QADW,CACFuJ,CAAAe,EADE,CACyB,GADzB,CAGbyL,CAAAA,CAAAA,CAAI,CAAb,CAAgBA,CAAhB,CAAoBC,CAAAjW,OAApB,CAA0CgW,CAAA,EAA1C,CAA+C,CASvCE,CAAAA,CAAeD,CAAA,CAAcD,CAAd,CACrB;IAAMG,EAAiCf,EAAA,CAAcc,CAAd,CACnCC,EAAJ,EACEpO,CAAA,CAAyBmO,CAAzB,CAAuCC,CAAvC,CAZ2C,CAwC3C,CAF4C,CANZ,CADf;AAkCvB,GAAI,EAAC7S,CAAD,EAAmBC,MAAA,SAAnB,EAAyCA,MAAA,SAAA,sBAAzC,CAAJ,CAA2F,CACzF,IAAI6S,GAAW,IAAIC,gBAAJ,CAAqBb,EAArB,CAAf,CACIrO,GAAQA,QAAA,CAAC1G,CAAD,CAAU,CACpB2V,EAAAE,QAAA,CAAiB7V,CAAjB,CAAuB,CAAC8V,UAAW,CAAA,CAAZ,CAAkBC,QAAS,CAAA,CAA3B,CAAvB,CADoB,CAStB,IAN4BjT,MAAA,eAM5B,EALE,CAACA,MAAA,eAAA,0BAKH,CACE4D,EAAA,CAAMnB,QAAN,CADF,KAEO,CACL,IAAIyQ,GAAeA,QAAA,EAAM,CACvBtP,EAAA,CAAMnB,QAAA0Q,KAAN,CADuB,CAIrBnT,OAAA,YAAJ,CACEA,MAAA,YAAA,UAAA,CAAmCkT,EAAnC,CADF,CAKEE,qBAAA,CAAsB,QAAQ,EAAG,CAC/B,GAA4B,SAA5B,GAAI3Q,QAAA4Q,WAAJ,CAAuC,CACrC,IAAIC,EAAWA,QAAQ,EAAG,CACxBJ,EAAA,EACAzQ,SAAA8Q,oBAAA,CAA6B,kBAA7B,CAAiDD,CAAjD,CAFwB,CAI1B7Q,SAAA+Q,iBAAA,CAA0B,kBAA1B;AAA8CF,CAA9C,CALqC,CAAvC,IAOEJ,GAAA,EAR6B,CAAjC,CAVG,CAwBPxB,EAAA,CAAQA,QAAQ,EAAG,CACjBO,EAAA,CAAQY,EAAAY,YAAA,EAAR,CADiB,CArCsE,CA7IhF/B,IAAAgC,GAAAhC,E,CKDX,IAAMiC,EAAc,E,CCkBpB,IAAMC,GAAUC,OAAAC,QAAA,EAKTC,SAASA,GAAU,CAACC,CAAD,CAAa,CAErC,GADIC,CACJ,CDxBaN,CCuBE,CAAYK,CAAZ,CACf,CACqBC,CAerB,yBAIA,CAnBqBA,CAeO,yBAI5B,EAJyD,CAIzD,CAnBqBA,CAiBrB,4BAEA,CAnBqBA,CAiBU,4BAE/B,EAF+D,CAE/D,CAnBqBA,CAmBrB,sBAAA,EAnBqBA,CAmBK,sBAA1B,EAAoD,CAApD,EAAyD,CAtBpB,CAyChCC,QAASA,GAAe,CAACD,CAAD,CAAW,CACxC,MAAOA,EAAA,yBAAP,GAAqCA,CAAA,sBADG,CA4CnCE,QAASA,GAAuB,CAACF,CAAD,CAAW,CAEhDA,CAAA,4BAAA,CAA+BA,CAAA,sBAE1BA,EAAAG,YAAL,GACEH,CAAAG,YACA,CADuB,CAAA,CACvB,CAAAR,EAAAS,KAAA,CAAa,QAAQ,EAAG,CAEtBJ,CAAA,yBAAA,CAA4BA,CAAA,sBAC5BA,EAAAG,YAAA,CAAuB,CAAA,CAHD,CAAxB,CAFF,CAJgD,C,CP9FlD,IAAME,GAAa,IAAIpD,EAGrBlV,SADmBuY,EACR,EAAG,CACZ,IAAAC,EAAA,CAAqB,EACrB,KAAAC,EAAA,CAAkDhS,QAAA4P,gBAClD,KAAI1G,EAAM,IAAI1P,CACd0P,EAAA,MAAA,CAAe,EACf,KAAA+I,EAAA,CAA+BC,EAAA,CAAc,IAAAF,EAAd,CAAmC,IAAI/I,CAAJ,CAAcC,CAAd,CAAnC,CAC/B,KAAAiJ,EAAA,CAA4B,CAAA,CAI5B,KAAAC,EAAA,CAFA,IAAAC,EAEA,CAFkB,IARN,CAYdpD,CAAAA,CAAAA,CAAAA,UAAAqD,EAAArD,MAAAA,CAAAA,QAAKA,EAAGA,CACNgC,EAAAhC,EADMA,CAORsD,EAAAC,EAAAA,CAAAA,QAAWA,CAACvT,CAADuT,CAAQA,CACjBA,MAAiBA,EAAVA,CAAwBvT,CAAxBuT,CADUA,CAGnBC,EAAAC,EAAAA,CAAAA,QAAgBA,CAACxJ,CAADwJ,CAAMA,CACpBA,MAAiBA,EAAVA,CAAoBxJ,CAApBwJ,CADaA,CAatBC,EAAAC,gBAAAA,CAAAA,QAAeA,CAACpB,CAADoB,CAAWrB,CAAXqB,CAAwBxQ,CAAxBwQ,CAAuCA,CACpDA,IAAAC,mBAAAD,CAAwBpB,CAAxBoB,CAAkCrB,CAAlCqB,CACAA,KAAAE,sBAAAF,CAA2BpB,CAA3BoB,CAAqCrB,CAArCqB,CAAkDxQ,CAAlDwQ,CAFoDA,CAUtDG;CAAAD,sBAAAA,CAAAA,QAAqBA,CAACtB,CAADsB,CAAWvB,CAAXuB,CAAwB1Q,CAAxB0Q,CAAuCA,CAC1DA,GAAIE,CAAAxB,CAAAwB,UAAJF,CAAAA,CAIKxV,CAALwV,EIpDG3E,CAAA,CJqDsBoD,CIrDtB,CJoDHuB,GInDA3E,CAAA,CJoDyBoD,CIpDzB,CJmDAuB,CInD8BzS,EAAA,CJoDLkR,CIpDK,CJmD9BuB,CAGAtB,EAAAwB,UAAAF,CAAqBA,CAAAA,CACrBtB,EAAA1G,KAAAgI,CAAgBvB,CAChBC,EAAAjP,QAAAuQ,CAAmB1Q,CMvER8O,ENwEX4B,CAAYvB,CAAZuB,CAAAA,CAA2BtB,CAC3BsB,KAAI/U,EAAqB+U,CAAVA,CAAsBtB,CAAtBsB,CAAfA,CACMG,EAAyBH,EAAVA,CAA4B/U,CAA5B+U,CACjBxL,EAAAA,CAAOwL,CACTzQ,GAAIkP,CADKuB,CAETvQ,QAASH,CAFA0Q,CFqLPI,KAAAA,EAAiB,EAEvB,KADA,IAAMC,EElL6B3B,CArCAtO,QFuNwBkQ,iBAAA,CAAyB,OAAzB,CAA3D,CACSlZ,EAAI,CAAb,CAAgBA,CAAhB,CAAoBiZ,CAAAnZ,OAApB,CAAmCE,CAAA,EAAnC,CAAwC,CACtC,IAAM+E,EAAQkU,CAAA,CAAOjZ,CAAP,CACd,IAAoB+E,CD9OfoU,aAAA,CAvBuBC,gBAuBvB,CC8OL,CACE,IAAI,CAAChW,CAAL,CAAmB,CD7PvB,IAAM5D,EC8PqBuF,CD9PdC,YACRP,GAAA4U,IAAA,CAAiB7Z,CAAjB,CAAL,GACEiF,EAAA6F,IAAA,CAAiB9K,CAAjB,CAEA,CADM8Z,CACN,CC0PyBvU,CD3PRwU,UAAA,CAAgB,CAAA,CAAhB,CACjB,CAAAzT,QAAAS,KAAAiT,YAAA,CAA0BF,CAA1B,CAHF,CC8PMvU,EAAAoE,WAAAC,YAAA,CAA6BrE,CAA7B,CAFiB,CAAnB,CADF,IAMEiU,EAAA3Y,KAAA,CAAoB0E,CAAAC,YAApB,CACA,CAAAD,CAAAoE,WAAAC,YAAA,CAA6BrE,CAA7B,CAToC,CAYxC,CAAA,CAAOiU,CAAAnN,KAAA,CAAoB,EAApB,CAAAnL,KAAA,EE7LL+Y,EAAAb,CAAAA,IAAAA,CACAA,IAAIA,CAACG,CAALH,CAAmBA,CACDA,GAAAA,CAAAA;AAAAA,CAAAA,CAAAA,CQ9CdS,CAGN,CAHYjV,CAAA4I,KAAA,CR8CqB4L,CQ9CrB,CAGZ,EAHyCzU,CAAA6I,KAAA,CR8CR4L,CQ9CQ,CAGzC,CADAxU,CAAAuN,UACA,CADwB,CACxB,CAAAxN,CAAAwN,UAAA,CAAuB,CR4Cf3C,EAAAA,CAAMzP,CAAAqZ,CAAM1W,CAAN0W,CAENc,EAAJd,EAAiB3U,CAAjB2U,EAAuCA,IAAAT,EAAvCS,EACEA,IAAAT,EAAAS,eAAAA,CAAkC5J,CAAlC4J,CAAuCvB,CAAvCuB,CAEFtB,EAAAsB,UAAAA,CAAwB5J,CAPP4J,CASfe,CAAAA,CAAmBf,EAClB3U,EAAL2U,GACEe,CADFf,CACqBxI,EAAAwI,CAA+BtB,CAAAsB,UAA/BA,CADrBA,CAGAA,IAAIA,CAACe,CAAA7Z,OAAL8Y,EAAgC3U,CAAhC2U,CACaA,CAGXA,CAHWxV,CAAAwV,CAAetB,CAAAtO,QAAf4P,CAAkCA,IAG7CA,CI5FGA,CJ4FHA,CI5FG3E,CAAA2E,CJ0FmCvB,CI1FnCuB,CJ4FHA,EI5FkCA,IJ4FlCA,CA0BF1W,CA1BE0W,CA0BQ9N,CAAA8O,CA3B8BxM,CA2B9BwM,CA3BoCtC,CAAAsB,UA2BpCgB,CAA4CA,IAA5CA,CA3B8E/V,CA2B9E+V,CA3BwFb,CAAAH,CAAe1W,CAAf0W,CAAyBA,EA2BjHgB,CA1BRhB,CA2BFgB,CA3BEhB,CA2BE1W,CAAApC,OAAJ8Z,CACmBA,CAAVA,CAAmB1X,CAAnB0X,CA7B+BxM,CA6BHjF,GAA5ByR,CAAqCC,CAArCD,CAAiD3K,CAAjD2K,CADTA,CAGOA,IA9BLhB,CAAAtB,CAAAwC,OAAAlB,CAAkB7T,CAEpBuS,EAAAyC,EAAAnB,CAA6Be,CAvC7Bf,CAD0DA,CA+C5DoB,EAAArB,mBAAAA,CAAAA,QAAkBA,CAACrB,CAADqB,CAAWtB,CAAXsB,CAAwBA,CACxCA,IAAM9U,EAAqB8U,CAAVA,CAAsBrB,CAAtBqB,CACZvV,EAALuV,EAAkCA,OAAlCA,GAAqB9U,CAArB8U,EAA8CrB,CAAA2C,aAA9CtB,GACErB,CAAA2C,aACAtB,CADwBA,CAAAA,CACxBA,CAAApP,EAAAoP,CAA6BrB,CAAAtO,QAA7B2P,CAA+CtB,CAA/CsB,CAFFA,CAFwCA,CAuB1CuB;QAAAA,GAAYA,CAAC3L,CAAD2L,CAAOA,CACXA,IAAAA,EAAgCA,CAAVA,CAAuB3L,CAAvB2L,CAAtBA,CAAC/R,EAAA+R,CAAAA,GAAIhS,EAAAA,CAAAgS,CAAAA,EACXA,KAAMjL,EI9HDgF,CAAA,CJ8HmC9L,CI9HnC,CJ8HC8G,EI9H8B,IJ8HpCiL,CACM5C,EMtIKN,CNsIMkD,CAAY/R,CAAZ+R,CACjBA,IAAK5C,CAAL4C,CAAAA,CAGMlL,CAAAA,CAAMsI,CAAA4C,UACZA,KAAMhL,EAAwBoI,CAAAyC,EACxBlW,EAAAA,CAAqBqW,CAAVA,CAAsB5C,CAAtB4C,CACXzK,EAAAA,CAAYyK,IAAInL,CAAJmL,CAChBlL,CADgBkL,CAEhBjL,CAFgBiL,CAGhBhL,CAHgBgL,CAKhBhS,CALgBgS,CAMhBrW,CANgBqW,CAQlBlC,GAAAkC,CAAc3L,CAAd2L,CAAoBzK,CAApByK,CACAA,OAAOzK,EAfPyK,CAJiBA,CA6BnBC,QAAAA,GAA2BA,CAA3BA,CAA2BA,CAAGA,CACxBjC,CAAAiC,CAAAjC,EAAJiC,EAEW9W,MAAAS,SAFXqW,EAE8B9W,MAAAS,SAAAsW,qBAF9BD,GAGEA,CAAAjC,EAGAiC,CAH2E9W,MAAAS,SAAAsW,qBAG3ED,CADAA,CAAAjC,EAAAiC,kBACAA,CADkDA,QAAAA,CAACpV,CAADoV,CAAWA,CANnCA,CAMoCE,EAAAF,CAAqCpV,CAArCoV,CAADA,CAC7DA,CAAAA,CAAAjC,EAAAiC,iBAAAA,CAAiDA,QAAAA,EAAMA,CACrD1D,qBAAA0D,CAAsBA,QAAAA,EAAMA,CAC1BA,CATsBA,CASlBjC,EAAAiC,SAAJA,EATsBA,CASwBlC,EAA9CkC,GATsBA,CAUpBG,kBAAAH,EAFwBA,CAA5BA,CADqDA,CANzDA,CAD4BA;AAgB9BV,QAAAA,EAAOA,CAAPA,CAAOA,CAAGA,CAvBJtB,CAwBJsB,CAxBItB,EAAJoC,EAEWlX,MAAAS,SAFXyW,EAE8BlX,MAAAS,SAAA0W,UAF9BD,GAwBAd,CArBEtB,EACAoC,CAD0ClX,MAAAS,SAAA0W,UAC1CD,CAoBFd,CApBEtB,EAAAoC,gBAAAA,CAAoDA,EAJtDA,CAyBAJ,GAAAV,CAAAA,CAAAA,CAFQA;AAOVgB,CAAAH,kBAAAA,CAAAA,QAAiBA,EAAGA,CAClBb,CAAAa,CAAAA,IAAAA,CACAA,IAAKA,IAAApC,EAALoC,CAAAA,CAGAA,IAAII,EAAeJ,IAAApC,EAAAoC,cAAAA,EAEnBA,IAAKA,IAAApC,EAAAoC,SAALA,EAIIA,CAAUA,EAAVA,CAA4BA,IAAAvC,EAAAlU,SAA5ByW,CAJJA,CAIAA,CAGAA,GAAKrW,CAALqW,CAOOA,IAAKzW,CAAAyW,IAAAvC,EAAAlU,SAALyW,CA6LPK,IAAKA,IAAI3a,EAAI2a,CAAbA,CAAgB3a,CAAhB2a,CA5LuCD,CA4LnB5a,OAApB6a,CAAyC3a,CAAA2a,EAAzCA,CAA8CA,CAE5CA,IAAI5Z,EA9LJuZ,IA8LQpC,EAAAyC,uBAAAA,CA9L6BD,CA6L7BC,CAAa3a,CAAb2a,CACAA,CACRA,IAAI5Z,CAAJ4Z,EAyCE1W,CAzCF0W,EA/LAL,IAwOwBnC,EAzCxBwC,CAyCyCC,CACzCA,IAAI5L,EAAgB4L,CAAVA,CAAwB7V,CAAxB6V,CACVnB,EAAAmB,CA1OAN,IA0OAM,CA1OAN,KA2OAnC,EAAAyC,eAAAA,CAAkC5L,CAAlC4L,CACA7V,EAAAC,YAAA4V,CAA8BA,CAAVA,CAAoB5L,CAApB4L,CAJqBA,CA5CGD,CA7LvCL,CAPPA,IAAyBA,CACvBO,EAAAP,CAAAA,IAAAA,CAAuBA,IAAAxC,EAAvBwC,CAA4CA,IAAAvC,EAA5CuC,CA4MFQ,KAAS9a,CAAT8a,CAAaA,CAAbA,CAAgB9a,CAAhB8a,CA3M0BJ,CA2MN5a,OAApBgb,CAAyC9a,CAAA8a,EAAzCA,CAGEA,CADI/Z,CACJ+Z,CA9MAR,IA6MQpC,EAAA4C,uBAAAA,CA7MgBJ,CA4MhBI,CAAa9a,CAAb8a,CACAA,CACRA,GACE/G,EAAA+G,CAAiC/Z,CAAjC+Z,CA/MFR,IA+MsCvC,EAAAzI,EAApCwL,CA9MER,KAAArC,EAAJqC,EAEEA,IAAAS,cAAAT,EALqBA,CAUzBA,IAAApC,EAAAoC,SAAAA,CAAyCA,CAAAA,CAbzCA,CATAA,CAFkBA,CAgCpBU;CAAArG,aAAAA,CAAAA,QAAYA,CAACpG,CAADoG,CAAOsG,CAAPtG,CAAsBA,CAChCA,IAAMlF,EAAYsD,CAAA4B,CAAcpG,CAAdoG,CAAZlF,EAAmCyK,EAAAvF,CAAkBpG,CAAlBoG,CAEzCA,IAAKlF,CAALkF,CAYAA,GARuBpG,CAQlBtK,GARA0Q,IA6EYmD,EArEZ7T,GAPH0Q,IAAAsD,EAOGhU,CAPyB0Q,CAAAA,CAOzB1Q,EALDgX,CAKChX,GAJHwL,CAAAN,EAEAwF,CADElF,CAAAN,EACFwF,EADuCA,EACvCA,CAAAvD,MAAAC,OAAAsD,CAAclF,CAAAN,EAAdwF,CAAiDsG,CAAjDtG,CAEG1Q,EAAAA,CAAL0Q,CAAAA,CAsBQxM,CAAAA,CAAiB+S,CAAVA,CAnBoB3M,CAmBpB2M,CAAPA,GACRA,IApByCzL,CAoBrCN,EAAJ+L,CAAAA,CAC+B/L,IAAAA,EArBUM,CAqBVN,EAAAA,CQ1PxBhP,CAAT,KAASA,CAAT,GAAc6Q,EAAd,CAEY,IAAV,GAAI7Q,CAAJ,CRmOmCoO,CQlOjCxJ,MAAAoW,eAAA,CAA6Bhb,CAA7B,CADF,CRmOmCoO,CQhOjCxJ,MAAAqW,YAAA,CAA0Bjb,CAA1B,CAA6B6Q,CAAA,CAAW7Q,CAAX,CAA7B,CRoPF+a,CAKAA,GAAIA,EAFE5D,EAAAA,CAAAA,CMhQKN,CNgQMkE,CAAY/S,CAAZ+S,CAAX5D,CAEF4D,EAzB+B3M,CAyB/B2M,GAzBFvG,IAkEemD,EAzCboD,EAIA5D,CAJA4D,EF2F0B,EE3F1BA,GF2FCvS,CAAA,CEvFwC2O,CFuFxC,CE3FD4D,CAAJA,EAOI5D,CAPJ4D,EAOgB5D,CAAAwC,OAPhBoB,EAOmCA,CAAgBA,EAAfA,CAA+B5D,CAA/B4D,CAPpCA,CAO8EA,CAE5EA,GOrLI3D,EAAA,CPqLqCD,COrLrC,CPqLJ4D,EAAyC5D,COrLR,4BPqLjC4D,GAAyC5D,COrLyB,sBPqLlE4D,CACEzB,CAAAyB,CAnCFvG,IAmCEuG,CAGAA,CAtCFvG,IAoCEwD,EAEA+C,EAtCFvG,IAoCqBwD,EAAA+C,eAAAA,CAAkC5D,CAAA4D,UAAlCA,CAAyD/S,CAAzD+S,CAEnBA,CADA5D,CAAAwC,OAAA9U,YACAkW,CAD8BpQ,CAAAoQ,CArCC3M,CAqCD2M,CArCOzL,CAqC8B1E,EAArCmQ,CAC9BA,CAAeA,EAAfA,CAAuC5D,CAAvC4D,CAGE9X,EAAJ8X,GACMrb,CADNqb,CAzCiC3M,CA0CpB8M,WADbH,IAGQnW,CAHRmW,CAGgBrb,CAAAyb,cAAAJ,CAAmBA,OAAnBA,CAHhBA,IAKMnW,CAAAC,YALNkW;AAK0BpQ,CAAAoQ,CA9CO3M,CA8CP2M,CA9CazL,CA8CwB1E,EAArCmQ,CAL1BA,CAzCuCzL,EAkDvC1E,EAAAmQ,CAAuB5D,CAAA4D,UAlBqDA,CAnC9EvG,CAAAA,IAaA4G,IAZE5G,IAUFI,MAAAwG,EAEIA,CADJV,EAAAU,CAXE5G,IAWF4G,CAXiChN,CAWjCgN,CAXuC9L,CAWvC8L,CACIA,CAZmC9L,CAYnCP,EAAAqM,EAZmC9L,CAYAP,EAAApP,OAAvCyb,CAAAA,CA2DIpT,CAAAA,CAAeqT,CAAVA,CAvEwBjN,CAuExBiN,CAAArT,GKxRkCsT,EAAAA,CAAAA,CAE3CA,GADI7G,CACJ6G,CLuRiB9D,EKxRNnD,MAAAiH,CLwRuBtT,CKxRvBsT,CACXA,CAIAA,IAAS5O,CAAT4O,CAAe7G,CAAA9U,OAAf2b,CAA6BA,CAA7BA,CAAuCA,CAAvCA,EAAgC5O,CAAhC4O,CAA0C5O,CAAA4O,EAA1CA,CAAiDA,CAC/CA,IAAIC,EAAQ9G,CAAA6G,CAAK5O,CAAL4O,CA1BoCE,EAAAA,CAAAA,CL4SezM,IAAAA,EAxE1BO,CAwE0BP,EK3SjEyM,KAAKA,IAAI9O,EAAM8O,CAAfA,CAAkB9O,CAAlB8O,CAAwBhC,CAAA7Z,OAAxB6b,CAAiD9O,CAAA8O,EAAjDA,CAAwDA,CACtDA,IAAIC,EAAKjC,CAAAgC,CAAiB9O,CAAjB8O,CACTA,IAwBmBD,CAxBf1K,EAAA2K,CAAsBC,CAAtBD,CAAJA,GLiOqClM,CAwEDH,EKzSFqM,CAAWC,CAAXD,CAAlCA,CAAkDA,CAChDA,CAAAA,CAAOA,CAAAA,CAAPA,OAAAA,CADgDA,CAFIA,CAMxDA,CAAAA,CAAOA,CAAAA,CAP2CA,CA2BhDF,GAAIA,CAAJA,CAAyDA,CACvDA,CAAAA,CAAOC,CAAPD,OAAAA,CADuDA,CAFVA,CANNA,CAAAA,CAAAA,IAAAA,EAAAA,CL2RvCI,CAAAA,CAAcC,CAAAN,CAAaM,CAAAnH,aAAb6G,CAAuCA,IACrDO,EAAAA,CA3EmCtM,CA2EhBJ,EAEGmM,EAJAA,CAIAA,CAJAA,CAIAA,EAJAA,CAAAA,EAIAA,IApRtBQ,CACJC,CAsMEtH,IAvMOkD,EAAAoE,CAoRwCT,CApRxCS,CACTA,EAsMEtH,IAvMmCkD,EAAAoE,CAoRYT,CApRZS,CACrCA,EADiEA,CACjEA,EADsEA,CACtEA,CAAAA,CAAAA,CAmRiDT,CAnRjDS,CAAcA,GAAdA,CAAkBD,CAmRQR,CA7Ea/L,EA6EvCJ,EAAAmM,CAA0BA,CACqDnM,EAAAA,CA9ExCI,CA8EwCJ,EE4LjF6M,EAAAA,CF5Lc/L,CE8LRjO,EAAAA,CAAU6C,CAAAmX,CAAQnX,CAAAC,YAARkX,EAA6BA,EAA7BA,CACZvJ,EAAAuJ,CAAAA,CAAAA,CF7Q+B3N,CE6Q/B2N,CF7QqCzM,CA8EaH,EE+LlD4M,CAA0C3T,CAA1C2T,CAEEzM,EAAAA,CAAYsD,CAAAmJ,CF/QiB3N,CE+QjB2N,CAChBA,KAAInb,EAAI0O,CAAAL,EACJrO,EAAJmb,EAASA,CAAC9Y,CAAV8Y,EAA2Bnb,CAA3Bmb,GAAiCnX,CAAjCmX,GACEnb,CAAAmb,UAAAA,EACAA,CAAsBA,CAAtBA,EAAInb,CAAAmb,UAAJA,EAA2Bnb,CAAAoI,WAA3B+S,EACEnb,CAAAoI,WAAAC,YAAA8S,CAAyBnb,CAAzBmb,CAHJA,CAQI9Y;CAAJ8Y,CAEMzM,CAAAL,EAAJ8M,EACEzM,CAAAL,EAAApK,YACAkX,CADoCha,CACpCga,CAAAnX,CAAAmX,CAAQzM,CAAAL,EAFV8M,EAIWha,CAJXga,GAOEnX,CAPFmX,CAOoBA,CAAVA,CAAmBha,CAAnBga,CAA4B3T,CAA5B2T,CFlSqB3N,CEkSiB8M,WAAtCa,CACNzM,CAAAR,EADMiN,CAPVA,CAFFA,CAcOnX,CAALmX,CAQYnX,CAAAoE,WARZ+S,GASMhM,EAKJgM,EAL0CA,EAK1CA,CALaha,CAAAlB,QAAAkb,CAAgBA,QAAhBA,CAKbA,GAFEnX,CAAAC,YAEFkX,CAFsBha,CAEtBga,EAAUA,EAAVA,CAAqBnX,CAArBmX,CAA4BA,IAA5BA,CAAkCzM,CAAAR,EAAlCiN,CAdFA,EAGMha,CAHNga,GAIInX,CAJJmX,CAIsBA,CAAVA,CAAmBha,CAAnBga,CAA4B3T,CAA5B2T,CAAsCA,IAAtCA,CACNzM,CAAAR,EADMiN,CAJZA,CAkBEnX,EAAJmX,GACEnX,CAAAmX,UAKAA,CALqBnX,CAAAmX,UAKrBA,EAL2CA,CAK3CA,CAHIzM,CAAAL,EAGJ8M,EAH6BnX,CAG7BmX,EAFEnX,CAAAmX,UAAAA,EAEFA,CAAAzM,CAAAL,EAAA8M,CAAwBnX,CAN1BmX,CAQAA,EAAAA,CAAOnX,CFlPF3B,EAALoY,GACkDnM,CE8KlD8M,CF9PuC1M,CAgFWJ,EE8KlD8M,CANIC,CAMJD,CAPI5R,CAOJ4R,CF9PiC5N,CEuPzBnG,aAAA+T,CAAqBA,OAArBA,CAORA,EAPyCA,EAOzCA,CF9K2EJ,CE8K3EI,GAJEC,CAIFD,CAJM5R,CAAA9K,QAAA0c,CACFA,IAAIrJ,MAAJqJ,CAAWA,iBAAXA,CF3KuEJ,CE2KvEI,CAAiDA,MAAjDA,CAAyDA,GAAzDA,CADEA,CAC6DA,GAD7DA,CAINA,EADAC,CACAD,GADMC,CAAAD,CAAIA,GAAJA,CAAUA,EAChBA,EADoCA,UACpCA,CAD0C5T,CAC1C4T,CAAI5R,CAAJ4R,GAAUC,CAAVD,EACYA,CAAVA,CF/P+B5N,CE+P/B4N,CAAsCC,CAAtCD,CFhLFX,CAGKM,EAALN,EACE7D,EAAAlD,MAAA+G,CAAiBrT,CAAjBqT,CAnFqC/L,CAmFhBH,EAArBkM,CAAgDzW,CAAhDyW,CAnFqC/L,CAmFkBJ,EAAvDmM,CAvEFD,CA5BgC5G,CAuElC0H,SAAAA,GAAkBA,CAAlBA,CAAkBA,CAAC9b,CAAD8b,CAAOA,CAGvBA,MAAAA,CADI9N,CACJ8N,CAFqBA,CAAVA,CAAe9b,CAAf8b,CAAAjH,YAAAiH,EACA9N,KACX8N,EACMtJ,CAAAsJ,CAAc9N,CAAd8N,CAAJA,EAA2BnC,EAAAmC,CAAkB9N,CAAlB8N,CAA3BA,CACS9N,CADT8N,CAGSA,EAAAA,CAAAA,CAAAA,CAAwB9N,CAAxB8N,CAJXA,CAOOA,CAAAvE,EAVgBuE;AAgCzBxB,QAAAA,GAAiBA,CAAjBA,CAAiBA,CAACtM,CAADsM,CAAOpL,CAAPoL,CAAkBA,CACjCA,IAAIyB,EAAQD,EAAAxB,CAAAA,CAAAA,CAAwBtM,CAAxBsM,CAAZA,CACI0B,EAAiBxJ,CAAA8H,CAAcyB,CAAdzB,CADrBA,CAEI2B,EAAkBD,CAAAjN,EAIlBgN,EAAJzB,GAAcA,CAAA/C,EAAd+C,EAAsC2B,CAAtC3B,GACEA,EAAAA,CAAAA,CAAAA,CAAuByB,CAAvBzB,CAA8B0B,CAA9B1B,CACAA,CAAA2B,CAAA3B,CAAkB0B,CAAAjN,EAFpBuL,CAIIxK,EAAAA,CAAQe,MAAAqL,OAAA5B,CAAc2B,CAAd3B,EAAiCA,IAAjCA,CACR6B,EAAAA,CAAmBnK,EAAAsI,CAA8CtM,CAA9CsM,CAAoDpL,CAAA1E,EAApD8P,CAA0EpL,CAAA5L,SAA1EgX,CAEnB8B,EAAAA,CADe7K,EAAA+I,CAAuC0B,CAAAxR,EAAvC8P,CAAkEtM,CAAlEsM,CACU7J,EAC7BI,OAAAC,OAAAwJ,CACExK,CADFwK,CAEE6B,CAAAlK,EAFFqI,CAGE8B,CAHF9B,CAIE6B,CAAAjK,EAJFoI,CAMiC1L,EAAAA,CAAAM,CAAAN,EAKjCyN,KAAKA,IAAIzc,CAATyc,GAAcC,EAAdD,CAIEA,IAHIR,CAGJQ,CAHQC,CAAAD,CAAUzc,CAAVyc,CAGRA,GAAeA,CAAfA,GAASR,CAATQ,CATwBvM,CAUtBuM,CAAMzc,CAANyc,CAAAA,CAAWR,CEtOjBU,EAAAA,CF6NE3M,CE1NIY,EAAAA,CAAQK,MAAA2L,oBAAAD,CF0NUzM,CE1NVyM,CACZA,KAAS9c,CAAT8c,CAAWA,CAAXA,CAAiB9c,CAAjB8c,CAAqB/L,CAAAjR,OAArBgd,CAAmC9c,CAAA8c,EAAnCA,CACE/c,CACA+c,CADI/L,CAAA+L,CAAM9c,CAAN8c,CACJA,CFuNoBzM,CEvNpByM,CAAM/c,CAAN+c,CAAAA,CAAWvL,CAAAuL,CAAAA,CAAAA,CFuNSzM,CEvNayM,CAAM/c,CAAN+c,CAAtBA,CFuNSzM,CEvNTyM,CFwNbrN,EAAAH,EAAAuL,CAA4BxK,CAvBKwK,CAwCnCmC,CAAAjC,cAAAA,CAAAA,QAAaA,CAAC/J,CAAD+J,CAAaA,CACxBA,IAAAkC,aAAAlC,CAAkBA,IAAAjD,EAAlBiD,CAAuC/J,CAAvC+J,CADwBA,CAS1BmC;CAAAD,aAAAA,CAAAA,QAAYA,CAAC1O,CAAD0O,CAAOjM,CAAPiM,CAAmBA,CAC7BA,IAAIpd,EAAO0O,CAAA8M,WACX4B,EAAIpd,CAAJod,EAA8B1O,CAA9B0O,GAAYA,IAtEKnF,EAsEjBmF,GACEA,IAAAtI,aAAAsI,CAAkB1O,CAAlB0O,CAAwBjM,CAAxBiM,CAKFA,IAFIE,CAEJF,CADIpd,CACJod,GADyCpd,CAADoK,SACxCgT,EAD2Dpd,CAAAkK,WAC3DkT,EACEA,IAASjd,CAATid,CAAaA,CAAbA,CAAgBjd,CAAhBid,CAAoBE,CAAArd,OAApBmd,CAA2Cjd,CAAAid,EAA3CA,CAEEA,IAAAA,aAAAA,CADoCE,CAAAF,CAAejd,CAAfid,CACpCA,CAHJA,KAQEA,IADIhT,CACJgT,CADe1O,CAAAtE,SACfgT,EADgC1O,CAAAxE,WAChCkT,CACEA,IAASjd,CAATid,CAAaA,CAAbA,CAAgBjd,CAAhBid,CAAoBhT,CAAAnK,OAApBmd,CAAqCjd,CAAAid,EAArCA,CAEEA,IAAAA,aAAAA,CADoChT,CAAAgT,CAASjd,CAATid,CACpCA,CAnBuBA,CA2C/BG;CAAA/C,EAAAA,CAAAA,QAA+BA,CAACtV,CAADsV,CAAQA,CAAAA,IAAAA,EAAAA,IAAAA,CAC/BxW,EAAqBwW,CAAVA,CAAsBtV,CAAtBsV,CACbxW,EAAJwW,GAAiBA,IAAAtC,EAAAlU,SAAjBwW,GACEA,IAAAtC,EAAAlU,SADFwW,CAC0CxW,CAD1CwW,CAGAA,IAAIA,CAAUA,EAAVA,CAA4BxW,CAA5BwW,CAAJA,CAAAA,CAGAA,IAAIrL,EAAgBqL,CAAVA,CAAwBtV,CAAxBsV,CACAA,EAAVA,CAAsBrL,CAAtBqL,CAA2BA,QAAAA,CAACnV,CAADmV,CAAUA,CACnCA,GAAIjX,CAAJiX,CACE5L,EAAA4L,CAAuCnV,CAAvCmV,CADFA,KAAAA,CDJJgD,IAAAA,ECOM/T,CAA8BpE,EDLlCmY,SAAAA,CCKkCnY,CDLfmY,eACnB5O,GAAA4O,CCIkCnY,CDJlCmY,CCIkCnY,EDrNlCqG,SAAAA,CCqNkCrG,CDrNfsG,EAAnBD,CACEE,EAAAF,CAiNF8R,CAjNE9R,CCoNgCrG,CDpNhCqG,CAiNwB8R,CAAA1O,EAjNxBpD,CAiNF8R,IAAAA,EAjNE9R,CAiNF8R,IAAAA,EAjNE9R,CCiNA8O,CAKIpW,CAAJoW,EAAuCA,EAAvCA,GAA0BxW,CAA1BwW,GACEZ,CAAAY,CAAAA,CAAAA,CACAA,CAAAA,CAAAlC,EAAAkC,EAAmBA,CAAAlC,EAAAkC,cAAAA,CAAiCnV,CAAjCmV,CAFrBA,CANmCA,CAArCA,CAWIpW,EAAJoW,CACEtV,CAAAC,YADFqV,CACgCA,CAAVA,CAAoBrL,CAApBqL,CADtBA,CAGEA,IAAAtC,EAAAhN,EAAAsP,MAAAha,KAAAga,CAAsDrL,CAAtDqL,CAlBFA,CALqCA,CAkCvCiD,EAAAC,sBAAAA,CAAAA,QAAqBA,CAAC1V,CAAD0V,CAAU/L,CAAV+L,CAAoBA,CACvCA,IAAI7V,CACCzD,EAALsZ,GAGE7V,CAHF6V,CAGUjO,CADQyD,CAAAwK,CAAc1V,CAAd0V,CACRjO,EADkCyD,CAAAwK,CAAclB,EAAAkB,CAAAA,IAAAA,CAAwB1V,CAAxB0V,CAAdA,CAClCjO,GAAAiO,CAA0B/L,CAA1B+L,CAHVA,CASAA,OAAOA,CAHP7V,CAGO6V,CAHC7V,CAGD6V,EAHUla,MAAAma,iBAAAD,CAAwB1V,CAAxB0V,CAAAE,iBAAAF,CAAkD/L,CAAlD+L,CAGVA,EAAQ7V,CAAAhH,KAAA6c,EAARA,CAAuBA,EAXSA,CAgBzCG;CAAAC,EAAAA,CAAAA,QAAeA,CAAC9V,CAAD8V,CAAUC,CAAVD,CAAuBA,CACpCA,IAAI9d,EAAiB8d,CAAVA,CAAe9V,CAAf8V,CAAAvI,YAAAuI,EACPE,EAAAA,CAAUD,CAAAD,CAAcC,CAAArc,MAAAoc,CAAkBA,IAAlBA,CAAdA,CAAwCA,EAClDG,EAAAA,CAAYje,CAAA0O,KAAZuP,EAAyBje,CAAA0O,KAAAtG,UAI7B0V,IAAIA,CAACG,CAALH,CAAgBA,CACdA,IAAII,EAAYlW,CAAAO,aAAAuV,CAAqBA,OAArBA,CAChBA,IAAII,CAAJJ,CAAeA,CACTK,CAAAA,CAAKD,CAAAxc,MAAAoc,CAAgBA,IAAhBA,CACTA,KAAKA,IAAI3d,EAAE2d,CAAXA,CAAc3d,CAAd2d,CAAkBK,CAAAle,OAAlB6d,CAA6B3d,CAAA2d,EAA7BA,CACEA,GAAIK,CAAAL,CAAG3d,CAAH2d,CAAJA,GAAcrU,CAAAe,EAAdsT,CAA2CA,CACzCG,CAAAH,CAAYK,CAAAL,CAAG3d,CAAH2d,CAAKA,CAALA,CACZA,MAFyCA,CAHhCA,CAFDA,CAYZG,CAAJH,EACEE,CAAAxd,KAAAsd,CAAarU,CAAAe,EAAbsT,CAA0CG,CAA1CH,CAEG1Z,EAAL0Z,GACMlO,CADNkO,CACkB5K,CAAA4K,CAAc9V,CAAd8V,CADlBA,GAEmBlO,CAAAJ,EAFnBsO,EAGIE,CAAAxd,KAAAsd,CAAaxN,CAAA6D,EAAb2J,CAA0ClO,CAAAJ,EAA1CsO,CAGMA,EAAVA,CAA6B9V,CAA7B8V,CAAsCE,CAAAhS,KAAA8R,CAAaA,GAAbA,CAAtCA,CA5BoCA,CA8BtCM,EAAAC,EAAAA,CAAAA,QAAiBA,CAAC3d,CAAD2d,CAAOA,CACtBA,MAAOnL,EAAAmL,CAAc3d,CAAd2d,CADeA,CAOxBC,EAAAC,EAAAA,CAAAA,QAASA,CAAC7d,CAAD6d,CAAO9X,CAAP8X,CAAcA,CACrBvW,CAAAuW,CAAyB7d,CAAzB6d,CAA+B9X,CAA/B8X,CADqBA,CAOvBC,EAAAC,EAAAA,CAAAA,QAAWA,CAAC/d,CAAD+d,CAAOhY,CAAPgY,CAAcA,CACvBzW,CAAAyW,CAAyB/d,CAAzB+d,CAA+BhY,CAA/BgY,CAAsCA,CAAAA,CAAtCA,CADuBA,CAOzBC,EAAAC,EAAAA,CAAAA,QAAYA,CAACje,CAADie,CAAOA,CACjBA,MAAOtJ,GAAAsJ,CAAcje,CAAdie,CADUA,CAOnBC,EAAAC,EAAAA,CAAAA,QAAmBA,CAACne,CAADme,CAAOA,CACxBA,MAAOzJ,GAAAyJ,CAAgBne,CAAhBme,CADiBA,CAO5B9G,EAAAjI,UAAA,MAAA,CAAiCiI,CAAAjI,UAAAoF,MACjC6C,EAAAjI,UAAA,gBAAA,CAA2CiI,CAAAjI,UAAA+I,gBAC3Cd;CAAAjI,UAAA,aAAA,CAAwCiI,CAAAjI,UAAAgF,aACxCiD,EAAAjI,UAAA,cAAA,CAAyCiI,CAAAjI,UAAAoL,cACzCnD,EAAAjI,UAAA,aAAA,CAAwCiI,CAAAjI,UAAAsN,aACxCrF,EAAAjI,UAAA,sBAAA,CAAiDiI,CAAAjI,UAAA4N,sBACjD3F,EAAAjI,UAAA,gBAAA,CAA2CiI,CAAAjI,UAAAgO,EAC3C/F,EAAAjI,UAAA,kBAAA,CAA6CiI,CAAAjI,UAAAuO,EAC7CtG,EAAAjI,UAAA,gCAAA,CAA2DiI,CAAAjI,UAAA0K,EAC3DzC,EAAAjI,UAAA,YAAA,CAAuCiI,CAAAjI,UAAA2I,EACvCV,EAAAjI,UAAA,iBAAA,CAA4CiI,CAAAjI,UAAA6I,EAC5CZ,EAAAjI,UAAA,kBAAA,CAA6CiI,CAAAjI,UAAA2K,kBAC7C1C;CAAAjI,UAAA,UAAA,CAAqCiI,CAAAjI,UAAAyO,EACrCxG,EAAAjI,UAAA,YAAA,CAAuCiI,CAAAjI,UAAA2O,EACvC1G,EAAAjI,UAAA,aAAA,CAAwCiI,CAAAjI,UAAA6O,EACxC5G,EAAAjI,UAAA,oBAAA,CAA+CiI,CAAAjI,UAAA+O,EAE/CtN,OAAAuN,iBAAA,CAAwB/G,CAAAjI,UAAxB,CAA+C,CAC7C,aAAgB,CACd,IAAAJ,QAAG,EAAG,CACJ,MAAOnM,EADH,CADQ,CAD6B,CAM7C,UAAa,CACX,IAAAmM,QAAG,EAAG,CACJ,MAAOtL,EADH,CADK,CANgC,CAA/C,C,CS9hBA,IAAM2a,EAAc,IAAIhH,CAAxB,CAEI4C,EAFJ,CAEeJ,EAEX/W,OAAA,SAAJ,GACEmX,EACA,CADYnX,MAAA,SAAA,UACZ,CAAA+W,EAAA,CAAuB/W,MAAA,SAAA,qBAFzB,CAKAA;MAAAS,SAAA,CAAkB,CAChB8T,YAAagH,CADG,CAOhB,gBAAAlG,QAAe,CAACpB,CAAD,CAAWD,CAAX,CAAwBwH,CAAxB,CAAwC,CACrDD,CAAAtE,kBAAA,EACAsE,EAAAlG,gBAAA,CAA4BpB,CAA5B,CAAsCD,CAAtC,CAAmDwH,CAAnD,CAFqD,CAPvC,CAgBhB,mBAAAlG,QAAkB,CAACrB,CAAD,CAAWD,CAAX,CAAwB,CACxCuH,CAAAjG,mBAAA,CAA+BrB,CAA/B,CAAyCD,CAAzC,CADwC,CAhB1B,CAyBhB,sBAAAuB,QAAqB,CAACtB,CAAD,CAAWD,CAAX,CAAwBwH,CAAxB,CAAwC,CAC3DD,CAAAtE,kBAAA,EACAsE,EAAAhG,sBAAA,CAAkCtB,CAAlC,CAA4CD,CAA5C,CAAyDwH,CAAzD,CAF2D,CAzB7C,CAiChB,aAAA5B,QAAY,CAACpV,CAAD,CAAUmJ,CAAV,CAAsB,CAChC4N,CAAAtE,kBAAA,EACAsE,EAAA3B,aAAA,CAAyBpV,CAAzB,CAAkCmJ,CAAlC,CAFgC,CAjClB,CAyChB,aAAA2D,QAAY,CAAC9M,CAAD,CAAU,CACpB+W,CAAAtE,kBAAA,EACAsE,EAAAjK,aAAA,CAAyB9M,CAAzB,CAFoB,CAzCN,CAiDhB,cAAAkT,QAAa,CAAC/J,CAAD,CAAa,CACxB4N,CAAAtE,kBAAA,EACAsE,EAAA7D,cAAA,CAA0B/J,CAA1B,CAFwB,CAjDV,CAsDhB,kBAAAsJ,QAAiB,EAAG,CAClBsE,CAAAtE,kBAAA,EADkB,CAtDJ;AA+DhB,sBAAAiD,QAAqB,CAAC1V,CAAD,CAAU2J,CAAV,CAAoB,CACvC,MAAOoN,EAAArB,sBAAA,CAAkC1V,CAAlC,CAA2C2J,CAA3C,CADgC,CA/DzB,CAmEhBxN,UAAWC,CAnEK,CAqEhBb,aAAcA,CArEE,CAuEhBS,SAAUK,CAvEM,CA0EdsW,GAAJ,GACEnX,MAAAS,SAAA0W,UADF,CAC8BA,EAD9B,CAIIJ,GAAJ,GACE/W,MAAAS,SAAAsW,qBADF,CACyCA,EADzC","file":"scoping-shim.min.js","sourcesContent":["/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n/*\nExtremely simple css parser. Intended to be not more than what we need\nand definitely not necessarily correct =).\n*/\n\n'use strict';\n\n/** @unrestricted */\nclass StyleNode {\n  constructor() {\n    /** @type {number} */\n    this['start'] = 0;\n    /** @type {number} */\n    this['end'] = 0;\n    /** @type {StyleNode} */\n    this['previous'] = null;\n    /** @type {StyleNode} */\n    this['parent'] = null;\n    /** @type {Array<StyleNode>} */\n    this['rules'] = null;\n    /** @type {string} */\n    this['parsedCssText'] = '';\n    /** @type {string} */\n    this['cssText'] = '';\n    /** @type {boolean} */\n    this['atRule'] = false;\n    /** @type {number} */\n    this['type'] = 0;\n    /** @type {string} */\n    this['keyframesName'] = '';\n    /** @type {string} */\n    this['selector'] = '';\n    /** @type {string} */\n    this['parsedSelector'] = '';\n  }\n}\n\nexport {StyleNode}\n\n// given a string of css, return a simple rule tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nexport function parse(text) {\n  text = clean(text);\n  return parseCss(lex(text), text);\n}\n\n// remove stuff we don't care about that may hinder parsing\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction clean(cssText) {\n  return cssText.replace(RX.comments, '').replace(RX.port, '');\n}\n\n// super simple {...} lexer that returns a node tree\n/**\n * @param {string} text\n * @return {StyleNode}\n */\nfunction lex(text) {\n  let root = new StyleNode();\n  root['start'] = 0;\n  root['end'] = text.length\n  let n = root;\n  for (let i = 0, l = text.length; i < l; i++) {\n    if (text[i] === OPEN_BRACE) {\n      if (!n['rules']) {\n        n['rules'] = [];\n      }\n      let p = n;\n      let previous = p['rules'][p['rules'].length - 1] || null;\n      n = new StyleNode();\n      n['start'] = i + 1;\n      n['parent'] = p;\n      n['previous'] = previous;\n      p['rules'].push(n);\n    } else if (text[i] === CLOSE_BRACE) {\n      n['end'] = i + 1;\n      n = n['parent'] || root;\n    }\n  }\n  return root;\n}\n\n// add selectors/cssText to node tree\n/**\n * @param {StyleNode} node\n * @param {string} text\n * @return {StyleNode}\n */\nfunction parseCss(node, text) {\n  let t = text.substring(node['start'], node['end'] - 1);\n  node['parsedCssText'] = node['cssText'] = t.trim();\n  if (node['parent']) {\n    let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];\n    t = text.substring(ss, node['start'] - 1);\n    t = _expandUnicodeEscapes(t);\n    t = t.replace(RX.multipleSpaces, ' ');\n    // TODO(sorvell): ad hoc; make selector include only after last ;\n    // helps with mixin syntax\n    t = t.substring(t.lastIndexOf(';') + 1);\n    let s = node['parsedSelector'] = node['selector'] = t.trim();\n    node['atRule'] = (s.indexOf(AT_START) === 0);\n    // note, support a subset of rule types...\n    if (node['atRule']) {\n      if (s.indexOf(MEDIA_START) === 0) {\n        node['type'] = types.MEDIA_RULE;\n      } else if (s.match(RX.keyframesRule)) {\n        node['type'] = types.KEYFRAMES_RULE;\n        node['keyframesName'] =\n          node['selector'].split(RX.multipleSpaces).pop();\n      }\n    } else {\n      if (s.indexOf(VAR_START) === 0) {\n        node['type'] = types.MIXIN_RULE;\n      } else {\n        node['type'] = types.STYLE_RULE;\n      }\n    }\n  }\n  let r$ = node['rules'];\n  if (r$) {\n    for (let i = 0, l = r$.length, r;\n      (i < l) && (r = r$[i]); i++) {\n      parseCss(r, text);\n    }\n  }\n  return node;\n}\n\n/**\n * conversion of sort unicode escapes with spaces like `\\33 ` (and longer) into\n * expanded form that doesn't require trailing space `\\000033`\n * @param {string} s\n * @return {string}\n */\nfunction _expandUnicodeEscapes(s) {\n  return s.replace(/\\\\([0-9a-f]{1,6})\\s/gi, function() {\n    let code = arguments[1],\n      repeat = 6 - code.length;\n    while (repeat--) {\n      code = '0' + code;\n    }\n    return '\\\\' + code;\n  });\n}\n\n/**\n * stringify parsed css.\n * @param {StyleNode} node\n * @param {boolean=} preserveProperties\n * @param {string=} text\n * @return {string}\n */\nexport function stringify(node, preserveProperties, text = '') {\n  // calc rule cssText\n  let cssText = '';\n  if (node['cssText'] || node['rules']) {\n    let r$ = node['rules'];\n    if (r$ && !_hasMixinRules(r$)) {\n      for (let i = 0, l = r$.length, r;\n        (i < l) && (r = r$[i]); i++) {\n        cssText = stringify(r, preserveProperties, cssText);\n      }\n    } else {\n      cssText = preserveProperties ? node['cssText'] :\n        removeCustomProps(node['cssText']);\n      cssText = cssText.trim();\n      if (cssText) {\n        cssText = '  ' + cssText + '\\n';\n      }\n    }\n  }\n  // emit rule if there is cssText\n  if (cssText) {\n    if (node['selector']) {\n      text += node['selector'] + ' ' + OPEN_BRACE + '\\n';\n    }\n    text += cssText;\n    if (node['selector']) {\n      text += CLOSE_BRACE + '\\n\\n';\n    }\n  }\n  return text;\n}\n\n/**\n * @param {Array<StyleNode>} rules\n * @return {boolean}\n */\nfunction _hasMixinRules(rules) {\n  let r = rules[0];\n  return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomProps(cssText) {\n  cssText = removeCustomPropAssignment(cssText);\n  return removeCustomPropApply(cssText);\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nexport function removeCustomPropAssignment(cssText) {\n  return cssText\n    .replace(RX.customProp, '')\n    .replace(RX.mixinProp, '');\n}\n\n/**\n * @param {string} cssText\n * @return {string}\n */\nfunction removeCustomPropApply(cssText) {\n  return cssText\n    .replace(RX.mixinApply, '')\n    .replace(RX.varApply, '');\n}\n\n/** @enum {number} */\nexport const types = {\n  STYLE_RULE: 1,\n  KEYFRAMES_RULE: 7,\n  MEDIA_RULE: 4,\n  MIXIN_RULE: 1000\n}\n\nconst OPEN_BRACE = '{';\nconst CLOSE_BRACE = '}';\n\n// helper regexp's\nconst RX = {\n  comments: /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n  port: /@import[^;]*;/gim,\n  customProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,\n  mixinProp: /(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,\n  mixinApply: /@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,\n  varApply: /[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,\n  keyframesRule: /^@[^\\s]*keyframes/,\n  multipleSpaces: /\\s+/g\n}\n\nconst VAR_START = '--';\nconst MEDIA_START = '@media';\nconst AT_START = '@';\n",null,"/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nexport const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);\nlet nativeCssVariables_;\n\n/**\n * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings\n */\nfunction calcCssVariables(settings) {\n  if (settings && settings['shimcssproperties']) {\n    nativeCssVariables_ = false;\n  } else {\n    // chrome 49 has semi-working css vars, check if box-shadow works\n    // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782\n    // However, shim css custom properties are only supported with ShadyDOM enabled,\n    // so fall back on native if we do not detect ShadyDOM\n    // Edge 15: custom properties used in ::before and ::after will also be used in the parent element\n    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/\n    nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/) &&\n      window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));\n  }\n}\n\n/** @type {string | undefined} */\nexport let cssBuild;\nif (window.ShadyCSS && window.ShadyCSS.cssBuild !== undefined) {\n  cssBuild = window.ShadyCSS.cssBuild;\n}\n\nif (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {\n  nativeCssVariables_ = window.ShadyCSS.nativeCss;\n} else if (window.ShadyCSS) {\n  calcCssVariables(window.ShadyCSS);\n  // reset window variable to let ShadyCSS API take its place\n  window.ShadyCSS = undefined;\n} else {\n  calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);\n}\n\n// Hack for type error under new type inference which doesn't like that\n// nativeCssVariables is updated in a function and assigns the type\n// `function(): ?` instead of `boolean`.\nexport const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const VAR_ASSIGN = /(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi;\nexport const MIXIN_MATCH = /(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi;\nexport const VAR_CONSUMED = /(--[\\w-]+)\\s*([:,;)]|$)/gi;\nexport const ANIMATION_MATCH = /(animation\\s*:)|(animation-name\\s*:)/;\nexport const MEDIA_MATCH = /@media\\s(.*)/;\nexport const IS_VAR = /^--/;\nexport const BRACKETED = /\\{[^}]*\\}/g;\nexport const HOST_PREFIX = '(?:^|[^.#[:])';\nexport const HOST_SUFFIX = '($|[.:[\\\\s>+~])';\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/** @type {!Set<string>} */\nconst styleTextSet = new Set();\n\nexport const scopingAttribute = 'shady-unscoped';\n\n/**\n * Add a specifically-marked style to the document directly, and only one copy of that style.\n *\n * @param {!HTMLStyleElement} style\n * @return {undefined}\n */\nexport function processUnscopedStyle(style) {\n  const text = style.textContent;\n  if (!styleTextSet.has(text)) {\n    styleTextSet.add(text);\n    const newStyle = style.cloneNode(true);\n    document.head.appendChild(newStyle);\n  }\n}\n\n/**\n * Check if a style is supposed to be unscoped\n * @param {!HTMLStyleElement} style\n * @return {boolean} true if the style has the unscoping attribute\n */\nexport function isUnscopedStyle(style) {\n  return style.hasAttribute(scopingAttribute);\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow, nativeCssVariables, cssBuild} from './style-settings.js';\nimport {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {MEDIA_MATCH} from './common-regex.js';\nimport {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';\n\n/**\n * @param {string|StyleNode} rules\n * @param {function(StyleNode)=} callback\n * @return {string}\n */\nexport function toCssText (rules, callback) {\n  if (!rules) {\n    return '';\n  }\n  if (typeof rules === 'string') {\n    rules = parse(rules);\n  }\n  if (callback) {\n    forEachRule(rules, callback);\n  }\n  return stringify(rules, nativeCssVariables);\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @return {StyleNode}\n */\nexport function rulesForStyle(style) {\n  if (!style['__cssRules'] && style.textContent) {\n    style['__cssRules'] = parse(style.textContent);\n  }\n  return style['__cssRules'] || null;\n}\n\n// Tests if a rule is a keyframes selector, which looks almost exactly\n// like a normal selector but is not (it has nothing to do with scoping\n// for example).\n/**\n * @param {StyleNode} rule\n * @return {boolean}\n */\nexport function isKeyframesSelector(rule) {\n  return Boolean(rule['parent']) &&\n  rule['parent']['type'] === types.KEYFRAMES_RULE;\n}\n\n/**\n * @param {StyleNode} node\n * @param {Function=} styleRuleCallback\n * @param {Function=} keyframesRuleCallback\n * @param {boolean=} onlyActiveRules\n */\nexport function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {\n  if (!node) {\n    return;\n  }\n  let skipRules = false;\n  let type = node['type'];\n  if (onlyActiveRules) {\n    if (type === types.MEDIA_RULE) {\n      let matchMedia = node['selector'].match(MEDIA_MATCH);\n      if (matchMedia) {\n        // if rule is a non matching @media rule, skip subrules\n        if (!window.matchMedia(matchMedia[1]).matches) {\n          skipRules = true;\n        }\n      }\n    }\n  }\n  if (type === types.STYLE_RULE) {\n    styleRuleCallback(node);\n  } else if (keyframesRuleCallback &&\n    type === types.KEYFRAMES_RULE) {\n    keyframesRuleCallback(node);\n  } else if (type === types.MIXIN_RULE) {\n    skipRules = true;\n  }\n  let r$ = node['rules'];\n  if (r$ && !skipRules) {\n    for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {\n      forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);\n    }\n  }\n}\n\n// add a string of cssText to the document.\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @param {Node} target\n * @param {Node} contextNode\n * @return {HTMLStyleElement}\n */\nexport function applyCss(cssText, moniker, target, contextNode) {\n  let style = createScopeStyle(cssText, moniker);\n  applyStyle(style, target, contextNode);\n  return style;\n}\n\n/**\n * @param {string} cssText\n * @param {string} moniker\n * @return {HTMLStyleElement}\n */\nexport function createScopeStyle(cssText, moniker) {\n  let style = /** @type {HTMLStyleElement} */(document.createElement('style'));\n  if (moniker) {\n    style.setAttribute('scope', moniker);\n  }\n  style.textContent = cssText;\n  return style;\n}\n\n/**\n * Track the position of the last added style for placing placeholders\n * @type {Node}\n */\nlet lastHeadApplyNode = null;\n\n// insert a comment node as a styling position placeholder.\n/**\n * @param {string} moniker\n * @return {!Comment}\n */\nexport function applyStylePlaceHolder(moniker) {\n  let placeHolder = document.createComment(' Shady DOM styles for ' +\n    moniker + ' ');\n  let after = lastHeadApplyNode ?\n    lastHeadApplyNode['nextSibling'] : null;\n  let scope = document.head;\n  scope.insertBefore(placeHolder, after || scope.firstChild);\n  lastHeadApplyNode = placeHolder;\n  return placeHolder;\n}\n\n/**\n * @param {HTMLStyleElement} style\n * @param {?Node} target\n * @param {?Node} contextNode\n */\nexport function applyStyle(style, target, contextNode) {\n  target = target || document.head;\n  let after = (contextNode && contextNode.nextSibling) ||\n    target.firstChild;\n  target.insertBefore(style, after);\n  if (!lastHeadApplyNode) {\n    lastHeadApplyNode = style;\n  } else {\n    // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode\n    let position = style.compareDocumentPosition(lastHeadApplyNode);\n    if (position === Node.DOCUMENT_POSITION_PRECEDING) {\n      lastHeadApplyNode = style;\n    }\n  }\n}\n\n/**\n * @param {string} buildType\n * @return {boolean}\n */\nexport function isTargetedBuild(buildType) {\n  return nativeShadow ? buildType === 'shadow' : buildType === 'shady';\n}\n\n/**\n * Walk from text[start] matching parens and\n * returns position of the outer end paren\n * @param {string} text\n * @param {number} start\n * @return {number}\n */\nexport function findMatchingParen(text, start) {\n  let level = 0;\n  for (let i=start, l=text.length; i < l; i++) {\n    if (text[i] === '(') {\n      level++;\n    } else if (text[i] === ')') {\n      if (--level === 0) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\n/**\n * @param {string} str\n * @param {function(string, string, string, string)} callback\n */\nexport function processVariableAndFallback(str, callback) {\n  // find 'var('\n  let start = str.indexOf('var(');\n  if (start === -1) {\n    // no var?, everything is prefix\n    return callback(str, '', '', '');\n  }\n  //${prefix}var(${inner})${suffix}\n  let end = findMatchingParen(str, start + 3);\n  let inner = str.substring(start + 4, end);\n  let prefix = str.substring(0, start);\n  // suffix may have other variables\n  let suffix = processVariableAndFallback(str.substring(end + 1), callback);\n  let comma = inner.indexOf(',');\n  // value and fallback args should be trimmed to match in property lookup\n  if (comma === -1) {\n    // variable, no fallback\n    return callback(prefix, inner.trim(), '', suffix);\n  }\n  // var(${value},${fallback})\n  let value = inner.substring(0, comma).trim();\n  let fallback = inner.substring(comma + 1).trim();\n  return callback(prefix, value, fallback, suffix);\n}\n\n/**\n * @param {Element} element\n * @param {string} value\n */\nexport function setElementClassRaw(element, value) {\n  // use native setAttribute provided by ShadyDOM when setAttribute is patched\n  if (nativeShadow) {\n    element.setAttribute('class', value);\n  } else {\n    window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);\n  }\n}\n\nexport const wrap = window['ShadyDOM'] && window['ShadyDOM']['wrap'] || ((node) => node);\n\n/**\n * @param {Element | {is: string, extends: string}} element\n * @return {{is: string, typeExtension: string}}\n */\nexport function getIsExtends(element) {\n  let localName = element['localName'];\n  let is = '', typeExtension = '';\n  /*\n  NOTE: technically, this can be wrong for certain svg elements\n  with `-` in the name like `<font-face>`\n  */\n  if (localName) {\n    if (localName.indexOf('-') > -1) {\n      is = localName;\n    } else {\n      typeExtension = localName;\n      is = (element.getAttribute && element.getAttribute('is')) || '';\n    }\n  } else {\n    is = /** @type {?} */(element).is;\n    typeExtension = /** @type {?} */(element).extends;\n  }\n  return {is, typeExtension};\n}\n\n/**\n * @param {Element|DocumentFragment} element\n * @return {string}\n */\nexport function gatherStyleText(element) {\n  /** @type {!Array<string>} */\n  const styleTextParts = [];\n  const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));\n  for (let i = 0; i < styles.length; i++) {\n    const style = styles[i];\n    if (isUnscopedStyle(style)) {\n      if (!nativeShadow) {\n        processUnscopedStyle(style);\n        style.parentNode.removeChild(style);\n      }\n    } else {\n      styleTextParts.push(style.textContent);\n      style.parentNode.removeChild(style);\n    }\n  }\n  return styleTextParts.join('').trim();\n}\n\n/**\n * Split a selector separated by commas into an array in a smart way\n * @param {string} selector\n * @return {!Array<string>}\n */\nexport function splitSelectorList(selector) {\n  const parts = [];\n  let part = '';\n  for (let i = 0; i >= 0 && i < selector.length; i++) {\n    // A selector with parentheses will be one complete part\n    if (selector[i] === '(') {\n      // find the matching paren\n      const end = findMatchingParen(selector, i);\n      // push the paren block into the part\n      part += selector.slice(i, end + 1);\n      // move the index to after the paren block\n      i = end;\n    } else if (selector[i] === ',') {\n      parts.push(part);\n      part = '';\n    } else {\n      part += selector[i];\n    }\n  }\n  // catch any pieces after the last comma\n  if (part) {\n    parts.push(part);\n  }\n  return parts;\n}\n\nconst CSS_BUILD_ATTR = 'css-build';\n\n/**\n * Return the polymer-css-build \"build type\" applied to this element\n *\n * @param {!HTMLElement} element\n * @return {string} Can be \"\", \"shady\", or \"shadow\"\n */\nexport function getCssBuild(element) {\n  if (cssBuild !== undefined) {\n    return /** @type {string} */(cssBuild);\n  }\n  if (element.__cssBuild === undefined) {\n    // try attribute first, as it is the common case\n    const attrValue = element.getAttribute(CSS_BUILD_ATTR);\n    if (attrValue) {\n      element.__cssBuild = attrValue;\n    } else {\n      const buildComment = getBuildComment(element);\n      if (buildComment !== '') {\n        // remove build comment so it is not needlessly copied into every element instance\n        removeBuildComment(element);\n      }\n      element.__cssBuild = buildComment;\n    }\n  }\n  return element.__cssBuild || '';\n}\n\n/**\n * Check if the given element, either a <template> or <style>, has been processed\n * by polymer-css-build.\n *\n * If so, then we can make a number of optimizations:\n * - polymer-css-build will decompose mixins into individual CSS Custom Properties,\n * so the ApplyShim can be skipped entirely.\n * - Under native ShadowDOM, the style text can just be copied into each instance\n * without modification\n * - If the build is \"shady\" and ShadyDOM is in use, the styling does not need\n * scoping beyond the shimming of CSS Custom Properties\n *\n * @param {!HTMLElement} element\n * @return {boolean}\n */\nexport function elementHasBuiltCss(element) {\n  return getCssBuild(element) !== '';\n}\n\n/**\n * For templates made with tagged template literals, polymer-css-build will\n * insert a comment of the form `<!--css-build:shadow-->`\n *\n * @param {!HTMLElement} element\n * @return {string}\n */\nexport function getBuildComment(element) {\n  const buildComment = element.localName === 'template' ?\n      /** @type {!HTMLTemplateElement} */ (element).content.firstChild :\n      element.firstChild;\n  if (buildComment instanceof Comment) {\n    const commentParts = buildComment.textContent.trim().split(':');\n    if (commentParts[0] === CSS_BUILD_ATTR) {\n      return commentParts[1];\n    }\n  }\n  return '';\n}\n\n/**\n * Check if the css build status is optimal, and do no unneeded work.\n *\n * @param {string=} cssBuild CSS build status\n * @return {boolean} css build is optimal or not\n */\nexport function isOptimalCssBuild(cssBuild = '') {\n  // CSS custom property shim always requires work\n  if (cssBuild === '' || !nativeCssVariables) {\n    return false;\n  }\n  return nativeShadow ? cssBuild === 'shadow' : cssBuild === 'shady';\n}\n\n/**\n * @param {!HTMLElement} element\n */\nfunction removeBuildComment(element) {\n  const buildComment = element.localName === 'template' ?\n      /** @type {!HTMLTemplateElement} */ (element).content.firstChild :\n      element.firstChild;\n  buildComment.parentNode.removeChild(buildComment);\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport * as StyleUtil from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/* Transforms ShadowDOM styling into ShadyDOM styling\n\n* scoping:\n\n  * elements in scope get scoping selector class=\"x-foo-scope\"\n  * selectors re-written as follows:\n\n    div button -> div.x-foo-scope button.x-foo-scope\n\n* :host -> scopeName\n\n* :host(...) -> scopeName...\n\n* ::slotted(...) -> scopeName > ...\n\n* ...:dir(ltr|rtl) -> [dir=\"ltr|rtl\"] ..., ...[dir=\"ltr|rtl\"]\n\n* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir=\"rtl\"] scopeName, scopeName[dir=\"rtl\"]\n\n*/\nconst SCOPE_NAME = 'style-scope';\n\nclass StyleTransformer {\n  get SCOPE_NAME() {\n    return SCOPE_NAME;\n  }\n  /**\n   * Given a node and scope name, add a scoping class to each node\n   * in the tree. This facilitates transforming css into scoped rules.\n   * @param {!Node} node\n   * @param {string} scope\n   * @param {boolean=} shouldRemoveScope\n   * @deprecated\n   */\n  dom(node, scope, shouldRemoveScope) {\n    const fn = (node) => {\n      this.element(node, scope || '', shouldRemoveScope);\n    };\n    this._transformDom(node, fn);\n  }\n\n  /**\n   * Given a node and scope name, add a scoping class to each node in the tree.\n   * @param {!Node} node\n   * @param {string} scope\n   */\n  domAddScope(node, scope) {\n    const fn = (node) => {\n      this.element(node, scope || '');\n    };\n    this._transformDom(node, fn);\n  }\n\n  /**\n   * @param {!Node} startNode\n   * @param {!function(!Node)} transformer\n   */\n  _transformDom(startNode, transformer) {\n    if (startNode.nodeType === Node.ELEMENT_NODE) {\n      transformer(startNode)\n    }\n    let c$;\n    if (startNode.localName === 'template') {\n      const template = /** @type {!HTMLTemplateElement} */ (startNode);\n      // In case the template is in svg context, fall back to the node\n      // since it won't be an HTMLTemplateElement with a .content property\n      c$ = (template.content || template._content || template).childNodes;\n    } else {\n      c$ = /** @type {!ParentNode} */ (startNode).children ||\n          startNode.childNodes;\n    }\n    if (c$) {\n      for (let i = 0; i < c$.length; i++) {\n        this._transformDom(c$[i], transformer);\n      }\n    }\n  }\n\n  /**\n   * @param {?} element\n   * @param {?} scope\n   * @param {?=} shouldRemoveScope\n   */\n  element(element, scope, shouldRemoveScope) {\n    // note: if using classes, we add both the general 'style-scope' class\n    // as well as the specific scope. This enables easy filtering of all\n    // `style-scope` elements\n    if (scope) {\n      // note: svg on IE does not have classList so fallback to class\n      if (element.classList) {\n        if (shouldRemoveScope) {\n          element.classList.remove(SCOPE_NAME);\n          element.classList.remove(scope);\n        } else {\n          element.classList.add(SCOPE_NAME);\n          element.classList.add(scope);\n        }\n      } else if (element.getAttribute) {\n        let c = element.getAttribute(CLASS);\n        if (shouldRemoveScope) {\n          if (c) {\n            let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');\n            StyleUtil.setElementClassRaw(element, newValue);\n          }\n        } else {\n          let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;\n          StyleUtil.setElementClassRaw(element, newValue);\n        }\n      }\n    }\n  }\n\n  /**\n   * Given a node, replace the scoping class to each subnode in the tree.\n   * @param {!Node} node\n   * @param {string} oldScope\n   * @param {string} newScope\n   */\n  domReplaceScope(node, oldScope, newScope) {\n    const fn = (node) => {\n      this.element(node, oldScope, true);\n      this.element(node, newScope);\n    };\n    this._transformDom(node, fn);\n  }\n  /**\n   * Given a node, remove the scoping class to each subnode in the tree.\n   * @param {!Node} node\n   * @param {string} oldScope\n   */\n  domRemoveScope(node, oldScope) {\n    const fn = (node) => {\n      this.element(node, oldScope || '', true);\n    };\n    this._transformDom(node, fn);\n  }\n\n  /**\n   * @param {?} element\n   * @param {?} styleRules\n   * @param {?=} callback\n   * @param {string=} cssBuild\n   * @param {string=} cssText\n   * @return {string}\n   */\n  elementStyles(element, styleRules, callback, cssBuild = '', cssText = '') {\n    // no need to shim selectors if settings.useNativeShadow, also\n    // a shady css build will already have transformed selectors\n    // NOTE: This method may be called as part of static or property shimming.\n    // When there is a targeted build it will not be called for static shimming,\n    // but when the property shim is used it is called and should opt out of\n    // static shimming work when a proper build exists.\n    if (cssText === '') {\n      if (nativeShadow || cssBuild === 'shady') {\n        cssText = StyleUtil.toCssText(styleRules, callback);\n      } else {\n        let {is, typeExtension} = StyleUtil.getIsExtends(element);\n        cssText = this.css(styleRules, is, typeExtension, callback) + '\\n\\n';\n      }\n    }\n    return cssText.trim();\n  }\n\n  // Given a string of cssText and a scoping string (scope), returns\n  // a string of scoped css where each selector is transformed to include\n  // a class created from the scope. ShadowDOM selectors are also transformed\n  // (e.g. :host) to use the scoping selector.\n  css(rules, scope, ext, callback) {\n    let hostScope = this._calcHostScope(scope, ext);\n    scope = this._calcElementScope(scope);\n    let self = this;\n    return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n      if (!rule.isScoped) {\n        self.rule(rule, scope, hostScope);\n        rule.isScoped = true;\n      }\n      if (callback) {\n        callback(rule, scope, hostScope);\n      }\n    });\n  }\n\n  _calcElementScope(scope) {\n    if (scope) {\n      return CSS_CLASS_PREFIX + scope;\n    } else {\n      return '';\n    }\n  }\n\n  _calcHostScope(scope, ext) {\n    return ext ? `[is=${scope}]` : scope;\n  }\n\n  rule(rule, scope, hostScope) {\n    this._transformRule(rule, this._transformComplexSelector,\n      scope, hostScope);\n  }\n\n  /**\n   * transforms a css rule to a scoped rule.\n   *\n   * @param {StyleNode} rule\n   * @param {Function} transformer\n   * @param {string=} scope\n   * @param {string=} hostScope\n   */\n  _transformRule(rule, transformer, scope, hostScope) {\n    // NOTE: save transformedSelector for subsequent matching of elements\n    // against selectors (e.g. when calculating style properties)\n    rule['selector'] = rule.transformedSelector =\n      this._transformRuleCss(rule, transformer, scope, hostScope);\n  }\n\n  /**\n   * @param {StyleNode} rule\n   * @param {Function} transformer\n   * @param {string=} scope\n   * @param {string=} hostScope\n   */\n  _transformRuleCss(rule, transformer, scope, hostScope) {\n    let p$ = StyleUtil.splitSelectorList(rule['selector']);\n    // we want to skip transformation of rules that appear in keyframes,\n    // because they are keyframe selectors, not element selectors.\n    if (!StyleUtil.isKeyframesSelector(rule)) {\n      for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {\n        p$[i] = transformer.call(this, p, scope, hostScope);\n      }\n    }\n    return p$.filter((part) => Boolean(part)).join(COMPLEX_SELECTOR_SEP);\n  }\n\n  /**\n   * @param {string} selector\n   * @return {string}\n   */\n  _twiddleNthPlus(selector) {\n    return selector.replace(NTH, (m, type, inside) => {\n      if (inside.indexOf('+') > -1) {\n        inside = inside.replace(/\\+/g, '___');\n      } else if (inside.indexOf('___') > -1) {\n        inside = inside.replace(/___/g, '+');\n      }\n      return `:${type}(${inside})`;\n    });\n  }\n\n  /**\n   * Preserve `:matches()` selectors by replacing them with MATCHES_REPLACMENT\n   * and returning an array of `:matches()` selectors.\n   * Use `_replacesMatchesPseudo` to replace the `:matches()` parts\n   *\n   * @param {string} selector\n   * @return {{selector: string, matches: !Array<string>}}\n   */\n  _preserveMatchesPseudo(selector) {\n    /** @type {!Array<string>} */\n    const matches = [];\n    let match;\n    while ((match = selector.match(MATCHES))) {\n      const start = match.index;\n      const end = StyleUtil.findMatchingParen(selector, start);\n      if (end === -1) {\n        throw new Error(`${match.input} selector missing ')'`)\n      }\n      const part = selector.slice(start, end + 1);\n      selector = selector.replace(part, MATCHES_REPLACEMENT);\n      matches.push(part);\n    }\n    return {selector, matches};\n  }\n\n  /**\n   * Replace MATCHES_REPLACMENT character with the given set of `:matches()`\n   * selectors.\n   *\n   * @param {string} selector\n   * @param {!Array<string>} matches\n   * @return {string}\n   */\n  _replaceMatchesPseudo(selector, matches) {\n    const parts = selector.split(MATCHES_REPLACEMENT);\n    return matches.reduce((acc, cur, idx) => acc + cur + parts[idx + 1], parts[0]);\n  }\n\n/**\n * @param {string} selector\n * @param {string} scope\n * @param {string=} hostScope\n */\n  _transformComplexSelector(selector, scope, hostScope) {\n    let stop = false;\n    selector = selector.trim();\n    // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP\n    let isNth = NTH.test(selector);\n    if (isNth) {\n      selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\\s/g, '')})`)\n      selector = this._twiddleNthPlus(selector);\n    }\n    // Preserve selectors like `:-webkit-any` so that SIMPLE_SELECTOR_SEP does\n    // not get confused by spaces inside the pseudo selector\n    const isMatches = MATCHES.test(selector);\n    /** @type {!Array<string>} */\n    let matches;\n    if (isMatches) {\n      ({selector, matches} = this._preserveMatchesPseudo(selector));\n    }\n    selector = selector.replace(SLOTTED_START, `${HOST} $1`);\n    selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {\n      if (!stop) {\n        let info = this._transformCompoundSelector(s, c, scope, hostScope);\n        stop = stop || info.stop;\n        c = info.combinator;\n        s = info.value;\n      }\n      return c + s;\n    });\n    // replace `:matches()` selectors\n    if (isMatches) {\n      selector = this._replaceMatchesPseudo(selector, matches);\n    }\n    if (isNth) {\n      selector = this._twiddleNthPlus(selector);\n    }\n    return selector;\n  }\n\n  _transformCompoundSelector(selector, combinator, scope, hostScope) {\n    // replace :host with host scoping class\n    let slottedIndex = selector.indexOf(SLOTTED);\n    if (selector.indexOf(HOST) >= 0) {\n      selector = this._transformHostSelector(selector, hostScope);\n    // replace other selectors with scoping class\n    } else if (slottedIndex !== 0) {\n      selector = scope ? this._transformSimpleSelector(selector, scope) :\n        selector;\n    }\n    // mark ::slotted() scope jump to replace with descendant selector + arg\n    // also ignore left-side combinator\n    let slotted = false;\n    if (slottedIndex >= 0) {\n      combinator = '';\n      slotted = true;\n    }\n    // process scope jumping selectors up to the scope jump and then stop\n    let stop;\n    if (slotted) {\n      stop = true;\n      if (slotted) {\n        // .zonk ::slotted(.foo) -> .zonk.scope > .foo\n        selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);\n      }\n    }\n    selector = selector.replace(DIR_PAREN, (m, before, dir) =>\n      `[dir=\"${dir}\"] ${before}, ${before}[dir=\"${dir}\"]`);\n    return {value: selector, combinator, stop};\n  }\n\n  _transformSimpleSelector(selector, scope) {\n    const attributes = selector.split(/(\\[.+?\\])/);\n\n    const output = [];\n    for (let i = 0; i < attributes.length; i++) {\n      // Do not attempt to transform any attribute selector content\n      if ((i % 2) === 1) {\n        output.push(attributes[i]);\n      } else {\n        const part = attributes[i];\n\n        if (!(part === '' && i === attributes.length - 1)) {\n          let p$ = part.split(PSEUDO_PREFIX);\n          p$[0] += scope;\n          output.push(p$.join(PSEUDO_PREFIX));\n        }\n      }\n    }\n\n    return output.join('');\n  }\n\n  // :host(...) -> scopeName...\n  _transformHostSelector(selector, hostScope) {\n    let m = selector.match(HOST_PAREN);\n    let paren = m && m[2].trim() || '';\n    if (paren) {\n      if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {\n        // paren starts with a type selector\n        let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];\n        // if the type selector is our hostScope then avoid pre-pending it\n        if (typeSelector === hostScope) {\n          return paren;\n        // otherwise, this selector should not match in this scope so\n        // output a bogus selector.\n        } else {\n          return SELECTOR_NO_MATCH;\n        }\n      } else {\n        // make sure to do a replace here to catch selectors like:\n        // `:host(.foo)::before`\n        return selector.replace(HOST_PAREN, function(m, host, paren) {\n          return hostScope + paren;\n        });\n      }\n    // if no paren, do a straight :host replacement.\n    // TODO(sorvell): this should not strictly be necessary but\n    // it's needed to maintain support for `:host[foo]` type selectors\n    // which have been improperly used under Shady DOM. This should be\n    // deprecated.\n    } else {\n      return selector.replace(HOST, hostScope);\n    }\n  }\n\n  /**\n   * @param {StyleNode} rule\n   */\n  documentRule(rule) {\n    // reset selector in case this is redone.\n    rule['selector'] = rule['parsedSelector'];\n    this.normalizeRootSelector(rule);\n    this._transformRule(rule, this._transformDocumentSelector);\n  }\n\n  /**\n   * @param {StyleNode} rule\n   */\n  normalizeRootSelector(rule) {\n    if (rule['selector'] === ROOT) {\n      rule['selector'] = 'html';\n    }\n  }\n\n/**\n * @param {string} selector\n */\n  _transformDocumentSelector(selector) {\n    if (selector.match(HOST)) {\n      // remove ':host' type selectors in document rules\n      return '';\n    } else if (selector.match(SLOTTED)) {\n      return this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR)\n    } else {\n      return this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);\n    }\n  }\n}\n\nconst NTH = /:(nth[-\\w]+)\\(([^)]+)\\)/;\nconst SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;\nconst COMPLEX_SELECTOR_SEP = ',';\nconst SIMPLE_SELECTOR_SEP = /(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g;\nconst SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;\nconst HOST = ':host';\nconst ROOT = ':root';\nconst SLOTTED = '::slotted';\nconst SLOTTED_START = new RegExp(`^(${SLOTTED})`);\n// NOTE: this supports 1 nested () pair for things like\n// :host(:not([selected]), more general support requires\n// parsing which seems like overkill\nconst HOST_PAREN = /(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\n// similar to HOST_PAREN\nconst SLOTTED_PAREN = /(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/;\nconst DIR_PAREN = /(.*):dir\\((?:(ltr|rtl))\\)/;\nconst CSS_CLASS_PREFIX = '.';\nconst PSEUDO_PREFIX = ':';\nconst CLASS = 'class';\nconst SELECTOR_NO_MATCH = 'should_not_match';\nconst MATCHES = /:(?:matches|any|-(?:webkit|moz)-any)/;\nconst MATCHES_REPLACEMENT = '\\u{e000}';\n\nexport default new StyleTransformer()\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {parse, StyleNode} from './css-parse.js';\nimport {nativeShadow, nativeCssVariables} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport StyleProperties from './style-properties.js';\nimport {ensureStylePlaceholder, getStylePlaceholder} from './style-placeholder.js';\nimport StyleInfo from './style-info.js';\nimport StyleCache from './style-cache.js';\nimport {flush as watcherFlush, getOwnerScope, getCurrentScope} from './document-watcher.js';\nimport templateMap from './template-map.js';\nimport * as ApplyShimUtils from './apply-shim-utils.js';\nimport {updateNativeProperties, detectMixin} from './common-utils.js';\nimport {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars\n\n/**\n * @const {StyleCache}\n */\nconst styleCache = new StyleCache();\n\nexport default class ScopingShim {\n  constructor() {\n    this._scopeCounter = {};\n    this._documentOwner = /** @type {!HTMLElement} */(document.documentElement);\n    let ast = new StyleNode();\n    ast['rules'] = [];\n    this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));\n    this._elementsHaveApplied = false;\n    /** @type {?Object} */\n    this._applyShim = null;\n    /** @type {?CustomStyleInterfaceInterface} */\n    this._customStyleInterface = null;\n  }\n  flush() {\n    watcherFlush();\n  }\n  _generateScopeSelector(name) {\n    let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;\n    return `${name}-${id}`;\n  }\n  getStyleAst(style) {\n    return StyleUtil.rulesForStyle(style);\n  }\n  styleAstToString(ast) {\n    return StyleUtil.toCssText(ast);\n  }\n  _gatherStyles(template) {\n    return StyleUtil.gatherStyleText(template.content);\n  }\n  /**\n   * Prepare the styling and template for the given element type\n   *\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   * @param {string=} typeExtension\n   */\n  prepareTemplate(template, elementName, typeExtension) {\n    this.prepareTemplateDom(template, elementName);\n    this.prepareTemplateStyles(template, elementName, typeExtension);\n  }\n  /**\n   * Prepare styling for the given element type\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   * @param {string=} typeExtension\n   */\n  prepareTemplateStyles(template, elementName, typeExtension) {\n    if (template._prepared) {\n      return;\n    }\n    // style placeholders are only used when ShadyDOM is active\n    if (!nativeShadow) {\n      ensureStylePlaceholder(elementName);\n    }\n    template._prepared = true;\n    template.name = elementName;\n    template.extends = typeExtension;\n    templateMap[elementName] = template;\n    let cssBuild = StyleUtil.getCssBuild(template);\n    const optimalBuild = StyleUtil.isOptimalCssBuild(cssBuild);\n    let info = {\n      is: elementName,\n      extends: typeExtension,\n    };\n    let cssText = this._gatherStyles(template);\n    // check if the styling has mixin definitions or uses\n    this._ensure();\n    if (!optimalBuild) {\n      let hasMixins = !cssBuild && detectMixin(cssText);\n      let ast = parse(cssText);\n      // only run the applyshim transforms if there is a mixin involved\n      if (hasMixins && nativeCssVariables && this._applyShim) {\n        this._applyShim['transformRules'](ast, elementName);\n      }\n      template['_styleAst'] = ast;\n    }\n    let ownPropertyNames = [];\n    if (!nativeCssVariables) {\n      ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);\n    }\n    if (!ownPropertyNames.length || nativeCssVariables) {\n      let root = nativeShadow ? template.content : null;\n      let placeholder = getStylePlaceholder(elementName);\n      let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder, cssBuild, optimalBuild ? cssText : '');\n      template._style = style;\n    }\n    template._ownPropertyNames = ownPropertyNames;\n  }\n  /**\n   * Prepare template for the given element type\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   */\n  prepareTemplateDom(template, elementName) {\n    const cssBuild = StyleUtil.getCssBuild(template);\n    if (!nativeShadow && cssBuild !== 'shady' && !template._domPrepared) {\n      template._domPrepared = true;\n      StyleTransformer.domAddScope(template.content, elementName);\n    }\n  }\n  /**\n   * @param {!{is: string, extends: (string|undefined)}} info\n   * @param {!StyleNode} rules\n   * @param {DocumentFragment} shadowroot\n   * @param {Node} placeholder\n   * @param {string} cssBuild\n   * @param {string=} cssText\n   * @return {?HTMLStyleElement}\n   */\n  _generateStaticStyle(info, rules, shadowroot, placeholder, cssBuild, cssText) {\n    cssText = StyleTransformer.elementStyles(info, rules, null, cssBuild, cssText);\n    if (cssText.length) {\n      return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);\n    }\n    return null;\n  }\n  _prepareHost(host) {\n    const {is, typeExtension} = StyleUtil.getIsExtends(host);\n    const placeholder = getStylePlaceholder(is);\n    const template = templateMap[is];\n    if (!template) {\n      return;\n    }\n    const ast = template['_styleAst'];\n    const ownStylePropertyNames = template._ownPropertyNames;\n    const cssBuild = StyleUtil.getCssBuild(template);\n    const styleInfo = new StyleInfo(\n      ast,\n      placeholder,\n      ownStylePropertyNames,\n      is,\n      typeExtension,\n      cssBuild\n    );\n    StyleInfo.set(host, styleInfo);\n    return styleInfo;\n  }\n  _ensureApplyShim() {\n    if (this._applyShim) {\n      return;\n    } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {\n      this._applyShim = /** @type {!Object} */ (window.ShadyCSS.ApplyShim);\n      this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;\n    }\n  }\n  _ensureCustomStyleInterface() {\n    if (this._customStyleInterface) {\n      return;\n    } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {\n      this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);\n      /** @type {function(!HTMLStyleElement)} */\n      this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};\n      this._customStyleInterface['validateCallback'] = () => {\n        requestAnimationFrame(() => {\n          if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {\n            this.flushCustomStyles();\n          }\n        })\n      };\n    }\n  }\n  _ensure() {\n    this._ensureApplyShim();\n    this._ensureCustomStyleInterface();\n  }\n  /**\n   * Flush and apply custom styles to document\n   */\n  flushCustomStyles() {\n    this._ensure();\n    if (!this._customStyleInterface) {\n      return;\n    }\n    let customStyles = this._customStyleInterface['processStyles']();\n    // early return if custom-styles don't need validation\n    if (!this._customStyleInterface['enqueued']) {\n      return;\n    }\n    // bail if custom styles are built optimally\n    if (StyleUtil.isOptimalCssBuild(this._documentOwnerStyleInfo.cssBuild)) {\n      return;\n    }\n    if (!nativeCssVariables) {\n      this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);\n      this._applyCustomStyles(customStyles);\n      if (this._elementsHaveApplied) {\n        // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree\n        this.styleDocument();\n      }\n    } else if (!this._documentOwnerStyleInfo.cssBuild) {\n      this._revalidateCustomStyleApplyShim(customStyles);\n    }\n    this._customStyleInterface['enqueued'] = false;\n  }\n  /**\n   * Apply styles for the given element\n   *\n   * @param {!HTMLElement} host\n   * @param {Object=} overrideProps\n   */\n  styleElement(host, overrideProps) {\n    const styleInfo = StyleInfo.get(host) || this._prepareHost(host);\n    // if there is no style info at this point, bail\n    if (!styleInfo) {\n      return;\n    }\n    // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called\n    if (!this._isRootOwner(host)) {\n      this._elementsHaveApplied = true;\n    }\n    if (overrideProps) {\n      styleInfo.overrideStyleProperties =\n        styleInfo.overrideStyleProperties || {};\n      Object.assign(styleInfo.overrideStyleProperties, overrideProps);\n    }\n    if (!nativeCssVariables) {\n      this.styleElementShimVariables(host, styleInfo);\n    } else {\n      this.styleElementNativeVariables(host, styleInfo);\n    }\n  }\n  /**\n   * @param {!HTMLElement} host\n   * @param {!StyleInfo} styleInfo\n   */\n  styleElementShimVariables(host, styleInfo) {\n    this.flush();\n    this._updateProperties(host, styleInfo);\n    if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {\n      this._applyStyleProperties(host, styleInfo);\n    }\n  }\n  /**\n   * @param {!HTMLElement} host\n   * @param {!StyleInfo} styleInfo\n   */\n  styleElementNativeVariables(host, styleInfo) {\n    const { is } = StyleUtil.getIsExtends(host);\n    if (styleInfo.overrideStyleProperties) {\n      updateNativeProperties(host, styleInfo.overrideStyleProperties);\n    }\n    const template = templateMap[is];\n    // bail early if there is no shadowroot for this element\n    if (!template && !this._isRootOwner(host)) {\n      return;\n    }\n    // bail early if the template was built with polymer-css-build\n    if (template && StyleUtil.elementHasBuiltCss(template)) {\n      return;\n    }\n    if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {\n      // update template\n      if (!ApplyShimUtils.templateIsValidating(template)) {\n        this._ensure();\n        this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);\n        template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n        ApplyShimUtils.startValidatingTemplate(template);\n      }\n      // update instance if native shadowdom\n      if (nativeShadow) {\n        let root = host.shadowRoot;\n        if (root) {\n          let style = root.querySelector('style');\n          if (style) {\n            style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);\n          }\n        }\n      }\n      styleInfo.styleRules = template['_styleAst'];\n    }\n  }\n  _styleOwnerForNode(node) {\n    let root = StyleUtil.wrap(node).getRootNode();\n    let host = root.host;\n    if (host) {\n      if (StyleInfo.get(host) || this._prepareHost(host)) {\n        return host;\n      } else {\n        return this._styleOwnerForNode(host);\n      }\n    }\n    return this._documentOwner;\n  }\n  _isRootOwner(node) {\n    return (node === this._documentOwner);\n  }\n  _applyStyleProperties(host, styleInfo) {\n    let is = StyleUtil.getIsExtends(host).is;\n    let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);\n    let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;\n    let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;\n    let oldScopeSelector = styleInfo.scopeSelector;\n    // only generate new scope if cached style is not found\n    styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);\n    let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);\n    if (!nativeShadow) {\n      StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);\n    }\n    if (!cacheEntry) {\n      styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);\n    }\n    return style;\n  }\n  _updateProperties(host, styleInfo) {\n    let owner = this._styleOwnerForNode(host);\n    let ownerStyleInfo = StyleInfo.get(owner);\n    let ownerProperties = ownerStyleInfo.styleProperties;\n    // style owner has not updated properties yet\n    // go up the chain and force property update,\n    // except if the owner is the document\n    if (owner !== this._documentOwner && !ownerProperties) {\n      this._updateProperties(owner, ownerStyleInfo);\n      ownerProperties = ownerStyleInfo.styleProperties;\n    }\n    let props = Object.create(ownerProperties || null);\n    let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules, styleInfo.cssBuild);\n    let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);\n    let propertiesMatchingHost = propertyData.properties\n    Object.assign(\n      props,\n      hostAndRootProps.hostProps,\n      propertiesMatchingHost,\n      hostAndRootProps.rootProps\n    );\n    this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);\n    StyleProperties.reify(props);\n    styleInfo.styleProperties = props;\n  }\n  _mixinOverrideStyles(props, overrides) {\n    for (let p in overrides) {\n      let v = overrides[p];\n      // skip override props if they are not truthy or 0\n      // in order to fall back to inherited values\n      if (v || v === 0) {\n        props[p] = v;\n      }\n    }\n  }\n  /**\n   * Update styles of the whole document\n   *\n   * @param {Object=} properties\n   */\n  styleDocument(properties) {\n    this.styleSubtree(this._documentOwner, properties);\n  }\n  /**\n   * Update styles of a subtree\n   *\n   * @param {!HTMLElement} host\n   * @param {Object=} properties\n   */\n  styleSubtree(host, properties) {\n    let root = host.shadowRoot;\n    if (root || this._isRootOwner(host)) {\n      this.styleElement(host, properties);\n    }\n    // process the shadowdom children of `host`\n    let shadowChildren =\n        root && (/** @type {!ParentNode} */ (root).children || root.childNodes);\n    if (shadowChildren) {\n      for (let i = 0; i < shadowChildren.length; i++) {\n        let c = /** @type {!HTMLElement} */(shadowChildren[i]);\n        this.styleSubtree(c);\n      }\n    } else {\n      // process the lightdom children of `host`\n      let children = host.children || host.childNodes;\n      if (children) {\n        for (let i = 0; i < children.length; i++) {\n          let c = /** @type {!HTMLElement} */(children[i]);\n          this.styleSubtree(c);\n        }\n      }\n    }\n  }\n  /* Custom Style operations */\n  _revalidateCustomStyleApplyShim(customStyles) {\n    for (let i = 0; i < customStyles.length; i++) {\n      let c = customStyles[i];\n      let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n      if (s) {\n        this._revalidateApplyShim(s);\n      }\n    }\n  }\n  _applyCustomStyles(customStyles) {\n    for (let i = 0; i < customStyles.length; i++) {\n      let c = customStyles[i];\n      let s = this._customStyleInterface['getStyleForCustomStyle'](c);\n      if (s) {\n        StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);\n      }\n    }\n  }\n  transformCustomStyleForDocument(style) {\n    const cssBuild = StyleUtil.getCssBuild(style);\n    if (cssBuild !== this._documentOwnerStyleInfo.cssBuild) {\n      this._documentOwnerStyleInfo.cssBuild = cssBuild;\n    }\n    if (StyleUtil.isOptimalCssBuild(cssBuild)) {\n      return;\n    }\n    let ast = StyleUtil.rulesForStyle(style);\n    StyleUtil.forEachRule(ast, (rule) => {\n      if (nativeShadow) {\n        StyleTransformer.normalizeRootSelector(rule);\n      } else {\n        StyleTransformer.documentRule(rule);\n      }\n      if (nativeCssVariables && cssBuild === '') {\n        this._ensure();\n        this._applyShim && this._applyShim['transformRule'](rule);\n      }\n    });\n    if (nativeCssVariables) {\n      style.textContent = StyleUtil.toCssText(ast);\n    } else {\n      this._documentOwnerStyleInfo.styleRules['rules'].push(ast);\n    }\n  }\n  _revalidateApplyShim(style) {\n    if (nativeCssVariables && this._applyShim) {\n      let ast = StyleUtil.rulesForStyle(style);\n      this._ensure();\n      this._applyShim['transformRules'](ast);\n      style.textContent = StyleUtil.toCssText(ast);\n    }\n  }\n  getComputedStyleValue(element, property) {\n    let value;\n    if (!nativeCssVariables) {\n      // element is either a style host, or an ancestor of a style host\n      let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));\n      value = styleInfo.styleProperties[property];\n    }\n    // fall back to the property value from the computed styling\n    value = value || window.getComputedStyle(element).getPropertyValue(property);\n    // trim whitespace that can come after the `:` in css\n    // example: padding: 2px -> \" 2px\"\n    return value ? value.trim() : '';\n  }\n  // given an element and a classString, replaces\n  // the element's class with the provided classString and adds\n  // any necessary ShadyCSS static and property based scoping selectors\n  setElementClass(element, classString) {\n    let root = StyleUtil.wrap(element).getRootNode();\n    let classes = classString ? classString.split(/\\s/) : [];\n    let scopeName = root.host && root.host.localName;\n    // If no scope, try to discover scope name from existing class.\n    // This can occur if, for example, a template stamped element that\n    // has been scoped is manipulated when not in a root.\n    if (!scopeName) {\n      var classAttr = element.getAttribute('class');\n      if (classAttr) {\n        let k$ = classAttr.split(/\\s/);\n        for (let i=0; i < k$.length; i++) {\n          if (k$[i] === StyleTransformer.SCOPE_NAME) {\n            scopeName = k$[i+1];\n            break;\n          }\n        }\n      }\n    }\n    if (scopeName) {\n      classes.push(StyleTransformer.SCOPE_NAME, scopeName);\n    }\n    if (!nativeCssVariables) {\n      let styleInfo = StyleInfo.get(element);\n      if (styleInfo && styleInfo.scopeSelector) {\n        classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);\n      }\n    }\n    StyleUtil.setElementClassRaw(element, classes.join(' '));\n  }\n  _styleInfoForNode(node) {\n    return StyleInfo.get(node);\n  }\n  /**\n   * @param {!Element} node\n   * @param {string} scope\n   */\n  scopeNode(node, scope) {\n    StyleTransformer.element(node, scope);\n  }\n  /**\n   * @param {!Element} node\n   * @param {string} scope\n   */\n  unscopeNode(node, scope) {\n    StyleTransformer.element(node, scope, true);\n  }\n  /**\n   * @param {!Node} node\n   * @return {string}\n   */\n  scopeForNode(node) {\n    return getOwnerScope(node);\n  }\n  /**\n   * @param {!Element} node\n   * @return {string}\n   */\n  currentScopeForNode(node) {\n    return getCurrentScope(node);\n  }\n}\n\n/* exports */\n/* eslint-disable no-self-assign */\nScopingShim.prototype['flush'] = ScopingShim.prototype.flush;\nScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;\nScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;\nScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;\nScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;\nScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;\nScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;\nScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;\nScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;\nScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;\nScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;\nScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;\nScopingShim.prototype['scopeNode'] = ScopingShim.prototype.scopeNode;\nScopingShim.prototype['unscopeNode'] = ScopingShim.prototype.unscopeNode;\nScopingShim.prototype['scopeForNode'] = ScopingShim.prototype.scopeForNode;\nScopingShim.prototype['currentScopeForNode'] = ScopingShim.prototype.currentScopeForNode;\n/* eslint-enable no-self-assign */\nObject.defineProperties(ScopingShim.prototype, {\n  'nativeShadow': {\n    get() {\n      return nativeShadow;\n    }\n  },\n  'nativeCss': {\n    get() {\n      return nativeCssVariables;\n    }\n  }\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport {getIsExtends, elementHasBuiltCss, wrap} from './style-util.js';\n\nexport let flush = function() {};\n\n/**\n * @param {!Element} element\n * @return {string}\n */\nfunction getClasses(element) {\n  if (element.classList && element.classList.value) {\n    return element.classList.value;\n  } else {\n    // NOTE: className is patched to remove scoping classes in ShadyDOM\n    // use getAttribute('class') instead, which is unpatched\n    return element.getAttribute('class') || '';\n  }\n}\n\nconst scopeRegExp = new RegExp(`${StyleTransformer.SCOPE_NAME}\\\\s*([^\\\\s]*)`);\n\n/**\n * @param {!Element} element\n * @return {string}\n */\nexport function getCurrentScope(element) {\n  const match = getClasses(element).match(scopeRegExp);\n  if (match) {\n    return match[1];\n  } else {\n    return '';\n  }\n}\n\n/**\n * @param {!Node} node\n */\nexport function getOwnerScope(node) {\n  const ownerRoot = wrap(node).getRootNode();\n  if (ownerRoot === node || ownerRoot === node.ownerDocument) {\n    return '';\n  }\n  const host = /** @type {!ShadowRoot} */(ownerRoot).host;\n  if (!host) {\n    // this may actually be a document fragment\n    return '';\n  }\n  return getIsExtends(host).is;\n}\n\n/**\n * @param {!Element} element\n */\nexport function ensureCorrectScope(element) {\n  const currentScope = getCurrentScope(element);\n  const ownerRoot = wrap(element).getRootNode();\n  if (ownerRoot === element) {\n    return;\n  }\n  if (currentScope && ownerRoot === element.ownerDocument) {\n    // node was scoped, but now is in document\n    StyleTransformer.domRemoveScope(element, currentScope);\n  } else if (ownerRoot instanceof ShadowRoot) {\n    const ownerScope = getOwnerScope(element);\n    if (ownerScope !== currentScope) {\n      // node was scoped, but not by its current owner\n      StyleTransformer.domReplaceScope(element, currentScope, ownerScope);\n    }\n  }\n}\n\n/**\n * @param {!HTMLElement|!HTMLDocument} element\n */\nexport function ensureCorrectSubtreeScoping(element) {\n  // find unscoped subtree nodes\n  const unscopedNodes = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(\n    element, `:not(.${StyleTransformer.SCOPE_NAME})`);\n\n  for (let j = 0; j < unscopedNodes.length; j++) {\n    // it's possible, during large batch inserts, that nodes that aren't\n    // scoped within the current scope were added.\n    // To make sure that any unscoped nodes that were inserted in the current batch are correctly styled,\n    // query all unscoped nodes and force their style-scope to be applied.\n    // This could happen if a sub-element appended an unscoped node in its shadowroot and this function\n    // runs on a parent element of the host of that unscoped node:\n    // parent-element -> element -> unscoped node\n    // Here unscoped node should have the style-scope element, not parent-element.\n    const unscopedNode = unscopedNodes[j];\n    const scopeForPreviouslyUnscopedNode = getOwnerScope(unscopedNode);\n    if (scopeForPreviouslyUnscopedNode) {\n      StyleTransformer.element(unscopedNode, scopeForPreviouslyUnscopedNode);\n    }\n  }\n}\n\n/**\n * @param {HTMLElement} el\n * @return {boolean}\n */\nfunction isElementWithBuiltCss(el) {\n  if (el.localName === 'style' || el.localName === 'template') {\n    return elementHasBuiltCss(el);\n  }\n  return false;\n}\n\n/**\n * @param {Array<MutationRecord|null>|null} mxns\n */\nfunction handler(mxns) {\n  for (let x=0; x < mxns.length; x++) {\n    let mxn = mxns[x];\n    if (mxn.target === document.documentElement ||\n      mxn.target === document.head) {\n      continue;\n    }\n    for (let i=0; i < mxn.addedNodes.length; i++) {\n      let n = mxn.addedNodes[i];\n      if (n.nodeType !== Node.ELEMENT_NODE) {\n        continue;\n      }\n      n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign\n      let root = n.getRootNode();\n      let currentScope = getCurrentScope(n);\n      // node was scoped, but now is in document\n      // If this element has built css, we must not remove scoping as this node\n      // will be used as a template or style without re - applying scoping as an optimization\n      if (currentScope && root === n.ownerDocument && !isElementWithBuiltCss(n)) {\n        StyleTransformer.domRemoveScope(n, currentScope);\n      } else if (root instanceof ShadowRoot) {\n        const newScope = getOwnerScope(n);\n        // rescope current node and subtree if necessary\n        if (newScope !== currentScope) {\n          StyleTransformer.domReplaceScope(n, currentScope, newScope);\n        }\n        // make sure all the subtree elements are scoped correctly\n        ensureCorrectSubtreeScoping(n);\n      }\n    }\n  }\n}\n\n// if native Shadow DOM is being used, or ShadyDOM handles dynamic scoiping, do not activate the MutationObserver\nif (!nativeShadow && !(window['ShadyDOM'] && window['ShadyDOM']['handlesDynamicScoping'])) {\n  let observer = new MutationObserver(handler);\n  let start = (node) => {\n    observer.observe(node, {childList: true, subtree: true});\n  }\n  let nativeCustomElements = (window['customElements'] &&\n    !window['customElements']['polyfillWrapFlushCallback']);\n  // need to start immediately with native custom elements\n  // TODO(dfreedm): with polyfilled HTMLImports and native custom elements\n  // excessive mutations may be observed; this can be optimized via cooperation\n  // with the HTMLImports polyfill.\n  if (nativeCustomElements) {\n    start(document);\n  } else {\n    let delayedStart = () => {\n      start(document.body);\n    }\n    // use polyfill timing if it's available\n    if (window['HTMLImports']) {\n      window['HTMLImports']['whenReady'](delayedStart);\n    // otherwise push beyond native imports being ready\n    // which requires RAF + readystate interactive.\n    } else {\n      requestAnimationFrame(function() {\n        if (document.readyState === 'loading') {\n          let listener = function() {\n            delayedStart();\n            document.removeEventListener('readystatechange', listener);\n          }\n          document.addEventListener('readystatechange', listener);\n        } else {\n          delayedStart();\n        }\n      });\n    }\n  }\n\n  flush = function() {\n    handler(observer.takeRecords());\n  }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\nimport {nativeShadow} from './style-settings.js';\nimport StyleTransformer from './style-transformer.js';\nimport * as StyleUtil from './style-util.js';\nimport * as RX from './common-regex.js';\nimport StyleInfo from './style-info.js';\n\n// TODO: dedupe with shady\n/**\n * @param {string} selector\n * @return {boolean}\n * @this {Element}\n */\nconst matchesSelector = function(selector) {\n  const method = this.matches || this.matchesSelector ||\n    this.mozMatchesSelector || this.msMatchesSelector ||\n    this.oMatchesSelector || this.webkitMatchesSelector;\n  return method && method.call(this, selector);\n};\n\nconst IS_IE = navigator.userAgent.match('Trident');\n\nconst XSCOPE_NAME = 'x-scope';\n\nclass StyleProperties {\n  get XSCOPE_NAME() {\n    return XSCOPE_NAME;\n  }\n/**\n * decorates styles with rule info and returns an array of used style property names\n *\n * @param {StyleNode} rules\n * @return {Array<string>}\n */\n  decorateStyles(rules) {\n    let self = this, props = {}, keyframes = [], ruleIndex = 0;\n    StyleUtil.forEachRule(rules, function(rule) {\n      self.decorateRule(rule);\n      // mark in-order position of ast rule in styles block, used for cache key\n      rule.index = ruleIndex++;\n      self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);\n    }, function onKeyframesRule(rule) {\n      keyframes.push(rule);\n    });\n    // Cache all found keyframes rules for later reference:\n    rules._keyframes = keyframes;\n    // return this list of property names *consumes* in these styles.\n    let names = [];\n    for (let i in props) {\n      names.push(i);\n    }\n    return names;\n  }\n\n  // decorate a single rule with property info\n  decorateRule(rule) {\n    if (rule.propertyInfo) {\n      return rule.propertyInfo;\n    }\n    let info = {}, properties = {};\n    let hasProperties = this.collectProperties(rule, properties);\n    if (hasProperties) {\n      info.properties = properties;\n      // TODO(sorvell): workaround parser seeing mixins as additional rules\n      rule['rules'] = null;\n    }\n    info.cssText = this.collectCssText(rule);\n    rule.propertyInfo = info;\n    return info;\n  }\n\n  // collects the custom properties from a rule's cssText\n  collectProperties(rule, properties) {\n    let info = rule.propertyInfo;\n    if (info) {\n      if (info.properties) {\n        Object.assign(properties, info.properties);\n        return true;\n      }\n    } else {\n      let m, rx = RX.VAR_ASSIGN;\n      let cssText = rule['parsedCssText'];\n      let value;\n      let any;\n      while ((m = rx.exec(cssText))) {\n        // note: group 2 is var, 3 is mixin\n        value = (m[2] || m[3]).trim();\n        // value of 'inherit' or 'unset' is equivalent to not setting the property here\n        if (value !== 'inherit' || value !== 'unset') {\n          properties[m[1].trim()] = value;\n        }\n        any = true;\n      }\n      return any;\n    }\n\n  }\n\n  // returns cssText of properties that consume variables/mixins\n  collectCssText(rule) {\n    return this.collectConsumingCssText(rule['parsedCssText']);\n  }\n\n  // NOTE: we support consumption inside mixin assignment\n  // but not production, so strip out {...}\n  collectConsumingCssText(cssText) {\n    return cssText.replace(RX.BRACKETED, '')\n      .replace(RX.VAR_ASSIGN, '');\n  }\n\n  collectPropertiesInCssText(cssText, props) {\n    let m;\n    while ((m = RX.VAR_CONSUMED.exec(cssText))) {\n      let name = m[1];\n      // This regex catches all variable names, and following non-whitespace char\n      // If next char is not ':', then variable is a consumer\n      if (m[2] !== ':') {\n        props[name] = true;\n      }\n    }\n  }\n\n  // turns custom properties into realized values.\n  reify(props) {\n    // big perf optimization here: reify only *own* properties\n    // since this object has __proto__ of the element's scope properties\n    let names = Object.getOwnPropertyNames(props);\n    for (let i=0, n; i < names.length; i++) {\n      n = names[i];\n      props[n] = this.valueForProperty(props[n], props);\n    }\n  }\n\n  // given a property value, returns the reified value\n  // a property value may be:\n  // (1) a literal value like: red or 5px;\n  // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or\n  // var(--a, var(--b));\n  // (3) a literal mixin value like { properties }. Each of these properties\n  // can have values that are: (a) literal, (b) variables, (c) @apply mixins.\n  valueForProperty(property, props) {\n    // case (1) default\n    // case (3) defines a mixin and we have to reify the internals\n    if (property) {\n      if (property.indexOf(';') >=0) {\n        property = this.valueForProperties(property, props);\n      } else {\n        // case (2) variable\n        let self = this;\n        let fn = function(prefix, value, fallback, suffix) {\n          if (!value) {\n            return prefix + suffix;\n          }\n          let propertyValue = self.valueForProperty(props[value], props);\n          // if value is \"initial\", then the variable should be treated as unset\n          if (!propertyValue || propertyValue === 'initial') {\n            // fallback may be --a or var(--a) or literal\n            propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||\n            fallback;\n          } else if (propertyValue === 'apply-shim-inherit') {\n            // CSS build will replace `inherit` with `apply-shim-inherit`\n            // for use with native css variables.\n            // Since we have full control, we can use `inherit` directly.\n            propertyValue = 'inherit';\n          }\n          return prefix + (propertyValue || '') + suffix;\n        };\n        property = StyleUtil.processVariableAndFallback(property, fn);\n      }\n    }\n    return property && property.trim() || '';\n  }\n\n  // note: we do not yet support mixin within mixin\n  valueForProperties(property, props) {\n    let parts = property.split(';');\n    for (let i=0, p, m; i<parts.length; i++) {\n      if ((p = parts[i])) {\n        RX.MIXIN_MATCH.lastIndex = 0;\n        m = RX.MIXIN_MATCH.exec(p);\n        if (m) {\n          p = this.valueForProperty(props[m[1]], props);\n        } else {\n          let colon = p.indexOf(':');\n          if (colon !== -1) {\n            let pp = p.substring(colon);\n            pp = pp.trim();\n            pp = this.valueForProperty(pp, props) || pp;\n            p = p.substring(0, colon) + pp;\n          }\n        }\n        parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?\n          // strip trailing ;\n          p.slice(0, -1) :\n          p || '';\n      }\n    }\n    return parts.join(';');\n  }\n\n  applyProperties(rule, props) {\n    let output = '';\n    // dynamically added sheets may not be decorated so ensure they are.\n    if (!rule.propertyInfo) {\n      this.decorateRule(rule);\n    }\n    if (rule.propertyInfo.cssText) {\n      output = this.valueForProperties(rule.propertyInfo.cssText, props);\n    }\n    rule['cssText'] = output;\n  }\n\n  // Apply keyframe transformations to the cssText of a given rule. The\n  // keyframeTransforms object is a map of keyframe names to transformer\n  // functions which take in cssText and spit out transformed cssText.\n  applyKeyframeTransforms(rule, keyframeTransforms) {\n    let input = rule['cssText'];\n    let output = rule['cssText'];\n    if (rule.hasAnimations == null) {\n      // Cache whether or not the rule has any animations to begin with:\n      rule.hasAnimations = RX.ANIMATION_MATCH.test(input);\n    }\n    // If there are no animations referenced, we can skip transforms:\n    if (rule.hasAnimations) {\n      let transform;\n      // If we haven't transformed this rule before, we iterate over all\n      // transforms:\n      if (rule.keyframeNamesToTransform == null) {\n        rule.keyframeNamesToTransform = [];\n        for (let keyframe in keyframeTransforms) {\n          transform = keyframeTransforms[keyframe];\n          output = transform(input);\n          // If the transform actually changed the CSS text, we cache the\n          // transform name for future use:\n          if (input !== output) {\n            input = output;\n            rule.keyframeNamesToTransform.push(keyframe);\n          }\n        }\n      } else {\n        // If we already have a list of keyframe names that apply to this\n        // rule, we apply only those keyframe name transforms:\n        for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {\n          transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];\n          input = transform(input);\n        }\n        output = input;\n      }\n    }\n    rule['cssText'] = output;\n  }\n\n  // Test if the rules in these styles matches the given `element` and if so,\n  // collect any custom properties into `props`.\n  /**\n   * @param {StyleNode} rules\n   * @param {Element} element\n   */\n  propertyDataFromStyles(rules, element) {\n    let props = {};\n    // generates a unique key for these matches\n    let o = [];\n    // note: active rules excludes non-matching @media rules\n    StyleUtil.forEachRule(rules, (rule) => {\n      // TODO(sorvell): we could trim the set of rules at declaration\n      // time to only include ones that have properties\n      if (!rule.propertyInfo) {\n        this.decorateRule(rule);\n      }\n      // match element against transformedSelector: selector may contain\n      // unwanted uniquification and parsedSelector does not directly match\n      // for :host selectors.\n      let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];\n      if (element && rule.propertyInfo.properties && selectorToMatch) {\n        if (matchesSelector.call(element, selectorToMatch)) {\n          this.collectProperties(rule, props);\n          // produce numeric key for these matches for lookup\n          addToBitMask(rule.index, o);\n        }\n      }\n    }, null, true);\n    return {properties: props, key: o};\n  }\n\n  /**\n   * @param {Element} scope\n   * @param {StyleNode} rule\n   * @param {string} cssBuild\n   * @param {function(Object)} callback\n   */\n  whenHostOrRootRule(scope, rule, cssBuild, callback) {\n    if (!rule.propertyInfo) {\n      this.decorateRule(rule);\n    }\n    if (!rule.propertyInfo.properties) {\n      return;\n    }\n    let {is, typeExtension} = StyleUtil.getIsExtends(scope);\n    let hostScope = is ?\n      StyleTransformer._calcHostScope(is, typeExtension) :\n      'html';\n    let parsedSelector = rule['parsedSelector'];\n    let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');\n    let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;\n    // build info is either in scope (when scope is an element) or in the style\n    // when scope is the default scope; note: this allows default scope to have\n    // mixed mode built and unbuilt styles.\n    if (cssBuild === 'shady') {\n      // :root -> x-foo > *.x-foo for elements and html for custom-style\n      isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;\n      // :host -> x-foo for elements, but sub-rules have .x-foo in them\n      isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;\n    }\n    if (!isRoot && !isHost) {\n      return;\n    }\n    let selectorToMatch = hostScope;\n    if (isHost) {\n      // need to transform :host because `:host` does not work with `matches`\n      if (!rule.transformedSelector) {\n        // transform :host into a matchable selector\n        rule.transformedSelector =\n        StyleTransformer._transformRuleCss(\n          rule,\n          StyleTransformer._transformComplexSelector,\n          StyleTransformer._calcElementScope(is),\n          hostScope\n        );\n      }\n      selectorToMatch = rule.transformedSelector || hostScope;\n    }\n    callback({\n      selector: selectorToMatch,\n      isHost: isHost,\n      isRoot: isRoot\n    });\n  }\n/**\n * @param {Element} scope\n * @param {StyleNode} rules\n * @param {string} cssBuild\n * @return {Object}\n */\n  hostAndRootPropertiesForScope(scope, rules, cssBuild) {\n    let hostProps = {}, rootProps = {};\n    // note: active rules excludes non-matching @media rules\n    StyleUtil.forEachRule(rules, (rule) => {\n      // if scope is StyleDefaults, use _element for matchesSelector\n      this.whenHostOrRootRule(scope, rule, cssBuild, (info) => {\n        let element = scope._element || scope;\n        if (matchesSelector.call(element, info.selector)) {\n          if (info.isHost) {\n            this.collectProperties(rule, hostProps);\n          } else {\n            this.collectProperties(rule, rootProps);\n          }\n        }\n      });\n    }, null, true);\n    return {rootProps: rootProps, hostProps: hostProps};\n  }\n\n  /**\n   * @param {Element} element\n   * @param {Object} properties\n   * @param {string} scopeSelector\n   */\n  transformStyles(element, properties, scopeSelector) {\n    let self = this;\n    let {is, typeExtension} = StyleUtil.getIsExtends(element);\n    let hostSelector = StyleTransformer\n      ._calcHostScope(is, typeExtension);\n    let rxHostSelector = element.extends ?\n      '\\\\' + hostSelector.slice(0, -1) + '\\\\]' :\n      hostSelector;\n    let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +\n      RX.HOST_SUFFIX);\n    let {styleRules: rules, cssBuild} = StyleInfo.get(element);\n    let keyframeTransforms =\n      this._elementKeyframeTransforms(element, rules, scopeSelector);\n    return StyleTransformer.elementStyles(element, rules, function(rule) {\n      self.applyProperties(rule, properties);\n      if (!nativeShadow &&\n          !StyleUtil.isKeyframesSelector(rule) &&\n          rule['cssText']) {\n        // NOTE: keyframe transforms only scope munge animation names, so it\n        // is not necessary to apply them in ShadowDOM.\n        self.applyKeyframeTransforms(rule, keyframeTransforms);\n        self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);\n      }\n    }, cssBuild);\n  }\n\n  /**\n   * @param {Element} element\n   * @param {StyleNode} rules\n   * @param {string} scopeSelector\n   * @return {Object}\n   */\n  _elementKeyframeTransforms(element, rules, scopeSelector) {\n    let keyframesRules = rules._keyframes;\n    let keyframeTransforms = {};\n    if (!nativeShadow && keyframesRules) {\n      // For non-ShadowDOM, we transform all known keyframes rules in\n      // advance for the current scope. This allows us to catch keyframes\n      // rules that appear anywhere in the stylesheet:\n      for (let i = 0, keyframesRule = keyframesRules[i];\n           i < keyframesRules.length;\n           keyframesRule = keyframesRules[++i]) {\n        this._scopeKeyframes(keyframesRule, scopeSelector);\n        keyframeTransforms[keyframesRule['keyframesName']] =\n            this._keyframesRuleTransformer(keyframesRule);\n      }\n    }\n    return keyframeTransforms;\n  }\n\n  // Generate a factory for transforming a chunk of CSS text to handle a\n  // particular scoped keyframes rule.\n  /**\n   * @param {StyleNode} keyframesRule\n   * @return {function(string):string}\n   */\n  _keyframesRuleTransformer(keyframesRule) {\n    return function(cssText) {\n      return cssText.replace(\n          keyframesRule.keyframesNameRx,\n          keyframesRule.transformedKeyframesName);\n    };\n  }\n\n/**\n * Transforms `@keyframes` names to be unique for the current host.\n * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0\n *\n * @param {StyleNode} rule\n * @param {string} scopeId\n */\n  _scopeKeyframes(rule, scopeId) {\n    // Animation names are of the form [\\w-], so ensure that the name regex does not partially apply\n    // to similarly named keyframe names by checking for a word boundary at the beginning and\n    // a non-word boundary or `-` at the end.\n    rule.keyframesNameRx = new RegExp(`\\\\b${rule['keyframesName']}(?!\\\\B|-)`, 'g');\n    rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;\n    rule.transformedSelector = rule.transformedSelector || rule['selector'];\n    rule['selector'] = rule.transformedSelector.replace(\n        rule['keyframesName'], rule.transformedKeyframesName);\n  }\n\n  // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):\n  // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo\n  // host selector: x-foo.wide -> .x-foo-42.wide\n  // note: we use only the scope class (.x-foo-42) and not the hostSelector\n  // (x-foo) to scope :host rules; this helps make property host rules\n  // have low specificity. They are overrideable by class selectors but,\n  // unfortunately, not by type selectors (e.g. overriding via\n  // `.special` is ok, but not by `x-foo`).\n  /**\n   * @param {StyleNode} rule\n   * @param {RegExp} hostRx\n   * @param {string} hostSelector\n   * @param {string} scopeId\n   */\n  _scopeSelector(rule, hostRx, hostSelector, scopeId) {\n    rule.transformedSelector = rule.transformedSelector || rule['selector'];\n    let selector = rule.transformedSelector;\n    let scope = '.' + scopeId;\n    let parts = StyleUtil.splitSelectorList(selector);\n    for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n      parts[i] = p.match(hostRx) ?\n        p.replace(hostSelector, scope) :\n        scope + ' ' + p;\n    }\n    rule['selector'] = parts.join(',');\n  }\n\n  /**\n   * @param {Element} element\n   * @param {string} selector\n   * @param {string} old\n   */\n  applyElementScopeSelector(element, selector, old) {\n    let c = element.getAttribute('class') || '';\n    let v = c;\n    if (old) {\n      v = c.replace(\n        new RegExp('\\\\s*' + XSCOPE_NAME + '\\\\s*' + old + '\\\\s*', 'g'), ' ');\n    }\n    v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;\n    if (c !== v) {\n      StyleUtil.setElementClassRaw(element, v);\n    }\n  }\n\n  /**\n   * @param {HTMLElement} element\n   * @param {Object} properties\n   * @param {string} selector\n   * @param {HTMLStyleElement} style\n   * @return {HTMLStyleElement}\n   */\n  applyElementStyle(element, properties, selector, style) {\n    // calculate cssText to apply\n    let cssText = style ? style.textContent || '' :\n      this.transformStyles(element, properties, selector);\n    // if shady and we have a cached style that is not style, decrement\n    let styleInfo = StyleInfo.get(element);\n    let s = styleInfo.customStyle;\n    if (s && !nativeShadow && (s !== style)) {\n      s['_useCount']--;\n      if (s['_useCount'] <= 0 && s.parentNode) {\n        s.parentNode.removeChild(s);\n      }\n    }\n    // apply styling always under native or if we generated style\n    // or the cached style is not in document(!)\n    if (nativeShadow) {\n      // update existing style only under native\n      if (styleInfo.customStyle) {\n        styleInfo.customStyle.textContent = cssText;\n        style = styleInfo.customStyle;\n      // otherwise, if we have css to apply, do so\n      } else if (cssText) {\n        // apply css after the scope style of the element to help with\n        // style precedence rules.\n        style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,\n          styleInfo.placeholder);\n      }\n    } else {\n      // shady and no cache hit\n      if (!style) {\n        // apply css after the scope style of the element to help with\n        // style precedence rules.\n        if (cssText) {\n          style = StyleUtil.applyCss(cssText, selector, null,\n            styleInfo.placeholder);\n        }\n      // shady and cache hit but not in document\n      } else if (!style.parentNode) {\n        if (IS_IE && cssText.indexOf('@media') > -1) {\n            // @media rules may be stale in IE 10 and 11\n            // refresh the text content of the style to revalidate them.\n          style.textContent = cssText;\n        }\n        StyleUtil.applyStyle(style, null, styleInfo.placeholder);\n      }\n    }\n    // ensure this style is our custom style and increment its use count.\n    if (style) {\n      style['_useCount'] = style['_useCount'] || 0;\n      // increment use count if we changed styles\n      if (styleInfo.customStyle != style) {\n        style['_useCount']++;\n      }\n      styleInfo.customStyle = style;\n    }\n    return style;\n  }\n\n  /**\n   * @param {Element} style\n   * @param {Object} properties\n   */\n  applyCustomStyle(style, properties) {\n    let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));\n    let self = this;\n    style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {\n      let css = rule['cssText'] = rule['parsedCssText'];\n      if (rule.propertyInfo && rule.propertyInfo.cssText) {\n        // remove property assignments\n        // so next function isn't confused\n        // NOTE: we have 3 categories of css:\n        // (1) normal properties,\n        // (2) custom property assignments (--foo: red;),\n        // (3) custom property usage: border: var(--foo); @apply(--foo);\n        // In elements, 1 and 3 are separated for efficiency; here they\n        // are not and this makes this case unique.\n        css = removeCustomPropAssignment(/** @type {string} */(css));\n        // replace with reified properties, scenario is same as mixin\n        rule['cssText'] = self.valueForProperties(css, properties);\n      }\n    });\n  }\n}\n\n/**\n * @param {number} n\n * @param {Array<number>} bits\n */\nfunction addToBitMask(n, bits) {\n  let o = parseInt(n / 32, 10);\n  let v = 1 << (n % 32);\n  bits[o] = (bits[o] || 0) | v;\n}\n\nexport default new StyleProperties();","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/** @const {string} */\nconst infoKey = '__styleInfo';\n\nexport default class StyleInfo {\n  /**\n   * @param {Element} node\n   * @return {StyleInfo}\n   */\n  static get(node) {\n    if (node) {\n      return node[infoKey];\n    } else {\n      return null;\n    }\n  }\n  /**\n   * @param {!Element} node\n   * @param {StyleInfo} styleInfo\n   * @return {StyleInfo}\n   */\n  static set(node, styleInfo) {\n    node[infoKey] = styleInfo;\n    return styleInfo;\n  }\n  /**\n   * @param {StyleNode} ast\n   * @param {Node=} placeholder\n   * @param {Array<string>=} ownStylePropertyNames\n   * @param {string=} elementName\n   * @param {string=} typeExtension\n   * @param {string=} cssBuild\n   */\n  constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {\n    /** @type {StyleNode} */\n    this.styleRules = ast || null;\n    /** @type {Node} */\n    this.placeholder = placeholder || null;\n    /** @type {!Array<string>} */\n    this.ownStylePropertyNames = ownStylePropertyNames || [];\n    /** @type {Array<Object>} */\n    this.overrideStyleProperties = null;\n    /** @type {string} */\n    this.elementName = elementName || '';\n    /** @type {string} */\n    this.cssBuild = cssBuild || '';\n    /** @type {string} */\n    this.typeExtension = typeExtension || '';\n    /** @type {Object<string, string>} */\n    this.styleProperties = null;\n    /** @type {?string} */\n    this.scopeSelector = null;\n    /** @type {HTMLStyleElement} */\n    this.customStyle = null;\n  }\n  _getStyleRules() {\n    return this.styleRules;\n  }\n}\n\n/* eslint-disable-next-line no-self-assign */\nStyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport {applyStylePlaceHolder} from './style-util.js';\nimport {nativeShadow} from './style-settings.js';\n\n/** @type {!Object<string, !Node>} */\nconst placeholderMap = {};\n\n/**\n * @param {string} elementName\n * @return {Node}\n */\nexport function getStylePlaceholder(elementName) {\n  return placeholderMap[elementName] || null;\n}\n\n/**\n * @param {string} elementName\n */\nexport function ensureStylePlaceholder(elementName) {\n  if (!placeholderMap[elementName]) {\n    placeholderMap[elementName] = applyStylePlaceHolder(elementName);\n  }\n}\n\n/**\n * @const {CustomElementRegistry}\n */\nconst ce = window['customElements'];\nif (ce && !nativeShadow) {\n  /**\n   * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}\n   */\n  const origDefine = ce['define'];\n  /**\n   * @param {string} name\n   * @param {function(new:HTMLElement)} clazz\n   * @param {{extends: string}=} options\n   */\n  const wrappedDefine = (name, clazz, options) => {\n    ensureStylePlaceholder(name);\n    origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);\n  };\n  ce['define'] = wrappedDefine;\n}","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';\n\nexport default class StyleCache {\n  constructor(typeMax = 100) {\n    // map element name -> [{properties, styleElement, scopeSelector}]\n    this.cache = {};\n    /** @type {number} */\n    this.typeMax = typeMax;\n  }\n\n  _validate(cacheEntry, properties, ownPropertyNames) {\n    for (let idx = 0; idx < ownPropertyNames.length; idx++) {\n      let pn = ownPropertyNames[idx];\n      if (cacheEntry.properties[pn] !== properties[pn]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  store(tagname, properties, styleElement, scopeSelector) {\n    let list = this.cache[tagname] || [];\n    list.push({properties, styleElement, scopeSelector});\n    if (list.length > this.typeMax) {\n      list.shift();\n    }\n    this.cache[tagname] = list;\n  }\n\n  fetch(tagname, properties, ownPropertyNames) {\n    let list = this.cache[tagname];\n    if (!list) {\n      return;\n    }\n    // reverse list for most-recent lookups\n    for (let idx = list.length - 1; idx >= 0; idx--) {\n      let entry = list[idx];\n      if (this._validate(entry, properties, ownPropertyNames)) {\n        return entry;\n      }\n    }\n  }\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\n/**\n * @const {!Object<string, !HTMLTemplateElement>}\n */\nconst templateMap = {};\nexport default templateMap;\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\nimport templateMap from './template-map.js';\nimport {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars\n\n/*\n * Utilities for handling invalidating apply-shim mixins for a given template.\n *\n * The invalidation strategy involves keeping track of the \"current\" version of a template's mixins, and updating that count when a mixin is invalidated.\n * The template\n */\n\n/** @const {string} */\nconst CURRENT_VERSION = '_applyShimCurrentVersion';\n\n/** @const {string} */\nconst NEXT_VERSION = '_applyShimNextVersion';\n\n/** @const {string} */\nconst VALIDATING_VERSION = '_applyShimValidatingVersion';\n\n/**\n * @const {Promise<void>}\n */\nconst promise = Promise.resolve();\n\n/**\n * @param {string} elementName\n */\nexport function invalidate(elementName){\n  let template = templateMap[elementName];\n  if (template) {\n    invalidateTemplate(template);\n  }\n}\n\n/**\n * This function can be called multiple times to mark a template invalid\n * and signal that the style inside must be regenerated.\n *\n * Use `startValidatingTemplate` to begin an asynchronous validation cycle.\n * During that cycle, call `templateIsValidating` to see if the template must\n * be revalidated\n * @param {HTMLTemplateElement} template\n */\nexport function invalidateTemplate(template) {\n  // default the current version to 0\n  template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;\n  // ensure the \"validating for\" flag exists\n  template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;\n  // increment the next version\n  template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValid(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    return templateIsValid(template);\n  }\n  return true;\n}\n\n/**\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValid(template) {\n  return template[CURRENT_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * @param {string} elementName\n * @return {boolean}\n */\nexport function isValidating(elementName) {\n  let template = templateMap[elementName];\n  if (template) {\n    return templateIsValidating(template);\n  }\n  return false;\n}\n\n/**\n * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.\n * If false, the template must be validated.\n * @param {HTMLTemplateElement} template\n * @return {boolean}\n */\nexport function templateIsValidating(template) {\n  return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];\n}\n\n/**\n * the template is marked as `validating` for one microtask so that all instances\n * found in the tree crawl of `applyStyle` will update themselves,\n * but the template will only be updated once.\n * @param {string} elementName\n*/\nexport function startValidating(elementName) {\n  let template = templateMap[elementName];\n  startValidatingTemplate(template);\n}\n\n/**\n * Begin an asynchronous invalidation cycle.\n * This should be called after every validation of a template\n *\n * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`\n * @param {HTMLTemplateElement} template\n */\nexport function startValidatingTemplate(template) {\n  // remember that the current \"next version\" is the reason for this validation cycle\n  template[VALIDATING_VERSION] = template[NEXT_VERSION];\n  // however, there only needs to be one async task to clear the counters\n  if (!template._validating) {\n    template._validating = true;\n    promise.then(function() {\n      // sync the current version to let future invalidations cause a refresh cycle\n      template[CURRENT_VERSION] = template[NEXT_VERSION];\n      template._validating = false;\n    });\n  }\n}\n\n/**\n * @return {boolean}\n */\nexport function elementsAreInvalid() {\n  for (let elementName in templateMap) {\n    let template = templateMap[elementName];\n    if (!templateIsValid(template)) {\n      return true;\n    }\n  }\n  return false;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';\n\n/**\n * @param {Element} element\n * @param {Object=} properties\n */\nexport function updateNativeProperties(element, properties) {\n  // remove previous properties\n  for (let p in properties) {\n    // NOTE: for bc with shim, don't apply null values.\n    if (p === null) {\n      element.style.removeProperty(p);\n    } else {\n      element.style.setProperty(p, properties[p]);\n    }\n  }\n}\n\n/**\n * @param {Element} element\n * @param {string} property\n * @return {string}\n */\nexport function getComputedStyleValue(element, property) {\n  /**\n   * @const {string}\n   */\n  const value = window.getComputedStyle(element).getPropertyValue(property);\n  if (!value) {\n    return '';\n  } else {\n    return value.trim();\n  }\n}\n\n/**\n * return true if `cssText` contains a mixin definition or consumption\n * @param {string} cssText\n * @return {boolean}\n */\nexport function detectMixin(cssText) {\n  const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);\n  // reset state of the regexes\n  MIXIN_MATCH.lastIndex = 0;\n  VAR_ASSIGN.lastIndex = 0;\n  return has;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\n'use strict';\n\nimport ScopingShim from '../src/scoping-shim.js';\nimport {nativeCssVariables, nativeShadow, cssBuild} from '../src/style-settings.js';\n\n/** @const {ScopingShim} */\nconst scopingShim = new ScopingShim();\n\nlet ApplyShim, CustomStyleInterface;\n\nif (window['ShadyCSS']) {\n  ApplyShim = window['ShadyCSS']['ApplyShim'];\n  CustomStyleInterface = window['ShadyCSS']['CustomStyleInterface'];\n}\n\nwindow.ShadyCSS = {\n  ScopingShim: scopingShim,\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   * @param {string=} elementExtends\n   */\n  prepareTemplate(template, elementName, elementExtends) {\n    scopingShim.flushCustomStyles();\n    scopingShim.prepareTemplate(template, elementName, elementExtends)\n  },\n\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   */\n  prepareTemplateDom(template, elementName) {\n    scopingShim.prepareTemplateDom(template, elementName);\n  },\n\n  /**\n   * @param {!HTMLTemplateElement} template\n   * @param {string} elementName\n   * @param {string=} elementExtends\n   */\n  prepareTemplateStyles(template, elementName, elementExtends) {\n    scopingShim.flushCustomStyles();\n    scopingShim.prepareTemplateStyles(template, elementName, elementExtends)\n  },\n  /**\n   * @param {!HTMLElement} element\n   * @param {Object=} properties\n   */\n  styleSubtree(element, properties) {\n    scopingShim.flushCustomStyles();\n    scopingShim.styleSubtree(element, properties);\n  },\n\n  /**\n   * @param {!HTMLElement} element\n   */\n  styleElement(element) {\n    scopingShim.flushCustomStyles();\n    scopingShim.styleElement(element);\n  },\n\n  /**\n   * @param {Object=} properties\n   */\n  styleDocument(properties) {\n    scopingShim.flushCustomStyles();\n    scopingShim.styleDocument(properties);\n  },\n\n  flushCustomStyles() {\n    scopingShim.flushCustomStyles();\n  },\n\n  /**\n   * @param {Element} element\n   * @param {string} property\n   * @return {string}\n   */\n  getComputedStyleValue(element, property) {\n    return scopingShim.getComputedStyleValue(element, property);\n  },\n\n  nativeCss: nativeCssVariables,\n\n  nativeShadow: nativeShadow,\n\n  cssBuild: cssBuild\n};\n\nif (ApplyShim) {\n  window.ShadyCSS.ApplyShim = ApplyShim;\n}\n\nif (CustomStyleInterface) {\n  window.ShadyCSS.CustomStyleInterface = CustomStyleInterface;\n}"]}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/apply-shim-utils.js b/systrace/catapult/third_party/polymer/components/shadycss/src/apply-shim-utils.js
deleted file mode 100644
index c5c27a2..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/apply-shim-utils.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-import templateMap from './template-map.js';
-import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
-
-/*
- * Utilities for handling invalidating apply-shim mixins for a given template.
- *
- * The invalidation strategy involves keeping track of the "current" version of a template's mixins, and updating that count when a mixin is invalidated.
- * The template
- */
-
-/** @const {string} */
-const CURRENT_VERSION = '_applyShimCurrentVersion';
-
-/** @const {string} */
-const NEXT_VERSION = '_applyShimNextVersion';
-
-/** @const {string} */
-const VALIDATING_VERSION = '_applyShimValidatingVersion';
-
-/**
- * @const {Promise<void>}
- */
-const promise = Promise.resolve();
-
-/**
- * @param {string} elementName
- */
-export function invalidate(elementName){
-  let template = templateMap[elementName];
-  if (template) {
-    invalidateTemplate(template);
-  }
-}
-
-/**
- * This function can be called multiple times to mark a template invalid
- * and signal that the style inside must be regenerated.
- *
- * Use `startValidatingTemplate` to begin an asynchronous validation cycle.
- * During that cycle, call `templateIsValidating` to see if the template must
- * be revalidated
- * @param {HTMLTemplateElement} template
- */
-export function invalidateTemplate(template) {
-  // default the current version to 0
-  template[CURRENT_VERSION] = template[CURRENT_VERSION] || 0;
-  // ensure the "validating for" flag exists
-  template[VALIDATING_VERSION] = template[VALIDATING_VERSION] || 0;
-  // increment the next version
-  template[NEXT_VERSION] = (template[NEXT_VERSION] || 0) + 1;
-}
-
-/**
- * @param {string} elementName
- * @return {boolean}
- */
-export function isValid(elementName) {
-  let template = templateMap[elementName];
-  if (template) {
-    return templateIsValid(template);
-  }
-  return true;
-}
-
-/**
- * @param {HTMLTemplateElement} template
- * @return {boolean}
- */
-export function templateIsValid(template) {
-  return template[CURRENT_VERSION] === template[NEXT_VERSION];
-}
-
-/**
- * @param {string} elementName
- * @return {boolean}
- */
-export function isValidating(elementName) {
-  let template = templateMap[elementName];
-  if (template) {
-    return templateIsValidating(template);
-  }
-  return false;
-}
-
-/**
- * Returns true if the template is currently invalid and `startValidating` has been called since the last invalidation.
- * If false, the template must be validated.
- * @param {HTMLTemplateElement} template
- * @return {boolean}
- */
-export function templateIsValidating(template) {
-  return !templateIsValid(template) && template[VALIDATING_VERSION] === template[NEXT_VERSION];
-}
-
-/**
- * the template is marked as `validating` for one microtask so that all instances
- * found in the tree crawl of `applyStyle` will update themselves,
- * but the template will only be updated once.
- * @param {string} elementName
-*/
-export function startValidating(elementName) {
-  let template = templateMap[elementName];
-  startValidatingTemplate(template);
-}
-
-/**
- * Begin an asynchronous invalidation cycle.
- * This should be called after every validation of a template
- *
- * After one microtask, the template will be marked as valid until the next call to `invalidateTemplate`
- * @param {HTMLTemplateElement} template
- */
-export function startValidatingTemplate(template) {
-  // remember that the current "next version" is the reason for this validation cycle
-  template[VALIDATING_VERSION] = template[NEXT_VERSION];
-  // however, there only needs to be one async task to clear the counters
-  if (!template._validating) {
-    template._validating = true;
-    promise.then(function() {
-      // sync the current version to let future invalidations cause a refresh cycle
-      template[CURRENT_VERSION] = template[NEXT_VERSION];
-      template._validating = false;
-    });
-  }
-}
-
-/**
- * @return {boolean}
- */
-export function elementsAreInvalid() {
-  for (let elementName in templateMap) {
-    let template = templateMap[elementName];
-    if (!templateIsValid(template)) {
-      return true;
-    }
-  }
-  return false;
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/apply-shim.js b/systrace/catapult/third_party/polymer/components/shadycss/src/apply-shim.js
deleted file mode 100644
index e4bc9cd..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/apply-shim.js
+++ /dev/null
@@ -1,525 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-/*
- * The apply shim simulates the behavior of `@apply` proposed at
- * https://tabatkins.github.io/specs/css-apply-rule/.
- * The approach is to convert a property like this:
- *
- *    --foo: {color: red; background: blue;}
- *
- * to this:
- *
- *    --foo_-_color: red;
- *    --foo_-_background: blue;
- *
- * Then where `@apply --foo` is used, that is converted to:
- *
- *    color: var(--foo_-_color);
- *    background: var(--foo_-_background);
- *
- * This approach generally works but there are some issues and limitations.
- * Consider, for example, that somewhere *between* where `--foo` is set and used,
- * another element sets it to:
- *
- *    --foo: { border: 2px solid red; }
- *
- * We must now ensure that the color and background from the previous setting
- * do not apply. This is accomplished by changing the property set to this:
- *
- *    --foo_-_border: 2px solid red;
- *    --foo_-_color: initial;
- *    --foo_-_background: initial;
- *
- * This works but introduces one new issue.
- * Consider this setup at the point where the `@apply` is used:
- *
- *    background: orange;
- *    `@apply` --foo;
- *
- * In this case the background will be unset (initial) rather than the desired
- * `orange`. We address this by altering the property set to use a fallback
- * value like this:
- *
- *    color: var(--foo_-_color);
- *    background: var(--foo_-_background, orange);
- *    border: var(--foo_-_border);
- *
- * Note that the default is retained in the property set and the `background` is
- * the desired `orange`. This leads us to a limitation.
- *
- * Limitation 1:
-
- * Only properties in the rule where the `@apply`
- * is used are considered as default values.
- * If another rule matches the element and sets `background` with
- * less specificity than the rule in which `@apply` appears,
- * the `background` will not be set.
- *
- * Limitation 2:
- *
- * When using Polymer's `updateStyles` api, new properties may not be set for
- * `@apply` properties.
-
-*/
-
-'use strict';
-
-import {forEachRule, processVariableAndFallback, rulesForStyle, toCssText, gatherStyleText} from './style-util.js';
-import {MIXIN_MATCH, VAR_ASSIGN} from './common-regex.js';
-import {detectMixin} from './common-utils.js';
-import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
-
-const APPLY_NAME_CLEAN = /;\s*/m;
-const INITIAL_INHERIT = /^\s*(initial)|(inherit)\s*$/;
-const IMPORTANT = /\s*!important/;
-
-// separator used between mixin-name and mixin-property-name when producing properties
-// NOTE: plain '-' may cause collisions in user styles
-const MIXIN_VAR_SEP = '_-_';
-
-/**
- * @typedef {!Object<string, string>}
- */
-let PropertyEntry; // eslint-disable-line no-unused-vars
-
-/**
- * @typedef {!Object<string, boolean>}
- */
-let DependantsEntry; // eslint-disable-line no-unused-vars
-
-/** @typedef {{
- *    properties: PropertyEntry,
- *    dependants: DependantsEntry
- * }}
- */
-let MixinMapEntry; // eslint-disable-line no-unused-vars
-
-// map of mixin to property names
-// --foo: {border: 2px} -> {properties: {(--foo, ['border'])}, dependants: {'element-name': proto}}
-class MixinMap {
-  constructor() {
-    /** @type {!Object<string, !MixinMapEntry>} */
-    this._map = {};
-  }
-  /**
-   * @param {string} name
-   * @param {!PropertyEntry} props
-   */
-  set(name, props) {
-    name = name.trim();
-    this._map[name] = {
-      properties: props,
-      dependants: {}
-    }
-  }
-  /**
-   * @param {string} name
-   * @return {MixinMapEntry}
-   */
-  get(name) {
-    name = name.trim();
-    return this._map[name] || null;
-  }
-}
-
-/**
- * Callback for when an element is marked invalid
- * @type {?function(string)}
- */
-let invalidCallback = null;
-
-/** @unrestricted */
-class ApplyShim {
-  constructor() {
-    /** @type {?string} */
-    this._currentElement = null;
-    /** @type {HTMLMetaElement} */
-    this._measureElement = null;
-    this._map = new MixinMap();
-  }
-  /**
-   * return true if `cssText` contains a mixin definition or consumption
-   * @param {string} cssText
-   * @return {boolean}
-   */
-  detectMixin(cssText) {
-    return detectMixin(cssText);
-  }
-
-  /**
-   * Gather styles into one style for easier processing
-   * @param {!HTMLTemplateElement} template
-   * @return {HTMLStyleElement}
-   */
-  gatherStyles(template) {
-    const styleText = gatherStyleText(template.content);
-    if (styleText) {
-      const style = /** @type {!HTMLStyleElement} */(document.createElement('style'));
-      style.textContent = styleText;
-      template.content.insertBefore(style, template.content.firstChild);
-      return style;
-    }
-    return null;
-  }
-  /**
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   * @return {StyleNode}
-   */
-  transformTemplate(template, elementName) {
-    if (template._gatheredStyle === undefined) {
-      template._gatheredStyle = this.gatherStyles(template);
-    }
-    /** @type {HTMLStyleElement} */
-    const style = template._gatheredStyle;
-    return style ? this.transformStyle(style, elementName) : null;
-  }
-  /**
-   * @param {!HTMLStyleElement} style
-   * @param {string} elementName
-   * @return {StyleNode}
-   */
-  transformStyle(style, elementName = '') {
-    let ast = rulesForStyle(style);
-    this.transformRules(ast, elementName);
-    style.textContent = toCssText(ast);
-    return ast;
-  }
-  /**
-   * @param {!HTMLStyleElement} style
-   * @return {StyleNode}
-   */
-  transformCustomStyle(style) {
-    let ast = rulesForStyle(style);
-    forEachRule(ast, (rule) => {
-      if (rule['selector'] === ':root') {
-        rule['selector'] = 'html';
-      }
-      this.transformRule(rule);
-    })
-    style.textContent = toCssText(ast);
-    return ast;
-  }
-  /**
-   * @param {StyleNode} rules
-   * @param {string} elementName
-   */
-  transformRules(rules, elementName) {
-    this._currentElement = elementName;
-    forEachRule(rules, (r) => {
-      this.transformRule(r);
-    });
-    this._currentElement = null;
-  }
-  /**
-   * @param {!StyleNode} rule
-   */
-  transformRule(rule) {
-    rule['cssText'] = this.transformCssText(rule['parsedCssText'], rule);
-    // :root was only used for variable assignment in property shim,
-    // but generates invalid selectors with real properties.
-    // replace with `:host > *`, which serves the same effect
-    if (rule['selector'] === ':root') {
-      rule['selector'] = ':host > *';
-    }
-  }
-  /**
-   * @param {string} cssText
-   * @param {!StyleNode} rule
-   * @return {string}
-   */
-  transformCssText(cssText, rule) {
-    // produce variables
-    cssText = cssText.replace(VAR_ASSIGN, (matchText, propertyName, valueProperty, valueMixin) =>
-      this._produceCssProperties(matchText, propertyName, valueProperty, valueMixin, rule));
-    // consume mixins
-    return this._consumeCssProperties(cssText, rule);
-  }
-  /**
-   * @param {string} property
-   * @return {string}
-   */
-  _getInitialValueForProperty(property) {
-    if (!this._measureElement) {
-      this._measureElement = /** @type {HTMLMetaElement} */(document.createElement('meta'));
-      this._measureElement.setAttribute('apply-shim-measure', '');
-      this._measureElement.style.all = 'initial';
-      document.head.appendChild(this._measureElement);
-    }
-    return window.getComputedStyle(this._measureElement).getPropertyValue(property);
-  }
-  /**
-   * Walk over all rules before this rule to find fallbacks for mixins
-   *
-   * @param {!StyleNode} startRule
-   * @return {!Object}
-   */
-  _fallbacksFromPreviousRules(startRule) {
-    // find the "top" rule
-    let topRule = startRule;
-    while (topRule['parent']) {
-      topRule = topRule['parent'];
-    }
-    const fallbacks = {};
-    let seenStartRule = false;
-    forEachRule(topRule, (r) => {
-      // stop when we hit the input rule
-      seenStartRule = seenStartRule || r === startRule;
-      if (seenStartRule) {
-        return;
-      }
-      // NOTE: Only matching selectors are "safe" for this fallback processing
-      // It would be prohibitive to run `matchesSelector()` on each selector,
-      // so we cheat and only check if the same selector string is used, which
-      // guarantees things like specificity matching
-      if (r['selector'] === startRule['selector']) {
-        Object.assign(fallbacks, this._cssTextToMap(r['parsedCssText']));
-      }
-    });
-    return fallbacks;
-  }
-  /**
-   * replace mixin consumption with variable consumption
-   * @param {string} text
-   * @param {!StyleNode=} rule
-   * @return {string}
-   */
-  _consumeCssProperties(text, rule) {
-    /** @type {Array} */
-    let m = null;
-    // loop over text until all mixins with defintions have been applied
-    while((m = MIXIN_MATCH.exec(text))) {
-      let matchText = m[0];
-      let mixinName = m[1];
-      let idx = m.index;
-      // collect properties before apply to be "defaults" if mixin might override them
-      // match includes a "prefix", so find the start and end positions of @apply
-      let applyPos = idx + matchText.indexOf('@apply');
-      let afterApplyPos = idx + matchText.length;
-      // find props defined before this @apply
-      let textBeforeApply = text.slice(0, applyPos);
-      let textAfterApply = text.slice(afterApplyPos);
-      let defaults = rule ? this._fallbacksFromPreviousRules(rule) : {};
-      Object.assign(defaults, this._cssTextToMap(textBeforeApply));
-      let replacement = this._atApplyToCssProperties(mixinName, defaults);
-      // use regex match position to replace mixin, keep linear processing time
-      text = `${textBeforeApply}${replacement}${textAfterApply}`;
-      // move regex search to _after_ replacement
-      MIXIN_MATCH.lastIndex = idx + replacement.length;
-    }
-    return text;
-  }
-  /**
-   * produce variable consumption at the site of mixin consumption
-   * `@apply` --foo; -> for all props (${propname}: var(--foo_-_${propname}, ${fallback[propname]}}))
-   * Example:
-   *  border: var(--foo_-_border); padding: var(--foo_-_padding, 2px)
-   *
-   * @param {string} mixinName
-   * @param {Object} fallbacks
-   * @return {string}
-   */
-  _atApplyToCssProperties(mixinName, fallbacks) {
-    mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');
-    let vars = [];
-    let mixinEntry = this._map.get(mixinName);
-    // if we depend on a mixin before it is created
-    // make a sentinel entry in the map to add this element as a dependency for when it is defined.
-    if (!mixinEntry) {
-      this._map.set(mixinName, {});
-      mixinEntry = this._map.get(mixinName);
-    }
-    if (mixinEntry) {
-      if (this._currentElement) {
-        mixinEntry.dependants[this._currentElement] = true;
-      }
-      let p, parts, f;
-      const properties = mixinEntry.properties;
-      for (p in properties) {
-        f = fallbacks && fallbacks[p];
-        parts = [p, ': var(', mixinName, MIXIN_VAR_SEP, p];
-        if (f) {
-          parts.push(',', f.replace(IMPORTANT, ''));
-        }
-        parts.push(')');
-        if (IMPORTANT.test(properties[p])) {
-          parts.push(' !important');
-        }
-        vars.push(parts.join(''));
-      }
-    }
-    return vars.join('; ');
-  }
-
-  /**
-   * @param {string} property
-   * @param {string} value
-   * @return {string}
-   */
-  _replaceInitialOrInherit(property, value) {
-    let match = INITIAL_INHERIT.exec(value);
-    if (match) {
-      if (match[1]) {
-        // initial
-        // replace `initial` with the concrete initial value for this property
-        value = this._getInitialValueForProperty(property);
-      } else {
-        // inherit
-        // with this purposfully illegal value, the variable will be invalid at
-        // compute time (https://www.w3.org/TR/css-variables/#invalid-at-computed-value-time)
-        // and for inheriting values, will behave similarly
-        // we cannot support the same behavior for non inheriting values like 'border'
-        value = 'apply-shim-inherit';
-      }
-    }
-    return value;
-  }
-
-  /**
-   * "parse" a mixin definition into a map of properties and values
-   * cssTextToMap('border: 2px solid black') -> ('border', '2px solid black')
-   * @param {string} text
-   * @param {boolean=} replaceInitialOrInherit
-   * @return {!Object<string, string>}
-   */
-  _cssTextToMap(text, replaceInitialOrInherit = false) {
-    let props = text.split(';');
-    let property, value;
-    let out = {};
-    for (let i = 0, p, sp; i < props.length; i++) {
-      p = props[i];
-      if (p) {
-        sp = p.split(':');
-        // ignore lines that aren't definitions like @media
-        if (sp.length > 1) {
-          property = sp[0].trim();
-          // some properties may have ':' in the value, like data urls
-          value = sp.slice(1).join(':');
-          if (replaceInitialOrInherit) {
-            value = this._replaceInitialOrInherit(property, value);
-          }
-          out[property] = value;
-        }
-      }
-    }
-    return out;
-  }
-
-  /**
-   * @param {MixinMapEntry} mixinEntry
-   */
-  _invalidateMixinEntry(mixinEntry) {
-    if (!invalidCallback) {
-      return;
-    }
-    for (let elementName in mixinEntry.dependants) {
-      if (elementName !== this._currentElement) {
-        invalidCallback(elementName);
-      }
-    }
-  }
-
-  /**
-   * @param {string} matchText
-   * @param {string} propertyName
-   * @param {?string} valueProperty
-   * @param {?string} valueMixin
-   * @param {!StyleNode} rule
-   * @return {string}
-   */
-  _produceCssProperties(matchText, propertyName, valueProperty, valueMixin, rule) {
-    // handle case where property value is a mixin
-    if (valueProperty) {
-      // form: --mixin2: var(--mixin1), where --mixin1 is in the map
-      processVariableAndFallback(valueProperty, (prefix, value) => {
-        if (value && this._map.get(value)) {
-          valueMixin = `@apply ${value};`
-        }
-      });
-    }
-    if (!valueMixin) {
-      return matchText;
-    }
-    let mixinAsProperties = this._consumeCssProperties('' + valueMixin, rule);
-    let prefix = matchText.slice(0, matchText.indexOf('--'));
-    // `initial` and `inherit` as properties in a map should be replaced because
-    // these keywords are eagerly evaluated when the mixin becomes CSS Custom Properties,
-    // and would set the variable value, rather than carry the keyword to the `var()` usage.
-    let mixinValues = this._cssTextToMap(mixinAsProperties, true);
-    let combinedProps = mixinValues;
-    let mixinEntry = this._map.get(propertyName);
-    let oldProps = mixinEntry && mixinEntry.properties;
-    if (oldProps) {
-      // NOTE: since we use mixin, the map of properties is updated here
-      // and this is what we want.
-      combinedProps = Object.assign(Object.create(oldProps), mixinValues);
-    } else {
-      this._map.set(propertyName, combinedProps);
-    }
-    let out = [];
-    let p, v;
-    // set variables defined by current mixin
-    let needToInvalidate = false;
-    for (p in combinedProps) {
-      v = mixinValues[p];
-      // if property not defined by current mixin, set initial
-      if (v === undefined) {
-        v = 'initial';
-      }
-      if (oldProps && !(p in oldProps)) {
-        needToInvalidate = true;
-      }
-      out.push(`${propertyName}${MIXIN_VAR_SEP}${p}: ${v}`);
-    }
-    if (needToInvalidate) {
-      this._invalidateMixinEntry(mixinEntry);
-    }
-    if (mixinEntry) {
-      mixinEntry.properties = combinedProps;
-    }
-    // because the mixinMap is global, the mixin might conflict with
-    // a different scope's simple variable definition:
-    // Example:
-    // some style somewhere:
-    // --mixin1:{ ... }
-    // --mixin2: var(--mixin1);
-    // some other element:
-    // --mixin1: 10px solid red;
-    // --foo: var(--mixin1);
-    // In this case, we leave the original variable definition in place.
-    if (valueProperty) {
-      prefix = `${matchText};${prefix}`;
-    }
-    return `${prefix}${out.join('; ')};`;
-  }
-}
-
-/* exports */
-/* eslint-disable no-self-assign */
-ApplyShim.prototype['detectMixin'] = ApplyShim.prototype.detectMixin;
-ApplyShim.prototype['transformStyle'] = ApplyShim.prototype.transformStyle;
-ApplyShim.prototype['transformCustomStyle'] = ApplyShim.prototype.transformCustomStyle;
-ApplyShim.prototype['transformRules'] = ApplyShim.prototype.transformRules;
-ApplyShim.prototype['transformRule'] = ApplyShim.prototype.transformRule;
-ApplyShim.prototype['transformTemplate'] = ApplyShim.prototype.transformTemplate;
-ApplyShim.prototype['_separator'] = MIXIN_VAR_SEP;
-/* eslint-enable no-self-assign */
-Object.defineProperty(ApplyShim.prototype, 'invalidCallback', {
-  /** @return {?function(string)} */
-  get() {
-    return invalidCallback;
-  },
-  /** @param {?function(string)} cb */
-  set(cb) {
-    invalidCallback = cb;
-  }
-});
-
-export default ApplyShim;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/common-regex.js b/systrace/catapult/third_party/polymer/components/shadycss/src/common-regex.js
deleted file mode 100644
index 126fc15..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/common-regex.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-export const VAR_ASSIGN = /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi;
-export const MIXIN_MATCH = /(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi;
-export const VAR_CONSUMED = /(--[\w-]+)\s*([:,;)]|$)/gi;
-export const ANIMATION_MATCH = /(animation\s*:)|(animation-name\s*:)/;
-export const MEDIA_MATCH = /@media\s(.*)/;
-export const IS_VAR = /^--/;
-export const BRACKETED = /\{[^}]*\}/g;
-export const HOST_PREFIX = '(?:^|[^.#[:])';
-export const HOST_SUFFIX = '($|[.:[\\s>+~])';
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/common-utils.js b/systrace/catapult/third_party/polymer/components/shadycss/src/common-utils.js
deleted file mode 100644
index 863250b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/common-utils.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import { MIXIN_MATCH, VAR_ASSIGN } from './common-regex.js';
-
-/**
- * @param {Element} element
- * @param {Object=} properties
- */
-export function updateNativeProperties(element, properties) {
-  // remove previous properties
-  for (let p in properties) {
-    // NOTE: for bc with shim, don't apply null values.
-    if (p === null) {
-      element.style.removeProperty(p);
-    } else {
-      element.style.setProperty(p, properties[p]);
-    }
-  }
-}
-
-/**
- * @param {Element} element
- * @param {string} property
- * @return {string}
- */
-export function getComputedStyleValue(element, property) {
-  /**
-   * @const {string}
-   */
-  const value = window.getComputedStyle(element).getPropertyValue(property);
-  if (!value) {
-    return '';
-  } else {
-    return value.trim();
-  }
-}
-
-/**
- * return true if `cssText` contains a mixin definition or consumption
- * @param {string} cssText
- * @return {boolean}
- */
-export function detectMixin(cssText) {
-  const has = MIXIN_MATCH.test(cssText) || VAR_ASSIGN.test(cssText);
-  // reset state of the regexes
-  MIXIN_MATCH.lastIndex = 0;
-  VAR_ASSIGN.lastIndex = 0;
-  return has;
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/css-parse.js b/systrace/catapult/third_party/polymer/components/shadycss/src/css-parse.js
deleted file mode 100644
index 8a8fb1c..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/css-parse.js
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-Extremely simple css parser. Intended to be not more than what we need
-and definitely not necessarily correct =).
-*/
-
-'use strict';
-
-/** @unrestricted */
-class StyleNode {
-  constructor() {
-    /** @type {number} */
-    this['start'] = 0;
-    /** @type {number} */
-    this['end'] = 0;
-    /** @type {StyleNode} */
-    this['previous'] = null;
-    /** @type {StyleNode} */
-    this['parent'] = null;
-    /** @type {Array<StyleNode>} */
-    this['rules'] = null;
-    /** @type {string} */
-    this['parsedCssText'] = '';
-    /** @type {string} */
-    this['cssText'] = '';
-    /** @type {boolean} */
-    this['atRule'] = false;
-    /** @type {number} */
-    this['type'] = 0;
-    /** @type {string} */
-    this['keyframesName'] = '';
-    /** @type {string} */
-    this['selector'] = '';
-    /** @type {string} */
-    this['parsedSelector'] = '';
-  }
-}
-
-export {StyleNode}
-
-// given a string of css, return a simple rule tree
-/**
- * @param {string} text
- * @return {StyleNode}
- */
-export function parse(text) {
-  text = clean(text);
-  return parseCss(lex(text), text);
-}
-
-// remove stuff we don't care about that may hinder parsing
-/**
- * @param {string} cssText
- * @return {string}
- */
-function clean(cssText) {
-  return cssText.replace(RX.comments, '').replace(RX.port, '');
-}
-
-// super simple {...} lexer that returns a node tree
-/**
- * @param {string} text
- * @return {StyleNode}
- */
-function lex(text) {
-  let root = new StyleNode();
-  root['start'] = 0;
-  root['end'] = text.length
-  let n = root;
-  for (let i = 0, l = text.length; i < l; i++) {
-    if (text[i] === OPEN_BRACE) {
-      if (!n['rules']) {
-        n['rules'] = [];
-      }
-      let p = n;
-      let previous = p['rules'][p['rules'].length - 1] || null;
-      n = new StyleNode();
-      n['start'] = i + 1;
-      n['parent'] = p;
-      n['previous'] = previous;
-      p['rules'].push(n);
-    } else if (text[i] === CLOSE_BRACE) {
-      n['end'] = i + 1;
-      n = n['parent'] || root;
-    }
-  }
-  return root;
-}
-
-// add selectors/cssText to node tree
-/**
- * @param {StyleNode} node
- * @param {string} text
- * @return {StyleNode}
- */
-function parseCss(node, text) {
-  let t = text.substring(node['start'], node['end'] - 1);
-  node['parsedCssText'] = node['cssText'] = t.trim();
-  if (node['parent']) {
-    let ss = node['previous'] ? node['previous']['end'] : node['parent']['start'];
-    t = text.substring(ss, node['start'] - 1);
-    t = _expandUnicodeEscapes(t);
-    t = t.replace(RX.multipleSpaces, ' ');
-    // TODO(sorvell): ad hoc; make selector include only after last ;
-    // helps with mixin syntax
-    t = t.substring(t.lastIndexOf(';') + 1);
-    let s = node['parsedSelector'] = node['selector'] = t.trim();
-    node['atRule'] = (s.indexOf(AT_START) === 0);
-    // note, support a subset of rule types...
-    if (node['atRule']) {
-      if (s.indexOf(MEDIA_START) === 0) {
-        node['type'] = types.MEDIA_RULE;
-      } else if (s.match(RX.keyframesRule)) {
-        node['type'] = types.KEYFRAMES_RULE;
-        node['keyframesName'] =
-          node['selector'].split(RX.multipleSpaces).pop();
-      }
-    } else {
-      if (s.indexOf(VAR_START) === 0) {
-        node['type'] = types.MIXIN_RULE;
-      } else {
-        node['type'] = types.STYLE_RULE;
-      }
-    }
-  }
-  let r$ = node['rules'];
-  if (r$) {
-    for (let i = 0, l = r$.length, r;
-      (i < l) && (r = r$[i]); i++) {
-      parseCss(r, text);
-    }
-  }
-  return node;
-}
-
-/**
- * conversion of sort unicode escapes with spaces like `\33 ` (and longer) into
- * expanded form that doesn't require trailing space `\000033`
- * @param {string} s
- * @return {string}
- */
-function _expandUnicodeEscapes(s) {
-  return s.replace(/\\([0-9a-f]{1,6})\s/gi, function() {
-    let code = arguments[1],
-      repeat = 6 - code.length;
-    while (repeat--) {
-      code = '0' + code;
-    }
-    return '\\' + code;
-  });
-}
-
-/**
- * stringify parsed css.
- * @param {StyleNode} node
- * @param {boolean=} preserveProperties
- * @param {string=} text
- * @return {string}
- */
-export function stringify(node, preserveProperties, text = '') {
-  // calc rule cssText
-  let cssText = '';
-  if (node['cssText'] || node['rules']) {
-    let r$ = node['rules'];
-    if (r$ && !_hasMixinRules(r$)) {
-      for (let i = 0, l = r$.length, r;
-        (i < l) && (r = r$[i]); i++) {
-        cssText = stringify(r, preserveProperties, cssText);
-      }
-    } else {
-      cssText = preserveProperties ? node['cssText'] :
-        removeCustomProps(node['cssText']);
-      cssText = cssText.trim();
-      if (cssText) {
-        cssText = '  ' + cssText + '\n';
-      }
-    }
-  }
-  // emit rule if there is cssText
-  if (cssText) {
-    if (node['selector']) {
-      text += node['selector'] + ' ' + OPEN_BRACE + '\n';
-    }
-    text += cssText;
-    if (node['selector']) {
-      text += CLOSE_BRACE + '\n\n';
-    }
-  }
-  return text;
-}
-
-/**
- * @param {Array<StyleNode>} rules
- * @return {boolean}
- */
-function _hasMixinRules(rules) {
-  let r = rules[0];
-  return Boolean(r) && Boolean(r['selector']) && r['selector'].indexOf(VAR_START) === 0;
-}
-
-/**
- * @param {string} cssText
- * @return {string}
- */
-function removeCustomProps(cssText) {
-  cssText = removeCustomPropAssignment(cssText);
-  return removeCustomPropApply(cssText);
-}
-
-/**
- * @param {string} cssText
- * @return {string}
- */
-export function removeCustomPropAssignment(cssText) {
-  return cssText
-    .replace(RX.customProp, '')
-    .replace(RX.mixinProp, '');
-}
-
-/**
- * @param {string} cssText
- * @return {string}
- */
-function removeCustomPropApply(cssText) {
-  return cssText
-    .replace(RX.mixinApply, '')
-    .replace(RX.varApply, '');
-}
-
-/** @enum {number} */
-export const types = {
-  STYLE_RULE: 1,
-  KEYFRAMES_RULE: 7,
-  MEDIA_RULE: 4,
-  MIXIN_RULE: 1000
-}
-
-const OPEN_BRACE = '{';
-const CLOSE_BRACE = '}';
-
-// helper regexp's
-const RX = {
-  comments: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
-  port: /@import[^;]*;/gim,
-  customProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,
-  mixinProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,
-  mixinApply: /@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,
-  varApply: /[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,
-  keyframesRule: /^@[^\s]*keyframes/,
-  multipleSpaces: /\s+/g
-}
-
-const VAR_START = '--';
-const MEDIA_START = '@media';
-const AT_START = '@';
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/custom-style-interface.js b/systrace/catapult/third_party/polymer/components/shadycss/src/custom-style-interface.js
deleted file mode 100644
index 257433b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/custom-style-interface.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import documentWait from './document-wait.js';
-
-/**
- * @typedef {HTMLStyleElement | {getStyle: function():HTMLStyleElement}}
- */
-export let CustomStyleProvider;
-
-const SEEN_MARKER = '__seenByShadyCSS';
-const CACHED_STYLE = '__shadyCSSCachedStyle';
-
-/** @type {?function(!HTMLStyleElement)} */
-let transformFn = null;
-
-/** @type {?function()} */
-let validateFn = null;
-
-/**
-This interface is provided to add document-level <style> elements to ShadyCSS for processing.
-These styles must be processed by ShadyCSS to simulate ShadowRoot upper-bound encapsulation from outside styles
-In addition, these styles may also need to be processed for @apply rules and CSS Custom Properties
-
-To add document-level styles to ShadyCSS, one can call `ShadyCSS.addDocumentStyle(styleElement)` or `ShadyCSS.addDocumentStyle({getStyle: () => styleElement})`
-
-In addition, if the process used to discover document-level styles can be synchronously flushed, one should set `ShadyCSS.documentStyleFlush`.
-This function will be called when calculating styles.
-
-An example usage of the document-level styling api can be found in `examples/document-style-lib.js`
-
-@unrestricted
-*/
-export default class CustomStyleInterface {
-  constructor() {
-    /** @type {!Array<!CustomStyleProvider>} */
-    this['customStyles'] = [];
-    this['enqueued'] = false;
-    // NOTE(dfreedm): use quotes here to prevent closure inlining to `function(){}`;
-    documentWait(() => {
-      if (window['ShadyCSS']['flushCustomStyles']) {
-        window['ShadyCSS']['flushCustomStyles']();
-      }
-    })
-  }
-  /**
-   * Queue a validation for new custom styles to batch style recalculations
-   */
-  enqueueDocumentValidation() {
-    if (this['enqueued'] || !validateFn) {
-      return;
-    }
-    this['enqueued'] = true;
-    documentWait(validateFn);
-  }
-  /**
-   * @param {!HTMLStyleElement} style
-   */
-  addCustomStyle(style) {
-    if (!style[SEEN_MARKER]) {
-      style[SEEN_MARKER] = true;
-      this['customStyles'].push(style);
-      this.enqueueDocumentValidation();
-    }
-  }
-  /**
-   * @param {!CustomStyleProvider} customStyle
-   * @return {HTMLStyleElement}
-   */
-  getStyleForCustomStyle(customStyle) {
-    if (customStyle[CACHED_STYLE]) {
-      return customStyle[CACHED_STYLE];
-    }
-    let style;
-    if (customStyle['getStyle']) {
-      style = customStyle['getStyle']();
-    } else {
-      style = customStyle;
-    }
-    return style;
-  }
-  /**
-   * @return {!Array<!CustomStyleProvider>}
-   */
-  processStyles() {
-    const cs = this['customStyles'];
-    for (let i = 0; i < cs.length; i++) {
-      const customStyle = cs[i];
-      if (customStyle[CACHED_STYLE]) {
-        continue;
-      }
-      const style = this.getStyleForCustomStyle(customStyle);
-      if (style) {
-        // HTMLImports polyfill may have cloned the style into the main document,
-        // which is referenced with __appliedElement.
-        const styleToTransform = /** @type {!HTMLStyleElement} */(style['__appliedElement'] || style);
-        if (transformFn) {
-          transformFn(styleToTransform);
-        }
-        customStyle[CACHED_STYLE] = styleToTransform;
-      }
-    }
-    return cs;
-  }
-}
-
-/* eslint-disable no-self-assign */
-CustomStyleInterface.prototype['addCustomStyle'] = CustomStyleInterface.prototype.addCustomStyle;
-CustomStyleInterface.prototype['getStyleForCustomStyle'] = CustomStyleInterface.prototype.getStyleForCustomStyle;
-CustomStyleInterface.prototype['processStyles'] = CustomStyleInterface.prototype.processStyles;
-/* eslint-enable no-self-assign */
-
-Object.defineProperties(CustomStyleInterface.prototype, {
-  'transformCallback': {
-    /** @return {?function(!HTMLStyleElement)} */
-    get() {
-      return transformFn;
-    },
-    /** @param {?function(!HTMLStyleElement)} fn */
-    set(fn) {
-      transformFn = fn;
-    }
-  },
-  'validateCallback': {
-    /** @return {?function()} */
-    get() {
-      return validateFn;
-    },
-    /**
-     * @param {?function()} fn
-     * @this {CustomStyleInterface}
-     */
-    set(fn) {
-      let needsEnqueue = false;
-      if (!validateFn) {
-        needsEnqueue = true;
-      }
-      validateFn = fn;
-      if (needsEnqueue) {
-        this.enqueueDocumentValidation();
-      }
-    },
-  }
-})
-
-/** @typedef {{
- * customStyles: !Array<!CustomStyleProvider>,
- * addCustomStyle: function(!CustomStyleProvider),
- * getStyleForCustomStyle: function(!CustomStyleProvider): HTMLStyleElement,
- * findStyles: function(),
- * transformCallback: ?function(!HTMLStyleElement),
- * validateCallback: ?function()
- * }}
- */
-export const CustomStyleInterfaceInterface = {};
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/document-wait.js b/systrace/catapult/third_party/polymer/components/shadycss/src/document-wait.js
deleted file mode 100644
index 398ca05..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/document-wait.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-/** @type {Promise<void>} */
-let readyPromise = null;
-
-/** @type {?function(?function())} */
-let whenReady = window['HTMLImports'] && window['HTMLImports']['whenReady'] || null;
-
-/** @type {function()} */
-let resolveFn;
-
-/**
- * @param {?function()} callback
- */
-export default function documentWait(callback) {
-  requestAnimationFrame(function() {
-    if (whenReady) {
-      whenReady(callback)
-    } else {
-      if (!readyPromise) {
-        readyPromise = new Promise((resolve) => {resolveFn = resolve});
-        if (document.readyState === 'complete') {
-          resolveFn();
-        } else {
-          document.addEventListener('readystatechange', () => {
-            if (document.readyState === 'complete') {
-              resolveFn();
-            }
-          });
-        }
-      }
-      readyPromise.then(function(){ callback && callback(); });
-    }
-  });
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/document-watcher.js b/systrace/catapult/third_party/polymer/components/shadycss/src/document-watcher.js
deleted file mode 100644
index 9cf34f0..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/document-watcher.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {nativeShadow} from './style-settings.js';
-import StyleTransformer from './style-transformer.js';
-import {getIsExtends, elementHasBuiltCss, wrap} from './style-util.js';
-
-export let flush = function() {};
-
-/**
- * @param {!Element} element
- * @return {string}
- */
-function getClasses(element) {
-  if (element.classList && element.classList.value) {
-    return element.classList.value;
-  } else {
-    // NOTE: className is patched to remove scoping classes in ShadyDOM
-    // use getAttribute('class') instead, which is unpatched
-    return element.getAttribute('class') || '';
-  }
-}
-
-const scopeRegExp = new RegExp(`${StyleTransformer.SCOPE_NAME}\\s*([^\\s]*)`);
-
-/**
- * @param {!Element} element
- * @return {string}
- */
-export function getCurrentScope(element) {
-  const match = getClasses(element).match(scopeRegExp);
-  if (match) {
-    return match[1];
-  } else {
-    return '';
-  }
-}
-
-/**
- * @param {!Node} node
- */
-export function getOwnerScope(node) {
-  const ownerRoot = wrap(node).getRootNode();
-  if (ownerRoot === node || ownerRoot === node.ownerDocument) {
-    return '';
-  }
-  const host = /** @type {!ShadowRoot} */(ownerRoot).host;
-  if (!host) {
-    // this may actually be a document fragment
-    return '';
-  }
-  return getIsExtends(host).is;
-}
-
-/**
- * @param {!Element} element
- */
-export function ensureCorrectScope(element) {
-  const currentScope = getCurrentScope(element);
-  const ownerRoot = wrap(element).getRootNode();
-  if (ownerRoot === element) {
-    return;
-  }
-  if (currentScope && ownerRoot === element.ownerDocument) {
-    // node was scoped, but now is in document
-    StyleTransformer.domRemoveScope(element, currentScope);
-  } else if (ownerRoot instanceof ShadowRoot) {
-    const ownerScope = getOwnerScope(element);
-    if (ownerScope !== currentScope) {
-      // node was scoped, but not by its current owner
-      StyleTransformer.domReplaceScope(element, currentScope, ownerScope);
-    }
-  }
-}
-
-/**
- * @param {!HTMLElement|!HTMLDocument} element
- */
-export function ensureCorrectSubtreeScoping(element) {
-  // find unscoped subtree nodes
-  const unscopedNodes = window['ShadyDOM']['nativeMethods']['querySelectorAll'].call(
-    element, `:not(.${StyleTransformer.SCOPE_NAME})`);
-
-  for (let j = 0; j < unscopedNodes.length; j++) {
-    // it's possible, during large batch inserts, that nodes that aren't
-    // scoped within the current scope were added.
-    // To make sure that any unscoped nodes that were inserted in the current batch are correctly styled,
-    // query all unscoped nodes and force their style-scope to be applied.
-    // This could happen if a sub-element appended an unscoped node in its shadowroot and this function
-    // runs on a parent element of the host of that unscoped node:
-    // parent-element -> element -> unscoped node
-    // Here unscoped node should have the style-scope element, not parent-element.
-    const unscopedNode = unscopedNodes[j];
-    const scopeForPreviouslyUnscopedNode = getOwnerScope(unscopedNode);
-    if (scopeForPreviouslyUnscopedNode) {
-      StyleTransformer.element(unscopedNode, scopeForPreviouslyUnscopedNode);
-    }
-  }
-}
-
-/**
- * @param {HTMLElement} el
- * @return {boolean}
- */
-function isElementWithBuiltCss(el) {
-  if (el.localName === 'style' || el.localName === 'template') {
-    return elementHasBuiltCss(el);
-  }
-  return false;
-}
-
-/**
- * @param {Array<MutationRecord|null>|null} mxns
- */
-function handler(mxns) {
-  for (let x=0; x < mxns.length; x++) {
-    let mxn = mxns[x];
-    if (mxn.target === document.documentElement ||
-      mxn.target === document.head) {
-      continue;
-    }
-    for (let i=0; i < mxn.addedNodes.length; i++) {
-      let n = mxn.addedNodes[i];
-      if (n.nodeType !== Node.ELEMENT_NODE) {
-        continue;
-      }
-      n = /** @type {HTMLElement} */(n); // eslint-disable-line no-self-assign
-      let root = n.getRootNode();
-      let currentScope = getCurrentScope(n);
-      // node was scoped, but now is in document
-      // If this element has built css, we must not remove scoping as this node
-      // will be used as a template or style without re - applying scoping as an optimization
-      if (currentScope && root === n.ownerDocument && !isElementWithBuiltCss(n)) {
-        StyleTransformer.domRemoveScope(n, currentScope);
-      } else if (root instanceof ShadowRoot) {
-        const newScope = getOwnerScope(n);
-        // rescope current node and subtree if necessary
-        if (newScope !== currentScope) {
-          StyleTransformer.domReplaceScope(n, currentScope, newScope);
-        }
-        // make sure all the subtree elements are scoped correctly
-        ensureCorrectSubtreeScoping(n);
-      }
-    }
-  }
-}
-
-// if native Shadow DOM is being used, or ShadyDOM handles dynamic scoiping, do not activate the MutationObserver
-if (!nativeShadow && !(window['ShadyDOM'] && window['ShadyDOM']['handlesDynamicScoping'])) {
-  let observer = new MutationObserver(handler);
-  let start = (node) => {
-    observer.observe(node, {childList: true, subtree: true});
-  }
-  let nativeCustomElements = (window['customElements'] &&
-    !window['customElements']['polyfillWrapFlushCallback']);
-  // need to start immediately with native custom elements
-  // TODO(dfreedm): with polyfilled HTMLImports and native custom elements
-  // excessive mutations may be observed; this can be optimized via cooperation
-  // with the HTMLImports polyfill.
-  if (nativeCustomElements) {
-    start(document);
-  } else {
-    let delayedStart = () => {
-      start(document.body);
-    }
-    // use polyfill timing if it's available
-    if (window['HTMLImports']) {
-      window['HTMLImports']['whenReady'](delayedStart);
-    // otherwise push beyond native imports being ready
-    // which requires RAF + readystate interactive.
-    } else {
-      requestAnimationFrame(function() {
-        if (document.readyState === 'loading') {
-          let listener = function() {
-            delayedStart();
-            document.removeEventListener('readystatechange', listener);
-          }
-          document.addEventListener('readystatechange', listener);
-        } else {
-          delayedStart();
-        }
-      });
-    }
-  }
-
-  flush = function() {
-    handler(observer.takeRecords());
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/scoping-shim.js b/systrace/catapult/third_party/polymer/components/shadycss/src/scoping-shim.js
deleted file mode 100644
index d439bb3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/scoping-shim.js
+++ /dev/null
@@ -1,570 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {parse, StyleNode} from './css-parse.js';
-import {nativeShadow, nativeCssVariables} from './style-settings.js';
-import StyleTransformer from './style-transformer.js';
-import * as StyleUtil from './style-util.js';
-import StyleProperties from './style-properties.js';
-import {ensureStylePlaceholder, getStylePlaceholder} from './style-placeholder.js';
-import StyleInfo from './style-info.js';
-import StyleCache from './style-cache.js';
-import {flush as watcherFlush, getOwnerScope, getCurrentScope} from './document-watcher.js';
-import templateMap from './template-map.js';
-import * as ApplyShimUtils from './apply-shim-utils.js';
-import {updateNativeProperties, detectMixin} from './common-utils.js';
-import {CustomStyleInterfaceInterface} from './custom-style-interface.js'; // eslint-disable-line no-unused-vars
-
-/**
- * @const {StyleCache}
- */
-const styleCache = new StyleCache();
-
-export default class ScopingShim {
-  constructor() {
-    this._scopeCounter = {};
-    this._documentOwner = /** @type {!HTMLElement} */(document.documentElement);
-    let ast = new StyleNode();
-    ast['rules'] = [];
-    this._documentOwnerStyleInfo = StyleInfo.set(this._documentOwner, new StyleInfo(ast));
-    this._elementsHaveApplied = false;
-    /** @type {?Object} */
-    this._applyShim = null;
-    /** @type {?CustomStyleInterfaceInterface} */
-    this._customStyleInterface = null;
-  }
-  flush() {
-    watcherFlush();
-  }
-  _generateScopeSelector(name) {
-    let id = this._scopeCounter[name] = (this._scopeCounter[name] || 0) + 1;
-    return `${name}-${id}`;
-  }
-  getStyleAst(style) {
-    return StyleUtil.rulesForStyle(style);
-  }
-  styleAstToString(ast) {
-    return StyleUtil.toCssText(ast);
-  }
-  _gatherStyles(template) {
-    return StyleUtil.gatherStyleText(template.content);
-  }
-  /**
-   * Prepare the styling and template for the given element type
-   *
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   * @param {string=} typeExtension
-   */
-  prepareTemplate(template, elementName, typeExtension) {
-    this.prepareTemplateDom(template, elementName);
-    this.prepareTemplateStyles(template, elementName, typeExtension);
-  }
-  /**
-   * Prepare styling for the given element type
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   * @param {string=} typeExtension
-   */
-  prepareTemplateStyles(template, elementName, typeExtension) {
-    if (template._prepared) {
-      return;
-    }
-    // style placeholders are only used when ShadyDOM is active
-    if (!nativeShadow) {
-      ensureStylePlaceholder(elementName);
-    }
-    template._prepared = true;
-    template.name = elementName;
-    template.extends = typeExtension;
-    templateMap[elementName] = template;
-    let cssBuild = StyleUtil.getCssBuild(template);
-    const optimalBuild = StyleUtil.isOptimalCssBuild(cssBuild);
-    let info = {
-      is: elementName,
-      extends: typeExtension,
-    };
-    let cssText = this._gatherStyles(template);
-    // check if the styling has mixin definitions or uses
-    this._ensure();
-    if (!optimalBuild) {
-      let hasMixins = !cssBuild && detectMixin(cssText);
-      let ast = parse(cssText);
-      // only run the applyshim transforms if there is a mixin involved
-      if (hasMixins && nativeCssVariables && this._applyShim) {
-        this._applyShim['transformRules'](ast, elementName);
-      }
-      template['_styleAst'] = ast;
-    }
-    let ownPropertyNames = [];
-    if (!nativeCssVariables) {
-      ownPropertyNames = StyleProperties.decorateStyles(template['_styleAst']);
-    }
-    if (!ownPropertyNames.length || nativeCssVariables) {
-      let root = nativeShadow ? template.content : null;
-      let placeholder = getStylePlaceholder(elementName);
-      let style = this._generateStaticStyle(info, template['_styleAst'], root, placeholder, cssBuild, optimalBuild ? cssText : '');
-      template._style = style;
-    }
-    template._ownPropertyNames = ownPropertyNames;
-  }
-  /**
-   * Prepare template for the given element type
-   * @param {!HTMLTemplateElement} template
-   * @param {string} elementName
-   */
-  prepareTemplateDom(template, elementName) {
-    const cssBuild = StyleUtil.getCssBuild(template);
-    if (!nativeShadow && cssBuild !== 'shady' && !template._domPrepared) {
-      template._domPrepared = true;
-      StyleTransformer.domAddScope(template.content, elementName);
-    }
-  }
-  /**
-   * @param {!{is: string, extends: (string|undefined)}} info
-   * @param {!StyleNode} rules
-   * @param {DocumentFragment} shadowroot
-   * @param {Node} placeholder
-   * @param {string} cssBuild
-   * @param {string=} cssText
-   * @return {?HTMLStyleElement}
-   */
-  _generateStaticStyle(info, rules, shadowroot, placeholder, cssBuild, cssText) {
-    cssText = StyleTransformer.elementStyles(info, rules, null, cssBuild, cssText);
-    if (cssText.length) {
-      return StyleUtil.applyCss(cssText, info.is, shadowroot, placeholder);
-    }
-    return null;
-  }
-  _prepareHost(host) {
-    const {is, typeExtension} = StyleUtil.getIsExtends(host);
-    const placeholder = getStylePlaceholder(is);
-    const template = templateMap[is];
-    if (!template) {
-      return;
-    }
-    const ast = template['_styleAst'];
-    const ownStylePropertyNames = template._ownPropertyNames;
-    const cssBuild = StyleUtil.getCssBuild(template);
-    const styleInfo = new StyleInfo(
-      ast,
-      placeholder,
-      ownStylePropertyNames,
-      is,
-      typeExtension,
-      cssBuild
-    );
-    StyleInfo.set(host, styleInfo);
-    return styleInfo;
-  }
-  _ensureApplyShim() {
-    if (this._applyShim) {
-      return;
-    } else if (window.ShadyCSS && window.ShadyCSS.ApplyShim) {
-      this._applyShim = /** @type {!Object} */ (window.ShadyCSS.ApplyShim);
-      this._applyShim['invalidCallback'] = ApplyShimUtils.invalidate;
-    }
-  }
-  _ensureCustomStyleInterface() {
-    if (this._customStyleInterface) {
-      return;
-    } else if (window.ShadyCSS && window.ShadyCSS.CustomStyleInterface) {
-      this._customStyleInterface = /** @type {!CustomStyleInterfaceInterface} */(window.ShadyCSS.CustomStyleInterface);
-      /** @type {function(!HTMLStyleElement)} */
-      this._customStyleInterface['transformCallback'] = (style) => {this.transformCustomStyleForDocument(style)};
-      this._customStyleInterface['validateCallback'] = () => {
-        requestAnimationFrame(() => {
-          if (this._customStyleInterface['enqueued'] || this._elementsHaveApplied) {
-            this.flushCustomStyles();
-          }
-        })
-      };
-    }
-  }
-  _ensure() {
-    this._ensureApplyShim();
-    this._ensureCustomStyleInterface();
-  }
-  /**
-   * Flush and apply custom styles to document
-   */
-  flushCustomStyles() {
-    this._ensure();
-    if (!this._customStyleInterface) {
-      return;
-    }
-    let customStyles = this._customStyleInterface['processStyles']();
-    // early return if custom-styles don't need validation
-    if (!this._customStyleInterface['enqueued']) {
-      return;
-    }
-    // bail if custom styles are built optimally
-    if (StyleUtil.isOptimalCssBuild(this._documentOwnerStyleInfo.cssBuild)) {
-      return;
-    }
-    if (!nativeCssVariables) {
-      this._updateProperties(this._documentOwner, this._documentOwnerStyleInfo);
-      this._applyCustomStyles(customStyles);
-      if (this._elementsHaveApplied) {
-        // if custom elements have upgraded and there are no native css variables, we must recalculate the whole tree
-        this.styleDocument();
-      }
-    } else if (!this._documentOwnerStyleInfo.cssBuild) {
-      this._revalidateCustomStyleApplyShim(customStyles);
-    }
-    this._customStyleInterface['enqueued'] = false;
-  }
-  /**
-   * Apply styles for the given element
-   *
-   * @param {!HTMLElement} host
-   * @param {Object=} overrideProps
-   */
-  styleElement(host, overrideProps) {
-    const styleInfo = StyleInfo.get(host) || this._prepareHost(host);
-    // if there is no style info at this point, bail
-    if (!styleInfo) {
-      return;
-    }
-    // Only trip the `elementsHaveApplied` flag if a node other that the root document has `applyStyle` called
-    if (!this._isRootOwner(host)) {
-      this._elementsHaveApplied = true;
-    }
-    if (overrideProps) {
-      styleInfo.overrideStyleProperties =
-        styleInfo.overrideStyleProperties || {};
-      Object.assign(styleInfo.overrideStyleProperties, overrideProps);
-    }
-    if (!nativeCssVariables) {
-      this.styleElementShimVariables(host, styleInfo);
-    } else {
-      this.styleElementNativeVariables(host, styleInfo);
-    }
-  }
-  /**
-   * @param {!HTMLElement} host
-   * @param {!StyleInfo} styleInfo
-   */
-  styleElementShimVariables(host, styleInfo) {
-    this.flush();
-    this._updateProperties(host, styleInfo);
-    if (styleInfo.ownStylePropertyNames && styleInfo.ownStylePropertyNames.length) {
-      this._applyStyleProperties(host, styleInfo);
-    }
-  }
-  /**
-   * @param {!HTMLElement} host
-   * @param {!StyleInfo} styleInfo
-   */
-  styleElementNativeVariables(host, styleInfo) {
-    const { is } = StyleUtil.getIsExtends(host);
-    if (styleInfo.overrideStyleProperties) {
-      updateNativeProperties(host, styleInfo.overrideStyleProperties);
-    }
-    const template = templateMap[is];
-    // bail early if there is no shadowroot for this element
-    if (!template && !this._isRootOwner(host)) {
-      return;
-    }
-    // bail early if the template was built with polymer-css-build
-    if (template && StyleUtil.elementHasBuiltCss(template)) {
-      return;
-    }
-    if (template && template._style && !ApplyShimUtils.templateIsValid(template)) {
-      // update template
-      if (!ApplyShimUtils.templateIsValidating(template)) {
-        this._ensure();
-        this._applyShim && this._applyShim['transformRules'](template['_styleAst'], is);
-        template._style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);
-        ApplyShimUtils.startValidatingTemplate(template);
-      }
-      // update instance if native shadowdom
-      if (nativeShadow) {
-        let root = host.shadowRoot;
-        if (root) {
-          let style = root.querySelector('style');
-          if (style) {
-            style.textContent = StyleTransformer.elementStyles(host, styleInfo.styleRules);
-          }
-        }
-      }
-      styleInfo.styleRules = template['_styleAst'];
-    }
-  }
-  _styleOwnerForNode(node) {
-    let root = StyleUtil.wrap(node).getRootNode();
-    let host = root.host;
-    if (host) {
-      if (StyleInfo.get(host) || this._prepareHost(host)) {
-        return host;
-      } else {
-        return this._styleOwnerForNode(host);
-      }
-    }
-    return this._documentOwner;
-  }
-  _isRootOwner(node) {
-    return (node === this._documentOwner);
-  }
-  _applyStyleProperties(host, styleInfo) {
-    let is = StyleUtil.getIsExtends(host).is;
-    let cacheEntry = styleCache.fetch(is, styleInfo.styleProperties, styleInfo.ownStylePropertyNames);
-    let cachedScopeSelector = cacheEntry && cacheEntry.scopeSelector;
-    let cachedStyle = cacheEntry ? cacheEntry.styleElement : null;
-    let oldScopeSelector = styleInfo.scopeSelector;
-    // only generate new scope if cached style is not found
-    styleInfo.scopeSelector = cachedScopeSelector || this._generateScopeSelector(is);
-    let style = StyleProperties.applyElementStyle(host, styleInfo.styleProperties, styleInfo.scopeSelector, cachedStyle);
-    if (!nativeShadow) {
-      StyleProperties.applyElementScopeSelector(host, styleInfo.scopeSelector, oldScopeSelector);
-    }
-    if (!cacheEntry) {
-      styleCache.store(is, styleInfo.styleProperties, style, styleInfo.scopeSelector);
-    }
-    return style;
-  }
-  _updateProperties(host, styleInfo) {
-    let owner = this._styleOwnerForNode(host);
-    let ownerStyleInfo = StyleInfo.get(owner);
-    let ownerProperties = ownerStyleInfo.styleProperties;
-    // style owner has not updated properties yet
-    // go up the chain and force property update,
-    // except if the owner is the document
-    if (owner !== this._documentOwner && !ownerProperties) {
-      this._updateProperties(owner, ownerStyleInfo);
-      ownerProperties = ownerStyleInfo.styleProperties;
-    }
-    let props = Object.create(ownerProperties || null);
-    let hostAndRootProps = StyleProperties.hostAndRootPropertiesForScope(host, styleInfo.styleRules, styleInfo.cssBuild);
-    let propertyData = StyleProperties.propertyDataFromStyles(ownerStyleInfo.styleRules, host);
-    let propertiesMatchingHost = propertyData.properties
-    Object.assign(
-      props,
-      hostAndRootProps.hostProps,
-      propertiesMatchingHost,
-      hostAndRootProps.rootProps
-    );
-    this._mixinOverrideStyles(props, styleInfo.overrideStyleProperties);
-    StyleProperties.reify(props);
-    styleInfo.styleProperties = props;
-  }
-  _mixinOverrideStyles(props, overrides) {
-    for (let p in overrides) {
-      let v = overrides[p];
-      // skip override props if they are not truthy or 0
-      // in order to fall back to inherited values
-      if (v || v === 0) {
-        props[p] = v;
-      }
-    }
-  }
-  /**
-   * Update styles of the whole document
-   *
-   * @param {Object=} properties
-   */
-  styleDocument(properties) {
-    this.styleSubtree(this._documentOwner, properties);
-  }
-  /**
-   * Update styles of a subtree
-   *
-   * @param {!HTMLElement} host
-   * @param {Object=} properties
-   */
-  styleSubtree(host, properties) {
-    let root = host.shadowRoot;
-    if (root || this._isRootOwner(host)) {
-      this.styleElement(host, properties);
-    }
-    // process the shadowdom children of `host`
-    let shadowChildren =
-        root && (/** @type {!ParentNode} */ (root).children || root.childNodes);
-    if (shadowChildren) {
-      for (let i = 0; i < shadowChildren.length; i++) {
-        let c = /** @type {!HTMLElement} */(shadowChildren[i]);
-        this.styleSubtree(c);
-      }
-    } else {
-      // process the lightdom children of `host`
-      let children = host.children || host.childNodes;
-      if (children) {
-        for (let i = 0; i < children.length; i++) {
-          let c = /** @type {!HTMLElement} */(children[i]);
-          this.styleSubtree(c);
-        }
-      }
-    }
-  }
-  /* Custom Style operations */
-  _revalidateCustomStyleApplyShim(customStyles) {
-    for (let i = 0; i < customStyles.length; i++) {
-      let c = customStyles[i];
-      let s = this._customStyleInterface['getStyleForCustomStyle'](c);
-      if (s) {
-        this._revalidateApplyShim(s);
-      }
-    }
-  }
-  _applyCustomStyles(customStyles) {
-    for (let i = 0; i < customStyles.length; i++) {
-      let c = customStyles[i];
-      let s = this._customStyleInterface['getStyleForCustomStyle'](c);
-      if (s) {
-        StyleProperties.applyCustomStyle(s, this._documentOwnerStyleInfo.styleProperties);
-      }
-    }
-  }
-  transformCustomStyleForDocument(style) {
-    const cssBuild = StyleUtil.getCssBuild(style);
-    if (cssBuild !== this._documentOwnerStyleInfo.cssBuild) {
-      this._documentOwnerStyleInfo.cssBuild = cssBuild;
-    }
-    if (StyleUtil.isOptimalCssBuild(cssBuild)) {
-      return;
-    }
-    let ast = StyleUtil.rulesForStyle(style);
-    StyleUtil.forEachRule(ast, (rule) => {
-      if (nativeShadow) {
-        StyleTransformer.normalizeRootSelector(rule);
-      } else {
-        StyleTransformer.documentRule(rule);
-      }
-      if (nativeCssVariables && cssBuild === '') {
-        this._ensure();
-        this._applyShim && this._applyShim['transformRule'](rule);
-      }
-    });
-    if (nativeCssVariables) {
-      style.textContent = StyleUtil.toCssText(ast);
-    } else {
-      this._documentOwnerStyleInfo.styleRules['rules'].push(ast);
-    }
-  }
-  _revalidateApplyShim(style) {
-    if (nativeCssVariables && this._applyShim) {
-      let ast = StyleUtil.rulesForStyle(style);
-      this._ensure();
-      this._applyShim['transformRules'](ast);
-      style.textContent = StyleUtil.toCssText(ast);
-    }
-  }
-  getComputedStyleValue(element, property) {
-    let value;
-    if (!nativeCssVariables) {
-      // element is either a style host, or an ancestor of a style host
-      let styleInfo = StyleInfo.get(element) || StyleInfo.get(this._styleOwnerForNode(element));
-      value = styleInfo.styleProperties[property];
-    }
-    // fall back to the property value from the computed styling
-    value = value || window.getComputedStyle(element).getPropertyValue(property);
-    // trim whitespace that can come after the `:` in css
-    // example: padding: 2px -> " 2px"
-    return value ? value.trim() : '';
-  }
-  // given an element and a classString, replaces
-  // the element's class with the provided classString and adds
-  // any necessary ShadyCSS static and property based scoping selectors
-  setElementClass(element, classString) {
-    let root = StyleUtil.wrap(element).getRootNode();
-    let classes = classString ? classString.split(/\s/) : [];
-    let scopeName = root.host && root.host.localName;
-    // If no scope, try to discover scope name from existing class.
-    // This can occur if, for example, a template stamped element that
-    // has been scoped is manipulated when not in a root.
-    if (!scopeName) {
-      var classAttr = element.getAttribute('class');
-      if (classAttr) {
-        let k$ = classAttr.split(/\s/);
-        for (let i=0; i < k$.length; i++) {
-          if (k$[i] === StyleTransformer.SCOPE_NAME) {
-            scopeName = k$[i+1];
-            break;
-          }
-        }
-      }
-    }
-    if (scopeName) {
-      classes.push(StyleTransformer.SCOPE_NAME, scopeName);
-    }
-    if (!nativeCssVariables) {
-      let styleInfo = StyleInfo.get(element);
-      if (styleInfo && styleInfo.scopeSelector) {
-        classes.push(StyleProperties.XSCOPE_NAME, styleInfo.scopeSelector);
-      }
-    }
-    StyleUtil.setElementClassRaw(element, classes.join(' '));
-  }
-  _styleInfoForNode(node) {
-    return StyleInfo.get(node);
-  }
-  /**
-   * @param {!Element} node
-   * @param {string} scope
-   */
-  scopeNode(node, scope) {
-    StyleTransformer.element(node, scope);
-  }
-  /**
-   * @param {!Element} node
-   * @param {string} scope
-   */
-  unscopeNode(node, scope) {
-    StyleTransformer.element(node, scope, true);
-  }
-  /**
-   * @param {!Node} node
-   * @return {string}
-   */
-  scopeForNode(node) {
-    return getOwnerScope(node);
-  }
-  /**
-   * @param {!Element} node
-   * @return {string}
-   */
-  currentScopeForNode(node) {
-    return getCurrentScope(node);
-  }
-}
-
-/* exports */
-/* eslint-disable no-self-assign */
-ScopingShim.prototype['flush'] = ScopingShim.prototype.flush;
-ScopingShim.prototype['prepareTemplate'] = ScopingShim.prototype.prepareTemplate;
-ScopingShim.prototype['styleElement'] = ScopingShim.prototype.styleElement;
-ScopingShim.prototype['styleDocument'] = ScopingShim.prototype.styleDocument;
-ScopingShim.prototype['styleSubtree'] = ScopingShim.prototype.styleSubtree;
-ScopingShim.prototype['getComputedStyleValue'] = ScopingShim.prototype.getComputedStyleValue;
-ScopingShim.prototype['setElementClass'] = ScopingShim.prototype.setElementClass;
-ScopingShim.prototype['_styleInfoForNode'] = ScopingShim.prototype._styleInfoForNode;
-ScopingShim.prototype['transformCustomStyleForDocument'] = ScopingShim.prototype.transformCustomStyleForDocument;
-ScopingShim.prototype['getStyleAst'] = ScopingShim.prototype.getStyleAst;
-ScopingShim.prototype['styleAstToString'] = ScopingShim.prototype.styleAstToString;
-ScopingShim.prototype['flushCustomStyles'] = ScopingShim.prototype.flushCustomStyles;
-ScopingShim.prototype['scopeNode'] = ScopingShim.prototype.scopeNode;
-ScopingShim.prototype['unscopeNode'] = ScopingShim.prototype.unscopeNode;
-ScopingShim.prototype['scopeForNode'] = ScopingShim.prototype.scopeForNode;
-ScopingShim.prototype['currentScopeForNode'] = ScopingShim.prototype.currentScopeForNode;
-/* eslint-enable no-self-assign */
-Object.defineProperties(ScopingShim.prototype, {
-  'nativeShadow': {
-    get() {
-      return nativeShadow;
-    }
-  },
-  'nativeCss': {
-    get() {
-      return nativeCssVariables;
-    }
-  }
-});
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-cache.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-cache.js
deleted file mode 100644
index 0006a0b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-cache.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-'use strict';
-
-export default class StyleCache {
-  constructor(typeMax = 100) {
-    // map element name -> [{properties, styleElement, scopeSelector}]
-    this.cache = {};
-    /** @type {number} */
-    this.typeMax = typeMax;
-  }
-
-  _validate(cacheEntry, properties, ownPropertyNames) {
-    for (let idx = 0; idx < ownPropertyNames.length; idx++) {
-      let pn = ownPropertyNames[idx];
-      if (cacheEntry.properties[pn] !== properties[pn]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  store(tagname, properties, styleElement, scopeSelector) {
-    let list = this.cache[tagname] || [];
-    list.push({properties, styleElement, scopeSelector});
-    if (list.length > this.typeMax) {
-      list.shift();
-    }
-    this.cache[tagname] = list;
-  }
-
-  fetch(tagname, properties, ownPropertyNames) {
-    let list = this.cache[tagname];
-    if (!list) {
-      return;
-    }
-    // reverse list for most-recent lookups
-    for (let idx = list.length - 1; idx >= 0; idx--) {
-      let entry = list[idx];
-      if (this._validate(entry, properties, ownPropertyNames)) {
-        return entry;
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-info.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-info.js
deleted file mode 100644
index fd5b14b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-info.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
-
-/** @const {string} */
-const infoKey = '__styleInfo';
-
-export default class StyleInfo {
-  /**
-   * @param {Element} node
-   * @return {StyleInfo}
-   */
-  static get(node) {
-    if (node) {
-      return node[infoKey];
-    } else {
-      return null;
-    }
-  }
-  /**
-   * @param {!Element} node
-   * @param {StyleInfo} styleInfo
-   * @return {StyleInfo}
-   */
-  static set(node, styleInfo) {
-    node[infoKey] = styleInfo;
-    return styleInfo;
-  }
-  /**
-   * @param {StyleNode} ast
-   * @param {Node=} placeholder
-   * @param {Array<string>=} ownStylePropertyNames
-   * @param {string=} elementName
-   * @param {string=} typeExtension
-   * @param {string=} cssBuild
-   */
-  constructor(ast, placeholder, ownStylePropertyNames, elementName, typeExtension, cssBuild) {
-    /** @type {StyleNode} */
-    this.styleRules = ast || null;
-    /** @type {Node} */
-    this.placeholder = placeholder || null;
-    /** @type {!Array<string>} */
-    this.ownStylePropertyNames = ownStylePropertyNames || [];
-    /** @type {Array<Object>} */
-    this.overrideStyleProperties = null;
-    /** @type {string} */
-    this.elementName = elementName || '';
-    /** @type {string} */
-    this.cssBuild = cssBuild || '';
-    /** @type {string} */
-    this.typeExtension = typeExtension || '';
-    /** @type {Object<string, string>} */
-    this.styleProperties = null;
-    /** @type {?string} */
-    this.scopeSelector = null;
-    /** @type {HTMLStyleElement} */
-    this.customStyle = null;
-  }
-  _getStyleRules() {
-    return this.styleRules;
-  }
-}
-
-/* eslint-disable-next-line no-self-assign */
-StyleInfo.prototype['_getStyleRules'] = StyleInfo.prototype._getStyleRules;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-placeholder.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-placeholder.js
deleted file mode 100644
index 72be92d..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-placeholder.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {applyStylePlaceHolder} from './style-util.js';
-import {nativeShadow} from './style-settings.js';
-
-/** @type {!Object<string, !Node>} */
-const placeholderMap = {};
-
-/**
- * @param {string} elementName
- * @return {Node}
- */
-export function getStylePlaceholder(elementName) {
-  return placeholderMap[elementName] || null;
-}
-
-/**
- * @param {string} elementName
- */
-export function ensureStylePlaceholder(elementName) {
-  if (!placeholderMap[elementName]) {
-    placeholderMap[elementName] = applyStylePlaceHolder(elementName);
-  }
-}
-
-/**
- * @const {CustomElementRegistry}
- */
-const ce = window['customElements'];
-if (ce && !nativeShadow) {
-  /**
-   * @const {function(this:CustomElementRegistry, string,function(new:HTMLElement),{extends: string}=)}
-   */
-  const origDefine = ce['define'];
-  /**
-   * @param {string} name
-   * @param {function(new:HTMLElement)} clazz
-   * @param {{extends: string}=} options
-   */
-  const wrappedDefine = (name, clazz, options) => {
-    ensureStylePlaceholder(name);
-    origDefine.call(/** @type {!CustomElementRegistry} */(ce), name, clazz, options);
-  };
-  ce['define'] = wrappedDefine;
-}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-properties.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-properties.js
deleted file mode 100644
index ecaa389..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-properties.js
+++ /dev/null
@@ -1,608 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {removeCustomPropAssignment, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
-import {nativeShadow} from './style-settings.js';
-import StyleTransformer from './style-transformer.js';
-import * as StyleUtil from './style-util.js';
-import * as RX from './common-regex.js';
-import StyleInfo from './style-info.js';
-
-// TODO: dedupe with shady
-/**
- * @param {string} selector
- * @return {boolean}
- * @this {Element}
- */
-const matchesSelector = function(selector) {
-  const method = this.matches || this.matchesSelector ||
-    this.mozMatchesSelector || this.msMatchesSelector ||
-    this.oMatchesSelector || this.webkitMatchesSelector;
-  return method && method.call(this, selector);
-};
-
-const IS_IE = navigator.userAgent.match('Trident');
-
-const XSCOPE_NAME = 'x-scope';
-
-class StyleProperties {
-  get XSCOPE_NAME() {
-    return XSCOPE_NAME;
-  }
-/**
- * decorates styles with rule info and returns an array of used style property names
- *
- * @param {StyleNode} rules
- * @return {Array<string>}
- */
-  decorateStyles(rules) {
-    let self = this, props = {}, keyframes = [], ruleIndex = 0;
-    StyleUtil.forEachRule(rules, function(rule) {
-      self.decorateRule(rule);
-      // mark in-order position of ast rule in styles block, used for cache key
-      rule.index = ruleIndex++;
-      self.collectPropertiesInCssText(rule.propertyInfo.cssText, props);
-    }, function onKeyframesRule(rule) {
-      keyframes.push(rule);
-    });
-    // Cache all found keyframes rules for later reference:
-    rules._keyframes = keyframes;
-    // return this list of property names *consumes* in these styles.
-    let names = [];
-    for (let i in props) {
-      names.push(i);
-    }
-    return names;
-  }
-
-  // decorate a single rule with property info
-  decorateRule(rule) {
-    if (rule.propertyInfo) {
-      return rule.propertyInfo;
-    }
-    let info = {}, properties = {};
-    let hasProperties = this.collectProperties(rule, properties);
-    if (hasProperties) {
-      info.properties = properties;
-      // TODO(sorvell): workaround parser seeing mixins as additional rules
-      rule['rules'] = null;
-    }
-    info.cssText = this.collectCssText(rule);
-    rule.propertyInfo = info;
-    return info;
-  }
-
-  // collects the custom properties from a rule's cssText
-  collectProperties(rule, properties) {
-    let info = rule.propertyInfo;
-    if (info) {
-      if (info.properties) {
-        Object.assign(properties, info.properties);
-        return true;
-      }
-    } else {
-      let m, rx = RX.VAR_ASSIGN;
-      let cssText = rule['parsedCssText'];
-      let value;
-      let any;
-      while ((m = rx.exec(cssText))) {
-        // note: group 2 is var, 3 is mixin
-        value = (m[2] || m[3]).trim();
-        // value of 'inherit' or 'unset' is equivalent to not setting the property here
-        if (value !== 'inherit' || value !== 'unset') {
-          properties[m[1].trim()] = value;
-        }
-        any = true;
-      }
-      return any;
-    }
-
-  }
-
-  // returns cssText of properties that consume variables/mixins
-  collectCssText(rule) {
-    return this.collectConsumingCssText(rule['parsedCssText']);
-  }
-
-  // NOTE: we support consumption inside mixin assignment
-  // but not production, so strip out {...}
-  collectConsumingCssText(cssText) {
-    return cssText.replace(RX.BRACKETED, '')
-      .replace(RX.VAR_ASSIGN, '');
-  }
-
-  collectPropertiesInCssText(cssText, props) {
-    let m;
-    while ((m = RX.VAR_CONSUMED.exec(cssText))) {
-      let name = m[1];
-      // This regex catches all variable names, and following non-whitespace char
-      // If next char is not ':', then variable is a consumer
-      if (m[2] !== ':') {
-        props[name] = true;
-      }
-    }
-  }
-
-  // turns custom properties into realized values.
-  reify(props) {
-    // big perf optimization here: reify only *own* properties
-    // since this object has __proto__ of the element's scope properties
-    let names = Object.getOwnPropertyNames(props);
-    for (let i=0, n; i < names.length; i++) {
-      n = names[i];
-      props[n] = this.valueForProperty(props[n], props);
-    }
-  }
-
-  // given a property value, returns the reified value
-  // a property value may be:
-  // (1) a literal value like: red or 5px;
-  // (2) a variable value like: var(--a), var(--a, red), or var(--a, --b) or
-  // var(--a, var(--b));
-  // (3) a literal mixin value like { properties }. Each of these properties
-  // can have values that are: (a) literal, (b) variables, (c) @apply mixins.
-  valueForProperty(property, props) {
-    // case (1) default
-    // case (3) defines a mixin and we have to reify the internals
-    if (property) {
-      if (property.indexOf(';') >=0) {
-        property = this.valueForProperties(property, props);
-      } else {
-        // case (2) variable
-        let self = this;
-        let fn = function(prefix, value, fallback, suffix) {
-          if (!value) {
-            return prefix + suffix;
-          }
-          let propertyValue = self.valueForProperty(props[value], props);
-          // if value is "initial", then the variable should be treated as unset
-          if (!propertyValue || propertyValue === 'initial') {
-            // fallback may be --a or var(--a) or literal
-            propertyValue = self.valueForProperty(props[fallback] || fallback, props) ||
-            fallback;
-          } else if (propertyValue === 'apply-shim-inherit') {
-            // CSS build will replace `inherit` with `apply-shim-inherit`
-            // for use with native css variables.
-            // Since we have full control, we can use `inherit` directly.
-            propertyValue = 'inherit';
-          }
-          return prefix + (propertyValue || '') + suffix;
-        };
-        property = StyleUtil.processVariableAndFallback(property, fn);
-      }
-    }
-    return property && property.trim() || '';
-  }
-
-  // note: we do not yet support mixin within mixin
-  valueForProperties(property, props) {
-    let parts = property.split(';');
-    for (let i=0, p, m; i<parts.length; i++) {
-      if ((p = parts[i])) {
-        RX.MIXIN_MATCH.lastIndex = 0;
-        m = RX.MIXIN_MATCH.exec(p);
-        if (m) {
-          p = this.valueForProperty(props[m[1]], props);
-        } else {
-          let colon = p.indexOf(':');
-          if (colon !== -1) {
-            let pp = p.substring(colon);
-            pp = pp.trim();
-            pp = this.valueForProperty(pp, props) || pp;
-            p = p.substring(0, colon) + pp;
-          }
-        }
-        parts[i] = (p && p.lastIndexOf(';') === p.length - 1) ?
-          // strip trailing ;
-          p.slice(0, -1) :
-          p || '';
-      }
-    }
-    return parts.join(';');
-  }
-
-  applyProperties(rule, props) {
-    let output = '';
-    // dynamically added sheets may not be decorated so ensure they are.
-    if (!rule.propertyInfo) {
-      this.decorateRule(rule);
-    }
-    if (rule.propertyInfo.cssText) {
-      output = this.valueForProperties(rule.propertyInfo.cssText, props);
-    }
-    rule['cssText'] = output;
-  }
-
-  // Apply keyframe transformations to the cssText of a given rule. The
-  // keyframeTransforms object is a map of keyframe names to transformer
-  // functions which take in cssText and spit out transformed cssText.
-  applyKeyframeTransforms(rule, keyframeTransforms) {
-    let input = rule['cssText'];
-    let output = rule['cssText'];
-    if (rule.hasAnimations == null) {
-      // Cache whether or not the rule has any animations to begin with:
-      rule.hasAnimations = RX.ANIMATION_MATCH.test(input);
-    }
-    // If there are no animations referenced, we can skip transforms:
-    if (rule.hasAnimations) {
-      let transform;
-      // If we haven't transformed this rule before, we iterate over all
-      // transforms:
-      if (rule.keyframeNamesToTransform == null) {
-        rule.keyframeNamesToTransform = [];
-        for (let keyframe in keyframeTransforms) {
-          transform = keyframeTransforms[keyframe];
-          output = transform(input);
-          // If the transform actually changed the CSS text, we cache the
-          // transform name for future use:
-          if (input !== output) {
-            input = output;
-            rule.keyframeNamesToTransform.push(keyframe);
-          }
-        }
-      } else {
-        // If we already have a list of keyframe names that apply to this
-        // rule, we apply only those keyframe name transforms:
-        for (let i = 0; i < rule.keyframeNamesToTransform.length; ++i) {
-          transform = keyframeTransforms[rule.keyframeNamesToTransform[i]];
-          input = transform(input);
-        }
-        output = input;
-      }
-    }
-    rule['cssText'] = output;
-  }
-
-  // Test if the rules in these styles matches the given `element` and if so,
-  // collect any custom properties into `props`.
-  /**
-   * @param {StyleNode} rules
-   * @param {Element} element
-   */
-  propertyDataFromStyles(rules, element) {
-    let props = {};
-    // generates a unique key for these matches
-    let o = [];
-    // note: active rules excludes non-matching @media rules
-    StyleUtil.forEachRule(rules, (rule) => {
-      // TODO(sorvell): we could trim the set of rules at declaration
-      // time to only include ones that have properties
-      if (!rule.propertyInfo) {
-        this.decorateRule(rule);
-      }
-      // match element against transformedSelector: selector may contain
-      // unwanted uniquification and parsedSelector does not directly match
-      // for :host selectors.
-      let selectorToMatch = rule.transformedSelector || rule['parsedSelector'];
-      if (element && rule.propertyInfo.properties && selectorToMatch) {
-        if (matchesSelector.call(element, selectorToMatch)) {
-          this.collectProperties(rule, props);
-          // produce numeric key for these matches for lookup
-          addToBitMask(rule.index, o);
-        }
-      }
-    }, null, true);
-    return {properties: props, key: o};
-  }
-
-  /**
-   * @param {Element} scope
-   * @param {StyleNode} rule
-   * @param {string} cssBuild
-   * @param {function(Object)} callback
-   */
-  whenHostOrRootRule(scope, rule, cssBuild, callback) {
-    if (!rule.propertyInfo) {
-      this.decorateRule(rule);
-    }
-    if (!rule.propertyInfo.properties) {
-      return;
-    }
-    let {is, typeExtension} = StyleUtil.getIsExtends(scope);
-    let hostScope = is ?
-      StyleTransformer._calcHostScope(is, typeExtension) :
-      'html';
-    let parsedSelector = rule['parsedSelector'];
-    let isRoot = (parsedSelector === ':host > *' || parsedSelector === 'html');
-    let isHost = parsedSelector.indexOf(':host') === 0 && !isRoot;
-    // build info is either in scope (when scope is an element) or in the style
-    // when scope is the default scope; note: this allows default scope to have
-    // mixed mode built and unbuilt styles.
-    if (cssBuild === 'shady') {
-      // :root -> x-foo > *.x-foo for elements and html for custom-style
-      isRoot = parsedSelector === (hostScope + ' > *.' + hostScope) || parsedSelector.indexOf('html') !== -1;
-      // :host -> x-foo for elements, but sub-rules have .x-foo in them
-      isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;
-    }
-    if (!isRoot && !isHost) {
-      return;
-    }
-    let selectorToMatch = hostScope;
-    if (isHost) {
-      // need to transform :host because `:host` does not work with `matches`
-      if (!rule.transformedSelector) {
-        // transform :host into a matchable selector
-        rule.transformedSelector =
-        StyleTransformer._transformRuleCss(
-          rule,
-          StyleTransformer._transformComplexSelector,
-          StyleTransformer._calcElementScope(is),
-          hostScope
-        );
-      }
-      selectorToMatch = rule.transformedSelector || hostScope;
-    }
-    callback({
-      selector: selectorToMatch,
-      isHost: isHost,
-      isRoot: isRoot
-    });
-  }
-/**
- * @param {Element} scope
- * @param {StyleNode} rules
- * @param {string} cssBuild
- * @return {Object}
- */
-  hostAndRootPropertiesForScope(scope, rules, cssBuild) {
-    let hostProps = {}, rootProps = {};
-    // note: active rules excludes non-matching @media rules
-    StyleUtil.forEachRule(rules, (rule) => {
-      // if scope is StyleDefaults, use _element for matchesSelector
-      this.whenHostOrRootRule(scope, rule, cssBuild, (info) => {
-        let element = scope._element || scope;
-        if (matchesSelector.call(element, info.selector)) {
-          if (info.isHost) {
-            this.collectProperties(rule, hostProps);
-          } else {
-            this.collectProperties(rule, rootProps);
-          }
-        }
-      });
-    }, null, true);
-    return {rootProps: rootProps, hostProps: hostProps};
-  }
-
-  /**
-   * @param {Element} element
-   * @param {Object} properties
-   * @param {string} scopeSelector
-   */
-  transformStyles(element, properties, scopeSelector) {
-    let self = this;
-    let {is, typeExtension} = StyleUtil.getIsExtends(element);
-    let hostSelector = StyleTransformer
-      ._calcHostScope(is, typeExtension);
-    let rxHostSelector = element.extends ?
-      '\\' + hostSelector.slice(0, -1) + '\\]' :
-      hostSelector;
-    let hostRx = new RegExp(RX.HOST_PREFIX + rxHostSelector +
-      RX.HOST_SUFFIX);
-    let {styleRules: rules, cssBuild} = StyleInfo.get(element);
-    let keyframeTransforms =
-      this._elementKeyframeTransforms(element, rules, scopeSelector);
-    return StyleTransformer.elementStyles(element, rules, function(rule) {
-      self.applyProperties(rule, properties);
-      if (!nativeShadow &&
-          !StyleUtil.isKeyframesSelector(rule) &&
-          rule['cssText']) {
-        // NOTE: keyframe transforms only scope munge animation names, so it
-        // is not necessary to apply them in ShadowDOM.
-        self.applyKeyframeTransforms(rule, keyframeTransforms);
-        self._scopeSelector(rule, hostRx, hostSelector, scopeSelector);
-      }
-    }, cssBuild);
-  }
-
-  /**
-   * @param {Element} element
-   * @param {StyleNode} rules
-   * @param {string} scopeSelector
-   * @return {Object}
-   */
-  _elementKeyframeTransforms(element, rules, scopeSelector) {
-    let keyframesRules = rules._keyframes;
-    let keyframeTransforms = {};
-    if (!nativeShadow && keyframesRules) {
-      // For non-ShadowDOM, we transform all known keyframes rules in
-      // advance for the current scope. This allows us to catch keyframes
-      // rules that appear anywhere in the stylesheet:
-      for (let i = 0, keyframesRule = keyframesRules[i];
-           i < keyframesRules.length;
-           keyframesRule = keyframesRules[++i]) {
-        this._scopeKeyframes(keyframesRule, scopeSelector);
-        keyframeTransforms[keyframesRule['keyframesName']] =
-            this._keyframesRuleTransformer(keyframesRule);
-      }
-    }
-    return keyframeTransforms;
-  }
-
-  // Generate a factory for transforming a chunk of CSS text to handle a
-  // particular scoped keyframes rule.
-  /**
-   * @param {StyleNode} keyframesRule
-   * @return {function(string):string}
-   */
-  _keyframesRuleTransformer(keyframesRule) {
-    return function(cssText) {
-      return cssText.replace(
-          keyframesRule.keyframesNameRx,
-          keyframesRule.transformedKeyframesName);
-    };
-  }
-
-/**
- * Transforms `@keyframes` names to be unique for the current host.
- * Example: @keyframes foo-anim -> @keyframes foo-anim-x-foo-0
- *
- * @param {StyleNode} rule
- * @param {string} scopeId
- */
-  _scopeKeyframes(rule, scopeId) {
-    // Animation names are of the form [\w-], so ensure that the name regex does not partially apply
-    // to similarly named keyframe names by checking for a word boundary at the beginning and
-    // a non-word boundary or `-` at the end.
-    rule.keyframesNameRx = new RegExp(`\\b${rule['keyframesName']}(?!\\B|-)`, 'g');
-    rule.transformedKeyframesName = rule['keyframesName'] + '-' + scopeId;
-    rule.transformedSelector = rule.transformedSelector || rule['selector'];
-    rule['selector'] = rule.transformedSelector.replace(
-        rule['keyframesName'], rule.transformedKeyframesName);
-  }
-
-  // Strategy: x scope shim a selector e.g. to scope `.x-foo-42` (via classes):
-  // non-host selector: .a.x-foo -> .x-foo-42 .a.x-foo
-  // host selector: x-foo.wide -> .x-foo-42.wide
-  // note: we use only the scope class (.x-foo-42) and not the hostSelector
-  // (x-foo) to scope :host rules; this helps make property host rules
-  // have low specificity. They are overrideable by class selectors but,
-  // unfortunately, not by type selectors (e.g. overriding via
-  // `.special` is ok, but not by `x-foo`).
-  /**
-   * @param {StyleNode} rule
-   * @param {RegExp} hostRx
-   * @param {string} hostSelector
-   * @param {string} scopeId
-   */
-  _scopeSelector(rule, hostRx, hostSelector, scopeId) {
-    rule.transformedSelector = rule.transformedSelector || rule['selector'];
-    let selector = rule.transformedSelector;
-    let scope = '.' + scopeId;
-    let parts = StyleUtil.splitSelectorList(selector);
-    for (let i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {
-      parts[i] = p.match(hostRx) ?
-        p.replace(hostSelector, scope) :
-        scope + ' ' + p;
-    }
-    rule['selector'] = parts.join(',');
-  }
-
-  /**
-   * @param {Element} element
-   * @param {string} selector
-   * @param {string} old
-   */
-  applyElementScopeSelector(element, selector, old) {
-    let c = element.getAttribute('class') || '';
-    let v = c;
-    if (old) {
-      v = c.replace(
-        new RegExp('\\s*' + XSCOPE_NAME + '\\s*' + old + '\\s*', 'g'), ' ');
-    }
-    v += (v ? ' ' : '') + XSCOPE_NAME + ' ' + selector;
-    if (c !== v) {
-      StyleUtil.setElementClassRaw(element, v);
-    }
-  }
-
-  /**
-   * @param {HTMLElement} element
-   * @param {Object} properties
-   * @param {string} selector
-   * @param {HTMLStyleElement} style
-   * @return {HTMLStyleElement}
-   */
-  applyElementStyle(element, properties, selector, style) {
-    // calculate cssText to apply
-    let cssText = style ? style.textContent || '' :
-      this.transformStyles(element, properties, selector);
-    // if shady and we have a cached style that is not style, decrement
-    let styleInfo = StyleInfo.get(element);
-    let s = styleInfo.customStyle;
-    if (s && !nativeShadow && (s !== style)) {
-      s['_useCount']--;
-      if (s['_useCount'] <= 0 && s.parentNode) {
-        s.parentNode.removeChild(s);
-      }
-    }
-    // apply styling always under native or if we generated style
-    // or the cached style is not in document(!)
-    if (nativeShadow) {
-      // update existing style only under native
-      if (styleInfo.customStyle) {
-        styleInfo.customStyle.textContent = cssText;
-        style = styleInfo.customStyle;
-      // otherwise, if we have css to apply, do so
-      } else if (cssText) {
-        // apply css after the scope style of the element to help with
-        // style precedence rules.
-        style = StyleUtil.applyCss(cssText, selector, element.shadowRoot,
-          styleInfo.placeholder);
-      }
-    } else {
-      // shady and no cache hit
-      if (!style) {
-        // apply css after the scope style of the element to help with
-        // style precedence rules.
-        if (cssText) {
-          style = StyleUtil.applyCss(cssText, selector, null,
-            styleInfo.placeholder);
-        }
-      // shady and cache hit but not in document
-      } else if (!style.parentNode) {
-        if (IS_IE && cssText.indexOf('@media') > -1) {
-            // @media rules may be stale in IE 10 and 11
-            // refresh the text content of the style to revalidate them.
-          style.textContent = cssText;
-        }
-        StyleUtil.applyStyle(style, null, styleInfo.placeholder);
-      }
-    }
-    // ensure this style is our custom style and increment its use count.
-    if (style) {
-      style['_useCount'] = style['_useCount'] || 0;
-      // increment use count if we changed styles
-      if (styleInfo.customStyle != style) {
-        style['_useCount']++;
-      }
-      styleInfo.customStyle = style;
-    }
-    return style;
-  }
-
-  /**
-   * @param {Element} style
-   * @param {Object} properties
-   */
-  applyCustomStyle(style, properties) {
-    let rules = StyleUtil.rulesForStyle(/** @type {HTMLStyleElement} */(style));
-    let self = this;
-    style.textContent = StyleUtil.toCssText(rules, function(/** StyleNode */rule) {
-      let css = rule['cssText'] = rule['parsedCssText'];
-      if (rule.propertyInfo && rule.propertyInfo.cssText) {
-        // remove property assignments
-        // so next function isn't confused
-        // NOTE: we have 3 categories of css:
-        // (1) normal properties,
-        // (2) custom property assignments (--foo: red;),
-        // (3) custom property usage: border: var(--foo); @apply(--foo);
-        // In elements, 1 and 3 are separated for efficiency; here they
-        // are not and this makes this case unique.
-        css = removeCustomPropAssignment(/** @type {string} */(css));
-        // replace with reified properties, scenario is same as mixin
-        rule['cssText'] = self.valueForProperties(css, properties);
-      }
-    });
-  }
-}
-
-/**
- * @param {number} n
- * @param {Array<number>} bits
- */
-function addToBitMask(n, bits) {
-  let o = parseInt(n / 32, 10);
-  let v = 1 << (n % 32);
-  bits[o] = (bits[o] || 0) | v;
-}
-
-export default new StyleProperties();
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-settings.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-settings.js
deleted file mode 100644
index 5575706..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-settings.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-export const nativeShadow = !(window['ShadyDOM'] && window['ShadyDOM']['inUse']);
-let nativeCssVariables_;
-
-/**
- * @param {(ShadyCSSOptions | ShadyCSSInterface)=} settings
- */
-function calcCssVariables(settings) {
-  if (settings && settings['shimcssproperties']) {
-    nativeCssVariables_ = false;
-  } else {
-    // chrome 49 has semi-working css vars, check if box-shadow works
-    // safari 9.1 has a recalc bug: https://bugs.webkit.org/show_bug.cgi?id=155782
-    // However, shim css custom properties are only supported with ShadyDOM enabled,
-    // so fall back on native if we do not detect ShadyDOM
-    // Edge 15: custom properties used in ::before and ::after will also be used in the parent element
-    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12414257/
-    nativeCssVariables_ = nativeShadow || Boolean(!navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/) &&
-      window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)'));
-  }
-}
-
-/** @type {string | undefined} */
-export let cssBuild;
-if (window.ShadyCSS && window.ShadyCSS.cssBuild !== undefined) {
-  cssBuild = window.ShadyCSS.cssBuild;
-}
-
-if (window.ShadyCSS && window.ShadyCSS.nativeCss !== undefined) {
-  nativeCssVariables_ = window.ShadyCSS.nativeCss;
-} else if (window.ShadyCSS) {
-  calcCssVariables(window.ShadyCSS);
-  // reset window variable to let ShadyCSS API take its place
-  window.ShadyCSS = undefined;
-} else {
-  calcCssVariables(window['WebComponents'] && window['WebComponents']['flags']);
-}
-
-// Hack for type error under new type inference which doesn't like that
-// nativeCssVariables is updated in a function and assigns the type
-// `function(): ?` instead of `boolean`.
-export const nativeCssVariables = /** @type {boolean} */(nativeCssVariables_);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-transformer.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-transformer.js
deleted file mode 100644
index a4623a6..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-transformer.js
+++ /dev/null
@@ -1,487 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
-import * as StyleUtil from './style-util.js';
-import {nativeShadow} from './style-settings.js';
-
-/* Transforms ShadowDOM styling into ShadyDOM styling
-
-* scoping:
-
-  * elements in scope get scoping selector class="x-foo-scope"
-  * selectors re-written as follows:
-
-    div button -> div.x-foo-scope button.x-foo-scope
-
-* :host -> scopeName
-
-* :host(...) -> scopeName...
-
-* ::slotted(...) -> scopeName > ...
-
-* ...:dir(ltr|rtl) -> [dir="ltr|rtl"] ..., ...[dir="ltr|rtl"]
-
-* :host(:dir[rtl]) -> scopeName:dir(rtl) -> [dir="rtl"] scopeName, scopeName[dir="rtl"]
-
-*/
-const SCOPE_NAME = 'style-scope';
-
-class StyleTransformer {
-  get SCOPE_NAME() {
-    return SCOPE_NAME;
-  }
-  /**
-   * Given a node and scope name, add a scoping class to each node
-   * in the tree. This facilitates transforming css into scoped rules.
-   * @param {!Node} node
-   * @param {string} scope
-   * @param {boolean=} shouldRemoveScope
-   * @deprecated
-   */
-  dom(node, scope, shouldRemoveScope) {
-    const fn = (node) => {
-      this.element(node, scope || '', shouldRemoveScope);
-    };
-    this._transformDom(node, fn);
-  }
-
-  /**
-   * Given a node and scope name, add a scoping class to each node in the tree.
-   * @param {!Node} node
-   * @param {string} scope
-   */
-  domAddScope(node, scope) {
-    const fn = (node) => {
-      this.element(node, scope || '');
-    };
-    this._transformDom(node, fn);
-  }
-
-  /**
-   * @param {!Node} startNode
-   * @param {!function(!Node)} transformer
-   */
-  _transformDom(startNode, transformer) {
-    if (startNode.nodeType === Node.ELEMENT_NODE) {
-      transformer(startNode)
-    }
-    let c$;
-    if (startNode.localName === 'template') {
-      const template = /** @type {!HTMLTemplateElement} */ (startNode);
-      // In case the template is in svg context, fall back to the node
-      // since it won't be an HTMLTemplateElement with a .content property
-      c$ = (template.content || template._content || template).childNodes;
-    } else {
-      c$ = /** @type {!ParentNode} */ (startNode).children ||
-          startNode.childNodes;
-    }
-    if (c$) {
-      for (let i = 0; i < c$.length; i++) {
-        this._transformDom(c$[i], transformer);
-      }
-    }
-  }
-
-  /**
-   * @param {?} element
-   * @param {?} scope
-   * @param {?=} shouldRemoveScope
-   */
-  element(element, scope, shouldRemoveScope) {
-    // note: if using classes, we add both the general 'style-scope' class
-    // as well as the specific scope. This enables easy filtering of all
-    // `style-scope` elements
-    if (scope) {
-      // note: svg on IE does not have classList so fallback to class
-      if (element.classList) {
-        if (shouldRemoveScope) {
-          element.classList.remove(SCOPE_NAME);
-          element.classList.remove(scope);
-        } else {
-          element.classList.add(SCOPE_NAME);
-          element.classList.add(scope);
-        }
-      } else if (element.getAttribute) {
-        let c = element.getAttribute(CLASS);
-        if (shouldRemoveScope) {
-          if (c) {
-            let newValue = c.replace(SCOPE_NAME, '').replace(scope, '');
-            StyleUtil.setElementClassRaw(element, newValue);
-          }
-        } else {
-          let newValue = (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope;
-          StyleUtil.setElementClassRaw(element, newValue);
-        }
-      }
-    }
-  }
-
-  /**
-   * Given a node, replace the scoping class to each subnode in the tree.
-   * @param {!Node} node
-   * @param {string} oldScope
-   * @param {string} newScope
-   */
-  domReplaceScope(node, oldScope, newScope) {
-    const fn = (node) => {
-      this.element(node, oldScope, true);
-      this.element(node, newScope);
-    };
-    this._transformDom(node, fn);
-  }
-  /**
-   * Given a node, remove the scoping class to each subnode in the tree.
-   * @param {!Node} node
-   * @param {string} oldScope
-   */
-  domRemoveScope(node, oldScope) {
-    const fn = (node) => {
-      this.element(node, oldScope || '', true);
-    };
-    this._transformDom(node, fn);
-  }
-
-  /**
-   * @param {?} element
-   * @param {?} styleRules
-   * @param {?=} callback
-   * @param {string=} cssBuild
-   * @param {string=} cssText
-   * @return {string}
-   */
-  elementStyles(element, styleRules, callback, cssBuild = '', cssText = '') {
-    // no need to shim selectors if settings.useNativeShadow, also
-    // a shady css build will already have transformed selectors
-    // NOTE: This method may be called as part of static or property shimming.
-    // When there is a targeted build it will not be called for static shimming,
-    // but when the property shim is used it is called and should opt out of
-    // static shimming work when a proper build exists.
-    if (cssText === '') {
-      if (nativeShadow || cssBuild === 'shady') {
-        cssText = StyleUtil.toCssText(styleRules, callback);
-      } else {
-        let {is, typeExtension} = StyleUtil.getIsExtends(element);
-        cssText = this.css(styleRules, is, typeExtension, callback) + '\n\n';
-      }
-    }
-    return cssText.trim();
-  }
-
-  // Given a string of cssText and a scoping string (scope), returns
-  // a string of scoped css where each selector is transformed to include
-  // a class created from the scope. ShadowDOM selectors are also transformed
-  // (e.g. :host) to use the scoping selector.
-  css(rules, scope, ext, callback) {
-    let hostScope = this._calcHostScope(scope, ext);
-    scope = this._calcElementScope(scope);
-    let self = this;
-    return StyleUtil.toCssText(rules, function(/** StyleNode */rule) {
-      if (!rule.isScoped) {
-        self.rule(rule, scope, hostScope);
-        rule.isScoped = true;
-      }
-      if (callback) {
-        callback(rule, scope, hostScope);
-      }
-    });
-  }
-
-  _calcElementScope(scope) {
-    if (scope) {
-      return CSS_CLASS_PREFIX + scope;
-    } else {
-      return '';
-    }
-  }
-
-  _calcHostScope(scope, ext) {
-    return ext ? `[is=${scope}]` : scope;
-  }
-
-  rule(rule, scope, hostScope) {
-    this._transformRule(rule, this._transformComplexSelector,
-      scope, hostScope);
-  }
-
-  /**
-   * transforms a css rule to a scoped rule.
-   *
-   * @param {StyleNode} rule
-   * @param {Function} transformer
-   * @param {string=} scope
-   * @param {string=} hostScope
-   */
-  _transformRule(rule, transformer, scope, hostScope) {
-    // NOTE: save transformedSelector for subsequent matching of elements
-    // against selectors (e.g. when calculating style properties)
-    rule['selector'] = rule.transformedSelector =
-      this._transformRuleCss(rule, transformer, scope, hostScope);
-  }
-
-  /**
-   * @param {StyleNode} rule
-   * @param {Function} transformer
-   * @param {string=} scope
-   * @param {string=} hostScope
-   */
-  _transformRuleCss(rule, transformer, scope, hostScope) {
-    let p$ = StyleUtil.splitSelectorList(rule['selector']);
-    // we want to skip transformation of rules that appear in keyframes,
-    // because they are keyframe selectors, not element selectors.
-    if (!StyleUtil.isKeyframesSelector(rule)) {
-      for (let i=0, l=p$.length, p; (i<l) && (p=p$[i]); i++) {
-        p$[i] = transformer.call(this, p, scope, hostScope);
-      }
-    }
-    return p$.filter((part) => Boolean(part)).join(COMPLEX_SELECTOR_SEP);
-  }
-
-  /**
-   * @param {string} selector
-   * @return {string}
-   */
-  _twiddleNthPlus(selector) {
-    return selector.replace(NTH, (m, type, inside) => {
-      if (inside.indexOf('+') > -1) {
-        inside = inside.replace(/\+/g, '___');
-      } else if (inside.indexOf('___') > -1) {
-        inside = inside.replace(/___/g, '+');
-      }
-      return `:${type}(${inside})`;
-    });
-  }
-
-  /**
-   * Preserve `:matches()` selectors by replacing them with MATCHES_REPLACMENT
-   * and returning an array of `:matches()` selectors.
-   * Use `_replacesMatchesPseudo` to replace the `:matches()` parts
-   *
-   * @param {string} selector
-   * @return {{selector: string, matches: !Array<string>}}
-   */
-  _preserveMatchesPseudo(selector) {
-    /** @type {!Array<string>} */
-    const matches = [];
-    let match;
-    while ((match = selector.match(MATCHES))) {
-      const start = match.index;
-      const end = StyleUtil.findMatchingParen(selector, start);
-      if (end === -1) {
-        throw new Error(`${match.input} selector missing ')'`)
-      }
-      const part = selector.slice(start, end + 1);
-      selector = selector.replace(part, MATCHES_REPLACEMENT);
-      matches.push(part);
-    }
-    return {selector, matches};
-  }
-
-  /**
-   * Replace MATCHES_REPLACMENT character with the given set of `:matches()`
-   * selectors.
-   *
-   * @param {string} selector
-   * @param {!Array<string>} matches
-   * @return {string}
-   */
-  _replaceMatchesPseudo(selector, matches) {
-    const parts = selector.split(MATCHES_REPLACEMENT);
-    return matches.reduce((acc, cur, idx) => acc + cur + parts[idx + 1], parts[0]);
-  }
-
-/**
- * @param {string} selector
- * @param {string} scope
- * @param {string=} hostScope
- */
-  _transformComplexSelector(selector, scope, hostScope) {
-    let stop = false;
-    selector = selector.trim();
-    // Remove spaces inside of selectors like `:nth-of-type` because it confuses SIMPLE_SELECTOR_SEP
-    let isNth = NTH.test(selector);
-    if (isNth) {
-      selector = selector.replace(NTH, (m, type, inner) => `:${type}(${inner.replace(/\s/g, '')})`)
-      selector = this._twiddleNthPlus(selector);
-    }
-    // Preserve selectors like `:-webkit-any` so that SIMPLE_SELECTOR_SEP does
-    // not get confused by spaces inside the pseudo selector
-    const isMatches = MATCHES.test(selector);
-    /** @type {!Array<string>} */
-    let matches;
-    if (isMatches) {
-      ({selector, matches} = this._preserveMatchesPseudo(selector));
-    }
-    selector = selector.replace(SLOTTED_START, `${HOST} $1`);
-    selector = selector.replace(SIMPLE_SELECTOR_SEP, (m, c, s) => {
-      if (!stop) {
-        let info = this._transformCompoundSelector(s, c, scope, hostScope);
-        stop = stop || info.stop;
-        c = info.combinator;
-        s = info.value;
-      }
-      return c + s;
-    });
-    // replace `:matches()` selectors
-    if (isMatches) {
-      selector = this._replaceMatchesPseudo(selector, matches);
-    }
-    if (isNth) {
-      selector = this._twiddleNthPlus(selector);
-    }
-    return selector;
-  }
-
-  _transformCompoundSelector(selector, combinator, scope, hostScope) {
-    // replace :host with host scoping class
-    let slottedIndex = selector.indexOf(SLOTTED);
-    if (selector.indexOf(HOST) >= 0) {
-      selector = this._transformHostSelector(selector, hostScope);
-    // replace other selectors with scoping class
-    } else if (slottedIndex !== 0) {
-      selector = scope ? this._transformSimpleSelector(selector, scope) :
-        selector;
-    }
-    // mark ::slotted() scope jump to replace with descendant selector + arg
-    // also ignore left-side combinator
-    let slotted = false;
-    if (slottedIndex >= 0) {
-      combinator = '';
-      slotted = true;
-    }
-    // process scope jumping selectors up to the scope jump and then stop
-    let stop;
-    if (slotted) {
-      stop = true;
-      if (slotted) {
-        // .zonk ::slotted(.foo) -> .zonk.scope > .foo
-        selector = selector.replace(SLOTTED_PAREN, (m, paren) => ` > ${paren}`);
-      }
-    }
-    selector = selector.replace(DIR_PAREN, (m, before, dir) =>
-      `[dir="${dir}"] ${before}, ${before}[dir="${dir}"]`);
-    return {value: selector, combinator, stop};
-  }
-
-  _transformSimpleSelector(selector, scope) {
-    const attributes = selector.split(/(\[.+?\])/);
-
-    const output = [];
-    for (let i = 0; i < attributes.length; i++) {
-      // Do not attempt to transform any attribute selector content
-      if ((i % 2) === 1) {
-        output.push(attributes[i]);
-      } else {
-        const part = attributes[i];
-
-        if (!(part === '' && i === attributes.length - 1)) {
-          let p$ = part.split(PSEUDO_PREFIX);
-          p$[0] += scope;
-          output.push(p$.join(PSEUDO_PREFIX));
-        }
-      }
-    }
-
-    return output.join('');
-  }
-
-  // :host(...) -> scopeName...
-  _transformHostSelector(selector, hostScope) {
-    let m = selector.match(HOST_PAREN);
-    let paren = m && m[2].trim() || '';
-    if (paren) {
-      if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) {
-        // paren starts with a type selector
-        let typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0];
-        // if the type selector is our hostScope then avoid pre-pending it
-        if (typeSelector === hostScope) {
-          return paren;
-        // otherwise, this selector should not match in this scope so
-        // output a bogus selector.
-        } else {
-          return SELECTOR_NO_MATCH;
-        }
-      } else {
-        // make sure to do a replace here to catch selectors like:
-        // `:host(.foo)::before`
-        return selector.replace(HOST_PAREN, function(m, host, paren) {
-          return hostScope + paren;
-        });
-      }
-    // if no paren, do a straight :host replacement.
-    // TODO(sorvell): this should not strictly be necessary but
-    // it's needed to maintain support for `:host[foo]` type selectors
-    // which have been improperly used under Shady DOM. This should be
-    // deprecated.
-    } else {
-      return selector.replace(HOST, hostScope);
-    }
-  }
-
-  /**
-   * @param {StyleNode} rule
-   */
-  documentRule(rule) {
-    // reset selector in case this is redone.
-    rule['selector'] = rule['parsedSelector'];
-    this.normalizeRootSelector(rule);
-    this._transformRule(rule, this._transformDocumentSelector);
-  }
-
-  /**
-   * @param {StyleNode} rule
-   */
-  normalizeRootSelector(rule) {
-    if (rule['selector'] === ROOT) {
-      rule['selector'] = 'html';
-    }
-  }
-
-/**
- * @param {string} selector
- */
-  _transformDocumentSelector(selector) {
-    if (selector.match(HOST)) {
-      // remove ':host' type selectors in document rules
-      return '';
-    } else if (selector.match(SLOTTED)) {
-      return this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR)
-    } else {
-      return this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);
-    }
-  }
-}
-
-const NTH = /:(nth[-\w]+)\(([^)]+)\)/;
-const SCOPE_DOC_SELECTOR = `:not(.${SCOPE_NAME})`;
-const COMPLEX_SELECTOR_SEP = ',';
-const SIMPLE_SELECTOR_SEP = /(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g;
-const SIMPLE_SELECTOR_PREFIX = /[[.:#*]/;
-const HOST = ':host';
-const ROOT = ':root';
-const SLOTTED = '::slotted';
-const SLOTTED_START = new RegExp(`^(${SLOTTED})`);
-// NOTE: this supports 1 nested () pair for things like
-// :host(:not([selected]), more general support requires
-// parsing which seems like overkill
-const HOST_PAREN = /(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;
-// similar to HOST_PAREN
-const SLOTTED_PAREN = /(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;
-const DIR_PAREN = /(.*):dir\((?:(ltr|rtl))\)/;
-const CSS_CLASS_PREFIX = '.';
-const PSEUDO_PREFIX = ':';
-const CLASS = 'class';
-const SELECTOR_NO_MATCH = 'should_not_match';
-const MATCHES = /:(?:matches|any|-(?:webkit|moz)-any)/;
-const MATCHES_REPLACEMENT = '\u{e000}';
-
-export default new StyleTransformer()
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/style-util.js b/systrace/catapult/third_party/polymer/components/shadycss/src/style-util.js
deleted file mode 100644
index 230a354..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/style-util.js
+++ /dev/null
@@ -1,411 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-import {nativeShadow, nativeCssVariables, cssBuild} from './style-settings.js';
-import {parse, stringify, types, StyleNode} from './css-parse.js'; // eslint-disable-line no-unused-vars
-import {MEDIA_MATCH} from './common-regex.js';
-import {processUnscopedStyle, isUnscopedStyle} from './unscoped-style-handler.js';
-
-/**
- * @param {string|StyleNode} rules
- * @param {function(StyleNode)=} callback
- * @return {string}
- */
-export function toCssText (rules, callback) {
-  if (!rules) {
-    return '';
-  }
-  if (typeof rules === 'string') {
-    rules = parse(rules);
-  }
-  if (callback) {
-    forEachRule(rules, callback);
-  }
-  return stringify(rules, nativeCssVariables);
-}
-
-/**
- * @param {HTMLStyleElement} style
- * @return {StyleNode}
- */
-export function rulesForStyle(style) {
-  if (!style['__cssRules'] && style.textContent) {
-    style['__cssRules'] = parse(style.textContent);
-  }
-  return style['__cssRules'] || null;
-}
-
-// Tests if a rule is a keyframes selector, which looks almost exactly
-// like a normal selector but is not (it has nothing to do with scoping
-// for example).
-/**
- * @param {StyleNode} rule
- * @return {boolean}
- */
-export function isKeyframesSelector(rule) {
-  return Boolean(rule['parent']) &&
-  rule['parent']['type'] === types.KEYFRAMES_RULE;
-}
-
-/**
- * @param {StyleNode} node
- * @param {Function=} styleRuleCallback
- * @param {Function=} keyframesRuleCallback
- * @param {boolean=} onlyActiveRules
- */
-export function forEachRule(node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) {
-  if (!node) {
-    return;
-  }
-  let skipRules = false;
-  let type = node['type'];
-  if (onlyActiveRules) {
-    if (type === types.MEDIA_RULE) {
-      let matchMedia = node['selector'].match(MEDIA_MATCH);
-      if (matchMedia) {
-        // if rule is a non matching @media rule, skip subrules
-        if (!window.matchMedia(matchMedia[1]).matches) {
-          skipRules = true;
-        }
-      }
-    }
-  }
-  if (type === types.STYLE_RULE) {
-    styleRuleCallback(node);
-  } else if (keyframesRuleCallback &&
-    type === types.KEYFRAMES_RULE) {
-    keyframesRuleCallback(node);
-  } else if (type === types.MIXIN_RULE) {
-    skipRules = true;
-  }
-  let r$ = node['rules'];
-  if (r$ && !skipRules) {
-    for (let i=0, l=r$.length, r; (i<l) && (r=r$[i]); i++) {
-      forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules);
-    }
-  }
-}
-
-// add a string of cssText to the document.
-/**
- * @param {string} cssText
- * @param {string} moniker
- * @param {Node} target
- * @param {Node} contextNode
- * @return {HTMLStyleElement}
- */
-export function applyCss(cssText, moniker, target, contextNode) {
-  let style = createScopeStyle(cssText, moniker);
-  applyStyle(style, target, contextNode);
-  return style;
-}
-
-/**
- * @param {string} cssText
- * @param {string} moniker
- * @return {HTMLStyleElement}
- */
-export function createScopeStyle(cssText, moniker) {
-  let style = /** @type {HTMLStyleElement} */(document.createElement('style'));
-  if (moniker) {
-    style.setAttribute('scope', moniker);
-  }
-  style.textContent = cssText;
-  return style;
-}
-
-/**
- * Track the position of the last added style for placing placeholders
- * @type {Node}
- */
-let lastHeadApplyNode = null;
-
-// insert a comment node as a styling position placeholder.
-/**
- * @param {string} moniker
- * @return {!Comment}
- */
-export function applyStylePlaceHolder(moniker) {
-  let placeHolder = document.createComment(' Shady DOM styles for ' +
-    moniker + ' ');
-  let after = lastHeadApplyNode ?
-    lastHeadApplyNode['nextSibling'] : null;
-  let scope = document.head;
-  scope.insertBefore(placeHolder, after || scope.firstChild);
-  lastHeadApplyNode = placeHolder;
-  return placeHolder;
-}
-
-/**
- * @param {HTMLStyleElement} style
- * @param {?Node} target
- * @param {?Node} contextNode
- */
-export function applyStyle(style, target, contextNode) {
-  target = target || document.head;
-  let after = (contextNode && contextNode.nextSibling) ||
-    target.firstChild;
-  target.insertBefore(style, after);
-  if (!lastHeadApplyNode) {
-    lastHeadApplyNode = style;
-  } else {
-    // only update lastHeadApplyNode if the new style is inserted after the old lastHeadApplyNode
-    let position = style.compareDocumentPosition(lastHeadApplyNode);
-    if (position === Node.DOCUMENT_POSITION_PRECEDING) {
-      lastHeadApplyNode = style;
-    }
-  }
-}
-
-/**
- * @param {string} buildType
- * @return {boolean}
- */
-export function isTargetedBuild(buildType) {
-  return nativeShadow ? buildType === 'shadow' : buildType === 'shady';
-}
-
-/**
- * Walk from text[start] matching parens and
- * returns position of the outer end paren
- * @param {string} text
- * @param {number} start
- * @return {number}
- */
-export function findMatchingParen(text, start) {
-  let level = 0;
-  for (let i=start, l=text.length; i < l; i++) {
-    if (text[i] === '(') {
-      level++;
-    } else if (text[i] === ')') {
-      if (--level === 0) {
-        return i;
-      }
-    }
-  }
-  return -1;
-}
-
-/**
- * @param {string} str
- * @param {function(string, string, string, string)} callback
- */
-export function processVariableAndFallback(str, callback) {
-  // find 'var('
-  let start = str.indexOf('var(');
-  if (start === -1) {
-    // no var?, everything is prefix
-    return callback(str, '', '', '');
-  }
-  //${prefix}var(${inner})${suffix}
-  let end = findMatchingParen(str, start + 3);
-  let inner = str.substring(start + 4, end);
-  let prefix = str.substring(0, start);
-  // suffix may have other variables
-  let suffix = processVariableAndFallback(str.substring(end + 1), callback);
-  let comma = inner.indexOf(',');
-  // value and fallback args should be trimmed to match in property lookup
-  if (comma === -1) {
-    // variable, no fallback
-    return callback(prefix, inner.trim(), '', suffix);
-  }
-  // var(${value},${fallback})
-  let value = inner.substring(0, comma).trim();
-  let fallback = inner.substring(comma + 1).trim();
-  return callback(prefix, value, fallback, suffix);
-}
-
-/**
- * @param {Element} element
- * @param {string} value
- */
-export function setElementClassRaw(element, value) {
-  // use native setAttribute provided by ShadyDOM when setAttribute is patched
-  if (nativeShadow) {
-    element.setAttribute('class', value);
-  } else {
-    window['ShadyDOM']['nativeMethods']['setAttribute'].call(element, 'class', value);
-  }
-}
-
-export const wrap = window['ShadyDOM'] && window['ShadyDOM']['wrap'] || ((node) => node);
-
-/**
- * @param {Element | {is: string, extends: string}} element
- * @return {{is: string, typeExtension: string}}
- */
-export function getIsExtends(element) {
-  let localName = element['localName'];
-  let is = '', typeExtension = '';
-  /*
-  NOTE: technically, this can be wrong for certain svg elements
-  with `-` in the name like `<font-face>`
-  */
-  if (localName) {
-    if (localName.indexOf('-') > -1) {
-      is = localName;
-    } else {
-      typeExtension = localName;
-      is = (element.getAttribute && element.getAttribute('is')) || '';
-    }
-  } else {
-    is = /** @type {?} */(element).is;
-    typeExtension = /** @type {?} */(element).extends;
-  }
-  return {is, typeExtension};
-}
-
-/**
- * @param {Element|DocumentFragment} element
- * @return {string}
- */
-export function gatherStyleText(element) {
-  /** @type {!Array<string>} */
-  const styleTextParts = [];
-  const styles = /** @type {!NodeList<!HTMLStyleElement>} */(element.querySelectorAll('style'));
-  for (let i = 0; i < styles.length; i++) {
-    const style = styles[i];
-    if (isUnscopedStyle(style)) {
-      if (!nativeShadow) {
-        processUnscopedStyle(style);
-        style.parentNode.removeChild(style);
-      }
-    } else {
-      styleTextParts.push(style.textContent);
-      style.parentNode.removeChild(style);
-    }
-  }
-  return styleTextParts.join('').trim();
-}
-
-/**
- * Split a selector separated by commas into an array in a smart way
- * @param {string} selector
- * @return {!Array<string>}
- */
-export function splitSelectorList(selector) {
-  const parts = [];
-  let part = '';
-  for (let i = 0; i >= 0 && i < selector.length; i++) {
-    // A selector with parentheses will be one complete part
-    if (selector[i] === '(') {
-      // find the matching paren
-      const end = findMatchingParen(selector, i);
-      // push the paren block into the part
-      part += selector.slice(i, end + 1);
-      // move the index to after the paren block
-      i = end;
-    } else if (selector[i] === ',') {
-      parts.push(part);
-      part = '';
-    } else {
-      part += selector[i];
-    }
-  }
-  // catch any pieces after the last comma
-  if (part) {
-    parts.push(part);
-  }
-  return parts;
-}
-
-const CSS_BUILD_ATTR = 'css-build';
-
-/**
- * Return the polymer-css-build "build type" applied to this element
- *
- * @param {!HTMLElement} element
- * @return {string} Can be "", "shady", or "shadow"
- */
-export function getCssBuild(element) {
-  if (cssBuild !== undefined) {
-    return /** @type {string} */(cssBuild);
-  }
-  if (element.__cssBuild === undefined) {
-    // try attribute first, as it is the common case
-    const attrValue = element.getAttribute(CSS_BUILD_ATTR);
-    if (attrValue) {
-      element.__cssBuild = attrValue;
-    } else {
-      const buildComment = getBuildComment(element);
-      if (buildComment !== '') {
-        // remove build comment so it is not needlessly copied into every element instance
-        removeBuildComment(element);
-      }
-      element.__cssBuild = buildComment;
-    }
-  }
-  return element.__cssBuild || '';
-}
-
-/**
- * Check if the given element, either a <template> or <style>, has been processed
- * by polymer-css-build.
- *
- * If so, then we can make a number of optimizations:
- * - polymer-css-build will decompose mixins into individual CSS Custom Properties,
- * so the ApplyShim can be skipped entirely.
- * - Under native ShadowDOM, the style text can just be copied into each instance
- * without modification
- * - If the build is "shady" and ShadyDOM is in use, the styling does not need
- * scoping beyond the shimming of CSS Custom Properties
- *
- * @param {!HTMLElement} element
- * @return {boolean}
- */
-export function elementHasBuiltCss(element) {
-  return getCssBuild(element) !== '';
-}
-
-/**
- * For templates made with tagged template literals, polymer-css-build will
- * insert a comment of the form `<!--css-build:shadow-->`
- *
- * @param {!HTMLElement} element
- * @return {string}
- */
-export function getBuildComment(element) {
-  const buildComment = element.localName === 'template' ?
-      /** @type {!HTMLTemplateElement} */ (element).content.firstChild :
-      element.firstChild;
-  if (buildComment instanceof Comment) {
-    const commentParts = buildComment.textContent.trim().split(':');
-    if (commentParts[0] === CSS_BUILD_ATTR) {
-      return commentParts[1];
-    }
-  }
-  return '';
-}
-
-/**
- * Check if the css build status is optimal, and do no unneeded work.
- *
- * @param {string=} cssBuild CSS build status
- * @return {boolean} css build is optimal or not
- */
-export function isOptimalCssBuild(cssBuild = '') {
-  // CSS custom property shim always requires work
-  if (cssBuild === '' || !nativeCssVariables) {
-    return false;
-  }
-  return nativeShadow ? cssBuild === 'shadow' : cssBuild === 'shady';
-}
-
-/**
- * @param {!HTMLElement} element
- */
-function removeBuildComment(element) {
-  const buildComment = element.localName === 'template' ?
-      /** @type {!HTMLTemplateElement} */ (element).content.firstChild :
-      element.firstChild;
-  buildComment.parentNode.removeChild(buildComment);
-}
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/template-map.js b/systrace/catapult/third_party/polymer/components/shadycss/src/template-map.js
deleted file mode 100644
index d3eb840..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/template-map.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-/**
- * @const {!Object<string, !HTMLTemplateElement>}
- */
-const templateMap = {};
-export default templateMap;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/src/unscoped-style-handler.js b/systrace/catapult/third_party/polymer/components/shadycss/src/unscoped-style-handler.js
deleted file mode 100644
index 95e994f..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/src/unscoped-style-handler.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-/** @type {!Set<string>} */
-const styleTextSet = new Set();
-
-export const scopingAttribute = 'shady-unscoped';
-
-/**
- * Add a specifically-marked style to the document directly, and only one copy of that style.
- *
- * @param {!HTMLStyleElement} style
- * @return {undefined}
- */
-export function processUnscopedStyle(style) {
-  const text = style.textContent;
-  if (!styleTextSet.has(text)) {
-    styleTextSet.add(text);
-    const newStyle = style.cloneNode(true);
-    document.head.appendChild(newStyle);
-  }
-}
-
-/**
- * Check if a style is supposed to be unscoped
- * @param {!HTMLStyleElement} style
- * @return {boolean} true if the style has the unscoping attribute
- */
-export function isUnscopedStyle(style) {
-  return style.hasAttribute(scopingAttribute);
-}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/apply-shim.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/apply-shim.html
deleted file mode 100644
index dd22136..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/apply-shim.html
+++ /dev/null
@@ -1,343 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script>
-  if (customElements.polyfillWrapFlushCallback) {
-    // delay definition of custom-style until after template polyfill loads
-    customElements.polyfillWrapFlushCallback(function(cb) {
-      HTMLImports.whenReady(cb);
-    });
-  }
-  </script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/custom-style-element.js"></script>
-  <script src="module/generated/make-element.js"></script>
-  <title>Apply Shim</title>
-
-</head>
-<body>
-  <template id="basic">
-    <style>
-    :host {
-      --mixin: {
-        border: 2px solid black;
-      };
-    }
-    div {
-      @apply --mixin;
-    }
-    </style>
-  </template>
-
-  <template id="defaults">
-    <style>
-    :host {
-      --mixin: {
-        border: 2px solid black;
-      }
-    }
-    div {
-      border: 1px dotted orange;
-      @apply --mixin;
-    }
-    span {
-      border: inherit;
-      @apply --mixin;
-    }
-    span {
-      border: initial;
-      @apply --mixin;
-    }
-    </style>
-  </template>
-
-  <template id="override">
-    <style>
-    :host {
-      --override: {
-        padding: 2px;
-      };
-    }
-    :host([override]) {
-      --override: {
-        border: 2px solid black;
-      };
-    }
-    div {
-      @apply --override;
-    }
-    </style>
-  </template>
-
-  <template id="override-with-property">
-    <style>
-    :root {
-      --prop-mixin: {
-        border: 2px solid black;
-      };
-    }
-    x-foo {
-      --prop-mixin: blue;
-      color: var(--prop-mixin);
-    }
-    div {
-      @apply --prop-mixin;
-    }
-    </style>
-  </template>
-
-  <template id="define-with-var">
-    <style>
-    :root {
-      --mixin-var: {
-        border: 2px solid black;
-      };
-    }
-    div {
-      --mixin-var2: var(--mixin-var);
-    }
-    span {
-      --mixin-var: 20px;
-      --variable: var(--mixin-var);
-    }
-    </style>
-  </template>
-
-  <template id="x-element">
-    <style>
-    :host {
-      @apply --my-mixin;
-    }
-    </style>
-  </template>
-
-  <template id="x-element2">
-    <custom-style>
-    <style>
-    html {
-      --my-mixin: {
-        border: 2px solid black;
-      };
-    }
-    </style>
-    </custom-style>
-  </template>
-  <template id="important">
-    <style>
-    :host {
-      --mixin-important: {
-        background-color: white;
-        border: 2px solid black !important;
-        color: white !important;
-      };
-      --mixin: {
-        background-color: red;
-        border: 1px dotted orange;
-        color: black !important;
-      };
-    }
-    div {
-      @apply --mixin-important;
-      @apply --mixin;
-    }
-    </style>
-  </template>
-  <script>
-  suite('Apply Shim', function() {
-    function copy(name) {
-      var template = document.querySelector('template#' + name);
-      return template.content.cloneNode(true);
-    }
-
-    function prep(templateName, elementName) {
-      var style = copy(templateName).querySelector('style');
-      var ast = window.ShadyCSS.ApplyShim.transformStyle(style, elementName);
-      return {style: style, ast: ast};
-    }
-
-    suite('Basic', function() {
-      var style, ast;
-      suiteSetup(function() {
-        var info = prep('basic');
-        style = info.style;
-        ast = info.ast;
-        style.textContent = window.ShadyCSS.ScopingShim.styleAstToString(ast);
-      });
-
-      test('style is transformed', function() {
-        var orig = copy('basic').querySelector('style');
-        assert.notEqual(style.textContent, orig.textContent);
-      });
-
-      test('mixin became custom properties', function() {
-        var definition = ast.rules[0];
-        var application = ast.rules[1];
-        assert.match(definition.cssText, /--mixin_-_border:\s*2px solid black/);
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border\)/);
-      });
-    });
-    suite('Defaults', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('defaults');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('properties defined before mixin are used as defaults', function() {
-        var application = ast.rules[1];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*1px dotted orange\)/);
-      });
-
-      test('inherit and initial default values are preserved', function() {
-        var application = ast.rules[2];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*inherit\)/);
-        application = ast.rules[3];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*initial\)/);
-      });
-    });
-
-    suite('override', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('override');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('mixin redefinition sets unused properties to initial', function() {
-        var def1 = ast.rules[0];
-        assert.match(def1.cssText, /--override_-_padding:\s*2px/);
-        var def2 = ast.rules[1];
-        assert.match(def2.cssText, /--override_-_padding:\s*initial/);
-        assert.match(def2.cssText, /--override_-_border:\s*2px solid black/);
-      });
-
-      test('mixin application includes all values', function() {
-        var application = ast.rules[2];
-        assert.match(application.cssText, /padding:\s*var\(--override_-_padding\)/);
-        assert.match(application.cssText, /border:\s*var\(--override_-_border\)/);
-      });
-    });
-
-    suite('override with property', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('override-with-property');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('mixin definition defers to property definition', function() {
-        var def = ast.rules[1];
-        assert.notMatch(def.cssText, /border:\s*var\(--prop-mixin_-_border\)/);
-      });
-
-      test('mixin can still be used by other parts of the page', function() {
-        var def = ast.rules[2];
-        assert.match(def.cssText, /border:\s*var\(--prop-mixin_-_border\)/);
-      });
-    });
-
-    suite('define with var()', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('define-with-var');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('mixin-var2 is defined with mixin-var\'s values', function() {
-        var def = ast.rules[1];
-        assert.match(def.cssText, /--mixin-var2_-_border:\s*var\(--mixin-var_-_border\)/);
-      });
-
-      test('var usage of mixin is not removed, preserving override functionality', function() {
-        var def = ast.rules[2];
-        assert.match(def.cssText, /--variable:\s*var\(--mixin-var\)/);
-      });
-    });
-
-    suite('invalidation on new definitions', function() {
-      var style, ast, element;
-      suiteSetup(function() {
-        makeElement('x-element');
-        element = document.createElement('x-element');
-        document.body.appendChild(element);
-        style = element.shadowRoot ? element.shadowRoot.querySelector('style') : document.head.querySelector('style[scope=x-element]');
-      });
-
-      test('element initially has no definition', function() {
-        var ast = window.ShadyCSS.ScopingShim._styleInfoForNode(element)._getStyleRules();
-        assert.equal(ast.rules[0].cssText, ';');
-      });
-
-      test('Revalidating Apply Shim on element template fills in properties', function() {
-        var nodes = copy('x-element2');
-        document.body.appendChild(nodes);
-        window.ShadyCSS.styleDocument();
-        var ast = window.ShadyCSS.ScopingShim._styleInfoForNode(element)._getStyleRules();
-        if (window.ShadyCSS.nativeCss) {
-          assert.match(ast.rules[0].cssText, /border:\s*var\(--my-mixin_-_border\)/);
-        } else {
-          assert.match(ast.rules[0].cssText, /border:\s*2px solid black/);
-        }
-      });
-    });
-    suite('!important', function() {
-      var ast;
-      suiteSetup(function() {
-        var info = prep('important');
-        ast = info.ast;
-      });
-
-      test('!important in mixin correctly translates to !important in resulting custom property', function() {
-        var application = ast.rules[1];
-        assert.match(application.cssText, /border:\s*var\(--mixin-important_-_border\)\s*!important/);
-      });
-      test("Fallback of related property without !important is kept without !important in resulting custom property", function() {
-        var application = ast.rules[1];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*var\(--mixin-important_-_border\)\)/);
-      });
-      test('Two mixins with both !important are treated in correct order while also preserving !important in resulting custom property', function () {
-        var application = ast.rules[1];
-        assert.match(application.cssText, /color:\s*var\(--mixin-important_-_color\)\s*!important/);
-        assert.match(application.cssText, /color:\s*var\(--mixin_-_color,\s*var\(--mixin-important_-_color\)\)\s*!important/);
-      })
-      test('Properties without !important in a mixin with !important are treated independently', function() {
-        var application = ast.rules[1];
-        assert.match(application.cssText, /background-color:\s*var\(--mixin_-_background-color,\s*var\(--mixin-important_-_background-color\)\)/);
-        assert.notMatch(application.cssText, /background-color:\s*var\(--mixin_-_background-color,\s*var\(--mixin-important_-_background-color\)\)\s*!important/);
-
-        assert.match(application.cssText, /background-color:\s*var\(--mixin-important_-_background-color\)/);
-        assert.notMatch(application.cssText, /background-color:\s*var\(--mixin-important_-_background-color\)\s*!important/);
-      });
-    });
-  });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/async-loading.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/async-loading.html
deleted file mode 100644
index c285ce3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/async-loading.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype html>
-<script>
-  WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-</script>
-<script src="./test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js" defer></script>
-<script src="../scoping-shim.min.js" defer></script>
-<script>
-  suite('defered loading', () => {
-    test('Loading works as expected', () => {
-    });
-  })
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/chrome-devtools.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/chrome-devtools.html
deleted file mode 100644
index 602c207..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/chrome-devtools.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<title>Chrome Dev Tools emulation</title>
-<script>
-  // define user agent to be Safari 9
-  Object.defineProperty(navigator, 'userAgent', { value: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1' });
-</script>
-<script src="test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="module/generated/style-settings.js"></script>
-<script>
-  suite('Chrome Devtools', () => {
-    test('Emaulating iOS, native css variables are tied to native shadowdom support', () => {
-      if (!window.ShadyDOM || !window.ShadyDOM.inUse) {
-        assert.isTrue(window.StyleSettings.nativeCssVariables);
-      }
-    });
-  })
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/complicated-mixin-ordering.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/complicated-mixin-ordering.html
deleted file mode 100644
index 552a1e6..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/complicated-mixin-ordering.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <meta charset="utf-8">
-  <script>
-    WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script>
-    if (customElements.polyfillWrapFlushCallback) {
-      // delay definition of custom-style until after template polyfill loads
-      customElements.polyfillWrapFlushCallback(function (cb) {
-        HTMLImports.whenReady(cb);
-      });
-    }
-  </script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/custom-style-element.js"></script>
-  <script src="module/generated/make-element.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <title>Complicated Order</title>
-
-</head>
-
-<body>
-  <template id="child-element">
-    <style>
-      p {
-        @apply --my-mixin;
-      }
-    </style>
-    <p>I'm a DOM element. This is my local DOM!</p>
-  </template>
-
-  <template id="container-element">
-    <style>
-      child-element {
-        --my-mixin: {
-          background-color: rgb(255, 0, 0);
-        }
-      }
-    </style>
-    <child-element></child-element>
-  </template>
-
-  <template id="other-container-element">
-    <style>
-      child-element {
-        --my-mixin: {
-          font-size: 40px;
-          background-color: rgb(0, 255, 0);
-        }
-      }
-    </style>
-    <child-element></child-element>
-  </template>
-
-  <container-element></container-element>
-  <other-container-element></other-container-element>
-
-  <script>
-    suite('Complicated Order', () => {
-      function assertComputed(node, property, expectedValue, msg) {
-        assert.equal(getComputedStyle(node).getPropertyValue(property).trim(), expectedValue, msg);
-      }
-      suiteSetup(() => {
-        makeElement('child-element');
-        makeElement('container-element');
-        makeElement('other-container-element');
-      });
-      test('complicated ordering works as expected', () => {
-        let initialFontSize = getComputedStyle(document.head).getPropertyValue('font-size').trim();
-        let con = document.querySelector('container-element');
-        let oth = document.querySelector('other-container-element');
-        assertComputed(con.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'background-color', 'rgb(255, 0, 0)');
-        assertComputed(con.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'font-size', initialFontSize);
-        assertComputed(oth.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'background-color', 'rgb(0, 255, 0)');
-        assertComputed(oth.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'font-size', '40px');
-        con.parentNode.removeChild(con);
-        oth.parentNode.removeChild(oth);
-      })
-    })
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/css-parse.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/css-parse.html
deleted file mode 100644
index 6fb9846..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/css-parse.html
+++ /dev/null
@@ -1,188 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="module/generated/css-parse.js"></script>
-
-  <title>css-parse</title>
-
-</head>
-<body>
-
-  <style id="test">
-    :host {
-      background: red;
-    }
-
-    .foo .bar .baz, zonk[happy]:focus {
-      font-family: sans-serif;
-      font-size: 15px;
-    }
-
-    @-webkit-keyframes fill-unfill-rotate {
-      12.5% { transform: rotate(135deg);  }
-      25%   { transform: rotate(270deg);  }
-      37.5% { transform: rotate(405deg);  }
-      50%   { transform: rotate(540deg);  }
-      62.5% { transform: rotate(675deg);  }
-      75%   { transform: rotate(810deg);  }
-      87.5% { transform: rotate(945deg);  }
-      to    { transform: rotate(1080deg); }
-    }
-
-    @media (max-width: 400px) {
-      div {
-        margin-left: 0 !important;
-      }
-    }
-  </style>
-
-  <style id="test-ignore">
-    @import '';
-
-    /* comment */
-    .stuff {
-      background: red;
-    }
-    /* comment */
-
-    /*
-      This is a multi-line comment
-    */
-
-    /*.aclassThatShouldBeIgnored {
-      someProperty: thatMustNotShowUp
-    }*/
-  </style>
-
-  <style id="short-escape-sequence">
-    .\33 d-model {
-      border-top: 3px solid red;
-    }
-    .\a33 d-model {
-      border-top: 3px solid red;
-    }
-    .\b333 d-model {
-      border-top: 3px solid red;
-    }
-    .\c3333 d-model {
-      border-top: 3px solid red;
-    }
-    .\d33333 d-model {
-      border-top: 3px solid red;
-    }
-    .\e33333d-model {
-      border-top: 3px solid red;
-    }
-  </style>
-
-  <style id="multiple-spaces">
-    .foo  .bar {}
-    .foo    .bar {}
-    .foo
-
-
-    .bar {}
-  </style>
-
-  <style id="empty"></style>
-<script>
-
-  function sanitizeCss(text) {
-    return text.replace(/[\s]+/g, ' ').trim();
-  }
-
-  suite('css-parse', function() {
-    var s, tree;
-
-    setup(function() {
-      s = document.querySelector('style#test');
-      tree = window.CssParse.parse(s.textContent);
-    });
-
-    test('window.CssParse rules parse', function() {
-      assert.equal(tree.rules.length, 4, 'unexpected number of rules');
-      assert.equal(tree.rules[2].rules.length, 8, 'unexpected number of rules in keyframes');
-      assert.equal(tree.rules[3].rules.length, 1, 'unexpected number of rules in @media');
-    });
-
-    test('rule selectors parse', function() {
-      assert.equal(tree.rules[0].selector, ':host', 'unexpected selector');
-      assert.equal(tree.rules[2].selector, '@-webkit-keyframes fill-unfill-rotate', 'unexpected selector in keyframes');
-      assert.equal(tree.rules[3].selector, '@media (max-width: 400px)', 'unexpected selector in @media');
-    });
-
-    test('rule cssText parse', function() {
-      assert.equal(tree.rules[0].cssText, 'background: red;', 'unexpected cssText');
-      assert.match(tree.rules[2].cssText, /^12.5%/, 'unexpected cssText in keyframes');
-      assert.equal(tree.rules[2].rules[2].cssText, 'transform: rotate(405deg);', 'unexpected cssText in keyframes');
-      assert.match(tree.rules[3].cssText, /^div/, 'unexpected cssText in @media');
-      assert.equal(tree.rules[3].rules[0].cssText, 'margin-left: 0 !important;', 'unexpected cssText in @media');
-    });
-
-    test('rule types', function() {
-      assert.equal(tree.rules[0].type, window.CssParse.types.STYLE_RULE);
-      assert.equal(tree.rules[1].type, window.CssParse.types.STYLE_RULE);
-      assert.equal(tree.rules[2].type, window.CssParse.types.KEYFRAMES_RULE);
-      assert.equal(tree.rules[3].type, window.CssParse.types.MEDIA_RULE);
-      assert.equal(tree.rules[3].rules[0].type, window.CssParse.types.STYLE_RULE);
-
-    });
-
-    test('rules stringify', function() {
-      var orig = sanitizeCss(s.textContent);
-      var result = sanitizeCss(window.CssParse.stringify(tree));
-      assert.equal(result, orig, 'unexpected stringified output');
-    });
-
-    test('parse correctly ignores @import and comments', function() {
-      var s2 = document.querySelector('#test-ignore');
-      var t = window.CssParse.parse(s2.textContent);
-      assert.equal(t.rules[0].selector, '.stuff', 'unexpected rule selector');
-      assert.equal(t.rules[0].cssText, 'background: red;', 'unexpected rule cssText');
-      var result = sanitizeCss(window.CssParse.stringify(t));
-      assert.equal(result, '.stuff { background: red; }', 'unexpected stringified output');
-    });
-
-    test('short escape sequences', function() {
-      var s3 = document.querySelector('#short-escape-sequence');
-      var t = window.CssParse.parse(s3.textContent);
-      assert.equal(t.rules[0].selector, '.\\000033d-model');
-      assert.equal(t.rules[1].selector, '.\\000a33d-model');
-      assert.equal(t.rules[2].selector, '.\\00b333d-model');
-      assert.equal(t.rules[3].selector, '.\\0c3333d-model');
-      assert.equal(t.rules[4].selector, '.\\d33333d-model');
-      assert.equal(t.rules[5].selector, '.\\e33333d-model');
-    });
-
-    test('multiple consequent spaces in CSS selector', function() {
-      var s4 = document.querySelector('#multiple-spaces');
-      var t = window.CssParse.parse(s4.textContent);
-      assert.equal(t.rules[0].selector, '.foo .bar');
-      assert.equal(t.rules[1].selector, '.foo .bar');
-      assert.equal(t.rules[2].selector, '.foo .bar');
-    });
-
-    test('empty styles are are handled', function() {
-      var s = document.querySelector('#empty');
-      var t = window.CssParse.parse(s.textContent);
-      window.CssParse.stringify(t);
-    });
-
-  });
-</script>
-
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-import.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-import.html
deleted file mode 100644
index 15e3414..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-import.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="./test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="../apply-shim.min.js"></script>
-<script src="../custom-style-interface.min.js"></script>
-<script src="module/generated/make-element.js"></script>
-<script src="module/generated/custom-style-element.js"></script>
-<link rel="import" href="html-imports/custom-style-import.html">
-
-<template id="x-import">
-  <style>
-  :host {
-    border: 2px solid var(--color, black);
-  }
-  </style>
-</template>
-
-<x-import id="target"></x-import>
-
-<script>
-  suite('Custom Style upgrades', function() {
-    suiteSetup(function() {
-      makeElement('x-import');
-    });
-    test('custom-style in import provides styling', function() {
-      var target = document.querySelector('#target');
-      assert.equal(getComputedStyle(target).borderColor, 'rgb(0, 0, 255)');
-    });
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-late.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-late.html
deleted file mode 100644
index 3aac557..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-late.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="./test-flags.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="../apply-shim.min.js"></script>
-  <script>
-  if (customElements.polyfillWrapFlushCallback) {
-    // delay definition of custom-style until after template polyfill loads
-    customElements.polyfillWrapFlushCallback(function(cb) {
-      HTMLImports.whenReady(cb);
-    });
-  }
-  </script>
-<script src="../custom-style-interface.min.js"></script>
-<script src="module/generated/make-element.js"></script>
-<script src="module/generated/custom-style-element.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-
-<template id="late">
-  <custom-style class="late-style">
-    <style>
-    html {
-      --late: {
-        border: 2px solid red;
-      };
-    }
-    </style>
-  </custom-style>
-</template>
-
-<template id="x-late">
-  <style>
-    :host {
-      display: block;
-      @apply --late;
-    }
-  </style>
-  <div>late</div>
-</template>
-
-<template id="x-host">
-  <style>
-  :host {
-    display: block;
-    padding: 4px;
-  }
-  </style>
-  <x-late></x-late>
-</template>
-
-<x-host></x-host>
-
-<script>
-suite('Async custom-style', function() {
-  suiteSetup(function() {
-    makeElement('x-host');
-  });
-  test('late custom-style updates elements', function(done) {
-    var lateTemplate = document.querySelector('template#late');
-    var host = document.querySelector('x-host');
-    var inner = host.shadowRoot.querySelector('x-late');
-    requestAnimationFrame(function() {
-      document.body.appendChild(document.importNode(lateTemplate.content, true));
-      makeElement('x-late');
-      requestAnimationFrame(function() {
-        assert.equal(getComputedStyle(inner).borderTopWidth.trim(), '2px');
-        done();
-      });
-    });
-  })
-})
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-only.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-only.html
deleted file mode 100644
index 016469b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style-only.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script src="./test-flags.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script>
-  WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-</script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="../apply-shim.min.js"></script>
-<script>
-if (window.customElements && customElements.polyfillWrapFlushCallback) {
-  // delay definition of custom-style until after template polyfill loads
-  customElements.polyfillWrapFlushCallback(function(cb) {
-    HTMLImports.whenReady(cb);
-  });
-}
-</script>
-<script src="../custom-style-interface.min.js"></script>
-<script src="module/generated/custom-style-element.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-
-<custom-style id="indoc">
-  <style>
-    #target {
-      display: block;
-      @apply --late;
-    }
-  </style>
-</custom-style>
-
-<template id="late">
-  <custom-style class="late-style">
-    <style>
-    html {
-      --late: {
-        border: 2px solid red;
-      };
-    }
-    </style>
-  </custom-style>
-</template>
-
-<div id="target"></div>
-
-<script>
-suite('custom-style only', function() {
-  var host = document.querySelector('#target');
-  test('custom-style by itself works as expected', function() {
-    assert.equal(getComputedStyle(host).getPropertyValue('display').trim(), 'block');
-  });
-  test('late custom-style updates styling', function(done) {
-    var lateTemplate = document.querySelector('template#late');
-    document.body.appendChild(document.importNode(lateTemplate.content, true));
-    // two rAF to wait for after custom-style-interface's batching
-    requestAnimationFrame(function(){
-      requestAnimationFrame(function(){
-        assert.equal(getComputedStyle(host).borderTopWidth.trim(), '2px');
-        done();
-      });
-    });
-  });
-})
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style.html
deleted file mode 100644
index 8faa10f..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/custom-style.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="./test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="../apply-shim.min.js"></script>
-<script src="../custom-style-interface.min.js"></script>
-<script src="module/generated/make-element.js"></script>
-<script src="module/generated/custom-style-element.js"></script>
-
-<custom-style>
-  <style>
-  html {
-    --foo: rgb(123, 123, 123);
-    --bar: {
-      border: 2px solid red;
-    }
-  }
-
-  </style>
-</custom-style>
-<custom-style>
-  <style>
-  :root {
-    --svg-icon: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-    --svg-icon-2: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-  }
-  .base64 {
-    background-image: var(--svg-icon);
-  }
-  </style>
-</custom-style>
-
-<template id="x-inner">
-  <style>
-    :host {
-      display: block;
-      height: 100px;
-      width: 100px;
-      border: 4px solid blue;
-      background-color: var(--foo);
-      @apply --bar;
-    }
-  </style>
-</template>
-
-<template id="x-outer">
-  <style>
-  :host {
-    display: block;
-    @apply --bar;
-  }
-  </style>
-  <x-inner></x-inner>
-</template>
-
-<x-outer id="target"></x-outer>
-
-<div class="base64">base64</div>
-
-<script>
-  suite('Custom Style upgrades', function() {
-    suiteSetup(function() {
-      makeElement('x-inner');
-      makeElement('x-outer');
-    });
-    test('custom-style applies to deeply nested elements', function() {
-      var target = document.querySelector('#target');
-      var inner = target.shadowRoot.querySelector('x-inner');
-      assert.equal(getComputedStyle(inner).backgroundColor, 'rgb(123, 123, 123)');
-    });
-    test('custom-style applied mixins update', function() {
-      var target = document.querySelector('#target');
-      var inner = target.shadowRoot.querySelector('x-inner');
-      assert.equal(getComputedStyle(target).borderTopWidth.trim(), '2px');
-      assert.equal(getComputedStyle(inner).borderTopWidth.trim(), '2px');
-    });
-    test('custom-style with base64 in variable', function() {
-      var target = document.querySelector('.base64');
-      assert.match(getComputedStyle(target).backgroundImage, /url\("?data\:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"?\)/);
-    });
-  });
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/deferred-apply.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/deferred-apply.html
deleted file mode 100644
index 1b3af21..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/deferred-apply.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <meta charset="utf-8">
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/custom-style-element.js"></script>
-  <script src="module/generated/make-element.js"></script>
-  <title>Apply Shim Deferred</title>
-</head>
-<body>
-  <custom-style>
-    <style>
-      html {
-        --foo: {
-          background-color: rgb(0, 0, 255);
-        }
-      }
-    </style>
-  </custom-style>
-  <template id="x-foo">
-    <style>
-      :host {
-        display: block;
-        height: 100px;
-        width: 100px;
-        background-color: rgb(255, 0, 0);
-        @apply --foo;
-      }
-    </style>
-  </template>
-  <x-foo></x-foo>
-  <!-- emulate apply-shim imported into a module context -->
-  <script id="applyScript" src="../apply-shim.min.js" defer></script>
-  <script>
-    suite('Deferred Apply Shim', function() {
-      test('Styling works as expected', function() {
-        let resolveFn = null;
-        const promise = new Promise((resolve) => {resolveFn = resolve}).then(() => {
-          // IE 11 timing issue
-          if (window.HTMLTemplateElement.bootstrap) {
-            HTMLTemplateElement.bootstrap(document);
-          }
-          window.makeElement('x-foo');
-        }).then(() => {
-          const el = document.querySelector('x-foo');
-          assert.equal(getComputedStyle(el).getPropertyValue('background-color').trim(), 'rgb(0, 0, 255)');
-        });
-        if (document.readyState === 'complete') {
-          resolveFn();
-        } else {
-          window.addEventListener('load', resolveFn);
-          window.addEventListener('DOMContentLoaded', () => {
-            window.removeEventListener('load', resolveFn);
-            resolveFn();
-          });
-        }
-        return promise;
-      })
-    });
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/dynamic-scoping.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/dynamic-scoping.html
deleted file mode 100644
index e94fc2b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/dynamic-scoping.html
+++ /dev/null
@@ -1,296 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-   <script>
-    WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/make-element.js"></script>
-  <script src="module/generated/custom-style-element.js"></script>
-</head>
-<body>
-
-  <custom-style>
-    <style>
-      x-container, x-sample, x-sample-dynamic, x-container-dynamic {
-        display: block;
-        padding: 10px;
-        margin: 10px;
-        border: 1px solid black;
-      }
-
-      .target {
-        background-color: rgb(0, 255, 0);
-      }
-    </style>
-  </custom-style>
-
-  <template id="x-sample">
-    <style>
-      .target {
-        background-color: rgb(255, 0, 0);
-      }
-    </style>
-    <h2></h2>
-    <p>here .target elements are red</p>
-    <div class="target">I'm red</div>
-    <template id="renderer">
-      <div class="target"></div>
-    </template>
-  </template>
-
-  <template id="x-container">
-    <style>
-      .target {
-        background-color: rgb(123, 123, 123);
-      }
-    </style>
-    <h1>x-container</h1>
-    <p>here .target elements are gray</p>
-    <div class="target">I'm gray</div>
-    <slot></slot>
-  </template>
-
-  <h2>body</h2>
-  <p>here .target elements are green</p>
-
-  <div class="target">I'm green</div>
-
-  <x-sample id="inBody"></x-sample>
-
-  <x-sample id="inContainer"></x-sample>
-
-  <x-container></x-container>
-
-  <template id="x-dynamic">
-    <style>
-      span {
-        background-color: rgb(123, 123, 123);
-      }
-    </style>
-    <div id="container">
-    </div>
-  </template>
-
-  <x-dynamic></x-dynamic>
-
-  <template id="out-of-band">
-    <style>
-      div {
-        color: var(--foo);
-      }
-    </style>
-    <div>oob shadowed</div>
-  </template>
-
-  <template id="oob-parent">
-    <style>
-      out-of-band {
-        --foo: rgb(0, 0, 255);
-      }
-    </style>
-    <out-of-band></out-of-band>
-  </template>
-
-  <template id="oob-other-parent">
-    <style>
-      out-of-band {
-        --foo: rgb(255, 0, 0);
-      }
-    </style>
-  </template>
-
-  <oob-parent></oob-parent>
-  <oob-other-parent></oob-other-parent>
-
-  <template id="x-sample-dynamic">
-    <style>
-      .target {
-        background-color: rgb(255, 0, 0);
-      }
-    </style>
-    <h2></h2>
-    <p>here .target elements are red</p>
-    <div class="target">I'm red</div>
-    <template id="renderer">
-      <div class="target"></div>
-    </template>
-  </template>
-
-  <template id="x-container-dynamic">
-    <style>
-      .target {
-        background-color: rgb(123, 123, 123);
-      }
-    </style>
-    <h1>x-container</h1>
-    <p>here .target elements are gray</p>
-    <div class="target">I'm gray</div>
-    <slot></slot>
-  </template>
-
-  <x-container-dynamic></x-container-dynamic>
-
-  <template id="css-build" css-build="shady">
-    <style>:host{@apply --fake;}</style>
-    <div class="style-scope css-build"></div>
-  </template>
-
-  <template id="css-build-comment"><!--css-build:shady-->
-    <style>:host{@apply --fake;}</style>
-    <div class="style-scope css-build-comment"></div>
-  </template>
-
-  <script>
-    suite('Dynamic Scoping', () => {
-      function stamp(parent, host) {
-        let template = host.shadowRoot.querySelector('template#renderer')
-        let el = template.content.cloneNode(true).querySelector('div.target');
-        el.textContent = `stamped by ${host.id}`;
-        parent.appendChild(el);
-        return el;
-      }
-      test('DOM is scoped correctly when stamped from an element into document', (done) => {
-        let inBody = document.querySelector('x-sample#inBody');
-        let inContainer = document.querySelector('x-sample#inContainer');
-        makeElement('x-sample', function() {
-          this.shadowRoot.querySelector('h2').textContent = `${this.id}`;
-        });
-        makeElement('x-container');
-        setTimeout(() => {
-          let body = stamp(document.body, inBody);
-          let container = stamp(document.querySelector('x-container').shadowRoot, inContainer);
-          requestAnimationFrame(() => {
-            assert.equal(getComputedStyle(body).backgroundColor, 'rgb(0, 255, 0)');
-            assert.equal(getComputedStyle(container).backgroundColor, 'rgb(123, 123, 123)')
-            done();
-          });
-        }, 300);
-      });
-      test('DOM is scoped correctly when created dynamically inside a scoped container', (done) => {
-        makeElement('x-dynamic', function() {
-          let div = this.shadowRoot.querySelector('#container');
-          let newDiv = div.cloneNode(true);
-          let span = document.createElement('span');
-          span.textContent = 'created dynamically';
-          newDiv.appendChild(span);
-          this.shadowRoot.appendChild(newDiv);
-          requestAnimationFrame(() => {
-            assert.equal(getComputedStyle(span).backgroundColor, 'rgb(123, 123, 123)');
-            done();
-          })
-        });
-      });
-      test('moving a custom element between scopes recalculates correctly', function(done) {
-        makeElement('out-of-band');
-        makeElement('oob-parent');
-        makeElement('oob-other-parent');
-        let parent = document.querySelector('oob-parent');
-        let newParent = document.querySelector('oob-other-parent');
-        let oob = parent.shadowRoot.querySelector('out-of-band');
-        let shadowDiv = oob.shadowRoot.querySelector('div');
-        newParent.shadowRoot.appendChild(oob);
-        requestAnimationFrame(() => {
-          assert.equal(getComputedStyle(shadowDiv).getPropertyValue('color').trim(), 'rgb(255, 0, 0)');
-          done();
-        });
-      })
-      function makeDynamicElement(name, connectedCallback) {
-        let template = document.querySelector(`template#${name}`);
-        if (template && window.ShadyCSS) {
-          window.ShadyCSS.prepareTemplate(template, name);
-        }
-        window.customElements.define(name, class extends window.HTMLElement {
-          constructor() {
-            super();
-            if (template && !this.shadowRoot) {
-              this.attachShadow({mode: 'open'});
-              this.shadowRoot.appendChild(document.importNode(template.content, true));
-            }
-          }
-          connectedCallback() {
-            window.ShadyCSS && window.ShadyCSS.styleElement(this);
-            if (connectedCallback) {
-              connectedCallback.call(this);
-            }
-          }
-        });
-      }
-      test('Nested DOM is scoped correctly when created dynamically inside a dynamic container', function(done) {
-        if (!window.customElements.polyfillWrapFlushCallback && window.ShadyDOM && window.ShadyDOM.inUse) {
-          /*
-           * This test is flaky if running with native custom elements and polyfill shadowdom,
-           * as the shadowdom polyfill may render inside of the constructor and create children,
-           * which is not allowed in the CE spec.
-           */
-          this.skip();
-        }
-        makeDynamicElement('x-container-dynamic');
-        makeDynamicElement('x-sample-dynamic');
-        const dynamicDiv = document.createElement('div');
-        dynamicDiv.classList.add('target');
-        dynamicDiv.innerText = 'I was created dynamically';
-        const dynamicSample = document.createElement('x-sample-dynamic');
-        const dynamicContainer = document.createElement('x-container-dynamic');
-        dynamicSample.shadowRoot.appendChild(dynamicDiv);
-        dynamicContainer.shadowRoot.appendChild(dynamicSample);
-        document.querySelector('x-container-dynamic').shadowRoot.appendChild(dynamicContainer);
-        requestAnimationFrame(() => {
-          dynamicSample.shadowRoot.querySelectorAll('div.target').forEach((target) =>
-            assert.equal(getComputedStyle(target).backgroundColor,'rgb(255, 0, 0)'));
-          done();
-        });
-      });
-
-      test('templates marked with "css-build" will be left alone', function() {
-        makeElement('css-build');
-        const template = document.querySelector('template#css-build');
-        const div = template.content.querySelector('div');
-        const divClasses = Array.from(div.classList);
-        assert.includeMembers(divClasses, ['style-scope', 'css-build']);
-        const style = template.content.querySelector('style');
-        if (style) {
-          assert.match(style.textContent.trim(), /:host\s*{\s*@apply --fake;\s*}/);
-        }
-      });
-
-      test('templates with css-build comments will be left alone', function() {
-        const template = document.querySelector('template#css-build-comment');
-        const buildComment = template.content.firstChild;
-        assert.instanceOf(buildComment, Comment, 'first child of template content should be a Comment');
-        makeElement('css-build-comment');
-        const div = template.content.querySelector('div');
-        const divClasses = Array.from(div.classList);
-        assert.includeMembers(divClasses, ['style-scope', 'css-build-comment']);
-        const style = template.content.querySelector('style');
-        if (style) {
-          assert.match(style.textContent.trim(), /:host\s*{\s*@apply --fake;\s*}/);
-        }
-        assert.equal(buildComment.parentNode, null, 'build commment should have been removed');
-      });
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/html-imports/custom-style-import.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/html-imports/custom-style-import.html
deleted file mode 100644
index 3f9991e..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/html-imports/custom-style-import.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<custom-style>
-  <style>
-  html {
-    --color: rgb(0, 0, 255);
-  }
-  </style>
-</custom-style>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/lazy-init.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/lazy-init.html
deleted file mode 100644
index 42273b3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/lazy-init.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>WCT = { waitFor(cb) { addEventListener('DOMContentLoaded', cb) } };</script>
-<script src="test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="../apply-shim.min.js"></script>
-<script src="../custom-style-interface.min.js"></script>
-<template id="eager-host">
-  <style>
-    :host {
-      display: block;
-      height: 100px;
-      background-color: blue;
-    }
-
-    :host > late-client {
-      --foo: rgb(255, 0, 0);
-    }
-  </style>
-  <late-client></late-client>
-</template>
-<template id="late-client">
-  <style>
-    :host {
-      display: block;
-      color: var(--foo);
-    }
-
-    div {
-      border: 2px solid rgb(0, 255, 0);
-      border-color: var(--foo);
-    }
-  </style>
-  <div>Hello!</div>
-</template>
-
-<template id="x-parent">
-  <style>
-    :host {
-      --property: 10px solid black;
-    }
-  </style>
-  <x-child></x-child>
-</template>
-<template id="x-child">
-  <style>
-    div {
-      border: var(--property);
-    }
-  </style>
-  <div></div>
-</template>
-
-<script>
-  class LateClient extends HTMLElement {
-    constructor() {
-      super();
-      this.initialized = false;
-      this.attachShadow({mode: 'open'});
-    }
-    init() {
-      if (this.initialized) {
-        return;
-      }
-      this.initialized = true;
-      const template = document.querySelector(`template#${this.localName}`);
-      if (!template.initialized) {
-        template.initialized = true;
-        window.ShadyCSS.prepareTemplate(template, this.localName);
-      }
-      this.shadowRoot.appendChild(template.content.cloneNode(true));
-      window.ShadyCSS.styleElement(this);
-    }
-    connectedCallback() {
-      if (this.initialized) {
-        window.ShadyCSS.styleElement(this);
-      }
-    }
-  }
-
-  class EagerHost extends HTMLElement {
-    constructor() {
-      super();
-      this.template = document.querySelector(`template#${this.localName}`);
-      if (!this.template.initialized) {
-        this.template.initialized = true;
-        window.ShadyCSS.prepareTemplate(this.template, this.localName);
-      }
-    }
-    connectedCallback() {
-      window.ShadyCSS.styleElement(this);
-      if (this.template && !this.shadowRoot) {
-        this.attachShadow({mode: 'open'});
-        this.shadowRoot.appendChild(this.template.content.cloneNode(true));
-      }
-    }
-  }
-
-  class StampBeforeStyle extends HTMLElement {
-    constructor() {
-      super();
-      this.template = document.querySelector(`template#${this.localName}`);
-      if (!this.template.initialized) {
-        this.template.initialized = true;
-        window.ShadyCSS.prepareTemplate(this.template, this.localName);
-      }
-    }
-    connectedCallback() {
-      if (this.template && !this.shadowRoot) {
-        this.attachShadow({ mode: 'open' });
-        this.shadowRoot.appendChild(this.template.content.cloneNode(true));
-      }
-      window.ShadyCSS.styleElement(this);
-    }
-  }
-
-  suite('Lazy Initialization', function() {
-    test('Late child element is eventually correct', function() {
-      customElements.define('late-client', class extends LateClient{});
-      customElements.define('eager-host', class extends EagerHost{});
-      const host = document.createElement('eager-host');
-      document.body.appendChild(host);
-      window.ShadyCSS.styleDocument();
-      const inner = host.shadowRoot.querySelector('late-client');
-      if (inner.init) {
-        inner.init();
-      }
-      const div = inner.shadowRoot.querySelector('div');
-      assert.equal(getComputedStyle(div).getPropertyValue('border-color').trim(), 'rgb(255, 0, 0)');
-    });
-
-    test('Custom Property Shim can force unprepared parent to evaluate', function() {
-      customElements.define('x-child', class extends StampBeforeStyle {});
-      customElements.define('x-parent', class extends StampBeforeStyle {});
-      const host = document.createElement('x-parent');
-      document.body.appendChild(host);
-      const inner = host.shadowRoot.querySelector('x-child');
-      const div = inner.shadowRoot.querySelector('div');
-      assert.equal(getComputedStyle(div).getPropertyValue('border-top-width').trim(), '10px');
-    });
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/media-query.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/media-query.html
deleted file mode 100644
index 6cf20ef..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/media-query.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <meta charset="utf-8">
-  <script>
-    WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script>
-    if (customElements.polyfillWrapFlushCallback) {
-      // delay definition of custom-style until after template polyfill loads
-      customElements.polyfillWrapFlushCallback(function (cb) {
-        HTMLImports.whenReady(cb);
-      });
-    }
-  </script>
-  <script src="module/generated/make-element.js"></script>
-  <title>Media Querty</title>
-
-</head>
-
-<body>
-  <template id="simple-element">
-    <style>
-      :host {
-        height: 100px;
-        width: 100px;
-        display: block;
-        background-color: var(--color, rgb(0, 0, 0));
-      }
-      @media (min-width: 1px) and (max-width: 1px) {
-        :host {
-          --color: rgb(128, 128, 128);
-        }
-      }
-    </style>
-  </template>
-  <script>
-    suite('Media Query correctness', function() {
-      makeElement('simple-element');
-      test('test against whole @media rule', function() {
-        var el = document.createElement('simple-element');
-        document.body.appendChild(el);
-        let bg = getComputedStyle(el).getPropertyValue('background-color').trim();
-        assert.equal(bg, 'rgb(0, 0, 0)', 'background-color did not match');
-      });
-    });
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/mixin-fallbacks.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/mixin-fallbacks.html
deleted file mode 100644
index 746caa3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/mixin-fallbacks.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-  WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-</script>
-<script src="./test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="../apply-shim.min.js"></script>
-<script src="../custom-style-interface.min.js"></script>
-<script src="module/generated/make-element.js"></script>
-
-<template id="mixin-element">
-  <style>
-    :host {
-      background-color: rgb(0, 0, 255);
-      height: 100px;
-      display: block;
-    }
-    :host {
-      @apply --mixin;
-    }
-  </style>
-</template>
-
-<template id="outer-element">
-  <style>
-    :host > * {
-      --mixin: {
-        background-color: rgb(255, 0, 0);
-      }
-    }
-  </style>
-  <mixin-element></mixin-element>
-</template>
-
-<script>
-  suite('Mixin Fallbacks', function() {
-    suiteSetup(function() {
-      makeElement('mixin-element');
-      makeElement('outer-element');
-    });
-
-    test('outer-element sets mixin color', function() {
-      const el = document.createElement('outer-element');
-      document.body.appendChild(el);
-      const inner = el.shadowRoot.querySelector('mixin-element');
-      const color = getComputedStyle(inner).getPropertyValue('background-color').trim();
-      assert.equal(color, 'rgb(255, 0, 0)');
-    });
-    test('mixin-element by itself falls back correctly', function() {
-      const mixinOnly = document.createElement('mixin-element');
-      document.body.appendChild(mixinOnly);
-      const color = getComputedStyle(mixinOnly).getPropertyValue('background-color').trim();
-      assert.equal(color, 'rgb(0, 0, 255)');
-    });
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/mixin-ordering.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/mixin-ordering.html
deleted file mode 100644
index 2191b25..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/mixin-ordering.html
+++ /dev/null
@@ -1,143 +0,0 @@
-<!doctype html>
-<head>
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/make-element.js"></script>
-</head>
-<body>
-    <div>
-      <x-item-a>item A</x-item-a>
-      <x-item-b>item B</x-item-b>
-    </div>
-  <x-menu>
-  </x-menu>
-  <x-menu-group>
-  </x-menu-group>
-
-    <template id="x-item-a">
-      <style>
-      :host {
-        display:block;
-        background: rgb(255, 255, 255);
-        @apply --item-mixin;
-      }
-      </style>
-      <slot></slot>
-    </template>
-
-    <template id="x-menu">
-      <style>
-        :host {
-          display:block;
-          border:1px solid black;
-          margin:2px;
-          --item-mixin:{background:rgb(0, 0, 255);};
-        }
-      </style>
-      <x-item-a>menu item A</x-item-a>
-      <x-item-b>menu item B</x-item-b>
-    </template>
-
-    <template id="x-group">
-      <style>
-      :host{
-        display:block;
-        --item-mixin:{background:rgb(255, 0, 0);};
-        }
-      </style>
-      <x-item-a>group item A</x-item-a>
-      <x-item-b>group item B</x-item-b>
-    </template>
-
-    <template id="x-menu-group">
-      <style>
-        :host {
-          display:block;
-          border:1px solid black;
-          margin:2px;
-          --item-mixin:{background:rgb(0, 0, 255);};
-        }
-      </style>
-      <x-group></x-group>
-    </template>
-
-    <template id="x-item-b">
-      <style>
-      :host {
-        display:block;
-        background: rgb(255, 255, 255);
-        @apply --item-mixin;
-      }
-      </style>
-      <slot></slot>
-    </template>
-
-    <template id="x-dynamic">
-      <style>
-        :host {
-          display: block;
-          background: rgb(255, 255, 255);
-          @apply --mixin;
-        }
-      </style>
-      <span>dynamic item</span>
-    </template>
-
-    <template id="x-dynamic-container">
-      <style>
-        :host {
-          --mixin: {
-            background-color: rgb(123, 123, 123);
-          };
-        }
-      </style>
-      <x-dynamic></x-dynamic>
-    </template>
-
-    <script>
-    suite('Mixin Ordering', function() {
-      suiteSetup(function() {
-        makeElement('x-item-a');
-        makeElement('x-menu');
-        makeElement('x-group');
-        makeElement('x-menu-group');
-        makeElement('x-item-b');
-      });
-      test('mixins are re-evaluated with element upgrade', function() {
-        function checkBg(node) {
-          var itemA = node.querySelector('x-item-a');
-          var itemB = node.querySelector('x-item-b');
-          var itemA_BG = getComputedStyle(itemA)['background-color'].trim();
-          var itemB_BG = getComputedStyle(itemB)['background-color'].trim();
-          assert.equal(itemA_BG, itemB_BG, 'x-item-a and x-item-b should have the same background color');
-        }
-        checkBg(document.querySelector('div'));
-        checkBg(document.querySelector('x-menu').shadowRoot);
-        checkBg(document.querySelector('x-menu-group').shadowRoot.querySelector('x-group').shadowRoot);
-      });
-      test('dynamically updates', function() {
-        makeElement('x-dynamic');
-        makeElement('x-dynamic-container');
-        var container = document.createElement('x-dynamic-container');
-        document.body.appendChild(container);
-        if (window.ShadyDOM) {
-          ShadyDOM.flush();
-        }
-        assert.equal(getComputedStyle(container.shadowRoot.querySelector('x-dynamic'))['background-color'].trim(), 'rgb(123, 123, 123)');
-      });
-    });
-    </script>
-</body>
-
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/css-parse.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/css-parse.js
deleted file mode 100644
index 386ff29..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/css-parse.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import * as CssParse from '../../src/css-parse'
-
-window['CssParse'] = CssParse;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/custom-style-element.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/custom-style-element.js
deleted file mode 100644
index b306989..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/custom-style-element.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import '../../examples/custom-style-element'
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/make-element.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/make-element.js
deleted file mode 100644
index 45eb3b3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/make-element.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple webcomponents helper
-*/
-'use strict';
-
-window.makeElement = (name, connectedCallback) => {
-  let template = document.querySelector(`template#${name}`);
-  if (template && window.ShadyCSS) {
-    window.ShadyCSS.prepareTemplate(template, name);
-  }
-  window.customElements.define(name, class extends window.HTMLElement {
-    connectedCallback() {
-      window.ShadyCSS && window.ShadyCSS.styleElement(this);
-      if (!this.shadowRoot) {
-        this.attachShadow({mode: 'open'});
-        if (template) {
-          this.shadowRoot.appendChild(template.content.cloneNode(true));
-        }
-      }
-      if (connectedCallback) {
-        connectedCallback.call(this);
-      }
-    }
-  });
-};
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-cache.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-cache.js
deleted file mode 100644
index cb5a46c..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-cache.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import StyleCache from '../../src/style-cache'
-window['StyleCache'] = StyleCache;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-info.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-info.js
deleted file mode 100644
index 31e3184..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-info.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import StyleInfo from '../../src/style-info'
-window['StyleInfo'] = StyleInfo;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-placeholder.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-placeholder.js
deleted file mode 100644
index 0c01f4b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-placeholder.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import '../../src/style-placeholder'
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-properties.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-properties.js
deleted file mode 100644
index 054c4e7..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-properties.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import StyleProperties from '../../src/style-properties'
-window['StyleProperties'] = StyleProperties;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-settings.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-settings.js
deleted file mode 100644
index b73830b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-settings.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import * as StyleSettings from '../../src/style-settings'
-window['StyleSettings'] = StyleSettings;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-transformer.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-transformer.js
deleted file mode 100644
index 77a4097..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-transformer.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import StyleTransformer from '../../src/style-transformer'
-window['StyleTransformer'] = StyleTransformer;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-util.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-util.js
deleted file mode 100644
index 6b59a18..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/style-util.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-/*
-A simple shim to generate a testable module
-*/
-
-import * as StyleUtil from '../../src/style-util'
-window['StyleUtil'] = StyleUtil;
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/svg-in-shadow.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/module/svg-in-shadow.js
deleted file mode 100644
index 502cd70..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/module/svg-in-shadow.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
-@license
-Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-*/
-
-'use strict';
-
-const ShadyCSS = window.ShadyCSS;
-
-window.registerSVGElement = () => {
-  const LOCAL_NAME = 'svg-in-shadow';
-  const TEMPLATE = document.querySelector(`template#${LOCAL_NAME}`);
-  ShadyCSS.prepareTemplate(TEMPLATE, LOCAL_NAME);
-
-  class SVGInShadow extends window.HTMLElement {
-    connectedCallback() {
-      ShadyCSS.styleElement(this);
-      this.attachShadow({mode: 'open'});
-      this.shadowRoot.appendChild(document.importNode(TEMPLATE.content, true));
-    }
-
-    get svg() {
-      return this.shadowRoot.querySelector('svg');
-    }
-
-    addCircle() {
-      const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
-      const x = 10 + Math.floor(80 * Math.random());
-      const y = 10 + Math.floor(80 * Math.random());
-      circle.setAttribute('cx', String(x));
-      circle.setAttribute('cy', String(y));
-      circle.setAttribute('r', '10');
-      this.svg.appendChild(circle);
-      return circle;
-    }
-  }
-  window.customElements.define(LOCAL_NAME, SVGInShadow);
-};
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style-late.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style-late.html
deleted file mode 100644
index 7011498..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style-late.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../../node_modules/@webcomponents/template/template.js"></script>
-<script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../../custom-style-interface.min.js"></script>
-<script src="../module/generated/make-element.js"></script>
-<script src="../module/generated/custom-style-element.js"></script>
-<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-
-<template id="late">
-  <custom-style class="late-style">
-    <style>
-    html {
-      --late: 2px solid red;
-    }
-    </style>
-  </custom-style>
-</template>
-
-<template id="x-late">
-  <style>
-    :host {
-      display: block;
-      border: var(--late);
-    }
-  </style>
-  <div>late</div>
-</template>
-
-<template id="x-host">
-  <style>
-  :host {
-    display: block;
-    padding: 4px;
-  }
-  </style>
-  <x-late></x-late>
-</template>
-
-<x-host></x-host>
-
-<script>
-suite('Async custom-style', function() {
-  suiteSetup(function() {
-    makeElement('x-host');
-  });
-  test('late custom-style updates elements', function(done) {
-    var lateTemplate = document.querySelector('template#late');
-    var host = document.querySelector('x-host');
-    var inner = host.shadowRoot.querySelector('x-late');
-    requestAnimationFrame(function() {
-      document.body.appendChild(document.importNode(lateTemplate.content, true));
-      makeElement('x-late');
-      requestAnimationFrame(function() {
-        assert.equal(getComputedStyle(inner).borderTopWidth.trim(), '2px');
-        done();
-      });
-    });
-  })
-})
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style-only.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style-only.html
deleted file mode 100644
index 59cf219..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style-only.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<script src=".././test-flags.js"></script>
-<script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../../node_modules/@webcomponents/template/template.js"></script>
-<script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script>
-  WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-</script>
-<script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script>
-  if (window.customElements && customElements.polyfillWrapFlushCallback) {
-    // delay definition of custom-style until after template polyfill loads
-    customElements.polyfillWrapFlushCallback(function (cb) {
-      HTMLImports.whenReady(cb);
-    });
-  }
-</script>
-<script src="../../scoping-shim.min.js"></script>
-<script src="../../custom-style-interface.min.js"></script>
-<script src="../module/generated/make-element.js"></script>
-<script src="../module/generated/custom-style-element.js"></script>
-<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-
-<custom-style>
-  <style>
-    #target {
-      display: block;
-      border: var(--late);
-    }
-  </style>
-</custom-style>
-
-<template id="late">
-  <custom-style class="late-style">
-    <style>
-    html {
-      --late: 2px solid red;
-    }
-    </style>
-  </custom-style>
-</template>
-
-<div id="target"></div>
-
-<script>
-suite('custom-style only', function() {
-  var host = document.querySelector('#target');
-  test('custom-style by itself works as expected', function() {
-    assert.equal(getComputedStyle(host).getPropertyValue('display').trim(), 'block');
-  });
-  test('late custom-style updates styling', function(done) {
-    var lateTemplate = document.querySelector('template#late');
-    document.body.appendChild(document.importNode(lateTemplate.content, true));
-    // two rAF to wait for after custom-style-interface's batching
-    requestAnimationFrame(function() {
-      requestAnimationFrame(function() {
-        assert.equal(getComputedStyle(host).borderTopWidth.trim(), '2px');
-        done();
-      });
-    });
-  })
-})
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style.html
deleted file mode 100644
index 0794a41..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-applyshim/custom-style.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../../node_modules/@webcomponents/template/template.js"></script>
-<script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../../custom-style-interface.min.js"></script>
-<script src="../module/generated/make-element.js"></script>
-<script src="../module/generated/custom-style-element.js"></script>
-
-<custom-style>
-  <style>
-  html {
-    --foo: rgb(123, 123, 123);
-  }
-  </style>
-</custom-style>
-
-<template id="x-inner">
-  <style>
-    :host {
-      display: block;
-      height: 100px;
-      width: 100px;
-      border: 4px solid blue;
-      background-color: var(--foo);
-    }
-  </style>
-</template>
-
-<template id="x-outer">
-  <style>
-  :host {
-    display: block;
-  }
-  </style>
-  <x-inner></x-inner>
-</template>
-
-<x-outer id="target"></x-outer>
-
-<script>
-  suite('Custom Style upgrades', function() {
-    suiteSetup(function() {
-      makeElement('x-inner');
-      makeElement('x-outer');
-    });
-    test('custom-style applies to deeply nested elements', function() {
-      var target = document.querySelector('#target');
-      var inner = target.shadowRoot.querySelector('x-inner');
-      assert.equal(getComputedStyle(inner).backgroundColor, 'rgb(123, 123, 123)');
-    });
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/apply-shim.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/apply-shim.html
deleted file mode 100644
index bac2b38..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/apply-shim.html
+++ /dev/null
@@ -1,309 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-
-  <meta charset="utf-8">
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../../apply-shim.min.js"></script>
-  <script src="../../custom-style-interface.min.js"></script>
-  <script src="../module/generated/make-element.js"></script>
-  <script src="../module/generated/custom-style-element.js"></script>
-  <script src="../module/generated/style-util.js"></script>
-  <title>Apply Shim</title>
-
-</head>
-<body>
-  <template id="basic">
-    <style>
-    :host {
-      --mixin: {
-        border: 2px solid black;
-      };
-    }
-    div {
-      @apply --mixin;
-    }
-    </style>
-  </template>
-
-  <template id="defaults">
-    <style>
-    :host {
-      --mixin: {
-        border: 2px solid black;
-      }
-    }
-    div {
-      border: 1px dotted orange;
-      @apply --mixin;
-    }
-    span {
-      border: inherit;
-      @apply --mixin;
-    }
-    span {
-      border: initial;
-      @apply --mixin;
-    }
-    </style>
-  </template>
-
-  <template id="override">
-    <style>
-    :host {
-      --override: {
-        padding: 2px;
-      };
-    }
-    :host([override]) {
-      --override: {
-        border: 2px solid black;
-      };
-    }
-    div {
-      @apply --override;
-    }
-    </style>
-  </template>
-
-  <template id="override-with-property">
-    <style>
-    :root {
-      --prop-mixin: {
-        border: 2px solid black;
-      };
-    }
-    x-foo {
-      --prop-mixin: blue;
-      color: var(--prop-mixin);
-    }
-    div {
-      @apply --prop-mixin;
-    }
-    </style>
-  </template>
-
-  <template id="define-with-var">
-    <style>
-    :root {
-      --mixin-var: {
-        border: 2px solid black;
-      };
-    }
-    div {
-      --mixin-var2: var(--mixin-var);
-    }
-    span {
-      --mixin-var: 20px;
-      --variable: var(--mixin-var);
-    }
-    </style>
-  </template>
-
-  <template id="x-element">
-    <style>
-    :host {
-      @apply --my-mixin;
-    }
-    </style>
-  </template>
-
-  <template id="x-element2">
-    <custom-style>
-    <style>
-    html {
-      --my-mixin: {
-        border: 2px solid black;
-      };
-    }
-    </style>
-    </custom-style>
-  </template>
-
-  <template id="css-build" css-build="shadow">
-    <style>:host{@apply --fake;}</style>
-  </template>
-
-  <template id="css-build-comment"><!--css-build:shadow-->
-    <style>:host{@apply --fake;}</style>
-  </template>
-
-  <script>
-  suite('Apply Shim', function() {
-    function copy(name) {
-      var template = document.querySelector('template#' + name);
-      return template.content.cloneNode(true);
-    }
-
-    function prep(templateName, elementName) {
-      var style = copy(templateName).querySelector('style');
-      var ast = window.ShadyCSS.ApplyShim.transformStyle(style, elementName);
-      return {style: style, ast: ast};
-    }
-
-    suite('Basic', function() {
-      var style, ast;
-      suiteSetup(function() {
-        var info = prep('basic');
-        style = info.style;
-        ast = info.ast;
-        style.textContent = window.StyleUtil.toCssText(ast);
-      });
-
-      test('style is transformed', function() {
-        var orig = copy('basic').querySelector('style');
-        assert.notEqual(style.textContent, orig.textContent);
-      });
-
-      test('mixin became custom properties', function() {
-        var definition = ast.rules[0];
-        var application = ast.rules[1];
-        assert.match(definition.cssText, /--mixin_-_border:\s*2px solid black/);
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border\)/);
-      });
-    });
-    suite('Defaults', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('defaults');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('properties defined before mixin are used as defaults', function() {
-        var application = ast.rules[1];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*1px dotted orange\)/);
-      });
-
-      test('inherit and initial default values are preserved', function () {
-        var application = ast.rules[2];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*inherit\)/);
-        application = ast.rules[3];
-        assert.match(application.cssText, /border:\s*var\(--mixin_-_border,\s*initial\)/);
-      });
-    });
-
-    suite('override', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('override');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('mixin redefinition sets unused properties to initial', function() {
-        var def1 = ast.rules[0];
-        assert.match(def1.cssText, /--override_-_padding:\s*2px/);
-        var def2 = ast.rules[1];
-        assert.match(def2.cssText, /--override_-_padding:\s*initial/);
-        assert.match(def2.cssText, /--override_-_border:\s*2px solid black/);
-      });
-
-      test('mixin application includes all values', function() {
-        var application = ast.rules[2];
-        assert.match(application.cssText, /padding:\s*var\(--override_-_padding\)/);
-        assert.match(application.cssText, /border:\s*var\(--override_-_border\)/);
-      });
-    });
-
-    suite('override with property', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('override-with-property');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('mixin definition defers to property definition', function() {
-        var def = ast.rules[1];
-        assert.notMatch(def.cssText, /border:\s*var\(--prop-mixin_-_border\)/);
-      });
-
-      test('mixin can still be used by other parts of the page', function() {
-        var def = ast.rules[2];
-        assert.match(def.cssText, /border:\s*var\(--prop-mixin_-_border\)/);
-      });
-    });
-
-    suite('define with var()', function() {
-      var style, ast; // eslint-disable-line no-unused-vars
-      suiteSetup(function() {
-        var info = prep('define-with-var');
-        style = info.style;
-        ast = info.ast;
-      });
-
-      test('mixin-var2 is defined with mixin-var\'s values', function() {
-        var def = ast.rules[1];
-        assert.match(def.cssText, /--mixin-var2_-_border:\s*var\(--mixin-var_-_border\)/);
-      });
-
-      test('var usage of mixin is not removed, preserving override functionality', function() {
-        var def = ast.rules[2];
-        assert.match(def.cssText, /--variable:\s*var\(--mixin-var\)/);
-      });
-    });
-
-    suite('invalidation on new definitions', function() {
-      var style, ast, element;
-      suiteSetup(function() {
-        makeElement('x-element');
-        element = document.createElement('x-element');
-        document.body.appendChild(element);
-        style = element.shadowRoot ? element.shadowRoot.querySelector('style') : document.head.querySelector('style[scope=x-element]');
-      });
-
-      test('element initially has no definition', function() {
-        var ast = window.StyleUtil.rulesForStyle(style);
-        assert.equal(ast.rules[0].cssText, ';');
-      });
-
-      test('Revalidating Apply Shim on element template fills in properties', function() {
-        var nodes = copy('x-element2');
-        document.body.appendChild(nodes);
-        window.ShadyCSS.styleDocument();
-        var ast = window.StyleUtil.rulesForStyle(style);
-        assert.match(ast.rules[0].cssText, /border:\s*var\(--my-mixin_-_border\)/);
-      });
-    });
-
-    test('templates with "css-build" will not be processed by ApplyShim', function() {
-      makeElement('css-build');
-      const template = document.querySelector('template#css-build');
-      assert.equal(template._styleAst, undefined);
-      const style = template.content.querySelector('style');
-      assert.match(style.textContent.trim(), /:host\s*{\s*@apply --fake;\s*}/);
-    });
-
-    test('templates with "css-build" comment will not be processed by ApplyShim', function () {
-      const template = document.querySelector('template#css-build-comment');
-      const buildComment = template.content.firstChild;
-      assert.instanceOf(buildComment, Comment, 'first node in template content should be a Comment');
-      makeElement('css-build-comment');
-      assert.equal(template._styleAst, undefined);
-      const style = template.content.querySelector('style');
-      assert.match(style.textContent.trim(), /:host\s*{\s*@apply --fake;\s*}/);
-      assert.equal(buildComment.parentNode, null, 'build comment should be removed');
-    });
-  });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/complicated-mixin-ordering.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/complicated-mixin-ordering.html
deleted file mode 100644
index 7fb8425..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/complicated-mixin-ordering.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-
-  <meta charset="utf-8">
-  <script>
-    WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-  </script>
-  <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../../apply-shim.min.js"></script>
-  <script src="../../custom-style-interface.min.js"></script>
-  <script src="../module/generated/make-element.js"></script>
-  <script src="../module/generated/custom-style-element.js"></script>
-  <script src="../module/generated/style-util.js"></script>
-  <title>Complicated Order</title>
-
-</head>
-
-<body>
-  <template id="child-element">
-    <style>
-      p {
-        @apply --my-mixin;
-      }
-    </style>
-    <p>I'm a DOM element. This is my local DOM!</p>
-  </template>
-
-  <template id="container-element">
-    <style>
-      child-element {
-        --my-mixin: {
-          background-color: rgb(255, 0, 0);
-        }
-      }
-    </style>
-    <child-element></child-element>
-  </template>
-
-  <template id="other-container-element">
-    <style>
-      child-element {
-        --my-mixin: {
-          font-size: 40px;
-          background-color: rgb(0, 255, 0);
-        }
-      }
-    </style>
-    <child-element></child-element>
-  </template>
-
-  <container-element></container-element>
-  <other-container-element></other-container-element>
-
-  <script>
-    suite('Complicated Order', () => {
-      function assertComputed(node, property, expectedValue, msg) {
-        assert.equal(getComputedStyle(node).getPropertyValue(property).trim(), expectedValue, msg);
-      }
-      suiteSetup(() => {
-        makeElement('child-element');
-        makeElement('container-element');
-        makeElement('other-container-element');
-      });
-      test('complicated ordering works as expected', () => {
-        let initialFontSize = getComputedStyle(document.head).getPropertyValue('font-size').trim();
-        let con = document.querySelector('container-element');
-        let oth = document.querySelector('other-container-element');
-        assertComputed(con.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'background-color', 'rgb(255, 0, 0)');
-        assertComputed(con.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'font-size', initialFontSize);
-        assertComputed(oth.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'background-color', 'rgb(0, 255, 0)');
-        assertComputed(oth.shadowRoot.querySelector('child-element').shadowRoot.querySelector('p'), 'font-size', '40px');
-        con.parentNode.removeChild(con);
-        oth.parentNode.removeChild(oth);
-      })
-    })
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style-late.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style-late.html
deleted file mode 100644
index c2a548f..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style-late.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../../node_modules/@webcomponents/template/template.js"></script>
-<script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../../apply-shim.min.js"></script>
-<script src="../../custom-style-interface.min.js"></script>
-<script src="../module/generated/make-element.js"></script>
-<script src="../module/generated/custom-style-element.js"></script>
-<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-
-<template id="late">
-  <custom-style class="late-style">
-    <style>
-    html {
-      --late: {
-        border: 2px solid red;
-      };
-    }
-    </style>
-  </custom-style>
-</template>
-
-<template id="x-late">
-  <style>
-    :host {
-      display: block;
-      @apply --late;
-    }
-  </style>
-  <div>late</div>
-</template>
-
-<template id="x-host">
-  <style>
-  :host {
-    display: block;
-    padding: 4px;
-  }
-  </style>
-  <x-late></x-late>
-</template>
-
-<x-host></x-host>
-
-<script>
-suite('Async custom-style', function() {
-  suiteSetup(function() {
-    makeElement('x-host');
-  });
-  test('late custom-style updates elements', function(done) {
-    var lateTemplate = document.querySelector('template#late');
-    var host = document.querySelector('x-host');
-    var inner = host.shadowRoot.querySelector('x-late');
-    requestAnimationFrame(function() {
-      document.body.appendChild(document.importNode(lateTemplate.content, true));
-      makeElement('x-late');
-      requestAnimationFrame(function() {
-        assert.equal(getComputedStyle(inner).borderTopWidth.trim(), '2px');
-        done();
-      });
-    });
-  })
-})
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style-only.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style-only.html
deleted file mode 100644
index 28b59ee..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style-only.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script src=".././test-flags.js"></script>
-<script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../../node_modules/@webcomponents/template/template.js"></script>
-<script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script>
-  WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-</script>
-<script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../../apply-shim.min.js"></script>
-<script>
-  if (window.customElements && customElements.polyfillWrapFlushCallback) {
-    // delay definition of custom-style until after template polyfill loads
-    customElements.polyfillWrapFlushCallback(function (cb) {
-      HTMLImports.whenReady(cb);
-    });
-  }
-</script>
-<script src="../../custom-style-interface.min.js"></script>
-<script src="../module/generated/make-element.js"></script>
-<script src="../module/generated/custom-style-element.js"></script>
-<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-
-
-<custom-style>
-  <style>
-    #target {
-      display: block;
-      @apply --late;
-    }
-  </style>
-</custom-style>
-
-<template id="late">
-  <custom-style class="late-style">
-    <style>
-    html {
-      --late: {
-        border: 2px solid red;
-      };
-    }
-    </style>
-  </custom-style>
-</template>
-
-<div id="target"></div>
-
-<script>
-suite('custom-style only', function() {
-  var host = document.querySelector('#target');
-  test('custom-style by itself works as expected', function() {
-    assert.equal(getComputedStyle(host).getPropertyValue('display').trim(), 'block');
-  });
-  test('late custom-style updates styling', function(done) {
-    var lateTemplate = document.querySelector('template#late');
-    document.body.appendChild(document.importNode(lateTemplate.content, true));
-    // two rAF to wait for after custom-style-interface's batching
-    requestAnimationFrame(function() {
-      requestAnimationFrame(function() {
-        assert.equal(getComputedStyle(host).borderTopWidth.trim(), '2px');
-        done();
-      });
-    });
-  })
-})
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style.html
deleted file mode 100644
index 8f8dfc7..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/custom-style.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../../node_modules/@webcomponents/template/template.js"></script>
-<script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../../apply-shim.min.js"></script>
-<script src="../../custom-style-interface.min.js"></script>
-<script src="../module/generated/make-element.js"></script>
-<script src="../module/generated/custom-style-element.js"></script>
-
-<custom-style>
-  <style>
-  html {
-    --foo: rgb(123, 123, 123);
-    --bar: {
-      border: 2px solid red;
-    }
-  }
-  </style>
-</custom-style>
-
-<template id="x-inner">
-  <style>
-    :host {
-      display: block;
-      height: 100px;
-      width: 100px;
-      border: 4px solid blue;
-      background-color: var(--foo);
-      @apply --bar;
-    }
-  </style>
-</template>
-
-<template id="x-outer">
-  <style>
-  :host {
-    display: block;
-    @apply --bar;
-  }
-  </style>
-  <x-inner></x-inner>
-</template>
-
-<x-outer id="target"></x-outer>
-
-<script>
-  suite('Custom Style upgrades', function() {
-    suiteSetup(function() {
-      makeElement('x-inner');
-      makeElement('x-outer');
-    });
-    test('custom-style applies to deeply nested elements', function() {
-      var target = document.querySelector('#target');
-      var inner = target.shadowRoot.querySelector('x-inner');
-      assert.equal(getComputedStyle(inner).backgroundColor, 'rgb(123, 123, 123)');
-    });
-    test('custom-style applied mixins update', function() {
-      var target = document.querySelector('#target');
-      var inner = target.shadowRoot.querySelector('x-inner');
-      assert.equal(getComputedStyle(target).borderTopWidth.trim(), '2px');
-      assert.equal(getComputedStyle(inner).borderTopWidth.trim(), '2px');
-    });
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/mixin-ordering.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/mixin-ordering.html
deleted file mode 100644
index 8914f02..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/no-scopingshim/mixin-ordering.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!doctype html>
-<head>
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../../apply-shim.min.js"></script>
-  <script src="../../custom-style-interface.min.js"></script>
-  <script src="../module/generated/make-element.js"></script>
-</head>
-<body>
-    <div>
-      <x-item-a>item A</x-item-a>
-      <x-item-b>item B</x-item-b>
-    </div>
-  <x-menu>
-  </x-menu>
-  <x-menu-group>
-  </x-menu-group>
-
-    <template id="x-item-a">
-      <style>
-      :host {
-        display:block;
-        background: rgb(255, 255, 255);
-        @apply --item-mixin;
-      }
-      </style>
-      <slot></slot>
-    </template>
-
-    <template id="x-menu">
-      <style>
-        :host {
-          display:block;
-          border:1px solid black;
-          margin:2px;
-          --item-mixin:{background:rgb(0, 0, 255);};
-        }
-      </style>
-      <x-item-a>menu item A</x-item-a>
-      <x-item-b>menu item B</x-item-b>
-    </template>
-
-    <template id="x-group">
-      <style>
-      :host{
-        display:block;
-        --item-mixin:{background:rgb(255, 0, 0);};
-        }
-      </style>
-      <x-item-a>group item A</x-item-a>
-      <x-item-b>group item B</x-item-b>
-    </template>
-
-    <template id="x-menu-group">
-      <style>
-        :host {
-          display:block;
-          border:1px solid black;
-          margin:2px;
-          --item-mixin:{background:rgb(0, 0, 255);};
-        }
-      </style>
-      <x-group></x-group>
-    </template>
-
-    <template id="x-item-b">
-      <style>
-      :host {
-        display:block;
-        background: rgb(255, 255, 255);
-        @apply --item-mixin;
-      }
-      </style>
-      <slot></slot>
-    </template>
-
-    <template id="x-dynamic">
-      <style>
-        :host {
-          display: block;
-          background: rgb(255, 255, 255);
-          @apply --mixin;
-        }
-      </style>
-      <span>dynamic item</span>
-    </template>
-
-    <template id="x-dynamic-container">
-      <style>
-        :host {
-          --mixin: {
-            background-color: rgb(123, 123, 123);
-          };
-        }
-      </style>
-      <x-dynamic></x-dynamic>
-    </template>
-
-    <script>
-    suite('Mixin Ordering', function() {
-      suiteSetup(function() {
-        makeElement('x-item-a');
-        makeElement('x-menu');
-        makeElement('x-group');
-        makeElement('x-menu-group');
-        makeElement('x-item-b');
-      });
-      test('mixins are re-evaluated with element upgrade', function() {
-        function checkBg(node) {
-          var itemA = node.querySelector('x-item-a');
-          var itemB = node.querySelector('x-item-b');
-          var itemA_BG = getComputedStyle(itemA)['background-color'].trim();
-          var itemB_BG = getComputedStyle(itemB)['background-color'].trim();
-          assert.equal(itemA_BG, itemB_BG, 'x-item-a and x-item-b should have the same background color');
-        }
-        checkBg(document.querySelector('div'));
-        checkBg(document.querySelector('x-menu').shadowRoot);
-        checkBg(document.querySelector('x-menu-group').shadowRoot.querySelector('x-group').shadowRoot);
-      });
-      test('dynamically updates', function() {
-        makeElement('x-dynamic');
-        makeElement('x-dynamic-container');
-        var container = document.createElement('x-dynamic-container');
-        document.body.appendChild(container);
-        if (window.ShadyDOM) {
-          ShadyDOM.flush();
-        }
-        assert.equal(getComputedStyle(container.shadowRoot.querySelector('x-dynamic'))['background-color'].trim(), 'rgb(123, 123, 123)');
-      });
-    });
-    </script>
-</body>
-
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/ordering.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/ordering.html
deleted file mode 100644
index 392897c..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/ordering.html
+++ /dev/null
@@ -1,173 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>WCT = {waitFor(cb){addEventListener('DOMContentLoaded', cb)}};</script>
-<script src="test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="module/generated/make-element.js"></script>
-
-<custom-style>
-  <style>
-    html {
-      --coloring: {
-        color: rgb(0, 0, 255);
-        background-color: rgb(255, 0, 0);
-      }
-    }
-  </style>
-</custom-style>
-
-<custom-style>
-  <style>
-    html {
-      --border: 2px solid black;
-    }
-  </style>
-</custom-style>
-
-<template id="x-inner">
-  <style>
-    :host {
-      @apply --inner;
-      @apply --coloring;
-    }
-  </style>
-<slot></slot>
-</template>
-
-<template id="x-element">
-  <style>
-    :host {
-      display: block;
-      border: var(--border);
-      @apply --coloring;
-    }
-    x-inner {
-      --inner: {
-        border: 10px solid black;
-      }
-    }
-  </style>
-  <div>What color?</div>
-  <x-inner>Inner</x-inner>
-</template>
-
-<template id="x-early">
-  <style>
-    :host {
-      display: block;
-      background: rgb(123, 123, 123);
-      color: rgb(255, 165, 0);
-      border: var(--border, 10px dotted blue);
-      @apply --coloring;
-    }
-  </style>
-  <div>Early!</div>
-</template>
-
-<x-early></x-early>
-
-<script>
-  function loadScript(src) {
-    console.log(`loading ${src}`);
-    let script = document.createElement('script')
-    script.src = src;
-    let p = new Promise((resolve, reject) => {
-      script.onload = () => {console.log(`loaded ${src}`); resolve()};
-      script.onerror = () => {console.error(`error ${src}`); reject()};
-    });
-    document.head.appendChild(script);
-    return p;
-  }
-
-  function registerEarly() {
-    makeElement('x-early');
-  }
-
-  function loadScopingShim() {
-    return loadScript('../scoping-shim.min.js');
-  }
-
-  function loadCustomStyle() {
-    return loadScript('../custom-style-interface.min.js').then(() => {
-      return loadScript('module/generated/custom-style-element.js')
-    });
-  }
-
-  function loadApplyShim() {
-    return loadScript('../apply-shim.min.js');
-  }
-
-  function register() {
-    makeElement('x-inner');
-    makeElement('x-element');
-  }
-
-  function assertComputed(element, property, expected) {
-    let value = (getComputedStyle(element).getPropertyValue(property) || '').trim();
-    assert.equal(expected, value, `${property} on ${element.localName} incorrect`);
-  }
-
-  function chain(arr) {
-    let out = Promise.resolve();
-    for (let i = 0; i < arr.length; i++) {
-      out = out.then(arr[i]);
-    }
-    return out;
-  }
-
-  let orderSteps = {
-    scoping: loadScopingShim,
-    early: registerEarly,
-    apply: loadApplyShim,
-    custom: loadCustomStyle,
-  };
-
-  /**
-   * Support the following permutations of loading via url query params:
-   *
-   * Apply Shim, CustomStyle
-   * Scoping Shim, Apply Shim, Custom Style
-   * Apply Shim, Element, CustomStyle
-   * Scoping Shim, Element, Apply Shim, Custom Style
-   * Scoping Shim, Apply Shim, Element, Custom Style
-   */
-
-  suite('Dynamic ordering of components', () => {
-    let flags = window.WebComponents.flags;
-    let order = decodeURIComponent(flags.order || 'scoping,apply,custom').split(',');
-    let steps = chain(order.map(o => orderSteps[o]));
-    let otherFlags = `${flags.ce ? 'ce' : ''} ${flags.shadydom ? 'shadydom' : ''} ${flags.shimcssproperties ? 'shimcssproperties' : ''}`;
-    let needsScopingShim = window.ShadyDOM && window.ShadyDOM.inUse || flags.shimcssproperties;
-
-    test(`${order.join(', ')} with ${otherFlags}`, function() {
-      console.log(order, flags);
-      if (order.indexOf('scoping') === -1 && needsScopingShim) {
-        this.skip();
-      }
-      return steps.then(
-        register
-      ).then(() => {
-        let el = document.createElement('x-element');
-        document.body.appendChild(el);
-        assertComputed(el, 'background-color', 'rgb(255, 0, 0)');
-        assertComputed(el, 'border-top-width', '2px');
-        assertComputed(el.shadowRoot.querySelector('div'), 'color', 'rgb(0, 0, 255)');
-        assertComputed(el.shadowRoot.querySelector('x-inner'), 'border-top-width', '10px');
-      });
-    })
-  })
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/placeholder-ordering.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/placeholder-ordering.html
deleted file mode 100644
index 33eecdb..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/placeholder-ordering.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="module/generated/make-element.js"></script>
-</head>
-<body>
-  <template id="x-a">
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-  </template>
-  <template id="x-b">
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-  </template>
-  <template id="x-c">
-    <style>
-    :host {
-      display: block;
-    }
-    </style>
-  </template>
-  <script>
-  suite('placeholder ordering', function() {
-    test.skip('placeholders are in order', function() {
-      makeElement('x-a');
-      makeElement('x-b');
-      var el = document.createElement('x-a');
-      document.body.appendChild(el);
-      makeElement('x-c');
-      var styles = Array.from(document.querySelectorAll('style[scope]')).map(function(style) {
-        return style.getAttribute('scope');
-      });
-      assert.deepEqual(styles, ['x-a', 'x-b', 'x-c'], 'styles are not in order');
-    })
-  });
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/runner.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/runner.html
deleted file mode 100644
index 5eaf378..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/runner.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!doctype html>
-<!--
-    @license
-    Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-    Code distributed by Google as part of the polymer project is also
-    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<title>ScopingShim Tests</title>
-<meta charset="utf-8">
-
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-
-<script>
-(function(){
-  var suites = [
-    'css-parse.html',
-    'apply-shim.html',
-    'async-loading.html',
-    'placeholder-ordering.html',
-    'scoping.html',
-    'mixin-ordering.html',
-    'svg.html',
-    'style-transformer.html',
-    'custom-style.html',
-    'custom-style-late.html',
-    'custom-style-only.html',
-    'complicated-mixin-ordering.html',
-    'dynamic-scoping.html',
-    'settings.html',
-    'chrome-devtools.html',
-    'workarounds.html',
-    'deferred-apply.html',
-    'no-applyshim/custom-style-only.html',
-    'wc-1.html',
-    'scoping-api.html',
-    'mixin-fallbacks.html'
-  ];
-
-  // http://eddmann.com/posts/cartesian-product-in-javascript/
-  function flatten(arr) { return [].concat.apply([], arr) }
-  function product(sets) {
-    return sets.reduce(function(acc, set) {
-      return flatten(acc.map(function(x) {
-          return set.map(function(y) { return x.concat(y); });
-      }));
-    }, [[]]);
-  }
-  function combinations(suites, flags) {
-    return product(flags).reduce(function(list, f) {
-      f = f.filter(function(i) { return i; }).join('&');
-      return list.concat(suites.map(function(s) { return s + (f ? '?' + f : '') }))
-    }, []);
-  }
-
-  function addUrlOption(previous, next) {
-    previous = previous || '';
-    next = next || '';
-    return previous + (previous ? '&' : '') + next;
-  }
-
-  // test shadowdom/custom elements polyfills together
-  // prefering both if possible.
-  var matrix = [''];
-  var webcomponents = '';
-  if (window.customElements) {
-    webcomponents = 'wc-register=true';
-  }
-  // if native is available, make sure to test polyfill
-  if (Element.prototype.attachShadow && document.documentElement.getRootNode) {
-    webcomponents = addUrlOption(webcomponents, 'wc-shadydom=true');
-  }
-  // ce + sd becomes a single test iteration.
-  if (webcomponents) {
-    matrix.push(webcomponents);
-  }
-  // economize testing by testing css shimming
-  // only against 1 environment (native or polyfill).
-  if (window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)')) {
-    var last = matrix[matrix.length-1];
-    matrix.push(addUrlOption(last, 'wc-shimcssproperties=true'));
-  }
-  suites = combinations(suites, [matrix]);
-
-  var orderingScenarios = [
-    'wc-order=apply,custom',
-    'wc-order=scoping,apply,custom',
-    'wc-order=apply,early,custom',
-    'wc-order=scoping,early,apply,custom',
-    'wc-order=scoping,apply,early,custom'
-  ];
-
-  suites = suites.concat(combinations(['ordering.html'], [matrix, orderingScenarios]));
-
-  if (matrix.length > 2) {
-    suites = suites.concat([
-      'no-scopingshim/apply-shim.html',
-      'no-scopingshim/mixin-ordering.html',
-      'no-scopingshim/custom-style.html',
-      'no-scopingshim/custom-style-late.html',
-      'no-scopingshim/complicated-mixin-ordering.html',
-      'no-scopingshim/custom-style-only.html',
-      'no-applyshim/custom-style.html',
-      'no-applyshim/custom-style-late.html'
-    ]);
-  }
-
-  console.log(suites);
-  WCT.loadSuites(suites);
-})();
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/scoping-api.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/scoping-api.html
deleted file mode 100644
index d537ed7..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/scoping-api.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-  <meta charset="utf-8">
-  <script>
-    WCT = { waitFor(cb) { window.HTMLImports.whenReady(cb) } }
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script>
-    window.ShadyDOM = {force: true}
-  </script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script>
-    // disable document watcher
-    window.ShadyDOM.handlesDynamicScoping = true;
-  </script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/make-element.js"></script>
-</head>
-<body>
-  <template id="sync-element">
-    <style>
-      div {
-        background: rgb(255, 0, 0);
-        border: 10px solid black;
-      }
-    </style>
-    <div id="inner">Test</div>
-  </template>
-  <div id="arena"></div>
-  <script>
-    function assertComputedStyle(node, expectedValue, property = 'border-top-width') {
-      const actualValue = getComputedStyle(node).getPropertyValue(property).trim();
-      assert.equal(actualValue, expectedValue, `${property} does not have the expected value`);
-    }
-    suite('Synchronous Scoping API', function() {
-      const arena = document.querySelector('#arena');
-      const csfn = (node) => {
-        return window.ShadyCSS.ScopingShim.currentScopeForNode(node);
-      };
-      const sfn = (node) => {
-        return window.ShadyCSS.ScopingShim.scopeForNode(node);
-      };
-      const scopeNode = (node, scope) => {
-        window.ShadyCSS.ScopingShim.scopeNode(node, scope);
-      }
-      const unscopeNode = (node, scope) => {
-        window.ShadyCSS.ScopingShim.unscopeNode(node, scope);
-      }
-      let el;
-
-      suiteSetup(function() {
-        makeElement('sync-element');
-      });
-
-      setup(function() {
-        el = document.createElement('sync-element');
-        arena.appendChild(el);
-      });
-
-      teardown(function() {
-        arena.innerHTML = '';
-      });
-
-      test('mutation observer is disabled', function(done) {
-        const inner = el.shadowRoot.querySelector('#inner');
-        arena.appendChild(inner);
-        setTimeout(() => {
-          assertComputedStyle(inner, 'rgb(255, 0, 0)', 'background-color');
-          done();
-        }, 100);
-      });
-
-      test('currentScopeForNode', function() {
-        assert.equal(csfn(el), '', 'sync-scoping should be document scope');
-        const inner = el.shadowRoot.querySelector('#inner');
-        assert.equal(csfn(inner), 'sync-element', 'inner div should have sync-element scope');
-        const disconnected = document.createElement('sync-element');
-        assert.equal(csfn(disconnected), '', 'disconnected element should have a blank scope')
-        const dynamic = document.createElement('div');
-        el.shadowRoot.appendChild(dynamic);
-        assert.equal(csfn(dynamic), '', 'dynamically appended node will not be scoped yet');
-      });
-
-      test('scopeForNode', function() {
-        assert.equal(sfn(el), '', 'sync-scoping should be document scope');
-        const inner = el.shadowRoot.querySelector('#inner');
-        assert.equal(sfn(inner), 'sync-element', 'inner div should have sync-element scope');
-        const disconnected = document.createElement('sync-element');
-        assert.equal(sfn(disconnected), '', 'disconnected element should have a blank scope');
-        const dynamic = document.createElement('div');
-        el.shadowRoot.appendChild(dynamic);
-        assert.equal(sfn(dynamic), 'sync-element', 'dynamically created node should have sync-element scope');
-      });
-
-      test('scopeNode', function() {
-        const div = document.createElement('div');
-        el.shadowRoot.appendChild(div);
-        scopeNode(div, sfn(div));
-        assertComputedStyle(div, '10px');
-        assertComputedStyle(div, 'rgb(255, 0, 0)', 'background-color');
-      });
-
-      test('unscopeNode', function() {
-        const inner = el.shadowRoot.querySelector('#inner');
-        arena.appendChild(inner);
-        unscopeNode(inner, csfn(inner));
-        assertComputedStyle(inner, '0px');
-      });
-    });
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/scoping.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/scoping.html
deleted file mode 100644
index eaab8e0..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/scoping.html
+++ /dev/null
@@ -1,1058 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/make-element.js"></script>
-
-  <custom-style>
-    <style>
-      div#priority {
-        border: 1px solid black;
-      }
-    </style>
-  </custom-style>
-</head>
-<body>
-
-<template id="x-gchild">
-  <style>
-  </style>
-  <div id="target">x-gchild</div>
-</template>
-
-<template id="x-child">
-  <div id="simple">simple</div>
-  <div id="complex1" class="scoped">complex1</div>
-  <div id="complex2" selected>complex2</div>
-  <div id="media">media</div>
-  <div id="shadow" class="shadowTarget">shadowTarget</div>
-  <div id="deep" class="deepTarget">deepTarget</div>
-  <x-gchild id="gchild1"></x-gchild>
-  <x-gchild id="gchild2" class="wide"></x-gchild>
-</template>
-
-<template id="x-child2">
-  <style>
-    :host(.wide) #target{
-      border: none;
-    }
-  </style>
-  <div id="target">x-child2</div>
-</template>
-
-<template id="x-scope-class">
-  <div id="scope">Trivial</div>
-</template>
-
-<template id="x-scoped">
-  <style>
-    :host {
-      display: block;
-      border: 1px solid orange;
-      --keyframes100: 100px;
-    }
-
-    :host(.wide) {
-      border-width: 2px;
-    }
-
-    :host(.wide)::after {
-      content: '-content-';
-    };
-
-    #keyframes2.special {
-      --keyframes100: 200px;
-    }
-
-    #simple {
-      border: 3px solid orange;
-    }
-
-    .scoped, [selected] {
-      border: 4px solid pink;
-    }
-
-    @media(max-width: 10000px) {
-      .media {
-        border: 5px solid brown;
-      }
-    }
-
-    .container ::slotted(*) {
-      border: 6px solid navy;
-    }
-
-    #priority {
-      border: 9px solid orange;
-    }
-
-    .container1 > ::slotted([slot=content1]) {
-      border: 13px solid navy;
-    }
-
-    .container2 > ::slotted([slot=content2]) {
-      border: 14px solid navy;
-    }
-
-    .computed {
-      border: 15px solid orange;
-    }
-
-    .computeda {
-      border: 20px solid orange;
-    }
-
-    #child {
-      border: 16px solid tomato;
-      display: block;
-    }
-
-    svg {
-      margin-top: 20px;
-    }
-
-    #circle {
-      fill: seagreen;
-      stroke-width: 1px;
-      stroke: tomato;
-    }
-  </style>
-  <slot name="blank"></slot>
-  <div id="simple">simple</div>
-  <div id="complex1" class="scoped">complex1</div>
-  <div id="complex2" selected>complex2</div>
-  <div id="media" class="media">media</div>
-  <div class="container1">
-    <slot name="content1"></slot>
-  </div>
-  <div class="container2">
-    <slot name="content2"></slot>
-  </div>
-  <div class="container">
-    <slot></slot>
-  </div>
-  <x-child id="child"></x-child>
-  <div id="priority">priority</div>
-  <x-child2 class="wide" id="child2"></x-child2>
-  <div id="computed">Computed</div>
-  <svg height="25" width="25">
-    <circle id="circle" cx="12" cy="12" r="10"></circle>
-  </svg>
-  <x-scope-class id="scopeClass"></x-scope-class>
-  <x-keyframes id="keyframes"></x-keyframes>
-  <x-keyframes id="keyframes2"></x-keyframes>
-</template>
-
-<template id="x-slotted">
-  <style>
-  ::slotted(.auto-content) {
-    border: 2px solid orange;
-  }
-  .bar, ::slotted(.complex-child) {
-    border: 6px solid navy;
-  }
-  #container ::slotted(*) {
-    border: 8px solid green;
-  }
-  </style>
-  <slot></slot>
-  <div id="container">
-    <slot name="container"></slot>
-  </div>
-</template>
-
-<template id="dynamic">
-  <div class="added">
-    Added
-    <div class="sub-added">
-      Sub-added
-    </div>
-    </div>
-  </div>
-</template>
-
-<template id="x-dynamic-scope">
-  <style>
-    .added {
-      border: 17px solid beige;
-    }
-    .sub-added {
-      border: 18px solid #fafafa;
-    }
-  </style>
-  <div id="container"></div>
-</template>
-
-<template id="x-keyframes">
-  <style>
-    :host {
-      display: block;
-      position: relative;
-      border: 10px solid blue;
-      left: 0px;
-      /* Prefix required by Safari <= 8 */
-      -webkit-animation-duration: 0.3s;
-      animation-duration: 0.3s;
-      -webkit-animation-fill-mode: forwards;
-      animation-fill-mode: forwards;
-    }
-
-    :host([animated]) {
-      /* Prefix required by Safari <= 8 */
-      -webkit-animation-name: x-keyframes-animation;
-      animation-name: x-keyframes-animation;
-    }
-
-    /* Prefix required by Safari <= 8 */
-    @-webkit-keyframes x-keyframes-animation {
-      0% {
-        left: var(--keyframes0, 0px);
-      }
-
-      100% {
-        left: var(--keyframes100, 10px);
-      }
-    }
-    @keyframes x-keyframes-animation {
-      0% {
-        left: var(--keyframes0, 0px);
-      }
-
-      100% {
-        left: var(--keyframes100, 10px);
-      }
-    }
-  </style>
-  x-keyframes
-</template>
-
-<template id="x-attr-selector">
-  <style>
-    #foo1 ~ #bar1 {
-      border: 2px solid red;
-    }
-
-    #foo1 ~ #bar1 ~ #foo2[attr~=foo2] ~ #bar2[attr~=bar2]  {
-      border: 4px solid red;
-    }
-
-    #foo1 ~ #bar1 ~ #foo2[attr~=foo2] ~ #bar2[attr~=bar2] ~ #foo3[attr~=foo3][a~=a] ~ #bar3[attr~=bar3][a~=a] {
-      border: 6px solid red;
-    }
-  </style>
-  <div id="foo1"></div>
-  <div id="bar1">bar1</div>
-  <div id="foo2" attr="foo2"></div>
-  <div id="bar2" attr="bar2">bar2</div>
-  <div id="foo3" attr="foo3" a="a"></div>
-  <div id="bar3" attr="bar3" a="a">bar3</div>
-</template>
-
-<template id="x-adjacent-sibling">
-  <style>
-    div {
-      border: 20px solid black;
-    }
-    #foo2 + #foo1 {
-      border: 2px solid black;
-    }
-    #foo1 + #foo2 {
-      border: 4px solid black;
-    }
-    #foo2 + #foo3 {
-      border: 6px solid black;
-    }
-  </style>
-  <div id="foo1"></div>
-  <div id="foo2"></div>
-  <div id="foo3"></div>
-</template>
-
-<template id="svg">
-  <svg class="svg" viewBox="0 0 24 24">
-    <circle id="circle" r="12" cx="12" cy="12" />
-  </svg>
-</template>
-
-<template id="x-dynamic-svg">
-  <style>
-    .svg {
-      height: 24px;
-      width: 24px;
-    }
-    #circle {
-      fill: red;
-      fill-opacity: 0.5;
-    }
-  </style>
-  <div id="container"></div>
-</template>
-
-<template id="x-specificity">
-  <style>
-    :host {
-      border-top: 1px solid red;
-    }
-    :host(.bar) {
-      border-top: 2px solid red;
-    }
-  </style>
-  <slot></slot>
-</template>
-
-<template id="self-test">
-  <style>
-    :host {
-      --border: 10px solid rgb(123, 123, 123);
-    }
-
-    a {
-      border: var(--border);
-    }
-  </style>
-  <a>I should be red.</a>
-</template>
-
-<template id="nth-plus-one">
-  <style>
-    .foo.bar {
-      color: rgb(255, 0, 0);
-    }
-    div:nth-child(n+1) {
-      color: rgb(0, 255, 0);
-    }
-  </style>
-  <div>1</div>
-  <div class="foo bar">2</div>
-</template>
-
-<template id="shady-unscoped">
-  <style shady-unscoped>
-    .unscoped {
-      color: rgb(255, 0, 0);
-    }
-  </style>
-  <div class="unscoped"></div>
-</template>
-
-<template id="shady-unscoped-2">
-  <style shady-unscoped>
-    .unscoped {
-      color: rgb(255, 0, 0);
-    }
-  </style>
-  <span class="unscoped"></span>
-</template>
-
-<template id="unscoped-apply-user">
-  <style>
-    div {
-      @apply --unscoped-foo;
-    }
-  </style>
-  <div></div>
-</template>
-
-<template id="unscoped-apply">
-  <style shady-unscoped>
-    html, :host > * {
-      --unscoped-foo: {border: 10px solid black};
-    }
-  </style>
-  <unscoped-apply-user></unscoped-apply-user>
-</template>
-
-<template id="any-selector">
-  <style>
-    :-webkit-any(div, span) {
-      color: rgb(123, 123, 123);
-    }
-    :-moz-any(div, span) {
-      color: rgb(123, 123, 123);
-    }
-  </style>
-  <div>a</div>
-  <span>b</span>
-</template>
-
-<template id="scoped-keyframes">
-  <style>
-    :host {
-      --time: 0.1s;
-    }
-
-    div {
-      /* prefix for older chrome and safari */
-      -webkit-animation-duration: var(--time);
-      animation-duration: var(--time);
-      -webkit-animation-fill-mode: forwards;
-      animation-fill-mode: forwards;
-      border: 0px solid black;
-    }
-
-    :host([animate]) div {
-      /* prefix for older chrome and safari */
-      -webkit-animation-name: border-grow;
-      animation-name: border-grow;
-    }
-
-    /* prefix for older chrome and safari */
-    @-webkit-keyframes border {}
-    @-webkit-keyframes border-grow {
-      to {
-        border-top-width: 10px;
-      }
-    }
-    @keyframes border {}
-    @keyframes border-grow {
-      to {
-        border-top-width: 10px;
-      }
-    }
-  </style>
-
-  <div id="target">Hello world</div>
-</template>
-
-<template id="nested-templates">
-  <style>
-    * {
-      opacity: 0.5;
-    }
-  </style>
-  <div id="a"></div>
-  <template id="t1">
-    <div id="b">
-      <div id="c">
-        <template id="t2">
-          <div id="d"></div>
-        </template>
-      </div>
-    </div>
-  </template>
-  <svg>
-    <template id="t3">
-      <g id="g">
-        <circle id="circle"></circle>
-      </g>
-    </template>
-  </svg>
-</template>
-
-<template id="bad-mixin">
-  <style>
-    :host(.nomatch) {
-      --div-border: {
-        border: 2px solid black;
-      }
-    }
-    div {
-      @apply --div-border;
-    }
-  </style>
-  <div></div>
-</template>
-
-<template id="x-parent-skip">
-  <style>
-    :host {
-      --foo: 10px solid black;
-    }
-  </style>
-  <x-skip></x-skip>
-</template>
-
-<template id="x-skip">
-  <x-child-skip></x-child-skip>
-</template>
-
-<template id="x-child-skip">
-  <style>
-    div {
-      border: var(--foo);
-    }
-  </style>
-  <div></div>
-</template>
-
-<script>
-(function() {
-  function assertComputed(element, value, property, pseudo) {
-    var computed = getComputedStyle(element, pseudo);
-    property = property || 'border-top-width';
-    if (Array.isArray(value)) {
-      assert.oneOf(computed[property], value, 'computed style incorrect for ' + property);
-    } else {
-      assert.equal(computed[property], value, 'computed style incorrect for ' + property);
-    }
-  }
-
-  function findNode(desc) {
-    var parts = desc.split('.');
-    var root = document;
-    var node;
-    for (var i=0, p; i < parts.length; i++) {
-      p = parts[i];
-      if (p == '$') {
-        root = node.shadowRoot;
-      } else {
-        node = root.querySelector('#' + p);
-      }
-    }
-    return node;
-  }
-
-  function flush() {
-    if (window.ShadyDOM) {
-      window.ShadyDOM.flush();
-    }
-    window.ShadyCSS.ScopingShim.flush();
-  }
-
-  suite('scoped-styling', function() {
-
-    suiteSetup(function() {
-      makeElement('x-gchild');
-      makeElement('x-child', function() {
-        this.classList.add('nug');
-      });
-      makeElement('x-child2');
-      makeElement('x-scope-class');
-      makeElement('x-scoped');
-      makeElement('x-slotted');
-      (function() {
-        var dynamic = document.querySelector('template#dynamic');
-
-        makeElement('x-dynamic-scope',
-          function() {
-          // simulate 3rd party action by using normal dom to add to element.
-          var dom = document.importNode(dynamic.content, true);
-          this.shadowRoot.querySelector('#container').appendChild(dom);
-        });
-      })();
-      makeElement('x-keyframes');
-      makeElement('x-attr-selector');
-      (function() {
-        var template = document.querySelector('template#svg');
-
-        makeElement('x-dynamic-svg', function() {
-          var dom = document.importNode(template.content, true);
-          this.shadowRoot.querySelector('#container').appendChild(dom);
-        });
-      })();
-      makeElement('x-specificity');
-      makeElement('nested-templates');
-    });
-
-    var el;
-    setup(function() {
-      el = document.createElement('x-scoped');
-      el.id = 'el';
-      document.body.appendChild(el);
-      flush();
-    });
-
-    teardown(function() {
-      document.body.removeChild(el);
-    });
-
-    test(':host', function() {
-      assertComputed(el, '1px');
-      assertComputed(el, ['', 'none'], 'content', '::after');
-    });
-
-    test(':host(...)', function() {
-      var el2 = document.createElement('x-scoped');
-      el2.classList.add('wide');
-      document.body.appendChild(el2);
-      flush();
-      assertComputed(el2, '2px');
-      assertComputed(el2, ['"-content-"', '-content-'], 'content', '::after');
-      document.body.removeChild(el2);
-    });
-
-    test('scoped selectors, simple and complex', function() {
-      assertComputed(findNode('el.$.simple'), '3px');
-      assertComputed(findNode('el.$.complex1'), '4px');
-      assertComputed(findNode('el.$.complex2'), '4px');
-    });
-
-    test('media query scoped selectors', function() {
-      assertComputed(findNode('el.$.media'), '5px');
-    });
-
-    test('upper bound encapsulation', function() {
-      var d = document.createElement('div');
-      d.classList.add('scoped');
-      document.body.appendChild(d);
-      assertComputed(d, '0px');
-      document.body.removeChild(d);
-    });
-
-    test('lower bound encapsulation', function() {
-      assertComputed(findNode('el.$.child.$.simple'), '0px');
-      assertComputed(findNode('el.$.child.$.complex1'), '0px');
-      assertComputed(findNode('el.$.child.$.complex2'), '0px');
-      assertComputed(findNode('el.$.child.$.media'), '0px');
-    });
-
-    test('nested templates', function() {
-      var el = document.createElement('nested-templates');
-      document.body.appendChild(el);
-      // Append nested template content. Note the <template> in <svg> is not
-      // an HTML template with .content at this point; it is just an unknown
-      // SVGElement so we don't have to stamp it
-      var t1 = el.shadowRoot.querySelector('#t1');
-      el.shadowRoot.appendChild(t1.content.cloneNode(true));
-      var t2 = el.shadowRoot.querySelector('#t2');
-      el.shadowRoot.appendChild(t2.content.cloneNode(true));
-      // Everything should now have 'opacity: 0.5'
-      var els = Array.from(el.shadowRoot.querySelectorAll('[id]'));
-      assert.deepEqual(els.map(e => e.getAttribute('id')), ['a', 't1', 't3', 'g', 'circle', 'b', 'c', 't2', 'd']);
-      els.forEach(e => {
-        assert.equal(getComputedStyle(e).opacity, '0.5', `Element with id "${e.id}" does not have the correct opacity`);
-      });
-      document.body.removeChild(el);
-    });
-
-  });
-
-  suite('slotted', function() {
-
-    test('::slotted selectors', function() {
-      var el = document.createElement('x-scoped');
-      document.body.appendChild(el);
-      var content1 = document.createElement('div');
-      content1.slot = 'content1';
-      var content2 = document.createElement('div');
-      content2.slot = 'content2';
-      var content = document.createElement('div');
-      content.className = 'content';
-      el.appendChild(content1);
-      el.appendChild(content2);
-      el.appendChild(content);
-      flush();
-
-      assertComputed(content, '6px');
-      assertComputed(content1, '13px');
-      assertComputed(content2, '14px');
-      document.body.removeChild(el);
-    });
-
-    test('auto ::slotted selector', function() {
-      var x = document.createElement('x-slotted');
-      var d1 = document.createElement('div');
-      d1.classList.add('auto-content');
-      d1.textContent = 'auto-content';
-      document.body.appendChild(x);
-      x.appendChild(d1);
-      flush();
-      assertComputed(d1, '2px');
-      document.body.removeChild(x);
-    });
-
-    test('::slotted + child in complex selector', function() {
-      var x = document.createElement('x-slotted');
-      var d1 = document.createElement('div');
-      d1.classList.add('complex-child');
-      d1.textContent = 'complex-child';
-      document.body.appendChild(x);
-      x.appendChild(d1);
-      flush();
-      assertComputed(d1, '6px');
-      document.body.removeChild(x);
-    });
-
-    test('::slotted + named slot', function() {
-      var x = document.createElement('x-slotted');
-      var d1 = document.createElement('div');
-      d1.setAttribute('slot', 'container')
-      d1.textContent = 'named slot child';
-      document.body.appendChild(x);
-      x.appendChild(d1);
-      flush();
-      assertComputed(d1, '8px');
-      document.body.removeChild(x);
-    });
-
-  });
-
-  suite('dynamic changes', function() {
-
-    test('elements dynamically added/removed from root', function() {
-      var el = document.createElement('x-scoped');
-      document.body.appendChild(el);
-      flush();
-      var d = document.createElement('div');
-      d.classList.add('scoped');
-      d.textContent = 'Dynamically... Scoped!';
-      el.shadowRoot.appendChild(d);
-      flush();
-      assertComputed(d, '4px');
-      document.body.appendChild(d);
-      flush();
-      assert.notInclude(d.getAttribute('style-scoped') || '', el.is, 'scoping attribute not removed when added to other root');
-      assert.notInclude(d.className, el.is, 'scoping class not removed when added to other root');
-      el.shadowRoot.appendChild(d);
-      flush();
-      assertComputed(d, '4px');
-      el.shadowRoot.removeChild(d);
-      flush();
-      assert.notInclude(d.getAttribute('style-scoped') || '', el.is, 'scoping attribute not removed when removed from root');
-      assert.notInclude(d.className, el.is, 'scoping class not removed when removed from root');
-      el.shadowRoot.appendChild(d);
-      flush();
-      assertComputed(d, '4px');
-      document.body.removeChild(el);
-    });
-
-    test('elements dynamically added/removed from host', function() {
-      var el = document.createElement('x-scoped');
-      document.body.appendChild(el);
-      var d = document.createElement('div');
-      d.classList.add('scoped');
-      d.slot = 'blank';
-      d.textContent = 'Dynamically... unScoped!';
-      el.appendChild(d);
-      flush();
-      assertComputed(d, '0px');
-      el.removeChild(d);
-      flush();
-      assert.notInclude(d.getAttribute('style-scoped') || '', el.is, 'scoping attribute not removed when added to other root');
-      assert.notInclude(d.className, el.is, 'scoping class not removed when added to other root');
-      el.appendChild(d);
-      flush();
-      assertComputed(d, '0px');
-      el.removeChild(d);
-      flush();
-      assert.notInclude(d.getAttribute('style-scoped') || '', el.is, 'scoping attribute not removed when removed from root');
-      assert.notInclude(d.className, el.is, 'scoping class not removed when removed from root');
-      el.appendChild(d);
-      flush();
-      assertComputed(d, '0px');
-      document.body.removeChild(el);
-    });
-
-    test('element subtree added via dom api', function() {
-      var el = document.createElement('x-dynamic-scope');
-      document.body.appendChild(el);
-      flush();
-      var container = el.shadowRoot.querySelector('#container');
-      var a = container.querySelector('.added');
-      assertComputed(a, '17px');
-      var b = container.querySelector('.sub-added');
-      assertComputed(b, '18px');
-      document.body.removeChild(el);
-    });
-
-    test('changes to class attribute', function() {
-      var el = document.createElement('x-scoped');
-      el.id = 'el'
-      document.body.appendChild(el);
-      flush();
-      var d = findNode('el.$.computed');
-      assertComputed(d, '0px');
-      d.setAttribute('class', 'computed');
-      assertComputed(d, '15px');
-      d.setAttribute('class', '', 'empty class attr does not remove class');
-      assertComputed(d, '0px');
-      d.setAttribute('class', 'computed ', 'class attr with space does not apply');
-      assertComputed(d, '15px');
-      document.body.removeChild(el);
-    });
-
-  });
-
-  suite('misc', function() {
-
-    var el;
-    setup(function() {
-      el = document.createElement('x-scoped');
-      el.id = 'el';
-      document.body.appendChild(el);
-      flush();
-    });
-
-    teardown(function() {
-      document.body.removeChild(el);
-    });
-
-    test('keyframes change scope', function(done) {
-      var xKeyframes = findNode('el.$.keyframes');
-      // Edge 16 does not support CSS Custom Properties in keyframes
-      if (window.ShadyCSS.nativeCss && navigator.userAgent.match(/Edge/)) {
-        this.skip();
-      }
-      var onAnimationEnd = function() {
-        xKeyframes.removeEventListener('animationend', onAnimationEnd);
-        xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
-        assertComputed(xKeyframes, '100px', 'left');
-
-        xKeyframes = findNode('el.$.keyframes2');
-
-        onAnimationEnd = function() {
-          xKeyframes.removeEventListener('animationend', onAnimationEnd);
-          xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
-          assertComputed(xKeyframes, '200px', 'left');
-          done();
-        };
-
-        xKeyframes.addEventListener('animationend', onAnimationEnd);
-        xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
-
-        xKeyframes.classList.add('special');
-        xKeyframes.setAttribute('animated', '');
-        window.ShadyCSS.ScopingShim.styleElement(xKeyframes);
-      };
-      xKeyframes.addEventListener('animationend', onAnimationEnd);
-      xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
-      xKeyframes.setAttribute('animated', '');
-      assertComputed(xKeyframes, '0px', 'left');
-    });
-
-    test('keyframe names are transformed correctly', function(done) {
-      makeElement('scoped-keyframes');
-      var e = document.createElement('scoped-keyframes');
-      document.body.appendChild(e);
-      flush();
-      var target = e.shadowRoot.querySelector('#target');
-      var onAnimationEnd = function() {
-        assertComputed(target, '10px');
-        target.removeEventListener('animationend', onAnimationEnd);
-        target.removeEventListener('webkitAnimationEnd', onAnimationEnd);
-        document.body.removeChild(e);
-        done();
-      };
-      target.addEventListener('animationend', onAnimationEnd);
-      target.addEventListener('webkitAnimationEnd', onAnimationEnd);
-      e.setAttribute('animate', '');
-      assertComputed(target, '0px');
-    });
-
-    test('attribute inclusive selector and general sibling selectors', function() {
-      var x = document.createElement('x-attr-selector');
-      x.id = 'x';
-      document.body.appendChild(x);
-      flush();
-      assertComputed(findNode('x.$.bar1'), '2px');
-      assertComputed(findNode('x.$.bar2'), '4px');
-      assertComputed(findNode('x.$.bar3'), '6px');
-      document.body.removeChild(x);
-    });
-
-    test('adjacent sibling selectors', function() {
-      makeElement('x-adjacent-sibling');
-      var x = document.createElement('x-adjacent-sibling');
-      x.id = 'x';
-      document.body.appendChild(x);
-      flush();
-      assertComputed(findNode('x.$.foo1'), '20px');
-      assertComputed(findNode('x.$.foo2'), '4px');
-      assertComputed(findNode('x.$.foo3'), '6px');
-      document.body.removeChild(x);
-    })
-
-    test('svg classes are dynamically scoped correctly', function() {
-      var x = document.createElement('x-dynamic-svg');
-      x.id = 'x';
-      document.body.appendChild(x);
-      flush();
-      var container = findNode('x.$.container');
-      var svg = container.querySelector('.svg');
-      var computed = getComputedStyle(svg);
-      assert.equal(computed.height, '24px');
-      assert.equal(computed.width, '24px');
-      var circle = container.querySelector('#circle');
-      computed = getComputedStyle(circle);
-      assert.equal(computed['fill-opacity'], '0.5');
-      document.body.removeChild(x);
-    });
-
-    test(':host selectors always lowest priority', function() {
-      var priority = findNode('el.$.priority');
-      assertComputed(priority, '9px');
-      el.setAttribute('class', 'wide');
-      assertComputed(priority, '9px');
-    });
-
-    test('svg elements properly scoped', function() {
-      if (window.ShadyCSS.nativeShadow) {
-        this.skip();
-      }
-      var circle = findNode('el.$.circle');
-      var classes = (circle.getAttribute('class') || '').split(/\s+/);
-      assert.include(classes, 'x-scoped');
-      assert.include(classes, 'style-scope');
-      assert.notInclude(classes, 'null');
-      assertComputed(circle, '1px', 'strokeWidth');
-    });
-
-    test('set attribute class has style scoping selectors', function() {
-      if (window.ShadyCSS.nativeShadow) {
-        this.skip();
-      }
-      var s = findNode('el.$.scopeClass');
-      var scope = findNode('el.$.scopeClass.$.scope');
-      assert.isTrue(s.classList.contains('style-scope'));
-      assert.isTrue(s.classList.contains('x-scoped'));
-      s.setAttribute('class', 'foo');
-      assert.isTrue(s.classList.contains('foo'));
-      assert.isTrue(s.classList.contains('style-scope'));
-      assert.isTrue(s.classList.contains('x-scoped'));
-      //
-      assert.isTrue(scope.classList.contains('style-scope'));
-      assert.isTrue(scope.classList.contains('x-scope-class'));
-      scope.setAttribute('class', 'foo');
-      assert.isTrue(scope.classList.contains('foo'));
-      assert.isTrue(scope.classList.contains('style-scope'));
-      assert.isTrue(scope.classList.contains('x-scope-class'));
-    });
-
-    test('specificity of :host selector with class', function() {
-      var e1 = document.createElement('x-specificity');
-      document.body.appendChild(e1);
-      flush();
-      assertComputed(e1, '1px');
-      document.body.removeChild(e1);
-      var e2 = document.createElement('x-specificity');
-      e2.setAttribute('class', 'bar');
-      document.body.appendChild(e2);
-      flush();
-      assertComputed(e2, '2px');
-      document.body.removeChild(e2);
-    });
-
-    test('self-use is supported', function() {
-      makeElement('self-test');
-      var e = document.createElement('self-test');
-      document.body.appendChild(e);
-      flush();
-      assertComputed(e.shadowRoot.querySelector('a'), '10px');
-      document.body.removeChild(e);
-    });
-
-    test('nth-child selectors work correctly with plusses', function() {
-      makeElement('nth-plus-one');
-      var e = document.createElement('nth-plus-one');
-      document.body.appendChild(e);
-      flush();
-      assertComputed(e.shadowRoot.querySelector('.foo'), 'rgb(255, 0, 0)', 'color');
-      document.body.removeChild(e);
-    });
-
-    test(':-webkit-any and :-moz-any selectors are supported', function() {
-      if (navigator.userAgent.match(/Trident|Edge/)) {
-        this.skip();
-      }
-      makeElement('any-selector');
-      var e = document.createElement('any-selector');
-      document.body.appendChild(e);
-      flush();
-      assertComputed(e.shadowRoot.querySelector('div'), 'rgb(123, 123, 123)', 'color');
-      assertComputed(e.shadowRoot.querySelector('span'), 'rgb(123, 123, 123)', 'color');
-      document.body.removeChild(e);
-    });
-
-    test(':host() sets mixin definitions correctly', function() {
-      makeElement('bad-mixin');
-      var e = document.createElement('bad-mixin');
-      document.body.appendChild(e);
-      flush();
-      assertComputed(e.shadowRoot.querySelector('div'), '0px');
-      document.body.removeChild(e);
-    });
-
-    test('trees with elements missing styles render correctly', function() {
-      makeElement('x-parent-skip');
-      makeElement('x-skip');
-      makeElement('x-child-skip');
-      const p = document.createElement('x-parent-skip');
-      document.body.appendChild(p);
-      flush();
-      const inner = p.shadowRoot.querySelector('x-skip').shadowRoot.querySelector('x-child-skip').shadowRoot.querySelector('div');
-      assertComputed(inner, '10px');
-      document.body.removeChild(p);
-    });
-
-    test('trees with elements missing templates render correctly', function() {
-      makeElement('no-shadow');
-      const p = document.createElement('x-parent-skip');
-      const n = document.createElement('no-shadow');
-      const c = document.createElement('x-child-skip');
-      document.body.appendChild(p);
-      p.shadowRoot.appendChild(n);
-      n.shadowRoot.appendChild(c);
-      flush();
-      const inner = c.shadowRoot.querySelector('div');
-      assertComputed(inner, '10px');
-      document.body.removeChild(p);
-    })
-
-  });
-
-  suite('unscoping', function() {
-    suiteSetup(function() {
-      makeElement('shady-unscoped');
-    });
-    test('styles with "shady-unscoped" attr work in Shady and Shadow', function() {
-      var el = document.createElement('shady-unscoped');
-      document.body.appendChild(el);
-      flush();
-      var div = el.shadowRoot.querySelector('div');
-      assertComputed(div, 'rgb(255, 0, 0)', 'color');
-      document.body.removeChild(el);
-    });
-    test('styles with "shady-unscoped" attr deduplicate', function(){
-      if (window.ShadyCSS.nativeShadow) {
-        this.skip();
-      }
-      makeElement('shady-unscoped-2');
-      var el1 = document.createElement('shady-unscoped');
-      var el2 = document.createElement('shady-unscoped-2');
-      document.body.appendChild(el1);
-      document.body.appendChild(el2);
-      flush();
-      assert.equal(document.querySelectorAll('style[shady-unscoped]').length, 1);
-      document.body.removeChild(el1);
-      document.body.removeChild(el2);
-    });
-    test('@apply does not work in shady-unscoped', function() {
-      makeElement('unscoped-apply-user');
-      makeElement('unscoped-apply');
-      var el = document.createElement('unscoped-apply');
-      document.body.appendChild(el);
-      flush();
-      var inner = el.shadowRoot.querySelector('unscoped-apply-user');
-      var target = inner.shadowRoot.querySelector('div');
-      assertComputed(target, '0px');
-      document.body.removeChild(el);
-    });
-  });
-
-})();
-</script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/settings.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/settings.html
deleted file mode 100644
index ccf773e..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/settings.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script src="./test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script>
-  suite('Settings', () => {
-    window.ShadyCSS = { cssBuild: 'shady' }
-    let origCss;
-    let origShady;
-    let origCssBuild;
-    test(`settings remain correct no matter the order of components loaded ${JSON.stringify(window.WebComponents.flags)}`, (done) => {
-      let script = document.createElement('script');
-      script.src = '../custom-style-interface.min.js';
-      script.onerror = (err) => done(err);
-      script.onload = () => {
-        origCss = window.ShadyCSS.nativeCss;
-        origShady = window.ShadyCSS.nativeShadow;
-        origCssBuild = window.ShadyCSS.cssBuild;
-        assert.notEqual(origCss, undefined, 'nativeCss should be defined');
-        assert.notEqual(origShady, undefined, 'nativeShadow should be defined');
-        assert.equal(origCssBuild, 'shady', 'cssBuild should be defined');
-        let script = document.createElement('script');
-        script.src = '../apply-shim.min.js';
-        script.onerror = (err) => done(err);
-        script.onload = () => {
-          assert.equal(origCss, window.ShadyCSS.nativeCss);
-          assert.equal(origShady, window.ShadyCSS.nativeShadow);
-          assert.equal(origCssBuild, window.ShadyCSS.cssBuild);
-          let script = document.createElement('script');
-          script.src = '../scoping-shim.min.js';
-          script.onerrer = (err) => done(err);
-          script.onload = () => {
-            assert.equal(origCss, window.ShadyCSS.nativeCss);
-            assert.equal(origShady, window.ShadyCSS.nativeShadow);
-            assert.equal(origCssBuild, window.ShadyCSS.cssBuild);
-            done();
-          };
-          document.head.appendChild(script);
-        }
-        document.head.appendChild(script);
-      }
-      document.head.appendChild(script);
-    });
-    test('Native CSS Custom Properties disabled if ShadyDOM is in use', () => {
-      if (!window.ShadyDOM || !window.ShadyDOM.inUse) {
-        assert.isTrue(window.ShadyCSS.nativeCss, 'nativeCss should be enabled if not using ShadyDOM');
-      }
-    })
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/style-transformer.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/style-transformer.html
deleted file mode 100644
index cf457f3..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/style-transformer.html
+++ /dev/null
@@ -1,299 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script>
-WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-</script>
-<script src="./test-flags.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-<script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-<script src="../node_modules/@webcomponents/template/template.js"></script>
-<script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-<script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-<script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-<script src="../scoping-shim.min.js"></script>
-<script src="module/generated/style-transformer.js"></script>
-<title>Style Transformer</title>
-
-<template id="host">
-  <style>
-  :host {
-    color: blue;
-  }
-  :host([red]) {
-    color: red;
-  }
-  :host > * {
-    color: green;
-  }
-  :host(.bar) :-webkit-any(.foo, .bar) {
-    color: purple;
-  };
-  :-webkit-any([baz], [zot="foo"]) :matches(foo, bar) > :-moz-any(:not(:defined), :unresolved) {
-    color: rgb(123, 123, 123);
-  }
-  :matches(a, b) {
-    color: black;
-  }
-  </style>
-</template>
-
-<template id="slotted">
-  <style>
-  div::slotted(.foo) {
-    color: gray;
-  }
-  ::slotted(.bar) {
-    color: lightgray;
-  }
-  :host > ::slotted(*:nth-of-type(2n - 1)) {
-    color: red;
-  }
-  </style>
-</template>
-
-<template id="dir">
-  <style>
-  div:dir(rtl) {
-    color: blue;
-  }
-  :host(:dir(rtl)) {
-    color: blue;
-  }
-  </style>
-</template>
-
-<template id="custom-style">
-  <style>
-  :root {
-    color: black;
-  }
-  </style>
-</template>
-
-<template id="shared-style">
-  <style>
-    html, :host {
-      color: gray;
-    }
-  </style>
-</template>
-
-<template id="attribute-style">
-  <style>
-    [foo="foo:bar"] {
-      background-color: blue;
-    }
-  </style>
-</template>
-
-<template id="nested-attribute-style">
-  <style>
-    [foo="foo:bar"] [foo="foo:bar"] {
-      background-color: blue;
-    }
-  </style>
-</template>
-
-<template id="prepended-attribute-style">
-  <style>
-    foo[foo="foo:bar"] {
-      background-color: blue;
-    }
-  </style>
-</template>
-
-<script>
-function processTemplate(templateName, elementName) {
-  var template = document.querySelector('template#' + templateName);
-  window.ShadyCSS.prepareTemplate(template, elementName);
-  return template._styleAst;
-}
-suite('Style Transformer', function() {
-  setup(function() {
-    if (window.ShadyCSS.nativeShadow) {
-      this.skip();
-    }
-  })
-  suite(':host transforms', function() {
-    var ast;
-    suiteSetup(function() {
-      ast = processTemplate('host', 'x-foo');
-    });
-
-    test(':host{}', function() {
-      assert.equal(ast.rules[0].selector, 'x-foo');
-    });
-
-    test(':host([red]){}', function() {
-      assert.equal(ast.rules[1].selector, 'x-foo[red]');
-    });
-
-    test(':host > *{}', function() {
-      assert.equal(ast.rules[2].selector, 'x-foo > *.x-foo');
-    });
-
-    test(':host() :-webkit-any()', function() {
-      assert.equal(ast.rules[3].selector, 'x-foo.bar :-webkit-any(.foo, .bar).x-foo');
-    });
-
-    test('lots of :matches()', function() {
-      assert.equal(ast.rules[4].selector, ':-webkit-any([baz], [zot="foo"]).x-foo :matches(foo, bar).x-foo > :-moz-any(:not(:defined), :unresolved).x-foo');
-    });
-
-    test('only match', function() {
-      assert.equal(ast.rules[5].selector, ':matches(a, b).x-foo');
-    });
-  });
-
-  suite('::slotted transforms', function() {
-    var ast;
-    suiteSetup(function() {
-      ast = processTemplate('slotted', 'x-slot');
-    });
-
-    test('div::slotted(.foo)', function() {
-      assert.equal(ast.rules[0].selector, 'div.x-slot > .foo');
-    });
-
-    test('::slotted(.bar)', function() {
-      assert.equal(ast.rules[1].selector, 'x-slot > .bar');
-    });
-
-    test(':host > ::slotted(*:nth-of-type(2n - 1))', function() {
-      assert.equal(ast.rules[2].selector, 'x-slot > *:nth-of-type(2n-1)');
-    });
-  });
-
-  suite('dir transforms', function() {
-    var ast;
-    suiteSetup(function() {
-      ast = processTemplate('dir', 'x-dir');
-    });
-
-    test('div:dir(rtl)', function() {
-      assert.equal(ast.rules[0].selector, '[dir="rtl"] div.x-dir, div.x-dir[dir="rtl"]');
-    });
-
-    test('host(:dir(rtl))', function() {
-      assert.equal(ast.rules[1].selector, '[dir="rtl"] x-dir, x-dir[dir="rtl"]');
-    });
-
-  });
-
-  suite('custom-style transforms', function() {
-    var rule;
-    setup(function() {
-      var template = document.querySelector('template#custom-style');
-      var style = template.content.querySelector('style').cloneNode(true);
-      var ast = window.ShadyCSS.ScopingShim.getStyleAst(style);
-      rule = ast.rules[0];
-    });
-
-    test('native ShadowDOM', function() {
-      window.StyleTransformer.normalizeRootSelector(rule);
-      assert.equal(rule.selector, 'html');
-    });
-
-    test('ShadyDOM', function() {
-      window.StyleTransformer.documentRule(rule);
-      assert.equal(rule.selector, 'html:not(.style-scope)');
-    });
-  });
-
-  suite('shared style (light or shadow dom) transforms', function() {
-    let rule;
-
-    setup(function() {
-      const template = document.querySelector('template#shared-style');
-      const style = template.content.querySelector('style').cloneNode(true);
-      const ast = window.ShadyCSS.ScopingShim.getStyleAst(style);
-      rule = ast.rules[0];
-    });
-
-    test('native ShadowDOM', function() {
-      window.StyleTransformer.normalizeRootSelector(rule);
-      assert.equal(rule.selector, 'html, :host');
-    });
-
-    test('ShadyDOM', function() {
-      window.StyleTransformer.documentRule(rule);
-      assert.equal(rule.selector, 'html:not(.style-scope)');
-    });
-  });
-
-  suite('attribute selectors', function() {
-
-    suite('simple', function() {
-      let rule;
-
-      setup(function() {
-        const template = document.querySelector('template#attribute-style');
-        const style = template.content.querySelector('style').cloneNode(true);
-        const ast = window.ShadyCSS.ScopingShim.getStyleAst(style);
-        rule = ast.rules[0];
-      });
-
-      test('native ShadowDOM', function() {
-        window.StyleTransformer.normalizeRootSelector(rule);
-        assert.equal(rule.selector, '[foo="foo:bar"]');
-      });
-
-      test('ShadyDOM', function() {
-        window.StyleTransformer.documentRule(rule);
-        assert.equal(rule.selector, ':not(.style-scope)[foo="foo:bar"]');
-      });
-    });
-
-    suite('nested', function() {
-      let rule;
-
-      setup(function() {
-        const template = document.querySelector('template#nested-attribute-style');
-        const style = template.content.querySelector('style').cloneNode(true);
-        const ast = window.ShadyCSS.ScopingShim.getStyleAst(style);
-        rule = ast.rules[0];
-      });
-
-      test('native ShadowDOM', function() {
-        window.StyleTransformer.normalizeRootSelector(rule);
-        assert.equal(rule.selector, '[foo="foo:bar"] [foo="foo:bar"]');
-      });
-
-      test('ShadyDOM', function() {
-        window.StyleTransformer.documentRule(rule);
-        assert.equal(rule.selector, ':not(.style-scope)[foo="foo:bar"] :not(.style-scope)[foo="foo:bar"]');
-      });
-    });
-
-    suite('prepended', function() {
-      let rule;
-
-      setup(function() {
-        const template = document.querySelector('template#prepended-attribute-style');
-        const style = template.content.querySelector('style').cloneNode(true);
-        const ast = window.ShadyCSS.ScopingShim.getStyleAst(style);
-        rule = ast.rules[0];
-      });
-
-      test('native ShadowDOM', function() {
-        window.StyleTransformer.normalizeRootSelector(rule);
-        assert.equal(rule.selector, 'foo[foo="foo:bar"]');
-      });
-
-      test('ShadyDOM', function() {
-        window.StyleTransformer.documentRule(rule);
-        assert.equal(rule.selector, 'foo:not(.style-scope)[foo="foo:bar"]');
-      });
-    });
-  });
-});
-</script>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/svg.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/svg.html
deleted file mode 100644
index a613f46..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/svg.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>SVG</title>
-  <script>
-    window.ShadyDOM = {force: true};
-    window.ShadyCSS = {shimshadow: true};
-  </script>
-  <script>
-  WCT = {waitFor: function (cb) {HTMLImports.whenReady(cb)}}
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/svg-in-shadow.js"></script>
-</head>
-<body>
-  <template id="svg-in-shadow">
-    <style>
-      :host {
-        display: inline-block;
-        background-color: #ccc;
-      }
-
-      .test-class {
-        border: 3px solid blue;
-      }
-
-      circle {
-        fill: blue;
-      }
-    </style>
-    <svg
-      xmlns="http://www.w3.org/2000/svg" version="1.1"
-      width="100px" height="100px" viewBox="0 0 100 100"
-      class="test-class"
-    ></svg>
-  </template>
-
-  <script>
-    suite('SVG', function() {
-      var STYLE_SCOPE_CLASS = 'style-scope';
-
-      suiteSetup(function() {
-        window.registerSVGElement();
-      });
-
-      function flush() {
-        if (window.ShadyDOM) {
-          window.ShadyDOM.flush();
-        }
-        window.ShadyCSS.ScopingShim.flush();
-      }
-
-      test('SVG elements within a style scope should have style scoping classes.', function() {
-        var elementWithSVG = document.createElement('svg-in-shadow');
-        // Force upgrade.
-        document.body.appendChild(elementWithSVG);
-        flush();
-        var svg = elementWithSVG.svg;
-        // The svg element should have a style scope.
-        assert(svg.getAttribute('class').indexOf(STYLE_SCOPE_CLASS) > -1);
-        var circle = elementWithSVG.addCircle();
-        flush();
-        // The circle should also have a style scope.
-        assert(circle.getAttribute('class').indexOf(STYLE_SCOPE_CLASS) > -1);
-        // Clean up.
-        document.body.removeChild(elementWithSVG);
-      });
-
-      test('SVG elements removed from style scopes should have scoping classes removed.', function() {
-        var elementWithSVG = document.createElement('svg-in-shadow');
-        // Force upgrade.
-        document.body.appendChild(elementWithSVG);
-        flush();
-        // Get references to test elements.
-        var svg = elementWithSVG.svg;
-        var circle = elementWithSVG.addCircle();
-        flush();
-        // Move the SVG element out of the shadow root.
-        svg.parentNode.removeChild(svg);
-        document.body.appendChild(svg);
-        flush();
-        // The svg element should keep the class that was not involved in style scoping.
-        assert.equal(svg.getAttribute('class').trim(), 'test-class');
-        // The svg element and circle should not have style scope classes.
-        if (svg.hasAttribute('class')) {
-          assert(svg.getAttribute('class').indexOf(STYLE_SCOPE_CLASS) === -1);
-        }
-        if (circle.hasAttribute('class')) {
-          assert(circle.getAttribute('class').indexOf(STYLE_SCOPE_CLASS) === -1);
-        }
-        // Clean up.
-        document.body.removeChild(elementWithSVG);
-        document.body.removeChild(svg);
-      });
-    });
-  </script>
-</body>
-</html>
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/test-flags.js b/systrace/catapult/third_party/polymer/components/shadycss/tests/test-flags.js
deleted file mode 100644
index a734044..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/test-flags.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * @license
- * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function () {
-
-  'use strict';
-
-  // Establish scope.
-  window['WebComponents'] = window['WebComponents'] || { 'flags': {} };
-
-  var flagMatcher = /wc-(.+)/;
-
-  // Flags. Convert url arguments to flags
-  var flags = {};
-  if (!flags['noOpts']) {
-    // from url
-    location.search.slice(1).split('&').forEach(function (option) {
-      var parts = option.split('=');
-      var match;
-      if (parts[0] && (match = parts[0].match(flagMatcher))) {
-        flags[match[1]] = parts[1] || true;
-      }
-    });
-  }
-
-  // exports
-  window['WebComponents']['flags'] = flags;
-  var forceShady = flags['shadydom'];
-  if (forceShady) {
-    window['ShadyDOM'] = window['ShadyDOM'] || {};
-    window['ShadyDOM']['force'] = forceShady;
-  }
-
-  var forceCE = flags['register'] || flags['ce'];
-  if (forceCE && window['customElements']) {
-    window['customElements']['forcePolyfill'] = forceCE;
-  }
-
-  var forceShimCss = flags['shimcssproperties'];
-  if (forceShimCss) {
-    window['ShadyCSS'] = window['ShadyCSS'] || {};
-    window['ShadyCSS']['shimcssproperties'] = true;
-  }
-
-  window['WebComponents']['ready'] = true;
-
-})();
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/wc-1.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/wc-1.html
deleted file mode 100644
index fbe410b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/wc-1.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!doctype html>
-<!--
-@license
-Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<script src="./test-flags.js"></script>
-<script src="https://unpkg.com/@webcomponents/webcomponentsjs@1/webcomponents-lite.js"></script>
-<script src="../custom-style-interface.min.js"></script>
-<script src="../node_modules/wct-browser-legacy/browser.js"></script>
-<script src="module/generated/make-element.js"></script>
-<script src="module/generated/custom-style-element.js"></script>
-<template id="my-element">
-  <style>
-    :host {
-      display: block;
-      --foo: rgb(255, 0, 0);
-    }
-    div {
-      color: var(--foo);
-    }
-  </style>
-  <div>Hi!</div>
-</template>
-<script>
-  suite('WC v1 compat', function() {
-    suiteSetup(function() {
-      makeElement('my-element');
-    });
-    test('element renders correctly', function() {
-      const el = document.createElement('my-element');
-      document.body.appendChild(el);
-      const color = getComputedStyle(el.shadowRoot.querySelector('div')).getPropertyValue('color').trim();
-      assert.equal(color, 'rgb(255, 0, 0)');
-      document.body.removeChild(el);
-    });
-  });
-</script>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/tests/workarounds.html b/systrace/catapult/third_party/polymer/components/shadycss/tests/workarounds.html
deleted file mode 100644
index 5b67af9..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/tests/workarounds.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<!--
-@license
-Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-<html>
-
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
-  <script>
-    WCT = { waitFor: function (cb) { HTMLImports.whenReady(cb) } }
-  </script>
-  <script src="./test-flags.js"></script>
-  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
-  <script src="../node_modules/@webcomponents/webcomponents-platform/webcomponents-platform.js"></script>
-  <script src="../node_modules/es6-promise/dist/es6-promise.auto.min.js"></script>
-  <script src="../node_modules/@webcomponents/template/template.js"></script>
-  <script src="../node_modules/@webcomponents/html-imports/html-imports.min.js"></script>
-  <script src="../node_modules/@webcomponents/shadydom/shadydom.min.js"></script>
-  <script src="../node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
-  <script src="../scoping-shim.min.js"></script>
-  <script src="../apply-shim.min.js"></script>
-  <script src="../custom-style-interface.min.js"></script>
-  <script src="module/generated/make-element.js"></script>
-</head>
-<body>
-  <template id="x-bug">
-    <style>
-      :host {
-        --bg: rgb(255, 0, 0);
-      }
-      div::after {
-        content: 'test';
-        background-color: var(--bg);
-      }
-    </style>
-    <div></div>
-  </template>
-  <script>
-    suite('Workarounds', function() {
-      test('Edge 15', function() {
-        makeElement('x-bug');
-        let el = document.createElement('x-bug');
-        document.body.appendChild(el);
-        let div = el.shadowRoot.querySelector('div');
-        assert.notEqual(getComputedStyle(div).getPropertyValue('background-color').trim(), 'rgb(255, 0, 0)');
-      })
-    });
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/shadycss/wct.conf.json b/systrace/catapult/third_party/polymer/components/shadycss/wct.conf.json
deleted file mode 100644
index 8e6ad2b..0000000
--- a/systrace/catapult/third_party/polymer/components/shadycss/wct.conf.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "suites": ["tests/runner.html"],
-  "npm": true,
-  "plugins": {
-    "local": {
-      "browserOptions": {
-        "chrome": [
-          "disable-gpu",
-          "no-sandbox"
-        ]
-      }
-    }
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/CONTRIBUTING.md b/systrace/catapult/third_party/polymer/components/web-animations-js/CONTRIBUTING.md
deleted file mode 100644
index 15142a7..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/CONTRIBUTING.md
+++ /dev/null
@@ -1,123 +0,0 @@
-## Developer instructions
-
-### Setup
-
-1. Fork web-animations/web-animations-js.
-1. `git clone git@github.com:$GITHUB_USER/web-animations-js.git`
-1. `git submodule update --init --recursive` (Necessary for running tests.)
-1. Install [node](https://nodejs.org/en/) and make sure `npm` is in your $PATH
-1. Run `npm install` in the respository to pull in development dependencies.
-1. Run `npm install -g grunt-cli` to get the build tools for the command line.
-
-### Contributing
-
-Note that development should occur against the `dev` branch, not `master`. This
-is the default target for pull requests.
-
-1. In your fork of web-animations-js, `git checkout dev` or create a new branch whose parent is dev.
-1. Run `grunt` to build the polyfill.
-1. Run `grunt test` to run polyfill and web-platform-tests tests.
-1. Commit changes to your fork.
-1. Create a pull request from your fork of web-animations-js to
-   [web-animations/web-animations-js/dev](https://github.com/web-animations/web-animations-js/tree/dev).
-1. Ensure that you've signed the [Google Contributor License Agreement](https://cla.developers.google.com/clas).
-
-
-## Debugging tests
-
-You can run the tests in an interactive mode with `grunt debug`. This starts the
-Karma server once for each polyfill target for each test framework.
-Navigate to `http://localhost:9876/debug.html` to open the test runner in your
-browser of choice, all test results appear in the Javascript console.
-Test failures can be accessed via `window.failures` and `window.formattedFailures`
-once the tests have completed.
-
-The polyfill target and tests can be specified as arguments to the `debug` task.
-Example: `grunt debug:web-animations-next:test/web-platform-tests/web-animations/animation/pause.html`
-Multiple test files may be listed with comma separation. Specifying files will output their URL in the command line.
-Example: `http://localhost:9876/base/test/web-platform-tests/web-animations/animation/pause.html`
-
-
-## Design notes
-
-[Design diagrams](https://drive.google.com/folderview?id=0B9rpPoIDv3vTNlZxOVp6a2tNa1E&usp=sharing)
-
-
-## Publishing a release
-
-1.  Determine the version number for the release
-
-    * Increment the first number and reset others to 0 when there are large breaking changes
-    * Increment the second number and reset the third to 0 when there are significant new, but backwards compatible features
-    * Otherwise, increment the third number
-
-1.  Add versioned release notes to `History.md`, for example:
-
-        ### 3.13.37 — *November 1, 2001*
-
-          * Fixed a bug where nothing worked
-
-    Use the following to generate a summary of commits, but edit the list to contain only
-    relevant information.
-
-        git log --first-parent `git describe --tags --abbrev=0 master`..dev --pretty=format:"  * %s"
-
-1.  Specify the new version inside `package.json` (for NPM), for example:
-
-    ```js
-      "version": "3.13.37",
-    ```
-
-1.  Build the polyfill with `npm install && grunt` then update `docs/experimental.md`'s Build Target Comparison with the current gzipped sizes.
-
-1.  Commit the above changes to web-animations-js/dev and merge to
-    web-animations-js/master.
-
-    ```sh
-    git checkout master
-    git merge dev --no-edit --quiet
-    ```
-
-1.  Build and commit minified JavaScript files.
-
-    ```sh
-    npm install
-    grunt
-    # Optional "grunt test" to make sure everything still passes.
-    git add -f *.min.js{,.map}
-    git rm .gitignore
-    git commit -m 'Add build artifacts from '`cat .git/refs/heads/dev`
-    git push HEAD:refs/heads/master
-    ```
-
-1.  Draft a [new release](https://github.com/web-animations/web-animations-js/releases) at the
-    commit pushed to web-animations-js in step #4. Copy the release notes from `History.md`
-    added in step #2.
-
-1. Once you've pushed to web-animations-js, run `npm publish` from that checked-out folder
-
-   To do this, you'll need to be a collaborator [on the NPM project](https://www.npmjs.com/package/web-animations-js), or have a collaborator help you.
-
-1. If there are any breaking changes to the API in this release you must notify web-animations-changes@googlegroups.com.
-
-   Only owners of the group may post to it so you may need to request ownership or ask someone to post it for you.
-
-## Testing architecture
-
-This is an overview of what happens when `grunt test` is run.
-
-1. Polyfill tests written in mocha and chai are run.
-    1. grunt creates a karma config with mocha and chai adapters.
-    1. grunt adds the test/js files as includes to the karma config.
-    1. grunt starts the karma server with the config and waits for the result.
-    1. The mocha adaptor runs the included tests and reports the results to karma.
-    1. karma outputs results to the console and returns the final pass/fail result to grunt.
-1. web-platform-tests/web-animations tests written in testtharness.js are run.
-    1. grunt creates a karma config with karma-testharness-adaptor.js included.
-    1. grunt adds the web-platform-tests/web-animations files to the custom testharnessTests config in the karma config.
-    1. grunt adds failure expectations to the custom testharnessTests config in the karma config.
-    1. grunt starts the karma server with the config and waits for the result.
-    1. The testharness.js adaptor runs the included tests (ignoring expected failures) and reports the results to karma.
-    1. karma outputs results to the console and returns the final pass/fail result to grunt.
-1. grunt exits successfully if both test runs passed.
-
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/COPYING b/systrace/catapult/third_party/polymer/components/web-animations-js/COPYING
deleted file mode 100644
index d645695..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/COPYING
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 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/systrace/catapult/third_party/polymer/components/web-animations-js/History.md b/systrace/catapult/third_party/polymer/components/web-animations-js/History.md
deleted file mode 100644
index 6deef41..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/History.md
+++ /dev/null
@@ -1,265 +0,0 @@
-### 2.3.1 - *July 20 2017*
-
-  * Fix [https://github.com/web-animations/web-animations-js/issues/157](missing web-animations.min.js issue)
-
-### 2.3.0 - *July 20 2017*
-
-  *  [Support IE/Edge SVG transforms.](https://github.com/web-animations/web-animations-js/pull/148)
-
-  *  [Parse and evaluate calc expressions without eval.](https://github.com/web-animations/web-animations-js/pull/151)
-
-### 2.2.5 - *April 17 2017*
-
-  *  Removed erroneously added *.gz files from release.
-
-### 2.2.4 - *April 14 2017*
-
-  *  [Reverted adding 'use strict' to source files.](https://github.com/web-animations/web-animations-next/pull/124)
-
-### 2.2.3 - *April 13 2017*
-
-  *  [Added HTML import targets.](https://github.com/web-animations/web-animations-js/pull/94)
-
-  *  Added support for animating SVG related properties:
-      *  [fill](https://github.com/web-animations/web-animations-next/pull/484)
-      *  [floodColor](https://github.com/web-animations/web-animations-next/pull/484)
-      *  [lightingColor](https://github.com/web-animations/web-animations-next/pull/484)
-      *  [stopColor](https://github.com/web-animations/web-animations-next/pull/484)
-      *  [strokeDashoffset](https://github.com/web-animations/web-animations-js/pull/96)
-      *  [strokeDasharray](https://github.com/web-animations/web-animations-js/pull/120)
-
-  *  [Fixed crash when animating non-invertable matrices.](https://github.com/web-animations/web-animations-js/pull/121)
-
-  *  [Fixed source maps for Bower installs.](https://github.com/web-animations/web-animations-js/pull/93)
-
-  *  [Updated README.md documentation structure.](https://github.com/web-animations/web-animations-next/pull/489)
-
-  *  [Added 'use strict' to source files.](https://github.com/web-animations/web-animations-next/pull/488)
-
-### 2.2.2 - *August 3 2016*
-
-  * [Fixed handling of keyframes with overlapping offsets.](https://github.com/web-animations/web-animations-next/pull/470)
-
-  * [Throw TypeError on invalid keyframe input.](https://github.com/web-animations/web-animations-next/pull/471)
-
-  * [Fixed display and other animation properties being animated.](https://github.com/web-animations/web-animations-next/pull/474)
-
-  * [Throw InvalidStateError when calling play() on reversed infinite animation.](https://github.com/web-animations/web-animations-next/pull/475)
-
-  * [Fixed infinite loop in cubic-bezier timing function.](https://github.com/web-animations/web-animations-next/pull/476)
-
-  * [Fixed idle animations not becoming paused when seeked.](https://github.com/web-animations/web-animations-next/pull/479)
-
-  * [Fixed pause() not rewinding idl animations.](https://github.com/web-animations/web-animations-next/pull/480)
-
-  * [Extended cubic-bezier timing function domain from [0, 1] to (-Infinity, Infinity).](https://github.com/web-animations/web-animations-next/pull/481)
-
-  * [Fixed timing model to handle corner cases involving Infinity and 0 correctly.](https://github.com/web-animations/web-animations-next/pull/482)
-
-  * [Fixed source files missing from npm package.](https://github.com/web-animations/web-animations-next/pull/483)
-
-  * [Improved performance of starting and updating individual animations.](https://github.com/web-animations/web-animations-next/pull/485)
-
-### 2.2.1 - *April 28 2016*
-  * [Deprecated invalid timing inputs](https://github.com/web-animations/web-animations-next/pull/437) as they will soon throw [TypeErrors](https://github.com/web-animations/web-animations-next/pull/426) in native browsers.
-
-    For example, this is deprecated and will eventually throw a TypeError:
-
-        element.animate([], {
-            duration: -1,
-            iterationStart: -1,
-            iterations: -1,
-            easing: 'garbage string',
-        });
-
-  * [Fixed polyfill crash in browsers based on Chromium 36 to 46.](https://github.com/web-animations/web-animations-next/pull/434)
-
-  * [Increased cubic-bezier accuracy.](https://github.com/web-animations/web-animations-next/pull/428)
-
-  * [Added support for grad and turn units for angles.](https://github.com/web-animations/web-animations-next/pull/427)
-
-### 2.2.0 - *April 6 2016*
-  * Deprecated the use of hyphens in property names.
-
-    For example, this is deprecated:
-
-        element.animate([{'font-size': '0px'}, {'font-size': '10px'}]);
-
-    and this should be used instead:
-
-        element.animate([{fontSize: '0px'}, {fontSize: '10px'}]);
-
-  * Added arbitrary easing capitalisation.
-
-  * Added "id" effect option. (http://w3c.github.io/web-animations/#dom-keyframeanimationoptions-id)
-
-  * Added "oncancel" event handler.
-
-  * Added value list keyframe syntax.
-
-    As as alternative to:
-
-        element.animate([{color: 'red'}, {color: 'green'}, {color: 'blue'}]);
-
-    you can now use:
-
-        element.animate({color: ['red', 'green', 'blue']});
-
-  * Fixed easing TypeError in FireFox Nightly when using groups.
-
-  * Fixed delayed animation updates on Safari and Firefox
-
-  * Fixed infinite recursion when setting onfinish to null.
-
-### 2.1.4 - *December 1 2015*
-  * Use `Date.now()` instead of `performace.now()` for mobile Safari.
-
-### 2.1.3 - *October 12 2015*
-  * Removed web-animations.min.js.gz
-
-### 2.1.2 - *July 8 2015*
-  * Fix a bug where onfinish was being called for GroupEffects before they were finished.
-
-### 2.1.1 - *July 1 2015*
-  * Add Animation.timeline getter
-  * Add AnimationEffect.parent getter
-  * Make AnimationEffectTiming (returned by AnimationEffect.timing) attributes mutable
-  * Expose the Animation constructor
-  * Change custom effects from AnimationEffects to onsample functions. Custom effects should now be created by setting the onsample attribute of a KeyframeEffect.
-
-    For example, this is deprecated:
-
-        var myEffect = new KeyframeEffect(
-           element,
-           function(timeFraction, target, effect) {
-              target.style.opacity = timeFraction;
-           },
-           1000);
-        var myAnimation = document.timeline.play(myEffect);
-
-    and this should be used insead:
-
-        var myEffect = new KeyframeEffect(element, [], 1000);
-        effect.onsample = function(timeFraction, effect, animation) {
-           effect.target.style.opacity = timeFraction;
-        };
-        var myAnimation = document.timeline.play(myEffect);
-
-### 2.1.0 - *June 15 2015*
-  * Fix bug affecting GroupEffects with infinite iteration children
-  * Add GroupEffect.firstChild and GroupEffect.lastChild
-  * Add initial values for most CSS properties
-  * Allow `timeline.play()` to be called with no arguments
-  * Add AnimationEffect.clone
-  * Add GroupEffect.append and GroupEffect.prepend
-  * Add AnimationEffect.remove
-  * Add Animation.ready and Animation.finished promises
-
-### 2.0.0 - *April 5 2015*
-
-  * Improve behavior of group Animation playback rate.
-  * Rename Animation to KeyframeEffect.
-  * Rename AnimationSequence to SequenceEffect.
-  * Rename AnimationGroup to GroupEffect.
-  * Rename AnimationPlayer to Animation.
-  * Remove KeyframeEffect.effect and add KeyframeEffect.getFrames.
-  * Rename Animation.source to Animation.effect.
-  * Rename Timeline.getAnimationPlayers to Timeline.getAnimations.
-  * Rename Element.getAnimationPlayers to Element.getAnimations.
-
-### 1.0.7 - *March 10 2015*
-
-  * Improve performance of constructing groups and sequences.
-  * Remove support for animating zoom.
-  * Add bower file.
-
-### 1.0.6 - *February 5 2015*
-
-  * Implement playbackRate setter for group players.
-  * Fix pausing a group player before its first tick.
-  * Fix cancelling a group player before its first tick.
-  * Fix excess CPU use on idle pages where custom effects and groups were used.
-  * Suppress AnimationTiming.playbackRate deprecation warning for cases where AnimationTiming.playbackRate == 1.
-
-### 1.0.5 - *January 6 2015*
-
-  * Fix loading the polyfill in an SVG document
-  * Fix a problem where groups didn't take effect in their first frame
-  * Don't rely on performance.now
-
-### 1.0.4 - *December 8 2014*
-
-  * Fix a critical bug where deprecation logic wasn't being loaded
-    when `web-animations-next` and `web-animations-next-lite` were
-    executed on top of a native `element.animate`.
-
-### 1.0.3 - *December 4 2014*
-
-  * Fix a critical bug on iOS 7 and Safari <= 6. Due to limitations,
-    inline style patching is not supported on these platforms.
-
-### 1.0.2 - *November 28 2014*
-
-  * Deprecated `AnimationTiming.playbackRate`.
-
-    For example, this is no longer supported:
-
-        var player = element.animate(
-            keyframes,
-            {duration: 1000, playbackRate: 2});
-
-    Use `AnimationPlayer.playbackRate` instead:
-
-        var player = element.animate(
-            keyframes,
-            {duration: 1000});
-        player.playbackRate = 2;
-
-    If you have any feedback on this change, please start a discussion
-    on the public-fx mailing list:
-    http://lists.w3.org/Archives/Public/public-fx/
-
-    Or file an issue against the specification on GitHub:
-    https://github.com/w3c/web-animations/issues/new
-
-### 1.0.1 - *November 26 2014*
-
-  * Players should be constructed in idle state
-  * `play()` and `reverse()` should not force a start times
-  * Add `requestAnimationFrame` ids and `cancelAnimationFrame`
-
-### 1.0.0 — *November 21 2014*
-
-  The web-animations-js hackers are pleased to announce the release of
-  a new codebase for the Web Animations Polyfill:
-  https://github.com/web-animations/web-animations-js
-
-  The previous polyfill has been moved to:
-  https://github.com/web-animations/web-animations-js-legacy
-
-  The new codebase is focused on code-size -- our smallest target is
-  now only 33kb or 11kb after gzip.
-
-  We've implemented native fallback. If the target browser provides
-  Web Animations features natively, the Polyfill will use them.
-
-  We now provide three different build targets:
-
-  `web-animations.min.js` - Tracks the Web Animations features that
-  are supported natively in browsers. Today that means Element.animate
-  and Playback Control in Chrome. If you’re not sure what features you
-  will need, start with this.
-
-  `web-animations-next.min.js` - All of web-animations.min.js plus
-  features that are still undergoing discussion or have yet to be
-  implemented natively.
-
-  `web-animations-next-lite.min.js` - A cut down version of
-  web-animations-next, removes several lesser used property handlers
-  and some of the larger and less used features such as matrix
-  interpolation/decomposition.
-
-  Not all features of the previous polyfill have been ported to the
-  new codebase; most notably mutation of Animations and Groups and
-  Additive Animations are not yet supported. These features are still
-  important and will be implemented in the coming weeks.
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/README.md b/systrace/catapult/third_party/polymer/components/web-animations-js/README.md
deleted file mode 100644
index e3410b6..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/README.md
+++ /dev/null
@@ -1,80 +0,0 @@
-
-What is Web Animations?
------------------------
-
-A new JavaScript API for driving animated content on the web. By unifying
-the animation features of SVG and CSS, Web Animations unlocks features
-previously only usable declaratively, and exposes powerful, high-performance
-animation capabilities to developers.
-
-What is in this repository?
----------------------------
-
-A JavaScript implementation of the Web Animations API that provides Web
-Animation features in browsers that do not support it natively. The polyfill
-falls back to the native implementation when one is available.
-
-Quick start
------------
-
-Here's a simple example of an animation that fades and scales a `<div>`.  
-[Try it as a live demo.](http://jsbin.com/yageyezabo/edit?html,js,output)
-
-```html
-<!-- Include the polyfill -->
-<script src="web-animations.min.js"></script>
-
-<!-- Set up a target to animate -->
-<div class="pulse" style="width: 150px;">Hello world!</div>
-
-<!-- Animate! -->
-<script>
-    var elem = document.querySelector('.pulse');
-    var animation = elem.animate({
-        opacity: [0.5, 1],
-        transform: ['scale(0.5)', 'scale(1)'],
-    }, {
-        direction: 'alternate',
-        duration: 500,
-        iterations: Infinity,
-    });
-</script>
-```
-
-Documentation
--------------
-
-* [Codelab tutorial](https://github.com/web-animations/web-animations-codelabs)
-* [Examples of usage](/docs/examples.md)
-* [Live demos](https://web-animations.github.io/web-animations-demos)
-* [MDN reference](https://developer.mozilla.org/en-US/docs/Web/API/Element/animate)
-* [W3C specification](http://w3c.github.io/web-animations/)
-
-We love feedback!
------------------
-
-* For feedback on the API and the specification:
-    * File an issue on GitHub: <https://github.com/w3c/web-animations/issues/new>
-    * Alternatively, send an email to <public-fx@w3.org> with subject line
-"[web-animations] ... message topic ..."
-([archives](http://lists.w3.org/Archives/Public/public-fx/)).
-
-* For issues with the polyfill, report them on GitHub:
-<https://github.com/web-animations/web-animations-js/issues/new>.
-
-Keep up-to-date
----------------
-
-Breaking polyfill changes will be announced on this low-volume mailing list:
-[web-animations-changes@googlegroups.com](https://groups.google.com/forum/#!forum/web-animations-changes).
-
-More info
----------
-
-* [Technical details about the polyfill](/docs/support.md)
-    * [Browser support](/docs/support.md#browser-support)
-    * [Fallback to native](/docs/support.md#native-fallback)
-    * [Feature list](/docs/support.md#features)
-    * [Feature deprecation and removal processes](/docs/support.md#process-for-breaking-changes)
-* To test experimental API features, try one of the
-  [experimental targets](/docs/experimental.md)
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/bower.json b/systrace/catapult/third_party/polymer/components/web-animations-js/bower.json
deleted file mode 100644
index afa0f9e..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/bower.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "web-animations-js",
-  "description": "JavaScript implementation of the Web Animations API",
-  "homepage": "https://github.com/web-animations/web-animations-js",
-  "main": "web-animations.min.js",
-  "moduleType": [
-    "globals"
-  ],
-  "keywords": [
-    "animations",
-    "polyfill"
-  ],
-  "license": "Apache-2.0",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "templates",
-    "test",
-    "Gruntfile.js",
-    "package.json",
-    "target-config.js",
-    "target-loader.js",
-    "web-animations.dev.html",
-    "web-animations.dev.js",
-    "web-animations-next.dev.html",
-    "web-animations-next.dev.js",
-    "web-animations-next-lite.dev.html",
-    "web-animations-next-lite.dev.js"
-  ]
-}
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/docs/examples.md b/systrace/catapult/third_party/polymer/components/web-animations-js/docs/examples.md
deleted file mode 100644
index 7957a29..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/docs/examples.md
+++ /dev/null
@@ -1,241 +0,0 @@
-#Examples of using Web Animations
-
-Property indexed keyframes syntax
----------------------------------
-- Each CSS property specifies its keyframe values as a list, different properties may have differently sized lists.
-- The `easing` property applies its timing function to all keyframes.
-
-[**Live demo**](http://jsbin.com/qiyeriruru/edit?js,output)
-```javascript
-element.animate({
-  transform: [
-    'scaleY(0.5)',
-    'scaleX(0.5)',
-    'scaleY(0.5)',
-  ],
-  background: [
-    'red',
-    'blue',
-    'orange',
-    'red',
-  ],
-  easing: 'ease-in-out',
-}, {
-  duration: 2000,
-  iterations: Infinity,
-});
-```
-
-Keyframe list syntax
---------------------
-- Keyframes can be specified as a list of multiple CSS property values.
-- Individual keyframes can be given specific offsets and easings.
-- Not all properties need to be specified in every keyframe.
-- Offsets are implicitly distributed if not specified.
-
-[**Live demo**](http://jsbin.com/yajatoyere/edit?js,output)
-```javascript
-element.animate([
-  {
-    background: 'red',
-    transform: 'none',
-    easing: 'ease-out',
-  },
-  {
-    offset: 0.1,
-    transform: 'translateY(100px)',
-    easing: 'ease-in-out',
-  },
-  {
-    offset: 0.2,
-    transform: 'translate(100px, 100px)',
-    easing: 'ease-in-out',
-  },
-  {
-    offset: 0.4,
-    transform: 'translateX(100px)',
-    easing: 'ease-out',
-  },
-  {
-    background: 'blue',
-    transform: 'none',
-  },
-], {
-  duration: 4000,
-  iterations: Infinity,
-});
-```
-
-Timing parameters
------------------
-- Web Animations inherits many of its timing parameters from CSS Animations.
-- See the [specification](http://w3c.github.io/web-animations/#animationeffecttimingreadonly) for details on each parameter.
-
-[**Live demo**](http://jsbin.com/dabehipiyo/edit?js,output)
-```javascript
-element.animate({
-  transform: ['none', 'translateX(100px)'],
-  background: ['green', 'lime'],
-}, {
-  // Apply effect during delay.
-  fill: 'backwards',
-
-  // Delay starting by 500ms.
-  delay: 500,
-
-  // Iterations last for 2000ms.
-  duration: 2000,
-
-  // Start at 25% through an iteration.
-  iterationStart: 0.25,
-
-  // Run for 2 iterations.
-  iterations: 2,
-
-  // Play every second iteration backwards.
-  direction: 'alternate',
-
-  // Stop animating 500ms earlier.
-  endDelay: -500,
-
-  // The timing function to use with each iteration.
-  easing: 'ease-in-out',
-});
-```
-
-Playback controls
------------------
-- element.animate() returns an Animation object with basic playback controls.
-- See the [specification](http://w3c.github.io/web-animations/#the-animation-interface) for details on each method.
-
-[**Live demo**](http://jsbin.com/kutaqoxejo/edit?js,output)
-```javascript
-var animation = element.animate({
-  transform: ['none', 'translateX(200px)'],
-  background: ['red', 'orange'],
-}, {
-  duration: 4000,
-  fill: 'both',
-});
-animation.play();
-animation.reverse();
-animation.pause();
-animation.currentTime = 2000;
-animation.playbackRate += 0.25;
-animation.playbackRate -= 0.25;
-animation.finish();
-animation.cancel();
-```
-
-Transitioning states with element.animate()
--------------------------------------------
-- This is an example of how to animate from one state to another using Web Animations.
-
-[**Live demo**](http://jsbin.com/musufiwule/edit?js,output)
-```javascript
-var isOpen = false;
-var openHeight = '100px';
-var closedHeight = '0px';
-var duration = 300;
-
-button.addEventListener('click', function() {
-  // Prevent clicks while we transition states.
-  button.disabled = true;
-  button.textContent = '...';
-
-  // Determine where we're animation from/to.
-  var fromHeight = isOpen ? openHeight : closedHeight;
-  var toHeight = isOpen ? closedHeight : openHeight;
-
-  // Start an animation transitioning from our current state to the final state.
-  var animation = element.animate({ height: [fromHeight, toHeight] }, duration);
-
-  // Update the button once the animation finishes.
-  animation.onfinish = function() {
-    isOpen = !isOpen;
-    button.textContent = isOpen ? 'Close' : 'Open';
-    button.disabled = false;
-  };
-
-  // Put our element in the final state.
-  // Inline styles are overridden by active animations.
-  // When the above animation finishes it will stop applying and
-  // the element's style will fall back onto this inline style value.
-  element.style.setProperty('height', toHeight);
-});
-```
-
-Generating animations
----------------------
-- The Javascript API allows for procedurally generating a diverse range of interesting animations.
-
-[**Live demo**](http://jsbin.com/xolacasiyu/edit?js,output)
-```html
-<!DOCTYPE html>
-<script src="https://rawgit.com/web-animations/web-animations-js/master/web-animations.min.js"></script>
-
-<style>
-#perspective {
-  margin-left: 100px;
-  width: 300px;
-  height: 300px;
-  perspective: 600px;
-}
-
-#container {
-  width: 300px;
-  height: 300px;
-  line-height: 0;
-  transform-style: preserve-3d;
-}
-
-.box {
-  display: inline-block;
-  width: 20px;
-  height: 20px;
-  background: black;
-}
-</style>
-
-<div id="perspective">
-  <div id="container"></div>
-</div>
-
-<script>
-container.animate({
-  transform: [
-    'rotateX(70deg) rotateZ(0deg)',
-    'rotateX(70deg) rotateZ(360deg)',
-  ],
-}, {
-  duration: 20000,
-  iterations: Infinity,
-});
-
-for (var y = -7; y <= 7; y++) {
-  for (var x = -7; x <= 7; x++) {
-    var box = createBox();
-    box.animate({
-      transform: [
-        'translateZ(0px)',
-        'translateZ(20px)',
-      ],
-      opacity: [1, 0],
-    }, {
-      delay: (x*x + y*y) * 20,
-      duration: 2000,
-      iterations: Infinity,
-      direction: 'alternate',
-      easing: 'ease-in',
-    });
-  }
-}
-
-function createBox() {
-  var box = document.createElement('div');
-  box.className = 'box';
-  container.appendChild(box);
-  return box;
-}
-</script>
-```
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/docs/experimental.md b/systrace/catapult/third_party/polymer/components/web-animations-js/docs/experimental.md
deleted file mode 100644
index e3f2289..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/docs/experimental.md
+++ /dev/null
@@ -1,58 +0,0 @@
-
-Experimental build targets
---------------------------
-
-Most people should use the basic polyfill in `web-animations.min.js`. This
-tracks the Web Animations features that are supported natively in browsers.
-However, we also provide two additional build targets that contain experimental
-features.
-
-### web-animations-next.min.js
-
-Contains all of web-animations.min.js plus features that are still undergoing
-discussion or have yet to be implemented natively.
-
-### web-animations-next-lite.min.js
-
-A cut down version of web-animations-next, it removes several lesser used
-property handlers and some of the larger and less used features such as matrix
-interpolation/decomposition.
-
-Build target comparison
------------------------
-
-|                        | web-animations | web-animations-next | web-animations-next-lite |
-|------------------------|:--------------:|:-------------------:|:------------------------:|
-|Size (gzipped)          | 15KB           | 19KB                | 15KB                     |
-|Element.animate         | ✔             | ✔                  | ✔                       |
-|Timing input (easings, duration, fillMode, etc.) for animation effects| ✔ | ✔ | ✔             | 
-|Playback control        | ✔             | ✔                  | ✔                       |
-|Support for animating lengths, transforms and opacity| ✔ | ✔ | ✔                       |
-|Support for animating other CSS properties| ✔ | ✔            | 🚫                       |
-|Matrix fallback for transform animations | ✔ | ✔             | 🚫                       |
-|KeyframeEffect constructor   | 🚫             | ✔                  | ✔                       |
-|Simple GroupEffects & SequenceEffects           | 🚫             | ✔                  | ✔                       |
-|Custom Effects          | 🚫             | ✔                  | ✔                       |
-|Timing input (easings, duration, fillMode, etc.) for groups</div>| 🚫 | 🚫\* | 🚫         |
-|Additive animation      | 🚫\*           | 🚫\*                | 🚫                       |
-|Motion path             | 🚫\*           | 🚫\*                | 🚫                       |
-|Modifiable keyframe effect timing| 🚫          | 🚫\*                | 🚫\*                     |
-|Modifiable group timing | 🚫             | 🚫\*                | 🚫\*                     |
-|Usable inline style\*\* | ✔             | ✔                  | 🚫                       |
-
-\* support is planned for these features.
-\*\* see inline style caveat below.
-
-Caveat: Inline style
---------------------
-
-Inline style modification is the mechanism used by the polyfill to animate
-properties. Both web-animations and web-animations-next incorporate a module
-that emulates a vanilla inline style object, so that style modification from
-JavaScript can still work in the presence of animations. However, to keep the
-size of web-animations-next-lite as small as possible, the style emulation
-module is not included. When using this version of the polyfill, JavaScript
-inline style modification will be overwritten by animations.
-Due to browser constraints inline style modification is not supported on iOS 7
-or Safari 6 (or earlier versions).
-
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/docs/support.md b/systrace/catapult/third_party/polymer/components/web-animations-js/docs/support.md
deleted file mode 100644
index ae07af7..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/docs/support.md
+++ /dev/null
@@ -1,69 +0,0 @@
-
-Getting the polyfill
---------------------
-
-There are three ways to get a copy of the polyfill:
-
-1. Download and use the `web-animations.min.js` file directly from this repository
-1. Using npm: Add [`web-animations-js`](https://www.npmjs.com/package/web-animations-js) to your `package.json`
-1. Using Bower: Add `web-animations/web-animations-js` to your `bower.json`
-
-Browser support
----------------
-
-The polyfill is supported on modern versions of all major browsers, including:
-
-* Chrome 55+
-* Firefox 27+
-* IE10+ (including Edge)
-* Safari (iOS) 7.1+
-* Safari (Mac) 9+
-
-Native fallback
----------------
-
-When the polyfill runs on a browser that implements `Element.animate()` and
-`Animation` playback control, it will detect and use the underlying native
-features for better performance.
-
-Features
---------
-
-The `web-animations.min.js` polyfill target tracks the Web Animations features
-that are supported natively in browsers. These include:
-
-* Element.animate()
-* Timing input (easings, duration, fillMode, etc.) for animation effects
-* Playback control (play, pause, reverse, currentTime, cancel, onfinish)
-* Support for animating CSS properties
-
-Caveat: Prefix handling
------------------------
-
-The polyfill will automatically detect the correctly prefixed name to use when
-writing animated properties back to the platform. Where possible, the polyfill
-will only accept unprefixed versions of experimental features. For example:
-
-```js
-element.animate({transform: ['none', 'translateX(100px)']}, 1000);
-```
-
-will work in all browsers that implement a conforming version of transform, but
-
-```js
-element.animate({webkitTransform: ['none', 'translateX(100px)']}, 1000);
-```
-
-will not work anywhere.
-
-Process for breaking changes
-----------------------------
-
-When we make a potentially breaking change to the polyfill's API
-surface (like a rename) we will, where possible, continue supporting the
-old version, deprecated, for three months, and ensure that there are
-console warnings to indicate that a change is pending. After three
-months, the old version of the API surface (e.g. the old version of a
-function name) will be removed. *If you see deprecation warnings, you
-can't avoid them by not updating*.
-
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/externs/README.md b/systrace/catapult/third_party/polymer/components/web-animations-js/externs/README.md
deleted file mode 100644
index 3f16bf6..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/externs/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-
-Closure Compiler Externs for Web Animations
--------------------------------------------
-
-This folder contains externs for using the Web Animations API with the Closure
-Compiler. These externs aren't strictly part of the polyfill, as they can be
-used for either the native or polyfilled versions.
-
-web-animations-next requires that you also include web-animations.
-
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/externs/web-animations-next.js b/systrace/catapult/third_party/polymer/components/web-animations-js/externs/web-animations-next.js
deleted file mode 100644
index 743a3ba..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/externs/web-animations-next.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-
-/**
- * @fileoverview Basic externs for the Web Animations API (Level 2 / Groups).
- * This is not intended to be exhaustive, and requires the base externs from
- * web-animations.js.
- * @externs
- */
-
-
-/**
- * @interface
- */
-var AnimationEffectReadOnly = function() {};
-
-/** @type {!AnimationEffectTiming} */
-AnimationEffectReadOnly.prototype.timing;
-
-
-/**
- * @param {Element} target
- * @param {!Array<!Object>} frames
- * @param {(number|AnimationEffectTimingProperties)=} opt_options
- * @constructor
- * @implements {AnimationEffectReadOnly}
- */
-var KeyframeEffect = function(target, frames, opt_options) {};
-
-/**
- * @return {!Array<!Object>}
- */
-KeyframeEffect.prototype.getFrames = function() {};
-
-/** @type {!AnimationEffectTiming} */
-KeyframeEffect.prototype.timing;
-
-/** @type {Element} */
-KeyframeEffect.prototype.target;
-
-/** @type {?function(number, !KeyframeEffect, !Animation)} */
-KeyframeEffect.prototype.onsample;
-
-
-/**
- * @param {!Array<!AnimationEffectReadOnly>} children
- * @param {AnimationEffectTimingProperties=} opt_timing
- * @constructor
- * @implements {AnimationEffectReadOnly}
- */
-var SequenceEffect = function(children, opt_timing) {};
-
-/** @type {!AnimationEffectTiming} */
-SequenceEffect.prototype.timing;
-
-/** @type {!Array<!AnimationEffectReadOnly>} */
-SequenceEffect.prototype.children;
-
-
-/**
- * @param {!Array<!AnimationEffectReadOnly>} children
- * @param {AnimationEffectTimingProperties=} opt_timing
- * @constructor
- * @implements {AnimationEffectReadOnly}
- */
-var GroupEffect = function(children, opt_timing) {};
-
-/** @type {!AnimationEffectTiming} */
-GroupEffect.prototype.timing;
-
-/** @type {!Array<!AnimationEffectReadOnly>} */
-GroupEffect.prototype.children;
-
-
-/**
- * @interface
- */
-var AnimationTimeline = function() {};
-
-/** @type {?number} */
-AnimationTimeline.prototype.currentTime;
-
-/**
- * @param {!AnimationEffectReadOnly} effect
- * @return {!Animation}
- */
-AnimationTimeline.prototype.play = function(effect) {};
-
-/**
- * @interface
- * @extends {AnimationTimeline}
- */
-var DocumentTimeline = function() {};
-
-/** @type {AnimationEffectReadOnly|undefined} */
-Animation.prototype.effect;
-
-/** @type {!DocumentTimeline} */
-Document.prototype.timeline;
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/externs/web-animations.js b/systrace/catapult/third_party/polymer/components/web-animations-js/externs/web-animations.js
deleted file mode 100644
index 7059b40..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/externs/web-animations.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-
-/**
- * @fileoverview Basic externs for the Web Animations API. This is not
- * nessecarily exhaustive. For more information, see the spec-
- *   https://w3c.github.io/web-animations
- * @externs
- */
-
-
-/**
- * @param {!Array<!Object>} frames
- * @param {(number|AnimationEffectTimingProperties)=} opt_options
- * @return {!Animation}
- */
-Element.prototype.animate = function(frames, opt_options) {};
-
-
-/**
- * @interface
- * @extends {EventTarget}
- */
-var Animation = function() {};
-
-/**
- * @return {undefined}
- */
-Animation.prototype.cancel = function() {};
-
-/**
- * @return {undefined}
- */
-Animation.prototype.finish = function() {};
-
-/**
- * @return {undefined}
- */
-Animation.prototype.reverse = function() {};
-
-/**
- * @return {undefined}
- */
-Animation.prototype.pause = function() {};
-
-/**
- * @return {undefined}
- */
-Animation.prototype.play = function() {};
-
-/** @type {number} */
-Animation.prototype.startTime;
-
-/** @type {number} */
-Animation.prototype.currentTime;
-
-/** @type {number} */
-Animation.prototype.playbackRate;
-
-/** @type {string} */
-Animation.prototype.playState;
-
-/** @type {?function(!Event)} */
-Animation.prototype.oncancel;
-
-/** @type {?function(!Event)} */
-Animation.prototype.onfinish;
-
-
-/**
- * @typedef {{
- *   delay: (number|undefined),
- *   endDelay: (number|undefined),
- *   fillMode: (string|undefined),
- *   iterationStart: (number|undefined),
- *   iterations: (number|undefined),
- *   duration: (number|string|undefined),
- *   direction: (string|undefined),
- *   easing: (string|undefined)
- * }}
- */
-var AnimationEffectTimingProperties;
-
-
-/**
- * @interface
- */
-var AnimationEffectTiming = function() {};
-
-/** @type {number} */
-AnimationEffectTiming.prototype.delay;
-
-/** @type {number} */
-AnimationEffectTiming.prototype.endDelay;
-
-/** @type {string} */
-AnimationEffectTiming.prototype.fillMode;
-
-/** @type {number} */
-AnimationEffectTiming.prototype.iterationStart;
-
-/** @type {number} */
-AnimationEffectTiming.prototype.iterations;
-
-/** @type {number|string} */
-AnimationEffectTiming.prototype.duration;
-
-/** @type {string} */
-AnimationEffectTiming.prototype.direction;
-
-/** @type {string} */
-AnimationEffectTiming.prototype.easing;
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/animation.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/animation.js
deleted file mode 100644
index e9f6482..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/animation.js
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-
-  shared.sequenceNumber = 0;
-
-  var AnimationEvent = function(target, currentTime, timelineTime) {
-    this.target = target;
-    this.currentTime = currentTime;
-    this.timelineTime = timelineTime;
-
-    this.type = 'finish';
-    this.bubbles = false;
-    this.cancelable = false;
-    this.currentTarget = target;
-    this.defaultPrevented = false;
-    this.eventPhase = Event.AT_TARGET;
-    this.timeStamp = Date.now();
-  };
-
-  scope.Animation = function(effect) {
-    this.id = '';
-    if (effect && effect._id) {
-      this.id = effect._id;
-    }
-    this._sequenceNumber = shared.sequenceNumber++;
-    this._currentTime = 0;
-    this._startTime = null;
-    this._paused = false;
-    this._playbackRate = 1;
-    this._inTimeline = true;
-    this._finishedFlag = true;
-    this.onfinish = null;
-    this._finishHandlers = [];
-    this._effect = effect;
-    this._inEffect = this._effect._update(0);
-    this._idle = true;
-    this._currentTimePending = false;
-  };
-
-  scope.Animation.prototype = {
-    _ensureAlive: function() {
-      // If an animation is playing backwards and is not fill backwards/both
-      // then it should go out of effect when it reaches the start of its
-      // active interval (currentTime == 0).
-      if (this.playbackRate < 0 && this.currentTime === 0) {
-        this._inEffect = this._effect._update(-1);
-      } else {
-        this._inEffect = this._effect._update(this.currentTime);
-      }
-      if (!this._inTimeline && (this._inEffect || !this._finishedFlag)) {
-        this._inTimeline = true;
-        scope.timeline._animations.push(this);
-      }
-    },
-    _tickCurrentTime: function(newTime, ignoreLimit) {
-      if (newTime != this._currentTime) {
-        this._currentTime = newTime;
-        if (this._isFinished && !ignoreLimit)
-          this._currentTime = this._playbackRate > 0 ? this._totalDuration : 0;
-        this._ensureAlive();
-      }
-    },
-    get currentTime() {
-      if (this._idle || this._currentTimePending)
-        return null;
-      return this._currentTime;
-    },
-    set currentTime(newTime) {
-      newTime = +newTime;
-      if (isNaN(newTime))
-        return;
-      scope.restart();
-      if (!this._paused && this._startTime != null) {
-        this._startTime = this._timeline.currentTime - newTime / this._playbackRate;
-      }
-      this._currentTimePending = false;
-      if (this._currentTime == newTime)
-        return;
-      if (this._idle) {
-        this._idle = false;
-        this._paused = true;
-      }
-      this._tickCurrentTime(newTime, true);
-      scope.applyDirtiedAnimation(this);
-    },
-    get startTime() {
-      return this._startTime;
-    },
-    set startTime(newTime) {
-      newTime = +newTime;
-      if (isNaN(newTime))
-        return;
-      if (this._paused || this._idle)
-        return;
-      this._startTime = newTime;
-      this._tickCurrentTime((this._timeline.currentTime - this._startTime) * this.playbackRate);
-      scope.applyDirtiedAnimation(this);
-    },
-    get playbackRate() {
-      return this._playbackRate;
-    },
-    set playbackRate(value) {
-      if (value == this._playbackRate) {
-        return;
-      }
-      var oldCurrentTime = this.currentTime;
-      this._playbackRate = value;
-      this._startTime = null;
-      if (this.playState != 'paused' && this.playState != 'idle') {
-        this._finishedFlag = false;
-        this._idle = false;
-        this._ensureAlive();
-        scope.applyDirtiedAnimation(this);
-      }
-      if (oldCurrentTime != null) {
-        this.currentTime = oldCurrentTime;
-      }
-    },
-    get _isFinished() {
-      return !this._idle && (this._playbackRate > 0 && this._currentTime >= this._totalDuration ||
-          this._playbackRate < 0 && this._currentTime <= 0);
-    },
-    get _totalDuration() { return this._effect._totalDuration; },
-    get playState() {
-      if (this._idle)
-        return 'idle';
-      if ((this._startTime == null && !this._paused && this.playbackRate != 0) || this._currentTimePending)
-        return 'pending';
-      if (this._paused)
-        return 'paused';
-      if (this._isFinished)
-        return 'finished';
-      return 'running';
-    },
-    _rewind: function() {
-      if (this._playbackRate >= 0) {
-        this._currentTime = 0;
-      } else if (this._totalDuration < Infinity) {
-        this._currentTime = this._totalDuration;
-      } else {
-        throw new DOMException(
-            'Unable to rewind negative playback rate animation with infinite duration',
-            'InvalidStateError');
-      }
-    },
-    play: function() {
-      this._paused = false;
-      if (this._isFinished || this._idle) {
-        this._rewind();
-        this._startTime = null;
-      }
-      this._finishedFlag = false;
-      this._idle = false;
-      this._ensureAlive();
-      scope.applyDirtiedAnimation(this);
-    },
-    pause: function() {
-      if (!this._isFinished && !this._paused && !this._idle) {
-        this._currentTimePending = true;
-      } else if (this._idle) {
-        this._rewind();
-        this._idle = false;
-      }
-      this._startTime = null;
-      this._paused = true;
-    },
-    finish: function() {
-      if (this._idle)
-        return;
-      this.currentTime = this._playbackRate > 0 ? this._totalDuration : 0;
-      this._startTime = this._totalDuration - this.currentTime;
-      this._currentTimePending = false;
-      scope.applyDirtiedAnimation(this);
-    },
-    cancel: function() {
-      if (!this._inEffect)
-        return;
-      this._inEffect = false;
-      this._idle = true;
-      this._paused = false;
-      this._isFinished = true;
-      this._finishedFlag = true;
-      this._currentTime = 0;
-      this._startTime = null;
-      this._effect._update(null);
-      // effects are invalid after cancellation as the animation state
-      // needs to un-apply.
-      scope.applyDirtiedAnimation(this);
-    },
-    reverse: function() {
-      this.playbackRate *= -1;
-      this.play();
-    },
-    addEventListener: function(type, handler) {
-      if (typeof handler == 'function' && type == 'finish')
-        this._finishHandlers.push(handler);
-    },
-    removeEventListener: function(type, handler) {
-      if (type != 'finish')
-        return;
-      var index = this._finishHandlers.indexOf(handler);
-      if (index >= 0)
-        this._finishHandlers.splice(index, 1);
-    },
-    _fireEvents: function(baseTime) {
-      if (this._isFinished) {
-        if (!this._finishedFlag) {
-          var event = new AnimationEvent(this, this._currentTime, baseTime);
-          var handlers = this._finishHandlers.concat(this.onfinish ? [this.onfinish] : []);
-          setTimeout(function() {
-            handlers.forEach(function(handler) {
-              handler.call(event.target, event);
-            });
-          }, 0);
-          this._finishedFlag = true;
-        }
-      } else {
-        this._finishedFlag = false;
-      }
-    },
-    _tick: function(timelineTime, isAnimationFrame) {
-      if (!this._idle && !this._paused) {
-        if (this._startTime == null) {
-          if (isAnimationFrame) {
-            this.startTime = timelineTime - this._currentTime / this.playbackRate;
-          }
-        } else if (!this._isFinished) {
-          this._tickCurrentTime((timelineTime - this._startTime) * this.playbackRate);
-        }
-      }
-
-      if (isAnimationFrame) {
-        this._currentTimePending = false;
-        this._fireEvents(timelineTime);
-      }
-    },
-    get _needsTick() {
-      return (this.playState in {'pending': 1, 'running': 1}) || !this._finishedFlag;
-    },
-    _targetAnimations: function() {
-      var target = this._effect._target;
-      if (!target._activeAnimations) {
-        target._activeAnimations = [];
-      }
-      return target._activeAnimations;
-    },
-    _markTarget: function() {
-      var animations = this._targetAnimations();
-      if (animations.indexOf(this) === -1) {
-        animations.push(this);
-      }
-    },
-    _unmarkTarget: function() {
-      var animations = this._targetAnimations();
-      var index = animations.indexOf(this);
-      if (index !== -1) {
-        animations.splice(index, 1);
-      }
-    },
-  };
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.webAnimations1Animation = scope.Animation;
-  }
-
-})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/apply-preserving-inline-style.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/apply-preserving-inline-style.js
deleted file mode 100644
index 4002a2f..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/apply-preserving-inline-style.js
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  var SVG_TRANSFORM_PROP = '_webAnimationsUpdateSvgTransformAttr';
-
-  /**
-   * IE/Edge do not support `transform` styles for SVG elements. Instead,
-   * `transform` attribute can be animated with some restrictions.
-   * See https://connect.microsoft.com/IE/feedback/details/811744/ie11-bug-with-implementation-of-css-transforms-in-svg,
-   * https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/1173754/,
-   * https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/101242/, etc.
-   * The same problem is exhibited by pre-Chrome Android browsers (ICS).
-   * Unfortunately, there's no easy way to feature-detect it.
-   */
-  function updateSvgTransformAttr(window, element) {
-    if (!element.namespaceURI || element.namespaceURI.indexOf('/svg') == -1) {
-      return false;
-    }
-    if (!(SVG_TRANSFORM_PROP in window)) {
-      window[SVG_TRANSFORM_PROP] =
-          /Trident|MSIE|IEMobile|Edge|Android 4/i.test(window.navigator.userAgent);
-    }
-    return window[SVG_TRANSFORM_PROP];
-  }
-
-  var styleAttributes = {
-    cssText: 1,
-    length: 1,
-    parentRule: 1,
-  };
-
-  var styleMethods = {
-    getPropertyCSSValue: 1,
-    getPropertyPriority: 1,
-    getPropertyValue: 1,
-    item: 1,
-    removeProperty: 1,
-    setProperty: 1,
-  };
-
-  var styleMutatingMethods = {
-    removeProperty: 1,
-    setProperty: 1,
-  };
-
-  function configureProperty(object, property, descriptor) {
-    descriptor.enumerable = true;
-    descriptor.configurable = true;
-    Object.defineProperty(object, property, descriptor);
-  }
-
-  function AnimatedCSSStyleDeclaration(element) {
-    WEB_ANIMATIONS_TESTING && console.assert(!(element.style instanceof AnimatedCSSStyleDeclaration),
-        'Element must not already have an animated style attached.');
-
-    this._element = element;
-    // Stores the inline style of the element on its behalf while the
-    // polyfill uses the element's inline style to simulate web animations.
-    // This is needed to fake regular inline style CSSOM access on the element.
-    this._surrogateStyle = document.createElementNS('http://www.w3.org/1999/xhtml', 'div').style;
-    this._style = element.style;
-    this._length = 0;
-    this._isAnimatedProperty = {};
-    this._updateSvgTransformAttr = updateSvgTransformAttr(window, element);
-    this._savedTransformAttr = null;
-
-    // Copy the inline style contents over to the surrogate.
-    for (var i = 0; i < this._style.length; i++) {
-      var property = this._style[i];
-      this._surrogateStyle[property] = this._style[property];
-    }
-    this._updateIndices();
-  }
-
-  AnimatedCSSStyleDeclaration.prototype = {
-    get cssText() {
-      return this._surrogateStyle.cssText;
-    },
-    set cssText(text) {
-      var isAffectedProperty = {};
-      for (var i = 0; i < this._surrogateStyle.length; i++) {
-        isAffectedProperty[this._surrogateStyle[i]] = true;
-      }
-      this._surrogateStyle.cssText = text;
-      this._updateIndices();
-      for (var i = 0; i < this._surrogateStyle.length; i++) {
-        isAffectedProperty[this._surrogateStyle[i]] = true;
-      }
-      for (var property in isAffectedProperty) {
-        if (!this._isAnimatedProperty[property]) {
-          this._style.setProperty(property, this._surrogateStyle.getPropertyValue(property));
-        }
-      }
-    },
-    get length() {
-      return this._surrogateStyle.length;
-    },
-    get parentRule() {
-      return this._style.parentRule;
-    },
-    // Mirror the indexed getters and setters of the surrogate style.
-    _updateIndices: function() {
-      while (this._length < this._surrogateStyle.length) {
-        Object.defineProperty(this, this._length, {
-          configurable: true,
-          enumerable: false,
-          get: (function(index) {
-            return function() { return this._surrogateStyle[index]; };
-          })(this._length)
-        });
-        this._length++;
-      }
-      while (this._length > this._surrogateStyle.length) {
-        this._length--;
-        Object.defineProperty(this, this._length, {
-          configurable: true,
-          enumerable: false,
-          value: undefined
-        });
-      }
-    },
-    _set: function(property, value) {
-      this._style[property] = value;
-      this._isAnimatedProperty[property] = true;
-      if (this._updateSvgTransformAttr &&
-          scope.unprefixedPropertyName(property) == 'transform') {
-        // On IE/Edge, also set SVG element's `transform` attribute to 2d
-        // matrix of the transform. The `transform` style does not work, but
-        // `transform` attribute can be used instead.
-        // Notice, if the platform indeed supports SVG/CSS transforms the CSS
-        // declaration is supposed to override the attribute.
-        if (this._savedTransformAttr == null) {
-          this._savedTransformAttr = this._element.getAttribute('transform');
-        }
-        this._element.setAttribute('transform', scope.transformToSvgMatrix(value));
-      }
-    },
-    _clear: function(property) {
-      this._style[property] = this._surrogateStyle[property];
-      if (this._updateSvgTransformAttr &&
-          scope.unprefixedPropertyName(property) == 'transform') {
-        if (this._savedTransformAttr) {
-          this._element.setAttribute('transform', this._savedTransformAttr);
-        } else {
-          this._element.removeAttribute('transform');
-        }
-        this._savedTransformAttr = null;
-      }
-      delete this._isAnimatedProperty[property];
-    },
-  };
-
-  // Wrap the style methods.
-  for (var method in styleMethods) {
-    AnimatedCSSStyleDeclaration.prototype[method] = (function(method, modifiesStyle) {
-      return function() {
-        var result = this._surrogateStyle[method].apply(this._surrogateStyle, arguments);
-        if (modifiesStyle) {
-          if (!this._isAnimatedProperty[arguments[0]])
-            this._style[method].apply(this._style, arguments);
-          this._updateIndices();
-        }
-        return result;
-      }
-    })(method, method in styleMutatingMethods);
-  }
-
-  // Wrap the style.cssProperty getters and setters.
-  for (var property in document.documentElement.style) {
-    if (property in styleAttributes || property in styleMethods) {
-      continue;
-    }
-    (function(property) {
-      configureProperty(AnimatedCSSStyleDeclaration.prototype, property, {
-        get: function() {
-          return this._surrogateStyle[property];
-        },
-        set: function(value) {
-          this._surrogateStyle[property] = value;
-          this._updateIndices();
-          if (!this._isAnimatedProperty[property])
-            this._style[property] = value;
-        }
-      });
-    })(property);
-  }
-
-  function ensureStyleIsPatched(element) {
-    if (element._webAnimationsPatchedStyle)
-      return;
-
-    var animatedStyle = new AnimatedCSSStyleDeclaration(element);
-    try {
-      configureProperty(element, 'style', { get: function() { return animatedStyle; } });
-    } catch (_) {
-      // iOS and older versions of Safari (pre v7) do not support overriding an element's
-      // style object. Animations will clobber any inline styles as a result.
-      element.style._set = function(property, value) {
-        element.style[property] = value;
-      };
-      element.style._clear = function(property) {
-        element.style[property] = '';
-      };
-    }
-
-    // We must keep a handle on the patched style to prevent it from getting GC'd.
-    element._webAnimationsPatchedStyle = element.style;
-  }
-
-  scope.apply = function(element, property, value) {
-    ensureStyleIsPatched(element);
-    element.style._set(scope.propertyName(property), value);
-  };
-
-  scope.clear = function(element, property) {
-    if (element._webAnimationsPatchedStyle) {
-      element.style._clear(scope.propertyName(property));
-    }
-  };
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.ensureStyleIsPatched = ensureStyleIsPatched;
-    testing.updateSvgTransformAttr = updateSvgTransformAttr;
-  }
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/apply.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/apply.js
deleted file mode 100644
index 3200f96..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/apply.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  scope.apply = function(element, property, value) {
-    element.style[scope.propertyName(property)] = value;
-  };
-
-  scope.clear = function(element, property) {
-    element.style[scope.propertyName(property)] = '';
-  };
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/box-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/box-handler.js
deleted file mode 100644
index 3399263..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/box-handler.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-  function consumeLengthPercentOrAuto(string) {
-    return scope.consumeLengthOrPercent(string) || scope.consumeToken(/^auto/, string);
-  }
-  function parseBox(string) {
-    var result = scope.consumeList([
-      scope.ignore(scope.consumeToken.bind(null, /^rect/)),
-      scope.ignore(scope.consumeToken.bind(null, /^\(/)),
-      scope.consumeRepeated.bind(null, consumeLengthPercentOrAuto, /^,/),
-      scope.ignore(scope.consumeToken.bind(null, /^\)/)),
-    ], string);
-    if (result && result[0].length == 4) {
-      return result[0];
-    }
-  }
-
-  function mergeComponent(left, right) {
-    if (left == 'auto' || right == 'auto') {
-      return [true, false, function(t) {
-        var result = t ? left : right;
-        if (result == 'auto') {
-          return 'auto';
-        }
-        // FIXME: There's probably a better way to turn a dimension back into a string.
-        var merged = scope.mergeDimensions(result, result);
-        return merged[2](merged[0]);
-      }];
-    }
-    return scope.mergeDimensions(left, right);
-  }
-
-  function wrap(result) {
-    return 'rect(' + result + ')';
-  }
-
-  var mergeBoxes = scope.mergeWrappedNestedRepeated.bind(null, wrap, mergeComponent, ', ');
-
-  scope.parseBox = parseBox;
-  scope.mergeBoxes = mergeBoxes;
-
-  scope.addPropertiesHandler(parseBox, mergeBoxes, ['clip']);
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/color-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/color-handler.js
deleted file mode 100644
index 3a05bff..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/color-handler.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
-  canvas.width = canvas.height = 1;
-  var context = canvas.getContext('2d');
-
-  function parseColor(string) {
-    string = string.trim();
-    // The context ignores invalid colors
-    context.fillStyle = '#000';
-    context.fillStyle = string;
-    var contextSerializedFillStyle = context.fillStyle;
-    context.fillStyle = '#fff';
-    context.fillStyle = string;
-    if (contextSerializedFillStyle != context.fillStyle)
-      return;
-    context.fillRect(0, 0, 1, 1);
-    var pixelColor = context.getImageData(0, 0, 1, 1).data;
-    context.clearRect(0, 0, 1, 1);
-    var alpha = pixelColor[3] / 255;
-    return [pixelColor[0] * alpha, pixelColor[1] * alpha, pixelColor[2] * alpha, alpha];
-  }
-
-  function mergeColors(left, right) {
-    return [left, right, function(x) {
-      function clamp(v) {
-        return Math.max(0, Math.min(255, v));
-      }
-      if (x[3]) {
-        for (var i = 0; i < 3; i++)
-          x[i] = Math.round(clamp(x[i] / x[3]));
-      }
-      x[3] = scope.numberToString(scope.clamp(0, 1, x[3]));
-      return 'rgba(' + x.join(',') + ')';
-    }];
-  }
-
-  scope.addPropertiesHandler(parseColor, mergeColors,
-      ['background-color', 'border-bottom-color', 'border-left-color', 'border-right-color',
-       'border-top-color', 'color', 'fill', 'flood-color', 'lighting-color',
-       'outline-color', 'stop-color', 'stroke', 'text-decoration-color']);
-  scope.consumeColor = scope.consumeParenthesised.bind(null, parseColor);
-  scope.mergeColors = mergeColors;
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.parseColor = parseColor;
-  }
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/deprecation.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/deprecation.js
deleted file mode 100644
index 6bdb4a2..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/deprecation.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared) {
-
-  var silenced = {};
-
-  shared.isDeprecated = function(feature, date, advice, plural) {
-    if (WEB_ANIMATIONS_TESTING) {
-      return true;
-    }
-
-    var auxVerb = plural ? 'are' : 'is';
-    var today = new Date();
-    var expiry = new Date(date);
-    expiry.setMonth(expiry.getMonth() + 3); // 3 months grace period
-
-    if (today < expiry) {
-      if (!(feature in silenced)) {
-        console.warn('Web Animations: ' + feature + ' ' + auxVerb + ' deprecated and will stop working on ' + expiry.toDateString() + '. ' + advice);
-      }
-      silenced[feature] = true;
-      return false;
-    } else {
-      return true;
-    }
-  };
-
-  shared.deprecated = function(feature, date, advice, plural) {
-    var auxVerb = plural ? 'are' : 'is';
-    if (shared.isDeprecated(feature, date, advice, plural)) {
-      throw new Error(feature + ' ' + auxVerb + ' no longer supported. ' + advice);
-    }
-  };
-
-})(webAnimationsShared);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/dev.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/dev.js
deleted file mode 100644
index a5e225c..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/dev.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-var WEB_ANIMATIONS_TESTING = false;
-var webAnimationsTesting = null;
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/dimension-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/dimension-handler.js
deleted file mode 100644
index 9e487f9..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/dimension-handler.js
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  // Evaluates a calc expression.
-  // https://drafts.csswg.org/css-values-3/#calc-notation
-  function calculate(expression) {
-    // In calc expressions, white space is required on both sides of the
-    // + and - operators. https://drafts.csswg.org/css-values-3/#calc-notation
-    // Thus any + or - immediately adjacent to . or 0..9 is part of the number,
-    // e.g. -1.23e+45
-    // This regular expression matches ( ) * / + - and numbers.
-    var tokenRegularExpression = /([\+\-\w\.]+|[\(\)\*\/])/g;
-    var currentToken;
-    function consume() {
-      var matchResult = tokenRegularExpression.exec(expression);
-      if (matchResult)
-        currentToken = matchResult[0];
-      else
-        currentToken = undefined;
-    }
-    consume(); // Read the initial token.
-
-    function calcNumber() {
-      // https://drafts.csswg.org/css-values-3/#number-value
-      var result = Number(currentToken);
-      consume();
-      return result;
-    }
-
-    function calcValue() {
-      // <calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )
-      if (currentToken !== '(')
-        return calcNumber();
-      consume();
-      var result = calcSum();
-      if (currentToken !== ')')
-        return NaN;
-      consume();
-      return result;
-    }
-
-    function calcProduct() {
-      // <calc-product> = <calc-value> [ '*' <calc-value> | '/' <calc-number-value> ]*
-      var left = calcValue();
-      while (currentToken === '*' || currentToken === '/') {
-        var operator = currentToken;
-        consume();
-        var right = calcValue();
-        if (operator === '*')
-          left *= right;
-        else
-          left /= right;
-      }
-      return left;
-    }
-
-    function calcSum() {
-      // <calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]*
-      var left = calcProduct();
-      while (currentToken === '+' || currentToken === '-') {
-        var operator = currentToken;
-        consume();
-        var right = calcProduct();
-        if (operator === '+')
-          left += right;
-        else
-          left -= right;
-      }
-      return left;
-    }
-
-    // <calc()> = calc( <calc-sum> )
-    return calcSum();
-  }
-
-  function parseDimension(unitRegExp, string) {
-    string = string.trim().toLowerCase();
-
-    if (string == '0' && 'px'.search(unitRegExp) >= 0)
-      return {px: 0};
-
-    // If we have parenthesis, we're a calc and need to start with 'calc'.
-    if (!/^[^(]*$|^calc/.test(string))
-      return;
-    string = string.replace(/calc\(/g, '(');
-
-    // We tag units by prefixing them with 'U' (note that we are already
-    // lowercase) to prevent problems with types which are substrings of
-    // each other (although prefixes may be problematic!)
-    var matchedUnits = {};
-    string = string.replace(unitRegExp, function(match) {
-      matchedUnits[match] = null;
-      return 'U' + match;
-    });
-    var taggedUnitRegExp = 'U(' + unitRegExp.source + ')';
-
-    // Validating input is simply applying as many reductions as we can.
-    var typeCheck = string.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g, 'N')
-        .replace(new RegExp('N' + taggedUnitRegExp, 'g'), 'D')
-        .replace(/\s[+-]\s/g, 'O')
-        .replace(/\s/g, '');
-    var reductions = [/N\*(D)/g, /(N|D)[*/]N/g, /(N|D)O\1/g, /\((N|D)\)/g];
-    var i = 0;
-    while (i < reductions.length) {
-      if (reductions[i].test(typeCheck)) {
-        typeCheck = typeCheck.replace(reductions[i], '$1');
-        i = 0;
-      } else {
-        i++;
-      }
-    }
-    if (typeCheck != 'D')
-      return;
-
-    for (var unit in matchedUnits) {
-      var result = calculate(string.replace(new RegExp('U' + unit, 'g'), '').replace(new RegExp(taggedUnitRegExp, 'g'), '*0'));
-      if (!isFinite(result))
-        return;
-      matchedUnits[unit] = result;
-    }
-    return matchedUnits;
-  }
-
-  function mergeDimensionsNonNegative(left, right) {
-    return mergeDimensions(left, right, true);
-  }
-
-  function mergeDimensions(left, right, nonNegative) {
-    var units = [], unit;
-    for (unit in left)
-      units.push(unit);
-    for (unit in right) {
-      if (units.indexOf(unit) < 0)
-        units.push(unit);
-    }
-
-    left = units.map(function(unit) { return left[unit] || 0; });
-    right = units.map(function(unit) { return right[unit] || 0; });
-    return [left, right, function(values) {
-      var result = values.map(function(value, i) {
-        if (values.length == 1 && nonNegative) {
-          value = Math.max(value, 0);
-        }
-        // Scientific notation (e.g. 1e2) is not yet widely supported by browser vendors.
-        return scope.numberToString(value) + units[i];
-      }).join(' + ');
-      return values.length > 1 ? 'calc(' + result + ')' : result;
-    }];
-  }
-
-  var lengthUnits = 'px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc';
-  var parseLength = parseDimension.bind(null, new RegExp(lengthUnits, 'g'));
-  var parseLengthOrPercent = parseDimension.bind(null, new RegExp(lengthUnits + '|%', 'g'));
-  var parseAngle = parseDimension.bind(null, /deg|rad|grad|turn/g);
-
-  scope.parseLength = parseLength;
-  scope.parseLengthOrPercent = parseLengthOrPercent;
-  scope.consumeLengthOrPercent = scope.consumeParenthesised.bind(null, parseLengthOrPercent);
-  scope.parseAngle = parseAngle;
-  scope.mergeDimensions = mergeDimensions;
-
-  var consumeLength = scope.consumeParenthesised.bind(null, parseLength);
-  var consumeSizePair = scope.consumeRepeated.bind(undefined, consumeLength, /^/);
-  var consumeSizePairList = scope.consumeRepeated.bind(undefined, consumeSizePair, /^,/);
-  scope.consumeSizePairList = consumeSizePairList;
-
-  var parseSizePairList = function(input) {
-    var result = consumeSizePairList(input);
-    if (result && result[1] == '') {
-      return result[0];
-    }
-  };
-
-  var mergeNonNegativeSizePair = scope.mergeNestedRepeated.bind(undefined, mergeDimensionsNonNegative, ' ');
-  var mergeNonNegativeSizePairList = scope.mergeNestedRepeated.bind(undefined, mergeNonNegativeSizePair, ',');
-  scope.mergeNonNegativeSizePair = mergeNonNegativeSizePair;
-
-  scope.addPropertiesHandler(parseSizePairList, mergeNonNegativeSizePairList, [
-    'background-size'
-  ]);
-
-  scope.addPropertiesHandler(parseLengthOrPercent, mergeDimensionsNonNegative, [
-    'border-bottom-width',
-    'border-image-width',
-    'border-left-width',
-    'border-right-width',
-    'border-top-width',
-    'flex-basis',
-    'font-size',
-    'height',
-    'line-height',
-    'max-height',
-    'max-width',
-    'outline-width',
-    'width',
-  ]);
-
-  scope.addPropertiesHandler(parseLengthOrPercent, mergeDimensions, [
-    'border-bottom-left-radius',
-    'border-bottom-right-radius',
-    'border-top-left-radius',
-    'border-top-right-radius',
-    'bottom',
-    'left',
-    'letter-spacing',
-    'margin-bottom',
-    'margin-left',
-    'margin-right',
-    'margin-top',
-    'min-height',
-    'min-width',
-    'outline-offset',
-    'padding-bottom',
-    'padding-left',
-    'padding-right',
-    'padding-top',
-    'perspective',
-    'right',
-    'shape-margin',
-    'stroke-dashoffset',
-    'text-indent',
-    'top',
-    'vertical-align',
-    'word-spacing',
-  ]);
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/effect-callback.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/effect-callback.js
deleted file mode 100644
index 3051a59..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/effect-callback.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-(function(shared, scope, testing) {
-
-  var nullTarget = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
-
-  var sequenceNumber = 0;
-  scope.bindAnimationForCustomEffect = function(animation) {
-    var target = animation.effect.target;
-    var effectFunction;
-    var isKeyframeEffect = typeof animation.effect.getFrames() == 'function';
-    if (isKeyframeEffect) {
-      effectFunction = animation.effect.getFrames();
-    } else {
-      effectFunction = animation.effect._onsample;
-    }
-    var timing = animation.effect.timing;
-    var last = null;
-    timing = shared.normalizeTimingInput(timing);
-    var callback = function() {
-      var t = callback._animation ? callback._animation.currentTime : null;
-      if (t !== null) {
-        t = shared.calculateIterationProgress(shared.calculateActiveDuration(timing), t, timing);
-        if (isNaN(t))
-          t = null;
-      }
-      // FIXME: There are actually more conditions under which the effectFunction
-      // should be called.
-      if (t !== last) {
-        if (isKeyframeEffect) {
-          effectFunction(t, target, animation.effect);
-        } else {
-          effectFunction(t, animation.effect, animation.effect._animation);
-        }
-      }
-      last = t;
-    };
-
-    callback._animation = animation;
-    callback._registered = false;
-    callback._sequenceNumber = sequenceNumber++;
-    animation._callback = callback;
-    register(callback);
-  };
-
-  var callbacks = [];
-  var ticking = false;
-  function register(callback) {
-    if (callback._registered)
-      return;
-    callback._registered = true;
-    callbacks.push(callback);
-    if (!ticking) {
-      ticking = true;
-      requestAnimationFrame(tick);
-    }
-  }
-
-  function tick(t) {
-    var updating = callbacks;
-    callbacks = [];
-    updating.sort(function(left, right) {
-      return left._sequenceNumber - right._sequenceNumber;
-    });
-    updating = updating.filter(function(callback) {
-      callback();
-      var playState = callback._animation ? callback._animation.playState : 'idle';
-      if (playState != 'running' && playState != 'pending')
-        callback._registered = false;
-      return callback._registered;
-    });
-    callbacks.push.apply(callbacks, updating);
-
-    if (callbacks.length) {
-      ticking = true;
-      requestAnimationFrame(tick);
-    } else {
-      ticking = false;
-    }
-  }
-
-  scope.Animation.prototype._register = function() {
-    if (this._callback)
-      register(this._callback);
-  };
-
-})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/element-animatable.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/element-animatable.js
deleted file mode 100644
index 765edf0..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/element-animatable.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-  window.Element.prototype.animate = function(effectInput, options) {
-    var id = '';
-    if (options && options.id) {
-      id = options.id;
-    }
-    return scope.timeline._play(scope.KeyframeEffect(this, effectInput, options, id));
-  };
-})(webAnimations1);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/font-weight-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/font-weight-handler.js
deleted file mode 100644
index 4760486..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/font-weight-handler.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-  function parse(string) {
-    var out = Number(string);
-    if (isNaN(out) || out < 100 || out > 900 || out % 100 !== 0) {
-      return;
-    }
-    return out;
-  }
-
-  function toCss(value) {
-    value = Math.round(value / 100) * 100;
-    value = scope.clamp(100, 900, value);
-    if (value === 400) {
-      return 'normal';
-    }
-    if (value === 700) {
-      return 'bold';
-    }
-    return String(value);
-  }
-
-  function merge(left, right) {
-    return [left, right, toCss];
-  }
-
-  scope.addPropertiesHandler(parse, merge, ['font-weight']);
-
-})(webAnimations1);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/group-constructors.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/group-constructors.js
deleted file mode 100644
index e5c0a10..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/group-constructors.js
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-
-  function groupChildDuration(node) {
-    return node._timing.delay + node.activeDuration + node._timing.endDelay;
-  }
-
-  function constructor(children, timingInput, id) {
-    this._id = id;
-    this._parent = null;
-    this.children = children || [];
-    this._reparent(this.children);
-    timingInput = shared.numericTimingToObject(timingInput);
-    this._timingInput = shared.cloneTimingInput(timingInput);
-    this._timing = shared.normalizeTimingInput(timingInput, true);
-    this.timing = shared.makeTiming(timingInput, true, this);
-    this.timing._effect = this;
-
-    if (this._timing.duration === 'auto') {
-      this._timing.duration = this.activeDuration;
-    }
-  }
-
-  window.SequenceEffect = function() {
-    constructor.apply(this, arguments);
-  };
-
-  window.GroupEffect = function() {
-    constructor.apply(this, arguments);
-  };
-
-  constructor.prototype = {
-    _isAncestor: function(effect) {
-      var a = this;
-      while (a !== null) {
-        if (a == effect)
-          return true;
-        a = a._parent;
-      }
-      return false;
-    },
-    _rebuild: function() {
-      // Re-calculate durations for ancestors with specified duration 'auto'.
-      var node = this;
-      while (node) {
-        if (node.timing.duration === 'auto') {
-          node._timing.duration = node.activeDuration;
-        }
-        node = node._parent;
-      }
-      if (this._animation) {
-        this._animation._rebuildUnderlyingAnimation();
-      }
-    },
-    _reparent: function(newChildren) {
-      scope.removeMulti(newChildren);
-      for (var i = 0; i < newChildren.length; i++) {
-        newChildren[i]._parent = this;
-      }
-    },
-    _putChild: function(args, isAppend) {
-      var message = isAppend ? 'Cannot append an ancestor or self' : 'Cannot prepend an ancestor or self';
-      for (var i = 0; i < args.length; i++) {
-        if (this._isAncestor(args[i])) {
-          throw {
-            type: DOMException.HIERARCHY_REQUEST_ERR,
-            name: 'HierarchyRequestError',
-            message: message
-          };
-        }
-      }
-      var oldParents = [];
-      for (var i = 0; i < args.length; i++) {
-        isAppend ? this.children.push(args[i]) : this.children.unshift(args[i]);
-      }
-      this._reparent(args);
-      this._rebuild();
-    },
-    append: function()  {
-      this._putChild(arguments, true);
-    },
-    prepend: function()  {
-      this._putChild(arguments, false);
-    },
-    get parent() {
-      return this._parent;
-    },
-    get firstChild() {
-      return this.children.length ? this.children[0] : null;
-    },
-    get lastChild() {
-      return this.children.length ? this.children[this.children.length - 1] : null;
-    },
-    clone: function() {
-      var clonedTiming = shared.cloneTimingInput(this._timingInput);
-      var clonedChildren = [];
-      for (var i = 0; i < this.children.length; i++) {
-        clonedChildren.push(this.children[i].clone());
-      }
-      return (this instanceof GroupEffect) ?
-          new GroupEffect(clonedChildren, clonedTiming) :
-          new SequenceEffect(clonedChildren, clonedTiming);
-    },
-    remove: function() {
-      scope.removeMulti([this]);
-    }
-  };
-
-  window.SequenceEffect.prototype = Object.create(constructor.prototype);
-  Object.defineProperty(
-      window.SequenceEffect.prototype,
-      'activeDuration',
-      {
-        get: function() {
-          var total = 0;
-          this.children.forEach(function(child) {
-            total += groupChildDuration(child);
-          });
-          return Math.max(total, 0);
-        }
-      });
-
-  window.GroupEffect.prototype = Object.create(constructor.prototype);
-  Object.defineProperty(
-      window.GroupEffect.prototype,
-      'activeDuration',
-      {
-        get: function() {
-          var max = 0;
-          this.children.forEach(function(child) {
-            max = Math.max(max, groupChildDuration(child));
-          });
-          return max;
-        }
-      });
-
-  scope.newUnderlyingAnimationForGroup = function(group) {
-    var underlyingAnimation;
-    var timing = null;
-    var ticker = function(tf) {
-      var animation = underlyingAnimation._wrapper;
-      if (!animation) {
-        return;
-      }
-      if (animation.playState == 'pending') {
-        return;
-      }
-      if (!animation.effect) {
-        return;
-      }
-      if (tf == null) {
-        animation._removeChildAnimations();
-        return;
-      }
-
-      // If the group has a negative playback rate and is not fill backwards/both, then it should go
-      // out of effect when it reaches the start of its active interval (tf == 0). If it is fill
-      // backwards/both then it should stay in effect. calculateIterationProgress will return 0 in the
-      // backwards-filling case, and null otherwise.
-      if (tf == 0 && animation.playbackRate < 0) {
-        if (!timing) {
-          timing = shared.normalizeTimingInput(animation.effect.timing);
-        }
-        tf = shared.calculateIterationProgress(shared.calculateActiveDuration(timing), -1, timing);
-        if (isNaN(tf) || tf == null) {
-          animation._forEachChild(function(child) {
-            child.currentTime = -1;
-          });
-          animation._removeChildAnimations();
-          return;
-        }
-      }
-    };
-
-    var underlyingEffect = new KeyframeEffect(null, [], group._timing, group._id);
-    underlyingEffect.onsample = ticker;
-    underlyingAnimation = scope.timeline._play(underlyingEffect);
-    return underlyingAnimation;
-  };
-
-  scope.bindAnimationForGroup = function(animation) {
-    animation._animation._wrapper = animation;
-    animation._isGroup = true;
-    scope.awaitStartTime(animation);
-    animation._constructChildAnimations();
-    animation._setExternalAnimation(animation);
-  };
-
-  scope.groupChildDuration = groupChildDuration;
-
-})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js
deleted file mode 100644
index d9f05e1..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-
-  // consume* functions return a 2 value array of [parsed-data, '' or not-yet consumed input]
-
-  // Regex should be anchored with /^
-  function consumeToken(regex, string) {
-    var result = regex.exec(string);
-    if (result) {
-      result = regex.ignoreCase ? result[0].toLowerCase() : result[0];
-      return [result, string.substr(result.length)];
-    }
-  }
-
-  function consumeTrimmed(consumer, string) {
-    string = string.replace(/^\s*/, '');
-    var result = consumer(string);
-    if (result) {
-      return [result[0], result[1].replace(/^\s*/, '')];
-    }
-  }
-
-  function consumeRepeated(consumer, separator, string) {
-    consumer = consumeTrimmed.bind(null, consumer);
-    var list = [];
-    while (true) {
-      var result = consumer(string);
-      if (!result) {
-        return [list, string];
-      }
-      list.push(result[0]);
-      string = result[1];
-      result = consumeToken(separator, string);
-      if (!result || result[1] == '') {
-        return [list, string];
-      }
-      string = result[1];
-    }
-  }
-
-  // Consumes a token or expression with balanced parentheses
-  function consumeParenthesised(parser, string) {
-    var nesting = 0;
-    for (var n = 0; n < string.length; n++) {
-      if (/\s|,/.test(string[n]) && nesting == 0) {
-        break;
-      } else if (string[n] == '(') {
-        nesting++;
-      } else if (string[n] == ')') {
-        nesting--;
-        if (nesting == 0)
-          n++;
-        if (nesting <= 0)
-          break;
-      }
-    }
-    var parsed = parser(string.substr(0, n));
-    return parsed == undefined ? undefined : [parsed, string.substr(n)];
-  }
-
-  function lcm(a, b) {
-    var c = a;
-    var d = b;
-    while (c && d)
-      c > d ? c %= d : d %= c;
-    c = (a * b) / (c + d);
-    return c;
-  }
-
-  function ignore(value) {
-    return function(input) {
-      var result = value(input);
-      if (result)
-        result[0] = undefined;
-      return result;
-    }
-  }
-
-  function optional(value, defaultValue) {
-    return function(input) {
-      var result = value(input);
-      if (result)
-        return result;
-      return [defaultValue, input];
-    }
-  }
-
-  function consumeList(list, input) {
-    var output = [];
-    for (var i = 0; i < list.length; i++) {
-      var result = scope.consumeTrimmed(list[i], input);
-      if (!result || result[0] == '')
-        return;
-      if (result[0] !== undefined)
-        output.push(result[0]);
-      input = result[1];
-    }
-    if (input == '') {
-      return output;
-    }
-  }
-
-  function mergeWrappedNestedRepeated(wrap, nestedMerge, separator, left, right) {
-    var matchingLeft = [];
-    var matchingRight = [];
-    var reconsititution = [];
-    var length = lcm(left.length, right.length);
-    for (var i = 0; i < length; i++) {
-      var thing = nestedMerge(left[i % left.length], right[i % right.length]);
-      if (!thing) {
-        return;
-      }
-      matchingLeft.push(thing[0]);
-      matchingRight.push(thing[1]);
-      reconsititution.push(thing[2]);
-    }
-    return [matchingLeft, matchingRight, function(positions) {
-      var result = positions.map(function(position, i) {
-        return reconsititution[i](position);
-      }).join(separator);
-      return wrap ? wrap(result) : result;
-    }];
-  }
-
-  function mergeList(left, right, list) {
-    var lefts = [];
-    var rights = [];
-    var functions = [];
-    var j = 0;
-    for (var i = 0; i < list.length; i++) {
-      if (typeof list[i] == 'function') {
-        var result = list[i](left[j], right[j++]);
-        lefts.push(result[0]);
-        rights.push(result[1]);
-        functions.push(result[2]);
-      } else {
-        (function(pos) {
-          lefts.push(false);
-          rights.push(false);
-          functions.push(function() { return list[pos]; });
-        })(i);
-      }
-    }
-    return [lefts, rights, function(results) {
-      var result = '';
-      for (var i = 0; i < results.length; i++) {
-        result += functions[i](results[i]);
-      }
-      return result;
-    }];
-  }
-
-  scope.consumeToken = consumeToken;
-  scope.consumeTrimmed = consumeTrimmed;
-  scope.consumeRepeated = consumeRepeated;
-  scope.consumeParenthesised = consumeParenthesised;
-  scope.ignore = ignore;
-  scope.optional = optional;
-  scope.consumeList = consumeList;
-  scope.mergeNestedRepeated = mergeWrappedNestedRepeated.bind(null, null);
-  scope.mergeWrappedNestedRepeated = mergeWrappedNestedRepeated;
-  scope.mergeList = mergeList;
-
-})(webAnimations1);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/interpolation.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/interpolation.js
deleted file mode 100644
index ba63ed3..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/interpolation.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  function interpolate(from, to, f) {
-    if ((typeof from == 'number') && (typeof to == 'number')) {
-      return from * (1 - f) + to * f;
-    }
-    if ((typeof from == 'boolean') && (typeof to == 'boolean')) {
-      return f < 0.5 ? from : to;
-    }
-
-    WEB_ANIMATIONS_TESTING && console.assert(
-        Array.isArray(from) && Array.isArray(to),
-        'If interpolation arguments are not numbers or bools they must be arrays');
-
-    if (from.length == to.length) {
-      var r = [];
-      for (var i = 0; i < from.length; i++) {
-        r.push(interpolate(from[i], to[i], f));
-      }
-      return r;
-    }
-    throw 'Mismatched interpolation arguments ' + from + ':' + to;
-  }
-
-  scope.Interpolation = function(from, to, convertToString) {
-    return function(f) {
-      return convertToString(interpolate(from, to, f));
-    }
-  };
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.interpolate = interpolate;
-  }
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-effect-constructor.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-effect-constructor.js
deleted file mode 100644
index 3d0f1bd..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-effect-constructor.js
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-
-  var disassociate = function(effect) {
-    effect._animation = undefined;
-    if (effect instanceof window.SequenceEffect || effect instanceof window.GroupEffect) {
-      for (var i = 0; i < effect.children.length; i++) {
-        disassociate(effect.children[i]);
-      }
-    }
-  };
-
-  scope.removeMulti = function(effects) {
-    var oldParents = [];
-    for (var i = 0; i < effects.length; i++) {
-      var effect = effects[i];
-      if (effect._parent) {
-        if (oldParents.indexOf(effect._parent) == -1) {
-          oldParents.push(effect._parent);
-        }
-        effect._parent.children.splice(effect._parent.children.indexOf(effect), 1);
-        effect._parent = null;
-        disassociate(effect);
-      } else if (effect._animation && (effect._animation.effect == effect)) {
-        effect._animation.cancel();
-        effect._animation.effect = new KeyframeEffect(null, []);
-        if (effect._animation._callback) {
-          effect._animation._callback._animation = null;
-        }
-        effect._animation._rebuildUnderlyingAnimation();
-        disassociate(effect);
-      }
-    }
-    for (i = 0; i < oldParents.length; i++) {
-      oldParents[i]._rebuild();
-    }
-  };
-
-  function KeyframeList(effectInput) {
-    this._frames = shared.normalizeKeyframes(effectInput);
-  }
-
-  scope.KeyframeEffect = function(target, effectInput, timingInput, id) {
-    this.target = target;
-    this._parent = null;
-
-    timingInput = shared.numericTimingToObject(timingInput);
-    this._timingInput = shared.cloneTimingInput(timingInput);
-    this._timing = shared.normalizeTimingInput(timingInput);
-
-    this.timing = shared.makeTiming(timingInput, false, this);
-    this.timing._effect = this;
-    if (typeof effectInput == 'function') {
-      shared.deprecated('Custom KeyframeEffect', '2015-06-22', 'Use KeyframeEffect.onsample instead.');
-      this._normalizedKeyframes = effectInput;
-    } else {
-      this._normalizedKeyframes = new KeyframeList(effectInput);
-    }
-    this._keyframes = effectInput;
-    this.activeDuration = shared.calculateActiveDuration(this._timing);
-    this._id = id;
-    return this;
-  };
-
-  scope.KeyframeEffect.prototype = {
-    getFrames: function() {
-      if (typeof this._normalizedKeyframes == 'function')
-        return this._normalizedKeyframes;
-      return this._normalizedKeyframes._frames;
-    },
-    set onsample(callback) {
-      if (typeof this.getFrames() == 'function') {
-        throw new Error('Setting onsample on custom effect KeyframeEffect is not supported.');
-      }
-      this._onsample = callback;
-      if (this._animation) {
-        this._animation._rebuildUnderlyingAnimation();
-      }
-    },
-    get parent() {
-      return this._parent;
-    },
-    clone: function() {
-      if (typeof this.getFrames() == 'function') {
-        throw new Error('Cloning custom effects is not supported.');
-      }
-      var clone = new KeyframeEffect(this.target, [], shared.cloneTimingInput(this._timingInput), this._id);
-      clone._normalizedKeyframes = this._normalizedKeyframes;
-      clone._keyframes = this._keyframes;
-      return clone;
-    },
-    remove: function() {
-      scope.removeMulti([this]);
-    }
-  };
-
-  var originalElementAnimate = Element.prototype.animate;
-  Element.prototype.animate = function(effectInput, options) {
-    var id = '';
-    if (options && options.id) {
-      id = options.id;
-    }
-    return scope.timeline._play(new scope.KeyframeEffect(this, effectInput, options, id));
-  };
-
-  var nullTarget = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
-  scope.newUnderlyingAnimationForKeyframeEffect = function(keyframeEffect) {
-    if (keyframeEffect) {
-      var target = keyframeEffect.target || nullTarget;
-      var keyframes = keyframeEffect._keyframes;
-      if (typeof keyframes == 'function') {
-        keyframes = [];
-      }
-      var options = keyframeEffect._timingInput;
-      options.id = keyframeEffect._id;
-    } else {
-      var target = nullTarget;
-      var keyframes = [];
-      var options = 0;
-    }
-    return originalElementAnimate.apply(target, [keyframes, options]);
-  };
-
-  // TODO: Remove this once we remove support for custom KeyframeEffects.
-  scope.bindAnimationForKeyframeEffect = function(animation) {
-    if (animation.effect && typeof animation.effect._normalizedKeyframes == 'function') {
-      scope.bindAnimationForCustomEffect(animation);
-    }
-  };
-
-  var pendingGroups = [];
-  scope.awaitStartTime = function(groupAnimation) {
-    if (groupAnimation.startTime !== null || !groupAnimation._isGroup)
-      return;
-    if (pendingGroups.length == 0) {
-      requestAnimationFrame(updatePendingGroups);
-    }
-    pendingGroups.push(groupAnimation);
-  };
-  function updatePendingGroups() {
-    var updated = false;
-    while (pendingGroups.length) {
-      var group = pendingGroups.shift();
-      group._updateChildren();
-      updated = true;
-    }
-    return updated;
-  }
-  var originalGetComputedStyle = window.getComputedStyle;
-  Object.defineProperty(window, 'getComputedStyle', {
-    configurable: true,
-    enumerable: true,
-    value: function() {
-      scope.timeline._updateAnimationsPromises();
-      var result = originalGetComputedStyle.apply(this, arguments);
-      if (updatePendingGroups())
-        result = originalGetComputedStyle.apply(this, arguments);
-      scope.timeline._updateAnimationsPromises();
-      return result;
-    },
-  });
-
-  window.KeyframeEffect = scope.KeyframeEffect;
-  window.Element.prototype.getAnimations = function() {
-    return document.timeline.getAnimations().filter(function(animation) {
-      return animation.effect !== null && animation.effect.target == this;
-    }.bind(this));
-  };
-
-}(webAnimationsShared, webAnimationsNext, webAnimationsTesting));
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-effect.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-effect.js
deleted file mode 100644
index 7775d58..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-effect.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-
-  function EffectTime(timing) {
-    var timeFraction = 0;
-    var activeDuration = shared.calculateActiveDuration(timing);
-    var effectTime = function(localTime) {
-      return shared.calculateIterationProgress(activeDuration, localTime, timing);
-    };
-    effectTime._totalDuration = timing.delay + activeDuration + timing.endDelay;
-    return effectTime;
-  }
-
-  scope.KeyframeEffect = function(target, effectInput, timingInput, id) {
-    var effectTime = EffectTime(shared.normalizeTimingInput(timingInput));
-    var interpolations = scope.convertEffectInput(effectInput);
-    var timeFraction;
-    var keyframeEffect = function() {
-      WEB_ANIMATIONS_TESTING && console.assert(typeof timeFraction !== 'undefined');
-      interpolations(target, timeFraction);
-    };
-    // Returns whether the keyframeEffect is in effect or not after the timing update.
-    keyframeEffect._update = function(localTime) {
-      timeFraction = effectTime(localTime);
-      return timeFraction !== null;
-    };
-    keyframeEffect._clear = function() {
-      interpolations(target, null);
-    };
-    keyframeEffect._hasSameTarget = function(otherTarget) {
-      return target === otherTarget;
-    };
-    keyframeEffect._target = target;
-    keyframeEffect._totalDuration = effectTime._totalDuration;
-    keyframeEffect._id = id;
-    return keyframeEffect;
-  };
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.webAnimations1KeyframeEffect = scope.KeyframeEffect;
-    testing.effectTime = EffectTime;
-  }
-
-})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js
deleted file mode 100644
index cab801e..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-
-  scope.convertEffectInput = function(effectInput) {
-    var keyframes = shared.normalizeKeyframes(effectInput);
-    var propertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups(keyframes);
-    var interpolations = makeInterpolations(propertySpecificKeyframeGroups);
-    return function(target, fraction) {
-      if (fraction != null) {
-        interpolations.filter(function(interpolation) {
-          return fraction >= interpolation.applyFrom && fraction < interpolation.applyTo;
-        }).forEach(function(interpolation) {
-          var offsetFraction = fraction - interpolation.startOffset;
-          var localDuration = interpolation.endOffset - interpolation.startOffset;
-          var scaledLocalTime = localDuration == 0 ? 0 : interpolation.easingFunction(offsetFraction / localDuration);
-          scope.apply(target, interpolation.property, interpolation.interpolation(scaledLocalTime));
-        });
-      } else {
-        for (var property in propertySpecificKeyframeGroups)
-          if (property != 'offset' && property != 'easing' && property != 'composite')
-            scope.clear(target, property);
-      }
-    };
-  };
-
-
-  function makePropertySpecificKeyframeGroups(keyframes) {
-    var propertySpecificKeyframeGroups = {};
-
-    for (var i = 0; i < keyframes.length; i++) {
-      for (var member in keyframes[i]) {
-        if (member != 'offset' && member != 'easing' && member != 'composite') {
-          var propertySpecificKeyframe = {
-            offset: keyframes[i].offset,
-            easing: keyframes[i].easing,
-            value: keyframes[i][member]
-          };
-          propertySpecificKeyframeGroups[member] = propertySpecificKeyframeGroups[member] || [];
-          propertySpecificKeyframeGroups[member].push(propertySpecificKeyframe);
-        }
-      }
-    }
-
-    for (var groupName in propertySpecificKeyframeGroups) {
-      var group = propertySpecificKeyframeGroups[groupName];
-      if (group[0].offset != 0 || group[group.length - 1].offset != 1) {
-        throw {
-          type: DOMException.NOT_SUPPORTED_ERR,
-          name: 'NotSupportedError',
-          message: 'Partial keyframes are not supported'
-        };
-      }
-    }
-    return propertySpecificKeyframeGroups;
-  }
-
-
-  function makeInterpolations(propertySpecificKeyframeGroups) {
-    var interpolations = [];
-    for (var groupName in propertySpecificKeyframeGroups) {
-      var keyframes = propertySpecificKeyframeGroups[groupName];
-      for (var i = 0; i < keyframes.length - 1; i++) {
-        var startIndex = i;
-        var endIndex = i + 1;
-        var startOffset = keyframes[startIndex].offset;
-        var endOffset = keyframes[endIndex].offset;
-        var applyFrom = startOffset;
-        var applyTo = endOffset;
-
-        if (i == 0) {
-          applyFrom = -Infinity;
-          WEB_ANIMATIONS_TESTING && console.assert(startOffset == 0);
-          if (endOffset == 0) {
-            endIndex = startIndex;
-          }
-        }
-        if (i == keyframes.length - 2) {
-          applyTo = Infinity;
-          WEB_ANIMATIONS_TESTING && console.assert(endOffset == 1);
-          if (startOffset == 1) {
-            startIndex = endIndex;
-          }
-        }
-
-        interpolations.push({
-          applyFrom: applyFrom,
-          applyTo: applyTo,
-          startOffset: keyframes[startIndex].offset,
-          endOffset: keyframes[endIndex].offset,
-          easingFunction: shared.parseEasingFunction(keyframes[startIndex].easing),
-          property: groupName,
-          interpolation: scope.propertyInterpolation(groupName,
-              keyframes[startIndex].value,
-              keyframes[endIndex].value)
-        });
-      }
-    }
-    interpolations.sort(function(leftInterpolation, rightInterpolation) {
-      return leftInterpolation.startOffset - rightInterpolation.startOffset;
-    });
-    return interpolations;
-  }
-
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.makePropertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups;
-    testing.makeInterpolations = makeInterpolations;
-  }
-
-})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/matrix-decomposition.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/matrix-decomposition.js
deleted file mode 100644
index aa9cfe7..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/matrix-decomposition.js
+++ /dev/null
@@ -1,440 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-  var decomposeMatrix = (function() {
-    function determinant(m) {
-      return m[0][0] * m[1][1] * m[2][2] +
-             m[1][0] * m[2][1] * m[0][2] +
-             m[2][0] * m[0][1] * m[1][2] -
-             m[0][2] * m[1][1] * m[2][0] -
-             m[1][2] * m[2][1] * m[0][0] -
-             m[2][2] * m[0][1] * m[1][0];
-    }
-
-    // from Wikipedia:
-    //
-    // [A B]^-1 = [A^-1 + A^-1B(D - CA^-1B)^-1CA^-1     -A^-1B(D - CA^-1B)^-1]
-    // [C D]      [-(D - CA^-1B)^-1CA^-1                (D - CA^-1B)^-1      ]
-    //
-    // Therefore
-    //
-    // [A [0]]^-1 = [A^-1       [0]]
-    // [C  1 ]      [ -CA^-1     1 ]
-    function inverse(m) {
-      var iDet = 1 / determinant(m);
-      var a = m[0][0], b = m[0][1], c = m[0][2];
-      var d = m[1][0], e = m[1][1], f = m[1][2];
-      var g = m[2][0], h = m[2][1], k = m[2][2];
-      var Ainv = [
-        [(e * k - f * h) * iDet, (c * h - b * k) * iDet,
-         (b * f - c * e) * iDet, 0],
-        [(f * g - d * k) * iDet, (a * k - c * g) * iDet,
-         (c * d - a * f) * iDet, 0],
-        [(d * h - e * g) * iDet, (g * b - a * h) * iDet,
-         (a * e - b * d) * iDet, 0]
-      ];
-      var lastRow = [];
-      for (var i = 0; i < 3; i++) {
-        var val = 0;
-        for (var j = 0; j < 3; j++) {
-          val += m[3][j] * Ainv[j][i];
-        }
-        lastRow.push(val);
-      }
-      lastRow.push(1);
-      Ainv.push(lastRow);
-      return Ainv;
-    }
-
-    function transposeMatrix4(m) {
-      return [[m[0][0], m[1][0], m[2][0], m[3][0]],
-              [m[0][1], m[1][1], m[2][1], m[3][1]],
-              [m[0][2], m[1][2], m[2][2], m[3][2]],
-              [m[0][3], m[1][3], m[2][3], m[3][3]]];
-    }
-
-    function multVecMatrix(v, m) {
-      var result = [];
-      for (var i = 0; i < 4; i++) {
-        var val = 0;
-        for (var j = 0; j < 4; j++) {
-          val += v[j] * m[j][i];
-        }
-        result.push(val);
-      }
-      return result;
-    }
-
-    function normalize(v) {
-      var len = length(v);
-      return [v[0] / len, v[1] / len, v[2] / len];
-    }
-
-    function length(v) {
-      return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
-    }
-
-    function combine(v1, v2, v1s, v2s) {
-      return [v1s * v1[0] + v2s * v2[0], v1s * v1[1] + v2s * v2[1],
-              v1s * v1[2] + v2s * v2[2]];
-    }
-
-    function cross(v1, v2) {
-      return [v1[1] * v2[2] - v1[2] * v2[1],
-              v1[2] * v2[0] - v1[0] * v2[2],
-              v1[0] * v2[1] - v1[1] * v2[0]];
-    }
-
-    function decomposeMatrix(matrix) {
-      var m3d = [
-        matrix.slice(0, 4),
-        matrix.slice(4, 8),
-        matrix.slice(8, 12),
-        matrix.slice(12, 16)
-      ];
-
-      // skip normalization step as m3d[3][3] should always be 1
-      if (m3d[3][3] !== 1) {
-        return null;
-      }
-
-      var perspectiveMatrix = [];
-      for (var i = 0; i < 4; i++) {
-        perspectiveMatrix.push(m3d[i].slice());
-      }
-
-      for (var i = 0; i < 3; i++) {
-        perspectiveMatrix[i][3] = 0;
-      }
-
-      if (determinant(perspectiveMatrix) === 0) {
-        return null;
-      }
-
-      var rhs = [];
-
-      var perspective;
-      if (m3d[0][3] || m3d[1][3] || m3d[2][3]) {
-        rhs.push(m3d[0][3]);
-        rhs.push(m3d[1][3]);
-        rhs.push(m3d[2][3]);
-        rhs.push(m3d[3][3]);
-
-        var inversePerspectiveMatrix = inverse(perspectiveMatrix);
-        var transposedInversePerspectiveMatrix =
-            transposeMatrix4(inversePerspectiveMatrix);
-        perspective = multVecMatrix(rhs, transposedInversePerspectiveMatrix);
-      } else {
-        perspective = [0, 0, 0, 1];
-      }
-
-      var translate = m3d[3].slice(0, 3);
-
-      var row = [];
-      row.push(m3d[0].slice(0, 3));
-      var scale = [];
-      scale.push(length(row[0]));
-      row[0] = normalize(row[0]);
-
-      var skew = [];
-      row.push(m3d[1].slice(0, 3));
-      skew.push(dot(row[0], row[1]));
-      row[1] = combine(row[1], row[0], 1.0, -skew[0]);
-
-      scale.push(length(row[1]));
-      row[1] = normalize(row[1]);
-      skew[0] /= scale[1];
-
-      row.push(m3d[2].slice(0, 3));
-      skew.push(dot(row[0], row[2]));
-      row[2] = combine(row[2], row[0], 1.0, -skew[1]);
-      skew.push(dot(row[1], row[2]));
-      row[2] = combine(row[2], row[1], 1.0, -skew[2]);
-
-      scale.push(length(row[2]));
-      row[2] = normalize(row[2]);
-      skew[1] /= scale[2];
-      skew[2] /= scale[2];
-
-      var pdum3 = cross(row[1], row[2]);
-      if (dot(row[0], pdum3) < 0) {
-        for (var i = 0; i < 3; i++) {
-          scale[i] *= -1;
-          row[i][0] *= -1;
-          row[i][1] *= -1;
-          row[i][2] *= -1;
-        }
-      }
-
-      var t = row[0][0] + row[1][1] + row[2][2] + 1;
-      var s;
-      var quaternion;
-
-      if (t > 1e-4) {
-        s = 0.5 / Math.sqrt(t);
-        quaternion = [
-          (row[2][1] - row[1][2]) * s,
-          (row[0][2] - row[2][0]) * s,
-          (row[1][0] - row[0][1]) * s,
-          0.25 / s
-        ];
-      } else if (row[0][0] > row[1][1] && row[0][0] > row[2][2]) {
-        s = Math.sqrt(1 + row[0][0] - row[1][1] - row[2][2]) * 2.0;
-        quaternion = [
-          0.25 * s,
-          (row[0][1] + row[1][0]) / s,
-          (row[0][2] + row[2][0]) / s,
-          (row[2][1] - row[1][2]) / s
-        ];
-      } else if (row[1][1] > row[2][2]) {
-        s = Math.sqrt(1.0 + row[1][1] - row[0][0] - row[2][2]) * 2.0;
-        quaternion = [
-          (row[0][1] + row[1][0]) / s,
-          0.25 * s,
-          (row[1][2] + row[2][1]) / s,
-          (row[0][2] - row[2][0]) / s
-        ];
-      } else {
-        s = Math.sqrt(1.0 + row[2][2] - row[0][0] - row[1][1]) * 2.0;
-        quaternion = [
-          (row[0][2] + row[2][0]) / s,
-          (row[1][2] + row[2][1]) / s,
-          0.25 * s,
-          (row[1][0] - row[0][1]) / s
-        ];
-      }
-
-      return [translate, scale, skew, quaternion, perspective];
-    }
-    return decomposeMatrix;
-  })();
-
-  function dot(v1, v2) {
-    var result = 0;
-    for (var i = 0; i < v1.length; i++) {
-      result += v1[i] * v2[i];
-    }
-    return result;
-  }
-
-  function multiplyMatrices(a, b) {
-    return [
-      a[0] * b[0] + a[4] * b[1] + a[8] * b[2] + a[12] * b[3],
-      a[1] * b[0] + a[5] * b[1] + a[9] * b[2] + a[13] * b[3],
-      a[2] * b[0] + a[6] * b[1] + a[10] * b[2] + a[14] * b[3],
-      a[3] * b[0] + a[7] * b[1] + a[11] * b[2] + a[15] * b[3],
-
-      a[0] * b[4] + a[4] * b[5] + a[8] * b[6] + a[12] * b[7],
-      a[1] * b[4] + a[5] * b[5] + a[9] * b[6] + a[13] * b[7],
-      a[2] * b[4] + a[6] * b[5] + a[10] * b[6] + a[14] * b[7],
-      a[3] * b[4] + a[7] * b[5] + a[11] * b[6] + a[15] * b[7],
-
-      a[0] * b[8] + a[4] * b[9] + a[8] * b[10] + a[12] * b[11],
-      a[1] * b[8] + a[5] * b[9] + a[9] * b[10] + a[13] * b[11],
-      a[2] * b[8] + a[6] * b[9] + a[10] * b[10] + a[14] * b[11],
-      a[3] * b[8] + a[7] * b[9] + a[11] * b[10] + a[15] * b[11],
-
-      a[0] * b[12] + a[4] * b[13] + a[8] * b[14] + a[12] * b[15],
-      a[1] * b[12] + a[5] * b[13] + a[9] * b[14] + a[13] * b[15],
-      a[2] * b[12] + a[6] * b[13] + a[10] * b[14] + a[14] * b[15],
-      a[3] * b[12] + a[7] * b[13] + a[11] * b[14] + a[15] * b[15]
-    ];
-  }
-
-  function toRadians(arg) {
-    var rads = arg.rad || 0;
-    var degs = arg.deg || 0;
-    var grads = arg.grad || 0;
-    var turns = arg.turn || 0;
-    var angle = (degs / 360 + grads / 400 + turns) * (2 * Math.PI) + rads;
-    return angle;
-  }
-
-  function convertItemToMatrix(item) {
-    switch (item.t) {
-      case 'rotatex':
-        var angle = toRadians(item.d[0]);
-        return [1, 0, 0, 0,
-                0, Math.cos(angle), Math.sin(angle), 0,
-                0, -Math.sin(angle), Math.cos(angle), 0,
-                0, 0, 0, 1];
-      case 'rotatey':
-        var angle = toRadians(item.d[0]);
-        return [Math.cos(angle), 0, -Math.sin(angle), 0,
-                0, 1, 0, 0,
-                Math.sin(angle), 0, Math.cos(angle), 0,
-                0, 0, 0, 1];
-      case 'rotate':
-      case 'rotatez':
-        var angle = toRadians(item.d[0]);
-        return [Math.cos(angle), Math.sin(angle), 0, 0,
-                -Math.sin(angle), Math.cos(angle), 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'rotate3d':
-        var x = item.d[0];
-        var y = item.d[1];
-        var z = item.d[2];
-        var angle = toRadians(item.d[3]);
-
-        var sqrLength = x * x + y * y + z * z;
-        if (sqrLength === 0) {
-          x = 1;
-          y = 0;
-          z = 0;
-        } else if (sqrLength !== 1) {
-          var length = Math.sqrt(sqrLength);
-          x /= length;
-          y /= length;
-          z /= length;
-        }
-
-        var s = Math.sin(angle / 2);
-        var sc = s * Math.cos(angle / 2);
-        var sq = s * s;
-        return [
-          1 - 2 * (y * y + z * z) * sq,
-          2 * (x * y * sq + z * sc),
-          2 * (x * z * sq - y * sc),
-          0,
-
-          2 * (x * y * sq - z * sc),
-          1 - 2 * (x * x + z * z) * sq,
-          2 * (y * z * sq + x * sc),
-          0,
-
-          2 * (x * z * sq + y * sc),
-          2 * (y * z * sq - x * sc),
-          1 - 2 * (x * x + y * y) * sq,
-          0,
-
-          0, 0, 0, 1
-        ];
-      case 'scale':
-        return [item.d[0], 0, 0, 0,
-                0, item.d[1], 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'scalex':
-        return [item.d[0], 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'scaley':
-        return [1, 0, 0, 0,
-                0, item.d[0], 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'scalez':
-        return [1, 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, item.d[0], 0,
-                0, 0, 0, 1];
-      case 'scale3d':
-        return [item.d[0], 0, 0, 0,
-                0, item.d[1], 0, 0,
-                0, 0, item.d[2], 0,
-                0, 0, 0, 1];
-      case 'skew':
-        var xAngle = toRadians(item.d[0]);
-        var yAngle = toRadians(item.d[1]);
-        return [1, Math.tan(yAngle), 0, 0,
-                Math.tan(xAngle), 1, 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'skewx':
-        var angle = toRadians(item.d[0]);
-        return [1, 0, 0, 0,
-                Math.tan(angle), 1, 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'skewy':
-        var angle = toRadians(item.d[0]);
-        return [1, Math.tan(angle), 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                0, 0, 0, 1];
-      case 'translate':
-        var x = item.d[0].px || 0;
-        var y = item.d[1].px || 0;
-        return [1, 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                x, y, 0, 1];
-      case 'translatex':
-        var x = item.d[0].px || 0;
-        return [1, 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                x, 0, 0, 1];
-      case 'translatey':
-        var y = item.d[0].px || 0;
-        return [1, 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                0, y, 0, 1];
-      case 'translatez':
-        var z = item.d[0].px || 0;
-        return [1, 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                0, 0, z, 1];
-      case 'translate3d':
-        var x = item.d[0].px || 0;
-        var y = item.d[1].px || 0;
-        var z = item.d[2].px || 0;
-        return [1, 0, 0, 0,
-                0, 1, 0, 0,
-                0, 0, 1, 0,
-                x, y, z, 1];
-      case 'perspective':
-        var p = item.d[0].px ? (-1 / item.d[0].px) : 0;
-        return [
-          1, 0, 0, 0,
-          0, 1, 0, 0,
-          0, 0, 1, p,
-          0, 0, 0, 1];
-      case 'matrix':
-        return [item.d[0], item.d[1], 0, 0,
-                item.d[2], item.d[3], 0, 0,
-                0, 0, 1, 0,
-                item.d[4], item.d[5], 0, 1];
-      case 'matrix3d':
-        return item.d;
-      default:
-        WEB_ANIMATIONS_TESTING && console.assert(false, 'Transform item type ' + item.t +
-            ' conversion to matrix not yet implemented.');
-    }
-  }
-
-  function convertToMatrix(transformList) {
-    if (transformList.length === 0) {
-      return [1, 0, 0, 0,
-              0, 1, 0, 0,
-              0, 0, 1, 0,
-              0, 0, 0, 1];
-    }
-    return transformList.map(convertItemToMatrix).reduce(multiplyMatrices);
-  }
-
-  function makeMatrixDecomposition(transformList) {
-    return [decomposeMatrix(convertToMatrix(transformList))];
-  }
-
-  scope.dot = dot;
-  scope.makeMatrixDecomposition = makeMatrixDecomposition;
-  scope.transformListToMatrix = convertToMatrix;
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/matrix-interpolation.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/matrix-interpolation.js
deleted file mode 100644
index 9a35de3..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/matrix-interpolation.js
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-  var composeMatrix = (function() {
-    function multiply(a, b) {
-      var result = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]];
-      for (var i = 0; i < 4; i++) {
-        for (var j = 0; j < 4; j++) {
-          for (var k = 0; k < 4; k++) {
-            result[i][j] += b[i][k] * a[k][j];
-          }
-        }
-      }
-      return result;
-    }
-
-    function is2D(m) {
-      return (
-          m[0][2] == 0 &&
-          m[0][3] == 0 &&
-          m[1][2] == 0 &&
-          m[1][3] == 0 &&
-          m[2][0] == 0 &&
-          m[2][1] == 0 &&
-          m[2][2] == 1 &&
-          m[2][3] == 0 &&
-          m[3][2] == 0 &&
-          m[3][3] == 1);
-    }
-
-    function composeMatrix(translate, scale, skew, quat, perspective) {
-      var matrix = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
-
-      for (var i = 0; i < 4; i++) {
-        matrix[i][3] = perspective[i];
-      }
-
-      for (var i = 0; i < 3; i++) {
-        for (var j = 0; j < 3; j++) {
-          matrix[3][i] += translate[j] * matrix[j][i];
-        }
-      }
-
-      var x = quat[0], y = quat[1], z = quat[2], w = quat[3];
-
-      var rotMatrix = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
-
-      rotMatrix[0][0] = 1 - 2 * (y * y + z * z);
-      rotMatrix[0][1] = 2 * (x * y - z * w);
-      rotMatrix[0][2] = 2 * (x * z + y * w);
-      rotMatrix[1][0] = 2 * (x * y + z * w);
-      rotMatrix[1][1] = 1 - 2 * (x * x + z * z);
-      rotMatrix[1][2] = 2 * (y * z - x * w);
-      rotMatrix[2][0] = 2 * (x * z - y * w);
-      rotMatrix[2][1] = 2 * (y * z + x * w);
-      rotMatrix[2][2] = 1 - 2 * (x * x + y * y);
-
-      matrix = multiply(matrix, rotMatrix);
-
-      var temp = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
-      if (skew[2]) {
-        temp[2][1] = skew[2];
-        matrix = multiply(matrix, temp);
-      }
-
-      if (skew[1]) {
-        temp[2][1] = 0;
-        temp[2][0] = skew[0];
-        matrix = multiply(matrix, temp);
-      }
-
-      if (skew[0]) {
-        temp[2][0] = 0;
-        temp[1][0] = skew[0];
-        matrix = multiply(matrix, temp);
-      }
-
-      for (var i = 0; i < 3; i++) {
-        for (var j = 0; j < 3; j++) {
-          matrix[i][j] *= scale[i];
-        }
-      }
-
-      if (is2D(matrix)) {
-        return [matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[3][0], matrix[3][1]];
-      }
-      return matrix[0].concat(matrix[1], matrix[2], matrix[3]);
-    }
-    return composeMatrix;
-  })();
-
-  function clamp(x, min, max) {
-    return Math.max(Math.min(x, max), min);
-  };
-
-  function quat(fromQ, toQ, f) {
-    var product = scope.dot(fromQ, toQ);
-    product = clamp(product, -1.0, 1.0);
-
-    var quat = [];
-    if (product === 1.0) {
-      quat = fromQ;
-    } else {
-      var theta = Math.acos(product);
-      var w = Math.sin(f * theta) * 1 / Math.sqrt(1 - product * product);
-
-      for (var i = 0; i < 4; i++) {
-        quat.push(fromQ[i] * (Math.cos(f * theta) - product * w) +
-                  toQ[i] * w);
-      }
-    }
-    return quat;
-  }
-
-  scope.composeMatrix = composeMatrix;
-  scope.quat = quat;
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/normalize-keyframes.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/normalize-keyframes.js
deleted file mode 100644
index 1fd0254..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/normalize-keyframes.js
+++ /dev/null
@@ -1,321 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, testing) {
-  var shorthandToLonghand = {
-    background: [
-      'backgroundImage',
-      'backgroundPosition',
-      'backgroundSize',
-      'backgroundRepeat',
-      'backgroundAttachment',
-      'backgroundOrigin',
-      'backgroundClip',
-      'backgroundColor'
-    ],
-    border: [
-      'borderTopColor',
-      'borderTopStyle',
-      'borderTopWidth',
-      'borderRightColor',
-      'borderRightStyle',
-      'borderRightWidth',
-      'borderBottomColor',
-      'borderBottomStyle',
-      'borderBottomWidth',
-      'borderLeftColor',
-      'borderLeftStyle',
-      'borderLeftWidth'
-    ],
-    borderBottom: [
-      'borderBottomWidth',
-      'borderBottomStyle',
-      'borderBottomColor'
-    ],
-    borderColor: [
-      'borderTopColor',
-      'borderRightColor',
-      'borderBottomColor',
-      'borderLeftColor'
-    ],
-    borderLeft: [
-      'borderLeftWidth',
-      'borderLeftStyle',
-      'borderLeftColor'
-    ],
-    borderRadius: [
-      'borderTopLeftRadius',
-      'borderTopRightRadius',
-      'borderBottomRightRadius',
-      'borderBottomLeftRadius'
-    ],
-    borderRight: [
-      'borderRightWidth',
-      'borderRightStyle',
-      'borderRightColor'
-    ],
-    borderTop: [
-      'borderTopWidth',
-      'borderTopStyle',
-      'borderTopColor'
-    ],
-    borderWidth: [
-      'borderTopWidth',
-      'borderRightWidth',
-      'borderBottomWidth',
-      'borderLeftWidth'
-    ],
-    flex: [
-      'flexGrow',
-      'flexShrink',
-      'flexBasis'
-    ],
-    font: [
-      'fontFamily',
-      'fontSize',
-      'fontStyle',
-      'fontVariant',
-      'fontWeight',
-      'lineHeight'
-    ],
-    margin: [
-      'marginTop',
-      'marginRight',
-      'marginBottom',
-      'marginLeft'
-    ],
-    outline: [
-      'outlineColor',
-      'outlineStyle',
-      'outlineWidth'
-    ],
-    padding: [
-      'paddingTop',
-      'paddingRight',
-      'paddingBottom',
-      'paddingLeft'
-    ]
-  };
-
-  var shorthandExpanderElem = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
-
-  var borderWidthAliases = {
-    thin: '1px',
-    medium: '3px',
-    thick: '5px'
-  };
-
-  var aliases = {
-    borderBottomWidth: borderWidthAliases,
-    borderLeftWidth: borderWidthAliases,
-    borderRightWidth: borderWidthAliases,
-    borderTopWidth: borderWidthAliases,
-    fontSize: {
-      'xx-small': '60%',
-      'x-small': '75%',
-      'small': '89%',
-      'medium': '100%',
-      'large': '120%',
-      'x-large': '150%',
-      'xx-large': '200%'
-    },
-    fontWeight: {
-      normal: '400',
-      bold: '700'
-    },
-    outlineWidth: borderWidthAliases,
-    textShadow: {
-      none: '0px 0px 0px transparent'
-    },
-    boxShadow: {
-      none: '0px 0px 0px 0px transparent'
-    }
-  };
-
-  function antiAlias(property, value) {
-    if (property in aliases) {
-      return aliases[property][value] || value;
-    }
-    return value;
-  }
-
-  function isNotAnimatable(property) {
-    // https://w3c.github.io/web-animations/#concept-not-animatable
-    return property === 'display' || property.lastIndexOf('animation', 0) === 0 || property.lastIndexOf('transition', 0) === 0;
-  }
-
-  // This delegates parsing shorthand value syntax to the browser.
-  function expandShorthandAndAntiAlias(property, value, result) {
-    if (isNotAnimatable(property)) {
-      return;
-    }
-    var longProperties = shorthandToLonghand[property];
-    if (longProperties) {
-      shorthandExpanderElem.style[property] = value;
-      for (var i in longProperties) {
-        var longProperty = longProperties[i];
-        var longhandValue = shorthandExpanderElem.style[longProperty];
-        result[longProperty] = antiAlias(longProperty, longhandValue);
-      }
-    } else {
-      result[property] = antiAlias(property, value);
-    }
-  };
-
-  function convertToArrayForm(effectInput) {
-    var normalizedEffectInput = [];
-
-    for (var property in effectInput) {
-      if (property in ['easing', 'offset', 'composite']) {
-        continue;
-      }
-
-      var values = effectInput[property];
-      if (!Array.isArray(values)) {
-        values = [values];
-      }
-
-      var keyframe;
-      var numKeyframes = values.length;
-      for (var i = 0; i < numKeyframes; i++) {
-        keyframe = {};
-
-        if ('offset' in effectInput) {
-          keyframe.offset = effectInput.offset;
-        } else if (numKeyframes == 1) {
-          keyframe.offset = 1.0;
-        } else {
-          keyframe.offset = i / (numKeyframes - 1.0);
-        }
-
-        if ('easing' in effectInput) {
-          keyframe.easing = effectInput.easing;
-        }
-
-        if ('composite' in effectInput) {
-          keyframe.composite = effectInput.composite;
-        }
-
-        keyframe[property] = values[i];
-
-        normalizedEffectInput.push(keyframe);
-      }
-    }
-
-    normalizedEffectInput.sort(function(a, b) { return a.offset - b.offset; });
-    return normalizedEffectInput;
-  };
-
-  function normalizeKeyframes(effectInput) {
-    if (effectInput == null) {
-      return [];
-    }
-
-    if (window.Symbol && Symbol.iterator && Array.prototype.from && effectInput[Symbol.iterator]) {
-      // Handle custom iterables in most browsers by converting to an array
-      effectInput = Array.from(effectInput);
-    }
-
-    if (!Array.isArray(effectInput)) {
-      effectInput = convertToArrayForm(effectInput);
-    }
-
-    var keyframes = effectInput.map(function(originalKeyframe) {
-      var keyframe = {};
-      for (var member in originalKeyframe) {
-        var memberValue = originalKeyframe[member];
-        if (member == 'offset') {
-          if (memberValue != null) {
-            memberValue = Number(memberValue);
-            if (!isFinite(memberValue))
-              throw new TypeError('Keyframe offsets must be numbers.');
-            if (memberValue < 0 || memberValue > 1)
-              throw new TypeError('Keyframe offsets must be between 0 and 1.');
-          }
-        } else if (member == 'composite') {
-          if (memberValue == 'add' || memberValue == 'accumulate') {
-            throw {
-              type: DOMException.NOT_SUPPORTED_ERR,
-              name: 'NotSupportedError',
-              message: 'add compositing is not supported'
-            };
-          } else if (memberValue != 'replace') {
-            throw new TypeError('Invalid composite mode ' + memberValue + '.');
-          }
-        } else if (member == 'easing') {
-          memberValue = shared.normalizeEasing(memberValue);
-        } else {
-          memberValue = '' + memberValue;
-        }
-        expandShorthandAndAntiAlias(member, memberValue, keyframe);
-      }
-      if (keyframe.offset == undefined)
-        keyframe.offset = null;
-      if (keyframe.easing == undefined)
-        keyframe.easing = 'linear';
-      return keyframe;
-    });
-
-    var everyFrameHasOffset = true;
-    var looselySortedByOffset = true;
-    var previousOffset = -Infinity;
-    for (var i = 0; i < keyframes.length; i++) {
-      var offset = keyframes[i].offset;
-      if (offset != null) {
-        if (offset < previousOffset) {
-          throw new TypeError('Keyframes are not loosely sorted by offset. Sort or specify offsets.');
-        }
-        previousOffset = offset;
-      } else {
-        everyFrameHasOffset = false;
-      }
-    }
-
-    keyframes = keyframes.filter(function(keyframe) {
-      return keyframe.offset >= 0 && keyframe.offset <= 1;
-    });
-
-    function spaceKeyframes() {
-      var length = keyframes.length;
-      if (keyframes[length - 1].offset == null)
-        keyframes[length - 1].offset = 1;
-      if (length > 1 && keyframes[0].offset == null)
-        keyframes[0].offset = 0;
-
-      var previousIndex = 0;
-      var previousOffset = keyframes[0].offset;
-      for (var i = 1; i < length; i++) {
-        var offset = keyframes[i].offset;
-        if (offset != null) {
-          for (var j = 1; j < i - previousIndex; j++)
-            keyframes[previousIndex + j].offset = previousOffset + (offset - previousOffset) * j / (i - previousIndex);
-          previousIndex = i;
-          previousOffset = offset;
-        }
-      }
-    }
-    if (!everyFrameHasOffset)
-      spaceKeyframes();
-
-    return keyframes;
-  }
-
-  shared.convertToArrayForm = convertToArrayForm;
-  shared.normalizeKeyframes = normalizeKeyframes;
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.normalizeKeyframes = normalizeKeyframes;
-  }
-
-})(webAnimationsShared, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/number-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/number-handler.js
deleted file mode 100644
index 7d0e7f9..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/number-handler.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  function numberToString(x) {
-    return x.toFixed(3).replace(/0+$/, '').replace(/\.$/, '');
-  }
-
-  function clamp(min, max, x) {
-    return Math.min(max, Math.max(min, x));
-  }
-
-  function parseNumber(string) {
-    if (/^\s*[-+]?(\d*\.)?\d+\s*$/.test(string))
-      return Number(string);
-  }
-
-  function mergeNumbers(left, right) {
-    return [left, right, numberToString];
-  }
-
-  // FIXME: This should probably go in it's own handler.
-  function mergeFlex(left, right) {
-    if (left == 0)
-      return;
-    return clampedMergeNumbers(0, Infinity)(left, right);
-  }
-
-  function mergePositiveIntegers(left, right) {
-    return [left, right, function(x) {
-      return Math.round(clamp(1, Infinity, x));
-    }];
-  }
-
-  function clampedMergeNumbers(min, max) {
-    return function(left, right) {
-      return [left, right, function(x) {
-        return numberToString(clamp(min, max, x));
-      }];
-    };
-  }
-
-  function parseNumberList(string) {
-    var items = string.trim().split(/\s*[\s,]\s*/);
-    if (items.length === 0) {
-      return;
-    }
-    var result = [];
-    for (var i = 0; i < items.length; i++) {
-      var number = parseNumber(items[i]);
-      if (number === undefined) {
-        return;
-      }
-      result.push(number);
-    }
-    return result;
-  }
-
-  function mergeNumberLists(left, right) {
-    if (left.length != right.length) {
-      return;
-    }
-    return [left, right, function(numberList) {
-      return numberList.map(numberToString).join(' ');
-    }];
-  }
-
-  function round(left, right) {
-    return [left, right, Math.round];
-  }
-
-  scope.clamp = clamp;
-  scope.addPropertiesHandler(parseNumberList, mergeNumberLists, ['stroke-dasharray']);
-  scope.addPropertiesHandler(parseNumber, clampedMergeNumbers(0, Infinity), ['border-image-width', 'line-height']);
-  scope.addPropertiesHandler(parseNumber, clampedMergeNumbers(0, 1), ['opacity', 'shape-image-threshold']);
-  scope.addPropertiesHandler(parseNumber, mergeFlex, ['flex-grow', 'flex-shrink']);
-  scope.addPropertiesHandler(parseNumber, mergePositiveIntegers, ['orphans', 'widows']);
-  scope.addPropertiesHandler(parseNumber, round, ['z-index']);
-
-  scope.parseNumber = parseNumber;
-  scope.parseNumberList = parseNumberList;
-  scope.mergeNumbers = mergeNumbers;
-  scope.numberToString = numberToString;
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/position-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/position-handler.js
deleted file mode 100644
index 18cea43..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/position-handler.js
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-
-  function negateDimension(dimension) {
-    var result = {};
-    for (var k in dimension) {
-      result[k] = -dimension[k];
-    }
-    return result;
-  }
-
-  function consumeOffset(string) {
-    return scope.consumeToken(/^(left|center|right|top|bottom)\b/i, string) || scope.consumeLengthOrPercent(string);
-  }
-
-  var offsetMap = {
-    left: {'%': 0},
-    center: {'%': 50},
-    right: {'%': 100},
-    top: {'%': 0},
-    bottom: {'%': 100},
-  };
-
-  function parseOrigin(slots, string) {
-    var result = scope.consumeRepeated(consumeOffset, /^/, string);
-    if (!result || result[1] != '') return;
-    var tokens = result[0];
-    tokens[0] = tokens[0] || 'center';
-    tokens[1] = tokens[1] || 'center';
-    if (slots == 3) {
-      tokens[2] = tokens[2] || {px: 0};
-    }
-    if (tokens.length != slots) {
-      return;
-    }
-    // Reorder so that the horizontal axis comes first.
-    if (/top|bottom/.test(tokens[0]) || /left|right/.test(tokens[1])) {
-      var tmp = tokens[0];
-      tokens[0] = tokens[1];
-      tokens[1] = tmp;
-    }
-    // Invalid if not horizontal then vertical.
-    if (!/left|right|center|Object/.test(tokens[0]))
-      return;
-    if (!/top|bottom|center|Object/.test(tokens[1]))
-      return;
-    return tokens.map(function(position) {
-      return typeof position == 'object' ? position : offsetMap[position];
-    });
-  }
-
-  var mergeOffsetList = scope.mergeNestedRepeated.bind(null, scope.mergeDimensions, ' ');
-  scope.addPropertiesHandler(parseOrigin.bind(null, 3), mergeOffsetList, ['transform-origin']);
-  scope.addPropertiesHandler(parseOrigin.bind(null, 2), mergeOffsetList, ['perspective-origin']);
-
-  function consumePosition(string) {
-    var result = scope.consumeRepeated(consumeOffset, /^/, string);
-    if (!result) {
-      return;
-    }
-
-    var tokens = result[0];
-    var out = [{'%': 50}, {'%': 50}];
-    var pos = 0;
-    var bottomOrRight = false;
-
-    for (var i = 0; i < tokens.length; i++) {
-      var token = tokens[i];
-      if (typeof token == 'string') {
-        bottomOrRight = /bottom|right/.test(token);
-        pos = {left: 0, right: 0, center: pos, top: 1, bottom: 1}[token];
-        out[pos] = offsetMap[token];
-        if (token == 'center') {
-          // Center doesn't accept a length offset.
-          pos++;
-        }
-      } else {
-        if (bottomOrRight) {
-          // If bottom or right we need to subtract the length from 100%
-          token = negateDimension(token);
-          token['%'] = (token['%'] || 0) + 100;
-        }
-        out[pos] = token;
-        pos++;
-        bottomOrRight = false;
-      }
-    }
-    return [out, result[1]];
-  }
-
-  function parsePositionList(string) {
-    var result = scope.consumeRepeated(consumePosition, /^,/, string);
-    if (result && result[1] == '') {
-      return result[0];
-    }
-  }
-
-  scope.consumePosition = consumePosition;
-  scope.mergeOffsetList = mergeOffsetList;
-
-  var mergePositionList = scope.mergeNestedRepeated.bind(null, mergeOffsetList, ', ');
-  scope.addPropertiesHandler(parsePositionList, mergePositionList, ['background-position', 'object-position']);
-
-})(webAnimations1);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/property-interpolation.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/property-interpolation.js
deleted file mode 100644
index b7e594f..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/property-interpolation.js
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-
-  var propertyHandlers = {};
-
-  function toCamelCase(property) {
-    return property.replace(/-(.)/g, function(_, c) {
-      return c.toUpperCase();
-    });
-  }
-
-  function addPropertyHandler(parser, merger, property) {
-    propertyHandlers[property] = propertyHandlers[property] || [];
-    propertyHandlers[property].push([parser, merger]);
-  }
-  function addPropertiesHandler(parser, merger, properties) {
-    for (var i = 0; i < properties.length; i++) {
-      var property = properties[i];
-      WEB_ANIMATIONS_TESTING && console.assert(property.toLowerCase() === property);
-      addPropertyHandler(parser, merger, toCamelCase(property));
-    }
-  }
-  scope.addPropertiesHandler = addPropertiesHandler;
-
-  var initialValues = {
-    backgroundColor: 'transparent',
-    backgroundPosition: '0% 0%',
-    borderBottomColor: 'currentColor',
-    borderBottomLeftRadius: '0px',
-    borderBottomRightRadius: '0px',
-    borderBottomWidth: '3px',
-    borderLeftColor: 'currentColor',
-    borderLeftWidth: '3px',
-    borderRightColor: 'currentColor',
-    borderRightWidth: '3px',
-    // Spec says this should be 0 but in practise it is 2px.
-    borderSpacing: '2px',
-    borderTopColor: 'currentColor',
-    borderTopLeftRadius: '0px',
-    borderTopRightRadius: '0px',
-    borderTopWidth: '3px',
-    bottom: 'auto',
-    clip: 'rect(0px, 0px, 0px, 0px)',
-    color: 'black', // Depends on user agent.
-    fontSize: '100%',
-    fontWeight: '400',
-    height: 'auto',
-    left: 'auto',
-    letterSpacing: 'normal',
-    lineHeight: '120%',
-    marginBottom: '0px',
-    marginLeft: '0px',
-    marginRight: '0px',
-    marginTop: '0px',
-    maxHeight: 'none',
-    maxWidth: 'none',
-    minHeight: '0px',
-    minWidth: '0px',
-    opacity: '1.0',
-    outlineColor: 'invert',
-    outlineOffset: '0px',
-    outlineWidth: '3px',
-    paddingBottom: '0px',
-    paddingLeft: '0px',
-    paddingRight: '0px',
-    paddingTop: '0px',
-    right: 'auto',
-    strokeDasharray: 'none',
-    strokeDashoffset: '0px',
-    textIndent: '0px',
-    textShadow: '0px 0px 0px transparent',
-    top: 'auto',
-    transform: '',
-    verticalAlign: '0px',
-    visibility: 'visible',
-    width: 'auto',
-    wordSpacing: 'normal',
-    zIndex: 'auto'
-  };
-
-  function propertyInterpolation(property, left, right) {
-    var ucProperty = property;
-    if (/-/.test(property) && !shared.isDeprecated('Hyphenated property names', '2016-03-22', 'Use camelCase instead.', true)) {
-      ucProperty = toCamelCase(property);
-    }
-    if (left == 'initial' || right == 'initial') {
-      if (left == 'initial')
-        left = initialValues[ucProperty];
-      if (right == 'initial')
-        right = initialValues[ucProperty];
-    }
-    var handlers = left == right ? [] : propertyHandlers[ucProperty];
-    for (var i = 0; handlers && i < handlers.length; i++) {
-      var parsedLeft = handlers[i][0](left);
-      var parsedRight = handlers[i][0](right);
-      if (parsedLeft !== undefined && parsedRight !== undefined) {
-        var interpolationArgs = handlers[i][1](parsedLeft, parsedRight);
-        if (interpolationArgs) {
-          var interp = scope.Interpolation.apply(null, interpolationArgs);
-          return function(t) {
-            if (t == 0) return left;
-            if (t == 1) return right;
-            return interp(t);
-          };
-        }
-      }
-    }
-    return scope.Interpolation(false, true, function(bool) {
-      return bool ? right : left;
-    });
-  }
-  scope.propertyInterpolation = propertyInterpolation;
-
-})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/property-names.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/property-names.js
deleted file mode 100644
index f106c06..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/property-names.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  var prefixed = {};
-  var unprefixed = {};
-
-  function alias(name, aliases) {
-    aliases.concat([name]).forEach(function(candidate) {
-      if (candidate in document.documentElement.style) {
-        prefixed[name] = candidate;
-      }
-      unprefixed[candidate] = name;
-    });
-  }
-  alias('transform', ['webkitTransform', 'msTransform']);
-  alias('transformOrigin', ['webkitTransformOrigin']);
-  alias('perspective', ['webkitPerspective']);
-  alias('perspectiveOrigin', ['webkitPerspectiveOrigin']);
-
-  scope.propertyName = function(property) {
-    return prefixed[property] || property;
-  };
-  scope.unprefixedPropertyName = function(property) {
-    return unprefixed[property] || property;
-  };
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/scope.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/scope.js
deleted file mode 100644
index c824880..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/scope.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-var webAnimationsShared = {};
-var webAnimations1 = {};
-var webAnimationsNext = {};
-
-if (!WEB_ANIMATIONS_TESTING)
-  var webAnimationsTesting = null;
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/shadow-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/shadow-handler.js
deleted file mode 100644
index 3f8201d..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/shadow-handler.js
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-
-  function consumeShadow(string) {
-    var shadow = {
-      inset: false,
-      lengths: [],
-      color: null,
-    };
-    function consumePart(string) {
-      var result = scope.consumeToken(/^inset/i, string);
-      if (result) {
-        shadow.inset = true;
-        return result;
-      }
-      var result = scope.consumeLengthOrPercent(string);
-      if (result) {
-        shadow.lengths.push(result[0]);
-        return result;
-      }
-      var result = scope.consumeColor(string);
-      if (result) {
-        shadow.color = result[0];
-        return result;
-      }
-    }
-    var result = scope.consumeRepeated(consumePart, /^/, string);
-    if (result && result[0].length) {
-      return [shadow, result[1]];
-    }
-  }
-
-  function parseShadowList(string) {
-    var result = scope.consumeRepeated(consumeShadow, /^,/, string);
-    if (result && result[1] == '') {
-      return result[0];
-    }
-  }
-
-  function mergeShadow(left, right) {
-    while (left.lengths.length < Math.max(left.lengths.length, right.lengths.length))
-      left.lengths.push({px: 0});
-    while (right.lengths.length < Math.max(left.lengths.length, right.lengths.length))
-      right.lengths.push({px: 0});
-
-    if (left.inset != right.inset || !!left.color != !!right.color) {
-      return;
-    }
-    var lengthReconstitution = [];
-    var colorReconstitution;
-    var matchingLeft = [[], 0];
-    var matchingRight = [[], 0];
-    for (var i = 0; i < left.lengths.length; i++) {
-      var mergedDimensions = scope.mergeDimensions(left.lengths[i], right.lengths[i], i == 2);
-      matchingLeft[0].push(mergedDimensions[0]);
-      matchingRight[0].push(mergedDimensions[1]);
-      lengthReconstitution.push(mergedDimensions[2]);
-    }
-    if (left.color && right.color) {
-      var mergedColor = scope.mergeColors(left.color, right.color);
-      matchingLeft[1] = mergedColor[0];
-      matchingRight[1] = mergedColor[1];
-      colorReconstitution = mergedColor[2];
-    }
-    return [matchingLeft, matchingRight, function(value) {
-      var result = left.inset ? 'inset ' : ' ';
-      for (var i = 0; i < lengthReconstitution.length; i++) {
-        result += lengthReconstitution[i](value[0][i]) + ' ';
-      }
-      if (colorReconstitution) {
-        result += colorReconstitution(value[1]);
-      }
-      return result;
-    }];
-  }
-
-  function mergeNestedRepeatedShadow(nestedMerge, separator, left, right) {
-    var leftCopy = [];
-    var rightCopy = [];
-    function defaultShadow(inset) {
-      return {inset: inset, color: [0, 0, 0, 0], lengths: [{px: 0}, {px: 0}, {px: 0}, {px: 0}]};
-    }
-    for (var i = 0; i < left.length || i < right.length; i++) {
-      var l = left[i] || defaultShadow(right[i].inset);
-      var r = right[i] || defaultShadow(left[i].inset);
-      leftCopy.push(l);
-      rightCopy.push(r);
-    }
-    return scope.mergeNestedRepeated(nestedMerge, separator, leftCopy, rightCopy);
-  }
-
-  var mergeShadowList = mergeNestedRepeatedShadow.bind(null, mergeShadow, ', ');
-  scope.addPropertiesHandler(parseShadowList, mergeShadowList, ['box-shadow', 'text-shadow']);
-
-})(webAnimations1);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/shape-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/shape-handler.js
deleted file mode 100644
index 6bbf79f..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/shape-handler.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope) {
-
-  var consumeLengthOrPercent = scope.consumeParenthesised.bind(null, scope.parseLengthOrPercent);
-  var consumeLengthOrPercentPair = scope.consumeRepeated.bind(undefined, consumeLengthOrPercent, /^/);
-
-  var mergeSizePair = scope.mergeNestedRepeated.bind(undefined, scope.mergeDimensions, ' ');
-  var mergeSizePairList = scope.mergeNestedRepeated.bind(undefined, mergeSizePair, ',');
-
-  function parseShape(input) {
-    var circle = scope.consumeToken(/^circle/, input);
-    if (circle && circle[0]) {
-      return ['circle'].concat(scope.consumeList([
-        scope.ignore(scope.consumeToken.bind(undefined, /^\(/)),
-        consumeLengthOrPercent,
-        scope.ignore(scope.consumeToken.bind(undefined, /^at/)),
-        scope.consumePosition,
-        scope.ignore(scope.consumeToken.bind(undefined, /^\)/))
-      ], circle[1]));
-    }
-    var ellipse = scope.consumeToken(/^ellipse/, input);
-    if (ellipse && ellipse[0]) {
-      return ['ellipse'].concat(scope.consumeList([
-        scope.ignore(scope.consumeToken.bind(undefined, /^\(/)),
-        consumeLengthOrPercentPair,
-        scope.ignore(scope.consumeToken.bind(undefined, /^at/)),
-        scope.consumePosition,
-        scope.ignore(scope.consumeToken.bind(undefined, /^\)/))
-      ], ellipse[1]));
-    }
-    var polygon = scope.consumeToken(/^polygon/, input);
-    if (polygon && polygon[0]) {
-      return ['polygon'].concat(scope.consumeList([
-        scope.ignore(scope.consumeToken.bind(undefined, /^\(/)),
-        scope.optional(scope.consumeToken.bind(undefined, /^nonzero\s*,|^evenodd\s*,/), 'nonzero,'),
-        scope.consumeSizePairList,
-        scope.ignore(scope.consumeToken.bind(undefined, /^\)/))
-      ], polygon[1]));
-    }
-  }
-
-  function mergeShapes(left, right) {
-    if (left[0] !== right[0])
-      return;
-    if (left[0] == 'circle') {
-      return scope.mergeList(left.slice(1), right.slice(1), [
-        'circle(',
-        scope.mergeDimensions,
-        ' at ',
-        scope.mergeOffsetList,
-        ')']);
-    }
-    if (left[0] == 'ellipse') {
-      return scope.mergeList(left.slice(1), right.slice(1), [
-        'ellipse(',
-        scope.mergeNonNegativeSizePair,
-        ' at ',
-        scope.mergeOffsetList,
-        ')']);
-    }
-    if (left[0] == 'polygon' && left[1] == right[1]) {
-      return scope.mergeList(left.slice(2), right.slice(2), [
-        'polygon(',
-        left[1],
-        mergeSizePairList,
-        ')']);
-    }
-  }
-
-  scope.addPropertiesHandler(parseShape, mergeShapes, ['shape-outside']);
-
-})(webAnimations1);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/tick.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/tick.js
deleted file mode 100644
index 08b0a14..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/tick.js
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-(function(shared, scope, testing) {
-  var originalRequestAnimationFrame = window.requestAnimationFrame;
-  var rafCallbacks = [];
-  var rafId = 0;
-  window.requestAnimationFrame = function(f) {
-    var id = rafId++;
-    if (rafCallbacks.length == 0 && !WEB_ANIMATIONS_TESTING) {
-      originalRequestAnimationFrame(processRafCallbacks);
-    }
-    rafCallbacks.push([id, f]);
-    return id;
-  };
-
-  window.cancelAnimationFrame = function(id) {
-    rafCallbacks.forEach(function(entry) {
-      if (entry[0] == id) {
-        entry[1] = function() {};
-      }
-    });
-  };
-
-  function processRafCallbacks(t) {
-    var processing = rafCallbacks;
-    rafCallbacks = [];
-    if (t < timeline.currentTime)
-      t = timeline.currentTime;
-    timeline._animations.sort(compareAnimations);
-    timeline._animations = tick(t, true, timeline._animations)[0];
-    processing.forEach(function(entry) { entry[1](t); });
-    applyPendingEffects();
-    _now = undefined;
-  }
-
-  function compareAnimations(leftAnimation, rightAnimation) {
-    return leftAnimation._sequenceNumber - rightAnimation._sequenceNumber;
-  }
-
-  function InternalTimeline() {
-    this._animations = [];
-    // Android 4.3 browser has window.performance, but not window.performance.now
-    this.currentTime = window.performance && performance.now ? performance.now() : 0;
-  };
-
-  InternalTimeline.prototype = {
-    _play: function(effect) {
-      effect._timing = shared.normalizeTimingInput(effect.timing);
-      var animation = new scope.Animation(effect);
-      animation._idle = false;
-      animation._timeline = this;
-      this._animations.push(animation);
-      scope.restart();
-      scope.applyDirtiedAnimation(animation);
-      return animation;
-    }
-  };
-
-  var _now = undefined;
-
-  if (WEB_ANIMATIONS_TESTING) {
-    var now = function() { return timeline.currentTime; };
-  } else {
-    var now = function() {
-      if (_now == undefined)
-        _now = window.performance && performance.now ? performance.now() : Date.now();
-      return _now;
-    };
-  }
-
-  var ticking = false;
-  var hasRestartedThisFrame = false;
-
-  scope.restart = function() {
-    if (!ticking) {
-      ticking = true;
-      requestAnimationFrame(function() {});
-      hasRestartedThisFrame = true;
-    }
-    return hasRestartedThisFrame;
-  };
-
-  // RAF is supposed to be the last script to occur before frame rendering but not
-  // all browsers behave like this. This function is for synchonously updating an
-  // animation's effects whenever its state is mutated by script to work around
-  // incorrect script execution ordering by the browser.
-  scope.applyDirtiedAnimation = function(animation) {
-    if (inTick) {
-      return;
-    }
-    animation._markTarget();
-    var animations = animation._targetAnimations();
-    animations.sort(compareAnimations);
-    var inactiveAnimations = tick(scope.timeline.currentTime, false, animations.slice())[1];
-    inactiveAnimations.forEach(function(animation) {
-      var index = timeline._animations.indexOf(animation);
-      if (index !== -1) {
-        timeline._animations.splice(index, 1);
-      }
-    });
-    applyPendingEffects();
-  };
-
-  var pendingEffects = [];
-  function applyPendingEffects() {
-    pendingEffects.forEach(function(f) { f(); });
-    pendingEffects.length = 0;
-  }
-
-  var t60hz = 1000 / 60;
-
-  var inTick = false;
-  function tick(t, isAnimationFrame, updatingAnimations) {
-    inTick = true;
-    hasRestartedThisFrame = false;
-    var timeline = scope.timeline;
-
-    timeline.currentTime = t;
-    ticking = false;
-
-    var newPendingClears = [];
-    var newPendingEffects = [];
-    var activeAnimations = [];
-    var inactiveAnimations = [];
-    updatingAnimations.forEach(function(animation) {
-      animation._tick(t, isAnimationFrame);
-
-      if (!animation._inEffect) {
-        newPendingClears.push(animation._effect);
-        animation._unmarkTarget();
-      } else {
-        newPendingEffects.push(animation._effect);
-        animation._markTarget();
-      }
-
-      if (animation._needsTick)
-        ticking = true;
-
-      var alive = animation._inEffect || animation._needsTick;
-      animation._inTimeline = alive;
-      if (alive) {
-        activeAnimations.push(animation);
-      } else {
-        inactiveAnimations.push(animation);
-      }
-    });
-
-    // FIXME: Should remove dupliactes from pendingEffects.
-    pendingEffects.push.apply(pendingEffects, newPendingClears);
-    pendingEffects.push.apply(pendingEffects, newPendingEffects);
-
-    if (ticking)
-      requestAnimationFrame(function() {});
-
-    inTick = false;
-    return [activeAnimations, inactiveAnimations];
-  };
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.tick = function(t) { timeline.currentTime = t; processRafCallbacks(t); };
-    testing.isTicking = function() { return ticking; };
-    testing.setTicking = function(newVal) { ticking = newVal; };
-  }
-
-  var timeline = new InternalTimeline();
-  scope.timeline = timeline;
-
-})(webAnimationsShared, webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/timeline.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/timeline.js
deleted file mode 100644
index 2b213b5..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/timeline.js
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-(function(shared, scope, testing) {
-  var originalRequestAnimationFrame = window.requestAnimationFrame;
-  window.requestAnimationFrame = function(f) {
-    return originalRequestAnimationFrame(function(x) {
-      scope.timeline._updateAnimationsPromises();
-      f(x);
-      scope.timeline._updateAnimationsPromises();
-    });
-  };
-
-  scope.AnimationTimeline = function() {
-    this._animations = [];
-    this.currentTime = undefined;
-  };
-
-  scope.AnimationTimeline.prototype = {
-    getAnimations: function() {
-      this._discardAnimations();
-      return this._animations.slice();
-    },
-    _updateAnimationsPromises: function() {
-      scope.animationsWithPromises = scope.animationsWithPromises.filter(function(animation) {
-        return animation._updatePromises();
-      });
-    },
-    _discardAnimations: function() {
-      this._updateAnimationsPromises();
-      this._animations = this._animations.filter(function(animation) {
-        return animation.playState != 'finished' && animation.playState != 'idle';
-      });
-    },
-    _play: function(effect) {
-      var animation = new scope.Animation(effect, this);
-      this._animations.push(animation);
-      scope.restartWebAnimationsNextTick();
-      // Use animation._animation.play() here, NOT animation.play().
-      //
-      // Timeline.play calls new scope.Animation(effect) which (indirectly) calls Timeline.play on
-      // effect's children, and Animation.play is also recursive. We only need to call play on each
-      // animation in the tree once.
-      animation._updatePromises();
-      animation._animation.play();
-      animation._updatePromises();
-      return animation;
-    },
-    play: function(effect) {
-      if (effect) {
-        effect.remove();
-      }
-      return this._play(effect);
-    }
-  };
-
-  var ticking = false;
-
-  scope.restartWebAnimationsNextTick = function() {
-    if (!ticking) {
-      ticking = true;
-      requestAnimationFrame(webAnimationsNextTick);
-    }
-  };
-
-  function webAnimationsNextTick(t) {
-    var timeline = scope.timeline;
-    timeline.currentTime = t;
-    timeline._discardAnimations();
-    if (timeline._animations.length == 0)
-      ticking = false;
-    else
-      requestAnimationFrame(webAnimationsNextTick);
-  }
-
-  var timeline = new scope.AnimationTimeline();
-  scope.timeline = timeline;
-
-  try {
-    Object.defineProperty(window.document, 'timeline', {
-      configurable: true,
-      get: function() { return timeline; }
-    });
-  } catch (e) { }
-  try {
-    window.document.timeline = timeline;
-  } catch (e) { }
-
-})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/timing-utilities.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/timing-utilities.js
deleted file mode 100644
index 2f16f3b..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/timing-utilities.js
+++ /dev/null
@@ -1,420 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, testing) {
-
-  var fills = 'backwards|forwards|both|none'.split('|');
-  var directions = 'reverse|alternate|alternate-reverse'.split('|');
-  var linear = function(x) { return x; };
-
-  function cloneTimingInput(timingInput) {
-    if (typeof timingInput == 'number') {
-      return timingInput;
-    }
-    var clone = {};
-    for (var m in timingInput) {
-      clone[m] = timingInput[m];
-    }
-    return clone;
-  }
-
-  function AnimationEffectTiming() {
-    this._delay = 0;
-    this._endDelay = 0;
-    this._fill = 'none';
-    this._iterationStart = 0;
-    this._iterations = 1;
-    this._duration = 0;
-    this._playbackRate = 1;
-    this._direction = 'normal';
-    this._easing = 'linear';
-    this._easingFunction = linear;
-  }
-
-  function isInvalidTimingDeprecated() {
-    return shared.isDeprecated('Invalid timing inputs', '2016-03-02', 'TypeError exceptions will be thrown instead.', true);
-  }
-
-  AnimationEffectTiming.prototype = {
-    _setMember: function(member, value) {
-      this['_' + member] = value;
-      if (this._effect) {
-        this._effect._timingInput[member] = value;
-        this._effect._timing = shared.normalizeTimingInput(this._effect._timingInput);
-        this._effect.activeDuration = shared.calculateActiveDuration(this._effect._timing);
-        if (this._effect._animation) {
-          this._effect._animation._rebuildUnderlyingAnimation();
-        }
-      }
-    },
-    get playbackRate() {
-      return this._playbackRate;
-    },
-    set delay(value) {
-      this._setMember('delay', value);
-    },
-    get delay() {
-      return this._delay;
-    },
-    set endDelay(value) {
-      this._setMember('endDelay', value);
-    },
-    get endDelay() {
-      return this._endDelay;
-    },
-    set fill(value) {
-      this._setMember('fill', value);
-    },
-    get fill() {
-      return this._fill;
-    },
-    set iterationStart(value) {
-      if ((isNaN(value) || value < 0) && isInvalidTimingDeprecated()) {
-        throw new TypeError('iterationStart must be a non-negative number, received: ' + timing.iterationStart);
-      }
-      this._setMember('iterationStart', value);
-    },
-    get iterationStart() {
-      return this._iterationStart;
-    },
-    set duration(value) {
-      if (value != 'auto' && (isNaN(value) || value < 0) && isInvalidTimingDeprecated()) {
-        throw new TypeError('duration must be non-negative or auto, received: ' + value);
-      }
-      this._setMember('duration', value);
-    },
-    get duration() {
-      return this._duration;
-    },
-    set direction(value) {
-      this._setMember('direction', value);
-    },
-    get direction() {
-      return this._direction;
-    },
-    set easing(value) {
-      this._easingFunction = parseEasingFunction(normalizeEasing(value));
-      this._setMember('easing', value);
-    },
-    get easing() {
-      return this._easing;
-    },
-    set iterations(value) {
-      if ((isNaN(value) || value < 0) && isInvalidTimingDeprecated()) {
-        throw new TypeError('iterations must be non-negative, received: ' + value);
-      }
-      this._setMember('iterations', value);
-    },
-    get iterations() {
-      return this._iterations;
-    }
-  };
-
-  function makeTiming(timingInput, forGroup, effect) {
-    var timing = new AnimationEffectTiming();
-    if (forGroup) {
-      timing.fill = 'both';
-      timing.duration = 'auto';
-    }
-    if (typeof timingInput == 'number' && !isNaN(timingInput)) {
-      timing.duration = timingInput;
-    } else if (timingInput !== undefined) {
-      Object.getOwnPropertyNames(timingInput).forEach(function(property) {
-        if (timingInput[property] != 'auto') {
-          if (typeof timing[property] == 'number' || property == 'duration') {
-            if (typeof timingInput[property] != 'number' || isNaN(timingInput[property])) {
-              return;
-            }
-          }
-          if ((property == 'fill') && (fills.indexOf(timingInput[property]) == -1)) {
-            return;
-          }
-          if ((property == 'direction') && (directions.indexOf(timingInput[property]) == -1)) {
-            return;
-          }
-          if (property == 'playbackRate' && timingInput[property] !== 1 && shared.isDeprecated('AnimationEffectTiming.playbackRate', '2014-11-28', 'Use Animation.playbackRate instead.')) {
-            return;
-          }
-          timing[property] = timingInput[property];
-        }
-      });
-    }
-    return timing;
-  }
-
-  function numericTimingToObject(timingInput) {
-    if (typeof timingInput == 'number') {
-      if (isNaN(timingInput)) {
-        timingInput = { duration: 0 };
-      } else {
-        timingInput = { duration: timingInput };
-      }
-    }
-    return timingInput;
-  }
-
-  function normalizeTimingInput(timingInput, forGroup) {
-    timingInput = shared.numericTimingToObject(timingInput);
-    return makeTiming(timingInput, forGroup);
-  }
-
-  function cubic(a, b, c, d) {
-    if (a < 0 || a > 1 || c < 0 || c > 1) {
-      return linear;
-    }
-    return function(x) {
-      if (x <= 0) {
-        var start_gradient = 0;
-        if (a > 0)
-          start_gradient = b / a;
-        else if (!b && c > 0)
-          start_gradient = d / c;
-        return start_gradient * x;
-      }
-      if (x >= 1) {
-        var end_gradient = 0;
-        if (c < 1)
-          end_gradient = (d - 1) / (c - 1);
-        else if (c == 1 && a < 1)
-          end_gradient = (b - 1) / (a - 1);
-        return 1 + end_gradient * (x - 1);
-      }
-
-      var start = 0, end = 1;
-      while (start < end) {
-        var mid = (start + end) / 2;
-        function f(a, b, m) { return 3 * a * (1 - m) * (1 - m) * m + 3 * b * (1 - m) * m * m + m * m * m};
-        var xEst = f(a, c, mid);
-        if (Math.abs(x - xEst) < 0.00001) {
-          return f(b, d, mid);
-        }
-        if (xEst < x) {
-          start = mid;
-        } else {
-          end = mid;
-        }
-      }
-      return f(b, d, mid);
-    }
-  }
-
-  var Start = 1;
-  var Middle = 0.5;
-  var End = 0;
-
-  function step(count, pos) {
-    return function(x) {
-      if (x >= 1) {
-        return 1;
-      }
-      var stepSize = 1 / count;
-      x += pos * stepSize;
-      return x - x % stepSize;
-    }
-  }
-
-  var presets = {
-    'ease': cubic(0.25, 0.1, 0.25, 1),
-    'ease-in': cubic(0.42, 0, 1, 1),
-    'ease-out': cubic(0, 0, 0.58, 1),
-    'ease-in-out': cubic(0.42, 0, 0.58, 1),
-    'step-start': step(1, Start),
-    'step-middle': step(1, Middle),
-    'step-end': step(1, End)
-  };
-
-  var styleForCleaning = null;
-  var numberString = '\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*';
-  var cubicBezierRe = new RegExp('cubic-bezier\\(' + numberString + ',' + numberString + ',' + numberString + ',' + numberString + '\\)');
-  var stepRe = /steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/;
-
-  function normalizeEasing(easing) {
-    if (!styleForCleaning) {
-      styleForCleaning = document.createElement('div').style;
-    }
-    styleForCleaning.animationTimingFunction = '';
-    styleForCleaning.animationTimingFunction = easing;
-    var normalizedEasing = styleForCleaning.animationTimingFunction;
-    if (normalizedEasing == '' && isInvalidTimingDeprecated()) {
-      throw new TypeError(easing + ' is not a valid value for easing');
-    }
-    return normalizedEasing;
-  }
-
-  function parseEasingFunction(normalizedEasing) {
-    if (normalizedEasing == 'linear') {
-      return linear;
-    }
-    var cubicData = cubicBezierRe.exec(normalizedEasing);
-    if (cubicData) {
-      return cubic.apply(this, cubicData.slice(1).map(Number));
-    }
-    var stepData = stepRe.exec(normalizedEasing);
-    if (stepData) {
-      return step(Number(stepData[1]), {'start': Start, 'middle': Middle, 'end': End}[stepData[2]]);
-    }
-    var preset = presets[normalizedEasing];
-    if (preset) {
-      return preset;
-    }
-    // At this point none of our parse attempts succeeded; the easing is invalid.
-    // Fall back to linear in the interest of not crashing the page.
-    return linear;
-  }
-
-  function calculateActiveDuration(timing) {
-    return Math.abs(repeatedDuration(timing) / timing.playbackRate);
-  }
-
-  function repeatedDuration(timing) {
-    // https://w3c.github.io/web-animations/#calculating-the-active-duration
-    if (timing.duration === 0 || timing.iterations === 0) {
-      return 0;
-    }
-    return timing.duration * timing.iterations;
-  }
-
-  var PhaseNone = 0;
-  var PhaseBefore = 1;
-  var PhaseAfter = 2;
-  var PhaseActive = 3;
-
-  function calculatePhase(activeDuration, localTime, timing) {
-    // https://w3c.github.io/web-animations/#animation-effect-phases-and-states
-    if (localTime == null) {
-      return PhaseNone;
-    }
-
-    var endTime = timing.delay + activeDuration + timing.endDelay;
-    if (localTime < Math.min(timing.delay, endTime)) {
-      return PhaseBefore;
-    }
-    if (localTime >= Math.min(timing.delay + activeDuration, endTime)) {
-      return PhaseAfter;
-    }
-
-    return PhaseActive;
-  }
-
-  function calculateActiveTime(activeDuration, fillMode, localTime, phase, delay) {
-    // https://w3c.github.io/web-animations/#calculating-the-active-time
-    switch (phase) {
-      case PhaseBefore:
-        if (fillMode == 'backwards' || fillMode == 'both')
-          return 0;
-        return null;
-      case PhaseActive:
-        return localTime - delay;
-      case PhaseAfter:
-        if (fillMode == 'forwards' || fillMode == 'both')
-          return activeDuration;
-        return null;
-      case PhaseNone:
-        return null;
-    }
-  }
-
-  function calculateOverallProgress(iterationDuration, phase, iterations, activeTime, iterationStart) {
-    // https://w3c.github.io/web-animations/#calculating-the-overall-progress
-    var overallProgress = iterationStart;
-    if (iterationDuration === 0) {
-      if (phase !== PhaseBefore) {
-        overallProgress += iterations;
-      }
-    } else {
-      overallProgress += activeTime / iterationDuration;
-    }
-    return overallProgress;
-  }
-
-  function calculateSimpleIterationProgress(overallProgress, iterationStart, phase, iterations, activeTime, iterationDuration) {
-    // https://w3c.github.io/web-animations/#calculating-the-simple-iteration-progress
-
-    var simpleIterationProgress = (overallProgress === Infinity) ? iterationStart % 1 : overallProgress % 1;
-    if (simpleIterationProgress === 0 && phase === PhaseAfter && iterations !== 0 &&
-        (activeTime !== 0 || iterationDuration === 0)) {
-      simpleIterationProgress = 1;
-    }
-    return simpleIterationProgress;
-  }
-
-  function calculateCurrentIteration(phase, iterations, simpleIterationProgress, overallProgress) {
-    // https://w3c.github.io/web-animations/#calculating-the-current-iteration
-    if (phase === PhaseAfter && iterations === Infinity) {
-      return Infinity;
-    }
-    if (simpleIterationProgress === 1) {
-      return Math.floor(overallProgress) - 1;
-    }
-    return Math.floor(overallProgress);
-  }
-
-  function calculateDirectedProgress(playbackDirection, currentIteration, simpleIterationProgress) {
-    // https://w3c.github.io/web-animations/#calculating-the-directed-progress
-    var currentDirection = playbackDirection;
-    if (playbackDirection !== 'normal' && playbackDirection !== 'reverse') {
-      var d = currentIteration;
-      if (playbackDirection === 'alternate-reverse') {
-        d += 1;
-      }
-      currentDirection = 'normal';
-      if (d !== Infinity && d % 2 !== 0) {
-        currentDirection = 'reverse';
-      }
-    }
-    if (currentDirection === 'normal') {
-      return simpleIterationProgress;
-    }
-    return 1 - simpleIterationProgress;
-  }
-
-  function calculateIterationProgress(activeDuration, localTime, timing) {
-    var phase = calculatePhase(activeDuration, localTime, timing);
-    var activeTime = calculateActiveTime(activeDuration, timing.fill, localTime, phase, timing.delay);
-    if (activeTime === null)
-      return null;
-
-    var overallProgress = calculateOverallProgress(timing.duration, phase, timing.iterations, activeTime, timing.iterationStart);
-    var simpleIterationProgress = calculateSimpleIterationProgress(overallProgress, timing.iterationStart, phase, timing.iterations, activeTime, timing.duration);
-    var currentIteration = calculateCurrentIteration(phase, timing.iterations, simpleIterationProgress, overallProgress);
-    var directedProgress = calculateDirectedProgress(timing.direction, currentIteration, simpleIterationProgress);
-
-    // https://w3c.github.io/web-animations/#calculating-the-transformed-progress
-    // https://w3c.github.io/web-animations/#calculating-the-iteration-progress
-    return timing._easingFunction(directedProgress);
-  }
-
-  shared.cloneTimingInput = cloneTimingInput;
-  shared.makeTiming = makeTiming;
-  shared.numericTimingToObject = numericTimingToObject;
-  shared.normalizeTimingInput = normalizeTimingInput;
-  shared.calculateActiveDuration = calculateActiveDuration;
-  shared.calculateIterationProgress = calculateIterationProgress;
-  shared.calculatePhase = calculatePhase;
-  shared.normalizeEasing = normalizeEasing;
-  shared.parseEasingFunction = parseEasingFunction;
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.normalizeTimingInput = normalizeTimingInput;
-    testing.normalizeEasing = normalizeEasing;
-    testing.parseEasingFunction = parseEasingFunction;
-    testing.calculateActiveDuration = calculateActiveDuration;
-    testing.calculatePhase = calculatePhase;
-    testing.PhaseNone = PhaseNone;
-    testing.PhaseBefore = PhaseBefore;
-    testing.PhaseActive = PhaseActive;
-    testing.PhaseAfter = PhaseAfter;
-  }
-
-})(webAnimationsShared, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/transform-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/transform-handler.js
deleted file mode 100644
index c6b4d93..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/transform-handler.js
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  // This returns a function for converting transform functions to equivalent
-  // primitive functions, which will take an array of values from the
-  // derivative type and fill in the blanks (underscores) with them.
-  var _ = null;
-  function cast(pattern) {
-    return function(contents) {
-      var i = 0;
-      return pattern.map(function(x) { return x === _ ? contents[i++] : x; });
-    }
-  }
-
-  function id(x) { return x; }
-
-  var Opx = {px: 0};
-  var Odeg = {deg: 0};
-
-  // type: [argTypes, convertTo3D, convertTo2D]
-  // In the argument types string, lowercase characters represent optional arguments
-  var transformFunctions = {
-    matrix: ['NNNNNN', [_, _, 0, 0, _, _, 0, 0, 0, 0, 1, 0, _, _, 0, 1], id],
-    matrix3d: ['NNNNNNNNNNNNNNNN', id],
-    rotate: ['A'],
-    rotatex: ['A'],
-    rotatey: ['A'],
-    rotatez: ['A'],
-    rotate3d: ['NNNA'],
-    perspective: ['L'],
-    scale: ['Nn', cast([_, _, 1]), id],
-    scalex: ['N', cast([_, 1, 1]), cast([_, 1])],
-    scaley: ['N', cast([1, _, 1]), cast([1, _])],
-    scalez: ['N', cast([1, 1, _])],
-    scale3d: ['NNN', id],
-    skew: ['Aa', null, id],
-    skewx: ['A', null, cast([_, Odeg])],
-    skewy: ['A', null, cast([Odeg, _])],
-    translate: ['Tt', cast([_, _, Opx]), id],
-    translatex: ['T', cast([_, Opx, Opx]), cast([_, Opx])],
-    translatey: ['T', cast([Opx, _, Opx]), cast([Opx, _])],
-    translatez: ['L', cast([Opx, Opx, _])],
-    translate3d: ['TTL', id],
-  };
-
-  function parseTransform(string) {
-    string = string.toLowerCase().trim();
-    if (string == 'none')
-      return [];
-    // FIXME: Using a RegExp means calcs won't work here
-    var transformRegExp = /\s*(\w+)\(([^)]*)\)/g;
-    var result = [];
-    var match;
-    var prevLastIndex = 0;
-    while (match = transformRegExp.exec(string)) {
-      if (match.index != prevLastIndex)
-        return;
-      prevLastIndex = match.index + match[0].length;
-      var functionName = match[1];
-      var functionData = transformFunctions[functionName];
-      if (!functionData)
-        return;
-      var args = match[2].split(',');
-      var argTypes = functionData[0];
-      if (argTypes.length < args.length)
-        return;
-
-      var parsedArgs = [];
-      for (var i = 0; i < argTypes.length; i++) {
-        var arg = args[i];
-        var type = argTypes[i];
-        var parsedArg;
-        if (!arg)
-          parsedArg = ({a: Odeg,
-                        n: parsedArgs[0],
-                        t: Opx})[type];
-        else
-          parsedArg = ({A: function(s) { return s.trim() == '0' ? Odeg : scope.parseAngle(s); },
-                        N: scope.parseNumber,
-                        T: scope.parseLengthOrPercent,
-                        L: scope.parseLength})[type.toUpperCase()](arg);
-        if (parsedArg === undefined)
-          return;
-        parsedArgs.push(parsedArg);
-      }
-      result.push({t: functionName, d: parsedArgs});
-
-      if (transformRegExp.lastIndex == string.length)
-        return result;
-    }
-  };
-
-  function numberToLongString(x) {
-    return x.toFixed(6).replace('.000000', '');
-  }
-
-  function mergeMatrices(left, right) {
-    if (left.decompositionPair !== right) {
-      left.decompositionPair = right;
-      var leftArgs = scope.makeMatrixDecomposition(left);
-    }
-    if (right.decompositionPair !== left) {
-      right.decompositionPair = left;
-      var rightArgs = scope.makeMatrixDecomposition(right);
-    }
-    if (leftArgs[0] == null || rightArgs[0] == null)
-      return [[false], [true], function(x) { return x ? right[0].d : left[0].d; }];
-    leftArgs[0].push(0);
-    rightArgs[0].push(1);
-    return [
-      leftArgs,
-      rightArgs,
-      function(list) {
-        var quat = scope.quat(leftArgs[0][3], rightArgs[0][3], list[5]);
-        var mat = scope.composeMatrix(list[0], list[1], list[2], quat, list[4]);
-        var stringifiedArgs = mat.map(numberToLongString).join(',');
-        return stringifiedArgs;
-      }
-    ];
-  }
-
-  function typeTo2D(type) {
-    return type.replace(/[xy]/, '');
-  }
-
-  function typeTo3D(type) {
-    return type.replace(/(x|y|z|3d)?$/, '3d');
-  }
-
-  function mergeTransforms(left, right) {
-    var matrixModulesLoaded = scope.makeMatrixDecomposition && true;
-
-    var flipResults = false;
-    if (!left.length || !right.length) {
-      if (!left.length) {
-        flipResults = true;
-        left = right;
-        right = [];
-      }
-      for (var i = 0; i < left.length; i++) {
-        var type = left[i].t;
-        var args = left[i].d;
-        var defaultValue = type.substr(0, 5) == 'scale' ? 1 : 0;
-        right.push({t: type, d: args.map(function(arg) {
-          if (typeof arg == 'number')
-            return defaultValue;
-          var result = {};
-          for (var unit in arg)
-            result[unit] = defaultValue;
-          return result;
-        })});
-      }
-    }
-
-    var isMatrixOrPerspective = function(lt, rt) {
-      return ((lt == 'perspective') && (rt == 'perspective')) ||
-          ((lt == 'matrix' || lt == 'matrix3d') && (rt == 'matrix' || rt == 'matrix3d'));
-    };
-    var leftResult = [];
-    var rightResult = [];
-    var types = [];
-
-    if (left.length != right.length) {
-      if (!matrixModulesLoaded)
-        return;
-      var merged = mergeMatrices(left, right);
-      leftResult = [merged[0]];
-      rightResult = [merged[1]];
-      types = [['matrix', [merged[2]]]];
-    } else {
-      for (var i = 0; i < left.length; i++) {
-        var leftType = left[i].t;
-        var rightType = right[i].t;
-        var leftArgs = left[i].d;
-        var rightArgs = right[i].d;
-
-        var leftFunctionData = transformFunctions[leftType];
-        var rightFunctionData = transformFunctions[rightType];
-
-        var type;
-        if (isMatrixOrPerspective(leftType, rightType)) {
-          if (!matrixModulesLoaded)
-            return;
-          var merged = mergeMatrices([left[i]], [right[i]]);
-          leftResult.push(merged[0]);
-          rightResult.push(merged[1]);
-          types.push(['matrix', [merged[2]]]);
-          continue;
-        } else if (leftType == rightType) {
-          type = leftType;
-        } else if (leftFunctionData[2] && rightFunctionData[2] && typeTo2D(leftType) == typeTo2D(rightType)) {
-          type = typeTo2D(leftType);
-          leftArgs = leftFunctionData[2](leftArgs);
-          rightArgs = rightFunctionData[2](rightArgs);
-        } else if (leftFunctionData[1] && rightFunctionData[1] && typeTo3D(leftType) == typeTo3D(rightType)) {
-          type = typeTo3D(leftType);
-          leftArgs = leftFunctionData[1](leftArgs);
-          rightArgs = rightFunctionData[1](rightArgs);
-        } else {
-          if (!matrixModulesLoaded)
-            return;
-          var merged = mergeMatrices(left, right);
-          leftResult = [merged[0]];
-          rightResult = [merged[1]];
-          types = [['matrix', [merged[2]]]];
-          break;
-        }
-
-        var leftArgsCopy = [];
-        var rightArgsCopy = [];
-        var stringConversions = [];
-        for (var j = 0; j < leftArgs.length; j++) {
-          var merge = typeof leftArgs[j] == 'number' ? scope.mergeNumbers : scope.mergeDimensions;
-          var merged = merge(leftArgs[j], rightArgs[j]);
-          leftArgsCopy[j] = merged[0];
-          rightArgsCopy[j] = merged[1];
-          stringConversions.push(merged[2]);
-        }
-        leftResult.push(leftArgsCopy);
-        rightResult.push(rightArgsCopy);
-        types.push([type, stringConversions]);
-      }
-    }
-
-    if (flipResults) {
-      var tmp = leftResult;
-      leftResult = rightResult;
-      rightResult = tmp;
-    }
-
-    return [leftResult, rightResult, function(list) {
-      return list.map(function(args, i) {
-        var stringifiedArgs = args.map(function(arg, j) {
-          return types[i][1][j](arg);
-        }).join(',');
-        if (types[i][0] == 'matrix' && stringifiedArgs.split(',').length == 16)
-          types[i][0] = 'matrix3d';
-        return types[i][0] + '(' + stringifiedArgs + ')';
-
-      }).join(' ');
-    }];
-  }
-
-  scope.addPropertiesHandler(parseTransform, mergeTransforms, ['transform']);
-
-  scope.transformToSvgMatrix = function(string) {
-    // matrix(<a> <b> <c> <d> <e> <f>)
-    var mat = scope.transformListToMatrix(parseTransform(string));
-    return 'matrix(' +
-        numberToLongString(mat[0]) + ' ' +  // <a>
-        numberToLongString(mat[1]) + ' ' +  // <b>
-        numberToLongString(mat[4]) + ' ' +  // <c>
-        numberToLongString(mat[5]) + ' ' +  // <d>
-        numberToLongString(mat[12]) + ' ' +  // <e>
-        numberToLongString(mat[13]) +        // <f>
-        ')';
-  };
-
-  if (WEB_ANIMATIONS_TESTING)
-    testing.parseTransform = parseTransform;
-
-})(webAnimations1, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/visibility-handler.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/visibility-handler.js
deleted file mode 100644
index 53f2953..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/visibility-handler.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(scope, testing) {
-
-  function merge(left, right) {
-    if (left != 'visible' && right != 'visible') return;
-    return [0, 1, function(x) {
-      if (x <= 0) return left;
-      if (x >= 1) return right;
-      return 'visible';
-    }];
-  }
-
-  scope.addPropertiesHandler(String, merge, ['visibility']);
-
-})(webAnimations1);
-
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js
deleted file mode 100644
index 3905496..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-cancel-events.js
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function() {
-
-  if (document.createElement('div').animate([]).oncancel !== undefined) {
-    return;
-  }
-
-  if (WEB_ANIMATIONS_TESTING) {
-    var now = function() { return webAnimations1.timeline.currentTime; };
-  } else if (window.performance && performance.now) {
-    var now = function() { return performance.now(); };
-  } else {
-    var now = function() { return Date.now(); };
-  }
-
-  var AnimationCancelEvent = function(target, currentTime, timelineTime) {
-    this.target = target;
-    this.currentTime = currentTime;
-    this.timelineTime = timelineTime;
-
-    this.type = 'cancel';
-    this.bubbles = false;
-    this.cancelable = false;
-    this.currentTarget = target;
-    this.defaultPrevented = false;
-    this.eventPhase = Event.AT_TARGET;
-    this.timeStamp = Date.now();
-  };
-
-  var originalElementAnimate = window.Element.prototype.animate;
-  window.Element.prototype.animate = function(effectInput, options) {
-    var animation = originalElementAnimate.call(this, effectInput, options);
-
-    animation._cancelHandlers = [];
-    animation.oncancel = null;
-
-    var originalCancel = animation.cancel;
-    animation.cancel = function() {
-      originalCancel.call(this);
-      var event = new AnimationCancelEvent(this, null, now());
-      var handlers = this._cancelHandlers.concat(this.oncancel ? [this.oncancel] : []);
-      setTimeout(function() {
-        handlers.forEach(function(handler) {
-          handler.call(event.target, event);
-        });
-      }, 0);
-    };
-
-    var originalAddEventListener = animation.addEventListener;
-    animation.addEventListener = function(type, handler) {
-      if (typeof handler == 'function' && type == 'cancel')
-        this._cancelHandlers.push(handler);
-      else
-        originalAddEventListener.call(this, type, handler);
-    };
-
-    var originalRemoveEventListener = animation.removeEventListener;
-    animation.removeEventListener = function(type, handler) {
-      if (type == 'cancel') {
-        var index = this._cancelHandlers.indexOf(handler);
-        if (index >= 0)
-          this._cancelHandlers.splice(index, 1);
-      } else {
-        originalRemoveEventListener.call(this, type, handler);
-      }
-    };
-
-    return animation;
-  };
-})();
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js
deleted file mode 100644
index c1b6ecd..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-bonus-object-form-keyframes.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared) {
-  // If the polyfill is being loaded in a context where Element.animate is
-  // supported but object-form syntax is not, then creating an animation
-  // using the new syntax will either have no effect or will throw an exception.
-  // In either case, we want to proceed to load this part of the polyfill.
-  //
-  // The test animation uses an opacity other than the one the element already
-  // has, and doesn't need to change during the animation for the test to work.
-  // After the test, the element's opacity will be left how we found it:
-  // - If the animation is not created, the test will leave the element's
-  //   opacity untouched at originalOpacity.
-  // - If the animation is created, it will be cancelled, and leave the
-  //   element's opacity at originalOpacity.
-  // - If the animation is somehow created and runs without being cancelled,
-  //   when it finishes after 1ms, it will cease to have any effect (because
-  //   fill is not specified), and opacity will again be left at originalOpacity.
-  var element = document.documentElement;
-  var animation = null;
-  var animated = false;
-  try {
-    var originalOpacity = getComputedStyle(element).getPropertyValue('opacity');
-    var testOpacity = originalOpacity == '0' ? '1' : '0';
-    animation = element.animate({'opacity': [testOpacity, testOpacity]},
-        {duration: 1});
-    animation.currentTime = 0;
-    animated = getComputedStyle(element).getPropertyValue('opacity') == testOpacity;
-  } catch (error) {
-  } finally {
-    if (animation)
-      animation.cancel();
-  }
-  if (animated) {
-    return;
-  }
-
-  var originalElementAnimate = window.Element.prototype.animate;
-  window.Element.prototype.animate = function(effectInput, options) {
-    if (window.Symbol && Symbol.iterator && Array.prototype.from && effectInput[Symbol.iterator]) {
-      // Handle custom iterables in most browsers by converting to an array
-      effectInput = Array.from(effectInput);
-    }
-
-    if (!Array.isArray(effectInput) && effectInput !== null) {
-      effectInput = shared.convertToArrayForm(effectInput);
-    }
-
-    return originalElementAnimate.call(this, effectInput, options);
-  };
-})(webAnimationsShared);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-next-animation.js b/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-next-animation.js
deleted file mode 100644
index 698532c..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/src/web-animations-next-animation.js
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-(function(shared, scope, testing) {
-  scope.animationsWithPromises = [];
-
-  scope.Animation = function(effect, timeline) {
-    this.id = '';
-    if (effect && effect._id) {
-      this.id = effect._id;
-    }
-    this.effect = effect;
-    if (effect) {
-      effect._animation = this;
-    }
-    if (!timeline) {
-      throw new Error('Animation with null timeline is not supported');
-    }
-    this._timeline = timeline;
-    this._sequenceNumber = shared.sequenceNumber++;
-    this._holdTime = 0;
-    this._paused = false;
-    this._isGroup = false;
-    this._animation = null;
-    this._childAnimations = [];
-    this._callback = null;
-    this._oldPlayState = 'idle';
-    this._rebuildUnderlyingAnimation();
-    // Animations are constructed in the idle state.
-    this._animation.cancel();
-    this._updatePromises();
-  };
-
-  scope.Animation.prototype = {
-    _updatePromises: function() {
-      var oldPlayState = this._oldPlayState;
-      var newPlayState = this.playState;
-      if (this._readyPromise && newPlayState !== oldPlayState) {
-        if (newPlayState == 'idle') {
-          this._rejectReadyPromise();
-          this._readyPromise = undefined;
-        } else if (oldPlayState == 'pending') {
-          this._resolveReadyPromise();
-        } else if (newPlayState == 'pending') {
-          this._readyPromise = undefined;
-        }
-      }
-      if (this._finishedPromise && newPlayState !== oldPlayState) {
-        if (newPlayState == 'idle') {
-          this._rejectFinishedPromise();
-          this._finishedPromise = undefined;
-        } else if (newPlayState == 'finished') {
-          this._resolveFinishedPromise();
-        } else if (oldPlayState == 'finished') {
-          this._finishedPromise = undefined;
-        }
-      }
-      this._oldPlayState = this.playState;
-      return (this._readyPromise || this._finishedPromise);
-    },
-    _rebuildUnderlyingAnimation: function() {
-      this._updatePromises();
-      var oldPlaybackRate;
-      var oldPaused;
-      var oldStartTime;
-      var oldCurrentTime;
-      var hadUnderlying = this._animation ? true : false;
-      if (hadUnderlying) {
-        oldPlaybackRate = this.playbackRate;
-        oldPaused = this._paused;
-        oldStartTime = this.startTime;
-        oldCurrentTime = this.currentTime;
-        this._animation.cancel();
-        this._animation._wrapper = null;
-        this._animation = null;
-      }
-
-      if (!this.effect || this.effect instanceof window.KeyframeEffect) {
-        this._animation = scope.newUnderlyingAnimationForKeyframeEffect(this.effect);
-        scope.bindAnimationForKeyframeEffect(this);
-      }
-      if (this.effect instanceof window.SequenceEffect || this.effect instanceof window.GroupEffect) {
-        this._animation = scope.newUnderlyingAnimationForGroup(this.effect);
-        scope.bindAnimationForGroup(this);
-      }
-      if (this.effect && this.effect._onsample) {
-        scope.bindAnimationForCustomEffect(this);
-      }
-      if (hadUnderlying) {
-        if (oldPlaybackRate != 1) {
-          this.playbackRate = oldPlaybackRate;
-        }
-        if (oldStartTime !== null) {
-          this.startTime = oldStartTime;
-        } else if (oldCurrentTime !== null) {
-          this.currentTime = oldCurrentTime;
-        } else if (this._holdTime !== null) {
-          this.currentTime = this._holdTime;
-        }
-        if (oldPaused) {
-          this.pause();
-        }
-      }
-      this._updatePromises();
-    },
-    _updateChildren: function() {
-      if (!this.effect || this.playState == 'idle')
-        return;
-
-      var offset = this.effect._timing.delay;
-      this._childAnimations.forEach(function(childAnimation) {
-        this._arrangeChildren(childAnimation, offset);
-        if (this.effect instanceof window.SequenceEffect)
-          offset += scope.groupChildDuration(childAnimation.effect);
-      }.bind(this));
-    },
-    _setExternalAnimation: function(animation) {
-      if (!this.effect || !this._isGroup)
-        return;
-      for (var i = 0; i < this.effect.children.length; i++) {
-        this.effect.children[i]._animation = animation;
-        this._childAnimations[i]._setExternalAnimation(animation);
-      }
-    },
-    _constructChildAnimations: function() {
-      if (!this.effect || !this._isGroup)
-        return;
-      var offset = this.effect._timing.delay;
-      this._removeChildAnimations();
-      this.effect.children.forEach(function(child) {
-        var childAnimation = scope.timeline._play(child);
-        this._childAnimations.push(childAnimation);
-        childAnimation.playbackRate = this.playbackRate;
-        if (this._paused)
-          childAnimation.pause();
-        child._animation = this.effect._animation;
-
-        this._arrangeChildren(childAnimation, offset);
-
-        if (this.effect instanceof window.SequenceEffect)
-          offset += scope.groupChildDuration(child);
-      }.bind(this));
-    },
-    _arrangeChildren: function(childAnimation, offset) {
-      if (this.startTime === null) {
-        childAnimation.currentTime = this.currentTime - offset / this.playbackRate;
-      } else if (childAnimation.startTime !== this.startTime + offset / this.playbackRate) {
-        childAnimation.startTime = this.startTime + offset / this.playbackRate;
-      }
-    },
-    get timeline() {
-      return this._timeline;
-    },
-    get playState() {
-      return this._animation ? this._animation.playState : 'idle';
-    },
-    get finished() {
-      if (!window.Promise) {
-        console.warn('Animation Promises require JavaScript Promise constructor');
-        return null;
-      }
-      if (!this._finishedPromise) {
-        if (scope.animationsWithPromises.indexOf(this) == -1) {
-          scope.animationsWithPromises.push(this);
-        }
-        this._finishedPromise = new Promise(
-            function(resolve, reject) {
-              this._resolveFinishedPromise = function() {
-                resolve(this);
-              };
-              this._rejectFinishedPromise = function() {
-                reject({type: DOMException.ABORT_ERR, name: 'AbortError'});
-              };
-            }.bind(this));
-        if (this.playState == 'finished') {
-          this._resolveFinishedPromise();
-        }
-      }
-      return this._finishedPromise;
-    },
-    get ready() {
-      if (!window.Promise) {
-        console.warn('Animation Promises require JavaScript Promise constructor');
-        return null;
-      }
-      if (!this._readyPromise) {
-        if (scope.animationsWithPromises.indexOf(this) == -1) {
-          scope.animationsWithPromises.push(this);
-        }
-        this._readyPromise = new Promise(
-            function(resolve, reject) {
-              this._resolveReadyPromise = function() {
-                resolve(this);
-              };
-              this._rejectReadyPromise = function() {
-                reject({type: DOMException.ABORT_ERR, name: 'AbortError'});
-              };
-            }.bind(this));
-        if (this.playState !== 'pending') {
-          this._resolveReadyPromise();
-        }
-      }
-      return this._readyPromise;
-    },
-    get onfinish() {
-      return this._animation.onfinish;
-    },
-    set onfinish(v) {
-      if (typeof v == 'function') {
-        this._animation.onfinish = (function(e) {
-          e.target = this;
-          v.call(this, e);
-        }).bind(this);
-      } else {
-        this._animation.onfinish = v;
-      }
-    },
-    get oncancel() {
-      return this._animation.oncancel;
-    },
-    set oncancel(v) {
-      if (typeof v == 'function') {
-        this._animation.oncancel = (function(e) {
-          e.target = this;
-          v.call(this, e);
-        }).bind(this);
-      } else {
-        this._animation.oncancel = v;
-      }
-    },
-    get currentTime() {
-      this._updatePromises();
-      var currentTime = this._animation.currentTime;
-      this._updatePromises();
-      return currentTime;
-    },
-    set currentTime(v) {
-      this._updatePromises();
-      this._animation.currentTime = isFinite(v) ? v : Math.sign(v) * Number.MAX_VALUE;
-      this._register();
-      this._forEachChild(function(child, offset) {
-        child.currentTime = v - offset;
-      });
-      this._updatePromises();
-    },
-    get startTime() {
-      return this._animation.startTime;
-    },
-    set startTime(v) {
-      this._updatePromises();
-      this._animation.startTime = isFinite(v) ? v : Math.sign(v) * Number.MAX_VALUE;
-      this._register();
-      this._forEachChild(function(child, offset) {
-        child.startTime = v + offset;
-      });
-      this._updatePromises();
-    },
-    get playbackRate() {
-      return this._animation.playbackRate;
-    },
-    set playbackRate(value) {
-      this._updatePromises();
-      var oldCurrentTime = this.currentTime;
-      this._animation.playbackRate = value;
-      this._forEachChild(function(childAnimation) {
-        childAnimation.playbackRate = value;
-      });
-      if (oldCurrentTime !== null) {
-        this.currentTime = oldCurrentTime;
-      }
-      this._updatePromises();
-    },
-    play: function() {
-      this._updatePromises();
-      this._paused = false;
-      this._animation.play();
-      if (this._timeline._animations.indexOf(this) == -1) {
-        this._timeline._animations.push(this);
-      }
-      this._register();
-      scope.awaitStartTime(this);
-      this._forEachChild(function(child) {
-        var time = child.currentTime;
-        child.play();
-        child.currentTime = time;
-      });
-      this._updatePromises();
-    },
-    pause: function() {
-      this._updatePromises();
-      if (this.currentTime) {
-        this._holdTime = this.currentTime;
-      }
-      this._animation.pause();
-      this._register();
-      this._forEachChild(function(child) {
-        child.pause();
-      });
-      this._paused = true;
-      this._updatePromises();
-    },
-    finish: function() {
-      this._updatePromises();
-      this._animation.finish();
-      this._register();
-      this._updatePromises();
-    },
-    cancel: function() {
-      this._updatePromises();
-      this._animation.cancel();
-      this._register();
-      this._removeChildAnimations();
-      this._updatePromises();
-    },
-    reverse: function() {
-      this._updatePromises();
-      var oldCurrentTime = this.currentTime;
-      this._animation.reverse();
-      this._forEachChild(function(childAnimation) {
-        childAnimation.reverse();
-      });
-      if (oldCurrentTime !== null) {
-        this.currentTime = oldCurrentTime;
-      }
-      this._updatePromises();
-    },
-    addEventListener: function(type, handler) {
-      var wrapped = handler;
-      if (typeof handler == 'function') {
-        wrapped = (function(e) {
-          e.target = this;
-          handler.call(this, e);
-        }).bind(this);
-        handler._wrapper = wrapped;
-      }
-      this._animation.addEventListener(type, wrapped);
-    },
-    removeEventListener: function(type, handler) {
-      this._animation.removeEventListener(type, (handler && handler._wrapper) || handler);
-    },
-    _removeChildAnimations: function() {
-      while (this._childAnimations.length)
-        this._childAnimations.pop().cancel();
-    },
-    _forEachChild: function(f) {
-      var offset = 0;
-      if (this.effect.children && this._childAnimations.length < this.effect.children.length)
-        this._constructChildAnimations();
-      this._childAnimations.forEach(function(child) {
-        f.call(this, child, offset);
-        if (this.effect instanceof window.SequenceEffect)
-          offset += child.effect.activeDuration;
-      }.bind(this));
-
-      if (this.playState == 'pending')
-        return;
-      var timing = this.effect._timing;
-      var t = this.currentTime;
-      if (t !== null)
-        t = shared.calculateIterationProgress(shared.calculateActiveDuration(timing), t, timing);
-      if (t == null || isNaN(t))
-        this._removeChildAnimations();
-    },
-  };
-
-  window.Animation = scope.Animation;
-
-  if (WEB_ANIMATIONS_TESTING) {
-    testing.webAnimationsNextAnimation = scope.Animation;
-  }
-
-})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.html b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.html
deleted file mode 100644
index 3580355..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="./web-animations-next-lite.min.js"></script>
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.js b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.js
deleted file mode 100644
index 965fcbb..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-!function(a,b){var c={},d={},e={};!function(a,b){function c(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function d(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear",this._easingFunction=x}function e(){return a.isDeprecated("Invalid timing inputs","2016-03-02","TypeError exceptions will be thrown instead.",!0)}function f(b,c,e){var f=new d;return c&&(f.fill="both",f.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof f[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==v.indexOf(b[c]))return;if("direction"==c&&-1==w.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;f[c]=b[c]}}):f.duration=b,f}function g(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function h(b,c){return b=a.numericTimingToObject(b),f(b,c)}function i(a,b,c,d){return a<0||a>1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i<j;){var k=(i+j)/2,l=f(a,c,k);if(Math.abs(e-l)<1e-5)return f(b,d,k);l<e?i=k:j=k}return f(b,d,k)}}function j(a,b){return function(c){if(c>=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);return c?j(Number(c[1]),{start:y,middle:z,end:A}[c[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return G;var d=c.delay+a+c.endDelay;return b<Math.min(c.delay,d)?H:b>=Math.min(c.delay+a,d)?I:J}function p(a,b,c,d,e){switch(d){case H:return"backwards"==b||"both"==b?0:null;case J:return c-e;case I:return"forwards"==b||"both"==b?a:null;case G:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==H&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==I||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===I&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+timing.iterationStart);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,G=0,H=1,I=2,J=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(c),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g<f;g++)e={},e.offset="offset"in a?a.offset:1==f?1:g/(f-1),"easing"in a&&(e.easing=a.easing),"composite"in a&&(e.composite=a.composite),e[c]=d[g],b.push(e)}return b.sort(function(a,b){return a.offset-b.offset}),b}function g(b){function c(){var a=d.length;null==d[a-1].offset&&(d[a-1].offset=1),a>1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e<a;e++){var f=d[e].offset;if(null!=f){for(var g=1;g<e-b;g++)d[b+g].offset=c+(f-c)*g/(e-b);b=e,c=f}}}if(null==b)return[];window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||(b=f(b));for(var d=b.map(function(b){var c={};for(var d in b){var f=b[d];if("offset"==d){if(null!=f){if(f=Number(f),!isFinite(f))throw new TypeError("Keyframe offsets must be numbers.");if(f<0||f>1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i<d.length;i++){var j=d[i].offset;if(null!=j){if(j<h)throw new TypeError("Keyframes are not loosely sorted by offset. Sort or specify offsets.");h=j}else g=!1}return d=d.filter(function(a){return a.offset>=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(c),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g<h&&(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,1))},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b,c){function d(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function e(c){var d=[];for(var e in c)for(var f=c[e],g=0;g<f.length-1;g++){var h=g,i=g+1,j=f[h].offset,k=f[i].offset,l=j,m=k;0==g&&(l=-1/0,0==k&&(i=h)),g==f.length-2&&(m=1/0,1==j&&(h=i)),d.push({applyFrom:l,applyTo:m,startOffset:f[h].offset,endOffset:f[i].offset,easingFunction:a.parseEasingFunction(f[h].easing),property:e,interpolation:b.propertyInterpolation(e,f[h].value,f[i].value)})}return d.sort(function(a,b){return a.startOffset-b.startOffset}),d}b.convertEffectInput=function(c){var f=a.normalizeKeyframes(c),g=d(f),h=e(g);return function(a,c){if(null!=c)h.filter(function(a){return c>=a.applyFrom&&c<a.applyTo}).forEach(function(d){var e=c-d.startOffset,f=d.endOffset-d.startOffset,g=0==f?0:d.easingFunction(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d),function(a,b,c){function d(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function e(a,b,c){h[c]=h[c]||[],h[c].push([a,b])}function f(a,b,c){for(var f=0;f<c.length;f++){e(a,b,d(c[f]))}}function g(c,e,f){var g=c;/-/.test(c)&&!a.isDeprecated("Hyphenated property names","2016-03-22","Use camelCase instead.",!0)&&(g=d(c)),"initial"!=e&&"initial"!=f||("initial"==e&&(e=i[g]),"initial"==f&&(f=i[g]));for(var j=e==f?[]:h[g],k=0;j&&k<j.length;k++){var l=j[k][0](e),m=j[k][0](f);if(void 0!==l&&void 0!==m){var n=j[k][1](l,m);if(n){var o=b.Interpolation.apply(null,n);return function(a){return 0==a?e:1==a?f:o(a)}}}}return b.Interpolation(!1,!0,function(a){return a?f:e})}var h={};b.addPropertiesHandler=f;var i={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",strokeDasharray:"none",strokeDashoffset:"0px",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};b.propertyInterpolation=g}(c,d),function(a,b,c){function d(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateIterationProgress(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d}b.KeyframeEffect=function(c,e,f,g){var h,i=d(a.normalizeTimingInput(f)),j=b.convertEffectInput(e),k=function(){j(c,h)};return k._update=function(a){return null!==(h=i(a))},k._clear=function(){j(c,null)},k._hasSameTarget=function(a){return c===a},k._target=c,k._totalDuration=i._totalDuration,k._id=g,k}}(c,d),function(a,b){a.apply=function(b,c,d){b.style[a.propertyName(c)]=d},a.clear=function(b,c){b.style[a.propertyName(c)]=""}}(d),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(d),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f<a.length;f++)e.push(c(a[f],b[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+b}a.Interpolation=function(a,b,d){return function(e){return d(c(a,b,e))}}}(d),function(a,b,c){a.sequenceNumber=0;var d=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this.id="",b&&b._id&&(this.id=b._id),this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!0,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this.playbackRate<0&&0===this.currentTime?this._inEffect=this._effect._update(-1):this._inEffect=this._effect._update(this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._isFinished=!0,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(c,d),function(a,b,c){function d(a){var b=j;j=[],a<q.currentTime&&(a=q.currentTime),q._animations.sort(e),q._animations=h(a,!0,q._animations)[0],b.forEach(function(b){b[1](a)}),g(),l=void 0}function e(a,b){return a._sequenceNumber-b._sequenceNumber}function f(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function g(){o.forEach(function(a){a()}),o.length=0}function h(a,c,d){p=!0,n=!1,b.timeline.currentTime=a,m=!1;var e=[],f=[],g=[],h=[];return d.forEach(function(b){b._tick(a,c),b._inEffect?(f.push(b._effect),b._markTarget()):(e.push(b._effect),b._unmarkTarget()),b._needsTick&&(m=!0);var d=b._inEffect||b._needsTick;b._inTimeline=d,d?g.push(b):h.push(b)}),o.push.apply(o,e),o.push.apply(o,f),m&&requestAnimationFrame(function(){}),p=!1,[g,h]}var i=window.requestAnimationFrame,j=[],k=0;window.requestAnimationFrame=function(a){var b=k++;return 0==j.length&&i(d),j.push([b,a]),b},window.cancelAnimationFrame=function(a){j.forEach(function(b){b[0]==a&&(b[1]=function(){})})},f.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.applyDirtiedAnimation(d),d}};var l=void 0,m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n},b.applyDirtiedAnimation=function(a){if(!p){a._markTarget();var c=a._targetAnimations();c.sort(e),h(b.timeline.currentTime,!1,c.slice())[1].forEach(function(a){var b=q._animations.indexOf(a);-1!==b&&q._animations.splice(b,1)}),g()}};var o=[],p=!1,q=new f;b.timeline=q}(c,d),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,c<=0))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}if(""==c)return d}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;k<j;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);if(e&&e[0].length)return[d,e[1]]}function c(c){var d=a.consumeRepeated(b,/^,/,c);if(d&&""==d[1])return d[0]}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a,b){function c(a){return a.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function d(a,b,c){return Math.min(b,Math.max(a,c))}function e(a){if(/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a))return Number(a)}function f(a,b){return[a,b,c]}function g(a,b){if(0!=a)return i(0,1/0)(a,b)}function h(a,b){return[a,b,function(a){return Math.round(d(1,1/0,a))}]}function i(a,b){return function(e,f){return[e,f,function(e){return c(d(a,b,e))}]}}function j(a){var b=a.trim().split(/\s*[\s,]\s*/);if(0!==b.length){for(var c=[],d=0;d<b.length;d++){var f=e(b[d]);if(void 0===f)return;c.push(f)}return c}}function k(a,b){if(a.length==b.length)return[a,b,function(a){return a.map(c).join(" ")}]}function l(a,b){return[a,b,Math.round]}a.clamp=d,a.addPropertiesHandler(j,k,["stroke-dasharray"]),a.addPropertiesHandler(e,i(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(e,i(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(e,g,["flex-grow","flex-shrink"]),a.addPropertiesHandler(e,h,["orphans","widows"]),a.addPropertiesHandler(e,l,["z-index"]),a.parseNumber=e,a.parseNumberList=j,a.mergeNumbers=f,a.numberToString=c}(d),function(a,b){function c(a,b){if("visible"==a||"visible"==b)return[0,1,function(c){return c<=0?a:c>=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(d),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(d),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h<g.length;)g[h].test(f)?(f=f.replace(g[h],"$1"),h=0):h++;if("D"==f){for(var i in d){var j=c(b.replace(new RegExp("U"+i,"g"),"").replace(new RegExp(e,"g"),"*0"));if(!isFinite(j))return;d[i]=j}return d}}}function e(a,b){return f(a,b,!0)}function f(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(d),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(d),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var k=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(void 0===(p=q?{A:function(b){return"0"==b.trim()?m:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:m,n:k[0],t:l}[r]))return;k.push(p)}if(e.push({t:g,d:k}),d.lastIndex==b.length)return e}}function f(a){return a.toFixed(6).replace(".000000","")}function g(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var e=a.makeMatrixDecomposition(c)}return null==d[0]||null==e[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),e[0].push(1),[d,e,function(b){var c=a.quat(d[0][3],e[0][3],b[5]);return a.composeMatrix(b[0],b[1],b[2],c,b[4]).map(f).join(",")}])}function h(a){return a.replace(/[xy]/,"")}function i(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function j(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var f=0;f<b.length;f++){var j=b[f].t,k=b[f].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var m=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var f=0;f<b.length;f++){var j,s=b[f].t,t=c[f].t,u=b[f].d,v=c[f].d,w=n[s],x=n[t];if(m(s,t)){if(!d)return;var r=g([b[f]],[c[f]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&h(s)==h(t))j=h(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||i(s)!=i(t)){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=i(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var k=null,l={px:0},m={deg:0},n={matrix:["NNNNNN",[k,k,0,0,k,k,0,0,0,0,1,0,k,k,0,1],d],matrix3d:["NNNNNNNNNNNNNNNN",d],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",c([k,k,1]),d],scalex:["N",c([k,1,1]),c([k,1])],scaley:["N",c([1,k,1]),c([1,k])],scalez:["N",c([1,1,k])],scale3d:["NNN",d],skew:["Aa",null,d],skewx:["A",null,c([k,m])],skewy:["A",null,c([m,k])],translate:["Tt",c([k,k,l]),d],translatex:["T",c([k,l,l]),c([k,l])],translatey:["T",c([l,k,l]),c([l,k])],translatez:["L",c([l,l,k])],translate3d:["TTL",d]};a.addPropertiesHandler(e,j,["transform"]),a.transformToSvgMatrix=function(b){var c=a.transformListToMatrix(e(b));return"matrix("+f(c[0])+" "+f(c[1])+" "+f(c[4])+" "+f(c[5])+" "+f(c[12])+" "+f(c[13])+")"}}(d),function(a,b){function c(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(d[a]=b),e[b]=a})}var d={},e={};c("transform",["webkitTransform","msTransform"]),c("transformOrigin",["webkitTransformOrigin"]),c("perspective",["webkitPerspective"]),c("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return d[a]||a},a.unprefixedPropertyName=function(a){return e[a]||a}}(d)}(),function(){if(void 0===document.createElement("div").animate([]).oncancel){var a;if(window.performance&&performance.now)var a=function(){return performance.now()};else var a=function(){return Date.now()};var b=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},c=window.Element.prototype.animate;window.Element.prototype.animate=function(d,e){var f=c.call(this,d,e);f._cancelHandlers=[],f.oncancel=null;var g=f.cancel;f.cancel=function(){g.call(this);var c=new b(this,null,a()),d=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){d.forEach(function(a){a.call(c.target,c)})},0)};var h=f.addEventListener;f.addEventListener=function(a,b){"function"==typeof b&&"cancel"==a?this._cancelHandlers.push(b):h.call(this,a,b)};var i=f.removeEventListener;return f.removeEventListener=function(a,b){if("cancel"==a){var c=this._cancelHandlers.indexOf(b);c>=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(c),function(a,b,c){function d(a){var c=b.timeline;c.currentTime=a,c._discardAnimations(),0==c._animations.length?f=!1:requestAnimationFrame(d)}var e=window.requestAnimationFrame;window.requestAnimationFrame=function(a){return e(function(c){b.timeline._updateAnimationsPromises(),a(c),b.timeline._updateAnimationsPromises()})},b.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},b.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){b.animationsWithPromises=b.animationsWithPromises.filter(function(a){return a._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(a){return"finished"!=a.playState&&"idle"!=a.playState})},_play:function(a){var c=new b.Animation(a,this);return this._animations.push(c),b.restartWebAnimationsNextTick(),c._updatePromises(),c._animation.play(),c._updatePromises(),c},play:function(a){return a&&a.remove(),this._play(a)}};var f=!1;b.restartWebAnimationsNextTick=function(){f||(f=!0,requestAnimationFrame(d))};var g=new b.AnimationTimeline;b.timeline=g;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return g}})}catch(a){}try{window.document.timeline=g}catch(a){}}(0,e),function(a,b,c){b.animationsWithPromises=[],b.Animation=function(b,c){if(this.id="",b&&b._id&&(this.id=b._id),this.effect=b,b&&(b._animation=this),!c)throw new Error("Animation with null timeline is not supported");this._timeline=c,this._sequenceNumber=a.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},b.Animation.prototype={_updatePromises:function(){var a=this._oldPlayState,b=this.playState;return this._readyPromise&&b!==a&&("idle"==b?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==a?this._resolveReadyPromise():"pending"==b&&(this._readyPromise=void 0)),this._finishedPromise&&b!==a&&("idle"==b?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==b?this._resolveFinishedPromise():"finished"==a&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var a,c,d,e,f=!!this._animation;f&&(a=this.playbackRate,c=this._paused,d=this.startTime,e=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=b.newUnderlyingAnimationForKeyframeEffect(this.effect),b.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=b.newUnderlyingAnimationForGroup(this.effect),b.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&b.bindAnimationForCustomEffect(this),f&&(1!=a&&(this.playbackRate=a),null!==d?this.startTime=d:null!==e?this.currentTime=e:null!==this._holdTime&&(this.currentTime=this._holdTime),c&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var a=this.effect._timing.delay;this._childAnimations.forEach(function(c){this._arrangeChildren(c,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c.effect))}.bind(this))}},_setExternalAnimation:function(a){if(this.effect&&this._isGroup)for(var b=0;b<this.effect.children.length;b++)this.effect.children[b]._animation=a,this._childAnimations[b]._setExternalAnimation(a)},_constructChildAnimations:function(){if(this.effect&&this._isGroup){var a=this.effect._timing.delay;this._removeChildAnimations(),this.effect.children.forEach(function(c){var d=b.timeline._play(c);this._childAnimations.push(d),d.playbackRate=this.playbackRate,this._paused&&d.pause(),c._animation=this.effect._animation,this._arrangeChildren(d,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c))}.bind(this))}},_arrangeChildren:function(a,b){null===this.startTime?a.currentTime=this.currentTime-b/this.playbackRate:a.startTime!==this.startTime+b/this.playbackRate&&(a.startTime=this.startTime+b/this.playbackRate)},get timeline(){return this._timeline},get playState(){return this._animation?this._animation.playState:"idle"},get finished(){return window.Promise?(this._finishedPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._finishedPromise=new Promise(function(a,b){this._resolveFinishedPromise=function(){a(this)},this._rejectFinishedPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"finished"==this.playState&&this._resolveFinishedPromise()),this._finishedPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get ready(){return window.Promise?(this._readyPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._readyPromise=new Promise(function(a,b){this._resolveReadyPromise=function(){a(this)},this._rejectReadyPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"pending"!==this.playState&&this._resolveReadyPromise()),this._readyPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get onfinish(){return this._animation.onfinish},set onfinish(a){this._animation.onfinish="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get oncancel(){return this._animation.oncancel},set oncancel(a){this._animation.oncancel="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get currentTime(){this._updatePromises();var a=this._animation.currentTime;return this._updatePromises(),a},set currentTime(a){this._updatePromises(),this._animation.currentTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.currentTime=a-c}),this._updatePromises()},get startTime(){return this._animation.startTime},set startTime(a){this._updatePromises(),this._animation.startTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.startTime=a+c}),this._updatePromises()},get playbackRate(){return this._animation.playbackRate},set playbackRate(a){this._updatePromises();var b=this.currentTime;this._animation.playbackRate=a,this._forEachChild(function(b){b.playbackRate=a}),null!==b&&(this.currentTime=b),this._updatePromises()},play:function(){this._updatePromises(),this._paused=!1,this._animation.play(),-1==this._timeline._animations.indexOf(this)&&this._timeline._animations.push(this),this._register(),b.awaitStartTime(this),this._forEachChild(function(a){var b=a.currentTime;a.play(),a.currentTime=b}),this._updatePromises()},pause:function(){this._updatePromises(),this.currentTime&&(this._holdTime=this.currentTime),this._animation.pause(),this._register(),this._forEachChild(function(a){a.pause()}),this._paused=!0,this._updatePromises()},finish:function(){this._updatePromises(),this._animation.finish(),this._register(),this._updatePromises()},cancel:function(){this._updatePromises(),this._animation.cancel(),this._register(),this._removeChildAnimations(),this._updatePromises()},reverse:function(){this._updatePromises();var a=this.currentTime;this._animation.reverse(),this._forEachChild(function(a){a.reverse()}),null!==a&&(this.currentTime=a),this._updatePromises()},addEventListener:function(a,b){var c=b;"function"==typeof b&&(c=function(a){a.target=this,b.call(this,a)}.bind(this),b._wrapper=c),this._animation.addEventListener(a,c)},removeEventListener:function(a,b){this._animation.removeEventListener(a,b&&b._wrapper||b)},_removeChildAnimations:function(){for(;this._childAnimations.length;)this._childAnimations.pop().cancel()},_forEachChild:function(b){var c=0;if(this.effect.children&&this._childAnimations.length<this.effect.children.length&&this._constructChildAnimations(),this._childAnimations.forEach(function(a){b.call(this,a,c),this.effect instanceof window.SequenceEffect&&(c+=a.effect.activeDuration)}.bind(this)),"pending"!=this.playState){var d=this.effect._timing,e=this.currentTime;null!==e&&(e=a.calculateIterationProgress(a.calculateActiveDuration(d),e,d)),(null==e||isNaN(e))&&this._removeChildAnimations()}}},window.Animation=b.Animation}(c,e),function(a,b,c){function d(b){this._frames=a.normalizeKeyframes(b)}function e(){for(var a=!1;i.length;)i.shift()._updateChildren(),a=!0;return a}var f=function(a){if(a._animation=void 0,a instanceof window.SequenceEffect||a instanceof window.GroupEffect)for(var b=0;b<a.children.length;b++)f(a.children[b])};b.removeMulti=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];d._parent?(-1==b.indexOf(d._parent)&&b.push(d._parent),d._parent.children.splice(d._parent.children.indexOf(d),1),d._parent=null,f(d)):d._animation&&d._animation.effect==d&&(d._animation.cancel(),d._animation.effect=new KeyframeEffect(null,[]),d._animation._callback&&(d._animation._callback._animation=null),d._animation._rebuildUnderlyingAnimation(),f(d))}for(c=0;c<b.length;c++)b[c]._rebuild()},b.KeyframeEffect=function(b,c,e,f){return this.target=b,this._parent=null,e=a.numericTimingToObject(e),this._timingInput=a.cloneTimingInput(e),this._timing=a.normalizeTimingInput(e),this.timing=a.makeTiming(e,!1,this),this.timing._effect=this,"function"==typeof c?(a.deprecated("Custom KeyframeEffect","2015-06-22","Use KeyframeEffect.onsample instead."),this._normalizedKeyframes=c):this._normalizedKeyframes=new d(c),this._keyframes=c,this.activeDuration=a.calculateActiveDuration(this._timing),this._id=f,this},b.KeyframeEffect.prototype={getFrames:function(){return"function"==typeof this._normalizedKeyframes?this._normalizedKeyframes:this._normalizedKeyframes._frames},set onsample(a){if("function"==typeof this.getFrames())throw new Error("Setting onsample on custom effect KeyframeEffect is not supported.");this._onsample=a,this._animation&&this._animation._rebuildUnderlyingAnimation()},get parent(){return this._parent},clone:function(){if("function"==typeof this.getFrames())throw new Error("Cloning custom effects is not supported.");var b=new KeyframeEffect(this.target,[],a.cloneTimingInput(this._timingInput),this._id);return b._normalizedKeyframes=this._normalizedKeyframes,b._keyframes=this._keyframes,b},remove:function(){b.removeMulti([this])}};var g=Element.prototype.animate;Element.prototype.animate=function(a,c){var d="";return c&&c.id&&(d=c.id),b.timeline._play(new b.KeyframeEffect(this,a,c,d))};var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");b.newUnderlyingAnimationForKeyframeEffect=function(a){if(a){var b=a.target||h,c=a._keyframes;"function"==typeof c&&(c=[]);var d=a._timingInput;d.id=a._id}else var b=h,c=[],d=0;return g.apply(b,[c,d])},b.bindAnimationForKeyframeEffect=function(a){a.effect&&"function"==typeof a.effect._normalizedKeyframes&&b.bindAnimationForCustomEffect(a)};var i=[];b.awaitStartTime=function(a){null===a.startTime&&a._isGroup&&(0==i.length&&requestAnimationFrame(e),i.push(a))};var j=window.getComputedStyle;Object.defineProperty(window,"getComputedStyle",{configurable:!0,enumerable:!0,value:function(){b.timeline._updateAnimationsPromises();var a=j.apply(this,arguments);return e()&&(a=j.apply(this,arguments)),b.timeline._updateAnimationsPromises(),a}}),window.KeyframeEffect=b.KeyframeEffect,window.Element.prototype.getAnimations=function(){return document.timeline.getAnimations().filter(function(a){return null!==a.effect&&a.effect.target==this}.bind(this))}}(c,e),function(a,b,c){function d(a){a._registered||(a._registered=!0,g.push(a),h||(h=!0,requestAnimationFrame(e)))}function e(a){var b=g;g=[],b.sort(function(a,b){return a._sequenceNumber-b._sequenceNumber}),b=b.filter(function(a){a();var b=a._animation?a._animation.playState:"idle";return"running"!=b&&"pending"!=b&&(a._registered=!1),a._registered}),g.push.apply(g,b),g.length?(h=!0,requestAnimationFrame(e)):h=!1}var f=(document.createElementNS("http://www.w3.org/1999/xhtml","div"),0);b.bindAnimationForCustomEffect=function(b){var c,e=b.effect.target,g="function"==typeof b.effect.getFrames();c=g?b.effect.getFrames():b.effect._onsample;var h=b.effect.timing,i=null;h=a.normalizeTimingInput(h);var j=function(){var d=j._animation?j._animation.currentTime:null;null!==d&&(d=a.calculateIterationProgress(a.calculateActiveDuration(h),d,h),isNaN(d)&&(d=null)),d!==i&&(g?c(d,e,b.effect):c(d,b.effect,b.effect._animation)),i=d};j._animation=b,j._registered=!1,j._sequenceNumber=f++,b._callback=j,d(j)};var g=[],h=!1;b.Animation.prototype._register=function(){this._callback&&d(this._callback)}}(c,e),function(a,b,c){function d(a){return a._timing.delay+a.activeDuration+a._timing.endDelay}function e(b,c,d){this._id=d,this._parent=null,this.children=b||[],this._reparent(this.children),c=a.numericTimingToObject(c),this._timingInput=a.cloneTimingInput(c),this._timing=a.normalizeTimingInput(c,!0),this.timing=a.makeTiming(c,!0,this),this.timing._effect=this,"auto"===this._timing.duration&&(this._timing.duration=this.activeDuration)}window.SequenceEffect=function(){e.apply(this,arguments)},window.GroupEffect=function(){e.apply(this,arguments)},e.prototype={_isAncestor:function(a){for(var b=this;null!==b;){if(b==a)return!0;b=b._parent}return!1},_rebuild:function(){for(var a=this;a;)"auto"===a.timing.duration&&(a._timing.duration=a.activeDuration),a=a._parent;this._animation&&this._animation._rebuildUnderlyingAnimation()},_reparent:function(a){b.removeMulti(a);for(var c=0;c<a.length;c++)a[c]._parent=this},_putChild:function(a,b){for(var c=b?"Cannot append an ancestor or self":"Cannot prepend an ancestor or self",d=0;d<a.length;d++)if(this._isAncestor(a[d]))throw{type:DOMException.HIERARCHY_REQUEST_ERR,name:"HierarchyRequestError",message:c};for(var d=0;d<a.length;d++)b?this.children.push(a[d]):this.children.unshift(a[d]);this._reparent(a),this._rebuild()},append:function(){this._putChild(arguments,!0)},prepend:function(){this._putChild(arguments,!1)},get parent(){return this._parent},get firstChild(){return this.children.length?this.children[0]:null},get lastChild(){return this.children.length?this.children[this.children.length-1]:null},clone:function(){for(var b=a.cloneTimingInput(this._timingInput),c=[],d=0;d<this.children.length;d++)c.push(this.children[d].clone());return this instanceof GroupEffect?new GroupEffect(c,b):new SequenceEffect(c,b)},remove:function(){b.removeMulti([this])}},window.SequenceEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.SequenceEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a+=d(b)}),Math.max(a,0)}}),window.GroupEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.GroupEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a=Math.max(a,d(b))}),a}}),b.newUnderlyingAnimationForGroup=function(c){var d,e=null,f=function(b){var c=d._wrapper;if(c&&"pending"!=c.playState&&c.effect)return null==b?void c._removeChildAnimations():0==b&&c.playbackRate<0&&(e||(e=a.normalizeTimingInput(c.effect.timing)),b=a.calculateIterationProgress(a.calculateActiveDuration(e),-1,e),isNaN(b)||null==b)?(c._forEachChild(function(a){a.currentTime=-1}),void c._removeChildAnimations()):void 0},g=new KeyframeEffect(null,[],c._timing,c._id);return g.onsample=f,d=b.timeline._play(g)},b.bindAnimationForGroup=function(a){a._animation._wrapper=a,a._isGroup=!0,b.awaitStartTime(a),a._constructChildAnimations(),a._setExternalAnimation(a)},b.groupChildDuration=d}(c,e),b.true=a}({},function(){return this}());
-//# sourceMappingURL=web-animations-next-lite.min.js.map
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.js.map b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.js.map
deleted file mode 100644
index 2234d48..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next-lite.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["src/scope.js","src/timing-utilities.js","src/normalize-keyframes.js","src/deprecation.js","src/web-animations-bonus-cancel-events.js","src/web-animations-bonus-object-form-keyframes.js","src/timeline.js","src/web-animations-next-animation.js","src/keyframe-effect-constructor.js","src/effect-callback.js","src/group-constructors.js"],"names":["webAnimationsShared","webAnimations1","webAnimationsNext","shared","testing","cloneTimingInput","timingInput","clone","m","AnimationEffectTiming","this","_delay","_endDelay","_fill","_iterationStart","_iterations","_duration","_playbackRate","_direction","_easing","_easingFunction","linear","isInvalidTimingDeprecated","isDeprecated","makeTiming","forGroup","effect","timing","fill","duration","isNaN","Object","getOwnPropertyNames","forEach","property","fills","indexOf","directions","numericTimingToObject","normalizeTimingInput","cubic","a","b","c","d","x","f","start_gradient","end_gradient","start","end","mid","xEst","Math","abs","step","count","pos","stepSize","normalizeEasing","easing","styleForCleaning","document","createElement","style","animationTimingFunction","normalizedEasing","TypeError","parseEasingFunction","cubicData","cubicBezierRe","exec","apply","slice","map","Number","stepData","stepRe","Start","middle","Middle","End","presets","calculateActiveDuration","repeatedDuration","playbackRate","iterations","calculatePhase","activeDuration","localTime","PhaseNone","endTime","delay","endDelay","min","PhaseBefore","PhaseAfter","PhaseActive","calculateActiveTime","fillMode","phase","calculateOverallProgress","iterationDuration","activeTime","iterationStart","overallProgress","calculateSimpleIterationProgress","simpleIterationProgress","Infinity","calculateCurrentIteration","floor","calculateDirectedProgress","playbackDirection","currentIteration","currentDirection","calculateIterationProgress","directedProgress","direction","split","prototype","_setMember","member","value","_effect","_timingInput","_timing","_animation","_rebuildUnderlyingAnimation","ease","ease-in","ease-out","ease-in-out","step-start","step-middle","step-end","numberString","RegExp","antiAlias","aliases","isNotAnimatable","lastIndexOf","expandShorthandAndAntiAlias","result","longProperties","shorthandToLonghand","shorthandExpanderElem","i","longProperty","longhandValue","convertToArrayForm","effectInput","normalizedEffectInput","values","Array","isArray","keyframe","numKeyframes","length","offset","composite","push","sort","normalizeKeyframes","spaceKeyframes","keyframes","previousIndex","previousOffset","j","window","Symbol","iterator","from","originalKeyframe","memberValue","isFinite","type","DOMException","NOT_SUPPORTED_ERR","name","message","everyFrameHasOffset","filter","background","border","borderBottom","borderColor","borderLeft","borderRadius","borderRight","borderTop","borderWidth","flex","font","margin","outline","padding","createElementNS","borderWidthAliases","thin","medium","thick","borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","fontSize","xx-small","x-small","small","large","x-large","xx-large","fontWeight","normal","bold","outlineWidth","textShadow","none","boxShadow","silenced","feature","date","advice","plural","auxVerb","today","Date","expiry","setMonth","getMonth","console","warn","toDateString","deprecated","Error","animate","oncancel","now","performance","AnimationCancelEvent","target","currentTime","timelineTime","bubbles","cancelable","currentTarget","defaultPrevented","eventPhase","Event","AT_TARGET","timeStamp","originalElementAnimate","Element","options","animation","call","_cancelHandlers","originalCancel","cancel","event","handlers","concat","setTimeout","handler","originalAddEventListener","addEventListener","originalRemoveEventListener","removeEventListener","index","splice","element","documentElement","animated","originalOpacity","getComputedStyle","getPropertyValue","testOpacity","opacity","error","scope","webAnimationsNextTick","t","timeline","_discardAnimations","_animations","ticking","requestAnimationFrame","originalRequestAnimationFrame","_updateAnimationsPromises","AnimationTimeline","getAnimations","animationsWithPromises","_updatePromises","playState","_play","Animation","restartWebAnimationsNextTick","play","remove","defineProperty","configurable","get","e","id","_id","_timeline","_sequenceNumber","sequenceNumber","_holdTime","_paused","_isGroup","_childAnimations","_callback","_oldPlayState","oldPlayState","newPlayState","_readyPromise","_rejectReadyPromise","_resolveReadyPromise","_finishedPromise","_rejectFinishedPromise","_resolveFinishedPromise","oldPlaybackRate","oldPaused","oldStartTime","oldCurrentTime","hadUnderlying","startTime","_wrapper","KeyframeEffect","newUnderlyingAnimationForKeyframeEffect","bindAnimationForKeyframeEffect","SequenceEffect","GroupEffect","newUnderlyingAnimationForGroup","bindAnimationForGroup","_onsample","bindAnimationForCustomEffect","pause","_updateChildren","childAnimation","_arrangeChildren","groupChildDuration","bind","_setExternalAnimation","children","_constructChildAnimations","_removeChildAnimations","child","finished","Promise","resolve","reject","ABORT_ERR","ready","onfinish","v","sign","MAX_VALUE","_register","_forEachChild","awaitStartTime","time","finish","reverse","wrapped","pop","KeyframeList","_frames","updatePendingGroups","updated","pendingGroups","shift","disassociate","removeMulti","effects","oldParents","_parent","_rebuild","_normalizedKeyframes","_keyframes","getFrames","onsample","callback","parent","nullTarget","keyframeEffect","groupAnimation","originalGetComputedStyle","enumerable","arguments","register","_registered","callbacks","tick","updating","left","right","effectFunction","isKeyframeEffect","last","node","constructor","_reparent","_isAncestor","newChildren","_putChild","args","isAppend","HIERARCHY_REQUEST_ERR","unshift","append","prepend","firstChild","lastChild","clonedTiming","clonedChildren","create","total","max","group","underlyingAnimation","ticker","tf","underlyingEffect","exports","webAnimationsTesting"],"mappings":";;;;;;;;;;;;;;CAcA,SAAIA,EAAAA,GAAJ,GAAIA,MACAC,KACAC,MCFJ,SAAUC,EAAQC,GAMhB,QAASC,GAAiBC,GACxB,GAA0B,gBAAfA,GACT,MAAOA,EAET,IAAIC,KACJ,KAAK,GAAIC,KAAKF,GACZC,EAAMC,GAAKF,EAAYE,EAEzB,OAAOD,GAGT,QAASE,KACPC,KAAKC,OAAS,EACdD,KAAKE,UAAY,EACjBF,KAAKG,MAAQ,OACbH,KAAKI,gBAAkB,EACvBJ,KAAKK,YAAc,EACnBL,KAAKM,UAAY,EACjBN,KAAKO,cAAgB,EACrBP,KAAKQ,WAAa,SAClBR,KAAKS,QAAU,SACfT,KAAKU,gBAAkBC,EAGzB,QAASC,KACP,MAAOnB,GAAOoB,aAAa,wBAAyB,aAAc,gDAAA,GA8EpE,QAASC,GAAWlB,EAAamB,EAAUC,GACzC,GAAIC,GAAS,GAAIlB,EA4BjB,OA3BIgB,KACFE,EAAOC,KAAO,OACdD,EAAOE,SAAW,QAEM,gBAAfvB,IAA4BwB,MAAMxB,OAAAA,KAElCA,GACTyB,OAAOC,oBAAoB1B,GAAa2B,QAAQ,SAASC,GACvD,GAA6B,QAAzB5B,EAAY4B,GAAqB,CACnC,IAA+B,gBAApBP,GAAOO,IAAqC,YAAZA,KACL,gBAAzB5B,GAAY4B,IAAyBJ,MAAMxB,EAAY4B,KAChE,MAGJ,IAAiB,QAAZA,IAAiE,GAAzCC,EAAMC,QAAQ9B,EAAY4B,IACrD,MAEF,IAAiB,aAAZA,IAA2E,GAA9CG,EAAWD,QAAQ9B,EAAY4B,IAC/D,MAEF,IAAgB,gBAAZA,GAAwD,IAA1B5B,EAAY4B,IAAmB/B,EAAOoB,aAAa,qCAAsC,aAAc,uCACvI,MAEFI,GAAOO,GAAY5B,EAAY4B,MAlBnCP,EAAOE,SAAWvB,EAsBbqB,EAGT,QAASW,GAAsBhC,GAQ7B,MAP0B,gBAAfA,KAEPA,EADEwB,MAAMxB,IACQuB,SAAU,IAEVA,SAAUvB,IAGvBA,EAGT,QAASiC,GAAqBjC,EAAamB,GAEzC,MADAnB,GAAcH,EAAOmC,sBAAsBhC,GACpCkB,EAAWlB,EAAamB,GAGjC,QAASe,GAAMC,EAAGC,EAAGC,EAAGC,GACtB,MAAIH,GAAI,GAAKA,EAAI,GAAKE,EAAI,GAAKA,EAAI,EAC1BtB,EAEF,SAASwB,GAqBZ,QAASC,GAAEL,EAAGC,EAAGlC,GAAK,MAAO,GAAIiC,GAAK,EAAIjC,IAAM,EAAIA,GAAKA,EAAI,EAAIkC,GAAK,EAAIlC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EApBjG,GAAIqC,GAAK,EAAG,CACV,GAAIE,GAAiB,CAKrB,OAJIN,GAAI,EACNM,EAAiBL,EAAID,GACbC,GAAKC,EAAI,IACjBI,EAAiBH,EAAID,GAChBI,EAAiBF,EAE1B,GAAIA,GAAK,EAAG,CACV,GAAIG,GAAe,CAKnB,OAJIL,GAAI,EACNK,GAAgBJ,EAAI,IAAMD,EAAI,GAClB,GAALA,GAAUF,EAAI,IACrBO,GAAgBN,EAAI,IAAMD,EAAI,IACzB,EAAIO,GAAgBH,EAAI,GAIjC,IADA,GAAII,GAAQ,EAAGC,EAAM,EACdD,EAAQC,GAAK,CAClB,GAAIC,IAAOF,EAAQC,GAAO,EAEtBE,EAAON,EAAEL,EAAGE,EAAGQ,EACnB,IAAIE,KAAKC,IAAIT,EAAIO,GAAQ,KACvB,MAAON,GAAEJ,EAAGE,EAAGO,EAEbC,GAAOP,EACTI,EAAQE,EAERD,EAAMC,EAGV,MAAOL,GAAEJ,EAAGE,EAAGO,IAQnB,QAASI,GAAKC,EAAOC,GACnB,MAAO,UAASZ,GACd,GAAIA,GAAK,EACP,MAAO,EAET,IAAIa,GAAW,EAAIF,CAEnB,QADAX,GAAKY,EAAMC,GACAb,EAAIa,GAmBnB,QAASC,GAAgBC,GAClBC,IACHA,EAAmBC,SAASC,cAAc,OAAOC,OAEnDH,EAAiBI,wBAA0B,GAC3CJ,EAAiBI,wBAA0BL,CAC3C,IAAIM,GAAmBL,EAAiBI,uBACxC,IAAwB,IAApBC,GAA0B5C,IAC5B,KAAM,IAAI6C,WAAUP,EAAS,mCAE/B,OAAOM,GAGT,QAASE,GAAoBF,GAC3B,GAAwB,UAApBA,EACF,MAAO7C,EAET,IAAIgD,GAAYC,EAAcC,KAAKL,EACnC,IAAIG,EACF,MAAO7B,GAAMgC,MAAM9D,KAAM2D,EAAUI,MAAM,GAAGC,IAAIC,QAElD,IAAIC,GAAWC,EAAON,KAAKL,EAC3B,OAAIU,GACKrB,EAAKoB,OAAOC,EAAS,KAAM3B,MAAS6B,EAAOC,OAAUC,EAAQ9B,IAAO+B,GAAKL,EAAS,KAE9EM,EAAQhB,IAMd7C,EAGT,QAAS8D,GAAwBxD,GAC/B,MAAO0B,MAAKC,IAAI8B,EAAiBzD,GAAUA,EAAO0D,cAGpD,QAASD,GAAiBzD,GAExB,MAAwB,KAApBA,EAAOE,UAAwC,IAAtBF,EAAO2D,WAC3B,EAEF3D,EAAOE,SAAWF,EAAO2D,WAQlC,QAASC,GAAeC,EAAgBC,EAAW9D,GAEjD,GAAiB,MAAb8D,EACF,MAAOC,EAGT,IAAIC,GAAUhE,EAAOiE,MAAQJ,EAAiB7D,EAAOkE,QACrD,OAAIJ,GAAYpC,KAAKyC,IAAInE,EAAOiE,MAAOD,GAC9BI,EAELN,GAAapC,KAAKyC,IAAInE,EAAOiE,MAAQJ,EAAgBG,GAChDK,EAGFC,EAGT,QAASC,GAAoBV,EAAgBW,EAAUV,EAAWW,EAAOR,GAEvE,OAAQQ,GACN,IAAKL,GACH,MAAgB,aAAZI,GAAuC,QAAZA,EACtB,EACF,IACT,KAAKF,GACH,MAAOR,GAAYG,CACrB,KAAKI,GACH,MAAgB,YAAZG,GAAsC,QAAZA,EACrBX,EACF,IACT,KAAKE,GACH,MAAO,OAIb,QAASW,GAAyBC,EAAmBF,EAAOd,EAAYiB,EAAYC,GAElF,GAAIC,GAAkBD,CAQtB,OAP0B,KAAtBF,EACEF,IAAUL,IACZU,GAAmBnB,GAGrBmB,GAAmBF,EAAaD,EAE3BG,EAGT,QAASC,GAAiCD,EAAiBD,EAAgBJ,EAAOd,EAAYiB,EAAYD,GAGxG,GAAIK,GAA2BF,IAAoBG,EAAAA,EAAYJ,EAAiB,EAAIC,EAAkB,CAKtG,OAJgC,KAA5BE,GAAiCP,IAAUJ,GAA6B,IAAfV,GACzC,IAAfiB,GAA0C,IAAtBD,IACvBK,EAA0B,GAErBA,EAGT,QAASE,GAA0BT,EAAOd,EAAYqB,EAAyBF,GAE7E,MAAIL,KAAUJ,GAAcV,IAAesB,EAAAA,EAClCA,EAAAA,EAEuB,IAA5BD,EACKtD,KAAKyD,MAAML,GAAmB,EAEhCpD,KAAKyD,MAAML,GAGpB,QAASM,GAA0BC,EAAmBC,EAAkBN,GAEtE,GAAIO,GAAmBF,CACvB,IAA0B,WAAtBA,GAAwD,YAAtBA,EAAiC,CACrE,GAAIpE,GAAIqE,CACkB,uBAAtBD,IACFpE,GAAK,GAEPsE,EAAmB,SACftE,IAAMgE,EAAAA,GAAYhE,EAAI,GAAM,IAC9BsE,EAAmB,WAGvB,MAAyB,WAArBA,EACKP,EAEF,EAAIA,EAGb,QAASQ,GAA2B3B,EAAgBC,EAAW9D,GAC7D,GAAIyE,GAAQb,EAAeC,EAAgBC,EAAW9D,GAClD4E,EAAaL,EAAoBV,EAAgB7D,EAAOC,KAAM6D,EAAWW,EAAOzE,EAAOiE,MAC3F,IAAmB,OAAfW,EACF,MAAO,KAET,IAAIE,GAAkBJ,EAAyB1E,EAAOE,SAAUuE,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAO6E,gBACzGG,EAA0BD,EAAiCD,EAAiB9E,EAAO6E,eAAgBJ,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAOE,UAChJoF,EAAmBJ,EAA0BT,EAAOzE,EAAO2D,WAAYqB,EAAyBF,GAChGW,EAAmBL,EAA0BpF,EAAO0F,UAAWJ,EAAkBN,EAIrF,OAAOhF,GAAOP,gBAAgBgG,GA1XhC,GAAIjF,GAAQ,+BAA+BmF,MAAM,KAC7CjF,EAAa,sCAAsCiF,MAAM,KACzDjG,EAAS,SAASwB,GAAK,MAAOA,GA8BlCpC,GAAsB8G,WACpBC,WAAY,SAASC,EAAQC,GAC3BhH,KAAK,IAAM+G,GAAUC,EACjBhH,KAAKiH,UACPjH,KAAKiH,QAAQC,aAAaH,GAAUC,EACpChH,KAAKiH,QAAQE,QAAU1H,EAAOoC,qBAAqB7B,KAAKiH,QAAQC,cAChElH,KAAKiH,QAAQnC,eAAiBrF,EAAOgF,wBAAwBzE,KAAKiH,QAAQE,SACtEnH,KAAKiH,QAAQG,YACfpH,KAAKiH,QAAQG,WAAWC,gCAI9B1C,mBACE,MAAO3E,MAAKO,eAEd2E,UAAU8B,GACRhH,KAAK8G,WAAW,QAASE,IAE3B9B,YACE,MAAOlF,MAAKC,QAEdkF,aAAa6B,GACXhH,KAAK8G,WAAW,WAAYE,IAE9B7B,eACE,MAAOnF,MAAKE,WAEdgB,SAAS8F,GACPhH,KAAK8G,WAAW,OAAQE,IAE1B9F,WACE,MAAOlB,MAAKG,OAEd2F,mBAAmBkB,GACjB,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,2DAA6DxC,OAAO6E,eAE1F9F,MAAK8G,WAAW,iBAAkBE,IAEpClB,qBACE,MAAO9F,MAAKI,iBAEde,aAAa6F,GACX,GAAa,QAATA,IAAoB5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACpD,KAAM,IAAI6C,WAAU,oDAAsDuD,EAE5EhH,MAAK8G,WAAW,WAAYE,IAE9B7F,eACE,MAAOnB,MAAKM,WAEdqG,cAAcK,GACZhH,KAAK8G,WAAW,YAAaE,IAE/BL,gBACE,MAAO3G,MAAKQ,YAEd0C,WAAW8D,GACThH,KAAKU,gBAAkBgD,EAAoBT,EAAgB+D,IAC3DhH,KAAK8G,WAAW,SAAUE,IAE5B9D,aACE,MAAOlD,MAAKS,SAEdmE,eAAeoC,GACb,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,8CAAgDuD,EAEtEhH,MAAK8G,WAAW,aAAcE,IAEhCpC,iBACE,MAAO5E,MAAKK,aA4FhB,IAAI+D,GAAQ,EACRE,EAAS,GACTC,EAAM,EAaNC,GACF8C,KAAQxF,EAAM,IAAM,GAAK,IAAM,GAC/ByF,UAAWzF,EAAM,IAAM,EAAG,EAAG,GAC7B0F,WAAY1F,EAAM,EAAG,EAAG,IAAM,GAC9B2F,cAAe3F,EAAM,IAAM,EAAG,IAAM,GACpC4F,aAAc7E,EAAK,EAAGuB,GACtBuD,cAAe9E,EAAK,EAAGyB,GACvBsD,WAAY/E,EAAK,EAAG0B,IAGlBpB,EAAmB,KACnB0E,EAAe,qCACfjE,EAAgB,GAAIkE,QAAO,kBAAoBD,EAAe,IAAMA,EAAe,IAAMA,EAAe,IAAMA,EAAe,OAC7H1D,EAAS,gDAgDTa,EAAY,EACZK,EAAc,EACdC,EAAa,EACbC,EAAc,CA2GlB9F,GAAOE,iBAAmBA,EAC1BF,EAAOqB,WAAaA,EACpBrB,EAAOmC,sBAAwBA,EAC/BnC,EAAOoC,qBAAuBA,EAC9BpC,EAAOgF,wBAA0BA,EACjChF,EAAOgH,2BAA6BA,EACpChH,EAAOoF,eAAiBA,EACxBpF,EAAOwD,gBAAkBA,EACzBxD,EAAOiE,oBAAsBA,GAc5BpE,GCrZH,SAAUG,EAAQC,GAmIhB,QAASqI,GAAUvG,EAAUwF,GAC3B,MAAIxF,KAAYwG,GACPA,EAAQxG,GAAUwF,IAAUA,EAE9BA,EAGT,QAASiB,GAAgBzG,GAEvB,MAAoB,YAAbA,GAAmE,IAAzCA,EAAS0G,YAAY,YAAa,IAAsD,IAA1C1G,EAAS0G,YAAY,aAAc,GAIpH,QAASC,GAA4B3G,EAAUwF,EAAOoB,GACpD,IAAIH,EAAgBzG,GAApB,CAGA,GAAI6G,GAAiBC,EAAoB9G,EACzC,IAAI6G,EAAgB,CAClBE,EAAsBjF,MAAM9B,GAAYwF,CACxC,KAAK,GAAIwB,KAAKH,GAAgB,CAC5B,GAAII,GAAeJ,EAAeG,GAC9BE,EAAgBH,EAAsBjF,MAAMmF,EAChDL,GAAOK,GAAgBV,EAAUU,EAAcC,QAGjDN,GAAO5G,GAAYuG,EAAUvG,EAAUwF,IAI3C,QAAS2B,GAAmBC,GAC1B,GAAIC,KAEJ,KAAK,GAAIrH,KAAYoH,GACnB,KAAIpH,KAAa,SAAU,SAAU,cAArC,CAIA,GAAIsH,GAASF,EAAYpH,EACpBuH,OAAMC,QAAQF,KACjBA,GAAUA,GAKZ,KAAK,GAFDG,GACAC,EAAeJ,EAAOK,OACjBX,EAAI,EAAGA,EAAIU,EAAcV,IAChCS,KAGEA,EAASG,OADP,UAAYR,GACIA,EAAYQ,OACL,GAAhBF,EACS,EAEAV,GAAKU,EAAe,GAGpC,UAAYN,KACdK,EAAS/F,OAAS0F,EAAY1F,QAG5B,aAAe0F,KACjBK,EAASI,UAAYT,EAAYS,WAGnCJ,EAASzH,GAAYsH,EAAON,GAE5BK,EAAsBS,KAAKL,GAK/B,MADAJ,GAAsBU,KAAK,SAASxH,EAAGC,GAAK,MAAOD,GAAEqH,OAASpH,EAAEoH,SACzDP,EAGT,QAASW,GAAmBZ,GAqE1B,QAASa,KACP,GAAIN,GAASO,EAAUP,MACa,OAAhCO,EAAUP,EAAS,GAAGC,SACxBM,EAAUP,EAAS,GAAGC,OAAS,GAC7BD,EAAS,GAA4B,MAAvBO,EAAU,GAAGN,SAC7BM,EAAU,GAAGN,OAAS,EAIxB,KAAK,GAFDO,GAAgB,EAChBC,EAAiBF,EAAU,GAAGN,OACzBZ,EAAI,EAAGA,EAAIW,EAAQX,IAAK,CAC/B,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,IAAK,GAAIS,GAAI,EAAGA,EAAIrB,EAAImB,EAAeE,IACrCH,EAAUC,EAAgBE,GAAGT,OAASQ,GAAkBR,EAASQ,GAAkBC,GAAKrB,EAAImB,EAC9FA,GAAgBnB,EAChBoB,EAAiBR,IAnFvB,GAAmB,MAAfR,EACF,QAGEkB,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,KACjBA,EAAcD,EAAmBC,GA0CnC,KAAK,GAvCDc,GAAYd,EAAY5E,IAAI,SAASkG,GACvC,GAAIjB,KACJ,KAAK,GAAIlC,KAAUmD,GAAkB,CACnC,GAAIC,GAAcD,EAAiBnD,EACnC,IAAc,UAAVA,GACF,GAAmB,MAAfoD,EAAqB,CAEvB,GADAA,EAAclG,OAAOkG,IAChBC,SAASD,GACZ,KAAM,IAAI1G,WAAU,oCACtB,IAAI0G,EAAc,GAAKA,EAAc,EACnC,KAAM,IAAI1G,WAAU,kDAEnB,IAAc,aAAVsD,EAAuB,CAChC,GAAmB,OAAfoD,GAAuC,cAAfA,EAC1B,MACEE,KAAMC,aAAaC,kBACnBC,KAAM,oBACNC,QAAS,mCAEN,IAAmB,WAAfN,EACT,KAAM,IAAI1G,WAAU,0BAA4B0G,EAAc,SAGhEA,GADmB,UAAVpD,EACKtH,EAAOwD,gBAAgBkH,GAEvB,GAAKA,CAErBhC,GAA4BpB,EAAQoD,EAAalB,GAMnD,WAAA,IAJIA,EAASG,SACXH,EAASG,OAAS,UAAA,IAChBH,EAAS/F,SACX+F,EAAS/F,OAAS,UACb+F,IAGLyB,GAAAA,EAEAd,GAAAA,EAAAA,EACKpB,EAAI,EAAGA,EAAIkB,EAAUP,OAAQX,IAAK,CACzC,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,GAAIA,EAASQ,EACX,KAAM,IAAInG,WAAU,uEAEtBmG,GAAiBR,MAEjBsB,IAAAA,EA8BJ,MA1BAhB,GAAYA,EAAUiB,OAAO,SAAS1B,GACpC,MAAOA,GAASG,QAAU,GAAKH,EAASG,QAAU,IAsB/CsB,GACHjB,IAEKC,EAvST,GAAIpB,IACFsC,YACE,kBACA,qBACA,iBACA,mBACA,uBACA,mBACA,iBACA,mBAEFC,QACE,iBACA,iBACA,iBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,kBACA,kBACA,mBAEFC,cACE,oBACA,oBACA,qBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,YACE,kBACA,kBACA,mBAEFC,cACE,sBACA,uBACA,0BACA,0BAEFC,aACE,mBACA,mBACA,oBAEFC,WACE,iBACA,iBACA,kBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,MACE,WACA,aACA,aAEFC,MACE,aACA,WACA,YACA,cACA,aACA,cAEFC,QACE,YACA,cACA,eACA,cAEFC,SACE,eACA,eACA,gBAEFC,SACE,aACA,eACA,gBACA,gBAIAlD,EAAwBnF,SAASsI,gBAAgB,+BAAgC,OAEjFC,GACFC,KAAM,MACNC,OAAQ,MACRC,MAAO,OAGL9D,GACF+D,kBAAmBJ,EACnBK,gBAAiBL,EACjBM,iBAAkBN,EAClBO,eAAgBP,EAChBQ,UACEC,WAAY,MACZC,UAAW,MACXC,MAAS,MACTT,OAAU,OACVU,MAAS,OACTC,UAAW,OACXC,WAAY,QAEdC,YACEC,OAAQ,MACRC,KAAM,OAERC,aAAclB,EACdmB,YACEC,KAAM,2BAERC,WACED,KAAM,+BA4KVtN,GAAOkJ,mBAAqBA,EAC5BlJ,EAAO+J,mBAAqBA,GAM3BlK,GClTH,SAAUG,GAER,GAAIwN,KAEJxN,GAAOoB,aAAe,SAASqM,EAASC,EAAMC,EAAQC,GAKpD,GAAIC,GAAUD,EAAS,MAAQ,KAC3BE,EAAQ,GAAIC,MACZC,EAAS,GAAID,MAAKL,EAGtB,OAFAM,GAAOC,SAASD,EAAOE,WAAa,KAEhCJ,EAAQE,IACJP,IAAWD,IACfW,QAAQC,KAAK,mBAAqBX,EAAU,IAAMI,EAAU,wCAA0CG,EAAOK,eAAiB,KAAOV,GAEvIH,EAASC,IAAAA,EAAW,KAOxBzN,EAAOsO,WAAa,SAASb,EAASC,EAAMC,EAAQC,GAClD,GAAIC,GAAUD,EAAS,MAAQ,IAC/B,IAAI5N,EAAOoB,aAAaqM,EAASC,EAAMC,EAAQC,GAC7C,KAAM,IAAIW,OAAMd,EAAU,IAAMI,EAAU,yBAA2BF,KAIxE9N,0stBChCH,WAEE,OAAA,KAAI8D,SAASC,cAAc,OAAO4K,YAAYC,SAA9C,CAKE,GAAIC,EACC,IAAIrE,OAAOsE,aAAeA,YAAYD,IAC3C,GAAIA,GAAM,WAAa,MAAOC,aAAYD,WAE1C,IAAIA,GAAM,WAAa,MAAOX,MAAKW,MAGrC,IAAIE,GAAuB,SAASC,EAAQC,EAAaC,GACvDxO,KAAKsO,OAASA,EACdtO,KAAKuO,YAAcA,EACnBvO,KAAKwO,aAAeA,EAEpBxO,KAAKqK,KAAO,SACZrK,KAAKyO,SAAAA,EACLzO,KAAK0O,YAAAA,EACL1O,KAAK2O,cAAgBL,EACrBtO,KAAK4O,kBAAAA,EACL5O,KAAK6O,WAAaC,MAAMC,UACxB/O,KAAKgP,UAAYxB,KAAKW,OAGpBc,EAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GACvD,GAAIC,GAAYH,EAAuBI,KAAKrP,KAAM4I,EAAauG,EAE/DC,GAAUE,mBACVF,EAAUlB,SAAW,IAErB,IAAIqB,GAAiBH,EAAUI,MAC/BJ,GAAUI,OAAS,WACjBD,EAAeF,KAAKrP,KACpB,IAAIyP,GAAQ,GAAIpB,GAAqBrO,KAAM,KAAMmO,KAC7CuB,EAAW1P,KAAKsP,gBAAgBK,OAAO3P,KAAKkO,UAAYlO,KAAKkO,aACjE0B,YAAW,WACTF,EAASnO,QAAQ,SAASsO,GACxBA,EAAQR,KAAKI,EAAMnB,OAAQmB,MAE5B,GAGL,IAAIK,GAA2BV,EAAUW,gBACzCX,GAAUW,iBAAmB,SAAS1F,EAAMwF,GACpB,kBAAXA,IAAiC,UAARxF,EAClCrK,KAAKsP,gBAAgBhG,KAAKuG,GAE1BC,EAAyBT,KAAKrP,KAAMqK,EAAMwF,GAG9C,IAAIG,GAA8BZ,EAAUa,mBAW5C,OAVAb,GAAUa,oBAAsB,SAAS5F,EAAMwF,GAC7C,GAAY,UAARxF,EAAkB,CACpB,GAAI6F,GAAQlQ,KAAKsP,gBAAgB5N,QAAQmO,EACrCK,IAAS,GACXlQ,KAAKsP,gBAAgBa,OAAOD,EAAO,OAErCF,GAA4BX,KAAKrP,KAAMqK,EAAMwF,IAI1CT,OClEX,SAAU3P,GAgBR,GAAI2Q,GAAUhN,SAASiN,gBACnBjB,EAAY,KACZkB,GAAAA,CACJ,KACE,GAAIC,GAAkBC,iBAAiBJ,GAASK,iBAAiB,WAC7DC,EAAiC,KAAnBH,EAAyB,IAAM,GACjDnB,GAAYgB,EAAQnC,SAAS0C,SAAYD,EAAaA,KACjDvP,SAAU,IACfiO,EAAUb,YAAc,EACxB+B,EAAWE,iBAAiBJ,GAASK,iBAAiB,YAAcC,EACpE,MAAOE,IACP,QACIxB,GACFA,EAAUI,SAEd,IAAIc,EAAJ,CAIA,GAAIrB,GAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAUvD,MATIrF,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,IAAgC,OAAhBA,IACjCA,EAAcnJ,EAAOkJ,mBAAmBC,IAGnCqG,EAAuBI,KAAKrP,KAAM4I,EAAauG,MAEvD7P,GC/CH,SAAUG,EAAQoR,EAAOnR,GA8DvB,QAASoR,GAAsBC,GAC7B,GAAIC,GAAWH,EAAMG,QACrBA,GAASzC,YAAcwC,EACvBC,EAASC,qBAC0B,GAA/BD,EAASE,YAAY/H,OACvBgI,GAAAA,EAEAC,sBAAsBN,GApE1B,GAAIO,GAAgCvH,OAAOsH,qBAC3CtH,QAAOsH,sBAAwB,SAAShP,GACtC,MAAOiP,GAA8B,SAASlP,GAC5C0O,EAAMG,SAASM,4BACflP,EAAED,GACF0O,EAAMG,SAASM,+BAInBT,EAAMU,kBAAoB,WACxBvR,KAAKkR,eACLlR,KAAKuO,gBAAAA,IAGPsC,EAAMU,kBAAkB1K,WACtB2K,cAAe,WAEb,MADAxR,MAAKiR,qBACEjR,KAAKkR,YAAYnN,SAE1BuN,0BAA2B,WACzBT,EAAMY,uBAAyBZ,EAAMY,uBAAuB9G,OAAO,SAASyE,GAC1E,MAAOA,GAAUsC,qBAGrBT,mBAAoB,WAClBjR,KAAKsR,4BACLtR,KAAKkR,YAAclR,KAAKkR,YAAYvG,OAAO,SAASyE,GAClD,MAA8B,YAAvBA,EAAUuC,WAAkD,QAAvBvC,EAAUuC,aAG1DC,MAAO,SAAS5Q,GACd,GAAIoO,GAAY,GAAIyB,GAAMgB,UAAU7Q,EAAQhB,KAW5C,OAVAA,MAAKkR,YAAY5H,KAAK8F,GACtByB,EAAMiB,+BAMN1C,EAAUsC,kBACVtC,EAAUhI,WAAW2K,OACrB3C,EAAUsC,kBACHtC,GAET2C,KAAM,SAAS/Q,GAIb,MAHIA,IACFA,EAAOgR,SAEFhS,KAAK4R,MAAM5Q,IAItB,IAAImQ,IAAAA,CAEJN,GAAMiB,6BAA+B,WAC9BX,IACHA,GAAAA,EACAC,sBAAsBN,IAc1B,IAAIE,GAAW,GAAIH,GAAMU,iBACzBV,GAAMG,SAAWA,CAEjB,KACE3P,OAAO4Q,eAAenI,OAAO1G,SAAU,YACrC8O,cAAAA,EACAC,IAAK,WAAa,MAAOnB,MAE3B,MAAOoB,IACT,IACEtI,OAAO1G,SAAS4N,SAAWA,EAC3B,MAAOoB,MAER9S,EAAqBE,GCtFxB,SAAUC,EAAQoR,EAAOnR,GACvBmR,EAAMY,0BAENZ,EAAMgB,UAAY,SAAS7Q,EAAQgQ,GASjC,GARAhR,KAAKqS,GAAK,GACNrR,GAAUA,EAAOsR,MACnBtS,KAAKqS,GAAKrR,EAAOsR,KAEnBtS,KAAKgB,OAASA,EACVA,IACFA,EAAOoG,WAAapH,OAEjBgR,EACH,KAAM,IAAIhD,OAAM,gDAElBhO,MAAKuS,UAAYvB,EACjBhR,KAAKwS,gBAAkB/S,EAAOgT,iBAC9BzS,KAAK0S,UAAY,EACjB1S,KAAK2S,SAAAA,EACL3S,KAAK4S,UAAAA,EACL5S,KAAKoH,WAAa,KAClBpH,KAAK6S,oBACL7S,KAAK8S,UAAY,KACjB9S,KAAK+S,cAAgB,OACrB/S,KAAKqH,8BAELrH,KAAKoH,WAAWoI,SAChBxP,KAAK0R,mBAGPb,EAAMgB,UAAUhL,WACd6K,gBAAiB,WACf,GAAIsB,GAAehT,KAAK+S,cACpBE,EAAejT,KAAK2R,SAsBxB,OArBI3R,MAAKkT,eAAiBD,IAAiBD,IACrB,QAAhBC,GACFjT,KAAKmT,sBACLnT,KAAKkT,kBAAAA,IACoB,WAAhBF,EACThT,KAAKoT,uBACoB,WAAhBH,IACTjT,KAAKkT,kBAAAA,KAGLlT,KAAKqT,kBAAoBJ,IAAiBD,IACxB,QAAhBC,GACFjT,KAAKsT,yBACLtT,KAAKqT,qBAAAA,IACoB,YAAhBJ,EACTjT,KAAKuT,0BACoB,YAAhBP,IACThT,KAAKqT,qBAAAA,KAGTrT,KAAK+S,cAAgB/S,KAAK2R,UAClB3R,KAAKkT,eAAiBlT,KAAKqT,kBAErChM,4BAA6B,WAC3BrH,KAAK0R,iBACL,IAAI8B,GACAC,EACAC,EACAC,EACAC,IAAgB5T,KAAKoH,UACrBwM,KACFJ,EAAkBxT,KAAK2E,aACvB8O,EAAYzT,KAAK2S,QACjBe,EAAe1T,KAAK6T,UACpBF,EAAiB3T,KAAKuO,YACtBvO,KAAKoH,WAAWoI,SAChBxP,KAAKoH,WAAW0M,SAAW,KAC3B9T,KAAKoH,WAAa,QAGfpH,KAAKgB,QAAUhB,KAAKgB,iBAAkB8I,QAAOiK,kBAChD/T,KAAKoH,WAAayJ,EAAMmD,wCAAwChU,KAAKgB,QACrE6P,EAAMoD,+BAA+BjU,QAEnCA,KAAKgB,iBAAkB8I,QAAOoK,gBAAkBlU,KAAKgB,iBAAkB8I,QAAOqK,eAChFnU,KAAKoH,WAAayJ,EAAMuD,+BAA+BpU,KAAKgB,QAC5D6P,EAAMwD,sBAAsBrU,OAE1BA,KAAKgB,QAAUhB,KAAKgB,OAAOsT,WAC7BzD,EAAM0D,6BAA6BvU,MAEjC4T,IACqB,GAAnBJ,IACFxT,KAAK2E,aAAe6O,GAED,OAAjBE,EACF1T,KAAK6T,UAAYH,EACW,OAAnBC,EACT3T,KAAKuO,YAAcoF,EACS,OAAnB3T,KAAK0S,YACd1S,KAAKuO,YAAcvO,KAAK0S,WAEtBe,GACFzT,KAAKwU,SAGTxU,KAAK0R,mBAEP+C,gBAAiB,WACf,GAAKzU,KAAKgB,QAA4B,QAAlBhB,KAAK2R,UAAzB,CAGA,GAAIvI,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAK6S,iBAAiBtR,QAAQ,SAASmT,GACrC1U,KAAK2U,iBAAiBD,EAAgBtL,GAClCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBF,EAAe1T,UACpD6T,KAAK7U,SAET8U,sBAAuB,SAAS1F,GAC9B,GAAKpP,KAAKgB,QAAWhB,KAAK4S,SAE1B,IAAK,GAAIpK,GAAI,EAAGA,EAAIxI,KAAKgB,OAAO+T,SAAS5L,OAAQX,IAC/CxI,KAAKgB,OAAO+T,SAASvM,GAAGpB,WAAagI,EACrCpP,KAAK6S,iBAAiBrK,GAAGsM,sBAAsB1F,IAGnD4F,0BAA2B,WACzB,GAAKhV,KAAKgB,QAAWhB,KAAK4S,SAA1B,CAEA,GAAIxJ,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAKiV,yBACLjV,KAAKgB,OAAO+T,SAASxT,QAAQ,SAAS2T,GACpC,GAAIR,GAAiB7D,EAAMG,SAASY,MAAMsD,EAC1ClV,MAAK6S,iBAAiBvJ,KAAKoL,GAC3BA,EAAe/P,aAAe3E,KAAK2E,aAC/B3E,KAAK2S,SACP+B,EAAeF,QACjBU,EAAM9N,WAAapH,KAAKgB,OAAOoG,WAE/BpH,KAAK2U,iBAAiBD,EAAgBtL,GAElCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBM,KACrCL,KAAK7U,SAET2U,iBAAkB,SAASD,EAAgBtL,GAClB,OAAnBpJ,KAAK6T,UACPa,EAAenG,YAAcvO,KAAKuO,YAAcnF,EAASpJ,KAAK2E,aACrD+P,EAAeb,YAAc7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eACrE+P,EAAeb,UAAY7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eAG9DqM,eACE,MAAOhR,MAAKuS,WAEdZ,gBACE,MAAO3R,MAAKoH,WAAapH,KAAKoH,WAAWuK,UAAY,QAEvDwD,eACE,MAAKrL,QAAOsL,SAIPpV,KAAKqT,oBAC2C,GAA/CxC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKqT,iBAAmB,GAAI+B,SACxB,SAASC,EAASC,GAChBtV,KAAKuT,wBAA0B,WAC7B8B,EAAQrV,OAEVA,KAAKsT,uBAAyB,WAC5BgC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACW,YAAlBA,KAAK2R,WACP3R,KAAKuT,2BAGFvT,KAAKqT,mBApBVzF,QAAQC,KAAK,6DACN,OAqBX2H,YACE,MAAK1L,QAAOsL,SAIPpV,KAAKkT,iBAC2C,GAA/CrC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKkT,cAAgB,GAAIkC,SACrB,SAASC,EAASC,GAChBtV,KAAKoT,qBAAuB,WAC1BiC,EAAQrV,OAEVA,KAAKmT,oBAAsB,WACzBmC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACY,YAAnBA,KAAK2R,WACP3R,KAAKoT,wBAGFpT,KAAKkT,gBApBVtF,QAAQC,KAAK,6DACN,OAqBX4H,eACE,MAAOzV,MAAKoH,WAAWqO,UAEzBA,aAAaC,GAET1V,KAAKoH,WAAWqO,SADF,kBAALC,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BxH,eACE,MAAOlO,MAAKoH,WAAW8G,UAEzBA,aAAawH,GAET1V,KAAKoH,WAAW8G,SADF,kBAALwH,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BnH,kBACEvO,KAAK0R,iBACL,IAAInD,GAAcvO,KAAKoH,WAAWmH,WAElC,OADAvO,MAAK0R,kBACEnD,GAETA,gBAAgBmH,GACd1V,KAAK0R,kBACL1R,KAAKoH,WAAWmH,YAAcnE,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACtE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAM3G,YAAcmH,EAAItM,IAE1BpJ,KAAK0R,mBAEPmC,gBACE,MAAO7T,MAAKoH,WAAWyM,WAEzBA,cAAc6B,GACZ1V,KAAK0R,kBACL1R,KAAKoH,WAAWyM,UAAYzJ,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACpE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAMrB,UAAY6B,EAAItM,IAExBpJ,KAAK0R,mBAEP/M,mBACE,MAAO3E,MAAKoH,WAAWzC,cAEzBA,iBAAiBqC,GACfhH,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAWzC,aAAeqC,EAC/BhH,KAAK8V,cAAc,SAASpB,GAC1BA,EAAe/P,aAAeqC,IAET,OAAnB2M,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEPK,KAAM,WACJ/R,KAAK0R,kBACL1R,KAAK2S,SAAAA,EACL3S,KAAKoH,WAAW2K,QACiC,GAA7C/R,KAAKuS,UAAUrB,YAAYxP,QAAQ1B,OACrCA,KAAKuS,UAAUrB,YAAY5H,KAAKtJ,MAElCA,KAAK6V,YACLhF,EAAMkF,eAAe/V,MACrBA,KAAK8V,cAAc,SAASZ,GAC1B,GAAIc,GAAOd,EAAM3G,WACjB2G,GAAMnD,OACNmD,EAAM3G,YAAcyH,IAEtBhW,KAAK0R,mBAEP8C,MAAO,WACLxU,KAAK0R,kBACD1R,KAAKuO,cACPvO,KAAK0S,UAAY1S,KAAKuO,aAExBvO,KAAKoH,WAAWoN,QAChBxU,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,GAC1BA,EAAMV,UAERxU,KAAK2S,SAAAA,EACL3S,KAAK0R,mBAEPuE,OAAQ,WACNjW,KAAK0R,kBACL1R,KAAKoH,WAAW6O,SAChBjW,KAAK6V,YACL7V,KAAK0R,mBAEPlC,OAAQ,WACNxP,KAAK0R,kBACL1R,KAAKoH,WAAWoI,SAChBxP,KAAK6V,YACL7V,KAAKiV,yBACLjV,KAAK0R,mBAEPwE,QAAS,WACPlW,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAW8O,UAChBlW,KAAK8V,cAAc,SAASpB,GAC1BA,EAAewB,YAEM,OAAnBvC,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEP3B,iBAAkB,SAAS1F,EAAMwF,GAC/B,GAAIsG,GAAUtG,CACQ,mBAAXA,KACTsG,EAAU,SAAU/D,GAClBA,EAAE9D,OAAStO,KACX6P,EAAQR,KAAKrP,KAAMoS,IAClByC,KAAK7U,MACR6P,EAAQiE,SAAWqC,GAErBnW,KAAKoH,WAAW2I,iBAAiB1F,EAAM8L,IAEzClG,oBAAqB,SAAS5F,EAAMwF,GAClC7P,KAAKoH,WAAW6I,oBAAoB5F,EAAOwF,GAAWA,EAAQiE,UAAajE,IAE7EoF,uBAAwB,WACtB,KAAOjV,KAAK6S,iBAAiB1J,QAC3BnJ,KAAK6S,iBAAiBuD,MAAM5G,UAEhCsG,cAAe,SAAS1T,GACtB,GAAIgH,GAAS,CASb,IARIpJ,KAAKgB,OAAO+T,UAAY/U,KAAK6S,iBAAiB1J,OAASnJ,KAAKgB,OAAO+T,SAAS5L,QAC9EnJ,KAAKgV,4BACPhV,KAAK6S,iBAAiBtR,QAAQ,SAAS2T,GACrC9S,EAAEiN,KAAKrP,KAAMkV,EAAO9L,GAChBpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAU8L,EAAMlU,OAAO8D,iBACzB+P,KAAK7U,OAEe,WAAlBA,KAAK2R,UAAT,CAEA,GAAI1Q,GAASjB,KAAKgB,OAAOmG,QACrB4J,EAAI/Q,KAAKuO,WACH,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,KAC1E,MAAL8P,GAAa3P,MAAM2P,KACrB/Q,KAAKiV,4BAIXnL,OAAO+H,UAAYhB,EAAMgB,WAMxBvS,EAAqBE,GChXvB,SAASC,EAAQoR,EAAOnR,GAqCvB,QAAS2W,GAAazN,GACpB5I,KAAKsW,QAAU7W,EAAO+J,mBAAmBZ,GAoG3C,QAAS2N,KAEP,IADA,GAAIC,IAAAA,EACGC,EAActN,QACPsN,EAAcC,QACpBjC,kBACN+B,GAAAA,CAEF,OAAOA,GA/IT,GAAIG,GAAe,SAAS3V,GAE1B,GADAA,EAAOoG,eAAAA,GACHpG,YAAkB8I,QAAOoK,gBAAkBlT,YAAkB8I,QAAOqK,YACtE,IAAK,GAAI3L,GAAI,EAAGA,EAAIxH,EAAO+T,SAAS5L,OAAQX,IAC1CmO,EAAa3V,EAAO+T,SAASvM,IAKnCqI,GAAM+F,YAAc,SAASC,GAE3B,IAAK,GADDC,MACKtO,EAAI,EAAGA,EAAIqO,EAAQ1N,OAAQX,IAAK,CACvC,GAAIxH,GAAS6V,EAAQrO,EACjBxH,GAAO+V,UACkC,GAAvCD,EAAWpV,QAAQV,EAAO+V,UAC5BD,EAAWxN,KAAKtI,EAAO+V,SAEzB/V,EAAO+V,QAAQhC,SAAS5E,OAAOnP,EAAO+V,QAAQhC,SAASrT,QAAQV,GAAS,GACxEA,EAAO+V,QAAU,KACjBJ,EAAa3V,IACJA,EAAOoG,YAAepG,EAAOoG,WAAWpG,QAAUA,IAC3DA,EAAOoG,WAAWoI,SAClBxO,EAAOoG,WAAWpG,OAAS,GAAI+S,gBAAe,SAC1C/S,EAAOoG,WAAW0L,YACpB9R,EAAOoG,WAAW0L,UAAU1L,WAAa,MAE3CpG,EAAOoG,WAAWC,8BAClBsP,EAAa3V,IAGjB,IAAKwH,EAAI,EAAGA,EAAIsO,EAAW3N,OAAQX,IACjCsO,EAAWtO,GAAGwO,YAQlBnG,EAAMkD,eAAiB,SAASzF,EAAQ1F,EAAahJ,EAAayS,GAmBhE,MAlBArS,MAAKsO,OAASA,EACdtO,KAAK+W,QAAU,KAEfnX,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAE3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAoBI,MACpDA,KAAKiB,OAAOgG,QAAUjH,KACI,kBAAf4I,IACTnJ,EAAOsO,WAAW,wBAAyB,aAAc,wCACzD/N,KAAKiX,qBAAuBrO,GAE5B5I,KAAKiX,qBAAuB,GAAIZ,GAAazN,GAE/C5I,KAAKkX,WAAatO,EAClB5I,KAAK8E,eAAiBrF,EAAOgF,wBAAwBzE,KAAKmH,SAC1DnH,KAAKsS,IAAMD,EACJrS,MAGT6Q,EAAMkD,eAAelN,WACnBsQ,UAAW,WACT,MAAwC,kBAA7BnX,MAAKiX,qBACPjX,KAAKiX,qBACPjX,KAAKiX,qBAAqBX,SAEnCc,aAAaC,GACX,GAA+B,kBAApBrX,MAAKmX,YACd,KAAM,IAAInJ,OAAM,qEAElBhO,MAAKsU,UAAY+C,EACbrX,KAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBiQ,aACE,MAAOtX,MAAK+W,SAEdlX,MAAO,WACL,GAA+B,kBAApBG,MAAKmX,YACd,KAAM,IAAInJ,OAAM,2CAElB,IAAInO,GAAQ,GAAIkU,gBAAe/T,KAAKsO,UAAY7O,EAAOE,iBAAiBK,KAAKkH,cAAelH,KAAKsS,IAGjG,OAFAzS,GAAMoX,qBAAuBjX,KAAKiX,qBAClCpX,EAAMqX,WAAalX,KAAKkX,WACjBrX,GAETmS,OAAQ,WACNnB,EAAM+F,aAAa5W,QAIvB,IAAIiP,GAAyBC,QAAQrI,UAAUoH,OAC/CiB,SAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAChD,GAAIkD,GAAK,EAIT,OAHIlD,IAAWA,EAAQkD,KACrBA,EAAKlD,EAAQkD,IAERxB,EAAMG,SAASY,MAAM,GAAIf,GAAMkD,eAAe/T,KAAM4I,EAAauG,EAASkD,IAGnF,IAAIkF,GAAanU,SAASsI,gBAAgB,+BAAgC,MAC1EmF,GAAMmD,wCAA0C,SAASwD,GACvD,GAAIA,EAAgB,CAClB,GAAIlJ,GAASkJ,EAAelJ,QAAUiJ,EAClC7N,EAAY8N,EAAeN,UACP,mBAAbxN,KACTA,KAEF,IAAIyF,GAAUqI,EAAetQ,YAC7BiI,GAAQkD,GAAKmF,EAAelF,QAE5B,IAAIhE,GAASiJ,EACT7N,KACAyF,EAAU,CAEhB,OAAOF,GAAuBnL,MAAMwK,GAAS5E,EAAWyF,KAI1D0B,EAAMoD,+BAAiC,SAAS7E,GAC1CA,EAAUpO,QAA0D,kBAAzCoO,GAAUpO,OAAOiW,sBAC9CpG,EAAM0D,6BAA6BnF,GAIvC,IAAIqH,KACJ5F,GAAMkF,eAAiB,SAAS0B,GACG,OAA7BA,EAAe5D,WAAuB4D,EAAe7E,WAE7B,GAAxB6D,EAActN,QAChBiI,sBAAsBmF,GAExBE,EAAcnN,KAAKmO,IAWrB,IAAIC,GAA2B5N,OAAO0G,gBACtCnP,QAAO4Q,eAAenI,OAAQ,oBAC5BoI,cAAAA,EACAyF,YAAAA,EACA3Q,MAAO,WACL6J,EAAMG,SAASM,2BACf,IAAIlJ,GAASsP,EAAyB5T,MAAM9D,KAAM4X,UAIlD,OAHIrB,OACFnO,EAASsP,EAAyB5T,MAAM9D,KAAM4X,YAChD/G,EAAMG,SAASM,4BACRlJ,KAIX0B,OAAOiK,eAAiBlD,EAAMkD,eAC9BjK,OAAOoF,QAAQrI,UAAU2K,cAAgB,WACvC,MAAOpO,UAAS4N,SAASQ,gBAAgB7G,OAAO,SAASyE,GACvD,MAA4B,QAArBA,EAAUpO,QAAmBoO,EAAUpO,OAAOsN,QAAUtO,MAC/D6U,KAAK7U,SAGTV,EAAqBE,GCzKvB,SAAUC,EAAQoR,EAAOnR,GA6CvB,QAASmY,GAASR,GACZA,EAASS,cAEbT,EAASS,aAAAA,EACTC,EAAUzO,KAAK+N,GACVlG,IACHA,GAAAA,EACAC,sBAAsB4G,KAI1B,QAASA,GAAKjH,GACZ,GAAIkH,GAAWF,CACfA,MACAE,EAAS1O,KAAK,SAAS2O,EAAMC,GAC3B,MAAOD,GAAK1F,gBAAkB2F,EAAM3F,kBAEtCyF,EAAWA,EAAStN,OAAO,SAAS0M,GAClCA,GACA,IAAI1F,GAAY0F,EAASjQ,WAAaiQ,EAASjQ,WAAWuK,UAAY,MAGtE,OAFiB,WAAbA,GAAuC,WAAbA,IAC5B0F,EAASS,aAAAA,GACJT,EAASS,cAElBC,EAAUzO,KAAKxF,MAAMiU,EAAWE,GAE5BF,EAAU5O,QACZgI,GAAAA,EACAC,sBAAsB4G,IAEtB7G,GAAAA,EAzEJ,GAEIsB,IAFarP,SAASsI,gBAAgB,+BAAgC,OAErD,EACrBmF,GAAM0D,6BAA+B,SAASnF,GAC5C,GACIgJ,GADA9J,EAASc,EAAUpO,OAAOsN,OAE1B+J,EAA0D,kBAAhCjJ,GAAUpO,OAAOmW,WAE7CiB,GADEC,EACejJ,EAAUpO,OAAOmW,YAEjB/H,EAAUpO,OAAOsT,SAEpC,IAAIrT,GAASmO,EAAUpO,OAAOC,OAC1BqX,EAAO,IACXrX,GAASxB,EAAOoC,qBAAqBZ,EACrC,IAAIoW,GAAW,WACb,GAAItG,GAAIsG,EAASjQ,WAAaiQ,EAASjQ,WAAWmH,YAAc,IACtD,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,GAC7EG,MAAM2P,KACRA,EAAI,OAIJA,IAAMuH,IACJD,EACFD,EAAerH,EAAGzC,EAAQc,EAAUpO,QAEpCoX,EAAerH,EAAG3B,EAAUpO,OAAQoO,EAAUpO,OAAOoG,aAGzDkR,EAAOvH,EAGTsG,GAASjQ,WAAagI,EACtBiI,EAASS,aAAAA,EACTT,EAAS7E,gBAAkBC,IAC3BrD,EAAU0D,UAAYuE,EACtBQ,EAASR,GAGX,IAAIU,MACA5G,GAAAA,CAmCJN,GAAMgB,UAAUhL,UAAUgP,UAAY,WAChC7V,KAAK8S,WACP+E,EAAS7X,KAAK8S,aAGjBxT,EAAqBE,GCnFxB,SAAUC,EAAQoR,EAAOnR,GAEvB,QAASkV,GAAmB2D,GAC1B,MAAOA,GAAKpR,QAAQjC,MAAQqT,EAAKzT,eAAiByT,EAAKpR,QAAQhC,SAGjE,QAASqT,GAAYzD,EAAUnV,EAAayS,GAC1CrS,KAAKsS,IAAMD,EACXrS,KAAK+W,QAAU,KACf/W,KAAK+U,SAAWA,MAChB/U,KAAKyY,UAAUzY,KAAK+U,UACpBnV,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAAAA,GAC3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAmBI,MACnDA,KAAKiB,OAAOgG,QAAUjH,KAEQ,SAA1BA,KAAKmH,QAAQhG,WACfnB,KAAKmH,QAAQhG,SAAWnB,KAAK8E,gBAIjCgF,OAAOoK,eAAiB,WACtBsE,EAAY1U,MAAM9D,KAAM4X,YAG1B9N,OAAOqK,YAAc,WACnBqE,EAAY1U,MAAM9D,KAAM4X,YAG1BY,EAAY3R,WACV6R,YAAa,SAAS1X,GAEpB,IADA,GAAIe,GAAI/B,KACK,OAAN+B,GAAY,CACjB,GAAIA,GAAKf,EACP,OAAA,CACFe,GAAIA,EAAEgV,QAER,OAAA,GAEFC,SAAU,WAGR,IADA,GAAIuB,GAAOvY,KACJuY,GACwB,SAAzBA,EAAKtX,OAAOE,WACdoX,EAAKpR,QAAQhG,SAAWoX,EAAKzT,gBAE/ByT,EAAOA,EAAKxB,OAEV/W,MAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBoR,UAAW,SAASE,GAClB9H,EAAM+F,YAAY+B,EAClB,KAAK,GAAInQ,GAAI,EAAGA,EAAImQ,EAAYxP,OAAQX,IACtCmQ,EAAYnQ,GAAGuO,QAAU/W,MAG7B4Y,UAAW,SAASC,EAAMC,GAExB,IAAK,GADDrO,GAAUqO,EAAW,oCAAsC,qCACtDtQ,EAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/B,GAAIxI,KAAK0Y,YAAYG,EAAKrQ,IACxB,MACE6B,KAAMC,aAAayO,sBACnBvO,KAAM,wBACNC,QAASA,EAKf,KAAK,GAAIjC,GAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/BsQ,EAAW9Y,KAAK+U,SAASzL,KAAKuP,EAAKrQ,IAAMxI,KAAK+U,SAASiE,QAAQH,EAAKrQ,GAEtExI,MAAKyY,UAAUI,GACf7Y,KAAKgX,YAEPiC,OAAQ,WACNjZ,KAAK4Y,UAAUhB,WAAAA,IAEjBsB,QAAS,WACPlZ,KAAK4Y,UAAUhB,WAAAA,IAEjBN,aACE,MAAOtX,MAAK+W,SAEdoC,iBACE,MAAOnZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS,GAAK,MAEnDqE,gBACE,MAAOpZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS/U,KAAK+U,SAAS5L,OAAS,GAAK,MAE1EtJ,MAAO,WAGL,IAAK,GAFDwZ,GAAe5Z,EAAOE,iBAAiBK,KAAKkH,cAC5CoS,KACK9Q,EAAI,EAAGA,EAAIxI,KAAK+U,SAAS5L,OAAQX,IACxC8Q,EAAehQ,KAAKtJ,KAAK+U,SAASvM,GAAG3I,QAEvC,OAAQG,gBAAgBmU,aACpB,GAAIA,aAAYmF,EAAgBD,GAChC,GAAInF,gBAAeoF,EAAgBD,IAEzCrH,OAAQ,WACNnB,EAAM+F,aAAa5W,SAIvB8J,OAAOoK,eAAerN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WAC5DxF,OAAO4Q,eACHnI,OAAOoK,eAAerN,UACtB,kBAEEsL,IAAK,WACH,GAAIqH,GAAQ,CAIZ,OAHAxZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BsE,GAAS5E,EAAmBM,KAEvBvS,KAAK8W,IAAID,EAAO,MAI/B1P,OAAOqK,YAAYtN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WACzDxF,OAAO4Q,eACHnI,OAAOqK,YAAYtN,UACnB,kBAEEsL,IAAK,WACH,GAAIsH,GAAM,CAIV,OAHAzZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BuE,EAAM9W,KAAK8W,IAAIA,EAAK7E,EAAmBM,MAElCuE,KAIf5I,EAAMuD,+BAAiC,SAASsF,GAC9C,GAAIC,GACA1Y,EAAS,KACT2Y,EAAS,SAASC,GACpB,GAAIzK,GAAYuK,EAAoB7F,QACpC,IAAK1E,GAGsB,WAAvBA,EAAUuC,WAGTvC,EAAUpO,OAGf,MAAU,OAAN6Y,MACFzK,GAAU6F,yBAQF,GAAN4E,GAAWzK,EAAUzK,aAAe,IACjC1D,IACHA,EAASxB,EAAOoC,qBAAqBuN,EAAUpO,OAAOC,SAExD4Y,EAAKpa,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,IAAU,EAAGA,GAC/EG,MAAMyY,IAAa,MAANA,IACfzK,EAAU0G,cAAc,SAASZ,GAC/BA,EAAM3G,aAAe,QAEvBa,GAAU6F,8BAAAA,IAMZ6E,EAAmB,GAAI/F,gBAAe,QAAU2F,EAAMvS,QAASuS,EAAMpH,IAGzE,OAFAwH,GAAiB1C,SAAWwC,EAC5BD,EAAsB9I,EAAMG,SAASY,MAAMkI,IAI7CjJ,EAAMwD,sBAAwB,SAASjF,GACrCA,EAAUhI,WAAW0M,SAAW1E,EAChCA,EAAUwD,UAAAA,EACV/B,EAAMkF,eAAe3G,GACrBA,EAAU4F,4BACV5F,EAAU0F,sBAAsB1F,IAGlCyB,EAAM+D,mBAAqBA,GAE1BtV,EAAqBE,GV3LpBA,EAAAA,KAEJua,MACMC,WAAAA,MAAuBha","file":"web-animations-next-lite.min.js"}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.html b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.html
deleted file mode 100644
index 536e092..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="./web-animations-next.min.js"></script>
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.js b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.js
deleted file mode 100644
index 99e293f..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-!function(a,b){var c={},d={},e={};!function(a,b){function c(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function d(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear",this._easingFunction=x}function e(){return a.isDeprecated("Invalid timing inputs","2016-03-02","TypeError exceptions will be thrown instead.",!0)}function f(b,c,e){var f=new d;return c&&(f.fill="both",f.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof f[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==v.indexOf(b[c]))return;if("direction"==c&&-1==w.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;f[c]=b[c]}}):f.duration=b,f}function g(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function h(b,c){return b=a.numericTimingToObject(b),f(b,c)}function i(a,b,c,d){return a<0||a>1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i<j;){var k=(i+j)/2,l=f(a,c,k);if(Math.abs(e-l)<1e-5)return f(b,d,k);l<e?i=k:j=k}return f(b,d,k)}}function j(a,b){return function(c){if(c>=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);return c?j(Number(c[1]),{start:y,middle:z,end:A}[c[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return G;var d=c.delay+a+c.endDelay;return b<Math.min(c.delay,d)?H:b>=Math.min(c.delay+a,d)?I:J}function p(a,b,c,d,e){switch(d){case H:return"backwards"==b||"both"==b?0:null;case J:return c-e;case I:return"forwards"==b||"both"==b?a:null;case G:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==H&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==I||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===I&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+timing.iterationStart);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,G=0,H=1,I=2,J=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(c),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g<f;g++)e={},e.offset="offset"in a?a.offset:1==f?1:g/(f-1),"easing"in a&&(e.easing=a.easing),"composite"in a&&(e.composite=a.composite),e[c]=d[g],b.push(e)}return b.sort(function(a,b){return a.offset-b.offset}),b}function g(b){function c(){var a=d.length;null==d[a-1].offset&&(d[a-1].offset=1),a>1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e<a;e++){var f=d[e].offset;if(null!=f){for(var g=1;g<e-b;g++)d[b+g].offset=c+(f-c)*g/(e-b);b=e,c=f}}}if(null==b)return[];window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||(b=f(b));for(var d=b.map(function(b){var c={};for(var d in b){var f=b[d];if("offset"==d){if(null!=f){if(f=Number(f),!isFinite(f))throw new TypeError("Keyframe offsets must be numbers.");if(f<0||f>1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i<d.length;i++){var j=d[i].offset;if(null!=j){if(j<h)throw new TypeError("Keyframes are not loosely sorted by offset. Sort or specify offsets.");h=j}else g=!1}return d=d.filter(function(a){return a.offset>=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(c),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g<h&&(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,1))},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b,c){function d(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function e(c){var d=[];for(var e in c)for(var f=c[e],g=0;g<f.length-1;g++){var h=g,i=g+1,j=f[h].offset,k=f[i].offset,l=j,m=k;0==g&&(l=-1/0,0==k&&(i=h)),g==f.length-2&&(m=1/0,1==j&&(h=i)),d.push({applyFrom:l,applyTo:m,startOffset:f[h].offset,endOffset:f[i].offset,easingFunction:a.parseEasingFunction(f[h].easing),property:e,interpolation:b.propertyInterpolation(e,f[h].value,f[i].value)})}return d.sort(function(a,b){return a.startOffset-b.startOffset}),d}b.convertEffectInput=function(c){var f=a.normalizeKeyframes(c),g=d(f),h=e(g);return function(a,c){if(null!=c)h.filter(function(a){return c>=a.applyFrom&&c<a.applyTo}).forEach(function(d){var e=c-d.startOffset,f=d.endOffset-d.startOffset,g=0==f?0:d.easingFunction(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d),function(a,b,c){function d(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function e(a,b,c){h[c]=h[c]||[],h[c].push([a,b])}function f(a,b,c){for(var f=0;f<c.length;f++){e(a,b,d(c[f]))}}function g(c,e,f){var g=c;/-/.test(c)&&!a.isDeprecated("Hyphenated property names","2016-03-22","Use camelCase instead.",!0)&&(g=d(c)),"initial"!=e&&"initial"!=f||("initial"==e&&(e=i[g]),"initial"==f&&(f=i[g]));for(var j=e==f?[]:h[g],k=0;j&&k<j.length;k++){var l=j[k][0](e),m=j[k][0](f);if(void 0!==l&&void 0!==m){var n=j[k][1](l,m);if(n){var o=b.Interpolation.apply(null,n);return function(a){return 0==a?e:1==a?f:o(a)}}}}return b.Interpolation(!1,!0,function(a){return a?f:e})}var h={};b.addPropertiesHandler=f;var i={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",strokeDasharray:"none",strokeDashoffset:"0px",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};b.propertyInterpolation=g}(c,d),function(a,b,c){function d(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateIterationProgress(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d}b.KeyframeEffect=function(c,e,f,g){var h,i=d(a.normalizeTimingInput(f)),j=b.convertEffectInput(e),k=function(){j(c,h)};return k._update=function(a){return null!==(h=i(a))},k._clear=function(){j(c,null)},k._hasSameTarget=function(a){return c===a},k._target=c,k._totalDuration=i._totalDuration,k._id=g,k}}(c,d),function(a,b){function c(a,b){return!(!b.namespaceURI||-1==b.namespaceURI.indexOf("/svg"))&&(g in a||(a[g]=/Trident|MSIE|IEMobile|Edge|Android 4/i.test(a.navigator.userAgent)),a[g])}function d(a,b,c){c.enumerable=!0,c.configurable=!0,Object.defineProperty(a,b,c)}function e(a){this._element=a,this._surrogateStyle=document.createElementNS("http://www.w3.org/1999/xhtml","div").style,this._style=a.style,this._length=0,this._isAnimatedProperty={},this._updateSvgTransformAttr=c(window,a),this._savedTransformAttr=null;for(var b=0;b<this._style.length;b++){var d=this._style[b];this._surrogateStyle[d]=this._style[d]}this._updateIndices()}function f(a){if(!a._webAnimationsPatchedStyle){var b=new e(a);try{d(a,"style",{get:function(){return b}})}catch(b){a.style._set=function(b,c){a.style[b]=c},a.style._clear=function(b){a.style[b]=""}}a._webAnimationsPatchedStyle=a.style}}var g="_webAnimationsUpdateSvgTransformAttr",h={cssText:1,length:1,parentRule:1},i={getPropertyCSSValue:1,getPropertyPriority:1,getPropertyValue:1,item:1,removeProperty:1,setProperty:1},j={removeProperty:1,setProperty:1};e.prototype={get cssText(){return this._surrogateStyle.cssText},set cssText(a){for(var b={},c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;this._surrogateStyle.cssText=a,this._updateIndices();for(var c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;for(var d in b)this._isAnimatedProperty[d]||this._style.setProperty(d,this._surrogateStyle.getPropertyValue(d))},get length(){return this._surrogateStyle.length},get parentRule(){return this._style.parentRule},_updateIndices:function(){for(;this._length<this._surrogateStyle.length;)Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,get:function(a){return function(){return this._surrogateStyle[a]}}(this._length)}),this._length++;for(;this._length>this._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(b,c){this._style[b]=c,this._isAnimatedProperty[b]=!0,this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(null==this._savedTransformAttr&&(this._savedTransformAttr=this._element.getAttribute("transform")),this._element.setAttribute("transform",a.transformToSvgMatrix(c)))},_clear:function(b){this._style[b]=this._surrogateStyle[b],this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(this._savedTransformAttr?this._element.setAttribute("transform",this._savedTransformAttr):this._element.removeAttribute("transform"),this._savedTransformAttr=null),delete this._isAnimatedProperty[b]}};for(var k in i)e.prototype[k]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(k,k in j);for(var l in document.documentElement.style)l in h||l in i||function(a){d(e.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(l);a.apply=function(b,c,d){f(b),b.style._set(a.propertyName(c),d)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(d),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(d),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f<a.length;f++)e.push(c(a[f],b[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+b}a.Interpolation=function(a,b,d){return function(e){return d(c(a,b,e))}}}(d),function(a,b){function c(a,b,c){return Math.max(Math.min(a,c),b)}function d(b,d,e){var f=a.dot(b,d);f=c(f,-1,1);var g=[];if(1===f)g=b;else for(var h=Math.acos(f),i=1*Math.sin(e*h)/Math.sqrt(1-f*f),j=0;j<4;j++)g.push(b[j]*(Math.cos(e*h)-f*i)+d[j]*i);return g}var e=function(){function a(a,b){for(var c=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],d=0;d<4;d++)for(var e=0;e<4;e++)for(var f=0;f<4;f++)c[d][e]+=b[d][f]*a[f][e];return c}function b(a){return 0==a[0][2]&&0==a[0][3]&&0==a[1][2]&&0==a[1][3]&&0==a[2][0]&&0==a[2][1]&&1==a[2][2]&&0==a[2][3]&&0==a[3][2]&&1==a[3][3]}function c(c,d,e,f,g){for(var h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],i=0;i<4;i++)h[i][3]=g[i];for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[3][i]+=c[j]*h[j][i];var k=f[0],l=f[1],m=f[2],n=f[3],o=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];o[0][0]=1-2*(l*l+m*m),o[0][1]=2*(k*l-m*n),o[0][2]=2*(k*m+l*n),o[1][0]=2*(k*l+m*n),o[1][1]=1-2*(k*k+m*m),o[1][2]=2*(l*m-k*n),o[2][0]=2*(k*m-l*n),o[2][1]=2*(l*m+k*n),o[2][2]=1-2*(k*k+l*l),h=a(h,o);var p=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];e[2]&&(p[2][1]=e[2],h=a(h,p)),e[1]&&(p[2][1]=0,p[2][0]=e[0],h=a(h,p)),e[0]&&(p[2][0]=0,p[1][0]=e[0],h=a(h,p));for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[i][j]*=d[i];return b(h)?[h[0][0],h[0][1],h[1][0],h[1][1],h[3][0],h[3][1]]:h[0].concat(h[1],h[2],h[3])}return c}();a.composeMatrix=e,a.quat=d}(d),function(a,b,c){a.sequenceNumber=0;var d=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this.id="",b&&b._id&&(this.id=b._id),this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!0,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this.playbackRate<0&&0===this.currentTime?this._inEffect=this._effect._update(-1):this._inEffect=this._effect._update(this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._isFinished=!0,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(c,d),function(a,b,c){function d(a){var b=j;j=[],a<q.currentTime&&(a=q.currentTime),q._animations.sort(e),q._animations=h(a,!0,q._animations)[0],b.forEach(function(b){b[1](a)}),g(),l=void 0}function e(a,b){return a._sequenceNumber-b._sequenceNumber}function f(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function g(){o.forEach(function(a){a()}),o.length=0}function h(a,c,d){p=!0,n=!1,b.timeline.currentTime=a,m=!1;var e=[],f=[],g=[],h=[];return d.forEach(function(b){b._tick(a,c),b._inEffect?(f.push(b._effect),b._markTarget()):(e.push(b._effect),b._unmarkTarget()),b._needsTick&&(m=!0);var d=b._inEffect||b._needsTick;b._inTimeline=d,d?g.push(b):h.push(b)}),o.push.apply(o,e),o.push.apply(o,f),m&&requestAnimationFrame(function(){}),p=!1,[g,h]}var i=window.requestAnimationFrame,j=[],k=0;window.requestAnimationFrame=function(a){var b=k++;return 0==j.length&&i(d),j.push([b,a]),b},window.cancelAnimationFrame=function(a){j.forEach(function(b){b[0]==a&&(b[1]=function(){})})},f.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.applyDirtiedAnimation(d),d}};var l=void 0,m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n},b.applyDirtiedAnimation=function(a){if(!p){a._markTarget();var c=a._targetAnimations();c.sort(e),h(b.timeline.currentTime,!1,c.slice())[1].forEach(function(a){var b=q._animations.indexOf(a);-1!==b&&q._animations.splice(b,1)}),g()}};var o=[],p=!1,q=new f;b.timeline=q}(c,d),function(a,b){function c(a,b){for(var c=0,d=0;d<a.length;d++)c+=a[d]*b[d];return c}function d(a,b){return[a[0]*b[0]+a[4]*b[1]+a[8]*b[2]+a[12]*b[3],a[1]*b[0]+a[5]*b[1]+a[9]*b[2]+a[13]*b[3],a[2]*b[0]+a[6]*b[1]+a[10]*b[2]+a[14]*b[3],a[3]*b[0]+a[7]*b[1]+a[11]*b[2]+a[15]*b[3],a[0]*b[4]+a[4]*b[5]+a[8]*b[6]+a[12]*b[7],a[1]*b[4]+a[5]*b[5]+a[9]*b[6]+a[13]*b[7],a[2]*b[4]+a[6]*b[5]+a[10]*b[6]+a[14]*b[7],a[3]*b[4]+a[7]*b[5]+a[11]*b[6]+a[15]*b[7],a[0]*b[8]+a[4]*b[9]+a[8]*b[10]+a[12]*b[11],a[1]*b[8]+a[5]*b[9]+a[9]*b[10]+a[13]*b[11],a[2]*b[8]+a[6]*b[9]+a[10]*b[10]+a[14]*b[11],a[3]*b[8]+a[7]*b[9]+a[11]*b[10]+a[15]*b[11],a[0]*b[12]+a[4]*b[13]+a[8]*b[14]+a[12]*b[15],a[1]*b[12]+a[5]*b[13]+a[9]*b[14]+a[13]*b[15],a[2]*b[12]+a[6]*b[13]+a[10]*b[14]+a[14]*b[15],a[3]*b[12]+a[7]*b[13]+a[11]*b[14]+a[15]*b[15]]}function e(a){var b=a.rad||0;return((a.deg||0)/360+(a.grad||0)/400+(a.turn||0))*(2*Math.PI)+b}function f(a){switch(a.t){case"rotatex":var b=e(a.d[0]);return[1,0,0,0,0,Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1];case"rotatey":var b=e(a.d[0]);return[Math.cos(b),0,-Math.sin(b),0,0,1,0,0,Math.sin(b),0,Math.cos(b),0,0,0,0,1];case"rotate":case"rotatez":var b=e(a.d[0]);return[Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1,0,0,0,0,1];case"rotate3d":var c=a.d[0],d=a.d[1],f=a.d[2],b=e(a.d[3]),g=c*c+d*d+f*f;if(0===g)c=1,d=0,f=0;else if(1!==g){var h=Math.sqrt(g);c/=h,d/=h,f/=h}var i=Math.sin(b/2),j=i*Math.cos(b/2),k=i*i;return[1-2*(d*d+f*f)*k,2*(c*d*k+f*j),2*(c*f*k-d*j),0,2*(c*d*k-f*j),1-2*(c*c+f*f)*k,2*(d*f*k+c*j),0,2*(c*f*k+d*j),2*(d*f*k-c*j),1-2*(c*c+d*d)*k,0,0,0,0,1];case"scale":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,1,0,0,0,0,1];case"scalex":return[a.d[0],0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"scaley":return[1,0,0,0,0,a.d[0],0,0,0,0,1,0,0,0,0,1];case"scalez":return[1,0,0,0,0,1,0,0,0,0,a.d[0],0,0,0,0,1];case"scale3d":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,a.d[2],0,0,0,0,1];case"skew":var l=e(a.d[0]),m=e(a.d[1]);return[1,Math.tan(m),0,0,Math.tan(l),1,0,0,0,0,1,0,0,0,0,1];case"skewx":var b=e(a.d[0]);return[1,0,0,0,Math.tan(b),1,0,0,0,0,1,0,0,0,0,1];case"skewy":var b=e(a.d[0]);return[1,Math.tan(b),0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"translate":var c=a.d[0].px||0,d=a.d[1].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,0,1];case"translatex":var c=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,0,0,1];case"translatey":var d=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,d,0,1];case"translatez":var f=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,f,1];case"translate3d":var c=a.d[0].px||0,d=a.d[1].px||0,f=a.d[2].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,f,1];case"perspective":return[1,0,0,0,0,1,0,0,0,0,1,a.d[0].px?-1/a.d[0].px:0,0,0,0,1];case"matrix":return[a.d[0],a.d[1],0,0,a.d[2],a.d[3],0,0,0,0,1,0,a.d[4],a.d[5],0,1];case"matrix3d":return a.d}}function g(a){return 0===a.length?[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]:a.map(f).reduce(d)}function h(a){return[i(g(a))]}var i=function(){function a(a){return a[0][0]*a[1][1]*a[2][2]+a[1][0]*a[2][1]*a[0][2]+a[2][0]*a[0][1]*a[1][2]-a[0][2]*a[1][1]*a[2][0]-a[1][2]*a[2][1]*a[0][0]-a[2][2]*a[0][1]*a[1][0]}function b(b){for(var c=1/a(b),d=b[0][0],e=b[0][1],f=b[0][2],g=b[1][0],h=b[1][1],i=b[1][2],j=b[2][0],k=b[2][1],l=b[2][2],m=[[(h*l-i*k)*c,(f*k-e*l)*c,(e*i-f*h)*c,0],[(i*j-g*l)*c,(d*l-f*j)*c,(f*g-d*i)*c,0],[(g*k-h*j)*c,(j*e-d*k)*c,(d*h-e*g)*c,0]],n=[],o=0;o<3;o++){for(var p=0,q=0;q<3;q++)p+=b[3][q]*m[q][o];n.push(p)}return n.push(1),m.push(n),m}function d(a){return[[a[0][0],a[1][0],a[2][0],a[3][0]],[a[0][1],a[1][1],a[2][1],a[3][1]],[a[0][2],a[1][2],a[2][2],a[3][2]],[a[0][3],a[1][3],a[2][3],a[3][3]]]}function e(a,b){for(var c=[],d=0;d<4;d++){for(var e=0,f=0;f<4;f++)e+=a[f]*b[f][d];c.push(e)}return c}function f(a){var b=g(a);return[a[0]/b,a[1]/b,a[2]/b]}function g(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function h(a,b,c,d){return[c*a[0]+d*b[0],c*a[1]+d*b[1],c*a[2]+d*b[2]]}function i(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function j(j){var k=[j.slice(0,4),j.slice(4,8),j.slice(8,12),j.slice(12,16)];if(1!==k[3][3])return null;for(var l=[],m=0;m<4;m++)l.push(k[m].slice());for(var m=0;m<3;m++)l[m][3]=0;if(0===a(l))return null;var n,o=[];k[0][3]||k[1][3]||k[2][3]?(o.push(k[0][3]),o.push(k[1][3]),o.push(k[2][3]),o.push(k[3][3]),n=e(o,d(b(l)))):n=[0,0,0,1];var p=k[3].slice(0,3),q=[];q.push(k[0].slice(0,3));var r=[];r.push(g(q[0])),q[0]=f(q[0]);var s=[];q.push(k[1].slice(0,3)),s.push(c(q[0],q[1])),q[1]=h(q[1],q[0],1,-s[0]),r.push(g(q[1])),q[1]=f(q[1]),s[0]/=r[1],q.push(k[2].slice(0,3)),s.push(c(q[0],q[2])),q[2]=h(q[2],q[0],1,-s[1]),s.push(c(q[1],q[2])),q[2]=h(q[2],q[1],1,-s[2]),r.push(g(q[2])),q[2]=f(q[2]),s[1]/=r[2],s[2]/=r[2];var t=i(q[1],q[2]);if(c(q[0],t)<0)for(var m=0;m<3;m++)r[m]*=-1,q[m][0]*=-1,q[m][1]*=-1,q[m][2]*=-1;var u,v,w=q[0][0]+q[1][1]+q[2][2]+1;return w>1e-4?(u=.5/Math.sqrt(w),v=[(q[2][1]-q[1][2])*u,(q[0][2]-q[2][0])*u,(q[1][0]-q[0][1])*u,.25/u]):q[0][0]>q[1][1]&&q[0][0]>q[2][2]?(u=2*Math.sqrt(1+q[0][0]-q[1][1]-q[2][2]),v=[.25*u,(q[0][1]+q[1][0])/u,(q[0][2]+q[2][0])/u,(q[2][1]-q[1][2])/u]):q[1][1]>q[2][2]?(u=2*Math.sqrt(1+q[1][1]-q[0][0]-q[2][2]),v=[(q[0][1]+q[1][0])/u,.25*u,(q[1][2]+q[2][1])/u,(q[0][2]-q[2][0])/u]):(u=2*Math.sqrt(1+q[2][2]-q[0][0]-q[1][1]),v=[(q[0][2]+q[2][0])/u,(q[1][2]+q[2][1])/u,.25*u,(q[1][0]-q[0][1])/u]),[p,r,s,v,n]}return j}();a.dot=c,a.makeMatrixDecomposition=h,a.transformListToMatrix=g}(d),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,c<=0))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}if(""==c)return d}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;k<j;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);if(e&&e[0].length)return[d,e[1]]}function c(c){var d=a.consumeRepeated(b,/^,/,c);if(d&&""==d[1])return d[0]}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a,b){function c(a){return a.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function d(a,b,c){return Math.min(b,Math.max(a,c))}function e(a){if(/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a))return Number(a)}function f(a,b){return[a,b,c]}function g(a,b){if(0!=a)return i(0,1/0)(a,b)}function h(a,b){return[a,b,function(a){return Math.round(d(1,1/0,a))}]}function i(a,b){return function(e,f){return[e,f,function(e){return c(d(a,b,e))}]}}function j(a){var b=a.trim().split(/\s*[\s,]\s*/);if(0!==b.length){for(var c=[],d=0;d<b.length;d++){var f=e(b[d]);if(void 0===f)return;c.push(f)}return c}}function k(a,b){if(a.length==b.length)return[a,b,function(a){return a.map(c).join(" ")}]}function l(a,b){return[a,b,Math.round]}a.clamp=d,a.addPropertiesHandler(j,k,["stroke-dasharray"]),a.addPropertiesHandler(e,i(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(e,i(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(e,g,["flex-grow","flex-shrink"]),a.addPropertiesHandler(e,h,["orphans","widows"]),a.addPropertiesHandler(e,l,["z-index"]),a.parseNumber=e,a.parseNumberList=j,a.mergeNumbers=f,a.numberToString=c}(d),function(a,b){function c(a,b){if("visible"==a||"visible"==b)return[0,1,function(c){return c<=0?a:c>=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(d),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(d),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h<g.length;)g[h].test(f)?(f=f.replace(g[h],"$1"),h=0):h++;if("D"==f){for(var i in d){var j=c(b.replace(new RegExp("U"+i,"g"),"").replace(new RegExp(e,"g"),"*0"));if(!isFinite(j))return;d[i]=j}return d}}}function e(a,b){return f(a,b,!0)}function f(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(d),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(d),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var k=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(void 0===(p=q?{A:function(b){return"0"==b.trim()?m:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:m,n:k[0],t:l}[r]))return;k.push(p)}if(e.push({t:g,d:k}),d.lastIndex==b.length)return e}}function f(a){return a.toFixed(6).replace(".000000","")}function g(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var e=a.makeMatrixDecomposition(c)}return null==d[0]||null==e[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),e[0].push(1),[d,e,function(b){var c=a.quat(d[0][3],e[0][3],b[5]);return a.composeMatrix(b[0],b[1],b[2],c,b[4]).map(f).join(",")}])}function h(a){return a.replace(/[xy]/,"")}function i(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function j(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var f=0;f<b.length;f++){var j=b[f].t,k=b[f].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var m=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var f=0;f<b.length;f++){var j,s=b[f].t,t=c[f].t,u=b[f].d,v=c[f].d,w=n[s],x=n[t];if(m(s,t)){if(!d)return;var r=g([b[f]],[c[f]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&h(s)==h(t))j=h(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||i(s)!=i(t)){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=i(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var k=null,l={px:0},m={deg:0},n={matrix:["NNNNNN",[k,k,0,0,k,k,0,0,0,0,1,0,k,k,0,1],d],matrix3d:["NNNNNNNNNNNNNNNN",d],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",c([k,k,1]),d],scalex:["N",c([k,1,1]),c([k,1])],scaley:["N",c([1,k,1]),c([1,k])],scalez:["N",c([1,1,k])],scale3d:["NNN",d],skew:["Aa",null,d],skewx:["A",null,c([k,m])],skewy:["A",null,c([m,k])],translate:["Tt",c([k,k,l]),d],translatex:["T",c([k,l,l]),c([k,l])],translatey:["T",c([l,k,l]),c([l,k])],translatez:["L",c([l,l,k])],translate3d:["TTL",d]};a.addPropertiesHandler(e,j,["transform"]),a.transformToSvgMatrix=function(b){var c=a.transformListToMatrix(e(b));return"matrix("+f(c[0])+" "+f(c[1])+" "+f(c[4])+" "+f(c[5])+" "+f(c[12])+" "+f(c[13])+")"}}(d),function(a){function b(a){var b=Number(a);if(!(isNaN(b)||b<100||b>900||b%100!=0))return b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(d),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k<f.length;k++){var l=f[k];"string"==typeof l?(j=/bottom|right/.test(l),i={left:0,right:0,center:i,top:1,bottom:1}[l],h[i]=g[l],"center"==l&&i++):(j&&(l=b(l),l["%"]=(l["%"]||0)+100),h[i]=l,i++,j=!1)}return[h,e[1]]}}function f(b){var c=a.consumeRepeated(e,/^,/,b);if(c&&""==c[1])return c[0]}var g={left:{"%":0},center:{"%":50},right:{"%":100},top:{"%":0},bottom:{"%":100}},h=a.mergeNestedRepeated.bind(null,a.mergeDimensions," ");a.addPropertiesHandler(d.bind(null,3),h,["transform-origin"]),a.addPropertiesHandler(d.bind(null,2),h,["perspective-origin"]),a.consumePosition=e,a.mergeOffsetList=h;var i=a.mergeNestedRepeated.bind(null,h,", ");a.addPropertiesHandler(f,i,["background-position","object-position"])}(d),function(a){function b(b){var c=a.consumeToken(/^circle/,b);if(c&&c[0])return["circle"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),d,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],c[1]));var f=a.consumeToken(/^ellipse/,b);if(f&&f[0])return["ellipse"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),e,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],f[1]));var g=a.consumeToken(/^polygon/,b);return g&&g[0]?["polygon"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),a.optional(a.consumeToken.bind(void 0,/^nonzero\s*,|^evenodd\s*,/),"nonzero,"),a.consumeSizePairList,a.ignore(a.consumeToken.bind(void 0,/^\)/))],g[1])):void 0}function c(b,c){if(b[0]===c[0])return"circle"==b[0]?a.mergeList(b.slice(1),c.slice(1),["circle(",a.mergeDimensions," at ",a.mergeOffsetList,")"]):"ellipse"==b[0]?a.mergeList(b.slice(1),c.slice(1),["ellipse(",a.mergeNonNegativeSizePair," at ",a.mergeOffsetList,")"]):"polygon"==b[0]&&b[1]==c[1]?a.mergeList(b.slice(2),c.slice(2),["polygon(",b[1],g,")"]):void 0}var d=a.consumeParenthesised.bind(null,a.parseLengthOrPercent),e=a.consumeRepeated.bind(void 0,d,/^/),f=a.mergeNestedRepeated.bind(void 0,a.mergeDimensions," "),g=a.mergeNestedRepeated.bind(void 0,f,",");a.addPropertiesHandler(b,c,["shape-outside"])}(d),function(a,b){function c(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(d[a]=b),e[b]=a})}var d={},e={};c("transform",["webkitTransform","msTransform"]),c("transformOrigin",["webkitTransformOrigin"]),c("perspective",["webkitPerspective"]),c("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return d[a]||a},a.unprefixedPropertyName=function(a){return e[a]||a}}(d)}(),function(){if(void 0===document.createElement("div").animate([]).oncancel){var a;if(window.performance&&performance.now)var a=function(){return performance.now()};else var a=function(){return Date.now()};var b=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},c=window.Element.prototype.animate;window.Element.prototype.animate=function(d,e){var f=c.call(this,d,e);f._cancelHandlers=[],f.oncancel=null;var g=f.cancel;f.cancel=function(){g.call(this);var c=new b(this,null,a()),d=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){d.forEach(function(a){a.call(c.target,c)})},0)};var h=f.addEventListener;f.addEventListener=function(a,b){"function"==typeof b&&"cancel"==a?this._cancelHandlers.push(b):h.call(this,a,b)};var i=f.removeEventListener;return f.removeEventListener=function(a,b){if("cancel"==a){var c=this._cancelHandlers.indexOf(b);c>=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(c),function(a,b,c){function d(a){var c=b.timeline;c.currentTime=a,c._discardAnimations(),0==c._animations.length?f=!1:requestAnimationFrame(d)}var e=window.requestAnimationFrame;window.requestAnimationFrame=function(a){return e(function(c){b.timeline._updateAnimationsPromises(),a(c),b.timeline._updateAnimationsPromises()})},b.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},b.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){b.animationsWithPromises=b.animationsWithPromises.filter(function(a){return a._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(a){return"finished"!=a.playState&&"idle"!=a.playState})},_play:function(a){var c=new b.Animation(a,this);return this._animations.push(c),b.restartWebAnimationsNextTick(),c._updatePromises(),c._animation.play(),c._updatePromises(),c},play:function(a){return a&&a.remove(),this._play(a)}};var f=!1;b.restartWebAnimationsNextTick=function(){f||(f=!0,requestAnimationFrame(d))};var g=new b.AnimationTimeline;b.timeline=g;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return g}})}catch(a){}try{window.document.timeline=g}catch(a){}}(0,e),function(a,b,c){b.animationsWithPromises=[],b.Animation=function(b,c){if(this.id="",b&&b._id&&(this.id=b._id),this.effect=b,b&&(b._animation=this),!c)throw new Error("Animation with null timeline is not supported");this._timeline=c,this._sequenceNumber=a.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},b.Animation.prototype={_updatePromises:function(){var a=this._oldPlayState,b=this.playState;return this._readyPromise&&b!==a&&("idle"==b?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==a?this._resolveReadyPromise():"pending"==b&&(this._readyPromise=void 0)),this._finishedPromise&&b!==a&&("idle"==b?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==b?this._resolveFinishedPromise():"finished"==a&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var a,c,d,e,f=!!this._animation;f&&(a=this.playbackRate,c=this._paused,d=this.startTime,e=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=b.newUnderlyingAnimationForKeyframeEffect(this.effect),b.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=b.newUnderlyingAnimationForGroup(this.effect),b.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&b.bindAnimationForCustomEffect(this),f&&(1!=a&&(this.playbackRate=a),null!==d?this.startTime=d:null!==e?this.currentTime=e:null!==this._holdTime&&(this.currentTime=this._holdTime),c&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var a=this.effect._timing.delay;this._childAnimations.forEach(function(c){this._arrangeChildren(c,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c.effect))}.bind(this))}},_setExternalAnimation:function(a){if(this.effect&&this._isGroup)for(var b=0;b<this.effect.children.length;b++)this.effect.children[b]._animation=a,this._childAnimations[b]._setExternalAnimation(a)},_constructChildAnimations:function(){if(this.effect&&this._isGroup){var a=this.effect._timing.delay;this._removeChildAnimations(),this.effect.children.forEach(function(c){var d=b.timeline._play(c);this._childAnimations.push(d),d.playbackRate=this.playbackRate,this._paused&&d.pause(),c._animation=this.effect._animation,this._arrangeChildren(d,a),this.effect instanceof window.SequenceEffect&&(a+=b.groupChildDuration(c))}.bind(this))}},_arrangeChildren:function(a,b){null===this.startTime?a.currentTime=this.currentTime-b/this.playbackRate:a.startTime!==this.startTime+b/this.playbackRate&&(a.startTime=this.startTime+b/this.playbackRate)},get timeline(){return this._timeline},get playState(){return this._animation?this._animation.playState:"idle"},get finished(){return window.Promise?(this._finishedPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._finishedPromise=new Promise(function(a,b){this._resolveFinishedPromise=function(){a(this)},this._rejectFinishedPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"finished"==this.playState&&this._resolveFinishedPromise()),this._finishedPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get ready(){return window.Promise?(this._readyPromise||(-1==b.animationsWithPromises.indexOf(this)&&b.animationsWithPromises.push(this),this._readyPromise=new Promise(function(a,b){this._resolveReadyPromise=function(){a(this)},this._rejectReadyPromise=function(){b({type:DOMException.ABORT_ERR,name:"AbortError"})}}.bind(this)),"pending"!==this.playState&&this._resolveReadyPromise()),this._readyPromise):(console.warn("Animation Promises require JavaScript Promise constructor"),null)},get onfinish(){return this._animation.onfinish},set onfinish(a){this._animation.onfinish="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get oncancel(){return this._animation.oncancel},set oncancel(a){this._animation.oncancel="function"==typeof a?function(b){b.target=this,a.call(this,b)}.bind(this):a},get currentTime(){this._updatePromises();var a=this._animation.currentTime;return this._updatePromises(),a},set currentTime(a){this._updatePromises(),this._animation.currentTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.currentTime=a-c}),this._updatePromises()},get startTime(){return this._animation.startTime},set startTime(a){this._updatePromises(),this._animation.startTime=isFinite(a)?a:Math.sign(a)*Number.MAX_VALUE,this._register(),this._forEachChild(function(b,c){b.startTime=a+c}),this._updatePromises()},get playbackRate(){return this._animation.playbackRate},set playbackRate(a){this._updatePromises();var b=this.currentTime;this._animation.playbackRate=a,this._forEachChild(function(b){b.playbackRate=a}),null!==b&&(this.currentTime=b),this._updatePromises()},play:function(){this._updatePromises(),this._paused=!1,this._animation.play(),-1==this._timeline._animations.indexOf(this)&&this._timeline._animations.push(this),this._register(),b.awaitStartTime(this),this._forEachChild(function(a){var b=a.currentTime;a.play(),a.currentTime=b}),this._updatePromises()},pause:function(){this._updatePromises(),this.currentTime&&(this._holdTime=this.currentTime),this._animation.pause(),this._register(),this._forEachChild(function(a){a.pause()}),this._paused=!0,this._updatePromises()},finish:function(){this._updatePromises(),this._animation.finish(),this._register(),this._updatePromises()},cancel:function(){this._updatePromises(),this._animation.cancel(),this._register(),this._removeChildAnimations(),this._updatePromises()},reverse:function(){this._updatePromises();var a=this.currentTime;this._animation.reverse(),this._forEachChild(function(a){a.reverse()}),null!==a&&(this.currentTime=a),this._updatePromises()},addEventListener:function(a,b){var c=b;"function"==typeof b&&(c=function(a){a.target=this,b.call(this,a)}.bind(this),b._wrapper=c),this._animation.addEventListener(a,c)},removeEventListener:function(a,b){this._animation.removeEventListener(a,b&&b._wrapper||b)},_removeChildAnimations:function(){for(;this._childAnimations.length;)this._childAnimations.pop().cancel()},_forEachChild:function(b){var c=0;if(this.effect.children&&this._childAnimations.length<this.effect.children.length&&this._constructChildAnimations(),this._childAnimations.forEach(function(a){b.call(this,a,c),this.effect instanceof window.SequenceEffect&&(c+=a.effect.activeDuration)}.bind(this)),"pending"!=this.playState){var d=this.effect._timing,e=this.currentTime;null!==e&&(e=a.calculateIterationProgress(a.calculateActiveDuration(d),e,d)),(null==e||isNaN(e))&&this._removeChildAnimations()}}},window.Animation=b.Animation}(c,e),function(a,b,c){function d(b){this._frames=a.normalizeKeyframes(b)}function e(){for(var a=!1;i.length;)i.shift()._updateChildren(),a=!0;return a}var f=function(a){if(a._animation=void 0,a instanceof window.SequenceEffect||a instanceof window.GroupEffect)for(var b=0;b<a.children.length;b++)f(a.children[b])};b.removeMulti=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];d._parent?(-1==b.indexOf(d._parent)&&b.push(d._parent),d._parent.children.splice(d._parent.children.indexOf(d),1),d._parent=null,f(d)):d._animation&&d._animation.effect==d&&(d._animation.cancel(),d._animation.effect=new KeyframeEffect(null,[]),d._animation._callback&&(d._animation._callback._animation=null),d._animation._rebuildUnderlyingAnimation(),f(d))}for(c=0;c<b.length;c++)b[c]._rebuild()},b.KeyframeEffect=function(b,c,e,f){return this.target=b,this._parent=null,e=a.numericTimingToObject(e),this._timingInput=a.cloneTimingInput(e),this._timing=a.normalizeTimingInput(e),this.timing=a.makeTiming(e,!1,this),this.timing._effect=this,"function"==typeof c?(a.deprecated("Custom KeyframeEffect","2015-06-22","Use KeyframeEffect.onsample instead."),this._normalizedKeyframes=c):this._normalizedKeyframes=new d(c),this._keyframes=c,this.activeDuration=a.calculateActiveDuration(this._timing),this._id=f,this},b.KeyframeEffect.prototype={getFrames:function(){return"function"==typeof this._normalizedKeyframes?this._normalizedKeyframes:this._normalizedKeyframes._frames},set onsample(a){if("function"==typeof this.getFrames())throw new Error("Setting onsample on custom effect KeyframeEffect is not supported.");this._onsample=a,this._animation&&this._animation._rebuildUnderlyingAnimation()},get parent(){return this._parent},clone:function(){if("function"==typeof this.getFrames())throw new Error("Cloning custom effects is not supported.");var b=new KeyframeEffect(this.target,[],a.cloneTimingInput(this._timingInput),this._id);return b._normalizedKeyframes=this._normalizedKeyframes,b._keyframes=this._keyframes,b},remove:function(){b.removeMulti([this])}};var g=Element.prototype.animate;Element.prototype.animate=function(a,c){var d="";return c&&c.id&&(d=c.id),b.timeline._play(new b.KeyframeEffect(this,a,c,d))};var h=document.createElementNS("http://www.w3.org/1999/xhtml","div");b.newUnderlyingAnimationForKeyframeEffect=function(a){if(a){var b=a.target||h,c=a._keyframes;"function"==typeof c&&(c=[]);var d=a._timingInput;d.id=a._id}else var b=h,c=[],d=0;return g.apply(b,[c,d])},b.bindAnimationForKeyframeEffect=function(a){a.effect&&"function"==typeof a.effect._normalizedKeyframes&&b.bindAnimationForCustomEffect(a)};var i=[];b.awaitStartTime=function(a){null===a.startTime&&a._isGroup&&(0==i.length&&requestAnimationFrame(e),i.push(a))};var j=window.getComputedStyle;Object.defineProperty(window,"getComputedStyle",{configurable:!0,enumerable:!0,value:function(){b.timeline._updateAnimationsPromises();var a=j.apply(this,arguments);return e()&&(a=j.apply(this,arguments)),b.timeline._updateAnimationsPromises(),a}}),window.KeyframeEffect=b.KeyframeEffect,window.Element.prototype.getAnimations=function(){return document.timeline.getAnimations().filter(function(a){return null!==a.effect&&a.effect.target==this}.bind(this))}}(c,e),function(a,b,c){function d(a){a._registered||(a._registered=!0,g.push(a),h||(h=!0,requestAnimationFrame(e)))}function e(a){var b=g;g=[],b.sort(function(a,b){return a._sequenceNumber-b._sequenceNumber}),b=b.filter(function(a){a();var b=a._animation?a._animation.playState:"idle";return"running"!=b&&"pending"!=b&&(a._registered=!1),a._registered}),g.push.apply(g,b),g.length?(h=!0,requestAnimationFrame(e)):h=!1}var f=(document.createElementNS("http://www.w3.org/1999/xhtml","div"),0);b.bindAnimationForCustomEffect=function(b){var c,e=b.effect.target,g="function"==typeof b.effect.getFrames();c=g?b.effect.getFrames():b.effect._onsample;var h=b.effect.timing,i=null;h=a.normalizeTimingInput(h);var j=function(){var d=j._animation?j._animation.currentTime:null;null!==d&&(d=a.calculateIterationProgress(a.calculateActiveDuration(h),d,h),isNaN(d)&&(d=null)),d!==i&&(g?c(d,e,b.effect):c(d,b.effect,b.effect._animation)),i=d};j._animation=b,j._registered=!1,j._sequenceNumber=f++,b._callback=j,d(j)};var g=[],h=!1;b.Animation.prototype._register=function(){this._callback&&d(this._callback)}}(c,e),function(a,b,c){function d(a){return a._timing.delay+a.activeDuration+a._timing.endDelay}function e(b,c,d){this._id=d,this._parent=null,this.children=b||[],this._reparent(this.children),c=a.numericTimingToObject(c),this._timingInput=a.cloneTimingInput(c),this._timing=a.normalizeTimingInput(c,!0),this.timing=a.makeTiming(c,!0,this),this.timing._effect=this,"auto"===this._timing.duration&&(this._timing.duration=this.activeDuration)}window.SequenceEffect=function(){e.apply(this,arguments)},window.GroupEffect=function(){e.apply(this,arguments)},e.prototype={_isAncestor:function(a){for(var b=this;null!==b;){if(b==a)return!0;b=b._parent}return!1},_rebuild:function(){for(var a=this;a;)"auto"===a.timing.duration&&(a._timing.duration=a.activeDuration),a=a._parent;this._animation&&this._animation._rebuildUnderlyingAnimation()},_reparent:function(a){b.removeMulti(a);for(var c=0;c<a.length;c++)a[c]._parent=this},_putChild:function(a,b){for(var c=b?"Cannot append an ancestor or self":"Cannot prepend an ancestor or self",d=0;d<a.length;d++)if(this._isAncestor(a[d]))throw{type:DOMException.HIERARCHY_REQUEST_ERR,name:"HierarchyRequestError",message:c};for(var d=0;d<a.length;d++)b?this.children.push(a[d]):this.children.unshift(a[d]);this._reparent(a),this._rebuild()},append:function(){this._putChild(arguments,!0)},prepend:function(){this._putChild(arguments,!1)},get parent(){return this._parent},get firstChild(){return this.children.length?this.children[0]:null},get lastChild(){return this.children.length?this.children[this.children.length-1]:null},clone:function(){for(var b=a.cloneTimingInput(this._timingInput),c=[],d=0;d<this.children.length;d++)c.push(this.children[d].clone());return this instanceof GroupEffect?new GroupEffect(c,b):new SequenceEffect(c,b)},remove:function(){b.removeMulti([this])}},window.SequenceEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.SequenceEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a+=d(b)}),Math.max(a,0)}}),window.GroupEffect.prototype=Object.create(e.prototype),Object.defineProperty(window.GroupEffect.prototype,"activeDuration",{get:function(){var a=0;return this.children.forEach(function(b){a=Math.max(a,d(b))}),a}}),b.newUnderlyingAnimationForGroup=function(c){var d,e=null,f=function(b){var c=d._wrapper;if(c&&"pending"!=c.playState&&c.effect)return null==b?void c._removeChildAnimations():0==b&&c.playbackRate<0&&(e||(e=a.normalizeTimingInput(c.effect.timing)),b=a.calculateIterationProgress(a.calculateActiveDuration(e),-1,e),isNaN(b)||null==b)?(c._forEachChild(function(a){a.currentTime=-1}),void c._removeChildAnimations()):void 0},g=new KeyframeEffect(null,[],c._timing,c._id);return g.onsample=f,d=b.timeline._play(g)},b.bindAnimationForGroup=function(a){a._animation._wrapper=a,a._isGroup=!0,b.awaitStartTime(a),a._constructChildAnimations(),a._setExternalAnimation(a)},b.groupChildDuration=d}(c,e),b.true=a}({},function(){return this}());
-//# sourceMappingURL=web-animations-next.min.js.map
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.js.map b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.js.map
deleted file mode 100644
index 0646f1c..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations-next.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["src/scope.js","src/timing-utilities.js","src/normalize-keyframes.js","src/deprecation.js","src/web-animations-bonus-cancel-events.js","src/web-animations-bonus-object-form-keyframes.js","src/timeline.js","src/web-animations-next-animation.js","src/keyframe-effect-constructor.js","src/effect-callback.js","src/group-constructors.js"],"names":["webAnimationsShared","webAnimations1","webAnimationsNext","shared","testing","cloneTimingInput","timingInput","clone","m","AnimationEffectTiming","this","_delay","_endDelay","_fill","_iterationStart","_iterations","_duration","_playbackRate","_direction","_easing","_easingFunction","linear","isInvalidTimingDeprecated","isDeprecated","makeTiming","forGroup","effect","timing","fill","duration","isNaN","Object","getOwnPropertyNames","forEach","property","fills","indexOf","directions","numericTimingToObject","normalizeTimingInput","cubic","a","b","c","d","x","f","start_gradient","end_gradient","start","end","mid","xEst","Math","abs","step","count","pos","stepSize","normalizeEasing","easing","styleForCleaning","document","createElement","style","animationTimingFunction","normalizedEasing","TypeError","parseEasingFunction","cubicData","cubicBezierRe","exec","apply","slice","map","Number","stepData","stepRe","Start","middle","Middle","End","presets","calculateActiveDuration","repeatedDuration","playbackRate","iterations","calculatePhase","activeDuration","localTime","PhaseNone","endTime","delay","endDelay","min","PhaseBefore","PhaseAfter","PhaseActive","calculateActiveTime","fillMode","phase","calculateOverallProgress","iterationDuration","activeTime","iterationStart","overallProgress","calculateSimpleIterationProgress","simpleIterationProgress","Infinity","calculateCurrentIteration","floor","calculateDirectedProgress","playbackDirection","currentIteration","currentDirection","calculateIterationProgress","directedProgress","direction","split","prototype","_setMember","member","value","_effect","_timingInput","_timing","_animation","_rebuildUnderlyingAnimation","ease","ease-in","ease-out","ease-in-out","step-start","step-middle","step-end","numberString","RegExp","antiAlias","aliases","isNotAnimatable","lastIndexOf","expandShorthandAndAntiAlias","result","longProperties","shorthandToLonghand","shorthandExpanderElem","i","longProperty","longhandValue","convertToArrayForm","effectInput","normalizedEffectInput","values","Array","isArray","keyframe","numKeyframes","length","offset","composite","push","sort","normalizeKeyframes","spaceKeyframes","keyframes","previousIndex","previousOffset","j","window","Symbol","iterator","from","originalKeyframe","memberValue","isFinite","type","DOMException","NOT_SUPPORTED_ERR","name","message","everyFrameHasOffset","filter","background","border","borderBottom","borderColor","borderLeft","borderRadius","borderRight","borderTop","borderWidth","flex","font","margin","outline","padding","createElementNS","borderWidthAliases","thin","medium","thick","borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","fontSize","xx-small","x-small","small","large","x-large","xx-large","fontWeight","normal","bold","outlineWidth","textShadow","none","boxShadow","silenced","feature","date","advice","plural","auxVerb","today","Date","expiry","setMonth","getMonth","console","warn","toDateString","deprecated","Error","animate","oncancel","now","performance","AnimationCancelEvent","target","currentTime","timelineTime","bubbles","cancelable","currentTarget","defaultPrevented","eventPhase","Event","AT_TARGET","timeStamp","originalElementAnimate","Element","options","animation","call","_cancelHandlers","originalCancel","cancel","event","handlers","concat","setTimeout","handler","originalAddEventListener","addEventListener","originalRemoveEventListener","removeEventListener","index","splice","element","documentElement","animated","originalOpacity","getComputedStyle","getPropertyValue","testOpacity","opacity","error","scope","webAnimationsNextTick","t","timeline","_discardAnimations","_animations","ticking","requestAnimationFrame","originalRequestAnimationFrame","_updateAnimationsPromises","AnimationTimeline","getAnimations","animationsWithPromises","_updatePromises","playState","_play","Animation","restartWebAnimationsNextTick","play","remove","defineProperty","configurable","get","e","id","_id","_timeline","_sequenceNumber","sequenceNumber","_holdTime","_paused","_isGroup","_childAnimations","_callback","_oldPlayState","oldPlayState","newPlayState","_readyPromise","_rejectReadyPromise","_resolveReadyPromise","_finishedPromise","_rejectFinishedPromise","_resolveFinishedPromise","oldPlaybackRate","oldPaused","oldStartTime","oldCurrentTime","hadUnderlying","startTime","_wrapper","KeyframeEffect","newUnderlyingAnimationForKeyframeEffect","bindAnimationForKeyframeEffect","SequenceEffect","GroupEffect","newUnderlyingAnimationForGroup","bindAnimationForGroup","_onsample","bindAnimationForCustomEffect","pause","_updateChildren","childAnimation","_arrangeChildren","groupChildDuration","bind","_setExternalAnimation","children","_constructChildAnimations","_removeChildAnimations","child","finished","Promise","resolve","reject","ABORT_ERR","ready","onfinish","v","sign","MAX_VALUE","_register","_forEachChild","awaitStartTime","time","finish","reverse","wrapped","pop","KeyframeList","_frames","updatePendingGroups","updated","pendingGroups","shift","disassociate","removeMulti","effects","oldParents","_parent","_rebuild","_normalizedKeyframes","_keyframes","getFrames","onsample","callback","parent","nullTarget","keyframeEffect","groupAnimation","originalGetComputedStyle","enumerable","arguments","register","_registered","callbacks","tick","updating","left","right","effectFunction","isKeyframeEffect","last","node","constructor","_reparent","_isAncestor","newChildren","_putChild","args","isAppend","HIERARCHY_REQUEST_ERR","unshift","append","prepend","firstChild","lastChild","clonedTiming","clonedChildren","create","total","max","group","underlyingAnimation","ticker","tf","underlyingEffect","exports","webAnimationsTesting"],"mappings":";;;;;;;;;;;;;;CAcA,SAAIA,EAAAA,GAAJ,GAAIA,MACAC,KACAC,MCFJ,SAAUC,EAAQC,GAMhB,QAASC,GAAiBC,GACxB,GAA0B,gBAAfA,GACT,MAAOA,EAET,IAAIC,KACJ,KAAK,GAAIC,KAAKF,GACZC,EAAMC,GAAKF,EAAYE,EAEzB,OAAOD,GAGT,QAASE,KACPC,KAAKC,OAAS,EACdD,KAAKE,UAAY,EACjBF,KAAKG,MAAQ,OACbH,KAAKI,gBAAkB,EACvBJ,KAAKK,YAAc,EACnBL,KAAKM,UAAY,EACjBN,KAAKO,cAAgB,EACrBP,KAAKQ,WAAa,SAClBR,KAAKS,QAAU,SACfT,KAAKU,gBAAkBC,EAGzB,QAASC,KACP,MAAOnB,GAAOoB,aAAa,wBAAyB,aAAc,gDAAA,GA8EpE,QAASC,GAAWlB,EAAamB,EAAUC,GACzC,GAAIC,GAAS,GAAIlB,EA4BjB,OA3BIgB,KACFE,EAAOC,KAAO,OACdD,EAAOE,SAAW,QAEM,gBAAfvB,IAA4BwB,MAAMxB,OAAAA,KAElCA,GACTyB,OAAOC,oBAAoB1B,GAAa2B,QAAQ,SAASC,GACvD,GAA6B,QAAzB5B,EAAY4B,GAAqB,CACnC,IAA+B,gBAApBP,GAAOO,IAAqC,YAAZA,KACL,gBAAzB5B,GAAY4B,IAAyBJ,MAAMxB,EAAY4B,KAChE,MAGJ,IAAiB,QAAZA,IAAiE,GAAzCC,EAAMC,QAAQ9B,EAAY4B,IACrD,MAEF,IAAiB,aAAZA,IAA2E,GAA9CG,EAAWD,QAAQ9B,EAAY4B,IAC/D,MAEF,IAAgB,gBAAZA,GAAwD,IAA1B5B,EAAY4B,IAAmB/B,EAAOoB,aAAa,qCAAsC,aAAc,uCACvI,MAEFI,GAAOO,GAAY5B,EAAY4B,MAlBnCP,EAAOE,SAAWvB,EAsBbqB,EAGT,QAASW,GAAsBhC,GAQ7B,MAP0B,gBAAfA,KAEPA,EADEwB,MAAMxB,IACQuB,SAAU,IAEVA,SAAUvB,IAGvBA,EAGT,QAASiC,GAAqBjC,EAAamB,GAEzC,MADAnB,GAAcH,EAAOmC,sBAAsBhC,GACpCkB,EAAWlB,EAAamB,GAGjC,QAASe,GAAMC,EAAGC,EAAGC,EAAGC,GACtB,MAAIH,GAAI,GAAKA,EAAI,GAAKE,EAAI,GAAKA,EAAI,EAC1BtB,EAEF,SAASwB,GAqBZ,QAASC,GAAEL,EAAGC,EAAGlC,GAAK,MAAO,GAAIiC,GAAK,EAAIjC,IAAM,EAAIA,GAAKA,EAAI,EAAIkC,GAAK,EAAIlC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EApBjG,GAAIqC,GAAK,EAAG,CACV,GAAIE,GAAiB,CAKrB,OAJIN,GAAI,EACNM,EAAiBL,EAAID,GACbC,GAAKC,EAAI,IACjBI,EAAiBH,EAAID,GAChBI,EAAiBF,EAE1B,GAAIA,GAAK,EAAG,CACV,GAAIG,GAAe,CAKnB,OAJIL,GAAI,EACNK,GAAgBJ,EAAI,IAAMD,EAAI,GAClB,GAALA,GAAUF,EAAI,IACrBO,GAAgBN,EAAI,IAAMD,EAAI,IACzB,EAAIO,GAAgBH,EAAI,GAIjC,IADA,GAAII,GAAQ,EAAGC,EAAM,EACdD,EAAQC,GAAK,CAClB,GAAIC,IAAOF,EAAQC,GAAO,EAEtBE,EAAON,EAAEL,EAAGE,EAAGQ,EACnB,IAAIE,KAAKC,IAAIT,EAAIO,GAAQ,KACvB,MAAON,GAAEJ,EAAGE,EAAGO,EAEbC,GAAOP,EACTI,EAAQE,EAERD,EAAMC,EAGV,MAAOL,GAAEJ,EAAGE,EAAGO,IAQnB,QAASI,GAAKC,EAAOC,GACnB,MAAO,UAASZ,GACd,GAAIA,GAAK,EACP,MAAO,EAET,IAAIa,GAAW,EAAIF,CAEnB,QADAX,GAAKY,EAAMC,GACAb,EAAIa,GAmBnB,QAASC,GAAgBC,GAClBC,IACHA,EAAmBC,SAASC,cAAc,OAAOC,OAEnDH,EAAiBI,wBAA0B,GAC3CJ,EAAiBI,wBAA0BL,CAC3C,IAAIM,GAAmBL,EAAiBI,uBACxC,IAAwB,IAApBC,GAA0B5C,IAC5B,KAAM,IAAI6C,WAAUP,EAAS,mCAE/B,OAAOM,GAGT,QAASE,GAAoBF,GAC3B,GAAwB,UAApBA,EACF,MAAO7C,EAET,IAAIgD,GAAYC,EAAcC,KAAKL,EACnC,IAAIG,EACF,MAAO7B,GAAMgC,MAAM9D,KAAM2D,EAAUI,MAAM,GAAGC,IAAIC,QAElD,IAAIC,GAAWC,EAAON,KAAKL,EAC3B,OAAIU,GACKrB,EAAKoB,OAAOC,EAAS,KAAM3B,MAAS6B,EAAOC,OAAUC,EAAQ9B,IAAO+B,GAAKL,EAAS,KAE9EM,EAAQhB,IAMd7C,EAGT,QAAS8D,GAAwBxD,GAC/B,MAAO0B,MAAKC,IAAI8B,EAAiBzD,GAAUA,EAAO0D,cAGpD,QAASD,GAAiBzD,GAExB,MAAwB,KAApBA,EAAOE,UAAwC,IAAtBF,EAAO2D,WAC3B,EAEF3D,EAAOE,SAAWF,EAAO2D,WAQlC,QAASC,GAAeC,EAAgBC,EAAW9D,GAEjD,GAAiB,MAAb8D,EACF,MAAOC,EAGT,IAAIC,GAAUhE,EAAOiE,MAAQJ,EAAiB7D,EAAOkE,QACrD,OAAIJ,GAAYpC,KAAKyC,IAAInE,EAAOiE,MAAOD,GAC9BI,EAELN,GAAapC,KAAKyC,IAAInE,EAAOiE,MAAQJ,EAAgBG,GAChDK,EAGFC,EAGT,QAASC,GAAoBV,EAAgBW,EAAUV,EAAWW,EAAOR,GAEvE,OAAQQ,GACN,IAAKL,GACH,MAAgB,aAAZI,GAAuC,QAAZA,EACtB,EACF,IACT,KAAKF,GACH,MAAOR,GAAYG,CACrB,KAAKI,GACH,MAAgB,YAAZG,GAAsC,QAAZA,EACrBX,EACF,IACT,KAAKE,GACH,MAAO,OAIb,QAASW,GAAyBC,EAAmBF,EAAOd,EAAYiB,EAAYC,GAElF,GAAIC,GAAkBD,CAQtB,OAP0B,KAAtBF,EACEF,IAAUL,IACZU,GAAmBnB,GAGrBmB,GAAmBF,EAAaD,EAE3BG,EAGT,QAASC,GAAiCD,EAAiBD,EAAgBJ,EAAOd,EAAYiB,EAAYD,GAGxG,GAAIK,GAA2BF,IAAoBG,EAAAA,EAAYJ,EAAiB,EAAIC,EAAkB,CAKtG,OAJgC,KAA5BE,GAAiCP,IAAUJ,GAA6B,IAAfV,GACzC,IAAfiB,GAA0C,IAAtBD,IACvBK,EAA0B,GAErBA,EAGT,QAASE,GAA0BT,EAAOd,EAAYqB,EAAyBF,GAE7E,MAAIL,KAAUJ,GAAcV,IAAesB,EAAAA,EAClCA,EAAAA,EAEuB,IAA5BD,EACKtD,KAAKyD,MAAML,GAAmB,EAEhCpD,KAAKyD,MAAML,GAGpB,QAASM,GAA0BC,EAAmBC,EAAkBN,GAEtE,GAAIO,GAAmBF,CACvB,IAA0B,WAAtBA,GAAwD,YAAtBA,EAAiC,CACrE,GAAIpE,GAAIqE,CACkB,uBAAtBD,IACFpE,GAAK,GAEPsE,EAAmB,SACftE,IAAMgE,EAAAA,GAAYhE,EAAI,GAAM,IAC9BsE,EAAmB,WAGvB,MAAyB,WAArBA,EACKP,EAEF,EAAIA,EAGb,QAASQ,GAA2B3B,EAAgBC,EAAW9D,GAC7D,GAAIyE,GAAQb,EAAeC,EAAgBC,EAAW9D,GAClD4E,EAAaL,EAAoBV,EAAgB7D,EAAOC,KAAM6D,EAAWW,EAAOzE,EAAOiE,MAC3F,IAAmB,OAAfW,EACF,MAAO,KAET,IAAIE,GAAkBJ,EAAyB1E,EAAOE,SAAUuE,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAO6E,gBACzGG,EAA0BD,EAAiCD,EAAiB9E,EAAO6E,eAAgBJ,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAOE,UAChJoF,EAAmBJ,EAA0BT,EAAOzE,EAAO2D,WAAYqB,EAAyBF,GAChGW,EAAmBL,EAA0BpF,EAAO0F,UAAWJ,EAAkBN,EAIrF,OAAOhF,GAAOP,gBAAgBgG,GA1XhC,GAAIjF,GAAQ,+BAA+BmF,MAAM,KAC7CjF,EAAa,sCAAsCiF,MAAM,KACzDjG,EAAS,SAASwB,GAAK,MAAOA,GA8BlCpC,GAAsB8G,WACpBC,WAAY,SAASC,EAAQC,GAC3BhH,KAAK,IAAM+G,GAAUC,EACjBhH,KAAKiH,UACPjH,KAAKiH,QAAQC,aAAaH,GAAUC,EACpChH,KAAKiH,QAAQE,QAAU1H,EAAOoC,qBAAqB7B,KAAKiH,QAAQC,cAChElH,KAAKiH,QAAQnC,eAAiBrF,EAAOgF,wBAAwBzE,KAAKiH,QAAQE,SACtEnH,KAAKiH,QAAQG,YACfpH,KAAKiH,QAAQG,WAAWC,gCAI9B1C,mBACE,MAAO3E,MAAKO,eAEd2E,UAAU8B,GACRhH,KAAK8G,WAAW,QAASE,IAE3B9B,YACE,MAAOlF,MAAKC,QAEdkF,aAAa6B,GACXhH,KAAK8G,WAAW,WAAYE,IAE9B7B,eACE,MAAOnF,MAAKE,WAEdgB,SAAS8F,GACPhH,KAAK8G,WAAW,OAAQE,IAE1B9F,WACE,MAAOlB,MAAKG,OAEd2F,mBAAmBkB,GACjB,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,2DAA6DxC,OAAO6E,eAE1F9F,MAAK8G,WAAW,iBAAkBE,IAEpClB,qBACE,MAAO9F,MAAKI,iBAEde,aAAa6F,GACX,GAAa,QAATA,IAAoB5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACpD,KAAM,IAAI6C,WAAU,oDAAsDuD,EAE5EhH,MAAK8G,WAAW,WAAYE,IAE9B7F,eACE,MAAOnB,MAAKM,WAEdqG,cAAcK,GACZhH,KAAK8G,WAAW,YAAaE,IAE/BL,gBACE,MAAO3G,MAAKQ,YAEd0C,WAAW8D,GACThH,KAAKU,gBAAkBgD,EAAoBT,EAAgB+D,IAC3DhH,KAAK8G,WAAW,SAAUE,IAE5B9D,aACE,MAAOlD,MAAKS,SAEdmE,eAAeoC,GACb,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,8CAAgDuD,EAEtEhH,MAAK8G,WAAW,aAAcE,IAEhCpC,iBACE,MAAO5E,MAAKK,aA4FhB,IAAI+D,GAAQ,EACRE,EAAS,GACTC,EAAM,EAaNC,GACF8C,KAAQxF,EAAM,IAAM,GAAK,IAAM,GAC/ByF,UAAWzF,EAAM,IAAM,EAAG,EAAG,GAC7B0F,WAAY1F,EAAM,EAAG,EAAG,IAAM,GAC9B2F,cAAe3F,EAAM,IAAM,EAAG,IAAM,GACpC4F,aAAc7E,EAAK,EAAGuB,GACtBuD,cAAe9E,EAAK,EAAGyB,GACvBsD,WAAY/E,EAAK,EAAG0B,IAGlBpB,EAAmB,KACnB0E,EAAe,qCACfjE,EAAgB,GAAIkE,QAAO,kBAAoBD,EAAe,IAAMA,EAAe,IAAMA,EAAe,IAAMA,EAAe,OAC7H1D,EAAS,gDAgDTa,EAAY,EACZK,EAAc,EACdC,EAAa,EACbC,EAAc,CA2GlB9F,GAAOE,iBAAmBA,EAC1BF,EAAOqB,WAAaA,EACpBrB,EAAOmC,sBAAwBA,EAC/BnC,EAAOoC,qBAAuBA,EAC9BpC,EAAOgF,wBAA0BA,EACjChF,EAAOgH,2BAA6BA,EACpChH,EAAOoF,eAAiBA,EACxBpF,EAAOwD,gBAAkBA,EACzBxD,EAAOiE,oBAAsBA,GAc5BpE,GCrZH,SAAUG,EAAQC,GAmIhB,QAASqI,GAAUvG,EAAUwF,GAC3B,MAAIxF,KAAYwG,GACPA,EAAQxG,GAAUwF,IAAUA,EAE9BA,EAGT,QAASiB,GAAgBzG,GAEvB,MAAoB,YAAbA,GAAmE,IAAzCA,EAAS0G,YAAY,YAAa,IAAsD,IAA1C1G,EAAS0G,YAAY,aAAc,GAIpH,QAASC,GAA4B3G,EAAUwF,EAAOoB,GACpD,IAAIH,EAAgBzG,GAApB,CAGA,GAAI6G,GAAiBC,EAAoB9G,EACzC,IAAI6G,EAAgB,CAClBE,EAAsBjF,MAAM9B,GAAYwF,CACxC,KAAK,GAAIwB,KAAKH,GAAgB,CAC5B,GAAII,GAAeJ,EAAeG,GAC9BE,EAAgBH,EAAsBjF,MAAMmF,EAChDL,GAAOK,GAAgBV,EAAUU,EAAcC,QAGjDN,GAAO5G,GAAYuG,EAAUvG,EAAUwF,IAI3C,QAAS2B,GAAmBC,GAC1B,GAAIC,KAEJ,KAAK,GAAIrH,KAAYoH,GACnB,KAAIpH,KAAa,SAAU,SAAU,cAArC,CAIA,GAAIsH,GAASF,EAAYpH,EACpBuH,OAAMC,QAAQF,KACjBA,GAAUA,GAKZ,KAAK,GAFDG,GACAC,EAAeJ,EAAOK,OACjBX,EAAI,EAAGA,EAAIU,EAAcV,IAChCS,KAGEA,EAASG,OADP,UAAYR,GACIA,EAAYQ,OACL,GAAhBF,EACS,EAEAV,GAAKU,EAAe,GAGpC,UAAYN,KACdK,EAAS/F,OAAS0F,EAAY1F,QAG5B,aAAe0F,KACjBK,EAASI,UAAYT,EAAYS,WAGnCJ,EAASzH,GAAYsH,EAAON,GAE5BK,EAAsBS,KAAKL,GAK/B,MADAJ,GAAsBU,KAAK,SAASxH,EAAGC,GAAK,MAAOD,GAAEqH,OAASpH,EAAEoH,SACzDP,EAGT,QAASW,GAAmBZ,GAqE1B,QAASa,KACP,GAAIN,GAASO,EAAUP,MACa,OAAhCO,EAAUP,EAAS,GAAGC,SACxBM,EAAUP,EAAS,GAAGC,OAAS,GAC7BD,EAAS,GAA4B,MAAvBO,EAAU,GAAGN,SAC7BM,EAAU,GAAGN,OAAS,EAIxB,KAAK,GAFDO,GAAgB,EAChBC,EAAiBF,EAAU,GAAGN,OACzBZ,EAAI,EAAGA,EAAIW,EAAQX,IAAK,CAC/B,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,IAAK,GAAIS,GAAI,EAAGA,EAAIrB,EAAImB,EAAeE,IACrCH,EAAUC,EAAgBE,GAAGT,OAASQ,GAAkBR,EAASQ,GAAkBC,GAAKrB,EAAImB,EAC9FA,GAAgBnB,EAChBoB,EAAiBR,IAnFvB,GAAmB,MAAfR,EACF,QAGEkB,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,KACjBA,EAAcD,EAAmBC,GA0CnC,KAAK,GAvCDc,GAAYd,EAAY5E,IAAI,SAASkG,GACvC,GAAIjB,KACJ,KAAK,GAAIlC,KAAUmD,GAAkB,CACnC,GAAIC,GAAcD,EAAiBnD,EACnC,IAAc,UAAVA,GACF,GAAmB,MAAfoD,EAAqB,CAEvB,GADAA,EAAclG,OAAOkG,IAChBC,SAASD,GACZ,KAAM,IAAI1G,WAAU,oCACtB,IAAI0G,EAAc,GAAKA,EAAc,EACnC,KAAM,IAAI1G,WAAU,kDAEnB,IAAc,aAAVsD,EAAuB,CAChC,GAAmB,OAAfoD,GAAuC,cAAfA,EAC1B,MACEE,KAAMC,aAAaC,kBACnBC,KAAM,oBACNC,QAAS,mCAEN,IAAmB,WAAfN,EACT,KAAM,IAAI1G,WAAU,0BAA4B0G,EAAc,SAGhEA,GADmB,UAAVpD,EACKtH,EAAOwD,gBAAgBkH,GAEvB,GAAKA,CAErBhC,GAA4BpB,EAAQoD,EAAalB,GAMnD,WAAA,IAJIA,EAASG,SACXH,EAASG,OAAS,UAAA,IAChBH,EAAS/F,SACX+F,EAAS/F,OAAS,UACb+F,IAGLyB,GAAAA,EAEAd,GAAAA,EAAAA,EACKpB,EAAI,EAAGA,EAAIkB,EAAUP,OAAQX,IAAK,CACzC,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,GAAIA,EAASQ,EACX,KAAM,IAAInG,WAAU,uEAEtBmG,GAAiBR,MAEjBsB,IAAAA,EA8BJ,MA1BAhB,GAAYA,EAAUiB,OAAO,SAAS1B,GACpC,MAAOA,GAASG,QAAU,GAAKH,EAASG,QAAU,IAsB/CsB,GACHjB,IAEKC,EAvST,GAAIpB,IACFsC,YACE,kBACA,qBACA,iBACA,mBACA,uBACA,mBACA,iBACA,mBAEFC,QACE,iBACA,iBACA,iBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,kBACA,kBACA,mBAEFC,cACE,oBACA,oBACA,qBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,YACE,kBACA,kBACA,mBAEFC,cACE,sBACA,uBACA,0BACA,0BAEFC,aACE,mBACA,mBACA,oBAEFC,WACE,iBACA,iBACA,kBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,MACE,WACA,aACA,aAEFC,MACE,aACA,WACA,YACA,cACA,aACA,cAEFC,QACE,YACA,cACA,eACA,cAEFC,SACE,eACA,eACA,gBAEFC,SACE,aACA,eACA,gBACA,gBAIAlD,EAAwBnF,SAASsI,gBAAgB,+BAAgC,OAEjFC,GACFC,KAAM,MACNC,OAAQ,MACRC,MAAO,OAGL9D,GACF+D,kBAAmBJ,EACnBK,gBAAiBL,EACjBM,iBAAkBN,EAClBO,eAAgBP,EAChBQ,UACEC,WAAY,MACZC,UAAW,MACXC,MAAS,MACTT,OAAU,OACVU,MAAS,OACTC,UAAW,OACXC,WAAY,QAEdC,YACEC,OAAQ,MACRC,KAAM,OAERC,aAAclB,EACdmB,YACEC,KAAM,2BAERC,WACED,KAAM,+BA4KVtN,GAAOkJ,mBAAqBA,EAC5BlJ,EAAO+J,mBAAqBA,GAM3BlK,GClTH,SAAUG,GAER,GAAIwN,KAEJxN,GAAOoB,aAAe,SAASqM,EAASC,EAAMC,EAAQC,GAKpD,GAAIC,GAAUD,EAAS,MAAQ,KAC3BE,EAAQ,GAAIC,MACZC,EAAS,GAAID,MAAKL,EAGtB,OAFAM,GAAOC,SAASD,EAAOE,WAAa,KAEhCJ,EAAQE,IACJP,IAAWD,IACfW,QAAQC,KAAK,mBAAqBX,EAAU,IAAMI,EAAU,wCAA0CG,EAAOK,eAAiB,KAAOV,GAEvIH,EAASC,IAAAA,EAAW,KAOxBzN,EAAOsO,WAAa,SAASb,EAASC,EAAMC,EAAQC,GAClD,GAAIC,GAAUD,EAAS,MAAQ,IAC/B,IAAI5N,EAAOoB,aAAaqM,EAASC,EAAMC,EAAQC,GAC7C,KAAM,IAAIW,OAAMd,EAAU,IAAMI,EAAU,yBAA2BF,KAIxE9N,62mCChCH,WAEE,OAAA,KAAI8D,SAASC,cAAc,OAAO4K,YAAYC,SAA9C,CAKE,GAAIC,EACC,IAAIrE,OAAOsE,aAAeA,YAAYD,IAC3C,GAAIA,GAAM,WAAa,MAAOC,aAAYD,WAE1C,IAAIA,GAAM,WAAa,MAAOX,MAAKW,MAGrC,IAAIE,GAAuB,SAASC,EAAQC,EAAaC,GACvDxO,KAAKsO,OAASA,EACdtO,KAAKuO,YAAcA,EACnBvO,KAAKwO,aAAeA,EAEpBxO,KAAKqK,KAAO,SACZrK,KAAKyO,SAAAA,EACLzO,KAAK0O,YAAAA,EACL1O,KAAK2O,cAAgBL,EACrBtO,KAAK4O,kBAAAA,EACL5O,KAAK6O,WAAaC,MAAMC,UACxB/O,KAAKgP,UAAYxB,KAAKW,OAGpBc,EAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GACvD,GAAIC,GAAYH,EAAuBI,KAAKrP,KAAM4I,EAAauG,EAE/DC,GAAUE,mBACVF,EAAUlB,SAAW,IAErB,IAAIqB,GAAiBH,EAAUI,MAC/BJ,GAAUI,OAAS,WACjBD,EAAeF,KAAKrP,KACpB,IAAIyP,GAAQ,GAAIpB,GAAqBrO,KAAM,KAAMmO,KAC7CuB,EAAW1P,KAAKsP,gBAAgBK,OAAO3P,KAAKkO,UAAYlO,KAAKkO,aACjE0B,YAAW,WACTF,EAASnO,QAAQ,SAASsO,GACxBA,EAAQR,KAAKI,EAAMnB,OAAQmB,MAE5B,GAGL,IAAIK,GAA2BV,EAAUW,gBACzCX,GAAUW,iBAAmB,SAAS1F,EAAMwF,GACpB,kBAAXA,IAAiC,UAARxF,EAClCrK,KAAKsP,gBAAgBhG,KAAKuG,GAE1BC,EAAyBT,KAAKrP,KAAMqK,EAAMwF,GAG9C,IAAIG,GAA8BZ,EAAUa,mBAW5C,OAVAb,GAAUa,oBAAsB,SAAS5F,EAAMwF,GAC7C,GAAY,UAARxF,EAAkB,CACpB,GAAI6F,GAAQlQ,KAAKsP,gBAAgB5N,QAAQmO,EACrCK,IAAS,GACXlQ,KAAKsP,gBAAgBa,OAAOD,EAAO,OAErCF,GAA4BX,KAAKrP,KAAMqK,EAAMwF,IAI1CT,OClEX,SAAU3P,GAgBR,GAAI2Q,GAAUhN,SAASiN,gBACnBjB,EAAY,KACZkB,GAAAA,CACJ,KACE,GAAIC,GAAkBC,iBAAiBJ,GAASK,iBAAiB,WAC7DC,EAAiC,KAAnBH,EAAyB,IAAM,GACjDnB,GAAYgB,EAAQnC,SAAS0C,SAAYD,EAAaA,KACjDvP,SAAU,IACfiO,EAAUb,YAAc,EACxB+B,EAAWE,iBAAiBJ,GAASK,iBAAiB,YAAcC,EACpE,MAAOE,IACP,QACIxB,GACFA,EAAUI,SAEd,IAAIc,EAAJ,CAIA,GAAIrB,GAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAUvD,MATIrF,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,IAAgC,OAAhBA,IACjCA,EAAcnJ,EAAOkJ,mBAAmBC,IAGnCqG,EAAuBI,KAAKrP,KAAM4I,EAAauG,MAEvD7P,GC/CH,SAAUG,EAAQoR,EAAOnR,GA8DvB,QAASoR,GAAsBC,GAC7B,GAAIC,GAAWH,EAAMG,QACrBA,GAASzC,YAAcwC,EACvBC,EAASC,qBAC0B,GAA/BD,EAASE,YAAY/H,OACvBgI,GAAAA,EAEAC,sBAAsBN,GApE1B,GAAIO,GAAgCvH,OAAOsH,qBAC3CtH,QAAOsH,sBAAwB,SAAShP,GACtC,MAAOiP,GAA8B,SAASlP,GAC5C0O,EAAMG,SAASM,4BACflP,EAAED,GACF0O,EAAMG,SAASM,+BAInBT,EAAMU,kBAAoB,WACxBvR,KAAKkR,eACLlR,KAAKuO,gBAAAA,IAGPsC,EAAMU,kBAAkB1K,WACtB2K,cAAe,WAEb,MADAxR,MAAKiR,qBACEjR,KAAKkR,YAAYnN,SAE1BuN,0BAA2B,WACzBT,EAAMY,uBAAyBZ,EAAMY,uBAAuB9G,OAAO,SAASyE,GAC1E,MAAOA,GAAUsC,qBAGrBT,mBAAoB,WAClBjR,KAAKsR,4BACLtR,KAAKkR,YAAclR,KAAKkR,YAAYvG,OAAO,SAASyE,GAClD,MAA8B,YAAvBA,EAAUuC,WAAkD,QAAvBvC,EAAUuC,aAG1DC,MAAO,SAAS5Q,GACd,GAAIoO,GAAY,GAAIyB,GAAMgB,UAAU7Q,EAAQhB,KAW5C,OAVAA,MAAKkR,YAAY5H,KAAK8F,GACtByB,EAAMiB,+BAMN1C,EAAUsC,kBACVtC,EAAUhI,WAAW2K,OACrB3C,EAAUsC,kBACHtC,GAET2C,KAAM,SAAS/Q,GAIb,MAHIA,IACFA,EAAOgR,SAEFhS,KAAK4R,MAAM5Q,IAItB,IAAImQ,IAAAA,CAEJN,GAAMiB,6BAA+B,WAC9BX,IACHA,GAAAA,EACAC,sBAAsBN,IAc1B,IAAIE,GAAW,GAAIH,GAAMU,iBACzBV,GAAMG,SAAWA,CAEjB,KACE3P,OAAO4Q,eAAenI,OAAO1G,SAAU,YACrC8O,cAAAA,EACAC,IAAK,WAAa,MAAOnB,MAE3B,MAAOoB,IACT,IACEtI,OAAO1G,SAAS4N,SAAWA,EAC3B,MAAOoB,MAER9S,EAAqBE,GCtFxB,SAAUC,EAAQoR,EAAOnR,GACvBmR,EAAMY,0BAENZ,EAAMgB,UAAY,SAAS7Q,EAAQgQ,GASjC,GARAhR,KAAKqS,GAAK,GACNrR,GAAUA,EAAOsR,MACnBtS,KAAKqS,GAAKrR,EAAOsR,KAEnBtS,KAAKgB,OAASA,EACVA,IACFA,EAAOoG,WAAapH,OAEjBgR,EACH,KAAM,IAAIhD,OAAM,gDAElBhO,MAAKuS,UAAYvB,EACjBhR,KAAKwS,gBAAkB/S,EAAOgT,iBAC9BzS,KAAK0S,UAAY,EACjB1S,KAAK2S,SAAAA,EACL3S,KAAK4S,UAAAA,EACL5S,KAAKoH,WAAa,KAClBpH,KAAK6S,oBACL7S,KAAK8S,UAAY,KACjB9S,KAAK+S,cAAgB,OACrB/S,KAAKqH,8BAELrH,KAAKoH,WAAWoI,SAChBxP,KAAK0R,mBAGPb,EAAMgB,UAAUhL,WACd6K,gBAAiB,WACf,GAAIsB,GAAehT,KAAK+S,cACpBE,EAAejT,KAAK2R,SAsBxB,OArBI3R,MAAKkT,eAAiBD,IAAiBD,IACrB,QAAhBC,GACFjT,KAAKmT,sBACLnT,KAAKkT,kBAAAA,IACoB,WAAhBF,EACThT,KAAKoT,uBACoB,WAAhBH,IACTjT,KAAKkT,kBAAAA,KAGLlT,KAAKqT,kBAAoBJ,IAAiBD,IACxB,QAAhBC,GACFjT,KAAKsT,yBACLtT,KAAKqT,qBAAAA,IACoB,YAAhBJ,EACTjT,KAAKuT,0BACoB,YAAhBP,IACThT,KAAKqT,qBAAAA,KAGTrT,KAAK+S,cAAgB/S,KAAK2R,UAClB3R,KAAKkT,eAAiBlT,KAAKqT,kBAErChM,4BAA6B,WAC3BrH,KAAK0R,iBACL,IAAI8B,GACAC,EACAC,EACAC,EACAC,IAAgB5T,KAAKoH,UACrBwM,KACFJ,EAAkBxT,KAAK2E,aACvB8O,EAAYzT,KAAK2S,QACjBe,EAAe1T,KAAK6T,UACpBF,EAAiB3T,KAAKuO,YACtBvO,KAAKoH,WAAWoI,SAChBxP,KAAKoH,WAAW0M,SAAW,KAC3B9T,KAAKoH,WAAa,QAGfpH,KAAKgB,QAAUhB,KAAKgB,iBAAkB8I,QAAOiK,kBAChD/T,KAAKoH,WAAayJ,EAAMmD,wCAAwChU,KAAKgB,QACrE6P,EAAMoD,+BAA+BjU,QAEnCA,KAAKgB,iBAAkB8I,QAAOoK,gBAAkBlU,KAAKgB,iBAAkB8I,QAAOqK,eAChFnU,KAAKoH,WAAayJ,EAAMuD,+BAA+BpU,KAAKgB,QAC5D6P,EAAMwD,sBAAsBrU,OAE1BA,KAAKgB,QAAUhB,KAAKgB,OAAOsT,WAC7BzD,EAAM0D,6BAA6BvU,MAEjC4T,IACqB,GAAnBJ,IACFxT,KAAK2E,aAAe6O,GAED,OAAjBE,EACF1T,KAAK6T,UAAYH,EACW,OAAnBC,EACT3T,KAAKuO,YAAcoF,EACS,OAAnB3T,KAAK0S,YACd1S,KAAKuO,YAAcvO,KAAK0S,WAEtBe,GACFzT,KAAKwU,SAGTxU,KAAK0R,mBAEP+C,gBAAiB,WACf,GAAKzU,KAAKgB,QAA4B,QAAlBhB,KAAK2R,UAAzB,CAGA,GAAIvI,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAK6S,iBAAiBtR,QAAQ,SAASmT,GACrC1U,KAAK2U,iBAAiBD,EAAgBtL,GAClCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBF,EAAe1T,UACpD6T,KAAK7U,SAET8U,sBAAuB,SAAS1F,GAC9B,GAAKpP,KAAKgB,QAAWhB,KAAK4S,SAE1B,IAAK,GAAIpK,GAAI,EAAGA,EAAIxI,KAAKgB,OAAO+T,SAAS5L,OAAQX,IAC/CxI,KAAKgB,OAAO+T,SAASvM,GAAGpB,WAAagI,EACrCpP,KAAK6S,iBAAiBrK,GAAGsM,sBAAsB1F,IAGnD4F,0BAA2B,WACzB,GAAKhV,KAAKgB,QAAWhB,KAAK4S,SAA1B,CAEA,GAAIxJ,GAASpJ,KAAKgB,OAAOmG,QAAQjC,KACjClF,MAAKiV,yBACLjV,KAAKgB,OAAO+T,SAASxT,QAAQ,SAAS2T,GACpC,GAAIR,GAAiB7D,EAAMG,SAASY,MAAMsD,EAC1ClV,MAAK6S,iBAAiBvJ,KAAKoL,GAC3BA,EAAe/P,aAAe3E,KAAK2E,aAC/B3E,KAAK2S,SACP+B,EAAeF,QACjBU,EAAM9N,WAAapH,KAAKgB,OAAOoG,WAE/BpH,KAAK2U,iBAAiBD,EAAgBtL,GAElCpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAUyH,EAAM+D,mBAAmBM,KACrCL,KAAK7U,SAET2U,iBAAkB,SAASD,EAAgBtL,GAClB,OAAnBpJ,KAAK6T,UACPa,EAAenG,YAAcvO,KAAKuO,YAAcnF,EAASpJ,KAAK2E,aACrD+P,EAAeb,YAAc7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eACrE+P,EAAeb,UAAY7T,KAAK6T,UAAYzK,EAASpJ,KAAK2E,eAG9DqM,eACE,MAAOhR,MAAKuS,WAEdZ,gBACE,MAAO3R,MAAKoH,WAAapH,KAAKoH,WAAWuK,UAAY,QAEvDwD,eACE,MAAKrL,QAAOsL,SAIPpV,KAAKqT,oBAC2C,GAA/CxC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKqT,iBAAmB,GAAI+B,SACxB,SAASC,EAASC,GAChBtV,KAAKuT,wBAA0B,WAC7B8B,EAAQrV,OAEVA,KAAKsT,uBAAyB,WAC5BgC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACW,YAAlBA,KAAK2R,WACP3R,KAAKuT,2BAGFvT,KAAKqT,mBApBVzF,QAAQC,KAAK,6DACN,OAqBX2H,YACE,MAAK1L,QAAOsL,SAIPpV,KAAKkT,iBAC2C,GAA/CrC,EAAMY,uBAAuB/P,QAAQ1B,OACvC6Q,EAAMY,uBAAuBnI,KAAKtJ,MAEpCA,KAAKkT,cAAgB,GAAIkC,SACrB,SAASC,EAASC,GAChBtV,KAAKoT,qBAAuB,WAC1BiC,EAAQrV,OAEVA,KAAKmT,oBAAsB,WACzBmC,GAAQjL,KAAMC,aAAaiL,UAAW/K,KAAM,iBAE9CqK,KAAK7U,OACY,YAAnBA,KAAK2R,WACP3R,KAAKoT,wBAGFpT,KAAKkT,gBApBVtF,QAAQC,KAAK,6DACN,OAqBX4H,eACE,MAAOzV,MAAKoH,WAAWqO,UAEzBA,aAAaC,GAET1V,KAAKoH,WAAWqO,SADF,kBAALC,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BxH,eACE,MAAOlO,MAAKoH,WAAW8G,UAEzBA,aAAawH,GAET1V,KAAKoH,WAAW8G,SADF,kBAALwH,GACkB,SAAUtD,GACnCA,EAAE9D,OAAStO,KACX0V,EAAErG,KAAKrP,KAAMoS,IACZyC,KAAK7U,MAEmB0V,GAG/BnH,kBACEvO,KAAK0R,iBACL,IAAInD,GAAcvO,KAAKoH,WAAWmH,WAElC,OADAvO,MAAK0R,kBACEnD,GAETA,gBAAgBmH,GACd1V,KAAK0R,kBACL1R,KAAKoH,WAAWmH,YAAcnE,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACtE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAM3G,YAAcmH,EAAItM,IAE1BpJ,KAAK0R,mBAEPmC,gBACE,MAAO7T,MAAKoH,WAAWyM,WAEzBA,cAAc6B,GACZ1V,KAAK0R,kBACL1R,KAAKoH,WAAWyM,UAAYzJ,SAASsL,GAAKA,EAAI/S,KAAKgT,KAAKD,GAAKzR,OAAO2R,UACpE5V,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,EAAO9L,GACjC8L,EAAMrB,UAAY6B,EAAItM,IAExBpJ,KAAK0R,mBAEP/M,mBACE,MAAO3E,MAAKoH,WAAWzC,cAEzBA,iBAAiBqC,GACfhH,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAWzC,aAAeqC,EAC/BhH,KAAK8V,cAAc,SAASpB,GAC1BA,EAAe/P,aAAeqC,IAET,OAAnB2M,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEPK,KAAM,WACJ/R,KAAK0R,kBACL1R,KAAK2S,SAAAA,EACL3S,KAAKoH,WAAW2K,QACiC,GAA7C/R,KAAKuS,UAAUrB,YAAYxP,QAAQ1B,OACrCA,KAAKuS,UAAUrB,YAAY5H,KAAKtJ,MAElCA,KAAK6V,YACLhF,EAAMkF,eAAe/V,MACrBA,KAAK8V,cAAc,SAASZ,GAC1B,GAAIc,GAAOd,EAAM3G,WACjB2G,GAAMnD,OACNmD,EAAM3G,YAAcyH,IAEtBhW,KAAK0R,mBAEP8C,MAAO,WACLxU,KAAK0R,kBACD1R,KAAKuO,cACPvO,KAAK0S,UAAY1S,KAAKuO,aAExBvO,KAAKoH,WAAWoN,QAChBxU,KAAK6V,YACL7V,KAAK8V,cAAc,SAASZ,GAC1BA,EAAMV,UAERxU,KAAK2S,SAAAA,EACL3S,KAAK0R,mBAEPuE,OAAQ,WACNjW,KAAK0R,kBACL1R,KAAKoH,WAAW6O,SAChBjW,KAAK6V,YACL7V,KAAK0R,mBAEPlC,OAAQ,WACNxP,KAAK0R,kBACL1R,KAAKoH,WAAWoI,SAChBxP,KAAK6V,YACL7V,KAAKiV,yBACLjV,KAAK0R,mBAEPwE,QAAS,WACPlW,KAAK0R,iBACL,IAAIiC,GAAiB3T,KAAKuO,WAC1BvO,MAAKoH,WAAW8O,UAChBlW,KAAK8V,cAAc,SAASpB,GAC1BA,EAAewB,YAEM,OAAnBvC,IACF3T,KAAKuO,YAAcoF,GAErB3T,KAAK0R,mBAEP3B,iBAAkB,SAAS1F,EAAMwF,GAC/B,GAAIsG,GAAUtG,CACQ,mBAAXA,KACTsG,EAAU,SAAU/D,GAClBA,EAAE9D,OAAStO,KACX6P,EAAQR,KAAKrP,KAAMoS,IAClByC,KAAK7U,MACR6P,EAAQiE,SAAWqC,GAErBnW,KAAKoH,WAAW2I,iBAAiB1F,EAAM8L,IAEzClG,oBAAqB,SAAS5F,EAAMwF,GAClC7P,KAAKoH,WAAW6I,oBAAoB5F,EAAOwF,GAAWA,EAAQiE,UAAajE,IAE7EoF,uBAAwB,WACtB,KAAOjV,KAAK6S,iBAAiB1J,QAC3BnJ,KAAK6S,iBAAiBuD,MAAM5G,UAEhCsG,cAAe,SAAS1T,GACtB,GAAIgH,GAAS,CASb,IARIpJ,KAAKgB,OAAO+T,UAAY/U,KAAK6S,iBAAiB1J,OAASnJ,KAAKgB,OAAO+T,SAAS5L,QAC9EnJ,KAAKgV,4BACPhV,KAAK6S,iBAAiBtR,QAAQ,SAAS2T,GACrC9S,EAAEiN,KAAKrP,KAAMkV,EAAO9L,GAChBpJ,KAAKgB,iBAAkB8I,QAAOoK,iBAChC9K,GAAU8L,EAAMlU,OAAO8D,iBACzB+P,KAAK7U,OAEe,WAAlBA,KAAK2R,UAAT,CAEA,GAAI1Q,GAASjB,KAAKgB,OAAOmG,QACrB4J,EAAI/Q,KAAKuO,WACH,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,KAC1E,MAAL8P,GAAa3P,MAAM2P,KACrB/Q,KAAKiV,4BAIXnL,OAAO+H,UAAYhB,EAAMgB,WAMxBvS,EAAqBE,GChXvB,SAASC,EAAQoR,EAAOnR,GAqCvB,QAAS2W,GAAazN,GACpB5I,KAAKsW,QAAU7W,EAAO+J,mBAAmBZ,GAoG3C,QAAS2N,KAEP,IADA,GAAIC,IAAAA,EACGC,EAActN,QACPsN,EAAcC,QACpBjC,kBACN+B,GAAAA,CAEF,OAAOA,GA/IT,GAAIG,GAAe,SAAS3V,GAE1B,GADAA,EAAOoG,eAAAA,GACHpG,YAAkB8I,QAAOoK,gBAAkBlT,YAAkB8I,QAAOqK,YACtE,IAAK,GAAI3L,GAAI,EAAGA,EAAIxH,EAAO+T,SAAS5L,OAAQX,IAC1CmO,EAAa3V,EAAO+T,SAASvM,IAKnCqI,GAAM+F,YAAc,SAASC,GAE3B,IAAK,GADDC,MACKtO,EAAI,EAAGA,EAAIqO,EAAQ1N,OAAQX,IAAK,CACvC,GAAIxH,GAAS6V,EAAQrO,EACjBxH,GAAO+V,UACkC,GAAvCD,EAAWpV,QAAQV,EAAO+V,UAC5BD,EAAWxN,KAAKtI,EAAO+V,SAEzB/V,EAAO+V,QAAQhC,SAAS5E,OAAOnP,EAAO+V,QAAQhC,SAASrT,QAAQV,GAAS,GACxEA,EAAO+V,QAAU,KACjBJ,EAAa3V,IACJA,EAAOoG,YAAepG,EAAOoG,WAAWpG,QAAUA,IAC3DA,EAAOoG,WAAWoI,SAClBxO,EAAOoG,WAAWpG,OAAS,GAAI+S,gBAAe,SAC1C/S,EAAOoG,WAAW0L,YACpB9R,EAAOoG,WAAW0L,UAAU1L,WAAa,MAE3CpG,EAAOoG,WAAWC,8BAClBsP,EAAa3V,IAGjB,IAAKwH,EAAI,EAAGA,EAAIsO,EAAW3N,OAAQX,IACjCsO,EAAWtO,GAAGwO,YAQlBnG,EAAMkD,eAAiB,SAASzF,EAAQ1F,EAAahJ,EAAayS,GAmBhE,MAlBArS,MAAKsO,OAASA,EACdtO,KAAK+W,QAAU,KAEfnX,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAE3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAoBI,MACpDA,KAAKiB,OAAOgG,QAAUjH,KACI,kBAAf4I,IACTnJ,EAAOsO,WAAW,wBAAyB,aAAc,wCACzD/N,KAAKiX,qBAAuBrO,GAE5B5I,KAAKiX,qBAAuB,GAAIZ,GAAazN,GAE/C5I,KAAKkX,WAAatO,EAClB5I,KAAK8E,eAAiBrF,EAAOgF,wBAAwBzE,KAAKmH,SAC1DnH,KAAKsS,IAAMD,EACJrS,MAGT6Q,EAAMkD,eAAelN,WACnBsQ,UAAW,WACT,MAAwC,kBAA7BnX,MAAKiX,qBACPjX,KAAKiX,qBACPjX,KAAKiX,qBAAqBX,SAEnCc,aAAaC,GACX,GAA+B,kBAApBrX,MAAKmX,YACd,KAAM,IAAInJ,OAAM,qEAElBhO,MAAKsU,UAAY+C,EACbrX,KAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBiQ,aACE,MAAOtX,MAAK+W,SAEdlX,MAAO,WACL,GAA+B,kBAApBG,MAAKmX,YACd,KAAM,IAAInJ,OAAM,2CAElB,IAAInO,GAAQ,GAAIkU,gBAAe/T,KAAKsO,UAAY7O,EAAOE,iBAAiBK,KAAKkH,cAAelH,KAAKsS,IAGjG,OAFAzS,GAAMoX,qBAAuBjX,KAAKiX,qBAClCpX,EAAMqX,WAAalX,KAAKkX,WACjBrX,GAETmS,OAAQ,WACNnB,EAAM+F,aAAa5W,QAIvB,IAAIiP,GAAyBC,QAAQrI,UAAUoH,OAC/CiB,SAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAChD,GAAIkD,GAAK,EAIT,OAHIlD,IAAWA,EAAQkD,KACrBA,EAAKlD,EAAQkD,IAERxB,EAAMG,SAASY,MAAM,GAAIf,GAAMkD,eAAe/T,KAAM4I,EAAauG,EAASkD,IAGnF,IAAIkF,GAAanU,SAASsI,gBAAgB,+BAAgC,MAC1EmF,GAAMmD,wCAA0C,SAASwD,GACvD,GAAIA,EAAgB,CAClB,GAAIlJ,GAASkJ,EAAelJ,QAAUiJ,EAClC7N,EAAY8N,EAAeN,UACP,mBAAbxN,KACTA,KAEF,IAAIyF,GAAUqI,EAAetQ,YAC7BiI,GAAQkD,GAAKmF,EAAelF,QAE5B,IAAIhE,GAASiJ,EACT7N,KACAyF,EAAU,CAEhB,OAAOF,GAAuBnL,MAAMwK,GAAS5E,EAAWyF,KAI1D0B,EAAMoD,+BAAiC,SAAS7E,GAC1CA,EAAUpO,QAA0D,kBAAzCoO,GAAUpO,OAAOiW,sBAC9CpG,EAAM0D,6BAA6BnF,GAIvC,IAAIqH,KACJ5F,GAAMkF,eAAiB,SAAS0B,GACG,OAA7BA,EAAe5D,WAAuB4D,EAAe7E,WAE7B,GAAxB6D,EAActN,QAChBiI,sBAAsBmF,GAExBE,EAAcnN,KAAKmO,IAWrB,IAAIC,GAA2B5N,OAAO0G,gBACtCnP,QAAO4Q,eAAenI,OAAQ,oBAC5BoI,cAAAA,EACAyF,YAAAA,EACA3Q,MAAO,WACL6J,EAAMG,SAASM,2BACf,IAAIlJ,GAASsP,EAAyB5T,MAAM9D,KAAM4X,UAIlD,OAHIrB,OACFnO,EAASsP,EAAyB5T,MAAM9D,KAAM4X,YAChD/G,EAAMG,SAASM,4BACRlJ,KAIX0B,OAAOiK,eAAiBlD,EAAMkD,eAC9BjK,OAAOoF,QAAQrI,UAAU2K,cAAgB,WACvC,MAAOpO,UAAS4N,SAASQ,gBAAgB7G,OAAO,SAASyE,GACvD,MAA4B,QAArBA,EAAUpO,QAAmBoO,EAAUpO,OAAOsN,QAAUtO,MAC/D6U,KAAK7U,SAGTV,EAAqBE,GCzKvB,SAAUC,EAAQoR,EAAOnR,GA6CvB,QAASmY,GAASR,GACZA,EAASS,cAEbT,EAASS,aAAAA,EACTC,EAAUzO,KAAK+N,GACVlG,IACHA,GAAAA,EACAC,sBAAsB4G,KAI1B,QAASA,GAAKjH,GACZ,GAAIkH,GAAWF,CACfA,MACAE,EAAS1O,KAAK,SAAS2O,EAAMC,GAC3B,MAAOD,GAAK1F,gBAAkB2F,EAAM3F,kBAEtCyF,EAAWA,EAAStN,OAAO,SAAS0M,GAClCA,GACA,IAAI1F,GAAY0F,EAASjQ,WAAaiQ,EAASjQ,WAAWuK,UAAY,MAGtE,OAFiB,WAAbA,GAAuC,WAAbA,IAC5B0F,EAASS,aAAAA,GACJT,EAASS,cAElBC,EAAUzO,KAAKxF,MAAMiU,EAAWE,GAE5BF,EAAU5O,QACZgI,GAAAA,EACAC,sBAAsB4G,IAEtB7G,GAAAA,EAzEJ,GAEIsB,IAFarP,SAASsI,gBAAgB,+BAAgC,OAErD,EACrBmF,GAAM0D,6BAA+B,SAASnF,GAC5C,GACIgJ,GADA9J,EAASc,EAAUpO,OAAOsN,OAE1B+J,EAA0D,kBAAhCjJ,GAAUpO,OAAOmW,WAE7CiB,GADEC,EACejJ,EAAUpO,OAAOmW,YAEjB/H,EAAUpO,OAAOsT,SAEpC,IAAIrT,GAASmO,EAAUpO,OAAOC,OAC1BqX,EAAO,IACXrX,GAASxB,EAAOoC,qBAAqBZ,EACrC,IAAIoW,GAAW,WACb,GAAItG,GAAIsG,EAASjQ,WAAaiQ,EAASjQ,WAAWmH,YAAc,IACtD,QAANwC,IACFA,EAAItR,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,GAAS8P,EAAG9P,GAC7EG,MAAM2P,KACRA,EAAI,OAIJA,IAAMuH,IACJD,EACFD,EAAerH,EAAGzC,EAAQc,EAAUpO,QAEpCoX,EAAerH,EAAG3B,EAAUpO,OAAQoO,EAAUpO,OAAOoG,aAGzDkR,EAAOvH,EAGTsG,GAASjQ,WAAagI,EACtBiI,EAASS,aAAAA,EACTT,EAAS7E,gBAAkBC,IAC3BrD,EAAU0D,UAAYuE,EACtBQ,EAASR,GAGX,IAAIU,MACA5G,GAAAA,CAmCJN,GAAMgB,UAAUhL,UAAUgP,UAAY,WAChC7V,KAAK8S,WACP+E,EAAS7X,KAAK8S,aAGjBxT,EAAqBE,GCnFxB,SAAUC,EAAQoR,EAAOnR,GAEvB,QAASkV,GAAmB2D,GAC1B,MAAOA,GAAKpR,QAAQjC,MAAQqT,EAAKzT,eAAiByT,EAAKpR,QAAQhC,SAGjE,QAASqT,GAAYzD,EAAUnV,EAAayS,GAC1CrS,KAAKsS,IAAMD,EACXrS,KAAK+W,QAAU,KACf/W,KAAK+U,SAAWA,MAChB/U,KAAKyY,UAAUzY,KAAK+U,UACpBnV,EAAcH,EAAOmC,sBAAsBhC,GAC3CI,KAAKkH,aAAezH,EAAOE,iBAAiBC,GAC5CI,KAAKmH,QAAU1H,EAAOoC,qBAAqBjC,GAAAA,GAC3CI,KAAKiB,OAASxB,EAAOqB,WAAWlB,GAAAA,EAAmBI,MACnDA,KAAKiB,OAAOgG,QAAUjH,KAEQ,SAA1BA,KAAKmH,QAAQhG,WACfnB,KAAKmH,QAAQhG,SAAWnB,KAAK8E,gBAIjCgF,OAAOoK,eAAiB,WACtBsE,EAAY1U,MAAM9D,KAAM4X,YAG1B9N,OAAOqK,YAAc,WACnBqE,EAAY1U,MAAM9D,KAAM4X,YAG1BY,EAAY3R,WACV6R,YAAa,SAAS1X,GAEpB,IADA,GAAIe,GAAI/B,KACK,OAAN+B,GAAY,CACjB,GAAIA,GAAKf,EACP,OAAA,CACFe,GAAIA,EAAEgV,QAER,OAAA,GAEFC,SAAU,WAGR,IADA,GAAIuB,GAAOvY,KACJuY,GACwB,SAAzBA,EAAKtX,OAAOE,WACdoX,EAAKpR,QAAQhG,SAAWoX,EAAKzT,gBAE/ByT,EAAOA,EAAKxB,OAEV/W,MAAKoH,YACPpH,KAAKoH,WAAWC,+BAGpBoR,UAAW,SAASE,GAClB9H,EAAM+F,YAAY+B,EAClB,KAAK,GAAInQ,GAAI,EAAGA,EAAImQ,EAAYxP,OAAQX,IACtCmQ,EAAYnQ,GAAGuO,QAAU/W,MAG7B4Y,UAAW,SAASC,EAAMC,GAExB,IAAK,GADDrO,GAAUqO,EAAW,oCAAsC,qCACtDtQ,EAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/B,GAAIxI,KAAK0Y,YAAYG,EAAKrQ,IACxB,MACE6B,KAAMC,aAAayO,sBACnBvO,KAAM,wBACNC,QAASA,EAKf,KAAK,GAAIjC,GAAI,EAAGA,EAAIqQ,EAAK1P,OAAQX,IAC/BsQ,EAAW9Y,KAAK+U,SAASzL,KAAKuP,EAAKrQ,IAAMxI,KAAK+U,SAASiE,QAAQH,EAAKrQ,GAEtExI,MAAKyY,UAAUI,GACf7Y,KAAKgX,YAEPiC,OAAQ,WACNjZ,KAAK4Y,UAAUhB,WAAAA,IAEjBsB,QAAS,WACPlZ,KAAK4Y,UAAUhB,WAAAA,IAEjBN,aACE,MAAOtX,MAAK+W,SAEdoC,iBACE,MAAOnZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS,GAAK,MAEnDqE,gBACE,MAAOpZ,MAAK+U,SAAS5L,OAASnJ,KAAK+U,SAAS/U,KAAK+U,SAAS5L,OAAS,GAAK,MAE1EtJ,MAAO,WAGL,IAAK,GAFDwZ,GAAe5Z,EAAOE,iBAAiBK,KAAKkH,cAC5CoS,KACK9Q,EAAI,EAAGA,EAAIxI,KAAK+U,SAAS5L,OAAQX,IACxC8Q,EAAehQ,KAAKtJ,KAAK+U,SAASvM,GAAG3I,QAEvC,OAAQG,gBAAgBmU,aACpB,GAAIA,aAAYmF,EAAgBD,GAChC,GAAInF,gBAAeoF,EAAgBD,IAEzCrH,OAAQ,WACNnB,EAAM+F,aAAa5W,SAIvB8J,OAAOoK,eAAerN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WAC5DxF,OAAO4Q,eACHnI,OAAOoK,eAAerN,UACtB,kBAEEsL,IAAK,WACH,GAAIqH,GAAQ,CAIZ,OAHAxZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BsE,GAAS5E,EAAmBM,KAEvBvS,KAAK8W,IAAID,EAAO,MAI/B1P,OAAOqK,YAAYtN,UAAYxF,OAAOkY,OAAOf,EAAY3R,WACzDxF,OAAO4Q,eACHnI,OAAOqK,YAAYtN,UACnB,kBAEEsL,IAAK,WACH,GAAIsH,GAAM,CAIV,OAHAzZ,MAAK+U,SAASxT,QAAQ,SAAS2T,GAC7BuE,EAAM9W,KAAK8W,IAAIA,EAAK7E,EAAmBM,MAElCuE,KAIf5I,EAAMuD,+BAAiC,SAASsF,GAC9C,GAAIC,GACA1Y,EAAS,KACT2Y,EAAS,SAASC,GACpB,GAAIzK,GAAYuK,EAAoB7F,QACpC,IAAK1E,GAGsB,WAAvBA,EAAUuC,WAGTvC,EAAUpO,OAGf,MAAU,OAAN6Y,MACFzK,GAAU6F,yBAQF,GAAN4E,GAAWzK,EAAUzK,aAAe,IACjC1D,IACHA,EAASxB,EAAOoC,qBAAqBuN,EAAUpO,OAAOC,SAExD4Y,EAAKpa,EAAOgH,2BAA2BhH,EAAOgF,wBAAwBxD,IAAU,EAAGA,GAC/EG,MAAMyY,IAAa,MAANA,IACfzK,EAAU0G,cAAc,SAASZ,GAC/BA,EAAM3G,aAAe,QAEvBa,GAAU6F,8BAAAA,IAMZ6E,EAAmB,GAAI/F,gBAAe,QAAU2F,EAAMvS,QAASuS,EAAMpH,IAGzE,OAFAwH,GAAiB1C,SAAWwC,EAC5BD,EAAsB9I,EAAMG,SAASY,MAAMkI,IAI7CjJ,EAAMwD,sBAAwB,SAASjF,GACrCA,EAAUhI,WAAW0M,SAAW1E,EAChCA,EAAUwD,UAAAA,EACV/B,EAAMkF,eAAe3G,GACrBA,EAAU4F,4BACV5F,EAAU0F,sBAAsB1F,IAGlCyB,EAAM+D,mBAAqBA,GAE1BtV,EAAqBE,GV3LpBA,EAAAA,KAEJua,MACMC,WAAAA,MAAuBha","file":"web-animations-next.min.js"}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.html b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.html
deleted file mode 100644
index b5de36c..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
- Copyright 2014 Google Inc. All rights reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- WARNING: This file is DEPRECATED, for development purposes use
-              web-animations*.dev.html instead or depend on 
-              web-animations*.min.js in the web-animations-js
-              repository -->
-
-<script src="src/dev.js"></script>
-<script src="src/scope.js"></script>
-<script src="src/deprecation.js"></script>
-<script src="src/timing-utilities.js"></script>
-<script src="src/normalize-keyframes.js"></script>
-<script src="src/animation-node.js"></script>
-<script src="src/effect.js"></script>
-<script src="src/property-interpolation.js"></script>
-<script src="src/animation.js"></script>
-<script src="src/apply.js"></script>
-<script src="src/element-animatable.js"></script>
-<script src="src/interpolation.js"></script>
-<script src="src/player.js"></script>
-<script src="src/tick.js"></script>
-<script src="src/handler-utils.js"></script>
-<script src="src/shadow-handler.js"></script>
-<script src="src/number-handler.js"></script>
-<script src="src/visibility-handler.js"></script>
-<script src="src/color-handler.js"></script>
-<script src="src/dimension-handler.js"></script>
-<script src="src/box-handler.js"></script>
-<script src="src/transform-handler.js"></script>
-<script src="src/property-names.js"></script>
-<script src="src/timeline.js"></script>
-<script src="src/maxifill-player.js"></script>
-<script src="src/animation-constructor.js"></script>
-<script src="src/effect-callback.js"></script>
-<script src="src/group-constructors.js"></script>
-
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.html b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.html
deleted file mode 100644
index b36940d..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="./web-animations.min.js"></script>
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.js b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.js
deleted file mode 100644
index 46156b2..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-//     You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//     See the License for the specific language governing permissions and
-// limitations under the License.
-
-!function(a,b){var c={},d={};!function(a,b){function c(a){if("number"==typeof a)return a;var b={};for(var c in a)b[c]=a[c];return b}function d(){this._delay=0,this._endDelay=0,this._fill="none",this._iterationStart=0,this._iterations=1,this._duration=0,this._playbackRate=1,this._direction="normal",this._easing="linear",this._easingFunction=x}function e(){return a.isDeprecated("Invalid timing inputs","2016-03-02","TypeError exceptions will be thrown instead.",!0)}function f(b,c,e){var f=new d;return c&&(f.fill="both",f.duration="auto"),"number"!=typeof b||isNaN(b)?void 0!==b&&Object.getOwnPropertyNames(b).forEach(function(c){if("auto"!=b[c]){if(("number"==typeof f[c]||"duration"==c)&&("number"!=typeof b[c]||isNaN(b[c])))return;if("fill"==c&&-1==v.indexOf(b[c]))return;if("direction"==c&&-1==w.indexOf(b[c]))return;if("playbackRate"==c&&1!==b[c]&&a.isDeprecated("AnimationEffectTiming.playbackRate","2014-11-28","Use Animation.playbackRate instead."))return;f[c]=b[c]}}):f.duration=b,f}function g(a){return"number"==typeof a&&(a=isNaN(a)?{duration:0}:{duration:a}),a}function h(b,c){return b=a.numericTimingToObject(b),f(b,c)}function i(a,b,c,d){return a<0||a>1||c<0||c>1?x:function(e){function f(a,b,c){return 3*a*(1-c)*(1-c)*c+3*b*(1-c)*c*c+c*c*c}if(e<=0){var g=0;return a>0?g=b/a:!b&&c>0&&(g=d/c),g*e}if(e>=1){var h=0;return c<1?h=(d-1)/(c-1):1==c&&a<1&&(h=(b-1)/(a-1)),1+h*(e-1)}for(var i=0,j=1;i<j;){var k=(i+j)/2,l=f(a,c,k);if(Math.abs(e-l)<1e-5)return f(b,d,k);l<e?i=k:j=k}return f(b,d,k)}}function j(a,b){return function(c){if(c>=1)return 1;var d=1/a;return(c+=b*d)-c%d}}function k(a){C||(C=document.createElement("div").style),C.animationTimingFunction="",C.animationTimingFunction=a;var b=C.animationTimingFunction;if(""==b&&e())throw new TypeError(a+" is not a valid value for easing");return b}function l(a){if("linear"==a)return x;var b=E.exec(a);if(b)return i.apply(this,b.slice(1).map(Number));var c=F.exec(a);return c?j(Number(c[1]),{start:y,middle:z,end:A}[c[2]]):B[a]||x}function m(a){return Math.abs(n(a)/a.playbackRate)}function n(a){return 0===a.duration||0===a.iterations?0:a.duration*a.iterations}function o(a,b,c){if(null==b)return G;var d=c.delay+a+c.endDelay;return b<Math.min(c.delay,d)?H:b>=Math.min(c.delay+a,d)?I:J}function p(a,b,c,d,e){switch(d){case H:return"backwards"==b||"both"==b?0:null;case J:return c-e;case I:return"forwards"==b||"both"==b?a:null;case G:return null}}function q(a,b,c,d,e){var f=e;return 0===a?b!==H&&(f+=c):f+=d/a,f}function r(a,b,c,d,e,f){var g=a===1/0?b%1:a%1;return 0!==g||c!==I||0===d||0===e&&0!==f||(g=1),g}function s(a,b,c,d){return a===I&&b===1/0?1/0:1===c?Math.floor(d)-1:Math.floor(d)}function t(a,b,c){var d=a;if("normal"!==a&&"reverse"!==a){var e=b;"alternate-reverse"===a&&(e+=1),d="normal",e!==1/0&&e%2!=0&&(d="reverse")}return"normal"===d?c:1-c}function u(a,b,c){var d=o(a,b,c),e=p(a,c.fill,b,d,c.delay);if(null===e)return null;var f=q(c.duration,d,c.iterations,e,c.iterationStart),g=r(f,c.iterationStart,d,c.iterations,e,c.duration),h=s(d,c.iterations,g,f),i=t(c.direction,h,g);return c._easingFunction(i)}var v="backwards|forwards|both|none".split("|"),w="reverse|alternate|alternate-reverse".split("|"),x=function(a){return a};d.prototype={_setMember:function(b,c){this["_"+b]=c,this._effect&&(this._effect._timingInput[b]=c,this._effect._timing=a.normalizeTimingInput(this._effect._timingInput),this._effect.activeDuration=a.calculateActiveDuration(this._effect._timing),this._effect._animation&&this._effect._animation._rebuildUnderlyingAnimation())},get playbackRate(){return this._playbackRate},set delay(a){this._setMember("delay",a)},get delay(){return this._delay},set endDelay(a){this._setMember("endDelay",a)},get endDelay(){return this._endDelay},set fill(a){this._setMember("fill",a)},get fill(){return this._fill},set iterationStart(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterationStart must be a non-negative number, received: "+timing.iterationStart);this._setMember("iterationStart",a)},get iterationStart(){return this._iterationStart},set duration(a){if("auto"!=a&&(isNaN(a)||a<0)&&e())throw new TypeError("duration must be non-negative or auto, received: "+a);this._setMember("duration",a)},get duration(){return this._duration},set direction(a){this._setMember("direction",a)},get direction(){return this._direction},set easing(a){this._easingFunction=l(k(a)),this._setMember("easing",a)},get easing(){return this._easing},set iterations(a){if((isNaN(a)||a<0)&&e())throw new TypeError("iterations must be non-negative, received: "+a);this._setMember("iterations",a)},get iterations(){return this._iterations}};var y=1,z=.5,A=0,B={ease:i(.25,.1,.25,1),"ease-in":i(.42,0,1,1),"ease-out":i(0,0,.58,1),"ease-in-out":i(.42,0,.58,1),"step-start":j(1,y),"step-middle":j(1,z),"step-end":j(1,A)},C=null,D="\\s*(-?\\d+\\.?\\d*|-?\\.\\d+)\\s*",E=new RegExp("cubic-bezier\\("+D+","+D+","+D+","+D+"\\)"),F=/steps\(\s*(\d+)\s*,\s*(start|middle|end)\s*\)/,G=0,H=1,I=2,J=3;a.cloneTimingInput=c,a.makeTiming=f,a.numericTimingToObject=g,a.normalizeTimingInput=h,a.calculateActiveDuration=m,a.calculateIterationProgress=u,a.calculatePhase=o,a.normalizeEasing=k,a.parseEasingFunction=l}(c),function(a,b){function c(a,b){return a in k?k[a][b]||b:b}function d(a){return"display"===a||0===a.lastIndexOf("animation",0)||0===a.lastIndexOf("transition",0)}function e(a,b,e){if(!d(a)){var f=h[a];if(f){i.style[a]=b;for(var g in f){var j=f[g],k=i.style[j];e[j]=c(j,k)}}else e[a]=c(a,b)}}function f(a){var b=[];for(var c in a)if(!(c in["easing","offset","composite"])){var d=a[c];Array.isArray(d)||(d=[d]);for(var e,f=d.length,g=0;g<f;g++)e={},e.offset="offset"in a?a.offset:1==f?1:g/(f-1),"easing"in a&&(e.easing=a.easing),"composite"in a&&(e.composite=a.composite),e[c]=d[g],b.push(e)}return b.sort(function(a,b){return a.offset-b.offset}),b}function g(b){function c(){var a=d.length;null==d[a-1].offset&&(d[a-1].offset=1),a>1&&null==d[0].offset&&(d[0].offset=0);for(var b=0,c=d[0].offset,e=1;e<a;e++){var f=d[e].offset;if(null!=f){for(var g=1;g<e-b;g++)d[b+g].offset=c+(f-c)*g/(e-b);b=e,c=f}}}if(null==b)return[];window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||(b=f(b));for(var d=b.map(function(b){var c={};for(var d in b){var f=b[d];if("offset"==d){if(null!=f){if(f=Number(f),!isFinite(f))throw new TypeError("Keyframe offsets must be numbers.");if(f<0||f>1)throw new TypeError("Keyframe offsets must be between 0 and 1.")}}else if("composite"==d){if("add"==f||"accumulate"==f)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"add compositing is not supported"};if("replace"!=f)throw new TypeError("Invalid composite mode "+f+".")}else f="easing"==d?a.normalizeEasing(f):""+f;e(d,f,c)}return void 0==c.offset&&(c.offset=null),void 0==c.easing&&(c.easing="linear"),c}),g=!0,h=-1/0,i=0;i<d.length;i++){var j=d[i].offset;if(null!=j){if(j<h)throw new TypeError("Keyframes are not loosely sorted by offset. Sort or specify offsets.");h=j}else g=!1}return d=d.filter(function(a){return a.offset>=0&&a.offset<=1}),g||c(),d}var h={background:["backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundAttachment","backgroundOrigin","backgroundClip","backgroundColor"],border:["borderTopColor","borderTopStyle","borderTopWidth","borderRightColor","borderRightStyle","borderRightWidth","borderBottomColor","borderBottomStyle","borderBottomWidth","borderLeftColor","borderLeftStyle","borderLeftWidth"],borderBottom:["borderBottomWidth","borderBottomStyle","borderBottomColor"],borderColor:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],borderLeft:["borderLeftWidth","borderLeftStyle","borderLeftColor"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],borderRight:["borderRightWidth","borderRightStyle","borderRightColor"],borderTop:["borderTopWidth","borderTopStyle","borderTopColor"],borderWidth:["borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth"],flex:["flexGrow","flexShrink","flexBasis"],font:["fontFamily","fontSize","fontStyle","fontVariant","fontWeight","lineHeight"],margin:["marginTop","marginRight","marginBottom","marginLeft"],outline:["outlineColor","outlineStyle","outlineWidth"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft"]},i=document.createElementNS("http://www.w3.org/1999/xhtml","div"),j={thin:"1px",medium:"3px",thick:"5px"},k={borderBottomWidth:j,borderLeftWidth:j,borderRightWidth:j,borderTopWidth:j,fontSize:{"xx-small":"60%","x-small":"75%",small:"89%",medium:"100%",large:"120%","x-large":"150%","xx-large":"200%"},fontWeight:{normal:"400",bold:"700"},outlineWidth:j,textShadow:{none:"0px 0px 0px transparent"},boxShadow:{none:"0px 0px 0px 0px transparent"}};a.convertToArrayForm=f,a.normalizeKeyframes=g}(c),function(a){var b={};a.isDeprecated=function(a,c,d,e){var f=e?"are":"is",g=new Date,h=new Date(c);return h.setMonth(h.getMonth()+3),!(g<h&&(a in b||console.warn("Web Animations: "+a+" "+f+" deprecated and will stop working on "+h.toDateString()+". "+d),b[a]=!0,1))},a.deprecated=function(b,c,d,e){var f=e?"are":"is";if(a.isDeprecated(b,c,d,e))throw new Error(b+" "+f+" no longer supported. "+d)}}(c),function(){if(document.documentElement.animate){var a=document.documentElement.animate([],0),b=!0;if(a&&(b=!1,"play|currentTime|pause|reverse|playbackRate|cancel|finish|startTime|playState".split("|").forEach(function(c){void 0===a[c]&&(b=!0)})),!b)return}!function(a,b,c){function d(a){for(var b={},c=0;c<a.length;c++)for(var d in a[c])if("offset"!=d&&"easing"!=d&&"composite"!=d){var e={offset:a[c].offset,easing:a[c].easing,value:a[c][d]};b[d]=b[d]||[],b[d].push(e)}for(var f in b){var g=b[f];if(0!=g[0].offset||1!=g[g.length-1].offset)throw{type:DOMException.NOT_SUPPORTED_ERR,name:"NotSupportedError",message:"Partial keyframes are not supported"}}return b}function e(c){var d=[];for(var e in c)for(var f=c[e],g=0;g<f.length-1;g++){var h=g,i=g+1,j=f[h].offset,k=f[i].offset,l=j,m=k;0==g&&(l=-1/0,0==k&&(i=h)),g==f.length-2&&(m=1/0,1==j&&(h=i)),d.push({applyFrom:l,applyTo:m,startOffset:f[h].offset,endOffset:f[i].offset,easingFunction:a.parseEasingFunction(f[h].easing),property:e,interpolation:b.propertyInterpolation(e,f[h].value,f[i].value)})}return d.sort(function(a,b){return a.startOffset-b.startOffset}),d}b.convertEffectInput=function(c){var f=a.normalizeKeyframes(c),g=d(f),h=e(g);return function(a,c){if(null!=c)h.filter(function(a){return c>=a.applyFrom&&c<a.applyTo}).forEach(function(d){var e=c-d.startOffset,f=d.endOffset-d.startOffset,g=0==f?0:d.easingFunction(e/f);b.apply(a,d.property,d.interpolation(g))});else for(var d in g)"offset"!=d&&"easing"!=d&&"composite"!=d&&b.clear(a,d)}}}(c,d),function(a,b,c){function d(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}function e(a,b,c){h[c]=h[c]||[],h[c].push([a,b])}function f(a,b,c){for(var f=0;f<c.length;f++){e(a,b,d(c[f]))}}function g(c,e,f){var g=c;/-/.test(c)&&!a.isDeprecated("Hyphenated property names","2016-03-22","Use camelCase instead.",!0)&&(g=d(c)),"initial"!=e&&"initial"!=f||("initial"==e&&(e=i[g]),"initial"==f&&(f=i[g]));for(var j=e==f?[]:h[g],k=0;j&&k<j.length;k++){var l=j[k][0](e),m=j[k][0](f);if(void 0!==l&&void 0!==m){var n=j[k][1](l,m);if(n){var o=b.Interpolation.apply(null,n);return function(a){return 0==a?e:1==a?f:o(a)}}}}return b.Interpolation(!1,!0,function(a){return a?f:e})}var h={};b.addPropertiesHandler=f;var i={backgroundColor:"transparent",backgroundPosition:"0% 0%",borderBottomColor:"currentColor",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",borderBottomWidth:"3px",borderLeftColor:"currentColor",borderLeftWidth:"3px",borderRightColor:"currentColor",borderRightWidth:"3px",borderSpacing:"2px",borderTopColor:"currentColor",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderTopWidth:"3px",bottom:"auto",clip:"rect(0px, 0px, 0px, 0px)",color:"black",fontSize:"100%",fontWeight:"400",height:"auto",left:"auto",letterSpacing:"normal",lineHeight:"120%",marginBottom:"0px",marginLeft:"0px",marginRight:"0px",marginTop:"0px",maxHeight:"none",maxWidth:"none",minHeight:"0px",minWidth:"0px",opacity:"1.0",outlineColor:"invert",outlineOffset:"0px",outlineWidth:"3px",paddingBottom:"0px",paddingLeft:"0px",paddingRight:"0px",paddingTop:"0px",right:"auto",strokeDasharray:"none",strokeDashoffset:"0px",textIndent:"0px",textShadow:"0px 0px 0px transparent",top:"auto",transform:"",verticalAlign:"0px",visibility:"visible",width:"auto",wordSpacing:"normal",zIndex:"auto"};b.propertyInterpolation=g}(c,d),function(a,b,c){function d(b){var c=a.calculateActiveDuration(b),d=function(d){return a.calculateIterationProgress(c,d,b)};return d._totalDuration=b.delay+c+b.endDelay,d}b.KeyframeEffect=function(c,e,f,g){var h,i=d(a.normalizeTimingInput(f)),j=b.convertEffectInput(e),k=function(){j(c,h)};return k._update=function(a){return null!==(h=i(a))},k._clear=function(){j(c,null)},k._hasSameTarget=function(a){return c===a},k._target=c,k._totalDuration=i._totalDuration,k._id=g,k}}(c,d),function(a,b){function c(a,b){return!(!b.namespaceURI||-1==b.namespaceURI.indexOf("/svg"))&&(g in a||(a[g]=/Trident|MSIE|IEMobile|Edge|Android 4/i.test(a.navigator.userAgent)),a[g])}function d(a,b,c){c.enumerable=!0,c.configurable=!0,Object.defineProperty(a,b,c)}function e(a){this._element=a,this._surrogateStyle=document.createElementNS("http://www.w3.org/1999/xhtml","div").style,this._style=a.style,this._length=0,this._isAnimatedProperty={},this._updateSvgTransformAttr=c(window,a),this._savedTransformAttr=null;for(var b=0;b<this._style.length;b++){var d=this._style[b];this._surrogateStyle[d]=this._style[d]}this._updateIndices()}function f(a){if(!a._webAnimationsPatchedStyle){var b=new e(a);try{d(a,"style",{get:function(){return b}})}catch(b){a.style._set=function(b,c){a.style[b]=c},a.style._clear=function(b){a.style[b]=""}}a._webAnimationsPatchedStyle=a.style}}var g="_webAnimationsUpdateSvgTransformAttr",h={cssText:1,length:1,parentRule:1},i={getPropertyCSSValue:1,getPropertyPriority:1,getPropertyValue:1,item:1,removeProperty:1,setProperty:1},j={removeProperty:1,setProperty:1};e.prototype={get cssText(){return this._surrogateStyle.cssText},set cssText(a){for(var b={},c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;this._surrogateStyle.cssText=a,this._updateIndices();for(var c=0;c<this._surrogateStyle.length;c++)b[this._surrogateStyle[c]]=!0;for(var d in b)this._isAnimatedProperty[d]||this._style.setProperty(d,this._surrogateStyle.getPropertyValue(d))},get length(){return this._surrogateStyle.length},get parentRule(){return this._style.parentRule},_updateIndices:function(){for(;this._length<this._surrogateStyle.length;)Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,get:function(a){return function(){return this._surrogateStyle[a]}}(this._length)}),this._length++;for(;this._length>this._surrogateStyle.length;)this._length--,Object.defineProperty(this,this._length,{configurable:!0,enumerable:!1,value:void 0})},_set:function(b,c){this._style[b]=c,this._isAnimatedProperty[b]=!0,this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(null==this._savedTransformAttr&&(this._savedTransformAttr=this._element.getAttribute("transform")),this._element.setAttribute("transform",a.transformToSvgMatrix(c)))},_clear:function(b){this._style[b]=this._surrogateStyle[b],this._updateSvgTransformAttr&&"transform"==a.unprefixedPropertyName(b)&&(this._savedTransformAttr?this._element.setAttribute("transform",this._savedTransformAttr):this._element.removeAttribute("transform"),this._savedTransformAttr=null),delete this._isAnimatedProperty[b]}};for(var k in i)e.prototype[k]=function(a,b){return function(){var c=this._surrogateStyle[a].apply(this._surrogateStyle,arguments);return b&&(this._isAnimatedProperty[arguments[0]]||this._style[a].apply(this._style,arguments),this._updateIndices()),c}}(k,k in j);for(var l in document.documentElement.style)l in h||l in i||function(a){d(e.prototype,a,{get:function(){return this._surrogateStyle[a]},set:function(b){this._surrogateStyle[a]=b,this._updateIndices(),this._isAnimatedProperty[a]||(this._style[a]=b)}})}(l);a.apply=function(b,c,d){f(b),b.style._set(a.propertyName(c),d)},a.clear=function(b,c){b._webAnimationsPatchedStyle&&b.style._clear(a.propertyName(c))}}(d),function(a){window.Element.prototype.animate=function(b,c){var d="";return c&&c.id&&(d=c.id),a.timeline._play(a.KeyframeEffect(this,b,c,d))}}(d),function(a,b){function c(a,b,d){if("number"==typeof a&&"number"==typeof b)return a*(1-d)+b*d;if("boolean"==typeof a&&"boolean"==typeof b)return d<.5?a:b;if(a.length==b.length){for(var e=[],f=0;f<a.length;f++)e.push(c(a[f],b[f],d));return e}throw"Mismatched interpolation arguments "+a+":"+b}a.Interpolation=function(a,b,d){return function(e){return d(c(a,b,e))}}}(d),function(a,b){function c(a,b,c){return Math.max(Math.min(a,c),b)}function d(b,d,e){var f=a.dot(b,d);f=c(f,-1,1);var g=[];if(1===f)g=b;else for(var h=Math.acos(f),i=1*Math.sin(e*h)/Math.sqrt(1-f*f),j=0;j<4;j++)g.push(b[j]*(Math.cos(e*h)-f*i)+d[j]*i);return g}var e=function(){function a(a,b){for(var c=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],d=0;d<4;d++)for(var e=0;e<4;e++)for(var f=0;f<4;f++)c[d][e]+=b[d][f]*a[f][e];return c}function b(a){return 0==a[0][2]&&0==a[0][3]&&0==a[1][2]&&0==a[1][3]&&0==a[2][0]&&0==a[2][1]&&1==a[2][2]&&0==a[2][3]&&0==a[3][2]&&1==a[3][3]}function c(c,d,e,f,g){for(var h=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],i=0;i<4;i++)h[i][3]=g[i];for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[3][i]+=c[j]*h[j][i];var k=f[0],l=f[1],m=f[2],n=f[3],o=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];o[0][0]=1-2*(l*l+m*m),o[0][1]=2*(k*l-m*n),o[0][2]=2*(k*m+l*n),o[1][0]=2*(k*l+m*n),o[1][1]=1-2*(k*k+m*m),o[1][2]=2*(l*m-k*n),o[2][0]=2*(k*m-l*n),o[2][1]=2*(l*m+k*n),o[2][2]=1-2*(k*k+l*l),h=a(h,o);var p=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];e[2]&&(p[2][1]=e[2],h=a(h,p)),e[1]&&(p[2][1]=0,p[2][0]=e[0],h=a(h,p)),e[0]&&(p[2][0]=0,p[1][0]=e[0],h=a(h,p));for(var i=0;i<3;i++)for(var j=0;j<3;j++)h[i][j]*=d[i];return b(h)?[h[0][0],h[0][1],h[1][0],h[1][1],h[3][0],h[3][1]]:h[0].concat(h[1],h[2],h[3])}return c}();a.composeMatrix=e,a.quat=d}(d),function(a,b,c){a.sequenceNumber=0;var d=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="finish",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()};b.Animation=function(b){this.id="",b&&b._id&&(this.id=b._id),this._sequenceNumber=a.sequenceNumber++,this._currentTime=0,this._startTime=null,this._paused=!1,this._playbackRate=1,this._inTimeline=!0,this._finishedFlag=!0,this.onfinish=null,this._finishHandlers=[],this._effect=b,this._inEffect=this._effect._update(0),this._idle=!0,this._currentTimePending=!1},b.Animation.prototype={_ensureAlive:function(){this.playbackRate<0&&0===this.currentTime?this._inEffect=this._effect._update(-1):this._inEffect=this._effect._update(this.currentTime),this._inTimeline||!this._inEffect&&this._finishedFlag||(this._inTimeline=!0,b.timeline._animations.push(this))},_tickCurrentTime:function(a,b){a!=this._currentTime&&(this._currentTime=a,this._isFinished&&!b&&(this._currentTime=this._playbackRate>0?this._totalDuration:0),this._ensureAlive())},get currentTime(){return this._idle||this._currentTimePending?null:this._currentTime},set currentTime(a){a=+a,isNaN(a)||(b.restart(),this._paused||null==this._startTime||(this._startTime=this._timeline.currentTime-a/this._playbackRate),this._currentTimePending=!1,this._currentTime!=a&&(this._idle&&(this._idle=!1,this._paused=!0),this._tickCurrentTime(a,!0),b.applyDirtiedAnimation(this)))},get startTime(){return this._startTime},set startTime(a){a=+a,isNaN(a)||this._paused||this._idle||(this._startTime=a,this._tickCurrentTime((this._timeline.currentTime-this._startTime)*this.playbackRate),b.applyDirtiedAnimation(this))},get playbackRate(){return this._playbackRate},set playbackRate(a){if(a!=this._playbackRate){var c=this.currentTime;this._playbackRate=a,this._startTime=null,"paused"!=this.playState&&"idle"!=this.playState&&(this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)),null!=c&&(this.currentTime=c)}},get _isFinished(){return!this._idle&&(this._playbackRate>0&&this._currentTime>=this._totalDuration||this._playbackRate<0&&this._currentTime<=0)},get _totalDuration(){return this._effect._totalDuration},get playState(){return this._idle?"idle":null==this._startTime&&!this._paused&&0!=this.playbackRate||this._currentTimePending?"pending":this._paused?"paused":this._isFinished?"finished":"running"},_rewind:function(){if(this._playbackRate>=0)this._currentTime=0;else{if(!(this._totalDuration<1/0))throw new DOMException("Unable to rewind negative playback rate animation with infinite duration","InvalidStateError");this._currentTime=this._totalDuration}},play:function(){this._paused=!1,(this._isFinished||this._idle)&&(this._rewind(),this._startTime=null),this._finishedFlag=!1,this._idle=!1,this._ensureAlive(),b.applyDirtiedAnimation(this)},pause:function(){this._isFinished||this._paused||this._idle?this._idle&&(this._rewind(),this._idle=!1):this._currentTimePending=!0,this._startTime=null,this._paused=!0},finish:function(){this._idle||(this.currentTime=this._playbackRate>0?this._totalDuration:0,this._startTime=this._totalDuration-this.currentTime,this._currentTimePending=!1,b.applyDirtiedAnimation(this))},cancel:function(){this._inEffect&&(this._inEffect=!1,this._idle=!0,this._paused=!1,this._isFinished=!0,this._finishedFlag=!0,this._currentTime=0,this._startTime=null,this._effect._update(null),b.applyDirtiedAnimation(this))},reverse:function(){this.playbackRate*=-1,this.play()},addEventListener:function(a,b){"function"==typeof b&&"finish"==a&&this._finishHandlers.push(b)},removeEventListener:function(a,b){if("finish"==a){var c=this._finishHandlers.indexOf(b);c>=0&&this._finishHandlers.splice(c,1)}},_fireEvents:function(a){if(this._isFinished){if(!this._finishedFlag){var b=new d(this,this._currentTime,a),c=this._finishHandlers.concat(this.onfinish?[this.onfinish]:[]);setTimeout(function(){c.forEach(function(a){a.call(b.target,b)})},0),this._finishedFlag=!0}}else this._finishedFlag=!1},_tick:function(a,b){this._idle||this._paused||(null==this._startTime?b&&(this.startTime=a-this._currentTime/this.playbackRate):this._isFinished||this._tickCurrentTime((a-this._startTime)*this.playbackRate)),b&&(this._currentTimePending=!1,this._fireEvents(a))},get _needsTick(){return this.playState in{pending:1,running:1}||!this._finishedFlag},_targetAnimations:function(){var a=this._effect._target;return a._activeAnimations||(a._activeAnimations=[]),a._activeAnimations},_markTarget:function(){var a=this._targetAnimations();-1===a.indexOf(this)&&a.push(this)},_unmarkTarget:function(){var a=this._targetAnimations(),b=a.indexOf(this);-1!==b&&a.splice(b,1)}}}(c,d),function(a,b,c){function d(a){var b=j;j=[],a<q.currentTime&&(a=q.currentTime),q._animations.sort(e),q._animations=h(a,!0,q._animations)[0],b.forEach(function(b){b[1](a)}),g(),l=void 0}function e(a,b){return a._sequenceNumber-b._sequenceNumber}function f(){this._animations=[],this.currentTime=window.performance&&performance.now?performance.now():0}function g(){o.forEach(function(a){a()}),o.length=0}function h(a,c,d){p=!0,n=!1,b.timeline.currentTime=a,m=!1;var e=[],f=[],g=[],h=[];return d.forEach(function(b){b._tick(a,c),b._inEffect?(f.push(b._effect),b._markTarget()):(e.push(b._effect),b._unmarkTarget()),b._needsTick&&(m=!0);var d=b._inEffect||b._needsTick;b._inTimeline=d,d?g.push(b):h.push(b)}),o.push.apply(o,e),o.push.apply(o,f),m&&requestAnimationFrame(function(){}),p=!1,[g,h]}var i=window.requestAnimationFrame,j=[],k=0;window.requestAnimationFrame=function(a){var b=k++;return 0==j.length&&i(d),j.push([b,a]),b},window.cancelAnimationFrame=function(a){j.forEach(function(b){b[0]==a&&(b[1]=function(){})})},f.prototype={_play:function(c){c._timing=a.normalizeTimingInput(c.timing);var d=new b.Animation(c);return d._idle=!1,d._timeline=this,this._animations.push(d),b.restart(),b.applyDirtiedAnimation(d),d}};var l=void 0,m=!1,n=!1;b.restart=function(){return m||(m=!0,requestAnimationFrame(function(){}),n=!0),n},b.applyDirtiedAnimation=function(a){if(!p){a._markTarget();var c=a._targetAnimations();c.sort(e),h(b.timeline.currentTime,!1,c.slice())[1].forEach(function(a){var b=q._animations.indexOf(a);-1!==b&&q._animations.splice(b,1)}),g()}};var o=[],p=!1,q=new f;b.timeline=q}(c,d),function(a,b){function c(a,b){for(var c=0,d=0;d<a.length;d++)c+=a[d]*b[d];return c}function d(a,b){return[a[0]*b[0]+a[4]*b[1]+a[8]*b[2]+a[12]*b[3],a[1]*b[0]+a[5]*b[1]+a[9]*b[2]+a[13]*b[3],a[2]*b[0]+a[6]*b[1]+a[10]*b[2]+a[14]*b[3],a[3]*b[0]+a[7]*b[1]+a[11]*b[2]+a[15]*b[3],a[0]*b[4]+a[4]*b[5]+a[8]*b[6]+a[12]*b[7],a[1]*b[4]+a[5]*b[5]+a[9]*b[6]+a[13]*b[7],a[2]*b[4]+a[6]*b[5]+a[10]*b[6]+a[14]*b[7],a[3]*b[4]+a[7]*b[5]+a[11]*b[6]+a[15]*b[7],a[0]*b[8]+a[4]*b[9]+a[8]*b[10]+a[12]*b[11],a[1]*b[8]+a[5]*b[9]+a[9]*b[10]+a[13]*b[11],a[2]*b[8]+a[6]*b[9]+a[10]*b[10]+a[14]*b[11],a[3]*b[8]+a[7]*b[9]+a[11]*b[10]+a[15]*b[11],a[0]*b[12]+a[4]*b[13]+a[8]*b[14]+a[12]*b[15],a[1]*b[12]+a[5]*b[13]+a[9]*b[14]+a[13]*b[15],a[2]*b[12]+a[6]*b[13]+a[10]*b[14]+a[14]*b[15],a[3]*b[12]+a[7]*b[13]+a[11]*b[14]+a[15]*b[15]]}function e(a){var b=a.rad||0;return((a.deg||0)/360+(a.grad||0)/400+(a.turn||0))*(2*Math.PI)+b}function f(a){switch(a.t){case"rotatex":var b=e(a.d[0]);return[1,0,0,0,0,Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1];case"rotatey":var b=e(a.d[0]);return[Math.cos(b),0,-Math.sin(b),0,0,1,0,0,Math.sin(b),0,Math.cos(b),0,0,0,0,1];case"rotate":case"rotatez":var b=e(a.d[0]);return[Math.cos(b),Math.sin(b),0,0,-Math.sin(b),Math.cos(b),0,0,0,0,1,0,0,0,0,1];case"rotate3d":var c=a.d[0],d=a.d[1],f=a.d[2],b=e(a.d[3]),g=c*c+d*d+f*f;if(0===g)c=1,d=0,f=0;else if(1!==g){var h=Math.sqrt(g);c/=h,d/=h,f/=h}var i=Math.sin(b/2),j=i*Math.cos(b/2),k=i*i;return[1-2*(d*d+f*f)*k,2*(c*d*k+f*j),2*(c*f*k-d*j),0,2*(c*d*k-f*j),1-2*(c*c+f*f)*k,2*(d*f*k+c*j),0,2*(c*f*k+d*j),2*(d*f*k-c*j),1-2*(c*c+d*d)*k,0,0,0,0,1];case"scale":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,1,0,0,0,0,1];case"scalex":return[a.d[0],0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"scaley":return[1,0,0,0,0,a.d[0],0,0,0,0,1,0,0,0,0,1];case"scalez":return[1,0,0,0,0,1,0,0,0,0,a.d[0],0,0,0,0,1];case"scale3d":return[a.d[0],0,0,0,0,a.d[1],0,0,0,0,a.d[2],0,0,0,0,1];case"skew":var l=e(a.d[0]),m=e(a.d[1]);return[1,Math.tan(m),0,0,Math.tan(l),1,0,0,0,0,1,0,0,0,0,1];case"skewx":var b=e(a.d[0]);return[1,0,0,0,Math.tan(b),1,0,0,0,0,1,0,0,0,0,1];case"skewy":var b=e(a.d[0]);return[1,Math.tan(b),0,0,0,1,0,0,0,0,1,0,0,0,0,1];case"translate":var c=a.d[0].px||0,d=a.d[1].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,0,1];case"translatex":var c=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,0,0,1];case"translatey":var d=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,d,0,1];case"translatez":var f=a.d[0].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,f,1];case"translate3d":var c=a.d[0].px||0,d=a.d[1].px||0,f=a.d[2].px||0;return[1,0,0,0,0,1,0,0,0,0,1,0,c,d,f,1];case"perspective":return[1,0,0,0,0,1,0,0,0,0,1,a.d[0].px?-1/a.d[0].px:0,0,0,0,1];case"matrix":return[a.d[0],a.d[1],0,0,a.d[2],a.d[3],0,0,0,0,1,0,a.d[4],a.d[5],0,1];case"matrix3d":return a.d}}function g(a){return 0===a.length?[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]:a.map(f).reduce(d)}function h(a){return[i(g(a))]}var i=function(){function a(a){return a[0][0]*a[1][1]*a[2][2]+a[1][0]*a[2][1]*a[0][2]+a[2][0]*a[0][1]*a[1][2]-a[0][2]*a[1][1]*a[2][0]-a[1][2]*a[2][1]*a[0][0]-a[2][2]*a[0][1]*a[1][0]}function b(b){for(var c=1/a(b),d=b[0][0],e=b[0][1],f=b[0][2],g=b[1][0],h=b[1][1],i=b[1][2],j=b[2][0],k=b[2][1],l=b[2][2],m=[[(h*l-i*k)*c,(f*k-e*l)*c,(e*i-f*h)*c,0],[(i*j-g*l)*c,(d*l-f*j)*c,(f*g-d*i)*c,0],[(g*k-h*j)*c,(j*e-d*k)*c,(d*h-e*g)*c,0]],n=[],o=0;o<3;o++){for(var p=0,q=0;q<3;q++)p+=b[3][q]*m[q][o];n.push(p)}return n.push(1),m.push(n),m}function d(a){return[[a[0][0],a[1][0],a[2][0],a[3][0]],[a[0][1],a[1][1],a[2][1],a[3][1]],[a[0][2],a[1][2],a[2][2],a[3][2]],[a[0][3],a[1][3],a[2][3],a[3][3]]]}function e(a,b){for(var c=[],d=0;d<4;d++){for(var e=0,f=0;f<4;f++)e+=a[f]*b[f][d];c.push(e)}return c}function f(a){var b=g(a);return[a[0]/b,a[1]/b,a[2]/b]}function g(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])}function h(a,b,c,d){return[c*a[0]+d*b[0],c*a[1]+d*b[1],c*a[2]+d*b[2]]}function i(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function j(j){var k=[j.slice(0,4),j.slice(4,8),j.slice(8,12),j.slice(12,16)];if(1!==k[3][3])return null;for(var l=[],m=0;m<4;m++)l.push(k[m].slice());for(var m=0;m<3;m++)l[m][3]=0;if(0===a(l))return null;var n,o=[];k[0][3]||k[1][3]||k[2][3]?(o.push(k[0][3]),o.push(k[1][3]),o.push(k[2][3]),o.push(k[3][3]),n=e(o,d(b(l)))):n=[0,0,0,1];var p=k[3].slice(0,3),q=[];q.push(k[0].slice(0,3));var r=[];r.push(g(q[0])),q[0]=f(q[0]);var s=[];q.push(k[1].slice(0,3)),s.push(c(q[0],q[1])),q[1]=h(q[1],q[0],1,-s[0]),r.push(g(q[1])),q[1]=f(q[1]),s[0]/=r[1],q.push(k[2].slice(0,3)),s.push(c(q[0],q[2])),q[2]=h(q[2],q[0],1,-s[1]),s.push(c(q[1],q[2])),q[2]=h(q[2],q[1],1,-s[2]),r.push(g(q[2])),q[2]=f(q[2]),s[1]/=r[2],s[2]/=r[2];var t=i(q[1],q[2]);if(c(q[0],t)<0)for(var m=0;m<3;m++)r[m]*=-1,q[m][0]*=-1,q[m][1]*=-1,q[m][2]*=-1;var u,v,w=q[0][0]+q[1][1]+q[2][2]+1;return w>1e-4?(u=.5/Math.sqrt(w),v=[(q[2][1]-q[1][2])*u,(q[0][2]-q[2][0])*u,(q[1][0]-q[0][1])*u,.25/u]):q[0][0]>q[1][1]&&q[0][0]>q[2][2]?(u=2*Math.sqrt(1+q[0][0]-q[1][1]-q[2][2]),v=[.25*u,(q[0][1]+q[1][0])/u,(q[0][2]+q[2][0])/u,(q[2][1]-q[1][2])/u]):q[1][1]>q[2][2]?(u=2*Math.sqrt(1+q[1][1]-q[0][0]-q[2][2]),v=[(q[0][1]+q[1][0])/u,.25*u,(q[1][2]+q[2][1])/u,(q[0][2]-q[2][0])/u]):(u=2*Math.sqrt(1+q[2][2]-q[0][0]-q[1][1]),v=[(q[0][2]+q[2][0])/u,(q[1][2]+q[2][1])/u,.25*u,(q[1][0]-q[0][1])/u]),[p,r,s,v,n]}return j}();a.dot=c,a.makeMatrixDecomposition=h,a.transformListToMatrix=g}(d),function(a){function b(a,b){var c=a.exec(b);if(c)return c=a.ignoreCase?c[0].toLowerCase():c[0],[c,b.substr(c.length)]}function c(a,b){b=b.replace(/^\s*/,"");var c=a(b);if(c)return[c[0],c[1].replace(/^\s*/,"")]}function d(a,d,e){a=c.bind(null,a);for(var f=[];;){var g=a(e);if(!g)return[f,e];if(f.push(g[0]),e=g[1],!(g=b(d,e))||""==g[1])return[f,e];e=g[1]}}function e(a,b){for(var c=0,d=0;d<b.length&&(!/\s|,/.test(b[d])||0!=c);d++)if("("==b[d])c++;else if(")"==b[d]&&(c--,0==c&&d++,c<=0))break;var e=a(b.substr(0,d));return void 0==e?void 0:[e,b.substr(d)]}function f(a,b){for(var c=a,d=b;c&&d;)c>d?c%=d:d%=c;return c=a*b/(c+d)}function g(a){return function(b){var c=a(b);return c&&(c[0]=void 0),c}}function h(a,b){return function(c){return a(c)||[b,c]}}function i(b,c){for(var d=[],e=0;e<b.length;e++){var f=a.consumeTrimmed(b[e],c);if(!f||""==f[0])return;void 0!==f[0]&&d.push(f[0]),c=f[1]}if(""==c)return d}function j(a,b,c,d,e){for(var g=[],h=[],i=[],j=f(d.length,e.length),k=0;k<j;k++){var l=b(d[k%d.length],e[k%e.length]);if(!l)return;g.push(l[0]),h.push(l[1]),i.push(l[2])}return[g,h,function(b){var d=b.map(function(a,b){return i[b](a)}).join(c);return a?a(d):d}]}function k(a,b,c){for(var d=[],e=[],f=[],g=0,h=0;h<c.length;h++)if("function"==typeof c[h]){var i=c[h](a[g],b[g++]);d.push(i[0]),e.push(i[1]),f.push(i[2])}else!function(a){d.push(!1),e.push(!1),f.push(function(){return c[a]})}(h);return[d,e,function(a){for(var b="",c=0;c<a.length;c++)b+=f[c](a[c]);return b}]}a.consumeToken=b,a.consumeTrimmed=c,a.consumeRepeated=d,a.consumeParenthesised=e,a.ignore=g,a.optional=h,a.consumeList=i,a.mergeNestedRepeated=j.bind(null,null),a.mergeWrappedNestedRepeated=j,a.mergeList=k}(d),function(a){function b(b){function c(b){var c=a.consumeToken(/^inset/i,b);if(c)return d.inset=!0,c;var c=a.consumeLengthOrPercent(b);if(c)return d.lengths.push(c[0]),c;var c=a.consumeColor(b);return c?(d.color=c[0],c):void 0}var d={inset:!1,lengths:[],color:null},e=a.consumeRepeated(c,/^/,b);if(e&&e[0].length)return[d,e[1]]}function c(c){var d=a.consumeRepeated(b,/^,/,c);if(d&&""==d[1])return d[0]}function d(b,c){for(;b.lengths.length<Math.max(b.lengths.length,c.lengths.length);)b.lengths.push({px:0});for(;c.lengths.length<Math.max(b.lengths.length,c.lengths.length);)c.lengths.push({px:0});if(b.inset==c.inset&&!!b.color==!!c.color){for(var d,e=[],f=[[],0],g=[[],0],h=0;h<b.lengths.length;h++){var i=a.mergeDimensions(b.lengths[h],c.lengths[h],2==h);f[0].push(i[0]),g[0].push(i[1]),e.push(i[2])}if(b.color&&c.color){var j=a.mergeColors(b.color,c.color);f[1]=j[0],g[1]=j[1],d=j[2]}return[f,g,function(a){for(var c=b.inset?"inset ":" ",f=0;f<e.length;f++)c+=e[f](a[0][f])+" ";return d&&(c+=d(a[1])),c}]}}function e(b,c,d,e){function f(a){return{inset:a,color:[0,0,0,0],lengths:[{px:0},{px:0},{px:0},{px:0}]}}for(var g=[],h=[],i=0;i<d.length||i<e.length;i++){var j=d[i]||f(e[i].inset),k=e[i]||f(d[i].inset);g.push(j),h.push(k)}return a.mergeNestedRepeated(b,c,g,h)}var f=e.bind(null,d,", ");a.addPropertiesHandler(c,f,["box-shadow","text-shadow"])}(d),function(a,b){function c(a){return a.toFixed(3).replace(/0+$/,"").replace(/\.$/,"")}function d(a,b,c){return Math.min(b,Math.max(a,c))}function e(a){if(/^\s*[-+]?(\d*\.)?\d+\s*$/.test(a))return Number(a)}function f(a,b){return[a,b,c]}function g(a,b){if(0!=a)return i(0,1/0)(a,b)}function h(a,b){return[a,b,function(a){return Math.round(d(1,1/0,a))}]}function i(a,b){return function(e,f){return[e,f,function(e){return c(d(a,b,e))}]}}function j(a){var b=a.trim().split(/\s*[\s,]\s*/);if(0!==b.length){for(var c=[],d=0;d<b.length;d++){var f=e(b[d]);if(void 0===f)return;c.push(f)}return c}}function k(a,b){if(a.length==b.length)return[a,b,function(a){return a.map(c).join(" ")}]}function l(a,b){return[a,b,Math.round]}a.clamp=d,a.addPropertiesHandler(j,k,["stroke-dasharray"]),a.addPropertiesHandler(e,i(0,1/0),["border-image-width","line-height"]),a.addPropertiesHandler(e,i(0,1),["opacity","shape-image-threshold"]),a.addPropertiesHandler(e,g,["flex-grow","flex-shrink"]),a.addPropertiesHandler(e,h,["orphans","widows"]),a.addPropertiesHandler(e,l,["z-index"]),a.parseNumber=e,a.parseNumberList=j,a.mergeNumbers=f,a.numberToString=c}(d),function(a,b){function c(a,b){if("visible"==a||"visible"==b)return[0,1,function(c){return c<=0?a:c>=1?b:"visible"}]}a.addPropertiesHandler(String,c,["visibility"])}(d),function(a,b){function c(a){a=a.trim(),f.fillStyle="#000",f.fillStyle=a;var b=f.fillStyle;if(f.fillStyle="#fff",f.fillStyle=a,b==f.fillStyle){f.fillRect(0,0,1,1);var c=f.getImageData(0,0,1,1).data;f.clearRect(0,0,1,1);var d=c[3]/255;return[c[0]*d,c[1]*d,c[2]*d,d]}}function d(b,c){return[b,c,function(b){function c(a){return Math.max(0,Math.min(255,a))}if(b[3])for(var d=0;d<3;d++)b[d]=Math.round(c(b[d]/b[3]));return b[3]=a.numberToString(a.clamp(0,1,b[3])),"rgba("+b.join(",")+")"}]}var e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");e.width=e.height=1;var f=e.getContext("2d");a.addPropertiesHandler(c,d,["background-color","border-bottom-color","border-left-color","border-right-color","border-top-color","color","fill","flood-color","lighting-color","outline-color","stop-color","stroke","text-decoration-color"]),a.consumeColor=a.consumeParenthesised.bind(null,c),a.mergeColors=d}(d),function(a,b){function c(a){function b(){var b=h.exec(a);g=b?b[0]:void 0}function c(){var a=Number(g);return b(),a}function d(){if("("!==g)return c();b();var a=f();return")"!==g?NaN:(b(),a)}function e(){for(var a=d();"*"===g||"/"===g;){var c=g;b();var e=d();"*"===c?a*=e:a/=e}return a}function f(){for(var a=e();"+"===g||"-"===g;){var c=g;b();var d=e();"+"===c?a+=d:a-=d}return a}var g,h=/([\+\-\w\.]+|[\(\)\*\/])/g;return b(),f()}function d(a,b){if("0"==(b=b.trim().toLowerCase())&&"px".search(a)>=0)return{px:0};if(/^[^(]*$|^calc/.test(b)){b=b.replace(/calc\(/g,"(");var d={};b=b.replace(a,function(a){return d[a]=null,"U"+a});for(var e="U("+a.source+")",f=b.replace(/[-+]?(\d*\.)?\d+([Ee][-+]?\d+)?/g,"N").replace(new RegExp("N"+e,"g"),"D").replace(/\s[+-]\s/g,"O").replace(/\s/g,""),g=[/N\*(D)/g,/(N|D)[*\/]N/g,/(N|D)O\1/g,/\((N|D)\)/g],h=0;h<g.length;)g[h].test(f)?(f=f.replace(g[h],"$1"),h=0):h++;if("D"==f){for(var i in d){var j=c(b.replace(new RegExp("U"+i,"g"),"").replace(new RegExp(e,"g"),"*0"));if(!isFinite(j))return;d[i]=j}return d}}}function e(a,b){return f(a,b,!0)}function f(b,c,d){var e,f=[];for(e in b)f.push(e);for(e in c)f.indexOf(e)<0&&f.push(e);return b=f.map(function(a){return b[a]||0}),c=f.map(function(a){return c[a]||0}),[b,c,function(b){var c=b.map(function(c,e){return 1==b.length&&d&&(c=Math.max(c,0)),a.numberToString(c)+f[e]}).join(" + ");return b.length>1?"calc("+c+")":c}]}var g="px|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc",h=d.bind(null,new RegExp(g,"g")),i=d.bind(null,new RegExp(g+"|%","g")),j=d.bind(null,/deg|rad|grad|turn/g);a.parseLength=h,a.parseLengthOrPercent=i,a.consumeLengthOrPercent=a.consumeParenthesised.bind(null,i),a.parseAngle=j,a.mergeDimensions=f;var k=a.consumeParenthesised.bind(null,h),l=a.consumeRepeated.bind(void 0,k,/^/),m=a.consumeRepeated.bind(void 0,l,/^,/);a.consumeSizePairList=m;var n=function(a){var b=m(a);if(b&&""==b[1])return b[0]},o=a.mergeNestedRepeated.bind(void 0,e," "),p=a.mergeNestedRepeated.bind(void 0,o,",");a.mergeNonNegativeSizePair=o,a.addPropertiesHandler(n,p,["background-size"]),a.addPropertiesHandler(i,e,["border-bottom-width","border-image-width","border-left-width","border-right-width","border-top-width","flex-basis","font-size","height","line-height","max-height","max-width","outline-width","width"]),a.addPropertiesHandler(i,f,["border-bottom-left-radius","border-bottom-right-radius","border-top-left-radius","border-top-right-radius","bottom","left","letter-spacing","margin-bottom","margin-left","margin-right","margin-top","min-height","min-width","outline-offset","padding-bottom","padding-left","padding-right","padding-top","perspective","right","shape-margin","stroke-dashoffset","text-indent","top","vertical-align","word-spacing"])}(d),function(a,b){function c(b){return a.consumeLengthOrPercent(b)||a.consumeToken(/^auto/,b)}function d(b){var d=a.consumeList([a.ignore(a.consumeToken.bind(null,/^rect/)),a.ignore(a.consumeToken.bind(null,/^\(/)),a.consumeRepeated.bind(null,c,/^,/),a.ignore(a.consumeToken.bind(null,/^\)/))],b);if(d&&4==d[0].length)return d[0]}function e(b,c){return"auto"==b||"auto"==c?[!0,!1,function(d){var e=d?b:c;if("auto"==e)return"auto";var f=a.mergeDimensions(e,e);return f[2](f[0])}]:a.mergeDimensions(b,c)}function f(a){return"rect("+a+")"}var g=a.mergeWrappedNestedRepeated.bind(null,f,e,", ");a.parseBox=d,a.mergeBoxes=g,a.addPropertiesHandler(d,g,["clip"])}(d),function(a,b){function c(a){return function(b){var c=0;return a.map(function(a){return a===k?b[c++]:a})}}function d(a){return a}function e(b){if("none"==(b=b.toLowerCase().trim()))return[];for(var c,d=/\s*(\w+)\(([^)]*)\)/g,e=[],f=0;c=d.exec(b);){if(c.index!=f)return;f=c.index+c[0].length;var g=c[1],h=n[g];if(!h)return;var i=c[2].split(","),j=h[0];if(j.length<i.length)return;for(var k=[],o=0;o<j.length;o++){var p,q=i[o],r=j[o];if(void 0===(p=q?{A:function(b){return"0"==b.trim()?m:a.parseAngle(b)},N:a.parseNumber,T:a.parseLengthOrPercent,L:a.parseLength}[r.toUpperCase()](q):{a:m,n:k[0],t:l}[r]))return;k.push(p)}if(e.push({t:g,d:k}),d.lastIndex==b.length)return e}}function f(a){return a.toFixed(6).replace(".000000","")}function g(b,c){if(b.decompositionPair!==c){b.decompositionPair=c;var d=a.makeMatrixDecomposition(b)}if(c.decompositionPair!==b){c.decompositionPair=b;var e=a.makeMatrixDecomposition(c)}return null==d[0]||null==e[0]?[[!1],[!0],function(a){return a?c[0].d:b[0].d}]:(d[0].push(0),e[0].push(1),[d,e,function(b){var c=a.quat(d[0][3],e[0][3],b[5]);return a.composeMatrix(b[0],b[1],b[2],c,b[4]).map(f).join(",")}])}function h(a){return a.replace(/[xy]/,"")}function i(a){return a.replace(/(x|y|z|3d)?$/,"3d")}function j(b,c){var d=a.makeMatrixDecomposition&&!0,e=!1;if(!b.length||!c.length){b.length||(e=!0,b=c,c=[]);for(var f=0;f<b.length;f++){var j=b[f].t,k=b[f].d,l="scale"==j.substr(0,5)?1:0;c.push({t:j,d:k.map(function(a){if("number"==typeof a)return l;var b={};for(var c in a)b[c]=l;return b})})}}var m=function(a,b){return"perspective"==a&&"perspective"==b||("matrix"==a||"matrix3d"==a)&&("matrix"==b||"matrix3d"==b)},o=[],p=[],q=[];if(b.length!=c.length){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]]}else for(var f=0;f<b.length;f++){var j,s=b[f].t,t=c[f].t,u=b[f].d,v=c[f].d,w=n[s],x=n[t];if(m(s,t)){if(!d)return;var r=g([b[f]],[c[f]]);o.push(r[0]),p.push(r[1]),q.push(["matrix",[r[2]]])}else{if(s==t)j=s;else if(w[2]&&x[2]&&h(s)==h(t))j=h(s),u=w[2](u),v=x[2](v);else{if(!w[1]||!x[1]||i(s)!=i(t)){if(!d)return;var r=g(b,c);o=[r[0]],p=[r[1]],q=[["matrix",[r[2]]]];break}j=i(s),u=w[1](u),v=x[1](v)}for(var y=[],z=[],A=[],B=0;B<u.length;B++){var C="number"==typeof u[B]?a.mergeNumbers:a.mergeDimensions,r=C(u[B],v[B]);y[B]=r[0],z[B]=r[1],A.push(r[2])}o.push(y),p.push(z),q.push([j,A])}}if(e){var D=o;o=p,p=D}return[o,p,function(a){return a.map(function(a,b){var c=a.map(function(a,c){return q[b][1][c](a)}).join(",");return"matrix"==q[b][0]&&16==c.split(",").length&&(q[b][0]="matrix3d"),q[b][0]+"("+c+")"}).join(" ")}]}var k=null,l={px:0},m={deg:0},n={matrix:["NNNNNN",[k,k,0,0,k,k,0,0,0,0,1,0,k,k,0,1],d],matrix3d:["NNNNNNNNNNNNNNNN",d],rotate:["A"],rotatex:["A"],rotatey:["A"],rotatez:["A"],rotate3d:["NNNA"],perspective:["L"],scale:["Nn",c([k,k,1]),d],scalex:["N",c([k,1,1]),c([k,1])],scaley:["N",c([1,k,1]),c([1,k])],scalez:["N",c([1,1,k])],scale3d:["NNN",d],skew:["Aa",null,d],skewx:["A",null,c([k,m])],skewy:["A",null,c([m,k])],translate:["Tt",c([k,k,l]),d],translatex:["T",c([k,l,l]),c([k,l])],translatey:["T",c([l,k,l]),c([l,k])],translatez:["L",c([l,l,k])],translate3d:["TTL",d]};a.addPropertiesHandler(e,j,["transform"]),a.transformToSvgMatrix=function(b){var c=a.transformListToMatrix(e(b));return"matrix("+f(c[0])+" "+f(c[1])+" "+f(c[4])+" "+f(c[5])+" "+f(c[12])+" "+f(c[13])+")"}}(d),function(a){function b(a){var b=Number(a);if(!(isNaN(b)||b<100||b>900||b%100!=0))return b}function c(b){return b=100*Math.round(b/100),b=a.clamp(100,900,b),400===b?"normal":700===b?"bold":String(b)}function d(a,b){return[a,b,c]}a.addPropertiesHandler(b,d,["font-weight"])}(d),function(a){function b(a){var b={};for(var c in a)b[c]=-a[c];return b}function c(b){return a.consumeToken(/^(left|center|right|top|bottom)\b/i,b)||a.consumeLengthOrPercent(b)}function d(b,d){var e=a.consumeRepeated(c,/^/,d);if(e&&""==e[1]){var f=e[0];if(f[0]=f[0]||"center",f[1]=f[1]||"center",3==b&&(f[2]=f[2]||{px:0}),f.length==b){if(/top|bottom/.test(f[0])||/left|right/.test(f[1])){var h=f[0];f[0]=f[1],f[1]=h}if(/left|right|center|Object/.test(f[0])&&/top|bottom|center|Object/.test(f[1]))return f.map(function(a){return"object"==typeof a?a:g[a]})}}}function e(d){var e=a.consumeRepeated(c,/^/,d);if(e){for(var f=e[0],h=[{"%":50},{"%":50}],i=0,j=!1,k=0;k<f.length;k++){var l=f[k];"string"==typeof l?(j=/bottom|right/.test(l),i={left:0,right:0,center:i,top:1,bottom:1}[l],h[i]=g[l],"center"==l&&i++):(j&&(l=b(l),l["%"]=(l["%"]||0)+100),h[i]=l,i++,j=!1)}return[h,e[1]]}}function f(b){var c=a.consumeRepeated(e,/^,/,b);if(c&&""==c[1])return c[0]}var g={left:{"%":0},center:{"%":50},right:{"%":100},top:{"%":0},bottom:{"%":100}},h=a.mergeNestedRepeated.bind(null,a.mergeDimensions," ");a.addPropertiesHandler(d.bind(null,3),h,["transform-origin"]),a.addPropertiesHandler(d.bind(null,2),h,["perspective-origin"]),a.consumePosition=e,a.mergeOffsetList=h;var i=a.mergeNestedRepeated.bind(null,h,", ");a.addPropertiesHandler(f,i,["background-position","object-position"])}(d),function(a){function b(b){var c=a.consumeToken(/^circle/,b);if(c&&c[0])return["circle"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),d,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],c[1]));var f=a.consumeToken(/^ellipse/,b);if(f&&f[0])return["ellipse"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),e,a.ignore(a.consumeToken.bind(void 0,/^at/)),a.consumePosition,a.ignore(a.consumeToken.bind(void 0,/^\)/))],f[1]));var g=a.consumeToken(/^polygon/,b);return g&&g[0]?["polygon"].concat(a.consumeList([a.ignore(a.consumeToken.bind(void 0,/^\(/)),a.optional(a.consumeToken.bind(void 0,/^nonzero\s*,|^evenodd\s*,/),"nonzero,"),a.consumeSizePairList,a.ignore(a.consumeToken.bind(void 0,/^\)/))],g[1])):void 0}function c(b,c){if(b[0]===c[0])return"circle"==b[0]?a.mergeList(b.slice(1),c.slice(1),["circle(",a.mergeDimensions," at ",a.mergeOffsetList,")"]):"ellipse"==b[0]?a.mergeList(b.slice(1),c.slice(1),["ellipse(",a.mergeNonNegativeSizePair," at ",a.mergeOffsetList,")"]):"polygon"==b[0]&&b[1]==c[1]?a.mergeList(b.slice(2),c.slice(2),["polygon(",b[1],g,")"]):void 0}var d=a.consumeParenthesised.bind(null,a.parseLengthOrPercent),e=a.consumeRepeated.bind(void 0,d,/^/),f=a.mergeNestedRepeated.bind(void 0,a.mergeDimensions," "),g=a.mergeNestedRepeated.bind(void 0,f,",");a.addPropertiesHandler(b,c,["shape-outside"])}(d),function(a,b){function c(a,b){b.concat([a]).forEach(function(b){b in document.documentElement.style&&(d[a]=b),e[b]=a})}var d={},e={};c("transform",["webkitTransform","msTransform"]),c("transformOrigin",["webkitTransformOrigin"]),c("perspective",["webkitPerspective"]),c("perspectiveOrigin",["webkitPerspectiveOrigin"]),a.propertyName=function(a){return d[a]||a},a.unprefixedPropertyName=function(a){return e[a]||a}}(d)}(),function(){if(void 0===document.createElement("div").animate([]).oncancel){var a;if(window.performance&&performance.now)var a=function(){return performance.now()};else var a=function(){return Date.now()};var b=function(a,b,c){this.target=a,this.currentTime=b,this.timelineTime=c,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=a,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},c=window.Element.prototype.animate;window.Element.prototype.animate=function(d,e){var f=c.call(this,d,e);f._cancelHandlers=[],f.oncancel=null;var g=f.cancel;f.cancel=function(){g.call(this);var c=new b(this,null,a()),d=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){d.forEach(function(a){a.call(c.target,c)})},0)};var h=f.addEventListener;f.addEventListener=function(a,b){"function"==typeof b&&"cancel"==a?this._cancelHandlers.push(b):h.call(this,a,b)};var i=f.removeEventListener;return f.removeEventListener=function(a,b){if("cancel"==a){var c=this._cancelHandlers.indexOf(b);c>=0&&this._cancelHandlers.splice(c,1)}else i.call(this,a,b)},f}}}(),function(a){var b=document.documentElement,c=null,d=!1;try{var e=getComputedStyle(b).getPropertyValue("opacity"),f="0"==e?"1":"0";c=b.animate({opacity:[f,f]},{duration:1}),c.currentTime=0,d=getComputedStyle(b).getPropertyValue("opacity")==f}catch(a){}finally{c&&c.cancel()}if(!d){var g=window.Element.prototype.animate;window.Element.prototype.animate=function(b,c){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&b[Symbol.iterator]&&(b=Array.from(b)),Array.isArray(b)||null===b||(b=a.convertToArrayForm(b)),g.call(this,b,c)}}}(c),b.true=a}({},function(){return this}());
-//# sourceMappingURL=web-animations.min.js.map
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.js.map b/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.js.map
deleted file mode 100644
index c78ace0..0000000
--- a/systrace/catapult/third_party/polymer/components/web-animations-js/web-animations.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["src/scope.js","src/timing-utilities.js","src/normalize-keyframes.js","src/deprecation.js","src/web-animations-bonus-cancel-events.js","src/web-animations-bonus-object-form-keyframes.js"],"names":["webAnimationsShared","webAnimations1","shared","testing","cloneTimingInput","timingInput","clone","m","AnimationEffectTiming","this","_delay","_endDelay","_fill","_iterationStart","_iterations","_duration","_playbackRate","_direction","_easing","_easingFunction","linear","isInvalidTimingDeprecated","isDeprecated","makeTiming","forGroup","effect","timing","fill","duration","isNaN","Object","getOwnPropertyNames","forEach","property","fills","indexOf","directions","numericTimingToObject","normalizeTimingInput","cubic","a","b","c","d","x","f","start_gradient","end_gradient","start","end","mid","xEst","Math","abs","step","count","pos","stepSize","normalizeEasing","easing","styleForCleaning","document","createElement","style","animationTimingFunction","normalizedEasing","TypeError","parseEasingFunction","cubicData","cubicBezierRe","exec","apply","slice","map","Number","stepData","stepRe","Start","middle","Middle","End","presets","calculateActiveDuration","repeatedDuration","playbackRate","iterations","calculatePhase","activeDuration","localTime","PhaseNone","endTime","delay","endDelay","min","PhaseBefore","PhaseAfter","PhaseActive","calculateActiveTime","fillMode","phase","calculateOverallProgress","iterationDuration","activeTime","iterationStart","overallProgress","calculateSimpleIterationProgress","simpleIterationProgress","Infinity","calculateCurrentIteration","floor","calculateDirectedProgress","playbackDirection","currentIteration","currentDirection","calculateIterationProgress","directedProgress","direction","split","prototype","_setMember","member","value","_effect","_timingInput","_timing","_animation","_rebuildUnderlyingAnimation","ease","ease-in","ease-out","ease-in-out","step-start","step-middle","step-end","numberString","RegExp","antiAlias","aliases","isNotAnimatable","lastIndexOf","expandShorthandAndAntiAlias","result","longProperties","shorthandToLonghand","shorthandExpanderElem","i","longProperty","longhandValue","convertToArrayForm","effectInput","normalizedEffectInput","values","Array","isArray","keyframe","numKeyframes","length","offset","composite","push","sort","normalizeKeyframes","spaceKeyframes","keyframes","previousIndex","previousOffset","j","window","Symbol","iterator","from","originalKeyframe","memberValue","isFinite","type","DOMException","NOT_SUPPORTED_ERR","name","message","everyFrameHasOffset","filter","background","border","borderBottom","borderColor","borderLeft","borderRadius","borderRight","borderTop","borderWidth","flex","font","margin","outline","padding","createElementNS","borderWidthAliases","thin","medium","thick","borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopWidth","fontSize","xx-small","x-small","small","large","x-large","xx-large","fontWeight","normal","bold","outlineWidth","textShadow","none","boxShadow","silenced","feature","date","advice","plural","auxVerb","today","Date","expiry","setMonth","getMonth","console","warn","toDateString","deprecated","Error","animate","oncancel","now","performance","AnimationCancelEvent","target","currentTime","timelineTime","bubbles","cancelable","currentTarget","defaultPrevented","eventPhase","Event","AT_TARGET","timeStamp","originalElementAnimate","Element","options","animation","call","_cancelHandlers","originalCancel","cancel","event","handlers","concat","setTimeout","handler","originalAddEventListener","addEventListener","originalRemoveEventListener","removeEventListener","index","splice","element","documentElement","animated","originalOpacity","getComputedStyle","getPropertyValue","testOpacity","opacity","error","webAnimationsNext","exports","webAnimationsTesting"],"mappings":";;;;;;;;;;;;;;CAcA,SAAIA,EAAAA,GAAJ,GAAIA,MACAC,MCDJ,SAAUC,EAAQC,GAMhB,QAASC,GAAiBC,GACxB,GAA0B,gBAAfA,GACT,MAAOA,EAET,IAAIC,KACJ,KAAK,GAAIC,KAAKF,GACZC,EAAMC,GAAKF,EAAYE,EAEzB,OAAOD,GAGT,QAASE,KACPC,KAAKC,OAAS,EACdD,KAAKE,UAAY,EACjBF,KAAKG,MAAQ,OACbH,KAAKI,gBAAkB,EACvBJ,KAAKK,YAAc,EACnBL,KAAKM,UAAY,EACjBN,KAAKO,cAAgB,EACrBP,KAAKQ,WAAa,SAClBR,KAAKS,QAAU,SACfT,KAAKU,gBAAkBC,EAGzB,QAASC,KACP,MAAOnB,GAAOoB,aAAa,wBAAyB,aAAc,gDAAA,GA8EpE,QAASC,GAAWlB,EAAamB,EAAUC,GACzC,GAAIC,GAAS,GAAIlB,EA4BjB,OA3BIgB,KACFE,EAAOC,KAAO,OACdD,EAAOE,SAAW,QAEM,gBAAfvB,IAA4BwB,MAAMxB,OAAAA,KAElCA,GACTyB,OAAOC,oBAAoB1B,GAAa2B,QAAQ,SAASC,GACvD,GAA6B,QAAzB5B,EAAY4B,GAAqB,CACnC,IAA+B,gBAApBP,GAAOO,IAAqC,YAAZA,KACL,gBAAzB5B,GAAY4B,IAAyBJ,MAAMxB,EAAY4B,KAChE,MAGJ,IAAiB,QAAZA,IAAiE,GAAzCC,EAAMC,QAAQ9B,EAAY4B,IACrD,MAEF,IAAiB,aAAZA,IAA2E,GAA9CG,EAAWD,QAAQ9B,EAAY4B,IAC/D,MAEF,IAAgB,gBAAZA,GAAwD,IAA1B5B,EAAY4B,IAAmB/B,EAAOoB,aAAa,qCAAsC,aAAc,uCACvI,MAEFI,GAAOO,GAAY5B,EAAY4B,MAlBnCP,EAAOE,SAAWvB,EAsBbqB,EAGT,QAASW,GAAsBhC,GAQ7B,MAP0B,gBAAfA,KAEPA,EADEwB,MAAMxB,IACQuB,SAAU,IAEVA,SAAUvB,IAGvBA,EAGT,QAASiC,GAAqBjC,EAAamB,GAEzC,MADAnB,GAAcH,EAAOmC,sBAAsBhC,GACpCkB,EAAWlB,EAAamB,GAGjC,QAASe,GAAMC,EAAGC,EAAGC,EAAGC,GACtB,MAAIH,GAAI,GAAKA,EAAI,GAAKE,EAAI,GAAKA,EAAI,EAC1BtB,EAEF,SAASwB,GAqBZ,QAASC,GAAEL,EAAGC,EAAGlC,GAAK,MAAO,GAAIiC,GAAK,EAAIjC,IAAM,EAAIA,GAAKA,EAAI,EAAIkC,GAAK,EAAIlC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EApBjG,GAAIqC,GAAK,EAAG,CACV,GAAIE,GAAiB,CAKrB,OAJIN,GAAI,EACNM,EAAiBL,EAAID,GACbC,GAAKC,EAAI,IACjBI,EAAiBH,EAAID,GAChBI,EAAiBF,EAE1B,GAAIA,GAAK,EAAG,CACV,GAAIG,GAAe,CAKnB,OAJIL,GAAI,EACNK,GAAgBJ,EAAI,IAAMD,EAAI,GAClB,GAALA,GAAUF,EAAI,IACrBO,GAAgBN,EAAI,IAAMD,EAAI,IACzB,EAAIO,GAAgBH,EAAI,GAIjC,IADA,GAAII,GAAQ,EAAGC,EAAM,EACdD,EAAQC,GAAK,CAClB,GAAIC,IAAOF,EAAQC,GAAO,EAEtBE,EAAON,EAAEL,EAAGE,EAAGQ,EACnB,IAAIE,KAAKC,IAAIT,EAAIO,GAAQ,KACvB,MAAON,GAAEJ,EAAGE,EAAGO,EAEbC,GAAOP,EACTI,EAAQE,EAERD,EAAMC,EAGV,MAAOL,GAAEJ,EAAGE,EAAGO,IAQnB,QAASI,GAAKC,EAAOC,GACnB,MAAO,UAASZ,GACd,GAAIA,GAAK,EACP,MAAO,EAET,IAAIa,GAAW,EAAIF,CAEnB,QADAX,GAAKY,EAAMC,GACAb,EAAIa,GAmBnB,QAASC,GAAgBC,GAClBC,IACHA,EAAmBC,SAASC,cAAc,OAAOC,OAEnDH,EAAiBI,wBAA0B,GAC3CJ,EAAiBI,wBAA0BL,CAC3C,IAAIM,GAAmBL,EAAiBI,uBACxC,IAAwB,IAApBC,GAA0B5C,IAC5B,KAAM,IAAI6C,WAAUP,EAAS,mCAE/B,OAAOM,GAGT,QAASE,GAAoBF,GAC3B,GAAwB,UAApBA,EACF,MAAO7C,EAET,IAAIgD,GAAYC,EAAcC,KAAKL,EACnC,IAAIG,EACF,MAAO7B,GAAMgC,MAAM9D,KAAM2D,EAAUI,MAAM,GAAGC,IAAIC,QAElD,IAAIC,GAAWC,EAAON,KAAKL,EAC3B,OAAIU,GACKrB,EAAKoB,OAAOC,EAAS,KAAM3B,MAAS6B,EAAOC,OAAUC,EAAQ9B,IAAO+B,GAAKL,EAAS,KAE9EM,EAAQhB,IAMd7C,EAGT,QAAS8D,GAAwBxD,GAC/B,MAAO0B,MAAKC,IAAI8B,EAAiBzD,GAAUA,EAAO0D,cAGpD,QAASD,GAAiBzD,GAExB,MAAwB,KAApBA,EAAOE,UAAwC,IAAtBF,EAAO2D,WAC3B,EAEF3D,EAAOE,SAAWF,EAAO2D,WAQlC,QAASC,GAAeC,EAAgBC,EAAW9D,GAEjD,GAAiB,MAAb8D,EACF,MAAOC,EAGT,IAAIC,GAAUhE,EAAOiE,MAAQJ,EAAiB7D,EAAOkE,QACrD,OAAIJ,GAAYpC,KAAKyC,IAAInE,EAAOiE,MAAOD,GAC9BI,EAELN,GAAapC,KAAKyC,IAAInE,EAAOiE,MAAQJ,EAAgBG,GAChDK,EAGFC,EAGT,QAASC,GAAoBV,EAAgBW,EAAUV,EAAWW,EAAOR,GAEvE,OAAQQ,GACN,IAAKL,GACH,MAAgB,aAAZI,GAAuC,QAAZA,EACtB,EACF,IACT,KAAKF,GACH,MAAOR,GAAYG,CACrB,KAAKI,GACH,MAAgB,YAAZG,GAAsC,QAAZA,EACrBX,EACF,IACT,KAAKE,GACH,MAAO,OAIb,QAASW,GAAyBC,EAAmBF,EAAOd,EAAYiB,EAAYC,GAElF,GAAIC,GAAkBD,CAQtB,OAP0B,KAAtBF,EACEF,IAAUL,IACZU,GAAmBnB,GAGrBmB,GAAmBF,EAAaD,EAE3BG,EAGT,QAASC,GAAiCD,EAAiBD,EAAgBJ,EAAOd,EAAYiB,EAAYD,GAGxG,GAAIK,GAA2BF,IAAoBG,EAAAA,EAAYJ,EAAiB,EAAIC,EAAkB,CAKtG,OAJgC,KAA5BE,GAAiCP,IAAUJ,GAA6B,IAAfV,GACzC,IAAfiB,GAA0C,IAAtBD,IACvBK,EAA0B,GAErBA,EAGT,QAASE,GAA0BT,EAAOd,EAAYqB,EAAyBF,GAE7E,MAAIL,KAAUJ,GAAcV,IAAesB,EAAAA,EAClCA,EAAAA,EAEuB,IAA5BD,EACKtD,KAAKyD,MAAML,GAAmB,EAEhCpD,KAAKyD,MAAML,GAGpB,QAASM,GAA0BC,EAAmBC,EAAkBN,GAEtE,GAAIO,GAAmBF,CACvB,IAA0B,WAAtBA,GAAwD,YAAtBA,EAAiC,CACrE,GAAIpE,GAAIqE,CACkB,uBAAtBD,IACFpE,GAAK,GAEPsE,EAAmB,SACftE,IAAMgE,EAAAA,GAAYhE,EAAI,GAAM,IAC9BsE,EAAmB,WAGvB,MAAyB,WAArBA,EACKP,EAEF,EAAIA,EAGb,QAASQ,GAA2B3B,EAAgBC,EAAW9D,GAC7D,GAAIyE,GAAQb,EAAeC,EAAgBC,EAAW9D,GAClD4E,EAAaL,EAAoBV,EAAgB7D,EAAOC,KAAM6D,EAAWW,EAAOzE,EAAOiE,MAC3F,IAAmB,OAAfW,EACF,MAAO,KAET,IAAIE,GAAkBJ,EAAyB1E,EAAOE,SAAUuE,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAO6E,gBACzGG,EAA0BD,EAAiCD,EAAiB9E,EAAO6E,eAAgBJ,EAAOzE,EAAO2D,WAAYiB,EAAY5E,EAAOE,UAChJoF,EAAmBJ,EAA0BT,EAAOzE,EAAO2D,WAAYqB,EAAyBF,GAChGW,EAAmBL,EAA0BpF,EAAO0F,UAAWJ,EAAkBN,EAIrF,OAAOhF,GAAOP,gBAAgBgG,GA1XhC,GAAIjF,GAAQ,+BAA+BmF,MAAM,KAC7CjF,EAAa,sCAAsCiF,MAAM,KACzDjG,EAAS,SAASwB,GAAK,MAAOA,GA8BlCpC,GAAsB8G,WACpBC,WAAY,SAASC,EAAQC,GAC3BhH,KAAK,IAAM+G,GAAUC,EACjBhH,KAAKiH,UACPjH,KAAKiH,QAAQC,aAAaH,GAAUC,EACpChH,KAAKiH,QAAQE,QAAU1H,EAAOoC,qBAAqB7B,KAAKiH,QAAQC,cAChElH,KAAKiH,QAAQnC,eAAiBrF,EAAOgF,wBAAwBzE,KAAKiH,QAAQE,SACtEnH,KAAKiH,QAAQG,YACfpH,KAAKiH,QAAQG,WAAWC,gCAI9B1C,mBACE,MAAO3E,MAAKO,eAEd2E,UAAU8B,GACRhH,KAAK8G,WAAW,QAASE,IAE3B9B,YACE,MAAOlF,MAAKC,QAEdkF,aAAa6B,GACXhH,KAAK8G,WAAW,WAAYE,IAE9B7B,eACE,MAAOnF,MAAKE,WAEdgB,SAAS8F,GACPhH,KAAK8G,WAAW,OAAQE,IAE1B9F,WACE,MAAOlB,MAAKG,OAEd2F,mBAAmBkB,GACjB,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,2DAA6DxC,OAAO6E,eAE1F9F,MAAK8G,WAAW,iBAAkBE,IAEpClB,qBACE,MAAO9F,MAAKI,iBAEde,aAAa6F,GACX,GAAa,QAATA,IAAoB5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACpD,KAAM,IAAI6C,WAAU,oDAAsDuD,EAE5EhH,MAAK8G,WAAW,WAAYE,IAE9B7F,eACE,MAAOnB,MAAKM,WAEdqG,cAAcK,GACZhH,KAAK8G,WAAW,YAAaE,IAE/BL,gBACE,MAAO3G,MAAKQ,YAEd0C,WAAW8D,GACThH,KAAKU,gBAAkBgD,EAAoBT,EAAgB+D,IAC3DhH,KAAK8G,WAAW,SAAUE,IAE5B9D,aACE,MAAOlD,MAAKS,SAEdmE,eAAeoC,GACb,IAAK5F,MAAM4F,IAAUA,EAAQ,IAAMpG,IACjC,KAAM,IAAI6C,WAAU,8CAAgDuD,EAEtEhH,MAAK8G,WAAW,aAAcE,IAEhCpC,iBACE,MAAO5E,MAAKK,aA4FhB,IAAI+D,GAAQ,EACRE,EAAS,GACTC,EAAM,EAaNC,GACF8C,KAAQxF,EAAM,IAAM,GAAK,IAAM,GAC/ByF,UAAWzF,EAAM,IAAM,EAAG,EAAG,GAC7B0F,WAAY1F,EAAM,EAAG,EAAG,IAAM,GAC9B2F,cAAe3F,EAAM,IAAM,EAAG,IAAM,GACpC4F,aAAc7E,EAAK,EAAGuB,GACtBuD,cAAe9E,EAAK,EAAGyB,GACvBsD,WAAY/E,EAAK,EAAG0B,IAGlBpB,EAAmB,KACnB0E,EAAe,qCACfjE,EAAgB,GAAIkE,QAAO,kBAAoBD,EAAe,IAAMA,EAAe,IAAMA,EAAe,IAAMA,EAAe,OAC7H1D,EAAS,gDAgDTa,EAAY,EACZK,EAAc,EACdC,EAAa,EACbC,EAAc,CA2GlB9F,GAAOE,iBAAmBA,EAC1BF,EAAOqB,WAAaA,EACpBrB,EAAOmC,sBAAwBA,EAC/BnC,EAAOoC,qBAAuBA,EAC9BpC,EAAOgF,wBAA0BA,EACjChF,EAAOgH,2BAA6BA,EACpChH,EAAOoF,eAAiBA,EACxBpF,EAAOwD,gBAAkBA,EACzBxD,EAAOiE,oBAAsBA,GAc5BnE,GCrZH,SAAUE,EAAQC,GAmIhB,QAASqI,GAAUvG,EAAUwF,GAC3B,MAAIxF,KAAYwG,GACPA,EAAQxG,GAAUwF,IAAUA,EAE9BA,EAGT,QAASiB,GAAgBzG,GAEvB,MAAoB,YAAbA,GAAmE,IAAzCA,EAAS0G,YAAY,YAAa,IAAsD,IAA1C1G,EAAS0G,YAAY,aAAc,GAIpH,QAASC,GAA4B3G,EAAUwF,EAAOoB,GACpD,IAAIH,EAAgBzG,GAApB,CAGA,GAAI6G,GAAiBC,EAAoB9G,EACzC,IAAI6G,EAAgB,CAClBE,EAAsBjF,MAAM9B,GAAYwF,CACxC,KAAK,GAAIwB,KAAKH,GAAgB,CAC5B,GAAII,GAAeJ,EAAeG,GAC9BE,EAAgBH,EAAsBjF,MAAMmF,EAChDL,GAAOK,GAAgBV,EAAUU,EAAcC,QAGjDN,GAAO5G,GAAYuG,EAAUvG,EAAUwF,IAI3C,QAAS2B,GAAmBC,GAC1B,GAAIC,KAEJ,KAAK,GAAIrH,KAAYoH,GACnB,KAAIpH,KAAa,SAAU,SAAU,cAArC,CAIA,GAAIsH,GAASF,EAAYpH,EACpBuH,OAAMC,QAAQF,KACjBA,GAAUA,GAKZ,KAAK,GAFDG,GACAC,EAAeJ,EAAOK,OACjBX,EAAI,EAAGA,EAAIU,EAAcV,IAChCS,KAGEA,EAASG,OADP,UAAYR,GACIA,EAAYQ,OACL,GAAhBF,EACS,EAEAV,GAAKU,EAAe,GAGpC,UAAYN,KACdK,EAAS/F,OAAS0F,EAAY1F,QAG5B,aAAe0F,KACjBK,EAASI,UAAYT,EAAYS,WAGnCJ,EAASzH,GAAYsH,EAAON,GAE5BK,EAAsBS,KAAKL,GAK/B,MADAJ,GAAsBU,KAAK,SAASxH,EAAGC,GAAK,MAAOD,GAAEqH,OAASpH,EAAEoH,SACzDP,EAGT,QAASW,GAAmBZ,GAqE1B,QAASa,KACP,GAAIN,GAASO,EAAUP,MACa,OAAhCO,EAAUP,EAAS,GAAGC,SACxBM,EAAUP,EAAS,GAAGC,OAAS,GAC7BD,EAAS,GAA4B,MAAvBO,EAAU,GAAGN,SAC7BM,EAAU,GAAGN,OAAS,EAIxB,KAAK,GAFDO,GAAgB,EAChBC,EAAiBF,EAAU,GAAGN,OACzBZ,EAAI,EAAGA,EAAIW,EAAQX,IAAK,CAC/B,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,IAAK,GAAIS,GAAI,EAAGA,EAAIrB,EAAImB,EAAeE,IACrCH,EAAUC,EAAgBE,GAAGT,OAASQ,GAAkBR,EAASQ,GAAkBC,GAAKrB,EAAImB,EAC9FA,GAAgBnB,EAChBoB,EAAiBR,IAnFvB,GAAmB,MAAfR,EACF,QAGEkB,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,KACjBA,EAAcD,EAAmBC,GA0CnC,KAAK,GAvCDc,GAAYd,EAAY5E,IAAI,SAASkG,GACvC,GAAIjB,KACJ,KAAK,GAAIlC,KAAUmD,GAAkB,CACnC,GAAIC,GAAcD,EAAiBnD,EACnC,IAAc,UAAVA,GACF,GAAmB,MAAfoD,EAAqB,CAEvB,GADAA,EAAclG,OAAOkG,IAChBC,SAASD,GACZ,KAAM,IAAI1G,WAAU,oCACtB,IAAI0G,EAAc,GAAKA,EAAc,EACnC,KAAM,IAAI1G,WAAU,kDAEnB,IAAc,aAAVsD,EAAuB,CAChC,GAAmB,OAAfoD,GAAuC,cAAfA,EAC1B,MACEE,KAAMC,aAAaC,kBACnBC,KAAM,oBACNC,QAAS,mCAEN,IAAmB,WAAfN,EACT,KAAM,IAAI1G,WAAU,0BAA4B0G,EAAc,SAGhEA,GADmB,UAAVpD,EACKtH,EAAOwD,gBAAgBkH,GAEvB,GAAKA,CAErBhC,GAA4BpB,EAAQoD,EAAalB,GAMnD,WAAA,IAJIA,EAASG,SACXH,EAASG,OAAS,UAAA,IAChBH,EAAS/F,SACX+F,EAAS/F,OAAS,UACb+F,IAGLyB,GAAAA,EAEAd,GAAAA,EAAAA,EACKpB,EAAI,EAAGA,EAAIkB,EAAUP,OAAQX,IAAK,CACzC,GAAIY,GAASM,EAAUlB,GAAGY,MAC1B,IAAc,MAAVA,EAAgB,CAClB,GAAIA,EAASQ,EACX,KAAM,IAAInG,WAAU,uEAEtBmG,GAAiBR,MAEjBsB,IAAAA,EA8BJ,MA1BAhB,GAAYA,EAAUiB,OAAO,SAAS1B,GACpC,MAAOA,GAASG,QAAU,GAAKH,EAASG,QAAU,IAsB/CsB,GACHjB,IAEKC,EAvST,GAAIpB,IACFsC,YACE,kBACA,qBACA,iBACA,mBACA,uBACA,mBACA,iBACA,mBAEFC,QACE,iBACA,iBACA,iBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,kBACA,kBACA,mBAEFC,cACE,oBACA,oBACA,qBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,YACE,kBACA,kBACA,mBAEFC,cACE,sBACA,uBACA,0BACA,0BAEFC,aACE,mBACA,mBACA,oBAEFC,WACE,iBACA,iBACA,kBAEFC,aACE,iBACA,mBACA,oBACA,mBAEFC,MACE,WACA,aACA,aAEFC,MACE,aACA,WACA,YACA,cACA,aACA,cAEFC,QACE,YACA,cACA,eACA,cAEFC,SACE,eACA,eACA,gBAEFC,SACE,aACA,eACA,gBACA,gBAIAlD,EAAwBnF,SAASsI,gBAAgB,+BAAgC,OAEjFC,GACFC,KAAM,MACNC,OAAQ,MACRC,MAAO,OAGL9D,GACF+D,kBAAmBJ,EACnBK,gBAAiBL,EACjBM,iBAAkBN,EAClBO,eAAgBP,EAChBQ,UACEC,WAAY,MACZC,UAAW,MACXC,MAAS,MACTT,OAAU,OACVU,MAAS,OACTC,UAAW,OACXC,WAAY,QAEdC,YACEC,OAAQ,MACRC,KAAM,OAERC,aAAclB,EACdmB,YACEC,KAAM,2BAERC,WACED,KAAM,+BA4KVtN,GAAOkJ,mBAAqBA,EAC5BlJ,EAAO+J,mBAAqBA,GAM3BjK,GClTH,SAAUE,GAER,GAAIwN,KAEJxN,GAAOoB,aAAe,SAASqM,EAASC,EAAMC,EAAQC,GAKpD,GAAIC,GAAUD,EAAS,MAAQ,KAC3BE,EAAQ,GAAIC,MACZC,EAAS,GAAID,MAAKL,EAGtB,OAFAM,GAAOC,SAASD,EAAOE,WAAa,KAEhCJ,EAAQE,IACJP,IAAWD,IACfW,QAAQC,KAAK,mBAAqBX,EAAU,IAAMI,EAAU,wCAA0CG,EAAOK,eAAiB,KAAOV,GAEvIH,EAASC,IAAAA,EAAW,KAOxBzN,EAAOsO,WAAa,SAASb,EAASC,EAAMC,EAAQC,GAClD,GAAIC,GAAUD,EAAS,MAAQ,IAC/B,IAAI5N,EAAOoB,aAAaqM,EAASC,EAAMC,EAAQC,GAC7C,KAAM,IAAIW,OAAMd,EAAU,IAAMI,EAAU,yBAA2BF,KAIxE7N,62mCChCH,WAEE,OAAA,KAAI6D,SAASC,cAAc,OAAO4K,YAAYC,SAA9C,CAKE,GAAIC,EACC,IAAIrE,OAAOsE,aAAeA,YAAYD,IAC3C,GAAIA,GAAM,WAAa,MAAOC,aAAYD,WAE1C,IAAIA,GAAM,WAAa,MAAOX,MAAKW,MAGrC,IAAIE,GAAuB,SAASC,EAAQC,EAAaC,GACvDxO,KAAKsO,OAASA,EACdtO,KAAKuO,YAAcA,EACnBvO,KAAKwO,aAAeA,EAEpBxO,KAAKqK,KAAO,SACZrK,KAAKyO,SAAAA,EACLzO,KAAK0O,YAAAA,EACL1O,KAAK2O,cAAgBL,EACrBtO,KAAK4O,kBAAAA,EACL5O,KAAK6O,WAAaC,MAAMC,UACxB/O,KAAKgP,UAAYxB,KAAKW,OAGpBc,EAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GACvD,GAAIC,GAAYH,EAAuBI,KAAKrP,KAAM4I,EAAauG,EAE/DC,GAAUE,mBACVF,EAAUlB,SAAW,IAErB,IAAIqB,GAAiBH,EAAUI,MAC/BJ,GAAUI,OAAS,WACjBD,EAAeF,KAAKrP,KACpB,IAAIyP,GAAQ,GAAIpB,GAAqBrO,KAAM,KAAMmO,KAC7CuB,EAAW1P,KAAKsP,gBAAgBK,OAAO3P,KAAKkO,UAAYlO,KAAKkO,aACjE0B,YAAW,WACTF,EAASnO,QAAQ,SAASsO,GACxBA,EAAQR,KAAKI,EAAMnB,OAAQmB,MAE5B,GAGL,IAAIK,GAA2BV,EAAUW,gBACzCX,GAAUW,iBAAmB,SAAS1F,EAAMwF,GACpB,kBAAXA,IAAiC,UAARxF,EAClCrK,KAAKsP,gBAAgBhG,KAAKuG,GAE1BC,EAAyBT,KAAKrP,KAAMqK,EAAMwF,GAG9C,IAAIG,GAA8BZ,EAAUa,mBAW5C,OAVAb,GAAUa,oBAAsB,SAAS5F,EAAMwF,GAC7C,GAAY,UAARxF,EAAkB,CACpB,GAAI6F,GAAQlQ,KAAKsP,gBAAgB5N,QAAQmO,EACrCK,IAAS,GACXlQ,KAAKsP,gBAAgBa,OAAOD,EAAO,OAErCF,GAA4BX,KAAKrP,KAAMqK,EAAMwF,IAI1CT,OClEX,SAAU3P,GAgBR,GAAI2Q,GAAUhN,SAASiN,gBACnBjB,EAAY,KACZkB,GAAAA,CACJ,KACE,GAAIC,GAAkBC,iBAAiBJ,GAASK,iBAAiB,WAC7DC,EAAiC,KAAnBH,EAAyB,IAAM,GACjDnB,GAAYgB,EAAQnC,SAAS0C,SAAYD,EAAaA,KACjDvP,SAAU,IACfiO,EAAUb,YAAc,EACxB+B,EAAWE,iBAAiBJ,GAASK,iBAAiB,YAAcC,EACpE,MAAOE,IACP,QACIxB,GACFA,EAAUI,SAEd,IAAIc,EAAJ,CAIA,GAAIrB,GAAyBnF,OAAOoF,QAAQrI,UAAUoH,OACtDnE,QAAOoF,QAAQrI,UAAUoH,QAAU,SAASrF,EAAauG,GAUvD,MATIrF,QAAOC,QAAUA,OAAOC,UAAYjB,MAAMlC,UAAUoD,MAAQrB,EAAYmB,OAAOC,YAEjFpB,EAAcG,MAAMkB,KAAKrB,IAGtBG,MAAMC,QAAQJ,IAAgC,OAAhBA,IACjCA,EAAcnJ,EAAOkJ,mBAAmBC,IAGnCqG,EAAuBI,KAAKrP,KAAM4I,EAAauG,MAEvD5P,GL9CCsR,EAAAA,KAEJC,MACMC,WAAAA,MAAuB/Q","file":"web-animations.min.js"}
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/CustomElements.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/CustomElements.js
deleted file mode 100644
index dcd9dde..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/CustomElements.js
+++ /dev/null
@@ -1,1029 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-if (typeof WeakMap === "undefined") {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-    var WeakMap = function() {
-      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
-    };
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
-          value: [ key, value ],
-          writable: true
-        });
-        return this;
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
-      },
-      "delete": function(key) {
-        var entry = key[this.name];
-        if (!entry || entry[0] !== key) return false;
-        entry[0] = entry[1] = undefined;
-        return true;
-      },
-      has: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        return entry[0] === key;
-      }
-    };
-    window.WeakMap = WeakMap;
-  })();
-}
-
-(function(global) {
-  if (global.JsMutationObserver) {
-    return;
-  }
-  var registrationsTable = new WeakMap();
-  var setImmediate;
-  if (/Trident|Edge/.test(navigator.userAgent)) {
-    setImmediate = setTimeout;
-  } else if (window.setImmediate) {
-    setImmediate = window.setImmediate;
-  } else {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener("message", function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, "*");
-    };
-  }
-  var isScheduled = false;
-  var scheduledObservers = [];
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
-  }
-  function dispatchCallbacks() {
-    isScheduled = false;
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-      var queue = observer.takeRecords();
-      removeTransientObserversFor(observer);
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-    if (anyNonEmpty) dispatchCallbacks();
-  }
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations) return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer) registration.removeTransientObservers();
-      });
-    });
-  }
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-          if (node !== target && !options.subtree) continue;
-          var record = callback(options);
-          if (record) registration.enqueue(record);
-        }
-      }
-    }
-  }
-  var uidCounter = 0;
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
-        throw new SyntaxError();
-      }
-      var registrations = registrationsTable.get(target);
-      if (!registrations) registrationsTable.set(target, registrations = []);
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-      registration.addListeners();
-    },
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  }
-  var currentRecord, recordWithOldValue;
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue) return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord) return lastRecord;
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
-    return null;
-  }
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-      records[length] = record;
-    },
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
-    },
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
-    },
-    addTransientObserver: function(node) {
-      if (node === this.target) return;
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations) registrationsTable.set(node, registrations = []);
-      registrations.push(this);
-    },
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-      transientObservedNodes.forEach(function(node) {
-        this.removeListeners_(node);
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-    },
-    handleEvent: function(e) {
-      e.stopImmediatePropagation();
-      switch (e.type) {
-       case "DOMAttrModified":
-        var name = e.attrName;
-        var namespace = e.relatedNode.namespaceURI;
-        var target = e.target;
-        var record = new getRecord("attributes", target);
-        record.attributeName = name;
-        record.attributeNamespace = namespace;
-        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.attributes) return;
-          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
-            return;
-          }
-          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMCharacterDataModified":
-        var target = e.target;
-        var record = getRecord("characterData", target);
-        var oldValue = e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.characterData) return;
-          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMNodeRemoved":
-        this.addTransientObserver(e.target);
-
-       case "DOMNodeInserted":
-        var changedNode = e.target;
-        var addedNodes, removedNodes;
-        if (e.type === "DOMNodeInserted") {
-          addedNodes = [ changedNode ];
-          removedNodes = [];
-        } else {
-          addedNodes = [];
-          removedNodes = [ changedNode ];
-        }
-        var previousSibling = changedNode.previousSibling;
-        var nextSibling = changedNode.nextSibling;
-        var record = getRecord("childList", e.target.parentNode);
-        record.addedNodes = addedNodes;
-        record.removedNodes = removedNodes;
-        record.previousSibling = previousSibling;
-        record.nextSibling = nextSibling;
-        forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
-          if (!options.childList) return;
-          return record;
-        });
-      }
-      clearRecords();
-    }
-  };
-  global.JsMutationObserver = JsMutationObserver;
-  if (!global.MutationObserver) {
-    global.MutationObserver = JsMutationObserver;
-    JsMutationObserver._isPolyfilled = true;
-  }
-})(self);
-
-(function(scope) {
-  "use strict";
-  if (!(window.performance && window.performance.now)) {
-    var start = Date.now();
-    window.performance = {
-      now: function() {
-        return Date.now() - start;
-      }
-    };
-  }
-  if (!window.requestAnimationFrame) {
-    window.requestAnimationFrame = function() {
-      var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-      return nativeRaf ? function(callback) {
-        return nativeRaf(function() {
-          callback(performance.now());
-        });
-      } : function(callback) {
-        return window.setTimeout(callback, 1e3 / 60);
-      };
-    }();
-  }
-  if (!window.cancelAnimationFrame) {
-    window.cancelAnimationFrame = function() {
-      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {
-        clearTimeout(id);
-      };
-    }();
-  }
-  var workingDefaultPrevented = function() {
-    var e = document.createEvent("Event");
-    e.initEvent("foo", true, true);
-    e.preventDefault();
-    return e.defaultPrevented;
-  }();
-  if (!workingDefaultPrevented) {
-    var origPreventDefault = Event.prototype.preventDefault;
-    Event.prototype.preventDefault = function() {
-      if (!this.cancelable) {
-        return;
-      }
-      origPreventDefault.call(this);
-      Object.defineProperty(this, "defaultPrevented", {
-        get: function() {
-          return true;
-        },
-        configurable: true
-      });
-    };
-  }
-  var isIE = /Trident/.test(navigator.userAgent);
-  if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") {
-    window.CustomEvent = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("CustomEvent");
-      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
-      return e;
-    };
-    window.CustomEvent.prototype = window.Event.prototype;
-  }
-  if (!window.Event || isIE && typeof window.Event !== "function") {
-    var origEvent = window.Event;
-    window.Event = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("Event");
-      e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable));
-      return e;
-    };
-    window.Event.prototype = origEvent.prototype;
-  }
-})(window.WebComponents);
-
-window.CustomElements = window.CustomElements || {
-  flags: {}
-};
-
-(function(scope) {
-  var flags = scope.flags;
-  var modules = [];
-  var addModule = function(module) {
-    modules.push(module);
-  };
-  var initializeModules = function() {
-    modules.forEach(function(module) {
-      module(scope);
-    });
-  };
-  scope.addModule = addModule;
-  scope.initializeModules = initializeModules;
-  scope.hasNative = Boolean(document.registerElement);
-  scope.isIE = /Trident/.test(navigator.userAgent);
-  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative);
-})(window.CustomElements);
-
-window.CustomElements.addModule(function(scope) {
-  var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none";
-  function forSubtree(node, cb) {
-    findAllElements(node, function(e) {
-      if (cb(e)) {
-        return true;
-      }
-      forRoots(e, cb);
-    });
-    forRoots(node, cb);
-  }
-  function findAllElements(node, find, data) {
-    var e = node.firstElementChild;
-    if (!e) {
-      e = node.firstChild;
-      while (e && e.nodeType !== Node.ELEMENT_NODE) {
-        e = e.nextSibling;
-      }
-    }
-    while (e) {
-      if (find(e, data) !== true) {
-        findAllElements(e, find, data);
-      }
-      e = e.nextElementSibling;
-    }
-    return null;
-  }
-  function forRoots(node, cb) {
-    var root = node.shadowRoot;
-    while (root) {
-      forSubtree(root, cb);
-      root = root.olderShadowRoot;
-    }
-  }
-  function forDocumentTree(doc, cb) {
-    _forDocumentTree(doc, cb, []);
-  }
-  function _forDocumentTree(doc, cb, processingDocuments) {
-    doc = window.wrap(doc);
-    if (processingDocuments.indexOf(doc) >= 0) {
-      return;
-    }
-    processingDocuments.push(doc);
-    var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]");
-    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {
-      if (n.import) {
-        _forDocumentTree(n.import, cb, processingDocuments);
-      }
-    }
-    cb(doc);
-  }
-  scope.forDocumentTree = forDocumentTree;
-  scope.forSubtree = forSubtree;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var flags = scope.flags;
-  var forSubtree = scope.forSubtree;
-  var forDocumentTree = scope.forDocumentTree;
-  function addedNode(node, isAttached) {
-    return added(node, isAttached) || addedSubtree(node, isAttached);
-  }
-  function added(node, isAttached) {
-    if (scope.upgrade(node, isAttached)) {
-      return true;
-    }
-    if (isAttached) {
-      attached(node);
-    }
-  }
-  function addedSubtree(node, isAttached) {
-    forSubtree(node, function(e) {
-      if (added(e, isAttached)) {
-        return true;
-      }
-    });
-  }
-  var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"];
-  scope.hasPolyfillMutations = hasThrottledAttached;
-  scope.hasThrottledAttached = hasThrottledAttached;
-  var isPendingMutations = false;
-  var pendingMutations = [];
-  function deferMutation(fn) {
-    pendingMutations.push(fn);
-    if (!isPendingMutations) {
-      isPendingMutations = true;
-      setTimeout(takeMutations);
-    }
-  }
-  function takeMutations() {
-    isPendingMutations = false;
-    var $p = pendingMutations;
-    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
-      p();
-    }
-    pendingMutations = [];
-  }
-  function attached(element) {
-    if (hasThrottledAttached) {
-      deferMutation(function() {
-        _attached(element);
-      });
-    } else {
-      _attached(element);
-    }
-  }
-  function _attached(element) {
-    if (element.__upgraded__ && !element.__attached) {
-      element.__attached = true;
-      if (element.attachedCallback) {
-        element.attachedCallback();
-      }
-    }
-  }
-  function detachedNode(node) {
-    detached(node);
-    forSubtree(node, function(e) {
-      detached(e);
-    });
-  }
-  function detached(element) {
-    if (hasThrottledAttached) {
-      deferMutation(function() {
-        _detached(element);
-      });
-    } else {
-      _detached(element);
-    }
-  }
-  function _detached(element) {
-    if (element.__upgraded__ && element.__attached) {
-      element.__attached = false;
-      if (element.detachedCallback) {
-        element.detachedCallback();
-      }
-    }
-  }
-  function inDocument(element) {
-    var p = element;
-    var doc = window.wrap(document);
-    while (p) {
-      if (p == doc) {
-        return true;
-      }
-      p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host;
-    }
-  }
-  function watchShadow(node) {
-    if (node.shadowRoot && !node.shadowRoot.__watched) {
-      flags.dom && console.log("watching shadow-root for: ", node.localName);
-      var root = node.shadowRoot;
-      while (root) {
-        observe(root);
-        root = root.olderShadowRoot;
-      }
-    }
-  }
-  function handler(root, mutations) {
-    if (flags.dom) {
-      var mx = mutations[0];
-      if (mx && mx.type === "childList" && mx.addedNodes) {
-        if (mx.addedNodes) {
-          var d = mx.addedNodes[0];
-          while (d && d !== document && !d.host) {
-            d = d.parentNode;
-          }
-          var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
-          u = u.split("/?").shift().split("/").pop();
-        }
-      }
-      console.group("mutations (%d) [%s]", mutations.length, u || "");
-    }
-    var isAttached = inDocument(root);
-    mutations.forEach(function(mx) {
-      if (mx.type === "childList") {
-        forEach(mx.addedNodes, function(n) {
-          if (!n.localName) {
-            return;
-          }
-          addedNode(n, isAttached);
-        });
-        forEach(mx.removedNodes, function(n) {
-          if (!n.localName) {
-            return;
-          }
-          detachedNode(n);
-        });
-      }
-    });
-    flags.dom && console.groupEnd();
-  }
-  function takeRecords(node) {
-    node = window.wrap(node);
-    if (!node) {
-      node = window.wrap(document);
-    }
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-    var observer = node.__observer;
-    if (observer) {
-      handler(node, observer.takeRecords());
-      takeMutations();
-    }
-  }
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-  function observe(inRoot) {
-    if (inRoot.__observer) {
-      return;
-    }
-    var observer = new MutationObserver(handler.bind(this, inRoot));
-    observer.observe(inRoot, {
-      childList: true,
-      subtree: true
-    });
-    inRoot.__observer = observer;
-  }
-  function upgradeDocument(doc) {
-    doc = window.wrap(doc);
-    flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
-    var isMainDocument = doc === window.wrap(document);
-    addedNode(doc, isMainDocument);
-    observe(doc);
-    flags.dom && console.groupEnd();
-  }
-  function upgradeDocumentTree(doc) {
-    forDocumentTree(doc, upgradeDocument);
-  }
-  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-  if (originalCreateShadowRoot) {
-    Element.prototype.createShadowRoot = function() {
-      var root = originalCreateShadowRoot.call(this);
-      window.CustomElements.watchShadow(this);
-      return root;
-    };
-  }
-  scope.watchShadow = watchShadow;
-  scope.upgradeDocumentTree = upgradeDocumentTree;
-  scope.upgradeDocument = upgradeDocument;
-  scope.upgradeSubtree = addedSubtree;
-  scope.upgradeAll = addedNode;
-  scope.attached = attached;
-  scope.takeRecords = takeRecords;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var flags = scope.flags;
-  function upgrade(node, isAttached) {
-    if (node.localName === "template") {
-      if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
-        HTMLTemplateElement.decorate(node);
-      }
-    }
-    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
-      var is = node.getAttribute("is");
-      var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is);
-      if (definition) {
-        if (is && definition.tag == node.localName || !is && !definition.extends) {
-          return upgradeWithDefinition(node, definition, isAttached);
-        }
-      }
-    }
-  }
-  function upgradeWithDefinition(element, definition, isAttached) {
-    flags.upgrade && console.group("upgrade:", element.localName);
-    if (definition.is) {
-      element.setAttribute("is", definition.is);
-    }
-    implementPrototype(element, definition);
-    element.__upgraded__ = true;
-    created(element);
-    if (isAttached) {
-      scope.attached(element);
-    }
-    scope.upgradeSubtree(element, isAttached);
-    flags.upgrade && console.groupEnd();
-    return element;
-  }
-  function implementPrototype(element, definition) {
-    if (Object.__proto__) {
-      element.__proto__ = definition.prototype;
-    } else {
-      customMixin(element, definition.prototype, definition.native);
-      element.__proto__ = definition.prototype;
-    }
-  }
-  function customMixin(inTarget, inSrc, inNative) {
-    var used = {};
-    var p = inSrc;
-    while (p !== inNative && p !== HTMLElement.prototype) {
-      var keys = Object.getOwnPropertyNames(p);
-      for (var i = 0, k; k = keys[i]; i++) {
-        if (!used[k]) {
-          Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
-          used[k] = 1;
-        }
-      }
-      p = Object.getPrototypeOf(p);
-    }
-  }
-  function created(element) {
-    if (element.createdCallback) {
-      element.createdCallback();
-    }
-  }
-  scope.upgrade = upgrade;
-  scope.upgradeWithDefinition = upgradeWithDefinition;
-  scope.implementPrototype = implementPrototype;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var isIE = scope.isIE;
-  var upgradeDocumentTree = scope.upgradeDocumentTree;
-  var upgradeAll = scope.upgradeAll;
-  var upgradeWithDefinition = scope.upgradeWithDefinition;
-  var implementPrototype = scope.implementPrototype;
-  var useNative = scope.useNative;
-  function register(name, options) {
-    var definition = options || {};
-    if (!name) {
-      throw new Error("document.registerElement: first argument `name` must not be empty");
-    }
-    if (name.indexOf("-") < 0) {
-      throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
-    }
-    if (isReservedTag(name)) {
-      throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
-    }
-    if (getRegisteredDefinition(name)) {
-      throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
-    }
-    if (!definition.prototype) {
-      definition.prototype = Object.create(HTMLElement.prototype);
-    }
-    definition.__name = name.toLowerCase();
-    if (definition.extends) {
-      definition.extends = definition.extends.toLowerCase();
-    }
-    definition.lifecycle = definition.lifecycle || {};
-    definition.ancestry = ancestry(definition.extends);
-    resolveTagName(definition);
-    resolvePrototypeChain(definition);
-    overrideAttributeApi(definition.prototype);
-    registerDefinition(definition.__name, definition);
-    definition.ctor = generateConstructor(definition);
-    definition.ctor.prototype = definition.prototype;
-    definition.prototype.constructor = definition.ctor;
-    if (scope.ready) {
-      upgradeDocumentTree(document);
-    }
-    return definition.ctor;
-  }
-  function overrideAttributeApi(prototype) {
-    if (prototype.setAttribute._polyfilled) {
-      return;
-    }
-    var setAttribute = prototype.setAttribute;
-    prototype.setAttribute = function(name, value) {
-      changeAttribute.call(this, name, value, setAttribute);
-    };
-    var removeAttribute = prototype.removeAttribute;
-    prototype.removeAttribute = function(name) {
-      changeAttribute.call(this, name, null, removeAttribute);
-    };
-    prototype.setAttribute._polyfilled = true;
-  }
-  function changeAttribute(name, value, operation) {
-    name = name.toLowerCase();
-    var oldValue = this.getAttribute(name);
-    operation.apply(this, arguments);
-    var newValue = this.getAttribute(name);
-    if (this.attributeChangedCallback && newValue !== oldValue) {
-      this.attributeChangedCallback(name, oldValue, newValue);
-    }
-  }
-  function isReservedTag(name) {
-    for (var i = 0; i < reservedTagList.length; i++) {
-      if (name === reservedTagList[i]) {
-        return true;
-      }
-    }
-  }
-  var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
-  function ancestry(extnds) {
-    var extendee = getRegisteredDefinition(extnds);
-    if (extendee) {
-      return ancestry(extendee.extends).concat([ extendee ]);
-    }
-    return [];
-  }
-  function resolveTagName(definition) {
-    var baseTag = definition.extends;
-    for (var i = 0, a; a = definition.ancestry[i]; i++) {
-      baseTag = a.is && a.tag;
-    }
-    definition.tag = baseTag || definition.__name;
-    if (baseTag) {
-      definition.is = definition.__name;
-    }
-  }
-  function resolvePrototypeChain(definition) {
-    if (!Object.__proto__) {
-      var nativePrototype = HTMLElement.prototype;
-      if (definition.is) {
-        var inst = document.createElement(definition.tag);
-        nativePrototype = Object.getPrototypeOf(inst);
-      }
-      var proto = definition.prototype, ancestor;
-      var foundPrototype = false;
-      while (proto) {
-        if (proto == nativePrototype) {
-          foundPrototype = true;
-        }
-        ancestor = Object.getPrototypeOf(proto);
-        if (ancestor) {
-          proto.__proto__ = ancestor;
-        }
-        proto = ancestor;
-      }
-      if (!foundPrototype) {
-        console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is);
-      }
-      definition.native = nativePrototype;
-    }
-  }
-  function instantiate(definition) {
-    return upgradeWithDefinition(domCreateElement(definition.tag), definition);
-  }
-  var registry = {};
-  function getRegisteredDefinition(name) {
-    if (name) {
-      return registry[name.toLowerCase()];
-    }
-  }
-  function registerDefinition(name, definition) {
-    registry[name] = definition;
-  }
-  function generateConstructor(definition) {
-    return function() {
-      return instantiate(definition);
-    };
-  }
-  var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
-  function createElementNS(namespace, tag, typeExtension) {
-    if (namespace === HTML_NAMESPACE) {
-      return createElement(tag, typeExtension);
-    } else {
-      return domCreateElementNS(namespace, tag);
-    }
-  }
-  function createElement(tag, typeExtension) {
-    if (tag) {
-      tag = tag.toLowerCase();
-    }
-    if (typeExtension) {
-      typeExtension = typeExtension.toLowerCase();
-    }
-    var definition = getRegisteredDefinition(typeExtension || tag);
-    if (definition) {
-      if (tag == definition.tag && typeExtension == definition.is) {
-        return new definition.ctor();
-      }
-      if (!typeExtension && !definition.is) {
-        return new definition.ctor();
-      }
-    }
-    var element;
-    if (typeExtension) {
-      element = createElement(tag);
-      element.setAttribute("is", typeExtension);
-      return element;
-    }
-    element = domCreateElement(tag);
-    if (tag.indexOf("-") >= 0) {
-      implementPrototype(element, HTMLElement);
-    }
-    return element;
-  }
-  var domCreateElement = document.createElement.bind(document);
-  var domCreateElementNS = document.createElementNS.bind(document);
-  var isInstance;
-  if (!Object.__proto__ && !useNative) {
-    isInstance = function(obj, ctor) {
-      if (obj instanceof ctor) {
-        return true;
-      }
-      var p = obj;
-      while (p) {
-        if (p === ctor.prototype) {
-          return true;
-        }
-        p = p.__proto__;
-      }
-      return false;
-    };
-  } else {
-    isInstance = function(obj, base) {
-      return obj instanceof base;
-    };
-  }
-  function wrapDomMethodToForceUpgrade(obj, methodName) {
-    var orig = obj[methodName];
-    obj[methodName] = function() {
-      var n = orig.apply(this, arguments);
-      upgradeAll(n);
-      return n;
-    };
-  }
-  wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
-  wrapDomMethodToForceUpgrade(document, "importNode");
-  document.registerElement = register;
-  document.createElement = createElement;
-  document.createElementNS = createElementNS;
-  scope.registry = registry;
-  scope.instanceof = isInstance;
-  scope.reservedTagList = reservedTagList;
-  scope.getRegisteredDefinition = getRegisteredDefinition;
-  document.register = document.registerElement;
-});
-
-(function(scope) {
-  var useNative = scope.useNative;
-  var initializeModules = scope.initializeModules;
-  var isIE = scope.isIE;
-  if (useNative) {
-    var nop = function() {};
-    scope.watchShadow = nop;
-    scope.upgrade = nop;
-    scope.upgradeAll = nop;
-    scope.upgradeDocumentTree = nop;
-    scope.upgradeSubtree = nop;
-    scope.takeRecords = nop;
-    scope.instanceof = function(obj, base) {
-      return obj instanceof base;
-    };
-  } else {
-    initializeModules();
-  }
-  var upgradeDocumentTree = scope.upgradeDocumentTree;
-  var upgradeDocument = scope.upgradeDocument;
-  if (!window.wrap) {
-    if (window.ShadowDOMPolyfill) {
-      window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded;
-      window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded;
-    } else {
-      window.wrap = window.unwrap = function(node) {
-        return node;
-      };
-    }
-  }
-  if (window.HTMLImports) {
-    window.HTMLImports.__importsParsingHook = function(elt) {
-      if (elt.import) {
-        upgradeDocument(wrap(elt.import));
-      }
-    };
-  }
-  function bootstrap() {
-    upgradeDocumentTree(window.wrap(document));
-    window.CustomElements.ready = true;
-    var requestAnimationFrame = window.requestAnimationFrame || function(f) {
-      setTimeout(f, 16);
-    };
-    requestAnimationFrame(function() {
-      setTimeout(function() {
-        window.CustomElements.readyTime = Date.now();
-        if (window.HTMLImports) {
-          window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime;
-        }
-        document.dispatchEvent(new CustomEvent("WebComponentsReady", {
-          bubbles: true
-        }));
-      });
-    });
-  }
-  if (document.readyState === "complete" || scope.flags.eager) {
-    bootstrap();
-  } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
-    bootstrap();
-  } else {
-    var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
-    window.addEventListener(loadEvent, bootstrap);
-  }
-})(window.CustomElements);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/CustomElements.min.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/CustomElements.min.js
deleted file mode 100644
index 839171c..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/CustomElements.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),function(e){function t(e){E.push(e),b||(b=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){b=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var d=t(a);d&&i.enqueue(d)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++_}function d(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function s(e){var t=new d(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function u(e,t){return y=new d(e,t)}function c(e){return N?N:(N=s(y),N.oldValue=e,N)}function l(){y=N=void 0}function f(e){return e===N||e===y}function p(e,t){return e===t?e:N&&f(e)?N:null}function w(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var h=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=h;h=[],t.forEach(function(e){e()})}}),m=function(e){h.push(e),window.postMessage(g,"*")}}var b=!1,E=[],_=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new w(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,N;w.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=p(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new u("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?c(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=u("characterData",o),a=e.prevValue;i(o,function(e){if(e.characterData)return e.characterDataOldValue?c(a):r});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var d,s,f=e.target;"DOMNodeInserted"===e.type?(d=[f],s=[]):(d=[],s=[f]);var p=f.previousSibling,w=f.nextSibling,r=u("childList",e.target.parentNode);r.addedNodes=d,r.removedNodes=s,r.previousSibling=p,r.nextSibling=w,i(e.relatedNode,function(e){if(e.childList)return r})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return!!t(e)||void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),d=0,s=r.length;d<s&&(o=r[d]);d++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return!!e.upgrade(t,n)||void(n&&a(t))}function o(e,t){b(e,function(e){if(n(e,t))return!0})}function r(e){N.push(e),y||(y=!0,setTimeout(i))}function i(){y=!1;for(var e,t=N,n=0,o=t.length;n<o&&(e=t[n]);n++)e();N=[]}function a(e){_?r(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function s(e){u(e),b(e,function(e){u(e)})}function u(e){_?r(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function p(e,n){if(g.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&s(e)}))}),g.dom&&console.groupEnd()}function w(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(p(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(p.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function h(e){E(e,v)}var g=e.flags,b=e.forSubtree,E=e.forDocumentTree,_=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=_,e.hasThrottledAttached=_;var y=!1,N=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;O&&(Element.prototype.createShadowRoot=function(){var e=O.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=f,e.upgradeDocumentTree=h,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=w}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),d=0;i=a[d];d++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var s=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(u(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return s.prototype||(s.prototype=Object.create(HTMLElement.prototype)),s.__name=t.toLowerCase(),s["extends"]&&(s["extends"]=s["extends"].toLowerCase()),s.lifecycle=s.lifecycle||{},s.ancestry=i(s["extends"]),a(s),d(s),n(s.prototype),c(s.__name,s),s.ctor=l(s),s.ctor.prototype=s.prototype,s.prototype.constructor=s.ctor,e.ready&&v(document),s.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<_.length;t++)if(e===_[t])return!0}function i(e){var t=u(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function d(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function s(e){return g(M(e.tag),e)}function u(e){if(e)return y[e.toLowerCase()]}function c(e,t){y[e]=t}function l(e){return function(){return s(e)}}function f(e,t,n){return e===N?p(t,n):O(e,t)}function p(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=u(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=p(e),o.setAttribute("is",t),o):(o=M(e),e.indexOf("-")>=0&&b(o,HTMLElement),o)}function w(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return h(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),h=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,E=e.useNative,_=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],y={},N="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),O=document.createElementNS.bind(document);m=Object.__proto__||E?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},w(Node.prototype,"cloneNode"),w(document,"importNode"),document.registerElement=t,document.createElement=p,document.createElementNS=f,e.registry=y,e["instanceof"]=m,e.reservedTagList=_,e.getRegisteredDefinition=u,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var d=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(d,t)}else t()}(window.CustomElements);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/HTMLImports.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/HTMLImports.js
deleted file mode 100644
index 882f943..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/HTMLImports.js
+++ /dev/null
@@ -1,1163 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-if (typeof WeakMap === "undefined") {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-    var WeakMap = function() {
-      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
-    };
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
-          value: [ key, value ],
-          writable: true
-        });
-        return this;
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
-      },
-      "delete": function(key) {
-        var entry = key[this.name];
-        if (!entry || entry[0] !== key) return false;
-        entry[0] = entry[1] = undefined;
-        return true;
-      },
-      has: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        return entry[0] === key;
-      }
-    };
-    window.WeakMap = WeakMap;
-  })();
-}
-
-(function(global) {
-  if (global.JsMutationObserver) {
-    return;
-  }
-  var registrationsTable = new WeakMap();
-  var setImmediate;
-  if (/Trident|Edge/.test(navigator.userAgent)) {
-    setImmediate = setTimeout;
-  } else if (window.setImmediate) {
-    setImmediate = window.setImmediate;
-  } else {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener("message", function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, "*");
-    };
-  }
-  var isScheduled = false;
-  var scheduledObservers = [];
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
-  }
-  function dispatchCallbacks() {
-    isScheduled = false;
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-      var queue = observer.takeRecords();
-      removeTransientObserversFor(observer);
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-    if (anyNonEmpty) dispatchCallbacks();
-  }
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations) return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer) registration.removeTransientObservers();
-      });
-    });
-  }
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-          if (node !== target && !options.subtree) continue;
-          var record = callback(options);
-          if (record) registration.enqueue(record);
-        }
-      }
-    }
-  }
-  var uidCounter = 0;
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
-        throw new SyntaxError();
-      }
-      var registrations = registrationsTable.get(target);
-      if (!registrations) registrationsTable.set(target, registrations = []);
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-      registration.addListeners();
-    },
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  }
-  var currentRecord, recordWithOldValue;
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue) return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord) return lastRecord;
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
-    return null;
-  }
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-      records[length] = record;
-    },
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
-    },
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
-    },
-    addTransientObserver: function(node) {
-      if (node === this.target) return;
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations) registrationsTable.set(node, registrations = []);
-      registrations.push(this);
-    },
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-      transientObservedNodes.forEach(function(node) {
-        this.removeListeners_(node);
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-    },
-    handleEvent: function(e) {
-      e.stopImmediatePropagation();
-      switch (e.type) {
-       case "DOMAttrModified":
-        var name = e.attrName;
-        var namespace = e.relatedNode.namespaceURI;
-        var target = e.target;
-        var record = new getRecord("attributes", target);
-        record.attributeName = name;
-        record.attributeNamespace = namespace;
-        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.attributes) return;
-          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
-            return;
-          }
-          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMCharacterDataModified":
-        var target = e.target;
-        var record = getRecord("characterData", target);
-        var oldValue = e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.characterData) return;
-          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMNodeRemoved":
-        this.addTransientObserver(e.target);
-
-       case "DOMNodeInserted":
-        var changedNode = e.target;
-        var addedNodes, removedNodes;
-        if (e.type === "DOMNodeInserted") {
-          addedNodes = [ changedNode ];
-          removedNodes = [];
-        } else {
-          addedNodes = [];
-          removedNodes = [ changedNode ];
-        }
-        var previousSibling = changedNode.previousSibling;
-        var nextSibling = changedNode.nextSibling;
-        var record = getRecord("childList", e.target.parentNode);
-        record.addedNodes = addedNodes;
-        record.removedNodes = removedNodes;
-        record.previousSibling = previousSibling;
-        record.nextSibling = nextSibling;
-        forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
-          if (!options.childList) return;
-          return record;
-        });
-      }
-      clearRecords();
-    }
-  };
-  global.JsMutationObserver = JsMutationObserver;
-  if (!global.MutationObserver) {
-    global.MutationObserver = JsMutationObserver;
-    JsMutationObserver._isPolyfilled = true;
-  }
-})(self);
-
-(function(scope) {
-  "use strict";
-  if (!(window.performance && window.performance.now)) {
-    var start = Date.now();
-    window.performance = {
-      now: function() {
-        return Date.now() - start;
-      }
-    };
-  }
-  if (!window.requestAnimationFrame) {
-    window.requestAnimationFrame = function() {
-      var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-      return nativeRaf ? function(callback) {
-        return nativeRaf(function() {
-          callback(performance.now());
-        });
-      } : function(callback) {
-        return window.setTimeout(callback, 1e3 / 60);
-      };
-    }();
-  }
-  if (!window.cancelAnimationFrame) {
-    window.cancelAnimationFrame = function() {
-      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {
-        clearTimeout(id);
-      };
-    }();
-  }
-  var workingDefaultPrevented = function() {
-    var e = document.createEvent("Event");
-    e.initEvent("foo", true, true);
-    e.preventDefault();
-    return e.defaultPrevented;
-  }();
-  if (!workingDefaultPrevented) {
-    var origPreventDefault = Event.prototype.preventDefault;
-    Event.prototype.preventDefault = function() {
-      if (!this.cancelable) {
-        return;
-      }
-      origPreventDefault.call(this);
-      Object.defineProperty(this, "defaultPrevented", {
-        get: function() {
-          return true;
-        },
-        configurable: true
-      });
-    };
-  }
-  var isIE = /Trident/.test(navigator.userAgent);
-  if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") {
-    window.CustomEvent = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("CustomEvent");
-      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
-      return e;
-    };
-    window.CustomEvent.prototype = window.Event.prototype;
-  }
-  if (!window.Event || isIE && typeof window.Event !== "function") {
-    var origEvent = window.Event;
-    window.Event = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("Event");
-      e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable));
-      return e;
-    };
-    window.Event.prototype = origEvent.prototype;
-  }
-})(window.WebComponents);
-
-window.HTMLImports = window.HTMLImports || {
-  flags: {}
-};
-
-(function(scope) {
-  var IMPORT_LINK_TYPE = "import";
-  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
-  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
-  var wrap = function(node) {
-    return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node;
-  };
-  var rootDocument = wrap(document);
-  var currentScriptDescriptor = {
-    get: function() {
-      var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
-      return wrap(script);
-    },
-    configurable: true
-  };
-  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
-  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
-  var isIE = /Trident/.test(navigator.userAgent);
-  function whenReady(callback, doc) {
-    doc = doc || rootDocument;
-    whenDocumentReady(function() {
-      watchImportsLoad(callback, doc);
-    }, doc);
-  }
-  var requiredReadyState = isIE ? "complete" : "interactive";
-  var READY_EVENT = "readystatechange";
-  function isDocumentReady(doc) {
-    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
-  }
-  function whenDocumentReady(callback, doc) {
-    if (!isDocumentReady(doc)) {
-      var checkReady = function() {
-        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
-          doc.removeEventListener(READY_EVENT, checkReady);
-          whenDocumentReady(callback, doc);
-        }
-      };
-      doc.addEventListener(READY_EVENT, checkReady);
-    } else if (callback) {
-      callback();
-    }
-  }
-  function markTargetLoaded(event) {
-    event.target.__loaded = true;
-  }
-  function watchImportsLoad(callback, doc) {
-    var imports = doc.querySelectorAll("link[rel=import]");
-    var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = [];
-    function checkDone() {
-      if (parsedCount == importCount && callback) {
-        callback({
-          allImports: imports,
-          loadedImports: newImports,
-          errorImports: errorImports
-        });
-      }
-    }
-    function loadedImport(e) {
-      markTargetLoaded(e);
-      newImports.push(this);
-      parsedCount++;
-      checkDone();
-    }
-    function errorLoadingImport(e) {
-      errorImports.push(this);
-      parsedCount++;
-      checkDone();
-    }
-    if (importCount) {
-      for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) {
-        if (isImportLoaded(imp)) {
-          newImports.push(this);
-          parsedCount++;
-          checkDone();
-        } else {
-          imp.addEventListener("load", loadedImport);
-          imp.addEventListener("error", errorLoadingImport);
-        }
-      }
-    } else {
-      checkDone();
-    }
-  }
-  function isImportLoaded(link) {
-    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
-  }
-  if (useNative) {
-    new MutationObserver(function(mxns) {
-      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
-        if (m.addedNodes) {
-          handleImports(m.addedNodes);
-        }
-      }
-    }).observe(document.head, {
-      childList: true
-    });
-    function handleImports(nodes) {
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        if (isImport(n)) {
-          handleImport(n);
-        }
-      }
-    }
-    function isImport(element) {
-      return element.localName === "link" && element.rel === "import";
-    }
-    function handleImport(element) {
-      var loaded = element.import;
-      if (loaded) {
-        markTargetLoaded({
-          target: element
-        });
-      } else {
-        element.addEventListener("load", markTargetLoaded);
-        element.addEventListener("error", markTargetLoaded);
-      }
-    }
-    (function() {
-      if (document.readyState === "loading") {
-        var imports = document.querySelectorAll("link[rel=import]");
-        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
-          handleImport(imp);
-        }
-      }
-    })();
-  }
-  whenReady(function(detail) {
-    window.HTMLImports.ready = true;
-    window.HTMLImports.readyTime = new Date().getTime();
-    var evt = rootDocument.createEvent("CustomEvent");
-    evt.initCustomEvent("HTMLImportsLoaded", true, true, detail);
-    rootDocument.dispatchEvent(evt);
-  });
-  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-  scope.useNative = useNative;
-  scope.rootDocument = rootDocument;
-  scope.whenReady = whenReady;
-  scope.isIE = isIE;
-})(window.HTMLImports);
-
-(function(scope) {
-  var modules = [];
-  var addModule = function(module) {
-    modules.push(module);
-  };
-  var initializeModules = function() {
-    modules.forEach(function(module) {
-      module(scope);
-    });
-  };
-  scope.addModule = addModule;
-  scope.initializeModules = initializeModules;
-})(window.HTMLImports);
-
-window.HTMLImports.addModule(function(scope) {
-  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-  var path = {
-    resolveUrlsInStyle: function(style, linkUrl) {
-      var doc = style.ownerDocument;
-      var resolver = doc.createElement("a");
-      style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver);
-      return style;
-    },
-    resolveUrlsInCssText: function(cssText, linkUrl, urlObj) {
-      var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP);
-      r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP);
-      return r;
-    },
-    replaceUrls: function(text, urlObj, linkUrl, regexp) {
-      return text.replace(regexp, function(m, pre, url, post) {
-        var urlPath = url.replace(/["']/g, "");
-        if (linkUrl) {
-          urlPath = new URL(urlPath, linkUrl).href;
-        }
-        urlObj.href = urlPath;
-        urlPath = urlObj.href;
-        return pre + "'" + urlPath + "'" + post;
-      });
-    }
-  };
-  scope.path = path;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var xhr = {
-    async: true,
-    ok: function(request) {
-      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
-    },
-    load: function(url, next, nextContext) {
-      var request = new XMLHttpRequest();
-      if (scope.flags.debug || scope.flags.bust) {
-        url += "?" + Math.random();
-      }
-      request.open("GET", url, xhr.async);
-      request.addEventListener("readystatechange", function(e) {
-        if (request.readyState === 4) {
-          var redirectedUrl = null;
-          try {
-            var locationHeader = request.getResponseHeader("Location");
-            if (locationHeader) {
-              redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
-            }
-          } catch (e) {
-            console.error(e.message);
-          }
-          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
-        }
-      });
-      request.send();
-      return request;
-    },
-    loadDocument: function(url, next, nextContext) {
-      this.load(url, next, nextContext).responseType = "document";
-    }
-  };
-  scope.xhr = xhr;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var xhr = scope.xhr;
-  var flags = scope.flags;
-  var Loader = function(onLoad, onComplete) {
-    this.cache = {};
-    this.onload = onLoad;
-    this.oncomplete = onComplete;
-    this.inflight = 0;
-    this.pending = {};
-  };
-  Loader.prototype = {
-    addNodes: function(nodes) {
-      this.inflight += nodes.length;
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        this.require(n);
-      }
-      this.checkDone();
-    },
-    addNode: function(node) {
-      this.inflight++;
-      this.require(node);
-      this.checkDone();
-    },
-    require: function(elt) {
-      var url = elt.src || elt.href;
-      elt.__nodeUrl = url;
-      if (!this.dedupe(url, elt)) {
-        this.fetch(url, elt);
-      }
-    },
-    dedupe: function(url, elt) {
-      if (this.pending[url]) {
-        this.pending[url].push(elt);
-        return true;
-      }
-      var resource;
-      if (this.cache[url]) {
-        this.onload(url, elt, this.cache[url]);
-        this.tail();
-        return true;
-      }
-      this.pending[url] = [ elt ];
-      return false;
-    },
-    fetch: function(url, elt) {
-      flags.load && console.log("fetch", url, elt);
-      if (!url) {
-        setTimeout(function() {
-          this.receive(url, elt, {
-            error: "href must be specified"
-          }, null);
-        }.bind(this), 0);
-      } else if (url.match(/^data:/)) {
-        var pieces = url.split(",");
-        var header = pieces[0];
-        var body = pieces[1];
-        if (header.indexOf(";base64") > -1) {
-          body = atob(body);
-        } else {
-          body = decodeURIComponent(body);
-        }
-        setTimeout(function() {
-          this.receive(url, elt, null, body);
-        }.bind(this), 0);
-      } else {
-        var receiveXhr = function(err, resource, redirectedUrl) {
-          this.receive(url, elt, err, resource, redirectedUrl);
-        }.bind(this);
-        xhr.load(url, receiveXhr);
-      }
-    },
-    receive: function(url, elt, err, resource, redirectedUrl) {
-      this.cache[url] = resource;
-      var $p = this.pending[url];
-      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
-        this.onload(url, p, resource, err, redirectedUrl);
-        this.tail();
-      }
-      this.pending[url] = null;
-    },
-    tail: function() {
-      --this.inflight;
-      this.checkDone();
-    },
-    checkDone: function() {
-      if (!this.inflight) {
-        this.oncomplete();
-      }
-    }
-  };
-  scope.Loader = Loader;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var Observer = function(addCallback) {
-    this.addCallback = addCallback;
-    this.mo = new MutationObserver(this.handler.bind(this));
-  };
-  Observer.prototype = {
-    handler: function(mutations) {
-      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
-        if (m.type === "childList" && m.addedNodes.length) {
-          this.addedNodes(m.addedNodes);
-        }
-      }
-    },
-    addedNodes: function(nodes) {
-      if (this.addCallback) {
-        this.addCallback(nodes);
-      }
-      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
-        if (n.children && n.children.length) {
-          this.addedNodes(n.children);
-        }
-      }
-    },
-    observe: function(root) {
-      this.mo.observe(root, {
-        childList: true,
-        subtree: true
-      });
-    }
-  };
-  scope.Observer = Observer;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var path = scope.path;
-  var rootDocument = scope.rootDocument;
-  var flags = scope.flags;
-  var isIE = scope.isIE;
-  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
-  var importParser = {
-    documentSelectors: IMPORT_SELECTOR,
-    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","),
-    map: {
-      link: "parseLink",
-      script: "parseScript",
-      style: "parseStyle"
-    },
-    dynamicElements: [],
-    parseNext: function() {
-      var next = this.nextToParse();
-      if (next) {
-        this.parse(next);
-      }
-    },
-    parse: function(elt) {
-      if (this.isParsed(elt)) {
-        flags.parse && console.log("[%s] is already parsed", elt.localName);
-        return;
-      }
-      var fn = this[this.map[elt.localName]];
-      if (fn) {
-        this.markParsing(elt);
-        fn.call(this, elt);
-      }
-    },
-    parseDynamic: function(elt, quiet) {
-      this.dynamicElements.push(elt);
-      if (!quiet) {
-        this.parseNext();
-      }
-    },
-    markParsing: function(elt) {
-      flags.parse && console.log("parsing", elt);
-      this.parsingElement = elt;
-    },
-    markParsingComplete: function(elt) {
-      elt.__importParsed = true;
-      this.markDynamicParsingComplete(elt);
-      if (elt.__importElement) {
-        elt.__importElement.__importParsed = true;
-        this.markDynamicParsingComplete(elt.__importElement);
-      }
-      this.parsingElement = null;
-      flags.parse && console.log("completed", elt);
-    },
-    markDynamicParsingComplete: function(elt) {
-      var i = this.dynamicElements.indexOf(elt);
-      if (i >= 0) {
-        this.dynamicElements.splice(i, 1);
-      }
-    },
-    parseImport: function(elt) {
-      elt.import = elt.__doc;
-      if (window.HTMLImports.__importsParsingHook) {
-        window.HTMLImports.__importsParsingHook(elt);
-      }
-      if (elt.import) {
-        elt.import.__importParsed = true;
-      }
-      this.markParsingComplete(elt);
-      if (elt.__resource && !elt.__error) {
-        elt.dispatchEvent(new CustomEvent("load", {
-          bubbles: false
-        }));
-      } else {
-        elt.dispatchEvent(new CustomEvent("error", {
-          bubbles: false
-        }));
-      }
-      if (elt.__pending) {
-        var fn;
-        while (elt.__pending.length) {
-          fn = elt.__pending.shift();
-          if (fn) {
-            fn({
-              target: elt
-            });
-          }
-        }
-      }
-      this.parseNext();
-    },
-    parseLink: function(linkElt) {
-      if (nodeIsImport(linkElt)) {
-        this.parseImport(linkElt);
-      } else {
-        linkElt.href = linkElt.href;
-        this.parseGeneric(linkElt);
-      }
-    },
-    parseStyle: function(elt) {
-      var src = elt;
-      elt = cloneStyle(elt);
-      src.__appliedElement = elt;
-      elt.__importElement = src;
-      this.parseGeneric(elt);
-    },
-    parseGeneric: function(elt) {
-      this.trackElement(elt);
-      this.addElementToDocument(elt);
-    },
-    rootImportForElement: function(elt) {
-      var n = elt;
-      while (n.ownerDocument.__importLink) {
-        n = n.ownerDocument.__importLink;
-      }
-      return n;
-    },
-    addElementToDocument: function(elt) {
-      var port = this.rootImportForElement(elt.__importElement || elt);
-      port.parentNode.insertBefore(elt, port);
-    },
-    trackElement: function(elt, callback) {
-      var self = this;
-      var done = function(e) {
-        elt.removeEventListener("load", done);
-        elt.removeEventListener("error", done);
-        if (callback) {
-          callback(e);
-        }
-        self.markParsingComplete(elt);
-        self.parseNext();
-      };
-      elt.addEventListener("load", done);
-      elt.addEventListener("error", done);
-      if (isIE && elt.localName === "style") {
-        var fakeLoad = false;
-        if (elt.textContent.indexOf("@import") == -1) {
-          fakeLoad = true;
-        } else if (elt.sheet) {
-          fakeLoad = true;
-          var csr = elt.sheet.cssRules;
-          var len = csr ? csr.length : 0;
-          for (var i = 0, r; i < len && (r = csr[i]); i++) {
-            if (r.type === CSSRule.IMPORT_RULE) {
-              fakeLoad = fakeLoad && Boolean(r.styleSheet);
-            }
-          }
-        }
-        if (fakeLoad) {
-          setTimeout(function() {
-            elt.dispatchEvent(new CustomEvent("load", {
-              bubbles: false
-            }));
-          });
-        }
-      }
-    },
-    parseScript: function(scriptElt) {
-      var script = document.createElement("script");
-      script.__importElement = scriptElt;
-      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
-      scope.currentScript = scriptElt;
-      this.trackElement(script, function(e) {
-        if (script.parentNode) {
-          script.parentNode.removeChild(script);
-        }
-        scope.currentScript = null;
-      });
-      this.addElementToDocument(script);
-    },
-    nextToParse: function() {
-      this._mayParse = [];
-      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
-    },
-    nextToParseInDoc: function(doc, link) {
-      if (doc && this._mayParse.indexOf(doc) < 0) {
-        this._mayParse.push(doc);
-        for (const child of doc.body.children) {
-          if (['link', 'script', 'style'].includes(child.tagName.toLowerCase())) continue;
-          if (child.__importParsed) continue;
-          child.__importParsed = true;
-          document.body.appendChild(child);
-        }
-        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
-        for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-          if (!this.isParsed(n)) {
-            if (this.hasResource(n)) {
-              return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n;
-            } else {
-              return;
-            }
-          }
-        }
-      }
-      return link;
-    },
-    nextToParseDynamic: function() {
-      return this.dynamicElements[0];
-    },
-    parseSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
-    },
-    isParsed: function(node) {
-      return node.__importParsed;
-    },
-    needsDynamicParsing: function(elt) {
-      return this.dynamicElements.indexOf(elt) >= 0;
-    },
-    hasResource: function(node) {
-      if (nodeIsImport(node) && node.__doc === undefined) {
-        return false;
-      }
-      return true;
-    }
-  };
-  function nodeIsImport(elt) {
-    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
-  }
-  function generateScriptDataUrl(script) {
-    var scriptContent = generateScriptContent(script);
-    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
-  }
-  function generateScriptContent(script) {
-    return script.textContent + generateSourceMapHint(script);
-  }
-  function generateSourceMapHint(script) {
-    var owner = script.ownerDocument;
-    owner.__importedScripts = owner.__importedScripts || 0;
-    var moniker = script.ownerDocument.baseURI;
-    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
-    owner.__importedScripts++;
-    return "\n//# sourceURL=" + moniker + num + ".js\n";
-  }
-  function cloneStyle(style) {
-    var clone = style.ownerDocument.createElement("style");
-    clone.textContent = style.textContent;
-    path.resolveUrlsInStyle(clone);
-    return clone;
-  }
-  scope.parser = importParser;
-  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var flags = scope.flags;
-  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
-  var rootDocument = scope.rootDocument;
-  var Loader = scope.Loader;
-  var Observer = scope.Observer;
-  var parser = scope.parser;
-  var importer = {
-    documents: {},
-    documentPreloadSelectors: IMPORT_SELECTOR,
-    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
-    loadNode: function(node) {
-      importLoader.addNode(node);
-    },
-    loadSubtree: function(parent) {
-      var nodes = this.marshalNodes(parent);
-      importLoader.addNodes(nodes);
-    },
-    marshalNodes: function(parent) {
-      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
-    },
-    loadSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
-    },
-    loaded: function(url, elt, resource, err, redirectedUrl) {
-      flags.load && console.log("loaded", url, elt);
-      elt.__resource = resource;
-      elt.__error = err;
-      if (isImportLink(elt)) {
-        var doc = this.documents[url];
-        if (doc === undefined) {
-          doc = err ? null : makeDocument(resource, redirectedUrl || url);
-          if (doc) {
-            doc.__importLink = elt;
-            this.bootDocument(doc);
-          }
-          this.documents[url] = doc;
-        }
-        elt.__doc = doc;
-      }
-      parser.parseNext();
-    },
-    bootDocument: function(doc) {
-      this.loadSubtree(doc);
-      this.observer.observe(doc);
-      parser.parseNext();
-    },
-    loadedAll: function() {
-      parser.parseNext();
-    }
-  };
-  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
-  importer.observer = new Observer();
-  function isImportLink(elt) {
-    return isLinkRel(elt, IMPORT_LINK_TYPE);
-  }
-  function isLinkRel(elt, rel) {
-    return elt.localName === "link" && elt.getAttribute("rel") === rel;
-  }
-  function hasBaseURIAccessor(doc) {
-    return !!Object.getOwnPropertyDescriptor(doc, "baseURI");
-  }
-  function makeDocument(resource, url) {
-    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
-    doc._URL = url;
-    var base = doc.createElement("base");
-    base.setAttribute("href", url);
-    if (!doc.baseURI && !hasBaseURIAccessor(doc)) {
-      Object.defineProperty(doc, "baseURI", {
-        value: url
-      });
-    }
-    var meta = doc.createElement("meta");
-    meta.setAttribute("charset", "utf-8");
-    doc.head.appendChild(meta);
-    doc.head.appendChild(base);
-    doc.body.innerHTML = resource;
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(doc);
-    }
-    return doc;
-  }
-  if (!document.baseURI) {
-    var baseURIDescriptor = {
-      get: function() {
-        var base = document.querySelector("base");
-        return base ? base.href : window.location.href;
-      },
-      configurable: true
-    };
-    Object.defineProperty(document, "baseURI", baseURIDescriptor);
-    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
-  }
-  scope.importer = importer;
-  scope.importLoader = importLoader;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var parser = scope.parser;
-  var importer = scope.importer;
-  var dynamic = {
-    added: function(nodes) {
-      var owner, parsed, loading;
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        if (!owner) {
-          owner = n.ownerDocument;
-          parsed = parser.isParsed(owner);
-        }
-        loading = this.shouldLoadNode(n);
-        if (loading) {
-          importer.loadNode(n);
-        }
-        if (this.shouldParseNode(n) && parsed) {
-          parser.parseDynamic(n, loading);
-        }
-      }
-    },
-    shouldLoadNode: function(node) {
-      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
-    },
-    shouldParseNode: function(node) {
-      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
-    }
-  };
-  importer.observer.addCallback = dynamic.added.bind(dynamic);
-  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
-});
-
-(function(scope) {
-  var initializeModules = scope.initializeModules;
-  var isIE = scope.isIE;
-  if (scope.useNative) {
-    return;
-  }
-  initializeModules();
-  var rootDocument = scope.rootDocument;
-  function bootstrap() {
-    window.HTMLImports.importer.bootDocument(rootDocument);
-  }
-  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
-    bootstrap();
-  } else {
-    document.addEventListener("DOMContentLoaded", bootstrap);
-  }
-})(window.HTMLImports);
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/HTMLImports.min.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/HTMLImports.min.js
deleted file mode 100644
index e89492c..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/HTMLImports.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),function(e){function t(e){E.push(e),g||(g=!0,f(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=E;E=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++_}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function c(e,t){return y=new s(e,t)}function u(e){return L?L:(L=d(y),L.oldValue=e,L)}function l(){y=L=void 0}function h(e){return e===L||e===y}function m(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var f,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))f=setTimeout;else if(window.setImmediate)f=window.setImmediate;else{var w=[],b=String(Math.random());window.addEventListener("message",function(e){if(e.data===b){var t=w;w=[],t.forEach(function(e){e()})}}),f=function(e){w.push(e),window.postMessage(b,"*")}}var g=!1,E=[],_=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=v.get(e);r||v.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new p(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var y,L;p.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=m(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new c("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=c("characterData",r),a=e.prevValue;i(r,function(e){if(e.characterData)return e.characterDataOldValue?u(a):o});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,d,h=e.target;"DOMNodeInserted"===e.type?(s=[h],d=[]):(s=[],d=[h]);var m=h.previousSibling,p=h.nextSibling,o=c("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=d,o.previousSibling=m,o.nextSibling=p,i(e.relatedNode,function(e){if(e.childList)return o})}l()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function r(e,t){if(n(t))e&&e();else{var o=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(b,o),r(e,t))};t.addEventListener(b,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){d==c&&e&&e({allImports:s,loadedImports:u,errorImports:l})}function r(e){o(e),u.push(this),d++,n()}function i(e){l.push(this),d++,n()}var s=t.querySelectorAll("link[rel=import]"),d=0,c=s.length,u=[],l=[];if(c)for(var h,m=0;m<c&&(h=s[m]);m++)a(h)?(u.push(this),d++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)d(t)&&c(t)}function d(e){return"link"===e.localName&&"import"===e.rel}function c(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),m=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=m(document),f={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return m(e)},configurable:!0};Object.defineProperty(document,"_currentScript",f),Object.defineProperty(p,"_currentScript",f);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",b="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;n<r&&(e=t[n]);n++)c(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,d=a.length;s<d&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,d=e.flags,c=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(d.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){d.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,d.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),c&&"style"===e.localName){var o=!1;if(e.textContent.indexOf("@import")==-1)o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,d=0;d<s&&(i=a[d]);d++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;i<a&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,d=e.rootDocument,c=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){m.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);m.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===d?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var d=this.documents[e];void 0===d&&(d=a?null:o(r,s||e),d&&(d.__importLink=n,this.bootDocument(d)),this.documents[e]=d),n.__doc=d}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},m=new c(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(d,"baseURI",p)}e.importer=h,e.importLoader=m}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,d=e.length;s<d&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/MutationObserver.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/MutationObserver.js
deleted file mode 100644
index 204de7d..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/MutationObserver.js
+++ /dev/null
@@ -1,350 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-if (typeof WeakMap === "undefined") {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-    var WeakMap = function() {
-      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
-    };
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
-          value: [ key, value ],
-          writable: true
-        });
-        return this;
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
-      },
-      "delete": function(key) {
-        var entry = key[this.name];
-        if (!entry || entry[0] !== key) return false;
-        entry[0] = entry[1] = undefined;
-        return true;
-      },
-      has: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        return entry[0] === key;
-      }
-    };
-    window.WeakMap = WeakMap;
-  })();
-}
-
-(function(global) {
-  if (global.JsMutationObserver) {
-    return;
-  }
-  var registrationsTable = new WeakMap();
-  var setImmediate;
-  if (/Trident|Edge/.test(navigator.userAgent)) {
-    setImmediate = setTimeout;
-  } else if (window.setImmediate) {
-    setImmediate = window.setImmediate;
-  } else {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener("message", function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, "*");
-    };
-  }
-  var isScheduled = false;
-  var scheduledObservers = [];
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
-  }
-  function dispatchCallbacks() {
-    isScheduled = false;
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-      var queue = observer.takeRecords();
-      removeTransientObserversFor(observer);
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-    if (anyNonEmpty) dispatchCallbacks();
-  }
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations) return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer) registration.removeTransientObservers();
-      });
-    });
-  }
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-          if (node !== target && !options.subtree) continue;
-          var record = callback(options);
-          if (record) registration.enqueue(record);
-        }
-      }
-    }
-  }
-  var uidCounter = 0;
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
-        throw new SyntaxError();
-      }
-      var registrations = registrationsTable.get(target);
-      if (!registrations) registrationsTable.set(target, registrations = []);
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-      registration.addListeners();
-    },
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  }
-  var currentRecord, recordWithOldValue;
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue) return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord) return lastRecord;
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
-    return null;
-  }
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-      records[length] = record;
-    },
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
-    },
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
-    },
-    addTransientObserver: function(node) {
-      if (node === this.target) return;
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations) registrationsTable.set(node, registrations = []);
-      registrations.push(this);
-    },
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-      transientObservedNodes.forEach(function(node) {
-        this.removeListeners_(node);
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-    },
-    handleEvent: function(e) {
-      e.stopImmediatePropagation();
-      switch (e.type) {
-       case "DOMAttrModified":
-        var name = e.attrName;
-        var namespace = e.relatedNode.namespaceURI;
-        var target = e.target;
-        var record = new getRecord("attributes", target);
-        record.attributeName = name;
-        record.attributeNamespace = namespace;
-        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.attributes) return;
-          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
-            return;
-          }
-          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMCharacterDataModified":
-        var target = e.target;
-        var record = getRecord("characterData", target);
-        var oldValue = e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.characterData) return;
-          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMNodeRemoved":
-        this.addTransientObserver(e.target);
-
-       case "DOMNodeInserted":
-        var changedNode = e.target;
-        var addedNodes, removedNodes;
-        if (e.type === "DOMNodeInserted") {
-          addedNodes = [ changedNode ];
-          removedNodes = [];
-        } else {
-          addedNodes = [];
-          removedNodes = [ changedNode ];
-        }
-        var previousSibling = changedNode.previousSibling;
-        var nextSibling = changedNode.nextSibling;
-        var record = getRecord("childList", e.target.parentNode);
-        record.addedNodes = addedNodes;
-        record.removedNodes = removedNodes;
-        record.previousSibling = previousSibling;
-        record.nextSibling = nextSibling;
-        forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
-          if (!options.childList) return;
-          return record;
-        });
-      }
-      clearRecords();
-    }
-  };
-  global.JsMutationObserver = JsMutationObserver;
-  if (!global.MutationObserver) {
-    global.MutationObserver = JsMutationObserver;
-    JsMutationObserver._isPolyfilled = true;
-  }
-})(self);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/MutationObserver.min.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/MutationObserver.min.js
deleted file mode 100644
index a97c624..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/MutationObserver.min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,r=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};r.prototype={set:function(t,r){var i=t[this.name];return i&&i[0]===t?i[1]=r:e(t,this.name,{value:[t,r],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=r}(),function(e){function t(e){N.push(e),O||(O=!0,b(i))}function r(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function i(){O=!1;var e=N;N=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var r=e.takeRecords();n(e),r.length&&(e.callback_(r,e),t=!0)}),t&&i()}function n(e){e.nodes_.forEach(function(t){var r=p.get(t);r&&r.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function a(e,t){for(var r=e;r;r=r.parentNode){var i=p.get(r);if(i)for(var n=0;n<i.length;n++){var a=i[n],s=a.options;if(r===e||s.subtree){var o=t(s);o&&a.enqueue(o)}}}}function s(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++M}function o(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function d(e){var t=new o(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function u(e,t){return D=new o(e,t)}function h(e){return w?w:(w=d(D),w.oldValue=e,w)}function c(){D=w=void 0}function v(e){return e===w||e===D}function l(e,t){return e===t?e:w&&v(e)?w:null}function f(e,t,r){this.observer=e,this.target=t,this.options=r,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var b,p=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))b=setTimeout;else if(window.setImmediate)b=window.setImmediate;else{var g=[],m=String(Math.random());window.addEventListener("message",function(e){if(e.data===m){var t=g;g=[],t.forEach(function(e){e()})}}),b=function(e){g.push(e),window.postMessage(m,"*")}}var O=!1,N=[],M=0;s.prototype={observe:function(e,t){if(e=r(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var i=p.get(e);i||p.set(e,i=[]);for(var n,a=0;a<i.length;a++)if(i[a].observer===this){n=i[a],n.removeListeners(),n.options=t;break}n||(n=new f(this,e,t),i.push(n),this.nodes_.push(e)),n.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=p.get(e),r=0;r<t.length;r++){var i=t[r];if(i.observer===this){i.removeListeners(),t.splice(r,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var D,w;f.prototype={enqueue:function(e){var r=this.observer.records_,i=r.length;if(r.length>0){var n=r[i-1],a=l(n,e);if(a)return void(r[i-1]=a)}else t(this.observer);r[i]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=p.get(e);t||p.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=p.get(e),r=0;r<t.length;r++)if(t[r]===this){t.splice(r,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,r=e.relatedNode.namespaceURI,i=e.target,n=new u("attributes",i);n.attributeName=t,n.attributeNamespace=r;var s=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;a(i,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(r)!==-1))return e.attributeOldValue?h(s):n});break;case"DOMCharacterDataModified":var i=e.target,n=u("characterData",i),s=e.prevValue;a(i,function(e){if(e.characterData)return e.characterDataOldValue?h(s):n});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var o,d,v=e.target;"DOMNodeInserted"===e.type?(o=[v],d=[]):(o=[],d=[v]);var l=v.previousSibling,f=v.nextSibling,n=u("childList",e.target.parentNode);n.addedNodes=o,n.removedNodes=d,n.previousSibling=l,n.nextSibling=f,a(e.relatedNode,function(e){if(e.childList)return n})}c()}},e.JsMutationObserver=s,e.MutationObserver||(e.MutationObserver=s,s._isPolyfilled=!0)}}(self);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/README.md b/systrace/catapult/third_party/polymer/components/webcomponentsjs/README.md
deleted file mode 100644
index d92ed6f..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/README.md
+++ /dev/null
@@ -1,155 +0,0 @@
-webcomponents.js
-================
-
-[![Build Status](https://travis-ci.org/webcomponents/webcomponentsjs.svg?branch=master)](https://travis-ci.org/webcomponents/webcomponentsjs)
-
-A suite of polyfills supporting the [Web Components](http://webcomponents.org) specs:
-
-**Custom Elements**: allows authors to define their own custom tags ([spec](https://w3c.github.io/webcomponents/spec/custom/)).
-
-**HTML Imports**: a way to include and reuse HTML documents via other HTML documents ([spec](https://w3c.github.io/webcomponents/spec/imports/)).
-
-**Shadow DOM**: provides encapsulation by hiding DOM subtrees under shadow roots ([spec](https://w3c.github.io/webcomponents/spec/shadow/)).
-
-This also folds in polyfills for `MutationObserver` and `WeakMap`.
-
-
-## Releases
-
-Pre-built (concatenated & minified) versions of the polyfills are maintained in the [tagged versions](https://github.com/webcomponents/webcomponentsjs/releases) of this repo. There are two variants:
-
-`webcomponents.js` includes all of the polyfills.
-
-`webcomponents-lite.js` includes all polyfills except for shadow DOM.
-
-
-## Browser Support
-
-Our polyfills are intended to work in the latest versions of evergreen browsers. See below
-for our complete browser support matrix:
-
-| Polyfill   | IE10 | IE11+ | Chrome* | Firefox* | Safari 7+* | Chrome Android* | Mobile Safari* |
-| ---------- |:----:|:-----:|:-------:|:--------:|:----------:|:---------------:|:--------------:|
-| Custom Elements | ~ | ✓ | ✓ | ✓ | ✓ | ✓| ✓ |
-| HTML Imports | ~ | ✓ | ✓ | ✓ | ✓| ✓| ✓ |
-| Shadow DOM | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
-| Templates | ✓ | ✓ | ✓ | ✓| ✓ | ✓ | ✓ |
-
-
-*Indicates the current version of the browser
-
-~Indicates support may be flaky. If using Custom Elements or HTML Imports with Shadow DOM,
-you will get the non-flaky Mutation Observer polyfill that Shadow DOM includes.
-
-The polyfills may work in older browsers, however require additional polyfills (such as classList)
-to be used. We cannot guarantee support for browsers outside of our compatibility matrix.
-
-
-### Manually Building
-
-If you wish to build the polyfills yourself, you'll need `node` and `gulp` on your system:
-
- * install [node.js](http://nodejs.org/) using the instructions on their website
- * use `npm` to install [gulp.js](http://gulpjs.com/): `npm install -g gulp`
-
-Now you are ready to build the polyfills with:
-
-    # install dependencies
-    npm install
-    # build
-    gulp build
-
-The builds will be placed into the `dist/` directory.
-
-## Contribute
-
-See the [contributing guide](CONTRIBUTING.md)
-
-## License
-
-Everything in this repository is BSD style license unless otherwise specified.
-
-Copyright (c) 2015 The Polymer Authors. All rights reserved.
-
-## Helper utilities
-
-### `WebComponentsReady`
-
-Under native HTML Imports, `<script>` tags in the main document block the loading of such imports. This is to ensure the imports have loaded and any registered elements in them have been upgraded. 
-
-The webcomponents.js and webcomponents-lite.js polyfills parse element definitions and handle their upgrade asynchronously. If prematurely fetching the element from the DOM before it has an opportunity to upgrade, you'll be working with an `HTMLUnknownElement`. 
-
-For these situations (or when you need an approximate replacement for the Polymer 0.5 `polymer-ready` behavior), you can use the `WebComponentsReady` event as a signal before interacting with the element. The criteria for this event to fire is all Custom Elements with definitions registered by the time HTML Imports available at load time have loaded have upgraded.
-
-```js
-window.addEventListener('WebComponentsReady', function(e) {
-  // imports are loaded and elements have been registered
-  console.log('Components are ready');
-});
-```
-
-## Known Issues
-
-  * [Limited CSS encapsulation](#encapsulation)
-  * [Element wrapping / unwrapping limitations](#wrapping)
-  * [Custom element's constructor property is unreliable](#constructor)
-  * [Contenteditable elements do not trigger MutationObserver](#contentedit)
-  * [ShadowCSS: :host-context(...):host(...) doesn't work](#hostcontext)
-  * [ShadowCSS: :host(.zot:not(.bar:nth-child(2))) doesn't work](#nestedparens)
-  * [HTML imports: document.currentScript doesn't work as expected](#currentscript)
-  * [execCommand isn't supported under Shadow DOM](#execcommand)
-
-### Limited CSS encapsulation <a id="encapsulation"></a>
-Under native Shadow DOM, CSS selectors cannot cross the shadow boundary. This means document level styles don't apply to shadow roots, and styles defined within a shadow root don't apply outside of that shadow root. [Several selectors](http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/) are provided to be able to deal with the shadow boundary.
-
-The Shadow DOM polyfill can't prevent document styles from leaking into shadow roots. It can, however, encapsulate styles within shadow roots to some extent. This behavior isn't automatically emulated by the Shadow DOM polyfill, but it can be achieved by manually using the included ShadowCSS shim:
-
-```
-WebComponents.ShadowCSS.shimStyling( shadowRoot, scope );
-```
-
-... where `shadowRoot` is the shadow root of a DOM element, and `scope` is the name of the scope used to prefix the selectors. This removes all `<style>` elements from the shadow root, rewrites it rules using the given scope and reinserts the style as a document level stylesheet. Note that the `:host` and `:host-context` pseudo classes are also rewritten.
-
-For a full explanation on the implementation and both the possibilities and the limitations of ShadowCSS please view the documentation in the [ShadowCSS source](src/ShadowCSS/ShadowCSS.js).
-
-### Element wrapping / unwrapping limitations <a id="wrapping"></a>
-The Shadow DOM polyfill is implemented by [wrapping](http://webcomponents.org/polyfills/shadow-dom/#wrappers) DOM elements whenever possible. It does this by wrapping methods like `document.querySelector` to return wrapped DOM elements. This has a few caveats:
-   * Not _everything_ can be wrapped. For example, elements like `document`, `window`, `document.body`, `document.fullscreenElement` and others are non-configurable and thus cannot be overridden.
-   * Wrappers don't support [live NodeLists](https://developer.mozilla.org/en-US/docs/Web/API/NodeList#A_sometimes-live_collection) like `HTMLElement.childNodes` and `HTMLFormElement.elements`. All NodeLists are snapshotted upon read. See [#217](https://github.com/webcomponents/webcomponentsjs/issues/217) for an explanation.
-
-In order to work around these limitations the polyfill provides the `ShadowDOMPolyfill.wrap` and `ShadowDOMPolyfill.unwrap` methods to respectively wrap and unwrap DOM elements manually.
-
-### Custom element's constructor property is unreliable <a id="constructor"></a>
-See [#215](https://github.com/webcomponents/webcomponentsjs/issues/215) for background.
-
-In Safari and IE, instances of Custom Elements have a `constructor` property of `HTMLUnknownElementConstructor` and `HTMLUnknownElement`, respectively. It's unsafe to rely on this property for checking element types.
-
-It's worth noting that `customElement.__proto__.__proto__.constructor` is `HTMLElementPrototype` and that the prototype chain isn't modified by the polyfills(onto `ElementPrototype`, etc.)
-
-### Contenteditable elements do not trigger MutationObserver <a id="contentedit"></a>
-Using the MutationObserver polyfill, it isn't possible to monitor mutations of an element marked `contenteditable`.
-See [the mailing list](https://groups.google.com/forum/#!msg/polymer-dev/LHdtRVXXVsA/v1sGoiTYWUkJ)
-
-### ShadowCSS: :host-context(...):host(...) doesn't work <a id="hostcontext"></a>
-See [#16](https://github.com/webcomponents/webcomponentsjs/issues/16) for background.
-
-Under the shadow DOM polyfill, rules like:
-```
-:host-context(.foo):host(.bar) {...}
-```
-don't work, despite working under native Shadow DOM. The solution is to use `polyfill-next-selector` like:
-
-```
-polyfill-next-selector { content: '.foo :host.bar, :host.foo.bar'; }
-```
-
-### ShadowCSS: :host(.zot:not(.bar:nth-child(2))) doesn't work <a id="nestedparens"></a>
-ShadowCSS `:host()` rules can only have (at most) 1-level of nested parentheses in its argument selector under ShadowCSS. For example, `:host(.zot)` and `:host(.zot:not(.bar))` both work, but `:host(.zot:not(.bar:nth-child(2)))` does not. 
-
-### HTML imports: document.currentScript doesn't work as expected <a id="currentscript"></a>
-In native HTML Imports, document.currentScript.ownerDocument references the import document itself. In the polyfill use document._currentScript.ownerDocument (note the underscore).
-
-### execCommand and contenteditable isn't supported under Shadow DOM <a id="execcommand"></a>
-See [#212](https://github.com/webcomponents/webcomponentsjs/issues/212)
-
-`execCommand`, and `contenteditable` aren't supported under the ShadowDOM polyfill, with commands that insert or remove nodes being especially prone to failure.
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/ShadowDOM.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/ShadowDOM.js
deleted file mode 100644
index 5198975..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/ShadowDOM.js
+++ /dev/null
@@ -1,4496 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-if (typeof WeakMap === "undefined") {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-    var WeakMap = function() {
-      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
-    };
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
-          value: [ key, value ],
-          writable: true
-        });
-        return this;
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
-      },
-      "delete": function(key) {
-        var entry = key[this.name];
-        if (!entry || entry[0] !== key) return false;
-        entry[0] = entry[1] = undefined;
-        return true;
-      },
-      has: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        return entry[0] === key;
-      }
-    };
-    window.WeakMap = WeakMap;
-  })();
-}
-
-window.ShadowDOMPolyfill = {};
-
-(function(scope) {
-  "use strict";
-  var constructorTable = new WeakMap();
-  var nativePrototypeTable = new WeakMap();
-  var wrappers = Object.create(null);
-  function detectEval() {
-    if (typeof chrome !== "undefined" && chrome.app && chrome.app.runtime) {
-      return false;
-    }
-    if (navigator.getDeviceStorage) {
-      return false;
-    }
-    try {
-      var f = new Function("return true;");
-      return f();
-    } catch (ex) {
-      return false;
-    }
-  }
-  var hasEval = detectEval();
-  function assert(b) {
-    if (!b) throw new Error("Assertion failed");
-  }
-  var defineProperty = Object.defineProperty;
-  var getOwnPropertyNames = Object.getOwnPropertyNames;
-  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-  function mixin(to, from) {
-    var names = getOwnPropertyNames(from);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    }
-    return to;
-  }
-  function mixinStatics(to, from) {
-    var names = getOwnPropertyNames(from);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
-      switch (name) {
-       case "arguments":
-       case "caller":
-       case "length":
-       case "name":
-       case "prototype":
-       case "toString":
-        continue;
-      }
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    }
-    return to;
-  }
-  function oneOf(object, propertyNames) {
-    for (var i = 0; i < propertyNames.length; i++) {
-      if (propertyNames[i] in object) return propertyNames[i];
-    }
-  }
-  var nonEnumerableDataDescriptor = {
-    value: undefined,
-    configurable: true,
-    enumerable: false,
-    writable: true
-  };
-  function defineNonEnumerableDataProperty(object, name, value) {
-    nonEnumerableDataDescriptor.value = value;
-    defineProperty(object, name, nonEnumerableDataDescriptor);
-  }
-  getOwnPropertyNames(window);
-  function getWrapperConstructor(node, opt_instance) {
-    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
-    if (isFirefox) {
-      try {
-        getOwnPropertyNames(nativePrototype);
-      } catch (error) {
-        nativePrototype = nativePrototype.__proto__;
-      }
-    }
-    var wrapperConstructor = constructorTable.get(nativePrototype);
-    if (wrapperConstructor) return wrapperConstructor;
-    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
-    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
-    registerInternal(nativePrototype, GeneratedWrapper, opt_instance);
-    return GeneratedWrapper;
-  }
-  function addForwardingProperties(nativePrototype, wrapperPrototype) {
-    installProperty(nativePrototype, wrapperPrototype, true);
-  }
-  function registerInstanceProperties(wrapperPrototype, instanceObject) {
-    installProperty(instanceObject, wrapperPrototype, false);
-  }
-  var isFirefox = /Firefox/.test(navigator.userAgent);
-  var dummyDescriptor = {
-    get: function() {},
-    set: function(v) {},
-    configurable: true,
-    enumerable: true
-  };
-  function isEventHandlerName(name) {
-    return /^on[a-z]+$/.test(name);
-  }
-  function isIdentifierName(name) {
-    return /^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(name);
-  }
-  function getGetter(name) {
-    return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name) : function() {
-      return this.__impl4cf1e782hg__[name];
-    };
-  }
-  function getSetter(name) {
-    return hasEval && isIdentifierName(name) ? new Function("v", "this.__impl4cf1e782hg__." + name + " = v") : function(v) {
-      this.__impl4cf1e782hg__[name] = v;
-    };
-  }
-  function getMethod(name) {
-    return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name + ".apply(this.__impl4cf1e782hg__, arguments)") : function() {
-      return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);
-    };
-  }
-  function getDescriptor(source, name) {
-    try {
-      if (source === window && name === "showModalDialog") {
-        return dummyDescriptor;
-      }
-      return Object.getOwnPropertyDescriptor(source, name);
-    } catch (ex) {
-      return dummyDescriptor;
-    }
-  }
-  var isBrokenSafari = function() {
-    var descr = Object.getOwnPropertyDescriptor(Node.prototype, "nodeType");
-    return descr && !descr.get && !descr.set;
-  }();
-  function installProperty(source, target, allowMethod, opt_blacklist) {
-    var names = getOwnPropertyNames(source);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
-      if (name === "polymerBlackList_") continue;
-      if (name in target) continue;
-      if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;
-      if (isFirefox) {
-        source.__lookupGetter__(name);
-      }
-      var descriptor = getDescriptor(source, name);
-      var getter, setter;
-      if (typeof descriptor.value === "function") {
-        if (allowMethod) {
-          target[name] = getMethod(name);
-        }
-        continue;
-      }
-      var isEvent = isEventHandlerName(name);
-      if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);
-      if (descriptor.writable || descriptor.set || isBrokenSafari) {
-        if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);
-      }
-      var configurable = isBrokenSafari || descriptor.configurable;
-      defineProperty(target, name, {
-        get: getter,
-        set: setter,
-        configurable: configurable,
-        enumerable: descriptor.enumerable
-      });
-    }
-  }
-  function register(nativeConstructor, wrapperConstructor, opt_instance) {
-    if (nativeConstructor == null) {
-      return;
-    }
-    var nativePrototype = nativeConstructor.prototype;
-    registerInternal(nativePrototype, wrapperConstructor, opt_instance);
-    mixinStatics(wrapperConstructor, nativeConstructor);
-  }
-  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
-    var wrapperPrototype = wrapperConstructor.prototype;
-    assert(constructorTable.get(nativePrototype) === undefined);
-    constructorTable.set(nativePrototype, wrapperConstructor);
-    nativePrototypeTable.set(wrapperPrototype, nativePrototype);
-    addForwardingProperties(nativePrototype, wrapperPrototype);
-    if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);
-    defineNonEnumerableDataProperty(wrapperPrototype, "constructor", wrapperConstructor);
-    wrapperConstructor.prototype = wrapperPrototype;
-  }
-  function isWrapperFor(wrapperConstructor, nativeConstructor) {
-    return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;
-  }
-  function registerObject(object) {
-    var nativePrototype = Object.getPrototypeOf(object);
-    var superWrapperConstructor = getWrapperConstructor(nativePrototype);
-    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
-    registerInternal(nativePrototype, GeneratedWrapper, object);
-    return GeneratedWrapper;
-  }
-  function createWrapperConstructor(superWrapperConstructor) {
-    function GeneratedWrapper(node) {
-      superWrapperConstructor.call(this, node);
-    }
-    var p = Object.create(superWrapperConstructor.prototype);
-    p.constructor = GeneratedWrapper;
-    GeneratedWrapper.prototype = p;
-    return GeneratedWrapper;
-  }
-  function isWrapper(object) {
-    return object && object.__impl4cf1e782hg__;
-  }
-  function isNative(object) {
-    return !isWrapper(object);
-  }
-  function wrap(impl) {
-    if (impl === null) return null;
-    assert(isNative(impl));
-    var wrapper = impl.__wrapper8e3dd93a60__;
-    if (wrapper != null) {
-      return wrapper;
-    }
-    return impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl, impl))(impl);
-  }
-  function unwrap(wrapper) {
-    if (wrapper === null) return null;
-    assert(isWrapper(wrapper));
-    return wrapper.__impl4cf1e782hg__;
-  }
-  function unsafeUnwrap(wrapper) {
-    return wrapper.__impl4cf1e782hg__;
-  }
-  function setWrapper(impl, wrapper) {
-    wrapper.__impl4cf1e782hg__ = impl;
-    impl.__wrapper8e3dd93a60__ = wrapper;
-  }
-  function unwrapIfNeeded(object) {
-    return object && isWrapper(object) ? unwrap(object) : object;
-  }
-  function wrapIfNeeded(object) {
-    return object && !isWrapper(object) ? wrap(object) : object;
-  }
-  function rewrap(node, wrapper) {
-    if (wrapper === null) return;
-    assert(isNative(node));
-    assert(wrapper === undefined || isWrapper(wrapper));
-    node.__wrapper8e3dd93a60__ = wrapper;
-  }
-  var getterDescriptor = {
-    get: undefined,
-    configurable: true,
-    enumerable: true
-  };
-  function defineGetter(constructor, name, getter) {
-    getterDescriptor.get = getter;
-    defineProperty(constructor.prototype, name, getterDescriptor);
-  }
-  function defineWrapGetter(constructor, name) {
-    defineGetter(constructor, name, function() {
-      return wrap(this.__impl4cf1e782hg__[name]);
-    });
-  }
-  function forwardMethodsToWrapper(constructors, names) {
-    constructors.forEach(function(constructor) {
-      names.forEach(function(name) {
-        constructor.prototype[name] = function() {
-          var w = wrapIfNeeded(this);
-          return w[name].apply(w, arguments);
-        };
-      });
-    });
-  }
-  scope.addForwardingProperties = addForwardingProperties;
-  scope.assert = assert;
-  scope.constructorTable = constructorTable;
-  scope.defineGetter = defineGetter;
-  scope.defineWrapGetter = defineWrapGetter;
-  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
-  scope.isIdentifierName = isIdentifierName;
-  scope.isWrapper = isWrapper;
-  scope.isWrapperFor = isWrapperFor;
-  scope.mixin = mixin;
-  scope.nativePrototypeTable = nativePrototypeTable;
-  scope.oneOf = oneOf;
-  scope.registerObject = registerObject;
-  scope.registerWrapper = register;
-  scope.rewrap = rewrap;
-  scope.setWrapper = setWrapper;
-  scope.unsafeUnwrap = unsafeUnwrap;
-  scope.unwrap = unwrap;
-  scope.unwrapIfNeeded = unwrapIfNeeded;
-  scope.wrap = wrap;
-  scope.wrapIfNeeded = wrapIfNeeded;
-  scope.wrappers = wrappers;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  function newSplice(index, removed, addedCount) {
-    return {
-      index: index,
-      removed: removed,
-      addedCount: addedCount
-    };
-  }
-  var EDIT_LEAVE = 0;
-  var EDIT_UPDATE = 1;
-  var EDIT_ADD = 2;
-  var EDIT_DELETE = 3;
-  function ArraySplice() {}
-  ArraySplice.prototype = {
-    calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
-      var rowCount = oldEnd - oldStart + 1;
-      var columnCount = currentEnd - currentStart + 1;
-      var distances = new Array(rowCount);
-      for (var i = 0; i < rowCount; i++) {
-        distances[i] = new Array(columnCount);
-        distances[i][0] = i;
-      }
-      for (var j = 0; j < columnCount; j++) distances[0][j] = j;
-      for (var i = 1; i < rowCount; i++) {
-        for (var j = 1; j < columnCount; j++) {
-          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else {
-            var north = distances[i - 1][j] + 1;
-            var west = distances[i][j - 1] + 1;
-            distances[i][j] = north < west ? north : west;
-          }
-        }
-      }
-      return distances;
-    },
-    spliceOperationsFromEditDistances: function(distances) {
-      var i = distances.length - 1;
-      var j = distances[0].length - 1;
-      var current = distances[i][j];
-      var edits = [];
-      while (i > 0 || j > 0) {
-        if (i == 0) {
-          edits.push(EDIT_ADD);
-          j--;
-          continue;
-        }
-        if (j == 0) {
-          edits.push(EDIT_DELETE);
-          i--;
-          continue;
-        }
-        var northWest = distances[i - 1][j - 1];
-        var west = distances[i - 1][j];
-        var north = distances[i][j - 1];
-        var min;
-        if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;
-        if (min == northWest) {
-          if (northWest == current) {
-            edits.push(EDIT_LEAVE);
-          } else {
-            edits.push(EDIT_UPDATE);
-            current = northWest;
-          }
-          i--;
-          j--;
-        } else if (min == west) {
-          edits.push(EDIT_DELETE);
-          i--;
-          current = west;
-        } else {
-          edits.push(EDIT_ADD);
-          j--;
-          current = north;
-        }
-      }
-      edits.reverse();
-      return edits;
-    },
-    calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
-      var prefixCount = 0;
-      var suffixCount = 0;
-      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-      if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);
-      if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-      currentStart += prefixCount;
-      oldStart += prefixCount;
-      currentEnd -= suffixCount;
-      oldEnd -= suffixCount;
-      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];
-      if (currentStart == currentEnd) {
-        var splice = newSplice(currentStart, [], 0);
-        while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);
-        return [ splice ];
-      } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];
-      var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
-      var splice = undefined;
-      var splices = [];
-      var index = currentStart;
-      var oldIndex = oldStart;
-      for (var i = 0; i < ops.length; i++) {
-        switch (ops[i]) {
-         case EDIT_LEAVE:
-          if (splice) {
-            splices.push(splice);
-            splice = undefined;
-          }
-          index++;
-          oldIndex++;
-          break;
-
-         case EDIT_UPDATE:
-          if (!splice) splice = newSplice(index, [], 0);
-          splice.addedCount++;
-          index++;
-          splice.removed.push(old[oldIndex]);
-          oldIndex++;
-          break;
-
-         case EDIT_ADD:
-          if (!splice) splice = newSplice(index, [], 0);
-          splice.addedCount++;
-          index++;
-          break;
-
-         case EDIT_DELETE:
-          if (!splice) splice = newSplice(index, [], 0);
-          splice.removed.push(old[oldIndex]);
-          oldIndex++;
-          break;
-        }
-      }
-      if (splice) {
-        splices.push(splice);
-      }
-      return splices;
-    },
-    sharedPrefix: function(current, old, searchLength) {
-      for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;
-      return searchLength;
-    },
-    sharedSuffix: function(current, old, searchLength) {
-      var index1 = current.length;
-      var index2 = old.length;
-      var count = 0;
-      while (count < searchLength && this.equals(current[--index1], old[--index2])) count++;
-      return count;
-    },
-    calculateSplices: function(current, previous) {
-      return this.calcSplices(current, 0, current.length, previous, 0, previous.length);
-    },
-    equals: function(currentValue, previousValue) {
-      return currentValue === previousValue;
-    }
-  };
-  scope.ArraySplice = ArraySplice;
-})(window.ShadowDOMPolyfill);
-
-(function(context) {
-  "use strict";
-  var OriginalMutationObserver = window.MutationObserver;
-  var callbacks = [];
-  var pending = false;
-  var timerFunc;
-  function handle() {
-    pending = false;
-    var copies = callbacks.slice(0);
-    callbacks = [];
-    for (var i = 0; i < copies.length; i++) {
-      (0, copies[i])();
-    }
-  }
-  if (OriginalMutationObserver) {
-    var counter = 1;
-    var observer = new OriginalMutationObserver(handle);
-    var textNode = document.createTextNode(counter);
-    observer.observe(textNode, {
-      characterData: true
-    });
-    timerFunc = function() {
-      counter = (counter + 1) % 2;
-      textNode.data = counter;
-    };
-  } else {
-    timerFunc = window.setTimeout;
-  }
-  function setEndOfMicrotask(func) {
-    callbacks.push(func);
-    if (pending) return;
-    pending = true;
-    timerFunc(handle, 0);
-  }
-  context.setEndOfMicrotask = setEndOfMicrotask;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var setEndOfMicrotask = scope.setEndOfMicrotask;
-  var wrapIfNeeded = scope.wrapIfNeeded;
-  var wrappers = scope.wrappers;
-  var registrationsTable = new WeakMap();
-  var globalMutationObservers = [];
-  var isScheduled = false;
-  function scheduleCallback(observer) {
-    if (observer.scheduled_) return;
-    observer.scheduled_ = true;
-    globalMutationObservers.push(observer);
-    if (isScheduled) return;
-    setEndOfMicrotask(notifyObservers);
-    isScheduled = true;
-  }
-  function notifyObservers() {
-    isScheduled = false;
-    while (globalMutationObservers.length) {
-      var notifyList = globalMutationObservers;
-      globalMutationObservers = [];
-      notifyList.sort(function(x, y) {
-        return x.uid_ - y.uid_;
-      });
-      for (var i = 0; i < notifyList.length; i++) {
-        var mo = notifyList[i];
-        mo.scheduled_ = false;
-        var queue = mo.takeRecords();
-        removeTransientObserversFor(mo);
-        if (queue.length) {
-          mo.callback_(queue, mo);
-        }
-      }
-    }
-  }
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = new wrappers.NodeList();
-    this.removedNodes = new wrappers.NodeList();
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-  function registerTransientObservers(ancestor, node) {
-    for (;ancestor; ancestor = ancestor.parentNode) {
-      var registrations = registrationsTable.get(ancestor);
-      if (!registrations) continue;
-      for (var i = 0; i < registrations.length; i++) {
-        var registration = registrations[i];
-        if (registration.options.subtree) registration.addTransientObserver(node);
-      }
-    }
-  }
-  function removeTransientObserversFor(observer) {
-    for (var i = 0; i < observer.nodes_.length; i++) {
-      var node = observer.nodes_[i];
-      var registrations = registrationsTable.get(node);
-      if (!registrations) return;
-      for (var j = 0; j < registrations.length; j++) {
-        var registration = registrations[j];
-        if (registration.observer === observer) registration.removeTransientObservers();
-      }
-    }
-  }
-  function enqueueMutation(target, type, data) {
-    var interestedObservers = Object.create(null);
-    var associatedStrings = Object.create(null);
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations) continue;
-      for (var j = 0; j < registrations.length; j++) {
-        var registration = registrations[j];
-        var options = registration.options;
-        if (node !== target && !options.subtree) continue;
-        if (type === "attributes" && !options.attributes) continue;
-        if (type === "attributes" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {
-          continue;
-        }
-        if (type === "characterData" && !options.characterData) continue;
-        if (type === "childList" && !options.childList) continue;
-        var observer = registration.observer;
-        interestedObservers[observer.uid_] = observer;
-        if (type === "attributes" && options.attributeOldValue || type === "characterData" && options.characterDataOldValue) {
-          associatedStrings[observer.uid_] = data.oldValue;
-        }
-      }
-    }
-    for (var uid in interestedObservers) {
-      var observer = interestedObservers[uid];
-      var record = new MutationRecord(type, target);
-      if ("name" in data && "namespace" in data) {
-        record.attributeName = data.name;
-        record.attributeNamespace = data.namespace;
-      }
-      if (data.addedNodes) record.addedNodes = data.addedNodes;
-      if (data.removedNodes) record.removedNodes = data.removedNodes;
-      if (data.previousSibling) record.previousSibling = data.previousSibling;
-      if (data.nextSibling) record.nextSibling = data.nextSibling;
-      if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];
-      scheduleCallback(observer);
-      observer.records_.push(record);
-    }
-  }
-  var slice = Array.prototype.slice;
-  function MutationObserverOptions(options) {
-    this.childList = !!options.childList;
-    this.subtree = !!options.subtree;
-    if (!("attributes" in options) && ("attributeOldValue" in options || "attributeFilter" in options)) {
-      this.attributes = true;
-    } else {
-      this.attributes = !!options.attributes;
-    }
-    if ("characterDataOldValue" in options && !("characterData" in options)) this.characterData = true; else this.characterData = !!options.characterData;
-    if (!this.attributes && (options.attributeOldValue || "attributeFilter" in options) || !this.characterData && options.characterDataOldValue) {
-      throw new TypeError();
-    }
-    this.characterData = !!options.characterData;
-    this.attributeOldValue = !!options.attributeOldValue;
-    this.characterDataOldValue = !!options.characterDataOldValue;
-    if ("attributeFilter" in options) {
-      if (options.attributeFilter == null || typeof options.attributeFilter !== "object") {
-        throw new TypeError();
-      }
-      this.attributeFilter = slice.call(options.attributeFilter);
-    } else {
-      this.attributeFilter = null;
-    }
-  }
-  var uidCounter = 0;
-  function MutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-    this.scheduled_ = false;
-  }
-  MutationObserver.prototype = {
-    constructor: MutationObserver,
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-      var newOptions = new MutationObserverOptions(options);
-      var registration;
-      var registrations = registrationsTable.get(target);
-      if (!registrations) registrationsTable.set(target, registrations = []);
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeTransientObservers();
-          registration.options = newOptions;
-        }
-      }
-      if (!registration) {
-        registration = new Registration(this, target, newOptions);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-    },
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-  Registration.prototype = {
-    addTransientObserver: function(node) {
-      if (node === this.target) return;
-      scheduleCallback(this.observer);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations) registrationsTable.set(node, registrations = []);
-      registrations.push(this);
-    },
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-      for (var i = 0; i < transientObservedNodes.length; i++) {
-        var node = transientObservedNodes[i];
-        var registrations = registrationsTable.get(node);
-        for (var j = 0; j < registrations.length; j++) {
-          if (registrations[j] === this) {
-            registrations.splice(j, 1);
-            break;
-          }
-        }
-      }
-    }
-  };
-  scope.enqueueMutation = enqueueMutation;
-  scope.registerTransientObservers = registerTransientObservers;
-  scope.wrappers.MutationObserver = MutationObserver;
-  scope.wrappers.MutationRecord = MutationRecord;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  function TreeScope(root, parent) {
-    this.root = root;
-    this.parent = parent;
-  }
-  TreeScope.prototype = {
-    get renderer() {
-      if (this.root instanceof scope.wrappers.ShadowRoot) {
-        return scope.getRendererForHost(this.root.host);
-      }
-      return null;
-    },
-    contains: function(treeScope) {
-      for (;treeScope; treeScope = treeScope.parent) {
-        if (treeScope === this) return true;
-      }
-      return false;
-    }
-  };
-  function setTreeScope(node, treeScope) {
-    if (node.treeScope_ !== treeScope) {
-      node.treeScope_ = treeScope;
-      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
-        sr.treeScope_.parent = treeScope;
-      }
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        setTreeScope(child, treeScope);
-      }
-    }
-  }
-  function getTreeScope(node) {
-    if (node instanceof scope.wrappers.Window) {
-      debugger;
-    }
-    if (node.treeScope_) return node.treeScope_;
-    var parent = node.parentNode;
-    var treeScope;
-    if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);
-    return node.treeScope_ = treeScope;
-  }
-  scope.TreeScope = TreeScope;
-  scope.getTreeScope = getTreeScope;
-  scope.setTreeScope = setTreeScope;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrappers = scope.wrappers;
-  var wrappedFuns = new WeakMap();
-  var listenersTable = new WeakMap();
-  var handledEventsTable = new WeakMap();
-  var currentlyDispatchingEvents = new WeakMap();
-  var targetTable = new WeakMap();
-  var currentTargetTable = new WeakMap();
-  var relatedTargetTable = new WeakMap();
-  var eventPhaseTable = new WeakMap();
-  var stopPropagationTable = new WeakMap();
-  var stopImmediatePropagationTable = new WeakMap();
-  var eventHandlersTable = new WeakMap();
-  var eventPathTable = new WeakMap();
-  function isShadowRoot(node) {
-    return node instanceof wrappers.ShadowRoot;
-  }
-  function rootOfNode(node) {
-    return getTreeScope(node).root;
-  }
-  function getEventPath(node, event) {
-    var path = [];
-    var current = node;
-    path.push(current);
-    while (current) {
-      var destinationInsertionPoints = getDestinationInsertionPoints(current);
-      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {
-        for (var i = 0; i < destinationInsertionPoints.length; i++) {
-          var insertionPoint = destinationInsertionPoints[i];
-          if (isShadowInsertionPoint(insertionPoint)) {
-            var shadowRoot = rootOfNode(insertionPoint);
-            var olderShadowRoot = shadowRoot.olderShadowRoot;
-            if (olderShadowRoot) path.push(olderShadowRoot);
-          }
-          path.push(insertionPoint);
-        }
-        current = destinationInsertionPoints[destinationInsertionPoints.length - 1];
-      } else {
-        if (isShadowRoot(current)) {
-          if (inSameTree(node, current) && eventMustBeStopped(event)) {
-            break;
-          }
-          current = current.host;
-          path.push(current);
-        } else {
-          current = current.parentNode;
-          if (current) path.push(current);
-        }
-      }
-    }
-    return path;
-  }
-  function eventMustBeStopped(event) {
-    if (!event) return false;
-    switch (event.type) {
-     case "abort":
-     case "error":
-     case "select":
-     case "change":
-     case "load":
-     case "reset":
-     case "resize":
-     case "scroll":
-     case "selectstart":
-      return true;
-    }
-    return false;
-  }
-  function isShadowInsertionPoint(node) {
-    return node instanceof HTMLShadowElement;
-  }
-  function getDestinationInsertionPoints(node) {
-    return scope.getDestinationInsertionPoints(node);
-  }
-  function eventRetargetting(path, currentTarget) {
-    if (path.length === 0) return currentTarget;
-    if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
-    var currentTargetTree = getTreeScope(currentTarget);
-    var originalTarget = path[0];
-    var originalTargetTree = getTreeScope(originalTarget);
-    var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);
-    for (var i = 0; i < path.length; i++) {
-      var node = path[i];
-      if (getTreeScope(node) === relativeTargetTree) return node;
-    }
-    return path[path.length - 1];
-  }
-  function getTreeScopeAncestors(treeScope) {
-    var ancestors = [];
-    for (;treeScope; treeScope = treeScope.parent) {
-      ancestors.push(treeScope);
-    }
-    return ancestors;
-  }
-  function lowestCommonInclusiveAncestor(tsA, tsB) {
-    var ancestorsA = getTreeScopeAncestors(tsA);
-    var ancestorsB = getTreeScopeAncestors(tsB);
-    var result = null;
-    while (ancestorsA.length > 0 && ancestorsB.length > 0) {
-      var a = ancestorsA.pop();
-      var b = ancestorsB.pop();
-      if (a === b) result = a; else break;
-    }
-    return result;
-  }
-  function getTreeScopeRoot(ts) {
-    if (!ts.parent) return ts;
-    return getTreeScopeRoot(ts.parent);
-  }
-  function relatedTargetResolution(event, currentTarget, relatedTarget) {
-    if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
-    var currentTargetTree = getTreeScope(currentTarget);
-    var relatedTargetTree = getTreeScope(relatedTarget);
-    var relatedTargetEventPath = getEventPath(relatedTarget, event);
-    var lowestCommonAncestorTree;
-    var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);
-    if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;
-    for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {
-      var adjustedRelatedTarget;
-      for (var i = 0; i < relatedTargetEventPath.length; i++) {
-        var node = relatedTargetEventPath[i];
-        if (getTreeScope(node) === commonAncestorTree) return node;
-      }
-    }
-    return null;
-  }
-  function inSameTree(a, b) {
-    return getTreeScope(a) === getTreeScope(b);
-  }
-  var NONE = 0;
-  var CAPTURING_PHASE = 1;
-  var AT_TARGET = 2;
-  var BUBBLING_PHASE = 3;
-  var pendingError;
-  function dispatchOriginalEvent(originalEvent) {
-    if (handledEventsTable.get(originalEvent)) return;
-    handledEventsTable.set(originalEvent, true);
-    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
-    if (pendingError) {
-      var err = pendingError;
-      pendingError = null;
-      throw err;
-    }
-  }
-  function isLoadLikeEvent(event) {
-    switch (event.type) {
-     case "load":
-     case "beforeunload":
-     case "unload":
-      return true;
-    }
-    return false;
-  }
-  function dispatchEvent(event, originalWrapperTarget) {
-    if (currentlyDispatchingEvents.get(event)) throw new Error("InvalidStateError");
-    currentlyDispatchingEvents.set(event, true);
-    scope.renderAllPending();
-    var eventPath;
-    var overrideTarget;
-    var win;
-    if (isLoadLikeEvent(event) && !event.bubbles) {
-      var doc = originalWrapperTarget;
-      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
-        overrideTarget = doc;
-        eventPath = [];
-      }
-    }
-    if (!eventPath) {
-      if (originalWrapperTarget instanceof wrappers.Window) {
-        win = originalWrapperTarget;
-        eventPath = [];
-      } else {
-        eventPath = getEventPath(originalWrapperTarget, event);
-        if (!isLoadLikeEvent(event)) {
-          var doc = eventPath[eventPath.length - 1];
-          if (doc instanceof wrappers.Document) win = doc.defaultView;
-        }
-      }
-    }
-    eventPathTable.set(event, eventPath);
-    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {
-      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {
-        dispatchBubbling(event, eventPath, win, overrideTarget);
-      }
-    }
-    eventPhaseTable.set(event, NONE);
-    currentTargetTable.delete(event, null);
-    currentlyDispatchingEvents.delete(event);
-    return event.defaultPrevented;
-  }
-  function dispatchCapturing(event, eventPath, win, overrideTarget) {
-    var phase = CAPTURING_PHASE;
-    if (win) {
-      if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;
-    }
-    for (var i = eventPath.length - 1; i > 0; i--) {
-      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;
-    }
-    return true;
-  }
-  function dispatchAtTarget(event, eventPath, win, overrideTarget) {
-    var phase = AT_TARGET;
-    var currentTarget = eventPath[0] || win;
-    return invoke(currentTarget, event, phase, eventPath, overrideTarget);
-  }
-  function dispatchBubbling(event, eventPath, win, overrideTarget) {
-    var phase = BUBBLING_PHASE;
-    for (var i = 1; i < eventPath.length; i++) {
-      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return;
-    }
-    if (win && eventPath.length > 0) {
-      invoke(win, event, phase, eventPath, overrideTarget);
-    }
-  }
-  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {
-    var listeners = listenersTable.get(currentTarget);
-    if (!listeners) return true;
-    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);
-    if (target === currentTarget) {
-      if (phase === CAPTURING_PHASE) return true;
-      if (phase === BUBBLING_PHASE) phase = AT_TARGET;
-    } else if (phase === BUBBLING_PHASE && !event.bubbles) {
-      return true;
-    }
-    if ("relatedTarget" in event) {
-      var originalEvent = unwrap(event);
-      var unwrappedRelatedTarget = originalEvent.relatedTarget;
-      if (unwrappedRelatedTarget) {
-        if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {
-          var relatedTarget = wrap(unwrappedRelatedTarget);
-          var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);
-          if (adjusted === target) return true;
-        } else {
-          adjusted = null;
-        }
-        relatedTargetTable.set(event, adjusted);
-      }
-    }
-    eventPhaseTable.set(event, phase);
-    var type = event.type;
-    var anyRemoved = false;
-    targetTable.set(event, target);
-    currentTargetTable.set(event, currentTarget);
-    listeners.depth++;
-    for (var i = 0, len = listeners.length; i < len; i++) {
-      var listener = listeners[i];
-      if (listener.removed) {
-        anyRemoved = true;
-        continue;
-      }
-      if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {
-        continue;
-      }
-      try {
-        if (typeof listener.handler === "function") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);
-        if (stopImmediatePropagationTable.get(event)) return false;
-      } catch (ex) {
-        if (!pendingError) pendingError = ex;
-      }
-    }
-    listeners.depth--;
-    if (anyRemoved && listeners.depth === 0) {
-      var copy = listeners.slice();
-      listeners.length = 0;
-      for (var i = 0; i < copy.length; i++) {
-        if (!copy[i].removed) listeners.push(copy[i]);
-      }
-    }
-    return !stopPropagationTable.get(event);
-  }
-  function Listener(type, handler, capture) {
-    this.type = type;
-    this.handler = handler;
-    this.capture = Boolean(capture);
-  }
-  Listener.prototype = {
-    equals: function(that) {
-      return this.handler === that.handler && this.type === that.type && this.capture === that.capture;
-    },
-    get removed() {
-      return this.handler === null;
-    },
-    remove: function() {
-      this.handler = null;
-    }
-  };
-  var OriginalEvent = window.Event;
-  OriginalEvent.prototype.polymerBlackList_ = {
-    returnValue: true,
-    keyLocation: true
-  };
-  function Event(type, options) {
-    if (type instanceof OriginalEvent) {
-      var impl = type;
-      if (!OriginalBeforeUnloadEvent && impl.type === "beforeunload" && !(this instanceof BeforeUnloadEvent)) {
-        return new BeforeUnloadEvent(impl);
-      }
-      setWrapper(impl, this);
-    } else {
-      return wrap(constructEvent(OriginalEvent, "Event", type, options));
-    }
-  }
-  Event.prototype = {
-    get target() {
-      return targetTable.get(this);
-    },
-    get currentTarget() {
-      return currentTargetTable.get(this);
-    },
-    get eventPhase() {
-      return eventPhaseTable.get(this);
-    },
-    get path() {
-      var eventPath = eventPathTable.get(this);
-      if (!eventPath) return [];
-      return eventPath.slice();
-    },
-    stopPropagation: function() {
-      stopPropagationTable.set(this, true);
-    },
-    stopImmediatePropagation: function() {
-      stopPropagationTable.set(this, true);
-      stopImmediatePropagationTable.set(this, true);
-    }
-  };
-  var supportsDefaultPrevented = function() {
-    var e = document.createEvent("Event");
-    e.initEvent("test", true, true);
-    e.preventDefault();
-    return e.defaultPrevented;
-  }();
-  if (!supportsDefaultPrevented) {
-    Event.prototype.preventDefault = function() {
-      if (!this.cancelable) return;
-      unsafeUnwrap(this).preventDefault();
-      Object.defineProperty(this, "defaultPrevented", {
-        get: function() {
-          return true;
-        },
-        configurable: true
-      });
-    };
-  }
-  registerWrapper(OriginalEvent, Event, document.createEvent("Event"));
-  function unwrapOptions(options) {
-    if (!options || !options.relatedTarget) return options;
-    return Object.create(options, {
-      relatedTarget: {
-        value: unwrap(options.relatedTarget)
-      }
-    });
-  }
-  function registerGenericEvent(name, SuperEvent, prototype) {
-    var OriginalEvent = window[name];
-    var GenericEvent = function(type, options) {
-      if (type instanceof OriginalEvent) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));
-    };
-    GenericEvent.prototype = Object.create(SuperEvent.prototype);
-    if (prototype) mixin(GenericEvent.prototype, prototype);
-    if (OriginalEvent) {
-      try {
-        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent("temp"));
-      } catch (ex) {
-        registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));
-      }
-    }
-    return GenericEvent;
-  }
-  var UIEvent = registerGenericEvent("UIEvent", Event);
-  var CustomEvent = registerGenericEvent("CustomEvent", Event);
-  var relatedTargetProto = {
-    get relatedTarget() {
-      var relatedTarget = relatedTargetTable.get(this);
-      if (relatedTarget !== undefined) return relatedTarget;
-      return wrap(unwrap(this).relatedTarget);
-    }
-  };
-  function getInitFunction(name, relatedTargetIndex) {
-    return function() {
-      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
-      var impl = unwrap(this);
-      impl[name].apply(impl, arguments);
-    };
-  }
-  var mouseEventProto = mixin({
-    initMouseEvent: getInitFunction("initMouseEvent", 14)
-  }, relatedTargetProto);
-  var focusEventProto = mixin({
-    initFocusEvent: getInitFunction("initFocusEvent", 5)
-  }, relatedTargetProto);
-  var MouseEvent = registerGenericEvent("MouseEvent", UIEvent, mouseEventProto);
-  var FocusEvent = registerGenericEvent("FocusEvent", UIEvent, focusEventProto);
-  var defaultInitDicts = Object.create(null);
-  var supportsEventConstructors = function() {
-    try {
-      new window.FocusEvent("focus");
-    } catch (ex) {
-      return false;
-    }
-    return true;
-  }();
-  function constructEvent(OriginalEvent, name, type, options) {
-    if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));
-    var event = unwrap(document.createEvent(name));
-    var defaultDict = defaultInitDicts[name];
-    var args = [ type ];
-    Object.keys(defaultDict).forEach(function(key) {
-      var v = options != null && key in options ? options[key] : defaultDict[key];
-      if (key === "relatedTarget") v = unwrap(v);
-      args.push(v);
-    });
-    event["init" + name].apply(event, args);
-    return event;
-  }
-  if (!supportsEventConstructors) {
-    var configureEventConstructor = function(name, initDict, superName) {
-      if (superName) {
-        var superDict = defaultInitDicts[superName];
-        initDict = mixin(mixin({}, superDict), initDict);
-      }
-      defaultInitDicts[name] = initDict;
-    };
-    configureEventConstructor("Event", {
-      bubbles: false,
-      cancelable: false
-    });
-    configureEventConstructor("CustomEvent", {
-      detail: null
-    }, "Event");
-    configureEventConstructor("UIEvent", {
-      view: null,
-      detail: 0
-    }, "Event");
-    configureEventConstructor("MouseEvent", {
-      screenX: 0,
-      screenY: 0,
-      clientX: 0,
-      clientY: 0,
-      ctrlKey: false,
-      altKey: false,
-      shiftKey: false,
-      metaKey: false,
-      button: 0,
-      relatedTarget: null
-    }, "UIEvent");
-    configureEventConstructor("FocusEvent", {
-      relatedTarget: null
-    }, "UIEvent");
-  }
-  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
-  function BeforeUnloadEvent(impl) {
-    Event.call(this, impl);
-  }
-  BeforeUnloadEvent.prototype = Object.create(Event.prototype);
-  mixin(BeforeUnloadEvent.prototype, {
-    get returnValue() {
-      return unsafeUnwrap(this).returnValue;
-    },
-    set returnValue(v) {
-      unsafeUnwrap(this).returnValue = v;
-    }
-  });
-  if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
-  function isValidListener(fun) {
-    if (typeof fun === "function") return true;
-    return fun && fun.handleEvent;
-  }
-  function isMutationEvent(type) {
-    switch (type) {
-     case "DOMAttrModified":
-     case "DOMAttributeNameChanged":
-     case "DOMCharacterDataModified":
-     case "DOMElementNameChanged":
-     case "DOMNodeInserted":
-     case "DOMNodeInsertedIntoDocument":
-     case "DOMNodeRemoved":
-     case "DOMNodeRemovedFromDocument":
-     case "DOMSubtreeModified":
-      return true;
-    }
-    return false;
-  }
-  var OriginalEventTarget = window.EventTarget;
-  function EventTarget(impl) {
-    setWrapper(impl, this);
-  }
-  var methodNames = [ "addEventListener", "removeEventListener", "dispatchEvent" ];
-  [ Node, Window ].forEach(function(constructor) {
-    var p = constructor.prototype;
-    methodNames.forEach(function(name) {
-      Object.defineProperty(p, name + "_", {
-        value: p[name]
-      });
-    });
-  });
-  function getTargetToListenAt(wrapper) {
-    if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;
-    return unwrap(wrapper);
-  }
-  EventTarget.prototype = {
-    addEventListener: function(type, fun, capture) {
-      if (!isValidListener(fun) || isMutationEvent(type)) return;
-      var listener = new Listener(type, fun, capture);
-      var listeners = listenersTable.get(this);
-      if (!listeners) {
-        listeners = [];
-        listeners.depth = 0;
-        listenersTable.set(this, listeners);
-      } else {
-        for (var i = 0; i < listeners.length; i++) {
-          if (listener.equals(listeners[i])) return;
-        }
-      }
-      listeners.push(listener);
-      var target = getTargetToListenAt(this);
-      target.addEventListener_(type, dispatchOriginalEvent, true);
-    },
-    removeEventListener: function(type, fun, capture) {
-      capture = Boolean(capture);
-      var listeners = listenersTable.get(this);
-      if (!listeners) return;
-      var count = 0, found = false;
-      for (var i = 0; i < listeners.length; i++) {
-        if (listeners[i].type === type && listeners[i].capture === capture) {
-          count++;
-          if (listeners[i].handler === fun) {
-            found = true;
-            listeners[i].remove();
-          }
-        }
-      }
-      if (found && count === 1) {
-        var target = getTargetToListenAt(this);
-        target.removeEventListener_(type, dispatchOriginalEvent, true);
-      }
-    },
-    dispatchEvent: function(event) {
-      var nativeEvent = unwrap(event);
-      var eventType = nativeEvent.type;
-      handledEventsTable.set(nativeEvent, false);
-      scope.renderAllPending();
-      var tempListener;
-      if (!hasListenerInAncestors(this, eventType)) {
-        tempListener = function() {};
-        this.addEventListener(eventType, tempListener, true);
-      }
-      try {
-        return unwrap(this).dispatchEvent_(nativeEvent);
-      } finally {
-        if (tempListener) this.removeEventListener(eventType, tempListener, true);
-      }
-    }
-  };
-  function hasListener(node, type) {
-    var listeners = listenersTable.get(node);
-    if (listeners) {
-      for (var i = 0; i < listeners.length; i++) {
-        if (!listeners[i].removed && listeners[i].type === type) return true;
-      }
-    }
-    return false;
-  }
-  function hasListenerInAncestors(target, type) {
-    for (var node = unwrap(target); node; node = node.parentNode) {
-      if (hasListener(wrap(node), type)) return true;
-    }
-    return false;
-  }
-  if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);
-  function wrapEventTargetMethods(constructors) {
-    forwardMethodsToWrapper(constructors, methodNames);
-  }
-  var originalElementFromPoint = document.elementFromPoint;
-  function elementFromPoint(self, document, x, y) {
-    scope.renderAllPending();
-    var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
-    if (!element) return null;
-    var path = getEventPath(element, null);
-    var idx = path.lastIndexOf(self);
-    if (idx == -1) return null; else path = path.slice(0, idx);
-    return eventRetargetting(path, self);
-  }
-  function getEventHandlerGetter(name) {
-    return function() {
-      var inlineEventHandlers = eventHandlersTable.get(this);
-      return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;
-    };
-  }
-  function getEventHandlerSetter(name) {
-    var eventType = name.slice(2);
-    return function(value) {
-      var inlineEventHandlers = eventHandlersTable.get(this);
-      if (!inlineEventHandlers) {
-        inlineEventHandlers = Object.create(null);
-        eventHandlersTable.set(this, inlineEventHandlers);
-      }
-      var old = inlineEventHandlers[name];
-      if (old) this.removeEventListener(eventType, old.wrapped, false);
-      if (typeof value === "function") {
-        var wrapped = function(e) {
-          var rv = value.call(this, e);
-          if (rv === false) e.preventDefault(); else if (name === "onbeforeunload" && typeof rv === "string") e.returnValue = rv;
-        };
-        this.addEventListener(eventType, wrapped, false);
-        inlineEventHandlers[name] = {
-          value: value,
-          wrapped: wrapped
-        };
-      }
-    };
-  }
-  scope.elementFromPoint = elementFromPoint;
-  scope.getEventHandlerGetter = getEventHandlerGetter;
-  scope.getEventHandlerSetter = getEventHandlerSetter;
-  scope.wrapEventTargetMethods = wrapEventTargetMethods;
-  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
-  scope.wrappers.CustomEvent = CustomEvent;
-  scope.wrappers.Event = Event;
-  scope.wrappers.EventTarget = EventTarget;
-  scope.wrappers.FocusEvent = FocusEvent;
-  scope.wrappers.MouseEvent = MouseEvent;
-  scope.wrappers.UIEvent = UIEvent;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var UIEvent = scope.wrappers.UIEvent;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-  var OriginalTouchEvent = window.TouchEvent;
-  if (!OriginalTouchEvent) return;
-  var nativeEvent;
-  try {
-    nativeEvent = document.createEvent("TouchEvent");
-  } catch (ex) {
-    return;
-  }
-  var nonEnumDescriptor = {
-    enumerable: false
-  };
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, nonEnumDescriptor);
-  }
-  function Touch(impl) {
-    setWrapper(impl, this);
-  }
-  Touch.prototype = {
-    get target() {
-      return wrap(unsafeUnwrap(this).target);
-    }
-  };
-  var descr = {
-    configurable: true,
-    enumerable: true,
-    get: null
-  };
-  [ "clientX", "clientY", "screenX", "screenY", "pageX", "pageY", "identifier", "webkitRadiusX", "webkitRadiusY", "webkitRotationAngle", "webkitForce" ].forEach(function(name) {
-    descr.get = function() {
-      return unsafeUnwrap(this)[name];
-    };
-    Object.defineProperty(Touch.prototype, name, descr);
-  });
-  function TouchList() {
-    this.length = 0;
-    nonEnum(this, "length");
-  }
-  TouchList.prototype = {
-    item: function(index) {
-      return this[index];
-    }
-  };
-  function wrapTouchList(nativeTouchList) {
-    var list = new TouchList();
-    for (var i = 0; i < nativeTouchList.length; i++) {
-      list[i] = new Touch(nativeTouchList[i]);
-    }
-    list.length = i;
-    return list;
-  }
-  function TouchEvent(impl) {
-    UIEvent.call(this, impl);
-  }
-  TouchEvent.prototype = Object.create(UIEvent.prototype);
-  mixin(TouchEvent.prototype, {
-    get touches() {
-      return wrapTouchList(unsafeUnwrap(this).touches);
-    },
-    get targetTouches() {
-      return wrapTouchList(unsafeUnwrap(this).targetTouches);
-    },
-    get changedTouches() {
-      return wrapTouchList(unsafeUnwrap(this).changedTouches);
-    },
-    initTouchEvent: function() {
-      throw new Error("Not implemented");
-    }
-  });
-  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
-  scope.wrappers.Touch = Touch;
-  scope.wrappers.TouchEvent = TouchEvent;
-  scope.wrappers.TouchList = TouchList;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-  var nonEnumDescriptor = {
-    enumerable: false
-  };
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, nonEnumDescriptor);
-  }
-  function NodeList() {
-    this.length = 0;
-    nonEnum(this, "length");
-  }
-  NodeList.prototype = {
-    item: function(index) {
-      return this[index];
-    }
-  };
-  nonEnum(NodeList.prototype, "item");
-  function wrapNodeList(list) {
-    if (list == null) return list;
-    var wrapperList = new NodeList();
-    for (var i = 0, length = list.length; i < length; i++) {
-      wrapperList[i] = wrap(list[i]);
-    }
-    wrapperList.length = length;
-    return wrapperList;
-  }
-  function addWrapNodeListMethod(wrapperConstructor, name) {
-    wrapperConstructor.prototype[name] = function() {
-      return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
-    };
-  }
-  scope.wrappers.NodeList = NodeList;
-  scope.addWrapNodeListMethod = addWrapNodeListMethod;
-  scope.wrapNodeList = wrapNodeList;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  scope.wrapHTMLCollection = scope.wrapNodeList;
-  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var EventTarget = scope.wrappers.EventTarget;
-  var NodeList = scope.wrappers.NodeList;
-  var TreeScope = scope.TreeScope;
-  var assert = scope.assert;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var enqueueMutation = scope.enqueueMutation;
-  var getTreeScope = scope.getTreeScope;
-  var isWrapper = scope.isWrapper;
-  var mixin = scope.mixin;
-  var registerTransientObservers = scope.registerTransientObservers;
-  var registerWrapper = scope.registerWrapper;
-  var setTreeScope = scope.setTreeScope;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var wrapIfNeeded = scope.wrapIfNeeded;
-  var wrappers = scope.wrappers;
-  function assertIsNodeWrapper(node) {
-    assert(node instanceof Node);
-  }
-  function createOneElementNodeList(node) {
-    var nodes = new NodeList();
-    nodes[0] = node;
-    nodes.length = 1;
-    return nodes;
-  }
-  var surpressMutations = false;
-  function enqueueRemovalForInsertedNodes(node, parent, nodes) {
-    enqueueMutation(parent, "childList", {
-      removedNodes: nodes,
-      previousSibling: node.previousSibling,
-      nextSibling: node.nextSibling
-    });
-  }
-  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
-    enqueueMutation(df, "childList", {
-      removedNodes: nodes
-    });
-  }
-  function collectNodes(node, parentNode, previousNode, nextNode) {
-    if (node instanceof DocumentFragment) {
-      var nodes = collectNodesForDocumentFragment(node);
-      surpressMutations = true;
-      for (var i = nodes.length - 1; i >= 0; i--) {
-        node.removeChild(nodes[i]);
-        nodes[i].parentNode_ = parentNode;
-      }
-      surpressMutations = false;
-      for (var i = 0; i < nodes.length; i++) {
-        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
-        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
-      }
-      if (previousNode) previousNode.nextSibling_ = nodes[0];
-      if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];
-      return nodes;
-    }
-    var nodes = createOneElementNodeList(node);
-    var oldParent = node.parentNode;
-    if (oldParent) {
-      oldParent.removeChild(node);
-    }
-    node.parentNode_ = parentNode;
-    node.previousSibling_ = previousNode;
-    node.nextSibling_ = nextNode;
-    if (previousNode) previousNode.nextSibling_ = node;
-    if (nextNode) nextNode.previousSibling_ = node;
-    return nodes;
-  }
-  function collectNodesNative(node) {
-    if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);
-    var nodes = createOneElementNodeList(node);
-    var oldParent = node.parentNode;
-    if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);
-    return nodes;
-  }
-  function collectNodesForDocumentFragment(node) {
-    var nodes = new NodeList();
-    var i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      nodes[i++] = child;
-    }
-    nodes.length = i;
-    enqueueRemovalForInsertedDocumentFragment(node, nodes);
-    return nodes;
-  }
-  function snapshotNodeList(nodeList) {
-    return nodeList;
-  }
-  function nodeWasAdded(node, treeScope) {
-    setTreeScope(node, treeScope);
-    node.nodeIsInserted_();
-  }
-  function nodesWereAdded(nodes, parent) {
-    var treeScope = getTreeScope(parent);
-    for (var i = 0; i < nodes.length; i++) {
-      nodeWasAdded(nodes[i], treeScope);
-    }
-  }
-  function nodeWasRemoved(node) {
-    setTreeScope(node, new TreeScope(node, null));
-  }
-  function nodesWereRemoved(nodes) {
-    for (var i = 0; i < nodes.length; i++) {
-      nodeWasRemoved(nodes[i]);
-    }
-  }
-  function ensureSameOwnerDocument(parent, child) {
-    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;
-    if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);
-  }
-  function adoptNodesIfNeeded(owner, nodes) {
-    if (!nodes.length) return;
-    var ownerDoc = owner.ownerDocument;
-    if (ownerDoc === nodes[0].ownerDocument) return;
-    for (var i = 0; i < nodes.length; i++) {
-      scope.adoptNodeNoRemove(nodes[i], ownerDoc);
-    }
-  }
-  function unwrapNodesForInsertion(owner, nodes) {
-    adoptNodesIfNeeded(owner, nodes);
-    var length = nodes.length;
-    if (length === 1) return unwrap(nodes[0]);
-    var df = unwrap(owner.ownerDocument.createDocumentFragment());
-    for (var i = 0; i < length; i++) {
-      df.appendChild(unwrap(nodes[i]));
-    }
-    return df;
-  }
-  function clearChildNodes(wrapper) {
-    if (wrapper.firstChild_ !== undefined) {
-      var child = wrapper.firstChild_;
-      while (child) {
-        var tmp = child;
-        child = child.nextSibling_;
-        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
-      }
-    }
-    wrapper.firstChild_ = wrapper.lastChild_ = undefined;
-  }
-  function removeAllChildNodes(wrapper) {
-    if (wrapper.invalidateShadowRenderer()) {
-      var childWrapper = wrapper.firstChild;
-      while (childWrapper) {
-        assert(childWrapper.parentNode === wrapper);
-        var nextSibling = childWrapper.nextSibling;
-        var childNode = unwrap(childWrapper);
-        var parentNode = childNode.parentNode;
-        if (parentNode) originalRemoveChild.call(parentNode, childNode);
-        childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = null;
-        childWrapper = nextSibling;
-      }
-      wrapper.firstChild_ = wrapper.lastChild_ = null;
-    } else {
-      var node = unwrap(wrapper);
-      var child = node.firstChild;
-      var nextSibling;
-      while (child) {
-        nextSibling = child.nextSibling;
-        originalRemoveChild.call(node, child);
-        child = nextSibling;
-      }
-    }
-  }
-  function invalidateParent(node) {
-    var p = node.parentNode;
-    return p && p.invalidateShadowRenderer();
-  }
-  function cleanupNodes(nodes) {
-    for (var i = 0, n; i < nodes.length; i++) {
-      n = nodes[i];
-      n.parentNode.removeChild(n);
-    }
-  }
-  var originalImportNode = document.importNode;
-  var originalCloneNode = window.Node.prototype.cloneNode;
-  function cloneNode(node, deep, opt_doc) {
-    var clone;
-    if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
-    if (deep) {
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        clone.appendChild(cloneNode(child, true, opt_doc));
-      }
-      if (node instanceof wrappers.HTMLTemplateElement) {
-        var cloneContent = clone.content;
-        for (var child = node.content.firstChild; child; child = child.nextSibling) {
-          cloneContent.appendChild(cloneNode(child, true, opt_doc));
-        }
-      }
-    }
-    return clone;
-  }
-  function contains(self, child) {
-    if (!child || getTreeScope(self) !== getTreeScope(child)) return false;
-    for (var node = child; node; node = node.parentNode) {
-      if (node === self) return true;
-    }
-    return false;
-  }
-  var OriginalNode = window.Node;
-  function Node(original) {
-    assert(original instanceof OriginalNode);
-    EventTarget.call(this, original);
-    this.parentNode_ = undefined;
-    this.firstChild_ = undefined;
-    this.lastChild_ = undefined;
-    this.nextSibling_ = undefined;
-    this.previousSibling_ = undefined;
-    this.treeScope_ = undefined;
-  }
-  var OriginalDocumentFragment = window.DocumentFragment;
-  var originalAppendChild = OriginalNode.prototype.appendChild;
-  var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;
-  var originalIsEqualNode = OriginalNode.prototype.isEqualNode;
-  var originalInsertBefore = OriginalNode.prototype.insertBefore;
-  var originalRemoveChild = OriginalNode.prototype.removeChild;
-  var originalReplaceChild = OriginalNode.prototype.replaceChild;
-  var isIEOrEdge = /Trident|Edge/.test(navigator.userAgent);
-  var removeChildOriginalHelper = isIEOrEdge ? function(parent, child) {
-    try {
-      originalRemoveChild.call(parent, child);
-    } catch (ex) {
-      if (!(parent instanceof OriginalDocumentFragment)) throw ex;
-    }
-  } : function(parent, child) {
-    originalRemoveChild.call(parent, child);
-  };
-  Node.prototype = Object.create(EventTarget.prototype);
-  mixin(Node.prototype, {
-    appendChild: function(childWrapper) {
-      return this.insertBefore(childWrapper, null);
-    },
-    insertBefore: function(childWrapper, refWrapper) {
-      assertIsNodeWrapper(childWrapper);
-      var refNode;
-      if (refWrapper) {
-        if (isWrapper(refWrapper)) {
-          refNode = unwrap(refWrapper);
-        } else {
-          refNode = refWrapper;
-          refWrapper = wrap(refNode);
-        }
-      } else {
-        refWrapper = null;
-        refNode = null;
-      }
-      refWrapper && assert(refWrapper.parentNode === this);
-      var nodes;
-      var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;
-      var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);
-      if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
-      if (useNative) {
-        ensureSameOwnerDocument(this, childWrapper);
-        clearChildNodes(this);
-        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);
-      } else {
-        if (!previousNode) this.firstChild_ = nodes[0];
-        if (!refWrapper) {
-          this.lastChild_ = nodes[nodes.length - 1];
-          if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;
-        }
-        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
-        if (parentNode) {
-          originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);
-        } else {
-          adoptNodesIfNeeded(this, nodes);
-        }
-      }
-      enqueueMutation(this, "childList", {
-        addedNodes: nodes,
-        nextSibling: refWrapper,
-        previousSibling: previousNode
-      });
-      nodesWereAdded(nodes, this);
-      return childWrapper;
-    },
-    removeChild: function(childWrapper) {
-      assertIsNodeWrapper(childWrapper);
-      if (childWrapper.parentNode !== this) {
-        var found = false;
-        var childNodes = this.childNodes;
-        for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {
-          if (ieChild === childWrapper) {
-            found = true;
-            break;
-          }
-        }
-        if (!found) {
-          throw new Error("NotFoundError");
-        }
-      }
-      var childNode = unwrap(childWrapper);
-      var childWrapperNextSibling = childWrapper.nextSibling;
-      var childWrapperPreviousSibling = childWrapper.previousSibling;
-      if (this.invalidateShadowRenderer()) {
-        var thisFirstChild = this.firstChild;
-        var thisLastChild = this.lastChild;
-        var parentNode = childNode.parentNode;
-        if (parentNode) removeChildOriginalHelper(parentNode, childNode);
-        if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;
-        if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;
-        if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
-        if (childWrapperNextSibling) {
-          childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;
-        }
-        childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;
-      } else {
-        clearChildNodes(this);
-        removeChildOriginalHelper(unsafeUnwrap(this), childNode);
-      }
-      if (!surpressMutations) {
-        enqueueMutation(this, "childList", {
-          removedNodes: createOneElementNodeList(childWrapper),
-          nextSibling: childWrapperNextSibling,
-          previousSibling: childWrapperPreviousSibling
-        });
-      }
-      registerTransientObservers(this, childWrapper);
-      return childWrapper;
-    },
-    replaceChild: function(newChildWrapper, oldChildWrapper) {
-      assertIsNodeWrapper(newChildWrapper);
-      var oldChildNode;
-      if (isWrapper(oldChildWrapper)) {
-        oldChildNode = unwrap(oldChildWrapper);
-      } else {
-        oldChildNode = oldChildWrapper;
-        oldChildWrapper = wrap(oldChildNode);
-      }
-      if (oldChildWrapper.parentNode !== this) {
-        throw new Error("NotFoundError");
-      }
-      var nextNode = oldChildWrapper.nextSibling;
-      var previousNode = oldChildWrapper.previousSibling;
-      var nodes;
-      var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);
-      if (useNative) {
-        nodes = collectNodesNative(newChildWrapper);
-      } else {
-        if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;
-        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
-      }
-      if (!useNative) {
-        if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];
-        if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];
-        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;
-        if (oldChildNode.parentNode) {
-          originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);
-        }
-      } else {
-        ensureSameOwnerDocument(this, newChildWrapper);
-        clearChildNodes(this);
-        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);
-      }
-      enqueueMutation(this, "childList", {
-        addedNodes: nodes,
-        removedNodes: createOneElementNodeList(oldChildWrapper),
-        nextSibling: nextNode,
-        previousSibling: previousNode
-      });
-      nodeWasRemoved(oldChildWrapper);
-      nodesWereAdded(nodes, this);
-      return oldChildWrapper;
-    },
-    nodeIsInserted_: function() {
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        child.nodeIsInserted_();
-      }
-    },
-    hasChildNodes: function() {
-      return this.firstChild !== null;
-    },
-    get parentNode() {
-      return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
-    },
-    get firstChild() {
-      return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
-    },
-    get lastChild() {
-      return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
-    },
-    get nextSibling() {
-      return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
-    },
-    get previousSibling() {
-      return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
-    },
-    get parentElement() {
-      var p = this.parentNode;
-      while (p && p.nodeType !== Node.ELEMENT_NODE) {
-        p = p.parentNode;
-      }
-      return p;
-    },
-    get textContent() {
-      var s = "";
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        if (child.nodeType != Node.COMMENT_NODE) {
-          s += child.textContent;
-        }
-      }
-      return s;
-    },
-    set textContent(textContent) {
-      if (textContent == null) textContent = "";
-      var removedNodes = snapshotNodeList(this.childNodes);
-      if (this.invalidateShadowRenderer()) {
-        removeAllChildNodes(this);
-        if (textContent !== "") {
-          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);
-          this.appendChild(textNode);
-        }
-      } else {
-        clearChildNodes(this);
-        unsafeUnwrap(this).textContent = textContent;
-      }
-      var addedNodes = snapshotNodeList(this.childNodes);
-      enqueueMutation(this, "childList", {
-        addedNodes: addedNodes,
-        removedNodes: removedNodes
-      });
-      nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes, this);
-    },
-    get childNodes() {
-      var wrapperList = new NodeList();
-      var i = 0;
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        wrapperList[i++] = child;
-      }
-      wrapperList.length = i;
-      return wrapperList;
-    },
-    cloneNode: function(deep) {
-      return cloneNode(this, deep);
-    },
-    contains: function(child) {
-      return contains(this, wrapIfNeeded(child));
-    },
-    compareDocumentPosition: function(otherNode) {
-      return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));
-    },
-    isEqualNode: function(otherNode) {
-      return originalIsEqualNode.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));
-    },
-    normalize: function() {
-      var nodes = snapshotNodeList(this.childNodes);
-      var remNodes = [];
-      var s = "";
-      var modNode;
-      for (var i = 0, n; i < nodes.length; i++) {
-        n = nodes[i];
-        if (n.nodeType === Node.TEXT_NODE) {
-          if (!modNode && !n.data.length) this.removeChild(n); else if (!modNode) modNode = n; else {
-            s += n.data;
-            remNodes.push(n);
-          }
-        } else {
-          if (modNode && remNodes.length) {
-            modNode.data += s;
-            cleanupNodes(remNodes);
-          }
-          remNodes = [];
-          s = "";
-          modNode = null;
-          if (n.childNodes.length) n.normalize();
-        }
-      }
-      if (modNode && remNodes.length) {
-        modNode.data += s;
-        cleanupNodes(remNodes);
-      }
-    }
-  });
-  defineWrapGetter(Node, "ownerDocument");
-  registerWrapper(OriginalNode, Node, document.createDocumentFragment());
-  delete Node.prototype.querySelector;
-  delete Node.prototype.querySelectorAll;
-  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
-  scope.cloneNode = cloneNode;
-  scope.nodeWasAdded = nodeWasAdded;
-  scope.nodeWasRemoved = nodeWasRemoved;
-  scope.nodesWereAdded = nodesWereAdded;
-  scope.nodesWereRemoved = nodesWereRemoved;
-  scope.originalInsertBefore = originalInsertBefore;
-  scope.originalRemoveChild = originalRemoveChild;
-  scope.snapshotNodeList = snapshotNodeList;
-  scope.wrappers.Node = Node;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLCollection = scope.wrappers.HTMLCollection;
-  var NodeList = scope.wrappers.NodeList;
-  var getTreeScope = scope.getTreeScope;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-  var originalDocumentQuerySelector = document.querySelector;
-  var originalElementQuerySelector = document.documentElement.querySelector;
-  var originalDocumentQuerySelectorAll = document.querySelectorAll;
-  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;
-  var originalDocumentGetElementsByTagName = document.getElementsByTagName;
-  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;
-  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
-  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;
-  var OriginalElement = window.Element;
-  var OriginalDocument = window.HTMLDocument || window.Document;
-  function filterNodeList(list, index, result, deep) {
-    var wrappedItem = null;
-    var root = null;
-    for (var i = 0, length = list.length; i < length; i++) {
-      wrappedItem = wrap(list[i]);
-      if (!deep && (root = getTreeScope(wrappedItem).root)) {
-        if (root instanceof scope.wrappers.ShadowRoot) {
-          continue;
-        }
-      }
-      result[index++] = wrappedItem;
-    }
-    return index;
-  }
-  function shimSelector(selector) {
-    return String(selector).replace(/\/deep\/|::shadow|>>>/g, " ");
-  }
-  function shimMatchesSelector(selector) {
-    return String(selector).replace(/:host\(([^\s]+)\)/g, "$1").replace(/([^\s]):host/g, "$1").replace(":host", "*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g, " ");
-  }
-  function findOne(node, selector) {
-    var m, el = node.firstElementChild;
-    while (el) {
-      if (el.matches(selector)) return el;
-      m = findOne(el, selector);
-      if (m) return m;
-      el = el.nextElementSibling;
-    }
-    return null;
-  }
-  function matchesSelector(el, selector) {
-    return el.matches(selector);
-  }
-  var XHTML_NS = "http://www.w3.org/1999/xhtml";
-  function matchesTagName(el, localName, localNameLowerCase) {
-    var ln = el.localName;
-    return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
-  }
-  function matchesEveryThing() {
-    return true;
-  }
-  function matchesLocalNameOnly(el, ns, localName) {
-    return el.localName === localName;
-  }
-  function matchesNameSpace(el, ns) {
-    return el.namespaceURI === ns;
-  }
-  function matchesLocalNameNS(el, ns, localName) {
-    return el.namespaceURI === ns && el.localName === localName;
-  }
-  function findElements(node, index, result, p, arg0, arg1) {
-    var el = node.firstElementChild;
-    while (el) {
-      if (p(el, arg0, arg1)) result[index++] = el;
-      index = findElements(el, index, result, p, arg0, arg1);
-      el = el.nextElementSibling;
-    }
-    return index;
-  }
-  function querySelectorAllFiltered(p, index, result, selector, deep) {
-    var target = unsafeUnwrap(this);
-    var list;
-    var root = getTreeScope(this).root;
-    if (root instanceof scope.wrappers.ShadowRoot) {
-      return findElements(this, index, result, p, selector, null);
-    } else if (target instanceof OriginalElement) {
-      list = originalElementQuerySelectorAll.call(target, selector);
-    } else if (target instanceof OriginalDocument) {
-      list = originalDocumentQuerySelectorAll.call(target, selector);
-    } else {
-      return findElements(this, index, result, p, selector, null);
-    }
-    return filterNodeList(list, index, result, deep);
-  }
-  var SelectorsInterface = {
-    querySelector: function(selector) {
-      var shimmed = shimSelector(selector);
-      var deep = shimmed !== selector;
-      selector = shimmed;
-      var target = unsafeUnwrap(this);
-      var wrappedItem;
-      var root = getTreeScope(this).root;
-      if (root instanceof scope.wrappers.ShadowRoot) {
-        return findOne(this, selector);
-      } else if (target instanceof OriginalElement) {
-        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
-      } else if (target instanceof OriginalDocument) {
-        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));
-      } else {
-        return findOne(this, selector);
-      }
-      if (!wrappedItem) {
-        return wrappedItem;
-      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
-        if (root instanceof scope.wrappers.ShadowRoot) {
-          return findOne(this, selector);
-        }
-      }
-      return wrappedItem;
-    },
-    querySelectorAll: function(selector) {
-      var shimmed = shimSelector(selector);
-      var deep = shimmed !== selector;
-      selector = shimmed;
-      var result = new NodeList();
-      result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);
-      return result;
-    }
-  };
-  var MatchesInterface = {
-    matches: function(selector) {
-      selector = shimMatchesSelector(selector);
-      return scope.originalMatches.call(unsafeUnwrap(this), selector);
-    }
-  };
-  function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {
-    var target = unsafeUnwrap(this);
-    var list;
-    var root = getTreeScope(this).root;
-    if (root instanceof scope.wrappers.ShadowRoot) {
-      return findElements(this, index, result, p, localName, lowercase);
-    } else if (target instanceof OriginalElement) {
-      list = originalElementGetElementsByTagName.call(target, localName, lowercase);
-    } else if (target instanceof OriginalDocument) {
-      list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);
-    } else {
-      return findElements(this, index, result, p, localName, lowercase);
-    }
-    return filterNodeList(list, index, result, false);
-  }
-  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
-    var target = unsafeUnwrap(this);
-    var list;
-    var root = getTreeScope(this).root;
-    if (root instanceof scope.wrappers.ShadowRoot) {
-      return findElements(this, index, result, p, ns, localName);
-    } else if (target instanceof OriginalElement) {
-      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
-    } else if (target instanceof OriginalDocument) {
-      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
-    } else {
-      return findElements(this, index, result, p, ns, localName);
-    }
-    return filterNodeList(list, index, result, false);
-  }
-  var GetElementsByInterface = {
-    getElementsByTagName: function(localName) {
-      var result = new HTMLCollection();
-      var match = localName === "*" ? matchesEveryThing : matchesTagName;
-      result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());
-      return result;
-    },
-    getElementsByClassName: function(className) {
-      return this.querySelectorAll("." + className);
-    },
-    getElementsByTagNameNS: function(ns, localName) {
-      var result = new HTMLCollection();
-      var match = null;
-      if (ns === "*") {
-        match = localName === "*" ? matchesEveryThing : matchesLocalNameOnly;
-      } else {
-        match = localName === "*" ? matchesNameSpace : matchesLocalNameNS;
-      }
-      result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);
-      return result;
-    }
-  };
-  scope.GetElementsByInterface = GetElementsByInterface;
-  scope.SelectorsInterface = SelectorsInterface;
-  scope.MatchesInterface = MatchesInterface;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var NodeList = scope.wrappers.NodeList;
-  function forwardElement(node) {
-    while (node && node.nodeType !== Node.ELEMENT_NODE) {
-      node = node.nextSibling;
-    }
-    return node;
-  }
-  function backwardsElement(node) {
-    while (node && node.nodeType !== Node.ELEMENT_NODE) {
-      node = node.previousSibling;
-    }
-    return node;
-  }
-  var ParentNodeInterface = {
-    get firstElementChild() {
-      return forwardElement(this.firstChild);
-    },
-    get lastElementChild() {
-      return backwardsElement(this.lastChild);
-    },
-    get childElementCount() {
-      var count = 0;
-      for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
-        count++;
-      }
-      return count;
-    },
-    get children() {
-      var wrapperList = new NodeList();
-      var i = 0;
-      for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
-        wrapperList[i++] = child;
-      }
-      wrapperList.length = i;
-      return wrapperList;
-    },
-    remove: function() {
-      var p = this.parentNode;
-      if (p) p.removeChild(this);
-    }
-  };
-  var ChildNodeInterface = {
-    get nextElementSibling() {
-      return forwardElement(this.nextSibling);
-    },
-    get previousElementSibling() {
-      return backwardsElement(this.previousSibling);
-    }
-  };
-  var NonElementParentNodeInterface = {
-    getElementById: function(id) {
-      if (/[ \t\n\r\f]/.test(id)) return null;
-      return this.querySelector('[id="' + id + '"]');
-    }
-  };
-  scope.ChildNodeInterface = ChildNodeInterface;
-  scope.NonElementParentNodeInterface = NonElementParentNodeInterface;
-  scope.ParentNodeInterface = ParentNodeInterface;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var ChildNodeInterface = scope.ChildNodeInterface;
-  var Node = scope.wrappers.Node;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var OriginalCharacterData = window.CharacterData;
-  function CharacterData(node) {
-    Node.call(this, node);
-  }
-  CharacterData.prototype = Object.create(Node.prototype);
-  mixin(CharacterData.prototype, {
-    get nodeValue() {
-      return this.data;
-    },
-    set nodeValue(data) {
-      this.data = data;
-    },
-    get textContent() {
-      return this.data;
-    },
-    set textContent(value) {
-      this.data = value;
-    },
-    get data() {
-      return unsafeUnwrap(this).data;
-    },
-    set data(value) {
-      var oldValue = unsafeUnwrap(this).data;
-      enqueueMutation(this, "characterData", {
-        oldValue: oldValue
-      });
-      unsafeUnwrap(this).data = value;
-    }
-  });
-  mixin(CharacterData.prototype, ChildNodeInterface);
-  registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(""));
-  scope.wrappers.CharacterData = CharacterData;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var CharacterData = scope.wrappers.CharacterData;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  function toUInt32(x) {
-    return x >>> 0;
-  }
-  var OriginalText = window.Text;
-  function Text(node) {
-    CharacterData.call(this, node);
-  }
-  Text.prototype = Object.create(CharacterData.prototype);
-  mixin(Text.prototype, {
-    splitText: function(offset) {
-      offset = toUInt32(offset);
-      var s = this.data;
-      if (offset > s.length) throw new Error("IndexSizeError");
-      var head = s.slice(0, offset);
-      var tail = s.slice(offset);
-      this.data = head;
-      var newTextNode = this.ownerDocument.createTextNode(tail);
-      if (this.parentNode) this.parentNode.insertBefore(newTextNode, this.nextSibling);
-      return newTextNode;
-    }
-  });
-  registerWrapper(OriginalText, Text, document.createTextNode(""));
-  scope.wrappers.Text = Text;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  if (!window.DOMTokenList) {
-    console.warn("Missing DOMTokenList prototype, please include a " + "compatible classList polyfill such as http://goo.gl/uTcepH.");
-    return;
-  }
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var enqueueMutation = scope.enqueueMutation;
-  function getClass(el) {
-    return unsafeUnwrap(el).getAttribute("class");
-  }
-  function enqueueClassAttributeChange(el, oldValue) {
-    enqueueMutation(el, "attributes", {
-      name: "class",
-      namespace: null,
-      oldValue: oldValue
-    });
-  }
-  function invalidateClass(el) {
-    scope.invalidateRendererBasedOnAttribute(el, "class");
-  }
-  function changeClass(tokenList, method, args) {
-    var ownerElement = tokenList.ownerElement_;
-    if (ownerElement == null) {
-      return method.apply(tokenList, args);
-    }
-    var oldValue = getClass(ownerElement);
-    var retv = method.apply(tokenList, args);
-    if (getClass(ownerElement) !== oldValue) {
-      enqueueClassAttributeChange(ownerElement, oldValue);
-      invalidateClass(ownerElement);
-    }
-    return retv;
-  }
-  var oldAdd = DOMTokenList.prototype.add;
-  DOMTokenList.prototype.add = function() {
-    changeClass(this, oldAdd, arguments);
-  };
-  var oldRemove = DOMTokenList.prototype.remove;
-  DOMTokenList.prototype.remove = function() {
-    changeClass(this, oldRemove, arguments);
-  };
-  var oldToggle = DOMTokenList.prototype.toggle;
-  DOMTokenList.prototype.toggle = function() {
-    return changeClass(this, oldToggle, arguments);
-  };
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var ChildNodeInterface = scope.ChildNodeInterface;
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var Node = scope.wrappers.Node;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var MatchesInterface = scope.MatchesInterface;
-  var addWrapNodeListMethod = scope.addWrapNodeListMethod;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var oneOf = scope.oneOf;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrappers = scope.wrappers;
-  var OriginalElement = window.Element;
-  var matchesNames = [ "matches", "mozMatchesSelector", "msMatchesSelector", "webkitMatchesSelector" ].filter(function(name) {
-    return OriginalElement.prototype[name];
-  });
-  var matchesName = matchesNames[0];
-  var originalMatches = OriginalElement.prototype[matchesName];
-  function invalidateRendererBasedOnAttribute(element, name) {
-    var p = element.parentNode;
-    if (!p || !p.shadowRoot) return;
-    var renderer = scope.getRendererForHost(p);
-    if (renderer.dependsOnAttribute(name)) renderer.invalidate();
-  }
-  function enqueAttributeChange(element, name, oldValue) {
-    enqueueMutation(element, "attributes", {
-      name: name,
-      namespace: null,
-      oldValue: oldValue
-    });
-  }
-  var classListTable = new WeakMap();
-  function Element(node) {
-    Node.call(this, node);
-  }
-  Element.prototype = Object.create(Node.prototype);
-  mixin(Element.prototype, {
-    createShadowRoot: function() {
-      var newShadowRoot = new wrappers.ShadowRoot(this);
-      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
-      var renderer = scope.getRendererForHost(this);
-      renderer.invalidate();
-      return newShadowRoot;
-    },
-    get shadowRoot() {
-      return unsafeUnwrap(this).polymerShadowRoot_ || null;
-    },
-    setAttribute: function(name, value) {
-      var oldValue = unsafeUnwrap(this).getAttribute(name);
-      unsafeUnwrap(this).setAttribute(name, value);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-    removeAttribute: function(name) {
-      var oldValue = unsafeUnwrap(this).getAttribute(name);
-      unsafeUnwrap(this).removeAttribute(name);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-    get classList() {
-      var list = classListTable.get(this);
-      if (!list) {
-        list = unsafeUnwrap(this).classList;
-        if (!list) return;
-        list.ownerElement_ = this;
-        classListTable.set(this, list);
-      }
-      return list;
-    },
-    get className() {
-      return unsafeUnwrap(this).className;
-    },
-    set className(v) {
-      this.setAttribute("class", v);
-    },
-    get id() {
-      return unsafeUnwrap(this).id;
-    },
-    set id(v) {
-      this.setAttribute("id", v);
-    }
-  });
-  matchesNames.forEach(function(name) {
-    if (name !== "matches") {
-      Element.prototype[name] = function(selector) {
-        return this.matches(selector);
-      };
-    }
-  });
-  if (OriginalElement.prototype.webkitCreateShadowRoot) {
-    Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
-  }
-  mixin(Element.prototype, ChildNodeInterface);
-  mixin(Element.prototype, GetElementsByInterface);
-  mixin(Element.prototype, ParentNodeInterface);
-  mixin(Element.prototype, SelectorsInterface);
-  mixin(Element.prototype, MatchesInterface);
-  registerWrapper(OriginalElement, Element, document.createElementNS(null, "x"));
-  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
-  scope.matchesNames = matchesNames;
-  scope.originalMatches = originalMatches;
-  scope.wrappers.Element = Element;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var Element = scope.wrappers.Element;
-  var defineGetter = scope.defineGetter;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var nodesWereAdded = scope.nodesWereAdded;
-  var nodesWereRemoved = scope.nodesWereRemoved;
-  var registerWrapper = scope.registerWrapper;
-  var snapshotNodeList = scope.snapshotNodeList;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrappers = scope.wrappers;
-  var escapeAttrRegExp = /[&\u00A0"]/g;
-  var escapeDataRegExp = /[&\u00A0<>]/g;
-  function escapeReplace(c) {
-    switch (c) {
-     case "&":
-      return "&amp;";
-
-     case "<":
-      return "&lt;";
-
-     case ">":
-      return "&gt;";
-
-     case '"':
-      return "&quot;";
-
-     case " ":
-      return "&nbsp;";
-    }
-  }
-  function escapeAttr(s) {
-    return s.replace(escapeAttrRegExp, escapeReplace);
-  }
-  function escapeData(s) {
-    return s.replace(escapeDataRegExp, escapeReplace);
-  }
-  function makeSet(arr) {
-    var set = {};
-    for (var i = 0; i < arr.length; i++) {
-      set[arr[i]] = true;
-    }
-    return set;
-  }
-  var voidElements = makeSet([ "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr" ]);
-  var plaintextParents = makeSet([ "style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript" ]);
-  var XHTML_NS = "http://www.w3.org/1999/xhtml";
-  function needsSelfClosingSlash(node) {
-    if (node.namespaceURI !== XHTML_NS) return true;
-    var doctype = node.ownerDocument.doctype;
-    return doctype && doctype.publicId && doctype.systemId;
-  }
-  function getOuterHTML(node, parentNode) {
-    switch (node.nodeType) {
-     case Node.ELEMENT_NODE:
-      var tagName = node.tagName.toLowerCase();
-      var s = "<" + tagName;
-      var attrs = node.attributes;
-      for (var i = 0, attr; attr = attrs[i]; i++) {
-        s += " " + attr.name + '="' + escapeAttr(attr.value) + '"';
-      }
-      if (voidElements[tagName]) {
-        if (needsSelfClosingSlash(node)) s += "/";
-        return s + ">";
-      }
-      return s + ">" + getInnerHTML(node) + "</" + tagName + ">";
-
-     case Node.TEXT_NODE:
-      var data = node.data;
-      if (parentNode && plaintextParents[parentNode.localName]) return data;
-      return escapeData(data);
-
-     case Node.COMMENT_NODE:
-      return "<!--" + node.data + "-->";
-
-     default:
-      console.error(node);
-      throw new Error("not implemented");
-    }
-  }
-  function getInnerHTML(node) {
-    if (node instanceof wrappers.HTMLTemplateElement) node = node.content;
-    var s = "";
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      s += getOuterHTML(child, node);
-    }
-    return s;
-  }
-  function setInnerHTML(node, value, opt_tagName) {
-    var tagName = opt_tagName || "div";
-    node.textContent = "";
-    var tempElement = unwrap(node.ownerDocument.createElement(tagName));
-    tempElement.innerHTML = value;
-    var firstChild;
-    while (firstChild = tempElement.firstChild) {
-      node.appendChild(wrap(firstChild));
-    }
-  }
-  var oldIe = /MSIE/.test(navigator.userAgent);
-  var OriginalHTMLElement = window.HTMLElement;
-  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-  function HTMLElement(node) {
-    Element.call(this, node);
-  }
-  HTMLElement.prototype = Object.create(Element.prototype);
-  mixin(HTMLElement.prototype, {
-    get innerHTML() {
-      return getInnerHTML(this);
-    },
-    set innerHTML(value) {
-      if (oldIe && plaintextParents[this.localName]) {
-        this.textContent = value;
-        return;
-      }
-      var removedNodes = snapshotNodeList(this.childNodes);
-      if (this.invalidateShadowRenderer()) {
-        if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);
-      } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {
-        setInnerHTML(this.content, value);
-      } else {
-        unsafeUnwrap(this).innerHTML = value;
-      }
-      var addedNodes = snapshotNodeList(this.childNodes);
-      enqueueMutation(this, "childList", {
-        addedNodes: addedNodes,
-        removedNodes: removedNodes
-      });
-      nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes, this);
-    },
-    get outerHTML() {
-      return getOuterHTML(this, this.parentNode);
-    },
-    set outerHTML(value) {
-      var p = this.parentNode;
-      if (p) {
-        p.invalidateShadowRenderer();
-        var df = frag(p, value);
-        p.replaceChild(df, this);
-      }
-    },
-    insertAdjacentHTML: function(position, text) {
-      var contextElement, refNode;
-      switch (String(position).toLowerCase()) {
-       case "beforebegin":
-        contextElement = this.parentNode;
-        refNode = this;
-        break;
-
-       case "afterend":
-        contextElement = this.parentNode;
-        refNode = this.nextSibling;
-        break;
-
-       case "afterbegin":
-        contextElement = this;
-        refNode = this.firstChild;
-        break;
-
-       case "beforeend":
-        contextElement = this;
-        refNode = null;
-        break;
-
-       default:
-        return;
-      }
-      var df = frag(contextElement, text);
-      contextElement.insertBefore(df, refNode);
-    },
-    get hidden() {
-      return this.hasAttribute("hidden");
-    },
-    set hidden(v) {
-      if (v) {
-        this.setAttribute("hidden", "");
-      } else {
-        this.removeAttribute("hidden");
-      }
-    }
-  });
-  function frag(contextElement, html) {
-    var p = unwrap(contextElement.cloneNode(false));
-    p.innerHTML = html;
-    var df = unwrap(document.createDocumentFragment());
-    var c;
-    while (c = p.firstChild) {
-      df.appendChild(c);
-    }
-    return wrap(df);
-  }
-  function getter(name) {
-    return function() {
-      scope.renderAllPending();
-      return unsafeUnwrap(this)[name];
-    };
-  }
-  function getterRequiresRendering(name) {
-    defineGetter(HTMLElement, name, getter(name));
-  }
-  [ "clientHeight", "clientLeft", "clientTop", "clientWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetWidth", "scrollHeight", "scrollWidth" ].forEach(getterRequiresRendering);
-  function getterAndSetterRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      get: getter(name),
-      set: function(v) {
-        scope.renderAllPending();
-        unsafeUnwrap(this)[name] = v;
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-  [ "scrollLeft", "scrollTop" ].forEach(getterAndSetterRequiresRendering);
-  function methodRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      value: function() {
-        scope.renderAllPending();
-        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-  [ "focus", "getBoundingClientRect", "getClientRects", "scrollIntoView" ].forEach(methodRequiresRendering);
-  registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement("b"));
-  scope.wrappers.HTMLElement = HTMLElement;
-  scope.getInnerHTML = getInnerHTML;
-  scope.setInnerHTML = setInnerHTML;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
-  function HTMLCanvasElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLCanvasElement.prototype, {
-    getContext: function() {
-      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);
-      return context && wrap(context);
-    }
-  });
-  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement("canvas"));
-  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var OriginalHTMLContentElement = window.HTMLContentElement;
-  function HTMLContentElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLContentElement.prototype, {
-    constructor: HTMLContentElement,
-    get select() {
-      return this.getAttribute("select");
-    },
-    set select(value) {
-      this.setAttribute("select", value);
-    },
-    setAttribute: function(n, v) {
-      HTMLElement.prototype.setAttribute.call(this, n, v);
-      if (String(n).toLowerCase() === "select") this.invalidateShadowRenderer(true);
-    }
-  });
-  if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
-  scope.wrappers.HTMLContentElement = HTMLContentElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var OriginalHTMLFormElement = window.HTMLFormElement;
-  function HTMLFormElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLFormElement.prototype, {
-    get elements() {
-      return wrapHTMLCollection(unwrap(this).elements);
-    }
-  });
-  registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement("form"));
-  scope.wrappers.HTMLFormElement = HTMLFormElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var rewrap = scope.rewrap;
-  var OriginalHTMLImageElement = window.HTMLImageElement;
-  function HTMLImageElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
-  registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement("img"));
-  function Image(width, height) {
-    if (!(this instanceof Image)) {
-      throw new TypeError("DOM object constructor cannot be called as a function.");
-    }
-    var node = unwrap(document.createElement("img"));
-    HTMLElement.call(this, node);
-    rewrap(node, this);
-    if (width !== undefined) node.width = width;
-    if (height !== undefined) node.height = height;
-  }
-  Image.prototype = HTMLImageElement.prototype;
-  scope.wrappers.HTMLImageElement = HTMLImageElement;
-  scope.wrappers.Image = Image;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var NodeList = scope.wrappers.NodeList;
-  var registerWrapper = scope.registerWrapper;
-  var OriginalHTMLShadowElement = window.HTMLShadowElement;
-  function HTMLShadowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
-  HTMLShadowElement.prototype.constructor = HTMLShadowElement;
-  if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
-  scope.wrappers.HTMLShadowElement = HTMLShadowElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var contentTable = new WeakMap();
-  var templateContentsOwnerTable = new WeakMap();
-  function getTemplateContentsOwner(doc) {
-    if (!doc.defaultView) return doc;
-    var d = templateContentsOwnerTable.get(doc);
-    if (!d) {
-      d = doc.implementation.createHTMLDocument("");
-      while (d.lastChild) {
-        d.removeChild(d.lastChild);
-      }
-      templateContentsOwnerTable.set(doc, d);
-    }
-    return d;
-  }
-  function extractContent(templateElement) {
-    var doc = getTemplateContentsOwner(templateElement.ownerDocument);
-    var df = unwrap(doc.createDocumentFragment());
-    var child;
-    while (child = templateElement.firstChild) {
-      df.appendChild(child);
-    }
-    return df;
-  }
-  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-  function HTMLTemplateElement(node) {
-    HTMLElement.call(this, node);
-    if (!OriginalHTMLTemplateElement) {
-      var content = extractContent(node);
-      contentTable.set(this, wrap(content));
-    }
-  }
-  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTemplateElement.prototype, {
-    constructor: HTMLTemplateElement,
-    get content() {
-      if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);
-      return contentTable.get(this);
-    }
-  });
-  if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
-  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-  var OriginalHTMLMediaElement = window.HTMLMediaElement;
-  if (!OriginalHTMLMediaElement) return;
-  function HTMLMediaElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
-  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement("audio"));
-  scope.wrappers.HTMLMediaElement = HTMLMediaElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var rewrap = scope.rewrap;
-  var OriginalHTMLAudioElement = window.HTMLAudioElement;
-  if (!OriginalHTMLAudioElement) return;
-  function HTMLAudioElement(node) {
-    HTMLMediaElement.call(this, node);
-  }
-  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
-  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement("audio"));
-  function Audio(src) {
-    if (!(this instanceof Audio)) {
-      throw new TypeError("DOM object constructor cannot be called as a function.");
-    }
-    var node = unwrap(document.createElement("audio"));
-    HTMLMediaElement.call(this, node);
-    rewrap(node, this);
-    node.setAttribute("preload", "auto");
-    if (src !== undefined) node.setAttribute("src", src);
-  }
-  Audio.prototype = HTMLAudioElement.prototype;
-  scope.wrappers.HTMLAudioElement = HTMLAudioElement;
-  scope.wrappers.Audio = Audio;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var rewrap = scope.rewrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var OriginalHTMLOptionElement = window.HTMLOptionElement;
-  function trimText(s) {
-    return s.replace(/\s+/g, " ").trim();
-  }
-  function HTMLOptionElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLOptionElement.prototype, {
-    get text() {
-      return trimText(this.textContent);
-    },
-    set text(value) {
-      this.textContent = trimText(String(value));
-    },
-    get form() {
-      return wrap(unwrap(this).form);
-    }
-  });
-  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement("option"));
-  function Option(text, value, defaultSelected, selected) {
-    if (!(this instanceof Option)) {
-      throw new TypeError("DOM object constructor cannot be called as a function.");
-    }
-    var node = unwrap(document.createElement("option"));
-    HTMLElement.call(this, node);
-    rewrap(node, this);
-    if (text !== undefined) node.text = text;
-    if (value !== undefined) node.setAttribute("value", value);
-    if (defaultSelected === true) node.setAttribute("selected", "");
-    node.selected = selected === true;
-  }
-  Option.prototype = HTMLOptionElement.prototype;
-  scope.wrappers.HTMLOptionElement = HTMLOptionElement;
-  scope.wrappers.Option = Option;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var OriginalHTMLSelectElement = window.HTMLSelectElement;
-  function HTMLSelectElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLSelectElement.prototype, {
-    add: function(element, before) {
-      if (typeof before === "object") before = unwrap(before);
-      unwrap(this).add(unwrap(element), before);
-    },
-    remove: function(indexOrNode) {
-      if (indexOrNode === undefined) {
-        HTMLElement.prototype.remove.call(this);
-        return;
-      }
-      if (typeof indexOrNode === "object") indexOrNode = unwrap(indexOrNode);
-      unwrap(this).remove(indexOrNode);
-    },
-    get form() {
-      return wrap(unwrap(this).form);
-    }
-  });
-  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement("select"));
-  scope.wrappers.HTMLSelectElement = HTMLSelectElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var OriginalHTMLTableElement = window.HTMLTableElement;
-  function HTMLTableElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableElement.prototype, {
-    get caption() {
-      return wrap(unwrap(this).caption);
-    },
-    createCaption: function() {
-      return wrap(unwrap(this).createCaption());
-    },
-    get tHead() {
-      return wrap(unwrap(this).tHead);
-    },
-    createTHead: function() {
-      return wrap(unwrap(this).createTHead());
-    },
-    createTFoot: function() {
-      return wrap(unwrap(this).createTFoot());
-    },
-    get tFoot() {
-      return wrap(unwrap(this).tFoot);
-    },
-    get tBodies() {
-      return wrapHTMLCollection(unwrap(this).tBodies);
-    },
-    createTBody: function() {
-      return wrap(unwrap(this).createTBody());
-    },
-    get rows() {
-      return wrapHTMLCollection(unwrap(this).rows);
-    },
-    insertRow: function(index) {
-      return wrap(unwrap(this).insertRow(index));
-    }
-  });
-  registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement("table"));
-  scope.wrappers.HTMLTableElement = HTMLTableElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
-  function HTMLTableSectionElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableSectionElement.prototype, {
-    constructor: HTMLTableSectionElement,
-    get rows() {
-      return wrapHTMLCollection(unwrap(this).rows);
-    },
-    insertRow: function(index) {
-      return wrap(unwrap(this).insertRow(index));
-    }
-  });
-  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement("thead"));
-  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
-  function HTMLTableRowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableRowElement.prototype, {
-    get cells() {
-      return wrapHTMLCollection(unwrap(this).cells);
-    },
-    insertCell: function(index) {
-      return wrap(unwrap(this).insertCell(index));
-    }
-  });
-  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement("tr"));
-  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLContentElement = scope.wrappers.HTMLContentElement;
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
-  function HTMLUnknownElement(node) {
-    switch (node.localName) {
-     case "content":
-      return new HTMLContentElement(node);
-
-     case "shadow":
-      return new HTMLShadowElement(node);
-
-     case "template":
-      return new HTMLTemplateElement(node);
-    }
-    HTMLElement.call(this, node);
-  }
-  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
-  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
-  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var Element = scope.wrappers.Element;
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-  var mixin = scope.mixin;
-  var SVG_NS = "http://www.w3.org/2000/svg";
-  var OriginalSVGElement = window.SVGElement;
-  var svgTitleElement = document.createElementNS(SVG_NS, "title");
-  if (!("classList" in svgTitleElement)) {
-    var descr = Object.getOwnPropertyDescriptor(Element.prototype, "classList");
-    Object.defineProperty(HTMLElement.prototype, "classList", descr);
-    delete Element.prototype.classList;
-  }
-  function SVGElement(node) {
-    Element.call(this, node);
-  }
-  SVGElement.prototype = Object.create(Element.prototype);
-  mixin(SVGElement.prototype, {
-    get ownerSVGElement() {
-      return wrap(unsafeUnwrap(this).ownerSVGElement);
-    }
-  });
-  registerWrapper(OriginalSVGElement, SVGElement, document.createElementNS(SVG_NS, "title"));
-  scope.wrappers.SVGElement = SVGElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var OriginalSVGUseElement = window.SVGUseElement;
-  var SVG_NS = "http://www.w3.org/2000/svg";
-  var gWrapper = wrap(document.createElementNS(SVG_NS, "g"));
-  var useElement = document.createElementNS(SVG_NS, "use");
-  var SVGGElement = gWrapper.constructor;
-  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
-  var parentInterface = parentInterfacePrototype.constructor;
-  function SVGUseElement(impl) {
-    parentInterface.call(this, impl);
-  }
-  SVGUseElement.prototype = Object.create(parentInterfacePrototype);
-  if ("instanceRoot" in useElement) {
-    mixin(SVGUseElement.prototype, {
-      get instanceRoot() {
-        return wrap(unwrap(this).instanceRoot);
-      },
-      get animatedInstanceRoot() {
-        return wrap(unwrap(this).animatedInstanceRoot);
-      }
-    });
-  }
-  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
-  scope.wrappers.SVGUseElement = SVGUseElement;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var EventTarget = scope.wrappers.EventTarget;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-  var OriginalSVGElementInstance = window.SVGElementInstance;
-  if (!OriginalSVGElementInstance) return;
-  function SVGElementInstance(impl) {
-    EventTarget.call(this, impl);
-  }
-  SVGElementInstance.prototype = Object.create(EventTarget.prototype);
-  mixin(SVGElementInstance.prototype, {
-    get correspondingElement() {
-      return wrap(unsafeUnwrap(this).correspondingElement);
-    },
-    get correspondingUseElement() {
-      return wrap(unsafeUnwrap(this).correspondingUseElement);
-    },
-    get parentNode() {
-      return wrap(unsafeUnwrap(this).parentNode);
-    },
-    get childNodes() {
-      throw new Error("Not implemented");
-    },
-    get firstChild() {
-      return wrap(unsafeUnwrap(this).firstChild);
-    },
-    get lastChild() {
-      return wrap(unsafeUnwrap(this).lastChild);
-    },
-    get previousSibling() {
-      return wrap(unsafeUnwrap(this).previousSibling);
-    },
-    get nextSibling() {
-      return wrap(unsafeUnwrap(this).nextSibling);
-    }
-  });
-  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
-  scope.wrappers.SVGElementInstance = SVGElementInstance;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-  function CanvasRenderingContext2D(impl) {
-    setWrapper(impl, this);
-  }
-  mixin(CanvasRenderingContext2D.prototype, {
-    get canvas() {
-      return wrap(unsafeUnwrap(this).canvas);
-    },
-    drawImage: function() {
-      arguments[0] = unwrapIfNeeded(arguments[0]);
-      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
-    },
-    createPattern: function() {
-      arguments[0] = unwrap(arguments[0]);
-      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);
-    }
-  });
-  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement("canvas").getContext("2d"));
-  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var addForwardingProperties = scope.addForwardingProperties;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-  if (!OriginalWebGLRenderingContext) return;
-  function WebGLRenderingContext(impl) {
-    setWrapper(impl, this);
-  }
-  mixin(WebGLRenderingContext.prototype, {
-    get canvas() {
-      return wrap(unsafeUnwrap(this).canvas);
-    },
-    texImage2D: function() {
-      arguments[5] = unwrapIfNeeded(arguments[5]);
-      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
-    },
-    texSubImage2D: function() {
-      arguments[6] = unwrapIfNeeded(arguments[6]);
-      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
-    }
-  });
-  var OriginalWebGLRenderingContextBase = Object.getPrototypeOf(OriginalWebGLRenderingContext.prototype);
-  if (OriginalWebGLRenderingContextBase !== Object.prototype) {
-    addForwardingProperties(OriginalWebGLRenderingContextBase, WebGLRenderingContext.prototype);
-  }
-  var instanceProperties = /WebKit/.test(navigator.userAgent) ? {
-    drawingBufferHeight: null,
-    drawingBufferWidth: null
-  } : {};
-  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);
-  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var Node = scope.wrappers.Node;
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var NonElementParentNodeInterface = scope.NonElementParentNodeInterface;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var mixin = scope.mixin;
-  var registerObject = scope.registerObject;
-  var registerWrapper = scope.registerWrapper;
-  var OriginalDocumentFragment = window.DocumentFragment;
-  function DocumentFragment(node) {
-    Node.call(this, node);
-  }
-  DocumentFragment.prototype = Object.create(Node.prototype);
-  mixin(DocumentFragment.prototype, ParentNodeInterface);
-  mixin(DocumentFragment.prototype, SelectorsInterface);
-  mixin(DocumentFragment.prototype, GetElementsByInterface);
-  mixin(DocumentFragment.prototype, NonElementParentNodeInterface);
-  registerWrapper(OriginalDocumentFragment, DocumentFragment, document.createDocumentFragment());
-  scope.wrappers.DocumentFragment = DocumentFragment;
-  var Comment = registerObject(document.createComment(""));
-  scope.wrappers.Comment = Comment;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var DocumentFragment = scope.wrappers.DocumentFragment;
-  var TreeScope = scope.TreeScope;
-  var elementFromPoint = scope.elementFromPoint;
-  var getInnerHTML = scope.getInnerHTML;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var rewrap = scope.rewrap;
-  var setInnerHTML = scope.setInnerHTML;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var shadowHostTable = new WeakMap();
-  var nextOlderShadowTreeTable = new WeakMap();
-  function ShadowRoot(hostWrapper) {
-    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());
-    DocumentFragment.call(this, node);
-    rewrap(node, this);
-    var oldShadowRoot = hostWrapper.shadowRoot;
-    nextOlderShadowTreeTable.set(this, oldShadowRoot);
-    this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
-    shadowHostTable.set(this, hostWrapper);
-  }
-  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
-  mixin(ShadowRoot.prototype, {
-    constructor: ShadowRoot,
-    get innerHTML() {
-      return getInnerHTML(this);
-    },
-    set innerHTML(value) {
-      setInnerHTML(this, value);
-      this.invalidateShadowRenderer();
-    },
-    get olderShadowRoot() {
-      return nextOlderShadowTreeTable.get(this) || null;
-    },
-    get host() {
-      return shadowHostTable.get(this) || null;
-    },
-    invalidateShadowRenderer: function() {
-      return shadowHostTable.get(this).invalidateShadowRenderer();
-    },
-    elementFromPoint: function(x, y) {
-      return elementFromPoint(this, this.ownerDocument, x, y);
-    },
-    getSelection: function() {
-      return document.getSelection();
-    },
-    get activeElement() {
-      var unwrappedActiveElement = unwrap(this).ownerDocument.activeElement;
-      if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null;
-      var activeElement = wrap(unwrappedActiveElement);
-      while (!this.contains(activeElement)) {
-        while (activeElement.parentNode) {
-          activeElement = activeElement.parentNode;
-        }
-        if (activeElement.host) {
-          activeElement = activeElement.host;
-        } else {
-          return null;
-        }
-      }
-      return activeElement;
-    }
-  });
-  scope.wrappers.ShadowRoot = ShadowRoot;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var getTreeScope = scope.getTreeScope;
-  var OriginalRange = window.Range;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  function getHost(node) {
-    var root = getTreeScope(node).root;
-    if (root instanceof ShadowRoot) {
-      return root.host;
-    }
-    return null;
-  }
-  function hostNodeToShadowNode(refNode, offset) {
-    if (refNode.shadowRoot) {
-      offset = Math.min(refNode.childNodes.length - 1, offset);
-      var child = refNode.childNodes[offset];
-      if (child) {
-        var insertionPoint = scope.getDestinationInsertionPoints(child);
-        if (insertionPoint.length > 0) {
-          var parentNode = insertionPoint[0].parentNode;
-          if (parentNode.nodeType == Node.ELEMENT_NODE) {
-            refNode = parentNode;
-          }
-        }
-      }
-    }
-    return refNode;
-  }
-  function shadowNodeToHostNode(node) {
-    node = wrap(node);
-    return getHost(node) || node;
-  }
-  function Range(impl) {
-    setWrapper(impl, this);
-  }
-  Range.prototype = {
-    get startContainer() {
-      return shadowNodeToHostNode(unsafeUnwrap(this).startContainer);
-    },
-    get endContainer() {
-      return shadowNodeToHostNode(unsafeUnwrap(this).endContainer);
-    },
-    get commonAncestorContainer() {
-      return shadowNodeToHostNode(unsafeUnwrap(this).commonAncestorContainer);
-    },
-    setStart: function(refNode, offset) {
-      refNode = hostNodeToShadowNode(refNode, offset);
-      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
-    },
-    setEnd: function(refNode, offset) {
-      refNode = hostNodeToShadowNode(refNode, offset);
-      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
-    },
-    setStartBefore: function(refNode) {
-      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
-    },
-    setStartAfter: function(refNode) {
-      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
-    },
-    setEndBefore: function(refNode) {
-      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
-    },
-    setEndAfter: function(refNode) {
-      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
-    },
-    selectNode: function(refNode) {
-      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
-    },
-    selectNodeContents: function(refNode) {
-      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
-    },
-    compareBoundaryPoints: function(how, sourceRange) {
-      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
-    },
-    extractContents: function() {
-      return wrap(unsafeUnwrap(this).extractContents());
-    },
-    cloneContents: function() {
-      return wrap(unsafeUnwrap(this).cloneContents());
-    },
-    insertNode: function(node) {
-      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
-    },
-    surroundContents: function(newParent) {
-      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
-    },
-    cloneRange: function() {
-      return wrap(unsafeUnwrap(this).cloneRange());
-    },
-    isPointInRange: function(node, offset) {
-      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
-    },
-    comparePoint: function(node, offset) {
-      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
-    },
-    intersectsNode: function(node) {
-      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return unsafeUnwrap(this).toString();
-    }
-  };
-  if (OriginalRange.prototype.createContextualFragment) {
-    Range.prototype.createContextualFragment = function(html) {
-      return wrap(unsafeUnwrap(this).createContextualFragment(html));
-    };
-  }
-  registerWrapper(window.Range, Range, document.createRange());
-  scope.wrappers.Range = Range;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var Element = scope.wrappers.Element;
-  var HTMLContentElement = scope.wrappers.HTMLContentElement;
-  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-  var Node = scope.wrappers.Node;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  var assert = scope.assert;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var oneOf = scope.oneOf;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var ArraySplice = scope.ArraySplice;
-  function updateWrapperUpAndSideways(wrapper) {
-    wrapper.previousSibling_ = wrapper.previousSibling;
-    wrapper.nextSibling_ = wrapper.nextSibling;
-    wrapper.parentNode_ = wrapper.parentNode;
-  }
-  function updateWrapperDown(wrapper) {
-    wrapper.firstChild_ = wrapper.firstChild;
-    wrapper.lastChild_ = wrapper.lastChild;
-  }
-  function updateAllChildNodes(parentNodeWrapper) {
-    assert(parentNodeWrapper instanceof Node);
-    for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {
-      updateWrapperUpAndSideways(childWrapper);
-    }
-    updateWrapperDown(parentNodeWrapper);
-  }
-  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
-    var parentNode = unwrap(parentNodeWrapper);
-    var newChild = unwrap(newChildWrapper);
-    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
-    remove(newChildWrapper);
-    updateWrapperUpAndSideways(newChildWrapper);
-    if (!refChildWrapper) {
-      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
-      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
-      var lastChildWrapper = wrap(parentNode.lastChild);
-      if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
-    } else {
-      if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;
-      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
-    }
-    scope.originalInsertBefore.call(parentNode, newChild, refChild);
-  }
-  function remove(nodeWrapper) {
-    var node = unwrap(nodeWrapper);
-    var parentNode = node.parentNode;
-    if (!parentNode) return;
-    var parentNodeWrapper = wrap(parentNode);
-    updateWrapperUpAndSideways(nodeWrapper);
-    if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
-    if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
-    if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;
-    if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;
-    scope.originalRemoveChild.call(parentNode, node);
-  }
-  var distributedNodesTable = new WeakMap();
-  var destinationInsertionPointsTable = new WeakMap();
-  var rendererForHostTable = new WeakMap();
-  function resetDistributedNodes(insertionPoint) {
-    distributedNodesTable.set(insertionPoint, []);
-  }
-  function getDistributedNodes(insertionPoint) {
-    var rv = distributedNodesTable.get(insertionPoint);
-    if (!rv) distributedNodesTable.set(insertionPoint, rv = []);
-    return rv;
-  }
-  function getChildNodesSnapshot(node) {
-    var result = [], i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      result[i++] = child;
-    }
-    return result;
-  }
-  var request = oneOf(window, [ "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "setTimeout" ]);
-  var pendingDirtyRenderers = [];
-  var renderTimer;
-  function renderAllPending() {
-    for (var i = 0; i < pendingDirtyRenderers.length; i++) {
-      var renderer = pendingDirtyRenderers[i];
-      var parentRenderer = renderer.parentRenderer;
-      if (parentRenderer && parentRenderer.dirty) continue;
-      renderer.render();
-    }
-    pendingDirtyRenderers = [];
-  }
-  function handleRequestAnimationFrame() {
-    renderTimer = null;
-    renderAllPending();
-  }
-  function getRendererForHost(host) {
-    var renderer = rendererForHostTable.get(host);
-    if (!renderer) {
-      renderer = new ShadowRenderer(host);
-      rendererForHostTable.set(host, renderer);
-    }
-    return renderer;
-  }
-  function getShadowRootAncestor(node) {
-    var root = getTreeScope(node).root;
-    if (root instanceof ShadowRoot) return root;
-    return null;
-  }
-  function getRendererForShadowRoot(shadowRoot) {
-    return getRendererForHost(shadowRoot.host);
-  }
-  var spliceDiff = new ArraySplice();
-  spliceDiff.equals = function(renderNode, rawNode) {
-    return unwrap(renderNode.node) === rawNode;
-  };
-  function RenderNode(node) {
-    this.skip = false;
-    this.node = node;
-    this.childNodes = [];
-  }
-  RenderNode.prototype = {
-    append: function(node) {
-      var rv = new RenderNode(node);
-      this.childNodes.push(rv);
-      return rv;
-    },
-    sync: function(opt_added) {
-      if (this.skip) return;
-      var nodeWrapper = this.node;
-      var newChildren = this.childNodes;
-      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
-      var added = opt_added || new WeakMap();
-      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
-      var newIndex = 0, oldIndex = 0;
-      var lastIndex = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        for (;lastIndex < splice.index; lastIndex++) {
-          oldIndex++;
-          newChildren[newIndex++].sync(added);
-        }
-        var removedCount = splice.removed.length;
-        for (var j = 0; j < removedCount; j++) {
-          var wrapper = wrap(oldChildren[oldIndex++]);
-          if (!added.get(wrapper)) remove(wrapper);
-        }
-        var addedCount = splice.addedCount;
-        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
-        for (var j = 0; j < addedCount; j++) {
-          var newChildRenderNode = newChildren[newIndex++];
-          var newChildWrapper = newChildRenderNode.node;
-          insertBefore(nodeWrapper, newChildWrapper, refNode);
-          added.set(newChildWrapper, true);
-          newChildRenderNode.sync(added);
-        }
-        lastIndex += addedCount;
-      }
-      for (var i = lastIndex; i < newChildren.length; i++) {
-        newChildren[i].sync(added);
-      }
-    }
-  };
-  function ShadowRenderer(host) {
-    this.host = host;
-    this.dirty = false;
-    this.invalidateAttributes();
-    this.associateNode(host);
-  }
-  ShadowRenderer.prototype = {
-    render: function(opt_renderNode) {
-      if (!this.dirty) return;
-      this.invalidateAttributes();
-      var host = this.host;
-      this.distribution(host);
-      var renderNode = opt_renderNode || new RenderNode(host);
-      this.buildRenderTree(renderNode, host);
-      var topMostRenderer = !opt_renderNode;
-      if (topMostRenderer) renderNode.sync();
-      this.dirty = false;
-    },
-    get parentRenderer() {
-      return getTreeScope(this.host).renderer;
-    },
-    invalidate: function() {
-      if (!this.dirty) {
-        this.dirty = true;
-        var parentRenderer = this.parentRenderer;
-        if (parentRenderer) parentRenderer.invalidate();
-        pendingDirtyRenderers.push(this);
-        if (renderTimer) return;
-        renderTimer = window[request](handleRequestAnimationFrame, 0);
-      }
-    },
-    distribution: function(root) {
-      this.resetAllSubtrees(root);
-      this.distributionResolution(root);
-    },
-    resetAll: function(node) {
-      if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);
-      this.resetAllSubtrees(node);
-    },
-    resetAllSubtrees: function(node) {
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.resetAll(child);
-      }
-      if (node.shadowRoot) this.resetAll(node.shadowRoot);
-      if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);
-    },
-    distributionResolution: function(node) {
-      if (isShadowHost(node)) {
-        var shadowHost = node;
-        var pool = poolPopulation(shadowHost);
-        var shadowTrees = getShadowTrees(shadowHost);
-        for (var i = 0; i < shadowTrees.length; i++) {
-          this.poolDistribution(shadowTrees[i], pool);
-        }
-        for (var i = shadowTrees.length - 1; i >= 0; i--) {
-          var shadowTree = shadowTrees[i];
-          var shadow = getShadowInsertionPoint(shadowTree);
-          if (shadow) {
-            var olderShadowRoot = shadowTree.olderShadowRoot;
-            if (olderShadowRoot) {
-              pool = poolPopulation(olderShadowRoot);
-            }
-            for (var j = 0; j < pool.length; j++) {
-              destributeNodeInto(pool[j], shadow);
-            }
-          }
-          this.distributionResolution(shadowTree);
-        }
-      }
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.distributionResolution(child);
-      }
-    },
-    poolDistribution: function(node, pool) {
-      if (node instanceof HTMLShadowElement) return;
-      if (node instanceof HTMLContentElement) {
-        var content = node;
-        this.updateDependentAttributes(content.getAttribute("select"));
-        var anyDistributed = false;
-        for (var i = 0; i < pool.length; i++) {
-          var node = pool[i];
-          if (!node) continue;
-          if (matches(node, content)) {
-            destributeNodeInto(node, content);
-            pool[i] = undefined;
-            anyDistributed = true;
-          }
-        }
-        if (!anyDistributed) {
-          for (var child = content.firstChild; child; child = child.nextSibling) {
-            destributeNodeInto(child, content);
-          }
-        }
-        return;
-      }
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.poolDistribution(child, pool);
-      }
-    },
-    buildRenderTree: function(renderNode, node) {
-      var children = this.compose(node);
-      for (var i = 0; i < children.length; i++) {
-        var child = children[i];
-        var childRenderNode = renderNode.append(child);
-        this.buildRenderTree(childRenderNode, child);
-      }
-      if (isShadowHost(node)) {
-        var renderer = getRendererForHost(node);
-        renderer.dirty = false;
-      }
-    },
-    compose: function(node) {
-      var children = [];
-      var p = node.shadowRoot || node;
-      for (var child = p.firstChild; child; child = child.nextSibling) {
-        if (isInsertionPoint(child)) {
-          this.associateNode(p);
-          var distributedNodes = getDistributedNodes(child);
-          for (var j = 0; j < distributedNodes.length; j++) {
-            var distributedNode = distributedNodes[j];
-            if (isFinalDestination(child, distributedNode)) children.push(distributedNode);
-          }
-        } else {
-          children.push(child);
-        }
-      }
-      return children;
-    },
-    invalidateAttributes: function() {
-      this.attributes = Object.create(null);
-    },
-    updateDependentAttributes: function(selector) {
-      if (!selector) return;
-      var attributes = this.attributes;
-      if (/\.\w+/.test(selector)) attributes["class"] = true;
-      if (/#\w+/.test(selector)) attributes["id"] = true;
-      selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
-        attributes[name] = true;
-      });
-    },
-    dependsOnAttribute: function(name) {
-      return this.attributes[name];
-    },
-    associateNode: function(node) {
-      unsafeUnwrap(node).polymerShadowRenderer_ = this;
-    }
-  };
-  function poolPopulation(node) {
-    var pool = [];
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      if (isInsertionPoint(child)) {
-        pool.push.apply(pool, getDistributedNodes(child));
-      } else {
-        pool.push(child);
-      }
-    }
-    return pool;
-  }
-  function getShadowInsertionPoint(node) {
-    if (node instanceof HTMLShadowElement) return node;
-    if (node instanceof HTMLContentElement) return null;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      var res = getShadowInsertionPoint(child);
-      if (res) return res;
-    }
-    return null;
-  }
-  function destributeNodeInto(child, insertionPoint) {
-    getDistributedNodes(insertionPoint).push(child);
-    var points = destinationInsertionPointsTable.get(child);
-    if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);
-  }
-  function getDestinationInsertionPoints(node) {
-    return destinationInsertionPointsTable.get(node);
-  }
-  function resetDestinationInsertionPoints(node) {
-    destinationInsertionPointsTable.set(node, undefined);
-  }
-  var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
-  function matches(node, contentElement) {
-    var select = contentElement.getAttribute("select");
-    if (!select) return true;
-    select = select.trim();
-    if (!select) return true;
-    if (!(node instanceof Element)) return false;
-    if (!selectorStartCharRe.test(select)) return false;
-    try {
-      return node.matches(select);
-    } catch (ex) {
-      return false;
-    }
-  }
-  function isFinalDestination(insertionPoint, node) {
-    var points = getDestinationInsertionPoints(node);
-    return points && points[points.length - 1] === insertionPoint;
-  }
-  function isInsertionPoint(node) {
-    return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;
-  }
-  function isShadowHost(shadowHost) {
-    return shadowHost.shadowRoot;
-  }
-  function getShadowTrees(host) {
-    var trees = [];
-    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
-      trees.push(tree);
-    }
-    return trees;
-  }
-  function render(host) {
-    new ShadowRenderer(host).render();
-  }
-  Node.prototype.invalidateShadowRenderer = function(force) {
-    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
-    if (renderer) {
-      renderer.invalidate();
-      return true;
-    }
-    return false;
-  };
-  HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {
-    renderAllPending();
-    return getDistributedNodes(this);
-  };
-  Element.prototype.getDestinationInsertionPoints = function() {
-    renderAllPending();
-    return getDestinationInsertionPoints(this) || [];
-  };
-  HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {
-    this.invalidateShadowRenderer();
-    var shadowRoot = getShadowRootAncestor(this);
-    var renderer;
-    if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);
-    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
-    if (renderer) renderer.invalidate();
-  };
-  scope.getRendererForHost = getRendererForHost;
-  scope.getShadowTrees = getShadowTrees;
-  scope.renderAllPending = renderAllPending;
-  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
-  scope.visual = {
-    insertBefore: insertBefore,
-    remove: remove
-  };
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var assert = scope.assert;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var elementsWithFormProperty = [ "HTMLButtonElement", "HTMLFieldSetElement", "HTMLInputElement", "HTMLKeygenElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLObjectElement", "HTMLOutputElement", "HTMLTextAreaElement" ];
-  function createWrapperConstructor(name) {
-    if (!window[name]) return;
-    assert(!scope.wrappers[name]);
-    var GeneratedWrapper = function(node) {
-      HTMLElement.call(this, node);
-    };
-    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
-    mixin(GeneratedWrapper.prototype, {
-      get form() {
-        return wrap(unwrap(this).form);
-      }
-    });
-    registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));
-    scope.wrappers[name] = GeneratedWrapper;
-  }
-  elementsWithFormProperty.forEach(createWrapperConstructor);
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var OriginalSelection = window.Selection;
-  function Selection(impl) {
-    setWrapper(impl, this);
-  }
-  Selection.prototype = {
-    get anchorNode() {
-      return wrap(unsafeUnwrap(this).anchorNode);
-    },
-    get focusNode() {
-      return wrap(unsafeUnwrap(this).focusNode);
-    },
-    addRange: function(range) {
-      unsafeUnwrap(this).addRange(unwrapIfNeeded(range));
-    },
-    collapse: function(node, index) {
-      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
-    },
-    containsNode: function(node, allowPartial) {
-      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);
-    },
-    getRangeAt: function(index) {
-      return wrap(unsafeUnwrap(this).getRangeAt(index));
-    },
-    removeRange: function(range) {
-      unsafeUnwrap(this).removeRange(unwrap(range));
-    },
-    selectAllChildren: function(node) {
-      unsafeUnwrap(this).selectAllChildren(node instanceof ShadowRoot ? unsafeUnwrap(node.host) : unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return unsafeUnwrap(this).toString();
-    }
-  };
-  if (OriginalSelection.prototype.extend) {
-    Selection.prototype.extend = function(node, offset) {
-      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
-    };
-  }
-  registerWrapper(window.Selection, Selection, window.getSelection());
-  scope.wrappers.Selection = Selection;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var OriginalTreeWalker = window.TreeWalker;
-  function TreeWalker(impl) {
-    setWrapper(impl, this);
-  }
-  TreeWalker.prototype = {
-    get root() {
-      return wrap(unsafeUnwrap(this).root);
-    },
-    get currentNode() {
-      return wrap(unsafeUnwrap(this).currentNode);
-    },
-    set currentNode(node) {
-      unsafeUnwrap(this).currentNode = unwrapIfNeeded(node);
-    },
-    get filter() {
-      return unsafeUnwrap(this).filter;
-    },
-    parentNode: function() {
-      return wrap(unsafeUnwrap(this).parentNode());
-    },
-    firstChild: function() {
-      return wrap(unsafeUnwrap(this).firstChild());
-    },
-    lastChild: function() {
-      return wrap(unsafeUnwrap(this).lastChild());
-    },
-    previousSibling: function() {
-      return wrap(unsafeUnwrap(this).previousSibling());
-    },
-    previousNode: function() {
-      return wrap(unsafeUnwrap(this).previousNode());
-    },
-    nextNode: function() {
-      return wrap(unsafeUnwrap(this).nextNode());
-    }
-  };
-  registerWrapper(OriginalTreeWalker, TreeWalker);
-  scope.wrappers.TreeWalker = TreeWalker;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var Node = scope.wrappers.Node;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var NonElementParentNodeInterface = scope.NonElementParentNodeInterface;
-  var Selection = scope.wrappers.Selection;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  var TreeScope = scope.TreeScope;
-  var cloneNode = scope.cloneNode;
-  var defineGetter = scope.defineGetter;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var elementFromPoint = scope.elementFromPoint;
-  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-  var matchesNames = scope.matchesNames;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var renderAllPending = scope.renderAllPending;
-  var rewrap = scope.rewrap;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrapEventTargetMethods = scope.wrapEventTargetMethods;
-  var wrapNodeList = scope.wrapNodeList;
-  var implementationTable = new WeakMap();
-  function Document(node) {
-    Node.call(this, node);
-    this.treeScope_ = new TreeScope(this, null);
-  }
-  Document.prototype = Object.create(Node.prototype);
-  defineWrapGetter(Document, "documentElement");
-  defineWrapGetter(Document, "body");
-  defineWrapGetter(Document, "head");
-  defineGetter(Document, "activeElement", function() {
-    var unwrappedActiveElement = unwrap(this).activeElement;
-    if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null;
-    var activeElement = wrap(unwrappedActiveElement);
-    while (!this.contains(activeElement)) {
-      while (activeElement.parentNode) {
-        activeElement = activeElement.parentNode;
-      }
-      if (activeElement.host) {
-        activeElement = activeElement.host;
-      } else {
-        return null;
-      }
-    }
-    return activeElement;
-  });
-  function wrapMethod(name) {
-    var original = document[name];
-    Document.prototype[name] = function() {
-      return wrap(original.apply(unsafeUnwrap(this), arguments));
-    };
-  }
-  [ "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode" ].forEach(wrapMethod);
-  var originalAdoptNode = document.adoptNode;
-  function adoptNodeNoRemove(node, doc) {
-    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
-    adoptSubtree(node, doc);
-  }
-  function adoptSubtree(node, doc) {
-    if (node.shadowRoot) doc.adoptNode(node.shadowRoot);
-    if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      adoptSubtree(child, doc);
-    }
-  }
-  function adoptOlderShadowRoots(shadowRoot, doc) {
-    var oldShadowRoot = shadowRoot.olderShadowRoot;
-    if (oldShadowRoot) doc.adoptNode(oldShadowRoot);
-  }
-  var originalGetSelection = document.getSelection;
-  mixin(Document.prototype, {
-    adoptNode: function(node) {
-      if (node.parentNode) node.parentNode.removeChild(node);
-      adoptNodeNoRemove(node, this);
-      return node;
-    },
-    elementFromPoint: function(x, y) {
-      return elementFromPoint(this, this, x, y);
-    },
-    importNode: function(node, deep) {
-      return cloneNode(node, deep, unsafeUnwrap(this));
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    },
-    getElementsByName: function(name) {
-      return SelectorsInterface.querySelectorAll.call(this, "[name=" + JSON.stringify(String(name)) + "]");
-    }
-  });
-  var originalCreateTreeWalker = document.createTreeWalker;
-  var TreeWalkerWrapper = scope.wrappers.TreeWalker;
-  Document.prototype.createTreeWalker = function(root, whatToShow, filter, expandEntityReferences) {
-    var newFilter = null;
-    if (filter) {
-      if (filter.acceptNode && typeof filter.acceptNode === "function") {
-        newFilter = {
-          acceptNode: function(node) {
-            return filter.acceptNode(wrap(node));
-          }
-        };
-      } else if (typeof filter === "function") {
-        newFilter = function(node) {
-          return filter(wrap(node));
-        };
-      }
-    }
-    return new TreeWalkerWrapper(originalCreateTreeWalker.call(unwrap(this), unwrap(root), whatToShow, newFilter, expandEntityReferences));
-  };
-  if (document.registerElement) {
-    var originalRegisterElement = document.registerElement;
-    Document.prototype.registerElement = function(tagName, object) {
-      var prototype, extendsOption;
-      if (object !== undefined) {
-        prototype = object.prototype;
-        extendsOption = object.extends;
-      }
-      if (!prototype) prototype = Object.create(HTMLElement.prototype);
-      if (scope.nativePrototypeTable.get(prototype)) {
-        throw new Error("NotSupportedError");
-      }
-      var proto = Object.getPrototypeOf(prototype);
-      var nativePrototype;
-      var prototypes = [];
-      while (proto) {
-        nativePrototype = scope.nativePrototypeTable.get(proto);
-        if (nativePrototype) break;
-        prototypes.push(proto);
-        proto = Object.getPrototypeOf(proto);
-      }
-      if (!nativePrototype) {
-        throw new Error("NotSupportedError");
-      }
-      var newPrototype = Object.create(nativePrototype);
-      for (var i = prototypes.length - 1; i >= 0; i--) {
-        newPrototype = Object.create(newPrototype);
-      }
-      [ "createdCallback", "attachedCallback", "detachedCallback", "attributeChangedCallback" ].forEach(function(name) {
-        var f = prototype[name];
-        if (!f) return;
-        newPrototype[name] = function() {
-          if (!(wrap(this) instanceof CustomElementConstructor)) {
-            rewrap(this);
-          }
-          f.apply(wrap(this), arguments);
-        };
-      });
-      var p = {
-        prototype: newPrototype
-      };
-      if (extendsOption) p.extends = extendsOption;
-      function CustomElementConstructor(node) {
-        if (!node) {
-          if (extendsOption) {
-            return document.createElement(extendsOption, tagName);
-          } else {
-            return document.createElement(tagName);
-          }
-        }
-        setWrapper(node, this);
-      }
-      CustomElementConstructor.prototype = prototype;
-      CustomElementConstructor.prototype.constructor = CustomElementConstructor;
-      scope.constructorTable.set(newPrototype, CustomElementConstructor);
-      scope.nativePrototypeTable.set(prototype, newPrototype);
-      var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);
-      return CustomElementConstructor;
-    };
-    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "registerElement" ]);
-  }
-  forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ "appendChild", "compareDocumentPosition", "contains", "getElementsByClassName", "getElementsByTagName", "getElementsByTagNameNS", "insertBefore", "querySelector", "querySelectorAll", "removeChild", "replaceChild" ]);
-  forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLHeadElement, window.HTMLHtmlElement ], matchesNames);
-  forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "adoptNode", "importNode", "contains", "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "createTreeWalker", "elementFromPoint", "getElementById", "getElementsByName", "getSelection" ]);
-  mixin(Document.prototype, GetElementsByInterface);
-  mixin(Document.prototype, ParentNodeInterface);
-  mixin(Document.prototype, SelectorsInterface);
-  mixin(Document.prototype, NonElementParentNodeInterface);
-  mixin(Document.prototype, {
-    get implementation() {
-      var implementation = implementationTable.get(this);
-      if (implementation) return implementation;
-      implementation = new DOMImplementation(unwrap(this).implementation);
-      implementationTable.set(this, implementation);
-      return implementation;
-    },
-    get defaultView() {
-      return wrap(unwrap(this).defaultView);
-    }
-  });
-  registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(""));
-  if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);
-  wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);
-  function DOMImplementation(impl) {
-    setWrapper(impl, this);
-  }
-  var originalCreateDocument = document.implementation.createDocument;
-  DOMImplementation.prototype.createDocument = function() {
-    arguments[2] = unwrap(arguments[2]);
-    return wrap(originalCreateDocument.apply(unsafeUnwrap(this), arguments));
-  };
-  function wrapImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return wrap(original.apply(unsafeUnwrap(this), arguments));
-    };
-  }
-  function forwardImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return original.apply(unsafeUnwrap(this), arguments);
-    };
-  }
-  wrapImplMethod(DOMImplementation, "createDocumentType");
-  wrapImplMethod(DOMImplementation, "createHTMLDocument");
-  forwardImplMethod(DOMImplementation, "hasFeature");
-  registerWrapper(window.DOMImplementation, DOMImplementation);
-  forwardMethodsToWrapper([ window.DOMImplementation ], [ "createDocument", "createDocumentType", "createHTMLDocument", "hasFeature" ]);
-  scope.adoptNodeNoRemove = adoptNodeNoRemove;
-  scope.wrappers.DOMImplementation = DOMImplementation;
-  scope.wrappers.Document = Document;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var EventTarget = scope.wrappers.EventTarget;
-  var Selection = scope.wrappers.Selection;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var renderAllPending = scope.renderAllPending;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var OriginalWindow = window.Window;
-  var originalGetComputedStyle = window.getComputedStyle;
-  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
-  var originalGetSelection = window.getSelection;
-  function Window(impl) {
-    EventTarget.call(this, impl);
-  }
-  Window.prototype = Object.create(EventTarget.prototype);
-  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
-    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
-  };
-  if (originalGetDefaultComputedStyle) {
-    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
-      return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);
-    };
-  }
-  OriginalWindow.prototype.getSelection = function() {
-    return wrap(this || window).getSelection();
-  };
-  delete window.getComputedStyle;
-  delete window.getDefaultComputedStyle;
-  delete window.getSelection;
-  [ "addEventListener", "removeEventListener", "dispatchEvent" ].forEach(function(name) {
-    OriginalWindow.prototype[name] = function() {
-      var w = wrap(this || window);
-      return w[name].apply(w, arguments);
-    };
-    delete window[name];
-  });
-  mixin(Window.prototype, {
-    getComputedStyle: function(el, pseudo) {
-      renderAllPending();
-      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    },
-    get document() {
-      return wrap(unwrap(this).document);
-    }
-  });
-  if (originalGetDefaultComputedStyle) {
-    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
-      renderAllPending();
-      return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
-    };
-  }
-  registerWrapper(OriginalWindow, Window, window);
-  scope.wrappers.Window = Window;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var unwrap = scope.unwrap;
-  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
-  var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;
-  if (OriginalDataTransferSetDragImage) {
-    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
-      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
-    };
-  }
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unwrap = scope.unwrap;
-  var OriginalFormData = window.FormData;
-  if (!OriginalFormData) return;
-  function FormData(formElement) {
-    var impl;
-    if (formElement instanceof OriginalFormData) {
-      impl = formElement;
-    } else {
-      impl = new OriginalFormData(formElement && unwrap(formElement));
-    }
-    setWrapper(impl, this);
-  }
-  registerWrapper(OriginalFormData, FormData, new OriginalFormData());
-  scope.wrappers.FormData = FormData;
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var originalSend = XMLHttpRequest.prototype.send;
-  XMLHttpRequest.prototype.send = function(obj) {
-    return originalSend.call(this, unwrapIfNeeded(obj));
-  };
-})(window.ShadowDOMPolyfill);
-
-(function(scope) {
-  "use strict";
-  var isWrapperFor = scope.isWrapperFor;
-  var elements = {
-    a: "HTMLAnchorElement",
-    area: "HTMLAreaElement",
-    audio: "HTMLAudioElement",
-    base: "HTMLBaseElement",
-    body: "HTMLBodyElement",
-    br: "HTMLBRElement",
-    button: "HTMLButtonElement",
-    canvas: "HTMLCanvasElement",
-    caption: "HTMLTableCaptionElement",
-    col: "HTMLTableColElement",
-    content: "HTMLContentElement",
-    data: "HTMLDataElement",
-    datalist: "HTMLDataListElement",
-    del: "HTMLModElement",
-    dir: "HTMLDirectoryElement",
-    div: "HTMLDivElement",
-    dl: "HTMLDListElement",
-    embed: "HTMLEmbedElement",
-    fieldset: "HTMLFieldSetElement",
-    font: "HTMLFontElement",
-    form: "HTMLFormElement",
-    frame: "HTMLFrameElement",
-    frameset: "HTMLFrameSetElement",
-    h1: "HTMLHeadingElement",
-    head: "HTMLHeadElement",
-    hr: "HTMLHRElement",
-    html: "HTMLHtmlElement",
-    iframe: "HTMLIFrameElement",
-    img: "HTMLImageElement",
-    input: "HTMLInputElement",
-    keygen: "HTMLKeygenElement",
-    label: "HTMLLabelElement",
-    legend: "HTMLLegendElement",
-    li: "HTMLLIElement",
-    link: "HTMLLinkElement",
-    map: "HTMLMapElement",
-    marquee: "HTMLMarqueeElement",
-    menu: "HTMLMenuElement",
-    menuitem: "HTMLMenuItemElement",
-    meta: "HTMLMetaElement",
-    meter: "HTMLMeterElement",
-    object: "HTMLObjectElement",
-    ol: "HTMLOListElement",
-    optgroup: "HTMLOptGroupElement",
-    option: "HTMLOptionElement",
-    output: "HTMLOutputElement",
-    p: "HTMLParagraphElement",
-    param: "HTMLParamElement",
-    pre: "HTMLPreElement",
-    progress: "HTMLProgressElement",
-    q: "HTMLQuoteElement",
-    script: "HTMLScriptElement",
-    select: "HTMLSelectElement",
-    shadow: "HTMLShadowElement",
-    source: "HTMLSourceElement",
-    span: "HTMLSpanElement",
-    style: "HTMLStyleElement",
-    table: "HTMLTableElement",
-    tbody: "HTMLTableSectionElement",
-    template: "HTMLTemplateElement",
-    textarea: "HTMLTextAreaElement",
-    thead: "HTMLTableSectionElement",
-    time: "HTMLTimeElement",
-    title: "HTMLTitleElement",
-    tr: "HTMLTableRowElement",
-    track: "HTMLTrackElement",
-    ul: "HTMLUListElement",
-    video: "HTMLVideoElement"
-  };
-  function overrideConstructor(tagName) {
-    var nativeConstructorName = elements[tagName];
-    var nativeConstructor = window[nativeConstructorName];
-    if (!nativeConstructor) return;
-    var element = document.createElement(tagName);
-    var wrapperConstructor = element.constructor;
-    window[nativeConstructorName] = wrapperConstructor;
-  }
-  Object.keys(elements).forEach(overrideConstructor);
-  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
-    window[name] = scope.wrappers[name];
-  });
-})(window.ShadowDOMPolyfill);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/ShadowDOM.min.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/ShadowDOM.min.js
deleted file mode 100644
index fdbb864..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/ShadowDOM.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=k(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=k(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){B.value=n,A(e,t,B)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(U)try{k(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){m(e,t,!0)}function u(e,t){m(t,e,!1)}function l(e){return/^on[a-z]+$/.test(e)}function p(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function d(e){return I&&p(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function f(e){return I&&p(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function h(e){return I&&p(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function w(e,t){try{return e===window&&"showModalDialog"===t?q:Object.getOwnPropertyDescriptor(e,t)}catch(n){return q}}function m(t,n,r,o){for(var i=k(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){U&&t.__lookupGetter__(s);var c,u,p=w(t,s);if("function"!=typeof p.value){var m=l(s);c=m?e.getEventHandlerGetter(s):d(s),(p.writable||p.set||V)&&(u=m?e.getEventHandlerSetter(s):f(s));var v=V||p.configurable;A(n,s,{get:c,set:u,configurable:v,enumerable:p.enumerable})}else r&&(n[s]=h(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),P.set(o,e),c(e,o),r&&u(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function S(e){return e&&e.__impl4cf1e782hg__}function M(e){return!S(e)}function T(e){if(null===e)return null;n(M(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function O(e){return null===e?null:(n(S(e)),e.__impl4cf1e782hg__)}function N(e){return e.__impl4cf1e782hg__}function j(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function L(e){return e&&S(e)?O(e):e}function _(e){return e&&!S(e)?T(e):e}function D(e,t){null!==t&&(n(M(e)),n(void 0===t||S(t)),e.__wrapper8e3dd93a60__=t)}function C(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){C(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=_(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,P=new WeakMap,W=Object.create(null),I=t(),A=Object.defineProperty,k=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,B={value:void 0,configurable:!0,enumerable:!1,writable:!0};k(window);var U=/Firefox/.test(navigator.userAgent),q={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=C,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=p,e.isWrapper=S,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=P,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=D,e.setWrapper=j,e.unsafeUnwrap=N,e.unwrap=O,e.unwrapIfNeeded=L,e.wrap=T,e.wrapIfNeeded=_,e.wrappers=W}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),u=0;u<a;u++)c[u]=new Array(s),c[u][0]=u;for(var l=0;l<s;l++)c[0][l]=l;for(var u=1;u<a;u++)for(var l=1;l<s;l++)if(this.equals(e[t+l-1],r[o+u-1]))c[u][l]=c[u-1][l-1];else{var p=c[u-1][l]+1,d=c[u][l-1]+1;c[u][l]=p<d?p:d}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var u,l=e[t-1][n-1],p=e[t-1][n],d=e[t][n-1];u=p<d?p<l?p:l:d<l?d:l,u==l?(l==s?c.push(r):(c.push(o),s=l),t--,n--):u==p?(c.push(a),t--,s=p):(c.push(i),n--,s=d)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,u,l){var p=0,d=0,f=Math.min(s-n,l-u);if(0==n&&0==u&&(p=this.sharedPrefix(e,c,f)),s==e.length&&l==c.length&&(d=this.sharedSuffix(e,c,f-p)),n+=p,u+=p,s-=d,l-=d,s-n==0&&l-u==0)return[];if(n==s){for(var h=t(n,[],0);u<l;)h.removed.push(c[u++]);return[h]}if(u==l)return[t(n,[],s-n)];for(var w=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,u,l)),h=void 0,m=[],v=n,g=u,b=0;b<w.length;b++)switch(w[b]){case r:h&&(m.push(h),h=void 0),v++,g++;break;case o:h||(h=t(v,[],0)),h.addedCount++,v++,h.removed.push(c[g]),g++;break;case i:h||(h=t(v,[],0)),h.addedCount++,v++;break;case a:h||(h=t(v,[],0)),h.removed.push(c[g]),g++}return h&&m.push(h),m},sharedPrefix:function(e,t,n){for(var r=0;r<n;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;i<n&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),u=document.createTextNode(s);c.observe(u,{characterData:!0}),r=function(){s=(s+1)%2,u.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,h.push(e),w||(l(n),w=!0))}function n(){for(w=!1;h.length;){var e=h;h=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new d.NodeList,this.removedNodes=new d.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=f.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=f.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=f.get(s);if(c)for(var u=0;u<c.length;u++){var l=c[u],p=l.options;if((s===e||p.subtree)&&("attributes"!==n||p.attributes)&&("attributes"!==n||!p.attributeFilter||null===o.namespace&&p.attributeFilter.indexOf(o.name)!==-1)&&("characterData"!==n||p.characterData)&&("childList"!==n||p.childList)){var d=l.observer;i[d.uid_]=d,("attributes"===n&&p.attributeOldValue||"characterData"===n&&p.characterDataOldValue)&&(a[d.uid_]=o.oldValue)}}}for(var h in i){var d=i[h],w=new r(n,e);"name"in o&&"namespace"in o&&(w.attributeName=o.name,w.attributeNamespace=o.namespace),o.addedNodes&&(w.addedNodes=o.addedNodes),o.removedNodes&&(w.removedNodes=o.removedNodes),o.previousSibling&&(w.previousSibling=o.previousSibling),o.nextSibling&&(w.nextSibling=o.nextSibling),void 0!==a[h]&&(w.oldValue=a[h]),t(d),d.records_.push(w)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=m.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function u(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var l=e.setEndOfMicrotask,p=e.wrapIfNeeded,d=e.wrappers,f=new WeakMap,h=[],w=!1,m=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=p(e);var n,r=new s(t),o=f.get(e);o||f.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new u(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=f.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},u.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=f.get(e);n||f.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=f.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var u=a(c);if(u&&u.length>0){for(var l=0;l<u.length;l++){var d=u[l];if(i(d)){var f=n(d),h=f.olderShadowRoot;h&&s.push(h)}s.push(d)}c=u[u.length-1]}else if(t(c)){if(p(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=u(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function u(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function l(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=u(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var l=0;l<s.length;l++){var p=s[l];if(A(p)===c)return p}return null}function p(e,t){return A(e)===A(t)}function d(e){if(!X.get(e)&&(X.set(e,!0),h(V(e),V(e.target)),W)){var t=W;throw W=null,t}}function f(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function h(t,n){if(K.get(t))throw new Error("InvalidStateError");K.set(t,!0),e.renderAllPending();var o,i,a;if(f(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!f(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),w(t,o,a,i)&&m(t,o,a,i)&&v(t,o,a,i),J.set(t,re),$["delete"](t,null),K["delete"](t),t.defaultPrevented}function w(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function m(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=q(t),u=c.relatedTarget;if(u){if(u instanceof Object&&u.addEventListener){var p=V(u),d=l(t,e,p);if(d===a)return!0}else d=null;Z.set(t,d)}}J.set(t,n);var f=t.type,h=!1;Y.set(t,a),$.set(t,e),i.depth++;for(var w=0,m=i.length;w<m;w++){var v=i[w];if(v.removed)h=!0;else if(!(v.type!==f||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){W||(W=g)}}if(i.depth--,h&&0===i.depth){var b=i.slice();i.length=0;for(var w=0;w<b.length;w++)b[w].removed||i.push(b[w])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof O?void B(n,this):new O(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:q(e.relatedTarget)}}):e}function S(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void B(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&k(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function M(e,t){return function(){arguments[t]=q(arguments[t]);var n=q(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=q(document.createEvent(t)),i=me[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=q(t)),a.push(t)}),o["init"+t].apply(o,a),o}function O(e){y.call(this,e)}function N(e){return"function"==typeof e||e&&e.handleEvent}function j(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function L(e){B(e,this)}function _(e){return e instanceof G.ShadowRoot&&(e=e.host),q(e)}function D(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function C(e,t){for(var n=q(e);n;n=n.parentNode)if(D(V(n),t))return!0;return!1}function H(e){I(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(Se.call(U(n),o,i));if(!a)return null;var c=r(a,null),u=c.lastIndexOf(t);return u==-1?null:(c=c.slice(0,u),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function P(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var W,I=e.forwardMethodsToWrapper,A=e.getTreeScope,k=e.mixin,F=e.registerWrapper,B=e.setWrapper,U=e.unsafeUnwrap,q=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),X=new WeakMap,K=new WeakMap,Y=new WeakMap,$=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return Y.get(this)},get currentTarget(){return $.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(U(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var ue=S("UIEvent",y),le=S("CustomEvent",y),pe={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(q(this).relatedTarget)}},de=k({initMouseEvent:M("initMouseEvent",14)},pe),fe=k({initFocusEvent:M("initFocusEvent",5)},pe),he=S("MouseEvent",ue,de),we=S("FocusEvent",ue,fe),me=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=me[n];t=k(k({},r),t)}me[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;O.prototype=Object.create(y.prototype),k(O.prototype,{get returnValue(){return U(this).returnValue},set returnValue(e){U(this).returnValue=e}}),be&&F(be,O);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),L.prototype={addEventListener:function(e,t,n){if(N(t)&&!j(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=_(this);a.addEventListener_(e,d,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=_(this);s.removeEventListener_(e,d,!0)}}},dispatchEvent:function(t){var n=q(t),r=n.type;X.set(n,!1),e.renderAllPending();var o;C(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return q(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,L);var Se=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=P,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=O,e.wrappers.CustomEvent=le,e.wrappers.Event=y,e.wrappers.EventTarget=L,e.wrappers.FocusEvent=we,e.wrappers.MouseEvent=he,e.wrappers.UIEvent=ue}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,w)}function n(e){u(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,u=e.setWrapper,l=e.unsafeUnwrap,p=e.wrap,d=window.TouchEvent;if(d){var f;try{f=document.createEvent("TouchEvent")}catch(h){return}var w={enumerable:!1};n.prototype={get target(){return p(l(this).target)}};var m={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){m.get=function(){return l(this)[e]},Object.defineProperty(n.prototype,e,m)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(l(this).touches)},get targetTouches(){return o(l(this).targetTouches)},get changedTouches(){return o(l(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(d,i,f),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;r<o;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){N(e instanceof S)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){L(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){L(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);B=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;B=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function u(e,t){R(e,t),e.nodeIsInserted_()}function l(e,t){for(var n=_(t),r=0;r<e.length;r++)u(e[r],n)}function p(e){R(e,new O(e,null))}function d(e){for(var t=0;t<e.length;t++)p(e[t])}function f(e,t){var n=e.nodeType===S.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function h(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function w(e,t){h(e,t);var n=t.length;if(1===n)return W(t[0]);for(var r=W(e.ownerDocument.createDocumentFragment()),o=0;o<n;o++)r.appendChild(W(t[o]));return r}function m(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){N(t.parentNode===e);var n=t.nextSibling,r=W(t),o=r.parentNode;o&&Y.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=W(e),a=i.firstChild;a;)n=a.nextSibling,Y.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?U.call(n,P(e),!1):q.call(P(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||_(e)!==_(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function S(e){N(e instanceof V),M.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var M=e.wrappers.EventTarget,T=e.wrappers.NodeList,O=e.TreeScope,N=e.assert,j=e.defineWrapGetter,L=e.enqueueMutation,_=e.getTreeScope,D=e.isWrapper,C=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,P=e.unsafeUnwrap,W=e.unwrap,I=e.unwrapIfNeeded,A=e.wrap,k=e.wrapIfNeeded,F=e.wrappers,B=!1,U=document.importNode,q=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),X=V.prototype.isEqualNode,K=V.prototype.insertBefore,Y=V.prototype.removeChild,$=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{Y.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){Y.call(e,t)};S.prototype=Object.create(M.prototype),C(S.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?D(n)?r=W(n):(r=n,n=A(r)):(n=null,r=null),n&&N(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)f(this,e),m(this),K.call(P(this),W(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var u=r?r.parentNode:P(this);u?K.call(u,w(this,o),r):h(this,o)}return L(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),l(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=W(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,u=this.lastChild,l=i.parentNode;l&&J(l,i),c===e&&(this.firstChild_=a),u===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else m(this),J(P(this),i);return B||L(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(D(r)?o=W(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,u=r.previousSibling,d=!this.invalidateShadowRenderer()&&!g(e);return d?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,u,c)),d?(f(this,e),m(this),$.call(P(this),W(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&$.call(o.parentNode,w(this,s),o)),L(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:u}),p(r),l(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(P(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(P(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(P(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(P(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(P(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==S.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=S.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=P(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else m(this),P(this).textContent=e;var r=c(this.childNodes);L(this,"childList",{addedNodes:r,removedNodes:t}),d(t),l(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,k(e))},compareDocumentPosition:function(e){return z.call(P(this),I(e))},isEqualNode:function(e){return X.call(P(this),I(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===S.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),j(S,"ownerDocument"),x(V,S,document.createDocumentFragment()),delete S.prototype.querySelector,delete S.prototype.querySelectorAll,S.prototype=C(Object.create(M.prototype),S.prototype),e.cloneNode=y,e.nodeWasAdded=u,e.nodeWasRemoved=p,e.nodesWereAdded=l,e.nodesWereRemoved=d,e.originalInsertBefore=K,e.originalRemoveChild=Y,e.snapshotNodeList=c,e.wrappers.Node=S}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;s<c;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===D}function s(){return!0}function c(e,t,n){return e.localName===n}function u(e,t){return e.namespaceURI===t}function l(e,t,n){return e.namespaceURI===t&&e.localName===n}function p(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=p(a,t,n,r,o,i),a=a.nextElementSibling;return t}function d(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,null);if(c instanceof L)s=M.call(c,i);else{if(!(c instanceof _))return p(this,r,o,n,i,null);s=S.call(c,i)}return t(s,r,o,a)}function f(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=O.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function h(n,r,o,i,a){var s,c=g(this),u=v(this).root;if(u instanceof e.wrappers.ShadowRoot)return p(this,r,o,n,i,a);if(c instanceof L)s=j.call(c,i,a);else{if(!(c instanceof _))return p(this,r,o,n,i,a);s=N.call(c,i,a)}return t(s,r,o,!1)}var w=e.wrappers.HTMLCollection,m=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,S=document.querySelectorAll,M=document.documentElement.querySelectorAll,T=document.getElementsByTagName,O=document.documentElement.getElementsByTagName,N=document.getElementsByTagNameNS,j=document.documentElement.getElementsByTagNameNS,L=window.Element,_=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",C={querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof L)a=b(E.call(s,t));else{if(!(s instanceof _))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new m;return o.length=d.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new w,n="*"===e?s:a;return t.length=f.call(this,n,0,t,e,e.toLowerCase()),
-t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new w,r=null;return r="*"===e?"*"===t?s:c:"*"===t?u:l,n.length=h.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=C,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var u=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,u,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){l(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,u=e.MatchesInterface,l=(e.addWrapNodeListMethod,e.enqueueMutation),p=e.mixin,d=(e.oneOf,e.registerWrapper),f=e.unsafeUnwrap,h=e.wrappers,w=window.Element,m=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return w.prototype[e]}),v=m[0],g=w.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),p(r.prototype,{createShadowRoot:function(){var t=new h.ShadowRoot(this);f(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return f(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=f(this).getAttribute(e);f(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=f(this).getAttribute(e);f(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=f(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return f(this).className},set className(e){this.setAttribute("class",e)},get id(){return f(this).id},set id(e){this.setAttribute("id",e)}}),m.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),w.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),p(r.prototype,o),p(r.prototype,i),p(r.prototype,s),p(r.prototype,c),p(r.prototype,u),d(w,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=m,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(j,t)}function r(e){return e.replace(L,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==C)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,u=e.attributes,l=0;o=u[l];l++)c+=" "+o.name+'="'+n(o.value)+'"';return _[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var p=e.data;return t&&D[t.localName]?p:r(p);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof N.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(O(i))}function u(e){w.call(this,e)}function l(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return O(o)}function p(t){return function(){return e.renderAllPending(),M(this)[t]}}function d(e){m(u,e,p(e))}function f(t){Object.defineProperty(u.prototype,t,{get:p(t),set:function(n){e.renderAllPending(),M(this)[t]=n},configurable:!0,enumerable:!0})}function h(t){Object.defineProperty(u.prototype,t,{value:function(){return e.renderAllPending(),M(this)[t].apply(M(this),arguments)},configurable:!0,enumerable:!0})}var w=e.wrappers.Element,m=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,S=e.snapshotNodeList,M=e.unsafeUnwrap,T=e.unwrap,O=e.wrap,N=e.wrappers,j=/[&\u00A0"]/g,L=/[&\u00A0<>]/g,_=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),C="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;u.prototype=Object.create(w.prototype),g(u.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&D[this.localName])return void(this.textContent=e);var t=S(this.childNodes);this.invalidateShadowRenderer()?this instanceof N.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof N.HTMLTemplateElement?c(this.content,e):M(this).innerHTML=e;var n=S(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=l(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=l(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(d),["scrollLeft","scrollTop"].forEach(f),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(h),E(x,u,document.createElement("b")),e.wrappers.HTMLElement=u,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=p.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);p.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!d){var t=n(e);l.set(this,u(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.wrap,l=new WeakMap,p=new WeakMap,d=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return d?u(s(this).content):l.get(this)}}),d&&a(d,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,u=e.wrap,l=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return u(c(this).form)}}),a(l,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",u=window.SVGElement,l=document.createElementNS(c,"title");if(!("classList"in l)){var p=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",p),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(u,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){d.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),u=document.createElementNS(s,"use"),l=c.constructor,p=Object.getPrototypeOf(l.prototype),d=p.constructor;t.prototype=Object.create(p),"instanceRoot"in u&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,u),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(u,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,u=window.WebGLRenderingContext;if(u){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var l=Object.getPrototypeOf(u.prototype);l!==Object.prototype&&n(l,t.prototype);var p=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(u,t,p),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,u=e.registerWrapper,l=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),u(l,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var p=c(document.createComment(""));e.wrappers.Comment=p}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(l(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;h.set(this,o),this.treeScope_=new r(this,a(o||e)),f.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,u=e.setInnerHTML,l=e.unsafeUnwrap,p=e.unwrap,d=e.wrap,f=new WeakMap,h=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){u(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return h.get(this)||null},get host(){return f.get(this)||null},invalidateShadowRenderer:function(){return f.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=p(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=d(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=p(e).root;return t instanceof f?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=l(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,u=e.unwrapIfNeeded,l=e.wrap,p=e.getTreeScope,d=window.Range,f=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(u(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(u(e),t)},setStartBefore:function(e){s(this).setStartBefore(u(e))},setStartAfter:function(e){s(this).setStartAfter(u(e))},setEndBefore:function(e){s(this).setEndBefore(u(e))},setEndAfter:function(e){s(this).setEndAfter(u(e))},selectNode:function(e){s(this).selectNode(u(e))},selectNodeContents:function(e){s(this).selectNodeContents(u(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return l(s(this).extractContents())},cloneContents:function(){return l(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(u(e))},surroundContents:function(e){s(this).surroundContents(u(e))},cloneRange:function(){return l(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(u(e),t)},comparePoint:function(e,t){return s(this).comparePoint(u(e),t)},intersectsNode:function(e){return s(this).intersectsNode(u(e))},toString:function(){return s(this).toString()}},d.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return l(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var u=R(a.lastChild);u&&(u.nextSibling_=u.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){W.set(e,[])}function i(e){var t=W.get(e);return t||W.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function u(e){var t=A.get(e);return t||(t=new f(e),A.set(e,t)),t}function l(e){var t=D(e).root;return t instanceof _?t:null}function p(e){return u(e.host)}function d(e){this.skip=!1,this.node=e,this.childNodes=[]}function f(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function h(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function w(e){if(e instanceof j)return e;if(e instanceof N)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=w(t);if(n)return n}return null}function m(e,t){i(t).push(e);var n=I.get(e);n?n.push(t):I.set(e,[t])}function v(e){return I.get(e)}function g(e){I.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof O))return!1;if(!U.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof N||e instanceof j}function S(e){return e.shadowRoot}function M(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,O=e.wrappers.Element,N=e.wrappers.HTMLContentElement,j=e.wrappers.HTMLShadowElement,L=e.wrappers.Node,_=e.wrappers.ShadowRoot,D=(e.assert,e.getTreeScope),C=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,P=e.ArraySplice,W=new WeakMap,I=new WeakMap,A=new WeakMap,k=C(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],B=new P;B.equals=function(e,t){return x(e.node)===t},d.prototype={append:function(e){var t=new d(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=B.calculateSplices(o,i),u=0,l=0,p=0,d=0;d<c.length;d++){for(var f=c[d];p<f.index;p++)l++,o[u++].sync(s);for(var h=f.removed.length,w=0;w<h;w++){var m=R(i[l++]);s.get(m)||r(m)}for(var v=f.addedCount,g=i[l]&&R(i[l]),w=0;w<v;w++){var b=o[u++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}p+=v}for(var d=p;d<o.length;d++)o[d].sync(s)}}},f.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new d(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return D(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[k](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(S(e)){for(var t=e,n=h(t),r=M(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=w(i);if(a){var s=i.olderShadowRoot;s&&(n=h(s));for(var c=0;c<n.length;c++)m(n[c],a)}this.distributionResolution(i)}}for(var u=e.firstChild;u;u=u.nextSibling)this.distributionResolution(u)},poolDistribution:function(e,t){if(!(e instanceof j))if(e instanceof N){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(m(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)m(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(S(t)){var a=u(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var U=/^(:not\()?[*.#[a-zA-Z_|]/;L.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return!!t&&(t.invalidate(),!0)},N.prototype.getDistributedNodes=j.prototype.getDistributedNodes=function(){return s(),i(this)},O.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},N.prototype.nodeIsInserted_=j.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=l(this);t&&(e=p(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=u,e.getShadowTrees=M,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){l.call(this,e),this.treeScope_=new m(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return D(n.apply(L(this),arguments))}}function r(e,t){x.call(L(t),_(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof w&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){j(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){return D(n.apply(L(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(L(this),arguments)}}var u=e.GetElementsByInterface,l=e.wrappers.Node,p=e.ParentNodeInterface,d=e.NonElementParentNodeInterface,f=e.wrappers.Selection,h=e.SelectorsInterface,w=e.wrappers.ShadowRoot,m=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,S=e.matchesNames,M=e.mixin,T=e.registerWrapper,O=e.renderAllPending,N=e.rewrap,j=e.setWrapper,L=e.unsafeUnwrap,_=e.unwrap,D=e.wrap,C=e.wrapEventTargetMethods,H=(e.wrapNodeList,
-new WeakMap);t.prototype=Object.create(l.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=_(this).activeElement;if(!e||!e.nodeType)return null;for(var t=D(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;M(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,L(this))},getSelection:function(){return O(),new f(R.call(_(this)))},getElementsByName:function(e){return h.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var P=document.createTreeWalker,W=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(D(e))}}:"function"==typeof n&&(o=function(e){return n(D(e))})),new W(P.call(_(this),_(e),t,o,r))},document.registerElement){var I=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void j(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var u=Object.create(a),l=c.length-1;l>=0;l--)u=Object.create(u);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(u[e]=function(){D(this)instanceof r||N(this),t.apply(D(this),arguments)})});var p={prototype:u};i&&(p["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(u,r),e.nativePrototypeTable.set(o,u);I.call(_(this),t,p);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],S),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),M(t.prototype,u),M(t.prototype,p),M(t.prototype,h),M(t.prototype,d),M(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(_(this).implementation),H.set(this,e),e)},get defaultView(){return D(_(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),C([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=_(arguments[2]),D(A.apply(L(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,u=e.wrap,l=window.Window,p=window.getComputedStyle,d=window.getDefaultComputedStyle,f=window.getSelection;t.prototype=Object.create(n.prototype),l.prototype.getComputedStyle=function(e,t){return u(this||window).getComputedStyle(c(e),t)},d&&(l.prototype.getDefaultComputedStyle=function(e,t){return u(this||window).getDefaultComputedStyle(c(e),t)}),l.prototype.getSelection=function(){return u(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){l.prototype[e]=function(){var t=u(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),p.call(s(this),c(e),t)},getSelection:function(){return a(),new r(f.call(s(this)))},get document(){return u(s(this).document)}}),d&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),d.call(s(this),c(e),t)}),i(l,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/bower.json b/systrace/catapult/third_party/polymer/components/webcomponentsjs/bower.json
deleted file mode 100644
index b96995e..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/bower.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "name": "webcomponentsjs",
-  "main": "webcomponents.js",
-  "version": "0.7.24",
-  "homepage": "http://webcomponents.org",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/webcomponents/webcomponentsjs.git"
-  },
-  "keywords": [
-    "webcomponents"
-  ],
-  "license": "BSD",
-  "ignore": [],
-  "devDependencies": {
-    "web-component-tester": "^4.0.1"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/build.log b/systrace/catapult/third_party/polymer/components/webcomponentsjs/build.log
deleted file mode 100644
index 3f1d6bb..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/build.log
+++ /dev/null
@@ -1,507 +0,0 @@
-BUILD LOG
----------
-Build Time: 2017-02-06T15:35:26-0800
-
-NODEJS INFORMATION
-==================
-nodejs: v6.9.3
-accepts: 1.3.3
-accessibility-developer-tools: 2.11.0
-adm-zip: 0.4.7
-after: 0.8.2
-agent-base: 2.0.1
-align-text: 0.1.4
-ansi-regex: 2.1.1
-ansi-styles: 2.2.1
-archiver: 0.14.4
-append-field: 0.1.0
-archy: 1.0.0
-arr-diff: 2.0.0
-arr-flatten: 1.0.1
-array-differ: 1.0.0
-array-flatten: 1.1.1
-array-uniq: 1.0.3
-array-unique: 0.2.1
-asap: 2.0.5
-asn1: 0.1.11
-arraybuffer.slice: 0.0.6
-assert-plus: 0.1.5
-assertion-error: 1.0.2
-asynckit: 0.4.0
-async: 0.9.2
-aws-sign2: 0.6.0
-aws4: 1.5.0
-backo2: 1.0.2
-backoff: 2.5.0
-balanced-match: 0.4.2
-base64-arraybuffer: 0.1.5
-base64-js: 1.1.2
-base64id: 1.0.0
-bcrypt-pbkdf: 1.0.1
-beeper: 1.1.1
-better-assert: 1.0.2
-bl: 1.2.0
-blob: 0.0.4
-bluebird: 2.11.0
-body-parser: 1.16.0
-boom: 2.10.1
-boxen: 0.3.1
-brace-expansion: 1.1.6
-braces: 1.8.5
-browserstack: 1.5.0
-buffer-crc32: 0.2.13
-bunyan: 1.8.5
-buffer-shims: 1.0.0
-busboy: 0.2.14
-bytes: 2.4.0
-callsite: 1.0.0
-camelcase: 1.2.1
-capture-stack-trace: 1.0.0
-chai: 3.5.0
-caseless: 0.11.0
-center-align: 0.1.3
-chalk: 1.1.3
-cleankill: 1.0.3
-cliui: 2.1.0
-clone: 1.0.2
-clone-buffer: 1.0.0
-clone-stats: 0.0.1
-cloneable-readable: 1.0.0
-code-point-at: 1.1.0
-combined-stream: 1.0.5
-commander: 2.3.0
-component-bind: 1.0.0
-component-emitter: 1.1.2
-component-inherit: 0.0.3
-compress-commons: 0.2.9
-concat-map: 0.0.1
-concat-stream: 1.6.0
-concat-with-sourcemaps: 1.0.4
-configstore: 2.1.0
-content-disposition: 0.5.2
-content-type: 1.0.2
-cookie: 0.3.1
-cookie-signature: 1.0.6
-core-util-is: 1.0.2
-crc: 3.2.1
-crc32-stream: 0.3.4
-create-error-class: 3.0.2
-cryptiles: 2.0.5
-csv-generate: 0.0.6
-csv: 0.4.6
-csv-parse: 1.2.0
-ctype: 0.5.3
-csv-stringify: 0.0.8
-dashdash: 1.14.1
-dateformat: 2.0.0
-deap: 1.0.0
-debug: 2.6.0
-debuglog: 1.0.1
-decamelize: 1.2.0
-defaults: 1.0.3
-deep-eql: 0.1.3
-deep-extend: 0.4.1
-delayed-stream: 1.0.0
-depd: 1.1.0
-deprecated: 0.0.1
-detect-file: 0.1.0
-destroy: 1.0.4
-dezalgo: 1.0.3
-dicer: 0.2.5
-diff: 1.4.0
-dot-prop: 3.0.0
-dtrace-provider: 0.6.0
-duplexer2: 0.0.2
-ee-first: 1.1.1
-ecc-jsbn: 0.1.1
-encodeurl: 1.0.1
-end-of-stream: 0.1.5
-engine.io: 1.8.2
-engine.io-client: 1.8.2
-engine.io-parser: 1.3.2
-error-ex: 1.3.0
-escape-html: 1.0.3
-escape-regexp-component: 1.0.2
-etag: 1.7.0
-escape-string-regexp: 1.0.5
-expand-brackets: 0.1.5
-expand-range: 1.8.2
-expand-tilde: 1.2.2
-express: 4.14.1
-extend: 3.0.0
-extglob: 0.3.2
-extsprintf: 1.2.0
-fancy-log: 1.3.0
-fd-slicer: 1.0.1
-filename-regex: 2.0.0
-fill-range: 2.2.3
-filled-array: 1.1.0
-finalhandler: 0.5.1
-find-index: 0.1.1
-findup-sync: 0.4.3
-fined: 1.0.2
-first-chunk-stream: 1.0.0
-flagged-respawn: 0.3.2
-for-in: 0.1.6
-for-own: 0.1.4
-forever-agent: 0.6.1
-form-data: 2.1.2
-formatio: 1.1.1
-formidable: 1.1.1
-forwarded: 0.1.0
-fresh: 0.3.0
-freeport: 1.0.5
-fs-exists-sync: 0.1.0
-fs.realpath: 1.0.0
-gaze: 0.5.2
-generate-function: 2.0.0
-generate-object-property: 1.2.0
-getpass: 0.1.6
-github-url-from-git: 1.5.0
-github-url-from-username-repo: 1.0.2
-glob: 4.5.3
-glob-base: 0.3.0
-glob-parent: 2.0.0
-glob-stream: 3.1.18
-glob2base: 0.0.12
-glob-watcher: 0.0.6
-global-prefix: 0.1.5
-global-modules: 0.2.3
-globule: 0.1.0
-glogg: 1.0.0
-got: 5.7.1
-graceful-fs: 3.0.11
-growl: 1.9.2
-graceful-readlink: 1.0.1
-gulp: 3.9.1
-gulp-audit: 1.0.0
-gulp-concat: 2.6.1
-gulp-header: 1.8.8
-gulp-uglify: 1.5.4
-gulplog: 1.0.0
-gulp-util: 3.0.8
-handle-thing: 1.2.5
-har-validator: 2.0.6
-has-binary: 0.1.7
-has-ansi: 2.0.0
-has-color: 0.1.7
-has-cors: 1.1.0
-has-gulplog: 0.1.0
-hawk: 3.1.3
-hoek: 2.16.3
-hpack.js: 2.1.6
-homedir-polyfill: 1.0.1
-http-deceiver: 1.2.7
-http-errors: 1.5.1
-http-signature: 0.11.0
-https-proxy-agent: 1.0.0
-imurmurhash: 0.1.4
-indexof: 0.0.1
-inflight: 1.0.6
-iconv-lite: 0.4.15
-inherits: 2.0.3
-ini: 1.3.4
-interpret: 1.0.1
-ipaddr.js: 1.2.0
-is-absolute: 0.2.6
-is-arrayish: 0.2.1
-is-buffer: 1.1.4
-is-dotfile: 1.0.2
-is-equal-shallow: 0.1.3
-is-extglob: 1.0.0
-is-extendable: 0.1.1
-is-finite: 1.0.2
-is-fullwidth-code-point: 1.0.0
-is-glob: 2.0.1
-is-my-json-valid: 2.15.0
-is-npm: 1.0.0
-is-number: 2.1.0
-is-posix-bracket: 0.1.1
-is-obj: 1.0.1
-is-primitive: 2.0.0
-is-property: 1.0.2
-is-redirect: 1.0.0
-is-relative: 0.2.1
-is-retry-allowed: 1.1.0
-is-typedarray: 1.0.0
-is-stream: 1.1.0
-is-unc-path: 0.1.2
-is-utf8: 0.2.1
-is-windows: 0.2.0
-isarray: 0.0.1
-isexe: 1.1.2
-isobject: 2.1.0
-isstream: 0.1.2
-jju: 1.3.0
-jade: 0.26.3
-jodid25519: 1.0.2
-json-parse-helpfulerror: 1.0.3
-json-schema: 0.2.3
-jsbn: 0.1.0
-json-stringify-safe: 5.0.1
-json3: 3.3.2
-jsonpointer: 4.0.1
-keep-alive-agent: 0.0.1
-jsprim: 1.3.1
-kind-of: 3.1.0
-latest-version: 2.0.0
-lazy-cache: 1.0.4
-lazystream: 0.1.0
-launchpad: 0.5.4
-liftoff: 2.3.0
-lodash: 1.0.2
-lodash._basetostring: 3.0.1
-lodash._basevalues: 3.0.0
-lodash._basecopy: 3.0.1
-lodash._getnative: 3.9.1
-lodash._isiterateecall: 3.0.9
-lodash._reescape: 3.0.0
-lodash._reevaluate: 3.0.0
-lodash._reinterpolate: 3.0.0
-lodash._root: 3.0.1
-lodash.assignwith: 4.2.0
-lodash.escape: 3.2.0
-lodash.isarguments: 3.1.0
-lodash.isarray: 3.0.4
-lodash.isplainobject: 4.0.6
-lodash.isempty: 4.4.0
-lodash.isstring: 4.0.1
-lodash.keys: 3.1.2
-lodash.mapvalues: 4.6.0
-lodash.pick: 4.4.0
-lodash.template: 3.6.2
-lodash.templatesettings: 3.1.1
-lodash.restparam: 3.6.1
-lolex: 1.3.2
-longest: 1.0.1
-lru-cache: 2.7.3
-lowercase-keys: 1.0.0
-media-typer: 0.3.0
-map-cache: 0.2.2
-methods: 1.1.2
-merge-descriptors: 1.0.1
-micromatch: 2.3.11
-mime: 1.3.4
-mime-db: 1.26.0
-mime-types: 2.1.14
-minimalistic-assert: 1.0.0
-minimatch: 2.0.10
-minimist: 1.2.0
-mkdirp: 0.5.1
-mocha: 2.5.3
-moment: 2.17.1
-ms: 0.7.2
-multer: 1.3.0
-multipipe: 0.1.2
-mv: 2.1.1
-nan: 2.5.1
-ncp: 2.0.0
-negotiator: 0.6.1
-natives: 1.1.0
-node-int64: 0.3.3
-node-status-codes: 1.0.0
-node-uuid: 1.4.7
-nodegit-promise: 4.0.0
-nomnom: 1.8.1
-normalize-package-data: 1.0.3
-normalize-path: 2.0.1
-number-is-nan: 1.0.1
-oauth-sign: 0.8.2
-object-assign: 3.0.0
-object-component: 0.0.3
-object.omit: 2.0.1
-obuf: 1.1.1
-on-finished: 2.3.0
-once: 1.3.3
-options: 0.0.6
-orchestrator: 0.3.8
-ordered-read-streams: 0.1.0
-os-homedir: 1.0.2
-os-tmpdir: 1.0.2
-osenv: 0.1.4
-parse-filepath: 1.0.1
-package-json: 2.4.0
-parse-glob: 3.0.4
-parse-json: 2.2.0
-parse-passwd: 1.0.0
-parsejson: 0.0.3
-parseqs: 0.0.5
-parseuri: 0.0.5
-parseurl: 1.3.1
-path-is-absolute: 1.0.1
-path-root: 0.1.1
-path-root-regex: 0.1.2
-path-to-regexp: 0.1.7
-pend: 1.2.0
-pinkie: 2.0.4
-pinkie-promise: 2.0.1
-plist: 2.0.1
-precond: 0.2.3
-prepend-http: 1.0.4
-preserve: 0.2.0
-pretty-hrtime: 1.0.3
-process-nextick-args: 1.0.7
-progress: 1.1.8
-promisify-node: 0.4.0
-proxy-addr: 1.1.3
-pseudomap: 1.0.2
-q: 1.4.1
-punycode: 1.4.1
-qs: 6.2.1
-randomatic: 1.1.6
-range-parser: 1.2.0
-raw-body: 2.2.0
-rc: 1.1.6
-read-all-stream: 3.1.0
-read-installed: 3.1.5
-read-package-json: 1.3.3
-readable-stream: 1.1.14
-readdir-scoped-modules: 1.0.2
-rechoir: 0.6.2
-regex-cache: 0.4.3
-registry-auth-token: 3.1.0
-registry-url: 3.1.0
-remove-trailing-separator: 1.0.1
-repeat-element: 1.1.2
-repeating: 2.0.1
-repeat-string: 1.6.1
-request: 2.79.0
-replace-ext: 0.0.1
-resolve: 1.2.0
-resolve-dir: 0.1.1
-restify: 4.3.0
-right-align: 0.1.3
-rimraf: 2.4.5
-run-sequence: 1.2.2
-safe-json-stringify: 1.0.3
-samsam: 1.1.2
-sauce-connect-launcher: 1.2.0
-selenium-standalone: 5.11.2
-select-hose: 2.0.0
-semver-diff: 2.1.0
-semver: 4.3.6
-send: 0.11.1
-sequencify: 0.0.7
-serve-static: 1.11.2
-serve-waterfall: 1.1.1
-server-destroy: 1.0.1
-setprototypeof: 1.0.2
-sigmund: 1.0.1
-sinon: 1.17.7
-sinon-chai: 2.8.0
-slide: 1.1.6
-sntp: 1.0.9
-socket.io: 1.7.2
-socket.io-adapter: 0.5.0
-socket.io-client: 1.7.2
-source-map: 0.5.6
-socket.io-parser: 2.3.1
-sparkles: 1.0.0
-spdy: 3.4.4
-spdy-transport: 2.0.18
-sshpk: 1.10.2
-stacky: 1.3.1
-statuses: 1.3.1
-stream-consume: 0.1.0
-stream-transform: 0.1.1
-streamsearch: 0.1.2
-string-width: 1.0.2
-string_decoder: 0.10.31
-stringstream: 0.0.5
-strip-ansi: 3.0.1
-strip-bom: 1.0.0
-strip-json-comments: 1.0.4
-supports-color: 2.0.0
-tar-stream: 1.5.2
-temp: 0.8.3
-test-fixture: 2.0.1
-through2: 2.0.3
-tildify: 1.2.0
-time-stamp: 1.0.1
-timed-out: 3.1.3
-to-iso-string: 0.0.2
-tough-cookie: 2.3.2
-to-array: 0.1.4
-tweetnacl: 0.14.5
-tunnel-agent: 0.4.3
-type-detect: 1.0.0
-type-is: 1.6.14
-typedarray: 0.0.6
-uglify-js: 2.6.4
-uglify-save-license: 0.4.1
-uglify-to-browserify: 1.0.2
-ultron: 1.0.2
-unc-path-regex: 0.1.2
-underscore: 1.6.0
-underscore.string: 3.0.3
-unique-stream: 1.0.0
-unpipe: 1.0.0
-unzip-response: 1.0.2
-update-notifier: 0.6.3
-urijs: 1.16.1
-url-parse-lax: 1.0.0
-util: 0.10.3
-user-home: 1.1.1
-util-deprecate: 1.0.2
-util-extend: 1.0.3
-utils-merge: 1.0.0
-uuid: 2.0.3
-v8flags: 2.0.11
-vargs: 0.1.0
-vary: 1.1.0
-verror: 1.9.0
-vasync: 1.6.3
-vinyl: 0.5.3
-vinyl-fs: 0.3.14
-vinyl-sourcemaps-apply: 0.2.1
-wbuf: 1.7.2
-wct-local: 2.0.14
-wct-sauce: 1.8.6
-wd: 0.3.12
-which: 1.2.12
-web-component-tester: 4.3.6
-widest-line: 1.0.0
-window-size: 0.1.0
-wrappy: 1.0.2
-wordwrap: 0.0.2
-write-file-atomic: 1.3.1
-ws: 1.1.1
-wtf-8: 1.0.0
-xmlbuilder: 8.2.2
-xdg-basedir: 2.0.0
-xmldom: 0.1.27
-xmlhttprequest-ssl: 1.5.3
-xtend: 4.0.1
-yargs: 3.10.0
-yallist: 2.0.0
-yauzl: 2.7.0
-yeast: 0.1.2
-zip-stream: 0.5.2
-@types/chalk: 0.4.31
-@types/express-serve-static-core: 4.0.40
-@types/express: 4.0.35
-@types/freeport: 1.0.21
-@types/launchpad: 0.0.4
-@types/node: 6.0.62
-@types/mime: 0.0.29
-@types/serve-static: 1.7.31
-@types/which: 1.0.28
-
-REPO REVISIONS
-==============
-webcomponentsjs: 0fbebea7bb0d9c310fdc328493bb9f53c600b366
-
-BUILD HASHES
-============
-CustomElements.js: f33eb6e0a617ddfdc1508e1cb913442f6599c7f7
-CustomElements.min.js: a0e1b31e5a0bf95cfb0ff7f0cd12c354879cad8a
-HTMLImports.js: 3723342f206868f1a57001d7348159a3525d087f
-HTMLImports.min.js: 2dfac33d31d9a3b247868c85782197c9a24b70c6
-MutationObserver.js: 40566c0e3aec84650b43f74f51bdad7218a3a10a
-MutationObserver.min.js: 9838a8deeb8ae110aa1c19d6e5d88c52cfbb7924
-ShadowDOM.js: 9d56dd89199114170bc56ce0c759d0112d9895d6
-ShadowDOM.min.js: 6bca1a02e3ecb6933c27f24036ff40f83a581f82
-webcomponents-lite.js: 8ac8296830abcc2eecd9bfa4cea05edf9c5d4bc8
-webcomponents-lite.min.js: 6c4edd8efa046627216a625bf8f8903d41a9fe87
-webcomponents.js: 10940fc011b02665c826cde432601297fc0f1179
-webcomponents.min.js: 42404bdd62ebb7b6bb63d15d8e1bccf070de700b
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/package.json b/systrace/catapult/third_party/polymer/components/webcomponentsjs/package.json
deleted file mode 100644
index 10dc311..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "webcomponents.js",
-  "version": "0.7.24",
-  "description": "webcomponents.js",
-  "main": "webcomponents.js",
-  "directories": {
-    "test": "tests"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/webcomponents/webcomponentsjs.git"
-  },
-  "author": "The Polymer Authors",
-  "license": "BSD-3-Clause",
-  "bugs": {
-    "url": "https://github.com/webcomponents/webcomponentsjs/issues"
-  },
-  "scripts": {
-    "test": "wct"
-  },
-  "homepage": "http://webcomponents.org",
-  "devDependencies": {
-    "gulp": "^3.8.8",
-    "gulp-audit": "^1.0.0",
-    "gulp-concat": "^2.4.1",
-    "gulp-header": "^1.1.1",
-    "gulp-uglify": "^1.0.1",
-    "run-sequence": "^1.0.1",
-    "web-component-tester": "^4.0.1"
-  }
-}
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents-lite.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents-lite.js
deleted file mode 100644
index 957bd56..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents-lite.js
+++ /dev/null
@@ -1,2505 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-(function() {
-  window.WebComponents = window.WebComponents || {
-    flags: {}
-  };
-  var file = "webcomponents-lite.js";
-  var script = document.querySelector('script[src*="' + file + '"]');
-  var flags = {};
-  if (!flags.noOpts) {
-    location.search.slice(1).split("&").forEach(function(option) {
-      var parts = option.split("=");
-      var match;
-      if (parts[0] && (match = parts[0].match(/wc-(.+)/))) {
-        flags[match[1]] = parts[1] || true;
-      }
-    });
-    if (script) {
-      for (var i = 0, a; a = script.attributes[i]; i++) {
-        if (a.name !== "src") {
-          flags[a.name] = a.value || true;
-        }
-      }
-    }
-    if (flags.log && flags.log.split) {
-      var parts = flags.log.split(",");
-      flags.log = {};
-      parts.forEach(function(f) {
-        flags.log[f] = true;
-      });
-    } else {
-      flags.log = {};
-    }
-  }
-  if (flags.register) {
-    window.CustomElements = window.CustomElements || {
-      flags: {}
-    };
-    window.CustomElements.flags.register = flags.register;
-  }
-  WebComponents.flags = flags;
-})();
-
-(function(scope) {
-  "use strict";
-  var hasWorkingUrl = false;
-  if (!scope.forceJURL) {
-    try {
-      var u = new URL("b", "http://a");
-      u.pathname = "c%20d";
-      hasWorkingUrl = u.href === "http://a/c%20d";
-    } catch (e) {}
-  }
-  if (hasWorkingUrl) return;
-  var relative = Object.create(null);
-  relative["ftp"] = 21;
-  relative["file"] = 0;
-  relative["gopher"] = 70;
-  relative["http"] = 80;
-  relative["https"] = 443;
-  relative["ws"] = 80;
-  relative["wss"] = 443;
-  var relativePathDotMapping = Object.create(null);
-  relativePathDotMapping["%2e"] = ".";
-  relativePathDotMapping[".%2e"] = "..";
-  relativePathDotMapping["%2e."] = "..";
-  relativePathDotMapping["%2e%2e"] = "..";
-  function isRelativeScheme(scheme) {
-    return relative[scheme] !== undefined;
-  }
-  function invalid() {
-    clear.call(this);
-    this._isInvalid = true;
-  }
-  function IDNAToASCII(h) {
-    if ("" == h) {
-      invalid.call(this);
-    }
-    return h.toLowerCase();
-  }
-  function percentEscape(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 63, 96 ].indexOf(unicode) == -1) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-  function percentEscapeQuery(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 96 ].indexOf(unicode) == -1) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-  var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
-  function parse(input, stateOverride, base) {
-    function err(message) {
-      errors.push(message);
-    }
-    var state = stateOverride || "scheme start", cursor = 0, buffer = "", seenAt = false, seenBracket = false, errors = [];
-    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
-      var c = input[cursor];
-      switch (state) {
-       case "scheme start":
-        if (c && ALPHA.test(c)) {
-          buffer += c.toLowerCase();
-          state = "scheme";
-        } else if (!stateOverride) {
-          buffer = "";
-          state = "no scheme";
-          continue;
-        } else {
-          err("Invalid scheme.");
-          break loop;
-        }
-        break;
-
-       case "scheme":
-        if (c && ALPHANUMERIC.test(c)) {
-          buffer += c.toLowerCase();
-        } else if (":" == c) {
-          this._scheme = buffer;
-          buffer = "";
-          if (stateOverride) {
-            break loop;
-          }
-          if (isRelativeScheme(this._scheme)) {
-            this._isRelative = true;
-          }
-          if ("file" == this._scheme) {
-            state = "relative";
-          } else if (this._isRelative && base && base._scheme == this._scheme) {
-            state = "relative or authority";
-          } else if (this._isRelative) {
-            state = "authority first slash";
-          } else {
-            state = "scheme data";
-          }
-        } else if (!stateOverride) {
-          buffer = "";
-          cursor = 0;
-          state = "no scheme";
-          continue;
-        } else if (EOF == c) {
-          break loop;
-        } else {
-          err("Code point not allowed in scheme: " + c);
-          break loop;
-        }
-        break;
-
-       case "scheme data":
-        if ("?" == c) {
-          this._query = "?";
-          state = "query";
-        } else if ("#" == c) {
-          this._fragment = "#";
-          state = "fragment";
-        } else {
-          if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
-            this._schemeData += percentEscape(c);
-          }
-        }
-        break;
-
-       case "no scheme":
-        if (!base || !isRelativeScheme(base._scheme)) {
-          err("Missing scheme.");
-          invalid.call(this);
-        } else {
-          state = "relative";
-          continue;
-        }
-        break;
-
-       case "relative or authority":
-        if ("/" == c && "/" == input[cursor + 1]) {
-          state = "authority ignore slashes";
-        } else {
-          err("Expected /, got: " + c);
-          state = "relative";
-          continue;
-        }
-        break;
-
-       case "relative":
-        this._isRelative = true;
-        if ("file" != this._scheme) this._scheme = base._scheme;
-        if (EOF == c) {
-          this._host = base._host;
-          this._port = base._port;
-          this._path = base._path.slice();
-          this._query = base._query;
-          this._username = base._username;
-          this._password = base._password;
-          break loop;
-        } else if ("/" == c || "\\" == c) {
-          if ("\\" == c) err("\\ is an invalid code point.");
-          state = "relative slash";
-        } else if ("?" == c) {
-          this._host = base._host;
-          this._port = base._port;
-          this._path = base._path.slice();
-          this._query = "?";
-          this._username = base._username;
-          this._password = base._password;
-          state = "query";
-        } else if ("#" == c) {
-          this._host = base._host;
-          this._port = base._port;
-          this._path = base._path.slice();
-          this._query = base._query;
-          this._fragment = "#";
-          this._username = base._username;
-          this._password = base._password;
-          state = "fragment";
-        } else {
-          var nextC = input[cursor + 1];
-          var nextNextC = input[cursor + 2];
-          if ("file" != this._scheme || !ALPHA.test(c) || nextC != ":" && nextC != "|" || EOF != nextNextC && "/" != nextNextC && "\\" != nextNextC && "?" != nextNextC && "#" != nextNextC) {
-            this._host = base._host;
-            this._port = base._port;
-            this._username = base._username;
-            this._password = base._password;
-            this._path = base._path.slice();
-            this._path.pop();
-          }
-          state = "relative path";
-          continue;
-        }
-        break;
-
-       case "relative slash":
-        if ("/" == c || "\\" == c) {
-          if ("\\" == c) {
-            err("\\ is an invalid code point.");
-          }
-          if ("file" == this._scheme) {
-            state = "file host";
-          } else {
-            state = "authority ignore slashes";
-          }
-        } else {
-          if ("file" != this._scheme) {
-            this._host = base._host;
-            this._port = base._port;
-            this._username = base._username;
-            this._password = base._password;
-          }
-          state = "relative path";
-          continue;
-        }
-        break;
-
-       case "authority first slash":
-        if ("/" == c) {
-          state = "authority second slash";
-        } else {
-          err("Expected '/', got: " + c);
-          state = "authority ignore slashes";
-          continue;
-        }
-        break;
-
-       case "authority second slash":
-        state = "authority ignore slashes";
-        if ("/" != c) {
-          err("Expected '/', got: " + c);
-          continue;
-        }
-        break;
-
-       case "authority ignore slashes":
-        if ("/" != c && "\\" != c) {
-          state = "authority";
-          continue;
-        } else {
-          err("Expected authority, got: " + c);
-        }
-        break;
-
-       case "authority":
-        if ("@" == c) {
-          if (seenAt) {
-            err("@ already seen.");
-            buffer += "%40";
-          }
-          seenAt = true;
-          for (var i = 0; i < buffer.length; i++) {
-            var cp = buffer[i];
-            if ("\t" == cp || "\n" == cp || "\r" == cp) {
-              err("Invalid whitespace in authority.");
-              continue;
-            }
-            if (":" == cp && null === this._password) {
-              this._password = "";
-              continue;
-            }
-            var tempC = percentEscape(cp);
-            null !== this._password ? this._password += tempC : this._username += tempC;
-          }
-          buffer = "";
-        } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) {
-          cursor -= buffer.length;
-          buffer = "";
-          state = "host";
-          continue;
-        } else {
-          buffer += c;
-        }
-        break;
-
-       case "file host":
-        if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) {
-          if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ":" || buffer[1] == "|")) {
-            state = "relative path";
-          } else if (buffer.length == 0) {
-            state = "relative path start";
-          } else {
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = "";
-            state = "relative path start";
-          }
-          continue;
-        } else if ("\t" == c || "\n" == c || "\r" == c) {
-          err("Invalid whitespace in file host.");
-        } else {
-          buffer += c;
-        }
-        break;
-
-       case "host":
-       case "hostname":
-        if (":" == c && !seenBracket) {
-          this._host = IDNAToASCII.call(this, buffer);
-          buffer = "";
-          state = "port";
-          if ("hostname" == stateOverride) {
-            break loop;
-          }
-        } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) {
-          this._host = IDNAToASCII.call(this, buffer);
-          buffer = "";
-          state = "relative path start";
-          if (stateOverride) {
-            break loop;
-          }
-          continue;
-        } else if ("\t" != c && "\n" != c && "\r" != c) {
-          if ("[" == c) {
-            seenBracket = true;
-          } else if ("]" == c) {
-            seenBracket = false;
-          }
-          buffer += c;
-        } else {
-          err("Invalid code point in host/hostname: " + c);
-        }
-        break;
-
-       case "port":
-        if (/[0-9]/.test(c)) {
-          buffer += c;
-        } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c || stateOverride) {
-          if ("" != buffer) {
-            var temp = parseInt(buffer, 10);
-            if (temp != relative[this._scheme]) {
-              this._port = temp + "";
-            }
-            buffer = "";
-          }
-          if (stateOverride) {
-            break loop;
-          }
-          state = "relative path start";
-          continue;
-        } else if ("\t" == c || "\n" == c || "\r" == c) {
-          err("Invalid code point in port: " + c);
-        } else {
-          invalid.call(this);
-        }
-        break;
-
-       case "relative path start":
-        if ("\\" == c) err("'\\' not allowed in path.");
-        state = "relative path";
-        if ("/" != c && "\\" != c) {
-          continue;
-        }
-        break;
-
-       case "relative path":
-        if (EOF == c || "/" == c || "\\" == c || !stateOverride && ("?" == c || "#" == c)) {
-          if ("\\" == c) {
-            err("\\ not allowed in relative path.");
-          }
-          var tmp;
-          if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
-            buffer = tmp;
-          }
-          if (".." == buffer) {
-            this._path.pop();
-            if ("/" != c && "\\" != c) {
-              this._path.push("");
-            }
-          } else if ("." == buffer && "/" != c && "\\" != c) {
-            this._path.push("");
-          } else if ("." != buffer) {
-            if ("file" == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == "|") {
-              buffer = buffer[0] + ":";
-            }
-            this._path.push(buffer);
-          }
-          buffer = "";
-          if ("?" == c) {
-            this._query = "?";
-            state = "query";
-          } else if ("#" == c) {
-            this._fragment = "#";
-            state = "fragment";
-          }
-        } else if ("\t" != c && "\n" != c && "\r" != c) {
-          buffer += percentEscape(c);
-        }
-        break;
-
-       case "query":
-        if (!stateOverride && "#" == c) {
-          this._fragment = "#";
-          state = "fragment";
-        } else if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
-          this._query += percentEscapeQuery(c);
-        }
-        break;
-
-       case "fragment":
-        if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
-          this._fragment += c;
-        }
-        break;
-      }
-      cursor++;
-    }
-  }
-  function clear() {
-    this._scheme = "";
-    this._schemeData = "";
-    this._username = "";
-    this._password = null;
-    this._host = "";
-    this._port = "";
-    this._path = [];
-    this._query = "";
-    this._fragment = "";
-    this._isInvalid = false;
-    this._isRelative = false;
-  }
-  function jURL(url, base) {
-    if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base));
-    this._url = url;
-    clear.call(this);
-    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, "");
-    parse.call(this, input, null, base);
-  }
-  jURL.prototype = {
-    toString: function() {
-      return this.href;
-    },
-    get href() {
-      if (this._isInvalid) return this._url;
-      var authority = "";
-      if ("" != this._username || null != this._password) {
-        authority = this._username + (null != this._password ? ":" + this._password : "") + "@";
-      }
-      return this.protocol + (this._isRelative ? "//" + authority + this.host : "") + this.pathname + this._query + this._fragment;
-    },
-    set href(href) {
-      clear.call(this);
-      parse.call(this, href);
-    },
-    get protocol() {
-      return this._scheme + ":";
-    },
-    set protocol(protocol) {
-      if (this._isInvalid) return;
-      parse.call(this, protocol + ":", "scheme start");
-    },
-    get host() {
-      return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host;
-    },
-    set host(host) {
-      if (this._isInvalid || !this._isRelative) return;
-      parse.call(this, host, "host");
-    },
-    get hostname() {
-      return this._host;
-    },
-    set hostname(hostname) {
-      if (this._isInvalid || !this._isRelative) return;
-      parse.call(this, hostname, "hostname");
-    },
-    get port() {
-      return this._port;
-    },
-    set port(port) {
-      if (this._isInvalid || !this._isRelative) return;
-      parse.call(this, port, "port");
-    },
-    get pathname() {
-      return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData;
-    },
-    set pathname(pathname) {
-      if (this._isInvalid || !this._isRelative) return;
-      this._path = [];
-      parse.call(this, pathname, "relative path start");
-    },
-    get search() {
-      return this._isInvalid || !this._query || "?" == this._query ? "" : this._query;
-    },
-    set search(search) {
-      if (this._isInvalid || !this._isRelative) return;
-      this._query = "?";
-      if ("?" == search[0]) search = search.slice(1);
-      parse.call(this, search, "query");
-    },
-    get hash() {
-      return this._isInvalid || !this._fragment || "#" == this._fragment ? "" : this._fragment;
-    },
-    set hash(hash) {
-      if (this._isInvalid) return;
-      this._fragment = "#";
-      if ("#" == hash[0]) hash = hash.slice(1);
-      parse.call(this, hash, "fragment");
-    },
-    get origin() {
-      var host;
-      if (this._isInvalid || !this._scheme) {
-        return "";
-      }
-      switch (this._scheme) {
-       case "data":
-       case "file":
-       case "javascript":
-       case "mailto":
-        return "null";
-      }
-      host = this.host;
-      if (!host) {
-        return "";
-      }
-      return this._scheme + "://" + host;
-    }
-  };
-  var OriginalURL = scope.URL;
-  if (OriginalURL) {
-    jURL.createObjectURL = function(blob) {
-      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
-    };
-    jURL.revokeObjectURL = function(url) {
-      OriginalURL.revokeObjectURL(url);
-    };
-  }
-  scope.URL = jURL;
-})(self);
-
-if (typeof WeakMap === "undefined") {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-    var WeakMap = function() {
-      this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
-    };
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
-          value: [ key, value ],
-          writable: true
-        });
-        return this;
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
-      },
-      "delete": function(key) {
-        var entry = key[this.name];
-        if (!entry || entry[0] !== key) return false;
-        entry[0] = entry[1] = undefined;
-        return true;
-      },
-      has: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        return entry[0] === key;
-      }
-    };
-    window.WeakMap = WeakMap;
-  })();
-}
-
-(function(global) {
-  if (global.JsMutationObserver) {
-    return;
-  }
-  var registrationsTable = new WeakMap();
-  var setImmediate;
-  if (/Trident|Edge/.test(navigator.userAgent)) {
-    setImmediate = setTimeout;
-  } else if (window.setImmediate) {
-    setImmediate = window.setImmediate;
-  } else {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener("message", function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, "*");
-    };
-  }
-  var isScheduled = false;
-  var scheduledObservers = [];
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
-  }
-  function dispatchCallbacks() {
-    isScheduled = false;
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-      var queue = observer.takeRecords();
-      removeTransientObserversFor(observer);
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-    if (anyNonEmpty) dispatchCallbacks();
-  }
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations) return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer) registration.removeTransientObservers();
-      });
-    });
-  }
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-          if (node !== target && !options.subtree) continue;
-          var record = callback(options);
-          if (record) registration.enqueue(record);
-        }
-      }
-    }
-  }
-  var uidCounter = 0;
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
-        throw new SyntaxError();
-      }
-      var registrations = registrationsTable.get(target);
-      if (!registrations) registrationsTable.set(target, registrations = []);
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-      registration.addListeners();
-    },
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  }
-  var currentRecord, recordWithOldValue;
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue) return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord) return lastRecord;
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
-    return null;
-  }
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-      records[length] = record;
-    },
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
-    },
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
-    },
-    addTransientObserver: function(node) {
-      if (node === this.target) return;
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations) registrationsTable.set(node, registrations = []);
-      registrations.push(this);
-    },
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-      transientObservedNodes.forEach(function(node) {
-        this.removeListeners_(node);
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-    },
-    handleEvent: function(e) {
-      e.stopImmediatePropagation();
-      switch (e.type) {
-       case "DOMAttrModified":
-        var name = e.attrName;
-        var namespace = e.relatedNode.namespaceURI;
-        var target = e.target;
-        var record = new getRecord("attributes", target);
-        record.attributeName = name;
-        record.attributeNamespace = namespace;
-        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.attributes) return;
-          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
-            return;
-          }
-          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMCharacterDataModified":
-        var target = e.target;
-        var record = getRecord("characterData", target);
-        var oldValue = e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.characterData) return;
-          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMNodeRemoved":
-        this.addTransientObserver(e.target);
-
-       case "DOMNodeInserted":
-        var changedNode = e.target;
-        var addedNodes, removedNodes;
-        if (e.type === "DOMNodeInserted") {
-          addedNodes = [ changedNode ];
-          removedNodes = [];
-        } else {
-          addedNodes = [];
-          removedNodes = [ changedNode ];
-        }
-        var previousSibling = changedNode.previousSibling;
-        var nextSibling = changedNode.nextSibling;
-        var record = getRecord("childList", e.target.parentNode);
-        record.addedNodes = addedNodes;
-        record.removedNodes = removedNodes;
-        record.previousSibling = previousSibling;
-        record.nextSibling = nextSibling;
-        forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
-          if (!options.childList) return;
-          return record;
-        });
-      }
-      clearRecords();
-    }
-  };
-  global.JsMutationObserver = JsMutationObserver;
-  if (!global.MutationObserver) {
-    global.MutationObserver = JsMutationObserver;
-    JsMutationObserver._isPolyfilled = true;
-  }
-})(self);
-
-(function() {
-  var needsTemplate = typeof HTMLTemplateElement === "undefined";
-  if (/Trident/.test(navigator.userAgent)) {
-    (function() {
-      var importNode = document.importNode;
-      document.importNode = function() {
-        var n = importNode.apply(document, arguments);
-        if (n.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
-          var f = document.createDocumentFragment();
-          f.appendChild(n);
-          return f;
-        } else {
-          return n;
-        }
-      };
-    })();
-  }
-  var needsCloning = function() {
-    if (!needsTemplate) {
-      var t = document.createElement("template");
-      var t2 = document.createElement("template");
-      t2.content.appendChild(document.createElement("div"));
-      t.content.appendChild(t2);
-      var clone = t.cloneNode(true);
-      return clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0;
-    }
-  }();
-  var TEMPLATE_TAG = "template";
-  var TemplateImpl = function() {};
-  if (needsTemplate) {
-    var contentDoc = document.implementation.createHTMLDocument("template");
-    var canDecorate = true;
-    var templateStyle = document.createElement("style");
-    templateStyle.textContent = TEMPLATE_TAG + "{display:none;}";
-    var head = document.head;
-    head.insertBefore(templateStyle, head.firstElementChild);
-    TemplateImpl.prototype = Object.create(HTMLElement.prototype);
-    TemplateImpl.decorate = function(template) {
-      if (template.content) {
-        return;
-      }
-      template.content = contentDoc.createDocumentFragment();
-      var child;
-      while (child = template.firstChild) {
-        template.content.appendChild(child);
-      }
-      template.cloneNode = function(deep) {
-        return TemplateImpl.cloneNode(this, deep);
-      };
-      if (canDecorate) {
-        try {
-          Object.defineProperty(template, "innerHTML", {
-            get: function() {
-              var o = "";
-              for (var e = this.content.firstChild; e; e = e.nextSibling) {
-                o += e.outerHTML || escapeData(e.data);
-              }
-              return o;
-            },
-            set: function(text) {
-              contentDoc.body.innerHTML = text;
-              TemplateImpl.bootstrap(contentDoc);
-              while (this.content.firstChild) {
-                this.content.removeChild(this.content.firstChild);
-              }
-              while (contentDoc.body.firstChild) {
-                this.content.appendChild(contentDoc.body.firstChild);
-              }
-            },
-            configurable: true
-          });
-        } catch (err) {
-          canDecorate = false;
-        }
-      }
-      TemplateImpl.bootstrap(template.content);
-    };
-    TemplateImpl.bootstrap = function(doc) {
-      var templates = doc.querySelectorAll(TEMPLATE_TAG);
-      for (var i = 0, l = templates.length, t; i < l && (t = templates[i]); i++) {
-        TemplateImpl.decorate(t);
-      }
-    };
-    document.addEventListener("DOMContentLoaded", function() {
-      TemplateImpl.bootstrap(document);
-    });
-    var createElement = document.createElement;
-    document.createElement = function() {
-      "use strict";
-      var el = createElement.apply(document, arguments);
-      if (el.localName === "template") {
-        TemplateImpl.decorate(el);
-      }
-      return el;
-    };
-    var escapeDataRegExp = /[&\u00A0<>]/g;
-    function escapeReplace(c) {
-      switch (c) {
-       case "&":
-        return "&amp;";
-
-       case "<":
-        return "&lt;";
-
-       case ">":
-        return "&gt;";
-
-       case " ":
-        return "&nbsp;";
-      }
-    }
-    function escapeData(s) {
-      return s.replace(escapeDataRegExp, escapeReplace);
-    }
-  }
-  if (needsTemplate || needsCloning) {
-    var nativeCloneNode = Node.prototype.cloneNode;
-    TemplateImpl.cloneNode = function(template, deep) {
-      var clone = nativeCloneNode.call(template, false);
-      if (this.decorate) {
-        this.decorate(clone);
-      }
-      if (deep) {
-        clone.content.appendChild(nativeCloneNode.call(template.content, true));
-        this.fixClonedDom(clone.content, template.content);
-      }
-      return clone;
-    };
-    TemplateImpl.fixClonedDom = function(clone, source) {
-      if (!source.querySelectorAll) return;
-      var s$ = source.querySelectorAll(TEMPLATE_TAG);
-      var t$ = clone.querySelectorAll(TEMPLATE_TAG);
-      for (var i = 0, l = t$.length, t, s; i < l; i++) {
-        s = s$[i];
-        t = t$[i];
-        if (this.decorate) {
-          this.decorate(s);
-        }
-        t.parentNode.replaceChild(s.cloneNode(true), t);
-      }
-    };
-    var originalImportNode = document.importNode;
-    Node.prototype.cloneNode = function(deep) {
-      var dom = nativeCloneNode.call(this, deep);
-      if (deep) {
-        TemplateImpl.fixClonedDom(dom, this);
-      }
-      return dom;
-    };
-    document.importNode = function(element, deep) {
-      if (element.localName === TEMPLATE_TAG) {
-        return TemplateImpl.cloneNode(element, deep);
-      } else {
-        var dom = originalImportNode.call(document, element, deep);
-        if (deep) {
-          TemplateImpl.fixClonedDom(dom, element);
-        }
-        return dom;
-      }
-    };
-    if (needsCloning) {
-      HTMLTemplateElement.prototype.cloneNode = function(deep) {
-        return TemplateImpl.cloneNode(this, deep);
-      };
-    }
-  }
-  if (needsTemplate) {
-    window.HTMLTemplateElement = TemplateImpl;
-  }
-})();
-
-(function(scope) {
-  "use strict";
-  if (!(window.performance && window.performance.now)) {
-    var start = Date.now();
-    window.performance = {
-      now: function() {
-        return Date.now() - start;
-      }
-    };
-  }
-  if (!window.requestAnimationFrame) {
-    window.requestAnimationFrame = function() {
-      var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-      return nativeRaf ? function(callback) {
-        return nativeRaf(function() {
-          callback(performance.now());
-        });
-      } : function(callback) {
-        return window.setTimeout(callback, 1e3 / 60);
-      };
-    }();
-  }
-  if (!window.cancelAnimationFrame) {
-    window.cancelAnimationFrame = function() {
-      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {
-        clearTimeout(id);
-      };
-    }();
-  }
-  var workingDefaultPrevented = function() {
-    var e = document.createEvent("Event");
-    e.initEvent("foo", true, true);
-    e.preventDefault();
-    return e.defaultPrevented;
-  }();
-  if (!workingDefaultPrevented) {
-    var origPreventDefault = Event.prototype.preventDefault;
-    Event.prototype.preventDefault = function() {
-      if (!this.cancelable) {
-        return;
-      }
-      origPreventDefault.call(this);
-      Object.defineProperty(this, "defaultPrevented", {
-        get: function() {
-          return true;
-        },
-        configurable: true
-      });
-    };
-  }
-  var isIE = /Trident/.test(navigator.userAgent);
-  if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") {
-    window.CustomEvent = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("CustomEvent");
-      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
-      return e;
-    };
-    window.CustomEvent.prototype = window.Event.prototype;
-  }
-  if (!window.Event || isIE && typeof window.Event !== "function") {
-    var origEvent = window.Event;
-    window.Event = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("Event");
-      e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable));
-      return e;
-    };
-    window.Event.prototype = origEvent.prototype;
-  }
-})(window.WebComponents);
-
-window.HTMLImports = window.HTMLImports || {
-  flags: {}
-};
-
-(function(scope) {
-  var IMPORT_LINK_TYPE = "import";
-  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
-  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
-  var wrap = function(node) {
-    return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node;
-  };
-  var rootDocument = wrap(document);
-  var currentScriptDescriptor = {
-    get: function() {
-      var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
-      return wrap(script);
-    },
-    configurable: true
-  };
-  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
-  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
-  var isIE = /Trident/.test(navigator.userAgent);
-  function whenReady(callback, doc) {
-    doc = doc || rootDocument;
-    whenDocumentReady(function() {
-      watchImportsLoad(callback, doc);
-    }, doc);
-  }
-  var requiredReadyState = isIE ? "complete" : "interactive";
-  var READY_EVENT = "readystatechange";
-  function isDocumentReady(doc) {
-    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
-  }
-  function whenDocumentReady(callback, doc) {
-    if (!isDocumentReady(doc)) {
-      var checkReady = function() {
-        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
-          doc.removeEventListener(READY_EVENT, checkReady);
-          whenDocumentReady(callback, doc);
-        }
-      };
-      doc.addEventListener(READY_EVENT, checkReady);
-    } else if (callback) {
-      callback();
-    }
-  }
-  function markTargetLoaded(event) {
-    event.target.__loaded = true;
-  }
-  function watchImportsLoad(callback, doc) {
-    var imports = doc.querySelectorAll("link[rel=import]");
-    var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = [];
-    function checkDone() {
-      if (parsedCount == importCount && callback) {
-        callback({
-          allImports: imports,
-          loadedImports: newImports,
-          errorImports: errorImports
-        });
-      }
-    }
-    function loadedImport(e) {
-      markTargetLoaded(e);
-      newImports.push(this);
-      parsedCount++;
-      checkDone();
-    }
-    function errorLoadingImport(e) {
-      errorImports.push(this);
-      parsedCount++;
-      checkDone();
-    }
-    if (importCount) {
-      for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) {
-        if (isImportLoaded(imp)) {
-          newImports.push(this);
-          parsedCount++;
-          checkDone();
-        } else {
-          imp.addEventListener("load", loadedImport);
-          imp.addEventListener("error", errorLoadingImport);
-        }
-      }
-    } else {
-      checkDone();
-    }
-  }
-  function isImportLoaded(link) {
-    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
-  }
-  if (useNative) {
-    new MutationObserver(function(mxns) {
-      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
-        if (m.addedNodes) {
-          handleImports(m.addedNodes);
-        }
-      }
-    }).observe(document.head, {
-      childList: true
-    });
-    function handleImports(nodes) {
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        if (isImport(n)) {
-          handleImport(n);
-        }
-      }
-    }
-    function isImport(element) {
-      return element.localName === "link" && element.rel === "import";
-    }
-    function handleImport(element) {
-      var loaded = element.import;
-      if (loaded) {
-        markTargetLoaded({
-          target: element
-        });
-      } else {
-        element.addEventListener("load", markTargetLoaded);
-        element.addEventListener("error", markTargetLoaded);
-      }
-    }
-    (function() {
-      if (document.readyState === "loading") {
-        var imports = document.querySelectorAll("link[rel=import]");
-        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
-          handleImport(imp);
-        }
-      }
-    })();
-  }
-  whenReady(function(detail) {
-    window.HTMLImports.ready = true;
-    window.HTMLImports.readyTime = new Date().getTime();
-    var evt = rootDocument.createEvent("CustomEvent");
-    evt.initCustomEvent("HTMLImportsLoaded", true, true, detail);
-    rootDocument.dispatchEvent(evt);
-  });
-  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-  scope.useNative = useNative;
-  scope.rootDocument = rootDocument;
-  scope.whenReady = whenReady;
-  scope.isIE = isIE;
-})(window.HTMLImports);
-
-(function(scope) {
-  var modules = [];
-  var addModule = function(module) {
-    modules.push(module);
-  };
-  var initializeModules = function() {
-    modules.forEach(function(module) {
-      module(scope);
-    });
-  };
-  scope.addModule = addModule;
-  scope.initializeModules = initializeModules;
-})(window.HTMLImports);
-
-window.HTMLImports.addModule(function(scope) {
-  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-  var path = {
-    resolveUrlsInStyle: function(style, linkUrl) {
-      var doc = style.ownerDocument;
-      var resolver = doc.createElement("a");
-      style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver);
-      return style;
-    },
-    resolveUrlsInCssText: function(cssText, linkUrl, urlObj) {
-      var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP);
-      r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP);
-      return r;
-    },
-    replaceUrls: function(text, urlObj, linkUrl, regexp) {
-      return text.replace(regexp, function(m, pre, url, post) {
-        var urlPath = url.replace(/["']/g, "");
-        if (linkUrl) {
-          urlPath = new URL(urlPath, linkUrl).href;
-        }
-        urlObj.href = urlPath;
-        urlPath = urlObj.href;
-        return pre + "'" + urlPath + "'" + post;
-      });
-    }
-  };
-  scope.path = path;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var xhr = {
-    async: true,
-    ok: function(request) {
-      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
-    },
-    load: function(url, next, nextContext) {
-      var request = new XMLHttpRequest();
-      if (scope.flags.debug || scope.flags.bust) {
-        url += "?" + Math.random();
-      }
-      request.open("GET", url, xhr.async);
-      request.addEventListener("readystatechange", function(e) {
-        if (request.readyState === 4) {
-          var redirectedUrl = null;
-          try {
-            var locationHeader = request.getResponseHeader("Location");
-            if (locationHeader) {
-              redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
-            }
-          } catch (e) {
-            console.error(e.message);
-          }
-          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
-        }
-      });
-      request.send();
-      return request;
-    },
-    loadDocument: function(url, next, nextContext) {
-      this.load(url, next, nextContext).responseType = "document";
-    }
-  };
-  scope.xhr = xhr;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var xhr = scope.xhr;
-  var flags = scope.flags;
-  var Loader = function(onLoad, onComplete) {
-    this.cache = {};
-    this.onload = onLoad;
-    this.oncomplete = onComplete;
-    this.inflight = 0;
-    this.pending = {};
-  };
-  Loader.prototype = {
-    addNodes: function(nodes) {
-      this.inflight += nodes.length;
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        this.require(n);
-      }
-      this.checkDone();
-    },
-    addNode: function(node) {
-      this.inflight++;
-      this.require(node);
-      this.checkDone();
-    },
-    require: function(elt) {
-      var url = elt.src || elt.href;
-      elt.__nodeUrl = url;
-      if (!this.dedupe(url, elt)) {
-        this.fetch(url, elt);
-      }
-    },
-    dedupe: function(url, elt) {
-      if (this.pending[url]) {
-        this.pending[url].push(elt);
-        return true;
-      }
-      var resource;
-      if (this.cache[url]) {
-        this.onload(url, elt, this.cache[url]);
-        this.tail();
-        return true;
-      }
-      this.pending[url] = [ elt ];
-      return false;
-    },
-    fetch: function(url, elt) {
-      flags.load && console.log("fetch", url, elt);
-      if (!url) {
-        setTimeout(function() {
-          this.receive(url, elt, {
-            error: "href must be specified"
-          }, null);
-        }.bind(this), 0);
-      } else if (url.match(/^data:/)) {
-        var pieces = url.split(",");
-        var header = pieces[0];
-        var body = pieces[1];
-        if (header.indexOf(";base64") > -1) {
-          body = atob(body);
-        } else {
-          body = decodeURIComponent(body);
-        }
-        setTimeout(function() {
-          this.receive(url, elt, null, body);
-        }.bind(this), 0);
-      } else {
-        var receiveXhr = function(err, resource, redirectedUrl) {
-          this.receive(url, elt, err, resource, redirectedUrl);
-        }.bind(this);
-        xhr.load(url, receiveXhr);
-      }
-    },
-    receive: function(url, elt, err, resource, redirectedUrl) {
-      this.cache[url] = resource;
-      var $p = this.pending[url];
-      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
-        this.onload(url, p, resource, err, redirectedUrl);
-        this.tail();
-      }
-      this.pending[url] = null;
-    },
-    tail: function() {
-      --this.inflight;
-      this.checkDone();
-    },
-    checkDone: function() {
-      if (!this.inflight) {
-        this.oncomplete();
-      }
-    }
-  };
-  scope.Loader = Loader;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var Observer = function(addCallback) {
-    this.addCallback = addCallback;
-    this.mo = new MutationObserver(this.handler.bind(this));
-  };
-  Observer.prototype = {
-    handler: function(mutations) {
-      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
-        if (m.type === "childList" && m.addedNodes.length) {
-          this.addedNodes(m.addedNodes);
-        }
-      }
-    },
-    addedNodes: function(nodes) {
-      if (this.addCallback) {
-        this.addCallback(nodes);
-      }
-      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
-        if (n.children && n.children.length) {
-          this.addedNodes(n.children);
-        }
-      }
-    },
-    observe: function(root) {
-      this.mo.observe(root, {
-        childList: true,
-        subtree: true
-      });
-    }
-  };
-  scope.Observer = Observer;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var path = scope.path;
-  var rootDocument = scope.rootDocument;
-  var flags = scope.flags;
-  var isIE = scope.isIE;
-  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
-  var importParser = {
-    documentSelectors: IMPORT_SELECTOR,
-    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","),
-    map: {
-      link: "parseLink",
-      script: "parseScript",
-      style: "parseStyle"
-    },
-    dynamicElements: [],
-    parseNext: function() {
-      var next = this.nextToParse();
-      if (next) {
-        this.parse(next);
-      }
-    },
-    parse: function(elt) {
-      if (this.isParsed(elt)) {
-        flags.parse && console.log("[%s] is already parsed", elt.localName);
-        return;
-      }
-      var fn = this[this.map[elt.localName]];
-      if (fn) {
-        this.markParsing(elt);
-        fn.call(this, elt);
-      }
-    },
-    parseDynamic: function(elt, quiet) {
-      this.dynamicElements.push(elt);
-      if (!quiet) {
-        this.parseNext();
-      }
-    },
-    markParsing: function(elt) {
-      flags.parse && console.log("parsing", elt);
-      this.parsingElement = elt;
-    },
-    markParsingComplete: function(elt) {
-      elt.__importParsed = true;
-      this.markDynamicParsingComplete(elt);
-      if (elt.__importElement) {
-        elt.__importElement.__importParsed = true;
-        this.markDynamicParsingComplete(elt.__importElement);
-      }
-      this.parsingElement = null;
-      flags.parse && console.log("completed", elt);
-    },
-    markDynamicParsingComplete: function(elt) {
-      var i = this.dynamicElements.indexOf(elt);
-      if (i >= 0) {
-        this.dynamicElements.splice(i, 1);
-      }
-    },
-    parseImport: function(elt) {
-      elt.import = elt.__doc;
-      if (window.HTMLImports.__importsParsingHook) {
-        window.HTMLImports.__importsParsingHook(elt);
-      }
-      if (elt.import) {
-        elt.import.__importParsed = true;
-      }
-      this.markParsingComplete(elt);
-      if (elt.__resource && !elt.__error) {
-        elt.dispatchEvent(new CustomEvent("load", {
-          bubbles: false
-        }));
-      } else {
-        elt.dispatchEvent(new CustomEvent("error", {
-          bubbles: false
-        }));
-      }
-      if (elt.__pending) {
-        var fn;
-        while (elt.__pending.length) {
-          fn = elt.__pending.shift();
-          if (fn) {
-            fn({
-              target: elt
-            });
-          }
-        }
-      }
-      this.parseNext();
-    },
-    parseLink: function(linkElt) {
-      if (nodeIsImport(linkElt)) {
-        this.parseImport(linkElt);
-      } else {
-        linkElt.href = linkElt.href;
-        this.parseGeneric(linkElt);
-      }
-    },
-    parseStyle: function(elt) {
-      var src = elt;
-      elt = cloneStyle(elt);
-      src.__appliedElement = elt;
-      elt.__importElement = src;
-      this.parseGeneric(elt);
-    },
-    parseGeneric: function(elt) {
-      this.trackElement(elt);
-      this.addElementToDocument(elt);
-    },
-    rootImportForElement: function(elt) {
-      var n = elt;
-      while (n.ownerDocument.__importLink) {
-        n = n.ownerDocument.__importLink;
-      }
-      return n;
-    },
-    addElementToDocument: function(elt) {
-      var port = this.rootImportForElement(elt.__importElement || elt);
-      port.parentNode.insertBefore(elt, port);
-    },
-    trackElement: function(elt, callback) {
-      var self = this;
-      var done = function(e) {
-        elt.removeEventListener("load", done);
-        elt.removeEventListener("error", done);
-        if (callback) {
-          callback(e);
-        }
-        self.markParsingComplete(elt);
-        self.parseNext();
-      };
-      elt.addEventListener("load", done);
-      elt.addEventListener("error", done);
-      if (isIE && elt.localName === "style") {
-        var fakeLoad = false;
-        if (elt.textContent.indexOf("@import") == -1) {
-          fakeLoad = true;
-        } else if (elt.sheet) {
-          fakeLoad = true;
-          var csr = elt.sheet.cssRules;
-          var len = csr ? csr.length : 0;
-          for (var i = 0, r; i < len && (r = csr[i]); i++) {
-            if (r.type === CSSRule.IMPORT_RULE) {
-              fakeLoad = fakeLoad && Boolean(r.styleSheet);
-            }
-          }
-        }
-        if (fakeLoad) {
-          setTimeout(function() {
-            elt.dispatchEvent(new CustomEvent("load", {
-              bubbles: false
-            }));
-          });
-        }
-      }
-    },
-    parseScript: function(scriptElt) {
-      var script = document.createElement("script");
-      script.__importElement = scriptElt;
-      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
-      scope.currentScript = scriptElt;
-      this.trackElement(script, function(e) {
-        if (script.parentNode) {
-          script.parentNode.removeChild(script);
-        }
-        scope.currentScript = null;
-      });
-      this.addElementToDocument(script);
-    },
-    nextToParse: function() {
-      this._mayParse = [];
-      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
-    },
-    nextToParseInDoc: function(doc, link) {
-      if (doc && this._mayParse.indexOf(doc) < 0) {
-        this._mayParse.push(doc);
-        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
-        for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-          if (!this.isParsed(n)) {
-            if (this.hasResource(n)) {
-              return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n;
-            } else {
-              return;
-            }
-          }
-        }
-      }
-      return link;
-    },
-    nextToParseDynamic: function() {
-      return this.dynamicElements[0];
-    },
-    parseSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
-    },
-    isParsed: function(node) {
-      return node.__importParsed;
-    },
-    needsDynamicParsing: function(elt) {
-      return this.dynamicElements.indexOf(elt) >= 0;
-    },
-    hasResource: function(node) {
-      if (nodeIsImport(node) && node.__doc === undefined) {
-        return false;
-      }
-      return true;
-    }
-  };
-  function nodeIsImport(elt) {
-    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
-  }
-  function generateScriptDataUrl(script) {
-    var scriptContent = generateScriptContent(script);
-    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
-  }
-  function generateScriptContent(script) {
-    return script.textContent + generateSourceMapHint(script);
-  }
-  function generateSourceMapHint(script) {
-    var owner = script.ownerDocument;
-    owner.__importedScripts = owner.__importedScripts || 0;
-    var moniker = script.ownerDocument.baseURI;
-    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
-    owner.__importedScripts++;
-    return "\n//# sourceURL=" + moniker + num + ".js\n";
-  }
-  function cloneStyle(style) {
-    var clone = style.ownerDocument.createElement("style");
-    clone.textContent = style.textContent;
-    path.resolveUrlsInStyle(clone);
-    return clone;
-  }
-  scope.parser = importParser;
-  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var flags = scope.flags;
-  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
-  var rootDocument = scope.rootDocument;
-  var Loader = scope.Loader;
-  var Observer = scope.Observer;
-  var parser = scope.parser;
-  var importer = {
-    documents: {},
-    documentPreloadSelectors: IMPORT_SELECTOR,
-    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
-    loadNode: function(node) {
-      importLoader.addNode(node);
-    },
-    loadSubtree: function(parent) {
-      var nodes = this.marshalNodes(parent);
-      importLoader.addNodes(nodes);
-    },
-    marshalNodes: function(parent) {
-      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
-    },
-    loadSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
-    },
-    loaded: function(url, elt, resource, err, redirectedUrl) {
-      flags.load && console.log("loaded", url, elt);
-      elt.__resource = resource;
-      elt.__error = err;
-      if (isImportLink(elt)) {
-        var doc = this.documents[url];
-        if (doc === undefined) {
-          doc = err ? null : makeDocument(resource, redirectedUrl || url);
-          if (doc) {
-            doc.__importLink = elt;
-            this.bootDocument(doc);
-          }
-          this.documents[url] = doc;
-        }
-        elt.__doc = doc;
-      }
-      parser.parseNext();
-    },
-    bootDocument: function(doc) {
-      this.loadSubtree(doc);
-      this.observer.observe(doc);
-      parser.parseNext();
-    },
-    loadedAll: function() {
-      parser.parseNext();
-    }
-  };
-  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
-  importer.observer = new Observer();
-  function isImportLink(elt) {
-    return isLinkRel(elt, IMPORT_LINK_TYPE);
-  }
-  function isLinkRel(elt, rel) {
-    return elt.localName === "link" && elt.getAttribute("rel") === rel;
-  }
-  function hasBaseURIAccessor(doc) {
-    return !!Object.getOwnPropertyDescriptor(doc, "baseURI");
-  }
-  function makeDocument(resource, url) {
-    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
-    doc._URL = url;
-    var base = doc.createElement("base");
-    base.setAttribute("href", url);
-    if (!doc.baseURI && !hasBaseURIAccessor(doc)) {
-      Object.defineProperty(doc, "baseURI", {
-        value: url
-      });
-    }
-    var meta = doc.createElement("meta");
-    meta.setAttribute("charset", "utf-8");
-    doc.head.appendChild(meta);
-    doc.head.appendChild(base);
-    doc.body.innerHTML = resource;
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(doc);
-    }
-    return doc;
-  }
-  if (!document.baseURI) {
-    var baseURIDescriptor = {
-      get: function() {
-        var base = document.querySelector("base");
-        return base ? base.href : window.location.href;
-      },
-      configurable: true
-    };
-    Object.defineProperty(document, "baseURI", baseURIDescriptor);
-    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
-  }
-  scope.importer = importer;
-  scope.importLoader = importLoader;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var parser = scope.parser;
-  var importer = scope.importer;
-  var dynamic = {
-    added: function(nodes) {
-      var owner, parsed, loading;
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        if (!owner) {
-          owner = n.ownerDocument;
-          parsed = parser.isParsed(owner);
-        }
-        loading = this.shouldLoadNode(n);
-        if (loading) {
-          importer.loadNode(n);
-        }
-        if (this.shouldParseNode(n) && parsed) {
-          parser.parseDynamic(n, loading);
-        }
-      }
-    },
-    shouldLoadNode: function(node) {
-      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
-    },
-    shouldParseNode: function(node) {
-      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
-    }
-  };
-  importer.observer.addCallback = dynamic.added.bind(dynamic);
-  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
-});
-
-(function(scope) {
-  var initializeModules = scope.initializeModules;
-  var isIE = scope.isIE;
-  if (scope.useNative) {
-    return;
-  }
-  initializeModules();
-  var rootDocument = scope.rootDocument;
-  function bootstrap() {
-    window.HTMLImports.importer.bootDocument(rootDocument);
-  }
-  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
-    bootstrap();
-  } else {
-    document.addEventListener("DOMContentLoaded", bootstrap);
-  }
-})(window.HTMLImports);
-
-window.CustomElements = window.CustomElements || {
-  flags: {}
-};
-
-(function(scope) {
-  var flags = scope.flags;
-  var modules = [];
-  var addModule = function(module) {
-    modules.push(module);
-  };
-  var initializeModules = function() {
-    modules.forEach(function(module) {
-      module(scope);
-    });
-  };
-  scope.addModule = addModule;
-  scope.initializeModules = initializeModules;
-  scope.hasNative = Boolean(document.registerElement);
-  scope.isIE = /Trident/.test(navigator.userAgent);
-  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative);
-})(window.CustomElements);
-
-window.CustomElements.addModule(function(scope) {
-  var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none";
-  function forSubtree(node, cb) {
-    findAllElements(node, function(e) {
-      if (cb(e)) {
-        return true;
-      }
-      forRoots(e, cb);
-    });
-    forRoots(node, cb);
-  }
-  function findAllElements(node, find, data) {
-    var e = node.firstElementChild;
-    if (!e) {
-      e = node.firstChild;
-      while (e && e.nodeType !== Node.ELEMENT_NODE) {
-        e = e.nextSibling;
-      }
-    }
-    while (e) {
-      if (find(e, data) !== true) {
-        findAllElements(e, find, data);
-      }
-      e = e.nextElementSibling;
-    }
-    return null;
-  }
-  function forRoots(node, cb) {
-    var root = node.shadowRoot;
-    while (root) {
-      forSubtree(root, cb);
-      root = root.olderShadowRoot;
-    }
-  }
-  function forDocumentTree(doc, cb) {
-    _forDocumentTree(doc, cb, []);
-  }
-  function _forDocumentTree(doc, cb, processingDocuments) {
-    doc = window.wrap(doc);
-    if (processingDocuments.indexOf(doc) >= 0) {
-      return;
-    }
-    processingDocuments.push(doc);
-    var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]");
-    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {
-      if (n.import) {
-        _forDocumentTree(n.import, cb, processingDocuments);
-      }
-    }
-    cb(doc);
-  }
-  scope.forDocumentTree = forDocumentTree;
-  scope.forSubtree = forSubtree;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var flags = scope.flags;
-  var forSubtree = scope.forSubtree;
-  var forDocumentTree = scope.forDocumentTree;
-  function addedNode(node, isAttached) {
-    return added(node, isAttached) || addedSubtree(node, isAttached);
-  }
-  function added(node, isAttached) {
-    if (scope.upgrade(node, isAttached)) {
-      return true;
-    }
-    if (isAttached) {
-      attached(node);
-    }
-  }
-  function addedSubtree(node, isAttached) {
-    forSubtree(node, function(e) {
-      if (added(e, isAttached)) {
-        return true;
-      }
-    });
-  }
-  var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"];
-  scope.hasPolyfillMutations = hasThrottledAttached;
-  scope.hasThrottledAttached = hasThrottledAttached;
-  var isPendingMutations = false;
-  var pendingMutations = [];
-  function deferMutation(fn) {
-    pendingMutations.push(fn);
-    if (!isPendingMutations) {
-      isPendingMutations = true;
-      setTimeout(takeMutations);
-    }
-  }
-  function takeMutations() {
-    isPendingMutations = false;
-    var $p = pendingMutations;
-    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
-      p();
-    }
-    pendingMutations = [];
-  }
-  function attached(element) {
-    if (hasThrottledAttached) {
-      deferMutation(function() {
-        _attached(element);
-      });
-    } else {
-      _attached(element);
-    }
-  }
-  function _attached(element) {
-    if (element.__upgraded__ && !element.__attached) {
-      element.__attached = true;
-      if (element.attachedCallback) {
-        element.attachedCallback();
-      }
-    }
-  }
-  function detachedNode(node) {
-    detached(node);
-    forSubtree(node, function(e) {
-      detached(e);
-    });
-  }
-  function detached(element) {
-    if (hasThrottledAttached) {
-      deferMutation(function() {
-        _detached(element);
-      });
-    } else {
-      _detached(element);
-    }
-  }
-  function _detached(element) {
-    if (element.__upgraded__ && element.__attached) {
-      element.__attached = false;
-      if (element.detachedCallback) {
-        element.detachedCallback();
-      }
-    }
-  }
-  function inDocument(element) {
-    var p = element;
-    var doc = window.wrap(document);
-    while (p) {
-      if (p == doc) {
-        return true;
-      }
-      p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host;
-    }
-  }
-  function watchShadow(node) {
-    if (node.shadowRoot && !node.shadowRoot.__watched) {
-      flags.dom && console.log("watching shadow-root for: ", node.localName);
-      var root = node.shadowRoot;
-      while (root) {
-        observe(root);
-        root = root.olderShadowRoot;
-      }
-    }
-  }
-  function handler(root, mutations) {
-    if (flags.dom) {
-      var mx = mutations[0];
-      if (mx && mx.type === "childList" && mx.addedNodes) {
-        if (mx.addedNodes) {
-          var d = mx.addedNodes[0];
-          while (d && d !== document && !d.host) {
-            d = d.parentNode;
-          }
-          var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
-          u = u.split("/?").shift().split("/").pop();
-        }
-      }
-      console.group("mutations (%d) [%s]", mutations.length, u || "");
-    }
-    var isAttached = inDocument(root);
-    mutations.forEach(function(mx) {
-      if (mx.type === "childList") {
-        forEach(mx.addedNodes, function(n) {
-          if (!n.localName) {
-            return;
-          }
-          addedNode(n, isAttached);
-        });
-        forEach(mx.removedNodes, function(n) {
-          if (!n.localName) {
-            return;
-          }
-          detachedNode(n);
-        });
-      }
-    });
-    flags.dom && console.groupEnd();
-  }
-  function takeRecords(node) {
-    node = window.wrap(node);
-    if (!node) {
-      node = window.wrap(document);
-    }
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-    var observer = node.__observer;
-    if (observer) {
-      handler(node, observer.takeRecords());
-      takeMutations();
-    }
-  }
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-  function observe(inRoot) {
-    if (inRoot.__observer) {
-      return;
-    }
-    var observer = new MutationObserver(handler.bind(this, inRoot));
-    observer.observe(inRoot, {
-      childList: true,
-      subtree: true
-    });
-    inRoot.__observer = observer;
-  }
-  function upgradeDocument(doc) {
-    doc = window.wrap(doc);
-    flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
-    var isMainDocument = doc === window.wrap(document);
-    addedNode(doc, isMainDocument);
-    observe(doc);
-    flags.dom && console.groupEnd();
-  }
-  function upgradeDocumentTree(doc) {
-    forDocumentTree(doc, upgradeDocument);
-  }
-  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-  if (originalCreateShadowRoot) {
-    Element.prototype.createShadowRoot = function() {
-      var root = originalCreateShadowRoot.call(this);
-      window.CustomElements.watchShadow(this);
-      return root;
-    };
-  }
-  scope.watchShadow = watchShadow;
-  scope.upgradeDocumentTree = upgradeDocumentTree;
-  scope.upgradeDocument = upgradeDocument;
-  scope.upgradeSubtree = addedSubtree;
-  scope.upgradeAll = addedNode;
-  scope.attached = attached;
-  scope.takeRecords = takeRecords;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var flags = scope.flags;
-  function upgrade(node, isAttached) {
-    if (node.localName === "template") {
-      if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
-        HTMLTemplateElement.decorate(node);
-      }
-    }
-    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
-      var is = node.getAttribute("is");
-      var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is);
-      if (definition) {
-        if (is && definition.tag == node.localName || !is && !definition.extends) {
-          return upgradeWithDefinition(node, definition, isAttached);
-        }
-      }
-    }
-  }
-  function upgradeWithDefinition(element, definition, isAttached) {
-    flags.upgrade && console.group("upgrade:", element.localName);
-    if (definition.is) {
-      element.setAttribute("is", definition.is);
-    }
-    implementPrototype(element, definition);
-    element.__upgraded__ = true;
-    created(element);
-    if (isAttached) {
-      scope.attached(element);
-    }
-    scope.upgradeSubtree(element, isAttached);
-    flags.upgrade && console.groupEnd();
-    return element;
-  }
-  function implementPrototype(element, definition) {
-    if (Object.__proto__) {
-      element.__proto__ = definition.prototype;
-    } else {
-      customMixin(element, definition.prototype, definition.native);
-      element.__proto__ = definition.prototype;
-    }
-  }
-  function customMixin(inTarget, inSrc, inNative) {
-    var used = {};
-    var p = inSrc;
-    while (p !== inNative && p !== HTMLElement.prototype) {
-      var keys = Object.getOwnPropertyNames(p);
-      for (var i = 0, k; k = keys[i]; i++) {
-        if (!used[k]) {
-          Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
-          used[k] = 1;
-        }
-      }
-      p = Object.getPrototypeOf(p);
-    }
-  }
-  function created(element) {
-    if (element.createdCallback) {
-      element.createdCallback();
-    }
-  }
-  scope.upgrade = upgrade;
-  scope.upgradeWithDefinition = upgradeWithDefinition;
-  scope.implementPrototype = implementPrototype;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var isIE = scope.isIE;
-  var upgradeDocumentTree = scope.upgradeDocumentTree;
-  var upgradeAll = scope.upgradeAll;
-  var upgradeWithDefinition = scope.upgradeWithDefinition;
-  var implementPrototype = scope.implementPrototype;
-  var useNative = scope.useNative;
-  function register(name, options) {
-    var definition = options || {};
-    if (!name) {
-      throw new Error("document.registerElement: first argument `name` must not be empty");
-    }
-    if (name.indexOf("-") < 0) {
-      throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
-    }
-    if (isReservedTag(name)) {
-      throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
-    }
-    if (getRegisteredDefinition(name)) {
-      throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
-    }
-    if (!definition.prototype) {
-      definition.prototype = Object.create(HTMLElement.prototype);
-    }
-    definition.__name = name.toLowerCase();
-    if (definition.extends) {
-      definition.extends = definition.extends.toLowerCase();
-    }
-    definition.lifecycle = definition.lifecycle || {};
-    definition.ancestry = ancestry(definition.extends);
-    resolveTagName(definition);
-    resolvePrototypeChain(definition);
-    overrideAttributeApi(definition.prototype);
-    registerDefinition(definition.__name, definition);
-    definition.ctor = generateConstructor(definition);
-    definition.ctor.prototype = definition.prototype;
-    definition.prototype.constructor = definition.ctor;
-    if (scope.ready) {
-      upgradeDocumentTree(document);
-    }
-    return definition.ctor;
-  }
-  function overrideAttributeApi(prototype) {
-    if (prototype.setAttribute._polyfilled) {
-      return;
-    }
-    var setAttribute = prototype.setAttribute;
-    prototype.setAttribute = function(name, value) {
-      changeAttribute.call(this, name, value, setAttribute);
-    };
-    var removeAttribute = prototype.removeAttribute;
-    prototype.removeAttribute = function(name) {
-      changeAttribute.call(this, name, null, removeAttribute);
-    };
-    prototype.setAttribute._polyfilled = true;
-  }
-  function changeAttribute(name, value, operation) {
-    name = name.toLowerCase();
-    var oldValue = this.getAttribute(name);
-    operation.apply(this, arguments);
-    var newValue = this.getAttribute(name);
-    if (this.attributeChangedCallback && newValue !== oldValue) {
-      this.attributeChangedCallback(name, oldValue, newValue);
-    }
-  }
-  function isReservedTag(name) {
-    for (var i = 0; i < reservedTagList.length; i++) {
-      if (name === reservedTagList[i]) {
-        return true;
-      }
-    }
-  }
-  var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
-  function ancestry(extnds) {
-    var extendee = getRegisteredDefinition(extnds);
-    if (extendee) {
-      return ancestry(extendee.extends).concat([ extendee ]);
-    }
-    return [];
-  }
-  function resolveTagName(definition) {
-    var baseTag = definition.extends;
-    for (var i = 0, a; a = definition.ancestry[i]; i++) {
-      baseTag = a.is && a.tag;
-    }
-    definition.tag = baseTag || definition.__name;
-    if (baseTag) {
-      definition.is = definition.__name;
-    }
-  }
-  function resolvePrototypeChain(definition) {
-    if (!Object.__proto__) {
-      var nativePrototype = HTMLElement.prototype;
-      if (definition.is) {
-        var inst = document.createElement(definition.tag);
-        nativePrototype = Object.getPrototypeOf(inst);
-      }
-      var proto = definition.prototype, ancestor;
-      var foundPrototype = false;
-      while (proto) {
-        if (proto == nativePrototype) {
-          foundPrototype = true;
-        }
-        ancestor = Object.getPrototypeOf(proto);
-        if (ancestor) {
-          proto.__proto__ = ancestor;
-        }
-        proto = ancestor;
-      }
-      if (!foundPrototype) {
-        console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is);
-      }
-      definition.native = nativePrototype;
-    }
-  }
-  function instantiate(definition) {
-    return upgradeWithDefinition(domCreateElement(definition.tag), definition);
-  }
-  var registry = {};
-  function getRegisteredDefinition(name) {
-    if (name) {
-      return registry[name.toLowerCase()];
-    }
-  }
-  function registerDefinition(name, definition) {
-    registry[name] = definition;
-  }
-  function generateConstructor(definition) {
-    return function() {
-      return instantiate(definition);
-    };
-  }
-  var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
-  function createElementNS(namespace, tag, typeExtension) {
-    if (namespace === HTML_NAMESPACE) {
-      return createElement(tag, typeExtension);
-    } else {
-      return domCreateElementNS(namespace, tag);
-    }
-  }
-  function createElement(tag, typeExtension) {
-    if (tag) {
-      tag = tag.toLowerCase();
-    }
-    if (typeExtension) {
-      typeExtension = typeExtension.toLowerCase();
-    }
-    var definition = getRegisteredDefinition(typeExtension || tag);
-    if (definition) {
-      if (tag == definition.tag && typeExtension == definition.is) {
-        return new definition.ctor();
-      }
-      if (!typeExtension && !definition.is) {
-        return new definition.ctor();
-      }
-    }
-    var element;
-    if (typeExtension) {
-      element = createElement(tag);
-      element.setAttribute("is", typeExtension);
-      return element;
-    }
-    element = domCreateElement(tag);
-    if (tag.indexOf("-") >= 0) {
-      implementPrototype(element, HTMLElement);
-    }
-    return element;
-  }
-  var domCreateElement = document.createElement.bind(document);
-  var domCreateElementNS = document.createElementNS.bind(document);
-  var isInstance;
-  if (!Object.__proto__ && !useNative) {
-    isInstance = function(obj, ctor) {
-      if (obj instanceof ctor) {
-        return true;
-      }
-      var p = obj;
-      while (p) {
-        if (p === ctor.prototype) {
-          return true;
-        }
-        p = p.__proto__;
-      }
-      return false;
-    };
-  } else {
-    isInstance = function(obj, base) {
-      return obj instanceof base;
-    };
-  }
-  function wrapDomMethodToForceUpgrade(obj, methodName) {
-    var orig = obj[methodName];
-    obj[methodName] = function() {
-      var n = orig.apply(this, arguments);
-      upgradeAll(n);
-      return n;
-    };
-  }
-  wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
-  wrapDomMethodToForceUpgrade(document, "importNode");
-  document.registerElement = register;
-  document.createElement = createElement;
-  document.createElementNS = createElementNS;
-  scope.registry = registry;
-  scope.instanceof = isInstance;
-  scope.reservedTagList = reservedTagList;
-  scope.getRegisteredDefinition = getRegisteredDefinition;
-  document.register = document.registerElement;
-});
-
-(function(scope) {
-  var useNative = scope.useNative;
-  var initializeModules = scope.initializeModules;
-  var isIE = scope.isIE;
-  if (useNative) {
-    var nop = function() {};
-    scope.watchShadow = nop;
-    scope.upgrade = nop;
-    scope.upgradeAll = nop;
-    scope.upgradeDocumentTree = nop;
-    scope.upgradeSubtree = nop;
-    scope.takeRecords = nop;
-    scope.instanceof = function(obj, base) {
-      return obj instanceof base;
-    };
-  } else {
-    initializeModules();
-  }
-  var upgradeDocumentTree = scope.upgradeDocumentTree;
-  var upgradeDocument = scope.upgradeDocument;
-  if (!window.wrap) {
-    if (window.ShadowDOMPolyfill) {
-      window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded;
-      window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded;
-    } else {
-      window.wrap = window.unwrap = function(node) {
-        return node;
-      };
-    }
-  }
-  if (window.HTMLImports) {
-    window.HTMLImports.__importsParsingHook = function(elt) {
-      if (elt.import) {
-        upgradeDocument(wrap(elt.import));
-      }
-    };
-  }
-  function bootstrap() {
-    upgradeDocumentTree(window.wrap(document));
-    window.CustomElements.ready = true;
-    var requestAnimationFrame = window.requestAnimationFrame || function(f) {
-      setTimeout(f, 16);
-    };
-    requestAnimationFrame(function() {
-      setTimeout(function() {
-        window.CustomElements.readyTime = Date.now();
-        if (window.HTMLImports) {
-          window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime;
-        }
-        document.dispatchEvent(new CustomEvent("WebComponentsReady", {
-          bubbles: true
-        }));
-      });
-    });
-  }
-  if (document.readyState === "complete" || scope.flags.eager) {
-    bootstrap();
-  } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
-    bootstrap();
-  } else {
-    var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
-    window.addEventListener(loadEvent, bootstrap);
-  }
-})(window.CustomElements);
-
-(function(scope) {
-  var style = document.createElement("style");
-  style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n";
-  var head = document.querySelector("head");
-  head.insertBefore(style, head.firstChild);
-})(window.WebComponents);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents-lite.min.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents-lite.min.js
deleted file mode 100644
index fb9d010..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents-lite.min.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents-lite.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,o=e.split("=");o[0]&&(t=o[0].match(/wc-(.+)/))&&(n[t[1]]=o[1]||!0)}),t)for(var o,r=0;o=t.attributes[r];r++)"src"!==o.name&&(n[o.name]=o.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function o(e){return""==e&&n.call(this),e.toLowerCase()}function r(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,63,96].indexOf(t)==-1?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,96].indexOf(t)==-1?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",l=0,u="",w=!1,_=!1,g=[];e:for(;(e[l-1]!=p||0==l)&&!this._isInvalid;){var b=e[l];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}u="",d="no scheme";continue}u+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))u+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}u="",l=0,d="no scheme";continue}if(this._scheme=u,u="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=r(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[l+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[l+1],E=e[l+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),u+="%40"),w=!0;for(var L=0;L<u.length;L++){var N=u[L];if("\t"!=N&&"\n"!=N&&"\r"!=N)if(":"!=N||null!==this._password){var M=r(N);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}u=""}else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){l-=u.length,u="",d="host";continue}u+=b}break;case"file host":if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=u.length||!m.test(u[0])||":"!=u[1]&&"|"!=u[1]?0==u.length?d="relative path start":(this._host=o.call(this,u),u="",d="relative path start"):d="relative path";continue}"\t"==b||"\n"==b||"\r"==b?c("Invalid whitespace in file host."):u+=b;break;case"host":case"hostname":if(":"!=b||_){if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=o.call(this,u),u="",d="relative path start",a)break e;continue}"\t"!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),u+=b):c("Invalid code point in host/hostname: "+b)}else if(this._host=o.call(this,u),u="",d="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(b))u+=b;else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b||a){if(""!=u){var T=parseInt(u,10);T!=h[this._scheme]&&(this._port=T+""),u=""}if(a)break e;d="relative path start";continue}"\t"==b||"\n"==b||"\r"==b?c("Invalid code point in port: "+b):n.call(this)}break;case"relative path start":if("\\"==b&&c("'\\' not allowed in path."),d="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(p!=b&&"/"!=b&&"\\"!=b&&(a||"?"!=b&&"#"!=b))"\t"!=b&&"\n"!=b&&"\r"!=b&&(u+=r(b));else{"\\"==b&&c("\\ not allowed in relative path.");var O;(O=f[u.toLowerCase()])&&(u=O),".."==u?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==u&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=u&&("file"==this._scheme&&0==this._path.length&&2==u.length&&m.test(u[0])&&"|"==u[1]&&(u=u[0]+":"),this._path.push(u)),u="","?"==b?(this._query="?",d="query"):"#"==b&&(this._fragment="#",d="fragment")}break;case"query":a||"#"!=b?p!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._query+=i(b)):(this._fragment="#",d="fragment");break;case"fragment":p!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}l++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var d=!1;if(!e.forceJURL)try{var l=new URL("b","http://a");l.pathname="c%20d",d="http://a/c%20d"===l.href}catch(u){}if(!d){var h=Object.create(null);h.ftp=21,h.file=0,h.gopher=70,h.http=80,h.https=443,h.ws=80,h.wss=443;var f=Object.create(null);f["%2e"]=".",f[".%2e"]="..",f["%2e."]="..",f["%2e%2e"]="..";var p=void 0,m=/[a-zA-Z]/,v=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var w=e.URL;w&&(c.createObjectURL=function(e){return w.createObjectURL.apply(w,arguments)},c.revokeObjectURL=function(e){w.revokeObjectURL(e)}),e.URL=c}}(self),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++y}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function d(e,t){return E=new s(e,t)}function l(e){return L?L:(L=c(E),L.oldValue=e,L)}function u(){E=L=void 0}function h(e){return e===L||e===E}function f(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var w=[],_=String(Math.random());window.addEventListener("message",function(e){if(e.data===_){var t=w;w=[],t.forEach(function(e){e()})}}),m=function(e){w.push(e),window.postMessage(_,"*")}}var g=!1,b=[],y=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var E,L;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new d("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?l(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=d("characterData",o),a=e.prevValue;i(o,function(e){if(e.characterData)return e.characterDataOldValue?l(a):r});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,h=e.target;"DOMNodeInserted"===e.type?(s=[h],c=[]):(s=[],c=[h]);var f=h.previousSibling,p=h.nextSibling,r=d("childList",e.target.parentNode);r.addedNodes=s,r.removedNodes=c,r.previousSibling=f,r.nextSibling=p,i(e.relatedNode,function(e){if(e.childList)return r})}u()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(){function e(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case" ":return"&nbsp;"}}function t(t){return t.replace(u,e)}var n="undefined"==typeof HTMLTemplateElement;/Trident/.test(navigator.userAgent)&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}();var o=function(){if(!n){var e=document.createElement("template"),t=document.createElement("template");t.content.appendChild(document.createElement("div")),e.content.appendChild(t);var o=e.cloneNode(!0);return 0===o.content.childNodes.length||0===o.content.firstChild.content.childNodes.length}}(),r="template",i=function(){};if(n){var a=document.implementation.createHTMLDocument("template"),s=!0,c=document.createElement("style");c.textContent=r+"{display:none;}";var d=document.head;d.insertBefore(c,d.firstElementChild),i.prototype=Object.create(HTMLElement.prototype),i.decorate=function(e){if(!e.content){e.content=a.createDocumentFragment();for(var n;n=e.firstChild;)e.content.appendChild(n);if(e.cloneNode=function(e){return i.cloneNode(this,e)},s)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(a.body.innerHTML=e,i.bootstrap(a);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;a.body.firstChild;)this.content.appendChild(a.body.firstChild)},configurable:!0})}catch(o){s=!1}i.bootstrap(e.content)}},i.bootstrap=function(e){for(var t,n=e.querySelectorAll(r),o=0,a=n.length;o<a&&(t=n[o]);o++)i.decorate(t)},document.addEventListener("DOMContentLoaded",function(){i.bootstrap(document)});var l=document.createElement;document.createElement=function(){"use strict";var e=l.apply(document,arguments);return"template"===e.localName&&i.decorate(e),e};var u=/[&\u00A0<>]/g}if(n||o){var h=Node.prototype.cloneNode;i.cloneNode=function(e,t){var n=h.call(e,!1);return this.decorate&&this.decorate(n),t&&(n.content.appendChild(h.call(e.content,!0)),this.fixClonedDom(n.content,e.content)),n},i.fixClonedDom=function(e,t){if(t.querySelectorAll)for(var n,o,i=t.querySelectorAll(r),a=e.querySelectorAll(r),s=0,c=a.length;s<c;s++)o=i[s],n=a[s],this.decorate&&this.decorate(o),n.parentNode.replaceChild(o.cloneNode(!0),n)};var f=document.importNode;Node.prototype.cloneNode=function(e){var t=h.call(this,e);return e&&i.fixClonedDom(t,this),t},document.importNode=function(e,t){if(e.localName===r)return i.cloneNode(e,t);var n=f.call(document,e,t);return t&&i.fixClonedDom(n,e),n},o&&(HTMLTemplateElement.prototype.cloneNode=function(e){return i.cloneNode(this,e)})}n&&(window.HTMLTemplateElement=i)}(),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function o(e,t){if(n(t))e&&e();else{var r=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(_,r),o(e,t))};t.addEventListener(_,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:l,errorImports:u})}function o(e){r(e),l.push(this),c++,n()}function i(e){u.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,l=[],u=[];if(d)for(var h,f=0;f<d&&(h=s[f]);f++)a(h)?(l.push(this),c++,n()):(h.addEventListener("load",o),h.addEventListener("error",i));else n()}function a(e){return u?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var l="import",u=Boolean(l in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";u&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;n<o&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=l,e.useNative=u,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,o=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,o),e},resolveUrlsInCssText:function(e,o,r){var i=this.replaceUrls(e,r,o,t);return i=this.replaceUrls(i,r,o,n)},replaceUrls:function(e,t,n,o){return e.replace(o,function(e,o,r,i){var a=r.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,o+"'"+a+"'"+i})}};e.path=o}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,c=a.length;s<c&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;n<o&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===l}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,l=e.IMPORT_LINK_TYPE,u="link[rel="+l+"]",h={documentSelectors:u,importsSelectors:[u,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(r){e.removeEventListener("load",o),e.removeEventListener("error",o),t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),d&&"style"===e.localName){var r=!1;if(e.textContent.indexOf("@import")==-1)r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;c<s&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(t){o.parentNode&&o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;i<a&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o.__doc,o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=u}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function r(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||o(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,l=e.Observer,u=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,o,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=o,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(o,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new l,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,c=e.length;s<c&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return!!t(e)||void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),s=0,c=r.length;s<c&&(o=r[s]);s++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return!!e.upgrade(t,n)||void(n&&a(t))}function o(e,t){g(e,function(e){if(n(e,t))return!0})}function r(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,o=t.length;n<o&&(e=t[n]);n++)e();L=[]}function a(e){y?r(function(){s(e);
-}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?r(function(){l(e)}):l(e)}function l(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function u(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=u(e);n.forEach(function(e){"childList"===e.type&&(N(e.addedNodes,function(e){e.localName&&t(e,a)}),N(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=window.MutationObserver._isPolyfilled&&_["throttle-attached"];e.hasPolyfillMutations=y,e.hasThrottledAttached=y;var E=!1,L=[],N=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var c=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),l(c.__name,c),c.ctor=u(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<y.length;t++)if(e===y[t])return!0}function i(e){var t=d(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return _(N(e.tag),e)}function d(e){if(e)return E[e.toLowerCase()]}function l(e,t){E[e]=t}function u(e){return function(){return c(e)}}function h(e,t,n){return e===L?f(t,n):M(e,t)}function f(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=d(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=f(e),o.setAttribute("is",t),o):(o=N(e),e.indexOf("-")>=0&&g(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),w=e.upgradeAll,_=e.upgradeWithDefinition,g=e.implementPrototype,b=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],E={},L="http://www.w3.org/1999/xhtml",N=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||b?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=E,e["instanceof"]=m,e.reservedTagList=y,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents.js
deleted file mode 100644
index daf5c22..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents.js
+++ /dev/null
@@ -1,7209 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-(function() {
-  window.WebComponents = window.WebComponents || {
-    flags: {}
-  };
-  var file = "webcomponents.js";
-  var script = document.querySelector('script[src*="' + file + '"]');
-  var flags = {};
-  if (!flags.noOpts) {
-    location.search.slice(1).split("&").forEach(function(option) {
-      var parts = option.split("=");
-      var match;
-      if (parts[0] && (match = parts[0].match(/wc-(.+)/))) {
-        flags[match[1]] = parts[1] || true;
-      }
-    });
-    if (script) {
-      for (var i = 0, a; a = script.attributes[i]; i++) {
-        if (a.name !== "src") {
-          flags[a.name] = a.value || true;
-        }
-      }
-    }
-    if (flags.log && flags.log.split) {
-      var parts = flags.log.split(",");
-      flags.log = {};
-      parts.forEach(function(f) {
-        flags.log[f] = true;
-      });
-    } else {
-      flags.log = {};
-    }
-  }
-  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;
-  if (flags.shadow === "native") {
-    flags.shadow = false;
-  } else {
-    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;
-  }
-  if (flags.register) {
-    window.CustomElements = window.CustomElements || {
-      flags: {}
-    };
-    window.CustomElements.flags.register = flags.register;
-  }
-  WebComponents.flags = flags;
-})();
-
-if (WebComponents.flags.shadow) {
-  if (typeof WeakMap === "undefined") {
-    (function() {
-      var defineProperty = Object.defineProperty;
-      var counter = Date.now() % 1e9;
-      var WeakMap = function() {
-        this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
-      };
-      WeakMap.prototype = {
-        set: function(key, value) {
-          var entry = key[this.name];
-          if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
-            value: [ key, value ],
-            writable: true
-          });
-          return this;
-        },
-        get: function(key) {
-          var entry;
-          return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
-        },
-        "delete": function(key) {
-          var entry = key[this.name];
-          if (!entry || entry[0] !== key) return false;
-          entry[0] = entry[1] = undefined;
-          return true;
-        },
-        has: function(key) {
-          var entry = key[this.name];
-          if (!entry) return false;
-          return entry[0] === key;
-        }
-      };
-      window.WeakMap = WeakMap;
-    })();
-  }
-  window.ShadowDOMPolyfill = {};
-  (function(scope) {
-    "use strict";
-    var constructorTable = new WeakMap();
-    var nativePrototypeTable = new WeakMap();
-    var wrappers = Object.create(null);
-    function detectEval() {
-      if (typeof chrome !== "undefined" && chrome.app && chrome.app.runtime) {
-        return false;
-      }
-      if (navigator.getDeviceStorage) {
-        return false;
-      }
-      try {
-        var f = new Function("return true;");
-        return f();
-      } catch (ex) {
-        return false;
-      }
-    }
-    var hasEval = detectEval();
-    function assert(b) {
-      if (!b) throw new Error("Assertion failed");
-    }
-    var defineProperty = Object.defineProperty;
-    var getOwnPropertyNames = Object.getOwnPropertyNames;
-    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-    function mixin(to, from) {
-      var names = getOwnPropertyNames(from);
-      for (var i = 0; i < names.length; i++) {
-        var name = names[i];
-        defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-      }
-      return to;
-    }
-    function mixinStatics(to, from) {
-      var names = getOwnPropertyNames(from);
-      for (var i = 0; i < names.length; i++) {
-        var name = names[i];
-        switch (name) {
-         case "arguments":
-         case "caller":
-         case "length":
-         case "name":
-         case "prototype":
-         case "toString":
-          continue;
-        }
-        defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-      }
-      return to;
-    }
-    function oneOf(object, propertyNames) {
-      for (var i = 0; i < propertyNames.length; i++) {
-        if (propertyNames[i] in object) return propertyNames[i];
-      }
-    }
-    var nonEnumerableDataDescriptor = {
-      value: undefined,
-      configurable: true,
-      enumerable: false,
-      writable: true
-    };
-    function defineNonEnumerableDataProperty(object, name, value) {
-      nonEnumerableDataDescriptor.value = value;
-      defineProperty(object, name, nonEnumerableDataDescriptor);
-    }
-    getOwnPropertyNames(window);
-    function getWrapperConstructor(node, opt_instance) {
-      var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
-      if (isFirefox) {
-        try {
-          getOwnPropertyNames(nativePrototype);
-        } catch (error) {
-          nativePrototype = nativePrototype.__proto__;
-        }
-      }
-      var wrapperConstructor = constructorTable.get(nativePrototype);
-      if (wrapperConstructor) return wrapperConstructor;
-      var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
-      var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
-      registerInternal(nativePrototype, GeneratedWrapper, opt_instance);
-      return GeneratedWrapper;
-    }
-    function addForwardingProperties(nativePrototype, wrapperPrototype) {
-      installProperty(nativePrototype, wrapperPrototype, true);
-    }
-    function registerInstanceProperties(wrapperPrototype, instanceObject) {
-      installProperty(instanceObject, wrapperPrototype, false);
-    }
-    var isFirefox = /Firefox/.test(navigator.userAgent);
-    var dummyDescriptor = {
-      get: function() {},
-      set: function(v) {},
-      configurable: true,
-      enumerable: true
-    };
-    function isEventHandlerName(name) {
-      return /^on[a-z]+$/.test(name);
-    }
-    function isIdentifierName(name) {
-      return /^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(name);
-    }
-    function getGetter(name) {
-      return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name) : function() {
-        return this.__impl4cf1e782hg__[name];
-      };
-    }
-    function getSetter(name) {
-      return hasEval && isIdentifierName(name) ? new Function("v", "this.__impl4cf1e782hg__." + name + " = v") : function(v) {
-        this.__impl4cf1e782hg__[name] = v;
-      };
-    }
-    function getMethod(name) {
-      return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name + ".apply(this.__impl4cf1e782hg__, arguments)") : function() {
-        return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);
-      };
-    }
-    function getDescriptor(source, name) {
-      try {
-        if (source === window && name === "showModalDialog") {
-          return dummyDescriptor;
-        }
-        return Object.getOwnPropertyDescriptor(source, name);
-      } catch (ex) {
-        return dummyDescriptor;
-      }
-    }
-    var isBrokenSafari = function() {
-      var descr = Object.getOwnPropertyDescriptor(Node.prototype, "nodeType");
-      return descr && !descr.get && !descr.set;
-    }();
-    function installProperty(source, target, allowMethod, opt_blacklist) {
-      var names = getOwnPropertyNames(source);
-      for (var i = 0; i < names.length; i++) {
-        var name = names[i];
-        if (name === "polymerBlackList_") continue;
-        if (name in target) continue;
-        if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;
-        if (isFirefox) {
-          source.__lookupGetter__(name);
-        }
-        var descriptor = getDescriptor(source, name);
-        var getter, setter;
-        if (typeof descriptor.value === "function") {
-          if (allowMethod) {
-            target[name] = getMethod(name);
-          }
-          continue;
-        }
-        var isEvent = isEventHandlerName(name);
-        if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);
-        if (descriptor.writable || descriptor.set || isBrokenSafari) {
-          if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);
-        }
-        var configurable = isBrokenSafari || descriptor.configurable;
-        defineProperty(target, name, {
-          get: getter,
-          set: setter,
-          configurable: configurable,
-          enumerable: descriptor.enumerable
-        });
-      }
-    }
-    function register(nativeConstructor, wrapperConstructor, opt_instance) {
-      if (nativeConstructor == null) {
-        return;
-      }
-      var nativePrototype = nativeConstructor.prototype;
-      registerInternal(nativePrototype, wrapperConstructor, opt_instance);
-      mixinStatics(wrapperConstructor, nativeConstructor);
-    }
-    function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
-      var wrapperPrototype = wrapperConstructor.prototype;
-      assert(constructorTable.get(nativePrototype) === undefined);
-      constructorTable.set(nativePrototype, wrapperConstructor);
-      nativePrototypeTable.set(wrapperPrototype, nativePrototype);
-      addForwardingProperties(nativePrototype, wrapperPrototype);
-      if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);
-      defineNonEnumerableDataProperty(wrapperPrototype, "constructor", wrapperConstructor);
-      wrapperConstructor.prototype = wrapperPrototype;
-    }
-    function isWrapperFor(wrapperConstructor, nativeConstructor) {
-      return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;
-    }
-    function registerObject(object) {
-      var nativePrototype = Object.getPrototypeOf(object);
-      var superWrapperConstructor = getWrapperConstructor(nativePrototype);
-      var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
-      registerInternal(nativePrototype, GeneratedWrapper, object);
-      return GeneratedWrapper;
-    }
-    function createWrapperConstructor(superWrapperConstructor) {
-      function GeneratedWrapper(node) {
-        superWrapperConstructor.call(this, node);
-      }
-      var p = Object.create(superWrapperConstructor.prototype);
-      p.constructor = GeneratedWrapper;
-      GeneratedWrapper.prototype = p;
-      return GeneratedWrapper;
-    }
-    function isWrapper(object) {
-      return object && object.__impl4cf1e782hg__;
-    }
-    function isNative(object) {
-      return !isWrapper(object);
-    }
-    function wrap(impl) {
-      if (impl === null) return null;
-      assert(isNative(impl));
-      var wrapper = impl.__wrapper8e3dd93a60__;
-      if (wrapper != null) {
-        return wrapper;
-      }
-      return impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl, impl))(impl);
-    }
-    function unwrap(wrapper) {
-      if (wrapper === null) return null;
-      assert(isWrapper(wrapper));
-      return wrapper.__impl4cf1e782hg__;
-    }
-    function unsafeUnwrap(wrapper) {
-      return wrapper.__impl4cf1e782hg__;
-    }
-    function setWrapper(impl, wrapper) {
-      wrapper.__impl4cf1e782hg__ = impl;
-      impl.__wrapper8e3dd93a60__ = wrapper;
-    }
-    function unwrapIfNeeded(object) {
-      return object && isWrapper(object) ? unwrap(object) : object;
-    }
-    function wrapIfNeeded(object) {
-      return object && !isWrapper(object) ? wrap(object) : object;
-    }
-    function rewrap(node, wrapper) {
-      if (wrapper === null) return;
-      assert(isNative(node));
-      assert(wrapper === undefined || isWrapper(wrapper));
-      node.__wrapper8e3dd93a60__ = wrapper;
-    }
-    var getterDescriptor = {
-      get: undefined,
-      configurable: true,
-      enumerable: true
-    };
-    function defineGetter(constructor, name, getter) {
-      getterDescriptor.get = getter;
-      defineProperty(constructor.prototype, name, getterDescriptor);
-    }
-    function defineWrapGetter(constructor, name) {
-      defineGetter(constructor, name, function() {
-        return wrap(this.__impl4cf1e782hg__[name]);
-      });
-    }
-    function forwardMethodsToWrapper(constructors, names) {
-      constructors.forEach(function(constructor) {
-        names.forEach(function(name) {
-          constructor.prototype[name] = function() {
-            var w = wrapIfNeeded(this);
-            return w[name].apply(w, arguments);
-          };
-        });
-      });
-    }
-    scope.addForwardingProperties = addForwardingProperties;
-    scope.assert = assert;
-    scope.constructorTable = constructorTable;
-    scope.defineGetter = defineGetter;
-    scope.defineWrapGetter = defineWrapGetter;
-    scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
-    scope.isIdentifierName = isIdentifierName;
-    scope.isWrapper = isWrapper;
-    scope.isWrapperFor = isWrapperFor;
-    scope.mixin = mixin;
-    scope.nativePrototypeTable = nativePrototypeTable;
-    scope.oneOf = oneOf;
-    scope.registerObject = registerObject;
-    scope.registerWrapper = register;
-    scope.rewrap = rewrap;
-    scope.setWrapper = setWrapper;
-    scope.unsafeUnwrap = unsafeUnwrap;
-    scope.unwrap = unwrap;
-    scope.unwrapIfNeeded = unwrapIfNeeded;
-    scope.wrap = wrap;
-    scope.wrapIfNeeded = wrapIfNeeded;
-    scope.wrappers = wrappers;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    function newSplice(index, removed, addedCount) {
-      return {
-        index: index,
-        removed: removed,
-        addedCount: addedCount
-      };
-    }
-    var EDIT_LEAVE = 0;
-    var EDIT_UPDATE = 1;
-    var EDIT_ADD = 2;
-    var EDIT_DELETE = 3;
-    function ArraySplice() {}
-    ArraySplice.prototype = {
-      calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
-        var rowCount = oldEnd - oldStart + 1;
-        var columnCount = currentEnd - currentStart + 1;
-        var distances = new Array(rowCount);
-        for (var i = 0; i < rowCount; i++) {
-          distances[i] = new Array(columnCount);
-          distances[i][0] = i;
-        }
-        for (var j = 0; j < columnCount; j++) distances[0][j] = j;
-        for (var i = 1; i < rowCount; i++) {
-          for (var j = 1; j < columnCount; j++) {
-            if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else {
-              var north = distances[i - 1][j] + 1;
-              var west = distances[i][j - 1] + 1;
-              distances[i][j] = north < west ? north : west;
-            }
-          }
-        }
-        return distances;
-      },
-      spliceOperationsFromEditDistances: function(distances) {
-        var i = distances.length - 1;
-        var j = distances[0].length - 1;
-        var current = distances[i][j];
-        var edits = [];
-        while (i > 0 || j > 0) {
-          if (i == 0) {
-            edits.push(EDIT_ADD);
-            j--;
-            continue;
-          }
-          if (j == 0) {
-            edits.push(EDIT_DELETE);
-            i--;
-            continue;
-          }
-          var northWest = distances[i - 1][j - 1];
-          var west = distances[i - 1][j];
-          var north = distances[i][j - 1];
-          var min;
-          if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;
-          if (min == northWest) {
-            if (northWest == current) {
-              edits.push(EDIT_LEAVE);
-            } else {
-              edits.push(EDIT_UPDATE);
-              current = northWest;
-            }
-            i--;
-            j--;
-          } else if (min == west) {
-            edits.push(EDIT_DELETE);
-            i--;
-            current = west;
-          } else {
-            edits.push(EDIT_ADD);
-            j--;
-            current = north;
-          }
-        }
-        edits.reverse();
-        return edits;
-      },
-      calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
-        var prefixCount = 0;
-        var suffixCount = 0;
-        var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-        if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);
-        if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-        currentStart += prefixCount;
-        oldStart += prefixCount;
-        currentEnd -= suffixCount;
-        oldEnd -= suffixCount;
-        if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];
-        if (currentStart == currentEnd) {
-          var splice = newSplice(currentStart, [], 0);
-          while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);
-          return [ splice ];
-        } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];
-        var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
-        var splice = undefined;
-        var splices = [];
-        var index = currentStart;
-        var oldIndex = oldStart;
-        for (var i = 0; i < ops.length; i++) {
-          switch (ops[i]) {
-           case EDIT_LEAVE:
-            if (splice) {
-              splices.push(splice);
-              splice = undefined;
-            }
-            index++;
-            oldIndex++;
-            break;
-
-           case EDIT_UPDATE:
-            if (!splice) splice = newSplice(index, [], 0);
-            splice.addedCount++;
-            index++;
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-
-           case EDIT_ADD:
-            if (!splice) splice = newSplice(index, [], 0);
-            splice.addedCount++;
-            index++;
-            break;
-
-           case EDIT_DELETE:
-            if (!splice) splice = newSplice(index, [], 0);
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-          }
-        }
-        if (splice) {
-          splices.push(splice);
-        }
-        return splices;
-      },
-      sharedPrefix: function(current, old, searchLength) {
-        for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;
-        return searchLength;
-      },
-      sharedSuffix: function(current, old, searchLength) {
-        var index1 = current.length;
-        var index2 = old.length;
-        var count = 0;
-        while (count < searchLength && this.equals(current[--index1], old[--index2])) count++;
-        return count;
-      },
-      calculateSplices: function(current, previous) {
-        return this.calcSplices(current, 0, current.length, previous, 0, previous.length);
-      },
-      equals: function(currentValue, previousValue) {
-        return currentValue === previousValue;
-      }
-    };
-    scope.ArraySplice = ArraySplice;
-  })(window.ShadowDOMPolyfill);
-  (function(context) {
-    "use strict";
-    var OriginalMutationObserver = window.MutationObserver;
-    var callbacks = [];
-    var pending = false;
-    var timerFunc;
-    function handle() {
-      pending = false;
-      var copies = callbacks.slice(0);
-      callbacks = [];
-      for (var i = 0; i < copies.length; i++) {
-        (0, copies[i])();
-      }
-    }
-    if (OriginalMutationObserver) {
-      var counter = 1;
-      var observer = new OriginalMutationObserver(handle);
-      var textNode = document.createTextNode(counter);
-      observer.observe(textNode, {
-        characterData: true
-      });
-      timerFunc = function() {
-        counter = (counter + 1) % 2;
-        textNode.data = counter;
-      };
-    } else {
-      timerFunc = window.setTimeout;
-    }
-    function setEndOfMicrotask(func) {
-      callbacks.push(func);
-      if (pending) return;
-      pending = true;
-      timerFunc(handle, 0);
-    }
-    context.setEndOfMicrotask = setEndOfMicrotask;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var setEndOfMicrotask = scope.setEndOfMicrotask;
-    var wrapIfNeeded = scope.wrapIfNeeded;
-    var wrappers = scope.wrappers;
-    var registrationsTable = new WeakMap();
-    var globalMutationObservers = [];
-    var isScheduled = false;
-    function scheduleCallback(observer) {
-      if (observer.scheduled_) return;
-      observer.scheduled_ = true;
-      globalMutationObservers.push(observer);
-      if (isScheduled) return;
-      setEndOfMicrotask(notifyObservers);
-      isScheduled = true;
-    }
-    function notifyObservers() {
-      isScheduled = false;
-      while (globalMutationObservers.length) {
-        var notifyList = globalMutationObservers;
-        globalMutationObservers = [];
-        notifyList.sort(function(x, y) {
-          return x.uid_ - y.uid_;
-        });
-        for (var i = 0; i < notifyList.length; i++) {
-          var mo = notifyList[i];
-          mo.scheduled_ = false;
-          var queue = mo.takeRecords();
-          removeTransientObserversFor(mo);
-          if (queue.length) {
-            mo.callback_(queue, mo);
-          }
-        }
-      }
-    }
-    function MutationRecord(type, target) {
-      this.type = type;
-      this.target = target;
-      this.addedNodes = new wrappers.NodeList();
-      this.removedNodes = new wrappers.NodeList();
-      this.previousSibling = null;
-      this.nextSibling = null;
-      this.attributeName = null;
-      this.attributeNamespace = null;
-      this.oldValue = null;
-    }
-    function registerTransientObservers(ancestor, node) {
-      for (;ancestor; ancestor = ancestor.parentNode) {
-        var registrations = registrationsTable.get(ancestor);
-        if (!registrations) continue;
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.options.subtree) registration.addTransientObserver(node);
-        }
-      }
-    }
-    function removeTransientObserversFor(observer) {
-      for (var i = 0; i < observer.nodes_.length; i++) {
-        var node = observer.nodes_[i];
-        var registrations = registrationsTable.get(node);
-        if (!registrations) return;
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          if (registration.observer === observer) registration.removeTransientObservers();
-        }
-      }
-    }
-    function enqueueMutation(target, type, data) {
-      var interestedObservers = Object.create(null);
-      var associatedStrings = Object.create(null);
-      for (var node = target; node; node = node.parentNode) {
-        var registrations = registrationsTable.get(node);
-        if (!registrations) continue;
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-          if (node !== target && !options.subtree) continue;
-          if (type === "attributes" && !options.attributes) continue;
-          if (type === "attributes" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {
-            continue;
-          }
-          if (type === "characterData" && !options.characterData) continue;
-          if (type === "childList" && !options.childList) continue;
-          var observer = registration.observer;
-          interestedObservers[observer.uid_] = observer;
-          if (type === "attributes" && options.attributeOldValue || type === "characterData" && options.characterDataOldValue) {
-            associatedStrings[observer.uid_] = data.oldValue;
-          }
-        }
-      }
-      for (var uid in interestedObservers) {
-        var observer = interestedObservers[uid];
-        var record = new MutationRecord(type, target);
-        if ("name" in data && "namespace" in data) {
-          record.attributeName = data.name;
-          record.attributeNamespace = data.namespace;
-        }
-        if (data.addedNodes) record.addedNodes = data.addedNodes;
-        if (data.removedNodes) record.removedNodes = data.removedNodes;
-        if (data.previousSibling) record.previousSibling = data.previousSibling;
-        if (data.nextSibling) record.nextSibling = data.nextSibling;
-        if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];
-        scheduleCallback(observer);
-        observer.records_.push(record);
-      }
-    }
-    var slice = Array.prototype.slice;
-    function MutationObserverOptions(options) {
-      this.childList = !!options.childList;
-      this.subtree = !!options.subtree;
-      if (!("attributes" in options) && ("attributeOldValue" in options || "attributeFilter" in options)) {
-        this.attributes = true;
-      } else {
-        this.attributes = !!options.attributes;
-      }
-      if ("characterDataOldValue" in options && !("characterData" in options)) this.characterData = true; else this.characterData = !!options.characterData;
-      if (!this.attributes && (options.attributeOldValue || "attributeFilter" in options) || !this.characterData && options.characterDataOldValue) {
-        throw new TypeError();
-      }
-      this.characterData = !!options.characterData;
-      this.attributeOldValue = !!options.attributeOldValue;
-      this.characterDataOldValue = !!options.characterDataOldValue;
-      if ("attributeFilter" in options) {
-        if (options.attributeFilter == null || typeof options.attributeFilter !== "object") {
-          throw new TypeError();
-        }
-        this.attributeFilter = slice.call(options.attributeFilter);
-      } else {
-        this.attributeFilter = null;
-      }
-    }
-    var uidCounter = 0;
-    function MutationObserver(callback) {
-      this.callback_ = callback;
-      this.nodes_ = [];
-      this.records_ = [];
-      this.uid_ = ++uidCounter;
-      this.scheduled_ = false;
-    }
-    MutationObserver.prototype = {
-      constructor: MutationObserver,
-      observe: function(target, options) {
-        target = wrapIfNeeded(target);
-        var newOptions = new MutationObserverOptions(options);
-        var registration;
-        var registrations = registrationsTable.get(target);
-        if (!registrations) registrationsTable.set(target, registrations = []);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i].observer === this) {
-            registration = registrations[i];
-            registration.removeTransientObservers();
-            registration.options = newOptions;
-          }
-        }
-        if (!registration) {
-          registration = new Registration(this, target, newOptions);
-          registrations.push(registration);
-          this.nodes_.push(target);
-        }
-      },
-      disconnect: function() {
-        this.nodes_.forEach(function(node) {
-          var registrations = registrationsTable.get(node);
-          for (var i = 0; i < registrations.length; i++) {
-            var registration = registrations[i];
-            if (registration.observer === this) {
-              registrations.splice(i, 1);
-              break;
-            }
-          }
-        }, this);
-        this.records_ = [];
-      },
-      takeRecords: function() {
-        var copyOfRecords = this.records_;
-        this.records_ = [];
-        return copyOfRecords;
-      }
-    };
-    function Registration(observer, target, options) {
-      this.observer = observer;
-      this.target = target;
-      this.options = options;
-      this.transientObservedNodes = [];
-    }
-    Registration.prototype = {
-      addTransientObserver: function(node) {
-        if (node === this.target) return;
-        scheduleCallback(this.observer);
-        this.transientObservedNodes.push(node);
-        var registrations = registrationsTable.get(node);
-        if (!registrations) registrationsTable.set(node, registrations = []);
-        registrations.push(this);
-      },
-      removeTransientObservers: function() {
-        var transientObservedNodes = this.transientObservedNodes;
-        this.transientObservedNodes = [];
-        for (var i = 0; i < transientObservedNodes.length; i++) {
-          var node = transientObservedNodes[i];
-          var registrations = registrationsTable.get(node);
-          for (var j = 0; j < registrations.length; j++) {
-            if (registrations[j] === this) {
-              registrations.splice(j, 1);
-              break;
-            }
-          }
-        }
-      }
-    };
-    scope.enqueueMutation = enqueueMutation;
-    scope.registerTransientObservers = registerTransientObservers;
-    scope.wrappers.MutationObserver = MutationObserver;
-    scope.wrappers.MutationRecord = MutationRecord;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    function TreeScope(root, parent) {
-      this.root = root;
-      this.parent = parent;
-    }
-    TreeScope.prototype = {
-      get renderer() {
-        if (this.root instanceof scope.wrappers.ShadowRoot) {
-          return scope.getRendererForHost(this.root.host);
-        }
-        return null;
-      },
-      contains: function(treeScope) {
-        for (;treeScope; treeScope = treeScope.parent) {
-          if (treeScope === this) return true;
-        }
-        return false;
-      }
-    };
-    function setTreeScope(node, treeScope) {
-      if (node.treeScope_ !== treeScope) {
-        node.treeScope_ = treeScope;
-        for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
-          sr.treeScope_.parent = treeScope;
-        }
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          setTreeScope(child, treeScope);
-        }
-      }
-    }
-    function getTreeScope(node) {
-      if (node instanceof scope.wrappers.Window) {
-        debugger;
-      }
-      if (node.treeScope_) return node.treeScope_;
-      var parent = node.parentNode;
-      var treeScope;
-      if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);
-      return node.treeScope_ = treeScope;
-    }
-    scope.TreeScope = TreeScope;
-    scope.getTreeScope = getTreeScope;
-    scope.setTreeScope = setTreeScope;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-    var getTreeScope = scope.getTreeScope;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var wrappers = scope.wrappers;
-    var wrappedFuns = new WeakMap();
-    var listenersTable = new WeakMap();
-    var handledEventsTable = new WeakMap();
-    var currentlyDispatchingEvents = new WeakMap();
-    var targetTable = new WeakMap();
-    var currentTargetTable = new WeakMap();
-    var relatedTargetTable = new WeakMap();
-    var eventPhaseTable = new WeakMap();
-    var stopPropagationTable = new WeakMap();
-    var stopImmediatePropagationTable = new WeakMap();
-    var eventHandlersTable = new WeakMap();
-    var eventPathTable = new WeakMap();
-    function isShadowRoot(node) {
-      return node instanceof wrappers.ShadowRoot;
-    }
-    function rootOfNode(node) {
-      return getTreeScope(node).root;
-    }
-    function getEventPath(node, event) {
-      var path = [];
-      var current = node;
-      path.push(current);
-      while (current) {
-        var destinationInsertionPoints = getDestinationInsertionPoints(current);
-        if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {
-          for (var i = 0; i < destinationInsertionPoints.length; i++) {
-            var insertionPoint = destinationInsertionPoints[i];
-            if (isShadowInsertionPoint(insertionPoint)) {
-              var shadowRoot = rootOfNode(insertionPoint);
-              var olderShadowRoot = shadowRoot.olderShadowRoot;
-              if (olderShadowRoot) path.push(olderShadowRoot);
-            }
-            path.push(insertionPoint);
-          }
-          current = destinationInsertionPoints[destinationInsertionPoints.length - 1];
-        } else {
-          if (isShadowRoot(current)) {
-            if (inSameTree(node, current) && eventMustBeStopped(event)) {
-              break;
-            }
-            current = current.host;
-            path.push(current);
-          } else {
-            current = current.parentNode;
-            if (current) path.push(current);
-          }
-        }
-      }
-      return path;
-    }
-    function eventMustBeStopped(event) {
-      if (!event) return false;
-      switch (event.type) {
-       case "abort":
-       case "error":
-       case "select":
-       case "change":
-       case "load":
-       case "reset":
-       case "resize":
-       case "scroll":
-       case "selectstart":
-        return true;
-      }
-      return false;
-    }
-    function isShadowInsertionPoint(node) {
-      return node instanceof HTMLShadowElement;
-    }
-    function getDestinationInsertionPoints(node) {
-      return scope.getDestinationInsertionPoints(node);
-    }
-    function eventRetargetting(path, currentTarget) {
-      if (path.length === 0) return currentTarget;
-      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
-      var currentTargetTree = getTreeScope(currentTarget);
-      var originalTarget = path[0];
-      var originalTargetTree = getTreeScope(originalTarget);
-      var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);
-      for (var i = 0; i < path.length; i++) {
-        var node = path[i];
-        if (getTreeScope(node) === relativeTargetTree) return node;
-      }
-      return path[path.length - 1];
-    }
-    function getTreeScopeAncestors(treeScope) {
-      var ancestors = [];
-      for (;treeScope; treeScope = treeScope.parent) {
-        ancestors.push(treeScope);
-      }
-      return ancestors;
-    }
-    function lowestCommonInclusiveAncestor(tsA, tsB) {
-      var ancestorsA = getTreeScopeAncestors(tsA);
-      var ancestorsB = getTreeScopeAncestors(tsB);
-      var result = null;
-      while (ancestorsA.length > 0 && ancestorsB.length > 0) {
-        var a = ancestorsA.pop();
-        var b = ancestorsB.pop();
-        if (a === b) result = a; else break;
-      }
-      return result;
-    }
-    function getTreeScopeRoot(ts) {
-      if (!ts.parent) return ts;
-      return getTreeScopeRoot(ts.parent);
-    }
-    function relatedTargetResolution(event, currentTarget, relatedTarget) {
-      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
-      var currentTargetTree = getTreeScope(currentTarget);
-      var relatedTargetTree = getTreeScope(relatedTarget);
-      var relatedTargetEventPath = getEventPath(relatedTarget, event);
-      var lowestCommonAncestorTree;
-      var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);
-      if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;
-      for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {
-        var adjustedRelatedTarget;
-        for (var i = 0; i < relatedTargetEventPath.length; i++) {
-          var node = relatedTargetEventPath[i];
-          if (getTreeScope(node) === commonAncestorTree) return node;
-        }
-      }
-      return null;
-    }
-    function inSameTree(a, b) {
-      return getTreeScope(a) === getTreeScope(b);
-    }
-    var NONE = 0;
-    var CAPTURING_PHASE = 1;
-    var AT_TARGET = 2;
-    var BUBBLING_PHASE = 3;
-    var pendingError;
-    function dispatchOriginalEvent(originalEvent) {
-      if (handledEventsTable.get(originalEvent)) return;
-      handledEventsTable.set(originalEvent, true);
-      dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
-      if (pendingError) {
-        var err = pendingError;
-        pendingError = null;
-        throw err;
-      }
-    }
-    function isLoadLikeEvent(event) {
-      switch (event.type) {
-       case "load":
-       case "beforeunload":
-       case "unload":
-        return true;
-      }
-      return false;
-    }
-    function dispatchEvent(event, originalWrapperTarget) {
-      if (currentlyDispatchingEvents.get(event)) throw new Error("InvalidStateError");
-      currentlyDispatchingEvents.set(event, true);
-      scope.renderAllPending();
-      var eventPath;
-      var overrideTarget;
-      var win;
-      if (isLoadLikeEvent(event) && !event.bubbles) {
-        var doc = originalWrapperTarget;
-        if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
-          overrideTarget = doc;
-          eventPath = [];
-        }
-      }
-      if (!eventPath) {
-        if (originalWrapperTarget instanceof wrappers.Window) {
-          win = originalWrapperTarget;
-          eventPath = [];
-        } else {
-          eventPath = getEventPath(originalWrapperTarget, event);
-          if (!isLoadLikeEvent(event)) {
-            var doc = eventPath[eventPath.length - 1];
-            if (doc instanceof wrappers.Document) win = doc.defaultView;
-          }
-        }
-      }
-      eventPathTable.set(event, eventPath);
-      if (dispatchCapturing(event, eventPath, win, overrideTarget)) {
-        if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {
-          dispatchBubbling(event, eventPath, win, overrideTarget);
-        }
-      }
-      eventPhaseTable.set(event, NONE);
-      currentTargetTable.delete(event, null);
-      currentlyDispatchingEvents.delete(event);
-      return event.defaultPrevented;
-    }
-    function dispatchCapturing(event, eventPath, win, overrideTarget) {
-      var phase = CAPTURING_PHASE;
-      if (win) {
-        if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;
-      }
-      for (var i = eventPath.length - 1; i > 0; i--) {
-        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;
-      }
-      return true;
-    }
-    function dispatchAtTarget(event, eventPath, win, overrideTarget) {
-      var phase = AT_TARGET;
-      var currentTarget = eventPath[0] || win;
-      return invoke(currentTarget, event, phase, eventPath, overrideTarget);
-    }
-    function dispatchBubbling(event, eventPath, win, overrideTarget) {
-      var phase = BUBBLING_PHASE;
-      for (var i = 1; i < eventPath.length; i++) {
-        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return;
-      }
-      if (win && eventPath.length > 0) {
-        invoke(win, event, phase, eventPath, overrideTarget);
-      }
-    }
-    function invoke(currentTarget, event, phase, eventPath, overrideTarget) {
-      var listeners = listenersTable.get(currentTarget);
-      if (!listeners) return true;
-      var target = overrideTarget || eventRetargetting(eventPath, currentTarget);
-      if (target === currentTarget) {
-        if (phase === CAPTURING_PHASE) return true;
-        if (phase === BUBBLING_PHASE) phase = AT_TARGET;
-      } else if (phase === BUBBLING_PHASE && !event.bubbles) {
-        return true;
-      }
-      if ("relatedTarget" in event) {
-        var originalEvent = unwrap(event);
-        var unwrappedRelatedTarget = originalEvent.relatedTarget;
-        if (unwrappedRelatedTarget) {
-          if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {
-            var relatedTarget = wrap(unwrappedRelatedTarget);
-            var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);
-            if (adjusted === target) return true;
-          } else {
-            adjusted = null;
-          }
-          relatedTargetTable.set(event, adjusted);
-        }
-      }
-      eventPhaseTable.set(event, phase);
-      var type = event.type;
-      var anyRemoved = false;
-      targetTable.set(event, target);
-      currentTargetTable.set(event, currentTarget);
-      listeners.depth++;
-      for (var i = 0, len = listeners.length; i < len; i++) {
-        var listener = listeners[i];
-        if (listener.removed) {
-          anyRemoved = true;
-          continue;
-        }
-        if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {
-          continue;
-        }
-        try {
-          if (typeof listener.handler === "function") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);
-          if (stopImmediatePropagationTable.get(event)) return false;
-        } catch (ex) {
-          if (!pendingError) pendingError = ex;
-        }
-      }
-      listeners.depth--;
-      if (anyRemoved && listeners.depth === 0) {
-        var copy = listeners.slice();
-        listeners.length = 0;
-        for (var i = 0; i < copy.length; i++) {
-          if (!copy[i].removed) listeners.push(copy[i]);
-        }
-      }
-      return !stopPropagationTable.get(event);
-    }
-    function Listener(type, handler, capture) {
-      this.type = type;
-      this.handler = handler;
-      this.capture = Boolean(capture);
-    }
-    Listener.prototype = {
-      equals: function(that) {
-        return this.handler === that.handler && this.type === that.type && this.capture === that.capture;
-      },
-      get removed() {
-        return this.handler === null;
-      },
-      remove: function() {
-        this.handler = null;
-      }
-    };
-    var OriginalEvent = window.Event;
-    OriginalEvent.prototype.polymerBlackList_ = {
-      returnValue: true,
-      keyLocation: true
-    };
-    function Event(type, options) {
-      if (type instanceof OriginalEvent) {
-        var impl = type;
-        if (!OriginalBeforeUnloadEvent && impl.type === "beforeunload" && !(this instanceof BeforeUnloadEvent)) {
-          return new BeforeUnloadEvent(impl);
-        }
-        setWrapper(impl, this);
-      } else {
-        return wrap(constructEvent(OriginalEvent, "Event", type, options));
-      }
-    }
-    Event.prototype = {
-      get target() {
-        return targetTable.get(this);
-      },
-      get currentTarget() {
-        return currentTargetTable.get(this);
-      },
-      get eventPhase() {
-        return eventPhaseTable.get(this);
-      },
-      get path() {
-        var eventPath = eventPathTable.get(this);
-        if (!eventPath) return [];
-        return eventPath.slice();
-      },
-      stopPropagation: function() {
-        stopPropagationTable.set(this, true);
-      },
-      stopImmediatePropagation: function() {
-        stopPropagationTable.set(this, true);
-        stopImmediatePropagationTable.set(this, true);
-      }
-    };
-    var supportsDefaultPrevented = function() {
-      var e = document.createEvent("Event");
-      e.initEvent("test", true, true);
-      e.preventDefault();
-      return e.defaultPrevented;
-    }();
-    if (!supportsDefaultPrevented) {
-      Event.prototype.preventDefault = function() {
-        if (!this.cancelable) return;
-        unsafeUnwrap(this).preventDefault();
-        Object.defineProperty(this, "defaultPrevented", {
-          get: function() {
-            return true;
-          },
-          configurable: true
-        });
-      };
-    }
-    registerWrapper(OriginalEvent, Event, document.createEvent("Event"));
-    function unwrapOptions(options) {
-      if (!options || !options.relatedTarget) return options;
-      return Object.create(options, {
-        relatedTarget: {
-          value: unwrap(options.relatedTarget)
-        }
-      });
-    }
-    function registerGenericEvent(name, SuperEvent, prototype) {
-      var OriginalEvent = window[name];
-      var GenericEvent = function(type, options) {
-        if (type instanceof OriginalEvent) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));
-      };
-      GenericEvent.prototype = Object.create(SuperEvent.prototype);
-      if (prototype) mixin(GenericEvent.prototype, prototype);
-      if (OriginalEvent) {
-        try {
-          registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent("temp"));
-        } catch (ex) {
-          registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));
-        }
-      }
-      return GenericEvent;
-    }
-    var UIEvent = registerGenericEvent("UIEvent", Event);
-    var CustomEvent = registerGenericEvent("CustomEvent", Event);
-    var relatedTargetProto = {
-      get relatedTarget() {
-        var relatedTarget = relatedTargetTable.get(this);
-        if (relatedTarget !== undefined) return relatedTarget;
-        return wrap(unwrap(this).relatedTarget);
-      }
-    };
-    function getInitFunction(name, relatedTargetIndex) {
-      return function() {
-        arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
-        var impl = unwrap(this);
-        impl[name].apply(impl, arguments);
-      };
-    }
-    var mouseEventProto = mixin({
-      initMouseEvent: getInitFunction("initMouseEvent", 14)
-    }, relatedTargetProto);
-    var focusEventProto = mixin({
-      initFocusEvent: getInitFunction("initFocusEvent", 5)
-    }, relatedTargetProto);
-    var MouseEvent = registerGenericEvent("MouseEvent", UIEvent, mouseEventProto);
-    var FocusEvent = registerGenericEvent("FocusEvent", UIEvent, focusEventProto);
-    var defaultInitDicts = Object.create(null);
-    var supportsEventConstructors = function() {
-      try {
-        new window.FocusEvent("focus");
-      } catch (ex) {
-        return false;
-      }
-      return true;
-    }();
-    function constructEvent(OriginalEvent, name, type, options) {
-      if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));
-      var event = unwrap(document.createEvent(name));
-      var defaultDict = defaultInitDicts[name];
-      var args = [ type ];
-      Object.keys(defaultDict).forEach(function(key) {
-        var v = options != null && key in options ? options[key] : defaultDict[key];
-        if (key === "relatedTarget") v = unwrap(v);
-        args.push(v);
-      });
-      event["init" + name].apply(event, args);
-      return event;
-    }
-    if (!supportsEventConstructors) {
-      var configureEventConstructor = function(name, initDict, superName) {
-        if (superName) {
-          var superDict = defaultInitDicts[superName];
-          initDict = mixin(mixin({}, superDict), initDict);
-        }
-        defaultInitDicts[name] = initDict;
-      };
-      configureEventConstructor("Event", {
-        bubbles: false,
-        cancelable: false
-      });
-      configureEventConstructor("CustomEvent", {
-        detail: null
-      }, "Event");
-      configureEventConstructor("UIEvent", {
-        view: null,
-        detail: 0
-      }, "Event");
-      configureEventConstructor("MouseEvent", {
-        screenX: 0,
-        screenY: 0,
-        clientX: 0,
-        clientY: 0,
-        ctrlKey: false,
-        altKey: false,
-        shiftKey: false,
-        metaKey: false,
-        button: 0,
-        relatedTarget: null
-      }, "UIEvent");
-      configureEventConstructor("FocusEvent", {
-        relatedTarget: null
-      }, "UIEvent");
-    }
-    var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
-    function BeforeUnloadEvent(impl) {
-      Event.call(this, impl);
-    }
-    BeforeUnloadEvent.prototype = Object.create(Event.prototype);
-    mixin(BeforeUnloadEvent.prototype, {
-      get returnValue() {
-        return unsafeUnwrap(this).returnValue;
-      },
-      set returnValue(v) {
-        unsafeUnwrap(this).returnValue = v;
-      }
-    });
-    if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
-    function isValidListener(fun) {
-      if (typeof fun === "function") return true;
-      return fun && fun.handleEvent;
-    }
-    function isMutationEvent(type) {
-      switch (type) {
-       case "DOMAttrModified":
-       case "DOMAttributeNameChanged":
-       case "DOMCharacterDataModified":
-       case "DOMElementNameChanged":
-       case "DOMNodeInserted":
-       case "DOMNodeInsertedIntoDocument":
-       case "DOMNodeRemoved":
-       case "DOMNodeRemovedFromDocument":
-       case "DOMSubtreeModified":
-        return true;
-      }
-      return false;
-    }
-    var OriginalEventTarget = window.EventTarget;
-    function EventTarget(impl) {
-      setWrapper(impl, this);
-    }
-    var methodNames = [ "addEventListener", "removeEventListener", "dispatchEvent" ];
-    [ Node, Window ].forEach(function(constructor) {
-      var p = constructor.prototype;
-      methodNames.forEach(function(name) {
-        Object.defineProperty(p, name + "_", {
-          value: p[name]
-        });
-      });
-    });
-    function getTargetToListenAt(wrapper) {
-      if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;
-      return unwrap(wrapper);
-    }
-    EventTarget.prototype = {
-      addEventListener: function(type, fun, capture) {
-        if (!isValidListener(fun) || isMutationEvent(type)) return;
-        var listener = new Listener(type, fun, capture);
-        var listeners = listenersTable.get(this);
-        if (!listeners) {
-          listeners = [];
-          listeners.depth = 0;
-          listenersTable.set(this, listeners);
-        } else {
-          for (var i = 0; i < listeners.length; i++) {
-            if (listener.equals(listeners[i])) return;
-          }
-        }
-        listeners.push(listener);
-        var target = getTargetToListenAt(this);
-        target.addEventListener_(type, dispatchOriginalEvent, true);
-      },
-      removeEventListener: function(type, fun, capture) {
-        capture = Boolean(capture);
-        var listeners = listenersTable.get(this);
-        if (!listeners) return;
-        var count = 0, found = false;
-        for (var i = 0; i < listeners.length; i++) {
-          if (listeners[i].type === type && listeners[i].capture === capture) {
-            count++;
-            if (listeners[i].handler === fun) {
-              found = true;
-              listeners[i].remove();
-            }
-          }
-        }
-        if (found && count === 1) {
-          var target = getTargetToListenAt(this);
-          target.removeEventListener_(type, dispatchOriginalEvent, true);
-        }
-      },
-      dispatchEvent: function(event) {
-        var nativeEvent = unwrap(event);
-        var eventType = nativeEvent.type;
-        handledEventsTable.set(nativeEvent, false);
-        scope.renderAllPending();
-        var tempListener;
-        if (!hasListenerInAncestors(this, eventType)) {
-          tempListener = function() {};
-          this.addEventListener(eventType, tempListener, true);
-        }
-        try {
-          return unwrap(this).dispatchEvent_(nativeEvent);
-        } finally {
-          if (tempListener) this.removeEventListener(eventType, tempListener, true);
-        }
-      }
-    };
-    function hasListener(node, type) {
-      var listeners = listenersTable.get(node);
-      if (listeners) {
-        for (var i = 0; i < listeners.length; i++) {
-          if (!listeners[i].removed && listeners[i].type === type) return true;
-        }
-      }
-      return false;
-    }
-    function hasListenerInAncestors(target, type) {
-      for (var node = unwrap(target); node; node = node.parentNode) {
-        if (hasListener(wrap(node), type)) return true;
-      }
-      return false;
-    }
-    if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);
-    function wrapEventTargetMethods(constructors) {
-      forwardMethodsToWrapper(constructors, methodNames);
-    }
-    var originalElementFromPoint = document.elementFromPoint;
-    function elementFromPoint(self, document, x, y) {
-      scope.renderAllPending();
-      var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
-      if (!element) return null;
-      var path = getEventPath(element, null);
-      var idx = path.lastIndexOf(self);
-      if (idx == -1) return null; else path = path.slice(0, idx);
-      return eventRetargetting(path, self);
-    }
-    function getEventHandlerGetter(name) {
-      return function() {
-        var inlineEventHandlers = eventHandlersTable.get(this);
-        return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;
-      };
-    }
-    function getEventHandlerSetter(name) {
-      var eventType = name.slice(2);
-      return function(value) {
-        var inlineEventHandlers = eventHandlersTable.get(this);
-        if (!inlineEventHandlers) {
-          inlineEventHandlers = Object.create(null);
-          eventHandlersTable.set(this, inlineEventHandlers);
-        }
-        var old = inlineEventHandlers[name];
-        if (old) this.removeEventListener(eventType, old.wrapped, false);
-        if (typeof value === "function") {
-          var wrapped = function(e) {
-            var rv = value.call(this, e);
-            if (rv === false) e.preventDefault(); else if (name === "onbeforeunload" && typeof rv === "string") e.returnValue = rv;
-          };
-          this.addEventListener(eventType, wrapped, false);
-          inlineEventHandlers[name] = {
-            value: value,
-            wrapped: wrapped
-          };
-        }
-      };
-    }
-    scope.elementFromPoint = elementFromPoint;
-    scope.getEventHandlerGetter = getEventHandlerGetter;
-    scope.getEventHandlerSetter = getEventHandlerSetter;
-    scope.wrapEventTargetMethods = wrapEventTargetMethods;
-    scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
-    scope.wrappers.CustomEvent = CustomEvent;
-    scope.wrappers.Event = Event;
-    scope.wrappers.EventTarget = EventTarget;
-    scope.wrappers.FocusEvent = FocusEvent;
-    scope.wrappers.MouseEvent = MouseEvent;
-    scope.wrappers.UIEvent = UIEvent;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var UIEvent = scope.wrappers.UIEvent;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrap = scope.wrap;
-    var OriginalTouchEvent = window.TouchEvent;
-    if (!OriginalTouchEvent) return;
-    var nativeEvent;
-    try {
-      nativeEvent = document.createEvent("TouchEvent");
-    } catch (ex) {
-      return;
-    }
-    var nonEnumDescriptor = {
-      enumerable: false
-    };
-    function nonEnum(obj, prop) {
-      Object.defineProperty(obj, prop, nonEnumDescriptor);
-    }
-    function Touch(impl) {
-      setWrapper(impl, this);
-    }
-    Touch.prototype = {
-      get target() {
-        return wrap(unsafeUnwrap(this).target);
-      }
-    };
-    var descr = {
-      configurable: true,
-      enumerable: true,
-      get: null
-    };
-    [ "clientX", "clientY", "screenX", "screenY", "pageX", "pageY", "identifier", "webkitRadiusX", "webkitRadiusY", "webkitRotationAngle", "webkitForce" ].forEach(function(name) {
-      descr.get = function() {
-        return unsafeUnwrap(this)[name];
-      };
-      Object.defineProperty(Touch.prototype, name, descr);
-    });
-    function TouchList() {
-      this.length = 0;
-      nonEnum(this, "length");
-    }
-    TouchList.prototype = {
-      item: function(index) {
-        return this[index];
-      }
-    };
-    function wrapTouchList(nativeTouchList) {
-      var list = new TouchList();
-      for (var i = 0; i < nativeTouchList.length; i++) {
-        list[i] = new Touch(nativeTouchList[i]);
-      }
-      list.length = i;
-      return list;
-    }
-    function TouchEvent(impl) {
-      UIEvent.call(this, impl);
-    }
-    TouchEvent.prototype = Object.create(UIEvent.prototype);
-    mixin(TouchEvent.prototype, {
-      get touches() {
-        return wrapTouchList(unsafeUnwrap(this).touches);
-      },
-      get targetTouches() {
-        return wrapTouchList(unsafeUnwrap(this).targetTouches);
-      },
-      get changedTouches() {
-        return wrapTouchList(unsafeUnwrap(this).changedTouches);
-      },
-      initTouchEvent: function() {
-        throw new Error("Not implemented");
-      }
-    });
-    registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
-    scope.wrappers.Touch = Touch;
-    scope.wrappers.TouchEvent = TouchEvent;
-    scope.wrappers.TouchList = TouchList;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrap = scope.wrap;
-    var nonEnumDescriptor = {
-      enumerable: false
-    };
-    function nonEnum(obj, prop) {
-      Object.defineProperty(obj, prop, nonEnumDescriptor);
-    }
-    function NodeList() {
-      this.length = 0;
-      nonEnum(this, "length");
-    }
-    NodeList.prototype = {
-      item: function(index) {
-        return this[index];
-      }
-    };
-    nonEnum(NodeList.prototype, "item");
-    function wrapNodeList(list) {
-      if (list == null) return list;
-      var wrapperList = new NodeList();
-      for (var i = 0, length = list.length; i < length; i++) {
-        wrapperList[i] = wrap(list[i]);
-      }
-      wrapperList.length = length;
-      return wrapperList;
-    }
-    function addWrapNodeListMethod(wrapperConstructor, name) {
-      wrapperConstructor.prototype[name] = function() {
-        return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
-      };
-    }
-    scope.wrappers.NodeList = NodeList;
-    scope.addWrapNodeListMethod = addWrapNodeListMethod;
-    scope.wrapNodeList = wrapNodeList;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    scope.wrapHTMLCollection = scope.wrapNodeList;
-    scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var EventTarget = scope.wrappers.EventTarget;
-    var NodeList = scope.wrappers.NodeList;
-    var TreeScope = scope.TreeScope;
-    var assert = scope.assert;
-    var defineWrapGetter = scope.defineWrapGetter;
-    var enqueueMutation = scope.enqueueMutation;
-    var getTreeScope = scope.getTreeScope;
-    var isWrapper = scope.isWrapper;
-    var mixin = scope.mixin;
-    var registerTransientObservers = scope.registerTransientObservers;
-    var registerWrapper = scope.registerWrapper;
-    var setTreeScope = scope.setTreeScope;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var wrapIfNeeded = scope.wrapIfNeeded;
-    var wrappers = scope.wrappers;
-    function assertIsNodeWrapper(node) {
-      assert(node instanceof Node);
-    }
-    function createOneElementNodeList(node) {
-      var nodes = new NodeList();
-      nodes[0] = node;
-      nodes.length = 1;
-      return nodes;
-    }
-    var surpressMutations = false;
-    function enqueueRemovalForInsertedNodes(node, parent, nodes) {
-      enqueueMutation(parent, "childList", {
-        removedNodes: nodes,
-        previousSibling: node.previousSibling,
-        nextSibling: node.nextSibling
-      });
-    }
-    function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
-      enqueueMutation(df, "childList", {
-        removedNodes: nodes
-      });
-    }
-    function collectNodes(node, parentNode, previousNode, nextNode) {
-      if (node instanceof DocumentFragment) {
-        var nodes = collectNodesForDocumentFragment(node);
-        surpressMutations = true;
-        for (var i = nodes.length - 1; i >= 0; i--) {
-          node.removeChild(nodes[i]);
-          nodes[i].parentNode_ = parentNode;
-        }
-        surpressMutations = false;
-        for (var i = 0; i < nodes.length; i++) {
-          nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
-          nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
-        }
-        if (previousNode) previousNode.nextSibling_ = nodes[0];
-        if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];
-        return nodes;
-      }
-      var nodes = createOneElementNodeList(node);
-      var oldParent = node.parentNode;
-      if (oldParent) {
-        oldParent.removeChild(node);
-      }
-      node.parentNode_ = parentNode;
-      node.previousSibling_ = previousNode;
-      node.nextSibling_ = nextNode;
-      if (previousNode) previousNode.nextSibling_ = node;
-      if (nextNode) nextNode.previousSibling_ = node;
-      return nodes;
-    }
-    function collectNodesNative(node) {
-      if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);
-      var nodes = createOneElementNodeList(node);
-      var oldParent = node.parentNode;
-      if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);
-      return nodes;
-    }
-    function collectNodesForDocumentFragment(node) {
-      var nodes = new NodeList();
-      var i = 0;
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        nodes[i++] = child;
-      }
-      nodes.length = i;
-      enqueueRemovalForInsertedDocumentFragment(node, nodes);
-      return nodes;
-    }
-    function snapshotNodeList(nodeList) {
-      return nodeList;
-    }
-    function nodeWasAdded(node, treeScope) {
-      setTreeScope(node, treeScope);
-      node.nodeIsInserted_();
-    }
-    function nodesWereAdded(nodes, parent) {
-      var treeScope = getTreeScope(parent);
-      for (var i = 0; i < nodes.length; i++) {
-        nodeWasAdded(nodes[i], treeScope);
-      }
-    }
-    function nodeWasRemoved(node) {
-      setTreeScope(node, new TreeScope(node, null));
-    }
-    function nodesWereRemoved(nodes) {
-      for (var i = 0; i < nodes.length; i++) {
-        nodeWasRemoved(nodes[i]);
-      }
-    }
-    function ensureSameOwnerDocument(parent, child) {
-      var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;
-      if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);
-    }
-    function adoptNodesIfNeeded(owner, nodes) {
-      if (!nodes.length) return;
-      var ownerDoc = owner.ownerDocument;
-      if (ownerDoc === nodes[0].ownerDocument) return;
-      for (var i = 0; i < nodes.length; i++) {
-        scope.adoptNodeNoRemove(nodes[i], ownerDoc);
-      }
-    }
-    function unwrapNodesForInsertion(owner, nodes) {
-      adoptNodesIfNeeded(owner, nodes);
-      var length = nodes.length;
-      if (length === 1) return unwrap(nodes[0]);
-      var df = unwrap(owner.ownerDocument.createDocumentFragment());
-      for (var i = 0; i < length; i++) {
-        df.appendChild(unwrap(nodes[i]));
-      }
-      return df;
-    }
-    function clearChildNodes(wrapper) {
-      if (wrapper.firstChild_ !== undefined) {
-        var child = wrapper.firstChild_;
-        while (child) {
-          var tmp = child;
-          child = child.nextSibling_;
-          tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
-        }
-      }
-      wrapper.firstChild_ = wrapper.lastChild_ = undefined;
-    }
-    function removeAllChildNodes(wrapper) {
-      if (wrapper.invalidateShadowRenderer()) {
-        var childWrapper = wrapper.firstChild;
-        while (childWrapper) {
-          assert(childWrapper.parentNode === wrapper);
-          var nextSibling = childWrapper.nextSibling;
-          var childNode = unwrap(childWrapper);
-          var parentNode = childNode.parentNode;
-          if (parentNode) originalRemoveChild.call(parentNode, childNode);
-          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = null;
-          childWrapper = nextSibling;
-        }
-        wrapper.firstChild_ = wrapper.lastChild_ = null;
-      } else {
-        var node = unwrap(wrapper);
-        var child = node.firstChild;
-        var nextSibling;
-        while (child) {
-          nextSibling = child.nextSibling;
-          originalRemoveChild.call(node, child);
-          child = nextSibling;
-        }
-      }
-    }
-    function invalidateParent(node) {
-      var p = node.parentNode;
-      return p && p.invalidateShadowRenderer();
-    }
-    function cleanupNodes(nodes) {
-      for (var i = 0, n; i < nodes.length; i++) {
-        n = nodes[i];
-        n.parentNode.removeChild(n);
-      }
-    }
-    var originalImportNode = document.importNode;
-    var originalCloneNode = window.Node.prototype.cloneNode;
-    function cloneNode(node, deep, opt_doc) {
-      var clone;
-      if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
-      if (deep) {
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          clone.appendChild(cloneNode(child, true, opt_doc));
-        }
-        if (node instanceof wrappers.HTMLTemplateElement) {
-          var cloneContent = clone.content;
-          for (var child = node.content.firstChild; child; child = child.nextSibling) {
-            cloneContent.appendChild(cloneNode(child, true, opt_doc));
-          }
-        }
-      }
-      return clone;
-    }
-    function contains(self, child) {
-      if (!child || getTreeScope(self) !== getTreeScope(child)) return false;
-      for (var node = child; node; node = node.parentNode) {
-        if (node === self) return true;
-      }
-      return false;
-    }
-    var OriginalNode = window.Node;
-    function Node(original) {
-      assert(original instanceof OriginalNode);
-      EventTarget.call(this, original);
-      this.parentNode_ = undefined;
-      this.firstChild_ = undefined;
-      this.lastChild_ = undefined;
-      this.nextSibling_ = undefined;
-      this.previousSibling_ = undefined;
-      this.treeScope_ = undefined;
-    }
-    var OriginalDocumentFragment = window.DocumentFragment;
-    var originalAppendChild = OriginalNode.prototype.appendChild;
-    var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;
-    var originalIsEqualNode = OriginalNode.prototype.isEqualNode;
-    var originalInsertBefore = OriginalNode.prototype.insertBefore;
-    var originalRemoveChild = OriginalNode.prototype.removeChild;
-    var originalReplaceChild = OriginalNode.prototype.replaceChild;
-    var isIEOrEdge = /Trident|Edge/.test(navigator.userAgent);
-    var removeChildOriginalHelper = isIEOrEdge ? function(parent, child) {
-      try {
-        originalRemoveChild.call(parent, child);
-      } catch (ex) {
-        if (!(parent instanceof OriginalDocumentFragment)) throw ex;
-      }
-    } : function(parent, child) {
-      originalRemoveChild.call(parent, child);
-    };
-    Node.prototype = Object.create(EventTarget.prototype);
-    mixin(Node.prototype, {
-      appendChild: function(childWrapper) {
-        return this.insertBefore(childWrapper, null);
-      },
-      insertBefore: function(childWrapper, refWrapper) {
-        assertIsNodeWrapper(childWrapper);
-        var refNode;
-        if (refWrapper) {
-          if (isWrapper(refWrapper)) {
-            refNode = unwrap(refWrapper);
-          } else {
-            refNode = refWrapper;
-            refWrapper = wrap(refNode);
-          }
-        } else {
-          refWrapper = null;
-          refNode = null;
-        }
-        refWrapper && assert(refWrapper.parentNode === this);
-        var nodes;
-        var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;
-        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);
-        if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
-        if (useNative) {
-          ensureSameOwnerDocument(this, childWrapper);
-          clearChildNodes(this);
-          originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);
-        } else {
-          if (!previousNode) this.firstChild_ = nodes[0];
-          if (!refWrapper) {
-            this.lastChild_ = nodes[nodes.length - 1];
-            if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;
-          }
-          var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
-          if (parentNode) {
-            originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);
-          } else {
-            adoptNodesIfNeeded(this, nodes);
-          }
-        }
-        enqueueMutation(this, "childList", {
-          addedNodes: nodes,
-          nextSibling: refWrapper,
-          previousSibling: previousNode
-        });
-        nodesWereAdded(nodes, this);
-        return childWrapper;
-      },
-      removeChild: function(childWrapper) {
-        assertIsNodeWrapper(childWrapper);
-        if (childWrapper.parentNode !== this) {
-          var found = false;
-          var childNodes = this.childNodes;
-          for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {
-            if (ieChild === childWrapper) {
-              found = true;
-              break;
-            }
-          }
-          if (!found) {
-            throw new Error("NotFoundError");
-          }
-        }
-        var childNode = unwrap(childWrapper);
-        var childWrapperNextSibling = childWrapper.nextSibling;
-        var childWrapperPreviousSibling = childWrapper.previousSibling;
-        if (this.invalidateShadowRenderer()) {
-          var thisFirstChild = this.firstChild;
-          var thisLastChild = this.lastChild;
-          var parentNode = childNode.parentNode;
-          if (parentNode) removeChildOriginalHelper(parentNode, childNode);
-          if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;
-          if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;
-          if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
-          if (childWrapperNextSibling) {
-            childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;
-          }
-          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;
-        } else {
-          clearChildNodes(this);
-          removeChildOriginalHelper(unsafeUnwrap(this), childNode);
-        }
-        if (!surpressMutations) {
-          enqueueMutation(this, "childList", {
-            removedNodes: createOneElementNodeList(childWrapper),
-            nextSibling: childWrapperNextSibling,
-            previousSibling: childWrapperPreviousSibling
-          });
-        }
-        registerTransientObservers(this, childWrapper);
-        return childWrapper;
-      },
-      replaceChild: function(newChildWrapper, oldChildWrapper) {
-        assertIsNodeWrapper(newChildWrapper);
-        var oldChildNode;
-        if (isWrapper(oldChildWrapper)) {
-          oldChildNode = unwrap(oldChildWrapper);
-        } else {
-          oldChildNode = oldChildWrapper;
-          oldChildWrapper = wrap(oldChildNode);
-        }
-        if (oldChildWrapper.parentNode !== this) {
-          throw new Error("NotFoundError");
-        }
-        var nextNode = oldChildWrapper.nextSibling;
-        var previousNode = oldChildWrapper.previousSibling;
-        var nodes;
-        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);
-        if (useNative) {
-          nodes = collectNodesNative(newChildWrapper);
-        } else {
-          if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;
-          nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
-        }
-        if (!useNative) {
-          if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];
-          if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];
-          oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;
-          if (oldChildNode.parentNode) {
-            originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);
-          }
-        } else {
-          ensureSameOwnerDocument(this, newChildWrapper);
-          clearChildNodes(this);
-          originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);
-        }
-        enqueueMutation(this, "childList", {
-          addedNodes: nodes,
-          removedNodes: createOneElementNodeList(oldChildWrapper),
-          nextSibling: nextNode,
-          previousSibling: previousNode
-        });
-        nodeWasRemoved(oldChildWrapper);
-        nodesWereAdded(nodes, this);
-        return oldChildWrapper;
-      },
-      nodeIsInserted_: function() {
-        for (var child = this.firstChild; child; child = child.nextSibling) {
-          child.nodeIsInserted_();
-        }
-      },
-      hasChildNodes: function() {
-        return this.firstChild !== null;
-      },
-      get parentNode() {
-        return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
-      },
-      get firstChild() {
-        return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
-      },
-      get lastChild() {
-        return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
-      },
-      get nextSibling() {
-        return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
-      },
-      get previousSibling() {
-        return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
-      },
-      get parentElement() {
-        var p = this.parentNode;
-        while (p && p.nodeType !== Node.ELEMENT_NODE) {
-          p = p.parentNode;
-        }
-        return p;
-      },
-      get textContent() {
-        var s = "";
-        for (var child = this.firstChild; child; child = child.nextSibling) {
-          if (child.nodeType != Node.COMMENT_NODE) {
-            s += child.textContent;
-          }
-        }
-        return s;
-      },
-      set textContent(textContent) {
-        if (textContent == null) textContent = "";
-        var removedNodes = snapshotNodeList(this.childNodes);
-        if (this.invalidateShadowRenderer()) {
-          removeAllChildNodes(this);
-          if (textContent !== "") {
-            var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);
-            this.appendChild(textNode);
-          }
-        } else {
-          clearChildNodes(this);
-          unsafeUnwrap(this).textContent = textContent;
-        }
-        var addedNodes = snapshotNodeList(this.childNodes);
-        enqueueMutation(this, "childList", {
-          addedNodes: addedNodes,
-          removedNodes: removedNodes
-        });
-        nodesWereRemoved(removedNodes);
-        nodesWereAdded(addedNodes, this);
-      },
-      get childNodes() {
-        var wrapperList = new NodeList();
-        var i = 0;
-        for (var child = this.firstChild; child; child = child.nextSibling) {
-          wrapperList[i++] = child;
-        }
-        wrapperList.length = i;
-        return wrapperList;
-      },
-      cloneNode: function(deep) {
-        return cloneNode(this, deep);
-      },
-      contains: function(child) {
-        return contains(this, wrapIfNeeded(child));
-      },
-      compareDocumentPosition: function(otherNode) {
-        return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));
-      },
-      isEqualNode: function(otherNode) {
-        return originalIsEqualNode.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));
-      },
-      normalize: function() {
-        var nodes = snapshotNodeList(this.childNodes);
-        var remNodes = [];
-        var s = "";
-        var modNode;
-        for (var i = 0, n; i < nodes.length; i++) {
-          n = nodes[i];
-          if (n.nodeType === Node.TEXT_NODE) {
-            if (!modNode && !n.data.length) this.removeChild(n); else if (!modNode) modNode = n; else {
-              s += n.data;
-              remNodes.push(n);
-            }
-          } else {
-            if (modNode && remNodes.length) {
-              modNode.data += s;
-              cleanupNodes(remNodes);
-            }
-            remNodes = [];
-            s = "";
-            modNode = null;
-            if (n.childNodes.length) n.normalize();
-          }
-        }
-        if (modNode && remNodes.length) {
-          modNode.data += s;
-          cleanupNodes(remNodes);
-        }
-      }
-    });
-    defineWrapGetter(Node, "ownerDocument");
-    registerWrapper(OriginalNode, Node, document.createDocumentFragment());
-    delete Node.prototype.querySelector;
-    delete Node.prototype.querySelectorAll;
-    Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
-    scope.cloneNode = cloneNode;
-    scope.nodeWasAdded = nodeWasAdded;
-    scope.nodeWasRemoved = nodeWasRemoved;
-    scope.nodesWereAdded = nodesWereAdded;
-    scope.nodesWereRemoved = nodesWereRemoved;
-    scope.originalInsertBefore = originalInsertBefore;
-    scope.originalRemoveChild = originalRemoveChild;
-    scope.snapshotNodeList = snapshotNodeList;
-    scope.wrappers.Node = Node;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLCollection = scope.wrappers.HTMLCollection;
-    var NodeList = scope.wrappers.NodeList;
-    var getTreeScope = scope.getTreeScope;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrap = scope.wrap;
-    var originalDocumentQuerySelector = document.querySelector;
-    var originalElementQuerySelector = document.documentElement.querySelector;
-    var originalDocumentQuerySelectorAll = document.querySelectorAll;
-    var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;
-    var originalDocumentGetElementsByTagName = document.getElementsByTagName;
-    var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;
-    var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
-    var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;
-    var OriginalElement = window.Element;
-    var OriginalDocument = window.HTMLDocument || window.Document;
-    function filterNodeList(list, index, result, deep) {
-      var wrappedItem = null;
-      var root = null;
-      for (var i = 0, length = list.length; i < length; i++) {
-        wrappedItem = wrap(list[i]);
-        if (!deep && (root = getTreeScope(wrappedItem).root)) {
-          if (root instanceof scope.wrappers.ShadowRoot) {
-            continue;
-          }
-        }
-        result[index++] = wrappedItem;
-      }
-      return index;
-    }
-    function shimSelector(selector) {
-      return String(selector).replace(/\/deep\/|::shadow|>>>/g, " ");
-    }
-    function shimMatchesSelector(selector) {
-      return String(selector).replace(/:host\(([^\s]+)\)/g, "$1").replace(/([^\s]):host/g, "$1").replace(":host", "*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g, " ");
-    }
-    function findOne(node, selector) {
-      var m, el = node.firstElementChild;
-      while (el) {
-        if (el.matches(selector)) return el;
-        m = findOne(el, selector);
-        if (m) return m;
-        el = el.nextElementSibling;
-      }
-      return null;
-    }
-    function matchesSelector(el, selector) {
-      return el.matches(selector);
-    }
-    var XHTML_NS = "http://www.w3.org/1999/xhtml";
-    function matchesTagName(el, localName, localNameLowerCase) {
-      var ln = el.localName;
-      return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
-    }
-    function matchesEveryThing() {
-      return true;
-    }
-    function matchesLocalNameOnly(el, ns, localName) {
-      return el.localName === localName;
-    }
-    function matchesNameSpace(el, ns) {
-      return el.namespaceURI === ns;
-    }
-    function matchesLocalNameNS(el, ns, localName) {
-      return el.namespaceURI === ns && el.localName === localName;
-    }
-    function findElements(node, index, result, p, arg0, arg1) {
-      var el = node.firstElementChild;
-      while (el) {
-        if (p(el, arg0, arg1)) result[index++] = el;
-        index = findElements(el, index, result, p, arg0, arg1);
-        el = el.nextElementSibling;
-      }
-      return index;
-    }
-    function querySelectorAllFiltered(p, index, result, selector, deep) {
-      var target = unsafeUnwrap(this);
-      var list;
-      var root = getTreeScope(this).root;
-      if (root instanceof scope.wrappers.ShadowRoot) {
-        return findElements(this, index, result, p, selector, null);
-      } else if (target instanceof OriginalElement) {
-        list = originalElementQuerySelectorAll.call(target, selector);
-      } else if (target instanceof OriginalDocument) {
-        list = originalDocumentQuerySelectorAll.call(target, selector);
-      } else {
-        return findElements(this, index, result, p, selector, null);
-      }
-      return filterNodeList(list, index, result, deep);
-    }
-    var SelectorsInterface = {
-      querySelector: function(selector) {
-        var shimmed = shimSelector(selector);
-        var deep = shimmed !== selector;
-        selector = shimmed;
-        var target = unsafeUnwrap(this);
-        var wrappedItem;
-        var root = getTreeScope(this).root;
-        if (root instanceof scope.wrappers.ShadowRoot) {
-          return findOne(this, selector);
-        } else if (target instanceof OriginalElement) {
-          wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
-        } else if (target instanceof OriginalDocument) {
-          wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));
-        } else {
-          return findOne(this, selector);
-        }
-        if (!wrappedItem) {
-          return wrappedItem;
-        } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
-          if (root instanceof scope.wrappers.ShadowRoot) {
-            return findOne(this, selector);
-          }
-        }
-        return wrappedItem;
-      },
-      querySelectorAll: function(selector) {
-        var shimmed = shimSelector(selector);
-        var deep = shimmed !== selector;
-        selector = shimmed;
-        var result = new NodeList();
-        result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);
-        return result;
-      }
-    };
-    var MatchesInterface = {
-      matches: function(selector) {
-        selector = shimMatchesSelector(selector);
-        return scope.originalMatches.call(unsafeUnwrap(this), selector);
-      }
-    };
-    function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {
-      var target = unsafeUnwrap(this);
-      var list;
-      var root = getTreeScope(this).root;
-      if (root instanceof scope.wrappers.ShadowRoot) {
-        return findElements(this, index, result, p, localName, lowercase);
-      } else if (target instanceof OriginalElement) {
-        list = originalElementGetElementsByTagName.call(target, localName, lowercase);
-      } else if (target instanceof OriginalDocument) {
-        list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);
-      } else {
-        return findElements(this, index, result, p, localName, lowercase);
-      }
-      return filterNodeList(list, index, result, false);
-    }
-    function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
-      var target = unsafeUnwrap(this);
-      var list;
-      var root = getTreeScope(this).root;
-      if (root instanceof scope.wrappers.ShadowRoot) {
-        return findElements(this, index, result, p, ns, localName);
-      } else if (target instanceof OriginalElement) {
-        list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
-      } else if (target instanceof OriginalDocument) {
-        list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
-      } else {
-        return findElements(this, index, result, p, ns, localName);
-      }
-      return filterNodeList(list, index, result, false);
-    }
-    var GetElementsByInterface = {
-      getElementsByTagName: function(localName) {
-        var result = new HTMLCollection();
-        var match = localName === "*" ? matchesEveryThing : matchesTagName;
-        result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());
-        return result;
-      },
-      getElementsByClassName: function(className) {
-        return this.querySelectorAll("." + className);
-      },
-      getElementsByTagNameNS: function(ns, localName) {
-        var result = new HTMLCollection();
-        var match = null;
-        if (ns === "*") {
-          match = localName === "*" ? matchesEveryThing : matchesLocalNameOnly;
-        } else {
-          match = localName === "*" ? matchesNameSpace : matchesLocalNameNS;
-        }
-        result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);
-        return result;
-      }
-    };
-    scope.GetElementsByInterface = GetElementsByInterface;
-    scope.SelectorsInterface = SelectorsInterface;
-    scope.MatchesInterface = MatchesInterface;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var NodeList = scope.wrappers.NodeList;
-    function forwardElement(node) {
-      while (node && node.nodeType !== Node.ELEMENT_NODE) {
-        node = node.nextSibling;
-      }
-      return node;
-    }
-    function backwardsElement(node) {
-      while (node && node.nodeType !== Node.ELEMENT_NODE) {
-        node = node.previousSibling;
-      }
-      return node;
-    }
-    var ParentNodeInterface = {
-      get firstElementChild() {
-        return forwardElement(this.firstChild);
-      },
-      get lastElementChild() {
-        return backwardsElement(this.lastChild);
-      },
-      get childElementCount() {
-        var count = 0;
-        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
-          count++;
-        }
-        return count;
-      },
-      get children() {
-        var wrapperList = new NodeList();
-        var i = 0;
-        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
-          wrapperList[i++] = child;
-        }
-        wrapperList.length = i;
-        return wrapperList;
-      },
-      remove: function() {
-        var p = this.parentNode;
-        if (p) p.removeChild(this);
-      }
-    };
-    var ChildNodeInterface = {
-      get nextElementSibling() {
-        return forwardElement(this.nextSibling);
-      },
-      get previousElementSibling() {
-        return backwardsElement(this.previousSibling);
-      }
-    };
-    var NonElementParentNodeInterface = {
-      getElementById: function(id) {
-        if (/[ \t\n\r\f]/.test(id)) return null;
-        return this.querySelector('[id="' + id + '"]');
-      }
-    };
-    scope.ChildNodeInterface = ChildNodeInterface;
-    scope.NonElementParentNodeInterface = NonElementParentNodeInterface;
-    scope.ParentNodeInterface = ParentNodeInterface;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var ChildNodeInterface = scope.ChildNodeInterface;
-    var Node = scope.wrappers.Node;
-    var enqueueMutation = scope.enqueueMutation;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var OriginalCharacterData = window.CharacterData;
-    function CharacterData(node) {
-      Node.call(this, node);
-    }
-    CharacterData.prototype = Object.create(Node.prototype);
-    mixin(CharacterData.prototype, {
-      get nodeValue() {
-        return this.data;
-      },
-      set nodeValue(data) {
-        this.data = data;
-      },
-      get textContent() {
-        return this.data;
-      },
-      set textContent(value) {
-        this.data = value;
-      },
-      get data() {
-        return unsafeUnwrap(this).data;
-      },
-      set data(value) {
-        var oldValue = unsafeUnwrap(this).data;
-        enqueueMutation(this, "characterData", {
-          oldValue: oldValue
-        });
-        unsafeUnwrap(this).data = value;
-      }
-    });
-    mixin(CharacterData.prototype, ChildNodeInterface);
-    registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(""));
-    scope.wrappers.CharacterData = CharacterData;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var CharacterData = scope.wrappers.CharacterData;
-    var enqueueMutation = scope.enqueueMutation;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    function toUInt32(x) {
-      return x >>> 0;
-    }
-    var OriginalText = window.Text;
-    function Text(node) {
-      CharacterData.call(this, node);
-    }
-    Text.prototype = Object.create(CharacterData.prototype);
-    mixin(Text.prototype, {
-      splitText: function(offset) {
-        offset = toUInt32(offset);
-        var s = this.data;
-        if (offset > s.length) throw new Error("IndexSizeError");
-        var head = s.slice(0, offset);
-        var tail = s.slice(offset);
-        this.data = head;
-        var newTextNode = this.ownerDocument.createTextNode(tail);
-        if (this.parentNode) this.parentNode.insertBefore(newTextNode, this.nextSibling);
-        return newTextNode;
-      }
-    });
-    registerWrapper(OriginalText, Text, document.createTextNode(""));
-    scope.wrappers.Text = Text;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    if (!window.DOMTokenList) {
-      console.warn("Missing DOMTokenList prototype, please include a " + "compatible classList polyfill such as http://goo.gl/uTcepH.");
-      return;
-    }
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var enqueueMutation = scope.enqueueMutation;
-    function getClass(el) {
-      return unsafeUnwrap(el).getAttribute("class");
-    }
-    function enqueueClassAttributeChange(el, oldValue) {
-      enqueueMutation(el, "attributes", {
-        name: "class",
-        namespace: null,
-        oldValue: oldValue
-      });
-    }
-    function invalidateClass(el) {
-      scope.invalidateRendererBasedOnAttribute(el, "class");
-    }
-    function changeClass(tokenList, method, args) {
-      var ownerElement = tokenList.ownerElement_;
-      if (ownerElement == null) {
-        return method.apply(tokenList, args);
-      }
-      var oldValue = getClass(ownerElement);
-      var retv = method.apply(tokenList, args);
-      if (getClass(ownerElement) !== oldValue) {
-        enqueueClassAttributeChange(ownerElement, oldValue);
-        invalidateClass(ownerElement);
-      }
-      return retv;
-    }
-    var oldAdd = DOMTokenList.prototype.add;
-    DOMTokenList.prototype.add = function() {
-      changeClass(this, oldAdd, arguments);
-    };
-    var oldRemove = DOMTokenList.prototype.remove;
-    DOMTokenList.prototype.remove = function() {
-      changeClass(this, oldRemove, arguments);
-    };
-    var oldToggle = DOMTokenList.prototype.toggle;
-    DOMTokenList.prototype.toggle = function() {
-      return changeClass(this, oldToggle, arguments);
-    };
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var ChildNodeInterface = scope.ChildNodeInterface;
-    var GetElementsByInterface = scope.GetElementsByInterface;
-    var Node = scope.wrappers.Node;
-    var ParentNodeInterface = scope.ParentNodeInterface;
-    var SelectorsInterface = scope.SelectorsInterface;
-    var MatchesInterface = scope.MatchesInterface;
-    var addWrapNodeListMethod = scope.addWrapNodeListMethod;
-    var enqueueMutation = scope.enqueueMutation;
-    var mixin = scope.mixin;
-    var oneOf = scope.oneOf;
-    var registerWrapper = scope.registerWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrappers = scope.wrappers;
-    var OriginalElement = window.Element;
-    var matchesNames = [ "matches", "mozMatchesSelector", "msMatchesSelector", "webkitMatchesSelector" ].filter(function(name) {
-      return OriginalElement.prototype[name];
-    });
-    var matchesName = matchesNames[0];
-    var originalMatches = OriginalElement.prototype[matchesName];
-    function invalidateRendererBasedOnAttribute(element, name) {
-      var p = element.parentNode;
-      if (!p || !p.shadowRoot) return;
-      var renderer = scope.getRendererForHost(p);
-      if (renderer.dependsOnAttribute(name)) renderer.invalidate();
-    }
-    function enqueAttributeChange(element, name, oldValue) {
-      enqueueMutation(element, "attributes", {
-        name: name,
-        namespace: null,
-        oldValue: oldValue
-      });
-    }
-    var classListTable = new WeakMap();
-    function Element(node) {
-      Node.call(this, node);
-    }
-    Element.prototype = Object.create(Node.prototype);
-    mixin(Element.prototype, {
-      createShadowRoot: function() {
-        var newShadowRoot = new wrappers.ShadowRoot(this);
-        unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
-        var renderer = scope.getRendererForHost(this);
-        renderer.invalidate();
-        return newShadowRoot;
-      },
-      get shadowRoot() {
-        return unsafeUnwrap(this).polymerShadowRoot_ || null;
-      },
-      setAttribute: function(name, value) {
-        var oldValue = unsafeUnwrap(this).getAttribute(name);
-        unsafeUnwrap(this).setAttribute(name, value);
-        enqueAttributeChange(this, name, oldValue);
-        invalidateRendererBasedOnAttribute(this, name);
-      },
-      removeAttribute: function(name) {
-        var oldValue = unsafeUnwrap(this).getAttribute(name);
-        unsafeUnwrap(this).removeAttribute(name);
-        enqueAttributeChange(this, name, oldValue);
-        invalidateRendererBasedOnAttribute(this, name);
-      },
-      get classList() {
-        var list = classListTable.get(this);
-        if (!list) {
-          list = unsafeUnwrap(this).classList;
-          if (!list) return;
-          list.ownerElement_ = this;
-          classListTable.set(this, list);
-        }
-        return list;
-      },
-      get className() {
-        return unsafeUnwrap(this).className;
-      },
-      set className(v) {
-        this.setAttribute("class", v);
-      },
-      get id() {
-        return unsafeUnwrap(this).id;
-      },
-      set id(v) {
-        this.setAttribute("id", v);
-      }
-    });
-    matchesNames.forEach(function(name) {
-      if (name !== "matches") {
-        Element.prototype[name] = function(selector) {
-          return this.matches(selector);
-        };
-      }
-    });
-    if (OriginalElement.prototype.webkitCreateShadowRoot) {
-      Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
-    }
-    mixin(Element.prototype, ChildNodeInterface);
-    mixin(Element.prototype, GetElementsByInterface);
-    mixin(Element.prototype, ParentNodeInterface);
-    mixin(Element.prototype, SelectorsInterface);
-    mixin(Element.prototype, MatchesInterface);
-    registerWrapper(OriginalElement, Element, document.createElementNS(null, "x"));
-    scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
-    scope.matchesNames = matchesNames;
-    scope.originalMatches = originalMatches;
-    scope.wrappers.Element = Element;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var Element = scope.wrappers.Element;
-    var defineGetter = scope.defineGetter;
-    var enqueueMutation = scope.enqueueMutation;
-    var mixin = scope.mixin;
-    var nodesWereAdded = scope.nodesWereAdded;
-    var nodesWereRemoved = scope.nodesWereRemoved;
-    var registerWrapper = scope.registerWrapper;
-    var snapshotNodeList = scope.snapshotNodeList;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var wrappers = scope.wrappers;
-    var escapeAttrRegExp = /[&\u00A0"]/g;
-    var escapeDataRegExp = /[&\u00A0<>]/g;
-    function escapeReplace(c) {
-      switch (c) {
-       case "&":
-        return "&amp;";
-
-       case "<":
-        return "&lt;";
-
-       case ">":
-        return "&gt;";
-
-       case '"':
-        return "&quot;";
-
-       case " ":
-        return "&nbsp;";
-      }
-    }
-    function escapeAttr(s) {
-      return s.replace(escapeAttrRegExp, escapeReplace);
-    }
-    function escapeData(s) {
-      return s.replace(escapeDataRegExp, escapeReplace);
-    }
-    function makeSet(arr) {
-      var set = {};
-      for (var i = 0; i < arr.length; i++) {
-        set[arr[i]] = true;
-      }
-      return set;
-    }
-    var voidElements = makeSet([ "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr" ]);
-    var plaintextParents = makeSet([ "style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript" ]);
-    var XHTML_NS = "http://www.w3.org/1999/xhtml";
-    function needsSelfClosingSlash(node) {
-      if (node.namespaceURI !== XHTML_NS) return true;
-      var doctype = node.ownerDocument.doctype;
-      return doctype && doctype.publicId && doctype.systemId;
-    }
-    function getOuterHTML(node, parentNode) {
-      switch (node.nodeType) {
-       case Node.ELEMENT_NODE:
-        var tagName = node.tagName.toLowerCase();
-        var s = "<" + tagName;
-        var attrs = node.attributes;
-        for (var i = 0, attr; attr = attrs[i]; i++) {
-          s += " " + attr.name + '="' + escapeAttr(attr.value) + '"';
-        }
-        if (voidElements[tagName]) {
-          if (needsSelfClosingSlash(node)) s += "/";
-          return s + ">";
-        }
-        return s + ">" + getInnerHTML(node) + "</" + tagName + ">";
-
-       case Node.TEXT_NODE:
-        var data = node.data;
-        if (parentNode && plaintextParents[parentNode.localName]) return data;
-        return escapeData(data);
-
-       case Node.COMMENT_NODE:
-        return "<!--" + node.data + "-->";
-
-       default:
-        console.error(node);
-        throw new Error("not implemented");
-      }
-    }
-    function getInnerHTML(node) {
-      if (node instanceof wrappers.HTMLTemplateElement) node = node.content;
-      var s = "";
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        s += getOuterHTML(child, node);
-      }
-      return s;
-    }
-    function setInnerHTML(node, value, opt_tagName) {
-      var tagName = opt_tagName || "div";
-      node.textContent = "";
-      var tempElement = unwrap(node.ownerDocument.createElement(tagName));
-      tempElement.innerHTML = value;
-      var firstChild;
-      while (firstChild = tempElement.firstChild) {
-        node.appendChild(wrap(firstChild));
-      }
-    }
-    var oldIe = /MSIE/.test(navigator.userAgent);
-    var OriginalHTMLElement = window.HTMLElement;
-    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-    function HTMLElement(node) {
-      Element.call(this, node);
-    }
-    HTMLElement.prototype = Object.create(Element.prototype);
-    mixin(HTMLElement.prototype, {
-      get innerHTML() {
-        return getInnerHTML(this);
-      },
-      set innerHTML(value) {
-        if (oldIe && plaintextParents[this.localName]) {
-          this.textContent = value;
-          return;
-        }
-        var removedNodes = snapshotNodeList(this.childNodes);
-        if (this.invalidateShadowRenderer()) {
-          if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);
-        } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {
-          setInnerHTML(this.content, value);
-        } else {
-          unsafeUnwrap(this).innerHTML = value;
-        }
-        var addedNodes = snapshotNodeList(this.childNodes);
-        enqueueMutation(this, "childList", {
-          addedNodes: addedNodes,
-          removedNodes: removedNodes
-        });
-        nodesWereRemoved(removedNodes);
-        nodesWereAdded(addedNodes, this);
-      },
-      get outerHTML() {
-        return getOuterHTML(this, this.parentNode);
-      },
-      set outerHTML(value) {
-        var p = this.parentNode;
-        if (p) {
-          p.invalidateShadowRenderer();
-          var df = frag(p, value);
-          p.replaceChild(df, this);
-        }
-      },
-      insertAdjacentHTML: function(position, text) {
-        var contextElement, refNode;
-        switch (String(position).toLowerCase()) {
-         case "beforebegin":
-          contextElement = this.parentNode;
-          refNode = this;
-          break;
-
-         case "afterend":
-          contextElement = this.parentNode;
-          refNode = this.nextSibling;
-          break;
-
-         case "afterbegin":
-          contextElement = this;
-          refNode = this.firstChild;
-          break;
-
-         case "beforeend":
-          contextElement = this;
-          refNode = null;
-          break;
-
-         default:
-          return;
-        }
-        var df = frag(contextElement, text);
-        contextElement.insertBefore(df, refNode);
-      },
-      get hidden() {
-        return this.hasAttribute("hidden");
-      },
-      set hidden(v) {
-        if (v) {
-          this.setAttribute("hidden", "");
-        } else {
-          this.removeAttribute("hidden");
-        }
-      }
-    });
-    function frag(contextElement, html) {
-      var p = unwrap(contextElement.cloneNode(false));
-      p.innerHTML = html;
-      var df = unwrap(document.createDocumentFragment());
-      var c;
-      while (c = p.firstChild) {
-        df.appendChild(c);
-      }
-      return wrap(df);
-    }
-    function getter(name) {
-      return function() {
-        scope.renderAllPending();
-        return unsafeUnwrap(this)[name];
-      };
-    }
-    function getterRequiresRendering(name) {
-      defineGetter(HTMLElement, name, getter(name));
-    }
-    [ "clientHeight", "clientLeft", "clientTop", "clientWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetWidth", "scrollHeight", "scrollWidth" ].forEach(getterRequiresRendering);
-    function getterAndSetterRequiresRendering(name) {
-      Object.defineProperty(HTMLElement.prototype, name, {
-        get: getter(name),
-        set: function(v) {
-          scope.renderAllPending();
-          unsafeUnwrap(this)[name] = v;
-        },
-        configurable: true,
-        enumerable: true
-      });
-    }
-    [ "scrollLeft", "scrollTop" ].forEach(getterAndSetterRequiresRendering);
-    function methodRequiresRendering(name) {
-      Object.defineProperty(HTMLElement.prototype, name, {
-        value: function() {
-          scope.renderAllPending();
-          return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
-        },
-        configurable: true,
-        enumerable: true
-      });
-    }
-    [ "focus", "getBoundingClientRect", "getClientRects", "scrollIntoView" ].forEach(methodRequiresRendering);
-    registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement("b"));
-    scope.wrappers.HTMLElement = HTMLElement;
-    scope.getInnerHTML = getInnerHTML;
-    scope.setInnerHTML = setInnerHTML;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrap = scope.wrap;
-    var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
-    function HTMLCanvasElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLCanvasElement.prototype, {
-      getContext: function() {
-        var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);
-        return context && wrap(context);
-      }
-    });
-    registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement("canvas"));
-    scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var OriginalHTMLContentElement = window.HTMLContentElement;
-    function HTMLContentElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLContentElement.prototype, {
-      constructor: HTMLContentElement,
-      get select() {
-        return this.getAttribute("select");
-      },
-      set select(value) {
-        this.setAttribute("select", value);
-      },
-      setAttribute: function(n, v) {
-        HTMLElement.prototype.setAttribute.call(this, n, v);
-        if (String(n).toLowerCase() === "select") this.invalidateShadowRenderer(true);
-      }
-    });
-    if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
-    scope.wrappers.HTMLContentElement = HTMLContentElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var wrapHTMLCollection = scope.wrapHTMLCollection;
-    var unwrap = scope.unwrap;
-    var OriginalHTMLFormElement = window.HTMLFormElement;
-    function HTMLFormElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLFormElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLFormElement.prototype, {
-      get elements() {
-        return wrapHTMLCollection(unwrap(this).elements);
-      }
-    });
-    registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement("form"));
-    scope.wrappers.HTMLFormElement = HTMLFormElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var registerWrapper = scope.registerWrapper;
-    var unwrap = scope.unwrap;
-    var rewrap = scope.rewrap;
-    var OriginalHTMLImageElement = window.HTMLImageElement;
-    function HTMLImageElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
-    registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement("img"));
-    function Image(width, height) {
-      if (!(this instanceof Image)) {
-        throw new TypeError("DOM object constructor cannot be called as a function.");
-      }
-      var node = unwrap(document.createElement("img"));
-      HTMLElement.call(this, node);
-      rewrap(node, this);
-      if (width !== undefined) node.width = width;
-      if (height !== undefined) node.height = height;
-    }
-    Image.prototype = HTMLImageElement.prototype;
-    scope.wrappers.HTMLImageElement = HTMLImageElement;
-    scope.wrappers.Image = Image;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var NodeList = scope.wrappers.NodeList;
-    var registerWrapper = scope.registerWrapper;
-    var OriginalHTMLShadowElement = window.HTMLShadowElement;
-    function HTMLShadowElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
-    HTMLShadowElement.prototype.constructor = HTMLShadowElement;
-    if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
-    scope.wrappers.HTMLShadowElement = HTMLShadowElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var contentTable = new WeakMap();
-    var templateContentsOwnerTable = new WeakMap();
-    function getTemplateContentsOwner(doc) {
-      if (!doc.defaultView) return doc;
-      var d = templateContentsOwnerTable.get(doc);
-      if (!d) {
-        d = doc.implementation.createHTMLDocument("");
-        while (d.lastChild) {
-          d.removeChild(d.lastChild);
-        }
-        templateContentsOwnerTable.set(doc, d);
-      }
-      return d;
-    }
-    function extractContent(templateElement) {
-      var doc = getTemplateContentsOwner(templateElement.ownerDocument);
-      var df = unwrap(doc.createDocumentFragment());
-      var child;
-      while (child = templateElement.firstChild) {
-        df.appendChild(child);
-      }
-      return df;
-    }
-    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-    function HTMLTemplateElement(node) {
-      HTMLElement.call(this, node);
-      if (!OriginalHTMLTemplateElement) {
-        var content = extractContent(node);
-        contentTable.set(this, wrap(content));
-      }
-    }
-    HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLTemplateElement.prototype, {
-      constructor: HTMLTemplateElement,
-      get content() {
-        if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);
-        return contentTable.get(this);
-      }
-    });
-    if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
-    scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var registerWrapper = scope.registerWrapper;
-    var OriginalHTMLMediaElement = window.HTMLMediaElement;
-    if (!OriginalHTMLMediaElement) return;
-    function HTMLMediaElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
-    registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement("audio"));
-    scope.wrappers.HTMLMediaElement = HTMLMediaElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
-    var registerWrapper = scope.registerWrapper;
-    var unwrap = scope.unwrap;
-    var rewrap = scope.rewrap;
-    var OriginalHTMLAudioElement = window.HTMLAudioElement;
-    if (!OriginalHTMLAudioElement) return;
-    function HTMLAudioElement(node) {
-      HTMLMediaElement.call(this, node);
-    }
-    HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
-    registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement("audio"));
-    function Audio(src) {
-      if (!(this instanceof Audio)) {
-        throw new TypeError("DOM object constructor cannot be called as a function.");
-      }
-      var node = unwrap(document.createElement("audio"));
-      HTMLMediaElement.call(this, node);
-      rewrap(node, this);
-      node.setAttribute("preload", "auto");
-      if (src !== undefined) node.setAttribute("src", src);
-    }
-    Audio.prototype = HTMLAudioElement.prototype;
-    scope.wrappers.HTMLAudioElement = HTMLAudioElement;
-    scope.wrappers.Audio = Audio;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var rewrap = scope.rewrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var OriginalHTMLOptionElement = window.HTMLOptionElement;
-    function trimText(s) {
-      return s.replace(/\s+/g, " ").trim();
-    }
-    function HTMLOptionElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLOptionElement.prototype, {
-      get text() {
-        return trimText(this.textContent);
-      },
-      set text(value) {
-        this.textContent = trimText(String(value));
-      },
-      get form() {
-        return wrap(unwrap(this).form);
-      }
-    });
-    registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement("option"));
-    function Option(text, value, defaultSelected, selected) {
-      if (!(this instanceof Option)) {
-        throw new TypeError("DOM object constructor cannot be called as a function.");
-      }
-      var node = unwrap(document.createElement("option"));
-      HTMLElement.call(this, node);
-      rewrap(node, this);
-      if (text !== undefined) node.text = text;
-      if (value !== undefined) node.setAttribute("value", value);
-      if (defaultSelected === true) node.setAttribute("selected", "");
-      node.selected = selected === true;
-    }
-    Option.prototype = HTMLOptionElement.prototype;
-    scope.wrappers.HTMLOptionElement = HTMLOptionElement;
-    scope.wrappers.Option = Option;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var OriginalHTMLSelectElement = window.HTMLSelectElement;
-    function HTMLSelectElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLSelectElement.prototype, {
-      add: function(element, before) {
-        if (typeof before === "object") before = unwrap(before);
-        unwrap(this).add(unwrap(element), before);
-      },
-      remove: function(indexOrNode) {
-        if (indexOrNode === undefined) {
-          HTMLElement.prototype.remove.call(this);
-          return;
-        }
-        if (typeof indexOrNode === "object") indexOrNode = unwrap(indexOrNode);
-        unwrap(this).remove(indexOrNode);
-      },
-      get form() {
-        return wrap(unwrap(this).form);
-      }
-    });
-    registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement("select"));
-    scope.wrappers.HTMLSelectElement = HTMLSelectElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var wrapHTMLCollection = scope.wrapHTMLCollection;
-    var OriginalHTMLTableElement = window.HTMLTableElement;
-    function HTMLTableElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLTableElement.prototype, {
-      get caption() {
-        return wrap(unwrap(this).caption);
-      },
-      createCaption: function() {
-        return wrap(unwrap(this).createCaption());
-      },
-      get tHead() {
-        return wrap(unwrap(this).tHead);
-      },
-      createTHead: function() {
-        return wrap(unwrap(this).createTHead());
-      },
-      createTFoot: function() {
-        return wrap(unwrap(this).createTFoot());
-      },
-      get tFoot() {
-        return wrap(unwrap(this).tFoot);
-      },
-      get tBodies() {
-        return wrapHTMLCollection(unwrap(this).tBodies);
-      },
-      createTBody: function() {
-        return wrap(unwrap(this).createTBody());
-      },
-      get rows() {
-        return wrapHTMLCollection(unwrap(this).rows);
-      },
-      insertRow: function(index) {
-        return wrap(unwrap(this).insertRow(index));
-      }
-    });
-    registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement("table"));
-    scope.wrappers.HTMLTableElement = HTMLTableElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var wrapHTMLCollection = scope.wrapHTMLCollection;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
-    function HTMLTableSectionElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLTableSectionElement.prototype, {
-      constructor: HTMLTableSectionElement,
-      get rows() {
-        return wrapHTMLCollection(unwrap(this).rows);
-      },
-      insertRow: function(index) {
-        return wrap(unwrap(this).insertRow(index));
-      }
-    });
-    registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement("thead"));
-    scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var wrapHTMLCollection = scope.wrapHTMLCollection;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
-    function HTMLTableRowElement(node) {
-      HTMLElement.call(this, node);
-    }
-    HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
-    mixin(HTMLTableRowElement.prototype, {
-      get cells() {
-        return wrapHTMLCollection(unwrap(this).cells);
-      },
-      insertCell: function(index) {
-        return wrap(unwrap(this).insertCell(index));
-      }
-    });
-    registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement("tr"));
-    scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLContentElement = scope.wrappers.HTMLContentElement;
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-    var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
-    function HTMLUnknownElement(node) {
-      switch (node.localName) {
-       case "content":
-        return new HTMLContentElement(node);
-
-       case "shadow":
-        return new HTMLShadowElement(node);
-
-       case "template":
-        return new HTMLTemplateElement(node);
-      }
-      HTMLElement.call(this, node);
-    }
-    HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
-    registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
-    scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var Element = scope.wrappers.Element;
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var registerWrapper = scope.registerWrapper;
-    var defineWrapGetter = scope.defineWrapGetter;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrap = scope.wrap;
-    var mixin = scope.mixin;
-    var SVG_NS = "http://www.w3.org/2000/svg";
-    var OriginalSVGElement = window.SVGElement;
-    var svgTitleElement = document.createElementNS(SVG_NS, "title");
-    if (!("classList" in svgTitleElement)) {
-      var descr = Object.getOwnPropertyDescriptor(Element.prototype, "classList");
-      Object.defineProperty(HTMLElement.prototype, "classList", descr);
-      delete Element.prototype.classList;
-    }
-    function SVGElement(node) {
-      Element.call(this, node);
-    }
-    SVGElement.prototype = Object.create(Element.prototype);
-    mixin(SVGElement.prototype, {
-      get ownerSVGElement() {
-        return wrap(unsafeUnwrap(this).ownerSVGElement);
-      }
-    });
-    registerWrapper(OriginalSVGElement, SVGElement, document.createElementNS(SVG_NS, "title"));
-    scope.wrappers.SVGElement = SVGElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var OriginalSVGUseElement = window.SVGUseElement;
-    var SVG_NS = "http://www.w3.org/2000/svg";
-    var gWrapper = wrap(document.createElementNS(SVG_NS, "g"));
-    var useElement = document.createElementNS(SVG_NS, "use");
-    var SVGGElement = gWrapper.constructor;
-    var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
-    var parentInterface = parentInterfacePrototype.constructor;
-    function SVGUseElement(impl) {
-      parentInterface.call(this, impl);
-    }
-    SVGUseElement.prototype = Object.create(parentInterfacePrototype);
-    if ("instanceRoot" in useElement) {
-      mixin(SVGUseElement.prototype, {
-        get instanceRoot() {
-          return wrap(unwrap(this).instanceRoot);
-        },
-        get animatedInstanceRoot() {
-          return wrap(unwrap(this).animatedInstanceRoot);
-        }
-      });
-    }
-    registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
-    scope.wrappers.SVGUseElement = SVGUseElement;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var EventTarget = scope.wrappers.EventTarget;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var wrap = scope.wrap;
-    var OriginalSVGElementInstance = window.SVGElementInstance;
-    if (!OriginalSVGElementInstance) return;
-    function SVGElementInstance(impl) {
-      EventTarget.call(this, impl);
-    }
-    SVGElementInstance.prototype = Object.create(EventTarget.prototype);
-    mixin(SVGElementInstance.prototype, {
-      get correspondingElement() {
-        return wrap(unsafeUnwrap(this).correspondingElement);
-      },
-      get correspondingUseElement() {
-        return wrap(unsafeUnwrap(this).correspondingUseElement);
-      },
-      get parentNode() {
-        return wrap(unsafeUnwrap(this).parentNode);
-      },
-      get childNodes() {
-        throw new Error("Not implemented");
-      },
-      get firstChild() {
-        return wrap(unsafeUnwrap(this).firstChild);
-      },
-      get lastChild() {
-        return wrap(unsafeUnwrap(this).lastChild);
-      },
-      get previousSibling() {
-        return wrap(unsafeUnwrap(this).previousSibling);
-      },
-      get nextSibling() {
-        return wrap(unsafeUnwrap(this).nextSibling);
-      }
-    });
-    registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
-    scope.wrappers.SVGElementInstance = SVGElementInstance;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-    function CanvasRenderingContext2D(impl) {
-      setWrapper(impl, this);
-    }
-    mixin(CanvasRenderingContext2D.prototype, {
-      get canvas() {
-        return wrap(unsafeUnwrap(this).canvas);
-      },
-      drawImage: function() {
-        arguments[0] = unwrapIfNeeded(arguments[0]);
-        unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
-      },
-      createPattern: function() {
-        arguments[0] = unwrap(arguments[0]);
-        return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);
-      }
-    });
-    registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement("canvas").getContext("2d"));
-    scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var addForwardingProperties = scope.addForwardingProperties;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-    if (!OriginalWebGLRenderingContext) return;
-    function WebGLRenderingContext(impl) {
-      setWrapper(impl, this);
-    }
-    mixin(WebGLRenderingContext.prototype, {
-      get canvas() {
-        return wrap(unsafeUnwrap(this).canvas);
-      },
-      texImage2D: function() {
-        arguments[5] = unwrapIfNeeded(arguments[5]);
-        unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
-      },
-      texSubImage2D: function() {
-        arguments[6] = unwrapIfNeeded(arguments[6]);
-        unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
-      }
-    });
-    var OriginalWebGLRenderingContextBase = Object.getPrototypeOf(OriginalWebGLRenderingContext.prototype);
-    if (OriginalWebGLRenderingContextBase !== Object.prototype) {
-      addForwardingProperties(OriginalWebGLRenderingContextBase, WebGLRenderingContext.prototype);
-    }
-    var instanceProperties = /WebKit/.test(navigator.userAgent) ? {
-      drawingBufferHeight: null,
-      drawingBufferWidth: null
-    } : {};
-    registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);
-    scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var Node = scope.wrappers.Node;
-    var GetElementsByInterface = scope.GetElementsByInterface;
-    var NonElementParentNodeInterface = scope.NonElementParentNodeInterface;
-    var ParentNodeInterface = scope.ParentNodeInterface;
-    var SelectorsInterface = scope.SelectorsInterface;
-    var mixin = scope.mixin;
-    var registerObject = scope.registerObject;
-    var registerWrapper = scope.registerWrapper;
-    var OriginalDocumentFragment = window.DocumentFragment;
-    function DocumentFragment(node) {
-      Node.call(this, node);
-    }
-    DocumentFragment.prototype = Object.create(Node.prototype);
-    mixin(DocumentFragment.prototype, ParentNodeInterface);
-    mixin(DocumentFragment.prototype, SelectorsInterface);
-    mixin(DocumentFragment.prototype, GetElementsByInterface);
-    mixin(DocumentFragment.prototype, NonElementParentNodeInterface);
-    registerWrapper(OriginalDocumentFragment, DocumentFragment, document.createDocumentFragment());
-    scope.wrappers.DocumentFragment = DocumentFragment;
-    var Comment = registerObject(document.createComment(""));
-    scope.wrappers.Comment = Comment;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var DocumentFragment = scope.wrappers.DocumentFragment;
-    var TreeScope = scope.TreeScope;
-    var elementFromPoint = scope.elementFromPoint;
-    var getInnerHTML = scope.getInnerHTML;
-    var getTreeScope = scope.getTreeScope;
-    var mixin = scope.mixin;
-    var rewrap = scope.rewrap;
-    var setInnerHTML = scope.setInnerHTML;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var shadowHostTable = new WeakMap();
-    var nextOlderShadowTreeTable = new WeakMap();
-    function ShadowRoot(hostWrapper) {
-      var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());
-      DocumentFragment.call(this, node);
-      rewrap(node, this);
-      var oldShadowRoot = hostWrapper.shadowRoot;
-      nextOlderShadowTreeTable.set(this, oldShadowRoot);
-      this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
-      shadowHostTable.set(this, hostWrapper);
-    }
-    ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
-    mixin(ShadowRoot.prototype, {
-      constructor: ShadowRoot,
-      get innerHTML() {
-        return getInnerHTML(this);
-      },
-      set innerHTML(value) {
-        setInnerHTML(this, value);
-        this.invalidateShadowRenderer();
-      },
-      get olderShadowRoot() {
-        return nextOlderShadowTreeTable.get(this) || null;
-      },
-      get host() {
-        return shadowHostTable.get(this) || null;
-      },
-      invalidateShadowRenderer: function() {
-        return shadowHostTable.get(this).invalidateShadowRenderer();
-      },
-      elementFromPoint: function(x, y) {
-        return elementFromPoint(this, this.ownerDocument, x, y);
-      },
-      getSelection: function() {
-        return document.getSelection();
-      },
-      get activeElement() {
-        var unwrappedActiveElement = unwrap(this).ownerDocument.activeElement;
-        if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null;
-        var activeElement = wrap(unwrappedActiveElement);
-        while (!this.contains(activeElement)) {
-          while (activeElement.parentNode) {
-            activeElement = activeElement.parentNode;
-          }
-          if (activeElement.host) {
-            activeElement = activeElement.host;
-          } else {
-            return null;
-          }
-        }
-        return activeElement;
-      }
-    });
-    scope.wrappers.ShadowRoot = ShadowRoot;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var getTreeScope = scope.getTreeScope;
-    var OriginalRange = window.Range;
-    var ShadowRoot = scope.wrappers.ShadowRoot;
-    function getHost(node) {
-      var root = getTreeScope(node).root;
-      if (root instanceof ShadowRoot) {
-        return root.host;
-      }
-      return null;
-    }
-    function hostNodeToShadowNode(refNode, offset) {
-      if (refNode.shadowRoot) {
-        offset = Math.min(refNode.childNodes.length - 1, offset);
-        var child = refNode.childNodes[offset];
-        if (child) {
-          var insertionPoint = scope.getDestinationInsertionPoints(child);
-          if (insertionPoint.length > 0) {
-            var parentNode = insertionPoint[0].parentNode;
-            if (parentNode.nodeType == Node.ELEMENT_NODE) {
-              refNode = parentNode;
-            }
-          }
-        }
-      }
-      return refNode;
-    }
-    function shadowNodeToHostNode(node) {
-      node = wrap(node);
-      return getHost(node) || node;
-    }
-    function Range(impl) {
-      setWrapper(impl, this);
-    }
-    Range.prototype = {
-      get startContainer() {
-        return shadowNodeToHostNode(unsafeUnwrap(this).startContainer);
-      },
-      get endContainer() {
-        return shadowNodeToHostNode(unsafeUnwrap(this).endContainer);
-      },
-      get commonAncestorContainer() {
-        return shadowNodeToHostNode(unsafeUnwrap(this).commonAncestorContainer);
-      },
-      setStart: function(refNode, offset) {
-        refNode = hostNodeToShadowNode(refNode, offset);
-        unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
-      },
-      setEnd: function(refNode, offset) {
-        refNode = hostNodeToShadowNode(refNode, offset);
-        unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
-      },
-      setStartBefore: function(refNode) {
-        unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
-      },
-      setStartAfter: function(refNode) {
-        unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
-      },
-      setEndBefore: function(refNode) {
-        unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
-      },
-      setEndAfter: function(refNode) {
-        unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
-      },
-      selectNode: function(refNode) {
-        unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
-      },
-      selectNodeContents: function(refNode) {
-        unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
-      },
-      compareBoundaryPoints: function(how, sourceRange) {
-        return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
-      },
-      extractContents: function() {
-        return wrap(unsafeUnwrap(this).extractContents());
-      },
-      cloneContents: function() {
-        return wrap(unsafeUnwrap(this).cloneContents());
-      },
-      insertNode: function(node) {
-        unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
-      },
-      surroundContents: function(newParent) {
-        unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
-      },
-      cloneRange: function() {
-        return wrap(unsafeUnwrap(this).cloneRange());
-      },
-      isPointInRange: function(node, offset) {
-        return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
-      },
-      comparePoint: function(node, offset) {
-        return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
-      },
-      intersectsNode: function(node) {
-        return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
-      },
-      toString: function() {
-        return unsafeUnwrap(this).toString();
-      }
-    };
-    if (OriginalRange.prototype.createContextualFragment) {
-      Range.prototype.createContextualFragment = function(html) {
-        return wrap(unsafeUnwrap(this).createContextualFragment(html));
-      };
-    }
-    registerWrapper(window.Range, Range, document.createRange());
-    scope.wrappers.Range = Range;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var Element = scope.wrappers.Element;
-    var HTMLContentElement = scope.wrappers.HTMLContentElement;
-    var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-    var Node = scope.wrappers.Node;
-    var ShadowRoot = scope.wrappers.ShadowRoot;
-    var assert = scope.assert;
-    var getTreeScope = scope.getTreeScope;
-    var mixin = scope.mixin;
-    var oneOf = scope.oneOf;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var ArraySplice = scope.ArraySplice;
-    function updateWrapperUpAndSideways(wrapper) {
-      wrapper.previousSibling_ = wrapper.previousSibling;
-      wrapper.nextSibling_ = wrapper.nextSibling;
-      wrapper.parentNode_ = wrapper.parentNode;
-    }
-    function updateWrapperDown(wrapper) {
-      wrapper.firstChild_ = wrapper.firstChild;
-      wrapper.lastChild_ = wrapper.lastChild;
-    }
-    function updateAllChildNodes(parentNodeWrapper) {
-      assert(parentNodeWrapper instanceof Node);
-      for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {
-        updateWrapperUpAndSideways(childWrapper);
-      }
-      updateWrapperDown(parentNodeWrapper);
-    }
-    function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
-      var parentNode = unwrap(parentNodeWrapper);
-      var newChild = unwrap(newChildWrapper);
-      var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
-      remove(newChildWrapper);
-      updateWrapperUpAndSideways(newChildWrapper);
-      if (!refChildWrapper) {
-        parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
-        if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
-        var lastChildWrapper = wrap(parentNode.lastChild);
-        if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
-      } else {
-        if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;
-        refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
-      }
-      scope.originalInsertBefore.call(parentNode, newChild, refChild);
-    }
-    function remove(nodeWrapper) {
-      var node = unwrap(nodeWrapper);
-      var parentNode = node.parentNode;
-      if (!parentNode) return;
-      var parentNodeWrapper = wrap(parentNode);
-      updateWrapperUpAndSideways(nodeWrapper);
-      if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
-      if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
-      if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;
-      if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;
-      scope.originalRemoveChild.call(parentNode, node);
-    }
-    var distributedNodesTable = new WeakMap();
-    var destinationInsertionPointsTable = new WeakMap();
-    var rendererForHostTable = new WeakMap();
-    function resetDistributedNodes(insertionPoint) {
-      distributedNodesTable.set(insertionPoint, []);
-    }
-    function getDistributedNodes(insertionPoint) {
-      var rv = distributedNodesTable.get(insertionPoint);
-      if (!rv) distributedNodesTable.set(insertionPoint, rv = []);
-      return rv;
-    }
-    function getChildNodesSnapshot(node) {
-      var result = [], i = 0;
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        result[i++] = child;
-      }
-      return result;
-    }
-    var request = oneOf(window, [ "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "setTimeout" ]);
-    var pendingDirtyRenderers = [];
-    var renderTimer;
-    function renderAllPending() {
-      for (var i = 0; i < pendingDirtyRenderers.length; i++) {
-        var renderer = pendingDirtyRenderers[i];
-        var parentRenderer = renderer.parentRenderer;
-        if (parentRenderer && parentRenderer.dirty) continue;
-        renderer.render();
-      }
-      pendingDirtyRenderers = [];
-    }
-    function handleRequestAnimationFrame() {
-      renderTimer = null;
-      renderAllPending();
-    }
-    function getRendererForHost(host) {
-      var renderer = rendererForHostTable.get(host);
-      if (!renderer) {
-        renderer = new ShadowRenderer(host);
-        rendererForHostTable.set(host, renderer);
-      }
-      return renderer;
-    }
-    function getShadowRootAncestor(node) {
-      var root = getTreeScope(node).root;
-      if (root instanceof ShadowRoot) return root;
-      return null;
-    }
-    function getRendererForShadowRoot(shadowRoot) {
-      return getRendererForHost(shadowRoot.host);
-    }
-    var spliceDiff = new ArraySplice();
-    spliceDiff.equals = function(renderNode, rawNode) {
-      return unwrap(renderNode.node) === rawNode;
-    };
-    function RenderNode(node) {
-      this.skip = false;
-      this.node = node;
-      this.childNodes = [];
-    }
-    RenderNode.prototype = {
-      append: function(node) {
-        var rv = new RenderNode(node);
-        this.childNodes.push(rv);
-        return rv;
-      },
-      sync: function(opt_added) {
-        if (this.skip) return;
-        var nodeWrapper = this.node;
-        var newChildren = this.childNodes;
-        var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
-        var added = opt_added || new WeakMap();
-        var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
-        var newIndex = 0, oldIndex = 0;
-        var lastIndex = 0;
-        for (var i = 0; i < splices.length; i++) {
-          var splice = splices[i];
-          for (;lastIndex < splice.index; lastIndex++) {
-            oldIndex++;
-            newChildren[newIndex++].sync(added);
-          }
-          var removedCount = splice.removed.length;
-          for (var j = 0; j < removedCount; j++) {
-            var wrapper = wrap(oldChildren[oldIndex++]);
-            if (!added.get(wrapper)) remove(wrapper);
-          }
-          var addedCount = splice.addedCount;
-          var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
-          for (var j = 0; j < addedCount; j++) {
-            var newChildRenderNode = newChildren[newIndex++];
-            var newChildWrapper = newChildRenderNode.node;
-            insertBefore(nodeWrapper, newChildWrapper, refNode);
-            added.set(newChildWrapper, true);
-            newChildRenderNode.sync(added);
-          }
-          lastIndex += addedCount;
-        }
-        for (var i = lastIndex; i < newChildren.length; i++) {
-          newChildren[i].sync(added);
-        }
-      }
-    };
-    function ShadowRenderer(host) {
-      this.host = host;
-      this.dirty = false;
-      this.invalidateAttributes();
-      this.associateNode(host);
-    }
-    ShadowRenderer.prototype = {
-      render: function(opt_renderNode) {
-        if (!this.dirty) return;
-        this.invalidateAttributes();
-        var host = this.host;
-        this.distribution(host);
-        var renderNode = opt_renderNode || new RenderNode(host);
-        this.buildRenderTree(renderNode, host);
-        var topMostRenderer = !opt_renderNode;
-        if (topMostRenderer) renderNode.sync();
-        this.dirty = false;
-      },
-      get parentRenderer() {
-        return getTreeScope(this.host).renderer;
-      },
-      invalidate: function() {
-        if (!this.dirty) {
-          this.dirty = true;
-          var parentRenderer = this.parentRenderer;
-          if (parentRenderer) parentRenderer.invalidate();
-          pendingDirtyRenderers.push(this);
-          if (renderTimer) return;
-          renderTimer = window[request](handleRequestAnimationFrame, 0);
-        }
-      },
-      distribution: function(root) {
-        this.resetAllSubtrees(root);
-        this.distributionResolution(root);
-      },
-      resetAll: function(node) {
-        if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);
-        this.resetAllSubtrees(node);
-      },
-      resetAllSubtrees: function(node) {
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          this.resetAll(child);
-        }
-        if (node.shadowRoot) this.resetAll(node.shadowRoot);
-        if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);
-      },
-      distributionResolution: function(node) {
-        if (isShadowHost(node)) {
-          var shadowHost = node;
-          var pool = poolPopulation(shadowHost);
-          var shadowTrees = getShadowTrees(shadowHost);
-          for (var i = 0; i < shadowTrees.length; i++) {
-            this.poolDistribution(shadowTrees[i], pool);
-          }
-          for (var i = shadowTrees.length - 1; i >= 0; i--) {
-            var shadowTree = shadowTrees[i];
-            var shadow = getShadowInsertionPoint(shadowTree);
-            if (shadow) {
-              var olderShadowRoot = shadowTree.olderShadowRoot;
-              if (olderShadowRoot) {
-                pool = poolPopulation(olderShadowRoot);
-              }
-              for (var j = 0; j < pool.length; j++) {
-                destributeNodeInto(pool[j], shadow);
-              }
-            }
-            this.distributionResolution(shadowTree);
-          }
-        }
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          this.distributionResolution(child);
-        }
-      },
-      poolDistribution: function(node, pool) {
-        if (node instanceof HTMLShadowElement) return;
-        if (node instanceof HTMLContentElement) {
-          var content = node;
-          this.updateDependentAttributes(content.getAttribute("select"));
-          var anyDistributed = false;
-          for (var i = 0; i < pool.length; i++) {
-            var node = pool[i];
-            if (!node) continue;
-            if (matches(node, content)) {
-              destributeNodeInto(node, content);
-              pool[i] = undefined;
-              anyDistributed = true;
-            }
-          }
-          if (!anyDistributed) {
-            for (var child = content.firstChild; child; child = child.nextSibling) {
-              destributeNodeInto(child, content);
-            }
-          }
-          return;
-        }
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          this.poolDistribution(child, pool);
-        }
-      },
-      buildRenderTree: function(renderNode, node) {
-        var children = this.compose(node);
-        for (var i = 0; i < children.length; i++) {
-          var child = children[i];
-          var childRenderNode = renderNode.append(child);
-          this.buildRenderTree(childRenderNode, child);
-        }
-        if (isShadowHost(node)) {
-          var renderer = getRendererForHost(node);
-          renderer.dirty = false;
-        }
-      },
-      compose: function(node) {
-        var children = [];
-        var p = node.shadowRoot || node;
-        for (var child = p.firstChild; child; child = child.nextSibling) {
-          if (isInsertionPoint(child)) {
-            this.associateNode(p);
-            var distributedNodes = getDistributedNodes(child);
-            for (var j = 0; j < distributedNodes.length; j++) {
-              var distributedNode = distributedNodes[j];
-              if (isFinalDestination(child, distributedNode)) children.push(distributedNode);
-            }
-          } else {
-            children.push(child);
-          }
-        }
-        return children;
-      },
-      invalidateAttributes: function() {
-        this.attributes = Object.create(null);
-      },
-      updateDependentAttributes: function(selector) {
-        if (!selector) return;
-        var attributes = this.attributes;
-        if (/\.\w+/.test(selector)) attributes["class"] = true;
-        if (/#\w+/.test(selector)) attributes["id"] = true;
-        selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
-          attributes[name] = true;
-        });
-      },
-      dependsOnAttribute: function(name) {
-        return this.attributes[name];
-      },
-      associateNode: function(node) {
-        unsafeUnwrap(node).polymerShadowRenderer_ = this;
-      }
-    };
-    function poolPopulation(node) {
-      var pool = [];
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        if (isInsertionPoint(child)) {
-          pool.push.apply(pool, getDistributedNodes(child));
-        } else {
-          pool.push(child);
-        }
-      }
-      return pool;
-    }
-    function getShadowInsertionPoint(node) {
-      if (node instanceof HTMLShadowElement) return node;
-      if (node instanceof HTMLContentElement) return null;
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        var res = getShadowInsertionPoint(child);
-        if (res) return res;
-      }
-      return null;
-    }
-    function destributeNodeInto(child, insertionPoint) {
-      getDistributedNodes(insertionPoint).push(child);
-      var points = destinationInsertionPointsTable.get(child);
-      if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);
-    }
-    function getDestinationInsertionPoints(node) {
-      return destinationInsertionPointsTable.get(node);
-    }
-    function resetDestinationInsertionPoints(node) {
-      destinationInsertionPointsTable.set(node, undefined);
-    }
-    var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
-    function matches(node, contentElement) {
-      var select = contentElement.getAttribute("select");
-      if (!select) return true;
-      select = select.trim();
-      if (!select) return true;
-      if (!(node instanceof Element)) return false;
-      if (!selectorStartCharRe.test(select)) return false;
-      try {
-        return node.matches(select);
-      } catch (ex) {
-        return false;
-      }
-    }
-    function isFinalDestination(insertionPoint, node) {
-      var points = getDestinationInsertionPoints(node);
-      return points && points[points.length - 1] === insertionPoint;
-    }
-    function isInsertionPoint(node) {
-      return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;
-    }
-    function isShadowHost(shadowHost) {
-      return shadowHost.shadowRoot;
-    }
-    function getShadowTrees(host) {
-      var trees = [];
-      for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
-        trees.push(tree);
-      }
-      return trees;
-    }
-    function render(host) {
-      new ShadowRenderer(host).render();
-    }
-    Node.prototype.invalidateShadowRenderer = function(force) {
-      var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
-      if (renderer) {
-        renderer.invalidate();
-        return true;
-      }
-      return false;
-    };
-    HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {
-      renderAllPending();
-      return getDistributedNodes(this);
-    };
-    Element.prototype.getDestinationInsertionPoints = function() {
-      renderAllPending();
-      return getDestinationInsertionPoints(this) || [];
-    };
-    HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {
-      this.invalidateShadowRenderer();
-      var shadowRoot = getShadowRootAncestor(this);
-      var renderer;
-      if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);
-      unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
-      if (renderer) renderer.invalidate();
-    };
-    scope.getRendererForHost = getRendererForHost;
-    scope.getShadowTrees = getShadowTrees;
-    scope.renderAllPending = renderAllPending;
-    scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
-    scope.visual = {
-      insertBefore: insertBefore,
-      remove: remove
-    };
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var HTMLElement = scope.wrappers.HTMLElement;
-    var assert = scope.assert;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var elementsWithFormProperty = [ "HTMLButtonElement", "HTMLFieldSetElement", "HTMLInputElement", "HTMLKeygenElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLObjectElement", "HTMLOutputElement", "HTMLTextAreaElement" ];
-    function createWrapperConstructor(name) {
-      if (!window[name]) return;
-      assert(!scope.wrappers[name]);
-      var GeneratedWrapper = function(node) {
-        HTMLElement.call(this, node);
-      };
-      GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
-      mixin(GeneratedWrapper.prototype, {
-        get form() {
-          return wrap(unwrap(this).form);
-        }
-      });
-      registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));
-      scope.wrappers[name] = GeneratedWrapper;
-    }
-    elementsWithFormProperty.forEach(createWrapperConstructor);
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var OriginalSelection = window.Selection;
-    function Selection(impl) {
-      setWrapper(impl, this);
-    }
-    Selection.prototype = {
-      get anchorNode() {
-        return wrap(unsafeUnwrap(this).anchorNode);
-      },
-      get focusNode() {
-        return wrap(unsafeUnwrap(this).focusNode);
-      },
-      addRange: function(range) {
-        unsafeUnwrap(this).addRange(unwrapIfNeeded(range));
-      },
-      collapse: function(node, index) {
-        unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
-      },
-      containsNode: function(node, allowPartial) {
-        return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);
-      },
-      getRangeAt: function(index) {
-        return wrap(unsafeUnwrap(this).getRangeAt(index));
-      },
-      removeRange: function(range) {
-        unsafeUnwrap(this).removeRange(unwrap(range));
-      },
-      selectAllChildren: function(node) {
-        unsafeUnwrap(this).selectAllChildren(node instanceof ShadowRoot ? unsafeUnwrap(node.host) : unwrapIfNeeded(node));
-      },
-      toString: function() {
-        return unsafeUnwrap(this).toString();
-      }
-    };
-    if (OriginalSelection.prototype.extend) {
-      Selection.prototype.extend = function(node, offset) {
-        unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
-      };
-    }
-    registerWrapper(window.Selection, Selection, window.getSelection());
-    scope.wrappers.Selection = Selection;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var OriginalTreeWalker = window.TreeWalker;
-    function TreeWalker(impl) {
-      setWrapper(impl, this);
-    }
-    TreeWalker.prototype = {
-      get root() {
-        return wrap(unsafeUnwrap(this).root);
-      },
-      get currentNode() {
-        return wrap(unsafeUnwrap(this).currentNode);
-      },
-      set currentNode(node) {
-        unsafeUnwrap(this).currentNode = unwrapIfNeeded(node);
-      },
-      get filter() {
-        return unsafeUnwrap(this).filter;
-      },
-      parentNode: function() {
-        return wrap(unsafeUnwrap(this).parentNode());
-      },
-      firstChild: function() {
-        return wrap(unsafeUnwrap(this).firstChild());
-      },
-      lastChild: function() {
-        return wrap(unsafeUnwrap(this).lastChild());
-      },
-      previousSibling: function() {
-        return wrap(unsafeUnwrap(this).previousSibling());
-      },
-      previousNode: function() {
-        return wrap(unsafeUnwrap(this).previousNode());
-      },
-      nextNode: function() {
-        return wrap(unsafeUnwrap(this).nextNode());
-      }
-    };
-    registerWrapper(OriginalTreeWalker, TreeWalker);
-    scope.wrappers.TreeWalker = TreeWalker;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var GetElementsByInterface = scope.GetElementsByInterface;
-    var Node = scope.wrappers.Node;
-    var ParentNodeInterface = scope.ParentNodeInterface;
-    var NonElementParentNodeInterface = scope.NonElementParentNodeInterface;
-    var Selection = scope.wrappers.Selection;
-    var SelectorsInterface = scope.SelectorsInterface;
-    var ShadowRoot = scope.wrappers.ShadowRoot;
-    var TreeScope = scope.TreeScope;
-    var cloneNode = scope.cloneNode;
-    var defineGetter = scope.defineGetter;
-    var defineWrapGetter = scope.defineWrapGetter;
-    var elementFromPoint = scope.elementFromPoint;
-    var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-    var matchesNames = scope.matchesNames;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var renderAllPending = scope.renderAllPending;
-    var rewrap = scope.rewrap;
-    var setWrapper = scope.setWrapper;
-    var unsafeUnwrap = scope.unsafeUnwrap;
-    var unwrap = scope.unwrap;
-    var wrap = scope.wrap;
-    var wrapEventTargetMethods = scope.wrapEventTargetMethods;
-    var wrapNodeList = scope.wrapNodeList;
-    var implementationTable = new WeakMap();
-    function Document(node) {
-      Node.call(this, node);
-      this.treeScope_ = new TreeScope(this, null);
-    }
-    Document.prototype = Object.create(Node.prototype);
-    defineWrapGetter(Document, "documentElement");
-    defineWrapGetter(Document, "body");
-    defineWrapGetter(Document, "head");
-    defineGetter(Document, "activeElement", function() {
-      var unwrappedActiveElement = unwrap(this).activeElement;
-      if (!unwrappedActiveElement || !unwrappedActiveElement.nodeType) return null;
-      var activeElement = wrap(unwrappedActiveElement);
-      while (!this.contains(activeElement)) {
-        while (activeElement.parentNode) {
-          activeElement = activeElement.parentNode;
-        }
-        if (activeElement.host) {
-          activeElement = activeElement.host;
-        } else {
-          return null;
-        }
-      }
-      return activeElement;
-    });
-    function wrapMethod(name) {
-      var original = document[name];
-      Document.prototype[name] = function() {
-        return wrap(original.apply(unsafeUnwrap(this), arguments));
-      };
-    }
-    [ "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode" ].forEach(wrapMethod);
-    var originalAdoptNode = document.adoptNode;
-    function adoptNodeNoRemove(node, doc) {
-      originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
-      adoptSubtree(node, doc);
-    }
-    function adoptSubtree(node, doc) {
-      if (node.shadowRoot) doc.adoptNode(node.shadowRoot);
-      if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        adoptSubtree(child, doc);
-      }
-    }
-    function adoptOlderShadowRoots(shadowRoot, doc) {
-      var oldShadowRoot = shadowRoot.olderShadowRoot;
-      if (oldShadowRoot) doc.adoptNode(oldShadowRoot);
-    }
-    var originalGetSelection = document.getSelection;
-    mixin(Document.prototype, {
-      adoptNode: function(node) {
-        if (node.parentNode) node.parentNode.removeChild(node);
-        adoptNodeNoRemove(node, this);
-        return node;
-      },
-      elementFromPoint: function(x, y) {
-        return elementFromPoint(this, this, x, y);
-      },
-      importNode: function(node, deep) {
-        return cloneNode(node, deep, unsafeUnwrap(this));
-      },
-      getSelection: function() {
-        renderAllPending();
-        return new Selection(originalGetSelection.call(unwrap(this)));
-      },
-      getElementsByName: function(name) {
-        return SelectorsInterface.querySelectorAll.call(this, "[name=" + JSON.stringify(String(name)) + "]");
-      }
-    });
-    var originalCreateTreeWalker = document.createTreeWalker;
-    var TreeWalkerWrapper = scope.wrappers.TreeWalker;
-    Document.prototype.createTreeWalker = function(root, whatToShow, filter, expandEntityReferences) {
-      var newFilter = null;
-      if (filter) {
-        if (filter.acceptNode && typeof filter.acceptNode === "function") {
-          newFilter = {
-            acceptNode: function(node) {
-              return filter.acceptNode(wrap(node));
-            }
-          };
-        } else if (typeof filter === "function") {
-          newFilter = function(node) {
-            return filter(wrap(node));
-          };
-        }
-      }
-      return new TreeWalkerWrapper(originalCreateTreeWalker.call(unwrap(this), unwrap(root), whatToShow, newFilter, expandEntityReferences));
-    };
-    if (document.registerElement) {
-      var originalRegisterElement = document.registerElement;
-      Document.prototype.registerElement = function(tagName, object) {
-        var prototype, extendsOption;
-        if (object !== undefined) {
-          prototype = object.prototype;
-          extendsOption = object.extends;
-        }
-        if (!prototype) prototype = Object.create(HTMLElement.prototype);
-        if (scope.nativePrototypeTable.get(prototype)) {
-          throw new Error("NotSupportedError");
-        }
-        var proto = Object.getPrototypeOf(prototype);
-        var nativePrototype;
-        var prototypes = [];
-        while (proto) {
-          nativePrototype = scope.nativePrototypeTable.get(proto);
-          if (nativePrototype) break;
-          prototypes.push(proto);
-          proto = Object.getPrototypeOf(proto);
-        }
-        if (!nativePrototype) {
-          throw new Error("NotSupportedError");
-        }
-        var newPrototype = Object.create(nativePrototype);
-        for (var i = prototypes.length - 1; i >= 0; i--) {
-          newPrototype = Object.create(newPrototype);
-        }
-        [ "createdCallback", "attachedCallback", "detachedCallback", "attributeChangedCallback" ].forEach(function(name) {
-          var f = prototype[name];
-          if (!f) return;
-          newPrototype[name] = function() {
-            if (!(wrap(this) instanceof CustomElementConstructor)) {
-              rewrap(this);
-            }
-            f.apply(wrap(this), arguments);
-          };
-        });
-        var p = {
-          prototype: newPrototype
-        };
-        if (extendsOption) p.extends = extendsOption;
-        function CustomElementConstructor(node) {
-          if (!node) {
-            if (extendsOption) {
-              return document.createElement(extendsOption, tagName);
-            } else {
-              return document.createElement(tagName);
-            }
-          }
-          setWrapper(node, this);
-        }
-        CustomElementConstructor.prototype = prototype;
-        CustomElementConstructor.prototype.constructor = CustomElementConstructor;
-        scope.constructorTable.set(newPrototype, CustomElementConstructor);
-        scope.nativePrototypeTable.set(prototype, newPrototype);
-        var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);
-        return CustomElementConstructor;
-      };
-      forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "registerElement" ]);
-    }
-    forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ "appendChild", "compareDocumentPosition", "contains", "getElementsByClassName", "getElementsByTagName", "getElementsByTagNameNS", "insertBefore", "querySelector", "querySelectorAll", "removeChild", "replaceChild" ]);
-    forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLHeadElement, window.HTMLHtmlElement ], matchesNames);
-    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "adoptNode", "importNode", "contains", "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "createTreeWalker", "elementFromPoint", "getElementById", "getElementsByName", "getSelection" ]);
-    mixin(Document.prototype, GetElementsByInterface);
-    mixin(Document.prototype, ParentNodeInterface);
-    mixin(Document.prototype, SelectorsInterface);
-    mixin(Document.prototype, NonElementParentNodeInterface);
-    mixin(Document.prototype, {
-      get implementation() {
-        var implementation = implementationTable.get(this);
-        if (implementation) return implementation;
-        implementation = new DOMImplementation(unwrap(this).implementation);
-        implementationTable.set(this, implementation);
-        return implementation;
-      },
-      get defaultView() {
-        return wrap(unwrap(this).defaultView);
-      }
-    });
-    registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(""));
-    if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);
-    wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);
-    function DOMImplementation(impl) {
-      setWrapper(impl, this);
-    }
-    var originalCreateDocument = document.implementation.createDocument;
-    DOMImplementation.prototype.createDocument = function() {
-      arguments[2] = unwrap(arguments[2]);
-      return wrap(originalCreateDocument.apply(unsafeUnwrap(this), arguments));
-    };
-    function wrapImplMethod(constructor, name) {
-      var original = document.implementation[name];
-      constructor.prototype[name] = function() {
-        return wrap(original.apply(unsafeUnwrap(this), arguments));
-      };
-    }
-    function forwardImplMethod(constructor, name) {
-      var original = document.implementation[name];
-      constructor.prototype[name] = function() {
-        return original.apply(unsafeUnwrap(this), arguments);
-      };
-    }
-    wrapImplMethod(DOMImplementation, "createDocumentType");
-    wrapImplMethod(DOMImplementation, "createHTMLDocument");
-    forwardImplMethod(DOMImplementation, "hasFeature");
-    registerWrapper(window.DOMImplementation, DOMImplementation);
-    forwardMethodsToWrapper([ window.DOMImplementation ], [ "createDocument", "createDocumentType", "createHTMLDocument", "hasFeature" ]);
-    scope.adoptNodeNoRemove = adoptNodeNoRemove;
-    scope.wrappers.DOMImplementation = DOMImplementation;
-    scope.wrappers.Document = Document;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var EventTarget = scope.wrappers.EventTarget;
-    var Selection = scope.wrappers.Selection;
-    var mixin = scope.mixin;
-    var registerWrapper = scope.registerWrapper;
-    var renderAllPending = scope.renderAllPending;
-    var unwrap = scope.unwrap;
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var wrap = scope.wrap;
-    var OriginalWindow = window.Window;
-    var originalGetComputedStyle = window.getComputedStyle;
-    var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
-    var originalGetSelection = window.getSelection;
-    function Window(impl) {
-      EventTarget.call(this, impl);
-    }
-    Window.prototype = Object.create(EventTarget.prototype);
-    OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
-      return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
-    };
-    if (originalGetDefaultComputedStyle) {
-      OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
-        return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);
-      };
-    }
-    OriginalWindow.prototype.getSelection = function() {
-      return wrap(this || window).getSelection();
-    };
-    delete window.getComputedStyle;
-    delete window.getDefaultComputedStyle;
-    delete window.getSelection;
-    [ "addEventListener", "removeEventListener", "dispatchEvent" ].forEach(function(name) {
-      OriginalWindow.prototype[name] = function() {
-        var w = wrap(this || window);
-        return w[name].apply(w, arguments);
-      };
-      delete window[name];
-    });
-    mixin(Window.prototype, {
-      getComputedStyle: function(el, pseudo) {
-        renderAllPending();
-        return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
-      },
-      getSelection: function() {
-        renderAllPending();
-        return new Selection(originalGetSelection.call(unwrap(this)));
-      },
-      get document() {
-        return wrap(unwrap(this).document);
-      }
-    });
-    if (originalGetDefaultComputedStyle) {
-      Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
-        renderAllPending();
-        return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
-      };
-    }
-    registerWrapper(OriginalWindow, Window, window);
-    scope.wrappers.Window = Window;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var unwrap = scope.unwrap;
-    var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
-    var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;
-    if (OriginalDataTransferSetDragImage) {
-      OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
-        OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
-      };
-    }
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var registerWrapper = scope.registerWrapper;
-    var setWrapper = scope.setWrapper;
-    var unwrap = scope.unwrap;
-    var OriginalFormData = window.FormData;
-    if (!OriginalFormData) return;
-    function FormData(formElement) {
-      var impl;
-      if (formElement instanceof OriginalFormData) {
-        impl = formElement;
-      } else {
-        impl = new OriginalFormData(formElement && unwrap(formElement));
-      }
-      setWrapper(impl, this);
-    }
-    registerWrapper(OriginalFormData, FormData, new OriginalFormData());
-    scope.wrappers.FormData = FormData;
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var unwrapIfNeeded = scope.unwrapIfNeeded;
-    var originalSend = XMLHttpRequest.prototype.send;
-    XMLHttpRequest.prototype.send = function(obj) {
-      return originalSend.call(this, unwrapIfNeeded(obj));
-    };
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    "use strict";
-    var isWrapperFor = scope.isWrapperFor;
-    var elements = {
-      a: "HTMLAnchorElement",
-      area: "HTMLAreaElement",
-      audio: "HTMLAudioElement",
-      base: "HTMLBaseElement",
-      body: "HTMLBodyElement",
-      br: "HTMLBRElement",
-      button: "HTMLButtonElement",
-      canvas: "HTMLCanvasElement",
-      caption: "HTMLTableCaptionElement",
-      col: "HTMLTableColElement",
-      content: "HTMLContentElement",
-      data: "HTMLDataElement",
-      datalist: "HTMLDataListElement",
-      del: "HTMLModElement",
-      dir: "HTMLDirectoryElement",
-      div: "HTMLDivElement",
-      dl: "HTMLDListElement",
-      embed: "HTMLEmbedElement",
-      fieldset: "HTMLFieldSetElement",
-      font: "HTMLFontElement",
-      form: "HTMLFormElement",
-      frame: "HTMLFrameElement",
-      frameset: "HTMLFrameSetElement",
-      h1: "HTMLHeadingElement",
-      head: "HTMLHeadElement",
-      hr: "HTMLHRElement",
-      html: "HTMLHtmlElement",
-      iframe: "HTMLIFrameElement",
-      img: "HTMLImageElement",
-      input: "HTMLInputElement",
-      keygen: "HTMLKeygenElement",
-      label: "HTMLLabelElement",
-      legend: "HTMLLegendElement",
-      li: "HTMLLIElement",
-      link: "HTMLLinkElement",
-      map: "HTMLMapElement",
-      marquee: "HTMLMarqueeElement",
-      menu: "HTMLMenuElement",
-      menuitem: "HTMLMenuItemElement",
-      meta: "HTMLMetaElement",
-      meter: "HTMLMeterElement",
-      object: "HTMLObjectElement",
-      ol: "HTMLOListElement",
-      optgroup: "HTMLOptGroupElement",
-      option: "HTMLOptionElement",
-      output: "HTMLOutputElement",
-      p: "HTMLParagraphElement",
-      param: "HTMLParamElement",
-      pre: "HTMLPreElement",
-      progress: "HTMLProgressElement",
-      q: "HTMLQuoteElement",
-      script: "HTMLScriptElement",
-      select: "HTMLSelectElement",
-      shadow: "HTMLShadowElement",
-      source: "HTMLSourceElement",
-      span: "HTMLSpanElement",
-      style: "HTMLStyleElement",
-      table: "HTMLTableElement",
-      tbody: "HTMLTableSectionElement",
-      template: "HTMLTemplateElement",
-      textarea: "HTMLTextAreaElement",
-      thead: "HTMLTableSectionElement",
-      time: "HTMLTimeElement",
-      title: "HTMLTitleElement",
-      tr: "HTMLTableRowElement",
-      track: "HTMLTrackElement",
-      ul: "HTMLUListElement",
-      video: "HTMLVideoElement"
-    };
-    function overrideConstructor(tagName) {
-      var nativeConstructorName = elements[tagName];
-      var nativeConstructor = window[nativeConstructorName];
-      if (!nativeConstructor) return;
-      var element = document.createElement(tagName);
-      var wrapperConstructor = element.constructor;
-      window[nativeConstructorName] = wrapperConstructor;
-    }
-    Object.keys(elements).forEach(overrideConstructor);
-    Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
-      window[name] = scope.wrappers[name];
-    });
-  })(window.ShadowDOMPolyfill);
-  (function(scope) {
-    var ShadowCSS = {
-      strictStyling: false,
-      registry: {},
-      shimStyling: function(root, name, extendsName) {
-        var scopeStyles = this.prepareRoot(root, name, extendsName);
-        var typeExtension = this.isTypeExtension(extendsName);
-        var scopeSelector = this.makeScopeSelector(name, typeExtension);
-        var cssText = stylesToCssText(scopeStyles, true);
-        cssText = this.scopeCssText(cssText, scopeSelector);
-        if (root) {
-          root.shimmedStyle = cssText;
-        }
-        this.addCssToDocument(cssText, name);
-      },
-      shimStyle: function(style, selector) {
-        return this.shimCssText(style.textContent, selector);
-      },
-      shimCssText: function(cssText, selector) {
-        cssText = this.insertDirectives(cssText);
-        return this.scopeCssText(cssText, selector);
-      },
-      makeScopeSelector: function(name, typeExtension) {
-        if (name) {
-          return typeExtension ? "[is=" + name + "]" : name;
-        }
-        return "";
-      },
-      isTypeExtension: function(extendsName) {
-        return extendsName && extendsName.indexOf("-") < 0;
-      },
-      prepareRoot: function(root, name, extendsName) {
-        var def = this.registerRoot(root, name, extendsName);
-        this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
-        this.removeStyles(root, def.rootStyles);
-        if (this.strictStyling) {
-          this.applyScopeToContent(root, name);
-        }
-        return def.scopeStyles;
-      },
-      removeStyles: function(root, styles) {
-        for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
-          s.parentNode.removeChild(s);
-        }
-      },
-      registerRoot: function(root, name, extendsName) {
-        var def = this.registry[name] = {
-          root: root,
-          name: name,
-          extendsName: extendsName
-        };
-        var styles = this.findStyles(root);
-        def.rootStyles = styles;
-        def.scopeStyles = def.rootStyles;
-        var extendee = this.registry[def.extendsName];
-        if (extendee) {
-          def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
-        }
-        return def;
-      },
-      findStyles: function(root) {
-        if (!root) {
-          return [];
-        }
-        var styles = root.querySelectorAll("style");
-        return Array.prototype.filter.call(styles, function(s) {
-          return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
-        });
-      },
-      applyScopeToContent: function(root, name) {
-        if (root) {
-          Array.prototype.forEach.call(root.querySelectorAll("*"), function(node) {
-            node.setAttribute(name, "");
-          });
-          Array.prototype.forEach.call(root.querySelectorAll("template"), function(template) {
-            this.applyScopeToContent(template.content, name);
-          }, this);
-        }
-      },
-      insertDirectives: function(cssText) {
-        cssText = this.insertPolyfillDirectivesInCssText(cssText);
-        return this.insertPolyfillRulesInCssText(cssText);
-      },
-      insertPolyfillDirectivesInCssText: function(cssText) {
-        cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
-          return p1.slice(0, -2) + "{";
-        });
-        return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
-          return p1 + " {";
-        });
-      },
-      insertPolyfillRulesInCssText: function(cssText) {
-        cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
-          return p1.slice(0, -1);
-        });
-        return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
-          var rule = match.replace(p1, "").replace(p2, "");
-          return p3 + rule;
-        });
-      },
-      scopeCssText: function(cssText, scopeSelector) {
-        var unscoped = this.extractUnscopedRulesFromCssText(cssText);
-        cssText = this.insertPolyfillHostInCssText(cssText);
-        cssText = this.convertColonHost(cssText);
-        cssText = this.convertColonHostContext(cssText);
-        cssText = this.convertShadowDOMSelectors(cssText);
-        if (scopeSelector) {
-          var self = this, cssText;
-          withCssRules(cssText, function(rules) {
-            cssText = self.scopeRules(rules, scopeSelector);
-          });
-        }
-        cssText = cssText + "\n" + unscoped;
-        return cssText.trim();
-      },
-      extractUnscopedRulesFromCssText: function(cssText) {
-        var r = "", m;
-        while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
-          r += m[1].slice(0, -1) + "\n\n";
-        }
-        while (m = cssContentUnscopedRuleRe.exec(cssText)) {
-          r += m[0].replace(m[2], "").replace(m[1], m[3]) + "\n\n";
-        }
-        return r;
-      },
-      convertColonHost: function(cssText) {
-        return this.convertColonRule(cssText, cssColonHostRe, this.colonHostPartReplacer);
-      },
-      convertColonHostContext: function(cssText) {
-        return this.convertColonRule(cssText, cssColonHostContextRe, this.colonHostContextPartReplacer);
-      },
-      convertColonRule: function(cssText, regExp, partReplacer) {
-        return cssText.replace(regExp, function(m, p1, p2, p3) {
-          p1 = polyfillHostNoCombinator;
-          if (p2) {
-            var parts = p2.split(","), r = [];
-            for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) {
-              p = p.trim();
-              r.push(partReplacer(p1, p, p3));
-            }
-            return r.join(",");
-          } else {
-            return p1 + p3;
-          }
-        });
-      },
-      colonHostContextPartReplacer: function(host, part, suffix) {
-        if (part.match(polyfillHost)) {
-          return this.colonHostPartReplacer(host, part, suffix);
-        } else {
-          return host + part + suffix + ", " + part + " " + host + suffix;
-        }
-      },
-      colonHostPartReplacer: function(host, part, suffix) {
-        return host + part.replace(polyfillHost, "") + suffix;
-      },
-      convertShadowDOMSelectors: function(cssText) {
-        for (var i = 0; i < shadowDOMSelectorsRe.length; i++) {
-          cssText = cssText.replace(shadowDOMSelectorsRe[i], " ");
-        }
-        return cssText;
-      },
-      scopeRules: function(cssRules, scopeSelector) {
-        var cssText = "";
-        if (cssRules) {
-          Array.prototype.forEach.call(cssRules, function(rule) {
-            if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {
-              cssText += this.scopeSelector(rule.selectorText, scopeSelector, this.strictStyling) + " {\n\t";
-              cssText += this.propertiesFromRule(rule) + "\n}\n\n";
-            } else if (rule.type === CSSRule.MEDIA_RULE) {
-              cssText += "@media " + rule.media.mediaText + " {\n";
-              cssText += this.scopeRules(rule.cssRules, scopeSelector);
-              cssText += "\n}\n\n";
-            } else {
-              try {
-                if (rule.cssText) {
-                  cssText += rule.cssText + "\n\n";
-                }
-              } catch (x) {
-                if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {
-                  cssText += this.ieSafeCssTextFromKeyFrameRule(rule);
-                }
-              }
-            }
-          }, this);
-        }
-        return cssText;
-      },
-      ieSafeCssTextFromKeyFrameRule: function(rule) {
-        var cssText = "@keyframes " + rule.name + " {";
-        Array.prototype.forEach.call(rule.cssRules, function(rule) {
-          cssText += " " + rule.keyText + " {" + rule.style.cssText + "}";
-        });
-        cssText += " }";
-        return cssText;
-      },
-      scopeSelector: function(selector, scopeSelector, strict) {
-        var r = [], parts = selector.split(",");
-        parts.forEach(function(p) {
-          p = p.trim();
-          if (this.selectorNeedsScoping(p, scopeSelector)) {
-            p = strict && !p.match(polyfillHostNoCombinator) ? this.applyStrictSelectorScope(p, scopeSelector) : this.applySelectorScope(p, scopeSelector);
-          }
-          r.push(p);
-        }, this);
-        return r.join(", ");
-      },
-      selectorNeedsScoping: function(selector, scopeSelector) {
-        if (Array.isArray(scopeSelector)) {
-          return true;
-        }
-        var re = this.makeScopeMatcher(scopeSelector);
-        return !selector.match(re);
-      },
-      makeScopeMatcher: function(scopeSelector) {
-        scopeSelector = scopeSelector.replace(/\[/g, "\\[").replace(/\]/g, "\\]");
-        return new RegExp("^(" + scopeSelector + ")" + selectorReSuffix, "m");
-      },
-      applySelectorScope: function(selector, selectorScope) {
-        return Array.isArray(selectorScope) ? this.applySelectorScopeList(selector, selectorScope) : this.applySimpleSelectorScope(selector, selectorScope);
-      },
-      applySelectorScopeList: function(selector, scopeSelectorList) {
-        var r = [];
-        for (var i = 0, s; s = scopeSelectorList[i]; i++) {
-          r.push(this.applySimpleSelectorScope(selector, s));
-        }
-        return r.join(", ");
-      },
-      applySimpleSelectorScope: function(selector, scopeSelector) {
-        if (selector.match(polyfillHostRe)) {
-          selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
-          return selector.replace(polyfillHostRe, scopeSelector + " ");
-        } else {
-          return scopeSelector + " " + selector;
-        }
-      },
-      applyStrictSelectorScope: function(selector, scopeSelector) {
-        scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, "$1");
-        var splits = [ " ", ">", "+", "~" ], scoped = selector, attrName = "[" + scopeSelector + "]";
-        splits.forEach(function(sep) {
-          var parts = scoped.split(sep);
-          scoped = parts.map(function(p) {
-            var t = p.trim().replace(polyfillHostRe, "");
-            if (t && splits.indexOf(t) < 0 && t.indexOf(attrName) < 0) {
-              p = t.replace(/([^:]*)(:*)(.*)/, "$1" + attrName + "$2$3");
-            }
-            return p;
-          }).join(sep);
-        });
-        return scoped;
-      },
-      insertPolyfillHostInCssText: function(selector) {
-        return selector.replace(colonHostContextRe, polyfillHostContext).replace(colonHostRe, polyfillHost);
-      },
-      propertiesFromRule: function(rule) {
-        var cssText = rule.style.cssText;
-        if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
-          cssText = cssText.replace(/content:[^;]*;/g, "content: '" + rule.style.content + "';");
-        }
-        var style = rule.style;
-        for (var i in style) {
-          if (style[i] === "initial") {
-            cssText += i + ": initial; ";
-          }
-        }
-        return cssText;
-      },
-      replaceTextInStyles: function(styles, action) {
-        if (styles && action) {
-          if (!(styles instanceof Array)) {
-            styles = [ styles ];
-          }
-          Array.prototype.forEach.call(styles, function(s) {
-            s.textContent = action.call(this, s.textContent);
-          }, this);
-        }
-      },
-      addCssToDocument: function(cssText, name) {
-        if (cssText.match("@import")) {
-          addOwnSheet(cssText, name);
-        } else {
-          addCssToDocument(cssText);
-        }
-      }
-    };
-    var selectorRe = /([^{]*)({[\s\S]*?})/gim, cssCommentRe = /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim, cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim, cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\s{,(]*)/gim, cssPartRe = /::part\(([^)]*)\)/gim, polyfillHost = "-shadowcsshost", polyfillHostContext = "-shadowcsscontext", parenSuffix = ")(?:\\((" + "(?:\\([^)(]*\\)|[^)(]*)+?" + ")\\))?([^,{]*)";
-    var cssColonHostRe = new RegExp("(" + polyfillHost + parenSuffix, "gim"), cssColonHostContextRe = new RegExp("(" + polyfillHostContext + parenSuffix, "gim"), selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$", colonHostRe = /\:host/gim, colonHostContextRe = /\:host-context/gim, polyfillHostNoCombinator = polyfillHost + "-no-combinator", polyfillHostRe = new RegExp(polyfillHost, "gim"), polyfillHostContextRe = new RegExp(polyfillHostContext, "gim"), shadowDOMSelectorsRe = [ />>>/g, /::shadow/g, /::content/g, /\/deep\//g, /\/shadow\//g, /\/shadow-deep\//g, /\^\^/g, /\^(?!=)/g ];
-    function stylesToCssText(styles, preserveComments) {
-      var cssText = "";
-      Array.prototype.forEach.call(styles, function(s) {
-        cssText += s.textContent + "\n\n";
-      });
-      if (!preserveComments) {
-        cssText = cssText.replace(cssCommentRe, "");
-      }
-      return cssText;
-    }
-    function cssTextToStyle(cssText) {
-      var style = document.createElement("style");
-      style.textContent = cssText;
-      return style;
-    }
-    function cssToRules(cssText) {
-      var style = cssTextToStyle(cssText);
-      document.head.appendChild(style);
-      var rules = [];
-      if (style.sheet) {
-        try {
-          rules = style.sheet.cssRules;
-        } catch (e) {}
-      } else {
-        console.warn("sheet not found", style);
-      }
-      style.parentNode.removeChild(style);
-      return rules;
-    }
-    var frame = document.createElement("iframe");
-    frame.style.display = "none";
-    function initFrame() {
-      frame.initialized = true;
-      document.body.appendChild(frame);
-      var doc = frame.contentDocument;
-      var base = doc.createElement("base");
-      base.href = document.baseURI;
-      doc.head.appendChild(base);
-    }
-    function inFrame(fn) {
-      if (!frame.initialized) {
-        initFrame();
-      }
-      document.body.appendChild(frame);
-      fn(frame.contentDocument);
-      document.body.removeChild(frame);
-    }
-    var isChrome = navigator.userAgent.match("Chrome");
-    function withCssRules(cssText, callback) {
-      if (!callback) {
-        return;
-      }
-      var rules;
-      if (cssText.match("@import") && isChrome) {
-        var style = cssTextToStyle(cssText);
-        inFrame(function(doc) {
-          doc.head.appendChild(style.impl);
-          rules = Array.prototype.slice.call(style.sheet.cssRules, 0);
-          callback(rules);
-        });
-      } else {
-        rules = cssToRules(cssText);
-        callback(rules);
-      }
-    }
-    function rulesToCss(cssRules) {
-      for (var i = 0, css = []; i < cssRules.length; i++) {
-        css.push(cssRules[i].cssText);
-      }
-      return css.join("\n\n");
-    }
-    function addCssToDocument(cssText) {
-      if (cssText) {
-        getSheet().appendChild(document.createTextNode(cssText));
-      }
-    }
-    function addOwnSheet(cssText, name) {
-      var style = cssTextToStyle(cssText);
-      style.setAttribute(name, "");
-      style.setAttribute(SHIMMED_ATTRIBUTE, "");
-      document.head.appendChild(style);
-    }
-    var SHIM_ATTRIBUTE = "shim-shadowdom";
-    var SHIMMED_ATTRIBUTE = "shim-shadowdom-css";
-    var NO_SHIM_ATTRIBUTE = "no-shim";
-    var sheet;
-    function getSheet() {
-      if (!sheet) {
-        sheet = document.createElement("style");
-        sheet.setAttribute(SHIMMED_ATTRIBUTE, "");
-        sheet[SHIMMED_ATTRIBUTE] = true;
-      }
-      return sheet;
-    }
-    if (window.ShadowDOMPolyfill) {
-      addCssToDocument("style { display: none !important; }\n");
-      var doc = ShadowDOMPolyfill.wrap(document);
-      var head = doc.querySelector("head");
-      head.insertBefore(getSheet(), head.childNodes[0]);
-      document.addEventListener("DOMContentLoaded", function() {
-        var urlResolver = scope.urlResolver;
-        if (window.HTMLImports && !HTMLImports.useNative) {
-          var SHIM_SHEET_SELECTOR = "link[rel=stylesheet]" + "[" + SHIM_ATTRIBUTE + "]";
-          var SHIM_STYLE_SELECTOR = "style[" + SHIM_ATTRIBUTE + "]";
-          HTMLImports.importer.documentPreloadSelectors += "," + SHIM_SHEET_SELECTOR;
-          HTMLImports.importer.importsPreloadSelectors += "," + SHIM_SHEET_SELECTOR;
-          HTMLImports.parser.documentSelectors = [ HTMLImports.parser.documentSelectors, SHIM_SHEET_SELECTOR, SHIM_STYLE_SELECTOR ].join(",");
-          var originalParseGeneric = HTMLImports.parser.parseGeneric;
-          HTMLImports.parser.parseGeneric = function(elt) {
-            if (elt[SHIMMED_ATTRIBUTE]) {
-              return;
-            }
-            var style = elt.__importElement || elt;
-            if (!style.hasAttribute(SHIM_ATTRIBUTE)) {
-              originalParseGeneric.call(this, elt);
-              return;
-            }
-            if (elt.__resource) {
-              style = elt.ownerDocument.createElement("style");
-              style.textContent = elt.__resource;
-            }
-            HTMLImports.path.resolveUrlsInStyle(style, elt.href);
-            style.textContent = ShadowCSS.shimStyle(style);
-            style.removeAttribute(SHIM_ATTRIBUTE, "");
-            style.setAttribute(SHIMMED_ATTRIBUTE, "");
-            style[SHIMMED_ATTRIBUTE] = true;
-            if (style.parentNode !== head) {
-              if (elt.parentNode === head) {
-                head.replaceChild(style, elt);
-              } else {
-                this.addElementToDocument(style);
-              }
-            }
-            style.__importParsed = true;
-            this.markParsingComplete(elt);
-            this.parseNext();
-          };
-          var hasResource = HTMLImports.parser.hasResource;
-          HTMLImports.parser.hasResource = function(node) {
-            if (node.localName === "link" && node.rel === "stylesheet" && node.hasAttribute(SHIM_ATTRIBUTE)) {
-              return node.__resource;
-            } else {
-              return hasResource.call(this, node);
-            }
-          };
-        }
-      });
-    }
-    scope.ShadowCSS = ShadowCSS;
-  })(window.WebComponents);
-}
-
-(function(scope) {
-  if (window.ShadowDOMPolyfill) {
-    window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
-    window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
-  } else {
-    window.wrap = window.unwrap = function(n) {
-      return n;
-    };
-  }
-})(window.WebComponents);
-
-(function(scope) {
-  "use strict";
-  var hasWorkingUrl = false;
-  if (!scope.forceJURL) {
-    try {
-      var u = new URL("b", "http://a");
-      u.pathname = "c%20d";
-      hasWorkingUrl = u.href === "http://a/c%20d";
-    } catch (e) {}
-  }
-  if (hasWorkingUrl) return;
-  var relative = Object.create(null);
-  relative["ftp"] = 21;
-  relative["file"] = 0;
-  relative["gopher"] = 70;
-  relative["http"] = 80;
-  relative["https"] = 443;
-  relative["ws"] = 80;
-  relative["wss"] = 443;
-  var relativePathDotMapping = Object.create(null);
-  relativePathDotMapping["%2e"] = ".";
-  relativePathDotMapping[".%2e"] = "..";
-  relativePathDotMapping["%2e."] = "..";
-  relativePathDotMapping["%2e%2e"] = "..";
-  function isRelativeScheme(scheme) {
-    return relative[scheme] !== undefined;
-  }
-  function invalid() {
-    clear.call(this);
-    this._isInvalid = true;
-  }
-  function IDNAToASCII(h) {
-    if ("" == h) {
-      invalid.call(this);
-    }
-    return h.toLowerCase();
-  }
-  function percentEscape(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 63, 96 ].indexOf(unicode) == -1) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-  function percentEscapeQuery(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 32 && unicode < 127 && [ 34, 35, 60, 62, 96 ].indexOf(unicode) == -1) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-  var EOF = undefined, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
-  function parse(input, stateOverride, base) {
-    function err(message) {
-      errors.push(message);
-    }
-    var state = stateOverride || "scheme start", cursor = 0, buffer = "", seenAt = false, seenBracket = false, errors = [];
-    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
-      var c = input[cursor];
-      switch (state) {
-       case "scheme start":
-        if (c && ALPHA.test(c)) {
-          buffer += c.toLowerCase();
-          state = "scheme";
-        } else if (!stateOverride) {
-          buffer = "";
-          state = "no scheme";
-          continue;
-        } else {
-          err("Invalid scheme.");
-          break loop;
-        }
-        break;
-
-       case "scheme":
-        if (c && ALPHANUMERIC.test(c)) {
-          buffer += c.toLowerCase();
-        } else if (":" == c) {
-          this._scheme = buffer;
-          buffer = "";
-          if (stateOverride) {
-            break loop;
-          }
-          if (isRelativeScheme(this._scheme)) {
-            this._isRelative = true;
-          }
-          if ("file" == this._scheme) {
-            state = "relative";
-          } else if (this._isRelative && base && base._scheme == this._scheme) {
-            state = "relative or authority";
-          } else if (this._isRelative) {
-            state = "authority first slash";
-          } else {
-            state = "scheme data";
-          }
-        } else if (!stateOverride) {
-          buffer = "";
-          cursor = 0;
-          state = "no scheme";
-          continue;
-        } else if (EOF == c) {
-          break loop;
-        } else {
-          err("Code point not allowed in scheme: " + c);
-          break loop;
-        }
-        break;
-
-       case "scheme data":
-        if ("?" == c) {
-          this._query = "?";
-          state = "query";
-        } else if ("#" == c) {
-          this._fragment = "#";
-          state = "fragment";
-        } else {
-          if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
-            this._schemeData += percentEscape(c);
-          }
-        }
-        break;
-
-       case "no scheme":
-        if (!base || !isRelativeScheme(base._scheme)) {
-          err("Missing scheme.");
-          invalid.call(this);
-        } else {
-          state = "relative";
-          continue;
-        }
-        break;
-
-       case "relative or authority":
-        if ("/" == c && "/" == input[cursor + 1]) {
-          state = "authority ignore slashes";
-        } else {
-          err("Expected /, got: " + c);
-          state = "relative";
-          continue;
-        }
-        break;
-
-       case "relative":
-        this._isRelative = true;
-        if ("file" != this._scheme) this._scheme = base._scheme;
-        if (EOF == c) {
-          this._host = base._host;
-          this._port = base._port;
-          this._path = base._path.slice();
-          this._query = base._query;
-          this._username = base._username;
-          this._password = base._password;
-          break loop;
-        } else if ("/" == c || "\\" == c) {
-          if ("\\" == c) err("\\ is an invalid code point.");
-          state = "relative slash";
-        } else if ("?" == c) {
-          this._host = base._host;
-          this._port = base._port;
-          this._path = base._path.slice();
-          this._query = "?";
-          this._username = base._username;
-          this._password = base._password;
-          state = "query";
-        } else if ("#" == c) {
-          this._host = base._host;
-          this._port = base._port;
-          this._path = base._path.slice();
-          this._query = base._query;
-          this._fragment = "#";
-          this._username = base._username;
-          this._password = base._password;
-          state = "fragment";
-        } else {
-          var nextC = input[cursor + 1];
-          var nextNextC = input[cursor + 2];
-          if ("file" != this._scheme || !ALPHA.test(c) || nextC != ":" && nextC != "|" || EOF != nextNextC && "/" != nextNextC && "\\" != nextNextC && "?" != nextNextC && "#" != nextNextC) {
-            this._host = base._host;
-            this._port = base._port;
-            this._username = base._username;
-            this._password = base._password;
-            this._path = base._path.slice();
-            this._path.pop();
-          }
-          state = "relative path";
-          continue;
-        }
-        break;
-
-       case "relative slash":
-        if ("/" == c || "\\" == c) {
-          if ("\\" == c) {
-            err("\\ is an invalid code point.");
-          }
-          if ("file" == this._scheme) {
-            state = "file host";
-          } else {
-            state = "authority ignore slashes";
-          }
-        } else {
-          if ("file" != this._scheme) {
-            this._host = base._host;
-            this._port = base._port;
-            this._username = base._username;
-            this._password = base._password;
-          }
-          state = "relative path";
-          continue;
-        }
-        break;
-
-       case "authority first slash":
-        if ("/" == c) {
-          state = "authority second slash";
-        } else {
-          err("Expected '/', got: " + c);
-          state = "authority ignore slashes";
-          continue;
-        }
-        break;
-
-       case "authority second slash":
-        state = "authority ignore slashes";
-        if ("/" != c) {
-          err("Expected '/', got: " + c);
-          continue;
-        }
-        break;
-
-       case "authority ignore slashes":
-        if ("/" != c && "\\" != c) {
-          state = "authority";
-          continue;
-        } else {
-          err("Expected authority, got: " + c);
-        }
-        break;
-
-       case "authority":
-        if ("@" == c) {
-          if (seenAt) {
-            err("@ already seen.");
-            buffer += "%40";
-          }
-          seenAt = true;
-          for (var i = 0; i < buffer.length; i++) {
-            var cp = buffer[i];
-            if ("\t" == cp || "\n" == cp || "\r" == cp) {
-              err("Invalid whitespace in authority.");
-              continue;
-            }
-            if (":" == cp && null === this._password) {
-              this._password = "";
-              continue;
-            }
-            var tempC = percentEscape(cp);
-            null !== this._password ? this._password += tempC : this._username += tempC;
-          }
-          buffer = "";
-        } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) {
-          cursor -= buffer.length;
-          buffer = "";
-          state = "host";
-          continue;
-        } else {
-          buffer += c;
-        }
-        break;
-
-       case "file host":
-        if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) {
-          if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ":" || buffer[1] == "|")) {
-            state = "relative path";
-          } else if (buffer.length == 0) {
-            state = "relative path start";
-          } else {
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = "";
-            state = "relative path start";
-          }
-          continue;
-        } else if ("\t" == c || "\n" == c || "\r" == c) {
-          err("Invalid whitespace in file host.");
-        } else {
-          buffer += c;
-        }
-        break;
-
-       case "host":
-       case "hostname":
-        if (":" == c && !seenBracket) {
-          this._host = IDNAToASCII.call(this, buffer);
-          buffer = "";
-          state = "port";
-          if ("hostname" == stateOverride) {
-            break loop;
-          }
-        } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c) {
-          this._host = IDNAToASCII.call(this, buffer);
-          buffer = "";
-          state = "relative path start";
-          if (stateOverride) {
-            break loop;
-          }
-          continue;
-        } else if ("\t" != c && "\n" != c && "\r" != c) {
-          if ("[" == c) {
-            seenBracket = true;
-          } else if ("]" == c) {
-            seenBracket = false;
-          }
-          buffer += c;
-        } else {
-          err("Invalid code point in host/hostname: " + c);
-        }
-        break;
-
-       case "port":
-        if (/[0-9]/.test(c)) {
-          buffer += c;
-        } else if (EOF == c || "/" == c || "\\" == c || "?" == c || "#" == c || stateOverride) {
-          if ("" != buffer) {
-            var temp = parseInt(buffer, 10);
-            if (temp != relative[this._scheme]) {
-              this._port = temp + "";
-            }
-            buffer = "";
-          }
-          if (stateOverride) {
-            break loop;
-          }
-          state = "relative path start";
-          continue;
-        } else if ("\t" == c || "\n" == c || "\r" == c) {
-          err("Invalid code point in port: " + c);
-        } else {
-          invalid.call(this);
-        }
-        break;
-
-       case "relative path start":
-        if ("\\" == c) err("'\\' not allowed in path.");
-        state = "relative path";
-        if ("/" != c && "\\" != c) {
-          continue;
-        }
-        break;
-
-       case "relative path":
-        if (EOF == c || "/" == c || "\\" == c || !stateOverride && ("?" == c || "#" == c)) {
-          if ("\\" == c) {
-            err("\\ not allowed in relative path.");
-          }
-          var tmp;
-          if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
-            buffer = tmp;
-          }
-          if (".." == buffer) {
-            this._path.pop();
-            if ("/" != c && "\\" != c) {
-              this._path.push("");
-            }
-          } else if ("." == buffer && "/" != c && "\\" != c) {
-            this._path.push("");
-          } else if ("." != buffer) {
-            if ("file" == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == "|") {
-              buffer = buffer[0] + ":";
-            }
-            this._path.push(buffer);
-          }
-          buffer = "";
-          if ("?" == c) {
-            this._query = "?";
-            state = "query";
-          } else if ("#" == c) {
-            this._fragment = "#";
-            state = "fragment";
-          }
-        } else if ("\t" != c && "\n" != c && "\r" != c) {
-          buffer += percentEscape(c);
-        }
-        break;
-
-       case "query":
-        if (!stateOverride && "#" == c) {
-          this._fragment = "#";
-          state = "fragment";
-        } else if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
-          this._query += percentEscapeQuery(c);
-        }
-        break;
-
-       case "fragment":
-        if (EOF != c && "\t" != c && "\n" != c && "\r" != c) {
-          this._fragment += c;
-        }
-        break;
-      }
-      cursor++;
-    }
-  }
-  function clear() {
-    this._scheme = "";
-    this._schemeData = "";
-    this._username = "";
-    this._password = null;
-    this._host = "";
-    this._port = "";
-    this._path = [];
-    this._query = "";
-    this._fragment = "";
-    this._isInvalid = false;
-    this._isRelative = false;
-  }
-  function jURL(url, base) {
-    if (base !== undefined && !(base instanceof jURL)) base = new jURL(String(base));
-    this._url = url;
-    clear.call(this);
-    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, "");
-    parse.call(this, input, null, base);
-  }
-  jURL.prototype = {
-    toString: function() {
-      return this.href;
-    },
-    get href() {
-      if (this._isInvalid) return this._url;
-      var authority = "";
-      if ("" != this._username || null != this._password) {
-        authority = this._username + (null != this._password ? ":" + this._password : "") + "@";
-      }
-      return this.protocol + (this._isRelative ? "//" + authority + this.host : "") + this.pathname + this._query + this._fragment;
-    },
-    set href(href) {
-      clear.call(this);
-      parse.call(this, href);
-    },
-    get protocol() {
-      return this._scheme + ":";
-    },
-    set protocol(protocol) {
-      if (this._isInvalid) return;
-      parse.call(this, protocol + ":", "scheme start");
-    },
-    get host() {
-      return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host;
-    },
-    set host(host) {
-      if (this._isInvalid || !this._isRelative) return;
-      parse.call(this, host, "host");
-    },
-    get hostname() {
-      return this._host;
-    },
-    set hostname(hostname) {
-      if (this._isInvalid || !this._isRelative) return;
-      parse.call(this, hostname, "hostname");
-    },
-    get port() {
-      return this._port;
-    },
-    set port(port) {
-      if (this._isInvalid || !this._isRelative) return;
-      parse.call(this, port, "port");
-    },
-    get pathname() {
-      return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData;
-    },
-    set pathname(pathname) {
-      if (this._isInvalid || !this._isRelative) return;
-      this._path = [];
-      parse.call(this, pathname, "relative path start");
-    },
-    get search() {
-      return this._isInvalid || !this._query || "?" == this._query ? "" : this._query;
-    },
-    set search(search) {
-      if (this._isInvalid || !this._isRelative) return;
-      this._query = "?";
-      if ("?" == search[0]) search = search.slice(1);
-      parse.call(this, search, "query");
-    },
-    get hash() {
-      return this._isInvalid || !this._fragment || "#" == this._fragment ? "" : this._fragment;
-    },
-    set hash(hash) {
-      if (this._isInvalid) return;
-      this._fragment = "#";
-      if ("#" == hash[0]) hash = hash.slice(1);
-      parse.call(this, hash, "fragment");
-    },
-    get origin() {
-      var host;
-      if (this._isInvalid || !this._scheme) {
-        return "";
-      }
-      switch (this._scheme) {
-       case "data":
-       case "file":
-       case "javascript":
-       case "mailto":
-        return "null";
-      }
-      host = this.host;
-      if (!host) {
-        return "";
-      }
-      return this._scheme + "://" + host;
-    }
-  };
-  var OriginalURL = scope.URL;
-  if (OriginalURL) {
-    jURL.createObjectURL = function(blob) {
-      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
-    };
-    jURL.revokeObjectURL = function(url) {
-      OriginalURL.revokeObjectURL(url);
-    };
-  }
-  scope.URL = jURL;
-})(self);
-
-(function(global) {
-  if (global.JsMutationObserver) {
-    return;
-  }
-  var registrationsTable = new WeakMap();
-  var setImmediate;
-  if (/Trident|Edge/.test(navigator.userAgent)) {
-    setImmediate = setTimeout;
-  } else if (window.setImmediate) {
-    setImmediate = window.setImmediate;
-  } else {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener("message", function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, "*");
-    };
-  }
-  var isScheduled = false;
-  var scheduledObservers = [];
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
-  }
-  function dispatchCallbacks() {
-    isScheduled = false;
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-      var queue = observer.takeRecords();
-      removeTransientObserversFor(observer);
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-    if (anyNonEmpty) dispatchCallbacks();
-  }
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations) return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer) registration.removeTransientObservers();
-      });
-    });
-  }
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-          if (node !== target && !options.subtree) continue;
-          var record = callback(options);
-          if (record) registration.enqueue(record);
-        }
-      }
-    }
-  }
-  var uidCounter = 0;
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
-        throw new SyntaxError();
-      }
-      var registrations = registrationsTable.get(target);
-      if (!registrations) registrationsTable.set(target, registrations = []);
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-      registration.addListeners();
-    },
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  }
-  var currentRecord, recordWithOldValue;
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue) return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord) return lastRecord;
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
-    return null;
-  }
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-      records[length] = record;
-    },
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
-    },
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
-      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
-      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
-      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
-    },
-    addTransientObserver: function(node) {
-      if (node === this.target) return;
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations) registrationsTable.set(node, registrations = []);
-      registrations.push(this);
-    },
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-      transientObservedNodes.forEach(function(node) {
-        this.removeListeners_(node);
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            break;
-          }
-        }
-      }, this);
-    },
-    handleEvent: function(e) {
-      e.stopImmediatePropagation();
-      switch (e.type) {
-       case "DOMAttrModified":
-        var name = e.attrName;
-        var namespace = e.relatedNode.namespaceURI;
-        var target = e.target;
-        var record = new getRecord("attributes", target);
-        record.attributeName = name;
-        record.attributeNamespace = namespace;
-        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.attributes) return;
-          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
-            return;
-          }
-          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMCharacterDataModified":
-        var target = e.target;
-        var record = getRecord("characterData", target);
-        var oldValue = e.prevValue;
-        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-          if (!options.characterData) return;
-          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
-          return record;
-        });
-        break;
-
-       case "DOMNodeRemoved":
-        this.addTransientObserver(e.target);
-
-       case "DOMNodeInserted":
-        var changedNode = e.target;
-        var addedNodes, removedNodes;
-        if (e.type === "DOMNodeInserted") {
-          addedNodes = [ changedNode ];
-          removedNodes = [];
-        } else {
-          addedNodes = [];
-          removedNodes = [ changedNode ];
-        }
-        var previousSibling = changedNode.previousSibling;
-        var nextSibling = changedNode.nextSibling;
-        var record = getRecord("childList", e.target.parentNode);
-        record.addedNodes = addedNodes;
-        record.removedNodes = removedNodes;
-        record.previousSibling = previousSibling;
-        record.nextSibling = nextSibling;
-        forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function(options) {
-          if (!options.childList) return;
-          return record;
-        });
-      }
-      clearRecords();
-    }
-  };
-  global.JsMutationObserver = JsMutationObserver;
-  if (!global.MutationObserver) {
-    global.MutationObserver = JsMutationObserver;
-    JsMutationObserver._isPolyfilled = true;
-  }
-})(self);
-
-(function(scope) {
-  "use strict";
-  if (!(window.performance && window.performance.now)) {
-    var start = Date.now();
-    window.performance = {
-      now: function() {
-        return Date.now() - start;
-      }
-    };
-  }
-  if (!window.requestAnimationFrame) {
-    window.requestAnimationFrame = function() {
-      var nativeRaf = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-      return nativeRaf ? function(callback) {
-        return nativeRaf(function() {
-          callback(performance.now());
-        });
-      } : function(callback) {
-        return window.setTimeout(callback, 1e3 / 60);
-      };
-    }();
-  }
-  if (!window.cancelAnimationFrame) {
-    window.cancelAnimationFrame = function() {
-      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {
-        clearTimeout(id);
-      };
-    }();
-  }
-  var workingDefaultPrevented = function() {
-    var e = document.createEvent("Event");
-    e.initEvent("foo", true, true);
-    e.preventDefault();
-    return e.defaultPrevented;
-  }();
-  if (!workingDefaultPrevented) {
-    var origPreventDefault = Event.prototype.preventDefault;
-    Event.prototype.preventDefault = function() {
-      if (!this.cancelable) {
-        return;
-      }
-      origPreventDefault.call(this);
-      Object.defineProperty(this, "defaultPrevented", {
-        get: function() {
-          return true;
-        },
-        configurable: true
-      });
-    };
-  }
-  var isIE = /Trident/.test(navigator.userAgent);
-  if (!window.CustomEvent || isIE && typeof window.CustomEvent !== "function") {
-    window.CustomEvent = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("CustomEvent");
-      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
-      return e;
-    };
-    window.CustomEvent.prototype = window.Event.prototype;
-  }
-  if (!window.Event || isIE && typeof window.Event !== "function") {
-    var origEvent = window.Event;
-    window.Event = function(inType, params) {
-      params = params || {};
-      var e = document.createEvent("Event");
-      e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable));
-      return e;
-    };
-    window.Event.prototype = origEvent.prototype;
-  }
-})(window.WebComponents);
-
-window.HTMLImports = window.HTMLImports || {
-  flags: {}
-};
-
-(function(scope) {
-  var IMPORT_LINK_TYPE = "import";
-  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
-  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
-  var wrap = function(node) {
-    return hasShadowDOMPolyfill ? window.ShadowDOMPolyfill.wrapIfNeeded(node) : node;
-  };
-  var rootDocument = wrap(document);
-  var currentScriptDescriptor = {
-    get: function() {
-      var script = window.HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
-      return wrap(script);
-    },
-    configurable: true
-  };
-  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
-  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
-  var isIE = /Trident/.test(navigator.userAgent);
-  function whenReady(callback, doc) {
-    doc = doc || rootDocument;
-    whenDocumentReady(function() {
-      watchImportsLoad(callback, doc);
-    }, doc);
-  }
-  var requiredReadyState = isIE ? "complete" : "interactive";
-  var READY_EVENT = "readystatechange";
-  function isDocumentReady(doc) {
-    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
-  }
-  function whenDocumentReady(callback, doc) {
-    if (!isDocumentReady(doc)) {
-      var checkReady = function() {
-        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
-          doc.removeEventListener(READY_EVENT, checkReady);
-          whenDocumentReady(callback, doc);
-        }
-      };
-      doc.addEventListener(READY_EVENT, checkReady);
-    } else if (callback) {
-      callback();
-    }
-  }
-  function markTargetLoaded(event) {
-    event.target.__loaded = true;
-  }
-  function watchImportsLoad(callback, doc) {
-    var imports = doc.querySelectorAll("link[rel=import]");
-    var parsedCount = 0, importCount = imports.length, newImports = [], errorImports = [];
-    function checkDone() {
-      if (parsedCount == importCount && callback) {
-        callback({
-          allImports: imports,
-          loadedImports: newImports,
-          errorImports: errorImports
-        });
-      }
-    }
-    function loadedImport(e) {
-      markTargetLoaded(e);
-      newImports.push(this);
-      parsedCount++;
-      checkDone();
-    }
-    function errorLoadingImport(e) {
-      errorImports.push(this);
-      parsedCount++;
-      checkDone();
-    }
-    if (importCount) {
-      for (var i = 0, imp; i < importCount && (imp = imports[i]); i++) {
-        if (isImportLoaded(imp)) {
-          newImports.push(this);
-          parsedCount++;
-          checkDone();
-        } else {
-          imp.addEventListener("load", loadedImport);
-          imp.addEventListener("error", errorLoadingImport);
-        }
-      }
-    } else {
-      checkDone();
-    }
-  }
-  function isImportLoaded(link) {
-    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
-  }
-  if (useNative) {
-    new MutationObserver(function(mxns) {
-      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
-        if (m.addedNodes) {
-          handleImports(m.addedNodes);
-        }
-      }
-    }).observe(document.head, {
-      childList: true
-    });
-    function handleImports(nodes) {
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        if (isImport(n)) {
-          handleImport(n);
-        }
-      }
-    }
-    function isImport(element) {
-      return element.localName === "link" && element.rel === "import";
-    }
-    function handleImport(element) {
-      var loaded = element.import;
-      if (loaded) {
-        markTargetLoaded({
-          target: element
-        });
-      } else {
-        element.addEventListener("load", markTargetLoaded);
-        element.addEventListener("error", markTargetLoaded);
-      }
-    }
-    (function() {
-      if (document.readyState === "loading") {
-        var imports = document.querySelectorAll("link[rel=import]");
-        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
-          handleImport(imp);
-        }
-      }
-    })();
-  }
-  whenReady(function(detail) {
-    window.HTMLImports.ready = true;
-    window.HTMLImports.readyTime = new Date().getTime();
-    var evt = rootDocument.createEvent("CustomEvent");
-    evt.initCustomEvent("HTMLImportsLoaded", true, true, detail);
-    rootDocument.dispatchEvent(evt);
-  });
-  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-  scope.useNative = useNative;
-  scope.rootDocument = rootDocument;
-  scope.whenReady = whenReady;
-  scope.isIE = isIE;
-})(window.HTMLImports);
-
-(function(scope) {
-  var modules = [];
-  var addModule = function(module) {
-    modules.push(module);
-  };
-  var initializeModules = function() {
-    modules.forEach(function(module) {
-      module(scope);
-    });
-  };
-  scope.addModule = addModule;
-  scope.initializeModules = initializeModules;
-})(window.HTMLImports);
-
-window.HTMLImports.addModule(function(scope) {
-  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-  var path = {
-    resolveUrlsInStyle: function(style, linkUrl) {
-      var doc = style.ownerDocument;
-      var resolver = doc.createElement("a");
-      style.textContent = this.resolveUrlsInCssText(style.textContent, linkUrl, resolver);
-      return style;
-    },
-    resolveUrlsInCssText: function(cssText, linkUrl, urlObj) {
-      var r = this.replaceUrls(cssText, urlObj, linkUrl, CSS_URL_REGEXP);
-      r = this.replaceUrls(r, urlObj, linkUrl, CSS_IMPORT_REGEXP);
-      return r;
-    },
-    replaceUrls: function(text, urlObj, linkUrl, regexp) {
-      return text.replace(regexp, function(m, pre, url, post) {
-        var urlPath = url.replace(/["']/g, "");
-        if (linkUrl) {
-          urlPath = new URL(urlPath, linkUrl).href;
-        }
-        urlObj.href = urlPath;
-        urlPath = urlObj.href;
-        return pre + "'" + urlPath + "'" + post;
-      });
-    }
-  };
-  scope.path = path;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var xhr = {
-    async: true,
-    ok: function(request) {
-      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
-    },
-    load: function(url, next, nextContext) {
-      var request = new XMLHttpRequest();
-      if (scope.flags.debug || scope.flags.bust) {
-        url += "?" + Math.random();
-      }
-      request.open("GET", url, xhr.async);
-      request.addEventListener("readystatechange", function(e) {
-        if (request.readyState === 4) {
-          var redirectedUrl = null;
-          try {
-            var locationHeader = request.getResponseHeader("Location");
-            if (locationHeader) {
-              redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
-            }
-          } catch (e) {
-            console.error(e.message);
-          }
-          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
-        }
-      });
-      request.send();
-      return request;
-    },
-    loadDocument: function(url, next, nextContext) {
-      this.load(url, next, nextContext).responseType = "document";
-    }
-  };
-  scope.xhr = xhr;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var xhr = scope.xhr;
-  var flags = scope.flags;
-  var Loader = function(onLoad, onComplete) {
-    this.cache = {};
-    this.onload = onLoad;
-    this.oncomplete = onComplete;
-    this.inflight = 0;
-    this.pending = {};
-  };
-  Loader.prototype = {
-    addNodes: function(nodes) {
-      this.inflight += nodes.length;
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        this.require(n);
-      }
-      this.checkDone();
-    },
-    addNode: function(node) {
-      this.inflight++;
-      this.require(node);
-      this.checkDone();
-    },
-    require: function(elt) {
-      var url = elt.src || elt.href;
-      elt.__nodeUrl = url;
-      if (!this.dedupe(url, elt)) {
-        this.fetch(url, elt);
-      }
-    },
-    dedupe: function(url, elt) {
-      if (this.pending[url]) {
-        this.pending[url].push(elt);
-        return true;
-      }
-      var resource;
-      if (this.cache[url]) {
-        this.onload(url, elt, this.cache[url]);
-        this.tail();
-        return true;
-      }
-      this.pending[url] = [ elt ];
-      return false;
-    },
-    fetch: function(url, elt) {
-      flags.load && console.log("fetch", url, elt);
-      if (!url) {
-        setTimeout(function() {
-          this.receive(url, elt, {
-            error: "href must be specified"
-          }, null);
-        }.bind(this), 0);
-      } else if (url.match(/^data:/)) {
-        var pieces = url.split(",");
-        var header = pieces[0];
-        var body = pieces[1];
-        if (header.indexOf(";base64") > -1) {
-          body = atob(body);
-        } else {
-          body = decodeURIComponent(body);
-        }
-        setTimeout(function() {
-          this.receive(url, elt, null, body);
-        }.bind(this), 0);
-      } else {
-        var receiveXhr = function(err, resource, redirectedUrl) {
-          this.receive(url, elt, err, resource, redirectedUrl);
-        }.bind(this);
-        xhr.load(url, receiveXhr);
-      }
-    },
-    receive: function(url, elt, err, resource, redirectedUrl) {
-      this.cache[url] = resource;
-      var $p = this.pending[url];
-      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
-        this.onload(url, p, resource, err, redirectedUrl);
-        this.tail();
-      }
-      this.pending[url] = null;
-    },
-    tail: function() {
-      --this.inflight;
-      this.checkDone();
-    },
-    checkDone: function() {
-      if (!this.inflight) {
-        this.oncomplete();
-      }
-    }
-  };
-  scope.Loader = Loader;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var Observer = function(addCallback) {
-    this.addCallback = addCallback;
-    this.mo = new MutationObserver(this.handler.bind(this));
-  };
-  Observer.prototype = {
-    handler: function(mutations) {
-      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
-        if (m.type === "childList" && m.addedNodes.length) {
-          this.addedNodes(m.addedNodes);
-        }
-      }
-    },
-    addedNodes: function(nodes) {
-      if (this.addCallback) {
-        this.addCallback(nodes);
-      }
-      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
-        if (n.children && n.children.length) {
-          this.addedNodes(n.children);
-        }
-      }
-    },
-    observe: function(root) {
-      this.mo.observe(root, {
-        childList: true,
-        subtree: true
-      });
-    }
-  };
-  scope.Observer = Observer;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var path = scope.path;
-  var rootDocument = scope.rootDocument;
-  var flags = scope.flags;
-  var isIE = scope.isIE;
-  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
-  var importParser = {
-    documentSelectors: IMPORT_SELECTOR,
-    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]:not([type])", "style:not([type])", "script:not([type])", 'script[type="application/javascript"]', 'script[type="text/javascript"]' ].join(","),
-    map: {
-      link: "parseLink",
-      script: "parseScript",
-      style: "parseStyle"
-    },
-    dynamicElements: [],
-    parseNext: function() {
-      var next = this.nextToParse();
-      if (next) {
-        this.parse(next);
-      }
-    },
-    parse: function(elt) {
-      if (this.isParsed(elt)) {
-        flags.parse && console.log("[%s] is already parsed", elt.localName);
-        return;
-      }
-      var fn = this[this.map[elt.localName]];
-      if (fn) {
-        this.markParsing(elt);
-        fn.call(this, elt);
-      }
-    },
-    parseDynamic: function(elt, quiet) {
-      this.dynamicElements.push(elt);
-      if (!quiet) {
-        this.parseNext();
-      }
-    },
-    markParsing: function(elt) {
-      flags.parse && console.log("parsing", elt);
-      this.parsingElement = elt;
-    },
-    markParsingComplete: function(elt) {
-      elt.__importParsed = true;
-      this.markDynamicParsingComplete(elt);
-      if (elt.__importElement) {
-        elt.__importElement.__importParsed = true;
-        this.markDynamicParsingComplete(elt.__importElement);
-      }
-      this.parsingElement = null;
-      flags.parse && console.log("completed", elt);
-    },
-    markDynamicParsingComplete: function(elt) {
-      var i = this.dynamicElements.indexOf(elt);
-      if (i >= 0) {
-        this.dynamicElements.splice(i, 1);
-      }
-    },
-    parseImport: function(elt) {
-      elt.import = elt.__doc;
-      if (window.HTMLImports.__importsParsingHook) {
-        window.HTMLImports.__importsParsingHook(elt);
-      }
-      if (elt.import) {
-        elt.import.__importParsed = true;
-      }
-      this.markParsingComplete(elt);
-      if (elt.__resource && !elt.__error) {
-        elt.dispatchEvent(new CustomEvent("load", {
-          bubbles: false
-        }));
-      } else {
-        elt.dispatchEvent(new CustomEvent("error", {
-          bubbles: false
-        }));
-      }
-      if (elt.__pending) {
-        var fn;
-        while (elt.__pending.length) {
-          fn = elt.__pending.shift();
-          if (fn) {
-            fn({
-              target: elt
-            });
-          }
-        }
-      }
-      this.parseNext();
-    },
-    parseLink: function(linkElt) {
-      if (nodeIsImport(linkElt)) {
-        this.parseImport(linkElt);
-      } else {
-        linkElt.href = linkElt.href;
-        this.parseGeneric(linkElt);
-      }
-    },
-    parseStyle: function(elt) {
-      var src = elt;
-      elt = cloneStyle(elt);
-      src.__appliedElement = elt;
-      elt.__importElement = src;
-      this.parseGeneric(elt);
-    },
-    parseGeneric: function(elt) {
-      this.trackElement(elt);
-      this.addElementToDocument(elt);
-    },
-    rootImportForElement: function(elt) {
-      var n = elt;
-      while (n.ownerDocument.__importLink) {
-        n = n.ownerDocument.__importLink;
-      }
-      return n;
-    },
-    addElementToDocument: function(elt) {
-      var port = this.rootImportForElement(elt.__importElement || elt);
-      port.parentNode.insertBefore(elt, port);
-    },
-    trackElement: function(elt, callback) {
-      var self = this;
-      var done = function(e) {
-        elt.removeEventListener("load", done);
-        elt.removeEventListener("error", done);
-        if (callback) {
-          callback(e);
-        }
-        self.markParsingComplete(elt);
-        self.parseNext();
-      };
-      elt.addEventListener("load", done);
-      elt.addEventListener("error", done);
-      if (isIE && elt.localName === "style") {
-        var fakeLoad = false;
-        if (elt.textContent.indexOf("@import") == -1) {
-          fakeLoad = true;
-        } else if (elt.sheet) {
-          fakeLoad = true;
-          var csr = elt.sheet.cssRules;
-          var len = csr ? csr.length : 0;
-          for (var i = 0, r; i < len && (r = csr[i]); i++) {
-            if (r.type === CSSRule.IMPORT_RULE) {
-              fakeLoad = fakeLoad && Boolean(r.styleSheet);
-            }
-          }
-        }
-        if (fakeLoad) {
-          setTimeout(function() {
-            elt.dispatchEvent(new CustomEvent("load", {
-              bubbles: false
-            }));
-          });
-        }
-      }
-    },
-    parseScript: function(scriptElt) {
-      var script = document.createElement("script");
-      script.__importElement = scriptElt;
-      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
-      scope.currentScript = scriptElt;
-      this.trackElement(script, function(e) {
-        if (script.parentNode) {
-          script.parentNode.removeChild(script);
-        }
-        scope.currentScript = null;
-      });
-      this.addElementToDocument(script);
-    },
-    nextToParse: function() {
-      this._mayParse = [];
-      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
-    },
-    nextToParseInDoc: function(doc, link) {
-      if (doc && this._mayParse.indexOf(doc) < 0) {
-        this._mayParse.push(doc);
-        var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
-        for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-          if (!this.isParsed(n)) {
-            if (this.hasResource(n)) {
-              return nodeIsImport(n) ? this.nextToParseInDoc(n.__doc, n) : n;
-            } else {
-              return;
-            }
-          }
-        }
-      }
-      return link;
-    },
-    nextToParseDynamic: function() {
-      return this.dynamicElements[0];
-    },
-    parseSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
-    },
-    isParsed: function(node) {
-      return node.__importParsed;
-    },
-    needsDynamicParsing: function(elt) {
-      return this.dynamicElements.indexOf(elt) >= 0;
-    },
-    hasResource: function(node) {
-      if (nodeIsImport(node) && node.__doc === undefined) {
-        return false;
-      }
-      return true;
-    }
-  };
-  function nodeIsImport(elt) {
-    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
-  }
-  function generateScriptDataUrl(script) {
-    var scriptContent = generateScriptContent(script);
-    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
-  }
-  function generateScriptContent(script) {
-    return script.textContent + generateSourceMapHint(script);
-  }
-  function generateSourceMapHint(script) {
-    var owner = script.ownerDocument;
-    owner.__importedScripts = owner.__importedScripts || 0;
-    var moniker = script.ownerDocument.baseURI;
-    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
-    owner.__importedScripts++;
-    return "\n//# sourceURL=" + moniker + num + ".js\n";
-  }
-  function cloneStyle(style) {
-    var clone = style.ownerDocument.createElement("style");
-    clone.textContent = style.textContent;
-    path.resolveUrlsInStyle(clone);
-    return clone;
-  }
-  scope.parser = importParser;
-  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var flags = scope.flags;
-  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
-  var rootDocument = scope.rootDocument;
-  var Loader = scope.Loader;
-  var Observer = scope.Observer;
-  var parser = scope.parser;
-  var importer = {
-    documents: {},
-    documentPreloadSelectors: IMPORT_SELECTOR,
-    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
-    loadNode: function(node) {
-      importLoader.addNode(node);
-    },
-    loadSubtree: function(parent) {
-      var nodes = this.marshalNodes(parent);
-      importLoader.addNodes(nodes);
-    },
-    marshalNodes: function(parent) {
-      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
-    },
-    loadSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
-    },
-    loaded: function(url, elt, resource, err, redirectedUrl) {
-      flags.load && console.log("loaded", url, elt);
-      elt.__resource = resource;
-      elt.__error = err;
-      if (isImportLink(elt)) {
-        var doc = this.documents[url];
-        if (doc === undefined) {
-          doc = err ? null : makeDocument(resource, redirectedUrl || url);
-          if (doc) {
-            doc.__importLink = elt;
-            this.bootDocument(doc);
-          }
-          this.documents[url] = doc;
-        }
-        elt.__doc = doc;
-      }
-      parser.parseNext();
-    },
-    bootDocument: function(doc) {
-      this.loadSubtree(doc);
-      this.observer.observe(doc);
-      parser.parseNext();
-    },
-    loadedAll: function() {
-      parser.parseNext();
-    }
-  };
-  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
-  importer.observer = new Observer();
-  function isImportLink(elt) {
-    return isLinkRel(elt, IMPORT_LINK_TYPE);
-  }
-  function isLinkRel(elt, rel) {
-    return elt.localName === "link" && elt.getAttribute("rel") === rel;
-  }
-  function hasBaseURIAccessor(doc) {
-    return !!Object.getOwnPropertyDescriptor(doc, "baseURI");
-  }
-  function makeDocument(resource, url) {
-    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
-    doc._URL = url;
-    var base = doc.createElement("base");
-    base.setAttribute("href", url);
-    if (!doc.baseURI && !hasBaseURIAccessor(doc)) {
-      Object.defineProperty(doc, "baseURI", {
-        value: url
-      });
-    }
-    var meta = doc.createElement("meta");
-    meta.setAttribute("charset", "utf-8");
-    doc.head.appendChild(meta);
-    doc.head.appendChild(base);
-    doc.body.innerHTML = resource;
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(doc);
-    }
-    return doc;
-  }
-  if (!document.baseURI) {
-    var baseURIDescriptor = {
-      get: function() {
-        var base = document.querySelector("base");
-        return base ? base.href : window.location.href;
-      },
-      configurable: true
-    };
-    Object.defineProperty(document, "baseURI", baseURIDescriptor);
-    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
-  }
-  scope.importer = importer;
-  scope.importLoader = importLoader;
-});
-
-window.HTMLImports.addModule(function(scope) {
-  var parser = scope.parser;
-  var importer = scope.importer;
-  var dynamic = {
-    added: function(nodes) {
-      var owner, parsed, loading;
-      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
-        if (!owner) {
-          owner = n.ownerDocument;
-          parsed = parser.isParsed(owner);
-        }
-        loading = this.shouldLoadNode(n);
-        if (loading) {
-          importer.loadNode(n);
-        }
-        if (this.shouldParseNode(n) && parsed) {
-          parser.parseDynamic(n, loading);
-        }
-      }
-    },
-    shouldLoadNode: function(node) {
-      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
-    },
-    shouldParseNode: function(node) {
-      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
-    }
-  };
-  importer.observer.addCallback = dynamic.added.bind(dynamic);
-  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
-});
-
-(function(scope) {
-  var initializeModules = scope.initializeModules;
-  var isIE = scope.isIE;
-  if (scope.useNative) {
-    return;
-  }
-  initializeModules();
-  var rootDocument = scope.rootDocument;
-  function bootstrap() {
-    window.HTMLImports.importer.bootDocument(rootDocument);
-  }
-  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
-    bootstrap();
-  } else {
-    document.addEventListener("DOMContentLoaded", bootstrap);
-  }
-})(window.HTMLImports);
-
-window.CustomElements = window.CustomElements || {
-  flags: {}
-};
-
-(function(scope) {
-  var flags = scope.flags;
-  var modules = [];
-  var addModule = function(module) {
-    modules.push(module);
-  };
-  var initializeModules = function() {
-    modules.forEach(function(module) {
-      module(scope);
-    });
-  };
-  scope.addModule = addModule;
-  scope.initializeModules = initializeModules;
-  scope.hasNative = Boolean(document.registerElement);
-  scope.isIE = /Trident/.test(navigator.userAgent);
-  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative);
-})(window.CustomElements);
-
-window.CustomElements.addModule(function(scope) {
-  var IMPORT_LINK_TYPE = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none";
-  function forSubtree(node, cb) {
-    findAllElements(node, function(e) {
-      if (cb(e)) {
-        return true;
-      }
-      forRoots(e, cb);
-    });
-    forRoots(node, cb);
-  }
-  function findAllElements(node, find, data) {
-    var e = node.firstElementChild;
-    if (!e) {
-      e = node.firstChild;
-      while (e && e.nodeType !== Node.ELEMENT_NODE) {
-        e = e.nextSibling;
-      }
-    }
-    while (e) {
-      if (find(e, data) !== true) {
-        findAllElements(e, find, data);
-      }
-      e = e.nextElementSibling;
-    }
-    return null;
-  }
-  function forRoots(node, cb) {
-    var root = node.shadowRoot;
-    while (root) {
-      forSubtree(root, cb);
-      root = root.olderShadowRoot;
-    }
-  }
-  function forDocumentTree(doc, cb) {
-    _forDocumentTree(doc, cb, []);
-  }
-  function _forDocumentTree(doc, cb, processingDocuments) {
-    doc = window.wrap(doc);
-    if (processingDocuments.indexOf(doc) >= 0) {
-      return;
-    }
-    processingDocuments.push(doc);
-    var imports = doc.querySelectorAll("link[rel=" + IMPORT_LINK_TYPE + "]");
-    for (var i = 0, l = imports.length, n; i < l && (n = imports[i]); i++) {
-      if (n.import) {
-        _forDocumentTree(n.import, cb, processingDocuments);
-      }
-    }
-    cb(doc);
-  }
-  scope.forDocumentTree = forDocumentTree;
-  scope.forSubtree = forSubtree;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var flags = scope.flags;
-  var forSubtree = scope.forSubtree;
-  var forDocumentTree = scope.forDocumentTree;
-  function addedNode(node, isAttached) {
-    return added(node, isAttached) || addedSubtree(node, isAttached);
-  }
-  function added(node, isAttached) {
-    if (scope.upgrade(node, isAttached)) {
-      return true;
-    }
-    if (isAttached) {
-      attached(node);
-    }
-  }
-  function addedSubtree(node, isAttached) {
-    forSubtree(node, function(e) {
-      if (added(e, isAttached)) {
-        return true;
-      }
-    });
-  }
-  var hasThrottledAttached = window.MutationObserver._isPolyfilled && flags["throttle-attached"];
-  scope.hasPolyfillMutations = hasThrottledAttached;
-  scope.hasThrottledAttached = hasThrottledAttached;
-  var isPendingMutations = false;
-  var pendingMutations = [];
-  function deferMutation(fn) {
-    pendingMutations.push(fn);
-    if (!isPendingMutations) {
-      isPendingMutations = true;
-      setTimeout(takeMutations);
-    }
-  }
-  function takeMutations() {
-    isPendingMutations = false;
-    var $p = pendingMutations;
-    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
-      p();
-    }
-    pendingMutations = [];
-  }
-  function attached(element) {
-    if (hasThrottledAttached) {
-      deferMutation(function() {
-        _attached(element);
-      });
-    } else {
-      _attached(element);
-    }
-  }
-  function _attached(element) {
-    if (element.__upgraded__ && !element.__attached) {
-      element.__attached = true;
-      if (element.attachedCallback) {
-        element.attachedCallback();
-      }
-    }
-  }
-  function detachedNode(node) {
-    detached(node);
-    forSubtree(node, function(e) {
-      detached(e);
-    });
-  }
-  function detached(element) {
-    if (hasThrottledAttached) {
-      deferMutation(function() {
-        _detached(element);
-      });
-    } else {
-      _detached(element);
-    }
-  }
-  function _detached(element) {
-    if (element.__upgraded__ && element.__attached) {
-      element.__attached = false;
-      if (element.detachedCallback) {
-        element.detachedCallback();
-      }
-    }
-  }
-  function inDocument(element) {
-    var p = element;
-    var doc = window.wrap(document);
-    while (p) {
-      if (p == doc) {
-        return true;
-      }
-      p = p.parentNode || p.nodeType === Node.DOCUMENT_FRAGMENT_NODE && p.host;
-    }
-  }
-  function watchShadow(node) {
-    if (node.shadowRoot && !node.shadowRoot.__watched) {
-      flags.dom && console.log("watching shadow-root for: ", node.localName);
-      var root = node.shadowRoot;
-      while (root) {
-        observe(root);
-        root = root.olderShadowRoot;
-      }
-    }
-  }
-  function handler(root, mutations) {
-    if (flags.dom) {
-      var mx = mutations[0];
-      if (mx && mx.type === "childList" && mx.addedNodes) {
-        if (mx.addedNodes) {
-          var d = mx.addedNodes[0];
-          while (d && d !== document && !d.host) {
-            d = d.parentNode;
-          }
-          var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
-          u = u.split("/?").shift().split("/").pop();
-        }
-      }
-      console.group("mutations (%d) [%s]", mutations.length, u || "");
-    }
-    var isAttached = inDocument(root);
-    mutations.forEach(function(mx) {
-      if (mx.type === "childList") {
-        forEach(mx.addedNodes, function(n) {
-          if (!n.localName) {
-            return;
-          }
-          addedNode(n, isAttached);
-        });
-        forEach(mx.removedNodes, function(n) {
-          if (!n.localName) {
-            return;
-          }
-          detachedNode(n);
-        });
-      }
-    });
-    flags.dom && console.groupEnd();
-  }
-  function takeRecords(node) {
-    node = window.wrap(node);
-    if (!node) {
-      node = window.wrap(document);
-    }
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-    var observer = node.__observer;
-    if (observer) {
-      handler(node, observer.takeRecords());
-      takeMutations();
-    }
-  }
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-  function observe(inRoot) {
-    if (inRoot.__observer) {
-      return;
-    }
-    var observer = new MutationObserver(handler.bind(this, inRoot));
-    observer.observe(inRoot, {
-      childList: true,
-      subtree: true
-    });
-    inRoot.__observer = observer;
-  }
-  function upgradeDocument(doc) {
-    doc = window.wrap(doc);
-    flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
-    var isMainDocument = doc === window.wrap(document);
-    addedNode(doc, isMainDocument);
-    observe(doc);
-    flags.dom && console.groupEnd();
-  }
-  function upgradeDocumentTree(doc) {
-    forDocumentTree(doc, upgradeDocument);
-  }
-  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-  if (originalCreateShadowRoot) {
-    Element.prototype.createShadowRoot = function() {
-      var root = originalCreateShadowRoot.call(this);
-      window.CustomElements.watchShadow(this);
-      return root;
-    };
-  }
-  scope.watchShadow = watchShadow;
-  scope.upgradeDocumentTree = upgradeDocumentTree;
-  scope.upgradeDocument = upgradeDocument;
-  scope.upgradeSubtree = addedSubtree;
-  scope.upgradeAll = addedNode;
-  scope.attached = attached;
-  scope.takeRecords = takeRecords;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var flags = scope.flags;
-  function upgrade(node, isAttached) {
-    if (node.localName === "template") {
-      if (window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
-        HTMLTemplateElement.decorate(node);
-      }
-    }
-    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
-      var is = node.getAttribute("is");
-      var definition = scope.getRegisteredDefinition(node.localName) || scope.getRegisteredDefinition(is);
-      if (definition) {
-        if (is && definition.tag == node.localName || !is && !definition.extends) {
-          return upgradeWithDefinition(node, definition, isAttached);
-        }
-      }
-    }
-  }
-  function upgradeWithDefinition(element, definition, isAttached) {
-    flags.upgrade && console.group("upgrade:", element.localName);
-    if (definition.is) {
-      element.setAttribute("is", definition.is);
-    }
-    implementPrototype(element, definition);
-    element.__upgraded__ = true;
-    created(element);
-    if (isAttached) {
-      scope.attached(element);
-    }
-    scope.upgradeSubtree(element, isAttached);
-    flags.upgrade && console.groupEnd();
-    return element;
-  }
-  function implementPrototype(element, definition) {
-    if (Object.__proto__) {
-      element.__proto__ = definition.prototype;
-    } else {
-      customMixin(element, definition.prototype, definition.native);
-      element.__proto__ = definition.prototype;
-    }
-  }
-  function customMixin(inTarget, inSrc, inNative) {
-    var used = {};
-    var p = inSrc;
-    while (p !== inNative && p !== HTMLElement.prototype) {
-      var keys = Object.getOwnPropertyNames(p);
-      for (var i = 0, k; k = keys[i]; i++) {
-        if (!used[k]) {
-          Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
-          used[k] = 1;
-        }
-      }
-      p = Object.getPrototypeOf(p);
-    }
-  }
-  function created(element) {
-    if (element.createdCallback) {
-      element.createdCallback();
-    }
-  }
-  scope.upgrade = upgrade;
-  scope.upgradeWithDefinition = upgradeWithDefinition;
-  scope.implementPrototype = implementPrototype;
-});
-
-window.CustomElements.addModule(function(scope) {
-  var isIE = scope.isIE;
-  var upgradeDocumentTree = scope.upgradeDocumentTree;
-  var upgradeAll = scope.upgradeAll;
-  var upgradeWithDefinition = scope.upgradeWithDefinition;
-  var implementPrototype = scope.implementPrototype;
-  var useNative = scope.useNative;
-  function register(name, options) {
-    var definition = options || {};
-    if (!name) {
-      throw new Error("document.registerElement: first argument `name` must not be empty");
-    }
-    if (name.indexOf("-") < 0) {
-      throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
-    }
-    if (isReservedTag(name)) {
-      throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
-    }
-    if (getRegisteredDefinition(name)) {
-      throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
-    }
-    if (!definition.prototype) {
-      definition.prototype = Object.create(HTMLElement.prototype);
-    }
-    definition.__name = name.toLowerCase();
-    if (definition.extends) {
-      definition.extends = definition.extends.toLowerCase();
-    }
-    definition.lifecycle = definition.lifecycle || {};
-    definition.ancestry = ancestry(definition.extends);
-    resolveTagName(definition);
-    resolvePrototypeChain(definition);
-    overrideAttributeApi(definition.prototype);
-    registerDefinition(definition.__name, definition);
-    definition.ctor = generateConstructor(definition);
-    definition.ctor.prototype = definition.prototype;
-    definition.prototype.constructor = definition.ctor;
-    if (scope.ready) {
-      upgradeDocumentTree(document);
-    }
-    return definition.ctor;
-  }
-  function overrideAttributeApi(prototype) {
-    if (prototype.setAttribute._polyfilled) {
-      return;
-    }
-    var setAttribute = prototype.setAttribute;
-    prototype.setAttribute = function(name, value) {
-      changeAttribute.call(this, name, value, setAttribute);
-    };
-    var removeAttribute = prototype.removeAttribute;
-    prototype.removeAttribute = function(name) {
-      changeAttribute.call(this, name, null, removeAttribute);
-    };
-    prototype.setAttribute._polyfilled = true;
-  }
-  function changeAttribute(name, value, operation) {
-    name = name.toLowerCase();
-    var oldValue = this.getAttribute(name);
-    operation.apply(this, arguments);
-    var newValue = this.getAttribute(name);
-    if (this.attributeChangedCallback && newValue !== oldValue) {
-      this.attributeChangedCallback(name, oldValue, newValue);
-    }
-  }
-  function isReservedTag(name) {
-    for (var i = 0; i < reservedTagList.length; i++) {
-      if (name === reservedTagList[i]) {
-        return true;
-      }
-    }
-  }
-  var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
-  function ancestry(extnds) {
-    var extendee = getRegisteredDefinition(extnds);
-    if (extendee) {
-      return ancestry(extendee.extends).concat([ extendee ]);
-    }
-    return [];
-  }
-  function resolveTagName(definition) {
-    var baseTag = definition.extends;
-    for (var i = 0, a; a = definition.ancestry[i]; i++) {
-      baseTag = a.is && a.tag;
-    }
-    definition.tag = baseTag || definition.__name;
-    if (baseTag) {
-      definition.is = definition.__name;
-    }
-  }
-  function resolvePrototypeChain(definition) {
-    if (!Object.__proto__) {
-      var nativePrototype = HTMLElement.prototype;
-      if (definition.is) {
-        var inst = document.createElement(definition.tag);
-        nativePrototype = Object.getPrototypeOf(inst);
-      }
-      var proto = definition.prototype, ancestor;
-      var foundPrototype = false;
-      while (proto) {
-        if (proto == nativePrototype) {
-          foundPrototype = true;
-        }
-        ancestor = Object.getPrototypeOf(proto);
-        if (ancestor) {
-          proto.__proto__ = ancestor;
-        }
-        proto = ancestor;
-      }
-      if (!foundPrototype) {
-        console.warn(definition.tag + " prototype not found in prototype chain for " + definition.is);
-      }
-      definition.native = nativePrototype;
-    }
-  }
-  function instantiate(definition) {
-    return upgradeWithDefinition(domCreateElement(definition.tag), definition);
-  }
-  var registry = {};
-  function getRegisteredDefinition(name) {
-    if (name) {
-      return registry[name.toLowerCase()];
-    }
-  }
-  function registerDefinition(name, definition) {
-    registry[name] = definition;
-  }
-  function generateConstructor(definition) {
-    return function() {
-      return instantiate(definition);
-    };
-  }
-  var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
-  function createElementNS(namespace, tag, typeExtension) {
-    if (namespace === HTML_NAMESPACE) {
-      return createElement(tag, typeExtension);
-    } else {
-      return domCreateElementNS(namespace, tag);
-    }
-  }
-  function createElement(tag, typeExtension) {
-    if (tag) {
-      tag = tag.toLowerCase();
-    }
-    if (typeExtension) {
-      typeExtension = typeExtension.toLowerCase();
-    }
-    var definition = getRegisteredDefinition(typeExtension || tag);
-    if (definition) {
-      if (tag == definition.tag && typeExtension == definition.is) {
-        return new definition.ctor();
-      }
-      if (!typeExtension && !definition.is) {
-        return new definition.ctor();
-      }
-    }
-    var element;
-    if (typeExtension) {
-      element = createElement(tag);
-      element.setAttribute("is", typeExtension);
-      return element;
-    }
-    element = domCreateElement(tag);
-    if (tag.indexOf("-") >= 0) {
-      implementPrototype(element, HTMLElement);
-    }
-    return element;
-  }
-  var domCreateElement = document.createElement.bind(document);
-  var domCreateElementNS = document.createElementNS.bind(document);
-  var isInstance;
-  if (!Object.__proto__ && !useNative) {
-    isInstance = function(obj, ctor) {
-      if (obj instanceof ctor) {
-        return true;
-      }
-      var p = obj;
-      while (p) {
-        if (p === ctor.prototype) {
-          return true;
-        }
-        p = p.__proto__;
-      }
-      return false;
-    };
-  } else {
-    isInstance = function(obj, base) {
-      return obj instanceof base;
-    };
-  }
-  function wrapDomMethodToForceUpgrade(obj, methodName) {
-    var orig = obj[methodName];
-    obj[methodName] = function() {
-      var n = orig.apply(this, arguments);
-      upgradeAll(n);
-      return n;
-    };
-  }
-  wrapDomMethodToForceUpgrade(Node.prototype, "cloneNode");
-  wrapDomMethodToForceUpgrade(document, "importNode");
-  document.registerElement = register;
-  document.createElement = createElement;
-  document.createElementNS = createElementNS;
-  scope.registry = registry;
-  scope.instanceof = isInstance;
-  scope.reservedTagList = reservedTagList;
-  scope.getRegisteredDefinition = getRegisteredDefinition;
-  document.register = document.registerElement;
-});
-
-(function(scope) {
-  var useNative = scope.useNative;
-  var initializeModules = scope.initializeModules;
-  var isIE = scope.isIE;
-  if (useNative) {
-    var nop = function() {};
-    scope.watchShadow = nop;
-    scope.upgrade = nop;
-    scope.upgradeAll = nop;
-    scope.upgradeDocumentTree = nop;
-    scope.upgradeSubtree = nop;
-    scope.takeRecords = nop;
-    scope.instanceof = function(obj, base) {
-      return obj instanceof base;
-    };
-  } else {
-    initializeModules();
-  }
-  var upgradeDocumentTree = scope.upgradeDocumentTree;
-  var upgradeDocument = scope.upgradeDocument;
-  if (!window.wrap) {
-    if (window.ShadowDOMPolyfill) {
-      window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded;
-      window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded;
-    } else {
-      window.wrap = window.unwrap = function(node) {
-        return node;
-      };
-    }
-  }
-  if (window.HTMLImports) {
-    window.HTMLImports.__importsParsingHook = function(elt) {
-      if (elt.import) {
-        upgradeDocument(wrap(elt.import));
-      }
-    };
-  }
-  function bootstrap() {
-    upgradeDocumentTree(window.wrap(document));
-    window.CustomElements.ready = true;
-    var requestAnimationFrame = window.requestAnimationFrame || function(f) {
-      setTimeout(f, 16);
-    };
-    requestAnimationFrame(function() {
-      setTimeout(function() {
-        window.CustomElements.readyTime = Date.now();
-        if (window.HTMLImports) {
-          window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime;
-        }
-        document.dispatchEvent(new CustomEvent("WebComponentsReady", {
-          bubbles: true
-        }));
-      });
-    });
-  }
-  if (document.readyState === "complete" || scope.flags.eager) {
-    bootstrap();
-  } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
-    bootstrap();
-  } else {
-    var loadEvent = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
-    window.addEventListener(loadEvent, bootstrap);
-  }
-})(window.CustomElements);
-
-(function(scope) {
-  if (!Function.prototype.bind) {
-    Function.prototype.bind = function(scope) {
-      var self = this;
-      var args = Array.prototype.slice.call(arguments, 1);
-      return function() {
-        var args2 = args.slice();
-        args2.push.apply(args2, arguments);
-        return self.apply(scope, args2);
-      };
-    };
-  }
-})(window.WebComponents);
-
-(function(scope) {
-  var style = document.createElement("style");
-  style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n";
-  var head = document.querySelector("head");
-  head.insertBefore(style, head.firstChild);
-})(window.WebComponents);
-
-(function(scope) {
-  window.Platform = scope;
-})(window.WebComponents);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents.min.js b/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents.min.js
deleted file mode 100644
index ad8196b..0000000
--- a/systrace/catapult/third_party/polymer/components/webcomponentsjs/webcomponents.min.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-// @version 0.7.24
-!function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},has:function(e){var t=e[this.name];return!!t&&t[0]===e}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return e===window&&"showModalDialog"===t?B:Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;l<a;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;u<s;u++)c[0][u]=u;for(var l=1;l<a;l++)for(var u=1;u<s;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=d<p?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=d<p?d<u?d:u:p<u?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);l<u;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;r<n;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;i<n&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&d.attributeFilter.indexOf(o.name)!==-1)&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;m<w;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e||e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return l==-1?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;r<o;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;o<n;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;s<c;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
-querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;m<f;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;m<v;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return!!t&&(t.invalidate(),!0)},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){
-return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;r<o&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;c<l&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n\t",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^(?!=)/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,63,96].indexOf(t)==-1?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&t<127&&[34,35,60,62,96].indexOf(t)==-1?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&"\t"!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if("\t"!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}"\t"==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}"\t"!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}"\t"==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))"\t"!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&"\t"!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&"\t"!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){if(e.attributes&&(!e.attributeFilter||!e.attributeFilter.length||e.attributeFilter.indexOf(t)!==-1||e.attributeFilter.indexOf(n)!==-1))return e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){if(e.characterData)return e.characterDataOldValue?u(a):o});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){if(e.childList)return o})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){"complete"!==t.readyState&&t.readyState!==v||(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),c++,n()}function i(e){
-d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];if(l)for(var p,h=0;h<l&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;n<r&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;s<c&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;n<r&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(e.textContent.indexOf("@import")==-1)o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;c<s&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;i<a&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;s<c&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return!!t(e)||void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;s<c&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return!!e.upgrade(t,n)||void(n&&a(t))}function r(e,t){b(e,function(e){if(n(e,t))return!0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;n<r&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return g(T(e.tag),e)}function l(e){if(e)return _[e.toLowerCase()]}function u(e,t){_[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===S?h(t,n):M(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=T(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return v(e),e}}var m,w=(e.isIE,e.upgradeDocumentTree),v=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],_={},S="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=_,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
\ No newline at end of file
diff --git a/systrace/catapult/third_party/pyserial/LICENSE.txt b/systrace/catapult/third_party/pyserial/LICENSE.txt
deleted file mode 100644
index f604ea3..0000000
--- a/systrace/catapult/third_party/pyserial/LICENSE.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-Copyright (c) 2001-2013 Chris Liechti <cliechti@gmx.net>;
-All Rights Reserved.
-
-This is the Python license. In short, you can use this product in
-commercial and non-commercial applications, modify it, redistribute it.
-A notification to the author when you use and/or modify it is welcome.
-
-
-TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING THIS SOFTWARE
-===================================================================
-
-LICENSE AGREEMENT
------------------
-
-1. This LICENSE AGREEMENT is between the copyright holder of this
-product, and the Individual or Organization ("Licensee") accessing
-and otherwise using this product in source or binary form and its
-associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement,
-the copyright holder hereby grants Licensee a nonexclusive,
-royalty-free, world-wide license to reproduce, analyze, test,
-perform and/or display publicly, prepare derivative works, distribute,
-and otherwise use this product alone or in any derivative version,
-provided, however, that copyright holders License Agreement and
-copyright holders notice of copyright are retained in this product
-alone or in any derivative version prepared by Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates this product or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to this product.
-
-4. The copyright holder is making this product available to Licensee on
-an "AS IS" basis. THE COPYRIGHT HOLDER MAKES NO REPRESENTATIONS OR
-WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION,
-THE COPYRIGHT HOLDER MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
-WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR
-THAT THE USE OF THIS PRODUCT WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. THE COPYRIGHT HOLDER SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER
-USERS OF THIS PRODUCT FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL
-DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE
-USING THIS PRODUCT, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE
-POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any
-relationship of agency, partnership, or joint venture between the
-copyright holder and Licensee. This License Agreement does not grant
-permission to use trademarks or trade names from the copyright holder
-in a trademark sense to endorse or promote products or services of
-Licensee, or any third party.
-
-8. By copying, installing or otherwise using this product, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
diff --git a/systrace/catapult/third_party/pyserial/README.chromium b/systrace/catapult/third_party/pyserial/README.chromium
deleted file mode 100644
index 04593db..0000000
--- a/systrace/catapult/third_party/pyserial/README.chromium
+++ /dev/null
@@ -1,19 +0,0 @@
-Name: pySerial
-Short Name: pySerial
-URL: https://github.com/pyserial/pyserial
-Version: 2.7
-Date: 2013-10-17
-License: Python
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-Library for Python access for the serial port. Used for communication with
-a Monsoon device, which tunnels serial over USB.
-
-Local Modifications:
-Includes only the serial/ folder and LICENSE.txt.
-Packaging and setup files have not been copied downstream.
-All other files and folders (documentation/, examples/, test/)
-have not been copied downstream.
-linux-product_info.patch has been applied to include the product information as description.
diff --git a/systrace/catapult/third_party/pyserial/linux-product_info.patch b/systrace/catapult/third_party/pyserial/linux-product_info.patch
deleted file mode 100644
index 9f8001a..0000000
--- a/systrace/catapult/third_party/pyserial/linux-product_info.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-Index: serial/tools/list_ports_linux.py
-===================================================================
---- serial/tools/list_ports_linux.py	(revision 494)
-+++ serial/tools/list_ports_linux.py	(working copy)
-@@ -110,6 +110,14 @@
-     sys_dev_path = '/sys/class/tty/%s/device/interface' % (base,)
-     if os.path.exists(sys_dev_path):
-         return read_line(sys_dev_path)
-+
-+    # USB Product Information
-+    sys_dev_path = '/sys/class/tty/%s/device' % (base,)
-+    if os.path.exists(sys_dev_path):
-+        product_name_file = os.path.dirname(os.path.realpath(sys_dev_path)) + "/product"
-+        if os.path.exists(product_name_file):
-+            return read_line(product_name_file)
-+
-     return base
- 
- def hwinfo(device):
diff --git a/systrace/catapult/third_party/pyserial/serial/__init__.py b/systrace/catapult/third_party/pyserial/serial/__init__.py
deleted file mode 100755
index 33ae52e..0000000
--- a/systrace/catapult/third_party/pyserial/serial/__init__.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python 
-
-# portable serial port access with python
-# this is a wrapper module for different platform implementations
-#
-# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-VERSION = '2.7'
-
-import sys
-
-if sys.platform == 'cli':
-    from serial.serialcli import *
-else:
-    import os
-    # chose an implementation, depending on os
-    if os.name == 'nt': #sys.platform == 'win32':
-        from serial.serialwin32 import *
-    elif os.name == 'posix':
-        from serial.serialposix import *
-    elif os.name == 'java':
-        from serial.serialjava import *
-    else:
-        raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
-
-
-protocol_handler_packages = [
-        'serial.urlhandler',
-        ]
-
-def serial_for_url(url, *args, **kwargs):
-    """\
-    Get an instance of the Serial class, depending on port/url. The port is not
-    opened when the keyword parameter 'do_not_open' is true, by default it
-    is. All other parameters are directly passed to the __init__ method when
-    the port is instantiated.
-
-    The list of package names that is searched for protocol handlers is kept in
-    ``protocol_handler_packages``.
-
-    e.g. we want to support a URL ``foobar://``. A module
-    ``my_handlers.protocol_foobar`` is provided by the user. Then
-    ``protocol_handler_packages.append("my_handlers")`` would extend the search
-    path so that ``serial_for_url("foobar://"))`` would work.
-    """
-    # check remove extra parameter to not confuse the Serial class
-    do_open = 'do_not_open' not in kwargs or not kwargs['do_not_open']
-    if 'do_not_open' in kwargs: del kwargs['do_not_open']
-    # the default is to use the native version
-    klass = Serial   # 'native' implementation
-    # check port type and get class
-    try:
-        url_nocase = url.lower()
-    except AttributeError:
-        # it's not a string, use default
-        pass
-    else:
-        if '://' in url_nocase:
-            protocol = url_nocase.split('://', 1)[0]
-            for package_name in protocol_handler_packages:
-                module_name = '%s.protocol_%s' % (package_name, protocol,)
-                try:
-                    handler_module = __import__(module_name)
-                except ImportError:
-                    pass
-                else:
-                    klass = sys.modules[module_name].Serial
-                    break
-            else:
-                raise ValueError('invalid URL, protocol %r not known' % (protocol,))
-        else:
-            klass = Serial   # 'native' implementation
-    # instantiate and open when desired
-    instance = klass(None, *args, **kwargs)
-    instance.port = url
-    if do_open:
-        instance.open()
-    return instance
diff --git a/systrace/catapult/third_party/pyserial/serial/rfc2217.py b/systrace/catapult/third_party/pyserial/serial/rfc2217.py
deleted file mode 100644
index 2012ea7..0000000
--- a/systrace/catapult/third_party/pyserial/serial/rfc2217.py
+++ /dev/null
@@ -1,1323 +0,0 @@
-#! python
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# see __init__.py
-#
-# This module implements a RFC2217 compatible client. RF2217 descibes a
-# protocol to access serial ports over TCP/IP and allows setting the baud rate,
-# modem control lines etc.
-#
-# (C) 2001-2013 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-# TODO:
-# - setting control line -> answer is not checked (had problems with one of the
-#   severs). consider implementing a compatibility mode flag to make check
-#   conditional
-# - write timeout not implemented at all
-
-##############################################################################
-# observations and issues with servers
-#=============================================================================
-# sredird V2.2.1
-# - http://www.ibiblio.org/pub/Linux/system/serial/   sredird-2.2.2.tar.gz
-# - does not acknowledge SET_CONTROL (RTS/DTR) correctly, always responding
-#   [105 1] instead of the actual value.
-# - SET_BAUDRATE answer contains 4 extra null bytes -> probably for larger
-#   numbers than 2**32?
-# - To get the signature [COM_PORT_OPTION 0] has to be sent.
-# - run a server: while true; do nc -l -p 7000 -c "sredird debug /dev/ttyUSB0 /var/lock/sredir"; done
-#=============================================================================
-# telnetcpcd (untested)
-# - http://ftp.wayne.edu/kermit/sredird/telnetcpcd-1.09.tar.gz
-# - To get the signature [COM_PORT_OPTION] w/o data has to be sent.
-#=============================================================================
-# ser2net
-# - does not negotiate BINARY or COM_PORT_OPTION for his side but at least
-#   acknowledges that the client activates these options
-# - The configuration may be that the server prints a banner. As this client
-#   implementation does a flushInput on connect, this banner is hidden from
-#   the user application.
-# - NOTIFY_MODEMSTATE: the poll interval of the server seems to be one
-#   second.
-# - To get the signature [COM_PORT_OPTION 0] has to be sent.
-# - run a server: run ser2net daemon, in /etc/ser2net.conf:
-#     2000:telnet:0:/dev/ttyS0:9600 remctl banner
-##############################################################################
-
-# How to identify ports? pySerial might want to support other protocols in the
-# future, so lets use an URL scheme.
-# for RFC2217 compliant servers we will use this:
-#    rfc2217://<host>:<port>[/option[/option...]]
-#
-# options:
-# - "debug" print diagnostic messages
-# - "ign_set_control": do not look at the answers to SET_CONTROL
-# - "poll_modem": issue NOTIFY_MODEMSTATE requests when CTS/DTR/RI/CD is read.
-#   Without this option it expects that the server sends notifications
-#   automatically on change (which most servers do and is according to the
-#   RFC).
-# the order of the options is not relevant
-
-from serial.serialutil import *
-import time
-import struct
-import socket
-import threading
-import Queue
-import logging
-
-# port string is expected to be something like this:
-# rfc2217://host:port
-# host may be an IP or including domain, whatever.
-# port is 0...65535
-
-# map log level names to constants. used in fromURL()
-LOGGER_LEVELS = {
-    'debug': logging.DEBUG,
-    'info': logging.INFO,
-    'warning': logging.WARNING,
-    'error': logging.ERROR,
-    }
-
-
-# telnet protocol characters
-IAC  = to_bytes([255]) # Interpret As Command
-DONT = to_bytes([254])
-DO   = to_bytes([253])
-WONT = to_bytes([252])
-WILL = to_bytes([251])
-IAC_DOUBLED = to_bytes([IAC, IAC])
-
-SE  = to_bytes([240])  # Subnegotiation End
-NOP = to_bytes([241])  # No Operation
-DM  = to_bytes([242])  # Data Mark
-BRK = to_bytes([243])  # Break
-IP  = to_bytes([244])  # Interrupt process
-AO  = to_bytes([245])  # Abort output
-AYT = to_bytes([246])  # Are You There
-EC  = to_bytes([247])  # Erase Character
-EL  = to_bytes([248])  # Erase Line
-GA  = to_bytes([249])  # Go Ahead
-SB =  to_bytes([250])  # Subnegotiation Begin
-
-# selected telnet options
-BINARY = to_bytes([0]) # 8-bit data path
-ECHO = to_bytes([1])   # echo
-SGA = to_bytes([3])    # suppress go ahead
-
-# RFC2217
-COM_PORT_OPTION = to_bytes([44])
-
-# Client to Access Server
-SET_BAUDRATE = to_bytes([1])
-SET_DATASIZE = to_bytes([2])
-SET_PARITY = to_bytes([3])
-SET_STOPSIZE = to_bytes([4])
-SET_CONTROL = to_bytes([5])
-NOTIFY_LINESTATE = to_bytes([6])
-NOTIFY_MODEMSTATE = to_bytes([7])
-FLOWCONTROL_SUSPEND = to_bytes([8])
-FLOWCONTROL_RESUME = to_bytes([9])
-SET_LINESTATE_MASK = to_bytes([10])
-SET_MODEMSTATE_MASK = to_bytes([11])
-PURGE_DATA = to_bytes([12])
-
-SERVER_SET_BAUDRATE = to_bytes([101])
-SERVER_SET_DATASIZE = to_bytes([102])
-SERVER_SET_PARITY = to_bytes([103])
-SERVER_SET_STOPSIZE = to_bytes([104])
-SERVER_SET_CONTROL = to_bytes([105])
-SERVER_NOTIFY_LINESTATE = to_bytes([106])
-SERVER_NOTIFY_MODEMSTATE = to_bytes([107])
-SERVER_FLOWCONTROL_SUSPEND = to_bytes([108])
-SERVER_FLOWCONTROL_RESUME = to_bytes([109])
-SERVER_SET_LINESTATE_MASK = to_bytes([110])
-SERVER_SET_MODEMSTATE_MASK = to_bytes([111])
-SERVER_PURGE_DATA = to_bytes([112])
-
-RFC2217_ANSWER_MAP = {
-    SET_BAUDRATE: SERVER_SET_BAUDRATE,
-    SET_DATASIZE: SERVER_SET_DATASIZE,
-    SET_PARITY: SERVER_SET_PARITY,
-    SET_STOPSIZE: SERVER_SET_STOPSIZE,
-    SET_CONTROL: SERVER_SET_CONTROL,
-    NOTIFY_LINESTATE: SERVER_NOTIFY_LINESTATE,
-    NOTIFY_MODEMSTATE: SERVER_NOTIFY_MODEMSTATE,
-    FLOWCONTROL_SUSPEND: SERVER_FLOWCONTROL_SUSPEND,
-    FLOWCONTROL_RESUME: SERVER_FLOWCONTROL_RESUME,
-    SET_LINESTATE_MASK: SERVER_SET_LINESTATE_MASK,
-    SET_MODEMSTATE_MASK: SERVER_SET_MODEMSTATE_MASK,
-    PURGE_DATA: SERVER_PURGE_DATA,
-}
-
-SET_CONTROL_REQ_FLOW_SETTING = to_bytes([0])        # Request Com Port Flow Control Setting (outbound/both)
-SET_CONTROL_USE_NO_FLOW_CONTROL = to_bytes([1])     # Use No Flow Control (outbound/both)
-SET_CONTROL_USE_SW_FLOW_CONTROL = to_bytes([2])     # Use XON/XOFF Flow Control (outbound/both)
-SET_CONTROL_USE_HW_FLOW_CONTROL = to_bytes([3])     # Use HARDWARE Flow Control (outbound/both)
-SET_CONTROL_REQ_BREAK_STATE = to_bytes([4])         # Request BREAK State
-SET_CONTROL_BREAK_ON = to_bytes([5])                # Set BREAK State ON
-SET_CONTROL_BREAK_OFF = to_bytes([6])               # Set BREAK State OFF
-SET_CONTROL_REQ_DTR = to_bytes([7])                 # Request DTR Signal State
-SET_CONTROL_DTR_ON = to_bytes([8])                  # Set DTR Signal State ON
-SET_CONTROL_DTR_OFF = to_bytes([9])                 # Set DTR Signal State OFF
-SET_CONTROL_REQ_RTS = to_bytes([10])                # Request RTS Signal State
-SET_CONTROL_RTS_ON = to_bytes([11])                 # Set RTS Signal State ON
-SET_CONTROL_RTS_OFF = to_bytes([12])                # Set RTS Signal State OFF
-SET_CONTROL_REQ_FLOW_SETTING_IN = to_bytes([13])    # Request Com Port Flow Control Setting (inbound)
-SET_CONTROL_USE_NO_FLOW_CONTROL_IN = to_bytes([14]) # Use No Flow Control (inbound)
-SET_CONTROL_USE_SW_FLOW_CONTOL_IN = to_bytes([15])  # Use XON/XOFF Flow Control (inbound)
-SET_CONTROL_USE_HW_FLOW_CONTOL_IN = to_bytes([16])  # Use HARDWARE Flow Control (inbound)
-SET_CONTROL_USE_DCD_FLOW_CONTROL = to_bytes([17])   # Use DCD Flow Control (outbound/both)
-SET_CONTROL_USE_DTR_FLOW_CONTROL = to_bytes([18])   # Use DTR Flow Control (inbound)
-SET_CONTROL_USE_DSR_FLOW_CONTROL = to_bytes([19])   # Use DSR Flow Control (outbound/both)
-
-LINESTATE_MASK_TIMEOUT = 128                # Time-out Error
-LINESTATE_MASK_SHIFTREG_EMPTY = 64          # Transfer Shift Register Empty
-LINESTATE_MASK_TRANSREG_EMPTY = 32          # Transfer Holding Register Empty
-LINESTATE_MASK_BREAK_DETECT = 16            # Break-detect Error
-LINESTATE_MASK_FRAMING_ERROR = 8            # Framing Error
-LINESTATE_MASK_PARTIY_ERROR = 4             # Parity Error
-LINESTATE_MASK_OVERRUN_ERROR = 2            # Overrun Error
-LINESTATE_MASK_DATA_READY = 1               # Data Ready
-
-MODEMSTATE_MASK_CD = 128                    # Receive Line Signal Detect (also known as Carrier Detect)
-MODEMSTATE_MASK_RI = 64                     # Ring Indicator
-MODEMSTATE_MASK_DSR = 32                    # Data-Set-Ready Signal State
-MODEMSTATE_MASK_CTS = 16                    # Clear-To-Send Signal State
-MODEMSTATE_MASK_CD_CHANGE = 8               # Delta Receive Line Signal Detect
-MODEMSTATE_MASK_RI_CHANGE = 4               # Trailing-edge Ring Detector
-MODEMSTATE_MASK_DSR_CHANGE = 2              # Delta Data-Set-Ready
-MODEMSTATE_MASK_CTS_CHANGE = 1              # Delta Clear-To-Send
-
-PURGE_RECEIVE_BUFFER = to_bytes([1])        # Purge access server receive data buffer
-PURGE_TRANSMIT_BUFFER = to_bytes([2])       # Purge access server transmit data buffer
-PURGE_BOTH_BUFFERS = to_bytes([3])          # Purge both the access server receive data buffer and the access server transmit data buffer
-
-
-RFC2217_PARITY_MAP = {
-    PARITY_NONE: 1,
-    PARITY_ODD: 2,
-    PARITY_EVEN: 3,
-    PARITY_MARK: 4,
-    PARITY_SPACE: 5,
-}
-RFC2217_REVERSE_PARITY_MAP = dict((v,k) for k,v in RFC2217_PARITY_MAP.items())
-
-RFC2217_STOPBIT_MAP = {
-    STOPBITS_ONE: 1,
-    STOPBITS_ONE_POINT_FIVE: 3,
-    STOPBITS_TWO: 2,
-}
-RFC2217_REVERSE_STOPBIT_MAP = dict((v,k) for k,v in RFC2217_STOPBIT_MAP.items())
-
-# Telnet filter states
-M_NORMAL = 0
-M_IAC_SEEN = 1
-M_NEGOTIATE = 2
-
-# TelnetOption and TelnetSubnegotiation states
-REQUESTED = 'REQUESTED'
-ACTIVE = 'ACTIVE'
-INACTIVE = 'INACTIVE'
-REALLY_INACTIVE = 'REALLY_INACTIVE'
-
-class TelnetOption(object):
-    """Manage a single telnet option, keeps track of DO/DONT WILL/WONT."""
-
-    def __init__(self, connection, name, option, send_yes, send_no, ack_yes, ack_no, initial_state, activation_callback=None):
-        """\
-        Initialize option.
-        :param connection: connection used to transmit answers
-        :param name: a readable name for debug outputs
-        :param send_yes: what to send when option is to be enabled.
-        :param send_no: what to send when option is to be disabled.
-        :param ack_yes: what to expect when remote agrees on option.
-        :param ack_no: what to expect when remote disagrees on option.
-        :param initial_state: options initialized with REQUESTED are tried to
-            be enabled on startup. use INACTIVE for all others.
-        """
-        self.connection = connection
-        self.name = name
-        self.option = option
-        self.send_yes = send_yes
-        self.send_no = send_no
-        self.ack_yes = ack_yes
-        self.ack_no = ack_no
-        self.state = initial_state
-        self.active = False
-        self.activation_callback = activation_callback
-
-    def __repr__(self):
-        """String for debug outputs"""
-        return "%s:%s(%s)" % (self.name, self.active, self.state)
-
-    def process_incoming(self, command):
-        """A DO/DONT/WILL/WONT was received for this option, update state and
-        answer when needed."""
-        if command == self.ack_yes:
-            if self.state is REQUESTED:
-                self.state = ACTIVE
-                self.active = True
-                if self.activation_callback is not None:
-                    self.activation_callback()
-            elif self.state is ACTIVE:
-                pass
-            elif self.state is INACTIVE:
-                self.state = ACTIVE
-                self.connection.telnetSendOption(self.send_yes, self.option)
-                self.active = True
-                if self.activation_callback is not None:
-                    self.activation_callback()
-            elif self.state is REALLY_INACTIVE:
-                self.connection.telnetSendOption(self.send_no, self.option)
-            else:
-                raise ValueError('option in illegal state %r' % self)
-        elif command == self.ack_no:
-            if self.state is REQUESTED:
-                self.state = INACTIVE
-                self.active = False
-            elif self.state is ACTIVE:
-                self.state = INACTIVE
-                self.connection.telnetSendOption(self.send_no, self.option)
-                self.active = False
-            elif self.state is INACTIVE:
-                pass
-            elif self.state is REALLY_INACTIVE:
-                pass
-            else:
-                raise ValueError('option in illegal state %r' % self)
-
-
-class TelnetSubnegotiation(object):
-    """\
-    A object to handle subnegotiation of options. In this case actually
-    sub-sub options for RFC 2217. It is used to track com port options.
-    """
-
-    def __init__(self, connection, name, option, ack_option=None):
-        if ack_option is None: ack_option = option
-        self.connection = connection
-        self.name = name
-        self.option = option
-        self.value = None
-        self.ack_option = ack_option
-        self.state = INACTIVE
-
-    def __repr__(self):
-        """String for debug outputs."""
-        return "%s:%s" % (self.name, self.state)
-
-    def set(self, value):
-        """\
-        request a change of the value. a request is sent to the server. if
-        the client needs to know if the change is performed he has to check the
-        state of this object.
-        """
-        self.value = value
-        self.state = REQUESTED
-        self.connection.rfc2217SendSubnegotiation(self.option, self.value)
-        if self.connection.logger:
-            self.connection.logger.debug("SB Requesting %s -> %r" % (self.name, self.value))
-
-    def isReady(self):
-        """\
-        check if answer from server has been received. when server rejects
-        the change, raise a ValueError.
-        """
-        if self.state == REALLY_INACTIVE:
-            raise ValueError("remote rejected value for option %r" % (self.name))
-        return self.state == ACTIVE
-    # add property to have a similar interface as TelnetOption
-    active = property(isReady)
-
-    def wait(self, timeout=3):
-        """\
-        wait until the subnegotiation has been acknowledged or timeout. It
-        can also throw a value error when the answer from the server does not
-        match the value sent.
-        """
-        timeout_time = time.time() + timeout
-        while time.time() < timeout_time:
-            time.sleep(0.05)    # prevent 100% CPU load
-            if self.isReady():
-                break
-        else:
-            raise SerialException("timeout while waiting for option %r" % (self.name))
-
-    def checkAnswer(self, suboption):
-        """\
-        check an incoming subnegotiation block. the parameter already has
-        cut off the header like sub option number and com port option value.
-        """
-        if self.value == suboption[:len(self.value)]:
-            self.state = ACTIVE
-        else:
-            # error propagation done in isReady
-            self.state = REALLY_INACTIVE
-        if self.connection.logger:
-            self.connection.logger.debug("SB Answer %s -> %r -> %s" % (self.name, suboption, self.state))
-
-
-class RFC2217Serial(SerialBase):
-    """Serial port implementation for RFC 2217 remote serial ports."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        self.logger = None
-        self._ignore_set_control_answer = False
-        self._poll_modem_state = False
-        self._network_timeout = 3
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        try:
-            self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            self._socket.connect(self.fromURL(self.portstr))
-            self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-        except Exception, msg:
-            self._socket = None
-            raise SerialException("Could not open port %s: %s" % (self.portstr, msg))
-
-        self._socket.settimeout(5) # XXX good value?
-
-        # use a thread save queue as buffer. it also simplifies implementing
-        # the read timeout
-        self._read_buffer = Queue.Queue()
-        # to ensure that user writes does not interfere with internal
-        # telnet/rfc2217 options establish a lock
-        self._write_lock = threading.Lock()
-        # name the following separately so that, below, a check can be easily done
-        mandadory_options = [
-            TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE),
-            TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED),
-        ]
-        # all supported telnet options
-        self._telnet_options = [
-            TelnetOption(self, 'ECHO', ECHO, DO, DONT, WILL, WONT, REQUESTED),
-            TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED),
-            TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, REQUESTED),
-            TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, INACTIVE),
-            TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, REQUESTED),
-        ] + mandadory_options
-        # RFC 2217 specific states
-        # COM port settings
-        self._rfc2217_port_settings = {
-            'baudrate': TelnetSubnegotiation(self, 'baudrate', SET_BAUDRATE, SERVER_SET_BAUDRATE),
-            'datasize': TelnetSubnegotiation(self, 'datasize', SET_DATASIZE, SERVER_SET_DATASIZE),
-            'parity':   TelnetSubnegotiation(self, 'parity',   SET_PARITY,   SERVER_SET_PARITY),
-            'stopsize': TelnetSubnegotiation(self, 'stopsize', SET_STOPSIZE, SERVER_SET_STOPSIZE),
-            }
-        # There are more subnegotiation objects, combine all in one dictionary
-        # for easy access
-        self._rfc2217_options = {
-            'purge':    TelnetSubnegotiation(self, 'purge',    PURGE_DATA,   SERVER_PURGE_DATA),
-            'control':  TelnetSubnegotiation(self, 'control',  SET_CONTROL,  SERVER_SET_CONTROL),
-            }
-        self._rfc2217_options.update(self._rfc2217_port_settings)
-        # cache for line and modem states that the server sends to us
-        self._linestate = 0
-        self._modemstate = None
-        self._modemstate_expires = 0
-        # RFC 2217 flow control between server and client
-        self._remote_suspend_flow = False
-
-        self._thread = threading.Thread(target=self._telnetReadLoop)
-        self._thread.setDaemon(True)
-        self._thread.setName('pySerial RFC 2217 reader thread for %s' % (self._port,))
-        self._thread.start()
-
-        # negotiate Telnet/RFC 2217 -> send initial requests
-        for option in self._telnet_options:
-            if option.state is REQUESTED:
-                self.telnetSendOption(option.send_yes, option.option)
-        # now wait until important options are negotiated
-        timeout_time = time.time() + self._network_timeout
-        while time.time() < timeout_time:
-            time.sleep(0.05)    # prevent 100% CPU load
-            if sum(o.active for o in mandadory_options) == len(mandadory_options):
-                break
-        else:
-            raise SerialException("Remote does not seem to support RFC2217 or BINARY mode %r" % mandadory_options)
-        if self.logger:
-            self.logger.info("Negotiated options: %s" % self._telnet_options)
-
-        # fine, go on, set RFC 2271 specific things
-        self._reconfigurePort()
-        # all things set up get, now a clean start
-        self._isOpen = True
-        if not self._rtscts:
-            self.setRTS(True)
-            self.setDTR(True)
-        self.flushInput()
-        self.flushOutput()
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port."""
-        if self._socket is None:
-            raise SerialException("Can only operate on open ports")
-
-        # if self._timeout != 0 and self._interCharTimeout is not None:
-            # XXX
-
-        if self._writeTimeout is not None:
-            raise NotImplementedError('writeTimeout is currently not supported')
-            # XXX
-
-        # Setup the connection
-        # to get good performance, all parameter changes are sent first...
-        if not isinstance(self._baudrate, (int, long)) or not 0 < self._baudrate < 2**32:
-            raise ValueError("invalid baudrate: %r" % (self._baudrate))
-        self._rfc2217_port_settings['baudrate'].set(struct.pack('!I', self._baudrate))
-        self._rfc2217_port_settings['datasize'].set(struct.pack('!B', self._bytesize))
-        self._rfc2217_port_settings['parity'].set(struct.pack('!B', RFC2217_PARITY_MAP[self._parity]))
-        self._rfc2217_port_settings['stopsize'].set(struct.pack('!B', RFC2217_STOPBIT_MAP[self._stopbits]))
-
-        # and now wait until parameters are active
-        items = self._rfc2217_port_settings.values()
-        if self.logger:
-            self.logger.debug("Negotiating settings: %s" % (items,))
-        timeout_time = time.time() + self._network_timeout
-        while time.time() < timeout_time:
-            time.sleep(0.05)    # prevent 100% CPU load
-            if sum(o.active for o in items) == len(items):
-                break
-        else:
-            raise SerialException("Remote does not accept parameter change (RFC2217): %r" % items)
-        if self.logger:
-            self.logger.info("Negotiated settings: %s" % (items,))
-
-        if self._rtscts and self._xonxoff:
-            raise ValueError('xonxoff and rtscts together are not supported')
-        elif self._rtscts:
-            self.rfc2217SetControl(SET_CONTROL_USE_HW_FLOW_CONTROL)
-        elif self._xonxoff:
-            self.rfc2217SetControl(SET_CONTROL_USE_SW_FLOW_CONTROL)
-        else:
-            self.rfc2217SetControl(SET_CONTROL_USE_NO_FLOW_CONTROL)
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            if self._socket:
-                try:
-                    self._socket.shutdown(socket.SHUT_RDWR)
-                    self._socket.close()
-                except:
-                    # ignore errors.
-                    pass
-                self._socket = None
-            if self._thread:
-                self._thread.join()
-            self._isOpen = False
-            # in case of quick reconnects, give the server some time
-            time.sleep(0.3)
-
-    def makeDeviceName(self, port):
-        raise SerialException("there is no sensible way to turn numbers into URLs")
-
-    def fromURL(self, url):
-        """extract host and port from an URL string"""
-        if url.lower().startswith("rfc2217://"): url = url[10:]
-        try:
-            # is there a "path" (our options)?
-            if '/' in url:
-                # cut away options
-                url, options = url.split('/', 1)
-                # process options now, directly altering self
-                for option in options.split('/'):
-                    if '=' in option:
-                        option, value = option.split('=', 1)
-                    else:
-                        value = None
-                    if option == 'logging':
-                        logging.basicConfig()   # XXX is that good to call it here?
-                        self.logger = logging.getLogger('pySerial.rfc2217')
-                        self.logger.setLevel(LOGGER_LEVELS[value])
-                        self.logger.debug('enabled logging')
-                    elif option == 'ign_set_control':
-                        self._ignore_set_control_answer = True
-                    elif option == 'poll_modem':
-                        self._poll_modem_state = True
-                    elif option == 'timeout':
-                        self._network_timeout = float(value)
-                    else:
-                        raise ValueError('unknown option: %r' % (option,))
-            # get host and port
-            host, port = url.split(':', 1) # may raise ValueError because of unpacking
-            port = int(port)               # and this if it's not a number
-            if not 0 <= port < 65536: raise ValueError("port not in range 0...65535")
-        except ValueError, e:
-            raise SerialException('expected a string in the form "[rfc2217://]<host>:<port>[/option[/option...]]": %s' % e)
-        return (host, port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self._isOpen: raise portNotOpenError
-        return self._read_buffer.qsize()
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self._isOpen: raise portNotOpenError
-        data = bytearray()
-        try:
-            while len(data) < size:
-                if self._thread is None:
-                    raise SerialException('connection failed (reader thread died)')
-                data.append(self._read_buffer.get(True, self._timeout))
-        except Queue.Empty: # -> timeout
-            pass
-        return bytes(data)
-
-    def write(self, data):
-        """\
-        Output the given string over the serial port. Can block if the
-        connection is blocked. May raise SerialException if the connection is
-        closed.
-        """
-        if not self._isOpen: raise portNotOpenError
-        self._write_lock.acquire()
-        try:
-            try:
-                self._socket.sendall(to_bytes(data).replace(IAC, IAC_DOUBLED))
-            except socket.error, e:
-                raise SerialException("connection failed (socket error): %s" % e) # XXX what exception if socket connection fails
-        finally:
-            self._write_lock.release()
-        return len(data)
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        self.rfc2217SendPurge(PURGE_RECEIVE_BUFFER)
-        # empty read buffer
-        while self._read_buffer.qsize():
-            self._read_buffer.get(False)
-
-    def flushOutput(self):
-        """\
-        Clear output buffer, aborting the current output and
-        discarding all that is in the buffer.
-        """
-        if not self._isOpen: raise portNotOpenError
-        self.rfc2217SendPurge(PURGE_TRANSMIT_BUFFER)
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given
-        duration."""
-        if not self._isOpen: raise portNotOpenError
-        self.setBreak(True)
-        time.sleep(duration)
-        self.setBreak(False)
-
-    def setBreak(self, level=True):
-        """\
-        Set break: Controls TXD. When active, to transmitting is
-        possible.
-        """
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('set BREAK to %s' % ('inactive', 'active')[bool(level)])
-        if level:
-            self.rfc2217SetControl(SET_CONTROL_BREAK_ON)
-        else:
-            self.rfc2217SetControl(SET_CONTROL_BREAK_OFF)
-
-    def setRTS(self, level=True):
-        """Set terminal status line: Request To Send."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('set RTS to %s' % ('inactive', 'active')[bool(level)])
-        if level:
-            self.rfc2217SetControl(SET_CONTROL_RTS_ON)
-        else:
-            self.rfc2217SetControl(SET_CONTROL_RTS_OFF)
-
-    def setDTR(self, level=True):
-        """Set terminal status line: Data Terminal Ready."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('set DTR to %s' % ('inactive', 'active')[bool(level)])
-        if level:
-            self.rfc2217SetControl(SET_CONTROL_DTR_ON)
-        else:
-            self.rfc2217SetControl(SET_CONTROL_DTR_OFF)
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send."""
-        if not self._isOpen: raise portNotOpenError
-        return bool(self.getModemState() & MODEMSTATE_MASK_CTS)
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready."""
-        if not self._isOpen: raise portNotOpenError
-        return bool(self.getModemState() & MODEMSTATE_MASK_DSR)
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator."""
-        if not self._isOpen: raise portNotOpenError
-        return bool(self.getModemState() & MODEMSTATE_MASK_RI)
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect."""
-        if not self._isOpen: raise portNotOpenError
-        return bool(self.getModemState() & MODEMSTATE_MASK_CD)
-
-    # - - - platform specific - - -
-    # None so far
-
-    # - - - RFC2217 specific - - -
-
-    def _telnetReadLoop(self):
-        """read loop for the socket."""
-        mode = M_NORMAL
-        suboption = None
-        try:
-            while self._socket is not None:
-                try:
-                    data = self._socket.recv(1024)
-                except socket.timeout:
-                    # just need to get out of recv form time to time to check if
-                    # still alive
-                    continue
-                except socket.error, e:
-                    # connection fails -> terminate loop
-                    if self.logger:
-                        self.logger.debug("socket error in reader thread: %s" % (e,))
-                    break
-                if not data: break # lost connection
-                for byte in data:
-                    if mode == M_NORMAL:
-                        # interpret as command or as data
-                        if byte == IAC:
-                            mode = M_IAC_SEEN
-                        else:
-                            # store data in read buffer or sub option buffer
-                            # depending on state
-                            if suboption is not None:
-                                suboption.append(byte)
-                            else:
-                                self._read_buffer.put(byte)
-                    elif mode == M_IAC_SEEN:
-                        if byte == IAC:
-                            # interpret as command doubled -> insert character
-                            # itself
-                            if suboption is not None:
-                                suboption.append(IAC)
-                            else:
-                                self._read_buffer.put(IAC)
-                            mode = M_NORMAL
-                        elif byte == SB:
-                            # sub option start
-                            suboption = bytearray()
-                            mode = M_NORMAL
-                        elif byte == SE:
-                            # sub option end -> process it now
-                            self._telnetProcessSubnegotiation(bytes(suboption))
-                            suboption = None
-                            mode = M_NORMAL
-                        elif byte in (DO, DONT, WILL, WONT):
-                            # negotiation
-                            telnet_command = byte
-                            mode = M_NEGOTIATE
-                        else:
-                            # other telnet commands
-                            self._telnetProcessCommand(byte)
-                            mode = M_NORMAL
-                    elif mode == M_NEGOTIATE: # DO, DONT, WILL, WONT was received, option now following
-                        self._telnetNegotiateOption(telnet_command, byte)
-                        mode = M_NORMAL
-        finally:
-            self._thread = None
-            if self.logger:
-                self.logger.debug("read thread terminated")
-
-    # - incoming telnet commands and options
-
-    def _telnetProcessCommand(self, command):
-        """Process commands other than DO, DONT, WILL, WONT."""
-        # Currently none. RFC2217 only uses negotiation and subnegotiation.
-        if self.logger:
-            self.logger.warning("ignoring Telnet command: %r" % (command,))
-
-    def _telnetNegotiateOption(self, command, option):
-        """Process incoming DO, DONT, WILL, WONT."""
-        # check our registered telnet options and forward command to them
-        # they know themselves if they have to answer or not
-        known = False
-        for item in self._telnet_options:
-            # can have more than one match! as some options are duplicated for
-            # 'us' and 'them'
-            if item.option == option:
-                item.process_incoming(command)
-                known = True
-        if not known:
-            # handle unknown options
-            # only answer to positive requests and deny them
-            if command == WILL or command == DO:
-                self.telnetSendOption((command == WILL and DONT or WONT), option)
-                if self.logger:
-                    self.logger.warning("rejected Telnet option: %r" % (option,))
-
-
-    def _telnetProcessSubnegotiation(self, suboption):
-        """Process subnegotiation, the data between IAC SB and IAC SE."""
-        if suboption[0:1] == COM_PORT_OPTION:
-            if suboption[1:2] == SERVER_NOTIFY_LINESTATE and len(suboption) >= 3:
-                self._linestate = ord(suboption[2:3]) # ensure it is a number
-                if self.logger:
-                    self.logger.info("NOTIFY_LINESTATE: %s" % self._linestate)
-            elif suboption[1:2] == SERVER_NOTIFY_MODEMSTATE and len(suboption) >= 3:
-                self._modemstate = ord(suboption[2:3]) # ensure it is a number
-                if self.logger:
-                    self.logger.info("NOTIFY_MODEMSTATE: %s" % self._modemstate)
-                # update time when we think that a poll would make sense
-                self._modemstate_expires = time.time() + 0.3
-            elif suboption[1:2] == FLOWCONTROL_SUSPEND:
-                self._remote_suspend_flow = True
-            elif suboption[1:2] == FLOWCONTROL_RESUME:
-                self._remote_suspend_flow = False
-            else:
-                for item in self._rfc2217_options.values():
-                    if item.ack_option == suboption[1:2]:
-                        #~ print "processing COM_PORT_OPTION: %r" % list(suboption[1:])
-                        item.checkAnswer(bytes(suboption[2:]))
-                        break
-                else:
-                    if self.logger:
-                        self.logger.warning("ignoring COM_PORT_OPTION: %r" % (suboption,))
-        else:
-            if self.logger:
-                self.logger.warning("ignoring subnegotiation: %r" % (suboption,))
-
-    # - outgoing telnet commands and options
-
-    def _internal_raw_write(self, data):
-        """internal socket write with no data escaping. used to send telnet stuff."""
-        self._write_lock.acquire()
-        try:
-            self._socket.sendall(data)
-        finally:
-            self._write_lock.release()
-
-    def telnetSendOption(self, action, option):
-        """Send DO, DONT, WILL, WONT."""
-        self._internal_raw_write(to_bytes([IAC, action, option]))
-
-    def rfc2217SendSubnegotiation(self, option, value=''):
-        """Subnegotiation of RFC2217 parameters."""
-        value = value.replace(IAC, IAC_DOUBLED)
-        self._internal_raw_write(to_bytes([IAC, SB, COM_PORT_OPTION, option] + list(value) + [IAC, SE]))
-
-    def rfc2217SendPurge(self, value):
-        item = self._rfc2217_options['purge']
-        item.set(value) # transmit desired purge type
-        item.wait(self._network_timeout) # wait for acknowledge from the server
-
-    def rfc2217SetControl(self, value):
-        item = self._rfc2217_options['control']
-        item.set(value) # transmit desired control type
-        if self._ignore_set_control_answer:
-            # answers are ignored when option is set. compatibility mode for
-            # servers that answer, but not the expected one... (or no answer
-            # at all) i.e. sredird
-            time.sleep(0.1)  # this helps getting the unit tests passed
-        else:
-            item.wait(self._network_timeout)  # wait for acknowledge from the server
-
-    def rfc2217FlowServerReady(self):
-        """\
-        check if server is ready to receive data. block for some time when
-        not.
-        """
-        #~ if self._remote_suspend_flow:
-            #~ wait---
-
-    def getModemState(self):
-        """\
-        get last modem state (cached value. if value is "old", request a new
-        one. this cache helps that we don't issue to many requests when e.g. all
-        status lines, one after the other is queried by te user (getCTS, getDSR
-        etc.)
-        """
-        # active modem state polling enabled? is the value fresh enough?
-        if self._poll_modem_state and self._modemstate_expires < time.time():
-            if self.logger:
-                self.logger.debug('polling modem state')
-            # when it is older, request an update
-            self.rfc2217SendSubnegotiation(NOTIFY_MODEMSTATE)
-            timeout_time = time.time() + self._network_timeout
-            while time.time() < timeout_time:
-                time.sleep(0.05)    # prevent 100% CPU load
-                # when expiration time is updated, it means that there is a new
-                # value
-                if self._modemstate_expires > time.time():
-                    if self.logger:
-                        self.logger.warning('poll for modem state failed')
-                    break
-            # even when there is a timeout, do not generate an error just
-            # return the last known value. this way we can support buggy
-            # servers that do not respond to polls, but send automatic
-            # updates.
-        if self._modemstate is not None:
-            if self.logger:
-                self.logger.debug('using cached modem state')
-            return self._modemstate
-        else:
-            # never received a notification from the server
-            raise SerialException("remote sends no NOTIFY_MODEMSTATE")
-
-
-# assemble Serial class with the platform specific implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(RFC2217Serial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(RFC2217Serial, io.RawIOBase):
-        pass
-
-
-#############################################################################
-# The following is code that helps implementing an RFC 2217 server.
-
-class PortManager(object):
-    """\
-    This class manages the state of Telnet and RFC 2217. It needs a serial
-    instance and a connection to work with. Connection is expected to implement
-    a (thread safe) write function, that writes the string to the network.
-    """
-
-    def __init__(self, serial_port, connection, logger=None):
-        self.serial = serial_port
-        self.connection = connection
-        self.logger = logger
-        self._client_is_rfc2217 = False
-
-        # filter state machine
-        self.mode = M_NORMAL
-        self.suboption = None
-        self.telnet_command = None
-
-        # states for modem/line control events
-        self.modemstate_mask = 255
-        self.last_modemstate = None
-        self.linstate_mask = 0
-
-        # all supported telnet options
-        self._telnet_options = [
-            TelnetOption(self, 'ECHO', ECHO, WILL, WONT, DO, DONT, REQUESTED),
-            TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED),
-            TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, INACTIVE),
-            TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE),
-            TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, REQUESTED),
-            TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED, self._client_ok),
-            TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, INACTIVE, self._client_ok),
-            ]
-
-        # negotiate Telnet/RFC2217 -> send initial requests
-        if self.logger:
-            self.logger.debug("requesting initial Telnet/RFC 2217 options")
-        for option in self._telnet_options:
-            if option.state is REQUESTED:
-                self.telnetSendOption(option.send_yes, option.option)
-        # issue 1st modem state notification
-
-    def _client_ok(self):
-        """\
-        callback of telnet option. it gets called when option is activated.
-        this one here is used to detect when the client agrees on RFC 2217. a
-        flag is set so that other functions like check_modem_lines know if the
-        client is ok.
-        """
-        # The callback is used for we and they so if one party agrees, we're
-        # already happy. it seems not all servers do the negotiation correctly
-        # and i guess there are incorrect clients too.. so be happy if client
-        # answers one or the other positively.
-        self._client_is_rfc2217 = True
-        if self.logger:
-            self.logger.info("client accepts RFC 2217")
-        # this is to ensure that the client gets a notification, even if there
-        # was no change
-        self.check_modem_lines(force_notification=True)
-
-    # - outgoing telnet commands and options
-
-    def telnetSendOption(self, action, option):
-        """Send DO, DONT, WILL, WONT."""
-        self.connection.write(to_bytes([IAC, action, option]))
-
-    def rfc2217SendSubnegotiation(self, option, value=''):
-        """Subnegotiation of RFC 2217 parameters."""
-        value = value.replace(IAC, IAC_DOUBLED)
-        self.connection.write(to_bytes([IAC, SB, COM_PORT_OPTION, option] + list(value) + [IAC, SE]))
-
-    # - check modem lines, needs to be called periodically from user to
-    # establish polling
-
-    def check_modem_lines(self, force_notification=False):
-        modemstate = (
-            (self.serial.getCTS() and MODEMSTATE_MASK_CTS) |
-            (self.serial.getDSR() and MODEMSTATE_MASK_DSR) |
-            (self.serial.getRI() and MODEMSTATE_MASK_RI) |
-            (self.serial.getCD() and MODEMSTATE_MASK_CD)
-        )
-        # check what has changed
-        deltas = modemstate ^ (self.last_modemstate or 0) # when last is None -> 0
-        if deltas & MODEMSTATE_MASK_CTS:
-            modemstate |= MODEMSTATE_MASK_CTS_CHANGE
-        if deltas & MODEMSTATE_MASK_DSR:
-            modemstate |= MODEMSTATE_MASK_DSR_CHANGE
-        if deltas & MODEMSTATE_MASK_RI:
-            modemstate |= MODEMSTATE_MASK_RI_CHANGE
-        if deltas & MODEMSTATE_MASK_CD:
-            modemstate |= MODEMSTATE_MASK_CD_CHANGE
-        # if new state is different and the mask allows this change, send
-        # notification. suppress notifications when client is not rfc2217
-        if modemstate != self.last_modemstate or force_notification:
-            if (self._client_is_rfc2217 and (modemstate & self.modemstate_mask)) or force_notification:
-                self.rfc2217SendSubnegotiation(
-                    SERVER_NOTIFY_MODEMSTATE,
-                    to_bytes([modemstate & self.modemstate_mask])
-                    )
-                if self.logger:
-                    self.logger.info("NOTIFY_MODEMSTATE: %s" % (modemstate,))
-            # save last state, but forget about deltas.
-            # otherwise it would also notify about changing deltas which is
-            # probably not very useful
-            self.last_modemstate = modemstate & 0xf0
-
-    # - outgoing data escaping
-
-    def escape(self, data):
-        """\
-        this generator function is for the user. all outgoing data has to be
-        properly escaped, so that no IAC character in the data stream messes up
-        the Telnet state machine in the server.
-
-        socket.sendall(escape(data))
-        """
-        for byte in data:
-            if byte == IAC:
-                yield IAC
-                yield IAC
-            else:
-                yield byte
-
-    # - incoming data filter
-
-    def filter(self, data):
-        """\
-        handle a bunch of incoming bytes. this is a generator. it will yield
-        all characters not of interest for Telnet/RFC 2217.
-
-        The idea is that the reader thread pushes data from the socket through
-        this filter:
-
-        for byte in filter(socket.recv(1024)):
-            # do things like CR/LF conversion/whatever
-            # and write data to the serial port
-            serial.write(byte)
-
-        (socket error handling code left as exercise for the reader)
-        """
-        for byte in data:
-            if self.mode == M_NORMAL:
-                # interpret as command or as data
-                if byte == IAC:
-                    self.mode = M_IAC_SEEN
-                else:
-                    # store data in sub option buffer or pass it to our
-                    # consumer depending on state
-                    if self.suboption is not None:
-                        self.suboption.append(byte)
-                    else:
-                        yield byte
-            elif self.mode == M_IAC_SEEN:
-                if byte == IAC:
-                    # interpret as command doubled -> insert character
-                    # itself
-                    if self.suboption is not None:
-                        self.suboption.append(byte)
-                    else:
-                        yield byte
-                    self.mode = M_NORMAL
-                elif byte == SB:
-                    # sub option start
-                    self.suboption = bytearray()
-                    self.mode = M_NORMAL
-                elif byte == SE:
-                    # sub option end -> process it now
-                    self._telnetProcessSubnegotiation(bytes(self.suboption))
-                    self.suboption = None
-                    self.mode = M_NORMAL
-                elif byte in (DO, DONT, WILL, WONT):
-                    # negotiation
-                    self.telnet_command = byte
-                    self.mode = M_NEGOTIATE
-                else:
-                    # other telnet commands
-                    self._telnetProcessCommand(byte)
-                    self.mode = M_NORMAL
-            elif self.mode == M_NEGOTIATE: # DO, DONT, WILL, WONT was received, option now following
-                self._telnetNegotiateOption(self.telnet_command, byte)
-                self.mode = M_NORMAL
-
-    # - incoming telnet commands and options
-
-    def _telnetProcessCommand(self, command):
-        """Process commands other than DO, DONT, WILL, WONT."""
-        # Currently none. RFC2217 only uses negotiation and subnegotiation.
-        if self.logger:
-            self.logger.warning("ignoring Telnet command: %r" % (command,))
-
-    def _telnetNegotiateOption(self, command, option):
-        """Process incoming DO, DONT, WILL, WONT."""
-        # check our registered telnet options and forward command to them
-        # they know themselves if they have to answer or not
-        known = False
-        for item in self._telnet_options:
-            # can have more than one match! as some options are duplicated for
-            # 'us' and 'them'
-            if item.option == option:
-                item.process_incoming(command)
-                known = True
-        if not known:
-            # handle unknown options
-            # only answer to positive requests and deny them
-            if command == WILL or command == DO:
-                self.telnetSendOption((command == WILL and DONT or WONT), option)
-                if self.logger:
-                    self.logger.warning("rejected Telnet option: %r" % (option,))
-
-
-    def _telnetProcessSubnegotiation(self, suboption):
-        """Process subnegotiation, the data between IAC SB and IAC SE."""
-        if suboption[0:1] == COM_PORT_OPTION:
-            if self.logger:
-                self.logger.debug('received COM_PORT_OPTION: %r' % (suboption,))
-            if suboption[1:2] == SET_BAUDRATE:
-                backup = self.serial.baudrate
-                try:
-                    (baudrate,) = struct.unpack("!I", suboption[2:6])
-                    if baudrate != 0:
-                        self.serial.baudrate = baudrate
-                except ValueError, e:
-                    if self.logger:
-                        self.logger.error("failed to set baud rate: %s" % (e,))
-                    self.serial.baudrate = backup
-                else:
-                    if self.logger:
-                        self.logger.info("%s baud rate: %s" % (baudrate and 'set' or 'get', self.serial.baudrate))
-                self.rfc2217SendSubnegotiation(SERVER_SET_BAUDRATE, struct.pack("!I", self.serial.baudrate))
-            elif suboption[1:2] == SET_DATASIZE:
-                backup = self.serial.bytesize
-                try:
-                    (datasize,) = struct.unpack("!B", suboption[2:3])
-                    if datasize != 0:
-                        self.serial.bytesize = datasize
-                except ValueError, e:
-                    if self.logger:
-                        self.logger.error("failed to set data size: %s" % (e,))
-                    self.serial.bytesize = backup
-                else:
-                    if self.logger:
-                        self.logger.info("%s data size: %s" % (datasize and 'set' or 'get', self.serial.bytesize))
-                self.rfc2217SendSubnegotiation(SERVER_SET_DATASIZE, struct.pack("!B", self.serial.bytesize))
-            elif suboption[1:2] == SET_PARITY:
-                backup = self.serial.parity
-                try:
-                    parity = struct.unpack("!B", suboption[2:3])[0]
-                    if parity != 0:
-                            self.serial.parity = RFC2217_REVERSE_PARITY_MAP[parity]
-                except ValueError, e:
-                    if self.logger:
-                        self.logger.error("failed to set parity: %s" % (e,))
-                    self.serial.parity = backup
-                else:
-                    if self.logger:
-                        self.logger.info("%s parity: %s" % (parity and 'set' or 'get', self.serial.parity))
-                self.rfc2217SendSubnegotiation(
-                    SERVER_SET_PARITY,
-                    struct.pack("!B", RFC2217_PARITY_MAP[self.serial.parity])
-                    )
-            elif suboption[1:2] == SET_STOPSIZE:
-                backup = self.serial.stopbits
-                try:
-                    stopbits = struct.unpack("!B", suboption[2:3])[0]
-                    if stopbits != 0:
-                        self.serial.stopbits = RFC2217_REVERSE_STOPBIT_MAP[stopbits]
-                except ValueError, e:
-                    if self.logger:
-                        self.logger.error("failed to set stop bits: %s" % (e,))
-                    self.serial.stopbits = backup
-                else:
-                    if self.logger:
-                        self.logger.info("%s stop bits: %s" % (stopbits and 'set' or 'get', self.serial.stopbits))
-                self.rfc2217SendSubnegotiation(
-                    SERVER_SET_STOPSIZE,
-                    struct.pack("!B", RFC2217_STOPBIT_MAP[self.serial.stopbits])
-                    )
-            elif suboption[1:2] == SET_CONTROL:
-                if suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING:
-                    if self.serial.xonxoff:
-                        self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL)
-                    elif self.serial.rtscts:
-                        self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL)
-                    else:
-                        self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL:
-                    self.serial.xonxoff = False
-                    self.serial.rtscts = False
-                    if self.logger:
-                        self.logger.info("changed flow control to None")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTROL:
-                    self.serial.xonxoff = True
-                    if self.logger:
-                        self.logger.info("changed flow control to XON/XOFF")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTROL:
-                    self.serial.rtscts = True
-                    if self.logger:
-                        self.logger.info("changed flow control to RTS/CTS")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_REQ_BREAK_STATE:
-                    if self.logger:
-                        self.logger.warning("requested break state - not implemented")
-                    pass # XXX needs cached value
-                elif suboption[2:3] == SET_CONTROL_BREAK_ON:
-                    self.serial.setBreak(True)
-                    if self.logger:
-                        self.logger.info("changed BREAK to active")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_ON)
-                elif suboption[2:3] == SET_CONTROL_BREAK_OFF:
-                    self.serial.setBreak(False)
-                    if self.logger:
-                        self.logger.info("changed BREAK to inactive")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_OFF)
-                elif suboption[2:3] == SET_CONTROL_REQ_DTR:
-                    if self.logger:
-                        self.logger.warning("requested DTR state - not implemented")
-                    pass # XXX needs cached value
-                elif suboption[2:3] == SET_CONTROL_DTR_ON:
-                    self.serial.setDTR(True)
-                    if self.logger:
-                        self.logger.info("changed DTR to active")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_ON)
-                elif suboption[2:3] == SET_CONTROL_DTR_OFF:
-                    self.serial.setDTR(False)
-                    if self.logger:
-                        self.logger.info("changed DTR to inactive")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_OFF)
-                elif suboption[2:3] == SET_CONTROL_REQ_RTS:
-                    if self.logger:
-                        self.logger.warning("requested RTS state - not implemented")
-                    pass # XXX needs cached value
-                    #~ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON)
-                elif suboption[2:3] == SET_CONTROL_RTS_ON:
-                    self.serial.setRTS(True)
-                    if self.logger:
-                        self.logger.info("changed RTS to active")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON)
-                elif suboption[2:3] == SET_CONTROL_RTS_OFF:
-                    self.serial.setRTS(False)
-                    if self.logger:
-                        self.logger.info("changed RTS to inactive")
-                    self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_OFF)
-                #~ elif suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTOL_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTOL_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_DCD_FLOW_CONTROL:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_DTR_FLOW_CONTROL:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_DSR_FLOW_CONTROL:
-            elif suboption[1:2] == NOTIFY_LINESTATE:
-                # client polls for current state
-                self.rfc2217SendSubnegotiation(
-                    SERVER_NOTIFY_LINESTATE,
-                    to_bytes([0])   # sorry, nothing like that implemented
-                    )
-            elif suboption[1:2] == NOTIFY_MODEMSTATE:
-                if self.logger:
-                    self.logger.info("request for modem state")
-                # client polls for current state
-                self.check_modem_lines(force_notification=True)
-            elif suboption[1:2] == FLOWCONTROL_SUSPEND:
-                if self.logger:
-                    self.logger.info("suspend")
-                self._remote_suspend_flow = True
-            elif suboption[1:2] == FLOWCONTROL_RESUME:
-                if self.logger:
-                    self.logger.info("resume")
-                self._remote_suspend_flow = False
-            elif suboption[1:2] == SET_LINESTATE_MASK:
-                self.linstate_mask = ord(suboption[2:3]) # ensure it is a number
-                if self.logger:
-                    self.logger.info("line state mask: 0x%02x" % (self.linstate_mask,))
-            elif suboption[1:2] == SET_MODEMSTATE_MASK:
-                self.modemstate_mask = ord(suboption[2:3]) # ensure it is a number
-                if self.logger:
-                    self.logger.info("modem state mask: 0x%02x" % (self.modemstate_mask,))
-            elif suboption[1:2] == PURGE_DATA:
-                if suboption[2:3] == PURGE_RECEIVE_BUFFER:
-                    self.serial.flushInput()
-                    if self.logger:
-                        self.logger.info("purge in")
-                    self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_RECEIVE_BUFFER)
-                elif suboption[2:3] == PURGE_TRANSMIT_BUFFER:
-                    self.serial.flushOutput()
-                    if self.logger:
-                        self.logger.info("purge out")
-                    self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_TRANSMIT_BUFFER)
-                elif suboption[2:3] == PURGE_BOTH_BUFFERS:
-                    self.serial.flushInput()
-                    self.serial.flushOutput()
-                    if self.logger:
-                        self.logger.info("purge both")
-                    self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_BOTH_BUFFERS)
-                else:
-                    if self.logger:
-                        self.logger.error("undefined PURGE_DATA: %r" % list(suboption[2:]))
-            else:
-                if self.logger:
-                    self.logger.error("undefined COM_PORT_OPTION: %r" % list(suboption[1:]))
-        else:
-            if self.logger:
-                self.logger.warning("unknown subnegotiation: %r" % (suboption,))
-
-
-# simple client test
-if __name__ == '__main__':
-    import sys
-    s = Serial('rfc2217://localhost:7000', 115200)
-    sys.stdout.write('%s\n' % s)
-
-    #~ s.baudrate = 1898
-
-    sys.stdout.write("write...\n")
-    s.write("hello\n")
-    s.flush()
-    sys.stdout.write("read: %s\n" % s.read(5))
-
-    #~ s.baudrate = 19200
-    #~ s.databits = 7
-    s.close()
diff --git a/systrace/catapult/third_party/pyserial/serial/serialcli.py b/systrace/catapult/third_party/pyserial/serial/serialcli.py
deleted file mode 100644
index 19169a3..0000000
--- a/systrace/catapult/third_party/pyserial/serial/serialcli.py
+++ /dev/null
@@ -1,273 +0,0 @@
-#! python
-# Python Serial Port Extension for Win32, Linux, BSD, Jython and .NET/Mono
-# serial driver for .NET/Mono (IronPython), .NET >= 2
-# see __init__.py
-#
-# (C) 2008 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-import clr
-import System
-import System.IO.Ports
-from serial.serialutil import *
-
-
-def device(portnum):
-    """Turn a port number into a device name"""
-    return System.IO.Ports.SerialPort.GetPortNames()[portnum]
-
-
-# must invoke function with byte array, make a helper to convert strings
-# to byte arrays
-sab = System.Array[System.Byte]
-def as_byte_array(string):
-    return sab([ord(x) for x in string])  # XXX will require adaption when run with a 3.x compatible IronPython
-
-class IronSerial(SerialBase):
-    """Serial port implementation for .NET/Mono."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                9600, 19200, 38400, 57600, 115200)
-
-    def open(self):
-        """Open port with current settings. This may throw a SerialException
-           if the port cannot be opened."""
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        try:
-            self._port_handle = System.IO.Ports.SerialPort(self.portstr)
-        except Exception, msg:
-            self._port_handle = None
-            raise SerialException("could not open port %s: %s" % (self.portstr, msg))
-
-        self._reconfigurePort()
-        self._port_handle.Open()
-        self._isOpen = True
-        if not self._rtscts:
-            self.setRTS(True)
-            self.setDTR(True)
-        self.flushInput()
-        self.flushOutput()
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port."""
-        if not self._port_handle:
-            raise SerialException("Can only operate on a valid port handle")
-
-        #~ self._port_handle.ReceivedBytesThreshold = 1
-
-        if self._timeout is None:
-            self._port_handle.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout
-        else:
-            self._port_handle.ReadTimeout = int(self._timeout*1000)
-
-        # if self._timeout != 0 and self._interCharTimeout is not None:
-            # timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:]
-
-        if self._writeTimeout is None:
-            self._port_handle.WriteTimeout = System.IO.Ports.SerialPort.InfiniteTimeout
-        else:
-            self._port_handle.WriteTimeout = int(self._writeTimeout*1000)
-
-
-        # Setup the connection info.
-        try:
-            self._port_handle.BaudRate = self._baudrate
-        except IOError, e:
-            # catch errors from illegal baudrate settings
-            raise ValueError(str(e))
-
-        if self._bytesize == FIVEBITS:
-            self._port_handle.DataBits     = 5
-        elif self._bytesize == SIXBITS:
-            self._port_handle.DataBits     = 6
-        elif self._bytesize == SEVENBITS:
-            self._port_handle.DataBits     = 7
-        elif self._bytesize == EIGHTBITS:
-            self._port_handle.DataBits     = 8
-        else:
-            raise ValueError("Unsupported number of data bits: %r" % self._bytesize)
-
-        if self._parity == PARITY_NONE:
-            self._port_handle.Parity       = getattr(System.IO.Ports.Parity, 'None') # reserved keyword in Py3k
-        elif self._parity == PARITY_EVEN:
-            self._port_handle.Parity       = System.IO.Ports.Parity.Even
-        elif self._parity == PARITY_ODD:
-            self._port_handle.Parity       = System.IO.Ports.Parity.Odd
-        elif self._parity == PARITY_MARK:
-            self._port_handle.Parity       = System.IO.Ports.Parity.Mark
-        elif self._parity == PARITY_SPACE:
-            self._port_handle.Parity       = System.IO.Ports.Parity.Space
-        else:
-            raise ValueError("Unsupported parity mode: %r" % self._parity)
-
-        if self._stopbits == STOPBITS_ONE:
-            self._port_handle.StopBits     = System.IO.Ports.StopBits.One
-        elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
-            self._port_handle.StopBits     = System.IO.Ports.StopBits.OnePointFive
-        elif self._stopbits == STOPBITS_TWO:
-            self._port_handle.StopBits     = System.IO.Ports.StopBits.Two
-        else:
-            raise ValueError("Unsupported number of stop bits: %r" % self._stopbits)
-
-        if self._rtscts and self._xonxoff:
-            self._port_handle.Handshake  = System.IO.Ports.Handshake.RequestToSendXOnXOff
-        elif self._rtscts:
-            self._port_handle.Handshake  = System.IO.Ports.Handshake.RequestToSend
-        elif self._xonxoff:
-            self._port_handle.Handshake  = System.IO.Ports.Handshake.XOnXOff
-        else:
-            self._port_handle.Handshake  = getattr(System.IO.Ports.Handshake, 'None')   # reserved keyword in Py3k
-
-    #~ def __del__(self):
-        #~ self.close()
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            if self._port_handle:
-                try:
-                    self._port_handle.Close()
-                except System.IO.Ports.InvalidOperationException:
-                    # ignore errors. can happen for unplugged USB serial devices
-                    pass
-                self._port_handle = None
-            self._isOpen = False
-
-    def makeDeviceName(self, port):
-        try:
-            return device(port)
-        except TypeError, e:
-            raise SerialException(str(e))
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self._port_handle: raise portNotOpenError
-        return self._port_handle.BytesToRead
-
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-           return less characters as requested. With no timeout it will block
-           until the requested number of bytes is read."""
-        if not self._port_handle: raise portNotOpenError
-        # must use single byte reads as this is the only way to read
-        # without applying encodings
-        data = bytearray()
-        while size:
-            try:
-                data.append(self._port_handle.ReadByte())
-            except System.TimeoutException, e:
-                break
-            else:
-                size -= 1
-        return bytes(data)
-
-    def write(self, data):
-        """Output the given string over the serial port."""
-        if not self._port_handle: raise portNotOpenError
-        if not isinstance(data, (bytes, bytearray)):
-            raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
-        try:
-            # must call overloaded method with byte array argument
-            # as this is the only one not applying encodings
-            self._port_handle.Write(as_byte_array(data), 0, len(data))
-        except System.TimeoutException, e:
-            raise writeTimeoutError
-        return len(data)
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self._port_handle: raise portNotOpenError
-        self._port_handle.DiscardInBuffer()
-
-    def flushOutput(self):
-        """Clear output buffer, aborting the current output and
-        discarding all that is in the buffer."""
-        if not self._port_handle: raise portNotOpenError
-        self._port_handle.DiscardOutBuffer()
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given duration."""
-        if not self._port_handle: raise portNotOpenError
-        import time
-        self._port_handle.BreakState = True
-        time.sleep(duration)
-        self._port_handle.BreakState = False
-
-    def setBreak(self, level=True):
-        """Set break: Controls TXD. When active, to transmitting is possible."""
-        if not self._port_handle: raise portNotOpenError
-        self._port_handle.BreakState = bool(level)
-
-    def setRTS(self, level=True):
-        """Set terminal status line: Request To Send"""
-        if not self._port_handle: raise portNotOpenError
-        self._port_handle.RtsEnable = bool(level)
-
-    def setDTR(self, level=True):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self._port_handle: raise portNotOpenError
-        self._port_handle.DtrEnable = bool(level)
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send"""
-        if not self._port_handle: raise portNotOpenError
-        return self._port_handle.CtsHolding
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self._port_handle: raise portNotOpenError
-        return self._port_handle.DsrHolding
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self._port_handle: raise portNotOpenError
-        #~ return self._port_handle.XXX
-        return False #XXX an error would be better
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self._port_handle: raise portNotOpenError
-        return self._port_handle.CDHolding
-
-    # - - platform specific - - - -
-    # none
-
-
-# assemble Serial class with the platform specific implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(IronSerial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(IronSerial, io.RawIOBase):
-        pass
-
-
-# Nur Testfunktion!!
-if __name__ == '__main__':
-    import sys
-
-    s = Serial(0)
-    sys.stdio.write('%s\n' % s)
-
-    s = Serial()
-    sys.stdio.write('%s\n' % s)
-
-
-    s.baudrate = 19200
-    s.databits = 7
-    s.close()
-    s.port = 0
-    s.open()
-    sys.stdio.write('%s\n' % s)
-
diff --git a/systrace/catapult/third_party/pyserial/serial/serialjava.py b/systrace/catapult/third_party/pyserial/serial/serialjava.py
deleted file mode 100644
index 46a78f8..0000000
--- a/systrace/catapult/third_party/pyserial/serial/serialjava.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#!jython
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# module for serial IO for Jython and JavaComm
-# see __init__.py
-#
-# (C) 2002-2008 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-from serial.serialutil import *
-
-def my_import(name):
-    mod = __import__(name)
-    components = name.split('.')
-    for comp in components[1:]:
-        mod = getattr(mod, comp)
-    return mod
-
-
-def detect_java_comm(names):
-    """try given list of modules and return that imports"""
-    for name in names:
-        try:
-            mod = my_import(name)
-            mod.SerialPort
-            return mod
-        except (ImportError, AttributeError):
-            pass
-    raise ImportError("No Java Communications API implementation found")
-
-
-# Java Communications API implementations
-# http://mho.republika.pl/java/comm/
-
-comm = detect_java_comm([
-    'javax.comm', # Sun/IBM
-    'gnu.io',     # RXTX
-])
-
-
-def device(portnumber):
-    """Turn a port number into a device name"""
-    enum = comm.CommPortIdentifier.getPortIdentifiers()
-    ports = []
-    while enum.hasMoreElements():
-        el = enum.nextElement()
-        if el.getPortType() == comm.CommPortIdentifier.PORT_SERIAL:
-            ports.append(el)
-    return ports[portnumber].getName()
-
-
-class JavaSerial(SerialBase):
-    """Serial port class, implemented with Java Communications API and
-       thus usable with jython and the appropriate java extension."""
-
-    def open(self):
-        """Open port with current settings. This may throw a SerialException
-           if the port cannot be opened."""
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        if type(self._port) == type(''):      # strings are taken directly
-            portId = comm.CommPortIdentifier.getPortIdentifier(self._port)
-        else:
-            portId = comm.CommPortIdentifier.getPortIdentifier(device(self._port))     # numbers are transformed to a comport id obj
-        try:
-            self.sPort = portId.open("python serial module", 10)
-        except Exception, msg:
-            self.sPort = None
-            raise SerialException("Could not open port: %s" % msg)
-        self._reconfigurePort()
-        self._instream = self.sPort.getInputStream()
-        self._outstream = self.sPort.getOutputStream()
-        self._isOpen = True
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port."""
-        if not self.sPort:
-            raise SerialException("Can only operate on a valid port handle")
-
-        self.sPort.enableReceiveTimeout(30)
-        if self._bytesize == FIVEBITS:
-            jdatabits = comm.SerialPort.DATABITS_5
-        elif self._bytesize == SIXBITS:
-            jdatabits = comm.SerialPort.DATABITS_6
-        elif self._bytesize == SEVENBITS:
-            jdatabits = comm.SerialPort.DATABITS_7
-        elif self._bytesize == EIGHTBITS:
-            jdatabits = comm.SerialPort.DATABITS_8
-        else:
-            raise ValueError("unsupported bytesize: %r" % self._bytesize)
-
-        if self._stopbits == STOPBITS_ONE:
-            jstopbits = comm.SerialPort.STOPBITS_1
-        elif stopbits == STOPBITS_ONE_POINT_FIVE:
-            self._jstopbits = comm.SerialPort.STOPBITS_1_5
-        elif self._stopbits == STOPBITS_TWO:
-            jstopbits = comm.SerialPort.STOPBITS_2
-        else:
-            raise ValueError("unsupported number of stopbits: %r" % self._stopbits)
-
-        if self._parity == PARITY_NONE:
-            jparity = comm.SerialPort.PARITY_NONE
-        elif self._parity == PARITY_EVEN:
-            jparity = comm.SerialPort.PARITY_EVEN
-        elif self._parity == PARITY_ODD:
-            jparity = comm.SerialPort.PARITY_ODD
-        elif self._parity == PARITY_MARK:
-            jparity = comm.SerialPort.PARITY_MARK
-        elif self._parity == PARITY_SPACE:
-            jparity = comm.SerialPort.PARITY_SPACE
-        else:
-            raise ValueError("unsupported parity type: %r" % self._parity)
-
-        jflowin = jflowout = 0
-        if self._rtscts:
-            jflowin  |=  comm.SerialPort.FLOWCONTROL_RTSCTS_IN
-            jflowout |=  comm.SerialPort.FLOWCONTROL_RTSCTS_OUT
-        if self._xonxoff:
-            jflowin  |=  comm.SerialPort.FLOWCONTROL_XONXOFF_IN
-            jflowout |=  comm.SerialPort.FLOWCONTROL_XONXOFF_OUT
-
-        self.sPort.setSerialPortParams(self._baudrate, jdatabits, jstopbits, jparity)
-        self.sPort.setFlowControlMode(jflowin | jflowout)
-
-        if self._timeout >= 0:
-            self.sPort.enableReceiveTimeout(self._timeout*1000)
-        else:
-            self.sPort.disableReceiveTimeout()
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            if self.sPort:
-                self._instream.close()
-                self._outstream.close()
-                self.sPort.close()
-                self.sPort = None
-            self._isOpen = False
-
-    def makeDeviceName(self, port):
-        return device(port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self.sPort: raise portNotOpenError
-        return self._instream.available()
-
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-           return less characters as requested. With no timeout it will block
-           until the requested number of bytes is read."""
-        if not self.sPort: raise portNotOpenError
-        read = bytearray()
-        if size > 0:
-            while len(read) < size:
-                x = self._instream.read()
-                if x == -1:
-                    if self.timeout >= 0:
-                        break
-                else:
-                    read.append(x)
-        return bytes(read)
-
-    def write(self, data):
-        """Output the given string over the serial port."""
-        if not self.sPort: raise portNotOpenError
-        if not isinstance(data, (bytes, bytearray)):
-            raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
-        self._outstream.write(data)
-        return len(data)
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.sPort: raise portNotOpenError
-        self._instream.skip(self._instream.available())
-
-    def flushOutput(self):
-        """Clear output buffer, aborting the current output and
-        discarding all that is in the buffer."""
-        if not self.sPort: raise portNotOpenError
-        self._outstream.flush()
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given duration."""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.sendBreak(duration*1000.0)
-
-    def setBreak(self, level=1):
-        """Set break: Controls TXD. When active, to transmitting is possible."""
-        if self.fd is None: raise portNotOpenError
-        raise SerialException("The setBreak function is not implemented in java.")
-
-    def setRTS(self, level=1):
-        """Set terminal status line: Request To Send"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.setRTS(level)
-
-    def setDTR(self, level=1):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.setDTR(level)
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.isCTS()
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.isDSR()
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.isRI()
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.sPort: raise portNotOpenError
-        self.sPort.isCD()
-
-
-# assemble Serial class with the platform specific implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(JavaSerial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(JavaSerial, io.RawIOBase):
-        pass
-
-
-if __name__ == '__main__':
-    s = Serial(0,
-         baudrate=19200,        # baudrate
-         bytesize=EIGHTBITS,    # number of databits
-         parity=PARITY_EVEN,    # enable parity checking
-         stopbits=STOPBITS_ONE, # number of stopbits
-         timeout=3,             # set a timeout value, None for waiting forever
-         xonxoff=0,             # enable software flow control
-         rtscts=0,              # enable RTS/CTS flow control
-    )
-    s.setRTS(1)
-    s.setDTR(1)
-    s.flushInput()
-    s.flushOutput()
-    s.write('hello')
-    sys.stdio.write('%r\n' % s.read(5))
-    sys.stdio.write('%s\n' % s.inWaiting())
-    del s
-
-
diff --git a/systrace/catapult/third_party/pyserial/serial/serialposix.py b/systrace/catapult/third_party/pyserial/serial/serialposix.py
deleted file mode 100755
index b9b4b28..0000000
--- a/systrace/catapult/third_party/pyserial/serial/serialposix.py
+++ /dev/null
@@ -1,703 +0,0 @@
-#!/usr/bin/env python
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# module for serial IO for POSIX compatible systems, like Linux
-# see __init__.py
-#
-# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-#
-# parts based on code from Grant B. Edwards  <grante@visi.com>:
-#  ftp://ftp.visi.com/users/grante/python/PosixSerial.py
-#
-# references: http://www.easysw.com/~mike/serial/serial.html
-
-import sys, os, fcntl, termios, struct, select, errno, time
-from serial.serialutil import *
-
-# Do check the Python version as some constants have moved.
-if (sys.hexversion < 0x020100f0):
-    import TERMIOS
-else:
-    TERMIOS = termios
-
-if (sys.hexversion < 0x020200f0):
-    import FCNTL
-else:
-    FCNTL = fcntl
-
-# try to detect the OS so that a device can be selected...
-# this code block should supply a device() and set_special_baudrate() function
-# for the platform
-plat = sys.platform.lower()
-
-if   plat[:5] == 'linux':    # Linux (confirmed)
-
-    def device(port):
-        return '/dev/ttyS%d' % port
-
-    TCGETS2 = 0x802C542A
-    TCSETS2 = 0x402C542B
-    BOTHER = 0o010000
-
-    def set_special_baudrate(port, baudrate):
-        # right size is 44 on x86_64, allow for some growth
-        import array
-        buf = array.array('i', [0] * 64)
-
-        try:
-            # get serial_struct
-            FCNTL.ioctl(port.fd, TCGETS2, buf)
-            # set custom speed
-            buf[2] &= ~TERMIOS.CBAUD
-            buf[2] |= BOTHER
-            buf[9] = buf[10] = baudrate
-
-            # set serial_struct
-            res = FCNTL.ioctl(port.fd, TCSETS2, buf)
-        except IOError, e:
-            raise ValueError('Failed to set custom baud rate (%s): %s' % (baudrate, e))
-
-    baudrate_constants = {
-        0:       0000000,  # hang up
-        50:      0000001,
-        75:      0000002,
-        110:     0000003,
-        134:     0000004,
-        150:     0000005,
-        200:     0000006,
-        300:     0000007,
-        600:     0000010,
-        1200:    0000011,
-        1800:    0000012,
-        2400:    0000013,
-        4800:    0000014,
-        9600:    0000015,
-        19200:   0000016,
-        38400:   0000017,
-        57600:   0010001,
-        115200:  0010002,
-        230400:  0010003,
-        460800:  0010004,
-        500000:  0010005,
-        576000:  0010006,
-        921600:  0010007,
-        1000000: 0010010,
-        1152000: 0010011,
-        1500000: 0010012,
-        2000000: 0010013,
-        2500000: 0010014,
-        3000000: 0010015,
-        3500000: 0010016,
-        4000000: 0010017
-    }
-
-elif plat == 'cygwin':       # cygwin/win32 (confirmed)
-
-    def device(port):
-        return '/dev/com%d' % (port + 1)
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {
-        128000: 0x01003,
-        256000: 0x01005,
-        500000: 0x01007,
-        576000: 0x01008,
-        921600: 0x01009,
-        1000000: 0x0100a,
-        1152000: 0x0100b,
-        1500000: 0x0100c,
-        2000000: 0x0100d,
-        2500000: 0x0100e,
-        3000000: 0x0100f
-    }
-
-elif plat[:7] == 'openbsd':    # OpenBSD
-
-    def device(port):
-        return '/dev/cua%02d' % port
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-elif plat[:3] == 'bsd' or  \
-    plat[:7] == 'freebsd':
-
-    def device(port):
-        return '/dev/cuad%d' % port
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-elif plat[:6] == 'darwin':   # OS X
-
-    version = os.uname()[2].split('.')
-    # Tiger or above can support arbitrary serial speeds
-    if int(version[0]) >= 8:
-        def set_special_baudrate(port, baudrate):
-            # use IOKit-specific call to set up high speeds
-            import array, fcntl
-            buf = array.array('i', [baudrate])
-            IOSSIOSPEED = 0x80045402 #_IOW('T', 2, speed_t)
-            fcntl.ioctl(port.fd, IOSSIOSPEED, buf, 1)
-    else: # version < 8
-        def set_special_baudrate(port, baudrate):
-            raise ValueError("baud rate not supported")
-
-    def device(port):
-        return '/dev/cuad%d' % port
-
-    baudrate_constants = {}
-
-
-elif plat[:6] == 'netbsd':   # NetBSD 1.6 testing by Erk
-
-    def device(port):
-        return '/dev/dty%02d' % port
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-elif plat[:4] == 'irix':     # IRIX (partially tested)
-
-    def device(port):
-        return '/dev/ttyf%d' % (port+1) #XXX different device names depending on flow control
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-elif plat[:2] == 'hp':       # HP-UX (not tested)
-
-    def device(port):
-        return '/dev/tty%dp0' % (port+1)
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-elif plat[:5] == 'sunos':    # Solaris/SunOS (confirmed)
-
-    def device(port):
-        return '/dev/tty%c' % (ord('a')+port)
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-elif plat[:3] == 'aix':      # AIX
-
-    def device(port):
-        return '/dev/tty%d' % (port)
-
-    def set_special_baudrate(port, baudrate):
-        raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
-
-    baudrate_constants = {}
-
-else:
-    # platform detection has failed...
-    sys.stderr.write("""\
-don't know how to number ttys on this system.
-! Use an explicit path (eg /dev/ttyS1) or send this information to
-! the author of this module:
-
-sys.platform = %r
-os.name = %r
-serialposix.py version = %s
-
-also add the device name of the serial port and where the
-counting starts for the first serial port.
-e.g. 'first serial port: /dev/ttyS0'
-and with a bit luck you can get this module running...
-""" % (sys.platform, os.name, VERSION))
-    # no exception, just continue with a brave attempt to build a device name
-    # even if the device name is not correct for the platform it has chances
-    # to work using a string with the real device name as port parameter.
-    def device(portum):
-        return '/dev/ttyS%d' % portnum
-    def set_special_baudrate(port, baudrate):
-        raise SerialException("sorry don't know how to handle non standard baud rate on this platform")
-    baudrate_constants = {}
-    #~ raise Exception, "this module does not run on this platform, sorry."
-
-# whats up with "aix", "beos", ....
-# they should work, just need to know the device names.
-
-
-# load some constants for later use.
-# try to use values from TERMIOS, use defaults from linux otherwise
-TIOCMGET  = hasattr(TERMIOS, 'TIOCMGET') and TERMIOS.TIOCMGET or 0x5415
-TIOCMBIS  = hasattr(TERMIOS, 'TIOCMBIS') and TERMIOS.TIOCMBIS or 0x5416
-TIOCMBIC  = hasattr(TERMIOS, 'TIOCMBIC') and TERMIOS.TIOCMBIC or 0x5417
-TIOCMSET  = hasattr(TERMIOS, 'TIOCMSET') and TERMIOS.TIOCMSET or 0x5418
-
-#TIOCM_LE = hasattr(TERMIOS, 'TIOCM_LE') and TERMIOS.TIOCM_LE or 0x001
-TIOCM_DTR = hasattr(TERMIOS, 'TIOCM_DTR') and TERMIOS.TIOCM_DTR or 0x002
-TIOCM_RTS = hasattr(TERMIOS, 'TIOCM_RTS') and TERMIOS.TIOCM_RTS or 0x004
-#TIOCM_ST = hasattr(TERMIOS, 'TIOCM_ST') and TERMIOS.TIOCM_ST or 0x008
-#TIOCM_SR = hasattr(TERMIOS, 'TIOCM_SR') and TERMIOS.TIOCM_SR or 0x010
-
-TIOCM_CTS = hasattr(TERMIOS, 'TIOCM_CTS') and TERMIOS.TIOCM_CTS or 0x020
-TIOCM_CAR = hasattr(TERMIOS, 'TIOCM_CAR') and TERMIOS.TIOCM_CAR or 0x040
-TIOCM_RNG = hasattr(TERMIOS, 'TIOCM_RNG') and TERMIOS.TIOCM_RNG or 0x080
-TIOCM_DSR = hasattr(TERMIOS, 'TIOCM_DSR') and TERMIOS.TIOCM_DSR or 0x100
-TIOCM_CD  = hasattr(TERMIOS, 'TIOCM_CD') and TERMIOS.TIOCM_CD or TIOCM_CAR
-TIOCM_RI  = hasattr(TERMIOS, 'TIOCM_RI') and TERMIOS.TIOCM_RI or TIOCM_RNG
-#TIOCM_OUT1 = hasattr(TERMIOS, 'TIOCM_OUT1') and TERMIOS.TIOCM_OUT1 or 0x2000
-#TIOCM_OUT2 = hasattr(TERMIOS, 'TIOCM_OUT2') and TERMIOS.TIOCM_OUT2 or 0x4000
-if hasattr(TERMIOS, 'TIOCINQ'):
-    TIOCINQ = TERMIOS.TIOCINQ
-else:
-    TIOCINQ = hasattr(TERMIOS, 'FIONREAD') and TERMIOS.FIONREAD or 0x541B
-TIOCOUTQ   = hasattr(TERMIOS, 'TIOCOUTQ') and TERMIOS.TIOCOUTQ or 0x5411
-
-TIOCM_zero_str = struct.pack('I', 0)
-TIOCM_RTS_str = struct.pack('I', TIOCM_RTS)
-TIOCM_DTR_str = struct.pack('I', TIOCM_DTR)
-
-TIOCSBRK  = hasattr(TERMIOS, 'TIOCSBRK') and TERMIOS.TIOCSBRK or 0x5427
-TIOCCBRK  = hasattr(TERMIOS, 'TIOCCBRK') and TERMIOS.TIOCCBRK or 0x5428
-
-
-class PosixSerial(SerialBase):
-    """Serial port class POSIX implementation. Serial port configuration is 
-    done with termios and fcntl. Runs on Linux and many other Un*x like
-    systems."""
-
-    def open(self):
-        """Open port with current settings. This may throw a SerialException
-           if the port cannot be opened."""
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        self.fd = None
-        # open
-        try:
-            self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)
-        except IOError, msg:
-            self.fd = None
-            raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))
-        #~ fcntl.fcntl(self.fd, FCNTL.F_SETFL, 0)  # set blocking
-
-        try:
-            self._reconfigurePort()
-        except:
-            try:
-                os.close(self.fd)
-            except:
-                # ignore any exception when closing the port
-                # also to keep original exception that happened when setting up
-                pass
-            self.fd = None
-            raise
-        else:
-            self._isOpen = True
-        self.flushInput()
-
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port."""
-        if self.fd is None:
-            raise SerialException("Can only operate on a valid file descriptor")
-        custom_baud = None
-
-        vmin = vtime = 0                # timeout is done via select
-        if self._interCharTimeout is not None:
-            vmin = 1
-            vtime = int(self._interCharTimeout * 10)
-        try:
-            orig_attr = termios.tcgetattr(self.fd)
-            iflag, oflag, cflag, lflag, ispeed, ospeed, cc = orig_attr
-        except termios.error, msg:      # if a port is nonexistent but has a /dev file, it'll fail here
-            raise SerialException("Could not configure port: %s" % msg)
-        # set up raw mode / no echo / binary
-        cflag |=  (TERMIOS.CLOCAL|TERMIOS.CREAD)
-        lflag &= ~(TERMIOS.ICANON|TERMIOS.ECHO|TERMIOS.ECHOE|TERMIOS.ECHOK|TERMIOS.ECHONL|
-                     TERMIOS.ISIG|TERMIOS.IEXTEN) #|TERMIOS.ECHOPRT
-        for flag in ('ECHOCTL', 'ECHOKE'): # netbsd workaround for Erk
-            if hasattr(TERMIOS, flag):
-                lflag &= ~getattr(TERMIOS, flag)
-
-        oflag &= ~(TERMIOS.OPOST)
-        iflag &= ~(TERMIOS.INLCR|TERMIOS.IGNCR|TERMIOS.ICRNL|TERMIOS.IGNBRK)
-        if hasattr(TERMIOS, 'IUCLC'):
-            iflag &= ~TERMIOS.IUCLC
-        if hasattr(TERMIOS, 'PARMRK'):
-            iflag &= ~TERMIOS.PARMRK
-
-        # setup baud rate
-        try:
-            ispeed = ospeed = getattr(TERMIOS, 'B%s' % (self._baudrate))
-        except AttributeError:
-            try:
-                ispeed = ospeed = baudrate_constants[self._baudrate]
-            except KeyError:
-                #~ raise ValueError('Invalid baud rate: %r' % self._baudrate)
-                # may need custom baud rate, it isn't in our list.
-                ispeed = ospeed = getattr(TERMIOS, 'B38400')
-                try:
-                    custom_baud = int(self._baudrate) # store for later
-                except ValueError:
-                    raise ValueError('Invalid baud rate: %r' % self._baudrate)
-                else:
-                    if custom_baud < 0:
-                        raise ValueError('Invalid baud rate: %r' % self._baudrate)
-
-        # setup char len
-        cflag &= ~TERMIOS.CSIZE
-        if self._bytesize == 8:
-            cflag |= TERMIOS.CS8
-        elif self._bytesize == 7:
-            cflag |= TERMIOS.CS7
-        elif self._bytesize == 6:
-            cflag |= TERMIOS.CS6
-        elif self._bytesize == 5:
-            cflag |= TERMIOS.CS5
-        else:
-            raise ValueError('Invalid char len: %r' % self._bytesize)
-        # setup stopbits
-        if self._stopbits == STOPBITS_ONE:
-            cflag &= ~(TERMIOS.CSTOPB)
-        elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
-            cflag |=  (TERMIOS.CSTOPB)  # XXX same as TWO.. there is no POSIX support for 1.5
-        elif self._stopbits == STOPBITS_TWO:
-            cflag |=  (TERMIOS.CSTOPB)
-        else:
-            raise ValueError('Invalid stop bit specification: %r' % self._stopbits)
-        # setup parity
-        iflag &= ~(TERMIOS.INPCK|TERMIOS.ISTRIP)
-        if self._parity == PARITY_NONE:
-            cflag &= ~(TERMIOS.PARENB|TERMIOS.PARODD)
-        elif self._parity == PARITY_EVEN:
-            cflag &= ~(TERMIOS.PARODD)
-            cflag |=  (TERMIOS.PARENB)
-        elif self._parity == PARITY_ODD:
-            cflag |=  (TERMIOS.PARENB|TERMIOS.PARODD)
-        else:
-            raise ValueError('Invalid parity: %r' % self._parity)
-        # setup flow control
-        # xonxoff
-        if hasattr(TERMIOS, 'IXANY'):
-            if self._xonxoff:
-                iflag |=  (TERMIOS.IXON|TERMIOS.IXOFF) #|TERMIOS.IXANY)
-            else:
-                iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF|TERMIOS.IXANY)
-        else:
-            if self._xonxoff:
-                iflag |=  (TERMIOS.IXON|TERMIOS.IXOFF)
-            else:
-                iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF)
-        # rtscts
-        if hasattr(TERMIOS, 'CRTSCTS'):
-            if self._rtscts:
-                cflag |=  (TERMIOS.CRTSCTS)
-            else:
-                cflag &= ~(TERMIOS.CRTSCTS)
-        elif hasattr(TERMIOS, 'CNEW_RTSCTS'):   # try it with alternate constant name
-            if self._rtscts:
-                cflag |=  (TERMIOS.CNEW_RTSCTS)
-            else:
-                cflag &= ~(TERMIOS.CNEW_RTSCTS)
-        # XXX should there be a warning if setting up rtscts (and xonxoff etc) fails??
-
-        # buffer
-        # vmin "minimal number of characters to be read. = for non blocking"
-        if vmin < 0 or vmin > 255:
-            raise ValueError('Invalid vmin: %r ' % vmin)
-        cc[TERMIOS.VMIN] = vmin
-        # vtime
-        if vtime < 0 or vtime > 255:
-            raise ValueError('Invalid vtime: %r' % vtime)
-        cc[TERMIOS.VTIME] = vtime
-        # activate settings
-        if [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] != orig_attr:
-            termios.tcsetattr(self.fd, TERMIOS.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc])
-
-        # apply custom baud rate, if any
-        if custom_baud is not None:
-            set_special_baudrate(self, custom_baud)
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            if self.fd is not None:
-                os.close(self.fd)
-                self.fd = None
-            self._isOpen = False
-
-    def makeDeviceName(self, port):
-        return device(port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        #~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str)
-        s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
-        return struct.unpack('I',s)[0]
-
-    # select based implementation, proved to work on many systems
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-           return less characters as requested. With no timeout it will block
-           until the requested number of bytes is read."""
-        if not self._isOpen: raise portNotOpenError
-        read = bytearray()
-        while len(read) < size:
-            try:
-                ready,_,_ = select.select([self.fd],[],[], self._timeout)
-                # If select was used with a timeout, and the timeout occurs, it
-                # returns with empty lists -> thus abort read operation.
-                # For timeout == 0 (non-blocking operation) also abort when there
-                # is nothing to read.
-                if not ready:
-                    break   # timeout
-                buf = os.read(self.fd, size-len(read))
-                # read should always return some data as select reported it was
-                # ready to read when we get to this point.
-                if not buf:
-                    # Disconnected devices, at least on Linux, show the
-                    # behavior that they are always ready to read immediately
-                    # but reading returns nothing.
-                    raise SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
-                read.extend(buf)
-            except select.error, e:
-                # ignore EAGAIN errors. all other errors are shown
-                # see also http://www.python.org/dev/peps/pep-3151/#select
-                if e[0] != errno.EAGAIN:
-                    raise SerialException('read failed: %s' % (e,))
-            except OSError, e:
-                # ignore EAGAIN errors. all other errors are shown
-                if e.errno != errno.EAGAIN:
-                    raise SerialException('read failed: %s' % (e,))
-        return bytes(read)
-
-    def write(self, data):
-        """Output the given string over the serial port."""
-        if not self._isOpen: raise portNotOpenError
-        d = to_bytes(data)
-        tx_len = len(d)
-        if self._writeTimeout is not None and self._writeTimeout > 0:
-            timeout = time.time() + self._writeTimeout
-        else:
-            timeout = None
-        while tx_len > 0:
-            try:
-                n = os.write(self.fd, d)
-                if timeout:
-                    # when timeout is set, use select to wait for being ready
-                    # with the time left as timeout
-                    timeleft = timeout - time.time()
-                    if timeleft < 0:
-                        raise writeTimeoutError
-                    _, ready, _ = select.select([], [self.fd], [], timeleft)
-                    if not ready:
-                        raise writeTimeoutError
-                else:
-                    # wait for write operation
-                    _, ready, _ = select.select([], [self.fd], [], None)
-                    if not ready:
-                        raise SerialException('write failed (select)')
-                d = d[n:]
-                tx_len -= n
-            except OSError, v:
-                if v.errno != errno.EAGAIN:
-                    raise SerialException('write failed: %s' % (v,))
-        return len(data)
-
-    def flush(self):
-        """Flush of file like objects. In this case, wait until all data
-           is written."""
-        self.drainOutput()
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        termios.tcflush(self.fd, TERMIOS.TCIFLUSH)
-
-    def flushOutput(self):
-        """Clear output buffer, aborting the current output and
-        discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        termios.tcflush(self.fd, TERMIOS.TCOFLUSH)
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given duration."""
-        if not self._isOpen: raise portNotOpenError
-        termios.tcsendbreak(self.fd, int(duration/0.25))
-
-    def setBreak(self, level=1):
-        """Set break: Controls TXD. When active, no transmitting is possible."""
-        if self.fd is None: raise portNotOpenError
-        if level:
-            fcntl.ioctl(self.fd, TIOCSBRK)
-        else:
-            fcntl.ioctl(self.fd, TIOCCBRK)
-
-    def setRTS(self, level=1):
-        """Set terminal status line: Request To Send"""
-        if not self._isOpen: raise portNotOpenError
-        if level:
-            fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_RTS_str)
-        else:
-            fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_RTS_str)
-
-    def setDTR(self, level=1):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self._isOpen: raise portNotOpenError
-        if level:
-            fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str)
-        else:
-            fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str)
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send"""
-        if not self._isOpen: raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I',s)[0] & TIOCM_CTS != 0
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self._isOpen: raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I',s)[0] & TIOCM_DSR != 0
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self._isOpen: raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I',s)[0] & TIOCM_RI != 0
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self._isOpen: raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I',s)[0] & TIOCM_CD != 0
-
-    # - - platform specific - - - -
-
-    def outWaiting(self):
-        """Return the number of characters currently in the output buffer."""
-        #~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str)
-        s = fcntl.ioctl(self.fd, TIOCOUTQ, TIOCM_zero_str)
-        return struct.unpack('I',s)[0]
-
-    def drainOutput(self):
-        """internal - not portable!"""
-        if not self._isOpen: raise portNotOpenError
-        termios.tcdrain(self.fd)
-
-    def nonblocking(self):
-        """internal - not portable!"""
-        if not self._isOpen: raise portNotOpenError
-        fcntl.fcntl(self.fd, FCNTL.F_SETFL, os.O_NONBLOCK)
-
-    def fileno(self):
-        """\
-        For easier use of the serial port instance with select.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self._isOpen: raise portNotOpenError
-        return self.fd
-
-    def setXON(self, level=True):
-        """\
-        Manually control flow - when software flow control is enabled.
-        This will send XON (true) and XOFF (false) to the other device.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self.hComPort: raise portNotOpenError
-        if enable:
-            termios.tcflow(self.fd, TERMIOS.TCION)
-        else:
-            termios.tcflow(self.fd, TERMIOS.TCIOFF)
-
-    def flowControlOut(self, enable):
-        """\
-        Manually control flow of outgoing data - when hardware or software flow
-        control is enabled.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self._isOpen: raise portNotOpenError
-        if enable:
-            termios.tcflow(self.fd, TERMIOS.TCOON)
-        else:
-            termios.tcflow(self.fd, TERMIOS.TCOOFF)
-
-
-# assemble Serial class with the platform specifc implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derrive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(PosixSerial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(PosixSerial, io.RawIOBase):
-        pass
-
-class PosixPollSerial(Serial):
-    """poll based read implementation. not all systems support poll properly.
-    however this one has better handling of errors, such as a device
-    disconnecting while it's in use (e.g. USB-serial unplugged)"""
-
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-           return less characters as requested. With no timeout it will block
-           until the requested number of bytes is read."""
-        if self.fd is None: raise portNotOpenError
-        read = bytearray()
-        poll = select.poll()
-        poll.register(self.fd, select.POLLIN|select.POLLERR|select.POLLHUP|select.POLLNVAL)
-        if size > 0:
-            while len(read) < size:
-                # print "\tread(): size",size, "have", len(read)    #debug
-                # wait until device becomes ready to read (or something fails)
-                for fd, event in poll.poll(self._timeout*1000):
-                    if event & (select.POLLERR|select.POLLHUP|select.POLLNVAL):
-                        raise SerialException('device reports error (poll)')
-                    #  we don't care if it is select.POLLIN or timeout, that's
-                    #  handled below
-                buf = os.read(self.fd, size - len(read))
-                read.extend(buf)
-                if ((self._timeout is not None and self._timeout >= 0) or 
-                    (self._interCharTimeout is not None and self._interCharTimeout > 0)) and not buf:
-                    break   # early abort on timeout
-        return bytes(read)
-
-
-if __name__ == '__main__':
-    s = Serial(0,
-                 baudrate=19200,        # baud rate
-                 bytesize=EIGHTBITS,    # number of data bits
-                 parity=PARITY_EVEN,    # enable parity checking
-                 stopbits=STOPBITS_ONE, # number of stop bits
-                 timeout=3,             # set a timeout value, None for waiting forever
-                 xonxoff=0,             # enable software flow control
-                 rtscts=0,              # enable RTS/CTS flow control
-               )
-    s.setRTS(1)
-    s.setDTR(1)
-    s.flushInput()
-    s.flushOutput()
-    s.write('hello')
-    sys.stdout.write('%r\n' % s.read(5))
-    sys.stdout.write('%s\n' % s.inWaiting())
-    del s
-
diff --git a/systrace/catapult/third_party/pyserial/serial/serialutil.py b/systrace/catapult/third_party/pyserial/serial/serialutil.py
deleted file mode 100644
index f28ece4..0000000
--- a/systrace/catapult/third_party/pyserial/serial/serialutil.py
+++ /dev/null
@@ -1,551 +0,0 @@
-#! python
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# see __init__.py
-#
-# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-# compatibility for older Python < 2.6
-try:
-    bytes
-    bytearray
-except (NameError, AttributeError):
-    # Python older than 2.6 do not have these types. Like for Python 2.6 they
-    # should behave like str. For Python older than 3.0 we want to work with
-    # strings anyway, only later versions have a true bytes type.
-    bytes = str
-    # bytearray is a mutable type that is easily turned into an instance of
-    # bytes
-    class bytearray(list):
-        # for bytes(bytearray()) usage
-        def __str__(self): return ''.join(self)
-        def __repr__(self): return 'bytearray(%r)' % ''.join(self)
-        # append automatically converts integers to characters
-        def append(self, item):
-            if isinstance(item, str):
-                list.append(self, item)
-            else:
-                list.append(self, chr(item))
-        # +=
-        def __iadd__(self, other):
-            for byte in other:
-                self.append(byte)
-            return self
-
-        def __getslice__(self, i, j):
-            return bytearray(list.__getslice__(self, i, j))
-
-        def __getitem__(self, item):
-            if isinstance(item, slice):
-                return bytearray(list.__getitem__(self, item))
-            else:
-                return ord(list.__getitem__(self, item))
-
-        def __eq__(self, other):
-            if isinstance(other, basestring):
-                other = bytearray(other)
-            return list.__eq__(self, other)
-
-# ``memoryview`` was introduced in Python 2.7 and ``bytes(some_memoryview)``
-# isn't returning the contents (very unfortunate). Therefore we need special
-# cases and test for it. Ensure that there is a ``memoryview`` object for older
-# Python versions. This is easier than making every test dependent on its
-# existence.
-try:
-    memoryview
-except (NameError, AttributeError):
-    # implementation does not matter as we do not realy use it.
-    # it just must not inherit from something else we might care for.
-    class memoryview:
-        pass
-
-
-# all Python versions prior 3.x convert ``str([17])`` to '[17]' instead of '\x11'
-# so a simple ``bytes(sequence)`` doesn't work for all versions
-def to_bytes(seq):
-    """convert a sequence to a bytes type"""
-    if isinstance(seq, bytes):
-        return seq
-    elif isinstance(seq, bytearray):
-        return bytes(seq)
-    elif isinstance(seq, memoryview):
-        return seq.tobytes()
-    else:
-        b = bytearray()
-        for item in seq:
-            b.append(item)  # this one handles int and str for our emulation and ints for Python 3.x
-        return bytes(b)
-
-# create control bytes
-XON  = to_bytes([17])
-XOFF = to_bytes([19])
-
-CR = to_bytes([13])
-LF = to_bytes([10])
-
-
-PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S'
-STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO = (1, 1.5, 2)
-FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8)
-
-PARITY_NAMES = {
-    PARITY_NONE:  'None',
-    PARITY_EVEN:  'Even',
-    PARITY_ODD:   'Odd',
-    PARITY_MARK:  'Mark',
-    PARITY_SPACE: 'Space',
-}
-
-
-class SerialException(IOError):
-    """Base class for serial port related exceptions."""
-
-
-class SerialTimeoutException(SerialException):
-    """Write timeouts give an exception"""
-
-
-writeTimeoutError = SerialTimeoutException('Write timeout')
-portNotOpenError = SerialException('Attempting to use a port that is not open')
-
-
-class FileLike(object):
-    """An abstract file like class.
-
-    This class implements readline and readlines based on read and
-    writelines based on write.
-    This class is used to provide the above functions for to Serial
-    port objects.
-
-    Note that when the serial port was opened with _NO_ timeout that
-    readline blocks until it sees a newline (or the specified size is
-    reached) and that readlines would never return and therefore
-    refuses to work (it raises an exception in this case)!
-    """
-
-    def __init__(self):
-        self.closed = True
-
-    def close(self):
-        self.closed = True
-
-    # so that ports are closed when objects are discarded
-    def __del__(self):
-        """Destructor.  Calls close()."""
-        # The try/except block is in case this is called at program
-        # exit time, when it's possible that globals have already been
-        # deleted, and then the close() call might fail.  Since
-        # there's nothing we can do about such failures and they annoy
-        # the end users, we suppress the traceback.
-        try:
-            self.close()
-        except:
-            pass
-
-    def writelines(self, sequence):
-        for line in sequence:
-            self.write(line)
-
-    def flush(self):
-        """flush of file like objects"""
-        pass
-
-    # iterator for e.g. "for line in Serial(0): ..." usage
-    def next(self):
-        line = self.readline()
-        if not line: raise StopIteration
-        return line
-
-    def __iter__(self):
-        return self
-
-    def readline(self, size=None, eol=LF):
-        """read a line which is terminated with end-of-line (eol) character
-        ('\n' by default) or until timeout."""
-        leneol = len(eol)
-        line = bytearray()
-        while True:
-            c = self.read(1)
-            if c:
-                line += c
-                if line[-leneol:] == eol:
-                    break
-                if size is not None and len(line) >= size:
-                    break
-            else:
-                break
-        return bytes(line)
-
-    def readlines(self, sizehint=None, eol=LF):
-        """read a list of lines, until timeout.
-        sizehint is ignored."""
-        if self.timeout is None:
-            raise ValueError("Serial port MUST have enabled timeout for this function!")
-        leneol = len(eol)
-        lines = []
-        while True:
-            line = self.readline(eol=eol)
-            if line:
-                lines.append(line)
-                if line[-leneol:] != eol:    # was the line received with a timeout?
-                    break
-            else:
-                break
-        return lines
-
-    def xreadlines(self, sizehint=None):
-        """Read lines, implemented as generator. It will raise StopIteration on
-        timeout (empty read). sizehint is ignored."""
-        while True:
-            line = self.readline()
-            if not line: break
-            yield line
-
-    # other functions of file-likes - not used by pySerial
-
-    #~ readinto(b)
-
-    def seek(self, pos, whence=0):
-        raise IOError("file is not seekable")
-
-    def tell(self):
-        raise IOError("file is not seekable")
-
-    def truncate(self, n=None):
-        raise IOError("file is not seekable")
-
-    def isatty(self):
-        return False
-
-
-class SerialBase(object):
-    """Serial port base class. Provides __init__ function and properties to
-       get/set port settings."""
-
-    # default values, may be overridden in subclasses that do not support all values
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000,
-                 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000,
-                 3000000, 3500000, 4000000)
-    BYTESIZES = (FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS)
-    PARITIES  = (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE)
-    STOPBITS  = (STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO)
-
-    def __init__(self,
-                 port = None,           # number of device, numbering starts at
-                                        # zero. if everything fails, the user
-                                        # can specify a device string, note
-                                        # that this isn't portable anymore
-                                        # port will be opened if one is specified
-                 baudrate=9600,         # baud rate
-                 bytesize=EIGHTBITS,    # number of data bits
-                 parity=PARITY_NONE,    # enable parity checking
-                 stopbits=STOPBITS_ONE, # number of stop bits
-                 timeout=None,          # set a timeout value, None to wait forever
-                 xonxoff=False,         # enable software flow control
-                 rtscts=False,          # enable RTS/CTS flow control
-                 writeTimeout=None,     # set a timeout for writes
-                 dsrdtr=False,          # None: use rtscts setting, dsrdtr override if True or False
-                 interCharTimeout=None  # Inter-character timeout, None to disable
-                 ):
-        """Initialize comm port object. If a port is given, then the port will be
-           opened immediately. Otherwise a Serial port object in closed state
-           is returned."""
-
-        self._isOpen   = False
-        self._port     = None           # correct value is assigned below through properties
-        self._baudrate = None           # correct value is assigned below through properties
-        self._bytesize = None           # correct value is assigned below through properties
-        self._parity   = None           # correct value is assigned below through properties
-        self._stopbits = None           # correct value is assigned below through properties
-        self._timeout  = None           # correct value is assigned below through properties
-        self._writeTimeout = None       # correct value is assigned below through properties
-        self._xonxoff  = None           # correct value is assigned below through properties
-        self._rtscts   = None           # correct value is assigned below through properties
-        self._dsrdtr   = None           # correct value is assigned below through properties
-        self._interCharTimeout = None   # correct value is assigned below through properties
-
-        # assign values using get/set methods using the properties feature
-        self.port     = port
-        self.baudrate = baudrate
-        self.bytesize = bytesize
-        self.parity   = parity
-        self.stopbits = stopbits
-        self.timeout  = timeout
-        self.writeTimeout = writeTimeout
-        self.xonxoff  = xonxoff
-        self.rtscts   = rtscts
-        self.dsrdtr   = dsrdtr
-        self.interCharTimeout = interCharTimeout
-
-        if port is not None:
-            self.open()
-
-    def isOpen(self):
-        """Check if the port is opened."""
-        return self._isOpen
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    # TODO: these are not really needed as the is the BAUDRATES etc. attribute...
-    # maybe i remove them before the final release...
-
-    def getSupportedBaudrates(self):
-        return [(str(b), b) for b in self.BAUDRATES]
-
-    def getSupportedByteSizes(self):
-        return [(str(b), b) for b in self.BYTESIZES]
-
-    def getSupportedStopbits(self):
-        return [(str(b), b) for b in self.STOPBITS]
-
-    def getSupportedParities(self):
-        return [(PARITY_NAMES[b], b) for b in self.PARITIES]
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def setPort(self, port):
-        """Change the port. The attribute portstr is set to a string that
-           contains the name of the port."""
-
-        was_open = self._isOpen
-        if was_open: self.close()
-        if port is not None:
-            if isinstance(port, basestring):
-                self.portstr = port
-            else:
-                self.portstr = self.makeDeviceName(port)
-        else:
-            self.portstr = None
-        self._port = port
-        self.name = self.portstr
-        if was_open: self.open()
-
-    def getPort(self):
-        """Get the current port setting. The value that was passed on init or using
-           setPort() is passed back. See also the attribute portstr which contains
-           the name of the port as a string."""
-        return self._port
-
-    port = property(getPort, setPort, doc="Port setting")
-
-
-    def setBaudrate(self, baudrate):
-        """Change baud rate. It raises a ValueError if the port is open and the
-        baud rate is not possible. If the port is closed, then the value is
-        accepted and the exception is raised when the port is opened."""
-        try:
-            b = int(baudrate)
-        except TypeError:
-            raise ValueError("Not a valid baudrate: %r" % (baudrate,))
-        else:
-            if b <= 0:
-                raise ValueError("Not a valid baudrate: %r" % (baudrate,))
-            self._baudrate = b
-            if self._isOpen:  self._reconfigurePort()
-
-    def getBaudrate(self):
-        """Get the current baud rate setting."""
-        return self._baudrate
-
-    baudrate = property(getBaudrate, setBaudrate, doc="Baud rate setting")
-
-
-    def setByteSize(self, bytesize):
-        """Change byte size."""
-        if bytesize not in self.BYTESIZES: raise ValueError("Not a valid byte size: %r" % (bytesize,))
-        self._bytesize = bytesize
-        if self._isOpen: self._reconfigurePort()
-
-    def getByteSize(self):
-        """Get the current byte size setting."""
-        return self._bytesize
-
-    bytesize = property(getByteSize, setByteSize, doc="Byte size setting")
-
-
-    def setParity(self, parity):
-        """Change parity setting."""
-        if parity not in self.PARITIES: raise ValueError("Not a valid parity: %r" % (parity,))
-        self._parity = parity
-        if self._isOpen: self._reconfigurePort()
-
-    def getParity(self):
-        """Get the current parity setting."""
-        return self._parity
-
-    parity = property(getParity, setParity, doc="Parity setting")
-
-
-    def setStopbits(self, stopbits):
-        """Change stop bits size."""
-        if stopbits not in self.STOPBITS: raise ValueError("Not a valid stop bit size: %r" % (stopbits,))
-        self._stopbits = stopbits
-        if self._isOpen: self._reconfigurePort()
-
-    def getStopbits(self):
-        """Get the current stop bits setting."""
-        return self._stopbits
-
-    stopbits = property(getStopbits, setStopbits, doc="Stop bits setting")
-
-
-    def setTimeout(self, timeout):
-        """Change timeout setting."""
-        if timeout is not None:
-            try:
-                timeout + 1     # test if it's a number, will throw a TypeError if not...
-            except TypeError:
-                raise ValueError("Not a valid timeout: %r" % (timeout,))
-            if timeout < 0: raise ValueError("Not a valid timeout: %r" % (timeout,))
-        self._timeout = timeout
-        if self._isOpen: self._reconfigurePort()
-
-    def getTimeout(self):
-        """Get the current timeout setting."""
-        return self._timeout
-
-    timeout = property(getTimeout, setTimeout, doc="Timeout setting for read()")
-
-
-    def setWriteTimeout(self, timeout):
-        """Change timeout setting."""
-        if timeout is not None:
-            if timeout < 0: raise ValueError("Not a valid timeout: %r" % (timeout,))
-            try:
-                timeout + 1     #test if it's a number, will throw a TypeError if not...
-            except TypeError:
-                raise ValueError("Not a valid timeout: %r" % timeout)
-
-        self._writeTimeout = timeout
-        if self._isOpen: self._reconfigurePort()
-
-    def getWriteTimeout(self):
-        """Get the current timeout setting."""
-        return self._writeTimeout
-
-    writeTimeout = property(getWriteTimeout, setWriteTimeout, doc="Timeout setting for write()")
-
-
-    def setXonXoff(self, xonxoff):
-        """Change XON/XOFF setting."""
-        self._xonxoff = xonxoff
-        if self._isOpen: self._reconfigurePort()
-
-    def getXonXoff(self):
-        """Get the current XON/XOFF setting."""
-        return self._xonxoff
-
-    xonxoff = property(getXonXoff, setXonXoff, doc="XON/XOFF setting")
-
-    def setRtsCts(self, rtscts):
-        """Change RTS/CTS flow control setting."""
-        self._rtscts = rtscts
-        if self._isOpen: self._reconfigurePort()
-
-    def getRtsCts(self):
-        """Get the current RTS/CTS flow control setting."""
-        return self._rtscts
-
-    rtscts = property(getRtsCts, setRtsCts, doc="RTS/CTS flow control setting")
-
-    def setDsrDtr(self, dsrdtr=None):
-        """Change DsrDtr flow control setting."""
-        if dsrdtr is None:
-            # if not set, keep backwards compatibility and follow rtscts setting
-            self._dsrdtr = self._rtscts
-        else:
-            # if defined independently, follow its value
-            self._dsrdtr = dsrdtr
-        if self._isOpen: self._reconfigurePort()
-
-    def getDsrDtr(self):
-        """Get the current DSR/DTR flow control setting."""
-        return self._dsrdtr
-
-    dsrdtr = property(getDsrDtr, setDsrDtr, "DSR/DTR flow control setting")
-
-    def setInterCharTimeout(self, interCharTimeout):
-        """Change inter-character timeout setting."""
-        if interCharTimeout is not None:
-            if interCharTimeout < 0: raise ValueError("Not a valid timeout: %r" % interCharTimeout)
-            try:
-                interCharTimeout + 1     # test if it's a number, will throw a TypeError if not...
-            except TypeError:
-                raise ValueError("Not a valid timeout: %r" % interCharTimeout)
-
-        self._interCharTimeout = interCharTimeout
-        if self._isOpen: self._reconfigurePort()
-
-    def getInterCharTimeout(self):
-        """Get the current inter-character timeout setting."""
-        return self._interCharTimeout
-
-    interCharTimeout = property(getInterCharTimeout, setInterCharTimeout, doc="Inter-character timeout setting for read()")
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    _SETTINGS = ('baudrate', 'bytesize', 'parity', 'stopbits', 'xonxoff',
-            'dsrdtr', 'rtscts', 'timeout', 'writeTimeout', 'interCharTimeout')
-
-    def getSettingsDict(self):
-        """Get current port settings as a dictionary. For use with
-        applySettingsDict"""
-        return dict([(key, getattr(self, '_'+key)) for key in self._SETTINGS])
-
-    def applySettingsDict(self, d):
-        """apply stored settings from a dictionary returned from
-        getSettingsDict. it's allowed to delete keys from the dictionary. these
-        values will simply left unchanged."""
-        for key in self._SETTINGS:
-            if d[key] != getattr(self, '_'+key):   # check against internal "_" value
-                setattr(self, key, d[key])          # set non "_" value to use properties write function
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def __repr__(self):
-        """String representation of the current port settings and its state."""
-        return "%s<id=0x%x, open=%s>(port=%r, baudrate=%r, bytesize=%r, parity=%r, stopbits=%r, timeout=%r, xonxoff=%r, rtscts=%r, dsrdtr=%r)" % (
-            self.__class__.__name__,
-            id(self),
-            self._isOpen,
-            self.portstr,
-            self.baudrate,
-            self.bytesize,
-            self.parity,
-            self.stopbits,
-            self.timeout,
-            self.xonxoff,
-            self.rtscts,
-            self.dsrdtr,
-        )
-
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # compatibility with io library
-
-    def readable(self): return True
-    def writable(self): return True
-    def seekable(self): return False
-    def readinto(self, b):
-        data = self.read(len(b))
-        n = len(data)
-        try:
-            b[:n] = data
-        except TypeError, err:
-            import array
-            if not isinstance(b, array.array):
-                raise err
-            b[:n] = array.array('b', data)
-        return n
-
-
-if __name__ == '__main__':
-    import sys
-    s = SerialBase()
-    sys.stdout.write('port name:  %s\n' % s.portstr)
-    sys.stdout.write('baud rates: %s\n' % s.getSupportedBaudrates())
-    sys.stdout.write('byte sizes: %s\n' % s.getSupportedByteSizes())
-    sys.stdout.write('parities:   %s\n' % s.getSupportedParities())
-    sys.stdout.write('stop bits:  %s\n' % s.getSupportedStopbits())
-    sys.stdout.write('%s\n' % s)
diff --git a/systrace/catapult/third_party/pyserial/serial/serialwin32.py b/systrace/catapult/third_party/pyserial/serial/serialwin32.py
deleted file mode 100644
index dfdd953..0000000
--- a/systrace/catapult/third_party/pyserial/serial/serialwin32.py
+++ /dev/null
@@ -1,461 +0,0 @@
-#! python
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# serial driver for win32
-# see __init__.py
-#
-# (C) 2001-2011 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-#
-# Initial patch to use ctypes by Giovanni Bajo <rasky@develer.com>
-
-import ctypes
-from serial import win32
-
-from serial.serialutil import *
-
-
-def device(portnum):
-    """Turn a port number into a device name"""
-    return 'COM%d' % (portnum+1) # numbers are transformed to a string
-
-
-class Win32Serial(SerialBase):
-    """Serial port implementation for Win32 based on ctypes."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def __init__(self, *args, **kwargs):
-        self.hComPort = None
-        self._overlappedRead = None
-        self._overlappedWrite = None
-        self._rtsToggle = False
-
-        self._rtsState = win32.RTS_CONTROL_ENABLE
-        self._dtrState = win32.DTR_CONTROL_ENABLE
-
-
-        SerialBase.__init__(self, *args, **kwargs)
-
-    def open(self):
-        """Open port with current settings. This may throw a SerialException
-           if the port cannot be opened."""
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        # the "\\.\COMx" format is required for devices other than COM1-COM8
-        # not all versions of windows seem to support this properly
-        # so that the first few ports are used with the DOS device name
-        port = self.portstr
-        try:
-            if port.upper().startswith('COM') and int(port[3:]) > 8:
-                port = '\\\\.\\' + port
-        except ValueError:
-            # for like COMnotanumber
-            pass
-        self.hComPort = win32.CreateFile(port,
-               win32.GENERIC_READ | win32.GENERIC_WRITE,
-               0, # exclusive access
-               None, # no security
-               win32.OPEN_EXISTING,
-               win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED,
-               0)
-        if self.hComPort == win32.INVALID_HANDLE_VALUE:
-            self.hComPort = None    # 'cause __del__ is called anyway
-            raise SerialException("could not open port %r: %r" % (self.portstr, ctypes.WinError()))
-
-        try:
-            self._overlappedRead = win32.OVERLAPPED()
-            self._overlappedRead.hEvent = win32.CreateEvent(None, 1, 0, None)
-            self._overlappedWrite = win32.OVERLAPPED()
-            #~ self._overlappedWrite.hEvent = win32.CreateEvent(None, 1, 0, None)
-            self._overlappedWrite.hEvent = win32.CreateEvent(None, 0, 0, None)
-
-            # Setup a 4k buffer
-            win32.SetupComm(self.hComPort, 4096, 4096)
-
-            # Save original timeout values:
-            self._orgTimeouts = win32.COMMTIMEOUTS()
-            win32.GetCommTimeouts(self.hComPort, ctypes.byref(self._orgTimeouts))
-
-            self._reconfigurePort()
-
-            # Clear buffers:
-            # Remove anything that was there
-            win32.PurgeComm(self.hComPort,
-                    win32.PURGE_TXCLEAR | win32.PURGE_TXABORT |
-                    win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
-        except:
-            try:
-                self._close()
-            except:
-                # ignore any exception when closing the port
-                # also to keep original exception that happened when setting up
-                pass
-            self.hComPort = None
-            raise
-        else:
-            self._isOpen = True
-
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port."""
-        if not self.hComPort:
-            raise SerialException("Can only operate on a valid port handle")
-
-        # Set Windows timeout values
-        # timeouts is a tuple with the following items:
-        # (ReadIntervalTimeout,ReadTotalTimeoutMultiplier,
-        #  ReadTotalTimeoutConstant,WriteTotalTimeoutMultiplier,
-        #  WriteTotalTimeoutConstant)
-        if self._timeout is None:
-            timeouts = (0, 0, 0, 0, 0)
-        elif self._timeout == 0:
-            timeouts = (win32.MAXDWORD, 0, 0, 0, 0)
-        else:
-            timeouts = (0, 0, int(self._timeout*1000), 0, 0)
-        if self._timeout != 0 and self._interCharTimeout is not None:
-            timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:]
-
-        if self._writeTimeout is None:
-            pass
-        elif self._writeTimeout == 0:
-            timeouts = timeouts[:-2] + (0, win32.MAXDWORD)
-        else:
-            timeouts = timeouts[:-2] + (0, int(self._writeTimeout*1000))
-        win32.SetCommTimeouts(self.hComPort, ctypes.byref(win32.COMMTIMEOUTS(*timeouts)))
-
-        win32.SetCommMask(self.hComPort, win32.EV_ERR)
-
-        # Setup the connection info.
-        # Get state and modify it:
-        comDCB = win32.DCB()
-        win32.GetCommState(self.hComPort, ctypes.byref(comDCB))
-        comDCB.BaudRate = self._baudrate
-
-        if self._bytesize == FIVEBITS:
-            comDCB.ByteSize     = 5
-        elif self._bytesize == SIXBITS:
-            comDCB.ByteSize     = 6
-        elif self._bytesize == SEVENBITS:
-            comDCB.ByteSize     = 7
-        elif self._bytesize == EIGHTBITS:
-            comDCB.ByteSize     = 8
-        else:
-            raise ValueError("Unsupported number of data bits: %r" % self._bytesize)
-
-        if self._parity == PARITY_NONE:
-            comDCB.Parity       = win32.NOPARITY
-            comDCB.fParity      = 0 # Disable Parity Check
-        elif self._parity == PARITY_EVEN:
-            comDCB.Parity       = win32.EVENPARITY
-            comDCB.fParity      = 1 # Enable Parity Check
-        elif self._parity == PARITY_ODD:
-            comDCB.Parity       = win32.ODDPARITY
-            comDCB.fParity      = 1 # Enable Parity Check
-        elif self._parity == PARITY_MARK:
-            comDCB.Parity       = win32.MARKPARITY
-            comDCB.fParity      = 1 # Enable Parity Check
-        elif self._parity == PARITY_SPACE:
-            comDCB.Parity       = win32.SPACEPARITY
-            comDCB.fParity      = 1 # Enable Parity Check
-        else:
-            raise ValueError("Unsupported parity mode: %r" % self._parity)
-
-        if self._stopbits == STOPBITS_ONE:
-            comDCB.StopBits     = win32.ONESTOPBIT
-        elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
-            comDCB.StopBits     = win32.ONE5STOPBITS
-        elif self._stopbits == STOPBITS_TWO:
-            comDCB.StopBits     = win32.TWOSTOPBITS
-        else:
-            raise ValueError("Unsupported number of stop bits: %r" % self._stopbits)
-
-        comDCB.fBinary          = 1 # Enable Binary Transmission
-        # Char. w/ Parity-Err are replaced with 0xff (if fErrorChar is set to TRUE)
-        if self._rtscts:
-            comDCB.fRtsControl  = win32.RTS_CONTROL_HANDSHAKE
-        elif self._rtsToggle:
-            comDCB.fRtsControl  = win32.RTS_CONTROL_TOGGLE
-        else:
-            comDCB.fRtsControl  = self._rtsState
-        if self._dsrdtr:
-            comDCB.fDtrControl  = win32.DTR_CONTROL_HANDSHAKE
-        else:
-            comDCB.fDtrControl  = self._dtrState
-
-        if self._rtsToggle:
-            comDCB.fOutxCtsFlow     = 0
-        else:
-            comDCB.fOutxCtsFlow     = self._rtscts
-        comDCB.fOutxDsrFlow     = self._dsrdtr
-        comDCB.fOutX            = self._xonxoff
-        comDCB.fInX             = self._xonxoff
-        comDCB.fNull            = 0
-        comDCB.fErrorChar       = 0
-        comDCB.fAbortOnError    = 0
-        comDCB.XonChar          = XON
-        comDCB.XoffChar         = XOFF
-
-        if not win32.SetCommState(self.hComPort, ctypes.byref(comDCB)):
-            raise ValueError("Cannot configure port, some setting was wrong. Original message: %r" % ctypes.WinError())
-
-    #~ def __del__(self):
-        #~ self.close()
-
-
-    def _close(self):
-        """internal close port helper"""
-        if self.hComPort:
-            # Restore original timeout values:
-            win32.SetCommTimeouts(self.hComPort, self._orgTimeouts)
-            # Close COM-Port:
-            win32.CloseHandle(self.hComPort)
-            if self._overlappedRead is not None:
-                win32.CloseHandle(self._overlappedRead.hEvent)
-                self._overlappedRead = None
-            if self._overlappedWrite is not None:
-                win32.CloseHandle(self._overlappedWrite.hEvent)
-                self._overlappedWrite = None
-            self.hComPort = None
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            self._close()
-            self._isOpen = False
-
-    def makeDeviceName(self, port):
-        return device(port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        flags = win32.DWORD()
-        comstat = win32.COMSTAT()
-        if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)):
-            raise SerialException('call to ClearCommError failed')
-        return comstat.cbInQue
-
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-           return less characters as requested. With no timeout it will block
-           until the requested number of bytes is read."""
-        if not self.hComPort: raise portNotOpenError
-        if size > 0:
-            win32.ResetEvent(self._overlappedRead.hEvent)
-            flags = win32.DWORD()
-            comstat = win32.COMSTAT()
-            if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)):
-                raise SerialException('call to ClearCommError failed')
-            if self.timeout == 0:
-                n = min(comstat.cbInQue, size)
-                if n > 0:
-                    buf = ctypes.create_string_buffer(n)
-                    rc = win32.DWORD()
-                    err = win32.ReadFile(self.hComPort, buf, n, ctypes.byref(rc), ctypes.byref(self._overlappedRead))
-                    if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
-                        raise SerialException("ReadFile failed (%r)" % ctypes.WinError())
-                    err = win32.WaitForSingleObject(self._overlappedRead.hEvent, win32.INFINITE)
-                    read = buf.raw[:rc.value]
-                else:
-                    read = bytes()
-            else:
-                buf = ctypes.create_string_buffer(size)
-                rc = win32.DWORD()
-                err = win32.ReadFile(self.hComPort, buf, size, ctypes.byref(rc), ctypes.byref(self._overlappedRead))
-                if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
-                    raise SerialException("ReadFile failed (%r)" % ctypes.WinError())
-                err = win32.GetOverlappedResult(self.hComPort, ctypes.byref(self._overlappedRead), ctypes.byref(rc), True)
-                read = buf.raw[:rc.value]
-        else:
-            read = bytes()
-        return bytes(read)
-
-    def write(self, data):
-        """Output the given string over the serial port."""
-        if not self.hComPort: raise portNotOpenError
-        #~ if not isinstance(data, (bytes, bytearray)):
-            #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
-        # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
-        data = to_bytes(data)
-        if data:
-            #~ win32event.ResetEvent(self._overlappedWrite.hEvent)
-            n = win32.DWORD()
-            err = win32.WriteFile(self.hComPort, data, len(data), ctypes.byref(n), self._overlappedWrite)
-            if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
-                raise SerialException("WriteFile failed (%r)" % ctypes.WinError())
-            if self._writeTimeout != 0: # if blocking (None) or w/ write timeout (>0)
-                # Wait for the write to complete.
-                #~ win32.WaitForSingleObject(self._overlappedWrite.hEvent, win32.INFINITE)
-                err = win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True)
-                if n.value != len(data):
-                    raise writeTimeoutError
-            return n.value
-        else:
-            return 0
-
-    def flush(self):
-        """Flush of file like objects. In this case, wait until all data
-           is written."""
-        while self.outWaiting():
-            time.sleep(0.05)
-        # XXX could also use WaitCommEvent with mask EV_TXEMPTY, but it would
-        # require overlapped IO and its also only possible to set a single mask
-        # on the port---
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.hComPort: raise portNotOpenError
-        win32.PurgeComm(self.hComPort, win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
-
-    def flushOutput(self):
-        """Clear output buffer, aborting the current output and
-        discarding all that is in the buffer."""
-        if not self.hComPort: raise portNotOpenError
-        win32.PurgeComm(self.hComPort, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT)
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given duration."""
-        if not self.hComPort: raise portNotOpenError
-        import time
-        win32.SetCommBreak(self.hComPort)
-        time.sleep(duration)
-        win32.ClearCommBreak(self.hComPort)
-
-    def setBreak(self, level=1):
-        """Set break: Controls TXD. When active, to transmitting is possible."""
-        if not self.hComPort: raise portNotOpenError
-        if level:
-            win32.SetCommBreak(self.hComPort)
-        else:
-            win32.ClearCommBreak(self.hComPort)
-
-    def setRTS(self, level=1):
-        """Set terminal status line: Request To Send"""
-        # remember level for reconfigure
-        if level:
-            self._rtsState = win32.RTS_CONTROL_ENABLE
-        else:
-            self._rtsState = win32.RTS_CONTROL_DISABLE
-        # also apply now if port is open
-        if self.hComPort:
-            if level:
-                win32.EscapeCommFunction(self.hComPort, win32.SETRTS)
-            else:
-                win32.EscapeCommFunction(self.hComPort, win32.CLRRTS)
-
-    def setDTR(self, level=1):
-        """Set terminal status line: Data Terminal Ready"""
-        # remember level for reconfigure
-        if level:
-            self._dtrState = win32.DTR_CONTROL_ENABLE
-        else:
-            self._dtrState = win32.DTR_CONTROL_DISABLE
-        # also apply now if port is open
-        if self.hComPort:
-            if level:
-                win32.EscapeCommFunction(self.hComPort, win32.SETDTR)
-            else:
-                win32.EscapeCommFunction(self.hComPort, win32.CLRDTR)
-
-    def _GetCommModemStatus(self):
-        stat = win32.DWORD()
-        win32.GetCommModemStatus(self.hComPort, ctypes.byref(stat))
-        return stat.value
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.hComPort: raise portNotOpenError
-        return win32.MS_CTS_ON & self._GetCommModemStatus() != 0
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self.hComPort: raise portNotOpenError
-        return win32.MS_DSR_ON & self._GetCommModemStatus() != 0
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.hComPort: raise portNotOpenError
-        return win32.MS_RING_ON & self._GetCommModemStatus() != 0
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.hComPort: raise portNotOpenError
-        return win32.MS_RLSD_ON & self._GetCommModemStatus() != 0
-
-    # - - platform specific - - - -
-
-    def setBufferSize(self, rx_size=4096, tx_size=None):
-        """\
-        Recommend a buffer size to the driver (device driver can ignore this
-        vlaue). Must be called before the port is opended.
-        """
-        if tx_size is None: tx_size = rx_size
-        win32.SetupComm(self.hComPort, rx_size, tx_size)
-
-    def setXON(self, level=True):
-        """\
-        Manually control flow - when software flow control is enabled.
-        This will send XON (true) and XOFF (false) to the other device.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self.hComPort: raise portNotOpenError
-        if level:
-            win32.EscapeCommFunction(self.hComPort, win32.SETXON)
-        else:
-            win32.EscapeCommFunction(self.hComPort, win32.SETXOFF)
-
-    def outWaiting(self):
-        """return how many characters the in the outgoing buffer"""
-        flags = win32.DWORD()
-        comstat = win32.COMSTAT()
-        if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)):
-            raise SerialException('call to ClearCommError failed')
-        return comstat.cbOutQue
-
-    # functions useful for RS-485 adapters
-    def setRtsToggle(self, rtsToggle):
-        """Change RTS toggle control setting."""
-        self._rtsToggle = rtsToggle
-        if self._isOpen: self._reconfigurePort()
-
-    def getRtsToggle(self):
-        """Get the current RTS toggle control setting."""
-        return self._rtsToggle
-
-    rtsToggle = property(getRtsToggle, setRtsToggle, doc="RTS toggle control setting")
-
-
-# assemble Serial class with the platform specific implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(Win32Serial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(Win32Serial, io.RawIOBase):
-        pass
-
-
-# Nur Testfunktion!!
-if __name__ == '__main__':
-    s = Serial(0)
-    sys.stdout.write("%s\n" % s)
-
-    s = Serial()
-    sys.stdout.write("%s\n" % s)
-
-    s.baudrate = 19200
-    s.databits = 7
-    s.close()
-    s.port = 0
-    s.open()
-    sys.stdout.write("%s\n" % s)
-
diff --git a/systrace/catapult/third_party/pyserial/serial/sermsdos.py b/systrace/catapult/third_party/pyserial/serial/sermsdos.py
deleted file mode 100644
index 09a0017..0000000
--- a/systrace/catapult/third_party/pyserial/serial/sermsdos.py
+++ /dev/null
@@ -1,200 +0,0 @@
-# sermsdos.py
-#
-# History:
-#
-#   3rd September 2002                      Dave Haynes
-#   1. First defined
-#
-# Although this code should run under the latest versions of
-# Python, on DOS-based platforms such as Windows 95 and 98,
-# it has been specifically written to be compatible with
-# PyDOS, available at:
-# http://www.python.org/ftp/python/wpy/dos.html
-#
-# PyDOS is a stripped-down version of Python 1.5.2 for
-# DOS machines. Therefore, in making changes to this file,
-# please respect Python 1.5.2 syntax. In addition, please
-# limit the width of this file to 60 characters.
-#
-# Note also that the modules in PyDOS contain fewer members
-# than other versions, so we are restricted to using the
-# following:
-#
-# In module os:
-# -------------
-# environ, chdir, getcwd, getpid, umask, fdopen, close,
-# dup, dup2, fstat, lseek, open, read, write, O_RDONLY,
-# O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC,
-# access, F_OK, R_OK, W_OK, X_OK, chmod, listdir, mkdir,
-# remove, rename, renames, rmdir, stat, unlink, utime,
-# execl, execle, execlp, execlpe, execvp, execvpe, _exit,
-# system.
-#
-# In module os.path:
-# ------------------
-# curdir, pardir, sep, altsep, pathsep, defpath, linesep.
-#
-
-import os
-import sys
-import string
-import serial.serialutil
-
-BAUD_RATES = {
-                110: "11",
-                150: "15",
-                300: "30",
-                600: "60",
-                1200: "12",
-                2400: "24",
-                4800: "48",
-                9600: "96",
-                19200: "19"}
-
-(PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK,
-PARITY_SPACE) = (0, 1, 2, 3, 4)
-(STOPBITS_ONE, STOPBITS_ONEANDAHALF,
-STOPBITS_TWO) = (1, 1.5, 2)
-FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8)
-(RETURN_ERROR, RETURN_BUSY, RETURN_RETRY, RETURN_READY,
-RETURN_NONE) = ('E', 'B', 'P', 'R', 'N')
-portNotOpenError = ValueError('port not open')
-
-def device(portnum):
-    return 'COM%d' % (portnum+1)
-
-class Serial(serialutil.FileLike):
-    """
-       port: number of device; numbering starts at
-            zero. if everything fails, the user can
-            specify a device string, note that this
-            isn't portable any more
-       baudrate: baud rate
-       bytesize: number of databits
-       parity: enable parity checking
-       stopbits: number of stopbits
-       timeout: set a timeout (None for waiting forever)
-       xonxoff: enable software flow control
-       rtscts: enable RTS/CTS flow control
-       retry: DOS retry mode
-    """
-    def __init__(self,
-                 port,
-                 baudrate = 9600,
-                 bytesize = EIGHTBITS,
-                 parity = PARITY_NONE,
-                 stopbits = STOPBITS_ONE,
-                 timeout = None,
-                 xonxoff = 0,
-                 rtscts = 0,
-                 retry = RETURN_RETRY
-                 ):
-
-        if type(port) == type(''):
-        # strings are taken directly
-            self.portstr = port
-        else:
-        # numbers are transformed to a string
-            self.portstr = device(port+1)
-
-        self.baud = BAUD_RATES[baudrate]
-        self.bytesize = str(bytesize)
-
-        if parity == PARITY_NONE:
-            self.parity = 'N'
-        elif parity == PARITY_EVEN:
-            self.parity = 'E'
-        elif parity == PARITY_ODD:
-            self.parity = 'O'
-        elif parity == PARITY_MARK:
-            self.parity = 'M'
-        elif parity == PARITY_SPACE:
-            self.parity = 'S'
-
-        self.stop = str(stopbits)
-        self.retry = retry
-        self.filename = "sermsdos.tmp"
-
-        self._config(self.portstr, self.baud, self.parity,
-        self.bytesize, self.stop, self.retry, self.filename)
-
-    def __del__(self):
-        self.close()
-
-    def close(self):
-        pass
-
-    def _config(self, port, baud, parity, data, stop, retry,
-        filename):
-        comString = string.join(("MODE ", port, ":"
-        , " BAUD= ", baud, " PARITY= ", parity
-        , " DATA= ", data, " STOP= ", stop, " RETRY= ",
-        retry, " > ", filename ), '')
-        os.system(comString)
-
-    def setBaudrate(self, baudrate):
-        self._config(self.portstr, BAUD_RATES[baudrate],
-        self.parity, self.bytesize, self.stop, self.retry,
-        self.filename)
-
-    def inWaiting(self):
-        """returns the number of bytes waiting to be read"""
-        raise NotImplementedError
-
-    def read(self, num = 1):
-        """Read num bytes from serial port"""
-        handle = os.open(self.portstr,
-        os.O_RDONLY | os.O_BINARY)
-        rv = os.read(handle, num)
-        os.close(handle)
-        return rv
-
-    def write(self, s):
-        """Write string to serial port"""
-        handle = os.open(self.portstr,
-        os.O_WRONLY | os.O_BINARY)
-        rv = os.write(handle, s)
-        os.close(handle)
-        return rv
-
-    def flushInput(self):
-        raise NotImplementedError
-
-    def flushOutput(self):
-        raise NotImplementedError
-
-    def sendBreak(self):
-        raise NotImplementedError
-
-    def setRTS(self,level=1):
-        """Set terminal status line"""
-        raise NotImplementedError
-
-    def setDTR(self,level=1):
-        """Set terminal status line"""
-        raise NotImplementedError
-
-    def getCTS(self):
-        """Eead terminal status line"""
-        raise NotImplementedError
-
-    def getDSR(self):
-        """Eead terminal status line"""
-        raise NotImplementedError
-
-    def getRI(self):
-        """Eead terminal status line"""
-        raise NotImplementedError
-
-    def getCD(self):
-        """Eead terminal status line"""
-        raise NotImplementedError
-
-    def __repr__(self):
-        return string.join(( "<Serial>: ", self.portstr
-        , self.baud, self.parity, self.bytesize, self.stop,
-        self.retry , self.filename), ' ')
-
-if __name__ == '__main__':
-    s = Serial(0)
-    sys.stdio.write('%s %s\n' % (__name__, s))
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/__init__.py b/systrace/catapult/third_party/pyserial/serial/tools/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/__init__.py
+++ /dev/null
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py b/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py
deleted file mode 100755
index d373a55..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env python
-
-# portable serial port access with python
-# this is a wrapper module for different platform implementations of the
-# port enumeration feature
-#
-# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-"""\
-This module will provide a function called comports that returns an
-iterable (generator or list) that will enumerate available com ports. Note that
-on some systems non-existent ports may be listed.
-
-Additionally a grep function is supplied that can be used to search for ports
-based on their descriptions or hardware ID.
-"""
-
-import sys, os, re
-
-# chose an implementation, depending on os
-#~ if sys.platform == 'cli':
-#~ else:
-import os
-# chose an implementation, depending on os
-if os.name == 'nt': #sys.platform == 'win32':
-    from serial.tools.list_ports_windows import *
-elif os.name == 'posix':
-    from serial.tools.list_ports_posix import *
-#~ elif os.name == 'java':
-else:
-    raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-def grep(regexp):
-    """\
-    Search for ports using a regular expression. Port name, description and
-    hardware ID are searched. The function returns an iterable that returns the
-    same tuples as comport() would do.
-    """
-    r = re.compile(regexp, re.I)
-    for port, desc, hwid in comports():
-        if r.search(port) or r.search(desc) or r.search(hwid):
-            yield port, desc, hwid
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-def main():
-    import optparse
-
-    parser = optparse.OptionParser(
-        usage = "%prog [options] [<regexp>]",
-        description = "Miniterm - A simple terminal program for the serial port."
-    )
-
-    parser.add_option("--debug",
-            help="print debug messages and tracebacks (development mode)",
-            dest="debug",
-            default=False,
-            action='store_true')
-
-    parser.add_option("-v", "--verbose",
-            help="show more messages (can be given multiple times)",
-            dest="verbose",
-            default=1,
-            action='count')
-
-    parser.add_option("-q", "--quiet",
-            help="suppress all messages",
-            dest="verbose",
-            action='store_const',
-            const=0)
-
-    (options, args) = parser.parse_args()
-
-
-    hits = 0
-    # get iteraror w/ or w/o filter
-    if args:
-        if len(args) > 1:
-            parser.error('more than one regexp not supported')
-        print "Filtered list with regexp: %r" % (args[0],)
-        iterator = sorted(grep(args[0]))
-    else:
-        iterator = sorted(comports())
-    # list them
-    for port, desc, hwid in iterator:
-        print("%-20s" % (port,))
-        if options.verbose > 1:
-            print("    desc: %s" % (desc,))
-            print("    hwid: %s" % (hwid,))
-        hits += 1
-    if options.verbose:
-        if hits:
-            print("%d ports found" % (hits,))
-        else:
-            print("no ports found")
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py b/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py
deleted file mode 100755
index ecfd158..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env python
-
-# portable serial port access with python
-#
-# This is a module that gathers a list of serial ports including details on
-# GNU/Linux systems
-#
-# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-import glob
-import sys
-import os
-import re
-
-try:
-    import subprocess
-except ImportError:
-    def popen(argv):
-        try:
-            si, so =  os.popen4(' '.join(argv))
-            return so.read().strip()
-        except:
-            raise IOError('lsusb failed')
-else:
-    def popen(argv):
-        try:
-            return subprocess.check_output(argv, stderr=subprocess.STDOUT).strip()
-        except:
-            raise IOError('lsusb failed')
-
-
-# The comports function is expected to return an iterable that yields tuples of
-# 3 strings: port name, human readable description and a hardware ID.
-#
-# as currently no method is known to get the second two strings easily, they
-# are currently just identical to the port name.
-
-# try to detect the OS so that a device can be selected...
-plat = sys.platform.lower()
-
-def read_line(filename):
-    """help function to read a single line from a file. returns none"""
-    try:
-        f = open(filename)
-        line = f.readline().strip()
-        f.close()
-        return line
-    except IOError:
-        return None
-
-def re_group(regexp, text):
-    """search for regexp in text, return 1st group on match"""
-    if sys.version < '3':
-        m = re.search(regexp, text)
-    else:
-        # text is bytes-like
-        m = re.search(regexp, text.decode('ascii', 'replace'))
-    if m: return m.group(1)
-
-
-# try to extract descriptions from sysfs. this was done by experimenting,
-# no guarantee that it works for all devices or in the future...
-
-def usb_sysfs_hw_string(sysfs_path):
-    """given a path to a usb device in sysfs, return a string describing it"""
-    bus, dev = os.path.basename(os.path.realpath(sysfs_path)).split('-')
-    snr = read_line(sysfs_path+'/serial')
-    if snr:
-        snr_txt = ' SNR=%s' % (snr,)
-    else:
-        snr_txt = ''
-    return 'USB VID:PID=%s:%s%s' % (
-            read_line(sysfs_path+'/idVendor'),
-            read_line(sysfs_path+'/idProduct'),
-            snr_txt
-            )
-
-def usb_lsusb_string(sysfs_path):
-    base = os.path.basename(os.path.realpath(sysfs_path))
-    bus = base.split('-')[0]
-    try:
-        dev = int(read_line(os.path.join(sysfs_path, 'devnum')))
-        desc = popen(['lsusb', '-v', '-s', '%s:%s' % (bus, dev)])
-        # descriptions from device
-        iManufacturer = re_group('iManufacturer\s+\w+ (.+)', desc)
-        iProduct = re_group('iProduct\s+\w+ (.+)', desc)
-        iSerial = re_group('iSerial\s+\w+ (.+)', desc) or ''
-        # descriptions from kernel
-        idVendor = re_group('idVendor\s+0x\w+ (.+)', desc)
-        idProduct = re_group('idProduct\s+0x\w+ (.+)', desc)
-        # create descriptions. prefer text from device, fall back to the others
-        return '%s %s %s' % (iManufacturer or idVendor, iProduct or idProduct, iSerial)
-    except IOError:
-        return base
-
-def describe(device):
-    """\
-    Get a human readable description.
-    For USB-Serial devices try to run lsusb to get a human readable description.
-    For USB-CDC devices read the description from sysfs.
-    """
-    base = os.path.basename(device)
-    # USB-Serial devices
-    sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base)
-    if os.path.exists(sys_dev_path):
-        sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path)))
-        return usb_lsusb_string(sys_usb)
-    # USB-CDC devices
-    sys_dev_path = '/sys/class/tty/%s/device/interface' % (base,)
-    if os.path.exists(sys_dev_path):
-        return read_line(sys_dev_path)
-
-    # USB Product Information
-    sys_dev_path = '/sys/class/tty/%s/device' % (base,)
-    if os.path.exists(sys_dev_path):
-        product_name_file = os.path.dirname(os.path.realpath(sys_dev_path)) + "/product"
-        if os.path.exists(product_name_file):
-            return read_line(product_name_file)
-
-    return base
-
-def hwinfo(device):
-    """Try to get a HW identification using sysfs"""
-    base = os.path.basename(device)
-    if os.path.exists('/sys/class/tty/%s/device' % (base,)):
-        # PCI based devices
-        sys_id_path = '/sys/class/tty/%s/device/id' % (base,)
-        if os.path.exists(sys_id_path):
-            return read_line(sys_id_path)
-        # USB-Serial devices
-        sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base)
-        if os.path.exists(sys_dev_path):
-            sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path)))
-            return usb_sysfs_hw_string(sys_usb)
-        # USB-CDC devices
-        if base.startswith('ttyACM'):
-            sys_dev_path = '/sys/class/tty/%s/device' % (base,)
-            if os.path.exists(sys_dev_path):
-                return usb_sysfs_hw_string(sys_dev_path + '/..')
-    return 'n/a'    # XXX directly remove these from the list?
-
-def comports():
-    devices = glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*')
-    return [(d, describe(d), hwinfo(d)) for d in devices]
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print "%s: %s [%s]" % (port, desc, hwid)
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py b/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py
deleted file mode 100755
index c9ed615..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env python
-
-# portable serial port access with python
-#
-# This is a module that gathers a list of serial ports including details on OSX
-#
-# code originally from https://github.com/makerbot/pyserial/tree/master/serial/tools
-# with contributions from cibomahto, dgs3, FarMcKon, tedbrandston
-# and modifications by cliechti
-#
-# this is distributed under a free software license, see license.txt
-
-
-
-# List all of the callout devices in OS/X by querying IOKit.
-
-# See the following for a reference of how to do this:
-# http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html#//apple_ref/doc/uid/TP30000384-CIHGEAFD
-
-# More help from darwin_hid.py
-
-# Also see the 'IORegistryExplorer' for an idea of what we are actually searching
-
-import ctypes
-from ctypes import util
-import re
-
-iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
-cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
-
-kIOMasterPortDefault = ctypes.c_void_p.in_dll(iokit, "kIOMasterPortDefault")
-kCFAllocatorDefault = ctypes.c_void_p.in_dll(cf, "kCFAllocatorDefault")
-
-kCFStringEncodingMacRoman = 0
-
-iokit.IOServiceMatching.restype = ctypes.c_void_p
-
-iokit.IOServiceGetMatchingServices.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
-iokit.IOServiceGetMatchingServices.restype = ctypes.c_void_p
-
-iokit.IORegistryEntryGetParentEntry.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
-
-iokit.IORegistryEntryCreateCFProperty.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32]
-iokit.IORegistryEntryCreateCFProperty.restype = ctypes.c_void_p
-
-iokit.IORegistryEntryGetPath.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
-iokit.IORegistryEntryGetPath.restype = ctypes.c_void_p
-
-iokit.IORegistryEntryGetName.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
-iokit.IORegistryEntryGetName.restype = ctypes.c_void_p
-
-iokit.IOObjectGetClass.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
-iokit.IOObjectGetClass.restype = ctypes.c_void_p
-
-iokit.IOObjectRelease.argtypes = [ctypes.c_void_p]
-
-
-cf.CFStringCreateWithCString.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32]
-cf.CFStringCreateWithCString.restype = ctypes.c_void_p
-
-cf.CFStringGetCStringPtr.argtypes = [ctypes.c_void_p, ctypes.c_uint32]
-cf.CFStringGetCStringPtr.restype = ctypes.c_char_p
-
-cf.CFNumberGetValue.argtypes = [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]
-cf.CFNumberGetValue.restype = ctypes.c_void_p
-
-def get_string_property(device_t, property):
-    """ Search the given device for the specified string property
-
-    @param device_t Device to search
-    @param property String to search for.
-    @return Python string containing the value, or None if not found.
-    """
-    key = cf.CFStringCreateWithCString(
-        kCFAllocatorDefault,
-        property.encode("mac_roman"),
-        kCFStringEncodingMacRoman
-    )
-
-    CFContainer = iokit.IORegistryEntryCreateCFProperty(
-        device_t,
-        key,
-        kCFAllocatorDefault,
-        0
-    );
-
-    output = None
-
-    if CFContainer:
-        output = cf.CFStringGetCStringPtr(CFContainer, 0)
-
-    return output
-
-def get_int_property(device_t, property):
-    """ Search the given device for the specified string property
-
-    @param device_t Device to search
-    @param property String to search for.
-    @return Python string containing the value, or None if not found.
-    """
-    key = cf.CFStringCreateWithCString(
-        kCFAllocatorDefault,
-        property.encode("mac_roman"),
-        kCFStringEncodingMacRoman
-    )
-
-    CFContainer = iokit.IORegistryEntryCreateCFProperty(
-        device_t,
-        key,
-        kCFAllocatorDefault,
-        0
-    );
-
-    number = ctypes.c_uint16()
-
-    if CFContainer:
-        output = cf.CFNumberGetValue(CFContainer, 2, ctypes.byref(number))
-
-    return number.value
-
-def IORegistryEntryGetName(device):
-    pathname = ctypes.create_string_buffer(100) # TODO: Is this ok?
-    iokit.IOObjectGetClass(
-        device,
-        ctypes.byref(pathname)
-    )
-
-    return pathname.value
-
-def GetParentDeviceByType(device, parent_type):
-    """ Find the first parent of a device that implements the parent_type
-        @param IOService Service to inspect
-        @return Pointer to the parent type, or None if it was not found.
-    """
-    # First, try to walk up the IOService tree to find a parent of this device that is a IOUSBDevice.
-    while IORegistryEntryGetName(device) != parent_type:
-        parent = ctypes.c_void_p()
-        response = iokit.IORegistryEntryGetParentEntry(
-            device,
-            "IOService".encode("mac_roman"),
-            ctypes.byref(parent)
-        )
-
-        # If we weren't able to find a parent for the device, we're done.
-        if response != 0:
-            return None
-
-        device = parent
-
-    return device
-
-def GetIOServicesByType(service_type):
-    """
-    """
-    serial_port_iterator = ctypes.c_void_p()
-
-    response = iokit.IOServiceGetMatchingServices(
-        kIOMasterPortDefault,
-        iokit.IOServiceMatching(service_type),
-        ctypes.byref(serial_port_iterator)
-    )
-
-    services = []
-    while iokit.IOIteratorIsValid(serial_port_iterator):
-        service = iokit.IOIteratorNext(serial_port_iterator)
-        if not service:
-            break
-        services.append(service)
-
-    iokit.IOObjectRelease(serial_port_iterator)
-
-    return services
-
-def comports():
-    # Scan for all iokit serial ports
-    services = GetIOServicesByType('IOSerialBSDClient')
-
-    ports = []
-    for service in services:
-        info = []
-
-        # First, add the callout device file.
-        info.append(get_string_property(service, "IOCalloutDevice"))
-
-        # If the serial port is implemented by a
-        usb_device = GetParentDeviceByType(service, "IOUSBDevice")
-        if usb_device != None:
-            info.append(get_string_property(usb_device, "USB Product Name"))
-
-            info.append(
-                "USB VID:PID=%x:%x SNR=%s"%(
-                get_int_property(usb_device, "idVendor"),
-                get_int_property(usb_device, "idProduct"),
-                get_string_property(usb_device, "USB Serial Number"))
-            )
-        else:
-           info.append('n/a')
-           info.append('n/a')
-
-        ports.append(info)
-
-    return ports
-
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print "%s: %s [%s]" % (port, desc, hwid)
-
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py b/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py
deleted file mode 100755
index 09f115f..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/usr/bin/env python
-
-# portable serial port access with python
-
-# This is a module that gathers a list of serial ports on POSIXy systems.
-# For some specific implementations, see also list_ports_linux, list_ports_osx
-#
-# this is a wrapper module for different platform implementations of the
-# port enumeration feature
-#
-# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-"""\
-The ``comports`` function is expected to return an iterable that yields tuples
-of 3 strings: port name, human readable description and a hardware ID.
-
-As currently no method is known to get the second two strings easily, they are
-currently just identical to the port name.
-"""
-
-import glob
-import sys
-import os
-
-# try to detect the OS so that a device can be selected...
-plat = sys.platform.lower()
-
-if   plat[:5] == 'linux':    # Linux (confirmed)
-    from serial.tools.list_ports_linux import comports
-
-elif plat == 'cygwin':       # cygwin/win32
-    def comports():
-        devices = glob.glob('/dev/com*')
-        return [(d, d, d) for d in devices]
-
-elif plat[:7] == 'openbsd':    # OpenBSD
-    def comports():
-        devices = glob.glob('/dev/cua*')
-        return [(d, d, d) for d in devices]
-
-elif plat[:3] == 'bsd' or  \
-        plat[:7] == 'freebsd':
-
-    def comports():
-        devices = glob.glob('/dev/cuad*')
-        return [(d, d, d) for d in devices]
-
-elif plat[:6] == 'darwin':   # OS X (confirmed)
-    from serial.tools.list_ports_osx import comports
-
-elif plat[:6] == 'netbsd':   # NetBSD
-    def comports():
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/dty*')
-        return [(d, d, d) for d in devices]
-
-elif plat[:4] == 'irix':     # IRIX
-    def comports():
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/ttyf*')
-        return [(d, d, d) for d in devices]
-
-elif plat[:2] == 'hp':       # HP-UX (not tested)
-    def comports():
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/tty*p0')
-        return [(d, d, d) for d in devices]
-
-elif plat[:5] == 'sunos':    # Solaris/SunOS
-    def comports():
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/tty*c')
-        return [(d, d, d) for d in devices]
-
-elif plat[:3] == 'aix':      # AIX
-    def comports():
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/tty*')
-        return [(d, d, d) for d in devices]
-
-else:
-    # platform detection has failed...
-    sys.stderr.write("""\
-don't know how to enumerate ttys on this system.
-! I you know how the serial ports are named send this information to
-! the author of this module:
-
-sys.platform = %r
-os.name = %r
-pySerial version = %s
-
-also add the naming scheme of the serial ports and with a bit luck you can get
-this module running...
-""" % (sys.platform, os.name, serial.VERSION))
-    raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
-
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print "%s: %s [%s]" % (port, desc, hwid)
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py b/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py
deleted file mode 100644
index ca597ca..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py
+++ /dev/null
@@ -1,240 +0,0 @@
-import ctypes
-import re
-
-def ValidHandle(value, func, arguments):
-    if value == 0:
-        raise ctypes.WinError()
-    return value
-
-import serial
-from serial.win32 import ULONG_PTR, is_64bit
-from ctypes.wintypes import HANDLE
-from ctypes.wintypes import BOOL
-from ctypes.wintypes import HWND
-from ctypes.wintypes import DWORD
-from ctypes.wintypes import WORD
-from ctypes.wintypes import LONG
-from ctypes.wintypes import ULONG
-from ctypes.wintypes import LPCSTR
-from ctypes.wintypes import HKEY
-from ctypes.wintypes import BYTE
-
-NULL = 0
-HDEVINFO = ctypes.c_void_p
-PCTSTR = ctypes.c_char_p
-PTSTR = ctypes.c_void_p
-CHAR = ctypes.c_char
-LPDWORD = PDWORD = ctypes.POINTER(DWORD)
-#~ LPBYTE = PBYTE = ctypes.POINTER(BYTE)
-LPBYTE = PBYTE = ctypes.c_void_p        # XXX avoids error about types
-
-ACCESS_MASK = DWORD
-REGSAM = ACCESS_MASK
-
-
-def byte_buffer(length):
-    """Get a buffer for a string"""
-    return (BYTE*length)()
-
-def string(buffer):
-    s = []
-    for c in buffer:
-        if c == 0: break
-        s.append(chr(c & 0xff)) # "& 0xff": hack to convert signed to unsigned
-    return ''.join(s)
-
-
-class GUID(ctypes.Structure):
-    _fields_ = [
-        ('Data1', DWORD),
-        ('Data2', WORD),
-        ('Data3', WORD),
-        ('Data4', BYTE*8),
-    ]
-    def __str__(self):
-        return "{%08x-%04x-%04x-%s-%s}" % (
-            self.Data1,
-            self.Data2,
-            self.Data3,
-            ''.join(["%02x" % d for d in self.Data4[:2]]),
-            ''.join(["%02x" % d for d in self.Data4[2:]]),
-        )
-
-class SP_DEVINFO_DATA(ctypes.Structure):
-    _fields_ = [
-        ('cbSize', DWORD),
-        ('ClassGuid', GUID),
-        ('DevInst', DWORD),
-        ('Reserved', ULONG_PTR),
-    ]
-    def __str__(self):
-        return "ClassGuid:%s DevInst:%s" % (self.ClassGuid, self.DevInst)
-PSP_DEVINFO_DATA = ctypes.POINTER(SP_DEVINFO_DATA)
-
-PSP_DEVICE_INTERFACE_DETAIL_DATA = ctypes.c_void_p
-
-setupapi = ctypes.windll.LoadLibrary("setupapi")
-SetupDiDestroyDeviceInfoList = setupapi.SetupDiDestroyDeviceInfoList
-SetupDiDestroyDeviceInfoList.argtypes = [HDEVINFO]
-SetupDiDestroyDeviceInfoList.restype = BOOL
-
-SetupDiClassGuidsFromName = setupapi.SetupDiClassGuidsFromNameA
-SetupDiClassGuidsFromName.argtypes = [PCTSTR, ctypes.POINTER(GUID), DWORD, PDWORD]
-SetupDiClassGuidsFromName.restype = BOOL
-
-SetupDiEnumDeviceInfo = setupapi.SetupDiEnumDeviceInfo
-SetupDiEnumDeviceInfo.argtypes = [HDEVINFO, DWORD, PSP_DEVINFO_DATA]
-SetupDiEnumDeviceInfo.restype = BOOL
-
-SetupDiGetClassDevs = setupapi.SetupDiGetClassDevsA
-SetupDiGetClassDevs.argtypes = [ctypes.POINTER(GUID), PCTSTR, HWND, DWORD]
-SetupDiGetClassDevs.restype = HDEVINFO
-SetupDiGetClassDevs.errcheck = ValidHandle
-
-SetupDiGetDeviceRegistryProperty = setupapi.SetupDiGetDeviceRegistryPropertyA
-SetupDiGetDeviceRegistryProperty.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD]
-SetupDiGetDeviceRegistryProperty.restype = BOOL
-
-SetupDiGetDeviceInstanceId = setupapi.SetupDiGetDeviceInstanceIdA
-SetupDiGetDeviceInstanceId.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, PTSTR, DWORD, PDWORD]
-SetupDiGetDeviceInstanceId.restype = BOOL
-
-SetupDiOpenDevRegKey = setupapi.SetupDiOpenDevRegKey
-SetupDiOpenDevRegKey.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM]
-SetupDiOpenDevRegKey.restype = HKEY
-
-advapi32 = ctypes.windll.LoadLibrary("Advapi32")
-RegCloseKey = advapi32.RegCloseKey
-RegCloseKey.argtypes = [HKEY]
-RegCloseKey.restype = LONG
-
-RegQueryValueEx = advapi32.RegQueryValueExA
-RegQueryValueEx.argtypes = [HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD]
-RegQueryValueEx.restype = LONG
-
-
-DIGCF_PRESENT = 2
-DIGCF_DEVICEINTERFACE = 16
-INVALID_HANDLE_VALUE = 0
-ERROR_INSUFFICIENT_BUFFER = 122
-SPDRP_HARDWAREID = 1
-SPDRP_FRIENDLYNAME = 12
-DICS_FLAG_GLOBAL = 1
-DIREG_DEV = 0x00000001
-KEY_READ = 0x20019
-
-# workaround for compatibility between Python 2.x and 3.x
-Ports = serial.to_bytes([80, 111, 114, 116, 115]) # "Ports"
-PortName = serial.to_bytes([80, 111, 114, 116, 78, 97, 109, 101]) # "PortName"
-
-def comports():
-    GUIDs = (GUID*8)() # so far only seen one used, so hope 8 are enough...
-    guids_size = DWORD()
-    if not SetupDiClassGuidsFromName(
-            Ports,
-            GUIDs,
-            ctypes.sizeof(GUIDs),
-            ctypes.byref(guids_size)):
-        raise ctypes.WinError()
-
-    # repeat for all possible GUIDs
-    for index in range(guids_size.value):
-        g_hdi = SetupDiGetClassDevs(
-                ctypes.byref(GUIDs[index]),
-                None,
-                NULL,
-                DIGCF_PRESENT) # was DIGCF_PRESENT|DIGCF_DEVICEINTERFACE which misses CDC ports
-
-        devinfo = SP_DEVINFO_DATA()
-        devinfo.cbSize = ctypes.sizeof(devinfo)
-        index = 0
-        while SetupDiEnumDeviceInfo(g_hdi, index, ctypes.byref(devinfo)):
-            index += 1
-
-            # get the real com port name
-            hkey = SetupDiOpenDevRegKey(
-                    g_hdi,
-                    ctypes.byref(devinfo),
-                    DICS_FLAG_GLOBAL,
-                    0,
-                    DIREG_DEV,  # DIREG_DRV for SW info
-                    KEY_READ)
-            port_name_buffer = byte_buffer(250)
-            port_name_length = ULONG(ctypes.sizeof(port_name_buffer))
-            RegQueryValueEx(
-                    hkey,
-                    PortName,
-                    None,
-                    None,
-                    ctypes.byref(port_name_buffer),
-                    ctypes.byref(port_name_length))
-            RegCloseKey(hkey)
-
-            # unfortunately does this method also include parallel ports.
-            # we could check for names starting with COM or just exclude LPT
-            # and hope that other "unknown" names are serial ports...
-            if string(port_name_buffer).startswith('LPT'):
-                continue
-
-            # hardware ID
-            szHardwareID = byte_buffer(250)
-            # try to get ID that includes serial number
-            if not SetupDiGetDeviceInstanceId(
-                    g_hdi,
-                    ctypes.byref(devinfo),
-                    ctypes.byref(szHardwareID),
-                    ctypes.sizeof(szHardwareID) - 1,
-                    None):
-                # fall back to more generic hardware ID if that would fail
-                if not SetupDiGetDeviceRegistryProperty(
-                        g_hdi,
-                        ctypes.byref(devinfo),
-                        SPDRP_HARDWAREID,
-                        None,
-                        ctypes.byref(szHardwareID),
-                        ctypes.sizeof(szHardwareID) - 1,
-                        None):
-                    # Ignore ERROR_INSUFFICIENT_BUFFER
-                    if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER:
-                        raise ctypes.WinError()
-            # stringify
-            szHardwareID_str = string(szHardwareID)
-
-            # in case of USB, make a more readable string, similar to that form
-            # that we also generate on other platforms
-            if szHardwareID_str.startswith('USB'):
-                m = re.search(r'VID_([0-9a-f]{4})&PID_([0-9a-f]{4})(\\(\w+))?', szHardwareID_str, re.I)
-                if m:
-                    if m.group(4):
-                        szHardwareID_str = 'USB VID:PID=%s:%s SNR=%s' % (m.group(1), m.group(2), m.group(4))
-                    else:
-                        szHardwareID_str = 'USB VID:PID=%s:%s' % (m.group(1), m.group(2))
-
-            # friendly name
-            szFriendlyName = byte_buffer(250)
-            if not SetupDiGetDeviceRegistryProperty(
-                    g_hdi,
-                    ctypes.byref(devinfo),
-                    SPDRP_FRIENDLYNAME,
-                    #~ SPDRP_DEVICEDESC,
-                    None,
-                    ctypes.byref(szFriendlyName),
-                    ctypes.sizeof(szFriendlyName) - 1,
-                    None):
-                # Ignore ERROR_INSUFFICIENT_BUFFER
-                #~ if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER:
-                    #~ raise IOError("failed to get details for %s (%s)" % (devinfo, szHardwareID.value))
-                # ignore errors and still include the port in the list, friendly name will be same as port name
-                yield string(port_name_buffer), 'n/a', szHardwareID_str
-            else:
-                yield string(port_name_buffer), string(szFriendlyName), szHardwareID_str
-
-        SetupDiDestroyDeviceInfoList(g_hdi)
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    import serial
-
-    for port, desc, hwid in sorted(comports()):
-        print "%s: %s [%s]" % (port, desc, hwid)
diff --git a/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py b/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py
deleted file mode 100755
index 274c7fb..0000000
--- a/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py
+++ /dev/null
@@ -1,694 +0,0 @@
-#!/usr/bin/env python
-
-# Very simple serial terminal
-# (C)2002-2011 Chris Liechti <cliechti@gmx.net>
-
-# Input characters are sent directly (only LF -> CR/LF/CRLF translation is
-# done), received characters are displayed as is (or escaped trough pythons
-# repr, useful for debug purposes)
-
-
-import sys, os, serial, threading
-try:
-    from serial.tools.list_ports import comports
-except ImportError:
-    comports = None
-
-EXITCHARCTER = serial.to_bytes([0x1d])   # GS/CTRL+]
-MENUCHARACTER = serial.to_bytes([0x14])  # Menu: CTRL+T
-
-DEFAULT_PORT = None
-DEFAULT_BAUDRATE = 9600
-DEFAULT_RTS = None
-DEFAULT_DTR = None
-
-
-def key_description(character):
-    """generate a readable description for a key"""
-    ascii_code = ord(character)
-    if ascii_code < 32:
-        return 'Ctrl+%c' % (ord('@') + ascii_code)
-    else:
-        return repr(character)
-
-
-# help text, starts with blank line! it's a function so that the current values
-# for the shortcut keys is used and not the value at program start
-def get_help_text():
-    return """
---- pySerial (%(version)s) - miniterm - help
----
---- %(exit)-8s Exit program
---- %(menu)-8s Menu escape key, followed by:
---- Menu keys:
----    %(itself)-7s Send the menu character itself to remote
----    %(exchar)-7s Send the exit character itself to remote
----    %(info)-7s Show info
----    %(upload)-7s Upload file (prompt will be shown)
---- Toggles:
----    %(rts)-7s RTS          %(echo)-7s local echo
----    %(dtr)-7s DTR          %(break)-7s BREAK
----    %(lfm)-7s line feed    %(repr)-7s Cycle repr mode
----
---- Port settings (%(menu)s followed by the following):
----    p          change port
----    7 8        set data bits
----    n e o s m  change parity (None, Even, Odd, Space, Mark)
----    1 2 3      set stop bits (1, 2, 1.5)
----    b          change baud rate
----    x X        disable/enable software flow control
----    r R        disable/enable hardware flow control
-""" % {
-    'version': getattr(serial, 'VERSION', 'unknown version'),
-    'exit': key_description(EXITCHARCTER),
-    'menu': key_description(MENUCHARACTER),
-    'rts': key_description('\x12'),
-    'repr': key_description('\x01'),
-    'dtr': key_description('\x04'),
-    'lfm': key_description('\x0c'),
-    'break': key_description('\x02'),
-    'echo': key_description('\x05'),
-    'info': key_description('\x09'),
-    'upload': key_description('\x15'),
-    'itself': key_description(MENUCHARACTER),
-    'exchar': key_description(EXITCHARCTER),
-}
-
-if sys.version_info >= (3, 0):
-    def character(b):
-        return b.decode('latin1')
-else:
-    def character(b):
-        return b
-
-LF = serial.to_bytes([10])
-CR = serial.to_bytes([13])
-CRLF = serial.to_bytes([13, 10])
-
-X00 = serial.to_bytes([0])
-X0E = serial.to_bytes([0x0e])
-
-# first choose a platform dependant way to read single characters from the console
-global console
-
-if os.name == 'nt':
-    import msvcrt
-    class Console(object):
-        def __init__(self):
-            pass
-
-        def setup(self):
-            pass    # Do nothing for 'nt'
-
-        def cleanup(self):
-            pass    # Do nothing for 'nt'
-
-        def getkey(self):
-            while True:
-                z = msvcrt.getch()
-                if z == X00 or z == X0E:    # functions keys, ignore
-                    msvcrt.getch()
-                else:
-                    if z == CR:
-                        return LF
-                    return z
-
-    console = Console()
-
-elif os.name == 'posix':
-    import termios, sys, os
-    class Console(object):
-        def __init__(self):
-            self.fd = sys.stdin.fileno()
-            self.old = None
-
-        def setup(self):
-            self.old = termios.tcgetattr(self.fd)
-            new = termios.tcgetattr(self.fd)
-            new[3] = new[3] & ~termios.ICANON & ~termios.ECHO & ~termios.ISIG
-            new[6][termios.VMIN] = 1
-            new[6][termios.VTIME] = 0
-            termios.tcsetattr(self.fd, termios.TCSANOW, new)
-
-        def getkey(self):
-            c = os.read(self.fd, 1)
-            return c
-
-        def cleanup(self):
-            if self.old is not None:
-                termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old)
-
-    console = Console()
-
-    def cleanup_console():
-        console.cleanup()
-
-    sys.exitfunc = cleanup_console      # terminal modes have to be restored on exit...
-
-else:
-    raise NotImplementedError("Sorry no implementation for your platform (%s) available." % sys.platform)
-
-
-def dump_port_list():
-    if comports:
-        sys.stderr.write('\n--- Available ports:\n')
-        for port, desc, hwid in sorted(comports()):
-            #~ sys.stderr.write('--- %-20s %s [%s]\n' % (port, desc, hwid))
-            sys.stderr.write('--- %-20s %s\n' % (port, desc))
-
-
-CONVERT_CRLF = 2
-CONVERT_CR   = 1
-CONVERT_LF   = 0
-NEWLINE_CONVERISON_MAP = (LF, CR, CRLF)
-LF_MODES = ('LF', 'CR', 'CR/LF')
-
-REPR_MODES = ('raw', 'some control', 'all control', 'hex')
-
-class Miniterm(object):
-    def __init__(self, port, baudrate, parity, rtscts, xonxoff, echo=False, convert_outgoing=CONVERT_CRLF, repr_mode=0):
-        try:
-            self.serial = serial.serial_for_url(port, baudrate, parity=parity, rtscts=rtscts, xonxoff=xonxoff, timeout=1)
-        except AttributeError:
-            # happens when the installed pyserial is older than 2.5. use the
-            # Serial class directly then.
-            self.serial = serial.Serial(port, baudrate, parity=parity, rtscts=rtscts, xonxoff=xonxoff, timeout=1)
-        self.echo = echo
-        self.repr_mode = repr_mode
-        self.convert_outgoing = convert_outgoing
-        self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing]
-        self.dtr_state = True
-        self.rts_state = True
-        self.break_state = False
-
-    def _start_reader(self):
-        """Start reader thread"""
-        self._reader_alive = True
-        # start serial->console thread
-        self.receiver_thread = threading.Thread(target=self.reader)
-        self.receiver_thread.setDaemon(True)
-        self.receiver_thread.start()
-
-    def _stop_reader(self):
-        """Stop reader thread only, wait for clean exit of thread"""
-        self._reader_alive = False
-        self.receiver_thread.join()
-
-
-    def start(self):
-        self.alive = True
-        self._start_reader()
-        # enter console->serial loop
-        self.transmitter_thread = threading.Thread(target=self.writer)
-        self.transmitter_thread.setDaemon(True)
-        self.transmitter_thread.start()
-
-    def stop(self):
-        self.alive = False
-
-    def join(self, transmit_only=False):
-        self.transmitter_thread.join()
-        if not transmit_only:
-            self.receiver_thread.join()
-
-    def dump_port_settings(self):
-        sys.stderr.write("\n--- Settings: %s  %s,%s,%s,%s\n" % (
-                self.serial.portstr,
-                self.serial.baudrate,
-                self.serial.bytesize,
-                self.serial.parity,
-                self.serial.stopbits))
-        sys.stderr.write('--- RTS: %-8s  DTR: %-8s  BREAK: %-8s\n' % (
-                (self.rts_state and 'active' or 'inactive'),
-                (self.dtr_state and 'active' or 'inactive'),
-                (self.break_state and 'active' or 'inactive')))
-        try:
-            sys.stderr.write('--- CTS: %-8s  DSR: %-8s  RI: %-8s  CD: %-8s\n' % (
-                    (self.serial.getCTS() and 'active' or 'inactive'),
-                    (self.serial.getDSR() and 'active' or 'inactive'),
-                    (self.serial.getRI() and 'active' or 'inactive'),
-                    (self.serial.getCD() and 'active' or 'inactive')))
-        except serial.SerialException:
-            # on RFC 2217 ports it can happen to no modem state notification was
-            # yet received. ignore this error.
-            pass
-        sys.stderr.write('--- software flow control: %s\n' % (self.serial.xonxoff and 'active' or 'inactive'))
-        sys.stderr.write('--- hardware flow control: %s\n' % (self.serial.rtscts and 'active' or 'inactive'))
-        sys.stderr.write('--- data escaping: %s  linefeed: %s\n' % (
-                REPR_MODES[self.repr_mode],
-                LF_MODES[self.convert_outgoing]))
-
-    def reader(self):
-        """loop and copy serial->console"""
-        try:
-            while self.alive and self._reader_alive:
-                data = character(self.serial.read(1))
-
-                if self.repr_mode == 0:
-                    # direct output, just have to care about newline setting
-                    if data == '\r' and self.convert_outgoing == CONVERT_CR:
-                        sys.stdout.write('\n')
-                    else:
-                        sys.stdout.write(data)
-                elif self.repr_mode == 1:
-                    # escape non-printable, let pass newlines
-                    if self.convert_outgoing == CONVERT_CRLF and data in '\r\n':
-                        if data == '\n':
-                            sys.stdout.write('\n')
-                        elif data == '\r':
-                            pass
-                    elif data == '\n' and self.convert_outgoing == CONVERT_LF:
-                        sys.stdout.write('\n')
-                    elif data == '\r' and self.convert_outgoing == CONVERT_CR:
-                        sys.stdout.write('\n')
-                    else:
-                        sys.stdout.write(repr(data)[1:-1])
-                elif self.repr_mode == 2:
-                    # escape all non-printable, including newline
-                    sys.stdout.write(repr(data)[1:-1])
-                elif self.repr_mode == 3:
-                    # escape everything (hexdump)
-                    for c in data:
-                        sys.stdout.write("%s " % c.encode('hex'))
-                sys.stdout.flush()
-        except serial.SerialException, e:
-            self.alive = False
-            # would be nice if the console reader could be interruptted at this
-            # point...
-            raise
-
-
-    def writer(self):
-        """\
-        Loop and copy console->serial until EXITCHARCTER character is
-        found. When MENUCHARACTER is found, interpret the next key
-        locally.
-        """
-        menu_active = False
-        try:
-            while self.alive:
-                try:
-                    b = console.getkey()
-                except KeyboardInterrupt:
-                    b = serial.to_bytes([3])
-                c = character(b)
-                if menu_active:
-                    if c == MENUCHARACTER or c == EXITCHARCTER: # Menu character again/exit char -> send itself
-                        self.serial.write(b)                    # send character
-                        if self.echo:
-                            sys.stdout.write(c)
-                    elif c == '\x15':                       # CTRL+U -> upload file
-                        sys.stderr.write('\n--- File to upload: ')
-                        sys.stderr.flush()
-                        console.cleanup()
-                        filename = sys.stdin.readline().rstrip('\r\n')
-                        if filename:
-                            try:
-                                file = open(filename, 'r')
-                                sys.stderr.write('--- Sending file %s ---\n' % filename)
-                                while True:
-                                    line = file.readline().rstrip('\r\n')
-                                    if not line:
-                                        break
-                                    self.serial.write(line)
-                                    self.serial.write('\r\n')
-                                    # Wait for output buffer to drain.
-                                    self.serial.flush()
-                                    sys.stderr.write('.')   # Progress indicator.
-                                sys.stderr.write('\n--- File %s sent ---\n' % filename)
-                            except IOError, e:
-                                sys.stderr.write('--- ERROR opening file %s: %s ---\n' % (filename, e))
-                        console.setup()
-                    elif c in '\x08hH?':                    # CTRL+H, h, H, ? -> Show help
-                        sys.stderr.write(get_help_text())
-                    elif c == '\x12':                       # CTRL+R -> Toggle RTS
-                        self.rts_state = not self.rts_state
-                        self.serial.setRTS(self.rts_state)
-                        sys.stderr.write('--- RTS %s ---\n' % (self.rts_state and 'active' or 'inactive'))
-                    elif c == '\x04':                       # CTRL+D -> Toggle DTR
-                        self.dtr_state = not self.dtr_state
-                        self.serial.setDTR(self.dtr_state)
-                        sys.stderr.write('--- DTR %s ---\n' % (self.dtr_state and 'active' or 'inactive'))
-                    elif c == '\x02':                       # CTRL+B -> toggle BREAK condition
-                        self.break_state = not self.break_state
-                        self.serial.setBreak(self.break_state)
-                        sys.stderr.write('--- BREAK %s ---\n' % (self.break_state and 'active' or 'inactive'))
-                    elif c == '\x05':                       # CTRL+E -> toggle local echo
-                        self.echo = not self.echo
-                        sys.stderr.write('--- local echo %s ---\n' % (self.echo and 'active' or 'inactive'))
-                    elif c == '\x09':                       # CTRL+I -> info
-                        self.dump_port_settings()
-                    elif c == '\x01':                       # CTRL+A -> cycle escape mode
-                        self.repr_mode += 1
-                        if self.repr_mode > 3:
-                            self.repr_mode = 0
-                        sys.stderr.write('--- escape data: %s ---\n' % (
-                            REPR_MODES[self.repr_mode],
-                        ))
-                    elif c == '\x0c':                       # CTRL+L -> cycle linefeed mode
-                        self.convert_outgoing += 1
-                        if self.convert_outgoing > 2:
-                            self.convert_outgoing = 0
-                        self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing]
-                        sys.stderr.write('--- line feed %s ---\n' % (
-                            LF_MODES[self.convert_outgoing],
-                        ))
-                    elif c in 'pP':                         # P -> change port
-                        dump_port_list()
-                        sys.stderr.write('--- Enter port name: ')
-                        sys.stderr.flush()
-                        console.cleanup()
-                        try:
-                            port = sys.stdin.readline().strip()
-                        except KeyboardInterrupt:
-                            port = None
-                        console.setup()
-                        if port and port != self.serial.port:
-                            # reader thread needs to be shut down
-                            self._stop_reader()
-                            # save settings
-                            settings = self.serial.getSettingsDict()
-                            try:
-                                try:
-                                    new_serial = serial.serial_for_url(port, do_not_open=True)
-                                except AttributeError:
-                                    # happens when the installed pyserial is older than 2.5. use the
-                                    # Serial class directly then.
-                                    new_serial = serial.Serial()
-                                    new_serial.port = port
-                                # restore settings and open
-                                new_serial.applySettingsDict(settings)
-                                new_serial.open()
-                                new_serial.setRTS(self.rts_state)
-                                new_serial.setDTR(self.dtr_state)
-                                new_serial.setBreak(self.break_state)
-                            except Exception, e:
-                                sys.stderr.write('--- ERROR opening new port: %s ---\n' % (e,))
-                                new_serial.close()
-                            else:
-                                self.serial.close()
-                                self.serial = new_serial
-                                sys.stderr.write('--- Port changed to: %s ---\n' % (self.serial.port,))
-                            # and restart the reader thread
-                            self._start_reader()
-                    elif c in 'bB':                         # B -> change baudrate
-                        sys.stderr.write('\n--- Baudrate: ')
-                        sys.stderr.flush()
-                        console.cleanup()
-                        backup = self.serial.baudrate
-                        try:
-                            self.serial.baudrate = int(sys.stdin.readline().strip())
-                        except ValueError, e:
-                            sys.stderr.write('--- ERROR setting baudrate: %s ---\n' % (e,))
-                            self.serial.baudrate = backup
-                        else:
-                            self.dump_port_settings()
-                        console.setup()
-                    elif c == '8':                          # 8 -> change to 8 bits
-                        self.serial.bytesize = serial.EIGHTBITS
-                        self.dump_port_settings()
-                    elif c == '7':                          # 7 -> change to 8 bits
-                        self.serial.bytesize = serial.SEVENBITS
-                        self.dump_port_settings()
-                    elif c in 'eE':                         # E -> change to even parity
-                        self.serial.parity = serial.PARITY_EVEN
-                        self.dump_port_settings()
-                    elif c in 'oO':                         # O -> change to odd parity
-                        self.serial.parity = serial.PARITY_ODD
-                        self.dump_port_settings()
-                    elif c in 'mM':                         # M -> change to mark parity
-                        self.serial.parity = serial.PARITY_MARK
-                        self.dump_port_settings()
-                    elif c in 'sS':                         # S -> change to space parity
-                        self.serial.parity = serial.PARITY_SPACE
-                        self.dump_port_settings()
-                    elif c in 'nN':                         # N -> change to no parity
-                        self.serial.parity = serial.PARITY_NONE
-                        self.dump_port_settings()
-                    elif c == '1':                          # 1 -> change to 1 stop bits
-                        self.serial.stopbits = serial.STOPBITS_ONE
-                        self.dump_port_settings()
-                    elif c == '2':                          # 2 -> change to 2 stop bits
-                        self.serial.stopbits = serial.STOPBITS_TWO
-                        self.dump_port_settings()
-                    elif c == '3':                          # 3 -> change to 1.5 stop bits
-                        self.serial.stopbits = serial.STOPBITS_ONE_POINT_FIVE
-                        self.dump_port_settings()
-                    elif c in 'xX':                         # X -> change software flow control
-                        self.serial.xonxoff = (c == 'X')
-                        self.dump_port_settings()
-                    elif c in 'rR':                         # R -> change hardware flow control
-                        self.serial.rtscts = (c == 'R')
-                        self.dump_port_settings()
-                    else:
-                        sys.stderr.write('--- unknown menu character %s --\n' % key_description(c))
-                    menu_active = False
-                elif c == MENUCHARACTER: # next char will be for menu
-                    menu_active = True
-                elif c == EXITCHARCTER: 
-                    self.stop()
-                    break                                   # exit app
-                elif c == '\n':
-                    self.serial.write(self.newline)         # send newline character(s)
-                    if self.echo:
-                        sys.stdout.write(c)                 # local echo is a real newline in any case
-                        sys.stdout.flush()
-                else:
-                    self.serial.write(b)                    # send byte
-                    if self.echo:
-                        sys.stdout.write(c)
-                        sys.stdout.flush()
-        except:
-            self.alive = False
-            raise
-
-def main():
-    import optparse
-
-    parser = optparse.OptionParser(
-        usage = "%prog [options] [port [baudrate]]",
-        description = "Miniterm - A simple terminal program for the serial port."
-    )
-
-    group = optparse.OptionGroup(parser, "Port settings")
-
-    group.add_option("-p", "--port",
-        dest = "port",
-        help = "port, a number or a device name. (deprecated option, use parameter instead)",
-        default = DEFAULT_PORT
-    )
-
-    group.add_option("-b", "--baud",
-        dest = "baudrate",
-        action = "store",
-        type = 'int',
-        help = "set baud rate, default %default",
-        default = DEFAULT_BAUDRATE
-    )
-
-    group.add_option("--parity",
-        dest = "parity",
-        action = "store",
-        help = "set parity, one of [N, E, O, S, M], default=N",
-        default = 'N'
-    )
-
-    group.add_option("--rtscts",
-        dest = "rtscts",
-        action = "store_true",
-        help = "enable RTS/CTS flow control (default off)",
-        default = False
-    )
-
-    group.add_option("--xonxoff",
-        dest = "xonxoff",
-        action = "store_true",
-        help = "enable software flow control (default off)",
-        default = False
-    )
-
-    group.add_option("--rts",
-        dest = "rts_state",
-        action = "store",
-        type = 'int',
-        help = "set initial RTS line state (possible values: 0, 1)",
-        default = DEFAULT_RTS
-    )
-
-    group.add_option("--dtr",
-        dest = "dtr_state",
-        action = "store",
-        type = 'int',
-        help = "set initial DTR line state (possible values: 0, 1)",
-        default = DEFAULT_DTR
-    )
-
-    parser.add_option_group(group)
-
-    group = optparse.OptionGroup(parser, "Data handling")
-
-    group.add_option("-e", "--echo",
-        dest = "echo",
-        action = "store_true",
-        help = "enable local echo (default off)",
-        default = False
-    )
-
-    group.add_option("--cr",
-        dest = "cr",
-        action = "store_true",
-        help = "do not send CR+LF, send CR only",
-        default = False
-    )
-
-    group.add_option("--lf",
-        dest = "lf",
-        action = "store_true",
-        help = "do not send CR+LF, send LF only",
-        default = False
-    )
-
-    group.add_option("-D", "--debug",
-        dest = "repr_mode",
-        action = "count",
-        help = """debug received data (escape non-printable chars)
---debug can be given multiple times:
-0: just print what is received
-1: escape non-printable characters, do newlines as unusual
-2: escape non-printable characters, newlines too
-3: hex dump everything""",
-        default = 0
-    )
-
-    parser.add_option_group(group)
-
-
-    group = optparse.OptionGroup(parser, "Hotkeys")
-
-    group.add_option("--exit-char",
-        dest = "exit_char",
-        action = "store",
-        type = 'int',
-        help = "ASCII code of special character that is used to exit the application",
-        default = 0x1d
-    )
-
-    group.add_option("--menu-char",
-        dest = "menu_char",
-        action = "store",
-        type = 'int',
-        help = "ASCII code of special character that is used to control miniterm (menu)",
-        default = 0x14
-    )
-
-    parser.add_option_group(group)
-
-    group = optparse.OptionGroup(parser, "Diagnostics")
-
-    group.add_option("-q", "--quiet",
-        dest = "quiet",
-        action = "store_true",
-        help = "suppress non-error messages",
-        default = False
-    )
-
-    parser.add_option_group(group)
-
-
-    (options, args) = parser.parse_args()
-
-    options.parity = options.parity.upper()
-    if options.parity not in 'NEOSM':
-        parser.error("invalid parity")
-
-    if options.cr and options.lf:
-        parser.error("only one of --cr or --lf can be specified")
-
-    if options.menu_char == options.exit_char:
-        parser.error('--exit-char can not be the same as --menu-char')
-
-    global EXITCHARCTER, MENUCHARACTER
-    EXITCHARCTER = chr(options.exit_char)
-    MENUCHARACTER = chr(options.menu_char)
-
-    port = options.port
-    baudrate = options.baudrate
-    if args:
-        if options.port is not None:
-            parser.error("no arguments are allowed, options only when --port is given")
-        port = args.pop(0)
-        if args:
-            try:
-                baudrate = int(args[0])
-            except ValueError:
-                parser.error("baud rate must be a number, not %r" % args[0])
-            args.pop(0)
-        if args:
-            parser.error("too many arguments")
-    else:
-        # noport given on command line -> ask user now
-        if port is None:
-            dump_port_list()
-            port = raw_input('Enter port name:')
-
-    convert_outgoing = CONVERT_CRLF
-    if options.cr:
-        convert_outgoing = CONVERT_CR
-    elif options.lf:
-        convert_outgoing = CONVERT_LF
-
-    try:
-        miniterm = Miniterm(
-            port,
-            baudrate,
-            options.parity,
-            rtscts=options.rtscts,
-            xonxoff=options.xonxoff,
-            echo=options.echo,
-            convert_outgoing=convert_outgoing,
-            repr_mode=options.repr_mode,
-        )
-    except serial.SerialException, e:
-        sys.stderr.write("could not open port %r: %s\n" % (port, e))
-        sys.exit(1)
-
-    if not options.quiet:
-        sys.stderr.write('--- Miniterm on %s: %d,%s,%s,%s ---\n' % (
-            miniterm.serial.portstr,
-            miniterm.serial.baudrate,
-            miniterm.serial.bytesize,
-            miniterm.serial.parity,
-            miniterm.serial.stopbits,
-        ))
-        sys.stderr.write('--- Quit: %s  |  Menu: %s | Help: %s followed by %s ---\n' % (
-            key_description(EXITCHARCTER),
-            key_description(MENUCHARACTER),
-            key_description(MENUCHARACTER),
-            key_description('\x08'),
-        ))
-
-    if options.dtr_state is not None:
-        if not options.quiet:
-            sys.stderr.write('--- forcing DTR %s\n' % (options.dtr_state and 'active' or 'inactive'))
-        miniterm.serial.setDTR(options.dtr_state)
-        miniterm.dtr_state = options.dtr_state
-    if options.rts_state is not None:
-        if not options.quiet:
-            sys.stderr.write('--- forcing RTS %s\n' % (options.rts_state and 'active' or 'inactive'))
-        miniterm.serial.setRTS(options.rts_state)
-        miniterm.rts_state = options.rts_state
-
-    console.setup()
-    miniterm.start()
-    try:
-        miniterm.join(True)
-    except KeyboardInterrupt:
-        pass
-    if not options.quiet:
-        sys.stderr.write("\n--- exit ---\n")
-    miniterm.join()
-    #~ console.cleanup()
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    main()
diff --git a/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py b/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py
+++ /dev/null
diff --git a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py b/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py
deleted file mode 100644
index 62cda43..0000000
--- a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#! python
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# see __init__.py
-#
-# This module implements a special URL handler that uses the port listing to
-# find ports by searching the string descriptions.
-#
-# (C) 2011 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-#
-# URL format:    hwgrep://regexp
-
-import serial
-import serial.tools.list_ports
-
-class Serial(serial.Serial):
-    """Just inherit the native Serial port implementation and patch the open function."""
-
-    def setPort(self, value):
-        """translate port name before storing it"""
-        if isinstance(value, basestring) and value.startswith('hwgrep://'):
-            serial.Serial.setPort(self, self.fromURL(value))
-        else:
-            serial.Serial.setPort(self, value)
-
-    def fromURL(self, url):
-        """extract host and port from an URL string"""
-        if url.lower().startswith("hwgrep://"): url = url[9:]
-        # use a for loop to get the 1st element from the generator
-        for port, desc, hwid in serial.tools.list_ports.grep(url):
-            return port
-        else:
-            raise serial.SerialException('no ports found matching regexp %r' % (url,))
-
-    # override property
-    port = property(serial.Serial.getPort, setPort, doc="Port setting")
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    #~ s = Serial('hwgrep://ttyS0')
-    s = Serial(None)
-    s.port = 'hwgrep://ttyS0'
-    print s
-
diff --git a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py b/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py
deleted file mode 100644
index 7da94ad..0000000
--- a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py
+++ /dev/null
@@ -1,265 +0,0 @@
-#! python
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# see __init__.py
-#
-# This module implements a loop back connection receiving itself what it sent.
-#
-# The purpose of this module is.. well... You can run the unit tests with it.
-# and it was so easy to implement ;-)
-#
-# (C) 2001-2011 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-#
-# URL format:    loop://[option[/option...]]
-# options:
-# - "debug" print diagnostic messages
-
-from serial.serialutil import *
-import threading
-import time
-import logging
-
-# map log level names to constants. used in fromURL()
-LOGGER_LEVELS = {
-    'debug': logging.DEBUG,
-    'info': logging.INFO,
-    'warning': logging.WARNING,
-    'error': logging.ERROR,
-    }
-
-
-class LoopbackSerial(SerialBase):
-    """Serial port implementation that simulates a loop back connection in plain software."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def open(self):
-        """Open port with current settings. This may throw a SerialException
-           if the port cannot be opened."""
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        self.logger = None
-        self.buffer_lock = threading.Lock()
-        self.loop_buffer = bytearray()
-        self.cts = False
-        self.dsr = False
-
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        # not that there is anything to open, but the function applies the
-        # options found in the URL
-        self.fromURL(self.port)
-
-        # not that there anything to configure...
-        self._reconfigurePort()
-        # all things set up get, now a clean start
-        self._isOpen = True
-        if not self._rtscts:
-            self.setRTS(True)
-            self.setDTR(True)
-        self.flushInput()
-        self.flushOutput()
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port. for the loop://
-        protocol all settings are ignored!"""
-        # not that's it of any real use, but it helps in the unit tests
-        if not isinstance(self._baudrate, (int, long)) or not 0 < self._baudrate < 2**32:
-            raise ValueError("invalid baudrate: %r" % (self._baudrate))
-        if self.logger:
-            self.logger.info('_reconfigurePort()')
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            self._isOpen = False
-            # in case of quick reconnects, give the server some time
-            time.sleep(0.3)
-
-    def makeDeviceName(self, port):
-        raise SerialException("there is no sensible way to turn numbers into URLs")
-
-    def fromURL(self, url):
-        """extract host and port from an URL string"""
-        if url.lower().startswith("loop://"): url = url[7:]
-        try:
-            # process options now, directly altering self
-            for option in url.split('/'):
-                if '=' in option:
-                    option, value = option.split('=', 1)
-                else:
-                    value = None
-                if not option:
-                    pass
-                elif option == 'logging':
-                    logging.basicConfig()   # XXX is that good to call it here?
-                    self.logger = logging.getLogger('pySerial.loop')
-                    self.logger.setLevel(LOGGER_LEVELS[value])
-                    self.logger.debug('enabled logging')
-                else:
-                    raise ValueError('unknown option: %r' % (option,))
-        except ValueError, e:
-            raise SerialException('expected a string in the form "[loop://][option[/option...]]": %s' % e)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            # attention the logged value can differ from return value in
-            # threaded environments...
-            self.logger.debug('inWaiting() -> %d' % (len(self.loop_buffer),))
-        return len(self.loop_buffer)
-
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read."""
-        if not self._isOpen: raise portNotOpenError
-        if self._timeout is not None:
-            timeout = time.time() + self._timeout
-        else:
-            timeout = None
-        data = bytearray()
-        while size > 0:
-            self.buffer_lock.acquire()
-            try:
-                block = to_bytes(self.loop_buffer[:size])
-                del self.loop_buffer[:size]
-            finally:
-                self.buffer_lock.release()
-            data += block
-            size -= len(block)
-            # check for timeout now, after data has been read.
-            # useful for timeout = 0 (non blocking) read
-            if timeout and time.time() > timeout:
-                break
-        return bytes(data)
-
-    def write(self, data):
-        """Output the given string over the serial port. Can block if the
-        connection is blocked. May raise SerialException if the connection is
-        closed."""
-        if not self._isOpen: raise portNotOpenError
-        # ensure we're working with bytes
-        data = to_bytes(data)
-        # calculate aprox time that would be used to send the data
-        time_used_to_send = 10.0*len(data) / self._baudrate
-        # when a write timeout is configured check if we would be successful
-        # (not sending anything, not even the part that would have time)
-        if self._writeTimeout is not None and time_used_to_send > self._writeTimeout:
-            time.sleep(self._writeTimeout) # must wait so that unit test succeeds
-            raise writeTimeoutError
-        self.buffer_lock.acquire()
-        try:
-            self.loop_buffer += data
-        finally:
-            self.buffer_lock.release()
-        return len(data)
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('flushInput()')
-        self.buffer_lock.acquire()
-        try:
-            del self.loop_buffer[:]
-        finally:
-            self.buffer_lock.release()
-
-    def flushOutput(self):
-        """Clear output buffer, aborting the current output and
-        discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('flushOutput()')
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given
-        duration."""
-        if not self._isOpen: raise portNotOpenError
-
-    def setBreak(self, level=True):
-        """Set break: Controls TXD. When active, to transmitting is
-        possible."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('setBreak(%r)' % (level,))
-
-    def setRTS(self, level=True):
-        """Set terminal status line: Request To Send"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('setRTS(%r) -> state of CTS' % (level,))
-        self.cts = level
-
-    def setDTR(self, level=True):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('setDTR(%r) -> state of DSR' % (level,))
-        self.dsr = level
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('getCTS() -> state of RTS (%r)' % (self.cts,))
-        return self.cts
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('getDSR() -> state of DTR (%r)' % (self.dsr,))
-        return self.dsr
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for getRI()')
-        return False
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for getCD()')
-        return True
-
-    # - - - platform specific - - -
-    # None so far
-
-
-# assemble Serial class with the platform specific implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(LoopbackSerial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(LoopbackSerial, io.RawIOBase):
-        pass
-
-
-# simple client test
-if __name__ == '__main__':
-    import sys
-    s = Serial('loop://')
-    sys.stdout.write('%s\n' % s)
-
-    sys.stdout.write("write...\n")
-    s.write("hello\n")
-    s.flush()
-    sys.stdout.write("read: %s\n" % s.read(5))
-
-    s.close()
diff --git a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py b/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py
deleted file mode 100644
index 981ba45..0000000
--- a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#! python
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# see ../__init__.py
-#
-# This is a thin wrapper to load the rfc2271 implementation.
-#
-# (C) 2011 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-
-from serial.rfc2217 import Serial
diff --git a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py b/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py
deleted file mode 100644
index c90a8e4..0000000
--- a/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py
+++ /dev/null
@@ -1,274 +0,0 @@
-#! python
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# see __init__.py
-#
-# This module implements a simple socket based client.
-# It does not support changing any port parameters and will silently ignore any
-# requests to do so.
-#
-# The purpose of this module is that applications using pySerial can connect to
-# TCP/IP to serial port converters that do not support RFC 2217.
-#
-# (C) 2001-2011 Chris Liechti <cliechti@gmx.net>
-# this is distributed under a free software license, see license.txt
-#
-# URL format:    socket://<host>:<port>[/option[/option...]]
-# options:
-# - "debug" print diagnostic messages
-
-from serial.serialutil import *
-import time
-import socket
-import logging
-
-# map log level names to constants. used in fromURL()
-LOGGER_LEVELS = {
-    'debug': logging.DEBUG,
-    'info': logging.INFO,
-    'warning': logging.WARNING,
-    'error': logging.ERROR,
-    }
-
-POLL_TIMEOUT = 2
-
-class SocketSerial(SerialBase):
-    """Serial port implementation for plain sockets."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def open(self):
-        """Open port with current settings. This may throw a SerialException
-           if the port cannot be opened."""
-        self.logger = None
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self._isOpen:
-            raise SerialException("Port is already open.")
-        try:
-            # XXX in future replace with create_connection (py >=2.6)
-            self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            self._socket.connect(self.fromURL(self.portstr))
-        except Exception, msg:
-            self._socket = None
-            raise SerialException("Could not open port %s: %s" % (self.portstr, msg))
-
-        self._socket.settimeout(POLL_TIMEOUT) # used for write timeout support :/
-
-        # not that there anything to configure...
-        self._reconfigurePort()
-        # all things set up get, now a clean start
-        self._isOpen = True
-        if not self._rtscts:
-            self.setRTS(True)
-            self.setDTR(True)
-        self.flushInput()
-        self.flushOutput()
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port. for the socket://
-        protocol all settings are ignored!"""
-        if self._socket is None:
-            raise SerialException("Can only operate on open ports")
-        if self.logger:
-            self.logger.info('ignored port configuration change')
-
-    def close(self):
-        """Close port"""
-        if self._isOpen:
-            if self._socket:
-                try:
-                    self._socket.shutdown(socket.SHUT_RDWR)
-                    self._socket.close()
-                except:
-                    # ignore errors.
-                    pass
-                self._socket = None
-            self._isOpen = False
-            # in case of quick reconnects, give the server some time
-            time.sleep(0.3)
-
-    def makeDeviceName(self, port):
-        raise SerialException("there is no sensible way to turn numbers into URLs")
-
-    def fromURL(self, url):
-        """extract host and port from an URL string"""
-        if url.lower().startswith("socket://"): url = url[9:]
-        try:
-            # is there a "path" (our options)?
-            if '/' in url:
-                # cut away options
-                url, options = url.split('/', 1)
-                # process options now, directly altering self
-                for option in options.split('/'):
-                    if '=' in option:
-                        option, value = option.split('=', 1)
-                    else:
-                        value = None
-                    if option == 'logging':
-                        logging.basicConfig()   # XXX is that good to call it here?
-                        self.logger = logging.getLogger('pySerial.socket')
-                        self.logger.setLevel(LOGGER_LEVELS[value])
-                        self.logger.debug('enabled logging')
-                    else:
-                        raise ValueError('unknown option: %r' % (option,))
-            # get host and port
-            host, port = url.split(':', 1) # may raise ValueError because of unpacking
-            port = int(port)               # and this if it's not a number
-            if not 0 <= port < 65536: raise ValueError("port not in range 0...65535")
-        except ValueError, e:
-            raise SerialException('expected a string in the form "[rfc2217://]<host>:<port>[/option[/option...]]": %s' % e)
-        return (host, port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def inWaiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            # set this one to debug as the function could be called often...
-            self.logger.debug('WARNING: inWaiting returns dummy value')
-        return 0 # hmmm, see comment in read()
-
-    def read(self, size=1):
-        """Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read."""
-        if not self._isOpen: raise portNotOpenError
-        data = bytearray()
-        if self._timeout is not None:
-            timeout = time.time() + self._timeout
-        else:
-            timeout = None
-        while len(data) < size and (timeout is None or time.time() < timeout):
-            try:
-                # an implementation with internal buffer would be better
-                # performing...
-                t = time.time()
-                block = self._socket.recv(size - len(data))
-                duration = time.time() - t
-                if block:
-                    data.extend(block)
-                else:
-                    # no data -> EOF (connection probably closed)
-                    break
-            except socket.timeout:
-                # just need to get out of recv from time to time to check if
-                # still alive
-                continue
-            except socket.error, e:
-                # connection fails -> terminate loop
-                raise SerialException('connection failed (%s)' % e)
-        return bytes(data)
-
-    def write(self, data):
-        """Output the given string over the serial port. Can block if the
-        connection is blocked. May raise SerialException if the connection is
-        closed."""
-        if not self._isOpen: raise portNotOpenError
-        try:
-            self._socket.sendall(to_bytes(data))
-        except socket.error, e:
-            # XXX what exception if socket connection fails
-            raise SerialException("socket connection failed: %s" % e)
-        return len(data)
-
-    def flushInput(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored flushInput')
-
-    def flushOutput(self):
-        """Clear output buffer, aborting the current output and
-        discarding all that is in the buffer."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored flushOutput')
-
-    def sendBreak(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given
-        duration."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored sendBreak(%r)' % (duration,))
-
-    def setBreak(self, level=True):
-        """Set break: Controls TXD. When active, to transmitting is
-        possible."""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored setBreak(%r)' % (level,))
-
-    def setRTS(self, level=True):
-        """Set terminal status line: Request To Send"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored setRTS(%r)' % (level,))
-
-    def setDTR(self, level=True):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored setDTR(%r)' % (level,))
-
-    def getCTS(self):
-        """Read terminal status line: Clear To Send"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for getCTS()')
-        return True
-
-    def getDSR(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for getDSR()')
-        return True
-
-    def getRI(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for getRI()')
-        return False
-
-    def getCD(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self._isOpen: raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for getCD()')
-        return True
-
-    # - - - platform specific - - -
-    # None so far
-
-
-# assemble Serial class with the platform specific implementation and the base
-# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
-# library, derive from io.RawIOBase
-try:
-    import io
-except ImportError:
-    # classic version with our own file-like emulation
-    class Serial(SocketSerial, FileLike):
-        pass
-else:
-    # io library present
-    class Serial(SocketSerial, io.RawIOBase):
-        pass
-
-
-# simple client test
-if __name__ == '__main__':
-    import sys
-    s = Serial('socket://localhost:7000')
-    sys.stdout.write('%s\n' % s)
-
-    sys.stdout.write("write...\n")
-    s.write("hello\n")
-    s.flush()
-    sys.stdout.write("read: %s\n" % s.read(5))
-
-    s.close()
diff --git a/systrace/catapult/third_party/pyserial/serial/win32.py b/systrace/catapult/third_party/pyserial/serial/win32.py
deleted file mode 100644
index 61b3d7a..0000000
--- a/systrace/catapult/third_party/pyserial/serial/win32.py
+++ /dev/null
@@ -1,320 +0,0 @@
-from ctypes import *
-from ctypes.wintypes import HANDLE
-from ctypes.wintypes import BOOL
-from ctypes.wintypes import LPCWSTR
-_stdcall_libraries = {}
-_stdcall_libraries['kernel32'] = WinDLL('kernel32')
-from ctypes.wintypes import DWORD
-from ctypes.wintypes import WORD
-from ctypes.wintypes import BYTE
-
-INVALID_HANDLE_VALUE = HANDLE(-1).value
-
-# some details of the windows API differ between 32 and 64 bit systems..
-def is_64bit():
-    """Returns true when running on a 64 bit system"""
-    return sizeof(c_ulong) != sizeof(c_void_p)
-
-# ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it
-# is either 32 or 64 bits, depending on the type of windows...
-# so test if this a 32 bit windows...
-if is_64bit():
-    # assume 64 bits
-    ULONG_PTR = c_int64
-else:
-    # 32 bits
-    ULONG_PTR = c_ulong
-
-
-class _SECURITY_ATTRIBUTES(Structure):
-    pass
-LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES)
-
-
-try:
-    CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
-except AttributeError:
-    # Fallback to non wide char version for old OS...
-    from ctypes.wintypes import LPCSTR
-    CreateEventA = _stdcall_libraries['kernel32'].CreateEventA
-    CreateEventA.restype = HANDLE
-    CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR]
-    CreateEvent=CreateEventA
-
-    CreateFileA = _stdcall_libraries['kernel32'].CreateFileA
-    CreateFileA.restype = HANDLE
-    CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
-    CreateFile = CreateFileA
-else:
-    CreateEventW.restype = HANDLE
-    CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
-    CreateEvent = CreateEventW # alias
-
-    CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
-    CreateFileW.restype = HANDLE
-    CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
-    CreateFile = CreateFileW # alias
-
-class _OVERLAPPED(Structure):
-    pass
-OVERLAPPED = _OVERLAPPED
-
-class _COMSTAT(Structure):
-    pass
-COMSTAT = _COMSTAT
-
-class _DCB(Structure):
-    pass
-DCB = _DCB
-
-class _COMMTIMEOUTS(Structure):
-    pass
-COMMTIMEOUTS = _COMMTIMEOUTS
-
-GetLastError = _stdcall_libraries['kernel32'].GetLastError
-GetLastError.restype = DWORD
-GetLastError.argtypes = []
-
-LPOVERLAPPED = POINTER(_OVERLAPPED)
-LPDWORD = POINTER(DWORD)
-
-GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult
-GetOverlappedResult.restype = BOOL
-GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL]
-
-ResetEvent = _stdcall_libraries['kernel32'].ResetEvent
-ResetEvent.restype = BOOL
-ResetEvent.argtypes = [HANDLE]
-
-LPCVOID = c_void_p
-
-WriteFile = _stdcall_libraries['kernel32'].WriteFile
-WriteFile.restype = BOOL
-WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED]
-
-LPVOID = c_void_p
-
-ReadFile = _stdcall_libraries['kernel32'].ReadFile
-ReadFile.restype = BOOL
-ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
-
-CloseHandle = _stdcall_libraries['kernel32'].CloseHandle
-CloseHandle.restype = BOOL
-CloseHandle.argtypes = [HANDLE]
-
-ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak
-ClearCommBreak.restype = BOOL
-ClearCommBreak.argtypes = [HANDLE]
-
-LPCOMSTAT = POINTER(_COMSTAT)
-
-ClearCommError = _stdcall_libraries['kernel32'].ClearCommError
-ClearCommError.restype = BOOL
-ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT]
-
-SetupComm = _stdcall_libraries['kernel32'].SetupComm
-SetupComm.restype = BOOL
-SetupComm.argtypes = [HANDLE, DWORD, DWORD]
-
-EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction
-EscapeCommFunction.restype = BOOL
-EscapeCommFunction.argtypes = [HANDLE, DWORD]
-
-GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus
-GetCommModemStatus.restype = BOOL
-GetCommModemStatus.argtypes = [HANDLE, LPDWORD]
-
-LPDCB = POINTER(_DCB)
-
-GetCommState = _stdcall_libraries['kernel32'].GetCommState
-GetCommState.restype = BOOL
-GetCommState.argtypes = [HANDLE, LPDCB]
-
-LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS)
-
-GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts
-GetCommTimeouts.restype = BOOL
-GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
-
-PurgeComm = _stdcall_libraries['kernel32'].PurgeComm
-PurgeComm.restype = BOOL
-PurgeComm.argtypes = [HANDLE, DWORD]
-
-SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak
-SetCommBreak.restype = BOOL
-SetCommBreak.argtypes = [HANDLE]
-
-SetCommMask = _stdcall_libraries['kernel32'].SetCommMask
-SetCommMask.restype = BOOL
-SetCommMask.argtypes = [HANDLE, DWORD]
-
-SetCommState = _stdcall_libraries['kernel32'].SetCommState
-SetCommState.restype = BOOL
-SetCommState.argtypes = [HANDLE, LPDCB]
-
-SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
-SetCommTimeouts.restype = BOOL
-SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
-
-WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
-WaitForSingleObject.restype = DWORD
-WaitForSingleObject.argtypes = [HANDLE, DWORD]
-
-ONESTOPBIT = 0 # Variable c_int
-TWOSTOPBITS = 2 # Variable c_int
-ONE5STOPBITS = 1
-
-NOPARITY = 0 # Variable c_int
-ODDPARITY = 1 # Variable c_int
-EVENPARITY = 2 # Variable c_int
-MARKPARITY = 3
-SPACEPARITY = 4
-
-RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
-RTS_CONTROL_DISABLE = 0 # Variable c_int
-RTS_CONTROL_ENABLE = 1 # Variable c_int
-RTS_CONTROL_TOGGLE = 3 # Variable c_int
-SETRTS = 3
-CLRRTS = 4
-
-DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
-DTR_CONTROL_DISABLE = 0 # Variable c_int
-DTR_CONTROL_ENABLE = 1 # Variable c_int
-SETDTR = 5
-CLRDTR = 6
-
-MS_DSR_ON = 32 # Variable c_ulong
-EV_RING = 256 # Variable c_int
-EV_PERR = 512 # Variable c_int
-EV_ERR = 128 # Variable c_int
-SETXOFF = 1 # Variable c_int
-EV_RXCHAR = 1 # Variable c_int
-GENERIC_WRITE = 1073741824 # Variable c_long
-PURGE_TXCLEAR = 4 # Variable c_int
-FILE_FLAG_OVERLAPPED = 1073741824 # Variable c_int
-EV_DSR = 16 # Variable c_int
-MAXDWORD = 4294967295L # Variable c_uint
-EV_RLSD = 32 # Variable c_int
-ERROR_IO_PENDING = 997 # Variable c_long
-MS_CTS_ON = 16 # Variable c_ulong
-EV_EVENT1 = 2048 # Variable c_int
-EV_RX80FULL = 1024 # Variable c_int
-PURGE_RXABORT = 2 # Variable c_int
-FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int
-PURGE_TXABORT = 1 # Variable c_int
-SETXON = 2 # Variable c_int
-OPEN_EXISTING = 3 # Variable c_int
-MS_RING_ON = 64 # Variable c_ulong
-EV_TXEMPTY = 4 # Variable c_int
-EV_RXFLAG = 2 # Variable c_int
-MS_RLSD_ON = 128 # Variable c_ulong
-GENERIC_READ = 2147483648L # Variable c_ulong
-EV_EVENT2 = 4096 # Variable c_int
-EV_CTS = 8 # Variable c_int
-EV_BREAK = 64 # Variable c_int
-PURGE_RXCLEAR = 8 # Variable c_int
-INFINITE = 0xFFFFFFFFL
-
-
-class N11_OVERLAPPED4DOLLAR_48E(Union):
-    pass
-class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure):
-    pass
-N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [
-    ('Offset', DWORD),
-    ('OffsetHigh', DWORD),
-]
-
-PVOID = c_void_p
-
-N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0']
-N11_OVERLAPPED4DOLLAR_48E._fields_ = [
-    ('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E),
-    ('Pointer', PVOID),
-]
-_OVERLAPPED._anonymous_ = ['_0']
-_OVERLAPPED._fields_ = [
-    ('Internal', ULONG_PTR),
-    ('InternalHigh', ULONG_PTR),
-    ('_0', N11_OVERLAPPED4DOLLAR_48E),
-    ('hEvent', HANDLE),
-]
-_SECURITY_ATTRIBUTES._fields_ = [
-    ('nLength', DWORD),
-    ('lpSecurityDescriptor', LPVOID),
-    ('bInheritHandle', BOOL),
-]
-_COMSTAT._fields_ = [
-    ('fCtsHold', DWORD, 1),
-    ('fDsrHold', DWORD, 1),
-    ('fRlsdHold', DWORD, 1),
-    ('fXoffHold', DWORD, 1),
-    ('fXoffSent', DWORD, 1),
-    ('fEof', DWORD, 1),
-    ('fTxim', DWORD, 1),
-    ('fReserved', DWORD, 25),
-    ('cbInQue', DWORD),
-    ('cbOutQue', DWORD),
-]
-_DCB._fields_ = [
-    ('DCBlength', DWORD),
-    ('BaudRate', DWORD),
-    ('fBinary', DWORD, 1),
-    ('fParity', DWORD, 1),
-    ('fOutxCtsFlow', DWORD, 1),
-    ('fOutxDsrFlow', DWORD, 1),
-    ('fDtrControl', DWORD, 2),
-    ('fDsrSensitivity', DWORD, 1),
-    ('fTXContinueOnXoff', DWORD, 1),
-    ('fOutX', DWORD, 1),
-    ('fInX', DWORD, 1),
-    ('fErrorChar', DWORD, 1),
-    ('fNull', DWORD, 1),
-    ('fRtsControl', DWORD, 2),
-    ('fAbortOnError', DWORD, 1),
-    ('fDummy2', DWORD, 17),
-    ('wReserved', WORD),
-    ('XonLim', WORD),
-    ('XoffLim', WORD),
-    ('ByteSize', BYTE),
-    ('Parity', BYTE),
-    ('StopBits', BYTE),
-    ('XonChar', c_char),
-    ('XoffChar', c_char),
-    ('ErrorChar', c_char),
-    ('EofChar', c_char),
-    ('EvtChar', c_char),
-    ('wReserved1', WORD),
-]
-_COMMTIMEOUTS._fields_ = [
-    ('ReadIntervalTimeout', DWORD),
-    ('ReadTotalTimeoutMultiplier', DWORD),
-    ('ReadTotalTimeoutConstant', DWORD),
-    ('WriteTotalTimeoutMultiplier', DWORD),
-    ('WriteTotalTimeoutConstant', DWORD),
-]
-__all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL',
-           'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON',
-           'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT',
-           'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING',
-           'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState',
-           'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent',
-           '_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR',
-           'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB',
-           'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm',
-           'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak',
-           'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts',
-           'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD',
-           'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR',
-           'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile',
-           'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts',
-           'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError',
-           'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ',
-           'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED',
-           'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE',
-           'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1',
-           'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD',
-           'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD',
-           'MS_DSR_ON', 'MS_RING_ON',
-           'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR',
-           'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle']
diff --git a/systrace/catapult/third_party/zipfile/LICENSE b/systrace/catapult/third_party/zipfile/LICENSE
deleted file mode 100644
index 84a3337..0000000
--- a/systrace/catapult/third_party/zipfile/LICENSE
+++ /dev/null
@@ -1,255 +0,0 @@
-A. HISTORY OF THE SOFTWARE
-==========================
-
-Python was created in the early 1990s by Guido van Rossum at Stichting
-Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
-as a successor of a language called ABC.  Guido remains Python's
-principal author, although it includes many contributions from others.
-
-In 1995, Guido continued his work on Python at the Corporation for
-National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
-in Reston, Virginia where he released several versions of the
-software.
-
-In May 2000, Guido and the Python core development team moved to
-BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
-year, the PythonLabs team moved to Digital Creations (now Zope
-Corporation, see http://www.zope.com).  In 2001, the Python Software
-Foundation (PSF, see http://www.python.org/psf/) was formed, a
-non-profit organization created specifically to own Python-related
-Intellectual Property.  Zope Corporation is a sponsoring member of
-the PSF.
-
-All Python releases are Open Source (see http://www.opensource.org for
-the Open Source Definition).  Historically, most, but not all, Python
-releases have also been GPL-compatible; the table below summarizes
-the various releases.
-
-    Release         Derived     Year        Owner       GPL-
-                    from                                compatible? (1)
-
-    0.9.0 thru 1.2              1991-1995   CWI         yes
-    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
-    1.6             1.5.2       2000        CNRI        no
-    2.0             1.6         2000        BeOpen.com  no
-    1.6.1           1.6         2001        CNRI        yes (2)
-    2.1             2.0+1.6.1   2001        PSF         no
-    2.0.1           2.0+1.6.1   2001        PSF         yes
-    2.1.1           2.1+2.0.1   2001        PSF         yes
-    2.1.2           2.1.1       2002        PSF         yes
-    2.1.3           2.1.2       2002        PSF         yes
-    2.2 and above   2.1.1       2001-now    PSF         yes
-
-Footnotes:
-
-(1) GPL-compatible doesn't mean that we're distributing Python under
-    the GPL.  All Python licenses, unlike the GPL, let you distribute
-    a modified version without making your changes open source.  The
-    GPL-compatible licenses make it possible to combine Python with
-    other software that is released under the GPL; the others don't.
-
-(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
-    because its license has a choice of law clause.  According to
-    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
-    is "not incompatible" with the GPL.
-
-Thanks to the many outside volunteers who have worked under Guido's
-direction to make these releases possible.
-
-
-B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
-===============================================================
-
-PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
---------------------------------------------
-
-1. This LICENSE AGREEMENT is between the Python Software Foundation
-("PSF"), and the Individual or Organization ("Licensee") accessing and
-otherwise using this software ("Python") in source or binary form and
-its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, PSF hereby
-grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
-analyze, test, perform and/or display publicly, prepare derivative works,
-distribute, and otherwise use Python alone or in any derivative version,
-provided, however, that PSF's License Agreement and PSF's notice of copyright,
-i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
-Reserved" are retained in Python alone or in any derivative version prepared by
-Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python.
-
-4. PSF is making Python available to Licensee on an "AS IS"
-basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any
-relationship of agency, partnership, or joint venture between PSF and
-Licensee.  This License Agreement does not grant permission to use PSF
-trademarks or trade name in a trademark sense to endorse or promote
-products or services of Licensee, or any third party.
-
-8. By copying, installing or otherwise using Python, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
-
-BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
--------------------------------------------
-
-BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
-
-1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
-office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
-Individual or Organization ("Licensee") accessing and otherwise using
-this software in source or binary form and its associated
-documentation ("the Software").
-
-2. Subject to the terms and conditions of this BeOpen Python License
-Agreement, BeOpen hereby grants Licensee a non-exclusive,
-royalty-free, world-wide license to reproduce, analyze, test, perform
-and/or display publicly, prepare derivative works, distribute, and
-otherwise use the Software alone or in any derivative version,
-provided, however, that the BeOpen Python License is retained in the
-Software, alone or in any derivative version prepared by Licensee.
-
-3. BeOpen is making the Software available to Licensee on an "AS IS"
-basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
-SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
-AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
-DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-5. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-6. This License Agreement shall be governed by and interpreted in all
-respects by the law of the State of California, excluding conflict of
-law provisions.  Nothing in this License Agreement shall be deemed to
-create any relationship of agency, partnership, or joint venture
-between BeOpen and Licensee.  This License Agreement does not grant
-permission to use BeOpen trademarks or trade names in a trademark
-sense to endorse or promote products or services of Licensee, or any
-third party.  As an exception, the "BeOpen Python" logos available at
-http://www.pythonlabs.com/logos.html may be used according to the
-permissions granted on that web page.
-
-7. By copying, installing or otherwise using the software, Licensee
-agrees to be bound by the terms and conditions of this License
-Agreement.
-
-
-CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
----------------------------------------
-
-1. This LICENSE AGREEMENT is between the Corporation for National
-Research Initiatives, having an office at 1895 Preston White Drive,
-Reston, VA 20191 ("CNRI"), and the Individual or Organization
-("Licensee") accessing and otherwise using Python 1.6.1 software in
-source or binary form and its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, CNRI
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
-license to reproduce, analyze, test, perform and/or display publicly,
-prepare derivative works, distribute, and otherwise use Python 1.6.1
-alone or in any derivative version, provided, however, that CNRI's
-License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
-1995-2001 Corporation for National Research Initiatives; All Rights
-Reserved" are retained in Python 1.6.1 alone or in any derivative
-version prepared by Licensee.  Alternately, in lieu of CNRI's License
-Agreement, Licensee may substitute the following text (omitting the
-quotes): "Python 1.6.1 is made available subject to the terms and
-conditions in CNRI's License Agreement.  This Agreement together with
-Python 1.6.1 may be located on the Internet using the following
-unique, persistent identifier (known as a handle): 1895.22/1013.  This
-Agreement may also be obtained from a proxy server on the Internet
-using the following URL: http://hdl.handle.net/1895.22/1013".
-
-3. In the event Licensee prepares a derivative work that is based on
-or incorporates Python 1.6.1 or any part thereof, and wants to make
-the derivative work available to others as provided herein, then
-Licensee hereby agrees to include in any such work a brief summary of
-the changes made to Python 1.6.1.
-
-4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
-basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
-IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
-INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
-1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material
-breach of its terms and conditions.
-
-7. This License Agreement shall be governed by the federal
-intellectual property law of the United States, including without
-limitation the federal copyright law, and, to the extent such
-U.S. federal law does not apply, by the law of the Commonwealth of
-Virginia, excluding Virginia's conflict of law provisions.
-Notwithstanding the foregoing, with regard to derivative works based
-on Python 1.6.1 that incorporate non-separable material that was
-previously distributed under the GNU General Public License (GPL), the
-law of the Commonwealth of Virginia shall govern this License
-Agreement only as to issues arising under or with respect to
-Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
-License Agreement shall be deemed to create any relationship of
-agency, partnership, or joint venture between CNRI and Licensee.  This
-License Agreement does not grant permission to use CNRI trademarks or
-trade name in a trademark sense to endorse or promote products or
-services of Licensee, or any third party.
-
-8. By clicking on the "ACCEPT" button where indicated, or by copying,
-installing or otherwise using Python 1.6.1, Licensee agrees to be
-bound by the terms and conditions of this License Agreement.
-
-        ACCEPT
-
-
-CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
---------------------------------------------------
-
-Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
-The Netherlands.  All rights reserved.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/systrace/catapult/third_party/zipfile/README.chromium b/systrace/catapult/third_party/zipfile/README.chromium
deleted file mode 100644
index f45d3cf..0000000
--- a/systrace/catapult/third_party/zipfile/README.chromium
+++ /dev/null
@@ -1,16 +0,0 @@
-Name: Python zipfile module
-Short Name: zipfile
-URL: https://github.com/python/cpython/blob/master/Lib/zipfile.py
-Version: 2.7.13
-License: Python
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-This is a copy of the zipfile module from Python 2.7.13. This snapshot was
-taken to workaround a bug in older Python versions such as 2.7.3. See
-<https://bugs.python.org/issue6972> and specifically the fix at
-<https://hg.python.org/cpython/rev/0c5fa35c9f12#l3.11>.
-
-Local Modifications:
-Renamed zipfile.py to zipfile_2_7_13.py to avoid conflicting with system copy.
diff --git a/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py b/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py
deleted file mode 100644
index 1d10650..0000000
--- a/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py
+++ /dev/null
@@ -1,1543 +0,0 @@
-"""
-Read and write ZIP files.
-"""
-import struct, os, time, sys, shutil
-import binascii, cStringIO, stat
-import io
-import re
-import string
-
-try:
-    import zlib # We may need its compression method
-    crc32 = zlib.crc32
-except ImportError:
-    zlib = None
-    crc32 = binascii.crc32
-
-__all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
-           "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile" ]
-
-class BadZipfile(Exception):
-    pass
-
-
-class LargeZipFile(Exception):
-    """
-    Raised when writing a zipfile, the zipfile requires ZIP64 extensions
-    and those extensions are disabled.
-    """
-
-error = BadZipfile      # The exception raised by this module
-
-ZIP64_LIMIT = (1 << 31) - 1
-ZIP_FILECOUNT_LIMIT = (1 << 16) - 1
-ZIP_MAX_COMMENT = (1 << 16) - 1
-
-# constants for Zip file compression methods
-ZIP_STORED = 0
-ZIP_DEFLATED = 8
-# Other ZIP compression methods not supported
-
-# Below are some formats and associated data for reading/writing headers using
-# the struct module.  The names and structures of headers/records are those used
-# in the PKWARE description of the ZIP file format:
-#     http://www.pkware.com/documents/casestudies/APPNOTE.TXT
-# (URL valid as of January 2008)
-
-# The "end of central directory" structure, magic number, size, and indices
-# (section V.I in the format document)
-structEndArchive = "<4s4H2LH"
-stringEndArchive = "PK\005\006"
-sizeEndCentDir = struct.calcsize(structEndArchive)
-
-_ECD_SIGNATURE = 0
-_ECD_DISK_NUMBER = 1
-_ECD_DISK_START = 2
-_ECD_ENTRIES_THIS_DISK = 3
-_ECD_ENTRIES_TOTAL = 4
-_ECD_SIZE = 5
-_ECD_OFFSET = 6
-_ECD_COMMENT_SIZE = 7
-# These last two indices are not part of the structure as defined in the
-# spec, but they are used internally by this module as a convenience
-_ECD_COMMENT = 8
-_ECD_LOCATION = 9
-
-# The "central directory" structure, magic number, size, and indices
-# of entries in the structure (section V.F in the format document)
-structCentralDir = "<4s4B4HL2L5H2L"
-stringCentralDir = "PK\001\002"
-sizeCentralDir = struct.calcsize(structCentralDir)
-
-# indexes of entries in the central directory structure
-_CD_SIGNATURE = 0
-_CD_CREATE_VERSION = 1
-_CD_CREATE_SYSTEM = 2
-_CD_EXTRACT_VERSION = 3
-_CD_EXTRACT_SYSTEM = 4
-_CD_FLAG_BITS = 5
-_CD_COMPRESS_TYPE = 6
-_CD_TIME = 7
-_CD_DATE = 8
-_CD_CRC = 9
-_CD_COMPRESSED_SIZE = 10
-_CD_UNCOMPRESSED_SIZE = 11
-_CD_FILENAME_LENGTH = 12
-_CD_EXTRA_FIELD_LENGTH = 13
-_CD_COMMENT_LENGTH = 14
-_CD_DISK_NUMBER_START = 15
-_CD_INTERNAL_FILE_ATTRIBUTES = 16
-_CD_EXTERNAL_FILE_ATTRIBUTES = 17
-_CD_LOCAL_HEADER_OFFSET = 18
-
-# The "local file header" structure, magic number, size, and indices
-# (section V.A in the format document)
-structFileHeader = "<4s2B4HL2L2H"
-stringFileHeader = "PK\003\004"
-sizeFileHeader = struct.calcsize(structFileHeader)
-
-_FH_SIGNATURE = 0
-_FH_EXTRACT_VERSION = 1
-_FH_EXTRACT_SYSTEM = 2
-_FH_GENERAL_PURPOSE_FLAG_BITS = 3
-_FH_COMPRESSION_METHOD = 4
-_FH_LAST_MOD_TIME = 5
-_FH_LAST_MOD_DATE = 6
-_FH_CRC = 7
-_FH_COMPRESSED_SIZE = 8
-_FH_UNCOMPRESSED_SIZE = 9
-_FH_FILENAME_LENGTH = 10
-_FH_EXTRA_FIELD_LENGTH = 11
-
-# The "Zip64 end of central directory locator" structure, magic number, and size
-structEndArchive64Locator = "<4sLQL"
-stringEndArchive64Locator = "PK\x06\x07"
-sizeEndCentDir64Locator = struct.calcsize(structEndArchive64Locator)
-
-# The "Zip64 end of central directory" record, magic number, size, and indices
-# (section V.G in the format document)
-structEndArchive64 = "<4sQ2H2L4Q"
-stringEndArchive64 = "PK\x06\x06"
-sizeEndCentDir64 = struct.calcsize(structEndArchive64)
-
-_CD64_SIGNATURE = 0
-_CD64_DIRECTORY_RECSIZE = 1
-_CD64_CREATE_VERSION = 2
-_CD64_EXTRACT_VERSION = 3
-_CD64_DISK_NUMBER = 4
-_CD64_DISK_NUMBER_START = 5
-_CD64_NUMBER_ENTRIES_THIS_DISK = 6
-_CD64_NUMBER_ENTRIES_TOTAL = 7
-_CD64_DIRECTORY_SIZE = 8
-_CD64_OFFSET_START_CENTDIR = 9
-
-def _check_zipfile(fp):
-    try:
-        if _EndRecData(fp):
-            return True         # file has correct magic number
-    except IOError:
-        pass
-    return False
-
-def is_zipfile(filename):
-    """Quickly see if a file is a ZIP file by checking the magic number.
-
-    The filename argument may be a file or file-like object too.
-    """
-    result = False
-    try:
-        if hasattr(filename, "read"):
-            result = _check_zipfile(fp=filename)
-        else:
-            with open(filename, "rb") as fp:
-                result = _check_zipfile(fp)
-    except IOError:
-        pass
-    return result
-
-def _EndRecData64(fpin, offset, endrec):
-    """
-    Read the ZIP64 end-of-archive records and use that to update endrec
-    """
-    try:
-        fpin.seek(offset - sizeEndCentDir64Locator, 2)
-    except IOError:
-        # If the seek fails, the file is not large enough to contain a ZIP64
-        # end-of-archive record, so just return the end record we were given.
-        return endrec
-
-    data = fpin.read(sizeEndCentDir64Locator)
-    if len(data) != sizeEndCentDir64Locator:
-        return endrec
-    sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data)
-    if sig != stringEndArchive64Locator:
-        return endrec
-
-    if diskno != 0 or disks != 1:
-        raise BadZipfile("zipfiles that span multiple disks are not supported")
-
-    # Assume no 'zip64 extensible data'
-    fpin.seek(offset - sizeEndCentDir64Locator - sizeEndCentDir64, 2)
-    data = fpin.read(sizeEndCentDir64)
-    if len(data) != sizeEndCentDir64:
-        return endrec
-    sig, sz, create_version, read_version, disk_num, disk_dir, \
-            dircount, dircount2, dirsize, diroffset = \
-            struct.unpack(structEndArchive64, data)
-    if sig != stringEndArchive64:
-        return endrec
-
-    # Update the original endrec using data from the ZIP64 record
-    endrec[_ECD_SIGNATURE] = sig
-    endrec[_ECD_DISK_NUMBER] = disk_num
-    endrec[_ECD_DISK_START] = disk_dir
-    endrec[_ECD_ENTRIES_THIS_DISK] = dircount
-    endrec[_ECD_ENTRIES_TOTAL] = dircount2
-    endrec[_ECD_SIZE] = dirsize
-    endrec[_ECD_OFFSET] = diroffset
-    return endrec
-
-
-def _EndRecData(fpin):
-    """Return data from the "End of Central Directory" record, or None.
-
-    The data is a list of the nine items in the ZIP "End of central dir"
-    record followed by a tenth item, the file seek offset of this record."""
-
-    # Determine file size
-    fpin.seek(0, 2)
-    filesize = fpin.tell()
-
-    # Check to see if this is ZIP file with no archive comment (the
-    # "end of central directory" structure should be the last item in the
-    # file if this is the case).
-    try:
-        fpin.seek(-sizeEndCentDir, 2)
-    except IOError:
-        return None
-    data = fpin.read()
-    if (len(data) == sizeEndCentDir and
-        data[0:4] == stringEndArchive and
-        data[-2:] == b"\000\000"):
-        # the signature is correct and there's no comment, unpack structure
-        endrec = struct.unpack(structEndArchive, data)
-        endrec=list(endrec)
-
-        # Append a blank comment and record start offset
-        endrec.append("")
-        endrec.append(filesize - sizeEndCentDir)
-
-        # Try to read the "Zip64 end of central directory" structure
-        return _EndRecData64(fpin, -sizeEndCentDir, endrec)
-
-    # Either this is not a ZIP file, or it is a ZIP file with an archive
-    # comment.  Search the end of the file for the "end of central directory"
-    # record signature. The comment is the last item in the ZIP file and may be
-    # up to 64K long.  It is assumed that the "end of central directory" magic
-    # number does not appear in the comment.
-    maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0)
-    fpin.seek(maxCommentStart, 0)
-    data = fpin.read()
-    start = data.rfind(stringEndArchive)
-    if start >= 0:
-        # found the magic number; attempt to unpack and interpret
-        recData = data[start:start+sizeEndCentDir]
-        if len(recData) != sizeEndCentDir:
-            # Zip file is corrupted.
-            return None
-        endrec = list(struct.unpack(structEndArchive, recData))
-        commentSize = endrec[_ECD_COMMENT_SIZE] #as claimed by the zip file
-        comment = data[start+sizeEndCentDir:start+sizeEndCentDir+commentSize]
-        endrec.append(comment)
-        endrec.append(maxCommentStart + start)
-
-        # Try to read the "Zip64 end of central directory" structure
-        return _EndRecData64(fpin, maxCommentStart + start - filesize,
-                             endrec)
-
-    # Unable to find a valid end of central directory structure
-    return None
-
-
-class ZipInfo (object):
-    """Class with attributes describing each file in the ZIP archive."""
-
-    __slots__ = (
-            'orig_filename',
-            'filename',
-            'date_time',
-            'compress_type',
-            'comment',
-            'extra',
-            'create_system',
-            'create_version',
-            'extract_version',
-            'reserved',
-            'flag_bits',
-            'volume',
-            'internal_attr',
-            'external_attr',
-            'header_offset',
-            'CRC',
-            'compress_size',
-            'file_size',
-            '_raw_time',
-        )
-
-    def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
-        self.orig_filename = filename   # Original file name in archive
-
-        # Terminate the file name at the first null byte.  Null bytes in file
-        # names are used as tricks by viruses in archives.
-        null_byte = filename.find(chr(0))
-        if null_byte >= 0:
-            filename = filename[0:null_byte]
-        # This is used to ensure paths in generated ZIP files always use
-        # forward slashes as the directory separator, as required by the
-        # ZIP format specification.
-        if os.sep != "/" and os.sep in filename:
-            filename = filename.replace(os.sep, "/")
-
-        self.filename = filename        # Normalized file name
-        self.date_time = date_time      # year, month, day, hour, min, sec
-
-        if date_time[0] < 1980:
-            raise ValueError('ZIP does not support timestamps before 1980')
-
-        # Standard values:
-        self.compress_type = ZIP_STORED # Type of compression for the file
-        self.comment = ""               # Comment for each file
-        self.extra = ""                 # ZIP extra data
-        if sys.platform == 'win32':
-            self.create_system = 0          # System which created ZIP archive
-        else:
-            # Assume everything else is unix-y
-            self.create_system = 3          # System which created ZIP archive
-        self.create_version = 20        # Version which created ZIP archive
-        self.extract_version = 20       # Version needed to extract archive
-        self.reserved = 0               # Must be zero
-        self.flag_bits = 0              # ZIP flag bits
-        self.volume = 0                 # Volume number of file header
-        self.internal_attr = 0          # Internal attributes
-        self.external_attr = 0          # External file attributes
-        # Other attributes are set by class ZipFile:
-        # header_offset         Byte offset to the file header
-        # CRC                   CRC-32 of the uncompressed file
-        # compress_size         Size of the compressed file
-        # file_size             Size of the uncompressed file
-
-    def FileHeader(self, zip64=None):
-        """Return the per-file header as a string."""
-        dt = self.date_time
-        dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
-        dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
-        if self.flag_bits & 0x08:
-            # Set these to zero because we write them after the file data
-            CRC = compress_size = file_size = 0
-        else:
-            CRC = self.CRC
-            compress_size = self.compress_size
-            file_size = self.file_size
-
-        extra = self.extra
-
-        if zip64 is None:
-            zip64 = file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT
-        if zip64:
-            fmt = '<HHQQ'
-            extra = extra + struct.pack(fmt,
-                    1, struct.calcsize(fmt)-4, file_size, compress_size)
-        if file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT:
-            if not zip64:
-                raise LargeZipFile("Filesize would require ZIP64 extensions")
-            # File is larger than what fits into a 4 byte integer,
-            # fall back to the ZIP64 extension
-            file_size = 0xffffffff
-            compress_size = 0xffffffff
-            self.extract_version = max(45, self.extract_version)
-            self.create_version = max(45, self.extract_version)
-
-        filename, flag_bits = self._encodeFilenameFlags()
-        header = struct.pack(structFileHeader, stringFileHeader,
-                 self.extract_version, self.reserved, flag_bits,
-                 self.compress_type, dostime, dosdate, CRC,
-                 compress_size, file_size,
-                 len(filename), len(extra))
-        return header + filename + extra
-
-    def _encodeFilenameFlags(self):
-        if isinstance(self.filename, unicode):
-            try:
-                return self.filename.encode('ascii'), self.flag_bits
-            except UnicodeEncodeError:
-                return self.filename.encode('utf-8'), self.flag_bits | 0x800
-        else:
-            return self.filename, self.flag_bits
-
-    def _decodeFilename(self):
-        if self.flag_bits & 0x800:
-            return self.filename.decode('utf-8')
-        else:
-            return self.filename
-
-    def _decodeExtra(self):
-        # Try to decode the extra field.
-        extra = self.extra
-        unpack = struct.unpack
-        while len(extra) >= 4:
-            tp, ln = unpack('<HH', extra[:4])
-            if tp == 1:
-                if ln >= 24:
-                    counts = unpack('<QQQ', extra[4:28])
-                elif ln == 16:
-                    counts = unpack('<QQ', extra[4:20])
-                elif ln == 8:
-                    counts = unpack('<Q', extra[4:12])
-                elif ln == 0:
-                    counts = ()
-                else:
-                    raise RuntimeError, "Corrupt extra field %s"%(ln,)
-
-                idx = 0
-
-                # ZIP64 extension (large files and/or large archives)
-                if self.file_size in (0xffffffffffffffffL, 0xffffffffL):
-                    self.file_size = counts[idx]
-                    idx += 1
-
-                if self.compress_size == 0xFFFFFFFFL:
-                    self.compress_size = counts[idx]
-                    idx += 1
-
-                if self.header_offset == 0xffffffffL:
-                    old = self.header_offset
-                    self.header_offset = counts[idx]
-                    idx+=1
-
-            extra = extra[ln+4:]
-
-
-class _ZipDecrypter:
-    """Class to handle decryption of files stored within a ZIP archive.
-
-    ZIP supports a password-based form of encryption. Even though known
-    plaintext attacks have been found against it, it is still useful
-    to be able to get data out of such a file.
-
-    Usage:
-        zd = _ZipDecrypter(mypwd)
-        plain_char = zd(cypher_char)
-        plain_text = map(zd, cypher_text)
-    """
-
-    def _GenerateCRCTable():
-        """Generate a CRC-32 table.
-
-        ZIP encryption uses the CRC32 one-byte primitive for scrambling some
-        internal keys. We noticed that a direct implementation is faster than
-        relying on binascii.crc32().
-        """
-        poly = 0xedb88320
-        table = [0] * 256
-        for i in range(256):
-            crc = i
-            for j in range(8):
-                if crc & 1:
-                    crc = ((crc >> 1) & 0x7FFFFFFF) ^ poly
-                else:
-                    crc = ((crc >> 1) & 0x7FFFFFFF)
-            table[i] = crc
-        return table
-    crctable = _GenerateCRCTable()
-
-    def _crc32(self, ch, crc):
-        """Compute the CRC32 primitive on one byte."""
-        return ((crc >> 8) & 0xffffff) ^ self.crctable[(crc ^ ord(ch)) & 0xff]
-
-    def __init__(self, pwd):
-        self.key0 = 305419896
-        self.key1 = 591751049
-        self.key2 = 878082192
-        for p in pwd:
-            self._UpdateKeys(p)
-
-    def _UpdateKeys(self, c):
-        self.key0 = self._crc32(c, self.key0)
-        self.key1 = (self.key1 + (self.key0 & 255)) & 4294967295
-        self.key1 = (self.key1 * 134775813 + 1) & 4294967295
-        self.key2 = self._crc32(chr((self.key1 >> 24) & 255), self.key2)
-
-    def __call__(self, c):
-        """Decrypt a single character."""
-        c = ord(c)
-        k = self.key2 | 2
-        c = c ^ (((k * (k^1)) >> 8) & 255)
-        c = chr(c)
-        self._UpdateKeys(c)
-        return c
-
-
-compressor_names = {
-    0: 'store',
-    1: 'shrink',
-    2: 'reduce',
-    3: 'reduce',
-    4: 'reduce',
-    5: 'reduce',
-    6: 'implode',
-    7: 'tokenize',
-    8: 'deflate',
-    9: 'deflate64',
-    10: 'implode',
-    12: 'bzip2',
-    14: 'lzma',
-    18: 'terse',
-    19: 'lz77',
-    97: 'wavpack',
-    98: 'ppmd',
-}
-
-
-class ZipExtFile(io.BufferedIOBase):
-    """File-like object for reading an archive member.
-       Is returned by ZipFile.open().
-    """
-
-    # Max size supported by decompressor.
-    MAX_N = 1 << 31 - 1
-
-    # Read from compressed files in 4k blocks.
-    MIN_READ_SIZE = 4096
-
-    # Search for universal newlines or line chunks.
-    PATTERN = re.compile(r'^(?P<chunk>[^\r\n]+)|(?P<newline>\n|\r\n?)')
-
-    def __init__(self, fileobj, mode, zipinfo, decrypter=None,
-            close_fileobj=False):
-        self._fileobj = fileobj
-        self._decrypter = decrypter
-        self._close_fileobj = close_fileobj
-
-        self._compress_type = zipinfo.compress_type
-        self._compress_size = zipinfo.compress_size
-        self._compress_left = zipinfo.compress_size
-
-        if self._compress_type == ZIP_DEFLATED:
-            self._decompressor = zlib.decompressobj(-15)
-        elif self._compress_type != ZIP_STORED:
-            descr = compressor_names.get(self._compress_type)
-            if descr:
-                raise NotImplementedError("compression type %d (%s)" % (self._compress_type, descr))
-            else:
-                raise NotImplementedError("compression type %d" % (self._compress_type,))
-        self._unconsumed = ''
-
-        self._readbuffer = ''
-        self._offset = 0
-
-        self._universal = 'U' in mode
-        self.newlines = None
-
-        # Adjust read size for encrypted files since the first 12 bytes
-        # are for the encryption/password information.
-        if self._decrypter is not None:
-            self._compress_left -= 12
-
-        self.mode = mode
-        self.name = zipinfo.filename
-
-        if hasattr(zipinfo, 'CRC'):
-            self._expected_crc = zipinfo.CRC
-            self._running_crc = crc32(b'') & 0xffffffff
-        else:
-            self._expected_crc = None
-
-    def readline(self, limit=-1):
-        """Read and return a line from the stream.
-
-        If limit is specified, at most limit bytes will be read.
-        """
-
-        if not self._universal and limit < 0:
-            # Shortcut common case - newline found in buffer.
-            i = self._readbuffer.find('\n', self._offset) + 1
-            if i > 0:
-                line = self._readbuffer[self._offset: i]
-                self._offset = i
-                return line
-
-        if not self._universal:
-            return io.BufferedIOBase.readline(self, limit)
-
-        line = ''
-        while limit < 0 or len(line) < limit:
-            readahead = self.peek(2)
-            if readahead == '':
-                return line
-
-            #
-            # Search for universal newlines or line chunks.
-            #
-            # The pattern returns either a line chunk or a newline, but not
-            # both. Combined with peek(2), we are assured that the sequence
-            # '\r\n' is always retrieved completely and never split into
-            # separate newlines - '\r', '\n' due to coincidental readaheads.
-            #
-            match = self.PATTERN.search(readahead)
-            newline = match.group('newline')
-            if newline is not None:
-                if self.newlines is None:
-                    self.newlines = []
-                if newline not in self.newlines:
-                    self.newlines.append(newline)
-                self._offset += len(newline)
-                return line + '\n'
-
-            chunk = match.group('chunk')
-            if limit >= 0:
-                chunk = chunk[: limit - len(line)]
-
-            self._offset += len(chunk)
-            line += chunk
-
-        return line
-
-    def peek(self, n=1):
-        """Returns buffered bytes without advancing the position."""
-        if n > len(self._readbuffer) - self._offset:
-            chunk = self.read(n)
-            if len(chunk) > self._offset:
-                self._readbuffer = chunk + self._readbuffer[self._offset:]
-                self._offset = 0
-            else:
-                self._offset -= len(chunk)
-
-        # Return up to 512 bytes to reduce allocation overhead for tight loops.
-        return self._readbuffer[self._offset: self._offset + 512]
-
-    def readable(self):
-        return True
-
-    def read(self, n=-1):
-        """Read and return up to n bytes.
-        If the argument is omitted, None, or negative, data is read and returned until EOF is reached..
-        """
-        buf = ''
-        if n is None:
-            n = -1
-        while True:
-            if n < 0:
-                data = self.read1(n)
-            elif n > len(buf):
-                data = self.read1(n - len(buf))
-            else:
-                return buf
-            if len(data) == 0:
-                return buf
-            buf += data
-
-    def _update_crc(self, newdata, eof):
-        # Update the CRC using the given data.
-        if self._expected_crc is None:
-            # No need to compute the CRC if we don't have a reference value
-            return
-        self._running_crc = crc32(newdata, self._running_crc) & 0xffffffff
-        # Check the CRC if we're at the end of the file
-        if eof and self._running_crc != self._expected_crc:
-            raise BadZipfile("Bad CRC-32 for file %r" % self.name)
-
-    def read1(self, n):
-        """Read up to n bytes with at most one read() system call."""
-
-        # Simplify algorithm (branching) by transforming negative n to large n.
-        if n < 0 or n is None:
-            n = self.MAX_N
-
-        # Bytes available in read buffer.
-        len_readbuffer = len(self._readbuffer) - self._offset
-
-        # Read from file.
-        if self._compress_left > 0 and n > len_readbuffer + len(self._unconsumed):
-            nbytes = n - len_readbuffer - len(self._unconsumed)
-            nbytes = max(nbytes, self.MIN_READ_SIZE)
-            nbytes = min(nbytes, self._compress_left)
-
-            data = self._fileobj.read(nbytes)
-            self._compress_left -= len(data)
-
-            if data and self._decrypter is not None:
-                data = ''.join(map(self._decrypter, data))
-
-            if self._compress_type == ZIP_STORED:
-                self._update_crc(data, eof=(self._compress_left==0))
-                self._readbuffer = self._readbuffer[self._offset:] + data
-                self._offset = 0
-            else:
-                # Prepare deflated bytes for decompression.
-                self._unconsumed += data
-
-        # Handle unconsumed data.
-        if (len(self._unconsumed) > 0 and n > len_readbuffer and
-            self._compress_type == ZIP_DEFLATED):
-            data = self._decompressor.decompress(
-                self._unconsumed,
-                max(n - len_readbuffer, self.MIN_READ_SIZE)
-            )
-
-            self._unconsumed = self._decompressor.unconsumed_tail
-            eof = len(self._unconsumed) == 0 and self._compress_left == 0
-            if eof:
-                data += self._decompressor.flush()
-
-            self._update_crc(data, eof=eof)
-            self._readbuffer = self._readbuffer[self._offset:] + data
-            self._offset = 0
-
-        # Read from buffer.
-        data = self._readbuffer[self._offset: self._offset + n]
-        self._offset += len(data)
-        return data
-
-    def close(self):
-        try :
-            if self._close_fileobj:
-                self._fileobj.close()
-        finally:
-            super(ZipExtFile, self).close()
-
-
-class ZipFile(object):
-    """ Class with methods to open, read, write, close, list zip files.
-
-    z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False)
-
-    file: Either the path to the file, or a file-like object.
-          If it is a path, the file will be opened and closed by ZipFile.
-    mode: The mode can be either read "r", write "w" or append "a".
-    compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
-    allowZip64: if True ZipFile will create files with ZIP64 extensions when
-                needed, otherwise it will raise an exception when this would
-                be necessary.
-
-    """
-
-    fp = None                   # Set here since __del__ checks it
-
-    def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False):
-        """Open the ZIP file with mode read "r", write "w" or append "a"."""
-        if mode not in ("r", "w", "a"):
-            raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')
-
-        if compression == ZIP_STORED:
-            pass
-        elif compression == ZIP_DEFLATED:
-            if not zlib:
-                raise RuntimeError,\
-                      "Compression requires the (missing) zlib module"
-        else:
-            raise RuntimeError, "That compression method is not supported"
-
-        self._allowZip64 = allowZip64
-        self._didModify = False
-        self.debug = 0  # Level of printing: 0 through 3
-        self.NameToInfo = {}    # Find file info given name
-        self.filelist = []      # List of ZipInfo instances for archive
-        self.compression = compression  # Method of compression
-        self.mode = key = mode.replace('b', '')[0]
-        self.pwd = None
-        self._comment = ''
-
-        # Check if we were passed a file-like object
-        if isinstance(file, basestring):
-            self._filePassed = 0
-            self.filename = file
-            modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
-            try:
-                self.fp = open(file, modeDict[mode])
-            except IOError:
-                if mode == 'a':
-                    mode = key = 'w'
-                    self.fp = open(file, modeDict[mode])
-                else:
-                    raise
-        else:
-            self._filePassed = 1
-            self.fp = file
-            self.filename = getattr(file, 'name', None)
-
-        try:
-            if key == 'r':
-                self._RealGetContents()
-            elif key == 'w':
-                # set the modified flag so central directory gets written
-                # even if no files are added to the archive
-                self._didModify = True
-                self._start_disk = self.fp.tell()
-            elif key == 'a':
-                try:
-                    # See if file is a zip file
-                    self._RealGetContents()
-                    # seek to start of directory and overwrite
-                    self.fp.seek(self.start_dir, 0)
-                except BadZipfile:
-                    # file is not a zip file, just append
-                    self.fp.seek(0, 2)
-
-                    # set the modified flag so central directory gets written
-                    # even if no files are added to the archive
-                    self._didModify = True
-                    self._start_disk = self.fp.tell()
-            else:
-                raise RuntimeError('Mode must be "r", "w" or "a"')
-        except:
-            fp = self.fp
-            self.fp = None
-            if not self._filePassed:
-                fp.close()
-            raise
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, type, value, traceback):
-        self.close()
-
-    def _RealGetContents(self):
-        """Read in the table of contents for the ZIP file."""
-        fp = self.fp
-        try:
-            endrec = _EndRecData(fp)
-        except IOError:
-            raise BadZipfile("File is not a zip file")
-        if not endrec:
-            raise BadZipfile, "File is not a zip file"
-        if self.debug > 1:
-            print endrec
-        size_cd = endrec[_ECD_SIZE]             # bytes in central directory
-        offset_cd = endrec[_ECD_OFFSET]         # offset of central directory
-        self._comment = endrec[_ECD_COMMENT]    # archive comment
-
-        # self._start_disk:  Position of the start of ZIP archive
-        # It is zero, unless ZIP was concatenated to another file
-        self._start_disk = endrec[_ECD_LOCATION] - size_cd - offset_cd
-        if endrec[_ECD_SIGNATURE] == stringEndArchive64:
-            # If Zip64 extension structures are present, account for them
-            self._start_disk -= (sizeEndCentDir64 + sizeEndCentDir64Locator)
-
-        if self.debug > 2:
-            inferred = self._start_disk + offset_cd
-            print "given, inferred, offset", offset_cd, inferred, self._start_disk
-        # self.start_dir:  Position of start of central directory
-        self.start_dir = offset_cd + self._start_disk
-        fp.seek(self.start_dir, 0)
-        data = fp.read(size_cd)
-        fp = cStringIO.StringIO(data)
-        total = 0
-        while total < size_cd:
-            centdir = fp.read(sizeCentralDir)
-            if len(centdir) != sizeCentralDir:
-                raise BadZipfile("Truncated central directory")
-            centdir = struct.unpack(structCentralDir, centdir)
-            if centdir[_CD_SIGNATURE] != stringCentralDir:
-                raise BadZipfile("Bad magic number for central directory")
-            if self.debug > 2:
-                print centdir
-            filename = fp.read(centdir[_CD_FILENAME_LENGTH])
-            # Create ZipInfo instance to store file information
-            x = ZipInfo(filename)
-            x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
-            x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
-            x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]
-            (x.create_version, x.create_system, x.extract_version, x.reserved,
-                x.flag_bits, x.compress_type, t, d,
-                x.CRC, x.compress_size, x.file_size) = centdir[1:12]
-            x.volume, x.internal_attr, x.external_attr = centdir[15:18]
-            # Convert date/time code to (year, month, day, hour, min, sec)
-            x._raw_time = t
-            x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
-                                     t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )
-
-            x._decodeExtra()
-            x.header_offset = x.header_offset + self._start_disk
-            x.filename = x._decodeFilename()
-            self.filelist.append(x)
-            self.NameToInfo[x.filename] = x
-
-            # update total bytes read from central directory
-            total = (total + sizeCentralDir + centdir[_CD_FILENAME_LENGTH]
-                     + centdir[_CD_EXTRA_FIELD_LENGTH]
-                     + centdir[_CD_COMMENT_LENGTH])
-
-            if self.debug > 2:
-                print "total", total
-
-
-    def namelist(self):
-        """Return a list of file names in the archive."""
-        l = []
-        for data in self.filelist:
-            l.append(data.filename)
-        return l
-
-    def infolist(self):
-        """Return a list of class ZipInfo instances for files in the
-        archive."""
-        return self.filelist
-
-    def printdir(self):
-        """Print a table of contents for the zip file."""
-        print "%-46s %19s %12s" % ("File Name", "Modified    ", "Size")
-        for zinfo in self.filelist:
-            date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time[:6]
-            print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)
-
-    def testzip(self):
-        """Read all the files and check the CRC."""
-        chunk_size = 2 ** 20
-        for zinfo in self.filelist:
-            try:
-                # Read by chunks, to avoid an OverflowError or a
-                # MemoryError with very large embedded files.
-                with self.open(zinfo.filename, "r") as f:
-                    while f.read(chunk_size):     # Check CRC-32
-                        pass
-            except BadZipfile:
-                return zinfo.filename
-
-    def getinfo(self, name):
-        """Return the instance of ZipInfo given 'name'."""
-        info = self.NameToInfo.get(name)
-        if info is None:
-            raise KeyError(
-                'There is no item named %r in the archive' % name)
-
-        return info
-
-    def setpassword(self, pwd):
-        """Set default password for encrypted files."""
-        self.pwd = pwd
-
-    @property
-    def comment(self):
-        """The comment text associated with the ZIP file."""
-        return self._comment
-
-    @comment.setter
-    def comment(self, comment):
-        # check for valid comment length
-        if len(comment) > ZIP_MAX_COMMENT:
-            import warnings
-            warnings.warn('Archive comment is too long; truncating to %d bytes'
-                          % ZIP_MAX_COMMENT, stacklevel=2)
-            comment = comment[:ZIP_MAX_COMMENT]
-        self._comment = comment
-        self._didModify = True
-
-    def read(self, name, pwd=None):
-        """Return file bytes (as a string) for name."""
-        return self.open(name, "r", pwd).read()
-
-    def open(self, name, mode="r", pwd=None):
-        """Return file-like object for 'name'."""
-        if mode not in ("r", "U", "rU"):
-            raise RuntimeError, 'open() requires mode "r", "U", or "rU"'
-        if not self.fp:
-            raise RuntimeError, \
-                  "Attempt to read ZIP archive that was already closed"
-
-        # Only open a new file for instances where we were not
-        # given a file object in the constructor
-        if self._filePassed:
-            zef_file = self.fp
-            should_close = False
-        else:
-            zef_file = open(self.filename, 'rb')
-            should_close = True
-
-        try:
-            # Make sure we have an info object
-            if isinstance(name, ZipInfo):
-                # 'name' is already an info object
-                zinfo = name
-            else:
-                # Get info object for name
-                zinfo = self.getinfo(name)
-
-            zef_file.seek(zinfo.header_offset, 0)
-
-            # Skip the file header:
-            fheader = zef_file.read(sizeFileHeader)
-            if len(fheader) != sizeFileHeader:
-                raise BadZipfile("Truncated file header")
-            fheader = struct.unpack(structFileHeader, fheader)
-            if fheader[_FH_SIGNATURE] != stringFileHeader:
-                raise BadZipfile("Bad magic number for file header")
-
-            fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])
-            if fheader[_FH_EXTRA_FIELD_LENGTH]:
-                zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])
-
-            if fname != zinfo.orig_filename:
-                raise BadZipfile, \
-                        'File name in directory "%s" and header "%s" differ.' % (
-                            zinfo.orig_filename, fname)
-
-            # check for encrypted flag & handle password
-            is_encrypted = zinfo.flag_bits & 0x1
-            zd = None
-            if is_encrypted:
-                if not pwd:
-                    pwd = self.pwd
-                if not pwd:
-                    raise RuntimeError, "File %s is encrypted, " \
-                        "password required for extraction" % name
-
-                zd = _ZipDecrypter(pwd)
-                # The first 12 bytes in the cypher stream is an encryption header
-                #  used to strengthen the algorithm. The first 11 bytes are
-                #  completely random, while the 12th contains the MSB of the CRC,
-                #  or the MSB of the file time depending on the header type
-                #  and is used to check the correctness of the password.
-                bytes = zef_file.read(12)
-                h = map(zd, bytes[0:12])
-                if zinfo.flag_bits & 0x8:
-                    # compare against the file type from extended local headers
-                    check_byte = (zinfo._raw_time >> 8) & 0xff
-                else:
-                    # compare against the CRC otherwise
-                    check_byte = (zinfo.CRC >> 24) & 0xff
-                if ord(h[11]) != check_byte:
-                    raise RuntimeError("Bad password for file", name)
-
-            return ZipExtFile(zef_file, mode, zinfo, zd,
-                    close_fileobj=should_close)
-        except:
-            if should_close:
-                zef_file.close()
-            raise
-
-    def extract(self, member, path=None, pwd=None):
-        """Extract a member from the archive to the current working directory,
-           using its full name. Its file information is extracted as accurately
-           as possible. `member' may be a filename or a ZipInfo object. You can
-           specify a different directory using `path'.
-        """
-        if not isinstance(member, ZipInfo):
-            member = self.getinfo(member)
-
-        if path is None:
-            path = os.getcwd()
-
-        return self._extract_member(member, path, pwd)
-
-    def extractall(self, path=None, members=None, pwd=None):
-        """Extract all members from the archive to the current working
-           directory. `path' specifies a different directory to extract to.
-           `members' is optional and must be a subset of the list returned
-           by namelist().
-        """
-        if members is None:
-            members = self.namelist()
-
-        for zipinfo in members:
-            self.extract(zipinfo, path, pwd)
-
-    def _extract_member(self, member, targetpath, pwd):
-        """Extract the ZipInfo object 'member' to a physical
-           file on the path targetpath.
-        """
-        # build the destination pathname, replacing
-        # forward slashes to platform specific separators.
-        arcname = member.filename.replace('/', os.path.sep)
-
-        if os.path.altsep:
-            arcname = arcname.replace(os.path.altsep, os.path.sep)
-        # interpret absolute pathname as relative, remove drive letter or
-        # UNC path, redundant separators, "." and ".." components.
-        arcname = os.path.splitdrive(arcname)[1]
-        arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
-                    if x not in ('', os.path.curdir, os.path.pardir))
-        if os.path.sep == '\\':
-            # filter illegal characters on Windows
-            illegal = ':<>|"?*'
-            if isinstance(arcname, unicode):
-                table = {ord(c): ord('_') for c in illegal}
-            else:
-                table = string.maketrans(illegal, '_' * len(illegal))
-            arcname = arcname.translate(table)
-            # remove trailing dots
-            arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
-            arcname = os.path.sep.join(x for x in arcname if x)
-
-        targetpath = os.path.join(targetpath, arcname)
-        targetpath = os.path.normpath(targetpath)
-
-        # Create all upper directories if necessary.
-        upperdirs = os.path.dirname(targetpath)
-        if upperdirs and not os.path.exists(upperdirs):
-            os.makedirs(upperdirs)
-
-        if member.filename[-1] == '/':
-            if not os.path.isdir(targetpath):
-                os.mkdir(targetpath)
-            return targetpath
-
-        with self.open(member, pwd=pwd) as source, \
-             file(targetpath, "wb") as target:
-            shutil.copyfileobj(source, target)
-
-        return targetpath
-
-    def _writecheck(self, zinfo):
-        """Check for errors before writing a file to the archive."""
-        if zinfo.filename in self.NameToInfo:
-            import warnings
-            warnings.warn('Duplicate name: %r' % zinfo.filename, stacklevel=3)
-        if self.mode not in ("w", "a"):
-            raise RuntimeError, 'write() requires mode "w" or "a"'
-        if not self.fp:
-            raise RuntimeError, \
-                  "Attempt to write ZIP archive that was already closed"
-        if zinfo.compress_type == ZIP_DEFLATED and not zlib:
-            raise RuntimeError, \
-                  "Compression requires the (missing) zlib module"
-        if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
-            raise RuntimeError, \
-                  "That compression method is not supported"
-        if not self._allowZip64:
-            requires_zip64 = None
-            if len(self.filelist) >= ZIP_FILECOUNT_LIMIT:
-                requires_zip64 = "Files count"
-            elif zinfo.file_size > ZIP64_LIMIT:
-                requires_zip64 = "Filesize"
-            elif zinfo.header_offset > ZIP64_LIMIT:
-                requires_zip64 = "Zipfile size"
-            if requires_zip64:
-                raise LargeZipFile(requires_zip64 +
-                                   " would require ZIP64 extensions")
-
-    def write(self, filename, arcname=None, compress_type=None):
-        """Put the bytes from filename into the archive under the name
-        arcname."""
-        if not self.fp:
-            raise RuntimeError(
-                  "Attempt to write to ZIP archive that was already closed")
-
-        st = os.stat(filename)
-        isdir = stat.S_ISDIR(st.st_mode)
-        mtime = time.localtime(st.st_mtime)
-        date_time = mtime[0:6]
-        # Create ZipInfo instance to store file information
-        if arcname is None:
-            arcname = filename
-        arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
-        while arcname[0] in (os.sep, os.altsep):
-            arcname = arcname[1:]
-        if isdir:
-            arcname += '/'
-        zinfo = ZipInfo(arcname, date_time)
-        zinfo.external_attr = (st[0] & 0xFFFF) << 16L      # Unix attributes
-        if isdir:
-            zinfo.compress_type = ZIP_STORED
-        elif compress_type is None:
-            zinfo.compress_type = self.compression
-        else:
-            zinfo.compress_type = compress_type
-
-        zinfo.file_size = st.st_size
-        zinfo.flag_bits = 0x00
-        zinfo.header_offset = self.fp.tell()    # Start of header bytes
-
-        self._writecheck(zinfo)
-        self._didModify = True
-
-        if isdir:
-            zinfo.file_size = 0
-            zinfo.compress_size = 0
-            zinfo.CRC = 0
-            zinfo.external_attr |= 0x10  # MS-DOS directory flag
-            self.filelist.append(zinfo)
-            self.NameToInfo[zinfo.filename] = zinfo
-            self.fp.write(zinfo.FileHeader(False))
-            return
-
-        with open(filename, "rb") as fp:
-            # Must overwrite CRC and sizes with correct data later
-            zinfo.CRC = CRC = 0
-            zinfo.compress_size = compress_size = 0
-            # Compressed size can be larger than uncompressed size
-            zip64 = self._allowZip64 and \
-                    zinfo.file_size * 1.05 > ZIP64_LIMIT
-            self.fp.write(zinfo.FileHeader(zip64))
-            if zinfo.compress_type == ZIP_DEFLATED:
-                cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
-                     zlib.DEFLATED, -15)
-            else:
-                cmpr = None
-            file_size = 0
-            while 1:
-                buf = fp.read(1024 * 8)
-                if not buf:
-                    break
-                file_size = file_size + len(buf)
-                CRC = crc32(buf, CRC) & 0xffffffff
-                if cmpr:
-                    buf = cmpr.compress(buf)
-                    compress_size = compress_size + len(buf)
-                self.fp.write(buf)
-        if cmpr:
-            buf = cmpr.flush()
-            compress_size = compress_size + len(buf)
-            self.fp.write(buf)
-            zinfo.compress_size = compress_size
-        else:
-            zinfo.compress_size = file_size
-        zinfo.CRC = CRC
-        zinfo.file_size = file_size
-        if not zip64 and self._allowZip64:
-            if file_size > ZIP64_LIMIT:
-                raise RuntimeError('File size has increased during compressing')
-            if compress_size > ZIP64_LIMIT:
-                raise RuntimeError('Compressed size larger than uncompressed size')
-        # Seek backwards and write file header (which will now include
-        # correct CRC and file sizes)
-        position = self.fp.tell() # Preserve current position in file
-        self.fp.seek(zinfo.header_offset, 0)
-        self.fp.write(zinfo.FileHeader(zip64))
-        self.fp.seek(position, 0)
-        self.filelist.append(zinfo)
-        self.NameToInfo[zinfo.filename] = zinfo
-
-    def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
-        """Write a file into the archive.  The contents is the string
-        'bytes'.  'zinfo_or_arcname' is either a ZipInfo instance or
-        the name of the file in the archive."""
-        if not isinstance(zinfo_or_arcname, ZipInfo):
-            zinfo = ZipInfo(filename=zinfo_or_arcname,
-                            date_time=time.localtime(time.time())[:6])
-
-            zinfo.compress_type = self.compression
-            if zinfo.filename[-1] == '/':
-                zinfo.external_attr = 0o40775 << 16   # drwxrwxr-x
-                zinfo.external_attr |= 0x10           # MS-DOS directory flag
-            else:
-                zinfo.external_attr = 0o600 << 16     # ?rw-------
-        else:
-            zinfo = zinfo_or_arcname
-
-        if not self.fp:
-            raise RuntimeError(
-                  "Attempt to write to ZIP archive that was already closed")
-
-        if compress_type is not None:
-            zinfo.compress_type = compress_type
-
-        zinfo.file_size = len(bytes)            # Uncompressed size
-        zinfo.header_offset = self.fp.tell()    # Start of header bytes
-        self._writecheck(zinfo)
-        self._didModify = True
-        zinfo.CRC = crc32(bytes) & 0xffffffff       # CRC-32 checksum
-        if zinfo.compress_type == ZIP_DEFLATED:
-            co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
-                 zlib.DEFLATED, -15)
-            bytes = co.compress(bytes) + co.flush()
-            zinfo.compress_size = len(bytes)    # Compressed size
-        else:
-            zinfo.compress_size = zinfo.file_size
-        zip64 = zinfo.file_size > ZIP64_LIMIT or \
-                zinfo.compress_size > ZIP64_LIMIT
-        if zip64 and not self._allowZip64:
-            raise LargeZipFile("Filesize would require ZIP64 extensions")
-        self.fp.write(zinfo.FileHeader(zip64))
-        self.fp.write(bytes)
-        if zinfo.flag_bits & 0x08:
-            # Write CRC and file sizes after the file data
-            fmt = '<LQQ' if zip64 else '<LLL'
-            self.fp.write(struct.pack(fmt, zinfo.CRC, zinfo.compress_size,
-                  zinfo.file_size))
-        self.fp.flush()
-        self.filelist.append(zinfo)
-        self.NameToInfo[zinfo.filename] = zinfo
-
-    def __del__(self):
-        """Call the "close()" method in case the user forgot."""
-        self.close()
-
-    def close(self):
-        """Close the file, and for mode "w" and "a" write the ending
-        records."""
-        if self.fp is None:
-            return
-
-        try:
-            if self.mode in ("w", "a") and self._didModify: # write ending records
-                pos1 = self.fp.tell()
-                for zinfo in self.filelist:         # write central directory
-                    dt = zinfo.date_time
-                    dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
-                    dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
-                    extra = []
-                    if zinfo.file_size > ZIP64_LIMIT \
-                            or zinfo.compress_size > ZIP64_LIMIT:
-                        extra.append(zinfo.file_size)
-                        extra.append(zinfo.compress_size)
-                        file_size = 0xffffffff
-                        compress_size = 0xffffffff
-                    else:
-                        file_size = zinfo.file_size
-                        compress_size = zinfo.compress_size
-
-                    header_offset = zinfo.header_offset - self._start_disk
-                    if header_offset > ZIP64_LIMIT:
-                        extra.append(header_offset)
-                        header_offset = 0xffffffffL
-
-                    extra_data = zinfo.extra
-                    if extra:
-                        # Append a ZIP64 field to the extra's
-                        extra_data = struct.pack(
-                                '<HH' + 'Q'*len(extra),
-                                1, 8*len(extra), *extra) + extra_data
-
-                        extract_version = max(45, zinfo.extract_version)
-                        create_version = max(45, zinfo.create_version)
-                    else:
-                        extract_version = zinfo.extract_version
-                        create_version = zinfo.create_version
-
-                    try:
-                        filename, flag_bits = zinfo._encodeFilenameFlags()
-                        centdir = struct.pack(structCentralDir,
-                        stringCentralDir, create_version,
-                        zinfo.create_system, extract_version, zinfo.reserved,
-                        flag_bits, zinfo.compress_type, dostime, dosdate,
-                        zinfo.CRC, compress_size, file_size,
-                        len(filename), len(extra_data), len(zinfo.comment),
-                        0, zinfo.internal_attr, zinfo.external_attr,
-                        header_offset)
-                    except DeprecationWarning:
-                        print >>sys.stderr, (structCentralDir,
-                        stringCentralDir, create_version,
-                        zinfo.create_system, extract_version, zinfo.reserved,
-                        zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
-                        zinfo.CRC, compress_size, file_size,
-                        len(zinfo.filename), len(extra_data), len(zinfo.comment),
-                        0, zinfo.internal_attr, zinfo.external_attr,
-                        header_offset)
-                        raise
-                    self.fp.write(centdir)
-                    self.fp.write(filename)
-                    self.fp.write(extra_data)
-                    self.fp.write(zinfo.comment)
-
-                pos2 = self.fp.tell()
-                # Write end-of-zip-archive record
-                centDirCount = len(self.filelist)
-                centDirSize = pos2 - pos1
-                centDirOffset = pos1 - self._start_disk
-                requires_zip64 = None
-                if centDirCount > ZIP_FILECOUNT_LIMIT:
-                    requires_zip64 = "Files count"
-                elif centDirOffset > ZIP64_LIMIT:
-                    requires_zip64 = "Central directory offset"
-                elif centDirSize > ZIP64_LIMIT:
-                    requires_zip64 = "Central directory size"
-                if requires_zip64:
-                    # Need to write the ZIP64 end-of-archive records
-                    if not self._allowZip64:
-                        raise LargeZipFile(requires_zip64 +
-                                           " would require ZIP64 extensions")
-                    zip64endrec = struct.pack(
-                            structEndArchive64, stringEndArchive64,
-                            44, 45, 45, 0, 0, centDirCount, centDirCount,
-                            centDirSize, centDirOffset)
-                    self.fp.write(zip64endrec)
-
-                    zip64locrec = struct.pack(
-                            structEndArchive64Locator,
-                            stringEndArchive64Locator, 0, pos2, 1)
-                    self.fp.write(zip64locrec)
-                    centDirCount = min(centDirCount, 0xFFFF)
-                    centDirSize = min(centDirSize, 0xFFFFFFFF)
-                    centDirOffset = min(centDirOffset, 0xFFFFFFFF)
-
-                endrec = struct.pack(structEndArchive, stringEndArchive,
-                                    0, 0, centDirCount, centDirCount,
-                                    centDirSize, centDirOffset, len(self._comment))
-                self.fp.write(endrec)
-                self.fp.write(self._comment)
-                self.fp.flush()
-        finally:
-            fp = self.fp
-            self.fp = None
-            if not self._filePassed:
-                fp.close()
-
-
-class PyZipFile(ZipFile):
-    """Class to create ZIP archives with Python library files and packages."""
-
-    def writepy(self, pathname, basename = ""):
-        """Add all files from "pathname" to the ZIP archive.
-
-        If pathname is a package directory, search the directory and
-        all package subdirectories recursively for all *.py and enter
-        the modules into the archive.  If pathname is a plain
-        directory, listdir *.py and enter all modules.  Else, pathname
-        must be a Python *.py file and the module will be put into the
-        archive.  Added modules are always module.pyo or module.pyc.
-        This method will compile the module.py into module.pyc if
-        necessary.
-        """
-        dir, name = os.path.split(pathname)
-        if os.path.isdir(pathname):
-            initname = os.path.join(pathname, "__init__.py")
-            if os.path.isfile(initname):
-                # This is a package directory, add it
-                if basename:
-                    basename = "%s/%s" % (basename, name)
-                else:
-                    basename = name
-                if self.debug:
-                    print "Adding package in", pathname, "as", basename
-                fname, arcname = self._get_codename(initname[0:-3], basename)
-                if self.debug:
-                    print "Adding", arcname
-                self.write(fname, arcname)
-                dirlist = os.listdir(pathname)
-                dirlist.remove("__init__.py")
-                # Add all *.py files and package subdirectories
-                for filename in dirlist:
-                    path = os.path.join(pathname, filename)
-                    root, ext = os.path.splitext(filename)
-                    if os.path.isdir(path):
-                        if os.path.isfile(os.path.join(path, "__init__.py")):
-                            # This is a package directory, add it
-                            self.writepy(path, basename)  # Recursive call
-                    elif ext == ".py":
-                        fname, arcname = self._get_codename(path[0:-3],
-                                         basename)
-                        if self.debug:
-                            print "Adding", arcname
-                        self.write(fname, arcname)
-            else:
-                # This is NOT a package directory, add its files at top level
-                if self.debug:
-                    print "Adding files from directory", pathname
-                for filename in os.listdir(pathname):
-                    path = os.path.join(pathname, filename)
-                    root, ext = os.path.splitext(filename)
-                    if ext == ".py":
-                        fname, arcname = self._get_codename(path[0:-3],
-                                         basename)
-                        if self.debug:
-                            print "Adding", arcname
-                        self.write(fname, arcname)
-        else:
-            if pathname[-3:] != ".py":
-                raise RuntimeError, \
-                      'Files added with writepy() must end with ".py"'
-            fname, arcname = self._get_codename(pathname[0:-3], basename)
-            if self.debug:
-                print "Adding file", arcname
-            self.write(fname, arcname)
-
-    def _get_codename(self, pathname, basename):
-        """Return (filename, archivename) for the path.
-
-        Given a module name path, return the correct file path and
-        archive name, compiling if necessary.  For example, given
-        /python/lib/string, return (/python/lib/string.pyc, string).
-        """
-        file_py  = pathname + ".py"
-        file_pyc = pathname + ".pyc"
-        file_pyo = pathname + ".pyo"
-        if os.path.isfile(file_pyo) and \
-                            os.stat(file_pyo).st_mtime >= os.stat(file_py).st_mtime:
-            fname = file_pyo    # Use .pyo file
-        elif not os.path.isfile(file_pyc) or \
-             os.stat(file_pyc).st_mtime < os.stat(file_py).st_mtime:
-            import py_compile
-            if self.debug:
-                print "Compiling", file_py
-            try:
-                py_compile.compile(file_py, file_pyc, None, True)
-            except py_compile.PyCompileError,err:
-                print err.msg
-            fname = file_pyc
-        else:
-            fname = file_pyc
-        archivename = os.path.split(fname)[1]
-        if basename:
-            archivename = "%s/%s" % (basename, archivename)
-        return (fname, archivename)
-
-
-def main(args = None):
-    import textwrap
-    USAGE=textwrap.dedent("""\
-        Usage:
-            zipfile.py -l zipfile.zip        # Show listing of a zipfile
-            zipfile.py -t zipfile.zip        # Test if a zipfile is valid
-            zipfile.py -e zipfile.zip target # Extract zipfile into target dir
-            zipfile.py -c zipfile.zip src ... # Create zipfile from sources
-        """)
-    if args is None:
-        args = sys.argv[1:]
-
-    if not args or args[0] not in ('-l', '-c', '-e', '-t'):
-        print USAGE
-        sys.exit(1)
-
-    if args[0] == '-l':
-        if len(args) != 2:
-            print USAGE
-            sys.exit(1)
-        with ZipFile(args[1], 'r') as zf:
-            zf.printdir()
-
-    elif args[0] == '-t':
-        if len(args) != 2:
-            print USAGE
-            sys.exit(1)
-        with ZipFile(args[1], 'r') as zf:
-            badfile = zf.testzip()
-        if badfile:
-            print("The following enclosed file is corrupted: {!r}".format(badfile))
-        print "Done testing"
-
-    elif args[0] == '-e':
-        if len(args) != 3:
-            print USAGE
-            sys.exit(1)
-
-        with ZipFile(args[1], 'r') as zf:
-            zf.extractall(args[2])
-
-    elif args[0] == '-c':
-        if len(args) < 3:
-            print USAGE
-            sys.exit(1)
-
-        def addToZip(zf, path, zippath):
-            if os.path.isfile(path):
-                zf.write(path, zippath, ZIP_DEFLATED)
-            elif os.path.isdir(path):
-                if zippath:
-                    zf.write(path, zippath)
-                for nm in os.listdir(path):
-                    addToZip(zf,
-                            os.path.join(path, nm), os.path.join(zippath, nm))
-            # else: ignore
-
-        with ZipFile(args[1], 'w', allowZip64=True) as zf:
-            for path in args[2:]:
-                zippath = os.path.basename(path)
-                if not zippath:
-                    zippath = os.path.basename(os.path.dirname(path))
-                if zippath in ('', os.curdir, os.pardir):
-                    zippath = ''
-                addToZip(zf, path, zippath)
-
-if __name__ == "__main__":
-    main()
diff --git a/systrace/catapult/tracing/tracing/__init__.py b/systrace/catapult/tracing/tracing/__init__.py
deleted file mode 100644
index 76063aa..0000000
--- a/systrace/catapult/tracing/tracing/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-# Copyright (c) 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import tracing_project
-tracing_project.UpdateSysPathIfNeeded()
diff --git a/systrace/catapult/tracing/tracing/trace_data/__init__.py b/systrace/catapult/tracing/tracing/trace_data/__init__.py
deleted file mode 100644
index bdb1f26..0000000
--- a/systrace/catapult/tracing/tracing/trace_data/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
diff --git a/systrace/catapult/tracing/tracing/trace_data/trace_data.py b/systrace/catapult/tracing/tracing/trace_data/trace_data.py
deleted file mode 100644
index e599502..0000000
--- a/systrace/catapult/tracing/tracing/trace_data/trace_data.py
+++ /dev/null
@@ -1,345 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from __future__ import absolute_import
-from __future__ import division
-from __future__ import print_function
-import collections
-import gzip
-import json
-import logging
-import os
-import platform
-import shutil
-import subprocess
-import tempfile
-import time
-import traceback
-import six
-
-
-try:
-  StringTypes = six.string_types # pylint: disable=invalid-name
-except NameError:
-  StringTypes = str
-
-
-_TRACING_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                            os.path.pardir, os.path.pardir)
-_TRACE2HTML_PATH = os.path.join(_TRACING_DIR, 'bin', 'trace2html')
-
-MIB = 1024 * 1024
-
-class TraceDataPart(object):
-  """Trace data can come from a variety of tracing agents.
-
-  Data from each agent is collected into a trace "part" and accessed by the
-  following fixed field names.
-  """
-  def __init__(self, raw_field_name):
-    self._raw_field_name = raw_field_name
-
-  def __repr__(self):
-    return 'TraceDataPart("%s")' % self._raw_field_name
-
-  @property
-  def raw_field_name(self):
-    return self._raw_field_name
-
-  def __eq__(self, other):
-    return self.raw_field_name == other.raw_field_name
-
-  def __hash__(self):
-    return hash(self.raw_field_name)
-
-
-ANDROID_PROCESS_DATA_PART = TraceDataPart('androidProcessDump')
-ATRACE_PART = TraceDataPart('systemTraceEvents')
-ATRACE_PROCESS_DUMP_PART = TraceDataPart('atraceProcessDump')
-CHROME_TRACE_PART = TraceDataPart('traceEvents')
-CPU_TRACE_DATA = TraceDataPart('cpuSnapshots')
-TELEMETRY_PART = TraceDataPart('telemetry')
-WALT_TRACE_PART = TraceDataPart('waltTraceEvents')
-CGROUP_TRACE_PART = TraceDataPart('cgroupDump')
-
-ALL_TRACE_PARTS = {ANDROID_PROCESS_DATA_PART,
-                   ATRACE_PART,
-                   ATRACE_PROCESS_DUMP_PART,
-                   CHROME_TRACE_PART,
-                   CPU_TRACE_DATA,
-                   TELEMETRY_PART}
-
-
-class _TraceData(object):
-  """Provides read access to traces collected from multiple tracing agents.
-
-  Instances are created by calling the AsData() method on a TraceDataWriter.
-  """
-  def __init__(self, raw_data):
-    self._raw_data = raw_data
-
-  def HasTracesFor(self, part):
-    return bool(self.GetTracesFor(part))
-
-  def GetTracesFor(self, part):
-    """Return the list of traces for |part| in string or dictionary forms."""
-    if not isinstance(part, TraceDataPart):
-      raise TypeError('part must be a TraceDataPart instance')
-    return self._raw_data.get(part.raw_field_name, [])
-
-  def GetTraceFor(self, part):
-    traces = self.GetTracesFor(part)
-    assert len(traces) == 1
-    return traces[0]
-
-
-_TraceItem = collections.namedtuple(
-    '_TraceItem', ['part_name', 'handle'])
-
-
-class TraceDataException(Exception):
-  """Exception raised by TraceDataBuilder via RecordTraceDataException()."""
-
-
-class TraceDataBuilder(object):
-  """TraceDataBuilder helps build up a trace from multiple trace agents.
-
-  Note: the collected trace data is maintained in a set of temporary files to
-  be later processed e.g. by the Serialize() method. To ensure proper clean up
-  of such files clients must call the CleanUpTraceData() method or, even easier,
-  use the context manager API, e.g.:
-
-      with trace_data.TraceDataBuilder() as builder:
-        builder.AddTraceFor(trace_part, data)
-        builder.Serialize(output_file)
-  """
-  def __init__(self):
-    self._traces = []
-    self._frozen = False
-    self._temp_dir = tempfile.mkdtemp()
-    self._exceptions = []
-
-  def __enter__(self):
-    return self
-
-  def __exit__(self, *args):
-    self.CleanUpTraceData()
-
-  def OpenTraceHandleFor(self, part, suffix):
-    """Open a file handle for writing trace data into it.
-
-    Args:
-      part: A TraceDataPart instance.
-      suffix: A string used as file extension and identifier for the format
-        of the trace contents, e.g. '.json'. Can also append '.gz' to
-        indicate gzipped content, e.g. '.json.gz'.
-    """
-    if not isinstance(part, TraceDataPart):
-      raise TypeError('part must be a TraceDataPart instance')
-    if self._frozen:
-      raise RuntimeError('trace data builder is no longer open for writing')
-    trace = _TraceItem(
-        part_name=part.raw_field_name,
-        handle=tempfile.NamedTemporaryFile(
-            delete=False, dir=self._temp_dir, suffix=suffix))
-    self._traces.append(trace)
-    return trace.handle
-
-  def AddTraceFileFor(self, part, trace_file):
-    """Move a file with trace data into this builder.
-
-    This is useful for situations where a client might want to start collecting
-    trace data into a file, even before the TraceDataBuilder itself is created.
-
-    Args:
-      part: A TraceDataPart instance.
-      trace_file: A path to a file containing trace data. Note: for efficiency
-        the file is moved rather than copied into the builder. Therefore the
-        source file will no longer exist after calling this method; and the
-        lifetime of the trace data will thereafter be managed by this builder.
-    """
-    _, suffix = os.path.splitext(trace_file)
-    with self.OpenTraceHandleFor(part, suffix) as handle:
-      pass
-    if os.name == 'nt':
-      # On windows os.rename won't overwrite, so the destination path needs to
-      # be removed first.
-      os.remove(handle.name)
-    os.rename(trace_file, handle.name)
-
-  def AddTraceFor(self, part, data, allow_unstructured=False):
-    """Record new trace data into this builder.
-
-    Args:
-      part: A TraceDataPart instance.
-      data: The trace data to write: a json-serializable dict, or unstructured
-        text data as a string.
-      allow_unstructured: This must be set to True to allow passing
-        unstructured text data as input. Note: the use of this flag is
-        discouraged and only exists to support legacy clients; new tracing
-        agents should all produce structured trace data (e.g. proto or json).
-    """
-    if isinstance(data, StringTypes):
-      if not allow_unstructured:
-        raise ValueError('must pass allow_unstructured=True for text data')
-      do_write = lambda d, f: f.write(d)
-      suffix = '.txt'  # Used for atrace and systrace data.
-    elif isinstance(data, dict):
-      do_write = json.dump
-      suffix = '.json'
-    else:
-      raise TypeError('invalid trace data type')
-    with self.OpenTraceHandleFor(part, suffix) as handle:
-      do_write(data, handle)
-
-  def Freeze(self):
-    """Do not allow writing any more data into this builder."""
-    self._frozen = True
-    return self
-
-  def CleanUpTraceData(self):
-    """Clean up resources used by the data builder.
-
-    Will also re-raise any exceptions previously added by
-    RecordTraceCollectionException().
-    """
-    if self._traces is None:
-      return  # Already cleaned up.
-    self.Freeze()
-    for trace in self._traces:
-      # Make sure all trace handles are closed. It's fine if we close some
-      # of them multiple times.
-      trace.handle.close()
-    shutil.rmtree(self._temp_dir)
-    self._temp_dir = None
-    self._traces = None
-
-    if self._exceptions:
-      raise TraceDataException(
-          'Exceptions raised during trace data collection:\n' +
-          '\n'.join(self._exceptions))
-
-  def Serialize(self, file_path, trace_title=None):
-    """Serialize the trace data to a file in HTML format."""
-    self.Freeze()
-    assert self._traces, 'trace data has already been cleaned up'
-
-    trace_files = [trace.handle.name for trace in self._traces]
-    SerializeAsHtml(trace_files, file_path, trace_title)
-
-  def AsData(self):
-    """Allow in-memory access to read the collected JSON trace data.
-
-    This method is only provided for writing tests which require read access
-    to the collected trace data (e.g. for tracing agents to test they correctly
-    write data), and to support legacy TBMv1 metric computation. Only traces
-    in JSON format are supported.
-
-    Be careful: this may require a lot of memory if the traces to process are
-    very large. This has lead in the past to OOM errors (e.g. crbug/672097).
-
-    TODO(crbug/928278): Ideally, this method should be removed when it can be
-    entirely replaced by calls to an external trace processor.
-    """
-    self.Freeze()
-    assert self._traces, 'trace data has already been cleaned up'
-
-    raw_data = {}
-    for trace in self._traces:
-      is_compressed_json = trace.handle.name.endswith('.json.gz')
-      is_json = trace.handle.name.endswith('.json') or is_compressed_json
-      if is_json:
-        traces_for_part = raw_data.setdefault(trace.part_name, [])
-        opener = gzip.open if is_compressed_json else open
-        with opener(trace.handle.name, 'rb') as f:
-          traces_for_part.append(json.load(f))
-      else:
-        logging.info('Skipping over non-json trace: %s', trace.handle.name)
-    return _TraceData(raw_data)
-
-  def IterTraceParts(self):
-    """Iterates over trace parts.
-
-    Return value: iterator over pairs (part_name, file_path).
-    """
-    for trace in self._traces:
-      yield trace.part_name, trace.handle.name
-
-  def RecordTraceDataException(self):
-    """Records the most recent exception to be re-raised during cleanup.
-
-    Exceptions raised during trace data collection can be stored temporarily
-    in the builder. They will be re-raised when the builder is cleaned up later.
-    This way, any collected trace data can still be retained before the
-    benchmark is aborted.
-
-    This method is intended to be called from within an "except" handler, e.g.:
-      try:
-        # Collect trace data.
-      except Exception: # pylint: disable=broad-except
-        builder.RecordTraceDataException()
-    """
-    self._exceptions.append(traceback.format_exc())
-
-
-def CreateTestTrace(number=1):
-  """Convenient helper method to create trace data objects for testing.
-
-  Objects are created via the usual trace data writing route, so clients are
-  also responsible for cleaning up trace data themselves.
-
-  Clients are meant to treat these test traces as opaque. No guarantees are
-  made about their contents, which they shouldn't try to read.
-  """
-  builder = TraceDataBuilder()
-  builder.AddTraceFor(CHROME_TRACE_PART, {'traceEvents': [{'test': number}]})
-  return builder.Freeze()
-
-
-def CreateFromRawChromeEvents(events):
-  """Convenient helper to create trace data objects from raw Chrome events.
-
-  This bypasses trace data writing, going directly to the in-memory json trace
-  representation, so there is no need for trace file cleanup.
-
-  This is used only for testing legacy clients that still read trace data.
-  """
-  assert isinstance(events, list)
-  return _TraceData({
-      CHROME_TRACE_PART.raw_field_name: [{'traceEvents': events}]})
-
-
-def SerializeAsHtml(trace_files, html_file, trace_title=None):
-  """Serialize a set of traces to a single file in HTML format.
-
-  Args:
-    trace_files: a list of file names, each containing a trace from
-        one of the tracing agents.
-    html_file: a name of the output file.
-    trace_title: optional. A title for the resulting trace.
-  """
-  if not trace_files:
-    raise ValueError('trace files list is empty')
-
-  input_size = sum(os.path.getsize(trace_file) for trace_file in trace_files)
-
-  cmd = []
-  if platform.system() == 'Windows':
-    version_cmd = ['python', '-c',
-                   'import sys\nprint(sys.version_info.major)']
-    version = subprocess.check_output(version_cmd)
-    if version.strip() == '3':
-      raise RuntimeError('trace2html cannot run with python 3.')
-    cmd.append('python')
-  cmd.append(_TRACE2HTML_PATH)
-  cmd.extend(trace_files)
-  cmd.extend(['--output', html_file])
-  if trace_title is not None:
-    cmd.extend(['--title', trace_title])
-
-  start_time = time.time()
-  subprocess.check_output(cmd)
-  elapsed_time = time.time() - start_time
-  logging.info('trace2html processed %.01f MiB of trace data in %.02f seconds.',
-               1.0 * input_size / MIB, elapsed_time)
diff --git a/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py b/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py
deleted file mode 100644
index 3787484..0000000
--- a/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import base64
-import json
-import os
-import tempfile
-import unittest
-
-from py_utils import tempfile_ext
-from tracing.trace_data import trace_data
-
-class TraceDataTest(unittest.TestCase):
-  def testHasTracesForChrome(self):
-    d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
-    self.assertTrue(d.HasTracesFor(trace_data.CHROME_TRACE_PART))
-
-  def testHasNotTracesForCpu(self):
-    d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
-    self.assertFalse(d.HasTracesFor(trace_data.CPU_TRACE_DATA))
-
-  def testGetTracesForChrome(self):
-    d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
-    ts = d.GetTracesFor(trace_data.CHROME_TRACE_PART)
-    self.assertEqual(len(ts), 1)
-    self.assertEqual(ts[0], {'traceEvents': [{'ph': 'B'}]})
-
-  def testGetNoTracesForCpu(self):
-    d = trace_data.CreateFromRawChromeEvents([{'ph': 'B'}])
-    ts = d.GetTracesFor(trace_data.CPU_TRACE_DATA)
-    self.assertEqual(ts, [])
-
-
-class TraceDataBuilderTest(unittest.TestCase):
-  def testAddTraceDataAndSerialize(self):
-    with tempfile_ext.TemporaryFileName() as trace_path:
-      with trace_data.TraceDataBuilder() as builder:
-        builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
-                            {'traceEvents': [1, 2, 3]})
-        builder.Serialize(trace_path)
-        self.assertTrue(os.path.exists(trace_path))
-        self.assertGreater(os.stat(trace_path).st_size, 0)  # File not empty.
-
-  def testAddTraceForRaisesWithInvalidPart(self):
-    with trace_data.TraceDataBuilder() as builder:
-      with self.assertRaises(TypeError):
-        builder.AddTraceFor('not_a_trace_part', {})
-
-  def testAddTraceWithUnstructuredData(self):
-    with trace_data.TraceDataBuilder() as builder:
-      builder.AddTraceFor(trace_data.TELEMETRY_PART, 'unstructured trace',
-                          allow_unstructured=True)
-
-  def testAddTraceRaisesWithImplicitUnstructuredData(self):
-    with trace_data.TraceDataBuilder() as builder:
-      with self.assertRaises(ValueError):
-        builder.AddTraceFor(trace_data.TELEMETRY_PART, 'unstructured trace')
-
-  def testAddTraceFileFor(self):
-    original_data = {'msg': 'The answer is 42'}
-    with tempfile.NamedTemporaryFile(delete=False, suffix='.json') as source:
-      json.dump(original_data, source)
-    with trace_data.TraceDataBuilder() as builder:
-      builder.AddTraceFileFor(trace_data.CHROME_TRACE_PART, source.name)
-      self.assertFalse(os.path.exists(source.name))
-      out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
-
-    self.assertEqual(original_data, out_data)
-
-  def testOpenTraceHandleFor(self):
-    original_data = {'msg': 'The answer is 42'}
-    with trace_data.TraceDataBuilder() as builder:
-      with builder.OpenTraceHandleFor(
-          trace_data.CHROME_TRACE_PART, suffix='.json') as handle:
-        handle.write(json.dumps(original_data))
-      out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
-
-    # Trace handle should be cleaned up.
-    self.assertFalse(os.path.exists(handle.name))
-    self.assertEqual(original_data, out_data)
-
-  def testOpenTraceHandleForCompressedData(self):
-    original_data = {'msg': 'The answer is 42'}
-    # gzip.compress() does not work in python 2, so hardcode the encoded data.
-    compressed_data = base64.b64decode(
-        'H4sIAIDMblwAA6tWyi1OV7JSUArJSFVIzCsuTy1SyCxWMDFSquUCAA4QMtscAAAA')
-    with trace_data.TraceDataBuilder() as builder:
-      with builder.OpenTraceHandleFor(
-          trace_data.CHROME_TRACE_PART, suffix='.json.gz') as handle:
-        handle.write(compressed_data)
-      out_data = builder.AsData().GetTraceFor(trace_data.CHROME_TRACE_PART)
-
-    # Trace handle should be cleaned up.
-    self.assertFalse(os.path.exists(handle.name))
-    self.assertEqual(original_data, out_data)
-
-  def testCantWriteAfterCleanup(self):
-    with trace_data.TraceDataBuilder() as builder:
-      builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
-                          {'traceEvents': [1, 2, 3]})
-      builder.CleanUpTraceData()
-      with self.assertRaises(RuntimeError):
-        builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
-                            {'traceEvents': [1, 2, 3]})
-
-  def testCleanupReraisesExceptions(self):
-    with trace_data.TraceDataBuilder() as builder:
-      try:
-        raise Exception("test exception") # pylint: disable=broad-except
-      except Exception: # pylint: disable=broad-except
-        builder.RecordTraceDataException()
-      with self.assertRaises(trace_data.TraceDataException):
-        builder.CleanUpTraceData()
-
-  def testCantWriteAfterFreeze(self):
-    with trace_data.TraceDataBuilder() as builder:
-      builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
-                          {'traceEvents': [1, 2, 3]})
-      builder.Freeze()
-      with self.assertRaises(RuntimeError):
-        builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
-                            {'traceEvents': [1, 2, 3]})
diff --git a/systrace/catapult/tracing/tracing_project.py b/systrace/catapult/tracing/tracing_project.py
deleted file mode 100644
index ce198ce..0000000
--- a/systrace/catapult/tracing/tracing_project.py
+++ /dev/null
@@ -1,217 +0,0 @@
-# Copyright (c) 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-import os
-import re
-
-
-def _AddToPathIfNeeded(path):
-  if path not in sys.path:
-    sys.path.insert(0, path)
-
-
-def UpdateSysPathIfNeeded():
-  for path in GetDependencyPaths():
-    _AddToPathIfNeeded(path)
-
-
-def GetDependencyPaths():
-  # TODO(#3703): Separate the paths that are only used by the dev server into
-  # another call.
-  p = TracingProject()
-  return [
-      p.catapult_path,
-      p.py_vulcanize_path,
-      p.vinn_path,
-      p.protobuf_path,
-      os.path.join(p.catapult_third_party_path, 'WebOb'),
-      os.path.join(p.catapult_third_party_path, 'Paste'),
-      os.path.join(p.catapult_third_party_path, 'six'),
-      os.path.join(p.catapult_third_party_path, 'webapp2'),
-      os.path.join(p.catapult_path, 'common', 'py_utils'),
-      os.path.join(p.tracing_third_party_path, 'symbols')
-  ]
-
-
-def _FindAllFilesRecursive(source_paths):
-  assert isinstance(source_paths, list)
-  all_filenames = set()
-  for source_path in source_paths:
-    for dirpath, _, filenames in os.walk(source_path):
-      for f in filenames:
-        if f.startswith('.'):
-          continue
-        x = os.path.abspath(os.path.join(dirpath, f))
-        all_filenames.add(x)
-  return all_filenames
-
-def _IsFilenameATest(x):
-  if x.endswith('_test.js'):
-    return True
-
-  if x.endswith('_test.html'):
-    return True
-
-  if x.endswith('_unittest.js'):
-    return True
-
-  if x.endswith('_unittest.html'):
-    return True
-
-  # TODO(nduca): Add content test?
-  return False
-
-
-class TracingProject(object):
-  catapult_path = os.path.abspath(
-      os.path.join(os.path.dirname(__file__), os.path.pardir))
-
-  tracing_root_path = os.path.join(catapult_path, 'tracing')
-  trace_processor_root_path = os.path.join(catapult_path, 'trace_processor')
-  common_root_path = os.path.join(catapult_path, 'common')
-  tracing_src_path = os.path.join(tracing_root_path, 'tracing')
-  extras_path = os.path.join(tracing_src_path, 'extras')
-  ui_extras_path = os.path.join(tracing_src_path, 'ui', 'extras')
-
-  catapult_third_party_path = os.path.join(catapult_path, 'third_party')
-  polymer_path = os.path.join(catapult_third_party_path, 'polymer')
-
-  # We need google.protobuf for tests that use the proto. The dashboard uses
-  # the gae_ts_mon protobuf lib for its tests, so let's do the same for tracing.
-  protobuf_path = os.path.join(
-      catapult_third_party_path, 'gae_ts_mon', 'gae_ts_mon', 'protobuf')
-
-  tracing_third_party_path = os.path.join(tracing_root_path, 'third_party')
-  py_vulcanize_path = os.path.join(common_root_path, 'py_vulcanize')
-  vinn_path = os.path.join(catapult_third_party_path, 'vinn')
-
-  jszip_path = os.path.join(tracing_third_party_path, 'jszip')
-  pako_path = os.path.join(tracing_third_party_path, 'pako')
-  jpegjs_path = os.path.join(tracing_third_party_path, 'jpeg-js')
-
-  glmatrix_path = os.path.join(
-      tracing_third_party_path, 'gl-matrix', 'dist')
-
-  mannwhitneyu_path = os.path.join(
-      tracing_third_party_path, 'mannwhitneyu')
-
-  ui_path = os.path.join(tracing_src_path, 'ui')
-  d3_path = os.path.join(tracing_third_party_path, 'd3')
-  chai_path = os.path.join(tracing_third_party_path, 'chai')
-  mocha_path = os.path.join(tracing_third_party_path, 'mocha')
-  oboe_path = os.path.join(tracing_third_party_path, 'oboe')
-
-  mre_path = os.path.join(tracing_src_path, 'mre')
-
-  metrics_path = os.path.join(tracing_src_path, 'metrics')
-  diagnostics_path = os.path.join(tracing_src_path, 'value', 'diagnostics')
-
-  value_ui_path = os.path.join(tracing_src_path, 'value', 'ui')
-  metrics_ui_path = os.path.join(tracing_src_path, 'metrics', 'ui')
-
-  test_data_path = os.path.join(tracing_root_path, 'test_data')
-  skp_data_path = os.path.join(tracing_root_path, 'skp_data')
-
-  rjsmin_path = os.path.join(
-      tracing_third_party_path, 'tvcm', 'third_party', 'rjsmin')
-  rcssmin_path = os.path.join(
-      tracing_third_party_path, 'tvcm', 'third_party', 'rcssmin')
-
-  def __init__(self):
-    self.source_paths = []
-    self.source_paths.append(self.tracing_root_path)
-    self.source_paths.append(self.polymer_path)
-    self.source_paths.append(self.tracing_third_party_path)
-    self.source_paths.append(self.mre_path)
-    self.source_paths.append(self.jszip_path)
-    self.source_paths.append(self.pako_path)
-    self.source_paths.append(self.jpegjs_path)
-    self.source_paths.append(self.glmatrix_path)
-    self.source_paths.append(self.mannwhitneyu_path)
-    self.source_paths.append(self.d3_path)
-    self.source_paths.append(self.chai_path)
-    self.source_paths.append(self.mocha_path)
-    self.source_paths.append(self.oboe_path)
-
-  def CreateVulcanizer(self):
-    from py_vulcanize import project as project_module
-    return project_module.Project(self.source_paths)
-
-  def IsD8CompatibleFile(self, filename):
-    if filename.startswith(self.ui_path):
-      return False
-
-    if filename.startswith(self.value_ui_path):
-      return False
-
-    if filename.startswith(self.metrics_ui_path):
-      return False
-
-    return True
-
-  def FindAllTestModuleRelPaths(self, pred=None):
-    if pred is None:
-      pred = lambda x: True
-
-    all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
-    test_module_filenames = [x for x in all_filenames if
-                             _IsFilenameATest(x) and pred(x)]
-    test_module_filenames.sort()
-
-    return [os.path.relpath(x, self.tracing_root_path)
-            for x in test_module_filenames]
-
-  def FindAllMetricsModuleRelPaths(self):
-    all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
-    all_metrics_module_filenames = []
-    for x in all_filenames:
-      if x.startswith(self.metrics_path) and not _IsFilenameATest(x):
-        all_metrics_module_filenames.append(x)
-    all_metrics_module_filenames.sort()
-    return [os.path.relpath(x, self.tracing_root_path)
-            for x in all_metrics_module_filenames]
-
-  def FindAllDiagnosticsModuleRelPaths(self):
-    all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
-    all_diagnostics_module_filenames = []
-    for x in all_filenames:
-      if x.startswith(self.diagnostics_path) and not _IsFilenameATest(x):
-        all_diagnostics_module_filenames.append(x)
-    all_diagnostics_module_filenames.sort()
-    return [os.path.relpath(x, self.tracing_root_path)
-            for x in all_diagnostics_module_filenames]
-
-  def FindAllD8TestModuleRelPaths(self):
-    return self.FindAllTestModuleRelPaths(pred=self.IsD8CompatibleFile)
-
-  def GetConfigNames(self):
-    config_files = [
-        os.path.join(self.ui_extras_path, x)
-        for x in os.listdir(self.ui_extras_path)
-        if x.endswith('_config.html')
-    ]
-
-    config_files = [x for x in config_files if os.path.isfile(x)]
-
-    config_basenames = [os.path.basename(x) for x in config_files]
-    config_names = [re.match('(.+)_config.html$', x).group(1)
-                    for x in config_basenames]
-    return config_names
-
-  def GetDefaultConfigName(self):
-    assert 'full' in self.GetConfigNames()
-    return 'full'
-
-  def AddConfigNameOptionToParser(self, parser):
-    choices = self.GetConfigNames()
-    parser.add_argument(
-        '--config', dest='config_name',
-        choices=choices, default=self.GetDefaultConfigName(),
-        help='Picks a browser config. Valid choices: %s' % ', '.join(choices))
-    return choices
-
-  def GetModuleNameForConfigName(self, config_name):
-    return 'tracing.ui.extras.%s_config' % config_name
-
diff --git a/systrace/systrace.py b/systrace/systrace.py
deleted file mode 100755
index 7bd4537..0000000
--- a/systrace/systrace.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python2
-
-# Copyright (c) 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-version = sys.version_info[:2]
-if version != (2, 7):
-  sys.stderr.write('Systrace does not support Python %d.%d. '
-                   'Please use Python 2.7.\n' % version)
-  sys.exit(1)
-
-systrace_dir = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), 'catapult', 'systrace'))
-sys.path.insert(0, systrace_dir)
-
-def RemoveAllStalePycFiles(base_dir):
-  """Scan directories for old .pyc files without a .py file and delete them."""
-  for dirname, _, filenames in os.walk(base_dir):
-    if '.git' in dirname:
-      continue
-    for filename in filenames:
-      root, ext = os.path.splitext(filename)
-      if ext != '.pyc':
-        continue
-
-      pyc_path = os.path.join(dirname, filename)
-      py_path = os.path.join(dirname, root + '.py')
-
-      try:
-        if not os.path.exists(py_path):
-          os.remove(pyc_path)
-      except OSError:
-        # Wrap OS calls in try/except in case another process touched this file.
-        pass
-
-    try:
-      os.removedirs(dirname)
-    except OSError:
-      # Wrap OS calls in try/except in case another process touched this dir.
-      pass
-
-if __name__ == '__main__':
-  RemoveAllStalePycFiles(os.path.dirname(__file__))
-  from systrace import run_systrace
-  sys.exit(run_systrace.main())